aboutsummaryrefslogtreecommitdiffhomepage
path: root/public
diff options
context:
space:
mode:
authorMarvin Borner2018-07-14 22:46:02 +0200
committerMarvin Borner2018-07-14 22:46:02 +0200
commit693ea52ab9e080d415d80c19c4d53ddd21d6fcc6 (patch)
tree92636715d2a54bc548a2eedd12a27c92c59f1ff4 /public
parentd2d48574de2a18513f9a310d979406faaa41ee94 (diff)
Rewritten admin interface webpack generation (had bugs before)
Diffstat (limited to 'public')
-rw-r--r--public/0bd0898fc9d907f4b31b968c6e2efa7f.js12
-rw-r--r--public/3fc17c73a369921b5d2a49b8e752592b.js30
-rw-r--r--public/baf35d07f64e6c38ebec2176b189d346.scss20
-rw-r--r--public/becf15e26adbe45cab6f048bbbbabf01.js89
-rw-r--r--public/css/admin.css438
-rw-r--r--public/fonts/vendor/Ionicons/ionicons.eotbin0 -> 120724 bytes
-rw-r--r--public/fonts/vendor/Ionicons/ionicons.svg2230
-rw-r--r--public/fonts/vendor/Ionicons/ionicons.ttfbin0 -> 188508 bytes
-rw-r--r--public/fonts/vendor/Ionicons/ionicons.woffbin0 -> 67904 bytes
-rw-r--r--public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.eotbin0 -> 20127 bytes
-rw-r--r--public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.svg288
-rw-r--r--public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.ttfbin0 -> 45404 bytes
-rw-r--r--public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.woffbin0 -> 23424 bytes
-rw-r--r--public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.woff2bin0 -> 18028 bytes
-rw-r--r--public/images/boxed-bg.jpgbin0 -> 27178 bytes
-rwxr-xr-xpublic/js/admin.js192
-rwxr-xr-xpublic/js/app.js290
-rwxr-xr-xpublic/js/initial_key_gen.js10
-rwxr-xr-xpublic/mix-manifest.json6
-rw-r--r--public/service-worker.js2
20 files changed, 3571 insertions, 36 deletions
diff --git a/public/0bd0898fc9d907f4b31b968c6e2efa7f.js b/public/0bd0898fc9d907f4b31b968c6e2efa7f.js
new file mode 100644
index 0000000..7a42989
--- /dev/null
+++ b/public/0bd0898fc9d907f4b31b968c6e2efa7f.js
@@ -0,0 +1,12 @@
+/**
+ * First we will load all of this project's JavaScript dependencies which
+ * includes Vue and other libraries. It is a great starting point when
+ * building robust, powerful web applications using Vue and Laravel.
+ */
+
+window.openpgp = require('openpgp');
+window.Vue = require('vue');
+require('./bootstrap');
+require('./setup');
+require('./profile');
+require('./chat'); \ No newline at end of file
diff --git a/public/3fc17c73a369921b5d2a49b8e752592b.js b/public/3fc17c73a369921b5d2a49b8e752592b.js
new file mode 100644
index 0000000..1b6875f
--- /dev/null
+++ b/public/3fc17c73a369921b5d2a49b8e752592b.js
@@ -0,0 +1,30 @@
+$('form[keygen]').submit((event) => {
+ event.preventDefault();
+
+ $('button[type="submit"]').attr("disabled", true).html('Loading...');
+
+ var openpgp = window.openpgp;
+
+ var options = {
+ userIds: [{
+ email: $("input#email").val()
+ }],
+ numBits: 4096,
+ passphrase: $("input#password").val()
+ };
+
+ openpgp.generateKey(options).then((key) => {
+ var privateKey = key.privateKeyArmored;
+ var publicKey = key.publicKeyArmored;
+
+ localStorage.setItem("privkey", privateKey);
+
+ var now = new Date();
+ var time = now.getTime();
+ time += 3600 * 1000;
+ now.setTime(time);
+ document.cookie = "publickey=" + encodeURI(publicKey.substr(96).slice(0, -35)) + "; expires=" + now.toUTCString() + ";";
+
+ $('form[keygen]').unbind('submit').submit();
+ });
+}); \ No newline at end of file
diff --git a/public/baf35d07f64e6c38ebec2176b189d346.scss b/public/baf35d07f64e6c38ebec2176b189d346.scss
new file mode 100644
index 0000000..bd5e1a5
--- /dev/null
+++ b/public/baf35d07f64e6c38ebec2176b189d346.scss
@@ -0,0 +1,20 @@
+// Fonts
+@import url("https://fonts.googleapis.com/css?family=Raleway:300,400,600");
+
+// Variables
+@import "variables";
+
+// Bootstrap
+@import "~bootstrap/scss/bootstrap";
+
+// Chat
+@import "chat";
+
+.navbar-laravel {
+ background-color: #fff;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);
+}
+
+.alert {
+ display: none;
+} \ No newline at end of file
diff --git a/public/becf15e26adbe45cab6f048bbbbabf01.js b/public/becf15e26adbe45cab6f048bbbbabf01.js
new file mode 100644
index 0000000..a2259ab
--- /dev/null
+++ b/public/becf15e26adbe45cab6f048bbbbabf01.js
@@ -0,0 +1,89 @@
+
+/**
+ * When source maps are enabled, `style-loader` uses a link element with a data-uri to
+ * embed the css on the page. This breaks all relative urls because now they are relative to a
+ * bundle instead of the current page.
+ *
+ * One solution is to only use full urls, but that may be impossible.
+ *
+ * Instead, this function "fixes" the relative urls to be absolute according to the current page location.
+ *
+ * A rudimentary test suite is located at `test/fixUrls.js` and can be run via the `npm test` command.
+ *
+ */
+
+module.exports = function (css) {
+ // get current location
+ var location = typeof window !== "undefined" && window.location;
+
+ if (!location) {
+ throw new Error("fixUrls requires window.location");
+ }
+
+ // blank or null?
+ if (!css || typeof css !== "string") {
+ return css;
+ }
+
+ var baseUrl = location.protocol + "//" + location.host;
+ var currentDir = baseUrl + location.pathname.replace(/\/[^\/]*$/, "/");
+
+ // convert each url(...)
+ /*
+ This regular expression is just a way to recursively match brackets within
+ a string.
+
+ /url\s*\( = Match on the word "url" with any whitespace after it and then a parens
+ ( = Start a capturing group
+ (?: = Start a non-capturing group
+ [^)(] = Match anything that isn't a parentheses
+ | = OR
+ \( = Match a start parentheses
+ (?: = Start another non-capturing groups
+ [^)(]+ = Match anything that isn't a parentheses
+ | = OR
+ \( = Match a start parentheses
+ [^)(]* = Match anything that isn't a parentheses
+ \) = Match a end parentheses
+ ) = End Group
+ *\) = Match anything and then a close parens
+ ) = Close non-capturing group
+ * = Match anything
+ ) = Close capturing group
+ \) = Match a close parens
+
+ /gi = Get all matches, not the first. Be case insensitive.
+ */
+ var fixedCss = css.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi, function(fullMatch, origUrl) {
+ // strip quotes (if they exist)
+ var unquotedOrigUrl = origUrl
+ .trim()
+ .replace(/^"(.*)"$/, function(o, $1){ return $1; })
+ .replace(/^'(.*)'$/, function(o, $1){ return $1; });
+
+ // already a full url? no change
+ if (/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(unquotedOrigUrl)) {
+ return fullMatch;
+ }
+
+ // convert the url to a full url
+ var newUrl;
+
+ if (unquotedOrigUrl.indexOf("//") === 0) {
+ //TODO: should we add protocol?
+ newUrl = unquotedOrigUrl;
+ } else if (unquotedOrigUrl.indexOf("/") === 0) {
+ // path should be relative to the base url
+ newUrl = baseUrl + unquotedOrigUrl; // already starts with '/'
+ } else {
+ // path should be relative to current directory
+ newUrl = currentDir + unquotedOrigUrl.replace(/^\.\//, ""); // Strip leading './'
+ }
+
+ // send back the fixed url(...)
+ return "url(" + JSON.stringify(newUrl) + ")";
+ });
+
+ // send back the fixed css
+ return fixedCss;
+};
diff --git a/public/css/admin.css b/public/css/admin.css
index 5d0c5bc..80bad44 100644
--- a/public/css/admin.css
+++ b/public/css/admin.css
@@ -1,15 +1,14 @@
/*!
- * Bootstrap v4.1.2 (https://getbootstrap.com/)
- * Copyright 2011-2018 The Bootstrap Authors
- * Copyright 2011-2018 Twitter, Inc.
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-label::after{border-color:#80bdff}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out, -webkit-transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease, -webkit-transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-item-next,.carousel-item-prev,.carousel-item.active{transition:none}}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position: -webkit-sticky) or (position: sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.eot?f4769f9bdb7466be65088239c12046d1);src:url(/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.eot?f4769f9bdb7466be65088239c12046d1?#iefix) format('embedded-opentype'),url(/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.woff2?448c34a56d699c29117adc64c43affeb) format('woff2'),url(/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.woff?fa2772327f55d8198301fdb8bcfc8158) format('woff'),url(/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.ttf?e18bbf611f2a2e43afc071aa2f4e1512) format('truetype'),url(/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.svg?89889688147bd7575d6327160d64e760#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"*"}.glyphicon-plus:before{content:"+"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20AC"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270F"}.glyphicon-glass:before{content:"\E001"}.glyphicon-music:before{content:"\E002"}.glyphicon-search:before{content:"\E003"}.glyphicon-heart:before{content:"\E005"}.glyphicon-star:before{content:"\E006"}.glyphicon-star-empty:before{content:"\E007"}.glyphicon-user:before{content:"\E008"}.glyphicon-film:before{content:"\E009"}.glyphicon-th-large:before{content:"\E010"}.glyphicon-th:before{content:"\E011"}.glyphicon-th-list:before{content:"\E012"}.glyphicon-ok:before{content:"\E013"}.glyphicon-remove:before{content:"\E014"}.glyphicon-zoom-in:before{content:"\E015"}.glyphicon-zoom-out:before{content:"\E016"}.glyphicon-off:before{content:"\E017"}.glyphicon-signal:before{content:"\E018"}.glyphicon-cog:before{content:"\E019"}.glyphicon-trash:before{content:"\E020"}.glyphicon-home:before{content:"\E021"}.glyphicon-file:before{content:"\E022"}.glyphicon-time:before{content:"\E023"}.glyphicon-road:before{content:"\E024"}.glyphicon-download-alt:before{content:"\E025"}.glyphicon-download:before{content:"\E026"}.glyphicon-upload:before{content:"\E027"}.glyphicon-inbox:before{content:"\E028"}.glyphicon-play-circle:before{content:"\E029"}.glyphicon-repeat:before{content:"\E030"}.glyphicon-refresh:before{content:"\E031"}.glyphicon-list-alt:before{content:"\E032"}.glyphicon-lock:before{content:"\E033"}.glyphicon-flag:before{content:"\E034"}.glyphicon-headphones:before{content:"\E035"}.glyphicon-volume-off:before{content:"\E036"}.glyphicon-volume-down:before{content:"\E037"}.glyphicon-volume-up:before{content:"\E038"}.glyphicon-qrcode:before{content:"\E039"}.glyphicon-barcode:before{content:"\E040"}.glyphicon-tag:before{content:"\E041"}.glyphicon-tags:before{content:"\E042"}.glyphicon-book:before{content:"\E043"}.glyphicon-bookmark:before{content:"\E044"}.glyphicon-print:before{content:"\E045"}.glyphicon-camera:before{content:"\E046"}.glyphicon-font:before{content:"\E047"}.glyphicon-bold:before{content:"\E048"}.glyphicon-italic:before{content:"\E049"}.glyphicon-text-height:before{content:"\E050"}.glyphicon-text-width:before{content:"\E051"}.glyphicon-align-left:before{content:"\E052"}.glyphicon-align-center:before{content:"\E053"}.glyphicon-align-right:before{content:"\E054"}.glyphicon-align-justify:before{content:"\E055"}.glyphicon-list:before{content:"\E056"}.glyphicon-indent-left:before{content:"\E057"}.glyphicon-indent-right:before{content:"\E058"}.glyphicon-facetime-video:before{content:"\E059"}.glyphicon-picture:before{content:"\E060"}.glyphicon-map-marker:before{content:"\E062"}.glyphicon-adjust:before{content:"\E063"}.glyphicon-tint:before{content:"\E064"}.glyphicon-edit:before{content:"\E065"}.glyphicon-share:before{content:"\E066"}.glyphicon-check:before{content:"\E067"}.glyphicon-move:before{content:"\E068"}.glyphicon-step-backward:before{content:"\E069"}.glyphicon-fast-backward:before{content:"\E070"}.glyphicon-backward:before{content:"\E071"}.glyphicon-play:before{content:"\E072"}.glyphicon-pause:before{content:"\E073"}.glyphicon-stop:before{content:"\E074"}.glyphicon-forward:before{content:"\E075"}.glyphicon-fast-forward:before{content:"\E076"}.glyphicon-step-forward:before{content:"\E077"}.glyphicon-eject:before{content:"\E078"}.glyphicon-chevron-left:before{content:"\E079"}.glyphicon-chevron-right:before{content:"\E080"}.glyphicon-plus-sign:before{content:"\E081"}.glyphicon-minus-sign:before{content:"\E082"}.glyphicon-remove-sign:before{content:"\E083"}.glyphicon-ok-sign:before{content:"\E084"}.glyphicon-question-sign:before{content:"\E085"}.glyphicon-info-sign:before{content:"\E086"}.glyphicon-screenshot:before{content:"\E087"}.glyphicon-remove-circle:before{content:"\E088"}.glyphicon-ok-circle:before{content:"\E089"}.glyphicon-ban-circle:before{content:"\E090"}.glyphicon-arrow-left:before{content:"\E091"}.glyphicon-arrow-right:before{content:"\E092"}.glyphicon-arrow-up:before{content:"\E093"}.glyphicon-arrow-down:before{content:"\E094"}.glyphicon-share-alt:before{content:"\E095"}.glyphicon-resize-full:before{content:"\E096"}.glyphicon-resize-small:before{content:"\E097"}.glyphicon-exclamation-sign:before{content:"\E101"}.glyphicon-gift:before{content:"\E102"}.glyphicon-leaf:before{content:"\E103"}.glyphicon-fire:before{content:"\E104"}.glyphicon-eye-open:before{content:"\E105"}.glyphicon-eye-close:before{content:"\E106"}.glyphicon-warning-sign:before{content:"\E107"}.glyphicon-plane:before{content:"\E108"}.glyphicon-calendar:before{content:"\E109"}.glyphicon-random:before{content:"\E110"}.glyphicon-comment:before{content:"\E111"}.glyphicon-magnet:before{content:"\E112"}.glyphicon-chevron-up:before{content:"\E113"}.glyphicon-chevron-down:before{content:"\E114"}.glyphicon-retweet:before{content:"\E115"}.glyphicon-shopping-cart:before{content:"\E116"}.glyphicon-folder-close:before{content:"\E117"}.glyphicon-folder-open:before{content:"\E118"}.glyphicon-resize-vertical:before{content:"\E119"}.glyphicon-resize-horizontal:before{content:"\E120"}.glyphicon-hdd:before{content:"\E121"}.glyphicon-bullhorn:before{content:"\E122"}.glyphicon-bell:before{content:"\E123"}.glyphicon-certificate:before{content:"\E124"}.glyphicon-thumbs-up:before{content:"\E125"}.glyphicon-thumbs-down:before{content:"\E126"}.glyphicon-hand-right:before{content:"\E127"}.glyphicon-hand-left:before{content:"\E128"}.glyphicon-hand-up:before{content:"\E129"}.glyphicon-hand-down:before{content:"\E130"}.glyphicon-circle-arrow-right:before{content:"\E131"}.glyphicon-circle-arrow-left:before{content:"\E132"}.glyphicon-circle-arrow-up:before{content:"\E133"}.glyphicon-circle-arrow-down:before{content:"\E134"}.glyphicon-globe:before{content:"\E135"}.glyphicon-wrench:before{content:"\E136"}.glyphicon-tasks:before{content:"\E137"}.glyphicon-filter:before{content:"\E138"}.glyphicon-briefcase:before{content:"\E139"}.glyphicon-fullscreen:before{content:"\E140"}.glyphicon-dashboard:before{content:"\E141"}.glyphicon-paperclip:before{content:"\E142"}.glyphicon-heart-empty:before{content:"\E143"}.glyphicon-link:before{content:"\E144"}.glyphicon-phone:before{content:"\E145"}.glyphicon-pushpin:before{content:"\E146"}.glyphicon-usd:before{content:"\E148"}.glyphicon-gbp:before{content:"\E149"}.glyphicon-sort:before{content:"\E150"}.glyphicon-sort-by-alphabet:before{content:"\E151"}.glyphicon-sort-by-alphabet-alt:before{content:"\E152"}.glyphicon-sort-by-order:before{content:"\E153"}.glyphicon-sort-by-order-alt:before{content:"\E154"}.glyphicon-sort-by-attributes:before{content:"\E155"}.glyphicon-sort-by-attributes-alt:before{content:"\E156"}.glyphicon-unchecked:before{content:"\E157"}.glyphicon-expand:before{content:"\E158"}.glyphicon-collapse-down:before{content:"\E159"}.glyphicon-collapse-up:before{content:"\E160"}.glyphicon-log-in:before{content:"\E161"}.glyphicon-flash:before{content:"\E162"}.glyphicon-log-out:before{content:"\E163"}.glyphicon-new-window:before{content:"\E164"}.glyphicon-record:before{content:"\E165"}.glyphicon-save:before{content:"\E166"}.glyphicon-open:before{content:"\E167"}.glyphicon-saved:before{content:"\E168"}.glyphicon-import:before{content:"\E169"}.glyphicon-export:before{content:"\E170"}.glyphicon-send:before{content:"\E171"}.glyphicon-floppy-disk:before{content:"\E172"}.glyphicon-floppy-saved:before{content:"\E173"}.glyphicon-floppy-remove:before{content:"\E174"}.glyphicon-floppy-save:before{content:"\E175"}.glyphicon-floppy-open:before{content:"\E176"}.glyphicon-credit-card:before{content:"\E177"}.glyphicon-transfer:before{content:"\E178"}.glyphicon-cutlery:before{content:"\E179"}.glyphicon-header:before{content:"\E180"}.glyphicon-compressed:before{content:"\E181"}.glyphicon-earphone:before{content:"\E182"}.glyphicon-phone-alt:before{content:"\E183"}.glyphicon-tower:before{content:"\E184"}.glyphicon-stats:before{content:"\E185"}.glyphicon-sd-video:before{content:"\E186"}.glyphicon-hd-video:before{content:"\E187"}.glyphicon-subtitles:before{content:"\E188"}.glyphicon-sound-stereo:before{content:"\E189"}.glyphicon-sound-dolby:before{content:"\E190"}.glyphicon-sound-5-1:before{content:"\E191"}.glyphicon-sound-6-1:before{content:"\E192"}.glyphicon-sound-7-1:before{content:"\E193"}.glyphicon-copyright-mark:before{content:"\E194"}.glyphicon-registration-mark:before{content:"\E195"}.glyphicon-cloud-download:before{content:"\E197"}.glyphicon-cloud-upload:before{content:"\E198"}.glyphicon-tree-conifer:before{content:"\E199"}.glyphicon-tree-deciduous:before{content:"\E200"}.glyphicon-cd:before{content:"\E201"}.glyphicon-save-file:before{content:"\E202"}.glyphicon-open-file:before{content:"\E203"}.glyphicon-level-up:before{content:"\E204"}.glyphicon-copy:before{content:"\E205"}.glyphicon-paste:before{content:"\E206"}.glyphicon-alert:before{content:"\E209"}.glyphicon-equalizer:before{content:"\E210"}.glyphicon-king:before{content:"\E211"}.glyphicon-queen:before{content:"\E212"}.glyphicon-pawn:before{content:"\E213"}.glyphicon-bishop:before{content:"\E214"}.glyphicon-knight:before{content:"\E215"}.glyphicon-baby-formula:before{content:"\E216"}.glyphicon-tent:before{content:"\26FA"}.glyphicon-blackboard:before{content:"\E218"}.glyphicon-bed:before{content:"\E219"}.glyphicon-apple:before{content:"\F8FF"}.glyphicon-erase:before{content:"\E221"}.glyphicon-hourglass:before{content:"\231B"}.glyphicon-lamp:before{content:"\E223"}.glyphicon-duplicate:before{content:"\E224"}.glyphicon-piggy-bank:before{content:"\E225"}.glyphicon-scissors:before{content:"\E226"}.glyphicon-bitcoin:before{content:"\E227"}.glyphicon-btc:before{content:"\E227"}.glyphicon-xbt:before{content:"\E227"}.glyphicon-yen:before{content:"\A5"}.glyphicon-jpy:before{content:"\A5"}.glyphicon-ruble:before{content:"\20BD"}.glyphicon-rub:before{content:"\20BD"}.glyphicon-scale:before{content:"\E230"}.glyphicon-ice-lolly:before{content:"\E231"}.glyphicon-ice-lolly-tasted:before{content:"\E232"}.glyphicon-education:before{content:"\E233"}.glyphicon-option-horizontal:before{content:"\E234"}.glyphicon-option-vertical:before{content:"\E235"}.glyphicon-menu-hamburger:before{content:"\E236"}.glyphicon-modal-window:before{content:"\E237"}.glyphicon-oil:before{content:"\E238"}.glyphicon-grain:before{content:"\E239"}.glyphicon-sunglasses:before{content:"\E240"}.glyphicon-text-size:before{content:"\E241"}.glyphicon-text-color:before{content:"\E242"}.glyphicon-text-background:before{content:"\E243"}.glyphicon-object-align-top:before{content:"\E244"}.glyphicon-object-align-bottom:before{content:"\E245"}.glyphicon-object-align-horizontal:before{content:"\E246"}.glyphicon-object-align-left:before{content:"\E247"}.glyphicon-object-align-vertical:before{content:"\E248"}.glyphicon-object-align-right:before{content:"\E249"}.glyphicon-triangle-right:before{content:"\E250"}.glyphicon-triangle-left:before{content:"\E251"}.glyphicon-triangle-bottom:before{content:"\E252"}.glyphicon-triangle-top:before{content:"\E253"}.glyphicon-console:before{content:"\E254"}.glyphicon-superscript:before{content:"\E255"}.glyphicon-subscript:before{content:"\E256"}.glyphicon-menu-left:before{content:"\E257"}.glyphicon-menu-right:before{content:"\E258"}.glyphicon-menu-down:before{content:"\E259"}.glyphicon-menu-up:before{content:"\E260"}*{-webkit-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\A0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out, -webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out, -webkit-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-gradient(linear,left top, right top,color-stop(0, rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-gradient(linear,left top, right top,color-stop(0, rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203A'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
/*# sourceMappingURL=bootstrap.min.css.map *//*!
* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/@font-face{font-family:'FontAwesome';src:url(/fonts/vendor/font-awesome/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(/fonts/vendor/font-awesome/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format('embedded-opentype'),url(/fonts/vendor/font-awesome/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format('woff2'),url(/fonts/vendor/font-awesome/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format('woff'),url(/fonts/vendor/font-awesome/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format('truetype'),url(/fonts/vendor/font-awesome/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{-webkit-filter:none;filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\F000"}.fa-music:before{content:"\F001"}.fa-search:before{content:"\F002"}.fa-envelope-o:before{content:"\F003"}.fa-heart:before{content:"\F004"}.fa-star:before{content:"\F005"}.fa-star-o:before{content:"\F006"}.fa-user:before{content:"\F007"}.fa-film:before{content:"\F008"}.fa-th-large:before{content:"\F009"}.fa-th:before{content:"\F00A"}.fa-th-list:before{content:"\F00B"}.fa-check:before{content:"\F00C"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\F00D"}.fa-search-plus:before{content:"\F00E"}.fa-search-minus:before{content:"\F010"}.fa-power-off:before{content:"\F011"}.fa-signal:before{content:"\F012"}.fa-gear:before,.fa-cog:before{content:"\F013"}.fa-trash-o:before{content:"\F014"}.fa-home:before{content:"\F015"}.fa-file-o:before{content:"\F016"}.fa-clock-o:before{content:"\F017"}.fa-road:before{content:"\F018"}.fa-download:before{content:"\F019"}.fa-arrow-circle-o-down:before{content:"\F01A"}.fa-arrow-circle-o-up:before{content:"\F01B"}.fa-inbox:before{content:"\F01C"}.fa-play-circle-o:before{content:"\F01D"}.fa-rotate-right:before,.fa-repeat:before{content:"\F01E"}.fa-refresh:before{content:"\F021"}.fa-list-alt:before{content:"\F022"}.fa-lock:before{content:"\F023"}.fa-flag:before{content:"\F024"}.fa-headphones:before{content:"\F025"}.fa-volume-off:before{content:"\F026"}.fa-volume-down:before{content:"\F027"}.fa-volume-up:before{content:"\F028"}.fa-qrcode:before{content:"\F029"}.fa-barcode:before{content:"\F02A"}.fa-tag:before{content:"\F02B"}.fa-tags:before{content:"\F02C"}.fa-book:before{content:"\F02D"}.fa-bookmark:before{content:"\F02E"}.fa-print:before{content:"\F02F"}.fa-camera:before{content:"\F030"}.fa-font:before{content:"\F031"}.fa-bold:before{content:"\F032"}.fa-italic:before{content:"\F033"}.fa-text-height:before{content:"\F034"}.fa-text-width:before{content:"\F035"}.fa-align-left:before{content:"\F036"}.fa-align-center:before{content:"\F037"}.fa-align-right:before{content:"\F038"}.fa-align-justify:before{content:"\F039"}.fa-list:before{content:"\F03A"}.fa-dedent:before,.fa-outdent:before{content:"\F03B"}.fa-indent:before{content:"\F03C"}.fa-video-camera:before{content:"\F03D"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\F03E"}.fa-pencil:before{content:"\F040"}.fa-map-marker:before{content:"\F041"}.fa-adjust:before{content:"\F042"}.fa-tint:before{content:"\F043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\F044"}.fa-share-square-o:before{content:"\F045"}.fa-check-square-o:before{content:"\F046"}.fa-arrows:before{content:"\F047"}.fa-step-backward:before{content:"\F048"}.fa-fast-backward:before{content:"\F049"}.fa-backward:before{content:"\F04A"}.fa-play:before{content:"\F04B"}.fa-pause:before{content:"\F04C"}.fa-stop:before{content:"\F04D"}.fa-forward:before{content:"\F04E"}.fa-fast-forward:before{content:"\F050"}.fa-step-forward:before{content:"\F051"}.fa-eject:before{content:"\F052"}.fa-chevron-left:before{content:"\F053"}.fa-chevron-right:before{content:"\F054"}.fa-plus-circle:before{content:"\F055"}.fa-minus-circle:before{content:"\F056"}.fa-times-circle:before{content:"\F057"}.fa-check-circle:before{content:"\F058"}.fa-question-circle:before{content:"\F059"}.fa-info-circle:before{content:"\F05A"}.fa-crosshairs:before{content:"\F05B"}.fa-times-circle-o:before{content:"\F05C"}.fa-check-circle-o:before{content:"\F05D"}.fa-ban:before{content:"\F05E"}.fa-arrow-left:before{content:"\F060"}.fa-arrow-right:before{content:"\F061"}.fa-arrow-up:before{content:"\F062"}.fa-arrow-down:before{content:"\F063"}.fa-mail-forward:before,.fa-share:before{content:"\F064"}.fa-expand:before{content:"\F065"}.fa-compress:before{content:"\F066"}.fa-plus:before{content:"\F067"}.fa-minus:before{content:"\F068"}.fa-asterisk:before{content:"\F069"}.fa-exclamation-circle:before{content:"\F06A"}.fa-gift:before{content:"\F06B"}.fa-leaf:before{content:"\F06C"}.fa-fire:before{content:"\F06D"}.fa-eye:before{content:"\F06E"}.fa-eye-slash:before{content:"\F070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\F071"}.fa-plane:before{content:"\F072"}.fa-calendar:before{content:"\F073"}.fa-random:before{content:"\F074"}.fa-comment:before{content:"\F075"}.fa-magnet:before{content:"\F076"}.fa-chevron-up:before{content:"\F077"}.fa-chevron-down:before{content:"\F078"}.fa-retweet:before{content:"\F079"}.fa-shopping-cart:before{content:"\F07A"}.fa-folder:before{content:"\F07B"}.fa-folder-open:before{content:"\F07C"}.fa-arrows-v:before{content:"\F07D"}.fa-arrows-h:before{content:"\F07E"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\F080"}.fa-twitter-square:before{content:"\F081"}.fa-facebook-square:before{content:"\F082"}.fa-camera-retro:before{content:"\F083"}.fa-key:before{content:"\F084"}.fa-gears:before,.fa-cogs:before{content:"\F085"}.fa-comments:before{content:"\F086"}.fa-thumbs-o-up:before{content:"\F087"}.fa-thumbs-o-down:before{content:"\F088"}.fa-star-half:before{content:"\F089"}.fa-heart-o:before{content:"\F08A"}.fa-sign-out:before{content:"\F08B"}.fa-linkedin-square:before{content:"\F08C"}.fa-thumb-tack:before{content:"\F08D"}.fa-external-link:before{content:"\F08E"}.fa-sign-in:before{content:"\F090"}.fa-trophy:before{content:"\F091"}.fa-github-square:before{content:"\F092"}.fa-upload:before{content:"\F093"}.fa-lemon-o:before{content:"\F094"}.fa-phone:before{content:"\F095"}.fa-square-o:before{content:"\F096"}.fa-bookmark-o:before{content:"\F097"}.fa-phone-square:before{content:"\F098"}.fa-twitter:before{content:"\F099"}.fa-facebook-f:before,.fa-facebook:before{content:"\F09A"}.fa-github:before{content:"\F09B"}.fa-unlock:before{content:"\F09C"}.fa-credit-card:before{content:"\F09D"}.fa-feed:before,.fa-rss:before{content:"\F09E"}.fa-hdd-o:before{content:"\F0A0"}.fa-bullhorn:before{content:"\F0A1"}.fa-bell:before{content:"\F0F3"}.fa-certificate:before{content:"\F0A3"}.fa-hand-o-right:before{content:"\F0A4"}.fa-hand-o-left:before{content:"\F0A5"}.fa-hand-o-up:before{content:"\F0A6"}.fa-hand-o-down:before{content:"\F0A7"}.fa-arrow-circle-left:before{content:"\F0A8"}.fa-arrow-circle-right:before{content:"\F0A9"}.fa-arrow-circle-up:before{content:"\F0AA"}.fa-arrow-circle-down:before{content:"\F0AB"}.fa-globe:before{content:"\F0AC"}.fa-wrench:before{content:"\F0AD"}.fa-tasks:before{content:"\F0AE"}.fa-filter:before{content:"\F0B0"}.fa-briefcase:before{content:"\F0B1"}.fa-arrows-alt:before{content:"\F0B2"}.fa-group:before,.fa-users:before{content:"\F0C0"}.fa-chain:before,.fa-link:before{content:"\F0C1"}.fa-cloud:before{content:"\F0C2"}.fa-flask:before{content:"\F0C3"}.fa-cut:before,.fa-scissors:before{content:"\F0C4"}.fa-copy:before,.fa-files-o:before{content:"\F0C5"}.fa-paperclip:before{content:"\F0C6"}.fa-save:before,.fa-floppy-o:before{content:"\F0C7"}.fa-square:before{content:"\F0C8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\F0C9"}.fa-list-ul:before{content:"\F0CA"}.fa-list-ol:before{content:"\F0CB"}.fa-strikethrough:before{content:"\F0CC"}.fa-underline:before{content:"\F0CD"}.fa-table:before{content:"\F0CE"}.fa-magic:before{content:"\F0D0"}.fa-truck:before{content:"\F0D1"}.fa-pinterest:before{content:"\F0D2"}.fa-pinterest-square:before{content:"\F0D3"}.fa-google-plus-square:before{content:"\F0D4"}.fa-google-plus:before{content:"\F0D5"}.fa-money:before{content:"\F0D6"}.fa-caret-down:before{content:"\F0D7"}.fa-caret-up:before{content:"\F0D8"}.fa-caret-left:before{content:"\F0D9"}.fa-caret-right:before{content:"\F0DA"}.fa-columns:before{content:"\F0DB"}.fa-unsorted:before,.fa-sort:before{content:"\F0DC"}.fa-sort-down:before,.fa-sort-desc:before{content:"\F0DD"}.fa-sort-up:before,.fa-sort-asc:before{content:"\F0DE"}.fa-envelope:before{content:"\F0E0"}.fa-linkedin:before{content:"\F0E1"}.fa-rotate-left:before,.fa-undo:before{content:"\F0E2"}.fa-legal:before,.fa-gavel:before{content:"\F0E3"}.fa-dashboard:before,.fa-tachometer:before{content:"\F0E4"}.fa-comment-o:before{content:"\F0E5"}.fa-comments-o:before{content:"\F0E6"}.fa-flash:before,.fa-bolt:before{content:"\F0E7"}.fa-sitemap:before{content:"\F0E8"}.fa-umbrella:before{content:"\F0E9"}.fa-paste:before,.fa-clipboard:before{content:"\F0EA"}.fa-lightbulb-o:before{content:"\F0EB"}.fa-exchange:before{content:"\F0EC"}.fa-cloud-download:before{content:"\F0ED"}.fa-cloud-upload:before{content:"\F0EE"}.fa-user-md:before{content:"\F0F0"}.fa-stethoscope:before{content:"\F0F1"}.fa-suitcase:before{content:"\F0F2"}.fa-bell-o:before{content:"\F0A2"}.fa-coffee:before{content:"\F0F4"}.fa-cutlery:before{content:"\F0F5"}.fa-file-text-o:before{content:"\F0F6"}.fa-building-o:before{content:"\F0F7"}.fa-hospital-o:before{content:"\F0F8"}.fa-ambulance:before{content:"\F0F9"}.fa-medkit:before{content:"\F0FA"}.fa-fighter-jet:before{content:"\F0FB"}.fa-beer:before{content:"\F0FC"}.fa-h-square:before{content:"\F0FD"}.fa-plus-square:before{content:"\F0FE"}.fa-angle-double-left:before{content:"\F100"}.fa-angle-double-right:before{content:"\F101"}.fa-angle-double-up:before{content:"\F102"}.fa-angle-double-down:before{content:"\F103"}.fa-angle-left:before{content:"\F104"}.fa-angle-right:before{content:"\F105"}.fa-angle-up:before{content:"\F106"}.fa-angle-down:before{content:"\F107"}.fa-desktop:before{content:"\F108"}.fa-laptop:before{content:"\F109"}.fa-tablet:before{content:"\F10A"}.fa-mobile-phone:before,.fa-mobile:before{content:"\F10B"}.fa-circle-o:before{content:"\F10C"}.fa-quote-left:before{content:"\F10D"}.fa-quote-right:before{content:"\F10E"}.fa-spinner:before{content:"\F110"}.fa-circle:before{content:"\F111"}.fa-mail-reply:before,.fa-reply:before{content:"\F112"}.fa-github-alt:before{content:"\F113"}.fa-folder-o:before{content:"\F114"}.fa-folder-open-o:before{content:"\F115"}.fa-smile-o:before{content:"\F118"}.fa-frown-o:before{content:"\F119"}.fa-meh-o:before{content:"\F11A"}.fa-gamepad:before{content:"\F11B"}.fa-keyboard-o:before{content:"\F11C"}.fa-flag-o:before{content:"\F11D"}.fa-flag-checkered:before{content:"\F11E"}.fa-terminal:before{content:"\F120"}.fa-code:before{content:"\F121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\F122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\F123"}.fa-location-arrow:before{content:"\F124"}.fa-crop:before{content:"\F125"}.fa-code-fork:before{content:"\F126"}.fa-unlink:before,.fa-chain-broken:before{content:"\F127"}.fa-question:before{content:"\F128"}.fa-info:before{content:"\F129"}.fa-exclamation:before{content:"\F12A"}.fa-superscript:before{content:"\F12B"}.fa-subscript:before{content:"\F12C"}.fa-eraser:before{content:"\F12D"}.fa-puzzle-piece:before{content:"\F12E"}.fa-microphone:before{content:"\F130"}.fa-microphone-slash:before{content:"\F131"}.fa-shield:before{content:"\F132"}.fa-calendar-o:before{content:"\F133"}.fa-fire-extinguisher:before{content:"\F134"}.fa-rocket:before{content:"\F135"}.fa-maxcdn:before{content:"\F136"}.fa-chevron-circle-left:before{content:"\F137"}.fa-chevron-circle-right:before{content:"\F138"}.fa-chevron-circle-up:before{content:"\F139"}.fa-chevron-circle-down:before{content:"\F13A"}.fa-html5:before{content:"\F13B"}.fa-css3:before{content:"\F13C"}.fa-anchor:before{content:"\F13D"}.fa-unlock-alt:before{content:"\F13E"}.fa-bullseye:before{content:"\F140"}.fa-ellipsis-h:before{content:"\F141"}.fa-ellipsis-v:before{content:"\F142"}.fa-rss-square:before{content:"\F143"}.fa-play-circle:before{content:"\F144"}.fa-ticket:before{content:"\F145"}.fa-minus-square:before{content:"\F146"}.fa-minus-square-o:before{content:"\F147"}.fa-level-up:before{content:"\F148"}.fa-level-down:before{content:"\F149"}.fa-check-square:before{content:"\F14A"}.fa-pencil-square:before{content:"\F14B"}.fa-external-link-square:before{content:"\F14C"}.fa-share-square:before{content:"\F14D"}.fa-compass:before{content:"\F14E"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\F150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\F151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\F152"}.fa-euro:before,.fa-eur:before{content:"\F153"}.fa-gbp:before{content:"\F154"}.fa-dollar:before,.fa-usd:before{content:"\F155"}.fa-rupee:before,.fa-inr:before{content:"\F156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\F157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\F158"}.fa-won:before,.fa-krw:before{content:"\F159"}.fa-bitcoin:before,.fa-btc:before{content:"\F15A"}.fa-file:before{content:"\F15B"}.fa-file-text:before{content:"\F15C"}.fa-sort-alpha-asc:before{content:"\F15D"}.fa-sort-alpha-desc:before{content:"\F15E"}.fa-sort-amount-asc:before{content:"\F160"}.fa-sort-amount-desc:before{content:"\F161"}.fa-sort-numeric-asc:before{content:"\F162"}.fa-sort-numeric-desc:before{content:"\F163"}.fa-thumbs-up:before{content:"\F164"}.fa-thumbs-down:before{content:"\F165"}.fa-youtube-square:before{content:"\F166"}.fa-youtube:before{content:"\F167"}.fa-xing:before{content:"\F168"}.fa-xing-square:before{content:"\F169"}.fa-youtube-play:before{content:"\F16A"}.fa-dropbox:before{content:"\F16B"}.fa-stack-overflow:before{content:"\F16C"}.fa-instagram:before{content:"\F16D"}.fa-flickr:before{content:"\F16E"}.fa-adn:before{content:"\F170"}.fa-bitbucket:before{content:"\F171"}.fa-bitbucket-square:before{content:"\F172"}.fa-tumblr:before{content:"\F173"}.fa-tumblr-square:before{content:"\F174"}.fa-long-arrow-down:before{content:"\F175"}.fa-long-arrow-up:before{content:"\F176"}.fa-long-arrow-left:before{content:"\F177"}.fa-long-arrow-right:before{content:"\F178"}.fa-apple:before{content:"\F179"}.fa-windows:before{content:"\F17A"}.fa-android:before{content:"\F17B"}.fa-linux:before{content:"\F17C"}.fa-dribbble:before{content:"\F17D"}.fa-skype:before{content:"\F17E"}.fa-foursquare:before{content:"\F180"}.fa-trello:before{content:"\F181"}.fa-female:before{content:"\F182"}.fa-male:before{content:"\F183"}.fa-gittip:before,.fa-gratipay:before{content:"\F184"}.fa-sun-o:before{content:"\F185"}.fa-moon-o:before{content:"\F186"}.fa-archive:before{content:"\F187"}.fa-bug:before{content:"\F188"}.fa-vk:before{content:"\F189"}.fa-weibo:before{content:"\F18A"}.fa-renren:before{content:"\F18B"}.fa-pagelines:before{content:"\F18C"}.fa-stack-exchange:before{content:"\F18D"}.fa-arrow-circle-o-right:before{content:"\F18E"}.fa-arrow-circle-o-left:before{content:"\F190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\F191"}.fa-dot-circle-o:before{content:"\F192"}.fa-wheelchair:before{content:"\F193"}.fa-vimeo-square:before{content:"\F194"}.fa-turkish-lira:before,.fa-try:before{content:"\F195"}.fa-plus-square-o:before{content:"\F196"}.fa-space-shuttle:before{content:"\F197"}.fa-slack:before{content:"\F198"}.fa-envelope-square:before{content:"\F199"}.fa-wordpress:before{content:"\F19A"}.fa-openid:before{content:"\F19B"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\F19C"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\F19D"}.fa-yahoo:before{content:"\F19E"}.fa-google:before{content:"\F1A0"}.fa-reddit:before{content:"\F1A1"}.fa-reddit-square:before{content:"\F1A2"}.fa-stumbleupon-circle:before{content:"\F1A3"}.fa-stumbleupon:before{content:"\F1A4"}.fa-delicious:before{content:"\F1A5"}.fa-digg:before{content:"\F1A6"}.fa-pied-piper-pp:before{content:"\F1A7"}.fa-pied-piper-alt:before{content:"\F1A8"}.fa-drupal:before{content:"\F1A9"}.fa-joomla:before{content:"\F1AA"}.fa-language:before{content:"\F1AB"}.fa-fax:before{content:"\F1AC"}.fa-building:before{content:"\F1AD"}.fa-child:before{content:"\F1AE"}.fa-paw:before{content:"\F1B0"}.fa-spoon:before{content:"\F1B1"}.fa-cube:before{content:"\F1B2"}.fa-cubes:before{content:"\F1B3"}.fa-behance:before{content:"\F1B4"}.fa-behance-square:before{content:"\F1B5"}.fa-steam:before{content:"\F1B6"}.fa-steam-square:before{content:"\F1B7"}.fa-recycle:before{content:"\F1B8"}.fa-automobile:before,.fa-car:before{content:"\F1B9"}.fa-cab:before,.fa-taxi:before{content:"\F1BA"}.fa-tree:before{content:"\F1BB"}.fa-spotify:before{content:"\F1BC"}.fa-deviantart:before{content:"\F1BD"}.fa-soundcloud:before{content:"\F1BE"}.fa-database:before{content:"\F1C0"}.fa-file-pdf-o:before{content:"\F1C1"}.fa-file-word-o:before{content:"\F1C2"}.fa-file-excel-o:before{content:"\F1C3"}.fa-file-powerpoint-o:before{content:"\F1C4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\F1C5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\F1C6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\F1C7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\F1C8"}.fa-file-code-o:before{content:"\F1C9"}.fa-vine:before{content:"\F1CA"}.fa-codepen:before{content:"\F1CB"}.fa-jsfiddle:before{content:"\F1CC"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\F1CD"}.fa-circle-o-notch:before{content:"\F1CE"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\F1D0"}.fa-ge:before,.fa-empire:before{content:"\F1D1"}.fa-git-square:before{content:"\F1D2"}.fa-git:before{content:"\F1D3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\F1D4"}.fa-tencent-weibo:before{content:"\F1D5"}.fa-qq:before{content:"\F1D6"}.fa-wechat:before,.fa-weixin:before{content:"\F1D7"}.fa-send:before,.fa-paper-plane:before{content:"\F1D8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\F1D9"}.fa-history:before{content:"\F1DA"}.fa-circle-thin:before{content:"\F1DB"}.fa-header:before{content:"\F1DC"}.fa-paragraph:before{content:"\F1DD"}.fa-sliders:before{content:"\F1DE"}.fa-share-alt:before{content:"\F1E0"}.fa-share-alt-square:before{content:"\F1E1"}.fa-bomb:before{content:"\F1E2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\F1E3"}.fa-tty:before{content:"\F1E4"}.fa-binoculars:before{content:"\F1E5"}.fa-plug:before{content:"\F1E6"}.fa-slideshare:before{content:"\F1E7"}.fa-twitch:before{content:"\F1E8"}.fa-yelp:before{content:"\F1E9"}.fa-newspaper-o:before{content:"\F1EA"}.fa-wifi:before{content:"\F1EB"}.fa-calculator:before{content:"\F1EC"}.fa-paypal:before{content:"\F1ED"}.fa-google-wallet:before{content:"\F1EE"}.fa-cc-visa:before{content:"\F1F0"}.fa-cc-mastercard:before{content:"\F1F1"}.fa-cc-discover:before{content:"\F1F2"}.fa-cc-amex:before{content:"\F1F3"}.fa-cc-paypal:before{content:"\F1F4"}.fa-cc-stripe:before{content:"\F1F5"}.fa-bell-slash:before{content:"\F1F6"}.fa-bell-slash-o:before{content:"\F1F7"}.fa-trash:before{content:"\F1F8"}.fa-copyright:before{content:"\F1F9"}.fa-at:before{content:"\F1FA"}.fa-eyedropper:before{content:"\F1FB"}.fa-paint-brush:before{content:"\F1FC"}.fa-birthday-cake:before{content:"\F1FD"}.fa-area-chart:before{content:"\F1FE"}.fa-pie-chart:before{content:"\F200"}.fa-line-chart:before{content:"\F201"}.fa-lastfm:before{content:"\F202"}.fa-lastfm-square:before{content:"\F203"}.fa-toggle-off:before{content:"\F204"}.fa-toggle-on:before{content:"\F205"}.fa-bicycle:before{content:"\F206"}.fa-bus:before{content:"\F207"}.fa-ioxhost:before{content:"\F208"}.fa-angellist:before{content:"\F209"}.fa-cc:before{content:"\F20A"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\F20B"}.fa-meanpath:before{content:"\F20C"}.fa-buysellads:before{content:"\F20D"}.fa-connectdevelop:before{content:"\F20E"}.fa-dashcube:before{content:"\F210"}.fa-forumbee:before{content:"\F211"}.fa-leanpub:before{content:"\F212"}.fa-sellsy:before{content:"\F213"}.fa-shirtsinbulk:before{content:"\F214"}.fa-simplybuilt:before{content:"\F215"}.fa-skyatlas:before{content:"\F216"}.fa-cart-plus:before{content:"\F217"}.fa-cart-arrow-down:before{content:"\F218"}.fa-diamond:before{content:"\F219"}.fa-ship:before{content:"\F21A"}.fa-user-secret:before{content:"\F21B"}.fa-motorcycle:before{content:"\F21C"}.fa-street-view:before{content:"\F21D"}.fa-heartbeat:before{content:"\F21E"}.fa-venus:before{content:"\F221"}.fa-mars:before{content:"\F222"}.fa-mercury:before{content:"\F223"}.fa-intersex:before,.fa-transgender:before{content:"\F224"}.fa-transgender-alt:before{content:"\F225"}.fa-venus-double:before{content:"\F226"}.fa-mars-double:before{content:"\F227"}.fa-venus-mars:before{content:"\F228"}.fa-mars-stroke:before{content:"\F229"}.fa-mars-stroke-v:before{content:"\F22A"}.fa-mars-stroke-h:before{content:"\F22B"}.fa-neuter:before{content:"\F22C"}.fa-genderless:before{content:"\F22D"}.fa-facebook-official:before{content:"\F230"}.fa-pinterest-p:before{content:"\F231"}.fa-whatsapp:before{content:"\F232"}.fa-server:before{content:"\F233"}.fa-user-plus:before{content:"\F234"}.fa-user-times:before{content:"\F235"}.fa-hotel:before,.fa-bed:before{content:"\F236"}.fa-viacoin:before{content:"\F237"}.fa-train:before{content:"\F238"}.fa-subway:before{content:"\F239"}.fa-medium:before{content:"\F23A"}.fa-yc:before,.fa-y-combinator:before{content:"\F23B"}.fa-optin-monster:before{content:"\F23C"}.fa-opencart:before{content:"\F23D"}.fa-expeditedssl:before{content:"\F23E"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\F240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\F241"}.fa-battery-2:before,.fa-battery-half:before{content:"\F242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\F243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\F244"}.fa-mouse-pointer:before{content:"\F245"}.fa-i-cursor:before{content:"\F246"}.fa-object-group:before{content:"\F247"}.fa-object-ungroup:before{content:"\F248"}.fa-sticky-note:before{content:"\F249"}.fa-sticky-note-o:before{content:"\F24A"}.fa-cc-jcb:before{content:"\F24B"}.fa-cc-diners-club:before{content:"\F24C"}.fa-clone:before{content:"\F24D"}.fa-balance-scale:before{content:"\F24E"}.fa-hourglass-o:before{content:"\F250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\F251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\F252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\F253"}.fa-hourglass:before{content:"\F254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\F255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\F256"}.fa-hand-scissors-o:before{content:"\F257"}.fa-hand-lizard-o:before{content:"\F258"}.fa-hand-spock-o:before{content:"\F259"}.fa-hand-pointer-o:before{content:"\F25A"}.fa-hand-peace-o:before{content:"\F25B"}.fa-trademark:before{content:"\F25C"}.fa-registered:before{content:"\F25D"}.fa-creative-commons:before{content:"\F25E"}.fa-gg:before{content:"\F260"}.fa-gg-circle:before{content:"\F261"}.fa-tripadvisor:before{content:"\F262"}.fa-odnoklassniki:before{content:"\F263"}.fa-odnoklassniki-square:before{content:"\F264"}.fa-get-pocket:before{content:"\F265"}.fa-wikipedia-w:before{content:"\F266"}.fa-safari:before{content:"\F267"}.fa-chrome:before{content:"\F268"}.fa-firefox:before{content:"\F269"}.fa-opera:before{content:"\F26A"}.fa-internet-explorer:before{content:"\F26B"}.fa-tv:before,.fa-television:before{content:"\F26C"}.fa-contao:before{content:"\F26D"}.fa-500px:before{content:"\F26E"}.fa-amazon:before{content:"\F270"}.fa-calendar-plus-o:before{content:"\F271"}.fa-calendar-minus-o:before{content:"\F272"}.fa-calendar-times-o:before{content:"\F273"}.fa-calendar-check-o:before{content:"\F274"}.fa-industry:before{content:"\F275"}.fa-map-pin:before{content:"\F276"}.fa-map-signs:before{content:"\F277"}.fa-map-o:before{content:"\F278"}.fa-map:before{content:"\F279"}.fa-commenting:before{content:"\F27A"}.fa-commenting-o:before{content:"\F27B"}.fa-houzz:before{content:"\F27C"}.fa-vimeo:before{content:"\F27D"}.fa-black-tie:before{content:"\F27E"}.fa-fonticons:before{content:"\F280"}.fa-reddit-alien:before{content:"\F281"}.fa-edge:before{content:"\F282"}.fa-credit-card-alt:before{content:"\F283"}.fa-codiepie:before{content:"\F284"}.fa-modx:before{content:"\F285"}.fa-fort-awesome:before{content:"\F286"}.fa-usb:before{content:"\F287"}.fa-product-hunt:before{content:"\F288"}.fa-mixcloud:before{content:"\F289"}.fa-scribd:before{content:"\F28A"}.fa-pause-circle:before{content:"\F28B"}.fa-pause-circle-o:before{content:"\F28C"}.fa-stop-circle:before{content:"\F28D"}.fa-stop-circle-o:before{content:"\F28E"}.fa-shopping-bag:before{content:"\F290"}.fa-shopping-basket:before{content:"\F291"}.fa-hashtag:before{content:"\F292"}.fa-bluetooth:before{content:"\F293"}.fa-bluetooth-b:before{content:"\F294"}.fa-percent:before{content:"\F295"}.fa-gitlab:before{content:"\F296"}.fa-wpbeginner:before{content:"\F297"}.fa-wpforms:before{content:"\F298"}.fa-envira:before{content:"\F299"}.fa-universal-access:before{content:"\F29A"}.fa-wheelchair-alt:before{content:"\F29B"}.fa-question-circle-o:before{content:"\F29C"}.fa-blind:before{content:"\F29D"}.fa-audio-description:before{content:"\F29E"}.fa-volume-control-phone:before{content:"\F2A0"}.fa-braille:before{content:"\F2A1"}.fa-assistive-listening-systems:before{content:"\F2A2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\F2A3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\F2A4"}.fa-glide:before{content:"\F2A5"}.fa-glide-g:before{content:"\F2A6"}.fa-signing:before,.fa-sign-language:before{content:"\F2A7"}.fa-low-vision:before{content:"\F2A8"}.fa-viadeo:before{content:"\F2A9"}.fa-viadeo-square:before{content:"\F2AA"}.fa-snapchat:before{content:"\F2AB"}.fa-snapchat-ghost:before{content:"\F2AC"}.fa-snapchat-square:before{content:"\F2AD"}.fa-pied-piper:before{content:"\F2AE"}.fa-first-order:before{content:"\F2B0"}.fa-yoast:before{content:"\F2B1"}.fa-themeisle:before{content:"\F2B2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\F2B3"}.fa-fa:before,.fa-font-awesome:before{content:"\F2B4"}.fa-handshake-o:before{content:"\F2B5"}.fa-envelope-open:before{content:"\F2B6"}.fa-envelope-open-o:before{content:"\F2B7"}.fa-linode:before{content:"\F2B8"}.fa-address-book:before{content:"\F2B9"}.fa-address-book-o:before{content:"\F2BA"}.fa-vcard:before,.fa-address-card:before{content:"\F2BB"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\F2BC"}.fa-user-circle:before{content:"\F2BD"}.fa-user-circle-o:before{content:"\F2BE"}.fa-user-o:before{content:"\F2C0"}.fa-id-badge:before{content:"\F2C1"}.fa-drivers-license:before,.fa-id-card:before{content:"\F2C2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\F2C3"}.fa-quora:before{content:"\F2C4"}.fa-free-code-camp:before{content:"\F2C5"}.fa-telegram:before{content:"\F2C6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\F2C7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\F2C8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\F2C9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\F2CA"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\F2CB"}.fa-shower:before{content:"\F2CC"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\F2CD"}.fa-podcast:before{content:"\F2CE"}.fa-window-maximize:before{content:"\F2D0"}.fa-window-minimize:before{content:"\F2D1"}.fa-window-restore:before{content:"\F2D2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\F2D3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\F2D4"}.fa-bandcamp:before{content:"\F2D5"}.fa-grav:before{content:"\F2D6"}.fa-etsy:before{content:"\F2D7"}.fa-imdb:before{content:"\F2D8"}.fa-ravelry:before{content:"\F2D9"}.fa-eercast:before{content:"\F2DA"}.fa-microchip:before{content:"\F2DB"}.fa-snowflake-o:before{content:"\F2DC"}.fa-superpowers:before{content:"\F2DD"}.fa-wpexplorer:before{content:"\F2DE"}.fa-meetup:before{content:"\F2E0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
-/*!
- Ionicons, v4.2.3
+@charset "UTF-8";/*!
+ Ionicons, v2.0.0
Created by Ben Sperry for the Ionic Framework, http://ionicons.com/
https://twitter.com/benjsperry https://twitter.com/ionicframework
MIT License: https://github.com/driftyco/ionicons
@@ -18,11 +17,428 @@
Material Design Icons: https://github.com/google/material-design-icons
used under CC BY http://creativecommons.org/licenses/by/4.0/
Modified icons to fit ionicon’s grid from original.
-*/@font-face{font-family:"Ionicons";src:url(/fonts/vendor/ionicons/dist/ionicons.eot?3c1e04901e63bef6c26cbe06c067ca2c);src:url(/fonts/vendor/ionicons/dist/ionicons.eot?3c1e04901e63bef6c26cbe06c067ca2c#iefix) format("embedded-opentype"),url(/fonts/vendor/ionicons/dist/ionicons.woff2?43d5c718339efeb1177aff722d72669d) format("woff2"),url(/fonts/vendor/ionicons/dist/ionicons.woff?a21b9e1aad96623ef91bca7ecea7b169) format("woff"),url(/fonts/vendor/ionicons/dist/ionicons.ttf?b2e0fc821c6886fb3940f85a3320003e) format("truetype"),url(/fonts/vendor/ionicons/dist/ionicons.svg?91433571f154776a1d46c2a287de05d7#Ionicons) format("svg");font-weight:normal;font-style:normal}.ion,.ionicons,.ion-ios-add:before,.ion-ios-add-circle:before,.ion-ios-add-circle-outline:before,.ion-ios-airplane:before,.ion-ios-alarm:before,.ion-ios-albums:before,.ion-ios-alert:before,.ion-ios-american-football:before,.ion-ios-analytics:before,.ion-ios-aperture:before,.ion-ios-apps:before,.ion-ios-appstore:before,.ion-ios-archive:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-dropdown:before,.ion-ios-arrow-dropdown-circle:before,.ion-ios-arrow-dropleft:before,.ion-ios-arrow-dropleft-circle:before,.ion-ios-arrow-dropright:before,.ion-ios-arrow-dropright-circle:before,.ion-ios-arrow-dropup:before,.ion-ios-arrow-dropup-circle:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-round-back:before,.ion-ios-arrow-round-down:before,.ion-ios-arrow-round-forward:before,.ion-ios-arrow-round-up:before,.ion-ios-arrow-up:before,.ion-ios-at:before,.ion-ios-attach:before,.ion-ios-backspace:before,.ion-ios-barcode:before,.ion-ios-baseball:before,.ion-ios-basket:before,.ion-ios-basketball:before,.ion-ios-battery-charging:before,.ion-ios-battery-dead:before,.ion-ios-battery-full:before,.ion-ios-beaker:before,.ion-ios-bed:before,.ion-ios-beer:before,.ion-ios-bicycle:before,.ion-ios-bluetooth:before,.ion-ios-boat:before,.ion-ios-body:before,.ion-ios-bonfire:before,.ion-ios-book:before,.ion-ios-bookmark:before,.ion-ios-bookmarks:before,.ion-ios-bowtie:before,.ion-ios-briefcase:before,.ion-ios-browsers:before,.ion-ios-brush:before,.ion-ios-bug:before,.ion-ios-build:before,.ion-ios-bulb:before,.ion-ios-bus:before,.ion-ios-business:before,.ion-ios-cafe:before,.ion-ios-calculator:before,.ion-ios-calendar:before,.ion-ios-call:before,.ion-ios-camera:before,.ion-ios-car:before,.ion-ios-card:before,.ion-ios-cart:before,.ion-ios-cash:before,.ion-ios-cellular:before,.ion-ios-chatboxes:before,.ion-ios-chatbubbles:before,.ion-ios-checkbox:before,.ion-ios-checkbox-outline:before,.ion-ios-checkmark:before,.ion-ios-checkmark-circle:before,.ion-ios-checkmark-circle-outline:before,.ion-ios-clipboard:before,.ion-ios-clock:before,.ion-ios-close:before,.ion-ios-close-circle:before,.ion-ios-close-circle-outline:before,.ion-ios-cloud:before,.ion-ios-cloud-circle:before,.ion-ios-cloud-done:before,.ion-ios-cloud-download:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloudy:before,.ion-ios-cloudy-night:before,.ion-ios-code:before,.ion-ios-code-download:before,.ion-ios-code-working:before,.ion-ios-cog:before,.ion-ios-color-fill:before,.ion-ios-color-filter:before,.ion-ios-color-palette:before,.ion-ios-color-wand:before,.ion-ios-compass:before,.ion-ios-construct:before,.ion-ios-contact:before,.ion-ios-contacts:before,.ion-ios-contract:before,.ion-ios-contrast:before,.ion-ios-copy:before,.ion-ios-create:before,.ion-ios-crop:before,.ion-ios-cube:before,.ion-ios-cut:before,.ion-ios-desktop:before,.ion-ios-disc:before,.ion-ios-document:before,.ion-ios-done-all:before,.ion-ios-download:before,.ion-ios-easel:before,.ion-ios-egg:before,.ion-ios-exit:before,.ion-ios-expand:before,.ion-ios-eye:before,.ion-ios-eye-off:before,.ion-ios-fastforward:before,.ion-ios-female:before,.ion-ios-filing:before,.ion-ios-film:before,.ion-ios-finger-print:before,.ion-ios-fitness:before,.ion-ios-flag:before,.ion-ios-flame:before,.ion-ios-flash:before,.ion-ios-flash-off:before,.ion-ios-flashlight:before,.ion-ios-flask:before,.ion-ios-flower:before,.ion-ios-folder:before,.ion-ios-folder-open:before,.ion-ios-football:before,.ion-ios-funnel:before,.ion-ios-gift:before,.ion-ios-git-branch:before,.ion-ios-git-commit:before,.ion-ios-git-compare:before,.ion-ios-git-merge:before,.ion-ios-git-network:before,.ion-ios-git-pull-request:before,.ion-ios-glasses:before,.ion-ios-globe:before,.ion-ios-grid:before,.ion-ios-hammer:before,.ion-ios-hand:before,.ion-ios-happy:before,.ion-ios-headset:before,.ion-ios-heart:before,.ion-ios-heart-dislike:before,.ion-ios-heart-empty:before,.ion-ios-heart-half:before,.ion-ios-help:before,.ion-ios-help-buoy:before,.ion-ios-help-circle:before,.ion-ios-help-circle-outline:before,.ion-ios-home:before,.ion-ios-hourglass:before,.ion-ios-ice-cream:before,.ion-ios-image:before,.ion-ios-images:before,.ion-ios-infinite:before,.ion-ios-information:before,.ion-ios-information-circle:before,.ion-ios-information-circle-outline:before,.ion-ios-jet:before,.ion-ios-journal:before,.ion-ios-key:before,.ion-ios-keypad:before,.ion-ios-laptop:before,.ion-ios-leaf:before,.ion-ios-link:before,.ion-ios-list:before,.ion-ios-list-box:before,.ion-ios-locate:before,.ion-ios-lock:before,.ion-ios-log-in:before,.ion-ios-log-out:before,.ion-ios-magnet:before,.ion-ios-mail:before,.ion-ios-mail-open:before,.ion-ios-mail-unread:before,.ion-ios-male:before,.ion-ios-man:before,.ion-ios-map:before,.ion-ios-medal:before,.ion-ios-medical:before,.ion-ios-medkit:before,.ion-ios-megaphone:before,.ion-ios-menu:before,.ion-ios-mic:before,.ion-ios-mic-off:before,.ion-ios-microphone:before,.ion-ios-moon:before,.ion-ios-more:before,.ion-ios-move:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate:before,.ion-ios-notifications:before,.ion-ios-notifications-off:before,.ion-ios-notifications-outline:before,.ion-ios-nuclear:before,.ion-ios-nutrition:before,.ion-ios-open:before,.ion-ios-options:before,.ion-ios-outlet:before,.ion-ios-paper:before,.ion-ios-paper-plane:before,.ion-ios-partly-sunny:before,.ion-ios-pause:before,.ion-ios-paw:before,.ion-ios-people:before,.ion-ios-person:before,.ion-ios-person-add:before,.ion-ios-phone-landscape:before,.ion-ios-phone-portrait:before,.ion-ios-photos:before,.ion-ios-pie:before,.ion-ios-pin:before,.ion-ios-pint:before,.ion-ios-pizza:before,.ion-ios-planet:before,.ion-ios-play:before,.ion-ios-play-circle:before,.ion-ios-podium:before,.ion-ios-power:before,.ion-ios-pricetag:before,.ion-ios-pricetags:before,.ion-ios-print:before,.ion-ios-pulse:before,.ion-ios-qr-scanner:before,.ion-ios-quote:before,.ion-ios-radio:before,.ion-ios-radio-button-off:before,.ion-ios-radio-button-on:before,.ion-ios-rainy:before,.ion-ios-recording:before,.ion-ios-redo:before,.ion-ios-refresh:before,.ion-ios-refresh-circle:before,.ion-ios-remove:before,.ion-ios-remove-circle:before,.ion-ios-remove-circle-outline:before,.ion-ios-reorder:before,.ion-ios-repeat:before,.ion-ios-resize:before,.ion-ios-restaurant:before,.ion-ios-return-left:before,.ion-ios-return-right:before,.ion-ios-reverse-camera:before,.ion-ios-rewind:before,.ion-ios-ribbon:before,.ion-ios-rocket:before,.ion-ios-rose:before,.ion-ios-sad:before,.ion-ios-save:before,.ion-ios-school:before,.ion-ios-search:before,.ion-ios-send:before,.ion-ios-settings:before,.ion-ios-share:before,.ion-ios-share-alt:before,.ion-ios-shirt:before,.ion-ios-shuffle:before,.ion-ios-skip-backward:before,.ion-ios-skip-forward:before,.ion-ios-snow:before,.ion-ios-speedometer:before,.ion-ios-square:before,.ion-ios-square-outline:before,.ion-ios-star:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-stats:before,.ion-ios-stopwatch:before,.ion-ios-subway:before,.ion-ios-sunny:before,.ion-ios-swap:before,.ion-ios-switch:before,.ion-ios-sync:before,.ion-ios-tablet-landscape:before,.ion-ios-tablet-portrait:before,.ion-ios-tennisball:before,.ion-ios-text:before,.ion-ios-thermometer:before,.ion-ios-thumbs-down:before,.ion-ios-thumbs-up:before,.ion-ios-thunderstorm:before,.ion-ios-time:before,.ion-ios-timer:before,.ion-ios-today:before,.ion-ios-train:before,.ion-ios-transgender:before,.ion-ios-trash:before,.ion-ios-trending-down:before,.ion-ios-trending-up:before,.ion-ios-trophy:before,.ion-ios-tv:before,.ion-ios-umbrella:before,.ion-ios-undo:before,.ion-ios-unlock:before,.ion-ios-videocam:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-volume-mute:before,.ion-ios-volume-off:before,.ion-ios-walk:before,.ion-ios-wallet:before,.ion-ios-warning:before,.ion-ios-watch:before,.ion-ios-water:before,.ion-ios-wifi:before,.ion-ios-wine:before,.ion-ios-woman:before,.ion-logo-android:before,.ion-logo-angular:before,.ion-logo-apple:before,.ion-logo-bitbucket:before,.ion-logo-bitcoin:before,.ion-logo-buffer:before,.ion-logo-chrome:before,.ion-logo-closed-captioning:before,.ion-logo-codepen:before,.ion-logo-css3:before,.ion-logo-designernews:before,.ion-logo-dribbble:before,.ion-logo-dropbox:before,.ion-logo-euro:before,.ion-logo-facebook:before,.ion-logo-flickr:before,.ion-logo-foursquare:before,.ion-logo-freebsd-devil:before,.ion-logo-game-controller-a:before,.ion-logo-game-controller-b:before,.ion-logo-github:before,.ion-logo-google:before,.ion-logo-googleplus:before,.ion-logo-hackernews:before,.ion-logo-html5:before,.ion-logo-instagram:before,.ion-logo-ionic:before,.ion-logo-ionitron:before,.ion-logo-javascript:before,.ion-logo-linkedin:before,.ion-logo-markdown:before,.ion-logo-model-s:before,.ion-logo-no-smoking:before,.ion-logo-nodejs:before,.ion-logo-npm:before,.ion-logo-octocat:before,.ion-logo-pinterest:before,.ion-logo-playstation:before,.ion-logo-polymer:before,.ion-logo-python:before,.ion-logo-reddit:before,.ion-logo-rss:before,.ion-logo-sass:before,.ion-logo-skype:before,.ion-logo-slack:before,.ion-logo-snapchat:before,.ion-logo-steam:before,.ion-logo-tumblr:before,.ion-logo-tux:before,.ion-logo-twitch:before,.ion-logo-twitter:before,.ion-logo-usd:before,.ion-logo-vimeo:before,.ion-logo-vk:before,.ion-logo-whatsapp:before,.ion-logo-windows:before,.ion-logo-wordpress:before,.ion-logo-xbox:before,.ion-logo-xing:before,.ion-logo-yahoo:before,.ion-logo-yen:before,.ion-logo-youtube:before,.ion-md-add:before,.ion-md-add-circle:before,.ion-md-add-circle-outline:before,.ion-md-airplane:before,.ion-md-alarm:before,.ion-md-albums:before,.ion-md-alert:before,.ion-md-american-football:before,.ion-md-analytics:before,.ion-md-aperture:before,.ion-md-apps:before,.ion-md-appstore:before,.ion-md-archive:before,.ion-md-arrow-back:before,.ion-md-arrow-down:before,.ion-md-arrow-dropdown:before,.ion-md-arrow-dropdown-circle:before,.ion-md-arrow-dropleft:before,.ion-md-arrow-dropleft-circle:before,.ion-md-arrow-dropright:before,.ion-md-arrow-dropright-circle:before,.ion-md-arrow-dropup:before,.ion-md-arrow-dropup-circle:before,.ion-md-arrow-forward:before,.ion-md-arrow-round-back:before,.ion-md-arrow-round-down:before,.ion-md-arrow-round-forward:before,.ion-md-arrow-round-up:before,.ion-md-arrow-up:before,.ion-md-at:before,.ion-md-attach:before,.ion-md-backspace:before,.ion-md-barcode:before,.ion-md-baseball:before,.ion-md-basket:before,.ion-md-basketball:before,.ion-md-battery-charging:before,.ion-md-battery-dead:before,.ion-md-battery-full:before,.ion-md-beaker:before,.ion-md-bed:before,.ion-md-beer:before,.ion-md-bicycle:before,.ion-md-bluetooth:before,.ion-md-boat:before,.ion-md-body:before,.ion-md-bonfire:before,.ion-md-book:before,.ion-md-bookmark:before,.ion-md-bookmarks:before,.ion-md-bowtie:before,.ion-md-briefcase:before,.ion-md-browsers:before,.ion-md-brush:before,.ion-md-bug:before,.ion-md-build:before,.ion-md-bulb:before,.ion-md-bus:before,.ion-md-business:before,.ion-md-cafe:before,.ion-md-calculator:before,.ion-md-calendar:before,.ion-md-call:before,.ion-md-camera:before,.ion-md-car:before,.ion-md-card:before,.ion-md-cart:before,.ion-md-cash:before,.ion-md-cellular:before,.ion-md-chatboxes:before,.ion-md-chatbubbles:before,.ion-md-checkbox:before,.ion-md-checkbox-outline:before,.ion-md-checkmark:before,.ion-md-checkmark-circle:before,.ion-md-checkmark-circle-outline:before,.ion-md-clipboard:before,.ion-md-clock:before,.ion-md-close:before,.ion-md-close-circle:before,.ion-md-close-circle-outline:before,.ion-md-cloud:before,.ion-md-cloud-circle:before,.ion-md-cloud-done:before,.ion-md-cloud-download:before,.ion-md-cloud-outline:before,.ion-md-cloud-upload:before,.ion-md-cloudy:before,.ion-md-cloudy-night:before,.ion-md-code:before,.ion-md-code-download:before,.ion-md-code-working:before,.ion-md-cog:before,.ion-md-color-fill:before,.ion-md-color-filter:before,.ion-md-color-palette:before,.ion-md-color-wand:before,.ion-md-compass:before,.ion-md-construct:before,.ion-md-contact:before,.ion-md-contacts:before,.ion-md-contract:before,.ion-md-contrast:before,.ion-md-copy:before,.ion-md-create:before,.ion-md-crop:before,.ion-md-cube:before,.ion-md-cut:before,.ion-md-desktop:before,.ion-md-disc:before,.ion-md-document:before,.ion-md-done-all:before,.ion-md-download:before,.ion-md-easel:before,.ion-md-egg:before,.ion-md-exit:before,.ion-md-expand:before,.ion-md-eye:before,.ion-md-eye-off:before,.ion-md-fastforward:before,.ion-md-female:before,.ion-md-filing:before,.ion-md-film:before,.ion-md-finger-print:before,.ion-md-fitness:before,.ion-md-flag:before,.ion-md-flame:before,.ion-md-flash:before,.ion-md-flash-off:before,.ion-md-flashlight:before,.ion-md-flask:before,.ion-md-flower:before,.ion-md-folder:before,.ion-md-folder-open:before,.ion-md-football:before,.ion-md-funnel:before,.ion-md-gift:before,.ion-md-git-branch:before,.ion-md-git-commit:before,.ion-md-git-compare:before,.ion-md-git-merge:before,.ion-md-git-network:before,.ion-md-git-pull-request:before,.ion-md-glasses:before,.ion-md-globe:before,.ion-md-grid:before,.ion-md-hammer:before,.ion-md-hand:before,.ion-md-happy:before,.ion-md-headset:before,.ion-md-heart:before,.ion-md-heart-dislike:before,.ion-md-heart-empty:before,.ion-md-heart-half:before,.ion-md-help:before,.ion-md-help-buoy:before,.ion-md-help-circle:before,.ion-md-help-circle-outline:before,.ion-md-home:before,.ion-md-hourglass:before,.ion-md-ice-cream:before,.ion-md-image:before,.ion-md-images:before,.ion-md-infinite:before,.ion-md-information:before,.ion-md-information-circle:before,.ion-md-information-circle-outline:before,.ion-md-jet:before,.ion-md-journal:before,.ion-md-key:before,.ion-md-keypad:before,.ion-md-laptop:before,.ion-md-leaf:before,.ion-md-link:before,.ion-md-list:before,.ion-md-list-box:before,.ion-md-locate:before,.ion-md-lock:before,.ion-md-log-in:before,.ion-md-log-out:before,.ion-md-magnet:before,.ion-md-mail:before,.ion-md-mail-open:before,.ion-md-mail-unread:before,.ion-md-male:before,.ion-md-man:before,.ion-md-map:before,.ion-md-medal:before,.ion-md-medical:before,.ion-md-medkit:before,.ion-md-megaphone:before,.ion-md-menu:before,.ion-md-mic:before,.ion-md-mic-off:before,.ion-md-microphone:before,.ion-md-moon:before,.ion-md-more:before,.ion-md-move:before,.ion-md-musical-note:before,.ion-md-musical-notes:before,.ion-md-navigate:before,.ion-md-notifications:before,.ion-md-notifications-off:before,.ion-md-notifications-outline:before,.ion-md-nuclear:before,.ion-md-nutrition:before,.ion-md-open:before,.ion-md-options:before,.ion-md-outlet:before,.ion-md-paper:before,.ion-md-paper-plane:before,.ion-md-partly-sunny:before,.ion-md-pause:before,.ion-md-paw:before,.ion-md-people:before,.ion-md-person:before,.ion-md-person-add:before,.ion-md-phone-landscape:before,.ion-md-phone-portrait:before,.ion-md-photos:before,.ion-md-pie:before,.ion-md-pin:before,.ion-md-pint:before,.ion-md-pizza:before,.ion-md-planet:before,.ion-md-play:before,.ion-md-play-circle:before,.ion-md-podium:before,.ion-md-power:before,.ion-md-pricetag:before,.ion-md-pricetags:before,.ion-md-print:before,.ion-md-pulse:before,.ion-md-qr-scanner:before,.ion-md-quote:before,.ion-md-radio:before,.ion-md-radio-button-off:before,.ion-md-radio-button-on:before,.ion-md-rainy:before,.ion-md-recording:before,.ion-md-redo:before,.ion-md-refresh:before,.ion-md-refresh-circle:before,.ion-md-remove:before,.ion-md-remove-circle:before,.ion-md-remove-circle-outline:before,.ion-md-reorder:before,.ion-md-repeat:before,.ion-md-resize:before,.ion-md-restaurant:before,.ion-md-return-left:before,.ion-md-return-right:before,.ion-md-reverse-camera:before,.ion-md-rewind:before,.ion-md-ribbon:before,.ion-md-rocket:before,.ion-md-rose:before,.ion-md-sad:before,.ion-md-save:before,.ion-md-school:before,.ion-md-search:before,.ion-md-send:before,.ion-md-settings:before,.ion-md-share:before,.ion-md-share-alt:before,.ion-md-shirt:before,.ion-md-shuffle:before,.ion-md-skip-backward:before,.ion-md-skip-forward:before,.ion-md-snow:before,.ion-md-speedometer:before,.ion-md-square:before,.ion-md-square-outline:before,.ion-md-star:before,.ion-md-star-half:before,.ion-md-star-outline:before,.ion-md-stats:before,.ion-md-stopwatch:before,.ion-md-subway:before,.ion-md-sunny:before,.ion-md-swap:before,.ion-md-switch:before,.ion-md-sync:before,.ion-md-tablet-landscape:before,.ion-md-tablet-portrait:before,.ion-md-tennisball:before,.ion-md-text:before,.ion-md-thermometer:before,.ion-md-thumbs-down:before,.ion-md-thumbs-up:before,.ion-md-thunderstorm:before,.ion-md-time:before,.ion-md-timer:before,.ion-md-today:before,.ion-md-train:before,.ion-md-transgender:before,.ion-md-trash:before,.ion-md-trending-down:before,.ion-md-trending-up:before,.ion-md-trophy:before,.ion-md-tv:before,.ion-md-umbrella:before,.ion-md-undo:before,.ion-md-unlock:before,.ion-md-videocam:before,.ion-md-volume-high:before,.ion-md-volume-low:before,.ion-md-volume-mute:before,.ion-md-volume-off:before,.ion-md-walk:before,.ion-md-wallet:before,.ion-md-warning:before,.ion-md-watch:before,.ion-md-water:before,.ion-md-wifi:before,.ion-md-wine:before,.ion-md-woman:before{display:inline-block;font-family:"Ionicons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-ios-add:before{content:"\F102"}.ion-ios-add-circle:before{content:"\F101"}.ion-ios-add-circle-outline:before{content:"\F100"}.ion-ios-airplane:before{content:"\F137"}.ion-ios-alarm:before{content:"\F3C8"}.ion-ios-albums:before{content:"\F3CA"}.ion-ios-alert:before{content:"\F104"}.ion-ios-american-football:before{content:"\F106"}.ion-ios-analytics:before{content:"\F3CE"}.ion-ios-aperture:before{content:"\F108"}.ion-ios-apps:before{content:"\F10A"}.ion-ios-appstore:before{content:"\F10C"}.ion-ios-archive:before{content:"\F10E"}.ion-ios-arrow-back:before{content:"\F3CF"}.ion-ios-arrow-down:before{content:"\F3D0"}.ion-ios-arrow-dropdown:before{content:"\F110"}.ion-ios-arrow-dropdown-circle:before{content:"\F125"}.ion-ios-arrow-dropleft:before{content:"\F112"}.ion-ios-arrow-dropleft-circle:before{content:"\F129"}.ion-ios-arrow-dropright:before{content:"\F114"}.ion-ios-arrow-dropright-circle:before{content:"\F12B"}.ion-ios-arrow-dropup:before{content:"\F116"}.ion-ios-arrow-dropup-circle:before{content:"\F12D"}.ion-ios-arrow-forward:before{content:"\F3D1"}.ion-ios-arrow-round-back:before{content:"\F117"}.ion-ios-arrow-round-down:before{content:"\F118"}.ion-ios-arrow-round-forward:before{content:"\F119"}.ion-ios-arrow-round-up:before{content:"\F11A"}.ion-ios-arrow-up:before{content:"\F3D8"}.ion-ios-at:before{content:"\F3DA"}.ion-ios-attach:before{content:"\F11B"}.ion-ios-backspace:before{content:"\F11D"}.ion-ios-barcode:before{content:"\F3DC"}.ion-ios-baseball:before{content:"\F3DE"}.ion-ios-basket:before{content:"\F11F"}.ion-ios-basketball:before{content:"\F3E0"}.ion-ios-battery-charging:before{content:"\F120"}.ion-ios-battery-dead:before{content:"\F121"}.ion-ios-battery-full:before{content:"\F122"}.ion-ios-beaker:before{content:"\F124"}.ion-ios-bed:before{content:"\F139"}.ion-ios-beer:before{content:"\F126"}.ion-ios-bicycle:before{content:"\F127"}.ion-ios-bluetooth:before{content:"\F128"}.ion-ios-boat:before{content:"\F12A"}.ion-ios-body:before{content:"\F3E4"}.ion-ios-bonfire:before{content:"\F12C"}.ion-ios-book:before{content:"\F3E8"}.ion-ios-bookmark:before{content:"\F12E"}.ion-ios-bookmarks:before{content:"\F3EA"}.ion-ios-bowtie:before{content:"\F130"}.ion-ios-briefcase:before{content:"\F3EE"}.ion-ios-browsers:before{content:"\F3F0"}.ion-ios-brush:before{content:"\F132"}.ion-ios-bug:before{content:"\F134"}.ion-ios-build:before{content:"\F136"}.ion-ios-bulb:before{content:"\F138"}.ion-ios-bus:before{content:"\F13A"}.ion-ios-business:before{content:"\F1A3"}.ion-ios-cafe:before{content:"\F13C"}.ion-ios-calculator:before{content:"\F3F2"}.ion-ios-calendar:before{content:"\F3F4"}.ion-ios-call:before{content:"\F13E"}.ion-ios-camera:before{content:"\F3F6"}.ion-ios-car:before{content:"\F140"}.ion-ios-card:before{content:"\F142"}.ion-ios-cart:before{content:"\F3F8"}.ion-ios-cash:before{content:"\F144"}.ion-ios-cellular:before{content:"\F13D"}.ion-ios-chatboxes:before{content:"\F3FA"}.ion-ios-chatbubbles:before{content:"\F146"}.ion-ios-checkbox:before{content:"\F148"}.ion-ios-checkbox-outline:before{content:"\F147"}.ion-ios-checkmark:before{content:"\F3FF"}.ion-ios-checkmark-circle:before{content:"\F14A"}.ion-ios-checkmark-circle-outline:before{content:"\F149"}.ion-ios-clipboard:before{content:"\F14C"}.ion-ios-clock:before{content:"\F403"}.ion-ios-close:before{content:"\F406"}.ion-ios-close-circle:before{content:"\F14E"}.ion-ios-close-circle-outline:before{content:"\F14D"}.ion-ios-cloud:before{content:"\F40C"}.ion-ios-cloud-circle:before{content:"\F152"}.ion-ios-cloud-done:before{content:"\F154"}.ion-ios-cloud-download:before{content:"\F408"}.ion-ios-cloud-outline:before{content:"\F409"}.ion-ios-cloud-upload:before{content:"\F40B"}.ion-ios-cloudy:before{content:"\F410"}.ion-ios-cloudy-night:before{content:"\F40E"}.ion-ios-code:before{content:"\F157"}.ion-ios-code-download:before{content:"\F155"}.ion-ios-code-working:before{content:"\F156"}.ion-ios-cog:before{content:"\F412"}.ion-ios-color-fill:before{content:"\F159"}.ion-ios-color-filter:before{content:"\F414"}.ion-ios-color-palette:before{content:"\F15B"}.ion-ios-color-wand:before{content:"\F416"}.ion-ios-compass:before{content:"\F15D"}.ion-ios-construct:before{content:"\F15F"}.ion-ios-contact:before{content:"\F41A"}.ion-ios-contacts:before{content:"\F161"}.ion-ios-contract:before{content:"\F162"}.ion-ios-contrast:before{content:"\F163"}.ion-ios-copy:before{content:"\F41C"}.ion-ios-create:before{content:"\F165"}.ion-ios-crop:before{content:"\F41E"}.ion-ios-cube:before{content:"\F168"}.ion-ios-cut:before{content:"\F16A"}.ion-ios-desktop:before{content:"\F16C"}.ion-ios-disc:before{content:"\F16E"}.ion-ios-document:before{content:"\F170"}.ion-ios-done-all:before{content:"\F171"}.ion-ios-download:before{content:"\F420"}.ion-ios-easel:before{content:"\F173"}.ion-ios-egg:before{content:"\F175"}.ion-ios-exit:before{content:"\F177"}.ion-ios-expand:before{content:"\F178"}.ion-ios-eye:before{content:"\F425"}.ion-ios-eye-off:before{content:"\F17A"}.ion-ios-fastforward:before{content:"\F427"}.ion-ios-female:before{content:"\F17B"}.ion-ios-filing:before{content:"\F429"}.ion-ios-film:before{content:"\F42B"}.ion-ios-finger-print:before{content:"\F17C"}.ion-ios-fitness:before{content:"\F1AB"}.ion-ios-flag:before{content:"\F42D"}.ion-ios-flame:before{content:"\F42F"}.ion-ios-flash:before{content:"\F17E"}.ion-ios-flash-off:before{content:"\F12F"}.ion-ios-flashlight:before{content:"\F141"}.ion-ios-flask:before{content:"\F431"}.ion-ios-flower:before{content:"\F433"}.ion-ios-folder:before{content:"\F435"}.ion-ios-folder-open:before{content:"\F180"}.ion-ios-football:before{content:"\F437"}.ion-ios-funnel:before{content:"\F182"}.ion-ios-gift:before{content:"\F191"}.ion-ios-git-branch:before{content:"\F183"}.ion-ios-git-commit:before{content:"\F184"}.ion-ios-git-compare:before{content:"\F185"}.ion-ios-git-merge:before{content:"\F186"}.ion-ios-git-network:before{content:"\F187"}.ion-ios-git-pull-request:before{content:"\F188"}.ion-ios-glasses:before{content:"\F43F"}.ion-ios-globe:before{content:"\F18A"}.ion-ios-grid:before{content:"\F18C"}.ion-ios-hammer:before{content:"\F18E"}.ion-ios-hand:before{content:"\F190"}.ion-ios-happy:before{content:"\F192"}.ion-ios-headset:before{content:"\F194"}.ion-ios-heart:before{content:"\F443"}.ion-ios-heart-dislike:before{content:"\F13F"}.ion-ios-heart-empty:before{content:"\F19B"}.ion-ios-heart-half:before{content:"\F19D"}.ion-ios-help:before{content:"\F446"}.ion-ios-help-buoy:before{content:"\F196"}.ion-ios-help-circle:before{content:"\F198"}.ion-ios-help-circle-outline:before{content:"\F197"}.ion-ios-home:before{content:"\F448"}.ion-ios-hourglass:before{content:"\F103"}.ion-ios-ice-cream:before{content:"\F19A"}.ion-ios-image:before{content:"\F19C"}.ion-ios-images:before{content:"\F19E"}.ion-ios-infinite:before{content:"\F44A"}.ion-ios-information:before{content:"\F44D"}.ion-ios-information-circle:before{content:"\F1A0"}.ion-ios-information-circle-outline:before{content:"\F19F"}.ion-ios-jet:before{content:"\F1A5"}.ion-ios-journal:before{content:"\F189"}.ion-ios-key:before{content:"\F1A7"}.ion-ios-keypad:before{content:"\F450"}.ion-ios-laptop:before{content:"\F1A8"}.ion-ios-leaf:before{content:"\F1AA"}.ion-ios-link:before{content:"\F22A"}.ion-ios-list:before{content:"\F454"}.ion-ios-list-box:before{content:"\F143"}.ion-ios-locate:before{content:"\F1AE"}.ion-ios-lock:before{content:"\F1B0"}.ion-ios-log-in:before{content:"\F1B1"}.ion-ios-log-out:before{content:"\F1B2"}.ion-ios-magnet:before{content:"\F1B4"}.ion-ios-mail:before{content:"\F1B8"}.ion-ios-mail-open:before{content:"\F1B6"}.ion-ios-mail-unread:before{content:"\F145"}.ion-ios-male:before{content:"\F1B9"}.ion-ios-man:before{content:"\F1BB"}.ion-ios-map:before{content:"\F1BD"}.ion-ios-medal:before{content:"\F1BF"}.ion-ios-medical:before{content:"\F45C"}.ion-ios-medkit:before{content:"\F45E"}.ion-ios-megaphone:before{content:"\F1C1"}.ion-ios-menu:before{content:"\F1C3"}.ion-ios-mic:before{content:"\F461"}.ion-ios-mic-off:before{content:"\F45F"}.ion-ios-microphone:before{content:"\F1C6"}.ion-ios-moon:before{content:"\F468"}.ion-ios-more:before{content:"\F1C8"}.ion-ios-move:before{content:"\F1CB"}.ion-ios-musical-note:before{content:"\F46B"}.ion-ios-musical-notes:before{content:"\F46C"}.ion-ios-navigate:before{content:"\F46E"}.ion-ios-notifications:before{content:"\F1D3"}.ion-ios-notifications-off:before{content:"\F1D1"}.ion-ios-notifications-outline:before{content:"\F133"}.ion-ios-nuclear:before{content:"\F1D5"}.ion-ios-nutrition:before{content:"\F470"}.ion-ios-open:before{content:"\F1D7"}.ion-ios-options:before{content:"\F1D9"}.ion-ios-outlet:before{content:"\F1DB"}.ion-ios-paper:before{content:"\F472"}.ion-ios-paper-plane:before{content:"\F1DD"}.ion-ios-partly-sunny:before{content:"\F1DF"}.ion-ios-pause:before{content:"\F478"}.ion-ios-paw:before{content:"\F47A"}.ion-ios-people:before{content:"\F47C"}.ion-ios-person:before{content:"\F47E"}.ion-ios-person-add:before{content:"\F1E1"}.ion-ios-phone-landscape:before{content:"\F1E2"}.ion-ios-phone-portrait:before{content:"\F1E3"}.ion-ios-photos:before{content:"\F482"}.ion-ios-pie:before{content:"\F484"}.ion-ios-pin:before{content:"\F1E5"}.ion-ios-pint:before{content:"\F486"}.ion-ios-pizza:before{content:"\F1E7"}.ion-ios-planet:before{content:"\F1EB"}.ion-ios-play:before{content:"\F488"}.ion-ios-play-circle:before{content:"\F113"}.ion-ios-podium:before{content:"\F1ED"}.ion-ios-power:before{content:"\F1EF"}.ion-ios-pricetag:before{content:"\F48D"}.ion-ios-pricetags:before{content:"\F48F"}.ion-ios-print:before{content:"\F1F1"}.ion-ios-pulse:before{content:"\F493"}.ion-ios-qr-scanner:before{content:"\F1F3"}.ion-ios-quote:before{content:"\F1F5"}.ion-ios-radio:before{content:"\F1F9"}.ion-ios-radio-button-off:before{content:"\F1F6"}.ion-ios-radio-button-on:before{content:"\F1F7"}.ion-ios-rainy:before{content:"\F495"}.ion-ios-recording:before{content:"\F497"}.ion-ios-redo:before{content:"\F499"}.ion-ios-refresh:before{content:"\F49C"}.ion-ios-refresh-circle:before{content:"\F135"}.ion-ios-remove:before{content:"\F1FC"}.ion-ios-remove-circle:before{content:"\F1FB"}.ion-ios-remove-circle-outline:before{content:"\F1FA"}.ion-ios-reorder:before{content:"\F1FD"}.ion-ios-repeat:before{content:"\F1FE"}.ion-ios-resize:before{content:"\F1FF"}.ion-ios-restaurant:before{content:"\F201"}.ion-ios-return-left:before{content:"\F202"}.ion-ios-return-right:before{content:"\F203"}.ion-ios-reverse-camera:before{content:"\F49F"}.ion-ios-rewind:before{content:"\F4A1"}.ion-ios-ribbon:before{content:"\F205"}.ion-ios-rocket:before{content:"\F14B"}.ion-ios-rose:before{content:"\F4A3"}.ion-ios-sad:before{content:"\F207"}.ion-ios-save:before{content:"\F1A6"}.ion-ios-school:before{content:"\F209"}.ion-ios-search:before{content:"\F4A5"}.ion-ios-send:before{content:"\F20C"}.ion-ios-settings:before{content:"\F4A7"}.ion-ios-share:before{content:"\F211"}.ion-ios-share-alt:before{content:"\F20F"}.ion-ios-shirt:before{content:"\F213"}.ion-ios-shuffle:before{content:"\F4A9"}.ion-ios-skip-backward:before{content:"\F215"}.ion-ios-skip-forward:before{content:"\F217"}.ion-ios-snow:before{content:"\F218"}.ion-ios-speedometer:before{content:"\F4B0"}.ion-ios-square:before{content:"\F21A"}.ion-ios-square-outline:before{content:"\F15C"}.ion-ios-star:before{content:"\F4B3"}.ion-ios-star-half:before{content:"\F4B1"}.ion-ios-star-outline:before{content:"\F4B2"}.ion-ios-stats:before{content:"\F21C"}.ion-ios-stopwatch:before{content:"\F4B5"}.ion-ios-subway:before{content:"\F21E"}.ion-ios-sunny:before{content:"\F4B7"}.ion-ios-swap:before{content:"\F21F"}.ion-ios-switch:before{content:"\F221"}.ion-ios-sync:before{content:"\F222"}.ion-ios-tablet-landscape:before{content:"\F223"}.ion-ios-tablet-portrait:before{content:"\F24E"}.ion-ios-tennisball:before{content:"\F4BB"}.ion-ios-text:before{content:"\F250"}.ion-ios-thermometer:before{content:"\F252"}.ion-ios-thumbs-down:before{content:"\F254"}.ion-ios-thumbs-up:before{content:"\F256"}.ion-ios-thunderstorm:before{content:"\F4BD"}.ion-ios-time:before{content:"\F4BF"}.ion-ios-timer:before{content:"\F4C1"}.ion-ios-today:before{content:"\F14F"}.ion-ios-train:before{content:"\F258"}.ion-ios-transgender:before{content:"\F259"}.ion-ios-trash:before{content:"\F4C5"}.ion-ios-trending-down:before{content:"\F25A"}.ion-ios-trending-up:before{content:"\F25B"}.ion-ios-trophy:before{content:"\F25D"}.ion-ios-tv:before{content:"\F115"}.ion-ios-umbrella:before{content:"\F25F"}.ion-ios-undo:before{content:"\F4C7"}.ion-ios-unlock:before{content:"\F261"}.ion-ios-videocam:before{content:"\F4CD"}.ion-ios-volume-high:before{content:"\F11C"}.ion-ios-volume-low:before{content:"\F11E"}.ion-ios-volume-mute:before{content:"\F263"}.ion-ios-volume-off:before{content:"\F264"}.ion-ios-walk:before{content:"\F266"}.ion-ios-wallet:before{content:"\F18B"}.ion-ios-warning:before{content:"\F268"}.ion-ios-watch:before{content:"\F269"}.ion-ios-water:before{content:"\F26B"}.ion-ios-wifi:before{content:"\F26D"}.ion-ios-wine:before{content:"\F26F"}.ion-ios-woman:before{content:"\F271"}.ion-logo-android:before{content:"\F225"}.ion-logo-angular:before{content:"\F227"}.ion-logo-apple:before{content:"\F229"}.ion-logo-bitbucket:before{content:"\F193"}.ion-logo-bitcoin:before{content:"\F22B"}.ion-logo-buffer:before{content:"\F22D"}.ion-logo-chrome:before{content:"\F22F"}.ion-logo-closed-captioning:before{content:"\F105"}.ion-logo-codepen:before{content:"\F230"}.ion-logo-css3:before{content:"\F231"}.ion-logo-designernews:before{content:"\F232"}.ion-logo-dribbble:before{content:"\F233"}.ion-logo-dropbox:before{content:"\F234"}.ion-logo-euro:before{content:"\F235"}.ion-logo-facebook:before{content:"\F236"}.ion-logo-flickr:before{content:"\F107"}.ion-logo-foursquare:before{content:"\F237"}.ion-logo-freebsd-devil:before{content:"\F238"}.ion-logo-game-controller-a:before{content:"\F13B"}.ion-logo-game-controller-b:before{content:"\F181"}.ion-logo-github:before{content:"\F239"}.ion-logo-google:before{content:"\F23A"}.ion-logo-googleplus:before{content:"\F23B"}.ion-logo-hackernews:before{content:"\F23C"}.ion-logo-html5:before{content:"\F23D"}.ion-logo-instagram:before{content:"\F23E"}.ion-logo-ionic:before{content:"\F150"}.ion-logo-ionitron:before{content:"\F151"}.ion-logo-javascript:before{content:"\F23F"}.ion-logo-linkedin:before{content:"\F240"}.ion-logo-markdown:before{content:"\F241"}.ion-logo-model-s:before{content:"\F153"}.ion-logo-no-smoking:before{content:"\F109"}.ion-logo-nodejs:before{content:"\F242"}.ion-logo-npm:before{content:"\F195"}.ion-logo-octocat:before{content:"\F243"}.ion-logo-pinterest:before{content:"\F244"}.ion-logo-playstation:before{content:"\F245"}.ion-logo-polymer:before{content:"\F15E"}.ion-logo-python:before{content:"\F246"}.ion-logo-reddit:before{content:"\F247"}.ion-logo-rss:before{content:"\F248"}.ion-logo-sass:before{content:"\F249"}.ion-logo-skype:before{content:"\F24A"}.ion-logo-slack:before{content:"\F10B"}.ion-logo-snapchat:before{content:"\F24B"}.ion-logo-steam:before{content:"\F24C"}.ion-logo-tumblr:before{content:"\F24D"}.ion-logo-tux:before{content:"\F2AE"}.ion-logo-twitch:before{content:"\F2AF"}.ion-logo-twitter:before{content:"\F2B0"}.ion-logo-usd:before{content:"\F2B1"}.ion-logo-vimeo:before{content:"\F2C4"}.ion-logo-vk:before{content:"\F10D"}.ion-logo-whatsapp:before{content:"\F2C5"}.ion-logo-windows:before{content:"\F32F"}.ion-logo-wordpress:before{content:"\F330"}.ion-logo-xbox:before{content:"\F34C"}.ion-logo-xing:before{content:"\F10F"}.ion-logo-yahoo:before{content:"\F34D"}.ion-logo-yen:before{content:"\F34E"}.ion-logo-youtube:before{content:"\F34F"}.ion-md-add:before{content:"\F273"}.ion-md-add-circle:before{content:"\F272"}.ion-md-add-circle-outline:before{content:"\F158"}.ion-md-airplane:before{content:"\F15A"}.ion-md-alarm:before{content:"\F274"}.ion-md-albums:before{content:"\F275"}.ion-md-alert:before{content:"\F276"}.ion-md-american-football:before{content:"\F277"}.ion-md-analytics:before{content:"\F278"}.ion-md-aperture:before{content:"\F279"}.ion-md-apps:before{content:"\F27A"}.ion-md-appstore:before{content:"\F27B"}.ion-md-archive:before{content:"\F27C"}.ion-md-arrow-back:before{content:"\F27D"}.ion-md-arrow-down:before{content:"\F27E"}.ion-md-arrow-dropdown:before{content:"\F280"}.ion-md-arrow-dropdown-circle:before{content:"\F27F"}.ion-md-arrow-dropleft:before{content:"\F282"}.ion-md-arrow-dropleft-circle:before{content:"\F281"}.ion-md-arrow-dropright:before{content:"\F284"}.ion-md-arrow-dropright-circle:before{content:"\F283"}.ion-md-arrow-dropup:before{content:"\F286"}.ion-md-arrow-dropup-circle:before{content:"\F285"}.ion-md-arrow-forward:before{content:"\F287"}.ion-md-arrow-round-back:before{content:"\F288"}.ion-md-arrow-round-down:before{content:"\F289"}.ion-md-arrow-round-forward:before{content:"\F28A"}.ion-md-arrow-round-up:before{content:"\F28B"}.ion-md-arrow-up:before{content:"\F28C"}.ion-md-at:before{content:"\F28D"}.ion-md-attach:before{content:"\F28E"}.ion-md-backspace:before{content:"\F28F"}.ion-md-barcode:before{content:"\F290"}.ion-md-baseball:before{content:"\F291"}.ion-md-basket:before{content:"\F292"}.ion-md-basketball:before{content:"\F293"}.ion-md-battery-charging:before{content:"\F294"}.ion-md-battery-dead:before{content:"\F295"}.ion-md-battery-full:before{content:"\F296"}.ion-md-beaker:before{content:"\F297"}.ion-md-bed:before{content:"\F160"}.ion-md-beer:before{content:"\F298"}.ion-md-bicycle:before{content:"\F299"}.ion-md-bluetooth:before{content:"\F29A"}.ion-md-boat:before{content:"\F29B"}.ion-md-body:before{content:"\F29C"}.ion-md-bonfire:before{content:"\F29D"}.ion-md-book:before{content:"\F29E"}.ion-md-bookmark:before{content:"\F29F"}.ion-md-bookmarks:before{content:"\F2A0"}.ion-md-bowtie:before{content:"\F2A1"}.ion-md-briefcase:before{content:"\F2A2"}.ion-md-browsers:before{content:"\F2A3"}.ion-md-brush:before{content:"\F2A4"}.ion-md-bug:before{content:"\F2A5"}.ion-md-build:before{content:"\F2A6"}.ion-md-bulb:before{content:"\F2A7"}.ion-md-bus:before{content:"\F2A8"}.ion-md-business:before{content:"\F1A4"}.ion-md-cafe:before{content:"\F2A9"}.ion-md-calculator:before{content:"\F2AA"}.ion-md-calendar:before{content:"\F2AB"}.ion-md-call:before{content:"\F2AC"}.ion-md-camera:before{content:"\F2AD"}.ion-md-car:before{content:"\F2B2"}.ion-md-card:before{content:"\F2B3"}.ion-md-cart:before{content:"\F2B4"}.ion-md-cash:before{content:"\F2B5"}.ion-md-cellular:before{content:"\F164"}.ion-md-chatboxes:before{content:"\F2B6"}.ion-md-chatbubbles:before{content:"\F2B7"}.ion-md-checkbox:before{content:"\F2B9"}.ion-md-checkbox-outline:before{content:"\F2B8"}.ion-md-checkmark:before{content:"\F2BC"}.ion-md-checkmark-circle:before{content:"\F2BB"}.ion-md-checkmark-circle-outline:before{content:"\F2BA"}.ion-md-clipboard:before{content:"\F2BD"}.ion-md-clock:before{content:"\F2BE"}.ion-md-close:before{content:"\F2C0"}.ion-md-close-circle:before{content:"\F2BF"}.ion-md-close-circle-outline:before{content:"\F166"}.ion-md-cloud:before{content:"\F2C9"}.ion-md-cloud-circle:before{content:"\F2C2"}.ion-md-cloud-done:before{content:"\F2C3"}.ion-md-cloud-download:before{content:"\F2C6"}.ion-md-cloud-outline:before{content:"\F2C7"}.ion-md-cloud-upload:before{content:"\F2C8"}.ion-md-cloudy:before{content:"\F2CB"}.ion-md-cloudy-night:before{content:"\F2CA"}.ion-md-code:before{content:"\F2CE"}.ion-md-code-download:before{content:"\F2CC"}.ion-md-code-working:before{content:"\F2CD"}.ion-md-cog:before{content:"\F2CF"}.ion-md-color-fill:before{content:"\F2D0"}.ion-md-color-filter:before{content:"\F2D1"}.ion-md-color-palette:before{content:"\F2D2"}.ion-md-color-wand:before{content:"\F2D3"}.ion-md-compass:before{content:"\F2D4"}.ion-md-construct:before{content:"\F2D5"}.ion-md-contact:before{content:"\F2D6"}.ion-md-contacts:before{content:"\F2D7"}.ion-md-contract:before{content:"\F2D8"}.ion-md-contrast:before{content:"\F2D9"}.ion-md-copy:before{content:"\F2DA"}.ion-md-create:before{content:"\F2DB"}.ion-md-crop:before{content:"\F2DC"}.ion-md-cube:before{content:"\F2DD"}.ion-md-cut:before{content:"\F2DE"}.ion-md-desktop:before{content:"\F2DF"}.ion-md-disc:before{content:"\F2E0"}.ion-md-document:before{content:"\F2E1"}.ion-md-done-all:before{content:"\F2E2"}.ion-md-download:before{content:"\F2E3"}.ion-md-easel:before{content:"\F2E4"}.ion-md-egg:before{content:"\F2E5"}.ion-md-exit:before{content:"\F2E6"}.ion-md-expand:before{content:"\F2E7"}.ion-md-eye:before{content:"\F2E9"}.ion-md-eye-off:before{content:"\F2E8"}.ion-md-fastforward:before{content:"\F2EA"}.ion-md-female:before{content:"\F2EB"}.ion-md-filing:before{content:"\F2EC"}.ion-md-film:before{content:"\F2ED"}.ion-md-finger-print:before{content:"\F2EE"}.ion-md-fitness:before{content:"\F1AC"}.ion-md-flag:before{content:"\F2EF"}.ion-md-flame:before{content:"\F2F0"}.ion-md-flash:before{content:"\F2F1"}.ion-md-flash-off:before{content:"\F169"}.ion-md-flashlight:before{content:"\F16B"}.ion-md-flask:before{content:"\F2F2"}.ion-md-flower:before{content:"\F2F3"}.ion-md-folder:before{content:"\F2F5"}.ion-md-folder-open:before{content:"\F2F4"}.ion-md-football:before{content:"\F2F6"}.ion-md-funnel:before{content:"\F2F7"}.ion-md-gift:before{content:"\F199"}.ion-md-git-branch:before{content:"\F2FA"}.ion-md-git-commit:before{content:"\F2FB"}.ion-md-git-compare:before{content:"\F2FC"}.ion-md-git-merge:before{content:"\F2FD"}.ion-md-git-network:before{content:"\F2FE"}.ion-md-git-pull-request:before{content:"\F2FF"}.ion-md-glasses:before{content:"\F300"}.ion-md-globe:before{content:"\F301"}.ion-md-grid:before{content:"\F302"}.ion-md-hammer:before{content:"\F303"}.ion-md-hand:before{content:"\F304"}.ion-md-happy:before{content:"\F305"}.ion-md-headset:before{content:"\F306"}.ion-md-heart:before{content:"\F308"}.ion-md-heart-dislike:before{content:"\F167"}.ion-md-heart-empty:before{content:"\F1A1"}.ion-md-heart-half:before{content:"\F1A2"}.ion-md-help:before{content:"\F30B"}.ion-md-help-buoy:before{content:"\F309"}.ion-md-help-circle:before{content:"\F30A"}.ion-md-help-circle-outline:before{content:"\F16D"}.ion-md-home:before{content:"\F30C"}.ion-md-hourglass:before{content:"\F111"}.ion-md-ice-cream:before{content:"\F30D"}.ion-md-image:before{content:"\F30E"}.ion-md-images:before{content:"\F30F"}.ion-md-infinite:before{content:"\F310"}.ion-md-information:before{content:"\F312"}.ion-md-information-circle:before{content:"\F311"}.ion-md-information-circle-outline:before{content:"\F16F"}.ion-md-jet:before{content:"\F315"}.ion-md-journal:before{content:"\F18D"}.ion-md-key:before{content:"\F316"}.ion-md-keypad:before{content:"\F317"}.ion-md-laptop:before{content:"\F318"}.ion-md-leaf:before{content:"\F319"}.ion-md-link:before{content:"\F22E"}.ion-md-list:before{content:"\F31B"}.ion-md-list-box:before{content:"\F31A"}.ion-md-locate:before{content:"\F31C"}.ion-md-lock:before{content:"\F31D"}.ion-md-log-in:before{content:"\F31E"}.ion-md-log-out:before{content:"\F31F"}.ion-md-magnet:before{content:"\F320"}.ion-md-mail:before{content:"\F322"}.ion-md-mail-open:before{content:"\F321"}.ion-md-mail-unread:before{content:"\F172"}.ion-md-male:before{content:"\F323"}.ion-md-man:before{content:"\F324"}.ion-md-map:before{content:"\F325"}.ion-md-medal:before{content:"\F326"}.ion-md-medical:before{content:"\F327"}.ion-md-medkit:before{content:"\F328"}.ion-md-megaphone:before{content:"\F329"}.ion-md-menu:before{content:"\F32A"}.ion-md-mic:before{content:"\F32C"}.ion-md-mic-off:before{content:"\F32B"}.ion-md-microphone:before{content:"\F32D"}.ion-md-moon:before{content:"\F32E"}.ion-md-more:before{content:"\F1C9"}.ion-md-move:before{content:"\F331"}.ion-md-musical-note:before{content:"\F332"}.ion-md-musical-notes:before{content:"\F333"}.ion-md-navigate:before{content:"\F334"}.ion-md-notifications:before{content:"\F338"}.ion-md-notifications-off:before{content:"\F336"}.ion-md-notifications-outline:before{content:"\F337"}.ion-md-nuclear:before{content:"\F339"}.ion-md-nutrition:before{content:"\F33A"}.ion-md-open:before{content:"\F33B"}.ion-md-options:before{content:"\F33C"}.ion-md-outlet:before{content:"\F33D"}.ion-md-paper:before{content:"\F33F"}.ion-md-paper-plane:before{content:"\F33E"}.ion-md-partly-sunny:before{content:"\F340"}.ion-md-pause:before{content:"\F341"}.ion-md-paw:before{content:"\F342"}.ion-md-people:before{content:"\F343"}.ion-md-person:before{content:"\F345"}.ion-md-person-add:before{content:"\F344"}.ion-md-phone-landscape:before{content:"\F346"}.ion-md-phone-portrait:before{content:"\F347"}.ion-md-photos:before{content:"\F348"}.ion-md-pie:before{content:"\F349"}.ion-md-pin:before{content:"\F34A"}.ion-md-pint:before{content:"\F34B"}.ion-md-pizza:before{content:"\F354"}.ion-md-planet:before{content:"\F356"}.ion-md-play:before{content:"\F357"}.ion-md-play-circle:before{content:"\F174"}.ion-md-podium:before{content:"\F358"}.ion-md-power:before{content:"\F359"}.ion-md-pricetag:before{content:"\F35A"}.ion-md-pricetags:before{content:"\F35B"}.ion-md-print:before{content:"\F35C"}.ion-md-pulse:before{content:"\F35D"}.ion-md-qr-scanner:before{content:"\F35E"}.ion-md-quote:before{content:"\F35F"}.ion-md-radio:before{content:"\F362"}.ion-md-radio-button-off:before{content:"\F360"}.ion-md-radio-button-on:before{content:"\F361"}.ion-md-rainy:before{content:"\F363"}.ion-md-recording:before{content:"\F364"}.ion-md-redo:before{content:"\F365"}.ion-md-refresh:before{content:"\F366"}.ion-md-refresh-circle:before{content:"\F228"}.ion-md-remove:before{content:"\F368"}.ion-md-remove-circle:before{content:"\F367"}.ion-md-remove-circle-outline:before{content:"\F176"}.ion-md-reorder:before{content:"\F369"}.ion-md-repeat:before{content:"\F36A"}.ion-md-resize:before{content:"\F36B"}.ion-md-restaurant:before{content:"\F36C"}.ion-md-return-left:before{content:"\F36D"}.ion-md-return-right:before{content:"\F36E"}.ion-md-reverse-camera:before{content:"\F36F"}.ion-md-rewind:before{content:"\F370"}.ion-md-ribbon:before{content:"\F371"}.ion-md-rocket:before{content:"\F179"}.ion-md-rose:before{content:"\F372"}.ion-md-sad:before{content:"\F373"}.ion-md-save:before{content:"\F1A9"}.ion-md-school:before{content:"\F374"}.ion-md-search:before{content:"\F375"}.ion-md-send:before{content:"\F376"}.ion-md-settings:before{content:"\F377"}.ion-md-share:before{content:"\F379"}.ion-md-share-alt:before{content:"\F378"}.ion-md-shirt:before{content:"\F37A"}.ion-md-shuffle:before{content:"\F37B"}.ion-md-skip-backward:before{content:"\F37C"}.ion-md-skip-forward:before{content:"\F37D"}.ion-md-snow:before{content:"\F37E"}.ion-md-speedometer:before{content:"\F37F"}.ion-md-square:before{content:"\F381"}.ion-md-square-outline:before{content:"\F380"}.ion-md-star:before{content:"\F384"}.ion-md-star-half:before{content:"\F382"}.ion-md-star-outline:before{content:"\F383"}.ion-md-stats:before{content:"\F385"}.ion-md-stopwatch:before{content:"\F386"}.ion-md-subway:before{content:"\F387"}.ion-md-sunny:before{content:"\F388"}.ion-md-swap:before{content:"\F389"}.ion-md-switch:before{content:"\F38A"}.ion-md-sync:before{content:"\F38B"}.ion-md-tablet-landscape:before{content:"\F38C"}.ion-md-tablet-portrait:before{content:"\F38D"}.ion-md-tennisball:before{content:"\F38E"}.ion-md-text:before{content:"\F38F"}.ion-md-thermometer:before{content:"\F390"}.ion-md-thumbs-down:before{content:"\F391"}.ion-md-thumbs-up:before{content:"\F392"}.ion-md-thunderstorm:before{content:"\F393"}.ion-md-time:before{content:"\F394"}.ion-md-timer:before{content:"\F395"}.ion-md-today:before{content:"\F17D"}.ion-md-train:before{content:"\F396"}.ion-md-transgender:before{content:"\F397"}.ion-md-trash:before{content:"\F398"}.ion-md-trending-down:before{content:"\F399"}.ion-md-trending-up:before{content:"\F39A"}.ion-md-trophy:before{content:"\F39B"}.ion-md-tv:before{content:"\F17F"}.ion-md-umbrella:before{content:"\F39C"}.ion-md-undo:before{content:"\F39D"}.ion-md-unlock:before{content:"\F39E"}.ion-md-videocam:before{content:"\F39F"}.ion-md-volume-high:before{content:"\F123"}.ion-md-volume-low:before{content:"\F131"}.ion-md-volume-mute:before{content:"\F3A1"}.ion-md-volume-off:before{content:"\F3A2"}.ion-md-walk:before{content:"\F3A4"}.ion-md-wallet:before{content:"\F18F"}.ion-md-warning:before{content:"\F3A5"}.ion-md-watch:before{content:"\F3A6"}.ion-md-water:before{content:"\F3A7"}.ion-md-wifi:before{content:"\F3A8"}.ion-md-wine:before{content:"\F3A9"}.ion-md-woman:before{content:"\F3AA"}
+*/@font-face{font-family:"Ionicons";src:url(/fonts/vendor/Ionicons/ionicons.eot?2c2ae068be3b089e0a5b59abb1831550);src:url(/fonts/vendor/Ionicons/ionicons.eot?2c2ae068be3b089e0a5b59abb1831550#iefix) format("embedded-opentype"),url(/fonts/vendor/Ionicons/ionicons.ttf?24712f6c47821394fba7942fbb52c3b2) format("truetype"),url(/fonts/vendor/Ionicons/ionicons.woff?05acfdb568b3df49ad31355b19495d4a) format("woff"),url(/fonts/vendor/Ionicons/ionicons.svg?621bd386841f74e0053cb8e67f8a0604#Ionicons) format("svg");font-weight:normal;font-style:normal}.ion,.ionicons,.ion-alert:before,.ion-alert-circled:before,.ion-android-add:before,.ion-android-add-circle:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done:before,.ion-android-done-all:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite:before,.ion-android-favorite-outline:before,.ion-android-film:before,.ion-android-folder:before,.ion-android-folder-open:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone:before,.ion-android-microphone-off:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person:before,.ion-android-person-add:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove:before,.ion-android-remove-circle:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share:before,.ion-android-share-alt:before,.ion-android-star:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace:before,.ion-backspace-outline:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox:before,.ion-chatbox-working:before,.ion-chatboxes:before,.ion-chatbubble:before,.ion-chatbubble-working:before,.ion-chatbubbles:before,.ion-checkmark:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close:before,.ion-close-circled:before,.ion-close-round:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code:before,.ion-code-download:before,.ion-code-working:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document:before,.ion-document-text:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email:before,.ion-email-unread:before,.ion-erlenmeyer-flask:before,.ion-erlenmeyer-flask-bubbles:before,.ion-eye:before,.ion-eye-disabled:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash:before,.ion-flash-off:before,.ion-folder:before,.ion-fork:before,.ion-fork-repo:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy:before,.ion-happy-outline:before,.ion-headphone:before,.ion-heart:before,.ion-heart-broken:before,.ion-help:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information:before,.ion-information-circled:before,.ion-ionic:before,.ion-ios-alarm:before,.ion-ios-alarm-outline:before,.ion-ios-albums:before,.ion-ios-albums-outline:before,.ion-ios-americanfootball:before,.ion-ios-americanfootball-outline:before,.ion-ios-analytics:before,.ion-ios-analytics-outline:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at:before,.ion-ios-at-outline:before,.ion-ios-barcode:before,.ion-ios-barcode-outline:before,.ion-ios-baseball:before,.ion-ios-baseball-outline:before,.ion-ios-basketball:before,.ion-ios-basketball-outline:before,.ion-ios-bell:before,.ion-ios-bell-outline:before,.ion-ios-body:before,.ion-ios-body-outline:before,.ion-ios-bolt:before,.ion-ios-bolt-outline:before,.ion-ios-book:before,.ion-ios-book-outline:before,.ion-ios-bookmarks:before,.ion-ios-bookmarks-outline:before,.ion-ios-box:before,.ion-ios-box-outline:before,.ion-ios-briefcase:before,.ion-ios-briefcase-outline:before,.ion-ios-browsers:before,.ion-ios-browsers-outline:before,.ion-ios-calculator:before,.ion-ios-calculator-outline:before,.ion-ios-calendar:before,.ion-ios-calendar-outline:before,.ion-ios-camera:before,.ion-ios-camera-outline:before,.ion-ios-cart:before,.ion-ios-cart-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatbubble:before,.ion-ios-chatbubble-outline:before,.ion-ios-checkmark:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock:before,.ion-ios-clock-outline:before,.ion-ios-close:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-cloud:before,.ion-ios-cloud-download:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloudy:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-outline:before,.ion-ios-cog:before,.ion-ios-cog-outline:before,.ion-ios-color-filter:before,.ion-ios-color-filter-outline:before,.ion-ios-color-wand:before,.ion-ios-color-wand-outline:before,.ion-ios-compose:before,.ion-ios-compose-outline:before,.ion-ios-contact:before,.ion-ios-contact-outline:before,.ion-ios-copy:before,.ion-ios-copy-outline:before,.ion-ios-crop:before,.ion-ios-crop-strong:before,.ion-ios-download:before,.ion-ios-download-outline:before,.ion-ios-drag:before,.ion-ios-email:before,.ion-ios-email-outline:before,.ion-ios-eye:before,.ion-ios-eye-outline:before,.ion-ios-fastforward:before,.ion-ios-fastforward-outline:before,.ion-ios-filing:before,.ion-ios-filing-outline:before,.ion-ios-film:before,.ion-ios-film-outline:before,.ion-ios-flag:before,.ion-ios-flag-outline:before,.ion-ios-flame:before,.ion-ios-flame-outline:before,.ion-ios-flask:before,.ion-ios-flask-outline:before,.ion-ios-flower:before,.ion-ios-flower-outline:before,.ion-ios-folder:before,.ion-ios-folder-outline:before,.ion-ios-football:before,.ion-ios-football-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-b:before,.ion-ios-game-controller-b-outline:before,.ion-ios-gear:before,.ion-ios-gear-outline:before,.ion-ios-glasses:before,.ion-ios-glasses-outline:before,.ion-ios-grid-view:before,.ion-ios-grid-view-outline:before,.ion-ios-heart:before,.ion-ios-heart-outline:before,.ion-ios-help:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-home:before,.ion-ios-home-outline:before,.ion-ios-infinite:before,.ion-ios-infinite-outline:before,.ion-ios-information:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-ionic-outline:before,.ion-ios-keypad:before,.ion-ios-keypad-outline:before,.ion-ios-lightbulb:before,.ion-ios-lightbulb-outline:before,.ion-ios-list:before,.ion-ios-list-outline:before,.ion-ios-location:before,.ion-ios-location-outline:before,.ion-ios-locked:before,.ion-ios-locked-outline:before,.ion-ios-loop:before,.ion-ios-loop-strong:before,.ion-ios-medical:before,.ion-ios-medical-outline:before,.ion-ios-medkit:before,.ion-ios-medkit-outline:before,.ion-ios-mic:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-minus:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-monitor:before,.ion-ios-monitor-outline:before,.ion-ios-moon:before,.ion-ios-moon-outline:before,.ion-ios-more:before,.ion-ios-more-outline:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate:before,.ion-ios-navigate-outline:before,.ion-ios-nutrition:before,.ion-ios-nutrition-outline:before,.ion-ios-paper:before,.ion-ios-paper-outline:before,.ion-ios-paperplane:before,.ion-ios-paperplane-outline:before,.ion-ios-partlysunny:before,.ion-ios-partlysunny-outline:before,.ion-ios-pause:before,.ion-ios-pause-outline:before,.ion-ios-paw:before,.ion-ios-paw-outline:before,.ion-ios-people:before,.ion-ios-people-outline:before,.ion-ios-person:before,.ion-ios-person-outline:before,.ion-ios-personadd:before,.ion-ios-personadd-outline:before,.ion-ios-photos:before,.ion-ios-photos-outline:before,.ion-ios-pie:before,.ion-ios-pie-outline:before,.ion-ios-pint:before,.ion-ios-pint-outline:before,.ion-ios-play:before,.ion-ios-play-outline:before,.ion-ios-plus:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetags:before,.ion-ios-pricetags-outline:before,.ion-ios-printer:before,.ion-ios-printer-outline:before,.ion-ios-pulse:before,.ion-ios-pulse-strong:before,.ion-ios-rainy:before,.ion-ios-rainy-outline:before,.ion-ios-recording:before,.ion-ios-recording-outline:before,.ion-ios-redo:before,.ion-ios-redo-outline:before,.ion-ios-refresh:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-reload:before,.ion-ios-reverse-camera:before,.ion-ios-reverse-camera-outline:before,.ion-ios-rewind:before,.ion-ios-rewind-outline:before,.ion-ios-rose:before,.ion-ios-rose-outline:before,.ion-ios-search:before,.ion-ios-search-strong:before,.ion-ios-settings:before,.ion-ios-settings-strong:before,.ion-ios-shuffle:before,.ion-ios-shuffle-strong:before,.ion-ios-skipbackward:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipforward:before,.ion-ios-skipforward-outline:before,.ion-ios-snowy:before,.ion-ios-speedometer:before,.ion-ios-speedometer-outline:before,.ion-ios-star:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-stopwatch:before,.ion-ios-stopwatch-outline:before,.ion-ios-sunny:before,.ion-ios-sunny-outline:before,.ion-ios-telephone:before,.ion-ios-telephone-outline:before,.ion-ios-tennisball:before,.ion-ios-tennisball-outline:before,.ion-ios-thunderstorm:before,.ion-ios-thunderstorm-outline:before,.ion-ios-time:before,.ion-ios-time-outline:before,.ion-ios-timer:before,.ion-ios-timer-outline:before,.ion-ios-toggle:before,.ion-ios-toggle-outline:before,.ion-ios-trash:before,.ion-ios-trash-outline:before,.ion-ios-undo:before,.ion-ios-undo-outline:before,.ion-ios-unlocked:before,.ion-ios-unlocked-outline:before,.ion-ios-upload:before,.ion-ios-upload-outline:before,.ion-ios-videocam:before,.ion-ios-videocam-outline:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass:before,.ion-ios-wineglass-outline:before,.ion-ios-world:before,.ion-ios-world-outline:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon:before,.ion-navicon-round:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person:before,.ion-person-add:before,.ion-person-stalker:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply:before,.ion-reply-all:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad:before,.ion-sad-outline:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android:before,.ion-social-android-outline:before,.ion-social-angular:before,.ion-social-angular-outline:before,.ion-social-apple:before,.ion-social-apple-outline:before,.ion-social-bitcoin:before,.ion-social-bitcoin-outline:before,.ion-social-buffer:before,.ion-social-buffer-outline:before,.ion-social-chrome:before,.ion-social-chrome-outline:before,.ion-social-codepen:before,.ion-social-codepen-outline:before,.ion-social-css3:before,.ion-social-css3-outline:before,.ion-social-designernews:before,.ion-social-designernews-outline:before,.ion-social-dribbble:before,.ion-social-dribbble-outline:before,.ion-social-dropbox:before,.ion-social-dropbox-outline:before,.ion-social-euro:before,.ion-social-euro-outline:before,.ion-social-facebook:before,.ion-social-facebook-outline:before,.ion-social-foursquare:before,.ion-social-foursquare-outline:before,.ion-social-freebsd-devil:before,.ion-social-github:before,.ion-social-github-outline:before,.ion-social-google:before,.ion-social-google-outline:before,.ion-social-googleplus:before,.ion-social-googleplus-outline:before,.ion-social-hackernews:before,.ion-social-hackernews-outline:before,.ion-social-html5:before,.ion-social-html5-outline:before,.ion-social-instagram:before,.ion-social-instagram-outline:before,.ion-social-javascript:before,.ion-social-javascript-outline:before,.ion-social-linkedin:before,.ion-social-linkedin-outline:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest:before,.ion-social-pinterest-outline:before,.ion-social-python:before,.ion-social-reddit:before,.ion-social-reddit-outline:before,.ion-social-rss:before,.ion-social-rss-outline:before,.ion-social-sass:before,.ion-social-skype:before,.ion-social-skype-outline:before,.ion-social-snapchat:before,.ion-social-snapchat-outline:before,.ion-social-tumblr:before,.ion-social-tumblr-outline:before,.ion-social-tux:before,.ion-social-twitch:before,.ion-social-twitch-outline:before,.ion-social-twitter:before,.ion-social-twitter-outline:before,.ion-social-usd:before,.ion-social-usd-outline:before,.ion-social-vimeo:before,.ion-social-vimeo-outline:before,.ion-social-whatsapp:before,.ion-social-whatsapp-outline:before,.ion-social-windows:before,.ion-social-windows-outline:before,.ion-social-wordpress:before,.ion-social-wordpress-outline:before,.ion-social-yahoo:before,.ion-social-yahoo-outline:before,.ion-social-yen:before,.ion-social-yen-outline:before,.ion-social-youtube:before,.ion-social-youtube-outline:before,.ion-soup-can:before,.ion-soup-can-outline:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle:before,.ion-toggle-filled:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt:before,.ion-tshirt-outline:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before{display:inline-block;font-family:"Ionicons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-alert:before{content:"\F101"}.ion-alert-circled:before{content:"\F100"}.ion-android-add:before{content:"\F2C7"}.ion-android-add-circle:before{content:"\F359"}.ion-android-alarm-clock:before{content:"\F35A"}.ion-android-alert:before{content:"\F35B"}.ion-android-apps:before{content:"\F35C"}.ion-android-archive:before{content:"\F2C9"}.ion-android-arrow-back:before{content:"\F2CA"}.ion-android-arrow-down:before{content:"\F35D"}.ion-android-arrow-dropdown:before{content:"\F35F"}.ion-android-arrow-dropdown-circle:before{content:"\F35E"}.ion-android-arrow-dropleft:before{content:"\F361"}.ion-android-arrow-dropleft-circle:before{content:"\F360"}.ion-android-arrow-dropright:before{content:"\F363"}.ion-android-arrow-dropright-circle:before{content:"\F362"}.ion-android-arrow-dropup:before{content:"\F365"}.ion-android-arrow-dropup-circle:before{content:"\F364"}.ion-android-arrow-forward:before{content:"\F30F"}.ion-android-arrow-up:before{content:"\F366"}.ion-android-attach:before{content:"\F367"}.ion-android-bar:before{content:"\F368"}.ion-android-bicycle:before{content:"\F369"}.ion-android-boat:before{content:"\F36A"}.ion-android-bookmark:before{content:"\F36B"}.ion-android-bulb:before{content:"\F36C"}.ion-android-bus:before{content:"\F36D"}.ion-android-calendar:before{content:"\F2D1"}.ion-android-call:before{content:"\F2D2"}.ion-android-camera:before{content:"\F2D3"}.ion-android-cancel:before{content:"\F36E"}.ion-android-car:before{content:"\F36F"}.ion-android-cart:before{content:"\F370"}.ion-android-chat:before{content:"\F2D4"}.ion-android-checkbox:before{content:"\F374"}.ion-android-checkbox-blank:before{content:"\F371"}.ion-android-checkbox-outline:before{content:"\F373"}.ion-android-checkbox-outline-blank:before{content:"\F372"}.ion-android-checkmark-circle:before{content:"\F375"}.ion-android-clipboard:before{content:"\F376"}.ion-android-close:before{content:"\F2D7"}.ion-android-cloud:before{content:"\F37A"}.ion-android-cloud-circle:before{content:"\F377"}.ion-android-cloud-done:before{content:"\F378"}.ion-android-cloud-outline:before{content:"\F379"}.ion-android-color-palette:before{content:"\F37B"}.ion-android-compass:before{content:"\F37C"}.ion-android-contact:before{content:"\F2D8"}.ion-android-contacts:before{content:"\F2D9"}.ion-android-contract:before{content:"\F37D"}.ion-android-create:before{content:"\F37E"}.ion-android-delete:before{content:"\F37F"}.ion-android-desktop:before{content:"\F380"}.ion-android-document:before{content:"\F381"}.ion-android-done:before{content:"\F383"}.ion-android-done-all:before{content:"\F382"}.ion-android-download:before{content:"\F2DD"}.ion-android-drafts:before{content:"\F384"}.ion-android-exit:before{content:"\F385"}.ion-android-expand:before{content:"\F386"}.ion-android-favorite:before{content:"\F388"}.ion-android-favorite-outline:before{content:"\F387"}.ion-android-film:before{content:"\F389"}.ion-android-folder:before{content:"\F2E0"}.ion-android-folder-open:before{content:"\F38A"}.ion-android-funnel:before{content:"\F38B"}.ion-android-globe:before{content:"\F38C"}.ion-android-hand:before{content:"\F2E3"}.ion-android-hangout:before{content:"\F38D"}.ion-android-happy:before{content:"\F38E"}.ion-android-home:before{content:"\F38F"}.ion-android-image:before{content:"\F2E4"}.ion-android-laptop:before{content:"\F390"}.ion-android-list:before{content:"\F391"}.ion-android-locate:before{content:"\F2E9"}.ion-android-lock:before{content:"\F392"}.ion-android-mail:before{content:"\F2EB"}.ion-android-map:before{content:"\F393"}.ion-android-menu:before{content:"\F394"}.ion-android-microphone:before{content:"\F2EC"}.ion-android-microphone-off:before{content:"\F395"}.ion-android-more-horizontal:before{content:"\F396"}.ion-android-more-vertical:before{content:"\F397"}.ion-android-navigate:before{content:"\F398"}.ion-android-notifications:before{content:"\F39B"}.ion-android-notifications-none:before{content:"\F399"}.ion-android-notifications-off:before{content:"\F39A"}.ion-android-open:before{content:"\F39C"}.ion-android-options:before{content:"\F39D"}.ion-android-people:before{content:"\F39E"}.ion-android-person:before{content:"\F3A0"}.ion-android-person-add:before{content:"\F39F"}.ion-android-phone-landscape:before{content:"\F3A1"}.ion-android-phone-portrait:before{content:"\F3A2"}.ion-android-pin:before{content:"\F3A3"}.ion-android-plane:before{content:"\F3A4"}.ion-android-playstore:before{content:"\F2F0"}.ion-android-print:before{content:"\F3A5"}.ion-android-radio-button-off:before{content:"\F3A6"}.ion-android-radio-button-on:before{content:"\F3A7"}.ion-android-refresh:before{content:"\F3A8"}.ion-android-remove:before{content:"\F2F4"}.ion-android-remove-circle:before{content:"\F3A9"}.ion-android-restaurant:before{content:"\F3AA"}.ion-android-sad:before{content:"\F3AB"}.ion-android-search:before{content:"\F2F5"}.ion-android-send:before{content:"\F2F6"}.ion-android-settings:before{content:"\F2F7"}.ion-android-share:before{content:"\F2F8"}.ion-android-share-alt:before{content:"\F3AC"}.ion-android-star:before{content:"\F2FC"}.ion-android-star-half:before{content:"\F3AD"}.ion-android-star-outline:before{content:"\F3AE"}.ion-android-stopwatch:before{content:"\F2FD"}.ion-android-subway:before{content:"\F3AF"}.ion-android-sunny:before{content:"\F3B0"}.ion-android-sync:before{content:"\F3B1"}.ion-android-textsms:before{content:"\F3B2"}.ion-android-time:before{content:"\F3B3"}.ion-android-train:before{content:"\F3B4"}.ion-android-unlock:before{content:"\F3B5"}.ion-android-upload:before{content:"\F3B6"}.ion-android-volume-down:before{content:"\F3B7"}.ion-android-volume-mute:before{content:"\F3B8"}.ion-android-volume-off:before{content:"\F3B9"}.ion-android-volume-up:before{content:"\F3BA"}.ion-android-walk:before{content:"\F3BB"}.ion-android-warning:before{content:"\F3BC"}.ion-android-watch:before{content:"\F3BD"}.ion-android-wifi:before{content:"\F305"}.ion-aperture:before{content:"\F313"}.ion-archive:before{content:"\F102"}.ion-arrow-down-a:before{content:"\F103"}.ion-arrow-down-b:before{content:"\F104"}.ion-arrow-down-c:before{content:"\F105"}.ion-arrow-expand:before{content:"\F25E"}.ion-arrow-graph-down-left:before{content:"\F25F"}.ion-arrow-graph-down-right:before{content:"\F260"}.ion-arrow-graph-up-left:before{content:"\F261"}.ion-arrow-graph-up-right:before{content:"\F262"}.ion-arrow-left-a:before{content:"\F106"}.ion-arrow-left-b:before{content:"\F107"}.ion-arrow-left-c:before{content:"\F108"}.ion-arrow-move:before{content:"\F263"}.ion-arrow-resize:before{content:"\F264"}.ion-arrow-return-left:before{content:"\F265"}.ion-arrow-return-right:before{content:"\F266"}.ion-arrow-right-a:before{content:"\F109"}.ion-arrow-right-b:before{content:"\F10A"}.ion-arrow-right-c:before{content:"\F10B"}.ion-arrow-shrink:before{content:"\F267"}.ion-arrow-swap:before{content:"\F268"}.ion-arrow-up-a:before{content:"\F10C"}.ion-arrow-up-b:before{content:"\F10D"}.ion-arrow-up-c:before{content:"\F10E"}.ion-asterisk:before{content:"\F314"}.ion-at:before{content:"\F10F"}.ion-backspace:before{content:"\F3BF"}.ion-backspace-outline:before{content:"\F3BE"}.ion-bag:before{content:"\F110"}.ion-battery-charging:before{content:"\F111"}.ion-battery-empty:before{content:"\F112"}.ion-battery-full:before{content:"\F113"}.ion-battery-half:before{content:"\F114"}.ion-battery-low:before{content:"\F115"}.ion-beaker:before{content:"\F269"}.ion-beer:before{content:"\F26A"}.ion-bluetooth:before{content:"\F116"}.ion-bonfire:before{content:"\F315"}.ion-bookmark:before{content:"\F26B"}.ion-bowtie:before{content:"\F3C0"}.ion-briefcase:before{content:"\F26C"}.ion-bug:before{content:"\F2BE"}.ion-calculator:before{content:"\F26D"}.ion-calendar:before{content:"\F117"}.ion-camera:before{content:"\F118"}.ion-card:before{content:"\F119"}.ion-cash:before{content:"\F316"}.ion-chatbox:before{content:"\F11B"}.ion-chatbox-working:before{content:"\F11A"}.ion-chatboxes:before{content:"\F11C"}.ion-chatbubble:before{content:"\F11E"}.ion-chatbubble-working:before{content:"\F11D"}.ion-chatbubbles:before{content:"\F11F"}.ion-checkmark:before{content:"\F122"}.ion-checkmark-circled:before{content:"\F120"}.ion-checkmark-round:before{content:"\F121"}.ion-chevron-down:before{content:"\F123"}.ion-chevron-left:before{content:"\F124"}.ion-chevron-right:before{content:"\F125"}.ion-chevron-up:before{content:"\F126"}.ion-clipboard:before{content:"\F127"}.ion-clock:before{content:"\F26E"}.ion-close:before{content:"\F12A"}.ion-close-circled:before{content:"\F128"}.ion-close-round:before{content:"\F129"}.ion-closed-captioning:before{content:"\F317"}.ion-cloud:before{content:"\F12B"}.ion-code:before{content:"\F271"}.ion-code-download:before{content:"\F26F"}.ion-code-working:before{content:"\F270"}.ion-coffee:before{content:"\F272"}.ion-compass:before{content:"\F273"}.ion-compose:before{content:"\F12C"}.ion-connection-bars:before{content:"\F274"}.ion-contrast:before{content:"\F275"}.ion-crop:before{content:"\F3C1"}.ion-cube:before{content:"\F318"}.ion-disc:before{content:"\F12D"}.ion-document:before{content:"\F12F"}.ion-document-text:before{content:"\F12E"}.ion-drag:before{content:"\F130"}.ion-earth:before{content:"\F276"}.ion-easel:before{content:"\F3C2"}.ion-edit:before{content:"\F2BF"}.ion-egg:before{content:"\F277"}.ion-eject:before{content:"\F131"}.ion-email:before{content:"\F132"}.ion-email-unread:before{content:"\F3C3"}.ion-erlenmeyer-flask:before{content:"\F3C5"}.ion-erlenmeyer-flask-bubbles:before{content:"\F3C4"}.ion-eye:before{content:"\F133"}.ion-eye-disabled:before{content:"\F306"}.ion-female:before{content:"\F278"}.ion-filing:before{content:"\F134"}.ion-film-marker:before{content:"\F135"}.ion-fireball:before{content:"\F319"}.ion-flag:before{content:"\F279"}.ion-flame:before{content:"\F31A"}.ion-flash:before{content:"\F137"}.ion-flash-off:before{content:"\F136"}.ion-folder:before{content:"\F139"}.ion-fork:before{content:"\F27A"}.ion-fork-repo:before{content:"\F2C0"}.ion-forward:before{content:"\F13A"}.ion-funnel:before{content:"\F31B"}.ion-gear-a:before{content:"\F13D"}.ion-gear-b:before{content:"\F13E"}.ion-grid:before{content:"\F13F"}.ion-hammer:before{content:"\F27B"}.ion-happy:before{content:"\F31C"}.ion-happy-outline:before{content:"\F3C6"}.ion-headphone:before{content:"\F140"}.ion-heart:before{content:"\F141"}.ion-heart-broken:before{content:"\F31D"}.ion-help:before{content:"\F143"}.ion-help-buoy:before{content:"\F27C"}.ion-help-circled:before{content:"\F142"}.ion-home:before{content:"\F144"}.ion-icecream:before{content:"\F27D"}.ion-image:before{content:"\F147"}.ion-images:before{content:"\F148"}.ion-information:before{content:"\F14A"}.ion-information-circled:before{content:"\F149"}.ion-ionic:before{content:"\F14B"}.ion-ios-alarm:before{content:"\F3C8"}.ion-ios-alarm-outline:before{content:"\F3C7"}.ion-ios-albums:before{content:"\F3CA"}.ion-ios-albums-outline:before{content:"\F3C9"}.ion-ios-americanfootball:before{content:"\F3CC"}.ion-ios-americanfootball-outline:before{content:"\F3CB"}.ion-ios-analytics:before{content:"\F3CE"}.ion-ios-analytics-outline:before{content:"\F3CD"}.ion-ios-arrow-back:before{content:"\F3CF"}.ion-ios-arrow-down:before{content:"\F3D0"}.ion-ios-arrow-forward:before{content:"\F3D1"}.ion-ios-arrow-left:before{content:"\F3D2"}.ion-ios-arrow-right:before{content:"\F3D3"}.ion-ios-arrow-thin-down:before{content:"\F3D4"}.ion-ios-arrow-thin-left:before{content:"\F3D5"}.ion-ios-arrow-thin-right:before{content:"\F3D6"}.ion-ios-arrow-thin-up:before{content:"\F3D7"}.ion-ios-arrow-up:before{content:"\F3D8"}.ion-ios-at:before{content:"\F3DA"}.ion-ios-at-outline:before{content:"\F3D9"}.ion-ios-barcode:before{content:"\F3DC"}.ion-ios-barcode-outline:before{content:"\F3DB"}.ion-ios-baseball:before{content:"\F3DE"}.ion-ios-baseball-outline:before{content:"\F3DD"}.ion-ios-basketball:before{content:"\F3E0"}.ion-ios-basketball-outline:before{content:"\F3DF"}.ion-ios-bell:before{content:"\F3E2"}.ion-ios-bell-outline:before{content:"\F3E1"}.ion-ios-body:before{content:"\F3E4"}.ion-ios-body-outline:before{content:"\F3E3"}.ion-ios-bolt:before{content:"\F3E6"}.ion-ios-bolt-outline:before{content:"\F3E5"}.ion-ios-book:before{content:"\F3E8"}.ion-ios-book-outline:before{content:"\F3E7"}.ion-ios-bookmarks:before{content:"\F3EA"}.ion-ios-bookmarks-outline:before{content:"\F3E9"}.ion-ios-box:before{content:"\F3EC"}.ion-ios-box-outline:before{content:"\F3EB"}.ion-ios-briefcase:before{content:"\F3EE"}.ion-ios-briefcase-outline:before{content:"\F3ED"}.ion-ios-browsers:before{content:"\F3F0"}.ion-ios-browsers-outline:before{content:"\F3EF"}.ion-ios-calculator:before{content:"\F3F2"}.ion-ios-calculator-outline:before{content:"\F3F1"}.ion-ios-calendar:before{content:"\F3F4"}.ion-ios-calendar-outline:before{content:"\F3F3"}.ion-ios-camera:before{content:"\F3F6"}.ion-ios-camera-outline:before{content:"\F3F5"}.ion-ios-cart:before{content:"\F3F8"}.ion-ios-cart-outline:before{content:"\F3F7"}.ion-ios-chatboxes:before{content:"\F3FA"}.ion-ios-chatboxes-outline:before{content:"\F3F9"}.ion-ios-chatbubble:before{content:"\F3FC"}.ion-ios-chatbubble-outline:before{content:"\F3FB"}.ion-ios-checkmark:before{content:"\F3FF"}.ion-ios-checkmark-empty:before{content:"\F3FD"}.ion-ios-checkmark-outline:before{content:"\F3FE"}.ion-ios-circle-filled:before{content:"\F400"}.ion-ios-circle-outline:before{content:"\F401"}.ion-ios-clock:before{content:"\F403"}.ion-ios-clock-outline:before{content:"\F402"}.ion-ios-close:before{content:"\F406"}.ion-ios-close-empty:before{content:"\F404"}.ion-ios-close-outline:before{content:"\F405"}.ion-ios-cloud:before{content:"\F40C"}.ion-ios-cloud-download:before{content:"\F408"}.ion-ios-cloud-download-outline:before{content:"\F407"}.ion-ios-cloud-outline:before{content:"\F409"}.ion-ios-cloud-upload:before{content:"\F40B"}.ion-ios-cloud-upload-outline:before{content:"\F40A"}.ion-ios-cloudy:before{content:"\F410"}.ion-ios-cloudy-night:before{content:"\F40E"}.ion-ios-cloudy-night-outline:before{content:"\F40D"}.ion-ios-cloudy-outline:before{content:"\F40F"}.ion-ios-cog:before{content:"\F412"}.ion-ios-cog-outline:before{content:"\F411"}.ion-ios-color-filter:before{content:"\F414"}.ion-ios-color-filter-outline:before{content:"\F413"}.ion-ios-color-wand:before{content:"\F416"}.ion-ios-color-wand-outline:before{content:"\F415"}.ion-ios-compose:before{content:"\F418"}.ion-ios-compose-outline:before{content:"\F417"}.ion-ios-contact:before{content:"\F41A"}.ion-ios-contact-outline:before{content:"\F419"}.ion-ios-copy:before{content:"\F41C"}.ion-ios-copy-outline:before{content:"\F41B"}.ion-ios-crop:before{content:"\F41E"}.ion-ios-crop-strong:before{content:"\F41D"}.ion-ios-download:before{content:"\F420"}.ion-ios-download-outline:before{content:"\F41F"}.ion-ios-drag:before{content:"\F421"}.ion-ios-email:before{content:"\F423"}.ion-ios-email-outline:before{content:"\F422"}.ion-ios-eye:before{content:"\F425"}.ion-ios-eye-outline:before{content:"\F424"}.ion-ios-fastforward:before{content:"\F427"}.ion-ios-fastforward-outline:before{content:"\F426"}.ion-ios-filing:before{content:"\F429"}.ion-ios-filing-outline:before{content:"\F428"}.ion-ios-film:before{content:"\F42B"}.ion-ios-film-outline:before{content:"\F42A"}.ion-ios-flag:before{content:"\F42D"}.ion-ios-flag-outline:before{content:"\F42C"}.ion-ios-flame:before{content:"\F42F"}.ion-ios-flame-outline:before{content:"\F42E"}.ion-ios-flask:before{content:"\F431"}.ion-ios-flask-outline:before{content:"\F430"}.ion-ios-flower:before{content:"\F433"}.ion-ios-flower-outline:before{content:"\F432"}.ion-ios-folder:before{content:"\F435"}.ion-ios-folder-outline:before{content:"\F434"}.ion-ios-football:before{content:"\F437"}.ion-ios-football-outline:before{content:"\F436"}.ion-ios-game-controller-a:before{content:"\F439"}.ion-ios-game-controller-a-outline:before{content:"\F438"}.ion-ios-game-controller-b:before{content:"\F43B"}.ion-ios-game-controller-b-outline:before{content:"\F43A"}.ion-ios-gear:before{content:"\F43D"}.ion-ios-gear-outline:before{content:"\F43C"}.ion-ios-glasses:before{content:"\F43F"}.ion-ios-glasses-outline:before{content:"\F43E"}.ion-ios-grid-view:before{content:"\F441"}.ion-ios-grid-view-outline:before{content:"\F440"}.ion-ios-heart:before{content:"\F443"}.ion-ios-heart-outline:before{content:"\F442"}.ion-ios-help:before{content:"\F446"}.ion-ios-help-empty:before{content:"\F444"}.ion-ios-help-outline:before{content:"\F445"}.ion-ios-home:before{content:"\F448"}.ion-ios-home-outline:before{content:"\F447"}.ion-ios-infinite:before{content:"\F44A"}.ion-ios-infinite-outline:before{content:"\F449"}.ion-ios-information:before{content:"\F44D"}.ion-ios-information-empty:before{content:"\F44B"}.ion-ios-information-outline:before{content:"\F44C"}.ion-ios-ionic-outline:before{content:"\F44E"}.ion-ios-keypad:before{content:"\F450"}.ion-ios-keypad-outline:before{content:"\F44F"}.ion-ios-lightbulb:before{content:"\F452"}.ion-ios-lightbulb-outline:before{content:"\F451"}.ion-ios-list:before{content:"\F454"}.ion-ios-list-outline:before{content:"\F453"}.ion-ios-location:before{content:"\F456"}.ion-ios-location-outline:before{content:"\F455"}.ion-ios-locked:before{content:"\F458"}.ion-ios-locked-outline:before{content:"\F457"}.ion-ios-loop:before{content:"\F45A"}.ion-ios-loop-strong:before{content:"\F459"}.ion-ios-medical:before{content:"\F45C"}.ion-ios-medical-outline:before{content:"\F45B"}.ion-ios-medkit:before{content:"\F45E"}.ion-ios-medkit-outline:before{content:"\F45D"}.ion-ios-mic:before{content:"\F461"}.ion-ios-mic-off:before{content:"\F45F"}.ion-ios-mic-outline:before{content:"\F460"}.ion-ios-minus:before{content:"\F464"}.ion-ios-minus-empty:before{content:"\F462"}.ion-ios-minus-outline:before{content:"\F463"}.ion-ios-monitor:before{content:"\F466"}.ion-ios-monitor-outline:before{content:"\F465"}.ion-ios-moon:before{content:"\F468"}.ion-ios-moon-outline:before{content:"\F467"}.ion-ios-more:before{content:"\F46A"}.ion-ios-more-outline:before{content:"\F469"}.ion-ios-musical-note:before{content:"\F46B"}.ion-ios-musical-notes:before{content:"\F46C"}.ion-ios-navigate:before{content:"\F46E"}.ion-ios-navigate-outline:before{content:"\F46D"}.ion-ios-nutrition:before{content:"\F470"}.ion-ios-nutrition-outline:before{content:"\F46F"}.ion-ios-paper:before{content:"\F472"}.ion-ios-paper-outline:before{content:"\F471"}.ion-ios-paperplane:before{content:"\F474"}.ion-ios-paperplane-outline:before{content:"\F473"}.ion-ios-partlysunny:before{content:"\F476"}.ion-ios-partlysunny-outline:before{content:"\F475"}.ion-ios-pause:before{content:"\F478"}.ion-ios-pause-outline:before{content:"\F477"}.ion-ios-paw:before{content:"\F47A"}.ion-ios-paw-outline:before{content:"\F479"}.ion-ios-people:before{content:"\F47C"}.ion-ios-people-outline:before{content:"\F47B"}.ion-ios-person:before{content:"\F47E"}.ion-ios-person-outline:before{content:"\F47D"}.ion-ios-personadd:before{content:"\F480"}.ion-ios-personadd-outline:before{content:"\F47F"}.ion-ios-photos:before{content:"\F482"}.ion-ios-photos-outline:before{content:"\F481"}.ion-ios-pie:before{content:"\F484"}.ion-ios-pie-outline:before{content:"\F483"}.ion-ios-pint:before{content:"\F486"}.ion-ios-pint-outline:before{content:"\F485"}.ion-ios-play:before{content:"\F488"}.ion-ios-play-outline:before{content:"\F487"}.ion-ios-plus:before{content:"\F48B"}.ion-ios-plus-empty:before{content:"\F489"}.ion-ios-plus-outline:before{content:"\F48A"}.ion-ios-pricetag:before{content:"\F48D"}.ion-ios-pricetag-outline:before{content:"\F48C"}.ion-ios-pricetags:before{content:"\F48F"}.ion-ios-pricetags-outline:before{content:"\F48E"}.ion-ios-printer:before{content:"\F491"}.ion-ios-printer-outline:before{content:"\F490"}.ion-ios-pulse:before{content:"\F493"}.ion-ios-pulse-strong:before{content:"\F492"}.ion-ios-rainy:before{content:"\F495"}.ion-ios-rainy-outline:before{content:"\F494"}.ion-ios-recording:before{content:"\F497"}.ion-ios-recording-outline:before{content:"\F496"}.ion-ios-redo:before{content:"\F499"}.ion-ios-redo-outline:before{content:"\F498"}.ion-ios-refresh:before{content:"\F49C"}.ion-ios-refresh-empty:before{content:"\F49A"}.ion-ios-refresh-outline:before{content:"\F49B"}.ion-ios-reload:before{content:"\F49D"}.ion-ios-reverse-camera:before{content:"\F49F"}.ion-ios-reverse-camera-outline:before{content:"\F49E"}.ion-ios-rewind:before{content:"\F4A1"}.ion-ios-rewind-outline:before{content:"\F4A0"}.ion-ios-rose:before{content:"\F4A3"}.ion-ios-rose-outline:before{content:"\F4A2"}.ion-ios-search:before{content:"\F4A5"}.ion-ios-search-strong:before{content:"\F4A4"}.ion-ios-settings:before{content:"\F4A7"}.ion-ios-settings-strong:before{content:"\F4A6"}.ion-ios-shuffle:before{content:"\F4A9"}.ion-ios-shuffle-strong:before{content:"\F4A8"}.ion-ios-skipbackward:before{content:"\F4AB"}.ion-ios-skipbackward-outline:before{content:"\F4AA"}.ion-ios-skipforward:before{content:"\F4AD"}.ion-ios-skipforward-outline:before{content:"\F4AC"}.ion-ios-snowy:before{content:"\F4AE"}.ion-ios-speedometer:before{content:"\F4B0"}.ion-ios-speedometer-outline:before{content:"\F4AF"}.ion-ios-star:before{content:"\F4B3"}.ion-ios-star-half:before{content:"\F4B1"}.ion-ios-star-outline:before{content:"\F4B2"}.ion-ios-stopwatch:before{content:"\F4B5"}.ion-ios-stopwatch-outline:before{content:"\F4B4"}.ion-ios-sunny:before{content:"\F4B7"}.ion-ios-sunny-outline:before{content:"\F4B6"}.ion-ios-telephone:before{content:"\F4B9"}.ion-ios-telephone-outline:before{content:"\F4B8"}.ion-ios-tennisball:before{content:"\F4BB"}.ion-ios-tennisball-outline:before{content:"\F4BA"}.ion-ios-thunderstorm:before{content:"\F4BD"}.ion-ios-thunderstorm-outline:before{content:"\F4BC"}.ion-ios-time:before{content:"\F4BF"}.ion-ios-time-outline:before{content:"\F4BE"}.ion-ios-timer:before{content:"\F4C1"}.ion-ios-timer-outline:before{content:"\F4C0"}.ion-ios-toggle:before{content:"\F4C3"}.ion-ios-toggle-outline:before{content:"\F4C2"}.ion-ios-trash:before{content:"\F4C5"}.ion-ios-trash-outline:before{content:"\F4C4"}.ion-ios-undo:before{content:"\F4C7"}.ion-ios-undo-outline:before{content:"\F4C6"}.ion-ios-unlocked:before{content:"\F4C9"}.ion-ios-unlocked-outline:before{content:"\F4C8"}.ion-ios-upload:before{content:"\F4CB"}.ion-ios-upload-outline:before{content:"\F4CA"}.ion-ios-videocam:before{content:"\F4CD"}.ion-ios-videocam-outline:before{content:"\F4CC"}.ion-ios-volume-high:before{content:"\F4CE"}.ion-ios-volume-low:before{content:"\F4CF"}.ion-ios-wineglass:before{content:"\F4D1"}.ion-ios-wineglass-outline:before{content:"\F4D0"}.ion-ios-world:before{content:"\F4D3"}.ion-ios-world-outline:before{content:"\F4D2"}.ion-ipad:before{content:"\F1F9"}.ion-iphone:before{content:"\F1FA"}.ion-ipod:before{content:"\F1FB"}.ion-jet:before{content:"\F295"}.ion-key:before{content:"\F296"}.ion-knife:before{content:"\F297"}.ion-laptop:before{content:"\F1FC"}.ion-leaf:before{content:"\F1FD"}.ion-levels:before{content:"\F298"}.ion-lightbulb:before{content:"\F299"}.ion-link:before{content:"\F1FE"}.ion-load-a:before{content:"\F29A"}.ion-load-b:before{content:"\F29B"}.ion-load-c:before{content:"\F29C"}.ion-load-d:before{content:"\F29D"}.ion-location:before{content:"\F1FF"}.ion-lock-combination:before{content:"\F4D4"}.ion-locked:before{content:"\F200"}.ion-log-in:before{content:"\F29E"}.ion-log-out:before{content:"\F29F"}.ion-loop:before{content:"\F201"}.ion-magnet:before{content:"\F2A0"}.ion-male:before{content:"\F2A1"}.ion-man:before{content:"\F202"}.ion-map:before{content:"\F203"}.ion-medkit:before{content:"\F2A2"}.ion-merge:before{content:"\F33F"}.ion-mic-a:before{content:"\F204"}.ion-mic-b:before{content:"\F205"}.ion-mic-c:before{content:"\F206"}.ion-minus:before{content:"\F209"}.ion-minus-circled:before{content:"\F207"}.ion-minus-round:before{content:"\F208"}.ion-model-s:before{content:"\F2C1"}.ion-monitor:before{content:"\F20A"}.ion-more:before{content:"\F20B"}.ion-mouse:before{content:"\F340"}.ion-music-note:before{content:"\F20C"}.ion-navicon:before{content:"\F20E"}.ion-navicon-round:before{content:"\F20D"}.ion-navigate:before{content:"\F2A3"}.ion-network:before{content:"\F341"}.ion-no-smoking:before{content:"\F2C2"}.ion-nuclear:before{content:"\F2A4"}.ion-outlet:before{content:"\F342"}.ion-paintbrush:before{content:"\F4D5"}.ion-paintbucket:before{content:"\F4D6"}.ion-paper-airplane:before{content:"\F2C3"}.ion-paperclip:before{content:"\F20F"}.ion-pause:before{content:"\F210"}.ion-person:before{content:"\F213"}.ion-person-add:before{content:"\F211"}.ion-person-stalker:before{content:"\F212"}.ion-pie-graph:before{content:"\F2A5"}.ion-pin:before{content:"\F2A6"}.ion-pinpoint:before{content:"\F2A7"}.ion-pizza:before{content:"\F2A8"}.ion-plane:before{content:"\F214"}.ion-planet:before{content:"\F343"}.ion-play:before{content:"\F215"}.ion-playstation:before{content:"\F30A"}.ion-plus:before{content:"\F218"}.ion-plus-circled:before{content:"\F216"}.ion-plus-round:before{content:"\F217"}.ion-podium:before{content:"\F344"}.ion-pound:before{content:"\F219"}.ion-power:before{content:"\F2A9"}.ion-pricetag:before{content:"\F2AA"}.ion-pricetags:before{content:"\F2AB"}.ion-printer:before{content:"\F21A"}.ion-pull-request:before{content:"\F345"}.ion-qr-scanner:before{content:"\F346"}.ion-quote:before{content:"\F347"}.ion-radio-waves:before{content:"\F2AC"}.ion-record:before{content:"\F21B"}.ion-refresh:before{content:"\F21C"}.ion-reply:before{content:"\F21E"}.ion-reply-all:before{content:"\F21D"}.ion-ribbon-a:before{content:"\F348"}.ion-ribbon-b:before{content:"\F349"}.ion-sad:before{content:"\F34A"}.ion-sad-outline:before{content:"\F4D7"}.ion-scissors:before{content:"\F34B"}.ion-search:before{content:"\F21F"}.ion-settings:before{content:"\F2AD"}.ion-share:before{content:"\F220"}.ion-shuffle:before{content:"\F221"}.ion-skip-backward:before{content:"\F222"}.ion-skip-forward:before{content:"\F223"}.ion-social-android:before{content:"\F225"}.ion-social-android-outline:before{content:"\F224"}.ion-social-angular:before{content:"\F4D9"}.ion-social-angular-outline:before{content:"\F4D8"}.ion-social-apple:before{content:"\F227"}.ion-social-apple-outline:before{content:"\F226"}.ion-social-bitcoin:before{content:"\F2AF"}.ion-social-bitcoin-outline:before{content:"\F2AE"}.ion-social-buffer:before{content:"\F229"}.ion-social-buffer-outline:before{content:"\F228"}.ion-social-chrome:before{content:"\F4DB"}.ion-social-chrome-outline:before{content:"\F4DA"}.ion-social-codepen:before{content:"\F4DD"}.ion-social-codepen-outline:before{content:"\F4DC"}.ion-social-css3:before{content:"\F4DF"}.ion-social-css3-outline:before{content:"\F4DE"}.ion-social-designernews:before{content:"\F22B"}.ion-social-designernews-outline:before{content:"\F22A"}.ion-social-dribbble:before{content:"\F22D"}.ion-social-dribbble-outline:before{content:"\F22C"}.ion-social-dropbox:before{content:"\F22F"}.ion-social-dropbox-outline:before{content:"\F22E"}.ion-social-euro:before{content:"\F4E1"}.ion-social-euro-outline:before{content:"\F4E0"}.ion-social-facebook:before{content:"\F231"}.ion-social-facebook-outline:before{content:"\F230"}.ion-social-foursquare:before{content:"\F34D"}.ion-social-foursquare-outline:before{content:"\F34C"}.ion-social-freebsd-devil:before{content:"\F2C4"}.ion-social-github:before{content:"\F233"}.ion-social-github-outline:before{content:"\F232"}.ion-social-google:before{content:"\F34F"}.ion-social-google-outline:before{content:"\F34E"}.ion-social-googleplus:before{content:"\F235"}.ion-social-googleplus-outline:before{content:"\F234"}.ion-social-hackernews:before{content:"\F237"}.ion-social-hackernews-outline:before{content:"\F236"}.ion-social-html5:before{content:"\F4E3"}.ion-social-html5-outline:before{content:"\F4E2"}.ion-social-instagram:before{content:"\F351"}.ion-social-instagram-outline:before{content:"\F350"}.ion-social-javascript:before{content:"\F4E5"}.ion-social-javascript-outline:before{content:"\F4E4"}.ion-social-linkedin:before{content:"\F239"}.ion-social-linkedin-outline:before{content:"\F238"}.ion-social-markdown:before{content:"\F4E6"}.ion-social-nodejs:before{content:"\F4E7"}.ion-social-octocat:before{content:"\F4E8"}.ion-social-pinterest:before{content:"\F2B1"}.ion-social-pinterest-outline:before{content:"\F2B0"}.ion-social-python:before{content:"\F4E9"}.ion-social-reddit:before{content:"\F23B"}.ion-social-reddit-outline:before{content:"\F23A"}.ion-social-rss:before{content:"\F23D"}.ion-social-rss-outline:before{content:"\F23C"}.ion-social-sass:before{content:"\F4EA"}.ion-social-skype:before{content:"\F23F"}.ion-social-skype-outline:before{content:"\F23E"}.ion-social-snapchat:before{content:"\F4EC"}.ion-social-snapchat-outline:before{content:"\F4EB"}.ion-social-tumblr:before{content:"\F241"}.ion-social-tumblr-outline:before{content:"\F240"}.ion-social-tux:before{content:"\F2C5"}.ion-social-twitch:before{content:"\F4EE"}.ion-social-twitch-outline:before{content:"\F4ED"}.ion-social-twitter:before{content:"\F243"}.ion-social-twitter-outline:before{content:"\F242"}.ion-social-usd:before{content:"\F353"}.ion-social-usd-outline:before{content:"\F352"}.ion-social-vimeo:before{content:"\F245"}.ion-social-vimeo-outline:before{content:"\F244"}.ion-social-whatsapp:before{content:"\F4F0"}.ion-social-whatsapp-outline:before{content:"\F4EF"}.ion-social-windows:before{content:"\F247"}.ion-social-windows-outline:before{content:"\F246"}.ion-social-wordpress:before{content:"\F249"}.ion-social-wordpress-outline:before{content:"\F248"}.ion-social-yahoo:before{content:"\F24B"}.ion-social-yahoo-outline:before{content:"\F24A"}.ion-social-yen:before{content:"\F4F2"}.ion-social-yen-outline:before{content:"\F4F1"}.ion-social-youtube:before{content:"\F24D"}.ion-social-youtube-outline:before{content:"\F24C"}.ion-soup-can:before{content:"\F4F4"}.ion-soup-can-outline:before{content:"\F4F3"}.ion-speakerphone:before{content:"\F2B2"}.ion-speedometer:before{content:"\F2B3"}.ion-spoon:before{content:"\F2B4"}.ion-star:before{content:"\F24E"}.ion-stats-bars:before{content:"\F2B5"}.ion-steam:before{content:"\F30B"}.ion-stop:before{content:"\F24F"}.ion-thermometer:before{content:"\F2B6"}.ion-thumbsdown:before{content:"\F250"}.ion-thumbsup:before{content:"\F251"}.ion-toggle:before{content:"\F355"}.ion-toggle-filled:before{content:"\F354"}.ion-transgender:before{content:"\F4F5"}.ion-trash-a:before{content:"\F252"}.ion-trash-b:before{content:"\F253"}.ion-trophy:before{content:"\F356"}.ion-tshirt:before{content:"\F4F7"}.ion-tshirt-outline:before{content:"\F4F6"}.ion-umbrella:before{content:"\F2B7"}.ion-university:before{content:"\F357"}.ion-unlocked:before{content:"\F254"}.ion-upload:before{content:"\F255"}.ion-usb:before{content:"\F2B8"}.ion-videocamera:before{content:"\F256"}.ion-volume-high:before{content:"\F257"}.ion-volume-low:before{content:"\F258"}.ion-volume-medium:before{content:"\F259"}.ion-volume-mute:before{content:"\F25A"}.ion-wand:before{content:"\F358"}.ion-waterdrop:before{content:"\F25B"}.ion-wifi:before{content:"\F25C"}.ion-wineglass:before{content:"\F2B9"}.ion-woman:before{content:"\F25D"}.ion-wrench:before{content:"\F2BA"}.ion-xbox:before{content:"\F30C"}
/*!
- * AdminLTE (modified) v2.4.0
- * Authors: Social-chan & Almsaeed Studio
+ * AdminLTE v2.4.2
+ * Author: Almsaeed Studio
* Website: Almsaeed Studio <https://adminlte.io>
- * License: MIT (http://opensource.org/licenses/MIT)
- */html,body{height:100%}.layout-boxed html,.layout-boxed body{height:100%}body{font-family:'Source Sans Pro','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{height:100%;position:relative;overflow-x:hidden;overflow-y:auto}.wrapper:before,.wrapper:after{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;-webkit-box-shadow:0 0 8px rgba(0,0,0,0.5);box-shadow:0 0 8px rgba(0,0,0,0.5);position:relative}.layout-boxed{background:url(/images/vendor/adminlte/dist/boxed-bg.jpg?5bbbd344130f0926b70aa3499638a387) repeat fixed}.content-wrapper,.main-footer{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-webkit-transition:margin .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:margin .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out,-webkit-transform .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .main-footer{margin-left:0}@media (max-width:767px){.content-wrapper,.main-footer{margin-left:0}}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .main-footer{margin-left:0}}@media (max-width:767px){.sidebar-open .content-wrapper,.sidebar-open .main-footer{-webkit-transform:translate(230px, 0);transform:translate(230px, 0)}}.content-wrapper{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .main-header,.fixed .main-sidebar,.fixed .left-side{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}.fixed .wrapper{overflow:hidden}.hold-transition .content-wrapper,.hold-transition .right-side,.hold-transition .main-footer,.hold-transition .main-sidebar,.hold-transition .left-side,.hold-transition .main-header .navbar,.hold-transition .main-header .logo,.hold-transition .menu-open .fa-angle-left{-webkit-transition:none;transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:'Source Sans Pro',sans-serif}a{color:#3c8dbc}a:hover,a:active,a:focus{outline:none;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px 0;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header .navbar{-webkit-transition:margin-left .3s ease-in-out;transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0}.layout-top-nav .main-header .navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:rgba(255,255,255,0.2);border-color:transparent}.main-header #navbar-search-input.form-control:focus,.main-header #navbar-search-input.form-control:active{border-color:rgba(0,0,0,0.1);background:rgba(255,255,255,0.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:transparent}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px 15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\F0C9"}.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle:focus,.main-header .sidebar-toggle:active{background:transparent}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{-webkit-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.main-header .navbar-brand{color:#fff}.content-header{position:relative;padding:15px 15px 0 15px}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:transparent;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:'>\A0'}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px 15px}@media (max-width:991px){.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none !important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}}.main-sidebar{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-webkit-transition:width .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:width .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out,-webkit-transform .3s ease-in-out}@media (max-width:767px){.main-sidebar{padding-top:100px}}@media (max-width:767px){.main-sidebar{-webkit-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (min-width:768px){.sidebar-collapse .main-sidebar{-webkit-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (max-width:767px){.sidebar-open .main-sidebar{-webkit-transform:translate(0, 0);transform:translate(0, 0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:before,.user-panel:after{content:" ";display:table}.user-panel:after{clear:both}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .label,.sidebar-menu>li .badge{margin-right:5px}.sidebar-menu>li .badge{margin-top:3px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left,.sidebar-menu li>a>.pull-right-container>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;-webkit-transition:transform .5s ease;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease, -webkit-transform .5s ease}.sidebar-menu li>a>.fa-angle-left{position:absolute;top:50%;right:10px;margin-top:-8px}.sidebar-menu .menu-open>a>.fa-angle-left,.sidebar-menu .menu-open>a>.pull-right-container>.fa-angle-left{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu .active>.treeview-menu{display:block}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .right-side,.sidebar-mini.sidebar-collapse .main-footer{margin-left:50px !important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0, 0);transform:translate(0, 0);width:50px !important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu li.header{display:none !important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right),.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{display:block !important;position:absolute;width:180px;left:50px}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container{position:relative !important;float:right;width:auto !important;left:180px !important;top:-22px !important;z-index:900}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container>.label:not(:first-of-type){display:none}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-expanded-on-hover .main-footer,.sidebar-expanded-on-hover .content-wrapper{margin-left:50px}.sidebar-expanded-on-hover .main-sidebar{-webkit-box-shadow:3px 0 8px rgba(0,0,0,0.125);box-shadow:3px 0 8px rgba(0,0,0,0.125)}.sidebar-menu,.main-sidebar .user-panel,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right-container{position:absolute;right:10px;top:50%;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar-bg,.control-sidebar{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media (max-width:768px){.control-sidebar{padding-top:100px}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}.control-sidebar-open .control-sidebar-bg,.control-sidebar-open .control-sidebar{right:0}@media (min-width:768px){.control-sidebar-open .content-wrapper,.control-sidebar-open .right-side,.control-sidebar-open .main-footer{margin-right:230px}}.fixed .control-sidebar{position:fixed;height:100%;overflow-y:auto;padding-bottom:50px}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a{border-radius:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:hover,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:active{border-top:none;border-right:none;border-bottom:none}@media (max-width:768px){.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:before,.control-sidebar-menu>li>a:after{content:" ";display:table}.control-sidebar-menu>li>a:after{clear:both}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-menu .progress{margin:0}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading{color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{-webkit-box-shadow:none;box-shadow:none;border-color:#eee}.dropdown-menu>li>a{color:#777}.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0 0 0 0;margin:0;top:100%}.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#ffffff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444444;font-size:14px}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eeeeee;color:#444 !important;text-align:center}@media (max-width:991px){.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff !important;color:#444 !important}}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:normal}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444444;overflow:hidden;text-overflow:ellipsis;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px 10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{content:" ";display:table}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{clear:both}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px 0;color:#666666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid;border-color:transparent;border-color:rgba(255,255,255,0.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,0.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #dddddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444 !important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff !important;color:#444 !important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666666}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg);transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.form-control{border-radius:0;-webkit-box-shadow:none;box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;-webkit-box-shadow:none;box-shadow:none}.form-control::-moz-placeholder,.form-control:-ms-input-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control,.form-group.has-success .input-group-addon{border-color:#00a65a;-webkit-box-shadow:none;box-shadow:none}.form-group.has-success .help-block{color:#00a65a}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control,.form-group.has-warning .input-group-addon{border-color:#f39c12;-webkit-box-shadow:none;box-shadow:none}.form-group.has-warning .help-block{color:#f39c12}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control,.form-group.has-error .input-group-addon{border-color:#dd4b39;-webkit-box-shadow:none;box-shadow:none}.form-group.has-error .help-block{color:#dd4b39}.input-group .input-group-addon{border-radius:0;border-color:#d2d6de;background-color:#fff}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.input-lg+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.form-group-lg .form-control+.form-control-feedback.fa{line-height:46px}.input-sm+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.form-group-sm .form-control+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress,.progress>.progress-bar,.progress .progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.progress.sm,.progress-sm{height:10px}.progress.sm,.progress-sm,.progress.sm .progress-bar,.progress-sm .progress-bar{border-radius:1px}.progress.xs,.progress-xs{height:7px}.progress.xs,.progress-xs,.progress.xs .progress-bar,.progress-xs .progress-bar{border-radius:1px}.progress.xxs,.progress-xxs{height:3px}.progress.xxs,.progress-xxs,.progress.xxs .progress-bar,.progress-xxs .progress-bar{border-radius:1px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.sm,.progress.vertical.progress-sm{width:20px}.progress.vertical.xs,.progress.vertical.progress-xs{width:10px}.progress.vertical.xxs,.progress.vertical.progress-xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-green,.progress-bar-success{background-color:#00a65a}.progress-striped .progress-bar-green,.progress-striped .progress-bar-success{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-yellow,.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-yellow,.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-red,.progress-bar-danger{background-color:#dd4b39}.progress-striped .progress-bar-red,.progress-striped .progress-bar-danger{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,0.8);display:block;z-index:10;background:rgba(0,0,0,0.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}.small-box h3{font-size:38px;margin:0;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box .icon{position:absolute;top:-10px;right:18px;font-size:84px;color:rgba(0,0,0,0.15)}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#ffffff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:none}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:transparent}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,0.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de;background-color:#d2d6de}.box.box-solid.box-default>.box-header a,.box.box-solid.box-default>.box-header .btn{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc;background-color:#3c8dbc}.box.box-solid.box-primary>.box-header a,.box.box-solid.box-primary>.box-header .btn{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef;background-color:#00c0ef}.box.box-solid.box-info>.box-header a,.box.box-solid.box-info>.box-header .btn{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39;background-color:#dd4b39}.box.box-solid.box-danger>.box-header a,.box.box-solid.box-danger>.box-header .btn{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12;background-color:#f39c12}.box.box-solid.box-warning>.box-header a,.box.box-solid.box-warning>.box-header .btn{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a;background-color:#00a65a}.box.box-solid.box-success>.box-header a,.box.box-solid.box-success>.box-header .btn{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;-webkit-box-shadow:none;box-shadow:none}.box.box-solid[class*='bg']>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:0.3em}.box>.overlay,.overlay-wrapper>.overlay,.box>.loading-img,.overlay-wrapper>.loading-img{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,0.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,0.5)}.box-header:before,.box-body:before,.box-footer:before,.box-header:after,.box-body:after,.box-footer:after{content:" ";display:table}.box-header:after,.box-body:after,.box-footer:after{clear:both}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:none}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion,.box-header .box-title{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle="tooltip"]{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.box-header>.box-tools .dropdown-menu>li>a{color:#444!important}.btn-box-tool{padding:5px;font-size:12px;background:transparent;color:#97a0b3}.open .btn-box-tool,.btn-box-tool:hover{color:#606c84}.btn-box-tool.btn:active{-webkit-box-shadow:none;box-shadow:none}.box-body{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;padding:10px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:3px}.box-body .box-pane-right{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:0}.box-footer{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top:1px solid #f4f4f4;padding:10px;background-color:#fff}.chart-legend{margin:10px 0}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:before,.box-comments .box-comment:after{content:" ";display:table}.box-comments .box-comment:after{clear:both}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type='checkbox']{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#d2d6de !important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{display:inline-block;cursor:move;margin:0 5px}.chat{padding:0}.chat .item{padding:10px}.chat .item:before,.chat .item:after{content:" ";display:table}.chat .item:after{clear:both}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px 0;font-weight:600;font-size:14px}.chat .item>.attachment>p,.chat .item>.attachment>.filename{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:before,.chat .item>.attachment:after{content:" ";display:table}.chat .item>.attachment:after{clear:both}.chat .item.own{background-color:#eee}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,0.2);margin:5px -10px 5px -10px;height:2px}.info-box .progress,.info-box .progress .progress-bar{border-radius:0}.info-box .progress .progress-bar{background:#fff}.info-box-icon{border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px;display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,0.2)}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:bold;font-size:18px}.progress-description,.info-box-text{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-text{text-transform:uppercase}.info-box-more{display:block}.progress-description{margin:0}.timeline{position:relative;margin:0 0 30px 0;padding:0;list-style:none}.timeline:before{content:'';position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px}.timeline>li{position:relative;margin-right:10px;margin-bottom:15px}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative}.timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px}.timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1}.timeline>li>.timeline-item>.timeline-header>a{font-weight:600}.timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px}.timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#d2d6de;border-radius:50%;text-align:center;left:18px;top:0}.timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px}.timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none}.timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd}.btn{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent}.btn.uppercase{text-transform:uppercase}.btn.btn-flat{border-radius:0;-webkit-box-shadow:none;box-shadow:none;border-width:1px}.btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:focus{outline:none}.btn.btn-file{position:relative;overflow:hidden}.btn.btn-file>input[type='file']{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:none;background:white;cursor:inherit;display:block}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default:hover,.btn-default:active,.btn-default.hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary:hover,.btn-primary:active,.btn-primary.hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success:hover,.btn-success:active,.btn-success.hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info:hover,.btn-info:active,.btn-info.hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger:hover,.btn-danger:active,.btn-danger.hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning:hover,.btn-warning:active,.btn-warning.hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:transparent;color:#fff}.btn-outline:hover,.btn-outline:focus,.btn-outline:active{color:rgba(255,255,255,0.7);border-color:rgba(255,255,255,0.7)}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn[class*='bg-']:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,0.2);box-shadow:inset 0 0 100px rgba(0,0,0,0.2)}.btn-app{border-radius:3px;position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;text-align:center;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.callout{border-radius:3px;margin:0 0 20px 0;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff;text-decoration:underline}.callout a:hover{color:#eee}.callout h4{margin-top:0;font-weight:600}.callout p:last-child{margin-bottom:0}.callout code,.callout .highlight{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert{border-radius:3px}.alert h4{font-weight:600}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff;text-decoration:underline}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:hover,.nav>li>a:active,.nav>li>a:focus{color:#444;background:#f7f7f7}.nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{border-top-color:#3c8dbc}.nav-pills>li.active>a{font-weight:600}.nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:transparent;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px;text-transform:uppercase}.nav-tabs-custom{margin-bottom:20px;background:#fff;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li.disabled>a{color:#777}.nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0}.nav-tabs-custom>.nav-tabs>li>a.text-muted{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:transparent;margin:0}.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active>a,.nav-tabs-custom>.nav-tabs>li.active:hover>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none !important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:transparent;color:#999}.nav-tabs-custom.tab-primary>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom.tab-info>.nav-tabs>li.active{border-top-color:#00c0ef}.nav-tabs-custom.tab-danger>.nav-tabs>li.active{border-top-color:#dd4b39}.nav-tabs-custom.tab-warning>.nav-tabs>li.active{border-top-color:#f39c12}.nav-tabs-custom.tab-success>.nav-tabs>li.active{border-top-color:#00a65a}.nav-tabs-custom.tab-default>.nav-tabs>li.active{border-top-color:#d2d6de}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0 !important}.products-list{list-style:none;margin:0;padding:0}.products-list>.item{border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);padding:10px 0;background:#fff}.products-list>.item:before,.products-list>.item:after{content:" ";display:table}.products-list>.item:after{clear:both}.products-list .product-img{float:left}.products-list .product-img img{width:50px;height:50px}.products-list .product-info{margin-left:60px}.products-list .product-title{font-weight:600}.products-list .product-description{display:block;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.product-list-in-box>.item{-webkit-box-shadow:none;box-shadow:none;border-radius:0;border-bottom:1px solid #f4f4f4}.product-list-in-box>.item:last-of-type{border-bottom-width:0}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}table.text-center,table.text-center td,table.text-center th{text-align:center}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0}.direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-messages{-webkit-transform:translate(0, 0);transform:translate(0, 0);padding:10px;height:250px;overflow:auto}.direct-chat-msg,.direct-chat-text{display:block}.direct-chat-msg{margin-bottom:10px}.direct-chat-msg:before,.direct-chat-msg:after{content:" ";display:table}.direct-chat-msg:after{clear:both}.direct-chat-messages,.direct-chat-contacts{-webkit-transition:-webkit-transform .5s ease-in-out;transition:-webkit-transform .5s ease-in-out;transition:transform .5s ease-in-out;transition:transform .5s ease-in-out, -webkit-transform .5s ease-in-out}.direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#d2d6de;border:1px solid #d2d6de;margin:5px 0 0 50px;color:#444}.direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#d2d6de;content:' ';height:0;width:0;pointer-events:none}.direct-chat-text:after{border-width:5px;margin-top:-5px}.direct-chat-text:before{border-width:6px;margin-top:-6px}.right .direct-chat-text{margin-right:50px;margin-left:0}.right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#d2d6de}.direct-chat-img{border-radius:50%;float:left;width:40px;height:40px}.right .direct-chat-img{float:right}.direct-chat-info{display:block;margin-bottom:2px;font-size:12px}.direct-chat-name{font-weight:600}.direct-chat-timestamp{color:#999}.direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-contacts{-webkit-transform:translate(101%, 0);transform:translate(101%, 0);position:absolute;top:0;bottom:0;height:250px;width:100%;background:#222d32;color:#fff;overflow:auto}.contacts-list>li{border-bottom:1px solid rgba(0,0,0,0.2);padding:10px;margin:0}.contacts-list>li:before,.contacts-list>li:after{content:" ";display:table}.contacts-list>li:after{clear:both}.contacts-list>li:last-of-type{border-bottom:none}.contacts-list-img{border-radius:50%;width:40px;float:left}.contacts-list-info{margin-left:45px;color:#fff}.contacts-list-name,.contacts-list-status{display:block}.contacts-list-name{font-weight:600}.contacts-list-status{font-size:12px}.contacts-list-date{color:#aaa;font-weight:normal}.contacts-list-msg{color:#999}.direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff}.direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39}.direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff}.direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc}.direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff}.direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12}.direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff}.direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef}.direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff}.direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a}.users-list>li{width:25%;float:left;padding:10px;text-align:center}.users-list>li img{border-radius:50%;max-width:100%;height:auto}.users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999}.users-list-name,.users-list-date{display:block}.users-list-name{font-weight:600;color:#444;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.users-list-date{color:#999;font-size:12px}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.modal{background:rgba(0,0,0,0.3)}.modal-content{border-radius:0;-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125);border:0}@media (min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-header,.modal-primary .modal-footer{border-color:#307095}.modal-warning .modal-header,.modal-warning .modal-footer{border-color:#c87f0a}.modal-info .modal-header,.modal-info .modal-footer{border-color:#0097bc}.modal-success .modal-header,.modal-success .modal-footer{border-color:#00733e}.modal-danger .modal-header,.modal-danger .modal-footer{border-color:#c23321}.box-widget{border:none;position:relative}.widget-user .widget-user-header{padding:20px;height:120px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user .widget-user-username{margin-top:0;margin-bottom:5px;font-size:25px;font-weight:300;text-shadow:0 1px 1px rgba(0,0,0,0.2)}.widget-user .widget-user-desc{margin-top:0}.widget-user .widget-user-image{position:absolute;top:65px;left:50%;margin-left:-45px}.widget-user .widget-user-image>img{width:90px;height:auto;border:3px solid #fff}.widget-user .box-footer{padding-top:30px}.widget-user-2 .widget-user-header{padding:20px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user-2 .widget-user-username{margin-top:5px;margin-bottom:5px;font-size:25px;font-weight:300}.widget-user-2 .widget-user-desc{margin-top:0}.widget-user-2 .widget-user-username,.widget-user-2 .widget-user-desc{margin-left:75px}.widget-user-2 .widget-user-image>img{width:65px;height:auto;float:left}.treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px}.treeview-menu .treeview-menu{padding-left:20px}.treeview-menu>li{margin:0}.treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.treeview-menu>li>a>.fa,.treeview-menu>li>a>.glyphicon,.treeview-menu>li>a>.ion{width:20px}.treeview-menu>li>a>.pull-right-container>.fa-angle-left,.treeview-menu>li>a>.pull-right-container>.fa-angle-down,.treeview-menu>li>a>.fa-angle-left,.treeview-menu>li>a>.fa-angle-down{width:auto}.mailbox-messages>.table{margin:0}.mailbox-controls{padding:5px}.mailbox-controls.with-border{border-bottom:1px solid #f4f4f4}.mailbox-read-info{border-bottom:1px solid #f4f4f4;padding:10px}.mailbox-read-info h3{font-size:20px;margin:0}.mailbox-read-info h5{margin:0;padding:5px 0 0 0}.mailbox-read-time{color:#999;font-size:13px}.mailbox-read-message{padding:10px}.mailbox-attachments li{float:left;width:200px;border:1px solid #eee;margin-bottom:10px;margin-right:10px}.mailbox-attachment-name{font-weight:bold;color:#666}.mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block}.mailbox-attachment-info{padding:10px;background:#f4f4f4}.mailbox-attachment-size{color:#999;font-size:12px}.mailbox-attachment-icon{text-align:center;font-size:65px;color:#666;padding:20px 10px}.mailbox-attachment-icon.has-img{padding:0}.mailbox-attachment-icon.has-img>img{max-width:100%;height:auto}.lockscreen{background:#d2d6de}.lockscreen-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.lockscreen-logo a{color:#444}.lockscreen-wrapper{max-width:400px;margin:0 auto;margin-top:10%}.lockscreen .lockscreen-name{text-align:center;font-weight:600}.lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px auto;width:290px}.lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10}.lockscreen-image>img{border-radius:50%;width:70px;height:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:10px}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}.login-box,.register-box{width:360px;margin:7% auto}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0 auto}@media (max-width:991px){.error-page{width:100%}}.error-page>.headline{float:left;font-size:100px;font-weight:300}@media (max-width:991px){.error-page>.headline{float:none;text-align:center}}.error-page>.error-content{margin-left:190px;display:block}@media (max-width:991px){.error-page>.error-content{margin-left:0}}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media (max-width:991px){.error-page>.error-content>h3{text-align:center}}.invoice{position:relative;background:#fff;border:1px solid #f4f4f4;padding:20px;margin:10px 25px}.invoice-title{margin-top:0}.profile-user-img{margin:0 auto;width:100px;padding:3px;border:3px solid #d2d6de}.profile-username{font-size:21px;margin-top:5px}.post{border-bottom:1px solid #d2d6de;margin-bottom:15px;padding-bottom:15px;color:#666}.post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.post .user-block{margin-bottom:15px}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon>:first-child{border:none;text-align:center;width:100%}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:focus,.btn-adn.focus{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:hover{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:focus,.btn-bitbucket.focus{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:focus,.btn-dropbox.focus{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:focus,.btn-facebook.focus{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:focus,.btn-flickr.focus{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:focus,.btn-foursquare.focus{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:focus,.btn-github.focus{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:hover{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github .badge{color:#444;background-color:#fff}.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google:focus,.btn-google.focus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:hover{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{background-image:none}.btn-google .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:focus,.btn-instagram.focus{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:focus,.btn-linkedin.focus{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:focus,.btn-microsoft.focus{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:focus,.btn-openid.focus{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:hover{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:focus,.btn-pinterest.focus{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:focus,.btn-reddit.focus{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:focus,.btn-soundcloud.focus{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:focus,.btn-tumblr.focus{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:focus,.btn-twitter.focus{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:focus,.btn-vimeo.focus{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:focus,.btn-vk.focus{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:hover{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:focus,.btn-yahoo.focus{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button:hover,.fc-button:active,.fc-button.hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-header:first-of-type,.fc-widget-content:first-of-type{border-left:0;border-right:0}.fc-widget-header:last-of-type,.fc-widget-content:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform linear .3s;transition:-webkit-transform linear .3s;transition:transform linear .3s;transition:transform linear .3s, -webkit-transform linear .3s}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all linear .3s;transition:all linear .3s}.external-event{padding:5px 10px;font-weight:bold;margin-bottom:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);text-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;cursor:move}.external-event:hover{-webkit-box-shadow:inset 0 0 90px rgba(0,0,0,0.2);box-shadow:inset 0 0 90px rgba(0,0,0,0.2)}.select2-container--default.select2-container--focus,.select2-selection.select2-container--focus,.select2-container--default:focus,.select2-selection:focus,.select2-container--default:active,.select2-selection:active{outline:none}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:white}.select2-results__option{padding:6px 12px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:none}.select2-container--default.select2-container--focus .select2-selection--multiple,.select2-container--default .select2-search--dropdown .select2-search__field{border-color:#3c8dbc !important}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,0.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}.box .datepicker-inline,.box .datepicker-inline .datepicker-days,.box .datepicker-inline>table,.box .datepicker-inline .datepicker-days>table{width:100%}.box .datepicker-inline td:hover,.box .datepicker-inline .datepicker-days td:hover,.box .datepicker-inline>table td:hover,.box .datepicker-inline .datepicker-days>table td:hover{background-color:rgba(255,255,255,0.3)}.box .datepicker-inline td.day.old,.box .datepicker-inline .datepicker-days td.day.old,.box .datepicker-inline>table td.day.old,.box .datepicker-inline .datepicker-days>table td.day.old,.box .datepicker-inline td.day.new,.box .datepicker-inline .datepicker-days td.day.new,.box .datepicker-inline>table td.day.new,.box .datepicker-inline .datepicker-days>table td.day.new{color:#777}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.description-block>.description-text{text-transform:uppercase}.bg-red,.bg-yellow,.bg-aqua,.bg-blue,.bg-light-blue,.bg-green,.bg-navy,.bg-teal,.bg-olive,.bg-lime,.bg-orange,.bg-fuchsia,.bg-purple,.bg-maroon,.bg-black,.bg-red-active,.bg-yellow-active,.bg-aqua-active,.bg-blue-active,.bg-light-blue-active,.bg-green-active,.bg-navy-active,.bg-teal-active,.bg-olive-active,.bg-lime-active,.bg-orange-active,.bg-fuchsia-active,.bg-purple-active,.bg-maroon-active,.bg-black-active,.callout.callout-danger,.callout.callout-warning,.callout.callout-info,.callout.callout-success,.alert-success,.alert-danger,.alert-error,.alert-warning,.alert-info,.label-danger,.label-info,.label-warning,.label-primary,.label-success,.modal-primary .modal-body,.modal-primary .modal-header,.modal-primary .modal-footer,.modal-warning .modal-body,.modal-warning .modal-header,.modal-warning .modal-footer,.modal-info .modal-body,.modal-info .modal-header,.modal-info .modal-footer,.modal-success .modal-body,.modal-success .modal-header,.modal-success .modal-footer,.modal-danger .modal-body,.modal-danger .modal-header,.modal-danger .modal-footer{color:#fff !important}.bg-gray{color:#000;background-color:#d2d6de !important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111 !important}.bg-red,.callout.callout-danger,.alert-danger,.alert-error,.label-danger,.modal-danger .modal-body{background-color:#dd4b39 !important}.bg-yellow,.callout.callout-warning,.alert-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12 !important}.bg-aqua,.callout.callout-info,.alert-info,.label-info,.modal-info .modal-body{background-color:#00c0ef !important}.bg-blue{background-color:#0073b7 !important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc !important}.bg-green,.callout.callout-success,.alert-success,.label-success,.modal-success .modal-body{background-color:#00a65a !important}.bg-navy{background-color:#001f3f !important}.bg-teal{background-color:#39cccc !important}.bg-olive{background-color:#3d9970 !important}.bg-lime{background-color:#01ff70 !important}.bg-orange{background-color:#ff851b !important}.bg-fuchsia{background-color:#f012be !important}.bg-purple{background-color:#605ca8 !important}.bg-maroon{background-color:#d81b60 !important}.bg-gray-active{color:#000;background-color:#b5bbc8 !important}.bg-black-active{background-color:#000 !important}.bg-red-active,.modal-danger .modal-header,.modal-danger .modal-footer{background-color:#d33724 !important}.bg-yellow-active,.modal-warning .modal-header,.modal-warning .modal-footer{background-color:#db8b0b !important}.bg-aqua-active,.modal-info .modal-header,.modal-info .modal-footer{background-color:#00a7d0 !important}.bg-blue-active{background-color:#005384 !important}.bg-light-blue-active,.modal-primary .modal-header,.modal-primary .modal-footer{background-color:#357ca5 !important}.bg-green-active,.modal-success .modal-header,.modal-success .modal-footer{background-color:#008d4c !important}.bg-navy-active{background-color:#001a35 !important}.bg-teal-active{background-color:#30bbbb !important}.bg-olive-active{background-color:#368763 !important}.bg-lime-active{background-color:#00e765 !important}.bg-orange-active{background-color:#ff7701 !important}.bg-fuchsia-active{background-color:#db0ead !important}.bg-purple-active{background-color:#555299 !important}.bg-maroon-active{background-color:#ca195a !important}[class^="bg-"].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39 !important}.text-yellow{color:#f39c12 !important}.text-aqua{color:#00c0ef !important}.text-blue{color:#0073b7 !important}.text-black{color:#111 !important}.text-light-blue{color:#3c8dbc !important}.text-green{color:#00a65a !important}.text-gray{color:#d2d6de !important}.text-navy{color:#001f3f !important}.text-teal{color:#39cccc !important}.text-olive{color:#3d9970 !important}.text-lime{color:#01ff70 !important}.text-orange{color:#ff851b !important}.text-fuchsia{color:#f012be !important}.text-purple{color:#605ca8 !important}.text-maroon{color:#d81b60 !important}.link-muted{color:#7a869d}.link-muted:hover,.link-muted:focus{color:#606c84}.link-black{color:#666}.link-black:hover,.link-black:focus{color:#999}.hide{display:none !important}.no-border{border:0 !important}.no-padding{padding:0 !important}.no-margin{margin:0 !important}.no-shadow{-webkit-box-shadow:none !important;box-shadow:none !important}.list-unstyled,.chart-legend,.contacts-list,.users-list,.mailbox-attachments{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.flat{border-radius:0 !important}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-sm{font-size:12px}.jqstooltip{padding:5px !important;width:auto !important;height:auto !important}.bg-teal-gradient{background:#39cccc !important;background:-o-linear-gradient(#7adddd, #39cccc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc !important;background:-o-linear-gradient(#67a8ce, #3c8dbc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;color:#fff}.bg-blue-gradient{background:#0073b7 !important;background:-o-linear-gradient(#0089db, #0073b7) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;color:#fff}.bg-aqua-gradient{background:#00c0ef !important;background:-o-linear-gradient(#14d1ff, #00c0ef) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;color:#fff}.bg-yellow-gradient{background:#f39c12 !important;background:-o-linear-gradient(#f7bc60, #f39c12) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;color:#fff}.bg-purple-gradient{background:#605ca8 !important;background:-o-linear-gradient(#9491c4, #605ca8) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;color:#fff}.bg-green-gradient{background:#00a65a !important;background:-o-linear-gradient(#00ca6d, #00a65a) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;color:#fff}.bg-red-gradient{background:#dd4b39 !important;background:-o-linear-gradient(#e47365, #dd4b39) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;color:#fff}.bg-black-gradient{background:#111 !important;background:-o-linear-gradient(#2b2b2b, #111) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important;color:#fff}.bg-maroon-gradient{background:#d81b60 !important;background:-o-linear-gradient(#e73f7c, #d81b60) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static !important}.list-header{font-size:15px;padding:10px 4px;font-weight:bold;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px 0}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:before,.user-block:after{content:" ";display:table}.user-block:after{clear:both}.user-block img{width:40px;height:40px;float:left}.user-block .username,.user-block .description,.user-block .comment{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .username,.user-block.user-block-sm .description,.user-block.user-block-sm .comment{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.img-sm,.img-md,.img-lg,.box-comments .box-comment img,.user-block.user-block-sm img{float:left}.img-sm,.box-comments .box-comment img,.user-block.user-block-sm img{width:30px !important;height:30px !important}.img-sm+.img-push{margin-left:40px}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.img-lg{width:100px;height:100px}.img-lg+.img-push{margin-left:110px}.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart svg,.chart canvas{width:100% !important}@media print{.no-print,.main-sidebar,.left-side,.main-header,.content-header{display:none !important}.content-wrapper,.right-side,.main-footer{margin-left:0 !important;min-height:0 !important;-webkit-transform:translate(0, 0) !important;transform:translate(0, 0) !important}.fixed .content-wrapper,.fixed .right-side{padding-top:0 !important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr th,.table-responsive>.table tr td{white-space:normal !important}}.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a,.skin-blue .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-blue .sidebar-menu>li.active>a{border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-blue .sidebar-menu .treeview-menu>li.active>a,.skin-blue .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{-webkit-box-shadow:none;box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}
+ * License: Open source - MIT
+ * Please visit http://opensource.org/licenses/MIT for more information
+ */html,body{height:100%}.layout-boxed html,.layout-boxed body{height:100%}body{font-family:'Source Sans Pro','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{height:100%;position:relative;overflow-x:hidden;overflow-y:auto}.wrapper:before,.wrapper:after{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;-webkit-box-shadow:0 0 8px rgba(0,0,0,0.5);box-shadow:0 0 8px rgba(0,0,0,0.5);position:relative}.layout-boxed{background:url(/images/boxed-bg.jpg?5bbbd344130f0926b70aa3499638a387) repeat fixed}.content-wrapper,.main-footer{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-webkit-transition:margin .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:margin .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out,-webkit-transform .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .main-footer{margin-left:0}@media (max-width:767px){.content-wrapper,.main-footer{margin-left:0}}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .main-footer{margin-left:0}}@media (max-width:767px){.sidebar-open .content-wrapper,.sidebar-open .main-footer{-webkit-transform:translate(230px, 0);transform:translate(230px, 0)}}.content-wrapper{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .main-header,.fixed .main-sidebar,.fixed .left-side{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}.fixed .wrapper{overflow:hidden}.hold-transition .content-wrapper,.hold-transition .right-side,.hold-transition .main-footer,.hold-transition .main-sidebar,.hold-transition .left-side,.hold-transition .main-header .navbar,.hold-transition .main-header .logo,.hold-transition .menu-open .fa-angle-left{-webkit-transition:none;transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:'Source Sans Pro',sans-serif}a{color:#3c8dbc}a:hover,a:active,a:focus{outline:none;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px 0;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header .navbar{-webkit-transition:margin-left .3s ease-in-out;transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0}.layout-top-nav .main-header .navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:rgba(255,255,255,0.2);border-color:transparent}.main-header #navbar-search-input.form-control:focus,.main-header #navbar-search-input.form-control:active{border-color:rgba(0,0,0,0.1);background:rgba(255,255,255,0.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:transparent}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px 15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\F0C9"}.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle:focus,.main-header .sidebar-toggle:active{background:transparent}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{-webkit-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.main-header .navbar-brand{color:#fff}.content-header{position:relative;padding:15px 15px 0 15px}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:transparent;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:'>\A0'}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px 15px}@media (max-width:991px){.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none !important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}}.main-sidebar{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-webkit-transition:width .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:width .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out,-webkit-transform .3s ease-in-out}@media (max-width:767px){.main-sidebar{padding-top:100px}}@media (max-width:767px){.main-sidebar{-webkit-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (min-width:768px){.sidebar-collapse .main-sidebar{-webkit-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (max-width:767px){.sidebar-open .main-sidebar{-webkit-transform:translate(0, 0);transform:translate(0, 0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:before,.user-panel:after{content:" ";display:table}.user-panel:after{clear:both}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .label,.sidebar-menu>li .badge{margin-right:5px}.sidebar-menu>li .badge{margin-top:3px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left,.sidebar-menu li>a>.pull-right-container>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;-webkit-transition:transform .5s ease;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease, -webkit-transform .5s ease}.sidebar-menu li>a>.fa-angle-left{position:absolute;top:50%;right:10px;margin-top:-8px}.sidebar-menu .menu-open>a>.fa-angle-left,.sidebar-menu .menu-open>a>.pull-right-container>.fa-angle-left{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu .active>.treeview-menu{display:block}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .right-side,.sidebar-mini.sidebar-collapse .main-footer{margin-left:50px !important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0, 0);transform:translate(0, 0);width:50px !important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu li.header{display:none !important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right),.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{display:block !important;position:absolute;width:180px;left:50px}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container{position:relative !important;float:right;width:auto !important;left:180px !important;top:-22px !important;z-index:900}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container>.label:not(:first-of-type){display:none}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-expanded-on-hover .main-footer,.sidebar-expanded-on-hover .content-wrapper{margin-left:50px}.sidebar-expanded-on-hover .main-sidebar{-webkit-box-shadow:3px 0 8px rgba(0,0,0,0.125);box-shadow:3px 0 8px rgba(0,0,0,0.125)}.sidebar-menu,.main-sidebar .user-panel,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right-container{position:absolute;right:10px;top:50%;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar-bg,.control-sidebar{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media (max-width:768px){.control-sidebar{padding-top:100px}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}.control-sidebar-open .control-sidebar-bg,.control-sidebar-open .control-sidebar{right:0}@media (min-width:768px){.control-sidebar-open .content-wrapper,.control-sidebar-open .right-side,.control-sidebar-open .main-footer{margin-right:230px}}.fixed .control-sidebar{position:fixed;height:100%;overflow-y:auto;padding-bottom:50px}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a{border-radius:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:hover,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:active{border-top:none;border-right:none;border-bottom:none}@media (max-width:768px){.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:before,.control-sidebar-menu>li>a:after{content:" ";display:table}.control-sidebar-menu>li>a:after{clear:both}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-menu .progress{margin:0}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading{color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{-webkit-box-shadow:none;box-shadow:none;border-color:#eee}.dropdown-menu>li>a{color:#777}.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0 0 0 0;margin:0;top:100%}.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#ffffff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444444;font-size:14px}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eeeeee;color:#444 !important;text-align:center}@media (max-width:991px){.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff !important;color:#444 !important}}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:normal}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444444;overflow:hidden;text-overflow:ellipsis;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px 10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{content:" ";display:table}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{clear:both}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px 0;color:#666666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid;border-color:transparent;border-color:rgba(255,255,255,0.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,0.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #dddddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444 !important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff !important;color:#444 !important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666666}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg);transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.form-control{border-radius:0;-webkit-box-shadow:none;box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;-webkit-box-shadow:none;box-shadow:none}.form-control::-moz-placeholder,.form-control:-ms-input-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control,.form-group.has-success .input-group-addon{border-color:#00a65a;-webkit-box-shadow:none;box-shadow:none}.form-group.has-success .help-block{color:#00a65a}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control,.form-group.has-warning .input-group-addon{border-color:#f39c12;-webkit-box-shadow:none;box-shadow:none}.form-group.has-warning .help-block{color:#f39c12}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control,.form-group.has-error .input-group-addon{border-color:#dd4b39;-webkit-box-shadow:none;box-shadow:none}.form-group.has-error .help-block{color:#dd4b39}.input-group .input-group-addon{border-radius:0;border-color:#d2d6de;background-color:#fff}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.input-lg+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.form-group-lg .form-control+.form-control-feedback.fa{line-height:46px}.input-sm+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.form-group-sm .form-control+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress,.progress>.progress-bar,.progress .progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.progress.sm,.progress-sm{height:10px}.progress.sm,.progress-sm,.progress.sm .progress-bar,.progress-sm .progress-bar{border-radius:1px}.progress.xs,.progress-xs{height:7px}.progress.xs,.progress-xs,.progress.xs .progress-bar,.progress-xs .progress-bar{border-radius:1px}.progress.xxs,.progress-xxs{height:3px}.progress.xxs,.progress-xxs,.progress.xxs .progress-bar,.progress-xxs .progress-bar{border-radius:1px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.sm,.progress.vertical.progress-sm{width:20px}.progress.vertical.xs,.progress.vertical.progress-xs{width:10px}.progress.vertical.xxs,.progress.vertical.progress-xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-green,.progress-bar-success{background-color:#00a65a}.progress-striped .progress-bar-green,.progress-striped .progress-bar-success{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-yellow,.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-yellow,.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-red,.progress-bar-danger{background-color:#dd4b39}.progress-striped .progress-bar-red,.progress-striped .progress-bar-danger{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,0.8);display:block;z-index:10;background:rgba(0,0,0,0.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}.small-box h3{font-size:38px;font-weight:bold;margin:0 0 10px 0;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5}.small-box .icon{-webkit-transition:all .3s linear;transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,0.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#ffffff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:none}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:transparent}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,0.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de;background-color:#d2d6de}.box.box-solid.box-default>.box-header a,.box.box-solid.box-default>.box-header .btn{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc;background-color:#3c8dbc}.box.box-solid.box-primary>.box-header a,.box.box-solid.box-primary>.box-header .btn{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef;background-color:#00c0ef}.box.box-solid.box-info>.box-header a,.box.box-solid.box-info>.box-header .btn{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39;background-color:#dd4b39}.box.box-solid.box-danger>.box-header a,.box.box-solid.box-danger>.box-header .btn{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12;background-color:#f39c12}.box.box-solid.box-warning>.box-header a,.box.box-solid.box-warning>.box-header .btn{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a;background-color:#00a65a}.box.box-solid.box-success>.box-header a,.box.box-solid.box-success>.box-header .btn{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;-webkit-box-shadow:none;box-shadow:none}.box.box-solid[class*='bg']>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:0.3em}.box>.overlay,.overlay-wrapper>.overlay,.box>.loading-img,.overlay-wrapper>.loading-img{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,0.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,0.5)}.box-header:before,.box-body:before,.box-footer:before,.box-header:after,.box-body:after,.box-footer:after{content:" ";display:table}.box-header:after,.box-body:after,.box-footer:after{clear:both}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:none}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion,.box-header .box-title{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle="tooltip"]{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.box-header>.box-tools .dropdown-menu>li>a{color:#444!important}.btn-box-tool{padding:5px;font-size:12px;background:transparent;color:#97a0b3}.open .btn-box-tool,.btn-box-tool:hover{color:#606c84}.btn-box-tool.btn:active{-webkit-box-shadow:none;box-shadow:none}.box-body{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;padding:10px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:3px}.box-body .box-pane-right{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:0}.box-footer{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top:1px solid #f4f4f4;padding:10px;background-color:#fff}.chart-legend{margin:10px 0}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:before,.box-comments .box-comment:after{content:" ";display:table}.box-comments .box-comment:after{clear:both}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type='checkbox']{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#d2d6de !important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{display:inline-block;cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:before,.chat .item:after{content:" ";display:table}.chat .item:after{clear:both}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px 0;font-weight:600;font-size:14px}.chat .item>.attachment>p,.chat .item>.attachment>.filename{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:before,.chat .item>.attachment:after{content:" ";display:table}.chat .item>.attachment:after{clear:both}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,0.2);margin:5px -10px 5px -10px;height:2px}.info-box .progress,.info-box .progress .progress-bar{border-radius:0}.info-box .progress .progress-bar{background:#fff}.info-box-icon{border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px;display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,0.2)}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:bold;font-size:18px}.progress-description,.info-box-text{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-text{text-transform:uppercase}.info-box-more{display:block}.progress-description{margin:0}.timeline{position:relative;margin:0 0 30px 0;padding:0;list-style:none}.timeline:before{content:'';position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px}.timeline>li{position:relative;margin-right:10px;margin-bottom:15px}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative}.timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px}.timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1}.timeline>li>.timeline-item>.timeline-header>a{font-weight:600}.timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px}.timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#d2d6de;border-radius:50%;text-align:center;left:18px;top:0}.timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px}.timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none}.timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd}.btn{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent}.btn.uppercase{text-transform:uppercase}.btn.btn-flat{border-radius:0;-webkit-box-shadow:none;box-shadow:none;border-width:1px}.btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:focus{outline:none}.btn.btn-file{position:relative;overflow:hidden}.btn.btn-file>input[type='file']{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:none;background:white;cursor:inherit;display:block}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default:hover,.btn-default:active,.btn-default.hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary:hover,.btn-primary:active,.btn-primary.hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success:hover,.btn-success:active,.btn-success.hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info:hover,.btn-info:active,.btn-info.hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger:hover,.btn-danger:active,.btn-danger.hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning:hover,.btn-warning:active,.btn-warning.hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:transparent;color:#fff}.btn-outline:hover,.btn-outline:focus,.btn-outline:active{color:rgba(255,255,255,0.7);border-color:rgba(255,255,255,0.7)}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn[class*='bg-']:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,0.2);box-shadow:inset 0 0 100px rgba(0,0,0,0.2)}.btn-app{border-radius:3px;position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;text-align:center;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.callout{border-radius:3px;margin:0 0 20px 0;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff;text-decoration:underline}.callout a:hover{color:#eee}.callout h4{margin-top:0;font-weight:600}.callout p:last-child{margin-bottom:0}.callout code,.callout .highlight{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert{border-radius:3px}.alert h4{font-weight:600}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff;text-decoration:underline}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:hover,.nav>li>a:active,.nav>li>a:focus{color:#444;background:#f7f7f7}.nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{border-top-color:#3c8dbc}.nav-pills>li.active>a{font-weight:600}.nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:transparent;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px;text-transform:uppercase}.nav-tabs-custom{margin-bottom:20px;background:#fff;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li.disabled>a{color:#777}.nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0}.nav-tabs-custom>.nav-tabs>li>a.text-muted{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:transparent;margin:0}.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active>a,.nav-tabs-custom>.nav-tabs>li.active:hover>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none !important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:transparent;color:#999}.nav-tabs-custom.tab-primary>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom.tab-info>.nav-tabs>li.active{border-top-color:#00c0ef}.nav-tabs-custom.tab-danger>.nav-tabs>li.active{border-top-color:#dd4b39}.nav-tabs-custom.tab-warning>.nav-tabs>li.active{border-top-color:#f39c12}.nav-tabs-custom.tab-success>.nav-tabs>li.active{border-top-color:#00a65a}.nav-tabs-custom.tab-default>.nav-tabs>li.active{border-top-color:#d2d6de}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0 !important}.products-list{list-style:none;margin:0;padding:0}.products-list>.item{border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);padding:10px 0;background:#fff}.products-list>.item:before,.products-list>.item:after{content:" ";display:table}.products-list>.item:after{clear:both}.products-list .product-img{float:left}.products-list .product-img img{width:50px;height:50px}.products-list .product-info{margin-left:60px}.products-list .product-title{font-weight:600}.products-list .product-description{display:block;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.product-list-in-box>.item{-webkit-box-shadow:none;box-shadow:none;border-radius:0;border-bottom:1px solid #f4f4f4}.product-list-in-box>.item:last-of-type{border-bottom-width:0}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}table.text-center,table.text-center td,table.text-center th{text-align:center}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0}.direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-messages{-webkit-transform:translate(0, 0);transform:translate(0, 0);padding:10px;height:250px;overflow:auto}.direct-chat-msg,.direct-chat-text{display:block}.direct-chat-msg{margin-bottom:10px}.direct-chat-msg:before,.direct-chat-msg:after{content:" ";display:table}.direct-chat-msg:after{clear:both}.direct-chat-messages,.direct-chat-contacts{-webkit-transition:-webkit-transform .5s ease-in-out;transition:-webkit-transform .5s ease-in-out;transition:transform .5s ease-in-out;transition:transform .5s ease-in-out, -webkit-transform .5s ease-in-out}.direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#d2d6de;border:1px solid #d2d6de;margin:5px 0 0 50px;color:#444}.direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#d2d6de;content:' ';height:0;width:0;pointer-events:none}.direct-chat-text:after{border-width:5px;margin-top:-5px}.direct-chat-text:before{border-width:6px;margin-top:-6px}.right .direct-chat-text{margin-right:50px;margin-left:0}.right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#d2d6de}.direct-chat-img{border-radius:50%;float:left;width:40px;height:40px}.right .direct-chat-img{float:right}.direct-chat-info{display:block;margin-bottom:2px;font-size:12px}.direct-chat-name{font-weight:600}.direct-chat-timestamp{color:#999}.direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-contacts{-webkit-transform:translate(101%, 0);transform:translate(101%, 0);position:absolute;top:0;bottom:0;height:250px;width:100%;background:#222d32;color:#fff;overflow:auto}.contacts-list>li{border-bottom:1px solid rgba(0,0,0,0.2);padding:10px;margin:0}.contacts-list>li:before,.contacts-list>li:after{content:" ";display:table}.contacts-list>li:after{clear:both}.contacts-list>li:last-of-type{border-bottom:none}.contacts-list-img{border-radius:50%;width:40px;float:left}.contacts-list-info{margin-left:45px;color:#fff}.contacts-list-name,.contacts-list-status{display:block}.contacts-list-name{font-weight:600}.contacts-list-status{font-size:12px}.contacts-list-date{color:#aaa;font-weight:normal}.contacts-list-msg{color:#999}.direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff}.direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39}.direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff}.direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc}.direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff}.direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12}.direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff}.direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef}.direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff}.direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a}.users-list>li{width:25%;float:left;padding:10px;text-align:center}.users-list>li img{border-radius:50%;max-width:100%;height:auto}.users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999}.users-list-name,.users-list-date{display:block}.users-list-name{font-weight:600;color:#444;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.users-list-date{color:#999;font-size:12px}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.modal{background:rgba(0,0,0,0.3)}.modal-content{border-radius:0;-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125);border:0}@media (min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-header,.modal-primary .modal-footer{border-color:#307095}.modal-warning .modal-header,.modal-warning .modal-footer{border-color:#c87f0a}.modal-info .modal-header,.modal-info .modal-footer{border-color:#0097bc}.modal-success .modal-header,.modal-success .modal-footer{border-color:#00733e}.modal-danger .modal-header,.modal-danger .modal-footer{border-color:#c23321}.box-widget{border:none;position:relative}.widget-user .widget-user-header{padding:20px;height:120px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user .widget-user-username{margin-top:0;margin-bottom:5px;font-size:25px;font-weight:300;text-shadow:0 1px 1px rgba(0,0,0,0.2)}.widget-user .widget-user-desc{margin-top:0}.widget-user .widget-user-image{position:absolute;top:65px;left:50%;margin-left:-45px}.widget-user .widget-user-image>img{width:90px;height:auto;border:3px solid #fff}.widget-user .box-footer{padding-top:30px}.widget-user-2 .widget-user-header{padding:20px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user-2 .widget-user-username{margin-top:5px;margin-bottom:5px;font-size:25px;font-weight:300}.widget-user-2 .widget-user-desc{margin-top:0}.widget-user-2 .widget-user-username,.widget-user-2 .widget-user-desc{margin-left:75px}.widget-user-2 .widget-user-image>img{width:65px;height:auto;float:left}.treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px}.treeview-menu .treeview-menu{padding-left:20px}.treeview-menu>li{margin:0}.treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.treeview-menu>li>a>.fa,.treeview-menu>li>a>.glyphicon,.treeview-menu>li>a>.ion{width:20px}.treeview-menu>li>a>.pull-right-container>.fa-angle-left,.treeview-menu>li>a>.pull-right-container>.fa-angle-down,.treeview-menu>li>a>.fa-angle-left,.treeview-menu>li>a>.fa-angle-down{width:auto}.mailbox-messages>.table{margin:0}.mailbox-controls{padding:5px}.mailbox-controls.with-border{border-bottom:1px solid #f4f4f4}.mailbox-read-info{border-bottom:1px solid #f4f4f4;padding:10px}.mailbox-read-info h3{font-size:20px;margin:0}.mailbox-read-info h5{margin:0;padding:5px 0 0 0}.mailbox-read-time{color:#999;font-size:13px}.mailbox-read-message{padding:10px}.mailbox-attachments li{float:left;width:200px;border:1px solid #eee;margin-bottom:10px;margin-right:10px}.mailbox-attachment-name{font-weight:bold;color:#666}.mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block}.mailbox-attachment-info{padding:10px;background:#f4f4f4}.mailbox-attachment-size{color:#999;font-size:12px}.mailbox-attachment-icon{text-align:center;font-size:65px;color:#666;padding:20px 10px}.mailbox-attachment-icon.has-img{padding:0}.mailbox-attachment-icon.has-img>img{max-width:100%;height:auto}.lockscreen{background:#d2d6de}.lockscreen-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.lockscreen-logo a{color:#444}.lockscreen-wrapper{max-width:400px;margin:0 auto;margin-top:10%}.lockscreen .lockscreen-name{text-align:center;font-weight:600}.lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px auto;width:290px}.lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10}.lockscreen-image>img{border-radius:50%;width:70px;height:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:10px}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}.login-box,.register-box{width:360px;margin:7% auto}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0 auto}@media (max-width:991px){.error-page{width:100%}}.error-page>.headline{float:left;font-size:100px;font-weight:300}@media (max-width:991px){.error-page>.headline{float:none;text-align:center}}.error-page>.error-content{margin-left:190px;display:block}@media (max-width:991px){.error-page>.error-content{margin-left:0}}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media (max-width:991px){.error-page>.error-content>h3{text-align:center}}.invoice{position:relative;background:#fff;border:1px solid #f4f4f4;padding:20px;margin:10px 25px}.invoice-title{margin-top:0}.profile-user-img{margin:0 auto;width:100px;padding:3px;border:3px solid #d2d6de}.profile-username{font-size:21px;margin-top:5px}.post{border-bottom:1px solid #d2d6de;margin-bottom:15px;padding-bottom:15px;color:#666}.post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.post .user-block{margin-bottom:15px}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon>:first-child{border:none;text-align:center;width:100%}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:focus,.btn-adn.focus{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:hover{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:focus,.btn-bitbucket.focus{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:focus,.btn-dropbox.focus{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:focus,.btn-facebook.focus{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:focus,.btn-flickr.focus{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:focus,.btn-foursquare.focus{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:focus,.btn-github.focus{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:hover{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github .badge{color:#444;background-color:#fff}.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google:focus,.btn-google.focus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:hover{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{background-image:none}.btn-google .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:focus,.btn-instagram.focus{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:focus,.btn-linkedin.focus{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:focus,.btn-microsoft.focus{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:focus,.btn-openid.focus{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:hover{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:focus,.btn-pinterest.focus{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:focus,.btn-reddit.focus{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:focus,.btn-soundcloud.focus{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:focus,.btn-tumblr.focus{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:focus,.btn-twitter.focus{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:focus,.btn-vimeo.focus{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:focus,.btn-vk.focus{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:hover{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:focus,.btn-yahoo.focus{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button:hover,.fc-button:active,.fc-button.hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-header:first-of-type,.fc-widget-content:first-of-type{border-left:0;border-right:0}.fc-widget-header:last-of-type,.fc-widget-content:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform linear .3s;transition:-webkit-transform linear .3s;transition:transform linear .3s;transition:transform linear .3s, -webkit-transform linear .3s}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all linear .3s;transition:all linear .3s}.external-event{padding:5px 10px;font-weight:bold;margin-bottom:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);text-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;cursor:move}.external-event:hover{-webkit-box-shadow:inset 0 0 90px rgba(0,0,0,0.2);box-shadow:inset 0 0 90px rgba(0,0,0,0.2)}.select2-container--default.select2-container--focus,.select2-selection.select2-container--focus,.select2-container--default:focus,.select2-selection:focus,.select2-container--default:active,.select2-selection:active{outline:none}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:white}.select2-results__option{padding:6px 12px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:none}.select2-container--default.select2-container--focus .select2-selection--multiple,.select2-container--default .select2-search--dropdown .select2-search__field{border-color:#3c8dbc !important}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,0.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}.box .datepicker-inline,.box .datepicker-inline .datepicker-days,.box .datepicker-inline>table,.box .datepicker-inline .datepicker-days>table{width:100%}.box .datepicker-inline td:hover,.box .datepicker-inline .datepicker-days td:hover,.box .datepicker-inline>table td:hover,.box .datepicker-inline .datepicker-days>table td:hover{background-color:rgba(255,255,255,0.3)}.box .datepicker-inline td.day.old,.box .datepicker-inline .datepicker-days td.day.old,.box .datepicker-inline>table td.day.old,.box .datepicker-inline .datepicker-days>table td.day.old,.box .datepicker-inline td.day.new,.box .datepicker-inline .datepicker-days td.day.new,.box .datepicker-inline>table td.day.new,.box .datepicker-inline .datepicker-days>table td.day.new{color:#777}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.description-block>.description-text{text-transform:uppercase}.bg-red,.bg-yellow,.bg-aqua,.bg-blue,.bg-light-blue,.bg-green,.bg-navy,.bg-teal,.bg-olive,.bg-lime,.bg-orange,.bg-fuchsia,.bg-purple,.bg-maroon,.bg-black,.bg-red-active,.bg-yellow-active,.bg-aqua-active,.bg-blue-active,.bg-light-blue-active,.bg-green-active,.bg-navy-active,.bg-teal-active,.bg-olive-active,.bg-lime-active,.bg-orange-active,.bg-fuchsia-active,.bg-purple-active,.bg-maroon-active,.bg-black-active,.callout.callout-danger,.callout.callout-warning,.callout.callout-info,.callout.callout-success,.alert-success,.alert-danger,.alert-error,.alert-warning,.alert-info,.label-danger,.label-info,.label-warning,.label-primary,.label-success,.modal-primary .modal-body,.modal-primary .modal-header,.modal-primary .modal-footer,.modal-warning .modal-body,.modal-warning .modal-header,.modal-warning .modal-footer,.modal-info .modal-body,.modal-info .modal-header,.modal-info .modal-footer,.modal-success .modal-body,.modal-success .modal-header,.modal-success .modal-footer,.modal-danger .modal-body,.modal-danger .modal-header,.modal-danger .modal-footer{color:#fff !important}.bg-gray{color:#000;background-color:#d2d6de !important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111 !important}.bg-red,.callout.callout-danger,.alert-danger,.alert-error,.label-danger,.modal-danger .modal-body{background-color:#dd4b39 !important}.bg-yellow,.callout.callout-warning,.alert-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12 !important}.bg-aqua,.callout.callout-info,.alert-info,.label-info,.modal-info .modal-body{background-color:#00c0ef !important}.bg-blue{background-color:#0073b7 !important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc !important}.bg-green,.callout.callout-success,.alert-success,.label-success,.modal-success .modal-body{background-color:#00a65a !important}.bg-navy{background-color:#001f3f !important}.bg-teal{background-color:#39cccc !important}.bg-olive{background-color:#3d9970 !important}.bg-lime{background-color:#01ff70 !important}.bg-orange{background-color:#ff851b !important}.bg-fuchsia{background-color:#f012be !important}.bg-purple{background-color:#605ca8 !important}.bg-maroon{background-color:#d81b60 !important}.bg-gray-active{color:#000;background-color:#b5bbc8 !important}.bg-black-active{background-color:#000 !important}.bg-red-active,.modal-danger .modal-header,.modal-danger .modal-footer{background-color:#d33724 !important}.bg-yellow-active,.modal-warning .modal-header,.modal-warning .modal-footer{background-color:#db8b0b !important}.bg-aqua-active,.modal-info .modal-header,.modal-info .modal-footer{background-color:#00a7d0 !important}.bg-blue-active{background-color:#005384 !important}.bg-light-blue-active,.modal-primary .modal-header,.modal-primary .modal-footer{background-color:#357ca5 !important}.bg-green-active,.modal-success .modal-header,.modal-success .modal-footer{background-color:#008d4c !important}.bg-navy-active{background-color:#001a35 !important}.bg-teal-active{background-color:#30bbbb !important}.bg-olive-active{background-color:#368763 !important}.bg-lime-active{background-color:#00e765 !important}.bg-orange-active{background-color:#ff7701 !important}.bg-fuchsia-active{background-color:#db0ead !important}.bg-purple-active{background-color:#555299 !important}.bg-maroon-active{background-color:#ca195a !important}[class^="bg-"].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39 !important}.text-yellow{color:#f39c12 !important}.text-aqua{color:#00c0ef !important}.text-blue{color:#0073b7 !important}.text-black{color:#111 !important}.text-light-blue{color:#3c8dbc !important}.text-green{color:#00a65a !important}.text-gray{color:#d2d6de !important}.text-navy{color:#001f3f !important}.text-teal{color:#39cccc !important}.text-olive{color:#3d9970 !important}.text-lime{color:#01ff70 !important}.text-orange{color:#ff851b !important}.text-fuchsia{color:#f012be !important}.text-purple{color:#605ca8 !important}.text-maroon{color:#d81b60 !important}.link-muted{color:#7a869d}.link-muted:hover,.link-muted:focus{color:#606c84}.link-black{color:#666}.link-black:hover,.link-black:focus{color:#999}.hide{display:none !important}.no-border{border:0 !important}.no-padding{padding:0 !important}.no-margin{margin:0 !important}.no-shadow{-webkit-box-shadow:none !important;box-shadow:none !important}.list-unstyled,.chart-legend,.contacts-list,.users-list,.mailbox-attachments{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.flat{border-radius:0 !important}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-sm{font-size:12px}.jqstooltip{padding:5px !important;width:auto !important;height:auto !important}.bg-teal-gradient{background:#39cccc !important;background:-o-linear-gradient(#7adddd, #39cccc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc !important;background:-o-linear-gradient(#67a8ce, #3c8dbc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;color:#fff}.bg-blue-gradient{background:#0073b7 !important;background:-o-linear-gradient(#0089db, #0073b7) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;color:#fff}.bg-aqua-gradient{background:#00c0ef !important;background:-o-linear-gradient(#14d1ff, #00c0ef) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;color:#fff}.bg-yellow-gradient{background:#f39c12 !important;background:-o-linear-gradient(#f7bc60, #f39c12) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;color:#fff}.bg-purple-gradient{background:#605ca8 !important;background:-o-linear-gradient(#9491c4, #605ca8) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;color:#fff}.bg-green-gradient{background:#00a65a !important;background:-o-linear-gradient(#00ca6d, #00a65a) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;color:#fff}.bg-red-gradient{background:#dd4b39 !important;background:-o-linear-gradient(#e47365, #dd4b39) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;color:#fff}.bg-black-gradient{background:#111 !important;background:-o-linear-gradient(#2b2b2b, #111) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important;color:#fff}.bg-maroon-gradient{background:#d81b60 !important;background:-o-linear-gradient(#e73f7c, #d81b60) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static !important}.list-header{font-size:15px;padding:10px 4px;font-weight:bold;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px 0}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:before,.user-block:after{content:" ";display:table}.user-block:after{clear:both}.user-block img{width:40px;height:40px;float:left}.user-block .username,.user-block .description,.user-block .comment{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .username,.user-block.user-block-sm .description,.user-block.user-block-sm .comment{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.img-sm,.img-md,.img-lg,.box-comments .box-comment img,.user-block.user-block-sm img{float:left}.img-sm,.box-comments .box-comment img,.user-block.user-block-sm img{width:30px !important;height:30px !important}.img-sm+.img-push{margin-left:40px}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.img-lg{width:100px;height:100px}.img-lg+.img-push{margin-left:110px}.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart svg,.chart canvas{width:100% !important}@media print{.no-print,.main-sidebar,.left-side,.main-header,.content-header{display:none !important}.content-wrapper,.right-side,.main-footer{margin-left:0 !important;min-height:0 !important;-webkit-transform:translate(0, 0) !important;transform:translate(0, 0) !important}.fixed .content-wrapper,.fixed .right-side{padding-top:0 !important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr th,.table-responsive>.table tr td{white-space:normal !important}}.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a,.skin-blue .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-blue .sidebar-menu>li.active>a{border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-blue .sidebar-menu .treeview-menu>li.active>a,.skin-blue .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{-webkit-box-shadow:none;box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .wrapper,.skin-blue-light .main-sidebar,.skin-blue-light .left-side{background-color:#f9fafc}.skin-blue-light .main-sidebar{border-right:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li:hover>a,.skin-blue-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-blue-light .sidebar-menu .treeview-menu>li.active>a,.skin-blue-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-blue-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-blue-light .sidebar-form input[type="text"],.skin-blue-light .sidebar-form .btn{-webkit-box-shadow:none;box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-blue-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type="text"]:focus,.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}.skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar{background-color:#fff}.skin-black .main-header .navbar .nav>li>a{color:#333}.skin-black .main-header .navbar .nav>li>a:hover,.skin-black .main-header .navbar .nav>li>a:active,.skin-black .main-header .navbar .nav>li>a:focus,.skin-black .main-header .navbar .nav .open>a,.skin-black .main-header .navbar .nav .open>a:hover,.skin-black .main-header .navbar .nav .open>a:focus,.skin-black .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black .main-header .navbar .sidebar-toggle{color:#333}.skin-black .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header .navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;-webkit-box-shadow:none;box-shadow:none}.skin-black .wrapper,.skin-black .main-sidebar,.skin-black .left-side{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li:hover>a,.skin-black .sidebar-menu>li.active>a,.skin-black .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-black .sidebar-menu>li.active>a{border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-black .sidebar-menu .treeview-menu>li.active>a,.skin-black .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-black .sidebar-form input[type="text"],.skin-black .sidebar-form .btn{-webkit-box-shadow:none;box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-black .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type="text"]:focus,.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-black .pace .pace-progress{background:#222}.skin-black .pace .pace-activity{border-top-color:#222;border-left-color:#222}.skin-black-light .main-header{border-bottom:1px solid #d2d6de}.skin-black-light .main-header .navbar-toggle{color:#333}.skin-black-light .main-header .navbar-brand{color:#333;border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar{background-color:#fff}.skin-black-light .main-header .navbar .nav>li>a{color:#333}.skin-black-light .main-header .navbar .nav>li>a:hover,.skin-black-light .main-header .navbar .nav>li>a:active,.skin-black-light .main-header .navbar .nav>li>a:focus,.skin-black-light .main-header .navbar .nav .open>a,.skin-black-light .main-header .navbar .nav .open>a:hover,.skin-black-light .main-header .navbar .nav .open>a:focus,.skin-black-light .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black-light .main-header .navbar .sidebar-toggle{color:#333}.skin-black-light .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black-light .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar .navbar-nav>li>a{border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black-light .main-header .navbar .navbar-right>li>a{border-left:1px solid #d2d6de;border-right-width:0}.skin-black-light .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #d2d6de}.skin-black-light .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black-light .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black-light .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black-light .main-header li.user-header{background-color:#222}.skin-black-light .content-header{background:transparent;-webkit-box-shadow:none;box-shadow:none}.skin-black-light .wrapper,.skin-black-light .main-sidebar,.skin-black-light .left-side{background-color:#f9fafc}.skin-black-light .main-sidebar{border-right:1px solid #d2d6de}.skin-black-light .user-panel>.info,.skin-black-light .user-panel>.info>a{color:#444}.skin-black-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-black-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-black-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-black-light .sidebar-menu>li:hover>a,.skin-black-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-black-light .sidebar-menu>li.active{border-left-color:#fff}.skin-black-light .sidebar-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-black-light .sidebar a{color:#444}.skin-black-light .sidebar a:hover{text-decoration:none}.skin-black-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-black-light .sidebar-menu .treeview-menu>li.active>a,.skin-black-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-black-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-black-light .sidebar-form input[type="text"],.skin-black-light .sidebar-form .btn{-webkit-box-shadow:none;box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-black-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black-light .sidebar-form input[type="text"]:focus,.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .wrapper,.skin-green .main-sidebar,.skin-green .left-side{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li:hover>a,.skin-green .sidebar-menu>li.active>a,.skin-green .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-green .sidebar-menu>li.active>a{border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-green .sidebar-menu .treeview-menu>li.active>a,.skin-green .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-green .sidebar-form input[type="text"],.skin-green .sidebar-form .btn{-webkit-box-shadow:none;box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-green .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type="text"]:focus,.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .wrapper,.skin-green-light .main-sidebar,.skin-green-light .left-side{background-color:#f9fafc}.skin-green-light .main-sidebar{border-right:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li:hover>a,.skin-green-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-green-light .sidebar-menu .treeview-menu>li.active>a,.skin-green-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-green-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-green-light .sidebar-form input[type="text"],.skin-green-light .sidebar-form .btn{-webkit-box-shadow:none;box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-green-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type="text"]:focus,.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .wrapper,.skin-red .main-sidebar,.skin-red .left-side{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li:hover>a,.skin-red .sidebar-menu>li.active>a,.skin-red .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-red .sidebar-menu>li.active>a{border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-red .sidebar-menu .treeview-menu>li.active>a,.skin-red .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-red .sidebar-form input[type="text"],.skin-red .sidebar-form .btn{-webkit-box-shadow:none;box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-red .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type="text"]:focus,.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .wrapper,.skin-red-light .main-sidebar,.skin-red-light .left-side{background-color:#f9fafc}.skin-red-light .main-sidebar{border-right:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li:hover>a,.skin-red-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-red-light .sidebar-menu .treeview-menu>li.active>a,.skin-red-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-red-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-red-light .sidebar-form input[type="text"],.skin-red-light .sidebar-form .btn{-webkit-box-shadow:none;box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-red-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type="text"]:focus,.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .wrapper,.skin-yellow .main-sidebar,.skin-yellow .left-side{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li:hover>a,.skin-yellow .sidebar-menu>li.active>a,.skin-yellow .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-yellow .sidebar-menu>li.active>a{border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-yellow .sidebar-menu .treeview-menu>li.active>a,.skin-yellow .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-yellow .sidebar-form input[type="text"],.skin-yellow .sidebar-form .btn{-webkit-box-shadow:none;box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-yellow .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type="text"]:focus,.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .wrapper,.skin-yellow-light .main-sidebar,.skin-yellow-light .left-side{background-color:#f9fafc}.skin-yellow-light .main-sidebar{border-right:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li:hover>a,.skin-yellow-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-yellow-light .sidebar-menu .treeview-menu>li.active>a,.skin-yellow-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-yellow-light .sidebar-form input[type="text"],.skin-yellow-light .sidebar-form .btn{-webkit-box-shadow:none;box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-yellow-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type="text"]:focus,.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .wrapper,.skin-purple .main-sidebar,.skin-purple .left-side{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li:hover>a,.skin-purple .sidebar-menu>li.active>a,.skin-purple .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-purple .sidebar-menu>li.active>a{border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-purple .sidebar-menu .treeview-menu>li.active>a,.skin-purple .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-purple .sidebar-form input[type="text"],.skin-purple .sidebar-form .btn{-webkit-box-shadow:none;box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-purple .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type="text"]:focus,.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .wrapper,.skin-purple-light .main-sidebar,.skin-purple-light .left-side{background-color:#f9fafc}.skin-purple-light .main-sidebar{border-right:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li:hover>a,.skin-purple-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-purple-light .sidebar-menu .treeview-menu>li.active>a,.skin-purple-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-purple-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-purple-light .sidebar-form input[type="text"],.skin-purple-light .sidebar-form .btn{-webkit-box-shadow:none;box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-purple-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type="text"]:focus,.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255,255,255,0.8);border:solid 2px rgba(230,230,230,0.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0}
+.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0}
+svg {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+
+.jvectormap-container {
+ width: 100%;
+ height: 100%;
+ position: relative;
+ overflow: hidden;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+
+.jvectormap-tip {
+ position: absolute;
+ display: none;
+ border: solid 1px #CDCDCD;
+ border-radius: 3px;
+ background: #292929;
+ color: white;
+ font-family: sans-serif, Verdana;
+ font-size: smaller;
+ padding: 3px;
+}
+
+.jvectormap-zoomin, .jvectormap-zoomout, .jvectormap-goback {
+ position: absolute;
+ left: 10px;
+ border-radius: 3px;
+ background: #292929;
+ padding: 3px;
+ color: white;
+ cursor: pointer;
+ line-height: 10px;
+ text-align: center;
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+.jvectormap-zoomin, .jvectormap-zoomout {
+ width: 10px;
+ height: 10px;
+}
+
+.jvectormap-zoomin {
+ top: 10px;
+}
+
+.jvectormap-zoomout {
+ top: 30px;
+}
+
+.jvectormap-goback {
+ bottom: 10px;
+ z-index: 1000;
+ padding: 6px;
+}
+
+.jvectormap-spinner {
+ position: absolute;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ background: center no-repeat url(data:image/gif;base64,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);
+}
+
+.jvectormap-legend-title {
+ font-weight: bold;
+ font-size: 14px;
+ text-align: center;
+}
+
+.jvectormap-legend-cnt {
+ position: absolute;
+}
+
+.jvectormap-legend-cnt-h {
+ bottom: 0;
+ right: 0;
+}
+
+.jvectormap-legend-cnt-v {
+ top: 0;
+ right: 0;
+}
+
+.jvectormap-legend {
+ background: black;
+ color: white;
+ border-radius: 3px;
+}
+
+.jvectormap-legend-cnt-h .jvectormap-legend {
+ float: left;
+ margin: 0 10px 10px 0;
+ padding: 3px 3px 1px 3px;
+}
+
+.jvectormap-legend-cnt-h .jvectormap-legend .jvectormap-legend-tick {
+ float: left;
+}
+
+.jvectormap-legend-cnt-v .jvectormap-legend {
+ margin: 10px 10px 0 0;
+ padding: 3px;
+}
+
+.jvectormap-legend-cnt-h .jvectormap-legend-tick {
+ width: 40px;
+}
+
+.jvectormap-legend-cnt-h .jvectormap-legend-tick-sample {
+ height: 15px;
+}
+
+.jvectormap-legend-cnt-v .jvectormap-legend-tick-sample {
+ height: 20px;
+ width: 20px;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.jvectormap-legend-tick-text {
+ font-size: 12px;
+}
+
+.jvectormap-legend-cnt-h .jvectormap-legend-tick-text {
+ text-align: center;
+}
+
+.jvectormap-legend-cnt-v .jvectormap-legend-tick-text {
+ display: inline-block;
+ vertical-align: middle;
+ line-height: 20px;
+ padding-left: 3px;
+}/*!
+ * Datepicker for Bootstrap v1.7.1 (https://github.com/uxsolutions/bootstrap-datepicker)
+ *
+ * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ */
+
+.datepicker{padding:4px;border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker-rtl{direction:rtl}.datepicker-rtl.dropdown-menu{left:auto}.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #999;border-top:0;border-bottom-color:rgba(0,0,0,.2);position:absolute}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;border-top:0;position:absolute}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-bottom:before{top:-7px}.datepicker-dropdown.datepicker-orient-bottom:after{top:-6px}.datepicker-dropdown.datepicker-orient-top:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.datepicker-dropdown.datepicker-orient-top:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker td,.datepicker th{text-align:center;width:20px;height:20px;border-radius:4px;border:none}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day.focused,.datepicker table tr td.day:hover{background:#eee;cursor:pointer}.datepicker table tr td.new,.datepicker table tr td.old{color:#999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td.highlighted{background:#d9edf7;border-radius:0}.datepicker table tr td.today,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today:hover{background-color:#fde19a;background-image:-webkit-gradient(linear,left top, left bottom,from(#fdd49a),to(#fdf59a));background-image:linear-gradient(to bottom,#fdd49a,#fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#000}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today.disabled:hover[disabled],.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today:active,.datepicker table tr td.today:hover,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today:hover:active,.datepicker table tr td.today:hover:hover,.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today[disabled]{background-color:#fdf59a}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today:active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active{background-color:#fbf069\9}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover,.datepicker table tr td.range:hover{background:#eee;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today:hover{background-color:#f3d17a;background-image:-webkit-gradient(linear,left top, left bottom,from(#f3c17a),to(#f3e97a));background-image:linear-gradient(to bottom,#f3c17a,#f3e97a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);border-color:#f3e97a #f3e97a #edde34;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:0}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today.disabled:hover[disabled],.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today:hover:hover,.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today[disabled]{background-color:#f3e97a}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active{background-color:#efe24b\9}.datepicker table tr td.selected,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected:hover{background-color:#9e9e9e;background-image:-webkit-gradient(linear,left top, left bottom,from(#b3b3b3),to(grey));background-image:linear-gradient(to bottom,#b3b3b3,grey);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);border-color:grey grey #595959;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected.disabled:hover[disabled],.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected:hover:hover,.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected[disabled]{background-color:grey}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active{background-color:#666\9}.datepicker table tr td.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active:hover{background-color:#006dcc;background-image:-webkit-gradient(linear,left top, left bottom,from(#08c),to(#04c));background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active.disabled:hover[disabled],.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active:active,.datepicker table tr td.active:hover,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active:hover:active,.datepicker table tr td.active:hover:hover,.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active[disabled]{background-color:#04c}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active:active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active{background-color:#039\9}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;border-radius:4px}.datepicker table tr td span.focused,.datepicker table tr td span:hover{background:#eee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active:hover{background-color:#006dcc;background-image:-webkit-gradient(linear,left top, left bottom,from(#08c),to(#04c));background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active.disabled:hover[disabled],.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active:hover:hover,.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active[disabled]{background-color:#04c}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active{background-color:#039\9}.datepicker table tr td span.new,.datepicker table tr td span.old{color:#999}.datepicker .datepicker-switch{width:145px}.datepicker .datepicker-switch,.datepicker .next,.datepicker .prev,.datepicker tfoot tr th{cursor:pointer}.datepicker .datepicker-switch:hover,.datepicker .next:hover,.datepicker .prev:hover,.datepicker tfoot tr th:hover{background:#eee}.datepicker .next.disabled,.datepicker .prev.disabled{visibility:hidden}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.input-append.date .add-on,.input-prepend.date .add-on{cursor:pointer}.input-append.date .add-on i,.input-prepend.date .add-on i{margin-top:3px}.input-daterange input{text-align:center}.input-daterange input:first-child{border-radius:3px 0 0 3px}.input-daterange input:last-child{border-radius:0 3px 3px 0}.input-daterange .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:400;line-height:18px;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:1px solid #ccc;margin-left:-5px;margin-right:-5px}.daterangepicker {
+ position: absolute;
+ color: inherit;
+ background-color: #fff;
+ border-radius: 4px;
+ width: 278px;
+ padding: 4px;
+ margin-top: 1px;
+ top: 100px;
+ left: 20px;
+ /* Calendars */ }
+ .daterangepicker:before, .daterangepicker:after {
+ position: absolute;
+ display: inline-block;
+ border-bottom-color: rgba(0, 0, 0, 0.2);
+ content: ''; }
+ .daterangepicker:before {
+ top: -7px;
+ border-right: 7px solid transparent;
+ border-left: 7px solid transparent;
+ border-bottom: 7px solid #ccc; }
+ .daterangepicker:after {
+ top: -6px;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid #fff;
+ border-left: 6px solid transparent; }
+ .daterangepicker.opensleft:before {
+ right: 9px; }
+ .daterangepicker.opensleft:after {
+ right: 10px; }
+ .daterangepicker.openscenter:before {
+ left: 0;
+ right: 0;
+ width: 0;
+ margin-left: auto;
+ margin-right: auto; }
+ .daterangepicker.openscenter:after {
+ left: 0;
+ right: 0;
+ width: 0;
+ margin-left: auto;
+ margin-right: auto; }
+ .daterangepicker.opensright:before {
+ left: 9px; }
+ .daterangepicker.opensright:after {
+ left: 10px; }
+ .daterangepicker.dropup {
+ margin-top: -5px; }
+ .daterangepicker.dropup:before {
+ top: initial;
+ bottom: -7px;
+ border-bottom: initial;
+ border-top: 7px solid #ccc; }
+ .daterangepicker.dropup:after {
+ top: initial;
+ bottom: -6px;
+ border-bottom: initial;
+ border-top: 6px solid #fff; }
+ .daterangepicker.dropdown-menu {
+ max-width: none;
+ z-index: 3001; }
+ .daterangepicker.single .ranges, .daterangepicker.single .calendar {
+ float: none; }
+ .daterangepicker.show-calendar .calendar {
+ display: block; }
+ .daterangepicker .calendar {
+ display: none;
+ max-width: 270px;
+ margin: 4px; }
+ .daterangepicker .calendar.single .calendar-table {
+ border: none; }
+ .daterangepicker .calendar th, .daterangepicker .calendar td {
+ white-space: nowrap;
+ text-align: center;
+ min-width: 32px; }
+ .daterangepicker .calendar-table {
+ border: 1px solid #fff;
+ padding: 4px;
+ border-radius: 4px;
+ background-color: #fff; }
+ .daterangepicker table {
+ width: 100%;
+ margin: 0; }
+ .daterangepicker td, .daterangepicker th {
+ text-align: center;
+ width: 20px;
+ height: 20px;
+ border-radius: 4px;
+ border: 1px solid transparent;
+ white-space: nowrap;
+ cursor: pointer; }
+ .daterangepicker td.available:hover, .daterangepicker th.available:hover {
+ background-color: #eee;
+ border-color: transparent;
+ color: inherit; }
+ .daterangepicker td.week, .daterangepicker th.week {
+ font-size: 80%;
+ color: #ccc; }
+ .daterangepicker td.off, .daterangepicker td.off.in-range, .daterangepicker td.off.start-date, .daterangepicker td.off.end-date {
+ background-color: #fff;
+ border-color: transparent;
+ color: #999; }
+ .daterangepicker td.in-range {
+ background-color: #ebf4f8;
+ border-color: transparent;
+ color: #000;
+ border-radius: 0; }
+ .daterangepicker td.start-date {
+ border-radius: 4px 0 0 4px; }
+ .daterangepicker td.end-date {
+ border-radius: 0 4px 4px 0; }
+ .daterangepicker td.start-date.end-date {
+ border-radius: 4px; }
+ .daterangepicker td.active, .daterangepicker td.active:hover {
+ background-color: #357ebd;
+ border-color: transparent;
+ color: #fff; }
+ .daterangepicker th.month {
+ width: auto; }
+ .daterangepicker td.disabled, .daterangepicker option.disabled {
+ color: #999;
+ cursor: not-allowed;
+ text-decoration: line-through; }
+ .daterangepicker select.monthselect, .daterangepicker select.yearselect {
+ font-size: 12px;
+ padding: 1px;
+ height: auto;
+ margin: 0;
+ cursor: default; }
+ .daterangepicker select.monthselect {
+ margin-right: 2%;
+ width: 56%; }
+ .daterangepicker select.yearselect {
+ width: 40%; }
+ .daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect {
+ width: 50px;
+ margin-bottom: 0; }
+ .daterangepicker .input-mini {
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ color: #555;
+ height: 30px;
+ line-height: 30px;
+ display: block;
+ vertical-align: middle;
+ margin: 0 0 5px 0;
+ padding: 0 6px 0 28px;
+ width: 100%; }
+ .daterangepicker .input-mini.active {
+ border: 1px solid #08c;
+ border-radius: 4px; }
+ .daterangepicker .daterangepicker_input {
+ position: relative; }
+ .daterangepicker .daterangepicker_input i {
+ position: absolute;
+ left: 8px;
+ top: 8px; }
+ .daterangepicker.rtl .input-mini {
+ padding-right: 28px;
+ padding-left: 6px; }
+ .daterangepicker.rtl .daterangepicker_input i {
+ left: auto;
+ right: 8px; }
+ .daterangepicker .calendar-time {
+ text-align: center;
+ margin: 5px auto;
+ line-height: 30px;
+ position: relative;
+ padding-left: 28px; }
+ .daterangepicker .calendar-time select.disabled {
+ color: #ccc;
+ cursor: not-allowed; }
+
+.ranges {
+ font-size: 11px;
+ float: none;
+ margin: 4px;
+ text-align: left; }
+ .ranges ul {
+ list-style: none;
+ margin: 0 auto;
+ padding: 0;
+ width: 100%; }
+ .ranges li {
+ font-size: 13px;
+ background-color: #f5f5f5;
+ border: 1px solid #f5f5f5;
+ border-radius: 4px;
+ color: #08c;
+ padding: 3px 12px;
+ margin-bottom: 8px;
+ cursor: pointer; }
+ .ranges li:hover {
+ background-color: #08c;
+ border: 1px solid #08c;
+ color: #fff; }
+ .ranges li.active {
+ background-color: #08c;
+ border: 1px solid #08c;
+ color: #fff; }
+
+/* Larger Screen Styling */
+@media (min-width: 564px) {
+ .daterangepicker {
+ width: auto; }
+ .daterangepicker .ranges ul {
+ width: 160px; }
+ .daterangepicker.single .ranges ul {
+ width: 100%; }
+ .daterangepicker.single .calendar.left {
+ clear: none; }
+ .daterangepicker.single.ltr .ranges, .daterangepicker.single.ltr .calendar {
+ float: left; }
+ .daterangepicker.single.rtl .ranges, .daterangepicker.single.rtl .calendar {
+ float: right; }
+ .daterangepicker.ltr {
+ direction: ltr;
+ text-align: left; }
+ .daterangepicker.ltr .calendar.left {
+ clear: left;
+ margin-right: 0; }
+ .daterangepicker.ltr .calendar.left .calendar-table {
+ border-right: none;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0; }
+ .daterangepicker.ltr .calendar.right {
+ margin-left: 0; }
+ .daterangepicker.ltr .calendar.right .calendar-table {
+ border-left: none;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0; }
+ .daterangepicker.ltr .left .daterangepicker_input {
+ padding-right: 12px; }
+ .daterangepicker.ltr .calendar.left .calendar-table {
+ padding-right: 12px; }
+ .daterangepicker.ltr .ranges, .daterangepicker.ltr .calendar {
+ float: left; }
+ .daterangepicker.rtl {
+ direction: rtl;
+ text-align: right; }
+ .daterangepicker.rtl .calendar.left {
+ clear: right;
+ margin-left: 0; }
+ .daterangepicker.rtl .calendar.left .calendar-table {
+ border-left: none;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0; }
+ .daterangepicker.rtl .calendar.right {
+ margin-right: 0; }
+ .daterangepicker.rtl .calendar.right .calendar-table {
+ border-right: none;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0; }
+ .daterangepicker.rtl .left .daterangepicker_input {
+ padding-left: 12px; }
+ .daterangepicker.rtl .calendar.left .calendar-table {
+ padding-left: 12px; }
+ .daterangepicker.rtl .ranges, .daterangepicker.rtl .calendar {
+ text-align: right;
+ float: right; } }
+@media (min-width: 730px) {
+ .daterangepicker .ranges {
+ width: auto; }
+ .daterangepicker.ltr .ranges {
+ float: left; }
+ .daterangepicker.rtl .ranges {
+ float: right; }
+ .daterangepicker .calendar.left {
+ clear: none !important; } }
+/*! bootstrap3-wysihtml5-bower 2014-09-26 */
+
+ul.wysihtml5-toolbar{margin:0;padding:0;display:block}ul.wysihtml5-toolbar::after{clear:both;display:table;content:""}ul.wysihtml5-toolbar>li{float:left;display:list-item;list-style:none;margin:0 5px 10px 0}ul.wysihtml5-toolbar a[data-wysihtml5-command=bold]{font-weight:700}ul.wysihtml5-toolbar a[data-wysihtml5-command=italic]{font-style:italic}ul.wysihtml5-toolbar a[data-wysihtml5-command=underline]{text-decoration:underline}ul.wysihtml5-toolbar a.btn.wysihtml5-command-active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);background-color:#D9D9D9;outline:0}ul.wysihtml5-commands-disabled .dropdown-menu{display:none!important}ul.wysihtml5-toolbar div.wysihtml5-colors{display:block;width:50px;height:20px;margin-top:2px;margin-left:5px;position:absolute;pointer-events:none}ul.wysihtml5-toolbar a.wysihtml5-colors-title{padding-left:70px}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=black]{background:#000!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=silver]{background:silver!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=gray]{background:gray!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=maroon]{background:maroon!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=red]{background:red!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=purple]{background:purple!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=green]{background:green!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=olive]{background:olive!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=navy]{background:navy!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=blue]{background:#00f!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=orange]{background:orange!important}.glyphicon-quote:before{content:"\201C";font-family:Georgia,serif;font-size:50px;position:absolute;top:-4px;left:-3px;max-height:100%}.glyphicon-quote:after{content:"\A0"}
diff --git a/public/fonts/vendor/Ionicons/ionicons.eot b/public/fonts/vendor/Ionicons/ionicons.eot
new file mode 100644
index 0000000..92a3f20
--- /dev/null
+++ b/public/fonts/vendor/Ionicons/ionicons.eot
Binary files differ
diff --git a/public/fonts/vendor/Ionicons/ionicons.svg b/public/fonts/vendor/Ionicons/ionicons.svg
new file mode 100644
index 0000000..49fc8f3
--- /dev/null
+++ b/public/fonts/vendor/Ionicons/ionicons.svg
@@ -0,0 +1,2230 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<!--
+2014-12-4: Created.
+-->
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+Created by FontForge 20120731 at Thu Dec 4 09:51:48 2014
+ By Adam Bradley
+Created by Adam Bradley with FontForge 2.0 (http://fontforge.sf.net)
+</metadata>
+<defs>
+<font id="Ionicons" horiz-adv-x="448" >
+ <font-face
+ font-family="Ionicons"
+ font-weight="500"
+ font-stretch="normal"
+ units-per-em="512"
+ panose-1="2 0 6 3 0 0 0 0 0 0"
+ ascent="448"
+ descent="-64"
+ bbox="-0.54049 -64 512.487 448"
+ underline-thickness="25.6"
+ underline-position="-51.2"
+ unicode-range="U+F100-F4F7"
+ />
+ <missing-glyph />
+ <glyph glyph-name="ion-alert-circled" unicode="&#xf100;"
+d="M445 26c3 -5 5 -13 2 -18s-8 -8 -14 -8h-418c-6 0 -11 3 -14 8s-1 13 2 18l207 349c3 5 8 9 14 9s11 -4 14 -9zM256 48v48h-64v-48h64zM256 128v144h-64v-144h64z" />
+ <glyph glyph-name="ion-alert" unicode="&#xf101;" horiz-adv-x="128"
+d="M128 -32h-128v96h128v-96zM112 128h-96l-16 288h128z" />
+ <glyph glyph-name="ion-android-add-circle" unicode="&#xf359;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM315 171v42h-86v86h-42v-86h-86v-42h86v-86h42v86h86z" />
+ <glyph glyph-name="ion-android-add" unicode="&#xf2c7;" horiz-adv-x="320"
+d="M320 171h-139v-139h-42v139h-139v42h139v139h42v-139h139v-42z" />
+ <glyph glyph-name="ion-android-alarm-clock" unicode="&#xf35a;" horiz-adv-x="428"
+d="M428 323l-28 -33l-98 82l28 33zM125 373l-97 -83l-28 33l97 83zM225 275v0v-111l85 -50l-16 -27l-101 61v127h32zM214 360c106 0 193 -86 193 -191s-87 -191 -193 -191c-107 0 -193 86 -193 191s86 191 193 191zM214 20c82 0 150 66 150 149c0 82 -68 149 -150 149
+s-150 -67 -150 -149s68 -149 150 -149z" />
+ <glyph glyph-name="ion-android-alert" unicode="&#xf35b;" horiz-adv-x="416"
+d="M208 400c114 0 208 -94 208 -208s-94 -208 -208 -208s-208 94 -208 208s94 208 208 208zM232 88v40h-48v-40h48zM232 176v128h-48v-128h48z" />
+ <glyph glyph-name="ion-android-apps" unicode="&#xf35c;" horiz-adv-x="320"
+d="M0 272v80h80v-80h-80zM120 32v80h80v-80h-80zM0 32v80h80v-80h-80zM0 152v80h80v-80h-80zM120 152v80h80v-80h-80zM240 352h80v-80h-80v80zM120 272v80h80v-80h-80zM240 152v80h80v-80h-80zM240 32v80h80v-80h-80z" />
+ <glyph glyph-name="ion-android-archive" unicode="&#xf2c9;" horiz-adv-x="416"
+d="M406 348c7 -7 10 -17 10 -29v-289c0 -25 -21 -46 -46 -46h-324c-25 0 -46 21 -46 46v289c0 12 3 22 10 29l33 39c6 8 16 13 26 13h278c10 0 20 -5 26 -13zM208 65l127 127h-81v46h-92v-46h-81zM49 354h317l-22 23h-277z" />
+ <glyph glyph-name="ion-android-arrow-back" unicode="&#xf2ca;" horiz-adv-x="342"
+d="M342 213v-42h-260l119 -120l-30 -30l-171 171l171 171l31 -30l-120 -120h260z" />
+ <glyph glyph-name="ion-android-arrow-down" unicode="&#xf35d;" horiz-adv-x="342"
+d="M192 363v-260l120 120l30 -31l-171 -171l-171 171l30 30l120 -119v260h42z" />
+ <glyph glyph-name="ion-android-arrow-dropdown-circle" unicode="&#xf35e;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 128l96 96h-192z" />
+ <glyph glyph-name="ion-android-arrow-dropdown" unicode="&#xf35f;" horiz-adv-x="256"
+d="M0 256h256l-128 -128z" />
+ <glyph glyph-name="ion-android-arrow-dropleft-circle" unicode="&#xf360;" horiz-adv-x="416"
+d="M416 192c0 -115 -93 -208 -208 -208s-208 93 -208 208s93 208 208 208s208 -93 208 -208zM144 192l96 -96v192z" />
+ <glyph glyph-name="ion-android-arrow-dropleft" unicode="&#xf361;" horiz-adv-x="128"
+d="M128 320v-256l-128 128z" />
+ <glyph glyph-name="ion-android-arrow-dropright-circle" unicode="&#xf362;" horiz-adv-x="416"
+d="M208 -16c-115 0 -208 93 -208 208s93 208 208 208s208 -93 208 -208s-93 -208 -208 -208zM176 96l96 96l-96 96v-192z" />
+ <glyph glyph-name="ion-android-arrow-dropright" unicode="&#xf363;" horiz-adv-x="128"
+d="M0 320l128 -128l-128 -128v256z" />
+ <glyph glyph-name="ion-android-arrow-dropup-circle" unicode="&#xf364;" horiz-adv-x="416"
+d="M416 192c0 -115 -93 -208 -208 -208s-208 93 -208 208s93 208 208 208s208 -93 208 -208zM304 160l-96 96l-96 -96h192z" />
+ <glyph glyph-name="ion-android-arrow-dropup" unicode="&#xf365;" horiz-adv-x="256"
+d="M0 128l128 128l128 -128h-256z" />
+ <glyph glyph-name="ion-android-arrow-forward" unicode="&#xf30f;" horiz-adv-x="342"
+d="M0 171v42h260l-119 120l30 30l171 -171l-171 -171l-31 30l120 120h-260z" />
+ <glyph glyph-name="ion-android-arrow-up" unicode="&#xf366;" horiz-adv-x="342"
+d="M192 21h-42v260l-120 -119l-30 30l171 171l171 -171l-30 -31l-120 120v-260z" />
+ <glyph glyph-name="ion-android-attach" unicode="&#xf367;" horiz-adv-x="235"
+d="M203 320h32v-235c0 -65 -53 -117 -118 -117s-117 52 -117 117v246c0 47 38 85 85 85s86 -38 86 -85v-246c0 -30 -24 -53 -54 -53s-53 23 -53 53v203h32v-203c0 -12 9 -21 21 -21s22 9 22 21v246c0 30 -24 53 -54 53s-53 -23 -53 -53v-246c0 -47 38 -85 85 -85
+s86 38 86 85v235z" />
+ <glyph glyph-name="ion-android-bar" unicode="&#xf368;" horiz-adv-x="384"
+d="M171 171l-171 170v43h384v-43l-171 -170v-131h107v-40h-256v40h107v131zM96 299h192l43 42h-278z" />
+ <glyph glyph-name="ion-android-bicycle" unicode="&#xf369;"
+d="M299 317c-19 0 -34 14 -34 33s15 34 34 34s33 -15 33 -34s-14 -33 -33 -33zM355 187c51 0 93 -43 93 -94s-42 -93 -93 -93s-94 42 -94 93s43 94 94 94zM355 28c36 0 65 29 65 65s-29 66 -65 66s-66 -30 -66 -66s30 -65 66 -65zM274 224l-30 45l-43 -45l39 -32v-112h-32
+v86l-61 38c-9 6 -19 15 -19 27c0 8 3 17 9 23l72 69c6 6 14 9 22 9c11 0 22 -7 28 -16l34 -60h59v-32h-78zM93 187c51 0 94 -43 94 -94s-43 -93 -94 -93s-93 42 -93 93s42 94 93 94zM93 28c36 0 66 29 66 65s-30 66 -66 66s-65 -30 -65 -66s29 -65 65 -65z" />
+ <glyph glyph-name="ion-android-boat" unicode="&#xf36a;"
+d="M52 35l-51 139c-2 6 -1 12 1 17s8 8 13 10l38 13v98c0 23 20 43 43 43h64l16 53h96l16 -53h64c23 0 43 -20 43 -43v-98l38 -13c5 -2 11 -5 13 -10s3 -12 1 -17l-51 -139h-1c-34 0 -65 20 -86 43c-21 -23 -51 -43 -85 -43s-64 19 -85 42c-21 -23 -52 -42 -86 -42h-1z
+M96 312v-84l128 41l128 -41v84h-256zM309 40c0 0 59 -64 107 -64h-21c-30 0 -59 12 -86 26c-53 -28 -117 -28 -170 0c-27 -14 -56 -26 -86 -26h-21c49 0 107 64 107 64c52 -36 118 -36 170 0z" />
+ <glyph glyph-name="ion-android-bookmark" unicode="&#xf36b;" horiz-adv-x="288"
+d="M248 384c22 0 40 -18 40 -40v-344l-144 64l-144 -64v344c0 22 18 40 40 40h208z" />
+ <glyph glyph-name="ion-android-bulb" unicode="&#xf36c;"
+d="M224 278c-25 0 -50 -10 -68 -28s-28 -43 -28 -68c0 -34 18 -66 48 -83l16 -10v-18v-71h64v71v18l16 10c15 8 27 20 35 34c9 15 13 31 13 49c0 25 -10 50 -28 68s-43 28 -68 28zM245 416v0v-64h-42v64h42zM374 362v0l30 -30l-38 -38l-30 30zM74 362v0l38 -38l-30 -30
+l-38 38zM224 310v0c70 0 128 -58 128 -128c0 -48 -26 -89 -64 -111v-103h-128v103c-38 22 -64 64 -64 111c0 70 58 128 128 128zM448 203v0v-42h-64v42h64zM64 203v0v-42h-64v42h64z" />
+ <glyph glyph-name="ion-android-bus" unicode="&#xf36d;" horiz-adv-x="352"
+d="M0 96v204c0 75 82 84 176 84s176 -9 176 -84v-204c0 -18 -14 -24 -27 -36v-39c0 -12 -9 -21 -21 -21h-21c-12 0 -22 9 -22 21v22h-170v-22c0 -12 -10 -21 -22 -21h-21c-12 0 -21 9 -21 21v39c-13 12 -27 17 -27 36zM80 80c18 0 32 14 32 32s-14 32 -32 32
+s-32 -14 -32 -32s14 -32 32 -32zM272 80c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM304 203v106h-256v-106h256z" />
+ <glyph glyph-name="ion-android-calendar" unicode="&#xf2d1;" horiz-adv-x="384"
+d="M304 176v-96h-96v96h96zM272 384h48v-32h24c22 0 40 -18 40 -40v-272c0 -22 -18 -40 -40 -40h-304c-22 0 -40 18 -40 40v272c0 22 18 40 40 40h24v32h48v-32h160v32zM344 40v212h-304v-212h304z" />
+ <glyph glyph-name="ion-android-call" unicode="&#xf2d2;" horiz-adv-x="384"
+d="M363 117c12 0 21 -9 21 -21v-75c0 -12 -9 -21 -21 -21c-201 0 -363 162 -363 363c0 12 9 21 21 21h75c12 0 21 -9 21 -21c0 -27 4 -52 13 -77c2 -7 0 -16 -5 -21l-47 -47c31 -61 80 -110 141 -141l47 47c5 6 14 7 21 5c23 -7 49 -12 76 -12z" />
+ <glyph glyph-name="ion-android-camera" unicode="&#xf2d3;"
+d="M161 168c0 42 21 63 63 63s63 -21 63 -63s-21 -63 -63 -63s-63 21 -63 63zM408 352c11 0 20 -4 28 -12s12 -17 12 -28v-272c0 -11 -4 -20 -12 -28s-17 -12 -28 -12h-368c-11 0 -20 4 -28 12s-12 17 -12 28v272c0 11 4 20 12 28s17 12 28 12h88l32 32h128l32 -32h88z
+M224 56c31 0 57 11 79 33s33 48 33 79s-11 57 -33 79s-48 33 -79 33s-57 -11 -79 -33s-33 -48 -33 -79s11 -57 33 -79s48 -33 79 -33z" />
+ <glyph glyph-name="ion-android-cancel" unicode="&#xf36e;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM312 117l-75 75l75 75l-29 29l-75 -75l-75 75l-29 -29l75 -75l-75 -75l29 -29l75 75l75 -75z" />
+ <glyph glyph-name="ion-android-car" unicode="&#xf36f;" horiz-adv-x="384"
+d="M339 331l45 -118v-160c0 -12 -9 -21 -21 -21h-22c-12 0 -21 9 -21 21v11h-256v-11c0 -12 -9 -21 -21 -21h-22c-12 0 -21 9 -21 21v160l45 118c4 13 16 21 30 21h234c14 0 26 -8 30 -21zM75 128c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM309 128
+c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM43 235h298l-32 85h-234z" />
+ <glyph glyph-name="ion-android-cart" unicode="&#xf370;" horiz-adv-x="416"
+d="M122 70c23 0 41 -18 41 -41s-18 -42 -41 -42s-42 19 -42 42s19 41 42 41zM0 397h68l19 -42h308c11 0 21 -9 21 -20c0 -4 -1 -8 -2 -10l-75 -129c-7 -14 -20 -22 -36 -22h-155l-21 -32s-2 -5 -2 -6c0 -3 2 -5 5 -5h238v-40h-243c-26 0 -45 14 -45 42c0 7 2 15 5 20l31 51
+l-74 151h-42v42zM326 70c23 0 42 -18 42 -41s-19 -42 -42 -42s-41 19 -41 42s18 41 41 41z" />
+ <glyph glyph-name="ion-android-chat" unicode="&#xf2d4;" horiz-adv-x="416"
+d="M344 384c4 0 7 -4 7 -8v-214c0 -4 -3 -9 -7 -9h-187l-90 -89v89h-57c-4 0 -10 5 -10 9v214c0 4 6 8 10 8h334zM408 321c4 0 8 -5 8 -9v-214c0 -4 -4 -9 -8 -9h-57v-89l-90 89h-130l39 39h181c18 0 25 10 25 26v167h32z" />
+ <glyph glyph-name="ion-android-checkbox-blank" unicode="&#xf371;" horiz-adv-x="384"
+d="M341 384c23 0 43 -20 43 -43v-298c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v298c0 23 20 43 43 43h298z" />
+ <glyph glyph-name="ion-android-checkbox-outline-blank" unicode="&#xf372;" horiz-adv-x="384"
+d="M341 341h-298v-298h298v298zM341 384v0c23 0 43 -20 43 -43v-298c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v298c0 23 20 43 43 43h298z" />
+ <glyph glyph-name="ion-android-checkbox-outline" unicode="&#xf373;" horiz-adv-x="384"
+d="M105 233l66 -66l183 183l30 -30l-213 -213l-96 96zM341 43v170h43v-170c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v298c0 23 20 43 43 43h213v-43h-213v-298h298z" />
+ <glyph glyph-name="ion-android-checkbox" unicode="&#xf374;" horiz-adv-x="384"
+d="M341 384c23 0 43 -20 43 -43v-298c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v298c0 23 20 43 43 43h298zM149 85l192 192l-30 30l-162 -162l-76 77l-30 -30z" />
+ <glyph glyph-name="ion-android-checkmark-circle" unicode="&#xf375;" horiz-adv-x="416"
+d="M123 232l64 -64l179 178l29 -29l-208 -208l-93 93zM374 192h42c0 -114 -94 -208 -208 -208s-208 94 -208 208s94 208 208 208c28 0 54 -6 78 -16l-32 -32c-15 4 -30 6 -46 6c-92 0 -166 -74 -166 -166s74 -166 166 -166s166 74 166 166z" />
+ <glyph glyph-name="ion-android-clipboard" unicode="&#xf376;" horiz-adv-x="384"
+d="M341 368c23 0 43 -20 43 -43v-314c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v314c0 23 20 43 43 43h87c7 28 32 48 62 48s55 -20 62 -48h87zM192 368c-12 0 -21 -9 -21 -21s9 -22 21 -22s21 10 21 22s-9 21 -21 21zM344 8v320h-40v-72h-224v72h-40v-320h304z" />
+ <glyph glyph-name="ion-android-close" unicode="&#xf2d7;" horiz-adv-x="298"
+d="M298 311l-119 -119l119 -119l-30 -30l-119 119l-119 -119l-30 30l119 119l-119 119l30 30l119 -119l119 119z" />
+ <glyph glyph-name="ion-android-cloud-circle" unicode="&#xf377;" horiz-adv-x="416"
+d="M208 400c114 0 208 -94 208 -208s-94 -208 -208 -208s-208 94 -208 208s94 208 208 208zM302 109c29 0 52 23 52 52s-23 52 -52 52h-11c0 46 -37 83 -83 83c-38 0 -71 -26 -80 -62h-3c-34 0 -63 -29 -63 -63s29 -62 63 -62h177z" />
+ <glyph glyph-name="ion-android-cloud-done" unicode="&#xf378;" horiz-adv-x="480"
+d="M387 231c52 -3 93 -46 93 -99c0 -55 -45 -100 -100 -100h-260c-66 0 -120 54 -120 120c0 62 47 113 107 119c25 48 75 81 133 81c73 0 133 -52 147 -121zM197 85l141 141l-30 30l-111 -111l-44 45l-30 -30z" />
+ <glyph glyph-name="ion-android-cloud-outline" unicode="&#xf379;" horiz-adv-x="480"
+d="M387 231c52 -3 93 -46 93 -99c0 -55 -45 -100 -100 -100h-260c-66 0 -120 54 -120 120c0 62 47 113 107 119c25 48 75 81 133 81c73 0 133 -52 147 -121zM380 72c33 0 60 27 60 60s-27 60 -60 60h-30v10c0 61 -49 110 -110 110c-51 0 -93 -34 -106 -80h-14
+c-44 0 -80 -36 -80 -80s36 -80 80 -80h260z" />
+ <glyph glyph-name="ion-android-cloud" unicode="&#xf37a;" horiz-adv-x="480"
+d="M387 231c52 -3 93 -46 93 -99c0 -55 -45 -100 -100 -100h-260c-66 0 -120 54 -120 120c0 62 47 113 107 119c25 48 75 81 133 81c73 0 133 -52 147 -121z" />
+ <glyph glyph-name="ion-android-color-palette" unicode="&#xf37b;" horiz-adv-x="384"
+d="M192 384c106 0 192 -77 192 -171c0 -59 -48 -106 -107 -106h-38c-18 0 -32 -14 -32 -32c0 -9 3 -17 8 -22s9 -12 9 -21c0 -18 -14 -32 -32 -32c-106 0 -192 86 -192 192s86 192 192 192zM75 192c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM139 277
+c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM245 277c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM309 192c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32z" />
+ <glyph glyph-name="ion-android-compass" unicode="&#xf37c;"
+d="M224 217c13 0 25 -12 25 -25s-12 -25 -25 -25s-25 12 -25 25s12 25 25 25zM224 416c123 0 224 -101 224 -224s-101 -224 -224 -224s-224 101 -224 224s101 224 224 224zM273 143l85 183l-183 -85l-85 -183z" />
+ <glyph glyph-name="ion-android-contact" unicode="&#xf2d8;" horiz-adv-x="384"
+d="M267 110c59 -18 104 -58 117 -110h-384c13 52 58 92 117 110c22 -13 48 -20 75 -20s53 7 75 20zM192 384c73 0 132 -59 132 -132s-59 -132 -132 -132s-132 59 -132 132s59 132 132 132zM192 153c42 0 78 26 92 63h-184c14 -37 50 -63 92 -63z" />
+ <glyph glyph-name="ion-android-contacts" unicode="&#xf2d9;"
+d="M207 104c47 -14 76 -62 87 -104h-294c11 42 40 90 87 104c18 -10 38 -16 60 -16s42 6 60 16zM147 328c58 0 106 -48 106 -106s-48 -106 -106 -106s-106 48 -106 106s48 106 106 106zM147 141c34 0 62 23 74 51h-148c12 -28 40 -51 74 -51zM291 64c-13 20 -34 43 -60 53
+c11 9 21 23 28 35c13 -5 27 -8 42 -8c22 0 42 6 60 16c47 -14 76 -54 87 -96h-157zM275 248c-8 37 -31 69 -63 87c19 29 52 49 89 49c58 0 106 -48 106 -106s-48 -106 -106 -106c-11 0 -22 2 -32 5c3 8 6 16 7 25c8 -3 16 -4 25 -4c34 0 62 22 74 50h-100z" />
+ <glyph glyph-name="ion-android-contract" unicode="&#xf37d;" horiz-adv-x="384"
+d="M0 77v51h128v-128h-51v77h-77zM77 307v77h51v-128h-128v51h77zM256 0v128h128v-51h-77v-77h-51zM307 307h77v-51h-128v128h51v-77z" />
+ <glyph glyph-name="ion-android-create" unicode="&#xf37e;" horiz-adv-x="384"
+d="M0 80l236 236l80 -80l-236 -236h-80v80zM378 298l-40 -40l-80 80l40 40c9 9 20 9 29 0l51 -51c9 -9 9 -20 0 -29z" />
+ <glyph glyph-name="ion-android-delete" unicode="&#xf37f;" horiz-adv-x="320"
+d="M32 43v245h256v-245c0 -23 -20 -43 -43 -43h-170c-23 0 -43 20 -43 43zM320 352v-32h-320v32h80l27 32h106l27 -32h80z" />
+ <glyph glyph-name="ion-android-desktop" unicode="&#xf380;"
+d="M405 416c23 0 43 -20 43 -43v-282c0 -23 -20 -43 -43 -43h-138l42 -48v-32h-170v32l42 48h-138c-23 0 -43 20 -43 43v282c0 23 20 43 43 43h362zM405 128v245h-362v-245h362z" />
+ <glyph glyph-name="ion-android-document" unicode="&#xf381;" horiz-adv-x="320"
+d="M192 400l128 -128v-248c0 -22 -18 -40 -40 -40h-240c-22 0 -40 18 -40 40v336c0 22 18 40 40 40h152zM176 256h112l-112 112v-112z" />
+ <glyph glyph-name="ion-android-done-all" unicode="&#xf382;" horiz-adv-x="512"
+d="M388 308l-140 -139l-31 31l140 139zM481 339l31 -31l-264 -263l-122 123l30 31l92 -91zM0 168l32 31l122 -123l-31 -31z" />
+ <glyph glyph-name="ion-android-done" unicode="&#xf383;" horiz-adv-x="384"
+d="M122 108l230 230l32 -31l-262 -261l-122 122l32 31z" />
+ <glyph glyph-name="ion-android-download" unicode="&#xf2dd;" horiz-adv-x="480"
+d="M387 231c52 -3 93 -46 93 -99c0 -55 -45 -100 -100 -100h-260c-66 0 -120 54 -120 120c0 62 47 113 107 119c25 48 75 81 133 81c73 0 133 -52 147 -121zM208 180h-68l100 -100l100 100h-68v76h-64v-76z" />
+ <glyph glyph-name="ion-android-drafts" unicode="&#xf384;"
+d="M448 246v-203c0 -23 -20 -43 -43 -43h-362c-23 0 -43 20 -43 43v203c0 15 8 30 20 37l204 101l204 -101c13 -7 20 -22 20 -37zM224 144l171 112l-171 85l-171 -85z" />
+ <glyph glyph-name="ion-android-exit" unicode="&#xf385;" horiz-adv-x="384"
+d="M151 115l55 56h-206v42h207l-56 56l30 30l107 -107l-107 -107zM341 384c23 0 43 -20 43 -43v-298c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v85h43v-85h298v298h-298v-85h-43v85c0 23 20 43 43 43h298z" />
+ <glyph glyph-name="ion-android-expand" unicode="&#xf386;" horiz-adv-x="384"
+d="M333 51v77h51v-128h-128v51h77zM333 333h-77v51h128v-128h-51v77zM51 333v-77h-51v128h128v-51h-77zM51 51h77v-51h-128v128h51v-77z" />
+ <glyph glyph-name="ion-android-favorite-outline" unicode="&#xf387;" horiz-adv-x="416"
+d="M302 384c64 0 114 -50 114 -115c0 -80 -71 -144 -178 -242l-30 -27l-30 27c-107 98 -178 162 -178 242c0 65 50 115 114 115c36 0 71 -17 94 -44c23 27 58 44 94 44zM221 55c50 46 94 86 123 122c28 35 40 63 40 92c0 23 -9 44 -24 59s-35 24 -58 24
+c-26 0 -53 -13 -70 -33l-24 -29l-24 29c-17 20 -44 33 -70 33c-23 0 -43 -9 -58 -24s-24 -36 -24 -59c0 -29 12 -57 40 -92c29 -36 73 -76 123 -122l4 -4l9 -8l9 8z" />
+ <glyph glyph-name="ion-android-favorite" unicode="&#xf388;" horiz-adv-x="416"
+d="M208 0l-30 27c-107 98 -178 162 -178 242c0 65 50 115 114 115c36 0 71 -17 94 -44c23 27 58 44 94 44c64 0 114 -50 114 -115c0 -80 -71 -144 -178 -242z" />
+ <glyph glyph-name="ion-android-film" unicode="&#xf389;" horiz-adv-x="320"
+d="M280 384h40v-384h-40v43h-40v-43h-160v43h-40v-43h-40v384h40v-43h40v43h160v-43h40v43zM80 85v43h-40v-43h40zM80 171v42h-40v-42h40zM80 256v43h-40v-43h40zM280 85v43h-40v-43h40zM280 171v42h-40v-42h40zM280 256v43h-40v-43h40z" />
+ <glyph glyph-name="ion-android-folder-open" unicode="&#xf38a;"
+d="M405 304c23 0 43 -20 43 -43v-186c0 -23 -20 -43 -43 -43h-362c-23 0 -43 20 -43 43v234c0 23 20 43 43 43h138l43 -48h181zM416 75v186c0 6 -5 11 -11 11h-373v-197c0 -6 5 -11 11 -11h362c6 0 11 5 11 11z" />
+ <glyph glyph-name="ion-android-folder" unicode="&#xf2e0;"
+d="M181 352l43 -48h181c23 0 43 -20 43 -43v-186c0 -23 -20 -43 -43 -43h-362c-23 0 -43 20 -43 43v234c0 23 20 43 43 43h138z" />
+ <glyph glyph-name="ion-android-funnel" unicode="&#xf38b;"
+d="M176 48v48h96v-48h-96zM0 336h448v-48h-448v48zM80 167v50h288v-50h-288z" />
+ <glyph glyph-name="ion-android-globe" unicode="&#xf38c;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM186 15c6 15 21 29 8 39c-8 7 -16 14 -23 21c-2 2 -11 20 -9 23c5 9 6 14 8 24c3 12 -3 16 -13 22c-15 10 -29 23 -43 34c-7 5 -17 10 -20 19s-5 20 -10 28c-14 20 -12 34 -10 58
+c0 7 -1 16 -2 25c-28 -32 -42 -73 -42 -116c0 -48 18 -92 52 -126c29 -29 65 -46 104 -51zM334 66c23 23 39 51 47 82c-8 -1 -19 2 -19 2s-21 24 -23 45c-2 22 0 39 -3 57c-3 16 -20 31 -27 46c-7 14 -13 28 -20 42c2 -1 5 -2 7 -3c5 1 10 2 14 2c-23 16 -49 25 -76 29v-8
+l4 -9l-14 -13l-9 3l-10 10l-10 12l-14 5c-16 -2 -31 -7 -45 -13v-7c7 3 16 5 23 8c3 1 13 -7 16 -9c-4 -5 -21 -15 -22 -21c0 -2 7 -6 7 -10c0 -6 -1 -11 -1 -17c3 3 20 21 22 21c13 3 35 -19 37 -26s-22 -24 -33 -34c-8 -8 -25 -12 -20 -24c2 -4 10 -20 5 -24
+c-6 -5 -14 9 -17 12c-8 10 -26 7 -38 7c0 -17 -1 -31 15 -43c15 -11 30 -25 47 -33c13 -6 36 7 47 -1c16 -11 29 -21 47 -29c8 -3 33 -20 26 -31c-5 -8 -10 -15 -14 -23s-13 -20 -20 -25c-8 -6 -16 -17 -21 -29c35 7 66 23 92 49z" />
+ <glyph glyph-name="ion-android-hand" unicode="&#xf2e3;" horiz-adv-x="414"
+d="M401 174c15 -15 18 -36 3 -51c0 0 -96 -103 -126 -121v0c-28 -21 -65 -34 -100 -34c-55 0 -101 36 -117 85v0v1c0 1 -1 2 -1 3l-58 189c-5 15 2 32 17 37s30 -3 35 -18l34 -88c1 -4 2 -2 2 1l-22 161c-3 15 7 30 22 33s30 -8 33 -23l25 -138c0 -2 2 -2 2 0v177
+c0 15 13 28 28 28s28 -13 28 -28l8 -175c0 -5 3 -4 4 -1l23 135c2 15 16 27 31 25s27 -17 25 -32l-21 -172c-1 -12 -3 -30 2 -36c8 -9 20 -9 31 2l42 42c15 15 35 13 50 -2z" />
+ <glyph glyph-name="ion-android-hangout" unicode="&#xf38d;" horiz-adv-x="352"
+d="M176 400c97 0 176 -77 176 -172c0 -91 -76 -196 -176 -244v71c-97 0 -176 78 -176 173s79 172 176 172zM166 217v61h-62v-61h31l-21 -40h31zM248 217v61h-62v-61h31l-20 -40h31z" />
+ <glyph glyph-name="ion-android-happy" unicode="&#xf38e;" horiz-adv-x="416"
+d="M208 400c114 0 208 -94 208 -208s-93 -208 -208 -208s-208 94 -208 208s93 208 208 208zM208 26c92 0 166 74 166 166s-74 166 -166 166s-166 -74 -166 -166s74 -166 166 -166zM281 213c-18 0 -31 13 -31 31s13 31 31 31s31 -13 31 -31s-13 -31 -31 -31zM135 213
+c-18 0 -31 13 -31 31s13 31 31 31s31 -13 31 -31s-13 -31 -31 -31zM208 78c-49 0 -89 29 -106 72h212c-17 -43 -57 -72 -106 -72z" />
+ <glyph glyph-name="ion-android-home" unicode="&#xf38f;" horiz-adv-x="416"
+d="M160 0h-98v192h-62l208 192l208 -192h-62v-192h-98v128h-96v-128z" />
+ <glyph glyph-name="ion-android-image" unicode="&#xf2e4;" horiz-adv-x="384"
+d="M384 43c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v298c0 23 20 43 43 43h298c23 0 43 -20 43 -43v-298zM117 160l-74 -96h298l-96 128l-74 -96z" />
+ <glyph glyph-name="ion-android-laptop" unicode="&#xf390;" horiz-adv-x="512"
+d="M437 32h75c0 -23 -64 -32 -96 -32h-320c-32 0 -96 9 -96 32h75c-23 0 -43 20 -43 43v266c0 23 20 43 43 43h362c23 0 43 -20 43 -43v-266c0 -23 -20 -43 -43 -43zM75 341v-272h362v272h-362zM256 13c12 0 21 10 21 22s-9 21 -21 21s-21 -9 -21 -21s9 -22 21 -22z" />
+ <glyph glyph-name="ion-android-list" unicode="&#xf391;" horiz-adv-x="384"
+d="M344 384c22 0 40 -18 40 -40v-304c0 -22 -18 -40 -40 -40h-304c-22 0 -40 18 -40 40v304c0 22 18 40 40 40h304zM240 80v48h-160v-48h160zM304 168v48h-224v-48h224zM304 256v48h-224v-48h224z" />
+ <glyph glyph-name="ion-android-locate" unicode="&#xf2e9;"
+d="M224 272c44 0 80 -36 80 -80s-36 -80 -80 -80s-80 36 -80 80s36 80 80 80zM415 213h33v-42h-33c-10 -89 -81 -160 -170 -170v-33h-42v33c-89 10 -160 81 -170 170h-33v42h33c10 89 81 160 170 170v33h42v-33c89 -10 160 -81 170 -170zM224 43c82 0 149 67 149 149
+s-67 149 -149 149s-149 -67 -149 -149s67 -149 149 -149z" />
+ <glyph glyph-name="ion-android-lock" unicode="&#xf392;" horiz-adv-x="320"
+d="M280 262c22 0 40 -18 40 -40v-200c0 -22 -18 -40 -40 -40h-240c-22 0 -40 18 -40 40v200c0 22 18 40 40 40h20v40c0 55 45 100 100 100s100 -45 100 -100v-40h20zM160 80c22 0 40 18 40 40s-18 40 -40 40s-40 -18 -40 -40s18 -40 40 -40zM222 262v40c0 34 -28 62 -62 62
+s-62 -28 -62 -62v-40h124z" />
+ <glyph glyph-name="ion-android-mail" unicode="&#xf2eb;"
+d="M405 368c23 0 43 -20 43 -43v-266c0 -23 -20 -43 -43 -43h-362c-23 0 -43 20 -43 43v266c0 23 20 43 43 43h362zM400 277v43l-176 -117l-176 117v-43l176 -117z" />
+ <glyph glyph-name="ion-android-map" unicode="&#xf393;" horiz-adv-x="384"
+d="M373 384c6 0 11 -5 11 -11v-322c0 -5 -3 -9 -7 -10l-121 -41l-128 45s-105 -41 -108 -42s-7 -3 -9 -3c-6 0 -11 5 -11 11v322c0 5 3 9 7 10l121 41l128 -45s103 40 108 42s7 3 9 3zM256 43v254l-128 44v-254z" />
+ <glyph glyph-name="ion-android-menu" unicode="&#xf394;" horiz-adv-x="384"
+d="M0 64v43h384v-43h-384zM0 171v42h384v-42h-384zM0 320h384v-43h-384v43z" />
+ <glyph glyph-name="ion-android-microphone-off" unicode="&#xf395;" horiz-adv-x="408"
+d="M316 93l58 -58l-58 58l58 -58l34 -33l-24 -24l-95 95c-19 -11 -40 -20 -62 -23v-82h-46v82c-75 10 -137 76 -137 153h39c0 -68 58 -117 121 -117c20 0 40 5 57 14l-32 33c-8 -3 -16 -5 -25 -5c-38 0 -69 31 -69 69v29l-135 134l24 24l111 -110v0l140 -140l5 -5l9 -9z
+M273 197c0 -4 0 -8 -1 -12l-137 137v25c0 38 31 69 69 69s69 -31 69 -69v-150zM365 203c0 -31 -10 -60 -27 -84l-27 28c9 17 15 36 15 56h39zM408 2v0l-34 33z" />
+ <glyph glyph-name="ion-android-microphone" unicode="&#xf2ec;" horiz-adv-x="320"
+d="M160 128c-38 0 -69 31 -69 69v150c0 38 31 69 69 69s69 -31 69 -69v-150c0 -38 -31 -69 -69 -69zM281 203h39c0 -78 -62 -142 -137 -153v-82h-46v82c-75 10 -137 75 -137 153h39c0 -69 58 -116 121 -116s121 47 121 116z" />
+ <glyph glyph-name="ion-android-more-horizontal" unicode="&#xf396;" horiz-adv-x="320"
+d="M40 232c22 0 40 -18 40 -40s-18 -40 -40 -40s-40 18 -40 40s18 40 40 40zM280 232c22 0 40 -18 40 -40s-18 -40 -40 -40s-40 18 -40 40s18 40 40 40zM160 232c22 0 40 -18 40 -40s-18 -40 -40 -40s-40 18 -40 40s18 40 40 40z" />
+ <glyph glyph-name="ion-android-more-vertical" unicode="&#xf397;" horiz-adv-x="80"
+d="M80 312c0 -22 -18 -40 -40 -40s-40 18 -40 40s18 40 40 40s40 -18 40 -40zM80 72c0 -22 -18 -40 -40 -40s-40 18 -40 40s18 40 40 40s40 -18 40 -40zM80 192c0 -22 -18 -40 -40 -40s-40 18 -40 40s18 40 40 40s40 -18 40 -40z" />
+ <glyph glyph-name="ion-android-navigate" unicode="&#xf398;" horiz-adv-x="320"
+d="M160 384l160 -369l-15 -15l-145 64l-145 -64l-15 15z" />
+ <glyph glyph-name="ion-android-notifications-none" unicode="&#xf399;" horiz-adv-x="352"
+d="M177 328h-2c-6 0 -24 -5 -24 -5c-46 -10 -78 -53 -78 -100v-114v-13l-9 -10l-8 -8h240l-8 8l-9 10v13v114c0 47 -32 90 -78 100c0 0 -17 5 -24 5zM176 400v0c18 0 31 -13 31 -31v-15c59 -14 104 -68 104 -131v-114l41 -42v-21h-352v21l41 42v114c0 63 45 117 104 131v15
+c0 18 13 31 31 31zM217 26v0c0 -23 -18 -42 -41 -42s-41 19 -41 42h82z" />
+ <glyph glyph-name="ion-android-notifications-off" unicode="&#xf39a;" horiz-adv-x="364"
+d="M182 -16c-23 0 -41 19 -41 42h82c0 -23 -18 -42 -41 -42zM57 341l295 -295v0l12 -12l-24 -24l-36 36h-298v21l41 41v115c0 23 6 44 16 63l-63 64l24 24l33 -33v0zM317 223v-94l-208 207c13 8 27 15 42 18v15c0 18 13 31 31 31s31 -13 31 -31v-15c59 -14 104 -67 104 -131
+z" />
+ <glyph glyph-name="ion-android-notifications" unicode="&#xf39b;" horiz-adv-x="352"
+d="M176 -16c-23 0 -41 19 -41 42h82c0 -23 -18 -42 -41 -42zM311 109l41 -42v-21h-352v21l41 42v114c0 63 45 117 104 131v15c0 18 13 31 31 31s31 -13 31 -31v-15c59 -14 104 -68 104 -131v-114z" />
+ <glyph glyph-name="ion-android-open" unicode="&#xf39c;" horiz-adv-x="384"
+d="M341 43v133h43v-133c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v298c0 23 20 43 43 43h133v-43h-133v-298h298zM224 384h160v-160h-43v87l-215 -215l-30 30l215 215h-87v43z" />
+ <glyph glyph-name="ion-android-options" unicode="&#xf39d;"
+d="M0 32v32h272v-32h-272zM368 32v32h80v-32h-80zM352 0c0 -18 -14 -32 -32 -32v0c-18 0 -32 14 -32 32v96c0 18 14 32 32 32v0c18 0 32 -14 32 -32v-96zM0 176v32h80v-32h-80zM176 176v32h272v-32h-272zM160 144c0 -18 -14 -32 -32 -32v0c-18 0 -32 14 -32 32v96
+c0 18 14 32 32 32v0c18 0 32 -14 32 -32v-96zM0 320v32h272v-32h-272zM368 320v32h80v-32h-80zM352 288c0 -18 -14 -32 -32 -32v0c-18 0 -32 14 -32 32v96c0 18 14 32 32 32v0c18 0 32 -14 32 -32v-96z" />
+ <glyph glyph-name="ion-android-people" unicode="&#xf39e;"
+d="M305 216c-34 0 -61 27 -61 60s27 60 61 60s62 -27 62 -60s-28 -60 -62 -60zM143 216c-34 0 -62 27 -62 60s28 60 62 60s61 -27 61 -60s-27 -60 -61 -60zM143 172c48 0 145 -23 145 -70v-54h-288v54c0 47 95 70 143 70zM305 161c48 0 143 -12 143 -59v-54h-128v54
+c0 30 -9 41 -32 58c7 1 11 1 17 1z" />
+ <glyph glyph-name="ion-android-person-add" unicode="&#xf39f;" horiz-adv-x="480"
+d="M288 192c-53 0 -96 43 -96 96s43 96 96 96s96 -43 96 -96s-43 -96 -96 -96zM288 144c64 0 192 -32 192 -96v-48h-384v48c0 64 128 96 192 96zM96 224h64v-32h-64v-64h-32v64h-64v32h64v64h32v-64z" />
+ <glyph glyph-name="ion-android-person" unicode="&#xf3a0;" horiz-adv-x="384"
+d="M192 192c-53 0 -96 43 -96 96s43 96 96 96s96 -43 96 -96s-43 -96 -96 -96zM192 144c64 0 192 -32 192 -96v-48h-384v48c0 64 128 96 192 96z" />
+ <glyph glyph-name="ion-android-phone-landscape" unicode="&#xf3a1;"
+d="M448 89c0 -23 -19 -41 -41 -41h-366c-22 0 -41 18 -41 41v206c0 23 19 41 41 41h366c22 0 41 -18 41 -41v-206zM80 84h288v216h-288v-216z" />
+ <glyph glyph-name="ion-android-phone-portrait" unicode="&#xf3a2;" horiz-adv-x="288"
+d="M247 416c23 0 41 -19 41 -41v-366c0 -22 -18 -41 -41 -41h-206c-23 0 -41 19 -41 41v366c0 22 18 41 41 41h206zM252 48v288h-216v-288h216z" />
+ <glyph glyph-name="ion-android-pin" unicode="&#xf3a3;" horiz-adv-x="320"
+d="M160 416c88 0 160 -71 160 -157c0 -118 -160 -291 -160 -291s-160 173 -160 291c0 86 72 157 160 157zM160 203c32 0 57 25 57 56s-25 56 -57 56s-57 -25 -57 -56s25 -56 57 -56z" />
+ <glyph glyph-name="ion-android-plane" unicode="&#xf3a4;" horiz-adv-x="384"
+d="M384 112l-160 48v-114l48 -31v-31l-80 16l-80 -16v31l48 31v114l-160 -48v40l160 104v113c0 18 15 31 32 31s32 -13 32 -31v-113l160 -104v-40z" />
+ <glyph glyph-name="ion-android-playstore" unicode="&#xf2f0;" horiz-adv-x="416"
+d="M416 296c-19 -214 -13 -312 -13 -312h-390s6 96 -13 312h104c0 57 47 104 104 104s104 -47 104 -104h104zM208 374c-43 0 -78 -35 -78 -78h156c0 43 -35 78 -78 78zM156 50l143 85l-143 84v-169z" />
+ <glyph glyph-name="ion-android-print" unicode="&#xf3a5;" horiz-adv-x="416"
+d="M352 288c35 0 64 -29 64 -64v-139h-80v-85h-256v85h-80v139c0 35 29 64 64 64h288zM304 32v128h-192v-128h192zM336 384v0v-80h-256v80h256z" />
+ <glyph glyph-name="ion-android-radio-button-off" unicode="&#xf3a6;" horiz-adv-x="416"
+d="M208 400c114 0 208 -94 208 -208s-94 -208 -208 -208s-208 94 -208 208s94 208 208 208zM208 26c92 0 166 74 166 166s-74 166 -166 166s-166 -74 -166 -166s74 -166 166 -166z" />
+ <glyph glyph-name="ion-android-radio-button-on" unicode="&#xf3a7;" horiz-adv-x="416"
+d="M208 296c57 0 104 -47 104 -104s-47 -104 -104 -104s-104 47 -104 104s47 104 104 104zM208 400c114 0 208 -94 208 -208s-94 -208 -208 -208s-208 94 -208 208s94 208 208 208zM208 26c92 0 166 74 166 166s-74 166 -166 166s-166 -74 -166 -166s74 -166 166 -166z" />
+ <glyph glyph-name="ion-android-refresh" unicode="&#xf3a8;" horiz-adv-x="352"
+d="M176 60c56 0 104 34 123 84h46c-21 -74 -88 -128 -169 -128c-98 0 -176 79 -176 176s79 176 176 176c48 0 92 -20 124 -52l52 52v-154h-154l70 70c-23 24 -56 40 -92 40c-73 0 -132 -59 -132 -132s59 -132 132 -132z" />
+ <glyph glyph-name="ion-android-remove-circle" unicode="&#xf3a9;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM315 171v42h-214v-42h214z" />
+ <glyph glyph-name="ion-android-remove" unicode="&#xf2f4;" horiz-adv-x="320"
+d="M0 171v42h320v-42h-320z" />
+ <glyph glyph-name="ion-android-restaurant" unicode="&#xf3aa;" horiz-adv-x="415"
+d="M116 168l-91 89c-34 33 -34 86 0 119l153 -148zM264 206l-33 -31l150 -145l-30 -30l-150 146l-150 -146l-30 30s163 159 211 207c-15 32 -4 77 31 111c41 40 101 49 132 17c33 -31 24 -89 -17 -129c-34 -34 -80 -45 -114 -30z" />
+ <glyph glyph-name="ion-android-sad" unicode="&#xf3ab;" horiz-adv-x="416"
+d="M208 160c45 0 83 -26 102 -64h-204c19 38 57 64 102 64zM208 400c114 0 208 -94 208 -208s-93 -208 -208 -208s-208 94 -208 208s93 208 208 208zM208 26c92 0 166 74 166 166s-74 166 -166 166s-166 -74 -166 -166s74 -166 166 -166zM281 213c-18 0 -31 13 -31 31
+s13 31 31 31s31 -13 31 -31s-13 -31 -31 -31zM135 213c-18 0 -31 13 -31 31s13 31 31 31s31 -13 31 -31s-13 -31 -31 -31z" />
+ <glyph glyph-name="ion-android-search" unicode="&#xf2f5;" horiz-adv-x="384"
+d="M274 143l110 -110l-33 -33l-109 110v17l-7 6c-25 -21 -58 -34 -93 -34c-79 0 -142 63 -142 142s63 143 141 143c79 0 142 -64 142 -143c0 -36 -13 -68 -34 -93l7 -5h18zM142 143c55 0 99 43 99 98s-44 99 -99 99s-98 -44 -98 -99s43 -98 98 -98z" />
+ <glyph glyph-name="ion-android-send" unicode="&#xf2f6;" horiz-adv-x="416"
+d="M0 0v149l298 43l-298 43v149l416 -192z" />
+ <glyph glyph-name="ion-android-settings" unicode="&#xf2f7;" horiz-adv-x="416"
+d="M366 171l47 -34c3 -3 4 -10 2 -14l-43 -71c-2 -4 -7 -7 -12 -5l-54 21c-12 -8 -23 -16 -36 -21l-8 -55c-1 -4 -6 -8 -11 -8h-85c-5 0 -10 3 -11 8l-8 55c-13 5 -25 13 -36 21l-54 -21c-4 -2 -10 1 -12 5l-43 71c-3 5 -2 11 2 14l45 34c0 7 -1 14 -1 21s1 14 1 21l-46 34
+c-3 3 -4 10 -2 14l43 71c2 4 7 7 12 5l54 -21c12 8 23 16 36 21l8 55c1 4 6 8 11 8h85c5 0 10 -4 11 -8l7 -55c13 -5 25 -13 36 -21l53 21c4 2 11 -1 13 -5l43 -71c3 -5 2 -11 -2 -14l-45 -34c0 -7 1 -14 1 -21s0 -15 -1 -21zM207 119c41 0 75 32 75 73s-34 73 -75 73
+s-74 -32 -74 -73s33 -73 74 -73z" />
+ <glyph glyph-name="ion-android-share-alt" unicode="&#xf3ac;" horiz-adv-x="384"
+d="M320 104c34 0 62 -28 62 -62s-28 -62 -62 -62s-62 28 -62 62c0 5 1 10 2 14l-152 88c-12 -11 -27 -17 -44 -17c-35 0 -64 29 -64 64s28 64 63 64c17 0 32 -6 44 -17l151 87c-1 5 -2 10 -2 15c0 35 29 64 64 64s64 -29 64 -64s-29 -64 -64 -64c-17 0 -32 6 -44 17
+l-151 -87c1 -5 2 -10 2 -15s-1 -10 -2 -15l153 -88c11 11 26 16 42 16z" />
+ <glyph glyph-name="ion-android-share" unicode="&#xf2f8;" horiz-adv-x="384"
+d="M384 200l-160 -147v88c-107 0 -171 -34 -224 -109c21 107 75 214 224 235v85z" />
+ <glyph glyph-name="ion-android-star-half" unicode="&#xf3ad;" horiz-adv-x="404"
+d="M404 238l-110 -96l33 -142l-125 75l-125 -75l33 142l-110 96l145 12l57 134l57 -134zM219 103l60 -36l-16 68l-5 19l15 12l53 46l-70 6l-19 2l-8 18l-27 64v-189z" />
+ <glyph glyph-name="ion-android-star-outline" unicode="&#xf3ae;" horiz-adv-x="404"
+d="M404 238l-110 -96l33 -142l-125 75l-125 -75l33 142l-110 96l145 12l57 134l57 -134zM219 103l60 -36l-16 68l-5 19l15 12l53 46l-70 6l-19 2l-8 18l-27 64l-27 -64l-8 -18l-19 -2l-70 -6l53 -46l15 -12l-5 -19l-16 -68l60 36l17 10z" />
+ <glyph glyph-name="ion-android-star" unicode="&#xf2fc;" horiz-adv-x="404"
+d="M202 75l-125 -75l33 142l-110 96l145 12l57 134l57 -134l145 -12l-110 -96l33 -142z" />
+ <glyph glyph-name="ion-android-stopwatch" unicode="&#xf2fd;" horiz-adv-x="384"
+d="M168 141v131h48v-131h-48zM344 278c25 -33 40 -74 40 -118c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192c44 0 85 -15 118 -40l31 30l33 -33zM298 54c28 28 44 66 44 106s-16 78 -44 106s-66 44 -106 44s-78 -16 -106 -44s-44 -66 -44 -106
+s16 -78 44 -106s66 -44 106 -44s78 16 106 44zM128 368v48h128v-48h-128z" />
+ <glyph glyph-name="ion-android-subway" unicode="&#xf3af;" horiz-adv-x="352"
+d="M176 400c94 0 176 -10 176 -85v-214c0 -42 -33 -74 -75 -74l27 -27v-16h-256v16l27 27c-42 0 -75 32 -75 74v214c0 75 82 85 176 85zM80 64c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM160 208v96h-112v-96h112zM272 64c18 0 32 14 32 32
+s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM304 208v96h-112v-96h112z" />
+ <glyph glyph-name="ion-android-sunny" unicode="&#xf3b0;"
+d="M224 288c-25 0 -50 -10 -68 -28s-28 -43 -28 -68s10 -50 28 -68s43 -28 68 -28s50 10 68 28s28 43 28 68s-10 50 -28 68s-43 28 -68 28zM245 416v0v-64h-42v64h42zM374 372v0l30 -30l-38 -38l-30 30zM74 372v0l38 -38l-30 -30l-38 38zM224 320v0c70 0 128 -58 128 -128
+s-58 -128 -128 -128s-128 58 -128 128s58 128 128 128zM448 213v0v-42h-64v42h64zM64 213v0v-42h-64v42h64zM366 80v0l38 -38l-30 -30l-38 38zM82 80v0l30 -30l-38 -38l-30 30zM245 32v0v-64h-42v64h42z" />
+ <glyph glyph-name="ion-android-sync" unicode="&#xf3b1;" horiz-adv-x="320"
+d="M160 355c88 0 160 -73 160 -163c0 -32 -9 -62 -25 -87l-29 30c9 17 14 37 14 57c0 67 -54 122 -120 122v-61l-80 82l80 81v-61zM160 70v61l80 -82l-80 -81v61c-88 0 -160 73 -160 163c0 32 9 63 25 87l29 -30c-9 -17 -14 -37 -14 -57c0 -67 54 -122 120 -122z" />
+ <glyph glyph-name="ion-android-textsms" unicode="&#xf3b2;" horiz-adv-x="384"
+d="M344 384c22 0 40 -18 40 -40v-240c0 -22 -18 -40 -40 -40h-280l-64 -64v344c0 22 10 40 32 40h312zM134 206v40h-38v-40h38zM211 206v40h-38v-40h38zM288 206v40h-38v-40h38z" />
+ <glyph glyph-name="ion-android-time" unicode="&#xf3b3;" horiz-adv-x="426"
+d="M213 405c117 0 213 -96 213 -213s-95 -213 -213 -213s-213 96 -213 213s95 213 213 213zM213 22c94 0 170 76 170 170s-76 170 -170 170s-170 -76 -170 -170s76 -170 170 -170zM224 298v-111l96 -57l-16 -26l-112 67v127h32z" />
+ <glyph glyph-name="ion-android-train" unicode="&#xf3b4;" horiz-adv-x="352"
+d="M0 101v214c0 75 82 85 176 85s176 -10 176 -85v-214c0 -42 -33 -74 -75 -74l27 -27v-16h-256v16l27 27c-42 0 -75 32 -75 74zM176 72c22 0 40 18 40 40s-18 40 -40 40s-40 -18 -40 -40s18 -40 40 -40zM304 224v96h-256v-96h256z" />
+ <glyph glyph-name="ion-android-unlock" unicode="&#xf3b5;" horiz-adv-x="320"
+d="M280 262c22 0 40 -18 40 -40v-200c0 -22 -18 -40 -40 -40h-240c-22 0 -40 18 -40 40v200c0 22 18 40 40 40h182v40v0c0 34 -28 62 -62 62s-62 -28 -62 -62h-38c0 55 45 100 100 100s100 -45 100 -100v-40h20zM160 80c22 0 40 18 40 40s-18 40 -40 40s-40 -18 -40 -40
+s18 -40 40 -40z" />
+ <glyph glyph-name="ion-android-upload" unicode="&#xf3b6;" horiz-adv-x="480"
+d="M387 231c52 -3 93 -46 93 -99c0 -55 -45 -100 -100 -100h-260c-66 0 -120 54 -120 120c0 62 47 113 107 119c25 48 75 81 133 81c73 0 133 -52 147 -121zM272 172h68l-100 100l-100 -100h68v-76h64v76z" />
+ <glyph glyph-name="ion-android-volume-down" unicode="&#xf3b7;" horiz-adv-x="288"
+d="M0 256h85l107 112v-352l-107 112h-85v128zM288 192c0 -38 -21 -73 -53 -88v177c32 -16 53 -51 53 -89z" />
+ <glyph glyph-name="ion-android-volume-mute" unicode="&#xf3b8;" horiz-adv-x="192"
+d="M0 256h85l107 112v-352l-107 112h-85v128z" />
+ <glyph glyph-name="ion-android-volume-off" unicode="&#xf3b9;" horiz-adv-x="384"
+d="M342 192c0 69 -45 128 -107 147v45c85 -20 149 -99 149 -192c0 -35 -8 -68 -24 -96l-32 32c9 19 14 41 14 64zM192 368v-104l-51 51zM357 51v0l24 -24l-24 -24l-40 40c-23 -21 -51 -36 -82 -43v45c19 6 37 15 52 28l-95 95v-152l-107 112h-85v128h85l9 10l-91 91l24 24z
+M288 192c0 -7 0 -15 -2 -22l-51 51v60c32 -16 53 -51 53 -89z" />
+ <glyph glyph-name="ion-android-volume-up" unicode="&#xf3ba;" horiz-adv-x="384"
+d="M0 256h85l107 112v-352l-107 112h-85v128zM288 192c0 -38 -21 -73 -53 -88v177c32 -16 53 -51 53 -89zM235 384c85 -20 149 -99 149 -192s-64 -172 -149 -192v45c62 19 106 78 106 147s-44 128 -106 147v45z" />
+ <glyph glyph-name="ion-android-walk" unicode="&#xf3bb;" horiz-adv-x="272"
+d="M168 336c-22 0 -40 18 -40 40s18 40 40 40s40 -18 40 -40s-18 -40 -40 -40zM168 216l-20 38l-20 -62l57 -96v-128h-38v96l-50 68l-57 -164h-40l81 320l-41 -16v-80h-40v112l111 38c4 1 10 1 13 1c13 0 23 -6 31 -18l45 -69h72v-40h-104z" />
+ <glyph glyph-name="ion-android-warning" unicode="&#xf3bc;"
+d="M0 -16l224 416l224 -416h-448zM248 48v48h-48v-48h48zM248 128v96h-48v-96h48z" />
+ <glyph glyph-name="ion-android-watch" unicode="&#xf3bd;" horiz-adv-x="320"
+d="M320 192c0 -51 -24 -96 -61 -125l-19 -115h-160l-19 115c-37 29 -61 74 -61 125s24 96 61 125l19 115h160l19 -115c37 -29 61 -74 61 -125zM40 192c0 -66 54 -120 120 -120s120 54 120 120s-54 120 -120 120s-120 -54 -120 -120z" />
+ <glyph glyph-name="ion-android-wifi" unicode="&#xf305;" horiz-adv-x="416"
+d="M208 219c23 0 42 -18 42 -41s-19 -41 -42 -41s-42 18 -42 41s19 41 42 41zM333 178c0 -45 -26 -85 -63 -107l-20 36c25 14 41 40 41 71c0 45 -37 82 -83 82s-83 -37 -83 -82c0 -31 16 -57 41 -71l-20 -36c-37 22 -63 62 -63 107c0 68 56 124 125 124s125 -56 125 -124z
+M208 384c114 0 208 -93 208 -206c0 -76 -42 -142 -104 -178l-21 36c50 28 83 81 83 142c0 91 -74 165 -166 165s-166 -74 -166 -165c0 -61 33 -113 83 -142l-21 -36c-62 36 -104 102 -104 178c0 113 94 206 208 206z" />
+ <glyph glyph-name="ion-aperture" unicode="&#xf313;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c36 36 56 85 56 136s-20 100 -56 136s-85 56 -136 56s-100 -20 -136 -56s-56 -85 -56 -136s20 -100 56 -136s85 -56 136 -56s100 20 136 56zM168 342l56 -86h-147
+c17 40 50 71 91 86zM381 160h-102l72 129c21 -27 33 -60 33 -97c0 -11 -1 -22 -3 -32zM328 314l-49 -90l-78 126c8 1 15 2 23 2c40 0 76 -14 104 -38zM67 224h102l-72 -129c-21 27 -33 60 -33 97c0 11 1 22 3 32zM280 42l-56 86h147c-17 -40 -50 -71 -91 -86zM120 70l49 90
+l78 -126c-8 -1 -15 -2 -23 -2c-40 0 -76 14 -104 38z" />
+ <glyph glyph-name="ion-archive" unicode="&#xf102;"
+d="M224 140l-128 116h80v96h96v-96h80zM433 151c11 -6 17 -19 15 -32l-9 -67c-2 -13 -9 -20 -28 -20h-374c-18 0 -26 7 -28 20l-9 67c-2 13 3 26 14 32l72 55h42l-62 -62h50c2 0 5 -1 6 -3l18 -45h168l18 45c1 2 3 3 5 3h51l-62 62h42z" />
+ <glyph glyph-name="ion-arrow-down-a" unicode="&#xf103;" horiz-adv-x="384"
+d="M192 -0l-192 192h112v192h160v-192h112z" />
+ <glyph glyph-name="ion-arrow-down-b" unicode="&#xf104;" horiz-adv-x="320"
+d="M3 263c-2 2 -3 6 -3 9c0 9 8 16 17 16v0h286v0c9 0 17 -7 17 -16c0 -3 -1 -6 -3 -8l-2 -3l-136 -156c-5 -5 -11 -9 -19 -9s-14 4 -19 9l-136 156z" />
+ <glyph glyph-name="ion-arrow-down-c" unicode="&#xf105;" horiz-adv-x="274"
+d="M265 125l-105 -100c-6 -6 -14 -9 -23 -9s-16 3 -22 9l-106 100c-12 12 -12 31 0 43s34 12 46 0l50 -48v217c0 17 14 31 32 31s32 -14 32 -31v-217l50 48c12 12 34 12 46 0s12 -31 0 -43z" />
+ <glyph glyph-name="ion-arrow-expand" unicode="&#xf25e;" horiz-adv-x="320"
+d="M178 238l64 64l-50 50h128v-128l-50 50l-64 -64zM178 146l28 28l64 -64l50 50v-128h-128l50 50zM142 146l-64 -64l50 -50h-128v128l50 -50l64 64zM142 238l-28 -28l-64 64l-50 -50v128h128l-50 -50z" />
+ <glyph glyph-name="ion-arrow-graph-down-left" unicode="&#xf25f;"
+d="M0 64v160l61 -61l131 141l107 -112l149 128l-149 -203l-107 107l-94 -98l62 -62h-160z" />
+ <glyph glyph-name="ion-arrow-graph-down-right" unicode="&#xf260;"
+d="M288 64l62 62l-94 98l-107 -107l-149 203l149 -128l107 112l131 -141l61 61v-160h-160z" />
+ <glyph glyph-name="ion-arrow-graph-up-left" unicode="&#xf261;"
+d="M160 320l-62 -62l94 -98l107 107l149 -203l-149 128l-107 -112l-131 141l-61 -61v160h160z" />
+ <glyph glyph-name="ion-arrow-graph-up-right" unicode="&#xf262;"
+d="M288 320h160v-160l-61 61l-131 -141l-107 112l-149 -128l149 203l107 -107l94 98z" />
+ <glyph glyph-name="ion-arrow-left-a" unicode="&#xf106;" horiz-adv-x="384"
+d="M0 192l192 192v-112h192v-160h-192v-112z" />
+ <glyph glyph-name="ion-arrow-left-b" unicode="&#xf107;" horiz-adv-x="192"
+d="M167 349c2 2 6 3 9 3c9 0 16 -8 16 -17v0v-286v0c0 -9 -7 -17 -16 -17c-3 0 -7 1 -9 3l-2 2l-156 136c-5 5 -9 11 -9 19s4 14 9 19l156 136z" />
+ <glyph glyph-name="ion-arrow-left-c" unicode="&#xf108;" horiz-adv-x="352"
+d="M109 320c12 12 32 12 44 0s12 -34 0 -46l-49 -50h217c17 0 31 -14 31 -32s-14 -32 -31 -32h-217l48 -50c12 -12 12 -34 0 -46s-31 -12 -43 0l-100 106c-6 6 -9 13 -9 22s3 17 9 23z" />
+ <glyph glyph-name="ion-arrow-move" unicode="&#xf263;"
+d="M448 192l-96 -96v76h-109l1 -108h76l-96 -96l-96 96h76v108h-108v-76l-96 96l96 96v-76h108v108h-76l96 96l96 -96h-76v-108h108v76z" />
+ <glyph glyph-name="ion-arrow-resize" unicode="&#xf264;" horiz-adv-x="320"
+d="M192 352h128v-128l-50 50l-9 -9l-183 -183l50 -50h-128v128l50 -50l128 128v0l64 64z" />
+ <glyph glyph-name="ion-arrow-return-left" unicode="&#xf265;" horiz-adv-x="384"
+d="M128 352v-64h248c4 0 8 -4 8 -8v-240c0 -4 -4 -8 -8 -8h-304c-4 0 -8 4 -8 8v48c0 4 4 8 8 8h248v128h-192v-64l-128 96z" />
+ <glyph glyph-name="ion-arrow-return-right" unicode="&#xf266;" horiz-adv-x="384"
+d="M384 256l-128 -96v64h-192v-128h248c4 0 8 -4 8 -8v-48c0 -4 -4 -8 -8 -8h-304c-4 0 -8 4 -8 8v240c0 4 4 8 8 8h248v64z" />
+ <glyph glyph-name="ion-arrow-right-a" unicode="&#xf109;" horiz-adv-x="384"
+d="M384 192l-192 -192v112h-192v160h192v112z" />
+ <glyph glyph-name="ion-arrow-right-b" unicode="&#xf10a;" horiz-adv-x="192"
+d="M25 35c-2 -2 -6 -3 -9 -3c-9 0 -16 8 -16 17v0v286v0c0 9 7 17 16 17c3 0 6 -1 8 -3l3 -2l156 -136c5 -5 9 -11 9 -19s-4 -14 -9 -19l-156 -136z" />
+ <glyph glyph-name="ion-arrow-right-c" unicode="&#xf10b;" horiz-adv-x="352"
+d="M243 320l100 -105c6 -6 9 -14 9 -23s-3 -16 -9 -22l-100 -106c-12 -12 -31 -12 -43 0s-12 34 0 46l48 50h-217c-17 0 -31 14 -31 32s14 32 31 32h217l-49 50c-12 12 -12 34 0 46s32 12 44 0z" />
+ <glyph glyph-name="ion-arrow-shrink" unicode="&#xf267;" horiz-adv-x="384"
+d="M384 356l-82 -82l50 -50h-128v128l50 -50l82 82zM384 28l-28 -28l-82 82l-50 -50v128h128l-50 -50zM0 28l82 82l-50 50h128v-128l-50 50l-82 -82zM0 356l28 28l82 -82l50 50v-128h-128l50 50z" />
+ <glyph glyph-name="ion-arrow-swap" unicode="&#xf268;" horiz-adv-x="384"
+d="M0 120c0 4 4 8 8 8h248v64l128 -96l-128 -96v64h-248c-4 0 -8 4 -8 8v48zM384 264c0 -4 -4 -8 -8 -8h-248v-64l-128 96l128 96v-64h248c4 0 8 -4 8 -8v-48z" />
+ <glyph glyph-name="ion-arrow-up-a" unicode="&#xf10c;" horiz-adv-x="384"
+d="M192 384l192 -192h-112v-192h-160v192h-112z" />
+ <glyph glyph-name="ion-arrow-up-b" unicode="&#xf10d;" horiz-adv-x="320"
+d="M317 121c2 -2 3 -6 3 -9c0 -9 -8 -16 -17 -16v0h-286v0c-9 0 -17 7 -17 16c0 3 1 6 3 8l2 3l136 156c5 5 11 9 19 9s14 -4 19 -9l136 -156z" />
+ <glyph glyph-name="ion-arrow-up-c" unicode="&#xf10e;" horiz-adv-x="274"
+d="M9 259l105 100c6 6 14 9 23 9s16 -3 22 -9l106 -100c12 -12 12 -31 0 -43s-34 -12 -46 0l-50 48v-217c0 -17 -14 -31 -32 -31s-32 14 -32 31v217l-50 -49c-12 -12 -34 -12 -46 0s-12 32 0 44z" />
+ <glyph glyph-name="ion-asterisk" unicode="&#xf314;"
+d="M448 224v-64l-186 10l104 -170l-56 -32l-86 176l-86 -176l-56 32l104 170l-186 -10v64l187 -7l-109 167l60 32l86 -176l86 176l60 -32l-109 -167z" />
+ <glyph glyph-name="ion-at" unicode="&#xf10f;"
+d="M422 41c-24 -25 -52 -43 -85 -55s-69 -18 -105 -18c-35 0 -66 6 -95 17s-53 26 -73 46s-36 43 -47 71s-17 58 -17 90s6 62 18 89s29 51 50 71s46 35 74 47c28 11 58 17 90 17c28 0 55 -4 81 -12s49 -20 69 -36s36 -36 48 -60s18 -53 18 -85c0 -24 -3 -46 -10 -64
+s-16 -34 -27 -46s-24 -22 -38 -28s-29 -10 -45 -10s-29 4 -39 12s-15 17 -15 29h-3c-6 -10 -15 -19 -28 -28s-28 -13 -46 -13c-28 0 -49 9 -64 27s-23 42 -23 71c0 17 3 34 9 50s14 31 24 44s23 23 38 31s31 12 49 12c15 0 27 -4 38 -10c10 -6 18 -15 21 -24h1l5 24h54
+l-24 -113c-1 -6 -2 -12 -3 -19s-2 -13 -2 -19c0 -7 1 -13 4 -18s7 -7 15 -7c16 0 29 9 39 26s16 40 16 68c0 24 -4 45 -12 64s-20 34 -34 47s-32 23 -52 29s-41 9 -65 9c-26 0 -49 -4 -70 -13s-39 -22 -54 -38s-27 -34 -35 -56c-8 -21 -13 -44 -13 -69c0 -26 4 -51 13 -72
+s21 -39 37 -54s35 -27 57 -35s46 -12 72 -12c33 0 61 6 85 16s45 25 65 43zM231 260c-10 0 -18 -2 -25 -8s-14 -13 -19 -22s-8 -18 -11 -28s-4 -20 -4 -30c0 -5 0 -10 1 -16c1 -5 3 -10 6 -15s7 -8 12 -11s11 -5 19 -5c11 0 20 3 28 8s14 13 19 21s9 16 11 26s3 19 3 27
+c0 6 0 13 -1 19s-4 12 -7 17s-7 9 -12 12s-12 5 -20 5z" />
+ <glyph glyph-name="ion-backspace-outline" unicode="&#xf3be;" horiz-adv-x="512"
+d="M413 116c2 -2 3 -4 3 -6s-1 -4 -3 -6l-21 -22c-2 -2 -4 -2 -6 -2s-4 0 -6 2l-76 77l-76 -77c-2 -2 -4 -2 -6 -2s-4 0 -6 2l-21 22c-2 2 -3 4 -3 6s1 4 3 6l76 76l-77 76c-3 3 -3 9 0 12l22 22c2 2 4 2 6 2s4 0 6 -2l76 -76l76 76c2 2 4 2 6 2s4 0 6 -2l22 -22
+c3 -3 3 -9 0 -12l-77 -76zM499 354c9 -9 13 -20 13 -33v-256c0 -27 -20 -49 -46 -49h-298c-13 0 -24 3 -34 9c-9 5 -16 11 -23 20v0l-1 1l-110 146l110 148c14 19 34 28 58 28h298c13 0 24 -5 33 -14zM480 65v256c0 9 -5 15 -14 15h-298c-11 0 -22 -3 -32 -16l-96 -128
+l96 -128c8 -10 17 -16 32 -16h298c9 0 14 8 14 17z" />
+ <glyph glyph-name="ion-backspace" unicode="&#xf3bf;" horiz-adv-x="512"
+d="M499 354c9 -9 13 -20 13 -33v-256c0 -27 -20 -49 -46 -49h-298c-13 0 -24 3 -34 9c-9 5 -16 11 -23 20v0l-1 1l-110 146l110 148c14 19 34 28 58 28h298c13 0 24 -5 33 -14zM413 116l-76 76l77 76c3 3 3 9 0 12l-22 22c-2 2 -4 2 -6 2s-4 0 -6 -2l-76 -76l-76 76
+c-2 2 -4 2 -6 2s-4 0 -6 -2l-22 -22c-3 -3 -3 -9 0 -12l77 -76l-76 -76c-2 -2 -3 -4 -3 -6s1 -4 3 -6l21 -22c2 -2 4 -2 6 -2s4 0 6 2l76 77l76 -77c2 -2 4 -2 6 -2s4 0 6 2l21 22c2 2 3 4 3 6s-1 4 -3 6z" />
+ <glyph glyph-name="ion-bag" unicode="&#xf110;"
+d="M416 288l32 -320h-448l32 320h64v4c0 68 56 124 124 124h8c68 0 124 -56 124 -124v-4h64zM128 292v-4h192v4c0 51 -41 92 -92 92v0h-8c-51 0 -92 -41 -92 -92zM36 0h376l-25 256h-35v-36c10 -6 16 -16 16 -28c0 -18 -14 -32 -32 -32s-32 14 -32 32c0 12 6 22 16 28v36
+h-192v-36c10 -6 16 -16 16 -28c0 -18 -14 -32 -32 -32s-32 14 -32 32c0 12 6 22 16 28v36h-35z" />
+ <glyph glyph-name="ion-battery-charging" unicode="&#xf111;"
+d="M10 64c-6 0 -10 4 -10 10v236c0 6 4 10 10 10h381c6 0 10 -4 10 -10v-54h37c6 0 10 -4 10 -10v-108c0 -6 -4 -10 -10 -10h-37v-54c0 -6 -4 -10 -10 -10h-381zM225 288l-100 -111h61l-27 -81l100 111h-61z" />
+ <glyph glyph-name="ion-battery-empty" unicode="&#xf112;"
+d="M438 256c6 0 10 -4 10 -10v-108c0 -6 -4 -10 -10 -10h-37v-54c0 -6 -4 -10 -10 -10h-381c-6 0 -10 4 -10 10v236c0 6 4 10 10 10h381c6 0 10 -4 10 -10v-54h37zM416 160v64h-15h-32v32v32h-337v-192h337v32v32h32h15z" />
+ <glyph glyph-name="ion-battery-full" unicode="&#xf113;"
+d="M438 256c6 0 10 -4 10 -10v-108c0 -6 -4 -10 -10 -10h-37v-54c0 -6 -4 -10 -10 -10h-381c-6 0 -10 4 -10 10v236c0 6 4 10 10 10h381c6 0 10 -4 10 -10v-54h37z" />
+ <glyph glyph-name="ion-battery-half" unicode="&#xf114;"
+d="M438 256c6 0 10 -4 10 -10v-108c0 -6 -4 -10 -10 -10h-37v-54c0 -6 -4 -10 -10 -10h-381c-6 0 -10 4 -10 10v236c0 6 4 10 10 10h381c6 0 10 -4 10 -10v-54h37zM416 160v64h-15h-32v32v32h-81l32 -192h49v32v32h32h15z" />
+ <glyph glyph-name="ion-battery-low" unicode="&#xf115;"
+d="M10 64c-6 0 -10 4 -10 10v236c0 6 4 10 10 10h381c6 0 10 -4 10 -10v-54h37c6 0 10 -4 10 -10v-108c0 -6 -4 -10 -10 -10h-37v-54c0 -6 -4 -10 -10 -10h-381zM369 288h-209l32 -192h177v32v32h32h15v64h-15h-32v32v32z" />
+ <glyph glyph-name="ion-beaker" unicode="&#xf269;" horiz-adv-x="384"
+d="M80 256h240v-224c0 -9 -7 -16 -16 -16h-208c-9 0 -16 7 -16 16v224zM296 104v48c0 4 -4 8 -8 8s-8 -4 -8 -8v-48c0 -4 4 -8 8 -8s8 4 8 8zM288 176c4 0 8 4 8 8s-4 8 -8 8s-8 -4 -8 -8s4 -8 8 -8zM381 416c3 0 3 -2 3 -3s-2 -3 -3 -5s-13 -20 -13 -40v-336
+c0 -35 -29 -64 -64 -64h-208c-35 0 -64 29 -64 64v307c0 32 -2 33 -32 37c0 12 11 40 65 40h316zM336 368c0 5 0 16 1 16h-273c-1 0 -3 0 -4 -1c5 -7 4 -32 4 -44v-307c0 -18 14 -32 32 -32h210c17 0 30 14 30 32v336z" />
+ <glyph glyph-name="ion-beer" unicode="&#xf26a;"
+d="M384 288c35 0 64 -29 64 -64v-96c0 -35 -29 -64 -64 -64h-32v-80c0 -9 -7 -16 -16 -16h-256c-9 0 -16 7 -16 16v223c-26 0 -48 22 -48 48v54v1c-10 11 -16 26 -16 42c0 35 29 64 64 64c18 0 34 -8 46 -20c10 12 26 20 43 20c14 0 27 -6 37 -14c12 9 26 14 42 14
+c17 0 34 -6 46 -16c11 10 26 16 42 16c35 0 64 -29 64 -64c0 -24 -18 -44 -32 -48v-16h32zM296 144c4 0 8 3 8 8v0v48c0 4 -4 8 -8 8s-8 -4 -8 -8v-48c0 -3 2 -6 4 -7c1 -1 2 -1 4 -1zM303 220c1 2 1 4 1 6s-1 4 -3 5s-4 1 -6 1s-4 -2 -5 -4s-2 -4 -2 -6s2 -4 4 -5
+s4 -1 6 -1s4 2 5 4zM320 288v32h-20c-3 -8 -7 -16 -13 -23c-13 -16 -33 -25 -55 -25c-26 0 -48 13 -61 33c-6 -2 -12 -3 -18 -3c-12 0 -23 4 -32 10c-2 1 -3 3 -5 4c-1 -2 -2 -3 -3 -5c-5 -6 -11 -10 -17 -14v-32v-9h80c0 4 4 8 8 8s8 -4 8 -8h128v32zM351 343c1 3 1 6 1 9
+c0 18 -14 32 -32 32c-9 0 -17 -4 -23 -10c-2 -2 -6 -5 -16 -6h-8c-6 1 -12 3 -14 5c-7 7 -16 11 -27 11c-9 0 -18 -4 -25 -9l-7 -7c0 -1 0 -1 -1 -2c-3 -3 -7 -5 -11 -5c-5 0 -8 3 -11 6c-1 2 -2 3 -3 5s-3 4 -5 6c-4 4 -10 6 -16 6c-10 0 -18 -9 -25 -16
+c-7 -8 -27 -8 -34 0s-18 16 -30 16c-18 0 -32 -14 -32 -32c0 -2 1 -5 1 -7c2 -9 7 -17 15 -21v-34v-35c0 -9 7 -16 16 -16v26v23v32c10 0 18 4 24 11c2 2 3 4 4 6c0 0 6 10 12 11s20 6 30 -5c4 -5 11 -9 19 -9c3 0 5 1 7 2c3 1 7 2 9 4v0c3 2 6 4 10 4c7 0 12 -4 14 -10
+c0 0 1 -1 1 -2c1 -3 1 -5 3 -8c7 -12 20 -20 35 -20c13 0 25 6 32 16c5 7 8 15 8 24s9 8 9 8h7h48c6 0 13 -3 15 -9zM416 128v96c0 18 -14 32 -32 32h-32v-160h32c18 0 32 14 32 32zM128 280c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM288 280c0 5 3 8 8 8s8 -3 8 -8
+s-3 -8 -8 -8s-8 3 -8 8z" />
+ <glyph glyph-name="ion-bluetooth" unicode="&#xf116;" horiz-adv-x="256"
+d="M12 304c16 16 18 13 19 12l68 -65v0v0c2 -2 10 -10 10 -3v156v0v2c0 6 6 10 12 10c4 0 7 -2 9 -4v0s117 -113 122 -117s5 -10 1 -14l-84 -81s-4 -4 -4 -8s4 -8 4 -8l84 -81c4 -4 4 -10 -1 -14s-122 -117 -122 -117v0c-2 -2 -5 -4 -9 -4c-6 0 -12 4 -12 10v2v0v156
+s-8 -1 -10 -3v0v-1l-68 -64c-1 -1 -3 -4 -19 12s-12 17 -11 18s90 86 90 86s4 3 4 8v0c0 5 -4 8 -4 8s-89 85 -90 86s-5 2 11 18zM152 328v-79c0 -8 8 -1 10 1l30 30s3 5 3 7s-1 5 -3 7l-30 30c-2 2 -10 11 -10 4zM152 135v-79s8 2 10 4l30 30c2 2 3 5 3 7s-1 5 -3 7l-30 30
+c-2 2 -10 9 -10 1z" />
+ <glyph glyph-name="ion-bonfire" unicode="&#xf315;" horiz-adv-x="384"
+d="M207 97l15 -89c1 -3 1 -5 1 -8c0 -18 -14 -32 -32 -32s-32 14 -32 32c0 2 0 5 1 7l15 92v0c2 7 8 13 16 13s15 -7 16 -15zM242 93v0v0v0zM329 58c9 -8 10 -25 0 -35s-27 -9 -35 0c-1 1 -2 3 -3 4l-49 66c-3 5 -2 11 2 15c5 5 10 5 16 1l64 -47c2 -1 3 -3 5 -4zM309 113v0
+v0v0zM371 126c9 -1 13 -7 13 -19c0 -9 -10 -14 -18 -12l-57 18v0v0c-3 2 -6 5 -5 9s4 7 8 6zM75 113v0v0v0zM75 113v0l-58 -18c-8 -2 -17 3 -17 12c0 12 3 18 12 19l60 2c4 1 7 -2 8 -6s-2 -7 -5 -9v0zM124 109c5 4 11 4 16 -1c4 -4 5 -10 2 -15l-49 -66c-1 -1 -2 -3 -3 -4
+c-10 -10 -25 -10 -35 0s-10 25 0 35c2 2 3 3 5 4zM288 320c0 -32 -9 -58 -50 -86c-37 -26 -94 -46 -110 -106c0 0 -58 24 -48 96s124 106 112 192c24 0 96 -35 96 -96zM288 192c-16 -50 -44 -64 -80 -64c-15 0 -32 9 -43 26c12 15 28 26 47 37c9 5 20 10 29 16
+c21 14 38 31 47 49c5 -15 5 -48 0 -64zM88 288c-6 4 -9 14 -8 27c2 22 34 39 32 69c14 2 31 -3 42 -24c-5 -11 -15 -21 -28 -34s-26 -22 -38 -38z" />
+ <glyph glyph-name="ion-bookmark" unicode="&#xf26b;" horiz-adv-x="192"
+d="M184 384c4 0 8 -4 8 -8v-56h-192v56c0 4 4 8 8 8h176zM0 0v304h192v-304l-96 96z" />
+ <glyph glyph-name="ion-bowtie" unicode="&#xf3c0;"
+d="M192 236c0 0 8 5 20 7c21 4 39 5 47 -9c10 -17 19 -53 17 -85c-1 -17 -5 -22 -5 -22s-15 -10 -47 -7c-35 3 -40 15 -40 15s5 12 8 43s0 58 0 58zM152 163c-17 -4 -38 -10 -38 -10s45 4 64 9c-4 -21 -10 -34 -10 -34s-83 -80 -116 -80c-28 0 -52 68 -52 144s26 144 52 144
+c35 0 106 -57 128 -97c0 0 3 -16 2 -32c-10 5 -24 10 -44 14c-28 6 -42 3 -42 3s18 -4 57 -17c15 -5 22 -8 29 -10c0 -3 -1 -7 -1 -10c0 -5 0 -10 -1 -15c-5 -2 -15 -6 -28 -9zM396 336c26 0 52 -68 52 -144s-24 -144 -52 -144c-37 0 -104 68 -112 79c0 0 4 5 5 22v9
+c16 -7 70 -13 70 -13s-21 6 -40 11c-13 4 -25 8 -30 10c-1 11 -2 23 -4 33c17 11 69 34 69 34s-15 -2 -35 -9c-14 -5 -29 -11 -37 -14c-3 10 -7 18 -10 24c0 1 -1 4 -1 4v1c22 40 89 97 125 97z" />
+ <glyph glyph-name="ion-briefcase" unicode="&#xf26c;"
+d="M240 176v8h208v-176c0 -4 -4 -8 -8 -8h-432c-4 0 -8 4 -8 8v176h208v-8h32zM440 304c4 0 8 -4 8 -8v-96h-208v8h-32v-8h-208v96c0 4 4 8 8 8h120v31c1 28 22 49 51 49h90c30 0 50 -21 51 -49v-31h120zM288 332v1c0 10 -9 19 -19 19h-90c-10 0 -19 -9 -19 -19v-1v-1v-27
+h128v27v1z" />
+ <glyph glyph-name="ion-bug" unicode="&#xf2be;"
+d="M343 321c-6 -16 -16 -31 -28 -43c-24 -24 -57 -37 -91 -37s-67 13 -91 37c-12 12 -22 27 -28 43c29 39 72 63 119 63s90 -24 119 -63zM95 305c22 -45 68 -77 121 -80v-225c-40 2 -77 22 -104 54c-7 -6 -10 -9 -13 -15c8 -9 7 -22 -1 -31c-9 -10 -24 -11 -34 -2
+s-11 24 -2 34l3 3s2 1 2 1c4 13 13 25 27 36c-15 26 -26 57 -29 90c-7 0 -12 -2 -17 -3c-1 -13 -11 -23 -24 -23s-24 11 -24 24s11 24 24 24h3c4 2 8 5 12 6c7 2 14 4 25 4c1 23 6 45 13 65c-6 4 -11 7 -15 11c-6 5 -11 13 -14 19c-1 0 -3 1 -4 2c-12 6 -15 21 -9 33
+s21 15 33 9c11 -6 15 -20 10 -31c2 -3 3 -7 4 -8c2 -2 5 -3 8 -5c2 3 3 5 5 8zM424 192c13 0 24 -11 24 -24s-11 -24 -24 -24s-23 10 -24 23c-5 1 -10 3 -17 3c-3 -33 -14 -64 -29 -90c14 -11 23 -23 27 -36c0 0 1 0 2 -1l3 -3c9 -10 8 -25 -2 -34s-25 -8 -34 2
+c-8 9 -9 22 -1 31c-3 6 -6 9 -13 15c-27 -32 -64 -52 -104 -54v225c53 3 99 35 121 80c2 -3 3 -5 5 -8c3 2 6 3 8 5c1 1 2 5 4 8c-5 11 -1 25 10 31c12 6 27 3 33 -9s3 -27 -9 -33c-1 -1 -3 -2 -4 -2c-3 -6 -8 -14 -14 -19c-4 -4 -9 -7 -15 -11c7 -20 12 -42 13 -65
+c11 0 18 -2 25 -4c4 -1 8 -4 12 -6h3z" />
+ <glyph glyph-name="ion-calculator" unicode="&#xf26d;" horiz-adv-x="320"
+d="M304 416c9 0 16 -7 16 -16v-416c0 -9 -7 -16 -16 -16h-288c-9 0 -16 7 -16 16v416c0 9 7 16 16 16h288zM48 240v-32h32v32h-32zM48 176v-32h32v32h-32zM48 112v-32h32v32h-32zM144 16v32h-96v-32h96zM144 80v32h-32v-32h32zM144 144v32h-32v-32h32zM144 208v32h-32v-32
+h32zM208 16v32h-32v-32h32zM208 80v32h-32v-32h32zM208 144v32h-32v-32h32zM208 208v32h-32v-32h32zM272 16v96h-32v-96h32zM272 144v32h-32v-32h32zM272 208v32h-32v-32h32zM272 288v80h-224v-80h224z" />
+ <glyph glyph-name="ion-calendar" unicode="&#xf117;"
+d="M112 320c-18 0 -32 14 -32 32v32c0 18 14 32 32 32s32 -14 32 -32v-32c0 -18 -14 -32 -32 -32zM336 320c-18 0 -32 14 -32 32v32c0 18 14 32 32 32s32 -14 32 -32v-32c0 -18 -14 -32 -32 -32zM440 384c4 0 8 -4 8 -8v-400c0 -4 -4 -8 -8 -8h-432c-4 0 -8 4 -8 8v400
+c0 4 4 8 8 8h56v-41c0 -22 24 -39 48 -39s48 17 48 39v41h128v-41c0 -22 25 -39 49 -39s47 17 47 39v41h56zM400 16v256h-352v-256h352z" />
+ <glyph glyph-name="ion-camera" unicode="&#xf118;" horiz-adv-x="416"
+d="M382 301c18 0 34 -14 34 -33v-202c0 -19 -16 -34 -34 -34h-348c-19 0 -34 15 -34 34v202c0 19 15 33 34 33h69l39 40v0c6 7 15 11 25 11h84c9 0 17 -4 23 -10v0v0v0l41 -41h67zM208 82c51 0 92 42 92 93s-41 93 -92 93s-92 -42 -92 -93s41 -93 92 -93zM376 248
+c8 0 14 6 14 14s-6 14 -14 14s-14 -6 -14 -14s6 -14 14 -14zM208 245c38 0 70 -31 70 -70s-32 -70 -70 -70c-39 0 -70 31 -70 70s31 70 70 70z" />
+ <glyph glyph-name="ion-card" unicode="&#xf119;"
+d="M420 352c16 0 28 -12 28 -28v0v-264v0c0 -16 -12 -28 -28 -28h-392c-16 0 -28 12 -28 28v0v0v264v0v0c0 16 12 28 28 28h392zM45 320c-7 0 -12 -5 -13 -12v-20h384v20c-1 7 -6 12 -13 12h-358zM403 64c7 0 12 5 13 12v116h-384v-116c1 -7 6 -12 13 -12h358zM64 128v16
+h192v-16h-192zM64 96v16h96v-16h-96zM320 96v48h64v-48h-64z" />
+ <glyph glyph-name="ion-cash" unicode="&#xf316;" horiz-adv-x="512"
+d="M0 352h512v-256h-512v256zM193 128c-20 23 -33 58 -33 96s13 73 33 96h-97c0 -35 -29 -64 -64 -64v-80c27 0 48 -21 48 -48h113zM298 187c3 4 4 9 4 15c0 3 0 5 -1 8s-2 6 -4 8s-4 4 -7 6s-6 4 -10 5c-1 0 -4 1 -7 2s-5 0 -8 1v31c2 -1 5 -2 7 -3c4 -3 6 -7 7 -13h20
+c0 5 -2 9 -4 13s-5 8 -9 11s-9 5 -14 6c-2 1 -5 2 -7 2v9h-18v-9c-2 0 -4 -1 -6 -2c-5 -1 -10 -2 -14 -5s-7 -6 -9 -10s-4 -9 -4 -14c0 -3 0 -5 1 -8s2 -5 4 -7s5 -5 8 -7s7 -4 12 -5c3 -1 6 0 8 -1v-35c-3 1 -6 2 -9 4s-5 4 -6 7s-2 6 -2 9h-20c0 -5 2 -11 4 -16
+c3 -5 6 -8 10 -11s9 -6 15 -7c3 -1 5 -2 8 -2v-9h18v9c3 0 6 1 9 2c5 1 10 2 14 5s7 7 10 11zM480 176v80c-35 0 -64 29 -64 64h-97c20 -23 33 -58 33 -96s-13 -73 -33 -96h113c0 27 22 48 48 48zM64 224c0 21 11 32 32 32s32 -11 32 -32s-11 -32 -32 -32s-32 11 -32 32z
+M384 224c0 21 11 32 32 32s32 -11 32 -32s-11 -32 -32 -32s-32 11 -32 32zM273 213c2 -1 4 -2 6 -4s3 -5 3 -9c0 -2 0 -4 -1 -6s-2 -4 -4 -5s-5 -3 -8 -4c-1 0 -2 -1 -4 -1v31c3 -1 6 -1 8 -2zM236 257c1 2 3 3 5 4s4 2 6 2v-26c-4 1 -7 3 -9 5s-4 4 -4 8c0 3 1 5 2 7zM0 32
+v32h512v-32h-512z" />
+ <glyph glyph-name="ion-chatbox-working" unicode="&#xf11a;" horiz-adv-x="416"
+d="M76 48c-42 0 -76 31 -76 71v209c0 40 34 72 76 72h264c42 0 76 -32 76 -72v-209c0 -40 -34 -71 -76 -71h-4v-64s-79 54 -86 59s-7 5 -21 5h-153zM304 256c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM208 256c-18 0 -32 -14 -32 -32s14 -32 32 -32
+s32 14 32 32s-14 32 -32 32zM112 256c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32z" />
+ <glyph glyph-name="ion-chatbox" unicode="&#xf11b;" horiz-adv-x="416"
+d="M76 48c-42 0 -76 31 -76 71v209c0 40 34 72 76 72h264c42 0 76 -32 76 -72v-209c0 -40 -34 -71 -76 -71h-4v-64s-79 54 -86 59s-7 5 -21 5h-153z" />
+ <glyph glyph-name="ion-chatboxes" unicode="&#xf11c;" horiz-adv-x="416"
+d="M246 82l26 -18c-4 -21 -29 -32 -52 -32h-90c-8 0 -11 -2 -13 -3l-53 -45v48h-16c-26 0 -48 16 -48 41v129c0 25 20 45 46 45h2v-101c0 -33 29 -59 64 -59h117c10 0 14 -3 17 -5zM353 400c35 0 63 -27 63 -60v-168c0 -33 -28 -60 -63 -60h-17v-64l-75 60c-2 2 -7 4 -17 4
+h-101c-35 0 -63 27 -63 60v98v70c0 33 21 60 56 60h217z" />
+ <glyph glyph-name="ion-chatbubble-working" unicode="&#xf11d;" horiz-adv-x="416"
+d="M208 -1c-115 0 -208 89 -208 200s93 201 208 201s208 -90 208 -201c0 -40 -12 -77 -33 -108c-1 -1 -2 -3 -3 -4v0c-2 -4 -4 -10 -4 -15l22 -88l-84 31c-4 2 -8 2 -12 2s-7 -1 -11 -2v0c-1 0 -1 -1 -2 -1c-25 -10 -52 -15 -81 -15zM304 224c-18 0 -32 -14 -32 -32
+s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM208 224c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM112 224c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32z" />
+ <glyph glyph-name="ion-chatbubble" unicode="&#xf11e;" horiz-adv-x="416"
+d="M208 -1c-115 0 -208 89 -208 200s93 201 208 201s208 -90 208 -201c0 -40 -12 -77 -33 -108c-1 -1 -2 -3 -3 -4v0c-2 -4 -4 -10 -4 -15l22 -88l-84 31c-4 2 -8 2 -12 2s-7 -1 -11 -2v0c-1 0 -1 -1 -2 -1c-25 -10 -52 -15 -81 -15z" />
+ <glyph glyph-name="ion-chatbubbles" unicode="&#xf11f;" horiz-adv-x="416"
+d="M25 57c-1 1 0 2 -1 3c-15 22 -24 49 -24 77c0 42 19 80 49 106c-2 -11 -4 -22 -4 -34c0 -92 78 -168 174 -168c15 0 30 2 44 6c-27 -32 -69 -53 -115 -53c-20 0 -40 5 -58 12h-1v0c-2 1 -5 2 -8 2s-6 -1 -9 -2l-56 -22l12 63c0 4 -1 7 -3 10v0zM242 400
+c96 0 174 -76 174 -168c0 -33 -11 -64 -28 -90c-1 -1 -1 -2 -2 -3v0c-2 -4 -3 -8 -3 -12l17 -74l-69 26c-3 1 -6 2 -10 2c-3 0 -6 -1 -9 -2v0l-2 -1c-8 -3 -16 -5 -24 -7c-14 -4 -29 -6 -44 -6c-96 0 -173 75 -173 167c0 12 1 24 3 35c16 76 86 133 170 133z" />
+ <glyph glyph-name="ion-checkmark-circled" unicode="&#xf120;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM339 267c1 1 1 2 1 3s0 3 -1 4l-31 24c-1 1 -3 1 -4 1s-2 0 -3 -1l-111 -143s-44 42 -45 43s-4 3 -6 3s-3 -2 -4 -3l-25 -25l-1 -1c-1 -1 -1 -3 -1 -4s0 -2 1 -3l2 -1
+s78 -75 79 -76s3 -3 5 -3s4 2 5 3z" />
+ <glyph glyph-name="ion-checkmark-round" unicode="&#xf121;" horiz-adv-x="416"
+d="M400 376c17 -13 22 -39 9 -57l-207 -302c-13 -18 -37 -22 -54 -9s-137 147 -137 147c-15 16 -15 42 1 58s40 15 55 -2l99 -107l180 263c13 18 37 22 54 9z" />
+ <glyph glyph-name="ion-checkmark" unicode="&#xf122;" horiz-adv-x="416"
+d="M414 338c1 -2 2 -4 2 -6s-1 -4 -2 -6l-249 -320c-2 -2 -5 -6 -9 -6s-8 3 -10 5s-141 136 -141 136l-3 3c-1 2 -2 4 -2 6s1 3 2 5l2 2c14 15 42 44 44 46s4 6 8 6s8 -4 10 -6s80 -78 80 -78l200 257c2 2 4 2 6 2s5 -1 7 -2z" />
+ <glyph glyph-name="ion-chevron-down" unicode="&#xf123;"
+d="M224 150v0v0l174 167c4 4 12 4 16 0l31 -30c4 -4 4 -12 0 -16l-213 -204c-2 -2 -5 -3 -8 -3s-6 1 -8 3l-213 204c-4 4 -4 12 0 16l31 30c4 4 12 4 16 0z" />
+ <glyph glyph-name="ion-chevron-left" unicode="&#xf124;" horiz-adv-x="256"
+d="M86 192l167 -174c4 -4 4 -12 0 -16l-30 -31c-4 -4 -12 -4 -16 0l-204 213c-2 2 -3 5 -3 8s1 6 3 8l204 213c4 4 12 3 16 -1l30 -30c4 -4 4 -12 0 -16l-167 -174v0v0z" />
+ <glyph glyph-name="ion-chevron-right" unicode="&#xf125;" horiz-adv-x="256"
+d="M170 192v0v0l-167 174c-4 4 -4 12 0 16l30 30c4 4 12 5 16 1l204 -213c2 -2 3 -5 3 -8s-1 -6 -3 -8l-204 -213c-4 -4 -12 -4 -16 0l-30 31c-4 4 -4 12 0 16z" />
+ <glyph glyph-name="ion-chevron-up" unicode="&#xf126;"
+d="M224 234l-174 -167c-4 -4 -12 -4 -16 0l-31 30c-4 4 -4 12 0 16l213 204c2 2 5 3 8 3s6 -1 8 -3l213 -204c4 -4 4 -12 0 -16l-31 -30c-4 -4 -12 -4 -16 0l-174 167v0v0z" />
+ <glyph glyph-name="ion-clipboard" unicode="&#xf127;" horiz-adv-x="352"
+d="M80 288c2 20 10 35 28 40l1 1c12 3 21 7 21 20v21c0 26 21 46 46 46s46 -20 46 -46v-21c0 -13 9 -18 21 -21h2c18 -5 25 -20 27 -40h-192zM176 384c-8 0 -13 -6 -13 -14s5 -14 13 -14s14 6 14 14s-6 14 -14 14zM325 384c15 0 27 -12 27 -28v-360c0 -16 -12 -28 -27 -28
+h-149h-148c-15 0 -28 12 -28 28v360c0 16 13 28 28 28h73v-13c0 -11 -9 -19 -19 -19h-37c-7 0 -12 -6 -12 -13v-327c0 -6 5 -12 11 -12h265c6 0 11 6 11 12v327c0 7 -5 13 -12 13h-37c-10 0 -20 8 -20 19v13h74zM64 224v32h112v-32h-112zM64 32v32h160v-32h-160zM64 96v32
+h129v-32h-129zM64 160v32h208v-32h-208z" />
+ <glyph glyph-name="ion-clock" unicode="&#xf26e;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c10 10 19 21 26 33l-27 16l8 14l27 -16c13 25 21 52 22 81h-32v16h32c-1 29 -9 56 -22 81l-27 -16l-8 14l27 16c-7 12 -16 23 -26 33s-21 19 -33 26l-16 -27l-14 8
+l16 27c-25 13 -52 21 -81 22v-32h-16v32c-29 -1 -56 -9 -81 -22l16 -27l-14 -8l-16 27c-12 -7 -23 -16 -33 -26s-19 -21 -26 -33l27 -16l-8 -14l-27 16c-13 -25 -21 -52 -22 -81h32v-16h-32c1 -29 9 -56 22 -81l27 16l8 -14l-27 -16c7 -12 16 -23 26 -33s21 -19 33 -26
+l16 27l14 -8l-16 -27c25 -13 52 -21 81 -22v32h16v-32c29 1 56 9 81 22l-16 27l14 8l16 -27c12 7 23 16 33 26zM368 207v-32h-117c-6 -9 -16 -15 -27 -15c-18 0 -32 14 -32 32c0 12 6 22 16 28v68h32v-68c5 -3 9 -8 12 -13h116z" />
+ <glyph glyph-name="ion-close-circled" unicode="&#xf128;"
+d="M224 415c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM332 116l-75 75l76 75c3 3 3 9 0 12l-22 21c-2 2 -4 3 -6 3s-3 -1 -5 -3l-76 -74l-76 74c-2 2 -3 3 -5 3s-4 -1 -6 -3l-21 -21c-3 -3 -3 -9 0 -12l76 -75l-76 -76
+c-2 -1 -2 -3 -2 -5s0 -4 2 -6l21 -22c2 -2 4 -2 6 -2s4 0 6 2l75 76l76 -75c2 -2 3 -3 5 -3s4 1 6 3l21 21c2 1 3 4 3 6s-1 4 -3 6z" />
+ <glyph glyph-name="ion-close-round" unicode="&#xf129;" horiz-adv-x="384"
+d="M374 61c14 -14 14 -37 0 -51s-37 -14 -51 0l-131 131l-131 -131c-14 -14 -36 -14 -50 0s-14 37 0 51l130 131l-130 131c-14 14 -14 37 0 51s36 14 50 0l131 -131l131 131c14 14 37 14 51 0s14 -37 0 -51l-131 -131z" />
+ <glyph glyph-name="ion-close" unicode="&#xf12a;" horiz-adv-x="384"
+d="M380 61c3 -3 4 -6 4 -10s-1 -7 -4 -10l-38 -37c-3 -3 -5 -4 -9 -4s-7 1 -10 4l-131 131l-131 -131c-3 -3 -5 -4 -9 -4s-7 1 -10 4l-38 37c-3 3 -4 6 -4 10s1 7 4 10l132 131l-132 130c-5 5 -5 15 0 20l37 38c3 2 6 4 10 4s7 -1 10 -4l131 -130l131 130c3 2 6 4 10 4
+s7 -1 10 -4l37 -38c5 -5 5 -14 0 -19l-132 -130z" />
+ <glyph glyph-name="ion-closed-captioning" unicode="&#xf317;" horiz-adv-x="512"
+d="M0 384h512v-384h-512v384zM464 192c0 27 0 44 -4 80s-23 56 -59 60s-91 4 -138 4h-7h-7c-47 0 -102 0 -138 -4s-55 -24 -59 -60s-4 -53 -4 -80s2 -47 4 -80s19 -56 59 -60s96 -4 145 -4s105 0 145 4s57 27 59 60s4 53 4 80zM372 164v4h53c0 -27 -7 -48 -19 -62
+s-32 -21 -61 -21c-14 0 -26 2 -36 5s-18 9 -25 17s-12 19 -15 33s-5 30 -5 51s3 39 7 53s9 25 17 33s17 14 27 17s22 5 34 5c25 0 44 -7 57 -21s19 -37 19 -62h-52v1c0 20 -12 33 -27 33s-25 -11 -28 -30c0 0 -2 -11 -2 -29s2 -28 2 -28c1 -17 12 -29 27 -29s27 10 27 29v1z
+M195 164v4h53c0 -27 -7 -48 -19 -62s-32 -21 -61 -21c-14 0 -26 2 -36 5s-18 9 -25 17s-12 19 -15 33s-5 30 -5 51s3 39 7 53s9 25 17 33s17 14 27 17s22 5 34 5c25 0 44 -7 57 -21s19 -37 19 -62h-52v1c0 20 -12 33 -27 33s-25 -11 -28 -30c0 0 -2 -11 -2 -29s2 -28 2 -28
+c1 -17 12 -29 27 -29s27 10 27 29v1z" />
+ <glyph glyph-name="ion-cloud" unicode="&#xf12b;"
+d="M366 215c45 0 82 -38 82 -84s-37 -83 -82 -83v0h-276c-49 0 -90 41 -90 91c0 40 26 74 61 86c5 29 29 51 59 51c10 0 18 -3 26 -7c19 40 59 67 105 67c64 0 115 -53 115 -118v-3z" />
+ <glyph glyph-name="ion-code-download" unicode="&#xf26f;"
+d="M299 164l-63 -63v0l-1 -1v0l-2 -1v0l-1 -1v0l-2 -1v0h-1v0h-1c-1 0 -3 -1 -4 -1s-3 1 -4 1h-1v0h-1v0l-2 1v0l-1 1v0c-1 1 -2 1 -3 2v0l-63 63c-6 6 -6 17 0 23s18 6 24 0l35 -34v118c0 9 7 17 16 17s16 -8 16 -17v-118l35 34c6 6 18 6 24 0s6 -17 0 -23zM136 56
+c-6 0 -12 2 -17 7l-112 112c-9 9 -9 25 0 34l112 112c9 9 25 9 34 0s9 -25 0 -34l-95 -95l95 -95c9 -9 9 -25 0 -34c-5 -5 -11 -7 -17 -7zM312 56c-6 0 -12 2 -17 7c-9 9 -9 25 0 34l95 95l-95 95c-9 9 -9 25 0 34s25 9 34 0l112 -112c9 -9 9 -25 0 -34l-112 -112
+c-5 -5 -11 -7 -17 -7z" />
+ <glyph glyph-name="ion-code-working" unicode="&#xf270;"
+d="M128 192c0 16 8 24 24 24s24 -8 24 -24s-8 -24 -24 -24s-24 8 -24 24zM200 192c0 16 8 24 24 24s24 -8 24 -24s-8 -24 -24 -24s-24 8 -24 24zM272 192c0 16 8 24 24 24s24 -8 24 -24s-8 -24 -24 -24s-24 8 -24 24zM136 56c-7 0 -12 2 -17 7l-112 112c-5 5 -7 10 -7 17
+s2 12 7 17l112 112c5 5 10 7 17 7s12 -2 17 -7s7 -10 7 -17s-2 -12 -7 -17l-95 -95l95 -95c5 -5 7 -10 7 -17s-2 -12 -7 -17s-10 -7 -17 -7zM312 56c-7 0 -12 2 -17 7s-7 10 -7 17s2 12 7 17l95 95l-95 95c-5 5 -7 10 -7 17s2 12 7 17s10 7 17 7s12 -2 17 -7l112 -112
+c5 -5 7 -10 7 -17s-2 -12 -7 -17l-112 -112c-5 -5 -10 -7 -17 -7z" />
+ <glyph glyph-name="ion-code" unicode="&#xf271;"
+d="M136 56c-6 0 -12 2 -17 7l-112 112c-9 9 -9 25 0 34l112 112c9 9 25 9 34 0s9 -25 0 -34l-95 -95l95 -95c9 -9 9 -25 0 -34c-5 -5 -11 -7 -17 -7zM312 56c-6 0 -12 2 -17 7c-9 9 -9 25 0 34l95 95l-95 95c-9 9 -9 25 0 34s25 9 34 0l112 -112c9 -9 9 -25 0 -34l-112 -112
+c-5 -5 -11 -7 -17 -7z" />
+ <glyph glyph-name="ion-coffee" unicode="&#xf272;" horiz-adv-x="384"
+d="M319 191c37 -7 65 -40 65 -79c0 -20 -8 -39 -21 -54c-15 -17 -37 -26 -61 -26c-8 0 -17 1 -25 3c-6 1 -10 3 -15 5c-11 -15 -23 -25 -32 -33v0c-5 -5 -12 -7 -19 -7h-102c-7 0 -14 2 -19 7v0c-17 15 -41 36 -62 86s-28 91 -28 111s3 20 16 20h101c-5 17 -37 19 -37 46
+c0 17 15 32 28 37c-2 -8 -3 -14 -3 -21c0 -19 39 -30 39 -53c0 -3 0 -6 -1 -9h56c1 5 2 10 2 14c0 36 -56 36 -56 84c0 28 21 55 47 62c-4 -14 -9 -23 -9 -35c0 -32 57 -50 57 -88c0 -13 -5 -25 -12 -37h76c13 0 16 0 16 -20c0 -4 0 -8 -1 -13zM302 64c33 0 50 25 50 48
+s-17 43 -39 47c-4 -19 -11 -42 -21 -66c-4 -9 -8 -17 -12 -25c6 -3 13 -4 22 -4z" />
+ <glyph glyph-name="ion-compass" unicode="&#xf273;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224c0 39 10 76 27 108c-16 12 -27 30 -27 52c0 35 29 64 64 64c22 0 40 -11 52 -27c32 17 69 27 108 27zM32 352c0 -10 5 -20 13 -26c13 17 28 32 45 45c-6 8 -16 13 -26 13c-18 0 -32 -14 -32 -32z
+M360 56c36 36 56 85 56 136s-20 100 -56 136s-85 56 -136 56s-100 -20 -136 -56s-56 -85 -56 -136s20 -100 56 -136s85 -56 136 -56s100 20 136 56zM320 320c0 0 -54 -130 -72 -152s-120 -104 -120 -104s54 132 72 152s120 104 120 104z" />
+ <glyph glyph-name="ion-compose" unicode="&#xf12c;" horiz-adv-x="384"
+d="M379 348c7 -7 7 -18 0 -25l-32 -31l-55 55l31 32c7 7 18 7 25 0zM282 338l55 -55l-177 -173l-64 -14l14 64zM320 192l32 32v-201c0 -13 -10 -23 -23 -23h-306c-13 0 -23 10 -23 23v306c0 13 10 23 23 23h201l-32 -32h-149c-6 0 -11 -5 -11 -10v-268s4 -10 10 -10h269
+s9 5 9 10v150z" />
+ <glyph glyph-name="ion-connection-bars" unicode="&#xf274;" horiz-adv-x="352"
+d="M0 32v64h64v-64h-64zM96 32v128h64v-128h-64zM192 32v224h64v-224h-64zM288 32v320h64v-320h-64z" />
+ <glyph glyph-name="ion-contrast" unicode="&#xf275;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c36 36 56 85 56 136s-20 100 -56 136s-85 56 -136 56v-384c51 0 100 20 136 56z" />
+ <glyph glyph-name="ion-crop" unicode="&#xf3c1;"
+d="M320 -32v48h64v-48h-64zM384 96h64v-64h-384v256h-64v64h64v64h64v-320h192v192h-176v64h240v-256z" />
+ <glyph glyph-name="ion-cube" unicode="&#xf318;"
+d="M435 280c7 0 13 -6 13 -12v-183c0 -9 -6 -17 -14 -22v-1l-175 -92v-1c-2 -1 -4 -1 -6 -1c-7 0 -13 6 -13 12v185c0 9 5 17 13 22v0l3 2l172 89l2 1c2 1 3 1 5 1zM422 329c0 0 8 -3 8 -9c0 -7 -8 -11 -8 -11l-183 -97l-2 -1c-4 -2 -8 -3 -13 -3s-9 1 -13 3l-2 1l-183 96
+s-8 5 -8 12c0 6 8 9 8 9l181 82s11 5 17 5s17 -5 17 -5zM195 187c8 -5 13 -13 13 -22v-185c0 -6 -6 -12 -13 -12c-2 0 -4 1 -6 2v0l-175 92v1c-8 5 -14 13 -14 22v183c0 6 6 12 13 12c2 0 4 0 5 -1l2 -1l171 -89z" />
+ <glyph glyph-name="ion-disc" unicode="&#xf12d;"
+d="M224 289c54 0 97 -43 97 -97s-43 -97 -97 -97s-97 43 -97 97s43 97 97 97zM224 148c24 0 44 20 44 44s-20 44 -44 44s-44 -20 -44 -44s20 -44 44 -44zM224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM224 69
+c68 0 123 55 123 123s-55 123 -123 123s-123 -55 -123 -123s55 -123 123 -123z" />
+ <glyph glyph-name="ion-document-text" unicode="&#xf12e;" horiz-adv-x="288"
+d="M286 279c1 -3 2 -6 2 -10v-245c0 -13 -10 -24 -22 -24h-243c-12 0 -23 11 -23 24v336c0 13 11 24 23 24h160c3 0 6 0 9 -2c2 -1 5 -3 7 -5l84 -92c2 -2 2 -4 3 -6zM48 269v-10c0 -1 1 -3 3 -3h71c2 0 3 2 3 3v10c0 2 -1 3 -3 3h-71c-2 0 -3 -1 -3 -3zM48 141v-10
+c0 -1 1 -3 3 -3h123c2 0 2 2 2 3v10c0 2 0 3 -2 3h-123c-2 0 -3 -1 -3 -3zM208 67v10c0 2 0 3 -2 3h-155c-2 0 -3 -1 -3 -3v-10c0 -1 1 -3 3 -3h155c2 0 2 2 2 3zM240 195v10c0 2 0 3 -2 3h-187c-2 0 -3 -1 -3 -3v-10c0 -1 1 -3 3 -3h187c2 0 2 2 2 3zM193 270h60l-71 78
+v-66c0 -6 5 -12 11 -12z" />
+ <glyph glyph-name="ion-document" unicode="&#xf12f;" horiz-adv-x="288"
+d="M287 279c1 -3 1 -5 1 -9v-244c0 -13 -9 -26 -21 -26h-243c-12 0 -24 13 -24 26v335c0 13 12 23 24 23h160c3 0 6 0 9 -2c2 -1 5 -2 7 -4l83 -92c2 -2 3 -4 4 -7zM193 337v-63h58zM32 32h224v210h-67c-15 0 -28 13 -28 28v82h-129v-320z" />
+ <glyph glyph-name="ion-drag" unicode="&#xf130;" horiz-adv-x="512"
+d="M0 272v32h512v-32h-512zM0 176v32h512v-32h-512zM0 80v32h512v-32h-512z" />
+ <glyph glyph-name="ion-earth" unicode="&#xf276;"
+d="M325 322c2 -4 7 -12 3 -15c-3 -2 -10 -2 -13 5s0 11 -5 9s-7 3 -6 4c1 2 3 3 5 4c0 2 -4 8 2 7c4 -1 12 -10 14 -14zM344 277v0v0zM403 251c0 0 -2 0 0 0v0zM224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM141 19l8 -4
+c3 -1 6 -2 10 -3c14 -5 28 -8 43 -10c28 -3 56 -1 83 8c15 5 30 11 43 20c6 4 6 16 10 24c8 16 -2 33 12 47c12 14 4 19 4 34c0 10 8 18 4 29c-1 4 -7 -3 -9 1c-5 7 -21 1 -28 2c-13 2 -24 14 -33 23c-5 5 0 20 1 26c4 15 0 33 19 38c5 1 5 9 10 11c5 1 10 3 15 4
+c9 1 17 -2 26 -2c10 0 14 -5 22 -11c7 -6 13 -3 22 -5c7 0 0 5 -2 8c-3 2 -6 2 -8 2c-16 4 -23 22 -36 30c-6 3 -9 2 -11 0c-1 -1 1 -12 1 -12c-1 -3 -10 -4 -13 -5c-9 -2 -29 17 -15 22c4 1 27 5 24 15c-3 6 2 13 -5 14c-8 1 -7 7 -15 8c-5 1 -5 11 -5 14c0 9 2 6 9 7
+c-17 11 -37 19 -57 24c-1 -3 -5 -12 -8 -12c-5 -1 -6 0 -9 -3c-9 -10 -16 -28 -25 -7c-4 11 5 19 2 28h-6h-3c6 -12 -5 -18 -8 -19c-8 0 -10 5 -17 4c-4 -1 -7 4 -11 2s-13 -8 -14 -12c-3 -12 6 -13 14 -6c6 6 17 12 25 6c6 -5 5 -9 5 -14s-1 -18 -9 -16c-4 1 -7 6 -11 3
+c-8 -7 -18 -6 -29 -9c-10 -2 -16 -6 -25 -9c-8 -3 -11 -4 -12 -12c0 -2 0 -14 -3 -15c-5 -2 -8 22 -22 20c-12 -1 -30 -13 -25 -28c2 -5 28 -3 10 -14c-2 -1 2 -17 2 -20c1 -8 13 -18 21 -10c6 6 6 5 14 2c15 -8 33 -15 45 -27c6 -6 9 -24 17 -28c9 -5 19 -5 26 -14
+c6 -7 -2 -19 -8 -23c-4 -2 -12 -24 -16 -29c-2 -4 -12 -6 -16 -7c-3 0 -7 -9 -9 -11c-7 -7 -8 -13 -17 -19c-18 -12 -22 -23 -18 -44c2 -8 5 -13 11 -16zM100 46l2 -2c7 -6 15 -11 23 -16c-21 21 -23 49 -21 78l3 24c1 3 -4 7 -4 11c0 10 0 5 -8 13c-4 4 -10 11 -12 17
+c-7 16 1 30 10 43c9 14 -7 20 -10 32c-1 6 -7 6 -6 12c1 7 -4 5 -9 9c-12 8 -1 20 -7 26c-43 -70 -36 -162 16 -224c1 -1 0 -1 1 -2h1c3 -4 6 -8 9 -11s7 -6 10 -9z" />
+ <glyph glyph-name="ion-easel" unicode="&#xf3c2;"
+d="M48 112v192h352v-192h-352zM432 352c9 0 16 -7 16 -16v-256c0 -9 -7 -16 -16 -16h-416c-9 0 -16 7 -16 16v256c0 9 7 16 16 16h416zM416 96v224h-384v-224h384zM48 -32l29 80h31l-28 -80h-32zM239 416l17 -48h-64l17 48h30zM340 48h31l29 -80h-32zM208 0v48h32v-48h-32z
+" />
+ <glyph glyph-name="ion-edit" unicode="&#xf2bf;"
+d="M381 259l-250 -251l-91 91l251 250zM440 360c12 -12 11 -32 -2 -45l-45 -45l-91 91l45 45c13 13 33 14 45 2zM32 85l85 -85l-117 -32z" />
+ <glyph glyph-name="ion-egg" unicode="&#xf277;" horiz-adv-x="320"
+d="M160 416c64 0 160 -133 160 -257s-64 -191 -160 -191s-160 67 -160 191s96 257 160 257z" />
+ <glyph glyph-name="ion-eject" unicode="&#xf131;" horiz-adv-x="320"
+d="M303 128h-286v0c-10 0 -17 7 -17 16c0 3 1 5 3 8l138 191c5 5 11 9 19 9s14 -4 19 -9l138 -190c2 -3 3 -6 3 -9c0 -9 -7 -16 -17 -16v0zM308 96c7 0 12 -5 12 -12v-40c0 -7 -5 -12 -12 -12h-296c-7 0 -12 5 -12 12v40c0 7 5 12 12 12h296z" />
+ <glyph glyph-name="ion-email-unread" unicode="&#xf3c3;" horiz-adv-x="480"
+d="M352 288c0 43 21 64 64 64s64 -21 64 -64s-21 -64 -64 -64s-64 21 -64 64zM209 288h127c0 -17 5 -33 15 -47c-6 -3 -14 -8 -22 -12s-16 -8 -23 -12s-14 -8 -22 -12s-15 -8 -21 -11s-11 -6 -16 -9s-9 -5 -12 -7s-4 -3 -5 -3c-6 -3 -13 -4 -21 -4s-15 1 -21 4
+c-1 1 -15 8 -42 23s-54 29 -81 44s-43 23 -46 25c-7 4 -12 8 -13 11c-1 4 -1 6 1 8s6 2 11 2h191zM277 175c18 11 45 30 83 56c16 -15 34 -23 56 -23v-155c0 -2 -1 -4 -2 -7s-3 -5 -5 -7s-4 -4 -7 -5s-6 -2 -8 -2h-185h-185c-5 0 -11 2 -16 7s-8 9 -8 14v205c0 6 3 8 9 5
+c2 -1 11 -7 26 -17s32 -22 53 -36s39 -26 53 -35l-83 -93c-2 -2 -2 -4 -1 -5c2 -1 4 -1 6 1l98 83c16 -10 25 -16 27 -17c6 -3 13 -4 21 -4s15 1 21 4c2 1 11 7 27 17l98 -83c2 -2 5 -2 6 -1s0 3 -2 5z" />
+ <glyph glyph-name="ion-email" unicode="&#xf132;" horiz-adv-x="416"
+d="M19 299c-4 2 -11 7 -13 11c-3 8 1 10 12 10h191h191c11 0 15 -2 12 -10c-2 -4 -9 -9 -13 -11c-11 -6 -163 -89 -169 -92s-12 -4 -21 -4s-15 1 -21 4s-158 86 -169 92zM408 295c9 4 8 -1 8 -5v-205c0 -9 -12 -21 -22 -21h-185h-185c-10 0 -24 12 -24 21v205s0 9 9 5
+c8 -4 83 -56 132 -88l-83 -93c-2 -2 -2 -4 -1 -5s4 -1 6 1l98 83c15 -10 25 -16 27 -17c8 -4 14 -4 21 -4s13 0 21 4c2 1 12 7 27 17l98 -83c2 -2 5 -2 6 -1s0 3 -2 5l-82 93c49 32 123 84 131 88z" />
+ <glyph glyph-name="ion-erlenmeyer-flask-bubbles" unicode="&#xf3c4;" horiz-adv-x="384"
+d="M382 21c2 -4 3 -10 0 -14s-8 -7 -13 -7h-177h-178c-5 0 -9 3 -12 7s-2 10 0 14l118 199v150c0 8 6 14 14 14s15 -6 15 -14v-80c4 3 10 5 16 5c15 0 27 -12 27 -27s-12 -26 -27 -26c-6 0 -12 2 -16 5v-31c0 -2 -1 -4 -2 -6l-35 -59h72c-15 6 -26 20 -26 37
+c0 23 19 42 43 42c15 0 27 -8 35 -19c-1 2 -1 3 -1 5v154c0 8 6 14 14 14s15 -6 15 -14v-150zM218 151h53l-31 54c2 -5 3 -11 3 -17c0 -17 -10 -31 -25 -37zM201 319c-12 0 -22 9 -22 21s10 21 22 21s22 -9 22 -21s-10 -21 -22 -21z" />
+ <glyph glyph-name="ion-erlenmeyer-flask" unicode="&#xf3c5;" horiz-adv-x="384"
+d="M375 52c6 -9 9 -20 9 -32c0 -28 -16 -52 -63 -52h-258c-47 0 -63 24 -63 52c0 12 3 23 9 32l49 73l49 77c13 20 21 44 21 70v92s-14 34 -16 43c-2 8 1 9 17 9h126c16 0 18 -1 16 -9c-2 -9 -15 -22 -15 -42v-93c0 -26 6 -50 19 -70zM345 7c3 3 7 8 7 14c0 5 -2 10 -4 14
+l-101 150c-16 26 -23 56 -23 87v112h-64v-112c0 -32 -9 -62 -25 -87l-99 -150c-2 -4 -4 -9 -4 -14c0 -6 3 -11 6 -14c4 -4 12 -7 25 -7h258c13 0 20 3 24 7zM325 37c1 -2 3 -6 3 -8c0 -7 -6 -15 -14 -15h-244c-7 0 -14 6 -14 14c0 3 1 6 3 8l81 124h103l82 -124v1zM238 106
+c2 -1 4 -2 6 -2s3 0 5 2c1 2 3 4 3 6s-1 4 -3 6c-1 2 -3 2 -5 2s-4 0 -6 -2c-1 -2 -2 -4 -2 -6s0 -4 2 -6zM285 47c4 2 4 7 2 11l-23 36c-1 2 -4 4 -7 4c-2 0 -3 0 -4 -1c-4 -2 -4 -7 -2 -11l23 -36c1 -2 5 -4 7 -4c1 0 3 0 4 1z" />
+ <glyph glyph-name="ion-eye-disabled" unicode="&#xf306;"
+d="M344 290c41 -27 76 -66 104 -100c-51 -54 -124 -135 -224 -135c-36 0 -65 8 -92 22l-77 -77l-23 23l71 71c-36 25 -68 61 -103 98c78 85 142 137 224 137c34 0 64 -9 92 -23l77 78l23 -23zM134 192c0 -19 6 -36 16 -51l27 27c-4 7 -5 15 -5 24c0 29 23 53 52 53h8
+c-5 -6 -8 -13 -8 -21c0 -3 0 -5 1 -8l51 50c-15 11 -33 17 -52 17c-49 0 -90 -41 -90 -91zM224 101c49 0 90 41 90 91c0 19 -6 37 -16 52l-50 -51c3 -1 5 -1 8 -1c8 0 14 3 20 7v-7c0 -29 -23 -53 -52 -53c-9 0 -17 2 -24 6l-28 -27c15 -11 33 -17 52 -17z" />
+ <glyph glyph-name="ion-eye" unicode="&#xf133;"
+d="M224 320c99 0 172 -70 224 -129c-51 -50 -124 -127 -224 -127s-157 60 -224 128c78 79 142 128 224 128zM224 101c49 0 90 41 90 91s-41 91 -90 91s-90 -41 -90 -91s41 -91 90 -91zM224 224c0 -18 14 -32 32 -32c8 0 14 3 20 7v-7c0 -29 -23 -53 -52 -53s-52 24 -52 53
+s23 53 52 53h8c-5 -6 -8 -13 -8 -21z" />
+ <glyph glyph-name="ion-female" unicode="&#xf278;" horiz-adv-x="256"
+d="M160 164v-68h64v-64h-64v-64h-64v64h-64v64h64v68c-55 14 -96 64 -96 124c0 71 57 128 128 128s128 -57 128 -128c0 -60 -41 -110 -96 -124zM128 208c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80z" />
+ <glyph glyph-name="ion-filing" unicode="&#xf134;" horiz-adv-x="384"
+d="M317 319c12 0 19 0 19 -20v-28h-288v28c0 20 8 20 20 20h249zM269 352c13 0 19 -1 19 -19h-192c0 18 7 19 20 19h153zM368 278c13 -8 17 -17 15 -41l-17 -184c-4 -21 -16 -21 -24 -21h-300c-8 0 -20 0 -24 21l-17 185c-3 26 1 31 15 40l15 10v-32h321v32z" />
+ <glyph glyph-name="ion-film-marker" unicode="&#xf135;" horiz-adv-x="416"
+d="M400 240c9 0 16 -7 16 -15v-210c0 -8 -7 -15 -16 -15h-384c-9 0 -16 7 -16 15v210c0 8 6 14 13 15c-2 2 -3 4 -4 7l-9 45c-2 8 5 16 13 18l370 74c8 2 16 -4 18 -12l9 -46c2 -8 -4 -16 -12 -18l-342 -68h344zM257 46l-20 58l51 36h-62l-20 58l-19 -58h-63l51 -36l-19 -58
+l50 36z" />
+ <glyph glyph-name="ion-fireball" unicode="&#xf319;" horiz-adv-x="320"
+d="M297 210c14 -24 23 -52 23 -82c0 -33 -10 -63 -26 -88v0v0c-29 -43 -78 -72 -134 -72c-17 0 -32 1 -46 7s-25 13 -33 25c-11 16 -17 28 -21 52c-6 -25 2 -48 9 -60c-43 26 -69 71 -69 125v4c5 78 65 109 90 151c8 14 13 30 10 48c11 -9 15 -25 15 -39
+c0 -16 -3 -29 -3 -29c4 8 7 18 9 31c6 35 2 85 -37 132l-1 1s7 0 18 -3c95 -16 169 -91 184 -186c2 -12 3 -23 3 -35c0 -16 -2 -32 -5 -47c10 23 13 43 14 55v10z" />
+ <glyph glyph-name="ion-flag" unicode="&#xf279;" horiz-adv-x="384"
+d="M362 266c0 0 12 2 22 6c0 -16 -7 -32 -9 -36c-28 -50 -99 -123 -181 -84c-65 31 -92 30 -117 24c-1 0 -2 -1 -3 -1c-3 -1 -15 -5 -26 -1v197c0 16 14 31 33 35c39 7 106 5 148 -74c39 -74 97 -72 133 -66zM24 416c4 0 8 -4 8 -8v-432c0 -4 -4 -8 -8 -8h-16
+c-4 0 -8 4 -8 8v432c0 4 4 8 8 8h16z" />
+ <glyph glyph-name="ion-flame" unicode="&#xf31a;" horiz-adv-x="256"
+d="M1 128c-11 109 72 224 159 288c-26 -145 97 -142 96 -288c-1 -120 -105 -160 -128 -160s-114 26 -127 160zM88 80c0 -44 40 -80 40 -80s41 36 41 80s-41 80 -41 80s-40 -36 -40 -80z" />
+ <glyph glyph-name="ion-flash-off" unicode="&#xf136;"
+d="M115 -4c-69 38 -115 112 -115 196c0 124 100 224 224 224c24 0 47 -4 68 -11c2 -1 3 -1 5 -2c12 -4 24 -9 35 -15v0c69 -38 116 -112 116 -196c0 -124 -100 -224 -224 -224c-24 0 -47 4 -68 11c-2 1 -3 1 -5 2c-12 4 -24 8 -35 14zM86 291c-20 -28 -32 -62 -32 -99
+c0 -65 36 -121 90 -150c6 -3 13 -7 19 -9c2 -1 3 -1 5 -2c9 -3 19 -5 29 -7c9 -2 18 -2 27 -2c37 0 71 12 99 32l-52 53l36 40l55 -54c20 28 32 62 32 99c0 66 -37 123 -91 151c-6 3 -12 6 -18 8c-2 1 -3 1 -5 2c-9 3 -19 5 -29 7c-9 2 -18 2 -27 2c-37 0 -72 -12 -100 -32
+l53 -52l-36 -41zM178 58l38 113h-85l139 155l-38 -113h85z" />
+ <glyph glyph-name="ion-flash" unicode="&#xf137;" horiz-adv-x="320"
+d="M0 160l224 256l-51 -192h147l-224 -256l51 192h-147z" />
+ <glyph glyph-name="ion-folder" unicode="&#xf139;" horiz-adv-x="384"
+d="M366 256c18 0 19 -7 18 -18l-12 -186c-1 -11 -3 -20 -21 -20h-317c-18 0 -20 9 -21 20l-13 184c-1 11 0 20 18 20h348zM362 305l2 -33h-344c0 6 4 46 6 63c2 18 8 17 25 17h75c28 0 23 0 37 -15c16 -18 19 -17 41 -17h143c11 0 15 -3 15 -15z" />
+ <glyph glyph-name="ion-fork-repo" unicode="&#xf2c0;" horiz-adv-x="320"
+d="M320 368v-64h-48v-48h-64v48h-48v64h48v48h64v-48h48zM208 208h64v-5v0c0 -43 -7 -70 -38 -95c-23 -19 -51 -20 -75 -22c-9 -1 -18 -2 -26 -3c-6 -1 -13 -5 -20 -10c9 -11 15 -25 15 -41c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 24 13 44 32 55v210c-19 11 -32 31 -32 55
+c0 35 29 64 64 64s64 -29 64 -64c0 -24 -13 -44 -32 -55v-160c8 4 18 7 27 9c11 2 21 2 31 3c17 1 33 3 40 9c10 8 14 11 14 50zM64 384c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM64 0c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32
+s14 -32 32 -32z" />
+ <glyph glyph-name="ion-fork" unicode="&#xf27a;" horiz-adv-x="128"
+d="M78 299v0v0v0zM128 282c0 -26 -15 -48 -37 -58c-12 -6 -11 -11 -11 -11s16 -200 16 -213s-3 -18 -9 -24s-15 -8 -23 -8v0v0c-8 0 -16 2 -22 8s-10 13 -10 24s16 213 16 213s0 6 -11 11c-22 10 -37 32 -37 58c0 43 15 93 24 134h8v-117c0 -6 3 -11 9 -11s9 4 10 10v1
+l9 117h8l10 -117v-1c1 -6 3 -10 9 -10s9 5 9 11v117h8v0c9 -40 24 -91 24 -134z" />
+ <glyph glyph-name="ion-forward" unicode="&#xf13a;" horiz-adv-x="384"
+d="M224 150c-102 0 -171 -9 -224 -102c0 0 37 208 224 208v80l160 -144l-160 -134v92z" />
+ <glyph glyph-name="ion-funnel" unicode="&#xf31b;"
+d="M224 416c124 0 224 -36 224 -80c0 -8 -3 -15 -9 -22v0c-35 -43 -151 -179 -151 -218v-4v-83v0c0 -23 -29 -41 -64 -41s-64 18 -64 41v0v87c0 39 -117 177 -149 216v0c-7 8 -11 16 -11 24c0 44 100 80 224 80zM224 288c92 0 176 22 176 48s-83 48 -176 48
+s-176 -22 -176 -48s84 -48 176 -48z" />
+ <glyph glyph-name="ion-gear-a" unicode="&#xf13d;" horiz-adv-x="384"
+d="M347 192c0 -24 15 -43 37 -56c-4 -13 -10 -26 -16 -38c-25 6 -45 -3 -62 -20s-22 -37 -16 -62c-12 -6 -25 -12 -38 -16c-13 22 -36 37 -60 37s-47 -15 -60 -37c-13 4 -27 10 -39 16c6 25 2 45 -15 62s-37 21 -62 15c-6 12 -12 26 -16 39c22 13 37 36 37 60s-15 43 -37 56
+c4 13 9 26 16 38c25 -6 45 3 62 20s21 37 15 62c12 6 26 12 39 16c13 -22 36 -37 60 -37s47 15 60 37c13 -4 27 -10 39 -16c-6 -25 -2 -45 15 -62s37 -26 62 -20c6 -12 12 -25 16 -38c-22 -13 -37 -32 -37 -56zM192 94c54 0 98 44 98 98s-44 98 -98 98s-98 -44 -98 -98
+s44 -98 98 -98z" />
+ <glyph glyph-name="ion-gear-b" unicode="&#xf13e;" horiz-adv-x="384"
+d="M384 154h-44c-4 -14 -10 -27 -17 -39l32 -32l-54 -54l-33 32c-12 -7 -24 -11 -38 -15v-46h-76v46c-13 4 -26 8 -38 15l-33 -32l-54 54l32 32c-7 12 -13 25 -17 39h-44v76h43c4 14 9 29 16 41l-30 30l54 54l29 -29c13 8 27 13 42 17v41h76v-41c15 -4 29 -9 42 -17l29 29
+l54 -54l-30 -30c7 -12 13 -27 16 -41h43v-76zM192 138c30 0 54 24 54 54s-24 54 -54 54s-54 -24 -54 -54s24 -54 54 -54z" />
+ <glyph glyph-name="ion-grid" unicode="&#xf13f;" horiz-adv-x="320"
+d="M64 295c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM192 295c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM320 295c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM64 167
+c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM192 167c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM320 167c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM64 39
+c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM192 39c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM320 39c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50z" />
+ <glyph glyph-name="ion-hammer" unicode="&#xf27b;" horiz-adv-x="320"
+d="M314 416c3 0 6 -3 6 -6v-84c0 -3 -3 -6 -6 -6h-52c-3 0 -6 3 -6 6v14c-6 5 -16 9 -22 7c-7 -2 -23 -13 -30 -25s-6 -28 -6 -66l8 -2c5 -1 7 -6 7 -9v-70c0 -95 11 -201 11 -201c0 -3 -3 -6 -6 -6h-84c-3 0 -6 3 -6 6c0 0 11 106 11 201v70c0 3 3 8 7 9l7 2
+c0 43 -5 58 -22 74c-18 16 -41 19 -63 17s-51 -35 -58 -45s-10 2 -10 11c1 16 22 60 72 81s91 22 102 22s27 -1 38 -3s16 -18 26 -18c7 0 14 5 18 9v6c0 3 3 6 6 6h52z" />
+ <glyph glyph-name="ion-happy-outline" unicode="&#xf3c6;"
+d="M355 158c8 -4 11 -13 7 -21c-24 -46 -78 -73 -138 -73c-62 0 -118 29 -139 74c-4 8 0 17 8 21c2 1 5 1 7 1c6 0 11 -3 14 -9c16 -34 60 -55 110 -55c49 0 92 21 110 56c3 5 8 8 14 8c3 0 5 -1 7 -2zM381 217c5 -7 4 -17 -4 -22c-3 -2 -6 -3 -10 -3c-5 0 -11 2 -14 6
+s-7 10 -17 10s-14 -6 -17 -10s-9 -6 -14 -6c-4 0 -7 1 -10 3c-8 6 -9 15 -3 22c11 14 23 23 44 23s35 -9 45 -23zM157 217c5 -7 4 -17 -4 -22c-3 -2 -6 -3 -10 -3c-5 0 -11 2 -14 6s-7 10 -17 10s-14 -6 -17 -10s-9 -6 -14 -6c-4 0 -7 1 -10 3c-8 6 -9 15 -3 22
+c11 14 23 23 44 23s35 -9 45 -23zM224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c36 36 56 85 56 136s-20 100 -56 136s-85 56 -136 56s-100 -20 -136 -56s-56 -85 -56 -136s20 -100 56 -136s85 -56 136 -56
+s100 20 136 56z" />
+ <glyph glyph-name="ion-happy" unicode="&#xf31c;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM71 195c3 -2 6 -3 10 -3c5 0 11 2 14 6s7 10 17 10s14 -6 17 -10s9 -6 14 -6c4 0 7 1 10 3c8 5 9 15 4 22c-10 14 -24 23 -45 23s-33 -9 -44 -23c-6 -7 -5 -16 3 -22zM362 137
+c4 8 1 17 -7 21c-2 1 -4 2 -7 2c-6 0 -11 -3 -14 -8c-18 -35 -61 -56 -110 -56c-50 0 -94 21 -110 55c-3 6 -8 9 -14 9c-2 0 -5 0 -7 -1c-8 -4 -12 -13 -8 -21c21 -45 77 -74 139 -74c60 0 114 27 138 73zM377 195c8 5 9 15 4 22c-10 14 -24 23 -45 23s-33 -9 -44 -23
+c-6 -7 -5 -16 3 -22c3 -2 6 -3 10 -3c5 0 11 2 14 6s7 10 17 10s14 -6 17 -10s9 -6 14 -6c4 0 7 1 10 3z" />
+ <glyph glyph-name="ion-headphone" unicode="&#xf140;" horiz-adv-x="384"
+d="M383 210c3 -51 -3 -130 -13 -162c-20 -67 -40 -80 -72 -80s-58 27 -58 59v106c0 33 23 59 53 59c18 0 34 -9 44 -24c0 0 11 7 13 22s4 34 -5 64s-21 19 -36 38c-2 3 -5 7 -8 10l-10 10c-2 2 -3 3 -5 4c-11 9 -21 17 -34 23c-19 9 -39 13 -60 13s-42 -4 -61 -13
+c-13 -6 -22 -14 -33 -23c-2 -1 -3 -2 -5 -4l-10 -10s-6 -7 -8 -10c-15 -19 -27 -8 -36 -38c-9 -31 -7 -49 -5 -64s13 -22 13 -22c10 15 26 24 44 24c30 0 53 -27 53 -59v-106c0 -32 -26 -59 -58 -59s-52 13 -72 80c-10 32 -16 111 -13 162c3 60 22 108 56 145v0
+c8 8 15 16 24 23s19 13 29 18c25 13 53 20 82 20s57 -7 82 -20c10 -5 19 -11 28 -18s17 -15 25 -23v0c34 -37 53 -85 56 -145z" />
+ <glyph glyph-name="ion-heart-broken" unicode="&#xf31d;" horiz-adv-x="416"
+d="M181 160c0 -36 -2 -71 4 -107c2 -10 2 -20 2 -31l-153 159c-45 47 -45 124 0 171c40 41 103 43 144 3c-2 -15 -3 -31 -3 -46c-18 -14 -40 -21 -56 -39l11 7c17 11 15 8 35 14c3 1 8 3 11 5c0 -1 -1 -5 -1 -6c1 -20 11 -39 15 -60c0 -5 1 -10 -1 -15c-8 -17 -7 -37 -8 -55
+zM274 147c8 -18 23 -29 38 -39l-104 -108l-17 18c0 13 -4 26 -4 38c-2 48 10 94 21 142v0c1 -1 2 -1 3 -1c30 -6 52 -24 63 -50zM382 352c46 -47 46 -124 0 -171l-68 -70c-28 24 -42 54 -65 81c-12 13 -26 23 -41 32c-3 13 -8 26 -11 39c-3 12 14 21 16 31c3 12 3 26 3 39
+l19 19c40 42 107 42 147 0z" />
+ <glyph glyph-name="ion-heart" unicode="&#xf141;" horiz-adv-x="416"
+d="M382 352c46 -47 46 -124 0 -171l-174 -181l-174 181c-46 47 -46 124 0 171c40 42 107 42 147 0l27 -28l28 28c40 42 106 42 146 0z" />
+ <glyph glyph-name="ion-help-buoy" unicode="&#xf27c;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM402 264c-10 24 -23 45 -42 64s-41 32 -65 42l-19 -61c14 -6 27 -15 38 -26s21 -24 27 -38zM224 96c53 0 96 43 96 96s-43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96zM88 328
+c-19 -19 -32 -41 -42 -65l61 -19c6 14 15 27 26 38s24 21 38 27l-19 61c-24 -10 -45 -23 -64 -42zM46 120c10 -24 23 -45 42 -64s41 -32 65 -42l19 61c-14 6 -27 15 -38 26s-21 24 -27 38zM360 56c19 19 32 41 42 65l-61 19c-6 -14 -15 -27 -26 -38s-24 -21 -38 -27l19 -61
+c24 10 45 23 64 42z" />
+ <glyph glyph-name="ion-help-circled" unicode="&#xf142;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM244 89c1 18 -12 31 -29 31c-16 0 -30 -11 -30 -29s12 -30 28 -30c17 0 31 10 31 28zM293 217c7 10 12 22 12 36c0 23 -9 40 -25 52c-17 13 -37 18 -62 18
+c-19 0 -34 -4 -47 -13c-19 -13 -28 -34 -28 -68h49c0 9 -1 19 4 27s13 15 26 15s19 -3 25 -11c5 -7 8 -15 8 -23c0 -7 -4 -14 -8 -20c-2 -4 -6 -7 -10 -10c0 0 -26 -15 -35 -30c-7 -11 -9 -24 -10 -41c0 -1 0 -4 4 -4h39s5 3 5 4c0 6 1 15 2 19c2 7 6 12 12 17l14 9
+c12 9 21 17 25 23z" />
+ <glyph glyph-name="ion-help" unicode="&#xf143;" horiz-adv-x="256"
+d="M217 371c25 -19 39 -46 39 -83c0 -22 -8 -42 -19 -57c-7 -9 -21 -21 -40 -36l-21 -14c-10 -8 -17 -18 -20 -28c-2 -6 -3 -19 -3 -29c0 -2 -1 -6 -7 -6h-62c-7 0 -7 3 -7 5c1 26 4 49 15 66c15 23 57 48 57 48c6 5 11 9 15 15c7 10 12 21 12 32c0 13 -3 26 -11 36
+c-10 12 -21 18 -41 18s-32 -11 -40 -24s-7 -29 -7 -43h-77c0 54 14 88 44 108c20 14 45 20 75 20c39 0 70 -7 98 -28zM114 78c27 -1 47 -20 46 -48s-22 -46 -49 -45c-26 1 -46 19 -45 47s22 47 48 46z" />
+ <glyph glyph-name="ion-home" unicode="&#xf144;" horiz-adv-x="384"
+d="M384 160h-48v-160h-96v128h-96v-128h-96v160h-48l192 224z" />
+ <glyph glyph-name="ion-icecream" unicode="&#xf27d;" horiz-adv-x="320"
+d="M32 192h256l-128 -224zM307 275c8 -5 13 -13 13 -23c0 -16 -14 -28 -30 -28h-4h-252h-4c-16 0 -30 13 -30 28c0 10 6 18 14 23c1 0 1 2 2 2c4 3 7 7 8 12v1c-2 6 -2 12 -2 18c0 42 34 76 76 76c8 0 16 -2 23 -4c-3 -12 -4 -31 -4 -31c2 15 11 29 11 29c18 23 46 38 77 38
+c53 0 96 -43 96 -96c0 -11 -2 -21 -5 -30v-1c0 -4 4 -9 8 -12c1 0 2 -2 3 -2z" />
+ <glyph glyph-name="ion-image" unicode="&#xf147;"
+d="M336 224c-26 0 -48 22 -48 48s22 48 48 48s48 -22 48 -48s-22 -48 -48 -48zM420 384c16 0 28 -12 28 -28v-328c0 -16 -12 -28 -28 -28h-392c-16 0 -28 12 -28 28v328c0 16 12 28 28 28h392zM317 186l99 -106v260c0 7 -6 12 -13 12h-358c-7 0 -12 -5 -13 -12v-260l126 152
+c4 4 10 8 17 8s13 -2 17 -7l54 -59l4 -4c3 -2 7 -4 11 -4s8 2 12 5l18 16c4 3 8 5 13 5s10 -2 13 -6z" />
+ <glyph glyph-name="ion-images" unicode="&#xf148;"
+d="M426 308c13 -1 23 -12 22 -24l-14 -263c-1 -13 -12 -22 -25 -21l-330 16c-13 1 -23 10 -22 23l2 46l-15 -1c-12 -1 -22 7 -23 18l-21 236c-1 11 7 21 19 22l296 24c12 1 22 -7 23 -18l5 -54zM71 302c1 12 11 22 24 22l219 -11l-2 31h-1v1c-1 5 -5 8 -10 8l-261 -22
+c-5 0 -10 -4 -10 -9v0v-1l16 -178l18 25zM405 66l10 198v1v0c0 6 -5 10 -11 10l-58 3l-29 2l-204 9c-6 0 -11 -4 -12 -9v0v-1l-3 -63l-7 -128v-7l6 7l102 109c4 4 8 6 14 6s11 -3 14 -7l43 -49l3 -3c2 -2 6 -4 10 -4s5 1 9 3l17 12c4 3 7 4 11 4s9 -2 11 -5l27 -33zM341 186
+c-20 0 -35 15 -35 35s16 35 35 35c20 0 35 -16 35 -35s-16 -35 -35 -35z" />
+ <glyph glyph-name="ion-information-circled" unicode="&#xf149;"
+d="M448 195c2 -124 -97 -225 -221 -227s-225 97 -227 221s97 225 221 227s225 -97 227 -221zM224 336c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM268 53v11h-22v172h-66v-12h22v-160h-22v-11h88z" />
+ <glyph glyph-name="ion-information" unicode="&#xf14a;" horiz-adv-x="128"
+d="M96 0h32v-16h-128v16h32v240h-32v16h96v-256zM64 304c-27 0 -48 21 -48 48s21 48 48 48s48 -21 48 -48s-21 -48 -48 -48z" />
+ <glyph glyph-name="ion-ionic" unicode="&#xf14b;" horiz-adv-x="416"
+d="M376 315c25 -34 40 -77 40 -123c0 -115 -93 -208 -208 -208s-208 93 -208 208s93 208 208 208c46 0 89 -15 123 -40c5 3 11 5 18 5c18 0 32 -14 32 -32c0 -7 -2 -13 -5 -18zM344 56c18 18 31 38 41 61c10 24 15 49 15 75s-5 51 -15 75c-6 13 -13 26 -21 38
+c-4 -2 -10 -4 -15 -4c-18 0 -32 14 -32 32c0 5 2 11 4 15c-12 8 -25 15 -38 21c-24 10 -49 15 -75 15s-51 -5 -75 -15c-23 -10 -43 -23 -61 -41s-31 -38 -41 -61c-10 -24 -15 -49 -15 -75s5 -51 15 -75c10 -23 23 -43 41 -61s38 -31 61 -41c24 -10 49 -15 75 -15s51 5 75 15
+c23 10 43 23 61 41zM112 192c0 64 32 96 96 96s96 -32 96 -96s-32 -96 -96 -96s-96 32 -96 96z" />
+ <glyph glyph-name="ion-ios-alarm-outline" unicode="&#xf3c7;" horiz-adv-x="404"
+d="M384 256l-54 52l-9 -9c35 -32 57 -79 57 -130c0 -44 -16 -83 -43 -114l36 -45l-12 -10l-35 43c-32 -30 -75 -49 -122 -49v0v0c-47 0 -90 19 -122 49l-35 -43l-12 10l36 45c-27 31 -43 71 -43 115c0 51 22 97 57 129l-9 9l-54 -52c-12 14 -20 32 -20 52c0 44 35 80 80 82
+h5c20 0 39 -7 54 -18l-54 -52l11 -11c26 19 56 32 90 35v0c0 8 8 16 16 16s15 -8 15 -16v0c34 -3 65 -16 91 -35l11 11l-54 52c15 11 34 18 54 18h5c45 -2 80 -38 80 -82c0 -20 -8 -38 -20 -52zM22 280l91 89c-9 5 -19 7 -32 6c-37 -2 -65 -32 -65 -67c0 -10 2 -19 6 -28z
+M362 172c0 88 -72 158 -160 158s-160 -70 -160 -158s72 -158 160 -158s160 70 160 158zM291 369l91 -89c4 9 6 18 6 28c0 35 -28 65 -65 67c-13 1 -23 -1 -32 -6zM202 288h16v-144h-112v16h96v128z" />
+ <glyph glyph-name="ion-ios-alarm" unicode="&#xf3c8;" horiz-adv-x="404"
+d="M385 256l-55 52l-9 -9c35 -32 57 -79 57 -130c0 -44 -16 -83 -43 -114l37 -45l-13 -10l-35 43c-32 -30 -75 -49 -122 -49v0v0c-47 0 -90 19 -122 49l-35 -43l-12 10l36 45c-27 31 -43 70 -43 114c0 51 22 98 57 130l-9 9l-54 -52c-12 14 -20 32 -20 52c0 44 35 80 80 82
+h5c20 0 39 -7 54 -18l-54 -53l11 -10c26 19 56 32 90 35v0c0 8 8 16 16 16s15 -8 15 -16v0c34 -3 65 -16 91 -35l11 11l-54 52c15 11 34 18 54 18h5c45 -2 80 -38 80 -82c0 -20 -7 -38 -19 -52zM218 144v144h-16v-128h-96v-16h112z" />
+ <glyph glyph-name="ion-ios-albums-outline" unicode="&#xf3c9;"
+d="M432 304h-416v-288h416v288zM448 320v0v-320h-448v320h448zM40 336v16h368v-16h-368zM72 368v16h304v-16h-304z" />
+ <glyph glyph-name="ion-ios-albums" unicode="&#xf3ca;"
+d="M448 320v0v-320h-448v320h448zM40 336v16h368v-16h-368zM72 368v16h304v-16h-304z" />
+ <glyph glyph-name="ion-ios-americanfootball-outline" unicode="&#xf3cb;" horiz-adv-x="416"
+d="M331 315c112 -112 81 -327 81 -327s-26 -4 -65 -4c-73 0 -189 12 -262 85c-112 112 -81 327 -81 327s26 4 65 4c73 0 189 -12 262 -85zM17 383c-2 -19 -5 -60 0 -107c1 -8 2 -16 3 -23l127 127c-25 3 -51 5 -78 5v0v0c-22 0 -41 -1 -52 -2zM96 80c30 -30 72 -53 124 -66
+c10 -3 20 -5 31 -7l142 142c-4 22 -10 44 -17 63c-14 37 -32 68 -56 92c-30 30 -72 53 -124 66c-10 3 -20 5 -31 7l-142 -142c4 -22 10 -44 17 -63c14 -37 32 -68 56 -92zM399 1c2 19 5 60 0 107c-1 8 -2 16 -3 23l-127 -127c25 -3 51 -5 78 -5c22 0 41 1 52 2zM259 130
+l-28 -29l-12 12l29 28l-23 23l-28 -29l-12 12l29 28l-23 23l-28 -29l-12 12l29 28l-23 23l-28 -29l-12 12l29 28l-22 23l-29 -29l-11 12l67 67l12 -11l-29 -29l23 -22l28 29l12 -12l-29 -28l23 -23l28 29l12 -12l-29 -28l23 -23l28 29l12 -12l-29 -28l22 -23l29 29l12 -12
+l-29 -28l22 -23l29 29l11 -12l-67 -67l-12 11l29 29z" />
+ <glyph glyph-name="ion-ios-americanfootball" unicode="&#xf3cc;" horiz-adv-x="416"
+d="M331 315c112 -112 81 -327 81 -327s-26 -4 -65 -4c-73 0 -189 12 -262 85c-112 112 -81 327 -81 327s26 4 65 4c73 0 189 -12 262 -85zM20 253l3 -18l142 142l-18 3zM219 113l12 -12l28 29l23 -22l-29 -29l12 -11l67 67l-11 12l-29 -29l-22 23l29 28l-12 12l-28 -29
+l-23 23l29 28l-12 12l-28 -29l-23 23l29 28l-12 12l-28 -29l-23 23l29 28l-12 12l-28 -29l-23 22l29 29l-12 11l-67 -67l11 -12l29 29l22 -23l-29 -28l12 -12l28 29l23 -23l-29 -28l12 -12l28 29l23 -23l-29 -28l12 -12l28 29l23 -23zM269 4l127 127l-3 18l-142 -142z" />
+ <glyph glyph-name="ion-ios-analytics-outline" unicode="&#xf3cd;"
+d="M224 400c-28 0 -55 -5 -81 -16c-25 -10 -47 -26 -66 -45s-35 -41 -45 -66c-11 -26 -16 -53 -16 -81s5 -55 16 -81c10 -25 26 -47 45 -66s41 -35 66 -45c26 -11 53 -16 81 -16s55 5 81 16c25 10 47 26 66 45s35 41 45 66c11 26 16 53 16 81s-5 55 -16 81
+c-10 25 -26 47 -45 66s-41 35 -66 45c-26 11 -53 16 -81 16zM224 416v0c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM76 128c-25 0 -41 18 -42 19c-3 3 -2 9 1 12s8 2 11 -1c1 -1 15 -17 36 -14c12 2 27 26 38 42c4 6 9 12 12 16
+c17 21 34 23 45 21c24 -3 45 -28 54 -50c7 -18 18 -28 32 -29c15 -1 31 11 43 30c1 2 3 4 4 7c9 17 24 43 52 43c31 0 52 -35 53 -36c2 -4 1 -9 -3 -11s-9 -1 -11 3c0 0 -5 8 -12 15c-6 6 -16 13 -27 13c-18 0 -29 -19 -38 -35c-1 -3 -3 -5 -4 -7c-15 -25 -36 -40 -58 -38
+c-20 1 -36 15 -46 39s-28 39 -41 41c-11 1 -21 -4 -31 -16c-3 -4 -6 -9 -10 -15c-14 -20 -31 -45 -50 -48c-3 0 -5 -1 -8 -1z" />
+ <glyph glyph-name="ion-ios-analytics" unicode="&#xf3ce;"
+d="M224 416c124 0 224 -100 224 -224c0 -13 -1 -25 -3 -37c-1 -6 -2 -12 -3 -17c-24 -98 -113 -170 -218 -170c-122 0 -221 98 -224 219v5c0 9 1 17 2 26c13 111 107 198 222 198zM431 168c1 8 1 16 1 24c0 28 -5 55 -16 81c-10 25 -26 47 -45 66s-41 35 -66 45
+c-26 11 -53 16 -81 16s-55 -5 -81 -16c-25 -10 -47 -26 -66 -45s-35 -41 -45 -66c-11 -26 -16 -53 -16 -81v0c14 -21 29 -34 29 -34h1v-1c1 -1 15 -16 36 -13c12 2 27 26 38 42c4 6 9 12 12 16c17 21 34 23 45 21c24 -3 45 -27 54 -50c7 -18 18 -28 32 -29c15 -1 31 9 43 29
+c1 2 3 4 4 7c9 17 24 44 52 44c31 0 52 -35 53 -36c3 -4 9 -12 16 -20z" />
+ <glyph glyph-name="ion-ios-arrow-back" unicode="&#xf3cf;" horiz-adv-x="192"
+d="M192 320l-127 -128l127 -128l-32 -32l-160 160v0v0l160 160z" />
+ <glyph glyph-name="ion-ios-arrow-down" unicode="&#xf3d0;" horiz-adv-x="320"
+d="M301 288l19 -21l-160 -171l-160 171l19 21l141 -150z" />
+ <glyph glyph-name="ion-ios-arrow-forward" unicode="&#xf3d1;" horiz-adv-x="192"
+d="M0 320l32 32l160 -160v0v0l-160 -160l-32 32l127 128z" />
+ <glyph glyph-name="ion-ios-arrow-left" unicode="&#xf3d2;" horiz-adv-x="192"
+d="M192 333l-150 -141l150 -141l-21 -19l-171 160l171 160z" />
+ <glyph glyph-name="ion-ios-arrow-right" unicode="&#xf3d3;" horiz-adv-x="192"
+d="M0 333l21 19l171 -160l-171 -160l-21 19l150 141z" />
+ <glyph glyph-name="ion-ios-arrow-thin-down" unicode="&#xf3d4;" horiz-adv-x="192"
+d="M190 126c2 -2 2 -4 2 -6s0 -4 -2 -6c0 0 -87 -79 -88 -80s-3 -2 -6 -2s-5 1 -6 2s-88 80 -88 80c-3 3 -3 9 0 12s9 3 12 0l74 -67v285c0 4 4 8 8 8s8 -4 8 -8v-285l74 67c3 3 9 3 12 0z" />
+ <glyph glyph-name="ion-ios-arrow-thin-left" unicode="&#xf3d5;" horiz-adv-x="320"
+d="M94 98c-2 -2 -4 -2 -6 -2s-4 0 -6 2c0 0 -79 87 -80 88s-2 3 -2 6s1 5 2 6s80 88 80 88c3 3 9 3 12 0s3 -9 0 -12l-67 -74h285c4 0 8 -4 8 -8s-4 -8 -8 -8h-285l67 -74c3 -3 3 -9 0 -12z" />
+ <glyph glyph-name="ion-ios-arrow-thin-right" unicode="&#xf3d6;" horiz-adv-x="320"
+d="M226 98c-3 3 -3 9 0 12l67 74h-285c-4 0 -8 4 -8 8s4 8 8 8h285l-67 74c-3 3 -3 9 0 12s9 3 12 0c0 0 79 -87 80 -88s2 -3 2 -6s-1 -5 -2 -6s-80 -88 -80 -88c-2 -2 -4 -2 -6 -2s-4 0 -6 2z" />
+ <glyph glyph-name="ion-ios-arrow-thin-up" unicode="&#xf3d7;" horiz-adv-x="192"
+d="M190 258c-3 -3 -9 -3 -12 0l-74 67v-285c0 -4 -4 -8 -8 -8s-8 4 -8 8v285l-74 -67c-3 -3 -9 -3 -12 0s-3 9 0 12c0 0 87 79 88 80s3 2 6 2s5 -1 6 -2s88 -80 88 -80c2 -2 2 -4 2 -6s0 -4 -2 -6z" />
+ <glyph glyph-name="ion-ios-arrow-up" unicode="&#xf3d8;" horiz-adv-x="320"
+d="M301 96l-141 150l-141 -150l-19 21l160 171l160 -171z" />
+ <glyph glyph-name="ion-ios-at-outline" unicode="&#xf3d9;" horiz-adv-x="255"
+d="M236 127v1h19l-3 -6c-3 -6 -13 -19 -22 -27s-18 -14 -28 -20s-21 -10 -32 -13s-23 -5 -34 -5c-16 0 -33 3 -49 8s-30 13 -43 24c-12 11 -26 29 -34 46c-7 16 -10 33 -10 58c0 18 4 38 11 55c7 16 17 30 29 42s27 21 43 28c15 6 33 9 53 9c16 0 32 -3 46 -8
+c15 -5 28 -12 39 -22s17 -21 24 -35c6 -13 8 -26 8 -44c0 -14 -2 -28 -7 -40s-9 -20 -17 -30c-8 -9 -13 -15 -23 -21c-11 -6 -20 -9 -29 -9c-8 0 -15 2 -20 7c-3 2 -5 6 -6 9c-6 -6 -11 -10 -17 -12c-10 -3 -18 -4 -26 -4s-15 1 -21 4s-12 7 -17 12s-8 11 -11 18
+s-5 14 -5 22c0 12 3 24 7 36v2c4 11 5 16 13 26c8 11 17 19 28 26s24 11 38 11c12 0 21 -3 31 -9c7 -4 12 -10 16 -16l6 17h18l-38 -102c-2 -5 -4 -10 -5 -14s-1 -7 -1 -10c0 -2 1 -4 3 -5s4 -2 8 -2c6 0 11 2 20 7c8 4 12 9 19 17c6 8 10 14 14 25s6 23 6 35
+c0 15 -2 25 -7 36c-6 13 -10 22 -19 30s-20 15 -33 20s-27 7 -42 7c-19 0 -35 -3 -48 -9c-15 -6 -27 -14 -37 -24c-11 -10 -19 -23 -25 -37c-6 -15 -10 -32 -10 -48c0 -22 2 -36 8 -49c6 -15 17 -31 28 -41s24 -18 38 -23s30 -7 46 -7c10 0 20 1 30 4s18 6 27 11
+s17 11 24 18s14 13 19 21zM147 154c4 5 8 12 11 20l21 57c-2 5 -4 10 -7 13c-3 4 -6 6 -10 8c-1 0 -1 1 -2 1c-3 2 -5 3 -9 4c-5 1 -9 2 -13 2c-10 0 -19 -3 -28 -9s-17 -13 -23 -22c-5 -8 -7 -11 -10 -20c0 -1 -1 -3 -1 -4c-4 -11 -5 -20 -5 -30c0 -6 1 -11 3 -16
+s5 -9 8 -13s7 -6 12 -8s9 -3 15 -3c4 0 9 1 14 2c4 1 8 2 12 5s8 7 12 13z" />
+ <glyph glyph-name="ion-ios-at" unicode="&#xf3da;" horiz-adv-x="256"
+d="M228 128v0h28c-1 -1 -2 -4 -3 -6c-4 -6 -14 -19 -23 -27s-18 -14 -28 -20s-20 -10 -32 -13c-11 -3 -23 -5 -34 -5c-16 0 -33 3 -49 8s-30 13 -43 24c-12 10 -26 28 -34 46c-7 16 -10 33 -10 58c0 19 4 39 11 55s17 30 29 42s28 21 44 28c15 6 32 9 52 9c16 0 31 -3 46 -8
+s28 -12 39 -22s18 -22 25 -36c6 -14 8 -26 8 -44c0 -14 -2 -28 -7 -40c-4 -11 -9 -20 -17 -30c-7 -9 -14 -16 -24 -22c-12 -6 -21 -9 -30 -9s-16 2 -22 8c-2 1 -3 3 -4 5c-4 -4 -9 -6 -14 -8c-10 -3 -18 -5 -27 -5c-8 0 -16 2 -23 5s-12 7 -17 12s-9 12 -12 19s-4 14 -4 22
+c0 12 2 25 6 37l1 1c4 10 5 17 13 27c8 11 17 20 28 27c12 7 24 10 38 10c12 0 22 -3 33 -9c5 -3 8 -6 12 -10l5 12h25l-39 -104c-2 -5 -3 -9 -4 -13c-1 -3 -1 -7 -1 -9s0 -3 1 -3c0 0 1 -1 5 -1c5 0 11 2 19 7c7 4 10 8 16 16s9 13 13 23s6 20 6 32c0 14 -1 24 -6 34
+c-5 12 -10 21 -18 28c-9 8 -19 14 -31 18s-26 7 -40 7c-18 0 -32 -3 -44 -8c-14 -6 -25 -13 -35 -23s-18 -22 -24 -35c-6 -14 -9 -30 -9 -45c0 -21 3 -34 8 -46c6 -14 16 -30 26 -39s22 -16 35 -21c14 -5 28 -7 43 -7c10 0 20 2 29 4s18 6 26 11s28 20 38 33zM144 157
+c4 5 7 12 10 19l20 55c-1 4 -3 7 -5 9c-3 3 -6 6 -9 8h-1h-1v1c-3 2 -5 2 -8 3c-4 1 -8 1 -12 1c-9 0 -17 -2 -25 -7c-10 -6 -17 -14 -21 -21c-5 -8 -6 -11 -9 -19c0 -1 -1 -2 -1 -3c-3 -10 -6 -19 -6 -28c0 -5 1 -10 3 -14s4 -8 7 -11s7 -6 11 -8s8 -2 13 -2c4 0 8 0 12 1
+v0c4 1 7 2 11 5c3 2 7 5 11 11z" />
+ <glyph glyph-name="ion-ios-barcode-outline" unicode="&#xf3db;" horiz-adv-x="416"
+d="M0 64v256h80v-16h-64v-224h64v-16h-80zM336 320h80v-256h-80v16h64v224h-64v16zM64 128v128h16v-128h-16zM336 128v128h16v-128h-16zM272 96v192h16v-192h-16zM128 96v192h16v-192h-16zM199 112v160h16v-160h-16z" />
+ <glyph glyph-name="ion-ios-barcode" unicode="&#xf3dc;" horiz-adv-x="416"
+d="M0 320h416v-256h-416v256zM80 128v128h-16v-128h16zM144 96v192h-16v-192h16zM215 112v160h-16v-160h16zM288 96v192h-16v-192h16zM352 128v128h-16v-128h16z" />
+ <glyph glyph-name="ion-ios-baseball-outline" unicode="&#xf3dd;" horiz-adv-x="416"
+d="M415 169v-1v0c-11 -97 -90 -174 -187 -183v0h-2c-2 0 -3 -1 -5 -1h-1h-3h-1h-8c-115 0 -208 93 -208 208v8v1v3v1c0 2 1 3 1 5v2v0c9 97 86 176 183 187v0v0c8 1 16 1 24 1c115 0 208 -93 208 -208c0 -7 0 -14 -1 -20v0v-3zM399 192c0 105 -86 191 -191 191
+c-3 0 -5 -1 -8 -1c0 -11 2 -21 4 -31l20 6l5 -15l-21 -7c2 -7 4 -14 7 -21c2 -5 5 -11 8 -16l17 12l9 -13l-19 -13c7 -12 16 -23 26 -33l14 15l12 -12l-15 -15c11 -10 22 -18 34 -25l12 18l14 -9l-12 -17c5 -2 10 -5 15 -7c7 -3 14 -5 22 -7l7 20l15 -5l-6 -19
+c10 -2 20 -4 30 -4c0 3 1 5 1 8zM17 192c0 -105 86 -191 191 -191h4c-1 9 -1 17 -3 26l-22 -7l-5 16l23 7c-2 8 -5 16 -8 24c-2 5 -4 9 -6 14l-20 -13l-9 13l21 14c-7 12 -16 24 -26 35l-17 -17l-11 11l17 17c-10 10 -22 18 -34 25l-14 -21l-14 9l14 20c-5 2 -10 5 -15 7
+c-7 3 -15 6 -23 8l-8 -24l-15 5l7 23c-9 2 -18 2 -27 3v-4zM228 2c88 9 158 78 169 166c-11 1 -23 3 -34 5l-9 -27l-15 5l8 25c-14 4 -28 10 -41 17l-15 -23l-13 9l14 21c-13 8 -26 17 -37 28l-19 -19l-11 11l19 19c-10 11 -19 23 -27 36l-21 -14l-9 13l22 15
+c-7 13 -12 27 -16 41l-25 -8l-5 16l26 8c-2 12 -4 23 -5 35c-88 -11 -157 -81 -166 -169c10 -1 21 -2 31 -4l8 23l15 -5l-7 -22c14 -4 28 -9 42 -16l13 19l14 -9l-13 -18c13 -8 25 -17 36 -28l17 17l11 -11l-17 -17c11 -12 20 -24 28 -37l19 13l9 -14l-20 -13
+c7 -14 12 -28 16 -42l23 7l5 -15l-24 -8c2 -10 3 -20 4 -30z" />
+ <glyph glyph-name="ion-ios-baseball" unicode="&#xf3de;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208c0 -8 0 -16 -1 -24v0v0c-12 -104 -100 -184 -207 -184c-115 0 -208 93 -208 208c0 107 80 195 184 207v0v0c8 1 16 1 24 1zM212 1c5 0 11 0 16 1c-1 10 -2 20 -4 30l24 8l-5 15l-23 -7c-4 14 -9 28 -16 42l20 13l-9 14l-19 -13
+c-8 13 -17 25 -28 37l17 17l-11 11l-17 -17c-11 11 -23 20 -36 28l13 18l-14 9l-13 -19c-14 7 -28 12 -42 16l7 22l-15 5l-8 -23c-10 2 -21 3 -31 4c-1 -5 -1 -11 -1 -16c9 -1 18 -1 27 -3l-7 -23l15 -5l8 24c8 -2 16 -5 23 -8c5 -2 10 -5 15 -7l-14 -20l14 -9l14 21
+c12 -7 24 -15 34 -25l-17 -17l11 -11l17 17c10 -11 19 -23 26 -35l-21 -14l9 -13l20 13c2 -5 4 -9 6 -14c3 -8 6 -16 8 -24l-23 -7l5 -16l22 7c2 -8 2 -17 3 -26zM363 173c11 -2 23 -4 34 -5c1 5 1 11 1 16c-10 1 -20 2 -30 4l6 19l-15 5l-7 -20c-8 2 -15 4 -22 7
+c-5 2 -10 5 -15 7l12 17l-14 9l-12 -18c-12 7 -23 15 -34 25l15 15l-12 12l-15 -15c-10 10 -18 21 -25 33l19 13l-9 13l-17 -12c-3 5 -6 11 -8 16c-3 7 -5 14 -7 21l21 7l-5 15l-20 -6c-2 10 -3 20 -4 31c-5 0 -11 0 -16 -1c1 -12 3 -23 5 -35l-26 -8l5 -16l25 8
+c4 -14 9 -28 16 -41l-22 -15l9 -13l21 14c8 -13 17 -25 27 -36l-19 -19l11 -11l19 19c11 -11 24 -20 37 -28l-14 -21l13 -9l15 23c13 -7 27 -13 41 -17l-8 -25l15 -5z" />
+ <glyph glyph-name="ion-ios-basketball-outline" unicode="&#xf3df;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM399 192c0 55 -24 105 -62 140c-14 -34 -31 -65 -52 -95c15 -12 31 -21 49 -29c21 -9 43 -14 65 -16v0zM325 343c-32 25 -73 40 -117 40v0c2 -22 6 -44 15 -65
+c10 -25 26 -47 45 -66c2 -1 2 -3 4 -4c20 29 38 60 52 93c0 1 1 1 1 2zM192 382c-51 -4 -96 -29 -128 -65c64 -28 121 -69 169 -119c11 12 21 24 30 37c-40 37 -67 89 -71 147zM233 174c-15 -16 -31 -30 -48 -44c28 -35 45 -79 47 -127c33 4 63 17 88 35
+c-22 50 -51 95 -87 136zM214 178l8 8l-10 10c-46 46 -99 82 -158 108c-18 -25 -31 -55 -35 -88c62 -3 116 -31 155 -74c14 11 27 23 40 36zM18 200c0 -3 -1 -5 -1 -8c0 -45 16 -87 43 -120c36 16 71 36 102 60l-7 7c-19 19 -41 35 -66 45c-22 9 -46 15 -71 16zM71 59
+c35 -36 83 -58 137 -58c3 0 5 1 8 1c-1 25 -6 48 -16 71c-7 17 -17 33 -28 47c-31 -24 -65 -45 -101 -61zM333 48c37 32 61 77 65 128c-46 3 -89 21 -123 48c-10 -13 -20 -26 -31 -38c36 -41 67 -87 89 -138z" />
+ <glyph glyph-name="ion-ios-basketball" unicode="&#xf3e0;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM333 48c-22 51 -53 97 -89 138c11 12 21 25 31 38c34 -27 77 -45 123 -48c0 5 1 11 1 16c-22 2 -44 7 -65 16c-18 8 -34 17 -49 29c21 30 38 61 52 95c-4 4 -8 8 -12 11
+c0 -1 -1 -1 -1 -2c-14 -33 -32 -64 -52 -93c-2 1 -2 2 -4 4c-19 19 -35 41 -45 66c-9 21 -13 43 -15 65c-5 0 -11 -1 -16 -1c4 -58 31 -110 71 -147c-9 -13 -19 -25 -30 -37c-48 50 -105 91 -169 119c-4 -4 -7 -9 -10 -13c59 -26 112 -62 158 -108l10 -10l-8 -8
+c-13 -13 -26 -25 -40 -36c-39 43 -93 71 -155 74c-1 -5 -1 -11 -1 -16c25 -1 49 -7 71 -16c25 -10 47 -26 66 -45l7 -7c-31 -24 -66 -44 -102 -60c4 -4 7 -9 11 -13c36 16 70 37 101 61c11 -14 21 -30 28 -47c10 -23 15 -46 16 -71c5 0 11 0 16 1c-2 48 -19 92 -47 127
+c17 14 33 28 48 44c36 -41 65 -86 87 -136c4 3 9 6 13 10z" />
+ <glyph glyph-name="ion-ios-bell-outline" unicode="&#xf3e1;" horiz-adv-x="384"
+d="M318 222c0 -114 28 -126 66 -158h-384c38 32 66 44 66 158c0 98 53 130 102 138v2c0 12 11 22 24 22s24 -10 24 -22v-2c49 -7 102 -40 102 -138zM43 80h298c-25 25 -40 58 -40 142c0 46 -13 80 -37 101c-23 19 -52 23 -72 23s-49 -4 -72 -23c-25 -21 -37 -55 -37 -101
+c0 -51 -5 -85 -17 -110c-6 -13 -14 -23 -23 -32zM192 0c-27 0 -49 20 -52 43h104c-3 -23 -25 -43 -52 -43z" />
+ <glyph glyph-name="ion-ios-bell" unicode="&#xf3e2;" horiz-adv-x="384"
+d="M318 222c0 -114 28 -126 66 -158h-384c38 32 66 44 66 158c0 98 53 130 102 138v2c0 12 11 22 24 22s24 -10 24 -22v-2c49 -7 102 -40 102 -138zM192 0c-27 0 -49 20 -52 43h104c-3 -23 -25 -43 -52 -43z" />
+ <glyph glyph-name="ion-ios-body-outline" unicode="&#xf3e3;" horiz-adv-x="384"
+d="M192 400c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM192 416v0c27 0 48 -21 48 -48s-21 -48 -48 -48s-48 21 -48 48s21 48 48 48zM360 304c13 0 24 -11 24 -24s-11 -24 -24 -24h-100c-5 0 -14 -5 -18 -15c-5 -12 -2 -33 1 -51l4 -21v-1v0l32 -172
+c2 -13 -6 -26 -19 -28h-5c-11 0 -22 8 -24 20l-21 120v0s-5 31 -17 31h-2c-12 0 -19 -31 -19 -31v0l-21 -120c-2 -12 -11 -20 -22 -20h-5c-13 2 -21 15 -19 28l32 172v1l4 21c3 18 6 39 1 51c-4 10 -12 15 -18 15h-100c-13 0 -24 11 -24 24s11 24 24 24h336zM24 272
+c-4 0 -8 4 -8 8s4 8 8 8h336c4 0 8 -4 8 -8s-4 -8 -8 -8h-102c-16 0 -26 -15 -30 -24c-5 -13 -6 -32 -1 -61v0v0l3 -19l1 -3l32 -172c0 -3 0 -5 -1 -6s-2 -2 -5 -3h-2c-4 0 -7 2 -8 6l-21 120v0c0 2 -2 10 -5 19c-2 6 -5 11 -8 15c-7 9 -14 11 -20 11h-2
+c-5 0 -13 -2 -20 -11c-3 -4 -6 -9 -8 -15c-4 -9 -6 -17 -6 -18v-1l-21 -120c-1 -4 -3 -6 -7 -6h-2c-3 0 -4 2 -5 3s-2 3 -1 6l32 172v0v1l4 21v0v0c5 29 5 48 0 61c-4 9 -14 24 -32 24z" />
+ <glyph glyph-name="ion-ios-body" unicode="&#xf3e4;" horiz-adv-x="384"
+d="M144 368c0 32 16 48 48 48s48 -16 48 -48s-16 -48 -48 -48s-48 16 -48 48zM360 304c7 0 12 -2 17 -7s7 -10 7 -17s-2 -12 -7 -17s-10 -7 -17 -7h-98c-8 -2 -15 -6 -18 -14c-4 -9 -3 -27 1 -52l4 -21v-1v0l30 -172c1 -7 0 -13 -4 -18s-8 -9 -15 -10s-13 0 -18 4
+s-9 9 -10 16l-21 120v-1l-2 9c-1 5 -3 11 -6 16s-6 8 -10 8h-2c-8 0 -14 -11 -18 -33v1l-21 -120c-1 -7 -5 -12 -10 -16s-11 -5 -18 -4s-11 5 -15 10s-5 11 -4 18l30 172v0v1l4 21c4 25 5 43 1 52c-3 8 -10 12 -18 14h-98c-7 0 -12 2 -17 7s-7 10 -7 17s2 12 7 17s10 7 17 7
+h336z" />
+ <glyph glyph-name="ion-ios-bolt-outline" unicode="&#xf3e5;" horiz-adv-x="226"
+d="M131 316l-100 -140h65h19l-3 -19l-17 -89l100 140h-65h-19l3 19zM160 384v0l-30 -160h96l-160 -224l30 160h-96z" />
+ <glyph glyph-name="ion-ios-bolt" unicode="&#xf3e6;" horiz-adv-x="226"
+d="M160 384v0l-30 -160h96l-160 -224l30 160h-96z" />
+ <glyph glyph-name="ion-ios-book-outline" unicode="&#xf3e7;" horiz-adv-x="384"
+d="M284 384c55 0 100 -26 100 -79v-1v-4v-261v-17h-6h-11h-5c-17 30 -44 42 -78 42c-40 0 -74 -28 -82 -64h-20c-8 36 -42 64 -82 64c-34 0 -65 -16 -78 -42h-5h-11h-6v9v264v9v1c0 53 45 79 100 79c41 0 78 -14 92 -44c12 30 51 44 92 44zM184 37v254v13v2
+c-1 43 -39 62 -84 62c-44 0 -81 -19 -84 -61v-1v0v-262h1c19 26 48 36 83 36s66 -17 84 -43zM368 300v14v1c-3 42 -40 53 -84 53c-46 0 -84 -20 -84 -64v-1v-266c18 26 49 43 84 43s66 -10 84 -36v256z" />
+ <glyph glyph-name="ion-ios-book" unicode="&#xf3e8;" horiz-adv-x="384"
+d="M100 384c35 0 67 -10 84 -31v-353h-2c-8 36 -42 64 -82 64c-34 0 -65 -16 -78 -42h-5h-11h-6v9v264v9v1c0 53 45 79 100 79zM284 384c55 0 100 -26 100 -79v-1v-4v-261v-17h-6h-11h-5c-17 30 -44 42 -78 42c-40 0 -74 -28 -82 -64h-2v353c17 21 50 31 84 31z" />
+ <glyph glyph-name="ion-ios-bookmarks-outline" unicode="&#xf3e9;" horiz-adv-x="418"
+d="M385 384c19 0 33 -13 33 -32v-286c0 -19 -14 -34 -33 -34h-143s-25 -4 -25 -19v-13h-8h-8v13c0 15 -11 19 -25 19h-143c-19 0 -33 15 -33 34v286c0 19 14 32 33 32h150c10 0 20 -5 26 -12v0v0c6 7 16 12 26 12h150zM201 37v309c0 9 -12 22 -25 22h-143
+c-9 0 -16 -7 -16 -16v-286c0 -9 7 -18 16 -18h144c10 0 19 -3 24 -11zM273 368v-100l23 14l9 6l9 -6l23 -14v100h-64zM401 66v286c0 9 -7 16 -16 16h-32v-131l-48 32l-48 -32v131h-15c-13 0 -25 -13 -25 -22v-309c5 9 14 11 24 11h144c9 0 16 9 16 18z" />
+ <glyph glyph-name="ion-ios-bookmarks" unicode="&#xf3ea;" horiz-adv-x="418"
+d="M296 283l-23 -15v116h64v-116l-23 15l-9 6zM385 384c19 0 33 -13 33 -32v-286c0 -19 -14 -34 -33 -34h-143s-25 -4 -25 -19v-13h-8h-8v13c0 15 -11 19 -25 19h-143c-19 0 -33 15 -33 34v286c0 19 14 32 33 32h150s18 -8 18 -15v-329l8 -6l8 6v329s10 15 18 15h22v-146
+l48 32l48 -32v146h32z" />
+ <glyph glyph-name="ion-ios-box-outline" unicode="&#xf3eb;" horiz-adv-x="320"
+d="M192 208h-1h-63c-9 0 -16 -7 -16 -16s7 -16 16 -16h64c9 0 16 7 16 16s-7 16 -16 16zM192 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32h-64c-18 0 -32 14 -32 32s14 32 32 32h64zM320 336v-80h-16v-208h-288v208h-16v80h320zM288 64v192h-256v-192h256zM304 272v48h-288
+v-48h288z" />
+ <glyph glyph-name="ion-ios-box" unicode="&#xf3ec;" horiz-adv-x="320"
+d="M16 48v192h288v-192h-288zM128 208c-9 0 -16 -7 -16 -16s7 -16 16 -16h64c9 0 16 7 16 16s-7 16 -16 16h-64zM0 336h320v-80h-16h-288h-16v80z" />
+ <glyph glyph-name="ion-ios-briefcase-outline" unicode="&#xf3ed;" horiz-adv-x="416"
+d="M368 320h48v-320h-416v320h48v16h32v-16h48v30v2c0 18 10 32 29 32h99c19 0 32 -14 32 -32v-2v-30h48v16h32v-16zM144 320v0h128v0v30c0 10 -7 18 -17 18h-97c-11 0 -14 -8 -14 -18v-30zM400 16v224h-384v-224h384zM400 256v48h-32v-16h-32v16h-256v-16h-32v16h-32v-48
+h384z" />
+ <glyph glyph-name="ion-ios-briefcase" unicode="&#xf3ee;" horiz-adv-x="416"
+d="M48 320v16h32v-16h-32zM0 0v240h416v-240h-416zM336 320v16h32v-16h-32zM368 320h48v-64h-416v64h48v-32h32v32h48v30v2c0 18 10 32 29 32h99c19 0 32 -14 32 -32v-2v-30h48v-32h32v32zM272 320v30c0 10 -7 18 -17 18h-97c-11 0 -14 -8 -14 -18v-30v0h128v0z" />
+ <glyph glyph-name="ion-ios-browsers-outline" unicode="&#xf3ef;" horiz-adv-x="384"
+d="M0 304h304v-304h-304v304zM288 16v272h-272v-272h272zM384 384v-304h-64v16h48v272h-272v-48h-16v64h304z" />
+ <glyph glyph-name="ion-ios-browsers" unicode="&#xf3f0;" horiz-adv-x="384"
+d="M0 304h304v-304h-304v304zM80 384h304v-304h-64v240h-240v64z" />
+ <glyph glyph-name="ion-ios-calculator-outline" unicode="&#xf3f1;" horiz-adv-x="288"
+d="M32 288v64h224v-64h-224zM48 336v-32h192v32h-192zM256 384c18 0 32 -14 32 -32v-320c0 -18 -14 -32 -32 -32h-224c-18 0 -32 14 -32 32v320c0 18 14 32 32 32h224zM272 32v320c0 9 -7 16 -16 16h-224c-9 0 -16 -7 -16 -16v-320c0 -9 7 -16 16 -16h224c9 0 16 7 16 16z
+M48 208h32h16v-16h-64v64h16v-16v-32zM48 128h32h16v-16h-64v64h16v-16v-32zM48 48h32h16v-16h-64v64h16v-16v-32zM128 208h32h16v-16h-64v64h16v-16v-32zM208 208h32h16v-16h-64v64h16v-16v-32zM128 128h32h16v-16h-64v64h16v-16v-32zM128 48h32h16v-16h-64v64h16v-16v-32z
+M208 48h32h16v-16h-64v144h16v-96v-32z" />
+ <glyph glyph-name="ion-ios-calculator" unicode="&#xf3f2;" horiz-adv-x="288"
+d="M256 384c18 0 32 -14 32 -32v-320c0 -18 -14 -32 -32 -32h-224c-18 0 -32 14 -32 32v320c0 18 14 32 32 32h224zM248 168h-48v-128h48v128zM248 248h-48v-48h48v48zM168 88h-48v-48h48v48zM168 168h-48v-48h48v48zM168 248h-48v-48h48v48zM88 88h-48v-48h48v48zM88 168
+h-48v-48h48v48zM88 248h-48v-48h48v48zM40 296h208v48h-208v-48z" />
+ <glyph glyph-name="ion-ios-calendar-outline" unicode="&#xf3f3;" horiz-adv-x="384"
+d="M16 336v-64h352v64zM288 352h96v-352h-384v352h96v32h16v-32h160v32h16v-32zM368 16v240h-352v-240h352zM368 272v64h-80v-32h-16v32h-160v-32h-16v32h-80v-64h352z" />
+ <glyph glyph-name="ion-ios-calendar" unicode="&#xf3f4;" horiz-adv-x="384"
+d="M0 0v256h384v-256h-384zM384 352v-80h-384v80h96v-48h16v48h160v-48h16v48h96zM96 352v32h16v-32h-16zM272 352v32h16v-32h-16z" />
+ <glyph glyph-name="ion-ios-camera-outline" unicode="&#xf3f5;" horiz-adv-x="384"
+d="M354 288c18 0 30 -13 30 -31v-176c0 -18 -12 -33 -30 -33h-320c-18 0 -34 15 -34 33v176c0 18 16 31 34 31h13v16h34v-16h13c32 36 43 48 55 48h88c12 0 23 -12 55 -48h62zM368 81v176c0 9 -5 15 -14 15h-62h-7l-5 3c-3 4 -7 8 -10 11c-12 13 -20 24 -26 30
+c-5 5 -7 4 -7 4h-88s-2 0 -7 -4c-6 -5 -14 -14 -25 -27c-3 -4 -7 -10 -11 -14l-5 -3h-7h-60c-9 0 -18 -7 -18 -15v-176c0 -9 9 -17 18 -17h320c8 0 14 8 14 17zM192 258c47 0 86 -38 86 -85s-39 -85 -86 -85s-86 38 -86 85s39 85 86 85zM192 104c38 0 70 31 70 69
+s-32 69 -70 69s-70 -31 -70 -69s32 -69 70 -69zM288 239v17h17v-17h-17zM160 173c0 21 11 32 32 32s32 -11 32 -32s-11 -32 -32 -32s-32 11 -32 32z" />
+ <glyph glyph-name="ion-ios-camera" unicode="&#xf3f6;" horiz-adv-x="384"
+d="M354 288c18 0 30 -13 30 -31v-176c0 -18 -12 -33 -30 -33h-320c-18 0 -34 15 -34 33v176c0 18 16 31 34 31h13v16h34v-16h13c32 36 43 48 55 48h88c12 0 23 -12 55 -48h62zM192 88c47 0 86 38 86 85s-39 85 -86 85s-86 -38 -86 -85s39 -85 86 -85zM305 239v17h-17v-17h17
+zM192 242c38 0 70 -31 70 -69s-32 -69 -70 -69s-70 31 -70 69s32 69 70 69zM192 141c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32z" />
+ <glyph glyph-name="ion-ios-cart-outline" unicode="&#xf3f7;" horiz-adv-x="384"
+d="M96 48c13 0 24 -11 24 -24s-11 -24 -24 -24s-24 11 -24 24s11 24 24 24zM96 16c4 0 8 4 8 8s-4 8 -8 8s-8 -4 -8 -8s4 -8 8 -8zM320 48c13 0 24 -11 24 -24s-11 -24 -24 -24s-24 11 -24 24s11 24 24 24zM320 16c4 0 8 4 8 8s-4 8 -8 8s-8 -4 -8 -8s4 -8 8 -8zM384 320
+l-16 -128l-271 -48l5 -30c7 -34 21 -34 26 -34h240v-16h-240c-11 0 -21 5 -28 14c-6 8 -11 19 -13 33l-43 234v0c-2 8 -3 12 -7 16c-6 5 -18 7 -37 7v16c23 0 38 -4 47 -11c7 -6 10 -14 12 -21zM355 206l11 99l-304 31l32 -176z" />
+ <glyph glyph-name="ion-ios-cart" unicode="&#xf3f8;" horiz-adv-x="384"
+d="M96 48c13 0 24 -11 24 -24s-11 -24 -24 -24s-24 11 -24 24s11 24 24 24zM320 48c13 0 24 -11 24 -24s-11 -24 -24 -24s-24 11 -24 24s11 24 24 24zM384 320l-16 -128l-271 -48l5 -30c7 -34 21 -34 26 -34h240v-16h-240c-11 0 -21 5 -28 14c-6 8 -11 19 -13 33l-43 234v0
+c-2 8 -3 12 -7 16c-6 5 -18 7 -37 7v16c23 0 38 -4 47 -11c7 -6 10 -14 12 -21z" />
+ <glyph glyph-name="ion-ios-chatboxes-outline" unicode="&#xf3f9;" horiz-adv-x="416"
+d="M16 384v-192h96v-16h-112v224h288v-112h-16v96h-256zM128 272h288v-224h-48v-64h-13l-64 64h-163v224zM400 64v192h-256v-192h153l55 -55v55h48z" />
+ <glyph glyph-name="ion-ios-chatboxes" unicode="&#xf3fa;" horiz-adv-x="416"
+d="M288 400v-112h-176v-112h-112v224h288zM128 272h288v-224h-48v-64h-13l-64 64h-163v224z" />
+ <glyph glyph-name="ion-ios-chatbubble-outline" unicode="&#xf3fb;" horiz-adv-x="384"
+d="M192 336c-97 0 -176 -62 -176 -138c0 -26 10 -51 27 -73c0 -1 0 -2 1 -3s2 -1 2 -2c4 -6 6 -13 6 -20c0 -3 1 -3 -13 -47l39 17v0c2 1 10 4 11 4h1v0c5 2 10 3 16 3c5 0 9 -1 14 -2l1 -1h2c19 -6 41 -10 70 -10c48 0 92 15 125 40c32 25 50 58 50 94
+c0 76 -79 138 -176 138zM192 352v0c106 0 192 -69 192 -154s-85 -150 -191 -150c-27 0 -52 3 -75 11h-2v0c-3 1 -6 2 -10 2s-9 -1 -12 -2h1h-1c-1 0 -9 -4 -10 -4l-50 -22l-2 -1h-3h-3c-6 1 -8 6 -7 10v0s17 57 17 58c0 4 -1 8 -3 11v0v0v0l1 -1l-4 4c-19 24 -30 53 -30 84
+c0 85 86 154 192 154z" />
+ <glyph glyph-name="ion-ios-chatbubble" unicode="&#xf3fc;" horiz-adv-x="384"
+d="M192 352v0c106 0 192 -69 192 -154s-85 -150 -191 -150c-27 0 -52 3 -75 11h-2v0c-3 1 -6 2 -10 2s-9 -1 -12 -2h1h-1c-1 0 -9 -4 -10 -4l-50 -22l-2 -1h-3h-3c-6 1 -8 6 -7 10v0s17 57 17 58c0 4 -1 8 -3 11v0v0v0l1 -1l-4 4c-19 24 -30 53 -30 84c0 85 86 154 192 154z
+" />
+ <glyph glyph-name="ion-ios-checkmark-empty" unicode="&#xf3fd;" horiz-adv-x="207"
+d="M74 118c-2 -2 -6 -4 -9 -4s-7 2 -9 4l-56 56l18 18l47 -47l125 126l17 -18z" />
+ <glyph glyph-name="ion-ios-checkmark-outline" unicode="&#xf3fe;" horiz-adv-x="416"
+d="M292 271l18 -18l-134 -135c-2 -2 -6 -4 -9 -4s-7 2 -9 4l-56 56l18 18l47 -47zM208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191z" />
+ <glyph glyph-name="ion-ios-checkmark" unicode="&#xf3ff;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM176 118l134 135l-18 18l-125 -126l-47 47l-18 -18l56 -56c2 -2 6 -4 9 -4s7 2 9 4z" />
+ <glyph glyph-name="ion-ios-circle-filled" unicode="&#xf400;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191zM208 352c88 0 160 -72 160 -160s-72 -160 -160 -160s-160 72 -160 160s72 160 160 160z" />
+ <glyph glyph-name="ion-ios-circle-outline" unicode="&#xf401;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191z" />
+ <glyph glyph-name="ion-ios-clock-outline" unicode="&#xf402;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191zM208 192v128h17v-145h-113v17h96z" />
+ <glyph glyph-name="ion-ios-clock" unicode="&#xf403;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM225 175v145h-17v-128h-96v-17h113z" />
+ <glyph glyph-name="ion-ios-close-empty" unicode="&#xf404;" horiz-adv-x="192"
+d="M180 288l12 -12l-84 -84l84 -84l-12 -12l-84 84l-84 -84l-12 12l84 84l-84 84l12 12l84 -84z" />
+ <glyph glyph-name="ion-ios-close-outline" unicode="&#xf405;" horiz-adv-x="416"
+d="M355 339c81 -81 81 -213 0 -294s-213 -81 -294 0s-81 213 0 294s213 81 294 0zM343 57c74 74 74 196 0 270s-196 74 -270 0s-74 -196 0 -270s196 -74 270 0zM292 288l12 -12l-84 -84l84 -84l-12 -12l-84 84l-84 -84l-12 12l84 84l-84 84l12 12l84 -84z" />
+ <glyph glyph-name="ion-ios-close" unicode="&#xf406;" horiz-adv-x="416"
+d="M355 339c81 -81 81 -213 0 -294s-213 -81 -294 0s-81 213 0 294s213 81 294 0zM304 108l-84 84l84 84l-12 12l-84 -84l-84 84l-12 -12l84 -84l-84 -84l12 -12l84 84l84 -84z" />
+ <glyph glyph-name="ion-ios-cloud-download-outline" unicode="&#xf407;"
+d="M161 67l55 -54v242h16v-242l55 54l12 -12l-75 -73l-74 73zM367 284c45 0 81 -37 81 -82s-37 -82 -82 -82v0h-101v16h97h4c37 0 66 30 66 66s-29 67 -66 67h-15v20c0 55 -46 97 -101 97c-38 0 -73 -22 -90 -56l-6 -14l-14 7c-6 3 -13 5 -20 5c-22 0 -40 -18 -44 -39l-1 -9
+l-9 -3c-30 -10 -50 -36 -50 -67c0 -40 33 -74 74 -74h91v-16h-91c-50 0 -90 40 -90 89c0 39 26 71 61 83c5 28 29 51 59 51c10 0 18 -2 26 -6c19 39 59 65 105 65c64 0 117 -51 117 -115c0 -1 -1 -2 -1 -3z" />
+ <glyph glyph-name="ion-ios-cloud-download" unicode="&#xf408;"
+d="M216 13v107h16v-107l55 54l12 -12l-75 -73l-74 73l11 12zM367 284c45 0 81 -37 81 -82s-37 -82 -82 -82h-134v135h-16v-135h-35h-21h-70c-50 0 -90 40 -90 89c0 39 26 71 61 83c5 28 29 51 59 51c10 0 18 -2 26 -6c19 39 59 65 105 65c64 0 117 -51 117 -115
+c0 -1 -1 -2 -1 -3z" />
+ <glyph glyph-name="ion-ios-cloud-outline" unicode="&#xf409;"
+d="M367 215c45 0 81 -37 81 -83c0 -45 -37 -84 -82 -84h-276c-50 0 -90 42 -90 92c0 40 26 71 61 83c5 28 29 52 59 52c10 0 18 -2 26 -6c19 39 59 67 105 67c64 0 117 -53 117 -117c0 -1 -1 -3 -1 -4zM366 64c37 0 66 32 66 69s-29 67 -66 67h-15v21c0 56 -46 99 -101 99
+c-38 0 -73 -23 -90 -58l-6 -14l-14 7c-6 3 -13 5 -20 5c-22 0 -40 -17 -44 -39l-1 -9l-9 -3c-30 -10 -50 -37 -50 -69c0 -41 33 -76 74 -76h272h4z" />
+ <glyph glyph-name="ion-ios-cloud-upload-outline" unicode="&#xf40a;"
+d="M161 188l-11 11l74 75l75 -75l-12 -11l-55 54v-242h-16v242zM367 264c45 0 81 -39 81 -85s-37 -83 -82 -83v0h-101v16h97h4c37 0 66 30 66 67s-29 70 -66 70l-15 1v20c0 56 -46 99 -101 99c-38 0 -73 -23 -90 -58l-6 -13l-14 6c-6 3 -13 5 -20 5c-22 0 -40 -17 -44 -39
+l-1 -9l-9 -3c-30 -10 -50 -39 -50 -71c0 -41 33 -75 74 -75h91v-16h-91c-50 0 -90 40 -90 90c0 40 26 74 61 86c5 28 29 52 59 52c10 0 18 -2 26 -6c19 39 59 66 105 66c64 0 117 -52 117 -116c0 -1 -1 -3 -1 -4z" />
+ <glyph glyph-name="ion-ios-cloud-upload" unicode="&#xf40b;"
+d="M216 0v96h16v-96h-16zM367 264c45 0 81 -39 81 -85s-37 -83 -82 -83h-134v146l55 -54l12 11l-75 75l-74 -75l11 -11l55 54v-146h-35h-31h-60c-50 0 -90 40 -90 90c0 40 26 74 61 86c5 28 29 52 59 52c10 0 18 -2 26 -6c19 39 59 66 105 66c64 0 117 -52 117 -116
+c0 -1 -1 -3 -1 -4z" />
+ <glyph glyph-name="ion-ios-cloud" unicode="&#xf40c;"
+d="M367 215c45 0 81 -37 81 -83c0 -45 -37 -84 -82 -84h-276c-50 0 -90 42 -90 92c0 40 26 71 61 83c5 28 29 52 59 52c10 0 18 -2 26 -6c19 39 59 67 105 67c64 0 117 -53 117 -117c0 -1 -1 -3 -1 -4z" />
+ <glyph glyph-name="ion-ios-cloudy-night-outline" unicode="&#xf40d;" horiz-adv-x="384"
+d="M125 224c-34 0 -63 -28 -63 -62v-12s1 -10 1 -10c-5 0 -12 -1 -14 -1c-19 -3 -33 -18 -33 -37c0 -10 3 -19 10 -26s16 -11 26 -11h157c27 0 49 22 49 49s-22 50 -49 50c-2 0 -4 -1 -6 -1l-14 -2l-3 14c-3 14 -11 26 -22 35s-25 14 -39 14zM125 240v0c37 0 68 -26 76 -61
+h8c36 0 65 -29 65 -65s-29 -66 -65 -66h-157c-28 0 -52 24 -52 53c0 27 21 51 47 53v8c0 43 35 78 78 78zM361 142c8 0 15 2 23 4c-4 -7 -9 -14 -14 -20c-21 -24 -50 -41 -84 -45c4 6 6 12 8 19c19 4 36 13 50 25c-18 1 -35 6 -50 13c-23 11 -42 29 -56 51
+c-14 21 -22 48 -22 75c0 15 2 30 7 44c-24 -12 -43 -33 -53 -59c-5 2 -12 4 -18 5c14 36 45 65 82 77c8 2 16 4 24 5c-5 -6 -9 -13 -12 -20c-8 -16 -12 -34 -12 -52c0 -32 12 -63 35 -86s54 -36 86 -36h6z" />
+ <glyph glyph-name="ion-ios-cloudy-night" unicode="&#xf40e;" horiz-adv-x="384"
+d="M361 142c8 0 15 2 23 4c-4 -7 -9 -15 -14 -21c-21 -24 -50 -40 -84 -44h-3c4 10 7 21 7 32c0 22 -9 43 -24 58c-14 15 -33 23 -53 24c-6 16 -16 29 -29 40c-10 8 -20 13 -32 17v2c14 36 45 65 82 77c8 2 16 4 24 5c-5 -6 -9 -13 -12 -20c-8 -16 -12 -34 -12 -52
+c0 -32 12 -63 35 -86s54 -36 86 -36h6zM125 239v0c37 0 68 -26 76 -61h8c36 0 65 -29 65 -65s-29 -66 -65 -66h-157c-28 0 -52 24 -52 53c0 27 21 51 47 53v7c0 43 35 79 78 79z" />
+ <glyph glyph-name="ion-ios-cloudy-outline" unicode="&#xf40f;" horiz-adv-x="274"
+d="M125 272c-34 0 -63 -28 -63 -62v-12s1 -10 1 -10c-6 0 -12 -1 -14 -1c-19 -3 -33 -18 -33 -37c0 -10 3 -19 10 -26s16 -11 26 -11h157c27 0 49 22 49 49s-22 50 -49 50c-2 0 -4 -1 -6 -1l-14 -2l-3 14c-3 14 -11 26 -22 35s-25 14 -39 14zM125 288v0c37 0 68 -26 76 -61
+h8c36 0 65 -29 65 -65s-29 -66 -65 -66h-157c-28 0 -52 24 -52 53c0 27 21 51 47 53v8c0 43 35 78 78 78z" />
+ <glyph glyph-name="ion-ios-cloudy" unicode="&#xf410;" horiz-adv-x="274"
+d="M125 288v0c37 0 68 -26 76 -61h8c36 0 65 -29 65 -65s-29 -66 -65 -66h-157c-28 0 -52 24 -52 53c0 27 21 51 47 53v8c0 43 35 78 78 78z" />
+ <glyph glyph-name="ion-ios-cog-outline" unicode="&#xf411;" horiz-adv-x="384"
+d="M384 175l-33 -8l-3 -14l27 -20l-12 -30l-34 5l-8 -11l17 -29l-23 -23l-29 17l-10 -7l5 -34l-29 -12l-21 27l-14 -3l-8 -33h-32l-9 33l-13 3l-21 -28l-29 12l4 34l-11 8l-30 -19l-23 23l18 31l-7 11l-35 -5l-12 29l28 22l-2 12l-35 9v32l35 9l2 12l-29 22l12 30l36 -5
+l7 10l-19 32l22 22l32 -19l11 8l-4 35l29 13l22 -29l12 2l9 35h32l9 -35l12 -2l22 28l29 -12l-5 -35l11 -8l30 18l22 -23l-17 -30l7 -10l35 5l12 -30l-28 -21l3 -13l33 -9v-32zM356 127l-26 20l6 33l32 8v7l-32 8l-6 33l26 19l-3 7l-32 -5l-19 27l17 28l-5 6l-28 -17l-28 18
+l5 34l-6 2l-20 -26l-32 6l-8 33h-7l-9 -33l-32 -6l-20 27l-7 -3l5 -34l-28 -18l-9 6l-21 12l-5 -5l18 -30l-18 -27l-33 5l-3 -7l27 -20l-6 -32l-33 -8v-7l33 -9l6 -32l-27 -20l3 -6l33 4l18 -27l-17 -29l5 -6l29 18l28 -18l-5 -33l7 -3l19 27l33 -7l8 -31h8l7 31l33 7
+l20 -26l7 3l-5 32l26 18l28 -16l5 5l-16 27l19 28l32 -4zM192 320c71 0 128 -57 128 -128s-57 -128 -128 -128s-128 57 -128 128s57 128 128 128zM80 192c0 -7 1 -15 2 -22l104 28l28 104c-7 1 -15 2 -22 2c-30 0 -58 -12 -79 -33s-33 -49 -33 -79zM192 80c27 0 53 10 73 27
+l-75 75l-104 -28c6 -15 15 -29 27 -41c21 -21 49 -33 79 -33zM276 118c18 20 28 47 28 74c0 30 -12 58 -33 79c-12 12 -26 22 -42 27l-28 -105z" />
+ <glyph glyph-name="ion-ios-cog" unicode="&#xf412;" horiz-adv-x="384"
+d="M229 298c16 -5 30 -15 42 -27c21 -21 33 -49 33 -79c0 -27 -10 -54 -28 -74l-75 75zM214 302l-28 -104l-104 -28c-1 7 -2 15 -2 22c0 30 12 58 33 79s49 33 79 33c7 0 15 -1 22 -2zM86 154l104 28l75 -75c-20 -17 -46 -27 -73 -27c-30 0 -58 12 -79 33
+c-12 12 -21 26 -27 41zM384 175l-33 -8l-3 -14l27 -20l-12 -30l-34 5l-8 -11l17 -29l-23 -23l-29 17l-10 -7l5 -34l-29 -12l-21 27l-14 -3l-8 -33h-32l-9 33l-13 3l-21 -28l-29 12l4 34l-11 8l-30 -19l-23 23l18 31l-7 11l-35 -5l-12 29l28 22l-2 12l-35 9v32l35 9l2 12
+l-29 22l12 30l36 -5l7 10l-19 32l22 22l32 -19l11 8l-4 35l29 13l22 -29l12 2l9 35h32l9 -35l12 -2l22 28l29 -12l-5 -35l11 -8l30 18l22 -23l-17 -30l7 -10l35 5l12 -30l-28 -21l3 -13l33 -9v-32zM192 64c71 0 128 57 128 128s-57 128 -128 128s-128 -57 -128 -128
+s57 -128 128 -128z" />
+ <glyph glyph-name="ion-ios-color-filter-outline" unicode="&#xf413;" horiz-adv-x="384"
+d="M302 236c47 -13 82 -57 82 -108c0 -62 -50 -112 -112 -112c-31 0 -60 13 -80 34c-20 -21 -49 -34 -80 -34c-62 0 -112 50 -112 112c0 51 35 95 82 108c-1 7 -2 13 -2 20c0 62 50 112 112 112s112 -50 112 -112c0 -7 -1 -13 -2 -20zM96 256c0 -6 0 -12 1 -17
+c5 1 10 1 15 1c31 0 60 -13 80 -34c20 21 49 34 80 34c5 0 10 0 15 -1c1 5 1 11 1 17c0 53 -43 96 -96 96s-96 -43 -96 -96zM208 128c0 6 0 12 -1 17c-5 -1 -10 -1 -15 -1s-10 0 -15 1c-1 -5 -1 -11 -1 -17c0 -20 6 -38 16 -53c10 15 16 33 16 53zM192 160c3 0 7 1 10 1
+c-3 7 -6 14 -10 20c-4 -6 -7 -13 -10 -20c3 0 7 -1 10 -1zM166 164c4 11 9 21 16 30c-18 18 -43 30 -70 30c-3 0 -7 -1 -10 -1c10 -29 34 -51 64 -59zM202 194c7 -9 12 -19 16 -30c30 8 54 30 64 59c-3 0 -7 1 -10 1c-27 0 -52 -12 -70 -30zM112 32c27 0 52 12 70 30
+c-14 19 -22 41 -22 66c0 7 1 13 2 20c-36 10 -64 37 -76 72c-40 -11 -70 -48 -70 -92c0 -53 43 -96 96 -96zM272 32c53 0 96 43 96 96c0 44 -30 81 -70 92c-12 -35 -40 -62 -76 -72c1 -7 2 -13 2 -20c0 -25 -8 -47 -22 -66c18 -18 43 -30 70 -30z" />
+ <glyph glyph-name="ion-ios-color-filter" unicode="&#xf414;" horiz-adv-x="384"
+d="M302 236c47 -13 82 -57 82 -108c0 -62 -50 -112 -112 -112c-31 0 -60 13 -80 34c-20 -21 -49 -34 -80 -34c-62 0 -112 50 -112 112c0 51 35 95 82 108c-1 7 -2 13 -2 20c0 62 50 112 112 112s112 -50 112 -112c0 -7 -1 -13 -2 -20zM192 53l1 -2c3 3 6 7 9 11
+c14 19 22 41 22 66c0 7 -1 13 -2 20c36 10 64 37 76 72c2 5 3 10 4 15c-1 0 -2 1 -3 1v1c-4 1 -8 1 -12 2c-5 1 -10 1 -15 1c-31 0 -60 -13 -80 -34c-20 21 -49 34 -80 34c-5 0 -10 0 -15 -1c-4 -1 -8 -1 -12 -2v-1c-1 0 -2 -1 -3 -1c1 -5 2 -10 4 -15c12 -35 40 -62 76 -72
+c-1 -7 -2 -13 -2 -20c0 -25 8 -47 22 -66c3 -4 6 -8 9 -11zM207 145c1 -5 1 -11 1 -17c0 -20 -6 -38 -16 -53c-10 15 -16 33 -16 53c0 6 0 12 1 17c5 -1 10 -1 15 -1s10 0 15 1zM282 223c-10 -29 -34 -51 -64 -59c-4 11 -9 21 -16 30c18 18 43 30 70 30c3 0 7 -1 10 -1z
+M202 161c-3 0 -7 -1 -10 -1s-7 1 -10 1c3 7 6 14 10 20c4 -6 7 -13 10 -20zM112 224c27 0 52 -12 70 -30c-7 -9 -12 -19 -16 -30c-30 8 -54 30 -64 59c3 0 7 1 10 1z" />
+ <glyph glyph-name="ion-ios-color-wand-outline" unicode="&#xf415;" horiz-adv-x="384"
+d="M128 298l256 -256l-34 -34l-256 256zM149 232l201 -201l11 11l-201 202zM120 344v40h16v-40h-16zM120 140v40h16v-40h-16zM216 256v16h40v-16h-40zM0 256v16h40v-16h-40zM47 354l29 -29l-12 -11l-28 28zM76 198l-29 -28l-11 11l28 28zM220 342l-28 -28l-12 11l29 29z" />
+ <glyph glyph-name="ion-ios-color-wand" unicode="&#xf416;" horiz-adv-x="396"
+d="M140 289l256 -257l-34 -34l-256 257zM124 322v64h32v-64h-32zM124 118v64h32v-64h-32zM216 238v32h64v-32h-64zM246 336l-45 -45l-23 22l45 46zM34 336l23 23l45 -46l-23 -22zM34 169l45 45l23 -22l-45 -46zM0 238v32h64v-32h-64z" />
+ <glyph glyph-name="ion-ios-compose-outline" unicode="&#xf417;" horiz-adv-x="384"
+d="M304 32v208l16 16v-240h-320v304h256l-16 -16h-224v-272h288zM174 164l171 171l11 -11l-180 -180h-32v32l180 180l11 -11l-171 -171zM380 368c2 -3 4 -6 4 -10s-2 -7 -4 -10l-12 -12l-21 21l-11 11v0l12 12c3 2 6 4 10 4s7 -2 10 -4z" />
+ <glyph glyph-name="ion-ios-compose" unicode="&#xf418;" horiz-adv-x="384"
+d="M192 128l128 128v-240h-320v304h256l-128 -128v-64h64zM324 356l32 -32l-180 -180h-32v32zM380 368c2 -3 4 -6 4 -10s-2 -7 -4 -10l-12 -12l-21 21l-11 11v0l12 12c3 2 6 4 10 4s7 -2 10 -4z" />
+ <glyph glyph-name="ion-ios-contact-outline" unicode="&#xf419;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 383c-105 0 -191 -86 -191 -191c0 -47 17 -89 45 -122c18 8 62 24 90 32c2 1 3 0 3 10c0 11 -1 18 -4 24c-4 8 -7 20 -9 31c-4 5 -10 15 -14 33c-3 16 -1 22 1 28v2
+c1 4 0 23 -3 38c-2 10 1 34 15 52c9 12 27 26 58 28h18c32 -2 49 -16 58 -28c14 -18 17 -42 15 -52c-3 -15 -4 -34 -3 -38c0 0 1 -1 1 -2c2 -6 3 -12 0 -28c-4 -18 -10 -27 -14 -32c-2 -11 -5 -24 -9 -32c-3 -7 -6 -15 -6 -23c0 -10 0 -10 2 -11c27 -8 73 -24 93 -32
+c28 33 45 76 45 122c0 105 -86 191 -191 191z" />
+ <glyph glyph-name="ion-ios-contact" unicode="&#xf41a;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c59 0 111 27 146 69c-20 8 -66 24 -93 32c-2 1 -3 1 -3 11c0 8 4 16 7 23c4 8 7 21 9 32c4 5 10 14 14 32c3 16 2 22 0 28c0 0 -1 1 -1 2c-1 4 0 23 3 38c2 10 -1 34 -15 52
+c-9 12 -26 26 -58 28h-18c-31 -2 -49 -16 -58 -28c-14 -18 -17 -42 -15 -52c3 -15 4 -34 3 -38v-2c-2 -6 -4 -12 -1 -28c4 -18 10 -28 14 -33c2 -11 5 -23 9 -31c3 -6 4 -13 4 -24c0 -10 -1 -9 -3 -10c-28 -8 -72 -24 -90 -32c35 -42 87 -69 146 -69z" />
+ <glyph glyph-name="ion-ios-copy-outline" unicode="&#xf41b;" horiz-adv-x="288"
+d="M192 352v-64h64v-16h-80v80h16zM213 384l75 -75v-261h-48v-48h-240v336h48v48h165zM224 16v32h-176v272h-32v-304h208zM272 64v238l-65 66h-143v-304h208z" />
+ <glyph glyph-name="ion-ios-copy" unicode="&#xf41c;" horiz-adv-x="288"
+d="M32 32h16h192v-32h-240v336h32v-288v-16zM213 384l75 -75v-261h-48h-192v288v48h165zM256 272v16h-64v64h-16v-80h80z" />
+ <glyph glyph-name="ion-ios-crop-strong" unicode="&#xf41d;" horiz-adv-x="384"
+d="M64 336v48h32v-48h-32zM96 96h176v-32h-208v208h32v-176zM336 64v32h48v-32h-48zM0 320h320v-320h-32v288h-288v32z" />
+ <glyph glyph-name="ion-ios-crop" unicode="&#xf41e;" horiz-adv-x="384"
+d="M64 336v48h16v-48h-16zM80 80h208v-16h-224v224h16v-208zM336 64v16h48v-16h-48zM0 320h320v-320h-16v304h-304v16z" />
+ <glyph glyph-name="ion-ios-download-outline" unicode="&#xf41f;" horiz-adv-x="320"
+d="M192 304h128v-304h-320v304h128v-16h-112v-272h288v272h-112v16zM97 196l55 -55v243h16v-243l55 55l11 -12l-74 -74l-74 74z" />
+ <glyph glyph-name="ion-ios-download" unicode="&#xf420;" horiz-adv-x="320"
+d="M168 304h152v-304h-320v304h152v-163l-55 55l-11 -12l74 -74l74 74l-11 12l-55 -55v163zM152 304v80h16v-80h-16z" />
+ <glyph glyph-name="ion-ios-drag" unicode="&#xf421;" horiz-adv-x="352"
+d="M0 128v16h352v-16h-352zM0 184v16h352v-16h-352zM0 240v16h352v-16h-352z" />
+ <glyph glyph-name="ion-ios-email-outline" unicode="&#xf422;" horiz-adv-x="384"
+d="M0 320h384v-256h-384v256zM192 180l163 124h-326zM16 80h352v214l-115 -88l68 -77l-2 -2l-79 70l-48 -37l-48 37l-79 -70l-2 2l68 77l-115 88v-214z" />
+ <glyph glyph-name="ion-ios-email" unicode="&#xf423;" horiz-adv-x="384"
+d="M384 64h-384v242l131 -100l-68 -77l2 -2l79 70l48 -37l48 37l79 -70l2 2l-68 77l131 100v-242zM376 320l-184 -140l-184 140h368z" />
+ <glyph glyph-name="ion-ios-eye-outline" unicode="&#xf424;" horiz-adv-x="384"
+d="M383 192l1 -1l-6 -6c-21 -21 -47 -48 -78 -69c-36 -24 -72 -36 -108 -36c-83 0 -130 49 -185 105l-7 7l1 1c39 40 67 64 94 81c32 20 63 30 97 30c83 0 146 -60 191 -112zM192 288c-62 0 -111 -36 -170 -96c24 -24 48 -50 76 -68c30 -20 60 -28 94 -28
+c75 0 133 56 171 95c-26 29 -50 50 -74 66c-32 21 -64 31 -97 31zM192 112c-44 0 -80 36 -80 80s36 80 80 80s80 -36 80 -80s-36 -80 -80 -80zM192 256c-35 0 -64 -29 -64 -64s29 -64 64 -64s64 29 64 64s-29 64 -64 64zM224 192h16v0c0 -26 -22 -48 -48 -48s-48 21 -48 48
+s22 48 48 48v-16c-16 0 -32 -13 -32 -31s15 -33 32 -33s32 14 32 32v0z" />
+ <glyph glyph-name="ion-ios-eye" unicode="&#xf425;" horiz-adv-x="384"
+d="M383 192l1 -1l-6 -6c-21 -21 -47 -48 -78 -69c-36 -24 -72 -36 -108 -36c-83 0 -130 49 -185 105l-7 7l1 1c39 40 67 64 94 81c32 20 63 30 97 30c83 0 146 -60 191 -112zM192 112c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80zM186 221
+c0 -19 16 -35 35 -35c7 0 14 2 19 6v0c0 -27 -22 -48 -48 -48s-48 21 -48 48s22 48 48 48c-4 -5 -6 -12 -6 -19z" />
+ <glyph glyph-name="ion-ios-fastforward-outline" unicode="&#xf426;"
+d="M16 293v-202l184 101zM240 292v0v-78v-27v-95l176 100zM224 320v0l224 -128l-224 -128v123l-224 -123v256l224 -123v123z" />
+ <glyph glyph-name="ion-ios-fastforward" unicode="&#xf427;"
+d="M224 320v0l224 -128l-224 -128v123l-224 -123v256l224 -123v123z" />
+ <glyph glyph-name="ion-ios-filing-outline" unicode="&#xf428;" horiz-adv-x="352"
+d="M288 320l64 -96v-160h-176h-176v160l64 96h224zM333 224l-45 68v-68h45zM80 304v-80h48c0 -26 22 -48 48 -48s48 22 48 48h48v80h-192zM64 292l-45 -68h45v68zM336 80v128h-98c-7 -28 -32 -48 -62 -48s-55 20 -62 48h-98v-128h160h160z" />
+ <glyph glyph-name="ion-ios-filing" unicode="&#xf429;" horiz-adv-x="352"
+d="M176 160c30 0 55 20 62 48h114v-144h-176h-176v144h114c7 -28 32 -48 62 -48zM64 224h-7h-57l64 96v0v-80h16v80h192v-80h16v80v0l64 -96h-56h-8h-16h-8h-40c0 -26 -22 -48 -48 -48s-48 22 -48 48h-39h-9h-16z" />
+ <glyph glyph-name="ion-ios-film-outline" unicode="&#xf42a;" horiz-adv-x="400"
+d="M0 360h400v-336h-400v336zM72 40v48h-56v-48h56zM72 104v48h-56v-48h56zM72 168v48h-56v-48h56zM72 232v48h-56v-48h56zM72 296v48h-56v-48h56zM312 40v144h-224v-144h224zM312 200v144h-224v-144h224zM384 40v48h-56v-48h56zM384 104v48h-56v-48h56zM384 168v48h-56v-48
+h56zM384 232v48h-56v-48h56zM384 296v48h-56v-48h56z" />
+ <glyph glyph-name="ion-ios-film" unicode="&#xf42b;" horiz-adv-x="400"
+d="M0 360h400v-336h-400v336zM72 40v48h-56v-48h56zM72 104v48h-56v-48h56zM72 168v48h-56v-48h56zM72 232v48h-56v-48h56zM72 296v48h-56v-48h56zM312 184v16h-224v-16h224zM384 40v48h-56v-48h56zM384 104v48h-56v-48h56zM384 168v48h-56v-48h56zM384 232v48h-56v-48h56z
+M384 296v48h-56v-48h56z" />
+ <glyph glyph-name="ion-ios-flag-outline" unicode="&#xf42c;" horiz-adv-x="256"
+d="M240 336c6 1 11 1 16 2v-16v-157c-5 -1 -10 -1 -16 -2c-11 -1 -24 -3 -39 -3c-25 0 -47 4 -69 9s-42 13 -64 13c-30 0 -46 -5 -52 -7v-143h-16v142v162v2l3 3c2 1 18 11 65 11c24 0 45 -4 67 -9c21 -4 42 -11 65 -11c15 0 29 3 40 4zM240 179v0v141c-11 -1 -25 -4 -40 -4
+c-25 0 -46 6 -68 11s-42 9 -64 9c-30 0 -46 -5 -52 -7v-137c10 3 26 6 52 6c24 0 45 -8 67 -13c21 -4 43 -9 66 -9c15 0 28 2 39 3z" />
+ <glyph glyph-name="ion-ios-flag" unicode="&#xf42d;" horiz-adv-x="256"
+d="M240 336c6 1 11 1 16 2v-16v-157c-5 -1 -10 -1 -16 -2c-11 -1 -24 -3 -39 -3c-25 0 -47 4 -69 9s-42 13 -64 13c-30 0 -46 -5 -52 -7v-143h-16v142v162v2l3 3c2 1 18 11 65 11c24 0 45 -4 67 -9c21 -4 42 -11 65 -11c15 0 29 3 40 4z" />
+ <glyph glyph-name="ion-ios-flame-outline" unicode="&#xf42e;" horiz-adv-x="256"
+d="M96 416c87 -64 170 -179 159 -288c-13 -134 -104 -160 -127 -160s-127 40 -128 160c-1 146 122 143 96 288zM128 -24c0 0 40 36 40 80s-40 80 -40 80s-41 -36 -41 -80s41 -80 41 -80zM239 130c5 47 -10 99 -41 151c-22 36 -50 70 -83 99c0 -57 -24 -91 -49 -123
+c-26 -34 -50 -65 -50 -129c0 -25 5 -48 15 -68c8 -17 20 -32 35 -45c8 -7 16 -12 23 -16c-9 16 -18 35 -18 57c0 51 44 90 46 92l11 9l11 -9c2 -2 45 -41 45 -92c0 -23 -9 -44 -19 -60c7 4 13 8 20 14c14 12 25 27 34 44c11 21 17 47 20 76z" />
+ <glyph glyph-name="ion-ios-flame" unicode="&#xf42f;" horiz-adv-x="256"
+d="M96 416c87 -64 170 -179 159 -288c-13 -134 -104 -160 -127 -160s-127 40 -128 160c-1 146 122 143 96 288zM128 -24c0 0 40 36 40 80s-40 80 -40 80s-41 -36 -41 -80s41 -80 41 -80z" />
+ <glyph glyph-name="ion-ios-flask-outline" unicode="&#xf430;" horiz-adv-x="384"
+d="M373 78c8 -16 11 -32 11 -46c-1 -36 -27 -64 -63 -64h-256c-36 0 -64 27 -65 64c0 14 4 30 12 46l116 195v127h-16v16h16h16v-16v-16h48v-16h-48v-32h32v-16h-32v-32h48v-16h-48v-3l-2 -4l-15 -25h49v-16h-58l-92 -154c-13 -25 -14 -43 -2 -63c9 -14 23 -23 41 -23h256
+c17 0 33 8 41 22c5 8 6 17 6 26c0 12 -2 25 -9 38l-116 195l-3 4v131v16h16h16v-16h-16v-127zM44 73l72 119h153l72 -119c7 -11 10 -24 10 -33c-1 -24 -16 -40 -46 -40h-226c-30 0 -46 12 -46 40c0 9 4 22 11 33zM260 176h-135l-67 -111v0v0c-5 -8 -9 -19 -9 -25
+c0 -13 5 -17 6 -18c4 -4 13 -6 24 -6h226c10 0 18 3 23 7c4 4 7 10 7 18c0 6 -3 16 -8 24v0v0z" />
+ <glyph glyph-name="ion-ios-flask" unicode="&#xf431;" horiz-adv-x="384"
+d="M327 65v0c5 -8 8 -18 8 -24c0 -8 -3 -14 -7 -18c-5 -4 -13 -7 -23 -7h-226c-11 0 -20 2 -24 6c-1 1 -6 5 -6 18c0 6 4 17 9 25v0v0l67 111h135l67 -111v0zM373 78c8 -16 11 -32 11 -46c-1 -36 -27 -64 -63 -64h-256c-36 0 -64 27 -65 64c0 14 4 30 12 46l116 195v127h-16
+v16h160v-16h-16v-127zM144 384v-16h48v16h-48zM144 336v-16h32v16h-32zM144 288v-16h48v16h-48zM127 240l-9 -16h58v16h-49zM351 40c0 9 -3 22 -10 33l-72 119h-154l-71 -119c-7 -11 -11 -24 -11 -33c0 -28 16 -40 46 -40h226c30 0 45 16 46 40z" />
+ <glyph glyph-name="ion-ios-flower-outline" unicode="&#xf432;"
+d="M363 164c-29 0 -65 7 -93 14c-1 -3 -2 -6 -4 -9c25 -15 56 -36 76 -56c40 -40 53 -68 41 -80c-3 -3 -7 -4 -12 -4c-15 0 -38 15 -68 45c-20 20 -41 51 -56 76c-3 -2 -7 -3 -10 -4c7 -28 15 -64 15 -93c0 -56 -12 -85 -28 -85s-28 29 -28 85c0 29 8 65 15 93
+c-3 1 -7 2 -10 4c-15 -25 -36 -56 -56 -76c-30 -30 -53 -45 -68 -45c-5 0 -9 1 -12 4c-12 12 1 40 41 80c20 20 51 41 76 56c-2 3 -3 6 -4 9c-28 -7 -64 -14 -93 -14c-56 0 -85 12 -85 28s29 28 85 28c29 0 65 -8 93 -15c1 3 2 7 4 10c-25 15 -56 35 -76 55
+c-40 40 -53 68 -41 80c3 3 7 4 12 4c15 0 38 -14 68 -44c20 -20 41 -51 56 -76c3 2 7 3 10 4c-7 28 -15 64 -15 93c0 56 12 85 28 85s28 -29 28 -85c0 -29 -8 -65 -15 -93c3 -1 7 -2 10 -4c15 25 36 56 56 76c30 30 53 44 68 44c5 0 9 -1 12 -4c12 -12 -1 -40 -41 -80
+c-20 -20 -51 -40 -76 -55c2 -3 3 -7 4 -10c28 7 64 15 93 15c56 0 85 -12 85 -28s-29 -28 -85 -28zM288 193v-3c30 -7 56 -10 75 -10c21 0 39 2 52 5c10 3 14 6 16 7c-2 1 -6 4 -16 7c-13 3 -31 5 -52 5c-19 0 -45 -4 -75 -11zM314 299c-14 -14 -30 -35 -46 -61l2 -2
+c26 16 47 32 61 46c15 15 26 28 33 40c5 9 7 14 7 16c-4 0 -22 -4 -57 -39zM178 236l2 2c-16 26 -32 47 -46 61c-35 35 -53 39 -57 39c0 -2 2 -7 7 -16c7 -12 18 -25 33 -40c14 -14 35 -30 61 -46zM85 180c19 0 45 3 75 10v3c-30 7 -56 11 -75 11c-21 0 -39 -2 -52 -5
+c-10 -3 -14 -6 -16 -7c2 -1 5 -4 15 -7c13 -3 32 -5 53 -5zM134 85c14 14 30 35 46 61l-2 2c-26 -16 -47 -32 -61 -46c-15 -15 -26 -29 -33 -41c-5 -9 -7 -14 -7 -16c4 0 22 5 57 40zM270 148l-2 -2c16 -26 32 -47 46 -61c35 -35 53 -40 57 -40c0 2 -2 7 -7 16
+c-7 12 -18 26 -33 41c-14 14 -35 30 -61 46zM217 383c-3 -13 -5 -31 -5 -52c0 -19 4 -45 11 -75h2c7 30 11 56 11 75c0 21 -2 39 -5 52c-3 10 -6 14 -7 16c-1 -2 -4 -6 -7 -16zM231 0c3 13 5 32 5 53c0 19 -4 45 -11 75h-2c-7 -30 -11 -56 -11 -75c0 -21 2 -40 5 -53
+c3 -10 6 -13 7 -15c1 2 4 5 7 15zM224 160c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM313 42c10 -34 7 -53 -5 -58c-2 -1 -3 -1 -5 -1c-11 0 -25 13 -37 35c5 35 -2 76 -2 76s24 -34 49 -52zM302 -1c1 4 2 14 -3 34c-5 4 -10 9 -15 14
+c0 -9 0 -17 -1 -25c10 -16 16 -22 19 -23zM182 365c-6 -35 1 -75 1 -75s-27 35 -48 51c-10 35 -7 54 5 59c2 1 3 1 5 1c11 0 24 -12 37 -36zM164 337c0 9 0 17 1 25c-10 16 -16 21 -19 22c-1 -4 -2 -14 3 -34c5 -4 10 -8 15 -13zM50 149c35 -4 76 2 76 2s-34 -24 -51 -48
+c-12 -4 -26 -6 -35 -6c-13 0 -21 4 -24 11c-5 11 7 25 34 41zM66 117c4 5 8 10 13 15c-9 0 -17 0 -25 1c-16 -10 -21 -16 -22 -19c1 0 4 -1 8 -1c7 0 16 1 26 4zM432 276c5 -11 -7 -26 -34 -42c-35 5 -76 -2 -76 -2s33 25 51 49c13 4 26 5 35 5c13 0 21 -3 24 -10zM394 250
+c16 10 21 16 22 19c-1 0 -4 1 -8 1c-7 0 -16 -1 -26 -4c-4 -5 -8 -9 -13 -14c9 0 17 -1 25 -2zM131 39c31 24 53 55 53 55s-7 -39 -3 -71c-15 -26 -28 -39 -39 -39c-2 0 -4 0 -6 1c-11 5 -13 24 -5 54zM143 1c4 2 12 8 22 26c0 6 -1 13 -1 20c-6 -6 -13 -12 -19 -17
+c-4 -18 -3 -26 -2 -29zM312 398c11 -5 13 -22 5 -54c-29 -21 -53 -55 -53 -55s8 48 3 71c13 25 28 39 39 39c2 0 4 0 6 -1zM303 353c5 18 3 27 2 30c-4 -2 -12 -8 -22 -26c0 -6 1 -14 1 -21c6 6 13 12 19 17zM71 285c18 -24 55 -53 55 -53s-40 7 -70 3c-28 15 -43 32 -38 44
+c3 7 10 11 22 11c8 0 21 -1 31 -5zM33 273c2 -4 8 -12 26 -22c6 0 13 1 20 1c-6 6 -12 12 -17 18c-8 2 -16 4 -22 4c-4 0 -6 -1 -7 -1zM392 149c30 -17 43 -33 38 -45c-3 -7 -10 -10 -22 -10c-8 0 -19 1 -31 5c-20 27 -55 52 -55 52s45 -8 70 -2zM408 110c4 0 6 1 7 1
+c-2 4 -8 12 -26 22c-6 0 -13 -1 -20 -1c6 -6 12 -13 17 -19c8 -2 16 -3 22 -3z" />
+ <glyph glyph-name="ion-ios-flower" unicode="&#xf433;"
+d="M363 220c56 0 85 -12 85 -28s-29 -28 -85 -28c-29 0 -65 7 -93 14c-1 -3 -2 -6 -4 -9c25 -15 56 -36 76 -56c40 -40 53 -68 41 -80s-40 1 -80 41c-20 20 -41 51 -56 76c-3 -2 -7 -3 -10 -4c7 -28 15 -64 15 -93c0 -56 -12 -85 -28 -85s-28 29 -28 85c0 29 8 65 15 93
+c-3 1 -7 2 -10 4c-15 -25 -36 -56 -56 -76c-40 -40 -68 -53 -80 -41s1 40 41 80c20 20 51 41 76 56c-2 3 -3 6 -4 9c-28 -7 -64 -14 -93 -14c-56 0 -85 12 -85 28s29 28 85 28c29 0 65 -8 93 -15c1 3 2 7 4 10c-25 15 -56 35 -76 55c-40 40 -53 68 -41 80s40 0 80 -40
+c20 -20 41 -51 56 -76c3 2 6 3 9 4c-7 28 -14 64 -14 93c0 56 12 85 28 85s28 -29 28 -85c0 -29 -7 -65 -14 -93c3 -1 6 -2 9 -4c15 25 36 56 56 76c40 40 68 52 80 40s-1 -40 -41 -80c-20 -20 -51 -40 -76 -55c2 -3 3 -7 4 -10c28 7 64 15 93 15zM264 94c0 0 24 -34 49 -52
+c10 -34 7 -53 -5 -58c-2 -1 -3 -1 -5 -1c-11 0 -25 13 -37 35c5 35 -2 76 -2 76zM183 290c0 0 -27 35 -48 51c-10 35 -7 54 5 59c2 1 3 1 5 1c11 0 24 -12 37 -36c-6 -35 1 -75 1 -75zM126 151c0 0 -34 -24 -51 -48c-12 -4 -26 -6 -35 -6c-13 0 -21 4 -24 11
+c-5 11 7 25 34 41c35 -4 76 2 76 2zM322 232c0 0 33 25 51 49c13 4 26 5 35 5c13 0 21 -3 24 -10c5 -11 -7 -26 -34 -42c-35 5 -76 -2 -76 -2zM131 39c31 24 53 55 53 55s-7 -39 -3 -71c-15 -26 -28 -39 -39 -39c-2 0 -4 0 -6 1c-11 5 -13 24 -5 54zM317 344
+c-29 -21 -53 -55 -53 -55s8 48 3 71c13 25 28 39 39 39c2 0 4 0 6 -1c11 -5 13 -22 5 -54zM56 235c-28 15 -43 32 -38 44c3 7 10 11 22 11c8 0 21 -1 31 -5c18 -24 55 -53 55 -53s-40 7 -70 3zM392 149c30 -17 43 -33 38 -45c-3 -7 -10 -10 -22 -10c-8 0 -19 1 -31 5
+c-20 27 -55 52 -55 52s45 -8 70 -2z" />
+ <glyph glyph-name="ion-ios-folder-outline" unicode="&#xf434;"
+d="M425 352c13 0 23 -10 23 -23v-304c0 -14 -10 -25 -23 -25h-400c-13 0 -25 12 -25 25v336c0 13 11 23 25 23h112c8 0 12 -2 17 -7v0l23 -23c2 -2 3 -2 6 -2h242zM25 368c-4 0 -9 -3 -9 -7v-74c3 1 5 1 8 1h400c3 0 5 0 8 -1v42c0 4 -3 7 -7 7h-242c-7 0 -12 2 -17 7
+l-23 23c-2 2 -3 2 -6 2h-112zM432 25v239c0 4 -4 8 -8 8h-400c-4 0 -8 -4 -8 -8v-239c0 -4 5 -9 9 -9h400c4 0 7 5 7 9z" />
+ <glyph glyph-name="ion-ios-folder" unicode="&#xf435;"
+d="M440 272c4 0 8 -4 8 -8v-239c0 -14 -10 -25 -23 -25h-400c-13 0 -25 12 -25 25v239c0 4 4 8 8 8h432zM425 352c13 0 23 -10 23 -23v-42c-3 1 -5 1 -8 1h-432c-3 0 -5 0 -8 -1v74c0 13 11 23 25 23h112c8 0 12 -2 17 -7v0l23 -23c2 -2 3 -2 6 -2h242z" />
+ <glyph glyph-name="ion-ios-football-outline" unicode="&#xf436;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM249 6c3 1 5 1 8 2l24 64l-20 39v1h-106l-20 -39l25 -65c2 -1 5 -1 7 -2c12 -3 25 -5 38 -5c14 0 30 2 44 5zM41 284c-15 -27 -23 -57 -24 -89l43 37v0zM142 371
+c-36 -14 -68 -38 -90 -69l22 -64l5 -2l49 -23l71 60v58zM277 201l-70 58l-69 -58v-1l18 -72h104l18 72zM399 195c-1 32 -9 63 -24 90l-19 -53v0zM364 302c-22 31 -54 56 -90 69l-58 -40v-58l71 -60l54 24zM18 175c3 -34 15 -66 33 -92l70 -1l21 39l-20 77l-1 1l-49 22z
+M295 82l70 1c18 26 30 58 33 92l-54 46l-50 -23l-20 -77zM207 345l47 32c-15 4 -30 6 -46 6s-32 -2 -47 -6zM118 66l-54 1c20 -23 46 -42 75 -53l-20 50zM277 14c29 11 55 30 75 53l-56 -1l-2 -3z" />
+ <glyph glyph-name="ion-ios-football" unicode="&#xf437;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM249 6c3 1 5 1 8 2l24 64l-20 39v1h-106l-20 -39l25 -65c2 -1 5 -1 7 -2c12 -3 25 -5 38 -5c14 0 30 2 44 5zM142 371c-36 -14 -68 -38 -90 -69l22 -64l5 -2l49 -23l71 60v58z
+M364 302c-22 31 -54 56 -90 69l-58 -40v-58l71 -60l54 24zM18 175c3 -34 15 -66 33 -92l70 -1l21 39l-20 77l-1 1l-49 22zM295 82l70 1c18 26 30 58 33 92l-54 46l-50 -23l-20 -77z" />
+ <glyph glyph-name="ion-ios-game-controller-a-outline" unicode="&#xf438;"
+d="M163 208c3 0 5 -2 5 -5v-22c0 -3 -2 -5 -5 -5h-35v-35c0 -3 -3 -5 -6 -5h-21c-3 0 -5 2 -5 5v35h-35c-3 0 -5 3 -5 6v21c0 3 2 5 5 5h35v35c0 3 2 5 5 5h22c3 0 5 -2 5 -5v-35h35zM330 169c11 0 20 -8 20 -19s-9 -19 -20 -19s-19 8 -19 19s8 19 19 19zM288 211
+c11 0 19 -8 19 -19s-8 -19 -19 -19s-20 8 -20 19s9 19 20 19zM373 211c11 0 19 -8 19 -19s-8 -19 -19 -19s-20 8 -20 19s9 19 20 19zM330 253c11 0 20 -8 20 -19s-9 -20 -20 -20s-19 9 -19 20s8 19 19 19zM337 286h-226c-26 0 -49 -9 -67 -26s-28 -41 -28 -67s10 -51 28 -68
+s41 -27 67 -27h226c26 0 49 10 67 27s28 42 28 68s-10 50 -28 67s-41 26 -67 26zM337 302v0c61 0 111 -45 111 -109s-50 -111 -111 -111h-226c-61 0 -111 47 -111 111s50 109 111 109h226z" />
+ <glyph glyph-name="ion-ios-game-controller-a" unicode="&#xf439;"
+d="M337 302c61 0 111 -45 111 -109s-50 -111 -111 -111h-226c-61 0 -111 47 -111 111s50 109 111 109h226zM168 181v0v22c0 3 -2 5 -5 5h-35v35c0 3 -2 5 -5 5h-22c-3 0 -5 -2 -5 -5v-35h-35c-3 0 -5 -2 -5 -5v-21c0 -3 2 -6 5 -6h35v-35c0 -3 2 -5 5 -5h21c3 0 6 2 6 5v35
+h35c3 0 5 2 5 5zM288 173c11 0 19 8 19 19s-8 19 -19 19s-20 -8 -20 -19s9 -19 20 -19zM330 131c11 0 20 8 20 19s-9 19 -20 19s-19 -8 -19 -19s8 -19 19 -19zM330 214c11 0 20 9 20 20s-9 19 -20 19s-19 -8 -19 -19s8 -20 19 -20zM373 173c11 0 19 8 19 19s-8 19 -19 19
+s-20 -8 -20 -19s9 -19 20 -19z" />
+ <glyph glyph-name="ion-ios-game-controller-b-outline" unicode="&#xf43a;"
+d="M276 244c11 0 20 -9 20 -20s-9 -20 -20 -20s-20 9 -20 20s9 20 20 20zM320 200c11 0 20 -9 20 -20s-9 -20 -20 -20s-20 9 -20 20s9 20 20 20zM103 264c22 0 39 -18 39 -40s-17 -40 -39 -40s-39 18 -39 40s17 40 39 40zM103 205c11 0 19 8 19 19s-8 19 -19 19
+s-19 -8 -19 -19s8 -19 19 -19zM320 288c11 0 20 -9 20 -20s-9 -20 -20 -20s-20 9 -20 20s9 20 20 20zM364 244c11 0 20 -9 20 -20s-9 -20 -20 -20s-20 9 -20 20s9 20 20 20zM434 199c21 -88 18 -152 -7 -164c-4 -2 -9 -3 -13 -3c-22 0 -45 24 -68 52c-26 32 -32 33 -110 33
+h-24c-78 0 -84 -1 -110 -33c-23 -28 -46 -52 -68 -52c-4 0 -9 1 -13 3c-25 12 -28 76 -7 164s43 136 88 149c10 3 18 4 26 4c28 0 47 -15 96 -15s68 15 96 15c8 0 16 -1 26 -4c45 -13 67 -61 88 -149zM420 49c10 5 23 48 -1 146c-21 90 -43 128 -78 138c-8 2 -14 3 -21 3
+c-10 0 -19 -2 -30 -5c-16 -4 -36 -10 -66 -10s-50 6 -66 10c-11 3 -20 5 -30 5c-7 0 -13 -1 -21 -3c-35 -10 -57 -48 -78 -138c-24 -98 -11 -141 -1 -146c2 -1 4 -1 6 -1c6 0 14 4 23 12s19 18 32 34s24 28 44 34c17 5 38 5 79 5h24c41 0 62 0 79 -5c20 -6 31 -18 44 -34
+s23 -26 32 -34s17 -12 23 -12c2 0 4 0 6 1z" />
+ <glyph glyph-name="ion-ios-game-controller-b" unicode="&#xf43b;"
+d="M103 243c11 0 19 -8 19 -19s-8 -19 -19 -19s-19 8 -19 19s8 19 19 19zM434 199c21 -88 18 -152 -7 -164c-4 -2 -9 -3 -13 -3c-22 0 -45 24 -68 52c-26 32 -32 33 -110 33h-24c-78 0 -84 -1 -110 -33c-23 -28 -46 -52 -68 -52c-4 0 -9 1 -13 3c-25 12 -28 76 -7 164
+s43 136 88 149c10 3 18 4 26 4c28 0 47 -15 96 -15s68 15 96 15c8 0 16 -1 26 -4c45 -13 67 -61 88 -149zM103 184c22 0 39 18 39 40s-17 40 -39 40s-39 -18 -39 -40s17 -40 39 -40zM276 204c11 0 20 9 20 20s-9 20 -20 20s-20 -9 -20 -20s9 -20 20 -20zM320 160
+c11 0 20 9 20 20s-9 20 -20 20s-20 -9 -20 -20s9 -20 20 -20zM320 248c11 0 20 9 20 20s-9 20 -20 20s-20 -9 -20 -20s9 -20 20 -20zM364 204c11 0 20 9 20 20s-9 20 -20 20s-20 -9 -20 -20s9 -20 20 -20z" />
+ <glyph glyph-name="ion-ios-gear-outline" unicode="&#xf43c;" horiz-adv-x="384"
+d="M193 288c26 0 50 -10 68 -28s28 -42 28 -68s-10 -50 -28 -68s-42 -28 -68 -28s-50 10 -68 28s-28 42 -28 68s10 50 28 68s42 28 68 28zM193 112c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80zM138 365c-10 -3 -20 -7 -30 -12c2 -8 1 -16 0 -24
+c-2 -13 -8 -25 -18 -35c-12 -12 -29 -19 -46 -19c-4 0 -9 0 -13 1c-5 -10 -9 -20 -12 -30c7 -4 12 -10 17 -17c8 -11 12 -24 12 -37s-4 -26 -12 -37c-5 -7 -10 -13 -17 -17c3 -10 7 -20 12 -30c4 1 9 1 13 1c17 0 34 -7 46 -19c10 -10 16 -22 18 -35c1 -8 2 -16 0 -24
+c10 -5 20 -9 30 -12c4 7 10 12 17 17c11 8 24 12 37 12s26 -4 37 -12c7 -5 13 -10 17 -17c10 3 20 7 30 12c-2 8 -1 16 0 24c2 13 8 25 18 35c12 12 29 19 46 19c4 0 9 0 13 -1c5 10 9 20 12 30c-7 4 -12 10 -17 17c-8 11 -12 24 -12 37s4 26 12 37c5 7 10 13 17 17
+c-3 10 -7 20 -12 30c-4 -1 -9 -1 -13 -1c-17 0 -34 7 -46 19c-10 10 -16 22 -18 35c-1 8 -2 16 0 24c-10 5 -20 9 -30 12c-4 -7 -10 -12 -17 -17c-11 -8 -24 -12 -37 -12s-26 4 -37 12c-7 5 -13 10 -17 17zM238 384v0c20 -5 40 -13 57 -24c-8 -18 -5 -40 10 -55
+c10 -10 22 -14 35 -14c7 0 14 1 20 4c11 -17 19 -37 24 -57c-19 -7 -32 -25 -32 -46s14 -39 32 -46c-5 -20 -13 -40 -24 -57c-6 3 -13 4 -20 4c-13 0 -25 -4 -35 -14c-15 -15 -18 -37 -10 -55c-17 -11 -37 -19 -57 -24c-7 18 -25 32 -46 32s-39 -14 -46 -32
+c-20 5 -40 13 -57 24c8 18 5 40 -10 55c-10 10 -22 14 -35 14c-7 0 -14 -1 -20 -4c-11 17 -19 37 -24 57c18 7 32 25 32 46s-13 39 -32 46c5 20 13 40 24 57c6 -3 13 -4 20 -4c13 0 25 4 35 14c15 15 18 37 10 55c17 11 37 19 57 24c7 -19 25 -32 46 -32s39 13 46 32z" />
+ <glyph glyph-name="ion-ios-gear" unicode="&#xf43d;" horiz-adv-x="384"
+d="M352 192c0 -21 14 -39 32 -46c-5 -20 -13 -40 -24 -57c-6 3 -13 4 -20 4c-13 0 -25 -4 -35 -14c-15 -15 -18 -37 -10 -55c-17 -11 -37 -19 -57 -24c-7 18 -25 32 -46 32s-39 -14 -46 -32c-20 5 -40 13 -57 24c8 18 5 40 -10 55c-10 10 -22 14 -35 14c-7 0 -14 -1 -20 -4
+c-11 17 -19 37 -24 57c18 7 32 25 32 46s-13 39 -32 46c5 20 13 40 24 57c6 -3 13 -4 20 -4c13 0 25 4 35 14c15 15 18 37 10 55c17 11 37 19 57 24c7 -19 25 -32 46 -32s39 13 46 32c20 -5 40 -13 57 -24c-8 -18 -5 -40 10 -55c10 -10 22 -14 35 -14c7 0 14 1 20 4
+c11 -17 19 -37 24 -57c-19 -7 -32 -25 -32 -46zM193 112c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80z" />
+ <glyph glyph-name="ion-ios-glasses-outline" unicode="&#xf43e;"
+d="M433 201v0h15v-18h-15c-2 -22 -13 -43 -29 -58c-17 -16 -39 -25 -62 -25c-51 0 -92 41 -92 92v0v0c0 10 -12 22 -26 22s-26 -12 -26 -22v0v0c0 -51 -41 -92 -92 -92c-23 0 -45 9 -62 25c-16 15 -27 36 -29 58h-15v18h15c2 22 13 43 29 59c17 16 39 24 62 24
+c42 0 78 -27 89 -67c7 7 18 12 29 12s22 -5 29 -12c11 40 47 67 89 67c23 0 45 -9 62 -25c16 -15 27 -36 29 -58zM342 115c42 0 77 35 77 77s-35 77 -77 77s-77 -35 -77 -77s35 -77 77 -77zM106 115c42 0 77 35 77 77s-35 77 -77 77s-77 -35 -77 -77s35 -77 77 -77z" />
+ <glyph glyph-name="ion-ios-glasses" unicode="&#xf43f;"
+d="M433 201v0h15v-18h-15c-2 -22 -13 -43 -29 -58c-17 -16 -39 -25 -62 -25c-51 0 -92 41 -92 92v0v0c0 10 -12 22 -26 22s-26 -12 -26 -22v0v0c0 -51 -41 -92 -92 -92c-23 0 -45 9 -62 25c-16 15 -27 36 -29 58h-15v18h15c2 22 13 43 29 59c17 16 39 24 62 24
+c42 0 78 -27 89 -67c7 7 18 12 29 12s22 -5 29 -12c11 40 47 67 89 67c23 0 45 -9 62 -25c16 -15 27 -36 29 -58z" />
+ <glyph glyph-name="ion-ios-grid-view-outline" unicode="&#xf440;" horiz-adv-x="384"
+d="M384 256h-112v-128h112v-16h-112v-112h-16v112h-128v-112h-16v112h-112v16h112v128h-112v16h112v112h16v-112h128v112h16v-112h112v-16zM256 128v128h-128v-128h128z" />
+ <glyph glyph-name="ion-ios-grid-view" unicode="&#xf441;" horiz-adv-x="384"
+d="M128 128v128h128v-128h-128zM0 384h384v-384h-384v384zM352 256v16h-80v80h-16v-80h-128v80h-16v-80h-80v-16h80v-128h-80v-16h80v-80h16v80h128v-80h16v80h80v16h-80v128h80z" />
+ <glyph glyph-name="ion-ios-heart-outline" unicode="&#xf442;"
+d="M327 368c69 0 121 -43 121 -116c0 -31 -13 -71 -41 -105s-45 -52 -100 -88s-83 -43 -83 -43s-28 7 -83 43s-72 54 -100 88s-41 74 -41 105c0 73 52 116 121 116c39 0 82 -18 103 -53c21 35 64 53 103 53zM395 157c12 14 22 31 28 49c6 16 9 31 9 46c0 30 -10 56 -29 74
+c-9 8 -20 15 -33 19c-13 5 -28 7 -43 7c-38 0 -73 -18 -89 -45l-14 -23l-14 23c-16 27 -51 45 -89 45c-15 0 -30 -2 -43 -7c-13 -4 -24 -11 -33 -19c-19 -18 -29 -44 -29 -74c0 -15 3 -30 9 -46c6 -18 16 -35 28 -49c27 -32 42 -49 97 -85c40 -27 65 -36 74 -39
+c9 3 34 12 74 39c55 36 70 53 97 85z" />
+ <glyph glyph-name="ion-ios-heart" unicode="&#xf443;"
+d="M327 368c69 0 121 -43 121 -116c0 -31 -13 -71 -41 -105s-45 -52 -100 -88s-83 -43 -83 -43s-28 7 -83 43s-72 54 -100 88s-41 74 -41 105c0 73 52 116 121 116c39 0 82 -18 103 -53c21 35 64 53 103 53z" />
+ <glyph glyph-name="ion-ios-help-empty" unicode="&#xf444;" horiz-adv-x="128"
+d="M68 82c-9 0 -17 8 -17 17s8 17 17 17s17 -8 17 -17s-8 -17 -17 -17zM102 197c-23 -22 -22 -27 -23 -53h-19c1 28 7 43 30 64c11 10 19 24 19 39c0 24 -19 39 -42 39c-32 0 -49 -16 -48 -46h-19c0 42 25 62 68 62c33 0 60 -20 60 -54c0 -22 -11 -37 -26 -51z" />
+ <glyph glyph-name="ion-ios-help-outline" unicode="&#xf445;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191zM212 302c33 0 60 -21 60 -55c0 -22 -11 -36 -26 -50c-23 -23 -22 -27 -23 -53h-19
+c1 28 7 43 30 64c11 10 19 23 19 38c0 24 -19 40 -42 40c-32 0 -49 -16 -48 -46h-19c0 42 25 62 68 62zM212 116c9 0 17 -8 17 -17s-8 -17 -17 -17s-17 8 -17 17s8 17 17 17z" />
+ <glyph glyph-name="ion-ios-help" unicode="&#xf446;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM212 82c9 0 17 8 17 17s-8 17 -17 17s-17 -8 -17 -17s8 -17 17 -17zM246 197c15 14 26 29 26 51c0 34 -27 54 -60 54c-43 0 -68 -20 -68 -62h19c-1 30 16 46 48 46
+c23 0 42 -15 42 -39c0 -15 -8 -29 -19 -39c-23 -21 -29 -36 -30 -64h19c1 26 0 31 23 53z" />
+ <glyph glyph-name="ion-ios-home-outline" unicode="&#xf447;" horiz-adv-x="384"
+d="M192 336l160 -128v-208h-112v128h-96v-128h-112v208zM336 16v184l-144 116l-144 -116v-184h80v128h128v-128h80zM192 384l192 -153l-12 -12l-180 145l-180 -145l-12 12l32 25v96h64v-45zM80 294v42h-32v-67z" />
+ <glyph glyph-name="ion-ios-home" unicode="&#xf448;" horiz-adv-x="384"
+d="M192 336l160 -128v-208h-112v128h-96v-128h-112v208zM192 384l192 -153l-12 -12l-180 145l-180 -145l-12 12l32 25v96h64v-45z" />
+ <glyph glyph-name="ion-ios-infinite-outline" unicode="&#xf449;"
+d="M419 260c19 -19 29 -43 29 -68s-10 -49 -29 -68c-19 -18 -44 -28 -70 -28s-50 10 -69 28l-126 123c-15 15 -35 22 -56 22s-40 -7 -55 -22c-31 -30 -31 -80 0 -110c15 -15 34 -22 55 -22s41 7 56 22l43 42l13 -14l-42 -41c-19 -18 -44 -28 -70 -28s-50 10 -69 28
+c-19 19 -29 43 -29 68s10 49 29 68c19 18 43 28 69 28s51 -10 70 -28l126 -123c15 -15 34 -22 55 -22s41 7 56 22c31 30 31 80 0 110c-15 15 -35 22 -56 22s-40 -7 -55 -22l-43 -42l-13 14l42 41c19 18 44 28 70 28s50 -10 69 -28z" />
+ <glyph glyph-name="ion-ios-infinite" unicode="&#xf44a;" horiz-adv-x="464"
+d="M433 266c20 -20 31 -46 31 -74s-11 -54 -31 -74s-48 -30 -76 -30s-55 10 -75 30l-125 123c-13 13 -32 20 -51 20s-37 -7 -50 -20s-21 -31 -21 -49c0 -19 8 -36 21 -49s31 -20 50 -20s38 7 51 20l39 38l25 -25l-39 -38c-20 -20 -48 -30 -76 -30s-55 10 -75 30
+s-31 46 -31 74s11 54 31 74s47 30 75 30s56 -10 76 -30l125 -123c13 -13 31 -20 50 -20s38 7 51 20s20 31 20 49c0 19 -7 36 -20 49s-32 20 -51 20s-37 -7 -50 -20l-39 -38l-25 25l39 38c20 20 48 30 76 30s55 -10 75 -30z" />
+ <glyph glyph-name="ion-ios-information-empty" unicode="&#xf44b;" horiz-adv-x="64"
+d="M8 276c0 13 7 20 20 20s20 -7 20 -20s-7 -20 -20 -20s-20 7 -20 20zM48 104h16v-8h-64v8h16v120h-16v8h48v-128z" />
+ <glyph glyph-name="ion-ios-information-outline" unicode="&#xf44c;" horiz-adv-x="416"
+d="M184 276c0 13 7 20 20 20s20 -7 20 -20s-7 -20 -20 -20s-20 7 -20 20zM224 104h16v-8h-64v8h16v120h-16v8h48v-128zM208 400c57 0 106 -20 147 -61s61 -90 61 -147s-20 -106 -61 -147s-90 -61 -147 -61s-106 20 -147 61s-61 90 -61 147s20 106 61 147s90 61 147 61z
+M208 1c53 0 98 19 135 56s56 82 56 135s-19 98 -56 135s-82 56 -135 56s-98 -19 -135 -56s-56 -82 -56 -135s19 -98 56 -135s82 -56 135 -56z" />
+ <glyph glyph-name="ion-ios-information" unicode="&#xf44d;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM204 296c-11 0 -20 -9 -20 -20s9 -20 20 -20s20 9 20 20s-9 20 -20 20zM240 96v8h-16v128h-48v-8h16v-120h-16v-8h64z" />
+ <glyph glyph-name="ion-ios-ionic-outline" unicode="&#xf44e;" horiz-adv-x="416"
+d="M378 313c24 -34 38 -76 38 -121c0 -115 -92 -208 -207 -208s-209 93 -209 208s94 208 209 208c45 0 86 -14 120 -38c6 5 13 8 21 8c19 0 35 -16 35 -35c0 -8 -2 -16 -7 -22zM350 357c-12 0 -22 -10 -22 -22s10 -22 22 -22s22 10 22 22s-10 22 -22 22zM344 56
+c18 18 31 39 41 62c10 24 15 48 15 74s-5 51 -15 75c-5 13 -12 25 -20 36c-5 -2 -10 -3 -15 -3c-19 0 -35 16 -35 35c0 5 2 11 4 15c-11 8 -23 15 -36 20c-24 10 -49 14 -75 14s-51 -4 -75 -14c-23 -10 -43 -24 -61 -42s-31 -38 -41 -61c-10 -24 -15 -49 -15 -75
+s5 -50 15 -74c10 -23 23 -44 41 -62s38 -31 61 -41c24 -10 49 -15 75 -15s51 5 75 15c23 10 43 23 61 41zM208 288c53 0 96 -43 96 -96s-43 -96 -96 -96s-96 43 -96 96s43 96 96 96zM208 112c44 0 80 36 80 80s-36 80 -80 80s-79 -36 -79 -80s35 -80 79 -80z" />
+ <glyph glyph-name="ion-ios-keypad-outline" unicode="&#xf44f;" horiz-adv-x="384"
+d="M331 107c30 0 53 -24 53 -54s-23 -53 -53 -53s-54 23 -54 53s24 54 54 54zM331 16c21 0 37 16 37 37s-16 38 -37 38s-38 -17 -38 -38s17 -37 38 -37zM192 107c30 0 53 -24 53 -54s-23 -53 -53 -53s-53 23 -53 53s23 54 53 54zM192 16c21 0 37 16 37 37s-16 38 -37 38
+s-37 -17 -37 -38s16 -37 37 -37zM53 107c30 0 54 -24 54 -54s-24 -53 -54 -53s-53 23 -53 53s23 54 53 54zM53 16c21 0 38 16 38 37s-17 38 -38 38s-37 -17 -37 -38s16 -37 37 -37zM331 245c30 0 53 -23 53 -53s-23 -53 -53 -53s-54 23 -54 53s24 53 54 53zM331 155
+c21 0 37 16 37 37s-16 37 -37 37s-38 -16 -38 -37s17 -37 38 -37zM192 245c30 0 53 -23 53 -53s-23 -53 -53 -53s-53 23 -53 53s23 53 53 53zM192 155c21 0 37 16 37 37s-16 37 -37 37s-37 -16 -37 -37s16 -37 37 -37zM53 245c30 0 54 -23 54 -53s-24 -53 -54 -53
+s-53 23 -53 53s23 53 53 53zM53 155c21 0 38 16 38 37s-17 37 -38 37s-37 -16 -37 -37s16 -37 37 -37zM331 277c-30 0 -54 24 -54 54s24 53 54 53s53 -23 53 -53s-23 -54 -53 -54zM331 368c-21 0 -38 -16 -38 -37s17 -38 38 -38s37 17 37 38s-16 37 -37 37zM192 384
+c30 0 53 -23 53 -53s-23 -54 -53 -54s-53 24 -53 54s23 53 53 53zM192 293c21 0 37 17 37 38s-16 37 -37 37s-37 -16 -37 -37s16 -38 37 -38zM53 384c30 0 54 -23 54 -53s-24 -54 -54 -54s-53 24 -53 54s23 53 53 53zM53 293c21 0 38 17 38 38s-17 37 -38 37
+s-37 -16 -37 -37s16 -38 37 -38z" />
+ <glyph glyph-name="ion-ios-keypad" unicode="&#xf450;" horiz-adv-x="384"
+d="M331 107c30 0 53 -24 53 -54s-23 -53 -53 -53s-54 23 -54 53s24 54 54 54zM192 107c30 0 53 -24 53 -54s-23 -53 -53 -53s-53 23 -53 53s23 54 53 54zM53 107c30 0 54 -24 54 -54s-24 -53 -54 -53s-53 23 -53 53s23 54 53 54zM331 245c30 0 53 -23 53 -53
+s-23 -53 -53 -53s-54 23 -54 53s24 53 54 53zM192 245c30 0 53 -23 53 -53s-23 -53 -53 -53s-53 23 -53 53s23 53 53 53zM53 245c30 0 54 -23 54 -53s-24 -53 -54 -53s-53 23 -53 53s23 53 53 53zM331 277c-30 0 -54 24 -54 54s24 53 54 53s53 -23 53 -53s-23 -54 -53 -54z
+M192 384c30 0 53 -23 53 -53s-23 -54 -53 -54s-53 24 -53 54s23 53 53 53zM53 384c30 0 54 -23 54 -53s-24 -54 -54 -54s-53 24 -53 54s23 53 53 53z" />
+ <glyph glyph-name="ion-ios-lightbulb-outline" unicode="&#xf451;" horiz-adv-x="288"
+d="M288 275c0 -31 -13 -59 -30 -83v0c-11 -15 -22 -28 -32 -45c-22 -38 -18 -73 -18 -82v-1h-128v1c0 7 3 44 -19 82c-10 17 -20 30 -31 45v0c-17 24 -30 52 -30 83c0 78 66 141 144 141s144 -63 144 -141zM239 194l6 8c16 22 27 47 27 73c0 33 -16 65 -40 89s-55 36 -88 36
+s-64 -12 -88 -36s-40 -56 -40 -89c0 -26 11 -51 27 -73l19 -26v0c5 -6 9 -13 13 -21c17 -29 21 -58 21 -75h16v112l-32 64h17l31 -64v-112h32v112l31 64h17l-32 -64v-112h16c0 17 4 45 21 75c8 14 16 25 24 36c1 1 1 2 2 3zM112 -32v16h64v-16h-64zM96 0v16h96v-16h-96z
+M96 32v16h96v-16h-96z" />
+ <glyph glyph-name="ion-ios-lightbulb" unicode="&#xf452;" horiz-adv-x="288"
+d="M288 275c0 -31 -13 -59 -30 -83v0c-11 -15 -22 -28 -32 -45c-22 -38 -18 -73 -18 -82v-1h-32v128l32 64h-16l-32 -64v-128h-32v128l-31 64h-17l32 -64v-128h-32v1c0 7 3 44 -19 82c-10 17 -20 30 -31 45v0c-17 24 -30 52 -30 83c0 78 66 141 144 141s144 -63 144 -141z
+M112 -32v16h64v-16h-64zM96 0v16h96v-16h-96zM96 32v16h96v-16h-96z" />
+ <glyph glyph-name="ion-ios-list-outline" unicode="&#xf453;" horiz-adv-x="384"
+d="M368 368h-352v-352h352v352zM384 384v0v-384h-384v384h384zM128 280v16h192v-16h-192zM128 184v16h192v-16h-192zM128 88v16h192v-16h-192zM64 288c0 11 5 16 16 16s16 -5 16 -16s-5 -16 -16 -16s-16 5 -16 16zM64 192c0 11 5 16 16 16s16 -5 16 -16s-5 -16 -16 -16
+s-16 5 -16 16zM64 96c0 11 5 16 16 16s16 -5 16 -16s-5 -16 -16 -16s-16 5 -16 16z" />
+ <glyph glyph-name="ion-ios-list" unicode="&#xf454;" horiz-adv-x="384"
+d="M0 384h384v-384h-384v384zM80 80c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM80 176c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM80 272c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM320 88v16h-192v-16h192zM320 184v16
+h-192v-16h192zM320 280v16h-192v-16h192z" />
+ <glyph glyph-name="ion-ios-location-outline" unicode="&#xf455;" horiz-adv-x="288"
+d="M144 400c-34 0 -67 -13 -91 -37s-37 -57 -37 -91c0 -43 24 -107 70 -186c22 -38 44 -72 58 -91c14 19 36 53 58 91c46 79 70 143 70 186c0 34 -13 67 -37 91s-57 37 -91 37zM144 416v0c80 0 144 -64 144 -144c0 -112 -144 -304 -144 -304s-144 192 -144 304
+c0 80 64 144 144 144zM144 336c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM144 225c26 0 47 21 47 47s-21 47 -47 47s-47 -21 -47 -47s21 -47 47 -47z" />
+ <glyph glyph-name="ion-ios-location" unicode="&#xf456;" horiz-adv-x="288"
+d="M144 416c80 0 144 -64 144 -144c0 -112 -144 -304 -144 -304s-144 192 -144 304c0 80 64 144 144 144zM144 225c26 0 47 21 47 47s-21 47 -47 47s-47 -21 -47 -47s21 -47 47 -47z" />
+ <glyph glyph-name="ion-ios-locked-outline" unicode="&#xf457;" horiz-adv-x="320"
+d="M264 224h56v-240h-320v240h56v72c0 57 47 104 104 104s104 -47 104 -104v-72zM72 296v-72h176v72c0 49 -39 88 -88 88s-88 -39 -88 -88zM304 0v208h-288v-208h288zM160 160c18 0 32 -14 32 -32c0 -15 -10 -27 -24 -31v-33h-16v33c-14 4 -24 16 -24 31c0 18 14 32 32 32z
+M160 112c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16z" />
+ <glyph glyph-name="ion-ios-locked" unicode="&#xf458;" horiz-adv-x="320"
+d="M264 224h56v-240h-320v240h56v72c0 57 47 104 104 104s104 -47 104 -104v-72zM168 97c14 4 24 16 24 31c0 18 -14 32 -32 32s-32 -14 -32 -32c0 -15 10 -27 24 -31v-33h16v33zM248 224v72c0 49 -39 88 -88 88s-88 -39 -88 -88v-72h176zM160 144c9 0 16 -7 16 -16
+s-7 -16 -16 -16s-16 7 -16 16s7 16 16 16z" />
+ <glyph glyph-name="ion-ios-loop-strong" unicode="&#xf459;" horiz-adv-x="512"
+d="M256 400c115 0 208 -93 208 -208c0 -14 -1 -28 -4 -42l-1 -4l-24 5l1 4c2 12 4 24 4 37c0 101 -83 184 -184 184c-66 0 -127 -36 -160 -94l-2 -3l-21 11l2 4c37 65 106 106 181 106zM416 102l2 3l21 -11l-2 -4c-37 -65 -106 -106 -181 -106c-115 0 -208 93 -208 208
+c0 14 1 28 4 42l1 4l24 -5l-1 -4c-2 -12 -4 -24 -4 -37c0 -101 83 -184 184 -184c66 0 127 36 160 94zM384 192h128l-64 -64zM0 192l64 64l64 -64h-128z" />
+ <glyph glyph-name="ion-ios-loop" unicode="&#xf45a;" horiz-adv-x="489"
+d="M478 192l11 -11l-52 -53l-53 53l10 11l43 -41zM449 192v0v0c0 -7 0 -14 -1 -21l-16 1c1 7 1 14 1 21c-1 103 -85 187 -188 187c-68 0 -131 -37 -164 -96l-14 8c36 64 104 104 178 104c112 0 203 -91 204 -202v0v-2zM409 100l14 -8c-36 -64 -104 -104 -178 -104
+c-111 0 -202 90 -204 200v0v3v1v0c0 7 0 14 1 21l16 -1c-1 -7 -1 -14 -1 -21c0 -103 85 -187 188 -187c68 0 131 37 164 96zM53 256l52 -53l-11 -11l-41 41l-42 -41l-11 11z" />
+ <glyph glyph-name="ion-ios-medical-outline" unicode="&#xf45b;" horiz-adv-x="364"
+d="M364 260l-118 -68l118 -68l-32 -56l-118 69v-137h-64v137l-118 -69l-32 56l118 68l-118 68l32 56l118 -69v137h64v-137l118 69zM342 118l-128 74l128 74l-16 28l-128 -74v148h-32v-148l-128 74l-16 -28l128 -74l-128 -74l16 -28l128 74v-148h32v148l128 -74z" />
+ <glyph glyph-name="ion-ios-medical" unicode="&#xf45c;" horiz-adv-x="364"
+d="M364 260l-118 -68l118 -68l-32 -56l-118 69v-137h-64v137l-118 -69l-32 56l118 68l-118 68l32 56l118 -69v137h64v-137l118 69z" />
+ <glyph glyph-name="ion-ios-medkit-outline" unicode="&#xf45d;" horiz-adv-x="416"
+d="M224 240h-32v-48v-16h-16h-48v-32h48h16v-16v-48h32v48v16h16h48v32h-48h-16v16v48zM240 256v0v-64h64v-64h-64v-64h-64v64h-64v64h64v64h64zM288 320h128v-320h-416v320h128v32c0 18 10 32 29 32h99c19 0 32 -14 32 -32v-32zM144 350v-30h128v30c0 10 -7 18 -17 18h-97
+c-11 0 -14 -8 -14 -18zM400 16v288h-384v-288h384z" />
+ <glyph glyph-name="ion-ios-medkit" unicode="&#xf45e;" horiz-adv-x="416"
+d="M224 176h16h48v-32h-48h-16v-16v-48h-32v48v16h-16h-48v32h48h16v16v48h32v-48v-16zM288 320h128v-320h-416v320h128v32c0 18 10 32 29 32h99c19 0 32 -14 32 -32v-32zM144 350v-30h128v30c0 10 -7 18 -17 18h-97c-11 0 -14 -8 -14 -18zM304 128v64h-64v64h-64v-64h-64
+v-64h64v-64h64v64h64z" />
+ <glyph glyph-name="ion-ios-mic-off" unicode="&#xf45f;" horiz-adv-x="280"
+d="M266 -32l-258 440l14 8l258 -440zM128 95c-44 0 -79 37 -79 83v118l113 -193c-10 -5 -22 -8 -34 -8zM207 178c0 -10 -2 -19 -5 -28l-136 234c14 20 37 32 62 32c44 0 79 -38 79 -84v-154zM256 176c0 -28 -9 -54 -24 -75l-10 17c11 17 17 36 17 58v80h17v-80zM139 49v0
+v-63h69v-18h-161v18h73v63c-67 5 -120 60 -120 127v80h19v-80c0 -60 50 -109 110 -109c17 0 34 4 48 11l9 -16c-14 -7 -30 -12 -47 -13z" />
+ <glyph glyph-name="ion-ios-mic-outline" unicode="&#xf460;" horiz-adv-x="256"
+d="M128 416c44 0 79 -38 79 -84v-154c0 -46 -35 -84 -79 -84s-79 38 -79 84v154c0 46 35 84 79 84zM191 178v154c0 37 -28 68 -63 68s-63 -31 -63 -68v-154c0 -37 28 -68 63 -68s63 31 63 68zM239 256h17v-80c0 -67 -51 -122 -117 -127v-63h69v-18h-161v18h73v63
+c-67 5 -120 60 -120 127v80h19v-80c0 -60 50 -109 110 -109s110 49 110 109v80z" />
+ <glyph glyph-name="ion-ios-mic" unicode="&#xf461;" horiz-adv-x="256"
+d="M128 94c-44 0 -79 38 -79 84v154c0 46 35 84 79 84s79 -38 79 -84v-154c0 -46 -35 -84 -79 -84zM239 256h17v-80c0 -67 -51 -122 -117 -127v-63h69v-18h-161v18h73v63c-67 5 -120 60 -120 127v80h19v-80c0 -60 50 -109 110 -109s110 49 110 109v80z" />
+ <glyph glyph-name="ion-ios-minus-empty" unicode="&#xf462;" horiz-adv-x="256"
+d="M256 183h-256v17h256v-17z" />
+ <glyph glyph-name="ion-ios-minus-outline" unicode="&#xf463;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191zM80 183v17h256v-17h-256z" />
+ <glyph glyph-name="ion-ios-minus" unicode="&#xf464;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM336 183v17h-256v-17h256z" />
+ <glyph glyph-name="ion-ios-monitor-outline" unicode="&#xf465;" horiz-adv-x="480"
+d="M480 64h-176v-16h64v-16h-257v16h64v16h-175v288h480v-288zM16 336v-256h448v256h-448z" />
+ <glyph glyph-name="ion-ios-monitor" unicode="&#xf466;" horiz-adv-x="480"
+d="M480 64h-176v-16h64v-16h-257v16h64v16h-175v288h480v-288zM16 336v-256h448v256h-448zM32 96v224h416v-224h-416z" />
+ <glyph glyph-name="ion-ios-moon-outline" unicode="&#xf467;" horiz-adv-x="216"
+d="M195 133c7 0 14 1 21 3c-4 -7 -7 -12 -12 -18c-21 -25 -53 -41 -88 -41c-64 0 -116 51 -116 115c0 52 34 96 81 111c7 2 14 3 22 4c-4 -6 -8 -12 -11 -18c-7 -14 -11 -30 -11 -47c0 -29 11 -56 32 -77s48 -32 77 -32h5zM116 93c25 0 48 9 65 24c-65 5 -116 59 -116 125
+c0 14 2 28 6 40c-33 -16 -55 -51 -55 -90c0 -55 45 -99 100 -99z" />
+ <glyph glyph-name="ion-ios-moon" unicode="&#xf468;" horiz-adv-x="216"
+d="M195 133c7 0 14 1 21 3c-4 -7 -7 -12 -12 -18c-21 -25 -53 -41 -88 -41c-64 0 -116 51 -116 115c0 52 34 96 81 111c7 2 14 3 22 4c-4 -6 -8 -12 -11 -18c-7 -14 -11 -30 -11 -47c0 -29 11 -56 32 -77s48 -32 77 -32h5z" />
+ <glyph glyph-name="ion-ios-more-outline" unicode="&#xf469;" horiz-adv-x="320"
+d="M160 210c-10 0 -18 -8 -18 -18s8 -18 18 -18s18 8 18 18s-8 18 -18 18zM160 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32zM32 210c-10 0 -18 -8 -18 -18s8 -18 18 -18s18 8 18 18s-8 18 -18 18zM32 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32
+s-32 14 -32 32s14 32 32 32zM288 210c-10 0 -18 -8 -18 -18s8 -18 18 -18s18 8 18 18s-8 18 -18 18zM288 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32z" />
+ <glyph glyph-name="ion-ios-more" unicode="&#xf46a;" horiz-adv-x="320"
+d="M160 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32zM32 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32zM288 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32z" />
+ <glyph glyph-name="ion-ios-musical-note" unicode="&#xf46b;" horiz-adv-x="192"
+d="M192 346v-1v-65c0 -3 -3 -6 -6 -5v0l-73 13v-192c0 -33 1 -80 -51 -82c-48 -2 -62 16 -62 41c0 19 9 39 51 41c22 1 37 1 45 1v273l90 -19l2 -1c2 0 3 -1 4 -3v0v-1v0z" />
+ <glyph glyph-name="ion-ios-musical-notes" unicode="&#xf46c;" horiz-adv-x="320"
+d="M320 128c0 -34 4 -80 -49 -82c-49 -2 -62 16 -62 41c0 20 9 39 52 41c23 1 34 2 43 2v160l-191 -32v-161c0 -34 3 -81 -50 -83c-49 -2 -63 17 -63 42c0 20 9 39 52 41c23 1 35 1 44 1v237l224 35v-242z" />
+ <glyph glyph-name="ion-ios-navigate-outline" unicode="&#xf46d;" horiz-adv-x="416"
+d="M208 384c-51 0 -99 -21 -135 -57s-57 -84 -57 -135s21 -99 57 -135s84 -57 135 -57s99 21 135 57s57 84 57 135s-21 99 -57 135s-84 57 -135 57zM208 400v0c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM304 288l-96 -224v128h-128z" />
+ <glyph glyph-name="ion-ios-navigate" unicode="&#xf46e;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 64l96 224l-224 -96h128v-128z" />
+ <glyph glyph-name="ion-ios-nutrition-outline" unicode="&#xf46f;" horiz-adv-x="384"
+d="M294 214v0c6 -6 10 -14 10 -23c0 -11 -5 -20 -13 -26v0s-51 -37 -106 -77l-38 31c-2 2 -4 3 -6 3c-1 0 -2 0 -3 -1v0c-2 -2 -2 -6 1 -10l29 -35l-115 -84c-6 -4 -13 -8 -21 -8c-18 0 -32 14 -32 32c0 7 1 13 4 18v0c2 2 17 25 37 57l21 -17c2 -2 4 -2 6 -2c1 0 3 0 4 1v0
+c2 2 1 6 -2 10l-19 23c27 43 60 96 84 134l36 -30c2 -2 4 -3 6 -3c1 0 2 1 3 2v0c2 2 2 5 -1 9l-33 40c11 18 19 29 19 29v0c6 10 15 16 27 16c9 0 18 -4 24 -10v0l78 -79v0v0zM282 178c4 3 6 8 6 13c0 4 -2 9 -5 12l-5 4v1l-69 69v0l-5 5c-3 3 -8 5 -12 5
+c-6 0 -10 -3 -13 -8l-5 -8c-2 -3 -5 -7 -8 -12l25 -30v0l1 -1c8 -10 8 -22 0 -30l-1 -1l-1 -1c-4 -3 -8 -5 -13 -5s-11 2 -16 6v1h-1l-21 18l-24 -39l-44 -70l12 -14v0v0c8 -10 8 -23 0 -31v0c-4 -4 -9 -6 -15 -6c-5 0 -11 2 -16 6v0v0l-7 5c-3 -5 -5 -9 -8 -13
+c-12 -19 -16 -26 -18 -29c-1 -3 -2 -6 -2 -9c0 -9 7 -16 16 -16c3 0 6 2 11 5l101 74l-18 22h-1v0c-8 10 -8 23 0 31v0v0v0c4 4 10 6 15 6s11 -2 16 -6v0h1l28 -24c49 36 93 68 96 70zM376 333l8 -14l-5 -3l-103 -60l-17 17l71 123l2 4l14 -8l-3 -4l-63 -111l91 53z" />
+ <glyph glyph-name="ion-ios-nutrition" unicode="&#xf470;" horiz-adv-x="384"
+d="M295 214v0c6 -6 9 -13 9 -22c0 -11 -5 -20 -13 -26v0s-51 -38 -106 -78l-38 32c-4 3 -8 3 -10 1v0c-2 -2 -2 -6 1 -10l29 -35l-114 -84c-6 -4 -13 -8 -21 -8c-18 0 -32 14 -32 32c0 7 2 13 5 18v0c1 2 16 25 36 57l20 -17c4 -3 8 -3 10 -1v0c2 2 2 6 -1 10l-20 23
+c27 43 60 96 84 134l36 -30c4 -3 8 -3 10 -1v0c2 2 2 6 -1 10l-33 40c11 18 18 29 18 29v0c6 10 16 16 28 16c9 0 18 -4 24 -10v0l78 -79l1 -1v0zM384 309l-103 -59l-28 29l70 121l28 -16l-50 -85l67 38z" />
+ <glyph glyph-name="ion-ios-paper-outline" unicode="&#xf471;" horiz-adv-x="384"
+d="M48 384h336v-353c0 -17 -14 -31 -31 -31h-322c-17 0 -31 14 -31 31v305h32v-16h-16v-289c0 -8 7 -15 15 -15h322c8 0 15 7 15 15v337h-304v-320h-16v320v16zM96 320v16h128v-16h-128zM96 240v16h240v-16h-240zM96 160v16h192v-16h-192zM96 80v16h240v-16h-240z" />
+ <glyph glyph-name="ion-ios-paper" unicode="&#xf472;" horiz-adv-x="384"
+d="M48 384h336v-353c0 -17 -14 -31 -31 -31h-322c-17 0 -31 14 -31 31v305h32v-288h16v288v32v16zM96 336v-16h128v16h-128zM96 176v-16h192v16h-192zM336 80v16h-240v-16h240zM336 240v16h-240v-16h240z" />
+ <glyph glyph-name="ion-ios-paperplane-outline" unicode="&#xf473;" horiz-adv-x="320"
+d="M0 198l320 154l-146 -320l-57 115zM132 152l41 -83l115 249zM286 320l-248 -121l83 -36z" />
+ <glyph glyph-name="ion-ios-paperplane" unicode="&#xf474;" horiz-adv-x="320"
+d="M0 198l320 154l-214 -200zM320 352l-146 -320l-52 104z" />
+ <glyph glyph-name="ion-ios-partlysunny-outline" unicode="&#xf475;" horiz-adv-x="384"
+d="M144 298v54h16v-54h-16zM0 192v16h55v-16h-55zM44 299l10 11l32 -32l-11 -11zM223 268l-11 11l32 32l11 -11zM56 96l-10 11l31 31l11 -11zM129 153c-4 -3 -8 -7 -12 -12c-23 12 -39 36 -39 63c0 39 32 71 71 71c21 0 40 -10 53 -25c-4 -2 -9 -4 -14 -8
+c-10 11 -23 17 -39 17c-30 0 -55 -25 -55 -55c0 -23 15 -43 35 -51zM235 208c-34 0 -63 -28 -63 -62v-12s1 -10 1 -10c-5 0 -12 -1 -14 -1c-19 -3 -33 -18 -33 -37c0 -10 3 -19 10 -26s16 -11 26 -11h157c27 0 49 22 49 49s-22 50 -49 50c-2 0 -4 -1 -6 -1l-14 -2l-3 14
+c-3 14 -11 26 -22 35s-25 14 -39 14zM235 224v0c37 0 68 -26 76 -61h8c36 0 65 -29 65 -65s-29 -66 -65 -66h-157c-28 0 -52 24 -52 53c0 27 21 51 47 53v8c0 43 35 78 78 78z" />
+ <glyph glyph-name="ion-ios-partlysunny" unicode="&#xf476;" horiz-adv-x="384"
+d="M144 298v54h16v-54h-16zM0 192v16h55v-16h-55zM44 299l10 11l32 -32l-11 -11zM223 268l-11 11l32 32l11 -11zM56 96l-10 11l31 31l11 -11zM235 224v0c37 0 68 -26 76 -61h8c36 0 65 -29 65 -65s-29 -66 -65 -66h-157c-28 0 -52 24 -52 53c0 27 21 51 47 53v8
+c0 43 35 78 78 78zM201 252l1 -2v0c-31 -5 -62 -43 -62 -75c0 -2 1 -5 1 -7l-1 -1h-1c-11 -6 -18 -14 -22 -26v1v-1c-23 12 -39 36 -39 63c0 39 32 71 71 71c21 0 39 -9 52 -23z" />
+ <glyph glyph-name="ion-ios-pause-outline" unicode="&#xf477;" horiz-adv-x="256"
+d="M63 336h-47v-288h47v288zM79 352v0v-320h-79v320h79zM240 336h-47v-288h47v288zM256 352v0v-320h-79v320h79z" />
+ <glyph glyph-name="ion-ios-pause" unicode="&#xf478;" horiz-adv-x="256"
+d="M0 32v320h79v-320h-79zM177 32v320h79v-320h-79z" />
+ <glyph glyph-name="ion-ios-paw-outline" unicode="&#xf479;" horiz-adv-x="384"
+d="M380 252c6 -17 5 -38 -3 -57c-10 -25 -31 -43 -51 -43c-5 0 -10 1 -15 3c-22 10 -30 45 -17 79c10 28 31 46 51 46c5 0 10 -1 14 -3c10 -4 17 -13 21 -25zM362 202c6 15 7 31 2 44c-2 5 -5 12 -12 15c-2 1 -4 2 -7 2c-13 0 -28 -15 -36 -36c-9 -25 -6 -50 8 -56
+c2 -1 5 -1 8 -1c14 0 29 13 37 32zM90 234c13 -34 5 -69 -17 -79c-5 -2 -10 -3 -15 -3c-20 0 -41 18 -51 43c-8 19 -9 40 -3 57c4 12 11 21 21 25c4 2 9 3 14 3c20 0 41 -18 51 -46zM67 171c14 6 17 31 8 56c-8 21 -23 36 -36 36c-3 0 -5 -1 -7 -2c-7 -3 -10 -10 -12 -15
+c-5 -13 -4 -29 2 -44c8 -19 23 -32 37 -32c3 0 6 0 8 1zM134 237c-28 1 -52 32 -56 69c-2 23 4 45 16 60c8 10 19 17 31 18h6c27 -1 46 -29 50 -67c3 -24 -1 -48 -13 -63c-8 -9 -17 -15 -28 -16c-2 0 -4 -1 -6 -1zM107 356c-10 -12 -14 -29 -12 -48c3 -29 21 -53 40 -54h3
+c6 1 12 4 17 10c10 12 12 31 10 51c-3 29 -17 52 -35 53h-3c-9 -1 -16 -7 -20 -12zM192 208c64 0 128 -76 128 -149c0 -22 -11 -40 -22 -47c-13 -9 -23 -12 -42 -12c-23 0 -29 8 -40 15c-8 5 -14 10 -24 10s-16 -5 -24 -10c-11 -7 -17 -15 -40 -15c-19 0 -29 3 -42 12
+c-11 7 -22 25 -22 47c0 73 64 149 128 149zM290 27c6 4 14 16 14 32c0 30 -14 64 -36 91c-11 13 -23 24 -36 31c-13 8 -27 11 -40 11s-27 -3 -40 -11c-13 -7 -25 -18 -36 -31c-22 -27 -36 -61 -36 -91c0 -16 8 -28 14 -32c11 -7 18 -10 34 -10c14 0 19 4 26 9c2 1 4 3 6 4
+c9 6 18 12 32 12s23 -6 32 -12c2 -1 4 -3 6 -4c7 -5 12 -9 26 -9c16 0 23 3 34 10zM244 238c-11 1 -20 7 -28 16c-12 15 -16 39 -13 63c4 38 23 66 50 67h7c12 -1 22 -8 30 -18c12 -15 18 -37 16 -60c-4 -37 -28 -67 -56 -68h-6zM219 315c-2 -20 0 -39 10 -51
+c5 -6 11 -9 17 -10h3c19 1 38 25 41 54c2 19 -3 36 -13 48c-4 5 -10 11 -19 12h-4c-18 -1 -32 -24 -35 -53z" />
+ <glyph glyph-name="ion-ios-paw" unicode="&#xf47a;" horiz-adv-x="384"
+d="M380 252c6 -17 5 -38 -3 -57c-10 -25 -31 -43 -51 -43c-5 0 -10 1 -15 3c-22 10 -30 45 -17 79c10 28 31 46 51 46c5 0 10 -1 14 -3c10 -4 17 -13 21 -25zM90 234c13 -34 5 -69 -17 -79c-5 -2 -10 -3 -15 -3c-20 0 -41 18 -51 43c-8 19 -9 40 -3 57c4 12 11 21 21 25
+c4 2 9 3 14 3c20 0 41 -18 51 -46zM134 237c-28 1 -52 32 -56 69c-2 23 4 45 16 60c8 10 19 17 31 18h6c27 -1 46 -29 50 -67c3 -24 -1 -48 -13 -63c-8 -9 -17 -15 -28 -16c-2 0 -4 -1 -6 -1zM192 208c64 0 128 -76 128 -149c0 -22 -11 -40 -22 -47c-13 -9 -23 -12 -42 -12
+c-23 0 -29 8 -40 15c-8 5 -14 10 -24 10s-16 -5 -24 -10c-11 -7 -17 -15 -40 -15c-19 0 -29 3 -42 12c-11 7 -22 25 -22 47c0 73 64 149 128 149zM244 238c-11 1 -20 7 -28 16c-12 15 -16 39 -13 63c4 38 23 66 50 67h7c12 -1 22 -8 30 -18c12 -15 18 -37 16 -60
+c-4 -37 -28 -67 -56 -68h-6z" />
+ <glyph glyph-name="ion-ios-people-outline" unicode="&#xf47b;"
+d="M224 336v0v0zM317 113c11 -4 -11 4 0 0c28 -10 46 -35 46 -65h-28h-250c0 22 9 42 27 55c15 11 31 12 49 16c7 1 24 5 26 13s1 15 1 23c0 3 0 3 -2 5c-4 4 -6 9 -8 14c-2 8 -3 16 -4 24c-9 -2 -10 16 -12 21c-1 4 -7 24 3 21c-3 5 -4 13 -5 19c-2 13 -2 26 3 39
+c10 26 37 39 64 38c26 -1 51 -16 59 -42c4 -12 3 -26 1 -39c-1 -5 -2 -11 -4 -15c10 3 4 -20 3 -23c-2 -5 -3 -21 -12 -19c-1 -10 -2 -22 -7 -31c-1 -2 -7 -8 -7 -10v-11c0 -5 0 -10 2 -15s10 -7 14 -8c14 -5 27 -5 41 -10zM115 84c-6 -6 9 10 0 0c-6 -6 -10 -12 -12 -20h4
+h238c-4 15 -17 27 -30 33s-28 4 -41 9s-25 9 -28 25c-2 11 -2 22 -2 33c0 2 7 7 8 9c3 5 4 11 5 17c1 5 0 12 4 15c5 4 7 7 9 13c2 8 3 12 -1 19c-3 5 0 8 1 13c3 11 4 24 2 36c-8 37 -62 45 -86 19c-12 -13 -12 -31 -9 -47c1 -6 6 -14 3 -19c-1 -3 -5 -6 -4 -10
+c2 -5 2 -11 4 -16c2 -4 4 -6 7 -8s3 -6 3 -9c1 -7 2 -17 6 -23c3 -4 8 -6 8 -11v-21c-1 -8 -2 -18 -8 -24c-7 -6 -18 -10 -27 -12c-11 -3 -23 -3 -33 -7c-8 -3 -15 -8 -21 -14zM112 126c-15 -7 9 4 0 0c-9 -5 -18 -11 -25 -19c-1 -2 -6 -11 -7 -11h-25h-55c0 20 13 34 31 40
+c6 2 27 4 30 11c2 5 0 11 0 16c-10 -1 -24 1 -32 7c-2 2 3 9 4 12l3 12c1 9 1 19 1 28c0 16 -1 34 8 48c8 13 23 18 38 18c24 0 43 -13 47 -37c3 -16 1 -32 2 -48c0 -8 2 -16 5 -24c1 -2 5 -7 3 -9l-6 -3c-5 -2 -11 -3 -17 -4c-1 0 -8 0 -9 -1s0 -9 0 -11c0 -4 1 -6 5 -7
+c6 -2 19 -3 23 -8c2 -3 1 -5 -2 -5c-8 -1 -15 -1 -22 -5zM71 112c6 10 16 18 26 24c-9 9 -5 26 -4 37c0 2 0 5 2 5h8c6 0 11 1 17 2c-7 23 0 47 -5 70c-3 16 -15 23 -31 23c-17 0 -27 -9 -30 -25c-4 -22 3 -46 -4 -68c9 -1 17 -2 26 -2c1 0 1 -28 1 -29
+c-1 -12 -8 -18 -19 -22c-12 -4 -29 -3 -36 -15h49zM368 96c-2 8 -10 14 -16 19c-8 6 -18 13 -28 15c-3 1 -16 -1 -13 5c2 4 9 5 13 6s15 2 16 7c0 1 1 14 0 14c-6 0 -12 1 -18 2c-4 1 -7 2 -11 4c-6 3 -2 6 0 11c14 32 -10 88 32 105c15 6 34 5 48 -3c15 -9 20 -27 20 -44
+c0 -20 -4 -44 7 -62c2 -3 4 -4 0 -6c-2 -1 -4 -1 -6 -2l-12 -3s-9 -1 -13 -1c0 -4 -2 -13 1 -17c6 -7 21 -7 29 -10c18 -6 31 -20 31 -40h-80zM367 123c4 -4 -5 5 0 0s8 -11 15 -11h16h28c-7 12 -26 11 -38 16c-11 4 -16 12 -17 24c0 2 -1 27 1 27c9 0 18 0 26 1
+c-7 23 1 47 -4 70c-3 15 -15 23 -30 23c-17 0 -28 -8 -31 -25c-4 -23 2 -46 -5 -68c6 -2 12 -2 18 -2s8 1 9 -5c1 -11 5 -28 -4 -37c6 -4 11 -8 16 -13z" />
+ <glyph glyph-name="ion-ios-people" unicode="&#xf47c;"
+d="M317 113c11 -4 -11 4 0 0v0zM317 113c28 -10 46 -35 46 -65h-28h-250c0 22 9 42 27 55c15 11 31 12 49 16c7 1 24 5 26 13s1 15 1 23c0 3 0 3 -2 5c-4 4 -6 9 -8 14c-2 8 -3 16 -4 24c-9 -2 -10 16 -12 21c-1 4 -7 24 3 21c-3 5 -4 13 -5 19c-2 13 -2 26 3 39
+c10 26 37 39 64 38c26 -1 51 -16 59 -42c4 -12 3 -26 1 -39c-1 -5 -2 -11 -4 -15c10 3 4 -20 3 -23c-2 -5 -3 -21 -12 -19c-1 -10 -2 -22 -7 -31c-1 -2 -7 -8 -7 -10v-11c0 -5 0 -10 2 -15s10 -7 14 -8c14 -5 27 -5 41 -10zM111 126h2h-1h-1zM111 126c-9 -5 -17 -11 -24 -19
+c-1 -2 -6 -11 -7 -11h-25h-55c0 20 12 34 30 40c6 2 27 4 30 11c2 5 1 11 1 16c-10 -1 -24 1 -32 7c-2 2 3 9 4 12c1 4 2 7 3 11c1 9 1 19 1 28c0 16 -1 35 8 49c8 13 23 18 38 18c24 0 43 -13 47 -37c3 -16 1 -32 2 -48c0 -8 2 -16 5 -24c1 -2 5 -7 3 -9l-6 -3
+c-5 -2 -11 -3 -17 -4c-1 0 -8 0 -9 -1s0 -9 0 -11c0 -4 1 -6 5 -7c6 -2 19 -3 23 -8c2 -3 1 -5 -2 -5c-7 -1 -14 -2 -21 -5c2 1 2 2 -1 0c-8 -4 -4 -2 -1 0zM417 136c18 -6 31 -20 31 -40h-80c-2 8 -10 14 -16 19c-8 6 -18 13 -28 15c-3 1 -16 -1 -13 5c2 4 9 5 13 6
+s15 2 16 7c0 1 1 14 0 14c-6 0 -12 1 -18 2c-4 1 -7 2 -11 4c-6 3 -2 6 0 11c14 32 -10 88 32 105c15 6 34 5 48 -3c15 -9 20 -27 20 -44c0 -20 -4 -44 7 -62c2 -3 4 -4 0 -6c-2 -1 -4 -1 -6 -2l-12 -3s-9 -1 -13 -1c0 -4 -2 -13 1 -17c6 -7 21 -7 29 -10z" />
+ <glyph glyph-name="ion-ios-person-outline" unicode="&#xf47d;" horiz-adv-x="320"
+d="M106 246v0v0zM267 84c13 -5 53 -20 53 -52h-160h-160c0 32 40 47 53 52s31 6 43 9c7 2 17 5 20 9s1 41 1 41s-6 10 -9 18s-7 32 -7 32s-7 0 -9 12c-2 13 -6 17 -6 27c0 9 5 10 5 10v0s-4 13 -5 42c-1 34 25 68 74 68s75 -34 74 -68c-1 -29 -5 -42 -5 -42v0s5 -1 5 -10
+c0 -10 -3 -15 -6 -28c-2 -12 -9 -12 -9 -12s-4 -23 -7 -31s-9 -18 -9 -18s-2 -37 1 -41s13 -7 20 -9c12 -3 30 -4 43 -9zM160 48v0h137c-2 3 -4 6 -8 8c-7 5 -16 9 -27 13c-7 2 -17 4 -26 5c-6 1 -10 2 -15 3c-3 1 -21 5 -29 15c-4 5 -6 12 -6 32c0 10 1 20 1 20v4l2 4
+c1 2 6 9 8 15c2 5 5 19 6 28c0 0 0 -1 1 4s8 4 9 8s3 7 5 18s-5 12 -5 17c0 4 1 5 1 5v0c0 1 4 14 4 38c0 13 -5 26 -14 35c-11 11 -25 16 -44 16c-18 0 -34 -5 -45 -16c-9 -9 -13 -22 -13 -35c1 -24 4 -37 4 -38v0s1 -3 0 -6c-1 -5 -6 -5 -4 -16s4 -14 5 -18s8 -3 9 -8
+s1 -4 1 -4c1 -9 4 -23 6 -28c2 -6 6 -13 8 -15l2 -4v-4s1 -10 1 -20c0 -20 -2 -27 -6 -32c-8 -10 -26 -14 -29 -15c-5 -1 -10 -2 -16 -3c-9 -1 -18 -3 -25 -5c-11 -4 -20 -8 -27 -13c-4 -2 -6 -5 -8 -8h137z" />
+ <glyph glyph-name="ion-ios-person" unicode="&#xf47e;" horiz-adv-x="320"
+d="M267 84c13 -5 53 -20 53 -52h-160h-160c0 32 40 47 53 52s31 6 43 9c7 2 17 5 20 9s1 41 1 41s-6 10 -9 18s-7 32 -7 32s-7 0 -9 12c-2 13 -6 17 -6 27c0 9 5 10 5 10v0s-4 13 -5 42c-1 34 25 68 74 68s75 -34 74 -68c-1 -29 -5 -42 -5 -42v0s5 -1 5 -10
+c0 -10 -3 -15 -6 -28c-2 -12 -9 -12 -9 -12s-4 -23 -7 -31s-9 -18 -9 -18s-2 -37 1 -41s13 -7 20 -9c12 -3 30 -4 43 -9z" />
+ <glyph glyph-name="ion-ios-personadd-outline" unicode="&#xf47f;" horiz-adv-x="320"
+d="M320 295v-14h-25v-25h-14v25h-25v14h25v25h14v-25h25zM106 246v0v0zM267 84c13 -5 53 -20 53 -52h-160h-160c0 32 40 47 53 52s31 6 43 9c7 2 17 5 20 9s1 41 1 41s-6 10 -9 18s-7 32 -7 32s-7 0 -9 12c-2 13 -6 17 -6 27c0 9 5 10 5 10v0s-4 13 -5 42c-1 34 25 68 74 68
+s75 -34 74 -68c-1 -29 -5 -42 -5 -42v0s5 -1 5 -10c0 -10 -3 -15 -6 -28c-2 -12 -9 -12 -9 -12s-4 -23 -7 -31s-9 -18 -9 -18s-2 -37 1 -41s13 -7 20 -9c12 -3 30 -4 43 -9zM160 48v0h137c-2 3 -4 6 -8 8c-7 5 -16 9 -27 13c-7 2 -17 4 -26 5c-6 1 -10 2 -15 3
+c-3 1 -21 5 -29 15c-4 5 -6 12 -6 32c0 10 1 20 1 20v4l2 4c1 2 6 9 8 15c2 5 5 19 6 28c0 0 0 -1 1 4s8 4 9 8s3 7 5 18s-5 12 -5 17c0 4 1 5 1 5v0c0 1 4 14 4 38c0 13 -5 26 -14 35c-11 11 -25 16 -44 16c-18 0 -34 -5 -45 -16c-9 -9 -13 -22 -13 -35c1 -24 4 -37 4 -38
+v0s1 -3 0 -6c-1 -5 -6 -5 -4 -16s4 -14 5 -18s8 -3 9 -8s1 -4 1 -4c1 -9 4 -23 6 -28c2 -6 6 -13 8 -15l2 -4v-4s1 -10 1 -20c0 -20 -2 -27 -6 -32c-8 -10 -26 -14 -29 -15c-5 -1 -10 -2 -16 -3c-9 -1 -18 -3 -25 -5c-11 -4 -20 -8 -27 -13c-4 -2 -6 -5 -8 -8h137z" />
+ <glyph glyph-name="ion-ios-personadd" unicode="&#xf480;" horiz-adv-x="320"
+d="M320 295v-14h-25v-25h-14v25h-25v14h25v25h14v-25h25zM267 84c13 -5 53 -20 53 -52h-160h-160c0 32 40 47 53 52s31 6 43 9c7 2 17 5 20 9s1 41 1 41s-6 10 -9 18s-7 32 -7 32s-7 0 -9 12c-2 13 -6 17 -6 27c0 9 5 10 5 10v0s-4 13 -5 42c-1 34 25 68 74 68
+s75 -34 74 -68c-1 -29 -5 -42 -5 -42v0s5 -1 5 -10c0 -10 -3 -15 -6 -28c-2 -12 -9 -12 -9 -12s-4 -23 -7 -31s-9 -18 -9 -18s-2 -37 1 -41s13 -7 20 -9c12 -3 30 -4 43 -9z" />
+ <glyph glyph-name="ion-ios-photos-outline" unicode="&#xf481;"
+d="M64 320h384v-320h-384v320zM432 16v288h-352v-288h352zM0 384h384v-48h-16v32h-352v-288h32v-16h-48v320z" />
+ <glyph glyph-name="ion-ios-photos" unicode="&#xf482;"
+d="M64 320h384v-320h-384v320zM384 384v-48h-336v-272h-48v320h384z" />
+ <glyph glyph-name="ion-ios-pie-outline" unicode="&#xf483;"
+d="M256 367v0v-207v-12l-12 -4l-180 -45c6 -13 13 -25 21 -36c12 -16 25 -30 41 -42c33 -24 73 -37 114 -37c26 0 51 5 75 15c23 10 43 23 61 41s31 38 41 61c10 24 15 49 15 75c0 51 -20 100 -56 136c-32 32 -75 51 -120 55zM240 384v0c115 0 208 -93 208 -208
+s-93 -208 -208 -208c-92 0 -171 60 -198 143l198 49v224zM208 400c-31 -1 -60 -7 -85 -18c-24 -11 -44 -26 -61 -46c-29 -34 -46 -80 -46 -127v0v0c0 -13 3 -46 12 -70l180 46v215zM224 416v0v-244l-205 -52c-19 32 -19 89 -19 89c0 91 58 207 218 207h6z" />
+ <glyph glyph-name="ion-ios-pie" unicode="&#xf484;"
+d="M240 384v0c115 0 208 -93 208 -208s-93 -208 -208 -208c-92 0 -171 60 -198 143l198 49v224zM224 416v0v-244l-205 -52c-19 32 -19 89 -19 89c0 91 58 207 218 207h6z" />
+ <glyph glyph-name="ion-ios-pint-outline" unicode="&#xf485;" horiz-adv-x="224"
+d="M224 278c0 -98 -32 -101 -32 -181c0 -40 16 -71 16 -99c0 -27 -9 -30 -32 -30h-128c-23 0 -32 2 -32 29c0 28 16 60 16 100c0 80 -32 83 -32 181c0 21 1 89 19 125c4 9 13 13 32 13h122c19 0 28 -4 32 -13c18 -36 19 -104 19 -125zM34 396c-8 -16 -14 -43 -17 -76h190
+c-3 33 -9 60 -17 76c-1 2 -1 1 -2 2c-2 1 -6 2 -15 2h-122c-9 0 -13 -1 -15 -2c-1 -1 -1 0 -2 -2zM191 -15c0 1 1 5 1 13c0 11 -4 23 -7 37c-4 18 -9 39 -9 62c0 41 8 64 16 86c8 23 16 46 16 95c0 9 -1 18 -1 26h-190c0 -8 -1 -17 -1 -26c0 -49 8 -72 16 -95
+c8 -22 16 -45 16 -86c0 -23 -5 -44 -9 -62c-3 -14 -7 -26 -7 -37c0 -8 1 -12 1 -13c2 -1 7 -1 15 -1h128c8 0 13 0 15 1z" />
+ <glyph glyph-name="ion-ios-pint" unicode="&#xf486;" horiz-adv-x="224"
+d="M224 278c0 -98 -32 -101 -32 -181c0 -40 16 -71 16 -99c0 -27 -9 -30 -32 -30h-128c-23 0 -32 2 -32 29c0 28 16 60 16 100c0 80 -32 83 -32 181c0 21 1 89 19 125c4 9 13 13 32 13h122c19 0 28 -4 32 -13c18 -36 19 -104 19 -125zM34 396c-8 -16 -14 -43 -17 -76h190
+c-3 33 -9 60 -17 76c-1 2 -1 1 -2 2c-2 1 -6 2 -15 2h-122c-9 0 -13 -1 -15 -2c-1 -1 -1 0 -2 -2z" />
+ <glyph glyph-name="ion-ios-play-outline" unicode="&#xf487;" horiz-adv-x="256"
+d="M16 323v-262l210 131zM0 352v0l256 -160l-256 -160v320z" />
+ <glyph glyph-name="ion-ios-play" unicode="&#xf488;" horiz-adv-x="256"
+d="M0 352v0l256 -160l-256 -160v320z" />
+ <glyph glyph-name="ion-ios-plus-empty" unicode="&#xf489;" horiz-adv-x="256"
+d="M256 183h-120v-119h-17v119h-119v17h119v120h17v-120h120v-17z" />
+ <glyph glyph-name="ion-ios-plus-outline" unicode="&#xf48a;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191zM216 320v-120h120v-17h-120v-119h-17v119h-119v17h119v120h17z" />
+ <glyph glyph-name="ion-ios-plus" unicode="&#xf48b;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM336 183v17h-120v120h-17v-120h-119v-17h119v-119h17v119h120z" />
+ <glyph glyph-name="ion-ios-pricetag-outline" unicode="&#xf48c;" horiz-adv-x="416"
+d="M416 416v-160l-256 -288l-160 160l256 288h160zM400 264v136h-136l-240 -272l136 -136zM320 288c-18 0 -32 14 -32 32s14 32 32 32s32 -14 32 -32s-14 -32 -32 -32zM320 336c-9 0 -16 -7 -16 -16s7 -16 16 -16s16 7 16 16s-7 16 -16 16z" />
+ <glyph glyph-name="ion-ios-pricetag" unicode="&#xf48d;" horiz-adv-x="416"
+d="M304 320c0 11 5 16 16 16s16 -5 16 -16s-5 -16 -16 -16s-16 5 -16 16zM256 416h160v-160l-256 -288l-160 160zM320 288c9 0 16 4 22 10s10 13 10 22s-4 16 -10 22s-13 10 -22 10s-16 -4 -22 -10s-10 -13 -10 -22s4 -16 10 -22s13 -10 22 -10z" />
+ <glyph glyph-name="ion-ios-pricetags-outline" unicode="&#xf48e;"
+d="M416 384h32v-144l-240 -272l-25 24l-23 -24l-160 160l256 288h160v-32zM160 -9l12 12l11 12l217 248v105v16v16h-137l-241 -272zM432 247v121h-16v-112l-221 -253l13 -12zM320 288c-18 0 -32 14 -32 32s14 32 32 32s32 -14 32 -32s-14 -32 -32 -32zM320 336
+c-9 0 -16 -7 -16 -16s7 -16 16 -16s16 7 16 16s-7 16 -16 16z" />
+ <glyph glyph-name="ion-ios-pricetags" unicode="&#xf48f;"
+d="M432 384h16v-144l-240 -272l-13 13l237 266v137zM256 416h160v-32v-16v-112l-221 -253l-12 -11l-23 -24l-160 160zM320 288c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM304 320c0 11 5 16 16 16s16 -5 16 -16s-5 -16 -16 -16s-16 5 -16 16z" />
+ <glyph glyph-name="ion-ios-printer-outline" unicode="&#xf490;" horiz-adv-x="416"
+d="M384 336c18 0 32 -13 32 -31v-159c0 -18 -14 -32 -32 -32h-48v-114h-256v114h-48c-18 0 -32 14 -32 32v159c0 18 14 31 32 31h32v48h288v-48h32zM80 368v-32h256v32h-256zM320 16v192h-224v-192h224zM400 146v159c0 9 -7 15 -16 15v0h-352c-9 0 -16 -6 -16 -15v-159
+c0 -9 7 -16 16 -16h48v94h256v-94h48c9 0 16 7 16 16z" />
+ <glyph glyph-name="ion-ios-printer" unicode="&#xf491;" horiz-adv-x="416"
+d="M80 0v224h256v-224h-256zM80 -0v224h256v-224h-256zM64 352v32h288v-32h-288zM385 336c18 0 31 -14 31 -31v-158c0 -17 -13 -34 -31 -34h-33v126h-288v-126h-31c-18 0 -33 17 -33 34v158c0 17 15 31 33 31h352z" />
+ <glyph glyph-name="ion-ios-pulse-strong" unicode="&#xf492;" horiz-adv-x="480"
+d="M432 175c27 0 48 -20 48 -47s-21 -49 -48 -49c-21 0 -38 13 -45 31h-51c-7 0 -13 4 -15 11l-16 47l-50 -173c-2 -7 -8 -11 -15 -11h-1c-7 0 -14 5 -15 12l-51 308l-45 -182c-2 -7 -9 -12 -16 -12h-112v32h99l61 245c2 7 8 13 16 13s15 -7 16 -14l52 -314l45 155
+c2 7 8 11 15 11v0c7 0 13 -4 15 -11l29 -85h38c6 19 25 33 46 33z" />
+ <glyph glyph-name="ion-ios-pulse" unicode="&#xf493;"
+d="M416 160c18 0 32 -14 32 -32s-14 -32 -32 -32c-15 0 -27 10 -31 23h-65c-3 0 -7 2 -8 5l-23 72l-57 -198c-1 -3 -4 -6 -8 -6v0c-4 0 -7 3 -8 7l-58 346l-54 -220c-1 -4 -4 -6 -8 -6h-96v16h90l62 251c1 4 4 6 8 6s7 -3 8 -7l58 -349l54 190c1 3 4 5 8 5s7 -2 8 -5l30 -91
+h59c3 14 16 25 31 25z" />
+ <glyph glyph-name="ion-ios-rainy-outline" unicode="&#xf494;" horiz-adv-x="288"
+d="M220 269c38 0 68 -33 68 -71c0 -29 -19 -56 -45 -66l-55 -80c-2 -2 -5 -4 -8 -4c-5 0 -8 3 -8 8c0 2 1 4 2 6l46 66v0h-35l-31 -44c-2 -2 -4 -4 -7 -4c-5 0 -9 3 -9 8c0 2 1 3 2 5l25 35h-37l-53 -76c-2 -2 -4 -4 -7 -4c-5 0 -9 3 -9 8c0 2 2 4 3 6l46 66h-36l-32 -44
+c-2 -2 -4 -4 -7 -4c-5 0 -8 3 -8 8c0 2 1 4 2 6l25 34c-29 2 -52 27 -52 56c0 28 22 58 50 60c0 3 -1 5 -1 8c0 46 31 84 82 84c45 0 73 -31 81 -68c3 0 5 1 8 1zM220 146c28 0 52 24 52 52s-24 54 -52 54h-6l-15 -2l-3 15c-3 14 -11 31 -23 40c-12 10 -26 14 -41 14
+c-36 0 -66 -31 -66 -67v-12v-10c-6 0 -12 -2 -14 -2c-20 -3 -35 -23 -35 -43c0 -10 4 -20 11 -27s16 -12 26 -12h124v0v0h42z" />
+ <glyph glyph-name="ion-ios-rainy" unicode="&#xf495;" horiz-adv-x="288"
+d="M220 269c38 0 68 -33 68 -71c0 -29 -19 -56 -45 -66l-55 -80c-2 -2 -5 -4 -8 -4c-5 0 -8 3 -8 8c0 2 1 4 2 6l46 66v0h-35l-31 -44c-2 -2 -4 -4 -7 -4c-5 0 -9 3 -9 8c0 2 1 3 2 5l25 35h-37l-53 -76c-2 -2 -4 -4 -7 -4c-5 0 -9 3 -9 8c0 2 2 4 3 6l46 66h-36l-32 -44
+c-2 -2 -4 -4 -7 -4c-5 0 -8 3 -8 8c0 2 1 4 2 6l25 34c-29 2 -52 27 -52 56c0 28 22 58 50 60c0 3 -1 5 -1 8c0 46 31 84 82 84c45 0 73 -31 81 -68c3 0 5 1 8 1z" />
+ <glyph glyph-name="ion-ios-recording-outline" unicode="&#xf496;" horiz-adv-x="480"
+d="M370 304c61 0 110 -50 110 -112s-49 -112 -110 -112h-260c-61 0 -110 50 -110 112s49 112 110 112s110 -50 110 -112c0 -40 -21 -75 -53 -95h146c-32 20 -53 55 -53 95c0 62 49 112 110 112zM16 192c0 -53 42 -95 94 -95s93 42 93 95s-41 95 -93 95s-94 -42 -94 -95z
+M370 97c52 0 94 42 94 95s-42 95 -94 95s-93 -42 -93 -95s41 -95 93 -95zM368 240c-26 0 -48 -22 -48 -48s22 -48 48 -48s48 22 48 48s-22 48 -48 48zM368 256v0c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM112 240c-26 0 -48 -22 -48 -48
+s22 -48 48 -48s48 22 48 48s-22 48 -48 48zM112 256v0c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64z" />
+ <glyph glyph-name="ion-ios-recording" unicode="&#xf497;" horiz-adv-x="480"
+d="M370 304c61 0 110 -50 110 -112s-49 -112 -110 -112h-260c-61 0 -110 50 -110 112s49 112 110 112s110 -50 110 -112c0 -40 -21 -76 -53 -95h146c-32 19 -53 55 -53 95c0 62 49 112 110 112zM112 128c35 0 64 29 64 64s-29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64z
+M368 128c35 0 64 29 64 64s-29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64zM368 240c26 0 48 -22 48 -48s-22 -48 -48 -48s-48 22 -48 48s22 48 48 48zM112 240c26 0 48 -22 48 -48s-22 -48 -48 -48s-48 22 -48 48s22 48 48 48z" />
+ <glyph glyph-name="ion-ios-redo-outline" unicode="&#xf498;" horiz-adv-x="384"
+d="M0 48v32c0 17 -3 83 49 136c35 36 80 53 143 56v80l192 -128l-192 -128v80c-40 -1 -63 -9 -87 -20c-31 -14 -55 -44 -75 -77l-20 -31h-10zM208 256c-201 0 -192 -169 -192 -169c48 81 101 105 192 105v-65l148 97l-148 97v-65z" />
+ <glyph glyph-name="ion-ios-redo" unicode="&#xf499;" horiz-adv-x="384"
+d="M0 48v32c0 17 -3 83 49 136c35 36 80 53 143 56v80l192 -128l-192 -128v80c-40 -1 -63 -9 -87 -20c-31 -14 -55 -44 -75 -77l-20 -31h-10z" />
+ <glyph glyph-name="ion-ios-refresh-empty" unicode="&#xf49a;" horiz-adv-x="256"
+d="M128 64c-71 0 -128 57 -128 128s57 128 128 128v44l96 -64l-96 -56v56c-60 0 -108 -48 -108 -108s48 -108 108 -108s108 48 108 108h20c0 -71 -57 -128 -128 -128z" />
+ <glyph glyph-name="ion-ios-refresh-outline" unicode="&#xf49b;" horiz-adv-x="416"
+d="M316 192v0h20c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128v44l96 -64l-96 -56v56c-60 0 -108 -48 -108 -108s48 -108 108 -108s108 48 108 108zM208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1
+c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191z" />
+ <glyph glyph-name="ion-ios-refresh" unicode="&#xf49c;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 64c71 0 128 57 128 128h-20c0 -60 -48 -108 -108 -108s-108 48 -108 108s48 108 108 108v-56l96 56l-96 64v-44c-71 0 -128 -57 -128 -128s57 -128 128 -128z" />
+ <glyph glyph-name="ion-ios-reload" unicode="&#xf49d;"
+d="M192 384c106 0 192 -86 192 -192l55 53l9 -9l-70 -68l-67 68l9 9l51 -52c0 98 -80 178 -179 178s-179 -80 -179 -179s80 -179 179 -179c79 0 146 50 170 121l12 -3c-26 -76 -97 -131 -182 -131c-106 0 -192 86 -192 192s86 192 192 192z" />
+ <glyph glyph-name="ion-ios-reverse-camera-outline" unicode="&#xf49e;" horiz-adv-x="384"
+d="M238 129l2 2l11 -12l-2 -2c-16 -14 -36 -21 -57 -21c-45 0 -82 36 -87 78h-30l38 50l39 -50h-31c5 -33 35 -62 71 -62c17 0 33 6 46 17zM252 249c16 -14 25 -37 27 -57h30l-38 -51l-39 51h31c-5 35 -35 64 -71 64c-17 0 -33 -6 -46 -17l-2 -2l-11 12l2 2
+c16 14 36 21 57 21c22 0 44 -8 60 -23zM354 288c18 0 30 -14 30 -31v-176c0 -17 -12 -33 -30 -33h-320c-18 0 -34 16 -34 33v176c0 17 16 31 34 31h13v16h34v-16h13c32 36 43 48 55 48h88c12 0 23 -12 55 -48h62zM368 81v176c0 9 -5 15 -14 15h-62h-6s-4 1 -6 3s-6 8 -9 11
+c-12 13 -21 24 -27 30c-5 5 -7 4 -7 4h-88s-1 0 -6 -4c-6 -5 -15 -14 -26 -27c-3 -4 -8 -11 -11 -14s-4 -3 -6 -3h-6h-60c-9 0 -18 -7 -18 -15v-176c0 -9 9 -17 18 -17h320c8 0 14 8 14 17z" />
+ <glyph glyph-name="ion-ios-reverse-camera" unicode="&#xf49f;" horiz-adv-x="384"
+d="M354 288c18 0 30 -14 30 -31v-176c0 -17 -12 -33 -30 -33h-320c-18 0 -34 16 -34 33v176c0 17 16 31 34 31h13v16h34v-16h13c32 36 43 48 55 48h88c12 0 23 -12 55 -48h62zM249 117l2 2l-11 12l-2 -2c-13 -11 -29 -17 -46 -17c-36 0 -66 29 -71 62h31l-39 50l-38 -50h30
+c5 -42 42 -78 87 -78c21 0 41 7 57 21zM271 141l38 51h-30c-2 20 -11 43 -27 57c-16 15 -38 23 -60 23c-21 0 -41 -7 -57 -21l-2 -2l11 -12l2 2c13 11 29 17 46 17c36 0 66 -29 71 -64h-31z" />
+ <glyph glyph-name="ion-ios-rewind-outline" unicode="&#xf4a0;"
+d="M432 293l-184 -101l184 -101v202zM208 292v0l-176 -100l176 -100v95v27v78zM224 320v0v-123l224 123v-256l-224 123v-123l-224 128z" />
+ <glyph glyph-name="ion-ios-rewind" unicode="&#xf4a1;"
+d="M224 320v0v-123l224 123v-256l-224 123v-123l-224 128z" />
+ <glyph glyph-name="ion-ios-rose-outline" unicode="&#xf4a2;" horiz-adv-x="320"
+d="M284 295c-4 -1 -9 -3 -13 -4c-37 -11 -71 -24 -103 -39c-17 -8 -24 -12 -44 -24l-7 -4c-31 -18 -50 -33 -63 -51c-15 -21 -22 -45 -22 -77c0 -16 3 -30 9 -44c6 -13 14 -26 25 -36c23 -21 55 -32 94 -32s71 11 94 32c11 10 19 23 25 36c6 14 9 28 9 44c0 20 -5 40 -11 60
+c-11 40 -23 83 7 139zM320 320v0c-77 -96 -16 -151 -16 -224s-56 -128 -144 -128s-144 55 -144 128s35 109 93 142c25 14 33 19 52 28c30 14 65 28 105 40c17 5 35 10 54 14zM38 325c14 -28 18 -57 19 -83c9 7 20 13 30 20c7 4 14 9 21 13c5 3 10 6 16 9c-5 4 -11 7 -17 11
+c-22 13 -48 23 -69 30zM0 352v0s66 -15 115 -43c15 -8 28 -18 37 -29c-12 -6 -24 -12 -36 -19c-7 -4 -14 -8 -20 -12c-25 -16 -44 -31 -57 -42c5 41 2 98 -39 145zM249 367c-8 -1 -20 -2 -35 -7c-25 -8 -47 -20 -64 -36c8 -6 15 -12 21 -18c29 12 65 26 95 34
+c-5 10 -12 20 -17 27zM256 384v0s26 -32 32 -55c-33 -8 -84 -25 -121 -42l-3 3c-9 11 -22 22 -39 32c52 60 131 62 131 62zM85 394c-6 -10 -10 -20 -14 -28c12 -4 22 -10 36 -17c4 5 9 10 14 14c-13 15 -27 25 -36 31zM80 416v0s35 -16 64 -56c-12 -9 -23 -20 -33 -31
+c-26 13 -40 21 -61 27c5 15 15 38 30 60z" />
+ <glyph glyph-name="ion-ios-rose" unicode="&#xf4a3;" horiz-adv-x="320"
+d="M320 320v0c-77 -96 -16 -151 -16 -224s-56 -128 -144 -128s-144 55 -144 128s35 109 93 142c25 14 33 19 52 28c30 14 65 28 105 40c17 5 35 10 54 14zM0 352v0s66 -15 115 -43c15 -8 28 -18 37 -29c-12 -6 -24 -12 -36 -19c-7 -4 -14 -8 -20 -12
+c-25 -16 -44 -31 -57 -42c5 41 2 98 -39 145zM256 384v0s26 -32 32 -55c-33 -8 -84 -25 -121 -42l-3 3c-9 11 -22 22 -39 32c52 60 131 62 131 62zM80 416v0s35 -16 64 -56c-12 -9 -23 -20 -33 -31c-26 13 -40 21 -61 27c5 15 15 38 30 60z" />
+ <glyph glyph-name="ion-ios-search-strong" unicode="&#xf4a4;" horiz-adv-x="384"
+d="M280 150l-4 -7l108 -109l-34 -34l-108 109l-7 -5c-24 -15 -53 -25 -83 -25c-84 0 -152 69 -152 153s68 152 152 152s152 -68 152 -152c0 -30 -9 -58 -24 -82zM237 317c-23 23 -53 35 -85 35s-62 -12 -85 -35s-35 -53 -35 -85s12 -62 35 -85s53 -35 85 -35s62 12 85 35
+s36 53 36 85s-13 62 -36 85z" />
+ <glyph glyph-name="ion-ios-search" unicode="&#xf4a5;" horiz-adv-x="384"
+d="M384 23l-23 -23l-113 113c-26 -21 -60 -33 -96 -33c-84 0 -152 68 -152 152s68 152 152 152s152 -68 152 -152c0 -36 -12 -69 -33 -95zM56 135c26 -26 60 -39 96 -39s70 14 96 40s40 60 40 96s-14 70 -40 96s-60 40 -96 40s-70 -14 -96 -40s-40 -60 -40 -96
+s14 -71 40 -97z" />
+ <glyph glyph-name="ion-ios-settings-strong" unicode="&#xf4a6;"
+d="M0 72h283c6 14 21 24 37 24s31 -10 37 -24h91v-32h-91c-6 -14 -21 -24 -37 -24s-31 10 -37 24h-283zM0 208h91c6 14 21 24 37 24s31 -10 37 -24h283v-32h-283c-6 -14 -21 -24 -37 -24s-31 10 -37 24h-91zM0 344h283c6 14 21 24 37 24s31 -10 37 -24h91v-32h-91
+c-6 -14 -21 -24 -37 -24s-31 10 -37 24h-283z" />
+ <glyph glyph-name="ion-ios-settings" unicode="&#xf4a7;"
+d="M320 344c-9 0 -16 -7 -16 -16s7 -16 16 -16s16 7 16 16s-7 16 -16 16zM320 360v0c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32zM320 72c-9 0 -16 -7 -16 -16s7 -16 16 -16s16 7 16 16s-7 16 -16 16zM320 88v0c18 0 32 -14 32 -32s-14 -32 -32 -32
+s-32 14 -32 32s14 32 32 32zM128 208c-9 0 -16 -7 -16 -16s7 -16 16 -16s16 7 16 16s-7 16 -16 16zM128 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32zM175 200h273v-16h-273c0 3 1 5 1 8s-1 5 -1 8zM80 192c0 -3 1 -5 1 -8h-81v16h81
+c0 -3 -1 -5 -1 -8zM367 64h81v-16h-81c0 3 1 5 1 8s-1 5 -1 8zM272 56c0 -3 1 -5 1 -8h-273v16h273c0 -3 -1 -5 -1 -8zM367 336h81v-16h-81c0 3 1 5 1 8s-1 5 -1 8zM273 336c0 -3 -1 -5 -1 -8s1 -5 1 -8h-273v16h273z" />
+ <glyph glyph-name="ion-ios-shuffle-strong" unicode="&#xf4a8;" horiz-adv-x="384"
+d="M301 296c-85 0 -119 -64 -152 -126c-1 -3 -3 -5 -4 -8l-1 -1c-2 -3 -2 -5 -4 -8c-21 -38 -43 -68 -68 -83c-15 -9 -34 -18 -72 -18v32c45 0 76 18 112 84c2 3 2 6 4 9h1c1 2 3 4 4 7c34 64 76 144 180 144h15l-52 43l21 25l99 -84l-99 -82l-21 24l51 42h-14zM285 154
+l99 -82l-99 -84l-21 25l52 43h-15c-78 0 -122 45 -153 95l18 33c29 -51 64 -96 135 -96h14l-51 42zM112 216c-36 66 -67 84 -112 84v32c38 0 57 -9 72 -18c25 -15 47 -44 67 -81c-7 -11 -13 -22 -19 -33c-1 2 -2 5 -3 7h-1c-2 3 -2 6 -4 9z" />
+ <glyph glyph-name="ion-ios-shuffle" unicode="&#xf4a9;" horiz-adv-x="384"
+d="M298 241l-10 12l62 51h-46c-93 0 -129 -75 -164 -139c-2 -3 -3 -6 -5 -9c-20 -37 -41 -61 -65 -75c-14 -8 -33 -17 -70 -17v16c48 0 83 14 121 84c2 3 3 6 5 9c35 65 75 147 178 147h46l-62 52l10 12l86 -72zM135 228c0 -1 1 -2 1 -3c-3 -5 -6 -11 -9 -16c0 1 -1 1 -1 2
+c-2 3 -3 6 -5 9c-38 70 -73 84 -121 84v16c37 0 56 -9 70 -17c24 -14 45 -38 65 -75zM298 143l86 -71l-86 -72l-10 12l62 52h-46c-76 0 -118 45 -149 95c1 2 2 5 3 7c2 3 4 7 6 10c30 -50 67 -96 140 -96h46l-62 51z" />
+ <glyph glyph-name="ion-ios-skipbackward-outline" unicode="&#xf4aa;" horiz-adv-x="320"
+d="M0 352h79v-142l241 142v-320l-241 142v-142h-79v320zM80 192l7 -4l217 -128v264v0l-217 -128zM16 336v-288h47v126v8v28v126h-47z" />
+ <glyph glyph-name="ion-ios-skipbackward" unicode="&#xf4ab;" horiz-adv-x="320"
+d="M0 352h79v-142l241 142v-320l-241 142v-142h-79v320z" />
+ <glyph glyph-name="ion-ios-skipforward-outline" unicode="&#xf4ac;" horiz-adv-x="320"
+d="M241 352h79v-320h-79v142l-241 -142v320l241 -142v142zM233 188l7 4l-7 4l-217 128v0v-264zM304 48v288h-47v-126v-28v-8v-126h47z" />
+ <glyph glyph-name="ion-ios-skipforward" unicode="&#xf4ad;" horiz-adv-x="320"
+d="M241 352h79v-320h-79v142l-241 -142v320l241 -142v142z" />
+ <glyph glyph-name="ion-ios-snowy" unicode="&#xf4ae;" horiz-adv-x="256"
+d="M252 131c4 -2 5 -7 3 -11s-7 -5 -11 -3l-29 17c-2 -8 -2 -16 0 -24c1 -4 -3 -9 -7 -10s-8 2 -9 6c-2 12 -3 24 1 36l-64 36v-73c11 -3 22 -8 31 -16c3 -3 4 -8 1 -11s-8 -4 -11 -1c-6 5 -13 10 -21 12v-33c0 -4 -4 -8 -8 -8s-8 4 -8 8v33c-8 -2 -15 -7 -21 -12
+c-3 -3 -8 -2 -11 1s-3 8 0 11c9 8 20 13 32 16v73l-65 -36c4 -12 4 -23 2 -35c-1 -4 -5 -8 -9 -7s-8 6 -7 10c2 8 2 16 0 24l-29 -17c-4 -2 -9 -1 -11 3s-1 9 3 11l29 16c-6 6 -13 10 -21 13c-4 1 -6 6 -5 10c2 4 6 6 10 5c12 -4 22 -11 30 -19l65 36l-65 37
+c-8 -9 -18 -15 -30 -19c-4 -1 -9 0 -10 4s1 10 5 11c8 3 15 6 21 12l-29 16c-4 2 -5 7 -3 11s7 5 11 3l29 -16c2 8 2 15 0 23c-1 4 3 9 7 10s8 -2 9 -6c2 -12 1 -25 -2 -36l65 -36v73c-12 3 -23 8 -32 16c-3 3 -3 8 0 11s8 4 11 1c6 -5 13 -10 21 -12v33c0 4 4 8 8 8
+s8 -4 8 -8v-33c8 2 15 7 21 12c3 3 8 2 11 -1s2 -8 -1 -11c-9 -8 -20 -13 -31 -16v-73l64 36c-3 11 -4 24 -2 36c1 4 6 7 10 6s7 -6 6 -10c-2 -8 -1 -15 1 -23l29 16c4 2 9 1 11 -3s1 -9 -3 -11l-29 -16c6 -6 13 -10 21 -13c4 -1 6 -6 5 -10s-6 -6 -10 -5
+c-12 4 -23 10 -31 19l-64 -36l64 -36c8 8 19 15 31 19c4 1 9 -1 10 -5s-1 -9 -5 -10c-8 -3 -15 -7 -21 -13z" />
+ <glyph glyph-name="ion-ios-speedometer-outline" unicode="&#xf4af;"
+d="M224 384c124 0 224 -100 224 -224c0 -57 -21 -108 -56 -148c-4 -4 -7 -8 -11 -12l-10 10l-1 2c-19 18 -41 33 -65 43c-26 11 -53 16 -81 16s-55 -5 -81 -16c-24 -10 -46 -25 -65 -43l-1 -2l-10 -10c-4 4 -7 8 -11 12c-35 40 -56 91 -56 148c0 124 100 224 224 224z
+M416 79c10 23 15 48 16 73h-32v16h32c-1 25 -6 50 -16 73c-9 22 -23 42 -39 60l-27 -27l-6 6l-5 5v0h-1l27 27c-18 17 -38 31 -60 40c-23 10 -48 15 -74 16v-38h-16v38c-25 -1 -49 -6 -72 -16c-22 -10 -43 -23 -61 -40l27 -27v0v0l-6 -6l-5 -5l-27 27
+c-16 -18 -30 -38 -39 -60c-10 -23 -15 -49 -16 -74h32v-16h-32c1 -25 6 -49 16 -72c9 -20 20 -39 35 -56c40 40 96 64 157 64s117 -24 157 -64c15 17 26 36 35 56zM336 273l2 -1l-75 -84c6 -8 9 -18 9 -28c0 -26 -22 -48 -48 -48c-10 0 -19 4 -27 9l-13 -12l-11 11l12 12
+c-6 8 -9 18 -9 28c0 26 22 48 48 48c10 0 19 -3 27 -8zM224 128c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32z" />
+ <glyph glyph-name="ion-ios-speedometer" unicode="&#xf4b0;"
+d="M385 169v-15h30c-1 -22 -6 -44 -15 -65c-8 -18 -19 -35 -32 -50c-39 37 -90 58 -144 58s-105 -21 -144 -58c-13 15 -24 32 -32 50c-9 21 -14 43 -15 65h28h1v16h-29c1 23 6 45 15 66c9 20 20 38 35 54l25 -24l10 10l1 1v0v0l-25 25c16 15 36 26 56 35c21 9 43 14 66 15
+v-34h14h1v34c23 -1 46 -6 67 -15s39 -20 55 -35l-24 -25l11 -11l25 25c15 -16 26 -35 35 -55c9 -21 14 -43 15 -66h-30v-1zM272 160c0 10 -3 20 -9 28l63 76l-2 1l-73 -65c-8 5 -17 8 -27 8c-26 0 -48 -22 -48 -48c0 -10 3 -20 9 -28l-12 -12l11 -11l13 12c8 -5 17 -9 27 -9
+c26 0 48 22 48 48zM224 384c124 0 224 -100 224 -224c0 -57 -21 -108 -56 -148c-4 -4 -7 -8 -11 -12h-23c-32 39 -80 64 -134 64s-102 -25 -134 -64h-23c-4 4 -7 8 -11 12c-35 40 -56 91 -56 148c0 124 100 224 224 224zM379 27c34 37 52 86 52 136c0 55 -22 106 -61 145
+s-91 60 -146 60s-107 -21 -146 -60s-61 -90 -61 -145c0 -50 18 -99 52 -136l10 -10l1 -1v1l9 9l1 1v0c17 17 38 30 60 39c24 10 48 15 74 15s50 -5 74 -15c22 -9 43 -22 60 -39v0l1 -1l9 -9v-1l1 1zM192 160c0 21 11 32 32 32s32 -11 32 -32s-11 -32 -32 -32s-32 11 -32 32z
+" />
+ <glyph glyph-name="ion-ios-star-half" unicode="&#xf4b1;"
+d="M140 143l-140 98h171l53 159l53 -159h171l-140 -98l54 -159l-138 99l-138 -99zM224 347v-244l107 -76l-43 122l108 75h-131z" />
+ <glyph glyph-name="ion-ios-star-outline" unicode="&#xf4b2;"
+d="M448 241l-140 -98l54 -159l-138 99l-138 -99l54 159l-140 98h171l53 159l53 -159h171zM331 27l-43 122l108 75h-131l-41 123l-41 -123h-131l108 -75l-43 -122l107 76z" />
+ <glyph glyph-name="ion-ios-star" unicode="&#xf4b3;"
+d="M448 241l-140 -98l54 -159l-138 99l-138 -99l54 159l-140 98h171l53 159l53 -159h171z" />
+ <glyph glyph-name="ion-ios-stopwatch-outline" unicode="&#xf4b4;" horiz-adv-x="384"
+d="M334 301c32 -35 50 -80 50 -128c0 -104 -86 -189 -192 -189s-192 85 -192 189c0 48 18 94 51 129l1 1h-18l-8 -8l-23 23l41 40l23 -22l-9 -9v-18c31 30 72 50 116 53h2v38h32v-38c43 -4 82 -21 113 -49l5 -5v19l-9 9l23 22l41 -40l-22 -23l-9 8h-18zM192 2
+c96 0 173 77 173 171s-77 171 -173 171c-95 0 -173 -77 -173 -171s77 -171 173 -171zM200 191c14 -4 24 -17 24 -31c0 -15 -10 -26 -24 -30l-8 -18v0l-8 18c-14 4 -24 15 -24 30c0 14 12 27 24 31v129h16v-129z" />
+ <glyph glyph-name="ion-ios-stopwatch" unicode="&#xf4b5;" horiz-adv-x="384"
+d="M334 301c32 -35 50 -80 50 -128c0 -104 -86 -189 -192 -189s-192 85 -192 189c0 48 18 94 51 129l1 1h-18l-8 -8l-23 23l41 40l23 -22l-9 -9v-18c31 30 72 50 116 53h2v38h32v-38c43 -4 82 -21 113 -49l5 -5v19l-9 9l23 22l41 -40l-22 -23l-9 8h-18zM200 130
+c14 4 24 15 24 30c0 14 -10 27 -24 31v129h-16v-129c-12 -4 -24 -17 -24 -31c0 -15 10 -26 24 -30l8 -18z" />
+ <glyph glyph-name="ion-ios-sunny-outline" unicode="&#xf4b6;" horiz-adv-x="320"
+d="M151 296v56h18v-56h-18zM151 32v60h18v-60h-18zM264 183v18h56v-18h-56zM0 183v18h60v-18h-60zM240 130l34 -34l-12 -12l-33 34zM64 306l34 -33l-12 -12l-34 34zM229 272l33 34l12 -12l-34 -33zM52 96l34 34l11 -12l-33 -34zM160 116c-42 0 -76 34 -76 76s34 76 76 76
+s76 -34 76 -76s-34 -76 -76 -76zM160 251c-32 0 -59 -27 -59 -59s27 -59 59 -59s59 27 59 59s-27 59 -59 59z" />
+ <glyph glyph-name="ion-ios-sunny" unicode="&#xf4b7;" horiz-adv-x="320"
+d="M151 296v56h18v-56h-18zM151 32v60h18v-60h-18zM264 183v18h56v-18h-56zM0 183v18h60v-18h-60zM240 130l34 -34l-12 -12l-33 34zM64 306l34 -33l-12 -12l-34 34zM229 272l33 34l12 -12l-34 -33zM52 96l34 34l11 -12l-33 -34zM160 116c-42 0 -76 34 -76 76s34 76 76 76
+s76 -34 76 -76s-34 -76 -76 -76z" />
+ <glyph glyph-name="ion-ios-telephone-outline" unicode="&#xf4b8;" horiz-adv-x="352"
+d="M336 112c16 -16 26 -35 0 -66c-25 -30 -42 -30 -64 -30c-24 0 -58 14 -93 40c-32 23 -46 34 -78 67c-34 35 -55 64 -79 107c-27 50 -24 74 -18 92c4 12 14 24 28 33l1 1c6 4 18 12 32 12c13 0 24 -6 34 -18l1 -1c11 -14 24 -31 32 -47c10 -21 10 -38 -1 -53
+c-9 -12 -12 -19 -12 -23s5 -9 13 -18l1 -1c16 -18 20 -23 26 -29c1 -1 3 -2 4 -3l2 -2c7 -7 11 -12 29 -28l1 -1c7 -6 9 -8 12 -8c5 0 16 7 29 15c4 3 11 5 17 5c27 0 68 -29 83 -44zM324 57c19 22 13 31 1 43c-13 14 -50 39 -72 39c-3 0 -6 -1 -8 -2
+c-19 -12 -28 -18 -37 -18s-15 6 -23 13h-1c-19 16 -23 21 -30 29l-2 2c-1 1 -3 2 -4 3c-6 6 -11 12 -27 30v1c-10 11 -17 18 -18 28s5 20 16 34c15 20 -5 48 -31 79l-1 1c-7 8 -14 12 -22 12c-10 0 -18 -6 -23 -9c-1 0 -2 -1 -2 -1c-11 -7 -18 -16 -21 -24
+c-5 -16 -7 -35 17 -79c23 -42 43 -70 76 -104c31 -32 45 -42 76 -64c32 -23 64 -38 84 -38c21 0 32 1 52 25z" />
+ <glyph glyph-name="ion-ios-telephone" unicode="&#xf4b9;" horiz-adv-x="352"
+d="M336 112c16 -16 26 -35 0 -66c-25 -30 -42 -30 -64 -30c-24 0 -58 14 -93 40c-32 23 -46 34 -78 67c-34 35 -55 64 -79 107c-27 50 -24 74 -18 92c4 12 14 24 28 33l1 1c6 4 18 12 32 12c13 0 24 -6 34 -18l1 -1c11 -14 24 -31 32 -47c10 -21 10 -38 -1 -53
+c-9 -12 -12 -19 -12 -23s5 -9 13 -18l1 -1c16 -18 20 -23 26 -29c1 -1 3 -2 4 -3l2 -2c7 -7 11 -12 29 -28l1 -1c7 -6 9 -8 12 -8c5 0 16 7 29 15c4 3 11 5 17 5c27 0 68 -29 83 -44z" />
+ <glyph glyph-name="ion-ios-tennisball-outline" unicode="&#xf4ba;" horiz-adv-x="416"
+d="M416 192v-8v0c0 -5 0 -11 -1 -16v0c-11 -97 -90 -174 -187 -183v0h-4h-2s-1 -1 -2 -1h-3h-1h-8c-115 0 -208 93 -208 208s93 208 208 208s208 -93 208 -208zM399 192c0 105 -86 191 -191 191c-3 0 -5 -1 -8 -1c1 -24 6 -46 15 -68c10 -26 26 -49 46 -69s43 -36 69 -46
+c22 -9 44 -14 68 -15c0 3 1 5 1 8zM17 192c0 -105 86 -191 191 -191h4c-1 22 -7 45 -15 66c-10 26 -26 48 -46 68s-42 36 -68 46c-21 8 -44 14 -66 15v-4zM228 2c88 9 158 78 169 166c-54 3 -106 25 -147 66s-63 93 -66 147c-88 -11 -157 -81 -166 -169
+c53 -3 105 -25 145 -65s62 -92 65 -145z" />
+ <glyph glyph-name="ion-ios-tennisball" unicode="&#xf4bb;" horiz-adv-x="416"
+d="M0 196v0v0v0zM212 -16h1h-1v0zM208 400c115 0 208 -93 208 -208c0 -8 0 -16 -1 -24v0v0c-11 -97 -90 -174 -187 -183v0v0c-6 -1 -13 -1 -20 -1c-115 0 -208 93 -208 208v4v0v0c0 6 0 11 1 16v0v0c9 97 86 176 183 187v0v0c6 1 11 1 16 1v0v0h8zM83 181
+c26 -10 48 -26 68 -46s36 -42 46 -68c8 -21 14 -44 15 -66c5 0 11 0 16 1c-3 53 -25 105 -65 145s-92 62 -145 65c-1 -5 -1 -11 -1 -16c22 -1 45 -7 66 -15zM250 234c41 -41 93 -63 147 -66c1 5 1 11 1 16c-24 1 -46 6 -68 15c-26 10 -49 26 -69 46s-36 43 -46 69
+c-9 22 -14 44 -15 68c-5 0 -11 0 -16 -1c3 -54 25 -106 66 -147z" />
+ <glyph glyph-name="ion-ios-thunderstorm-outline" unicode="&#xf4bc;" horiz-adv-x="274"
+d="M193 176l-88 -128l29 96h-52l15 80h72l-16 -48h40zM209 275c36 0 65 -29 65 -65s-29 -66 -65 -66h-8v17h8c27 0 49 22 49 49s-22 50 -49 50h-6l-14 -2l-3 14c-3 14 -11 26 -22 35s-25 13 -39 13c-34 0 -63 -27 -63 -62v-12s1 -9 1 -9c-5 0 -12 -2 -14 -2
+c-19 -3 -33 -18 -33 -37c0 -10 3 -19 10 -26s16 -11 26 -11h11v-17h-11c-28 0 -52 24 -52 53c0 27 21 51 47 53v8c0 43 35 78 78 78c37 0 68 -26 76 -61h8z" />
+ <glyph glyph-name="ion-ios-thunderstorm" unicode="&#xf4bd;" horiz-adv-x="274"
+d="M153 176h40l-22 -32l-66 -96l29 96h-52l15 80h72zM84 240h107l-16 -48h18h30l-33 -48h19c36 0 65 30 65 66s-29 65 -65 65h-8c-8 35 -39 61 -76 61c-43 0 -78 -35 -78 -78v-8c-26 -2 -47 -26 -47 -53c0 -29 24 -53 52 -53h14z" />
+ <glyph glyph-name="ion-ios-time-outline" unicode="&#xf4be;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM371 45c19 19 35 41 45 66c11 26 16 53 16 81s-5 55 -16 81c-10 25 -26 47 -45 66s-41 35 -66 45c-26 11 -53 16 -81 16s-55 -5 -81 -16c-25 -10 -47 -26 -66 -45
+s-35 -41 -45 -66c-11 -26 -16 -53 -16 -81s5 -55 16 -81c10 -25 26 -47 45 -66s41 -35 66 -45c26 -11 53 -16 81 -16s55 5 81 16c25 10 47 26 66 45zM216 368c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM216 16c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM392 192
+c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM40 192c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM128 344c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM304 40c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM368 280c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8
+zM64 104c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM64 280c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM368 104c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM304 344c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM128 40c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8
+s-8 3 -8 8zM238 200c4 -8 2 -18 -6 -22v-122c0 -4 -4 -8 -8 -8s-8 4 -8 8v122c-2 1 -4 4 -6 6c-3 5 -3 11 0 16l-37 63c-2 4 -1 9 3 11s8 1 10 -3l38 -63c5 0 11 -3 14 -8z" />
+ <glyph glyph-name="ion-ios-time" unicode="&#xf4bf;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM224 376c-4 0 -8 -4 -8 -8s4 -8 8 -8s8 4 8 8s-4 8 -8 8zM48 184c4 0 8 4 8 8s-4 8 -8 8s-8 -4 -8 -8s4 -8 8 -8zM76 97c4 2 4 7 2 11s-6 5 -10 3s-5 -7 -3 -11s7 -5 11 -3z
+M78 276c2 4 2 9 -2 11s-9 1 -11 -3s-1 -9 3 -11s8 -1 10 3zM132 351c-4 -2 -5 -7 -3 -11s7 -4 11 -2s5 6 3 10s-7 5 -11 3zM143 36c2 4 1 8 -3 10s-9 2 -11 -2s-1 -9 3 -11s9 -1 11 3zM224 8c4 0 8 4 8 8s-4 8 -8 8s-8 -4 -8 -8s4 -8 8 -8zM232 178c8 4 10 14 6 22
+c-3 5 -9 8 -14 8l-38 64c-2 4 -7 4 -11 2s-4 -7 -2 -11l37 -63c-3 -5 -3 -11 0 -16c2 -2 4 -5 6 -6v-122c0 -4 4 -8 8 -8s8 4 8 8v122zM316 33c4 2 5 7 3 11s-7 4 -11 2s-5 -6 -3 -10s7 -5 11 -3zM319 340c2 4 1 9 -3 11s-9 1 -11 -3s-1 -8 3 -10s9 -2 11 2zM383 100
+c2 4 1 9 -3 11s-8 1 -10 -3s-2 -9 2 -11s9 -1 11 3zM380 273c4 2 5 7 3 11s-7 5 -11 3s-4 -7 -2 -11s6 -5 10 -3zM400 184c4 0 8 4 8 8s-4 8 -8 8s-8 -4 -8 -8s4 -8 8 -8z" />
+ <glyph glyph-name="ion-ios-timer-outline" unicode="&#xf4c0;" horiz-adv-x="416"
+d="M189 176l-1 2s-89 118 -86 120s121 -85 121 -85c1 -1 1 -2 2 -3c5 -5 8 -11 8 -18c0 -14 -11 -25 -25 -25c-8 0 -14 3 -19 9zM208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208c0 57 23 109 61 147l12 -12c-35 -35 -56 -82 -56 -135
+c0 -106 85 -191 191 -191s191 85 191 191c0 100 -77 183 -175 191v-95h-16v112v0v0z" />
+ <glyph glyph-name="ion-ios-timer" unicode="&#xf4c1;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM102 298c-2 -2 86 -120 86 -120l1 -1c5 -6 11 -10 19 -10c14 0 25 11 25 25c0 7 -3 13 -8 18l-3 3c0 0 -117 87 -120 85zM208 1c106 0 192 85 192 191s-86 192 -192 192v-96h16v78
+c88 -9 158 -84 158 -174c0 -96 -78 -174 -174 -174s-175 78 -175 174c0 48 19 92 51 124l-11 12c-35 -35 -56 -83 -56 -136c0 -106 85 -191 191 -191z" />
+ <glyph glyph-name="ion-ios-toggle-outline" unicode="&#xf4c2;"
+d="M96 128c-26 0 -48 -22 -48 -48s22 -48 48 -48s48 22 48 48s-22 48 -48 48zM96 144v0c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM351 160v0h-255c-44 0 -80 -36 -80 -80s36 -80 80 -80h256c44 0 80 36 80 80s-37 80 -81 80zM352 176v0
+c53 0 96 -43 96 -96s-43 -96 -96 -96h-256c-53 0 -96 43 -96 96s43 96 96 96h256zM352 352c-26 0 -48 -22 -48 -48s22 -48 48 -48s48 22 48 48s-22 48 -48 48zM352 368v0c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM97 384v0c-44 0 -81 -36 -81 -80
+s36 -80 80 -80h256c44 0 80 36 80 80s-36 80 -80 80h-255zM96 400v0h256c53 0 96 -43 96 -96s-43 -96 -96 -96h-256c-53 0 -96 43 -96 96s43 96 96 96z" />
+ <glyph glyph-name="ion-ios-toggle" unicode="&#xf4c3;"
+d="M96 128c26 0 48 -22 48 -48s-22 -48 -48 -48s-48 22 -48 48s22 48 48 48zM352 176c53 0 96 -43 96 -96s-43 -96 -96 -96h-256c-53 0 -96 43 -96 96s43 96 96 96h256zM96 16c35 0 64 29 64 64s-29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64zM352 256c-26 0 -48 22 -48 48
+s22 48 48 48s48 -22 48 -48s-22 -48 -48 -48zM96 208c-53 0 -96 43 -96 96s43 96 96 96h256c53 0 96 -43 96 -96s-43 -96 -96 -96h-256zM352 368c-35 0 -64 -29 -64 -64s29 -64 64 -64s64 29 64 64s-29 64 -64 64z" />
+ <glyph glyph-name="ion-ios-trash-outline" unicode="&#xf4c4;" horiz-adv-x="288"
+d="M288 335v-15h-20l-24 -291c0 -16 -13 -29 -29 -29h-141c-16 0 -29 13 -29 29l-24 291h-21v15h80v20c0 16 13 29 29 29h70c16 0 29 -13 29 -29v-20h80zM95 355v-20h98v20c0 8 -6 14 -14 14h-70c-8 0 -14 -6 -14 -14zM230 30l23 290h-217l23 -290v0v-1c0 -8 7 -14 15 -14
+h141c8 0 15 6 15 14v1v0zM137 47v241h14v-241h-14zM208 288l-11 -241h-14l10 241h15zM94 288l11 -241h-14l-11 241h14z" />
+ <glyph glyph-name="ion-ios-trash" unicode="&#xf4c5;" horiz-adv-x="288"
+d="M208 335h80v-15h-20l-24 -291c0 -16 -13 -29 -29 -29h-141c-16 0 -29 13 -29 29l-24 291h-21v15h80v20c0 16 13 29 29 29h70c16 0 29 -13 29 -29v-20zM95 355v0v-20h98v20c0 8 -6 14 -14 14h-70c-8 0 -14 -6 -14 -14zM91 47h14l-11 241h-14zM151 47v241h-14v-241h14z
+M197 47l11 241h-14l-11 -241h14z" />
+ <glyph glyph-name="ion-ios-undo-outline" unicode="&#xf4c6;" horiz-adv-x="384"
+d="M384 80v-32h-10l-20 31c-20 33 -44 63 -75 77c-24 11 -47 19 -87 20v-80l-192 128l192 128v-80c63 -3 108 -21 143 -56c52 -53 49 -119 49 -136zM368 87c0 0 9 169 -192 169v65l-148 -97l148 -97v65c91 0 144 -24 192 -105z" />
+ <glyph glyph-name="ion-ios-undo" unicode="&#xf4c7;" horiz-adv-x="384"
+d="M384 80v-32h-10l-20 31c-20 33 -44 63 -75 77c-24 11 -47 19 -87 20v-80l-192 128l192 128v-80c63 -3 108 -21 143 -56c52 -53 49 -119 49 -136z" />
+ <glyph glyph-name="ion-ios-unlocked-outline" unicode="&#xf4c8;" horiz-adv-x="320"
+d="M160 160c18 0 32 -14 32 -32c0 -15 -10 -27 -24 -31v-33h-16v33c-14 4 -24 16 -24 31c0 18 14 32 32 32zM160 112c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM72 224h248v-240h-320v240h56v72c0 57 47 104 104 104s104 -47 104 -104v-8h-16v8
+c0 49 -39 88 -88 88s-88 -39 -88 -88v-72zM304 0v208h-288v-208h288z" />
+ <glyph glyph-name="ion-ios-unlocked" unicode="&#xf4c9;" horiz-adv-x="320"
+d="M160 144c9 0 16 -7 16 -16s-7 -16 -16 -16s-16 7 -16 16s7 16 16 16zM72 224h248v-240h-320v240h56v72c0 57 47 104 104 104s104 -47 104 -104v-8h-16v8c0 49 -39 88 -88 88s-88 -39 -88 -88v-72zM168 97c14 4 24 16 24 31c0 18 -14 32 -32 32s-32 -14 -32 -32
+c0 -15 10 -27 24 -31v-33h16v33z" />
+ <glyph glyph-name="ion-ios-upload-outline" unicode="&#xf4ca;" horiz-adv-x="320"
+d="M192 304h128v-304h-320v304h128v-16h-112v-272h288v272h-112v16zM97 330l-11 12l74 74l74 -74l-11 -12l-55 55v-243h-16v243z" />
+ <glyph glyph-name="ion-ios-upload" unicode="&#xf4cb;" horiz-adv-x="320"
+d="M168 304h152v-304h-320v304h152v-162h16v162zM168 385v-81h-16v81l-55 -55l-11 12l74 74l74 -74l-11 -12z" />
+ <glyph glyph-name="ion-ios-videocam-outline" unicode="&#xf4cc;" horiz-adv-x="418"
+d="M257 320c19 0 33 -14 33 -33v-188c0 -19 -14 -35 -33 -35h-221c-19 0 -36 16 -36 35v188c0 19 17 33 36 33h221zM273 99v188c0 9 -8 16 -17 16h-221c-9 0 -18 -7 -18 -16v-188c0 -9 10 -18 19 -18h221c9 0 16 9 16 18zM320 235l98 53v-192l-98 53v86zM401 258v0l-64 -33
+v-66l64 -33v132z" />
+ <glyph glyph-name="ion-ios-videocam" unicode="&#xf4cd;" horiz-adv-x="418"
+d="M257 320c19 0 33 -14 33 -33v-188c0 -19 -14 -35 -33 -35h-221c-19 0 -36 16 -36 35v188c0 19 17 33 36 33h221zM320 235l98 53v-192l-98 53v86z" />
+ <glyph glyph-name="ion-ios-volume-high" unicode="&#xf4ce;" horiz-adv-x="320"
+d="M278 320c26 -36 42 -80 42 -128s-16 -92 -42 -128l-14 10c24 33 39 74 39 118s-15 85 -39 118zM224 96l-14 10c18 24 29 54 29 86s-11 62 -29 86l14 10c20 -27 32 -60 32 -96s-12 -69 -32 -96zM177 128l-13 10c12 15 18 34 18 54s-6 39 -18 54l13 10
+c14 -18 22 -40 22 -64s-8 -46 -22 -64zM58 232l70 56v-192l-70 56h-58v80h58z" />
+ <glyph glyph-name="ion-ios-volume-low" unicode="&#xf4cf;" horiz-adv-x="128"
+d="M58 232l70 56v-192l-70 56h-58v80h58z" />
+ <glyph glyph-name="ion-ios-wineglass-outline" unicode="&#xf4d0;" horiz-adv-x="192"
+d="M104 139v-155h72v-16h-80h-80v16h72v155c0 22 -20 39 -40 55c-8 6 -16 13 -22 19c-27 28 -26 52 -26 71v4c0 44 31 125 32 128h64h64c1 -3 32 -84 32 -128v-4c0 -19 1 -43 -26 -71c-6 -6 -14 -13 -22 -19c-20 -16 -40 -33 -40 -55zM43 400c-5 -16 -20 -63 -25 -96h156
+c-5 33 -20 80 -25 96h-53h-53zM96 175c3 0 5 0 7 2v0c9 11 20 20 31 29c8 6 15 12 20 18c22 23 22 41 22 60v4h-160v-4c0 -19 0 -37 22 -60c5 -6 12 -12 20 -18c11 -9 22 -18 31 -29v0c2 -2 4 -2 7 -2z" />
+ <glyph glyph-name="ion-ios-wineglass" unicode="&#xf4d1;" horiz-adv-x="192"
+d="M104 139v-155h72v-16h-80h-80v16h72v155c0 22 -20 39 -40 55c-8 6 -16 13 -22 19c-27 28 -26 52 -26 71v4c0 44 31 125 32 128h64h64c1 -3 32 -84 32 -128v-4c0 -19 1 -43 -26 -71c-6 -6 -14 -13 -22 -19c-20 -16 -40 -33 -40 -55zM43 400c-5 -16 -20 -63 -25 -96h156
+c-5 33 -20 80 -25 96h-53h-53z" />
+ <glyph glyph-name="ion-ios-world-outline" unicode="&#xf4d2;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208v0v0v0c-115 0 -208 93 -208 208s93 208 208 208v0v0v0zM216 276v-76h75c-1 31 -5 60 -11 84c-21 -5 -42 -7 -64 -8zM216 292c20 1 41 3 60 8c-14 46 -38 76 -60 82v-90zM200 382c-23 -6 -45 -36 -60 -82
+c19 -5 39 -7 60 -8v90zM200 276c-22 1 -44 3 -65 8c-6 -24 -10 -53 -11 -84h76v76zM108 200c1 32 4 62 11 88c-21 6 -41 15 -59 25c-26 -31 -41 -70 -43 -113h91zM108 184h-91c2 -43 17 -82 43 -113c19 10 38 19 59 25c-7 26 -10 56 -11 88zM124 184c1 -31 5 -60 11 -84
+c21 5 43 8 65 9v75h-76zM200 92c-21 -1 -41 -3 -60 -8c15 -46 37 -76 60 -82v90zM216 2c22 6 46 36 60 82c-19 5 -40 7 -60 8v-90zM216 109c22 -1 43 -4 64 -9c6 24 10 53 11 84h-75v-75zM308 184c-1 -32 -5 -62 -12 -88c21 -6 41 -15 60 -25c26 31 41 70 43 113h-91z
+M308 200v0h91c-2 43 -17 82 -43 113c-19 -10 -38 -19 -59 -25c7 -26 10 -56 11 -88zM344 326c-25 25 -56 44 -91 52c16 -17 29 -43 39 -74c18 6 35 13 52 22zM163 378c-35 -8 -67 -27 -91 -52c16 -9 34 -15 52 -21c10 31 23 56 39 73zM72 58c25 -25 56 -44 91 -52
+c-16 17 -30 43 -40 74c-18 -6 -35 -13 -51 -22zM253 6c35 8 66 27 91 52c-17 9 -34 16 -52 22c-10 -31 -23 -57 -39 -74z" />
+ <glyph glyph-name="ion-ios-world" unicode="&#xf4d3;" horiz-adv-x="416"
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208v0v0v0c-115 0 -208 93 -208 208s93 208 208 208v0v0v0zM208 1c106 0 191 85 191 191s-85 191 -191 191v0v0v0c-106 0 -191 -85 -191 -191s86 -191 191 -191v0v0v0zM274 276c6 -22 9 -48 10 -76h-68v68c20 1 39 4 58 8
+zM216 366c20 -6 41 -34 54 -75c-17 -4 -36 -6 -54 -7v82zM145 291c13 42 35 69 55 75v-82c-19 1 -37 3 -55 7zM333 315c-15 -8 -31 -15 -48 -20c-9 29 -21 52 -36 67c32 -8 61 -24 84 -47zM299 200c-1 29 -4 56 -10 80c19 6 37 14 54 23c23 -28 38 -64 40 -103h-84zM132 200
+c1 28 3 54 9 76c19 -5 39 -7 59 -8v-68h-68zM284 184c-1 -28 -4 -54 -10 -76c-19 5 -38 7 -58 8v68h68zM141 108c-6 22 -8 48 -9 76h68v-68c-20 -1 -40 -3 -59 -8zM200 18c-20 6 -42 33 -55 75c18 4 36 6 55 7v-82zM249 22c15 15 27 38 36 67c17 -5 33 -11 48 -19
+c-23 -23 -52 -40 -84 -48zM167 362c-15 -15 -27 -39 -36 -67c-16 5 -33 11 -48 19c22 23 52 40 84 48zM289 104c6 24 9 51 10 80h84c-2 -39 -17 -75 -40 -103c-17 9 -35 17 -54 23zM216 100c18 -1 37 -3 54 -7c-13 -42 -34 -69 -54 -75v82zM127 280c-6 -24 -11 -51 -11 -80
+h-83c2 39 17 75 40 103c17 -9 35 -17 54 -23zM116 184c1 -29 4 -56 10 -80c-19 -6 -36 -14 -53 -23c-23 28 -38 64 -40 103h83zM83 70c15 8 32 14 48 19c9 -28 21 -52 36 -67c-32 8 -62 25 -84 48z" />
+ <glyph glyph-name="ion-ipad" unicode="&#xf1f9;" horiz-adv-x="288"
+d="M0 375c0 5 4 9 9 9h270c5 0 9 -4 9 -9v-366c0 -5 -4 -9 -9 -9h-270c-5 0 -9 4 -9 9v366zM144 10c8 0 14 6 14 14s-7 14 -14 14c-8 0 -14 -6 -14 -14s6 -14 14 -14zM32 329v-275c0 -4 3 -6 6 -6h211c3 0 7 2 7 6v275c0 4 -4 7 -7 7h-211c-3 0 -6 -3 -6 -7z" />
+ <glyph glyph-name="ion-iphone" unicode="&#xf1fa;" horiz-adv-x="192"
+d="M168 384c13 0 24 -11 24 -24v-336c0 -13 -11 -24 -24 -24h-144c-13 0 -24 11 -24 24v336c0 13 11 24 24 24h144zM80 348v0c0 -2 2 -4 4 -4h24c2 0 4 2 4 4v0c0 2 -2 4 -4 4h-24c-2 0 -4 -2 -4 -4zM68 352c-2 0 -4 -2 -4 -4s2 -4 4 -4s4 2 4 4s-2 4 -4 4zM96 16
+c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM176 64v256h-160v-256h160z" />
+ <glyph glyph-name="ion-ipod" unicode="&#xf1fb;" horiz-adv-x="224"
+d="M112 137c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32zM196 384c15 0 28 -12 28 -28v-328c0 -16 -13 -28 -28 -28h-168c-15 0 -28 12 -28 28v328c0 16 13 28 28 28h168zM112 32c40 0 72 32 72 72s-32 72 -72 72s-72 -32 -72 -72s32 -72 72 -72z
+M192 221v118c-1 7 -6 12 -12 13h-136c-7 -1 -12 -7 -12 -15v-114c0 -8 6 -15 14 -15h131c8 0 14 5 15 13z" />
+ <glyph glyph-name="ion-jet" unicode="&#xf295;" horiz-adv-x="326"
+d="M222 80l-2 -13l53 -58l-18 -27l-74 9l-18 -55l-19 55l-73 -9l-18 27l53 58l-2 13l-104 -35l3 53l114 103s26 173 28 192c5 40 18 55 18 55s13 -15 18 -55c2 -19 28 -192 28 -192l114 -103l3 -53z" />
+ <glyph glyph-name="ion-key" unicode="&#xf296;" horiz-adv-x="192"
+d="M144 147c28 -17 48 -48 48 -83c0 -53 -43 -96 -96 -96s-96 43 -96 96c0 36 19 67 48 84c0 0 7 16 12 41c0 4 11 6 11 12v20c0 5 -7 9 -7 11v8v8c0 2 0 4 1 6c0 1 1 1 1 2l2 1l4 4v1c2 2 3 4 3 6c0 1 1 8 1 9c0 3 -2 6 -4 8l-1 1l-4 4v0l-1 1v0c-2 2 -3 5 -3 8v7
+c0 3 2 7 4 9v0l5 5v0c2 2 4 3 4 6v24c0 3 -2 6 -4 8v1l-4 4l-1 1c-2 2 -3 5 -3 8v18c0 11 0 19 9 23c3 1 14 3 23 3c20 0 30 -8 32 -36c0 0 7 -81 9 -143s7 -90 7 -90zM96 0c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32z" />
+ <glyph glyph-name="ion-knife" unicode="&#xf297;" horiz-adv-x="64"
+d="M62 416c2 0 2 -1 2 -6v-412c0 -15 -10 -30 -24 -30v0v0c-14 0 -24 15 -24 30c1 19 14 83 16 130v0c1 30 -32 31 -32 70c0 134 35 191 54 214c2 2 5 4 8 4z" />
+ <glyph glyph-name="ion-laptop" unicode="&#xf1fc;" horiz-adv-x="512"
+d="M480 342v-262h-448v262c0 6 4 10 10 10h428c6 0 10 -4 10 -10zM448 112v208h-384v-208h384zM0 59v5h512v-5c-70 -20 -116 -27 -256 -27s-186 7 -256 27z" />
+ <glyph glyph-name="ion-leaf" unicode="&#xf1fd;" horiz-adv-x="422"
+d="M412 69c18 -3 10 -41 -5 -39c0 0 -21 -1 -63 12c0 0 -16 -19 -39 -30c-26 -12 -118 -33 -197 38c-108 97 -120 354 -100 333c86 -90 197 -47 270 -106c55 -44 88 -127 77 -192c0 0 5 -8 57 -16zM316 65c5 5 10 16 10 24c-161 52 -252 160 -252 160s104 -143 242 -184z
+" />
+ <glyph glyph-name="ion-levels" unicode="&#xf298;" horiz-adv-x="350"
+d="M46 349c11 -5 18 -16 18 -29s-7 -24 -18 -29v-275c0 -9 -7 -16 -16 -16s-16 7 -16 16v278c-8 6 -14 15 -14 26s6 20 14 26v22c0 9 7 16 16 16s16 -7 16 -16v-19zM142 155c9 -6 15 -16 15 -27s-6 -21 -15 -27v-85c0 -9 -7 -16 -16 -16s-16 7 -16 16v84
+c-10 5 -17 16 -17 28s7 23 17 28v212c0 9 7 16 16 16s16 -7 16 -16v-213zM238 285c10 -6 16 -16 16 -28s-6 -22 -16 -28v-213c0 -9 -7 -16 -16 -16s-16 7 -16 16v213c-10 6 -16 16 -16 28s6 22 16 28v83c0 9 7 16 16 16s16 -7 16 -16v-83zM350 65c0 -12 -6 -22 -16 -28v-21
+c0 -9 -7 -16 -16 -16s-16 7 -16 16v21c-10 6 -16 16 -16 28s6 22 16 28v275c0 9 7 16 16 16s16 -7 16 -16v-275c10 -6 16 -16 16 -28z" />
+ <glyph glyph-name="ion-lightbulb" unicode="&#xf299;" horiz-adv-x="256"
+d="M128 416c71 0 128 -56 128 -124c0 -5 0 -9 -1 -14s-2 -11 -3 -16v-2c-17 -63 -45 -71 -59 -167v-1c-2 -9 -10 -12 -20 -12h-90c-10 0 -18 3 -20 12v1c-14 96 -42 104 -59 167v2c-1 5 -2 11 -3 16s-1 9 -1 14c0 68 57 124 128 124zM190 52v-1c-2 -3 -3 -4 -3 -7s1 -5 3 -8
+v-1c1 -2 2 -3 2 -5s-1 -4 -2 -6v-1c-2 -3 -3 -4 -3 -7s1 -5 3 -8v-1c1 -2 2 -4 2 -6c0 -5 -4 -9 -10 -11h-1c-6 -1 -13 -2 -19 -3h-2c-6 -1 -11 -5 -14 -9v0c-4 -5 -10 -10 -18 -10s-15 6 -19 11v0c-3 4 -7 7 -13 8h-2c-6 1 -13 2 -19 3h-1c-6 2 -10 6 -10 11c0 2 1 4 2 6v1
+c2 2 3 4 3 7s-1 5 -3 8v1c-1 2 -2 4 -2 6s1 3 2 5v1c2 3 3 5 3 8s-1 4 -3 7v1v0c-1 2 -2 4 -2 6c0 4 -1 6 7 6h114c8 0 7 -2 7 -6c0 -2 -1 -4 -2 -6v0z" />
+ <glyph glyph-name="ion-link" unicode="&#xf1fe;" horiz-adv-x="384"
+d="M192 240v0v0v0zM304 288c44 0 80 -36 80 -80v-32c0 -44 -36 -80 -80 -80h-112c-33 0 -60 20 -73 48c-4 10 -7 20 -7 32v32h48v-32c0 -18 14 -32 32 -32h112c18 0 32 14 32 32v32c0 18 -14 32 -32 32v0h-16c-6 31 -32 48 -32 48h48zM266 240c4 -10 6 -21 6 -32v-32v0h-48
+v0v32c0 18 -14 32 -32 32v0h-112c-18 0 -32 -14 -32 -32v-32c0 -18 14 -32 32 -32h16c6 -31 32 -48 32 -48h-48c-44 0 -80 36 -80 80v32c0 44 36 80 80 80h112c33 0 62 -20 74 -48z" />
+ <glyph glyph-name="ion-load-a" unicode="&#xf29a;" horiz-adv-x="384"
+d="M144 352c0 43 21 64 64 64s64 -21 64 -64s-21 -64 -64 -64s-64 21 -64 64zM0 192c0 32 16 48 48 48s48 -16 48 -48s-16 -48 -48 -48s-48 16 -48 48zM312 304c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM132 340c10 -10 15 -22 15 -36s-5 -26 -15 -36s-22 -15 -36 -15
+s-26 5 -36 15s-15 22 -15 36s5 26 15 36s22 15 36 15s26 -5 36 -15zM352 192c0 11 5 16 16 16s16 -5 16 -16s-5 -16 -16 -16s-16 5 -16 16zM297 79c0 16 8 24 24 24s24 -8 24 -24s-8 -24 -24 -24s-24 8 -24 24zM176 32c0 21 11 32 32 32s32 -11 32 -32s-11 -32 -32 -32
+s-32 11 -32 32zM56 80c0 27 13 40 40 40s40 -13 40 -40s-13 -40 -40 -40s-40 13 -40 40z" />
+ <glyph glyph-name="ion-load-b" unicode="&#xf29b;"
+d="M256 288c0 -18 -14 -32 -32 -32v0c-18 0 -32 14 -32 32v96c0 18 14 32 32 32v0c18 0 32 -14 32 -32v-96zM224 128v0c18 0 32 -14 32 -32v-96c0 -18 -14 -32 -32 -32s-32 14 -32 32v96c0 18 14 32 32 32zM416 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32h-96
+c-18 0 -32 14 -32 32s14 32 32 32h96zM128 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32h-96c-18 0 -32 14 -32 32s14 32 32 32h96zM314 237c-12 -12 -33 -12 -45 0v0c-12 12 -12 34 0 46l68 67c12 12 33 12 45 0v0c12 -12 12 -33 0 -45zM179 147v0c12 -12 12 -33 0 -46
+l-68 -67c-12 -12 -33 -12 -45 0s-12 33 0 45l67 68c12 12 34 12 46 0zM382 79v0c12 -12 12 -33 0 -45s-33 -12 -45 0l-68 68c-12 12 -12 33 0 45s33 12 45 0zM179 282v0c12 -12 12 -33 0 -45s-34 -12 -46 0l-67 68c-12 12 -12 33 0 45s33 12 45 0z" />
+ <glyph glyph-name="ion-load-c" unicode="&#xf29c;"
+d="M448 222c0 -3 0 -6 -1 -9c-4 -8 -15 -12 -23 -7c-4 2 -6 7 -7 11c-1 5 -1 9 -2 14c-4 20 -12 40 -22 58c-12 21 -28 41 -47 56c-18 15 -40 26 -62 33c-21 6 -42 9 -64 9h-4c-3 0 -6 -1 -9 -1c-6 0 -14 -1 -20 -2c-13 -2 -25 -6 -37 -11c-21 -8 -40 -20 -57 -35
+s-31 -33 -42 -52c-12 -22 -20 -45 -24 -70c-2 -11 -2 -23 -2 -34c0 -6 0 -11 1 -16c1 -6 2 -13 3 -19c5 -24 14 -47 28 -67c13 -20 29 -38 48 -52c20 -15 42 -26 65 -33c25 -7 50 -9 76 -7c25 2 50 9 73 20c11 5 22 12 32 19s19 15 27 24c4 4 8 9 12 14s7 10 10 15
+c6 10 12 20 17 31c4 8 8 16 11 25c2 4 3 9 4 13s1 7 2 11c1 -9 1 -18 -1 -26c-1 -5 -2 -11 -4 -16c-1 -5 -3 -10 -5 -15c-4 -10 -8 -19 -13 -28c-6 -11 -12 -21 -20 -30s-16 -18 -25 -26c-18 -15 -40 -27 -62 -36c-23 -9 -48 -14 -73 -15s-51 3 -75 11c-23 7 -45 19 -65 33
+c-19 14 -36 31 -50 50c-7 10 -13 20 -18 31s-9 21 -13 33c-6 18 -9 37 -10 56c-1 20 1 39 5 58c5 24 15 47 28 68c12 19 26 35 42 50s35 27 55 36c23 11 48 19 74 21c10 1 19 1 29 1c13 0 26 -2 38 -4c24 -5 47 -14 68 -26s41 -29 57 -48c15 -18 27 -37 36 -58
+c4 -10 7 -21 10 -32c2 -8 5 -17 6 -26z" />
+ <glyph glyph-name="ion-load-d" unicode="&#xf29d;" horiz-adv-x="384"
+d="M368 208c9 0 16 -7 16 -16s-7 -16 -16 -16h-80c-9 0 -16 7 -16 16s7 16 16 16h80zM112 192c0 -9 -7 -16 -16 -16h-80c-9 0 -16 7 -16 16s7 16 16 16h80c9 0 16 -7 16 -16zM192 112c9 0 16 -7 16 -16v-80c0 -9 -7 -16 -16 -16s-16 7 -16 16v80c0 9 7 16 16 16zM192 384
+c9 0 16 -7 16 -16v-80c0 -9 -7 -16 -16 -16s-16 7 -16 16v80c0 9 7 16 16 16zM261 232c-4 8 -2 18 6 22l69 40c8 4 18 2 22 -6s2 -18 -6 -22l-69 -40c-8 -4 -18 -2 -22 6zM123 152c4 -8 2 -18 -6 -22l-69 -40c-8 -4 -18 -2 -22 6s-2 18 6 22l69 40c8 4 18 2 22 -6zM254 117
+l40 -69c4 -8 2 -18 -6 -22s-18 -2 -22 6l-40 69c-4 8 -2 18 6 22s18 2 22 -6zM118 352l40 -69c4 -8 2 -18 -6 -22s-18 -2 -22 6l-40 69c-4 8 -2 18 6 22s18 2 22 -6zM232 261c-8 4 -10 14 -6 22l40 69c4 8 14 10 22 6s10 -14 6 -22l-40 -69c-4 -8 -14 -10 -22 -6zM152 123
+c8 -4 10 -14 6 -22l-40 -69c-4 -8 -14 -10 -22 -6s-10 14 -6 22l40 69c4 8 14 10 22 6zM352 118c8 -4 10 -14 6 -22s-14 -10 -22 -6l-69 40c-8 4 -10 14 -6 22s14 10 22 6zM32 266c-8 4 -10 14 -6 22s14 10 22 6l69 -40c8 -4 10 -14 6 -22s-14 -10 -22 -6z" />
+ <glyph glyph-name="ion-location" unicode="&#xf1ff;" horiz-adv-x="239"
+d="M119 384c66 0 120 -54 120 -120c0 -115 -120 -264 -120 -264s-119 149 -119 264c0 66 53 120 119 120zM119 206c31 0 57 25 57 56s-26 57 -57 57s-56 -26 -56 -57s25 -56 56 -56z" />
+ <glyph glyph-name="ion-lock-combination" unicode="&#xf4d4;" horiz-adv-x="384"
+d="M320 271c39 -35 64 -86 64 -143c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 57 25 108 64 143v49c0 71 57 128 128 128s128 -57 128 -128v-49zM96 320v-26c28 16 61 26 96 26s68 -10 96 -26v26c0 53 -43 96 -96 96s-96 -43 -96 -96zM192 -32c88 0 160 72 160 160
+s-72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160zM192 272c80 0 144 -64 144 -144s-64 -144 -144 -144s-144 64 -144 144s64 144 144 144zM315 95c2 9 4 18 4 29h-7v7h8c0 11 -2 20 -5 30l-25 -7l-4 12l25 8c-4 10 -8 18 -14 26l-11 -8l-4 6l11 8c-6 8 -13 16 -21 22
+l-15 -21l-11 8l15 20c-8 6 -17 11 -27 14l-4 -13l-6 2l5 13c-9 3 -20 5 -29 5v-13v-6h-16v6v13c-11 -1 -19 -2 -29 -5l4 -12l-6 -2l-4 12c-10 -3 -19 -8 -27 -14l15 -20l-10 -8l-15 21c-8 -6 -16 -14 -22 -22l11 -8l-4 -5l-10 8c-6 -8 -10 -17 -14 -27l24 -8l-5 -12l-25 7
+c-3 -10 -3 -19 -3 -30h6v-7h-5c0 -11 2 -20 4 -29l24 7l4 -12l-24 -8c4 -10 8 -19 14 -27l9 7l4 -5l-9 -7c6 -8 13 -16 21 -22l15 21l10 -8l-15 -20c8 -5 17 -11 27 -14l3 11l7 -2l-4 -11c10 -3 18 -4 29 -5v13v6h16v-6v-13c9 1 19 2 29 5l-5 12l6 2l4 -12c10 3 19 8 27 14
+l-15 20l11 8l15 -21c8 6 15 14 21 22l-11 7l4 6l10 -8c6 8 11 17 15 27l-25 8l4 12zM111 128c0 54 27 81 81 81s81 -27 81 -81s-27 -81 -81 -81s-81 27 -81 81z" />
+ <glyph glyph-name="ion-locked" unicode="&#xf200;" horiz-adv-x="384"
+d="M22 -32c-12 0 -22 10 -22 22v212c0 12 10 22 22 22h3h19v31c0 42 17 87 43 115s64 46 105 46v0v0c41 0 79 -18 105 -46s43 -73 43 -115v-31h22c12 0 22 -10 22 -22v-212c0 -12 -10 -22 -22 -22h-340zM97 255v-31h17h155h18v31c0 27 -10 61 -28 80v0v1
+c-18 19 -42 29 -67 29v0v0c-25 0 -49 -10 -67 -29v-1v0c-18 -19 -28 -53 -28 -80z" />
+ <glyph glyph-name="ion-log-in" unicode="&#xf29e;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224c-96 0 -177 60 -209 144h34c9 -20 23 -40 39 -56c36 -36 85 -56 136 -56s100 20 136 56s56 85 56 136s-20 100 -56 136s-85 56 -136 56s-100 -20 -136 -56c-16 -16 -30 -36 -39 -56h-34c32 84 113 144 209 144z
+M175 124l52 52h-227v32h227l-52 52l22 23l91 -91l-91 -91z" />
+ <glyph glyph-name="ion-log-out" unicode="&#xf29f;"
+d="M335 124l52 52h-227v32h227l-52 52l22 23l91 -91l-91 -91zM359 56c3 3 6 5 8 8h41c-40 -58 -108 -96 -184 -96c-124 0 -224 100 -224 224s100 224 224 224c76 0 144 -38 184 -96h-41c-2 3 -5 5 -8 8c-36 36 -84 56 -135 56s-100 -20 -136 -56s-56 -85 -56 -136
+s20 -100 56 -136s85 -56 136 -56s99 20 135 56z" />
+ <glyph glyph-name="ion-loop" unicode="&#xf201;" horiz-adv-x="334"
+d="M184 148v-58c49 8 86 50 86 102c0 16 -4 30 -10 44c-3 6 -5 12 -9 17l47 43c1 -1 2 -3 3 -4c21 -28 33 -62 33 -100v-4c-2 -72 -47 -131 -111 -154c-12 -4 -26 -8 -39 -9v-57l-76 67l-26 23l44 39zM0 196c2 72 48 133 113 155c12 4 24 7 37 8v57l76 -67l26 -23l-44 -39
+l-59 -51l1 58c-49 -8 -86 -51 -86 -102c0 -16 4 -31 10 -45c3 -6 5 -11 9 -16l-47 -44c-1 2 -2 3 -3 5c-20 28 -33 63 -33 100v4z" />
+ <glyph glyph-name="ion-magnet" unicode="&#xf2a0;" horiz-adv-x="384"
+d="M192 416c115 0 192 -78 192 -200c0 -49 -3 -77 -15 -128c-16 -66 -39 -113 -39 -113v-1c-2 -3 -6 -6 -10 -6c-1 0 -3 1 -4 1l-2 1l-50 20l-2 1c-3 2 -5 5 -5 9c0 1 0 3 1 4v1c7 16 27 59 37 101s13 63 13 108c0 71 -52 122 -116 122s-116 -51 -116 -122
+c0 -45 3 -66 13 -108s30 -85 37 -101v-1c1 -1 1 -3 1 -4c0 -4 -2 -7 -5 -9l-2 -1l-50 -20l-2 -1c-1 0 -3 -1 -4 -1c-4 0 -8 3 -10 6v1s-24 47 -40 113c-12 51 -14 79 -14 128c0 122 77 200 192 200zM109 4c-9 19 -27 59 -36 98l-42 -12c13 -53 30 -92 35 -104l43 17v1z
+M317 -14c5 12 23 51 36 104l-43 12c-9 -39 -26 -79 -35 -98v-1z" />
+ <glyph glyph-name="ion-male" unicode="&#xf2a1;"
+d="M448 256l-63 63l-69 -69c22 -30 36 -66 36 -106c0 -97 -79 -176 -176 -176s-176 79 -176 176s79 176 176 176c40 0 76 -14 106 -36l69 69l-63 63h160v-160zM266 54c24 24 38 56 38 90s-14 66 -38 90s-56 38 -90 38s-66 -14 -90 -38s-38 -56 -38 -90s14 -66 38 -90
+s56 -38 90 -38s66 14 90 38z" />
+ <glyph glyph-name="ion-man" unicode="&#xf202;" horiz-adv-x="168"
+d="M84 341c-21 0 -37 17 -37 38s16 37 37 37s37 -16 37 -37s-16 -38 -37 -38zM121 333c28 0 47 -24 47 -48v-114c0 -22 -32 -22 -32 0v105h-5v-286c0 -28 -41 -31 -43 0v165h-1h-7v-165c-1 -29 -43 -30 -43 0v286h-6v-105c0 -22 -31 -22 -31 0v114c0 24 19 48 47 48h37h37z
+" />
+ <glyph glyph-name="ion-map" unicode="&#xf203;"
+d="M441 311c4 -3 7 -8 7 -14v-281c0 -6 -2 -11 -7 -14c-2 -1 -5 -2 -7 -2c-3 0 -6 0 -8 2l-97 66l-97 -66c-5 -3 -10 -3 -15 0l-97 66l-97 -66c-5 -3 -10 -3 -15 0s-8 8 -8 14v281c0 6 3 11 7 14l105 71c5 3 10 3 15 0l97 -66l98 66c5 3 10 3 15 0zM103 95v242l-71 -50v-242
+zM135 95l73 -49v129l-4 -11c-7 2 -13 6 -20 10l8 13c5 -3 11 -6 16 -8v109l-73 49v-101c4 -2 9 -4 13 -7l-10 -13c-1 1 -2 1 -3 2v-123zM240 46l73 49v109c0 -1 -1 -1 -1 -2l-6 -6l-12 11l6 6c3 3 5 7 8 10l5 -5v119l-73 -49v-112h7l3 -15c-3 0 -6 -1 -9 -1h-1v-114zM416 46
+v242l-71 49v-88c3 1 5 1 8 2l4 -16c-4 -1 -8 -1 -12 -3v-137zM97 227c-3 -1 -11 -5 -14 -7l-11 12c4 3 8 6 12 8c3 2 6 3 9 4l5 -15c-2 -1 1 -1 -1 -2zM265 182c5 3 10 5 15 10l11 -12c-6 -6 -12 -10 -19 -13zM67 192v-1l-15 5v1c2 7 4 13 9 20l13 -9c-4 -5 -5 -10 -7 -16z
+M166 210c3 -4 7 -8 11 -11l-11 -12c-4 4 -8 9 -12 13l-3 3l12 11c1 -1 2 -3 3 -4zM376 218l-11 12l10 10l-10 10l11 12l10 -11l11 11l11 -12l-10 -10l10 -10l-11 -12l-11 11z" />
+ <glyph glyph-name="ion-medkit" unicode="&#xf2a2;"
+d="M440 304c4 0 8 -4 8 -8v-288c0 -4 -4 -8 -8 -8h-432c-4 0 -8 4 -8 8v288c0 4 4 8 8 8h120v31c1 28 22 49 51 49h45h45c30 0 50 -21 51 -49v-31h120zM160 331v-27h128v27v1v1c0 10 -9 19 -19 19h-45h-45c-10 0 -19 -9 -19 -19v-1v-1zM320 128v64h-64v64h-64v-64h-64v-64
+h64v-64h64v64h64z" />
+ <glyph glyph-name="ion-merge" unicode="&#xf33f;" horiz-adv-x="384"
+d="M320 224c35 0 64 -29 64 -64s-29 -64 -64 -64c-24 0 -44 13 -55 32h-10c-61 0 -115 25 -159 74v-115c19 -11 32 -31 32 -55c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 24 13 44 32 55v210c-19 11 -32 31 -32 55c0 35 29 64 64 64s64 -29 64 -64c0 -19 -8 -37 -22 -49
+c4 -9 17 -35 37 -58c32 -35 70 -53 112 -53h10c11 19 31 32 55 32zM64 384c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM64 0c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM320 128c18 0 32 14 32 32s-14 32 -32 32
+s-32 -14 -32 -32s14 -32 32 -32z" />
+ <glyph glyph-name="ion-mic-a" unicode="&#xf204;" horiz-adv-x="288"
+d="M0 210c0 10 9 19 20 19s19 -9 19 -19v-14c0 -28 12 -53 31 -72s45 -31 74 -31s55 12 74 31s31 44 31 72v14c0 10 8 19 19 19s20 -9 20 -19v-14c0 -66 -46 -120 -108 -136c-1 0 -3 -1 -4 -1c-6 -2 -10 -7 -12 -13v-58c0 -11 -9 -20 -20 -20v0c-11 0 -20 9 -20 20v58
+c-2 6 -6 11 -12 13c-1 0 -3 1 -4 1c-62 16 -108 70 -108 136v14zM67 340c0 42 34 76 77 76s78 -34 78 -76v-144c0 -42 -35 -75 -78 -75s-77 33 -77 75v144z" />
+ <glyph glyph-name="ion-mic-b" unicode="&#xf205;" horiz-adv-x="160"
+d="M80 416c35 0 65 -23 76 -59c6 -18 4 -45 2 -55s-8 -20 -14 -28c-3 -4 -7 -7 -11 -9c-1 0 -1 -1 -2 -1c-3 -1 -6 -2 -10 -3c-12 -3 -25 -5 -39 -5v0h-1h-1v0c-14 0 -29 2 -41 5c-4 1 -7 2 -10 3c-1 0 -1 1 -2 1c-4 2 -8 5 -11 9c-6 8 -12 18 -14 28s-4 37 2 55
+c11 36 41 59 76 59zM119 247c6 0 12 -5 12 -12v-2c-5 -67 -18 -241 -19 -252c0 0 -3 -13 -32 -13v0c-29 0 -32 13 -32 13c-1 11 -13 185 -18 252v2c0 7 5 12 11 12h1c1 0 1 -1 2 -1c2 0 4 -1 6 -1c9 -2 21 -2 31 -2s20 0 29 2c2 0 4 1 6 1c1 0 1 1 2 1h1zM90 166v33
+c0 6 -4 11 -10 11s-10 -5 -10 -11v-33c0 -6 4 -11 10 -11s10 5 10 11z" />
+ <glyph glyph-name="ion-mic-c" unicode="&#xf206;" horiz-adv-x="256"
+d="M201 416c30 0 55 -23 55 -52v-28h-59v-37h59v-43h-59v-37h59v-43h-59v-37h59v-42c0 -29 -25 -52 -55 -52h-30v-77h-86v77h-30c-30 0 -55 23 -55 52v42h152v37h-152v43h152v37h-152v43h152v37h-152v28c0 29 25 52 55 52h146z" />
+ <glyph glyph-name="ion-minus-circled" unicode="&#xf207;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM352 176v32h-256v-32h256z" />
+ <glyph glyph-name="ion-minus-round" unicode="&#xf208;" horiz-adv-x="384"
+d="M353 224c17 0 31 -14 31 -32s-14 -32 -31 -32h-322c-17 0 -31 14 -31 32s14 32 31 32h322z" />
+ <glyph glyph-name="ion-minus" unicode="&#xf209;" horiz-adv-x="384"
+d="M0 160v64h384v-64h-384z" />
+ <glyph glyph-name="ion-model-s" unicode="&#xf2c1;" horiz-adv-x="512"
+d="M509 57v-8v0v-1v-3v0c0 -3 -1 -5 -1 -7c-1 -12 -2 -18 -6 -20c-3 -2 -6 -2 -10 -2h-43s-10 1 -11 16v8c20 1 39 1 52 0c10 0 13 0 16 6c2 3 2 7 3 11zM3 57c1 -4 1 -8 3 -11c3 -6 6 -6 16 -6c13 1 32 1 52 0v-8c-1 -15 -8 -16 -11 -16h-43s-7 0 -10 2c-4 2 -6 8 -7 20v7
+v0v3v1v0v8zM512 151c0 -31 -2 -58 -2 -68c0 -4 0 -11 -1 -18c-1 -4 -1 -8 -3 -11c-3 -6 -6 -6 -16 -6c-13 1 -32 1 -52 0c-13 0 -27 -2 -39 -2c-30 -1 -21 4 -34 4s-63 -2 -109 -2s-97 2 -110 2s-4 -5 -34 -4c-12 0 -25 2 -38 2c-20 1 -39 1 -52 0c-10 0 -13 0 -16 6
+c-2 3 -2 7 -3 11c-1 7 -1 14 -1 18c0 10 -2 37 -2 68s4 61 6 64c1 2 8 9 26 21s17 10 20 18c-3 1 -5 3 -7 3c-4 0 -4 -3 -12 -3s-24 1 -28 5c-4 3 -5 5 -5 8s2 9 5 13s19 6 27 7s10 0 12 -1c4 -2 3 -22 3 -22l9 -1c5 13 12 41 24 62c13 23 26 30 32 32s10 2 48 6s69 5 96 5
+s58 -1 96 -5s42 -4 48 -6s19 -9 32 -32c12 -21 19 -49 24 -62l9 1s-1 20 3 22c2 1 4 2 12 1s24 -3 27 -7s5 -10 5 -13s-1 -4 -5 -8s-20 -5 -28 -5s-8 3 -12 3c-2 0 -4 -2 -7 -3c3 -8 2 -6 20 -18s25 -19 26 -21c2 -3 6 -33 6 -64zM86 303c-5 -11 -11 -33 -10 -36
+s-1 -5 15 -4s117 3 165 3s149 -2 165 -3s14 1 15 4s-5 25 -10 36s-17 31 -26 37c-2 1 -17 7 -54 9c-34 2 -72 3 -90 3s-56 -1 -90 -3c-37 -2 -52 -8 -54 -9c-7 -4 -21 -26 -26 -37zM123 178c7 2 11 2 11 2s-17 16 -48 25s-49 11 -66 10c0 0 -3 -16 0 -27s8 -10 16 -12
+s13 -5 16 -4s7 4 12 4s29 -4 38 -4s14 4 21 6zM358 99c15 2 34 19 21 33c-18 19 -15 19 -55 24c-35 4 -61 4 -68 4s-33 0 -68 -4c-40 -5 -37 -5 -55 -24c-13 -14 6 -31 21 -33c14 -2 74 -3 102 -3s88 1 102 3zM492 188c3 11 0 27 0 27c-17 1 -35 -1 -66 -10s-48 -26 -48 -26
+s4 1 11 -1s12 -6 21 -6s33 4 38 4s9 -3 12 -4s8 2 16 4s13 1 16 12z" />
+ <glyph glyph-name="ion-monitor" unicode="&#xf20a;"
+d="M437 384c6 0 11 -5 11 -11v-266c0 -6 -5 -11 -11 -11h-426c-6 0 -11 5 -11 11v266c0 6 5 11 11 11h426zM416 128v224h-384v-224h384zM270 0h-92c-28 0 -42 3 -30 12s30 16 30 23c0 4 1 45 1 45h45h45s1 -41 1 -45c0 -7 18 -14 30 -23s-2 -12 -30 -12z" />
+ <glyph glyph-name="ion-more" unicode="&#xf20b;" horiz-adv-x="384"
+d="M50 144c-28 0 -50 21 -50 48c0 26 22 48 50 48s50 -22 50 -48c0 -27 -22 -48 -50 -48zM192 144c-28 0 -50 21 -50 48c0 26 22 48 50 48s50 -22 50 -48c0 -27 -22 -48 -50 -48zM334 144c-28 0 -50 21 -50 48c0 26 22 48 50 48s50 -22 50 -48c0 -27 -22 -48 -50 -48z" />
+ <glyph glyph-name="ion-mouse" unicode="&#xf340;" horiz-adv-x="256"
+d="M128 416h-1h5h-4zM251 255c2 1 2 1 4 1h1v-176c0 -37 -21 -71 -53 -91c-5 -3 -9 -5 -14 -7v-1v0c-18 -9 -39 -13 -61 -13c-71 0 -128 50 -128 112v176h1c2 0 3 0 5 -1v0c34 -13 76 -23 122 -23s88 10 122 23h1zM189 -18c5 2 10 4 14 7c-5 -3 -9 -5 -14 -7v0v-1v1v0z
+M203 -11c-4 -3 -9 -5 -14 -7c5 2 9 4 14 7zM132 416c69 -2 124 -51 124 -112v-23c-2 -2 -4 -4 -6 -5c-1 -1 -3 0 -4 -1c-23 -10 -50 -16 -82 -19h-1h-2c-11 0 -17 0 -17 10v86c0 9 -7 16 -16 16s-16 -7 -16 -16v-85c0 -11 -6 -11 -17 -11h-2c-32 3 -61 9 -84 19v0
+c-1 0 -1 1 -2 1c-3 1 -5 3 -7 5v23c0 61 57 111 127 112h5z" />
+ <glyph glyph-name="ion-music-note" unicode="&#xf20c;" horiz-adv-x="384"
+d="M362 416c12 0 22 -9 22 -21v-303s-3 -43 -12 -55v0c-9 -15 -25 -21 -43 -21h-37c-28 0 -52 20 -52 48s24 48 52 48h60v192l-208 -38v-232c0 -8 -3 -27 -13 -41c-1 -2 -2 -3 -3 -5c0 -1 -1 -1 -2 -2v0c-9 -11 -23 -18 -38 -18h-37c-28 0 -51 20 -51 48s23 48 51 48v0h61
+v286c1 14 13 28 27 32l218 33s3 1 5 1z" />
+ <glyph glyph-name="ion-navicon-round" unicode="&#xf20d;" horiz-adv-x="384"
+d="M353 224c17 0 31 -14 31 -32s-14 -32 -31 -32h-322c-17 0 -31 14 -31 32s14 32 31 32h322zM353 352c17 0 31 -14 31 -32s-14 -32 -31 -32h-322c-17 0 -31 14 -31 32s14 32 31 32h322zM353 96c17 0 31 -14 31 -32s-14 -32 -31 -32h-322c-17 0 -31 14 -31 32s14 32 31 32
+h322z" />
+ <glyph glyph-name="ion-navicon" unicode="&#xf20e;" horiz-adv-x="320"
+d="M0 175v32h320v-32h-320zM0 271v32h320v-32h-320zM0 79v32h320v-32h-320z" />
+ <glyph glyph-name="ion-navigate" unicode="&#xf2a3;"
+d="M448 416l-192 -448v256h-256z" />
+ <glyph glyph-name="ion-network" unicode="&#xf341;" horiz-adv-x="384"
+d="M384 352c0 -24 -13 -44 -32 -55v-93l-128 -64v-53c19 -11 32 -31 32 -55c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 24 13 44 32 55v53l-128 64v93c-19 11 -32 31 -32 55c0 35 29 64 64 64s64 -29 64 -64c0 -24 -13 -44 -32 -55v-53l96 -48l96 48v53c-19 11 -32 31 -32 55
+c0 35 29 64 64 64s64 -29 64 -64zM64 384c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM192 0c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM320 320c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32z" />
+ <glyph glyph-name="ion-no-smoking" unicode="&#xf2c2;"
+d="M328 144v48h16v-48h-16zM80 144v48h90l48 -48h-138zM332 388c69 -38 116 -112 116 -196c0 -124 -100 -224 -224 -224c-24 0 -47 4 -68 11c-2 1 -3 1 -5 2c-12 4 -24 9 -35 15h-1c-69 38 -115 112 -115 196c0 124 100 224 224 224c24 0 47 -4 68 -11c2 -1 3 -1 5 -2
+c12 -4 24 -9 35 -15v0zM224 22c37 0 72 12 100 32l-238 238c-20 -28 -32 -63 -32 -100c0 -65 36 -121 90 -150c6 -3 13 -7 19 -9c2 -1 3 -1 5 -2c9 -3 19 -5 29 -7c9 -2 18 -2 27 -2zM362 93c20 28 32 62 32 99c0 66 -37 123 -91 151c-6 3 -12 6 -18 8c-2 1 -3 1 -5 2
+c-9 3 -19 5 -29 7c-9 2 -18 2 -27 2c-37 0 -71 -12 -99 -32zM320 150l-42 42h42v-42zM352 144v48h16v-48h-16zM328 235c16 -7 16 -27 16 -34v-1h-16v1c0 8 -1 17 -7 20c-4 2 -13 4 -39 4h-3c-13 0 -24 0 -33 13c-5 8 -5 19 -2 29c-4 1 -8 1 -12 3c-17 7 -26 20 -26 38
+c0 33 27 44 39 44v-16c-1 0 -23 -2 -23 -28c0 -11 5 -19 16 -23c9 -4 18 -3 18 -3c3 0 6 -2 7 -5s2 -6 0 -8c-5 -7 -7 -18 -4 -22c4 -6 7 -6 20 -6h3c24 0 37 -2 46 -6zM368 200v0h-16c0 28 -4 41 -7 46c-6 10 -14 14 -25 14h-30c-3 0 -5 2 -6 4s-1 6 0 8c0 0 8 18 6 32
+c-1 8 -6 17 -27 17v16c24 0 40 -11 43 -30c2 -11 0 -23 -3 -31h17c16 0 30 -8 39 -22c6 -10 9 -28 9 -54z" />
+ <glyph glyph-name="ion-nuclear" unicode="&#xf2a4;"
+d="M176 176c0 32 16 48 48 48s48 -16 48 -48s-16 -48 -48 -48s-48 16 -48 48zM176 176c0 32 16 48 48 48s48 -16 48 -48s-16 -48 -48 -48s-48 16 -48 48zM448 176c0 -27 -5 -53 -15 -78s-23 -47 -40 -66s-36 -35 -59 -48l-79 136c22 12 33 31 33 56h160zM224 240
+c-12 0 -23 -3 -33 -9l-80 138c35 20 73 31 113 31s78 -10 113 -30l-81 -139c-10 6 -21 9 -32 9zM160 176c0 -25 11 -44 33 -56l-79 -136c-35 20 -62 46 -83 80s-31 71 -31 112h160z" />
+ <glyph glyph-name="ion-outlet" unicode="&#xf342;"
+d="M338 416c61 0 110 -51 110 -113v-222c0 -62 -49 -113 -110 -113h-228c-61 0 -110 51 -110 113v222c0 62 49 113 110 113h228zM143 197v102c0 11 -9 21 -20 21h-23c-11 0 -19 -9 -20 -20v-2v-101v-1c0 -11 9 -20 20 -20h23c11 0 20 9 20 20v1zM265 52v29
+c0 23 -18 42 -41 42s-41 -19 -41 -42v-29v0c0 -11 9 -20 20 -20h21h21c11 0 20 7 20 18v2zM368 197v102c0 11 -9 21 -20 21h-24c-11 0 -19 -9 -20 -20v-2v-101v-1c0 -11 9 -20 20 -20h24c11 0 20 9 20 20v1z" />
+ <glyph glyph-name="ion-paintbrush" unicode="&#xf4d5;"
+d="M118 165c52 0 102 -41 90 -102c-11 -52 -54 -71 -90 -77c-30 -5 -100 0 -118 35c24 9 34 26 34 49c0 49 32 95 84 95zM436 388c13 -13 17 -30 5 -45l-154 -175c2 -9 1 -17 -3 -23l-50 -58v0v0c-2 -2 -4 -2 -6 0c-1 1 -1 2 -1 3v1c2 53 -41 87 -89 90v0h-2s-2 0 -2 1
+c-2 2 -2 4 0 6l59 49c6 4 14 4 23 2l175 154c15 12 32 8 45 -5zM134 188v0v0v0z" />
+ <glyph glyph-name="ion-paintbucket" unicode="&#xf4d6;" horiz-adv-x="480"
+d="M112 384l32 32l275 -276l-58 -12l-163 -160l-198 192l152 152zM309 160l-110 110l-110 -110h220zM419 140c0 0 61 -66 61 -99s-27 -60 -61 -60s-60 27 -60 60s60 99 60 99z" />
+ <glyph glyph-name="ion-paper-airplane" unicode="&#xf2c3;"
+d="M0 176l448 240l-112 -448l-112 112l-80 -112l-16 160zM319 31l80 323l-322 -173l83 -31l192 154l-128 -176z" />
+ <glyph glyph-name="ion-paperclip" unicode="&#xf20f;" horiz-adv-x="160"
+d="M149 293c6 0 11 -5 11 -12v-195c0 -28 -10 -49 -24 -63c-15 -15 -36 -23 -56 -23c-40 0 -80 31 -80 88v234c0 24 11 44 29 54s39 11 57 0s29 -30 29 -54l-1 -225c0 -13 -3 -24 -9 -32s-16 -12 -25 -12c-17 0 -34 15 -34 44v173c0 6 6 12 12 12s11 -6 11 -12v-173
+c0 -14 5 -21 11 -21c2 0 5 2 7 4c3 4 5 10 5 17v225c0 15 -6 28 -17 34s-24 6 -35 0s-17 -19 -17 -34v-234c0 -44 29 -64 57 -64s57 19 57 63v195c0 6 6 11 12 11z" />
+ <glyph glyph-name="ion-pause" unicode="&#xf210;" horiz-adv-x="256"
+d="M96 12c0 -7 -5 -12 -12 -12h-72c-7 0 -12 5 -12 12v360c0 7 5 12 12 12h72c7 0 12 -5 12 -12v-360zM244 384c7 0 12 -5 12 -12v-360c0 -7 -5 -12 -12 -12h-72c-7 0 -12 5 -12 12v360c0 7 5 12 12 12h72z" />
+ <glyph glyph-name="ion-person-add" unicode="&#xf211;"
+d="M397 120h-42v51h-51v42h51v51h42v-51h51v-42h-51v-51zM384 0h-192h-192s0 26 2 40c2 11 17 25 81 49c63 23 60 12 60 55c0 28 -14 11 -23 64c-4 21 -6 7 -14 40c-4 17 3 19 2 27s-2 16 -4 33c-2 21 18 76 88 76s90 -55 88 -76c-2 -17 -3 -25 -4 -33s6 -10 2 -27
+c-8 -33 -10 -19 -14 -40c-9 -53 -23 -36 -23 -64c0 -43 -3 -32 60 -55c64 -24 79 -38 81 -49c2 -14 2 -40 2 -40z" />
+ <glyph glyph-name="ion-person-stalker" unicode="&#xf212;"
+d="M393 123c42 -16 52 -26 53 -33c2 -9 2 -90 2 -90h-98c0 18 0 71 -1 77c-1 10 -1 29 -55 50c-8 3 -14 5 -19 7c18 8 15 15 15 28c0 19 -9 11 -15 47c-2 14 -4 5 -9 28c-3 12 1 12 1 18s-1 10 -2 22c-1 14 11 52 57 52s59 -38 58 -52c-1 -12 -2 -16 -2 -22
+c-1 -6 4 -6 1 -18c-5 -23 -7 -14 -9 -28c-6 -36 -16 -28 -16 -47c0 -29 -2 -23 39 -39zM325 0h-163h-162s0 65 2 77c2 10 15 22 69 43c54 20 50 17 50 55c0 24 -12 8 -20 54c-3 18 -5 7 -11 36c-3 15 2 16 1 23s-2 14 -3 29c-2 19 15 67 74 67s77 -49 75 -67
+c-1 -15 -2 -22 -3 -29s5 -8 2 -23c-6 -29 -9 -18 -12 -36c-8 -46 -20 -30 -20 -54c0 -32 -2 -36 31 -48c6 -2 11 -4 19 -7c54 -21 67 -33 69 -43c1 -6 2 -28 2 -47v-30z" />
+ <glyph glyph-name="ion-person" unicode="&#xf213;" horiz-adv-x="384"
+d="M384 0h-192h-192s0 26 2 40c2 11 17 25 81 49c63 23 60 12 60 55c0 28 -14 11 -23 64c-4 21 -6 7 -14 40c-4 17 3 19 2 27s-2 16 -4 33c-2 21 18 76 88 76s90 -55 88 -76c-2 -17 -3 -25 -4 -33s6 -10 2 -27c-8 -33 -10 -19 -14 -40c-9 -53 -23 -36 -23 -64
+c0 -43 -3 -32 60 -55c64 -24 79 -38 81 -49c2 -14 2 -40 2 -40z" />
+ <glyph glyph-name="ion-pie-graph" unicode="&#xf2a5;"
+d="M1 192c0 5 -1 11 -1 16c0 115 93 208 208 208c5 0 11 -1 16 -1v-32v-191h-191h-32zM78 46c-26 32 -42 71 -45 114h223v223c43 -3 82 -19 114 -45c47 -38 78 -96 78 -162c0 -115 -93 -208 -208 -208c-66 0 -124 31 -162 78z" />
+ <glyph glyph-name="ion-pin" unicode="&#xf2a6;" horiz-adv-x="224"
+d="M188 220c20 -10 36 -31 36 -55c0 -17 -3 -21 -15 -21h-81l-12 -176h-8l-12 176h-81c-12 0 -15 5 -15 21c0 24 16 45 36 55v0c1 0 3 1 4 2c7 4 12 11 14 19l18 118v5c0 7 -4 10 -10 13v0c-1 0 -1 1 -2 1c-7 3 -12 9 -12 17c0 20 6 21 18 21h92c12 0 18 -1 18 -21
+c0 -8 -5 -14 -12 -17c-1 0 -1 -1 -2 -1v0c-6 -3 -10 -6 -10 -13v-5l18 -118c2 -8 7 -15 14 -19c1 -1 3 -2 4 -2v0z" />
+ <glyph glyph-name="ion-pinpoint" unicode="&#xf2a7;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c32 32 51 75 55 120l-63 8v16l63 8c-4 45 -23 88 -55 120s-75 51 -120 55l-8 -63h-16l-8 63c-45 -4 -88 -23 -120 -55s-51 -75 -55 -120l63 -8v-16l-63 -8
+c4 -45 23 -88 55 -120s75 -51 120 -55l8 63h16l8 -63c45 4 88 23 120 55z" />
+ <glyph glyph-name="ion-pizza" unicode="&#xf2a8;" horiz-adv-x="352"
+d="M315 318c10 -4 12 -13 9 -20l-148 -330s-143 320 -148 331s2 16 9 19c39 18 90 28 139 28s96 -9 139 -28zM112 256c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM176 109c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM240 224
+c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM342 382c6 -3 10 -6 10 -13c0 -1 0 -3 -1 -5l-8 -19c-3 -5 -8 -9 -14 -9c-1 0 -3 1 -6 2c-41 18 -95 30 -147 30s-102 -11 -147 -30c-3 -1 -4 -2 -6 -2c-6 0 -11 4 -14 9l-8 19s-1 2 -1 5c0 8 6 12 10 14
+c49 21 107 33 166 33s118 -13 166 -34z" />
+ <glyph glyph-name="ion-plane" unicode="&#xf214;"
+d="M250 136c0 -7 1 -69 -6 -102c-1 -4 3 -4 5 -7l51 -33c2 -2 3 -8 3 -8l1 -18l-68 16l-12 -32l-12 32l-68 -16l1 18s0 6 2 8l52 33c2 3 6 3 5 7c-7 33 -6 95 -6 102s-8 5 -8 5l-62 -13l-128 -49c0 23 2 26 9 31l183 131s5 63 5 113c0 24 12 78 27 78s27 -54 27 -78
+c0 -53 5 -113 5 -113l183 -131c6 -4 9 -7 9 -31l-128 49l-62 13s-8 2 -8 -5z" />
+ <glyph glyph-name="ion-planet" unicode="&#xf343;" horiz-adv-x="512"
+d="M96 182c39 -24 85 -48 134 -69c44 -19 87 -35 126 -46c-27 -22 -62 -35 -100 -35c-85 0 -155 66 -160 150zM107 251c1 4 3 8 5 11c10 21 26 40 44 55c27 22 62 35 100 35c85 0 155 -66 160 -150v-10c0 -21 -4 -41 -11 -59c-1 -4 -3 -8 -5 -11c-6 1 -13 3 -19 5
+c-39 11 -82 26 -126 45c-56 24 -108 52 -148 79zM430 163c57 -35 87 -62 81 -82c-4 -12 -19 -17 -44 -17c-50 0 -136 23 -231 64c-141 61 -246 140 -235 175c4 12 20 20 44 17c22 -3 47 -9 73 -18c-8 -9 -8 -12 -14 -22c-23 5 -44 8 -59 8h-6c2 -2 5 -6 8 -9
+c11 -11 27 -24 46 -37c41 -29 97 -59 156 -85c44 -19 89 -35 128 -46c36 -10 68 -15 90 -15h6c-2 2 -5 6 -8 9c-10 10 -24 22 -41 34c4 11 5 12 6 24z" />
+ <glyph glyph-name="ion-play" unicode="&#xf215;" horiz-adv-x="320"
+d="M309 215c7 -6 11 -14 11 -23s-4 -17 -11 -23l-278 -166c-4 -2 -7 -3 -11 -3c-11 0 -20 9 -20 20v0v344v0c0 11 9 20 20 20c4 0 8 -1 11 -3z" />
+ <glyph glyph-name="ion-playstation" unicode="&#xf30a;" horiz-adv-x="512"
+d="M400 245c0 -11 0 -22 -2 -33c-2 -10 -5 -20 -10 -28c-4 -7 -10 -13 -18 -17c-7 -4 -16 -6 -24 -6c-13 0 -31 4 -42 9v131v2c0 9 -7 17 -15 17h-1c-9 0 -16 -8 -16 -17v-3v-300l-80 26v358s28 -4 75 -18s67 -21 84 -31c8 -5 15 -11 21 -17c7 -7 13 -14 17 -23
+c8 -16 10 -33 11 -50zM87 90c-4 -2 -8 -3 -11 -6c-1 -1 -3 -3 -2 -5s4 -4 6 -5c6 -2 13 -3 19 -3c7 0 15 0 22 2c5 1 9 3 14 5c30 10 41 12 41 12v-42c-14 -2 -36 -4 -50 -4c-30 -1 -60 4 -88 13c-9 3 -19 6 -27 12c-4 3 -8 8 -10 13c-2 4 -1 9 1 13s5 8 9 11
+c9 6 18 10 28 14c8 4 17 7 26 10c35 12 111 37 111 37v-47s-62 -20 -89 -30zM512 102c0 -5 -2 -9 -5 -13c-6 -7 -14 -11 -22 -15s-17 -8 -26 -11c-54 -19 -171 -59 -171 -59v48s92 30 133 44c6 2 11 4 16 8c2 2 4 3 3 6c-1 2 -4 4 -6 5c-6 2 -13 3 -19 3
+c-10 0 -20 -2 -30 -5c-29 -10 -97 -32 -97 -32v49s45 14 67 16c8 1 23 1 31 1c26 0 54 -3 79 -11c5 -2 8 -3 14 -5c9 -3 18 -8 25 -14c4 -4 8 -9 8 -15z" />
+ <glyph glyph-name="ion-plus-circled" unicode="&#xf216;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM352 176v32h-112v112h-32v-112h-112v-32h112v-112h32v112h112z" />
+ <glyph glyph-name="ion-plus-round" unicode="&#xf217;" horiz-adv-x="384"
+d="M353 224c17 0 31 -14 31 -32s-14 -32 -31 -32h-129v-129c0 -17 -14 -31 -32 -31s-32 14 -32 31v129h-129c-17 0 -31 14 -31 32s14 32 31 32h129v129c0 17 14 31 32 31s32 -14 32 -31v-129h129z" />
+ <glyph glyph-name="ion-plus" unicode="&#xf218;" horiz-adv-x="384"
+d="M384 224v-64h-160v-160h-64v160h-160v64h160v160h64v-160h160z" />
+ <glyph glyph-name="ion-podium" unicode="&#xf344;"
+d="M0 0v192h128v-192h-128zM160 0v288h128v-288h-128zM320 0v128h128v-128h-128z" />
+ <glyph glyph-name="ion-pound" unicode="&#xf219;"
+d="M93 96h-93v54h101l13 84h-99v54h107l22 128h64l-22 -128h106l22 128h63l-22 -128h93v-54h-102l-12 -84h99v-54h-107l-22 -128h-63l22 128h-107l-22 -128h-63zM177 234l-12 -84h106l12 84h-106v0z" />
+ <glyph glyph-name="ion-power" unicode="&#xf2a9;"
+d="M224 192c-18 0 -32 14 -32 32v160c0 18 14 32 32 32s32 -14 32 -32v-160c0 -18 -14 -32 -32 -32zM347 379c61 -40 101 -109 101 -187c0 -124 -100 -224 -224 -224s-224 100 -224 224c0 78 40 147 101 187v0c5 3 11 5 17 5c18 0 32 -14 32 -32c0 -6 -2 -12 -5 -17
+c-2 -3 -4 -6 -7 -8c-1 -1 -3 -2 -4 -3c-8 -6 -16 -12 -23 -19c-30 -30 -47 -70 -47 -113s17 -83 47 -113s70 -47 113 -47s83 17 113 47s47 70 47 113s-17 83 -47 113c-7 7 -15 13 -23 19c-1 1 -3 2 -4 3c-3 2 -5 5 -7 8c-3 5 -5 11 -5 17c0 18 14 32 32 32c6 0 12 -2 17 -5
+v0z" />
+ <glyph glyph-name="ion-pricetag" unicode="&#xf2aa;"
+d="M439 187c12 -12 12 -31 0 -43l-165 -167c-11 -11 -30 -11 -42 -1l-3 3l-206 209l-6 5c-6 7 -9 15 -10 24v0v2v0l-7 98v4v0c0 12 4 24 13 33l49 49c8 9 20 13 31 13h4l100 -4v0c12 0 22 -4 30 -12v0l2 -2v0l210 -211v0v0zM112 256c26 0 48 22 48 48s-22 48 -48 48
+s-48 -22 -48 -48s22 -48 48 -48z" />
+ <glyph glyph-name="ion-pricetags" unicode="&#xf2ab;"
+d="M440 209c10 -11 11 -28 0 -39l-29 -29c11 11 10 28 0 39v0v0l-190 191v0l-1 1h-1c-8 7 -16 12 -27 12v0l-90 3h-4c-9 0 -19 -3 -26 -10l28 27c8 8 17 12 27 12h4l90 -4v0c11 0 19 -4 27 -11h1l1 -1v0l190 -191v0v0zM396 166v0c11 -11 11 -29 0 -40l-108 -109v1l-26 -27
+l-2 -2l-13 -13c-10 -10 -26 -10 -37 -1l-3 3l-186 188l-5 5c-5 6 -9 14 -10 22v0v2v0l-6 88v3v1c0 11 4 21 12 29l44 45l1 1l1 1c7 6 17 9 26 9h4l90 -3v0c11 0 19 -4 27 -11v0l2 -1v0l189 -191v0zM79 308c-12 -8 -21 -21 -21 -37c0 -24 19 -43 43 -43c16 0 29 9 37 21
+c4 7 7 14 7 22c0 24 -20 44 -44 44c-8 0 -15 -3 -22 -7z" />
+ <glyph glyph-name="ion-printer" unicode="&#xf21a;"
+d="M392 320c28 0 56 -19 56 -55v-131c0 -31 -28 -54 -56 -54h-40v-112h-8h-8h-224h-11h-5v112h-40c-28 0 -56 24 -56 62v123c0 38 28 55 56 55h40v64h256v-64h40zM336 -16v176h-224v-176h224zM336 320v48h-224v-48h224zM384 256v16h-17v-16h17zM128 112v16h192v-16h-192z
+M128 64v16h192v-16h-192zM128 16v16h192v-16h-192z" />
+ <glyph glyph-name="ion-pull-request" unicode="&#xf345;" horiz-adv-x="384"
+d="M64 384c35 0 64 -29 64 -64c0 -24 -13 -44 -32 -55v-178c19 -11 32 -31 32 -55c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 24 13 44 32 55v178c-19 11 -32 31 -32 55c0 35 29 64 64 64zM64 0c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM64 288
+c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM351 88c20 -11 33 -32 33 -56c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 23 12 44 31 55v156c0 16 -4 26 -11 33c-10 9 -26 12 -52 12v-64l-96 96l96 96v-64c42 1 74 -8 96 -29c21 -19 31 -46 31 -80v-155z
+M320 0c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32z" />
+ <glyph glyph-name="ion-qr-scanner" unicode="&#xf346;" horiz-adv-x="416"
+d="M48 324v-68h-48v68c0 33 28 60 61 60h67v-48h-68c-7 0 -12 -5 -12 -12zM356 384c33 0 60 -27 60 -60v-68h-48v68c0 7 -6 12 -13 12h-67v48h68zM368 61v67h48v-67c0 -33 -27 -61 -60 -61h-68v49h68c7 0 12 5 12 12zM60 49h68v-49h-67c-33 0 -61 28 -61 61v67h48v-67
+c0 -7 5 -12 12 -12z" />
+ <glyph glyph-name="ion-quote" unicode="&#xf347;" horiz-adv-x="384"
+d="M128 384c-41 0 -73 -11 -95 -33s-33 -54 -33 -95v-256h160v256h-96c0 23 5 39 15 49s26 15 49 15zM352 384c-41 0 -73 -11 -95 -33s-33 -54 -33 -95v-256h160v256h-96c0 23 5 39 15 49s26 15 49 15z" />
+ <glyph glyph-name="ion-radio-waves" unicode="&#xf2ac;"
+d="M160 192c0 43 21 64 64 64s64 -21 64 -64s-21 -64 -64 -64s-64 21 -64 64zM112 192c0 -18 5 -35 13 -50s19 -28 33 -37l-23 -25c-6 5 -13 10 -18 16c-25 26 -37 59 -37 96s12 70 37 96c5 6 12 11 18 16l23 -25c-14 -9 -25 -22 -33 -37s-13 -32 -13 -50zM336 192
+c0 18 -5 35 -13 50s-19 28 -33 37l23 25c6 -5 13 -10 18 -16c25 -26 37 -59 37 -96s-12 -70 -37 -96c-5 -6 -12 -11 -18 -16l-23 25c14 9 25 22 33 37s13 32 13 50zM32 192c0 -27 6 -53 17 -77s27 -43 47 -59l-23 -24c-6 5 -12 10 -17 16c-18 19 -31 41 -41 65
+c-10 25 -15 51 -15 79s5 54 15 79c10 24 23 46 41 65c5 6 11 11 17 16l23 -24c-10 -8 -18 -17 -26 -27s-14 -21 -20 -32s-10 -24 -13 -37s-5 -26 -5 -40zM416 192c0 27 -6 53 -17 77s-27 43 -47 59l23 24c6 -5 12 -10 17 -16c18 -19 31 -41 41 -65c10 -25 15 -51 15 -79
+s-5 -54 -15 -79c-10 -24 -23 -46 -41 -65c-4 -5 -10 -10 -17 -16l-23 24c20 16 36 35 47 59s17 50 17 77z" />
+ <glyph glyph-name="ion-record" unicode="&#xf21b;" horiz-adv-x="416"
+d="M208 -16c-115 0 -208 93 -208 208s93 208 208 208s208 -93 208 -208s-93 -208 -208 -208z" />
+ <glyph glyph-name="ion-refresh" unicode="&#xf21c;"
+d="M352 96l-104 112h74c-7 65 -64 112 -130 112c-71 0 -128 -57 -128 -128s57 -128 128 -128c28 0 53 8 75 24l6 5l43 -46l-7 -6c-34 -26 -74 -41 -117 -41c-91 0 -167 64 -187 149v0c0 1 -1 2 -1 3v1v2s-1 2 -1 3v1c0 1 -1 3 -1 4v0c-1 6 -2 13 -2 19v1v4v5v5v4v1
+c0 6 1 13 2 19v0c0 1 1 3 1 4v1c0 1 1 1 1 2v3v1c0 1 1 2 1 3v0c20 85 96 149 187 149v0v0c11 0 21 -1 31 -3h2h2c57 -10 106 -47 133 -96c13 -23 21 -49 23 -77h65z" />
+ <glyph glyph-name="ion-reply-all" unicode="&#xf21d;" horiz-adv-x="416"
+d="M257 256c153 0 159 -208 159 -208c-51 93 -91 102 -159 102v-92l-152 134l152 144v-80zM0 192l144 136v-57l-82 -79l82 -68v-58z" />
+ <glyph glyph-name="ion-reply" unicode="&#xf21e;" horiz-adv-x="384"
+d="M384 48c-53 93 -122 102 -224 102v-92l-160 134l160 144v-80c187 0 224 -208 224 -208z" />
+ <glyph glyph-name="ion-ribbon-a" unicode="&#xf348;" horiz-adv-x="352"
+d="M272 416l80 -96l-64 -134c-24 30 -59 49 -99 53zM80 416l83 -177c-40 -4 -75 -23 -99 -53l-64 134zM189 416h67l-53 -112h-27h-27l-53 112h80h13zM176 224c71 0 128 -57 128 -128s-57 -128 -128 -128s-128 57 -128 128s57 128 128 128zM176 0c53 0 96 43 96 96
+s-43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96zM176 184c49 0 88 -39 88 -88s-39 -88 -88 -88s-88 39 -88 88s39 88 88 88z" />
+ <glyph glyph-name="ion-ribbon-b" unicode="&#xf349;" horiz-adv-x="384"
+d="M192 376c49 0 88 -39 88 -88s-39 -88 -88 -88s-88 39 -88 88s39 88 88 88zM192 416c71 0 128 -57 128 -128s-57 -128 -128 -128s-128 57 -128 128s57 128 128 128zM192 192c53 0 96 43 96 96s-43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96zM83 194c26 -30 65 -50 109 -50
+c12 0 23 1 34 4l-34 -74l-48 -106l-48 80h-96zM301 194l83 -146h-96l-48 -80l-40 88l45 98c22 9 41 23 56 40z" />
+ <glyph glyph-name="ion-sad-outline" unicode="&#xf4d7;"
+d="M367 164c3 -9 -2 -17 -11 -19c-3 -1 -7 0 -10 1c-5 2 -9 5 -11 10s-4 12 -13 15s-14 0 -19 -3c-4 -3 -10 -3 -15 -1c-3 1 -7 3 -9 6c-6 8 -3 17 5 22c15 9 29 13 49 6s29 -21 34 -37zM165 195c8 -5 10 -14 4 -22c-2 -3 -6 -5 -9 -6c-5 -2 -11 -2 -15 1c-5 3 -10 6 -19 3
+s-11 -10 -13 -15s-6 -8 -11 -10c-3 -1 -7 -2 -10 -1c-9 2 -14 10 -11 19c5 16 14 30 34 37s35 3 50 -6zM224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c36 36 56 85 56 136s-20 100 -56 136s-85 56 -136 56
+s-100 -20 -136 -56s-56 -85 -56 -136s20 -100 56 -136s85 -56 136 -56s100 20 136 56zM317 89c5 -7 3 -17 -4 -22c-3 -2 -6 -3 -9 -3c-5 0 -10 3 -13 7c0 0 -19 25 -67 25s-67 -25 -67 -25c-3 -4 -8 -7 -13 -7c-3 0 -6 1 -9 3c-7 5 -9 15 -4 22c1 2 28 39 93 39
+s92 -37 93 -39z" />
+ <glyph glyph-name="ion-sad" unicode="&#xf34a;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM113 156c2 5 4 12 13 15s14 0 19 -3c4 -3 10 -3 15 -1c3 1 7 3 9 6c6 8 4 17 -4 22c-15 9 -30 13 -50 6s-29 -21 -34 -37c-3 -9 2 -17 11 -19c3 -1 7 0 10 1c5 2 9 5 11 10z
+M313 67c7 5 9 15 4 22c-1 2 -28 39 -93 39s-92 -37 -93 -39c-5 -7 -3 -17 4 -22c3 -2 6 -3 9 -3c5 0 10 3 13 7c0 0 19 25 67 25s67 -25 67 -25c3 -4 8 -7 13 -7c3 0 6 1 9 3zM356 145c9 2 14 10 11 19c-5 16 -14 30 -34 37s-34 3 -49 -6c-8 -5 -11 -14 -5 -22
+c2 -3 6 -5 9 -6c5 -2 11 -2 15 1c5 3 10 6 19 3s11 -10 13 -15s6 -8 11 -10c3 -1 7 -2 10 -1z" />
+ <glyph glyph-name="ion-scissors" unicode="&#xf34b;" horiz-adv-x="384"
+d="M341 332c-13 -33 -117 -172 -117 -172l-32 -32s-31 -13 -50 -43s-33 -71 -33 -71v0c-7 -26 -28 -46 -53 -46c-31 0 -56 29 -56 64s25 64 56 64c13 0 25 -5 34 -13c2 -1 3 -3 4 -4v0l2 -2c4 -4 7 -2 14 11c8 15 17 35 27 54s38 59 38 59l17 23l144 192
+c23 -20 18 -51 5 -84zM56 0c15 0 28 14 28 32s-13 32 -28 32s-28 -14 -28 -32s13 -32 28 -32zM192 160c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM143 183c-30 41 -90 125 -100 149c-13 33 -18 64 5 84l134 -178l-3 -4v0v0l-17 -23v-1v0
+c-1 -1 -10 -13 -19 -27zM328 96c31 0 56 -29 56 -64s-25 -64 -56 -64c-25 0 -47 20 -54 46v0s-13 41 -32 71c-11 17 -26 28 -36 35l29 29l1 1h1c1 1 1 2 2 4c3 -4 5 -9 7 -12c10 -19 20 -39 28 -54c7 -13 10 -15 14 -11c1 1 0 1 1 2h1c1 1 2 3 4 4c9 8 21 13 34 13zM328 0
+c15 0 28 14 28 32s-13 32 -28 32s-28 -14 -28 -32s13 -32 28 -32z" />
+ <glyph glyph-name="ion-search" unicode="&#xf21f;" horiz-adv-x="384"
+d="M381 61c4 -4 4 -10 0 -14l-43 -44c-2 -2 -5 -3 -8 -3s-5 1 -7 3l-84 86c-25 -15 -52 -23 -80 -23c-87 0 -159 71 -159 159s72 159 159 159s158 -71 158 -159c0 -27 -7 -54 -21 -78zM159 322c-53 0 -97 -43 -97 -97s44 -97 97 -97s96 43 96 97s-43 97 -96 97z" />
+ <glyph glyph-name="ion-settings" unicode="&#xf2ad;" horiz-adv-x="416"
+d="M402 310c10 -6 15 -25 14 -36c-1 -17 -7 -36 -25 -54c-1 -1 -2 -1 -3 -2c-26 -25 -62 -30 -94 -20c-1 1 -2 2 -4 2c-5 1 -10 0 -13 -4l-36 -39c52 -50 107 -96 107 -96c2 -2 2 -5 0 -7l-50 -51c-2 -2 -5 -2 -7 0c0 0 -44 55 -93 107l-92 -98c-14 -16 -40 -15 -55 0
+c-15 16 -15 42 1 56l97 93l-12 12c-2 2 -3 7 -1 10l2 5c-25 26 -36 33 -56 32s-36 -13 -48 -28s-10 -52 -8 -62s-7 -6 -12 0c-9 10 -23 50 -6 93s42 69 48 75s16 15 24 21s21 -1 27 5c4 4 5 11 5 16l-4 4c-2 2 -2 5 0 7l31 31c2 2 5 2 7 0l50 -50c2 -2 2 -6 0 -8l-31 -31
+c-2 -2 -5 -2 -7 0l-8 9c-7 0 -15 -5 -17 -10c-3 -6 -6 -21 -3 -33c3 -11 13 -20 36 -43l5 3c4 2 8 1 10 -1c0 0 1 -2 13 -14l38 37c4 3 5 7 4 13c0 2 0 4 -1 5c-10 33 -6 69 19 96l2 2c18 18 36 25 53 26c10 1 30 -5 35 -15l-48 -48l-2 -3l-1 -1c-1 -1 -1 -2 -1 -4
+s0 -3 1 -5l2 -2l2 -2l41 -42l3 -3l1 -1c1 -1 2 -1 4 -1s3 0 4 1l2 1l2 3z" />
+ <glyph glyph-name="ion-share" unicode="&#xf220;" horiz-adv-x="384"
+d="M288 70v59l38 31v-109c0 -11 -8 -19 -19 -19h-288c-11 0 -19 9 -19 19v218c0 11 8 19 19 19h120c-29 -18 -43 -38 -43 -38h-58v-180h250zM256 224c-84 0 -116 -24 -160 -96c0 0 5 164 160 164v60l128 -96l-128 -96v64z" />
+ <glyph glyph-name="ion-shuffle" unicode="&#xf221;"
+d="M338 267c-52 0 -83 -43 -120 -92c-41 -55 -88 -120 -171 -120h-47v63h47c52 0 84 47 121 96c41 55 87 116 170 116h29v54l81 -81l-81 -84v48h-29zM121 230c-21 21 -42 35 -74 36c-34 1 -47 0 -47 0v63h47c48 0 83 -20 113 -48c-10 -12 -19 -24 -28 -36
+c-4 -5 -7 -10 -11 -15zM367 118v47l81 -84l-81 -81v54h-29c-50 0 -87 23 -117 53c12 14 22 28 32 41c2 3 5 6 7 9c22 -24 46 -39 78 -39h29z" />
+ <glyph glyph-name="ion-skip-backward" unicode="&#xf222;" horiz-adv-x="384"
+d="M12 352h8c7 0 12 -5 12 -12v-113l187 122c2 2 5 3 8 3c8 0 16 -7 16 -17v-63l118 78c2 2 5 2 8 2c8 0 15 -7 15 -17v-286c0 -10 -7 -17 -15 -17c-3 0 -5 1 -8 3l-118 78v-64c0 -10 -8 -17 -16 -17c-3 0 -5 1 -8 3l-187 122v-113c0 -7 -5 -12 -12 -12h-8
+c-7 0 -12 5 -12 12v296c0 7 5 12 12 12z" />
+ <glyph glyph-name="ion-skip-forward" unicode="&#xf223;" horiz-adv-x="384"
+d="M372 352c7 0 12 -5 12 -12v-296c0 -7 -5 -12 -12 -12h-8c-7 0 -12 5 -12 12v113l-187 -122c-3 -2 -5 -3 -8 -3c-8 0 -15 7 -15 17v64l-119 -78c-3 -2 -5 -3 -8 -3c-8 0 -15 7 -15 17v286c0 10 7 17 15 17c3 0 6 0 8 -2l119 -78v63c0 10 7 17 15 17c3 0 6 -1 8 -3
+l187 -122v113c0 7 5 12 12 12h8z" />
+ <glyph glyph-name="ion-social-android-outline" unicode="&#xf224;" horiz-adv-x="352"
+d="M272 240h-192v-60v-89h24h16v-15v-52c0 -4 4 -8 8 -8s8 4 8 8v52v15h17h49h15v-15v-52c0 -2 1 -4 3 -6h1v0c1 -1 2 -2 4 -2h1v0v0c4 0 7 4 7 8v52v15h17h22v89v60zM288 256v0v-76v-90c0 -7 -3 -15 -10 -15h-29v-51c0 -13 -10 -24 -23 -24v0h-1c-6 0 -11 2 -15 5
+c-5 4 -9 11 -9 19v51h-49v-51c0 -13 -11 -24 -24 -24s-24 11 -24 24v51h-28c-7 0 -12 8 -12 15v90v76h224zM328 256c-4 0 -8 -4 -8 -8v-96c0 -4 4 -8 8 -8s8 4 8 8v96c0 4 -4 8 -8 8zM328 272v0c13 0 24 -11 24 -24v-96c0 -13 -11 -24 -24 -24s-24 11 -24 24v96
+c0 13 11 24 24 24zM24 256c-4 0 -8 -4 -8 -8v-96c0 -4 4 -8 8 -8s8 4 8 8v96c0 4 -4 8 -8 8zM24 272v0c13 0 24 -11 24 -24v-96c0 -13 -11 -24 -24 -24s-24 11 -24 24v96c0 13 11 24 24 24zM175 354c-14 0 -27 -3 -38 -6l-10 -4c-28 -12 -40 -37 -44 -56h186
+c-4 18 -15 43 -44 56l-10 4c-12 4 -25 6 -39 6v0v0h-1zM105 384v0h1l19 -23c13 5 30 9 50 9h1c20 0 36 -4 50 -9l20 23v0s1 -1 2 -1c1 -1 2 -3 2 -3l-19 -22c48 -21 56 -71 57 -86h-224c1 15 9 66 57 87l-19 22c0 1 1 1 2 2zM127 309c-7 0 -14 6 -14 13s6 14 14 14
+c7 0 13 -7 13 -14s-5 -13 -13 -13zM225 309c-7 0 -13 6 -13 13s5 14 13 14c7 0 13 -7 13 -14s-6 -13 -13 -13z" />
+ <glyph glyph-name="ion-social-android" unicode="&#xf225;" horiz-adv-x="352"
+d="M64 180v76h224v-76v-90c0 -7 -4 -14 -11 -14h-28v-52c0 -13 -11 -24 -24 -24v0h-1c-6 0 -10 2 -14 5c-5 4 -9 11 -9 19v52h-49v-52c0 -13 -11 -24 -24 -24s-24 11 -24 24v52h-29c-7 0 -11 7 -11 14v90zM328 272c13 0 24 -11 24 -24v-96c0 -13 -11 -24 -24 -24
+s-24 11 -24 24v96c0 13 11 24 24 24zM24 272c13 0 24 -11 24 -24v-96c0 -13 -11 -24 -24 -24s-24 11 -24 24v96c0 13 11 24 24 24zM231 359c48 -21 56 -72 57 -87h-224c1 15 8 66 56 87l-18 22c0 1 0 1 1 2s3 1 3 1l19 -23c14 5 31 9 51 9s36 -4 50 -9l20 23c0 1 1 0 2 -1
+l2 -2zM127 309c8 0 13 6 13 13s-6 14 -13 14c-8 0 -14 -7 -14 -14s7 -13 14 -13zM225 309c7 0 14 6 14 13s-7 14 -14 14c-8 0 -13 -7 -13 -14s6 -13 13 -13z" />
+ <glyph glyph-name="ion-social-angular-outline" unicode="&#xf4d8;"
+d="M224 384l-188 -69l39 -230l149 -80l149 80l39 230zM224 416v0l224 -80l-46 -272l-178 -96l-178 96l-46 272zM312 96l-27 56h-122l-27 -56h-40l128 280l128 -280h-40zM182 192h84l-42 89z" />
+ <glyph glyph-name="ion-social-angular" unicode="&#xf4d9;"
+d="M182 192l42 89l42 -89h-84zM224 416l224 -80l-46 -272l-178 -96l-178 96l-46 272zM312 96h40l-128 280l-128 -280h40l27 56h122z" />
+ <glyph glyph-name="ion-social-apple-outline" unicode="&#xf226;" horiz-adv-x="320"
+d="M238 278c-15 0 -26 -4 -37 -8c-10 -4 -21 -8 -35 -8s-25 4 -37 8c-11 4 -22 8 -34 8c-11 0 -23 -3 -34 -10c-12 -7 -23 -18 -31 -31c-12 -18 -16 -47 -13 -77c3 -34 16 -69 35 -99c13 -21 30 -45 50 -45h1c8 0 13 3 20 6c10 5 23 10 44 10v0c21 0 34 -5 44 -10
+c7 -3 12 -6 19 -6v0c22 0 44 35 52 48c8 12 12 20 17 31c-12 7 -22 16 -30 28c-10 15 -17 33 -18 52c-1 18 2 37 10 53c6 12 14 22 24 30c-14 13 -31 20 -47 20zM238 294v0c25 0 52 -14 71 -39c-63 -36 -53 -128 11 -153c-9 -20 -13 -28 -24 -46c-16 -25 -37 -56 -65 -56h-1
+c-24 0 -31 16 -63 16v0c-33 0 -40 -16 -64 -16h-1c-28 0 -48 28 -64 53c-44 69 -48 150 -21 193c19 30 50 48 78 48c29 0 47 -16 71 -16c23 0 38 16 72 16zM214 364c-11 -5 -21 -13 -28 -22c-4 -5 -9 -13 -13 -23c-1 -3 -2 -6 -2 -9c11 4 21 11 28 21c4 5 12 18 15 33z
+M230 384v0c3 -23 -6 -46 -18 -62c-13 -17 -35 -30 -56 -30h-1c-4 22 6 44 18 60c14 17 37 31 57 32z" />
+ <glyph glyph-name="ion-social-apple" unicode="&#xf227;" horiz-adv-x="320"
+d="M238 294v0c25 0 52 -14 71 -39c-63 -36 -53 -128 11 -153c-9 -20 -13 -28 -24 -46c-16 -25 -37 -56 -65 -56h-1c-24 0 -31 16 -63 16v0c-33 0 -40 -16 -64 -16h-1c-28 0 -48 28 -64 53c-44 69 -48 150 -21 193c19 30 50 48 78 48c29 0 47 -16 71 -16c23 0 38 16 72 16z
+M230 384v0c3 -23 -6 -46 -18 -62c-13 -17 -35 -30 -56 -30h-1c-4 22 6 44 18 60c14 17 37 31 57 32z" />
+ <glyph glyph-name="ion-social-bitcoin-outline" unicode="&#xf2ae;" horiz-adv-x="320"
+d="M184 400h-8v-48v-16h-16h-32h-16v16v48h-9v-48v-16h-16h-72v-16h13c11 0 19 0 25 -3s10 -7 13 -13s3 -8 3 -20v-178c0 -11 0 -18 -3 -24v-1c-1 -3 -4 -10 -12 -14h-1c-5 -3 -8 -3 -17 -3h-13l-3 -16h67h16v-16v-48h9v48v16h16h32h16v-16v-48h8v49v16h15c23 1 41 5 55 10
+c16 6 28 15 37 26c8 11 12 29 13 42c1 14 -1 29 -4 36s-8 16 -21 23c-7 4 -14 6 -21 8l-46 11l43 19c4 2 7 4 12 9c6 5 9 12 11 16c2 5 4 13 3 22c-1 17 -4 29 -10 37c-7 9 -17 16 -31 21c-12 5 -24 7 -41 8l-15 1v15v47zM200 416v0v-63c20 -1 32 -4 45 -9
+c16 -6 29 -15 38 -27s12 -28 13 -45c1 -10 0 -20 -3 -28s-8 -16 -16 -23c-6 -6 -11 -9 -16 -11c9 -2 17 -6 25 -10c15 -8 24 -18 29 -30c4 -10 6 -30 5 -44c-1 -16 -6 -37 -16 -51c-11 -14 -26 -24 -45 -31c-15 -6 -33 -10 -59 -11v-65h-40v64h-32v-64h-41v64h-87l8 48h28
+c9 0 8 1 11 2s4 3 5 6s1 9 1 18v178c0 9 0 10 -1 12s-3 4 -6 6s-9 2 -18 2h-28v48h87v64h41v-64h32v64h40zM160 298v-74h-32v74h32zM160 176v0v-90h-32v90h32zM200 294v0c6 -2 10 -7 14 -12c4 -6 6 -13 6 -21s-2 -15 -7 -21c-4 -5 -7 -9 -13 -12v66zM200 174v0
+c5 -1 8 -1 12 -3c8 -3 14 -7 19 -13s8 -15 8 -24c0 -11 -2 -19 -10 -26s-13 -11 -23 -15c-2 -1 -4 0 -6 -1v82z" />
+ <glyph glyph-name="ion-social-bitcoin" unicode="&#xf2af;" horiz-adv-x="320"
+d="M314 169c4 -10 7 -30 6 -44c-1 -16 -5 -37 -16 -51s-26 -24 -45 -31c-15 -6 -33 -10 -59 -11v-64h-40v64h-32v-64h-41v64h-87l9 48h26c9 0 9 0 12 1s4 4 5 7s2 8 2 17v173c0 9 -1 16 -2 18s-3 4 -6 6s-9 2 -18 2h-28v48h87v64h41v-64h32v64h40v-64c20 -1 33 -4 46 -9
+c16 -6 28 -15 37 -27s12 -28 13 -45c1 -10 0 -20 -3 -28c-2 -8 -8 -16 -16 -23c-6 -6 -11 -9 -16 -11c9 -2 17 -6 25 -10c15 -8 23 -18 28 -30zM128 298v-74h32v74h-32zM128 86h32v90h-32v-90zM200 294v-66c6 3 9 7 13 12c5 6 7 12 7 20s-2 15 -6 21c-4 5 -8 11 -14 13z
+M229 107c8 7 10 15 10 26c0 9 -3 19 -8 25s-12 10 -20 13c-4 2 -6 2 -11 3v-82c2 0 5 1 7 2c10 4 14 6 22 13z" />
+ <glyph glyph-name="ion-social-buffer-outline" unicode="&#xf228;" horiz-adv-x="384"
+d="M7 284c-9 4 -9 11 0 15l169 82c4 2 10 3 16 3s12 -1 16 -3l169 -82c9 -4 9 -11 0 -15l-169 -82c-4 -2 -10 -3 -16 -3s-12 1 -16 3zM183 366l-156 -75l156 -75c2 -1 5 -1 9 -1s7 0 9 1l156 75l-156 75c-2 1 -5 2 -9 2s-7 -1 -9 -2zM377 200c9 -4 9 -12 0 -16l-169 -81
+c-4 -2 -10 -4 -16 -4s-12 2 -16 4l-169 81c-9 4 -9 12 0 16c0 0 27 13 33 16c5 3 7 3 13 0s123 -60 123 -60c4 -2 10 -3 16 -3s12 1 16 3c0 0 121 59 125 61s5 2 9 0s35 -17 35 -17zM201 117l156 75l-19 9l-123 -59c-6 -3 -15 -5 -23 -5s-17 2 -23 5l-123 59l-19 -9l156 -75
+c2 -1 5 -2 9 -2s7 1 9 2zM377 100c9 -4 9 -11 0 -15l-169 -82c-4 -2 -10 -3 -16 -3s-12 1 -16 3l-169 82c-9 4 -9 11 0 15c0 0 27 14 33 17c5 3 7 2 13 -1s123 -59 123 -59c4 -2 10 -3 16 -3s12 1 16 3c0 0 121 58 125 60s5 2 9 0s35 -17 35 -17zM201 18l156 75l-19 9
+l-123 -60c-6 -3 -15 -4 -23 -4s-17 1 -23 4l-123 60l-19 -9l156 -75c2 -1 5 -2 9 -2s7 1 9 2z" />
+ <glyph glyph-name="ion-social-buffer" unicode="&#xf229;" horiz-adv-x="384"
+d="M7 284c-9 4 -9 11 0 15l169 82c4 2 10 3 16 3s12 -1 16 -3l169 -82c9 -4 9 -11 0 -15l-169 -82c-4 -2 -10 -3 -16 -3s-12 1 -16 3zM377 200c9 -4 9 -12 0 -16l-169 -81c-4 -2 -10 -4 -16 -4s-12 2 -16 4l-169 81c-9 4 -9 12 0 16c0 0 27 13 33 16c5 3 7 3 13 0
+s123 -60 123 -60c4 -2 10 -3 16 -3s12 1 16 3c0 0 121 59 125 61s5 2 9 0s35 -17 35 -17zM377 100c9 -4 9 -11 0 -15l-169 -82c-4 -2 -10 -3 -16 -3s-12 1 -16 3l-169 82c-9 4 -9 11 0 15c0 0 27 14 33 17c5 3 7 2 13 -1s123 -59 123 -59c4 -2 10 -3 16 -3s12 1 16 3
+c0 0 121 58 125 60s5 2 9 0s35 -17 35 -17z" />
+ <glyph glyph-name="ion-social-chrome-outline" unicode="&#xf4da;"
+d="M224 416c123 0 224 -101 224 -224s-101 -224 -224 -224s-224 101 -224 224s101 224 224 224zM224 371c-57 0 -109 -27 -141 -68l54 -93c8 40 43 72 87 72h155c-30 54 -89 89 -155 89zM291 192c0 37 -30 67 -67 67s-67 -30 -67 -67s30 -67 67 -67s67 30 67 67zM45 192
+c0 -91 67 -166 154 -177l54 93c-9 -3 -19 -6 -29 -6c-34 0 -61 18 -77 45v0l-78 135c-16 -27 -24 -58 -24 -90zM224 13c99 0 179 80 179 179c0 24 -4 46 -13 67h-108c19 -17 32 -40 32 -67c0 -17 -5 -32 -13 -45v0z" />
+ <glyph glyph-name="ion-social-chrome" unicode="&#xf4db;"
+d="M157 192c0 37 30 67 67 67s67 -30 67 -67s-30 -67 -67 -67s-67 30 -67 67zM445 230c2 -12 3 -25 3 -38c0 -106 -74 -195 -174 -218c-10 -2 -20 -4 -30 -5c-7 -1 -13 -1 -20 -1c-8 0 -17 0 -25 1v0v0v0v1l102 177c8 13 13 28 13 45c0 27 -13 50 -32 67h156
+c3 -9 5 -19 7 -29v0c-2 10 -4 20 -7 29v0c3 -9 5 -19 7 -29v0zM224 103c10 0 20 2 29 5l-78 -135v0c-42 9 -79 30 -108 59c-42 41 -67 97 -67 160c0 31 6 61 18 88c7 16 16 31 26 45v0l103 -178c16 -27 43 -44 77 -44zM59 343v0v1c24 26 55 47 90 59c23 8 49 13 75 13
+c73 0 138 -36 179 -90h1c10 -14 18 -29 25 -44v0c-7 15 -15 30 -25 44h-1c10 -14 19 -29 26 -44h-205c-44 0 -79 -32 -87 -72z" />
+ <glyph glyph-name="ion-social-codepen-outline" unicode="&#xf4dc;"
+d="M356 244c5 -3 7 -6 7 -12v-81c0 -6 -3 -10 -8 -13c-41 -27 -82 -55 -123 -82c-6 -4 -11 -4 -17 0c-41 27 -81 55 -122 82c-5 3 -8 7 -8 13v80c0 6 3 11 8 14c41 27 81 54 122 81c6 4 11 4 17 0c41 -27 83 -55 124 -82zM236 296v-54c0 -1 1 -2 2 -3c16 -11 31 -21 47 -32
+c1 -1 3 -1 4 0l40 26zM212 295c0 0 -62 -41 -93 -62c14 -9 27 -17 40 -26c1 -1 3 -1 4 0c15 10 31 21 46 31c1 1 3 4 3 6v51zM109 211v-40l30 20zM212 87v53c0 1 -2 3 -3 4c-15 10 -31 21 -46 31c-2 1 -3 1 -5 0l-39 -26c31 -21 93 -62 93 -62zM227 165l39 26s-34 23 -40 27
+c-1 1 -4 0 -5 -1c-5 -3 -9 -6 -14 -9c-8 -6 -25 -17 -25 -17l39 -26c2 -1 4 -1 6 0zM236 87l93 62l-38 26c-2 2 -5 2 -7 0c-15 -10 -30 -21 -45 -31c-2 -2 -3 -3 -3 -6v-51zM338 171v40l-30 -20zM224 384c-51 0 -100 -20 -136 -56s-56 -85 -56 -136s20 -100 56 -136
+s85 -56 136 -56s100 20 136 56s56 85 56 136s-20 100 -56 136s-85 56 -136 56zM224 416v0c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224z" />
+ <glyph glyph-name="ion-social-codepen" unicode="&#xf4dd;"
+d="M209 144c1 -1 3 -3 3 -4v-53s-62 41 -93 62l39 26c2 1 3 1 5 0c15 -10 31 -21 46 -31zM163 207c-1 -1 -3 -1 -4 0c-13 9 -26 17 -40 26c31 21 93 62 93 62v-51c0 -2 -2 -5 -3 -6c-15 -10 -31 -21 -46 -31zM238 239c-1 1 -2 2 -2 3v54l93 -63l-40 -26c-1 -1 -3 -1 -4 0
+c-16 11 -31 21 -47 32zM226 218c6 -4 40 -27 40 -27l-39 -26c-2 -1 -4 -1 -6 0l-39 26s17 11 25 17c5 3 9 6 14 9c1 1 4 2 5 1zM109 211l30 -20l-30 -20v40zM224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM363 151v81
+c0 6 -2 9 -7 12c-41 27 -83 55 -124 82c-6 4 -11 4 -17 0c-41 -27 -81 -54 -122 -81c-5 -3 -8 -8 -8 -14v-80c0 -6 3 -10 8 -13c41 -27 81 -55 122 -82c6 -4 11 -4 17 0c41 27 82 55 123 82c5 3 8 7 8 13zM284 175c2 2 5 2 7 0l38 -26l-93 -62v51c0 3 1 4 3 6
+c15 10 30 21 45 31zM338 171l-30 20l30 20v-40z" />
+ <glyph glyph-name="ion-social-css3-outline" unicode="&#xf4de;" horiz-adv-x="384"
+d="M291 81l-99 -28l-98 28l-7 78h48l4 -40l53 -15v0v0l54 15l5 64h-112l-4 50h121l4 51h-184l-4 49h241zM0 416h384l-35 -403l-157 -45l-157 45zM319 37l30 347h-314l30 -347l127 -36z" />
+ <glyph glyph-name="ion-social-css3" unicode="&#xf4df;" horiz-adv-x="384"
+d="M192 109v0zM0 416h384l-35 -403l-157 -45l-157 45zM291 81l22 252h-241l4 -49h184l-4 -51h-121l4 -50h112l-5 -64l-54 -15v0v0l-53 15l-4 40h-48l7 -78l98 -28z" />
+ <glyph glyph-name="ion-social-designernews-outline" unicode="&#xf22a;"
+d="M259 302v-53l-65 103zM0 188zM297 352l151 -119v-201h-248l-200 156h63c46 0 77 33 77 82c0 20 -5 37 -15 51l-3 3l37 -29v-107h41l-2 98l63 -98h36v84v80zM432 48v178l-119 92v1v-47v-83v-17h-15h-37h-9l-4 8l-33 50l1 -42v-16h-16h-41h-16v16v29c-3 -6 -7 -12 -12 -17
+c-8 -9 -18 -16 -30 -21s-24 -7 -38 -7h-16l159 -124h226zM59 298h-1h-3v-57h4c8 0 13 2 17 6c5 6 6 15 6 22c0 26 -12 29 -23 29zM59 314v0c25 0 39 -16 39 -45c0 -28 -14 -44 -40 -44h-19v89h20z" />
+ <glyph glyph-name="ion-social-designernews" unicode="&#xf22b;"
+d="M258 303l1 -53l-64 102zM297 352l151 -118v-202h-248l-200 157v0h63c46 0 77 33 77 82c0 20 -5 37 -15 51l-3 3l37 -29v-107h40l-2 99l64 -99h36v83v80zM98 270c0 -28 -14 -44 -40 -44h-19v89h19c26 0 40 -16 40 -45z" />
+ <glyph glyph-name="ion-social-dribbble-outline" unicode="&#xf22c;" horiz-adv-x="384"
+d="M192 384c106 0 192 -86 192 -192s-86 -192 -192 -192s-192 86 -192 192s86 192 192 192zM314 296c-17 -25 -47 -47 -85 -64c5 -10 9 -20 13 -31c33 3 75 4 110 2c-2 35 -16 68 -38 93zM192 352c-14 0 -26 -2 -39 -5c23 -23 43 -53 62 -87c34 14 62 33 79 55
+c-28 23 -63 37 -102 37zM120 334c-41 -21 -71 -58 -83 -103h25c44 0 85 6 121 17c-19 34 -40 63 -63 86zM32 200v-8c0 -40 15 -78 40 -106c24 45 67 83 122 106c4 2 8 3 14 4c-3 8 -6 16 -10 24c-40 -13 -88 -20 -138 -21c-9 0 -19 1 -28 1zM192 32c20 0 39 3 57 10
+c-3 25 -8 53 -15 79c-4 17 -10 33 -16 49c-7 -2 -13 -4 -17 -6c-48 -22 -86 -56 -107 -98c27 -21 61 -34 98 -34zM278 58c40 26 68 67 73 116c-30 2 -68 3 -99 0c4 -12 9 -25 12 -38c7 -27 11 -52 14 -78z" />
+ <glyph glyph-name="ion-social-dribbble" unicode="&#xf22d;" horiz-adv-x="384"
+d="M192 384c106 0 192 -86 192 -192s-86 -192 -192 -192s-192 86 -192 192s86 192 192 192zM192 32c88 0 160 72 160 160s-72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160zM242 201c-4 11 -8 21 -13 31c25 11 47 24 63 39c15 -19 26 -42 28 -67c-26 0 -55 -1 -78 -3z
+M271 292c-15 -12 -34 -23 -56 -32c-12 22 -24 41 -38 59c5 1 10 1 15 1c30 0 57 -11 79 -28zM142 310c15 -18 28 -39 41 -62c-34 -10 -72 -16 -113 -17c11 36 38 65 72 79zM319 176c-4 -33 -21 -63 -46 -83c-3 14 -5 28 -9 43c-3 13 -8 26 -12 38c21 2 45 3 67 2zM194 192
+c-43 -18 -79 -46 -104 -78c-16 22 -26 49 -26 78v7c49 1 95 8 134 21c4 -8 7 -16 10 -24c-6 -1 -10 -2 -14 -4zM219 170c6 -16 11 -32 15 -49c4 -15 7 -31 10 -46c-16 -7 -34 -11 -52 -11c-31 0 -59 11 -81 29c22 30 53 54 90 71c4 2 11 4 18 6z" />
+ <glyph glyph-name="ion-social-dropbox-outline" unicode="&#xf22e;" horiz-adv-x="384"
+d="M113 371l79 -66l-114 -71l-78 63zM27 295l52 -42l86 53l-53 46zM306 235l78 -63l-78 -51v-39l-114 -69l-114 68v39l-78 52l78 63l114 -71l-79 -66l-19 12v-20l98 -59l98 59v20l-19 -12l-79 66zM79 217l-52 -44l85 -55l53 44zM219 162l53 -44l85 56l-52 43zM384 297
+l-78 -63l-114 71l79 66zM219 305l86 -52l52 42l-85 56z" />
+ <glyph glyph-name="ion-social-dropbox" unicode="&#xf22f;" horiz-adv-x="384"
+d="M113 371l79 -66l-114 -71l-78 63zM0 172l78 62l114 -70l-79 -66zM192 164l114 70l78 -62l-113 -74zM384 297l-78 -63l-114 71l79 66zM192 150l80 -66l34 22v-25l-114 -68l-114 68v25l34 -22z" />
+ <glyph glyph-name="ion-social-euro-outline" unicode="&#xf4e0;" horiz-adv-x="320"
+d="M214 384c-53 0 -91 -9 -115 -27c-22 -16 -33 -40 -33 -74v-11v-17h-16h-34v-16h34h16v-15v-48v-17h-16h-34v-16h34h16v-15v-27c0 -34 11 -58 33 -74c24 -18 62 -27 115 -27c31 0 59 2 88 8l-5 35c-30 -4 -55 -7 -80 -7c-36 0 -59 6 -74 19c-19 16 -21 40 -21 60v13v15h16
+h103l3 16h-106h-16v17v48v15h16h118l2 16h-120h-16v17v2c0 16 2 39 21 55c16 13 39 19 74 19c24 0 51 -3 80 -7l5 35c-29 6 -57 8 -88 8zM214 400v0c35 0 68 -3 106 -12l-9 -65c-37 6 -68 9 -94 9c-64 0 -79 -22 -79 -58v-3h139l-8 -48h-131v-48h124l-7 -48h-117v-12
+c0 -44 15 -63 79 -63c26 0 57 3 94 9l9 -65c-38 -9 -71 -12 -106 -12c-115 0 -164 41 -164 117v26h-50v48h50v48h-50v48h50v12c0 76 49 117 164 117z" />
+ <glyph glyph-name="ion-social-euro" unicode="&#xf4e1;" horiz-adv-x="320"
+d="M138 176h124l-7 -48h-117v-13c0 -44 15 -63 79 -63c26 0 56 3 93 9l10 -65c-38 -9 -71 -12 -106 -12c-115 0 -164 41 -164 117v27h-50v48h50v48h-50v48h50v11c0 76 49 117 164 117c35 0 68 -3 106 -12l-10 -65c-37 6 -67 9 -93 9c-64 0 -79 -22 -79 -58v-2h138l-7 -48
+h-131v-48z" />
+ <glyph glyph-name="ion-social-facebook-outline" unicode="&#xf230;" horiz-adv-x="192"
+d="M128 256h64l-8 -64h-56v-192h-83v192h-45v64h45v43c0 54 23 85 91 85h56v-64h-34c-27 0 -30 -9 -30 -26v-38zM170 208l4 32h-45h-17v17v37c0 10 1 21 9 30c10 11 25 12 37 12h18v32h-40c-28 0 -49 -6 -60 -18c-10 -11 -15 -27 -15 -51v-43v-16h-15h-30v-32h30h15v-16
+v-176h51v176v16h17h41z" />
+ <glyph glyph-name="ion-social-facebook" unicode="&#xf231;" horiz-adv-x="192"
+d="M128 256h64l-8 -64h-56v-192h-83v192h-45v64h45v43c0 54 23 85 91 85h56v-64h-34c-27 0 -30 -9 -30 -26v-38z" />
+ <glyph glyph-name="ion-social-foursquare-outline" unicode="&#xf34c;" horiz-adv-x="320"
+d="M302 284c-12 -60 -25 -131 -27 -138zM281 416c35 0 45 -20 37 -57c-3 -16 -10 -44 -16 -75l-27 -137c-3 -13 -8 -35 -39 -35h-72c-3 0 -3 0 -6 -3c-2 -2 -115 -133 -115 -133c-9 -10 -23 -8 -28 -6s-15 8 -15 26v380s10 40 43 40h238zM280 352c6 31 6 32 -24 32h-195
+c-29 0 -29 -3 -29 -28v-297c0 -38 1 -38 3 -38s10 8 29 31c0 0 78 89 79 90c2 2 3 2 6 2h62c26 0 28 6 33 31c4 21 36 177 36 177zM302 284c6 31 13 59 16 75zM233 352c5 0 9 -5 8 -11l-8 -44c-1 -4 -6 -9 -11 -9h-75c-8 0 -8 -5 -8 -13v-6c0 -8 0 -13 8 -13h64
+s11 -6 10 -12s-11 -51 -12 -54s-4 -9 -11 -9h-62c-9 0 -11 -1 -17 -8l-54 -63c-1 -1 -1 -1 -1 0v231c0 5 5 11 11 11h158z" />
+ <glyph glyph-name="ion-social-foursquare" unicode="&#xf34d;" horiz-adv-x="320"
+d="M281 416c35 0 45 -20 37 -57c-10 -49 -40 -202 -43 -213c-3 -13 -8 -34 -39 -34h-72c-3 0 -3 0 -6 -3c-2 -2 -115 -133 -115 -133c-9 -10 -23 -8 -28 -6s-15 8 -15 26v380s10 40 43 40h238zM275 146c3 11 33 164 43 213zM267 351c2 9 -5 16 -12 16h-191
+c-9 0 -15 -8 -15 -15v-296c0 -1 1 -1 2 0c0 0 70 84 78 94s11 11 23 11h64c9 0 14 8 15 12s8 43 10 51s-6 16 -13 16h-82c-10 0 -18 8 -18 18v13c0 10 8 17 18 17h96s14 6 15 12z" />
+ <glyph glyph-name="ion-social-freebsd-devil" unicode="&#xf2c4;" horiz-adv-x="512"
+d="M503 333c19 -37 8 -81 -20 -108s-60 -33 -60 -33c2 -32 16 -59 -41 -102c-43 -32 2 -90 2 -90c10 -14 23 -19 32 -32h-272s15 14 -7 32c0 0 -20 17 -18 29s6 13 9 15s0 7 0 7l-19 19s-13 -13 -44 -13c-38 0 -65 39 -65 39h46s-6 -8 -7 -13c-1 -4 1 -5 1 -5s11 -6 22 -6
+c17 0 33 12 33 12l-24 22l-15 -4l-16 37l39 -10l-1 -15l28 -18s9 9 7 27s-9 26 -9 26s-4 0 -9 -4s-6 -6 -6 -6l-10 44s43 -19 50 -63c3 -20 -6 -35 -6 -35l17 -10s6 5 17 7s23 2 29 -8s5 -12 4 -19s0 -9 6 -11s6 -6 11 -8s15 -6 21 -2s8 11 8 18v16s-9 8 -32 20
+s-54 22 -66 40s-12 44 0 57c9 10 23 25 26 35c4 14 4 42 4 42s-10 16 -8 40c2 30 22 84 96 114c0 0 -40 -55 -20 -80c0 0 37 11 77 9c31 -2 56 -12 73 -28s25 -23 47 -17s28 17 28 33c0 19 -16 51 -16 51s36 -7 58 -51zM195 245c14 4 21 -11 21 -11c14 25 30 60 22 64
+s-64 -25 -66 -88c0 0 6 31 23 35zM232 230c5 7 34 8 37 -17c4 -35 -24 -57 -24 -57s7 -2 23 2c17 4 43 29 43 70s-21 66 -41 62s-38 -60 -38 -60z" />
+ <glyph glyph-name="ion-social-github-outline" unicode="&#xf232;"
+d="M224 416c124 0 224 -103 224 -230c0 -101 -64 -188 -153 -218h-4c-8 0 -12 7 -12 12c0 8 1 31 1 62c0 21 -8 36 -16 43c50 6 103 25 103 113c0 25 -9 46 -23 62c2 6 10 29 -2 61h-5c-8 0 -27 -3 -57 -24c-18 5 -37 8 -56 8s-38 -3 -56 -8c-30 21 -49 24 -57 24h-5
+c-12 -32 -4 -55 -2 -61c-14 -16 -23 -37 -23 -62c0 -88 52 -107 102 -113c-6 -6 -12 -16 -14 -31c-6 -3 -16 -6 -26 -6c-13 0 -28 5 -39 25c0 0 -13 22 -35 24v0c-2 0 -21 0 -1 -14c0 0 15 -8 25 -34c0 0 10 -33 53 -33c7 0 14 0 22 2v-39c0 -5 -3 -11 -11 -11h-4
+c-89 30 -153 116 -153 218c0 127 100 230 224 230zM146 -0c-15 0 -28 4 -38 9c14 -10 28 -17 44 -23v6v8h-6zM157 73c-16 4 -35 10 -52 24c6 -6 11 -11 13 -16c7 -12 14 -17 25 -17c4 0 9 1 12 2c1 2 1 5 2 7zM347 14c17 13 32 28 45 46c26 37 40 80 40 126
+c0 29 -5 58 -16 84c-10 25 -26 48 -45 68s-41 34 -66 45c-26 11 -53 17 -81 17s-55 -6 -81 -17c-25 -11 -47 -25 -66 -45s-35 -42 -45 -68c-11 -26 -16 -55 -16 -84c0 -46 14 -89 40 -126c10 -14 22 -27 35 -38c-7 8 -11 16 -13 22c-7 18 -15 24 -17 25h-2v1
+c-5 3 -20 13 -15 28c3 9 12 15 25 15h1v0v0c13 -1 24 -6 32 -13c-21 19 -37 48 -37 98c0 24 7 47 21 66c-3 13 -6 34 5 62l3 8l7 2c2 0 5 1 10 1c12 0 31 -3 60 -22c17 4 35 6 53 6v0v0c18 0 36 -2 53 -6c29 19 48 22 60 22c5 0 8 -1 10 -1l7 -2l3 -7c11 -27 8 -50 5 -63
+c14 -19 21 -41 21 -66c0 -92 -55 -117 -92 -125c3 -8 5 -18 5 -30v-51v-6c18 7 35 16 51 28z" />
+ <glyph glyph-name="ion-social-github" unicode="&#xf233;"
+d="M224 416c124 0 224 -103 224 -230c0 -101 -64 -188 -153 -218h-4c-8 0 -12 7 -12 12c0 8 1 31 1 62c0 21 -8 36 -16 43c50 6 103 25 103 113c0 25 -9 46 -23 62c2 6 10 29 -2 61h-5c-8 0 -27 -3 -57 -24c-18 5 -37 8 -56 8s-38 -3 -56 -8c-30 21 -49 24 -57 24h-5
+c-12 -32 -4 -55 -2 -61c-14 -16 -23 -37 -23 -62c0 -88 52 -107 102 -113c-6 -6 -12 -16 -14 -31c-6 -3 -16 -6 -26 -6c-13 0 -28 5 -39 25c0 0 -13 22 -35 24v0c-2 0 -21 0 -1 -14c0 0 15 -8 25 -34c0 0 10 -33 53 -33c7 0 14 0 22 2v-39c0 -5 -3 -11 -11 -11h-4
+c-89 30 -153 116 -153 218c0 127 100 230 224 230z" />
+ <glyph glyph-name="ion-social-google-outline" unicode="&#xf34e;" horiz-adv-x="256"
+d="M191 366c12 -10 37 -30 37 -68c0 -37 -21 -55 -43 -72c-7 -7 -15 -13 -15 -24s8 -17 14 -22l18 -14c23 -19 43 -36 43 -71c0 -47 -47 -95 -135 -95c-74 0 -110 35 -110 72c0 18 10 44 40 62c32 19 75 21 98 23c-7 9 -16 18 -16 34c0 9 2 14 5 20c-6 0 -11 -1 -16 -1
+c-54 0 -85 40 -85 79c0 23 11 48 33 67c29 24 63 28 91 28h106l-33 -18h-32zM155 142c-4 1 -7 1 -12 1s-32 -1 -54 -8c-11 -4 -44 -16 -44 -52s36 -62 91 -62c49 0 75 24 75 55c0 26 -17 39 -56 66zM170 238c12 12 13 28 13 37c0 36 -22 92 -65 92c-13 0 -28 -6 -36 -16
+c-9 -11 -11 -25 -11 -38c0 -34 20 -89 64 -89c13 0 27 6 35 14z" />
+ <glyph glyph-name="ion-social-google" unicode="&#xf34f;" horiz-adv-x="288"
+d="M210 172c22 -18 45 -36 45 -73c0 -49 -48 -99 -140 -99c-80 0 -115 39 -115 77c0 10 3 42 42 65c27 16 61 20 85 22c-4 7 -8 16 -8 27c0 4 0 7 1 10h-4c-19 0 -46 4 -67 26c-15 15 -24 36 -24 57c0 26 13 53 35 71v0c32 25 70 29 95 29h133l-60 -33h-13
+c11 -13 23 -31 23 -58c0 -40 -25 -59 -45 -74v-1c-6 -6 -11 -10 -11 -17c0 -6 4 -10 10 -15v0zM85 308c0 -13 4 -33 14 -51c7 -12 20 -27 41 -27c10 0 21 4 28 11c10 10 10 25 10 30c0 18 -6 38 -15 54c-7 13 -20 27 -40 27c-11 0 -22 -5 -29 -13c-6 -7 -9 -18 -9 -31z
+M206 80c0 20 -13 31 -50 56c-3 0 -4 1 -8 1c-6 0 -32 -2 -51 -8c-16 -6 -37 -16 -37 -42c0 -31 32 -51 80 -51c41 0 66 17 66 44z" />
+ <glyph glyph-name="ion-social-googleplus-outline" unicode="&#xf234;"
+d="M192 366c12 -10 36 -30 36 -68c0 -37 -21 -55 -43 -72c-7 -7 -15 -13 -15 -24s8 -18 14 -22l18 -14c23 -19 43 -36 43 -71c0 -47 -47 -95 -135 -95c-74 0 -110 35 -110 72c0 18 10 44 40 62c32 19 75 21 98 23c-7 9 -16 18 -16 34c0 9 3 14 5 20c-6 0 -11 -1 -16 -1
+c-54 0 -85 40 -85 79c0 23 10 48 32 67c29 24 64 28 92 28h106l-33 -18h-31zM155 142c-4 0 -7 1 -12 1s-32 -1 -54 -8c-11 -4 -44 -16 -44 -52s36 -62 91 -62c49 0 75 24 75 55c0 26 -17 39 -56 66zM170 238c12 12 13 28 13 37c0 36 -22 92 -65 92c-13 0 -28 -6 -36 -16
+c-9 -11 -11 -24 -11 -37c0 -34 20 -90 64 -90c13 0 27 6 35 14zM448 306v-18h-78v-81h-18v81h-80v18h80v78h18v-78h78z" />
+ <glyph glyph-name="ion-social-googleplus" unicode="&#xf235;"
+d="M210 172c22 -18 45 -36 45 -73c0 -49 -47 -99 -139 -99c-80 0 -116 39 -116 77c0 10 3 42 42 65c27 16 61 21 85 23c-4 7 -8 15 -8 26c0 4 0 7 1 10h-4c-19 0 -46 4 -67 26c-15 15 -24 36 -24 57c0 26 13 53 35 71v0c32 25 69 29 94 29h134l-60 -33h-13
+c11 -13 23 -31 23 -58c0 -40 -25 -59 -45 -74v-1c-6 -6 -11 -10 -11 -17c0 -6 4 -10 10 -15v0zM85 308c0 -13 4 -33 14 -51c7 -12 21 -27 41 -27c10 0 21 4 28 11c10 10 10 25 10 30c0 18 -6 37 -15 53c-8 13 -20 28 -40 28c-11 0 -23 -5 -29 -13c-6 -7 -9 -18 -9 -31z
+M206 80c0 20 -13 31 -50 56c-3 0 -4 1 -8 1c-6 0 -31 -2 -50 -8c-16 -6 -38 -16 -38 -42c0 -31 32 -51 80 -51c41 0 66 17 66 44zM370 306h78v-34h-78v-81h-34v81h-80v34h80v78h34v-78z" />
+ <glyph glyph-name="ion-social-hackernews-outline" unicode="&#xf236;" horiz-adv-x="384"
+d="M352 352h-320v-320h320v320zM384 384v0v-384h-384v384h384zM233 289h45l-64 -120v-72h-40v72l-66 120h47l40 -84z" />
+ <glyph glyph-name="ion-social-hackernews" unicode="&#xf237;" horiz-adv-x="384"
+d="M0 384h384v-384h-384v384zM214 169l64 120h-45l-38 -84l-40 84h-47l66 -120v-72h40v72z" />
+ <glyph glyph-name="ion-social-html5-outline" unicode="&#xf4e2;" horiz-adv-x="384"
+d="M0 416h384l-35 -403l-157 -45l-157 45zM319 37l30 347h-314l30 -347l127 -36zM84 184l-13 150h241l-4 -50h-184l4 -51h176l-14 -151l-98 -28l-99 28l-6 77h48l3 -39l54 -15l53 15l6 64h-167z" />
+ <glyph glyph-name="ion-social-html5" unicode="&#xf4e3;" horiz-adv-x="384"
+d="M0 416h384l-35 -403l-157 -45l-157 45zM308 284l4 50h-241l13 -150h167l-6 -64l-53 -15l-54 15l-3 39h-48l6 -78l99 -27l98 28l14 151h-176l-4 51h184z" />
+ <glyph glyph-name="ion-social-instagram-outline" unicode="&#xf350;" horiz-adv-x="384"
+d="M384 336v-289c0 -26 -22 -47 -48 -47h-288c-26 0 -48 21 -48 47v289c0 26 22 48 48 48h288c26 0 48 -22 48 -48zM192 272c-44 0 -80 -36 -80 -80s36 -80 80 -80s80 36 80 80s-36 80 -80 80zM352 288v48c0 9 -7 16 -16 16h-48c-9 0 -16 -7 -16 -16v-48c0 -9 7 -16 16 -16
+h48c9 0 16 7 16 16zM337 32c9 0 15 7 15 16v176h-52c3 -10 4 -21 4 -32c0 -30 -11 -58 -32 -79s-50 -33 -80 -33s-58 12 -79 33s-33 49 -33 79c0 11 2 22 5 32h-53v-176c0 -9 8 -16 17 -16h288z" />
+ <glyph glyph-name="ion-social-instagram" unicode="&#xf351;" horiz-adv-x="384"
+d="M112 192c0 53 27 80 80 80s80 -27 80 -80s-27 -80 -80 -80s-80 27 -80 80zM113 271c-14 -14 -23 -29 -28 -47h-85v112c0 13 4 25 14 34s22 14 35 14h288c13 0 24 -5 33 -14s14 -21 14 -34v-112h-84c-5 18 -14 33 -28 47c-22 22 -49 33 -80 33s-57 -11 -79 -33zM352 300
+v39c0 4 -2 7 -4 9s-5 4 -9 4h-38c-4 0 -7 -2 -9 -4s-4 -5 -4 -9v-39c0 -4 2 -7 4 -9s5 -3 9 -3h38c4 0 7 1 9 3s4 5 4 9zM272 113c22 22 32 48 32 79h80v-144c0 -13 -5 -24 -14 -34s-20 -14 -33 -14h-288c-13 0 -24 4 -34 14s-15 21 -15 34v144h81c0 -31 10 -57 32 -79
+s48 -33 79 -33s58 11 80 33z" />
+ <glyph glyph-name="ion-social-javascript-outline" unicode="&#xf4e4;"
+d="M160 344h-48v-196c0 -30 -6 -50 -17 -64c-11 -13 -26 -20 -48 -20c-9 0 -18 1 -25 2l-4 -30c11 -2 25 -4 37 -4c34 0 59 8 76 25c19 18 29 48 29 90v197zM176 360v0v-213c0 -97 -49 -131 -121 -131c-18 0 -40 3 -55 8l8 62c10 -4 24 -6 39 -6c31 0 49 15 49 68v212h80z
+M350 352c-34 0 -62 -9 -82 -26c-19 -15 -28 -36 -28 -60c0 -20 7 -36 21 -51c14 -14 34 -26 61 -36c23 -8 38 -15 48 -24c12 -11 18 -23 18 -38c0 -16 -7 -31 -20 -40c-12 -9 -28 -14 -48 -14c-28 0 -52 8 -70 15l-7 -32c18 -8 44 -14 72 -14c38 0 70 9 90 27
+c18 16 27 38 27 63c0 21 -5 36 -17 50s-31 27 -58 37v0v0c-38 15 -72 28 -72 63c0 14 7 27 19 36c11 9 26 13 45 13c24 0 43 -5 57 -11l10 32c-19 6 -42 10 -66 10zM350 368v0c38 0 65 -7 85 -16l-19 -64c-13 7 -35 17 -67 17s-48 -16 -48 -33c0 -22 19 -31 62 -48
+c58 -22 85 -53 85 -102c0 -57 -42 -106 -133 -106c-38 0 -72 10 -91 21l15 63v0c20 -11 49 -21 81 -21c34 0 52 15 52 38c0 21 -15 33 -55 47c-55 20 -93 52 -93 102c0 58 49 102 126 102z" />
+ <glyph glyph-name="ion-social-javascript" unicode="&#xf4e5;"
+d="M176 360v0v-213c0 -97 -49 -131 -121 -131c-18 0 -40 3 -55 8l8 62c10 -4 24 -6 39 -6c31 0 49 15 49 68v212h80zM350 368v0c38 0 65 -7 85 -16l-19 -64c-13 7 -35 17 -67 17s-48 -16 -48 -33c0 -22 19 -31 62 -48c58 -22 85 -53 85 -102c0 -57 -42 -106 -133 -106
+c-38 0 -72 10 -91 21l15 63v0c20 -11 49 -21 81 -21c34 0 52 15 52 38c0 21 -15 33 -55 47c-55 20 -93 52 -93 102c0 58 49 102 126 102z" />
+ <glyph glyph-name="ion-social-linkedin-outline" unicode="&#xf238;" horiz-adv-x="384"
+d="M119 64v0h-55v171h55v-171zM93 261v0v0c-18 0 -29 13 -29 29c0 17 12 30 30 30s29 -13 29 -30c0 -16 -12 -29 -30 -29zM257 239c36 0 63 -24 63 -75v-100h-55v94c0 22 -8 37 -28 37c-15 0 -24 -10 -28 -20c-2 -4 -2 -9 -2 -14v-97h-55v171h55v-24c8 11 21 28 50 28z
+M353 384c18 0 31 -13 31 -30v-321c0 -17 -13 -33 -31 -33h-320c-18 0 -33 16 -33 33v321c0 17 15 30 33 30h320zM350 32c1 0 2 1 2 2v316c0 1 -1 2 -2 2h-316s-2 -1 -2 -2v-315s1 -3 3 -3h315z" />
+ <glyph glyph-name="ion-social-linkedin" unicode="&#xf239;" horiz-adv-x="384"
+d="M353 384c18 0 31 -13 31 -30v-321c0 -17 -13 -33 -31 -33h-320c-18 0 -33 16 -33 33v321c0 17 15 30 33 30h320zM119 64v171h-55v-171h55zM93 261c18 0 30 13 30 29c0 17 -11 30 -29 30s-30 -13 -30 -30c0 -16 11 -29 29 -29v0zM320 64v100c0 51 -27 75 -63 75
+c-29 0 -42 -17 -50 -28v24h-55v-171h55v97c0 5 0 10 2 14c4 10 13 20 28 20c20 0 28 -15 28 -37v-94h55z" />
+ <glyph glyph-name="ion-social-markdown" unicode="&#xf4e6;"
+d="M416 352c18 0 32 -14 32 -32v-256c0 -18 -14 -32 -32 -32h-384c-18 0 -32 14 -32 32v256c0 18 14 32 32 32h384zM252 96v0v192h-56l-42 -68l-42 68h-56v-192h56v96l42 -54l42 54v-96h56zM336 96v0l70 96h-42v96h-56v-96h-42z" />
+ <glyph glyph-name="ion-social-nodejs" unicode="&#xf4e7;" horiz-adv-x="384"
+d="M192 -32c-6 0 -12 2 -17 5l-53 32c-8 5 -4 6 -1 7c11 4 14 5 25 12c1 1 3 1 4 0l39 -23c1 -1 4 -1 5 0l156 92c1 1 2 2 2 4v187c0 2 0 4 -2 5l-156 94c-1 1 -3 1 -4 0l-155 -94c-2 -1 -3 -3 -3 -5v-187c0 -2 0 -3 2 -4l40 -24c24 -12 38 1 38 15v183c0 3 2 5 5 5h22
+c3 0 5 -2 5 -5v-183c0 -33 -19 -52 -49 -52c-9 0 -17 1 -37 11l-41 24c-10 6 -17 18 -17 30v190c0 12 7 24 17 30l158 95c10 6 24 6 34 0l158 -95c10 -6 17 -18 17 -30v-190c0 -12 -7 -24 -17 -30l-158 -94c-5 -3 -11 -5 -17 -5v0zM241 96c-65 0 -84 31 -84 59c0 3 1 5 4 5
+h21c2 0 5 -2 5 -4c3 -22 16 -31 54 -31c33 0 47 11 47 29c0 11 -3 18 -55 23c-43 4 -71 15 -71 51c0 33 28 52 73 52c46 0 76 -14 79 -51c0 -1 -1 -2 -2 -3s-2 -2 -3 -2h-20c-2 0 -5 2 -5 4c-4 17 -16 23 -49 23c-36 0 -41 -12 -41 -22c0 -12 5 -16 54 -23s72 -16 72 -51
+c0 -36 -29 -59 -79 -59v0v0z" />
+ <glyph glyph-name="ion-social-octocat" unicode="&#xf4e8;"
+d="M146 161c9 0 16 -4 22 -13s10 -20 10 -32s-4 -22 -10 -31s-14 -13 -22 -13c-9 0 -17 4 -23 13s-9 19 -9 31s3 24 9 32c6 9 14 13 23 13zM303 161c9 0 16 -4 22 -13s9 -20 9 -32s-3 -22 -9 -31s-13 -13 -22 -13s-18 4 -24 13s-9 19 -9 31s3 24 9 32c6 9 15 13 24 13z
+M414 276c24 -27 34 -66 34 -96c0 -24 -1 -46 -6 -65c-6 -19 -13 -35 -21 -47c-9 -12 -19 -23 -32 -32s-24 -17 -34 -21s-22 -8 -36 -10c-13 -2 -24 -4 -31 -4c0 0 -28 -1 -64 -1s-64 1 -64 1c-7 0 -18 2 -31 4c-14 2 -26 6 -36 10s-22 12 -34 21c-13 9 -23 20 -32 32
+c-8 12 -15 28 -21 47c-5 19 -6 41 -6 65c0 31 10 70 34 96c0 0 -2 14 0 39s7 48 16 69c30 -3 67 -20 112 -51c15 4 36 6 62 6c28 0 48 -2 62 -6c20 14 39 24 58 33c19 8 33 13 41 15s13 3 13 3c9 -21 14 -44 16 -69s0 -39 0 -39v0zM348 42c28 13 42 40 42 81
+c0 24 -8 43 -26 59c-9 9 -20 13 -32 15s-31 1 -56 -1s-40 -4 -52 -4s-25 2 -42 3s-30 3 -39 3c-10 0 -20 1 -31 -2s-21 -7 -28 -14c-17 -15 -25 -35 -25 -59c0 -41 13 -68 41 -81c27 -13 69 -18 123 -18h2c54 0 95 5 123 18z" />
+ <glyph glyph-name="ion-social-pinterest-outline" unicode="&#xf2b0;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c36 36 56 85 56 136s-20 100 -56 136s-85 56 -136 56s-100 -20 -136 -56s-56 -85 -56 -136s20 -100 56 -136c14 -14 31 -25 48 -34c1 6 2 10 3 16c4 18 29 122 29 122
+s-8 15 -8 36c0 33 20 58 44 58c20 0 30 -16 30 -34c0 -20 -13 -51 -20 -79c-6 -24 12 -43 35 -43c42 0 71 54 71 119c0 49 -33 85 -93 85c-68 0 -110 -50 -110 -107c0 -20 6 -33 15 -44c4 -5 5 -6 3 -12c-1 -4 -4 -14 -5 -18c-2 -6 -6 -8 -11 -6c-31 13 -46 48 -46 86
+c0 64 54 140 160 140c86 0 142 -63 142 -129c0 -88 -49 -153 -121 -153c-24 0 -47 13 -55 28c0 0 -12 -52 -15 -62c-2 -6 -4 -13 -7 -19c15 -4 31 -6 47 -6c51 0 100 20 136 56z" />
+ <glyph glyph-name="ion-social-pinterest" unicode="&#xf2b1;"
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224c-22 0 -44 3 -64 9c8 14 18 31 23 48c3 10 16 62 16 62c8 -15 30 -28 54 -28c72 0 121 65 121 153c0 66 -56 129 -142 129c-106 0 -160 -76 -160 -140c0 -39 15 -73 46 -86c5 -2 10 0 12 6c1 4 3 14 4 18
+c2 6 1 7 -3 12c-9 11 -15 24 -15 44c0 57 42 107 110 107c60 0 94 -36 94 -85c0 -65 -29 -119 -71 -119c-24 0 -42 19 -36 43c7 28 20 59 20 79c0 18 -10 34 -30 34c-24 0 -43 -25 -43 -58c0 -21 7 -36 7 -36s-25 -104 -29 -122c-4 -17 -5 -35 -4 -51
+c-79 35 -134 113 -134 205c0 124 100 224 224 224z" />
+ <glyph glyph-name="ion-social-python" unicode="&#xf4e9;" horiz-adv-x="384"
+d="M129 199c-29 -5 -49 -30 -49 -57v-43v-3h-15c-29 0 -54 29 -62 69c-2 9 -3 17 -3 27v1c0 53 29 95 65 95h127v16h-96v29c0 26 7 40 46 47c13 2 29 4 45 4s39 -1 55 -4c25 -4 46 -22 46 -47v-57v-31c0 -21 -14 -38 -33 -43c-4 -1 -8 -2 -13 -2h-104h3c-4 0 -8 0 -12 -1z
+M140 321c10 0 17 7 17 17s-7 18 -17 18s-18 -8 -18 -18s8 -17 18 -17zM380 225c3 -10 4 -21 4 -33c0 -16 -3 -30 -7 -43c-11 -31 -33 -53 -58 -53h-127v-16h96v-26c0 -26 -23 -40 -46 -47c-35 -10 -68 -9 -97 0c-25 7 -49 22 -49 47v54v33c0 21 14 36 33 41c4 1 8 2 13 2
+h104c3 0 6 1 9 1c27 4 49 28 49 62v38v3h15c28 0 52 -26 61 -63zM244 65c-10 0 -18 -7 -18 -17s8 -18 18 -18s17 8 17 18s-7 17 -17 17z" />
+ <glyph glyph-name="ion-social-reddit-outline" unicode="&#xf23a;" horiz-adv-x="449"
+d="M259 160c0 21 11 31 32 31s32 -10 32 -31s-11 -32 -32 -32s-32 11 -32 32zM127 160c0 21 11 31 32 31s32 -10 32 -31s-11 -32 -32 -32s-32 11 -32 32zM449 197c0 -20 -9 -36 -27 -45c1 -5 1 -9 1 -14c0 -38 -19 -71 -58 -98s-85 -40 -140 -40s-102 13 -141 40
+s-58 59 -58 97c0 5 0 10 1 15c-18 9 -27 24 -27 45c0 14 5 25 15 35s21 15 35 15c13 0 24 -4 33 -13c36 25 79 39 129 41h7l29 98l86 -17c8 19 21 28 41 28c12 0 22 -4 31 -13s13 -20 13 -32s-4 -23 -13 -32s-19 -13 -31 -13s-23 4 -32 13s-13 19 -13 31l-69 14l-24 -77
+c50 -2 94 -16 129 -41c10 9 21 13 34 13c9 0 16 -3 24 -7s14 -10 18 -18s7 -16 7 -25zM375 366c-4 0 -8 -1 -11 -2s-6 -4 -8 -6s-5 -6 -6 -9s-2 -6 -2 -10c0 -8 3 -14 8 -19s12 -8 19 -8c5 0 9 1 13 3s8 6 10 10s4 9 4 14c0 8 -3 14 -8 19s-12 8 -19 8zM18 197
+c0 -11 5 -20 14 -27c7 19 19 37 37 53c-6 4 -12 6 -19 6c-3 0 -7 0 -10 -1s-6 -3 -9 -5s-5 -4 -7 -7s-4 -6 -5 -9s-1 -6 -1 -10zM355 55c34 23 50 51 50 83v9c-1 6 -3 12 -5 18c-6 16 -15 30 -30 43c-5 4 -10 9 -15 12v0c-36 25 -79 37 -130 37s-95 -12 -131 -37v0
+c-5 -3 -10 -8 -15 -12c-15 -13 -24 -27 -30 -43c-2 -6 -4 -12 -5 -18v-9c0 -32 16 -60 50 -83c36 -25 80 -37 131 -37s94 12 130 37zM417 170c9 6 14 16 14 27c0 9 -3 17 -9 23s-13 9 -22 9c-7 0 -14 -2 -20 -6c18 -16 30 -34 37 -53zM289 90l13 -12
+c-20 -20 -45 -30 -77 -30s-58 10 -78 30l13 12c16 -16 38 -24 65 -24s48 8 64 24z" />
+ <glyph glyph-name="ion-social-reddit" unicode="&#xf23b;" horiz-adv-x="449"
+d="M449 197c0 -20 -11 -37 -27 -45c1 -5 1 -9 1 -14c0 -76 -89 -138 -199 -138s-198 61 -198 137c0 5 0 10 1 15c-16 8 -27 25 -27 45c0 28 23 50 50 50c13 0 24 -5 33 -13c33 23 79 39 129 41h2l31 103l90 -18c8 14 22 24 39 24v0h1c25 0 44 -20 44 -45s-19 -45 -44 -45h-1
+v0c-23 0 -42 17 -44 40l-67 14l-22 -74c49 -3 93 -17 125 -40c9 8 21 13 34 13c27 0 49 -22 49 -50zM34 177c5 15 15 29 29 41c-4 3 -9 5 -15 5c-14 0 -25 -11 -25 -25c0 -9 4 -17 11 -21zM358 339c0 -9 7 -17 16 -17s17 8 17 17s-8 17 -17 17s-16 -8 -16 -17zM127 160
+c0 -18 14 -32 32 -32s32 14 32 32s-14 31 -32 31s-32 -13 -32 -31zM224 48c48 0 77 29 78 30l-13 12s-25 -24 -65 -24c-41 0 -64 24 -64 24l-13 -12c1 -1 29 -30 77 -30zM291 128c18 0 32 14 32 32s-14 31 -32 31s-32 -13 -32 -31s14 -32 32 -32zM415 176c7 5 11 13 11 22
+c0 14 -11 25 -25 25c-6 0 -11 -2 -15 -5c14 -12 24 -27 29 -42z" />
+ <glyph glyph-name="ion-social-rss-outline" unicode="&#xf23c;" horiz-adv-x="384"
+d="M56 112c31 0 56 -25 56 -56s-25 -56 -56 -56s-56 25 -56 56s25 56 56 56zM56 16c22 0 40 18 40 40s-18 40 -40 40s-40 -18 -40 -40s18 -40 40 -40zM0 256c140 0 256 -116 256 -256h-80c0 48 -14 94 -48 128s-80 48 -128 48v80zM240 16c-2 26 -8 52 -19 77
+c-12 28 -30 54 -52 76s-48 40 -76 52c-25 10 -51 16 -77 18v-47c50 -3 92 -22 123 -53s50 -73 53 -123h48zM0 384c212 0 384 -172 384 -384h-80c0 171 -133 304 -304 304v80zM227 228c56 -56 89 -131 93 -212h48c-8 190 -162 344 -352 352v-48c81 -4 155 -36 211 -92z" />
+ <glyph glyph-name="ion-social-rss" unicode="&#xf23d;" horiz-adv-x="384"
+d="M56 112c31 0 56 -25 56 -56s-25 -56 -56 -56s-56 25 -56 56s25 56 56 56zM0 256c140 0 256 -116 256 -256h-80c0 48 -14 94 -48 128s-80 48 -128 48v80zM0 384c212 0 384 -172 384 -384h-80c0 171 -133 304 -304 304v80z" />
+ <glyph glyph-name="ion-social-sass" unicode="&#xf4ea;" horiz-adv-x="512"
+d="M512 119v-8c-1 -9 -7 -17 -15 -22s-12 -4 -13 -3s1 3 4 5c13 8 17 20 10 33c-5 10 -15 16 -26 20c-24 8 -48 7 -72 0c4 -12 7 -23 -2 -34c-10 -12 -23 -19 -39 -22c-7 -2 -14 2 -15 9c-3 19 17 36 30 47c-7 11 -11 24 -14 37c-15 -17 -31 -40 -26 -61
+c3 -14 -1 -27 -14 -36s-30 -14 -46 -11c-4 1 -6 5 -5 8c2 14 25 32 35 43c2 2 3 4 1 7c-6 12 -10 23 -14 36c-13 -29 -30 -80 -57 -98c-9 -6 -17 -4 -21 5c-3 8 -2 20 -1 29c-6 -13 -11 -27 -20 -38c-7 -8 -24 -7 -30 1c-16 21 -13 50 -5 73l-29 -15c7 -16 8 -32 4 -49
+c-5 -19 -17 -35 -35 -46c-19 -12 -64 -24 -77 4c-7 16 -4 30 6 44c17 24 48 37 74 50c-32 23 -80 42 -96 80c-15 35 17 68 43 89c59 48 166 95 244 59c15 -7 36 -24 31 -52c-4 -24 -13 -39 -28 -54c-32 -32 -152 -77 -176 -15c-1 1 -1 4 1 4c2 -1 20 -15 43 -16
+c17 -1 36 3 52 8c33 11 71 33 80 67c4 13 -2 28 -15 34c-49 24 -116 -4 -159 -26c-33 -17 -84 -45 -82 -87c1 -37 56 -60 81 -82c15 7 42 15 52 27c11 13 26 25 44 26c8 0 14 -3 16 -10c2 -6 1 -11 0 -19c5 4 11 4 15 -1c12 -14 -22 -50 -10 -66c14 14 21 42 30 59
+c4 8 17 51 26 53c7 2 18 4 25 0c2 -1 3 -3 2 -5c-7 -19 -7 -33 3 -52c14 20 29 43 34 67c1 2 3 3 5 4c7 2 18 3 25 0c3 -1 3 -2 2 -5c-7 -22 -6 -38 6 -58c31 11 69 15 97 -5c-3 2 -7 5 0 0c5 -4 3 -2 0 0c12 -8 19 -18 21 -32zM113 94v0c1 7 -1 13 -3 20
+c-24 -8 -66 -35 -64 -62c1 -10 8 -13 17 -12s19 7 27 13c14 11 22 24 23 41zM216 166c1 3 -2 5 -5 4c-29 -8 -43 -57 -33 -81c1 -3 4 -3 6 -1c17 16 28 56 32 78zM286 84c8 -3 27 17 26 27c-8 -9 -18 -18 -26 -27zM367 102c11 6 16 19 12 30c-8 -6 -21 -19 -20 -31
+c0 -2 6 0 8 1z" />
+ <glyph glyph-name="ion-social-skype-outline" unicode="&#xf23e;" horiz-adv-x="384"
+d="M106 352c-41 0 -74 -33 -74 -73c0 -13 4 -25 10 -36l6 -11l-2 -12c-2 -10 -3 -20 -3 -30c0 -40 16 -77 44 -105s67 -44 107 -44c9 0 19 1 28 3l11 2l9 -5c11 -6 24 -9 36 -9c41 0 74 33 74 73c0 11 -3 22 -8 32l-5 10l3 11c2 10 3 21 3 32c0 40 -16 77 -44 105
+s-67 43 -107 43c-9 0 -18 0 -26 -2l-12 -2l-10 7c-12 7 -26 11 -40 11zM106 384v0c21 0 40 -6 56 -16c10 2 21 2 32 2c101 0 183 -80 183 -180c0 -13 -1 -27 -4 -39c7 -14 11 -29 11 -46c0 -58 -47 -105 -106 -105c-18 0 -35 4 -50 12c-11 -2 -22 -3 -34 -3
+c-101 0 -183 81 -183 181c0 12 2 24 4 36c-9 16 -15 34 -15 53c0 58 47 105 106 105zM288 104c-8 -12 -21 -21 -37 -28s-36 -10 -58 -10c-26 0 -48 5 -65 14c-12 7 -22 15 -30 26s-12 22 -12 33c0 7 3 12 8 17s11 7 19 7c6 0 12 -2 16 -6s7 -8 10 -15s7 -13 11 -18
+s8 -9 15 -12s16 -5 27 -5c15 0 28 4 37 10s13 13 13 22c0 7 -2 13 -7 17c-5 5 -11 9 -19 11c-8 3 -20 5 -34 8c-19 4 -35 9 -48 14c-13 6 -24 13 -32 23s-11 22 -11 36s4 25 12 36c8 10 20 19 36 25c15 6 34 8 54 8c16 0 30 -1 42 -5s23 -9 31 -15s14 -13 18 -20
+s5 -14 5 -21c0 -6 -2 -12 -7 -17s-11 -8 -19 -8c-7 0 -12 2 -16 5c-3 3 -7 7 -11 14c-5 8 -10 15 -16 20s-17 8 -31 8c-13 0 -23 -3 -31 -8s-12 -11 -12 -18c0 -4 2 -7 4 -10c3 -3 6 -6 11 -8s10 -5 15 -6s13 -3 25 -6c15 -3 28 -6 40 -10s23 -8 32 -14s15 -13 20 -22
+s8 -20 8 -32c0 -15 -5 -28 -13 -40z" />
+ <glyph glyph-name="ion-social-skype" unicode="&#xf23f;" horiz-adv-x="384"
+d="M373 151c7 -14 11 -29 11 -46c0 -58 -47 -105 -106 -105c-18 0 -35 4 -50 12c-11 -2 -22 -3 -34 -3c-101 0 -183 81 -183 181c0 12 2 24 4 36c-9 16 -15 34 -15 53c0 58 47 105 106 105c21 0 41 -6 57 -16c10 2 20 2 31 2c101 0 183 -80 183 -180c0 -13 -1 -27 -4 -39z
+M288 104c9 12 12 25 12 40c0 12 -2 23 -7 32s-12 16 -21 22s-19 10 -31 14s-26 7 -41 10c-12 3 -20 5 -25 6s-10 4 -15 6s-7 5 -10 8c-2 3 -4 6 -4 10c0 7 3 13 11 18s19 7 32 7c14 0 25 -2 31 -7s11 -12 16 -20c4 -7 8 -11 11 -14c4 -3 9 -5 16 -5c8 0 13 3 18 8s8 11 8 17
+c0 7 -2 14 -6 21s-10 14 -18 20s-18 11 -30 15s-27 5 -43 5c-20 0 -38 -2 -53 -8c-16 -6 -28 -15 -36 -25c-8 -11 -12 -22 -12 -36s3 -26 11 -36s19 -17 32 -23c13 -5 29 -10 48 -14c14 -3 26 -5 34 -8c8 -2 14 -6 19 -11c5 -4 7 -10 7 -17c0 -9 -4 -17 -13 -23
+s-22 -9 -37 -9c-11 0 -20 2 -27 5s-11 6 -15 11s-8 12 -11 19s-6 11 -10 15s-10 6 -16 6c-8 0 -14 -2 -19 -7s-8 -10 -8 -17c0 -11 4 -22 12 -33s18 -19 30 -26c17 -9 39 -14 65 -14c22 0 42 3 58 10s29 16 37 28z" />
+ <glyph glyph-name="ion-social-snapchat-outline" unicode="&#xf4eb;" horiz-adv-x="480"
+d="M240 400v0v0c-71 0 -128 -54 -118 -128c2 -15 3 -32 4 -45c0 0 -2 -5 -12 -5c-6 0 -15 2 -28 7c-2 1 -4 1 -6 1c-8 0 -13 -6 -14 -12c0 -5 4 -11 8 -13c14 -7 47 -10 47 -33s-23 -47 -41 -64s-64 -21 -64 -21s0 -21 32 -29s32 -5 33 -13c2 -15 1 -22 11 -22c2 0 4 1 6 1
+c8 1 20 3 32 3c11 0 23 -2 34 -9c23 -15 41 -34 76 -34s53 19 76 34c11 7 24 9 35 9c12 0 23 -2 31 -3c2 0 4 -1 6 -1c10 0 9 7 11 22c1 8 1 5 33 13s32 29 32 29s-46 4 -64 21s-41 41 -41 64s33 26 47 33c4 2 9 8 9 13c-1 6 -6 12 -14 12c-2 0 -5 0 -7 -1
+c-13 -5 -21 -6 -27 -6c-10 0 -13 4 -13 4c1 13 2 30 4 45c10 74 -47 128 -118 128zM240 416v0c41 0 80 -16 105 -45c24 -28 34 -63 29 -101c-1 -11 -2 -22 -3 -31c4 1 10 2 18 5c4 1 8 2 12 2c16 0 29 -12 30 -27c1 -13 -9 -25 -18 -29c-4 -2 -9 -3 -14 -5
+c-7 -2 -14 -5 -19 -8c-4 -3 -5 -4 -5 -5c0 -16 20 -37 36 -52c11 -10 39 -16 54 -17l15 -1v-14c0 -2 0 -11 -6 -21c-5 -8 -16 -19 -38 -24c-6 -1 -11 -3 -15 -4c-2 -1 -5 -1 -7 -1v-1c-1 -7 -1 -13 -4 -18c-2 -5 -9 -12 -22 -12c-2 0 -6 0 -9 1c-2 0 -3 1 -5 1
+c-7 1 -15 2 -23 2c-10 0 -19 -2 -26 -6c-4 -3 -9 -7 -14 -10c-18 -13 -38 -27 -71 -27s-53 14 -71 27c-5 3 -9 7 -14 10c-7 4 -15 6 -25 6c-8 0 -17 -1 -24 -2c-2 0 -3 -1 -5 -1c-3 -1 -7 -1 -9 -1c-13 0 -20 7 -22 12c-3 5 -3 11 -4 18v1c-2 0 -4 0 -6 1c-4 1 -10 3 -16 4
+c-22 5 -33 16 -38 24c-6 10 -6 18 -6 20v15l15 1c16 1 44 7 54 17c29 27 36 43 36 52c0 1 0 2 -4 5c-5 3 -13 6 -20 8c-5 2 -10 3 -14 5c-9 4 -18 16 -17 29c1 15 14 27 30 27c4 0 8 0 12 -2c8 -3 13 -4 17 -5c-1 9 -2 19 -3 30c-5 38 5 74 29 102c25 29 64 45 105 45v0z
+M240 219c-21 0 -41 8 -56 23c-3 3 -3 9 0 12s9 3 12 0c12 -12 27 -19 44 -19c16 0 32 7 44 19c3 3 9 3 12 0s3 -9 0 -12c-15 -15 -35 -23 -56 -23zM176 296c0 16 5 24 16 24s16 -8 16 -24s-5 -24 -16 -24s-16 8 -16 24zM272 296c0 16 5 24 16 24s16 -8 16 -24
+s-5 -24 -16 -24s-16 8 -16 24z" />
+ <glyph glyph-name="ion-social-snapchat" unicode="&#xf4ec;" horiz-adv-x="480"
+d="M480 88c0 -2 0 -11 -6 -21c-5 -8 -16 -19 -38 -24c-6 -1 -11 -3 -15 -4c-2 -1 -5 -1 -7 -1v-1c-1 -7 -1 -13 -4 -18c-2 -5 -9 -12 -22 -12c-2 0 -6 0 -9 1c-2 0 -3 1 -5 1c-7 1 -15 2 -23 2c-10 0 -19 -2 -26 -6c-4 -3 -9 -7 -14 -10c-18 -13 -38 -27 -71 -27
+s-53 14 -71 27c-5 3 -9 7 -14 10c-7 4 -15 6 -25 6c-8 0 -17 -1 -24 -2c-2 0 -3 -1 -5 -1c-3 -1 -7 -1 -9 -1c-13 0 -20 7 -22 12c-3 5 -3 11 -4 18v1c-2 0 -4 0 -6 1c-4 1 -10 3 -16 4c-22 5 -33 16 -38 24c-6 10 -6 18 -6 20v15l15 1c16 1 44 7 54 17c29 27 36 43 36 52
+c0 1 0 2 -4 5c-5 3 -13 6 -20 8c-5 2 -10 3 -14 5c-9 4 -18 16 -17 29c1 15 14 27 30 27c4 0 8 0 12 -2c8 -3 13 -4 17 -5c-1 9 -2 19 -3 30c-5 38 5 74 29 102c25 29 64 45 105 45v0c41 0 80 -16 105 -45c24 -28 34 -63 29 -101c-1 -11 -2 -22 -3 -31c4 1 10 2 18 5
+c4 1 8 2 12 2c16 0 29 -12 30 -27c1 -13 -9 -25 -18 -29c-4 -2 -9 -3 -14 -5c-7 -2 -14 -5 -19 -8c-4 -3 -5 -4 -5 -5c0 -16 20 -37 36 -52c11 -10 39 -16 54 -17l15 -1v-14zM192 320c-9 0 -16 -11 -16 -24s7 -24 16 -24s16 11 16 24s-7 24 -16 24zM296 242c3 3 3 9 0 12
+s-9 3 -12 0c-12 -12 -28 -19 -44 -19c-17 0 -32 7 -44 19c-3 3 -9 3 -12 0s-3 -9 0 -12c15 -15 35 -23 56 -23s41 8 56 23zM288 272c9 0 16 11 16 24s-7 24 -16 24s-16 -11 -16 -24s7 -24 16 -24z" />
+ <glyph glyph-name="ion-social-tumblr-outline" unicode="&#xf240;" horiz-adv-x="256"
+d="M193 52c21 0 42 6 63 20v-65c-18 -8 -34 -15 -48 -18s-28 -5 -45 -5c-19 0 -35 2 -50 7c-14 5 -28 12 -38 21s-17 18 -21 28s-6 25 -6 44v140h-48v58c16 5 30 14 42 24s19 21 26 35s11 37 14 59h62v-112h96v-64h-96v-101c0 -24 1 -40 4 -47c2 -7 7 -12 14 -16
+c9 -6 19 -8 31 -8zM240 17v29c-15 -6 -31 -10 -47 -10c-15 0 -28 3 -40 10c-10 6 -17 15 -21 25c-2 6 -4 17 -4 52v117h96v32h-96v112h-32c-2 -16 -7 -36 -14 -50c-8 -16 -17 -29 -30 -40c-11 -9 -23 -17 -36 -23v-31h48v-156c0 -21 2 -32 4 -38c3 -8 10 -15 18 -22
+c9 -8 19 -14 31 -18c13 -4 29 -6 46 -6c16 0 28 2 41 5c11 2 23 6 36 12z" />
+ <glyph glyph-name="ion-social-tumblr" unicode="&#xf241;" horiz-adv-x="256"
+d="M193 52c21 0 42 6 63 20v-65c-18 -8 -34 -15 -48 -18s-28 -5 -45 -5c-19 0 -35 2 -50 7c-14 5 -28 12 -38 21s-17 18 -21 28s-6 25 -6 44v140h-48v58c16 5 30 14 42 24s19 21 26 35s11 37 14 59h62v-112h96v-64h-96v-101c0 -24 1 -40 4 -47c2 -7 7 -12 14 -16
+c9 -6 19 -8 31 -8z" />
+ <glyph glyph-name="ion-social-tux" unicode="&#xf2c5;" horiz-adv-x="383"
+d="M189 347c2 2 -1 -1 0 0c2 2 4 4 6 5c-3 -2 -5 -4 -7 -8c0 1 0 2 1 3zM361 52c7 -4 23 -11 21 -22c-2 -10 -17 -15 -24 -19c-15 -8 -28 -14 -41 -25c-9 -8 -17 -15 -29 -17c-11 -2 -25 -1 -33 8c-5 5 -7 11 -15 12c-25 5 -54 4 -79 0c-13 -2 -21 -11 -32 -17
+c-10 -5 -20 -5 -30 -1c-13 5 -27 10 -41 13s-29 5 -43 9c-31 8 -5 30 -11 50c-3 12 -10 29 8 30c9 1 27 -1 31 11c2 7 -2 15 2 22s-1 17 1 25c4 18 19 32 25 49c5 14 8 25 18 37c9 11 22 22 29 34c10 18 9 35 8 55c-1 17 -1 33 -2 50c0 33 20 60 58 60h14
+c38 0 63 -32 64 -69c0 -19 -5 -38 5 -67c15 -27 36 -48 52 -73c10 -16 16 -31 20 -49c3 -14 9 -31 7 -45c-1 -6 -2 -9 -4 -11c3 -1 7 -2 9 -5c3 -4 2 -11 0 -26c-1 -8 5 -15 12 -19zM137 -3c2 20 -15 39 -25 56c-10 16 -21 43 -39 52c-8 4 -19 5 -23 -5c-2 -7 0 -19 -2 -22
+c-4 -9 -14 -10 -23 -11c-6 0 -17 0 -17 -8c1 -10 10 -20 7 -30c-2 -7 -8 -12 -8 -19c0 -14 38 -15 47 -17c19 -4 37 -14 57 -16c12 -1 25 7 26 20zM253 62c-2 10 2 -10 0 0s-5 28 1 35c4 5 10 6 17 5c0 4 1 9 3 12c8 13 29 8 39 0l-1 2c-3 4 -8 9 -13 10c0 0 4 12 2 34
+c-4 40 -33 62 -33 62c27 -30 27 -58 27 -72c0 -6 -1 -18 -4 -24c-4 -1 -7 -2 -11 -4c-10 -5 -8 2 -8 10c0 18 -2 36 -7 54c-3 9 -7 17 -13 24c-4 5 -4 9 -5 15c-3 12 -9 22 -16 32c-7 9 -7 17 -5 28c1 7 2 14 -6 17c-6 2 -26 5 -27 14c-1 6 -1 16 5 20c16 14 30 -11 17 -24
+c-3 -3 7 -4 8 -4c4 1 4 7 5 10c1 4 1 9 1 13c0 17 -18 32 -34 21c-6 -4 -9 -11 -10 -17c0 -2 -1 -20 0 -20c-4 0 -7 5 -11 5c-3 0 -7 0 -10 -1c0 0 2 14 -2 22c-4 9 -18 16 -24 4s-3 -25 0 -31s4 -6 4 -6c2 1 5 4 5 4s-6 3 -7 11c-1 9 3 14 7 15s10 -2 12 -8s0 -13 0 -13
+c-7 -6 -30 -18 -22 -28c14 -18 33 -15 52 -9c8 3 18 5 24 12c3 3 11 2 8 -4c-2 -5 -18 -7 -22 -9c-9 -4 -18 -8 -28 -10c-6 -1 -13 -5 -28 9c7 -6 8 -16 17 -20c13 -6 33 9 44 15c1 1 16 5 14 0c-1 -4 -11 -7 -15 -9c-11 -6 -23 -21 -36 -22c-8 -1 -21 16 -25 22
+c-1 1 -5 9 -6 4c-1 -8 2 -14 -3 -21c-6 -9 -11 -18 -13 -29c-1 -6 0 -11 -3 -16c-11 -15 -17 -33 -19 -51c0 -4 3 -43 -5 -41c-18 5 -17 33 -14 47c-3 -12 -8 -30 2 -44c12 -15 99 -55 53 -80c7 -14 14 -25 12 -41c8 7 2 20 -1 28c0 0 17 -12 38 -10c17 2 32 7 46 16
+c6 4 11 9 16 14c1 2 4 6 6 7l1 -11c2 -17 -12 -27 -10 -34c4 8 11 14 13 24c3 12 0 24 -2 36zM155 323v0v-3c2 0 2 5 1 8c-1 4 -3 6 -4 6h-2c3 -2 5 -6 5 -11zM210 335c3 -2 0 0 0 0c3 -2 5 -5 5 -10v-3c2 0 3 4 2 7s-3 6 -5 6h-2zM347 15c24 11 -24 -10 0 0
+c24 11 35 17 20 26c-17 10 -26 13 -26 29c0 5 4 16 2 22c-1 4 -6 5 -9 5c-10 -10 -17 -25 -34 -25c-14 0 -25 11 -28 24c-4 2 -10 1 -13 -4c-6 -12 1 -29 3 -41c2 -18 -4 -35 -2 -53c2 -21 26 -22 40 -13c16 10 29 22 47 30z" />
+ <glyph glyph-name="ion-social-twitch-outline" unicode="&#xf4ed;" horiz-adv-x="416"
+d="M32 416h384v-272l-112 -112h-80l-64 -64h-64v64h-96v304zM368 160v208h-304v-272h80v-64l64 64h96zM272 176v129h48v-129h-48zM160 176v129h48v-129h-48z" />
+ <glyph glyph-name="ion-social-twitch" unicode="&#xf4ee;" horiz-adv-x="416"
+d="M32 416h384v-272l-112 -112h-80l-64 -64h-64v64h-96v304zM208 176v129h-48v-129h48zM320 176v129h-48v-129h48z" />
+ <glyph glyph-name="ion-social-twitter-outline" unicode="&#xf242;" horiz-adv-x="472"
+d="M472 338c-13 -20 -29 -36 -48 -50v-12c0 -128 -98 -276 -276 -276c-55 0 -105 16 -148 44c8 -1 15 -2 23 -2c45 0 87 16 120 42c-42 1 -78 29 -90 67c6 -1 12 -2 18 -2c9 0 18 2 26 4c-44 9 -78 48 -78 95v1c13 -7 28 -12 44 -12c-26 17 -43 47 -43 81c0 18 5 34 13 48
+c48 -59 119 -97 199 -101c-2 7 -2 14 -2 22c0 54 43 97 97 97c28 0 52 -12 70 -31c22 4 43 13 62 24c-7 -23 -23 -42 -43 -54c20 2 39 7 56 15zM414 301c3 2 8 6 11 8c-2 0 -11 -2 -19 -1s-21 5 -21 5s14 13 18 17l11 11c-4 -1 -10 -2 -14 -3l-8 -2l-6 6
+c-15 16 -37 26 -59 26c-45 0 -81 -37 -81 -81c0 -6 1 -12 2 -18l5 -21l-22 1c-42 2 -81 13 -118 32c-28 14 -53 34 -75 56c-1 -6 -2 -13 -2 -19c0 -27 14 -53 36 -68c0 0 33 -23 46 -29c-24 -2 -56 0 -56 0c-8 0 -16 1 -24 3c8 -28 32 -50 62 -56l61 -10l-61 -21
+c-7 -2 -14 -3 -21 -3c15 -20 38 -34 64 -34l45 -1l-35 -28c-18 -14 -38 -25 -60 -33c-10 -3 -19 -6 -29 -8c27 -9 55 -14 84 -14c40 0 78 8 112 24c31 14 58 34 81 60c22 24 38 53 50 84c11 30 17 62 17 92v12l-1 8z" />
+ <glyph glyph-name="ion-social-twitter" unicode="&#xf243;" horiz-adv-x="472"
+d="M472 338c-13 -20 -29 -36 -48 -50v-12c0 -128 -98 -276 -276 -276c-55 0 -105 16 -148 44c8 -1 15 -2 23 -2c45 0 87 16 120 42c-42 1 -78 29 -90 67c6 -1 12 -2 18 -2c9 0 18 2 26 4c-44 9 -78 48 -78 95v1c13 -7 28 -12 44 -12c-26 17 -43 47 -43 81c0 18 5 34 13 48
+c48 -59 119 -97 199 -101c-2 7 -2 14 -2 22c0 54 43 97 97 97c28 0 52 -12 70 -31c22 4 43 13 62 24c-7 -23 -23 -42 -43 -54c20 2 39 7 56 15z" />
+ <glyph glyph-name="ion-social-usd-outline" unicode="&#xf352;" horiz-adv-x="320"
+d="M125 345c11 2 19 3 19 3v-131l-22 6c-15 5 -27 11 -36 19c-12 10 -19 25 -19 43c0 13 4 24 11 33c6 8 13 14 22 19c7 4 17 6 25 8zM128 238v92c-7 -2 -15 -4 -21 -7c-7 -4 -12 -9 -17 -15s-7 -14 -7 -23c0 -13 4 -24 13 -31c8 -7 20 -12 32 -16zM252 151
+c10 -10 15 -24 15 -42c0 -9 -1 -18 -5 -27s-11 -17 -20 -24c-8 -6 -18 -11 -31 -15c-6 -2 -11 -3 -17 -4s-18 -1 -18 -1v145l20 -5c10 -3 19 -6 28 -9c10 -4 20 -10 28 -18zM247 89c3 7 4 13 4 20c0 14 -3 24 -10 31s-15 11 -23 14s-16 5 -26 8v-107c6 1 10 2 14 3
+c11 3 20 8 27 13s11 11 14 18zM315 145c3 -10 5 -19 5 -29c0 -21 -5 -38 -14 -53s-20 -26 -35 -35s-31 -17 -50 -21c-10 -2 -19 -3 -29 -4v-35h-64v35c-9 1 -19 4 -28 6c-20 5 -36 12 -51 23s-26 24 -35 41c-8 16 -13 34 -14 55h69c0 -12 2 -24 7 -33c5 -10 12 -17 21 -23
+s20 -11 31 -14v120c-8 2 -18 4 -27 6c-17 4 -30 9 -41 16s-20 15 -27 23s-11 17 -14 26s-4 18 -4 28c0 18 4 34 12 48s19 25 33 34s29 16 46 20c7 2 15 3 22 4v33h64v-33c9 -1 16 -4 24 -6c18 -5 34 -12 48 -22s25 -22 33 -37c7 -13 11 -28 12 -46h-69c-3 21 -12 37 -26 46
+c-7 4 -13 8 -22 10v-106c9 -2 16 -4 25 -6c12 -3 22 -6 27 -7c13 -4 23 -9 33 -15c10 -7 18 -14 24 -22s11 -17 14 -27zM293 72c7 12 11 27 11 44c0 8 -1 16 -4 24s-7 15 -12 22s-12 13 -20 19c-8 5 -18 10 -29 13c-5 1 -13 3 -24 6h-1l-4 1c-7 2 -13 4 -21 6l-13 3v137
+s9 -1 19 -4s19 -6 28 -12c15 -9 25 -24 30 -43h38c-2 8 -4 15 -8 22c-7 13 -16 24 -28 32c-12 9 -27 16 -43 20c-8 2 -16 4 -23 5l-13 2v31h-32v-31l-14 -2c-7 -1 -14 -2 -20 -4c-15 -4 -29 -10 -41 -18s-21 -16 -28 -28c-7 -11 -10 -24 -10 -40c0 -8 1 -15 3 -23
+c2 -7 6 -14 11 -21s14 -13 23 -19c10 -6 22 -10 37 -14v0v0c4 -1 8 -2 11 -3c5 -1 11 -3 16 -4l12 -3v-151s-8 1 -20 4s-26 8 -36 15c-11 8 -20 18 -26 30c-4 7 -6 16 -8 24h-36c2 -11 5 -23 10 -32c8 -14 17 -26 30 -35c13 -10 28 -16 46 -21c8 -2 17 -4 26 -5l14 -2v-33
+h32v33l15 1c9 1 17 3 26 5c17 4 32 10 45 18s23 19 31 31z" />
+ <glyph glyph-name="ion-social-usd" unicode="&#xf353;" horiz-adv-x="320"
+d="M315 145c3 -10 5 -19 5 -29c0 -21 -5 -38 -14 -53s-20 -26 -35 -35s-31 -17 -50 -21c-10 -2 -19 -3 -29 -4v-35h-64v35c-9 1 -19 4 -28 6c-20 5 -36 12 -51 23s-26 24 -35 41c-8 16 -13 34 -14 55h69c0 -12 2 -24 7 -33c5 -10 12 -17 21 -23s20 -11 31 -14v120
+c-8 2 -18 4 -27 6c-17 4 -30 9 -41 16s-20 15 -27 23s-11 17 -14 26s-4 18 -4 28c0 18 4 34 12 48s19 25 33 34s29 16 46 20c7 2 15 3 22 4v33h64v-33c9 -1 16 -4 24 -6c18 -5 34 -12 48 -22s25 -22 33 -37c7 -13 11 -28 12 -46h-69c-3 21 -12 37 -26 46c-7 4 -13 8 -22 10
+v-106c9 -2 16 -4 25 -6c12 -3 22 -6 27 -7c13 -4 23 -9 33 -15c10 -7 18 -14 24 -22s11 -17 14 -27zM128 238v92c-7 -2 -15 -4 -21 -7c-7 -4 -12 -9 -17 -15s-7 -14 -7 -23c0 -13 4 -24 13 -31c8 -7 20 -12 32 -16zM247 89c3 7 4 13 4 20c0 14 -3 24 -10 31s-15 11 -23 14
+s-16 5 -26 8v-107c6 1 10 2 14 3c11 3 20 8 27 13s11 11 14 18z" />
+ <glyph glyph-name="ion-social-vimeo-outline" unicode="&#xf244;"
+d="M445 334c7 -33 1 -66 -13 -97s-31 -59 -51 -87c-26 -36 -52 -71 -85 -101c-19 -18 -41 -35 -66 -44c-10 -4 -19 -5 -27 -5c-17 0 -31 9 -44 27c-14 19 -22 40 -28 63c-12 45 -25 90 -38 134c-4 12 -9 22 -15 33c-3 5 -8 10 -12 14c-2 2 -5 3 -8 3s-6 -1 -9 -3
+c-10 -6 -28 -18 -28 -18l-21 27c26 24 82 71 82 71c11 9 33 25 48 27h8c18 0 32 -7 42 -22c11 -17 15 -37 18 -57c7 -41 12 -82 24 -122c3 -10 7 -20 12 -29c4 -7 9 -10 14 -10c4 0 7 2 11 5s7 6 10 10c20 24 37 52 48 81c3 9 3 17 3 27c0 13 -10 25 -25 26h-7
+c-11 0 -20 -2 -32 -7c6 24 24 62 54 84c20 14 45 20 67 20c10 0 20 -2 27 -4c23 -8 36 -23 41 -46zM418 244c13 30 17 59 11 87c-4 19 -13 28 -30 34c-6 2 -14 3 -22 3c-21 0 -42 -6 -57 -17c-16 -12 -29 -30 -38 -48h6h8c23 -1 39 -19 40 -41c0 -10 0 -22 -4 -34
+c-11 -29 -29 -58 -51 -85c-4 -4 -7 -9 -12 -13c-7 -6 -15 -8 -22 -8c-8 0 -18 3 -27 18c-7 11 -11 22 -14 32c-10 31 -14 64 -19 95c-2 10 -3 19 -5 29c-3 17 -6 36 -16 51c-7 10 -16 15 -28 15h-6c-8 -1 -25 -11 -40 -23c-2 -2 -43 -37 -70 -61l2 -3c5 4 12 7 16 10
+c6 3 12 5 18 5c7 0 13 -3 18 -7c8 -7 13 -12 16 -18c6 -11 12 -24 16 -37c13 -44 26 -88 38 -133c5 -19 13 -41 26 -59s23 -20 31 -20c6 0 13 1 21 4c23 8 43 25 61 41c32 29 57 63 83 99v0c21 28 37 55 50 84z" />
+ <glyph glyph-name="ion-social-vimeo" unicode="&#xf245;"
+d="M445 334c7 -33 1 -66 -13 -97s-31 -59 -51 -87c-26 -36 -52 -71 -85 -101c-19 -18 -41 -35 -66 -44c-31 -11 -52 -5 -71 22c-14 19 -22 40 -28 63c-12 45 -25 90 -38 134c-4 12 -9 22 -15 33c-3 5 -8 10 -12 14c-5 4 -11 3 -17 0c-10 -6 -28 -18 -28 -18l-21 27
+c26 24 82 71 82 71c11 9 33 25 48 27c21 3 38 -4 50 -22c11 -17 15 -37 18 -57c7 -41 11 -82 23 -122c3 -10 8 -20 13 -29c7 -11 15 -13 25 -5c4 3 7 6 10 10c20 24 37 52 48 81c3 9 3 17 3 27c0 13 -10 25 -25 26s-24 -1 -39 -7c6 24 24 62 54 84c29 21 71 24 94 16
+s36 -23 41 -46z" />
+ <glyph glyph-name="ion-social-whatsapp-outline" unicode="&#xf4ef;"
+d="M178 294c4 -11 15 -39 16 -42s2 -6 0 -10s-3 -6 -6 -9s-6 -7 -9 -9c-3 -3 -6 -6 -3 -12s14 -24 30 -39c21 -20 38 -27 44 -30s9 -3 12 1s15 16 19 21s8 5 13 3s31 -17 37 -20s10 -5 11 -7s0 -13 -5 -26s-28 -24 -38 -25s-11 -8 -67 16s-90 84 -93 88s-22 31 -21 58
+s17 41 22 46s11 7 15 7h10s9 0 13 -11zM228 384c-50 0 -97 -20 -133 -55c-35 -35 -55 -81 -55 -131c0 -34 9 -67 27 -96l8 -13l-5 -14l-19 -57l61 19l13 4l12 -6c28 -15 59 -23 91 -23c50 0 97 19 133 54c35 35 55 82 55 132s-20 96 -55 131c-36 35 -83 55 -133 55zM228 416
+v0c121 0 220 -97 220 -218s-99 -218 -220 -218c-39 0 -74 10 -106 27l-122 -39l40 117c-20 33 -32 72 -32 113c0 121 99 218 220 218z" />
+ <glyph glyph-name="ion-social-whatsapp" unicode="&#xf4f0;"
+d="M228 416c121 0 220 -97 220 -218s-99 -218 -220 -218c-39 0 -74 10 -106 27l-122 -39l40 117c-20 33 -32 72 -32 113c0 121 99 218 220 218zM337 115c5 13 6 24 5 26s-5 4 -11 7s-32 18 -37 20s-9 2 -13 -3s-16 -17 -19 -21s-6 -4 -12 -1s-23 10 -44 30
+c-16 15 -27 33 -30 39s0 9 3 12c3 2 6 6 9 9s4 5 6 9s1 7 0 10s-12 31 -16 42s-10 11 -13 11h-10s-10 -2 -15 -7s-21 -19 -22 -46s18 -54 21 -58s37 -64 93 -88s57 -17 67 -16s33 12 38 25z" />
+ <glyph glyph-name="ion-social-windows-outline" unicode="&#xf246;"
+d="M432 167h-216v-149l216 -32v181zM448 183v0v-215l-248 36v179h248zM168 167h-152v-120l152 -22v142zM184 183v0v-177l-184 27v150h184zM432 398v0l-216 -31v-152h216v183zM448 416v0v-217h-248v182zM168 360v0l-152 -22v-123h152v145zM184 378v0v-179h-184v153z" />
+ <glyph glyph-name="ion-social-windows" unicode="&#xf247;"
+d="M448 183v0v-215l-248 36v179h248zM184 183v0v-177l-184 27v150h184zM448 416v0v-217h-248v182zM184 378v0v-179h-184v153z" />
+ <glyph glyph-name="ion-social-wordpress-outline" unicode="&#xf248;" horiz-adv-x="384"
+d="M192 384c106 0 192 -86 192 -192c0 -9 -1 -18 -2 -26c-12 -85 -79 -153 -165 -164c-8 -1 -17 -2 -25 -2c-106 0 -192 86 -192 192s86 192 192 192zM19 192c0 -68 40 -127 98 -155l-83 225c-10 -21 -15 -45 -15 -70zM214 21c12 2 24 4 35 8c0 1 -1 2 -1 3l-53 145l-33 -96
+v0l-19 -55c15 -5 32 -7 49 -7c8 0 15 1 22 2zM216 273l62 -186l17 58c9 22 13 41 13 56c0 21 -7 35 -14 47c-9 14 -17 27 -17 41c0 16 12 30 29 30h2c-31 28 -71 45 -116 45c-60 0 -113 -30 -144 -77c4 0 8 -1 11 -1c18 0 46 3 46 3c9 1 10 -14 1 -15c0 0 -10 -1 -20 -1
+l63 -187l38 113l-27 74c-9 0 -18 1 -18 1c-9 0 -8 16 1 15c0 0 28 -3 45 -3c18 0 46 3 46 3c9 1 11 -14 2 -15c0 0 -10 -1 -20 -1zM279 43c45 26 77 71 84 125c1 8 2 16 2 24c0 30 -8 58 -22 83c1 -6 1 -12 1 -18c0 -18 -3 -37 -13 -62l-39 -113z" />
+ <glyph glyph-name="ion-social-wordpress" unicode="&#xf249;" horiz-adv-x="384"
+d="M195 177l53 -146c0 -1 6 -13 9 -19c-3 -1 -5 -2 -8 -3v0c-10 -3 -21 -6 -32 -7c-8 -1 -17 -2 -25 -2c-17 0 -34 2 -50 6v0c-2 0 -3 2 -5 2l25 73v0zM17 268c6 0 7 -1 15 -1l93 -255c-3 1 -5 2 -8 3c-63 27 -109 87 -116 158c-1 6 -1 13 -1 19c0 25 7 53 17 76zM366 273
+c11 -24 18 -52 18 -81c0 -9 -1 -18 -2 -26c-9 -65 -50 -120 -107 -147c-2 -1 -3 -1 -5 -2l22 65l39 113c10 25 13 45 13 62v19v0c-1 18 -10 44 -36 43h-2c-17 0 -29 -14 -29 -30c0 -14 8 -27 17 -41c7 -12 14 -26 14 -47c0 -15 -4 -34 -13 -56l-17 -58l-62 186
+c10 0 20 1 20 1c9 1 7 16 -2 15c0 0 -28 -3 -46 -3c-17 0 -45 3 -45 3c-9 1 -10 -15 -1 -15c0 0 9 -1 18 -1l27 -74l-38 -113l-63 187c10 0 20 2 20 2c9 1 8 15 -1 14c0 0 -28 -2 -46 -2h-34c5 9 11 17 17 25c35 44 90 72 150 72c24 0 48 -5 69 -13c34 -13 63 -36 85 -65
+c2 -2 3 -5 5 -7c6 -8 11 -17 15 -26z" />
+ <glyph glyph-name="ion-social-yahoo-outline" unicode="&#xf24a;" horiz-adv-x="320"
+d="M289 380c11 0 21 1 31 4l-128 -213v-171c-10 4 -21 4 -32 4s-22 0 -32 -4v171l-128 213c10 -4 21 -4 32 -4s22 0 32 4l96 -160l96 160c10 -4 22 -4 33 -4zM178 180l111 184h-1c-7 0 -15 0 -24 2l-90 -150l-14 -23l-14 23l-89 150c-9 -2 -17 -2 -25 -2h-1l111 -184l2 -4
+v-5v-151c6 1 11 0 16 0s11 1 16 0v151v5z" />
+ <glyph glyph-name="ion-social-yahoo" unicode="&#xf24b;" horiz-adv-x="320"
+d="M289 380c11 0 21 1 31 4l-128 -213v-171c-10 4 -21 4 -32 4s-22 0 -32 -4v171l-128 213c10 -4 21 -4 32 -4s22 0 32 4l96 -160l96 160c10 -4 22 -4 33 -4z" />
+ <glyph glyph-name="ion-social-yen-outline" unicode="&#xf4f1;" horiz-adv-x="384"
+d="M384 416l-112 -208h48v-48h-73l-15 -31v-17h88v-48h-88v-96h-80v96h-88v48h88v17l-14 31h-74v48h48l-112 208h80l112 -221l112 221h80zM304 192h-59l13 24l99 184v0h-43l-122 -240l-122 240h-43l99 -184l13 -24h-59v-16h68l20 -44v-36h-88v-16h88v-96h48v96h88v16h-88v37
+l21 43h67v16z" />
+ <glyph glyph-name="ion-social-yen" unicode="&#xf4f2;" horiz-adv-x="384"
+d="M384 416l-112 -208h48v-48h-73l-15 -31v-17h88v-48h-88v-96h-80v96h-88v48h88v17l-14 31h-74v48h48l-112 208h80l112 -221l112 221h80z" />
+ <glyph glyph-name="ion-social-youtube-outline" unicode="&#xf24c;" horiz-adv-x="512"
+d="M265 352v0h-9h-9c-65 0 -118 -2 -168 -4h-1h-1c-23 0 -42 -22 -42 -49v-1v-1c-2 -34 -3 -70 -3 -105v0v0c0 -35 1 -70 3 -104v-2v-1c0 -14 5 -26 14 -36c8 -9 17 -13 28 -13h1h1c52 -2 108 -4 166 -4h11v0v0h11c58 0 113 2 166 4h1h1c11 0 20 4 28 13c9 10 14 22 14 36v1
+v2c2 34 3 68 3 104v0v0c0 36 -1 71 -3 105v1v2c0 27 -19 49 -42 49h-1h-1c-49 2 -103 3 -168 3zM265 384v0c58 0 115 0 170 -3c41 0 74 -36 74 -81c2 -36 3 -72 3 -108s-1 -71 -3 -107c0 -45 -33 -81 -74 -81c-55 -3 -111 -4 -168 -4h-11h-11c-57 0 -113 1 -168 4
+c-41 0 -74 36 -74 81c-2 36 -3 71 -3 107s2 71 4 107c0 45 32 82 73 82c55 2 112 3 170 3h9h9zM207 94v197l145 -99z" />
+ <glyph glyph-name="ion-social-youtube" unicode="&#xf24d;" horiz-adv-x="512"
+d="M509 299c2 -36 3 -71 3 -107s-1 -71 -3 -107c0 -45 -33 -81 -74 -81c-58 -3 -118 -4 -179 -4s-121 1 -179 4c-41 0 -74 36 -74 81c-2 36 -3 71 -3 107s2 71 4 107c0 45 32 81 73 81c55 3 112 4 170 4h9h9c58 0 115 -1 170 -4c41 0 74 -36 74 -81zM207 94l145 98l-145 99
+v-197z" />
+ <glyph glyph-name="ion-soup-can-outline" unicode="&#xf4f3;" horiz-adv-x="320"
+d="M160 304c-88 0 -160 29 -160 64s72 64 160 64s160 -29 160 -64s-72 -64 -160 -64zM160 415c-70 0 -126 -19 -126 -43s56 -43 126 -43s126 19 126 43s-56 43 -126 43zM161 288c88 0 158 29 159 64c0 -5 0 -33 -8 -40v-240c0 -35 -64 -64 -152 -64s-152 29 -152 64v240
+c-8 6 -8 40 -8 40c0 -35 73 -64 161 -64zM280 72v80c-18 -10 -43 -17 -72 -21h-2c-6 -20 -24 -35 -46 -35s-40 15 -46 35h-2c-29 4 -54 11 -72 21v-80c1 -2 9 -10 30 -18c24 -9 55 -14 90 -14s67 5 91 14c21 8 29 16 29 18zM280 184v91c-33 -12 -75 -19 -119 -19
+c-45 0 -87 7 -121 19v-91c18 -10 43 -17 73 -21h3c7 17 24 29 44 29s37 -12 44 -29h3c30 4 55 11 73 21zM178 -16zM160 -16h1h-1v0zM312 32l8 -16c0 -7 -3 -14 -8 -20c-21 -26 -81 -44 -152 -44s-131 18 -152 44c-5 6 -8 13 -8 20l8 16v16c0 -35 63 -64 152 -64
+s152 28 152 64v-16z" />
+ <glyph glyph-name="ion-soup-can" unicode="&#xf4f4;" horiz-adv-x="320"
+d="M0 368c0 43 53 64 160 64s160 -21 160 -64s-53 -64 -160 -64s-160 21 -160 64zM160 8c-44 0 -80 6 -109 18s-43 28 -43 46v128c0 -9 4 -19 13 -27s21 -15 37 -21s33 -10 54 -13c1 -12 7 -23 16 -31s20 -12 32 -12s23 4 32 12s15 19 16 31c31 4 56 12 75 23s29 24 29 38
+v-128c0 -18 -14 -34 -43 -46s-65 -18 -109 -18zM160 288c44 0 82 6 113 18s47 28 47 46v-8c0 -5 -1 -11 -2 -18s-3 -11 -6 -14v-96c0 -14 -10 -27 -29 -38s-44 -19 -76 -23c-2 11 -8 19 -17 26s-19 11 -30 11s-21 -4 -30 -11s-15 -15 -17 -26c-32 4 -57 12 -76 23
+s-29 24 -29 38v96c-5 5 -8 18 -8 40c0 -18 16 -34 47 -46s69 -18 113 -18zM312 56v-24l8 -16c0 -7 -3 -14 -8 -20c-11 -13 -30 -24 -58 -32s-59 -12 -94 -12s-66 4 -94 12s-47 19 -58 32c-5 6 -8 13 -8 20l8 16v24c0 -18 14 -34 43 -46s65 -18 109 -18s80 6 109 18
+s43 28 43 46z" />
+ <glyph glyph-name="ion-speakerphone" unicode="&#xf2b2;"
+d="M39 266c0 -37 20 -69 50 -86c-1 0 -2 1 -3 1s-4 1 -5 1v0c-35 3 -62 33 -69 69c-6 0 -12 7 -12 16c0 8 5 15 11 16c6 42 40 75 81 75h8c-36 -15 -61 -51 -61 -92zM433 357c10 -25 15 -56 15 -88s-5 -63 -15 -88l-3 -9c-6 -14 -15 -26 -24 -34c-10 -10 -22 -19 -34 -20h-3
+c-7 0 -15 2 -22 5c-3 2 -10 5 -10 5c-22 10 -84 28 -115 29c-4 -8 -10 -20 -12 -30c-2 -9 -6 -27 -7 -61c-1 -32 1 -59 3 -82c0 -2 1 -5 1 -7c0 -6 -2 -9 -9 -9h-77c-6 0 -9 3 -9 6v7c2 72 25 140 26 145c2 9 5 17 7 30c2 12 -27 13 -40 24c-29 17 -47 49 -47 86
+c0 41 25 77 59 92h42h19c58 3 114 21 163 50c1 1 3 1 4 2v0c8 4 16 6 24 6c13 0 26 -6 37 -16c9 -9 18 -21 24 -35c1 -3 2 -5 3 -8zM410 180c9 22 15 54 15 89s-6 66 -15 88c-8 18 -19 29 -30 29s-21 -11 -29 -29c-9 -22 -15 -53 -15 -88s6 -67 15 -89c8 -19 18 -33 29 -33
+s22 15 30 33z" />
+ <glyph glyph-name="ion-speedometer" unicode="&#xf2b3;"
+d="M312 192l8 -8l-64 -84v-4c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32h4zM224 352c124 0 224 -100 224 -224c0 -34 -8 -67 -22 -96h-36c15 27 25 57 26 88h-32v16h32c-1 29 -9 56 -22 81l-27 -15l-8 13l27 16c-8 12 -16 23 -26 33s-21 18 -33 26l-16 -27l-14 8
+l16 27c-25 13 -52 21 -81 22v-32h-16v32c-29 -1 -56 -9 -81 -22l16 -27l-14 -8l-16 27c-12 -8 -23 -16 -33 -26s-19 -21 -26 -33l28 -16l-8 -13l-28 15c-13 -25 -21 -52 -22 -81h32v-16h-32c1 -31 11 -61 26 -88h-36c-14 29 -22 62 -22 96c0 124 100 224 224 224z" />
+ <glyph glyph-name="ion-spoon" unicode="&#xf2b4;" horiz-adv-x="128"
+d="M128 288c0 64 -26 128 -64 128s-64 -64 -64 -128v0c1 -25 16 -54 37 -64l1 -1v0c3 -2 10 -6 10 -10c0 0 -16 -199 -16 -210s4 -20 10 -26s14 -9 22 -9v0v0c8 0 16 3 22 9s10 13 10 26s-16 210 -16 210c0 4 7 8 10 10l1 1c22 10 37 38 37 64z" />
+ <glyph glyph-name="ion-star" unicode="&#xf24e;"
+d="M448 248l-139 -104l55 -176l-140 112l-140 -112l55 176l-139 104h172l52 168l53 -168h171z" />
+ <glyph glyph-name="ion-stats-bars" unicode="&#xf2b5;" horiz-adv-x="352"
+d="M96 32v320h64v-320h-64zM0 32v96h64v-96h-64zM192 32v160h64v-160h-64zM288 32v224h64v-224h-64z" />
+ <glyph glyph-name="ion-steam" unicode="&#xf30b;" horiz-adv-x="512"
+d="M480 240c0 -20 -16 -37 -37 -37c-20 0 -37 16 -37 37c0 20 16 37 37 37c20 0 37 -17 37 -37zM443 309c38 0 69 -31 69 -69s-31 -70 -69 -70l-67 -48c-2 -26 -24 -47 -51 -47c-25 0 -46 18 -51 41l-196 78c-8 -5 -16 -7 -26 -7c-28 0 -52 24 -52 52s24 52 52 52
+c25 0 45 -18 50 -41l196 -79c8 5 17 8 27 8c2 0 3 -1 5 -1l43 62c0 38 32 69 70 69zM443 286c-26 0 -47 -20 -47 -46s21 -47 47 -47s46 21 46 47s-20 46 -46 46zM52 277c-21 0 -38 -17 -38 -38s17 -38 38 -38c3 0 5 0 8 1l-16 6v0c-15 7 -22 24 -16 39s24 23 39 17v0l19 -7
+c-6 12 -19 20 -34 20zM325 165c-3 0 -6 -1 -9 -1l16 -6c16 -6 23 -24 17 -40s-23 -23 -39 -17c-6 3 -13 6 -19 8c6 -12 19 -20 34 -20c21 0 38 17 38 38s-17 38 -38 38z" />
+ <glyph glyph-name="ion-stop" unicode="&#xf24f;" horiz-adv-x="384"
+d="M373 384c6 0 11 -5 11 -11v-362c0 -6 -5 -11 -11 -11h-362c-6 0 -11 5 -11 11v362c0 6 5 11 11 11h362z" />
+ <glyph glyph-name="ion-thermometer" unicode="&#xf2b6;" horiz-adv-x="160"
+d="M127 112c20 -14 33 -38 33 -64c0 -44 -36 -80 -80 -80s-80 36 -80 80c0 27 13 51 33 65v257c0 26 21 46 47 46s47 -20 47 -46v-258zM65 370v-50h30v50c0 8 -7 14 -15 14s-15 -6 -15 -14zM96 160v16h-16v-16h16zM96 192v64h-16v-64h16z" />
+ <glyph glyph-name="ion-thumbsdown" unicode="&#xf250;" horiz-adv-x="384"
+d="M24 195c-10 5 -18 17 -18 29c0 14 8 25 20 30c-4 5 -6 12 -6 19c0 14 8 25 20 30c-3 5 -5 11 -5 17c0 18 11 24 35 30s74 12 126 9c23 -1 55 -7 76 -7v32h112v-240h-112v16c-15 -1 -31 -4 -40 -14c-22 -23 -40 -65 -40 -108c0 -19 1 -29 -4 -34c-13 -13 -44 9 -52 37
+c-9 34 -1 62 1 87h-103c-19 0 -34 15 -34 34c0 15 10 29 24 33zM336 352c-9 0 -16 -7 -16 -16s7 -16 16 -16s16 7 16 16s-7 16 -16 16z" />
+ <glyph glyph-name="ion-thumbsup" unicode="&#xf251;" horiz-adv-x="384"
+d="M360 189c10 -5 18 -17 18 -29c0 -14 -8 -25 -20 -30c4 -5 6 -12 6 -19c0 -14 -8 -25 -20 -30c3 -5 5 -11 5 -17c0 -18 -11 -24 -35 -30s-74 -12 -126 -9c-23 1 -55 7 -76 7v-32h-112v240h112v-16c15 1 31 4 40 14c22 23 40 65 40 108c0 19 -1 29 4 34c13 13 44 -9 52 -37
+c9 -34 1 -62 -1 -87h103c19 0 34 -15 34 -34c0 -15 -10 -29 -24 -33zM48 32c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16z" />
+ <glyph glyph-name="ion-toggle-filled" unicode="&#xf354;"
+d="M320 240c26 0 48 -22 48 -48s-22 -48 -48 -48s-48 22 -48 48s22 48 48 48zM320 320c71 0 128 -57 128 -128s-57 -128 -128 -128h-192c-71 0 -128 57 -128 128s57 128 128 128h192zM320 112c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80z" />
+ <glyph glyph-name="ion-toggle" unicode="&#xf355;"
+d="M320 288h-192c-53 0 -96 -43 -96 -96s43 -96 96 -96h192c53 0 96 43 96 96s-43 96 -96 96zM320 320v0c71 0 128 -57 128 -128s-57 -128 -128 -128h-192c-71 0 -128 57 -128 128s57 128 128 128h192zM128 240c-26 0 -48 -22 -48 -48s22 -48 48 -48s48 22 48 48
+s-22 48 -48 48zM128 272v0c44 0 80 -36 80 -80s-36 -80 -80 -80s-80 36 -80 80s36 80 80 80z" />
+ <glyph glyph-name="ion-transgender" unicode="&#xf4f5;" horiz-adv-x="512"
+d="M368 448h144v-144h-40v76l-101 -100c8 -17 13 -36 13 -56c0 -63 -46 -115 -104 -126v-52h72v-46h-72v-64h-48v64h-72v46h72v52c-59 11 -104 63 -104 126c0 20 5 39 13 56l-22 22l-36 -36l-33 33l36 36l-46 45v-76h-40v144h144v-40h-70l43 -42l36 36l33 -33l-36 -36
+l17 -17c23 22 54 36 89 36c27 0 53 -8 74 -23c0 0 6 -5 15 -13l93 92h-70v40zM256 144c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80z" />
+ <glyph glyph-name="ion-trash-a" unicode="&#xf252;" horiz-adv-x="352"
+d="M261 320v0h91v-32h-9s-5 -1 -8 -4s-4 -9 -4 -9l-19 -241c-2 -29 -2 -34 -36 -34h-200c-34 0 -34 5 -36 34l-19 242s-1 6 -4 9s-8 3 -8 3h-9v32h91v29c0 19 14 35 34 35h101c20 0 35 -16 35 -35v-29zM112 349v-29h128v29c0 10 -9 15 -19 15h-91c-10 0 -18 -5 -18 -15z
+M104 64h20l-10 192h-21zM187 64v192h-22v-192h22zM249 64l10 192h-20l-11 -192h21z" />
+ <glyph glyph-name="ion-trash-b" unicode="&#xf253;" horiz-adv-x="320"
+d="M318 315c3 -12 4 -11 -7 -11h-302c-11 0 -10 -1 -7 11c2 9 4 13 4 13c3 9 9 9 19 11l53 7c7 1 7 1 10 7c9 20 10 31 20 31h103c10 0 12 -11 21 -31c3 -6 3 -6 10 -7l53 -6c10 -2 16 -2 19 -11c0 0 2 -5 4 -14zM283 272c17 0 18 -2 17 -15l-19 -242c-2 -12 -2 -15 -17 -15
+h-208c-15 0 -15 3 -17 15l-19 242c-1 12 0 15 17 15h246z" />
+ <glyph glyph-name="ion-trophy" unicode="&#xf356;"
+d="M448 345c0 -25 2 -73 -22 -122c-15 -30 -36 -55 -63 -75c-23 -16 -49 -28 -77 -35c-16 -17 -32 -27 -46 -31v-33s0 -49 99 -49h13v-32h-256v32h13c85 0 97 35 99 46v36c-14 4 -30 14 -46 31c-28 7 -55 19 -77 35c-27 20 -48 45 -63 75c-17 36 -21 71 -22 97v0v11v0v21v0
+h80c-2 35 0 64 0 64h143h1h1h142s2 -29 0 -64h81v-7zM51 237c17 -34 43 -61 77 -78c-22 40 -33 84 -42 135c-1 8 -2 17 -3 26h-51c1 -23 5 -53 19 -83zM397 237c14 30 18 60 19 83h-51c-1 -9 -3 -18 -4 -26c-9 -51 -20 -95 -42 -135c34 17 61 43 78 78z" />
+ <glyph glyph-name="ion-tshirt-outline" unicode="&#xf4f6;"
+d="M146 362l-104 -31l11 -32l39 4l38 5l-2 -38l-14 -255h220l-14 255l-2 38l38 -5l39 -4l11 32l-104 31c-6 -8 -13 -14 -21 -19c-15 -10 -34 -15 -57 -15v0v0c-34 1 -59 11 -78 34zM288 400v0l160 -48l-32 -88l-64 8l16 -289h-288l16 289l-64 -8l-32 88l160 48
+c14 -27 31 -39 64 -40c33 0 50 13 64 40z" />
+ <glyph glyph-name="ion-tshirt" unicode="&#xf4f7;"
+d="M448 352l-32 -88l-64 8l16 -288h-288l16 288l-64 -8l-32 88l160 48c14 -27 31 -39 64 -40c33 0 50 13 64 40z" />
+ <glyph glyph-name="ion-umbrella" unicode="&#xf2b7;"
+d="M344 160v0v0v0zM104 160v0v0v0zM240 399c116 -8 208 -109 208 -227v-12c-4 25 -26 52 -52 52c-29 0 -52 -23 -52 -52v0c0 29 -23 52 -52 52s-49 -12 -52 -45v-135c0 -17 -6 -33 -18 -45s-29 -19 -46 -19c-35 0 -63 29 -63 64c0 9 7 16 16 16s16 -7 16 -16
+c0 -18 14 -32 31 -32c18 0 32 14 32 32v134c-1 24 -26 46 -52 46c-29 0 -52 -23 -52 -52v0c0 29 -23 52 -52 52c-27 0 -49 -26 -52 -52v18c0 118 92 213 208 221v1c0 9 7 16 16 16s16 -7 16 -16v-1z" />
+ <glyph glyph-name="ion-university" unicode="&#xf357;"
+d="M224 384l224 -111l-92 -60l-132 -85l-160 102v-198l-32 16v203l-32 21zM358 192l10 -82c-16 -12 -112 -78 -144 -110c-32 32 -128 98 -144 110l9 82l135 -88z" />
+ <glyph glyph-name="ion-unlocked" unicode="&#xf254;" horiz-adv-x="384"
+d="M22 -32c-12 0 -22 10 -22 22v212c0 12 10 22 22 22h3h19v31c0 42 17 87 43 115s64 46 105 46v0v0c41 0 79 -18 105 -46c20 -21 33 -51 39 -82h-53c-5 18 -13 35 -24 47v0v1c-18 19 -42 29 -67 29v0v0c-25 0 -49 -10 -67 -29v-1v0c-18 -19 -28 -53 -28 -80v-31h265
+c12 0 22 -10 22 -22v-212c0 -12 -10 -22 -22 -22h-340z" />
+ <glyph glyph-name="ion-upload" unicode="&#xf255;"
+d="M366 215c45 0 82 -37 82 -83s-37 -84 -82 -84h-110v80h48l-80 84l-80 -84h48v-80h-102c-49 0 -90 41 -90 91c0 40 26 74 61 86c5 29 29 51 59 51c10 0 18 -3 26 -7c19 40 59 67 105 67c64 0 115 -53 115 -118v-3z" />
+ <glyph glyph-name="ion-usb" unicode="&#xf2b8;" horiz-adv-x="256"
+d="M16 228v0v0zM256 320c0 -11 -6 -21 -14 -27v0c-2 -1 -3 -5 -3 -7c-1 -20 -3 -36 -9 -50c-7 -19 -20 -33 -39 -46c-17 -12 -29 -21 -36 -34c-7 -12 -11 -28 -11 -53v-24c0 -7 2 -13 10 -18c4 -2 7 -6 10 -9c8 -9 14 -21 14 -34c0 -28 -22 -50 -50 -50s-50 22 -50 50v1v0
+c0 18 10 33 24 42c5 4 9 5 9 18v0c0 14 -3 17 -10 27s-18 17 -32 26c-19 13 -33 27 -40 46c-6 15 -8 31 -9 39s-2 9 -4 11c-10 6 -16 16 -16 28c0 18 14 32 32 32s32 -14 32 -32c0 -10 -4 -20 -12 -26c-3 -2 -4 -11 -4 -14v0v0c0 -9 3 -18 7 -28c10 -21 45 -44 52 -44
+s8 5 8 12v196s-1 2 -3 4h-1v1v0c-9 6 -15 16 -15 27c0 18 14 32 32 32s32 -14 32 -32c0 -11 -5 -21 -14 -27v0c-2 -2 -2 -3 -2 -5v-140c0 -10 2 -12 8 -11c13 3 48 30 52 43c3 10 6 23 7 41v1c0 2 -2 4 -3 6c-10 6 -16 16 -16 28c0 18 14 32 32 32s32 -14 32 -32zM32 240
+c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM128 368c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM224 304c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16z" />
+ <glyph glyph-name="ion-videocamera" unicode="&#xf256;"
+d="M335 263v-66l113 35v-89v-88l-113 35v-65c0 -5 -4 -9 -9 -9h-317c-5 0 -9 4 -9 9v12v55v171c0 5 4 9 9 9h208v38c0 4 -6 10 -10 10h-176v48h178c36 0 65 -29 65 -64v-32h52c5 0 9 -4 9 -9zM226 107c20 0 36 16 36 36s-16 35 -36 35s-36 -15 -36 -35c0 -10 4 -19 11 -26
+h-68c7 7 11 16 11 26c0 20 -16 36 -36 36s-36 -16 -36 -36s16 -36 36 -36h12h95h11z" />
+ <glyph glyph-name="ion-volume-high" unicode="&#xf257;"
+d="M199 40l-95 88h-104v128h104l95 88v-304zM255 92l-20 16c17 24 27 52 27 84s-10 60 -27 84l20 16c20 -28 33 -63 33 -100s-13 -72 -33 -100zM322 46l-21 16c27 36 43 81 43 130s-16 94 -43 130l21 16c30 -41 48 -91 48 -146s-18 -105 -48 -146zM365 369l20 15
+c39 -54 63 -120 63 -192s-24 -138 -63 -192l-20 15c36 49 58 111 58 177s-22 128 -58 177z" />
+ <glyph glyph-name="ion-volume-low" unicode="&#xf258;" horiz-adv-x="288"
+d="M199 40l-95 88h-104v128h104l95 88v-304zM255 92l-20 16c17 24 28 52 28 84s-11 60 -28 84l20 16c20 -28 33 -63 33 -100s-13 -72 -33 -100z" />
+ <glyph glyph-name="ion-volume-medium" unicode="&#xf259;" horiz-adv-x="370"
+d="M199 40l-95 88h-104v128h104l95 88v-304zM255 92l-20 16c17 24 28 52 28 84s-11 60 -28 84l20 16c20 -28 33 -63 33 -100s-13 -72 -33 -100zM322 46l-21 16c27 36 43 81 43 130s-16 94 -43 130l21 16c30 -41 48 -91 48 -146s-18 -105 -48 -146z" />
+ <glyph glyph-name="ion-volume-mute" unicode="&#xf25a;"
+d="M224 231l47 51v-180l-47 51h-65v78h65zM332 388c69 -38 116 -112 116 -196c0 -124 -100 -224 -224 -224c-39 0 -76 10 -108 27l-1 1c-69 38 -115 112 -115 196c0 124 100 224 224 224c39 0 75 -10 107 -28h1zM362 93c20 28 33 62 33 99c0 66 -38 123 -92 151
+c-6 3 -11 6 -17 8c-19 7 -40 11 -62 11c-37 0 -71 -12 -99 -32l73 -74h-76l-36 35c-20 -28 -32 -62 -32 -99c0 -65 36 -121 90 -150c6 -3 13 -7 19 -9c19 -7 39 -11 61 -11c37 0 72 12 100 32l-20 20v77z" />
+ <glyph glyph-name="ion-wand" unicode="&#xf358;"
+d="M192 208l48 48l48 -48l-48 -48zM0 16l176 176l48 -48l-176 -176zM224 352v64h32v-64h-32zM398 344l-45 -45l-23 22l46 45zM127 299l-45 45l22 22l45 -45zM376 50l-46 45l23 23l45 -46zM384 192v32h64v-32h-64z" />
+ <glyph glyph-name="ion-waterdrop" unicode="&#xf25b;" horiz-adv-x="320"
+d="M175 409c40 -41 145 -160 145 -288c0 -85 -72 -153 -160 -153c-56 0 -106 27 -134 69c-6 9 -11 19 -15 29c-7 17 -11 35 -11 55v4c1 67 31 131 64 183c20 31 42 57 59 77c9 10 16 18 22 24l1 1v0c4 3 8 6 14 6c5 0 10 -3 14 -6v0zM160 24c55 0 100 45 100 100
+c0 14 -3 28 -8 40c-17 -65 -70 -116 -136 -130c13 -6 28 -10 44 -10z" />
+ <glyph glyph-name="ion-wifi" unicode="&#xf25c;"
+d="M224 352c80 0 156 -30 214 -84l10 -10l-10 -9l-32 -32l-10 -10l-9 9c-44 41 -103 64 -163 64s-119 -23 -163 -64l-9 -9l-10 10l-32 32l-10 9l10 10c58 54 134 84 214 84v0zM365 192l11 -10l-10 -10l-33 -32l-9 -9l-10 8c-25 22 -57 35 -90 35s-65 -13 -90 -35l-10 -8
+l-9 9l-33 32l-10 10l11 10c37 33 83 52 132 54v0h9v0v0c52 0 102 -19 141 -54zM224 32l-10 10l-52 52l-11 10l12 10c17 11 32 20 61 20s47 -9 62 -20l11 -10l-10 -10l-53 -52z" />
+ <glyph glyph-name="ion-wineglass" unicode="&#xf2b9;" horiz-adv-x="256"
+d="M167 153c-11 -4 -24 -8 -24 -32v-94c0 -11 4 -19 12 -25c3 -2 7 -4 15 -6c32 -9 48 -16 50 -18c2 -1 4 -3 4 -7c0 0 -14 -3 -96 -3s-96 3 -96 3c0 4 2 6 4 7c2 2 18 9 50 18c8 2 11 4 14 6c8 6 11 14 11 25v94c0 24 -11 28 -22 32s-18 6 -26 11c-12 7 -23 16 -32 26
+c-20 23 -31 52 -31 87c0 50 4 100 8 114s14 25 31 25h178c17 0 27 -11 31 -25s8 -65 8 -115c0 -35 -11 -63 -31 -86c-9 -10 -20 -19 -32 -26c-8 -5 -15 -7 -26 -11zM128 178c26 0 50 11 67 28l6 6c16 18 22 35 23 65s-2 83 -8 107h-177c-7 -35 -8 -80 -7 -108s7 -46 23 -64
+c2 -3 4 -6 7 -8c17 -16 41 -26 66 -26zM208 277c0 -10 -1 -20 -4 -29s-8 -18 -15 -25l-5 -5c-14 -14 -34 -23 -56 -23c-21 0 -41 8 -55 22l-6 6c-7 7 -12 16 -15 25s-3 15 -4 29c-1 9 0 34 1 53c1 10 2 19 3 22h153c1 -6 2 -14 2 -22c1 -21 1 -45 1 -53zM192 269v0v26
+c0 4 -4 8 -8 8s-8 -4 -8 -8v-26c0 -3 1 -6 3 -7c1 -1 3 -1 5 -1c4 0 8 3 8 8zM191 316c1 2 1 4 1 6s-2 4 -4 5s-4 1 -6 1s-4 -1 -5 -3s-1 -4 -1 -6s2 -4 4 -5s4 -1 6 -1s4 1 5 3z" />
+ <glyph glyph-name="ion-woman" unicode="&#xf25d;" horiz-adv-x="192"
+d="M30 299c3 12 17 33 42 34h48c24 -1 38 -22 42 -34l29 -104c6 -23 -21 -32 -27 -10l-26 96h-9l46 -169h-43v-127c0 -23 -31 -23 -31 0v127h-10v-127c0 -23 -32 -23 -32 0v127h-42l45 169h-7l-27 -96c-7 -21 -33 -13 -27 10zM133 379c0 -21 -17 -37 -37 -37s-37 16 -37 37
+s17 37 37 37s37 -16 37 -37z" />
+ <glyph glyph-name="ion-wrench" unicode="&#xf2ba;"
+d="M430 333c14 -14 19 -31 18 -44s-6 -39 -32 -65s-77 -42 -113 -24c-5 3 -13 5 -21 -3c-10 -9 -202 -215 -202 -215c-17 -19 -48 -18 -66 0s-19 49 0 66c0 0 207 194 215 202s5 16 3 22c-20 47 2 89 24 112c22 24 51 31 65 32c13 1 31 -5 44 -18l-57 -56l10 -56l55 -10z
+M59 5c6 6 6 17 0 23s-16 6 -22 0s-6 -17 0 -23s16 -6 22 0z" />
+ <glyph glyph-name="ion-xbox" unicode="&#xf30c;"
+d="M95 200c-49 -72 -50 -139 -50 -143c-28 38 -45 84 -45 135c0 67 30 128 77 169l3 -1c51 -18 93 -68 93 -68s-38 -33 -78 -92zM448 192c0 -51 -17 -97 -45 -135c0 4 -1 71 -50 143c-40 59 -78 92 -78 92s42 50 93 68l3 1c47 -41 77 -102 77 -169zM169 367
+c-37 17 -65 12 -72 10c36 25 80 39 127 39s91 -14 127 -39c-7 2 -35 6 -72 -10c-29 -13 -55 -35 -55 -35s-26 22 -55 35zM327 155c40 -49 54 -85 62 -108l2 -5c-41 -46 -101 -74 -167 -74s-126 28 -167 74l1 5c8 23 23 59 63 108c46 57 103 94 103 94s57 -37 103 -94z" />
+ </font>
+</defs></svg>
diff --git a/public/fonts/vendor/Ionicons/ionicons.ttf b/public/fonts/vendor/Ionicons/ionicons.ttf
new file mode 100644
index 0000000..c4e4632
--- /dev/null
+++ b/public/fonts/vendor/Ionicons/ionicons.ttf
Binary files differ
diff --git a/public/fonts/vendor/Ionicons/ionicons.woff b/public/fonts/vendor/Ionicons/ionicons.woff
new file mode 100644
index 0000000..5f3a14e
--- /dev/null
+++ b/public/fonts/vendor/Ionicons/ionicons.woff
Binary files differ
diff --git a/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.eot b/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000..b93a495
--- /dev/null
+++ b/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.eot
Binary files differ
diff --git a/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.svg b/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.svg
new file mode 100644
index 0000000..94fb549
--- /dev/null
+++ b/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="400" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
+<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
+<glyph unicode="&#x2000;" horiz-adv-x="650" />
+<glyph unicode="&#x2001;" horiz-adv-x="1300" />
+<glyph unicode="&#x2002;" horiz-adv-x="650" />
+<glyph unicode="&#x2003;" horiz-adv-x="1300" />
+<glyph unicode="&#x2004;" horiz-adv-x="433" />
+<glyph unicode="&#x2005;" horiz-adv-x="325" />
+<glyph unicode="&#x2006;" horiz-adv-x="216" />
+<glyph unicode="&#x2007;" horiz-adv-x="216" />
+<glyph unicode="&#x2008;" horiz-adv-x="162" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="325" />
+<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
+<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
+<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
+<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
+<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
+<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
+<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
+<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
+<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
+<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
+<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
+<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
+<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
+<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
+<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
+<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
+<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
+<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
+<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
+<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
+<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
+<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
+<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
+<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
+<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
+<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
+<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
+<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
+<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
+<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
+<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
+<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
+<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
+<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
+<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
+<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
+<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
+<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
+<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
+<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
+<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
+<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
+<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
+<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
+<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
+<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
+<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
+<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
+<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
+<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
+<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
+<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
+<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
+<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
+<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
+<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
+<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
+<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
+<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
+<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
+<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
+<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
+<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
+<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
+<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
+<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
+<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
+<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
+<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
+<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
+<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
+<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
+<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
+<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
+<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
+<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
+<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
+<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
+<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
+<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
+<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
+<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
+<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
+<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
+<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
+<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
+<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
+<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
+<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
+<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
+<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
+<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
+<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
+<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
+<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
+<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
+<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
+<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
+<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
+<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
+<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
+<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
+<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
+<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
+<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
+<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
+<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
+<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
+<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
+<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
+<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
+<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
+<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
+<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
+<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
+<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
+<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
+<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
+<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
+<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
+<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
+<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
+<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
+<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
+<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
+<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
+<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
+<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
+<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
+<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
+<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
+<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
+<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
+<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
+<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
+<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
+<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
+<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
+<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
+<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
+<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
+<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
+<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
+<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
+<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
+<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
+<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
+<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
+<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
+<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
+<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
+<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
+<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
+<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
+<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
+<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
+<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
+<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
+<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
+<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
+<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
+<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
+<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
+<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
+<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
+<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
+<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
+<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
+<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
+</font>
+</defs></svg> \ No newline at end of file
diff --git a/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.ttf b/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000..1413fc6
--- /dev/null
+++ b/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.ttf
Binary files differ
diff --git a/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.woff b/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000..9e61285
--- /dev/null
+++ b/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.woff
Binary files differ
diff --git a/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.woff2 b/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.woff2
new file mode 100644
index 0000000..64539b5
--- /dev/null
+++ b/public/fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.woff2
Binary files differ
diff --git a/public/images/boxed-bg.jpg b/public/images/boxed-bg.jpg
new file mode 100644
index 0000000..3464070
--- /dev/null
+++ b/public/images/boxed-bg.jpg
Binary files differ
diff --git a/public/js/admin.js b/public/js/admin.js
index b4bba8b..e049646 100755
--- a/public/js/admin.js
+++ b/public/js/admin.js
@@ -60,24 +60,200 @@
/******/ __webpack_require__.p = "/";
/******/
/******/ // Load entry module and return exports
-/******/ return __webpack_require__(__webpack_require__.s = 4);
+/******/ return __webpack_require__(__webpack_require__.s = 45);
/******/ })
/************************************************************************/
-/******/ ({
+/******/ ([
+/* 0 */,
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * jQuery JavaScript Library v3.3.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2018-01-20T17:24Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar document = window.document;\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n // Support: Chrome <=57, Firefox <=52\n // In some browsers, typeof returns \"function\" for HTML <object> elements\n // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n // We don't want to classify *any* DOM node as a function.\n return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, doc, node ) {\n\t\tdoc = doc || document;\n\n\t\tvar i,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\t\t\t\tif ( node[ i ] ) {\n\t\t\t\t\tscript[ i ] = node[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.3.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && Array.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\n\t\t/* eslint-disable no-unused-vars */\n\t\t// See https://github.com/eslint/eslint/issues/6125\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tDOMEval( code );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.3\n * https://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-08-08\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tdisabledAncestor = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && (\"form\" in elem || \"label\" in elem);\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = \"#\" + nid + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement(\"fieldset\");\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tdisabledAncestor( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( preferredDoc !== document &&\n\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( el ) {\n\t\tel.appendChild( document.createComment(\"\") );\n\t\treturn !el.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( (elem = elems[i++]) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( el ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( el ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn (sel + \"\").replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ key ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( el ) {\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( el ) {\n\treturn el.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n if ( nodeName( elem, \"iframe\" ) ) {\n return elem.contentDocument;\n }\n\n // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n // Treat the template element as a regular one in browsers that\n // don't support it.\n if ( nodeName( elem, \"template\" ) ) {\n elem = elem.content || elem;\n }\n\n return jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tjQuery.contains( elem.ownerDocument, elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE <=9 only\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE <=9 only\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, contains, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\nvar documentElement = document.documentElement;\n\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 only\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), doc, node );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1></$2>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = div.offsetWidth === 36 || \"absolute\";\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, #12537)\n\t// .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style;\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a property mapped along what jQuery.cssProps suggests or to\n// a vendor prefixed property.\nfunction finalPropName( name ) {\n\tvar ret = jQuery.cssProps[ name ];\n\tif ( !ret ) {\n\t\tret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;\n\t}\n\treturn ret;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\t\t) );\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\t\tval = curCSS( elem, dimension, styles ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox;\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\t// Check for style in case a browser which returns unreliable values\n\t// for getComputedStyle silently falls back to the reliable elem.style\n\tvalueIsBorderBox = valueIsBorderBox &&\n\t\t( support.boxSizingReliable() || val === elem.style[ dimension ] );\n\n\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t// This happens for inline elements with no explicit setting (gh-3571)\n\t// Support: Android <=4.1 - 4.3 only\n\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\tif ( val === \"auto\" ||\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) {\n\n\t\tval = elem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];\n\n\t\t// offsetWidth/offsetHeight provide border-box values\n\t\tvalueIsBorderBox = true;\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\tif ( type === \"number\" ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\t\t\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra && boxModelAdjustment(\n\t\t\t\t\telem,\n\t\t\t\t\tdimension,\n\t\t\t\t\textra,\n\t\t\t\t\tisBorderBox,\n\t\t\t\t\tstyles\n\t\t\t\t);\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && support.scrollboxSize() === styles.position ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 &&\n\t\t\t\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = Date.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce++ ) + uncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" ).prop( {\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t} ).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t// documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t}\n} );\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( true ) {\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n\t\treturn jQuery;\n\t}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzP2VlZGYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsWUFBWTs7QUFFcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGLG9CQUFvQjs7QUFFcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsWUFBWTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUyxTQUFTO0FBQ2xCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUyxZQUFZO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVSxZQUFZO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFNBQVM7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQSxnQkFBZ0IsSUFBSTs7QUFFcEI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDLElBQUk7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLFVBQVU7QUFDM0Usc0NBQXNDLDJCQUEyQjtBQUNqRTtBQUNBLGdDQUFnQyxNQUFNO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLFVBQVUsWUFBWTtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxVQUFVLFlBQVk7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsVUFBVSxVQUFVO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLFVBQVUsY0FBYztBQUN4QjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFlBQVksdUVBQXVFO0FBQ25GO0FBQ0E7QUFDQSxZQUFZLDRCQUE0QjtBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLFNBQVM7QUFDakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBLFFBQVEsR0FBRztBQUNYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBOzs7O0FBSUE7O0FBRUE7O0FBRUE7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQixTQUFTO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBOztBQUVBLGNBQWMsU0FBUztBQUN2QjtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsT0FBTztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxPQUFPO0FBQ2pCLDBCQUEwQix3QkFBd0I7O0FBRWxEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsY0FBYztBQUN4QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHdDQUF3QyxzQ0FBc0M7QUFDOUUsb0NBQW9DLHVDQUF1QztBQUMzRSxvQ0FBb0Msc0NBQXNDO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsT0FBTztBQUNQO0FBQ0EsTUFBTTtBQUNOLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXOztBQUVYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7O0FBRVY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0M7QUFDcEMscUNBQXFDO0FBQ3JDLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7OztBQUtBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVUsU0FBUztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLGFBQWE7QUFDcEMsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTs7O0FBR0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVEsZ0JBQWdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7QUFDRDs7QUFFQTs7QUFFQTs7OztBQUlBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsRUFBRTtBQUNGOztBQUVBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLE9BQU87QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0Esc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxPQUFPO0FBQ2Y7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsZ0JBQWdCO0FBQ2xCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXOztBQUVYOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDs7QUFFQTtBQUNBOztBQUVBLGNBQWMsc0JBQXNCO0FBQ3BDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwrREFBK0Q7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLGNBQWM7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsbUJBQW1CO0FBQ3BDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdUNBQXVDO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix1REFBdUQ7QUFDOUU7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQyxjQUFjO0FBQ25EO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOzs7QUFHRDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkMsT0FBTztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVSxPQUFPO0FBQ2pCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLGdCQUFnQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsK0JBQStCO0FBQ3ZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1Q0FBdUMsT0FBTztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0MsT0FBTztBQUMvQztBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMscUNBQXFDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUEsU0FBUyw4QkFBOEI7QUFDdkM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFlBQVksT0FBTztBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVztBQUNwQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7QUFJQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDLGNBQWMsV0FBVztBQUN4RSxtQkFBbUIsVUFBVTtBQUM3QjtBQUNBLHNCQUFzQixjQUFjLHNCQUFzQixnQkFBZ0I7QUFDMUUsZ0JBQWdCLFdBQVcsWUFBWTtBQUN2QyxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRixDQUFDOzs7QUFHRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLCtEQUErRDtBQUMzRTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsT0FBTzs7QUFFZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUEsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTs7QUFFQSxVQUFVLE9BQU87QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQSxRQUFRLE9BQU87QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0JBQWdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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R0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7QUFLRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBLGlDQUFpQztBQUNqQztBQUNBOztBQUVBLElBQUk7QUFDSjs7QUFFQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFNBQVM7QUFDcEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7O0FBS0Q7OztBQUdBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBOztBQUVBOztBQUVBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEyQztBQUMzQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsS0FBSztBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUscUNBQXFDOztBQUVwRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBOztBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLEtBQUs7QUFDTDs7QUFFQSxXQUFXO0FBQ1gsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCO0FBQ2pCLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBLHNCQUFzQjtBQUN0QiwyQkFBMkI7O0FBRTNCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLElBQUk7QUFDSjtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHlCQUF5QjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7QUFLRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7QUFLRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLElBQUk7QUFDSixHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHFEQUFxRDtBQUNyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxzREFBc0Q7QUFDcEU7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUk7QUFDSjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQSxjQUFjLG1DQUFtQztBQUNqRCxlQUFlLDZEQUE2RDtBQUM1RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsRUFBRTtBQUNGLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUFBO0FBQ0Y7Ozs7O0FBS0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBLENBQUMiLCJmaWxlIjoiMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My4zLjFcbiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHBzOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WlxuICovXG4oIGZ1bmN0aW9uKCBnbG9iYWwsIGZhY3RvcnkgKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0aWYgKCB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2Bcblx0XHQvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LlxuXHRcdC8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgXG5cdFx0Ly8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuXG5cdFx0Ly8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC5cblx0XHQvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpKHdpbmRvdyk7XG5cdFx0Ly8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG5cdFx0XHRmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6XG5cdFx0XHRmdW5jdGlvbiggdyApIHtcblx0XHRcdFx0aWYgKCAhdy5kb2N1bWVudCApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoIHcgKTtcblx0XHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeSggZ2xvYmFsICk7XG5cdH1cblxuLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXRcbn0gKSggdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkge1xuXG4vLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjFcbi8vIHRocm93IGV4Y2VwdGlvbnMgd2hlbiBub24tc3RyaWN0IGNvZGUgKGUuZy4sIEFTUC5ORVQgNC41KSBhY2Nlc3NlcyBzdHJpY3QgbW9kZVxuLy8gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIgKHRyYWMtMTMzMzUpLiBCdXQgYXMgb2YgalF1ZXJ5IDMuMCAoMjAxNiksIHN0cmljdCBtb2RlIHNob3VsZCBiZSBjb21tb25cbi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLlxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnIgPSBbXTtcblxudmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cbnZhciBzbGljZSA9IGFyci5zbGljZTtcblxudmFyIGNvbmNhdCA9IGFyci5jb25jYXQ7XG5cbnZhciBwdXNoID0gYXJyLnB1c2g7XG5cbnZhciBpbmRleE9mID0gYXJyLmluZGV4T2Y7XG5cbnZhciBjbGFzczJ0eXBlID0ge307XG5cbnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG5cbnZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgZm5Ub1N0cmluZyA9IGhhc093bi50b1N0cmluZztcblxudmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTtcblxudmFyIHN1cHBvcnQgPSB7fTtcblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKCBvYmogKSB7XG5cbiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTJcbiAgICAgIC8vIEluIHNvbWUgYnJvd3NlcnMsIHR5cGVvZiByZXR1cm5zIFwiZnVuY3Rpb25cIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50c1xuICAgICAgLy8gKGkuZS4sIGB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvYmplY3RcIiApID09PSBcImZ1bmN0aW9uXCJgKS5cbiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi5cbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gXCJudW1iZXJcIjtcbiAgfTtcblxuXG52YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkge1xuXHRcdHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG5cdH07XG5cblxuXG5cblx0dmFyIHByZXNlcnZlZFNjcmlwdEF0dHJpYnV0ZXMgPSB7XG5cdFx0dHlwZTogdHJ1ZSxcblx0XHRzcmM6IHRydWUsXG5cdFx0bm9Nb2R1bGU6IHRydWVcblx0fTtcblxuXHRmdW5jdGlvbiBET01FdmFsKCBjb2RlLCBkb2MsIG5vZGUgKSB7XG5cdFx0ZG9jID0gZG9jIHx8IGRvY3VtZW50O1xuXG5cdFx0dmFyIGksXG5cdFx0XHRzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXG5cdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdGlmICggbm9kZSApIHtcblx0XHRcdGZvciAoIGkgaW4gcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyApIHtcblx0XHRcdFx0aWYgKCBub2RlWyBpIF0gKSB7XG5cdFx0XHRcdFx0c2NyaXB0WyBpIF0gPSBub2RlWyBpIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApO1xuXHR9XG5cblxuZnVuY3Rpb24gdG9UeXBlKCBvYmogKSB7XG5cdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0cmV0dXJuIG9iaiArIFwiXCI7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiID9cblx0XHRjbGFzczJ0eXBlWyB0b1N0cmluZy5jYWxsKCBvYmogKSBdIHx8IFwib2JqZWN0XCIgOlxuXHRcdHR5cGVvZiBvYmo7XG59XG4vKiBnbG9iYWwgU3ltYm9sICovXG4vLyBEZWZpbmluZyB0aGlzIGdsb2JhbCBpbiAuZXNsaW50cmMuanNvbiB3b3VsZCBjcmVhdGUgYSBkYW5nZXIgb2YgdXNpbmcgdGhlIGdsb2JhbFxuLy8gdW5ndWFyZGVkIGluIGFub3RoZXIgcGxhY2UsIGl0IHNlZW1zIHNhZmVyIHRvIGRlZmluZSBnbG9iYWwgb25seSBmb3IgdGhpcyBtb2R1bGVcblxuXG5cbnZhclxuXHR2ZXJzaW9uID0gXCIzLjMuMVwiLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblxuXHRcdC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJ1xuXHRcdC8vIE5lZWQgaW5pdCBpZiBqUXVlcnkgaXMgY2FsbGVkIChqdXN0IGFsbG93IGVycm9yIHRvIGJlIHRocm93biBpZiBub3QgaW5jbHVkZWQpXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG5cdHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nO1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXG5cdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdGlmICggbnVtID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRyZXR1cm4gbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXTtcblx0fSxcblxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXG5cdC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KVxuXHRwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5cdFx0dmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApO1xuXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcblx0XHRyZXQucHJldk9iamVjdCA9IHRoaXM7XG5cblx0XHQvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldFxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2sgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzWyBqIF0gXSA6IFtdICk7XG5cdH0sXG5cblx0ZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IoKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHQvLyBFeHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcblx0aWYgKCBpID09PSBsZW5ndGggKSB7XG5cdFx0dGFyZ2V0ID0gdGhpcztcblx0XHRpLS07XG5cdH1cblxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblxuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAoICggb3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdICkgIT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggdGFyZ2V0ID09PSBjb3B5ICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdGlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvcHkgKSB8fFxuXHRcdFx0XHRcdCggY29weUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KCBjb3B5ICkgKSApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSApIHtcblx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBBcnJheS5pc0FycmF5KCBzcmMgKSA/IHNyYyA6IFtdO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIHByb3RvLCBDdG9yO1xuXG5cdFx0Ly8gRGV0ZWN0IG9idmlvdXMgbmVnYXRpdmVzXG5cdFx0Ly8gVXNlIHRvU3RyaW5nIGluc3RlYWQgb2YgalF1ZXJ5LnR5cGUgdG8gY2F0Y2ggaG9zdCBvYmplY3RzXG5cdFx0aWYgKCAhb2JqIHx8IHRvU3RyaW5nLmNhbGwoIG9iaiApICE9PSBcIltvYmplY3QgT2JqZWN0XVwiICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHByb3RvID0gZ2V0UHJvdG8oIG9iaiApO1xuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIG5vIHByb3RvdHlwZSAoZS5nLiwgYE9iamVjdC5jcmVhdGUoIG51bGwgKWApIGFyZSBwbGFpblxuXHRcdGlmICggIXByb3RvICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb25cblx0XHRDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCBcImNvbnN0cnVjdG9yXCIgKSAmJiBwcm90by5jb25zdHJ1Y3Rvcjtcblx0XHRyZXR1cm4gdHlwZW9mIEN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBmblRvU3RyaW5nLmNhbGwoIEN0b3IgKSA9PT0gT2JqZWN0RnVuY3Rpb25TdHJpbmc7XG5cdH0sXG5cblx0aXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblxuXHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5cdFx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy82MTI1XG5cdFx0dmFyIG5hbWU7XG5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0Ly8gRXZhbHVhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHRcblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUgKSB7XG5cdFx0RE9NRXZhbCggY29kZSApO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkge1xuXHRcdHZhciBsZW5ndGgsIGkgPSAwO1xuXG5cdFx0aWYgKCBpc0FycmF5TGlrZSggb2JqICkgKSB7XG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gb2JqICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvYmo7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5XG5cdHRyaW06IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFx0XCJcIiA6XG5cdFx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFsgYXJyIF0gOiBhcnJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guY2FsbCggcmV0LCBhcnIgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7XG5cdFx0cmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdG1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHtcblx0XHR2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsXG5cdFx0XHRqID0gMCxcblx0XHRcdGkgPSBmaXJzdC5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdGZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdO1xuXHRcdH1cblxuXHRcdGZpcnN0Lmxlbmd0aCA9IGk7XG5cblx0XHRyZXR1cm4gZmlyc3Q7XG5cdH0sXG5cblx0Z3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkge1xuXHRcdHZhciBjYWxsYmFja0ludmVyc2UsXG5cdFx0XHRtYXRjaGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aCxcblx0XHRcdGNhbGxiYWNrRXhwZWN0ID0gIWludmVydDtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXNcblx0XHQvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvblxuXHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0Y2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7XG5cdFx0XHRpZiAoIGNhbGxiYWNrSW52ZXJzZSAhPT0gY2FsbGJhY2tFeHBlY3QgKSB7XG5cdFx0XHRcdG1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVzO1xuXHR9LFxuXG5cdC8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHtcblx0XHR2YXIgbGVuZ3RoLCB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7XG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIGVsZW1zICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0cmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApO1xuXHR9LFxuXG5cdC8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0c1xuXHRndWlkOiAxLFxuXG5cdC8vIGpRdWVyeS5zdXBwb3J0IGlzIG5vdCB1c2VkIGluIENvcmUgYnV0IG90aGVyIHByb2plY3RzIGF0dGFjaCB0aGVpclxuXHQvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LlxuXHRzdXBwb3J0OiBzdXBwb3J0XG59ICk7XG5cbmlmICggdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTtcbn1cblxuLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwXG5qUXVlcnkuZWFjaCggXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbFwiLnNwbGl0KCBcIiBcIiApLFxuZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xufSApO1xuXG5mdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcilcblx0Ly8gYGluYCBjaGVjayB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0yMTQ1KVxuXHQvLyBoYXNPd24gaXNuJ3QgdXNlZCBoZXJlIGR1ZSB0byBmYWxzZSBuZWdhdGl2ZXNcblx0Ly8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRVxuXHR2YXIgbGVuZ3RoID0gISFvYmogJiYgXCJsZW5ndGhcIiBpbiBvYmogJiYgb2JqLmxlbmd0aCxcblx0XHR0eXBlID0gdG9UeXBlKCBvYmogKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIG9iaiApIHx8IGlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy4zXG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNi0wOC0wOFxuICovXG4oZnVuY3Rpb24oIHdpbmRvdyApIHtcblxudmFyIGksXG5cdHN1cHBvcnQsXG5cdEV4cHIsXG5cdGdldFRleHQsXG5cdGlzWE1MLFxuXHR0b2tlbml6ZSxcblx0Y29tcGlsZSxcblx0c2VsZWN0LFxuXHRvdXRlcm1vc3RDb250ZXh0LFxuXHRzb3J0SW5wdXQsXG5cdGhhc0R1cGxpY2F0ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdHNldERvY3VtZW50LFxuXHRkb2N1bWVudCxcblx0ZG9jRWxlbSxcblx0ZG9jdW1lbnRJc0hUTUwsXG5cdHJidWdneVFTQSxcblx0cmJ1Z2d5TWF0Y2hlcyxcblx0bWF0Y2hlcyxcblx0Y29udGFpbnMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0gXCJzaXp6bGVcIiArIDEgKiBuZXcgRGF0ZSgpLFxuXHRwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0c29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIDA7XG5cdH0sXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaF9uYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS90aG9yLWluZGV4b2YtdnMtZm9yLzVcblx0aW5kZXhPZiA9IGZ1bmN0aW9uKCBsaXN0LCBlbGVtICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdGxlbiA9IGxpc3QubGVuZ3RoO1xuXHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0aWYgKCBsaXN0W2ldID09PSBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllclxuXHRpZGVudGlmaWVyID0gXCIoPzpcXFxcXFxcXC58W1xcXFx3LV18W15cXDAtXFxcXHhhMF0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHRhdHRyaWJ1dGVzID0gXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XFxcXCgoXCIgK1xuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIHdoaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXG5cdHJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCBcIj1cIiArIHdoaXRlc3BhY2UgKyBcIiooW15cXFxcXSdcXFwiXSo/KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsIFwiZ1wiICksXG5cblx0cnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSxcblx0cmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCBcIl5cIiArIGlkZW50aWZpZXIgKyBcIiRcIiApLFxuXG5cdG1hdGNoRXhwciA9IHtcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIkNMQVNTXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFwuKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJUQUdcIjogbmV3IFJlZ0V4cCggXCJeKFwiICsgaWRlbnRpZmllciArIFwifFsqXSlcIiApLFxuXHRcdFwiQVRUUlwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRcIlBTRVVET1wiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIiArIHdoaXRlc3BhY2UgKyBcIiooPzooWystXXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdFwiYm9vbFwiOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxuXHRcdC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGBcblx0XHRcIm5lZWRzQ29udGV4dFwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKigoPzotXFxcXGQpP1xcXFxkKilcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpKD89W14tXXwkKVwiLCBcImlcIiApXG5cdH0sXG5cblx0cmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJoZWFkZXIgPSAvXmhcXGQkL2ksXG5cblx0cm5hdGl2ZSA9IC9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXG5cblx0Ly8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzXG5cdHJxdWlja0V4cHIgPSAvXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxcblxuXHRyc2libGluZyA9IC9bK35dLyxcblxuXHQvLyBDU1MgZXNjYXBlc1xuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFwoW1xcXFxkYS1mXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICsgXCI/fChcIiArIHdoaXRlc3BhY2UgKyBcIil8LilcIiwgXCJpZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2NhcGVkV2hpdGVzcGFjZSApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHRcdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyNFxuXHRcdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRcdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRcdGVzY2FwZWQgOlxuXHRcdFx0aGlnaCA8IDAgP1xuXHRcdFx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG5cdH0sXG5cblx0Ly8gQ1NTIHN0cmluZy9pZGVudGlmaWVyIHNlcmlhbGl6YXRpb25cblx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNjb21tb24tc2VyaWFsaXppbmctaWRpb21zXG5cdHJjc3Nlc2NhcGUgPSAvKFtcXDAtXFx4MWZcXHg3Zl18Xi0/XFxkKXxeLSR8W15cXDAtXFx4MWZcXHg3Zi1cXHVGRkZGXFx3LV0vZyxcblx0ZmNzc2VzY2FwZSA9IGZ1bmN0aW9uKCBjaCwgYXNDb2RlUG9pbnQgKSB7XG5cdFx0aWYgKCBhc0NvZGVQb2ludCApIHtcblxuXHRcdFx0Ly8gVSswMDAwIE5VTEwgYmVjb21lcyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSXG5cdFx0XHRpZiAoIGNoID09PSBcIlxcMFwiICkge1xuXHRcdFx0XHRyZXR1cm4gXCJcXHVGRkZEXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnRyb2wgY2hhcmFjdGVycyBhbmQgKGRlcGVuZGVudCB1cG9uIHBvc2l0aW9uKSBudW1iZXJzIGdldCBlc2NhcGVkIGFzIGNvZGUgcG9pbnRzXG5cdFx0XHRyZXR1cm4gY2guc2xpY2UoIDAsIC0xICkgKyBcIlxcXFxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArIFwiIFwiO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWRcblx0XHRyZXR1cm4gXCJcXFxcXCIgKyBjaDtcblx0fSxcblxuXHQvLyBVc2VkIGZvciBpZnJhbWVzXG5cdC8vIFNlZSBzZXREb2N1bWVudCgpXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRVxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fSxcblxuXHRkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcihcblx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlICYmIChcImZvcm1cIiBpbiBlbGVtIHx8IFwibGFiZWxcIiBpbiBlbGVtKTtcblx0XHR9LFxuXHRcdHsgZGlyOiBcInBhcmVudE5vZGVcIiwgbmV4dDogXCJsZWdlbmRcIiB9XG5cdCk7XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXG5cdFx0aWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHtcblx0XHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0fVxuXHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdFx0Ly8gSWYgdGhlIHNlbGVjdG9yIGlzIHN1ZmZpY2llbnRseSBzaW1wbGUsIHRyeSB1c2luZyBhIFwiZ2V0KkJ5KlwiIERPTSBtZXRob2Rcblx0XHRcdC8vIChleGNlcHRpbmcgRG9jdW1lbnRGcmFnbWVudCBjb250ZXh0LCB3aGVyZSB0aGUgbWV0aG9kcyBkb24ndCBleGlzdClcblx0XHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmIChtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0Ly8gSUQgc2VsZWN0b3Jcblx0XHRcdFx0aWYgKCAobSA9IG1hdGNoWzFdKSApIHtcblxuXHRcdFx0XHRcdC8vIERvY3VtZW50IGNvbnRleHRcblx0XHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnNcblx0XHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0XHRpZiAoIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRWxlbWVudCBjb250ZXh0XG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHRcdC8vIENsYXNzIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJlxuXHRcdFx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0aWYgKCBzdXBwb3J0LnFzYSAmJlxuXHRcdFx0XHQhY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdICYmXG5cdFx0XHRcdCghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gY29udGV4dDtcblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IHNlbGVjdG9yO1xuXG5cdFx0XHRcdC8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudFxuXHRcdFx0XHQvLyBUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhpcyB3b3JrYXJvdW5kIHRlY2huaXF1ZVxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PThcblx0XHRcdFx0Ly8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHNcblx0XHRcdFx0fSBlbHNlIGlmICggY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2FwdHVyZSB0aGUgY29udGV4dCBJRCwgc2V0dGluZyBpdCBmaXJzdCBpZiBuZWNlc3Nhcnlcblx0XHRcdFx0XHRpZiAoIChuaWQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggXCJpZFwiICkpICkge1xuXHRcdFx0XHRcdFx0bmlkID0gbmlkLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgKG5pZCA9IGV4cGFuZG8pICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0XG5cdFx0XHRcdFx0Z3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0XHRcdFx0aSA9IGdyb3Vwcy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRncm91cHNbaV0gPSBcIiNcIiArIG5pZCArIFwiIFwiICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIFwiLFwiICk7XG5cblx0XHRcdFx0XHQvLyBFeHBhbmQgY29udGV4dCBmb3Igc2libGluZyBzZWxlY3RvcnNcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHxcblx0XHRcdFx0XHRcdGNvbnRleHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIG5ld1NlbGVjdG9yICkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0XHRuZXdDb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIG5ld1NlbGVjdG9yIClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9IGNhdGNoICggcXNhRXJyb3IgKSB7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdGlmICggbmlkID09PSBleHBhbmRvICkge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cdFx0Ly8gVXNlIChrZXkgKyBcIiBcIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChzZWUgSXNzdWUgIzE1Nylcblx0XHRpZiAoIGtleXMucHVzaCgga2V5ICsgXCIgXCIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoY2FjaGVbIGtleSArIFwiIFwiIF0gPSB2YWx1ZSk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBlbCApO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGZpbmFsbHkge1xuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXHRcdC8vIHJlbGVhc2UgbWVtb3J5IGluIElFXG5cdFx0ZWwgPSBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRyc1xuICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkXG4gKi9cbmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7XG5cdHZhciBhcnIgPSBhdHRycy5zcGxpdChcInxcIiksXG5cdFx0aSA9IGFyci5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0RXhwci5hdHRySGFuZGxlWyBhcnJbaV0gXSA9IGhhbmRsZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYlxuICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiXG4gKi9cbmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHtcblx0dmFyIGN1ciA9IGIgJiYgYSxcblx0XHRkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0YS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7XG5cdFx0XHRpZiAoIGN1ciA9PT0gYiApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID8gMSA6IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciA6ZW5hYmxlZC86ZGlzYWJsZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGRpc2FibGVkICkge1xuXG5cdC8vIEtub3duIDpkaXNhYmxlZCBmYWxzZSBwb3NpdGl2ZXM6IGZpZWxkc2V0W2Rpc2FibGVkXSA+IGxlZ2VuZDpudGgtb2YtdHlwZShuKzIpIDpjYW4tZGlzYWJsZVxuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBPbmx5IGNlcnRhaW4gZWxlbWVudHMgY2FuIG1hdGNoIDplbmFibGVkIG9yIDpkaXNhYmxlZFxuXHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NjcmlwdGluZy5odG1sI3NlbGVjdG9yLWVuYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1kaXNhYmxlZFxuXHRcdGlmICggXCJmb3JtXCIgaW4gZWxlbSApIHtcblxuXHRcdFx0Ly8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOlxuXHRcdFx0Ly8gKiBsaXN0ZWQgZm9ybS1hc3NvY2lhdGVkIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgZmllbGRzZXRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjYXRlZ29yeS1saXN0ZWRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkXG5cdFx0XHQvLyAqIG9wdGlvbiBlbGVtZW50cyBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1vcHRpb24tZGlzYWJsZWRcblx0XHRcdC8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSBcImZvcm1cIiBwcm9wZXJ0eS5cblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50XG5cdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRcdFx0aWYgKCBcImxhYmVsXCIgaW4gZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0ucGFyZW50Tm9kZS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA2IC0gMTFcblx0XHRcdFx0Ly8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnNcblx0XHRcdFx0cmV0dXJuIGVsZW0uaXNEaXNhYmxlZCA9PT0gZGlzYWJsZWQgfHxcblxuXHRcdFx0XHRcdC8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5XG5cdFx0XHRcdFx0LyoganNoaW50IC1XMDE4ICovXG5cdFx0XHRcdFx0ZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRcdGRpc2FibGVkQW5jZXN0b3IoIGVsZW0gKSA9PT0gZGlzYWJsZWQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblxuXHRcdC8vIFRyeSB0byB3aW5ub3cgb3V0IGVsZW1lbnRzIHRoYXQgY2FuJ3QgYmUgZGlzYWJsZWQgYmVmb3JlIHRydXN0aW5nIHRoZSBkaXNhYmxlZCBwcm9wZXJ0eS5cblx0XHQvLyBTb21lIHZpY3RpbXMgZ2V0IGNhdWdodCBpbiBvdXIgbmV0IChsYWJlbCwgbGVnZW5kLCBtZW51LCB0cmFjayksIGJ1dCBpdCBzaG91bGRuJ3Rcblx0XHQvLyBldmVuIGV4aXN0IG9uIHRoZW0sIGxldCBhbG9uZSBoYXZlIGEgYm9vbGVhbiB2YWx1ZS5cblx0XHR9IGVsc2UgaWYgKCBcImxhYmVsXCIgaW4gZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHR9XG5cblx0XHQvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZFxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHtcblx0XHRcdFx0XHRzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0XG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxuXHR2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gXCJIVE1MXCIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5LTExLCBFZGdlXG5cdC8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNilcblx0aWYgKCBwcmVmZXJyZWREb2MgIT09IGRvY3VtZW50ICYmXG5cdFx0KHN1YldpbmRvdyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3KSAmJiBzdWJXaW5kb3cudG9wICE9PSBzdWJXaW5kb3cgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSwgRWRnZVxuXHRcdGlmICggc3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5XG5cdFx0fSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0c3ViV2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBBdHRyaWJ1dGVzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBTdXBwb3J0OiBJRTw4XG5cdC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllc1xuXHQvLyAoZXhjZXB0aW5nIElFOCBib29sZWFucylcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZShcImNsYXNzTmFtZVwiKTtcblx0fSk7XG5cblx0LyogZ2V0RWxlbWVudChzKUJ5KlxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIHJldHVybnMgb25seSBlbGVtZW50c1xuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIlwiKSApO1xuXHRcdHJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaWQgPSBleHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBJRCBmaWx0ZXIgYW5kIGZpbmRcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDcgb25seVxuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRFeHByLmZpbmRbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBub2RlLCBpLCBlbGVtcyxcblx0XHRcdFx0XHRlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHQvLyBWZXJpZnkgdGhlIGlkIGF0dHJpYnV0ZVxuXHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRmFsbCBiYWNrIG9uIGdldEVsZW1lbnRzQnlOYW1lXG5cdFx0XHRcdFx0ZWxlbXMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBpZCApO1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtc1tpKytdKSApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZFtcIlRBR1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgP1xuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgZG9uJ3QgaGF2ZSBnRUJUTlxuXHRcdFx0fSBlbHNlIGlmICggc3VwcG9ydC5xc2EgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyApO1xuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHR0bXAgPSBbXSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdC8vIEJ5IGhhcHB5IGNvaW5jaWRlbmNlLCBhIChicm9rZW4pIGdFQlROIGFwcGVhcnMgb24gRG9jdW1lbnRGcmFnbWVudCBub2RlcyB0b29cblx0XHRcdFx0cmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzXG5cdFx0XHRpZiAoIHRhZyA9PT0gXCIqXCIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdHRtcC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRtcDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdH07XG5cblx0Ly8gQ2xhc3Ncblx0RXhwci5maW5kW1wiQ0xBU1NcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHtcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4XG5cdHJidWdneVFTQSA9IFtdO1xuXG5cdGlmICggKHN1cHBvcnQucXNhID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxyXFxcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbChcIltzZWxlY3RlZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OnZhbHVlfFwiICsgYm9vbGVhbnMgKyBcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWU8MjksIEFuZHJvaWQ8NC40LCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuOCtcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6Y2hlY2tlZFwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiOmNoZWNrZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4KywgaU9TIDgrXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2ODUxXG5cdFx0XHQvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIi4jLitbK35dXCIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdGVsLmlubmVySFRNTCA9IFwiPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHNcblx0XHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdFx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIltuYW1lPWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwibmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKlsqXiR8IX5dPz1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdFx0XHQvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHNcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKFwiOmRpc2FibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZWwucXVlcnlTZWxlY3RvckFsbChcIiosOnhcIik7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaChcIiwuKjpcIik7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHxcblx0XHRkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZWwsIFwiKlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZWwsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKFwifFwiKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgc2VsZi1leGNsdXNpdmVcblx0Ly8gQXMgaW4sIGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGZcblx0Y29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID9cblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXG5cdFx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xuXHRcdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cdFx0XHRcdGFkb3duLmNvbnRhaW5zID9cblx0XHRcdFx0XHRhZG93bi5jb250YWlucyggYnVwICkgOlxuXHRcdFx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNlxuXHRcdFx0KSk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHRpZiAoIGIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkge1xuXHRcdFx0XHRcdGlmICggYiA9PT0gYSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBoYXNDb21wYXJlID9cblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG5cdFx0dmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO1xuXHRcdGlmICggY29tcGFyZSApIHtcblx0XHRcdHJldHVybiBjb21wYXJlO1xuXHRcdH1cblxuXHRcdC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnRcblx0XHRjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkge1xuXG5cdFx0XHQvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnRcblx0XHRcdGlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBiID09PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cdFx0XHRyZXR1cm4gYSA9PT0gZG9jdW1lbnQgPyAtMSA6XG5cdFx0XHRcdGIgPT09IGRvY3VtZW50ID8gMSA6XG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHRhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkXG5cdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0IWNvbXBpbGVyQ2FjaGVbIGV4cHIgKyBcIiBcIiBdICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblx0XHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHt9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVzY2FwZSA9IGZ1bmN0aW9uKCBzZWwgKSB7XG5cdHJldHVybiAoc2VsICsgXCJcIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7XG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbMl0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbM10gPSBcIiBcIiArIG1hdGNoWzNdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbMV0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09IFwiZXZlblwiIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbNV0gPSArKCAoIG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByW1wiQ0hJTERcIl0udGVzdCggbWF0Y2hbMF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRtYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJlxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSkgJiZcblx0XHRcdFx0Y2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiApO1xuXHRcdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGUsXG5cdFx0XHRcdFx0XHRkaWZmID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU2VlayBgZWxlbWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRub2RlID0gcGFyZW50O1xuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4ICYmIGNhY2hlWyAyIF07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBVc2UgcHJldmlvdXNseS1jYWNoZWQgZWxlbWVudCBpbmRleCBpZiBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4O1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8geG1sIDpudGgtY2hpbGQoLi4uKVxuXHRcdFx0XHRcdFx0XHQvLyBvciA6bnRoLWxhc3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pXG5cdFx0XHRcdFx0XHRcdGlmICggZGlmZiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7XG5cdFx0XHQvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmVcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXNcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXG5cdFx0XHQvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zXG5cdFx0XHR2YXIgYXJncyxcblx0XHRcdFx0Zm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIFNpenpsZSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaWR4LFxuXHRcdFx0XHRcdFx0XHRtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50ICksXG5cdFx0XHRcdFx0XHRcdGkgPSBtYXRjaGVkLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZuO1xuXHRcdH1cblx0fSxcblxuXHRwc2V1ZG9zOiB7XG5cdFx0Ly8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zXG5cdFx0XCJub3RcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0XHRcdHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSxcblx0XHRcdFx0XHRcdGkgPSBzZWVkLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmBcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxlbSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBlbGVtO1xuXHRcdFx0XHRcdG1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTtcblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0XHRcdGlucHV0WzBdID0gbnVsbDtcblx0XHRcdFx0XHRyZXR1cm4gIXJlc3VsdHMucG9wKCk7XG5cdFx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImhhc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJjb250YWluc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIFwiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvclxuXHRcdC8vIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlXG5cdFx0Ly8gYmVpbmcgZXF1YWwgdG8gdGhlIGlkZW50aWZpZXIgQyxcblx0XHQvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwiLVwiLlxuXHRcdC8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHRcdC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuXCJcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvXG5cdFx0XCJsYW5nXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7XG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KGxhbmcgfHwgXCJcIikgKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRcdFx0XHRlbGVtLmxhbmcgOlxuXHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImxhbmdcIikpICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHRcInRhcmdldFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRcdFx0cmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkO1xuXHRcdH0sXG5cblx0XHRcInJvb3RcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTtcblx0XHR9LFxuXG5cdFx0XCJmb2N1c1wiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmICghZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSkgJiYgISEoZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCk7XG5cdFx0fSxcblxuXHRcdC8vIEJvb2xlYW4gcHJvcGVydGllc1xuXHRcdFwiZW5hYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZmFsc2UgKSxcblx0XHRcImRpc2FibGVkXCI6IGNyZWF0ZURpc2FibGVkUHNldWRvKCB0cnVlICksXG5cblx0XHRcImNoZWNrZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gKG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0gXCJvcHRpb25cIiAmJiAhIWVsZW0uc2VsZWN0ZWQpO1xuXHRcdH0sXG5cblx0XHRcInNlbGVjdGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdFxuXHRcdFx0Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseVxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly8gQ29udGVudHNcblx0XHRcImVtcHR5XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRcInBhcmVudFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAhRXhwci5wc2V1ZG9zW1wiZW1wdHlcIl0oIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdFwiaGVhZGVyXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImlucHV0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImJ1dHRvblwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFwiYnV0dG9uXCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIjtcblx0XHR9LFxuXG5cdFx0XCJ0ZXh0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiZcblx0XHRcdFx0ZWxlbS50eXBlID09PSBcInRleHRcIiAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDhcblx0XHRcdFx0Ly8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sIFwic2VhcmNoXCIpIGFwcGVhciB3aXRoIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0KCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiICk7XG5cdFx0fSxcblxuXHRcdC8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb25cblx0XHRcImZpcnN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gWyAwIF07XG5cdFx0fSksXG5cblx0XHRcImxhc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gWyBsZW5ndGggLSAxIF07XG5cdFx0fSksXG5cblx0XHRcImVxXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9KSxcblxuXHRcdFwiZXZlblwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwib2RkXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAxO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJsdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImd0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSlcblx0fVxufTtcblxuRXhwci5wc2V1ZG9zW1wibnRoXCJdID0gRXhwci5wc2V1ZG9zW1wiZXFcIl07XG5cbi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zXG5mb3IgKCBpIGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApO1xufVxuZm9yICggaSBpbiB7IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTtcbn1cblxuLy8gRWFzeSBBUEkgZm9yIGNyZWF0aW5nIG5ldyBzZXRGaWx0ZXJzXG5mdW5jdGlvbiBzZXRGaWx0ZXJzKCkge31cbnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zO1xuRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTtcblxudG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHtcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXG5cdFx0c29GYXIsIGdyb3VwcywgcHJlRmlsdGVycyxcblx0XHRjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCBjYWNoZWQgKSB7XG5cdFx0cmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTtcblx0fVxuXG5cdHNvRmFyID0gc2VsZWN0b3I7XG5cdGdyb3VwcyA9IFtdO1xuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XG5cblx0d2hpbGUgKCBzb0ZhciApIHtcblxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cblx0XHRpZiAoICFtYXRjaGVkIHx8IChtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdGlmICggbWF0Y2ggKSB7XG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0Z3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTtcblx0XHR9XG5cblx0XHRtYXRjaGVkID0gZmFsc2U7XG5cblx0XHQvLyBDb21iaW5hdG9yc1xuXHRcdGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sIFwiIFwiIClcblx0XHRcdH0pO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0XHRtYXRjaGVzOiBtYXRjaFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFtYXRjaGVkICkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xuXHQvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnNcblx0cmV0dXJuIHBhcnNlT25seSA/XG5cdFx0c29GYXIubGVuZ3RoIDpcblx0XHRzb0ZhciA/XG5cdFx0XHRTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOlxuXHRcdFx0Ly8gQ2FjaGUgdGhlIHRva2Vuc1xuXHRcdFx0dG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7XG59O1xuXG5mdW5jdGlvbiB0b1NlbGVjdG9yKCB0b2tlbnMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdHNlbGVjdG9yID0gXCJcIjtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0c2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdHNraXAgPSBjb21iaW5hdG9yLm5leHQsXG5cdFx0a2V5ID0gc2tpcCB8fCBkaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYga2V5ID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdGlmICggc2tpcCAmJiBza2lwID09PSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdGVsZW0gPSBlbGVtWyBkaXIgXSB8fCBlbGVtO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggKG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGtleSBdKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsga2V5IF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1swXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiZcblx0XHRcdFx0XHRcdCh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbXCIgXCJdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0pXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbXCJUQUdcIl0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIFN1cHBvcnQ6IElFPDksIFNhZmFyaVxuXHRcdFx0Ly8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6IFwibGVuZ3RoXCI7IFNhZmFyaTogPG51bWJlcj4pIG1hdGNoaW5nIGVsZW1lbnRzIGJ5IGlkXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0aWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50ICkge1xuXHRcdFx0XHRcdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0XHRcdFx0XHRcdHhtbCA9ICFkb2N1bWVudElzSFRNTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCB8fCBkb2N1bWVudCwgeG1sKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGBpYCBpcyBub3cgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHZpc2l0ZWQgYWJvdmUsIGFuZCBhZGRpbmcgaXQgdG8gYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIG1ha2VzIHRoZSBsYXR0ZXIgbm9ubmVnYXRpdmUuXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBlcXVhbHMgYGlgKSwgdW5sZXNzIHdlIGRpZG4ndCB2aXNpdCBfYW55XyBlbGVtZW50cyBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhhdmVcblx0XHRcdC8vIG5vIGVsZW1lbnQgbWF0Y2hlcnMgYW5kIG5vIHNlZWQuXG5cdFx0XHQvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyBcIjBcIiBgaWAgYWxsb3dzIGBpYCB0byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0XG5cdFx0XHQvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIFwiMDBcIiBgbWF0Y2hlZENvdW50YCB0aGF0IGRpZmZlcnMgZnJvbSBgaWAgYnV0IGlzIGFsc29cblx0XHRcdC8vIG51bWVyaWNhbGx5IHplcm8uXG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoW2ldICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWRcblx0Ly8gKHRoZSBsYXR0ZXIgb2Ygd2hpY2ggZ3VhcmFudGVlcyB1cyBjb250ZXh0KVxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFJlZHVjZSBjb250ZXh0IGlmIHRoZSBsZWFkaW5nIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdFx0Y29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkge1xuXG5cdFx0XHRjb250ZXh0ID0gKCBFeHByLmZpbmRbXCJJRFwiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKHJ1bmVzY2FwZSwgZnVuZXNjYXBlKSwgY29udGV4dCApIHx8IFtdIClbMF07XG5cdFx0XHRpZiAoICFjb250ZXh0ICkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbFxuXHRcdFx0fSBlbHNlIGlmICggY29tcGlsZWQgKSB7XG5cdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmdcblx0XHRpID0gbWF0Y2hFeHByW1wibmVlZHNDb250ZXh0XCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRva2VuID0gdG9rZW5zW2ldO1xuXG5cdFx0XHQvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yXG5cdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbICh0eXBlID0gdG9rZW4udHlwZSkgXSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0pICkge1xuXHRcdFx0XHQvLyBTZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnNcblx0XHRcdFx0aWYgKCAoc2VlZCA9IGZpbmQoXG5cdFx0XHRcdFx0dG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRcdHJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0XHRcdFx0KSkgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHlcblx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTtcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3ZpZGVkXG5cdC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmVcblx0KCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKFxuXHRcdHNlZWQsXG5cdFx0Y29udGV4dCxcblx0XHQhZG9jdW1lbnRJc0hUTUwsXG5cdFx0cmVzdWx0cyxcblx0XHQhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdCk7XG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLy8gT25lLXRpbWUgYXNzaWdubWVudHNcblxuLy8gU29ydCBzdGFiaWxpdHlcbnN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoXCJcIikuc29ydCggc29ydE9yZGVyICkuam9pbihcIlwiKSA9PT0gZXhwYW5kbztcblxuLy8gU3VwcG9ydDogQ2hyb21lIDE0LTM1K1xuLy8gQWx3YXlzIGFzc3VtZSBkdXBsaWNhdGVzIGlmIHRoZXkgYXJlbid0IHBhc3NlZCB0byB0aGUgY29tcGFyaXNvbiBmdW5jdGlvblxuc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7XG5cbi8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudFxuc2V0RG9jdW1lbnQoKTtcblxuLy8gU3VwcG9ydDogV2Via2l0PDUzNy4zMiAtIFNhZmFyaSA2LjAuMy9DaHJvbWUgMjUgKGZpeGVkIGluIENocm9tZSAyNylcbi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKlxuc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGVsLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZmllbGRzZXRcIikgKSAmIDE7XG59KTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JyMnPjwvYT5cIjtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIgO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxpbnB1dC8+XCI7XG5cdGVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydChmdW5jdGlvbiggZWwgKSB7XG5cdHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA9PSBudWxsO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0pKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xuXG4vLyBEZXByZWNhdGVkXG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5qUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlO1xuXG5cblxuXG52YXIgZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XG5cdHZhciBtYXRjaGVkID0gW10sXG5cdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0dmFyIG1hdGNoZWQgPSBbXTtcblxuXHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0bWF0Y2hlZC5wdXNoKCBuICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG5cblxuZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7XG5cbiAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbn07XG52YXIgcnNpbmdsZVRhZyA9ICggL148KFthLXpdW15cXC9cXDA+OlxceDIwXFx0XFxyXFxuXFxmXSopW1xceDIwXFx0XFxyXFxuXFxmXSpcXC8/Pig/OjxcXC9cXDE+fCkkL2kgKTtcblxuXG5cbi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90XG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHtcblx0aWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICkgIT09IG5vdDtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBTaW5nbGUgZWxlbWVudFxuXHRpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gQXJyYXlsaWtlIG9mIGVsZW1lbnRzIChqUXVlcnksIGFyZ3VtZW50cywgQXJyYXkpXG5cdGlmICggdHlwZW9mIHF1YWxpZmllciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGluZGV4T2YuY2FsbCggcXVhbGlmaWVyLCBlbGVtICkgPiAtMSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9yc1xuXHRyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7XG59XG5cbmpRdWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHtcblx0dmFyIGVsZW0gPSBlbGVtc1sgMCBdO1xuXG5cdGlmICggbm90ICkge1xuXHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XG5cdH1cblxuXHRpZiAoIGVsZW1zLmxlbmd0aCA9PT0gMSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdHJldHVybiBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsgZWxlbSBdIDogW107XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTtcblx0fSApICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgaSwgcmV0LFxuXHRcdFx0bGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRzZWxmID0gdGhpcztcblxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKSApO1xuXHRcdH1cblxuXHRcdHJldCA9IHRoaXMucHVzaFN0YWNrKCBbXSApO1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbGVuID4gMSA/IGpRdWVyeS51bmlxdWVTb3J0KCByZXQgKSA6IHJldDtcblx0fSxcblx0ZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7XG5cdH0sXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSApICk7XG5cdH0sXG5cdGlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuICEhd2lubm93KFxuXHRcdFx0dGhpcyxcblxuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldFxuXHRcdFx0Ly8gc28gJChcInA6Zmlyc3RcIikuaXMoXCJwOmxhc3RcIikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvIFwicFwiLlxuXHRcdFx0dHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3IgKSA6XG5cdFx0XHRcdHNlbGVjdG9yIHx8IFtdLFxuXHRcdFx0ZmFsc2Vcblx0XHQpLmxlbmd0aDtcblx0fVxufSApO1xuXG5cbi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0XG5cblxuLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpXG52YXIgcm9vdGpRdWVyeSxcblxuXHQvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xuXHQvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHQvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkXG5cdHJxdWlja0V4cHIgPSAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkLyxcblxuXHRpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7XG5cdFx0dmFyIG1hdGNoLCBlbGVtO1xuXG5cdFx0Ly8gSEFORExFOiAkKFwiXCIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBNZXRob2QgaW5pdCgpIGFjY2VwdHMgYW4gYWx0ZXJuYXRlIHJvb3RqUXVlcnlcblx0XHQvLyBzbyBtaWdyYXRlIGNhbiBzdXBwb3J0IGpRdWVyeS5zdWIgKGdoLTIxMDEpXG5cdFx0cm9vdCA9IHJvb3QgfHwgcm9vdGpRdWVyeTtcblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbIDAgXSA9PT0gXCI8XCIgJiZcblx0XHRcdFx0c2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiZcblx0XHRcdFx0c2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcblx0XHRcdFx0bWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkXG5cdFx0XHRpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWyAxIF0gKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WyAwIF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsgMSBdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWyAxIF0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkge1xuXHRcdFx0XHRcdFx0Zm9yICggbWF0Y2ggaW4gY29udGV4dCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTtcblxuXHRcdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkge1xuXHRcdFx0cmV0dXJuIHJvb3QucmVhZHkgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0c2VsZWN0b3IoIGpRdWVyeSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cblx0Ly8gTWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcblx0Z3VhcmFudGVlZFVuaXF1ZSA9IHtcblx0XHRjaGlsZHJlbjogdHJ1ZSxcblx0XHRjb250ZW50czogdHJ1ZSxcblx0XHRuZXh0OiB0cnVlLFxuXHRcdHByZXY6IHRydWVcblx0fTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbIGkgXSApICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0bWF0Y2hlZCA9IFtdLFxuXHRcdFx0dGFyZ2V0cyA9IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTtcblxuXHRcdC8vIFBvc2l0aW9uYWwgc2VsZWN0b3JzIG5ldmVyIG1hdGNoLCBzaW5jZSB0aGVyZSdzIG5vIF9zZWxlY3Rpb25fIGNvbnRleHRcblx0XHRpZiAoICFybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmb3IgKCBjdXIgPSB0aGlzWyBpIF07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXG5cdFx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAoIHRhcmdldHMgP1xuXHRcdFx0XHRcdFx0dGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIFNpenpsZVxuXHRcdFx0XHRcdFx0Y3VyLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggY3VyLCBzZWxlY3RvcnMgKSApICkge1xuXG5cdFx0XHRcdFx0XHRtYXRjaGVkLnB1c2goIGN1ciApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApO1xuXHR9LFxuXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldFxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudFxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7XG5cdFx0fVxuXG5cdFx0Ly8gSW5kZXggaW4gc2VsZWN0b3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApO1xuXHRcdH1cblxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxuXHRcdHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsXG5cblx0XHRcdC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZFxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtXG5cdFx0KTtcblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soXG5cdFx0XHRqUXVlcnkudW5pcXVlU29ydChcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLmdldCgpLCBqUXVlcnkoIHNlbGVjdG9yLCBjb250ZXh0ICkgKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLmFkZCggc2VsZWN0b3IgPT0gbnVsbCA/XG5cdFx0XHR0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKCBzZWxlY3RvciApXG5cdFx0KTtcblx0fVxufSApO1xuXG5mdW5jdGlvbiBzaWJsaW5nKCBjdXIsIGRpciApIHtcblx0d2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fVxuXHRyZXR1cm4gY3VyO1xufVxuXG5qUXVlcnkuZWFjaCgge1xuXHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0cmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDtcblx0fSxcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcblx0fSxcblx0cGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIsIHVudGlsICk7XG5cdH0sXG5cdG5leHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTtcblx0fSxcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7XG5cdH0sXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcbiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgXCJpZnJhbWVcIiApICkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHksIGlPUyA3IG9ubHksIEFuZHJvaWQgQnJvd3NlciA8PTQuMyBvbmx5XG4gICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdFxuICAgICAgICAvLyBkb24ndCBzdXBwb3J0IGl0LlxuICAgICAgICBpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRlbXBsYXRlXCIgKSApIHtcbiAgICAgICAgICAgIGVsZW0gPSBlbGVtLmNvbnRlbnQgfHwgZWxlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTtcblx0fVxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7XG5cdFx0dmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcblxuXHRcdGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gXCJVbnRpbFwiICkge1xuXHRcdFx0c2VsZWN0b3IgPSB1bnRpbDtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlc1xuXHRcdFx0aWYgKCAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdICkge1xuXHRcdFx0XHRqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlc1xuXHRcdFx0aWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRtYXRjaGVkLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQgKTtcblx0fTtcbn0gKTtcbnZhciBybm90aHRtbHdoaXRlID0gKCAvW15cXHgyMFxcdFxcclxcblxcZl0rL2cgKTtcblxuXG5cbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xuXHR2YXIgb2JqZWN0ID0ge307XG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBfLCBmbGFnICkge1xuXHRcdG9iamVjdFsgZmxhZyBdID0gdHJ1ZTtcblx0fSApO1xuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcbiAqXHRcdFx0dGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdFxuICpcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXG4gKiBcImZpcmVkXCIgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogUG9zc2libGUgb3B0aW9uczpcbiAqXG4gKlx0b25jZTpcdFx0XHR3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdG1lbW9yeTpcdFx0XHR3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkXG4gKlx0XHRcdFx0XHRhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCBcIm1lbW9yaXplZFwiXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0dW5pcXVlOlx0XHRcdHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KVxuICpcbiAqXHRzdG9wT25GYWxzZTpcdGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICpcbiAqL1xualF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcblx0Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KVxuXHRvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgP1xuXHRcdGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6XG5cdFx0alF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTtcblxuXHR2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZ1xuXHRcdGZpcmluZyxcblxuXHRcdC8vIExhc3QgZmlyZSB2YWx1ZSBmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzXG5cdFx0bWVtb3J5LFxuXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWRcblx0XHRmaXJlZCxcblxuXHRcdC8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmdcblx0XHRsb2NrZWQsXG5cblx0XHQvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdFxuXHRcdGxpc3QgPSBbXSxcblxuXHRcdC8vIFF1ZXVlIG9mIGV4ZWN1dGlvbiBkYXRhIGZvciByZXBlYXRhYmxlIGxpc3RzXG5cdFx0cXVldWUgPSBbXSxcblxuXHRcdC8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKVxuXHRcdGZpcmluZ0luZGV4ID0gLTEsXG5cblx0XHQvLyBGaXJlIGNhbGxiYWNrc1xuXHRcdGZpcmUgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nXG5cdFx0XHRsb2NrZWQgPSBsb2NrZWQgfHwgb3B0aW9ucy5vbmNlO1xuXG5cdFx0XHQvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucyxcblx0XHRcdC8vIHJlc3BlY3RpbmcgZmlyaW5nSW5kZXggb3ZlcnJpZGVzIGFuZCBydW50aW1lIGNoYW5nZXNcblx0XHRcdGZpcmVkID0gZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkge1xuXHRcdFx0XHRtZW1vcnkgPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0XHR3aGlsZSAoICsrZmlyaW5nSW5kZXggPCBsaXN0Lmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdC8vIFJ1biBjYWxsYmFjayBhbmQgY2hlY2sgZm9yIGVhcmx5IHRlcm1pbmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBtZW1vcnlbIDAgXSwgbWVtb3J5WyAxIF0gKSA9PT0gZmFsc2UgJiZcblx0XHRcdFx0XHRcdG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEp1bXAgdG8gZW5kIGFuZCBmb3JnZXQgdGhlIGRhdGEgc28gLmFkZCBkb2Vzbid0IHJlLWZpcmVcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdFxuXHRcdFx0aWYgKCAhb3B0aW9ucy5tZW1vcnkgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRmaXJpbmcgPSBmYWxzZTtcblxuXHRcdFx0Ly8gQ2xlYW4gdXAgaWYgd2UncmUgZG9uZSBmaXJpbmcgZm9yIGdvb2Rcblx0XHRcdGlmICggbG9ja2VkICkge1xuXG5cdFx0XHRcdC8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHNcblx0XHRcdFx0aWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgdGhpcyBvYmplY3QgaXMgc3BlbnRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsaXN0ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cblx0XHRcdC8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3Rcblx0XHRcdGFkZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblxuXHRcdFx0XHRcdC8vIElmIHdlIGhhdmUgbWVtb3J5IGZyb20gYSBwYXN0IHJ1biwgd2Ugc2hvdWxkIGZpcmUgYWZ0ZXIgYWRkaW5nXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0cXVldWUucHVzaCggbWVtb3J5ICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0KCBmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdC5wdXNoKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIHRvVHlwZSggYXJnICkgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdH0gKSggYXJndW1lbnRzICk7XG5cblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3Rcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0dmFyIGluZGV4O1xuXHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHtcblx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID9cblx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDpcblx0XHRcdFx0XHRsaXN0Lmxlbmd0aCA+IDA7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlIGFuZCAuYWRkXG5cdFx0XHQvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdC8vIENsZWFyIGFsbCBjYWxsYmFja3MgYW5kIHZhbHVlc1xuXHRcdFx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRkaXNhYmxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhbGlzdDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmVcblx0XHRcdC8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpXG5cdFx0XHQvLyBBYm9ydCBhbnkgcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHRsb2NrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0bG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhbG9ja2VkO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkge1xuXHRcdFx0XHRpZiAoICFsb2NrZWQgKSB7XG5cdFx0XHRcdFx0YXJncyA9IGFyZ3MgfHwgW107XG5cdFx0XHRcdFx0YXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBhcmdzICk7XG5cdFx0XHRcdFx0aWYgKCAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXG5cdFx0XHRmaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWZpcmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIHNlbGY7XG59O1xuXG5cbmZ1bmN0aW9uIElkZW50aXR5KCB2ICkge1xuXHRyZXR1cm4gdjtcbn1cbmZ1bmN0aW9uIFRocm93ZXIoIGV4ICkge1xuXHR0aHJvdyBleDtcbn1cblxuZnVuY3Rpb24gYWRvcHRWYWx1ZSggdmFsdWUsIHJlc29sdmUsIHJlamVjdCwgbm9WYWx1ZSApIHtcblx0dmFyIG1ldGhvZDtcblxuXHR0cnkge1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIHByb21pc2UgYXNwZWN0IGZpcnN0IHRvIHByaXZpbGVnZSBzeW5jaHJvbm91cyBiZWhhdmlvclxuXHRcdGlmICggdmFsdWUgJiYgaXNGdW5jdGlvbiggKCBtZXRob2QgPSB2YWx1ZS5wcm9taXNlICkgKSApIHtcblx0XHRcdG1ldGhvZC5jYWxsKCB2YWx1ZSApLmRvbmUoIHJlc29sdmUgKS5mYWlsKCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIHRoZW5hYmxlc1xuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUsIHJlc29sdmUsIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgbm9uLXRoZW5hYmxlc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIENvbnRyb2wgYHJlc29sdmVgIGFyZ3VtZW50cyBieSBsZXR0aW5nIEFycmF5I3NsaWNlIGNhc3QgYm9vbGVhbiBgbm9WYWx1ZWAgdG8gaW50ZWdlcjpcblx0XHRcdC8vICogZmFsc2U6IFsgdmFsdWUgXS5zbGljZSggMCApID0+IHJlc29sdmUoIHZhbHVlIClcblx0XHRcdC8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpXG5cdFx0XHRyZXNvbHZlLmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXS5zbGljZSggbm9WYWx1ZSApICk7XG5cdFx0fVxuXG5cdC8vIEZvciBQcm9taXNlcy9BKywgY29udmVydCBleGNlcHRpb25zIGludG8gcmVqZWN0aW9uc1xuXHQvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluXG5cdC8vIERlZmVycmVkI3RoZW4gdG8gY29uZGl0aW9uYWxseSBzdXBwcmVzcyByZWplY3Rpb24uXG5cdH0gY2F0Y2ggKCB2YWx1ZSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIG9ubHlcblx0XHQvLyBTdHJpY3QgbW9kZSBmdW5jdGlvbnMgaW52b2tlZCB3aXRob3V0IC5jYWxsLy5hcHBseSBnZXQgZ2xvYmFsLW9iamVjdCBjb250ZXh0XG5cdFx0cmVqZWN0LmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXSApO1xuXHR9XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XG5cdFx0dmFyIHR1cGxlcyA9IFtcblxuXHRcdFx0XHQvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgY2FsbGJhY2tzLFxuXHRcdFx0XHQvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdXG5cdFx0XHRcdFsgXCJub3RpZnlcIiwgXCJwcm9ncmVzc1wiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLCAyIF0sXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMCwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCAxLCBcInJlamVjdGVkXCIgXVxuXHRcdFx0XSxcblx0XHRcdHN0YXRlID0gXCJwZW5kaW5nXCIsXG5cdFx0XHRwcm9taXNlID0ge1xuXHRcdFx0XHRzdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhbHdheXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImNhdGNoXCI6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0cGlwZTogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xuXHRcdFx0XHRcdHZhciBmbnMgPSBhcmd1bWVudHM7XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpXG5cdFx0XHRcdFx0XHRcdHZhciBmbiA9IGlzRnVuY3Rpb24oIGZuc1sgdHVwbGVbIDQgXSBdICkgJiYgZm5zWyB0dXBsZVsgNCBdIF07XG5cblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQucHJvZ3Jlc3MoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIubm90aWZ5IH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmRvbmUoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVzb2x2ZSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KVxuXHRcdFx0XHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDEgXSBdKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCAmJiBpc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBvblByb2dyZXNzICkge1xuXHRcdFx0XHRcdHZhciBtYXhEZXB0aCA9IDA7XG5cdFx0XHRcdFx0ZnVuY3Rpb24gcmVzb2x2ZSggZGVwdGgsIGRlZmVycmVkLCBoYW5kbGVyLCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdGhhdCA9IHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0YXJncyA9IGFyZ3VtZW50cyxcblx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQsIHRoZW47XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy4zXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01OVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoIDwgbWF4RGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjFcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkID09PSBkZWZlcnJlZC5wcm9taXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoIFwiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uXCIgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbnMgMi4zLjMuMSwgMy41XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNzVcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFJldHJpZXZlIGB0aGVuYCBvbmx5IG9uY2Vcblx0XHRcdFx0XHRcdFx0XHRcdHRoZW4gPSByZXR1cm5lZCAmJlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBjaGVjayBvYmplY3RzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZW5hYmlsaXR5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggdHlwZW9mIHJldHVybmVkID09PSBcIm9iamVjdFwiIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHJldHVybmVkID09PSBcImZ1bmN0aW9uXCIgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC50aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYSByZXR1cm5lZCB0aGVuYWJsZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gTm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGFsc28gaG9vayBpbnRvIHByb2dyZXNzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgZGlzcmVnYXJkIG9sZGVyIHJlc29sdXRpb24gdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWF4RGVwdGgrKztcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBhbGwgb3RoZXIgcmV0dXJuZWQgdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyByZXR1cm5lZCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUHJvY2VzcyB0aGUgdmFsdWUocylcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmYXVsdCBwcm9jZXNzIGlzIHJlc29sdmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0KCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBub3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgY2F0Y2ggYW5kIHJlamVjdCBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcyA9IHNwZWNpYWwgP1xuXHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rKCBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzLnN0YWNrVHJhY2UgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuNC4xXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgcG9zdC1yZXNvbHV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICsgMSA+PSBtYXhEZXB0aCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IFRocm93ZXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIGUgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMVxuXHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01N1xuXHRcdFx0XHRcdFx0XHQvLyBSZS1yZXNvbHZlIHByb21pc2VzIGltbWVkaWF0ZWx5IHRvIGRvZGdlIGZhbHNlIHJlamVjdGlvbiBmcm9tXG5cdFx0XHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgZXJyb3JzXG5cdFx0XHRcdFx0XHRcdGlmICggZGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcygpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2FsbCBhbiBvcHRpb25hbCBob29rIHRvIHJlY29yZCB0aGUgc3RhY2ssIGluIGNhc2Ugb2YgZXhjZXB0aW9uXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc2luY2UgaXQncyBvdGhlcndpc2UgbG9zdCB3aGVuIGV4ZWN1dGlvbiBnb2VzIGFzeW5jXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5zdGFja1RyYWNlID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25Qcm9ncmVzcyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlci5ub3RpZnlXaXRoXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDEgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGlzRnVuY3Rpb24oIG9uRnVsZmlsbGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25GdWxmaWxsZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAyIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblJlamVjdGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25SZWplY3RlZCA6XG5cdFx0XHRcdFx0XHRcdFx0XHRUaHJvd2VyXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkXG5cdFx0XHRcdC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3Rcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWZlcnJlZCA9IHt9O1xuXG5cdFx0Ly8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kc1xuXHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHtcblx0XHRcdHZhciBsaXN0ID0gdHVwbGVbIDIgXSxcblx0XHRcdFx0c3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdO1xuXG5cdFx0XHQvLyBwcm9taXNlLnByb2dyZXNzID0gbGlzdC5hZGRcblx0XHRcdC8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmZhaWwgPSBsaXN0LmFkZFxuXHRcdFx0cHJvbWlzZVsgdHVwbGVbIDEgXSBdID0gbGlzdC5hZGQ7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZVxuXHRcdFx0aWYgKCBzdGF0ZVN0cmluZyApIHtcblx0XHRcdFx0bGlzdC5hZGQoXG5cdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIHN0YXRlID0gXCJyZXNvbHZlZFwiIChpLmUuLCBmdWxmaWxsZWQpXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVqZWN0ZWRcIlxuXHRcdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0cmluZztcblx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHR0dXBsZXNbIDMgLSBpIF1bIDIgXS5kaXNhYmxlLFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAzIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrXG5cdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDIgXS5sb2NrLFxuXG5cdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0ubG9ja1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlXG5cdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0bGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApO1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnkgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQubm90aWZ5V2l0aCguLi4pIH1cblx0XHRcdC8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3QgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVqZWN0V2l0aCguLi4pIH1cblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH07XG5cblx0XHRcdC8vIGRlZmVycmVkLm5vdGlmeVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdC8vIGRlZmVycmVkLnJlamVjdFdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xuXHRcdH0gKTtcblxuXHRcdC8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZVxuXHRcdHByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTtcblxuXHRcdC8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnlcblx0XHRpZiAoIGZ1bmMgKSB7XG5cdFx0XHRmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBkb25lIVxuXHRcdHJldHVybiBkZWZlcnJlZDtcblx0fSxcblxuXHQvLyBEZWZlcnJlZCBoZWxwZXJcblx0d2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkge1xuXHRcdHZhclxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXNcblx0XHRcdHJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cblx0XHRcdC8vIGNvdW50IG9mIHVucHJvY2Vzc2VkIGFyZ3VtZW50c1xuXHRcdFx0aSA9IHJlbWFpbmluZyxcblxuXHRcdFx0Ly8gc3Vib3JkaW5hdGUgZnVsZmlsbG1lbnQgZGF0YVxuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblxuXHRcdFx0Ly8gdGhlIG1hc3RlciBEZWZlcnJlZFxuXHRcdFx0bWFzdGVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3Rvcnlcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdG1hc3Rlci5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdC8vIFNpbmdsZS0gYW5kIGVtcHR5IGFyZ3VtZW50cyBhcmUgYWRvcHRlZCBsaWtlIFByb21pc2UucmVzb2x2ZVxuXHRcdGlmICggcmVtYWluaW5nIDw9IDEgKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsXG5cdFx0XHRcdCFyZW1haW5pbmcgKTtcblxuXHRcdFx0Ly8gVXNlIC50aGVuKCkgdG8gdW53cmFwIHNlY29uZGFyeSB0aGVuYWJsZXMgKGNmLiBnaC0zMDAwKVxuXHRcdFx0aWYgKCBtYXN0ZXIuc3RhdGUoKSA9PT0gXCJwZW5kaW5nXCIgfHxcblx0XHRcdFx0aXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG1hc3Rlci50aGVuKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTXVsdGlwbGUgYXJndW1lbnRzIGFyZSBhZ2dyZWdhdGVkIGxpa2UgUHJvbWlzZS5hbGwgYXJyYXkgZWxlbWVudHNcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hc3Rlci5wcm9taXNlKCk7XG5cdH1cbn0gKTtcblxuXG4vLyBUaGVzZSB1c3VhbGx5IGluZGljYXRlIGEgcHJvZ3JhbW1lciBtaXN0YWtlIGR1cmluZyBkZXZlbG9wbWVudCxcbi8vIHdhcm4gYWJvdXQgdGhlbSBBU0FQIHJhdGhlciB0aGFuIHN3YWxsb3dpbmcgdGhlbSBieSBkZWZhdWx0LlxudmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87XG5cbmpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rID0gZnVuY3Rpb24oIGVycm9yLCBzdGFjayApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA4IC0gOSBvbmx5XG5cdC8vIENvbnNvbGUgZXhpc3RzIHdoZW4gZGV2IHRvb2xzIGFyZSBvcGVuLCB3aGljaCBjYW4gaGFwcGVuIGF0IGFueSB0aW1lXG5cdGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7XG5cdFx0d2luZG93LmNvbnNvbGUud2FybiggXCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiBcIiArIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrLCBzdGFjayApO1xuXHR9XG59O1xuXG5cblxuXG5qUXVlcnkucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHR0aHJvdyBlcnJvcjtcblx0fSApO1xufTtcblxuXG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cbmpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHtcblxuXHRyZWFkeUxpc3Rcblx0XHQudGhlbiggZm4gKVxuXG5cdFx0Ly8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXBcblx0XHQvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2tcblx0XHQvLyByZWdpc3RyYXRpb24uXG5cdFx0LmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlFeGNlcHRpb24oIGVycm9yICk7XG5cdFx0fSApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODFcblx0cmVhZHlXYWl0OiAxLFxuXG5cdC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHlcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xuXG5cdFx0Ly8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeVxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxuXHRcdGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTtcblxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXG5cdFx0aWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZVxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkucmVhZHkudGhlbiA9IHJlYWR5TGlzdC50aGVuO1xuXG4vLyBUaGUgcmVhZHkgZXZlbnQgaGFuZGxlciBhbmQgc2VsZiBjbGVhbnVwIG1ldGhvZFxuZnVuY3Rpb24gY29tcGxldGVkKCkge1xuXHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG5cdGpRdWVyeS5yZWFkeSgpO1xufVxuXG4vLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZFxuLy8gYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMCBvbmx5XG4vLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyBcImludGVyYWN0aXZlXCIgdG9vIHNvb25cbmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiIHx8XG5cdCggZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gXCJsb2FkaW5nXCIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkge1xuXG5cdC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeVxuXHR3aW5kb3cuc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7XG5cbn0gZWxzZSB7XG5cblx0Ly8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFja1xuXHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cblx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBjb21wbGV0ZWQgKTtcbn1cblxuXG5cblxuLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uXG4vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cbnZhciBhY2Nlc3MgPSBmdW5jdGlvbiggZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBlbGVtcy5sZW5ndGgsXG5cdFx0YnVsayA9IGtleSA9PSBudWxsO1xuXG5cdC8vIFNldHMgbWFueSB2YWx1ZXNcblx0aWYgKCB0b1R5cGUoIGtleSApID09PSBcIm9iamVjdFwiICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cdFx0Zm9yICggaSBpbiBrZXkgKSB7XG5cdFx0XHRhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTtcblx0XHR9XG5cblx0Ly8gU2V0cyBvbmUgdmFsdWVcblx0fSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXG5cdFx0aWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJhdyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBidWxrICkge1xuXG5cdFx0XHQvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXRcblx0XHRcdGlmICggcmF3ICkge1xuXHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcblx0XHRcdFx0Zm4gPSBudWxsO1xuXG5cdFx0XHQvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWxrID0gZm47XG5cdFx0XHRcdGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRmbihcblx0XHRcdFx0XHRlbGVtc1sgaSBdLCBrZXksIHJhdyA/XG5cdFx0XHRcdFx0dmFsdWUgOlxuXHRcdFx0XHRcdHZhbHVlLmNhbGwoIGVsZW1zWyBpIF0sIGksIGZuKCBlbGVtc1sgaSBdLCBrZXkgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBjaGFpbmFibGUgKSB7XG5cdFx0cmV0dXJuIGVsZW1zO1xuXHR9XG5cblx0Ly8gR2V0c1xuXHRpZiAoIGJ1bGsgKSB7XG5cdFx0cmV0dXJuIGZuLmNhbGwoIGVsZW1zICk7XG5cdH1cblxuXHRyZXR1cm4gbGVuID8gZm4oIGVsZW1zWyAwIF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xuXG5cbi8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xudmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbYS16XSkvZztcblxuLy8gVXNlZCBieSBjYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5mdW5jdGlvbiBmY2FtZWxDYXNlKCBhbGwsIGxldHRlciApIHtcblx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xufVxuXG4vLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSwgRWRnZSAxMiAtIDE1XG4vLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpXG5mdW5jdGlvbiBjYW1lbENhc2UoIHN0cmluZyApIHtcblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsIFwibXMtXCIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7XG59XG52YXIgYWNjZXB0RGF0YSA9IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHQvLyBBY2NlcHRzIG9ubHk6XG5cdC8vICAtIE5vZGVcblx0Ly8gICAgLSBOb2RlLkVMRU1FTlRfTk9ERVxuXHQvLyAgICAtIE5vZGUuRE9DVU1FTlRfTk9ERVxuXHQvLyAgLSBPYmplY3Rcblx0Ly8gICAgLSBBbnlcblx0cmV0dXJuIG93bmVyLm5vZGVUeXBlID09PSAxIHx8IG93bmVyLm5vZGVUeXBlID09PSA5IHx8ICEoICtvd25lci5ub2RlVHlwZSApO1xufTtcblxuXG5cblxuZnVuY3Rpb24gRGF0YSgpIHtcblx0dGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrO1xufVxuXG5EYXRhLnVpZCA9IDE7XG5cbkRhdGEucHJvdG90eXBlID0ge1xuXG5cdGNhY2hlOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGVcblx0XHR2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHQvLyBJZiBub3QsIGNyZWF0ZSBvbmVcblx0XHRpZiAoICF2YWx1ZSApIHtcblx0XHRcdHZhbHVlID0ge307XG5cblx0XHRcdC8vIFdlIGNhbiBhY2NlcHQgZGF0YSBmb3Igbm9uLWVsZW1lbnQgbm9kZXMgaW4gbW9kZXJuIGJyb3dzZXJzLFxuXHRcdFx0Ly8gYnV0IHdlIHNob3VsZCBub3QsIHNlZSAjODMzNS5cblx0XHRcdC8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBvd25lciApICkge1xuXG5cdFx0XHRcdC8vIElmIGl0IGlzIGEgbm9kZSB1bmxpa2VseSB0byBiZSBzdHJpbmdpZnktZWQgb3IgbG9vcGVkIG92ZXJcblx0XHRcdFx0Ly8gdXNlIHBsYWluIGFzc2lnbm1lbnRcblx0XHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHlcblx0XHRcdFx0Ly8gY29uZmlndXJhYmxlIG11c3QgYmUgdHJ1ZSB0byBhbGxvdyB0aGUgcHJvcGVydHkgdG8gYmVcblx0XHRcdFx0Ly8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywge1xuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGUoIG93bmVyICk7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUgXSBhcmdzXG5cdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBkYXRhICkgXSA9IHZhbHVlO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3Ncblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBwcm9wICkgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzLmNhY2hlKCBvd25lciApIDpcblxuXHRcdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdICYmIG93bmVyWyB0aGlzLmV4cGFuZG8gXVsgY2FtZWxDYXNlKCBrZXkgKSBdO1xuXHR9LFxuXHRhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHtcblxuXHRcdC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gTm8ga2V5IHdhcyBzcGVjaWZpZWRcblx0XHQvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWRcblx0XHQvL1xuXHRcdC8vIFRha2UgdGhlIFwicmVhZFwiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZVxuXHRcdC8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3Rcblx0XHQvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5XG5cdFx0Ly9cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdCggKCBrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiApICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLFxuXHRcdFx0Y2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHRpZiAoIGNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHNldCBjYW1lbENhc2Uga2V5cywgc28gcmVtb3ZlIHRoYXQuXG5cdFx0XHRcdGtleSA9IGtleS5tYXAoIGNhbWVsQ2FzZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0a2V5ID0gY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0XHQvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdGtleSA9IGtleSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0WyBrZXkgXSA6XG5cdFx0XHRcdFx0KCBrZXkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpID0ga2V5Lmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgdGhlcmUncyBubyBtb3JlIGRhdGFcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1XG5cdFx0XHQvLyBXZWJraXQgJiBCbGluayBwZXJmb3JtYW5jZSBzdWZmZXJzIHdoZW4gZGVsZXRpbmcgcHJvcGVydGllc1xuXHRcdFx0Ly8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzc4NjA3IChidWcgcmVzdHJpY3RlZClcblx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0dmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdHJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTtcblx0fVxufTtcbnZhciBkYXRhUHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvW0EtWl0vZztcblxuZnVuY3Rpb24gZ2V0RGF0YSggZGF0YSApIHtcblx0aWYgKCBkYXRhID09PSBcInRydWVcIiApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJmYWxzZVwiICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJudWxsXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuXHRpZiAoIGRhdGEgPT09ICtkYXRhICsgXCJcIiApIHtcblx0XHRyZXR1cm4gK2RhdGE7XG5cdH1cblxuXHRpZiAoIHJicmFjZS50ZXN0KCBkYXRhICkgKSB7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKTtcblx0fVxuXG5cdHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGdldERhdGEoIGRhdGEgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhVXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTtcblx0fSxcblxuXHRkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVVzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRlcHJlY2F0ZWQuXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGRhdGEsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0YXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlcztcblxuXHRcdC8vIEdldHMgYWxsIHZhbHVlc1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhUHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NClcblx0XHRcdFx0XHRcdGlmICggYXR0cnNbIGkgXSApIHtcblx0XHRcdFx0XHRcdFx0bmFtZSA9IGF0dHJzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRcdFx0aWYgKCBuYW1lLmluZGV4T2YoIFwiZGF0YS1cIiApID09PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdG5hbWUgPSBjYW1lbENhc2UoIG5hbWUuc2xpY2UoIDUgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHQvLyBTZXRzIG11bHRpcGxlIHZhbHVlc1xuXHRcdGlmICggdHlwZW9mIGtleSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBkYXRhO1xuXG5cdFx0XHQvLyBUaGUgY2FsbGluZyBqUXVlcnkgb2JqZWN0IChlbGVtZW50IG1hdGNoZXMpIGlzIG5vdCBlbXB0eVxuXHRcdFx0Ly8gKGFuZCB0aGVyZWZvcmUgaGFzIGFuIGVsZW1lbnQgYXBwZWFycyBhdCB0aGlzWyAwIF0pIGFuZCB0aGVcblx0XHRcdC8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0XG5cdFx0XHQvLyB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBmb3IgZWxlbSA9IHRoaXNbIDAgXSB3aGljaCB3aWxsXG5cdFx0XHQvLyB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gYXR0ZW1wdCB0byByZWFkIGEgZGF0YSBjYWNoZSBpcyBtYWRlLlxuXHRcdFx0aWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyBUaGUga2V5IHdpbGwgYWx3YXlzIGJlIGNhbWVsQ2FzZWQgaW4gRGF0YVxuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIFwiZGlzY292ZXJcIiB0aGUgZGF0YSBpblxuXHRcdFx0XHQvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzXG5cdFx0XHRcdGRhdGEgPSBkYXRhQXR0ciggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LlxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgZGF0YS4uLlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5XG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApO1xuXHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBxdWV1ZTtcblxuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHR5cGUgPSAoIHR5cGUgfHwgXCJmeFwiICkgKyBcInF1ZXVlXCI7XG5cdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IEFycmF5LmlzQXJyYXkoIGRhdGEgKSApIHtcblx0XHRcdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cXVldWUucHVzaCggZGF0YSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcXVldWUgfHwgW107XG5cdFx0fVxuXHR9LFxuXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLFxuXHRcdFx0c3RhcnRMZW5ndGggPSBxdWV1ZS5sZW5ndGgsXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCksXG5cdFx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLFxuXHRcdFx0bmV4dCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApO1xuXHRcdFx0fTtcblxuXHRcdC8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWxcblx0XHRpZiAoIGZuID09PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdHN0YXJ0TGVuZ3RoLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblxuXHRcdFx0Ly8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZ1xuXHRcdFx0Ly8gYXV0b21hdGljYWxseSBkZXF1ZXVlZFxuXHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgKSB7XG5cdFx0XHRcdHF1ZXVlLnVuc2hpZnQoIFwiaW5wcm9ncmVzc1wiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb25cblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0Zm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTtcblx0XHR9XG5cblx0XHRpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmVcblx0X3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHZhciBrZXkgPSB0eXBlICsgXCJxdWV1ZUhvb2tzXCI7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmdldCggZWxlbSwga2V5ICkgfHwgZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBrZXksIHtcblx0XHRcdGVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKS5hZGQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArIFwicXVldWVcIiwga2V5IF0gKTtcblx0XHRcdH0gKVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgc2V0dGVyID0gMjtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRkYXRhID0gdHlwZTtcblx0XHRcdHR5cGUgPSBcImZ4XCI7XG5cdFx0XHRzZXR0ZXItLTtcblx0XHR9XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnF1ZXVlKCB0aGlzWyAwIF0sIHR5cGUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHRoaXMgOlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBkYXRhICk7XG5cblx0XHRcdFx0Ly8gRW5zdXJlIGEgaG9va3MgZm9yIHRoaXMgcXVldWVcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgJiYgcXVldWVbIDAgXSAhPT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHR9LFxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0fSApO1xuXHR9LFxuXHRjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdH0sXG5cblx0Ly8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZVxuXHQvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdClcblx0cHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHtcblx0XHR2YXIgdG1wLFxuXHRcdFx0Y291bnQgPSAxLFxuXHRcdFx0ZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGVsZW1lbnRzID0gdGhpcyxcblx0XHRcdGkgPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJlc29sdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhKCAtLWNvdW50ICkgKSB7XG5cdFx0XHRcdFx0ZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRvYmogPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0bXAgPSBkYXRhUHJpdi5nZXQoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyBcInF1ZXVlSG9va3NcIiApO1xuXHRcdFx0aWYgKCB0bXAgJiYgdG1wLmVtcHR5ICkge1xuXHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0XHR0bXAuZW1wdHkuYWRkKCByZXNvbHZlICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlc29sdmUoKTtcblx0XHRyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7XG5cdH1cbn0gKTtcbnZhciBwbnVtID0gKCAvWystXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVsrLV0/XFxkK3wpLyApLnNvdXJjZTtcblxudmFyIHJjc3NOdW0gPSBuZXcgUmVnRXhwKCBcIl4oPzooWystXSk9fCkoXCIgKyBwbnVtICsgXCIpKFthLXolXSopJFwiLCBcImlcIiApO1xuXG5cbnZhciBjc3NFeHBhbmQgPSBbIFwiVG9wXCIsIFwiUmlnaHRcIiwgXCJCb3R0b21cIiwgXCJMZWZ0XCIgXTtcblxudmFyIGlzSGlkZGVuV2l0aGluVHJlZSA9IGZ1bmN0aW9uKCBlbGVtLCBlbCApIHtcblxuXHRcdC8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uO1xuXHRcdC8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudFxuXHRcdGVsZW0gPSBlbCB8fCBlbGVtO1xuXG5cdFx0Ly8gSW5saW5lIHN0eWxlIHRydW1wcyBhbGxcblx0XHRyZXR1cm4gZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiB8fFxuXHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmXG5cblx0XHRcdC8vIE90aGVyd2lzZSwgY2hlY2sgY29tcHV0ZWQgc3R5bGVcblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1XG5cdFx0XHQvLyBEaXNjb25uZWN0ZWQgZWxlbWVudHMgY2FuIGhhdmUgY29tcHV0ZWQgZGlzcGxheTogbm9uZSwgc28gZmlyc3QgY29uZmlybSB0aGF0IGVsZW0gaXNcblx0XHRcdC8vIGluIHRoZSBkb2N1bWVudC5cblx0XHRcdGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiZcblxuXHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCI7XG5cdH07XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrLCBhcmdzICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTtcblxuXHQvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn07XG5cblxuXG5cbmZ1bmN0aW9uIGFkanVzdENTUyggZWxlbSwgcHJvcCwgdmFsdWVQYXJ0cywgdHdlZW4gKSB7XG5cdHZhciBhZGp1c3RlZCwgc2NhbGUsXG5cdFx0bWF4SXRlcmF0aW9ucyA9IDIwLFxuXHRcdGN1cnJlbnRWYWx1ZSA9IHR3ZWVuID9cblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uY3VyKCk7XG5cdFx0XHR9IDpcblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgcHJvcCwgXCJcIiApO1xuXHRcdFx0fSxcblx0XHRpbml0aWFsID0gY3VycmVudFZhbHVlKCksXG5cdFx0dW5pdCA9IHZhbHVlUGFydHMgJiYgdmFsdWVQYXJ0c1sgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApLFxuXG5cdFx0Ly8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXNcblx0XHRpbml0aWFsSW5Vbml0ID0gKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gfHwgdW5pdCAhPT0gXCJweFwiICYmICtpbml0aWFsICkgJiZcblx0XHRcdHJjc3NOdW0uZXhlYyggalF1ZXJ5LmNzcyggZWxlbSwgcHJvcCApICk7XG5cblx0aWYgKCBpbml0aWFsSW5Vbml0ICYmIGluaXRpYWxJblVuaXRbIDMgXSAhPT0gdW5pdCApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD01NFxuXHRcdC8vIEhhbHZlIHRoZSBpdGVyYXRpb24gdGFyZ2V0IHZhbHVlIHRvIHByZXZlbnQgaW50ZXJmZXJlbmNlIGZyb20gQ1NTIHVwcGVyIGJvdW5kcyAoZ2gtMjE0NClcblx0XHRpbml0aWFsID0gaW5pdGlhbCAvIDI7XG5cblx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0dW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdO1xuXG5cdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWwgfHwgMTtcblxuXHRcdHdoaWxlICggbWF4SXRlcmF0aW9ucy0tICkge1xuXG5cdFx0XHQvLyBFdmFsdWF0ZSBhbmQgdXBkYXRlIG91ciBiZXN0IGd1ZXNzIChkb3VibGluZyBndWVzc2VzIHRoYXQgemVybyBvdXQpLlxuXHRcdFx0Ly8gRmluaXNoIGlmIHRoZSBzY2FsZSBlcXVhbHMgb3IgY3Jvc3NlcyAxIChtYWtpbmcgdGhlIG9sZCpuZXcgcHJvZHVjdCBub24tcG9zaXRpdmUpLlxuXHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXHRcdFx0aWYgKCAoIDEgLSBzY2FsZSApICogKCAxIC0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCB8fCAwLjUgKSApIDw9IDAgKSB7XG5cdFx0XHRcdG1heEl0ZXJhdGlvbnMgPSAwO1xuXHRcdFx0fVxuXHRcdFx0aW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgLyBzY2FsZTtcblxuXHRcdH1cblxuXHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0ICogMjtcblx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2VlbiBwcm9wZXJ0aWVzIGxhdGVyIG9uXG5cdFx0dmFsdWVQYXJ0cyA9IHZhbHVlUGFydHMgfHwgW107XG5cdH1cblxuXHRpZiAoIHZhbHVlUGFydHMgKSB7XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFsIHx8IDA7XG5cblx0XHQvLyBBcHBseSByZWxhdGl2ZSBvZmZzZXQgKCs9Ly09KSBpZiBzcGVjaWZpZWRcblx0XHRhZGp1c3RlZCA9IHZhbHVlUGFydHNbIDEgXSA/XG5cdFx0XHRpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOlxuXHRcdFx0K3ZhbHVlUGFydHNbIDIgXTtcblx0XHRpZiAoIHR3ZWVuICkge1xuXHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHR0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7XG5cdFx0XHR0d2Vlbi5lbmQgPSBhZGp1c3RlZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFkanVzdGVkO1xufVxuXG5cbnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApIHtcblx0dmFyIHRlbXAsXG5cdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50LFxuXHRcdG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSxcblx0XHRkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF07XG5cblx0aWYgKCBkaXNwbGF5ICkge1xuXHRcdHJldHVybiBkaXNwbGF5O1xuXHR9XG5cblx0dGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApO1xuXHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggdGVtcCwgXCJkaXNwbGF5XCIgKTtcblxuXHR0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRlbXAgKTtcblxuXHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdGRpc3BsYXkgPSBcImJsb2NrXCI7XG5cdH1cblx0ZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Ly8gRGV0ZXJtaW5lIG5ldyBkaXNwbGF5IHZhbHVlIGZvciBlbGVtZW50cyB0aGF0IG5lZWQgdG8gY2hhbmdlXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblxuXHRcdFx0Ly8gU2luY2Ugd2UgZm9yY2UgdmlzaWJpbGl0eSB1cG9uIGNhc2NhZGUtaGlkZGVuIGVsZW1lbnRzLCBhbiBpbW1lZGlhdGUgKGFuZCBzbG93KVxuXHRcdFx0Ly8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyXG5cdFx0XHQvLyBpbmxpbmUgb3IgYWJvdXQtdG8tYmUtcmVzdG9yZWQpXG5cdFx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZGlzcGxheVwiICkgfHwgbnVsbDtcblx0XHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICkge1xuXHRcdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBcIm5vbmVcIjtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB3aGF0IHdlJ3JlIG92ZXJ3cml0aW5nXG5cdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJkaXNwbGF5XCIsIGRpc3BsYXkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AgdG8gYXZvaWQgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCB2YWx1ZXNbIGluZGV4IF0gIT0gbnVsbCApIHtcblx0XHRcdGVsZW1lbnRzWyBpbmRleCBdLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZXNbIGluZGV4IF07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xuXHR9LFxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcblx0fSxcblx0dG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW5XaXRoaW5UcmVlKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcbnZhciByY2hlY2thYmxlVHlwZSA9ICggL14oPzpjaGVja2JveHxyYWRpbykkL2kgKTtcblxudmFyIHJ0YWdOYW1lID0gKCAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSspL2kgKTtcblxudmFyIHJzY3JpcHRUeXBlID0gKCAvXiR8Xm1vZHVsZSR8XFwvKD86amF2YXxlY21hKXNjcmlwdC9pICk7XG5cblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpXG5cdHZhciByZXQ7XG5cblx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIHtcblx0XHRyZXQgPSBbXTtcblx0fVxuXG5cdGlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufVxuXG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZGF0YVByaXYuc2V0KFxuXHRcdFx0ZWxlbXNbIGkgXSxcblx0XHRcdFwiZ2xvYmFsRXZhbFwiLFxuXHRcdFx0IXJlZkVsZW1lbnRzIHx8IGRhdGFQcml2LmdldCggcmVmRWxlbWVudHNbIGkgXSwgXCJnbG9iYWxFdmFsXCIgKVxuXHRcdCk7XG5cdH1cbn1cblxuXG52YXIgcmh0bWwgPSAvPHwmIz9cXHcrOy87XG5cbmZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24sIGlnbm9yZWQgKSB7XG5cdHZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosXG5cdFx0ZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRub2RlcyA9IFtdLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGVsZW0gPSBlbGVtc1sgaSBdO1xuXG5cdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0aWYgKCB0b1R5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZVxuXHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0dGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O1xuXHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHQvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnRcblx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wLmxhc3RDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMgYXJlIG9ycGhhbmVkICgjMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnRhaW5zID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdHRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgXCJzY3JpcHRcIiApO1xuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGlmICggY29udGFpbnMgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCB0bXAgKTtcblx0XHR9XG5cblx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0aWYgKCBzY3JpcHRzICkge1xuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHtcblx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZyYWdtZW50O1xufVxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICksXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIG9ubHlcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcbn0gKSgpO1xudmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG5cbnZhclxuXHRya2V5RXZlbnQgPSAvXmtleS8sXG5cdHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLFxuXHRydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlxcLiguKyl8KS87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvXG5mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0fSBjYXRjaCAoIGVyciApIHsgfVxufVxuXG5mdW5jdGlvbiBvbiggZWxlbSwgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgb25lICkge1xuXHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRvbiggZWxlbSwgdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cblx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vICggdHlwZXMsIGRhdGEsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRvcmlnRm4gPSBmbjtcblx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9O1xuXG5cdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0fVxuXHRyZXR1cm4gZWxlbS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdH0gKTtcbn1cblxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS5cbiAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuXG4gKi9cbmpRdWVyeS5ldmVudCA9IHtcblxuXHRnbG9iYWw6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHtcblxuXHRcdHZhciBoYW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpXG5cdFx0aWYgKCAhZWxlbURhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZVxuXHRcdC8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KVxuXHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGRvY3VtZW50RWxlbWVudCwgc2VsZWN0b3IgKTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0ge307XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZGF0YSBhbmQgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImhhbmRsZSBldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkge1xuXG5cdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0dmFyIGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggbmF0aXZlRXZlbnQgKTtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaiwgaGFuZGxlclF1ZXVlLFxuXHRcdFx0YXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLFxuXHRcdFx0aGFuZGxlcnMgPSAoIGRhdGFQcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWyAwIF0gPSBldmVudDtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0YXJnc1sgaSBdID0gYXJndW1lbnRzWyBpIF07XG5cdFx0fVxuXG5cdFx0ZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZFxuXHRcdGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBoYW5kbGVyc1xuXHRcdGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTtcblxuXHRcdC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtO1xuXG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSApICYmXG5cdFx0XHRcdCFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRcdC8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2Uocylcblx0XHRcdFx0Ly8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgZXZlbnQucm5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fFxuXHRcdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIgKS5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIGhhbmRsZU9iaiwgc2VsLCBtYXRjaGVkSGFuZGxlcnMsIG1hdGNoZWRTZWxlY3RvcnMsXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTlcblx0XHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICh0cmFjLTEzMTgwKVxuXHRcdFx0Y3VyLm5vZGVUeXBlICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MlxuXHRcdFx0Ly8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKVxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnQtdHlwZS1jbGlja1xuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0Ly8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgXCJjbGlja3NcIiBvZiByYWRpbyBpbnB1dHMsIHdoaWNoIGNhbiBoYXZlIGBidXR0b25gIC0xIChnaC0yMzQzKVxuXHRcdFx0ISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGV2ZW50LmJ1dHRvbiA+PSAxICkgKSB7XG5cblx0XHRcdGZvciAoIDsgY3VyICE9PSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGN1ci5kaXNhYmxlZCA9PT0gdHJ1ZSApICkge1xuXHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycyA9IFtdO1xuXHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnMgPSB7fTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID4gLTEgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggbWF0Y2hlZEhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZWRIYW5kbGVycyB9ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xuXHRcdGN1ciA9IHRoaXM7XG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhhbmRsZXJRdWV1ZTtcblx0fSxcblxuXHRhZGRQcm9wOiBmdW5jdGlvbiggbmFtZSwgaG9vayApIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGpRdWVyeS5FdmVudC5wcm90b3R5cGUsIG5hbWUsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cblx0XHRcdGdldDogaXNGdW5jdGlvbiggaG9vayApID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gOlxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwge1xuXHRcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGZpeDogZnVuY3Rpb24oIG9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0cmV0dXJuIG9yaWdpbmFsRXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0b3JpZ2luYWxFdmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblxuXHRcdFx0Ly8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZFxuXHRcdFx0bm9CdWJibGU6IHRydWVcblx0XHR9LFxuXHRcdGZvY3VzOiB7XG5cblx0XHRcdC8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkge1xuXHRcdFx0XHRcdHRoaXMuZm9jdXMoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNpblwiXG5cdFx0fSxcblx0XHRibHVyOiB7XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuYmx1ciApIHtcblx0XHRcdFx0XHR0aGlzLmJsdXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNvdXRcIlxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblxuXHRcdFx0Ly8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHRcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHRoaXMuY2xpY2soKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5LCBkb24ndCBmaXJlIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rc1xuXHRcdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0cmV0dXJuIG5vZGVOYW1lKCBldmVudC50YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblxuXHQvLyBUaGlzIFwiaWZcIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHNcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUgKTtcblx0fVxufTtcblxualF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7XG5cblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCApICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHlcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdFx0Ly8gQ3JlYXRlIHRhcmdldCBwcm9wZXJ0aWVzXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDw9NiAtIDcgb25seVxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0dGhpcy50YXJnZXQgPSAoIHNyYy50YXJnZXQgJiYgc3JjLnRhcmdldC5ub2RlVHlwZSA9PT0gMyApID9cblx0XHRcdHNyYy50YXJnZXQucGFyZW50Tm9kZSA6XG5cdFx0XHRzcmMudGFyZ2V0O1xuXG5cdFx0dGhpcy5jdXJyZW50VGFyZ2V0ID0gc3JjLmN1cnJlbnRUYXJnZXQ7XG5cdFx0dGhpcy5yZWxhdGVkVGFyZ2V0ID0gc3JjLnJlbGF0ZWRUYXJnZXQ7XG5cblx0Ly8gRXZlbnQgdHlwZVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMudHlwZSA9IHNyYztcblx0fVxuXG5cdC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XG5cdGlmICggcHJvcHMgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBpbmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lXG5cdHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTtcblxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXG5cdHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlO1xufTtcblxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LFxuXHRpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNTaW11bGF0ZWQ6IGZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cbn07XG5cbi8vIEluY2x1ZGVzIGFsbCBjb21tb24gZXZlbnQgcHJvcHMgaW5jbHVkaW5nIEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50IHNwZWNpZmljIHByb3BzXG5qUXVlcnkuZWFjaCgge1xuXHRhbHRLZXk6IHRydWUsXG5cdGJ1YmJsZXM6IHRydWUsXG5cdGNhbmNlbGFibGU6IHRydWUsXG5cdGNoYW5nZWRUb3VjaGVzOiB0cnVlLFxuXHRjdHJsS2V5OiB0cnVlLFxuXHRkZXRhaWw6IHRydWUsXG5cdGV2ZW50UGhhc2U6IHRydWUsXG5cdG1ldGFLZXk6IHRydWUsXG5cdHBhZ2VYOiB0cnVlLFxuXHRwYWdlWTogdHJ1ZSxcblx0c2hpZnRLZXk6IHRydWUsXG5cdHZpZXc6IHRydWUsXG5cdFwiY2hhclwiOiB0cnVlLFxuXHRjaGFyQ29kZTogdHJ1ZSxcblx0a2V5OiB0cnVlLFxuXHRrZXlDb2RlOiB0cnVlLFxuXHRidXR0b246IHRydWUsXG5cdGJ1dHRvbnM6IHRydWUsXG5cdGNsaWVudFg6IHRydWUsXG5cdGNsaWVudFk6IHRydWUsXG5cdG9mZnNldFg6IHRydWUsXG5cdG9mZnNldFk6IHRydWUsXG5cdHBvaW50ZXJJZDogdHJ1ZSxcblx0cG9pbnRlclR5cGU6IHRydWUsXG5cdHNjcmVlblg6IHRydWUsXG5cdHNjcmVlblk6IHRydWUsXG5cdHRhcmdldFRvdWNoZXM6IHRydWUsXG5cdHRvRWxlbWVudDogdHJ1ZSxcblx0dG91Y2hlczogdHJ1ZSxcblxuXHR3aGljaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBidXR0b24gPSBldmVudC5idXR0b247XG5cblx0XHQvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHNcblx0XHRpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHtcblx0XHRcdHJldHVybiBldmVudC5jaGFyQ29kZSAhPSBudWxsID8gZXZlbnQuY2hhckNvZGUgOiBldmVudC5rZXlDb2RlO1xuXHRcdH1cblxuXHRcdC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcblx0XHRpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCAmJiBybW91c2VFdmVudC50ZXN0KCBldmVudC50eXBlICkgKSB7XG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDEgKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDIgKSB7XG5cdFx0XHRcdHJldHVybiAzO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDQgKSB7XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQud2hpY2g7XG5cdH1cbn0sIGpRdWVyeS5ldmVudC5hZGRQcm9wICk7XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gc28gdGhhdCBldmVudCBkZWxlZ2F0aW9uIHdvcmtzIGluIGpRdWVyeS5cbi8vIERvIHRoZSBzYW1lIGZvciBwb2ludGVyZW50ZXIvcG9pbnRlcmxlYXZlIGFuZCBwb2ludGVyb3Zlci9wb2ludGVyb3V0XG4vL1xuLy8gU3VwcG9ydDogU2FmYXJpIDcgb25seVxuLy8gU2FmYXJpIHNlbmRzIG1vdXNlZW50ZXIgdG9vIG9mdGVuOyBzZWU6XG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNThcbi8vIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGJ1ZyAoaXQgZXhpc3RlZCBpbiBvbGRlciBDaHJvbWUgdmVyc2lvbnMgYXMgd2VsbCkuXG5qUXVlcnkuZWFjaCgge1xuXHRtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuXHRtb3VzZWxlYXZlOiBcIm1vdXNlb3V0XCIsXG5cdHBvaW50ZXJlbnRlcjogXCJwb2ludGVyb3ZlclwiLFxuXHRwb2ludGVybGVhdmU6IFwicG9pbnRlcm91dFwiXG59LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0ge1xuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxuXHRcdGJpbmRUeXBlOiBmaXgsXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXQsXG5cdFx0XHRcdHRhcmdldCA9IHRoaXMsXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxuXHRcdFx0XHRoYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7XG5cblx0XHRcdC8vIEZvciBtb3VzZWVudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuXG5cdFx0XHQvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvd1xuXHRcdFx0aWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkge1xuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xuXHRcdFx0XHRyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBmaXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID9cblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUgKyBcIi5cIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOlxuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzIFssIGZuXSApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxudmFyXG5cblx0LyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9pc3N1ZXMvMzIyOVxuXHRyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopW14+XSopXFwvPi9naSxcblxuXHQvKiBlc2xpbnQtZW5hYmxlICovXG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExLCBFZGdlIDEyIC0gMTMgb25seVxuXHQvLyBJbiBJRS9FZGdlIHVzaW5nIHJlZ2V4IGdyb3VwcyBoZXJlIGNhdXNlcyBzZXZlcmUgc2xvd2Rvd25zLlxuXHQvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyL1xuXHRybm9Jbm5lcmh0bWwgPSAvPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxcblxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2c7XG5cbi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93c1xuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdG5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlICE9PSAxMSA/IGNvbnRlbnQgOiBjb250ZW50LmZpcnN0Q2hpbGQsIFwidHJcIiApICkge1xuXG5cdFx0cmV0dXJuIGpRdWVyeSggZWxlbSApLmNoaWxkcmVuKCBcInRib2R5XCIgKVsgMCBdIHx8IGVsZW07XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvblxuZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHtcblx0ZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggXCJ0eXBlXCIgKSAhPT0gbnVsbCApICsgXCIvXCIgKyBlbGVtLnR5cGU7XG5cdHJldHVybiBlbGVtO1xufVxuZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHtcblx0aWYgKCAoIGVsZW0udHlwZSB8fCBcIlwiICkuc2xpY2UoIDAsIDUgKSA9PT0gXCJ0cnVlL1wiICkge1xuXHRcdGVsZW0udHlwZSA9IGVsZW0udHlwZS5zbGljZSggNSApO1xuXHR9IGVsc2Uge1xuXHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBcInR5cGVcIiApO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBpLCBsLCB0eXBlLCBwZGF0YU9sZCwgcGRhdGFDdXIsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFQcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YVByaXYuYWNjZXNzKCBzcmMgKTtcblx0XHRwZGF0YUN1ciA9IGRhdGFQcml2LnNldCggZGVzdCwgcGRhdGFPbGQgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRlbGV0ZSBwZGF0YUN1ci5oYW5kbGU7XG5cdFx0XHRwZGF0YUN1ci5ldmVudHMgPSB7fTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YVVzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhVXNlci5hY2Nlc3MoIHNyYyApO1xuXHRcdHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xkICk7XG5cblx0XHRkYXRhVXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gZG9tTWFuaXAoIGNvbGxlY3Rpb24sIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICkge1xuXG5cdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0YXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTtcblxuXHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuXHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gfHxcblx0XHRcdCggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdHJldHVybiBjb2xsZWN0aW9uLmVhY2goIGZ1bmN0aW9uKCBpbmRleCApIHtcblx0XHRcdHZhciBzZWxmID0gY29sbGVjdGlvbi5lcSggaW5kZXggKTtcblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRub2RlID0gZnJhZ21lbnQ7XG5cblx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHQvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgJiYgKCBub2RlLnR5cGUgfHwgXCJcIiApLnRvTG93ZXJDYXNlKCkgICE9PSBcIm1vZHVsZVwiICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5fZXZhbFVybCggbm9kZS5zcmMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0RE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKSwgZG9jLCBub2RlICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBEYXRhICkge1xuXHR2YXIgbm9kZSxcblx0XHRub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdGlmICggIWtlZXBEYXRhICYmIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIG5vZGUgKSApO1xuXHRcdH1cblxuXHRcdGlmICggbm9kZS5wYXJlbnROb2RlICkge1xuXHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIG5vZGUub3duZXJEb2N1bWVudCwgbm9kZSApICkge1xuXHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0fVxuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBub2RlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aHRtbFByZWZpbHRlcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0cmV0dXJuIGh0bWwucmVwbGFjZSggcnhodG1sVGFnLCBcIjwkMT48LyQyPlwiICk7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHR2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cyxcblx0XHRcdGNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKSxcblx0XHRcdGluUGFnZSA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHQvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXNcblx0XHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmXG5cdFx0XHRcdCFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBodHRwczovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblx0XHR2YXIgZGF0YSwgZWxlbSwgdHlwZSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT09IHVuZGVmaW5lZDsgaSsrICkge1xuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGlmICggKCBkYXRhID0gZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbFsgdHlwZSBdICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaWdub3JlZCA9IFtdO1xuXG5cdFx0Ly8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggbm9uLWlnbm9yZWQgY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggdGhpcywgaWdub3JlZCApIDwgMCApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTtcblx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uXG5cdFx0fSwgaWdub3JlZCApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCB7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0Ly8gLmdldCgpIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0cHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7XG5cdH07XG59ICk7XG52YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSg/IXB4KVthLXolXSskXCIsIFwiaVwiICk7XG5cbnZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seSwgRmlyZWZveCA8PTMwICgjMTUwOTgsICMxNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHR2YXIgdmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkge1xuXHRcdFx0dmlldyA9IHdpbmRvdztcblx0XHR9XG5cblx0XHRyZXR1cm4gdmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG5cdH07XG5cbnZhciByYm94U3R5bGUgPSBuZXcgUmVnRXhwKCBjc3NFeHBhbmQuam9pbiggXCJ8XCIgKSwgXCJpXCIgKTtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXG5cdFx0Ly8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZVxuXHRcdGlmICggIWRpdiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O1wiICtcblx0XHRcdFwibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowXCI7XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7XCIgK1xuXHRcdFx0XCJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O1wiICtcblx0XHRcdFwid2lkdGg6NjAlO3RvcDoxJVwiO1xuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdFx0dmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3AgIT09IFwiMSVcIjtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gNDRcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSByb3VuZFBpeGVsTWVhc3VyZXMoIGRpdlN0eWxlLm1hcmdpbkxlZnQgKSA9PT0gMTI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjNcblx0XHQvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3Rcblx0XHRkaXYuc3R5bGUucmlnaHQgPSBcIjYwJVwiO1xuXHRcdHBpeGVsQm94U3R5bGVzVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5yaWdodCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdFx0Ly8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50c1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdC8vIERldGVjdCBvdmVyZmxvdzpzY3JvbGwgc2NyZXdpbmVzcyAoZ2gtMzY5OSlcblx0XHRkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0c2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgXCJhYnNvbHV0ZVwiO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdC8vIE51bGxpZnkgdGhlIGRpdiBzbyBpdCB3b3VsZG4ndCBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeSBhbmRcblx0XHQvLyBpdCB3aWxsIGFsc28gYmUgYSBzaWduIHRoYXQgY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7XG5cdH1cblxuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsIHNjcm9sbGJveFNpemVWYWwsIHBpeGVsQm94U3R5bGVzVmFsLFxuXHRcdHJlbGlhYmxlTWFyZ2luTGVmdFZhbCxcblx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICksXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdC8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzXG5cdGlmICggIWRpdi5zdHlsZSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdC8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOClcblx0ZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJjb250ZW50LWJveFwiO1xuXHRkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcIlwiO1xuXHRzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gXCJjb250ZW50LWJveFwiO1xuXG5cdGpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHtcblx0XHRib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxCb3hTdHlsZXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbEJveFN0eWxlc1ZhbDtcblx0XHR9LFxuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5MZWZ0VmFsO1xuXHRcdH0sXG5cdFx0c2Nyb2xsYm94U2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHNjcm9sbGJveFNpemVWYWw7XG5cdFx0fVxuXHR9ICk7XG59ICkoKTtcblxuXG5mdW5jdGlvbiBjdXJDU1MoIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA1MStcblx0XHQvLyBSZXRyaWV2aW5nIHN0eWxlIGJlZm9yZSBjb21wdXRlZCBzb21laG93XG5cdFx0Ly8gZml4ZXMgYW4gaXNzdWUgd2l0aCBnZXR0aW5nIHdyb25nIHZhbHVlc1xuXHRcdC8vIG9uIGRldGFjaGVkIGVsZW1lbnRzXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdGNvbXB1dGVkID0gY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7XG5cblx0Ly8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBuZWVkZWQgZm9yOlxuXHQvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNylcblx0Ly8gICAuY3NzKCctLWN1c3RvbVByb3BlcnR5KSAoIzMxNDQpXG5cdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0cmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF07XG5cblx0XHRpZiAoIHJldCA9PT0gXCJcIiAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHtcblx0XHRcdHJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBBbmRyb2lkIEJyb3dzZXIgcmV0dXJucyBwZXJjZW50YWdlIGZvciBzb21lIHZhbHVlcyxcblx0XHQvLyBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzLlxuXHRcdC8vIFRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQgc3BlYzpcblx0XHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI3Jlc29sdmVkLXZhbHVlc1xuXHRcdGlmICggIXN1cHBvcnQucGl4ZWxCb3hTdHlsZXMoKSAmJiBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcmJveFN0eWxlLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuXHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcblx0XHRcdG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7XG5cdFx0XHRtYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoO1xuXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7XG5cdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcblxuXHRcdFx0Ly8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7XG5cdFx0XHRzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXQgKyBcIlwiIDpcblx0XHRyZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkge1xuXG5cdC8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggY29uZGl0aW9uRm4oKSApIHtcblxuXHRcdFx0XHQvLyBIb29rIG5vdCBuZWVkZWQgKG9yIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBpdCBkdWVcblx0XHRcdFx0Ly8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRkZWxldGUgdGhpcy5nZXQ7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSG9vayBuZWVkZWQ7IHJlZGVmaW5lIGl0IHNvIHRoYXQgdGhlIHN1cHBvcnQgdGVzdCBpcyBub3QgZXhlY3V0ZWQgYWdhaW4uXG5cdFx0XHRyZXR1cm4gKCB0aGlzLmdldCA9IGhvb2tGbiApLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG59XG5cblxudmFyXG5cblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZVxuXHQvLyBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0cmN1c3RvbVByb3AgPSAvXi0tLyxcblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH0sXG5cblx0Y3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIiBdLFxuXHRlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLnN0eWxlO1xuXG4vLyBSZXR1cm4gYSBjc3MgcHJvcGVydHkgbWFwcGVkIHRvIGEgcG90ZW50aWFsbHkgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5XG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHtcblxuXHQvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZFxuXHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRyZXR1cm4gbmFtZTtcblx0fVxuXG5cdC8vIENoZWNrIGZvciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXNcblx0dmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSxcblx0XHRpID0gY3NzUHJlZml4ZXMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTtcblx0XHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRcdHJldHVybiBuYW1lO1xuXHRcdH1cblx0fVxufVxuXG4vLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG9cbi8vIGEgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5LlxuZnVuY3Rpb24gZmluYWxQcm9wTmFtZSggbmFtZSApIHtcblx0dmFyIHJldCA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdO1xuXHRpZiAoICFyZXQgKSB7XG5cdFx0cmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7XG5cdH1cblx0cmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApIHtcblxuXHQvLyBBbnkgcmVsYXRpdmUgKCsvLSkgdmFsdWVzIGhhdmUgYWxyZWFkeSBiZWVuXG5cdC8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludFxuXHR2YXIgbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKTtcblx0cmV0dXJuIG1hdGNoZXMgP1xuXG5cdFx0Ly8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgXCJzdWJ0cmFjdFwiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3Ncblx0XHRNYXRoLm1heCggMCwgbWF0Y2hlc1sgMiBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApIDpcblx0XHR2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7XG5cdHZhciBpID0gZGltZW5zaW9uID09PSBcIndpZHRoXCIgPyAxIDogMCxcblx0XHRleHRyYSA9IDAsXG5cdFx0ZGVsdGEgPSAwO1xuXG5cdC8vIEFkanVzdG1lbnQgbWF5IG5vdCBiZSBuZWNlc3Nhcnlcblx0aWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHtcblxuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpblxuXHRcdGlmICggYm94ID09PSBcIm1hcmdpblwiICkge1xuXHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgYm94ICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBjb250ZW50LWJveCwgd2UncmUgc2Vla2luZyBcInBhZGRpbmdcIiBvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCJcblx0XHRpZiAoICFpc0JvcmRlckJveCApIHtcblxuXHRcdFx0Ly8gQWRkIHBhZGRpbmdcblx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBGb3IgXCJib3JkZXJcIiBvciBcIm1hcmdpblwiLCBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJwYWRkaW5nXCIgKSB7XG5cdFx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgXCJjb250ZW50XCIgb3Jcblx0XHQvLyBcInBhZGRpbmdcIiBvciBcIm1hcmdpblwiXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRm9yIFwiY29udGVudFwiLCBzdWJ0cmFjdCBwYWRkaW5nXG5cdFx0XHRpZiAoIGJveCA9PT0gXCJjb250ZW50XCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIgb3IgXCJwYWRkaW5nXCIsIHN1YnRyYWN0IGJvcmRlclxuXHRcdFx0aWYgKCBib3ggIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWxcblx0aWYgKCAhaXNCb3JkZXJCb3ggJiYgY29tcHV0ZWRWYWwgPj0gMCApIHtcblxuXHRcdC8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXJcblx0XHQvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duXG5cdFx0ZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbChcblx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRjb21wdXRlZFZhbCAtXG5cdFx0XHRkZWx0YSAtXG5cdFx0XHRleHRyYSAtXG5cdFx0XHQwLjVcblx0XHQpICk7XG5cdH1cblxuXHRyZXR1cm4gZGVsdGE7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZVxuXHR2YXIgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBkaW1lbnNpb24sIHN0eWxlcyApLFxuXHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7XG5cblx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTU0XG5cdC8vIFJldHVybiBhIGNvbmZvdW5kaW5nIG5vbi1waXhlbCB2YWx1ZSBvciBmZWlnbiBpZ25vcmFuY2UsIGFzIGFwcHJvcHJpYXRlLlxuXHRpZiAoIHJudW1ub25weC50ZXN0KCB2YWwgKSApIHtcblx0XHRpZiAoICFleHRyYSApIHtcblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fVxuXHRcdHZhbCA9IFwiYXV0b1wiO1xuXHR9XG5cblx0Ly8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcblx0Ly8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZVxuXHR2YWx1ZUlzQm9yZGVyQm94ID0gdmFsdWVJc0JvcmRlckJveCAmJlxuXHRcdCggc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gKTtcblxuXHQvLyBGYWxsIGJhY2sgdG8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IHdoZW4gdmFsdWUgaXMgXCJhdXRvXCJcblx0Ly8gVGhpcyBoYXBwZW5zIGZvciBpbmxpbmUgZWxlbWVudHMgd2l0aCBubyBleHBsaWNpdCBzZXR0aW5nIChnaC0zNTcxKVxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIC0gNC4zIG9ubHlcblx0Ly8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMilcblx0aWYgKCB2YWwgPT09IFwiYXV0b1wiIHx8XG5cdFx0IXBhcnNlRmxvYXQoIHZhbCApICYmIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiaW5saW5lXCIgKSB7XG5cblx0XHR2YWwgPSBlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF07XG5cblx0XHQvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlc1xuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlO1xuXHR9XG5cblx0Ly8gTm9ybWFsaXplIFwiXCIgYW5kIGF1dG9cblx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcblxuXHQvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsXG5cdHJldHVybiAoIHZhbCArXG5cdFx0Ym94TW9kZWxBZGp1c3RtZW50KFxuXHRcdFx0ZWxlbSxcblx0XHRcdGRpbWVuc2lvbixcblx0XHRcdGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSxcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3gsXG5cdFx0XHRzdHlsZXMsXG5cblx0XHRcdC8vIFByb3ZpZGUgdGhlIGN1cnJlbnQgY29tcHV0ZWQgc2l6ZSB0byByZXF1ZXN0IHNjcm9sbCBndXR0ZXIgY2FsY3VsYXRpb24gKGdoLTM1ODkpXG5cdFx0XHR2YWxcblx0XHQpXG5cdCkgKyBcInB4XCI7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnRcIjogdHJ1ZSxcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImxpbmVIZWlnaHRcIjogdHJ1ZSxcblx0XHRcIm9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcIm9yZGVyXCI6IHRydWUsXG5cdFx0XCJvcnBoYW5zXCI6IHRydWUsXG5cdFx0XCJ3aWRvd3NcIjogdHJ1ZSxcblx0XHRcInpJbmRleFwiOiB0cnVlLFxuXHRcdFwiem9vbVwiOiB0cnVlXG5cdH0sXG5cblx0Ly8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZVxuXHQvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlXG5cdGNzc1Byb3BzOiB7fSxcblxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxuXHRzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHtcblxuXHRcdC8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdHZhciByZXQsIHR5cGUsIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBjYW1lbENhc2UoIG5hbWUgKSxcblx0XHRcdGlzQ3VzdG9tUHJvcCA9IHJjdXN0b21Qcm9wLnRlc3QoIG5hbWUgKSxcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3Rcblx0XHQvLyB3YW50IHRvIHF1ZXJ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb25cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZVxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRcdC8vIENvbnZlcnQgXCIrPVwiIG9yIFwiLT1cIiB0byByZWxhdGl2ZSBudW1iZXJzICgjNzM0NSlcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAoIHJldCA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmIHJldFsgMSBdICkge1xuXHRcdFx0XHR2YWx1ZSA9IGFkanVzdENTUyggZWxlbSwgbmFtZSwgcmV0ICk7XG5cblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKCM3MTE2KVxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgdGhlIHVuaXQgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcylcblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8XG5cdFx0XHRcdCggdmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0XHRzdHlsZS5zZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3Rcblx0XHRcdHJldHVybiBzdHlsZVsgbmFtZSBdO1xuXHRcdH1cblx0fSxcblxuXHRjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkge1xuXHRcdHZhciB2YWwsIG51bSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZVxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcblx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IFwibm9ybWFsXCIgdG8gY29tcHV0ZWQgdmFsdWVcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcblx0XHRcdHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIE1ha2UgbnVtZXJpYyBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xuXHRcdGlmICggZXh0cmEgPT09IFwiXCIgfHwgZXh0cmEgKSB7XG5cdFx0XHRudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTtcblx0XHRcdHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggaSwgZGltZW5zaW9uICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0Ly8gQ2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXG5cdFx0XHRcdC8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0XG5cdFx0XHRcdHJldHVybiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICYmXG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCtcblx0XHRcdFx0XHQvLyBUYWJsZSBjb2x1bW5zIGluIFNhZmFyaSBoYXZlIG5vbi16ZXJvIG9mZnNldFdpZHRoICYgemVyb1xuXHRcdFx0XHRcdC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHVubGVzcyBkaXNwbGF5IGlzIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0XHRcdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHRcdFx0XHRcdC8vIGluIElFIHRocm93cyBhbiBlcnJvci5cblx0XHRcdFx0XHQoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoIHx8ICFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICkgP1xuXHRcdFx0XHRcdFx0c3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7XG5cdFx0XHR2YXIgbWF0Y2hlcyxcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0XHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0c3VidHJhY3QgPSBleHRyYSAmJiBib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRkaW1lbnNpb24sXG5cdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0aXNCb3JkZXJCb3gsXG5cdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdCk7XG5cblx0XHRcdC8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZFxuXHRcdFx0Ly8gZmFraW5nIGEgY29udGVudC1ib3ggdG8gZ2V0IGJvcmRlciBhbmQgcGFkZGluZyAoZ2gtMzY5OSlcblx0XHRcdGlmICggaXNCb3JkZXJCb3ggJiYgc3VwcG9ydC5zY3JvbGxib3hTaXplKCkgPT09IHN0eWxlcy5wb3NpdGlvbiApIHtcblx0XHRcdFx0c3VidHJhY3QgLT0gTWF0aC5jZWlsKFxuXHRcdFx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRcdFx0cGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC1cblx0XHRcdFx0XHRib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgXCJib3JkZXJcIiwgZmFsc2UsIHN0eWxlcyApIC1cblx0XHRcdFx0XHQwLjVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCB0byBwaXhlbHMgaWYgdmFsdWUgYWRqdXN0bWVudCBpcyBuZWVkZWRcblx0XHRcdGlmICggc3VidHJhY3QgJiYgKCBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiZcblx0XHRcdFx0KCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgIT09IFwicHhcIiApIHtcblxuXHRcdFx0XHRlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSA9IHZhbHVlO1xuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5jc3MoIGVsZW0sIGRpbWVuc2lvbiApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApO1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LFxuXHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdHJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIgKSApIHx8XG5cdFx0XHRcdGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXG5cdFx0XHRcdFx0c3dhcCggZWxlbSwgeyBtYXJnaW5MZWZ0OiAwIH0sIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KSArIFwicHhcIjtcblx0XHR9XG5cdH1cbik7XG5cbi8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXNcbmpRdWVyeS5lYWNoKCB7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS5zcGxpdCggXCIgXCIgKSA6IFsgdmFsdWUgXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgNDsgaSsrICkge1xuXHRcdFx0XHRleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9XG5cdFx0XHRcdFx0cGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXhwYW5kZWQ7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICggcHJlZml4ICE9PSBcIm1hcmdpblwiICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fVxufSApO1xuXG5cbmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHtcblx0cmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTtcbn1cbmpRdWVyeS5Ud2VlbiA9IFR3ZWVuO1xuXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBUd2Vlbixcblx0aW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkge1xuXHRcdHRoaXMuZWxlbSA9IGVsZW07XG5cdFx0dGhpcy5wcm9wID0gcHJvcDtcblx0XHR0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0O1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0Ly8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCxcblx0XHRcdC8vIG9yIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc3R5bGUgcHJvcGVydHkgdGhhdCBleGlzdHMuXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgIT09IDEgfHxcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07XG5cdFx0XHR9XG5cblx0XHRcdC8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseVxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscy5cblx0XHRcdC8vIFNpbXBsZSB2YWx1ZXMgc3VjaCBhcyBcIjEwcHhcIiBhcmUgcGFyc2VkIHRvIEZsb2F0O1xuXHRcdFx0Ly8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyBcInJvdGF0ZSgxcmFkKVwiIGFyZSByZXR1cm5lZCBhcy1pcy5cblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIFwiXCIgKTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fSxcblx0X2RlZmF1bHQ6IFwic3dpbmdcIlxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgY29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIGluUHJvZ3Jlc3MsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLztcblxuZnVuY3Rpb24gc2NoZWR1bGUoKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHtcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHNjaGVkdWxlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBzY2hlZHVsZSwgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdFx0fVxuXG5cdFx0alF1ZXJ5LmZ4LnRpY2soKTtcblx0fVxufVxuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LFxuXHRcdGlzQm94ID0gXCJ3aWR0aFwiIGluIHByb3BzIHx8IFwiaGVpZ2h0XCIgaW4gcHJvcHMsXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIFByZXRlbmQgdG8gYmUgaGlkZGVuIGlmIHRoaXMgaXMgYSBcInNob3dcIiBhbmRcblx0XHRcdFx0Ly8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gSWdub3JlIGFsbCBvdGhlciBuby1vcCBzaG93L2hpZGUgZGF0YVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpXG5cdHByb3BUd2VlbiA9ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcHMgKTtcblx0aWYgKCAhcHJvcFR3ZWVuICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVzdHJpY3QgXCJvdmVyZmxvd1wiIGFuZCBcImRpc3BsYXlcIiBzdHlsZXMgZHVyaW5nIGJveCBhbmltYXRpb25zXG5cdGlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90IGluZmVyIHRoZSBzaG9ydGhhbmRcblx0XHQvLyBmcm9tIGlkZW50aWNhbGx5LXZhbHVlZCBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WSBhbmQgRWRnZSBqdXN0IG1pcnJvcnNcblx0XHQvLyB0aGUgb3ZlcmZsb3dYIHZhbHVlIHRoZXJlLlxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gSWRlbnRpZnkgYSBkaXNwbGF5IHR5cGUsIHByZWZlcnJpbmcgb2xkIHNob3cvaGlkZSBkYXRhIG92ZXIgdGhlIENTUyBjYXNjYWRlXG5cdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhU2hvdyAmJiBkYXRhU2hvdy5kaXNwbGF5O1xuXHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdH1cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSApIHtcblx0XHRcdFx0ZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBHZXQgbm9uZW1wdHkgdmFsdWUocykgYnkgdGVtcG9yYXJpbHkgZm9yY2luZyB2aXNpYmlsaXR5XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSB8fCByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFuaW1hdGUgaW5saW5lIGVsZW1lbnRzIGFzIGlubGluZS1ibG9ja1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJpbmxpbmVcIiB8fCBkaXNwbGF5ID09PSBcImlubGluZS1ibG9ja1wiICYmIHJlc3RvcmVEaXNwbGF5ICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblxuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlIGF0IHRoZSBlbmQgb2YgcHVyZSBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRcdFx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG5cdFx0XHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGRpc3BsYXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSW1wbGVtZW50IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdHByb3BUd2VlbiA9IGZhbHNlO1xuXHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cblx0XHQvLyBHZW5lcmFsIHNob3cvaGlkZSBzZXR1cCBmb3IgdGhpcyBlbGVtZW50IGFuaW1hdGlvblxuXHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7IGRpc3BsYXk6IHJlc3RvcmVEaXNwbGF5IH0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RvcmUgaGlkZGVuL3Zpc2libGUgZm9yIHRvZ2dsZSBzbyBgLnN0b3AoKS50b2dnbGUoKWAgXCJyZXZlcnNlc1wiXG5cdFx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW1cblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdFx0Ly8gVGhlIGZpbmFsIHN0ZXAgb2YgYSBcImhpZGVcIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50XG5cdFx0XHRcdGlmICggIWhpZGRlbiApIHtcblx0XHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBQZXItcHJvcGVydHkgc2V0dXBcblx0XHRwcm9wVHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblx0XHRpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHtcblx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0cHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdFx0cHJvcFR3ZWVuLnN0YXJ0ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBBbmltYXRpb24ucHJlZmlsdGVycy5sZW5ndGgsXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSApLFxuXHRcdHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdFx0cmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLFxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHlcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbW9yZSB0byBkbywgeWllbGRcblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIHdhcyBhbiBlbXB0eSBhbmltYXRpb24sIHN5bnRoZXNpemUgYSBmaW5hbCBwcm9ncmVzcyBub3RpZmljYXRpb25cblx0XHRcdGlmICggIWxlbmd0aCApIHtcblx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNvbHZlIHRoZSBhbmltYXRpb24gYW5kIHJlcG9ydCBpdHMgY29uY2x1c2lvblxuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRcdGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcgKTtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApO1xuXHRcdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0XHR9LFxuXHRcdFx0c3RvcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7XG5cdFx0XHRcdHZhciBpbmRleCA9IDAsXG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSApLFxuXHRcdHByb3BzID0gYW5pbWF0aW9uLnByb3BzO1xuXG5cdHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApO1xuXHRcdGlmICggcmVzdWx0ICkge1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCByZXN1bHQuc3RvcCApICkge1xuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPVxuXHRcdFx0XHRcdHJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cdH1cblxuXHRqUXVlcnkubWFwKCBwcm9wcywgY3JlYXRlVHdlZW4sIGFuaW1hdGlvbiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdC8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXG5cdGFuaW1hdGlvblxuXHRcdC5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxuXHRcdC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApXG5cdFx0LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKVxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSApXG5cdCk7XG5cblx0cmV0dXJuIGFuaW1hdGlvbjtcbn1cblxualF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwge1xuXG5cdHR3ZWVuZXJzOiB7XG5cdFx0XCIqXCI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdFx0dmFyIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2VlbiggcHJvcCwgdmFsdWUgKTtcblx0XHRcdGFkanVzdENTUyggdHdlZW4uZWxlbSwgcHJvcCwgcmNzc051bS5leGVjKCB2YWx1ZSApLCB0d2VlbiApO1xuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH0gXVxuXHR9LFxuXG5cdHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBwcm9wcyApICkge1xuXHRcdFx0Y2FsbGJhY2sgPSBwcm9wcztcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wcyA9IHByb3BzLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0cHJvcCA9IHByb3BzWyBpbmRleCBdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gPSBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZWZpbHRlcnM6IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXG5cdHByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkge1xuXHRcdGlmICggcHJlcGVuZCApIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcblx0dmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gXCJvYmplY3RcIiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDoge1xuXHRcdGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8XG5cdFx0XHRpc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLFxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcblx0XHRlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xuXHR9O1xuXG5cdC8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZlxuXHRpZiAoIGpRdWVyeS5meC5vZmYgKSB7XG5cdFx0b3B0LmR1cmF0aW9uID0gMDtcblxuXHR9IGVsc2Uge1xuXHRcdGlmICggdHlwZW9mIG9wdC5kdXJhdGlvbiAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdGlmICggb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgKSB7XG5cdFx0XHRcdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+IFwiZnhcIlxuXHRpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHtcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XG5cdH1cblxuXHQvLyBRdWV1ZWluZ1xuXHRvcHQub2xkID0gb3B0LmNvbXBsZXRlO1xuXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW5XaXRoaW5UcmVlICkuY3NzKCBcIm9wYWNpdHlcIiwgMCApLnNob3coKVxuXG5cdFx0XHQvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWRcblx0XHRcdC5lbmQoKS5hbmltYXRlKCB7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdFxuXHRcdFx0XHR2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7XG5cblx0XHRcdFx0Ly8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5XG5cdFx0XHRcdGlmICggZW1wdHkgfHwgZGF0YVByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkZXF1ZXVlID0gdHJ1ZSxcblx0XHRcdFx0aW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArIFwicXVldWVIb29rc1wiLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJlxuXHRcdFx0XHRcdCggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkge1xuXG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXHRmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdGlmICggdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICksXG5cdFx0XHRcdHF1ZXVlID0gZGF0YVsgdHlwZSArIFwicXVldWVcIiBdLFxuXHRcdFx0XHRob29rcyA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlSG9va3NcIiBdLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7XG5cblx0XHRcdC8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGFcblx0XHRcdGRhdGEuZmluaXNoID0gdHJ1ZTtcblxuXHRcdFx0Ly8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0XG5cdFx0XHRqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7XG5cblx0XHRcdGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHtcblx0XHRcdFx0aG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9ucywgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYW5pbWF0aW9ucyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7XG5cdFx0XHRcdFx0cXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZ1xuXHRcdFx0ZGVsZXRlIGRhdGEuZmluaXNoO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcInRvZ2dsZVwiLCBcInNob3dcIiwgXCJoaWRlXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09IFwiYm9vbGVhblwiID9cblx0XHRcdGNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6XG5cdFx0XHR0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKCB7XG5cdHNsaWRlRG93bjogZ2VuRngoIFwic2hvd1wiICksXG5cdHNsaWRlVXA6IGdlbkZ4KCBcImhpZGVcIiApLFxuXHRzbGlkZVRvZ2dsZTogZ2VuRngoIFwidG9nZ2xlXCIgKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS50aW1lcnMgPSBbXTtcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XG5cdHZhciB0aW1lcixcblx0XHRpID0gMCxcblx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzO1xuXG5cdGZ4Tm93ID0gRGF0ZS5ub3coKTtcblxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0dGltZXIgPSB0aW1lcnNbIGkgXTtcblxuXHRcdC8vIFJ1biB0aGUgdGltZXIgYW5kIHNhZmVseSByZW1vdmUgaXQgd2hlbiBkb25lIChhbGxvd2luZyBmb3IgZXh0ZXJuYWwgcmVtb3ZhbClcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRqUXVlcnkuZnguc3RhcnQoKTtcbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xualF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpblByb2dyZXNzID0gdHJ1ZTtcblx0c2NoZWR1bGUoKTtcbn07XG5cbmpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdGluUHJvZ3Jlc3MgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXG5qUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHtcblx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcblx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7XG5cdFx0dmFyIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggbmV4dCwgdGltZSApO1xuXHRcdGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXQgKTtcblx0XHR9O1xuXHR9ICk7XG59O1xuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2VsZWN0XCIgKSxcblx0XHRvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib3B0aW9uXCIgKSApO1xuXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5XG5cdC8vIERlZmF1bHQgdmFsdWUgZm9yIGEgY2hlY2tib3ggc2hvdWxkIGJlIFwib25cIlxuXHRzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gXCJcIjtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3Rcblx0c3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gQW4gaW5wdXQgbG9zZXMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQudHlwZSA9IFwicmFkaW9cIjtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSApKCk7XG5cblxudmFyIGJvb2xIb29rLFxuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEF0dHJpYnV0ZSBob29rcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbG93ZXJjYXNlIHZlcnNpb25cblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IHVuZGVmaW5lZCApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkXG5cdFx0cmV0dXJuIHJldCA9PSBudWxsID8gdW5kZWZpbmVkIDogcmV0O1xuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdG5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZWxlbS52YWx1ZTtcblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIHZhbHVlICk7XG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnZhbHVlID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdHZhciBuYW1lLFxuXHRcdFx0aSA9IDAsXG5cblx0XHRcdC8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnNcblx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuXHRcdFx0YXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKTtcblxuXHRcdGlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHR3aGlsZSAoICggbmFtZSA9IGF0dHJOYW1lc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xuYm9vbEhvb2sgPSB7XG5cdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZTtcblx0fVxufTtcblxualF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXFx3Ky9nICksIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHR2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7XG5cblx0YXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciByZXQsIGhhbmRsZSxcblx0XHRcdGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRpZiAoICFpc1hNTCApIHtcblxuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRsb3dlcmNhc2VOYW1lIDpcblx0XHRcdFx0bnVsbDtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn0gKTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF07XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbGVtWyBuYW1lIF07XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGVcblx0XHRcdFx0Ly8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XG5cdFx0XHRcdC8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0L1xuXHRcdFx0XHQvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2YWwoIzEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRpZiAoIHRhYmluZGV4ICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRyY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJlxuXHRcdFx0XHRcdGVsZW0uaHJlZlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuLy8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG4vLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkXG4vLyBvbiB0aGUgb3B0aW9uXG4vLyBUaGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZFxuLy8gd2hlbiBpbiBhbiBvcHRncm91cFxuLy8gZXNsaW50IHJ1bGUgXCJuby11bnVzZWQtZXhwcmVzc2lvbnNcIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlXG4vLyBzaW5jZSBpdCBjb25zaWRlcnMgc3VjaCBhY2Nlc3Npb25zIG5vb3BcbmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XG5cdGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG5cblxuXG5cdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byBIVE1MIHNwZWNcblx0Ly8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlXG5cdGZ1bmN0aW9uIHN0cmlwQW5kQ29sbGFwc2UoIHZhbHVlICkge1xuXHRcdHZhciB0b2tlbnMgPSB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHRcdHJldHVybiB0b2tlbnMuam9pbiggXCIgXCIgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHtcblx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc2VzLmxlbmd0aCApIHtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBjdXJWYWx1ZSApICsgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hdHRyKCBcImNsYXNzXCIsIFwiXCIgKTtcblx0XHR9XG5cblx0XHRjbGFzc2VzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGNsYXNzZXMubGVuZ3RoICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhenogKyBcIiBcIiwgXCIgXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkge1xuXHRcdHZhciB0eXBlID0gdHlwZW9mIHZhbHVlLFxuXHRcdFx0aXNWYWxpZFZhbHVlID0gdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIGlzVmFsaWRWYWx1ZSApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyhcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLFxuXHRcdFx0XHRcdHN0YXRlVmFsXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgY2xhc3NOYW1lLCBpLCBzZWxmLCBjbGFzc05hbWVzO1xuXG5cdFx0XHRpZiAoIGlzVmFsaWRWYWx1ZSApIHtcblxuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHRpID0gMDtcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXHRcdFx0XHRjbGFzc05hbWVzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRcdFx0d2hpbGUgKCAoIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIixcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0XHRcdFx0XCJcIiA6XG5cdFx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0aGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgY2xhc3NOYW1lLCBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCI7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBnZXRDbGFzcyggZWxlbSApICkgKyBcIiBcIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBycmV0dXJuID0gL1xcci9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmXG5cdFx0XHRcdFx0XCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSApICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRpZiAoIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldC5yZXBsYWNlKCBycmV0dXJuLCBcIlwiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0cmV0dXJuIHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhbHVlSXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbHVlSXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSBvbmx5XG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtYW5kLWNvbGxhcHNlLXdoaXRlc3BhY2Vcblx0XHRcdFx0XHRzdHJpcEFuZENvbGxhcHNlKCBqUXVlcnkudGV4dCggZWxlbSApICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLCBpLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIixcblx0XHRcdFx0XHR2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sXG5cdFx0XHRcdFx0bWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0aWYgKCBpbmRleCA8IDAgKSB7XG5cdFx0XHRcdFx0aSA9IG1heDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGkgPSBvbmUgPyBpbmRleCA6IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0Ly8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQhb3B0aW9uLmRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8XG5cdFx0XHRcdFx0XHRcdFx0IW5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cblxuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkID1cblx0XHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBqUXVlcnkudmFsSG9va3Mub3B0aW9uLmdldCggb3B0aW9uICksIHZhbHVlcyApID4gLTFcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvblNldCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRm9yY2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXRcblx0XHRcdFx0aWYgKCAhb3B0aW9uU2V0ICkge1xuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaCggWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7XG5cdFx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb25cblxuXG5zdXBwb3J0LmZvY3VzaW4gPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG52YXIgcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXG5cdHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24oIGUgKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0fTtcblxualF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmV2ZW50LCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7XG5cblx0XHR2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCggXCIuXCIgKSA6IFtdO1xuXG5cdFx0Y3VyID0gbGFzdEVsZW1lbnQgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKCBcIi5cIiApID4gLTEgKSB7XG5cblx0XHRcdC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKClcblx0XHRcdG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCBcIi5cIiApO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoIFwiOlwiICkgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKTtcblx0XHRldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApIDpcblx0XHRcdG51bGw7XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWRcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0XG5cdFx0ZGF0YSA9IGRhdGEgPT0gbnVsbCA/XG5cdFx0XHRbIGV2ZW50IF0gOlxuXHRcdFx0alF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7XG5cblx0XHQvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzXG5cdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNClcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xuXHRcdFx0aWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHtcblx0XHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0dG1wID0gY3VyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSlcblx0XHRcdGlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aFxuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBjdXIgPSBldmVudFBhdGhbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRsYXN0RWxlbWVudCA9IGN1cjtcblx0XHRcdGV2ZW50LnR5cGUgPSBpID4gMSA/XG5cdFx0XHRcdGJ1YmJsZVR5cGUgOlxuXHRcdFx0XHRzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7XG5cblx0XHRcdC8vIGpRdWVyeSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSAoIGRhdGFQcml2LmdldCggY3VyLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmXG5cdFx0XHRcdGRhdGFQcml2LmdldCggY3VyLCBcImhhbmRsZVwiICk7XG5cdFx0XHRpZiAoIGhhbmRsZSApIHtcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmF0aXZlIGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xuXHRcdFx0aWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICggIXNwZWNpYWwuX2RlZmF1bHQgfHxcblx0XHRcdFx0c3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiZcblx0XHRcdFx0YWNjZXB0RGF0YSggZWxlbSApICkge1xuXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXG5cdFx0XHRcdFx0aWYgKCBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmVcblx0Ly8gVXNlZCBvbmx5IGZvciBgZm9jdXMoaW4gfCBvdXQpYCBldmVudHNcblx0c2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHtcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCksXG5cdFx0XHRldmVudCxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0aXNTaW11bGF0ZWQ6IHRydWVcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0fVxuXG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSApO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxuLy8gU3VwcG9ydDogRmlyZWZveCA8PTQ0XG4vLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4N1xuLy9cbi8vIFN1cHBvcnQ6IENocm9tZSA8PTQ4IC0gNDksIFNhZmFyaSA8PTkuMCAtIDkuMVxuLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsXG4vLyB3aGljaCBpcyBzcGVjIHZpb2xhdGlvbiAtIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWZvY3VzZXZlbnQtZXZlbnQtb3JkZXJcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5pZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7XG5cdGpRdWVyeS5lYWNoKCB7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cblx0XHQvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dFxuXHRcdHZhciBoYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSApO1xuXHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSxcblx0XHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFjaGVzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9ICk7XG59XG52YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247XG5cbnZhciBub25jZSA9IERhdGUubm93KCk7XG5cbnZhciBycXVlcnkgPSAoIC9cXD8vICk7XG5cblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbDtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIElFIHRocm93cyBvbiBwYXJzZUZyb21TdHJpbmcgd2l0aCBpbnZhbGlkIGlucHV0LlxuXHR0cnkge1xuXHRcdHhtbCA9ICggbmV3IHdpbmRvdy5ET01QYXJzZXIoKSApLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgXCJ0ZXh0L3htbFwiICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHhtbCA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC5cblx0XHRcdFx0YnVpbGRQYXJhbXMoXG5cdFx0XHRcdFx0cHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT0gbnVsbCA/IGkgOiBcIlwiICkgKyBcIl1cIixcblx0XHRcdFx0XHR2LFxuXHRcdFx0XHRcdHRyYWRpdGlvbmFsLFxuXHRcdFx0XHRcdGFkZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS5cblx0XHRhZGQoIHByZWZpeCwgb2JqICk7XG5cdH1cbn1cblxuLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2Zcbi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xualF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkge1xuXHR2YXIgcHJlZml4LFxuXHRcdHMgPSBbXSxcblx0XHRhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgdXNlIGl0cyByZXR1cm4gdmFsdWVcblx0XHRcdHZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID9cblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uKCkgOlxuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb247XG5cblx0XHRcdHNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgXCI9XCIgK1xuXHRcdFx0XHRlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcblx0XHR9O1xuXG5cdC8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuXG5cdGlmICggQXJyYXkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50c1xuXHRcdGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHtcblx0XHRcdGFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7XG5cdFx0fSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSBcIm9sZFwiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlclxuXHRcdC8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LlxuXHRcdGZvciAoIHByZWZpeCBpbiBhICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uXG5cdHJldHVybiBzLmpvaW4oIFwiJlwiICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7XG5cdH0sXG5cdHNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDYW4gYWRkIHByb3BIb29rIGZvciBcImVsZW1lbnRzXCIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzXG5cdFx0XHR2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgXCJlbGVtZW50c1wiICk7XG5cdFx0XHRyZXR1cm4gZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpcztcblx0XHR9IClcblx0XHQuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0XHQvLyBVc2UgLmlzKCBcIjpkaXNhYmxlZFwiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3Ncblx0XHRcdHJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCBcIjpkaXNhYmxlZFwiICkgJiZcblx0XHRcdFx0cnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJlxuXHRcdFx0XHQoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7XG5cdFx0fSApXG5cdFx0Lm1hcCggZnVuY3Rpb24oIGksIGVsZW0gKSB7XG5cdFx0XHR2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7XG5cblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9ICkuZ2V0KCk7XG5cdH1cbn0gKTtcblxuXG52YXJcblx0cjIwID0gLyUyMC9nLFxuXHRyaGFzaCA9IC8jLiokLyxcblx0cmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cdG9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblxuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbIDAgXSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhVHlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyAjOTg4N1xuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XG5cdHZhciBrZXksIGRlZXAsXG5cdFx0ZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9O1xuXG5cdGZvciAoIGtleSBpbiBzcmMgKSB7XG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHQoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdO1xuXHRcdH1cblx0fVxuXHRpZiAoIGRlZXAgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6XG4gKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKVxuICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7XG5cblx0dmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFUeXBlLFxuXHRcdGNvbnRlbnRzID0gcy5jb250ZW50cyxcblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcztcblxuXHQvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2Vzc1xuXHR3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSBcIipcIiApIHtcblx0XHRkYXRhVHlwZXMuc2hpZnQoKTtcblx0XHRpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGVcblx0aWYgKCBjdCApIHtcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xuXHRcdFx0aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHtcblx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xuXHRcdGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTtcblx0fSBlbHNlIHtcblxuXHRcdC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXNcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcblx0XHRcdGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArIFwiIFwiICsgZGF0YVR5cGVzWyAwIF0gXSApIHtcblx0XHRcdFx0ZmluYWxEYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhZmlyc3REYXRhVHlwZSApIHtcblx0XHRcdFx0Zmlyc3REYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTtcblx0fVxuXG5cdC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGVcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcblx0Ly8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuXHRpZiAoIGZpbmFsRGF0YVR5cGUgKSB7XG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcblx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7XG5cdFx0fVxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcblx0fVxufVxuXG4vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkge1xuXHR2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldixcblx0XHRjb252ZXJ0ZXJzID0ge30sXG5cblx0XHQvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTtcblxuXHQvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXNcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcblx0XHRmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHtcblx0XHRcdGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07XG5cdFx0fVxuXHR9XG5cblx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlXG5cdHdoaWxlICggY3VycmVudCApIHtcblxuXHRcdGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkge1xuXHRcdFx0anFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcblx0XHRpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7XG5cdFx0XHRyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTtcblx0XHR9XG5cblx0XHRwcmV2ID0gY3VycmVudDtcblx0XHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0XHRpZiAoIGN1cnJlbnQgKSB7XG5cblx0XHRcdC8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG9cblx0XHRcdGlmICggY3VycmVudCA9PT0gXCIqXCIgKSB7XG5cblx0XHRcdFx0Y3VycmVudCA9IHByZXY7XG5cblx0XHRcdC8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnRcblx0XHRcdH0gZWxzZSBpZiAoIHByZXYgIT09IFwiKlwiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXJcblx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyBcIiogXCIgKyBjdXJyZW50IF07XG5cblx0XHRcdFx0Ly8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXJcblx0XHRcdFx0aWYgKCAhY29udiApIHtcblx0XHRcdFx0XHRmb3IgKCBjb252MiBpbiBjb252ZXJ0ZXJzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnRcblx0XHRcdFx0XHRcdHRtcCA9IGNvbnYyLnNwbGl0KCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0aWYgKCB0bXBbIDEgXSA9PT0gY3VycmVudCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXRcblx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIHRtcFsgMCBdIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJzWyBcIiogXCIgKyB0bXBbIDAgXSBdO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjb252ID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgaW50ZXJtZWRpYXRlIGRhdGFUeXBlXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnQgPSB0bXBbIDAgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKVxuXHRcdFx0XHRpZiAoIGNvbnYgIT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHQvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtXG5cdFx0XHRcdFx0aWYgKCBjb252ICYmIHMudGhyb3dzICkge1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZTogXCJwYXJzZXJlcnJvclwiLFxuXHRcdFx0XHRcdFx0XHRcdGVycm9yOiBjb252ID8gZSA6IFwiTm8gY29udmVyc2lvbiBmcm9tIFwiICsgcHJldiArIFwiIHRvIFwiICsgY3VycmVudFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IHN0YXRlOiBcInN1Y2Nlc3NcIiwgZGF0YTogcmVzcG9uc2UgfTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIENvdW50ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgcXVlcmllc1xuXHRhY3RpdmU6IDAsXG5cblx0Ly8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdFxuXHRsYXN0TW9kaWZpZWQ6IHt9LFxuXHRldGFnOiB7fSxcblxuXHRhamF4U2V0dGluZ3M6IHtcblx0XHR1cmw6IGxvY2F0aW9uLmhyZWYsXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLFxuXHRcdGdsb2JhbDogdHJ1ZSxcblx0XHRwcm9jZXNzRGF0YTogdHJ1ZSxcblx0XHRhc3luYzogdHJ1ZSxcblx0XHRjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixcblxuXHRcdC8qXG5cdFx0dGltZW91dDogMCxcblx0XHRkYXRhOiBudWxsLFxuXHRcdGRhdGFUeXBlOiBudWxsLFxuXHRcdHVzZXJuYW1lOiBudWxsLFxuXHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdGNhY2hlOiBudWxsLFxuXHRcdHRocm93czogZmFsc2UsXG5cdFx0dHJhZGl0aW9uYWw6IGZhbHNlLFxuXHRcdGhlYWRlcnM6IHt9LFxuXHRcdCovXG5cblx0XHRhY2NlcHRzOiB7XG5cdFx0XHRcIipcIjogYWxsVHlwZXMsXG5cdFx0XHR0ZXh0OiBcInRleHQvcGxhaW5cIixcblx0XHRcdGh0bWw6IFwidGV4dC9odG1sXCIsXG5cdFx0XHR4bWw6IFwiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbFwiLFxuXHRcdFx0anNvbjogXCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHRcIlxuXHRcdH0sXG5cblx0XHRjb250ZW50czoge1xuXHRcdFx0eG1sOiAvXFxieG1sXFxiLyxcblx0XHRcdGh0bWw6IC9cXGJodG1sLyxcblx0XHRcdGpzb246IC9cXGJqc29uXFxiL1xuXHRcdH0sXG5cblx0XHRyZXNwb25zZUZpZWxkczoge1xuXHRcdFx0eG1sOiBcInJlc3BvbnNlWE1MXCIsXG5cdFx0XHR0ZXh0OiBcInJlc3BvbnNlVGV4dFwiLFxuXHRcdFx0anNvbjogXCJyZXNwb25zZUpTT05cIlxuXHRcdH0sXG5cblx0XHQvLyBEYXRhIGNvbnZlcnRlcnNcblx0XHQvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgXCIqXCIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG5cdFx0Y29udmVydGVyczoge1xuXG5cdFx0XHQvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHRcblx0XHRcdFwiKiB0ZXh0XCI6IFN0cmluZyxcblxuXHRcdFx0Ly8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pXG5cdFx0XHRcInRleHQgaHRtbFwiOiB0cnVlLFxuXG5cdFx0XHQvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uXG5cdFx0XHRcInRleHQganNvblwiOiBKU09OLnBhcnNlLFxuXG5cdFx0XHQvLyBQYXJzZSB0ZXh0IGFzIHhtbFxuXHRcdFx0XCJ0ZXh0IHhtbFwiOiBqUXVlcnkucGFyc2VYTUxcblx0XHR9LFxuXG5cdFx0Ly8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDpcblx0XHQvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmXG5cdFx0Ly8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmVcblx0XHQvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZClcblx0XHRmbGF0T3B0aW9uczoge1xuXHRcdFx0dXJsOiB0cnVlLFxuXHRcdFx0Y29udGV4dDogdHJ1ZVxuXHRcdH1cblx0fSxcblxuXHQvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldFxuXHQvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0aW5ncyBmaWVsZHMuXG5cdC8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuXG5cdGFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzID9cblxuXHRcdFx0Ly8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3Rcblx0XHRcdGFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDpcblxuXHRcdFx0Ly8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5nc1xuXHRcdFx0YWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7XG5cdH0sXG5cblx0YWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksXG5cdGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLFxuXG5cdC8vIE1haW4gbWV0aG9kXG5cdGFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBJZiB1cmwgaXMgYW4gb2JqZWN0LCBzaW11bGF0ZSBwcmUtMS41IHNpZ25hdHVyZVxuXHRcdGlmICggdHlwZW9mIHVybCA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB1cmw7XG5cdFx0XHR1cmwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3Rcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdHZhciB0cmFuc3BvcnQsXG5cblx0XHRcdC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW1cblx0XHRcdGNhY2hlVVJMLFxuXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcsXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXG5cblx0XHRcdC8vIHRpbWVvdXQgaGFuZGxlXG5cdFx0XHR0aW1lb3V0VGltZXIsXG5cblx0XHRcdC8vIFVybCBjbGVhbnVwIHZhclxuXHRcdFx0dXJsQW5jaG9yLFxuXG5cdFx0XHQvLyBSZXF1ZXN0IHN0YXRlIChiZWNvbWVzIGZhbHNlIHVwb24gc2VuZCBhbmQgdHJ1ZSB1cG9uIGNvbXBsZXRpb24pXG5cdFx0XHRjb21wbGV0ZWQsXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZFxuXHRcdFx0ZmlyZUdsb2JhbHMsXG5cblx0XHRcdC8vIExvb3AgdmFyaWFibGVcblx0XHRcdGksXG5cblx0XHRcdC8vIHVuY2FjaGVkIHBhcnQgb2YgdGhlIHVybFxuXHRcdFx0dW5jYWNoZWQsXG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3Rcblx0XHRcdHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLFxuXG5cdFx0XHQvLyBDYWxsYmFja3MgY29udGV4dFxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXG5cblx0XHRcdC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0IGlmIGl0IGlzIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb25cblx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dCA9IHMuY29udGV4dCAmJlxuXHRcdFx0XHQoIGNhbGxiYWNrQ29udGV4dC5ub2RlVHlwZSB8fCBjYWxsYmFja0NvbnRleHQuanF1ZXJ5ICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOlxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZVxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXG5cblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gPVxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApO1xuXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSlcblx0XHQvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGVcblx0XHRzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgXCJcIiApXG5cdFx0XHQucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiApO1xuXG5cdFx0Ly8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0XG5cdFx0cy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTtcblxuXHRcdC8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3Rcblx0XHRzLmRhdGFUeXBlcyA9ICggcy5kYXRhVHlwZSB8fCBcIipcIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblxuXHRcdC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLlxuXHRcdGlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkge1xuXHRcdFx0dXJsQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJhXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEsIEVkZ2UgMTIgLSAxNVxuXHRcdFx0Ly8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCxcblx0XHRcdC8vIGUuZy4gaHR0cDovL2V4YW1wbGUuY29tOjgweC9cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gcy51cmw7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEgb25seVxuXHRcdFx0XHQvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZVxuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHVybEFuY2hvci5ocmVmO1xuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gb3JpZ2luQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09XG5cdFx0XHRcdFx0dXJsQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgdXJsQW5jaG9yLmhvc3Q7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbixcblx0XHRcdFx0Ly8gaXQgY2FuIGJlIHJlamVjdGVkIGJ5IHRoZSB0cmFuc3BvcnQgaWYgaXQgaXMgaW52YWxpZFxuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcblx0XHRpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHByZWZpbHRlcnNcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlXG5cdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG9cblx0XHQvLyBEb24ndCBmaXJlIGV2ZW50cyBpZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAoIzE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0YXJ0XCIgKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHQvLyBSZW1vdmUgaGFzaCB0byBzaW1wbGlmeSB1cmwgbWFuaXB1bGF0aW9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybC5yZXBsYWNlKCByaGFzaCwgXCJcIiApO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBoYXNoIHNvIHdlIGNhbiBwdXQgaXQgYmFja1xuXHRcdFx0dW5jYWNoZWQgPSBzLnVybC5zbGljZSggY2FjaGVVUkwubGVuZ3RoICk7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICYmICggcy5wcm9jZXNzRGF0YSB8fCB0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICkgKSB7XG5cdFx0XHRcdGNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XG5cblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxuXHRcdFx0XHRkZWxldGUgcy5kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkXG5cdFx0XHRpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRjYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsIFwiJDFcIiApO1xuXHRcdFx0XHR1bmNhY2hlZCA9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyAoIG5vbmNlKysgKSArIHVuY2FjaGVkO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQdXQgaGFzaCBhbmQgYW50aS1jYWNoZSBvbiB0aGUgVVJMIHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgKGdoLTE3MzIpXG5cdFx0XHRzLnVybCA9IGNhY2hlVVJMICsgdW5jYWNoZWQ7XG5cblx0XHQvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OClcblx0XHR9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJlxuXHRcdFx0KCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKS5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgKSB7XG5cdFx0XHRzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCBcIitcIiApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/XG5cdFx0XHRcdHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdICtcblx0XHRcdFx0XHQoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJlxuXHRcdFx0KCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGNvbXBsZXRlRGVmZXJyZWQuYWRkKCBzLmNvbXBsZXRlICk7XG5cdFx0anFYSFIuZG9uZSggcy5zdWNjZXNzICk7XG5cdFx0anFYSFIuZmFpbCggcy5lcnJvciApO1xuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYWpheFNlbmQsIHN0b3AgdGhlcmVcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0anFYSFIuYWJvcnQoIFwidGltZW91dFwiICk7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb21wbGV0ZWQgPSBmYWxzZTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBSZXRocm93IHBvc3QtY29tcGxldGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHNcblx0XHRcdFx0ZG9uZSggLTEsIGUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmVcblx0XHRmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHtcblx0XHRcdHZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsXG5cdFx0XHRcdHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0O1xuXG5cdFx0XHQvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zXG5cdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb21wbGV0ZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxuXHRcdFx0Ly8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZClcblx0XHRcdHRyYW5zcG9ydCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0Ly8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTZXQgcmVhZHlTdGF0ZVxuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWxcblx0XHRcdGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0O1xuXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxuXHRcdFx0aWYgKCByZXNwb25zZXMgKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25zZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpXG5cdFx0XHRyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApO1xuXG5cdFx0XHQvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZ1xuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRcdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJMYXN0LU1vZGlmaWVkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcImV0YWdcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBFeHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dCBhbmQgbm9ybWFsaXplIGZvciBub24tYWJvcnRzXG5cdFx0XHRcdGVycm9yID0gc3RhdHVzVGV4dDtcblx0XHRcdFx0aWYgKCBzdGF0dXMgfHwgIXN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiZXJyb3JcIjtcblx0XHRcdFx0XHRpZiAoIHN0YXR1cyA8IDAgKSB7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdFxuXHRcdFx0anFYSFIuc3RhdHVzID0gc3RhdHVzO1xuXHRcdFx0anFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyBcIlwiO1xuXG5cdFx0XHQvLyBTdWNjZXNzL0Vycm9yXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTtcblx0XHRcdHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyBcImFqYXhTdWNjZXNzXCIgOiBcImFqYXhFcnJvclwiLFxuXHRcdFx0XHRcdFsganFYSFIsIHMsIGlzU3VjY2VzcyA/IHN1Y2Nlc3MgOiBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbXBsZXRlXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4Q29tcGxldGVcIiwgWyBqcVhIUiwgcyBdICk7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXG5cdFx0XHRcdGlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0b3BcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpxWEhSO1xuXHR9LFxuXG5cdGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCBcImpzb25cIiApO1xuXHR9LFxuXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgXCJzY3JpcHRcIiApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblxuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBkYXRhICkgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBjYWxsYmFjaztcblx0XHRcdGNhbGxiYWNrID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHVybCBjYW4gYmUgYW4gb3B0aW9ucyBvYmplY3QgKHdoaWNoIHRoZW4gbXVzdCBoYXZlIC51cmwpXG5cdFx0cmV0dXJuIGpRdWVyeS5hamF4KCBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSwgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHVybCApICYmIHVybCApICk7XG5cdH07XG59ICk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCApIHtcblx0cmV0dXJuIGpRdWVyeS5hamF4KCB7XG5cdFx0dXJsOiB1cmwsXG5cblx0XHQvLyBNYWtlIHRoaXMgZXhwbGljaXQsIHNpbmNlIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgdGhyb3VnaCBhamF4U2V0dXAgKCMxMTI2NClcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGNhY2hlOiB0cnVlLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXHRcdFwidGhyb3dzXCI6IHRydWVcblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdFx0aHRtbCA9IGh0bWwuY2FsbCggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gdGhpcztcblxuXHRcdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZWxlbTtcblx0XHRcdH0gKS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWxJc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHRoaXMucGFyZW50KCBzZWxlY3RvciApLm5vdCggXCJib2R5XCIgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTtcblx0XHR9ICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApO1xufTtcbmpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gISEoIGVsZW0ub2Zmc2V0V2lkdGggfHwgZWxlbS5vZmZzZXRIZWlnaHQgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApO1xufTtcblxuXG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59O1xuXG52YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHtcblxuXHRcdC8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHQvLyAjMTQ1MDogc29tZXRpbWVzIElFIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDRcblx0XHQxMjIzOiAyMDRcblx0fSxcblx0eGhyU3VwcG9ydGVkID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIoKTtcblxuc3VwcG9ydC5jb3JzID0gISF4aHJTdXBwb3J0ZWQgJiYgKCBcIndpdGhDcmVkZW50aWFsc1wiIGluIHhoclN1cHBvcnRlZCApO1xuc3VwcG9ydC5hamF4ID0geGhyU3VwcG9ydGVkID0gISF4aHJTdXBwb3J0ZWQ7XG5cbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0dmFyIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrO1xuXG5cdC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Rcblx0aWYgKCBzdXBwb3J0LmNvcnMgfHwgeGhyU3VwcG9ydGVkICYmICFvcHRpb25zLmNyb3NzRG9tYWluICkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHZhciBpLFxuXHRcdFx0XHRcdHhociA9IG9wdGlvbnMueGhyKCk7XG5cblx0XHRcdFx0eGhyLm9wZW4oXG5cdFx0XHRcdFx0b3B0aW9ucy50eXBlLFxuXHRcdFx0XHRcdG9wdGlvbnMudXJsLFxuXHRcdFx0XHRcdG9wdGlvbnMuYXN5bmMsXG5cdFx0XHRcdFx0b3B0aW9ucy51c2VybmFtZSxcblx0XHRcdFx0XHRvcHRpb25zLnBhc3N3b3JkXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdGZvciAoIGkgaW4gb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0XHR4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGUgbWltZSB0eXBlIGlmIG5lZWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7XG5cdFx0XHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoIG9wdGlvbnMubWltZVR5cGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyXG5cdFx0XHRcdC8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmVcblx0XHRcdFx0Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS5cblx0XHRcdFx0Ly8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApXG5cdFx0XHRcdC8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLlxuXHRcdFx0XHRpZiAoICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdICkge1xuXHRcdFx0XHRcdGhlYWRlcnNbIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiIF0gPSBcIlhNTEh0dHBSZXF1ZXN0XCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTZXQgaGVhZGVyc1xuXHRcdFx0XHRmb3IgKCBpIGluIGhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoIGksIGhlYWRlcnNbIGkgXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID1cblx0XHRcdFx0XHRcdFx0XHR4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9XG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiYWJvcnRcIiApIHtcblx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gXCJlcnJvclwiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBPbiBhIG1hbnVhbCBuYXRpdmUgYWJvcnQsIElFOSB0aHJvd3Ncblx0XHRcdFx0XHRcdFx0XHQvLyBlcnJvcnMgb24gYW55IHByb3BlcnR5IGFjY2VzcyB0aGF0IGlzIG5vdCByZWFkeVN0YXRlXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlb2YgeGhyLnN0YXR1cyAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCAwLCBcImVycm9yXCIgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0geGhyLm9udGltZW91dCA9IGNhbGxiYWNrKCBcImVycm9yXCIgKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0Ly8gVXNlIG9ucmVhZHlzdGF0ZWNoYW5nZSB0byByZXBsYWNlIG9uYWJvcnRcblx0XHRcdFx0Ly8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0c1xuXHRcdFx0XHRpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0eGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBpdCBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFsbG93IG9uZXJyb3IgdG8gYmUgY2FsbGVkIGZpcnN0LFxuXHRcdFx0XHRcdFx0XHQvLyBidXQgdGhhdCB3aWxsIG5vdCBoYW5kbGUgYSBuYXRpdmUgYWJvcnRcblx0XHRcdFx0XHRcdFx0Ly8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0Ly8gYXMgeGhyLm9uZXJyb3IgY2Fubm90IGJlIGFjY2Vzc2VkXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2soIFwiYWJvcnRcIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pXG5cdFx0XHRcdFx0eGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdC8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUHJldmVudCBhdXRvLWV4ZWN1dGlvbiBvZiBzY3JpcHRzIHdoZW4gbm8gZXhwbGljaXQgZGF0YVR5cGUgd2FzIHByb3ZpZGVkIChTZWUgZ2gtMjQzMilcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMuY29udGVudHMuc2NyaXB0ID0gZmFsc2U7XG5cdH1cbn0gKTtcblxuLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGVcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0YWNjZXB0czoge1xuXHRcdHNjcmlwdDogXCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIFwiICtcblx0XHRcdFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCJcblx0fSxcblx0Y29udGVudHM6IHtcblx0XHRzY3JpcHQ6IC9cXGIoPzpqYXZhfGVjbWEpc2NyaXB0XFxiL1xuXHR9LFxuXHRjb252ZXJ0ZXJzOiB7XG5cdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7XG5cdFx0XHRyZXR1cm4gdGV4dDtcblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRzLmNhY2hlID0gZmFsc2U7XG5cdH1cblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMudHlwZSA9IFwiR0VUXCI7XG5cdH1cbn0gKTtcblxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XG5qUXVlcnkuYWpheFRyYW5zcG9ydCggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cblx0Ly8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0c1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0dmFyIHNjcmlwdCwgY2FsbGJhY2s7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBfLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0c2NyaXB0ID0galF1ZXJ5KCBcIjxzY3JpcHQ+XCIgKS5wcm9wKCB7XG5cdFx0XHRcdFx0Y2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LFxuXHRcdFx0XHRcdHNyYzogcy51cmxcblx0XHRcdFx0fSApLm9uKFxuXHRcdFx0XHRcdFwibG9hZCBlcnJvclwiLFxuXHRcdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZSsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0gKTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApXG5cdFx0XHRcdFx0LmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCAmJlxuXHRcdFx0XHRyanNvbnAudGVzdCggcy5kYXRhICkgJiYgXCJkYXRhXCJcblx0XHQpO1xuXG5cdC8vIEhhbmRsZSBpZmYgdGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyBcImpzb25wXCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXRcblx0aWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSBcImpzb25wXCIgKSB7XG5cblx0XHQvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0XG5cdFx0Y2FsbGJhY2tOYW1lID0gcy5qc29ucENhbGxiYWNrID0gaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzWyBcInNjcmlwdCBqc29uXCIgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIEZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXRcblx0XHRcdGlmICggb3ZlcndyaXR0ZW4gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0alF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTtcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBvdmVyd3JpdHRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2F2ZSBiYWNrIGFzIGZyZWVcblx0XHRcdGlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBTYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSApO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gU3VwcG9ydDogU2FmYXJpIDggb25seVxuLy8gSW4gU2FmYXJpIDggZG9jdW1lbnRzIGNyZWF0ZWQgdmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudFxuLy8gY29sbGFwc2Ugc2libGluZyBmb3JtczogdGhlIHNlY29uZCBvbmUgYmVjb21lcyBhIGNoaWxkIG9mIHRoZSBmaXJzdCBvbmUuXG4vLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguXG4vLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MzM3XG5zdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCA9ICggZnVuY3Rpb24oKSB7XG5cdHZhciBib2R5ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICkuYm9keTtcblx0Ym9keS5pbm5lckhUTUwgPSBcIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+XCI7XG5cdHJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyO1xufSApKCk7XG5cblxuLy8gQXJndW1lbnQgXCJkYXRhXCIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sXG4vLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNpZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRleHQsXG4vLyBkZWZhdWx0cyB0byBkb2N1bWVudFxuLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xualF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHtcblx0aWYgKCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0a2VlcFNjcmlwdHMgPSBjb250ZXh0O1xuXHRcdGNvbnRleHQgPSBmYWxzZTtcblx0fVxuXG5cdHZhciBiYXNlLCBwYXJzZWQsIHNjcmlwdHM7XG5cblx0aWYgKCAhY29udGV4dCApIHtcblxuXHRcdC8vIFN0b3Agc2NyaXB0cyBvciBpbmxpbmUgZXZlbnQgaGFuZGxlcnMgZnJvbSBiZWluZyBleGVjdXRlZCBpbW1lZGlhdGVseVxuXHRcdC8vIGJ5IHVzaW5nIGRvY3VtZW50LmltcGxlbWVudGF0aW9uXG5cdFx0aWYgKCBzdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCApIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKTtcblxuXHRcdFx0Ly8gU2V0IHRoZSBiYXNlIGhyZWYgZm9yIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyBzbyBhbnkgcGFyc2VkIGVsZW1lbnRzIHdpdGggVVJMc1xuXHRcdFx0Ly8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSlcblx0XHRcdGJhc2UgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiYmFzZVwiICk7XG5cdFx0XHRiYXNlLmhyZWYgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0Y29udGV4dC5oZWFkLmFwcGVuZENoaWxkKCBiYXNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudDtcblx0XHR9XG5cdH1cblxuXHRwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKTtcblx0c2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTtcblxuXHQvLyBTaW5nbGUgdGFnXG5cdGlmICggcGFyc2VkICkge1xuXHRcdHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0gYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLyoqXG4gKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlXG4gKi9cbmpRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHtcblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZiggXCIgXCIgKTtcblxuXHRpZiAoIG9mZiA+IC0xICkge1xuXHRcdHNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApO1xuXHRcdHVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIGEgZnVuY3Rpb25cblx0aWYgKCBpc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoIHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBJZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkLlxuXHRcdFx0Ly8gTWFrZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGV4cGxpY2l0IHNpbmNlXG5cdFx0XHQvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2Rcblx0XHRcdHR5cGU6IHR5cGUgfHwgXCJHRVRcIixcblx0XHRcdGRhdGFUeXBlOiBcImh0bWxcIixcblx0XHRcdGRhdGE6IHBhcmFtc1xuXHRcdH0gKS5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeSggXCI8ZGl2PlwiICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0Ly8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImRhdGFcIiwgXCJzdGF0dXNcIiwgXCJqcVhIUlwiXG5cdFx0Ly8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLlxuXHRcdC8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJqcVhIUlwiLCBcInN0YXR1c1wiLCBcImVycm9yXCJcblx0XHR9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG4vLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50c1xualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSApO1xuXG5cblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiBqUXVlcnkuZ3JlcCggalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9ICkubGVuZ3RoO1xufTtcblxuXG5cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHQoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCBcImF1dG9cIiApID4gLTE7XG5cblx0XHQvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlclxuXHRcdC8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZFxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XG5cdFx0XHRjdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTtcblx0XHRcdGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDtcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdC8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KVxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgalF1ZXJ5LmV4dGVuZCgge30sIGN1ck9mZnNldCApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0Ly8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRcdGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7XG5cdFx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHR2YXIgcmVjdCwgd2luLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYVxuXHRcdC8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvclxuXHRcdGlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblx0XHR9XG5cblx0XHQvLyBHZXQgZG9jdW1lbnQtcmVsYXRpdmUgcG9zaXRpb24gYnkgYWRkaW5nIHZpZXdwb3J0IHNjcm9sbCB0byB2aWV3cG9ydC1yZWxhdGl2ZSBnQkNSXG5cdFx0cmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0d2luID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LFxuXHRcdFx0bGVmdDogcmVjdC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0XG5cdFx0fTtcblx0fSxcblxuXHQvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveFxuXHQvLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBiZWhhdmlvciBvZiBDU1MgYWJzb2x1dGUgcG9zaXRpb25pbmdcblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYyxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuXG5cdFx0Ly8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cblx0XHRcdC8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3Rcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblxuXHRcdFx0Ly8gQWNjb3VudCBmb3IgdGhlICpyZWFsKiBvZmZzZXQgcGFyZW50LCB3aGljaCBjYW4gYmUgdGhlIGRvY3VtZW50IG9yIGl0cyByb290IGVsZW1lbnRcblx0XHRcdC8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkXG5cdFx0XHRkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHRvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0d2hpbGUgKCBvZmZzZXRQYXJlbnQgJiZcblx0XHRcdFx0KCBvZmZzZXRQYXJlbnQgPT09IGRvYy5ib2R5IHx8IG9mZnNldFBhcmVudCA9PT0gZG9jLmRvY3VtZW50RWxlbWVudCApICYmXG5cdFx0XHRcdGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQgIT09IGVsZW0gJiYgb2Zmc2V0UGFyZW50Lm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIEluY29ycG9yYXRlIGJvcmRlcnMgaW50byBpdHMgb2Zmc2V0LCBzaW5jZSB0aGV5IGFyZSBvdXRzaWRlIGl0cyBjb250ZW50IG9yaWdpblxuXHRcdFx0XHRwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpO1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQudG9wICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJUb3BXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHQvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcblx0Ly8gMSkgRm9yIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgaWZyYW1lIHdpdGhvdXQgb2Zmc2V0UGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuXHQvLyAgICBkb2N1bWVudEVsZW1lbnQgb2YgdGhlIHBhcmVudCB3aW5kb3dcblx0Ly8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudFxuXHQvLyAzKSBGb3IgYm9keSBvciBodG1sIGVsZW1lbnQsIGkuZS4gaW4gY2FzZSBvZiB0aGUgaHRtbCBub2RlIC0gaXQgd2lsbCByZXR1cm4gaXRzZWxmXG5cdC8vXG5cdC8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlc1xuXHQvLyBhbmQgbWlnaHQgYmUgY29uc2lkZXJlZCBhcyBtb3JlIHByZWZlcmFibGUgcmVzdWx0cy5cblx0Ly9cblx0Ly8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmVcblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50O1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50RWxlbWVudDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXG5cdFx0XHQvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3Ncblx0XHRcdHZhciB3aW47XG5cdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW07XG5cdFx0XHR9IGVsc2UgaWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR3aW4gPSBlbGVtLmRlZmF1bHRWaWV3O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogd2luLnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IHdpbi5wYWdlWU9mZnNldFxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9O1xufSApO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmkgPD03IC0gOS4xLCBDaHJvbWUgPD0zNyAtIDQ5XG4vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvblxuLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0XG4vLyBCbGluayBidWc6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU4OTM0N1xuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sXG5cdFx0ZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cblx0XHQvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGhcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcblx0XHRcdHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09IFwiYm9vbGVhblwiICksXG5cdFx0XHRcdGV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gXCJtYXJnaW5cIiA6IFwiYm9yZGVyXCIgKTtcblxuXHRcdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZG9jO1xuXG5cdFx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vICQoIHdpbmRvdyApLm91dGVyV2lkdGgvSGVpZ2h0IHJldHVybiB3L2ggaW5jbHVkaW5nIHNjcm9sbGJhcnMgKGdoLTE3MjkpXG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmNOYW1lLmluZGV4T2YoIFwib3V0ZXJcIiApID09PSAwID9cblx0XHRcdFx0XHRcdGVsZW1bIFwiaW5uZXJcIiArIG5hbWUgXSA6XG5cdFx0XHRcdFx0XHRlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJzY3JvbGxcIiArIG5hbWUgXSwgZG9jWyBcInNjcm9sbFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcIm9mZnNldFwiICsgbmFtZSBdLCBkb2NbIFwib2Zmc2V0XCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOlxuXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7XG5cdFx0XHR9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApO1xuXHRcdH07XG5cdH0gKTtcbn0gKTtcblxuXG5qUXVlcnkuZWFjaCggKCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXG5cdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHtcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5cblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0YmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApO1xuXHR9LFxuXG5cdGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHtcblxuXHRcdC8vICggbmFtZXNwYWNlICkgb3IgKCBzZWxlY3RvciwgdHlwZXMgWywgZm5dIClcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/XG5cdFx0XHR0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDpcblx0XHRcdHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgXCIqKlwiLCBmbiApO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuLy8gYXJndW1lbnRzLlxuLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKVxuLy8gSG93ZXZlciwgaXQgaXMgbm90IHNsYXRlZCBmb3IgcmVtb3ZhbCBhbnkgdGltZSBzb29uXG5qUXVlcnkucHJveHkgPSBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRjb250ZXh0ID0gZm47XG5cdFx0Zm4gPSB0bXA7XG5cdH1cblxuXHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBTaW11bGF0ZWQgYmluZFxuXHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdH07XG5cblx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdHJldHVybiBwcm94eTtcbn07XG5cbmpRdWVyeS5ob2xkUmVhZHkgPSBmdW5jdGlvbiggaG9sZCApIHtcblx0aWYgKCBob2xkICkge1xuXHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0fSBlbHNlIHtcblx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcblx0fVxufTtcbmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbmpRdWVyeS5wYXJzZUpTT04gPSBKU09OLnBhcnNlO1xualF1ZXJ5Lm5vZGVOYW1lID0gbm9kZU5hbWU7XG5qUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5qUXVlcnkuaXNXaW5kb3cgPSBpc1dpbmRvdztcbmpRdWVyeS5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG5qUXVlcnkudHlwZSA9IHRvVHlwZTtcblxualF1ZXJ5Lm5vdyA9IERhdGUubm93O1xuXG5qUXVlcnkuaXNOdW1lcmljID0gZnVuY3Rpb24oIG9iaiApIHtcblxuXHQvLyBBcyBvZiBqUXVlcnkgMy4wLCBpc051bWVyaWMgaXMgbGltaXRlZCB0b1xuXHQvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpXG5cdC8vIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gZmluaXRlIG51bWJlcnMgKGdoLTI2NjIpXG5cdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXHRyZXR1cm4gKCB0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgKSAmJlxuXG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKFwiXCIpXG5cdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTlxuXHRcdCFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTtcbn07XG5cblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSApO1xufVxuXG5cblxuXG52YXJcblxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoICFub0dsb2JhbCApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5cblxuXG5yZXR1cm4galF1ZXJ5O1xufSApO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n");
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports) {
+
+eval("var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzPzM2OTgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0Qzs7QUFFNUMiLCJmaWxlIjoiMi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnO1xyXG5cclxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcclxuZyA9IChmdW5jdGlvbigpIHtcclxuXHRyZXR1cm4gdGhpcztcclxufSkoKTtcclxuXHJcbnRyeSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXHJcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcclxufSBjYXRjaChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxyXG5cdFx0ZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2\n");
+
+/***/ }),
+/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* WEBPACK VAR INJECTION */(function(global) {/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.14.3\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nvar longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\nvar timeoutDuration = 0;\nfor (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n timeoutDuration = 1;\n break;\n }\n}\n\nfunction microtaskDebounce(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n called = true;\n window.Promise.resolve().then(function () {\n called = false;\n fn();\n });\n };\n}\n\nfunction taskDebounce(fn) {\n var scheduled = false;\n return function () {\n if (!scheduled) {\n scheduled = true;\n setTimeout(function () {\n scheduled = false;\n fn();\n }, timeoutDuration);\n }\n };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nfunction isFunction(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nfunction getStyleComputedProperty(element, property) {\n if (element.nodeType !== 1) {\n return [];\n }\n // NOTE: 1 DOM access here\n var css = getComputedStyle(element, null);\n return property ? css[property] : css;\n}\n\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nfunction getParentNode(element) {\n if (element.nodeName === 'HTML') {\n return element;\n }\n return element.parentNode || element.host;\n}\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nfunction getScrollParent(element) {\n // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n if (!element) {\n return document.body;\n }\n\n switch (element.nodeName) {\n case 'HTML':\n case 'BODY':\n return element.ownerDocument.body;\n case '#document':\n return element.body;\n }\n\n // Firefox want us to check `-x` and `-y` variations as well\n\n var _getStyleComputedProp = getStyleComputedProperty(element),\n overflow = _getStyleComputedProp.overflow,\n overflowX = _getStyleComputedProp.overflowX,\n overflowY = _getStyleComputedProp.overflowY;\n\n if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n return element;\n }\n\n return getScrollParent(getParentNode(element));\n}\n\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nfunction isIE(version) {\n if (version === 11) {\n return isIE11;\n }\n if (version === 10) {\n return isIE10;\n }\n return isIE11 || isIE10;\n}\n\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nfunction getOffsetParent(element) {\n if (!element) {\n return document.documentElement;\n }\n\n var noOffsetParent = isIE(10) ? document.body : null;\n\n // NOTE: 1 DOM access here\n var offsetParent = element.offsetParent;\n // Skip hidden elements which don't have an offsetParent\n while (offsetParent === noOffsetParent && element.nextElementSibling) {\n offsetParent = (element = element.nextElementSibling).offsetParent;\n }\n\n var nodeName = offsetParent && offsetParent.nodeName;\n\n if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n return element ? element.ownerDocument.documentElement : document.documentElement;\n }\n\n // .offsetParent will return the closest TD or TABLE in case\n // no offsetParent is present, I hate this job...\n if (['TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n return getOffsetParent(offsetParent);\n }\n\n return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY') {\n return false;\n }\n return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nfunction getRoot(node) {\n if (node.parentNode !== null) {\n return getRoot(node.parentNode);\n }\n\n return node;\n}\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nfunction findCommonOffsetParent(element1, element2) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n return document.documentElement;\n }\n\n // Here we make sure to give as \"start\" the element that comes first in the DOM\n var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n var start = order ? element1 : element2;\n var end = order ? element2 : element1;\n\n // Get common ancestor container\n var range = document.createRange();\n range.setStart(start, 0);\n range.setEnd(end, 0);\n var commonAncestorContainer = range.commonAncestorContainer;\n\n // Both nodes are inside #document\n\n if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n if (isOffsetContainer(commonAncestorContainer)) {\n return commonAncestorContainer;\n }\n\n return getOffsetParent(commonAncestorContainer);\n }\n\n // one of the nodes is inside shadowDOM, find which one\n var element1root = getRoot(element1);\n if (element1root.host) {\n return findCommonOffsetParent(element1root.host, element2);\n } else {\n return findCommonOffsetParent(element1, getRoot(element2).host);\n }\n}\n\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nfunction getScroll(element) {\n var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n var html = element.ownerDocument.documentElement;\n var scrollingElement = element.ownerDocument.scrollingElement || html;\n return scrollingElement[upperSide];\n }\n\n return element[upperSide];\n}\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nfunction includeScroll(rect, element) {\n var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n var modifier = subtract ? -1 : 1;\n rect.top += scrollTop * modifier;\n rect.bottom += scrollTop * modifier;\n rect.left += scrollLeft * modifier;\n rect.right += scrollLeft * modifier;\n return rect;\n}\n\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nfunction getBordersSize(styles, axis) {\n var sideA = axis === 'x' ? 'Left' : 'Top';\n var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\n}\n\nfunction getSize(axis, body, html, computedStyle) {\n return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? html['offset' + axis] + computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')] + computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')] : 0);\n}\n\nfunction getWindowSizes() {\n var body = document.body;\n var html = document.documentElement;\n var computedStyle = isIE(10) && getComputedStyle(html);\n\n return {\n height: getSize('Height', body, html, computedStyle),\n width: getSize('Width', body, html, computedStyle)\n };\n}\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\nvar defineProperty = function (obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nfunction getClientRect(offsets) {\n return _extends({}, offsets, {\n right: offsets.left + offsets.width,\n bottom: offsets.top + offsets.height\n });\n}\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nfunction getBoundingClientRect(element) {\n var rect = {};\n\n // IE10 10 FIX: Please, don't ask, the element isn't\n // considered in DOM in some circumstances...\n // This isn't reproducible in IE10 compatibility mode of IE11\n try {\n if (isIE(10)) {\n rect = element.getBoundingClientRect();\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n rect.top += scrollTop;\n rect.left += scrollLeft;\n rect.bottom += scrollTop;\n rect.right += scrollLeft;\n } else {\n rect = element.getBoundingClientRect();\n }\n } catch (e) {}\n\n var result = {\n left: rect.left,\n top: rect.top,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n\n // subtract scrollbar size from sizes\n var sizes = element.nodeName === 'HTML' ? getWindowSizes() : {};\n var width = sizes.width || element.clientWidth || result.right - result.left;\n var height = sizes.height || element.clientHeight || result.bottom - result.top;\n\n var horizScrollbar = element.offsetWidth - width;\n var vertScrollbar = element.offsetHeight - height;\n\n // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n // we make this check conditional for performance reasons\n if (horizScrollbar || vertScrollbar) {\n var styles = getStyleComputedProperty(element);\n horizScrollbar -= getBordersSize(styles, 'x');\n vertScrollbar -= getBordersSize(styles, 'y');\n\n result.width -= horizScrollbar;\n result.height -= vertScrollbar;\n }\n\n return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var isIE10 = isIE(10);\n var isHTML = parent.nodeName === 'HTML';\n var childrenRect = getBoundingClientRect(children);\n var parentRect = getBoundingClientRect(parent);\n var scrollParent = getScrollParent(children);\n\n var styles = getStyleComputedProperty(parent);\n var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\n var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\n\n // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n if (fixedPosition && parent.nodeName === 'HTML') {\n parentRect.top = Math.max(parentRect.top, 0);\n parentRect.left = Math.max(parentRect.left, 0);\n }\n var offsets = getClientRect({\n top: childrenRect.top - parentRect.top - borderTopWidth,\n left: childrenRect.left - parentRect.left - borderLeftWidth,\n width: childrenRect.width,\n height: childrenRect.height\n });\n offsets.marginTop = 0;\n offsets.marginLeft = 0;\n\n // Subtract margins of documentElement in case it's being used as parent\n // we do this only on HTML because it's the only element that behaves\n // differently when margins are applied to it. The margins are included in\n // the box of the documentElement, in the other cases not.\n if (!isIE10 && isHTML) {\n var marginTop = parseFloat(styles.marginTop, 10);\n var marginLeft = parseFloat(styles.marginLeft, 10);\n\n offsets.top -= borderTopWidth - marginTop;\n offsets.bottom -= borderTopWidth - marginTop;\n offsets.left -= borderLeftWidth - marginLeft;\n offsets.right -= borderLeftWidth - marginLeft;\n\n // Attach marginTop and marginLeft because in some circumstances we may need them\n offsets.marginTop = marginTop;\n offsets.marginLeft = marginLeft;\n }\n\n if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n offsets = includeScroll(offsets, parent);\n }\n\n return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var html = element.ownerDocument.documentElement;\n var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n var width = Math.max(html.clientWidth, window.innerWidth || 0);\n var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n var scrollTop = !excludeScroll ? getScroll(html) : 0;\n var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n var offset = {\n top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n width: width,\n height: height\n };\n\n return getClientRect(offset);\n}\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nfunction isFixed(element) {\n var nodeName = element.nodeName;\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n return false;\n }\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\n return true;\n }\n return isFixed(getParentNode(element));\n}\n\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nfunction getFixedPositionOffsetParent(element) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element || !element.parentElement || isIE()) {\n return document.documentElement;\n }\n var el = element.parentElement;\n while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n el = el.parentElement;\n }\n return el || document.documentElement;\n}\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n // NOTE: 1 DOM access here\n\n var boundaries = { top: 0, left: 0 };\n var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n\n // Handle viewport case\n if (boundariesElement === 'viewport') {\n boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n } else {\n // Handle other cases based on DOM element used as boundaries\n var boundariesNode = void 0;\n if (boundariesElement === 'scrollParent') {\n boundariesNode = getScrollParent(getParentNode(reference));\n if (boundariesNode.nodeName === 'BODY') {\n boundariesNode = popper.ownerDocument.documentElement;\n }\n } else if (boundariesElement === 'window') {\n boundariesNode = popper.ownerDocument.documentElement;\n } else {\n boundariesNode = boundariesElement;\n }\n\n var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n // In case of HTML, we need a different computation\n if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n var _getWindowSizes = getWindowSizes(),\n height = _getWindowSizes.height,\n width = _getWindowSizes.width;\n\n boundaries.top += offsets.top - offsets.marginTop;\n boundaries.bottom = height + offsets.top;\n boundaries.left += offsets.left - offsets.marginLeft;\n boundaries.right = width + offsets.left;\n } else {\n // for all the other DOM elements, this one is good\n boundaries = offsets;\n }\n }\n\n // Add paddings\n boundaries.left += padding;\n boundaries.top += padding;\n boundaries.right -= padding;\n boundaries.bottom -= padding;\n\n return boundaries;\n}\n\nfunction getArea(_ref) {\n var width = _ref.width,\n height = _ref.height;\n\n return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n if (placement.indexOf('auto') === -1) {\n return placement;\n }\n\n var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n var rects = {\n top: {\n width: boundaries.width,\n height: refRect.top - boundaries.top\n },\n right: {\n width: boundaries.right - refRect.right,\n height: boundaries.height\n },\n bottom: {\n width: boundaries.width,\n height: boundaries.bottom - refRect.bottom\n },\n left: {\n width: refRect.left - boundaries.left,\n height: boundaries.height\n }\n };\n\n var sortedAreas = Object.keys(rects).map(function (key) {\n return _extends({\n key: key\n }, rects[key], {\n area: getArea(rects[key])\n });\n }).sort(function (a, b) {\n return b.area - a.area;\n });\n\n var filteredAreas = sortedAreas.filter(function (_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n return width >= popper.clientWidth && height >= popper.clientHeight;\n });\n\n var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n var variation = placement.split('-')[1];\n\n return computedPlacement + (variation ? '-' + variation : '');\n}\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nfunction getReferenceOffsets(state, popper, reference) {\n var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nfunction getOuterSizes(element) {\n var styles = getComputedStyle(element);\n var x = parseFloat(styles.marginTop) + parseFloat(styles.marginBottom);\n var y = parseFloat(styles.marginLeft) + parseFloat(styles.marginRight);\n var result = {\n width: element.offsetWidth + y,\n height: element.offsetHeight + x\n };\n return result;\n}\n\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nfunction getOppositePlacement(placement) {\n var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n placement = placement.split('-')[0];\n\n // Get popper node sizes\n var popperRect = getOuterSizes(popper);\n\n // Add position, width and height to our offsets object\n var popperOffsets = {\n width: popperRect.width,\n height: popperRect.height\n };\n\n // depending by the popper placement we have to compute its offsets slightly differently\n var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n var mainSide = isHoriz ? 'top' : 'left';\n var secondarySide = isHoriz ? 'left' : 'top';\n var measurement = isHoriz ? 'height' : 'width';\n var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n if (placement === secondarySide) {\n popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n } else {\n popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n }\n\n return popperOffsets;\n}\n\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction find(arr, check) {\n // use native find if supported\n if (Array.prototype.find) {\n return arr.find(check);\n }\n\n // use `filter` to obtain the same behavior of `find`\n return arr.filter(check)[0];\n}\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction findIndex(arr, prop, value) {\n // use native findIndex if supported\n if (Array.prototype.findIndex) {\n return arr.findIndex(function (cur) {\n return cur[prop] === value;\n });\n }\n\n // use `find` + `indexOf` if `findIndex` isn't supported\n var match = find(arr, function (obj) {\n return obj[prop] === value;\n });\n return arr.indexOf(match);\n}\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nfunction runModifiers(modifiers, data, ends) {\n var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n modifiersToRun.forEach(function (modifier) {\n if (modifier['function']) {\n // eslint-disable-line dot-notation\n console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n }\n var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n if (modifier.enabled && isFunction(fn)) {\n // Add properties to offsets to make them a complete clientRect object\n // we do this before each modifier to make sure the previous one doesn't\n // mess with these values\n data.offsets.popper = getClientRect(data.offsets.popper);\n data.offsets.reference = getClientRect(data.offsets.reference);\n\n data = fn(data, modifier);\n }\n });\n\n return data;\n}\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nfunction update() {\n // if popper is destroyed, don't perform any further update\n if (this.state.isDestroyed) {\n return;\n }\n\n var data = {\n instance: this,\n styles: {},\n arrowStyles: {},\n attributes: {},\n flipped: false,\n offsets: {}\n };\n\n // compute reference element offsets\n data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n // store the computed placement inside `originalPlacement`\n data.originalPlacement = data.placement;\n\n data.positionFixed = this.options.positionFixed;\n\n // compute the popper offsets\n data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n // run the modifiers\n data = runModifiers(this.modifiers, data);\n\n // the first `update` will call `onCreate` callback\n // the other ones will call `onUpdate` callback\n if (!this.state.isCreated) {\n this.state.isCreated = true;\n this.options.onCreate(data);\n } else {\n this.options.onUpdate(data);\n }\n}\n\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nfunction isModifierEnabled(modifiers, modifierName) {\n return modifiers.some(function (_ref) {\n var name = _ref.name,\n enabled = _ref.enabled;\n return enabled && name === modifierName;\n });\n}\n\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nfunction getSupportedPropertyName(property) {\n var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n for (var i = 0; i < prefixes.length; i++) {\n var prefix = prefixes[i];\n var toCheck = prefix ? '' + prefix + upperProp : property;\n if (typeof document.body.style[toCheck] !== 'undefined') {\n return toCheck;\n }\n }\n return null;\n}\n\n/**\n * Destroy the popper\n * @method\n * @memberof Popper\n */\nfunction destroy() {\n this.state.isDestroyed = true;\n\n // touch DOM only if `applyStyle` modifier is enabled\n if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n this.popper.removeAttribute('x-placement');\n this.popper.style.position = '';\n this.popper.style.top = '';\n this.popper.style.left = '';\n this.popper.style.right = '';\n this.popper.style.bottom = '';\n this.popper.style.willChange = '';\n this.popper.style[getSupportedPropertyName('transform')] = '';\n }\n\n this.disableEventListeners();\n\n // remove the popper if user explicity asked for the deletion on destroy\n // do not use `remove` because IE11 doesn't support it\n if (this.options.removeOnDestroy) {\n this.popper.parentNode.removeChild(this.popper);\n }\n return this;\n}\n\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nfunction getWindow(element) {\n var ownerDocument = element.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n var isBody = scrollParent.nodeName === 'BODY';\n var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n target.addEventListener(event, callback, { passive: true });\n\n if (!isBody) {\n attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n }\n scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction setupEventListeners(reference, options, state, updateBound) {\n // Resize event listener on window\n state.updateBound = updateBound;\n getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n // Scroll event listener on scroll parents\n var scrollElement = getScrollParent(reference);\n attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n state.scrollElement = scrollElement;\n state.eventsEnabled = true;\n\n return state;\n}\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nfunction enableEventListeners() {\n if (!this.state.eventsEnabled) {\n this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n }\n}\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction removeEventListeners(reference, state) {\n // Remove resize event listener on window\n getWindow(reference).removeEventListener('resize', state.updateBound);\n\n // Remove scroll event listener on scroll parents\n state.scrollParents.forEach(function (target) {\n target.removeEventListener('scroll', state.updateBound);\n });\n\n // Reset state\n state.updateBound = null;\n state.scrollParents = [];\n state.scrollElement = null;\n state.eventsEnabled = false;\n return state;\n}\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger onUpdate callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nfunction disableEventListeners() {\n if (this.state.eventsEnabled) {\n cancelAnimationFrame(this.scheduleUpdate);\n this.state = removeEventListeners(this.reference, this.state);\n }\n}\n\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nfunction isNumeric(n) {\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setStyles(element, styles) {\n Object.keys(styles).forEach(function (prop) {\n var unit = '';\n // add unit if the value is numeric and is one of the following\n if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n unit = 'px';\n }\n element.style[prop] = styles[prop] + unit;\n });\n}\n\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setAttributes(element, attributes) {\n Object.keys(attributes).forEach(function (prop) {\n var value = attributes[prop];\n if (value !== false) {\n element.setAttribute(prop, attributes[prop]);\n } else {\n element.removeAttribute(prop);\n }\n });\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nfunction applyStyle(data) {\n // any property present in `data.styles` will be applied to the popper,\n // in this way we can make the 3rd party modifiers add custom styles to it\n // Be aware, modifiers could override the properties defined in the previous\n // lines of this modifier!\n setStyles(data.instance.popper, data.styles);\n\n // any property present in `data.attributes` will be applied to the popper,\n // they will be set as HTML attributes of the element\n setAttributes(data.instance.popper, data.attributes);\n\n // if arrowElement is defined and arrowStyles has some properties\n if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n setStyles(data.arrowElement, data.arrowStyles);\n }\n\n return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n // compute reference element offsets\n var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n popper.setAttribute('x-placement', placement);\n\n // Apply `position` to popper before anything else because\n // without the position applied we can't guarantee correct computations\n setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n return options;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeStyle(data, options) {\n var x = options.x,\n y = options.y;\n var popper = data.offsets.popper;\n\n // Remove this legacy support in Popper.js v2\n\n var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'applyStyle';\n }).gpuAcceleration;\n if (legacyGpuAccelerationOption !== undefined) {\n console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n }\n var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n var offsetParent = getOffsetParent(data.instance.popper);\n var offsetParentRect = getBoundingClientRect(offsetParent);\n\n // Styles\n var styles = {\n position: popper.position\n };\n\n // Avoid blurry text by using full pixel integers.\n // For pixel-perfect positioning, top/bottom prefers rounded\n // values, while left/right prefers floored values.\n var offsets = {\n left: Math.floor(popper.left),\n top: Math.round(popper.top),\n bottom: Math.round(popper.bottom),\n right: Math.floor(popper.right)\n };\n\n var sideA = x === 'bottom' ? 'top' : 'bottom';\n var sideB = y === 'right' ? 'left' : 'right';\n\n // if gpuAcceleration is set to `true` and transform is supported,\n // we use `translate3d` to apply the position to the popper we\n // automatically use the supported prefixed version if needed\n var prefixedProperty = getSupportedPropertyName('transform');\n\n // now, let's make a step back and look at this code closely (wtf?)\n // If the content of the popper grows once it's been positioned, it\n // may happen that the popper gets misplaced because of the new content\n // overflowing its reference element\n // To avoid this problem, we provide two options (x and y), which allow\n // the consumer to define the offset origin.\n // If we position a popper on top of a reference element, we can set\n // `x` to `top` to make the popper grow towards its top instead of\n // its bottom.\n var left = void 0,\n top = void 0;\n if (sideA === 'bottom') {\n top = -offsetParentRect.height + offsets.bottom;\n } else {\n top = offsets.top;\n }\n if (sideB === 'right') {\n left = -offsetParentRect.width + offsets.right;\n } else {\n left = offsets.left;\n }\n if (gpuAcceleration && prefixedProperty) {\n styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n styles[sideA] = 0;\n styles[sideB] = 0;\n styles.willChange = 'transform';\n } else {\n // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n var invertTop = sideA === 'bottom' ? -1 : 1;\n var invertLeft = sideB === 'right' ? -1 : 1;\n styles[sideA] = top * invertTop;\n styles[sideB] = left * invertLeft;\n styles.willChange = sideA + ', ' + sideB;\n }\n\n // Attributes\n var attributes = {\n 'x-placement': data.placement\n };\n\n // Update `data` attributes, styles and arrowStyles\n data.attributes = _extends({}, attributes, data.attributes);\n data.styles = _extends({}, styles, data.styles);\n data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n return data;\n}\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n var requesting = find(modifiers, function (_ref) {\n var name = _ref.name;\n return name === requestingName;\n });\n\n var isRequired = !!requesting && modifiers.some(function (modifier) {\n return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n });\n\n if (!isRequired) {\n var _requesting = '`' + requestingName + '`';\n var requested = '`' + requestedName + '`';\n console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n }\n return isRequired;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction arrow(data, options) {\n var _data$offsets$arrow;\n\n // arrow depends on keepTogether in order to work\n if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n return data;\n }\n\n var arrowElement = options.element;\n\n // if arrowElement is a string, suppose it's a CSS selector\n if (typeof arrowElement === 'string') {\n arrowElement = data.instance.popper.querySelector(arrowElement);\n\n // if arrowElement is not found, don't run the modifier\n if (!arrowElement) {\n return data;\n }\n } else {\n // if the arrowElement isn't a query selector we must check that the\n // provided DOM node is child of its popper node\n if (!data.instance.popper.contains(arrowElement)) {\n console.warn('WARNING: `arrow.element` must be child of its popper element!');\n return data;\n }\n }\n\n var placement = data.placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n var len = isVertical ? 'height' : 'width';\n var sideCapitalized = isVertical ? 'Top' : 'Left';\n var side = sideCapitalized.toLowerCase();\n var altSide = isVertical ? 'left' : 'top';\n var opSide = isVertical ? 'bottom' : 'right';\n var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n //\n // extends keepTogether behavior making sure the popper and its\n // reference have enough pixels in conjuction\n //\n\n // top/left side\n if (reference[opSide] - arrowElementSize < popper[side]) {\n data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n }\n // bottom/right side\n if (reference[side] + arrowElementSize > popper[opSide]) {\n data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n }\n data.offsets.popper = getClientRect(data.offsets.popper);\n\n // compute center of the popper\n var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n // Compute the sideValue using the updated popper offsets\n // take popper margin in account because we don't have this info available\n var css = getStyleComputedProperty(data.instance.popper);\n var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\n var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\n var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n // prevent arrowElement from being placed not contiguously to its popper\n sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n data.arrowElement = arrowElement;\n data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n return data;\n}\n\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nfunction getOppositeVariation(variation) {\n if (variation === 'end') {\n return 'start';\n } else if (variation === 'start') {\n return 'end';\n }\n return variation;\n}\n\n/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-right` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n// Get rid of `auto` `auto-start` and `auto-end`\nvar validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nfunction clockwise(placement) {\n var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var index = validPlacements.indexOf(placement);\n var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n FLIP: 'flip',\n CLOCKWISE: 'clockwise',\n COUNTERCLOCKWISE: 'counterclockwise'\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction flip(data, options) {\n // if `inner` modifier is enabled, we can't use the `flip` modifier\n if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n return data;\n }\n\n if (data.flipped && data.placement === data.originalPlacement) {\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n return data;\n }\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n var placement = data.placement.split('-')[0];\n var placementOpposite = getOppositePlacement(placement);\n var variation = data.placement.split('-')[1] || '';\n\n var flipOrder = [];\n\n switch (options.behavior) {\n case BEHAVIORS.FLIP:\n flipOrder = [placement, placementOpposite];\n break;\n case BEHAVIORS.CLOCKWISE:\n flipOrder = clockwise(placement);\n break;\n case BEHAVIORS.COUNTERCLOCKWISE:\n flipOrder = clockwise(placement, true);\n break;\n default:\n flipOrder = options.behavior;\n }\n\n flipOrder.forEach(function (step, index) {\n if (placement !== step || flipOrder.length === index + 1) {\n return data;\n }\n\n placement = data.placement.split('-')[0];\n placementOpposite = getOppositePlacement(placement);\n\n var popperOffsets = data.offsets.popper;\n var refOffsets = data.offsets.reference;\n\n // using floor because the reference offsets may contain decimals we are not going to consider here\n var floor = Math.floor;\n var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n // flip the variation if required\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n if (overlapsRef || overflowsBoundaries || flippedVariation) {\n // this boolean to detect any flip loop\n data.flipped = true;\n\n if (overlapsRef || overflowsBoundaries) {\n placement = flipOrder[index + 1];\n }\n\n if (flippedVariation) {\n variation = getOppositeVariation(variation);\n }\n\n data.placement = placement + (variation ? '-' + variation : '');\n\n // this object contains `position`, we want to preserve it along with\n // any additional property we may add in the future\n data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n data = runModifiers(data.instance.modifiers, data, 'flip');\n }\n });\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction keepTogether(data) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var placement = data.placement.split('-')[0];\n var floor = Math.floor;\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var side = isVertical ? 'right' : 'bottom';\n var opSide = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n if (popper[side] < floor(reference[opSide])) {\n data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n }\n if (popper[opSide] > floor(reference[side])) {\n data.offsets.popper[opSide] = floor(reference[side]);\n }\n\n return data;\n}\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n // separate value from unit\n var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n var value = +split[1];\n var unit = split[2];\n\n // If it's not a number it's an operator, I guess\n if (!value) {\n return str;\n }\n\n if (unit.indexOf('%') === 0) {\n var element = void 0;\n switch (unit) {\n case '%p':\n element = popperOffsets;\n break;\n case '%':\n case '%r':\n default:\n element = referenceOffsets;\n }\n\n var rect = getClientRect(element);\n return rect[measurement] / 100 * value;\n } else if (unit === 'vh' || unit === 'vw') {\n // if is a vh or vw, we calculate the size based on the viewport\n var size = void 0;\n if (unit === 'vh') {\n size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n } else {\n size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n return size / 100 * value;\n } else {\n // if is an explicit pixel unit, we get rid of the unit and keep the value\n // if is an implicit unit, it's px, and we return just the value\n return value;\n }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n var offsets = [0, 0];\n\n // Use height if placement is left or right and index is 0 otherwise use width\n // in this way the first offset will use an axis and the second one\n // will use the other one\n var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n // Split the offset string to obtain a list of values and operands\n // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n return frag.trim();\n });\n\n // Detect if the offset string contains a pair of values or a single one\n // they could be separated by comma or space\n var divider = fragments.indexOf(find(fragments, function (frag) {\n return frag.search(/,|\\s/) !== -1;\n }));\n\n if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n }\n\n // If divider is found, we divide the list of values and operands to divide\n // them by ofset X and Y.\n var splitRegex = /\\s*,\\s*|\\s+/;\n var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n // Convert the values with units to absolute pixels to allow our computations\n ops = ops.map(function (op, index) {\n // Most of the units rely on the orientation of the popper\n var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n var mergeWithPrevious = false;\n return op\n // This aggregates any `+` or `-` sign that aren't considered operators\n // e.g.: 10 + +5 => [10, +, +5]\n .reduce(function (a, b) {\n if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n a[a.length - 1] = b;\n mergeWithPrevious = true;\n return a;\n } else if (mergeWithPrevious) {\n a[a.length - 1] += b;\n mergeWithPrevious = false;\n return a;\n } else {\n return a.concat(b);\n }\n }, [])\n // Here we convert the string values into number values (in px)\n .map(function (str) {\n return toValue(str, measurement, popperOffsets, referenceOffsets);\n });\n });\n\n // Loop trough the offsets arrays and execute the operations\n ops.forEach(function (op, index) {\n op.forEach(function (frag, index2) {\n if (isNumeric(frag)) {\n offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n }\n });\n });\n return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nfunction offset(data, _ref) {\n var offset = _ref.offset;\n var placement = data.placement,\n _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var basePlacement = placement.split('-')[0];\n\n var offsets = void 0;\n if (isNumeric(+offset)) {\n offsets = [+offset, 0];\n } else {\n offsets = parseOffset(offset, popper, reference, basePlacement);\n }\n\n if (basePlacement === 'left') {\n popper.top += offsets[0];\n popper.left -= offsets[1];\n } else if (basePlacement === 'right') {\n popper.top += offsets[0];\n popper.left += offsets[1];\n } else if (basePlacement === 'top') {\n popper.left += offsets[0];\n popper.top -= offsets[1];\n } else if (basePlacement === 'bottom') {\n popper.left += offsets[0];\n popper.top += offsets[1];\n }\n\n data.popper = popper;\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction preventOverflow(data, options) {\n var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n // If offsetParent is the reference element, we really want to\n // go one step up and use the next offsetParent as reference to\n // avoid to make this modifier completely useless and look like broken\n if (data.instance.reference === boundariesElement) {\n boundariesElement = getOffsetParent(boundariesElement);\n }\n\n // NOTE: DOM access here\n // resets the popper's position so that the document size can be calculated excluding\n // the size of the popper element itself\n var transformProp = getSupportedPropertyName('transform');\n var popperStyles = data.instance.popper.style; // assignment to help minification\n var top = popperStyles.top,\n left = popperStyles.left,\n transform = popperStyles[transformProp];\n\n popperStyles.top = '';\n popperStyles.left = '';\n popperStyles[transformProp] = '';\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n // NOTE: DOM access here\n // restores the original style properties after the offsets have been computed\n popperStyles.top = top;\n popperStyles.left = left;\n popperStyles[transformProp] = transform;\n\n options.boundaries = boundaries;\n\n var order = options.priority;\n var popper = data.offsets.popper;\n\n var check = {\n primary: function primary(placement) {\n var value = popper[placement];\n if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n value = Math.max(popper[placement], boundaries[placement]);\n }\n return defineProperty({}, placement, value);\n },\n secondary: function secondary(placement) {\n var mainSide = placement === 'right' ? 'left' : 'top';\n var value = popper[mainSide];\n if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n }\n return defineProperty({}, mainSide, value);\n }\n };\n\n order.forEach(function (placement) {\n var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n popper = _extends({}, popper, check[side](placement));\n });\n\n data.offsets.popper = popper;\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction shift(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var shiftvariation = placement.split('-')[1];\n\n // if shift shiftvariation is specified, run the modifier\n if (shiftvariation) {\n var _data$offsets = data.offsets,\n reference = _data$offsets.reference,\n popper = _data$offsets.popper;\n\n var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n var side = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n var shiftOffsets = {\n start: defineProperty({}, side, reference[side]),\n end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n };\n\n data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction hide(data) {\n if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n return data;\n }\n\n var refRect = data.offsets.reference;\n var bound = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'preventOverflow';\n }).boundaries;\n\n if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === true) {\n return data;\n }\n\n data.hide = true;\n data.attributes['x-out-of-boundaries'] = '';\n } else {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === false) {\n return data;\n }\n\n data.hide = false;\n data.attributes['x-out-of-boundaries'] = false;\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction inner(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n data.placement = getOppositePlacement(placement);\n data.offsets.popper = getClientRect(popper);\n\n return data;\n}\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nvar modifiers = {\n /**\n * Modifier used to shift the popper on the start or end of its reference\n * element.<br />\n * It will read the variation of the `placement` property.<br />\n * It can be one either `-end` or `-start`.\n * @memberof modifiers\n * @inner\n */\n shift: {\n /** @prop {number} order=100 - Index used to define the order of execution */\n order: 100,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: shift\n },\n\n /**\n * The `offset` modifier can shift your popper on both its axis.\n *\n * It accepts the following units:\n * - `px` or unitless, interpreted as pixels\n * - `%` or `%r`, percentage relative to the length of the reference element\n * - `%p`, percentage relative to the length of the popper element\n * - `vw`, CSS viewport width unit\n * - `vh`, CSS viewport height unit\n *\n * For length is intended the main axis relative to the placement of the popper.<br />\n * This means that if the placement is `top` or `bottom`, the length will be the\n * `width`. In case of `left` or `right`, it will be the height.\n *\n * You can provide a single value (as `Number` or `String`), or a pair of values\n * as `String` divided by a comma or one (or more) white spaces.<br />\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.<br />\n * Additionally, it accepts additions and subtractions between different units.\n * Note that multiplications and divisions aren't supported.\n *\n * Valid examples are:\n * ```\n * 10\n * '10%'\n * '10, 10'\n * '10%, 10'\n * '10 + 10%'\n * '10 - 5vh + 3%'\n * '-10px + 5vh, 5px - 6%'\n * ```\n * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n * > More on this [reading this issue](https://github.com/FezVrasta/popper.js/issues/373)\n *\n * @memberof modifiers\n * @inner\n */\n offset: {\n /** @prop {number} order=200 - Index used to define the order of execution */\n order: 200,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: offset,\n /** @prop {Number|String} offset=0\n * The offset value as described in the modifier description\n */\n offset: 0\n },\n\n /**\n * Modifier used to prevent the popper from being positioned outside the boundary.\n *\n * An scenario exists where the reference itself is not within the boundaries.<br />\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n * In this case we need to decide whether the popper should either:\n *\n * - detach from the reference and remain \"trapped\" in the boundaries, or\n * - if it should ignore the boundary and \"escape with its reference\"\n *\n * When `escapeWithReference` is set to`true` and reference is completely\n * outside its boundaries, the popper will overflow (or completely leave)\n * the boundaries in order to remain attached to the edge of the reference.\n *\n * @memberof modifiers\n * @inner\n */\n preventOverflow: {\n /** @prop {number} order=300 - Index used to define the order of execution */\n order: 300,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: preventOverflow,\n /**\n * @prop {Array} [priority=['left','right','top','bottom']]\n * Popper will try to prevent overflow following these priorities by default,\n * then, it could overflow on the left and on top of the `boundariesElement`\n */\n priority: ['left', 'right', 'top', 'bottom'],\n /**\n * @prop {number} padding=5\n * Amount of pixel used to define a minimum distance between the boundaries\n * and the popper this makes sure the popper has always a little padding\n * between the edges of its container\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='scrollParent'\n * Boundaries used by the modifier, can be `scrollParent`, `window`,\n * `viewport` or any DOM element.\n */\n boundariesElement: 'scrollParent'\n },\n\n /**\n * Modifier used to make sure the reference and its popper stay near eachothers\n * without leaving any gap between the two. Expecially useful when the arrow is\n * enabled and you want to assure it to point to its reference element.\n * It cares only about the first axis, you can still have poppers with margin\n * between the popper and its reference element.\n * @memberof modifiers\n * @inner\n */\n keepTogether: {\n /** @prop {number} order=400 - Index used to define the order of execution */\n order: 400,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: keepTogether\n },\n\n /**\n * This modifier is used to move the `arrowElement` of the popper to make\n * sure it is positioned between the reference element and its popper element.\n * It will read the outer size of the `arrowElement` node to detect how many\n * pixels of conjuction are needed.\n *\n * It has no effect if no `arrowElement` is provided.\n * @memberof modifiers\n * @inner\n */\n arrow: {\n /** @prop {number} order=500 - Index used to define the order of execution */\n order: 500,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: arrow,\n /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n element: '[x-arrow]'\n },\n\n /**\n * Modifier used to flip the popper's placement when it starts to overlap its\n * reference element.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n *\n * **NOTE:** this modifier will interrupt the current update cycle and will\n * restart it if it detects the need to flip the placement.\n * @memberof modifiers\n * @inner\n */\n flip: {\n /** @prop {number} order=600 - Index used to define the order of execution */\n order: 600,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: flip,\n /**\n * @prop {String|Array} behavior='flip'\n * The behavior used to change the popper's placement. It can be one of\n * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n * placements (with optional variations).\n */\n behavior: 'flip',\n /**\n * @prop {number} padding=5\n * The popper will flip if it hits the edges of the `boundariesElement`\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='viewport'\n * The element which will define the boundaries of the popper position,\n * the popper will never be placed outside of the defined boundaries\n * (except if keepTogether is enabled)\n */\n boundariesElement: 'viewport'\n },\n\n /**\n * Modifier used to make the popper flow toward the inner of the reference element.\n * By default, when this modifier is disabled, the popper will be placed outside\n * the reference element.\n * @memberof modifiers\n * @inner\n */\n inner: {\n /** @prop {number} order=700 - Index used to define the order of execution */\n order: 700,\n /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n enabled: false,\n /** @prop {ModifierFn} */\n fn: inner\n },\n\n /**\n * Modifier used to hide the popper when its reference element is outside of the\n * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n * be used to hide with a CSS selector the popper when its reference is\n * out of boundaries.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n * @memberof modifiers\n * @inner\n */\n hide: {\n /** @prop {number} order=800 - Index used to define the order of execution */\n order: 800,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: hide\n },\n\n /**\n * Computes the style that will be applied to the popper element to gets\n * properly positioned.\n *\n * Note that this modifier will not touch the DOM, it just prepares the styles\n * so that `applyStyle` modifier can apply it. This separation is useful\n * in case you need to replace `applyStyle` with a custom implementation.\n *\n * This modifier has `850` as `order` value to maintain backward compatibility\n * with previous versions of Popper.js. Expect the modifiers ordering method\n * to change in future major versions of the library.\n *\n * @memberof modifiers\n * @inner\n */\n computeStyle: {\n /** @prop {number} order=850 - Index used to define the order of execution */\n order: 850,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: computeStyle,\n /**\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3d transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties.\n */\n gpuAcceleration: true,\n /**\n * @prop {string} [x='bottom']\n * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n * Change this if your popper should grow in a direction different from `bottom`\n */\n x: 'bottom',\n /**\n * @prop {string} [x='left']\n * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n * Change this if your popper should grow in a direction different from `right`\n */\n y: 'right'\n },\n\n /**\n * Applies the computed styles to the popper element.\n *\n * All the DOM manipulations are limited to this modifier. This is useful in case\n * you want to integrate Popper.js inside a framework or view library and you\n * want to delegate all the DOM manipulations to it.\n *\n * Note that if you disable this modifier, you must make sure the popper element\n * has its position set to `absolute` before Popper.js can do its work!\n *\n * Just disable this modifier and define you own to achieve the desired effect.\n *\n * @memberof modifiers\n * @inner\n */\n applyStyle: {\n /** @prop {number} order=900 - Index used to define the order of execution */\n order: 900,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: applyStyle,\n /** @prop {Function} */\n onLoad: applyStyleOnLoad,\n /**\n * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3d transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties.\n */\n gpuAcceleration: undefined\n }\n};\n\n/**\n * The `dataObject` is an object containing all the informations used by Popper.js\n * this object get passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper.\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper, it expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow, it expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements.\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overriden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass as 3rd argument an object with the same\n * structure of this object, example:\n * ```\n * new Popper(ref, pop, {\n * modifiers: {\n * preventOverflow: { enabled: false }\n * }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nvar Defaults = {\n /**\n * Popper's placement\n * @prop {Popper.placements} placement='bottom'\n */\n placement: 'bottom',\n\n /**\n * Set this to true if you want popper to position it self in 'fixed' mode\n * @prop {Boolean} positionFixed=false\n */\n positionFixed: false,\n\n /**\n * Whether events (resize, scroll) are initially enabled\n * @prop {Boolean} eventsEnabled=true\n */\n eventsEnabled: true,\n\n /**\n * Set to true if you want to automatically remove the popper when\n * you call the `destroy` method.\n * @prop {Boolean} removeOnDestroy=false\n */\n removeOnDestroy: false,\n\n /**\n * Callback called when the popper is created.<br />\n * By default, is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onCreate}\n */\n onCreate: function onCreate() {},\n\n /**\n * Callback called when the popper is updated, this callback is not called\n * on the initialization/creation of the popper, but only on subsequent\n * updates.<br />\n * By default, is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onUpdate}\n */\n onUpdate: function onUpdate() {},\n\n /**\n * List of modifiers used to modify the offsets before they are applied to the popper.\n * They provide most of the functionalities of Popper.js\n * @prop {modifiers}\n */\n modifiers: modifiers\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n\n// Utils\n// Methods\nvar Popper = function () {\n /**\n * Create a new Popper.js instance\n * @class Popper\n * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper.\n * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n * @return {Object} instance - The generated Popper.js instance\n */\n function Popper(reference, popper) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n classCallCheck(this, Popper);\n\n this.scheduleUpdate = function () {\n return requestAnimationFrame(_this.update);\n };\n\n // make update() debounced, so that it only runs at most once-per-tick\n this.update = debounce(this.update.bind(this));\n\n // with {} we create a new object with the options inside it\n this.options = _extends({}, Popper.Defaults, options);\n\n // init state\n this.state = {\n isDestroyed: false,\n isCreated: false,\n scrollParents: []\n };\n\n // get reference and popper elements (allow jQuery wrappers)\n this.reference = reference && reference.jquery ? reference[0] : reference;\n this.popper = popper && popper.jquery ? popper[0] : popper;\n\n // Deep merge modifiers options\n this.options.modifiers = {};\n Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n });\n\n // Refactoring modifiers' list (Object => Array)\n this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n return _extends({\n name: name\n }, _this.options.modifiers[name]);\n })\n // sort the modifiers by order\n .sort(function (a, b) {\n return a.order - b.order;\n });\n\n // modifiers have the ability to execute arbitrary code when Popper.js get inited\n // such code is executed in the same order of its modifier\n // they could add new properties to their options configuration\n // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n this.modifiers.forEach(function (modifierOptions) {\n if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n }\n });\n\n // fire the first update to position the popper in the right place\n this.update();\n\n var eventsEnabled = this.options.eventsEnabled;\n if (eventsEnabled) {\n // setup event listeners, they will take care of update the position in specific situations\n this.enableEventListeners();\n }\n\n this.state.eventsEnabled = eventsEnabled;\n }\n\n // We can't use class properties because they don't get listed in the\n // class prototype and break stuff like Sinon stubs\n\n\n createClass(Popper, [{\n key: 'update',\n value: function update$$1() {\n return update.call(this);\n }\n }, {\n key: 'destroy',\n value: function destroy$$1() {\n return destroy.call(this);\n }\n }, {\n key: 'enableEventListeners',\n value: function enableEventListeners$$1() {\n return enableEventListeners.call(this);\n }\n }, {\n key: 'disableEventListeners',\n value: function disableEventListeners$$1() {\n return disableEventListeners.call(this);\n }\n\n /**\n * Schedule an update, it will run on the next UI update available\n * @method scheduleUpdate\n * @memberof Popper\n */\n\n\n /**\n * Collection of utilities useful when writing custom modifiers.\n * Starting from version 1.7, this method is available only if you\n * include `popper-utils.js` before `popper.js`.\n *\n * **DEPRECATION**: This way to access PopperUtils is deprecated\n * and will be removed in v2! Use the PopperUtils module directly instead.\n * Due to the high instability of the methods contained in Utils, we can't\n * guarantee them to follow semver. Use them at your own risk!\n * @static\n * @private\n * @type {Object}\n * @deprecated since version 1.8\n * @member Utils\n * @memberof Popper\n */\n\n }]);\n return Popper;\n}();\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\n\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Popper);\n//# sourceMappingURL=popper.js.map\n\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(2)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcG9wcGVyLmpzL2Rpc3QvZXNtL3BvcHBlci5qcz82NjBjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxrQ0FBa0M7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsSUFBSTtBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQixjQUFjLE9BQU87QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7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QUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixhQUFhLFFBQVE7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QixXQUFXLFlBQVk7QUFDdkIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsWUFBWTtBQUN2QixXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxvQkFBb0I7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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QUFDQSxjQUFjLE9BQU87QUFDckI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiFcbiAqIEBmaWxlT3ZlcnZpZXcgS2lja2FzcyBsaWJyYXJ5IHRvIGNyZWF0ZSBhbmQgcGxhY2UgcG9wcGVycyBuZWFyIHRoZWlyIHJlZmVyZW5jZSBlbGVtZW50cy5cbiAqIEB2ZXJzaW9uIDEuMTQuM1xuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiBGZWRlcmljbyBaaXZvbG8gYW5kIGNvbnRyaWJ1dG9yc1xuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cbnZhciBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuXG52YXIgbG9uZ2VyVGltZW91dEJyb3dzZXJzID0gWydFZGdlJywgJ1RyaWRlbnQnLCAnRmlyZWZveCddO1xudmFyIHRpbWVvdXREdXJhdGlvbiA9IDA7XG5mb3IgKHZhciBpID0gMDsgaSA8IGxvbmdlclRpbWVvdXRCcm93c2Vycy5sZW5ndGg7IGkgKz0gMSkge1xuICBpZiAoaXNCcm93c2VyICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihsb25nZXJUaW1lb3V0QnJvd3NlcnNbaV0pID49IDApIHtcbiAgICB0aW1lb3V0RHVyYXRpb24gPSAxO1xuICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1pY3JvdGFza0RlYm91bmNlKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgd2luZG93LlByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGVkID0gZmFsc2U7XG4gICAgICBmbigpO1xuICAgIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0YXNrRGVib3VuY2UoZm4pIHtcbiAgdmFyIHNjaGVkdWxlZCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghc2NoZWR1bGVkKSB7XG4gICAgICBzY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgICBmbigpO1xuICAgICAgfSwgdGltZW91dER1cmF0aW9uKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBzdXBwb3J0c01pY3JvVGFza3MgPSBpc0Jyb3dzZXIgJiYgd2luZG93LlByb21pc2U7XG5cbi8qKlxuKiBDcmVhdGUgYSBkZWJvdW5jZWQgdmVyc2lvbiBvZiBhIG1ldGhvZCwgdGhhdCdzIGFzeW5jaHJvbm91c2x5IGRlZmVycmVkXG4qIGJ1dCBjYWxsZWQgaW4gdGhlIG1pbmltdW0gdGltZSBwb3NzaWJsZS5cbipcbiogQG1ldGhvZFxuKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4qIEBhcmd1bWVudCB7RnVuY3Rpb259IGZuXG4qIEByZXR1cm5zIHtGdW5jdGlvbn1cbiovXG52YXIgZGVib3VuY2UgPSBzdXBwb3J0c01pY3JvVGFza3MgPyBtaWNyb3Rhc2tEZWJvdW5jZSA6IHRhc2tEZWJvdW5jZTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYSBmdW5jdGlvblxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtBbnl9IGZ1bmN0aW9uVG9DaGVjayAtIHZhcmlhYmxlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYW5zd2VyIHRvOiBpcyBhIGZ1bmN0aW9uP1xuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGZ1bmN0aW9uVG9DaGVjaykge1xuICB2YXIgZ2V0VHlwZSA9IHt9O1xuICByZXR1cm4gZnVuY3Rpb25Ub0NoZWNrICYmIGdldFR5cGUudG9TdHJpbmcuY2FsbChmdW5jdGlvblRvQ2hlY2spID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuXG4vKipcbiAqIEdldCBDU1MgY29tcHV0ZWQgcHJvcGVydHkgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWVtZW50fSBlbGVtZW50XG4gKiBAYXJndW1lbnQge1N0cmluZ30gcHJvcGVydHlcbiAqL1xuZnVuY3Rpb24gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5KSB7XG4gIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9PSAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG4gIHZhciBjc3MgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpO1xuICByZXR1cm4gcHJvcGVydHkgPyBjc3NbcHJvcGVydHldIDogY3NzO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcmVudE5vZGUgb3IgdGhlIGhvc3Qgb2YgdGhlIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IHBhcmVudFxuICovXG5mdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHJldHVybiBlbGVtZW50LnBhcmVudE5vZGUgfHwgZWxlbWVudC5ob3N0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNjcm9sbGluZyBwYXJlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IHNjcm9sbCBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gUmV0dXJuIGJvZHksIGBnZXRTY3JvbGxgIHdpbGwgdGFrZSBjYXJlIHRvIGdldCB0aGUgY29ycmVjdCBgc2Nyb2xsVG9wYCBmcm9tIGl0XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgc3dpdGNoIChlbGVtZW50Lm5vZGVOYW1lKSB7XG4gICAgY2FzZSAnSFRNTCc6XG4gICAgY2FzZSAnQk9EWSc6XG4gICAgICByZXR1cm4gZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHk7XG4gICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgIHJldHVybiBlbGVtZW50LmJvZHk7XG4gIH1cblxuICAvLyBGaXJlZm94IHdhbnQgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcblxuICB2YXIgX2dldFN0eWxlQ29tcHV0ZWRQcm9wID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQpLFxuICAgICAgb3ZlcmZsb3cgPSBfZ2V0U3R5bGVDb21wdXRlZFByb3Aub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0U3R5bGVDb21wdXRlZFByb3Aub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldFN0eWxlQ29tcHV0ZWRQcm9wLm92ZXJmbG93WTtcblxuICBpZiAoLyhhdXRvfHNjcm9sbHxvdmVybGF5KS8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCkpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG59XG5cbnZhciBpc0lFMTEgPSBpc0Jyb3dzZXIgJiYgISEod2luZG93Lk1TSW5wdXRNZXRob2RDb250ZXh0ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSk7XG52YXIgaXNJRTEwID0gaXNCcm93c2VyICYmIC9NU0lFIDEwLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGJyb3dzZXIgaXMgSW50ZXJuZXQgRXhwbG9yZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXNJRVxuICovXG5mdW5jdGlvbiBpc0lFKHZlcnNpb24pIHtcbiAgaWYgKHZlcnNpb24gPT09IDExKSB7XG4gICAgcmV0dXJuIGlzSUUxMTtcbiAgfVxuICBpZiAodmVyc2lvbiA9PT0gMTApIHtcbiAgICByZXR1cm4gaXNJRTEwO1xuICB9XG4gIHJldHVybiBpc0lFMTEgfHwgaXNJRTEwO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG9mZnNldCBwYXJlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IG9mZnNldCBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIHZhciBub09mZnNldFBhcmVudCA9IGlzSUUoMTApID8gZG9jdW1lbnQuYm9keSA6IG51bGw7XG5cbiAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcbiAgdmFyIG9mZnNldFBhcmVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50O1xuICAvLyBTa2lwIGhpZGRlbiBlbGVtZW50cyB3aGljaCBkb24ndCBoYXZlIGFuIG9mZnNldFBhcmVudFxuICB3aGlsZSAob2Zmc2V0UGFyZW50ID09PSBub09mZnNldFBhcmVudCAmJiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZykge1xuICAgIG9mZnNldFBhcmVudCA9IChlbGVtZW50ID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpLm9mZnNldFBhcmVudDtcbiAgfVxuXG4gIHZhciBub2RlTmFtZSA9IG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQubm9kZU5hbWU7XG5cbiAgaWYgKCFub2RlTmFtZSB8fCBub2RlTmFtZSA9PT0gJ0JPRFknIHx8IG5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICByZXR1cm4gZWxlbWVudCA/IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cblxuICAvLyAub2Zmc2V0UGFyZW50IHdpbGwgcmV0dXJuIHRoZSBjbG9zZXN0IFREIG9yIFRBQkxFIGluIGNhc2VcbiAgLy8gbm8gb2Zmc2V0UGFyZW50IGlzIHByZXNlbnQsIEkgaGF0ZSB0aGlzIGpvYi4uLlxuICBpZiAoWydURCcsICdUQUJMRSddLmluZGV4T2Yob2Zmc2V0UGFyZW50Lm5vZGVOYW1lKSAhPT0gLTEgJiYgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgcmV0dXJuIGdldE9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudDtcbn1cblxuZnVuY3Rpb24gaXNPZmZzZXRDb250YWluZXIoZWxlbWVudCkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuXG4gIGlmIChub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBub2RlTmFtZSA9PT0gJ0hUTUwnIHx8IGdldE9mZnNldFBhcmVudChlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKSA9PT0gZWxlbWVudDtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgcm9vdCBub2RlIChkb2N1bWVudCwgc2hhZG93RE9NIHJvb3QpIG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IG5vZGVcbiAqIEByZXR1cm5zIHtFbGVtZW50fSByb290IG5vZGVcbiAqL1xuZnVuY3Rpb24gZ2V0Um9vdChub2RlKSB7XG4gIGlmIChub2RlLnBhcmVudE5vZGUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gZ2V0Um9vdChub2RlLnBhcmVudE5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG9mZnNldCBwYXJlbnQgY29tbW9uIHRvIHRoZSB0d28gcHJvdmlkZWQgbm9kZXNcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudDFcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudDJcbiAqIEByZXR1cm5zIHtFbGVtZW50fSBjb21tb24gb2Zmc2V0IHBhcmVudFxuICovXG5mdW5jdGlvbiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQxLCBlbGVtZW50Mikge1xuICAvLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCB0byBhdm9pZCBlcnJvcnMgaW4gY2FzZSBvbmUgb2YgdGhlIGVsZW1lbnRzIGlzbid0IGRlZmluZWQgZm9yIGFueSByZWFzb25cbiAgaWYgKCFlbGVtZW50MSB8fCAhZWxlbWVudDEubm9kZVR5cGUgfHwgIWVsZW1lbnQyIHx8ICFlbGVtZW50Mi5ub2RlVHlwZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cblxuICAvLyBIZXJlIHdlIG1ha2Ugc3VyZSB0byBnaXZlIGFzIFwic3RhcnRcIiB0aGUgZWxlbWVudCB0aGF0IGNvbWVzIGZpcnN0IGluIHRoZSBET01cbiAgdmFyIG9yZGVyID0gZWxlbWVudDEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbWVudDIpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkc7XG4gIHZhciBzdGFydCA9IG9yZGVyID8gZWxlbWVudDEgOiBlbGVtZW50MjtcbiAgdmFyIGVuZCA9IG9yZGVyID8gZWxlbWVudDIgOiBlbGVtZW50MTtcblxuICAvLyBHZXQgY29tbW9uIGFuY2VzdG9yIGNvbnRhaW5lclxuICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICByYW5nZS5zZXRTdGFydChzdGFydCwgMCk7XG4gIHJhbmdlLnNldEVuZChlbmQsIDApO1xuICB2YXIgY29tbW9uQW5jZXN0b3JDb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAvLyBCb3RoIG5vZGVzIGFyZSBpbnNpZGUgI2RvY3VtZW50XG5cbiAgaWYgKGVsZW1lbnQxICE9PSBjb21tb25BbmNlc3RvckNvbnRhaW5lciAmJiBlbGVtZW50MiAhPT0gY29tbW9uQW5jZXN0b3JDb250YWluZXIgfHwgc3RhcnQuY29udGFpbnMoZW5kKSkge1xuICAgIGlmIChpc09mZnNldENvbnRhaW5lcihjb21tb25BbmNlc3RvckNvbnRhaW5lcikpIHtcbiAgICAgIHJldHVybiBjb21tb25BbmNlc3RvckNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0T2Zmc2V0UGFyZW50KGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKTtcbiAgfVxuXG4gIC8vIG9uZSBvZiB0aGUgbm9kZXMgaXMgaW5zaWRlIHNoYWRvd0RPTSwgZmluZCB3aGljaCBvbmVcbiAgdmFyIGVsZW1lbnQxcm9vdCA9IGdldFJvb3QoZWxlbWVudDEpO1xuICBpZiAoZWxlbWVudDFyb290Lmhvc3QpIHtcbiAgICByZXR1cm4gZmluZENvbW1vbk9mZnNldFBhcmVudChlbGVtZW50MXJvb3QuaG9zdCwgZWxlbWVudDIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQxLCBnZXRSb290KGVsZW1lbnQyKS5ob3N0KTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgdGhlIHNjcm9sbCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBpbiB0aGUgZ2l2ZW4gc2lkZSAodG9wIGFuZCBsZWZ0KVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAYXJndW1lbnQge1N0cmluZ30gc2lkZSBgdG9wYCBvciBgbGVmdGBcbiAqIEByZXR1cm5zIHtudW1iZXJ9IGFtb3VudCBvZiBzY3JvbGxlZCBwaXhlbHNcbiAqL1xuZnVuY3Rpb24gZ2V0U2Nyb2xsKGVsZW1lbnQpIHtcbiAgdmFyIHNpZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICd0b3AnO1xuXG4gIHZhciB1cHBlclNpZGUgPSBzaWRlID09PSAndG9wJyA/ICdzY3JvbGxUb3AnIDogJ3Njcm9sbExlZnQnO1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuXG4gIGlmIChub2RlTmFtZSA9PT0gJ0JPRFknIHx8IG5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICB2YXIgaHRtbCA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdmFyIHNjcm9sbGluZ0VsZW1lbnQgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCB8fCBodG1sO1xuICAgIHJldHVybiBzY3JvbGxpbmdFbGVtZW50W3VwcGVyU2lkZV07XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFt1cHBlclNpZGVdO1xufVxuXG4vKlxuICogU3VtIG9yIHN1YnRyYWN0IHRoZSBlbGVtZW50IHNjcm9sbCB2YWx1ZXMgKGxlZnQgYW5kIHRvcCkgZnJvbSBhIGdpdmVuIHJlY3Qgb2JqZWN0XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge09iamVjdH0gcmVjdCAtIFJlY3Qgb2JqZWN0IHlvdSB3YW50IHRvIGNoYW5nZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IGZyb20gdGhlIGZ1bmN0aW9uIHJlYWRzIHRoZSBzY3JvbGwgdmFsdWVzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHN1YnRyYWN0IC0gc2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gc3VidHJhY3QgdGhlIHNjcm9sbCB2YWx1ZXNcbiAqIEByZXR1cm4ge09iamVjdH0gcmVjdCAtIFRoZSBtb2RpZmllciByZWN0IG9iamVjdFxuICovXG5mdW5jdGlvbiBpbmNsdWRlU2Nyb2xsKHJlY3QsIGVsZW1lbnQpIHtcbiAgdmFyIHN1YnRyYWN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcblxuICB2YXIgc2Nyb2xsVG9wID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICd0b3AnKTtcbiAgdmFyIHNjcm9sbExlZnQgPSBnZXRTY3JvbGwoZWxlbWVudCwgJ2xlZnQnKTtcbiAgdmFyIG1vZGlmaWVyID0gc3VidHJhY3QgPyAtMSA6IDE7XG4gIHJlY3QudG9wICs9IHNjcm9sbFRvcCAqIG1vZGlmaWVyO1xuICByZWN0LmJvdHRvbSArPSBzY3JvbGxUb3AgKiBtb2RpZmllcjtcbiAgcmVjdC5sZWZ0ICs9IHNjcm9sbExlZnQgKiBtb2RpZmllcjtcbiAgcmVjdC5yaWdodCArPSBzY3JvbGxMZWZ0ICogbW9kaWZpZXI7XG4gIHJldHVybiByZWN0O1xufVxuXG4vKlxuICogSGVscGVyIHRvIGRldGVjdCBib3JkZXJzIG9mIGEgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtDU1NTdHlsZURlY2xhcmF0aW9ufSBzdHlsZXNcbiAqIFJlc3VsdCBvZiBgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5YCBvbiB0aGUgZ2l2ZW4gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IGF4aXMgLSBgeGAgb3IgYHlgXG4gKiBAcmV0dXJuIHtudW1iZXJ9IGJvcmRlcnMgLSBUaGUgYm9yZGVycyBzaXplIG9mIHRoZSBnaXZlbiBheGlzXG4gKi9cblxuZnVuY3Rpb24gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCBheGlzKSB7XG4gIHZhciBzaWRlQSA9IGF4aXMgPT09ICd4JyA/ICdMZWZ0JyA6ICdUb3AnO1xuICB2YXIgc2lkZUIgPSBzaWRlQSA9PT0gJ0xlZnQnID8gJ1JpZ2h0JyA6ICdCb3R0b20nO1xuXG4gIHJldHVybiBwYXJzZUZsb2F0KHN0eWxlc1snYm9yZGVyJyArIHNpZGVBICsgJ1dpZHRoJ10sIDEwKSArIHBhcnNlRmxvYXQoc3R5bGVzWydib3JkZXInICsgc2lkZUIgKyAnV2lkdGgnXSwgMTApO1xufVxuXG5mdW5jdGlvbiBnZXRTaXplKGF4aXMsIGJvZHksIGh0bWwsIGNvbXB1dGVkU3R5bGUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KGJvZHlbJ29mZnNldCcgKyBheGlzXSwgYm9keVsnc2Nyb2xsJyArIGF4aXNdLCBodG1sWydjbGllbnQnICsgYXhpc10sIGh0bWxbJ29mZnNldCcgKyBheGlzXSwgaHRtbFsnc2Nyb2xsJyArIGF4aXNdLCBpc0lFKDEwKSA/IGh0bWxbJ29mZnNldCcgKyBheGlzXSArIGNvbXB1dGVkU3R5bGVbJ21hcmdpbicgKyAoYXhpcyA9PT0gJ0hlaWdodCcgPyAnVG9wJyA6ICdMZWZ0JyldICsgY29tcHV0ZWRTdHlsZVsnbWFyZ2luJyArIChheGlzID09PSAnSGVpZ2h0JyA/ICdCb3R0b20nIDogJ1JpZ2h0JyldIDogMCk7XG59XG5cbmZ1bmN0aW9uIGdldFdpbmRvd1NpemVzKCkge1xuICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gIHZhciBodG1sID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB2YXIgY29tcHV0ZWRTdHlsZSA9IGlzSUUoMTApICYmIGdldENvbXB1dGVkU3R5bGUoaHRtbCk7XG5cbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IGdldFNpemUoJ0hlaWdodCcsIGJvZHksIGh0bWwsIGNvbXB1dGVkU3R5bGUpLFxuICAgIHdpZHRoOiBnZXRTaXplKCdXaWR0aCcsIGJvZHksIGh0bWwsIGNvbXB1dGVkU3R5bGUpXG4gIH07XG59XG5cbnZhciBjbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59O1xuXG52YXIgY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCk7XG5cblxuXG5cblxudmFyIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuLyoqXG4gKiBHaXZlbiBlbGVtZW50IG9mZnNldHMsIGdlbmVyYXRlIGFuIG91dHB1dCBzaW1pbGFyIHRvIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IG9mZnNldHNcbiAqIEByZXR1cm5zIHtPYmplY3R9IENsaWVudFJlY3QgbGlrZSBvdXRwdXRcbiAqL1xuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdChvZmZzZXRzKSB7XG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgb2Zmc2V0cywge1xuICAgIHJpZ2h0OiBvZmZzZXRzLmxlZnQgKyBvZmZzZXRzLndpZHRoLFxuICAgIGJvdHRvbTogb2Zmc2V0cy50b3AgKyBvZmZzZXRzLmhlaWdodFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgYm91bmRpbmcgY2xpZW50IHJlY3Qgb2YgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybiB7T2JqZWN0fSBjbGllbnQgcmVjdFxuICovXG5mdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IHt9O1xuXG4gIC8vIElFMTAgMTAgRklYOiBQbGVhc2UsIGRvbid0IGFzaywgdGhlIGVsZW1lbnQgaXNuJ3RcbiAgLy8gY29uc2lkZXJlZCBpbiBET00gaW4gc29tZSBjaXJjdW1zdGFuY2VzLi4uXG4gIC8vIFRoaXMgaXNuJ3QgcmVwcm9kdWNpYmxlIGluIElFMTAgY29tcGF0aWJpbGl0eSBtb2RlIG9mIElFMTFcbiAgdHJ5IHtcbiAgICBpZiAoaXNJRSgxMCkpIHtcbiAgICAgIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIHNjcm9sbFRvcCA9IGdldFNjcm9sbChlbGVtZW50LCAndG9wJyk7XG4gICAgICB2YXIgc2Nyb2xsTGVmdCA9IGdldFNjcm9sbChlbGVtZW50LCAnbGVmdCcpO1xuICAgICAgcmVjdC50b3AgKz0gc2Nyb2xsVG9wO1xuICAgICAgcmVjdC5sZWZ0ICs9IHNjcm9sbExlZnQ7XG4gICAgICByZWN0LmJvdHRvbSArPSBzY3JvbGxUb3A7XG4gICAgICByZWN0LnJpZ2h0ICs9IHNjcm9sbExlZnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0ge1xuICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICB0b3A6IHJlY3QudG9wLFxuICAgIHdpZHRoOiByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LFxuICAgIGhlaWdodDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuICB9O1xuXG4gIC8vIHN1YnRyYWN0IHNjcm9sbGJhciBzaXplIGZyb20gc2l6ZXNcbiAgdmFyIHNpemVzID0gZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0hUTUwnID8gZ2V0V2luZG93U2l6ZXMoKSA6IHt9O1xuICB2YXIgd2lkdGggPSBzaXplcy53aWR0aCB8fCBlbGVtZW50LmNsaWVudFdpZHRoIHx8IHJlc3VsdC5yaWdodCAtIHJlc3VsdC5sZWZ0O1xuICB2YXIgaGVpZ2h0ID0gc2l6ZXMuaGVpZ2h0IHx8IGVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IHJlc3VsdC5ib3R0b20gLSByZXN1bHQudG9wO1xuXG4gIHZhciBob3JpelNjcm9sbGJhciA9IGVsZW1lbnQub2Zmc2V0V2lkdGggLSB3aWR0aDtcbiAgdmFyIHZlcnRTY3JvbGxiYXIgPSBlbGVtZW50Lm9mZnNldEhlaWdodCAtIGhlaWdodDtcblxuICAvLyBpZiBhbiBoeXBvdGhldGljYWwgc2Nyb2xsYmFyIGlzIGRldGVjdGVkLCB3ZSBtdXN0IGJlIHN1cmUgaXQncyBub3QgYSBgYm9yZGVyYFxuICAvLyB3ZSBtYWtlIHRoaXMgY2hlY2sgY29uZGl0aW9uYWwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnNcbiAgaWYgKGhvcml6U2Nyb2xsYmFyIHx8IHZlcnRTY3JvbGxiYXIpIHtcbiAgICB2YXIgc3R5bGVzID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQpO1xuICAgIGhvcml6U2Nyb2xsYmFyIC09IGdldEJvcmRlcnNTaXplKHN0eWxlcywgJ3gnKTtcbiAgICB2ZXJ0U2Nyb2xsYmFyIC09IGdldEJvcmRlcnNTaXplKHN0eWxlcywgJ3knKTtcblxuICAgIHJlc3VsdC53aWR0aCAtPSBob3JpelNjcm9sbGJhcjtcbiAgICByZXN1bHQuaGVpZ2h0IC09IHZlcnRTY3JvbGxiYXI7XG4gIH1cblxuICByZXR1cm4gZ2V0Q2xpZW50UmVjdChyZXN1bHQpO1xufVxuXG5mdW5jdGlvbiBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUoY2hpbGRyZW4sIHBhcmVudCkge1xuICB2YXIgZml4ZWRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG5cbiAgdmFyIGlzSUUxMCA9IGlzSUUoMTApO1xuICB2YXIgaXNIVE1MID0gcGFyZW50Lm5vZGVOYW1lID09PSAnSFRNTCc7XG4gIHZhciBjaGlsZHJlblJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoY2hpbGRyZW4pO1xuICB2YXIgcGFyZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChwYXJlbnQpO1xuICB2YXIgc2Nyb2xsUGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KGNoaWxkcmVuKTtcblxuICB2YXIgc3R5bGVzID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KHBhcmVudCk7XG4gIHZhciBib3JkZXJUb3BXaWR0aCA9IHBhcnNlRmxvYXQoc3R5bGVzLmJvcmRlclRvcFdpZHRoLCAxMCk7XG4gIHZhciBib3JkZXJMZWZ0V2lkdGggPSBwYXJzZUZsb2F0KHN0eWxlcy5ib3JkZXJMZWZ0V2lkdGgsIDEwKTtcblxuICAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgcGFyZW50IGlzIGZpeGVkLCB3ZSBtdXN0IGlnbm9yZSBuZWdhdGl2ZSBzY3JvbGwgaW4gb2Zmc2V0IGNhbGNcbiAgaWYgKGZpeGVkUG9zaXRpb24gJiYgcGFyZW50Lm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICBwYXJlbnRSZWN0LnRvcCA9IE1hdGgubWF4KHBhcmVudFJlY3QudG9wLCAwKTtcbiAgICBwYXJlbnRSZWN0LmxlZnQgPSBNYXRoLm1heChwYXJlbnRSZWN0LmxlZnQsIDApO1xuICB9XG4gIHZhciBvZmZzZXRzID0gZ2V0Q2xpZW50UmVjdCh7XG4gICAgdG9wOiBjaGlsZHJlblJlY3QudG9wIC0gcGFyZW50UmVjdC50b3AgLSBib3JkZXJUb3BXaWR0aCxcbiAgICBsZWZ0OiBjaGlsZHJlblJlY3QubGVmdCAtIHBhcmVudFJlY3QubGVmdCAtIGJvcmRlckxlZnRXaWR0aCxcbiAgICB3aWR0aDogY2hpbGRyZW5SZWN0LndpZHRoLFxuICAgIGhlaWdodDogY2hpbGRyZW5SZWN0LmhlaWdodFxuICB9KTtcbiAgb2Zmc2V0cy5tYXJnaW5Ub3AgPSAwO1xuICBvZmZzZXRzLm1hcmdpbkxlZnQgPSAwO1xuXG4gIC8vIFN1YnRyYWN0IG1hcmdpbnMgb2YgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgaXQncyBiZWluZyB1c2VkIGFzIHBhcmVudFxuICAvLyB3ZSBkbyB0aGlzIG9ubHkgb24gSFRNTCBiZWNhdXNlIGl0J3MgdGhlIG9ubHkgZWxlbWVudCB0aGF0IGJlaGF2ZXNcbiAgLy8gZGlmZmVyZW50bHkgd2hlbiBtYXJnaW5zIGFyZSBhcHBsaWVkIHRvIGl0LiBUaGUgbWFyZ2lucyBhcmUgaW5jbHVkZWQgaW5cbiAgLy8gdGhlIGJveCBvZiB0aGUgZG9jdW1lbnRFbGVtZW50LCBpbiB0aGUgb3RoZXIgY2FzZXMgbm90LlxuICBpZiAoIWlzSUUxMCAmJiBpc0hUTUwpIHtcbiAgICB2YXIgbWFyZ2luVG9wID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luVG9wLCAxMCk7XG4gICAgdmFyIG1hcmdpbkxlZnQgPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5MZWZ0LCAxMCk7XG5cbiAgICBvZmZzZXRzLnRvcCAtPSBib3JkZXJUb3BXaWR0aCAtIG1hcmdpblRvcDtcbiAgICBvZmZzZXRzLmJvdHRvbSAtPSBib3JkZXJUb3BXaWR0aCAtIG1hcmdpblRvcDtcbiAgICBvZmZzZXRzLmxlZnQgLT0gYm9yZGVyTGVmdFdpZHRoIC0gbWFyZ2luTGVmdDtcbiAgICBvZmZzZXRzLnJpZ2h0IC09IGJvcmRlckxlZnRXaWR0aCAtIG1hcmdpbkxlZnQ7XG5cbiAgICAvLyBBdHRhY2ggbWFyZ2luVG9wIGFuZCBtYXJnaW5MZWZ0IGJlY2F1c2UgaW4gc29tZSBjaXJjdW1zdGFuY2VzIHdlIG1heSBuZWVkIHRoZW1cbiAgICBvZmZzZXRzLm1hcmdpblRvcCA9IG1hcmdpblRvcDtcbiAgICBvZmZzZXRzLm1hcmdpbkxlZnQgPSBtYXJnaW5MZWZ0O1xuICB9XG5cbiAgaWYgKGlzSUUxMCAmJiAhZml4ZWRQb3NpdGlvbiA/IHBhcmVudC5jb250YWlucyhzY3JvbGxQYXJlbnQpIDogcGFyZW50ID09PSBzY3JvbGxQYXJlbnQgJiYgc2Nyb2xsUGFyZW50Lm5vZGVOYW1lICE9PSAnQk9EWScpIHtcbiAgICBvZmZzZXRzID0gaW5jbHVkZVNjcm9sbChvZmZzZXRzLCBwYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldHM7XG59XG5cbmZ1bmN0aW9uIGdldFZpZXdwb3J0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcnRiaXRyYXJ5Tm9kZShlbGVtZW50KSB7XG4gIHZhciBleGNsdWRlU2Nyb2xsID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICB2YXIgaHRtbCA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIHZhciByZWxhdGl2ZU9mZnNldCA9IGdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZShlbGVtZW50LCBodG1sKTtcbiAgdmFyIHdpZHRoID0gTWF0aC5tYXgoaHRtbC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7XG4gIHZhciBoZWlnaHQgPSBNYXRoLm1heChodG1sLmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuXG4gIHZhciBzY3JvbGxUb3AgPSAhZXhjbHVkZVNjcm9sbCA/IGdldFNjcm9sbChodG1sKSA6IDA7XG4gIHZhciBzY3JvbGxMZWZ0ID0gIWV4Y2x1ZGVTY3JvbGwgPyBnZXRTY3JvbGwoaHRtbCwgJ2xlZnQnKSA6IDA7XG5cbiAgdmFyIG9mZnNldCA9IHtcbiAgICB0b3A6IHNjcm9sbFRvcCAtIHJlbGF0aXZlT2Zmc2V0LnRvcCArIHJlbGF0aXZlT2Zmc2V0Lm1hcmdpblRvcCxcbiAgICBsZWZ0OiBzY3JvbGxMZWZ0IC0gcmVsYXRpdmVPZmZzZXQubGVmdCArIHJlbGF0aXZlT2Zmc2V0Lm1hcmdpbkxlZnQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG5cbiAgcmV0dXJuIGdldENsaWVudFJlY3Qob2Zmc2V0KTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBmaXhlZCBvciBpcyBpbnNpZGUgYSBmaXhlZCBwYXJlbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQGFyZ3VtZW50IHtFbGVtZW50fSBjdXN0b21Db250YWluZXJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBhbnN3ZXIgdG8gXCJpc0ZpeGVkP1wiXG4gKi9cbmZ1bmN0aW9uIGlzRml4ZWQoZWxlbWVudCkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuICBpZiAobm9kZU5hbWUgPT09ICdCT0RZJyB8fCBub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gaXNGaXhlZChnZXRQYXJlbnROb2RlKGVsZW1lbnQpKTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgZmlyc3QgcGFyZW50IG9mIGFuIGVsZW1lbnQgdGhhdCBoYXMgYSB0cmFuc2Zvcm1lZCBwcm9wZXJ0eSBkZWZpbmVkXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtFbGVtZW50fSBmaXJzdCB0cmFuc2Zvcm1lZCBwYXJlbnQgb3IgZG9jdW1lbnRFbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIC8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIHRvIGF2b2lkIGVycm9ycyBpbiBjYXNlIG9uZSBvZiB0aGUgZWxlbWVudHMgaXNuJ3QgZGVmaW5lZCBmb3IgYW55IHJlYXNvblxuICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQucGFyZW50RWxlbWVudCB8fCBpc0lFKCkpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG4gIHZhciBlbCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgd2hpbGUgKGVsICYmIGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbCwgJ3RyYW5zZm9ybScpID09PSAnbm9uZScpIHtcbiAgICBlbCA9IGVsLnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGVsIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbn1cblxuLyoqXG4gKiBDb21wdXRlZCB0aGUgYm91bmRhcmllcyBsaW1pdHMgYW5kIHJldHVybiB0aGVtXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwb3BwZXJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZVxuICogQHBhcmFtIHtudW1iZXJ9IHBhZGRpbmdcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGJvdW5kYXJpZXNFbGVtZW50IC0gRWxlbWVudCB1c2VkIHRvIGRlZmluZSB0aGUgYm91bmRhcmllc1xuICogQHBhcmFtIHtCb29sZWFufSBmaXhlZFBvc2l0aW9uIC0gSXMgaW4gZml4ZWQgcG9zaXRpb24gbW9kZVxuICogQHJldHVybnMge09iamVjdH0gQ29vcmRpbmF0ZXMgb2YgdGhlIGJvdW5kYXJpZXNcbiAqL1xuZnVuY3Rpb24gZ2V0Qm91bmRhcmllcyhwb3BwZXIsIHJlZmVyZW5jZSwgcGFkZGluZywgYm91bmRhcmllc0VsZW1lbnQpIHtcbiAgdmFyIGZpeGVkUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IGZhbHNlO1xuXG4gIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG5cbiAgdmFyIGJvdW5kYXJpZXMgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZml4ZWRQb3NpdGlvbiA/IGdldEZpeGVkUG9zaXRpb25PZmZzZXRQYXJlbnQocG9wcGVyKSA6IGZpbmRDb21tb25PZmZzZXRQYXJlbnQocG9wcGVyLCByZWZlcmVuY2UpO1xuXG4gIC8vIEhhbmRsZSB2aWV3cG9ydCBjYXNlXG4gIGlmIChib3VuZGFyaWVzRWxlbWVudCA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgIGJvdW5kYXJpZXMgPSBnZXRWaWV3cG9ydE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJ0Yml0cmFyeU5vZGUob2Zmc2V0UGFyZW50LCBmaXhlZFBvc2l0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBIYW5kbGUgb3RoZXIgY2FzZXMgYmFzZWQgb24gRE9NIGVsZW1lbnQgdXNlZCBhcyBib3VuZGFyaWVzXG4gICAgdmFyIGJvdW5kYXJpZXNOb2RlID0gdm9pZCAwO1xuICAgIGlmIChib3VuZGFyaWVzRWxlbWVudCA9PT0gJ3Njcm9sbFBhcmVudCcpIHtcbiAgICAgIGJvdW5kYXJpZXNOb2RlID0gZ2V0U2Nyb2xsUGFyZW50KGdldFBhcmVudE5vZGUocmVmZXJlbmNlKSk7XG4gICAgICBpZiAoYm91bmRhcmllc05vZGUubm9kZU5hbWUgPT09ICdCT0RZJykge1xuICAgICAgICBib3VuZGFyaWVzTm9kZSA9IHBvcHBlci5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAnd2luZG93Jykge1xuICAgICAgYm91bmRhcmllc05vZGUgPSBwb3BwZXIub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvdW5kYXJpZXNOb2RlID0gYm91bmRhcmllc0VsZW1lbnQ7XG4gICAgfVxuXG4gICAgdmFyIG9mZnNldHMgPSBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUoYm91bmRhcmllc05vZGUsIG9mZnNldFBhcmVudCwgZml4ZWRQb3NpdGlvbik7XG5cbiAgICAvLyBJbiBjYXNlIG9mIEhUTUwsIHdlIG5lZWQgYSBkaWZmZXJlbnQgY29tcHV0YXRpb25cbiAgICBpZiAoYm91bmRhcmllc05vZGUubm9kZU5hbWUgPT09ICdIVE1MJyAmJiAhaXNGaXhlZChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICB2YXIgX2dldFdpbmRvd1NpemVzID0gZ2V0V2luZG93U2l6ZXMoKSxcbiAgICAgICAgICBoZWlnaHQgPSBfZ2V0V2luZG93U2l6ZXMuaGVpZ2h0LFxuICAgICAgICAgIHdpZHRoID0gX2dldFdpbmRvd1NpemVzLndpZHRoO1xuXG4gICAgICBib3VuZGFyaWVzLnRvcCArPSBvZmZzZXRzLnRvcCAtIG9mZnNldHMubWFyZ2luVG9wO1xuICAgICAgYm91bmRhcmllcy5ib3R0b20gPSBoZWlnaHQgKyBvZmZzZXRzLnRvcDtcbiAgICAgIGJvdW5kYXJpZXMubGVmdCArPSBvZmZzZXRzLmxlZnQgLSBvZmZzZXRzLm1hcmdpbkxlZnQ7XG4gICAgICBib3VuZGFyaWVzLnJpZ2h0ID0gd2lkdGggKyBvZmZzZXRzLmxlZnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZvciBhbGwgdGhlIG90aGVyIERPTSBlbGVtZW50cywgdGhpcyBvbmUgaXMgZ29vZFxuICAgICAgYm91bmRhcmllcyA9IG9mZnNldHM7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIHBhZGRpbmdzXG4gIGJvdW5kYXJpZXMubGVmdCArPSBwYWRkaW5nO1xuICBib3VuZGFyaWVzLnRvcCArPSBwYWRkaW5nO1xuICBib3VuZGFyaWVzLnJpZ2h0IC09IHBhZGRpbmc7XG4gIGJvdW5kYXJpZXMuYm90dG9tIC09IHBhZGRpbmc7XG5cbiAgcmV0dXJuIGJvdW5kYXJpZXM7XG59XG5cbmZ1bmN0aW9uIGdldEFyZWEoX3JlZikge1xuICB2YXIgd2lkdGggPSBfcmVmLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX3JlZi5oZWlnaHQ7XG5cbiAgcmV0dXJuIHdpZHRoICogaGVpZ2h0O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdXNlZCB0byB0cmFuc2Zvcm0gdGhlIGBhdXRvYCBwbGFjZW1lbnQgdG8gdGhlIHBsYWNlbWVudCB3aXRoIG1vcmVcbiAqIGF2YWlsYWJsZSBzcGFjZS5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVBdXRvUGxhY2VtZW50KHBsYWNlbWVudCwgcmVmUmVjdCwgcG9wcGVyLCByZWZlcmVuY2UsIGJvdW5kYXJpZXNFbGVtZW50KSB7XG4gIHZhciBwYWRkaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiAwO1xuXG4gIGlmIChwbGFjZW1lbnQuaW5kZXhPZignYXV0bycpID09PSAtMSkge1xuICAgIHJldHVybiBwbGFjZW1lbnQ7XG4gIH1cblxuICB2YXIgYm91bmRhcmllcyA9IGdldEJvdW5kYXJpZXMocG9wcGVyLCByZWZlcmVuY2UsIHBhZGRpbmcsIGJvdW5kYXJpZXNFbGVtZW50KTtcblxuICB2YXIgcmVjdHMgPSB7XG4gICAgdG9wOiB7XG4gICAgICB3aWR0aDogYm91bmRhcmllcy53aWR0aCxcbiAgICAgIGhlaWdodDogcmVmUmVjdC50b3AgLSBib3VuZGFyaWVzLnRvcFxuICAgIH0sXG4gICAgcmlnaHQ6IHtcbiAgICAgIHdpZHRoOiBib3VuZGFyaWVzLnJpZ2h0IC0gcmVmUmVjdC5yaWdodCxcbiAgICAgIGhlaWdodDogYm91bmRhcmllcy5oZWlnaHRcbiAgICB9LFxuICAgIGJvdHRvbToge1xuICAgICAgd2lkdGg6IGJvdW5kYXJpZXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IGJvdW5kYXJpZXMuYm90dG9tIC0gcmVmUmVjdC5ib3R0b21cbiAgICB9LFxuICAgIGxlZnQ6IHtcbiAgICAgIHdpZHRoOiByZWZSZWN0LmxlZnQgLSBib3VuZGFyaWVzLmxlZnQsXG4gICAgICBoZWlnaHQ6IGJvdW5kYXJpZXMuaGVpZ2h0XG4gICAgfVxuICB9O1xuXG4gIHZhciBzb3J0ZWRBcmVhcyA9IE9iamVjdC5rZXlzKHJlY3RzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICBrZXk6IGtleVxuICAgIH0sIHJlY3RzW2tleV0sIHtcbiAgICAgIGFyZWE6IGdldEFyZWEocmVjdHNba2V5XSlcbiAgICB9KTtcbiAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLmFyZWEgLSBhLmFyZWE7XG4gIH0pO1xuXG4gIHZhciBmaWx0ZXJlZEFyZWFzID0gc29ydGVkQXJlYXMuZmlsdGVyKGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciB3aWR0aCA9IF9yZWYyLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfcmVmMi5oZWlnaHQ7XG4gICAgcmV0dXJuIHdpZHRoID49IHBvcHBlci5jbGllbnRXaWR0aCAmJiBoZWlnaHQgPj0gcG9wcGVyLmNsaWVudEhlaWdodDtcbiAgfSk7XG5cbiAgdmFyIGNvbXB1dGVkUGxhY2VtZW50ID0gZmlsdGVyZWRBcmVhcy5sZW5ndGggPiAwID8gZmlsdGVyZWRBcmVhc1swXS5rZXkgOiBzb3J0ZWRBcmVhc1swXS5rZXk7XG5cbiAgdmFyIHZhcmlhdGlvbiA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xuXG4gIHJldHVybiBjb21wdXRlZFBsYWNlbWVudCArICh2YXJpYXRpb24gPyAnLScgKyB2YXJpYXRpb24gOiAnJyk7XG59XG5cbi8qKlxuICogR2V0IG9mZnNldHMgdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7RWxlbWVudH0gcG9wcGVyIC0gdGhlIHBvcHBlciBlbGVtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHJlZmVyZW5jZSAtIHRoZSByZWZlcmVuY2UgZWxlbWVudCAodGhlIHBvcHBlciB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMpXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGZpeGVkUG9zaXRpb24gLSBpcyBpbiBmaXhlZCBwb3NpdGlvbiBtb2RlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgb2Zmc2V0cyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlclxuICovXG5mdW5jdGlvbiBnZXRSZWZlcmVuY2VPZmZzZXRzKHN0YXRlLCBwb3BwZXIsIHJlZmVyZW5jZSkge1xuICB2YXIgZml4ZWRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICB2YXIgY29tbW9uT2Zmc2V0UGFyZW50ID0gZml4ZWRQb3NpdGlvbiA/IGdldEZpeGVkUG9zaXRpb25PZmZzZXRQYXJlbnQocG9wcGVyKSA6IGZpbmRDb21tb25PZmZzZXRQYXJlbnQocG9wcGVyLCByZWZlcmVuY2UpO1xuICByZXR1cm4gZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcmJpdHJhcnlOb2RlKHJlZmVyZW5jZSwgY29tbW9uT2Zmc2V0UGFyZW50LCBmaXhlZFBvc2l0aW9uKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG91dGVyIHNpemVzIG9mIHRoZSBnaXZlbiBlbGVtZW50IChvZmZzZXQgc2l6ZSArIG1hcmdpbnMpXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IG9iamVjdCBjb250YWluaW5nIHdpZHRoIGFuZCBoZWlnaHQgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBnZXRPdXRlclNpemVzKGVsZW1lbnQpIHtcbiAgdmFyIHN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gIHZhciB4ID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luVG9wKSArIHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpbkJvdHRvbSk7XG4gIHZhciB5ID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luTGVmdCkgKyBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5SaWdodCk7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGggKyB5LFxuICAgIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQgKyB4XG4gIH07XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBvcHBvc2l0ZSBwbGFjZW1lbnQgb2YgdGhlIGdpdmVuIG9uZVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IHBsYWNlbWVudFxuICogQHJldHVybnMge1N0cmluZ30gZmxpcHBlZCBwbGFjZW1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHZhciBoYXNoID0geyBsZWZ0OiAncmlnaHQnLCByaWdodDogJ2xlZnQnLCBib3R0b206ICd0b3AnLCB0b3A6ICdib3R0b20nIH07XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBvZmZzZXRzIHRvIHRoZSBwb3BwZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwb3NpdGlvbiAtIENTUyBwb3NpdGlvbiB0aGUgUG9wcGVyIHdpbGwgZ2V0IGFwcGxpZWRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBvcHBlciAtIHRoZSBwb3BwZXIgZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IHJlZmVyZW5jZU9mZnNldHMgLSB0aGUgcmVmZXJlbmNlIG9mZnNldHMgKHRoZSBwb3BwZXIgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGlzKVxuICogQHBhcmFtIHtTdHJpbmd9IHBsYWNlbWVudCAtIG9uZSBvZiB0aGUgdmFsaWQgcGxhY2VtZW50IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IHBvcHBlck9mZnNldHMgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgb2Zmc2V0cyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlclxuICovXG5mdW5jdGlvbiBnZXRQb3BwZXJPZmZzZXRzKHBvcHBlciwgcmVmZXJlbmNlT2Zmc2V0cywgcGxhY2VtZW50KSB7XG4gIHBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuXG4gIC8vIEdldCBwb3BwZXIgbm9kZSBzaXplc1xuICB2YXIgcG9wcGVyUmVjdCA9IGdldE91dGVyU2l6ZXMocG9wcGVyKTtcblxuICAvLyBBZGQgcG9zaXRpb24sIHdpZHRoIGFuZCBoZWlnaHQgdG8gb3VyIG9mZnNldHMgb2JqZWN0XG4gIHZhciBwb3BwZXJPZmZzZXRzID0ge1xuICAgIHdpZHRoOiBwb3BwZXJSZWN0LndpZHRoLFxuICAgIGhlaWdodDogcG9wcGVyUmVjdC5oZWlnaHRcbiAgfTtcblxuICAvLyBkZXBlbmRpbmcgYnkgdGhlIHBvcHBlciBwbGFjZW1lbnQgd2UgaGF2ZSB0byBjb21wdXRlIGl0cyBvZmZzZXRzIHNsaWdodGx5IGRpZmZlcmVudGx5XG4gIHZhciBpc0hvcml6ID0gWydyaWdodCcsICdsZWZ0J10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTtcbiAgdmFyIG1haW5TaWRlID0gaXNIb3JpeiA/ICd0b3AnIDogJ2xlZnQnO1xuICB2YXIgc2Vjb25kYXJ5U2lkZSA9IGlzSG9yaXogPyAnbGVmdCcgOiAndG9wJztcbiAgdmFyIG1lYXN1cmVtZW50ID0gaXNIb3JpeiA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgdmFyIHNlY29uZGFyeU1lYXN1cmVtZW50ID0gIWlzSG9yaXogPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgcG9wcGVyT2Zmc2V0c1ttYWluU2lkZV0gPSByZWZlcmVuY2VPZmZzZXRzW21haW5TaWRlXSArIHJlZmVyZW5jZU9mZnNldHNbbWVhc3VyZW1lbnRdIC8gMiAtIHBvcHBlclJlY3RbbWVhc3VyZW1lbnRdIC8gMjtcbiAgaWYgKHBsYWNlbWVudCA9PT0gc2Vjb25kYXJ5U2lkZSkge1xuICAgIHBvcHBlck9mZnNldHNbc2Vjb25kYXJ5U2lkZV0gPSByZWZlcmVuY2VPZmZzZXRzW3NlY29uZGFyeVNpZGVdIC0gcG9wcGVyUmVjdFtzZWNvbmRhcnlNZWFzdXJlbWVudF07XG4gIH0gZWxzZSB7XG4gICAgcG9wcGVyT2Zmc2V0c1tzZWNvbmRhcnlTaWRlXSA9IHJlZmVyZW5jZU9mZnNldHNbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQoc2Vjb25kYXJ5U2lkZSldO1xuICB9XG5cbiAgcmV0dXJuIHBvcHBlck9mZnNldHM7XG59XG5cbi8qKlxuICogTWltaWNzIHRoZSBgZmluZGAgbWV0aG9kIG9mIEFycmF5XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0FycmF5fSBhcnJcbiAqIEBhcmd1bWVudCBwcm9wXG4gKiBAYXJndW1lbnQgdmFsdWVcbiAqIEByZXR1cm5zIGluZGV4IG9yIC0xXG4gKi9cbmZ1bmN0aW9uIGZpbmQoYXJyLCBjaGVjaykge1xuICAvLyB1c2UgbmF0aXZlIGZpbmQgaWYgc3VwcG9ydGVkXG4gIGlmIChBcnJheS5wcm90b3R5cGUuZmluZCkge1xuICAgIHJldHVybiBhcnIuZmluZChjaGVjayk7XG4gIH1cblxuICAvLyB1c2UgYGZpbHRlcmAgdG8gb2J0YWluIHRoZSBzYW1lIGJlaGF2aW9yIG9mIGBmaW5kYFxuICByZXR1cm4gYXJyLmZpbHRlcihjaGVjaylbMF07XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hpbmcgb2JqZWN0XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0FycmF5fSBhcnJcbiAqIEBhcmd1bWVudCBwcm9wXG4gKiBAYXJndW1lbnQgdmFsdWVcbiAqIEByZXR1cm5zIGluZGV4IG9yIC0xXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbmRleChhcnIsIHByb3AsIHZhbHVlKSB7XG4gIC8vIHVzZSBuYXRpdmUgZmluZEluZGV4IGlmIHN1cHBvcnRlZFxuICBpZiAoQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleCkge1xuICAgIHJldHVybiBhcnIuZmluZEluZGV4KGZ1bmN0aW9uIChjdXIpIHtcbiAgICAgIHJldHVybiBjdXJbcHJvcF0gPT09IHZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gdXNlIGBmaW5kYCArIGBpbmRleE9mYCBpZiBgZmluZEluZGV4YCBpc24ndCBzdXBwb3J0ZWRcbiAgdmFyIG1hdGNoID0gZmluZChhcnIsIGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqW3Byb3BdID09PSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiBhcnIuaW5kZXhPZihtYXRjaCk7XG59XG5cbi8qKlxuICogTG9vcCB0cm91Z2ggdGhlIGxpc3Qgb2YgbW9kaWZpZXJzIGFuZCBydW4gdGhlbSBpbiBvcmRlcixcbiAqIGVhY2ggb2YgdGhlbSB3aWxsIHRoZW4gZWRpdCB0aGUgZGF0YSBvYmplY3QuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge2RhdGFPYmplY3R9IGRhdGFcbiAqIEBwYXJhbSB7QXJyYXl9IG1vZGlmaWVyc1xuICogQHBhcmFtIHtTdHJpbmd9IGVuZHMgLSBPcHRpb25hbCBtb2RpZmllciBuYW1lIHVzZWQgYXMgc3RvcHBlclxuICogQHJldHVybnMge2RhdGFPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIHJ1bk1vZGlmaWVycyhtb2RpZmllcnMsIGRhdGEsIGVuZHMpIHtcbiAgdmFyIG1vZGlmaWVyc1RvUnVuID0gZW5kcyA9PT0gdW5kZWZpbmVkID8gbW9kaWZpZXJzIDogbW9kaWZpZXJzLnNsaWNlKDAsIGZpbmRJbmRleChtb2RpZmllcnMsICduYW1lJywgZW5kcykpO1xuXG4gIG1vZGlmaWVyc1RvUnVuLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgaWYgKG1vZGlmaWVyWydmdW5jdGlvbiddKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRvdC1ub3RhdGlvblxuICAgICAgY29uc29sZS53YXJuKCdgbW9kaWZpZXIuZnVuY3Rpb25gIGlzIGRlcHJlY2F0ZWQsIHVzZSBgbW9kaWZpZXIuZm5gIScpO1xuICAgIH1cbiAgICB2YXIgZm4gPSBtb2RpZmllclsnZnVuY3Rpb24nXSB8fCBtb2RpZmllci5mbjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICBpZiAobW9kaWZpZXIuZW5hYmxlZCAmJiBpc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgLy8gQWRkIHByb3BlcnRpZXMgdG8gb2Zmc2V0cyB0byBtYWtlIHRoZW0gYSBjb21wbGV0ZSBjbGllbnRSZWN0IG9iamVjdFxuICAgICAgLy8gd2UgZG8gdGhpcyBiZWZvcmUgZWFjaCBtb2RpZmllciB0byBtYWtlIHN1cmUgdGhlIHByZXZpb3VzIG9uZSBkb2Vzbid0XG4gICAgICAvLyBtZXNzIHdpdGggdGhlc2UgdmFsdWVzXG4gICAgICBkYXRhLm9mZnNldHMucG9wcGVyID0gZ2V0Q2xpZW50UmVjdChkYXRhLm9mZnNldHMucG9wcGVyKTtcbiAgICAgIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UgPSBnZXRDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UpO1xuXG4gICAgICBkYXRhID0gZm4oZGF0YSwgbW9kaWZpZXIpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHBvcHBlciwgY29tcHV0aW5nIHRoZSBuZXcgb2Zmc2V0cyBhbmQgYXBwbHlpbmdcbiAqIHRoZSBuZXcgc3R5bGUuPGJyIC8+XG4gKiBQcmVmZXIgYHNjaGVkdWxlVXBkYXRlYCBvdmVyIGB1cGRhdGVgIGJlY2F1c2Ugb2YgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xuZnVuY3Rpb24gdXBkYXRlKCkge1xuICAvLyBpZiBwb3BwZXIgaXMgZGVzdHJveWVkLCBkb24ndCBwZXJmb3JtIGFueSBmdXJ0aGVyIHVwZGF0ZVxuICBpZiAodGhpcy5zdGF0ZS5pc0Rlc3Ryb3llZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBkYXRhID0ge1xuICAgIGluc3RhbmNlOiB0aGlzLFxuICAgIHN0eWxlczoge30sXG4gICAgYXJyb3dTdHlsZXM6IHt9LFxuICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgIGZsaXBwZWQ6IGZhbHNlLFxuICAgIG9mZnNldHM6IHt9XG4gIH07XG5cbiAgLy8gY29tcHV0ZSByZWZlcmVuY2UgZWxlbWVudCBvZmZzZXRzXG4gIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UgPSBnZXRSZWZlcmVuY2VPZmZzZXRzKHRoaXMuc3RhdGUsIHRoaXMucG9wcGVyLCB0aGlzLnJlZmVyZW5jZSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uRml4ZWQpO1xuXG4gIC8vIGNvbXB1dGUgYXV0byBwbGFjZW1lbnQsIHN0b3JlIHBsYWNlbWVudCBpbnNpZGUgdGhlIGRhdGEgb2JqZWN0LFxuICAvLyBtb2RpZmllcnMgd2lsbCBiZSBhYmxlIHRvIGVkaXQgYHBsYWNlbWVudGAgaWYgbmVlZGVkXG4gIC8vIGFuZCByZWZlciB0byBvcmlnaW5hbFBsYWNlbWVudCB0byBrbm93IHRoZSBvcmlnaW5hbCB2YWx1ZVxuICBkYXRhLnBsYWNlbWVudCA9IGNvbXB1dGVBdXRvUGxhY2VtZW50KHRoaXMub3B0aW9ucy5wbGFjZW1lbnQsIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UsIHRoaXMucG9wcGVyLCB0aGlzLnJlZmVyZW5jZSwgdGhpcy5vcHRpb25zLm1vZGlmaWVycy5mbGlwLmJvdW5kYXJpZXNFbGVtZW50LCB0aGlzLm9wdGlvbnMubW9kaWZpZXJzLmZsaXAucGFkZGluZyk7XG5cbiAgLy8gc3RvcmUgdGhlIGNvbXB1dGVkIHBsYWNlbWVudCBpbnNpZGUgYG9yaWdpbmFsUGxhY2VtZW50YFxuICBkYXRhLm9yaWdpbmFsUGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQ7XG5cbiAgZGF0YS5wb3NpdGlvbkZpeGVkID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uRml4ZWQ7XG5cbiAgLy8gY29tcHV0ZSB0aGUgcG9wcGVyIG9mZnNldHNcbiAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IGdldFBvcHBlck9mZnNldHModGhpcy5wb3BwZXIsIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UsIGRhdGEucGxhY2VtZW50KTtcblxuICBkYXRhLm9mZnNldHMucG9wcGVyLnBvc2l0aW9uID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uRml4ZWQgPyAnZml4ZWQnIDogJ2Fic29sdXRlJztcblxuICAvLyBydW4gdGhlIG1vZGlmaWVyc1xuICBkYXRhID0gcnVuTW9kaWZpZXJzKHRoaXMubW9kaWZpZXJzLCBkYXRhKTtcblxuICAvLyB0aGUgZmlyc3QgYHVwZGF0ZWAgd2lsbCBjYWxsIGBvbkNyZWF0ZWAgY2FsbGJhY2tcbiAgLy8gdGhlIG90aGVyIG9uZXMgd2lsbCBjYWxsIGBvblVwZGF0ZWAgY2FsbGJhY2tcbiAgaWYgKCF0aGlzLnN0YXRlLmlzQ3JlYXRlZCkge1xuICAgIHRoaXMuc3RhdGUuaXNDcmVhdGVkID0gdHJ1ZTtcbiAgICB0aGlzLm9wdGlvbnMub25DcmVhdGUoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5vcHRpb25zLm9uVXBkYXRlKGRhdGEpO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIHVzZWQgdG8ga25vdyBpZiB0aGUgZ2l2ZW4gbW9kaWZpZXIgaXMgZW5hYmxlZC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc01vZGlmaWVyRW5hYmxlZChtb2RpZmllcnMsIG1vZGlmaWVyTmFtZSkge1xuICByZXR1cm4gbW9kaWZpZXJzLnNvbWUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgICAgZW5hYmxlZCA9IF9yZWYuZW5hYmxlZDtcbiAgICByZXR1cm4gZW5hYmxlZCAmJiBuYW1lID09PSBtb2RpZmllck5hbWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJlZml4ZWQgc3VwcG9ydGVkIHByb3BlcnR5IG5hbWVcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwcm9wZXJ0eSAoY2FtZWxDYXNlKVxuICogQHJldHVybnMge1N0cmluZ30gcHJlZml4ZWQgcHJvcGVydHkgKGNhbWVsQ2FzZSBvciBQYXNjYWxDYXNlLCBkZXBlbmRpbmcgb24gdGhlIHZlbmRvciBwcmVmaXgpXG4gKi9cbmZ1bmN0aW9uIGdldFN1cHBvcnRlZFByb3BlcnR5TmFtZShwcm9wZXJ0eSkge1xuICB2YXIgcHJlZml4ZXMgPSBbZmFsc2UsICdtcycsICdXZWJraXQnLCAnTW96JywgJ08nXTtcbiAgdmFyIHVwcGVyUHJvcCA9IHByb3BlcnR5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc2xpY2UoMSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwcmVmaXggPSBwcmVmaXhlc1tpXTtcbiAgICB2YXIgdG9DaGVjayA9IHByZWZpeCA/ICcnICsgcHJlZml4ICsgdXBwZXJQcm9wIDogcHJvcGVydHk7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudC5ib2R5LnN0eWxlW3RvQ2hlY2tdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRvQ2hlY2s7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIERlc3Ryb3kgdGhlIHBvcHBlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiBkZXN0cm95KCkge1xuICB0aGlzLnN0YXRlLmlzRGVzdHJveWVkID0gdHJ1ZTtcblxuICAvLyB0b3VjaCBET00gb25seSBpZiBgYXBwbHlTdHlsZWAgbW9kaWZpZXIgaXMgZW5hYmxlZFxuICBpZiAoaXNNb2RpZmllckVuYWJsZWQodGhpcy5tb2RpZmllcnMsICdhcHBseVN0eWxlJykpIHtcbiAgICB0aGlzLnBvcHBlci5yZW1vdmVBdHRyaWJ1dGUoJ3gtcGxhY2VtZW50Jyk7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUucG9zaXRpb24gPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZS50b3AgPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZS5sZWZ0ID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUucmlnaHQgPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZS5ib3R0b20gPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZS53aWxsQ2hhbmdlID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGVbZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lKCd0cmFuc2Zvcm0nKV0gPSAnJztcbiAgfVxuXG4gIHRoaXMuZGlzYWJsZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgLy8gcmVtb3ZlIHRoZSBwb3BwZXIgaWYgdXNlciBleHBsaWNpdHkgYXNrZWQgZm9yIHRoZSBkZWxldGlvbiBvbiBkZXN0cm95XG4gIC8vIGRvIG5vdCB1c2UgYHJlbW92ZWAgYmVjYXVzZSBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBpdFxuICBpZiAodGhpcy5vcHRpb25zLnJlbW92ZU9uRGVzdHJveSkge1xuICAgIHRoaXMucG9wcGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wb3BwZXIpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEdldCB0aGUgd2luZG93IGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudFxuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7V2luZG93fVxuICovXG5mdW5jdGlvbiBnZXRXaW5kb3coZWxlbWVudCkge1xuICB2YXIgb3duZXJEb2N1bWVudCA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgcmV0dXJuIG93bmVyRG9jdW1lbnQgPyBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IDogd2luZG93O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hUb1Njcm9sbFBhcmVudHMoc2Nyb2xsUGFyZW50LCBldmVudCwgY2FsbGJhY2ssIHNjcm9sbFBhcmVudHMpIHtcbiAgdmFyIGlzQm9keSA9IHNjcm9sbFBhcmVudC5ub2RlTmFtZSA9PT0gJ0JPRFknO1xuICB2YXIgdGFyZ2V0ID0gaXNCb2R5ID8gc2Nyb2xsUGFyZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgOiBzY3JvbGxQYXJlbnQ7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBjYWxsYmFjaywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gIGlmICghaXNCb2R5KSB7XG4gICAgYXR0YWNoVG9TY3JvbGxQYXJlbnRzKGdldFNjcm9sbFBhcmVudCh0YXJnZXQucGFyZW50Tm9kZSksIGV2ZW50LCBjYWxsYmFjaywgc2Nyb2xsUGFyZW50cyk7XG4gIH1cbiAgc2Nyb2xsUGFyZW50cy5wdXNoKHRhcmdldCk7XG59XG5cbi8qKlxuICogU2V0dXAgbmVlZGVkIGV2ZW50IGxpc3RlbmVycyB1c2VkIHRvIHVwZGF0ZSB0aGUgcG9wcGVyIHBvc2l0aW9uXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXR1cEV2ZW50TGlzdGVuZXJzKHJlZmVyZW5jZSwgb3B0aW9ucywgc3RhdGUsIHVwZGF0ZUJvdW5kKSB7XG4gIC8vIFJlc2l6ZSBldmVudCBsaXN0ZW5lciBvbiB3aW5kb3dcbiAgc3RhdGUudXBkYXRlQm91bmQgPSB1cGRhdGVCb3VuZDtcbiAgZ2V0V2luZG93KHJlZmVyZW5jZSkuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc3RhdGUudXBkYXRlQm91bmQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBTY3JvbGwgZXZlbnQgbGlzdGVuZXIgb24gc2Nyb2xsIHBhcmVudHNcbiAgdmFyIHNjcm9sbEVsZW1lbnQgPSBnZXRTY3JvbGxQYXJlbnQocmVmZXJlbmNlKTtcbiAgYXR0YWNoVG9TY3JvbGxQYXJlbnRzKHNjcm9sbEVsZW1lbnQsICdzY3JvbGwnLCBzdGF0ZS51cGRhdGVCb3VuZCwgc3RhdGUuc2Nyb2xsUGFyZW50cyk7XG4gIHN0YXRlLnNjcm9sbEVsZW1lbnQgPSBzY3JvbGxFbGVtZW50O1xuICBzdGF0ZS5ldmVudHNFbmFibGVkID0gdHJ1ZTtcblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogSXQgd2lsbCBhZGQgcmVzaXplL3Njcm9sbCBldmVudHMgYW5kIHN0YXJ0IHJlY2FsY3VsYXRpbmdcbiAqIHBvc2l0aW9uIG9mIHRoZSBwb3BwZXIgZWxlbWVudCB3aGVuIHRoZXkgYXJlIHRyaWdnZXJlZC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xuZnVuY3Rpb24gZW5hYmxlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gIGlmICghdGhpcy5zdGF0ZS5ldmVudHNFbmFibGVkKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHNldHVwRXZlbnRMaXN0ZW5lcnModGhpcy5yZWZlcmVuY2UsIHRoaXMub3B0aW9ucywgdGhpcy5zdGF0ZSwgdGhpcy5zY2hlZHVsZVVwZGF0ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVzZWQgdG8gdXBkYXRlIHRoZSBwb3BwZXIgcG9zaXRpb25cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHJlZmVyZW5jZSwgc3RhdGUpIHtcbiAgLy8gUmVtb3ZlIHJlc2l6ZSBldmVudCBsaXN0ZW5lciBvbiB3aW5kb3dcbiAgZ2V0V2luZG93KHJlZmVyZW5jZSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc3RhdGUudXBkYXRlQm91bmQpO1xuXG4gIC8vIFJlbW92ZSBzY3JvbGwgZXZlbnQgbGlzdGVuZXIgb24gc2Nyb2xsIHBhcmVudHNcbiAgc3RhdGUuc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc3RhdGUudXBkYXRlQm91bmQpO1xuICB9KTtcblxuICAvLyBSZXNldCBzdGF0ZVxuICBzdGF0ZS51cGRhdGVCb3VuZCA9IG51bGw7XG4gIHN0YXRlLnNjcm9sbFBhcmVudHMgPSBbXTtcbiAgc3RhdGUuc2Nyb2xsRWxlbWVudCA9IG51bGw7XG4gIHN0YXRlLmV2ZW50c0VuYWJsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIEl0IHdpbGwgcmVtb3ZlIHJlc2l6ZS9zY3JvbGwgZXZlbnRzIGFuZCB3b24ndCByZWNhbGN1bGF0ZSBwb3BwZXIgcG9zaXRpb25cbiAqIHdoZW4gdGhleSBhcmUgdHJpZ2dlcmVkLiBJdCBhbHNvIHdvbid0IHRyaWdnZXIgb25VcGRhdGUgY2FsbGJhY2sgYW55bW9yZSxcbiAqIHVubGVzcyB5b3UgY2FsbCBgdXBkYXRlYCBtZXRob2QgbWFudWFsbHkuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyXG4gKi9cbmZ1bmN0aW9uIGRpc2FibGVFdmVudExpc3RlbmVycygpIHtcbiAgaWYgKHRoaXMuc3RhdGUuZXZlbnRzRW5hYmxlZCkge1xuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuc2NoZWR1bGVVcGRhdGUpO1xuICAgIHRoaXMuc3RhdGUgPSByZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLnJlZmVyZW5jZSwgdGhpcy5zdGF0ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUZWxscyBpZiBhIGdpdmVuIGlucHV0IGlzIGEgbnVtYmVyXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0geyp9IGlucHV0IHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc051bWVyaWMobikge1xuICByZXR1cm4gbiAhPT0gJycgJiYgIWlzTmFOKHBhcnNlRmxvYXQobikpICYmIGlzRmluaXRlKG4pO1xufVxuXG4vKipcbiAqIFNldCB0aGUgc3R5bGUgdG8gdGhlIGdpdmVuIHBvcHBlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhcHBseSB0aGUgc3R5bGUgdG9cbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBzdHlsZXNcbiAqIE9iamVjdCB3aXRoIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNldFN0eWxlcyhlbGVtZW50LCBzdHlsZXMpIHtcbiAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgdmFyIHVuaXQgPSAnJztcbiAgICAvLyBhZGQgdW5pdCBpZiB0aGUgdmFsdWUgaXMgbnVtZXJpYyBhbmQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmdcbiAgICBpZiAoWyd3aWR0aCcsICdoZWlnaHQnLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10uaW5kZXhPZihwcm9wKSAhPT0gLTEgJiYgaXNOdW1lcmljKHN0eWxlc1twcm9wXSkpIHtcbiAgICAgIHVuaXQgPSAncHgnO1xuICAgIH1cbiAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gc3R5bGVzW3Byb3BdICsgdW5pdDtcbiAgfSk7XG59XG5cbi8qKlxuICogU2V0IHRoZSBhdHRyaWJ1dGVzIHRvIHRoZSBnaXZlbiBwb3BwZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYXBwbHkgdGhlIGF0dHJpYnV0ZXMgdG9cbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBzdHlsZXNcbiAqIE9iamVjdCB3aXRoIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXMoZWxlbWVudCwgYXR0cmlidXRlcykge1xuICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgdmFyIHZhbHVlID0gYXR0cmlidXRlc1twcm9wXTtcbiAgICBpZiAodmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShwcm9wLCBhdHRyaWJ1dGVzW3Byb3BdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUocHJvcCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhLnN0eWxlcyAtIExpc3Qgb2Ygc3R5bGUgcHJvcGVydGllcyAtIHZhbHVlcyB0byBhcHBseSB0byBwb3BwZXIgZWxlbWVudFxuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEuYXR0cmlidXRlcyAtIExpc3Qgb2YgYXR0cmlidXRlIHByb3BlcnRpZXMgLSB2YWx1ZXMgdG8gYXBwbHkgdG8gcG9wcGVyIGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzYW1lIGRhdGEgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGFwcGx5U3R5bGUoZGF0YSkge1xuICAvLyBhbnkgcHJvcGVydHkgcHJlc2VudCBpbiBgZGF0YS5zdHlsZXNgIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyLFxuICAvLyBpbiB0aGlzIHdheSB3ZSBjYW4gbWFrZSB0aGUgM3JkIHBhcnR5IG1vZGlmaWVycyBhZGQgY3VzdG9tIHN0eWxlcyB0byBpdFxuICAvLyBCZSBhd2FyZSwgbW9kaWZpZXJzIGNvdWxkIG92ZXJyaWRlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIHByZXZpb3VzXG4gIC8vIGxpbmVzIG9mIHRoaXMgbW9kaWZpZXIhXG4gIHNldFN0eWxlcyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5zdHlsZXMpO1xuXG4gIC8vIGFueSBwcm9wZXJ0eSBwcmVzZW50IGluIGBkYXRhLmF0dHJpYnV0ZXNgIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyLFxuICAvLyB0aGV5IHdpbGwgYmUgc2V0IGFzIEhUTUwgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudFxuICBzZXRBdHRyaWJ1dGVzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gIC8vIGlmIGFycm93RWxlbWVudCBpcyBkZWZpbmVkIGFuZCBhcnJvd1N0eWxlcyBoYXMgc29tZSBwcm9wZXJ0aWVzXG4gIGlmIChkYXRhLmFycm93RWxlbWVudCAmJiBPYmplY3Qua2V5cyhkYXRhLmFycm93U3R5bGVzKS5sZW5ndGgpIHtcbiAgICBzZXRTdHlsZXMoZGF0YS5hcnJvd0VsZW1lbnQsIGRhdGEuYXJyb3dTdHlsZXMpO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogU2V0IHRoZSB4LXBsYWNlbWVudCBhdHRyaWJ1dGUgYmVmb3JlIGV2ZXJ5dGhpbmcgZWxzZSBiZWNhdXNlIGl0IGNvdWxkIGJlIHVzZWRcbiAqIHRvIGFkZCBtYXJnaW5zIHRvIHRoZSBwb3BwZXIgbWFyZ2lucyBuZWVkcyB0byBiZSBjYWxjdWxhdGVkIHRvIGdldCB0aGVcbiAqIGNvcnJlY3QgcG9wcGVyIG9mZnNldHMuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLm1vZGlmaWVyc1xuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSBlbGVtZW50IHVzZWQgdG8gcG9zaXRpb24gdGhlIHBvcHBlclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wcGVyIC0gVGhlIEhUTUwgZWxlbWVudCB1c2VkIGFzIHBvcHBlclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBQb3BwZXIuanMgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBhcHBseVN0eWxlT25Mb2FkKHJlZmVyZW5jZSwgcG9wcGVyLCBvcHRpb25zLCBtb2RpZmllck9wdGlvbnMsIHN0YXRlKSB7XG4gIC8vIGNvbXB1dGUgcmVmZXJlbmNlIGVsZW1lbnQgb2Zmc2V0c1xuICB2YXIgcmVmZXJlbmNlT2Zmc2V0cyA9IGdldFJlZmVyZW5jZU9mZnNldHMoc3RhdGUsIHBvcHBlciwgcmVmZXJlbmNlLCBvcHRpb25zLnBvc2l0aW9uRml4ZWQpO1xuXG4gIC8vIGNvbXB1dGUgYXV0byBwbGFjZW1lbnQsIHN0b3JlIHBsYWNlbWVudCBpbnNpZGUgdGhlIGRhdGEgb2JqZWN0LFxuICAvLyBtb2RpZmllcnMgd2lsbCBiZSBhYmxlIHRvIGVkaXQgYHBsYWNlbWVudGAgaWYgbmVlZGVkXG4gIC8vIGFuZCByZWZlciB0byBvcmlnaW5hbFBsYWNlbWVudCB0byBrbm93IHRoZSBvcmlnaW5hbCB2YWx1ZVxuICB2YXIgcGxhY2VtZW50ID0gY29tcHV0ZUF1dG9QbGFjZW1lbnQob3B0aW9ucy5wbGFjZW1lbnQsIHJlZmVyZW5jZU9mZnNldHMsIHBvcHBlciwgcmVmZXJlbmNlLCBvcHRpb25zLm1vZGlmaWVycy5mbGlwLmJvdW5kYXJpZXNFbGVtZW50LCBvcHRpb25zLm1vZGlmaWVycy5mbGlwLnBhZGRpbmcpO1xuXG4gIHBvcHBlci5zZXRBdHRyaWJ1dGUoJ3gtcGxhY2VtZW50JywgcGxhY2VtZW50KTtcblxuICAvLyBBcHBseSBgcG9zaXRpb25gIHRvIHBvcHBlciBiZWZvcmUgYW55dGhpbmcgZWxzZSBiZWNhdXNlXG4gIC8vIHdpdGhvdXQgdGhlIHBvc2l0aW9uIGFwcGxpZWQgd2UgY2FuJ3QgZ3VhcmFudGVlIGNvcnJlY3QgY29tcHV0YXRpb25zXG4gIHNldFN0eWxlcyhwb3BwZXIsIHsgcG9zaXRpb246IG9wdGlvbnMucG9zaXRpb25GaXhlZCA/ICdmaXhlZCcgOiAnYWJzb2x1dGUnIH0pO1xuXG4gIHJldHVybiBvcHRpb25zO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBjb21wdXRlU3R5bGUoZGF0YSwgb3B0aW9ucykge1xuICB2YXIgeCA9IG9wdGlvbnMueCxcbiAgICAgIHkgPSBvcHRpb25zLnk7XG4gIHZhciBwb3BwZXIgPSBkYXRhLm9mZnNldHMucG9wcGVyO1xuXG4gIC8vIFJlbW92ZSB0aGlzIGxlZ2FjeSBzdXBwb3J0IGluIFBvcHBlci5qcyB2MlxuXG4gIHZhciBsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gPSBmaW5kKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCBmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICByZXR1cm4gbW9kaWZpZXIubmFtZSA9PT0gJ2FwcGx5U3R5bGUnO1xuICB9KS5ncHVBY2NlbGVyYXRpb247XG4gIGlmIChsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnNvbGUud2FybignV0FSTklORzogYGdwdUFjY2VsZXJhdGlvbmAgb3B0aW9uIG1vdmVkIHRvIGBjb21wdXRlU3R5bGVgIG1vZGlmaWVyIGFuZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFBvcHBlci5qcyEnKTtcbiAgfVxuICB2YXIgZ3B1QWNjZWxlcmF0aW9uID0gbGVnYWN5R3B1QWNjZWxlcmF0aW9uT3B0aW9uICE9PSB1bmRlZmluZWQgPyBsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gOiBvcHRpb25zLmdwdUFjY2VsZXJhdGlvbjtcblxuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGRhdGEuaW5zdGFuY2UucG9wcGVyKTtcbiAgdmFyIG9mZnNldFBhcmVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50KTtcblxuICAvLyBTdHlsZXNcbiAgdmFyIHN0eWxlcyA9IHtcbiAgICBwb3NpdGlvbjogcG9wcGVyLnBvc2l0aW9uXG4gIH07XG5cbiAgLy8gQXZvaWQgYmx1cnJ5IHRleHQgYnkgdXNpbmcgZnVsbCBwaXhlbCBpbnRlZ2Vycy5cbiAgLy8gRm9yIHBpeGVsLXBlcmZlY3QgcG9zaXRpb25pbmcsIHRvcC9ib3R0b20gcHJlZmVycyByb3VuZGVkXG4gIC8vIHZhbHVlcywgd2hpbGUgbGVmdC9yaWdodCBwcmVmZXJzIGZsb29yZWQgdmFsdWVzLlxuICB2YXIgb2Zmc2V0cyA9IHtcbiAgICBsZWZ0OiBNYXRoLmZsb29yKHBvcHBlci5sZWZ0KSxcbiAgICB0b3A6IE1hdGgucm91bmQocG9wcGVyLnRvcCksXG4gICAgYm90dG9tOiBNYXRoLnJvdW5kKHBvcHBlci5ib3R0b20pLFxuICAgIHJpZ2h0OiBNYXRoLmZsb29yKHBvcHBlci5yaWdodClcbiAgfTtcblxuICB2YXIgc2lkZUEgPSB4ID09PSAnYm90dG9tJyA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gIHZhciBzaWRlQiA9IHkgPT09ICdyaWdodCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuXG4gIC8vIGlmIGdwdUFjY2VsZXJhdGlvbiBpcyBzZXQgdG8gYHRydWVgIGFuZCB0cmFuc2Zvcm0gaXMgc3VwcG9ydGVkLFxuICAvLyAgd2UgdXNlIGB0cmFuc2xhdGUzZGAgdG8gYXBwbHkgdGhlIHBvc2l0aW9uIHRvIHRoZSBwb3BwZXIgd2VcbiAgLy8gYXV0b21hdGljYWxseSB1c2UgdGhlIHN1cHBvcnRlZCBwcmVmaXhlZCB2ZXJzaW9uIGlmIG5lZWRlZFxuICB2YXIgcHJlZml4ZWRQcm9wZXJ0eSA9IGdldFN1cHBvcnRlZFByb3BlcnR5TmFtZSgndHJhbnNmb3JtJyk7XG5cbiAgLy8gbm93LCBsZXQncyBtYWtlIGEgc3RlcCBiYWNrIGFuZCBsb29rIGF0IHRoaXMgY29kZSBjbG9zZWx5ICh3dGY/KVxuICAvLyBJZiB0aGUgY29udGVudCBvZiB0aGUgcG9wcGVyIGdyb3dzIG9uY2UgaXQncyBiZWVuIHBvc2l0aW9uZWQsIGl0XG4gIC8vIG1heSBoYXBwZW4gdGhhdCB0aGUgcG9wcGVyIGdldHMgbWlzcGxhY2VkIGJlY2F1c2Ugb2YgdGhlIG5ldyBjb250ZW50XG4gIC8vIG92ZXJmbG93aW5nIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIHByb3ZpZGUgdHdvIG9wdGlvbnMgKHggYW5kIHkpLCB3aGljaCBhbGxvd1xuICAvLyB0aGUgY29uc3VtZXIgdG8gZGVmaW5lIHRoZSBvZmZzZXQgb3JpZ2luLlxuICAvLyBJZiB3ZSBwb3NpdGlvbiBhIHBvcHBlciBvbiB0b3Agb2YgYSByZWZlcmVuY2UgZWxlbWVudCwgd2UgY2FuIHNldFxuICAvLyBgeGAgdG8gYHRvcGAgdG8gbWFrZSB0aGUgcG9wcGVyIGdyb3cgdG93YXJkcyBpdHMgdG9wIGluc3RlYWQgb2ZcbiAgLy8gaXRzIGJvdHRvbS5cbiAgdmFyIGxlZnQgPSB2b2lkIDAsXG4gICAgICB0b3AgPSB2b2lkIDA7XG4gIGlmIChzaWRlQSA9PT0gJ2JvdHRvbScpIHtcbiAgICB0b3AgPSAtb2Zmc2V0UGFyZW50UmVjdC5oZWlnaHQgKyBvZmZzZXRzLmJvdHRvbTtcbiAgfSBlbHNlIHtcbiAgICB0b3AgPSBvZmZzZXRzLnRvcDtcbiAgfVxuICBpZiAoc2lkZUIgPT09ICdyaWdodCcpIHtcbiAgICBsZWZ0ID0gLW9mZnNldFBhcmVudFJlY3Qud2lkdGggKyBvZmZzZXRzLnJpZ2h0O1xuICB9IGVsc2Uge1xuICAgIGxlZnQgPSBvZmZzZXRzLmxlZnQ7XG4gIH1cbiAgaWYgKGdwdUFjY2VsZXJhdGlvbiAmJiBwcmVmaXhlZFByb3BlcnR5KSB7XG4gICAgc3R5bGVzW3ByZWZpeGVkUHJvcGVydHldID0gJ3RyYW5zbGF0ZTNkKCcgKyBsZWZ0ICsgJ3B4LCAnICsgdG9wICsgJ3B4LCAwKSc7XG4gICAgc3R5bGVzW3NpZGVBXSA9IDA7XG4gICAgc3R5bGVzW3NpZGVCXSA9IDA7XG4gICAgc3R5bGVzLndpbGxDaGFuZ2UgPSAndHJhbnNmb3JtJztcbiAgfSBlbHNlIHtcbiAgICAvLyBvdGh3ZXJpc2UsIHdlIHVzZSB0aGUgc3RhbmRhcmQgYHRvcGAsIGBsZWZ0YCwgYGJvdHRvbWAgYW5kIGByaWdodGAgcHJvcGVydGllc1xuICAgIHZhciBpbnZlcnRUb3AgPSBzaWRlQSA9PT0gJ2JvdHRvbScgPyAtMSA6IDE7XG4gICAgdmFyIGludmVydExlZnQgPSBzaWRlQiA9PT0gJ3JpZ2h0JyA/IC0xIDogMTtcbiAgICBzdHlsZXNbc2lkZUFdID0gdG9wICogaW52ZXJ0VG9wO1xuICAgIHN0eWxlc1tzaWRlQl0gPSBsZWZ0ICogaW52ZXJ0TGVmdDtcbiAgICBzdHlsZXMud2lsbENoYW5nZSA9IHNpZGVBICsgJywgJyArIHNpZGVCO1xuICB9XG5cbiAgLy8gQXR0cmlidXRlc1xuICB2YXIgYXR0cmlidXRlcyA9IHtcbiAgICAneC1wbGFjZW1lbnQnOiBkYXRhLnBsYWNlbWVudFxuICB9O1xuXG4gIC8vIFVwZGF0ZSBgZGF0YWAgYXR0cmlidXRlcywgc3R5bGVzIGFuZCBhcnJvd1N0eWxlc1xuICBkYXRhLmF0dHJpYnV0ZXMgPSBfZXh0ZW5kcyh7fSwgYXR0cmlidXRlcywgZGF0YS5hdHRyaWJ1dGVzKTtcbiAgZGF0YS5zdHlsZXMgPSBfZXh0ZW5kcyh7fSwgc3R5bGVzLCBkYXRhLnN0eWxlcyk7XG4gIGRhdGEuYXJyb3dTdHlsZXMgPSBfZXh0ZW5kcyh7fSwgZGF0YS5vZmZzZXRzLmFycm93LCBkYXRhLmFycm93U3R5bGVzKTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdXNlZCB0byBrbm93IGlmIHRoZSBnaXZlbiBtb2RpZmllciBkZXBlbmRzIGZyb20gYW5vdGhlciBvbmUuPGJyIC8+XG4gKiBJdCBjaGVja3MgaWYgdGhlIG5lZWRlZCBtb2RpZmllciBpcyBsaXN0ZWQgYW5kIGVuYWJsZWQuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0FycmF5fSBtb2RpZmllcnMgLSBsaXN0IG9mIG1vZGlmaWVyc1xuICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RpbmdOYW1lIC0gbmFtZSBvZiByZXF1ZXN0aW5nIG1vZGlmaWVyXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdGVkTmFtZSAtIG5hbWUgb2YgcmVxdWVzdGVkIG1vZGlmaWVyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNNb2RpZmllclJlcXVpcmVkKG1vZGlmaWVycywgcmVxdWVzdGluZ05hbWUsIHJlcXVlc3RlZE5hbWUpIHtcbiAgdmFyIHJlcXVlc3RpbmcgPSBmaW5kKG1vZGlmaWVycywgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgbmFtZSA9IF9yZWYubmFtZTtcbiAgICByZXR1cm4gbmFtZSA9PT0gcmVxdWVzdGluZ05hbWU7XG4gIH0pO1xuXG4gIHZhciBpc1JlcXVpcmVkID0gISFyZXF1ZXN0aW5nICYmIG1vZGlmaWVycy5zb21lKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIHJldHVybiBtb2RpZmllci5uYW1lID09PSByZXF1ZXN0ZWROYW1lICYmIG1vZGlmaWVyLmVuYWJsZWQgJiYgbW9kaWZpZXIub3JkZXIgPCByZXF1ZXN0aW5nLm9yZGVyO1xuICB9KTtcblxuICBpZiAoIWlzUmVxdWlyZWQpIHtcbiAgICB2YXIgX3JlcXVlc3RpbmcgPSAnYCcgKyByZXF1ZXN0aW5nTmFtZSArICdgJztcbiAgICB2YXIgcmVxdWVzdGVkID0gJ2AnICsgcmVxdWVzdGVkTmFtZSArICdgJztcbiAgICBjb25zb2xlLndhcm4ocmVxdWVzdGVkICsgJyBtb2RpZmllciBpcyByZXF1aXJlZCBieSAnICsgX3JlcXVlc3RpbmcgKyAnIG1vZGlmaWVyIGluIG9yZGVyIHRvIHdvcmssIGJlIHN1cmUgdG8gaW5jbHVkZSBpdCBiZWZvcmUgJyArIF9yZXF1ZXN0aW5nICsgJyEnKTtcbiAgfVxuICByZXR1cm4gaXNSZXF1aXJlZDtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGFycm93KGRhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIF9kYXRhJG9mZnNldHMkYXJyb3c7XG5cbiAgLy8gYXJyb3cgZGVwZW5kcyBvbiBrZWVwVG9nZXRoZXIgaW4gb3JkZXIgdG8gd29ya1xuICBpZiAoIWlzTW9kaWZpZXJSZXF1aXJlZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgJ2Fycm93JywgJ2tlZXBUb2dldGhlcicpKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICB2YXIgYXJyb3dFbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50O1xuXG4gIC8vIGlmIGFycm93RWxlbWVudCBpcyBhIHN0cmluZywgc3VwcG9zZSBpdCdzIGEgQ1NTIHNlbGVjdG9yXG4gIGlmICh0eXBlb2YgYXJyb3dFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIGFycm93RWxlbWVudCA9IGRhdGEuaW5zdGFuY2UucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIC8vIGlmIGFycm93RWxlbWVudCBpcyBub3QgZm91bmQsIGRvbid0IHJ1biB0aGUgbW9kaWZpZXJcbiAgICBpZiAoIWFycm93RWxlbWVudCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGlmIHRoZSBhcnJvd0VsZW1lbnQgaXNuJ3QgYSBxdWVyeSBzZWxlY3RvciB3ZSBtdXN0IGNoZWNrIHRoYXQgdGhlXG4gICAgLy8gcHJvdmlkZWQgRE9NIG5vZGUgaXMgY2hpbGQgb2YgaXRzIHBvcHBlciBub2RlXG4gICAgaWYgKCFkYXRhLmluc3RhbmNlLnBvcHBlci5jb250YWlucyhhcnJvd0VsZW1lbnQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IGBhcnJvdy5lbGVtZW50YCBtdXN0IGJlIGNoaWxkIG9mIGl0cyBwb3BwZXIgZWxlbWVudCEnKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgfVxuXG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyLFxuICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2U7XG5cbiAgdmFyIGlzVmVydGljYWwgPSBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xO1xuXG4gIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICB2YXIgc2lkZUNhcGl0YWxpemVkID0gaXNWZXJ0aWNhbCA/ICdUb3AnIDogJ0xlZnQnO1xuICB2YXIgc2lkZSA9IHNpZGVDYXBpdGFsaXplZC50b0xvd2VyQ2FzZSgpO1xuICB2YXIgYWx0U2lkZSA9IGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJztcbiAgdmFyIG9wU2lkZSA9IGlzVmVydGljYWwgPyAnYm90dG9tJyA6ICdyaWdodCc7XG4gIHZhciBhcnJvd0VsZW1lbnRTaXplID0gZ2V0T3V0ZXJTaXplcyhhcnJvd0VsZW1lbnQpW2xlbl07XG5cbiAgLy9cbiAgLy8gZXh0ZW5kcyBrZWVwVG9nZXRoZXIgYmVoYXZpb3IgbWFraW5nIHN1cmUgdGhlIHBvcHBlciBhbmQgaXRzXG4gIC8vIHJlZmVyZW5jZSBoYXZlIGVub3VnaCBwaXhlbHMgaW4gY29uanVjdGlvblxuICAvL1xuXG4gIC8vIHRvcC9sZWZ0IHNpZGVcbiAgaWYgKHJlZmVyZW5jZVtvcFNpZGVdIC0gYXJyb3dFbGVtZW50U2l6ZSA8IHBvcHBlcltzaWRlXSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gLT0gcG9wcGVyW3NpZGVdIC0gKHJlZmVyZW5jZVtvcFNpZGVdIC0gYXJyb3dFbGVtZW50U2l6ZSk7XG4gIH1cbiAgLy8gYm90dG9tL3JpZ2h0IHNpZGVcbiAgaWYgKHJlZmVyZW5jZVtzaWRlXSArIGFycm93RWxlbWVudFNpemUgPiBwb3BwZXJbb3BTaWRlXSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gKz0gcmVmZXJlbmNlW3NpZGVdICsgYXJyb3dFbGVtZW50U2l6ZSAtIHBvcHBlcltvcFNpZGVdO1xuICB9XG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBnZXRDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5wb3BwZXIpO1xuXG4gIC8vIGNvbXB1dGUgY2VudGVyIG9mIHRoZSBwb3BwZXJcbiAgdmFyIGNlbnRlciA9IHJlZmVyZW5jZVtzaWRlXSArIHJlZmVyZW5jZVtsZW5dIC8gMiAtIGFycm93RWxlbWVudFNpemUgLyAyO1xuXG4gIC8vIENvbXB1dGUgdGhlIHNpZGVWYWx1ZSB1c2luZyB0aGUgdXBkYXRlZCBwb3BwZXIgb2Zmc2V0c1xuICAvLyB0YWtlIHBvcHBlciBtYXJnaW4gaW4gYWNjb3VudCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhpcyBpbmZvIGF2YWlsYWJsZVxuICB2YXIgY3NzID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGRhdGEuaW5zdGFuY2UucG9wcGVyKTtcbiAgdmFyIHBvcHBlck1hcmdpblNpZGUgPSBwYXJzZUZsb2F0KGNzc1snbWFyZ2luJyArIHNpZGVDYXBpdGFsaXplZF0sIDEwKTtcbiAgdmFyIHBvcHBlckJvcmRlclNpZGUgPSBwYXJzZUZsb2F0KGNzc1snYm9yZGVyJyArIHNpZGVDYXBpdGFsaXplZCArICdXaWR0aCddLCAxMCk7XG4gIHZhciBzaWRlVmFsdWUgPSBjZW50ZXIgLSBkYXRhLm9mZnNldHMucG9wcGVyW3NpZGVdIC0gcG9wcGVyTWFyZ2luU2lkZSAtIHBvcHBlckJvcmRlclNpZGU7XG5cbiAgLy8gcHJldmVudCBhcnJvd0VsZW1lbnQgZnJvbSBiZWluZyBwbGFjZWQgbm90IGNvbnRpZ3VvdXNseSB0byBpdHMgcG9wcGVyXG4gIHNpZGVWYWx1ZSA9IE1hdGgubWF4KE1hdGgubWluKHBvcHBlcltsZW5dIC0gYXJyb3dFbGVtZW50U2l6ZSwgc2lkZVZhbHVlKSwgMCk7XG5cbiAgZGF0YS5hcnJvd0VsZW1lbnQgPSBhcnJvd0VsZW1lbnQ7XG4gIGRhdGEub2Zmc2V0cy5hcnJvdyA9IChfZGF0YSRvZmZzZXRzJGFycm93ID0ge30sIGRlZmluZVByb3BlcnR5KF9kYXRhJG9mZnNldHMkYXJyb3csIHNpZGUsIE1hdGgucm91bmQoc2lkZVZhbHVlKSksIGRlZmluZVByb3BlcnR5KF9kYXRhJG9mZnNldHMkYXJyb3csIGFsdFNpZGUsICcnKSwgX2RhdGEkb2Zmc2V0cyRhcnJvdyk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogR2V0IHRoZSBvcHBvc2l0ZSBwbGFjZW1lbnQgdmFyaWF0aW9uIG9mIHRoZSBnaXZlbiBvbmVcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwbGFjZW1lbnQgdmFyaWF0aW9uXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBmbGlwcGVkIHBsYWNlbWVudCB2YXJpYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVWYXJpYXRpb24odmFyaWF0aW9uKSB7XG4gIGlmICh2YXJpYXRpb24gPT09ICdlbmQnKSB7XG4gICAgcmV0dXJuICdzdGFydCc7XG4gIH0gZWxzZSBpZiAodmFyaWF0aW9uID09PSAnc3RhcnQnKSB7XG4gICAgcmV0dXJuICdlbmQnO1xuICB9XG4gIHJldHVybiB2YXJpYXRpb247XG59XG5cbi8qKlxuICogTGlzdCBvZiBhY2NlcHRlZCBwbGFjZW1lbnRzIHRvIHVzZSBhcyB2YWx1ZXMgb2YgdGhlIGBwbGFjZW1lbnRgIG9wdGlvbi48YnIgLz5cbiAqIFZhbGlkIHBsYWNlbWVudHMgYXJlOlxuICogLSBgYXV0b2BcbiAqIC0gYHRvcGBcbiAqIC0gYHJpZ2h0YFxuICogLSBgYm90dG9tYFxuICogLSBgbGVmdGBcbiAqXG4gKiBFYWNoIHBsYWNlbWVudCBjYW4gaGF2ZSBhIHZhcmlhdGlvbiBmcm9tIHRoaXMgbGlzdDpcbiAqIC0gYC1zdGFydGBcbiAqIC0gYC1lbmRgXG4gKlxuICogVmFyaWF0aW9ucyBhcmUgaW50ZXJwcmV0ZWQgZWFzaWx5IGlmIHlvdSB0aGluayBvZiB0aGVtIGFzIHRoZSBsZWZ0IHRvIHJpZ2h0XG4gKiB3cml0dGVuIGxhbmd1YWdlcy4gSG9yaXpvbnRhbGx5IChgdG9wYCBhbmQgYGJvdHRvbWApLCBgc3RhcnRgIGlzIGxlZnQgYW5kIGBlbmRgXG4gKiBpcyByaWdodC48YnIgLz5cbiAqIFZlcnRpY2FsbHkgKGBsZWZ0YCBhbmQgYHJpZ2h0YCksIGBzdGFydGAgaXMgdG9wIGFuZCBgZW5kYCBpcyBib3R0b20uXG4gKlxuICogU29tZSB2YWxpZCBleGFtcGxlcyBhcmU6XG4gKiAtIGB0b3AtZW5kYCAob24gdG9wIG9mIHJlZmVyZW5jZSwgcmlnaHQgYWxpZ25lZClcbiAqIC0gYHJpZ2h0LXN0YXJ0YCAob24gcmlnaHQgb2YgcmVmZXJlbmNlLCB0b3AgYWxpZ25lZClcbiAqIC0gYGJvdHRvbWAgKG9uIGJvdHRvbSwgY2VudGVyZWQpXG4gKiAtIGBhdXRvLXJpZ2h0YCAob24gdGhlIHNpZGUgd2l0aCBtb3JlIHNwYWNlIGF2YWlsYWJsZSwgYWxpZ25tZW50IGRlcGVuZHMgYnkgcGxhY2VtZW50KVxuICpcbiAqIEBzdGF0aWNcbiAqIEB0eXBlIHtBcnJheX1cbiAqIEBlbnVtIHtTdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZXRob2QgcGxhY2VtZW50c1xuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG52YXIgcGxhY2VtZW50cyA9IFsnYXV0by1zdGFydCcsICdhdXRvJywgJ2F1dG8tZW5kJywgJ3RvcC1zdGFydCcsICd0b3AnLCAndG9wLWVuZCcsICdyaWdodC1zdGFydCcsICdyaWdodCcsICdyaWdodC1lbmQnLCAnYm90dG9tLWVuZCcsICdib3R0b20nLCAnYm90dG9tLXN0YXJ0JywgJ2xlZnQtZW5kJywgJ2xlZnQnLCAnbGVmdC1zdGFydCddO1xuXG4vLyBHZXQgcmlkIG9mIGBhdXRvYCBgYXV0by1zdGFydGAgYW5kIGBhdXRvLWVuZGBcbnZhciB2YWxpZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzLnNsaWNlKDMpO1xuXG4vKipcbiAqIEdpdmVuIGFuIGluaXRpYWwgcGxhY2VtZW50LCByZXR1cm5zIGFsbCB0aGUgc3Vic2VxdWVudCBwbGFjZW1lbnRzXG4gKiBjbG9ja3dpc2UgKG9yIGNvdW50ZXItY2xvY2t3aXNlKS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gcGxhY2VtZW50IC0gQSB2YWxpZCBwbGFjZW1lbnQgKGl0IGFjY2VwdHMgdmFyaWF0aW9ucylcbiAqIEBhcmd1bWVudCB7Qm9vbGVhbn0gY291bnRlciAtIFNldCB0byB0cnVlIHRvIHdhbGsgdGhlIHBsYWNlbWVudHMgY291bnRlcmNsb2Nrd2lzZVxuICogQHJldHVybnMge0FycmF5fSBwbGFjZW1lbnRzIGluY2x1ZGluZyB0aGVpciB2YXJpYXRpb25zXG4gKi9cbmZ1bmN0aW9uIGNsb2Nrd2lzZShwbGFjZW1lbnQpIHtcbiAgdmFyIGNvdW50ZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIHZhciBpbmRleCA9IHZhbGlkUGxhY2VtZW50cy5pbmRleE9mKHBsYWNlbWVudCk7XG4gIHZhciBhcnIgPSB2YWxpZFBsYWNlbWVudHMuc2xpY2UoaW5kZXggKyAxKS5jb25jYXQodmFsaWRQbGFjZW1lbnRzLnNsaWNlKDAsIGluZGV4KSk7XG4gIHJldHVybiBjb3VudGVyID8gYXJyLnJldmVyc2UoKSA6IGFycjtcbn1cblxudmFyIEJFSEFWSU9SUyA9IHtcbiAgRkxJUDogJ2ZsaXAnLFxuICBDTE9DS1dJU0U6ICdjbG9ja3dpc2UnLFxuICBDT1VOVEVSQ0xPQ0tXSVNFOiAnY291bnRlcmNsb2Nrd2lzZSdcbn07XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBmbGlwKGRhdGEsIG9wdGlvbnMpIHtcbiAgLy8gaWYgYGlubmVyYCBtb2RpZmllciBpcyBlbmFibGVkLCB3ZSBjYW4ndCB1c2UgdGhlIGBmbGlwYCBtb2RpZmllclxuICBpZiAoaXNNb2RpZmllckVuYWJsZWQoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsICdpbm5lcicpKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBpZiAoZGF0YS5mbGlwcGVkICYmIGRhdGEucGxhY2VtZW50ID09PSBkYXRhLm9yaWdpbmFsUGxhY2VtZW50KSB7XG4gICAgLy8gc2VlbXMgbGlrZSBmbGlwIGlzIHRyeWluZyB0byBsb29wLCBwcm9iYWJseSB0aGVyZSdzIG5vdCBlbm91Z2ggc3BhY2Ugb24gYW55IG9mIHRoZSBmbGlwcGFibGUgc2lkZXNcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciBib3VuZGFyaWVzID0gZ2V0Qm91bmRhcmllcyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5pbnN0YW5jZS5yZWZlcmVuY2UsIG9wdGlvbnMucGFkZGluZywgb3B0aW9ucy5ib3VuZGFyaWVzRWxlbWVudCwgZGF0YS5wb3NpdGlvbkZpeGVkKTtcblxuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgdmFyIHBsYWNlbWVudE9wcG9zaXRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgdmFyIHZhcmlhdGlvbiA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMV0gfHwgJyc7XG5cbiAgdmFyIGZsaXBPcmRlciA9IFtdO1xuXG4gIHN3aXRjaCAob3B0aW9ucy5iZWhhdmlvcikge1xuICAgIGNhc2UgQkVIQVZJT1JTLkZMSVA6XG4gICAgICBmbGlwT3JkZXIgPSBbcGxhY2VtZW50LCBwbGFjZW1lbnRPcHBvc2l0ZV07XG4gICAgICBicmVhaztcbiAgICBjYXNlIEJFSEFWSU9SUy5DTE9DS1dJU0U6XG4gICAgICBmbGlwT3JkZXIgPSBjbG9ja3dpc2UocGxhY2VtZW50KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQkVIQVZJT1JTLkNPVU5URVJDTE9DS1dJU0U6XG4gICAgICBmbGlwT3JkZXIgPSBjbG9ja3dpc2UocGxhY2VtZW50LCB0cnVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBmbGlwT3JkZXIgPSBvcHRpb25zLmJlaGF2aW9yO1xuICB9XG5cbiAgZmxpcE9yZGVyLmZvckVhY2goZnVuY3Rpb24gKHN0ZXAsIGluZGV4KSB7XG4gICAgaWYgKHBsYWNlbWVudCAhPT0gc3RlcCB8fCBmbGlwT3JkZXIubGVuZ3RoID09PSBpbmRleCArIDEpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gICAgcGxhY2VtZW50T3Bwb3NpdGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuXG4gICAgdmFyIHBvcHBlck9mZnNldHMgPSBkYXRhLm9mZnNldHMucG9wcGVyO1xuICAgIHZhciByZWZPZmZzZXRzID0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZTtcblxuICAgIC8vIHVzaW5nIGZsb29yIGJlY2F1c2UgdGhlIHJlZmVyZW5jZSBvZmZzZXRzIG1heSBjb250YWluIGRlY2ltYWxzIHdlIGFyZSBub3QgZ29pbmcgdG8gY29uc2lkZXIgaGVyZVxuICAgIHZhciBmbG9vciA9IE1hdGguZmxvb3I7XG4gICAgdmFyIG92ZXJsYXBzUmVmID0gcGxhY2VtZW50ID09PSAnbGVmdCcgJiYgZmxvb3IocG9wcGVyT2Zmc2V0cy5yaWdodCkgPiBmbG9vcihyZWZPZmZzZXRzLmxlZnQpIHx8IHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLmxlZnQpIDwgZmxvb3IocmVmT2Zmc2V0cy5yaWdodCkgfHwgcGxhY2VtZW50ID09PSAndG9wJyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLmJvdHRvbSkgPiBmbG9vcihyZWZPZmZzZXRzLnRvcCkgfHwgcGxhY2VtZW50ID09PSAnYm90dG9tJyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLnRvcCkgPCBmbG9vcihyZWZPZmZzZXRzLmJvdHRvbSk7XG5cbiAgICB2YXIgb3ZlcmZsb3dzTGVmdCA9IGZsb29yKHBvcHBlck9mZnNldHMubGVmdCkgPCBmbG9vcihib3VuZGFyaWVzLmxlZnQpO1xuICAgIHZhciBvdmVyZmxvd3NSaWdodCA9IGZsb29yKHBvcHBlck9mZnNldHMucmlnaHQpID4gZmxvb3IoYm91bmRhcmllcy5yaWdodCk7XG4gICAgdmFyIG92ZXJmbG93c1RvcCA9IGZsb29yKHBvcHBlck9mZnNldHMudG9wKSA8IGZsb29yKGJvdW5kYXJpZXMudG9wKTtcbiAgICB2YXIgb3ZlcmZsb3dzQm90dG9tID0gZmxvb3IocG9wcGVyT2Zmc2V0cy5ib3R0b20pID4gZmxvb3IoYm91bmRhcmllcy5ib3R0b20pO1xuXG4gICAgdmFyIG92ZXJmbG93c0JvdW5kYXJpZXMgPSBwbGFjZW1lbnQgPT09ICdsZWZ0JyAmJiBvdmVyZmxvd3NMZWZ0IHx8IHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyAmJiBvdmVyZmxvd3NSaWdodCB8fCBwbGFjZW1lbnQgPT09ICd0b3AnICYmIG92ZXJmbG93c1RvcCB8fCBwbGFjZW1lbnQgPT09ICdib3R0b20nICYmIG92ZXJmbG93c0JvdHRvbTtcblxuICAgIC8vIGZsaXAgdGhlIHZhcmlhdGlvbiBpZiByZXF1aXJlZFxuICAgIHZhciBpc1ZlcnRpY2FsID0gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTtcbiAgICB2YXIgZmxpcHBlZFZhcmlhdGlvbiA9ICEhb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyAmJiAoaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdzdGFydCcgJiYgb3ZlcmZsb3dzTGVmdCB8fCBpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ2VuZCcgJiYgb3ZlcmZsb3dzUmlnaHQgfHwgIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnc3RhcnQnICYmIG92ZXJmbG93c1RvcCB8fCAhaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c0JvdHRvbSk7XG5cbiAgICBpZiAob3ZlcmxhcHNSZWYgfHwgb3ZlcmZsb3dzQm91bmRhcmllcyB8fCBmbGlwcGVkVmFyaWF0aW9uKSB7XG4gICAgICAvLyB0aGlzIGJvb2xlYW4gdG8gZGV0ZWN0IGFueSBmbGlwIGxvb3BcbiAgICAgIGRhdGEuZmxpcHBlZCA9IHRydWU7XG5cbiAgICAgIGlmIChvdmVybGFwc1JlZiB8fCBvdmVyZmxvd3NCb3VuZGFyaWVzKSB7XG4gICAgICAgIHBsYWNlbWVudCA9IGZsaXBPcmRlcltpbmRleCArIDFdO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmxpcHBlZFZhcmlhdGlvbikge1xuICAgICAgICB2YXJpYXRpb24gPSBnZXRPcHBvc2l0ZVZhcmlhdGlvbih2YXJpYXRpb24pO1xuICAgICAgfVxuXG4gICAgICBkYXRhLnBsYWNlbWVudCA9IHBsYWNlbWVudCArICh2YXJpYXRpb24gPyAnLScgKyB2YXJpYXRpb24gOiAnJyk7XG5cbiAgICAgIC8vIHRoaXMgb2JqZWN0IGNvbnRhaW5zIGBwb3NpdGlvbmAsIHdlIHdhbnQgdG8gcHJlc2VydmUgaXQgYWxvbmcgd2l0aFxuICAgICAgLy8gYW55IGFkZGl0aW9uYWwgcHJvcGVydHkgd2UgbWF5IGFkZCBpbiB0aGUgZnV0dXJlXG4gICAgICBkYXRhLm9mZnNldHMucG9wcGVyID0gX2V4dGVuZHMoe30sIGRhdGEub2Zmc2V0cy5wb3BwZXIsIGdldFBvcHBlck9mZnNldHMoZGF0YS5pbnN0YW5jZS5wb3BwZXIsIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UsIGRhdGEucGxhY2VtZW50KSk7XG5cbiAgICAgIGRhdGEgPSBydW5Nb2RpZmllcnMoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsIGRhdGEsICdmbGlwJyk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBrZWVwVG9nZXRoZXIoZGF0YSkge1xuICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyLFxuICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2U7XG5cbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIHZhciBmbG9vciA9IE1hdGguZmxvb3I7XG4gIHZhciBpc1ZlcnRpY2FsID0gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTtcbiAgdmFyIHNpZGUgPSBpc1ZlcnRpY2FsID8gJ3JpZ2h0JyA6ICdib3R0b20nO1xuICB2YXIgb3BTaWRlID0gaXNWZXJ0aWNhbCA/ICdsZWZ0JyA6ICd0b3AnO1xuICB2YXIgbWVhc3VyZW1lbnQgPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuXG4gIGlmIChwb3BwZXJbc2lkZV0gPCBmbG9vcihyZWZlcmVuY2Vbb3BTaWRlXSkpIHtcbiAgICBkYXRhLm9mZnNldHMucG9wcGVyW29wU2lkZV0gPSBmbG9vcihyZWZlcmVuY2Vbb3BTaWRlXSkgLSBwb3BwZXJbbWVhc3VyZW1lbnRdO1xuICB9XG4gIGlmIChwb3BwZXJbb3BTaWRlXSA+IGZsb29yKHJlZmVyZW5jZVtzaWRlXSkpIHtcbiAgICBkYXRhLm9mZnNldHMucG9wcGVyW29wU2lkZV0gPSBmbG9vcihyZWZlcmVuY2Vbc2lkZV0pO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgY29udGFpbmluZyB2YWx1ZSArIHVuaXQgaW50byBhIHB4IHZhbHVlIG51bWJlclxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2Yge21vZGlmaWVyc35vZmZzZXR9XG4gKiBAcHJpdmF0ZVxuICogQGFyZ3VtZW50IHtTdHJpbmd9IHN0ciAtIFZhbHVlICsgdW5pdCBzdHJpbmdcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBtZWFzdXJlbWVudCAtIGBoZWlnaHRgIG9yIGB3aWR0aGBcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBwb3BwZXJPZmZzZXRzXG4gKiBAYXJndW1lbnQge09iamVjdH0gcmVmZXJlbmNlT2Zmc2V0c1xuICogQHJldHVybnMge051bWJlcnxTdHJpbmd9XG4gKiBWYWx1ZSBpbiBwaXhlbHMsIG9yIG9yaWdpbmFsIHN0cmluZyBpZiBubyB2YWx1ZXMgd2VyZSBleHRyYWN0ZWRcbiAqL1xuZnVuY3Rpb24gdG9WYWx1ZShzdHIsIG1lYXN1cmVtZW50LCBwb3BwZXJPZmZzZXRzLCByZWZlcmVuY2VPZmZzZXRzKSB7XG4gIC8vIHNlcGFyYXRlIHZhbHVlIGZyb20gdW5pdFxuICB2YXIgc3BsaXQgPSBzdHIubWF0Y2goLygoPzpcXC18XFwrKT9cXGQqXFwuP1xcZCopKC4qKS8pO1xuICB2YXIgdmFsdWUgPSArc3BsaXRbMV07XG4gIHZhciB1bml0ID0gc3BsaXRbMl07XG5cbiAgLy8gSWYgaXQncyBub3QgYSBudW1iZXIgaXQncyBhbiBvcGVyYXRvciwgSSBndWVzc1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGlmICh1bml0LmluZGV4T2YoJyUnKSA9PT0gMCkge1xuICAgIHZhciBlbGVtZW50ID0gdm9pZCAwO1xuICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgY2FzZSAnJXAnOlxuICAgICAgICBlbGVtZW50ID0gcG9wcGVyT2Zmc2V0cztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICclJzpcbiAgICAgIGNhc2UgJyVyJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGVsZW1lbnQgPSByZWZlcmVuY2VPZmZzZXRzO1xuICAgIH1cblxuICAgIHZhciByZWN0ID0gZ2V0Q2xpZW50UmVjdChlbGVtZW50KTtcbiAgICByZXR1cm4gcmVjdFttZWFzdXJlbWVudF0gLyAxMDAgKiB2YWx1ZTtcbiAgfSBlbHNlIGlmICh1bml0ID09PSAndmgnIHx8IHVuaXQgPT09ICd2dycpIHtcbiAgICAvLyBpZiBpcyBhIHZoIG9yIHZ3LCB3ZSBjYWxjdWxhdGUgdGhlIHNpemUgYmFzZWQgb24gdGhlIHZpZXdwb3J0XG4gICAgdmFyIHNpemUgPSB2b2lkIDA7XG4gICAgaWYgKHVuaXQgPT09ICd2aCcpIHtcbiAgICAgIHNpemUgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNpemUgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZSAvIDEwMCAqIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIGlzIGFuIGV4cGxpY2l0IHBpeGVsIHVuaXQsIHdlIGdldCByaWQgb2YgdGhlIHVuaXQgYW5kIGtlZXAgdGhlIHZhbHVlXG4gICAgLy8gaWYgaXMgYW4gaW1wbGljaXQgdW5pdCwgaXQncyBweCwgYW5kIHdlIHJldHVybiBqdXN0IHRoZSB2YWx1ZVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIGFuIGBvZmZzZXRgIHN0cmluZyB0byBleHRyYXBvbGF0ZSBgeGAgYW5kIGB5YCBudW1lcmljIG9mZnNldHMuXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiB7bW9kaWZpZXJzfm9mZnNldH1cbiAqIEBwcml2YXRlXG4gKiBAYXJndW1lbnQge1N0cmluZ30gb2Zmc2V0XG4gKiBAYXJndW1lbnQge09iamVjdH0gcG9wcGVyT2Zmc2V0c1xuICogQGFyZ3VtZW50IHtPYmplY3R9IHJlZmVyZW5jZU9mZnNldHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBiYXNlUGxhY2VtZW50XG4gKiBAcmV0dXJucyB7QXJyYXl9IGEgdHdvIGNlbGxzIGFycmF5IHdpdGggeCBhbmQgeSBvZmZzZXRzIGluIG51bWJlcnNcbiAqL1xuZnVuY3Rpb24gcGFyc2VPZmZzZXQob2Zmc2V0LCBwb3BwZXJPZmZzZXRzLCByZWZlcmVuY2VPZmZzZXRzLCBiYXNlUGxhY2VtZW50KSB7XG4gIHZhciBvZmZzZXRzID0gWzAsIDBdO1xuXG4gIC8vIFVzZSBoZWlnaHQgaWYgcGxhY2VtZW50IGlzIGxlZnQgb3IgcmlnaHQgYW5kIGluZGV4IGlzIDAgb3RoZXJ3aXNlIHVzZSB3aWR0aFxuICAvLyBpbiB0aGlzIHdheSB0aGUgZmlyc3Qgb2Zmc2V0IHdpbGwgdXNlIGFuIGF4aXMgYW5kIHRoZSBzZWNvbmQgb25lXG4gIC8vIHdpbGwgdXNlIHRoZSBvdGhlciBvbmVcbiAgdmFyIHVzZUhlaWdodCA9IFsncmlnaHQnLCAnbGVmdCddLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xO1xuXG4gIC8vIFNwbGl0IHRoZSBvZmZzZXQgc3RyaW5nIHRvIG9idGFpbiBhIGxpc3Qgb2YgdmFsdWVzIGFuZCBvcGVyYW5kc1xuICAvLyBUaGUgcmVnZXggYWRkcmVzc2VzIHZhbHVlcyB3aXRoIHRoZSBwbHVzIG9yIG1pbnVzIHNpZ24gaW4gZnJvbnQgKCsxMCwgLTIwLCBldGMpXG4gIHZhciBmcmFnbWVudHMgPSBvZmZzZXQuc3BsaXQoLyhcXCt8XFwtKS8pLm1hcChmdW5jdGlvbiAoZnJhZykge1xuICAgIHJldHVybiBmcmFnLnRyaW0oKTtcbiAgfSk7XG5cbiAgLy8gRGV0ZWN0IGlmIHRoZSBvZmZzZXQgc3RyaW5nIGNvbnRhaW5zIGEgcGFpciBvZiB2YWx1ZXMgb3IgYSBzaW5nbGUgb25lXG4gIC8vIHRoZXkgY291bGQgYmUgc2VwYXJhdGVkIGJ5IGNvbW1hIG9yIHNwYWNlXG4gIHZhciBkaXZpZGVyID0gZnJhZ21lbnRzLmluZGV4T2YoZmluZChmcmFnbWVudHMsIGZ1bmN0aW9uIChmcmFnKSB7XG4gICAgcmV0dXJuIGZyYWcuc2VhcmNoKC8sfFxccy8pICE9PSAtMTtcbiAgfSkpO1xuXG4gIGlmIChmcmFnbWVudHNbZGl2aWRlcl0gJiYgZnJhZ21lbnRzW2RpdmlkZXJdLmluZGV4T2YoJywnKSA9PT0gLTEpIHtcbiAgICBjb25zb2xlLndhcm4oJ09mZnNldHMgc2VwYXJhdGVkIGJ5IHdoaXRlIHNwYWNlKHMpIGFyZSBkZXByZWNhdGVkLCB1c2UgYSBjb21tYSAoLCkgaW5zdGVhZC4nKTtcbiAgfVxuXG4gIC8vIElmIGRpdmlkZXIgaXMgZm91bmQsIHdlIGRpdmlkZSB0aGUgbGlzdCBvZiB2YWx1ZXMgYW5kIG9wZXJhbmRzIHRvIGRpdmlkZVxuICAvLyB0aGVtIGJ5IG9mc2V0IFggYW5kIFkuXG4gIHZhciBzcGxpdFJlZ2V4ID0gL1xccyosXFxzKnxcXHMrLztcbiAgdmFyIG9wcyA9IGRpdmlkZXIgIT09IC0xID8gW2ZyYWdtZW50cy5zbGljZSgwLCBkaXZpZGVyKS5jb25jYXQoW2ZyYWdtZW50c1tkaXZpZGVyXS5zcGxpdChzcGxpdFJlZ2V4KVswXV0pLCBbZnJhZ21lbnRzW2RpdmlkZXJdLnNwbGl0KHNwbGl0UmVnZXgpWzFdXS5jb25jYXQoZnJhZ21lbnRzLnNsaWNlKGRpdmlkZXIgKyAxKSldIDogW2ZyYWdtZW50c107XG5cbiAgLy8gQ29udmVydCB0aGUgdmFsdWVzIHdpdGggdW5pdHMgdG8gYWJzb2x1dGUgcGl4ZWxzIHRvIGFsbG93IG91ciBjb21wdXRhdGlvbnNcbiAgb3BzID0gb3BzLm1hcChmdW5jdGlvbiAob3AsIGluZGV4KSB7XG4gICAgLy8gTW9zdCBvZiB0aGUgdW5pdHMgcmVseSBvbiB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHBvcHBlclxuICAgIHZhciBtZWFzdXJlbWVudCA9IChpbmRleCA9PT0gMSA/ICF1c2VIZWlnaHQgOiB1c2VIZWlnaHQpID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICAgIHZhciBtZXJnZVdpdGhQcmV2aW91cyA9IGZhbHNlO1xuICAgIHJldHVybiBvcFxuICAgIC8vIFRoaXMgYWdncmVnYXRlcyBhbnkgYCtgIG9yIGAtYCBzaWduIHRoYXQgYXJlbid0IGNvbnNpZGVyZWQgb3BlcmF0b3JzXG4gICAgLy8gZS5nLjogMTAgKyArNSA9PiBbMTAsICssICs1XVxuICAgIC5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIGlmIChhW2EubGVuZ3RoIC0gMV0gPT09ICcnICYmIFsnKycsICctJ10uaW5kZXhPZihiKSAhPT0gLTEpIHtcbiAgICAgICAgYVthLmxlbmd0aCAtIDFdID0gYjtcbiAgICAgICAgbWVyZ2VXaXRoUHJldmlvdXMgPSB0cnVlO1xuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH0gZWxzZSBpZiAobWVyZ2VXaXRoUHJldmlvdXMpIHtcbiAgICAgICAgYVthLmxlbmd0aCAtIDFdICs9IGI7XG4gICAgICAgIG1lcmdlV2l0aFByZXZpb3VzID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGEuY29uY2F0KGIpO1xuICAgICAgfVxuICAgIH0sIFtdKVxuICAgIC8vIEhlcmUgd2UgY29udmVydCB0aGUgc3RyaW5nIHZhbHVlcyBpbnRvIG51bWJlciB2YWx1ZXMgKGluIHB4KVxuICAgIC5tYXAoZnVuY3Rpb24gKHN0cikge1xuICAgICAgcmV0dXJuIHRvVmFsdWUoc3RyLCBtZWFzdXJlbWVudCwgcG9wcGVyT2Zmc2V0cywgcmVmZXJlbmNlT2Zmc2V0cyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIExvb3AgdHJvdWdoIHRoZSBvZmZzZXRzIGFycmF5cyBhbmQgZXhlY3V0ZSB0aGUgb3BlcmF0aW9uc1xuICBvcHMuZm9yRWFjaChmdW5jdGlvbiAob3AsIGluZGV4KSB7XG4gICAgb3AuZm9yRWFjaChmdW5jdGlvbiAoZnJhZywgaW5kZXgyKSB7XG4gICAgICBpZiAoaXNOdW1lcmljKGZyYWcpKSB7XG4gICAgICAgIG9mZnNldHNbaW5kZXhdICs9IGZyYWcgKiAob3BbaW5kZXgyIC0gMV0gPT09ICctJyA/IC0xIDogMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gb2Zmc2V0cztcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAYXJndW1lbnQge051bWJlcnxTdHJpbmd9IG9wdGlvbnMub2Zmc2V0PTBcbiAqIFRoZSBvZmZzZXQgdmFsdWUgYXMgZGVzY3JpYmVkIGluIHRoZSBtb2RpZmllciBkZXNjcmlwdGlvblxuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBvZmZzZXQoZGF0YSwgX3JlZikge1xuICB2YXIgb2Zmc2V0ID0gX3JlZi5vZmZzZXQ7XG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudCxcbiAgICAgIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcixcbiAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlO1xuXG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG5cbiAgdmFyIG9mZnNldHMgPSB2b2lkIDA7XG4gIGlmIChpc051bWVyaWMoK29mZnNldCkpIHtcbiAgICBvZmZzZXRzID0gWytvZmZzZXQsIDBdO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldHMgPSBwYXJzZU9mZnNldChvZmZzZXQsIHBvcHBlciwgcmVmZXJlbmNlLCBiYXNlUGxhY2VtZW50KTtcbiAgfVxuXG4gIGlmIChiYXNlUGxhY2VtZW50ID09PSAnbGVmdCcpIHtcbiAgICBwb3BwZXIudG9wICs9IG9mZnNldHNbMF07XG4gICAgcG9wcGVyLmxlZnQgLT0gb2Zmc2V0c1sxXTtcbiAgfSBlbHNlIGlmIChiYXNlUGxhY2VtZW50ID09PSAncmlnaHQnKSB7XG4gICAgcG9wcGVyLnRvcCArPSBvZmZzZXRzWzBdO1xuICAgIHBvcHBlci5sZWZ0ICs9IG9mZnNldHNbMV07XG4gIH0gZWxzZSBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ3RvcCcpIHtcbiAgICBwb3BwZXIubGVmdCArPSBvZmZzZXRzWzBdO1xuICAgIHBvcHBlci50b3AgLT0gb2Zmc2V0c1sxXTtcbiAgfSBlbHNlIGlmIChiYXNlUGxhY2VtZW50ID09PSAnYm90dG9tJykge1xuICAgIHBvcHBlci5sZWZ0ICs9IG9mZnNldHNbMF07XG4gICAgcG9wcGVyLnRvcCArPSBvZmZzZXRzWzFdO1xuICB9XG5cbiAgZGF0YS5wb3BwZXIgPSBwb3BwZXI7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBwcmV2ZW50T3ZlcmZsb3coZGF0YSwgb3B0aW9ucykge1xuICB2YXIgYm91bmRhcmllc0VsZW1lbnQgPSBvcHRpb25zLmJvdW5kYXJpZXNFbGVtZW50IHx8IGdldE9mZnNldFBhcmVudChkYXRhLmluc3RhbmNlLnBvcHBlcik7XG5cbiAgLy8gSWYgb2Zmc2V0UGFyZW50IGlzIHRoZSByZWZlcmVuY2UgZWxlbWVudCwgd2UgcmVhbGx5IHdhbnQgdG9cbiAgLy8gZ28gb25lIHN0ZXAgdXAgYW5kIHVzZSB0aGUgbmV4dCBvZmZzZXRQYXJlbnQgYXMgcmVmZXJlbmNlIHRvXG4gIC8vIGF2b2lkIHRvIG1ha2UgdGhpcyBtb2RpZmllciBjb21wbGV0ZWx5IHVzZWxlc3MgYW5kIGxvb2sgbGlrZSBicm9rZW5cbiAgaWYgKGRhdGEuaW5zdGFuY2UucmVmZXJlbmNlID09PSBib3VuZGFyaWVzRWxlbWVudCkge1xuICAgIGJvdW5kYXJpZXNFbGVtZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGJvdW5kYXJpZXNFbGVtZW50KTtcbiAgfVxuXG4gIC8vIE5PVEU6IERPTSBhY2Nlc3MgaGVyZVxuICAvLyByZXNldHMgdGhlIHBvcHBlcidzIHBvc2l0aW9uIHNvIHRoYXQgdGhlIGRvY3VtZW50IHNpemUgY2FuIGJlIGNhbGN1bGF0ZWQgZXhjbHVkaW5nXG4gIC8vIHRoZSBzaXplIG9mIHRoZSBwb3BwZXIgZWxlbWVudCBpdHNlbGZcbiAgdmFyIHRyYW5zZm9ybVByb3AgPSBnZXRTdXBwb3J0ZWRQcm9wZXJ0eU5hbWUoJ3RyYW5zZm9ybScpO1xuICB2YXIgcG9wcGVyU3R5bGVzID0gZGF0YS5pbnN0YW5jZS5wb3BwZXIuc3R5bGU7IC8vIGFzc2lnbm1lbnQgdG8gaGVscCBtaW5pZmljYXRpb25cbiAgdmFyIHRvcCA9IHBvcHBlclN0eWxlcy50b3AsXG4gICAgICBsZWZ0ID0gcG9wcGVyU3R5bGVzLmxlZnQsXG4gICAgICB0cmFuc2Zvcm0gPSBwb3BwZXJTdHlsZXNbdHJhbnNmb3JtUHJvcF07XG5cbiAgcG9wcGVyU3R5bGVzLnRvcCA9ICcnO1xuICBwb3BwZXJTdHlsZXMubGVmdCA9ICcnO1xuICBwb3BwZXJTdHlsZXNbdHJhbnNmb3JtUHJvcF0gPSAnJztcblxuICB2YXIgYm91bmRhcmllcyA9IGdldEJvdW5kYXJpZXMoZGF0YS5pbnN0YW5jZS5wb3BwZXIsIGRhdGEuaW5zdGFuY2UucmVmZXJlbmNlLCBvcHRpb25zLnBhZGRpbmcsIGJvdW5kYXJpZXNFbGVtZW50LCBkYXRhLnBvc2l0aW9uRml4ZWQpO1xuXG4gIC8vIE5PVEU6IERPTSBhY2Nlc3MgaGVyZVxuICAvLyByZXN0b3JlcyB0aGUgb3JpZ2luYWwgc3R5bGUgcHJvcGVydGllcyBhZnRlciB0aGUgb2Zmc2V0cyBoYXZlIGJlZW4gY29tcHV0ZWRcbiAgcG9wcGVyU3R5bGVzLnRvcCA9IHRvcDtcbiAgcG9wcGVyU3R5bGVzLmxlZnQgPSBsZWZ0O1xuICBwb3BwZXJTdHlsZXNbdHJhbnNmb3JtUHJvcF0gPSB0cmFuc2Zvcm07XG5cbiAgb3B0aW9ucy5ib3VuZGFyaWVzID0gYm91bmRhcmllcztcblxuICB2YXIgb3JkZXIgPSBvcHRpb25zLnByaW9yaXR5O1xuICB2YXIgcG9wcGVyID0gZGF0YS5vZmZzZXRzLnBvcHBlcjtcblxuICB2YXIgY2hlY2sgPSB7XG4gICAgcHJpbWFyeTogZnVuY3Rpb24gcHJpbWFyeShwbGFjZW1lbnQpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHBvcHBlcltwbGFjZW1lbnRdO1xuICAgICAgaWYgKHBvcHBlcltwbGFjZW1lbnRdIDwgYm91bmRhcmllc1twbGFjZW1lbnRdICYmICFvcHRpb25zLmVzY2FwZVdpdGhSZWZlcmVuY2UpIHtcbiAgICAgICAgdmFsdWUgPSBNYXRoLm1heChwb3BwZXJbcGxhY2VtZW50XSwgYm91bmRhcmllc1twbGFjZW1lbnRdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eSh7fSwgcGxhY2VtZW50LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZWNvbmRhcnk6IGZ1bmN0aW9uIHNlY29uZGFyeShwbGFjZW1lbnQpIHtcbiAgICAgIHZhciBtYWluU2lkZSA9IHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyA/ICdsZWZ0JyA6ICd0b3AnO1xuICAgICAgdmFyIHZhbHVlID0gcG9wcGVyW21haW5TaWRlXTtcbiAgICAgIGlmIChwb3BwZXJbcGxhY2VtZW50XSA+IGJvdW5kYXJpZXNbcGxhY2VtZW50XSAmJiAhb3B0aW9ucy5lc2NhcGVXaXRoUmVmZXJlbmNlKSB7XG4gICAgICAgIHZhbHVlID0gTWF0aC5taW4ocG9wcGVyW21haW5TaWRlXSwgYm91bmRhcmllc1twbGFjZW1lbnRdIC0gKHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyA/IHBvcHBlci53aWR0aCA6IHBvcHBlci5oZWlnaHQpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eSh7fSwgbWFpblNpZGUsIHZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgb3JkZXIuZm9yRWFjaChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgdmFyIHNpZGUgPSBbJ2xlZnQnLCAndG9wJ10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMSA/ICdwcmltYXJ5JyA6ICdzZWNvbmRhcnknO1xuICAgIHBvcHBlciA9IF9leHRlbmRzKHt9LCBwb3BwZXIsIGNoZWNrW3NpZGVdKHBsYWNlbWVudCkpO1xuICB9KTtcblxuICBkYXRhLm9mZnNldHMucG9wcGVyID0gcG9wcGVyO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBzaGlmdChkYXRhKSB7XG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgdmFyIHNoaWZ0dmFyaWF0aW9uID0gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG5cbiAgLy8gaWYgc2hpZnQgc2hpZnR2YXJpYXRpb24gaXMgc3BlY2lmaWVkLCBydW4gdGhlIG1vZGlmaWVyXG4gIGlmIChzaGlmdHZhcmlhdGlvbikge1xuICAgIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZSxcbiAgICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXI7XG5cbiAgICB2YXIgaXNWZXJ0aWNhbCA9IFsnYm90dG9tJywgJ3RvcCddLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xO1xuICAgIHZhciBzaWRlID0gaXNWZXJ0aWNhbCA/ICdsZWZ0JyA6ICd0b3AnO1xuICAgIHZhciBtZWFzdXJlbWVudCA9IGlzVmVydGljYWwgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG5cbiAgICB2YXIgc2hpZnRPZmZzZXRzID0ge1xuICAgICAgc3RhcnQ6IGRlZmluZVByb3BlcnR5KHt9LCBzaWRlLCByZWZlcmVuY2Vbc2lkZV0pLFxuICAgICAgZW5kOiBkZWZpbmVQcm9wZXJ0eSh7fSwgc2lkZSwgcmVmZXJlbmNlW3NpZGVdICsgcmVmZXJlbmNlW21lYXN1cmVtZW50XSAtIHBvcHBlclttZWFzdXJlbWVudF0pXG4gICAgfTtcblxuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBfZXh0ZW5kcyh7fSwgcG9wcGVyLCBzaGlmdE9mZnNldHNbc2hpZnR2YXJpYXRpb25dKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gaGlkZShkYXRhKSB7XG4gIGlmICghaXNNb2RpZmllclJlcXVpcmVkKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCAnaGlkZScsICdwcmV2ZW50T3ZlcmZsb3cnKSkge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgdmFyIHJlZlJlY3QgPSBkYXRhLm9mZnNldHMucmVmZXJlbmNlO1xuICB2YXIgYm91bmQgPSBmaW5kKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCBmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICByZXR1cm4gbW9kaWZpZXIubmFtZSA9PT0gJ3ByZXZlbnRPdmVyZmxvdyc7XG4gIH0pLmJvdW5kYXJpZXM7XG5cbiAgaWYgKHJlZlJlY3QuYm90dG9tIDwgYm91bmQudG9wIHx8IHJlZlJlY3QubGVmdCA+IGJvdW5kLnJpZ2h0IHx8IHJlZlJlY3QudG9wID4gYm91bmQuYm90dG9tIHx8IHJlZlJlY3QucmlnaHQgPCBib3VuZC5sZWZ0KSB7XG4gICAgLy8gQXZvaWQgdW5uZWNlc3NhcnkgRE9NIGFjY2VzcyBpZiB2aXNpYmlsaXR5IGhhc24ndCBjaGFuZ2VkXG4gICAgaWYgKGRhdGEuaGlkZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgZGF0YS5oaWRlID0gdHJ1ZTtcbiAgICBkYXRhLmF0dHJpYnV0ZXNbJ3gtb3V0LW9mLWJvdW5kYXJpZXMnXSA9ICcnO1xuICB9IGVsc2Uge1xuICAgIC8vIEF2b2lkIHVubmVjZXNzYXJ5IERPTSBhY2Nlc3MgaWYgdmlzaWJpbGl0eSBoYXNuJ3QgY2hhbmdlZFxuICAgIGlmIChkYXRhLmhpZGUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBkYXRhLmhpZGUgPSBmYWxzZTtcbiAgICBkYXRhLmF0dHJpYnV0ZXNbJ3gtb3V0LW9mLWJvdW5kYXJpZXMnXSA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGlubmVyKGRhdGEpIHtcbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyLFxuICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2U7XG5cbiAgdmFyIGlzSG9yaXogPSBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcblxuICB2YXIgc3VidHJhY3RMZW5ndGggPSBbJ3RvcCcsICdsZWZ0J10uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA9PT0gLTE7XG5cbiAgcG9wcGVyW2lzSG9yaXogPyAnbGVmdCcgOiAndG9wJ10gPSByZWZlcmVuY2VbYmFzZVBsYWNlbWVudF0gLSAoc3VidHJhY3RMZW5ndGggPyBwb3BwZXJbaXNIb3JpeiA/ICd3aWR0aCcgOiAnaGVpZ2h0J10gOiAwKTtcblxuICBkYXRhLnBsYWNlbWVudCA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBnZXRDbGllbnRSZWN0KHBvcHBlcik7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogTW9kaWZpZXIgZnVuY3Rpb24sIGVhY2ggbW9kaWZpZXIgY2FuIGhhdmUgYSBmdW5jdGlvbiBvZiB0aGlzIHR5cGUgYXNzaWduZWRcbiAqIHRvIGl0cyBgZm5gIHByb3BlcnR5LjxiciAvPlxuICogVGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggdXBkYXRlLCB0aGlzIG1lYW5zIHRoYXQgeW91IG11c3RcbiAqIG1ha2Ugc3VyZSB0aGV5IGFyZSBwZXJmb3JtYW50IGVub3VnaCB0byBhdm9pZCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcy5cbiAqXG4gKiBAZnVuY3Rpb24gTW9kaWZpZXJGblxuICogQGFyZ3VtZW50IHtkYXRhT2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtkYXRhT2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cblxuLyoqXG4gKiBNb2RpZmllcnMgYXJlIHBsdWdpbnMgdXNlZCB0byBhbHRlciB0aGUgYmVoYXZpb3Igb2YgeW91ciBwb3BwZXJzLjxiciAvPlxuICogUG9wcGVyLmpzIHVzZXMgYSBzZXQgb2YgOSBtb2RpZmllcnMgdG8gcHJvdmlkZSBhbGwgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdGllc1xuICogbmVlZGVkIGJ5IHRoZSBsaWJyYXJ5LlxuICpcbiAqIFVzdWFsbHkgeW91IGRvbid0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGBvcmRlcmAsIGBmbmAgYW5kIGBvbkxvYWRgIHByb3BzLlxuICogQWxsIHRoZSBvdGhlciBwcm9wZXJ0aWVzIGFyZSBjb25maWd1cmF0aW9ucyB0aGF0IGNvdWxkIGJlIHR3ZWFrZWQuXG4gKiBAbmFtZXNwYWNlIG1vZGlmaWVyc1xuICovXG52YXIgbW9kaWZpZXJzID0ge1xuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBzaGlmdCB0aGUgcG9wcGVyIG9uIHRoZSBzdGFydCBvciBlbmQgb2YgaXRzIHJlZmVyZW5jZVxuICAgKiBlbGVtZW50LjxiciAvPlxuICAgKiBJdCB3aWxsIHJlYWQgdGhlIHZhcmlhdGlvbiBvZiB0aGUgYHBsYWNlbWVudGAgcHJvcGVydHkuPGJyIC8+XG4gICAqIEl0IGNhbiBiZSBvbmUgZWl0aGVyIGAtZW5kYCBvciBgLXN0YXJ0YC5cbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIHNoaWZ0OiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTEwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogMTAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogc2hpZnRcbiAgfSxcblxuICAvKipcbiAgICogVGhlIGBvZmZzZXRgIG1vZGlmaWVyIGNhbiBzaGlmdCB5b3VyIHBvcHBlciBvbiBib3RoIGl0cyBheGlzLlxuICAgKlxuICAgKiBJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgdW5pdHM6XG4gICAqIC0gYHB4YCBvciB1bml0bGVzcywgaW50ZXJwcmV0ZWQgYXMgcGl4ZWxzXG4gICAqIC0gYCVgIG9yIGAlcmAsIHBlcmNlbnRhZ2UgcmVsYXRpdmUgdG8gdGhlIGxlbmd0aCBvZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnRcbiAgICogLSBgJXBgLCBwZXJjZW50YWdlIHJlbGF0aXZlIHRvIHRoZSBsZW5ndGggb2YgdGhlIHBvcHBlciBlbGVtZW50XG4gICAqIC0gYHZ3YCwgQ1NTIHZpZXdwb3J0IHdpZHRoIHVuaXRcbiAgICogLSBgdmhgLCBDU1Mgdmlld3BvcnQgaGVpZ2h0IHVuaXRcbiAgICpcbiAgICogRm9yIGxlbmd0aCBpcyBpbnRlbmRlZCB0aGUgbWFpbiBheGlzIHJlbGF0aXZlIHRvIHRoZSBwbGFjZW1lbnQgb2YgdGhlIHBvcHBlci48YnIgLz5cbiAgICogVGhpcyBtZWFucyB0aGF0IGlmIHRoZSBwbGFjZW1lbnQgaXMgYHRvcGAgb3IgYGJvdHRvbWAsIHRoZSBsZW5ndGggd2lsbCBiZSB0aGVcbiAgICogYHdpZHRoYC4gSW4gY2FzZSBvZiBgbGVmdGAgb3IgYHJpZ2h0YCwgaXQgd2lsbCBiZSB0aGUgaGVpZ2h0LlxuICAgKlxuICAgKiBZb3UgY2FuIHByb3ZpZGUgYSBzaW5nbGUgdmFsdWUgKGFzIGBOdW1iZXJgIG9yIGBTdHJpbmdgKSwgb3IgYSBwYWlyIG9mIHZhbHVlc1xuICAgKiBhcyBgU3RyaW5nYCBkaXZpZGVkIGJ5IGEgY29tbWEgb3Igb25lIChvciBtb3JlKSB3aGl0ZSBzcGFjZXMuPGJyIC8+XG4gICAqIFRoZSBsYXR0ZXIgaXMgYSBkZXByZWNhdGVkIG1ldGhvZCBiZWNhdXNlIGl0IGxlYWRzIHRvIGNvbmZ1c2lvbiBhbmQgd2lsbCBiZVxuICAgKiByZW1vdmVkIGluIHYyLjxiciAvPlxuICAgKiBBZGRpdGlvbmFsbHksIGl0IGFjY2VwdHMgYWRkaXRpb25zIGFuZCBzdWJ0cmFjdGlvbnMgYmV0d2VlbiBkaWZmZXJlbnQgdW5pdHMuXG4gICAqIE5vdGUgdGhhdCBtdWx0aXBsaWNhdGlvbnMgYW5kIGRpdmlzaW9ucyBhcmVuJ3Qgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBWYWxpZCBleGFtcGxlcyBhcmU6XG4gICAqIGBgYFxuICAgKiAxMFxuICAgKiAnMTAlJ1xuICAgKiAnMTAsIDEwJ1xuICAgKiAnMTAlLCAxMCdcbiAgICogJzEwICsgMTAlJ1xuICAgKiAnMTAgLSA1dmggKyAzJSdcbiAgICogJy0xMHB4ICsgNXZoLCA1cHggLSA2JSdcbiAgICogYGBgXG4gICAqID4gKipOQioqOiBJZiB5b3UgZGVzaXJlIHRvIGFwcGx5IG9mZnNldHMgdG8geW91ciBwb3BwZXJzIGluIGEgd2F5IHRoYXQgbWF5IG1ha2UgdGhlbSBvdmVybGFwXG4gICAqID4gd2l0aCB0aGVpciByZWZlcmVuY2UgZWxlbWVudCwgdW5mb3J0dW5hdGVseSwgeW91IHdpbGwgaGF2ZSB0byBkaXNhYmxlIHRoZSBgZmxpcGAgbW9kaWZpZXIuXG4gICAqID4gTW9yZSBvbiB0aGlzIFtyZWFkaW5nIHRoaXMgaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9GZXpWcmFzdGEvcG9wcGVyLmpzL2lzc3Vlcy8zNzMpXG4gICAqXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBvZmZzZXQ6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9MjAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiAyMDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBvZmZzZXQsXG4gICAgLyoqIEBwcm9wIHtOdW1iZXJ8U3RyaW5nfSBvZmZzZXQ9MFxuICAgICAqIFRoZSBvZmZzZXQgdmFsdWUgYXMgZGVzY3JpYmVkIGluIHRoZSBtb2RpZmllciBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIG9mZnNldDogMFxuICB9LFxuXG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIHByZXZlbnQgdGhlIHBvcHBlciBmcm9tIGJlaW5nIHBvc2l0aW9uZWQgb3V0c2lkZSB0aGUgYm91bmRhcnkuXG4gICAqXG4gICAqIEFuIHNjZW5hcmlvIGV4aXN0cyB3aGVyZSB0aGUgcmVmZXJlbmNlIGl0c2VsZiBpcyBub3Qgd2l0aGluIHRoZSBib3VuZGFyaWVzLjxiciAvPlxuICAgKiBXZSBjYW4gc2F5IGl0IGhhcyBcImVzY2FwZWQgdGhlIGJvdW5kYXJpZXNcIiDigJQgb3IganVzdCBcImVzY2FwZWRcIi48YnIgLz5cbiAgICogSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHBvcHBlciBzaG91bGQgZWl0aGVyOlxuICAgKlxuICAgKiAtIGRldGFjaCBmcm9tIHRoZSByZWZlcmVuY2UgYW5kIHJlbWFpbiBcInRyYXBwZWRcIiBpbiB0aGUgYm91bmRhcmllcywgb3JcbiAgICogLSBpZiBpdCBzaG91bGQgaWdub3JlIHRoZSBib3VuZGFyeSBhbmQgXCJlc2NhcGUgd2l0aCBpdHMgcmVmZXJlbmNlXCJcbiAgICpcbiAgICogV2hlbiBgZXNjYXBlV2l0aFJlZmVyZW5jZWAgaXMgc2V0IHRvYHRydWVgIGFuZCByZWZlcmVuY2UgaXMgY29tcGxldGVseVxuICAgKiBvdXRzaWRlIGl0cyBib3VuZGFyaWVzLCB0aGUgcG9wcGVyIHdpbGwgb3ZlcmZsb3cgKG9yIGNvbXBsZXRlbHkgbGVhdmUpXG4gICAqIHRoZSBib3VuZGFyaWVzIGluIG9yZGVyIHRvIHJlbWFpbiBhdHRhY2hlZCB0byB0aGUgZWRnZSBvZiB0aGUgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgcHJldmVudE92ZXJmbG93OiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTMwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogMzAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogcHJldmVudE92ZXJmbG93LFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtBcnJheX0gW3ByaW9yaXR5PVsnbGVmdCcsJ3JpZ2h0JywndG9wJywnYm90dG9tJ11dXG4gICAgICogUG9wcGVyIHdpbGwgdHJ5IHRvIHByZXZlbnQgb3ZlcmZsb3cgZm9sbG93aW5nIHRoZXNlIHByaW9yaXRpZXMgYnkgZGVmYXVsdCxcbiAgICAgKiB0aGVuLCBpdCBjb3VsZCBvdmVyZmxvdyBvbiB0aGUgbGVmdCBhbmQgb24gdG9wIG9mIHRoZSBgYm91bmRhcmllc0VsZW1lbnRgXG4gICAgICovXG4gICAgcHJpb3JpdHk6IFsnbGVmdCcsICdyaWdodCcsICd0b3AnLCAnYm90dG9tJ10sXG4gICAgLyoqXG4gICAgICogQHByb3Age251bWJlcn0gcGFkZGluZz01XG4gICAgICogQW1vdW50IG9mIHBpeGVsIHVzZWQgdG8gZGVmaW5lIGEgbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3VuZGFyaWVzXG4gICAgICogYW5kIHRoZSBwb3BwZXIgdGhpcyBtYWtlcyBzdXJlIHRoZSBwb3BwZXIgaGFzIGFsd2F5cyBhIGxpdHRsZSBwYWRkaW5nXG4gICAgICogYmV0d2VlbiB0aGUgZWRnZXMgb2YgaXRzIGNvbnRhaW5lclxuICAgICAqL1xuICAgIHBhZGRpbmc6IDUsXG4gICAgLyoqXG4gICAgICogQHByb3Age1N0cmluZ3xIVE1MRWxlbWVudH0gYm91bmRhcmllc0VsZW1lbnQ9J3Njcm9sbFBhcmVudCdcbiAgICAgKiBCb3VuZGFyaWVzIHVzZWQgYnkgdGhlIG1vZGlmaWVyLCBjYW4gYmUgYHNjcm9sbFBhcmVudGAsIGB3aW5kb3dgLFxuICAgICAqIGB2aWV3cG9ydGAgb3IgYW55IERPTSBlbGVtZW50LlxuICAgICAqL1xuICAgIGJvdW5kYXJpZXNFbGVtZW50OiAnc2Nyb2xsUGFyZW50J1xuICB9LFxuXG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIG1ha2Ugc3VyZSB0aGUgcmVmZXJlbmNlIGFuZCBpdHMgcG9wcGVyIHN0YXkgbmVhciBlYWNob3RoZXJzXG4gICAqIHdpdGhvdXQgbGVhdmluZyBhbnkgZ2FwIGJldHdlZW4gdGhlIHR3by4gRXhwZWNpYWxseSB1c2VmdWwgd2hlbiB0aGUgYXJyb3cgaXNcbiAgICogZW5hYmxlZCBhbmQgeW91IHdhbnQgdG8gYXNzdXJlIGl0IHRvIHBvaW50IHRvIGl0cyByZWZlcmVuY2UgZWxlbWVudC5cbiAgICogSXQgY2FyZXMgb25seSBhYm91dCB0aGUgZmlyc3QgYXhpcywgeW91IGNhbiBzdGlsbCBoYXZlIHBvcHBlcnMgd2l0aCBtYXJnaW5cbiAgICogYmV0d2VlbiB0aGUgcG9wcGVyIGFuZCBpdHMgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBrZWVwVG9nZXRoZXI6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9NDAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA0MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBrZWVwVG9nZXRoZXJcbiAgfSxcblxuICAvKipcbiAgICogVGhpcyBtb2RpZmllciBpcyB1c2VkIHRvIG1vdmUgdGhlIGBhcnJvd0VsZW1lbnRgIG9mIHRoZSBwb3BwZXIgdG8gbWFrZVxuICAgKiBzdXJlIGl0IGlzIHBvc2l0aW9uZWQgYmV0d2VlbiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgYW5kIGl0cyBwb3BwZXIgZWxlbWVudC5cbiAgICogSXQgd2lsbCByZWFkIHRoZSBvdXRlciBzaXplIG9mIHRoZSBgYXJyb3dFbGVtZW50YCBub2RlIHRvIGRldGVjdCBob3cgbWFueVxuICAgKiBwaXhlbHMgb2YgY29uanVjdGlvbiBhcmUgbmVlZGVkLlxuICAgKlxuICAgKiBJdCBoYXMgbm8gZWZmZWN0IGlmIG5vIGBhcnJvd0VsZW1lbnRgIGlzIHByb3ZpZGVkLlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgYXJyb3c6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9NTAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA1MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBhcnJvdyxcbiAgICAvKiogQHByb3Age1N0cmluZ3xIVE1MRWxlbWVudH0gZWxlbWVudD0nW3gtYXJyb3ddJyAtIFNlbGVjdG9yIG9yIG5vZGUgdXNlZCBhcyBhcnJvdyAqL1xuICAgIGVsZW1lbnQ6ICdbeC1hcnJvd10nXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gZmxpcCB0aGUgcG9wcGVyJ3MgcGxhY2VtZW50IHdoZW4gaXQgc3RhcnRzIHRvIG92ZXJsYXAgaXRzXG4gICAqIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKlxuICAgKiBSZXF1aXJlcyB0aGUgYHByZXZlbnRPdmVyZmxvd2AgbW9kaWZpZXIgYmVmb3JlIGl0IGluIG9yZGVyIHRvIHdvcmsuXG4gICAqXG4gICAqICoqTk9URToqKiB0aGlzIG1vZGlmaWVyIHdpbGwgaW50ZXJydXB0IHRoZSBjdXJyZW50IHVwZGF0ZSBjeWNsZSBhbmQgd2lsbFxuICAgKiByZXN0YXJ0IGl0IGlmIGl0IGRldGVjdHMgdGhlIG5lZWQgdG8gZmxpcCB0aGUgcGxhY2VtZW50LlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgZmxpcDoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj02MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDYwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGZsaXAsXG4gICAgLyoqXG4gICAgICogQHByb3Age1N0cmluZ3xBcnJheX0gYmVoYXZpb3I9J2ZsaXAnXG4gICAgICogVGhlIGJlaGF2aW9yIHVzZWQgdG8gY2hhbmdlIHRoZSBwb3BwZXIncyBwbGFjZW1lbnQuIEl0IGNhbiBiZSBvbmUgb2ZcbiAgICAgKiBgZmxpcGAsIGBjbG9ja3dpc2VgLCBgY291bnRlcmNsb2Nrd2lzZWAgb3IgYW4gYXJyYXkgd2l0aCBhIGxpc3Qgb2YgdmFsaWRcbiAgICAgKiBwbGFjZW1lbnRzICh3aXRoIG9wdGlvbmFsIHZhcmlhdGlvbnMpLlxuICAgICAqL1xuICAgIGJlaGF2aW9yOiAnZmxpcCcsXG4gICAgLyoqXG4gICAgICogQHByb3Age251bWJlcn0gcGFkZGluZz01XG4gICAgICogVGhlIHBvcHBlciB3aWxsIGZsaXAgaWYgaXQgaGl0cyB0aGUgZWRnZXMgb2YgdGhlIGBib3VuZGFyaWVzRWxlbWVudGBcbiAgICAgKi9cbiAgICBwYWRkaW5nOiA1LFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtTdHJpbmd8SFRNTEVsZW1lbnR9IGJvdW5kYXJpZXNFbGVtZW50PSd2aWV3cG9ydCdcbiAgICAgKiBUaGUgZWxlbWVudCB3aGljaCB3aWxsIGRlZmluZSB0aGUgYm91bmRhcmllcyBvZiB0aGUgcG9wcGVyIHBvc2l0aW9uLFxuICAgICAqIHRoZSBwb3BwZXIgd2lsbCBuZXZlciBiZSBwbGFjZWQgb3V0c2lkZSBvZiB0aGUgZGVmaW5lZCBib3VuZGFyaWVzXG4gICAgICogKGV4Y2VwdCBpZiBrZWVwVG9nZXRoZXIgaXMgZW5hYmxlZClcbiAgICAgKi9cbiAgICBib3VuZGFyaWVzRWxlbWVudDogJ3ZpZXdwb3J0J1xuICB9LFxuXG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIG1ha2UgdGhlIHBvcHBlciBmbG93IHRvd2FyZCB0aGUgaW5uZXIgb2YgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKiBCeSBkZWZhdWx0LCB3aGVuIHRoaXMgbW9kaWZpZXIgaXMgZGlzYWJsZWQsIHRoZSBwb3BwZXIgd2lsbCBiZSBwbGFjZWQgb3V0c2lkZVxuICAgKiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBpbm5lcjoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj03MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDcwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9ZmFsc2UgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogaW5uZXJcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBoaWRlIHRoZSBwb3BwZXIgd2hlbiBpdHMgcmVmZXJlbmNlIGVsZW1lbnQgaXMgb3V0c2lkZSBvZiB0aGVcbiAgICogcG9wcGVyIGJvdW5kYXJpZXMuIEl0IHdpbGwgc2V0IGEgYHgtb3V0LW9mLWJvdW5kYXJpZXNgIGF0dHJpYnV0ZSB3aGljaCBjYW5cbiAgICogYmUgdXNlZCB0byBoaWRlIHdpdGggYSBDU1Mgc2VsZWN0b3IgdGhlIHBvcHBlciB3aGVuIGl0cyByZWZlcmVuY2UgaXNcbiAgICogb3V0IG9mIGJvdW5kYXJpZXMuXG4gICAqXG4gICAqIFJlcXVpcmVzIHRoZSBgcHJldmVudE92ZXJmbG93YCBtb2RpZmllciBiZWZvcmUgaXQgaW4gb3JkZXIgdG8gd29yay5cbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGhpZGU6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9ODAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA4MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBoaWRlXG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBzdHlsZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyIGVsZW1lbnQgdG8gZ2V0c1xuICAgKiBwcm9wZXJseSBwb3NpdGlvbmVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBtb2RpZmllciB3aWxsIG5vdCB0b3VjaCB0aGUgRE9NLCBpdCBqdXN0IHByZXBhcmVzIHRoZSBzdHlsZXNcbiAgICogc28gdGhhdCBgYXBwbHlTdHlsZWAgbW9kaWZpZXIgY2FuIGFwcGx5IGl0LiBUaGlzIHNlcGFyYXRpb24gaXMgdXNlZnVsXG4gICAqIGluIGNhc2UgeW91IG5lZWQgdG8gcmVwbGFjZSBgYXBwbHlTdHlsZWAgd2l0aCBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogVGhpcyBtb2RpZmllciBoYXMgYDg1MGAgYXMgYG9yZGVyYCB2YWx1ZSB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAqIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YgUG9wcGVyLmpzLiBFeHBlY3QgdGhlIG1vZGlmaWVycyBvcmRlcmluZyBtZXRob2RcbiAgICogdG8gY2hhbmdlIGluIGZ1dHVyZSBtYWpvciB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS5cbiAgICpcbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGNvbXB1dGVTdHlsZToge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj04NTAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDg1MCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGNvbXB1dGVTdHlsZSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7Qm9vbGVhbn0gZ3B1QWNjZWxlcmF0aW9uPXRydWVcbiAgICAgKiBJZiB0cnVlLCBpdCB1c2VzIHRoZSBDU1MgM2QgdHJhbnNmb3JtYXRpb24gdG8gcG9zaXRpb24gdGhlIHBvcHBlci5cbiAgICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgdXNlIHRoZSBgdG9wYCBhbmQgYGxlZnRgIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiB0cnVlLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtzdHJpbmd9IFt4PSdib3R0b20nXVxuICAgICAqIFdoZXJlIHRvIGFuY2hvciB0aGUgWCBheGlzIChgYm90dG9tYCBvciBgdG9wYCkuIEFLQSBYIG9mZnNldCBvcmlnaW4uXG4gICAgICogQ2hhbmdlIHRoaXMgaWYgeW91ciBwb3BwZXIgc2hvdWxkIGdyb3cgaW4gYSBkaXJlY3Rpb24gZGlmZmVyZW50IGZyb20gYGJvdHRvbWBcbiAgICAgKi9cbiAgICB4OiAnYm90dG9tJyxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7c3RyaW5nfSBbeD0nbGVmdCddXG4gICAgICogV2hlcmUgdG8gYW5jaG9yIHRoZSBZIGF4aXMgKGBsZWZ0YCBvciBgcmlnaHRgKS4gQUtBIFkgb2Zmc2V0IG9yaWdpbi5cbiAgICAgKiBDaGFuZ2UgdGhpcyBpZiB5b3VyIHBvcHBlciBzaG91bGQgZ3JvdyBpbiBhIGRpcmVjdGlvbiBkaWZmZXJlbnQgZnJvbSBgcmlnaHRgXG4gICAgICovXG4gICAgeTogJ3JpZ2h0J1xuICB9LFxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBjb21wdXRlZCBzdHlsZXMgdG8gdGhlIHBvcHBlciBlbGVtZW50LlxuICAgKlxuICAgKiBBbGwgdGhlIERPTSBtYW5pcHVsYXRpb25zIGFyZSBsaW1pdGVkIHRvIHRoaXMgbW9kaWZpZXIuIFRoaXMgaXMgdXNlZnVsIGluIGNhc2VcbiAgICogeW91IHdhbnQgdG8gaW50ZWdyYXRlIFBvcHBlci5qcyBpbnNpZGUgYSBmcmFtZXdvcmsgb3IgdmlldyBsaWJyYXJ5IGFuZCB5b3VcbiAgICogd2FudCB0byBkZWxlZ2F0ZSBhbGwgdGhlIERPTSBtYW5pcHVsYXRpb25zIHRvIGl0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgaWYgeW91IGRpc2FibGUgdGhpcyBtb2RpZmllciwgeW91IG11c3QgbWFrZSBzdXJlIHRoZSBwb3BwZXIgZWxlbWVudFxuICAgKiBoYXMgaXRzIHBvc2l0aW9uIHNldCB0byBgYWJzb2x1dGVgIGJlZm9yZSBQb3BwZXIuanMgY2FuIGRvIGl0cyB3b3JrIVxuICAgKlxuICAgKiBKdXN0IGRpc2FibGUgdGhpcyBtb2RpZmllciBhbmQgZGVmaW5lIHlvdSBvd24gdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCBlZmZlY3QuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBhcHBseVN0eWxlOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTkwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogOTAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogYXBwbHlTdHlsZSxcbiAgICAvKiogQHByb3Age0Z1bmN0aW9ufSAqL1xuICAgIG9uTG9hZDogYXBwbHlTdHlsZU9uTG9hZCxcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDEuMTAuMCwgdGhlIHByb3BlcnR5IG1vdmVkIHRvIGBjb21wdXRlU3R5bGVgIG1vZGlmaWVyXG4gICAgICogQHByb3Age0Jvb2xlYW59IGdwdUFjY2VsZXJhdGlvbj10cnVlXG4gICAgICogSWYgdHJ1ZSwgaXQgdXNlcyB0aGUgQ1NTIDNkIHRyYW5zZm9ybWF0aW9uIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXIuXG4gICAgICogT3RoZXJ3aXNlLCBpdCB3aWxsIHVzZSB0aGUgYHRvcGAgYW5kIGBsZWZ0YCBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIGdwdUFjY2VsZXJhdGlvbjogdW5kZWZpbmVkXG4gIH1cbn07XG5cbi8qKlxuICogVGhlIGBkYXRhT2JqZWN0YCBpcyBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIGluZm9ybWF0aW9ucyB1c2VkIGJ5IFBvcHBlci5qc1xuICogdGhpcyBvYmplY3QgZ2V0IHBhc3NlZCB0byBtb2RpZmllcnMgYW5kIHRvIHRoZSBgb25DcmVhdGVgIGFuZCBgb25VcGRhdGVgIGNhbGxiYWNrcy5cbiAqIEBuYW1lIGRhdGFPYmplY3RcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLmluc3RhbmNlIFRoZSBQb3BwZXIuanMgaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBkYXRhLnBsYWNlbWVudCBQbGFjZW1lbnQgYXBwbGllZCB0byBwb3BwZXJcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBkYXRhLm9yaWdpbmFsUGxhY2VtZW50IFBsYWNlbWVudCBvcmlnaW5hbGx5IGRlZmluZWQgb24gaW5pdFxuICogQHByb3BlcnR5IHtCb29sZWFufSBkYXRhLmZsaXBwZWQgVHJ1ZSBpZiBwb3BwZXIgaGFzIGJlZW4gZmxpcHBlZCBieSBmbGlwIG1vZGlmaWVyXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGRhdGEuaGlkZSBUcnVlIGlmIHRoZSByZWZlcmVuY2UgZWxlbWVudCBpcyBvdXQgb2YgYm91bmRhcmllcywgdXNlZnVsIHRvIGtub3cgd2hlbiB0byBoaWRlIHRoZSBwb3BwZXIuXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBkYXRhLmFycm93RWxlbWVudCBOb2RlIHVzZWQgYXMgYXJyb3cgYnkgYXJyb3cgbW9kaWZpZXJcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLnN0eWxlcyBBbnkgQ1NTIHByb3BlcnR5IGRlZmluZWQgaGVyZSB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlciwgaXQgZXhwZWN0cyB0aGUgSmF2YVNjcmlwdCBub21lbmNsYXR1cmUgKGVnLiBgbWFyZ2luQm90dG9tYClcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLmFycm93U3R5bGVzIEFueSBDU1MgcHJvcGVydHkgZGVmaW5lZCBoZXJlIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyIGFycm93LCBpdCBleHBlY3RzIHRoZSBKYXZhU2NyaXB0IG5vbWVuY2xhdHVyZSAoZWcuIGBtYXJnaW5Cb3R0b21gKVxuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEuYm91bmRhcmllcyBPZmZzZXRzIG9mIHRoZSBwb3BwZXIgYm91bmRhcmllc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cyBUaGUgbWVhc3VyZW1lbnRzIG9mIHBvcHBlciwgcmVmZXJlbmNlIGFuZCBhcnJvdyBlbGVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLm9mZnNldHMucG9wcGVyIGB0b3BgLCBgbGVmdGAsIGB3aWR0aGAsIGBoZWlnaHRgIHZhbHVlc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UgYHRvcGAsIGBsZWZ0YCwgYHdpZHRoYCwgYGhlaWdodGAgdmFsdWVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5vZmZzZXRzLmFycm93XSBgdG9wYCBhbmQgYGxlZnRgIG9mZnNldHMsIG9ubHkgb25lIG9mIHRoZW0gd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSAwXG4gKi9cblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMgcHJvdmlkZWQgdG8gUG9wcGVyLmpzIGNvbnN0cnVjdG9yLjxiciAvPlxuICogVGhlc2UgY2FuIGJlIG92ZXJyaWRlbiB1c2luZyB0aGUgYG9wdGlvbnNgIGFyZ3VtZW50IG9mIFBvcHBlci5qcy48YnIgLz5cbiAqIFRvIG92ZXJyaWRlIGFuIG9wdGlvbiwgc2ltcGx5IHBhc3MgYXMgM3JkIGFyZ3VtZW50IGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lXG4gKiBzdHJ1Y3R1cmUgb2YgdGhpcyBvYmplY3QsIGV4YW1wbGU6XG4gKiBgYGBcbiAqIG5ldyBQb3BwZXIocmVmLCBwb3AsIHtcbiAqICAgbW9kaWZpZXJzOiB7XG4gKiAgICAgcHJldmVudE92ZXJmbG93OiB7IGVuYWJsZWQ6IGZhbHNlIH1cbiAqICAgfVxuICogfSlcbiAqIGBgYFxuICogQHR5cGUge09iamVjdH1cbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xudmFyIERlZmF1bHRzID0ge1xuICAvKipcbiAgICogUG9wcGVyJ3MgcGxhY2VtZW50XG4gICAqIEBwcm9wIHtQb3BwZXIucGxhY2VtZW50c30gcGxhY2VtZW50PSdib3R0b20nXG4gICAqL1xuICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuXG4gIC8qKlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIGlmIHlvdSB3YW50IHBvcHBlciB0byBwb3NpdGlvbiBpdCBzZWxmIGluICdmaXhlZCcgbW9kZVxuICAgKiBAcHJvcCB7Qm9vbGVhbn0gcG9zaXRpb25GaXhlZD1mYWxzZVxuICAgKi9cbiAgcG9zaXRpb25GaXhlZDogZmFsc2UsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZXZlbnRzIChyZXNpemUsIHNjcm9sbCkgYXJlIGluaXRpYWxseSBlbmFibGVkXG4gICAqIEBwcm9wIHtCb29sZWFufSBldmVudHNFbmFibGVkPXRydWVcbiAgICovXG4gIGV2ZW50c0VuYWJsZWQ6IHRydWUsXG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgcmVtb3ZlIHRoZSBwb3BwZXIgd2hlblxuICAgKiB5b3UgY2FsbCB0aGUgYGRlc3Ryb3lgIG1ldGhvZC5cbiAgICogQHByb3Age0Jvb2xlYW59IHJlbW92ZU9uRGVzdHJveT1mYWxzZVxuICAgKi9cbiAgcmVtb3ZlT25EZXN0cm95OiBmYWxzZSxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIHBvcHBlciBpcyBjcmVhdGVkLjxiciAvPlxuICAgKiBCeSBkZWZhdWx0LCBpcyBzZXQgdG8gbm8tb3AuPGJyIC8+XG4gICAqIEFjY2VzcyBQb3BwZXIuanMgaW5zdGFuY2Ugd2l0aCBgZGF0YS5pbnN0YW5jZWAuXG4gICAqIEBwcm9wIHtvbkNyZWF0ZX1cbiAgICovXG4gIG9uQ3JlYXRlOiBmdW5jdGlvbiBvbkNyZWF0ZSgpIHt9LFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiB0aGUgcG9wcGVyIGlzIHVwZGF0ZWQsIHRoaXMgY2FsbGJhY2sgaXMgbm90IGNhbGxlZFxuICAgKiBvbiB0aGUgaW5pdGlhbGl6YXRpb24vY3JlYXRpb24gb2YgdGhlIHBvcHBlciwgYnV0IG9ubHkgb24gc3Vic2VxdWVudFxuICAgKiB1cGRhdGVzLjxiciAvPlxuICAgKiBCeSBkZWZhdWx0LCBpcyBzZXQgdG8gbm8tb3AuPGJyIC8+XG4gICAqIEFjY2VzcyBQb3BwZXIuanMgaW5zdGFuY2Ugd2l0aCBgZGF0YS5pbnN0YW5jZWAuXG4gICAqIEBwcm9wIHtvblVwZGF0ZX1cbiAgICovXG4gIG9uVXBkYXRlOiBmdW5jdGlvbiBvblVwZGF0ZSgpIHt9LFxuXG4gIC8qKlxuICAgKiBMaXN0IG9mIG1vZGlmaWVycyB1c2VkIHRvIG1vZGlmeSB0aGUgb2Zmc2V0cyBiZWZvcmUgdGhleSBhcmUgYXBwbGllZCB0byB0aGUgcG9wcGVyLlxuICAgKiBUaGV5IHByb3ZpZGUgbW9zdCBvZiB0aGUgZnVuY3Rpb25hbGl0aWVzIG9mIFBvcHBlci5qc1xuICAgKiBAcHJvcCB7bW9kaWZpZXJzfVxuICAgKi9cbiAgbW9kaWZpZXJzOiBtb2RpZmllcnNcbn07XG5cbi8qKlxuICogQGNhbGxiYWNrIG9uQ3JlYXRlXG4gKiBAcGFyYW0ge2RhdGFPYmplY3R9IGRhdGFcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBvblVwZGF0ZVxuICogQHBhcmFtIHtkYXRhT2JqZWN0fSBkYXRhXG4gKi9cblxuLy8gVXRpbHNcbi8vIE1ldGhvZHNcbnZhciBQb3BwZXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgUG9wcGVyLmpzIGluc3RhbmNlXG4gICAqIEBjbGFzcyBQb3BwZXJcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudHxyZWZlcmVuY2VPYmplY3R9IHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2UgZWxlbWVudCB1c2VkIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXJcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wcGVyIC0gVGhlIEhUTUwgZWxlbWVudCB1c2VkIGFzIHBvcHBlci5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBZb3VyIGN1c3RvbSBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZSBvbmVzIGRlZmluZWQgaW4gW0RlZmF1bHRzXSgjZGVmYXVsdHMpXG4gICAqIEByZXR1cm4ge09iamVjdH0gaW5zdGFuY2UgLSBUaGUgZ2VuZXJhdGVkIFBvcHBlci5qcyBpbnN0YW5jZVxuICAgKi9cbiAgZnVuY3Rpb24gUG9wcGVyKHJlZmVyZW5jZSwgcG9wcGVyKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQb3BwZXIpO1xuXG4gICAgdGhpcy5zY2hlZHVsZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3RoaXMudXBkYXRlKTtcbiAgICB9O1xuXG4gICAgLy8gbWFrZSB1cGRhdGUoKSBkZWJvdW5jZWQsIHNvIHRoYXQgaXQgb25seSBydW5zIGF0IG1vc3Qgb25jZS1wZXItdGlja1xuICAgIHRoaXMudXBkYXRlID0gZGVib3VuY2UodGhpcy51cGRhdGUuYmluZCh0aGlzKSk7XG5cbiAgICAvLyB3aXRoIHt9IHdlIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3B0aW9ucyBpbnNpZGUgaXRcbiAgICB0aGlzLm9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgUG9wcGVyLkRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgIC8vIGluaXQgc3RhdGVcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNEZXN0cm95ZWQ6IGZhbHNlLFxuICAgICAgaXNDcmVhdGVkOiBmYWxzZSxcbiAgICAgIHNjcm9sbFBhcmVudHM6IFtdXG4gICAgfTtcblxuICAgIC8vIGdldCByZWZlcmVuY2UgYW5kIHBvcHBlciBlbGVtZW50cyAoYWxsb3cgalF1ZXJ5IHdyYXBwZXJzKVxuICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlICYmIHJlZmVyZW5jZS5qcXVlcnkgPyByZWZlcmVuY2VbMF0gOiByZWZlcmVuY2U7XG4gICAgdGhpcy5wb3BwZXIgPSBwb3BwZXIgJiYgcG9wcGVyLmpxdWVyeSA/IHBvcHBlclswXSA6IHBvcHBlcjtcblxuICAgIC8vIERlZXAgbWVyZ2UgbW9kaWZpZXJzIG9wdGlvbnNcbiAgICB0aGlzLm9wdGlvbnMubW9kaWZpZXJzID0ge307XG4gICAgT2JqZWN0LmtleXMoX2V4dGVuZHMoe30sIFBvcHBlci5EZWZhdWx0cy5tb2RpZmllcnMsIG9wdGlvbnMubW9kaWZpZXJzKSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgX3RoaXMub3B0aW9ucy5tb2RpZmllcnNbbmFtZV0gPSBfZXh0ZW5kcyh7fSwgUG9wcGVyLkRlZmF1bHRzLm1vZGlmaWVyc1tuYW1lXSB8fCB7fSwgb3B0aW9ucy5tb2RpZmllcnMgPyBvcHRpb25zLm1vZGlmaWVyc1tuYW1lXSA6IHt9KTtcbiAgICB9KTtcblxuICAgIC8vIFJlZmFjdG9yaW5nIG1vZGlmaWVycycgbGlzdCAoT2JqZWN0ID0+IEFycmF5KVxuICAgIHRoaXMubW9kaWZpZXJzID0gT2JqZWN0LmtleXModGhpcy5vcHRpb25zLm1vZGlmaWVycykubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBuYW1lOiBuYW1lXG4gICAgICB9LCBfdGhpcy5vcHRpb25zLm1vZGlmaWVyc1tuYW1lXSk7XG4gICAgfSlcbiAgICAvLyBzb3J0IHRoZSBtb2RpZmllcnMgYnkgb3JkZXJcbiAgICAuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xuICAgIH0pO1xuXG4gICAgLy8gbW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZSB3aGVuIFBvcHBlci5qcyBnZXQgaW5pdGVkXG4gICAgLy8gc3VjaCBjb2RlIGlzIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIG9mIGl0cyBtb2RpZmllclxuICAgIC8vIHRoZXkgY291bGQgYWRkIG5ldyBwcm9wZXJ0aWVzIHRvIHRoZWlyIG9wdGlvbnMgY29uZmlndXJhdGlvblxuICAgIC8vIEJFIEFXQVJFOiBkb24ndCBhZGQgb3B0aW9ucyB0byBgb3B0aW9ucy5tb2RpZmllcnMubmFtZWAgYnV0IHRvIGBtb2RpZmllck9wdGlvbnNgIVxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyT3B0aW9ucykge1xuICAgICAgaWYgKG1vZGlmaWVyT3B0aW9ucy5lbmFibGVkICYmIGlzRnVuY3Rpb24obW9kaWZpZXJPcHRpb25zLm9uTG9hZCkpIHtcbiAgICAgICAgbW9kaWZpZXJPcHRpb25zLm9uTG9hZChfdGhpcy5yZWZlcmVuY2UsIF90aGlzLnBvcHBlciwgX3RoaXMub3B0aW9ucywgbW9kaWZpZXJPcHRpb25zLCBfdGhpcy5zdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBmaXJlIHRoZSBmaXJzdCB1cGRhdGUgdG8gcG9zaXRpb24gdGhlIHBvcHBlciBpbiB0aGUgcmlnaHQgcGxhY2VcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgdmFyIGV2ZW50c0VuYWJsZWQgPSB0aGlzLm9wdGlvbnMuZXZlbnRzRW5hYmxlZDtcbiAgICBpZiAoZXZlbnRzRW5hYmxlZCkge1xuICAgICAgLy8gc2V0dXAgZXZlbnQgbGlzdGVuZXJzLCB0aGV5IHdpbGwgdGFrZSBjYXJlIG9mIHVwZGF0ZSB0aGUgcG9zaXRpb24gaW4gc3BlY2lmaWMgc2l0dWF0aW9uc1xuICAgICAgdGhpcy5lbmFibGVFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUuZXZlbnRzRW5hYmxlZCA9IGV2ZW50c0VuYWJsZWQ7XG4gIH1cblxuICAvLyBXZSBjYW4ndCB1c2UgY2xhc3MgcHJvcGVydGllcyBiZWNhdXNlIHRoZXkgZG9uJ3QgZ2V0IGxpc3RlZCBpbiB0aGVcbiAgLy8gY2xhc3MgcHJvdG90eXBlIGFuZCBicmVhayBzdHVmZiBsaWtlIFNpbm9uIHN0dWJzXG5cblxuICBjcmVhdGVDbGFzcyhQb3BwZXIsIFt7XG4gICAga2V5OiAndXBkYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlJCQxKCkge1xuICAgICAgcmV0dXJuIHVwZGF0ZS5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2Rlc3Ryb3knLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95JCQxKCkge1xuICAgICAgcmV0dXJuIGRlc3Ryb3kuY2FsbCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdlbmFibGVFdmVudExpc3RlbmVycycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuYWJsZUV2ZW50TGlzdGVuZXJzJCQxKCkge1xuICAgICAgcmV0dXJuIGVuYWJsZUV2ZW50TGlzdGVuZXJzLmNhbGwodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGlzYWJsZUV2ZW50TGlzdGVuZXJzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzYWJsZUV2ZW50TGlzdGVuZXJzJCQxKCkge1xuICAgICAgcmV0dXJuIGRpc2FibGVFdmVudExpc3RlbmVycy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlIGFuIHVwZGF0ZSwgaXQgd2lsbCBydW4gb24gdGhlIG5leHQgVUkgdXBkYXRlIGF2YWlsYWJsZVxuICAgICAqIEBtZXRob2Qgc2NoZWR1bGVVcGRhdGVcbiAgICAgKiBAbWVtYmVyb2YgUG9wcGVyXG4gICAgICovXG5cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3Rpb24gb2YgdXRpbGl0aWVzIHVzZWZ1bCB3aGVuIHdyaXRpbmcgY3VzdG9tIG1vZGlmaWVycy5cbiAgICAgKiBTdGFydGluZyBmcm9tIHZlcnNpb24gMS43LCB0aGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgb25seSBpZiB5b3VcbiAgICAgKiBpbmNsdWRlIGBwb3BwZXItdXRpbHMuanNgIGJlZm9yZSBgcG9wcGVyLmpzYC5cbiAgICAgKlxuICAgICAqICoqREVQUkVDQVRJT04qKjogVGhpcyB3YXkgdG8gYWNjZXNzIFBvcHBlclV0aWxzIGlzIGRlcHJlY2F0ZWRcbiAgICAgKiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHYyISBVc2UgdGhlIFBvcHBlclV0aWxzIG1vZHVsZSBkaXJlY3RseSBpbnN0ZWFkLlxuICAgICAqIER1ZSB0byB0aGUgaGlnaCBpbnN0YWJpbGl0eSBvZiB0aGUgbWV0aG9kcyBjb250YWluZWQgaW4gVXRpbHMsIHdlIGNhbid0XG4gICAgICogZ3VhcmFudGVlIHRoZW0gdG8gZm9sbG93IHNlbXZlci4gVXNlIHRoZW0gYXQgeW91ciBvd24gcmlzayFcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMS44XG4gICAgICogQG1lbWJlciBVdGlsc1xuICAgICAqIEBtZW1iZXJvZiBQb3BwZXJcbiAgICAgKi9cblxuICB9XSk7XG4gIHJldHVybiBQb3BwZXI7XG59KCk7XG5cbi8qKlxuICogVGhlIGByZWZlcmVuY2VPYmplY3RgIGlzIGFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFuIGludGVyZmFjZSBjb21wYXRpYmxlIHdpdGggUG9wcGVyLmpzXG4gKiBhbmQgbGV0cyB5b3UgdXNlIGl0IGFzIHJlcGxhY2VtZW50IG9mIGEgcmVhbCBET00gbm9kZS48YnIgLz5cbiAqIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIHBvc2l0aW9uIGEgcG9wcGVyIHJlbGF0aXZlbHkgdG8gYSBzZXQgb2YgY29vcmRpbmF0ZXNcbiAqIGluIGNhc2UgeW91IGRvbid0IGhhdmUgYSBET00gbm9kZSB0byB1c2UgYXMgcmVmZXJlbmNlLlxuICpcbiAqIGBgYFxuICogbmV3IFBvcHBlcihyZWZlcmVuY2VPYmplY3QsIHBvcHBlck5vZGUpO1xuICogYGBgXG4gKlxuICogTkI6IFRoaXMgZmVhdHVyZSBpc24ndCBzdXBwb3J0ZWQgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTBcbiAqIEBuYW1lIHJlZmVyZW5jZU9iamVjdFxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZGF0YS5nZXRCb3VuZGluZ0NsaWVudFJlY3RcbiAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc2V0IG9mIGNvb3JkaW5hdGVzIGNvbXBhdGlibGUgd2l0aCB0aGUgbmF0aXZlIGBnZXRCb3VuZGluZ0NsaWVudFJlY3RgIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkYXRhLmNsaWVudFdpZHRoXG4gKiBBbiBFUzYgZ2V0dGVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSB2aXJ0dWFsIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRhdGEuY2xpZW50SGVpZ2h0XG4gKiBBbiBFUzYgZ2V0dGVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgdmlydHVhbCByZWZlcmVuY2UgZWxlbWVudC5cbiAqL1xuXG5cblBvcHBlci5VdGlscyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbCkuUG9wcGVyVXRpbHM7XG5Qb3BwZXIucGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG5Qb3BwZXIuRGVmYXVsdHMgPSBEZWZhdWx0cztcblxuZXhwb3J0IGRlZmF1bHQgUG9wcGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9wcGVyLmpzLm1hcFxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcG9wcGVyLmpzL2Rpc3QvZXNtL3BvcHBlci5qc1xuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3\n");
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports) {
-/***/ 4:
+eval("module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzP2MzYzIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xyXG5cdGlmKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XHJcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcclxuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xyXG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XHJcblx0XHRpZighbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XHJcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xyXG5cdH1cclxuXHRyZXR1cm4gbW9kdWxlO1xyXG59O1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4\n");
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/*!\n * Bootstrap v4.1.2 (https://getbootstrap.com/)\n * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n(function (global, factory) {\n true ? factory(exports, __webpack_require__(1), __webpack_require__(3)) :\n typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :\n (factory((global.bootstrap = {}),global.jQuery,global.Popper));\n}(this, (function (exports,$,Popper) { 'use strict';\n\n $ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n }\n\n function _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n }\n\n function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n }\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Util = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Private TransitionEnd Helpers\n * ------------------------------------------------------------------------\n */\n var TRANSITION_END = 'transitionend';\n var MAX_UID = 1000000;\n var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n function toType(obj) {\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n }\n\n function getSpecialTransitionEndEvent() {\n return {\n bindType: TRANSITION_END,\n delegateType: TRANSITION_END,\n handle: function handle(event) {\n if ($$$1(event.target).is(this)) {\n return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n }\n\n return undefined; // eslint-disable-line no-undefined\n }\n };\n }\n\n function transitionEndEmulator(duration) {\n var _this = this;\n\n var called = false;\n $$$1(this).one(Util.TRANSITION_END, function () {\n called = true;\n });\n setTimeout(function () {\n if (!called) {\n Util.triggerTransitionEnd(_this);\n }\n }, duration);\n return this;\n }\n\n function setTransitionEndSupport() {\n $$$1.fn.emulateTransitionEnd = transitionEndEmulator;\n $$$1.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n }\n /**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\n\n var Util = {\n TRANSITION_END: 'bsTransitionEnd',\n getUID: function getUID(prefix) {\n do {\n // eslint-disable-next-line no-bitwise\n prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix));\n\n return prefix;\n },\n getSelectorFromElement: function getSelectorFromElement(element) {\n var selector = element.getAttribute('data-target');\n\n if (!selector || selector === '#') {\n selector = element.getAttribute('href') || '';\n }\n\n try {\n return document.querySelector(selector) ? selector : null;\n } catch (err) {\n return null;\n }\n },\n getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {\n if (!element) {\n return 0;\n } // Get transition-duration of the element\n\n\n var transitionDuration = $$$1(element).css('transition-duration');\n var floatTransitionDuration = parseFloat(transitionDuration); // Return 0 if element or transition duration is not found\n\n if (!floatTransitionDuration) {\n return 0;\n } // If multiple durations are defined, take the first\n\n\n transitionDuration = transitionDuration.split(',')[0];\n return parseFloat(transitionDuration) * MILLISECONDS_MULTIPLIER;\n },\n reflow: function reflow(element) {\n return element.offsetHeight;\n },\n triggerTransitionEnd: function triggerTransitionEnd(element) {\n $$$1(element).trigger(TRANSITION_END);\n },\n // TODO: Remove in v5\n supportsTransitionEnd: function supportsTransitionEnd() {\n return Boolean(TRANSITION_END);\n },\n isElement: function isElement(obj) {\n return (obj[0] || obj).nodeType;\n },\n typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n for (var property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n var expectedTypes = configTypes[property];\n var value = config[property];\n var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n }\n }\n }\n }\n };\n setTransitionEndSupport();\n return Util;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Alert = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'alert';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.alert';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var Selector = {\n DISMISS: '[data-dismiss=\"alert\"]'\n };\n var Event = {\n CLOSE: \"close\" + EVENT_KEY,\n CLOSED: \"closed\" + EVENT_KEY,\n CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n };\n var ClassName = {\n ALERT: 'alert',\n FADE: 'fade',\n SHOW: 'show'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Alert =\n /*#__PURE__*/\n function () {\n function Alert(element) {\n this._element = element;\n } // Getters\n\n\n var _proto = Alert.prototype;\n\n // Public\n _proto.close = function close(element) {\n var rootElement = this._element;\n\n if (element) {\n rootElement = this._getRootElement(element);\n }\n\n var customEvent = this._triggerCloseEvent(rootElement);\n\n if (customEvent.isDefaultPrevented()) {\n return;\n }\n\n this._removeElement(rootElement);\n };\n\n _proto.dispose = function dispose() {\n $$$1.removeData(this._element, DATA_KEY);\n this._element = null;\n }; // Private\n\n\n _proto._getRootElement = function _getRootElement(element) {\n var selector = Util.getSelectorFromElement(element);\n var parent = false;\n\n if (selector) {\n parent = document.querySelector(selector);\n }\n\n if (!parent) {\n parent = $$$1(element).closest(\".\" + ClassName.ALERT)[0];\n }\n\n return parent;\n };\n\n _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n var closeEvent = $$$1.Event(Event.CLOSE);\n $$$1(element).trigger(closeEvent);\n return closeEvent;\n };\n\n _proto._removeElement = function _removeElement(element) {\n var _this = this;\n\n $$$1(element).removeClass(ClassName.SHOW);\n\n if (!$$$1(element).hasClass(ClassName.FADE)) {\n this._destroyElement(element);\n\n return;\n }\n\n var transitionDuration = Util.getTransitionDurationFromElement(element);\n $$$1(element).one(Util.TRANSITION_END, function (event) {\n return _this._destroyElement(element, event);\n }).emulateTransitionEnd(transitionDuration);\n };\n\n _proto._destroyElement = function _destroyElement(element) {\n $$$1(element).detach().trigger(Event.CLOSED).remove();\n }; // Static\n\n\n Alert._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var $element = $$$1(this);\n var data = $element.data(DATA_KEY);\n\n if (!data) {\n data = new Alert(this);\n $element.data(DATA_KEY, data);\n }\n\n if (config === 'close') {\n data[config](this);\n }\n });\n };\n\n Alert._handleDismiss = function _handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault();\n }\n\n alertInstance.close(this);\n };\n };\n\n _createClass(Alert, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }]);\n\n return Alert;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = Alert._jQueryInterface;\n $$$1.fn[NAME].Constructor = Alert;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Alert._jQueryInterface;\n };\n\n return Alert;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Button = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'button';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.button';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var ClassName = {\n ACTIVE: 'active',\n BUTTON: 'btn',\n FOCUS: 'focus'\n };\n var Selector = {\n DATA_TOGGLE_CARROT: '[data-toggle^=\"button\"]',\n DATA_TOGGLE: '[data-toggle=\"buttons\"]',\n INPUT: 'input',\n ACTIVE: '.active',\n BUTTON: '.btn'\n };\n var Event = {\n CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY,\n FOCUS_BLUR_DATA_API: \"focus\" + EVENT_KEY + DATA_API_KEY + \" \" + (\"blur\" + EVENT_KEY + DATA_API_KEY)\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Button =\n /*#__PURE__*/\n function () {\n function Button(element) {\n this._element = element;\n } // Getters\n\n\n var _proto = Button.prototype;\n\n // Public\n _proto.toggle = function toggle() {\n var triggerChangeEvent = true;\n var addAriaPressed = true;\n var rootElement = $$$1(this._element).closest(Selector.DATA_TOGGLE)[0];\n\n if (rootElement) {\n var input = this._element.querySelector(Selector.INPUT);\n\n if (input) {\n if (input.type === 'radio') {\n if (input.checked && this._element.classList.contains(ClassName.ACTIVE)) {\n triggerChangeEvent = false;\n } else {\n var activeElement = rootElement.querySelector(Selector.ACTIVE);\n\n if (activeElement) {\n $$$1(activeElement).removeClass(ClassName.ACTIVE);\n }\n }\n }\n\n if (triggerChangeEvent) {\n if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {\n return;\n }\n\n input.checked = !this._element.classList.contains(ClassName.ACTIVE);\n $$$1(input).trigger('change');\n }\n\n input.focus();\n addAriaPressed = false;\n }\n }\n\n if (addAriaPressed) {\n this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName.ACTIVE));\n }\n\n if (triggerChangeEvent) {\n $$$1(this._element).toggleClass(ClassName.ACTIVE);\n }\n };\n\n _proto.dispose = function dispose() {\n $$$1.removeData(this._element, DATA_KEY);\n this._element = null;\n }; // Static\n\n\n Button._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $$$1(this).data(DATA_KEY);\n\n if (!data) {\n data = new Button(this);\n $$$1(this).data(DATA_KEY, data);\n }\n\n if (config === 'toggle') {\n data[config]();\n }\n });\n };\n\n _createClass(Button, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }]);\n\n return Button;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\n event.preventDefault();\n var button = event.target;\n\n if (!$$$1(button).hasClass(ClassName.BUTTON)) {\n button = $$$1(button).closest(Selector.BUTTON);\n }\n\n Button._jQueryInterface.call($$$1(button), 'toggle');\n }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\n var button = $$$1(event.target).closest(Selector.BUTTON)[0];\n $$$1(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = Button._jQueryInterface;\n $$$1.fn[NAME].Constructor = Button;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Button._jQueryInterface;\n };\n\n return Button;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Carousel = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'carousel';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.carousel';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n var Default = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true\n };\n var DefaultType = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean'\n };\n var Direction = {\n NEXT: 'next',\n PREV: 'prev',\n LEFT: 'left',\n RIGHT: 'right'\n };\n var Event = {\n SLIDE: \"slide\" + EVENT_KEY,\n SLID: \"slid\" + EVENT_KEY,\n KEYDOWN: \"keydown\" + EVENT_KEY,\n MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n MOUSELEAVE: \"mouseleave\" + EVENT_KEY,\n TOUCHEND: \"touchend\" + EVENT_KEY,\n LOAD_DATA_API: \"load\" + EVENT_KEY + DATA_API_KEY,\n CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n };\n var ClassName = {\n CAROUSEL: 'carousel',\n ACTIVE: 'active',\n SLIDE: 'slide',\n RIGHT: 'carousel-item-right',\n LEFT: 'carousel-item-left',\n NEXT: 'carousel-item-next',\n PREV: 'carousel-item-prev',\n ITEM: 'carousel-item'\n };\n var Selector = {\n ACTIVE: '.active',\n ACTIVE_ITEM: '.active.carousel-item',\n ITEM: '.carousel-item',\n NEXT_PREV: '.carousel-item-next, .carousel-item-prev',\n INDICATORS: '.carousel-indicators',\n DATA_SLIDE: '[data-slide], [data-slide-to]',\n DATA_RIDE: '[data-ride=\"carousel\"]'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Carousel =\n /*#__PURE__*/\n function () {\n function Carousel(element, config) {\n this._items = null;\n this._interval = null;\n this._activeElement = null;\n this._isPaused = false;\n this._isSliding = false;\n this.touchTimeout = null;\n this._config = this._getConfig(config);\n this._element = $$$1(element)[0];\n this._indicatorsElement = this._element.querySelector(Selector.INDICATORS);\n\n this._addEventListeners();\n } // Getters\n\n\n var _proto = Carousel.prototype;\n\n // Public\n _proto.next = function next() {\n if (!this._isSliding) {\n this._slide(Direction.NEXT);\n }\n };\n\n _proto.nextWhenVisible = function nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && $$$1(this._element).is(':visible') && $$$1(this._element).css('visibility') !== 'hidden') {\n this.next();\n }\n };\n\n _proto.prev = function prev() {\n if (!this._isSliding) {\n this._slide(Direction.PREV);\n }\n };\n\n _proto.pause = function pause(event) {\n if (!event) {\n this._isPaused = true;\n }\n\n if (this._element.querySelector(Selector.NEXT_PREV)) {\n Util.triggerTransitionEnd(this._element);\n this.cycle(true);\n }\n\n clearInterval(this._interval);\n this._interval = null;\n };\n\n _proto.cycle = function cycle(event) {\n if (!event) {\n this._isPaused = false;\n }\n\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n\n if (this._config.interval && !this._isPaused) {\n this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n }\n };\n\n _proto.to = function to(index) {\n var _this = this;\n\n this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM);\n\n var activeIndex = this._getItemIndex(this._activeElement);\n\n if (index > this._items.length - 1 || index < 0) {\n return;\n }\n\n if (this._isSliding) {\n $$$1(this._element).one(Event.SLID, function () {\n return _this.to(index);\n });\n return;\n }\n\n if (activeIndex === index) {\n this.pause();\n this.cycle();\n return;\n }\n\n var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;\n\n this._slide(direction, this._items[index]);\n };\n\n _proto.dispose = function dispose() {\n $$$1(this._element).off(EVENT_KEY);\n $$$1.removeData(this._element, DATA_KEY);\n this._items = null;\n this._config = null;\n this._element = null;\n this._interval = null;\n this._isPaused = null;\n this._isSliding = null;\n this._activeElement = null;\n this._indicatorsElement = null;\n }; // Private\n\n\n _proto._getConfig = function _getConfig(config) {\n config = _objectSpread({}, Default, config);\n Util.typeCheckConfig(NAME, config, DefaultType);\n return config;\n };\n\n _proto._addEventListeners = function _addEventListeners() {\n var _this2 = this;\n\n if (this._config.keyboard) {\n $$$1(this._element).on(Event.KEYDOWN, function (event) {\n return _this2._keydown(event);\n });\n }\n\n if (this._config.pause === 'hover') {\n $$$1(this._element).on(Event.MOUSEENTER, function (event) {\n return _this2.pause(event);\n }).on(Event.MOUSELEAVE, function (event) {\n return _this2.cycle(event);\n });\n\n if ('ontouchstart' in document.documentElement) {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n $$$1(this._element).on(Event.TOUCHEND, function () {\n _this2.pause();\n\n if (_this2.touchTimeout) {\n clearTimeout(_this2.touchTimeout);\n }\n\n _this2.touchTimeout = setTimeout(function (event) {\n return _this2.cycle(event);\n }, TOUCHEVENT_COMPAT_WAIT + _this2._config.interval);\n });\n }\n }\n };\n\n _proto._keydown = function _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n event.preventDefault();\n this.prev();\n break;\n\n case ARROW_RIGHT_KEYCODE:\n event.preventDefault();\n this.next();\n break;\n\n default:\n }\n };\n\n _proto._getItemIndex = function _getItemIndex(element) {\n this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM)) : [];\n return this._items.indexOf(element);\n };\n\n _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n var isNextDirection = direction === Direction.NEXT;\n var isPrevDirection = direction === Direction.PREV;\n\n var activeIndex = this._getItemIndex(activeElement);\n\n var lastItemIndex = this._items.length - 1;\n var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n if (isGoingToWrap && !this._config.wrap) {\n return activeElement;\n }\n\n var delta = direction === Direction.PREV ? -1 : 1;\n var itemIndex = (activeIndex + delta) % this._items.length;\n return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n };\n\n _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n var targetIndex = this._getItemIndex(relatedTarget);\n\n var fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM));\n\n var slideEvent = $$$1.Event(Event.SLIDE, {\n relatedTarget: relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n });\n $$$1(this._element).trigger(slideEvent);\n return slideEvent;\n };\n\n _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE));\n $$$1(indicators).removeClass(ClassName.ACTIVE);\n\n var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n if (nextIndicator) {\n $$$1(nextIndicator).addClass(ClassName.ACTIVE);\n }\n }\n };\n\n _proto._slide = function _slide(direction, element) {\n var _this3 = this;\n\n var activeElement = this._element.querySelector(Selector.ACTIVE_ITEM);\n\n var activeElementIndex = this._getItemIndex(activeElement);\n\n var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n var nextElementIndex = this._getItemIndex(nextElement);\n\n var isCycling = Boolean(this._interval);\n var directionalClassName;\n var orderClassName;\n var eventDirectionName;\n\n if (direction === Direction.NEXT) {\n directionalClassName = ClassName.LEFT;\n orderClassName = ClassName.NEXT;\n eventDirectionName = Direction.LEFT;\n } else {\n directionalClassName = ClassName.RIGHT;\n orderClassName = ClassName.PREV;\n eventDirectionName = Direction.RIGHT;\n }\n\n if (nextElement && $$$1(nextElement).hasClass(ClassName.ACTIVE)) {\n this._isSliding = false;\n return;\n }\n\n var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n if (slideEvent.isDefaultPrevented()) {\n return;\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return;\n }\n\n this._isSliding = true;\n\n if (isCycling) {\n this.pause();\n }\n\n this._setActiveIndicatorElement(nextElement);\n\n var slidEvent = $$$1.Event(Event.SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n });\n\n if ($$$1(this._element).hasClass(ClassName.SLIDE)) {\n $$$1(nextElement).addClass(orderClassName);\n Util.reflow(nextElement);\n $$$1(activeElement).addClass(directionalClassName);\n $$$1(nextElement).addClass(directionalClassName);\n var transitionDuration = Util.getTransitionDurationFromElement(activeElement);\n $$$1(activeElement).one(Util.TRANSITION_END, function () {\n $$$1(nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(ClassName.ACTIVE);\n $$$1(activeElement).removeClass(ClassName.ACTIVE + \" \" + orderClassName + \" \" + directionalClassName);\n _this3._isSliding = false;\n setTimeout(function () {\n return $$$1(_this3._element).trigger(slidEvent);\n }, 0);\n }).emulateTransitionEnd(transitionDuration);\n } else {\n $$$1(activeElement).removeClass(ClassName.ACTIVE);\n $$$1(nextElement).addClass(ClassName.ACTIVE);\n this._isSliding = false;\n $$$1(this._element).trigger(slidEvent);\n }\n\n if (isCycling) {\n this.cycle();\n }\n }; // Static\n\n\n Carousel._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $$$1(this).data(DATA_KEY);\n\n var _config = _objectSpread({}, Default, $$$1(this).data());\n\n if (typeof config === 'object') {\n _config = _objectSpread({}, _config, config);\n }\n\n var action = typeof config === 'string' ? config : _config.slide;\n\n if (!data) {\n data = new Carousel(this, _config);\n $$$1(this).data(DATA_KEY, data);\n }\n\n if (typeof config === 'number') {\n data.to(config);\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + action + \"\\\"\");\n }\n\n data[action]();\n } else if (_config.interval) {\n data.pause();\n data.cycle();\n }\n });\n };\n\n Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n var selector = Util.getSelectorFromElement(this);\n\n if (!selector) {\n return;\n }\n\n var target = $$$1(selector)[0];\n\n if (!target || !$$$1(target).hasClass(ClassName.CAROUSEL)) {\n return;\n }\n\n var config = _objectSpread({}, $$$1(target).data(), $$$1(this).data());\n\n var slideIndex = this.getAttribute('data-slide-to');\n\n if (slideIndex) {\n config.interval = false;\n }\n\n Carousel._jQueryInterface.call($$$1(target), config);\n\n if (slideIndex) {\n $$$1(target).data(DATA_KEY).to(slideIndex);\n }\n\n event.preventDefault();\n };\n\n _createClass(Carousel, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }]);\n\n return Carousel;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);\n $$$1(window).on(Event.LOAD_DATA_API, function () {\n var carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE));\n\n for (var i = 0, len = carousels.length; i < len; i++) {\n var $carousel = $$$1(carousels[i]);\n\n Carousel._jQueryInterface.call($carousel, $carousel.data());\n }\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = Carousel._jQueryInterface;\n $$$1.fn[NAME].Constructor = Carousel;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Carousel._jQueryInterface;\n };\n\n return Carousel;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Collapse = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'collapse';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.collapse';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var Default = {\n toggle: true,\n parent: ''\n };\n var DefaultType = {\n toggle: 'boolean',\n parent: '(string|element)'\n };\n var Event = {\n SHOW: \"show\" + EVENT_KEY,\n SHOWN: \"shown\" + EVENT_KEY,\n HIDE: \"hide\" + EVENT_KEY,\n HIDDEN: \"hidden\" + EVENT_KEY,\n CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n };\n var ClassName = {\n SHOW: 'show',\n COLLAPSE: 'collapse',\n COLLAPSING: 'collapsing',\n COLLAPSED: 'collapsed'\n };\n var Dimension = {\n WIDTH: 'width',\n HEIGHT: 'height'\n };\n var Selector = {\n ACTIVES: '.show, .collapsing',\n DATA_TOGGLE: '[data-toggle=\"collapse\"]'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Collapse =\n /*#__PURE__*/\n function () {\n function Collapse(element, config) {\n this._isTransitioning = false;\n this._element = element;\n this._config = this._getConfig(config);\n this._triggerArray = $$$1.makeArray(document.querySelectorAll(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n var toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));\n\n for (var i = 0, len = toggleList.length; i < len; i++) {\n var elem = toggleList[i];\n var selector = Util.getSelectorFromElement(elem);\n var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {\n return foundElem === element;\n });\n\n if (selector !== null && filterElement.length > 0) {\n this._selector = selector;\n\n this._triggerArray.push(elem);\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null;\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n }\n\n if (this._config.toggle) {\n this.toggle();\n }\n } // Getters\n\n\n var _proto = Collapse.prototype;\n\n // Public\n _proto.toggle = function toggle() {\n if ($$$1(this._element).hasClass(ClassName.SHOW)) {\n this.hide();\n } else {\n this.show();\n }\n };\n\n _proto.show = function show() {\n var _this = this;\n\n if (this._isTransitioning || $$$1(this._element).hasClass(ClassName.SHOW)) {\n return;\n }\n\n var actives;\n var activesData;\n\n if (this._parent) {\n actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES)).filter(function (elem) {\n return elem.getAttribute('data-parent') === _this._config.parent;\n });\n\n if (actives.length === 0) {\n actives = null;\n }\n }\n\n if (actives) {\n activesData = $$$1(actives).not(this._selector).data(DATA_KEY);\n\n if (activesData && activesData._isTransitioning) {\n return;\n }\n }\n\n var startEvent = $$$1.Event(Event.SHOW);\n $$$1(this._element).trigger(startEvent);\n\n if (startEvent.isDefaultPrevented()) {\n return;\n }\n\n if (actives) {\n Collapse._jQueryInterface.call($$$1(actives).not(this._selector), 'hide');\n\n if (!activesData) {\n $$$1(actives).data(DATA_KEY, null);\n }\n }\n\n var dimension = this._getDimension();\n\n $$$1(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);\n this._element.style[dimension] = 0;\n\n if (this._triggerArray.length) {\n $$$1(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);\n }\n\n this.setTransitioning(true);\n\n var complete = function complete() {\n $$$1(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);\n _this._element.style[dimension] = '';\n\n _this.setTransitioning(false);\n\n $$$1(_this._element).trigger(Event.SHOWN);\n };\n\n var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n var scrollSize = \"scroll\" + capitalizedDimension;\n var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n this._element.style[dimension] = this._element[scrollSize] + \"px\";\n };\n\n _proto.hide = function hide() {\n var _this2 = this;\n\n if (this._isTransitioning || !$$$1(this._element).hasClass(ClassName.SHOW)) {\n return;\n }\n\n var startEvent = $$$1.Event(Event.HIDE);\n $$$1(this._element).trigger(startEvent);\n\n if (startEvent.isDefaultPrevented()) {\n return;\n }\n\n var dimension = this._getDimension();\n\n this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n Util.reflow(this._element);\n $$$1(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);\n var triggerArrayLength = this._triggerArray.length;\n\n if (triggerArrayLength > 0) {\n for (var i = 0; i < triggerArrayLength; i++) {\n var trigger = this._triggerArray[i];\n var selector = Util.getSelectorFromElement(trigger);\n\n if (selector !== null) {\n var $elem = $$$1([].slice.call(document.querySelectorAll(selector)));\n\n if (!$elem.hasClass(ClassName.SHOW)) {\n $$$1(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);\n }\n }\n }\n }\n\n this.setTransitioning(true);\n\n var complete = function complete() {\n _this2.setTransitioning(false);\n\n $$$1(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);\n };\n\n this._element.style[dimension] = '';\n var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n };\n\n _proto.setTransitioning = function setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning;\n };\n\n _proto.dispose = function dispose() {\n $$$1.removeData(this._element, DATA_KEY);\n this._config = null;\n this._parent = null;\n this._element = null;\n this._triggerArray = null;\n this._isTransitioning = null;\n }; // Private\n\n\n _proto._getConfig = function _getConfig(config) {\n config = _objectSpread({}, Default, config);\n config.toggle = Boolean(config.toggle); // Coerce string values\n\n Util.typeCheckConfig(NAME, config, DefaultType);\n return config;\n };\n\n _proto._getDimension = function _getDimension() {\n var hasWidth = $$$1(this._element).hasClass(Dimension.WIDTH);\n return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n };\n\n _proto._getParent = function _getParent() {\n var _this3 = this;\n\n var parent = null;\n\n if (Util.isElement(this._config.parent)) {\n parent = this._config.parent; // It's a jQuery object\n\n if (typeof this._config.parent.jquery !== 'undefined') {\n parent = this._config.parent[0];\n }\n } else {\n parent = document.querySelector(this._config.parent);\n }\n\n var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n var children = [].slice.call(parent.querySelectorAll(selector));\n $$$1(children).each(function (i, element) {\n _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n });\n return parent;\n };\n\n _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n if (element) {\n var isOpen = $$$1(element).hasClass(ClassName.SHOW);\n\n if (triggerArray.length) {\n $$$1(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n }\n }\n }; // Static\n\n\n Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n var selector = Util.getSelectorFromElement(element);\n return selector ? document.querySelector(selector) : null;\n };\n\n Collapse._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var $this = $$$1(this);\n var data = $this.data(DATA_KEY);\n\n var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config ? config : {});\n\n if (!data && _config.toggle && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n\n if (!data) {\n data = new Collapse(this, _config);\n $this.data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(Collapse, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }]);\n\n return Collapse;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.currentTarget.tagName === 'A') {\n event.preventDefault();\n }\n\n var $trigger = $$$1(this);\n var selector = Util.getSelectorFromElement(this);\n var selectors = [].slice.call(document.querySelectorAll(selector));\n $$$1(selectors).each(function () {\n var $target = $$$1(this);\n var data = $target.data(DATA_KEY);\n var config = data ? 'toggle' : $trigger.data();\n\n Collapse._jQueryInterface.call($target, config);\n });\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = Collapse._jQueryInterface;\n $$$1.fn[NAME].Constructor = Collapse;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Collapse._jQueryInterface;\n };\n\n return Collapse;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Dropdown = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'dropdown';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.dropdown';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE);\n var Event = {\n HIDE: \"hide\" + EVENT_KEY,\n HIDDEN: \"hidden\" + EVENT_KEY,\n SHOW: \"show\" + EVENT_KEY,\n SHOWN: \"shown\" + EVENT_KEY,\n CLICK: \"click\" + EVENT_KEY,\n CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY,\n KEYDOWN_DATA_API: \"keydown\" + EVENT_KEY + DATA_API_KEY,\n KEYUP_DATA_API: \"keyup\" + EVENT_KEY + DATA_API_KEY\n };\n var ClassName = {\n DISABLED: 'disabled',\n SHOW: 'show',\n DROPUP: 'dropup',\n DROPRIGHT: 'dropright',\n DROPLEFT: 'dropleft',\n MENURIGHT: 'dropdown-menu-right',\n MENULEFT: 'dropdown-menu-left',\n POSITION_STATIC: 'position-static'\n };\n var Selector = {\n DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n FORM_CHILD: '.dropdown form',\n MENU: '.dropdown-menu',\n NAVBAR_NAV: '.navbar-nav',\n VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n };\n var AttachmentMap = {\n TOP: 'top-start',\n TOPEND: 'top-end',\n BOTTOM: 'bottom-start',\n BOTTOMEND: 'bottom-end',\n RIGHT: 'right-start',\n RIGHTEND: 'right-end',\n LEFT: 'left-start',\n LEFTEND: 'left-end'\n };\n var Default = {\n offset: 0,\n flip: true,\n boundary: 'scrollParent',\n reference: 'toggle',\n display: 'dynamic'\n };\n var DefaultType = {\n offset: '(number|string|function)',\n flip: 'boolean',\n boundary: '(string|element)',\n reference: '(string|element)',\n display: 'string'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Dropdown =\n /*#__PURE__*/\n function () {\n function Dropdown(element, config) {\n this._element = element;\n this._popper = null;\n this._config = this._getConfig(config);\n this._menu = this._getMenuElement();\n this._inNavbar = this._detectNavbar();\n\n this._addEventListeners();\n } // Getters\n\n\n var _proto = Dropdown.prototype;\n\n // Public\n _proto.toggle = function toggle() {\n if (this._element.disabled || $$$1(this._element).hasClass(ClassName.DISABLED)) {\n return;\n }\n\n var parent = Dropdown._getParentFromElement(this._element);\n\n var isActive = $$$1(this._menu).hasClass(ClassName.SHOW);\n\n Dropdown._clearMenus();\n\n if (isActive) {\n return;\n }\n\n var relatedTarget = {\n relatedTarget: this._element\n };\n var showEvent = $$$1.Event(Event.SHOW, relatedTarget);\n $$$1(parent).trigger(showEvent);\n\n if (showEvent.isDefaultPrevented()) {\n return;\n } // Disable totally Popper.js for Dropdown in Navbar\n\n\n if (!this._inNavbar) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap dropdown require Popper.js (https://popper.js.org)');\n }\n\n var referenceElement = this._element;\n\n if (this._config.reference === 'parent') {\n referenceElement = parent;\n } else if (Util.isElement(this._config.reference)) {\n referenceElement = this._config.reference; // Check if it's jQuery element\n\n if (typeof this._config.reference.jquery !== 'undefined') {\n referenceElement = this._config.reference[0];\n }\n } // If boundary is not `scrollParent`, then set position to `static`\n // to allow the menu to \"escape\" the scroll parent's boundaries\n // https://github.com/twbs/bootstrap/issues/24251\n\n\n if (this._config.boundary !== 'scrollParent') {\n $$$1(parent).addClass(ClassName.POSITION_STATIC);\n }\n\n this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());\n } // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n if ('ontouchstart' in document.documentElement && $$$1(parent).closest(Selector.NAVBAR_NAV).length === 0) {\n $$$1(document.body).children().on('mouseover', null, $$$1.noop);\n }\n\n this._element.focus();\n\n this._element.setAttribute('aria-expanded', true);\n\n $$$1(this._menu).toggleClass(ClassName.SHOW);\n $$$1(parent).toggleClass(ClassName.SHOW).trigger($$$1.Event(Event.SHOWN, relatedTarget));\n };\n\n _proto.dispose = function dispose() {\n $$$1.removeData(this._element, DATA_KEY);\n $$$1(this._element).off(EVENT_KEY);\n this._element = null;\n this._menu = null;\n\n if (this._popper !== null) {\n this._popper.destroy();\n\n this._popper = null;\n }\n };\n\n _proto.update = function update() {\n this._inNavbar = this._detectNavbar();\n\n if (this._popper !== null) {\n this._popper.scheduleUpdate();\n }\n }; // Private\n\n\n _proto._addEventListeners = function _addEventListeners() {\n var _this = this;\n\n $$$1(this._element).on(Event.CLICK, function (event) {\n event.preventDefault();\n event.stopPropagation();\n\n _this.toggle();\n });\n };\n\n _proto._getConfig = function _getConfig(config) {\n config = _objectSpread({}, this.constructor.Default, $$$1(this._element).data(), config);\n Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\n return config;\n };\n\n _proto._getMenuElement = function _getMenuElement() {\n if (!this._menu) {\n var parent = Dropdown._getParentFromElement(this._element);\n\n if (parent) {\n this._menu = parent.querySelector(Selector.MENU);\n }\n }\n\n return this._menu;\n };\n\n _proto._getPlacement = function _getPlacement() {\n var $parentDropdown = $$$1(this._element.parentNode);\n var placement = AttachmentMap.BOTTOM; // Handle dropup\n\n if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n placement = AttachmentMap.TOP;\n\n if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.TOPEND;\n }\n } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n placement = AttachmentMap.RIGHT;\n } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n placement = AttachmentMap.LEFT;\n } else if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.BOTTOMEND;\n }\n\n return placement;\n };\n\n _proto._detectNavbar = function _detectNavbar() {\n return $$$1(this._element).closest('.navbar').length > 0;\n };\n\n _proto._getPopperConfig = function _getPopperConfig() {\n var _this2 = this;\n\n var offsetConf = {};\n\n if (typeof this._config.offset === 'function') {\n offsetConf.fn = function (data) {\n data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets) || {});\n return data;\n };\n } else {\n offsetConf.offset = this._config.offset;\n }\n\n var popperConfig = {\n placement: this._getPlacement(),\n modifiers: {\n offset: offsetConf,\n flip: {\n enabled: this._config.flip\n },\n preventOverflow: {\n boundariesElement: this._config.boundary\n }\n } // Disable Popper.js if we have a static display\n\n };\n\n if (this._config.display === 'static') {\n popperConfig.modifiers.applyStyle = {\n enabled: false\n };\n }\n\n return popperConfig;\n }; // Static\n\n\n Dropdown._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $$$1(this).data(DATA_KEY);\n\n var _config = typeof config === 'object' ? config : null;\n\n if (!data) {\n data = new Dropdown(this, _config);\n $$$1(this).data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n Dropdown._clearMenus = function _clearMenus(event) {\n if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n return;\n }\n\n var toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));\n\n for (var i = 0, len = toggles.length; i < len; i++) {\n var parent = Dropdown._getParentFromElement(toggles[i]);\n\n var context = $$$1(toggles[i]).data(DATA_KEY);\n var relatedTarget = {\n relatedTarget: toggles[i]\n };\n\n if (event && event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n\n if (!context) {\n continue;\n }\n\n var dropdownMenu = context._menu;\n\n if (!$$$1(parent).hasClass(ClassName.SHOW)) {\n continue;\n }\n\n if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $$$1.contains(parent, event.target)) {\n continue;\n }\n\n var hideEvent = $$$1.Event(Event.HIDE, relatedTarget);\n $$$1(parent).trigger(hideEvent);\n\n if (hideEvent.isDefaultPrevented()) {\n continue;\n } // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n\n\n if ('ontouchstart' in document.documentElement) {\n $$$1(document.body).children().off('mouseover', null, $$$1.noop);\n }\n\n toggles[i].setAttribute('aria-expanded', 'false');\n $$$1(dropdownMenu).removeClass(ClassName.SHOW);\n $$$1(parent).removeClass(ClassName.SHOW).trigger($$$1.Event(Event.HIDDEN, relatedTarget));\n }\n };\n\n Dropdown._getParentFromElement = function _getParentFromElement(element) {\n var parent;\n var selector = Util.getSelectorFromElement(element);\n\n if (selector) {\n parent = document.querySelector(selector);\n }\n\n return parent || element.parentNode;\n }; // eslint-disable-next-line complexity\n\n\n Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $$$1(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n if (this.disabled || $$$1(this).hasClass(ClassName.DISABLED)) {\n return;\n }\n\n var parent = Dropdown._getParentFromElement(this);\n\n var isActive = $$$1(parent).hasClass(ClassName.SHOW);\n\n if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n if (event.which === ESCAPE_KEYCODE) {\n var toggle = parent.querySelector(Selector.DATA_TOGGLE);\n $$$1(toggle).trigger('focus');\n }\n\n $$$1(this).trigger('click');\n return;\n }\n\n var items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS));\n\n if (items.length === 0) {\n return;\n }\n\n var index = items.indexOf(event.target);\n\n if (event.which === ARROW_UP_KEYCODE && index > 0) {\n // Up\n index--;\n }\n\n if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n // Down\n index++;\n }\n\n if (index < 0) {\n index = 0;\n }\n\n items[index].focus();\n };\n\n _createClass(Dropdown, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }, {\n key: \"DefaultType\",\n get: function get() {\n return DefaultType;\n }\n }]);\n\n return Dropdown;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + \" \" + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault();\n event.stopPropagation();\n\n Dropdown._jQueryInterface.call($$$1(this), 'toggle');\n }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {\n e.stopPropagation();\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = Dropdown._jQueryInterface;\n $$$1.fn[NAME].Constructor = Dropdown;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Dropdown._jQueryInterface;\n };\n\n return Dropdown;\n }($, Popper);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Modal = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'modal';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.modal';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n var Default = {\n backdrop: true,\n keyboard: true,\n focus: true,\n show: true\n };\n var DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean',\n show: 'boolean'\n };\n var Event = {\n HIDE: \"hide\" + EVENT_KEY,\n HIDDEN: \"hidden\" + EVENT_KEY,\n SHOW: \"show\" + EVENT_KEY,\n SHOWN: \"shown\" + EVENT_KEY,\n FOCUSIN: \"focusin\" + EVENT_KEY,\n RESIZE: \"resize\" + EVENT_KEY,\n CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY,\n KEYDOWN_DISMISS: \"keydown.dismiss\" + EVENT_KEY,\n MOUSEUP_DISMISS: \"mouseup.dismiss\" + EVENT_KEY,\n MOUSEDOWN_DISMISS: \"mousedown.dismiss\" + EVENT_KEY,\n CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n };\n var ClassName = {\n SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\n BACKDROP: 'modal-backdrop',\n OPEN: 'modal-open',\n FADE: 'fade',\n SHOW: 'show'\n };\n var Selector = {\n DIALOG: '.modal-dialog',\n DATA_TOGGLE: '[data-toggle=\"modal\"]',\n DATA_DISMISS: '[data-dismiss=\"modal\"]',\n FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n STICKY_CONTENT: '.sticky-top'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Modal =\n /*#__PURE__*/\n function () {\n function Modal(element, config) {\n this._config = this._getConfig(config);\n this._element = element;\n this._dialog = element.querySelector(Selector.DIALOG);\n this._backdrop = null;\n this._isShown = false;\n this._isBodyOverflowing = false;\n this._ignoreBackdropClick = false;\n this._scrollbarWidth = 0;\n } // Getters\n\n\n var _proto = Modal.prototype;\n\n // Public\n _proto.toggle = function toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n };\n\n _proto.show = function show(relatedTarget) {\n var _this = this;\n\n if (this._isTransitioning || this._isShown) {\n return;\n }\n\n if ($$$1(this._element).hasClass(ClassName.FADE)) {\n this._isTransitioning = true;\n }\n\n var showEvent = $$$1.Event(Event.SHOW, {\n relatedTarget: relatedTarget\n });\n $$$1(this._element).trigger(showEvent);\n\n if (this._isShown || showEvent.isDefaultPrevented()) {\n return;\n }\n\n this._isShown = true;\n\n this._checkScrollbar();\n\n this._setScrollbar();\n\n this._adjustDialog();\n\n $$$1(document.body).addClass(ClassName.OPEN);\n\n this._setEscapeEvent();\n\n this._setResizeEvent();\n\n $$$1(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {\n return _this.hide(event);\n });\n $$$1(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {\n $$$1(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {\n if ($$$1(event.target).is(_this._element)) {\n _this._ignoreBackdropClick = true;\n }\n });\n });\n\n this._showBackdrop(function () {\n return _this._showElement(relatedTarget);\n });\n };\n\n _proto.hide = function hide(event) {\n var _this2 = this;\n\n if (event) {\n event.preventDefault();\n }\n\n if (this._isTransitioning || !this._isShown) {\n return;\n }\n\n var hideEvent = $$$1.Event(Event.HIDE);\n $$$1(this._element).trigger(hideEvent);\n\n if (!this._isShown || hideEvent.isDefaultPrevented()) {\n return;\n }\n\n this._isShown = false;\n var transition = $$$1(this._element).hasClass(ClassName.FADE);\n\n if (transition) {\n this._isTransitioning = true;\n }\n\n this._setEscapeEvent();\n\n this._setResizeEvent();\n\n $$$1(document).off(Event.FOCUSIN);\n $$$1(this._element).removeClass(ClassName.SHOW);\n $$$1(this._element).off(Event.CLICK_DISMISS);\n $$$1(this._dialog).off(Event.MOUSEDOWN_DISMISS);\n\n if (transition) {\n var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n $$$1(this._element).one(Util.TRANSITION_END, function (event) {\n return _this2._hideModal(event);\n }).emulateTransitionEnd(transitionDuration);\n } else {\n this._hideModal();\n }\n };\n\n _proto.dispose = function dispose() {\n $$$1.removeData(this._element, DATA_KEY);\n $$$1(window, document, this._element, this._backdrop).off(EVENT_KEY);\n this._config = null;\n this._element = null;\n this._dialog = null;\n this._backdrop = null;\n this._isShown = null;\n this._isBodyOverflowing = null;\n this._ignoreBackdropClick = null;\n this._scrollbarWidth = null;\n };\n\n _proto.handleUpdate = function handleUpdate() {\n this._adjustDialog();\n }; // Private\n\n\n _proto._getConfig = function _getConfig(config) {\n config = _objectSpread({}, Default, config);\n Util.typeCheckConfig(NAME, config, DefaultType);\n return config;\n };\n\n _proto._showElement = function _showElement(relatedTarget) {\n var _this3 = this;\n\n var transition = $$$1(this._element).hasClass(ClassName.FADE);\n\n if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element);\n }\n\n this._element.style.display = 'block';\n\n this._element.removeAttribute('aria-hidden');\n\n this._element.scrollTop = 0;\n\n if (transition) {\n Util.reflow(this._element);\n }\n\n $$$1(this._element).addClass(ClassName.SHOW);\n\n if (this._config.focus) {\n this._enforceFocus();\n }\n\n var shownEvent = $$$1.Event(Event.SHOWN, {\n relatedTarget: relatedTarget\n });\n\n var transitionComplete = function transitionComplete() {\n if (_this3._config.focus) {\n _this3._element.focus();\n }\n\n _this3._isTransitioning = false;\n $$$1(_this3._element).trigger(shownEvent);\n };\n\n if (transition) {\n var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n $$$1(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);\n } else {\n transitionComplete();\n }\n };\n\n _proto._enforceFocus = function _enforceFocus() {\n var _this4 = this;\n\n $$$1(document).off(Event.FOCUSIN) // Guard against infinite focus loop\n .on(Event.FOCUSIN, function (event) {\n if (document !== event.target && _this4._element !== event.target && $$$1(_this4._element).has(event.target).length === 0) {\n _this4._element.focus();\n }\n });\n };\n\n _proto._setEscapeEvent = function _setEscapeEvent() {\n var _this5 = this;\n\n if (this._isShown && this._config.keyboard) {\n $$$1(this._element).on(Event.KEYDOWN_DISMISS, function (event) {\n if (event.which === ESCAPE_KEYCODE) {\n event.preventDefault();\n\n _this5.hide();\n }\n });\n } else if (!this._isShown) {\n $$$1(this._element).off(Event.KEYDOWN_DISMISS);\n }\n };\n\n _proto._setResizeEvent = function _setResizeEvent() {\n var _this6 = this;\n\n if (this._isShown) {\n $$$1(window).on(Event.RESIZE, function (event) {\n return _this6.handleUpdate(event);\n });\n } else {\n $$$1(window).off(Event.RESIZE);\n }\n };\n\n _proto._hideModal = function _hideModal() {\n var _this7 = this;\n\n this._element.style.display = 'none';\n\n this._element.setAttribute('aria-hidden', true);\n\n this._isTransitioning = false;\n\n this._showBackdrop(function () {\n $$$1(document.body).removeClass(ClassName.OPEN);\n\n _this7._resetAdjustments();\n\n _this7._resetScrollbar();\n\n $$$1(_this7._element).trigger(Event.HIDDEN);\n });\n };\n\n _proto._removeBackdrop = function _removeBackdrop() {\n if (this._backdrop) {\n $$$1(this._backdrop).remove();\n this._backdrop = null;\n }\n };\n\n _proto._showBackdrop = function _showBackdrop(callback) {\n var _this8 = this;\n\n var animate = $$$1(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';\n\n if (this._isShown && this._config.backdrop) {\n this._backdrop = document.createElement('div');\n this._backdrop.className = ClassName.BACKDROP;\n\n if (animate) {\n this._backdrop.classList.add(animate);\n }\n\n $$$1(this._backdrop).appendTo(document.body);\n $$$1(this._element).on(Event.CLICK_DISMISS, function (event) {\n if (_this8._ignoreBackdropClick) {\n _this8._ignoreBackdropClick = false;\n return;\n }\n\n if (event.target !== event.currentTarget) {\n return;\n }\n\n if (_this8._config.backdrop === 'static') {\n _this8._element.focus();\n } else {\n _this8.hide();\n }\n });\n\n if (animate) {\n Util.reflow(this._backdrop);\n }\n\n $$$1(this._backdrop).addClass(ClassName.SHOW);\n\n if (!callback) {\n return;\n }\n\n if (!animate) {\n callback();\n return;\n }\n\n var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n $$$1(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);\n } else if (!this._isShown && this._backdrop) {\n $$$1(this._backdrop).removeClass(ClassName.SHOW);\n\n var callbackRemove = function callbackRemove() {\n _this8._removeBackdrop();\n\n if (callback) {\n callback();\n }\n };\n\n if ($$$1(this._element).hasClass(ClassName.FADE)) {\n var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n\n $$$1(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);\n } else {\n callbackRemove();\n }\n } else if (callback) {\n callback();\n }\n }; // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // todo (fat): these should probably be refactored out of modal.js\n // ----------------------------------------------------------------------\n\n\n _proto._adjustDialog = function _adjustDialog() {\n var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n if (!this._isBodyOverflowing && isModalOverflowing) {\n this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n }\n\n if (this._isBodyOverflowing && !isModalOverflowing) {\n this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n }\n };\n\n _proto._resetAdjustments = function _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n };\n\n _proto._checkScrollbar = function _checkScrollbar() {\n var rect = document.body.getBoundingClientRect();\n this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;\n this._scrollbarWidth = this._getScrollbarWidth();\n };\n\n _proto._setScrollbar = function _setScrollbar() {\n var _this9 = this;\n\n if (this._isBodyOverflowing) {\n // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT));\n var stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT)); // Adjust fixed content padding\n\n $$$1(fixedContent).each(function (index, element) {\n var actualPadding = element.style.paddingRight;\n var calculatedPadding = $$$1(element).css('padding-right');\n $$$1(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + \"px\");\n }); // Adjust sticky content margin\n\n $$$1(stickyContent).each(function (index, element) {\n var actualMargin = element.style.marginRight;\n var calculatedMargin = $$$1(element).css('margin-right');\n $$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + \"px\");\n }); // Adjust body padding\n\n var actualPadding = document.body.style.paddingRight;\n var calculatedPadding = $$$1(document.body).css('padding-right');\n $$$1(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n }\n };\n\n _proto._resetScrollbar = function _resetScrollbar() {\n // Restore fixed content padding\n var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT));\n $$$1(fixedContent).each(function (index, element) {\n var padding = $$$1(element).data('padding-right');\n $$$1(element).removeData('padding-right');\n element.style.paddingRight = padding ? padding : '';\n }); // Restore sticky content\n\n var elements = [].slice.call(document.querySelectorAll(\"\" + Selector.STICKY_CONTENT));\n $$$1(elements).each(function (index, element) {\n var margin = $$$1(element).data('margin-right');\n\n if (typeof margin !== 'undefined') {\n $$$1(element).css('margin-right', margin).removeData('margin-right');\n }\n }); // Restore body padding\n\n var padding = $$$1(document.body).data('padding-right');\n $$$1(document.body).removeData('padding-right');\n document.body.style.paddingRight = padding ? padding : '';\n };\n\n _proto._getScrollbarWidth = function _getScrollbarWidth() {\n // thx d.walsh\n var scrollDiv = document.createElement('div');\n scrollDiv.className = ClassName.SCROLLBAR_MEASURER;\n document.body.appendChild(scrollDiv);\n var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n document.body.removeChild(scrollDiv);\n return scrollbarWidth;\n }; // Static\n\n\n Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n var data = $$$1(this).data(DATA_KEY);\n\n var _config = _objectSpread({}, Default, $$$1(this).data(), typeof config === 'object' && config ? config : {});\n\n if (!data) {\n data = new Modal(this, _config);\n $$$1(this).data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config](relatedTarget);\n } else if (_config.show) {\n data.show(relatedTarget);\n }\n });\n };\n\n _createClass(Modal, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }]);\n\n return Modal;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n var _this10 = this;\n\n var target;\n var selector = Util.getSelectorFromElement(this);\n\n if (selector) {\n target = document.querySelector(selector);\n }\n\n var config = $$$1(target).data(DATA_KEY) ? 'toggle' : _objectSpread({}, $$$1(target).data(), $$$1(this).data());\n\n if (this.tagName === 'A' || this.tagName === 'AREA') {\n event.preventDefault();\n }\n\n var $target = $$$1(target).one(Event.SHOW, function (showEvent) {\n if (showEvent.isDefaultPrevented()) {\n // Only register focus restorer if modal will actually get shown\n return;\n }\n\n $target.one(Event.HIDDEN, function () {\n if ($$$1(_this10).is(':visible')) {\n _this10.focus();\n }\n });\n });\n\n Modal._jQueryInterface.call($$$1(target), config, this);\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = Modal._jQueryInterface;\n $$$1.fn[NAME].Constructor = Modal;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Modal._jQueryInterface;\n };\n\n return Modal;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Tooltip = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'tooltip';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.tooltip';\n var EVENT_KEY = \".\" + DATA_KEY;\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var CLASS_PREFIX = 'bs-tooltip';\n var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n var DefaultType = {\n animation: 'boolean',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string',\n delay: '(number|object)',\n html: 'boolean',\n selector: '(string|boolean)',\n placement: '(string|function)',\n offset: '(number|string)',\n container: '(string|element|boolean)',\n fallbackPlacement: '(string|array)',\n boundary: '(string|element)'\n };\n var AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: 'right',\n BOTTOM: 'bottom',\n LEFT: 'left'\n };\n var Default = {\n animation: true,\n template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n selector: false,\n placement: 'top',\n offset: 0,\n container: false,\n fallbackPlacement: 'flip',\n boundary: 'scrollParent'\n };\n var HoverState = {\n SHOW: 'show',\n OUT: 'out'\n };\n var Event = {\n HIDE: \"hide\" + EVENT_KEY,\n HIDDEN: \"hidden\" + EVENT_KEY,\n SHOW: \"show\" + EVENT_KEY,\n SHOWN: \"shown\" + EVENT_KEY,\n INSERTED: \"inserted\" + EVENT_KEY,\n CLICK: \"click\" + EVENT_KEY,\n FOCUSIN: \"focusin\" + EVENT_KEY,\n FOCUSOUT: \"focusout\" + EVENT_KEY,\n MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n MOUSELEAVE: \"mouseleave\" + EVENT_KEY\n };\n var ClassName = {\n FADE: 'fade',\n SHOW: 'show'\n };\n var Selector = {\n TOOLTIP: '.tooltip',\n TOOLTIP_INNER: '.tooltip-inner',\n ARROW: '.arrow'\n };\n var Trigger = {\n HOVER: 'hover',\n FOCUS: 'focus',\n CLICK: 'click',\n MANUAL: 'manual'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Tooltip =\n /*#__PURE__*/\n function () {\n function Tooltip(element, config) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap tooltips require Popper.js (https://popper.js.org)');\n } // private\n\n\n this._isEnabled = true;\n this._timeout = 0;\n this._hoverState = '';\n this._activeTrigger = {};\n this._popper = null; // Protected\n\n this.element = element;\n this.config = this._getConfig(config);\n this.tip = null;\n\n this._setListeners();\n } // Getters\n\n\n var _proto = Tooltip.prototype;\n\n // Public\n _proto.enable = function enable() {\n this._isEnabled = true;\n };\n\n _proto.disable = function disable() {\n this._isEnabled = false;\n };\n\n _proto.toggleEnabled = function toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n };\n\n _proto.toggle = function toggle(event) {\n if (!this._isEnabled) {\n return;\n }\n\n if (event) {\n var dataKey = this.constructor.DATA_KEY;\n var context = $$$1(event.currentTarget).data(dataKey);\n\n if (!context) {\n context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n $$$1(event.currentTarget).data(dataKey, context);\n }\n\n context._activeTrigger.click = !context._activeTrigger.click;\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context);\n } else {\n context._leave(null, context);\n }\n } else {\n if ($$$1(this.getTipElement()).hasClass(ClassName.SHOW)) {\n this._leave(null, this);\n\n return;\n }\n\n this._enter(null, this);\n }\n };\n\n _proto.dispose = function dispose() {\n clearTimeout(this._timeout);\n $$$1.removeData(this.element, this.constructor.DATA_KEY);\n $$$1(this.element).off(this.constructor.EVENT_KEY);\n $$$1(this.element).closest('.modal').off('hide.bs.modal');\n\n if (this.tip) {\n $$$1(this.tip).remove();\n }\n\n this._isEnabled = null;\n this._timeout = null;\n this._hoverState = null;\n this._activeTrigger = null;\n\n if (this._popper !== null) {\n this._popper.destroy();\n }\n\n this._popper = null;\n this.element = null;\n this.config = null;\n this.tip = null;\n };\n\n _proto.show = function show() {\n var _this = this;\n\n if ($$$1(this.element).css('display') === 'none') {\n throw new Error('Please use show on visible elements');\n }\n\n var showEvent = $$$1.Event(this.constructor.Event.SHOW);\n\n if (this.isWithContent() && this._isEnabled) {\n $$$1(this.element).trigger(showEvent);\n var isInTheDom = $$$1.contains(this.element.ownerDocument.documentElement, this.element);\n\n if (showEvent.isDefaultPrevented() || !isInTheDom) {\n return;\n }\n\n var tip = this.getTipElement();\n var tipId = Util.getUID(this.constructor.NAME);\n tip.setAttribute('id', tipId);\n this.element.setAttribute('aria-describedby', tipId);\n this.setContent();\n\n if (this.config.animation) {\n $$$1(tip).addClass(ClassName.FADE);\n }\n\n var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n var attachment = this._getAttachment(placement);\n\n this.addAttachmentClass(attachment);\n var container = this.config.container === false ? document.body : $$$1(document).find(this.config.container);\n $$$1(tip).data(this.constructor.DATA_KEY, this);\n\n if (!$$$1.contains(this.element.ownerDocument.documentElement, this.tip)) {\n $$$1(tip).appendTo(container);\n }\n\n $$$1(this.element).trigger(this.constructor.Event.INSERTED);\n this._popper = new Popper(this.element, tip, {\n placement: attachment,\n modifiers: {\n offset: {\n offset: this.config.offset\n },\n flip: {\n behavior: this.config.fallbackPlacement\n },\n arrow: {\n element: Selector.ARROW\n },\n preventOverflow: {\n boundariesElement: this.config.boundary\n }\n },\n onCreate: function onCreate(data) {\n if (data.originalPlacement !== data.placement) {\n _this._handlePopperPlacementChange(data);\n }\n },\n onUpdate: function onUpdate(data) {\n _this._handlePopperPlacementChange(data);\n }\n });\n $$$1(tip).addClass(ClassName.SHOW); // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n if ('ontouchstart' in document.documentElement) {\n $$$1(document.body).children().on('mouseover', null, $$$1.noop);\n }\n\n var complete = function complete() {\n if (_this.config.animation) {\n _this._fixTransition();\n }\n\n var prevHoverState = _this._hoverState;\n _this._hoverState = null;\n $$$1(_this.element).trigger(_this.constructor.Event.SHOWN);\n\n if (prevHoverState === HoverState.OUT) {\n _this._leave(null, _this);\n }\n };\n\n if ($$$1(this.tip).hasClass(ClassName.FADE)) {\n var transitionDuration = Util.getTransitionDurationFromElement(this.tip);\n $$$1(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n } else {\n complete();\n }\n }\n };\n\n _proto.hide = function hide(callback) {\n var _this2 = this;\n\n var tip = this.getTipElement();\n var hideEvent = $$$1.Event(this.constructor.Event.HIDE);\n\n var complete = function complete() {\n if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {\n tip.parentNode.removeChild(tip);\n }\n\n _this2._cleanTipClass();\n\n _this2.element.removeAttribute('aria-describedby');\n\n $$$1(_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n if (_this2._popper !== null) {\n _this2._popper.destroy();\n }\n\n if (callback) {\n callback();\n }\n };\n\n $$$1(this.element).trigger(hideEvent);\n\n if (hideEvent.isDefaultPrevented()) {\n return;\n }\n\n $$$1(tip).removeClass(ClassName.SHOW); // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n\n if ('ontouchstart' in document.documentElement) {\n $$$1(document.body).children().off('mouseover', null, $$$1.noop);\n }\n\n this._activeTrigger[Trigger.CLICK] = false;\n this._activeTrigger[Trigger.FOCUS] = false;\n this._activeTrigger[Trigger.HOVER] = false;\n\n if ($$$1(this.tip).hasClass(ClassName.FADE)) {\n var transitionDuration = Util.getTransitionDurationFromElement(tip);\n $$$1(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n } else {\n complete();\n }\n\n this._hoverState = '';\n };\n\n _proto.update = function update() {\n if (this._popper !== null) {\n this._popper.scheduleUpdate();\n }\n }; // Protected\n\n\n _proto.isWithContent = function isWithContent() {\n return Boolean(this.getTitle());\n };\n\n _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n $$$1(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n };\n\n _proto.getTipElement = function getTipElement() {\n this.tip = this.tip || $$$1(this.config.template)[0];\n return this.tip;\n };\n\n _proto.setContent = function setContent() {\n var tip = this.getTipElement();\n this.setElementContent($$$1(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle());\n $$$1(tip).removeClass(ClassName.FADE + \" \" + ClassName.SHOW);\n };\n\n _proto.setElementContent = function setElementContent($element, content) {\n var html = this.config.html;\n\n if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n // Content is a DOM node or a jQuery\n if (html) {\n if (!$$$1(content).parent().is($element)) {\n $element.empty().append(content);\n }\n } else {\n $element.text($$$1(content).text());\n }\n } else {\n $element[html ? 'html' : 'text'](content);\n }\n };\n\n _proto.getTitle = function getTitle() {\n var title = this.element.getAttribute('data-original-title');\n\n if (!title) {\n title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n }\n\n return title;\n }; // Private\n\n\n _proto._getAttachment = function _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()];\n };\n\n _proto._setListeners = function _setListeners() {\n var _this3 = this;\n\n var triggers = this.config.trigger.split(' ');\n triggers.forEach(function (trigger) {\n if (trigger === 'click') {\n $$$1(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) {\n return _this3.toggle(event);\n });\n } else if (trigger !== Trigger.MANUAL) {\n var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;\n var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;\n $$$1(_this3.element).on(eventIn, _this3.config.selector, function (event) {\n return _this3._enter(event);\n }).on(eventOut, _this3.config.selector, function (event) {\n return _this3._leave(event);\n });\n }\n\n $$$1(_this3.element).closest('.modal').on('hide.bs.modal', function () {\n return _this3.hide();\n });\n });\n\n if (this.config.selector) {\n this.config = _objectSpread({}, this.config, {\n trigger: 'manual',\n selector: ''\n });\n } else {\n this._fixTitle();\n }\n };\n\n _proto._fixTitle = function _fixTitle() {\n var titleType = typeof this.element.getAttribute('data-original-title');\n\n if (this.element.getAttribute('title') || titleType !== 'string') {\n this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n this.element.setAttribute('title', '');\n }\n };\n\n _proto._enter = function _enter(event, context) {\n var dataKey = this.constructor.DATA_KEY;\n context = context || $$$1(event.currentTarget).data(dataKey);\n\n if (!context) {\n context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n $$$1(event.currentTarget).data(dataKey, context);\n }\n\n if (event) {\n context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\n }\n\n if ($$$1(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n context._hoverState = HoverState.SHOW;\n return;\n }\n\n clearTimeout(context._timeout);\n context._hoverState = HoverState.SHOW;\n\n if (!context.config.delay || !context.config.delay.show) {\n context.show();\n return;\n }\n\n context._timeout = setTimeout(function () {\n if (context._hoverState === HoverState.SHOW) {\n context.show();\n }\n }, context.config.delay.show);\n };\n\n _proto._leave = function _leave(event, context) {\n var dataKey = this.constructor.DATA_KEY;\n context = context || $$$1(event.currentTarget).data(dataKey);\n\n if (!context) {\n context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n $$$1(event.currentTarget).data(dataKey, context);\n }\n\n if (event) {\n context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\n }\n\n if (context._isWithActiveTrigger()) {\n return;\n }\n\n clearTimeout(context._timeout);\n context._hoverState = HoverState.OUT;\n\n if (!context.config.delay || !context.config.delay.hide) {\n context.hide();\n return;\n }\n\n context._timeout = setTimeout(function () {\n if (context._hoverState === HoverState.OUT) {\n context.hide();\n }\n }, context.config.delay.hide);\n };\n\n _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n for (var trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true;\n }\n }\n\n return false;\n };\n\n _proto._getConfig = function _getConfig(config) {\n config = _objectSpread({}, this.constructor.Default, $$$1(this.element).data(), typeof config === 'object' && config ? config : {});\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n\n Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\n return config;\n };\n\n _proto._getDelegateConfig = function _getDelegateConfig() {\n var config = {};\n\n if (this.config) {\n for (var key in this.config) {\n if (this.constructor.Default[key] !== this.config[key]) {\n config[key] = this.config[key];\n }\n }\n }\n\n return config;\n };\n\n _proto._cleanTipClass = function _cleanTipClass() {\n var $tip = $$$1(this.getTipElement());\n var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n if (tabClass !== null && tabClass.length) {\n $tip.removeClass(tabClass.join(''));\n }\n };\n\n _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {\n var popperInstance = popperData.instance;\n this.tip = popperInstance.popper;\n\n this._cleanTipClass();\n\n this.addAttachmentClass(this._getAttachment(popperData.placement));\n };\n\n _proto._fixTransition = function _fixTransition() {\n var tip = this.getTipElement();\n var initConfigAnimation = this.config.animation;\n\n if (tip.getAttribute('x-placement') !== null) {\n return;\n }\n\n $$$1(tip).removeClass(ClassName.FADE);\n this.config.animation = false;\n this.hide();\n this.show();\n this.config.animation = initConfigAnimation;\n }; // Static\n\n\n Tooltip._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $$$1(this).data(DATA_KEY);\n\n var _config = typeof config === 'object' && config;\n\n if (!data && /dispose|hide/.test(config)) {\n return;\n }\n\n if (!data) {\n data = new Tooltip(this, _config);\n $$$1(this).data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(Tooltip, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }, {\n key: \"NAME\",\n get: function get() {\n return NAME;\n }\n }, {\n key: \"DATA_KEY\",\n get: function get() {\n return DATA_KEY;\n }\n }, {\n key: \"Event\",\n get: function get() {\n return Event;\n }\n }, {\n key: \"EVENT_KEY\",\n get: function get() {\n return EVENT_KEY;\n }\n }, {\n key: \"DefaultType\",\n get: function get() {\n return DefaultType;\n }\n }]);\n\n return Tooltip;\n }();\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n\n $$$1.fn[NAME] = Tooltip._jQueryInterface;\n $$$1.fn[NAME].Constructor = Tooltip;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Tooltip._jQueryInterface;\n };\n\n return Tooltip;\n }($, Popper);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Popover = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'popover';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.popover';\n var EVENT_KEY = \".\" + DATA_KEY;\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var CLASS_PREFIX = 'bs-popover';\n var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n\n var Default = _objectSpread({}, Tooltip.Default, {\n placement: 'right',\n trigger: 'click',\n content: '',\n template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n });\n\n var DefaultType = _objectSpread({}, Tooltip.DefaultType, {\n content: '(string|element|function)'\n });\n\n var ClassName = {\n FADE: 'fade',\n SHOW: 'show'\n };\n var Selector = {\n TITLE: '.popover-header',\n CONTENT: '.popover-body'\n };\n var Event = {\n HIDE: \"hide\" + EVENT_KEY,\n HIDDEN: \"hidden\" + EVENT_KEY,\n SHOW: \"show\" + EVENT_KEY,\n SHOWN: \"shown\" + EVENT_KEY,\n INSERTED: \"inserted\" + EVENT_KEY,\n CLICK: \"click\" + EVENT_KEY,\n FOCUSIN: \"focusin\" + EVENT_KEY,\n FOCUSOUT: \"focusout\" + EVENT_KEY,\n MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n MOUSELEAVE: \"mouseleave\" + EVENT_KEY\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Popover =\n /*#__PURE__*/\n function (_Tooltip) {\n _inheritsLoose(Popover, _Tooltip);\n\n function Popover() {\n return _Tooltip.apply(this, arguments) || this;\n }\n\n var _proto = Popover.prototype;\n\n // Overrides\n _proto.isWithContent = function isWithContent() {\n return this.getTitle() || this._getContent();\n };\n\n _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n $$$1(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n };\n\n _proto.getTipElement = function getTipElement() {\n this.tip = this.tip || $$$1(this.config.template)[0];\n return this.tip;\n };\n\n _proto.setContent = function setContent() {\n var $tip = $$$1(this.getTipElement()); // We use append for html objects to maintain js events\n\n this.setElementContent($tip.find(Selector.TITLE), this.getTitle());\n\n var content = this._getContent();\n\n if (typeof content === 'function') {\n content = content.call(this.element);\n }\n\n this.setElementContent($tip.find(Selector.CONTENT), content);\n $tip.removeClass(ClassName.FADE + \" \" + ClassName.SHOW);\n }; // Private\n\n\n _proto._getContent = function _getContent() {\n return this.element.getAttribute('data-content') || this.config.content;\n };\n\n _proto._cleanTipClass = function _cleanTipClass() {\n var $tip = $$$1(this.getTipElement());\n var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n if (tabClass !== null && tabClass.length > 0) {\n $tip.removeClass(tabClass.join(''));\n }\n }; // Static\n\n\n Popover._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $$$1(this).data(DATA_KEY);\n\n var _config = typeof config === 'object' ? config : null;\n\n if (!data && /destroy|hide/.test(config)) {\n return;\n }\n\n if (!data) {\n data = new Popover(this, _config);\n $$$1(this).data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(Popover, null, [{\n key: \"VERSION\",\n // Getters\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }, {\n key: \"NAME\",\n get: function get() {\n return NAME;\n }\n }, {\n key: \"DATA_KEY\",\n get: function get() {\n return DATA_KEY;\n }\n }, {\n key: \"Event\",\n get: function get() {\n return Event;\n }\n }, {\n key: \"EVENT_KEY\",\n get: function get() {\n return EVENT_KEY;\n }\n }, {\n key: \"DefaultType\",\n get: function get() {\n return DefaultType;\n }\n }]);\n\n return Popover;\n }(Tooltip);\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n\n $$$1.fn[NAME] = Popover._jQueryInterface;\n $$$1.fn[NAME].Constructor = Popover;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Popover._jQueryInterface;\n };\n\n return Popover;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var ScrollSpy = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'scrollspy';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.scrollspy';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var Default = {\n offset: 10,\n method: 'auto',\n target: ''\n };\n var DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n };\n var Event = {\n ACTIVATE: \"activate\" + EVENT_KEY,\n SCROLL: \"scroll\" + EVENT_KEY,\n LOAD_DATA_API: \"load\" + EVENT_KEY + DATA_API_KEY\n };\n var ClassName = {\n DROPDOWN_ITEM: 'dropdown-item',\n DROPDOWN_MENU: 'dropdown-menu',\n ACTIVE: 'active'\n };\n var Selector = {\n DATA_SPY: '[data-spy=\"scroll\"]',\n ACTIVE: '.active',\n NAV_LIST_GROUP: '.nav, .list-group',\n NAV_LINKS: '.nav-link',\n NAV_ITEMS: '.nav-item',\n LIST_ITEMS: '.list-group-item',\n DROPDOWN: '.dropdown',\n DROPDOWN_ITEMS: '.dropdown-item',\n DROPDOWN_TOGGLE: '.dropdown-toggle'\n };\n var OffsetMethod = {\n OFFSET: 'offset',\n POSITION: 'position'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var ScrollSpy =\n /*#__PURE__*/\n function () {\n function ScrollSpy(element, config) {\n var _this = this;\n\n this._element = element;\n this._scrollElement = element.tagName === 'BODY' ? window : element;\n this._config = this._getConfig(config);\n this._selector = this._config.target + \" \" + Selector.NAV_LINKS + \",\" + (this._config.target + \" \" + Selector.LIST_ITEMS + \",\") + (this._config.target + \" \" + Selector.DROPDOWN_ITEMS);\n this._offsets = [];\n this._targets = [];\n this._activeTarget = null;\n this._scrollHeight = 0;\n $$$1(this._scrollElement).on(Event.SCROLL, function (event) {\n return _this._process(event);\n });\n this.refresh();\n\n this._process();\n } // Getters\n\n\n var _proto = ScrollSpy.prototype;\n\n // Public\n _proto.refresh = function refresh() {\n var _this2 = this;\n\n var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;\n var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\n this._offsets = [];\n this._targets = [];\n this._scrollHeight = this._getScrollHeight();\n var targets = [].slice.call(document.querySelectorAll(this._selector));\n targets.map(function (element) {\n var target;\n var targetSelector = Util.getSelectorFromElement(element);\n\n if (targetSelector) {\n target = document.querySelector(targetSelector);\n }\n\n if (target) {\n var targetBCR = target.getBoundingClientRect();\n\n if (targetBCR.width || targetBCR.height) {\n // TODO (fat): remove sketch reliance on jQuery position/offset\n return [$$$1(target)[offsetMethod]().top + offsetBase, targetSelector];\n }\n }\n\n return null;\n }).filter(function (item) {\n return item;\n }).sort(function (a, b) {\n return a[0] - b[0];\n }).forEach(function (item) {\n _this2._offsets.push(item[0]);\n\n _this2._targets.push(item[1]);\n });\n };\n\n _proto.dispose = function dispose() {\n $$$1.removeData(this._element, DATA_KEY);\n $$$1(this._scrollElement).off(EVENT_KEY);\n this._element = null;\n this._scrollElement = null;\n this._config = null;\n this._selector = null;\n this._offsets = null;\n this._targets = null;\n this._activeTarget = null;\n this._scrollHeight = null;\n }; // Private\n\n\n _proto._getConfig = function _getConfig(config) {\n config = _objectSpread({}, Default, typeof config === 'object' && config ? config : {});\n\n if (typeof config.target !== 'string') {\n var id = $$$1(config.target).attr('id');\n\n if (!id) {\n id = Util.getUID(NAME);\n $$$1(config.target).attr('id', id);\n }\n\n config.target = \"#\" + id;\n }\n\n Util.typeCheckConfig(NAME, config, DefaultType);\n return config;\n };\n\n _proto._getScrollTop = function _getScrollTop() {\n return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n };\n\n _proto._getScrollHeight = function _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n };\n\n _proto._getOffsetHeight = function _getOffsetHeight() {\n return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n };\n\n _proto._process = function _process() {\n var scrollTop = this._getScrollTop() + this._config.offset;\n\n var scrollHeight = this._getScrollHeight();\n\n var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh();\n }\n\n if (scrollTop >= maxScroll) {\n var target = this._targets[this._targets.length - 1];\n\n if (this._activeTarget !== target) {\n this._activate(target);\n }\n\n return;\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null;\n\n this._clear();\n\n return;\n }\n\n var offsetLength = this._offsets.length;\n\n for (var i = offsetLength; i--;) {\n var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n if (isActiveTarget) {\n this._activate(this._targets[i]);\n }\n }\n };\n\n _proto._activate = function _activate(target) {\n this._activeTarget = target;\n\n this._clear();\n\n var queries = this._selector.split(','); // eslint-disable-next-line arrow-body-style\n\n\n queries = queries.map(function (selector) {\n return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + (selector + \"[href=\\\"\" + target + \"\\\"]\");\n });\n var $link = $$$1([].slice.call(document.querySelectorAll(queries.join(','))));\n\n if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);\n $link.addClass(ClassName.ACTIVE);\n } else {\n // Set triggered link as active\n $link.addClass(ClassName.ACTIVE); // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_LINKS + \", \" + Selector.LIST_ITEMS).addClass(ClassName.ACTIVE); // Handle special case when .nav-link is inside .nav-item\n\n $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);\n }\n\n $$$1(this._scrollElement).trigger(Event.ACTIVATE, {\n relatedTarget: target\n });\n };\n\n _proto._clear = function _clear() {\n var nodes = [].slice.call(document.querySelectorAll(this._selector));\n $$$1(nodes).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);\n }; // Static\n\n\n ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $$$1(this).data(DATA_KEY);\n\n var _config = typeof config === 'object' && config;\n\n if (!data) {\n data = new ScrollSpy(this, _config);\n $$$1(this).data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(ScrollSpy, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }]);\n\n return ScrollSpy;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(window).on(Event.LOAD_DATA_API, function () {\n var scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY));\n var scrollSpysLength = scrollSpys.length;\n\n for (var i = scrollSpysLength; i--;) {\n var $spy = $$$1(scrollSpys[i]);\n\n ScrollSpy._jQueryInterface.call($spy, $spy.data());\n }\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = ScrollSpy._jQueryInterface;\n $$$1.fn[NAME].Constructor = ScrollSpy;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return ScrollSpy._jQueryInterface;\n };\n\n return ScrollSpy;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Tab = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'tab';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.tab';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var Event = {\n HIDE: \"hide\" + EVENT_KEY,\n HIDDEN: \"hidden\" + EVENT_KEY,\n SHOW: \"show\" + EVENT_KEY,\n SHOWN: \"shown\" + EVENT_KEY,\n CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n };\n var ClassName = {\n DROPDOWN_MENU: 'dropdown-menu',\n ACTIVE: 'active',\n DISABLED: 'disabled',\n FADE: 'fade',\n SHOW: 'show'\n };\n var Selector = {\n DROPDOWN: '.dropdown',\n NAV_LIST_GROUP: '.nav, .list-group',\n ACTIVE: '.active',\n ACTIVE_UL: '> li > .active',\n DATA_TOGGLE: '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n DROPDOWN_TOGGLE: '.dropdown-toggle',\n DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Tab =\n /*#__PURE__*/\n function () {\n function Tab(element) {\n this._element = element;\n } // Getters\n\n\n var _proto = Tab.prototype;\n\n // Public\n _proto.show = function show() {\n var _this = this;\n\n if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $$$1(this._element).hasClass(ClassName.ACTIVE) || $$$1(this._element).hasClass(ClassName.DISABLED)) {\n return;\n }\n\n var target;\n var previous;\n var listElement = $$$1(this._element).closest(Selector.NAV_LIST_GROUP)[0];\n var selector = Util.getSelectorFromElement(this._element);\n\n if (listElement) {\n var itemSelector = listElement.nodeName === 'UL' ? Selector.ACTIVE_UL : Selector.ACTIVE;\n previous = $$$1.makeArray($$$1(listElement).find(itemSelector));\n previous = previous[previous.length - 1];\n }\n\n var hideEvent = $$$1.Event(Event.HIDE, {\n relatedTarget: this._element\n });\n var showEvent = $$$1.Event(Event.SHOW, {\n relatedTarget: previous\n });\n\n if (previous) {\n $$$1(previous).trigger(hideEvent);\n }\n\n $$$1(this._element).trigger(showEvent);\n\n if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n return;\n }\n\n if (selector) {\n target = document.querySelector(selector);\n }\n\n this._activate(this._element, listElement);\n\n var complete = function complete() {\n var hiddenEvent = $$$1.Event(Event.HIDDEN, {\n relatedTarget: _this._element\n });\n var shownEvent = $$$1.Event(Event.SHOWN, {\n relatedTarget: previous\n });\n $$$1(previous).trigger(hiddenEvent);\n $$$1(_this._element).trigger(shownEvent);\n };\n\n if (target) {\n this._activate(target, target.parentNode, complete);\n } else {\n complete();\n }\n };\n\n _proto.dispose = function dispose() {\n $$$1.removeData(this._element, DATA_KEY);\n this._element = null;\n }; // Private\n\n\n _proto._activate = function _activate(element, container, callback) {\n var _this2 = this;\n\n var activeElements;\n\n if (container.nodeName === 'UL') {\n activeElements = $$$1(container).find(Selector.ACTIVE_UL);\n } else {\n activeElements = $$$1(container).children(Selector.ACTIVE);\n }\n\n var active = activeElements[0];\n var isTransitioning = callback && active && $$$1(active).hasClass(ClassName.FADE);\n\n var complete = function complete() {\n return _this2._transitionComplete(element, active, callback);\n };\n\n if (active && isTransitioning) {\n var transitionDuration = Util.getTransitionDurationFromElement(active);\n $$$1(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n } else {\n complete();\n }\n };\n\n _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n if (active) {\n $$$1(active).removeClass(ClassName.SHOW + \" \" + ClassName.ACTIVE);\n var dropdownChild = $$$1(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];\n\n if (dropdownChild) {\n $$$1(dropdownChild).removeClass(ClassName.ACTIVE);\n }\n\n if (active.getAttribute('role') === 'tab') {\n active.setAttribute('aria-selected', false);\n }\n }\n\n $$$1(element).addClass(ClassName.ACTIVE);\n\n if (element.getAttribute('role') === 'tab') {\n element.setAttribute('aria-selected', true);\n }\n\n Util.reflow(element);\n $$$1(element).addClass(ClassName.SHOW);\n\n if (element.parentNode && $$$1(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\n var dropdownElement = $$$1(element).closest(Selector.DROPDOWN)[0];\n\n if (dropdownElement) {\n var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE));\n $$$1(dropdownToggleList).addClass(ClassName.ACTIVE);\n }\n\n element.setAttribute('aria-expanded', true);\n }\n\n if (callback) {\n callback();\n }\n }; // Static\n\n\n Tab._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var $this = $$$1(this);\n var data = $this.data(DATA_KEY);\n\n if (!data) {\n data = new Tab(this);\n $this.data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(Tab, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }]);\n\n return Tab;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault();\n\n Tab._jQueryInterface.call($$$1(this), 'show');\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = Tab._jQueryInterface;\n $$$1.fn[NAME].Constructor = Tab;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Tab._jQueryInterface;\n };\n\n return Tab;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n (function ($$$1) {\n if (typeof $$$1 === 'undefined') {\n throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n }\n\n var version = $$$1.fn.jquery.split(' ')[0].split('.');\n var minMajor = 1;\n var ltMajor = 2;\n var minMinor = 9;\n var minPatch = 1;\n var maxMajor = 4;\n\n if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n }\n })($);\n\n exports.Util = Util;\n exports.Alert = Alert;\n exports.Button = Button;\n exports.Carousel = Carousel;\n exports.Collapse = Collapse;\n exports.Dropdown = Dropdown;\n exports.Modal = Modal;\n exports.Popover = Popover;\n exports.Scrollspy = ScrollSpy;\n exports.Tab = Tab;\n exports.Tooltip = Tooltip;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=bootstrap.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2Rpc3QvanMvYm9vdHN0cmFwLmpzPzJiNzIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxDQUFDLHFDQUFxQzs7QUFFdEM7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixrQkFBa0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFO0FBQ2xFOztBQUVBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQsU0FBUzs7QUFFVDtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQSxxRUFBcUU7O0FBRXJFO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQzs7QUFFaEMsaUNBQWlDOztBQUVqQyxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPOzs7QUFHUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWU7QUFDZixhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBOztBQUVBLHdDQUF3Qzs7QUFFeEM7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUEsNkNBQTZDLFNBQVM7QUFDdEQ7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdEQUFnRCxTQUFTO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBOztBQUVBO0FB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UjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSw2Q0FBNkMsU0FBUztBQUN0RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdHQUFnRzs7QUFFaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsRUFBRTs7QUFFWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUyxFQUFFOztBQUVYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDLGdGQUFnRjs7QUFFeEg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDRFQUE0RTs7QUFFNUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTzs7QUFFUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87OztBQUdQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTOztBQUVUO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUMseUdBQXlHOztBQUUxSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUwsc0NBQXNDO0FBQ3RDO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhDQUE4Qzs7QUFFOUM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBLE9BQU87OztBQUdQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBLGlDQUFpQyw2REFBNkQ7O0FBRTlGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsa0NBQWtDLEtBQUs7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLGdEQUFnRDs7O0FBR2hEO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsMkNBQTJDO0FBQzNDOztBQUVBLGtJQUFrSTs7QUFFbEk7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0MsS0FBSztBQUN6Qzs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnREFBZ0QsY0FBYzs7QUFFOUQsQ0FBQztBQUNEIiwiZmlsZSI6IjUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAgKiBCb290c3RyYXAgdjQuMS4yIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMTggVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdqcXVlcnknKSwgcmVxdWlyZSgncG9wcGVyLmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdqcXVlcnknLCAncG9wcGVyLmpzJ10sIGZhY3RvcnkpIDpcbiAgKGZhY3RvcnkoKGdsb2JhbC5ib290c3RyYXAgPSB7fSksZ2xvYmFsLmpRdWVyeSxnbG9iYWwuUG9wcGVyKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cywkLFBvcHBlcikgeyAndXNlIHN0cmljdCc7XG5cbiAgJCA9ICQgJiYgJC5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdCcpID8gJFsnZGVmYXVsdCddIDogJDtcbiAgUG9wcGVyID0gUG9wcGVyICYmIFBvcHBlci5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdCcpID8gUG9wcGVyWydkZWZhdWx0J10gOiBQb3BwZXI7XG5cbiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9XG5cbiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgICB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG5cbiAgICAgIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcbiAgICBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuMS4yKTogdXRpbC5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgVXRpbCA9IGZ1bmN0aW9uICgkJCQxKSB7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogUHJpdmF0ZSBUcmFuc2l0aW9uRW5kIEhlbHBlcnNcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cbiAgICB2YXIgVFJBTlNJVElPTl9FTkQgPSAndHJhbnNpdGlvbmVuZCc7XG4gICAgdmFyIE1BWF9VSUQgPSAxMDAwMDAwO1xuICAgIHZhciBNSUxMSVNFQ09ORFNfTVVMVElQTElFUiA9IDEwMDA7IC8vIFNob3V0b3V0IEFuZ3VzQ3JvbGwgKGh0dHBzOi8vZ29vLmdsL3B4d1FHcClcblxuICAgIGZ1bmN0aW9uIHRvVHlwZShvYmopIHtcbiAgICAgIHJldHVybiB7fS50b1N0cmluZy5jYWxsKG9iaikubWF0Y2goL1xccyhbYS16XSspL2kpWzFdLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U3BlY2lhbFRyYW5zaXRpb25FbmRFdmVudCgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJpbmRUeXBlOiBUUkFOU0lUSU9OX0VORCxcbiAgICAgICAgZGVsZWdhdGVUeXBlOiBUUkFOU0lUSU9OX0VORCxcbiAgICAgICAgaGFuZGxlOiBmdW5jdGlvbiBoYW5kbGUoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoJCQkMShldmVudC50YXJnZXQpLmlzKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnQuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25FbmRFbXVsYXRvcihkdXJhdGlvbikge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICAgICAgJCQkMSh0aGlzKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgICBVdGlsLnRyaWdnZXJUcmFuc2l0aW9uRW5kKF90aGlzKTtcbiAgICAgICAgfVxuICAgICAgfSwgZHVyYXRpb24pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0VHJhbnNpdGlvbkVuZFN1cHBvcnQoKSB7XG4gICAgICAkJCQxLmZuLmVtdWxhdGVUcmFuc2l0aW9uRW5kID0gdHJhbnNpdGlvbkVuZEVtdWxhdG9yO1xuICAgICAgJCQkMS5ldmVudC5zcGVjaWFsW1V0aWwuVFJBTlNJVElPTl9FTkRdID0gZ2V0U3BlY2lhbFRyYW5zaXRpb25FbmRFdmVudCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIFB1YmxpYyBVdGlsIEFwaVxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG5cblxuICAgIHZhciBVdGlsID0ge1xuICAgICAgVFJBTlNJVElPTl9FTkQ6ICdic1RyYW5zaXRpb25FbmQnLFxuICAgICAgZ2V0VUlEOiBmdW5jdGlvbiBnZXRVSUQocHJlZml4KSB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgICAgICAgIHByZWZpeCArPSB+fihNYXRoLnJhbmRvbSgpICogTUFYX1VJRCk7IC8vIFwifn5cIiBhY3RzIGxpa2UgYSBmYXN0ZXIgTWF0aC5mbG9vcigpIGhlcmVcbiAgICAgICAgfSB3aGlsZSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHJlZml4KSk7XG5cbiAgICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICAgIH0sXG4gICAgICBnZXRTZWxlY3RvckZyb21FbGVtZW50OiBmdW5jdGlvbiBnZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGFyZ2V0Jyk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gJyMnKSB7XG4gICAgICAgICAgc2VsZWN0b3IgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpIHx8ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgPyBzZWxlY3RvciA6IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQ6IGZ1bmN0aW9uIGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0gLy8gR2V0IHRyYW5zaXRpb24tZHVyYXRpb24gb2YgdGhlIGVsZW1lbnRcblxuXG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSAkJCQxKGVsZW1lbnQpLmNzcygndHJhbnNpdGlvbi1kdXJhdGlvbicpO1xuICAgICAgICB2YXIgZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gPSBwYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbik7IC8vIFJldHVybiAwIGlmIGVsZW1lbnQgb3IgdHJhbnNpdGlvbiBkdXJhdGlvbiBpcyBub3QgZm91bmRcblxuICAgICAgICBpZiAoIWZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0gLy8gSWYgbXVsdGlwbGUgZHVyYXRpb25zIGFyZSBkZWZpbmVkLCB0YWtlIHRoZSBmaXJzdFxuXG5cbiAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uLnNwbGl0KCcsJylbMF07XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbikgKiBNSUxMSVNFQ09ORFNfTVVMVElQTElFUjtcbiAgICAgIH0sXG4gICAgICByZWZsb3c6IGZ1bmN0aW9uIHJlZmxvdyhlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgIH0sXG4gICAgICB0cmlnZ2VyVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24gdHJpZ2dlclRyYW5zaXRpb25FbmQoZWxlbWVudCkge1xuICAgICAgICAkJCQxKGVsZW1lbnQpLnRyaWdnZXIoVFJBTlNJVElPTl9FTkQpO1xuICAgICAgfSxcbiAgICAgIC8vIFRPRE86IFJlbW92ZSBpbiB2NVxuICAgICAgc3VwcG9ydHNUcmFuc2l0aW9uRW5kOiBmdW5jdGlvbiBzdXBwb3J0c1RyYW5zaXRpb25FbmQoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKFRSQU5TSVRJT05fRU5EKTtcbiAgICAgIH0sXG4gICAgICBpc0VsZW1lbnQ6IGZ1bmN0aW9uIGlzRWxlbWVudChvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmpbMF0gfHwgb2JqKS5ub2RlVHlwZTtcbiAgICAgIH0sXG4gICAgICB0eXBlQ2hlY2tDb25maWc6IGZ1bmN0aW9uIHR5cGVDaGVja0NvbmZpZyhjb21wb25lbnROYW1lLCBjb25maWcsIGNvbmZpZ1R5cGVzKSB7XG4gICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGNvbmZpZ1R5cGVzKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWdUeXBlcywgcHJvcGVydHkpKSB7XG4gICAgICAgICAgICB2YXIgZXhwZWN0ZWRUeXBlcyA9IGNvbmZpZ1R5cGVzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbmZpZ1twcm9wZXJ0eV07XG4gICAgICAgICAgICB2YXIgdmFsdWVUeXBlID0gdmFsdWUgJiYgVXRpbC5pc0VsZW1lbnQodmFsdWUpID8gJ2VsZW1lbnQnIDogdG9UeXBlKHZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKCFuZXcgUmVnRXhwKGV4cGVjdGVkVHlwZXMpLnRlc3QodmFsdWVUeXBlKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY29tcG9uZW50TmFtZS50b1VwcGVyQ2FzZSgpICsgXCI6IFwiICsgKFwiT3B0aW9uIFxcXCJcIiArIHByb3BlcnR5ICsgXCJcXFwiIHByb3ZpZGVkIHR5cGUgXFxcIlwiICsgdmFsdWVUeXBlICsgXCJcXFwiIFwiKSArIChcImJ1dCBleHBlY3RlZCB0eXBlIFxcXCJcIiArIGV4cGVjdGVkVHlwZXMgKyBcIlxcXCIuXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHNldFRyYW5zaXRpb25FbmRTdXBwb3J0KCk7XG4gICAgcmV0dXJuIFV0aWw7XG4gIH0oJCk7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuMS4yKTogYWxlcnQuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIEFsZXJ0ID0gZnVuY3Rpb24gKCQkJDEpIHtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBDb25zdGFudHNcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cbiAgICB2YXIgTkFNRSA9ICdhbGVydCc7XG4gICAgdmFyIFZFUlNJT04gPSAnNC4xLjInO1xuICAgIHZhciBEQVRBX0tFWSA9ICdicy5hbGVydCc7XG4gICAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gICAgdmFyIERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknO1xuICAgIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkJCQxLmZuW05BTUVdO1xuICAgIHZhciBTZWxlY3RvciA9IHtcbiAgICAgIERJU01JU1M6ICdbZGF0YS1kaXNtaXNzPVwiYWxlcnRcIl0nXG4gICAgfTtcbiAgICB2YXIgRXZlbnQgPSB7XG4gICAgICBDTE9TRTogXCJjbG9zZVwiICsgRVZFTlRfS0VZLFxuICAgICAgQ0xPU0VEOiBcImNsb3NlZFwiICsgRVZFTlRfS0VZLFxuICAgICAgQ0xJQ0tfREFUQV9BUEk6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWVxuICAgIH07XG4gICAgdmFyIENsYXNzTmFtZSA9IHtcbiAgICAgIEFMRVJUOiAnYWxlcnQnLFxuICAgICAgRkFERTogJ2ZhZGUnLFxuICAgICAgU0hPVzogJ3Nob3cnXG4gICAgICAvKipcbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgKi9cblxuICAgIH07XG5cbiAgICB2YXIgQWxlcnQgPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBBbGVydChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgICAgdmFyIF9wcm90byA9IEFsZXJ0LnByb3RvdHlwZTtcblxuICAgICAgLy8gUHVibGljXG4gICAgICBfcHJvdG8uY2xvc2UgPSBmdW5jdGlvbiBjbG9zZShlbGVtZW50KSB7XG4gICAgICAgIHZhciByb290RWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICByb290RWxlbWVudCA9IHRoaXMuX2dldFJvb3RFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGN1c3RvbUV2ZW50ID0gdGhpcy5fdHJpZ2dlckNsb3NlRXZlbnQocm9vdEVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChjdXN0b21FdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JlbW92ZUVsZW1lbnQocm9vdEVsZW1lbnQpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICAkJCQxLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgIH07IC8vIFByaXZhdGVcblxuXG4gICAgICBfcHJvdG8uX2dldFJvb3RFbGVtZW50ID0gZnVuY3Rpb24gX2dldFJvb3RFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB2YXIgcGFyZW50ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgIHBhcmVudCA9ICQkJDEoZWxlbWVudCkuY2xvc2VzdChcIi5cIiArIENsYXNzTmFtZS5BTEVSVClbMF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl90cmlnZ2VyQ2xvc2VFdmVudCA9IGZ1bmN0aW9uIF90cmlnZ2VyQ2xvc2VFdmVudChlbGVtZW50KSB7XG4gICAgICAgIHZhciBjbG9zZUV2ZW50ID0gJCQkMS5FdmVudChFdmVudC5DTE9TRSk7XG4gICAgICAgICQkJDEoZWxlbWVudCkudHJpZ2dlcihjbG9zZUV2ZW50KTtcbiAgICAgICAgcmV0dXJuIGNsb3NlRXZlbnQ7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX3JlbW92ZUVsZW1lbnQgPSBmdW5jdGlvbiBfcmVtb3ZlRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgJCQkMShlbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG5cbiAgICAgICAgaWYgKCEkJCQxKGVsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKSkge1xuICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICQkJDEoZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5fZGVzdHJveUVsZW1lbnQoZWxlbWVudCwgZXZlbnQpO1xuICAgICAgICB9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9kZXN0cm95RWxlbWVudCA9IGZ1bmN0aW9uIF9kZXN0cm95RWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgICQkJDEoZWxlbWVudCkuZGV0YWNoKCkudHJpZ2dlcihFdmVudC5DTE9TRUQpLnJlbW92ZSgpO1xuICAgICAgfTsgLy8gU3RhdGljXG5cblxuICAgICAgQWxlcnQuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAkZWxlbWVudCA9ICQkJDEodGhpcyk7XG4gICAgICAgICAgdmFyIGRhdGEgPSAkZWxlbWVudC5kYXRhKERBVEFfS0VZKTtcblxuICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgZGF0YSA9IG5ldyBBbGVydCh0aGlzKTtcbiAgICAgICAgICAgICRlbGVtZW50LmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb25maWcgPT09ICdjbG9zZScpIHtcbiAgICAgICAgICAgIGRhdGFbY29uZmlnXSh0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgQWxlcnQuX2hhbmRsZURpc21pc3MgPSBmdW5jdGlvbiBfaGFuZGxlRGlzbWlzcyhhbGVydEluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWxlcnRJbnN0YW5jZS5jbG9zZSh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgIH07XG5cbiAgICAgIF9jcmVhdGVDbGFzcyhBbGVydCwgbnVsbCwgW3tcbiAgICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIFZFUlNJT047XG4gICAgICAgIH1cbiAgICAgIH1dKTtcblxuICAgICAgcmV0dXJuIEFsZXJ0O1xuICAgIH0oKTtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG5cbiAgICAkJCQxKGRvY3VtZW50KS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuRElTTUlTUywgQWxlcnQuX2hhbmRsZURpc21pc3MobmV3IEFsZXJ0KCkpKTtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBqUXVlcnlcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuICAgICQkJDEuZm5bTkFNRV0gPSBBbGVydC5falF1ZXJ5SW50ZXJmYWNlO1xuICAgICQkJDEuZm5bTkFNRV0uQ29uc3RydWN0b3IgPSBBbGVydDtcblxuICAgICQkJDEuZm5bTkFNRV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICQkJDEuZm5bTkFNRV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgICByZXR1cm4gQWxlcnQuX2pRdWVyeUludGVyZmFjZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEFsZXJ0O1xuICB9KCQpO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgKHY0LjEuMik6IGJ1dHRvbi5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgQnV0dG9uID0gZnVuY3Rpb24gKCQkJDEpIHtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBDb25zdGFudHNcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cbiAgICB2YXIgTkFNRSA9ICdidXR0b24nO1xuICAgIHZhciBWRVJTSU9OID0gJzQuMS4yJztcbiAgICB2YXIgREFUQV9LRVkgPSAnYnMuYnV0dG9uJztcbiAgICB2YXIgRVZFTlRfS0VZID0gXCIuXCIgKyBEQVRBX0tFWTtcbiAgICB2YXIgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSc7XG4gICAgdmFyIEpRVUVSWV9OT19DT05GTElDVCA9ICQkJDEuZm5bTkFNRV07XG4gICAgdmFyIENsYXNzTmFtZSA9IHtcbiAgICAgIEFDVElWRTogJ2FjdGl2ZScsXG4gICAgICBCVVRUT046ICdidG4nLFxuICAgICAgRk9DVVM6ICdmb2N1cydcbiAgICB9O1xuICAgIHZhciBTZWxlY3RvciA9IHtcbiAgICAgIERBVEFfVE9HR0xFX0NBUlJPVDogJ1tkYXRhLXRvZ2dsZV49XCJidXR0b25cIl0nLFxuICAgICAgREFUQV9UT0dHTEU6ICdbZGF0YS10b2dnbGU9XCJidXR0b25zXCJdJyxcbiAgICAgIElOUFVUOiAnaW5wdXQnLFxuICAgICAgQUNUSVZFOiAnLmFjdGl2ZScsXG4gICAgICBCVVRUT046ICcuYnRuJ1xuICAgIH07XG4gICAgdmFyIEV2ZW50ID0ge1xuICAgICAgQ0xJQ0tfREFUQV9BUEk6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWSxcbiAgICAgIEZPQ1VTX0JMVVJfREFUQV9BUEk6IFwiZm9jdXNcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWSArIFwiIFwiICsgKFwiYmx1clwiICsgRVZFTlRfS0VZICsgREFUQV9BUElfS0VZKVxuICAgICAgLyoqXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAqIENsYXNzIERlZmluaXRpb25cbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICovXG5cbiAgICB9O1xuXG4gICAgdmFyIEJ1dHRvbiA9XG4gICAgLyojX19QVVJFX18qL1xuICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIEJ1dHRvbihlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgICAgdmFyIF9wcm90byA9IEJ1dHRvbi5wcm90b3R5cGU7XG5cbiAgICAgIC8vIFB1YmxpY1xuICAgICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgICAgdmFyIHRyaWdnZXJDaGFuZ2VFdmVudCA9IHRydWU7XG4gICAgICAgIHZhciBhZGRBcmlhUHJlc3NlZCA9IHRydWU7XG4gICAgICAgIHZhciByb290RWxlbWVudCA9ICQkJDEodGhpcy5fZWxlbWVudCkuY2xvc2VzdChTZWxlY3Rvci5EQVRBX1RPR0dMRSlbMF07XG5cbiAgICAgICAgaWYgKHJvb3RFbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGlucHV0ID0gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNlbGVjdG9yLklOUFVUKTtcblxuICAgICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICAgICAgaWYgKGlucHV0LmNoZWNrZWQgJiYgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ2xhc3NOYW1lLkFDVElWRSkpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyQ2hhbmdlRXZlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgYWN0aXZlRWxlbWVudCA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU2VsZWN0b3IuQUNUSVZFKTtcblxuICAgICAgICAgICAgICAgIGlmIChhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAkJCQxKGFjdGl2ZUVsZW1lbnQpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgICAgIGlmIChpbnB1dC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHwgcm9vdEVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpIHx8IGlucHV0LmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSB8fCByb290RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gIXRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgICAgICAgICAkJCQxKGlucHV0KS50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICAgIGFkZEFyaWFQcmVzc2VkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFkZEFyaWFQcmVzc2VkKSB7XG4gICAgICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDbGFzc05hbWUuQUNUSVZFKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJpZ2dlckNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS50b2dnbGVDbGFzcyhDbGFzc05hbWUuQUNUSVZFKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICAkJCQxLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgIH07IC8vIFN0YXRpY1xuXG5cbiAgICAgIEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0gbmV3IEJ1dHRvbih0aGlzKTtcbiAgICAgICAgICAgICQkJDEodGhpcykuZGF0YShEQVRBX0tFWSwgZGF0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvbmZpZyA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBfY3JlYXRlQ2xhc3MoQnV0dG9uLCBudWxsLCBbe1xuICAgICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gVkVSU0lPTjtcbiAgICAgICAgfVxuICAgICAgfV0pO1xuXG4gICAgICByZXR1cm4gQnV0dG9uO1xuICAgIH0oKTtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG5cbiAgICAkJCQxKGRvY3VtZW50KS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuREFUQV9UT0dHTEVfQ0FSUk9ULCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2YXIgYnV0dG9uID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICBpZiAoISQkJDEoYnV0dG9uKS5oYXNDbGFzcyhDbGFzc05hbWUuQlVUVE9OKSkge1xuICAgICAgICBidXR0b24gPSAkJCQxKGJ1dHRvbikuY2xvc2VzdChTZWxlY3Rvci5CVVRUT04pO1xuICAgICAgfVxuXG4gICAgICBCdXR0b24uX2pRdWVyeUludGVyZmFjZS5jYWxsKCQkJDEoYnV0dG9uKSwgJ3RvZ2dsZScpO1xuICAgIH0pLm9uKEV2ZW50LkZPQ1VTX0JMVVJfREFUQV9BUEksIFNlbGVjdG9yLkRBVEFfVE9HR0xFX0NBUlJPVCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgYnV0dG9uID0gJCQkMShldmVudC50YXJnZXQpLmNsb3Nlc3QoU2VsZWN0b3IuQlVUVE9OKVswXTtcbiAgICAgICQkJDEoYnV0dG9uKS50b2dnbGVDbGFzcyhDbGFzc05hbWUuRk9DVVMsIC9eZm9jdXMoaW4pPyQvLnRlc3QoZXZlbnQudHlwZSkpO1xuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIGpRdWVyeVxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG4gICAgJCQkMS5mbltOQU1FXSA9IEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlO1xuICAgICQkJDEuZm5bTkFNRV0uQ29uc3RydWN0b3IgPSBCdXR0b247XG5cbiAgICAkJCQxLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAkJCQxLmZuW05BTUVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgICAgcmV0dXJuIEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlO1xuICAgIH07XG5cbiAgICByZXR1cm4gQnV0dG9uO1xuICB9KCQpO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgKHY0LjEuMik6IGNhcm91c2VsLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBDYXJvdXNlbCA9IGZ1bmN0aW9uICgkJCQxKSB7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogQ29uc3RhbnRzXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG4gICAgdmFyIE5BTUUgPSAnY2Fyb3VzZWwnO1xuICAgIHZhciBWRVJTSU9OID0gJzQuMS4yJztcbiAgICB2YXIgREFUQV9LRVkgPSAnYnMuY2Fyb3VzZWwnO1xuICAgIHZhciBFVkVOVF9LRVkgPSBcIi5cIiArIERBVEFfS0VZO1xuICAgIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUID0gJCQkMS5mbltOQU1FXTtcbiAgICB2YXIgQVJST1dfTEVGVF9LRVlDT0RFID0gMzc7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIGxlZnQgYXJyb3cga2V5XG5cbiAgICB2YXIgQVJST1dfUklHSFRfS0VZQ09ERSA9IDM5OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciByaWdodCBhcnJvdyBrZXlcblxuICAgIHZhciBUT1VDSEVWRU5UX0NPTVBBVF9XQUlUID0gNTAwOyAvLyBUaW1lIGZvciBtb3VzZSBjb21wYXQgZXZlbnRzIHRvIGZpcmUgYWZ0ZXIgdG91Y2hcblxuICAgIHZhciBEZWZhdWx0ID0ge1xuICAgICAgaW50ZXJ2YWw6IDUwMDAsXG4gICAgICBrZXlib2FyZDogdHJ1ZSxcbiAgICAgIHNsaWRlOiBmYWxzZSxcbiAgICAgIHBhdXNlOiAnaG92ZXInLFxuICAgICAgd3JhcDogdHJ1ZVxuICAgIH07XG4gICAgdmFyIERlZmF1bHRUeXBlID0ge1xuICAgICAgaW50ZXJ2YWw6ICcobnVtYmVyfGJvb2xlYW4pJyxcbiAgICAgIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gICAgICBzbGlkZTogJyhib29sZWFufHN0cmluZyknLFxuICAgICAgcGF1c2U6ICcoc3RyaW5nfGJvb2xlYW4pJyxcbiAgICAgIHdyYXA6ICdib29sZWFuJ1xuICAgIH07XG4gICAgdmFyIERpcmVjdGlvbiA9IHtcbiAgICAgIE5FWFQ6ICduZXh0JyxcbiAgICAgIFBSRVY6ICdwcmV2JyxcbiAgICAgIExFRlQ6ICdsZWZ0JyxcbiAgICAgIFJJR0hUOiAncmlnaHQnXG4gICAgfTtcbiAgICB2YXIgRXZlbnQgPSB7XG4gICAgICBTTElERTogXCJzbGlkZVwiICsgRVZFTlRfS0VZLFxuICAgICAgU0xJRDogXCJzbGlkXCIgKyBFVkVOVF9LRVksXG4gICAgICBLRVlET1dOOiBcImtleWRvd25cIiArIEVWRU5UX0tFWSxcbiAgICAgIE1PVVNFRU5URVI6IFwibW91c2VlbnRlclwiICsgRVZFTlRfS0VZLFxuICAgICAgTU9VU0VMRUFWRTogXCJtb3VzZWxlYXZlXCIgKyBFVkVOVF9LRVksXG4gICAgICBUT1VDSEVORDogXCJ0b3VjaGVuZFwiICsgRVZFTlRfS0VZLFxuICAgICAgTE9BRF9EQVRBX0FQSTogXCJsb2FkXCIgKyBFVkVOVF9LRVkgKyBEQVRBX0FQSV9LRVksXG4gICAgICBDTElDS19EQVRBX0FQSTogXCJjbGlja1wiICsgRVZFTlRfS0VZICsgREFUQV9BUElfS0VZXG4gICAgfTtcbiAgICB2YXIgQ2xhc3NOYW1lID0ge1xuICAgICAgQ0FST1VTRUw6ICdjYXJvdXNlbCcsXG4gICAgICBBQ1RJVkU6ICdhY3RpdmUnLFxuICAgICAgU0xJREU6ICdzbGlkZScsXG4gICAgICBSSUdIVDogJ2Nhcm91c2VsLWl0ZW0tcmlnaHQnLFxuICAgICAgTEVGVDogJ2Nhcm91c2VsLWl0ZW0tbGVmdCcsXG4gICAgICBORVhUOiAnY2Fyb3VzZWwtaXRlbS1uZXh0JyxcbiAgICAgIFBSRVY6ICdjYXJvdXNlbC1pdGVtLXByZXYnLFxuICAgICAgSVRFTTogJ2Nhcm91c2VsLWl0ZW0nXG4gICAgfTtcbiAgICB2YXIgU2VsZWN0b3IgPSB7XG4gICAgICBBQ1RJVkU6ICcuYWN0aXZlJyxcbiAgICAgIEFDVElWRV9JVEVNOiAnLmFjdGl2ZS5jYXJvdXNlbC1pdGVtJyxcbiAgICAgIElURU06ICcuY2Fyb3VzZWwtaXRlbScsXG4gICAgICBORVhUX1BSRVY6ICcuY2Fyb3VzZWwtaXRlbS1uZXh0LCAuY2Fyb3VzZWwtaXRlbS1wcmV2JyxcbiAgICAgIElORElDQVRPUlM6ICcuY2Fyb3VzZWwtaW5kaWNhdG9ycycsXG4gICAgICBEQVRBX1NMSURFOiAnW2RhdGEtc2xpZGVdLCBbZGF0YS1zbGlkZS10b10nLFxuICAgICAgREFUQV9SSURFOiAnW2RhdGEtcmlkZT1cImNhcm91c2VsXCJdJ1xuICAgICAgLyoqXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAqIENsYXNzIERlZmluaXRpb25cbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICovXG5cbiAgICB9O1xuXG4gICAgdmFyIENhcm91c2VsID1cbiAgICAvKiNfX1BVUkVfXyovXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gQ2Fyb3VzZWwoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zID0gbnVsbDtcbiAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5faXNQYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG91Y2hUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSAkJCQxKGVsZW1lbnQpWzBdO1xuICAgICAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihTZWxlY3Rvci5JTkRJQ0FUT1JTKTtcblxuICAgICAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpO1xuICAgICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgICAgdmFyIF9wcm90byA9IENhcm91c2VsLnByb3RvdHlwZTtcblxuICAgICAgLy8gUHVibGljXG4gICAgICBfcHJvdG8ubmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICAgICAgdGhpcy5fc2xpZGUoRGlyZWN0aW9uLk5FWFQpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8ubmV4dFdoZW5WaXNpYmxlID0gZnVuY3Rpb24gbmV4dFdoZW5WaXNpYmxlKCkge1xuICAgICAgICAvLyBEb24ndCBjYWxsIG5leHQgd2hlbiB0aGUgcGFnZSBpc24ndCB2aXNpYmxlXG4gICAgICAgIC8vIG9yIHRoZSBjYXJvdXNlbCBvciBpdHMgcGFyZW50IGlzbid0IHZpc2libGVcbiAgICAgICAgaWYgKCFkb2N1bWVudC5oaWRkZW4gJiYgJCQkMSh0aGlzLl9lbGVtZW50KS5pcygnOnZpc2libGUnKSAmJiAkJCQxKHRoaXMuX2VsZW1lbnQpLmNzcygndmlzaWJpbGl0eScpICE9PSAnaGlkZGVuJykge1xuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8ucHJldiA9IGZ1bmN0aW9uIHByZXYoKSB7XG4gICAgICAgIGlmICghdGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICAgICAgdGhpcy5fc2xpZGUoRGlyZWN0aW9uLlBSRVYpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8ucGF1c2UgPSBmdW5jdGlvbiBwYXVzZShldmVudCkge1xuICAgICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5faXNQYXVzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihTZWxlY3Rvci5ORVhUX1BSRVYpKSB7XG4gICAgICAgICAgVXRpbC50cmlnZ2VyVHJhbnNpdGlvbkVuZCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgICB0aGlzLmN5Y2xlKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCk7XG4gICAgICAgIHRoaXMuX2ludGVydmFsID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5jeWNsZSA9IGZ1bmN0aW9uIGN5Y2xlKGV2ZW50KSB7XG4gICAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgICB0aGlzLl9pc1BhdXNlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2ludGVydmFsKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCk7XG4gICAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5pbnRlcnZhbCAmJiAhdGhpcy5faXNQYXVzZWQpIHtcbiAgICAgICAgICB0aGlzLl9pbnRlcnZhbCA9IHNldEludGVydmFsKChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPyB0aGlzLm5leHRXaGVuVmlzaWJsZSA6IHRoaXMubmV4dCkuYmluZCh0aGlzKSwgdGhpcy5fY29uZmlnLmludGVydmFsKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnRvID0gZnVuY3Rpb24gdG8oaW5kZXgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNlbGVjdG9yLkFDVElWRV9JVEVNKTtcblxuICAgICAgICB2YXIgYWN0aXZlSW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgodGhpcy5fYWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgaWYgKGluZGV4ID4gdGhpcy5faXRlbXMubGVuZ3RoIC0gMSB8fCBpbmRleCA8IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS5vbmUoRXZlbnQuU0xJRCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnRvKGluZGV4KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWN0aXZlSW5kZXggPT09IGluZGV4KSB7XG4gICAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgICAgIHRoaXMuY3ljbGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGlyZWN0aW9uID0gaW5kZXggPiBhY3RpdmVJbmRleCA/IERpcmVjdGlvbi5ORVhUIDogRGlyZWN0aW9uLlBSRVY7XG5cbiAgICAgICAgdGhpcy5fc2xpZGUoZGlyZWN0aW9uLCB0aGlzLl9pdGVtc1tpbmRleF0pO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLm9mZihFVkVOVF9LRVkpO1xuICAgICAgICAkJCQxLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgICB0aGlzLl9pdGVtcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2lzUGF1c2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2luZGljYXRvcnNFbGVtZW50ID0gbnVsbDtcbiAgICAgIH07IC8vIFByaXZhdGVcblxuXG4gICAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZyA9IF9vYmplY3RTcHJlYWQoe30sIERlZmF1bHQsIGNvbmZpZyk7XG4gICAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUsIGNvbmZpZywgRGVmYXVsdFR5cGUpO1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9hZGRFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5rZXlib2FyZCkge1xuICAgICAgICAgICQkJDEodGhpcy5fZWxlbWVudCkub24oRXZlbnQuS0VZRE9XTiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9rZXlkb3duKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcucGF1c2UgPT09ICdob3ZlcicpIHtcbiAgICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLm9uKEV2ZW50Lk1PVVNFRU5URVIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5wYXVzZShldmVudCk7XG4gICAgICAgICAgfSkub24oRXZlbnQuTU9VU0VMRUFWRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMyLmN5Y2xlKGV2ZW50KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIElmIGl0J3MgYSB0b3VjaC1lbmFibGVkIGRldmljZSwgbW91c2VlbnRlci9sZWF2ZSBhcmUgZmlyZWQgYXNcbiAgICAgICAgICAgIC8vIHBhcnQgb2YgdGhlIG1vdXNlIGNvbXBhdGliaWxpdHkgZXZlbnRzIG9uIGZpcnN0IHRhcCAtIHRoZSBjYXJvdXNlbFxuICAgICAgICAgICAgLy8gd291bGQgc3RvcCBjeWNsaW5nIHVudGlsIHVzZXIgdGFwcGVkIG91dCBvZiBpdDtcbiAgICAgICAgICAgIC8vIGhlcmUsIHdlIGxpc3RlbiBmb3IgdG91Y2hlbmQsIGV4cGxpY2l0bHkgcGF1c2UgdGhlIGNhcm91c2VsXG4gICAgICAgICAgICAvLyAoYXMgaWYgaXQncyB0aGUgc2Vjb25kIHRpbWUgd2UgdGFwIG9uIGl0LCBtb3VzZWVudGVyIGNvbXBhdCBldmVudFxuICAgICAgICAgICAgLy8gaXMgTk9UIGZpcmVkKSBhbmQgYWZ0ZXIgYSB0aW1lb3V0ICh0byBhbGxvdyBmb3IgbW91c2UgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgLy8gZXZlbnRzIHRvIGZpcmUpIHdlIGV4cGxpY2l0bHkgcmVzdGFydCBjeWNsaW5nXG4gICAgICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLm9uKEV2ZW50LlRPVUNIRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIF90aGlzMi5wYXVzZSgpO1xuXG4gICAgICAgICAgICAgIGlmIChfdGhpczIudG91Y2hUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzMi50b3VjaFRpbWVvdXQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgX3RoaXMyLnRvdWNoVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5jeWNsZShldmVudCk7XG4gICAgICAgICAgICAgIH0sIFRPVUNIRVZFTlRfQ09NUEFUX1dBSVQgKyBfdGhpczIuX2NvbmZpZy5pbnRlcnZhbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fa2V5ZG93biA9IGZ1bmN0aW9uIF9rZXlkb3duKGV2ZW50KSB7XG4gICAgICAgIGlmICgvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcbiAgICAgICAgICBjYXNlIEFSUk9XX0xFRlRfS0VZQ09ERTpcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnByZXYoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBBUlJPV19SSUdIVF9LRVlDT0RFOlxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2dldEl0ZW1JbmRleCA9IGZ1bmN0aW9uIF9nZXRJdGVtSW5kZXgoZWxlbWVudCkge1xuICAgICAgICB0aGlzLl9pdGVtcyA9IGVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnROb2RlID8gW10uc2xpY2UuY2FsbChlbGVtZW50LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbChTZWxlY3Rvci5JVEVNKSkgOiBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmluZGV4T2YoZWxlbWVudCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2dldEl0ZW1CeURpcmVjdGlvbiA9IGZ1bmN0aW9uIF9nZXRJdGVtQnlEaXJlY3Rpb24oZGlyZWN0aW9uLCBhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgIHZhciBpc05leHREaXJlY3Rpb24gPSBkaXJlY3Rpb24gPT09IERpcmVjdGlvbi5ORVhUO1xuICAgICAgICB2YXIgaXNQcmV2RGlyZWN0aW9uID0gZGlyZWN0aW9uID09PSBEaXJlY3Rpb24uUFJFVjtcblxuICAgICAgICB2YXIgYWN0aXZlSW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgoYWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgdmFyIGxhc3RJdGVtSW5kZXggPSB0aGlzLl9pdGVtcy5sZW5ndGggLSAxO1xuICAgICAgICB2YXIgaXNHb2luZ1RvV3JhcCA9IGlzUHJldkRpcmVjdGlvbiAmJiBhY3RpdmVJbmRleCA9PT0gMCB8fCBpc05leHREaXJlY3Rpb24gJiYgYWN0aXZlSW5kZXggPT09IGxhc3RJdGVtSW5kZXg7XG5cbiAgICAgICAgaWYgKGlzR29pbmdUb1dyYXAgJiYgIXRoaXMuX2NvbmZpZy53cmFwKSB7XG4gICAgICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGVsdGEgPSBkaXJlY3Rpb24gPT09IERpcmVjdGlvbi5QUkVWID8gLTEgOiAxO1xuICAgICAgICB2YXIgaXRlbUluZGV4ID0gKGFjdGl2ZUluZGV4ICsgZGVsdGEpICUgdGhpcy5faXRlbXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gaXRlbUluZGV4ID09PSAtMSA/IHRoaXMuX2l0ZW1zW3RoaXMuX2l0ZW1zLmxlbmd0aCAtIDFdIDogdGhpcy5faXRlbXNbaXRlbUluZGV4XTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fdHJpZ2dlclNsaWRlRXZlbnQgPSBmdW5jdGlvbiBfdHJpZ2dlclNsaWRlRXZlbnQocmVsYXRlZFRhcmdldCwgZXZlbnREaXJlY3Rpb25OYW1lKSB7XG4gICAgICAgIHZhciB0YXJnZXRJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleChyZWxhdGVkVGFyZ2V0KTtcblxuICAgICAgICB2YXIgZnJvbUluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihTZWxlY3Rvci5BQ1RJVkVfSVRFTSkpO1xuXG4gICAgICAgIHZhciBzbGlkZUV2ZW50ID0gJCQkMS5FdmVudChFdmVudC5TTElERSwge1xuICAgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRUYXJnZXQsXG4gICAgICAgICAgZGlyZWN0aW9uOiBldmVudERpcmVjdGlvbk5hbWUsXG4gICAgICAgICAgZnJvbTogZnJvbUluZGV4LFxuICAgICAgICAgIHRvOiB0YXJnZXRJbmRleFxuICAgICAgICB9KTtcbiAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNsaWRlRXZlbnQpO1xuICAgICAgICByZXR1cm4gc2xpZGVFdmVudDtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudCA9IGZ1bmN0aW9uIF9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2luZGljYXRvcnNFbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGluZGljYXRvcnMgPSBbXS5zbGljZS5jYWxsKHRoaXMuX2luZGljYXRvcnNFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU2VsZWN0b3IuQUNUSVZFKSk7XG4gICAgICAgICAgJCQkMShpbmRpY2F0b3JzKS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQUNUSVZFKTtcblxuICAgICAgICAgIHZhciBuZXh0SW5kaWNhdG9yID0gdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQuY2hpbGRyZW5bdGhpcy5fZ2V0SXRlbUluZGV4KGVsZW1lbnQpXTtcblxuICAgICAgICAgIGlmIChuZXh0SW5kaWNhdG9yKSB7XG4gICAgICAgICAgICAkJCQxKG5leHRJbmRpY2F0b3IpLmFkZENsYXNzKENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9zbGlkZSA9IGZ1bmN0aW9uIF9zbGlkZShkaXJlY3Rpb24sIGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU2VsZWN0b3IuQUNUSVZFX0lURU0pO1xuXG4gICAgICAgIHZhciBhY3RpdmVFbGVtZW50SW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgoYWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgdmFyIG5leHRFbGVtZW50ID0gZWxlbWVudCB8fCBhY3RpdmVFbGVtZW50ICYmIHRoaXMuX2dldEl0ZW1CeURpcmVjdGlvbihkaXJlY3Rpb24sIGFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgIHZhciBuZXh0RWxlbWVudEluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KG5leHRFbGVtZW50KTtcblxuICAgICAgICB2YXIgaXNDeWNsaW5nID0gQm9vbGVhbih0aGlzLl9pbnRlcnZhbCk7XG4gICAgICAgIHZhciBkaXJlY3Rpb25hbENsYXNzTmFtZTtcbiAgICAgICAgdmFyIG9yZGVyQ2xhc3NOYW1lO1xuICAgICAgICB2YXIgZXZlbnREaXJlY3Rpb25OYW1lO1xuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IERpcmVjdGlvbi5ORVhUKSB7XG4gICAgICAgICAgZGlyZWN0aW9uYWxDbGFzc05hbWUgPSBDbGFzc05hbWUuTEVGVDtcbiAgICAgICAgICBvcmRlckNsYXNzTmFtZSA9IENsYXNzTmFtZS5ORVhUO1xuICAgICAgICAgIGV2ZW50RGlyZWN0aW9uTmFtZSA9IERpcmVjdGlvbi5MRUZUO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpcmVjdGlvbmFsQ2xhc3NOYW1lID0gQ2xhc3NOYW1lLlJJR0hUO1xuICAgICAgICAgIG9yZGVyQ2xhc3NOYW1lID0gQ2xhc3NOYW1lLlBSRVY7XG4gICAgICAgICAgZXZlbnREaXJlY3Rpb25OYW1lID0gRGlyZWN0aW9uLlJJR0hUO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRFbGVtZW50ICYmICQkJDEobmV4dEVsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5BQ1RJVkUpKSB7XG4gICAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNsaWRlRXZlbnQgPSB0aGlzLl90cmlnZ2VyU2xpZGVFdmVudChuZXh0RWxlbWVudCwgZXZlbnREaXJlY3Rpb25OYW1lKTtcblxuICAgICAgICBpZiAoc2xpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCAhbmV4dEVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBTb21lIHdlaXJkbmVzcyBpcyBoYXBwZW5pbmcsIHNvIHdlIGJhaWxcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KG5leHRFbGVtZW50KTtcblxuICAgICAgICB2YXIgc2xpZEV2ZW50ID0gJCQkMS5FdmVudChFdmVudC5TTElELCB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogbmV4dEVsZW1lbnQsXG4gICAgICAgICAgZGlyZWN0aW9uOiBldmVudERpcmVjdGlvbk5hbWUsXG4gICAgICAgICAgZnJvbTogYWN0aXZlRWxlbWVudEluZGV4LFxuICAgICAgICAgIHRvOiBuZXh0RWxlbWVudEluZGV4XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICgkJCQxKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5TTElERSkpIHtcbiAgICAgICAgICAkJCQxKG5leHRFbGVtZW50KS5hZGRDbGFzcyhvcmRlckNsYXNzTmFtZSk7XG4gICAgICAgICAgVXRpbC5yZWZsb3cobmV4dEVsZW1lbnQpO1xuICAgICAgICAgICQkJDEoYWN0aXZlRWxlbWVudCkuYWRkQ2xhc3MoZGlyZWN0aW9uYWxDbGFzc05hbWUpO1xuICAgICAgICAgICQkJDEobmV4dEVsZW1lbnQpLmFkZENsYXNzKGRpcmVjdGlvbmFsQ2xhc3NOYW1lKTtcbiAgICAgICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChhY3RpdmVFbGVtZW50KTtcbiAgICAgICAgICAkJCQxKGFjdGl2ZUVsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkJCQxKG5leHRFbGVtZW50KS5yZW1vdmVDbGFzcyhkaXJlY3Rpb25hbENsYXNzTmFtZSArIFwiIFwiICsgb3JkZXJDbGFzc05hbWUpLmFkZENsYXNzKENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgICAgICAgJCQkMShhY3RpdmVFbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQUNUSVZFICsgXCIgXCIgKyBvcmRlckNsYXNzTmFtZSArIFwiIFwiICsgZGlyZWN0aW9uYWxDbGFzc05hbWUpO1xuICAgICAgICAgICAgX3RoaXMzLl9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gJCQkMShfdGhpczMuX2VsZW1lbnQpLnRyaWdnZXIoc2xpZEV2ZW50KTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgIH0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJCQkMShhY3RpdmVFbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQUNUSVZFKTtcbiAgICAgICAgICAkJCQxKG5leHRFbGVtZW50KS5hZGRDbGFzcyhDbGFzc05hbWUuQUNUSVZFKTtcbiAgICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoc2xpZEV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgICAgICB0aGlzLmN5Y2xlKCk7XG4gICAgICAgIH1cbiAgICAgIH07IC8vIFN0YXRpY1xuXG5cbiAgICAgIENhcm91c2VsLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9ICQkJDEodGhpcykuZGF0YShEQVRBX0tFWSk7XG5cbiAgICAgICAgICB2YXIgX2NvbmZpZyA9IF9vYmplY3RTcHJlYWQoe30sIERlZmF1bHQsICQkJDEodGhpcykuZGF0YSgpKTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgX2NvbmZpZyA9IF9vYmplY3RTcHJlYWQoe30sIF9jb25maWcsIGNvbmZpZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGFjdGlvbiA9IHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnID8gY29uZmlnIDogX2NvbmZpZy5zbGlkZTtcblxuICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgZGF0YSA9IG5ldyBDYXJvdXNlbCh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAgICQkJDEodGhpcykuZGF0YShEQVRBX0tFWSwgZGF0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBkYXRhLnRvKGNvbmZpZyk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2FjdGlvbl0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgYWN0aW9uICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2FjdGlvbl0oKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKF9jb25maWcuaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIGRhdGEucGF1c2UoKTtcbiAgICAgICAgICAgIGRhdGEuY3ljbGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgQ2Fyb3VzZWwuX2RhdGFBcGlDbGlja0hhbmRsZXIgPSBmdW5jdGlvbiBfZGF0YUFwaUNsaWNrSGFuZGxlcihldmVudCkge1xuICAgICAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodGhpcyk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0YXJnZXQgPSAkJCQxKHNlbGVjdG9yKVswXTtcblxuICAgICAgICBpZiAoIXRhcmdldCB8fCAhJCQkMSh0YXJnZXQpLmhhc0NsYXNzKENsYXNzTmFtZS5DQVJPVVNFTCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY29uZmlnID0gX29iamVjdFNwcmVhZCh7fSwgJCQkMSh0YXJnZXQpLmRhdGEoKSwgJCQkMSh0aGlzKS5kYXRhKCkpO1xuXG4gICAgICAgIHZhciBzbGlkZUluZGV4ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2xpZGUtdG8nKTtcblxuICAgICAgICBpZiAoc2xpZGVJbmRleCkge1xuICAgICAgICAgIGNvbmZpZy5pbnRlcnZhbCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgQ2Fyb3VzZWwuX2pRdWVyeUludGVyZmFjZS5jYWxsKCQkJDEodGFyZ2V0KSwgY29uZmlnKTtcblxuICAgICAgICBpZiAoc2xpZGVJbmRleCkge1xuICAgICAgICAgICQkJDEodGFyZ2V0KS5kYXRhKERBVEFfS0VZKS50byhzbGlkZUluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9O1xuXG4gICAgICBfY3JlYXRlQ2xhc3MoQ2Fyb3VzZWwsIG51bGwsIFt7XG4gICAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBWRVJTSU9OO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBEZWZhdWx0O1xuICAgICAgICB9XG4gICAgICB9XSk7XG5cbiAgICAgIHJldHVybiBDYXJvdXNlbDtcbiAgICB9KCk7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuXG4gICAgJCQkMShkb2N1bWVudCkub24oRXZlbnQuQ0xJQ0tfREFUQV9BUEksIFNlbGVjdG9yLkRBVEFfU0xJREUsIENhcm91c2VsLl9kYXRhQXBpQ2xpY2tIYW5kbGVyKTtcbiAgICAkJCQxKHdpbmRvdykub24oRXZlbnQuTE9BRF9EQVRBX0FQSSwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNhcm91c2VscyA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTZWxlY3Rvci5EQVRBX1JJREUpKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNhcm91c2Vscy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgJGNhcm91c2VsID0gJCQkMShjYXJvdXNlbHNbaV0pO1xuXG4gICAgICAgIENhcm91c2VsLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkY2Fyb3VzZWwsICRjYXJvdXNlbC5kYXRhKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIGpRdWVyeVxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG4gICAgJCQkMS5mbltOQU1FXSA9IENhcm91c2VsLl9qUXVlcnlJbnRlcmZhY2U7XG4gICAgJCQkMS5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IENhcm91c2VsO1xuXG4gICAgJCQkMS5mbltOQU1FXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgJCQkMS5mbltOQU1FXSA9IEpRVUVSWV9OT19DT05GTElDVDtcbiAgICAgIHJldHVybiBDYXJvdXNlbC5falF1ZXJ5SW50ZXJmYWNlO1xuICAgIH07XG5cbiAgICByZXR1cm4gQ2Fyb3VzZWw7XG4gIH0oJCk7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuMS4yKTogY29sbGFwc2UuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIENvbGxhcHNlID0gZnVuY3Rpb24gKCQkJDEpIHtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBDb25zdGFudHNcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cbiAgICB2YXIgTkFNRSA9ICdjb2xsYXBzZSc7XG4gICAgdmFyIFZFUlNJT04gPSAnNC4xLjInO1xuICAgIHZhciBEQVRBX0tFWSA9ICdicy5jb2xsYXBzZSc7XG4gICAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gICAgdmFyIERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknO1xuICAgIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkJCQxLmZuW05BTUVdO1xuICAgIHZhciBEZWZhdWx0ID0ge1xuICAgICAgdG9nZ2xlOiB0cnVlLFxuICAgICAgcGFyZW50OiAnJ1xuICAgIH07XG4gICAgdmFyIERlZmF1bHRUeXBlID0ge1xuICAgICAgdG9nZ2xlOiAnYm9vbGVhbicsXG4gICAgICBwYXJlbnQ6ICcoc3RyaW5nfGVsZW1lbnQpJ1xuICAgIH07XG4gICAgdmFyIEV2ZW50ID0ge1xuICAgICAgU0hPVzogXCJzaG93XCIgKyBFVkVOVF9LRVksXG4gICAgICBTSE9XTjogXCJzaG93blwiICsgRVZFTlRfS0VZLFxuICAgICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVksXG4gICAgICBISURERU46IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVksXG4gICAgICBDTElDS19EQVRBX0FQSTogXCJjbGlja1wiICsgRVZFTlRfS0VZICsgREFUQV9BUElfS0VZXG4gICAgfTtcbiAgICB2YXIgQ2xhc3NOYW1lID0ge1xuICAgICAgU0hPVzogJ3Nob3cnLFxuICAgICAgQ09MTEFQU0U6ICdjb2xsYXBzZScsXG4gICAgICBDT0xMQVBTSU5HOiAnY29sbGFwc2luZycsXG4gICAgICBDT0xMQVBTRUQ6ICdjb2xsYXBzZWQnXG4gICAgfTtcbiAgICB2YXIgRGltZW5zaW9uID0ge1xuICAgICAgV0lEVEg6ICd3aWR0aCcsXG4gICAgICBIRUlHSFQ6ICdoZWlnaHQnXG4gICAgfTtcbiAgICB2YXIgU2VsZWN0b3IgPSB7XG4gICAgICBBQ1RJVkVTOiAnLnNob3csIC5jb2xsYXBzaW5nJyxcbiAgICAgIERBVEFfVE9HR0xFOiAnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nXG4gICAgICAvKipcbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgKi9cblxuICAgIH07XG5cbiAgICB2YXIgQ29sbGFwc2UgPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBDb2xsYXBzZShlbGVtZW50LCBjb25maWcpIHtcbiAgICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gJCQkMS5tYWtlQXJyYXkoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLXRvZ2dsZT1cXFwiY29sbGFwc2VcXFwiXVtocmVmPVxcXCIjXCIgKyBlbGVtZW50LmlkICsgXCJcXFwiXSxcIiArIChcIltkYXRhLXRvZ2dsZT1cXFwiY29sbGFwc2VcXFwiXVtkYXRhLXRhcmdldD1cXFwiI1wiICsgZWxlbWVudC5pZCArIFwiXFxcIl1cIikpKTtcbiAgICAgICAgdmFyIHRvZ2dsZUxpc3QgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU2VsZWN0b3IuREFUQV9UT0dHTEUpKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdG9nZ2xlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIHZhciBlbGVtID0gdG9nZ2xlTGlzdFtpXTtcbiAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbSk7XG4gICAgICAgICAgdmFyIGZpbHRlckVsZW1lbnQgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKS5maWx0ZXIoZnVuY3Rpb24gKGZvdW5kRWxlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvdW5kRWxlbSA9PT0gZWxlbWVudDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzZWxlY3RvciAhPT0gbnVsbCAmJiBmaWx0ZXJFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG5cbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJBcnJheS5wdXNoKGVsZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BhcmVudCA9IHRoaXMuX2NvbmZpZy5wYXJlbnQgPyB0aGlzLl9nZXRQYXJlbnQoKSA6IG51bGw7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX2VsZW1lbnQsIHRoaXMuX3RyaWdnZXJBcnJheSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLnRvZ2dsZSkge1xuICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICAgIHZhciBfcHJvdG8gPSBDb2xsYXBzZS5wcm90b3R5cGU7XG5cbiAgICAgIC8vIFB1YmxpY1xuICAgICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgICAgaWYgKCQkJDEodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpKSB7XG4gICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICQkJDEodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFjdGl2ZXM7XG4gICAgICAgIHZhciBhY3RpdmVzRGF0YTtcblxuICAgICAgICBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICAgICAgYWN0aXZlcyA9IFtdLnNsaWNlLmNhbGwodGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU2VsZWN0b3IuQUNUSVZFUykpLmZpbHRlcihmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXBhcmVudCcpID09PSBfdGhpcy5fY29uZmlnLnBhcmVudDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChhY3RpdmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgYWN0aXZlcyA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGl2ZXMpIHtcbiAgICAgICAgICBhY3RpdmVzRGF0YSA9ICQkJDEoYWN0aXZlcykubm90KHRoaXMuX3NlbGVjdG9yKS5kYXRhKERBVEFfS0VZKTtcblxuICAgICAgICAgIGlmIChhY3RpdmVzRGF0YSAmJiBhY3RpdmVzRGF0YS5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0YXJ0RXZlbnQgPSAkJCQxLkV2ZW50KEV2ZW50LlNIT1cpO1xuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoc3RhcnRFdmVudCk7XG5cbiAgICAgICAgaWYgKHN0YXJ0RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWN0aXZlcykge1xuICAgICAgICAgIENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkJCQxKGFjdGl2ZXMpLm5vdCh0aGlzLl9zZWxlY3RvciksICdoaWRlJyk7XG5cbiAgICAgICAgICBpZiAoIWFjdGl2ZXNEYXRhKSB7XG4gICAgICAgICAgICAkJCQxKGFjdGl2ZXMpLmRhdGEoREFUQV9LRVksIG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKTtcblxuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5DT0xMQVBTRSkuYWRkQ2xhc3MoQ2xhc3NOYW1lLkNPTExBUFNJTkcpO1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAwO1xuXG4gICAgICAgIGlmICh0aGlzLl90cmlnZ2VyQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgJCQkMSh0aGlzLl90cmlnZ2VyQXJyYXkpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5DT0xMQVBTRUQpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0VHJhbnNpdGlvbmluZyh0cnVlKTtcblxuICAgICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICAgICAgICAkJCQxKF90aGlzLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0lORykuYWRkQ2xhc3MoQ2xhc3NOYW1lLkNPTExBUFNFKS5hZGRDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG4gICAgICAgICAgX3RoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnO1xuXG4gICAgICAgICAgX3RoaXMuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG5cbiAgICAgICAgICAkJCQxKF90aGlzLl9lbGVtZW50KS50cmlnZ2VyKEV2ZW50LlNIT1dOKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgY2FwaXRhbGl6ZWREaW1lbnNpb24gPSBkaW1lbnNpb25bMF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSgxKTtcbiAgICAgICAgdmFyIHNjcm9sbFNpemUgPSBcInNjcm9sbFwiICsgY2FwaXRhbGl6ZWREaW1lbnNpb247XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gdGhpcy5fZWxlbWVudFtzY3JvbGxTaXplXSArIFwicHhcIjtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5oaWRlID0gZnVuY3Rpb24gaGlkZSgpIHtcbiAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbmluZyB8fCAhJCQkMSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuU0hPVykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RhcnRFdmVudCA9ICQkJDEuRXZlbnQoRXZlbnQuSElERSk7XG4gICAgICAgICQkJDEodGhpcy5fZWxlbWVudCkudHJpZ2dlcihzdGFydEV2ZW50KTtcblxuICAgICAgICBpZiAoc3RhcnRFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKTtcblxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSB0aGlzLl9lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RpbWVuc2lvbl0gKyBcInB4XCI7XG4gICAgICAgIFV0aWwucmVmbG93KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKENsYXNzTmFtZS5DT0xMQVBTSU5HKS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0UpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5TSE9XKTtcbiAgICAgICAgdmFyIHRyaWdnZXJBcnJheUxlbmd0aCA9IHRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHRyaWdnZXJBcnJheUxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaWdnZXJBcnJheUxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdHJpZ2dlciA9IHRoaXMuX3RyaWdnZXJBcnJheVtpXTtcbiAgICAgICAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0cmlnZ2VyKTtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciAkZWxlbSA9ICQkJDEoW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkpO1xuXG4gICAgICAgICAgICAgIGlmICghJGVsZW0uaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpKSB7XG4gICAgICAgICAgICAgICAgJCQkMSh0cmlnZ2VyKS5hZGRDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0VEKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKHRydWUpO1xuXG4gICAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICAgIF90aGlzMi5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcblxuICAgICAgICAgICQkJDEoX3RoaXMyLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0lORykuYWRkQ2xhc3MoQ2xhc3NOYW1lLkNPTExBUFNFKS50cmlnZ2VyKEV2ZW50LkhJRERFTik7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gJyc7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5zZXRUcmFuc2l0aW9uaW5nID0gZnVuY3Rpb24gc2V0VHJhbnNpdGlvbmluZyhpc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gaXNUcmFuc2l0aW9uaW5nO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICAkJCQxLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gbnVsbDtcbiAgICAgIH07IC8vIFByaXZhdGVcblxuXG4gICAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZyA9IF9vYmplY3RTcHJlYWQoe30sIERlZmF1bHQsIGNvbmZpZyk7XG4gICAgICAgIGNvbmZpZy50b2dnbGUgPSBCb29sZWFuKGNvbmZpZy50b2dnbGUpOyAvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlc1xuXG4gICAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUsIGNvbmZpZywgRGVmYXVsdFR5cGUpO1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9nZXREaW1lbnNpb24gPSBmdW5jdGlvbiBfZ2V0RGltZW5zaW9uKCkge1xuICAgICAgICB2YXIgaGFzV2lkdGggPSAkJCQxKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKERpbWVuc2lvbi5XSURUSCk7XG4gICAgICAgIHJldHVybiBoYXNXaWR0aCA/IERpbWVuc2lvbi5XSURUSCA6IERpbWVuc2lvbi5IRUlHSFQ7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2dldFBhcmVudCA9IGZ1bmN0aW9uIF9nZXRQYXJlbnQoKSB7XG4gICAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICAgIHZhciBwYXJlbnQgPSBudWxsO1xuXG4gICAgICAgIGlmIChVdGlsLmlzRWxlbWVudCh0aGlzLl9jb25maWcucGFyZW50KSkge1xuICAgICAgICAgIHBhcmVudCA9IHRoaXMuX2NvbmZpZy5wYXJlbnQ7IC8vIEl0J3MgYSBqUXVlcnkgb2JqZWN0XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2NvbmZpZy5wYXJlbnQuanF1ZXJ5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGFyZW50ID0gdGhpcy5fY29uZmlnLnBhcmVudFswXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLl9jb25maWcucGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZWxlY3RvciA9IFwiW2RhdGEtdG9nZ2xlPVxcXCJjb2xsYXBzZVxcXCJdW2RhdGEtcGFyZW50PVxcXCJcIiArIHRoaXMuX2NvbmZpZy5wYXJlbnQgKyBcIlxcXCJdXCI7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IFtdLnNsaWNlLmNhbGwocGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTtcbiAgICAgICAgJCQkMShjaGlsZHJlbikuZWFjaChmdW5jdGlvbiAoaSwgZWxlbWVudCkge1xuICAgICAgICAgIF90aGlzMy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKENvbGxhcHNlLl9nZXRUYXJnZXRGcm9tRWxlbWVudChlbGVtZW50KSwgW2VsZW1lbnRdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyA9IGZ1bmN0aW9uIF9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoZWxlbWVudCwgdHJpZ2dlckFycmF5KSB7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGlzT3BlbiA9ICQkJDEoZWxlbWVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpO1xuXG4gICAgICAgICAgaWYgKHRyaWdnZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgICQkJDEodHJpZ2dlckFycmF5KS50b2dnbGVDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0VELCAhaXNPcGVuKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgaXNPcGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07IC8vIFN0YXRpY1xuXG5cbiAgICAgIENvbGxhcHNlLl9nZXRUYXJnZXRGcm9tRWxlbWVudCA9IGZ1bmN0aW9uIF9nZXRUYXJnZXRGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgOiBudWxsO1xuICAgICAgfTtcblxuICAgICAgQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAkdGhpcyA9ICQkJDEodGhpcyk7XG4gICAgICAgICAgdmFyIGRhdGEgPSAkdGhpcy5kYXRhKERBVEFfS0VZKTtcblxuICAgICAgICAgIHZhciBfY29uZmlnID0gX29iamVjdFNwcmVhZCh7fSwgRGVmYXVsdCwgJHRoaXMuZGF0YSgpLCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcgPyBjb25maWcgOiB7fSk7XG5cbiAgICAgICAgICBpZiAoIWRhdGEgJiYgX2NvbmZpZy50b2dnbGUgJiYgL3Nob3d8aGlkZS8udGVzdChjb25maWcpKSB7XG4gICAgICAgICAgICBfY29uZmlnLnRvZ2dsZSA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgZGF0YSA9IG5ldyBDb2xsYXBzZSh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAgICR0aGlzLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX2NyZWF0ZUNsYXNzKENvbGxhcHNlLCBudWxsLCBbe1xuICAgICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gVkVSU0lPTjtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBrZXk6IFwiRGVmYXVsdFwiLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gRGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgfV0pO1xuXG4gICAgICByZXR1cm4gQ29sbGFwc2U7XG4gICAgfSgpO1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG5cblxuICAgICQkJDEoZG9jdW1lbnQpLm9uKEV2ZW50LkNMSUNLX0RBVEFfQVBJLCBTZWxlY3Rvci5EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBwcmV2ZW50RGVmYXVsdCBvbmx5IGZvciA8YT4gZWxlbWVudHMgKHdoaWNoIGNoYW5nZSB0aGUgVVJMKSBub3QgaW5zaWRlIHRoZSBjb2xsYXBzaWJsZSBlbGVtZW50XG4gICAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgdmFyICR0cmlnZ2VyID0gJCQkMSh0aGlzKTtcbiAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKTtcbiAgICAgIHZhciBzZWxlY3RvcnMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTtcbiAgICAgICQkJDEoc2VsZWN0b3JzKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICR0YXJnZXQgPSAkJCQxKHRoaXMpO1xuICAgICAgICB2YXIgZGF0YSA9ICR0YXJnZXQuZGF0YShEQVRBX0tFWSk7XG4gICAgICAgIHZhciBjb25maWcgPSBkYXRhID8gJ3RvZ2dsZScgOiAkdHJpZ2dlci5kYXRhKCk7XG5cbiAgICAgICAgQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZS5jYWxsKCR0YXJnZXQsIGNvbmZpZyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBqUXVlcnlcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuICAgICQkJDEuZm5bTkFNRV0gPSBDb2xsYXBzZS5falF1ZXJ5SW50ZXJmYWNlO1xuICAgICQkJDEuZm5bTkFNRV0uQ29uc3RydWN0b3IgPSBDb2xsYXBzZTtcblxuICAgICQkJDEuZm5bTkFNRV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICQkJDEuZm5bTkFNRV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgICByZXR1cm4gQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIENvbGxhcHNlO1xuICB9KCQpO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgKHY0LjEuMik6IGRyb3Bkb3duLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBEcm9wZG93biA9IGZ1bmN0aW9uICgkJCQxKSB7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogQ29uc3RhbnRzXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG4gICAgdmFyIE5BTUUgPSAnZHJvcGRvd24nO1xuICAgIHZhciBWRVJTSU9OID0gJzQuMS4yJztcbiAgICB2YXIgREFUQV9LRVkgPSAnYnMuZHJvcGRvd24nO1xuICAgIHZhciBFVkVOVF9LRVkgPSBcIi5cIiArIERBVEFfS0VZO1xuICAgIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUID0gJCQkMS5mbltOQU1FXTtcbiAgICB2YXIgRVNDQVBFX0tFWUNPREUgPSAyNzsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgRXNjYXBlIChFc2MpIGtleVxuXG4gICAgdmFyIFNQQUNFX0tFWUNPREUgPSAzMjsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3Igc3BhY2Uga2V5XG5cbiAgICB2YXIgVEFCX0tFWUNPREUgPSA5OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciB0YWIga2V5XG5cbiAgICB2YXIgQVJST1dfVVBfS0VZQ09ERSA9IDM4OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciB1cCBhcnJvdyBrZXlcblxuICAgIHZhciBBUlJPV19ET1dOX0tFWUNPREUgPSA0MDsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgZG93biBhcnJvdyBrZXlcblxuICAgIHZhciBSSUdIVF9NT1VTRV9CVVRUT05fV0hJQ0ggPSAzOyAvLyBNb3VzZUV2ZW50LndoaWNoIHZhbHVlIGZvciB0aGUgcmlnaHQgYnV0dG9uIChhc3N1bWluZyBhIHJpZ2h0LWhhbmRlZCBtb3VzZSlcblxuICAgIHZhciBSRUdFWFBfS0VZRE9XTiA9IG5ldyBSZWdFeHAoQVJST1dfVVBfS0VZQ09ERSArIFwifFwiICsgQVJST1dfRE9XTl9LRVlDT0RFICsgXCJ8XCIgKyBFU0NBUEVfS0VZQ09ERSk7XG4gICAgdmFyIEV2ZW50ID0ge1xuICAgICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVksXG4gICAgICBISURERU46IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVksXG4gICAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSxcbiAgICAgIFNIT1dOOiBcInNob3duXCIgKyBFVkVOVF9LRVksXG4gICAgICBDTElDSzogXCJjbGlja1wiICsgRVZFTlRfS0VZLFxuICAgICAgQ0xJQ0tfREFUQV9BUEk6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWSxcbiAgICAgIEtFWURPV05fREFUQV9BUEk6IFwia2V5ZG93blwiICsgRVZFTlRfS0VZICsgREFUQV9BUElfS0VZLFxuICAgICAgS0VZVVBfREFUQV9BUEk6IFwia2V5dXBcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWVxuICAgIH07XG4gICAgdmFyIENsYXNzTmFtZSA9IHtcbiAgICAgIERJU0FCTEVEOiAnZGlzYWJsZWQnLFxuICAgICAgU0hPVzogJ3Nob3cnLFxuICAgICAgRFJPUFVQOiAnZHJvcHVwJyxcbiAgICAgIERST1BSSUdIVDogJ2Ryb3ByaWdodCcsXG4gICAgICBEUk9QTEVGVDogJ2Ryb3BsZWZ0JyxcbiAgICAgIE1FTlVSSUdIVDogJ2Ryb3Bkb3duLW1lbnUtcmlnaHQnLFxuICAgICAgTUVOVUxFRlQ6ICdkcm9wZG93bi1tZW51LWxlZnQnLFxuICAgICAgUE9TSVRJT05fU1RBVElDOiAncG9zaXRpb24tc3RhdGljJ1xuICAgIH07XG4gICAgdmFyIFNlbGVjdG9yID0ge1xuICAgICAgREFUQV9UT0dHTEU6ICdbZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScsXG4gICAgICBGT1JNX0NISUxEOiAnLmRyb3Bkb3duIGZvcm0nLFxuICAgICAgTUVOVTogJy5kcm9wZG93bi1tZW51JyxcbiAgICAgIE5BVkJBUl9OQVY6ICcubmF2YmFyLW5hdicsXG4gICAgICBWSVNJQkxFX0lURU1TOiAnLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWl0ZW06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCknXG4gICAgfTtcbiAgICB2YXIgQXR0YWNobWVudE1hcCA9IHtcbiAgICAgIFRPUDogJ3RvcC1zdGFydCcsXG4gICAgICBUT1BFTkQ6ICd0b3AtZW5kJyxcbiAgICAgIEJPVFRPTTogJ2JvdHRvbS1zdGFydCcsXG4gICAgICBCT1RUT01FTkQ6ICdib3R0b20tZW5kJyxcbiAgICAgIFJJR0hUOiAncmlnaHQtc3RhcnQnLFxuICAgICAgUklHSFRFTkQ6ICdyaWdodC1lbmQnLFxuICAgICAgTEVGVDogJ2xlZnQtc3RhcnQnLFxuICAgICAgTEVGVEVORDogJ2xlZnQtZW5kJ1xuICAgIH07XG4gICAgdmFyIERlZmF1bHQgPSB7XG4gICAgICBvZmZzZXQ6IDAsXG4gICAgICBmbGlwOiB0cnVlLFxuICAgICAgYm91bmRhcnk6ICdzY3JvbGxQYXJlbnQnLFxuICAgICAgcmVmZXJlbmNlOiAndG9nZ2xlJyxcbiAgICAgIGRpc3BsYXk6ICdkeW5hbWljJ1xuICAgIH07XG4gICAgdmFyIERlZmF1bHRUeXBlID0ge1xuICAgICAgb2Zmc2V0OiAnKG51bWJlcnxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgICAgIGZsaXA6ICdib29sZWFuJyxcbiAgICAgIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KScsXG4gICAgICByZWZlcmVuY2U6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgICAgIGRpc3BsYXk6ICdzdHJpbmcnXG4gICAgICAvKipcbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgKi9cblxuICAgIH07XG5cbiAgICB2YXIgRHJvcGRvd24gPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBEcm9wZG93bihlbGVtZW50LCBjb25maWcpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgICB0aGlzLl9tZW51ID0gdGhpcy5fZ2V0TWVudUVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKTtcblxuICAgICAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpO1xuICAgICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgICAgdmFyIF9wcm90byA9IERyb3Bkb3duLnByb3RvdHlwZTtcblxuICAgICAgLy8gUHVibGljXG4gICAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgICAgICBpZiAodGhpcy5fZWxlbWVudC5kaXNhYmxlZCB8fCAkJCQxKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5ESVNBQkxFRCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGFyZW50ID0gRHJvcGRvd24uX2dldFBhcmVudEZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuXG4gICAgICAgIHZhciBpc0FjdGl2ZSA9ICQkJDEodGhpcy5fbWVudSkuaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpO1xuXG4gICAgICAgIERyb3Bkb3duLl9jbGVhck1lbnVzKCk7XG5cbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgICAgICB9O1xuICAgICAgICB2YXIgc2hvd0V2ZW50ID0gJCQkMS5FdmVudChFdmVudC5TSE9XLCByZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgJCQkMShwYXJlbnQpLnRyaWdnZXIoc2hvd0V2ZW50KTtcblxuICAgICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIERpc2FibGUgdG90YWxseSBQb3BwZXIuanMgZm9yIERyb3Bkb3duIGluIE5hdmJhclxuXG5cbiAgICAgICAgaWYgKCF0aGlzLl9pbk5hdmJhcikge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIENoZWNrIGZvciBQb3BwZXIgZGVwZW5kZW5jeVxuICAgICAgICAgICAqIFBvcHBlciAtIGh0dHBzOi8vcG9wcGVyLmpzLm9yZ1xuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwIGRyb3Bkb3duIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuXG4gICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UgPT09ICdwYXJlbnQnKSB7XG4gICAgICAgICAgICByZWZlcmVuY2VFbGVtZW50ID0gcGFyZW50O1xuICAgICAgICAgIH0gZWxzZSBpZiAoVXRpbC5pc0VsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9jb25maWcucmVmZXJlbmNlOyAvLyBDaGVjayBpZiBpdCdzIGpRdWVyeSBlbGVtZW50XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLnJlZmVyZW5jZS5qcXVlcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9jb25maWcucmVmZXJlbmNlWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gSWYgYm91bmRhcnkgaXMgbm90IGBzY3JvbGxQYXJlbnRgLCB0aGVuIHNldCBwb3NpdGlvbiB0byBgc3RhdGljYFxuICAgICAgICAgIC8vIHRvIGFsbG93IHRoZSBtZW51IHRvIFwiZXNjYXBlXCIgdGhlIHNjcm9sbCBwYXJlbnQncyBib3VuZGFyaWVzXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8yNDI1MVxuXG5cbiAgICAgICAgICBpZiAodGhpcy5fY29uZmlnLmJvdW5kYXJ5ICE9PSAnc2Nyb2xsUGFyZW50Jykge1xuICAgICAgICAgICAgJCQkMShwYXJlbnQpLmFkZENsYXNzKENsYXNzTmFtZS5QT1NJVElPTl9TVEFUSUMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX3BvcHBlciA9IG5ldyBQb3BwZXIocmVmZXJlbmNlRWxlbWVudCwgdGhpcy5fbWVudSwgdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKCkpO1xuICAgICAgICB9IC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAgICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB0byB0aGUgYm9keSdzIGltbWVkaWF0ZSBjaGlsZHJlbjtcbiAgICAgICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG5cblxuICAgICAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICQkJDEocGFyZW50KS5jbG9zZXN0KFNlbGVjdG9yLk5BVkJBUl9OQVYpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICQkJDEoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vbignbW91c2VvdmVyJywgbnVsbCwgJCQkMS5ub29wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuZm9jdXMoKTtcblxuICAgICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuXG4gICAgICAgICQkJDEodGhpcy5fbWVudSkudG9nZ2xlQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpO1xuICAgICAgICAkJCQxKHBhcmVudCkudG9nZ2xlQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpLnRyaWdnZXIoJCQkMS5FdmVudChFdmVudC5TSE9XTiwgcmVsYXRlZFRhcmdldCkpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICAkJCQxLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLm9mZihFVkVOVF9LRVkpO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbWVudSA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KCk7XG5cbiAgICAgICAgICB0aGlzLl9wb3BwZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8udXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgICB0aGlzLl9pbk5hdmJhciA9IHRoaXMuX2RldGVjdE5hdmJhcigpO1xuXG4gICAgICAgIGlmICh0aGlzLl9wb3BwZXIgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfTsgLy8gUHJpdmF0ZVxuXG5cbiAgICAgIF9wcm90by5fYWRkRXZlbnRMaXN0ZW5lcnMgPSBmdW5jdGlvbiBfYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS5vbihFdmVudC5DTElDSywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgIF90aGlzLnRvZ2dsZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fZ2V0Q29uZmlnID0gZnVuY3Rpb24gX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgICAgY29uZmlnID0gX29iamVjdFNwcmVhZCh7fSwgdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LCAkJCQxKHRoaXMuX2VsZW1lbnQpLmRhdGEoKSwgY29uZmlnKTtcbiAgICAgICAgVXRpbC50eXBlQ2hlY2tDb25maWcoTkFNRSwgY29uZmlnLCB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKTtcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fZ2V0TWVudUVsZW1lbnQgPSBmdW5jdGlvbiBfZ2V0TWVudUVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWVudSkge1xuICAgICAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG5cbiAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9tZW51ID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3IoU2VsZWN0b3IuTUVOVSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX21lbnU7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2dldFBsYWNlbWVudCA9IGZ1bmN0aW9uIF9nZXRQbGFjZW1lbnQoKSB7XG4gICAgICAgIHZhciAkcGFyZW50RHJvcGRvd24gPSAkJCQxKHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSk7XG4gICAgICAgIHZhciBwbGFjZW1lbnQgPSBBdHRhY2htZW50TWFwLkJPVFRPTTsgLy8gSGFuZGxlIGRyb3B1cFxuXG4gICAgICAgIGlmICgkcGFyZW50RHJvcGRvd24uaGFzQ2xhc3MoQ2xhc3NOYW1lLkRST1BVUCkpIHtcbiAgICAgICAgICBwbGFjZW1lbnQgPSBBdHRhY2htZW50TWFwLlRPUDtcblxuICAgICAgICAgIGlmICgkJCQxKHRoaXMuX21lbnUpLmhhc0NsYXNzKENsYXNzTmFtZS5NRU5VUklHSFQpKSB7XG4gICAgICAgICAgICBwbGFjZW1lbnQgPSBBdHRhY2htZW50TWFwLlRPUEVORDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoJHBhcmVudERyb3Bkb3duLmhhc0NsYXNzKENsYXNzTmFtZS5EUk9QUklHSFQpKSB7XG4gICAgICAgICAgcGxhY2VtZW50ID0gQXR0YWNobWVudE1hcC5SSUdIVDtcbiAgICAgICAgfSBlbHNlIGlmICgkcGFyZW50RHJvcGRvd24uaGFzQ2xhc3MoQ2xhc3NOYW1lLkRST1BMRUZUKSkge1xuICAgICAgICAgIHBsYWNlbWVudCA9IEF0dGFjaG1lbnRNYXAuTEVGVDtcbiAgICAgICAgfSBlbHNlIGlmICgkJCQxKHRoaXMuX21lbnUpLmhhc0NsYXNzKENsYXNzTmFtZS5NRU5VUklHSFQpKSB7XG4gICAgICAgICAgcGxhY2VtZW50ID0gQXR0YWNobWVudE1hcC5CT1RUT01FTkQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGxhY2VtZW50O1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9kZXRlY3ROYXZiYXIgPSBmdW5jdGlvbiBfZGV0ZWN0TmF2YmFyKCkge1xuICAgICAgICByZXR1cm4gJCQkMSh0aGlzLl9lbGVtZW50KS5jbG9zZXN0KCcubmF2YmFyJykubGVuZ3RoID4gMDtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fZ2V0UG9wcGVyQ29uZmlnID0gZnVuY3Rpb24gX2dldFBvcHBlckNvbmZpZygpIHtcbiAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIG9mZnNldENvbmYgPSB7fTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2NvbmZpZy5vZmZzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvZmZzZXRDb25mLmZuID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIGRhdGEub2Zmc2V0cyA9IF9vYmplY3RTcHJlYWQoe30sIGRhdGEub2Zmc2V0cywgX3RoaXMyLl9jb25maWcub2Zmc2V0KGRhdGEub2Zmc2V0cykgfHwge30pO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXRDb25mLm9mZnNldCA9IHRoaXMuX2NvbmZpZy5vZmZzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcG9wcGVyQ29uZmlnID0ge1xuICAgICAgICAgIHBsYWNlbWVudDogdGhpcy5fZ2V0UGxhY2VtZW50KCksXG4gICAgICAgICAgbW9kaWZpZXJzOiB7XG4gICAgICAgICAgICBvZmZzZXQ6IG9mZnNldENvbmYsXG4gICAgICAgICAgICBmbGlwOiB7XG4gICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuX2NvbmZpZy5mbGlwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJldmVudE92ZXJmbG93OiB7XG4gICAgICAgICAgICAgIGJvdW5kYXJpZXNFbGVtZW50OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIERpc2FibGUgUG9wcGVyLmpzIGlmIHdlIGhhdmUgYSBzdGF0aWMgZGlzcGxheVxuXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5kaXNwbGF5ID09PSAnc3RhdGljJykge1xuICAgICAgICAgIHBvcHBlckNvbmZpZy5tb2RpZmllcnMuYXBwbHlTdHlsZSA9IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwb3BwZXJDb25maWc7XG4gICAgICB9OyAvLyBTdGF0aWNcblxuXG4gICAgICBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGw7XG5cbiAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgRHJvcGRvd24odGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgICAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgRHJvcGRvd24uX2NsZWFyTWVudXMgPSBmdW5jdGlvbiBfY2xlYXJNZW51cyhldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQgJiYgKGV2ZW50LndoaWNoID09PSBSSUdIVF9NT1VTRV9CVVRUT05fV0hJQ0ggfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC53aGljaCAhPT0gVEFCX0tFWUNPREUpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRvZ2dsZXMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU2VsZWN0b3IuREFUQV9UT0dHTEUpKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdG9nZ2xlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodG9nZ2xlc1tpXSk7XG5cbiAgICAgICAgICB2YXIgY29udGV4dCA9ICQkJDEodG9nZ2xlc1tpXSkuZGF0YShEQVRBX0tFWSk7XG4gICAgICAgICAgdmFyIHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICAgICAgICByZWxhdGVkVGFyZ2V0OiB0b2dnbGVzW2ldXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChldmVudCAmJiBldmVudC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgICAgICByZWxhdGVkVGFyZ2V0LmNsaWNrRXZlbnQgPSBldmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBkcm9wZG93bk1lbnUgPSBjb250ZXh0Ll9tZW51O1xuXG4gICAgICAgICAgaWYgKCEkJCQxKHBhcmVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXZlbnQgJiYgKGV2ZW50LnR5cGUgPT09ICdjbGljaycgJiYgL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC53aGljaCA9PT0gVEFCX0tFWUNPREUpICYmICQkJDEuY29udGFpbnMocGFyZW50LCBldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaGlkZUV2ZW50ID0gJCQkMS5FdmVudChFdmVudC5ISURFLCByZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgICAkJCQxKHBhcmVudCkudHJpZ2dlcihoaWRlRXZlbnQpO1xuXG4gICAgICAgICAgaWYgKGhpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgICAgICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG5cblxuICAgICAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICQkJDEoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vZmYoJ21vdXNlb3ZlcicsIG51bGwsICQkJDEubm9vcCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdG9nZ2xlc1tpXS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgICAkJCQxKGRyb3Bkb3duTWVudSkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpO1xuICAgICAgICAgICQkJDEocGFyZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVykudHJpZ2dlcigkJCQxLkV2ZW50KEV2ZW50LkhJRERFTiwgcmVsYXRlZFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQgPSBmdW5jdGlvbiBfZ2V0UGFyZW50RnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICB2YXIgcGFyZW50O1xuICAgICAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyZW50IHx8IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgIH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5cblxuICAgICAgRHJvcGRvd24uX2RhdGFBcGlLZXlkb3duSGFuZGxlciA9IGZ1bmN0aW9uIF9kYXRhQXBpS2V5ZG93bkhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgLy8gSWYgbm90IGlucHV0L3RleHRhcmVhOlxuICAgICAgICAvLyAgLSBBbmQgbm90IGEga2V5IGluIFJFR0VYUF9LRVlET1dOID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcbiAgICAgICAgLy8gSWYgaW5wdXQvdGV4dGFyZWE6XG4gICAgICAgIC8vICAtIElmIHNwYWNlIGtleSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgICAgIC8vICAtIElmIGtleSBpcyBvdGhlciB0aGFuIGVzY2FwZVxuICAgICAgICAvLyAgICAtIElmIGtleSBpcyBub3QgdXAgb3IgZG93biA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgICAgIC8vICAgIC0gSWYgdHJpZ2dlciBpbnNpZGUgdGhlIG1lbnUgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgICAgICBpZiAoL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkgPyBldmVudC53aGljaCA9PT0gU1BBQ0VfS0VZQ09ERSB8fCBldmVudC53aGljaCAhPT0gRVNDQVBFX0tFWUNPREUgJiYgKGV2ZW50LndoaWNoICE9PSBBUlJPV19ET1dOX0tFWUNPREUgJiYgZXZlbnQud2hpY2ggIT09IEFSUk9XX1VQX0tFWUNPREUgfHwgJCQkMShldmVudC50YXJnZXQpLmNsb3Nlc3QoU2VsZWN0b3IuTUVOVSkubGVuZ3RoKSA6ICFSRUdFWFBfS0VZRE9XTi50ZXN0KGV2ZW50LndoaWNoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICQkJDEodGhpcykuaGFzQ2xhc3MoQ2xhc3NOYW1lLkRJU0FCTEVEKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcyk7XG5cbiAgICAgICAgdmFyIGlzQWN0aXZlID0gJCQkMShwYXJlbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5TSE9XKTtcblxuICAgICAgICBpZiAoIWlzQWN0aXZlICYmIChldmVudC53aGljaCAhPT0gRVNDQVBFX0tFWUNPREUgfHwgZXZlbnQud2hpY2ggIT09IFNQQUNFX0tFWUNPREUpIHx8IGlzQWN0aXZlICYmIChldmVudC53aGljaCA9PT0gRVNDQVBFX0tFWUNPREUgfHwgZXZlbnQud2hpY2ggPT09IFNQQUNFX0tFWUNPREUpKSB7XG4gICAgICAgICAgaWYgKGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSkge1xuICAgICAgICAgICAgdmFyIHRvZ2dsZSA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKFNlbGVjdG9yLkRBVEFfVE9HR0xFKTtcbiAgICAgICAgICAgICQkJDEodG9nZ2xlKS50cmlnZ2VyKCdmb2N1cycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICQkJDEodGhpcykudHJpZ2dlcignY2xpY2snKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlbXMgPSBbXS5zbGljZS5jYWxsKHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFNlbGVjdG9yLlZJU0lCTEVfSVRFTVMpKTtcblxuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGluZGV4ID0gaXRlbXMuaW5kZXhPZihldmVudC50YXJnZXQpO1xuXG4gICAgICAgIGlmIChldmVudC53aGljaCA9PT0gQVJST1dfVVBfS0VZQ09ERSAmJiBpbmRleCA+IDApIHtcbiAgICAgICAgICAvLyBVcFxuICAgICAgICAgIGluZGV4LS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT09IEFSUk9XX0RPV05fS0VZQ09ERSAmJiBpbmRleCA8IGl0ZW1zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAvLyBEb3duXG4gICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtc1tpbmRleF0uZm9jdXMoKTtcbiAgICAgIH07XG5cbiAgICAgIF9jcmVhdGVDbGFzcyhEcm9wZG93biwgbnVsbCwgW3tcbiAgICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIFZFUlNJT047XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkRlZmF1bHRUeXBlXCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBEZWZhdWx0VHlwZTtcbiAgICAgICAgfVxuICAgICAgfV0pO1xuXG4gICAgICByZXR1cm4gRHJvcGRvd247XG4gICAgfSgpO1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG5cblxuICAgICQkJDEoZG9jdW1lbnQpLm9uKEV2ZW50LktFWURPV05fREFUQV9BUEksIFNlbGVjdG9yLkRBVEFfVE9HR0xFLCBEcm9wZG93bi5fZGF0YUFwaUtleWRvd25IYW5kbGVyKS5vbihFdmVudC5LRVlET1dOX0RBVEFfQVBJLCBTZWxlY3Rvci5NRU5VLCBEcm9wZG93bi5fZGF0YUFwaUtleWRvd25IYW5kbGVyKS5vbihFdmVudC5DTElDS19EQVRBX0FQSSArIFwiIFwiICsgRXZlbnQuS0VZVVBfREFUQV9BUEksIERyb3Bkb3duLl9jbGVhck1lbnVzKS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJCQkMSh0aGlzKSwgJ3RvZ2dsZScpO1xuICAgIH0pLm9uKEV2ZW50LkNMSUNLX0RBVEFfQVBJLCBTZWxlY3Rvci5GT1JNX0NISUxELCBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBqUXVlcnlcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuICAgICQkJDEuZm5bTkFNRV0gPSBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlO1xuICAgICQkJDEuZm5bTkFNRV0uQ29uc3RydWN0b3IgPSBEcm9wZG93bjtcblxuICAgICQkJDEuZm5bTkFNRV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICQkJDEuZm5bTkFNRV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgICByZXR1cm4gRHJvcGRvd24uX2pRdWVyeUludGVyZmFjZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIERyb3Bkb3duO1xuICB9KCQsIFBvcHBlcik7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuMS4yKTogbW9kYWwuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE1vZGFsID0gZnVuY3Rpb24gKCQkJDEpIHtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBDb25zdGFudHNcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cbiAgICB2YXIgTkFNRSA9ICdtb2RhbCc7XG4gICAgdmFyIFZFUlNJT04gPSAnNC4xLjInO1xuICAgIHZhciBEQVRBX0tFWSA9ICdicy5tb2RhbCc7XG4gICAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gICAgdmFyIERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknO1xuICAgIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkJCQxLmZuW05BTUVdO1xuICAgIHZhciBFU0NBUEVfS0VZQ09ERSA9IDI3OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciBFc2NhcGUgKEVzYykga2V5XG5cbiAgICB2YXIgRGVmYXVsdCA9IHtcbiAgICAgIGJhY2tkcm9wOiB0cnVlLFxuICAgICAga2V5Ym9hcmQ6IHRydWUsXG4gICAgICBmb2N1czogdHJ1ZSxcbiAgICAgIHNob3c6IHRydWVcbiAgICB9O1xuICAgIHZhciBEZWZhdWx0VHlwZSA9IHtcbiAgICAgIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gICAgICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICAgICAgZm9jdXM6ICdib29sZWFuJyxcbiAgICAgIHNob3c6ICdib29sZWFuJ1xuICAgIH07XG4gICAgdmFyIEV2ZW50ID0ge1xuICAgICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVksXG4gICAgICBISURERU46IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVksXG4gICAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSxcbiAgICAgIFNIT1dOOiBcInNob3duXCIgKyBFVkVOVF9LRVksXG4gICAgICBGT0NVU0lOOiBcImZvY3VzaW5cIiArIEVWRU5UX0tFWSxcbiAgICAgIFJFU0laRTogXCJyZXNpemVcIiArIEVWRU5UX0tFWSxcbiAgICAgIENMSUNLX0RJU01JU1M6IFwiY2xpY2suZGlzbWlzc1wiICsgRVZFTlRfS0VZLFxuICAgICAgS0VZRE9XTl9ESVNNSVNTOiBcImtleWRvd24uZGlzbWlzc1wiICsgRVZFTlRfS0VZLFxuICAgICAgTU9VU0VVUF9ESVNNSVNTOiBcIm1vdXNldXAuZGlzbWlzc1wiICsgRVZFTlRfS0VZLFxuICAgICAgTU9VU0VET1dOX0RJU01JU1M6IFwibW91c2Vkb3duLmRpc21pc3NcIiArIEVWRU5UX0tFWSxcbiAgICAgIENMSUNLX0RBVEFfQVBJOiBcImNsaWNrXCIgKyBFVkVOVF9LRVkgKyBEQVRBX0FQSV9LRVlcbiAgICB9O1xuICAgIHZhciBDbGFzc05hbWUgPSB7XG4gICAgICBTQ1JPTExCQVJfTUVBU1VSRVI6ICdtb2RhbC1zY3JvbGxiYXItbWVhc3VyZScsXG4gICAgICBCQUNLRFJPUDogJ21vZGFsLWJhY2tkcm9wJyxcbiAgICAgIE9QRU46ICdtb2RhbC1vcGVuJyxcbiAgICAgIEZBREU6ICdmYWRlJyxcbiAgICAgIFNIT1c6ICdzaG93J1xuICAgIH07XG4gICAgdmFyIFNlbGVjdG9yID0ge1xuICAgICAgRElBTE9HOiAnLm1vZGFsLWRpYWxvZycsXG4gICAgICBEQVRBX1RPR0dMRTogJ1tkYXRhLXRvZ2dsZT1cIm1vZGFsXCJdJyxcbiAgICAgIERBVEFfRElTTUlTUzogJ1tkYXRhLWRpc21pc3M9XCJtb2RhbFwiXScsXG4gICAgICBGSVhFRF9DT05URU5UOiAnLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcCcsXG4gICAgICBTVElDS1lfQ09OVEVOVDogJy5zdGlja3ktdG9wJ1xuICAgICAgLyoqXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAqIENsYXNzIERlZmluaXRpb25cbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICovXG5cbiAgICB9O1xuXG4gICAgdmFyIE1vZGFsID1cbiAgICAvKiNfX1BVUkVfXyovXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gTW9kYWwoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5fZGlhbG9nID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNlbGVjdG9yLkRJQUxPRyk7XG4gICAgICAgIHRoaXMuX2JhY2tkcm9wID0gbnVsbDtcbiAgICAgICAgdGhpcy5faXNTaG93biA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pZ25vcmVCYWNrZHJvcENsaWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3Njcm9sbGJhcldpZHRoID0gMDtcbiAgICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICAgIHZhciBfcHJvdG8gPSBNb2RhbC5wcm90b3R5cGU7XG5cbiAgICAgIC8vIFB1YmxpY1xuICAgICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uc2hvdyA9IGZ1bmN0aW9uIHNob3cocmVsYXRlZFRhcmdldCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25pbmcgfHwgdGhpcy5faXNTaG93bikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgkJCQxKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKSkge1xuICAgICAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2hvd0V2ZW50ID0gJCQkMS5FdmVudChFdmVudC5TSE9XLCB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogcmVsYXRlZFRhcmdldFxuICAgICAgICB9KTtcbiAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNob3dFdmVudCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzU2hvd24gfHwgc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faXNTaG93biA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fY2hlY2tTY3JvbGxiYXIoKTtcblxuICAgICAgICB0aGlzLl9zZXRTY3JvbGxiYXIoKTtcblxuICAgICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcblxuICAgICAgICAkJCQxKGRvY3VtZW50LmJvZHkpLmFkZENsYXNzKENsYXNzTmFtZS5PUEVOKTtcblxuICAgICAgICB0aGlzLl9zZXRFc2NhcGVFdmVudCgpO1xuXG4gICAgICAgIHRoaXMuX3NldFJlc2l6ZUV2ZW50KCk7XG5cbiAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS5vbihFdmVudC5DTElDS19ESVNNSVNTLCBTZWxlY3Rvci5EQVRBX0RJU01JU1MsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5oaWRlKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgICQkJDEodGhpcy5fZGlhbG9nKS5vbihFdmVudC5NT1VTRURPV05fRElTTUlTUywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICQkJDEoX3RoaXMuX2VsZW1lbnQpLm9uZShFdmVudC5NT1VTRVVQX0RJU01JU1MsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaWYgKCQkJDEoZXZlbnQudGFyZ2V0KS5pcyhfdGhpcy5fZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgX3RoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2sgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9zaG93QmFja2Ryb3AoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5fc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmhpZGUgPSBmdW5jdGlvbiBoaWRlKGV2ZW50KSB7XG4gICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICF0aGlzLl9pc1Nob3duKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhpZGVFdmVudCA9ICQkJDEuRXZlbnQoRXZlbnQuSElERSk7XG4gICAgICAgICQkJDEodGhpcy5fZWxlbWVudCkudHJpZ2dlcihoaWRlRXZlbnQpO1xuXG4gICAgICAgIGlmICghdGhpcy5faXNTaG93biB8fCBoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uID0gJCQkMSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuRkFERSk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2V0RXNjYXBlRXZlbnQoKTtcblxuICAgICAgICB0aGlzLl9zZXRSZXNpemVFdmVudCgpO1xuXG4gICAgICAgICQkJDEoZG9jdW1lbnQpLm9mZihFdmVudC5GT0NVU0lOKTtcbiAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG4gICAgICAgICQkJDEodGhpcy5fZWxlbWVudCkub2ZmKEV2ZW50LkNMSUNLX0RJU01JU1MpO1xuICAgICAgICAkJCQxKHRoaXMuX2RpYWxvZykub2ZmKEV2ZW50Lk1PVVNFRE9XTl9ESVNNSVNTKTtcblxuICAgICAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICAgICQkJDEodGhpcy5fZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5faGlkZU1vZGFsKGV2ZW50KTtcbiAgICAgICAgICB9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2hpZGVNb2RhbCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAgICQkJDEucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSk7XG4gICAgICAgICQkJDEod2luZG93LCBkb2N1bWVudCwgdGhpcy5fZWxlbWVudCwgdGhpcy5fYmFja2Ryb3ApLm9mZihFVkVOVF9LRVkpO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZGlhbG9nID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuICAgICAgICB0aGlzLl9pc1Nob3duID0gbnVsbDtcbiAgICAgICAgdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgPSBudWxsO1xuICAgICAgICB0aGlzLl9pZ25vcmVCYWNrZHJvcENsaWNrID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2Nyb2xsYmFyV2lkdGggPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmhhbmRsZVVwZGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZVVwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gICAgICB9OyAvLyBQcml2YXRlXG5cblxuICAgICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgICBjb25maWcgPSBfb2JqZWN0U3ByZWFkKHt9LCBEZWZhdWx0LCBjb25maWcpO1xuICAgICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FLCBjb25maWcsIERlZmF1bHRUeXBlKTtcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fc2hvd0VsZW1lbnQgPSBmdW5jdGlvbiBfc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkge1xuICAgICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgICB2YXIgdHJhbnNpdGlvbiA9ICQkJDEodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLkZBREUpO1xuXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlIHx8IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAvLyBEb24ndCBtb3ZlIG1vZGFsJ3MgRE9NIHBvc2l0aW9uXG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuXG4gICAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgICAgVXRpbC5yZWZsb3codGhpcy5fZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKENsYXNzTmFtZS5TSE9XKTtcblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5fZW5mb3JjZUZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2hvd25FdmVudCA9ICQkJDEuRXZlbnQoRXZlbnQuU0hPV04sIHtcbiAgICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkVGFyZ2V0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciB0cmFuc2l0aW9uQ29tcGxldGUgPSBmdW5jdGlvbiB0cmFuc2l0aW9uQ29tcGxldGUoKSB7XG4gICAgICAgICAgaWYgKF90aGlzMy5fY29uZmlnLmZvY3VzKSB7XG4gICAgICAgICAgICBfdGhpczMuX2VsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgICAgICQkJDEoX3RoaXMzLl9lbGVtZW50KS50cmlnZ2VyKHNob3duRXZlbnQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG4gICAgICAgICAgJCQkMSh0aGlzLl9kaWFsb2cpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCB0cmFuc2l0aW9uQ29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJhbnNpdGlvbkNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fZW5mb3JjZUZvY3VzID0gZnVuY3Rpb24gX2VuZm9yY2VGb2N1cygpIHtcbiAgICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgICAgJCQkMShkb2N1bWVudCkub2ZmKEV2ZW50LkZPQ1VTSU4pIC8vIEd1YXJkIGFnYWluc3QgaW5maW5pdGUgZm9jdXMgbG9vcFxuICAgICAgICAub24oRXZlbnQuRk9DVVNJTiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKGRvY3VtZW50ICE9PSBldmVudC50YXJnZXQgJiYgX3RoaXM0Ll9lbGVtZW50ICE9PSBldmVudC50YXJnZXQgJiYgJCQkMShfdGhpczQuX2VsZW1lbnQpLmhhcyhldmVudC50YXJnZXQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgX3RoaXM0Ll9lbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fc2V0RXNjYXBlRXZlbnQgPSBmdW5jdGlvbiBfc2V0RXNjYXBlRXZlbnQoKSB7XG4gICAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICAgIGlmICh0aGlzLl9pc1Nob3duICYmIHRoaXMuX2NvbmZpZy5rZXlib2FyZCkge1xuICAgICAgICAgICQkJDEodGhpcy5fZWxlbWVudCkub24oRXZlbnQuS0VZRE9XTl9ESVNNSVNTLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC53aGljaCA9PT0gRVNDQVBFX0tFWUNPREUpIHtcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICBfdGhpczUuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9pc1Nob3duKSB7XG4gICAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS5vZmYoRXZlbnQuS0VZRE9XTl9ESVNNSVNTKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9zZXRSZXNpemVFdmVudCA9IGZ1bmN0aW9uIF9zZXRSZXNpemVFdmVudCgpIHtcbiAgICAgICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgICAgICAkJCQxKHdpbmRvdykub24oRXZlbnQuUkVTSVpFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczYuaGFuZGxlVXBkYXRlKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkJCQxKHdpbmRvdykub2ZmKEV2ZW50LlJFU0laRSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5faGlkZU1vZGFsID0gZnVuY3Rpb24gX2hpZGVNb2RhbCgpIHtcbiAgICAgICAgdmFyIF90aGlzNyA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHRydWUpO1xuXG4gICAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX3Nob3dCYWNrZHJvcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgJCQkMShkb2N1bWVudC5ib2R5KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuT1BFTik7XG5cbiAgICAgICAgICBfdGhpczcuX3Jlc2V0QWRqdXN0bWVudHMoKTtcblxuICAgICAgICAgIF90aGlzNy5fcmVzZXRTY3JvbGxiYXIoKTtcblxuICAgICAgICAgICQkJDEoX3RoaXM3Ll9lbGVtZW50KS50cmlnZ2VyKEV2ZW50LkhJRERFTik7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9yZW1vdmVCYWNrZHJvcCA9IGZ1bmN0aW9uIF9yZW1vdmVCYWNrZHJvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2JhY2tkcm9wKSB7XG4gICAgICAgICAgJCQkMSh0aGlzLl9iYWNrZHJvcCkucmVtb3ZlKCk7XG4gICAgICAgICAgdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX3Nob3dCYWNrZHJvcCA9IGZ1bmN0aW9uIF9zaG93QmFja2Ryb3AoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICAgICAgdmFyIGFuaW1hdGUgPSAkJCQxKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKSA/IENsYXNzTmFtZS5GQURFIDogJyc7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzU2hvd24gJiYgdGhpcy5fY29uZmlnLmJhY2tkcm9wKSB7XG4gICAgICAgICAgdGhpcy5fYmFja2Ryb3AgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSBDbGFzc05hbWUuQkFDS0RST1A7XG5cbiAgICAgICAgICBpZiAoYW5pbWF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NMaXN0LmFkZChhbmltYXRlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAkJCQxKHRoaXMuX2JhY2tkcm9wKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLm9uKEV2ZW50LkNMSUNLX0RJU01JU1MsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaWYgKF90aGlzOC5faWdub3JlQmFja2Ryb3BDbGljaykge1xuICAgICAgICAgICAgICBfdGhpczguX2lnbm9yZUJhY2tkcm9wQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKF90aGlzOC5fY29uZmlnLmJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgICAgICAgICBfdGhpczguX2VsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIF90aGlzOC5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoYW5pbWF0ZSkge1xuICAgICAgICAgICAgVXRpbC5yZWZsb3codGhpcy5fYmFja2Ryb3ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICQkJDEodGhpcy5fYmFja2Ryb3ApLmFkZENsYXNzKENsYXNzTmFtZS5TSE9XKTtcblxuICAgICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWFuaW1hdGUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGJhY2tkcm9wVHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9iYWNrZHJvcCk7XG4gICAgICAgICAgJCQkMSh0aGlzLl9iYWNrZHJvcCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNhbGxiYWNrKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChiYWNrZHJvcFRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzU2hvd24gJiYgdGhpcy5fYmFja2Ryb3ApIHtcbiAgICAgICAgICAkJCQxKHRoaXMuX2JhY2tkcm9wKS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG5cbiAgICAgICAgICB2YXIgY2FsbGJhY2tSZW1vdmUgPSBmdW5jdGlvbiBjYWxsYmFja1JlbW92ZSgpIHtcbiAgICAgICAgICAgIF90aGlzOC5fcmVtb3ZlQmFja2Ryb3AoKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICgkJCQxKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKSkge1xuICAgICAgICAgICAgdmFyIF9iYWNrZHJvcFRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fYmFja2Ryb3ApO1xuXG4gICAgICAgICAgICAkJCQxKHRoaXMuX2JhY2tkcm9wKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY2FsbGJhY2tSZW1vdmUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKF9iYWNrZHJvcFRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrUmVtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLy8gdGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIGhhbmRsZSBvdmVyZmxvd2luZyBtb2RhbHNcbiAgICAgIC8vIHRvZG8gKGZhdCk6IHRoZXNlIHNob3VsZCBwcm9iYWJseSBiZSByZWZhY3RvcmVkIG91dCBvZiBtb2RhbC5qc1xuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbiAgICAgIF9wcm90by5fYWRqdXN0RGlhbG9nID0gZnVuY3Rpb24gX2FkanVzdERpYWxvZygpIHtcbiAgICAgICAgdmFyIGlzTW9kYWxPdmVyZmxvd2luZyA9IHRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcblxuICAgICAgICBpZiAoIXRoaXMuX2lzQm9keU92ZXJmbG93aW5nICYmIGlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSB0aGlzLl9zY3JvbGxiYXJXaWR0aCArIFwicHhcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyAmJiAhaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSB0aGlzLl9zY3JvbGxiYXJXaWR0aCArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9yZXNldEFkanVzdG1lbnRzID0gZnVuY3Rpb24gX3Jlc2V0QWRqdXN0bWVudHMoKSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSAnJztcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnJztcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fY2hlY2tTY3JvbGxiYXIgPSBmdW5jdGlvbiBfY2hlY2tTY3JvbGxiYXIoKSB7XG4gICAgICAgIHZhciByZWN0ID0gZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgPSByZWN0LmxlZnQgKyByZWN0LnJpZ2h0IDwgd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgIHRoaXMuX3Njcm9sbGJhcldpZHRoID0gdGhpcy5fZ2V0U2Nyb2xsYmFyV2lkdGgoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fc2V0U2Nyb2xsYmFyID0gZnVuY3Rpb24gX3NldFNjcm9sbGJhcigpIHtcbiAgICAgICAgdmFyIF90aGlzOSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzQm9keU92ZXJmbG93aW5nKSB7XG4gICAgICAgICAgLy8gTm90ZTogRE9NTm9kZS5zdHlsZS5wYWRkaW5nUmlnaHQgcmV0dXJucyB0aGUgYWN0dWFsIHZhbHVlIG9yICcnIGlmIG5vdCBzZXRcbiAgICAgICAgICAvLyAgIHdoaWxlICQoRE9NTm9kZSkuY3NzKCdwYWRkaW5nLXJpZ2h0JykgcmV0dXJucyB0aGUgY2FsY3VsYXRlZCB2YWx1ZSBvciAwIGlmIG5vdCBzZXRcbiAgICAgICAgICB2YXIgZml4ZWRDb250ZW50ID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNlbGVjdG9yLkZJWEVEX0NPTlRFTlQpKTtcbiAgICAgICAgICB2YXIgc3RpY2t5Q29udGVudCA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTZWxlY3Rvci5TVElDS1lfQ09OVEVOVCkpOyAvLyBBZGp1c3QgZml4ZWQgY29udGVudCBwYWRkaW5nXG5cbiAgICAgICAgICAkJCQxKGZpeGVkQ29udGVudCkuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBhY3R1YWxQYWRkaW5nID0gZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQ7XG4gICAgICAgICAgICB2YXIgY2FsY3VsYXRlZFBhZGRpbmcgPSAkJCQxKGVsZW1lbnQpLmNzcygncGFkZGluZy1yaWdodCcpO1xuICAgICAgICAgICAgJCQkMShlbGVtZW50KS5kYXRhKCdwYWRkaW5nLXJpZ2h0JywgYWN0dWFsUGFkZGluZykuY3NzKCdwYWRkaW5nLXJpZ2h0JywgcGFyc2VGbG9hdChjYWxjdWxhdGVkUGFkZGluZykgKyBfdGhpczkuX3Njcm9sbGJhcldpZHRoICsgXCJweFwiKTtcbiAgICAgICAgICB9KTsgLy8gQWRqdXN0IHN0aWNreSBjb250ZW50IG1hcmdpblxuXG4gICAgICAgICAgJCQkMShzdGlja3lDb250ZW50KS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgICAgdmFyIGFjdHVhbE1hcmdpbiA9IGVsZW1lbnQuc3R5bGUubWFyZ2luUmlnaHQ7XG4gICAgICAgICAgICB2YXIgY2FsY3VsYXRlZE1hcmdpbiA9ICQkJDEoZWxlbWVudCkuY3NzKCdtYXJnaW4tcmlnaHQnKTtcbiAgICAgICAgICAgICQkJDEoZWxlbWVudCkuZGF0YSgnbWFyZ2luLXJpZ2h0JywgYWN0dWFsTWFyZ2luKS5jc3MoJ21hcmdpbi1yaWdodCcsIHBhcnNlRmxvYXQoY2FsY3VsYXRlZE1hcmdpbikgLSBfdGhpczkuX3Njcm9sbGJhcldpZHRoICsgXCJweFwiKTtcbiAgICAgICAgICB9KTsgLy8gQWRqdXN0IGJvZHkgcGFkZGluZ1xuXG4gICAgICAgICAgdmFyIGFjdHVhbFBhZGRpbmcgPSBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodDtcbiAgICAgICAgICB2YXIgY2FsY3VsYXRlZFBhZGRpbmcgPSAkJCQxKGRvY3VtZW50LmJvZHkpLmNzcygncGFkZGluZy1yaWdodCcpO1xuICAgICAgICAgICQkJDEoZG9jdW1lbnQuYm9keSkuZGF0YSgncGFkZGluZy1yaWdodCcsIGFjdHVhbFBhZGRpbmcpLmNzcygncGFkZGluZy1yaWdodCcsIHBhcnNlRmxvYXQoY2FsY3VsYXRlZFBhZGRpbmcpICsgdGhpcy5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCIpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX3Jlc2V0U2Nyb2xsYmFyID0gZnVuY3Rpb24gX3Jlc2V0U2Nyb2xsYmFyKCkge1xuICAgICAgICAvLyBSZXN0b3JlIGZpeGVkIGNvbnRlbnQgcGFkZGluZ1xuICAgICAgICB2YXIgZml4ZWRDb250ZW50ID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNlbGVjdG9yLkZJWEVEX0NPTlRFTlQpKTtcbiAgICAgICAgJCQkMShmaXhlZENvbnRlbnQpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIHBhZGRpbmcgPSAkJCQxKGVsZW1lbnQpLmRhdGEoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgICAkJCQxKGVsZW1lbnQpLnJlbW92ZURhdGEoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9IHBhZGRpbmcgPyBwYWRkaW5nIDogJyc7XG4gICAgICAgIH0pOyAvLyBSZXN0b3JlIHN0aWNreSBjb250ZW50XG5cbiAgICAgICAgdmFyIGVsZW1lbnRzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiXCIgKyBTZWxlY3Rvci5TVElDS1lfQ09OVEVOVCkpO1xuICAgICAgICAkJCQxKGVsZW1lbnRzKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgIHZhciBtYXJnaW4gPSAkJCQxKGVsZW1lbnQpLmRhdGEoJ21hcmdpbi1yaWdodCcpO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBtYXJnaW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAkJCQxKGVsZW1lbnQpLmNzcygnbWFyZ2luLXJpZ2h0JywgbWFyZ2luKS5yZW1vdmVEYXRhKCdtYXJnaW4tcmlnaHQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pOyAvLyBSZXN0b3JlIGJvZHkgcGFkZGluZ1xuXG4gICAgICAgIHZhciBwYWRkaW5nID0gJCQkMShkb2N1bWVudC5ib2R5KS5kYXRhKCdwYWRkaW5nLXJpZ2h0Jyk7XG4gICAgICAgICQkJDEoZG9jdW1lbnQuYm9keSkucmVtb3ZlRGF0YSgncGFkZGluZy1yaWdodCcpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHBhZGRpbmcgPyBwYWRkaW5nIDogJyc7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2dldFNjcm9sbGJhcldpZHRoID0gZnVuY3Rpb24gX2dldFNjcm9sbGJhcldpZHRoKCkge1xuICAgICAgICAvLyB0aHggZC53YWxzaFxuICAgICAgICB2YXIgc2Nyb2xsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHNjcm9sbERpdi5jbGFzc05hbWUgPSBDbGFzc05hbWUuU0NST0xMQkFSX01FQVNVUkVSO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcm9sbERpdik7XG4gICAgICAgIHZhciBzY3JvbGxiYXJXaWR0aCA9IHNjcm9sbERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIHNjcm9sbERpdi5jbGllbnRXaWR0aDtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzY3JvbGxEaXYpO1xuICAgICAgICByZXR1cm4gc2Nyb2xsYmFyV2lkdGg7XG4gICAgICB9OyAvLyBTdGF0aWNcblxuXG4gICAgICBNb2RhbC5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcsIHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgICAgdmFyIF9jb25maWcgPSBfb2JqZWN0U3ByZWFkKHt9LCBEZWZhdWx0LCAkJCQxKHRoaXMpLmRhdGEoKSwgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pO1xuXG4gICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0gbmV3IE1vZGFsKHRoaXMsIF9jb25maWcpO1xuICAgICAgICAgICAgJCQkMSh0aGlzKS5kYXRhKERBVEFfS0VZLCBkYXRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFxcXCJcIiArIGNvbmZpZyArIFwiXFxcIlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0YVtjb25maWddKHJlbGF0ZWRUYXJnZXQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoX2NvbmZpZy5zaG93KSB7XG4gICAgICAgICAgICBkYXRhLnNob3cocmVsYXRlZFRhcmdldCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIF9jcmVhdGVDbGFzcyhNb2RhbCwgbnVsbCwgW3tcbiAgICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIFZFUlNJT047XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1dKTtcblxuICAgICAgcmV0dXJuIE1vZGFsO1xuICAgIH0oKTtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG5cbiAgICAkJCQxKGRvY3VtZW50KS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIF90aGlzMTAgPSB0aGlzO1xuXG4gICAgICB2YXIgdGFyZ2V0O1xuICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMpO1xuXG4gICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb25maWcgPSAkJCQxKHRhcmdldCkuZGF0YShEQVRBX0tFWSkgPyAndG9nZ2xlJyA6IF9vYmplY3RTcHJlYWQoe30sICQkJDEodGFyZ2V0KS5kYXRhKCksICQkJDEodGhpcykuZGF0YSgpKTtcblxuICAgICAgaWYgKHRoaXMudGFnTmFtZSA9PT0gJ0EnIHx8IHRoaXMudGFnTmFtZSA9PT0gJ0FSRUEnKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIHZhciAkdGFyZ2V0ID0gJCQkMSh0YXJnZXQpLm9uZShFdmVudC5TSE9XLCBmdW5jdGlvbiAoc2hvd0V2ZW50KSB7XG4gICAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICAvLyBPbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgJHRhcmdldC5vbmUoRXZlbnQuSElEREVOLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCQkJDEoX3RoaXMxMCkuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgICAgICAgIF90aGlzMTAuZm9jdXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIE1vZGFsLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkJCQxKHRhcmdldCksIGNvbmZpZywgdGhpcyk7XG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogalF1ZXJ5XG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG5cbiAgICAkJCQxLmZuW05BTUVdID0gTW9kYWwuX2pRdWVyeUludGVyZmFjZTtcbiAgICAkJCQxLmZuW05BTUVdLkNvbnN0cnVjdG9yID0gTW9kYWw7XG5cbiAgICAkJCQxLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAkJCQxLmZuW05BTUVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgICAgcmV0dXJuIE1vZGFsLl9qUXVlcnlJbnRlcmZhY2U7XG4gICAgfTtcblxuICAgIHJldHVybiBNb2RhbDtcbiAgfSgkKTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwICh2NC4xLjIpOiB0b29sdGlwLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBUb29sdGlwID0gZnVuY3Rpb24gKCQkJDEpIHtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBDb25zdGFudHNcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cbiAgICB2YXIgTkFNRSA9ICd0b29sdGlwJztcbiAgICB2YXIgVkVSU0lPTiA9ICc0LjEuMic7XG4gICAgdmFyIERBVEFfS0VZID0gJ2JzLnRvb2x0aXAnO1xuICAgIHZhciBFVkVOVF9LRVkgPSBcIi5cIiArIERBVEFfS0VZO1xuICAgIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkJCQxLmZuW05BTUVdO1xuICAgIHZhciBDTEFTU19QUkVGSVggPSAnYnMtdG9vbHRpcCc7XG4gICAgdmFyIEJTQ0xTX1BSRUZJWF9SRUdFWCA9IG5ldyBSZWdFeHAoXCIoXnxcXFxccylcIiArIENMQVNTX1BSRUZJWCArIFwiXFxcXFMrXCIsICdnJyk7XG4gICAgdmFyIERlZmF1bHRUeXBlID0ge1xuICAgICAgYW5pbWF0aW9uOiAnYm9vbGVhbicsXG4gICAgICB0ZW1wbGF0ZTogJ3N0cmluZycsXG4gICAgICB0aXRsZTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknLFxuICAgICAgdHJpZ2dlcjogJ3N0cmluZycsXG4gICAgICBkZWxheTogJyhudW1iZXJ8b2JqZWN0KScsXG4gICAgICBodG1sOiAnYm9vbGVhbicsXG4gICAgICBzZWxlY3RvcjogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICAgICAgcGxhY2VtZW50OiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICAgICAgb2Zmc2V0OiAnKG51bWJlcnxzdHJpbmcpJyxcbiAgICAgIGNvbnRhaW5lcjogJyhzdHJpbmd8ZWxlbWVudHxib29sZWFuKScsXG4gICAgICBmYWxsYmFja1BsYWNlbWVudDogJyhzdHJpbmd8YXJyYXkpJyxcbiAgICAgIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KSdcbiAgICB9O1xuICAgIHZhciBBdHRhY2htZW50TWFwID0ge1xuICAgICAgQVVUTzogJ2F1dG8nLFxuICAgICAgVE9QOiAndG9wJyxcbiAgICAgIFJJR0hUOiAncmlnaHQnLFxuICAgICAgQk9UVE9NOiAnYm90dG9tJyxcbiAgICAgIExFRlQ6ICdsZWZ0J1xuICAgIH07XG4gICAgdmFyIERlZmF1bHQgPSB7XG4gICAgICBhbmltYXRpb246IHRydWUsXG4gICAgICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJ0b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj4nICsgJzxkaXYgY2xhc3M9XCJhcnJvd1wiPjwvZGl2PicgKyAnPGRpdiBjbGFzcz1cInRvb2x0aXAtaW5uZXJcIj48L2Rpdj48L2Rpdj4nLFxuICAgICAgdHJpZ2dlcjogJ2hvdmVyIGZvY3VzJyxcbiAgICAgIHRpdGxlOiAnJyxcbiAgICAgIGRlbGF5OiAwLFxuICAgICAgaHRtbDogZmFsc2UsXG4gICAgICBzZWxlY3RvcjogZmFsc2UsXG4gICAgICBwbGFjZW1lbnQ6ICd0b3AnLFxuICAgICAgb2Zmc2V0OiAwLFxuICAgICAgY29udGFpbmVyOiBmYWxzZSxcbiAgICAgIGZhbGxiYWNrUGxhY2VtZW50OiAnZmxpcCcsXG4gICAgICBib3VuZGFyeTogJ3Njcm9sbFBhcmVudCdcbiAgICB9O1xuICAgIHZhciBIb3ZlclN0YXRlID0ge1xuICAgICAgU0hPVzogJ3Nob3cnLFxuICAgICAgT1VUOiAnb3V0J1xuICAgIH07XG4gICAgdmFyIEV2ZW50ID0ge1xuICAgICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVksXG4gICAgICBISURERU46IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVksXG4gICAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSxcbiAgICAgIFNIT1dOOiBcInNob3duXCIgKyBFVkVOVF9LRVksXG4gICAgICBJTlNFUlRFRDogXCJpbnNlcnRlZFwiICsgRVZFTlRfS0VZLFxuICAgICAgQ0xJQ0s6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSxcbiAgICAgIEZPQ1VTSU46IFwiZm9jdXNpblwiICsgRVZFTlRfS0VZLFxuICAgICAgRk9DVVNPVVQ6IFwiZm9jdXNvdXRcIiArIEVWRU5UX0tFWSxcbiAgICAgIE1PVVNFRU5URVI6IFwibW91c2VlbnRlclwiICsgRVZFTlRfS0VZLFxuICAgICAgTU9VU0VMRUFWRTogXCJtb3VzZWxlYXZlXCIgKyBFVkVOVF9LRVlcbiAgICB9O1xuICAgIHZhciBDbGFzc05hbWUgPSB7XG4gICAgICBGQURFOiAnZmFkZScsXG4gICAgICBTSE9XOiAnc2hvdydcbiAgICB9O1xuICAgIHZhciBTZWxlY3RvciA9IHtcbiAgICAgIFRPT0xUSVA6ICcudG9vbHRpcCcsXG4gICAgICBUT09MVElQX0lOTkVSOiAnLnRvb2x0aXAtaW5uZXInLFxuICAgICAgQVJST1c6ICcuYXJyb3cnXG4gICAgfTtcbiAgICB2YXIgVHJpZ2dlciA9IHtcbiAgICAgIEhPVkVSOiAnaG92ZXInLFxuICAgICAgRk9DVVM6ICdmb2N1cycsXG4gICAgICBDTElDSzogJ2NsaWNrJyxcbiAgICAgIE1BTlVBTDogJ21hbnVhbCdcbiAgICAgIC8qKlxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAqL1xuXG4gICAgfTtcblxuICAgIHZhciBUb29sdGlwID1cbiAgICAvKiNfX1BVUkVfXyovXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gVG9vbHRpcChlbGVtZW50LCBjb25maWcpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIGZvciBQb3BwZXIgZGVwZW5kZW5jeVxuICAgICAgICAgKiBQb3BwZXIgLSBodHRwczovL3BvcHBlci5qcy5vcmdcbiAgICAgICAgICovXG4gICAgICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Jvb3RzdHJhcCB0b29sdGlwcyByZXF1aXJlIFBvcHBlci5qcyAoaHR0cHM6Ly9wb3BwZXIuanMub3JnKScpO1xuICAgICAgICB9IC8vIHByaXZhdGVcblxuXG4gICAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSAwO1xuICAgICAgICB0aGlzLl9ob3ZlclN0YXRlID0gJyc7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIgPSB7fTtcbiAgICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDsgLy8gUHJvdGVjdGVkXG5cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgICAgdGhpcy50aXAgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3NldExpc3RlbmVycygpO1xuICAgICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgICAgdmFyIF9wcm90byA9IFRvb2x0aXAucHJvdG90eXBlO1xuXG4gICAgICAvLyBQdWJsaWNcbiAgICAgIF9wcm90by5lbmFibGUgPSBmdW5jdGlvbiBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uZGlzYWJsZSA9IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnRvZ2dsZUVuYWJsZWQgPSBmdW5jdGlvbiB0b2dnbGVFbmFibGVkKCkge1xuICAgICAgICB0aGlzLl9pc0VuYWJsZWQgPSAhdGhpcy5faXNFbmFibGVkO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZShldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHZhciBkYXRhS2V5ID0gdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTtcbiAgICAgICAgICB2YXIgY29udGV4dCA9ICQkJDEoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5KTtcblxuICAgICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgICAgY29udGV4dCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGV2ZW50LmN1cnJlbnRUYXJnZXQsIHRoaXMuX2dldERlbGVnYXRlQ29uZmlnKCkpO1xuICAgICAgICAgICAgJCQkMShldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXksIGNvbnRleHQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXIuY2xpY2sgPSAhY29udGV4dC5fYWN0aXZlVHJpZ2dlci5jbGljaztcblxuICAgICAgICAgIGlmIChjb250ZXh0Ll9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgICAgIGNvbnRleHQuX2VudGVyKG51bGwsIGNvbnRleHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZXh0Ll9sZWF2ZShudWxsLCBjb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCQkJDEodGhpcy5nZXRUaXBFbGVtZW50KCkpLmhhc0NsYXNzKENsYXNzTmFtZS5TSE9XKSkge1xuICAgICAgICAgICAgdGhpcy5fbGVhdmUobnVsbCwgdGhpcyk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9lbnRlcihudWxsLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgICAgICQkJDEucmVtb3ZlRGF0YSh0aGlzLmVsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVkpO1xuICAgICAgICAkJCQxKHRoaXMuZWxlbWVudCkub2ZmKHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKTtcbiAgICAgICAgJCQkMSh0aGlzLmVsZW1lbnQpLmNsb3Nlc3QoJy5tb2RhbCcpLm9mZignaGlkZS5icy5tb2RhbCcpO1xuXG4gICAgICAgIGlmICh0aGlzLnRpcCkge1xuICAgICAgICAgICQkJDEodGhpcy50aXApLnJlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faXNFbmFibGVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdGltZW91dCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2hvdmVyU3RhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5fcG9wcGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuY29uZmlnID0gbnVsbDtcbiAgICAgICAgdGhpcy50aXAgPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnNob3cgPSBmdW5jdGlvbiBzaG93KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIGlmICgkJCQxKHRoaXMuZWxlbWVudCkuY3NzKCdkaXNwbGF5JykgPT09ICdub25lJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHVzZSBzaG93IG9uIHZpc2libGUgZWxlbWVudHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaG93RXZlbnQgPSAkJCQxLkV2ZW50KHRoaXMuY29uc3RydWN0b3IuRXZlbnQuU0hPVyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNXaXRoQ29udGVudCgpICYmIHRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgICAgICQkJDEodGhpcy5lbGVtZW50KS50cmlnZ2VyKHNob3dFdmVudCk7XG4gICAgICAgICAgdmFyIGlzSW5UaGVEb20gPSAkJCQxLmNvbnRhaW5zKHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgdGhpcy5lbGVtZW50KTtcblxuICAgICAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgfHwgIWlzSW5UaGVEb20pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgdGlwID0gdGhpcy5nZXRUaXBFbGVtZW50KCk7XG4gICAgICAgICAgdmFyIHRpcElkID0gVXRpbC5nZXRVSUQodGhpcy5jb25zdHJ1Y3Rvci5OQU1FKTtcbiAgICAgICAgICB0aXAuc2V0QXR0cmlidXRlKCdpZCcsIHRpcElkKTtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JywgdGlwSWQpO1xuICAgICAgICAgIHRoaXMuc2V0Q29udGVudCgpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgICAgICAgJCQkMSh0aXApLmFkZENsYXNzKENsYXNzTmFtZS5GQURFKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcGxhY2VtZW50ID0gdHlwZW9mIHRoaXMuY29uZmlnLnBsYWNlbWVudCA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuY29uZmlnLnBsYWNlbWVudC5jYWxsKHRoaXMsIHRpcCwgdGhpcy5lbGVtZW50KSA6IHRoaXMuY29uZmlnLnBsYWNlbWVudDtcblxuICAgICAgICAgIHZhciBhdHRhY2htZW50ID0gdGhpcy5fZ2V0QXR0YWNobWVudChwbGFjZW1lbnQpO1xuXG4gICAgICAgICAgdGhpcy5hZGRBdHRhY2htZW50Q2xhc3MoYXR0YWNobWVudCk7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29uZmlnLmNvbnRhaW5lciA9PT0gZmFsc2UgPyBkb2N1bWVudC5ib2R5IDogJCQkMShkb2N1bWVudCkuZmluZCh0aGlzLmNvbmZpZy5jb250YWluZXIpO1xuICAgICAgICAgICQkJDEodGlwKS5kYXRhKHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVksIHRoaXMpO1xuXG4gICAgICAgICAgaWYgKCEkJCQxLmNvbnRhaW5zKHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgdGhpcy50aXApKSB7XG4gICAgICAgICAgICAkJCQxKHRpcCkuYXBwZW5kVG8oY29udGFpbmVyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAkJCQxKHRoaXMuZWxlbWVudCkudHJpZ2dlcih0aGlzLmNvbnN0cnVjdG9yLkV2ZW50LklOU0VSVEVEKTtcbiAgICAgICAgICB0aGlzLl9wb3BwZXIgPSBuZXcgUG9wcGVyKHRoaXMuZWxlbWVudCwgdGlwLCB7XG4gICAgICAgICAgICBwbGFjZW1lbnQ6IGF0dGFjaG1lbnQsXG4gICAgICAgICAgICBtb2RpZmllcnM6IHtcbiAgICAgICAgICAgICAgb2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLmNvbmZpZy5vZmZzZXRcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZmxpcDoge1xuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB0aGlzLmNvbmZpZy5mYWxsYmFja1BsYWNlbWVudFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhcnJvdzoge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IFNlbGVjdG9yLkFSUk9XXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHByZXZlbnRPdmVyZmxvdzoge1xuICAgICAgICAgICAgICAgIGJvdW5kYXJpZXNFbGVtZW50OiB0aGlzLmNvbmZpZy5ib3VuZGFyeVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DcmVhdGU6IGZ1bmN0aW9uIG9uQ3JlYXRlKGRhdGEpIHtcbiAgICAgICAgICAgICAgaWYgKGRhdGEub3JpZ2luYWxQbGFjZW1lbnQgIT09IGRhdGEucGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZShkYXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uVXBkYXRlOiBmdW5jdGlvbiBvblVwZGF0ZShkYXRhKSB7XG4gICAgICAgICAgICAgIF90aGlzLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgJCQkMSh0aXApLmFkZENsYXNzKENsYXNzTmFtZS5TSE9XKTsgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgICAgICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgICAgICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAgICAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcblxuICAgICAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICQkJDEoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vbignbW91c2VvdmVyJywgbnVsbCwgJCQkMS5ub29wKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5jb25maWcuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgIF90aGlzLl9maXhUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBwcmV2SG92ZXJTdGF0ZSA9IF90aGlzLl9ob3ZlclN0YXRlO1xuICAgICAgICAgICAgX3RoaXMuX2hvdmVyU3RhdGUgPSBudWxsO1xuICAgICAgICAgICAgJCQkMShfdGhpcy5lbGVtZW50KS50cmlnZ2VyKF90aGlzLmNvbnN0cnVjdG9yLkV2ZW50LlNIT1dOKTtcblxuICAgICAgICAgICAgaWYgKHByZXZIb3ZlclN0YXRlID09PSBIb3ZlclN0YXRlLk9VVCkge1xuICAgICAgICAgICAgICBfdGhpcy5fbGVhdmUobnVsbCwgX3RoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoJCQkMSh0aGlzLnRpcCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLkZBREUpKSB7XG4gICAgICAgICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLnRpcCk7XG4gICAgICAgICAgICAkJCQxKHRoaXMudGlwKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uaGlkZSA9IGZ1bmN0aW9uIGhpZGUoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIHRpcCA9IHRoaXMuZ2V0VGlwRWxlbWVudCgpO1xuICAgICAgICB2YXIgaGlkZUV2ZW50ID0gJCQkMS5FdmVudCh0aGlzLmNvbnN0cnVjdG9yLkV2ZW50LkhJREUpO1xuXG4gICAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICAgIGlmIChfdGhpczIuX2hvdmVyU3RhdGUgIT09IEhvdmVyU3RhdGUuU0hPVyAmJiB0aXAucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGlwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGlwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczIuX2NsZWFuVGlwQ2xhc3MoKTtcblxuICAgICAgICAgIF90aGlzMi5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpO1xuXG4gICAgICAgICAgJCQkMShfdGhpczIuZWxlbWVudCkudHJpZ2dlcihfdGhpczIuY29uc3RydWN0b3IuRXZlbnQuSElEREVOKTtcblxuICAgICAgICAgIGlmIChfdGhpczIuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgX3RoaXMyLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgJCQkMSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIoaGlkZUV2ZW50KTtcblxuICAgICAgICBpZiAoaGlkZUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgJCQkMSh0aXApLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5TSE9XKTsgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIHJlbW92ZSB0aGUgZXh0cmFcbiAgICAgICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcblxuICAgICAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICAgICAgJCQkMShkb2N1bWVudC5ib2R5KS5jaGlsZHJlbigpLm9mZignbW91c2VvdmVyJywgbnVsbCwgJCQkMS5ub29wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVHJpZ2dlci5DTElDS10gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUcmlnZ2VyLkZPQ1VTXSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RyaWdnZXIuSE9WRVJdID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCQkJDEodGhpcy50aXApLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKSkge1xuICAgICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRpcCk7XG4gICAgICAgICAgJCQkMSh0aXApLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faG92ZXJTdGF0ZSA9ICcnO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX3BvcHBlci5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9OyAvLyBQcm90ZWN0ZWRcblxuXG4gICAgICBfcHJvdG8uaXNXaXRoQ29udGVudCA9IGZ1bmN0aW9uIGlzV2l0aENvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuZ2V0VGl0bGUoKSk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uYWRkQXR0YWNobWVudENsYXNzID0gZnVuY3Rpb24gYWRkQXR0YWNobWVudENsYXNzKGF0dGFjaG1lbnQpIHtcbiAgICAgICAgJCQkMSh0aGlzLmdldFRpcEVsZW1lbnQoKSkuYWRkQ2xhc3MoQ0xBU1NfUFJFRklYICsgXCItXCIgKyBhdHRhY2htZW50KTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5nZXRUaXBFbGVtZW50ID0gZnVuY3Rpb24gZ2V0VGlwRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy50aXAgPSB0aGlzLnRpcCB8fCAkJCQxKHRoaXMuY29uZmlnLnRlbXBsYXRlKVswXTtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlwO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnNldENvbnRlbnQgPSBmdW5jdGlvbiBzZXRDb250ZW50KCkge1xuICAgICAgICB2YXIgdGlwID0gdGhpcy5nZXRUaXBFbGVtZW50KCk7XG4gICAgICAgIHRoaXMuc2V0RWxlbWVudENvbnRlbnQoJCQkMSh0aXAucXVlcnlTZWxlY3RvckFsbChTZWxlY3Rvci5UT09MVElQX0lOTkVSKSksIHRoaXMuZ2V0VGl0bGUoKSk7XG4gICAgICAgICQkJDEodGlwKS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuRkFERSArIFwiIFwiICsgQ2xhc3NOYW1lLlNIT1cpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnNldEVsZW1lbnRDb250ZW50ID0gZnVuY3Rpb24gc2V0RWxlbWVudENvbnRlbnQoJGVsZW1lbnQsIGNvbnRlbnQpIHtcbiAgICAgICAgdmFyIGh0bWwgPSB0aGlzLmNvbmZpZy5odG1sO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ29iamVjdCcgJiYgKGNvbnRlbnQubm9kZVR5cGUgfHwgY29udGVudC5qcXVlcnkpKSB7XG4gICAgICAgICAgLy8gQ29udGVudCBpcyBhIERPTSBub2RlIG9yIGEgalF1ZXJ5XG4gICAgICAgICAgaWYgKGh0bWwpIHtcbiAgICAgICAgICAgIGlmICghJCQkMShjb250ZW50KS5wYXJlbnQoKS5pcygkZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgJGVsZW1lbnQuZW1wdHkoKS5hcHBlbmQoY29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRlbGVtZW50LnRleHQoJCQkMShjb250ZW50KS50ZXh0KCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkZWxlbWVudFtodG1sID8gJ2h0bWwnIDogJ3RleHQnXShjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmdldFRpdGxlID0gZnVuY3Rpb24gZ2V0VGl0bGUoKSB7XG4gICAgICAgIHZhciB0aXRsZSA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnKTtcblxuICAgICAgICBpZiAoIXRpdGxlKSB7XG4gICAgICAgICAgdGl0bGUgPSB0eXBlb2YgdGhpcy5jb25maWcudGl0bGUgPT09ICdmdW5jdGlvbicgPyB0aGlzLmNvbmZpZy50aXRsZS5jYWxsKHRoaXMuZWxlbWVudCkgOiB0aGlzLmNvbmZpZy50aXRsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aXRsZTtcbiAgICAgIH07IC8vIFByaXZhdGVcblxuXG4gICAgICBfcHJvdG8uX2dldEF0dGFjaG1lbnQgPSBmdW5jdGlvbiBfZ2V0QXR0YWNobWVudChwbGFjZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIEF0dGFjaG1lbnRNYXBbcGxhY2VtZW50LnRvVXBwZXJDYXNlKCldO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9zZXRMaXN0ZW5lcnMgPSBmdW5jdGlvbiBfc2V0TGlzdGVuZXJzKCkge1xuICAgICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgICB2YXIgdHJpZ2dlcnMgPSB0aGlzLmNvbmZpZy50cmlnZ2VyLnNwbGl0KCcgJyk7XG4gICAgICAgIHRyaWdnZXJzLmZvckVhY2goZnVuY3Rpb24gKHRyaWdnZXIpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgICAgICAgJCQkMShfdGhpczMuZWxlbWVudCkub24oX3RoaXMzLmNvbnN0cnVjdG9yLkV2ZW50LkNMSUNLLCBfdGhpczMuY29uZmlnLnNlbGVjdG9yLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy50b2dnbGUoZXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyICE9PSBUcmlnZ2VyLk1BTlVBTCkge1xuICAgICAgICAgICAgdmFyIGV2ZW50SW4gPSB0cmlnZ2VyID09PSBUcmlnZ2VyLkhPVkVSID8gX3RoaXMzLmNvbnN0cnVjdG9yLkV2ZW50Lk1PVVNFRU5URVIgOiBfdGhpczMuY29uc3RydWN0b3IuRXZlbnQuRk9DVVNJTjtcbiAgICAgICAgICAgIHZhciBldmVudE91dCA9IHRyaWdnZXIgPT09IFRyaWdnZXIuSE9WRVIgPyBfdGhpczMuY29uc3RydWN0b3IuRXZlbnQuTU9VU0VMRUFWRSA6IF90aGlzMy5jb25zdHJ1Y3Rvci5FdmVudC5GT0NVU09VVDtcbiAgICAgICAgICAgICQkJDEoX3RoaXMzLmVsZW1lbnQpLm9uKGV2ZW50SW4sIF90aGlzMy5jb25maWcuc2VsZWN0b3IsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzLl9lbnRlcihldmVudCk7XG4gICAgICAgICAgICB9KS5vbihldmVudE91dCwgX3RoaXMzLmNvbmZpZy5zZWxlY3RvciwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczMuX2xlYXZlKGV2ZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICQkJDEoX3RoaXMzLmVsZW1lbnQpLmNsb3Nlc3QoJy5tb2RhbCcpLm9uKCdoaWRlLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5oaWRlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5zZWxlY3Rvcikge1xuICAgICAgICAgIHRoaXMuY29uZmlnID0gX29iamVjdFNwcmVhZCh7fSwgdGhpcy5jb25maWcsIHtcbiAgICAgICAgICAgIHRyaWdnZXI6ICdtYW51YWwnLFxuICAgICAgICAgICAgc2VsZWN0b3I6ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fZml4VGl0bGUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9maXhUaXRsZSA9IGZ1bmN0aW9uIF9maXhUaXRsZSgpIHtcbiAgICAgICAgdmFyIHRpdGxlVHlwZSA9IHR5cGVvZiB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbmFsLXRpdGxlJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJykgfHwgdGl0bGVUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnLCB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpIHx8ICcnKTtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICcnKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9lbnRlciA9IGZ1bmN0aW9uIF9lbnRlcihldmVudCwgY29udGV4dCkge1xuICAgICAgICB2YXIgZGF0YUtleSA9IHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVk7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8ICQkJDEoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5KTtcblxuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICBjb250ZXh0ID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZXZlbnQuY3VycmVudFRhcmdldCwgdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSk7XG4gICAgICAgICAgJCQkMShldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXksIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltldmVudC50eXBlID09PSAnZm9jdXNpbicgPyBUcmlnZ2VyLkZPQ1VTIDogVHJpZ2dlci5IT1ZFUl0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCQkJDEoY29udGV4dC5nZXRUaXBFbGVtZW50KCkpLmhhc0NsYXNzKENsYXNzTmFtZS5TSE9XKSB8fCBjb250ZXh0Ll9ob3ZlclN0YXRlID09PSBIb3ZlclN0YXRlLlNIT1cpIHtcbiAgICAgICAgICBjb250ZXh0Ll9ob3ZlclN0YXRlID0gSG92ZXJTdGF0ZS5TSE9XO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsZWFyVGltZW91dChjb250ZXh0Ll90aW1lb3V0KTtcbiAgICAgICAgY29udGV4dC5faG92ZXJTdGF0ZSA9IEhvdmVyU3RhdGUuU0hPVztcblxuICAgICAgICBpZiAoIWNvbnRleHQuY29uZmlnLmRlbGF5IHx8ICFjb250ZXh0LmNvbmZpZy5kZWxheS5zaG93KSB7XG4gICAgICAgICAgY29udGV4dC5zaG93KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChjb250ZXh0Ll9ob3ZlclN0YXRlID09PSBIb3ZlclN0YXRlLlNIT1cpIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2hvdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgY29udGV4dC5jb25maWcuZGVsYXkuc2hvdyk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2xlYXZlID0gZnVuY3Rpb24gX2xlYXZlKGV2ZW50LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBkYXRhS2V5ID0gdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgJCQkMShldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXkpO1xuXG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgIGNvbnRleHQgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihldmVudC5jdXJyZW50VGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKTtcbiAgICAgICAgICAkJCQxKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoZGF0YUtleSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c291dCcgPyBUcmlnZ2VyLkZPQ1VTIDogVHJpZ2dlci5IT1ZFUl0gPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Ll9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjbGVhclRpbWVvdXQoY29udGV4dC5fdGltZW91dCk7XG4gICAgICAgIGNvbnRleHQuX2hvdmVyU3RhdGUgPSBIb3ZlclN0YXRlLk9VVDtcblxuICAgICAgICBpZiAoIWNvbnRleHQuY29uZmlnLmRlbGF5IHx8ICFjb250ZXh0LmNvbmZpZy5kZWxheS5oaWRlKSB7XG4gICAgICAgICAgY29udGV4dC5oaWRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChjb250ZXh0Ll9ob3ZlclN0YXRlID09PSBIb3ZlclN0YXRlLk9VVCkge1xuICAgICAgICAgICAgY29udGV4dC5oaWRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBjb250ZXh0LmNvbmZpZy5kZWxheS5oaWRlKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5faXNXaXRoQWN0aXZlVHJpZ2dlciA9IGZ1bmN0aW9uIF9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkge1xuICAgICAgICBmb3IgKHZhciB0cmlnZ2VyIGluIHRoaXMuX2FjdGl2ZVRyaWdnZXIpIHtcbiAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlVHJpZ2dlclt0cmlnZ2VyXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgICBjb25maWcgPSBfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHQsICQkJDEodGhpcy5lbGVtZW50KS5kYXRhKCksIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KTtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5kZWxheSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBjb25maWcuZGVsYXkgPSB7XG4gICAgICAgICAgICBzaG93OiBjb25maWcuZGVsYXksXG4gICAgICAgICAgICBoaWRlOiBjb25maWcuZGVsYXlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcudGl0bGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgY29uZmlnLnRpdGxlID0gY29uZmlnLnRpdGxlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5jb250ZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGNvbmZpZy5jb250ZW50ID0gY29uZmlnLmNvbnRlbnQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUsIGNvbmZpZywgdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSk7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2dldERlbGVnYXRlQ29uZmlnID0gZnVuY3Rpb24gX2dldERlbGVnYXRlQ29uZmlnKCkge1xuICAgICAgICB2YXIgY29uZmlnID0ge307XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuY29uZmlnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0W2tleV0gIT09IHRoaXMuY29uZmlnW2tleV0pIHtcbiAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSB0aGlzLmNvbmZpZ1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2NsZWFuVGlwQ2xhc3MgPSBmdW5jdGlvbiBfY2xlYW5UaXBDbGFzcygpIHtcbiAgICAgICAgdmFyICR0aXAgPSAkJCQxKHRoaXMuZ2V0VGlwRWxlbWVudCgpKTtcbiAgICAgICAgdmFyIHRhYkNsYXNzID0gJHRpcC5hdHRyKCdjbGFzcycpLm1hdGNoKEJTQ0xTX1BSRUZJWF9SRUdFWCk7XG5cbiAgICAgICAgaWYgKHRhYkNsYXNzICE9PSBudWxsICYmIHRhYkNsYXNzLmxlbmd0aCkge1xuICAgICAgICAgICR0aXAucmVtb3ZlQ2xhc3ModGFiQ2xhc3Muam9pbignJykpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZSA9IGZ1bmN0aW9uIF9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UocG9wcGVyRGF0YSkge1xuICAgICAgICB2YXIgcG9wcGVySW5zdGFuY2UgPSBwb3BwZXJEYXRhLmluc3RhbmNlO1xuICAgICAgICB0aGlzLnRpcCA9IHBvcHBlckluc3RhbmNlLnBvcHBlcjtcblxuICAgICAgICB0aGlzLl9jbGVhblRpcENsYXNzKCk7XG5cbiAgICAgICAgdGhpcy5hZGRBdHRhY2htZW50Q2xhc3ModGhpcy5fZ2V0QXR0YWNobWVudChwb3BwZXJEYXRhLnBsYWNlbWVudCkpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9maXhUcmFuc2l0aW9uID0gZnVuY3Rpb24gX2ZpeFRyYW5zaXRpb24oKSB7XG4gICAgICAgIHZhciB0aXAgPSB0aGlzLmdldFRpcEVsZW1lbnQoKTtcbiAgICAgICAgdmFyIGluaXRDb25maWdBbmltYXRpb24gPSB0aGlzLmNvbmZpZy5hbmltYXRpb247XG5cbiAgICAgICAgaWYgKHRpcC5nZXRBdHRyaWJ1dGUoJ3gtcGxhY2VtZW50JykgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAkJCQxKHRpcCkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLkZBREUpO1xuICAgICAgICB0aGlzLmNvbmZpZy5hbmltYXRpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICB0aGlzLmNvbmZpZy5hbmltYXRpb24gPSBpbml0Q29uZmlnQW5pbWF0aW9uO1xuICAgICAgfTsgLy8gU3RhdGljXG5cblxuICAgICAgVG9vbHRpcC5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWc7XG5cbiAgICAgICAgICBpZiAoIWRhdGEgJiYgL2Rpc3Bvc2V8aGlkZS8udGVzdChjb25maWcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0gbmV3IFRvb2x0aXAodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgICAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX2NyZWF0ZUNsYXNzKFRvb2x0aXAsIG51bGwsIFt7XG4gICAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBWRVJTSU9OO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBEZWZhdWx0O1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJOQU1FXCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBOQU1FO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJEQVRBX0tFWVwiLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gREFUQV9LRVk7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkV2ZW50XCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBFdmVudDtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBrZXk6IFwiRVZFTlRfS0VZXCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBFVkVOVF9LRVk7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkRlZmF1bHRUeXBlXCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBEZWZhdWx0VHlwZTtcbiAgICAgICAgfVxuICAgICAgfV0pO1xuXG4gICAgICByZXR1cm4gVG9vbHRpcDtcbiAgICB9KCk7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogalF1ZXJ5XG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG5cblxuICAgICQkJDEuZm5bTkFNRV0gPSBUb29sdGlwLl9qUXVlcnlJbnRlcmZhY2U7XG4gICAgJCQkMS5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IFRvb2x0aXA7XG5cbiAgICAkJCQxLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAkJCQxLmZuW05BTUVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgICAgcmV0dXJuIFRvb2x0aXAuX2pRdWVyeUludGVyZmFjZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRvb2x0aXA7XG4gIH0oJCwgUG9wcGVyKTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwICh2NC4xLjIpOiBwb3BvdmVyLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBQb3BvdmVyID0gZnVuY3Rpb24gKCQkJDEpIHtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBDb25zdGFudHNcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cbiAgICB2YXIgTkFNRSA9ICdwb3BvdmVyJztcbiAgICB2YXIgVkVSU0lPTiA9ICc0LjEuMic7XG4gICAgdmFyIERBVEFfS0VZID0gJ2JzLnBvcG92ZXInO1xuICAgIHZhciBFVkVOVF9LRVkgPSBcIi5cIiArIERBVEFfS0VZO1xuICAgIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkJCQxLmZuW05BTUVdO1xuICAgIHZhciBDTEFTU19QUkVGSVggPSAnYnMtcG9wb3Zlcic7XG4gICAgdmFyIEJTQ0xTX1BSRUZJWF9SRUdFWCA9IG5ldyBSZWdFeHAoXCIoXnxcXFxccylcIiArIENMQVNTX1BSRUZJWCArIFwiXFxcXFMrXCIsICdnJyk7XG5cbiAgICB2YXIgRGVmYXVsdCA9IF9vYmplY3RTcHJlYWQoe30sIFRvb2x0aXAuRGVmYXVsdCwge1xuICAgICAgcGxhY2VtZW50OiAncmlnaHQnLFxuICAgICAgdHJpZ2dlcjogJ2NsaWNrJyxcbiAgICAgIGNvbnRlbnQ6ICcnLFxuICAgICAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+JyArICc8ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj4nICsgJzxoMyBjbGFzcz1cInBvcG92ZXItaGVhZGVyXCI+PC9oMz4nICsgJzxkaXYgY2xhc3M9XCJwb3BvdmVyLWJvZHlcIj48L2Rpdj48L2Rpdj4nXG4gICAgfSk7XG5cbiAgICB2YXIgRGVmYXVsdFR5cGUgPSBfb2JqZWN0U3ByZWFkKHt9LCBUb29sdGlwLkRlZmF1bHRUeXBlLCB7XG4gICAgICBjb250ZW50OiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKSdcbiAgICB9KTtcblxuICAgIHZhciBDbGFzc05hbWUgPSB7XG4gICAgICBGQURFOiAnZmFkZScsXG4gICAgICBTSE9XOiAnc2hvdydcbiAgICB9O1xuICAgIHZhciBTZWxlY3RvciA9IHtcbiAgICAgIFRJVExFOiAnLnBvcG92ZXItaGVhZGVyJyxcbiAgICAgIENPTlRFTlQ6ICcucG9wb3Zlci1ib2R5J1xuICAgIH07XG4gICAgdmFyIEV2ZW50ID0ge1xuICAgICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVksXG4gICAgICBISURERU46IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVksXG4gICAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSxcbiAgICAgIFNIT1dOOiBcInNob3duXCIgKyBFVkVOVF9LRVksXG4gICAgICBJTlNFUlRFRDogXCJpbnNlcnRlZFwiICsgRVZFTlRfS0VZLFxuICAgICAgQ0xJQ0s6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSxcbiAgICAgIEZPQ1VTSU46IFwiZm9jdXNpblwiICsgRVZFTlRfS0VZLFxuICAgICAgRk9DVVNPVVQ6IFwiZm9jdXNvdXRcIiArIEVWRU5UX0tFWSxcbiAgICAgIE1PVVNFRU5URVI6IFwibW91c2VlbnRlclwiICsgRVZFTlRfS0VZLFxuICAgICAgTU9VU0VMRUFWRTogXCJtb3VzZWxlYXZlXCIgKyBFVkVOVF9LRVlcbiAgICAgIC8qKlxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAqL1xuXG4gICAgfTtcblxuICAgIHZhciBQb3BvdmVyID1cbiAgICAvKiNfX1BVUkVfXyovXG4gICAgZnVuY3Rpb24gKF9Ub29sdGlwKSB7XG4gICAgICBfaW5oZXJpdHNMb29zZShQb3BvdmVyLCBfVG9vbHRpcCk7XG5cbiAgICAgIGZ1bmN0aW9uIFBvcG92ZXIoKSB7XG4gICAgICAgIHJldHVybiBfVG9vbHRpcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBfcHJvdG8gPSBQb3BvdmVyLnByb3RvdHlwZTtcblxuICAgICAgLy8gT3ZlcnJpZGVzXG4gICAgICBfcHJvdG8uaXNXaXRoQ29udGVudCA9IGZ1bmN0aW9uIGlzV2l0aENvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRpdGxlKCkgfHwgdGhpcy5fZ2V0Q29udGVudCgpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmFkZEF0dGFjaG1lbnRDbGFzcyA9IGZ1bmN0aW9uIGFkZEF0dGFjaG1lbnRDbGFzcyhhdHRhY2htZW50KSB7XG4gICAgICAgICQkJDEodGhpcy5nZXRUaXBFbGVtZW50KCkpLmFkZENsYXNzKENMQVNTX1BSRUZJWCArIFwiLVwiICsgYXR0YWNobWVudCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uZ2V0VGlwRWxlbWVudCA9IGZ1bmN0aW9uIGdldFRpcEVsZW1lbnQoKSB7XG4gICAgICAgIHRoaXMudGlwID0gdGhpcy50aXAgfHwgJCQkMSh0aGlzLmNvbmZpZy50ZW1wbGF0ZSlbMF07XG4gICAgICAgIHJldHVybiB0aGlzLnRpcDtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5zZXRDb250ZW50ID0gZnVuY3Rpb24gc2V0Q29udGVudCgpIHtcbiAgICAgICAgdmFyICR0aXAgPSAkJCQxKHRoaXMuZ2V0VGlwRWxlbWVudCgpKTsgLy8gV2UgdXNlIGFwcGVuZCBmb3IgaHRtbCBvYmplY3RzIHRvIG1haW50YWluIGpzIGV2ZW50c1xuXG4gICAgICAgIHRoaXMuc2V0RWxlbWVudENvbnRlbnQoJHRpcC5maW5kKFNlbGVjdG9yLlRJVExFKSwgdGhpcy5nZXRUaXRsZSgpKTtcblxuICAgICAgICB2YXIgY29udGVudCA9IHRoaXMuX2dldENvbnRlbnQoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb250ZW50ID0gY29udGVudC5jYWxsKHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldEVsZW1lbnRDb250ZW50KCR0aXAuZmluZChTZWxlY3Rvci5DT05URU5UKSwgY29udGVudCk7XG4gICAgICAgICR0aXAucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLkZBREUgKyBcIiBcIiArIENsYXNzTmFtZS5TSE9XKTtcbiAgICAgIH07IC8vIFByaXZhdGVcblxuXG4gICAgICBfcHJvdG8uX2dldENvbnRlbnQgPSBmdW5jdGlvbiBfZ2V0Q29udGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29udGVudCcpIHx8IHRoaXMuY29uZmlnLmNvbnRlbnQ7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2NsZWFuVGlwQ2xhc3MgPSBmdW5jdGlvbiBfY2xlYW5UaXBDbGFzcygpIHtcbiAgICAgICAgdmFyICR0aXAgPSAkJCQxKHRoaXMuZ2V0VGlwRWxlbWVudCgpKTtcbiAgICAgICAgdmFyIHRhYkNsYXNzID0gJHRpcC5hdHRyKCdjbGFzcycpLm1hdGNoKEJTQ0xTX1BSRUZJWF9SRUdFWCk7XG5cbiAgICAgICAgaWYgKHRhYkNsYXNzICE9PSBudWxsICYmIHRhYkNsYXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAkdGlwLnJlbW92ZUNsYXNzKHRhYkNsYXNzLmpvaW4oJycpKTtcbiAgICAgICAgfVxuICAgICAgfTsgLy8gU3RhdGljXG5cblxuICAgICAgUG9wb3Zlci5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGw7XG5cbiAgICAgICAgICBpZiAoIWRhdGEgJiYgL2Rlc3Ryb3l8aGlkZS8udGVzdChjb25maWcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0gbmV3IFBvcG92ZXIodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgICAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX2NyZWF0ZUNsYXNzKFBvcG92ZXIsIG51bGwsIFt7XG4gICAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICAgIC8vIEdldHRlcnNcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIFZFUlNJT047XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIk5BTUVcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIE5BTUU7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkRBVEFfS0VZXCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBEQVRBX0tFWTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBrZXk6IFwiRXZlbnRcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIEV2ZW50O1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJFVkVOVF9LRVlcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIEVWRU5UX0tFWTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBrZXk6IFwiRGVmYXVsdFR5cGVcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIERlZmF1bHRUeXBlO1xuICAgICAgICB9XG4gICAgICB9XSk7XG5cbiAgICAgIHJldHVybiBQb3BvdmVyO1xuICAgIH0oVG9vbHRpcCk7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogalF1ZXJ5XG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG5cblxuICAgICQkJDEuZm5bTkFNRV0gPSBQb3BvdmVyLl9qUXVlcnlJbnRlcmZhY2U7XG4gICAgJCQkMS5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IFBvcG92ZXI7XG5cbiAgICAkJCQxLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAkJCQxLmZuW05BTUVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgICAgcmV0dXJuIFBvcG92ZXIuX2pRdWVyeUludGVyZmFjZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFBvcG92ZXI7XG4gIH0oJCk7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuMS4yKTogc2Nyb2xsc3B5LmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBTY3JvbGxTcHkgPSBmdW5jdGlvbiAoJCQkMSkge1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIENvbnN0YW50c1xuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuICAgIHZhciBOQU1FID0gJ3Njcm9sbHNweSc7XG4gICAgdmFyIFZFUlNJT04gPSAnNC4xLjInO1xuICAgIHZhciBEQVRBX0tFWSA9ICdicy5zY3JvbGxzcHknO1xuICAgIHZhciBFVkVOVF9LRVkgPSBcIi5cIiArIERBVEFfS0VZO1xuICAgIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUID0gJCQkMS5mbltOQU1FXTtcbiAgICB2YXIgRGVmYXVsdCA9IHtcbiAgICAgIG9mZnNldDogMTAsXG4gICAgICBtZXRob2Q6ICdhdXRvJyxcbiAgICAgIHRhcmdldDogJydcbiAgICB9O1xuICAgIHZhciBEZWZhdWx0VHlwZSA9IHtcbiAgICAgIG9mZnNldDogJ251bWJlcicsXG4gICAgICBtZXRob2Q6ICdzdHJpbmcnLFxuICAgICAgdGFyZ2V0OiAnKHN0cmluZ3xlbGVtZW50KSdcbiAgICB9O1xuICAgIHZhciBFdmVudCA9IHtcbiAgICAgIEFDVElWQVRFOiBcImFjdGl2YXRlXCIgKyBFVkVOVF9LRVksXG4gICAgICBTQ1JPTEw6IFwic2Nyb2xsXCIgKyBFVkVOVF9LRVksXG4gICAgICBMT0FEX0RBVEFfQVBJOiBcImxvYWRcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWVxuICAgIH07XG4gICAgdmFyIENsYXNzTmFtZSA9IHtcbiAgICAgIERST1BET1dOX0lURU06ICdkcm9wZG93bi1pdGVtJyxcbiAgICAgIERST1BET1dOX01FTlU6ICdkcm9wZG93bi1tZW51JyxcbiAgICAgIEFDVElWRTogJ2FjdGl2ZSdcbiAgICB9O1xuICAgIHZhciBTZWxlY3RvciA9IHtcbiAgICAgIERBVEFfU1BZOiAnW2RhdGEtc3B5PVwic2Nyb2xsXCJdJyxcbiAgICAgIEFDVElWRTogJy5hY3RpdmUnLFxuICAgICAgTkFWX0xJU1RfR1JPVVA6ICcubmF2LCAubGlzdC1ncm91cCcsXG4gICAgICBOQVZfTElOS1M6ICcubmF2LWxpbmsnLFxuICAgICAgTkFWX0lURU1TOiAnLm5hdi1pdGVtJyxcbiAgICAgIExJU1RfSVRFTVM6ICcubGlzdC1ncm91cC1pdGVtJyxcbiAgICAgIERST1BET1dOOiAnLmRyb3Bkb3duJyxcbiAgICAgIERST1BET1dOX0lURU1TOiAnLmRyb3Bkb3duLWl0ZW0nLFxuICAgICAgRFJPUERPV05fVE9HR0xFOiAnLmRyb3Bkb3duLXRvZ2dsZSdcbiAgICB9O1xuICAgIHZhciBPZmZzZXRNZXRob2QgPSB7XG4gICAgICBPRkZTRVQ6ICdvZmZzZXQnLFxuICAgICAgUE9TSVRJT046ICdwb3NpdGlvbidcbiAgICAgIC8qKlxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAqL1xuXG4gICAgfTtcblxuICAgIHZhciBTY3JvbGxTcHkgPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBTY3JvbGxTcHkoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX3Njcm9sbEVsZW1lbnQgPSBlbGVtZW50LnRhZ05hbWUgPT09ICdCT0RZJyA/IHdpbmRvdyA6IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgICB0aGlzLl9zZWxlY3RvciA9IHRoaXMuX2NvbmZpZy50YXJnZXQgKyBcIiBcIiArIFNlbGVjdG9yLk5BVl9MSU5LUyArIFwiLFwiICsgKHRoaXMuX2NvbmZpZy50YXJnZXQgKyBcIiBcIiArIFNlbGVjdG9yLkxJU1RfSVRFTVMgKyBcIixcIikgKyAodGhpcy5fY29uZmlnLnRhcmdldCArIFwiIFwiICsgU2VsZWN0b3IuRFJPUERPV05fSVRFTVMpO1xuICAgICAgICB0aGlzLl9vZmZzZXRzID0gW107XG4gICAgICAgIHRoaXMuX3RhcmdldHMgPSBbXTtcbiAgICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2Nyb2xsSGVpZ2h0ID0gMDtcbiAgICAgICAgJCQkMSh0aGlzLl9zY3JvbGxFbGVtZW50KS5vbihFdmVudC5TQ1JPTEwsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5fcHJvY2VzcyhldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcblxuICAgICAgICB0aGlzLl9wcm9jZXNzKCk7XG4gICAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgICB2YXIgX3Byb3RvID0gU2Nyb2xsU3B5LnByb3RvdHlwZTtcblxuICAgICAgLy8gUHVibGljXG4gICAgICBfcHJvdG8ucmVmcmVzaCA9IGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgIHZhciBhdXRvTWV0aG9kID0gdGhpcy5fc2Nyb2xsRWxlbWVudCA9PT0gdGhpcy5fc2Nyb2xsRWxlbWVudC53aW5kb3cgPyBPZmZzZXRNZXRob2QuT0ZGU0VUIDogT2Zmc2V0TWV0aG9kLlBPU0lUSU9OO1xuICAgICAgICB2YXIgb2Zmc2V0TWV0aG9kID0gdGhpcy5fY29uZmlnLm1ldGhvZCA9PT0gJ2F1dG8nID8gYXV0b01ldGhvZCA6IHRoaXMuX2NvbmZpZy5tZXRob2Q7XG4gICAgICAgIHZhciBvZmZzZXRCYXNlID0gb2Zmc2V0TWV0aG9kID09PSBPZmZzZXRNZXRob2QuUE9TSVRJT04gPyB0aGlzLl9nZXRTY3JvbGxUb3AoKSA6IDA7XG4gICAgICAgIHRoaXMuX29mZnNldHMgPSBbXTtcbiAgICAgICAgdGhpcy5fdGFyZ2V0cyA9IFtdO1xuICAgICAgICB0aGlzLl9zY3JvbGxIZWlnaHQgPSB0aGlzLl9nZXRTY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgdmFyIHRhcmdldHMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5fc2VsZWN0b3IpKTtcbiAgICAgICAgdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgdGFyZ2V0O1xuICAgICAgICAgIHZhciB0YXJnZXRTZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGlmICh0YXJnZXRTZWxlY3Rvcikge1xuICAgICAgICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXRTZWxlY3Rvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgdmFyIHRhcmdldEJDUiA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgaWYgKHRhcmdldEJDUi53aWR0aCB8fCB0YXJnZXRCQ1IuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgIC8vIFRPRE8gKGZhdCk6IHJlbW92ZSBza2V0Y2ggcmVsaWFuY2Ugb24galF1ZXJ5IHBvc2l0aW9uL29mZnNldFxuICAgICAgICAgICAgICByZXR1cm4gWyQkJDEodGFyZ2V0KVtvZmZzZXRNZXRob2RdKCkudG9wICsgb2Zmc2V0QmFzZSwgdGFyZ2V0U2VsZWN0b3JdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIHJldHVybiBhWzBdIC0gYlswXTtcbiAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIF90aGlzMi5fb2Zmc2V0cy5wdXNoKGl0ZW1bMF0pO1xuXG4gICAgICAgICAgX3RoaXMyLl90YXJnZXRzLnB1c2goaXRlbVsxXSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICAkJCQxLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgICAkJCQxKHRoaXMuX3Njcm9sbEVsZW1lbnQpLm9mZihFVkVOVF9LRVkpO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2Nyb2xsRWxlbWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NlbGVjdG9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb2Zmc2V0cyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3RhcmdldHMgPSBudWxsO1xuICAgICAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsO1xuICAgICAgICB0aGlzLl9zY3JvbGxIZWlnaHQgPSBudWxsO1xuICAgICAgfTsgLy8gUHJpdmF0ZVxuXG5cbiAgICAgIF9wcm90by5fZ2V0Q29uZmlnID0gZnVuY3Rpb24gX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgICAgY29uZmlnID0gX29iamVjdFNwcmVhZCh7fSwgRGVmYXVsdCwgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLnRhcmdldCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YXIgaWQgPSAkJCQxKGNvbmZpZy50YXJnZXQpLmF0dHIoJ2lkJyk7XG5cbiAgICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICBpZCA9IFV0aWwuZ2V0VUlEKE5BTUUpO1xuICAgICAgICAgICAgJCQkMShjb25maWcudGFyZ2V0KS5hdHRyKCdpZCcsIGlkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25maWcudGFyZ2V0ID0gXCIjXCIgKyBpZDtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUsIGNvbmZpZywgRGVmYXVsdFR5cGUpO1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9nZXRTY3JvbGxUb3AgPSBmdW5jdGlvbiBfZ2V0U2Nyb2xsVG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsRWxlbWVudCA9PT0gd2luZG93ID8gdGhpcy5fc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldCA6IHRoaXMuX3Njcm9sbEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9nZXRTY3JvbGxIZWlnaHQgPSBmdW5jdGlvbiBfZ2V0U2Nyb2xsSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsRWxlbWVudC5zY3JvbGxIZWlnaHQgfHwgTWF0aC5tYXgoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9nZXRPZmZzZXRIZWlnaHQgPSBmdW5jdGlvbiBfZ2V0T2Zmc2V0SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsRWxlbWVudCA9PT0gd2luZG93ID8gd2luZG93LmlubmVySGVpZ2h0IDogdGhpcy5fc2Nyb2xsRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX3Byb2Nlc3MgPSBmdW5jdGlvbiBfcHJvY2VzcygpIHtcbiAgICAgICAgdmFyIHNjcm9sbFRvcCA9IHRoaXMuX2dldFNjcm9sbFRvcCgpICsgdGhpcy5fY29uZmlnLm9mZnNldDtcblxuICAgICAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gdGhpcy5fZ2V0U2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgICAgdmFyIG1heFNjcm9sbCA9IHRoaXMuX2NvbmZpZy5vZmZzZXQgKyBzY3JvbGxIZWlnaHQgLSB0aGlzLl9nZXRPZmZzZXRIZWlnaHQoKTtcblxuICAgICAgICBpZiAodGhpcy5fc2Nyb2xsSGVpZ2h0ICE9PSBzY3JvbGxIZWlnaHQpIHtcbiAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY3JvbGxUb3AgPj0gbWF4U2Nyb2xsKSB7XG4gICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMuX3RhcmdldHNbdGhpcy5fdGFyZ2V0cy5sZW5ndGggLSAxXTtcblxuICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmVUYXJnZXQgIT09IHRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZhdGUodGFyZ2V0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlVGFyZ2V0ICYmIHNjcm9sbFRvcCA8IHRoaXMuX29mZnNldHNbMF0gJiYgdGhpcy5fb2Zmc2V0c1swXSA+IDApIHtcbiAgICAgICAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsO1xuXG4gICAgICAgICAgdGhpcy5fY2xlYXIoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvZmZzZXRMZW5ndGggPSB0aGlzLl9vZmZzZXRzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKHZhciBpID0gb2Zmc2V0TGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgdmFyIGlzQWN0aXZlVGFyZ2V0ID0gdGhpcy5fYWN0aXZlVGFyZ2V0ICE9PSB0aGlzLl90YXJnZXRzW2ldICYmIHNjcm9sbFRvcCA+PSB0aGlzLl9vZmZzZXRzW2ldICYmICh0eXBlb2YgdGhpcy5fb2Zmc2V0c1tpICsgMV0gPT09ICd1bmRlZmluZWQnIHx8IHNjcm9sbFRvcCA8IHRoaXMuX29mZnNldHNbaSArIDFdKTtcblxuICAgICAgICAgIGlmIChpc0FjdGl2ZVRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZhdGUodGhpcy5fdGFyZ2V0c1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2FjdGl2YXRlID0gZnVuY3Rpb24gX2FjdGl2YXRlKHRhcmdldCkge1xuICAgICAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSB0YXJnZXQ7XG5cbiAgICAgICAgdGhpcy5fY2xlYXIoKTtcblxuICAgICAgICB2YXIgcXVlcmllcyA9IHRoaXMuX3NlbGVjdG9yLnNwbGl0KCcsJyk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBhcnJvdy1ib2R5LXN0eWxlXG5cblxuICAgICAgICBxdWVyaWVzID0gcXVlcmllcy5tYXAoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGVjdG9yICsgXCJbZGF0YS10YXJnZXQ9XFxcIlwiICsgdGFyZ2V0ICsgXCJcXFwiXSxcIiArIChzZWxlY3RvciArIFwiW2hyZWY9XFxcIlwiICsgdGFyZ2V0ICsgXCJcXFwiXVwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciAkbGluayA9ICQkJDEoW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJpZXMuam9pbignLCcpKSkpO1xuXG4gICAgICAgIGlmICgkbGluay5oYXNDbGFzcyhDbGFzc05hbWUuRFJPUERPV05fSVRFTSkpIHtcbiAgICAgICAgICAkbGluay5jbG9zZXN0KFNlbGVjdG9yLkRST1BET1dOKS5maW5kKFNlbGVjdG9yLkRST1BET1dOX1RPR0dMRSkuYWRkQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSk7XG4gICAgICAgICAgJGxpbmsuYWRkQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2V0IHRyaWdnZXJlZCBsaW5rIGFzIGFjdGl2ZVxuICAgICAgICAgICRsaW5rLmFkZENsYXNzKENsYXNzTmFtZS5BQ1RJVkUpOyAvLyBTZXQgdHJpZ2dlcmVkIGxpbmtzIHBhcmVudHMgYXMgYWN0aXZlXG4gICAgICAgICAgLy8gV2l0aCBib3RoIDx1bD4gYW5kIDxuYXY+IG1hcmt1cCBhIHBhcmVudCBpcyB0aGUgcHJldmlvdXMgc2libGluZyBvZiBhbnkgbmF2IGFuY2VzdG9yXG5cbiAgICAgICAgICAkbGluay5wYXJlbnRzKFNlbGVjdG9yLk5BVl9MSVNUX0dST1VQKS5wcmV2KFNlbGVjdG9yLk5BVl9MSU5LUyArIFwiLCBcIiArIFNlbGVjdG9yLkxJU1RfSVRFTVMpLmFkZENsYXNzKENsYXNzTmFtZS5BQ1RJVkUpOyAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlIHdoZW4gLm5hdi1saW5rIGlzIGluc2lkZSAubmF2LWl0ZW1cblxuICAgICAgICAgICRsaW5rLnBhcmVudHMoU2VsZWN0b3IuTkFWX0xJU1RfR1JPVVApLnByZXYoU2VsZWN0b3IuTkFWX0lURU1TKS5jaGlsZHJlbihTZWxlY3Rvci5OQVZfTElOS1MpLmFkZENsYXNzKENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgICB9XG5cbiAgICAgICAgJCQkMSh0aGlzLl9zY3JvbGxFbGVtZW50KS50cmlnZ2VyKEV2ZW50LkFDVElWQVRFLCB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogdGFyZ2V0XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9jbGVhciA9IGZ1bmN0aW9uIF9jbGVhcigpIHtcbiAgICAgICAgdmFyIG5vZGVzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuX3NlbGVjdG9yKSk7XG4gICAgICAgICQkJDEobm9kZXMpLmZpbHRlcihTZWxlY3Rvci5BQ1RJVkUpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgfTsgLy8gU3RhdGljXG5cblxuICAgICAgU2Nyb2xsU3B5Ll9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9ICQkJDEodGhpcykuZGF0YShEQVRBX0tFWSk7XG5cbiAgICAgICAgICB2YXIgX2NvbmZpZyA9IHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZztcblxuICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgZGF0YSA9IG5ldyBTY3JvbGxTcHkodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgICAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX2NyZWF0ZUNsYXNzKFNjcm9sbFNweSwgbnVsbCwgW3tcbiAgICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIFZFUlNJT047XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1dKTtcblxuICAgICAgcmV0dXJuIFNjcm9sbFNweTtcbiAgICB9KCk7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuXG4gICAgJCQkMSh3aW5kb3cpLm9uKEV2ZW50LkxPQURfREFUQV9BUEksIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzY3JvbGxTcHlzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNlbGVjdG9yLkRBVEFfU1BZKSk7XG4gICAgICB2YXIgc2Nyb2xsU3B5c0xlbmd0aCA9IHNjcm9sbFNweXMubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBpID0gc2Nyb2xsU3B5c0xlbmd0aDsgaS0tOykge1xuICAgICAgICB2YXIgJHNweSA9ICQkJDEoc2Nyb2xsU3B5c1tpXSk7XG5cbiAgICAgICAgU2Nyb2xsU3B5Ll9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkc3B5LCAkc3B5LmRhdGEoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogalF1ZXJ5XG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG5cbiAgICAkJCQxLmZuW05BTUVdID0gU2Nyb2xsU3B5Ll9qUXVlcnlJbnRlcmZhY2U7XG4gICAgJCQkMS5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IFNjcm9sbFNweTtcblxuICAgICQkJDEuZm5bTkFNRV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICQkJDEuZm5bTkFNRV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgICByZXR1cm4gU2Nyb2xsU3B5Ll9qUXVlcnlJbnRlcmZhY2U7XG4gICAgfTtcblxuICAgIHJldHVybiBTY3JvbGxTcHk7XG4gIH0oJCk7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuMS4yKTogdGFiLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBUYWIgPSBmdW5jdGlvbiAoJCQkMSkge1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIENvbnN0YW50c1xuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuICAgIHZhciBOQU1FID0gJ3RhYic7XG4gICAgdmFyIFZFUlNJT04gPSAnNC4xLjInO1xuICAgIHZhciBEQVRBX0tFWSA9ICdicy50YWInO1xuICAgIHZhciBFVkVOVF9LRVkgPSBcIi5cIiArIERBVEFfS0VZO1xuICAgIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUID0gJCQkMS5mbltOQU1FXTtcbiAgICB2YXIgRXZlbnQgPSB7XG4gICAgICBISURFOiBcImhpZGVcIiArIEVWRU5UX0tFWSxcbiAgICAgIEhJRERFTjogXCJoaWRkZW5cIiArIEVWRU5UX0tFWSxcbiAgICAgIFNIT1c6IFwic2hvd1wiICsgRVZFTlRfS0VZLFxuICAgICAgU0hPV046IFwic2hvd25cIiArIEVWRU5UX0tFWSxcbiAgICAgIENMSUNLX0RBVEFfQVBJOiBcImNsaWNrXCIgKyBFVkVOVF9LRVkgKyBEQVRBX0FQSV9LRVlcbiAgICB9O1xuICAgIHZhciBDbGFzc05hbWUgPSB7XG4gICAgICBEUk9QRE9XTl9NRU5VOiAnZHJvcGRvd24tbWVudScsXG4gICAgICBBQ1RJVkU6ICdhY3RpdmUnLFxuICAgICAgRElTQUJMRUQ6ICdkaXNhYmxlZCcsXG4gICAgICBGQURFOiAnZmFkZScsXG4gICAgICBTSE9XOiAnc2hvdydcbiAgICB9O1xuICAgIHZhciBTZWxlY3RvciA9IHtcbiAgICAgIERST1BET1dOOiAnLmRyb3Bkb3duJyxcbiAgICAgIE5BVl9MSVNUX0dST1VQOiAnLm5hdiwgLmxpc3QtZ3JvdXAnLFxuICAgICAgQUNUSVZFOiAnLmFjdGl2ZScsXG4gICAgICBBQ1RJVkVfVUw6ICc+IGxpID4gLmFjdGl2ZScsXG4gICAgICBEQVRBX1RPR0dMRTogJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXSwgW2RhdGEtdG9nZ2xlPVwicGlsbFwiXSwgW2RhdGEtdG9nZ2xlPVwibGlzdFwiXScsXG4gICAgICBEUk9QRE9XTl9UT0dHTEU6ICcuZHJvcGRvd24tdG9nZ2xlJyxcbiAgICAgIERST1BET1dOX0FDVElWRV9DSElMRDogJz4gLmRyb3Bkb3duLW1lbnUgLmFjdGl2ZSdcbiAgICAgIC8qKlxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAqL1xuXG4gICAgfTtcblxuICAgIHZhciBUYWIgPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBUYWIoZWxlbWVudCkge1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICAgIHZhciBfcHJvdG8gPSBUYWIucHJvdG90eXBlO1xuXG4gICAgICAvLyBQdWJsaWNcbiAgICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICBpZiAodGhpcy5fZWxlbWVudC5wYXJlbnROb2RlICYmIHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgJCQkMSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuQUNUSVZFKSB8fCAkJCQxKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5ESVNBQkxFRCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGFyZ2V0O1xuICAgICAgICB2YXIgcHJldmlvdXM7XG4gICAgICAgIHZhciBsaXN0RWxlbWVudCA9ICQkJDEodGhpcy5fZWxlbWVudCkuY2xvc2VzdChTZWxlY3Rvci5OQVZfTElTVF9HUk9VUClbMF07XG4gICAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcblxuICAgICAgICBpZiAobGlzdEVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgaXRlbVNlbGVjdG9yID0gbGlzdEVsZW1lbnQubm9kZU5hbWUgPT09ICdVTCcgPyBTZWxlY3Rvci5BQ1RJVkVfVUwgOiBTZWxlY3Rvci5BQ1RJVkU7XG4gICAgICAgICAgcHJldmlvdXMgPSAkJCQxLm1ha2VBcnJheSgkJCQxKGxpc3RFbGVtZW50KS5maW5kKGl0ZW1TZWxlY3RvcikpO1xuICAgICAgICAgIHByZXZpb3VzID0gcHJldmlvdXNbcHJldmlvdXMubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGlkZUV2ZW50ID0gJCQkMS5FdmVudChFdmVudC5ISURFLCB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHNob3dFdmVudCA9ICQkJDEuRXZlbnQoRXZlbnQuU0hPVywge1xuICAgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHByZXZpb3VzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwcmV2aW91cykge1xuICAgICAgICAgICQkJDEocHJldmlvdXMpLnRyaWdnZXIoaGlkZUV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgICQkJDEodGhpcy5fZWxlbWVudCkudHJpZ2dlcihzaG93RXZlbnQpO1xuXG4gICAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgfHwgaGlkZUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hY3RpdmF0ZSh0aGlzLl9lbGVtZW50LCBsaXN0RWxlbWVudCk7XG5cbiAgICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgICAgdmFyIGhpZGRlbkV2ZW50ID0gJCQkMS5FdmVudChFdmVudC5ISURERU4sIHtcbiAgICAgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IF90aGlzLl9lbGVtZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIHNob3duRXZlbnQgPSAkJCQxLkV2ZW50KEV2ZW50LlNIT1dOLCB7XG4gICAgICAgICAgICByZWxhdGVkVGFyZ2V0OiBwcmV2aW91c1xuICAgICAgICAgIH0pO1xuICAgICAgICAgICQkJDEocHJldmlvdXMpLnRyaWdnZXIoaGlkZGVuRXZlbnQpO1xuICAgICAgICAgICQkJDEoX3RoaXMuX2VsZW1lbnQpLnRyaWdnZXIoc2hvd25FdmVudCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIHRoaXMuX2FjdGl2YXRlKHRhcmdldCwgdGFyZ2V0LnBhcmVudE5vZGUsIGNvbXBsZXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAgICQkJDEucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSk7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgICAgfTsgLy8gUHJpdmF0ZVxuXG5cbiAgICAgIF9wcm90by5fYWN0aXZhdGUgPSBmdW5jdGlvbiBfYWN0aXZhdGUoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICB2YXIgYWN0aXZlRWxlbWVudHM7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lci5ub2RlTmFtZSA9PT0gJ1VMJykge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzID0gJCQkMShjb250YWluZXIpLmZpbmQoU2VsZWN0b3IuQUNUSVZFX1VMKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY3RpdmVFbGVtZW50cyA9ICQkJDEoY29udGFpbmVyKS5jaGlsZHJlbihTZWxlY3Rvci5BQ1RJVkUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFjdGl2ZSA9IGFjdGl2ZUVsZW1lbnRzWzBdO1xuICAgICAgICB2YXIgaXNUcmFuc2l0aW9uaW5nID0gY2FsbGJhY2sgJiYgYWN0aXZlICYmICQkJDEoYWN0aXZlKS5oYXNDbGFzcyhDbGFzc05hbWUuRkFERSk7XG5cbiAgICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5fdHJhbnNpdGlvbkNvbXBsZXRlKGVsZW1lbnQsIGFjdGl2ZSwgY2FsbGJhY2spO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChhY3RpdmUgJiYgaXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQoYWN0aXZlKTtcbiAgICAgICAgICAkJCQxKGFjdGl2ZSkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fdHJhbnNpdGlvbkNvbXBsZXRlID0gZnVuY3Rpb24gX3RyYW5zaXRpb25Db21wbGV0ZShlbGVtZW50LCBhY3RpdmUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICAkJCQxKGFjdGl2ZSkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLlNIT1cgKyBcIiBcIiArIENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgICAgIHZhciBkcm9wZG93bkNoaWxkID0gJCQkMShhY3RpdmUucGFyZW50Tm9kZSkuZmluZChTZWxlY3Rvci5EUk9QRE9XTl9BQ1RJVkVfQ0hJTEQpWzBdO1xuXG4gICAgICAgICAgaWYgKGRyb3Bkb3duQ2hpbGQpIHtcbiAgICAgICAgICAgICQkJDEoZHJvcGRvd25DaGlsZCkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFjdGl2ZS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ3RhYicpIHtcbiAgICAgICAgICAgIGFjdGl2ZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgJCQkMShlbGVtZW50KS5hZGRDbGFzcyhDbGFzc05hbWUuQUNUSVZFKTtcblxuICAgICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ3RhYicpIHtcbiAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgVXRpbC5yZWZsb3coZWxlbWVudCk7XG4gICAgICAgICQkJDEoZWxlbWVudCkuYWRkQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpO1xuXG4gICAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUgJiYgJCQkMShlbGVtZW50LnBhcmVudE5vZGUpLmhhc0NsYXNzKENsYXNzTmFtZS5EUk9QRE9XTl9NRU5VKSkge1xuICAgICAgICAgIHZhciBkcm9wZG93bkVsZW1lbnQgPSAkJCQxKGVsZW1lbnQpLmNsb3Nlc3QoU2VsZWN0b3IuRFJPUERPV04pWzBdO1xuXG4gICAgICAgICAgaWYgKGRyb3Bkb3duRWxlbWVudCkge1xuICAgICAgICAgICAgdmFyIGRyb3Bkb3duVG9nZ2xlTGlzdCA9IFtdLnNsaWNlLmNhbGwoZHJvcGRvd25FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU2VsZWN0b3IuRFJPUERPV05fVE9HR0xFKSk7XG4gICAgICAgICAgICAkJCQxKGRyb3Bkb3duVG9nZ2xlTGlzdCkuYWRkQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH07IC8vIFN0YXRpY1xuXG5cbiAgICAgIFRhYi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyICR0aGlzID0gJCQkMSh0aGlzKTtcbiAgICAgICAgICB2YXIgZGF0YSA9ICR0aGlzLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0gbmV3IFRhYih0aGlzKTtcbiAgICAgICAgICAgICR0aGlzLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX2NyZWF0ZUNsYXNzKFRhYiwgbnVsbCwgW3tcbiAgICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIFZFUlNJT047XG4gICAgICAgIH1cbiAgICAgIH1dKTtcblxuICAgICAgcmV0dXJuIFRhYjtcbiAgICB9KCk7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuXG4gICAgJCQkMShkb2N1bWVudCkub24oRXZlbnQuQ0xJQ0tfREFUQV9BUEksIFNlbGVjdG9yLkRBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIFRhYi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJCQkMSh0aGlzKSwgJ3Nob3cnKTtcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBqUXVlcnlcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuICAgICQkJDEuZm5bTkFNRV0gPSBUYWIuX2pRdWVyeUludGVyZmFjZTtcbiAgICAkJCQxLmZuW05BTUVdLkNvbnN0cnVjdG9yID0gVGFiO1xuXG4gICAgJCQkMS5mbltOQU1FXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgJCQkMS5mbltOQU1FXSA9IEpRVUVSWV9OT19DT05GTElDVDtcbiAgICAgIHJldHVybiBUYWIuX2pRdWVyeUludGVyZmFjZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRhYjtcbiAgfSgkKTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwICh2NC4xLjIpOiBpbmRleC5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAoZnVuY3Rpb24gKCQkJDEpIHtcbiAgICBpZiAodHlwZW9mICQkJDEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5LiBqUXVlcnkgbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgQm9vdHN0cmFwXFwncyBKYXZhU2NyaXB0LicpO1xuICAgIH1cblxuICAgIHZhciB2ZXJzaW9uID0gJCQkMS5mbi5qcXVlcnkuc3BsaXQoJyAnKVswXS5zcGxpdCgnLicpO1xuICAgIHZhciBtaW5NYWpvciA9IDE7XG4gICAgdmFyIGx0TWFqb3IgPSAyO1xuICAgIHZhciBtaW5NaW5vciA9IDk7XG4gICAgdmFyIG1pblBhdGNoID0gMTtcbiAgICB2YXIgbWF4TWFqb3IgPSA0O1xuXG4gICAgaWYgKHZlcnNpb25bMF0gPCBsdE1ham9yICYmIHZlcnNpb25bMV0gPCBtaW5NaW5vciB8fCB2ZXJzaW9uWzBdID09PSBtaW5NYWpvciAmJiB2ZXJzaW9uWzFdID09PSBtaW5NaW5vciAmJiB2ZXJzaW9uWzJdIDwgbWluUGF0Y2ggfHwgdmVyc2lvblswXSA+PSBtYXhNYWpvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCb290c3RyYXBcXCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgYXQgbGVhc3QgalF1ZXJ5IHYxLjkuMSBidXQgbGVzcyB0aGFuIHY0LjAuMCcpO1xuICAgIH1cbiAgfSkoJCk7XG5cbiAgZXhwb3J0cy5VdGlsID0gVXRpbDtcbiAgZXhwb3J0cy5BbGVydCA9IEFsZXJ0O1xuICBleHBvcnRzLkJ1dHRvbiA9IEJ1dHRvbjtcbiAgZXhwb3J0cy5DYXJvdXNlbCA9IENhcm91c2VsO1xuICBleHBvcnRzLkNvbGxhcHNlID0gQ29sbGFwc2U7XG4gIGV4cG9ydHMuRHJvcGRvd24gPSBEcm9wZG93bjtcbiAgZXhwb3J0cy5Nb2RhbCA9IE1vZGFsO1xuICBleHBvcnRzLlBvcG92ZXIgPSBQb3BvdmVyO1xuICBleHBvcnRzLlNjcm9sbHNweSA9IFNjcm9sbFNweTtcbiAgZXhwb3J0cy5UYWIgPSBUYWI7XG4gIGV4cG9ydHMuVG9vbHRpcCA9IFRvb2x0aXA7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb3RzdHJhcC5qcy5tYXBcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9kaXN0L2pzL2Jvb3RzdHJhcC5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5\n");
+
+/***/ }),
+/* 6 */,
+/* 7 */,
+/* 8 */,
+/* 9 */,
+/* 10 */,
+/* 11 */,
+/* 12 */,
+/* 13 */,
+/* 14 */,
+/* 15 */,
+/* 16 */,
+/* 17 */,
+/* 18 */,
+/* 19 */,
+/* 20 */,
+/* 21 */,
+/* 22 */,
+/* 23 */,
+/* 24 */,
+/* 25 */,
+/* 26 */,
+/* 27 */,
+/* 28 */,
+/* 29 */,
+/* 30 */,
+/* 31 */,
+/* 32 */,
+/* 33 */,
+/* 34 */,
+/* 35 */,
+/* 36 */,
+/* 37 */,
+/* 38 */,
+/* 39 */,
+/* 40 */,
+/* 41 */,
+/* 42 */,
+/* 43 */,
+/* 44 */,
+/* 45 */
/***/ (function(module, exports, __webpack_require__) {
-module.exports = __webpack_require__(5);
+module.exports = __webpack_require__(46);
/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("__webpack_require__(47);\n__webpack_require__(49);\n__webpack_require__(50);\n__webpack_require__(51);\n__webpack_require__(52);\n__webpack_require__(53);\n__webpack_require__(54);\n__webpack_require__(55);\n__webpack_require__(56);\n__webpack_require__(57);\n__webpack_require__(58);\n__webpack_require__(59);\n__webpack_require__(60);\n__webpack_require__(61);\n__webpack_require__(62);\n__webpack_require__(63);\n__webpack_require__(64);\n__webpack_require__(!(function webpackMissingModule() { var e = new Error(\"Cannot find module \\\"../../../vendor/almasaeed2010/adminlte/dist/dist/js/demo.js\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); // TODO: Own script :D//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2FkbWluLmpzPzI5ODYiXSwibmFtZXMiOlsicmVxdWlyZSJdLCJtYXBwaW5ncyI6IkFBQUEsbUJBQUFBLENBQVEsRUFBUjtBQUNBLG1CQUFBQSxDQUFRLEVBQVI7QUFDQSxtQkFBQUEsQ0FBUSxFQUFSO0FBQ0EsbUJBQUFBLENBQVEsRUFBUjtBQUNBLG1CQUFBQSxDQUFRLEVBQVI7QUFDQSxtQkFBQUEsQ0FBUSxFQUFSO0FBQ0EsbUJBQUFBLENBQVEsRUFBUjtBQUNBLG1CQUFBQSxDQUFRLEVBQVI7QUFDQSxtQkFBQUEsQ0FBUSxFQUFSO0FBQ0EsbUJBQUFBLENBQVEsRUFBUjtBQUNBLG1CQUFBQSxDQUFRLEVBQVI7QUFDQSxtQkFBQUEsQ0FBUSxFQUFSO0FBQ0EsbUJBQUFBLENBQVEsRUFBUjtBQUNBLG1CQUFBQSxDQUFRLEVBQVI7QUFDQSxtQkFBQUEsQ0FBUSxFQUFSO0FBQ0EsbUJBQUFBLENBQVEsRUFBUjtBQUNBLG1CQUFBQSxDQUFRLEVBQVI7QUFDQSxtQkFBQUEsQ0FBUSx1TEFBUixFLENBQXdFIiwiZmlsZSI6IjQ2LmpzIiwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZShcIi4uLy4uLy4uL3ZlbmRvci9hbG1hc2FlZWQyMDEwL2FkbWlubHRlL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5L2Rpc3QvanF1ZXJ5Lm1pbi5qc1wiKTtcbnJlcXVpcmUoXCIuLi8uLi8uLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS11aS9qcXVlcnktdWkubWluLmpzXCIpO1xucmVxdWlyZShcIi4uLy4uLy4uL3ZlbmRvci9hbG1hc2FlZWQyMDEwL2FkbWlubHRlL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwL2Rpc3QvanMvYm9vdHN0cmFwLm1pbi5qc1wiKTtcbnJlcXVpcmUoXCIuLi8uLi8uLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL3JhcGhhZWwvcmFwaGFlbC5taW4uanNcIik7XG5yZXF1aXJlKFwiLi4vLi4vLi4vdmVuZG9yL2FsbWFzYWVlZDIwMTAvYWRtaW5sdGUvYm93ZXJfY29tcG9uZW50cy9tb3JyaXMuanMvbW9ycmlzLm1pbi5qc1wiKTtcbnJlcXVpcmUoXCIuLi8uLi8uLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS1zcGFya2xpbmUvZGlzdC9qcXVlcnkuc3BhcmtsaW5lLm1pbi5qc1wiKTtcbnJlcXVpcmUoXCIuLi8uLi8uLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9wbHVnaW5zL2p2ZWN0b3JtYXAvanF1ZXJ5LWp2ZWN0b3JtYXAtMS4yLjIubWluLmpzXCIpO1xucmVxdWlyZShcIi4uLy4uLy4uL3ZlbmRvci9hbG1hc2FlZWQyMDEwL2FkbWlubHRlL3BsdWdpbnMvanZlY3Rvcm1hcC9qcXVlcnktanZlY3Rvcm1hcC13b3JsZC1taWxsLWVuLmpzXCIpO1xucmVxdWlyZShcIi4uLy4uLy4uL3ZlbmRvci9hbG1hc2FlZWQyMDEwL2FkbWlubHRlL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5LWtub2IvZGlzdC9qcXVlcnkua25vYi5taW4uanNcIik7XG5yZXF1aXJlKFwiLi4vLi4vLi4vdmVuZG9yL2FsbWFzYWVlZDIwMTAvYWRtaW5sdGUvYm93ZXJfY29tcG9uZW50cy9tb21lbnQvbWluL21vbWVudC5taW4uanNcIik7XG5yZXF1aXJlKFwiLi4vLi4vLi4vdmVuZG9yL2FsbWFzYWVlZDIwMTAvYWRtaW5sdGUvYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtZGF0ZXJhbmdlcGlja2VyL2RhdGVyYW5nZXBpY2tlci5qc1wiKTtcbnJlcXVpcmUoXCIuLi8uLi8uLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1kYXRlcGlja2VyL2Rpc3QvanMvYm9vdHN0cmFwLWRhdGVwaWNrZXIubWluLmpzXCIpO1xucmVxdWlyZShcIi4uLy4uLy4uL3ZlbmRvci9hbG1hc2FlZWQyMDEwL2FkbWlubHRlL3BsdWdpbnMvYm9vdHN0cmFwLXd5c2lodG1sNS9ib290c3RyYXAzLXd5c2lodG1sNS5hbGwubWluLmpzXCIpO1xucmVxdWlyZShcIi4uLy4uLy4uL3ZlbmRvci9hbG1hc2FlZWQyMDEwL2FkbWlubHRlL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5LXNsaW1zY3JvbGwvanF1ZXJ5LnNsaW1zY3JvbGwubWluLmpzXCIpO1xucmVxdWlyZShcIi4uLy4uLy4uL3ZlbmRvci9hbG1hc2FlZWQyMDEwL2FkbWlubHRlL2Jvd2VyX2NvbXBvbmVudHMvZmFzdGNsaWNrL2xpYi9mYXN0Y2xpY2suanNcIik7XG5yZXF1aXJlKFwiLi4vLi4vLi4vdmVuZG9yL2FsbWFzYWVlZDIwMTAvYWRtaW5sdGUvZGlzdC9qcy9hZG1pbmx0ZS5taW4uanNcIik7XG5yZXF1aXJlKFwiLi4vLi4vLi4vdmVuZG9yL2FsbWFzYWVlZDIwMTAvYWRtaW5sdGUvZGlzdC9qcy9wYWdlcy9kYXNoYm9hcmQuanNcIik7XG5yZXF1aXJlKFwiLi4vLi4vLi4vdmVuZG9yL2FsbWFzYWVlZDIwMTAvYWRtaW5sdGUvZGlzdC9kaXN0L2pzL2RlbW8uanNcIik7IC8vIFRPRE86IE93biBzY3JpcHQgOkRcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2FkbWluLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///46\n");
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __webpack_require__) {
-/***/ 5:
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(e,t){\"use strict\";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return\"function\"==typeof t&&\"number\"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement(\"script\");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?l[c.call(e)]||\"object\":typeof e}var b=\"3.3.1\",w=function(e,t){return new w.fn.init(e,t)},T=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;w.fn=w.prototype={jquery:\"3.3.1\",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:\"jQuery\"+(\"3.3.1\"+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==c.call(e))&&(!(t=i(e))||\"function\"==typeof(n=f.call(t,\"constructor\")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(T,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,\"string\"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),\"function\"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){l[\"[object \"+t+\"]\"]=t.toLowerCase()});function C(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b=\"sizzle\"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",M=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",R=\"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",I=\"\\\\[\"+M+\"*(\"+R+\")(?:\"+M+\"*([*^$|!~]?=)\"+M+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+R+\"))|)\"+M+\"*\\\\]\",W=\":(\"+R+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+I+\")*)|.*)\\\\)|)\",$=new RegExp(M+\"+\",\"g\"),B=new RegExp(\"^\"+M+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+M+\"+$\",\"g\"),F=new RegExp(\"^\"+M+\"*,\"+M+\"*\"),_=new RegExp(\"^\"+M+\"*([>+~]|\"+M+\")\"+M+\"*\"),z=new RegExp(\"=\"+M+\"*([^\\\\]'\\\"]*?)\"+M+\"*\\\\]\",\"g\"),X=new RegExp(W),U=new RegExp(\"^\"+R+\"$\"),V={ID:new RegExp(\"^#(\"+R+\")\"),CLASS:new RegExp(\"^\\\\.(\"+R+\")\"),TAG:new RegExp(\"^(\"+R+\"|[*])\"),ATTR:new RegExp(\"^\"+I),PSEUDO:new RegExp(\"^\"+W),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+M+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+M+\"*(?:([+-]|)\"+M+\"*(\\\\d+)|))\"+M+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+P+\")$\",\"i\"),needsContext:new RegExp(\"^\"+M+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+M+\"*((?:-\\\\d)?\\\\d*)\"+M+\"*\\\\)|)(?=[^-]|$)\",\"i\")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\\d$/i,Q=/^[^{]+\\{\\s*\\[native \\w/,J=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,K=/[+~]/,Z=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+M+\"?|(\"+M+\")|.)\",\"ig\"),ee=function(e,t,n){var r=\"0x\"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,ne=function(e,t){return t?\"\\0\"===e?\"\\ufffd\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&(\"form\"in e||\"label\"in e)},{dir:\"parentNode\",next:\"legend\"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],\"string\"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+\" \"]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if(\"object\"!==t.nodeName.toLowerCase()){(c=t.getAttribute(\"id\"))?c=c.replace(te,ne):t.setAttribute(\"id\",c=b),s=(h=a(e)).length;while(s--)h[s]=\"#\"+c+\" \"+ve(h[s]);v=h.join(\",\"),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute(\"id\")}}}return u(e.replace(B,\"$1\"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+\" \")>r.cacheLength&&delete t[e.shift()],t[n+\" \"]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split(\"|\"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return\"input\"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return(\"input\"===n||\"button\"===n)&&t.type===e}}function de(e){return function(t){return\"form\"in t?t.parentNode&&!1===t.disabled?\"label\"in t?\"label\"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:\"label\"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&\"HTML\"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener(\"unload\",re,!1):i.attachEvent&&i.attachEvent(\"onunload\",re)),n.attributes=ue(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute(\"id\")===t}},r.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return n&&n.value===t}},r.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if(\"*\"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML=\"<a id='\"+b+\"'></a><select id='\"+b+\"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\",e.querySelectorAll(\"[msallowcapture^='']\").length&&y.push(\"[*^$]=\"+M+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\"[selected]\").length||y.push(\"\\\\[\"+M+\"*(?:value|\"+P+\")\"),e.querySelectorAll(\"[id~=\"+b+\"-]\").length||y.push(\"~=\"),e.querySelectorAll(\":checked\").length||y.push(\":checked\"),e.querySelectorAll(\"a#\"+b+\"+*\").length||y.push(\".#.+[+~]\")}),ue(function(e){e.innerHTML=\"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";var t=d.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),e.querySelectorAll(\"[name=d]\").length&&y.push(\"name\"+M+\"*[*^$|!~]?=\"),2!==e.querySelectorAll(\":enabled\").length&&y.push(\":enabled\",\":disabled\"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&y.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),y.push(\",.*:\")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,\"*\"),m.call(e,\"[s!='']:x\"),v.push(\"!=\",W)}),y=y.length&&new RegExp(y.join(\"|\")),v=v.length&&new RegExp(v.join(\"|\")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,\"='$1']\"),n.matchesSelector&&g&&!S[t+\" \"]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+\"\").replace(te,ne)},oe.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n=\"\",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||\"\").replace(Z,ee),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+\" \"];return t||(t=new RegExp(\"(^|\"+M+\")\"+e+\"(\"+M+\"|$)\"))&&E(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?\"!=\"===t:!t||(i+=\"\",\"=\"===t?i===n:\"!=\"===t?i!==n:\"^=\"===t?n&&0===i.indexOf(n):\"*=\"===t?n&&i.indexOf(n)>-1:\"$=\"===t?n&&i.slice(-n.length)===n:\"~=\"===t?(\" \"+i.replace($,\" \")+\" \").indexOf(n)>-1:\"|=\"===t&&(i===n||i.slice(0,n.length+1)===n+\"-\"))}},CHILD:function(e,t,n,r,i){var o=\"nth\"!==e.slice(0,3),a=\"last\"!==e.slice(-4),s=\"of-type\"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?\"nextSibling\":\"previousSibling\",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g=\"only\"===e&&!h&&\"nextSibling\"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error(\"unsupported pseudo: \"+e);return i[b]?i(t):i.length>1?(n=[e,e,\"\",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,\"$1\"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||\"\")||oe.error(\"unsupported lang: \"+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute(\"xml:lang\")||t.getAttribute(\"lang\"))return(n=n.toLowerCase())===e||0===n.indexOf(e+\"-\")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:he(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:he(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=r.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[t]=fe(t);for(t in{submit:!0,reset:!0})r.pseudos[t]=pe(t);function ye(){}ye.prototype=r.filters=r.pseudos,r.setFilters=new ye,a=oe.tokenize=function(e,t){var n,i,o,a,s,u,l,c=k[e+\" \"];if(c)return t?0:c.slice(0);s=e,u=[],l=r.preFilter;while(s){n&&!(i=F.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),n=!1,(i=_.exec(s))&&(n=i.shift(),o.push({value:n,type:i[0].replace(B,\" \")}),s=s.slice(n.length));for(a in r.filter)!(i=V[a].exec(s))||l[a]&&!(i=l[a](i))||(n=i.shift(),o.push({value:n,type:a,matches:i}),s=s.slice(n.length));if(!n)break}return t?s.length:s?oe.error(e):k(e,u).slice(0)};function ve(e){for(var t=0,n=e.length,r=\"\";t<n;t++)r+=e[t].value;return r}function me(e,t,n){var r=t.dir,i=t.next,o=i||r,a=n&&\"parentNode\"===o,s=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||a)return e(t,n,i);return!1}:function(t,n,u){var l,c,f,p=[T,s];if(u){while(t=t[r])if((1===t.nodeType||a)&&e(t,n,u))return!0}else while(t=t[r])if(1===t.nodeType||a)if(f=t[b]||(t[b]={}),c=f[t.uniqueID]||(f[t.uniqueID]={}),i&&i===t.nodeName.toLowerCase())t=t[r]||t;else{if((l=c[o])&&l[0]===T&&l[1]===s)return p[2]=l[2];if(c[o]=p,p[2]=e(t,n,u))return!0}return!1}}function xe(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r<i;r++)oe(e,t[r],n);return n}function we(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Te(e,t,n,r,i,o){return r&&!r[b]&&(r=Te(r)),i&&!i[b]&&(i=Te(i,o)),se(function(o,a,s,u){var l,c,f,p=[],d=[],h=a.length,g=o||be(t||\"*\",s.nodeType?[s]:s,[]),y=!e||!o&&t?g:we(g,p,e,s,u),v=n?i||(o?e:h||r)?[]:a:y;if(n&&n(y,v,s,u),r){l=we(v,d),r(l,[],s,u),c=l.length;while(c--)(f=l[c])&&(v[d[c]]=!(y[d[c]]=f))}if(o){if(i||e){if(i){l=[],c=v.length;while(c--)(f=v[c])&&l.push(y[c]=f);i(null,v=[],l,u)}c=v.length;while(c--)(f=v[c])&&(l=i?O(o,f):p[c])>-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[\" \"],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u<o;u++)if(n=r.relative[e[u].type])p=[me(xe(p),n)];else{if((n=r.filter[e[u].type].apply(null,e[u].matches))[b]){for(i=++u;i<o;i++)if(r.relative[e[i].type])break;return Te(u>1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:\" \"===e[u-2].type?\"*\":\"\"})).replace(B,\"$1\"),n,u<i&&Ce(e.slice(u,i)),i<o&&Ce(e=e.slice(i)),i<o&&ve(e))}p.push(n)}return xe(p)}function Ee(e,t){var n=t.length>0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m=\"0\",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG(\"*\",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+\" \"];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p=\"function\"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&\"ID\"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split(\"\").sort(D).join(\"\")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement(\"fieldset\"))}),ue(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||le(\"type|href|height|width\",function(e,t,n){if(!n)return e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||le(\"value\",function(e,t,n){if(!n&&\"input\"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute(\"disabled\")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[\":\"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):\"string\"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if(\"string\"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t<r;t++)if(w.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)w.find(e,i[t],n);return r>1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,\"string\"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,\"string\"==typeof e){if(!(i=\"<\"===e[0]&&\">\"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(w.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a=\"string\"!=typeof e&&w(e);if(!D.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?\"string\"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,\"parentNode\")},parentsUntil:function(e,t,n){return k(e,\"parentNode\",n)},next:function(e){return P(e,\"nextSibling\")},prev:function(e){return P(e,\"previousSibling\")},nextAll:function(e){return k(e,\"nextSibling\")},prevAll:function(e){return k(e,\"previousSibling\")},nextUntil:function(e,t,n){return k(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return k(e,\"previousSibling\",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,\"iframe\")?e.contentDocument:(N(e,\"template\")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return\"Until\"!==e.slice(-5)&&(r=n),r&&\"string\"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\\x20\\t\\r\\n\\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e=\"string\"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s<o.length)!1===o[s].apply(n[0],n[1])&&e.stopOnFalse&&(s=o.length,n=!1)}e.memory||(n=!1),t=!1,i&&(o=n?[]:\"\")},l={add:function(){return o&&(n&&!t&&(s=o.length-1,a.push(n)),function t(n){w.each(n,function(n,r){g(r)?e.unique&&l.has(r)||o.push(r):r&&r.length&&\"string\"!==x(r)&&t(r)})}(arguments),n&&!t&&u()),this},remove:function(){return w.each(arguments,function(e,t){var n;while((n=w.inArray(t,o,n))>-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n=\"\",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=\"\"),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[[\"notify\",\"progress\",w.Callbacks(\"memory\"),w.Callbacks(\"memory\"),2],[\"resolve\",\"done\",w.Callbacks(\"once memory\"),w.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",w.Callbacks(\"once memory\"),w.Callbacks(\"once memory\"),1,\"rejected\"]],r=\"pending\",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},\"catch\":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+\"With\"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t<o)){if((e=r.apply(s,u))===n.promise())throw new TypeError(\"Thenable self-resolution\");l=e&&(\"object\"==typeof e||\"function\"==typeof e)&&e.then,g(l)?i?l.call(e,a(o,n,I,i),a(o,n,W,i)):(o++,l.call(e,a(o,n,I,i),a(o,n,W,i),a(o,n,I,n.notifyWith))):(r!==I&&(s=void 0,u=[e]),(i||n.resolveWith)(s,u))}},c=i?l:function(){try{l()}catch(e){w.Deferred.exceptionHook&&w.Deferred.exceptionHook(e,c.stackTrace),t+1>=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+\"With\"](this===o?void 0:this,arguments),this},o[t[0]+\"With\"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),\"pending\"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn(\"jQuery.Deferred exception: \"+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)[\"catch\"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener(\"DOMContentLoaded\",_),e.removeEventListener(\"load\",_),w.ready()}\"complete\"===r.readyState||\"loading\"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener(\"DOMContentLoaded\",_),e.addEventListener(\"load\",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if(\"object\"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},X=/^-ms-/,U=/-([a-z])/g;function V(e,t){return t.toUpperCase()}function G(e){return e.replace(X,\"ms-\").replace(U,V)}var Y=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Q(){this.expando=w.expando+Q.uid++}Q.uid=1,Q.prototype={cache:function(e){var t=e[this.expando];return t||(t={},Y(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if(\"string\"==typeof t)i[G(t)]=n;else for(r in t)i[G(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][G(t)]},access:function(e,t,n){return void 0===t||t&&\"string\"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(G):(t=G(t))in r?[t]:t.match(M)||[]).length;while(n--)delete r[t[n]]}(void 0===t||w.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!w.isEmptyObject(t)}};var J=new Q,K=new Q,Z=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,ee=/[A-Z]/g;function te(e){return\"true\"===e||\"false\"!==e&&(\"null\"===e?null:e===+e+\"\"?+e:Z.test(e)?JSON.parse(e):e)}function ne(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(ee,\"-$&\").toLowerCase(),\"string\"==typeof(n=e.getAttribute(r))){try{n=te(n)}catch(e){}K.set(e,t,n)}else n=void 0;return n}w.extend({hasData:function(e){return K.hasData(e)||J.hasData(e)},data:function(e,t,n){return K.access(e,t,n)},removeData:function(e,t){K.remove(e,t)},_data:function(e,t,n){return J.access(e,t,n)},_removeData:function(e,t){J.remove(e,t)}}),w.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=K.get(o),1===o.nodeType&&!J.get(o,\"hasDataAttrs\"))){n=a.length;while(n--)a[n]&&0===(r=a[n].name).indexOf(\"data-\")&&(r=G(r.slice(5)),ne(o,r,i[r]));J.set(o,\"hasDataAttrs\",!0)}return i}return\"object\"==typeof e?this.each(function(){K.set(this,e)}):z(this,function(t){var n;if(o&&void 0===t){if(void 0!==(n=K.get(o,e)))return n;if(void 0!==(n=ne(o,e)))return n}else this.each(function(){K.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||\"fx\")+\"queue\",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||\"fx\";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};\"inprogress\"===i&&(i=n.shift(),r--),i&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks(\"once memory\").add(function(){J.remove(e,[t+\"queue\",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return\"string\"!=typeof e&&(t=e,e=\"fx\",n--),arguments.length<n?w.queue(this[0],e):void 0===t?this:this.each(function(){var n=w.queue(this,e,t);w._queueHooks(this,e),\"fx\"===e&&\"inprogress\"!==n[0]&&w.dequeue(this,e)})},dequeue:function(e){return this.each(function(){w.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,i=w.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";while(a--)(n=J.get(o[a],e+\"queueHooks\"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var re=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,ie=new RegExp(\"^(?:([+-])=|)(\"+re+\")([a-z%]*)$\",\"i\"),oe=[\"Top\",\"Right\",\"Bottom\",\"Left\"],ae=function(e,t){return\"none\"===(e=t||e).style.display||\"\"===e.style.display&&w.contains(e.ownerDocument,e)&&\"none\"===w.css(e,\"display\")},se=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i};function ue(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return w.css(e,t,\"\")},u=s(),l=n&&n[3]||(w.cssNumber[t]?\"\":\"px\"),c=(w.cssNumber[t]||\"px\"!==l&&+u)&&ie.exec(w.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)w.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,w.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var le={};function ce(e){var t,n=e.ownerDocument,r=e.nodeName,i=le[r];return i||(t=n.body.appendChild(n.createElement(r)),i=w.css(t,\"display\"),t.parentNode.removeChild(t),\"none\"===i&&(i=\"block\"),le[r]=i,i)}function fe(e,t){for(var n,r,i=[],o=0,a=e.length;o<a;o++)(r=e[o]).style&&(n=r.style.display,t?(\"none\"===n&&(i[o]=J.get(r,\"display\")||null,i[o]||(r.style.display=\"\")),\"\"===r.style.display&&ae(r)&&(i[o]=ce(r))):\"none\"!==n&&(i[o]=\"none\",J.set(r,\"display\",n)));for(o=0;o<a;o++)null!=i[o]&&(e[o].style.display=i[o]);return e}w.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?w(this).show():w(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i,he=/^$|^module$|\\/(?:java|ecma)script/i,ge={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n<r;n++)J.set(e[n],\"globalEval\",!t||J.get(t[n],\"globalEval\"))}var me=/<|&#?\\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if(\"object\"===x(o))w.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement(\"div\")),s=(de.exec(o)||[\"\",\"\"])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+w.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;w.merge(p,a.childNodes),(a=f.firstChild).textContent=\"\"}else p.push(t.createTextNode(o));f.textContent=\"\",d=0;while(o=p[d++])if(r&&w.inArray(o,r)>-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),\"script\"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||\"\")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement(\"div\")),t=r.createElement(\"input\");t.setAttribute(\"type\",\"radio\"),t.setAttribute(\"checked\",\"checked\"),t.setAttribute(\"name\",\"t\"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML=\"<textarea>x</textarea>\",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if(\"object\"==typeof t){\"string\"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&(\"string\"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return\"undefined\"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||\"\").match(M)||[\"\"]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(\".\")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||\"\").match(M)||[\"\"]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||\"\").split(\".\").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,\"handle events\")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,\"events\")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n<arguments.length;n++)u[n]=arguments[n];if(t.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,t)){s=w.event.handlers.call(this,t,l),n=0;while((o=s[n++])&&!t.isPropagationStopped()){t.currentTarget=o.elem,r=0;while((a=o.handlers[r++])&&!t.isImmediatePropagationStopped())t.rnamespace&&!t.rnamespace.test(a.namespace)||(t.handleObj=a,t.data=a.data,void 0!==(i=((w.event.special[a.origType]||{}).handle||a.handler).apply(o.elem,u))&&!1===(t.result=i)&&(t.preventDefault(),t.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,t),t.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!(\"click\"===e.type&&e.button>=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&(\"click\"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+\" \"]&&(a[i]=r.needsContext?w(i,this).index(l)>-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(e,t){Object.defineProperty(w.Event.prototype,e,{enumerable:!0,configurable:!0,get:g(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[w.expando]?e:new w.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==Se()&&this.focus)return this.focus(),!1},delegateType:\"focusin\"},blur:{trigger:function(){if(this===Se()&&this.blur)return this.blur(),!1},delegateType:\"focusout\"},click:{trigger:function(){if(\"checkbox\"===this.type&&this.click&&N(this,\"input\"))return this.click(),!1},_default:function(e){return N(e.target,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},w.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},w.Event=function(e,t){if(!(this instanceof w.Event))return new w.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ee:ke,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&w.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[w.expando]=!0},w.Event.prototype={constructor:w.Event,isDefaultPrevented:ke,isPropagationStopped:ke,isImmediatePropagationStopped:ke,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ee,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ee,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ee,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},w.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,\"char\":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&we.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Te.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},w.event.addProp),w.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,t){w.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||w.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),w.fn.extend({on:function(e,t,n,r){return De(this,e,t,n,r)},one:function(e,t,n,r){return De(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,w(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&\"function\"!=typeof t||(n=t,t=void 0),!1===n&&(n=ke),this.each(function(){w.event.remove(this,e,n,t)})}});var Ne=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,Ae=/<script|<style|<link/i,je=/checked\\s*(?:[^=]|=\\s*.checked.)/i,qe=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;function Le(e,t){return N(e,\"table\")&&N(11!==t.nodeType?t:t.firstChild,\"tr\")?w(e).children(\"tbody\")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function Oe(e){return\"true/\"===(e.type||\"\").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute(\"type\"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n<r;n++)w.event.add(t,i,l[i][n])}K.hasData(e)&&(s=K.access(e),u=w.extend({},s),K.set(t,u))}}function Me(e,t){var n=t.nodeName.toLowerCase();\"input\"===n&&pe.test(e.type)?t.checked=e.checked:\"input\"!==n&&\"textarea\"!==n||(t.defaultValue=e.defaultValue)}function Re(e,t,n,r){t=a.apply([],t);var i,o,s,u,l,c,f=0,p=e.length,d=p-1,y=t[0],v=g(y);if(v||p>1&&\"string\"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,\"script\"),He)).length;f<p;f++)l=i,f!==d&&(l=w.clone(l,!0,!0),u&&w.merge(s,ye(l,\"script\"))),n.call(e[f],l,f);if(u)for(c=s[s.length-1].ownerDocument,w.map(s,Oe),f=0;f<u;f++)l=s[f],he.test(l.type||\"\")&&!J.access(l,\"globalEval\")&&w.contains(c,l)&&(l.src&&\"module\"!==(l.type||\"\").toLowerCase()?w._evalUrl&&w._evalUrl(l.src):m(l.textContent.replace(qe,\"\"),c,l))}return e}function Ie(e,t,n){for(var r,i=t?w.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||w.cleanData(ye(r)),r.parentNode&&(n&&w.contains(r.ownerDocument,r)&&ve(ye(r,\"script\")),r.parentNode.removeChild(r));return e}w.extend({htmlPrefilter:function(e){return e.replace(Ne,\"<$1></$2>\")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r<i;r++)Me(o[r],a[r]);if(t)if(n)for(o=o||ye(e),a=a||ye(s),r=0,i=o.length;r<i;r++)Pe(o[r],a[r]);else Pe(e,s);return(a=ye(s,\"script\")).length>0&&ve(a,!u&&ye(e,\"script\")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(w.cleanData(ye(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return Re(this,arguments,function(t){var n=this.parentNode;w.inArray(this,e)<0&&(w.cleanData(ye(this)),n&&n.replaceChild(t,this))},e)}}),w.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,t){w.fn[e]=function(e){for(var n,r=[],i=w(e),o=i.length-1,a=0;a<=o;a++)n=a===o?this:this.clone(!0),w(i[a])[t](n),s.apply(r,n.get());return this.pushStack(r)}});var We=new RegExp(\"^(\"+re+\")(?!px)[a-z%]+$\",\"i\"),$e=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},Be=new RegExp(oe.join(\"|\"),\"i\");!function(){function t(){if(c){l.style.cssText=\"position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0\",c.style.cssText=\"position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%\",be.appendChild(l).appendChild(c);var t=e.getComputedStyle(c);i=\"1%\"!==t.top,u=12===n(t.marginLeft),c.style.right=\"60%\",s=36===n(t.right),o=36===n(t.width),c.style.position=\"absolute\",a=36===c.offsetWidth||\"absolute\",be.removeChild(l),c=null}}function n(e){return Math.round(parseFloat(e))}var i,o,a,s,u,l=r.createElement(\"div\"),c=r.createElement(\"div\");c.style&&(c.style.backgroundClip=\"content-box\",c.cloneNode(!0).style.backgroundClip=\"\",h.clearCloneStyle=\"content-box\"===c.style.backgroundClip,w.extend(h,{boxSizingReliable:function(){return t(),o},pixelBoxStyles:function(){return t(),s},pixelPosition:function(){return t(),i},reliableMarginLeft:function(){return t(),u},scrollboxSize:function(){return t(),a}}))}();function Fe(e,t,n){var r,i,o,a,s=e.style;return(n=n||$e(e))&&(\"\"!==(a=n.getPropertyValue(t)||n[t])||w.contains(e.ownerDocument,e)||(a=w.style(e,t)),!h.pixelBoxStyles()&&We.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+\"\":a}function _e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}var ze=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ue={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Ve={letterSpacing:\"0\",fontWeight:\"400\"},Ge=[\"Webkit\",\"Moz\",\"ms\"],Ye=r.createElement(\"div\").style;function Qe(e){if(e in Ye)return e;var t=e[0].toUpperCase()+e.slice(1),n=Ge.length;while(n--)if((e=Ge[n]+t)in Ye)return e}function Je(e){var t=w.cssProps[e];return t||(t=w.cssProps[e]=Qe(e)||e),t}function Ke(e,t,n){var r=ie.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function Ze(e,t,n,r,i,o){var a=\"width\"===t?1:0,s=0,u=0;if(n===(r?\"border\":\"content\"))return 0;for(;a<4;a+=2)\"margin\"===n&&(u+=w.css(e,n+oe[a],!0,i)),r?(\"content\"===n&&(u-=w.css(e,\"padding\"+oe[a],!0,i)),\"margin\"!==n&&(u-=w.css(e,\"border\"+oe[a]+\"Width\",!0,i))):(u+=w.css(e,\"padding\"+oe[a],!0,i),\"padding\"!==n?u+=w.css(e,\"border\"+oe[a]+\"Width\",!0,i):s+=w.css(e,\"border\"+oe[a]+\"Width\",!0,i));return!r&&o>=0&&(u+=Math.max(0,Math.ceil(e[\"offset\"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o=\"border-box\"===w.css(e,\"boxSizing\",!1,r),a=o;if(We.test(i)){if(!n)return i;i=\"auto\"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),(\"auto\"===i||!parseFloat(i)&&\"inline\"===w.css(e,\"display\",!1,r))&&(i=e[\"offset\"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?\"border\":\"content\"),a,r,i)+\"px\"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&\"get\"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];\"string\"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o=\"number\"),null!=n&&n===n&&(\"number\"===o&&(n+=i&&i[3]||(w.cssNumber[s]?\"\":\"px\")),h.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(l[t]=\"inherit\"),a&&\"set\"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&\"get\"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),\"normal\"===i&&t in Ve&&(i=Ve[t]),\"\"===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each([\"height\",\"width\"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a=\"border-box\"===w.css(e,\"boxSizing\",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e[\"offset\"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,\"border\",!1,o)-.5)),s&&(i=ie.exec(n))&&\"px\"!==(i[3]||\"px\")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,\"marginLeft\"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+\"px\"}),w.each({margin:\"\",padding:\"\",border:\"Width\"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o=\"string\"==typeof n?n.split(\" \"):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},\"margin\"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a<i;a++)o[t[a]]=w.css(e,t[a],!1,r);return o}return void 0!==n?w.style(e,t,n):w.css(e,t)},e,t,arguments.length>1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?\"\":\"px\")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,\"\"))&&\"auto\"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i[\"margin\"+(n=oe[r])]=i[\"padding\"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners[\"*\"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ct(e,t,n){var r,i,o,a,s,u,l,c,f=\"width\"in t||\"height\"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),y=J.get(e,\"fxshow\");n.queue||(null==(a=w._queueHooks(e,\"fx\")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,w.queue(e,\"fx\").length||a.empty.fire()})}));for(r in t)if(i=t[r],it.test(i)){if(delete t[r],o=o||\"toggle\"===i,i===(g?\"hide\":\"show\")){if(\"show\"!==i||!y||void 0===y[r])continue;g=!0}d[r]=y&&y[r]||w.style(e,r)}if((u=!w.isEmptyObject(t))||!w.isEmptyObject(d)){f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=y&&y.display)&&(l=J.get(e,\"display\")),\"none\"===(c=w.css(e,\"display\"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=w.css(e,\"display\"),fe([e]))),(\"inline\"===c||\"inline-block\"===c&&null!=l)&&\"none\"===w.css(e,\"float\")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l=\"none\"===c?\"\":c)),h.display=\"inline-block\")),n.overflow&&(h.overflow=\"hidden\",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1;for(r in d)u||(y?\"hidden\"in y&&(g=y.hidden):y=J.access(e,\"fxshow\",{display:l}),o&&(y.hidden=!g),g&&fe([e],!0),p.done(function(){g||fe([e]),J.remove(e,\"fxshow\");for(r in d)w.style(e,r,d[r])})),u=lt(g?y[r]:0,r,p),r in y||(y[r]=u.start,g&&(u.end=u.start,u.start=0))}}function ft(e,t){var n,r,i,o,a;for(n in e)if(r=G(n),i=t[r],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=w.cssHooks[r])&&\"expand\"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function pt(e,t,n){var r,i,o=0,a=pt.prefilters.length,s=w.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=nt||st(),n=Math.max(0,l.startTime+l.duration-t),r=1-(n/l.duration||0),o=0,a=l.tweens.length;o<a;o++)l.tweens[o].run(r);return s.notifyWith(e,[l,r,n]),r<1&&a?n:(a||s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:w.extend({},t),opts:w.extend(!0,{specialEasing:{},easing:w.easing._default},n),originalProperties:t,originalOptions:n,startTime:nt||st(),duration:n.duration,tweens:[],createTween:function(t,n){var r=w.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(ft(c,l.opts.specialEasing);o<a;o++)if(r=pt.prefilters[o].call(l,e,c,l.opts))return g(r.stop)&&(w._queueHooks(l.elem,l.opts.queue).stop=r.stop.bind(r)),r;return w.map(c,lt,l),g(l.opts.start)&&l.opts.start.call(e,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),w.fx.timer(w.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l}w.Animation=w.extend(pt,{tweeners:{\"*\":[function(e,t){var n=this.createTween(e,t);return ue(n.elem,e,ie.exec(t),n),n}]},tweener:function(e,t){g(e)?(t=e,e=[\"*\"]):e=e.match(M);for(var n,r=0,i=e.length;r<i;r++)n=e[r],pt.tweeners[n]=pt.tweeners[n]||[],pt.tweeners[n].unshift(t)},prefilters:[ct],prefilter:function(e,t){t?pt.prefilters.unshift(e):pt.prefilters.push(e)}}),w.speed=function(e,t,n){var r=e&&\"object\"==typeof e?w.extend({},e):{complete:n||!n&&t||g(e)&&e,duration:e,easing:n&&t||t&&!g(t)&&t};return w.fx.off?r.duration=0:\"number\"!=typeof r.duration&&(r.duration in w.fx.speeds?r.duration=w.fx.speeds[r.duration]:r.duration=w.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){g(r.old)&&r.old.call(this),r.queue&&w.dequeue(this,r.queue)},r},w.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=w.isEmptyObject(e),o=w.speed(t,n,r),a=function(){var t=pt(this,w.extend({},e),o);(i||J.get(this,\"finish\"))&&t.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return\"string\"!=typeof e&&(n=t,t=e,e=void 0),t&&!1!==e&&this.queue(e||\"fx\",[]),this.each(function(){var t=!0,i=null!=e&&e+\"queueHooks\",o=w.timers,a=J.get(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&ot.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||w.dequeue(this,e)})},finish:function(e){return!1!==e&&(e=e||\"fx\"),this.each(function(){var t,n=J.get(this),r=n[e+\"queue\"],i=n[e+\"queueHooks\"],o=w.timers,a=r?r.length:0;for(n.finish=!0,w.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),w.each([\"toggle\",\"show\",\"hide\"],function(e,t){var n=w.fn[t];w.fn[t]=function(e,r,i){return null==e||\"boolean\"==typeof e?n.apply(this,arguments):this.animate(ut(t,!0),e,r,i)}}),w.each({slideDown:ut(\"show\"),slideUp:ut(\"hide\"),slideToggle:ut(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,t){w.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),w.timers=[],w.fx.tick=function(){var e,t=0,n=w.timers;for(nt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||w.fx.stop(),nt=void 0},w.fx.timer=function(e){w.timers.push(e),w.fx.start()},w.fx.interval=13,w.fx.start=function(){rt||(rt=!0,at())},w.fx.stop=function(){rt=null},w.fx.speeds={slow:600,fast:200,_default:400},w.fn.delay=function(t,n){return t=w.fx?w.fx.speeds[t]||t:t,n=n||\"fx\",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=r.createElement(\"input\"),t=r.createElement(\"select\").appendChild(r.createElement(\"option\"));e.type=\"checkbox\",h.checkOn=\"\"!==e.value,h.optSelected=t.selected,(e=r.createElement(\"input\")).value=\"t\",e.type=\"radio\",h.radioValue=\"t\"===e.value}();var dt,ht=w.expr.attrHandle;w.fn.extend({attr:function(e,t){return z(this,w.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return\"undefined\"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):i&&\"get\"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&\"radio\"===t&&N(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&\"get\"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,\"tabindex\");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{\"for\":\"htmlFor\",\"class\":\"className\"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(\" \")}function mt(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function xt(e){return Array.isArray(e)?e:\"string\"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&\" \"+vt(i)+\" \"){a=0;while(o=t[a++])r.indexOf(\" \"+o+\" \")<0&&(r+=o+\" \");i!==(s=vt(r))&&n.setAttribute(\"class\",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr(\"class\",\"\");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&\" \"+vt(i)+\" \"){a=0;while(o=t[a++])while(r.indexOf(\" \"+o+\" \")>-1)r=r.replace(\" \"+o+\" \",\" \");i!==(s=vt(r))&&n.setAttribute(\"class\",s)}return this},toggleClass:function(e,t){var n=typeof e,r=\"string\"===n||Array.isArray(e);return\"boolean\"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&\"boolean\"!==n||((t=mt(this))&&J.set(this,\"__className__\",t),this.setAttribute&&this.setAttribute(\"class\",t||!1===e?\"\":J.get(this,\"__className__\")||\"\"))})},hasClass:function(e){var t,n,r=0;t=\" \"+e+\" \";while(n=this[r++])if(1===n.nodeType&&(\" \"+vt(mt(n))+\" \").indexOf(t)>-1)return!0;return!1}});var bt=/\\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i=\"\":\"number\"==typeof i?i+=\"\":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?\"\":e+\"\"})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&\"set\"in t&&void 0!==t.set(this,i,\"value\")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&\"get\"in t&&void 0!==(n=t.get(i,\"value\"))?n:\"string\"==typeof(n=i.value)?n.replace(bt,\"\"):null==n?\"\":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,\"value\");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a=\"select-one\"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!N(n.parentNode,\"optgroup\"))){if(t=w(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=w.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=w.inArray(w.valHooks.option.get(r),o)>-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each([\"radio\",\"checkbox\"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})}),h.focusin=\"onfocusin\"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,\"type\")?t.type:t,x=f.call(t,\"namespace\")?t.namespace.split(\".\"):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(\".\")>-1&&(m=(x=m.split(\".\")).shift(),x.sort()),c=m.indexOf(\":\")<0&&\"on\"+m,t=t[w.expando]?t:new w.Event(m,\"object\"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join(\".\"),t.rnamespace=t.namespace?new RegExp(\"(^|\\\\.)\"+x.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,\"events\")||{})[t.type]&&J.get(s,\"handle\"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\\?/;w.parseXML=function(t){var n;if(!t||\"string\"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,\"text/xml\")}catch(e){n=void 0}return n&&!n.getElementsByTagName(\"parsererror\").length||w.error(\"Invalid XML: \"+t),n};var St=/\\[\\]$/,Dt=/\\r?\\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+\"[\"+(\"object\"==typeof i&&null!=i?t:\"\")+\"]\",i,n,r)});else if(n||\"object\"!==x(t))r(e,t);else for(i in t)jt(e+\"[\"+i+\"]\",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join(\"&\")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,\"elements\");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(\":disabled\")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,\"\\r\\n\")}}):{name:t.name,value:n.replace(Dt,\"\\r\\n\")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\\/\\//,It={},Wt={},$t=\"*/\".concat(\"*\"),Bt=r.createElement(\"a\");Bt.href=Ct.href;function Ft(e){return function(t,n){\"string\"!=typeof t&&(n=t,t=\"*\");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])\"+\"===r[0]?(r=r.slice(1)||\"*\",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return\"string\"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i[\"*\"]&&a(\"*\")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while(\"*\"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+\" \"+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if(\"*\"===o)o=u;else if(\"*\"!==u&&u!==o){if(!(a=l[u+\" \"+o]||l[\"* \"+o]))for(i in l)if((s=i.split(\" \"))[1]===o&&(a=l[u+\" \"+s[0]]||l[\"* \"+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e[\"throws\"])t=a(t);else try{t=a(t)}catch(e){return{state:\"parsererror\",error:a?e:\"No conversion from \"+u+\" to \"+o}}}return{state:\"success\",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:\"GET\",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":$t,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){\"object\"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks(\"once memory\"),x=h.statusCode||{},b={},T={},C=\"canceled\",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+\"\").replace(Rt,Ct.protocol+\"//\"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||\"*\").toLowerCase().match(M)||[\"\"],null==h.crossDomain){l=r.createElement(\"a\");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+\"//\"+Bt.host!=l.protocol+\"//\"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&\"string\"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger(\"ajaxStart\"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,\"\"),h.hasContent?h.data&&h.processData&&0===(h.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(h.data=h.data.replace(qt,\"+\")):(d=h.url.slice(o.length),h.data&&(h.processData||\"string\"==typeof h.data)&&(o+=(kt.test(o)?\"&\":\"?\")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,\"$1\"),d=(kt.test(o)?\"&\":\"?\")+\"_=\"+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader(\"If-Modified-Since\",w.lastModified[o]),w.etag[o]&&E.setRequestHeader(\"If-None-Match\",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader(\"Content-Type\",h.contentType),E.setRequestHeader(\"Accept\",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+(\"*\"!==h.dataTypes[0]?\", \"+$t+\"; q=0.01\":\"\"):h.accepts[\"*\"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C=\"abort\",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger(\"ajaxSend\",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort(\"timeout\")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,\"No Transport\");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||\"\",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader(\"Last-Modified\"))&&(w.lastModified[o]=T),(T=E.getResponseHeader(\"etag\"))&&(w.etag[o]=T)),204===t||\"HEAD\"===h.type?C=\"nocontent\":304===t?C=\"notmodified\":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C=\"error\",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+\"\",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?\"ajaxSuccess\":\"ajaxError\",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger(\"ajaxComplete\",[E,h]),--w.active||w.event.trigger(\"ajaxStop\")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,\"json\")},getScript:function(e,t){return w.get(e,void 0,t,\"script\")}}),w.each([\"get\",\"post\"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,\"throws\":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not(\"body\").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&\"withCredentials\"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i[\"X-Requested-With\"]||(i[\"X-Requested-With\"]=\"XMLHttpRequest\");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,\"abort\"===e?s.abort():\"error\"===e?\"number\"!=typeof s.status?o(0,\"error\"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,\"text\"!==(s.responseType||\"text\")||\"string\"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n(\"error\"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n(\"abort\");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),w.ajaxTransport(\"script\",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(\"<script>\").prop({charset:e.scriptCharset,src:e.url}).on(\"load error\",n=function(e){t.remove(),n=null,e&&o(\"error\"===e.type?404:200,e.type)}),r.head.appendChild(t[0])},abort:function(){n&&n()}}}});var Yt=[],Qt=/(=)\\?(?=&|$)|\\?\\?/;w.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=Yt.pop()||w.expando+\"_\"+Et++;return this[e]=!0,e}}),w.ajaxPrefilter(\"json jsonp\",function(t,n,r){var i,o,a,s=!1!==t.jsonp&&(Qt.test(t.url)?\"url\":\"string\"==typeof t.data&&0===(t.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Qt.test(t.data)&&\"data\");if(s||\"jsonp\"===t.dataTypes[0])return i=t.jsonpCallback=g(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Qt,\"$1\"+i):!1!==t.jsonp&&(t.url+=(kt.test(t.url)?\"&\":\"?\")+t.jsonp+\"=\"+i),t.converters[\"script json\"]=function(){return a||w.error(i+\" was not called\"),a[0]},t.dataTypes[0]=\"json\",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?w(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,Yt.push(i)),a&&g(o)&&o(a[0]),a=o=void 0}),\"script\"}),h.createHTMLDocument=function(){var e=r.implementation.createHTMLDocument(\"\").body;return e.innerHTML=\"<form></form><form></form>\",2===e.childNodes.length}(),w.parseHTML=function(e,t,n){if(\"string\"!=typeof e)return[];\"boolean\"==typeof t&&(n=t,t=!1);var i,o,a;return t||(h.createHTMLDocument?((i=(t=r.implementation.createHTMLDocument(\"\")).createElement(\"base\")).href=r.location.href,t.head.appendChild(i)):t=r),o=A.exec(e),a=!n&&[],o?[t.createElement(o[1])]:(o=xe([e],t,a),a&&a.length&&w(a).remove(),w.merge([],o.childNodes))},w.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(\" \");return s>-1&&(r=vt(e.slice(s)),e=e.slice(0,s)),g(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(i=\"POST\"),a.length>0&&w.ajax({url:e,type:i||\"GET\",dataType:\"html\",data:t}).done(function(e){o=arguments,a.html(r?w(\"<div>\").append(w.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},w.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){w.fn[t]=function(e){return this.on(t,e)}}),w.expr.pseudos.animated=function(e){return w.grep(w.timers,function(t){return e===t.elem}).length},w.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=w.css(e,\"position\"),f=w(e),p={};\"static\"===c&&(e.style.position=\"relative\"),s=f.offset(),o=w.css(e,\"top\"),u=w.css(e,\"left\"),(l=(\"absolute\"===c||\"fixed\"===c)&&(o+u).indexOf(\"auto\")>-1)?(a=(r=f.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),g(t)&&(t=t.call(e,n,w.extend({},s))),null!=t.top&&(p.top=t.top-s.top+a),null!=t.left&&(p.left=t.left-s.left+i),\"using\"in t?t.using.call(e,p):f.css(p)}},w.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){w.offset.setOffset(this,e,t)});var t,n,r=this[0];if(r)return r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if(\"fixed\"===w.css(r,\"position\"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&\"static\"===w.css(e,\"position\"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=w(e).offset()).top+=w.css(e,\"borderTopWidth\",!0),i.left+=w.css(e,\"borderLeftWidth\",!0))}return{top:t.top-i.top-w.css(r,\"marginTop\",!0),left:t.left-i.left-w.css(r,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&\"static\"===w.css(e,\"position\"))e=e.offsetParent;return e||be})}}),w.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(e,t){var n=\"pageYOffset\"===t;w.fn[e]=function(r){return z(this,function(e,r,i){var o;if(y(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),w.each([\"top\",\"left\"],function(e,t){w.cssHooks[t]=_e(h.pixelPosition,function(e,n){if(n)return n=Fe(e,t),We.test(n)?w(e).position()[t]+\"px\":n})}),w.each({Height:\"height\",Width:\"width\"},function(e,t){w.each({padding:\"inner\"+e,content:t,\"\":\"outer\"+e},function(n,r){w.fn[r]=function(i,o){var a=arguments.length&&(n||\"boolean\"!=typeof i),s=n||(!0===i||!0===o?\"margin\":\"border\");return z(this,function(t,n,i){var o;return y(t)?0===r.indexOf(\"outer\")?t[\"inner\"+e]:t.document.documentElement[\"client\"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body[\"scroll\"+e],o[\"scroll\"+e],t.body[\"offset\"+e],o[\"offset\"+e],o[\"client\"+e])):void 0===i?w.css(t,n,s):w.style(t,n,i,s)},t,a?i:void 0,a)}})}),w.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}}),w.proxy=function(e,t){var n,r,i;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=N,w.isFunction=g,w.isWindow=y,w.camelCase=G,w.type=x,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},\"function\"==\"function\"&&__webpack_require__(48)&&!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function(){return w}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));var Jt=e.jQuery,Kt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=Kt),t&&e.jQuery===w&&(e.jQuery=Jt),w},t||(e.jQuery=e.$=w),w});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS9kaXN0L2pxdWVyeS5taW4uanM/OTVkYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLGVBQWUsYUFBYSx1R0FBdUcsMkVBQTJFLFlBQVksTUFBTSxzREFBc0QsYUFBYSw0RkFBNEYsbUVBQW1FLGlCQUFpQix3REFBd0QsaUJBQWlCLDZCQUE2QixJQUFJLDRCQUE0QixrQkFBa0IseUNBQXlDLDJDQUEyQyxnREFBZ0QsY0FBYyw2RkFBNkYsOEJBQThCLDBCQUEwQix3Q0FBd0Msa0JBQWtCLHlEQUF5RCxvQkFBb0IsaUJBQWlCLDREQUE0RCx1QkFBdUIsb0NBQW9DLDJCQUEyQixrQkFBa0Isc0JBQXNCLGlCQUFpQiwrQ0FBK0MscUJBQXFCLEdBQUcsa0JBQWtCLCtDQUErQyxrQkFBa0Isa0JBQWtCLGlCQUFpQixtQkFBbUIsZ0JBQWdCLGlDQUFpQyw4Q0FBOEMsZ0JBQWdCLDJDQUEyQyxvQ0FBb0MsaUNBQWlDLGtDQUFrQyw2QkFBNkIsZ0RBQWdELHFDQUFxQyxzQkFBc0IsSUFBSSxpTEFBaUwsNkNBQTZDLFNBQVMsV0FBVyx3RkFBd0YsbUJBQW1CLGtCQUFrQiwyQkFBMkIsUUFBUSxxSUFBcUksMkJBQTJCLE1BQU0sb0JBQW9CLFNBQVMsd0JBQXdCLEtBQUssb0JBQW9CLFVBQVUsU0FBUyxlQUFlLElBQUksc0NBQXNDLGtEQUFrRCxTQUFTLGtCQUFrQix1Q0FBdUMseUJBQXlCLFlBQVksaUZBQWlGLHlCQUF5QixnQ0FBZ0MscUJBQXFCLG1DQUFtQyxJQUFJLGdCQUFnQixvQkFBb0Isc0JBQXNCLG1DQUFtQyxJQUFJLHFDQUFxQyxTQUFTLHFCQUFxQixpQkFBaUIsdUJBQXVCLElBQUkscUNBQXFDLGlEQUFpRCxxQkFBcUIsa0JBQWtCLCtLQUErSyxvQ0FBb0MsRUFBRSxjQUFjLHlDQUF5Qyw0RUFBNEUsa0JBQWtCLDBIQUEw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LHlEQUF5RCxhQUFhLEdBQUcsVUFBVSxpREFBaUQsZUFBZSx3QkFBd0Isb0JBQW9CLDhCQUE4QixNQUFNLDRFQUE0RSx5REFBeUQsd0JBQXdCLHNDQUFzQywrQ0FBK0MsMkRBQTJELEVBQUUsVUFBVSw4QkFBOEIsZUFBZSxRQUFRLHlDQUF5QyxlQUFlLHNCQUFzQix5RkFBeUYsOEJBQThCLE1BQU0sK1BBQStQLGtCQUFrQixFQUFFLDBOQUEwTixzQkFBc0IsK0RBQStELGVBQWUsb0JBQW9CLDRDQUE0QyxlQUFlLHFCQUFxQiwyQkFBMkIsc0JBQXNCLDBCQUEwQiw0QkFBNEIsd0JBQXdCLDRCQUE0QixvRUFBb0Usd0JBQXdCLFVBQVUsdUZBQXVGLG9EQUFvRCxrQ0FBa0MseUJBQXlCLDRCQUE0Qix1SkFBdUosZ0JBQWdCLDREQUE0RCxtSUFBc0UsU0FBUztBQUFBLHFHQUFFLHVCQUF1QixnQ0FBZ0MsMERBQTBELHVCQUF1QiIsImZpbGUiOiI0Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qISBqUXVlcnkgdjMuMy4xIHwgKGMpIEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyB8IGpxdWVyeS5vcmcvbGljZW5zZSAqL1xuIWZ1bmN0aW9uKGUsdCl7XCJ1c2Ugc3RyaWN0XCI7XCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUuZG9jdW1lbnQ/dChlLCEwKTpmdW5jdGlvbihlKXtpZighZS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoXCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50XCIpO3JldHVybiB0KGUpfTp0KGUpfShcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKGUsdCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49W10scj1lLmRvY3VtZW50LGk9T2JqZWN0LmdldFByb3RvdHlwZU9mLG89bi5zbGljZSxhPW4uY29uY2F0LHM9bi5wdXNoLHU9bi5pbmRleE9mLGw9e30sYz1sLnRvU3RyaW5nLGY9bC5oYXNPd25Qcm9wZXJ0eSxwPWYudG9TdHJpbmcsZD1wLmNhbGwoT2JqZWN0KSxoPXt9LGc9ZnVuY3Rpb24gZSh0KXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiZcIm51bWJlclwiIT10eXBlb2YgdC5ub2RlVHlwZX0seT1mdW5jdGlvbiBlKHQpe3JldHVybiBudWxsIT10JiZ0PT09dC53aW5kb3d9LHY9e3R5cGU6ITAsc3JjOiEwLG5vTW9kdWxlOiEwfTtmdW5jdGlvbiBtKGUsdCxuKXt2YXIgaSxvPSh0PXR8fHIpLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7aWYoby50ZXh0PWUsbilmb3IoaSBpbiB2KW5baV0mJihvW2ldPW5baV0pO3QuaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIG51bGw9PWU/ZStcIlwiOlwib2JqZWN0XCI9PXR5cGVvZiBlfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBlP2xbYy5jYWxsKGUpXXx8XCJvYmplY3RcIjp0eXBlb2YgZX12YXIgYj1cIjMuMy4xXCIsdz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgdy5mbi5pbml0KGUsdCl9LFQ9L15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nO3cuZm49dy5wcm90b3R5cGU9e2pxdWVyeTpcIjMuMy4xXCIsY29uc3RydWN0b3I6dyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIG8uY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP28uY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHR9LGVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcubWFwKHRoaXMsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHQsbix0KX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soby5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKyhlPDA/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobj49MCYmbjx0P1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpzLHNvcnQ6bi5zb3J0LHNwbGljZTpuLnNwbGljZX0sdy5leHRlbmQ9dy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8sYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoXCJib29sZWFuXCI9PXR5cGVvZiBhJiYobD1hLGE9YXJndW1lbnRzW3NdfHx7fSxzKyspLFwib2JqZWN0XCI9PXR5cGVvZiBhfHxnKGEpfHwoYT17fSkscz09PXUmJihhPXRoaXMscy0tKTtzPHU7cysrKWlmKG51bGwhPShlPWFyZ3VtZW50c1tzXSkpZm9yKHQgaW4gZSluPWFbdF0sYSE9PShyPWVbdF0pJiYobCYmciYmKHcuaXNQbGFpbk9iamVjdChyKXx8KGk9QXJyYXkuaXNBcnJheShyKSkpPyhpPyhpPSExLG89biYmQXJyYXkuaXNBcnJheShuKT9uOltdKTpvPW4mJncuaXNQbGFpbk9iamVjdChuKT9uOnt9LGFbdF09dy5leHRlbmQobCxvLHIpKTp2b2lkIDAhPT1yJiYoYVt0XT1yKSk7cmV0dXJuIGF9LHcuZXh0ZW5kKHtleHBhbmRvOlwialF1ZXJ5XCIrKFwiMy4zLjFcIitNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cXEQvZyxcIlwiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihlKX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiEoIWV8fFwiW29iamVjdCBPYmplY3RdXCIhPT1jLmNhbGwoZSkpJiYoISh0PWkoZSkpfHxcImZ1bmN0aW9uXCI9PXR5cGVvZihuPWYuY2FsbCh0LFwiY29uc3RydWN0b3JcIikmJnQuY29uc3RydWN0b3IpJiZwLmNhbGwobik9PT1kKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlKXJldHVybiExO3JldHVybiEwfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGUpe20oZSl9LGVhY2g6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTA7aWYoQyhlKSl7Zm9yKG49ZS5sZW5ndGg7cjxuO3IrKylpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWt9ZWxzZSBmb3IociBpbiBlKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVhaztyZXR1cm4gZX0sdHJpbTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9cIlwiOihlK1wiXCIpLnJlcGxhY2UoVCxcIlwiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8W107cmV0dXJuIG51bGwhPWUmJihDKE9iamVjdChlKSk/dy5tZXJnZShuLFwic3RyaW5nXCI9PXR5cGVvZiBlP1tlXTplKTpzLmNhbGwobixlKSksbn0saW5BcnJheTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PXQ/LTE6dS5jYWxsKHQsZSxuKX0sbWVyZ2U6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49K3QubGVuZ3RoLHI9MCxpPWUubGVuZ3RoO3I8bjtyKyspZVtpKytdPXRbcl07cmV0dXJuIGUubGVuZ3RoPWksZX0sZ3JlcDpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByLGk9W10sbz0wLGE9ZS5sZW5ndGgscz0hbjtvPGE7bysrKShyPSF0KGVbb10sbykpIT09cyYmaS5wdXNoKGVbb10pO3JldHVybiBpfSxtYXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz0wLHM9W107aWYoQyhlKSlmb3Iocj1lLmxlbmd0aDtvPHI7bysrKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmcy5wdXNoKGkpO2Vsc2UgZm9yKG8gaW4gZSludWxsIT0oaT10KGVbb10sbyxuKSkmJnMucHVzaChpKTtyZXR1cm4gYS5hcHBseShbXSxzKX0sZ3VpZDoxLHN1cHBvcnQ6aH0pLFwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmKHcuZm5bU3ltYm9sLml0ZXJhdG9yXT1uW1N5bWJvbC5pdGVyYXRvcl0pLHcuZWFjaChcIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sXCIuc3BsaXQoXCIgXCIpLGZ1bmN0aW9uKGUsdCl7bFtcIltvYmplY3QgXCIrdCtcIl1cIl09dC50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gQyhlKXt2YXIgdD0hIWUmJlwibGVuZ3RoXCJpbiBlJiZlLmxlbmd0aCxuPXgoZSk7cmV0dXJuIWcoZSkmJiF5KGUpJiYoXCJhcnJheVwiPT09bnx8MD09PXR8fFwibnVtYmVyXCI9PXR5cGVvZiB0JiZ0PjAmJnQtMSBpbiBlKX12YXIgRT1mdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyx1LGwsYyxmLHAsZCxoLGcseSx2LG0seCxiPVwic2l6emxlXCIrMSpuZXcgRGF0ZSx3PWUuZG9jdW1lbnQsVD0wLEM9MCxFPWFlKCksaz1hZSgpLFM9YWUoKSxEPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10JiYoZj0hMCksMH0sTj17fS5oYXNPd25Qcm9wZXJ0eSxBPVtdLGo9QS5wb3AscT1BLnB1c2gsTD1BLnB1c2gsSD1BLnNsaWNlLE89ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspaWYoZVtuXT09PXQpcmV0dXJuIG47cmV0dXJuLTF9LFA9XCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLE09XCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFI9XCIoPzpcXFxcXFxcXC58W1xcXFx3LV18W15cXDAtXFxcXHhhMF0pK1wiLEk9XCJcXFxcW1wiK00rXCIqKFwiK1IrXCIpKD86XCIrTStcIiooWypeJHwhfl0/PSlcIitNK1wiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIrUitcIikpfClcIitNK1wiKlxcXFxdXCIsVz1cIjooXCIrUitcIikoPzpcXFxcKCgoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXwoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIrSStcIikqKXwuKilcXFxcKXwpXCIsJD1uZXcgUmVnRXhwKE0rXCIrXCIsXCJnXCIpLEI9bmV3IFJlZ0V4cChcIl5cIitNK1wiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIitNK1wiKyRcIixcImdcIiksRj1uZXcgUmVnRXhwKFwiXlwiK00rXCIqLFwiK00rXCIqXCIpLF89bmV3IFJlZ0V4cChcIl5cIitNK1wiKihbPit+XXxcIitNK1wiKVwiK00rXCIqXCIpLHo9bmV3IFJlZ0V4cChcIj1cIitNK1wiKihbXlxcXFxdJ1xcXCJdKj8pXCIrTStcIipcXFxcXVwiLFwiZ1wiKSxYPW5ldyBSZWdFeHAoVyksVT1uZXcgUmVnRXhwKFwiXlwiK1IrXCIkXCIpLFY9e0lEOm5ldyBSZWdFeHAoXCJeIyhcIitSK1wiKVwiKSxDTEFTUzpuZXcgUmVnRXhwKFwiXlxcXFwuKFwiK1IrXCIpXCIpLFRBRzpuZXcgUmVnRXhwKFwiXihcIitSK1wifFsqXSlcIiksQVRUUjpuZXcgUmVnRXhwKFwiXlwiK0kpLFBTRVVETzpuZXcgUmVnRXhwKFwiXlwiK1cpLENISUxEOm5ldyBSZWdFeHAoXCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXFxcKFwiK00rXCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIitNK1wiKig/OihbKy1dfClcIitNK1wiKihcXFxcZCspfCkpXCIrTStcIipcXFxcKXwpXCIsXCJpXCIpLGJvb2w6bmV3IFJlZ0V4cChcIl4oPzpcIitQK1wiKSRcIixcImlcIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoXCJeXCIrTStcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIrTStcIiooKD86LVxcXFxkKT9cXFxcZCopXCIrTStcIipcXFxcKXwpKD89W14tXXwkKVwiLFwiaVwiKX0sRz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFk9L15oXFxkJC9pLFE9L15bXntdK1xce1xccypcXFtuYXRpdmUgXFx3LyxKPS9eKD86IyhbXFx3LV0rKXwoXFx3Kyl8XFwuKFtcXHctXSspKSQvLEs9L1srfl0vLFo9bmV3IFJlZ0V4cChcIlxcXFxcXFxcKFtcXFxcZGEtZl17MSw2fVwiK00rXCI/fChcIitNK1wiKXwuKVwiLFwiaWdcIiksZWU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVwiMHhcIit0LTY1NTM2O3JldHVybiByIT09cnx8bj90OnI8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKHIrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUocj4+MTB8NTUyOTYsMTAyMyZyfDU2MzIwKX0sdGU9LyhbXFwwLVxceDFmXFx4N2ZdfF4tP1xcZCl8Xi0kfFteXFwwLVxceDFmXFx4N2YtXFx1RkZGRlxcdy1dL2csbmU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9cIlxcMFwiPT09ZT9cIlxcdWZmZmRcIjplLnNsaWNlKDAsLTEpK1wiXFxcXFwiK2UuY2hhckNvZGVBdChlLmxlbmd0aC0xKS50b1N0cmluZygxNikrXCIgXCI6XCJcXFxcXCIrZX0scmU9ZnVuY3Rpb24oKXtwKCl9LGllPW1lKGZ1bmN0aW9uKGUpe3JldHVybiEwPT09ZS5kaXNhYmxlZCYmKFwiZm9ybVwiaW4gZXx8XCJsYWJlbFwiaW4gZSl9LHtkaXI6XCJwYXJlbnROb2RlXCIsbmV4dDpcImxlZ2VuZFwifSk7dHJ5e0wuYXBwbHkoQT1ILmNhbGwody5jaGlsZE5vZGVzKSx3LmNoaWxkTm9kZXMpLEFbdy5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZSl7TD17YXBwbHk6QS5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtxLmFwcGx5KGUsSC5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7d2hpbGUoZVtuKytdPXRbcisrXSk7ZS5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gb2UoZSx0LHIsaSl7dmFyIG8scyxsLGMsZixoLHYsbT10JiZ0Lm93bmVyRG9jdW1lbnQsVD10P3Qubm9kZVR5cGU6OTtpZihyPXJ8fFtdLFwic3RyaW5nXCIhPXR5cGVvZiBlfHwhZXx8MSE9PVQmJjkhPT1UJiYxMSE9PVQpcmV0dXJuIHI7aWYoIWkmJigodD90Lm93bmVyRG9jdW1lbnR8fHQ6dykhPT1kJiZwKHQpLHQ9dHx8ZCxnKSl7aWYoMTEhPT1UJiYoZj1KLmV4ZWMoZSkpKWlmKG89ZlsxXSl7aWYoOT09PVQpe2lmKCEobD10LmdldEVsZW1lbnRCeUlkKG8pKSlyZXR1cm4gcjtpZihsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZSBpZihtJiYobD1tLmdldEVsZW1lbnRCeUlkKG8pKSYmeCh0LGwpJiZsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZXtpZihmWzJdKXJldHVybiBMLmFwcGx5KHIsdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkscjtpZigobz1mWzNdKSYmbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZ0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEwuYXBwbHkocix0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobykpLHJ9aWYobi5xc2EmJiFTW2UrXCIgXCJdJiYoIXl8fCF5LnRlc3QoZSkpKXtpZigxIT09VCltPXQsdj1lO2Vsc2UgaWYoXCJvYmplY3RcIiE9PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7KGM9dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk/Yz1jLnJlcGxhY2UodGUsbmUpOnQuc2V0QXR0cmlidXRlKFwiaWRcIixjPWIpLHM9KGg9YShlKSkubGVuZ3RoO3doaWxlKHMtLSloW3NdPVwiI1wiK2MrXCIgXCIrdmUoaFtzXSk7dj1oLmpvaW4oXCIsXCIpLG09Sy50ZXN0KGUpJiZnZSh0LnBhcmVudE5vZGUpfHx0fWlmKHYpdHJ5e3JldHVybiBMLmFwcGx5KHIsbS5xdWVyeVNlbGVjdG9yQWxsKHYpKSxyfWNhdGNoKGUpe31maW5hbGx5e2M9PT1iJiZ0LnJlbW92ZUF0dHJpYnV0ZShcImlkXCIpfX19cmV0dXJuIHUoZS5yZXBsYWNlKEIsXCIkMVwiKSx0LHIsaSl9ZnVuY3Rpb24gYWUoKXt2YXIgZT1bXTtmdW5jdGlvbiB0KG4saSl7cmV0dXJuIGUucHVzaChuK1wiIFwiKT5yLmNhY2hlTGVuZ3RoJiZkZWxldGUgdFtlLnNoaWZ0KCldLHRbbitcIiBcIl09aX1yZXR1cm4gdH1mdW5jdGlvbiBzZShlKXtyZXR1cm4gZVtiXT0hMCxlfWZ1bmN0aW9uIHVlKGUpe3ZhciB0PWQuY3JlYXRlRWxlbWVudChcImZpZWxkc2V0XCIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGxlKGUsdCl7dmFyIG49ZS5zcGxpdChcInxcIiksaT1uLmxlbmd0aDt3aGlsZShpLS0pci5hdHRySGFuZGxlW25baV1dPXR9ZnVuY3Rpb24gY2UoZSx0KXt2YXIgbj10JiZlLHI9biYmMT09PWUubm9kZVR5cGUmJjE9PT10Lm5vZGVUeXBlJiZlLnNvdXJjZUluZGV4LXQuc291cmNlSW5kZXg7aWYocilyZXR1cm4gcjtpZihuKXdoaWxlKG49bi5uZXh0U2libGluZylpZihuPT09dClyZXR1cm4tMTtyZXR1cm4gZT8xOi0xfWZ1bmN0aW9uIGZlKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm5cImlucHV0XCI9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJnQudHlwZT09PWV9fWZ1bmN0aW9uIHBlKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKFwiaW5wdXRcIj09PW58fFwiYnV0dG9uXCI9PT1uKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gZGUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVyblwiZm9ybVwiaW4gdD90LnBhcmVudE5vZGUmJiExPT09dC5kaXNhYmxlZD9cImxhYmVsXCJpbiB0P1wibGFiZWxcImluIHQucGFyZW50Tm9kZT90LnBhcmVudE5vZGUuZGlzYWJsZWQ9PT1lOnQuZGlzYWJsZWQ9PT1lOnQuaXNEaXNhYmxlZD09PWV8fHQuaXNEaXNhYmxlZCE9PSFlJiZpZSh0KT09PWU6dC5kaXNhYmxlZD09PWU6XCJsYWJlbFwiaW4gdCYmdC5kaXNhYmxlZD09PWV9fWZ1bmN0aW9uIGhlKGUpe3JldHVybiBzZShmdW5jdGlvbih0KXtyZXR1cm4gdD0rdCxzZShmdW5jdGlvbihuLHIpe3ZhciBpLG89ZShbXSxuLmxlbmd0aCx0KSxhPW8ubGVuZ3RoO3doaWxlKGEtLSluW2k9b1thXV0mJihuW2ldPSEocltpXT1uW2ldKSl9KX0pfWZ1bmN0aW9uIGdlKGUpe3JldHVybiBlJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1uPW9lLnN1cHBvcnQ9e30sbz1vZS5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuISF0JiZcIkhUTUxcIiE9PXQubm9kZU5hbWV9LHA9b2Uuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQsaSxhPWU/ZS5vd25lckRvY3VtZW50fHxlOnc7cmV0dXJuIGEhPT1kJiY5PT09YS5ub2RlVHlwZSYmYS5kb2N1bWVudEVsZW1lbnQ/KGQ9YSxoPWQuZG9jdW1lbnRFbGVtZW50LGc9IW8oZCksdyE9PWQmJihpPWQuZGVmYXVsdFZpZXcpJiZpLnRvcCE9PWkmJihpLmFkZEV2ZW50TGlzdGVuZXI/aS5hZGRFdmVudExpc3RlbmVyKFwidW5sb2FkXCIscmUsITEpOmkuYXR0YWNoRXZlbnQmJmkuYXR0YWNoRXZlbnQoXCJvbnVubG9hZFwiLHJlKSksbi5hdHRyaWJ1dGVzPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsYXNzTmFtZT1cImlcIiwhZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc05hbWVcIil9KSxuLmdldEVsZW1lbnRzQnlUYWdOYW1lPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKGQuY3JlYXRlQ29tbWVudChcIlwiKSksIWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aH0pLG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1RLnRlc3QoZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxuLmdldEJ5SWQ9dWUoZnVuY3Rpb24oZSl7cmV0dXJuIGguYXBwZW5kQ2hpbGQoZSkuaWQ9YiwhZC5nZXRFbGVtZW50c0J5TmFtZXx8IWQuZ2V0RWxlbWVudHNCeU5hbWUoYikubGVuZ3RofSksbi5nZXRCeUlkPyhyLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoWixlZSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZShcImlkXCIpPT09dH19LHIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1cInVuZGVmaW5lZFwiIT10eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlJiZlLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtyZXR1cm4gbiYmbi52YWx1ZT09PXR9fSxyLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG4scixpLG89dC5nZXRFbGVtZW50QnlJZChlKTtpZihvKXtpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKSkmJm4udmFsdWU9PT1lKXJldHVybltvXTtpPXQuZ2V0RWxlbWVudHNCeU5hbWUoZSkscj0wO3doaWxlKG89aVtyKytdKWlmKChuPW8uZ2V0QXR0cmlidXRlTm9kZShcImlkXCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dfXJldHVybltdfX0pLHIuZmluZC5UQUc9bi5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihlLHQpe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6bi5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoXCIqXCI9PT1lKXt3aGlsZShuPW9baSsrXSkxPT09bi5ub2RlVHlwZSYmci5wdXNoKG4pO3JldHVybiByfXJldHVybiBvfSxyLmZpbmQuQ0xBU1M9bi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihlLHQpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmcpcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX0sdj1bXSx5PVtdLChuLnFzYT1RLnRlc3QoZC5xdWVyeVNlbGVjdG9yQWxsKSkmJih1ZShmdW5jdGlvbihlKXtoLmFwcGVuZENoaWxkKGUpLmlubmVySFRNTD1cIjxhIGlkPSdcIitiK1wiJz48L2E+PHNlbGVjdCBpZD0nXCIrYitcIi1cXHJcXFxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PlwiLGUucXVlcnlTZWxlY3RvckFsbChcIlttc2FsbG93Y2FwdHVyZV49JyddXCIpLmxlbmd0aCYmeS5wdXNoKFwiWypeJF09XCIrTStcIiooPzonJ3xcXFwiXFxcIilcIiksZS5xdWVyeVNlbGVjdG9yQWxsKFwiW3NlbGVjdGVkXVwiKS5sZW5ndGh8fHkucHVzaChcIlxcXFxbXCIrTStcIiooPzp2YWx1ZXxcIitQK1wiKVwiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaWR+PVwiK2IrXCItXVwiKS5sZW5ndGh8fHkucHVzaChcIn49XCIpLGUucXVlcnlTZWxlY3RvckFsbChcIjpjaGVja2VkXCIpLmxlbmd0aHx8eS5wdXNoKFwiOmNoZWNrZWRcIiksZS5xdWVyeVNlbGVjdG9yQWxsKFwiYSNcIitiK1wiKypcIikubGVuZ3RofHx5LnB1c2goXCIuIy4rWyt+XVwiKX0pLHVlKGZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPVwiPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT48c2VsZWN0IGRpc2FibGVkPSdkaXNhYmxlZCc+PG9wdGlvbi8+PC9zZWxlY3Q+XCI7dmFyIHQ9ZC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7dC5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsXCJoaWRkZW5cIiksZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoXCJuYW1lXCIsXCJEXCIpLGUucXVlcnlTZWxlY3RvckFsbChcIltuYW1lPWRdXCIpLmxlbmd0aCYmeS5wdXNoKFwibmFtZVwiK00rXCIqWypeJHwhfl0/PVwiKSwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKFwiOmVuYWJsZWRcIikubGVuZ3RoJiZ5LnB1c2goXCI6ZW5hYmxlZFwiLFwiOmRpc2FibGVkXCIpLGguYXBwZW5kQ2hpbGQoZSkuZGlzYWJsZWQ9ITAsMiE9PWUucXVlcnlTZWxlY3RvckFsbChcIjpkaXNhYmxlZFwiKS5sZW5ndGgmJnkucHVzaChcIjplbmFibGVkXCIsXCI6ZGlzYWJsZWRcIiksZS5xdWVyeVNlbGVjdG9yQWxsKFwiKiw6eFwiKSx5LnB1c2goXCIsLio6XCIpfSkpLChuLm1hdGNoZXNTZWxlY3Rvcj1RLnRlc3QobT1oLm1hdGNoZXN8fGgud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxoLm1vek1hdGNoZXNTZWxlY3Rvcnx8aC5vTWF0Y2hlc1NlbGVjdG9yfHxoLm1zTWF0Y2hlc1NlbGVjdG9yKSkmJnVlKGZ1bmN0aW9uKGUpe24uZGlzY29ubmVjdGVkTWF0Y2g9bS5jYWxsKGUsXCIqXCIpLG0uY2FsbChlLFwiW3MhPScnXTp4XCIpLHYucHVzaChcIiE9XCIsVyl9KSx5PXkubGVuZ3RoJiZuZXcgUmVnRXhwKHkuam9pbihcInxcIikpLHY9di5sZW5ndGgmJm5ldyBSZWdFeHAodi5qb2luKFwifFwiKSksdD1RLnRlc3QoaC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikseD10fHxRLnRlc3QoaC5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxEPXQ/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gZj0hMCwwO3ZhciByPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiByfHwoMSYocj0oZS5vd25lckRvY3VtZW50fHxlKT09PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSl8fCFuLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PXI/ZT09PWR8fGUub3duZXJEb2N1bWVudD09PXcmJngodyxlKT8tMTp0PT09ZHx8dC5vd25lckRvY3VtZW50PT09dyYmeCh3LHQpPzE6Yz9PKGMsZSktTyhjLHQpOjA6NCZyPy0xOjEpfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBmPSEwLDA7dmFyIG4scj0wLGk9ZS5wYXJlbnROb2RlLG89dC5wYXJlbnROb2RlLGE9W2VdLHM9W3RdO2lmKCFpfHwhbylyZXR1cm4gZT09PWQ/LTE6dD09PWQ/MTppPy0xOm8/MTpjP08oYyxlKS1PKGMsdCk6MDtpZihpPT09bylyZXR1cm4gY2UoZSx0KTtuPWU7d2hpbGUobj1uLnBhcmVudE5vZGUpYS51bnNoaWZ0KG4pO249dDt3aGlsZShuPW4ucGFyZW50Tm9kZSlzLnVuc2hpZnQobik7d2hpbGUoYVtyXT09PXNbcl0pcisrO3JldHVybiByP2NlKGFbcl0sc1tyXSk6YVtyXT09PXc/LTE6c1tyXT09PXc/MTowfSxkKTpkfSxvZS5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG9lKGUsbnVsbCxudWxsLHQpfSxvZS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSx0KXtpZigoZS5vd25lckRvY3VtZW50fHxlKSE9PWQmJnAoZSksdD10LnJlcGxhY2UoeixcIj0nJDEnXVwiKSxuLm1hdGNoZXNTZWxlY3RvciYmZyYmIVNbdCtcIiBcIl0mJighdnx8IXYudGVzdCh0KSkmJigheXx8IXkudGVzdCh0KSkpdHJ5e3ZhciByPW0uY2FsbChlLHQpO2lmKHJ8fG4uZGlzY29ubmVjdGVkTWF0Y2h8fGUuZG9jdW1lbnQmJjExIT09ZS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gcn1jYXRjaChlKXt9cmV0dXJuIG9lKHQsZCxudWxsLFtlXSkubGVuZ3RoPjB9LG9lLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPT1kJiZwKGUpLHgoZSx0KX0sb2UuYXR0cj1mdW5jdGlvbihlLHQpeyhlLm93bmVyRG9jdW1lbnR8fGUpIT09ZCYmcChlKTt2YXIgaT1yLmF0dHJIYW5kbGVbdC50b0xvd2VyQ2FzZSgpXSxvPWkmJk4uY2FsbChyLmF0dHJIYW5kbGUsdC50b0xvd2VyQ2FzZSgpKT9pKGUsdCwhZyk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1vP286bi5hdHRyaWJ1dGVzfHwhZz9lLmdldEF0dHJpYnV0ZSh0KToobz1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZvLnNwZWNpZmllZD9vLnZhbHVlOm51bGx9LG9lLmVzY2FwZT1mdW5jdGlvbihlKXtyZXR1cm4oZStcIlwiKS5yZXBsYWNlKHRlLG5lKX0sb2UuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKFwiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogXCIrZSl9LG9lLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQscj1bXSxpPTAsbz0wO2lmKGY9IW4uZGV0ZWN0RHVwbGljYXRlcyxjPSFuLnNvcnRTdGFibGUmJmUuc2xpY2UoMCksZS5zb3J0KEQpLGYpe3doaWxlKHQ9ZVtvKytdKXQ9PT1lW29dJiYoaT1yLnB1c2gobykpO3doaWxlKGktLSllLnNwbGljZShyW2ldLDEpfXJldHVybiBjPW51bGwsZX0saT1vZS5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49XCJcIixyPTAsbz1lLm5vZGVUeXBlO2lmKG8pe2lmKDE9PT1vfHw5PT09b3x8MTE9PT1vKXtpZihcInN0cmluZ1wiPT10eXBlb2YgZS50ZXh0Q29udGVudClyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9aShlKX1lbHNlIGlmKDM9PT1vfHw0PT09bylyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSB3aGlsZSh0PWVbcisrXSluKz1pKHQpO3JldHVybiBufSwocj1vZS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpzZSxtYXRjaDpWLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7XCI+XCI6e2RpcjpcInBhcmVudE5vZGVcIixmaXJzdDohMH0sXCIgXCI6e2RpcjpcInBhcmVudE5vZGVcIn0sXCIrXCI6e2RpcjpcInByZXZpb3VzU2libGluZ1wiLGZpcnN0OiEwfSxcIn5cIjp7ZGlyOlwicHJldmlvdXNTaWJsaW5nXCJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKFosZWUpLGVbM109KGVbM118fGVbNF18fGVbNV18fFwiXCIpLnJlcGxhY2UoWixlZSksXCJ+PVwiPT09ZVsyXSYmKGVbM109XCIgXCIrZVszXStcIiBcIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksXCJudGhcIj09PWVbMV0uc2xpY2UoMCwzKT8oZVszXXx8b2UuZXJyb3IoZVswXSksZVs0XT0rKGVbNF0/ZVs1XSsoZVs2XXx8MSk6MiooXCJldmVuXCI9PT1lWzNdfHxcIm9kZFwiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fFwib2RkXCI9PT1lWzNdKSk6ZVszXSYmb2UuZXJyb3IoZVswXSksZX0sUFNFVURPOmZ1bmN0aW9uKGUpe3ZhciB0LG49IWVbNl0mJmVbMl07cmV0dXJuIFYuQ0hJTEQudGVzdChlWzBdKT9udWxsOihlWzNdP2VbMl09ZVs0XXx8ZVs1XXx8XCJcIjpuJiZYLnRlc3QobikmJih0PWEobiwhMCkpJiYodD1uLmluZGV4T2YoXCIpXCIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoWixlZSkudG9Mb3dlckNhc2UoKTtyZXR1cm5cIipcIj09PWU/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXR9fSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1FW2UrXCIgXCJdO3JldHVybiB0fHwodD1uZXcgUmVnRXhwKFwiKF58XCIrTStcIilcIitlK1wiKFwiK00rXCJ8JClcIikpJiZFKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChcInN0cmluZ1wiPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHxcInVuZGVmaW5lZFwiIT10eXBlb2YgZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIil8fFwiXCIpfSl9LEFUVFI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihyKXt2YXIgaT1vZS5hdHRyKHIsZSk7cmV0dXJuIG51bGw9PWk/XCIhPVwiPT09dDohdHx8KGkrPVwiXCIsXCI9XCI9PT10P2k9PT1uOlwiIT1cIj09PXQ/aSE9PW46XCJePVwiPT09dD9uJiYwPT09aS5pbmRleE9mKG4pOlwiKj1cIj09PXQ/biYmaS5pbmRleE9mKG4pPi0xOlwiJD1cIj09PXQ/biYmaS5zbGljZSgtbi5sZW5ndGgpPT09bjpcIn49XCI9PT10PyhcIiBcIitpLnJlcGxhY2UoJCxcIiBcIikrXCIgXCIpLmluZGV4T2Yobik+LTE6XCJ8PVwiPT09dCYmKGk9PT1ufHxpLnNsaWNlKDAsbi5sZW5ndGgrMSk9PT1uK1wiLVwiKSl9fSxDSElMRDpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPVwibnRoXCIhPT1lLnNsaWNlKDAsMyksYT1cImxhc3RcIiE9PWUuc2xpY2UoLTQpLHM9XCJvZi10eXBlXCI9PT10O3JldHVybiAxPT09ciYmMD09PWk/ZnVuY3Rpb24oZSl7cmV0dXJuISFlLnBhcmVudE5vZGV9OmZ1bmN0aW9uKHQsbix1KXt2YXIgbCxjLGYscCxkLGgsZz1vIT09YT9cIm5leHRTaWJsaW5nXCI6XCJwcmV2aW91c1NpYmxpbmdcIix5PXQucGFyZW50Tm9kZSx2PXMmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxtPSF1JiYhcyx4PSExO2lmKHkpe2lmKG8pe3doaWxlKGcpe3A9dDt3aGlsZShwPXBbZ10paWYocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT12OjE9PT1wLm5vZGVUeXBlKXJldHVybiExO2g9Zz1cIm9ubHlcIj09PWUmJiFoJiZcIm5leHRTaWJsaW5nXCJ9cmV0dXJuITB9aWYoaD1bYT95LmZpcnN0Q2hpbGQ6eS5sYXN0Q2hpbGRdLGEmJm0pe3g9KGQ9KGw9KGM9KGY9KHA9eSlbYl18fChwW2JdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbZV18fFtdKVswXT09PVQmJmxbMV0pJiZsWzJdLHA9ZCYmeS5jaGlsZE5vZGVzW2RdO3doaWxlKHA9KytkJiZwJiZwW2ddfHwoeD1kPTApfHxoLnBvcCgpKWlmKDE9PT1wLm5vZGVUeXBlJiYrK3gmJnA9PT10KXtjW2VdPVtULGQseF07YnJlYWt9fWVsc2UgaWYobSYmKHg9ZD0obD0oYz0oZj0ocD10KVtiXXx8KHBbYl09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVtlXXx8W10pWzBdPT09VCYmbFsxXSksITE9PT14KXdoaWxlKHA9KytkJiZwJiZwW2ddfHwoeD1kPTApfHxoLnBvcCgpKWlmKChzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXY6MT09PXAubm9kZVR5cGUpJiYrK3gmJihtJiYoKGM9KGY9cFtiXXx8KHBbYl09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVtlXT1bVCx4XSkscD09PXQpKWJyZWFrO3JldHVybih4LT1pKT09PXJ8fHglcj09MCYmeC9yPj0wfX19LFBTRVVETzpmdW5jdGlvbihlLHQpe3ZhciBuLGk9ci5wc2V1ZG9zW2VdfHxyLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8b2UuZXJyb3IoXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiK2UpO3JldHVybiBpW2JdP2kodCk6aS5sZW5ndGg+MT8obj1bZSxlLFwiXCIsdF0sci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/c2UoZnVuY3Rpb24oZSxuKXt2YXIgcixvPWkoZSx0KSxhPW8ubGVuZ3RoO3doaWxlKGEtLSllW3I9TyhlLG9bYV0pXT0hKG5bcl09b1thXSl9KTpmdW5jdGlvbihlKXtyZXR1cm4gaShlLDAsbil9KTppfX0scHNldWRvczp7bm90OnNlKGZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49W10scj1zKGUucmVwbGFjZShCLFwiJDFcIikpO3JldHVybiByW2JdP3NlKGZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLGE9cihlLG51bGwsaSxbXSkscz1lLmxlbmd0aDt3aGlsZShzLS0pKG89YVtzXSkmJihlW3NdPSEodFtzXT1vKSl9KTpmdW5jdGlvbihlLGksbyl7cmV0dXJuIHRbMF09ZSxyKHQsbnVsbCxvLG4pLHRbMF09bnVsbCwhbi5wb3AoKX19KSxoYXM6c2UoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBvZShlLHQpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOnNlKGZ1bmN0aW9uKGUpe3JldHVybiBlPWUucmVwbGFjZShaLGVlKSxmdW5jdGlvbih0KXtyZXR1cm4odC50ZXh0Q29udGVudHx8dC5pbm5lclRleHR8fGkodCkpLmluZGV4T2YoZSk+LTF9fSksbGFuZzpzZShmdW5jdGlvbihlKXtyZXR1cm4gVS50ZXN0KGV8fFwiXCIpfHxvZS5lcnJvcihcInVuc3VwcG9ydGVkIGxhbmc6IFwiK2UpLGU9ZS5yZXBsYWNlKFosZWUpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24odCl7dmFyIG47ZG97aWYobj1nP3QubGFuZzp0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpfHx0LmdldEF0dHJpYnV0ZShcImxhbmdcIikpcmV0dXJuKG49bi50b0xvd2VyQ2FzZSgpKT09PWV8fDA9PT1uLmluZGV4T2YoZStcIi1cIil9d2hpbGUoKHQ9dC5wYXJlbnROb2RlKSYmMT09PXQubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbih0KXt2YXIgbj1lLmxvY2F0aW9uJiZlLmxvY2F0aW9uLmhhc2g7cmV0dXJuIG4mJm4uc2xpY2UoMSk9PT10LmlkfSxyb290OmZ1bmN0aW9uKGUpe3JldHVybiBlPT09aH0sZm9jdXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1kLmFjdGl2ZUVsZW1lbnQmJighZC5oYXNGb2N1c3x8ZC5oYXNGb2N1cygpKSYmISEoZS50eXBlfHxlLmhyZWZ8fH5lLnRhYkluZGV4KX0sZW5hYmxlZDpkZSghMSksZGlzYWJsZWQ6ZGUoITApLGNoZWNrZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVyblwiaW5wdXRcIj09PXQmJiEhZS5jaGVja2VkfHxcIm9wdGlvblwiPT09dCYmISFlLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCwhMD09PWUuc2VsZWN0ZWR9LGVtcHR5OmZ1bmN0aW9uKGUpe2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZylpZihlLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihlKXtyZXR1cm4hci5wc2V1ZG9zLmVtcHR5KGUpfSxoZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIFkudGVzdChlLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIEcudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm5cImlucHV0XCI9PT10JiZcImJ1dHRvblwiPT09ZS50eXBlfHxcImJ1dHRvblwiPT09dH0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm5cImlucHV0XCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJlwidGV4dFwiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKXx8XCJ0ZXh0XCI9PT10LnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpoZShmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6aGUoZnVuY3Rpb24oZSx0KXtyZXR1cm5bdC0xXX0pLGVxOmhlKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bbjwwP24rdDpuXX0pLGV2ZW46aGUoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHQ7bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxvZGQ6aGUoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MTtuPHQ7bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxsdDpoZShmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6bjstLXI+PTA7KWUucHVzaChyKTtyZXR1cm4gZX0pLGd0OmhlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOysrcjx0OyllLnB1c2gocik7cmV0dXJuIGV9KX19KS5wc2V1ZG9zLm50aD1yLnBzZXVkb3MuZXE7Zm9yKHQgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pci5wc2V1ZG9zW3RdPWZlKHQpO2Zvcih0IGlue3N1Ym1pdDohMCxyZXNldDohMH0pci5wc2V1ZG9zW3RdPXBlKHQpO2Z1bmN0aW9uIHllKCl7fXllLnByb3RvdHlwZT1yLmZpbHRlcnM9ci5wc2V1ZG9zLHIuc2V0RmlsdGVycz1uZXcgeWUsYT1vZS50b2tlbml6ZT1mdW5jdGlvbihlLHQpe3ZhciBuLGksbyxhLHMsdSxsLGM9a1tlK1wiIFwiXTtpZihjKXJldHVybiB0PzA6Yy5zbGljZSgwKTtzPWUsdT1bXSxsPXIucHJlRmlsdGVyO3doaWxlKHMpe24mJiEoaT1GLmV4ZWMocykpfHwoaSYmKHM9cy5zbGljZShpWzBdLmxlbmd0aCl8fHMpLHUucHVzaChvPVtdKSksbj0hMSwoaT1fLmV4ZWMocykpJiYobj1pLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6aVswXS5yZXBsYWNlKEIsXCIgXCIpfSkscz1zLnNsaWNlKG4ubGVuZ3RoKSk7Zm9yKGEgaW4gci5maWx0ZXIpIShpPVZbYV0uZXhlYyhzKSl8fGxbYV0mJiEoaT1sW2FdKGkpKXx8KG49aS5zaGlmdCgpLG8ucHVzaCh7dmFsdWU6bix0eXBlOmEsbWF0Y2hlczppfSkscz1zLnNsaWNlKG4ubGVuZ3RoKSk7aWYoIW4pYnJlYWt9cmV0dXJuIHQ/cy5sZW5ndGg6cz9vZS5lcnJvcihlKTprKGUsdSkuc2xpY2UoMCl9O2Z1bmN0aW9uIHZlKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgscj1cIlwiO3Q8bjt0Kyspcis9ZVt0XS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiBtZShlLHQsbil7dmFyIHI9dC5kaXIsaT10Lm5leHQsbz1pfHxyLGE9biYmXCJwYXJlbnROb2RlXCI9PT1vLHM9QysrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixpKXt3aGlsZSh0PXRbcl0paWYoMT09PXQubm9kZVR5cGV8fGEpcmV0dXJuIGUodCxuLGkpO3JldHVybiExfTpmdW5jdGlvbih0LG4sdSl7dmFyIGwsYyxmLHA9W1Qsc107aWYodSl7d2hpbGUodD10W3JdKWlmKCgxPT09dC5ub2RlVHlwZXx8YSkmJmUodCxuLHUpKXJldHVybiEwfWVsc2Ugd2hpbGUodD10W3JdKWlmKDE9PT10Lm5vZGVUeXBlfHxhKWlmKGY9dFtiXXx8KHRbYl09e30pLGM9Zlt0LnVuaXF1ZUlEXXx8KGZbdC51bmlxdWVJRF09e30pLGkmJmk9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpdD10W3JdfHx0O2Vsc2V7aWYoKGw9Y1tvXSkmJmxbMF09PT1UJiZsWzFdPT09cylyZXR1cm4gcFsyXT1sWzJdO2lmKGNbb109cCxwWzJdPWUodCxuLHUpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB4ZShlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5jdGlvbih0LG4scil7dmFyIGk9ZS5sZW5ndGg7d2hpbGUoaS0tKWlmKCFlW2ldKHQsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06ZVswXX1mdW5jdGlvbiBiZShlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKW9lKGUsdFtyXSxuKTtyZXR1cm4gbn1mdW5jdGlvbiB3ZShlLHQsbixyLGkpe2Zvcih2YXIgbyxhPVtdLHM9MCx1PWUubGVuZ3RoLGw9bnVsbCE9dDtzPHU7cysrKShvPWVbc10pJiYobiYmIW4obyxyLGkpfHwoYS5wdXNoKG8pLGwmJnQucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIFRlKGUsdCxuLHIsaSxvKXtyZXR1cm4gciYmIXJbYl0mJihyPVRlKHIpKSxpJiYhaVtiXSYmKGk9VGUoaSxvKSksc2UoZnVuY3Rpb24obyxhLHMsdSl7dmFyIGwsYyxmLHA9W10sZD1bXSxoPWEubGVuZ3RoLGc9b3x8YmUodHx8XCIqXCIscy5ub2RlVHlwZT9bc106cyxbXSkseT0hZXx8IW8mJnQ/Zzp3ZShnLHAsZSxzLHUpLHY9bj9pfHwobz9lOmh8fHIpP1tdOmE6eTtpZihuJiZuKHksdixzLHUpLHIpe2w9d2UodixkKSxyKGwsW10scyx1KSxjPWwubGVuZ3RoO3doaWxlKGMtLSkoZj1sW2NdKSYmKHZbZFtjXV09ISh5W2RbY11dPWYpKX1pZihvKXtpZihpfHxlKXtpZihpKXtsPVtdLGM9di5sZW5ndGg7d2hpbGUoYy0tKShmPXZbY10pJiZsLnB1c2goeVtjXT1mKTtpKG51bGwsdj1bXSxsLHUpfWM9di5sZW5ndGg7d2hpbGUoYy0tKShmPXZbY10pJiYobD1pP08obyxmKTpwW2NdKT4tMSYmKG9bbF09IShhW2xdPWYpKX19ZWxzZSB2PXdlKHY9PT1hP3Yuc3BsaWNlKGgsdi5sZW5ndGgpOnYpLGk/aShudWxsLGEsdix1KTpMLmFwcGx5KGEsdil9KX1mdW5jdGlvbiBDZShlKXtmb3IodmFyIHQsbixpLG89ZS5sZW5ndGgsYT1yLnJlbGF0aXZlW2VbMF0udHlwZV0scz1hfHxyLnJlbGF0aXZlW1wiIFwiXSx1PWE/MTowLGM9bWUoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSxzLCEwKSxmPW1lKGZ1bmN0aW9uKGUpe3JldHVybiBPKHQsZSk+LTF9LHMsITApLHA9W2Z1bmN0aW9uKGUsbixyKXt2YXIgaT0hYSYmKHJ8fG4hPT1sKXx8KCh0PW4pLm5vZGVUeXBlP2MoZSxuLHIpOmYoZSxuLHIpKTtyZXR1cm4gdD1udWxsLGl9XTt1PG87dSsrKWlmKG49ci5yZWxhdGl2ZVtlW3VdLnR5cGVdKXA9W21lKHhlKHApLG4pXTtlbHNle2lmKChuPXIuZmlsdGVyW2VbdV0udHlwZV0uYXBwbHkobnVsbCxlW3VdLm1hdGNoZXMpKVtiXSl7Zm9yKGk9Kyt1O2k8bztpKyspaWYoci5yZWxhdGl2ZVtlW2ldLnR5cGVdKWJyZWFrO3JldHVybiBUZSh1PjEmJnhlKHApLHU+MSYmdmUoZS5zbGljZSgwLHUtMSkuY29uY2F0KHt2YWx1ZTpcIiBcIj09PWVbdS0yXS50eXBlP1wiKlwiOlwiXCJ9KSkucmVwbGFjZShCLFwiJDFcIiksbix1PGkmJkNlKGUuc2xpY2UodSxpKSksaTxvJiZDZShlPWUuc2xpY2UoaSkpLGk8byYmdmUoZSkpfXAucHVzaChuKX1yZXR1cm4geGUocCl9ZnVuY3Rpb24gRWUoZSx0KXt2YXIgbj10Lmxlbmd0aD4wLGk9ZS5sZW5ndGg+MCxvPWZ1bmN0aW9uKG8sYSxzLHUsYyl7dmFyIGYsaCx5LHY9MCxtPVwiMFwiLHg9byYmW10sYj1bXSx3PWwsQz1vfHxpJiZyLmZpbmQuVEFHKFwiKlwiLGMpLEU9VCs9bnVsbD09dz8xOk1hdGgucmFuZG9tKCl8fC4xLGs9Qy5sZW5ndGg7Zm9yKGMmJihsPWE9PT1kfHxhfHxjKTttIT09ayYmbnVsbCE9KGY9Q1ttXSk7bSsrKXtpZihpJiZmKXtoPTAsYXx8Zi5vd25lckRvY3VtZW50PT09ZHx8KHAoZikscz0hZyk7d2hpbGUoeT1lW2grK10paWYoeShmLGF8fGQscykpe3UucHVzaChmKTticmVha31jJiYoVD1FKX1uJiYoKGY9IXkmJmYpJiZ2LS0sbyYmeC5wdXNoKGYpKX1pZih2Kz1tLG4mJm0hPT12KXtoPTA7d2hpbGUoeT10W2grK10peSh4LGIsYSxzKTtpZihvKXtpZih2PjApd2hpbGUobS0tKXhbbV18fGJbbV18fChiW21dPWouY2FsbCh1KSk7Yj13ZShiKX1MLmFwcGx5KHUsYiksYyYmIW8mJmIubGVuZ3RoPjAmJnYrdC5sZW5ndGg+MSYmb2UudW5pcXVlU29ydCh1KX1yZXR1cm4gYyYmKFQ9RSxsPXcpLHh9O3JldHVybiBuP3NlKG8pOm99cmV0dXJuIHM9b2UuY29tcGlsZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1bXSxvPVNbZStcIiBcIl07aWYoIW8pe3R8fCh0PWEoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKShvPUNlKHRbbl0pKVtiXT9yLnB1c2gobyk6aS5wdXNoKG8pOyhvPVMoZSxFZShpLHIpKSkuc2VsZWN0b3I9ZX1yZXR1cm4gb30sdT1vZS5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4saSl7dmFyIG8sdSxsLGMsZixwPVwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJmUsZD0haSYmYShlPXAuc2VsZWN0b3J8fGUpO2lmKG49bnx8W10sMT09PWQubGVuZ3RoKXtpZigodT1kWzBdPWRbMF0uc2xpY2UoMCkpLmxlbmd0aD4yJiZcIklEXCI9PT0obD11WzBdKS50eXBlJiY5PT09dC5ub2RlVHlwZSYmZyYmci5yZWxhdGl2ZVt1WzFdLnR5cGVdKXtpZighKHQ9KHIuZmluZC5JRChsLm1hdGNoZXNbMF0ucmVwbGFjZShaLGVlKSx0KXx8W10pWzBdKSlyZXR1cm4gbjtwJiYodD10LnBhcmVudE5vZGUpLGU9ZS5zbGljZSh1LnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1vPVYubmVlZHNDb250ZXh0LnRlc3QoZSk/MDp1Lmxlbmd0aDt3aGlsZShvLS0pe2lmKGw9dVtvXSxyLnJlbGF0aXZlW2M9bC50eXBlXSlicmVhaztpZigoZj1yLmZpbmRbY10pJiYoaT1mKGwubWF0Y2hlc1swXS5yZXBsYWNlKFosZWUpLEsudGVzdCh1WzBdLnR5cGUpJiZnZSh0LnBhcmVudE5vZGUpfHx0KSkpe2lmKHUuc3BsaWNlKG8sMSksIShlPWkubGVuZ3RoJiZ2ZSh1KSkpcmV0dXJuIEwuYXBwbHkobixpKSxuO2JyZWFrfX19cmV0dXJuKHB8fHMoZSxkKSkoaSx0LCFnLG4sIXR8fEsudGVzdChlKSYmZ2UodC5wYXJlbnROb2RlKXx8dCksbn0sbi5zb3J0U3RhYmxlPWIuc3BsaXQoXCJcIikuc29ydChEKS5qb2luKFwiXCIpPT09YixuLmRldGVjdER1cGxpY2F0ZXM9ISFmLHAoKSxuLnNvcnREZXRhY2hlZD11ZShmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGQuY3JlYXRlRWxlbWVudChcImZpZWxkc2V0XCIpKX0pLHVlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD1cIjxhIGhyZWY9JyMnPjwvYT5cIixcIiNcIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpfSl8fGxlKFwidHlwZXxocmVmfGhlaWdodHx3aWR0aFwiLGZ1bmN0aW9uKGUsdCxuKXtpZighbilyZXR1cm4gZS5nZXRBdHRyaWJ1dGUodCxcInR5cGVcIj09PXQudG9Mb3dlckNhc2UoKT8xOjIpfSksbi5hdHRyaWJ1dGVzJiZ1ZShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9XCI8aW5wdXQvPlwiLGUuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLFwiXCIpLFwiXCI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwidmFsdWVcIil9KXx8bGUoXCJ2YWx1ZVwiLGZ1bmN0aW9uKGUsdCxuKXtpZighbiYmXCJpbnB1dFwiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiBlLmRlZmF1bHRWYWx1ZX0pLHVlKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lLmdldEF0dHJpYnV0ZShcImRpc2FibGVkXCIpfSl8fGxlKFAsZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKCFuKXJldHVybiEwPT09ZVt0XT90LnRvTG93ZXJDYXNlKCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSksb2V9KGUpO3cuZmluZD1FLHcuZXhwcj1FLnNlbGVjdG9ycyx3LmV4cHJbXCI6XCJdPXcuZXhwci5wc2V1ZG9zLHcudW5pcXVlU29ydD13LnVuaXF1ZT1FLnVuaXF1ZVNvcnQsdy50ZXh0PUUuZ2V0VGV4dCx3LmlzWE1MRG9jPUUuaXNYTUwsdy5jb250YWlucz1FLmNvbnRhaW5zLHcuZXNjYXBlU2VsZWN0b3I9RS5lc2NhcGU7dmFyIGs9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLGk9dm9pZCAwIT09bjt3aGlsZSgoZT1lW3RdKSYmOSE9PWUubm9kZVR5cGUpaWYoMT09PWUubm9kZVR5cGUpe2lmKGkmJncoZSkuaXMobikpYnJlYWs7ci5wdXNoKGUpfXJldHVybiByfSxTPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdO2U7ZT1lLm5leHRTaWJsaW5nKTE9PT1lLm5vZGVUeXBlJiZlIT09dCYmbi5wdXNoKGUpO3JldHVybiBufSxEPXcuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7ZnVuY3Rpb24gTihlLHQpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9dmFyIEE9L148KFthLXpdW15cXC9cXDA+OlxceDIwXFx0XFxyXFxuXFxmXSopW1xceDIwXFx0XFxyXFxuXFxmXSpcXC8/Pig/OjxcXC9cXDE+fCkkL2k7ZnVuY3Rpb24gaihlLHQsbil7cmV0dXJuIGcodCk/dy5ncmVwKGUsZnVuY3Rpb24oZSxyKXtyZXR1cm4hIXQuY2FsbChlLHIsZSkhPT1ufSk6dC5ub2RlVHlwZT93LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PXQhPT1ufSk6XCJzdHJpbmdcIiE9dHlwZW9mIHQ/dy5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHUuY2FsbCh0LGUpPi0xIT09bn0pOncuZmlsdGVyKHQsZSxuKX13LmZpbHRlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dFswXTtyZXR1cm4gbiYmKGU9XCI6bm90KFwiK2UrXCIpXCIpLDE9PT10Lmxlbmd0aCYmMT09PXIubm9kZVR5cGU/dy5maW5kLm1hdGNoZXNTZWxlY3RvcihyLGUpP1tyXTpbXTp3LmZpbmQubWF0Y2hlcyhlLHcuZ3JlcCh0LGZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZX0pKX0sdy5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPXRoaXMubGVuZ3RoLGk9dGhpcztpZihcInN0cmluZ1wiIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyhlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0KyspaWYody5jb250YWlucyhpW3RdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihuPXRoaXMucHVzaFN0YWNrKFtdKSx0PTA7dDxyO3QrKyl3LmZpbmQoZSxpW3RdLG4pO3JldHVybiByPjE/dy51bmlxdWVTb3J0KG4pOm59LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soaih0aGlzLGV8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soaih0aGlzLGV8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhaih0aGlzLFwic3RyaW5nXCI9PXR5cGVvZiBlJiZELnRlc3QoZSk/dyhlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBxLEw9L14oPzpcXHMqKDxbXFx3XFxXXSs+KVtePl0qfCMoW1xcdy1dKykpJC87KHcuZm4uaW5pdD1mdW5jdGlvbihlLHQsbil7dmFyIGksbztpZighZSlyZXR1cm4gdGhpcztpZihuPW58fHEsXCJzdHJpbmdcIj09dHlwZW9mIGUpe2lmKCEoaT1cIjxcIj09PWVbMF0mJlwiPlwiPT09ZVtlLmxlbmd0aC0xXSYmZS5sZW5ndGg+PTM/W251bGwsZSxudWxsXTpMLmV4ZWMoZSkpfHwhaVsxXSYmdClyZXR1cm4hdHx8dC5qcXVlcnk/KHR8fG4pLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3Rvcih0KS5maW5kKGUpO2lmKGlbMV0pe2lmKHQ9dCBpbnN0YW5jZW9mIHc/dFswXTp0LHcubWVyZ2UodGhpcyx3LnBhcnNlSFRNTChpWzFdLHQmJnQubm9kZVR5cGU/dC5vd25lckRvY3VtZW50fHx0OnIsITApKSxBLnRlc3QoaVsxXSkmJncuaXNQbGFpbk9iamVjdCh0KSlmb3IoaSBpbiB0KWcodGhpc1tpXSk/dGhpc1tpXSh0W2ldKTp0aGlzLmF0dHIoaSx0W2ldKTtyZXR1cm4gdGhpc31yZXR1cm4obz1yLmdldEVsZW1lbnRCeUlkKGlbMl0pKSYmKHRoaXNbMF09byx0aGlzLmxlbmd0aD0xKSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzWzBdPWUsdGhpcy5sZW5ndGg9MSx0aGlzKTpnKGUpP3ZvaWQgMCE9PW4ucmVhZHk/bi5yZWFkeShlKTplKHcpOncubWFrZUFycmF5KGUsdGhpcyl9KS5wcm90b3R5cGU9dy5mbixxPXcocik7dmFyIEg9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sTz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTt3LmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGUpe3ZhciB0PXcoZSx0aGlzKSxuPXQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bjtlKyspaWYody5jb250YWlucyh0aGlzLHRbZV0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10aGlzLmxlbmd0aCxvPVtdLGE9XCJzdHJpbmdcIiE9dHlwZW9mIGUmJncoZSk7aWYoIUQudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZ3LmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKG8ubGVuZ3RoPjE/dy51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT9cInN0cmluZ1wiPT10eXBlb2YgZT91LmNhbGwodyhlKSx0aGlzWzBdKTp1LmNhbGwodGhpcyxlLmpxdWVyeT9lWzBdOmUpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcudW5pcXVlU29ydCh3Lm1lcmdlKHRoaXMuZ2V0KCksdyhlLHQpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmFkZChudWxsPT1lP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGUpKX19KTtmdW5jdGlvbiBQKGUsdCl7d2hpbGUoKGU9ZVt0XSkmJjEhPT1lLm5vZGVUeXBlKTtyZXR1cm4gZX13LmVhY2goe3BhcmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJjExIT09dC5ub2RlVHlwZT90Om51bGx9LHBhcmVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGsoZSxcInBhcmVudE5vZGVcIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGsoZSxcInBhcmVudE5vZGVcIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gUChlLFwibmV4dFNpYmxpbmdcIil9LHByZXY6ZnVuY3Rpb24oZSl7cmV0dXJuIFAoZSxcInByZXZpb3VzU2libGluZ1wiKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4gayhlLFwibmV4dFNpYmxpbmdcIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGsoZSxcInByZXZpb3VzU2libGluZ1wiKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gayhlLFwibmV4dFNpYmxpbmdcIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gayhlLFwicHJldmlvdXNTaWJsaW5nXCIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBTKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gUyhlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gTihlLFwiaWZyYW1lXCIpP2UuY29udGVudERvY3VtZW50OihOKGUsXCJ0ZW1wbGF0ZVwiKSYmKGU9ZS5jb250ZW50fHxlKSx3Lm1lcmdlKFtdLGUuY2hpbGROb2RlcykpfX0sZnVuY3Rpb24oZSx0KXt3LmZuW2VdPWZ1bmN0aW9uKG4scil7dmFyIGk9dy5tYXAodGhpcyx0LG4pO3JldHVyblwiVW50aWxcIiE9PWUuc2xpY2UoLTUpJiYocj1uKSxyJiZcInN0cmluZ1wiPT10eXBlb2YgciYmKGk9dy5maWx0ZXIocixpKSksdGhpcy5sZW5ndGg+MSYmKE9bZV18fHcudW5pcXVlU29ydChpKSxILnRlc3QoZSkmJmkucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhpKX19KTt2YXIgTT0vW15cXHgyMFxcdFxcclxcblxcZl0rL2c7ZnVuY3Rpb24gUihlKXt2YXIgdD17fTtyZXR1cm4gdy5lYWNoKGUubWF0Y2goTSl8fFtdLGZ1bmN0aW9uKGUsbil7dFtuXT0hMH0pLHR9dy5DYWxsYmFja3M9ZnVuY3Rpb24oZSl7ZT1cInN0cmluZ1wiPT10eXBlb2YgZT9SKGUpOncuZXh0ZW5kKHt9LGUpO3ZhciB0LG4scixpLG89W10sYT1bXSxzPS0xLHU9ZnVuY3Rpb24oKXtmb3IoaT1pfHxlLm9uY2Uscj10PSEwO2EubGVuZ3RoO3M9LTEpe249YS5zaGlmdCgpO3doaWxlKCsrczxvLmxlbmd0aCkhMT09PW9bc10uYXBwbHkoblswXSxuWzFdKSYmZS5zdG9wT25GYWxzZSYmKHM9by5sZW5ndGgsbj0hMSl9ZS5tZW1vcnl8fChuPSExKSx0PSExLGkmJihvPW4/W106XCJcIil9LGw9e2FkZDpmdW5jdGlvbigpe3JldHVybiBvJiYobiYmIXQmJihzPW8ubGVuZ3RoLTEsYS5wdXNoKG4pKSxmdW5jdGlvbiB0KG4pe3cuZWFjaChuLGZ1bmN0aW9uKG4scil7ZyhyKT9lLnVuaXF1ZSYmbC5oYXMocil8fG8ucHVzaChyKTpyJiZyLmxlbmd0aCYmXCJzdHJpbmdcIiE9PXgocikmJnQocil9KX0oYXJndW1lbnRzKSxuJiYhdCYmdSgpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdy5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKChuPXcuaW5BcnJheSh0LG8sbikpPi0xKW8uc3BsaWNlKG4sMSksbjw9cyYmcy0tfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBlP3cuaW5BcnJheShlLG8pPi0xOm8ubGVuZ3RoPjB9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIG8mJihvPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGk9YT1bXSxvPW49XCJcIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFvfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9YT1bXSxufHx0fHwobz1uPVwiXCIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhaX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gaXx8KG49W2UsKG49bnx8W10pLnNsaWNlP24uc2xpY2UoKTpuXSxhLnB1c2gobiksdHx8dSgpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGwuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFyfX07cmV0dXJuIGx9O2Z1bmN0aW9uIEkoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gVyhlKXt0aHJvdyBlfWZ1bmN0aW9uICQoZSx0LG4scil7dmFyIGk7dHJ5e2UmJmcoaT1lLnByb21pc2UpP2kuY2FsbChlKS5kb25lKHQpLmZhaWwobik6ZSYmZyhpPWUudGhlbik/aS5jYWxsKGUsdCxuKTp0LmFwcGx5KHZvaWQgMCxbZV0uc2xpY2UocikpfWNhdGNoKGUpe24uYXBwbHkodm9pZCAwLFtlXSl9fXcuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbih0KXt2YXIgbj1bW1wibm90aWZ5XCIsXCJwcm9ncmVzc1wiLHcuQ2FsbGJhY2tzKFwibWVtb3J5XCIpLHcuQ2FsbGJhY2tzKFwibWVtb3J5XCIpLDJdLFtcInJlc29sdmVcIixcImRvbmVcIix3LkNhbGxiYWNrcyhcIm9uY2UgbWVtb3J5XCIpLHcuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksMCxcInJlc29sdmVkXCJdLFtcInJlamVjdFwiLFwiZmFpbFwiLHcuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksdy5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSwxLFwicmVqZWN0ZWRcIl1dLHI9XCJwZW5kaW5nXCIsaT17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIG8uZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSxcImNhdGNoXCI6ZnVuY3Rpb24oZSl7cmV0dXJuIGkudGhlbihudWxsLGUpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB3LkRlZmVycmVkKGZ1bmN0aW9uKHQpe3cuZWFjaChuLGZ1bmN0aW9uKG4scil7dmFyIGk9ZyhlW3JbNF1dKSYmZVtyWzRdXTtvW3JbMV1dKGZ1bmN0aW9uKCl7dmFyIGU9aSYmaS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmZyhlLnByb21pc2UpP2UucHJvbWlzZSgpLnByb2dyZXNzKHQubm90aWZ5KS5kb25lKHQucmVzb2x2ZSkuZmFpbCh0LnJlamVjdCk6dFtyWzBdK1wiV2l0aFwiXSh0aGlzLGk/W2VdOmFyZ3VtZW50cyl9KX0pLGU9bnVsbH0pLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbih0LHIsaSl7dmFyIG89MDtmdW5jdGlvbiBhKHQsbixyLGkpe3JldHVybiBmdW5jdGlvbigpe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMsbD1mdW5jdGlvbigpe3ZhciBlLGw7aWYoISh0PG8pKXtpZigoZT1yLmFwcGx5KHMsdSkpPT09bi5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvblwiKTtsPWUmJihcIm9iamVjdFwiPT10eXBlb2YgZXx8XCJmdW5jdGlvblwiPT10eXBlb2YgZSkmJmUudGhlbixnKGwpP2k/bC5jYWxsKGUsYShvLG4sSSxpKSxhKG8sbixXLGkpKToobysrLGwuY2FsbChlLGEobyxuLEksaSksYShvLG4sVyxpKSxhKG8sbixJLG4ubm90aWZ5V2l0aCkpKToociE9PUkmJihzPXZvaWQgMCx1PVtlXSksKGl8fG4ucmVzb2x2ZVdpdGgpKHMsdSkpfX0sYz1pP2w6ZnVuY3Rpb24oKXt0cnl7bCgpfWNhdGNoKGUpe3cuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYmdy5EZWZlcnJlZC5leGNlcHRpb25Ib29rKGUsYy5zdGFja1RyYWNlKSx0KzE+PW8mJihyIT09VyYmKHM9dm9pZCAwLHU9W2VdKSxuLnJlamVjdFdpdGgocyx1KSl9fTt0P2MoKToody5EZWZlcnJlZC5nZXRTdGFja0hvb2smJihjLnN0YWNrVHJhY2U9dy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksZS5zZXRUaW1lb3V0KGMpKX19cmV0dXJuIHcuRGVmZXJyZWQoZnVuY3Rpb24oZSl7blswXVszXS5hZGQoYSgwLGUsZyhpKT9pOkksZS5ub3RpZnlXaXRoKSksblsxXVszXS5hZGQoYSgwLGUsZyh0KT90OkkpKSxuWzJdWzNdLmFkZChhKDAsZSxnKHIpP3I6VykpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lP3cuZXh0ZW5kKGUsaSk6aX19LG89e307cmV0dXJuIHcuZWFjaChuLGZ1bmN0aW9uKGUsdCl7dmFyIGE9dFsyXSxzPXRbNV07aVt0WzFdXT1hLmFkZCxzJiZhLmFkZChmdW5jdGlvbigpe3I9c30sblszLWVdWzJdLmRpc2FibGUsblszLWVdWzNdLmRpc2FibGUsblswXVsyXS5sb2NrLG5bMF1bM10ubG9jayksYS5hZGQodFszXS5maXJlKSxvW3RbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIG9bdFswXStcIldpdGhcIl0odGhpcz09PW8/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxvW3RbMF0rXCJXaXRoXCJdPWEuZmlyZVdpdGh9KSxpLnByb21pc2UobyksdCYmdC5jYWxsKG8sbyksb30sd2hlbjpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49dCxyPUFycmF5KG4pLGk9by5jYWxsKGFyZ3VtZW50cyksYT13LkRlZmVycmVkKCkscz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cltlXT10aGlzLGlbZV09YXJndW1lbnRzLmxlbmd0aD4xP28uY2FsbChhcmd1bWVudHMpOm4sLS10fHxhLnJlc29sdmVXaXRoKHIsaSl9fTtpZih0PD0xJiYoJChlLGEuZG9uZShzKG4pKS5yZXNvbHZlLGEucmVqZWN0LCF0KSxcInBlbmRpbmdcIj09PWEuc3RhdGUoKXx8ZyhpW25dJiZpW25dLnRoZW4pKSlyZXR1cm4gYS50aGVuKCk7d2hpbGUobi0tKSQoaVtuXSxzKG4pLGEucmVqZWN0KTtyZXR1cm4gYS5wcm9taXNlKCl9fSk7dmFyIEI9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87dy5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKHQsbil7ZS5jb25zb2xlJiZlLmNvbnNvbGUud2FybiYmdCYmQi50ZXN0KHQubmFtZSkmJmUuY29uc29sZS53YXJuKFwialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogXCIrdC5tZXNzYWdlLHQuc3RhY2ssbil9LHcucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24odCl7ZS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgdH0pfTt2YXIgRj13LkRlZmVycmVkKCk7dy5mbi5yZWFkeT1mdW5jdGlvbihlKXtyZXR1cm4gRi50aGVuKGUpW1wiY2F0Y2hcIl0oZnVuY3Rpb24oZSl7dy5yZWFkeUV4Y2VwdGlvbihlKX0pLHRoaXN9LHcuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKGUpeyghMD09PWU/LS13LnJlYWR5V2FpdDp3LmlzUmVhZHkpfHwody5pc1JlYWR5PSEwLCEwIT09ZSYmLS13LnJlYWR5V2FpdD4wfHxGLnJlc29sdmVXaXRoKHIsW3ddKSl9fSksdy5yZWFkeS50aGVuPUYudGhlbjtmdW5jdGlvbiBfKCl7ci5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLF8pLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImxvYWRcIixfKSx3LnJlYWR5KCl9XCJjb21wbGV0ZVwiPT09ci5yZWFkeVN0YXRlfHxcImxvYWRpbmdcIiE9PXIucmVhZHlTdGF0ZSYmIXIuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2Uuc2V0VGltZW91dCh3LnJlYWR5KTooci5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLF8pLGUuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIixfKSk7dmFyIHo9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSl7dmFyIHM9MCx1PWUubGVuZ3RoLGw9bnVsbD09bjtpZihcIm9iamVjdFwiPT09eChuKSl7aT0hMDtmb3IocyBpbiBuKXooZSx0LHMsbltzXSwhMCxvLGEpfWVsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsZyhyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbCh3KGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LFg9L14tbXMtLyxVPS8tKFthLXpdKS9nO2Z1bmN0aW9uIFYoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIEcoZSl7cmV0dXJuIGUucmVwbGFjZShYLFwibXMtXCIpLnJlcGxhY2UoVSxWKX12YXIgWT1mdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV8fDk9PT1lLm5vZGVUeXBlfHwhK2Uubm9kZVR5cGV9O2Z1bmN0aW9uIFEoKXt0aGlzLmV4cGFuZG89dy5leHBhbmRvK1EudWlkKyt9US51aWQ9MSxRLnByb3RvdHlwZT17Y2FjaGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVt0aGlzLmV4cGFuZG9dO3JldHVybiB0fHwodD17fSxZKGUpJiYoZS5ub2RlVHlwZT9lW3RoaXMuZXhwYW5kb109dDpPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0aGlzLmV4cGFuZG8se3ZhbHVlOnQsY29uZmlndXJhYmxlOiEwfSkpKSx0fSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9dGhpcy5jYWNoZShlKTtpZihcInN0cmluZ1wiPT10eXBlb2YgdClpW0codCldPW47ZWxzZSBmb3IociBpbiB0KWlbRyhyKV09dFtyXTtyZXR1cm4gaX0sZ2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5jYWNoZShlKTplW3RoaXMuZXhwYW5kb10mJmVbdGhpcy5leHBhbmRvXVtHKHQpXX0sYWNjZXNzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dHx8dCYmXCJzdHJpbmdcIj09dHlwZW9mIHQmJnZvaWQgMD09PW4/dGhpcy5nZXQoZSx0KToodGhpcy5zZXQoZSx0LG4pLHZvaWQgMCE9PW4/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09dCl7bj0odD1BcnJheS5pc0FycmF5KHQpP3QubWFwKEcpOih0PUcodCkpaW4gcj9bdF06dC5tYXRjaChNKXx8W10pLmxlbmd0aDt3aGlsZShuLS0pZGVsZXRlIHJbdFtuXV19KHZvaWQgMD09PXR8fHcuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIXcuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBKPW5ldyBRLEs9bmV3IFEsWj0vXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sZWU9L1tBLVpdL2c7ZnVuY3Rpb24gdGUoZSl7cmV0dXJuXCJ0cnVlXCI9PT1lfHxcImZhbHNlXCIhPT1lJiYoXCJudWxsXCI9PT1lP251bGw6ZT09PStlK1wiXCI/K2U6Wi50ZXN0KGUpP0pTT04ucGFyc2UoZSk6ZSl9ZnVuY3Rpb24gbmUoZSx0LG4pe3ZhciByO2lmKHZvaWQgMD09PW4mJjE9PT1lLm5vZGVUeXBlKWlmKHI9XCJkYXRhLVwiK3QucmVwbGFjZShlZSxcIi0kJlwiKS50b0xvd2VyQ2FzZSgpLFwic3RyaW5nXCI9PXR5cGVvZihuPWUuZ2V0QXR0cmlidXRlKHIpKSl7dHJ5e249dGUobil9Y2F0Y2goZSl7fUsuc2V0KGUsdCxuKX1lbHNlIG49dm9pZCAwO3JldHVybiBufXcuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiBLLmhhc0RhdGEoZSl8fEouaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEsuYWNjZXNzKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe0sucmVtb3ZlKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gSi5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe0oucmVtb3ZlKGUsdCl9fSksdy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbz10aGlzWzBdLGE9byYmby5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PWUpe2lmKHRoaXMubGVuZ3RoJiYoaT1LLmdldChvKSwxPT09by5ub2RlVHlwZSYmIUouZ2V0KG8sXCJoYXNEYXRhQXR0cnNcIikpKXtuPWEubGVuZ3RoO3doaWxlKG4tLSlhW25dJiYwPT09KHI9YVtuXS5uYW1lKS5pbmRleE9mKFwiZGF0YS1cIikmJihyPUcoci5zbGljZSg1KSksbmUobyxyLGlbcl0pKTtKLnNldChvLFwiaGFzRGF0YUF0dHJzXCIsITApfXJldHVybiBpfXJldHVyblwib2JqZWN0XCI9PXR5cGVvZiBlP3RoaXMuZWFjaChmdW5jdGlvbigpe0suc2V0KHRoaXMsZSl9KTp6KHRoaXMsZnVuY3Rpb24odCl7dmFyIG47aWYobyYmdm9pZCAwPT09dCl7aWYodm9pZCAwIT09KG49Sy5nZXQobyxlKSkpcmV0dXJuIG47aWYodm9pZCAwIT09KG49bmUobyxlKSkpcmV0dXJuIG59ZWxzZSB0aGlzLmVhY2goZnVuY3Rpb24oKXtLLnNldCh0aGlzLGUsdCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Sy5yZW1vdmUodGhpcyxlKX0pfX0pLHcuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoZSlyZXR1cm4gdD0odHx8XCJmeFwiKStcInF1ZXVlXCIscj1KLmdldChlLHQpLG4mJighcnx8QXJyYXkuaXNBcnJheShuKT9yPUouYWNjZXNzKGUsdCx3Lm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8XCJmeFwiO3ZhciBuPXcucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89dy5fcXVldWVIb29rcyhlLHQpLGE9ZnVuY3Rpb24oKXt3LmRlcXVldWUoZSx0KX07XCJpbnByb2dyZXNzXCI9PT1pJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYoXCJmeFwiPT09dCYmbi51bnNoaWZ0KFwiaW5wcm9ncmVzc1wiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGEsbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10K1wicXVldWVIb29rc1wiO3JldHVybiBKLmdldChlLG4pfHxKLmFjY2VzcyhlLG4se2VtcHR5OncuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIikuYWRkKGZ1bmN0aW9uKCl7Si5yZW1vdmUoZSxbdCtcInF1ZXVlXCIsbl0pfSl9KX19KSx3LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj0yO3JldHVyblwic3RyaW5nXCIhPXR5cGVvZiBlJiYodD1lLGU9XCJmeFwiLG4tLSksYXJndW1lbnRzLmxlbmd0aDxuP3cucXVldWUodGhpc1swXSxlKTp2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49dy5xdWV1ZSh0aGlzLGUsdCk7dy5fcXVldWVIb29rcyh0aGlzLGUpLFwiZnhcIj09PWUmJlwiaW5wcm9ncmVzc1wiIT09blswXSYmdy5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dy5kZXF1ZXVlKHRoaXMsZSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5xdWV1ZShlfHxcImZ4XCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0xLGk9dy5EZWZlcnJlZCgpLG89dGhpcyxhPXRoaXMubGVuZ3RoLHM9ZnVuY3Rpb24oKXstLXJ8fGkucmVzb2x2ZVdpdGgobyxbb10pfTtcInN0cmluZ1wiIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHxcImZ4XCI7d2hpbGUoYS0tKShuPUouZ2V0KG9bYV0sZStcInF1ZXVlSG9va3NcIikpJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLGkucHJvbWlzZSh0KX19KTt2YXIgcmU9L1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8uc291cmNlLGllPW5ldyBSZWdFeHAoXCJeKD86KFsrLV0pPXwpKFwiK3JlK1wiKShbYS16JV0qKSRcIixcImlcIiksb2U9W1wiVG9wXCIsXCJSaWdodFwiLFwiQm90dG9tXCIsXCJMZWZ0XCJdLGFlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuXCJub25lXCI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHxcIlwiPT09ZS5zdHlsZS5kaXNwbGF5JiZ3LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKSYmXCJub25lXCI9PT13LmNzcyhlLFwiZGlzcGxheVwiKX0sc2U9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhPXt9O2ZvcihvIGluIHQpYVtvXT1lLnN0eWxlW29dLGUuc3R5bGVbb109dFtvXTtpPW4uYXBwbHkoZSxyfHxbXSk7Zm9yKG8gaW4gdCllLnN0eWxlW29dPWFbb107cmV0dXJuIGl9O2Z1bmN0aW9uIHVlKGUsdCxuLHIpe3ZhciBpLG8sYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gdy5jc3MoZSx0LFwiXCIpfSx1PXMoKSxsPW4mJm5bM118fCh3LmNzc051bWJlclt0XT9cIlwiOlwicHhcIiksYz0ody5jc3NOdW1iZXJbdF18fFwicHhcIiE9PWwmJit1KSYmaWUuZXhlYyh3LmNzcyhlLHQpKTtpZihjJiZjWzNdIT09bCl7dS89MixsPWx8fGNbM10sYz0rdXx8MTt3aGlsZShhLS0pdy5zdHlsZShlLHQsYytsKSwoMS1vKSooMS0obz1zKCkvdXx8LjUpKTw9MCYmKGE9MCksYy89bztjKj0yLHcuc3R5bGUoZSx0LGMrbCksbj1ufHxbXX1yZXR1cm4gbiYmKGM9K2N8fCt1fHwwLGk9blsxXT9jKyhuWzFdKzEpKm5bMl06K25bMl0sciYmKHIudW5pdD1sLHIuc3RhcnQ9YyxyLmVuZD1pKSksaX12YXIgbGU9e307ZnVuY3Rpb24gY2UoZSl7dmFyIHQsbj1lLm93bmVyRG9jdW1lbnQscj1lLm5vZGVOYW1lLGk9bGVbcl07cmV0dXJuIGl8fCh0PW4uYm9keS5hcHBlbmRDaGlsZChuLmNyZWF0ZUVsZW1lbnQocikpLGk9dy5jc3ModCxcImRpc3BsYXlcIiksdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLFwibm9uZVwiPT09aSYmKGk9XCJibG9ja1wiKSxsZVtyXT1pLGkpfWZ1bmN0aW9uIGZlKGUsdCl7Zm9yKHZhciBuLHIsaT1bXSxvPTAsYT1lLmxlbmd0aDtvPGE7bysrKShyPWVbb10pLnN0eWxlJiYobj1yLnN0eWxlLmRpc3BsYXksdD8oXCJub25lXCI9PT1uJiYoaVtvXT1KLmdldChyLFwiZGlzcGxheVwiKXx8bnVsbCxpW29dfHwoci5zdHlsZS5kaXNwbGF5PVwiXCIpKSxcIlwiPT09ci5zdHlsZS5kaXNwbGF5JiZhZShyKSYmKGlbb109Y2UocikpKTpcIm5vbmVcIiE9PW4mJihpW29dPVwibm9uZVwiLEouc2V0KHIsXCJkaXNwbGF5XCIsbikpKTtmb3Iobz0wO288YTtvKyspbnVsbCE9aVtvXSYmKGVbb10uc3R5bGUuZGlzcGxheT1pW29dKTtyZXR1cm4gZX13LmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBmZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBmZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVyblwiYm9vbGVhblwiPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2FlKHRoaXMpP3codGhpcykuc2hvdygpOncodGhpcykuaGlkZSgpfSl9fSk7dmFyIHBlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLGRlPS88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKykvaSxoZT0vXiR8Xm1vZHVsZSR8XFwvKD86amF2YXxlY21hKXNjcmlwdC9pLGdlPXtvcHRpb246WzEsXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsXCI8L3NlbGVjdD5cIl0sdGhlYWQ6WzEsXCI8dGFibGU+XCIsXCI8L3RhYmxlPlwiXSxjb2w6WzIsXCI8dGFibGU+PGNvbGdyb3VwPlwiLFwiPC9jb2xncm91cD48L3RhYmxlPlwiXSx0cjpbMixcIjx0YWJsZT48dGJvZHk+XCIsXCI8L3Rib2R5PjwvdGFibGU+XCJdLHRkOlszLFwiPHRhYmxlPjx0Ym9keT48dHI+XCIsXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIl0sX2RlZmF1bHQ6WzAsXCJcIixcIlwiXX07Z2Uub3B0Z3JvdXA9Z2Uub3B0aW9uLGdlLnRib2R5PWdlLnRmb290PWdlLmNvbGdyb3VwPWdlLmNhcHRpb249Z2UudGhlYWQsZ2UudGg9Z2UudGQ7ZnVuY3Rpb24geWUoZSx0KXt2YXIgbjtyZXR1cm4gbj1cInVuZGVmaW5lZFwiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fFwiKlwiKTpcInVuZGVmaW5lZFwiIT10eXBlb2YgZS5xdWVyeVNlbGVjdG9yQWxsP2UucXVlcnlTZWxlY3RvckFsbCh0fHxcIipcIik6W10sdm9pZCAwPT09dHx8dCYmTihlLHQpP3cubWVyZ2UoW2VdLG4pOm59ZnVuY3Rpb24gdmUoZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspSi5zZXQoZVtuXSxcImdsb2JhbEV2YWxcIiwhdHx8Si5nZXQodFtuXSxcImdsb2JhbEV2YWxcIikpfXZhciBtZT0vPHwmIz9cXHcrOy87ZnVuY3Rpb24geGUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZihcIm9iamVjdFwiPT09eChvKSl3Lm1lcmdlKHAsby5ub2RlVHlwZT9bb106byk7ZWxzZSBpZihtZS50ZXN0KG8pKXthPWF8fGYuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKSxzPShkZS5leGVjKG8pfHxbXCJcIixcIlwiXSlbMV0udG9Mb3dlckNhc2UoKSx1PWdlW3NdfHxnZS5fZGVmYXVsdCxhLmlubmVySFRNTD11WzFdK3cuaHRtbFByZWZpbHRlcihvKSt1WzJdLGM9dVswXTt3aGlsZShjLS0pYT1hLmxhc3RDaGlsZDt3Lm1lcmdlKHAsYS5jaGlsZE5vZGVzKSwoYT1mLmZpcnN0Q2hpbGQpLnRleHRDb250ZW50PVwiXCJ9ZWxzZSBwLnB1c2godC5jcmVhdGVUZXh0Tm9kZShvKSk7Zi50ZXh0Q29udGVudD1cIlwiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiZ3LmluQXJyYXkobyxyKT4tMSlpJiZpLnB1c2gobyk7ZWxzZSBpZihsPXcuY29udGFpbnMoby5vd25lckRvY3VtZW50LG8pLGE9eWUoZi5hcHBlbmRDaGlsZChvKSxcInNjcmlwdFwiKSxsJiZ2ZShhKSxuKXtjPTA7d2hpbGUobz1hW2MrK10paGUudGVzdChvLnR5cGV8fFwiXCIpJiZuLnB1c2gobyl9cmV0dXJuIGZ9IWZ1bmN0aW9uKCl7dmFyIGU9ci5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKSx0PXIuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO3Quc2V0QXR0cmlidXRlKFwidHlwZVwiLFwicmFkaW9cIiksdC5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsXCJjaGVja2VkXCIpLHQuc2V0QXR0cmlidXRlKFwibmFtZVwiLFwidFwiKSxlLmFwcGVuZENoaWxkKHQpLGguY2hlY2tDbG9uZT1lLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxlLmlubmVySFRNTD1cIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT5cIixoLm5vQ2xvbmVDaGVja2VkPSEhZS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWV9KCk7dmFyIGJlPXIuZG9jdW1lbnRFbGVtZW50LHdlPS9ea2V5LyxUZT0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sQ2U9L14oW14uXSopKD86XFwuKC4rKXwpLztmdW5jdGlvbiBFZSgpe3JldHVybiEwfWZ1bmN0aW9uIGtlKCl7cmV0dXJuITF9ZnVuY3Rpb24gU2UoKXt0cnl7cmV0dXJuIHIuYWN0aXZlRWxlbWVudH1jYXRjaChlKXt9fWZ1bmN0aW9uIERlKGUsdCxuLHIsaSxvKXt2YXIgYSxzO2lmKFwib2JqZWN0XCI9PXR5cGVvZiB0KXtcInN0cmluZ1wiIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCk7Zm9yKHMgaW4gdClEZShlLHMsbixyLHRbc10sbyk7cmV0dXJuIGV9aWYobnVsbD09ciYmbnVsbD09aT8oaT1uLHI9bj12b2lkIDApOm51bGw9PWkmJihcInN0cmluZ1wiPT10eXBlb2Ygbj8oaT1yLHI9dm9pZCAwKTooaT1yLHI9bixuPXZvaWQgMCkpLCExPT09aSlpPWtlO2Vsc2UgaWYoIWkpcmV0dXJuIGU7cmV0dXJuIDE9PT1vJiYoYT1pLChpPWZ1bmN0aW9uKGUpe3JldHVybiB3KCkub2ZmKGUpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSkuZ3VpZD1hLmd1aWR8fChhLmd1aWQ9dy5ndWlkKyspKSxlLmVhY2goZnVuY3Rpb24oKXt3LmV2ZW50LmFkZCh0aGlzLHQsaSxyLG4pfSl9dy5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLHAsZCxoLGcseT1KLmdldChlKTtpZih5KXtuLmhhbmRsZXImJihuPShvPW4pLmhhbmRsZXIsaT1vLnNlbGVjdG9yKSxpJiZ3LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGJlLGkpLG4uZ3VpZHx8KG4uZ3VpZD13Lmd1aWQrKyksKHU9eS5ldmVudHMpfHwodT15LmV2ZW50cz17fSksKGE9eS5oYW5kbGUpfHwoYT15LmhhbmRsZT1mdW5jdGlvbih0KXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2YgdyYmdy5ldmVudC50cmlnZ2VyZWQhPT10LnR5cGU/dy5ldmVudC5kaXNwYXRjaC5hcHBseShlLGFyZ3VtZW50cyk6dm9pZCAwfSksbD0odD0odHx8XCJcIikubWF0Y2goTSl8fFtcIlwiXSkubGVuZ3RoO3doaWxlKGwtLSlkPWc9KHM9Q2UuZXhlYyh0W2xdKXx8W10pWzFdLGg9KHNbMl18fFwiXCIpLnNwbGl0KFwiLlwiKS5zb3J0KCksZCYmKGY9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShpP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkLGY9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxjPXcuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJncuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6aC5qb2luKFwiLlwiKX0sbyksKHA9dVtkXSl8fCgocD11W2RdPVtdKS5kZWxlZ2F0ZUNvdW50PTAsZi5zZXR1cCYmITEhPT1mLnNldHVwLmNhbGwoZSxyLGgsYSl8fGUuYWRkRXZlbnRMaXN0ZW5lciYmZS5hZGRFdmVudExpc3RlbmVyKGQsYSkpLGYuYWRkJiYoZi5hZGQuY2FsbChlLGMpLGMuaGFuZGxlci5ndWlkfHwoYy5oYW5kbGVyLmd1aWQ9bi5ndWlkKSksaT9wLnNwbGljZShwLmRlbGVnYXRlQ291bnQrKywwLGMpOnAucHVzaChjKSx3LmV2ZW50Lmdsb2JhbFtkXT0hMCl9fSxyZW1vdmU6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHk9Si5oYXNEYXRhKGUpJiZKLmdldChlKTtpZih5JiYodT15LmV2ZW50cykpe2w9KHQ9KHR8fFwiXCIpLm1hdGNoKE0pfHxbXCJcIl0pLmxlbmd0aDt3aGlsZShsLS0paWYocz1DZS5leGVjKHRbbF0pfHxbXSxkPWc9c1sxXSxoPShzWzJdfHxcIlwiKS5zcGxpdChcIi5cIikuc29ydCgpLGQpe2Y9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxwPXVbZD0ocj9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZF18fFtdLHM9c1syXSYmbmV3IFJlZ0V4cChcIihefFxcXFwuKVwiK2guam9pbihcIlxcXFwuKD86LipcXFxcLnwpXCIpK1wiKFxcXFwufCQpXCIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJihcIioqXCIhPT1yfHwhYy5zZWxlY3Rvcil8fChwLnNwbGljZShvLDEpLGMuc2VsZWN0b3ImJnAuZGVsZWdhdGVDb3VudC0tLGYucmVtb3ZlJiZmLnJlbW92ZS5jYWxsKGUsYykpO2EmJiFwLmxlbmd0aCYmKGYudGVhcmRvd24mJiExIT09Zi50ZWFyZG93bi5jYWxsKGUsaCx5LmhhbmRsZSl8fHcucmVtb3ZlRXZlbnQoZSxkLHkuaGFuZGxlKSxkZWxldGUgdVtkXSl9ZWxzZSBmb3IoZCBpbiB1KXcuZXZlbnQucmVtb3ZlKGUsZCt0W2xdLG4sciwhMCk7dy5pc0VtcHR5T2JqZWN0KHUpJiZKLnJlbW92ZShlLFwiaGFuZGxlIGV2ZW50c1wiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZhciB0PXcuZXZlbnQuZml4KGUpLG4scixpLG8sYSxzLHU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLGw9KEouZ2V0KHRoaXMsXCJldmVudHNcIil8fHt9KVt0LnR5cGVdfHxbXSxjPXcuZXZlbnQuc3BlY2lhbFt0LnR5cGVdfHx7fTtmb3IodVswXT10LG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXVbbl09YXJndW1lbnRzW25dO2lmKHQuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8ITEhPT1jLnByZURpc3BhdGNoLmNhbGwodGhpcyx0KSl7cz13LmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyx0LGwpLG49MDt3aGlsZSgobz1zW24rK10pJiYhdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXt0LmN1cnJlbnRUYXJnZXQ9by5lbGVtLHI9MDt3aGlsZSgoYT1vLmhhbmRsZXJzW3IrK10pJiYhdC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKXQucm5hbWVzcGFjZSYmIXQucm5hbWVzcGFjZS50ZXN0KGEubmFtZXNwYWNlKXx8KHQuaGFuZGxlT2JqPWEsdC5kYXRhPWEuZGF0YSx2b2lkIDAhPT0oaT0oKHcuZXZlbnQuc3BlY2lhbFthLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8YS5oYW5kbGVyKS5hcHBseShvLmVsZW0sdSkpJiYhMT09PSh0LnJlc3VsdD1pKSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsdCksdC5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoXCJjbGlja1wiPT09ZS50eXBlJiZlLmJ1dHRvbj49MSkpZm9yKDtsIT09dGhpcztsPWwucGFyZW50Tm9kZXx8dGhpcylpZigxPT09bC5ub2RlVHlwZSYmKFwiY2xpY2tcIiE9PWUudHlwZXx8ITAhPT1sLmRpc2FibGVkKSl7Zm9yKG89W10sYT17fSxuPTA7bjx1O24rKyl2b2lkIDA9PT1hW2k9KHI9dFtuXSkuc2VsZWN0b3IrXCIgXCJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD93KGksdGhpcykuaW5kZXgobCk+LTE6dy5maW5kKGksdGhpcyxudWxsLFtsXSkubGVuZ3RoKSxhW2ldJiZvLnB1c2gocik7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOm99KX1yZXR1cm4gbD10aGlzLHU8dC5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOnQuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHcuRXZlbnQucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpnKHQpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0KHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbZV19LHNldDpmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVt3LmV4cGFuZG9dP2U6bmV3IHcuRXZlbnQoZSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXMhPT1TZSgpJiZ0aGlzLmZvY3VzKXJldHVybiB0aGlzLmZvY3VzKCksITF9LGRlbGVnYXRlVHlwZTpcImZvY3VzaW5cIn0sYmx1cjp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXM9PT1TZSgpJiZ0aGlzLmJsdXIpcmV0dXJuIHRoaXMuYmx1cigpLCExfSxkZWxlZ2F0ZVR5cGU6XCJmb2N1c291dFwifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKFwiY2hlY2tib3hcIj09PXRoaXMudHlwZSYmdGhpcy5jbGljayYmTih0aGlzLFwiaW5wdXRcIikpcmV0dXJuIHRoaXMuY2xpY2soKSwhMX0sX2RlZmF1bHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIE4oZS50YXJnZXQsXCJhXCIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dm9pZCAwIT09ZS5yZXN1bHQmJmUub3JpZ2luYWxFdmVudCYmKGUub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1lLnJlc3VsdCl9fX19LHcucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbil9LHcuRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZighKHRoaXMgaW5zdGFuY2VvZiB3LkV2ZW50KSlyZXR1cm4gbmV3IHcuRXZlbnQoZSx0KTtlJiZlLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1lLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT1lLmRlZmF1bHRQcmV2ZW50ZWQmJiExPT09ZS5yZXR1cm5WYWx1ZT9FZTprZSx0aGlzLnRhcmdldD1lLnRhcmdldCYmMz09PWUudGFyZ2V0Lm5vZGVUeXBlP2UudGFyZ2V0LnBhcmVudE5vZGU6ZS50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PWUuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9ZS5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9ZSx0JiZ3LmV4dGVuZCh0aGlzLHQpLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbdy5leHBhbmRvXT0hMH0sdy5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOncuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOmtlLGlzUHJvcGFnYXRpb25TdG9wcGVkOmtlLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmtlLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPUVlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUVlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1FZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sdy5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLFwiY2hhclwiOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYnV0dG9uO3JldHVybiBudWxsPT1lLndoaWNoJiZ3ZS50ZXN0KGUudHlwZSk/bnVsbCE9ZS5jaGFyQ29kZT9lLmNoYXJDb2RlOmUua2V5Q29kZTohZS53aGljaCYmdm9pZCAwIT09dCYmVGUudGVzdChlLnR5cGUpPzEmdD8xOjImdD8zOjQmdD8yOjA6ZS53aGljaH19LHcuZXZlbnQuYWRkUHJvcCksdy5lYWNoKHttb3VzZWVudGVyOlwibW91c2VvdmVyXCIsbW91c2VsZWF2ZTpcIm1vdXNlb3V0XCIscG9pbnRlcmVudGVyOlwicG9pbnRlcm92ZXJcIixwb2ludGVybGVhdmU6XCJwb2ludGVyb3V0XCJ9LGZ1bmN0aW9uKGUsdCl7dy5ldmVudC5zcGVjaWFsW2VdPXtkZWxlZ2F0ZVR5cGU6dCxiaW5kVHlwZTp0LGhhbmRsZTpmdW5jdGlvbihlKXt2YXIgbixyPXRoaXMsaT1lLnJlbGF0ZWRUYXJnZXQsbz1lLmhhbmRsZU9iajtyZXR1cm4gaSYmKGk9PT1yfHx3LmNvbnRhaW5zKHIsaSkpfHwoZS50eXBlPW8ub3JpZ1R5cGUsbj1vLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT10KSxufX19KSx3LmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIERlKHRoaXMsZSx0LG4scil9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gRGUodGhpcyxlLHQsbixyLDEpfSxvZmY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYoZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5oYW5kbGVPYmopcmV0dXJuIHI9ZS5oYW5kbGVPYmosdyhlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZStcIi5cIityLm5hbWVzcGFjZTpyLm9yaWdUeXBlLHIuc2VsZWN0b3Isci5oYW5kbGVyKSx0aGlzO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PXQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIHR8fChuPXQsdD12b2lkIDApLCExPT09biYmKG49a2UpLHRoaXMuZWFjaChmdW5jdGlvbigpe3cuZXZlbnQucmVtb3ZlKHRoaXMsZSxuLHQpfSl9fSk7dmFyIE5lPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKilbXj5dKilcXC8+L2dpLEFlPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLGplPS9jaGVja2VkXFxzKig/OltePV18PVxccyouY2hlY2tlZC4pL2kscWU9L15cXHMqPCEoPzpcXFtDREFUQVxcW3wtLSl8KD86XFxdXFxdfC0tKT5cXHMqJC9nO2Z1bmN0aW9uIExlKGUsdCl7cmV0dXJuIE4oZSxcInRhYmxlXCIpJiZOKDExIT09dC5ub2RlVHlwZT90OnQuZmlyc3RDaGlsZCxcInRyXCIpP3coZSkuY2hpbGRyZW4oXCJ0Ym9keVwiKVswXXx8ZTplfWZ1bmN0aW9uIEhlKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZShcInR5cGVcIikpK1wiL1wiK2UudHlwZSxlfWZ1bmN0aW9uIE9lKGUpe3JldHVyblwidHJ1ZS9cIj09PShlLnR5cGV8fFwiXCIpLnNsaWNlKDAsNSk/ZS50eXBlPWUudHlwZS5zbGljZSg1KTplLnJlbW92ZUF0dHJpYnV0ZShcInR5cGVcIiksZX1mdW5jdGlvbiBQZShlLHQpe3ZhciBuLHIsaSxvLGEscyx1LGw7aWYoMT09PXQubm9kZVR5cGUpe2lmKEouaGFzRGF0YShlKSYmKG89Si5hY2Nlc3MoZSksYT1KLnNldCh0LG8pLGw9by5ldmVudHMpKXtkZWxldGUgYS5oYW5kbGUsYS5ldmVudHM9e307Zm9yKGkgaW4gbClmb3Iobj0wLHI9bFtpXS5sZW5ndGg7bjxyO24rKyl3LmV2ZW50LmFkZCh0LGksbFtpXVtuXSl9Sy5oYXNEYXRhKGUpJiYocz1LLmFjY2VzcyhlKSx1PXcuZXh0ZW5kKHt9LHMpLEsuc2V0KHQsdSkpfX1mdW5jdGlvbiBNZShlLHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcImlucHV0XCI9PT1uJiZwZS50ZXN0KGUudHlwZSk/dC5jaGVja2VkPWUuY2hlY2tlZDpcImlucHV0XCIhPT1uJiZcInRleHRhcmVhXCIhPT1ufHwodC5kZWZhdWx0VmFsdWU9ZS5kZWZhdWx0VmFsdWUpfWZ1bmN0aW9uIFJlKGUsdCxuLHIpe3Q9YS5hcHBseShbXSx0KTt2YXIgaSxvLHMsdSxsLGMsZj0wLHA9ZS5sZW5ndGgsZD1wLTEseT10WzBdLHY9Zyh5KTtpZih2fHxwPjEmJlwic3RyaW5nXCI9PXR5cGVvZiB5JiYhaC5jaGVja0Nsb25lJiZqZS50ZXN0KHkpKXJldHVybiBlLmVhY2goZnVuY3Rpb24oaSl7dmFyIG89ZS5lcShpKTt2JiYodFswXT15LmNhbGwodGhpcyxpLG8uaHRtbCgpKSksUmUobyx0LG4scil9KTtpZihwJiYoaT14ZSh0LGVbMF0ub3duZXJEb2N1bWVudCwhMSxlLHIpLG89aS5maXJzdENoaWxkLDE9PT1pLmNoaWxkTm9kZXMubGVuZ3RoJiYoaT1vKSxvfHxyKSl7Zm9yKHU9KHM9dy5tYXAoeWUoaSxcInNjcmlwdFwiKSxIZSkpLmxlbmd0aDtmPHA7ZisrKWw9aSxmIT09ZCYmKGw9dy5jbG9uZShsLCEwLCEwKSx1JiZ3Lm1lcmdlKHMseWUobCxcInNjcmlwdFwiKSkpLG4uY2FsbChlW2ZdLGwsZik7aWYodSlmb3IoYz1zW3MubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsdy5tYXAocyxPZSksZj0wO2Y8dTtmKyspbD1zW2ZdLGhlLnRlc3QobC50eXBlfHxcIlwiKSYmIUouYWNjZXNzKGwsXCJnbG9iYWxFdmFsXCIpJiZ3LmNvbnRhaW5zKGMsbCkmJihsLnNyYyYmXCJtb2R1bGVcIiE9PShsLnR5cGV8fFwiXCIpLnRvTG93ZXJDYXNlKCk/dy5fZXZhbFVybCYmdy5fZXZhbFVybChsLnNyYyk6bShsLnRleHRDb250ZW50LnJlcGxhY2UocWUsXCJcIiksYyxsKSl9cmV0dXJuIGV9ZnVuY3Rpb24gSWUoZSx0LG4pe2Zvcih2YXIgcixpPXQ/dy5maWx0ZXIodCxlKTplLG89MDtudWxsIT0ocj1pW29dKTtvKyspbnx8MSE9PXIubm9kZVR5cGV8fHcuY2xlYW5EYXRhKHllKHIpKSxyLnBhcmVudE5vZGUmJihuJiZ3LmNvbnRhaW5zKHIub3duZXJEb2N1bWVudCxyKSYmdmUoeWUocixcInNjcmlwdFwiKSksci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpKTtyZXR1cm4gZX13LmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKE5lLFwiPCQxPjwvJDI+XCIpfSxjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNsb25lTm9kZSghMCksdT13LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKTtpZighKGgubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fHcuaXNYTUxEb2MoZSkpKWZvcihhPXllKHMpLHI9MCxpPShvPXllKGUpKS5sZW5ndGg7cjxpO3IrKylNZShvW3JdLGFbcl0pO2lmKHQpaWYobilmb3Iobz1vfHx5ZShlKSxhPWF8fHllKHMpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspUGUob1tyXSxhW3JdKTtlbHNlIFBlKGUscyk7cmV0dXJuKGE9eWUocyxcInNjcmlwdFwiKSkubGVuZ3RoPjAmJnZlKGEsIXUmJnllKGUsXCJzY3JpcHRcIikpLHN9LGNsZWFuRGF0YTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyLGk9dy5ldmVudC5zcGVjaWFsLG89MDt2b2lkIDAhPT0obj1lW29dKTtvKyspaWYoWShuKSl7aWYodD1uW0ouZXhwYW5kb10pe2lmKHQuZXZlbnRzKWZvcihyIGluIHQuZXZlbnRzKWlbcl0/dy5ldmVudC5yZW1vdmUobixyKTp3LnJlbW92ZUV2ZW50KG4scix0LmhhbmRsZSk7bltKLmV4cGFuZG9dPXZvaWQgMH1uW0suZXhwYW5kb10mJihuW0suZXhwYW5kb109dm9pZCAwKX19fSksdy5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gSWUodGhpcyxlLCEwKX0scmVtb3ZlOmZ1bmN0aW9uKGUpe3JldHVybiBJZSh0aGlzLGUpfSx0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/dy50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fCh0aGlzLnRleHRDb250ZW50PWUpfSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIFJlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHxMZSh0aGlzLGUpLmFwcGVuZENoaWxkKGUpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUmUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PUxlKHRoaXMsZSk7dC5pbnNlcnRCZWZvcmUoZSx0LmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gUmUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gUmUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD0wO251bGwhPShlPXRoaXNbdF0pO3QrKykxPT09ZS5ub2RlVHlwZSYmKHcuY2xlYW5EYXRhKHllKGUsITEpKSxlLnRleHRDb250ZW50PVwiXCIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB3LmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlJiYhQWUudGVzdChlKSYmIWdlWyhkZS5leGVjKGUpfHxbXCJcIixcIlwiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9dy5odG1sUHJlZmlsdGVyKGUpO3RyeXtmb3IoO248cjtuKyspMT09PSh0PXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKHcuY2xlYW5EYXRhKHllKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIFJlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTt3LmluQXJyYXkodGhpcyxlKTwwJiYody5jbGVhbkRhdGEoeWUodGhpcykpLG4mJm4ucmVwbGFjZUNoaWxkKHQsdGhpcykpfSxlKX19KSx3LmVhY2goe2FwcGVuZFRvOlwiYXBwZW5kXCIscHJlcGVuZFRvOlwicHJlcGVuZFwiLGluc2VydEJlZm9yZTpcImJlZm9yZVwiLGluc2VydEFmdGVyOlwiYWZ0ZXJcIixyZXBsYWNlQWxsOlwicmVwbGFjZVdpdGhcIn0sZnVuY3Rpb24oZSx0KXt3LmZuW2VdPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbixyPVtdLGk9dyhlKSxvPWkubGVuZ3RoLTEsYT0wO2E8PW87YSsrKW49YT09PW8/dGhpczp0aGlzLmNsb25lKCEwKSx3KGlbYV0pW3RdKG4pLHMuYXBwbHkocixuLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socil9fSk7dmFyIFdlPW5ldyBSZWdFeHAoXCJeKFwiK3JlK1wiKSg/IXB4KVthLXolXSskXCIsXCJpXCIpLCRlPWZ1bmN0aW9uKHQpe3ZhciBuPXQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gbiYmbi5vcGVuZXJ8fChuPWUpLG4uZ2V0Q29tcHV0ZWRTdHlsZSh0KX0sQmU9bmV3IFJlZ0V4cChvZS5qb2luKFwifFwiKSxcImlcIik7IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2lmKGMpe2wuc3R5bGUuY3NzVGV4dD1cInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjBcIixjLnN0eWxlLmNzc1RleHQ9XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo2MCU7dG9wOjElXCIsYmUuYXBwZW5kQ2hpbGQobCkuYXBwZW5kQ2hpbGQoYyk7dmFyIHQ9ZS5nZXRDb21wdXRlZFN0eWxlKGMpO2k9XCIxJVwiIT09dC50b3AsdT0xMj09PW4odC5tYXJnaW5MZWZ0KSxjLnN0eWxlLnJpZ2h0PVwiNjAlXCIscz0zNj09PW4odC5yaWdodCksbz0zNj09PW4odC53aWR0aCksYy5zdHlsZS5wb3NpdGlvbj1cImFic29sdXRlXCIsYT0zNj09PWMub2Zmc2V0V2lkdGh8fFwiYWJzb2x1dGVcIixiZS5yZW1vdmVDaGlsZChsKSxjPW51bGx9fWZ1bmN0aW9uIG4oZSl7cmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChlKSl9dmFyIGksbyxhLHMsdSxsPXIuY3JlYXRlRWxlbWVudChcImRpdlwiKSxjPXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtjLnN0eWxlJiYoYy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD1cImNvbnRlbnQtYm94XCIsYy5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPVwiXCIsaC5jbGVhckNsb25lU3R5bGU9XCJjb250ZW50LWJveFwiPT09Yy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCx3LmV4dGVuZChoLHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiB0KCksb30scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHN9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLGl9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiB0KCksdX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0KCksYX19KSl9KCk7ZnVuY3Rpb24gRmUoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5zdHlsZTtyZXR1cm4obj1ufHwkZShlKSkmJihcIlwiIT09KGE9bi5nZXRQcm9wZXJ0eVZhbHVlKHQpfHxuW3RdKXx8dy5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl8fChhPXcuc3R5bGUoZSx0KSksIWgucGl4ZWxCb3hTdHlsZXMoKSYmV2UudGVzdChhKSYmQmUudGVzdCh0KSYmKHI9cy53aWR0aCxpPXMubWluV2lkdGgsbz1zLm1heFdpZHRoLHMubWluV2lkdGg9cy5tYXhXaWR0aD1zLndpZHRoPWEsYT1uLndpZHRoLHMud2lkdGg9cixzLm1pbldpZHRoPWkscy5tYXhXaWR0aD1vKSksdm9pZCAwIT09YT9hK1wiXCI6YX1mdW5jdGlvbiBfZShlLHQpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtpZighZSgpKXJldHVybih0aGlzLmdldD10KS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZGVsZXRlIHRoaXMuZ2V0fX19dmFyIHplPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxYZT0vXi0tLyxVZT17cG9zaXRpb246XCJhYnNvbHV0ZVwiLHZpc2liaWxpdHk6XCJoaWRkZW5cIixkaXNwbGF5OlwiYmxvY2tcIn0sVmU9e2xldHRlclNwYWNpbmc6XCIwXCIsZm9udFdlaWdodDpcIjQwMFwifSxHZT1bXCJXZWJraXRcIixcIk1velwiLFwibXNcIl0sWWU9ci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLnN0eWxlO2Z1bmN0aW9uIFFlKGUpe2lmKGUgaW4gWWUpcmV0dXJuIGU7dmFyIHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj1HZS5sZW5ndGg7d2hpbGUobi0tKWlmKChlPUdlW25dK3QpaW4gWWUpcmV0dXJuIGV9ZnVuY3Rpb24gSmUoZSl7dmFyIHQ9dy5jc3NQcm9wc1tlXTtyZXR1cm4gdHx8KHQ9dy5jc3NQcm9wc1tlXT1RZShlKXx8ZSksdH1mdW5jdGlvbiBLZShlLHQsbil7dmFyIHI9aWUuZXhlYyh0KTtyZXR1cm4gcj9NYXRoLm1heCgwLHJbMl0tKG58fDApKSsoclszXXx8XCJweFwiKTp0fWZ1bmN0aW9uIFplKGUsdCxuLHIsaSxvKXt2YXIgYT1cIndpZHRoXCI9PT10PzE6MCxzPTAsdT0wO2lmKG49PT0ocj9cImJvcmRlclwiOlwiY29udGVudFwiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKVwibWFyZ2luXCI9PT1uJiYodSs9dy5jc3MoZSxuK29lW2FdLCEwLGkpKSxyPyhcImNvbnRlbnRcIj09PW4mJih1LT13LmNzcyhlLFwicGFkZGluZ1wiK29lW2FdLCEwLGkpKSxcIm1hcmdpblwiIT09biYmKHUtPXcuY3NzKGUsXCJib3JkZXJcIitvZVthXStcIldpZHRoXCIsITAsaSkpKToodSs9dy5jc3MoZSxcInBhZGRpbmdcIitvZVthXSwhMCxpKSxcInBhZGRpbmdcIiE9PW4/dSs9dy5jc3MoZSxcImJvcmRlclwiK29lW2FdK1wiV2lkdGhcIiwhMCxpKTpzKz13LmNzcyhlLFwiYm9yZGVyXCIrb2VbYV0rXCJXaWR0aFwiLCEwLGkpKTtyZXR1cm4hciYmbz49MCYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbXCJvZmZzZXRcIit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tby11LXMtLjUpKSksdX1mdW5jdGlvbiBldChlLHQsbil7dmFyIHI9JGUoZSksaT1GZShlLHQsciksbz1cImJvcmRlci1ib3hcIj09PXcuY3NzKGUsXCJib3hTaXppbmdcIiwhMSxyKSxhPW87aWYoV2UudGVzdChpKSl7aWYoIW4pcmV0dXJuIGk7aT1cImF1dG9cIn1yZXR1cm4gYT1hJiYoaC5ib3hTaXppbmdSZWxpYWJsZSgpfHxpPT09ZS5zdHlsZVt0XSksKFwiYXV0b1wiPT09aXx8IXBhcnNlRmxvYXQoaSkmJlwiaW5saW5lXCI9PT13LmNzcyhlLFwiZGlzcGxheVwiLCExLHIpKSYmKGk9ZVtcIm9mZnNldFwiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpXSxhPSEwKSwoaT1wYXJzZUZsb2F0KGkpfHwwKStaZShlLHQsbnx8KG8/XCJib3JkZXJcIjpcImNvbnRlbnRcIiksYSxyLGkpK1wicHhcIn13LmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPUZlKGUsXCJvcGFjaXR5XCIpO3JldHVyblwiXCI9PT1uP1wiMVwiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6e30sc3R5bGU6ZnVuY3Rpb24oZSx0LG4scil7aWYoZSYmMyE9PWUubm9kZVR5cGUmJjghPT1lLm5vZGVUeXBlJiZlLnN0eWxlKXt2YXIgaSxvLGEscz1HKHQpLHU9WGUudGVzdCh0KSxsPWUuc3R5bGU7aWYodXx8KHQ9SmUocykpLGE9dy5jc3NIb29rc1t0XXx8dy5jc3NIb29rc1tzXSx2b2lkIDA9PT1uKXJldHVybiBhJiZcImdldFwiaW4gYSYmdm9pZCAwIT09KGk9YS5nZXQoZSwhMSxyKSk/aTpsW3RdO1wic3RyaW5nXCI9PShvPXR5cGVvZiBuKSYmKGk9aWUuZXhlYyhuKSkmJmlbMV0mJihuPXVlKGUsdCxpKSxvPVwibnVtYmVyXCIpLG51bGwhPW4mJm49PT1uJiYoXCJudW1iZXJcIj09PW8mJihuKz1pJiZpWzNdfHwody5jc3NOdW1iZXJbc10/XCJcIjpcInB4XCIpKSxoLmNsZWFyQ2xvbmVTdHlsZXx8XCJcIiE9PW58fDAhPT10LmluZGV4T2YoXCJiYWNrZ3JvdW5kXCIpfHwobFt0XT1cImluaGVyaXRcIiksYSYmXCJzZXRcImluIGEmJnZvaWQgMD09PShuPWEuc2V0KGUsbixyKSl8fCh1P2wuc2V0UHJvcGVydHkodCxuKTpsW3RdPW4pKX19LGNzczpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1HKHQpO3JldHVybiBYZS50ZXN0KHQpfHwodD1KZShzKSksKGE9dy5jc3NIb29rc1t0XXx8dy5jc3NIb29rc1tzXSkmJlwiZ2V0XCJpbiBhJiYoaT1hLmdldChlLCEwLG4pKSx2b2lkIDA9PT1pJiYoaT1GZShlLHQscikpLFwibm9ybWFsXCI9PT1pJiZ0IGluIFZlJiYoaT1WZVt0XSksXCJcIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSwhMD09PW58fGlzRmluaXRlKG8pP298fDA6aSk6aX19KSx3LmVhY2goW1wiaGVpZ2h0XCIsXCJ3aWR0aFwiXSxmdW5jdGlvbihlLHQpe3cuY3NzSG9va3NbdF09e2dldDpmdW5jdGlvbihlLG4scil7aWYobilyZXR1cm4hemUudGVzdCh3LmNzcyhlLFwiZGlzcGxheVwiKSl8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/ZXQoZSx0LHIpOnNlKGUsVWUsZnVuY3Rpb24oKXtyZXR1cm4gZXQoZSx0LHIpfSl9LHNldDpmdW5jdGlvbihlLG4scil7dmFyIGksbz0kZShlKSxhPVwiYm9yZGVyLWJveFwiPT09dy5jc3MoZSxcImJveFNpemluZ1wiLCExLG8pLHM9ciYmWmUoZSx0LHIsYSxvKTtyZXR1cm4gYSYmaC5zY3JvbGxib3hTaXplKCk9PT1vLnBvc2l0aW9uJiYocy09TWF0aC5jZWlsKGVbXCJvZmZzZXRcIit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tcGFyc2VGbG9hdChvW3RdKS1aZShlLHQsXCJib3JkZXJcIiwhMSxvKS0uNSkpLHMmJihpPWllLmV4ZWMobikpJiZcInB4XCIhPT0oaVszXXx8XCJweFwiKSYmKGUuc3R5bGVbdF09bixuPXcuY3NzKGUsdCkpLEtlKGUsbixzKX19fSksdy5jc3NIb29rcy5tYXJnaW5MZWZ0PV9lKGgucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChGZShlLFwibWFyZ2luTGVmdFwiKSl8fGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1zZShlLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKStcInB4XCJ9KSx3LmVhY2goe21hcmdpbjpcIlwiLHBhZGRpbmc6XCJcIixib3JkZXI6XCJXaWR0aFwifSxmdW5jdGlvbihlLHQpe3cuY3NzSG9va3NbZSt0XT17ZXhwYW5kOmZ1bmN0aW9uKG4pe2Zvcih2YXIgcj0wLGk9e30sbz1cInN0cmluZ1wiPT10eXBlb2Ygbj9uLnNwbGl0KFwiIFwiKTpbbl07cjw0O3IrKylpW2Urb2Vbcl0rdF09b1tyXXx8b1tyLTJdfHxvWzBdO3JldHVybiBpfX0sXCJtYXJnaW5cIiE9PWUmJih3LmNzc0hvb2tzW2UrdF0uc2V0PUtlKX0pLHcuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geih0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e30sYT0wO2lmKEFycmF5LmlzQXJyYXkodCkpe2ZvcihyPSRlKGUpLGk9dC5sZW5ndGg7YTxpO2ErKylvW3RbYV1dPXcuY3NzKGUsdFthXSwhMSxyKTtyZXR1cm4gb31yZXR1cm4gdm9pZCAwIT09bj93LnN0eWxlKGUsdCxuKTp3LmNzcyhlLHQpfSxlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX19KTtmdW5jdGlvbiB0dChlLHQsbixyLGkpe3JldHVybiBuZXcgdHQucHJvdG90eXBlLmluaXQoZSx0LG4scixpKX13LlR3ZWVuPXR0LHR0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6dHQsaW5pdDpmdW5jdGlvbihlLHQsbixyLGksbyl7dGhpcy5lbGVtPWUsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9aXx8dy5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PW98fCh3LmNzc051bWJlcltuXT9cIlwiOlwicHhcIil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPXR0LnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTp0dC5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj10dC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPXQ9dy5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9dD1lLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0K3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOnR0LnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LHR0LnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT10dC5wcm90b3R5cGUsdHQucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiAxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsIT1lLmVsZW1bZS5wcm9wXSYmbnVsbD09ZS5lbGVtLnN0eWxlW2UucHJvcF0/ZS5lbGVtW2UucHJvcF06KHQ9dy5jc3MoZS5lbGVtLGUucHJvcCxcIlwiKSkmJlwiYXV0b1wiIT09dD90OjB9LHNldDpmdW5jdGlvbihlKXt3LmZ4LnN0ZXBbZS5wcm9wXT93LmZ4LnN0ZXBbZS5wcm9wXShlKToxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsPT1lLmVsZW0uc3R5bGVbdy5jc3NQcm9wc1tlLnByb3BdXSYmIXcuY3NzSG9va3NbZS5wcm9wXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzp3LnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSx0dC5wcm9wSG9va3Muc2Nyb2xsVG9wPXR0LnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LHcuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6XCJzd2luZ1wifSx3LmZ4PXR0LnByb3RvdHlwZS5pbml0LHcuZnguc3RlcD17fTt2YXIgbnQscnQsaXQ9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLG90PS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gYXQoKXtydCYmKCExPT09ci5oaWRkZW4mJmUucmVxdWVzdEFuaW1hdGlvbkZyYW1lP2UucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGF0KTplLnNldFRpbWVvdXQoYXQsdy5meC5pbnRlcnZhbCksdy5meC50aWNrKCkpfWZ1bmN0aW9uIHN0KCl7cmV0dXJuIGUuc2V0VGltZW91dChmdW5jdGlvbigpe250PXZvaWQgMH0pLG50PURhdGUubm93KCl9ZnVuY3Rpb24gdXQoZSx0KXt2YXIgbixyPTAsaT17aGVpZ2h0OmV9O2Zvcih0PXQ/MTowO3I8NDtyKz0yLXQpaVtcIm1hcmdpblwiKyhuPW9lW3JdKV09aVtcInBhZGRpbmdcIituXT1lO3JldHVybiB0JiYoaS5vcGFjaXR5PWkud2lkdGg9ZSksaX1mdW5jdGlvbiBsdChlLHQsbil7Zm9yKHZhciByLGk9KHB0LnR3ZWVuZXJzW3RdfHxbXSkuY29uY2F0KHB0LnR3ZWVuZXJzW1wiKlwiXSksbz0wLGE9aS5sZW5ndGg7bzxhO28rKylpZihyPWlbb10uY2FsbChuLHQsZSkpcmV0dXJuIHJ9ZnVuY3Rpb24gY3QoZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsLGMsZj1cIndpZHRoXCJpbiB0fHxcImhlaWdodFwiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZhZShlKSx5PUouZ2V0KGUsXCJmeHNob3dcIik7bi5xdWV1ZXx8KG51bGw9PShhPXcuX3F1ZXVlSG9va3MoZSxcImZ4XCIpKS51bnF1ZXVlZCYmKGEudW5xdWV1ZWQ9MCxzPWEuZW1wdHkuZmlyZSxhLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXthLnVucXVldWVkfHxzKCl9KSxhLnVucXVldWVkKysscC5hbHdheXMoZnVuY3Rpb24oKXtwLmFsd2F5cyhmdW5jdGlvbigpe2EudW5xdWV1ZWQtLSx3LnF1ZXVlKGUsXCJmeFwiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSk7Zm9yKHIgaW4gdClpZihpPXRbcl0saXQudGVzdChpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHxcInRvZ2dsZVwiPT09aSxpPT09KGc/XCJoaWRlXCI6XCJzaG93XCIpKXtpZihcInNob3dcIiE9PWl8fCF5fHx2b2lkIDA9PT15W3JdKWNvbnRpbnVlO2c9ITB9ZFtyXT15JiZ5W3JdfHx3LnN0eWxlKGUscil9aWYoKHU9IXcuaXNFbXB0eU9iamVjdCh0KSl8fCF3LmlzRW1wdHlPYmplY3QoZCkpe2YmJjE9PT1lLm5vZGVUeXBlJiYobi5vdmVyZmxvdz1baC5vdmVyZmxvdyxoLm92ZXJmbG93WCxoLm92ZXJmbG93WV0sbnVsbD09KGw9eSYmeS5kaXNwbGF5KSYmKGw9Si5nZXQoZSxcImRpc3BsYXlcIikpLFwibm9uZVwiPT09KGM9dy5jc3MoZSxcImRpc3BsYXlcIikpJiYobD9jPWw6KGZlKFtlXSwhMCksbD1lLnN0eWxlLmRpc3BsYXl8fGwsYz13LmNzcyhlLFwiZGlzcGxheVwiKSxmZShbZV0pKSksKFwiaW5saW5lXCI9PT1jfHxcImlubGluZS1ibG9ja1wiPT09YyYmbnVsbCE9bCkmJlwibm9uZVwiPT09dy5jc3MoZSxcImZsb2F0XCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2guZGlzcGxheT1sfSksbnVsbD09bCYmKGM9aC5kaXNwbGF5LGw9XCJub25lXCI9PT1jP1wiXCI6YykpLGguZGlzcGxheT1cImlubGluZS1ibG9ja1wiKSksbi5vdmVyZmxvdyYmKGgub3ZlcmZsb3c9XCJoaWRkZW5cIixwLmFsd2F5cyhmdW5jdGlvbigpe2gub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxoLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLGgub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSksdT0hMTtmb3IociBpbiBkKXV8fCh5P1wiaGlkZGVuXCJpbiB5JiYoZz15LmhpZGRlbik6eT1KLmFjY2VzcyhlLFwiZnhzaG93XCIse2Rpc3BsYXk6bH0pLG8mJih5LmhpZGRlbj0hZyksZyYmZmUoW2VdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtnfHxmZShbZV0pLEoucmVtb3ZlKGUsXCJmeHNob3dcIik7Zm9yKHIgaW4gZCl3LnN0eWxlKGUscixkW3JdKX0pKSx1PWx0KGc/eVtyXTowLHIscCksciBpbiB5fHwoeVtyXT11LnN0YXJ0LGcmJih1LmVuZD11LnN0YXJ0LHUuc3RhcnQ9MCkpfX1mdW5jdGlvbiBmdChlLHQpe3ZhciBuLHIsaSxvLGE7Zm9yKG4gaW4gZSlpZihyPUcobiksaT10W3JdLG89ZVtuXSxBcnJheS5pc0FycmF5KG8pJiYoaT1vWzFdLG89ZVtuXT1vWzBdKSxuIT09ciYmKGVbcl09byxkZWxldGUgZVtuXSksKGE9dy5jc3NIb29rc1tyXSkmJlwiZXhwYW5kXCJpbiBhKXtvPWEuZXhwYW5kKG8pLGRlbGV0ZSBlW3JdO2ZvcihuIGluIG8pbiBpbiBlfHwoZVtuXT1vW25dLHRbbl09aSl9ZWxzZSB0W3JdPWl9ZnVuY3Rpb24gcHQoZSx0LG4pe3ZhciByLGksbz0wLGE9cHQucHJlZmlsdGVycy5sZW5ndGgscz13LkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihpKXJldHVybiExO2Zvcih2YXIgdD1udHx8c3QoKSxuPU1hdGgubWF4KDAsbC5zdGFydFRpbWUrbC5kdXJhdGlvbi10KSxyPTEtKG4vbC5kdXJhdGlvbnx8MCksbz0wLGE9bC50d2VlbnMubGVuZ3RoO288YTtvKyspbC50d2VlbnNbb10ucnVuKHIpO3JldHVybiBzLm5vdGlmeVdpdGgoZSxbbCxyLG5dKSxyPDEmJmE/bjooYXx8cy5ub3RpZnlXaXRoKGUsW2wsMSwwXSkscy5yZXNvbHZlV2l0aChlLFtsXSksITEpfSxsPXMucHJvbWlzZSh7ZWxlbTplLHByb3BzOncuZXh0ZW5kKHt9LHQpLG9wdHM6dy5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e30sZWFzaW5nOncuZWFzaW5nLl9kZWZhdWx0fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6dCxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6bnR8fHN0KCksZHVyYXRpb246bi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgcj13LlR3ZWVuKGUsbC5vcHRzLHQsbixsLm9wdHMuc3BlY2lhbEVhc2luZ1t0XXx8bC5vcHRzLmVhc2luZyk7cmV0dXJuIGwudHdlZW5zLnB1c2gocikscn0sc3RvcDpmdW5jdGlvbih0KXt2YXIgbj0wLHI9dD9sLnR3ZWVucy5sZW5ndGg6MDtpZihpKXJldHVybiB0aGlzO2ZvcihpPSEwO248cjtuKyspbC50d2VlbnNbbl0ucnVuKDEpO3JldHVybiB0PyhzLm5vdGlmeVdpdGgoZSxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKGUsW2wsdF0pKTpzLnJlamVjdFdpdGgoZSxbbCx0XSksdGhpc319KSxjPWwucHJvcHM7Zm9yKGZ0KGMsbC5vcHRzLnNwZWNpYWxFYXNpbmcpO288YTtvKyspaWYocj1wdC5wcmVmaWx0ZXJzW29dLmNhbGwobCxlLGMsbC5vcHRzKSlyZXR1cm4gZyhyLnN0b3ApJiYody5fcXVldWVIb29rcyhsLmVsZW0sbC5vcHRzLnF1ZXVlKS5zdG9wPXIuc3RvcC5iaW5kKHIpKSxyO3JldHVybiB3Lm1hcChjLGx0LGwpLGcobC5vcHRzLnN0YXJ0KSYmbC5vcHRzLnN0YXJ0LmNhbGwoZSxsKSxsLnByb2dyZXNzKGwub3B0cy5wcm9ncmVzcykuZG9uZShsLm9wdHMuZG9uZSxsLm9wdHMuY29tcGxldGUpLmZhaWwobC5vcHRzLmZhaWwpLmFsd2F5cyhsLm9wdHMuYWx3YXlzKSx3LmZ4LnRpbWVyKHcuZXh0ZW5kKHUse2VsZW06ZSxhbmltOmwscXVldWU6bC5vcHRzLnF1ZXVlfSkpLGx9dy5BbmltYXRpb249dy5leHRlbmQocHQse3R3ZWVuZXJzOntcIipcIjpbZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKGUsdCk7cmV0dXJuIHVlKG4uZWxlbSxlLGllLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7ZyhlKT8odD1lLGU9W1wiKlwiXSk6ZT1lLm1hdGNoKE0pO2Zvcih2YXIgbixyPTAsaT1lLmxlbmd0aDtyPGk7cisrKW49ZVtyXSxwdC50d2VlbmVyc1tuXT1wdC50d2VlbmVyc1tuXXx8W10scHQudHdlZW5lcnNbbl0udW5zaGlmdCh0KX0scHJlZmlsdGVyczpbY3RdLHByZWZpbHRlcjpmdW5jdGlvbihlLHQpe3Q/cHQucHJlZmlsdGVycy51bnNoaWZ0KGUpOnB0LnByZWZpbHRlcnMucHVzaChlKX19KSx3LnNwZWVkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lJiZcIm9iamVjdFwiPT10eXBlb2YgZT93LmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fGcoZSkmJmUsZHVyYXRpb246ZSxlYXNpbmc6biYmdHx8dCYmIWcodCkmJnR9O3JldHVybiB3LmZ4Lm9mZj9yLmR1cmF0aW9uPTA6XCJudW1iZXJcIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIHcuZnguc3BlZWRzP3IuZHVyYXRpb249dy5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj13LmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT1cImZ4XCIpLHIub2xkPXIuY29tcGxldGUsci5jb21wbGV0ZT1mdW5jdGlvbigpe2coci5vbGQpJiZyLm9sZC5jYWxsKHRoaXMpLHIucXVldWUmJncuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSx3LmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLmZpbHRlcihhZSkuY3NzKFwib3BhY2l0eVwiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT13LmlzRW1wdHlPYmplY3QoZSksbz13LnNwZWVkKHQsbixyKSxhPWZ1bmN0aW9uKCl7dmFyIHQ9cHQodGhpcyx3LmV4dGVuZCh7fSxlKSxvKTsoaXx8Si5nZXQodGhpcyxcImZpbmlzaFwiKSkmJnQuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fCExPT09by5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG4pfTtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgZSYmKG49dCx0PWUsZT12b2lkIDApLHQmJiExIT09ZSYmdGhpcy5xdWV1ZShlfHxcImZ4XCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PSEwLGk9bnVsbCE9ZSYmZStcInF1ZXVlSG9va3NcIixvPXcudGltZXJzLGE9Si5nZXQodGhpcyk7aWYoaSlhW2ldJiZhW2ldLnN0b3AmJnIoYVtpXSk7ZWxzZSBmb3IoaSBpbiBhKWFbaV0mJmFbaV0uc3RvcCYmb3QudGVzdChpKSYmcihhW2ldKTtmb3IoaT1vLmxlbmd0aDtpLS07KW9baV0uZWxlbSE9PXRoaXN8fG51bGwhPWUmJm9baV0ucXVldWUhPT1lfHwob1tpXS5hbmltLnN0b3AobiksdD0hMSxvLnNwbGljZShpLDEpKTshdCYmbnx8dy5kZXF1ZXVlKHRoaXMsZSl9KX0sZmluaXNoOmZ1bmN0aW9uKGUpe3JldHVybiExIT09ZSYmKGU9ZXx8XCJmeFwiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdCxuPUouZ2V0KHRoaXMpLHI9bltlK1wicXVldWVcIl0saT1uW2UrXCJxdWV1ZUhvb2tzXCJdLG89dy50aW1lcnMsYT1yP3IubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLHcucXVldWUodGhpcyxlLFtdKSxpJiZpLnN0b3AmJmkuc3RvcC5jYWxsKHRoaXMsITApLHQ9by5sZW5ndGg7dC0tOylvW3RdLmVsZW09PT10aGlzJiZvW3RdLnF1ZXVlPT09ZSYmKG9bdF0uYW5pbS5zdG9wKCEwKSxvLnNwbGljZSh0LDEpKTtmb3IodD0wO3Q8YTt0Kyspclt0XSYmclt0XS5maW5pc2gmJnJbdF0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIG4uZmluaXNofSl9fSksdy5lYWNoKFtcInRvZ2dsZVwiLFwic2hvd1wiLFwiaGlkZVwiXSxmdW5jdGlvbihlLHQpe3ZhciBuPXcuZm5bdF07dy5mblt0XT1mdW5jdGlvbihlLHIsaSl7cmV0dXJuIG51bGw9PWV8fFwiYm9vbGVhblwiPT10eXBlb2YgZT9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUodXQodCwhMCksZSxyLGkpfX0pLHcuZWFjaCh7c2xpZGVEb3duOnV0KFwic2hvd1wiKSxzbGlkZVVwOnV0KFwiaGlkZVwiKSxzbGlkZVRvZ2dsZTp1dChcInRvZ2dsZVwiKSxmYWRlSW46e29wYWNpdHk6XCJzaG93XCJ9LGZhZGVPdXQ6e29wYWNpdHk6XCJoaWRlXCJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6XCJ0b2dnbGVcIn19LGZ1bmN0aW9uKGUsdCl7dy5mbltlXT1mdW5jdGlvbihlLG4scil7cmV0dXJuIHRoaXMuYW5pbWF0ZSh0LGUsbixyKX19KSx3LnRpbWVycz1bXSx3LmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0PTAsbj13LnRpbWVycztmb3IobnQ9RGF0ZS5ub3coKTt0PG4ubGVuZ3RoO3QrKykoZT1uW3RdKSgpfHxuW3RdIT09ZXx8bi5zcGxpY2UodC0tLDEpO24ubGVuZ3RofHx3LmZ4LnN0b3AoKSxudD12b2lkIDB9LHcuZngudGltZXI9ZnVuY3Rpb24oZSl7dy50aW1lcnMucHVzaChlKSx3LmZ4LnN0YXJ0KCl9LHcuZnguaW50ZXJ2YWw9MTMsdy5meC5zdGFydD1mdW5jdGlvbigpe3J0fHwocnQ9ITAsYXQoKSl9LHcuZnguc3RvcD1mdW5jdGlvbigpe3J0PW51bGx9LHcuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHcuZm4uZGVsYXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdD13LmZ4P3cuZnguc3BlZWRzW3RdfHx0OnQsbj1ufHxcImZ4XCIsdGhpcy5xdWV1ZShuLGZ1bmN0aW9uKG4scil7dmFyIGk9ZS5zZXRUaW1lb3V0KG4sdCk7ci5zdG9wPWZ1bmN0aW9uKCl7ZS5jbGVhclRpbWVvdXQoaSl9fSl9LGZ1bmN0aW9uKCl7dmFyIGU9ci5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiksdD1yLmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIikuYXBwZW5kQ2hpbGQoci5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpKTtlLnR5cGU9XCJjaGVja2JveFwiLGguY2hlY2tPbj1cIlwiIT09ZS52YWx1ZSxoLm9wdFNlbGVjdGVkPXQuc2VsZWN0ZWQsKGU9ci5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIikpLnZhbHVlPVwidFwiLGUudHlwZT1cInJhZGlvXCIsaC5yYWRpb1ZhbHVlPVwidFwiPT09ZS52YWx1ZX0oKTt2YXIgZHQsaHQ9dy5leHByLmF0dHJIYW5kbGU7dy5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geih0aGlzLHcuYXR0cixlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dy5yZW1vdmVBdHRyKHRoaXMsZSl9KX19KSx3LmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm5cInVuZGVmaW5lZFwiPT10eXBlb2YgZS5nZXRBdHRyaWJ1dGU/dy5wcm9wKGUsdCxuKTooMT09PW8mJncuaXNYTUxEb2MoZSl8fChpPXcuYXR0ckhvb2tzW3QudG9Mb3dlckNhc2UoKV18fCh3LmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP2R0OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCB3LnJlbW92ZUF0dHIoZSx0KTppJiZcInNldFwiaW4gaSYmdm9pZCAwIT09KHI9aS5zZXQoZSxuLHQpKT9yOihlLnNldEF0dHJpYnV0ZSh0LG4rXCJcIiksbik6aSYmXCJnZXRcImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOm51bGw9PShyPXcuZmluZC5hdHRyKGUsdCkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZighaC5yYWRpb1ZhbHVlJiZcInJhZGlvXCI9PT10JiZOKGUsXCJpbnB1dFwiKSl7dmFyIG49ZS52YWx1ZTtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsdCksbiYmKGUudmFsdWU9biksdH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXQmJnQubWF0Y2goTSk7aWYoaSYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1pW3IrK10pZS5yZW1vdmVBdHRyaWJ1dGUobil9fSksZHQ9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuITE9PT10P3cucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LHcuZWFjaCh3LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1xcdysvZyksZnVuY3Rpb24oZSx0KXt2YXIgbj1odFt0XXx8dy5maW5kLmF0dHI7aHRbdF09ZnVuY3Rpb24oZSx0LHIpe3ZhciBpLG8sYT10LnRvTG93ZXJDYXNlKCk7cmV0dXJuIHJ8fChvPWh0W2FdLGh0W2FdPWksaT1udWxsIT1uKGUsdCxyKT9hOm51bGwsaHRbYV09byksaX19KTt2YXIgZ3Q9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSx5dD0vXig/OmF8YXJlYSkkL2k7dy5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geih0aGlzLHcucHJvcCxlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdy5wcm9wRml4W2VdfHxlXX0pfX0pLHcuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiAxPT09byYmdy5pc1hNTERvYyhlKXx8KHQ9dy5wcm9wRml4W3RdfHx0LGk9dy5wcm9wSG9va3NbdF0pLHZvaWQgMCE9PW4/aSYmXCJzZXRcImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjplW3RdPW46aSYmXCJnZXRcImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOmVbdF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgdD13LmZpbmQuYXR0cihlLFwidGFiaW5kZXhcIik7cmV0dXJuIHQ/cGFyc2VJbnQodCwxMCk6Z3QudGVzdChlLm5vZGVOYW1lKXx8eXQudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6LTF9fX0scHJvcEZpeDp7XCJmb3JcIjpcImh0bWxGb3JcIixcImNsYXNzXCI6XCJjbGFzc05hbWVcIn19KSxoLm9wdFNlbGVjdGVkfHwody5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTt0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLHcuZWFjaChbXCJ0YWJJbmRleFwiLFwicmVhZE9ubHlcIixcIm1heExlbmd0aFwiLFwiY2VsbFNwYWNpbmdcIixcImNlbGxQYWRkaW5nXCIsXCJyb3dTcGFuXCIsXCJjb2xTcGFuXCIsXCJ1c2VNYXBcIixcImZyYW1lQm9yZGVyXCIsXCJjb250ZW50RWRpdGFibGVcIl0sZnVuY3Rpb24oKXt3LnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSk7ZnVuY3Rpb24gdnQoZSl7cmV0dXJuKGUubWF0Y2goTSl8fFtdKS5qb2luKFwiIFwiKX1mdW5jdGlvbiBtdChlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIil8fFwiXCJ9ZnVuY3Rpb24geHQoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZTpcInN0cmluZ1wiPT10eXBlb2YgZT9lLm1hdGNoKE0pfHxbXTpbXX13LmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHMsdT0wO2lmKGcoZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt3KHRoaXMpLmFkZENsYXNzKGUuY2FsbCh0aGlzLHQsbXQodGhpcykpKX0pO2lmKCh0PXh0KGUpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT1tdChuKSxyPTE9PT1uLm5vZGVUeXBlJiZcIiBcIit2dChpKStcIiBcIil7YT0wO3doaWxlKG89dFthKytdKXIuaW5kZXhPZihcIiBcIitvK1wiIFwiKTwwJiYocis9bytcIiBcIik7aSE9PShzPXZ0KHIpKSYmbi5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLHMpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyx1PTA7aWYoZyhlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3codGhpcykucmVtb3ZlQ2xhc3MoZS5jYWxsKHRoaXMsdCxtdCh0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cihcImNsYXNzXCIsXCJcIik7aWYoKHQ9eHQoZSkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPW10KG4pLHI9MT09PW4ubm9kZVR5cGUmJlwiIFwiK3Z0KGkpK1wiIFwiKXthPTA7d2hpbGUobz10W2ErK10pd2hpbGUoci5pbmRleE9mKFwiIFwiK28rXCIgXCIpPi0xKXI9ci5yZXBsYWNlKFwiIFwiK28rXCIgXCIsXCIgXCIpO2khPT0ocz12dChyKSkmJm4uc2V0QXR0cmlidXRlKFwiY2xhc3NcIixzKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZSxyPVwic3RyaW5nXCI9PT1ufHxBcnJheS5pc0FycmF5KGUpO3JldHVyblwiYm9vbGVhblwiPT10eXBlb2YgdCYmcj90P3RoaXMuYWRkQ2xhc3MoZSk6dGhpcy5yZW1vdmVDbGFzcyhlKTpnKGUpP3RoaXMuZWFjaChmdW5jdGlvbihuKXt3KHRoaXMpLnRvZ2dsZUNsYXNzKGUuY2FsbCh0aGlzLG4sbXQodGhpcyksdCksdCl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdCxpLG8sYTtpZihyKXtpPTAsbz13KHRoaXMpLGE9eHQoZSk7d2hpbGUodD1hW2krK10pby5oYXNDbGFzcyh0KT9vLnJlbW92ZUNsYXNzKHQpOm8uYWRkQ2xhc3ModCl9ZWxzZSB2b2lkIDAhPT1lJiZcImJvb2xlYW5cIiE9PW58fCgodD1tdCh0aGlzKSkmJkouc2V0KHRoaXMsXCJfX2NsYXNzTmFtZV9fXCIsdCksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKFwiY2xhc3NcIix0fHwhMT09PWU/XCJcIjpKLmdldCh0aGlzLFwiX19jbGFzc05hbWVfX1wiKXx8XCJcIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wO3Q9XCIgXCIrZStcIiBcIjt3aGlsZShuPXRoaXNbcisrXSlpZigxPT09bi5ub2RlVHlwZSYmKFwiIFwiK3Z0KG10KG4pKStcIiBcIikuaW5kZXhPZih0KT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgYnQ9L1xcci9nO3cuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gcj1nKGUpLHRoaXMuZWFjaChmdW5jdGlvbihuKXt2YXIgaTsxPT09dGhpcy5ub2RlVHlwZSYmKG51bGw9PShpPXI/ZS5jYWxsKHRoaXMsbix3KHRoaXMpLnZhbCgpKTplKT9pPVwiXCI6XCJudW1iZXJcIj09dHlwZW9mIGk/aSs9XCJcIjpBcnJheS5pc0FycmF5KGkpJiYoaT13Lm1hcChpLGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP1wiXCI6ZStcIlwifSkpLCh0PXcudmFsSG9va3NbdGhpcy50eXBlXXx8dy52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmXCJzZXRcImluIHQmJnZvaWQgMCE9PXQuc2V0KHRoaXMsaSxcInZhbHVlXCIpfHwodGhpcy52YWx1ZT1pKSl9KTtpZihpKXJldHVybih0PXcudmFsSG9va3NbaS50eXBlXXx8dy52YWxIb29rc1tpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmXCJnZXRcImluIHQmJnZvaWQgMCE9PShuPXQuZ2V0KGksXCJ2YWx1ZVwiKSk/bjpcInN0cmluZ1wiPT10eXBlb2Yobj1pLnZhbHVlKT9uLnJlcGxhY2UoYnQsXCJcIik6bnVsbD09bj9cIlwiOm59fX0pLHcuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5maW5kLmF0dHIoZSxcInZhbHVlXCIpO3JldHVybiBudWxsIT10P3Q6dnQody50ZXh0KGUpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPWUub3B0aW9ucyxvPWUuc2VsZWN0ZWRJbmRleCxhPVwic2VsZWN0LW9uZVwiPT09ZS50eXBlLHM9YT9udWxsOltdLHU9YT9vKzE6aS5sZW5ndGg7Zm9yKHI9bzwwP3U6YT9vOjA7cjx1O3IrKylpZigoKG49aVtyXSkuc2VsZWN0ZWR8fHI9PT1vKSYmIW4uZGlzYWJsZWQmJighbi5wYXJlbnROb2RlLmRpc2FibGVkfHwhTihuLnBhcmVudE5vZGUsXCJvcHRncm91cFwiKSkpe2lmKHQ9dyhuKS52YWwoKSxhKXJldHVybiB0O3MucHVzaCh0KX1yZXR1cm4gc30sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWUub3B0aW9ucyxvPXcubWFrZUFycmF5KHQpLGE9aS5sZW5ndGg7d2hpbGUoYS0tKSgocj1pW2FdKS5zZWxlY3RlZD13LmluQXJyYXkody52YWxIb29rcy5vcHRpb24uZ2V0KHIpLG8pPi0xKSYmKG49ITApO3JldHVybiBufHwoZS5zZWxlY3RlZEluZGV4PS0xKSxvfX19fSksdy5lYWNoKFtcInJhZGlvXCIsXCJjaGVja2JveFwiXSxmdW5jdGlvbigpe3cudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIGUuY2hlY2tlZD13LmluQXJyYXkodyhlKS52YWwoKSx0KT4tMX19LGguY2hlY2tPbnx8KHcudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKT9cIm9uXCI6ZS52YWx1ZX0pfSksaC5mb2N1c2luPVwib25mb2N1c2luXCJpbiBlO3ZhciB3dD0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sVHQ9ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKX07dy5leHRlbmQody5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbih0LG4saSxvKXt2YXIgYSxzLHUsbCxjLHAsZCxoLHY9W2l8fHJdLG09Zi5jYWxsKHQsXCJ0eXBlXCIpP3QudHlwZTp0LHg9Zi5jYWxsKHQsXCJuYW1lc3BhY2VcIik/dC5uYW1lc3BhY2Uuc3BsaXQoXCIuXCIpOltdO2lmKHM9aD11PWk9aXx8ciwzIT09aS5ub2RlVHlwZSYmOCE9PWkubm9kZVR5cGUmJiF3dC50ZXN0KG0rdy5ldmVudC50cmlnZ2VyZWQpJiYobS5pbmRleE9mKFwiLlwiKT4tMSYmKG09KHg9bS5zcGxpdChcIi5cIikpLnNoaWZ0KCkseC5zb3J0KCkpLGM9bS5pbmRleE9mKFwiOlwiKTwwJiZcIm9uXCIrbSx0PXRbdy5leHBhbmRvXT90Om5ldyB3LkV2ZW50KG0sXCJvYmplY3RcIj09dHlwZW9mIHQmJnQpLHQuaXNUcmlnZ2VyPW8/MjozLHQubmFtZXNwYWNlPXguam9pbihcIi5cIiksdC5ybmFtZXNwYWNlPXQubmFtZXNwYWNlP25ldyBSZWdFeHAoXCIoXnxcXFxcLilcIit4LmpvaW4oXCJcXFxcLig/Oi4qXFxcXC58KVwiKStcIihcXFxcLnwkKVwiKTpudWxsLHQucmVzdWx0PXZvaWQgMCx0LnRhcmdldHx8KHQudGFyZ2V0PWkpLG49bnVsbD09bj9bdF06dy5tYWtlQXJyYXkobixbdF0pLGQ9dy5ldmVudC5zcGVjaWFsW21dfHx7fSxvfHwhZC50cmlnZ2VyfHwhMSE9PWQudHJpZ2dlci5hcHBseShpLG4pKSl7aWYoIW8mJiFkLm5vQnViYmxlJiYheShpKSl7Zm9yKGw9ZC5kZWxlZ2F0ZVR5cGV8fG0sd3QudGVzdChsK20pfHwocz1zLnBhcmVudE5vZGUpO3M7cz1zLnBhcmVudE5vZGUpdi5wdXNoKHMpLHU9czt1PT09KGkub3duZXJEb2N1bWVudHx8cikmJnYucHVzaCh1LmRlZmF1bHRWaWV3fHx1LnBhcmVudFdpbmRvd3x8ZSl9YT0wO3doaWxlKChzPXZbYSsrXSkmJiF0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpaD1zLHQudHlwZT1hPjE/bDpkLmJpbmRUeXBlfHxtLChwPShKLmdldChzLFwiZXZlbnRzXCIpfHx7fSlbdC50eXBlXSYmSi5nZXQocyxcImhhbmRsZVwiKSkmJnAuYXBwbHkocyxuKSwocD1jJiZzW2NdKSYmcC5hcHBseSYmWShzKSYmKHQucmVzdWx0PXAuYXBwbHkocyxuKSwhMT09PXQucmVzdWx0JiZ0LnByZXZlbnREZWZhdWx0KCkpO3JldHVybiB0LnR5cGU9bSxvfHx0LmlzRGVmYXVsdFByZXZlbnRlZCgpfHxkLl9kZWZhdWx0JiYhMSE9PWQuX2RlZmF1bHQuYXBwbHkodi5wb3AoKSxuKXx8IVkoaSl8fGMmJmcoaVttXSkmJiF5KGkpJiYoKHU9aVtjXSkmJihpW2NdPW51bGwpLHcuZXZlbnQudHJpZ2dlcmVkPW0sdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZoLmFkZEV2ZW50TGlzdGVuZXIobSxUdCksaVttXSgpLHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5yZW1vdmVFdmVudExpc3RlbmVyKG0sVHQpLHcuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCx1JiYoaVtjXT11KSksdC5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9dy5leHRlbmQobmV3IHcuRXZlbnQsbix7dHlwZTplLGlzU2ltdWxhdGVkOiEwfSk7dy5ldmVudC50cmlnZ2VyKHIsbnVsbCx0KX19KSx3LmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt3LmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpc1swXTtpZihuKXJldHVybiB3LmV2ZW50LnRyaWdnZXIoZSx0LG4sITApfX0pLGguZm9jdXNpbnx8dy5lYWNoKHtmb2N1czpcImZvY3VzaW5cIixibHVyOlwiZm9jdXNvdXRcIn0sZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbihlKXt3LmV2ZW50LnNpbXVsYXRlKHQsZS50YXJnZXQsdy5ldmVudC5maXgoZSkpfTt3LmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGk9Si5hY2Nlc3Mocix0KTtpfHxyLmFkZEV2ZW50TGlzdGVuZXIoZSxuLCEwKSxKLmFjY2VzcyhyLHQsKGl8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxpPUouYWNjZXNzKHIsdCktMTtpP0ouYWNjZXNzKHIsdCxpKTooci5yZW1vdmVFdmVudExpc3RlbmVyKGUsbiwhMCksSi5yZW1vdmUocix0KSl9fX0pO3ZhciBDdD1lLmxvY2F0aW9uLEV0PURhdGUubm93KCksa3Q9L1xcPy87dy5wYXJzZVhNTD1mdW5jdGlvbih0KXt2YXIgbjtpZighdHx8XCJzdHJpbmdcIiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dHJ5e249KG5ldyBlLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsXCJ0ZXh0L3htbFwiKX1jYXRjaChlKXtuPXZvaWQgMH1yZXR1cm4gbiYmIW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJwYXJzZXJlcnJvclwiKS5sZW5ndGh8fHcuZXJyb3IoXCJJbnZhbGlkIFhNTDogXCIrdCksbn07dmFyIFN0PS9cXFtcXF0kLyxEdD0vXFxyP1xcbi9nLE50PS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxBdD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24ganQoZSx0LG4scil7dmFyIGk7aWYoQXJyYXkuaXNBcnJheSh0KSl3LmVhY2godCxmdW5jdGlvbih0LGkpe258fFN0LnRlc3QoZSk/cihlLGkpOmp0KGUrXCJbXCIrKFwib2JqZWN0XCI9PXR5cGVvZiBpJiZudWxsIT1pP3Q6XCJcIikrXCJdXCIsaSxuLHIpfSk7ZWxzZSBpZihufHxcIm9iamVjdFwiIT09eCh0KSlyKGUsdCk7ZWxzZSBmb3IoaSBpbiB0KWp0KGUrXCJbXCIraStcIl1cIix0W2ldLG4scil9dy5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3ZhciBuPWcodCk/dCgpOnQ7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpK1wiPVwiK2VuY29kZVVSSUNvbXBvbmVudChudWxsPT1uP1wiXCI6bil9O2lmKEFycmF5LmlzQXJyYXkoZSl8fGUuanF1ZXJ5JiYhdy5pc1BsYWluT2JqZWN0KGUpKXcuZWFjaChlLGZ1bmN0aW9uKCl7aSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIGUpanQobixlW25dLHQsaSk7cmV0dXJuIHIuam9pbihcIiZcIil9LHcuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXcucHJvcCh0aGlzLFwiZWxlbWVudHNcIik7cmV0dXJuIGU/dy5tYWtlQXJyYXkoZSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhdyh0aGlzKS5pcyhcIjpkaXNhYmxlZFwiKSYmQXQudGVzdCh0aGlzLm5vZGVOYW1lKSYmIU50LnRlc3QoZSkmJih0aGlzLmNoZWNrZWR8fCFwZS50ZXN0KGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPXcodGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDpBcnJheS5pc0FycmF5KG4pP3cubWFwKG4sZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6dC5uYW1lLHZhbHVlOmUucmVwbGFjZShEdCxcIlxcclxcblwiKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKER0LFwiXFxyXFxuXCIpfX0pLmdldCgpfX0pO3ZhciBxdD0vJTIwL2csTHQ9LyMuKiQvLEh0PS8oWz8mXSlfPVteJl0qLyxPdD0vXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL2dtLFB0PS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLE10PS9eKD86R0VUfEhFQUQpJC8sUnQ9L15cXC9cXC8vLEl0PXt9LFd0PXt9LCR0PVwiKi9cIi5jb25jYXQoXCIqXCIpLEJ0PXIuY3JlYXRlRWxlbWVudChcImFcIik7QnQuaHJlZj1DdC5ocmVmO2Z1bmN0aW9uIEZ0KGUpe3JldHVybiBmdW5jdGlvbih0LG4pe1wic3RyaW5nXCIhPXR5cGVvZiB0JiYobj10LHQ9XCIqXCIpO3ZhciByLGk9MCxvPXQudG9Mb3dlckNhc2UoKS5tYXRjaChNKXx8W107aWYoZyhuKSl3aGlsZShyPW9baSsrXSlcIitcIj09PXJbMF0/KHI9ci5zbGljZSgxKXx8XCIqXCIsKGVbcl09ZVtyXXx8W10pLnVuc2hpZnQobikpOihlW3JdPWVbcl18fFtdKS5wdXNoKG4pfX1mdW5jdGlvbiBfdChlLHQsbixyKXt2YXIgaT17fSxvPWU9PT1XdDtmdW5jdGlvbiBhKHMpe3ZhciB1O3JldHVybiBpW3NdPSEwLHcuZWFjaChlW3NdfHxbXSxmdW5jdGlvbihlLHMpe3ZhciBsPXModCxuLHIpO3JldHVyblwic3RyaW5nXCIhPXR5cGVvZiBsfHxvfHxpW2xdP28/ISh1PWwpOnZvaWQgMDoodC5kYXRhVHlwZXMudW5zaGlmdChsKSxhKGwpLCExKX0pLHV9cmV0dXJuIGEodC5kYXRhVHlwZXNbMF0pfHwhaVtcIipcIl0mJmEoXCIqXCIpfWZ1bmN0aW9uIHp0KGUsdCl7dmFyIG4scixpPXcuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXZvaWQgMCE9PXRbbl0mJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJncuZXh0ZW5kKCEwLGUsciksZX1mdW5jdGlvbiBYdChlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNvbnRlbnRzLHU9ZS5kYXRhVHlwZXM7d2hpbGUoXCIqXCI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1UeXBlXCIpKTtpZihyKWZvcihpIGluIHMpaWYoc1tpXSYmc1tpXS50ZXN0KHIpKXt1LnVuc2hpZnQoaSk7YnJlYWt9aWYodVswXWluIG4pbz11WzBdO2Vsc2V7Zm9yKGkgaW4gbil7aWYoIXVbMF18fGUuY29udmVydGVyc1tpK1wiIFwiK3VbMF1dKXtvPWk7YnJlYWt9YXx8KGE9aSl9bz1vfHxhfWlmKG8pcmV0dXJuIG8hPT11WzBdJiZ1LnVuc2hpZnQobyksbltvXX1mdW5jdGlvbiBVdChlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKWxbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07bz1jLnNoaWZ0KCk7d2hpbGUobylpZihlLnJlc3BvbnNlRmllbGRzW29dJiYobltlLnJlc3BvbnNlRmllbGRzW29dXT10KSwhdSYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksdT1vLG89Yy5zaGlmdCgpKWlmKFwiKlwiPT09bylvPXU7ZWxzZSBpZihcIipcIiE9PXUmJnUhPT1vKXtpZighKGE9bFt1K1wiIFwiK29dfHxsW1wiKiBcIitvXSkpZm9yKGkgaW4gbClpZigocz1pLnNwbGl0KFwiIFwiKSlbMV09PT1vJiYoYT1sW3UrXCIgXCIrc1swXV18fGxbXCIqIFwiK3NbMF1dKSl7ITA9PT1hP2E9bFtpXTohMCE9PWxbaV0mJihvPXNbMF0sYy51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmZVtcInRocm93c1wiXSl0PWEodCk7ZWxzZSB0cnl7dD1hKHQpfWNhdGNoKGUpe3JldHVybntzdGF0ZTpcInBhcnNlcmVycm9yXCIsZXJyb3I6YT9lOlwiTm8gY29udmVyc2lvbiBmcm9tIFwiK3UrXCIgdG8gXCIrb319fXJldHVybntzdGF0ZTpcInN1Y2Nlc3NcIixkYXRhOnR9fXcuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpDdC5ocmVmLHR5cGU6XCJHRVRcIixpc0xvY2FsOlB0LnRlc3QoQ3QucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZTpcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiLGFjY2VwdHM6e1wiKlwiOiR0LHRleHQ6XCJ0ZXh0L3BsYWluXCIsaHRtbDpcInRleHQvaHRtbFwiLHhtbDpcImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWxcIixqc29uOlwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0XCJ9LGNvbnRlbnRzOnt4bWw6L1xcYnhtbFxcYi8saHRtbDovXFxiaHRtbC8sanNvbjovXFxianNvblxcYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6XCJyZXNwb25zZVhNTFwiLHRleHQ6XCJyZXNwb25zZVRleHRcIixqc29uOlwicmVzcG9uc2VKU09OXCJ9LGNvbnZlcnRlcnM6e1wiKiB0ZXh0XCI6U3RyaW5nLFwidGV4dCBodG1sXCI6ITAsXCJ0ZXh0IGpzb25cIjpKU09OLnBhcnNlLFwidGV4dCB4bWxcIjp3LnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD96dCh6dChlLHcuYWpheFNldHRpbmdzKSx0KTp6dCh3LmFqYXhTZXR0aW5ncyxlKX0sYWpheFByZWZpbHRlcjpGdChJdCksYWpheFRyYW5zcG9ydDpGdChXdCksYWpheDpmdW5jdGlvbih0LG4pe1wib2JqZWN0XCI9PXR5cGVvZiB0JiYobj10LHQ9dm9pZCAwKSxuPW58fHt9O3ZhciBpLG8sYSxzLHUsbCxjLGYscCxkLGg9dy5hamF4U2V0dXAoe30sbiksZz1oLmNvbnRleHR8fGgseT1oLmNvbnRleHQmJihnLm5vZGVUeXBlfHxnLmpxdWVyeSk/dyhnKTp3LmV2ZW50LHY9dy5EZWZlcnJlZCgpLG09dy5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSx4PWguc3RhdHVzQ29kZXx8e30sYj17fSxUPXt9LEM9XCJjYW5jZWxlZFwiLEU9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihlKXt2YXIgdDtpZihjKXtpZighcyl7cz17fTt3aGlsZSh0PU90LmV4ZWMoYSkpc1t0WzFdLnRvTG93ZXJDYXNlKCldPXRbMl19dD1zW2UudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PXQ/bnVsbDp0fSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gYz9hOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09YyYmKGU9VFtlLnRvTG93ZXJDYXNlKCldPVRbZS50b0xvd2VyQ2FzZSgpXXx8ZSxiW2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWMmJihoLm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZihjKUUuYWx3YXlzKGVbRS5zdGF0dXNdKTtlbHNlIGZvcih0IGluIGUpeFt0XT1beFt0XSxlW3RdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8QztyZXR1cm4gaSYmaS5hYm9ydCh0KSxrKDAsdCksdGhpc319O2lmKHYucHJvbWlzZShFKSxoLnVybD0oKHR8fGgudXJsfHxDdC5ocmVmKStcIlwiKS5yZXBsYWNlKFJ0LEN0LnByb3RvY29sK1wiLy9cIiksaC50eXBlPW4ubWV0aG9kfHxuLnR5cGV8fGgubWV0aG9kfHxoLnR5cGUsaC5kYXRhVHlwZXM9KGguZGF0YVR5cGV8fFwiKlwiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKE0pfHxbXCJcIl0sbnVsbD09aC5jcm9zc0RvbWFpbil7bD1yLmNyZWF0ZUVsZW1lbnQoXCJhXCIpO3RyeXtsLmhyZWY9aC51cmwsbC5ocmVmPWwuaHJlZixoLmNyb3NzRG9tYWluPUJ0LnByb3RvY29sK1wiLy9cIitCdC5ob3N0IT1sLnByb3RvY29sK1wiLy9cIitsLmhvc3R9Y2F0Y2goZSl7aC5jcm9zc0RvbWFpbj0hMH19aWYoaC5kYXRhJiZoLnByb2Nlc3NEYXRhJiZcInN0cmluZ1wiIT10eXBlb2YgaC5kYXRhJiYoaC5kYXRhPXcucGFyYW0oaC5kYXRhLGgudHJhZGl0aW9uYWwpKSxfdChJdCxoLG4sRSksYylyZXR1cm4gRTsoZj13LmV2ZW50JiZoLmdsb2JhbCkmJjA9PXcuYWN0aXZlKysmJncuZXZlbnQudHJpZ2dlcihcImFqYXhTdGFydFwiKSxoLnR5cGU9aC50eXBlLnRvVXBwZXJDYXNlKCksaC5oYXNDb250ZW50PSFNdC50ZXN0KGgudHlwZSksbz1oLnVybC5yZXBsYWNlKEx0LFwiXCIpLGguaGFzQ29udGVudD9oLmRhdGEmJmgucHJvY2Vzc0RhdGEmJjA9PT0oaC5jb250ZW50VHlwZXx8XCJcIikuaW5kZXhPZihcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKSYmKGguZGF0YT1oLmRhdGEucmVwbGFjZShxdCxcIitcIikpOihkPWgudXJsLnNsaWNlKG8ubGVuZ3RoKSxoLmRhdGEmJihoLnByb2Nlc3NEYXRhfHxcInN0cmluZ1wiPT10eXBlb2YgaC5kYXRhKSYmKG8rPShrdC50ZXN0KG8pP1wiJlwiOlwiP1wiKStoLmRhdGEsZGVsZXRlIGguZGF0YSksITE9PT1oLmNhY2hlJiYobz1vLnJlcGxhY2UoSHQsXCIkMVwiKSxkPShrdC50ZXN0KG8pP1wiJlwiOlwiP1wiKStcIl89XCIrRXQrKytkKSxoLnVybD1vK2QpLGguaWZNb2RpZmllZCYmKHcubGFzdE1vZGlmaWVkW29dJiZFLnNldFJlcXVlc3RIZWFkZXIoXCJJZi1Nb2RpZmllZC1TaW5jZVwiLHcubGFzdE1vZGlmaWVkW29dKSx3LmV0YWdbb10mJkUuc2V0UmVxdWVzdEhlYWRlcihcIklmLU5vbmUtTWF0Y2hcIix3LmV0YWdbb10pKSwoaC5kYXRhJiZoLmhhc0NvbnRlbnQmJiExIT09aC5jb250ZW50VHlwZXx8bi5jb250ZW50VHlwZSkmJkUuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLGguY29udGVudFR5cGUpLEUuc2V0UmVxdWVzdEhlYWRlcihcIkFjY2VwdFwiLGguZGF0YVR5cGVzWzBdJiZoLmFjY2VwdHNbaC5kYXRhVHlwZXNbMF1dP2guYWNjZXB0c1toLmRhdGFUeXBlc1swXV0rKFwiKlwiIT09aC5kYXRhVHlwZXNbMF0/XCIsIFwiKyR0K1wiOyBxPTAuMDFcIjpcIlwiKTpoLmFjY2VwdHNbXCIqXCJdKTtmb3IocCBpbiBoLmhlYWRlcnMpRS5zZXRSZXF1ZXN0SGVhZGVyKHAsaC5oZWFkZXJzW3BdKTtpZihoLmJlZm9yZVNlbmQmJighMT09PWguYmVmb3JlU2VuZC5jYWxsKGcsRSxoKXx8YykpcmV0dXJuIEUuYWJvcnQoKTtpZihDPVwiYWJvcnRcIixtLmFkZChoLmNvbXBsZXRlKSxFLmRvbmUoaC5zdWNjZXNzKSxFLmZhaWwoaC5lcnJvciksaT1fdChXdCxoLG4sRSkpe2lmKEUucmVhZHlTdGF0ZT0xLGYmJnkudHJpZ2dlcihcImFqYXhTZW5kXCIsW0UsaF0pLGMpcmV0dXJuIEU7aC5hc3luYyYmaC50aW1lb3V0PjAmJih1PWUuc2V0VGltZW91dChmdW5jdGlvbigpe0UuYWJvcnQoXCJ0aW1lb3V0XCIpfSxoLnRpbWVvdXQpKTt0cnl7Yz0hMSxpLnNlbmQoYixrKX1jYXRjaChlKXtpZihjKXRocm93IGU7aygtMSxlKX19ZWxzZSBrKC0xLFwiTm8gVHJhbnNwb3J0XCIpO2Z1bmN0aW9uIGsodCxuLHIscyl7dmFyIGwscCxkLGIsVCxDPW47Y3x8KGM9ITAsdSYmZS5jbGVhclRpbWVvdXQodSksaT12b2lkIDAsYT1zfHxcIlwiLEUucmVhZHlTdGF0ZT10PjA/NDowLGw9dD49MjAwJiZ0PDMwMHx8MzA0PT09dCxyJiYoYj1YdChoLEUscikpLGI9VXQoaCxiLEUsbCksbD8oaC5pZk1vZGlmaWVkJiYoKFQ9RS5nZXRSZXNwb25zZUhlYWRlcihcIkxhc3QtTW9kaWZpZWRcIikpJiYody5sYXN0TW9kaWZpZWRbb109VCksKFQ9RS5nZXRSZXNwb25zZUhlYWRlcihcImV0YWdcIikpJiYody5ldGFnW29dPVQpKSwyMDQ9PT10fHxcIkhFQURcIj09PWgudHlwZT9DPVwibm9jb250ZW50XCI6MzA0PT09dD9DPVwibm90bW9kaWZpZWRcIjooQz1iLnN0YXRlLHA9Yi5kYXRhLGw9IShkPWIuZXJyb3IpKSk6KGQ9QywhdCYmQ3x8KEM9XCJlcnJvclwiLHQ8MCYmKHQ9MCkpKSxFLnN0YXR1cz10LEUuc3RhdHVzVGV4dD0obnx8QykrXCJcIixsP3YucmVzb2x2ZVdpdGgoZyxbcCxDLEVdKTp2LnJlamVjdFdpdGgoZyxbRSxDLGRdKSxFLnN0YXR1c0NvZGUoeCkseD12b2lkIDAsZiYmeS50cmlnZ2VyKGw/XCJhamF4U3VjY2Vzc1wiOlwiYWpheEVycm9yXCIsW0UsaCxsP3A6ZF0pLG0uZmlyZVdpdGgoZyxbRSxDXSksZiYmKHkudHJpZ2dlcihcImFqYXhDb21wbGV0ZVwiLFtFLGhdKSwtLXcuYWN0aXZlfHx3LmV2ZW50LnRyaWdnZXIoXCJhamF4U3RvcFwiKSkpfXJldHVybiBFfSxnZXRKU09OOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdy5nZXQoZSx0LG4sXCJqc29uXCIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdy5nZXQoZSx2b2lkIDAsdCxcInNjcmlwdFwiKX19KSx3LmVhY2goW1wiZ2V0XCIsXCJwb3N0XCJdLGZ1bmN0aW9uKGUsdCl7d1t0XT1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4gZyhuKSYmKGk9aXx8cixyPW4sbj12b2lkIDApLHcuYWpheCh3LmV4dGVuZCh7dXJsOmUsdHlwZTp0LGRhdGFUeXBlOmksZGF0YTpuLHN1Y2Nlc3M6cn0sdy5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSksdy5fZXZhbFVybD1mdW5jdGlvbihlKXtyZXR1cm4gdy5hamF4KHt1cmw6ZSx0eXBlOlwiR0VUXCIsZGF0YVR5cGU6XCJzY3JpcHRcIixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsXCJ0aHJvd3NcIjohMH0pfSx3LmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpc1swXSYmKGcoZSkmJihlPWUuY2FsbCh0aGlzWzBdKSksdD13KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihlKXtyZXR1cm4gZyhlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7dyh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dyh0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD1nKGUpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7dyh0aGlzKS53cmFwQWxsKHQ/ZS5jYWxsKHRoaXMsbik6ZSl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoXCJib2R5XCIpLmVhY2goZnVuY3Rpb24oKXt3KHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLHcuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4hdy5leHByLnBzZXVkb3MudmlzaWJsZShlKX0sdy5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlLm9mZnNldFdpZHRofHxlLm9mZnNldEhlaWdodHx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LHcuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IGUuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goZSl7fX07dmFyIFZ0PXswOjIwMCwxMjIzOjIwNH0sR3Q9dy5hamF4U2V0dGluZ3MueGhyKCk7aC5jb3JzPSEhR3QmJlwid2l0aENyZWRlbnRpYWxzXCJpbiBHdCxoLmFqYXg9R3Q9ISFHdCx3LmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24odCl7dmFyIG4scjtpZihoLmNvcnN8fEd0JiYhdC5jcm9zc0RvbWFpbilyZXR1cm57c2VuZDpmdW5jdGlvbihpLG8pe3ZhciBhLHM9dC54aHIoKTtpZihzLm9wZW4odC50eXBlLHQudXJsLHQuYXN5bmMsdC51c2VybmFtZSx0LnBhc3N3b3JkKSx0LnhockZpZWxkcylmb3IoYSBpbiB0LnhockZpZWxkcylzW2FdPXQueGhyRmllbGRzW2FdO3QubWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlKHQubWltZVR5cGUpLHQuY3Jvc3NEb21haW58fGlbXCJYLVJlcXVlc3RlZC1XaXRoXCJdfHwoaVtcIlgtUmVxdWVzdGVkLVdpdGhcIl09XCJYTUxIdHRwUmVxdWVzdFwiKTtmb3IoYSBpbiBpKXMuc2V0UmVxdWVzdEhlYWRlcihhLGlbYV0pO249ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7biYmKG49cj1zLm9ubG9hZD1zLm9uZXJyb3I9cy5vbmFib3J0PXMub250aW1lb3V0PXMub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsXCJhYm9ydFwiPT09ZT9zLmFib3J0KCk6XCJlcnJvclwiPT09ZT9cIm51bWJlclwiIT10eXBlb2Ygcy5zdGF0dXM/bygwLFwiZXJyb3JcIik6byhzLnN0YXR1cyxzLnN0YXR1c1RleHQpOm8oVnRbcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsXCJ0ZXh0XCIhPT0ocy5yZXNwb25zZVR5cGV8fFwidGV4dFwiKXx8XCJzdHJpbmdcIiE9dHlwZW9mIHMucmVzcG9uc2VUZXh0P3tiaW5hcnk6cy5yZXNwb25zZX06e3RleHQ6cy5yZXNwb25zZVRleHR9LHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPW4oKSxyPXMub25lcnJvcj1zLm9udGltZW91dD1uKFwiZXJyb3JcIiksdm9pZCAwIT09cy5vbmFib3J0P3Mub25hYm9ydD1yOnMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PXMucmVhZHlTdGF0ZSYmZS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7biYmcigpfSl9LG49bihcImFib3J0XCIpO3RyeXtzLnNlbmQodC5oYXNDb250ZW50JiZ0LmRhdGF8fG51bGwpfWNhdGNoKGUpe2lmKG4pdGhyb3cgZX19LGFib3J0OmZ1bmN0aW9uKCl7biYmbigpfX19KSx3LmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7ZS5jcm9zc0RvbWFpbiYmKGUuY29udGVudHMuc2NyaXB0PSExKX0pLHcuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6XCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwifSxjb250ZW50czp7c2NyaXB0Oi9cXGIoPzpqYXZhfGVjbWEpc2NyaXB0XFxiL30sY29udmVydGVyczp7XCJ0ZXh0IHNjcmlwdFwiOmZ1bmN0aW9uKGUpe3JldHVybiB3Lmdsb2JhbEV2YWwoZSksZX19fSksdy5hamF4UHJlZmlsdGVyKFwic2NyaXB0XCIsZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS5jYWNoZSYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9XCJHRVRcIil9KSx3LmFqYXhUcmFuc3BvcnQoXCJzY3JpcHRcIixmdW5jdGlvbihlKXtpZihlLmNyb3NzRG9tYWluKXt2YXIgdCxuO3JldHVybntzZW5kOmZ1bmN0aW9uKGksbyl7dD13KFwiPHNjcmlwdD5cIikucHJvcCh7Y2hhcnNldDplLnNjcmlwdENoYXJzZXQsc3JjOmUudXJsfSkub24oXCJsb2FkIGVycm9yXCIsbj1mdW5jdGlvbihlKXt0LnJlbW92ZSgpLG49bnVsbCxlJiZvKFwiZXJyb3JcIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxyLmhlYWQuYXBwZW5kQ2hpbGQodFswXSl9LGFib3J0OmZ1bmN0aW9uKCl7biYmbigpfX19fSk7dmFyIFl0PVtdLFF0PS8oPSlcXD8oPz0mfCQpfFxcP1xcPy87dy5hamF4U2V0dXAoe2pzb25wOlwiY2FsbGJhY2tcIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9WXQucG9wKCl8fHcuZXhwYW5kbytcIl9cIitFdCsrO3JldHVybiB0aGlzW2VdPSEwLGV9fSksdy5hamF4UHJlZmlsdGVyKFwianNvbiBqc29ucFwiLGZ1bmN0aW9uKHQsbixyKXt2YXIgaSxvLGEscz0hMSE9PXQuanNvbnAmJihRdC50ZXN0KHQudXJsKT9cInVybFwiOlwic3RyaW5nXCI9PXR5cGVvZiB0LmRhdGEmJjA9PT0odC5jb250ZW50VHlwZXx8XCJcIikuaW5kZXhPZihcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKSYmUXQudGVzdCh0LmRhdGEpJiZcImRhdGFcIik7aWYoc3x8XCJqc29ucFwiPT09dC5kYXRhVHlwZXNbMF0pcmV0dXJuIGk9dC5qc29ucENhbGxiYWNrPWcodC5qc29ucENhbGxiYWNrKT90Lmpzb25wQ2FsbGJhY2soKTp0Lmpzb25wQ2FsbGJhY2sscz90W3NdPXRbc10ucmVwbGFjZShRdCxcIiQxXCIraSk6ITEhPT10Lmpzb25wJiYodC51cmwrPShrdC50ZXN0KHQudXJsKT9cIiZcIjpcIj9cIikrdC5qc29ucCtcIj1cIitpKSx0LmNvbnZlcnRlcnNbXCJzY3JpcHQganNvblwiXT1mdW5jdGlvbigpe3JldHVybiBhfHx3LmVycm9yKGkrXCIgd2FzIG5vdCBjYWxsZWRcIiksYVswXX0sdC5kYXRhVHlwZXNbMF09XCJqc29uXCIsbz1lW2ldLGVbaV09ZnVuY3Rpb24oKXthPWFyZ3VtZW50c30sci5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1vP3coZSkucmVtb3ZlUHJvcChpKTplW2ldPW8sdFtpXSYmKHQuanNvbnBDYWxsYmFjaz1uLmpzb25wQ2FsbGJhY2ssWXQucHVzaChpKSksYSYmZyhvKSYmbyhhWzBdKSxhPW89dm9pZCAwfSksXCJzY3JpcHRcIn0pLGguY3JlYXRlSFRNTERvY3VtZW50PWZ1bmN0aW9uKCl7dmFyIGU9ci5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoXCJcIikuYm9keTtyZXR1cm4gZS5pbm5lckhUTUw9XCI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPlwiLDI9PT1lLmNoaWxkTm9kZXMubGVuZ3RofSgpLHcucGFyc2VIVE1MPWZ1bmN0aW9uKGUsdCxuKXtpZihcInN0cmluZ1wiIT10eXBlb2YgZSlyZXR1cm5bXTtcImJvb2xlYW5cIj09dHlwZW9mIHQmJihuPXQsdD0hMSk7dmFyIGksbyxhO3JldHVybiB0fHwoaC5jcmVhdGVIVE1MRG9jdW1lbnQ/KChpPSh0PXIuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KFwiXCIpKS5jcmVhdGVFbGVtZW50KFwiYmFzZVwiKSkuaHJlZj1yLmxvY2F0aW9uLmhyZWYsdC5oZWFkLmFwcGVuZENoaWxkKGkpKTp0PXIpLG89QS5leGVjKGUpLGE9IW4mJltdLG8/W3QuY3JlYXRlRWxlbWVudChvWzFdKV06KG89eGUoW2VdLHQsYSksYSYmYS5sZW5ndGgmJncoYSkucmVtb3ZlKCksdy5tZXJnZShbXSxvLmNoaWxkTm9kZXMpKX0sdy5mbi5sb2FkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT10aGlzLHM9ZS5pbmRleE9mKFwiIFwiKTtyZXR1cm4gcz4tMSYmKHI9dnQoZS5zbGljZShzKSksZT1lLnNsaWNlKDAscykpLGcodCk/KG49dCx0PXZvaWQgMCk6dCYmXCJvYmplY3RcIj09dHlwZW9mIHQmJihpPVwiUE9TVFwiKSxhLmxlbmd0aD4wJiZ3LmFqYXgoe3VybDplLHR5cGU6aXx8XCJHRVRcIixkYXRhVHlwZTpcImh0bWxcIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP3coXCI8ZGl2PlwiKS5hcHBlbmQody5wYXJzZUhUTUwoZSkpLmZpbmQocik6ZSl9KS5hbHdheXMobiYmZnVuY3Rpb24oZSx0KXthLmVhY2goZnVuY3Rpb24oKXtuLmFwcGx5KHRoaXMsb3x8W2UucmVzcG9uc2VUZXh0LHQsZV0pfSl9KSx0aGlzfSx3LmVhY2goW1wiYWpheFN0YXJ0XCIsXCJhamF4U3RvcFwiLFwiYWpheENvbXBsZXRlXCIsXCJhamF4RXJyb3JcIixcImFqYXhTdWNjZXNzXCIsXCJhamF4U2VuZFwiXSxmdW5jdGlvbihlLHQpe3cuZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxlKX19KSx3LmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gdy5ncmVwKHcudGltZXJzLGZ1bmN0aW9uKHQpe3JldHVybiBlPT09dC5lbGVtfSkubGVuZ3RofSx3Lm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjPXcuY3NzKGUsXCJwb3NpdGlvblwiKSxmPXcoZSkscD17fTtcInN0YXRpY1wiPT09YyYmKGUuc3R5bGUucG9zaXRpb249XCJyZWxhdGl2ZVwiKSxzPWYub2Zmc2V0KCksbz13LmNzcyhlLFwidG9wXCIpLHU9dy5jc3MoZSxcImxlZnRcIiksKGw9KFwiYWJzb2x1dGVcIj09PWN8fFwiZml4ZWRcIj09PWMpJiYobyt1KS5pbmRleE9mKFwiYXV0b1wiKT4tMSk/KGE9KHI9Zi5wb3NpdGlvbigpKS50b3AsaT1yLmxlZnQpOihhPXBhcnNlRmxvYXQobyl8fDAsaT1wYXJzZUZsb2F0KHUpfHwwKSxnKHQpJiYodD10LmNhbGwoZSxuLHcuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihwLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihwLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSxcInVzaW5nXCJpbiB0P3QudXNpbmcuY2FsbChlLHApOmYuY3NzKHApfX0sdy5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihlKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1lP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3cub2Zmc2V0LnNldE9mZnNldCh0aGlzLGUsdCl9KTt2YXIgdCxuLHI9dGhpc1swXTtpZihyKXJldHVybiByLmdldENsaWVudFJlY3RzKCkubGVuZ3RoPyh0PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1yLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcse3RvcDp0LnRvcCtuLnBhZ2VZT2Zmc2V0LGxlZnQ6dC5sZWZ0K24ucGFnZVhPZmZzZXR9KTp7dG9wOjAsbGVmdDowfX0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgZSx0LG4scj10aGlzWzBdLGk9e3RvcDowLGxlZnQ6MH07aWYoXCJmaXhlZFwiPT09dy5jc3MocixcInBvc2l0aW9uXCIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmXCJzdGF0aWNcIj09PXcuY3NzKGUsXCJwb3NpdGlvblwiKSllPWUucGFyZW50Tm9kZTtlJiZlIT09ciYmMT09PWUubm9kZVR5cGUmJigoaT13KGUpLm9mZnNldCgpKS50b3ArPXcuY3NzKGUsXCJib3JkZXJUb3BXaWR0aFwiLCEwKSxpLmxlZnQrPXcuY3NzKGUsXCJib3JkZXJMZWZ0V2lkdGhcIiwhMCkpfXJldHVybnt0b3A6dC50b3AtaS50b3Atdy5jc3MocixcIm1hcmdpblRvcFwiLCEwKSxsZWZ0OnQubGVmdC1pLmxlZnQtdy5jc3MocixcIm1hcmdpbkxlZnRcIiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmXCJzdGF0aWNcIj09PXcuY3NzKGUsXCJwb3NpdGlvblwiKSllPWUub2Zmc2V0UGFyZW50O3JldHVybiBlfHxiZX0pfX0pLHcuZWFjaCh7c2Nyb2xsTGVmdDpcInBhZ2VYT2Zmc2V0XCIsc2Nyb2xsVG9wOlwicGFnZVlPZmZzZXRcIn0sZnVuY3Rpb24oZSx0KXt2YXIgbj1cInBhZ2VZT2Zmc2V0XCI9PT10O3cuZm5bZV09ZnVuY3Rpb24ocil7cmV0dXJuIHoodGhpcyxmdW5jdGlvbihlLHIsaSl7dmFyIG87aWYoeShlKT9vPWU6OT09PWUubm9kZVR5cGUmJihvPWUuZGVmYXVsdFZpZXcpLHZvaWQgMD09PWkpcmV0dXJuIG8/b1t0XTplW3JdO28/by5zY3JvbGxUbyhuP28ucGFnZVhPZmZzZXQ6aSxuP2k6by5wYWdlWU9mZnNldCk6ZVtyXT1pfSxlLHIsYXJndW1lbnRzLmxlbmd0aCl9fSksdy5lYWNoKFtcInRvcFwiLFwibGVmdFwiXSxmdW5jdGlvbihlLHQpe3cuY3NzSG9va3NbdF09X2UoaC5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGUsbil7aWYobilyZXR1cm4gbj1GZShlLHQpLFdlLnRlc3Qobik/dyhlKS5wb3NpdGlvbigpW3RdK1wicHhcIjpufSl9KSx3LmVhY2goe0hlaWdodDpcImhlaWdodFwiLFdpZHRoOlwid2lkdGhcIn0sZnVuY3Rpb24oZSx0KXt3LmVhY2goe3BhZGRpbmc6XCJpbm5lclwiK2UsY29udGVudDp0LFwiXCI6XCJvdXRlclwiK2V9LGZ1bmN0aW9uKG4scil7dy5mbltyXT1mdW5jdGlvbihpLG8pe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGgmJihufHxcImJvb2xlYW5cIiE9dHlwZW9mIGkpLHM9bnx8KCEwPT09aXx8ITA9PT1vP1wibWFyZ2luXCI6XCJib3JkZXJcIik7cmV0dXJuIHoodGhpcyxmdW5jdGlvbih0LG4saSl7dmFyIG87cmV0dXJuIHkodCk/MD09PXIuaW5kZXhPZihcIm91dGVyXCIpP3RbXCJpbm5lclwiK2VdOnQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W1wiY2xpZW50XCIrZV06OT09PXQubm9kZVR5cGU/KG89dC5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgodC5ib2R5W1wic2Nyb2xsXCIrZV0sb1tcInNjcm9sbFwiK2VdLHQuYm9keVtcIm9mZnNldFwiK2VdLG9bXCJvZmZzZXRcIitlXSxvW1wiY2xpZW50XCIrZV0pKTp2b2lkIDA9PT1pP3cuY3NzKHQsbixzKTp3LnN0eWxlKHQsbixpLHMpfSx0LGE/aTp2b2lkIDAsYSl9fSl9KSx3LmVhY2goXCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51XCIuc3BsaXQoXCIgXCIpLGZ1bmN0aW9uKGUsdCl7dy5mblt0XT1mdW5jdGlvbihlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbih0LG51bGwsZSxuKTp0aGlzLnRyaWdnZXIodCl9fSksdy5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfX0pLHcuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vbihlLG51bGwsdCxuKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub2ZmKGUsbnVsbCx0KX0sZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24odCxlLG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihlLFwiKipcIik6dGhpcy5vZmYodCxlfHxcIioqXCIsbil9fSksdy5wcm94eT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaTtpZihcInN0cmluZ1wiPT10eXBlb2YgdCYmKG49ZVt0XSx0PWUsZT1uKSxnKGUpKXJldHVybiByPW8uY2FsbChhcmd1bWVudHMsMiksaT1mdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHR8fHRoaXMsci5jb25jYXQoby5jYWxsKGFyZ3VtZW50cykpKX0saS5ndWlkPWUuZ3VpZD1lLmd1aWR8fHcuZ3VpZCsrLGl9LHcuaG9sZFJlYWR5PWZ1bmN0aW9uKGUpe2U/dy5yZWFkeVdhaXQrKzp3LnJlYWR5KCEwKX0sdy5pc0FycmF5PUFycmF5LmlzQXJyYXksdy5wYXJzZUpTT049SlNPTi5wYXJzZSx3Lm5vZGVOYW1lPU4sdy5pc0Z1bmN0aW9uPWcsdy5pc1dpbmRvdz15LHcuY2FtZWxDYXNlPUcsdy50eXBlPXgsdy5ub3c9RGF0ZS5ub3csdy5pc051bWVyaWM9ZnVuY3Rpb24oZSl7dmFyIHQ9dy50eXBlKGUpO3JldHVybihcIm51bWJlclwiPT09dHx8XCJzdHJpbmdcIj09PXQpJiYhaXNOYU4oZS1wYXJzZUZsb2F0KGUpKX0sXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoXCJqcXVlcnlcIixbXSxmdW5jdGlvbigpe3JldHVybiB3fSk7dmFyIEp0PWUualF1ZXJ5LEt0PWUuJDtyZXR1cm4gdy5ub0NvbmZsaWN0PWZ1bmN0aW9uKHQpe3JldHVybiBlLiQ9PT13JiYoZS4kPUt0KSx0JiZlLmpRdWVyeT09PXcmJihlLmpRdWVyeT1KdCksd30sdHx8KGUualF1ZXJ5PWUuJD13KSx3fSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3ZlbmRvci9hbG1hc2FlZWQyMDEwL2FkbWlubHRlL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5L2Rpc3QvanF1ZXJ5Lm1pbi5qc1xuLy8gbW9kdWxlIGlkID0gNDdcbi8vIG1vZHVsZSBjaHVua3MgPSAxIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///47\n");
+
+/***/ }),
+/* 48 */
/***/ (function(module, exports) {
-eval("throw new Error(\"Module build failed: Syntax Error \\n\\n(1:1) Unknown word\\n\\n\\u001b[31m\\u001b[1m>\\u001b[22m\\u001b[39m\\u001b[90m 1 | \\u001b[39m\\u001b[36mrequire\\u001b[39m\\u001b[36m(\\u001b[39m\\u001b[32m'jquery'\\u001b[39m\\u001b[36m)\\u001b[39m\\u001b[33m;\\u001b[39m\\n \\u001b[90m | \\u001b[39m\\u001b[31m\\u001b[1m^\\u001b[22m\\u001b[39m\\n \\u001b[90m 2 | \\u001b[39m\\u001b[36mrequire\\u001b[39m\\u001b[36m(\\u001b[39m\\u001b[32m'bootstrap'\\u001b[39m\\u001b[36m)\\u001b[39m\\u001b[33m;\\u001b[39m\\n \\u001b[90m 3 | \\u001b[39m\\u001b[36mrequire\\u001b[39m\\u001b[36m(\\u001b[39m\\u001b[32m'adminlte'\\u001b[39m\\u001b[36m)\\u001b[39m\\u001b[33m;\\u001b[39m\\n\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiI1LmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5\n");
+eval("/* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {/* globals __webpack_amd_options__ */\r\nmodule.exports = __webpack_amd_options__;\r\n\n/* WEBPACK VAR INJECTION */}.call(exports, {}))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vYW1kLW9wdGlvbnMuanM/NWY3MSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwiZmlsZSI6IjQ4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFscyBfX3dlYnBhY2tfYW1kX29wdGlvbnNfXyAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19hbWRfb3B0aW9uc19fO1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9hbWQtb3B0aW9ucy5qc1xuLy8gbW9kdWxlIGlkID0gNDhcbi8vIG1vZHVsZSBjaHVua3MgPSAxIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///48\n");
-/***/ })
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! jQuery UI - v1.11.4 - 2015-03-11\n* http://jqueryui.com\n* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js\n* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */\n\n(function(e){ true?!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1)], __WEBPACK_AMD_DEFINE_FACTORY__ = (e),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return\"area\"===r?(n=t.parentNode,a=n.name,t.href&&a&&\"map\"===n.nodeName.toLowerCase()?(o=e(\"img[usemap='#\"+a+\"']\")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:\"a\"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return\"hidden\"===e.css(this,\"visibility\")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css(\"position\"),(\"absolute\"===t||\"relative\"===t||\"fixed\"===t)&&(i=parseInt(e.css(\"zIndex\"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId=\"ui-datepicker-div\",this._inlineClass=\"ui-datepicker-inline\",this._appendClass=\"ui-datepicker-append\",this._triggerClass=\"ui-datepicker-trigger\",this._dialogClass=\"ui-datepicker-dialog\",this._disableClass=\"ui-datepicker-disabled\",this._unselectableClass=\"ui-datepicker-unselectable\",this._currentClass=\"ui-datepicker-current-day\",this._dayOverClass=\"ui-datepicker-days-cell-over\",this.regional=[],this.regional[\"\"]={closeText:\"Done\",prevText:\"Prev\",nextText:\"Next\",currentText:\"Today\",monthNames:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],monthNamesShort:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],dayNames:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],dayNamesShort:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],dayNamesMin:[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],weekHeader:\"Wk\",dateFormat:\"mm/dd/yy\",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:\"\"},this._defaults={showOn:\"focus\",showAnim:\"fadeIn\",showOptions:{},defaultDate:null,appendText:\"\",buttonText:\"...\",buttonImage:\"\",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:\"c-10:c+10\",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:\"+10\",minDate:null,maxDate:null,duration:\"fast\",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:\"\",altFormat:\"\",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[\"\"]),this.regional.en=e.extend(!0,{},this.regional[\"\"]),this.regional[\"en-US\"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e(\"<div id='\"+this._mainDivId+\"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\"))}function a(t){var i=\"button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a\";return t.delegate(i,\"mouseout\",function(){e(this).removeClass(\"ui-state-hover\"),-1!==this.className.indexOf(\"ui-datepicker-prev\")&&e(this).removeClass(\"ui-datepicker-prev-hover\"),-1!==this.className.indexOf(\"ui-datepicker-next\")&&e(this).removeClass(\"ui-datepicker-next-hover\")}).delegate(i,\"mouseover\",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(\".ui-datepicker-calendar\").find(\"a\").removeClass(\"ui-state-hover\"),e(this).addClass(\"ui-state-hover\"),-1!==this.className.indexOf(\"ui-datepicker-prev\")&&e(this).addClass(\"ui-datepicker-prev-hover\"),-1!==this.className.indexOf(\"ui-datepicker-next\")&&e(this).addClass(\"ui-datepicker-next-hover\"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger(\"change\")}}e.ui=e.ui||{},e.extend(e.ui,{version:\"1.11.4\",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css(\"position\"),s=\"absolute\"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&\"static\"===t.css(\"position\")?!1:n.test(t.css(\"overflow\")+t.css(\"overflow-y\")+t.css(\"overflow-x\"))}).eq(0);return\"fixed\"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id=\"ui-id-\"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\\d+$/.test(this.id)&&e(this).removeAttr(\"id\")})}}),e.extend(e.expr[\":\"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,\"tabindex\")))},tabbable:function(i){var s=e.attr(i,\"tabindex\"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e(\"<a>\").outerWidth(1).jquery||e.each([\"Width\",\"Height\"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,\"padding\"+this))||0,s&&(i-=parseFloat(e.css(t,\"border\"+this+\"Width\"))||0),a&&(i-=parseFloat(e.css(t,\"margin\"+this))||0)}),i}var n=\"Width\"===i?[\"Left\",\"Right\"]:[\"Top\",\"Bottom\"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn[\"inner\"+i]=function(t){return void 0===t?o[\"inner\"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+\"px\")})},e.fn[\"outer\"+i]=function(t,n){return\"number\"!=typeof t?o[\"outer\"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+\"px\")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e(\"<a>\").data(\"a-b\",\"a\").removeData(\"a-b\").data(\"a-b\")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return\"number\"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e=\"onselectstart\"in document.createElement(\"div\")?\"selectstart\":\"mousedown\";return function(){return this.bind(e+\".ui-disableSelection\",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(\".ui-disableSelection\")},zIndex:function(t){if(void 0!==t)return this.css(\"zIndex\",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css(\"position\"),(\"absolute\"===i||\"relative\"===i||\"fixed\"===i)&&(s=parseInt(n.css(\"zIndex\"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,\"events\"),s&&s.remove&&e(n).triggerHandler(\"remove\")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(\".\")[0];return t=t.split(\".\")[1],n=l+\"-\"+t,s||(s=i,i=e.Widget),e.expr[\":\"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+\".\"+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a=\"string\"==typeof n,o=u.call(arguments,1),r=this;return a?this.each(function(){var i,a=e.data(this,s);return\"instance\"===n?(r=a,!1):a?e.isFunction(a[n])&&\"_\"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error(\"no such method '\"+n+\"' for \"+t+\" widget instance\"):e.error(\"cannot call methods on \"+t+\" prior to initialization; \"+\"attempted to call method '\"+n+\"'\")}):(o.length&&(n=e.widget.extend.apply(null,[n].concat(o))),this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))})),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:\"widget\",widgetEventPrefix:\"\",defaultElement:\"<div>\",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace=\".\"+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger(\"create\",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr(\"aria-disabled\").removeClass(this.widgetFullName+\"-disabled \"+\"ui-state-disabled\"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass(\"ui-state-hover\"),this.focusable.removeClass(\"ui-state-focus\")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if(\"string\"==typeof t)if(o={},s=t.split(\".\"),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,\"disabled\"===e&&(this.widget().toggleClass(this.widgetFullName+\"-disabled\",!!t),t&&(this.hoverable.removeClass(\"ui-state-hover\"),this.focusable.removeClass(\"ui-state-focus\"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;\"boolean\"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass(\"ui-state-disabled\")?(\"string\"==typeof o?a[o]:o).apply(a,arguments):void 0}\"string\"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\\w:-]*)\\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||\"\").split(\" \").join(this.eventNamespace+\" \")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return(\"string\"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass(\"ui-state-hover\")},mouseleave:function(t){e(t.currentTarget).removeClass(\"ui-state-hover\")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass(\"ui-state-focus\")},focusout:function(t){e(t.currentTarget).removeClass(\"ui-state-focus\")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:\"fadeIn\",hide:\"fadeOut\"},function(t,i){e.Widget.prototype[\"_\"+t]=function(s,n,a){\"string\"==typeof n&&(n={effect:n});var o,r=n?n===!0||\"number\"==typeof n?i:n.effect||i:t;n=n||{},\"number\"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget(\"ui.mouse\",{version:\"1.11.4\",options:{cancel:\"input,textarea,button,select,option\",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind(\"mousedown.\"+this.widgetName,function(e){return t._mouseDown(e)}).bind(\"click.\"+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+\".preventClickEvent\")?(e.removeData(i.target,t.widgetName+\".preventClickEvent\"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind(\".\"+this.widgetName),this._mouseMoveDelegate&&this.document.unbind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).unbind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n=\"string\"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+\".preventClickEvent\")&&e.removeData(t.target,this.widgetName+\".preventClickEvent\"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).bind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).unbind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+\".preventClickEvent\",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\\+\\-]\\d+(\\.[\\d]+)?%?/,c=/^\\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e(\"<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>\"),a=s.children()[0];return e(\"body\").append(s),t=a.offsetWidth,s.css(\"overflow\",\"scroll\"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?\"\":t.element.css(\"overflow-x\"),s=t.isWindow||t.isDocument?\"\":t.element.css(\"overflow-y\"),n=\"scroll\"===i||\"auto\"===i&&t.width<t.element[0].scrollWidth,a=\"scroll\"===s||\"auto\"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||\"flip\").split(\" \"),T={};return b=s(_),_[0].preventDefault&&(n.at=\"left top\"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each([\"my\",\"at\"],function(){var e,t,i=(n[this]||\"\").split(\" \");1===i.length&&(i=l.test(i[0])?i.concat([\"center\"]):u.test(i[0])?[\"center\"].concat(i):[\"center\",\"center\"]),i[0]=l.test(i[0])?i[0]:\"center\",i[1]=u.test(i[1])?i[1]:\"center\",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),\"right\"===n.at[0]?y.left+=m:\"center\"===n.at[0]&&(y.left+=m/2),\"bottom\"===n.at[1]?y.top+=g:\"center\"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,\"marginLeft\"),b=i(this,\"marginTop\"),D=d+f+i(this,\"marginRight\")+w.width,S=c+b+i(this,\"marginBottom\")+w.height,M=e.extend({},y),C=t(T.my,u.outerWidth(),u.outerHeight());\"right\"===n.my[0]?M.left-=d:\"center\"===n.my[0]&&(M.left-=d/2),\"bottom\"===n.my[1]?M.top-=c:\"center\"===n.my[1]&&(M.top-=c/2),M.left+=C[0],M.top+=C[1],a||(M.left=h(M.left),M.top=h(M.top)),s={marginLeft:f,marginTop:b},e.each([\"left\",\"top\"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](M,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+C[0],p[1]+C[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-M.left,i=t+m-d,s=v.top-M.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:M.left,top:M.top,width:d,height:c},horizontal:0>i?\"left\":t>0?\"right\":\"center\",vertical:0>a?\"top\":s>0?\"bottom\":\"middle\"};d>m&&m>r(t+i)&&(h.horizontal=\"center\"),c>g&&g>r(s+a)&&(h.vertical=\"middle\"),h.important=o(r(t),r(i))>o(r(s),r(a))?\"horizontal\":\"vertical\",n.using.call(this,e,h)}),u.offset(e.extend(M,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c=\"left\"===t.my[0]?-t.elemWidth:\"right\"===t.my[0]?t.elemWidth:0,p=\"left\"===t.at[0]?t.targetWidth:\"right\"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c=\"top\"===t.my[1],p=c?-t.elemHeight:\"bottom\"===t.my[1]?t.elemHeight:0,f=\"top\"===t.at[1]?t.targetHeight:\"bottom\"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName(\"body\")[0],h=document.createElement(\"div\");t=document.createElement(r?\"div\":\"body\"),s={visibility:\"hidden\",width:0,height:0,border:0,margin:0,background:\"none\"},r&&e.extend(s,{position:\"absolute\",left:\"-1000px\",top:\"-1000px\"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText=\"position: absolute; left: 10.7432222px;\",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML=\"\",i.removeChild(t)}()}(),e.ui.position,e.widget(\"ui.accordion\",{version:\"1.11.4\",options:{active:0,animate:{},collapsible:!1,event:\"click\",header:\"> li > :first-child,> :not(li):even\",heightStyle:\"auto\",icons:{activeHeader:\"ui-icon-triangle-1-s\",header:\"ui-icon-triangle-1-e\"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:\"hide\",borderBottomWidth:\"hide\",paddingTop:\"hide\",paddingBottom:\"hide\",height:\"hide\"},showProps:{borderTopWidth:\"show\",borderBottomWidth:\"show\",paddingTop:\"show\",paddingBottom:\"show\",height:\"show\"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass(\"ui-accordion ui-widget ui-helper-reset\").attr(\"role\",\"tablist\"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e(\"<span>\").addClass(\"ui-accordion-header-icon ui-icon \"+t.header).prependTo(this.headers),this.active.children(\".ui-accordion-header-icon\").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass(\"ui-accordion-icons\"))},_destroyIcons:function(){this.headers.removeClass(\"ui-accordion-icons\").children(\".ui-accordion-header-icon\").remove()},_destroy:function(){var e;this.element.removeClass(\"ui-accordion ui-widget ui-helper-reset\").removeAttr(\"role\"),this.headers.removeClass(\"ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top\").removeAttr(\"role\").removeAttr(\"aria-expanded\").removeAttr(\"aria-selected\").removeAttr(\"aria-controls\").removeAttr(\"tabIndex\").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass(\"ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled\").css(\"display\",\"\").removeAttr(\"role\").removeAttr(\"aria-hidden\").removeAttr(\"aria-labelledby\").removeUniqueId(),\"content\"!==this.options.heightStyle&&e.css(\"height\",\"\")},_setOption:function(e,t){return\"active\"===e?(this._activate(t),void 0):(\"event\"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),\"collapsible\"!==e||t||this.options.active!==!1||this._activate(0),\"icons\"===e&&(this._destroyIcons(),t&&this._createIcons()),\"disabled\"===e&&(this.element.toggleClass(\"ui-state-disabled\",!!t).attr(\"aria-disabled\",t),this.headers.add(this.headers.next()).toggleClass(\"ui-state-disabled\",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr(\"tabIndex\",-1),e(a).attr(\"tabIndex\",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(\".ui-state-disabled\").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;this.headers=this.element.find(this.options.header).addClass(\"ui-accordion-header ui-state-default ui-corner-all\"),this.panels=this.headers.next().addClass(\"ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom\").filter(\":not(.ui-accordion-content-active)\").hide(),t&&(this._off(e.not(this.headers)),this._off(t.not(this.panels)))},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass(\"ui-accordion-header-active ui-state-active ui-corner-top\").removeClass(\"ui-corner-all\"),this.active.next().addClass(\"ui-accordion-content-active\").show(),this.headers.attr(\"role\",\"tab\").each(function(){var t=e(this),i=t.uniqueId().attr(\"id\"),s=t.next(),n=s.uniqueId().attr(\"id\");t.attr(\"aria-controls\",n),s.attr(\"aria-labelledby\",i)}).next().attr(\"role\",\"tabpanel\"),this.headers.not(this.active).attr({\"aria-selected\":\"false\",\"aria-expanded\":\"false\",tabIndex:-1}).next().attr({\"aria-hidden\":\"true\"}).hide(),this.active.length?this.active.attr({\"aria-selected\":\"true\",\"aria-expanded\":\"true\",tabIndex:0}).next().attr({\"aria-hidden\":\"false\"}):this.headers.eq(0).attr(\"tabIndex\",0),this._createIcons(),this._setupEvents(i.event),\"fill\"===s?(t=n.height(),this.element.siblings(\":visible\").each(function(){var i=e(this),s=i.css(\"position\");\"absolute\"!==s&&\"fixed\"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css(\"overflow\",\"auto\")):\"auto\"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css(\"height\",\"\").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return\"number\"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:\"_keydown\"};t&&e.each(t.split(\" \"),function(e,t){i[t]=\"_eventHandler\"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:\"_panelKeyDown\"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger(\"beforeActivate\",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass(\"ui-accordion-header-active ui-state-active\"),i.icons&&s.children(\".ui-accordion-header-icon\").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass(\"ui-corner-all\").addClass(\"ui-accordion-header-active ui-state-active ui-corner-top\"),i.icons&&n.children(\".ui-accordion-header-icon\").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass(\"ui-accordion-content-active\")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({\"aria-hidden\":\"true\"}),s.prev().attr({\"aria-selected\":\"false\",\"aria-expanded\":\"false\"}),i.length&&s.length?s.prev().attr({tabIndex:-1,\"aria-expanded\":\"false\"}):i.length&&this.headers.filter(function(){return 0===parseInt(e(this).attr(\"tabIndex\"),10)}).attr(\"tabIndex\",-1),i.attr(\"aria-hidden\",\"false\").prev().attr({\"aria-selected\":\"true\",\"aria-expanded\":\"true\",tabIndex:0})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.css(\"box-sizing\"),l=e.length&&(!t.length||e.index()<t.index()),u=this.options.animate||{},d=l&&u.down||u,c=function(){o._toggleComplete(i)};return\"number\"==typeof d&&(a=d),\"string\"==typeof d&&(n=d),n=n||d.easing||u.easing,a=a||d.duration||u.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:c,step:function(e,i){i.now=Math.round(e),\"height\"!==i.prop?\"content-box\"===h&&(r+=i.now):\"content\"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,c):e.animate(this.showProps,a,n,c)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass(\"ui-accordion-content-active\").prev().removeClass(\"ui-corner-top\").addClass(\"ui-corner-all\"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger(\"activate\",null,e)}}),e.widget(\"ui.menu\",{version:\"1.11.4\",defaultElement:\"<ul>\",delay:300,options:{icons:{submenu:\"ui-icon-carat-1-e\"},items:\"> *\",menus:\"ul\",position:{my:\"left-1 top\",at:\"right top\"},role:\"menu\",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass(\"ui-menu ui-widget ui-widget-content\").toggleClass(\"ui-menu-icons\",!!this.element.find(\".ui-icon\").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass(\"ui-state-disabled\").attr(\"aria-disabled\",\"true\"),this._on({\"mousedown .ui-menu-item\":function(e){e.preventDefault()},\"click .ui-menu-item\":function(t){var i=e(t.target);!this.mouseHandled&&i.not(\".ui-state-disabled\").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(\".ui-menu\").length?this.expand(t):!this.element.is(\":focus\")&&e(this.document[0].activeElement).closest(\".ui-menu\").length&&(this.element.trigger(\"focus\",[!0]),this.active&&1===this.active.parents(\".ui-menu\").length&&clearTimeout(this.timer)))},\"mouseenter .ui-menu-item\":function(t){if(!this.previousFilter){var i=e(t.currentTarget);\ni.siblings(\".ui-state-active\").removeClass(\"ui-state-active\"),this.focus(t,i)}},mouseleave:\"collapseAll\",\"mouseleave .ui-menu\":\"collapseAll\",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:\"_keydown\"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr(\"aria-activedescendant\").find(\".ui-menu\").addBack().removeClass(\"ui-menu ui-widget ui-widget-content ui-menu-icons ui-front\").removeAttr(\"role\").removeAttr(\"tabIndex\").removeAttr(\"aria-labelledby\").removeAttr(\"aria-expanded\").removeAttr(\"aria-hidden\").removeAttr(\"aria-disabled\").removeUniqueId().show(),this.element.find(\".ui-menu-item\").removeClass(\"ui-menu-item\").removeAttr(\"role\").removeAttr(\"aria-disabled\").removeUniqueId().removeClass(\"ui-state-hover\").removeAttr(\"tabIndex\").removeAttr(\"role\").removeAttr(\"aria-haspopup\").children().each(function(){var t=e(this);t.data(\"ui-menu-submenu-carat\")&&t.remove()}),this.element.find(\".ui-menu-divider\").removeClass(\"ui-menu-divider ui-widget-content\")},_keydown:function(t){var i,s,n,a,o=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move(\"first\",\"first\",t);break;case e.ui.keyCode.END:this._move(\"last\",\"last\",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(\".ui-state-disabled\")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:o=!1,s=this.previousFilter||\"\",n=String.fromCharCode(t.keyCode),a=!1,clearTimeout(this.filterTimer),n===s?a=!0:n=s+n,i=this._filterMenuItems(n),i=a&&-1!==i.index(this.active.next())?this.active.nextAll(\".ui-menu-item\"):i,i.length||(n=String.fromCharCode(t.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(t,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&t.preventDefault()},_activate:function(e){this.active.is(\".ui-state-disabled\")||(this.active.is(\"[aria-haspopup='true']\")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass(\"ui-menu-icons\",!!this.element.find(\".ui-icon\").length),a.filter(\":not(.ui-menu)\").addClass(\"ui-menu ui-widget ui-widget-content ui-front\").hide().attr({role:this.options.role,\"aria-hidden\":\"true\",\"aria-expanded\":\"false\"}).each(function(){var t=e(this),i=t.parent(),s=e(\"<span>\").addClass(\"ui-menu-icon ui-icon \"+n).data(\"ui-menu-submenu-carat\",!0);i.attr(\"aria-haspopup\",\"true\").prepend(s),t.attr(\"aria-labelledby\",i.attr(\"id\"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(\".ui-menu-item\").each(function(){var t=e(this);s._isDivider(t)&&t.addClass(\"ui-widget-content ui-menu-divider\")}),i.not(\".ui-menu-item, .ui-menu-divider\").addClass(\"ui-menu-item\").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(\".ui-state-disabled\").attr(\"aria-disabled\",\"true\"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:\"menuitem\",listbox:\"option\"}[this.options.role]},_setOption:function(e,t){\"icons\"===e&&this.element.find(\".ui-menu-icon\").removeClass(this.options.icons.submenu).addClass(t.submenu),\"disabled\"===e&&this.element.toggleClass(\"ui-state-disabled\",!!t).attr(\"aria-disabled\",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&\"focus\"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass(\"ui-state-focus\").removeClass(\"ui-state-active\"),this.options.role&&this.element.attr(\"aria-activedescendant\",s.attr(\"id\")),this.active.parent().closest(\".ui-menu-item\").addClass(\"ui-state-active\"),e&&\"keydown\"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(\".ui-menu\"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger(\"focus\",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],\"borderTopWidth\"))||0,s=parseFloat(e.css(this.activeMenu[0],\"paddingTop\"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass(\"ui-state-focus\"),this.active=null,this._trigger(\"blur\",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),\"true\"===e.attr(\"aria-hidden\")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(\".ui-menu\").not(t.parents(\".ui-menu\")).hide().attr(\"aria-hidden\",\"true\"),t.show().removeAttr(\"aria-hidden\").attr(\"aria-expanded\",\"true\").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(\".ui-menu\"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(\".ui-menu\").hide().attr(\"aria-hidden\",\"true\").attr(\"aria-expanded\",\"false\").end().find(\".ui-state-active\").not(\".ui-state-focus\").removeClass(\"ui-state-active\")},_closeOnDocumentClick:function(t){return!e(t.target).closest(\".ui-menu\").length},_isDivider:function(e){return!/[^\\-\\u2014\\u2013\\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(\".ui-menu-item\",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(\".ui-menu \").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move(\"next\",\"first\",e)},previous:function(e){this._move(\"prev\",\"last\",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(\".ui-menu-item\").length},isLastItem:function(){return this.active&&!this.active.nextAll(\".ui-menu-item\").length},_move:function(e,t,i){var s;this.active&&(s=\"first\"===e||\"last\"===e?this.active[\"first\"===e?\"prevAll\":\"nextAll\"](\".ui-menu-item\").eq(-1):this.active[e+\"All\"](\".ui-menu-item\").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(\".ui-menu-item\").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?\"last\":\"first\"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(\".ui-menu-item\").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop(\"scrollHeight\")},select:function(t){this.active=this.active||e(t.target).closest(\".ui-menu-item\");var i={item:this.active};this.active.has(\".ui-menu\").length||this.collapseAll(t,!0),this._trigger(\"select\",t,i)},_filterMenuItems:function(t){var i=t.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\"),s=RegExp(\"^\"+i,\"i\");return this.activeMenu.find(this.options.items).filter(\".ui-menu-item\").filter(function(){return s.test(e.trim(e(this).text()))})}}),e.widget(\"ui.autocomplete\",{version:\"1.11.4\",defaultElement:\"<input>\",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:\"left top\",at:\"left bottom\",collision:\"none\"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a=\"textarea\"===n,o=\"input\"===n;this.isMultiLine=a?!0:o?!1:this.element.prop(\"isContentEditable\"),this.valueMethod=this.element[a||o?\"val\":\"text\"],this.isNewMenu=!0,this.element.addClass(\"ui-autocomplete-input\").attr(\"autocomplete\",\"off\"),this._on(this.element,{keydown:function(n){if(this.element.prop(\"readOnly\"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move(\"previousPage\",n);break;case a.PAGE_DOWN:t=!0,this._move(\"nextPage\",n);break;case a.UP:t=!0,this._keyEvent(\"previous\",n);break;case a.DOWN:t=!0,this._keyEvent(\"next\",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(\":visible\")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(\":visible\"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move(\"previousPage\",s);break;case n.PAGE_DOWN:this._move(\"nextPage\",s);break;case n.UP:this._keyEvent(\"previous\",s);break;case n.DOWN:this._keyEvent(\"next\",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e(\"<ul>\").addClass(\"ui-autocomplete ui-front\").appendTo(this._appendTo()).menu({role:null}).hide().menu(\"instance\"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(\".ui-menu-item\").length||this._delay(function(){var t=this;this.document.one(\"mousedown\",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one(\"mousemove\",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data(\"ui-autocomplete-item\"),!1!==this._trigger(\"focus\",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr(\"aria-label\")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e(\"<div>\").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data(\"ui-autocomplete-item\"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger(\"select\",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e(\"<span>\",{role:\"status\",\"aria-live\":\"assertive\",\"aria-relevant\":\"additions\"}).addClass(\"ui-helper-hidden-accessible\").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr(\"autocomplete\")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass(\"ui-autocomplete-input\").removeAttr(\"autocomplete\"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),\"source\"===e&&this._initSource(),\"appendTo\"===e&&this.menu.element.appendTo(this._appendTo()),\"disabled\"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(\".ui-front\")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):\"string\"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:\"json\",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(\":visible\"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger(\"search\",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass(\"ui-autocomplete-loading\"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass(\"ui-autocomplete-loading\")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger(\"response\",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger(\"open\")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(\":visible\")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger(\"close\",e))},_change:function(e){this.previous!==this._value()&&this._trigger(\"change\",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return\"string\"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width(\"\").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data(\"ui-autocomplete-item\",t)},_renderItem:function(t,i){return e(\"<li>\").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(\":visible\")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(\":visible\"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),\"i\");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget(\"ui.autocomplete\",e.ui.autocomplete,{options:{messages:{noResults:\"No search results.\",results:function(e){return e+(e>1?\" results are\":\" result is\")+\" available, use up and down arrow keys to navigate.\"}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e(\"<div>\").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p=\"ui-button ui-widget ui-state-default ui-corner-all\",f=\"ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only\",m=function(){var t=e(this);setTimeout(function(){t.find(\":ui-button\").button(\"refresh\")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,\"\\\\'\"),n=s?e(s).find(\"[name='\"+i+\"'][type=radio]\"):e(\"[name='\"+i+\"'][type=radio]\",t.ownerDocument).filter(function(){return!this.form})),n};e.widget(\"ui.button\",{version:\"1.11.4\",defaultElement:\"<button>\",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest(\"form\").unbind(\"reset\"+this.eventNamespace).bind(\"reset\"+this.eventNamespace,m),\"boolean\"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop(\"disabled\"):this.element.prop(\"disabled\",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr(\"title\");var t=this,i=this.options,s=\"checkbox\"===this.type||\"radio\"===this.type,n=s?\"\":\"ui-state-active\";null===i.label&&(i.label=\"input\"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr(\"role\",\"button\").bind(\"mouseenter\"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass(\"ui-state-active\")}).bind(\"mouseleave\"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind(\"click\"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass(\"ui-state-focus\")},blur:function(){this.buttonElement.removeClass(\"ui-state-focus\")}}),s&&this.element.bind(\"change\"+this.eventNamespace,function(){t.refresh()}),\"checkbox\"===this.type?this.buttonElement.bind(\"click\"+this.eventNamespace,function(){return i.disabled?!1:void 0}):\"radio\"===this.type?this.buttonElement.bind(\"click\"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass(\"ui-state-active\"),t.buttonElement.attr(\"aria-pressed\",\"true\");var s=t.element[0];g(s).not(s).map(function(){return e(this).button(\"widget\")[0]}).removeClass(\"ui-state-active\").attr(\"aria-pressed\",\"false\")}):(this.buttonElement.bind(\"mousedown\"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass(\"ui-state-active\"),c=this,t.document.one(\"mouseup\",function(){c=null}),void 0)}).bind(\"mouseup\"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass(\"ui-state-active\"),void 0)}).bind(\"keydown\"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass(\"ui-state-active\"),void 0)}).bind(\"keyup\"+this.eventNamespace+\" blur\"+this.eventNamespace,function(){e(this).removeClass(\"ui-state-active\")}),this.buttonElement.is(\"a\")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption(\"disabled\",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is(\"[type=checkbox]\")?\"checkbox\":this.element.is(\"[type=radio]\")?\"radio\":this.element.is(\"input\")?\"input\":\"button\",\"checkbox\"===this.type||\"radio\"===this.type?(e=this.element.parents().last(),t=\"label[for='\"+this.element.attr(\"id\")+\"']\",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass(\"ui-helper-hidden-accessible\"),i=this.element.is(\":checked\"),i&&this.buttonElement.addClass(\"ui-state-active\"),this.buttonElement.prop(\"aria-pressed\",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass(\"ui-helper-hidden-accessible\"),this.buttonElement.removeClass(p+\" ui-state-active \"+f).removeAttr(\"role\").removeAttr(\"aria-pressed\").html(this.buttonElement.find(\".ui-button-text\").html()),this.hasTitle||this.buttonElement.removeAttr(\"title\")},_setOption:function(e,t){return this._super(e,t),\"disabled\"===e?(this.widget().toggleClass(\"ui-state-disabled\",!!t),this.element.prop(\"disabled\",!!t),t&&(\"checkbox\"===this.type||\"radio\"===this.type?this.buttonElement.removeClass(\"ui-state-focus\"):this.buttonElement.removeClass(\"ui-state-focus ui-state-active\")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is(\"input, button\")?this.element.is(\":disabled\"):this.element.hasClass(\"ui-button-disabled\");t!==this.options.disabled&&this._setOption(\"disabled\",t),\"radio\"===this.type?g(this.element[0]).each(function(){e(this).is(\":checked\")?e(this).button(\"widget\").addClass(\"ui-state-active\").attr(\"aria-pressed\",\"true\"):e(this).button(\"widget\").removeClass(\"ui-state-active\").attr(\"aria-pressed\",\"false\")}):\"checkbox\"===this.type&&(this.element.is(\":checked\")?this.buttonElement.addClass(\"ui-state-active\").attr(\"aria-pressed\",\"true\"):this.buttonElement.removeClass(\"ui-state-active\").attr(\"aria-pressed\",\"false\"))},_resetButton:function(){if(\"input\"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e(\"<span></span>\",this.document[0]).addClass(\"ui-button-text\").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push(\"ui-button-text-icon\"+(n?\"s\":s.primary?\"-primary\":\"-secondary\")),s.primary&&t.prepend(\"<span class='ui-button-icon-primary ui-icon \"+s.primary+\"'></span>\"),s.secondary&&t.append(\"<span class='ui-button-icon-secondary ui-icon \"+s.secondary+\"'></span>\"),this.options.text||(a.push(n?\"ui-button-icons-only\":\"ui-button-icon-only\"),this.hasTitle||t.attr(\"title\",e.trim(i)))):a.push(\"ui-button-text-only\"),t.addClass(a.join(\" \"))}}),e.widget(\"ui.buttonset\",{version:\"1.11.4\",options:{items:\"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)\"},_create:function(){this.element.addClass(\"ui-buttonset\")},_init:function(){this.refresh()},_setOption:function(e,t){\"disabled\"===e&&this.buttons.button(\"option\",e,t),this._super(e,t)},refresh:function(){var t=\"rtl\"===this.element.css(\"direction\"),i=this.element.find(this.options.items),s=i.filter(\":ui-button\");i.not(\":ui-button\").button(),s.button(\"refresh\"),this.buttons=i.map(function(){return e(this).button(\"widget\")[0]}).removeClass(\"ui-corner-all ui-corner-left ui-corner-right\").filter(\":first\").addClass(t?\"ui-corner-right\":\"ui-corner-left\").end().filter(\":last\").addClass(t?\"ui-corner-left\":\"ui-corner-right\").end().end()},_destroy:function(){this.element.removeClass(\"ui-buttonset\"),this.buttons.map(function(){return e(this).button(\"widget\")[0]}).removeClass(\"ui-corner-left ui-corner-right\").end().button(\"destroy\")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:\"1.11.4\"}});var v;e.extend(n.prototype,{markerClassName:\"hasDatepicker\",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n=\"div\"===s||\"span\"===s,t.id||(this.uuid+=1,t.id=\"dp\"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),\"input\"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\\-])/g,\"\\\\\\\\$1\");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e(\"<div class='\"+this._inlineClass+\" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,\"datepicker\",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,\"appendText\"),r=this._get(i,\"isRTL\");i.append&&i.append.remove(),o&&(i.append=e(\"<span class='\"+this._appendClass+\"'>\"+o+\"</span>\"),t[r?\"before\":\"after\"](i.append)),t.unbind(\"focus\",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,\"showOn\"),(\"focus\"===s||\"both\"===s)&&t.focus(this._showDatepicker),(\"button\"===s||\"both\"===s)&&(n=this._get(i,\"buttonText\"),a=this._get(i,\"buttonImage\"),i.trigger=e(this._get(i,\"buttonImageOnly\")?e(\"<img/>\").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e(\"<button type='button'></button>\").addClass(this._triggerClass).html(a?e(\"<img/>\").attr({src:a,alt:n,title:n}):n)),t[r?\"before\":\"after\"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,\"autoSize\")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,\"dateFormat\");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?\"monthNames\":\"monthNamesShort\"))),a.setDate(t(this._get(e,o.match(/DD/)?\"dayNames\":\"dayNamesShort\"))+20-a.getDay())),e.input.attr(\"size\",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,\"datepicker\",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css(\"display\",\"block\"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o=\"dp\"+this.uuid,this._dialogInput=e(\"<input type='text' id='\"+o+\"' style='position: absolute; top: -100px; width: 0px;'/>\"),this._dialogInput.keydown(this._doKeyDown),e(\"body\").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],\"datepicker\",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css(\"left\",this._pos[0]+20+\"px\").css(\"top\",this._pos[1]+\"px\"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],\"datepicker\",c),this},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,\"datepicker\");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,\"datepicker\"),\"input\"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind(\"focus\",this._showDatepicker).unbind(\"keydown\",this._doKeyDown).unbind(\"keypress\",this._doKeyPress).unbind(\"keyup\",this._doKeyUp)):(\"div\"===i||\"span\"===i)&&s.removeClass(this.markerClassName).empty(),v===n&&(v=null))},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,\"datepicker\");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),\"input\"===i?(t.disabled=!1,a.trigger.filter(\"button\").each(function(){this.disabled=!1}).end().filter(\"img\").css({opacity:\"1.0\",cursor:\"\"})):(\"div\"===i||\"span\"===i)&&(s=n.children(\".\"+this._inlineClass),s.children().removeClass(\"ui-state-disabled\"),s.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").prop(\"disabled\",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,\"datepicker\");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),\"input\"===i?(t.disabled=!0,a.trigger.filter(\"button\").each(function(){this.disabled=!0}).end().filter(\"img\").css({opacity:\"0.5\",cursor:\"default\"})):(\"div\"===i||\"span\"===i)&&(s=n.children(\".\"+this._inlineClass),s.children().addClass(\"ui-state-disabled\"),s.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").prop(\"disabled\",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,\"datepicker\")}catch(i){throw\"Missing instance data for this datepicker\"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&\"string\"==typeof i?\"defaults\"===i?e.extend({},e.datepicker._defaults):l?\"all\"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},\"string\"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,\"min\"),h=this._getMinMaxDate(l,\"max\"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),\"disabled\"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(\".ui-datepicker-rtl\");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e(\"td.\"+e.datepicker._dayOverClass+\":not(.\"+e.datepicker._currentClass+\")\",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,\"onSelect\"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,\"stepBigMonths\"):-e.datepicker._get(a,\"stepMonths\"),\"M\");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,\"stepBigMonths\"):+e.datepicker._get(a,\"stepMonths\"),\"M\");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,\"D\"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,\"stepBigMonths\"):-e.datepicker._get(a,\"stepMonths\"),\"M\");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,\"D\"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,\"D\"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,\"stepBigMonths\"):+e.datepicker._get(a,\"stepMonths\"),\"M\");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,\"D\"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target);\nreturn e.datepicker._get(n,\"constrainInput\")?(i=e.datepicker._possibleChars(e.datepicker._get(n,\"dateFormat\")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||\" \">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,\"dateFormat\"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,\"input\"!==t.nodeName.toLowerCase()&&(t=e(\"input\",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,\"beforeShow\"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=\"\"),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|=\"fixed\"===e(this).css(\"position\"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:\"absolute\",display:\"block\",top:\"-1000px\"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?\"static\":o?\"fixed\":\"absolute\",display:\"none\",left:h.left+\"px\",top:h.top+\"px\"}),i.inline||(l=e.datepicker._get(i,\"showAnim\"),u=e.datepicker._get(i,\"duration\"),i.dpDiv.css(\"z-index\",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,\"showOptions\"),u):i.dpDiv[l||\"show\"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find(\".\"+this._dayOverClass+\" a\");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass(\"ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4\").width(\"\"),n>1&&t.dpDiv.addClass(\"ui-datepicker-multi-\"+n).css(\"width\",a*n+\"em\"),t.dpDiv[(1!==s[0]||1!==s[1]?\"add\":\"remove\")+\"Class\"](\"ui-datepicker-multi\"),t.dpDiv[(this._get(t,\"isRTL\")?\"add\":\"remove\")+\"Class\"](\"ui-datepicker-rtl\"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find(\"select.ui-datepicker-year:first\").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(\":visible\")&&!e.input.is(\":disabled\")&&!e.input.is(\":focus\")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,\"isRTL\")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,\"isRTL\");t&&(\"hidden\"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?\"previousSibling\":\"nextSibling\"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,\"datepicker\")||this._datepickerShowing&&(i=this._get(o,\"showAnim\"),s=this._get(o,\"duration\"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,\"showOptions\"),s,n):o.dpDiv[\"slideDown\"===i?\"slideUp\":\"fadeIn\"===i?\"fadeOut\":\"hide\"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,\"onClose\"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():\"\",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:\"absolute\",left:\"0\",top:\"-100px\"}),e.blockUI&&(e.unblockUI(),e(\"body\").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(\".ui-datepicker-calendar\")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents(\"#\"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest(\".\"+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+(\"M\"===s?this._get(a,\"showCurrentAtPos\"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,\"gotoCurrent\")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a[\"selected\"+(\"M\"===s?\"Month\":\"Year\")]=a[\"draw\"+(\"M\"===s?\"Month\":\"Year\")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e(\"a\",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,\"\")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,\"onSelect\"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger(\"change\"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],\"object\"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,\"altField\");a&&(i=this._get(t,\"altFormat\")||this._get(t,\"dateFormat\"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,\"\"]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw\"Invalid arguments\";if(i=\"object\"==typeof i?\"\"+i:i+\"\",\"\"===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u=\"string\"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s=\"@\"===e?14:\"!\"===e?20:\"y\"===e&&t?4:\"o\"===e?3:2,n=\"y\"===e?s:1,a=RegExp(\"^\\\\d{\"+n+\",\"+s+\"}\"),o=i.substring(h).match(a);if(!o)throw\"Missing number at position \"+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw\"Unknown name at position \"+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw\"Unexpected literal at position \"+h;h++};for(n=0;t.length>n;n++)if(b)\"'\"!==t.charAt(n)||_(\"'\")?k():b=!1;else switch(t.charAt(n)){case\"d\":v=x(\"d\");break;case\"D\":w(\"D\",d,c);break;case\"o\":y=x(\"o\");break;case\"m\":g=x(\"m\");break;case\"M\":g=w(\"M\",p,f);break;case\"y\":m=x(\"y\");break;case\"@\":r=new Date(x(\"@\")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case\"!\":r=new Date((x(\"!\")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case\"'\":_(\"'\")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\\s+/.test(o)))throw\"Extra/unparsed characters found in date: \"+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw\"Invalid date\";return r},ATOM:\"yy-mm-dd\",COOKIE:\"D, dd M yy\",ISO_8601:\"yy-mm-dd\",RFC_822:\"D, d M y\",RFC_850:\"DD, dd-M-y\",RFC_1036:\"D, d M y\",RFC_1123:\"D, d M yy\",RFC_2822:\"D, d M yy\",RSS:\"D, d M y\",TICKS:\"!\",TIMESTAMP:\"@\",W3C:\"yy-mm-dd\",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return\"\";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=\"\"+t;if(h(e))for(;i>s.length;)s=\"0\"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d=\"\",c=!1;if(t)for(s=0;e.length>s;s++)if(c)\"'\"!==e.charAt(s)||h(\"'\")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case\"d\":d+=l(\"d\",t.getDate(),2);break;case\"D\":d+=u(\"D\",t.getDay(),n,a);break;case\"o\":d+=l(\"o\",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case\"m\":d+=l(\"m\",t.getMonth()+1,2);break;case\"M\":d+=u(\"M\",t.getMonth(),o,r);break;case\"y\":d+=h(\"y\")?t.getFullYear():(10>t.getYear()%100?\"0\":\"\")+t.getYear()%100;break;case\"@\":d+=t.getTime();break;case\"!\":d+=1e4*t.getTime()+this._ticksTo1970;break;case\"'\":h(\"'\")?d+=\"'\":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i=\"\",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)\"'\"!==e.charAt(t)||n(\"'\")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case\"d\":case\"m\":case\"y\":case\"@\":i+=\"0123456789\";break;case\"D\":case\"M\":return null;case\"'\":n(\"'\")?i+=\"'\":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,\"dateFormat\"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?\"\":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,\"defaultDate\"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,\"dateFormat\"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\\-]?[0-9]+)\\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||\"d\"){case\"d\":case\"D\":r+=parseInt(l[1],10);break;case\"w\":case\"W\":r+=7*parseInt(l[1],10);break;case\"m\":case\"M\":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case\"y\":case\"Y\":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||\"\"===i?s:\"string\"==typeof i?a(i):\"number\"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&\"Invalid Date\"==\"\"+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?\"\":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&\"\"===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,\"stepMonths\"),s=\"#\"+t.id.replace(/\\\\\\\\/g,\"\\\\\");t.dpDiv.find(\"[data-handler]\").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,\"M\")},next:function(){e.datepicker._adjustDate(s,+i,\"M\")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute(\"data-month\"),+this.getAttribute(\"data-year\"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,\"M\"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,\"Y\"),!1}};e(this).bind(this.getAttribute(\"data-event\"),t[this.getAttribute(\"data-handler\")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,M,C,N,A,P,I,H,z,F,E,O,j,W,L=new Date,R=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(e,\"isRTL\"),B=this._get(e,\"showButtonPanel\"),J=this._get(e,\"hideIfNoPrevNext\"),q=this._get(e,\"navigationAsDateFormat\"),K=this._getNumberOfMonths(e),V=this._get(e,\"showCurrentAtPos\"),U=this._get(e,\"stepMonths\"),Q=1!==K[0]||1!==K[1],G=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),X=this._getMinMaxDate(e,\"min\"),$=this._getMinMaxDate(e,\"max\"),Z=e.drawMonth-V,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-K[0]*K[1]+1,$.getDate())),t=X&&X>t?X:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,\"prevText\"),i=q?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-U,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?\"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='\"+i+\"'><span class='ui-icon ui-icon-circle-triangle-\"+(Y?\"e\":\"w\")+\"'>\"+i+\"</span></a>\":J?\"\":\"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='\"+i+\"'><span class='ui-icon ui-icon-circle-triangle-\"+(Y?\"e\":\"w\")+\"'>\"+i+\"</span></a>\",n=this._get(e,\"nextText\"),n=q?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+U,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?\"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='\"+n+\"'><span class='ui-icon ui-icon-circle-triangle-\"+(Y?\"w\":\"e\")+\"'>\"+n+\"</span></a>\":J?\"\":\"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='\"+n+\"'><span class='ui-icon ui-icon-circle-triangle-\"+(Y?\"w\":\"e\")+\"'>\"+n+\"</span></a>\",o=this._get(e,\"currentText\"),r=this._get(e,\"gotoCurrent\")&&e.currentDay?G:R,o=q?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?\"\":\"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>\"+this._get(e,\"closeText\")+\"</button>\",l=B?\"<div class='ui-datepicker-buttonpane ui-widget-content'>\"+(Y?h:\"\")+(this._isInRange(e,r)?\"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>\"+o+\"</button>\":\"\")+(Y?\"\":h)+\"</div>\":\"\",u=parseInt(this._get(e,\"firstDay\"),10),u=isNaN(u)?0:u,d=this._get(e,\"showWeek\"),c=this._get(e,\"dayNames\"),p=this._get(e,\"dayNamesMin\"),f=this._get(e,\"monthNames\"),m=this._get(e,\"monthNamesShort\"),g=this._get(e,\"beforeShowDay\"),v=this._get(e,\"showOtherMonths\"),y=this._get(e,\"selectOtherMonths\"),b=this._getDefaultDate(e),_=\"\",w=0;K[0]>w;w++){for(k=\"\",this.maxRows=4,T=0;K[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=\" ui-corner-all\",M=\"\",Q){if(M+=\"<div class='ui-datepicker-group\",K[1]>1)switch(T){case 0:M+=\" ui-datepicker-group-first\",S=\" ui-corner-\"+(Y?\"right\":\"left\");break;case K[1]-1:M+=\" ui-datepicker-group-last\",S=\" ui-corner-\"+(Y?\"left\":\"right\");break;default:M+=\" ui-datepicker-group-middle\",S=\"\"}M+=\"'>\"}for(M+=\"<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix\"+S+\"'>\"+(/all|left/.test(S)&&0===w?Y?a:s:\"\")+(/all|right/.test(S)&&0===w?Y?s:a:\"\")+this._generateMonthYearHeader(e,Z,et,X,$,w>0||T>0,f,m)+\"</div><table class='ui-datepicker-calendar'><thead>\"+\"<tr>\",C=d?\"<th class='ui-datepicker-week-col'>\"+this._get(e,\"weekHeader\")+\"</th>\":\"\",x=0;7>x;x++)N=(x+u)%7,C+=\"<th scope='col'\"+((x+u+6)%7>=5?\" class='ui-datepicker-week-end'\":\"\")+\">\"+\"<span title='\"+c[N]+\"'>\"+p[N]+\"</span></th>\";for(M+=C+\"</tr></thead><tbody>\",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),P=(this._getFirstDayOfMonth(et,Z)-u+7)%7,I=Math.ceil((P+A)/7),H=Q?this.maxRows>I?this.maxRows:I:I,this.maxRows=H,z=this._daylightSavingAdjust(new Date(et,Z,1-P)),F=0;H>F;F++){for(M+=\"<tr>\",E=d?\"<td class='ui-datepicker-week-col'>\"+this._get(e,\"calculateWeek\")(z)+\"</td>\":\"\",x=0;7>x;x++)O=g?g.apply(e.input?e.input[0]:null,[z]):[!0,\"\"],j=z.getMonth()!==Z,W=j&&!y||!O[0]||X&&X>z||$&&z>$,E+=\"<td class='\"+((x+u+6)%7>=5?\" ui-datepicker-week-end\":\"\")+(j?\" ui-datepicker-other-month\":\"\")+(z.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===z.getTime()&&b.getTime()===D.getTime()?\" \"+this._dayOverClass:\"\")+(W?\" \"+this._unselectableClass+\" ui-state-disabled\":\"\")+(j&&!v?\"\":\" \"+O[1]+(z.getTime()===G.getTime()?\" \"+this._currentClass:\"\")+(z.getTime()===R.getTime()?\" ui-datepicker-today\":\"\"))+\"'\"+(j&&!v||!O[2]?\"\":\" title='\"+O[2].replace(/'/g,\"&#39;\")+\"'\")+(W?\"\":\" data-handler='selectDay' data-event='click' data-month='\"+z.getMonth()+\"' data-year='\"+z.getFullYear()+\"'\")+\">\"+(j&&!v?\"&#xa0;\":W?\"<span class='ui-state-default'>\"+z.getDate()+\"</span>\":\"<a class='ui-state-default\"+(z.getTime()===R.getTime()?\" ui-state-highlight\":\"\")+(z.getTime()===G.getTime()?\" ui-state-active\":\"\")+(j?\" ui-priority-secondary\":\"\")+\"' href='#'>\"+z.getDate()+\"</a>\")+\"</td>\",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);M+=E+\"</tr>\"}Z++,Z>11&&(Z=0,et++),M+=\"</tbody></table>\"+(Q?\"</div>\"+(K[0]>0&&T===K[1]-1?\"<div class='ui-datepicker-row-break'></div>\":\"\"):\"\"),k+=M}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,\"changeMonth\"),v=this._get(e,\"changeYear\"),y=this._get(e,\"showMonthAfterYear\"),b=\"<div class='ui-datepicker-title'>\",_=\"\";if(a||!g)_+=\"<span class='ui-datepicker-month'>\"+o[t]+\"</span>\";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+=\"<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>\",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+=\"<option value='\"+u+\"'\"+(u===t?\" selected='selected'\":\"\")+\">\"+r[u]+\"</option>\");_+=\"</select>\"}if(y||(b+=_+(!a&&g&&v?\"\":\"&#xa0;\")),!e.yearshtml)if(e.yearshtml=\"\",a||!v)b+=\"<span class='ui-datepicker-year'>\"+i+\"</span>\";else{for(d=this._get(e,\"yearRange\").split(\":\"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||\"\")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+=\"<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>\";m>=f;f++)e.yearshtml+=\"<option value='\"+f+\"'\"+(f===i?\" selected='selected'\":\"\")+\">\"+f+\"</option>\";e.yearshtml+=\"</select>\",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,\"yearSuffix\"),y&&(b+=(!a&&g&&v?\"\":\"&#xa0;\")+_),b+=\"</div>\"},_adjustInstDate:function(e,t,i){var s=e.drawYear+(\"Y\"===i?t:0),n=e.drawMonth+(\"M\"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+(\"D\"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),(\"M\"===i||\"Y\"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,\"min\"),s=this._getMinMaxDate(e,\"max\"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,\"onChangeMonthYear\");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,\"numberOfMonths\");return null==t?[1,1]:\"number\"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+\"Date\"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,\"min\"),a=this._getMinMaxDate(e,\"max\"),o=null,r=null,h=this._get(e,\"yearRange\");return h&&(i=h.split(\":\"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\\-].*/)&&(o+=s),i[1].match(/[+\\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,\"shortYearCutoff\");return t=\"string\"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,\"dayNamesShort\"),dayNames:this._get(e,\"dayNames\"),monthNamesShort:this._get(e,\"monthNamesShort\"),monthNames:this._get(e,\"monthNames\")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?\"object\"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,\"dateFormat\"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e(\"#\"+e.datepicker._mainDivId).length&&e(\"body\").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return\"string\"!=typeof t||\"isDisabled\"!==t&&\"getDate\"!==t&&\"widget\"!==t?\"option\"===t&&2===arguments.length&&\"string\"==typeof arguments[1]?e.datepicker[\"_\"+t+\"Datepicker\"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){\"string\"==typeof t?e.datepicker[\"_\"+t+\"Datepicker\"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker[\"_\"+t+\"Datepicker\"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version=\"1.11.4\",e.datepicker,e.widget(\"ui.draggable\",e.ui.mouse,{version:\"1.11.4\",widgetEventPrefix:\"drag\",options:{addClasses:!0,appendTo:\"parent\",axis:!1,connectToSortable:!1,containment:!1,cursor:\"auto\",cursorAt:!1,grid:!1,handle:!1,helper:\"original\",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:\"default\",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:\"both\",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){\"original\"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this.element.addClass(\"ui-draggable\"),this.options.disabled&&this.element.addClass(\"ui-draggable-disabled\"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),\"handle\"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(\".ui-draggable-dragging\")?(this.destroyOnClear=!0,void 0):(this.element.removeClass(\"ui-draggable ui-draggable-dragging ui-draggable-disabled\"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.options;return this._blurActiveElement(t),this.helper||i.disabled||e(t.target).closest(\".ui-resizable-handle\").length>0?!1:(this.handle=this._getHandle(t),this.handle?(this._blockFrames(i.iframeFix===!0?\"iframe\":i.iframeFix),!0):!1)},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=e(this);return e(\"<div>\").css(\"position\",\"absolute\").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var i=this.document[0];if(this.handleElement.is(t.target))try{i.activeElement&&\"body\"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(s){}},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass(\"ui-draggable-dragging\"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css(\"position\"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return\"fixed\"===e(this).css(\"position\")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger(\"start\",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._normalizeRightBottom(),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(e){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:e.pageX-this.offset.left,top:e.pageY-this.offset.top}},_mouseDrag:function(t,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo(\"absolute\"),!i){var s=this._uiHash();if(this._trigger(\"drag\",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+\"px\",this.helper[0].style.top=this.position.top+\"px\",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),\"invalid\"===this.options.revert&&!s||\"valid\"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger(\"stop\",t)!==!1&&i._clear()}):this._trigger(\"stop\",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(\".ui-draggable-dragging\")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass(\"ui-draggable-handle\")},_removeHandleClassName:function(){this.handleElement.removeClass(\"ui-draggable-handle\")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper),n=s?e(i.helper.apply(this.element[0],[t])):\"clone\"===i.helper?this.element.clone().removeAttr(\"id\"):this.element;return n.parents(\"body\").length||n.appendTo(\"parent\"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css(\"position\"))||n.css(\"position\",\"absolute\"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css(\"position\"))||(this.element[0].style.position=\"relative\")},_adjustOffsetFromHelper:function(t){\"string\"==typeof t&&(t=t.split(\" \")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),\"left\"in t&&(this.offset.click.left=t.left+this.margins.left),\"right\"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),\"top\"in t&&(this.offset.click.top=t.top+this.margins.top),\"bottom\"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return\"absolute\"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css(\"borderTopWidth\"),10)||0),left:t.left+(parseInt(this.offsetParent.css(\"borderLeftWidth\"),10)||0)}},_getRelativeOffset:function(){if(\"relative\"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css(\"top\"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css(\"left\"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css(\"marginLeft\"),10)||0,top:parseInt(this.element.css(\"marginTop\"),10)||0,right:parseInt(this.element.css(\"marginRight\"),10)||0,bottom:parseInt(this.element.css(\"marginBottom\"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?\"window\"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):\"document\"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):(\"parent\"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t=/(scroll|auto)/.test(i.css(\"overflow\")),this.containment=[(parseInt(i.css(\"borderLeftWidth\"),10)||0)+(parseInt(i.css(\"paddingLeft\"),10)||0),(parseInt(i.css(\"borderTopWidth\"),10)||0)+(parseInt(i.css(\"paddingTop\"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css(\"borderRightWidth\"),10)||0)-(parseInt(i.css(\"paddingRight\"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css(\"borderBottomWidth\"),10)||0)-(parseInt(i.css(\"paddingBottom\"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)\n},_convertPositionTo:function(e,t){t||(t=this.position);var i=\"absolute\"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-(\"fixed\"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-(\"fixed\"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),\"y\"===o.axis&&(h=this.originalPageX),\"x\"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(\"fixed\"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(\"fixed\"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this.helper.removeClass(\"ui-draggable-dragging\"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_normalizeRightBottom:function(){\"y\"!==this.options.axis&&\"auto\"!==this.helper.css(\"right\")&&(this.helper.width(this.helper.width()),this.helper.css(\"right\",\"auto\")),\"x\"!==this.options.axis&&\"auto\"!==this.helper.css(\"bottom\")&&(this.helper.height(this.helper.height()),this.helper.css(\"bottom\",\"auto\"))},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo(\"absolute\"),s.offset=this.positionAbs),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add(\"draggable\",\"connectToSortable\",{start:function(t,i,s){var n=e.extend({},i,{item:s.element});s.sortables=[],e(s.options.connectToSortable).each(function(){var i=e(this).sortable(\"instance\");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger(\"activate\",t,n))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,e.each(s.sortables,function(){var e=this;e.isOver?(e.isOver=0,s.cancelHelperRemoval=!0,e.cancelHelperRemoval=!1,e._storedCSS={position:e.placeholder.css(\"position\"),top:e.placeholder.css(\"top\"),left:e.placeholder.css(\"left\")},e._mouseStop(t),e.options.helper=e.options._helper):(e.cancelHelperRemoval=!0,e._trigger(\"deactivate\",t,n))})},drag:function(t,i,s){e.each(s.sortables,function(){var n=!1,a=this;a.positionAbs=s.positionAbs,a.helperProportions=s.helperProportions,a.offset.click=s.offset.click,a._intersectsWith(a.containerCache)&&(n=!0,e.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==a&&this._intersectsWith(this.containerCache)&&e.contains(a.element[0],this.element[0])&&(n=!1),n})),n?(a.isOver||(a.isOver=1,s._parent=i.helper.parent(),a.currentItem=i.helper.appendTo(a.element).data(\"ui-sortable-item\",!0),a.options._helper=a.options.helper,a.options.helper=function(){return i.helper[0]},t.target=a.currentItem[0],a._mouseCapture(t,!0),a._mouseStart(t,!0,!0),a.offset.click.top=s.offset.click.top,a.offset.click.left=s.offset.click.left,a.offset.parent.left-=s.offset.parent.left-a.offset.parent.left,a.offset.parent.top-=s.offset.parent.top-a.offset.parent.top,s._trigger(\"toSortable\",t),s.dropped=a.element,e.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,a.fromOutside=s),a.currentItem&&(a._mouseDrag(t),i.position=a.position)):a.isOver&&(a.isOver=0,a.cancelHelperRemoval=!0,a.options._revert=a.options.revert,a.options.revert=!1,a._trigger(\"out\",t,a._uiHash(a)),a._mouseStop(t,!0),a.options.revert=a.options._revert,a.options.helper=a.options._helper,a.placeholder&&a.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(t),i.position=s._generatePosition(t,!0),s._trigger(\"fromSortable\",t),s.dropped=!1,e.each(s.sortables,function(){this.refreshPositions()}))})}}),e.ui.plugin.add(\"draggable\",\"cursor\",{start:function(t,i,s){var n=e(\"body\"),a=s.options;n.css(\"cursor\")&&(a._cursor=n.css(\"cursor\")),n.css(\"cursor\",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e(\"body\").css(\"cursor\",n._cursor)}}),e.ui.plugin.add(\"draggable\",\"opacity\",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css(\"opacity\")&&(a._opacity=n.css(\"opacity\")),n.css(\"opacity\",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css(\"opacity\",n._opacity)}}),e.ui.plugin.add(\"draggable\",\"scroll\",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&\"HTML\"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&\"HTML\"!==o.tagName?(n.axis&&\"x\"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&\"y\"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&\"x\"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&\"y\"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add(\"draggable\",\"snap\",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||\":data(ui-draggable)\":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left-s.margins.left,l=h+s.snapElements[c].width,u=s.snapElements[c].top-s.margins.top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):(\"inner\"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo(\"relative\",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.top=s._convertPositionTo(\"relative\",{top:d,left:0}).top),o&&(i.position.left=s._convertPositionTo(\"relative\",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo(\"relative\",{top:0,left:l}).left)),p=n||a||o||r,\"outer\"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo(\"relative\",{top:u,left:0}).top),a&&(i.position.top=s._convertPositionTo(\"relative\",{top:d-s.helperProportions.height,left:0}).top),o&&(i.position.left=s._convertPositionTo(\"relative\",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo(\"relative\",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add(\"draggable\",\"stack\",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css(\"zIndex\"),10)||0)-(parseInt(e(i).css(\"zIndex\"),10)||0)});o.length&&(n=parseInt(e(o[0]).css(\"zIndex\"),10)||0,e(o).each(function(t){e(this).css(\"zIndex\",n+t)}),this.css(\"zIndex\",n+o.length))}}),e.ui.plugin.add(\"draggable\",\"zIndex\",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css(\"zIndex\")&&(a._zIndex=n.css(\"zIndex\")),n.css(\"zIndex\",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css(\"zIndex\",n._zIndex)}}),e.ui.draggable,e.widget(\"ui.resizable\",e.ui.mouse,{version:\"1.11.4\",widgetEventPrefix:\"resize\",options:{alsoResize:!1,animate:!1,animateDuration:\"slow\",animateEasing:\"swing\",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:\"e,s,se\",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if(\"hidden\"===e(t).css(\"overflow\"))return!1;var s=i&&\"left\"===i?\"scrollLeft\":\"scrollTop\",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass(\"ui-resizable\"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||\"ui-resizable-helper\":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(e(\"<div class='ui-wrapper' style='overflow: hidden;'></div>\").css({position:this.element.css(\"position\"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css(\"top\"),left:this.element.css(\"left\")})),this.element=this.element.parent().data(\"ui-resizable\",this.element.resizable(\"instance\")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css(\"marginLeft\"),marginTop:this.originalElement.css(\"marginTop\"),marginRight:this.originalElement.css(\"marginRight\"),marginBottom:this.originalElement.css(\"marginBottom\")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css(\"resize\"),this.originalElement.css(\"resize\",\"none\"),this._proportionallyResizeElements.push(this.originalElement.css({position:\"static\",zoom:1,display:\"block\"})),this.originalElement.css({margin:this.originalElement.css(\"margin\")}),this._proportionallyResize()),this.handles=r.handles||(e(\".ui-resizable-handle\",this.element).length?{n:\".ui-resizable-n\",e:\".ui-resizable-e\",s:\".ui-resizable-s\",w:\".ui-resizable-w\",se:\".ui-resizable-se\",sw:\".ui-resizable-sw\",ne:\".ui-resizable-ne\",nw:\".ui-resizable-nw\"}:\"e,s,se\"),this._handles=e(),this.handles.constructor===String)for(\"all\"===this.handles&&(this.handles=\"n,e,s,w,se,sw,ne,nw\"),t=this.handles.split(\",\"),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a=\"ui-resizable-\"+s,n=e(\"<div class='ui-resizable-handle \"+a+\"'></div>\"),n.css({zIndex:r.zIndex}),\"se\"===s&&n.addClass(\"ui-icon ui-icon-gripsmall-diagonal-se\"),this.handles[s]=\".ui-resizable-\"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=e(this.handles[i]),this._on(this.handles[i],{mousedown:o._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=[\"padding\",/ne|nw|n/.test(i)?\"Top\":/se|sw|s/.test(i)?\"Bottom\":/^e$/.test(i)?\"Right\":\"Left\"].join(\"\"),t.css(n,a),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(\".ui-resizable-handle\")),this._handles.disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:\"se\")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass(\"ui-resizable-autohide\").mouseenter(function(){r.disabled||(e(this).removeClass(\"ui-resizable-autohide\"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass(\"ui-resizable-autohide\"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass(\"ui-resizable ui-resizable-disabled ui-resizable-resizing\").removeData(\"resizable\").removeData(\"ui-resizable\").unbind(\".resizable\").find(\".ui-resizable-handle\").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css(\"position\"),width:t.outerWidth(),height:t.outerHeight(),top:t.css(\"top\"),left:t.css(\"left\")}).insertAfter(t),t.remove()),this.originalElement.css(\"resize\",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css(\"left\")),s=this._num(this.helper.css(\"top\")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio=\"number\"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(\".ui-resizable-\"+this.axis).css(\"cursor\"),e(\"body\").css(\"cursor\",\"auto\"===n?this.axis+\"-resize\":n),o.addClass(\"ui-resizable-resizing\"),this._propagate(\"start\",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate(\"resize\",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger(\"resize\",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],\"left\")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css(\"left\"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css(\"top\"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e(\"body\").css(\"cursor\",\"auto\"),this.element.removeClass(\"ui-resizable-resizing\"),this._propagate(\"stop\",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+\"px\"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+\"px\"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+\"px\"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+\"px\"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),\"sw\"===s&&(e.left=t.left+(i.width-e.width),e.top=null),\"nw\"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css(\"borderTopWidth\"),e.css(\"borderRightWidth\"),e.css(\"borderBottomWidth\"),e.css(\"borderLeftWidth\")],n=[e.css(\"paddingTop\"),e.css(\"paddingRight\"),e.css(\"paddingBottom\"),e.css(\"paddingLeft\")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e(\"<div style='overflow:hidden;'></div>\"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:\"absolute\",left:this.elementOffset.left+\"px\",top:this.elementOffset.top+\"px\",zIndex:++i.zIndex}),this.helper.appendTo(\"body\").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),\"resize\"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add(\"resizable\",\"animate\",{stop:function(t){var i=e(this).resizable(\"instance\"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],\"left\")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css(\"left\"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css(\"top\"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css(\"width\"),10),height:parseInt(i.element.css(\"height\"),10),top:parseInt(i.element.css(\"top\"),10),left:parseInt(i.element.css(\"left\"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate(\"resize\",t)}})}}),e.ui.plugin.add(\"resizable\",\"containment\",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable(\"instance\"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e([\"Top\",\"Right\",\"Left\",\"Bottom\"]).each(function(e,s){i[e]=h._num(t.css(\"padding\"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,\"left\")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable(\"instance\"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css(\"position\"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css(\"position\")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable(\"instance\"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css(\"position\"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css(\"position\"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add(\"resizable\",\"alsoResize\",{start:function(){var t=e(this).resizable(\"instance\"),i=t.options;e(i.alsoResize).each(function(){var t=e(this);t.data(\"ui-resizable-alsoresize\",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css(\"left\"),10),top:parseInt(t.css(\"top\"),10)})})},resize:function(t,i){var s=e(this).resizable(\"instance\"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0};e(n.alsoResize).each(function(){var t=e(this),s=e(this).data(\"ui-resizable-alsoresize\"),n={},a=t.parents(i.originalElement[0]).length?[\"width\",\"height\"]:[\"width\",\"height\",\"top\",\"left\"];e.each(a,function(e,t){var i=(s[t]||0)+(r[t]||0);i&&i>=0&&(n[t]=i||null)}),t.css(n)})},stop:function(){e(this).removeData(\"resizable-alsoresize\")}}),e.ui.plugin.add(\"resizable\",\"ghost\",{start:function(){var t=e(this).resizable(\"instance\"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:\"block\",position:\"relative\",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass(\"ui-resizable-ghost\").addClass(\"string\"==typeof i.ghost?i.ghost:\"\"),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable(\"instance\");t.ghost&&t.ghost.css({position:\"relative\",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable(\"instance\");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add(\"resizable\",\"grid\",{resize:function(){var t,i=e(this).resizable(\"instance\"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h=\"number\"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=l-t.width,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget(\"ui.dialog\",{version:\"1.11.4\",options:{appendTo:\"body\",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:\"Close\",dialogClass:\"\",draggable:!0,hide:null,height:\"auto\",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:\"center\",at:\"center\",of:window,collision:\"fit\",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css(\"top\",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr(\"title\"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr(\"title\").addClass(\"ui-dialog-content ui-widget-content\").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||\"body\").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().removeClass(\"ui-dialog-content ui-widget-content\").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr(\"title\",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger(\"beforeClose\",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(\":focusable\").focus().length)try{i=this.document[0].activeElement,i&&\"body\"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger(\"close\",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(\".ui-front:visible\").map(function(){return+e(this).css(\"z-index\")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css(\"z-index\")&&(this.uiDialog.css(\"z-index\",a+1),s=!0),s&&!i&&this._trigger(\"focus\",t),s},open:function(){var t=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css(\"z-index\",this.uiDialog.css(\"z-index\")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger(\"focus\")}),this._makeFocusTarget(),this._trigger(\"open\"),void 0)},_focusTabbable:function(){var e=this._focusedElement;e||(e=this.element.find(\"[autofocus]\")),e.length||(e=this.element.find(\":tabbable\")),e.length||(e=this.uiDialogButtonPane.find(\":tabbable\")),e.length||(e=this.uiDialogTitlebarClose.filter(\":tabbable\")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e(\"<div>\").addClass(\"ui-dialog ui-widget ui-widget-content ui-corner-all ui-front \"+this.options.dialogClass).hide().attr({tabIndex:-1,role:\"dialog\"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0;\nif(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(\":tabbable\"),s=i.filter(\":first\"),n=i.filter(\":last\");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find(\"[aria-describedby]\").length||this.uiDialog.attr({\"aria-describedby\":this.element.uniqueId().attr(\"id\")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e(\"<div>\").addClass(\"ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix\").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(\".ui-dialog-titlebar-close\")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e(\"<button type='button'></button>\").button({label:this.options.closeText,icons:{primary:\"ui-icon-closethick\"},text:!1}).addClass(\"ui-dialog-titlebar-close\").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e(\"<span>\").uniqueId().addClass(\"ui-dialog-title\").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({\"aria-labelledby\":t.attr(\"id\")})},_title:function(e){this.options.title||e.html(\"&#160;\"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e(\"<div>\").addClass(\"ui-dialog-buttonpane ui-widget-content ui-helper-clearfix\"),this.uiButtonSet=e(\"<div>\").addClass(\"ui-dialog-buttonset\").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass(\"ui-dialog-buttons\"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:\"button\"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e(\"<button></button>\",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass(\"ui-dialog-buttons\"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:\".ui-dialog-content, .ui-dialog-titlebar-close\",handle:\".ui-dialog-titlebar\",containment:\"document\",start:function(s,n){e(this).addClass(\"ui-dialog-dragging\"),i._blockFrames(),i._trigger(\"dragStart\",s,t(n))},drag:function(e,s){i._trigger(\"drag\",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:\"left top\",at:\"left\"+(o>=0?\"+\":\"\")+o+\" \"+\"top\"+(r>=0?\"+\":\"\")+r,of:i.window},e(this).removeClass(\"ui-dialog-dragging\"),i._unblockFrames(),i._trigger(\"dragStop\",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css(\"position\"),o=\"string\"==typeof n?n:\"n,e,s,w,se,sw,ne,nw\";this.uiDialog.resizable({cancel:\".ui-dialog-content\",containment:\"document\",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass(\"ui-dialog-resizing\"),i._blockFrames(),i._trigger(\"resizeStart\",s,t(n))},resize:function(e,s){i._trigger(\"resize\",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:\"left top\",at:\"left\"+(r>=0?\"+\":\"\")+r+\" \"+\"top\"+(h>=0?\"+\":\"\")+h,of:i.window},e(this).removeClass(\"ui-dialog-resizing\"),i._unblockFrames(),i._trigger(\"resizeStop\",n,t(a))}}).css(\"position\",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data(\"ui-dialog-instances\");return e||(e=[],this.document.data(\"ui-dialog-instances\",e)),e},_minHeight:function(){var e=this.options;return\"auto\"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(\":visible\");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(\":data(ui-resizable)\")&&this.uiDialog.resizable(\"option\",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;\"dialogClass\"===e&&n.removeClass(this.options.dialogClass).addClass(t),\"disabled\"!==e&&(this._super(e,t),\"appendTo\"===e&&this.uiDialog.appendTo(this._appendTo()),\"buttons\"===e&&this._createButtons(),\"closeText\"===e&&this.uiDialogTitlebarClose.button({label:\"\"+t}),\"draggable\"===e&&(i=n.is(\":data(ui-draggable)\"),i&&!t&&n.draggable(\"destroy\"),!i&&t&&this._makeDraggable()),\"position\"===e&&this._position(),\"resizable\"===e&&(s=n.is(\":data(ui-resizable)\"),s&&!t&&n.resizable(\"destroy\"),s&&\"string\"==typeof t&&n.resizable(\"option\",\"handles\",t),s||t===!1||this._makeResizable()),\"title\"===e&&this._title(this.uiDialogTitlebar.find(\".ui-dialog-title\")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:\"auto\",minHeight:0,maxHeight:\"none\",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:\"auto\",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i=\"number\"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):\"none\",\"auto\"===s.height?this.element.css({minHeight:t,maxHeight:i,height:\"auto\"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(\":data(ui-resizable)\")&&this.uiDialog.resizable(\"option\",\"minHeight\",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find(\"iframe\").map(function(){var t=e(this);return e(\"<div>\").css({position:\"absolute\",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(\".ui-dialog\").length?!0:!!e(t.target).closest(\".ui-datepicker\").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data(\"ui-dialog-overlays\")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e(\"<div>\").addClass(\"ui-widget-overlay ui-front\").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:\"_keepFocus\"}),this.document.data(\"ui-dialog-overlays\",(this.document.data(\"ui-dialog-overlays\")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data(\"ui-dialog-overlays\")-1;e?this.document.data(\"ui-dialog-overlays\",e):this.document.unbind(\"focusin\").removeData(\"ui-dialog-overlays\"),this.overlay.remove(),this.overlay=null}}}),e.widget(\"ui.droppable\",{version:\"1.11.4\",widgetEventPrefix:\"drop\",options:{accept:\"*\",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:\"default\",tolerance:\"intersect\",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass(\"ui-droppable\")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass(\"ui-droppable ui-droppable-disabled\")},_setOption:function(t,i){if(\"accept\"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if(\"scope\"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger(\"activate\",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger(\"deactivate\",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger(\"over\",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger(\"out\",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(\":data(ui-droppable)\").not(\".ui-draggable-dragging\").each(function(){var i=e(this).droppable(\"instance\");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger(\"drop\",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left+t.margins.left,o=(t.positionAbs||t.position.absolute).top+t.margins.top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case\"fit\":return a>=l&&d>=r&&o>=u&&c>=h;case\"intersect\":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case\"pointer\":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case\"touch\":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{\"default\":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(\":data(ui-droppable)\").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible=\"none\"!==a[s].element.css(\"display\"),a[s].visible&&(\"mousedown\"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil(\"body\").bind(\"scroll.droppable\",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?\"isout\":o&&!this.isover?\"isover\":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(\":data(ui-droppable)\").filter(function(){return e(this).droppable(\"instance\").options.scope===n}),a.length&&(s=e(a[0]).droppable(\"instance\"),s.greedyChild=\"isover\"===r)),s&&\"isover\"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this[\"isout\"===r?\"isover\":\"isout\"]=!1,this[\"isover\"===r?\"_over\":\"_out\"].call(this,i),s&&\"isout\"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil(\"body\").unbind(\"scroll.droppable\"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable;var y=\"ui-effects-\",b=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||\"rgba\";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?(\"0,0,0,0\"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o=\"backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor\",r=/^([\\-+])=\\s*(\\d+\\.?\\d*)/,h=[{re:/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,space:\"hsla\",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:\"byte\"},green:{idx:1,type:\"byte\"},blue:{idx:2,type:\"byte\"}}},hsla:{props:{hue:{idx:0,type:\"degrees\"},saturation:{idx:1,type:\"percent\"},lightness:{idx:2,type:\"percent\"}}}},d={\"byte\":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e(\"<p>\")[0],f=e.each;p.style.cssText=\"background-color:rgba(1,1,1,.5)\",c.rgba=p.style.backgroundColor.indexOf(\"rgba\")>-1,f(u,function(e,t){t.cache=\"_\"+e,t.props.alpha={idx:3,type:\"percent\",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c=\"array\"),\"string\"===c?this.parse(s(n)||a._default):\"array\"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):\"object\"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if(\"alpha\"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l(\"transparent\"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t=\"rgba(\",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t=\"rgb(\"),t+i.join()+\")\"},toHslaString:function(){var t=\"hsla(\",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+\"%\"),e});return 1===i[3]&&(i.pop(),t=\"hsl(\"),t+i.join()+\")\"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),\"#\"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?\"0\"+e:e}).join(\"\")},toString:function(){return 0===this._rgba[3]?\"transparent\":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d=\"array\"===r||\"object\"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d[\"object\"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h=\"alpha\"===t?this._hsla?\"hsla\":\"rgba\":s,l=this[h](),u=l[i.idx];return\"undefined\"===o?u:(\"function\"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:(\"string\"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*(\"+\"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(\" \");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r=\"\";if(\"transparent\"!==n&&(\"string\"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o=\"backgroundColor\"===i?t.parentNode:t;(\"\"===r||\"transparent\"===r)&&o&&o.style;)try{r=e.css(o,\"backgroundColor\"),o=o.parentNode}catch(h){}n=n.blend(r&&\"transparent\"!==r?r:\"_default\")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f([\"Top\",\"Right\",\"Bottom\",\"Left\"],function(i,s){t[\"border\"+s+\"Color\"]=e}),t}},a=e.Color.names={aqua:\"#00ffff\",black:\"#000000\",blue:\"#0000ff\",fuchsia:\"#ff00ff\",gray:\"#808080\",green:\"#008000\",lime:\"#00ff00\",maroon:\"#800000\",navy:\"#000080\",olive:\"#808000\",purple:\"#800080\",red:\"#ff0000\",silver:\"#c0c0c0\",teal:\"#008080\",white:\"#ffffff\",yellow:\"#ffff00\",transparent:[null,null,null,0],_default:\"#ffffff\"}}(b),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],\"string\"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)\"string\"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=[\"add\",\"remove\",\"toggle\"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each([\"borderLeftStyle\",\"borderRightStyle\",\"borderBottomStyle\",\"borderTopStyle\"],function(t,i){e.fx.step[i]=function(e){(\"none\"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(b.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr(\"class\")||\"\",l=h.children?o.find(\"*\").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+\"Class\"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr(\"class\",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,\"\")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return\"boolean\"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),(\"number\"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:\"number\"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||\"number\"==typeof t||e.fx.speeds[t]?!0:\"string\"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:\"object\"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:\"1.11.4\",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(y+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(y+t[s]),void 0===i&&(i=\"\"),e.css(t[s],i))},setMode:function(e,t){return\"toggle\"===t&&(t=e.is(\":hidden\")?\"show\":\"hide\"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case\"top\":i=0;break;case\"middle\":i=.5;break;case\"bottom\":i=1;break;default:i=e[0]/t.height}switch(e[1]){case\"left\":s=0;break;case\"center\":s=.5;break;case\"right\":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(\".ui-effects-wrapper\"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),\"float\":t.css(\"float\")},s=e(\"<div></div>\").addClass(\"ui-effects-wrapper\").css({fontSize:\"100%\",background:\"transparent\",border:\"none\",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),\"static\"===t.css(\"position\")?(s.css({position:\"relative\"}),t.css({position:\"relative\"})):(e.extend(i,{position:t.css(\"position\"),zIndex:t.css(\"z-index\")}),e.each([\"top\",\"left\",\"bottom\",\"right\"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]=\"auto\")}),t.css({position:\"relative\",top:0,left:0,right:\"auto\",bottom:\"auto\"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(\".ui-effects-wrapper\")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(\":hidden\")?\"hide\"===r:\"show\"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||\"fx\",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode=\"show\",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode=\"hide\",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||\"boolean\"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode=\"toggle\",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each([\"em\",\"px\",\"%\",\"pt\"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each([\"Quad\",\"Cubic\",\"Quart\",\"Quint\",\"Expo\"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing[\"easeIn\"+t]=i,e.easing[\"easeOut\"+t]=function(e){return 1-i(1-e)},e.easing[\"easeInOut\"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=[\"position\",\"top\",\"bottom\",\"left\",\"right\",\"height\",\"width\"],u=e.effects.setMode(o,t.mode||\"hide\"),d=t.direction||\"up\",c=r.test(d),p=c?\"height\":\"width\",f=c?\"top\":\"left\",m=h.test(d),g={},v=\"show\"===u;o.parent().is(\".ui-effects-wrapper\")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:\"hidden\"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?\"bottom\":\"right\",0).css(c?\"top\":\"left\",\"auto\").css({position:\"absolute\"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){\"hide\"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=[\"position\",\"top\",\"bottom\",\"left\",\"right\",\"height\",\"width\"],h=e.effects.setMode(o,t.mode||\"effect\"),l=\"hide\"===h,u=\"show\"===h,d=t.direction||\"up\",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v=\"up\"===d||\"down\"===d?\"top\":\"left\",y=\"up\"===d||\"left\"===d,b=o.queue(),_=b.length;for((u||l)&&r.push(\"opacity\"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o[\"top\"===v?\"outerHeight\":\"outerWidth\"]()/3),u&&(a={opacity:1},a[v]=0,o.css(\"opacity\",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?\"-=\":\"+=\")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?\"-=\":\"+=\")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=[\"position\",\"top\",\"bottom\",\"left\",\"right\",\"height\",\"width\"],h=e.effects.setMode(o,t.mode||\"hide\"),l=\"show\"===h,u=t.direction||\"vertical\",d=\"vertical\"===u,c=d?\"height\":\"width\",p=d?\"top\":\"left\",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:\"hidden\"}),n=\"IMG\"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=[\"position\",\"top\",\"bottom\",\"left\",\"right\",\"opacity\",\"height\",\"width\"],o=e.effects.setMode(n,t.mode||\"hide\"),r=\"show\"===o,h=t.direction||\"left\",l=\"up\"===h||\"down\"===h?\"top\":\"left\",u=\"up\"===h||\"left\"===h?\"pos\":\"neg\",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n[\"top\"===l?\"outerHeight\":\"outerWidth\"](!0)/2,r&&n.css(\"opacity\",0).css(l,\"pos\"===u?-s:s),d[l]=(r?\"pos\"===u?\"+=\":\"-=\":\"pos\"===u?\"-=\":\"+=\")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){\"hide\"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:\"visible\"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||\"hide\"),m=\"show\"===f,g=p.show().css(\"visibility\",\"hidden\").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo(\"body\").wrap(\"<div></div>\").css({position:\"absolute\",visibility:\"visible\",left:-o*v,top:-a*y}).parent().addClass(\"ui-effects-explode\").css({position:\"absolute\",overflow:\"hidden\",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||\"toggle\");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=[\"position\",\"top\",\"bottom\",\"left\",\"right\",\"height\",\"width\"],r=e.effects.setMode(a,t.mode||\"hide\"),h=\"show\"===r,l=\"hide\"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?[\"width\",\"height\"]:[\"height\",\"width\"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:\"hidden\"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=[\"backgroundImage\",\"backgroundColor\",\"opacity\"],a=e.effects.setMode(s,t.mode||\"show\"),o={backgroundColor:s.css(\"backgroundColor\")};\"hide\"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:\"none\",backgroundColor:t.color||\"#ffff99\"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){\"hide\"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=[\"position\",\"top\",\"bottom\",\"left\",\"right\",\"width\",\"height\",\"overflow\",\"opacity\"],h=[\"position\",\"top\",\"bottom\",\"left\",\"right\",\"overflow\",\"opacity\"],l=[\"width\",\"height\",\"overflow\"],u=[\"fontSize\"],d=[\"borderTopWidth\",\"borderBottomWidth\",\"paddingTop\",\"paddingBottom\"],c=[\"borderLeftWidth\",\"borderRightWidth\",\"paddingLeft\",\"paddingRight\"],p=e.effects.setMode(o,t.mode||\"effect\"),f=t.restore||\"effect\"!==p,m=t.scale||\"both\",g=t.origin||[\"middle\",\"center\"],v=o.css(\"position\"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};\"show\"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},\"toggle\"===t.mode&&\"show\"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||(\"show\"===p?b:s),o.to=t.to||(\"hide\"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},(\"box\"===m||\"both\"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),(\"content\"===m||\"both\"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css(\"overflow\",\"hidden\").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),(\"content\"===m||\"both\"===m)&&(d=d.concat([\"marginTop\",\"marginBottom\"]).concat(u),c=c.concat([\"marginLeft\",\"marginRight\"]),l=r.concat(d).concat(c),o.find(\"*[width]\").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};\nf&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css(\"opacity\",o.from.opacity),\"hide\"===p&&o.hide(),e.effects.restore(o,y),f||(\"static\"===v?o.css({position:\"relative\",top:o.to.top,left:o.to.left}):e.each([\"top\",\"left\"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return\"auto\"===i?n+\"px\":s+n+\"px\"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||\"effect\"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:\"hide\"===a?0:100),r=t.direction||\"both\",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:\"horizontal\"!==r?o/100:1,x:\"vertical\"!==r?o/100:1};n.effect=\"size\",n.queue=!1,n.complete=i,\"effect\"!==a&&(n.origin=h||[\"middle\",\"center\"],n.restore=!0),n.from=t.from||(\"show\"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&(\"show\"===a&&(n.from.opacity=0,n.to.opacity=1),\"hide\"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||\"hide\"),a=\"hide\"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:\"scale\",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||\"show\"),o=\"show\"===a,r=\"hide\"===a,h=o||\"hide\"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(\":visible\"))&&(n.css(\"opacity\",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=[\"position\",\"top\",\"bottom\",\"left\",\"right\",\"height\",\"width\"],o=e.effects.setMode(n,t.mode||\"effect\"),r=t.direction||\"left\",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c=\"up\"===r||\"down\"===r?\"top\":\"left\",p=\"up\"===r||\"left\"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?\"-=\":\"+=\")+h,m[c]=(p?\"+=\":\"-=\")+2*h,g[c]=(p?\"-=\":\"+=\")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){\"hide\"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=[\"position\",\"top\",\"bottom\",\"left\",\"right\",\"width\",\"height\"],o=e.effects.setMode(n,t.mode||\"show\"),r=\"show\"===o,h=t.direction||\"left\",l=\"up\"===h||\"down\"===h?\"top\":\"left\",u=\"up\"===h||\"left\"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n[\"top\"===l?\"outerHeight\":\"outerWidth\"](!0),e.effects.createWrapper(n).css({overflow:\"hidden\"}),r&&n.css(l,u?isNaN(s)?\"-\"+s:-s:s),d[l]=(r?u?\"+=\":\"-=\":u?\"-=\":\"+=\")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){\"hide\"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a=\"fixed\"===n.css(\"position\"),o=e(\"body\"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e(\"<div class='ui-effects-transfer'></div>\").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?\"fixed\":\"absolute\"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})},e.widget(\"ui.progressbar\",{version:\"1.11.4\",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass(\"ui-progressbar ui-widget ui-widget-content ui-corner-all\").attr({role:\"progressbar\",\"aria-valuemin\":this.min}),this.valueDiv=e(\"<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>\").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass(\"ui-progressbar ui-widget ui-widget-content ui-corner-all\").removeAttr(\"role\").removeAttr(\"aria-valuemin\").removeAttr(\"aria-valuemax\").removeAttr(\"aria-valuenow\"),this.valueDiv.remove()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,\"number\"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){\"max\"===e&&(t=Math.max(this.min,t)),\"disabled\"===e&&this.element.toggleClass(\"ui-state-disabled\",!!t).attr(\"aria-disabled\",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass(\"ui-corner-right\",t===this.options.max).width(i.toFixed(0)+\"%\"),this.element.toggleClass(\"ui-progressbar-indeterminate\",this.indeterminate),this.indeterminate?(this.element.removeAttr(\"aria-valuenow\"),this.overlayDiv||(this.overlayDiv=e(\"<div class='ui-progressbar-overlay'></div>\").appendTo(this.valueDiv))):(this.element.attr({\"aria-valuemax\":this.options.max,\"aria-valuenow\":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger(\"change\")),t===this.options.max&&this._trigger(\"complete\")}}),e.widget(\"ui.selectable\",e.ui.mouse,{version:\"1.11.4\",options:{appendTo:\"body\",autoRefresh:!0,distance:0,filter:\"*\",tolerance:\"touch\",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;this.element.addClass(\"ui-selectable\"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass(\"ui-selectee\"),t.each(function(){var t=e(this),i=t.offset();e.data(this,\"selectable-item\",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass(\"ui-selected\"),selecting:t.hasClass(\"ui-selecting\"),unselecting:t.hasClass(\"ui-unselecting\")})})},this.refresh(),this.selectees=t.addClass(\"ui-selectee\"),this._mouseInit(),this.helper=e(\"<div class='ui-selectable-helper'></div>\")},_destroy:function(){this.selectees.removeClass(\"ui-selectee\").removeData(\"selectable-item\"),this.element.removeClass(\"ui-selectable ui-selectable-disabled\"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger(\"start\",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(\".ui-selected\").each(function(){var s=e.data(this,\"selectable-item\");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass(\"ui-selected\"),s.selected=!1,s.$element.addClass(\"ui-unselecting\"),s.unselecting=!0,i._trigger(\"unselecting\",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,\"selectable-item\");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass(\"ui-selected\"),n.$element.removeClass(s?\"ui-unselecting\":\"ui-selected\").addClass(s?\"ui-selecting\":\"ui-unselecting\"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger(\"selecting\",t,{selecting:n.element}):i._trigger(\"unselecting\",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,\"selectable-item\"),l=!1;i&&i.element!==s.element[0]&&(\"touch\"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):\"fit\"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass(\"ui-selected\"),i.selected=!1),i.unselecting&&(i.$element.removeClass(\"ui-unselecting\"),i.unselecting=!1),i.selecting||(i.$element.addClass(\"ui-selecting\"),i.selecting=!0,s._trigger(\"selecting\",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass(\"ui-selecting\"),i.selecting=!1,i.$element.addClass(\"ui-selected\"),i.selected=!0):(i.$element.removeClass(\"ui-selecting\"),i.selecting=!1,i.startselected&&(i.$element.addClass(\"ui-unselecting\"),i.unselecting=!0),s._trigger(\"unselecting\",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass(\"ui-selected\"),i.selected=!1,i.$element.addClass(\"ui-unselecting\"),i.unselecting=!0,s._trigger(\"unselecting\",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(\".ui-unselecting\",this.element[0]).each(function(){var s=e.data(this,\"selectable-item\");s.$element.removeClass(\"ui-unselecting\"),s.unselecting=!1,s.startselected=!1,i._trigger(\"unselected\",t,{unselected:s.element})}),e(\".ui-selecting\",this.element[0]).each(function(){var s=e.data(this,\"selectable-item\");s.$element.removeClass(\"ui-selecting\").addClass(\"ui-selected\"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger(\"selected\",t,{selected:s.element})}),this._trigger(\"stop\",t),this.helper.remove(),!1}}),e.widget(\"ui.selectmenu\",{version:\"1.11.4\",defaultElement:\"<select>\",options:{appendTo:null,disabled:null,icons:{button:\"ui-icon-triangle-1-s\"},position:{my:\"left top\",at:\"left bottom\",collision:\"none\"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr(\"id\");this.ids={element:e,button:e+\"-button\",menu:e+\"-menu\"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this;this.label=e(\"label[for='\"+this.ids.element+\"']\").attr(\"for\",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e(\"<span>\",{\"class\":\"ui-selectmenu-button ui-widget ui-state-default ui-corner-all\",tabindex:this.options.disabled?-1:0,id:this.ids.button,role:\"combobox\",\"aria-expanded\":\"false\",\"aria-autocomplete\":\"list\",\"aria-owns\":this.ids.menu,\"aria-haspopup\":\"true\"}).insertAfter(this.element),e(\"<span>\",{\"class\":\"ui-icon \"+this.options.icons.button}).prependTo(this.button),this.buttonText=e(\"<span>\",{\"class\":\"ui-selectmenu-text\"}).appendTo(this.button),this._setText(this.buttonText,this.element.find(\"option:selected\").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one(\"focusin\",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e(\"<ul>\",{\"aria-hidden\":\"true\",\"aria-labelledby\":this.ids.button,id:this.ids.menu}),this.menuWrap=e(\"<div>\",{\"class\":\"ui-selectmenu-menu ui-front\"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:\"listbox\",select:function(e,i){e.preventDefault(),t._setSelection(),t._select(i.item.data(\"ui-selectmenu-item\"),e)},focus:function(e,i){var s=i.item.data(\"ui-selectmenu-item\");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger(\"focus\",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr(\"aria-activedescendant\",t.menuItems.eq(s.index).attr(\"id\"))}}).menu(\"instance\"),this.menu.addClass(\"ui-corner-bottom\").removeClass(\"ui-corner-all\"),this.menuInstance._off(this.menu,\"mouseleave\"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find(\"option\");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find(\"li\").not(\".ui-selectmenu-optgroup\"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data(\"ui-selectmenu-item\")),this._setOption(\"disabled\",this.element.prop(\"disabled\")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(\".ui-state-focus\").removeClass(\"ui-state-focus\"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger(\"open\",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger(\"close\",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n=\"\";e.each(i,function(i,a){a.optgroup!==n&&(e(\"<li>\",{\"class\":\"ui-selectmenu-optgroup ui-menu-divider\"+(a.element.parent(\"optgroup\").prop(\"disabled\")?\" ui-state-disabled\":\"\"),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data(\"ui-selectmenu-item\",t)},_renderItem:function(t,i){var s=e(\"<li>\");return i.disabled&&s.addClass(\"ui-state-disabled\"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html(\"&#160;\")},_move:function(e,t){var i,s,n=\".ui-menu-item\";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=\":not(.ui-state-disabled)\"),s=\"first\"===e||\"last\"===e?i[\"first\"===e?\"prevAll\":\"nextAll\"](n).eq(-1):i[e+\"All\"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?\"close\":\"open\"](e)},_setSelection:function(){var e;this.range&&(window.getSelection?(e=window.getSelection(),e.removeAllRanges(),e.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(\".ui-selectmenu-menu, #\"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(){var e;window.getSelection?(e=window.getSelection(),e.rangeCount&&(this.range=e.getRangeAt(0))):this.range=document.selection.createRange()},click:function(e){this._setSelection(),this._toggle(e)},keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move(\"prev\",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move(\"next\",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move(\"prev\",t);break;case e.ui.keyCode.RIGHT:this._move(\"next\",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move(\"first\",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move(\"last\",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass(\"ui-state-disabled\")||this._select(t.data(\"ui-selectmenu-item\"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger(\"select\",t,{item:e}),e.index!==i&&this._trigger(\"change\",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr(\"id\");this.button.attr({\"aria-labelledby\":t,\"aria-activedescendant\":t}),this.menu.attr(\"aria-activedescendant\",t)},_setOption:function(e,t){\"icons\"===e&&this.button.find(\"span.ui-icon\").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),\"appendTo\"===e&&this.menuWrap.appendTo(this._appendTo()),\"disabled\"===e&&(this.menuInstance.option(\"disabled\",t),this.button.toggleClass(\"ui-state-disabled\",t).attr(\"aria-disabled\",t),this.element.prop(\"disabled\",t),t?(this.button.attr(\"tabindex\",-1),this.close()):this.button.attr(\"tabindex\",0)),\"width\"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(\".ui-front\")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass(\"ui-corner-top\",this.isOpen).toggleClass(\"ui-corner-all\",!this.isOpen).attr(\"aria-expanded\",this.isOpen),this.menuWrap.toggleClass(\"ui-selectmenu-open\",this.isOpen),this.menu.attr(\"aria-hidden\",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width(\"\").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop(\"disabled\")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent(\"optgroup\");i.push({element:n,index:t,value:n.val(),label:n.text(),optgroup:a.attr(\"label\")||\"\",disabled:a.prop(\"disabled\")||n.prop(\"disabled\")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr(\"for\",this.ids.element)}}),e.widget(\"ui.slider\",e.ui.mouse,{version:\"1.11.4\",widgetEventPrefix:\"slide\",options:{animate:!1,distance:0,max:100,min:0,orientation:\"horizontal\",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this.element.addClass(\"ui-slider ui-slider-\"+this.orientation+\" ui-widget\"+\" ui-widget-content\"+\" ui-corner-all\"),this._refresh(),this._setOption(\"disabled\",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(\".ui-slider-handle\").addClass(\"ui-state-default ui-corner-all\"),a=\"<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>\",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join(\"\")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data(\"ui-slider-handle-index\",t)})},_createRange:function(){var t=this.options,i=\"\";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass(\"ui-slider-range-min ui-slider-range-max\").css({left:\"\",bottom:\"\"}):(this.range=e(\"<div></div>\").appendTo(this.element),i=\"ui-slider-range ui-widget-header ui-corner-all\"),this.range.addClass(i+(\"min\"===t.range||\"max\"===t.range?\" ui-slider-range-\"+t.range:\"\"))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass(\"ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all\"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass(\"ui-state-active\").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(\".ui-slider-handle\"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css(\"borderTopWidth\"),10)||0)-(parseInt(a.css(\"borderBottomWidth\"),10)||0)+(parseInt(a.css(\"marginTop\"),10)||0)},this.handles.hasClass(\"ui-state-hover\")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass(\"ui-state-active\"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=\"vertical\"===this.options.orientation?\"vertical\":\"horizontal\"},_normValueFromMouse:function(e){var t,i,s,n,a;return\"horizontal\"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),\"vertical\"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger(\"start\",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger(\"slide\",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger(\"slide\",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger(\"stop\",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger(\"change\",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch(\"range\"===t&&this.options.range===!0&&(\"min\"===i?(this.options.value=this._values(0),this.options.values=null):\"max\"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),\"disabled\"===t&&this.element.toggleClass(\"ui-state-disabled\",!!i),this._super(t,i),t){case\"orientation\":this._detectOrientation(),this.element.removeClass(\"ui-slider-horizontal ui-slider-vertical\").addClass(\"ui-slider-\"+this.orientation),this._refreshValue(),this.handles.css(\"horizontal\"===i?\"bottom\":\"left\",\"\");break;case\"value\":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case\"values\":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case\"step\":case\"min\":case\"max\":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case\"range\":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var e=this.options.max,t=this._valueMin(),i=this.options.step,s=Math.floor(+(e-t).toFixed(this._precision())/i)*i;e=s+t,this.max=parseFloat(e.toFixed(this._precision()))},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=\"\"+e,i=t.indexOf(\".\");return-1===i?0:t.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u[\"horizontal\"===h.orientation?\"left\":\"bottom\"]=i+\"%\",e(this).stop(1,1)[l?\"animate\":\"css\"](u,r.animate),h.options.range===!0&&(\"horizontal\"===h.orientation?(0===s&&h.range.stop(1,1)[l?\"animate\":\"css\"]({left:i+\"%\"},r.animate),1===s&&h.range[l?\"animate\":\"css\"]({width:i-t+\"%\"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?\"animate\":\"css\"]({bottom:i+\"%\"},r.animate),1===s&&h.range[l?\"animate\":\"css\"]({height:i-t+\"%\"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u[\"horizontal\"===this.orientation?\"left\":\"bottom\"]=i+\"%\",this.handle.stop(1,1)[l?\"animate\":\"css\"](u,r.animate),\"min\"===o&&\"horizontal\"===this.orientation&&this.range.stop(1,1)[l?\"animate\":\"css\"]({width:i+\"%\"},r.animate),\"max\"===o&&\"horizontal\"===this.orientation&&this.range[l?\"animate\":\"css\"]({width:100-i+\"%\"},{queue:!1,duration:r.animate}),\"min\"===o&&\"vertical\"===this.orientation&&this.range.stop(1,1)[l?\"animate\":\"css\"]({height:i+\"%\"},r.animate),\"max\"===o&&\"vertical\"===this.orientation&&this.range[l?\"animate\":\"css\"]({height:100-i+\"%\"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data(\"ui-slider-handle-index\");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass(\"ui-state-active\"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data(\"ui-slider-handle-index\");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass(\"ui-state-active\"))}}}),e.widget(\"ui.sortable\",e.ui.mouse,{version:\"1.11.4\",widgetEventPrefix:\"sort\",ready:!1,options:{appendTo:\"parent\",axis:!1,connectWith:!1,containment:!1,cursor:\"auto\",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:\"original\",items:\"> *\",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:\"default\",tolerance:\"intersect\",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css(\"float\"))||/inline|table-cell/.test(e.css(\"display\"))},_create:function(){this.containerCache={},this.element.addClass(\"ui-sortable\"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),\"handle\"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(\".ui-sortable-handle\").removeClass(\"ui-sortable-handle\"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass(\"ui-sortable-handle\")})},_destroy:function(){this.element.removeClass(\"ui-sortable ui-sortable-disabled\").find(\".ui-sortable-handle\").removeClass(\"ui-sortable-handle\"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+\"-item\");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||\"static\"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+\"-item\")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+\"-item\")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find(\"*\").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css(\"position\",\"absolute\"),this.cssPosition=this.helper.css(\"position\"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&\"auto\"!==o.cursor&&(a=this.document.find(\"body\"),this.storedCursor=a.css(\"cursor\"),a.css(\"cursor\",o.cursor),this.storedStylesheet=e(\"<style>*{ cursor: \"+o.cursor+\" !important; }</style>\").appendTo(a)),o.opacity&&(this.helper.css(\"opacity\")&&(this._storedOpacity=this.helper.css(\"opacity\")),this.helper.css(\"opacity\",o.opacity)),o.zIndex&&(this.helper.css(\"zIndex\")&&(this._storedZIndex=this.helper.css(\"zIndex\")),this.helper.css(\"zIndex\",o.zIndex)),this.scrollParent[0]!==this.document[0]&&\"HTML\"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger(\"start\",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger(\"activate\",t,this._uiHash(this));\nreturn e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass(\"ui-sortable-helper\"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo(\"absolute\"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&\"HTML\"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-this.document.scrollTop()<o.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed):this.window.height()-(t.pageY-this.document.scrollTop())<o.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed)),t.pageX-this.document.scrollLeft()<o.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed):this.window.width()-(t.pageX-this.document.scrollLeft())<o.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo(\"absolute\"),this.options.axis&&\"y\"===this.options.axis||(this.helper[0].style.left=this.position.left+\"px\"),this.options.axis&&\"x\"===this.options.axis||(this.helper[0].style.top=this.position.top+\"px\"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?\"next\":\"prev\"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&(\"semi-dynamic\"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?\"down\":\"up\",\"pointer\"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger(\"change\",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger(\"sort\",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&\"x\"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),a&&\"y\"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),\"original\"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass(\"ui-sortable-helper\"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger(\"deactivate\",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger(\"out\",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),\"original\"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||\"id\")||\"\").match(t.expression||/(.+)[\\-=_](.+)/);i&&s.push((t.key||i[1]+\"[]\")+\"=\"+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+\"=\"),s.join(\"&\")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||\"id\")||\"\")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d=\"x\"===this.options.axis||s+l>r&&h>s+l,c=\"y\"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return\"pointer\"===this.options.tolerance||this.options.forcePointerForContainers||\"pointer\"!==this.options.tolerance&&this.helperProportions[this.floating?\"width\":\"height\"]>e[this.floating?\"width\":\"height\"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t=\"x\"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i=\"y\"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&\"right\"===a||\"down\"===n?2:1:n&&(\"down\"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?\"right\"===n&&i||\"left\"===n&&!i:s&&(\"down\"===s&&t||\"up\"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?\"down\":\"up\")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?\"right\":\"left\")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s],this.document[0]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(\":data(\"+this.widgetName+\"-item)\");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i],this.document[0]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+\"-item\",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.floating=this.items.length?\"x\"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e(\"<\"+s+\">\",t.document[0]).addClass(i||t.currentItem[0].className+\" ui-sortable-placeholder\").removeClass(\"ui-sortable-helper\");return\"tbody\"===s?t._createTrPlaceholder(t.currentItem.find(\"tr\").eq(0),e(\"<tr>\",t.document[0]).appendTo(n)):\"tr\"===s?t._createTrPlaceholder(t.currentItem,n):\"img\"===s&&n.attr(\"src\",t.currentItem.attr(\"src\")),i||n.css(\"visibility\",\"hidden\"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css(\"paddingTop\")||0,10)-parseInt(t.currentItem.css(\"paddingBottom\")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css(\"paddingLeft\")||0,10)-parseInt(t.currentItem.css(\"paddingRight\")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_createTrPlaceholder:function(t,i){var s=this;t.children().each(function(){e(\"<td>&#160;</td>\",s.document[0]).attr(\"colspan\",e(this).attr(\"colspan\")||1).appendTo(i)})},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger(\"out\",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger(\"over\",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?\"left\":\"top\",r=u?\"width\":\"height\",d=u?\"clientX\":\"clientY\",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?\"up\":\"down\"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger(\"over\",t,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger(\"change\",t,this._uiHash()),this.containers[p]._trigger(\"change\",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger(\"over\",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):\"clone\"===i.helper?this.currentItem.clone():this.currentItem;return s.parents(\"body\").length||e(\"parent\"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css(\"position\"),top:this.currentItem.css(\"top\"),left:this.currentItem.css(\"left\")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){\"string\"==typeof t&&(t=t.split(\" \")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),\"left\"in t&&(this.offset.click.left=t.left+this.margins.left),\"right\"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),\"top\"in t&&(this.offset.click.top=t.top+this.margins.top),\"bottom\"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return\"absolute\"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&\"html\"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css(\"borderTopWidth\"),10)||0),left:t.left+(parseInt(this.offsetParent.css(\"borderLeftWidth\"),10)||0)}},_getRelativeOffset:function(){if(\"relative\"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css(\"top\"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css(\"left\"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css(\"marginLeft\"),10)||0,top:parseInt(this.currentItem.css(\"marginTop\"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;\"parent\"===n.containment&&(n.containment=this.helper[0].parentNode),(\"document\"===n.containment||\"window\"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,\"document\"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,(\"document\"===n.containment?this.document.width():this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s=\"hidden\"!==e(t).css(\"overflow\"),this.containment=[i.left+(parseInt(e(t).css(\"borderLeftWidth\"),10)||0)+(parseInt(e(t).css(\"paddingLeft\"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css(\"borderTopWidth\"),10)||0)+(parseInt(e(t).css(\"paddingTop\"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css(\"borderLeftWidth\"),10)||0)-(parseInt(e(t).css(\"paddingRight\"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css(\"borderTopWidth\"),10)||0)-(parseInt(e(t).css(\"paddingBottom\"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s=\"absolute\"===t?1:-1,n=\"absolute\"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-(\"fixed\"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-(\"fixed\"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r=\"absolute\"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return\"relative\"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(\"fixed\"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(\"fixed\"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],\"down\"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)(\"auto\"===this._storedCSS[s]||\"static\"===this._storedCSS[s])&&(this._storedCSS[s]=\"\");this.currentItem.css(this._storedCSS).removeClass(\"ui-sortable-helper\")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger(\"receive\",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(\".ui-sortable-helper\")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger(\"update\",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger(\"remove\",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger(\"receive\",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger(\"update\",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i(\"deactivate\",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i(\"out\",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find(\"body\").css(\"cursor\",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css(\"opacity\",this._storedOpacity),this._storedZIndex&&this.helper.css(\"zIndex\",\"auto\"===this._storedZIndex?\"\":this._storedZIndex),this.dragging=!1,t||this._trigger(\"beforeStop\",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger(\"stop\",e,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget(\"ui.spinner\",{version:\"1.11.4\",defaultElement:\"<input>\",widgetEventPrefix:\"spin\",options:{culture:null,icons:{down:\"ui-icon-triangle-1-s\",up:\"ui-icon-triangle-1-n\"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption(\"max\",this.options.max),this._setOption(\"min\",this.options.min),this._setOption(\"step\",this.options.step),\"\"!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr(\"autocomplete\")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each([\"min\",\"max\",\"step\"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:\"_stop\",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger(\"change\",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},\"mousedown .ui-spinner-button\":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass(\"ui-spinner-up\")?1:-1,t)},\"mouseup .ui-spinner-button\":\"_stop\",\"mouseenter .ui-spinner-button\":function(t){return e(t.currentTarget).hasClass(\"ui-state-active\")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass(\"ui-spinner-up\")?1:-1,t),void 0):void 0},\"mouseleave .ui-spinner-button\":\"_stop\"},_draw:function(){var e=this.uiSpinner=this.element.addClass(\"ui-spinner-input\").attr(\"autocomplete\",\"off\").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr(\"role\",\"spinbutton\"),this.buttons=e.find(\".ui-spinner-button\").attr(\"tabIndex\",-1).button().removeClass(\"ui-corner-all\"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return\"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>\"},_buttonHtml:function(){return\"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon \"+this.options.icons.up+\"'>&#9650;</span>\"+\"</a>\"+\"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>\"+\"<span class='ui-icon \"+this.options.icons.down+\"'>&#9660;</span>\"+\"</a>\"},_start:function(e){return this.spinning||this._trigger(\"start\",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger(\"spin\",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=\"\"+e,i=t.indexOf(\".\");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger(\"stop\",e))},_setOption:function(e,t){if(\"culture\"===e||\"numberFormat\"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}(\"max\"===e||\"min\"===e||\"step\"===e)&&\"string\"==typeof t&&(t=this._parse(t)),\"icons\"===e&&(this.buttons.first().find(\".ui-icon\").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(\".ui-icon\").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),\"disabled\"===e&&(this.widget().toggleClass(\"ui-state-disabled\",!!t),this.element.prop(\"disabled\",!!t),this.buttons.button(t?\"disable\":\"enable\"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return\"string\"==typeof e&&\"\"!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),\"\"===e||isNaN(e)?null:e},_format:function(e){return\"\"===e?\"\":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({\"aria-valuemin\":this.options.min,\"aria-valuemax\":this.options.max,\"aria-valuenow\":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;\"\"!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass(\"ui-spinner-input\").prop(\"disabled\",!1).removeAttr(\"autocomplete\").removeAttr(\"role\").removeAttr(\"aria-valuemin\").removeAttr(\"aria-valuemax\").removeAttr(\"aria-valuenow\"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget(\"ui.tabs\",{version:\"1.11.4\",delay:300,options:{active:null,collapsible:!1,event:\"click\",heightStyle:\"content\",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,\"\"),s=location.href.replace(e,\"\");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass(\"ui-tabs ui-widget ui-widget-content ui-corner-all\").toggleClass(\"ui-tabs-collapsible\",i.collapsible),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(\".ui-state-disabled\"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr(\"aria-controls\")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(\".ui-tabs-active\"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest(\"li\"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||t.metaKey||(i.attr(\"aria-selected\",\"false\"),this.tabs.eq(s).attr(\"aria-selected\",\"true\"),this.activating=this._delay(function(){this.option(\"active\",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return\"active\"===e?(this._activate(t),void 0):\"disabled\"===e?(this._setupDisabled(t),void 0):(this._super(e,t),\"collapsible\"===e&&(this.element.toggleClass(\"ui-tabs-collapsible\",t),t||this.options.active!==!1||this._activate(0)),\"event\"===e&&this._setupEvents(t),\"heightStyle\"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!\"$%&'()*+,.\\/:;<=>?@\\[\\]\\^`{|}~]/g,\"\\\\$&\"):\"\"},refresh:function(){var t=this.options,i=this.tablist.children(\":has(a[href])\");t.disabled=e.map(i.filter(\".ui-state-disabled\"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({\"aria-selected\":\"false\",\"aria-expanded\":\"false\",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({\"aria-hidden\":\"true\"}),this.active.length?(this.active.addClass(\"ui-tabs-active ui-state-active\").attr({\"aria-selected\":\"true\",\"aria-expanded\":\"true\",tabIndex:0}),this._getPanelForTab(this.active).show().attr({\"aria-hidden\":\"false\"})):this.tabs.eq(0).attr(\"tabIndex\",0)},_processTabs:function(){var t=this,i=this.tabs,s=this.anchors,n=this.panels;\nthis.tablist=this._getList().addClass(\"ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all\").attr(\"role\",\"tablist\").delegate(\"> li\",\"mousedown\"+this.eventNamespace,function(t){e(this).is(\".ui-state-disabled\")&&t.preventDefault()}).delegate(\".ui-tabs-anchor\",\"focus\"+this.eventNamespace,function(){e(this).closest(\"li\").is(\".ui-state-disabled\")&&this.blur()}),this.tabs=this.tablist.find(\"> li:has(a[href])\").addClass(\"ui-state-default ui-corner-top\").attr({role:\"tab\",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e(\"a\",this)[0]}).addClass(\"ui-tabs-anchor\").attr({role:\"presentation\",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr(\"id\"),h=e(s).closest(\"li\"),l=h.attr(\"aria-controls\");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr(\"aria-controls\")||e({}).uniqueId()[0].id,n=\"#\"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr(\"aria-live\",\"polite\")),a.length&&(t.panels=t.panels.add(a)),l&&h.data(\"ui-tabs-aria-controls\",l),h.attr({\"aria-controls\":o,\"aria-labelledby\":r}),a.attr(\"aria-labelledby\",r)}),this.panels.addClass(\"ui-tabs-panel ui-widget-content ui-corner-bottom\").attr(\"role\",\"tabpanel\"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find(\"ol,ul\").eq(0)},_createPanel:function(t){return e(\"<div>\").attr(\"id\",t).addClass(\"ui-tabs-panel ui-widget-content ui-corner-bottom\").data(\"ui-tabs-destroy\",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass(\"ui-state-disabled\").attr(\"aria-disabled\",\"true\"):e(i).removeClass(\"ui-state-disabled\").removeAttr(\"aria-disabled\");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(\" \"),function(e,t){i[t]=\"_eventHandler\"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:\"_tabKeydown\"}),this._on(this.panels,{keydown:\"_panelKeydown\"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();\"fill\"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(\":visible\").each(function(){var t=e(this),s=t.css(\"position\");\"absolute\"!==s&&\"fixed\"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css(\"overflow\",\"auto\")):\"auto\"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height(\"\").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest(\"li\"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass(\"ui-state-disabled\")||a.hasClass(\"ui-tabs-loading\")||this.running||o&&!i.collapsible||this._trigger(\"beforeActivate\",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error(\"jQuery UI Tabs: Mismatching fragment identifier.\"),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger(\"activate\",t,i)}function n(){i.newTab.closest(\"li\").addClass(\"ui-tabs-active ui-state-active\"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest(\"li\").removeClass(\"ui-tabs-active ui-state-active\"),n()}):(i.oldTab.closest(\"li\").removeClass(\"ui-tabs-active ui-state-active\"),r.hide(),n()),r.attr(\"aria-hidden\",\"true\"),i.oldTab.attr({\"aria-selected\":\"false\",\"aria-expanded\":\"false\"}),o.length&&r.length?i.oldTab.attr(\"tabIndex\",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr(\"tabIndex\")}).attr(\"tabIndex\",-1),o.attr(\"aria-hidden\",\"false\"),i.newTab.attr({\"aria-selected\":\"true\",\"aria-expanded\":\"true\",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(\".ui-tabs-anchor\")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return\"string\"==typeof e&&(e=this.anchors.index(this.anchors.filter(\"[href$='\"+e+\"']\"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass(\"ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible\"),this.tablist.removeClass(\"ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all\").removeAttr(\"role\"),this.anchors.removeClass(\"ui-tabs-anchor\").removeAttr(\"role\").removeAttr(\"tabIndex\").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,\"ui-tabs-destroy\")?e(this).remove():e(this).removeClass(\"ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel\").removeAttr(\"tabIndex\").removeAttr(\"aria-live\").removeAttr(\"aria-busy\").removeAttr(\"aria-selected\").removeAttr(\"aria-labelledby\").removeAttr(\"aria-hidden\").removeAttr(\"aria-expanded\").removeAttr(\"role\")}),this.tabs.each(function(){var t=e(this),i=t.data(\"ui-tabs-aria-controls\");i?t.attr(\"aria-controls\",i).removeData(\"ui-tabs-aria-controls\"):t.removeAttr(\"aria-controls\")}),this.panels.show(),\"content\"!==this.options.heightStyle&&this.panels.css(\"height\",\"\")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(\".ui-tabs-anchor\"),o=this._getPanelForTab(n),r={tab:n,panel:o},h=function(e,t){\"abort\"===t&&s.panels.stop(!1,!0),n.removeClass(\"ui-tabs-loading\"),o.removeAttr(\"aria-busy\"),e===s.xhr&&delete s.xhr};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&\"canceled\"!==this.xhr.statusText&&(n.addClass(\"ui-tabs-loading\"),o.attr(\"aria-busy\",\"true\"),this.xhr.done(function(e,t,n){setTimeout(function(){o.html(e),s._trigger(\"load\",i,r),h(n,t)},1)}).fail(function(e,t){setTimeout(function(){h(e,t)},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr(\"href\"),beforeSend:function(t,a){return n._trigger(\"beforeLoad\",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr(\"aria-controls\");return this.element.find(this._sanitizeSelector(\"#\"+i))}}),e.widget(\"ui.tooltip\",{version:\"1.11.4\",options:{content:function(){var t=e(this).attr(\"title\")||\"\";return e(\"<a>\").text(t).html()},hide:!0,items:\"[title]:not([disabled])\",position:{my:\"left top+15\",at:\"left bottom\",collision:\"flipfit flip\"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr(\"aria-describedby\")||\"\").split(/\\s+/);s.push(i),t.data(\"ui-tooltip-id\",i).attr(\"aria-describedby\",e.trim(s.join(\" \")))},_removeDescribedBy:function(t){var i=t.data(\"ui-tooltip-id\"),s=(t.attr(\"aria-describedby\")||\"\").split(/\\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData(\"ui-tooltip-id\"),s=e.trim(s.join(\" \")),s?t.attr(\"aria-describedby\",s):t.removeAttr(\"aria-describedby\")},_create:function(){this._on({mouseover:\"open\",focusin:\"open\"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e(\"<div>\").attr({role:\"log\",\"aria-live\":\"assertive\",\"aria-relevant\":\"additions\"}).addClass(\"ui-helper-hidden-accessible\").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return\"disabled\"===t?(this[i?\"_disable\":\"_enable\"](),this.options[t]=i,void 0):(this._super(t,i),\"content\"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t.element)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event(\"blur\");n.target=n.currentTarget=s.element[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is(\"[title]\")&&t.data(\"ui-tooltip-title\",t.attr(\"title\")).removeAttr(\"title\")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data(\"ui-tooltip-title\")&&t.attr(\"title\",t.data(\"ui-tooltip-title\"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data(\"ui-tooltip-id\")&&(s.attr(\"title\")&&s.data(\"ui-tooltip-title\",s.attr(\"title\")),s.data(\"ui-tooltip-open\",!0),t&&\"mouseover\"===t.type&&s.parents().each(function(){var t,s=e(this);s.data(\"ui-tooltip-open\")&&(t=e.Event(\"blur\"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr(\"title\")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr(\"title\")},s.attr(\"title\",\"\"))}),this._registerCloseHandlers(t,s),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return\"string\"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){n._delay(function(){e.data(\"ui-tooltip-open\")&&(t&&(t.type=a),this._open(t,e,i))})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,o.is(\":hidden\")||o.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i))return a.tooltip.find(\".ui-tooltip-content\").html(s),void 0;i.is(\"[title]\")&&(t&&\"mouseover\"===t.type?i.attr(\"title\",\"\"):i.removeAttr(\"title\")),a=this._tooltip(i),o=a.tooltip,this._addDescribedBy(i,o.attr(\"id\")),o.find(\".ui-tooltip-content\").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr(\"id\").find(\"[id]\").removeAttr(\"id\")):h=s,e(\"<div>\").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):o.position(e.extend({of:i},this.options.position)),o.hide(),this._show(o,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){o.is(\":visible\")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger(\"open\",t,{tooltip:o})}},_registerCloseHandlers:function(t,i){var s={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),t&&\"mouseover\"!==t.type||(s.mouseleave=\"close\"),t&&\"focusin\"!==t.type||(s.focusout=\"close\"),this._on(!0,i,s)},close:function(t){var i,s=this,n=e(t?t.currentTarget:this.element),a=this._find(n);return a?(i=a.tooltip,a.closing||(clearInterval(this.delayedShow),n.data(\"ui-tooltip-title\")&&!n.attr(\"title\")&&n.attr(\"title\",n.data(\"ui-tooltip-title\")),this._removeDescribedBy(n),a.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(e(this))}),n.removeData(\"ui-tooltip-open\"),this._off(n,\"mouseleave focusout keyup\"),n[0]!==this.element[0]&&this._off(n,\"remove\"),this._off(this.document,\"mousemove\"),t&&\"mouseleave\"===t.type&&e.each(this.parents,function(t,i){e(i.element).attr(\"title\",i.title),delete s.parents[t]}),a.closing=!0,this._trigger(\"close\",t,{tooltip:i}),a.hiding||(a.closing=!1)),void 0):(n.removeData(\"ui-tooltip-open\"),void 0)},_tooltip:function(t){var i=e(\"<div>\").attr(\"role\",\"tooltip\").addClass(\"ui-tooltip ui-widget ui-corner-all ui-widget-content \"+(this.options.tooltipClass||\"\")),s=i.uniqueId().attr(\"id\");return e(\"<div>\").addClass(\"ui-tooltip-content\").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]={element:t,tooltip:i}},_find:function(e){var t=e.data(\"ui-tooltip-id\");return t?this.tooltips[t]:null},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr(\"id\")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event(\"blur\"),a=s.element;n.target=n.currentTarget=a[0],t.close(n,!0),e(\"#\"+i).remove(),a.data(\"ui-tooltip-title\")&&(a.attr(\"title\")||a.attr(\"title\",a.data(\"ui-tooltip-title\")),a.removeData(\"ui-tooltip-title\"))}),this.liveRegion.remove()}})});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS11aS9qcXVlcnktdWkubWluLmpzPzI3MjYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EsMERBQTBEOztBQUUxRCxhQUFhO0FBQUE7QUFBQTtBQUFBLCtHQUFxRSxjQUFjLGdCQUFnQixxQ0FBcUMsK05BQStOLGNBQWMsOEVBQThFLDBDQUEwQyxTQUFTLGNBQWMsWUFBWSwwQkFBMEIsRUFBRSxpSUFBaUksYUFBYSxTQUFTLGFBQWEsMGhCQUEwaEIscWpCQUFxakIsaUJBQWlCLCtDQUErQyxta0JBQW1rQiwyRUFBMkUseURBQXlELDhKQUE4SixjQUFjLHVGQUF1RiwwQ0FBMEMsNE9BQTRPLDRCQUE0QixhQUFhLHFZQUFxWSxnQkFBZ0IsY0FBYyx1Q0FBdUMsU0FBUyxjQUFjLGtCQUFrQix5QkFBeUIseUZBQXlGLGFBQWEsZ0JBQWdCLDBCQUEwQixvSkFBb0osZUFBZSx5QkFBeUIsMEhBQTBILGNBQWMsNEdBQTRHLFFBQVEsaUVBQWlFLHFCQUFxQixRQUFRLGtCQUFrQiw0QkFBNEIsaUNBQWlDLEdBQUcsNkJBQTZCLDRCQUE0QixzREFBc0QsR0FBRyx3QkFBd0IseURBQXlELG1CQUFtQixxQkFBcUIsa0JBQWtCLHVCQUF1Qix1QkFBdUIseUNBQXlDLHNCQUFzQixzQ0FBc0MsMEJBQTBCLHlFQUF5RSxvQkFBb0IsMkJBQTJCLDhJQUE4SSxJQUFJLHlFQUF5RSxpSEFBaUgsNEJBQTRCLCtEQUErRCw4QkFBOEIsRUFBRSwrQkFBK0Isd0VBQXdFLG1DQUFtQyxHQUFHLDBDQUEwQyxtRUFBbUUsdUZBQXVGLG1CQUFtQixrRUFBa0UsZ0dBQWdHLGtCQUFrQixxQkFBcUIsOENBQThDLFdBQVcsc0JBQXNCLDBCQUEwQixJQUFJLDJCQUEyQix5Q0FBeUMsZ0ZBQWdGLGtCQUFrQixzREFBc0QsbUJBQW1CLEdBQUcsOEJB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T0FBTyxJQUFJLElBQUksK0JBQStCLFdBQVcsT0FBTyw0Q0FBNEMsMkNBQTJDLHVCQUF1QixPQUFPLDZCQUE2QixpQ0FBaUMseURBQXlELHlCQUF5QiwwQkFBMEIsbUJBQW1CLGdDQUFnQywrQkFBK0IsbURBQW1ELDJEQUEyRCx5REFBeUQsK0JBQStCLG9EQUFvRCxpRkFBaUYsZ0NBQWdDLCtGQUErRiwwSUFBMEksb0JBQW9CLFVBQVUsZ0NBQWdDLGtCQUFrQixnQkFBZ0IseUVBQXlFLCtEQUErRCwwRUFBMEUsMEJBQTBCLFdBQVcsbUpBQW1KLDRCQUE0QixVQUFVLHFCQUFxQixXQUFXLG1DQUFtQyxzQkFBc0Isb0RBQW9ELGtFQUFrRSxjQUFjLGdGQUFnRixFQUFFLG9CQUFvQixnRUFBZ0UsY0FBYyx1RUFBdUUsRUFBRSxrQkFBa0Isb0VBQW9FLG1MQUFtTCxnQkFBZ0IsOElBQThJLG1DQUFtQyxxQkFBcUIsNkRBQTZELDhCQUE4QixvREFBb0Qsc0VBQXNFLG9CQUFvQiw2REFBNkQsRUFBRSwrQkFBK0IsdUJBQXVCLGNBQWMsc0NBQXNDLHlCQUF5Qix3QkFBd0IsTUFBTSwrRUFBK0UsOFpBQThaLFlBQVksNkJBQTZCLEtBQUsseUpBQXlKLDZDQUE2Qyx5Q0FBeUMsVUFBVSxHQUFHLHNDQUFzQyxPQUFPLGtCQUFrQixvQ0FBb0MsaUJBQWlCLHlDQUF5Qyw2Q0FBNkMsMkNBQTJDLCtHQUErRyxtQkFBbUIsaUVBQWlFLHVQQUF1UCwwQkFBMEIsME5BQTBOLHVEQUF1RCx3Q0FBd0MsVUFBVSw2RUFBNkUsc0JBQXNCLG9LQUFvSyxpSEFBaUgscUJBQXFCLG1CQUFtQiw4QkFBOEIsK0JBQStCLDRCQUE0Qiw4Q0FBOEMscUJBQXFCLFdBQVcsbUNBQW1DLGtDQUFrQyx5TEFBeUwsNEJBQTRCLEVBQUUiLCJmaWxlIjoiNDkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgalF1ZXJ5IFVJIC0gdjEuMTEuNCAtIDIwMTUtMDMtMTFcbiogaHR0cDovL2pxdWVyeXVpLmNvbVxuKiBJbmNsdWRlczogY29yZS5qcywgd2lkZ2V0LmpzLCBtb3VzZS5qcywgcG9zaXRpb24uanMsIGFjY29yZGlvbi5qcywgYXV0b2NvbXBsZXRlLmpzLCBidXR0b24uanMsIGRhdGVwaWNrZXIuanMsIGRpYWxvZy5qcywgZHJhZ2dhYmxlLmpzLCBkcm9wcGFibGUuanMsIGVmZmVjdC5qcywgZWZmZWN0LWJsaW5kLmpzLCBlZmZlY3QtYm91bmNlLmpzLCBlZmZlY3QtY2xpcC5qcywgZWZmZWN0LWRyb3AuanMsIGVmZmVjdC1leHBsb2RlLmpzLCBlZmZlY3QtZmFkZS5qcywgZWZmZWN0LWZvbGQuanMsIGVmZmVjdC1oaWdobGlnaHQuanMsIGVmZmVjdC1wdWZmLmpzLCBlZmZlY3QtcHVsc2F0ZS5qcywgZWZmZWN0LXNjYWxlLmpzLCBlZmZlY3Qtc2hha2UuanMsIGVmZmVjdC1zaXplLmpzLCBlZmZlY3Qtc2xpZGUuanMsIGVmZmVjdC10cmFuc2Zlci5qcywgbWVudS5qcywgcHJvZ3Jlc3NiYXIuanMsIHJlc2l6YWJsZS5qcywgc2VsZWN0YWJsZS5qcywgc2VsZWN0bWVudS5qcywgc2xpZGVyLmpzLCBzb3J0YWJsZS5qcywgc3Bpbm5lci5qcywgdGFicy5qcywgdG9vbHRpcC5qc1xuKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi9cblxuKGZ1bmN0aW9uKGUpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wianF1ZXJ5XCJdLGUpOmUoalF1ZXJ5KX0pKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxzKXt2YXIgbixhLG8scj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuXCJhcmVhXCI9PT1yPyhuPXQucGFyZW50Tm9kZSxhPW4ubmFtZSx0LmhyZWYmJmEmJlwibWFwXCI9PT1uLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/KG89ZShcImltZ1t1c2VtYXA9JyNcIithK1wiJ11cIilbMF0sISFvJiZpKG8pKTohMSk6KC9eKGlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvLnRlc3Qocik/IXQuZGlzYWJsZWQ6XCJhXCI9PT1yP3QuaHJlZnx8czpzKSYmaSh0KX1mdW5jdGlvbiBpKHQpe3JldHVybiBlLmV4cHIuZmlsdGVycy52aXNpYmxlKHQpJiYhZSh0KS5wYXJlbnRzKCkuYWRkQmFjaygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVyblwiaGlkZGVuXCI9PT1lLmNzcyh0aGlzLFwidmlzaWJpbGl0eVwiKX0pLmxlbmd0aH1mdW5jdGlvbiBzKGUpe2Zvcih2YXIgdCxpO2UubGVuZ3RoJiZlWzBdIT09ZG9jdW1lbnQ7KXtpZih0PWUuY3NzKFwicG9zaXRpb25cIiksKFwiYWJzb2x1dGVcIj09PXR8fFwicmVsYXRpdmVcIj09PXR8fFwiZml4ZWRcIj09PXQpJiYoaT1wYXJzZUludChlLmNzcyhcInpJbmRleFwiKSwxMCksIWlzTmFOKGkpJiYwIT09aSkpcmV0dXJuIGk7ZT1lLnBhcmVudCgpfXJldHVybiAwfWZ1bmN0aW9uIG4oKXt0aGlzLl9jdXJJbnN0PW51bGwsdGhpcy5fa2V5RXZlbnQ9ITEsdGhpcy5fZGlzYWJsZWRJbnB1dHM9W10sdGhpcy5fZGF0ZXBpY2tlclNob3dpbmc9ITEsdGhpcy5faW5EaWFsb2c9ITEsdGhpcy5fbWFpbkRpdklkPVwidWktZGF0ZXBpY2tlci1kaXZcIix0aGlzLl9pbmxpbmVDbGFzcz1cInVpLWRhdGVwaWNrZXItaW5saW5lXCIsdGhpcy5fYXBwZW5kQ2xhc3M9XCJ1aS1kYXRlcGlja2VyLWFwcGVuZFwiLHRoaXMuX3RyaWdnZXJDbGFzcz1cInVpLWRhdGVwaWNrZXItdHJpZ2dlclwiLHRoaXMuX2RpYWxvZ0NsYXNzPVwidWktZGF0ZXBpY2tlci1kaWFsb2dcIix0aGlzLl9kaXNhYmxlQ2xhc3M9XCJ1aS1kYXRlcGlja2VyLWRpc2FibGVkXCIsdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3M9XCJ1aS1kYXRlcGlja2VyLXVuc2VsZWN0YWJsZVwiLHRoaXMuX2N1cnJlbnRDbGFzcz1cInVpLWRhdGVwaWNrZXItY3VycmVudC1kYXlcIix0aGlzLl9kYXlPdmVyQ2xhc3M9XCJ1aS1kYXRlcGlja2VyLWRheXMtY2VsbC1vdmVyXCIsdGhpcy5yZWdpb25hbD1bXSx0aGlzLnJlZ2lvbmFsW1wiXCJdPXtjbG9zZVRleHQ6XCJEb25lXCIscHJldlRleHQ6XCJQcmV2XCIsbmV4dFRleHQ6XCJOZXh0XCIsY3VycmVudFRleHQ6XCJUb2RheVwiLG1vbnRoTmFtZXM6W1wiSmFudWFyeVwiLFwiRmVicnVhcnlcIixcIk1hcmNoXCIsXCJBcHJpbFwiLFwiTWF5XCIsXCJKdW5lXCIsXCJKdWx5XCIsXCJBdWd1c3RcIixcIlNlcHRlbWJlclwiLFwiT2N0b2JlclwiLFwiTm92ZW1iZXJcIixcIkRlY2VtYmVyXCJdLG1vbnRoTmFtZXNTaG9ydDpbXCJKYW5cIixcIkZlYlwiLFwiTWFyXCIsXCJBcHJcIixcIk1heVwiLFwiSnVuXCIsXCJKdWxcIixcIkF1Z1wiLFwiU2VwXCIsXCJPY3RcIixcIk5vdlwiLFwiRGVjXCJdLGRheU5hbWVzOltcIlN1bmRheVwiLFwiTW9uZGF5XCIsXCJUdWVzZGF5XCIsXCJXZWRuZXNkYXlcIixcIlRodXJzZGF5XCIsXCJGcmlkYXlcIixcIlNhdHVyZGF5XCJdLGRheU5hbWVzU2hvcnQ6W1wiU3VuXCIsXCJNb25cIixcIlR1ZVwiLFwiV2VkXCIsXCJUaHVcIixcIkZyaVwiLFwiU2F0XCJdLGRheU5hbWVzTWluOltcIlN1XCIsXCJNb1wiLFwiVHVcIixcIldlXCIsXCJUaFwiLFwiRnJcIixcIlNhXCJdLHdlZWtIZWFkZXI6XCJXa1wiLGRhdGVGb3JtYXQ6XCJtbS9kZC95eVwiLGZpcnN0RGF5OjAsaXNSVEw6ITEsc2hvd01vbnRoQWZ0ZXJZZWFyOiExLHllYXJTdWZmaXg6XCJcIn0sdGhpcy5fZGVmYXVsdHM9e3Nob3dPbjpcImZvY3VzXCIsc2hvd0FuaW06XCJmYWRlSW5cIixzaG93T3B0aW9uczp7fSxkZWZhdWx0RGF0ZTpudWxsLGFwcGVuZFRleHQ6XCJcIixidXR0b25UZXh0OlwiLi4uXCIsYnV0dG9uSW1hZ2U6XCJcIixidXR0b25JbWFnZU9ubHk6ITEsaGlkZUlmTm9QcmV2TmV4dDohMSxuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0OiExLGdvdG9DdXJyZW50OiExLGNoYW5nZU1vbnRoOiExLGNoYW5nZVllYXI6ITEseWVhclJhbmdlOlwiYy0xMDpjKzEwXCIsc2hvd090aGVyTW9udGhzOiExLHNlbGVjdE90aGVyTW9udGhzOiExLHNob3dXZWVrOiExLGNhbGN1bGF0ZVdlZWs6dGhpcy5pc284NjAxV2VlayxzaG9ydFllYXJDdXRvZmY6XCIrMTBcIixtaW5EYXRlOm51bGwsbWF4RGF0ZTpudWxsLGR1cmF0aW9uOlwiZmFzdFwiLGJlZm9yZVNob3dEYXk6bnVsbCxiZWZvcmVTaG93Om51bGwsb25TZWxlY3Q6bnVsbCxvbkNoYW5nZU1vbnRoWWVhcjpudWxsLG9uQ2xvc2U6bnVsbCxudW1iZXJPZk1vbnRoczoxLHNob3dDdXJyZW50QXRQb3M6MCxzdGVwTW9udGhzOjEsc3RlcEJpZ01vbnRoczoxMixhbHRGaWVsZDpcIlwiLGFsdEZvcm1hdDpcIlwiLGNvbnN0cmFpbklucHV0OiEwLHNob3dCdXR0b25QYW5lbDohMSxhdXRvU2l6ZTohMSxkaXNhYmxlZDohMX0sZS5leHRlbmQodGhpcy5fZGVmYXVsdHMsdGhpcy5yZWdpb25hbFtcIlwiXSksdGhpcy5yZWdpb25hbC5lbj1lLmV4dGVuZCghMCx7fSx0aGlzLnJlZ2lvbmFsW1wiXCJdKSx0aGlzLnJlZ2lvbmFsW1wiZW4tVVNcIl09ZS5leHRlbmQoITAse30sdGhpcy5yZWdpb25hbC5lbiksdGhpcy5kcERpdj1hKGUoXCI8ZGl2IGlkPSdcIit0aGlzLl9tYWluRGl2SWQrXCInIGNsYXNzPSd1aS1kYXRlcGlja2VyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWktY29ybmVyLWFsbCc+PC9kaXY+XCIpKX1mdW5jdGlvbiBhKHQpe3ZhciBpPVwiYnV0dG9uLCAudWktZGF0ZXBpY2tlci1wcmV2LCAudWktZGF0ZXBpY2tlci1uZXh0LCAudWktZGF0ZXBpY2tlci1jYWxlbmRhciB0ZCBhXCI7cmV0dXJuIHQuZGVsZWdhdGUoaSxcIm1vdXNlb3V0XCIsZnVuY3Rpb24oKXtlKHRoaXMpLnJlbW92ZUNsYXNzKFwidWktc3RhdGUtaG92ZXJcIiksLTEhPT10aGlzLmNsYXNzTmFtZS5pbmRleE9mKFwidWktZGF0ZXBpY2tlci1wcmV2XCIpJiZlKHRoaXMpLnJlbW92ZUNsYXNzKFwidWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyXCIpLC0xIT09dGhpcy5jbGFzc05hbWUuaW5kZXhPZihcInVpLWRhdGVwaWNrZXItbmV4dFwiKSYmZSh0aGlzKS5yZW1vdmVDbGFzcyhcInVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlclwiKX0pLmRlbGVnYXRlKGksXCJtb3VzZW92ZXJcIixvKX1mdW5jdGlvbiBvKCl7ZS5kYXRlcGlja2VyLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcih2LmlubGluZT92LmRwRGl2LnBhcmVudCgpWzBdOnYuaW5wdXRbMF0pfHwoZSh0aGlzKS5wYXJlbnRzKFwiLnVpLWRhdGVwaWNrZXItY2FsZW5kYXJcIikuZmluZChcImFcIikucmVtb3ZlQ2xhc3MoXCJ1aS1zdGF0ZS1ob3ZlclwiKSxlKHRoaXMpLmFkZENsYXNzKFwidWktc3RhdGUtaG92ZXJcIiksLTEhPT10aGlzLmNsYXNzTmFtZS5pbmRleE9mKFwidWktZGF0ZXBpY2tlci1wcmV2XCIpJiZlKHRoaXMpLmFkZENsYXNzKFwidWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyXCIpLC0xIT09dGhpcy5jbGFzc05hbWUuaW5kZXhPZihcInVpLWRhdGVwaWNrZXItbmV4dFwiKSYmZSh0aGlzKS5hZGRDbGFzcyhcInVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlclwiKSl9ZnVuY3Rpb24gcih0LGkpe2UuZXh0ZW5kKHQsaSk7Zm9yKHZhciBzIGluIGkpbnVsbD09aVtzXSYmKHRbc109aVtzXSk7cmV0dXJuIHR9ZnVuY3Rpb24gaChlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQudmFsKCk7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fcmVmcmVzaCgpLHQhPT10aGlzLmVsZW1lbnQudmFsKCkmJnRoaXMuX3RyaWdnZXIoXCJjaGFuZ2VcIil9fWUudWk9ZS51aXx8e30sZS5leHRlbmQoZS51aSx7dmVyc2lvbjpcIjEuMTEuNFwiLGtleUNvZGU6e0JBQ0tTUEFDRTo4LENPTU1BOjE4OCxERUxFVEU6NDYsRE9XTjo0MCxFTkQ6MzUsRU5URVI6MTMsRVNDQVBFOjI3LEhPTUU6MzYsTEVGVDozNyxQQUdFX0RPV046MzQsUEFHRV9VUDozMyxQRVJJT0Q6MTkwLFJJR0hUOjM5LFNQQUNFOjMyLFRBQjo5LFVQOjM4fX0pLGUuZm4uZXh0ZW5kKHtzY3JvbGxQYXJlbnQ6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5jc3MoXCJwb3NpdGlvblwiKSxzPVwiYWJzb2x1dGVcIj09PWksbj10Py8oYXV0b3xzY3JvbGx8aGlkZGVuKS86LyhhdXRvfHNjcm9sbCkvLGE9dGhpcy5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtyZXR1cm4gcyYmXCJzdGF0aWNcIj09PXQuY3NzKFwicG9zaXRpb25cIik/ITE6bi50ZXN0KHQuY3NzKFwib3ZlcmZsb3dcIikrdC5jc3MoXCJvdmVyZmxvdy15XCIpK3QuY3NzKFwib3ZlcmZsb3cteFwiKSl9KS5lcSgwKTtyZXR1cm5cImZpeGVkXCIhPT1pJiZhLmxlbmd0aD9hOmUodGhpc1swXS5vd25lckRvY3VtZW50fHxkb2N1bWVudCl9LHVuaXF1ZUlkOmZ1bmN0aW9uKCl7dmFyIGU9MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5pZHx8KHRoaXMuaWQ9XCJ1aS1pZC1cIisgKytlKX0pfX0oKSxyZW1vdmVVbmlxdWVJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsvXnVpLWlkLVxcZCskLy50ZXN0KHRoaXMuaWQpJiZlKHRoaXMpLnJlbW92ZUF0dHIoXCJpZFwiKX0pfX0pLGUuZXh0ZW5kKGUuZXhwcltcIjpcIl0se2RhdGE6ZS5leHByLmNyZWF0ZVBzZXVkbz9lLmV4cHIuY3JlYXRlUHNldWRvKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpKXtyZXR1cm4hIWUuZGF0YShpLHQpfX0pOmZ1bmN0aW9uKHQsaSxzKXtyZXR1cm4hIWUuZGF0YSh0LHNbM10pfSxmb2N1c2FibGU6ZnVuY3Rpb24oaSl7cmV0dXJuIHQoaSwhaXNOYU4oZS5hdHRyKGksXCJ0YWJpbmRleFwiKSkpfSx0YWJiYWJsZTpmdW5jdGlvbihpKXt2YXIgcz1lLmF0dHIoaSxcInRhYmluZGV4XCIpLG49aXNOYU4ocyk7cmV0dXJuKG58fHM+PTApJiZ0KGksIW4pfX0pLGUoXCI8YT5cIikub3V0ZXJXaWR0aCgxKS5qcXVlcnl8fGUuZWFjaChbXCJXaWR0aFwiLFwiSGVpZ2h0XCJdLGZ1bmN0aW9uKHQsaSl7ZnVuY3Rpb24gcyh0LGkscyxhKXtyZXR1cm4gZS5lYWNoKG4sZnVuY3Rpb24oKXtpLT1wYXJzZUZsb2F0KGUuY3NzKHQsXCJwYWRkaW5nXCIrdGhpcykpfHwwLHMmJihpLT1wYXJzZUZsb2F0KGUuY3NzKHQsXCJib3JkZXJcIit0aGlzK1wiV2lkdGhcIikpfHwwKSxhJiYoaS09cGFyc2VGbG9hdChlLmNzcyh0LFwibWFyZ2luXCIrdGhpcykpfHwwKX0pLGl9dmFyIG49XCJXaWR0aFwiPT09aT9bXCJMZWZ0XCIsXCJSaWdodFwiXTpbXCJUb3BcIixcIkJvdHRvbVwiXSxhPWkudG9Mb3dlckNhc2UoKSxvPXtpbm5lcldpZHRoOmUuZm4uaW5uZXJXaWR0aCxpbm5lckhlaWdodDplLmZuLmlubmVySGVpZ2h0LG91dGVyV2lkdGg6ZS5mbi5vdXRlcldpZHRoLG91dGVySGVpZ2h0OmUuZm4ub3V0ZXJIZWlnaHR9O2UuZm5bXCJpbm5lclwiK2ldPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P29bXCJpbm5lclwiK2ldLmNhbGwodGhpcyk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZSh0aGlzKS5jc3MoYSxzKHRoaXMsdCkrXCJweFwiKX0pfSxlLmZuW1wib3V0ZXJcIitpXT1mdW5jdGlvbih0LG4pe3JldHVyblwibnVtYmVyXCIhPXR5cGVvZiB0P29bXCJvdXRlclwiK2ldLmNhbGwodGhpcyx0KTp0aGlzLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmNzcyhhLHModGhpcyx0LCEwLG4pK1wicHhcIil9KX19KSxlLmZuLmFkZEJhY2t8fChlLmZuLmFkZEJhY2s9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfSksZShcIjxhPlwiKS5kYXRhKFwiYS1iXCIsXCJhXCIpLnJlbW92ZURhdGEoXCJhLWJcIikuZGF0YShcImEtYlwiKSYmKGUuZm4ucmVtb3ZlRGF0YT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5jYWxsKHRoaXMsZS5jYW1lbENhc2UoaSkpOnQuY2FsbCh0aGlzKX19KGUuZm4ucmVtb3ZlRGF0YSkpLGUudWkuaWU9ISEvbXNpZSBbXFx3Ll0rLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSksZS5mbi5leHRlbmQoe2ZvY3VzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpLHMpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiBpP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2UodCkuZm9jdXMoKSxzJiZzLmNhbGwodCl9LGkpfSk6dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fShlLmZuLmZvY3VzKSxkaXNhYmxlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9XCJvbnNlbGVjdHN0YXJ0XCJpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpP1wic2VsZWN0c3RhcnRcIjpcIm1vdXNlZG93blwiO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLmJpbmQoZStcIi51aS1kaXNhYmxlU2VsZWN0aW9uXCIsZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpfSl9fSgpLGVuYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuYmluZChcIi51aS1kaXNhYmxlU2VsZWN0aW9uXCIpfSx6SW5kZXg6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dClyZXR1cm4gdGhpcy5jc3MoXCJ6SW5kZXhcIix0KTtpZih0aGlzLmxlbmd0aClmb3IodmFyIGkscyxuPWUodGhpc1swXSk7bi5sZW5ndGgmJm5bMF0hPT1kb2N1bWVudDspe2lmKGk9bi5jc3MoXCJwb3NpdGlvblwiKSwoXCJhYnNvbHV0ZVwiPT09aXx8XCJyZWxhdGl2ZVwiPT09aXx8XCJmaXhlZFwiPT09aSkmJihzPXBhcnNlSW50KG4uY3NzKFwiekluZGV4XCIpLDEwKSwhaXNOYU4ocykmJjAhPT1zKSlyZXR1cm4gcztuPW4ucGFyZW50KCl9cmV0dXJuIDB9fSksZS51aS5wbHVnaW49e2FkZDpmdW5jdGlvbih0LGkscyl7dmFyIG4sYT1lLnVpW3RdLnByb3RvdHlwZTtmb3IobiBpbiBzKWEucGx1Z2luc1tuXT1hLnBsdWdpbnNbbl18fFtdLGEucGx1Z2luc1tuXS5wdXNoKFtpLHNbbl1dKX0sY2FsbDpmdW5jdGlvbihlLHQsaSxzKXt2YXIgbixhPWUucGx1Z2luc1t0XTtpZihhJiYoc3x8ZS5lbGVtZW50WzBdLnBhcmVudE5vZGUmJjExIT09ZS5lbGVtZW50WzBdLnBhcmVudE5vZGUubm9kZVR5cGUpKWZvcihuPTA7YS5sZW5ndGg+bjtuKyspZS5vcHRpb25zW2Fbbl1bMF1dJiZhW25dWzFdLmFwcGx5KGUuZWxlbWVudCxpKX19O3ZhciBsPTAsdT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZS5jbGVhbkRhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciBzLG4sYTtmb3IoYT0wO251bGwhPShuPWlbYV0pO2ErKyl0cnl7cz1lLl9kYXRhKG4sXCJldmVudHNcIikscyYmcy5yZW1vdmUmJmUobikudHJpZ2dlckhhbmRsZXIoXCJyZW1vdmVcIil9Y2F0Y2gobyl7fXQoaSl9fShlLmNsZWFuRGF0YSksZS53aWRnZXQ9ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGEsbyxyLGg9e30sbD10LnNwbGl0KFwiLlwiKVswXTtyZXR1cm4gdD10LnNwbGl0KFwiLlwiKVsxXSxuPWwrXCItXCIrdCxzfHwocz1pLGk9ZS5XaWRnZXQpLGUuZXhwcltcIjpcIl1bbi50b0xvd2VyQ2FzZSgpXT1mdW5jdGlvbih0KXtyZXR1cm4hIWUuZGF0YSh0LG4pfSxlW2xdPWVbbF18fHt9LGE9ZVtsXVt0XSxvPWVbbF1bdF09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fY3JlYXRlV2lkZ2V0Pyhhcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoZSx0KSx2b2lkIDApOm5ldyBvKGUsdCl9LGUuZXh0ZW5kKG8sYSx7dmVyc2lvbjpzLnZlcnNpb24sX3Byb3RvOmUuZXh0ZW5kKHt9LHMpLF9jaGlsZENvbnN0cnVjdG9yczpbXX0pLHI9bmV3IGksci5vcHRpb25zPWUud2lkZ2V0LmV4dGVuZCh7fSxyLm9wdGlvbnMpLGUuZWFjaChzLGZ1bmN0aW9uKHQscyl7cmV0dXJuIGUuaXNGdW5jdGlvbihzKT8oaFt0XT1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuIGkucHJvdG90eXBlW3RdLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sbj1mdW5jdGlvbihlKXtyZXR1cm4gaS5wcm90b3R5cGVbdF0uYXBwbHkodGhpcyxlKX07cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQsaT10aGlzLl9zdXBlcixhPXRoaXMuX3N1cGVyQXBwbHk7cmV0dXJuIHRoaXMuX3N1cGVyPWUsdGhpcy5fc3VwZXJBcHBseT1uLHQ9cy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fc3VwZXI9aSx0aGlzLl9zdXBlckFwcGx5PWEsdH19KCksdm9pZCAwKTooaFt0XT1zLHZvaWQgMCl9KSxvLnByb3RvdHlwZT1lLndpZGdldC5leHRlbmQocix7d2lkZ2V0RXZlbnRQcmVmaXg6YT9yLndpZGdldEV2ZW50UHJlZml4fHx0OnR9LGgse2NvbnN0cnVjdG9yOm8sbmFtZXNwYWNlOmwsd2lkZ2V0TmFtZTp0LHdpZGdldEZ1bGxOYW1lOm59KSxhPyhlLmVhY2goYS5fY2hpbGRDb25zdHJ1Y3RvcnMsZnVuY3Rpb24odCxpKXt2YXIgcz1pLnByb3RvdHlwZTtlLndpZGdldChzLm5hbWVzcGFjZStcIi5cIitzLndpZGdldE5hbWUsbyxpLl9wcm90byl9KSxkZWxldGUgYS5fY2hpbGRDb25zdHJ1Y3RvcnMpOmkuX2NoaWxkQ29uc3RydWN0b3JzLnB1c2gobyksZS53aWRnZXQuYnJpZGdlKHQsbyksb30sZS53aWRnZXQuZXh0ZW5kPWZ1bmN0aW9uKHQpe2Zvcih2YXIgaSxzLG49dS5jYWxsKGFyZ3VtZW50cywxKSxhPTAsbz1uLmxlbmd0aDtvPmE7YSsrKWZvcihpIGluIG5bYV0pcz1uW2FdW2ldLG5bYV0uaGFzT3duUHJvcGVydHkoaSkmJnZvaWQgMCE9PXMmJih0W2ldPWUuaXNQbGFpbk9iamVjdChzKT9lLmlzUGxhaW5PYmplY3QodFtpXSk/ZS53aWRnZXQuZXh0ZW5kKHt9LHRbaV0scyk6ZS53aWRnZXQuZXh0ZW5kKHt9LHMpOnMpO3JldHVybiB0fSxlLndpZGdldC5icmlkZ2U9ZnVuY3Rpb24odCxpKXt2YXIgcz1pLnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZXx8dDtlLmZuW3RdPWZ1bmN0aW9uKG4pe3ZhciBhPVwic3RyaW5nXCI9PXR5cGVvZiBuLG89dS5jYWxsKGFyZ3VtZW50cywxKSxyPXRoaXM7cmV0dXJuIGE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGksYT1lLmRhdGEodGhpcyxzKTtyZXR1cm5cImluc3RhbmNlXCI9PT1uPyhyPWEsITEpOmE/ZS5pc0Z1bmN0aW9uKGFbbl0pJiZcIl9cIiE9PW4uY2hhckF0KDApPyhpPWFbbl0uYXBwbHkoYSxvKSxpIT09YSYmdm9pZCAwIT09aT8ocj1pJiZpLmpxdWVyeT9yLnB1c2hTdGFjayhpLmdldCgpKTppLCExKTp2b2lkIDApOmUuZXJyb3IoXCJubyBzdWNoIG1ldGhvZCAnXCIrbitcIicgZm9yIFwiK3QrXCIgd2lkZ2V0IGluc3RhbmNlXCIpOmUuZXJyb3IoXCJjYW5ub3QgY2FsbCBtZXRob2RzIG9uIFwiK3QrXCIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247IFwiK1wiYXR0ZW1wdGVkIHRvIGNhbGwgbWV0aG9kICdcIituK1wiJ1wiKX0pOihvLmxlbmd0aCYmKG49ZS53aWRnZXQuZXh0ZW5kLmFwcGx5KG51bGwsW25dLmNvbmNhdChvKSkpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUuZGF0YSh0aGlzLHMpO3Q/KHQub3B0aW9uKG58fHt9KSx0Ll9pbml0JiZ0Ll9pbml0KCkpOmUuZGF0YSh0aGlzLHMsbmV3IGkobix0aGlzKSl9KSkscn19LGUuV2lkZ2V0PWZ1bmN0aW9uKCl7fSxlLldpZGdldC5fY2hpbGRDb25zdHJ1Y3RvcnM9W10sZS5XaWRnZXQucHJvdG90eXBlPXt3aWRnZXROYW1lOlwid2lkZ2V0XCIsd2lkZ2V0RXZlbnRQcmVmaXg6XCJcIixkZWZhdWx0RWxlbWVudDpcIjxkaXY+XCIsb3B0aW9uczp7ZGlzYWJsZWQ6ITEsY3JlYXRlOm51bGx9LF9jcmVhdGVXaWRnZXQ6ZnVuY3Rpb24odCxpKXtpPWUoaXx8dGhpcy5kZWZhdWx0RWxlbWVudHx8dGhpcylbMF0sdGhpcy5lbGVtZW50PWUoaSksdGhpcy51dWlkPWwrKyx0aGlzLmV2ZW50TmFtZXNwYWNlPVwiLlwiK3RoaXMud2lkZ2V0TmFtZSt0aGlzLnV1aWQsdGhpcy5iaW5kaW5ncz1lKCksdGhpcy5ob3ZlcmFibGU9ZSgpLHRoaXMuZm9jdXNhYmxlPWUoKSxpIT09dGhpcyYmKGUuZGF0YShpLHRoaXMud2lkZ2V0RnVsbE5hbWUsdGhpcyksdGhpcy5fb24oITAsdGhpcy5lbGVtZW50LHtyZW1vdmU6ZnVuY3Rpb24oZSl7ZS50YXJnZXQ9PT1pJiZ0aGlzLmRlc3Ryb3koKX19KSx0aGlzLmRvY3VtZW50PWUoaS5zdHlsZT9pLm93bmVyRG9jdW1lbnQ6aS5kb2N1bWVudHx8aSksdGhpcy53aW5kb3c9ZSh0aGlzLmRvY3VtZW50WzBdLmRlZmF1bHRWaWV3fHx0aGlzLmRvY3VtZW50WzBdLnBhcmVudFdpbmRvdykpLHRoaXMub3B0aW9ucz1lLndpZGdldC5leHRlbmQoe30sdGhpcy5vcHRpb25zLHRoaXMuX2dldENyZWF0ZU9wdGlvbnMoKSx0KSx0aGlzLl9jcmVhdGUoKSx0aGlzLl90cmlnZ2VyKFwiY3JlYXRlXCIsbnVsbCx0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSksdGhpcy5faW5pdCgpfSxfZ2V0Q3JlYXRlT3B0aW9uczplLm5vb3AsX2dldENyZWF0ZUV2ZW50RGF0YTplLm5vb3AsX2NyZWF0ZTplLm5vb3AsX2luaXQ6ZS5ub29wLGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9kZXN0cm95KCksdGhpcy5lbGVtZW50LnVuYmluZCh0aGlzLmV2ZW50TmFtZXNwYWNlKS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0RnVsbE5hbWUpLnJlbW92ZURhdGEoZS5jYW1lbENhc2UodGhpcy53aWRnZXRGdWxsTmFtZSkpLHRoaXMud2lkZ2V0KCkudW5iaW5kKHRoaXMuZXZlbnROYW1lc3BhY2UpLnJlbW92ZUF0dHIoXCJhcmlhLWRpc2FibGVkXCIpLnJlbW92ZUNsYXNzKHRoaXMud2lkZ2V0RnVsbE5hbWUrXCItZGlzYWJsZWQgXCIrXCJ1aS1zdGF0ZS1kaXNhYmxlZFwiKSx0aGlzLmJpbmRpbmdzLnVuYmluZCh0aGlzLmV2ZW50TmFtZXNwYWNlKSx0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyhcInVpLXN0YXRlLWhvdmVyXCIpLHRoaXMuZm9jdXNhYmxlLnJlbW92ZUNsYXNzKFwidWktc3RhdGUtZm9jdXNcIil9LF9kZXN0cm95OmUubm9vcCx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50fSxvcHRpb246ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGEsbz10O2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBlLndpZGdldC5leHRlbmQoe30sdGhpcy5vcHRpb25zKTtpZihcInN0cmluZ1wiPT10eXBlb2YgdClpZihvPXt9LHM9dC5zcGxpdChcIi5cIiksdD1zLnNoaWZ0KCkscy5sZW5ndGgpe2ZvcihuPW9bdF09ZS53aWRnZXQuZXh0ZW5kKHt9LHRoaXMub3B0aW9uc1t0XSksYT0wO3MubGVuZ3RoLTE+YTthKyspbltzW2FdXT1uW3NbYV1dfHx7fSxuPW5bc1thXV07aWYodD1zLnBvcCgpLDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1uW3RdP251bGw6blt0XTtuW3RdPWl9ZWxzZXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09dGhpcy5vcHRpb25zW3RdP251bGw6dGhpcy5vcHRpb25zW3RdO29bdF09aX1yZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyhvKSx0aGlzfSxfc2V0T3B0aW9uczpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlKXRoaXMuX3NldE9wdGlvbih0LGVbdF0pO3JldHVybiB0aGlzfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub3B0aW9uc1tlXT10LFwiZGlzYWJsZWRcIj09PWUmJih0aGlzLndpZGdldCgpLnRvZ2dsZUNsYXNzKHRoaXMud2lkZ2V0RnVsbE5hbWUrXCItZGlzYWJsZWRcIiwhIXQpLHQmJih0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyhcInVpLXN0YXRlLWhvdmVyXCIpLHRoaXMuZm9jdXNhYmxlLnJlbW92ZUNsYXNzKFwidWktc3RhdGUtZm9jdXNcIikpKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyh7ZGlzYWJsZWQ6ITF9KX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZXRPcHRpb25zKHtkaXNhYmxlZDohMH0pfSxfb246ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGE9dGhpcztcImJvb2xlYW5cIiE9dHlwZW9mIHQmJihzPWksaT10LHQ9ITEpLHM/KGk9bj1lKGkpLHRoaXMuYmluZGluZ3M9dGhpcy5iaW5kaW5ncy5hZGQoaSkpOihzPWksaT10aGlzLmVsZW1lbnQsbj10aGlzLndpZGdldCgpKSxlLmVhY2gocyxmdW5jdGlvbihzLG8pe2Z1bmN0aW9uIHIoKXtyZXR1cm4gdHx8YS5vcHRpb25zLmRpc2FibGVkIT09ITAmJiFlKHRoaXMpLmhhc0NsYXNzKFwidWktc3RhdGUtZGlzYWJsZWRcIik/KFwic3RyaW5nXCI9PXR5cGVvZiBvP2Fbb106bykuYXBwbHkoYSxhcmd1bWVudHMpOnZvaWQgMH1cInN0cmluZ1wiIT10eXBlb2YgbyYmKHIuZ3VpZD1vLmd1aWQ9by5ndWlkfHxyLmd1aWR8fGUuZ3VpZCsrKTt2YXIgaD1zLm1hdGNoKC9eKFtcXHc6LV0qKVxccyooLiopJC8pLGw9aFsxXSthLmV2ZW50TmFtZXNwYWNlLHU9aFsyXTt1P24uZGVsZWdhdGUodSxsLHIpOmkuYmluZChsLHIpfSl9LF9vZmY6ZnVuY3Rpb24odCxpKXtpPShpfHxcIlwiKS5zcGxpdChcIiBcIikuam9pbih0aGlzLmV2ZW50TmFtZXNwYWNlK1wiIFwiKSt0aGlzLmV2ZW50TmFtZXNwYWNlLHQudW5iaW5kKGkpLnVuZGVsZWdhdGUoaSksdGhpcy5iaW5kaW5ncz1lKHRoaXMuYmluZGluZ3Mubm90KHQpLmdldCgpKSx0aGlzLmZvY3VzYWJsZT1lKHRoaXMuZm9jdXNhYmxlLm5vdCh0KS5nZXQoKSksdGhpcy5ob3ZlcmFibGU9ZSh0aGlzLmhvdmVyYWJsZS5ub3QodCkuZ2V0KCkpfSxfZGVsYXk6ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBpKCl7cmV0dXJuKFwic3RyaW5nXCI9PXR5cGVvZiBlP3NbZV06ZSkuYXBwbHkocyxhcmd1bWVudHMpfXZhciBzPXRoaXM7cmV0dXJuIHNldFRpbWVvdXQoaSx0fHwwKX0sX2hvdmVyYWJsZTpmdW5jdGlvbih0KXt0aGlzLmhvdmVyYWJsZT10aGlzLmhvdmVyYWJsZS5hZGQodCksdGhpcy5fb24odCx7bW91c2VlbnRlcjpmdW5jdGlvbih0KXtlKHQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoXCJ1aS1zdGF0ZS1ob3ZlclwiKX0sbW91c2VsZWF2ZTpmdW5jdGlvbih0KXtlKHQuY3VycmVudFRhcmdldCkucmVtb3ZlQ2xhc3MoXCJ1aS1zdGF0ZS1ob3ZlclwiKX19KX0sX2ZvY3VzYWJsZTpmdW5jdGlvbih0KXt0aGlzLmZvY3VzYWJsZT10aGlzLmZvY3VzYWJsZS5hZGQodCksdGhpcy5fb24odCx7Zm9jdXNpbjpmdW5jdGlvbih0KXtlKHQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoXCJ1aS1zdGF0ZS1mb2N1c1wiKX0sZm9jdXNvdXQ6ZnVuY3Rpb24odCl7ZSh0LmN1cnJlbnRUYXJnZXQpLnJlbW92ZUNsYXNzKFwidWktc3RhdGUtZm9jdXNcIil9fSl9LF90cmlnZ2VyOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbixhLG89dGhpcy5vcHRpb25zW3RdO2lmKHM9c3x8e30saT1lLkV2ZW50KGkpLGkudHlwZT0odD09PXRoaXMud2lkZ2V0RXZlbnRQcmVmaXg/dDp0aGlzLndpZGdldEV2ZW50UHJlZml4K3QpLnRvTG93ZXJDYXNlKCksaS50YXJnZXQ9dGhpcy5lbGVtZW50WzBdLGE9aS5vcmlnaW5hbEV2ZW50KWZvcihuIGluIGEpbiBpbiBpfHwoaVtuXT1hW25dKTtyZXR1cm4gdGhpcy5lbGVtZW50LnRyaWdnZXIoaSxzKSwhKGUuaXNGdW5jdGlvbihvKSYmby5hcHBseSh0aGlzLmVsZW1lbnRbMF0sW2ldLmNvbmNhdChzKSk9PT0hMXx8aS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl9fSxlLmVhY2goe3Nob3c6XCJmYWRlSW5cIixoaWRlOlwiZmFkZU91dFwifSxmdW5jdGlvbih0LGkpe2UuV2lkZ2V0LnByb3RvdHlwZVtcIl9cIit0XT1mdW5jdGlvbihzLG4sYSl7XCJzdHJpbmdcIj09dHlwZW9mIG4mJihuPXtlZmZlY3Q6bn0pO3ZhciBvLHI9bj9uPT09ITB8fFwibnVtYmVyXCI9PXR5cGVvZiBuP2k6bi5lZmZlY3R8fGk6dDtuPW58fHt9LFwibnVtYmVyXCI9PXR5cGVvZiBuJiYobj17ZHVyYXRpb246bn0pLG89IWUuaXNFbXB0eU9iamVjdChuKSxuLmNvbXBsZXRlPWEsbi5kZWxheSYmcy5kZWxheShuLmRlbGF5KSxvJiZlLmVmZmVjdHMmJmUuZWZmZWN0cy5lZmZlY3Rbcl0/c1t0XShuKTpyIT09dCYmc1tyXT9zW3JdKG4uZHVyYXRpb24sbi5lYXNpbmcsYSk6cy5xdWV1ZShmdW5jdGlvbihpKXtlKHRoaXMpW3RdKCksYSYmYS5jYWxsKHNbMF0pLGkoKX0pfX0pLGUud2lkZ2V0O3ZhciBkPSExO2UoZG9jdW1lbnQpLm1vdXNldXAoZnVuY3Rpb24oKXtkPSExfSksZS53aWRnZXQoXCJ1aS5tb3VzZVwiLHt2ZXJzaW9uOlwiMS4xMS40XCIsb3B0aW9uczp7Y2FuY2VsOlwiaW5wdXQsdGV4dGFyZWEsYnV0dG9uLHNlbGVjdCxvcHRpb25cIixkaXN0YW5jZToxLGRlbGF5OjB9LF9tb3VzZUluaXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuZWxlbWVudC5iaW5kKFwibW91c2Vkb3duLlwiK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbihlKXtyZXR1cm4gdC5fbW91c2VEb3duKGUpfSkuYmluZChcImNsaWNrLlwiK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbihpKXtyZXR1cm4hMD09PWUuZGF0YShpLnRhcmdldCx0LndpZGdldE5hbWUrXCIucHJldmVudENsaWNrRXZlbnRcIik/KGUucmVtb3ZlRGF0YShpLnRhcmdldCx0LndpZGdldE5hbWUrXCIucHJldmVudENsaWNrRXZlbnRcIiksaS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwhMSk6dm9pZCAwfSksdGhpcy5zdGFydGVkPSExfSxfbW91c2VEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnVuYmluZChcIi5cIit0aGlzLndpZGdldE5hbWUpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlJiZ0aGlzLmRvY3VtZW50LnVuYmluZChcIm1vdXNlbW92ZS5cIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUpLnVuYmluZChcIm1vdXNldXAuXCIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSl9LF9tb3VzZURvd246ZnVuY3Rpb24odCl7aWYoIWQpe3RoaXMuX21vdXNlTW92ZWQ9ITEsdGhpcy5fbW91c2VTdGFydGVkJiZ0aGlzLl9tb3VzZVVwKHQpLHRoaXMuX21vdXNlRG93bkV2ZW50PXQ7dmFyIGk9dGhpcyxzPTE9PT10LndoaWNoLG49XCJzdHJpbmdcIj09dHlwZW9mIHRoaXMub3B0aW9ucy5jYW5jZWwmJnQudGFyZ2V0Lm5vZGVOYW1lP2UodC50YXJnZXQpLmNsb3Nlc3QodGhpcy5vcHRpb25zLmNhbmNlbCkubGVuZ3RoOiExO3JldHVybiBzJiYhbiYmdGhpcy5fbW91c2VDYXB0dXJlKHQpPyh0aGlzLm1vdXNlRGVsYXlNZXQ9IXRoaXMub3B0aW9ucy5kZWxheSx0aGlzLm1vdXNlRGVsYXlNZXR8fCh0aGlzLl9tb3VzZURlbGF5VGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe2kubW91c2VEZWxheU1ldD0hMH0sdGhpcy5vcHRpb25zLmRlbGF5KSksdGhpcy5fbW91c2VEaXN0YW5jZU1ldCh0KSYmdGhpcy5fbW91c2VEZWxheU1ldCh0KSYmKHRoaXMuX21vdXNlU3RhcnRlZD10aGlzLl9tb3VzZVN0YXJ0KHQpIT09ITEsIXRoaXMuX21vdXNlU3RhcnRlZCk/KHQucHJldmVudERlZmF1bHQoKSwhMCk6KCEwPT09ZS5kYXRhKHQudGFyZ2V0LHRoaXMud2lkZ2V0TmFtZStcIi5wcmV2ZW50Q2xpY2tFdmVudFwiKSYmZS5yZW1vdmVEYXRhKHQudGFyZ2V0LHRoaXMud2lkZ2V0TmFtZStcIi5wcmV2ZW50Q2xpY2tFdmVudFwiKSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZT1mdW5jdGlvbihlKXtyZXR1cm4gaS5fbW91c2VNb3ZlKGUpfSx0aGlzLl9tb3VzZVVwRGVsZWdhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGkuX21vdXNlVXAoZSl9LHRoaXMuZG9jdW1lbnQuYmluZChcIm1vdXNlbW92ZS5cIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUpLmJpbmQoXCJtb3VzZXVwLlwiK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpLHQucHJldmVudERlZmF1bHQoKSxkPSEwLCEwKSk6ITB9fSxfbW91c2VNb3ZlOmZ1bmN0aW9uKHQpe2lmKHRoaXMuX21vdXNlTW92ZWQpe2lmKGUudWkuaWUmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PmRvY3VtZW50LmRvY3VtZW50TW9kZSkmJiF0LmJ1dHRvbilyZXR1cm4gdGhpcy5fbW91c2VVcCh0KTtpZighdC53aGljaClyZXR1cm4gdGhpcy5fbW91c2VVcCh0KX1yZXR1cm4odC53aGljaHx8dC5idXR0b24pJiYodGhpcy5fbW91c2VNb3ZlZD0hMCksdGhpcy5fbW91c2VTdGFydGVkPyh0aGlzLl9tb3VzZURyYWcodCksdC5wcmV2ZW50RGVmYXVsdCgpKToodGhpcy5fbW91c2VEaXN0YW5jZU1ldCh0KSYmdGhpcy5fbW91c2VEZWxheU1ldCh0KSYmKHRoaXMuX21vdXNlU3RhcnRlZD10aGlzLl9tb3VzZVN0YXJ0KHRoaXMuX21vdXNlRG93bkV2ZW50LHQpIT09ITEsdGhpcy5fbW91c2VTdGFydGVkP3RoaXMuX21vdXNlRHJhZyh0KTp0aGlzLl9tb3VzZVVwKHQpKSwhdGhpcy5fbW91c2VTdGFydGVkKX0sX21vdXNlVXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZG9jdW1lbnQudW5iaW5kKFwibW91c2Vtb3ZlLlwiK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkudW5iaW5kKFwibW91c2V1cC5cIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKSx0aGlzLl9tb3VzZVN0YXJ0ZWQmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9ITEsdC50YXJnZXQ9PT10aGlzLl9tb3VzZURvd25FdmVudC50YXJnZXQmJmUuZGF0YSh0LnRhcmdldCx0aGlzLndpZGdldE5hbWUrXCIucHJldmVudENsaWNrRXZlbnRcIiwhMCksdGhpcy5fbW91c2VTdG9wKHQpKSxkPSExLCExfSxfbW91c2VEaXN0YW5jZU1ldDpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnModGhpcy5fbW91c2VEb3duRXZlbnQucGFnZVgtZS5wYWdlWCksTWF0aC5hYnModGhpcy5fbW91c2VEb3duRXZlbnQucGFnZVktZS5wYWdlWSkpPj10aGlzLm9wdGlvbnMuZGlzdGFuY2V9LF9tb3VzZURlbGF5TWV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW91c2VEZWxheU1ldH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oKXt9LF9tb3VzZURyYWc6ZnVuY3Rpb24oKXt9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oKXt9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KSxmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSx0LGkpe3JldHVybltwYXJzZUZsb2F0KGVbMF0pKihwLnRlc3QoZVswXSk/dC8xMDA6MSkscGFyc2VGbG9hdChlWzFdKSoocC50ZXN0KGVbMV0pP2kvMTAwOjEpXX1mdW5jdGlvbiBpKHQsaSl7cmV0dXJuIHBhcnNlSW50KGUuY3NzKHQsaSksMTApfHwwfWZ1bmN0aW9uIHModCl7dmFyIGk9dFswXTtyZXR1cm4gOT09PWkubm9kZVR5cGU/e3dpZHRoOnQud2lkdGgoKSxoZWlnaHQ6dC5oZWlnaHQoKSxvZmZzZXQ6e3RvcDowLGxlZnQ6MH19OmUuaXNXaW5kb3coaSk/e3dpZHRoOnQud2lkdGgoKSxoZWlnaHQ6dC5oZWlnaHQoKSxvZmZzZXQ6e3RvcDp0LnNjcm9sbFRvcCgpLGxlZnQ6dC5zY3JvbGxMZWZ0KCl9fTppLnByZXZlbnREZWZhdWx0P3t3aWR0aDowLGhlaWdodDowLG9mZnNldDp7dG9wOmkucGFnZVksbGVmdDppLnBhZ2VYfX06e3dpZHRoOnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0Lm91dGVySGVpZ2h0KCksb2Zmc2V0OnQub2Zmc2V0KCl9fWUudWk9ZS51aXx8e307dmFyIG4sYSxvPU1hdGgubWF4LHI9TWF0aC5hYnMsaD1NYXRoLnJvdW5kLGw9L2xlZnR8Y2VudGVyfHJpZ2h0Lyx1PS90b3B8Y2VudGVyfGJvdHRvbS8sZD0vW1xcK1xcLV1cXGQrKFxcLltcXGRdKyk/JT8vLGM9L15cXHcrLyxwPS8lJC8sZj1lLmZuLnBvc2l0aW9uO2UucG9zaXRpb249e3Njcm9sbGJhcldpZHRoOmZ1bmN0aW9uKCl7aWYodm9pZCAwIT09bilyZXR1cm4gbjt2YXIgdCxpLHM9ZShcIjxkaXYgc3R5bGU9J2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6NTBweDtoZWlnaHQ6NTBweDtvdmVyZmxvdzpoaWRkZW47Jz48ZGl2IHN0eWxlPSdoZWlnaHQ6MTAwcHg7d2lkdGg6YXV0bzsnPjwvZGl2PjwvZGl2PlwiKSxhPXMuY2hpbGRyZW4oKVswXTtyZXR1cm4gZShcImJvZHlcIikuYXBwZW5kKHMpLHQ9YS5vZmZzZXRXaWR0aCxzLmNzcyhcIm92ZXJmbG93XCIsXCJzY3JvbGxcIiksaT1hLm9mZnNldFdpZHRoLHQ9PT1pJiYoaT1zWzBdLmNsaWVudFdpZHRoKSxzLnJlbW92ZSgpLG49dC1pfSxnZXRTY3JvbGxJbmZvOmZ1bmN0aW9uKHQpe3ZhciBpPXQuaXNXaW5kb3d8fHQuaXNEb2N1bWVudD9cIlwiOnQuZWxlbWVudC5jc3MoXCJvdmVyZmxvdy14XCIpLHM9dC5pc1dpbmRvd3x8dC5pc0RvY3VtZW50P1wiXCI6dC5lbGVtZW50LmNzcyhcIm92ZXJmbG93LXlcIiksbj1cInNjcm9sbFwiPT09aXx8XCJhdXRvXCI9PT1pJiZ0LndpZHRoPHQuZWxlbWVudFswXS5zY3JvbGxXaWR0aCxhPVwic2Nyb2xsXCI9PT1zfHxcImF1dG9cIj09PXMmJnQuaGVpZ2h0PHQuZWxlbWVudFswXS5zY3JvbGxIZWlnaHQ7cmV0dXJue3dpZHRoOmE/ZS5wb3NpdGlvbi5zY3JvbGxiYXJXaWR0aCgpOjAsaGVpZ2h0Om4/ZS5wb3NpdGlvbi5zY3JvbGxiYXJXaWR0aCgpOjB9fSxnZXRXaXRoaW5JbmZvOmZ1bmN0aW9uKHQpe3ZhciBpPWUodHx8d2luZG93KSxzPWUuaXNXaW5kb3coaVswXSksbj0hIWlbMF0mJjk9PT1pWzBdLm5vZGVUeXBlO3JldHVybntlbGVtZW50OmksaXNXaW5kb3c6cyxpc0RvY3VtZW50Om4sb2Zmc2V0Omkub2Zmc2V0KCl8fHtsZWZ0OjAsdG9wOjB9LHNjcm9sbExlZnQ6aS5zY3JvbGxMZWZ0KCksc2Nyb2xsVG9wOmkuc2Nyb2xsVG9wKCksd2lkdGg6c3x8bj9pLndpZHRoKCk6aS5vdXRlcldpZHRoKCksaGVpZ2h0OnN8fG4/aS5oZWlnaHQoKTppLm91dGVySGVpZ2h0KCl9fX0sZS5mbi5wb3NpdGlvbj1mdW5jdGlvbihuKXtpZighbnx8IW4ub2YpcmV0dXJuIGYuYXBwbHkodGhpcyxhcmd1bWVudHMpO249ZS5leHRlbmQoe30sbik7dmFyIHAsbSxnLHYseSxiLF89ZShuLm9mKSx4PWUucG9zaXRpb24uZ2V0V2l0aGluSW5mbyhuLndpdGhpbiksdz1lLnBvc2l0aW9uLmdldFNjcm9sbEluZm8oeCksaz0obi5jb2xsaXNpb258fFwiZmxpcFwiKS5zcGxpdChcIiBcIiksVD17fTtyZXR1cm4gYj1zKF8pLF9bMF0ucHJldmVudERlZmF1bHQmJihuLmF0PVwibGVmdCB0b3BcIiksbT1iLndpZHRoLGc9Yi5oZWlnaHQsdj1iLm9mZnNldCx5PWUuZXh0ZW5kKHt9LHYpLGUuZWFjaChbXCJteVwiLFwiYXRcIl0sZnVuY3Rpb24oKXt2YXIgZSx0LGk9KG5bdGhpc118fFwiXCIpLnNwbGl0KFwiIFwiKTsxPT09aS5sZW5ndGgmJihpPWwudGVzdChpWzBdKT9pLmNvbmNhdChbXCJjZW50ZXJcIl0pOnUudGVzdChpWzBdKT9bXCJjZW50ZXJcIl0uY29uY2F0KGkpOltcImNlbnRlclwiLFwiY2VudGVyXCJdKSxpWzBdPWwudGVzdChpWzBdKT9pWzBdOlwiY2VudGVyXCIsaVsxXT11LnRlc3QoaVsxXSk/aVsxXTpcImNlbnRlclwiLGU9ZC5leGVjKGlbMF0pLHQ9ZC5leGVjKGlbMV0pLFRbdGhpc109W2U/ZVswXTowLHQ/dFswXTowXSxuW3RoaXNdPVtjLmV4ZWMoaVswXSlbMF0sYy5leGVjKGlbMV0pWzBdXX0pLDE9PT1rLmxlbmd0aCYmKGtbMV09a1swXSksXCJyaWdodFwiPT09bi5hdFswXT95LmxlZnQrPW06XCJjZW50ZXJcIj09PW4uYXRbMF0mJih5LmxlZnQrPW0vMiksXCJib3R0b21cIj09PW4uYXRbMV0/eS50b3ArPWc6XCJjZW50ZXJcIj09PW4uYXRbMV0mJih5LnRvcCs9Zy8yKSxwPXQoVC5hdCxtLGcpLHkubGVmdCs9cFswXSx5LnRvcCs9cFsxXSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgcyxsLHU9ZSh0aGlzKSxkPXUub3V0ZXJXaWR0aCgpLGM9dS5vdXRlckhlaWdodCgpLGY9aSh0aGlzLFwibWFyZ2luTGVmdFwiKSxiPWkodGhpcyxcIm1hcmdpblRvcFwiKSxEPWQrZitpKHRoaXMsXCJtYXJnaW5SaWdodFwiKSt3LndpZHRoLFM9YytiK2kodGhpcyxcIm1hcmdpbkJvdHRvbVwiKSt3LmhlaWdodCxNPWUuZXh0ZW5kKHt9LHkpLEM9dChULm15LHUub3V0ZXJXaWR0aCgpLHUub3V0ZXJIZWlnaHQoKSk7XCJyaWdodFwiPT09bi5teVswXT9NLmxlZnQtPWQ6XCJjZW50ZXJcIj09PW4ubXlbMF0mJihNLmxlZnQtPWQvMiksXCJib3R0b21cIj09PW4ubXlbMV0/TS50b3AtPWM6XCJjZW50ZXJcIj09PW4ubXlbMV0mJihNLnRvcC09Yy8yKSxNLmxlZnQrPUNbMF0sTS50b3ArPUNbMV0sYXx8KE0ubGVmdD1oKE0ubGVmdCksTS50b3A9aChNLnRvcCkpLHM9e21hcmdpbkxlZnQ6ZixtYXJnaW5Ub3A6Yn0sZS5lYWNoKFtcImxlZnRcIixcInRvcFwiXSxmdW5jdGlvbih0LGkpe2UudWkucG9zaXRpb25ba1t0XV0mJmUudWkucG9zaXRpb25ba1t0XV1baV0oTSx7dGFyZ2V0V2lkdGg6bSx0YXJnZXRIZWlnaHQ6ZyxlbGVtV2lkdGg6ZCxlbGVtSGVpZ2h0OmMsY29sbGlzaW9uUG9zaXRpb246cyxjb2xsaXNpb25XaWR0aDpELGNvbGxpc2lvbkhlaWdodDpTLG9mZnNldDpbcFswXStDWzBdLHBbMV0rQ1sxXV0sbXk6bi5teSxhdDpuLmF0LHdpdGhpbjp4LGVsZW06dX0pfSksbi51c2luZyYmKGw9ZnVuY3Rpb24oZSl7dmFyIHQ9di5sZWZ0LU0ubGVmdCxpPXQrbS1kLHM9di50b3AtTS50b3AsYT1zK2ctYyxoPXt0YXJnZXQ6e2VsZW1lbnQ6XyxsZWZ0OnYubGVmdCx0b3A6di50b3Asd2lkdGg6bSxoZWlnaHQ6Z30sZWxlbWVudDp7ZWxlbWVudDp1LGxlZnQ6TS5sZWZ0LHRvcDpNLnRvcCx3aWR0aDpkLGhlaWdodDpjfSxob3Jpem9udGFsOjA+aT9cImxlZnRcIjp0PjA/XCJyaWdodFwiOlwiY2VudGVyXCIsdmVydGljYWw6MD5hP1widG9wXCI6cz4wP1wiYm90dG9tXCI6XCJtaWRkbGVcIn07ZD5tJiZtPnIodCtpKSYmKGguaG9yaXpvbnRhbD1cImNlbnRlclwiKSxjPmcmJmc+cihzK2EpJiYoaC52ZXJ0aWNhbD1cIm1pZGRsZVwiKSxoLmltcG9ydGFudD1vKHIodCkscihpKSk+byhyKHMpLHIoYSkpP1wiaG9yaXpvbnRhbFwiOlwidmVydGljYWxcIixuLnVzaW5nLmNhbGwodGhpcyxlLGgpfSksdS5vZmZzZXQoZS5leHRlbmQoTSx7dXNpbmc6bH0pKX0pfSxlLnVpLnBvc2l0aW9uPXtmaXQ6e2xlZnQ6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzPXQud2l0aGluLG49cy5pc1dpbmRvdz9zLnNjcm9sbExlZnQ6cy5vZmZzZXQubGVmdCxhPXMud2lkdGgscj1lLmxlZnQtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5MZWZ0LGg9bi1yLGw9cit0LmNvbGxpc2lvbldpZHRoLWEtbjt0LmNvbGxpc2lvbldpZHRoPmE/aD4wJiYwPj1sPyhpPWUubGVmdCtoK3QuY29sbGlzaW9uV2lkdGgtYS1uLGUubGVmdCs9aC1pKTplLmxlZnQ9bD4wJiYwPj1oP246aD5sP24rYS10LmNvbGxpc2lvbldpZHRoOm46aD4wP2UubGVmdCs9aDpsPjA/ZS5sZWZ0LT1sOmUubGVmdD1vKGUubGVmdC1yLGUubGVmdCl9LHRvcDpmdW5jdGlvbihlLHQpe3ZhciBpLHM9dC53aXRoaW4sbj1zLmlzV2luZG93P3Muc2Nyb2xsVG9wOnMub2Zmc2V0LnRvcCxhPXQud2l0aGluLmhlaWdodCxyPWUudG9wLXQuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luVG9wLGg9bi1yLGw9cit0LmNvbGxpc2lvbkhlaWdodC1hLW47dC5jb2xsaXNpb25IZWlnaHQ+YT9oPjAmJjA+PWw/KGk9ZS50b3AraCt0LmNvbGxpc2lvbkhlaWdodC1hLW4sZS50b3ArPWgtaSk6ZS50b3A9bD4wJiYwPj1oP246aD5sP24rYS10LmNvbGxpc2lvbkhlaWdodDpuOmg+MD9lLnRvcCs9aDpsPjA/ZS50b3AtPWw6ZS50b3A9byhlLnRvcC1yLGUudG9wKX19LGZsaXA6e2xlZnQ6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzLG49dC53aXRoaW4sYT1uLm9mZnNldC5sZWZ0K24uc2Nyb2xsTGVmdCxvPW4ud2lkdGgsaD1uLmlzV2luZG93P24uc2Nyb2xsTGVmdDpuLm9mZnNldC5sZWZ0LGw9ZS5sZWZ0LXQuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luTGVmdCx1PWwtaCxkPWwrdC5jb2xsaXNpb25XaWR0aC1vLWgsYz1cImxlZnRcIj09PXQubXlbMF0/LXQuZWxlbVdpZHRoOlwicmlnaHRcIj09PXQubXlbMF0/dC5lbGVtV2lkdGg6MCxwPVwibGVmdFwiPT09dC5hdFswXT90LnRhcmdldFdpZHRoOlwicmlnaHRcIj09PXQuYXRbMF0/LXQudGFyZ2V0V2lkdGg6MCxmPS0yKnQub2Zmc2V0WzBdOzA+dT8oaT1lLmxlZnQrYytwK2YrdC5jb2xsaXNpb25XaWR0aC1vLWEsKDA+aXx8cih1KT5pKSYmKGUubGVmdCs9YytwK2YpKTpkPjAmJihzPWUubGVmdC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpbkxlZnQrYytwK2YtaCwocz4wfHxkPnIocykpJiYoZS5sZWZ0Kz1jK3ArZikpfSx0b3A6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzLG49dC53aXRoaW4sYT1uLm9mZnNldC50b3Arbi5zY3JvbGxUb3Asbz1uLmhlaWdodCxoPW4uaXNXaW5kb3c/bi5zY3JvbGxUb3A6bi5vZmZzZXQudG9wLGw9ZS50b3AtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5Ub3AsdT1sLWgsZD1sK3QuY29sbGlzaW9uSGVpZ2h0LW8taCxjPVwidG9wXCI9PT10Lm15WzFdLHA9Yz8tdC5lbGVtSGVpZ2h0OlwiYm90dG9tXCI9PT10Lm15WzFdP3QuZWxlbUhlaWdodDowLGY9XCJ0b3BcIj09PXQuYXRbMV0/dC50YXJnZXRIZWlnaHQ6XCJib3R0b21cIj09PXQuYXRbMV0/LXQudGFyZ2V0SGVpZ2h0OjAsbT0tMip0Lm9mZnNldFsxXTswPnU/KHM9ZS50b3ArcCtmK20rdC5jb2xsaXNpb25IZWlnaHQtby1hLCgwPnN8fHIodSk+cykmJihlLnRvcCs9cCtmK20pKTpkPjAmJihpPWUudG9wLXQuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luVG9wK3ArZittLWgsKGk+MHx8ZD5yKGkpKSYmKGUudG9wKz1wK2YrbSkpfX0sZmxpcGZpdDp7bGVmdDpmdW5jdGlvbigpe2UudWkucG9zaXRpb24uZmxpcC5sZWZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnVpLnBvc2l0aW9uLmZpdC5sZWZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdG9wOmZ1bmN0aW9uKCl7ZS51aS5wb3NpdGlvbi5mbGlwLnRvcC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS51aS5wb3NpdGlvbi5maXQudG9wLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fSxmdW5jdGlvbigpe3ZhciB0LGkscyxuLG8scj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIilbMF0saD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChyP1wiZGl2XCI6XCJib2R5XCIpLHM9e3Zpc2liaWxpdHk6XCJoaWRkZW5cIix3aWR0aDowLGhlaWdodDowLGJvcmRlcjowLG1hcmdpbjowLGJhY2tncm91bmQ6XCJub25lXCJ9LHImJmUuZXh0ZW5kKHMse3Bvc2l0aW9uOlwiYWJzb2x1dGVcIixsZWZ0OlwiLTEwMDBweFwiLHRvcDpcIi0xMDAwcHhcIn0pO2ZvcihvIGluIHMpdC5zdHlsZVtvXT1zW29dO3QuYXBwZW5kQ2hpbGQoaCksaT1yfHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsaS5pbnNlcnRCZWZvcmUodCxpLmZpcnN0Q2hpbGQpLGguc3R5bGUuY3NzVGV4dD1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMTAuNzQzMjIyMnB4O1wiLG49ZShoKS5vZmZzZXQoKS5sZWZ0LGE9bj4xMCYmMTE+bix0LmlubmVySFRNTD1cIlwiLGkucmVtb3ZlQ2hpbGQodCl9KCl9KCksZS51aS5wb3NpdGlvbixlLndpZGdldChcInVpLmFjY29yZGlvblwiLHt2ZXJzaW9uOlwiMS4xMS40XCIsb3B0aW9uczp7YWN0aXZlOjAsYW5pbWF0ZTp7fSxjb2xsYXBzaWJsZTohMSxldmVudDpcImNsaWNrXCIsaGVhZGVyOlwiPiBsaSA+IDpmaXJzdC1jaGlsZCw+IDpub3QobGkpOmV2ZW5cIixoZWlnaHRTdHlsZTpcImF1dG9cIixpY29uczp7YWN0aXZlSGVhZGVyOlwidWktaWNvbi10cmlhbmdsZS0xLXNcIixoZWFkZXI6XCJ1aS1pY29uLXRyaWFuZ2xlLTEtZVwifSxhY3RpdmF0ZTpudWxsLGJlZm9yZUFjdGl2YXRlOm51bGx9LGhpZGVQcm9wczp7Ym9yZGVyVG9wV2lkdGg6XCJoaWRlXCIsYm9yZGVyQm90dG9tV2lkdGg6XCJoaWRlXCIscGFkZGluZ1RvcDpcImhpZGVcIixwYWRkaW5nQm90dG9tOlwiaGlkZVwiLGhlaWdodDpcImhpZGVcIn0sc2hvd1Byb3BzOntib3JkZXJUb3BXaWR0aDpcInNob3dcIixib3JkZXJCb3R0b21XaWR0aDpcInNob3dcIixwYWRkaW5nVG9wOlwic2hvd1wiLHBhZGRpbmdCb3R0b206XCJzaG93XCIsaGVpZ2h0Olwic2hvd1wifSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zO3RoaXMucHJldlNob3c9dGhpcy5wcmV2SGlkZT1lKCksdGhpcy5lbGVtZW50LmFkZENsYXNzKFwidWktYWNjb3JkaW9uIHVpLXdpZGdldCB1aS1oZWxwZXItcmVzZXRcIikuYXR0cihcInJvbGVcIixcInRhYmxpc3RcIiksdC5jb2xsYXBzaWJsZXx8dC5hY3RpdmUhPT0hMSYmbnVsbCE9dC5hY3RpdmV8fCh0LmFjdGl2ZT0wKSx0aGlzLl9wcm9jZXNzUGFuZWxzKCksMD50LmFjdGl2ZSYmKHQuYWN0aXZlKz10aGlzLmhlYWRlcnMubGVuZ3RoKSx0aGlzLl9yZWZyZXNoKCl9LF9nZXRDcmVhdGVFdmVudERhdGE6ZnVuY3Rpb24oKXtyZXR1cm57aGVhZGVyOnRoaXMuYWN0aXZlLHBhbmVsOnRoaXMuYWN0aXZlLmxlbmd0aD90aGlzLmFjdGl2ZS5uZXh0KCk6ZSgpfX0sX2NyZWF0ZUljb25zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLmljb25zO3QmJihlKFwiPHNwYW4+XCIpLmFkZENsYXNzKFwidWktYWNjb3JkaW9uLWhlYWRlci1pY29uIHVpLWljb24gXCIrdC5oZWFkZXIpLnByZXBlbmRUbyh0aGlzLmhlYWRlcnMpLHRoaXMuYWN0aXZlLmNoaWxkcmVuKFwiLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvblwiKS5yZW1vdmVDbGFzcyh0LmhlYWRlcikuYWRkQ2xhc3ModC5hY3RpdmVIZWFkZXIpLHRoaXMuaGVhZGVycy5hZGRDbGFzcyhcInVpLWFjY29yZGlvbi1pY29uc1wiKSl9LF9kZXN0cm95SWNvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlYWRlcnMucmVtb3ZlQ2xhc3MoXCJ1aS1hY2NvcmRpb24taWNvbnNcIikuY2hpbGRyZW4oXCIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uXCIpLnJlbW92ZSgpfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciBlO3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhcInVpLWFjY29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0XCIpLnJlbW92ZUF0dHIoXCJyb2xlXCIpLHRoaXMuaGVhZGVycy5yZW1vdmVDbGFzcyhcInVpLWFjY29yZGlvbi1oZWFkZXIgdWktYWNjb3JkaW9uLWhlYWRlci1hY3RpdmUgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCB1aS1jb3JuZXItdG9wXCIpLnJlbW92ZUF0dHIoXCJyb2xlXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWV4cGFuZGVkXCIpLnJlbW92ZUF0dHIoXCJhcmlhLXNlbGVjdGVkXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWNvbnRyb2xzXCIpLnJlbW92ZUF0dHIoXCJ0YWJJbmRleFwiKS5yZW1vdmVVbmlxdWVJZCgpLHRoaXMuX2Rlc3Ryb3lJY29ucygpLGU9dGhpcy5oZWFkZXJzLm5leHQoKS5yZW1vdmVDbGFzcyhcInVpLWhlbHBlci1yZXNldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIHVpLWFjY29yZGlvbi1jb250ZW50IHVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZFwiKS5jc3MoXCJkaXNwbGF5XCIsXCJcIikucmVtb3ZlQXR0cihcInJvbGVcIikucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWxhYmVsbGVkYnlcIikucmVtb3ZlVW5pcXVlSWQoKSxcImNvbnRlbnRcIiE9PXRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSYmZS5jc3MoXCJoZWlnaHRcIixcIlwiKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe3JldHVyblwiYWN0aXZlXCI9PT1lPyh0aGlzLl9hY3RpdmF0ZSh0KSx2b2lkIDApOihcImV2ZW50XCI9PT1lJiYodGhpcy5vcHRpb25zLmV2ZW50JiZ0aGlzLl9vZmYodGhpcy5oZWFkZXJzLHRoaXMub3B0aW9ucy5ldmVudCksdGhpcy5fc2V0dXBFdmVudHModCkpLHRoaXMuX3N1cGVyKGUsdCksXCJjb2xsYXBzaWJsZVwiIT09ZXx8dHx8dGhpcy5vcHRpb25zLmFjdGl2ZSE9PSExfHx0aGlzLl9hY3RpdmF0ZSgwKSxcImljb25zXCI9PT1lJiYodGhpcy5fZGVzdHJveUljb25zKCksdCYmdGhpcy5fY3JlYXRlSWNvbnMoKSksXCJkaXNhYmxlZFwiPT09ZSYmKHRoaXMuZWxlbWVudC50b2dnbGVDbGFzcyhcInVpLXN0YXRlLWRpc2FibGVkXCIsISF0KS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLHQpLHRoaXMuaGVhZGVycy5hZGQodGhpcy5oZWFkZXJzLm5leHQoKSkudG9nZ2xlQ2xhc3MoXCJ1aS1zdGF0ZS1kaXNhYmxlZFwiLCEhdCkpLHZvaWQgMCl9LF9rZXlkb3duOmZ1bmN0aW9uKHQpe2lmKCF0LmFsdEtleSYmIXQuY3RybEtleSl7dmFyIGk9ZS51aS5rZXlDb2RlLHM9dGhpcy5oZWFkZXJzLmxlbmd0aCxuPXRoaXMuaGVhZGVycy5pbmRleCh0LnRhcmdldCksYT0hMTtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIGkuUklHSFQ6Y2FzZSBpLkRPV046YT10aGlzLmhlYWRlcnNbKG4rMSklc107YnJlYWs7Y2FzZSBpLkxFRlQ6Y2FzZSBpLlVQOmE9dGhpcy5oZWFkZXJzWyhuLTErcyklc107YnJlYWs7Y2FzZSBpLlNQQUNFOmNhc2UgaS5FTlRFUjp0aGlzLl9ldmVudEhhbmRsZXIodCk7YnJlYWs7Y2FzZSBpLkhPTUU6YT10aGlzLmhlYWRlcnNbMF07YnJlYWs7Y2FzZSBpLkVORDphPXRoaXMuaGVhZGVyc1tzLTFdfWEmJihlKHQudGFyZ2V0KS5hdHRyKFwidGFiSW5kZXhcIiwtMSksZShhKS5hdHRyKFwidGFiSW5kZXhcIiwwKSxhLmZvY3VzKCksdC5wcmV2ZW50RGVmYXVsdCgpKX19LF9wYW5lbEtleURvd246ZnVuY3Rpb24odCl7dC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLlVQJiZ0LmN0cmxLZXkmJmUodC5jdXJyZW50VGFyZ2V0KS5wcmV2KCkuZm9jdXMoKX0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uczt0aGlzLl9wcm9jZXNzUGFuZWxzKCksdC5hY3RpdmU9PT0hMSYmdC5jb2xsYXBzaWJsZT09PSEwfHwhdGhpcy5oZWFkZXJzLmxlbmd0aD8odC5hY3RpdmU9ITEsdGhpcy5hY3RpdmU9ZSgpKTp0LmFjdGl2ZT09PSExP3RoaXMuX2FjdGl2YXRlKDApOnRoaXMuYWN0aXZlLmxlbmd0aCYmIWUuY29udGFpbnModGhpcy5lbGVtZW50WzBdLHRoaXMuYWN0aXZlWzBdKT90aGlzLmhlYWRlcnMubGVuZ3RoPT09dGhpcy5oZWFkZXJzLmZpbmQoXCIudWktc3RhdGUtZGlzYWJsZWRcIikubGVuZ3RoPyh0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpOnRoaXMuX2FjdGl2YXRlKE1hdGgubWF4KDAsdC5hY3RpdmUtMSkpOnQuYWN0aXZlPXRoaXMuaGVhZGVycy5pbmRleCh0aGlzLmFjdGl2ZSksdGhpcy5fZGVzdHJveUljb25zKCksdGhpcy5fcmVmcmVzaCgpfSxfcHJvY2Vzc1BhbmVsczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaGVhZGVycyx0PXRoaXMucGFuZWxzO3RoaXMuaGVhZGVycz10aGlzLmVsZW1lbnQuZmluZCh0aGlzLm9wdGlvbnMuaGVhZGVyKS5hZGRDbGFzcyhcInVpLWFjY29yZGlvbi1oZWFkZXIgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsXCIpLHRoaXMucGFuZWxzPXRoaXMuaGVhZGVycy5uZXh0KCkuYWRkQ2xhc3MoXCJ1aS1hY2NvcmRpb24tY29udGVudCB1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbVwiKS5maWx0ZXIoXCI6bm90KC51aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUpXCIpLmhpZGUoKSx0JiYodGhpcy5fb2ZmKGUubm90KHRoaXMuaGVhZGVycykpLHRoaXMuX29mZih0Lm5vdCh0aGlzLnBhbmVscykpKX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdCxpPXRoaXMub3B0aW9ucyxzPWkuaGVpZ2h0U3R5bGUsbj10aGlzLmVsZW1lbnQucGFyZW50KCk7dGhpcy5hY3RpdmU9dGhpcy5fZmluZEFjdGl2ZShpLmFjdGl2ZSkuYWRkQ2xhc3MoXCJ1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcFwiKS5yZW1vdmVDbGFzcyhcInVpLWNvcm5lci1hbGxcIiksdGhpcy5hY3RpdmUubmV4dCgpLmFkZENsYXNzKFwidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlXCIpLnNob3coKSx0aGlzLmhlYWRlcnMuYXR0cihcInJvbGVcIixcInRhYlwiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKSxpPXQudW5pcXVlSWQoKS5hdHRyKFwiaWRcIikscz10Lm5leHQoKSxuPXMudW5pcXVlSWQoKS5hdHRyKFwiaWRcIik7dC5hdHRyKFwiYXJpYS1jb250cm9sc1wiLG4pLHMuYXR0cihcImFyaWEtbGFiZWxsZWRieVwiLGkpfSkubmV4dCgpLmF0dHIoXCJyb2xlXCIsXCJ0YWJwYW5lbFwiKSx0aGlzLmhlYWRlcnMubm90KHRoaXMuYWN0aXZlKS5hdHRyKHtcImFyaWEtc2VsZWN0ZWRcIjpcImZhbHNlXCIsXCJhcmlhLWV4cGFuZGVkXCI6XCJmYWxzZVwiLHRhYkluZGV4Oi0xfSkubmV4dCgpLmF0dHIoe1wiYXJpYS1oaWRkZW5cIjpcInRydWVcIn0pLmhpZGUoKSx0aGlzLmFjdGl2ZS5sZW5ndGg/dGhpcy5hY3RpdmUuYXR0cih7XCJhcmlhLXNlbGVjdGVkXCI6XCJ0cnVlXCIsXCJhcmlhLWV4cGFuZGVkXCI6XCJ0cnVlXCIsdGFiSW5kZXg6MH0pLm5leHQoKS5hdHRyKHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwifSk6dGhpcy5oZWFkZXJzLmVxKDApLmF0dHIoXCJ0YWJJbmRleFwiLDApLHRoaXMuX2NyZWF0ZUljb25zKCksdGhpcy5fc2V0dXBFdmVudHMoaS5ldmVudCksXCJmaWxsXCI9PT1zPyh0PW4uaGVpZ2h0KCksdGhpcy5lbGVtZW50LnNpYmxpbmdzKFwiOnZpc2libGVcIikuZWFjaChmdW5jdGlvbigpe3ZhciBpPWUodGhpcykscz1pLmNzcyhcInBvc2l0aW9uXCIpO1wiYWJzb2x1dGVcIiE9PXMmJlwiZml4ZWRcIiE9PXMmJih0LT1pLm91dGVySGVpZ2h0KCEwKSl9KSx0aGlzLmhlYWRlcnMuZWFjaChmdW5jdGlvbigpe3QtPWUodGhpcykub3V0ZXJIZWlnaHQoITApfSksdGhpcy5oZWFkZXJzLm5leHQoKS5lYWNoKGZ1bmN0aW9uKCl7ZSh0aGlzKS5oZWlnaHQoTWF0aC5tYXgoMCx0LWUodGhpcykuaW5uZXJIZWlnaHQoKStlKHRoaXMpLmhlaWdodCgpKSl9KS5jc3MoXCJvdmVyZmxvd1wiLFwiYXV0b1wiKSk6XCJhdXRvXCI9PT1zJiYodD0wLHRoaXMuaGVhZGVycy5uZXh0KCkuZWFjaChmdW5jdGlvbigpe3Q9TWF0aC5tYXgodCxlKHRoaXMpLmNzcyhcImhlaWdodFwiLFwiXCIpLmhlaWdodCgpKX0pLmhlaWdodCh0KSl9LF9hY3RpdmF0ZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9maW5kQWN0aXZlKHQpWzBdO2khPT10aGlzLmFjdGl2ZVswXSYmKGk9aXx8dGhpcy5hY3RpdmVbMF0sdGhpcy5fZXZlbnRIYW5kbGVyKHt0YXJnZXQ6aSxjdXJyZW50VGFyZ2V0OmkscHJldmVudERlZmF1bHQ6ZS5ub29wfSkpfSxfZmluZEFjdGl2ZTpmdW5jdGlvbih0KXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdD90aGlzLmhlYWRlcnMuZXEodCk6ZSgpfSxfc2V0dXBFdmVudHM6ZnVuY3Rpb24odCl7dmFyIGk9e2tleWRvd246XCJfa2V5ZG93blwifTt0JiZlLmVhY2godC5zcGxpdChcIiBcIiksZnVuY3Rpb24oZSx0KXtpW3RdPVwiX2V2ZW50SGFuZGxlclwifSksdGhpcy5fb2ZmKHRoaXMuaGVhZGVycy5hZGQodGhpcy5oZWFkZXJzLm5leHQoKSkpLHRoaXMuX29uKHRoaXMuaGVhZGVycyxpKSx0aGlzLl9vbih0aGlzLmhlYWRlcnMubmV4dCgpLHtrZXlkb3duOlwiX3BhbmVsS2V5RG93blwifSksdGhpcy5faG92ZXJhYmxlKHRoaXMuaGVhZGVycyksdGhpcy5fZm9jdXNhYmxlKHRoaXMuaGVhZGVycyl9LF9ldmVudEhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zLHM9dGhpcy5hY3RpdmUsbj1lKHQuY3VycmVudFRhcmdldCksYT1uWzBdPT09c1swXSxvPWEmJmkuY29sbGFwc2libGUscj1vP2UoKTpuLm5leHQoKSxoPXMubmV4dCgpLGw9e29sZEhlYWRlcjpzLG9sZFBhbmVsOmgsbmV3SGVhZGVyOm8/ZSgpOm4sbmV3UGFuZWw6cn07dC5wcmV2ZW50RGVmYXVsdCgpLGEmJiFpLmNvbGxhcHNpYmxlfHx0aGlzLl90cmlnZ2VyKFwiYmVmb3JlQWN0aXZhdGVcIix0LGwpPT09ITF8fChpLmFjdGl2ZT1vPyExOnRoaXMuaGVhZGVycy5pbmRleChuKSx0aGlzLmFjdGl2ZT1hP2UoKTpuLHRoaXMuX3RvZ2dsZShsKSxzLnJlbW92ZUNsYXNzKFwidWktYWNjb3JkaW9uLWhlYWRlci1hY3RpdmUgdWktc3RhdGUtYWN0aXZlXCIpLGkuaWNvbnMmJnMuY2hpbGRyZW4oXCIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uXCIpLnJlbW92ZUNsYXNzKGkuaWNvbnMuYWN0aXZlSGVhZGVyKS5hZGRDbGFzcyhpLmljb25zLmhlYWRlciksYXx8KG4ucmVtb3ZlQ2xhc3MoXCJ1aS1jb3JuZXItYWxsXCIpLmFkZENsYXNzKFwidWktYWNjb3JkaW9uLWhlYWRlci1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIHVpLWNvcm5lci10b3BcIiksaS5pY29ucyYmbi5jaGlsZHJlbihcIi51aS1hY2NvcmRpb24taGVhZGVyLWljb25cIikucmVtb3ZlQ2xhc3MoaS5pY29ucy5oZWFkZXIpLmFkZENsYXNzKGkuaWNvbnMuYWN0aXZlSGVhZGVyKSxuLm5leHQoKS5hZGRDbGFzcyhcInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZVwiKSkpfSxfdG9nZ2xlOmZ1bmN0aW9uKHQpe3ZhciBpPXQubmV3UGFuZWwscz10aGlzLnByZXZTaG93Lmxlbmd0aD90aGlzLnByZXZTaG93OnQub2xkUGFuZWw7dGhpcy5wcmV2U2hvdy5hZGQodGhpcy5wcmV2SGlkZSkuc3RvcCghMCwhMCksdGhpcy5wcmV2U2hvdz1pLHRoaXMucHJldkhpZGU9cyx0aGlzLm9wdGlvbnMuYW5pbWF0ZT90aGlzLl9hbmltYXRlKGkscyx0KToocy5oaWRlKCksaS5zaG93KCksdGhpcy5fdG9nZ2xlQ29tcGxldGUodCkpLHMuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwifSkscy5wcmV2KCkuYXR0cih7XCJhcmlhLXNlbGVjdGVkXCI6XCJmYWxzZVwiLFwiYXJpYS1leHBhbmRlZFwiOlwiZmFsc2VcIn0pLGkubGVuZ3RoJiZzLmxlbmd0aD9zLnByZXYoKS5hdHRyKHt0YWJJbmRleDotMSxcImFyaWEtZXhwYW5kZWRcIjpcImZhbHNlXCJ9KTppLmxlbmd0aCYmdGhpcy5oZWFkZXJzLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiAwPT09cGFyc2VJbnQoZSh0aGlzKS5hdHRyKFwidGFiSW5kZXhcIiksMTApfSkuYXR0cihcInRhYkluZGV4XCIsLTEpLGkuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKS5wcmV2KCkuYXR0cih7XCJhcmlhLXNlbGVjdGVkXCI6XCJ0cnVlXCIsXCJhcmlhLWV4cGFuZGVkXCI6XCJ0cnVlXCIsdGFiSW5kZXg6MH0pfSxfYW5pbWF0ZTpmdW5jdGlvbihlLHQsaSl7dmFyIHMsbixhLG89dGhpcyxyPTAsaD1lLmNzcyhcImJveC1zaXppbmdcIiksbD1lLmxlbmd0aCYmKCF0Lmxlbmd0aHx8ZS5pbmRleCgpPHQuaW5kZXgoKSksdT10aGlzLm9wdGlvbnMuYW5pbWF0ZXx8e30sZD1sJiZ1LmRvd258fHUsYz1mdW5jdGlvbigpe28uX3RvZ2dsZUNvbXBsZXRlKGkpfTtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgZCYmKGE9ZCksXCJzdHJpbmdcIj09dHlwZW9mIGQmJihuPWQpLG49bnx8ZC5lYXNpbmd8fHUuZWFzaW5nLGE9YXx8ZC5kdXJhdGlvbnx8dS5kdXJhdGlvbix0Lmxlbmd0aD9lLmxlbmd0aD8ocz1lLnNob3coKS5vdXRlckhlaWdodCgpLHQuYW5pbWF0ZSh0aGlzLmhpZGVQcm9wcyx7ZHVyYXRpb246YSxlYXNpbmc6bixzdGVwOmZ1bmN0aW9uKGUsdCl7dC5ub3c9TWF0aC5yb3VuZChlKX19KSxlLmhpZGUoKS5hbmltYXRlKHRoaXMuc2hvd1Byb3BzLHtkdXJhdGlvbjphLGVhc2luZzpuLGNvbXBsZXRlOmMsc3RlcDpmdW5jdGlvbihlLGkpe2kubm93PU1hdGgucm91bmQoZSksXCJoZWlnaHRcIiE9PWkucHJvcD9cImNvbnRlbnQtYm94XCI9PT1oJiYocis9aS5ub3cpOlwiY29udGVudFwiIT09by5vcHRpb25zLmhlaWdodFN0eWxlJiYoaS5ub3c9TWF0aC5yb3VuZChzLXQub3V0ZXJIZWlnaHQoKS1yKSxyPTApfX0pLHZvaWQgMCk6dC5hbmltYXRlKHRoaXMuaGlkZVByb3BzLGEsbixjKTplLmFuaW1hdGUodGhpcy5zaG93UHJvcHMsYSxuLGMpfSxfdG9nZ2xlQ29tcGxldGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vbGRQYW5lbDt0LnJlbW92ZUNsYXNzKFwidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlXCIpLnByZXYoKS5yZW1vdmVDbGFzcyhcInVpLWNvcm5lci10b3BcIikuYWRkQ2xhc3MoXCJ1aS1jb3JuZXItYWxsXCIpLHQubGVuZ3RoJiYodC5wYXJlbnQoKVswXS5jbGFzc05hbWU9dC5wYXJlbnQoKVswXS5jbGFzc05hbWUpLHRoaXMuX3RyaWdnZXIoXCJhY3RpdmF0ZVwiLG51bGwsZSl9fSksZS53aWRnZXQoXCJ1aS5tZW51XCIse3ZlcnNpb246XCIxLjExLjRcIixkZWZhdWx0RWxlbWVudDpcIjx1bD5cIixkZWxheTozMDAsb3B0aW9uczp7aWNvbnM6e3N1Ym1lbnU6XCJ1aS1pY29uLWNhcmF0LTEtZVwifSxpdGVtczpcIj4gKlwiLG1lbnVzOlwidWxcIixwb3NpdGlvbjp7bXk6XCJsZWZ0LTEgdG9wXCIsYXQ6XCJyaWdodCB0b3BcIn0scm9sZTpcIm1lbnVcIixibHVyOm51bGwsZm9jdXM6bnVsbCxzZWxlY3Q6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuYWN0aXZlTWVudT10aGlzLmVsZW1lbnQsdGhpcy5tb3VzZUhhbmRsZWQ9ITEsdGhpcy5lbGVtZW50LnVuaXF1ZUlkKCkuYWRkQ2xhc3MoXCJ1aS1tZW51IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudFwiKS50b2dnbGVDbGFzcyhcInVpLW1lbnUtaWNvbnNcIiwhIXRoaXMuZWxlbWVudC5maW5kKFwiLnVpLWljb25cIikubGVuZ3RoKS5hdHRyKHtyb2xlOnRoaXMub3B0aW9ucy5yb2xlLHRhYkluZGV4OjB9KSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyhcInVpLXN0YXRlLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJ0cnVlXCIpLHRoaXMuX29uKHtcIm1vdXNlZG93biAudWktbWVudS1pdGVtXCI6ZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpfSxcImNsaWNrIC51aS1tZW51LWl0ZW1cIjpmdW5jdGlvbih0KXt2YXIgaT1lKHQudGFyZ2V0KTshdGhpcy5tb3VzZUhhbmRsZWQmJmkubm90KFwiLnVpLXN0YXRlLWRpc2FibGVkXCIpLmxlbmd0aCYmKHRoaXMuc2VsZWN0KHQpLHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKXx8KHRoaXMubW91c2VIYW5kbGVkPSEwKSxpLmhhcyhcIi51aS1tZW51XCIpLmxlbmd0aD90aGlzLmV4cGFuZCh0KTohdGhpcy5lbGVtZW50LmlzKFwiOmZvY3VzXCIpJiZlKHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCkuY2xvc2VzdChcIi51aS1tZW51XCIpLmxlbmd0aCYmKHRoaXMuZWxlbWVudC50cmlnZ2VyKFwiZm9jdXNcIixbITBdKSx0aGlzLmFjdGl2ZSYmMT09PXRoaXMuYWN0aXZlLnBhcmVudHMoXCIudWktbWVudVwiKS5sZW5ndGgmJmNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSkpfSxcIm1vdXNlZW50ZXIgLnVpLW1lbnUtaXRlbVwiOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLnByZXZpb3VzRmlsdGVyKXt2YXIgaT1lKHQuY3VycmVudFRhcmdldCk7XG5pLnNpYmxpbmdzKFwiLnVpLXN0YXRlLWFjdGl2ZVwiKS5yZW1vdmVDbGFzcyhcInVpLXN0YXRlLWFjdGl2ZVwiKSx0aGlzLmZvY3VzKHQsaSl9fSxtb3VzZWxlYXZlOlwiY29sbGFwc2VBbGxcIixcIm1vdXNlbGVhdmUgLnVpLW1lbnVcIjpcImNvbGxhcHNlQWxsXCIsZm9jdXM6ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLmFjdGl2ZXx8dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5lcSgwKTt0fHx0aGlzLmZvY3VzKGUsaSl9LGJsdXI6ZnVuY3Rpb24odCl7dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtlLmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSx0aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQpfHx0aGlzLmNvbGxhcHNlQWxsKHQpfSl9LGtleWRvd246XCJfa2V5ZG93blwifSksdGhpcy5yZWZyZXNoKCksdGhpcy5fb24odGhpcy5kb2N1bWVudCx7Y2xpY2s6ZnVuY3Rpb24oZSl7dGhpcy5fY2xvc2VPbkRvY3VtZW50Q2xpY2soZSkmJnRoaXMuY29sbGFwc2VBbGwoZSksdGhpcy5tb3VzZUhhbmRsZWQ9ITF9fSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIikuZmluZChcIi51aS1tZW51XCIpLmFkZEJhY2soKS5yZW1vdmVDbGFzcyhcInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLW1lbnUtaWNvbnMgdWktZnJvbnRcIikucmVtb3ZlQXR0cihcInJvbGVcIikucmVtb3ZlQXR0cihcInRhYkluZGV4XCIpLnJlbW92ZUF0dHIoXCJhcmlhLWxhYmVsbGVkYnlcIikucmVtb3ZlQXR0cihcImFyaWEtZXhwYW5kZWRcIikucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWRpc2FibGVkXCIpLnJlbW92ZVVuaXF1ZUlkKCkuc2hvdygpLHRoaXMuZWxlbWVudC5maW5kKFwiLnVpLW1lbnUtaXRlbVwiKS5yZW1vdmVDbGFzcyhcInVpLW1lbnUtaXRlbVwiKS5yZW1vdmVBdHRyKFwicm9sZVwiKS5yZW1vdmVBdHRyKFwiYXJpYS1kaXNhYmxlZFwiKS5yZW1vdmVVbmlxdWVJZCgpLnJlbW92ZUNsYXNzKFwidWktc3RhdGUtaG92ZXJcIikucmVtb3ZlQXR0cihcInRhYkluZGV4XCIpLnJlbW92ZUF0dHIoXCJyb2xlXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWhhc3BvcHVwXCIpLmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7dC5kYXRhKFwidWktbWVudS1zdWJtZW51LWNhcmF0XCIpJiZ0LnJlbW92ZSgpfSksdGhpcy5lbGVtZW50LmZpbmQoXCIudWktbWVudS1kaXZpZGVyXCIpLnJlbW92ZUNsYXNzKFwidWktbWVudS1kaXZpZGVyIHVpLXdpZGdldC1jb250ZW50XCIpfSxfa2V5ZG93bjpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYSxvPSEwO3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLlBBR0VfVVA6dGhpcy5wcmV2aW91c1BhZ2UodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9ET1dOOnRoaXMubmV4dFBhZ2UodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuSE9NRTp0aGlzLl9tb3ZlKFwiZmlyc3RcIixcImZpcnN0XCIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5EOnRoaXMuX21vdmUoXCJsYXN0XCIsXCJsYXN0XCIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuVVA6dGhpcy5wcmV2aW91cyh0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5ET1dOOnRoaXMubmV4dCh0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5MRUZUOnRoaXMuY29sbGFwc2UodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuUklHSFQ6dGhpcy5hY3RpdmUmJiF0aGlzLmFjdGl2ZS5pcyhcIi51aS1zdGF0ZS1kaXNhYmxlZFwiKSYmdGhpcy5leHBhbmQodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5URVI6Y2FzZSBlLnVpLmtleUNvZGUuU1BBQ0U6dGhpcy5fYWN0aXZhdGUodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRVNDQVBFOnRoaXMuY29sbGFwc2UodCk7YnJlYWs7ZGVmYXVsdDpvPSExLHM9dGhpcy5wcmV2aW91c0ZpbHRlcnx8XCJcIixuPVN0cmluZy5mcm9tQ2hhckNvZGUodC5rZXlDb2RlKSxhPSExLGNsZWFyVGltZW91dCh0aGlzLmZpbHRlclRpbWVyKSxuPT09cz9hPSEwOm49cytuLGk9dGhpcy5fZmlsdGVyTWVudUl0ZW1zKG4pLGk9YSYmLTEhPT1pLmluZGV4KHRoaXMuYWN0aXZlLm5leHQoKSk/dGhpcy5hY3RpdmUubmV4dEFsbChcIi51aS1tZW51LWl0ZW1cIik6aSxpLmxlbmd0aHx8KG49U3RyaW5nLmZyb21DaGFyQ29kZSh0LmtleUNvZGUpLGk9dGhpcy5fZmlsdGVyTWVudUl0ZW1zKG4pKSxpLmxlbmd0aD8odGhpcy5mb2N1cyh0LGkpLHRoaXMucHJldmlvdXNGaWx0ZXI9bix0aGlzLmZpbHRlclRpbWVyPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMucHJldmlvdXNGaWx0ZXJ9LDFlMykpOmRlbGV0ZSB0aGlzLnByZXZpb3VzRmlsdGVyfW8mJnQucHJldmVudERlZmF1bHQoKX0sX2FjdGl2YXRlOmZ1bmN0aW9uKGUpe3RoaXMuYWN0aXZlLmlzKFwiLnVpLXN0YXRlLWRpc2FibGVkXCIpfHwodGhpcy5hY3RpdmUuaXMoXCJbYXJpYS1oYXNwb3B1cD0ndHJ1ZSddXCIpP3RoaXMuZXhwYW5kKGUpOnRoaXMuc2VsZWN0KGUpKX0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciB0LGkscz10aGlzLG49dGhpcy5vcHRpb25zLmljb25zLnN1Ym1lbnUsYT10aGlzLmVsZW1lbnQuZmluZCh0aGlzLm9wdGlvbnMubWVudXMpO3RoaXMuZWxlbWVudC50b2dnbGVDbGFzcyhcInVpLW1lbnUtaWNvbnNcIiwhIXRoaXMuZWxlbWVudC5maW5kKFwiLnVpLWljb25cIikubGVuZ3RoKSxhLmZpbHRlcihcIjpub3QoLnVpLW1lbnUpXCIpLmFkZENsYXNzKFwidWktbWVudSB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktZnJvbnRcIikuaGlkZSgpLmF0dHIoe3JvbGU6dGhpcy5vcHRpb25zLnJvbGUsXCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwiLFwiYXJpYS1leHBhbmRlZFwiOlwiZmFsc2VcIn0pLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC5wYXJlbnQoKSxzPWUoXCI8c3Bhbj5cIikuYWRkQ2xhc3MoXCJ1aS1tZW51LWljb24gdWktaWNvbiBcIituKS5kYXRhKFwidWktbWVudS1zdWJtZW51LWNhcmF0XCIsITApO2kuYXR0cihcImFyaWEtaGFzcG9wdXBcIixcInRydWVcIikucHJlcGVuZChzKSx0LmF0dHIoXCJhcmlhLWxhYmVsbGVkYnlcIixpLmF0dHIoXCJpZFwiKSl9KSx0PWEuYWRkKHRoaXMuZWxlbWVudCksaT10LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKSxpLm5vdChcIi51aS1tZW51LWl0ZW1cIikuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7cy5faXNEaXZpZGVyKHQpJiZ0LmFkZENsYXNzKFwidWktd2lkZ2V0LWNvbnRlbnQgdWktbWVudS1kaXZpZGVyXCIpfSksaS5ub3QoXCIudWktbWVudS1pdGVtLCAudWktbWVudS1kaXZpZGVyXCIpLmFkZENsYXNzKFwidWktbWVudS1pdGVtXCIpLnVuaXF1ZUlkKCkuYXR0cih7dGFiSW5kZXg6LTEscm9sZTp0aGlzLl9pdGVtUm9sZSgpfSksaS5maWx0ZXIoXCIudWktc3RhdGUtZGlzYWJsZWRcIikuYXR0cihcImFyaWEtZGlzYWJsZWRcIixcInRydWVcIiksdGhpcy5hY3RpdmUmJiFlLmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSx0aGlzLmFjdGl2ZVswXSkmJnRoaXMuYmx1cigpfSxfaXRlbVJvbGU6ZnVuY3Rpb24oKXtyZXR1cm57bWVudTpcIm1lbnVpdGVtXCIsbGlzdGJveDpcIm9wdGlvblwifVt0aGlzLm9wdGlvbnMucm9sZV19LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtcImljb25zXCI9PT1lJiZ0aGlzLmVsZW1lbnQuZmluZChcIi51aS1tZW51LWljb25cIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLnN1Ym1lbnUpLmFkZENsYXNzKHQuc3VibWVudSksXCJkaXNhYmxlZFwiPT09ZSYmdGhpcy5lbGVtZW50LnRvZ2dsZUNsYXNzKFwidWktc3RhdGUtZGlzYWJsZWRcIiwhIXQpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsdCksdGhpcy5fc3VwZXIoZSx0KX0sZm9jdXM6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzO3RoaXMuYmx1cihlLGUmJlwiZm9jdXNcIj09PWUudHlwZSksdGhpcy5fc2Nyb2xsSW50b1ZpZXcodCksdGhpcy5hY3RpdmU9dC5maXJzdCgpLHM9dGhpcy5hY3RpdmUuYWRkQ2xhc3MoXCJ1aS1zdGF0ZS1mb2N1c1wiKS5yZW1vdmVDbGFzcyhcInVpLXN0YXRlLWFjdGl2ZVwiKSx0aGlzLm9wdGlvbnMucm9sZSYmdGhpcy5lbGVtZW50LmF0dHIoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIixzLmF0dHIoXCJpZFwiKSksdGhpcy5hY3RpdmUucGFyZW50KCkuY2xvc2VzdChcIi51aS1tZW51LWl0ZW1cIikuYWRkQ2xhc3MoXCJ1aS1zdGF0ZS1hY3RpdmVcIiksZSYmXCJrZXlkb3duXCI9PT1lLnR5cGU/dGhpcy5fY2xvc2UoKTp0aGlzLnRpbWVyPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5fY2xvc2UoKX0sdGhpcy5kZWxheSksaT10LmNoaWxkcmVuKFwiLnVpLW1lbnVcIiksaS5sZW5ndGgmJmUmJi9ebW91c2UvLnRlc3QoZS50eXBlKSYmdGhpcy5fc3RhcnRPcGVuaW5nKGkpLHRoaXMuYWN0aXZlTWVudT10LnBhcmVudCgpLHRoaXMuX3RyaWdnZXIoXCJmb2N1c1wiLGUse2l0ZW06dH0pfSxfc2Nyb2xsSW50b1ZpZXc6ZnVuY3Rpb24odCl7dmFyIGkscyxuLGEsbyxyO3RoaXMuX2hhc1Njcm9sbCgpJiYoaT1wYXJzZUZsb2F0KGUuY3NzKHRoaXMuYWN0aXZlTWVudVswXSxcImJvcmRlclRvcFdpZHRoXCIpKXx8MCxzPXBhcnNlRmxvYXQoZS5jc3ModGhpcy5hY3RpdmVNZW51WzBdLFwicGFkZGluZ1RvcFwiKSl8fDAsbj10Lm9mZnNldCgpLnRvcC10aGlzLmFjdGl2ZU1lbnUub2Zmc2V0KCkudG9wLWktcyxhPXRoaXMuYWN0aXZlTWVudS5zY3JvbGxUb3AoKSxvPXRoaXMuYWN0aXZlTWVudS5oZWlnaHQoKSxyPXQub3V0ZXJIZWlnaHQoKSwwPm4/dGhpcy5hY3RpdmVNZW51LnNjcm9sbFRvcChhK24pOm4rcj5vJiZ0aGlzLmFjdGl2ZU1lbnUuc2Nyb2xsVG9wKGErbi1vK3IpKX0sYmx1cjpmdW5jdGlvbihlLHQpe3R8fGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLmFjdGl2ZSYmKHRoaXMuYWN0aXZlLnJlbW92ZUNsYXNzKFwidWktc3RhdGUtZm9jdXNcIiksdGhpcy5hY3RpdmU9bnVsbCx0aGlzLl90cmlnZ2VyKFwiYmx1clwiLGUse2l0ZW06dGhpcy5hY3RpdmV9KSl9LF9zdGFydE9wZW5pbmc6ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLFwidHJ1ZVwiPT09ZS5hdHRyKFwiYXJpYS1oaWRkZW5cIikmJih0aGlzLnRpbWVyPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5fY2xvc2UoKSx0aGlzLl9vcGVuKGUpfSx0aGlzLmRlbGF5KSl9LF9vcGVuOmZ1bmN0aW9uKHQpe3ZhciBpPWUuZXh0ZW5kKHtvZjp0aGlzLmFjdGl2ZX0sdGhpcy5vcHRpb25zLnBvc2l0aW9uKTtjbGVhclRpbWVvdXQodGhpcy50aW1lciksdGhpcy5lbGVtZW50LmZpbmQoXCIudWktbWVudVwiKS5ub3QodC5wYXJlbnRzKFwiLnVpLW1lbnVcIikpLmhpZGUoKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIiksdC5zaG93KCkucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuXCIpLmF0dHIoXCJhcmlhLWV4cGFuZGVkXCIsXCJ0cnVlXCIpLnBvc2l0aW9uKGkpfSxjb2xsYXBzZUFsbDpmdW5jdGlvbih0LGkpe2NsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dmFyIHM9aT90aGlzLmVsZW1lbnQ6ZSh0JiZ0LnRhcmdldCkuY2xvc2VzdCh0aGlzLmVsZW1lbnQuZmluZChcIi51aS1tZW51XCIpKTtzLmxlbmd0aHx8KHM9dGhpcy5lbGVtZW50KSx0aGlzLl9jbG9zZShzKSx0aGlzLmJsdXIodCksdGhpcy5hY3RpdmVNZW51PXN9LHRoaXMuZGVsYXkpfSxfY2xvc2U6ZnVuY3Rpb24oZSl7ZXx8KGU9dGhpcy5hY3RpdmU/dGhpcy5hY3RpdmUucGFyZW50KCk6dGhpcy5lbGVtZW50KSxlLmZpbmQoXCIudWktbWVudVwiKS5oaWRlKCkuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpLmF0dHIoXCJhcmlhLWV4cGFuZGVkXCIsXCJmYWxzZVwiKS5lbmQoKS5maW5kKFwiLnVpLXN0YXRlLWFjdGl2ZVwiKS5ub3QoXCIudWktc3RhdGUtZm9jdXNcIikucmVtb3ZlQ2xhc3MoXCJ1aS1zdGF0ZS1hY3RpdmVcIil9LF9jbG9zZU9uRG9jdW1lbnRDbGljazpmdW5jdGlvbih0KXtyZXR1cm4hZSh0LnRhcmdldCkuY2xvc2VzdChcIi51aS1tZW51XCIpLmxlbmd0aH0sX2lzRGl2aWRlcjpmdW5jdGlvbihlKXtyZXR1cm4hL1teXFwtXFx1MjAxNFxcdTIwMTNcXHNdLy50ZXN0KGUudGV4dCgpKX0sY29sbGFwc2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5hY3RpdmUmJnRoaXMuYWN0aXZlLnBhcmVudCgpLmNsb3Nlc3QoXCIudWktbWVudS1pdGVtXCIsdGhpcy5lbGVtZW50KTt0JiZ0Lmxlbmd0aCYmKHRoaXMuX2Nsb3NlKCksdGhpcy5mb2N1cyhlLHQpKX0sZXhwYW5kOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuYWN0aXZlJiZ0aGlzLmFjdGl2ZS5jaGlsZHJlbihcIi51aS1tZW51IFwiKS5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuZmlyc3QoKTt0JiZ0Lmxlbmd0aCYmKHRoaXMuX29wZW4odC5wYXJlbnQoKSksdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLmZvY3VzKGUsdCl9KSl9LG5leHQ6ZnVuY3Rpb24oZSl7dGhpcy5fbW92ZShcIm5leHRcIixcImZpcnN0XCIsZSl9LHByZXZpb3VzOmZ1bmN0aW9uKGUpe3RoaXMuX21vdmUoXCJwcmV2XCIsXCJsYXN0XCIsZSl9LGlzRmlyc3RJdGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUucHJldkFsbChcIi51aS1tZW51LWl0ZW1cIikubGVuZ3RofSxpc0xhc3RJdGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUubmV4dEFsbChcIi51aS1tZW51LWl0ZW1cIikubGVuZ3RofSxfbW92ZTpmdW5jdGlvbihlLHQsaSl7dmFyIHM7dGhpcy5hY3RpdmUmJihzPVwiZmlyc3RcIj09PWV8fFwibGFzdFwiPT09ZT90aGlzLmFjdGl2ZVtcImZpcnN0XCI9PT1lP1wicHJldkFsbFwiOlwibmV4dEFsbFwiXShcIi51aS1tZW51LWl0ZW1cIikuZXEoLTEpOnRoaXMuYWN0aXZlW2UrXCJBbGxcIl0oXCIudWktbWVudS1pdGVtXCIpLmVxKDApKSxzJiZzLmxlbmd0aCYmdGhpcy5hY3RpdmV8fChzPXRoaXMuYWN0aXZlTWVudS5maW5kKHRoaXMub3B0aW9ucy5pdGVtcylbdF0oKSksdGhpcy5mb2N1cyhpLHMpfSxuZXh0UGFnZTpmdW5jdGlvbih0KXt2YXIgaSxzLG47cmV0dXJuIHRoaXMuYWN0aXZlPyh0aGlzLmlzTGFzdEl0ZW0oKXx8KHRoaXMuX2hhc1Njcm9sbCgpPyhzPXRoaXMuYWN0aXZlLm9mZnNldCgpLnRvcCxuPXRoaXMuZWxlbWVudC5oZWlnaHQoKSx0aGlzLmFjdGl2ZS5uZXh0QWxsKFwiLnVpLW1lbnUtaXRlbVwiKS5lYWNoKGZ1bmN0aW9uKCl7cmV0dXJuIGk9ZSh0aGlzKSwwPmkub2Zmc2V0KCkudG9wLXMtbn0pLHRoaXMuZm9jdXModCxpKSk6dGhpcy5mb2N1cyh0LHRoaXMuYWN0aXZlTWVudS5maW5kKHRoaXMub3B0aW9ucy5pdGVtcylbdGhpcy5hY3RpdmU/XCJsYXN0XCI6XCJmaXJzdFwiXSgpKSksdm9pZCAwKToodGhpcy5uZXh0KHQpLHZvaWQgMCl9LHByZXZpb3VzUGFnZTpmdW5jdGlvbih0KXt2YXIgaSxzLG47cmV0dXJuIHRoaXMuYWN0aXZlPyh0aGlzLmlzRmlyc3RJdGVtKCl8fCh0aGlzLl9oYXNTY3JvbGwoKT8ocz10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3Asbj10aGlzLmVsZW1lbnQuaGVpZ2h0KCksdGhpcy5hY3RpdmUucHJldkFsbChcIi51aS1tZW51LWl0ZW1cIikuZWFjaChmdW5jdGlvbigpe3JldHVybiBpPWUodGhpcyksaS5vZmZzZXQoKS50b3AtcytuPjB9KSx0aGlzLmZvY3VzKHQsaSkpOnRoaXMuZm9jdXModCx0aGlzLmFjdGl2ZU1lbnUuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpLmZpcnN0KCkpKSx2b2lkIDApOih0aGlzLm5leHQodCksdm9pZCAwKX0sX2hhc1Njcm9sbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKTx0aGlzLmVsZW1lbnQucHJvcChcInNjcm9sbEhlaWdodFwiKX0sc2VsZWN0OmZ1bmN0aW9uKHQpe3RoaXMuYWN0aXZlPXRoaXMuYWN0aXZlfHxlKHQudGFyZ2V0KS5jbG9zZXN0KFwiLnVpLW1lbnUtaXRlbVwiKTt2YXIgaT17aXRlbTp0aGlzLmFjdGl2ZX07dGhpcy5hY3RpdmUuaGFzKFwiLnVpLW1lbnVcIikubGVuZ3RofHx0aGlzLmNvbGxhcHNlQWxsKHQsITApLHRoaXMuX3RyaWdnZXIoXCJzZWxlY3RcIix0LGkpfSxfZmlsdGVyTWVudUl0ZW1zOmZ1bmN0aW9uKHQpe3ZhciBpPXQucmVwbGFjZSgvW1xcLVxcW1xcXXt9KCkqKz8uLFxcXFxcXF4kfCNcXHNdL2csXCJcXFxcJCZcIikscz1SZWdFeHAoXCJeXCIraSxcImlcIik7cmV0dXJuIHRoaXMuYWN0aXZlTWVudS5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuZmlsdGVyKFwiLnVpLW1lbnUtaXRlbVwiKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gcy50ZXN0KGUudHJpbShlKHRoaXMpLnRleHQoKSkpfSl9fSksZS53aWRnZXQoXCJ1aS5hdXRvY29tcGxldGVcIix7dmVyc2lvbjpcIjEuMTEuNFwiLGRlZmF1bHRFbGVtZW50OlwiPGlucHV0PlwiLG9wdGlvbnM6e2FwcGVuZFRvOm51bGwsYXV0b0ZvY3VzOiExLGRlbGF5OjMwMCxtaW5MZW5ndGg6MSxwb3NpdGlvbjp7bXk6XCJsZWZ0IHRvcFwiLGF0OlwibGVmdCBib3R0b21cIixjb2xsaXNpb246XCJub25lXCJ9LHNvdXJjZTpudWxsLGNoYW5nZTpudWxsLGNsb3NlOm51bGwsZm9jdXM6bnVsbCxvcGVuOm51bGwscmVzcG9uc2U6bnVsbCxzZWFyY2g6bnVsbCxzZWxlY3Q6bnVsbH0scmVxdWVzdEluZGV4OjAscGVuZGluZzowLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdCxpLHMsbj10aGlzLmVsZW1lbnRbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxhPVwidGV4dGFyZWFcIj09PW4sbz1cImlucHV0XCI9PT1uO3RoaXMuaXNNdWx0aUxpbmU9YT8hMDpvPyExOnRoaXMuZWxlbWVudC5wcm9wKFwiaXNDb250ZW50RWRpdGFibGVcIiksdGhpcy52YWx1ZU1ldGhvZD10aGlzLmVsZW1lbnRbYXx8bz9cInZhbFwiOlwidGV4dFwiXSx0aGlzLmlzTmV3TWVudT0hMCx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoXCJ1aS1hdXRvY29tcGxldGUtaW5wdXRcIikuYXR0cihcImF1dG9jb21wbGV0ZVwiLFwib2ZmXCIpLHRoaXMuX29uKHRoaXMuZWxlbWVudCx7a2V5ZG93bjpmdW5jdGlvbihuKXtpZih0aGlzLmVsZW1lbnQucHJvcChcInJlYWRPbmx5XCIpKXJldHVybiB0PSEwLHM9ITAsaT0hMCx2b2lkIDA7dD0hMSxzPSExLGk9ITE7dmFyIGE9ZS51aS5rZXlDb2RlO3N3aXRjaChuLmtleUNvZGUpe2Nhc2UgYS5QQUdFX1VQOnQ9ITAsdGhpcy5fbW92ZShcInByZXZpb3VzUGFnZVwiLG4pO2JyZWFrO2Nhc2UgYS5QQUdFX0RPV046dD0hMCx0aGlzLl9tb3ZlKFwibmV4dFBhZ2VcIixuKTticmVhaztjYXNlIGEuVVA6dD0hMCx0aGlzLl9rZXlFdmVudChcInByZXZpb3VzXCIsbik7YnJlYWs7Y2FzZSBhLkRPV046dD0hMCx0aGlzLl9rZXlFdmVudChcIm5leHRcIixuKTticmVhaztjYXNlIGEuRU5URVI6dGhpcy5tZW51LmFjdGl2ZSYmKHQ9ITAsbi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubWVudS5zZWxlY3QobikpO2JyZWFrO2Nhc2UgYS5UQUI6dGhpcy5tZW51LmFjdGl2ZSYmdGhpcy5tZW51LnNlbGVjdChuKTticmVhaztjYXNlIGEuRVNDQVBFOnRoaXMubWVudS5lbGVtZW50LmlzKFwiOnZpc2libGVcIikmJih0aGlzLmlzTXVsdGlMaW5lfHx0aGlzLl92YWx1ZSh0aGlzLnRlcm0pLHRoaXMuY2xvc2Uobiksbi5wcmV2ZW50RGVmYXVsdCgpKTticmVhaztkZWZhdWx0Omk9ITAsdGhpcy5fc2VhcmNoVGltZW91dChuKX19LGtleXByZXNzOmZ1bmN0aW9uKHMpe2lmKHQpcmV0dXJuIHQ9ITEsKCF0aGlzLmlzTXVsdGlMaW5lfHx0aGlzLm1lbnUuZWxlbWVudC5pcyhcIjp2aXNpYmxlXCIpKSYmcy5wcmV2ZW50RGVmYXVsdCgpLHZvaWQgMDtpZighaSl7dmFyIG49ZS51aS5rZXlDb2RlO3N3aXRjaChzLmtleUNvZGUpe2Nhc2Ugbi5QQUdFX1VQOnRoaXMuX21vdmUoXCJwcmV2aW91c1BhZ2VcIixzKTticmVhaztjYXNlIG4uUEFHRV9ET1dOOnRoaXMuX21vdmUoXCJuZXh0UGFnZVwiLHMpO2JyZWFrO2Nhc2Ugbi5VUDp0aGlzLl9rZXlFdmVudChcInByZXZpb3VzXCIscyk7YnJlYWs7Y2FzZSBuLkRPV046dGhpcy5fa2V5RXZlbnQoXCJuZXh0XCIscyl9fX0saW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHM/KHM9ITEsZS5wcmV2ZW50RGVmYXVsdCgpLHZvaWQgMCk6KHRoaXMuX3NlYXJjaFRpbWVvdXQoZSksdm9pZCAwKX0sZm9jdXM6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkSXRlbT1udWxsLHRoaXMucHJldmlvdXM9dGhpcy5fdmFsdWUoKX0sYmx1cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jYW5jZWxCbHVyPyhkZWxldGUgdGhpcy5jYW5jZWxCbHVyLHZvaWQgMCk6KGNsZWFyVGltZW91dCh0aGlzLnNlYXJjaGluZyksdGhpcy5jbG9zZShlKSx0aGlzLl9jaGFuZ2UoZSksdm9pZCAwKX19KSx0aGlzLl9pbml0U291cmNlKCksdGhpcy5tZW51PWUoXCI8dWw+XCIpLmFkZENsYXNzKFwidWktYXV0b2NvbXBsZXRlIHVpLWZyb250XCIpLmFwcGVuZFRvKHRoaXMuX2FwcGVuZFRvKCkpLm1lbnUoe3JvbGU6bnVsbH0pLmhpZGUoKS5tZW51KFwiaW5zdGFuY2VcIiksdGhpcy5fb24odGhpcy5tZW51LmVsZW1lbnQse21vdXNlZG93bjpmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksdGhpcy5jYW5jZWxCbHVyPSEwLHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMuY2FuY2VsQmx1cn0pO3ZhciBpPXRoaXMubWVudS5lbGVtZW50WzBdO2UodC50YXJnZXQpLmNsb3Nlc3QoXCIudWktbWVudS1pdGVtXCIpLmxlbmd0aHx8dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuZG9jdW1lbnQub25lKFwibW91c2Vkb3duXCIsZnVuY3Rpb24ocyl7cy50YXJnZXQ9PT10LmVsZW1lbnRbMF18fHMudGFyZ2V0PT09aXx8ZS5jb250YWlucyhpLHMudGFyZ2V0KXx8dC5jbG9zZSgpfSl9KX0sbWVudWZvY3VzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbjtyZXR1cm4gdGhpcy5pc05ld01lbnUmJih0aGlzLmlzTmV3TWVudT0hMSx0Lm9yaWdpbmFsRXZlbnQmJi9ebW91c2UvLnRlc3QodC5vcmlnaW5hbEV2ZW50LnR5cGUpKT8odGhpcy5tZW51LmJsdXIoKSx0aGlzLmRvY3VtZW50Lm9uZShcIm1vdXNlbW92ZVwiLGZ1bmN0aW9uKCl7ZSh0LnRhcmdldCkudHJpZ2dlcih0Lm9yaWdpbmFsRXZlbnQpfSksdm9pZCAwKToobj1pLml0ZW0uZGF0YShcInVpLWF1dG9jb21wbGV0ZS1pdGVtXCIpLCExIT09dGhpcy5fdHJpZ2dlcihcImZvY3VzXCIsdCx7aXRlbTpufSkmJnQub3JpZ2luYWxFdmVudCYmL15rZXkvLnRlc3QodC5vcmlnaW5hbEV2ZW50LnR5cGUpJiZ0aGlzLl92YWx1ZShuLnZhbHVlKSxzPWkuaXRlbS5hdHRyKFwiYXJpYS1sYWJlbFwiKXx8bi52YWx1ZSxzJiZlLnRyaW0ocykubGVuZ3RoJiYodGhpcy5saXZlUmVnaW9uLmNoaWxkcmVuKCkuaGlkZSgpLGUoXCI8ZGl2PlwiKS50ZXh0KHMpLmFwcGVuZFRvKHRoaXMubGl2ZVJlZ2lvbikpLHZvaWQgMCl9LG1lbnVzZWxlY3Q6ZnVuY3Rpb24oZSx0KXt2YXIgaT10Lml0ZW0uZGF0YShcInVpLWF1dG9jb21wbGV0ZS1pdGVtXCIpLHM9dGhpcy5wcmV2aW91czt0aGlzLmVsZW1lbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQmJih0aGlzLmVsZW1lbnQuZm9jdXMoKSx0aGlzLnByZXZpb3VzPXMsdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLnByZXZpb3VzPXMsdGhpcy5zZWxlY3RlZEl0ZW09aX0pKSwhMSE9PXRoaXMuX3RyaWdnZXIoXCJzZWxlY3RcIixlLHtpdGVtOml9KSYmdGhpcy5fdmFsdWUoaS52YWx1ZSksdGhpcy50ZXJtPXRoaXMuX3ZhbHVlKCksdGhpcy5jbG9zZShlKSx0aGlzLnNlbGVjdGVkSXRlbT1pfX0pLHRoaXMubGl2ZVJlZ2lvbj1lKFwiPHNwYW4+XCIse3JvbGU6XCJzdGF0dXNcIixcImFyaWEtbGl2ZVwiOlwiYXNzZXJ0aXZlXCIsXCJhcmlhLXJlbGV2YW50XCI6XCJhZGRpdGlvbnNcIn0pLmFkZENsYXNzKFwidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlXCIpLmFwcGVuZFRvKHRoaXMuZG9jdW1lbnRbMF0uYm9keSksdGhpcy5fb24odGhpcy53aW5kb3cse2JlZm9yZXVubG9hZDpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVBdHRyKFwiYXV0b2NvbXBsZXRlXCIpfX0pfSxfZGVzdHJveTpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLnNlYXJjaGluZyksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKFwidWktYXV0b2NvbXBsZXRlLWlucHV0XCIpLnJlbW92ZUF0dHIoXCJhdXRvY29tcGxldGVcIiksdGhpcy5tZW51LmVsZW1lbnQucmVtb3ZlKCksdGhpcy5saXZlUmVnaW9uLnJlbW92ZSgpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7dGhpcy5fc3VwZXIoZSx0KSxcInNvdXJjZVwiPT09ZSYmdGhpcy5faW5pdFNvdXJjZSgpLFwiYXBwZW5kVG9cIj09PWUmJnRoaXMubWVudS5lbGVtZW50LmFwcGVuZFRvKHRoaXMuX2FwcGVuZFRvKCkpLFwiZGlzYWJsZWRcIj09PWUmJnQmJnRoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpfSxfYXBwZW5kVG86ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuYXBwZW5kVG87cmV0dXJuIHQmJih0PXQuanF1ZXJ5fHx0Lm5vZGVUeXBlP2UodCk6dGhpcy5kb2N1bWVudC5maW5kKHQpLmVxKDApKSx0JiZ0WzBdfHwodD10aGlzLmVsZW1lbnQuY2xvc2VzdChcIi51aS1mcm9udFwiKSksdC5sZW5ndGh8fCh0PXRoaXMuZG9jdW1lbnRbMF0uYm9keSksdH0sX2luaXRTb3VyY2U6ZnVuY3Rpb24oKXt2YXIgdCxpLHM9dGhpcztlLmlzQXJyYXkodGhpcy5vcHRpb25zLnNvdXJjZSk/KHQ9dGhpcy5vcHRpb25zLnNvdXJjZSx0aGlzLnNvdXJjZT1mdW5jdGlvbihpLHMpe3MoZS51aS5hdXRvY29tcGxldGUuZmlsdGVyKHQsaS50ZXJtKSl9KTpcInN0cmluZ1wiPT10eXBlb2YgdGhpcy5vcHRpb25zLnNvdXJjZT8oaT10aGlzLm9wdGlvbnMuc291cmNlLHRoaXMuc291cmNlPWZ1bmN0aW9uKHQsbil7cy54aHImJnMueGhyLmFib3J0KCkscy54aHI9ZS5hamF4KHt1cmw6aSxkYXRhOnQsZGF0YVR5cGU6XCJqc29uXCIsc3VjY2VzczpmdW5jdGlvbihlKXtuKGUpfSxlcnJvcjpmdW5jdGlvbigpe24oW10pfX0pfSk6dGhpcy5zb3VyY2U9dGhpcy5vcHRpb25zLnNvdXJjZX0sX3NlYXJjaFRpbWVvdXQ6ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoaW5nKSx0aGlzLnNlYXJjaGluZz10aGlzLl9kZWxheShmdW5jdGlvbigpe3ZhciB0PXRoaXMudGVybT09PXRoaXMuX3ZhbHVlKCksaT10aGlzLm1lbnUuZWxlbWVudC5pcyhcIjp2aXNpYmxlXCIpLHM9ZS5hbHRLZXl8fGUuY3RybEtleXx8ZS5tZXRhS2V5fHxlLnNoaWZ0S2V5OyghdHx8dCYmIWkmJiFzKSYmKHRoaXMuc2VsZWN0ZWRJdGVtPW51bGwsdGhpcy5zZWFyY2gobnVsbCxlKSl9LHRoaXMub3B0aW9ucy5kZWxheSl9LHNlYXJjaDpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWU/ZTp0aGlzLl92YWx1ZSgpLHRoaXMudGVybT10aGlzLl92YWx1ZSgpLGUubGVuZ3RoPHRoaXMub3B0aW9ucy5taW5MZW5ndGg/dGhpcy5jbG9zZSh0KTp0aGlzLl90cmlnZ2VyKFwic2VhcmNoXCIsdCkhPT0hMT90aGlzLl9zZWFyY2goZSk6dm9pZCAwfSxfc2VhcmNoOmZ1bmN0aW9uKGUpe3RoaXMucGVuZGluZysrLHRoaXMuZWxlbWVudC5hZGRDbGFzcyhcInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nXCIpLHRoaXMuY2FuY2VsU2VhcmNoPSExLHRoaXMuc291cmNlKHt0ZXJtOmV9LHRoaXMuX3Jlc3BvbnNlKCkpfSxfcmVzcG9uc2U6ZnVuY3Rpb24oKXt2YXIgdD0rK3RoaXMucmVxdWVzdEluZGV4O3JldHVybiBlLnByb3h5KGZ1bmN0aW9uKGUpe3Q9PT10aGlzLnJlcXVlc3RJbmRleCYmdGhpcy5fX3Jlc3BvbnNlKGUpLHRoaXMucGVuZGluZy0tLHRoaXMucGVuZGluZ3x8dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKFwidWktYXV0b2NvbXBsZXRlLWxvYWRpbmdcIil9LHRoaXMpfSxfX3Jlc3BvbnNlOmZ1bmN0aW9uKGUpe2UmJihlPXRoaXMuX25vcm1hbGl6ZShlKSksdGhpcy5fdHJpZ2dlcihcInJlc3BvbnNlXCIsbnVsbCx7Y29udGVudDplfSksIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmZSYmZS5sZW5ndGgmJiF0aGlzLmNhbmNlbFNlYXJjaD8odGhpcy5fc3VnZ2VzdChlKSx0aGlzLl90cmlnZ2VyKFwib3BlblwiKSk6dGhpcy5fY2xvc2UoKX0sY2xvc2U6ZnVuY3Rpb24oZSl7dGhpcy5jYW5jZWxTZWFyY2g9ITAsdGhpcy5fY2xvc2UoZSl9LF9jbG9zZTpmdW5jdGlvbihlKXt0aGlzLm1lbnUuZWxlbWVudC5pcyhcIjp2aXNpYmxlXCIpJiYodGhpcy5tZW51LmVsZW1lbnQuaGlkZSgpLHRoaXMubWVudS5ibHVyKCksdGhpcy5pc05ld01lbnU9ITAsdGhpcy5fdHJpZ2dlcihcImNsb3NlXCIsZSkpfSxfY2hhbmdlOmZ1bmN0aW9uKGUpe3RoaXMucHJldmlvdXMhPT10aGlzLl92YWx1ZSgpJiZ0aGlzLl90cmlnZ2VyKFwiY2hhbmdlXCIsZSx7aXRlbTp0aGlzLnNlbGVjdGVkSXRlbX0pfSxfbm9ybWFsaXplOmZ1bmN0aW9uKHQpe3JldHVybiB0Lmxlbmd0aCYmdFswXS5sYWJlbCYmdFswXS52YWx1ZT90OmUubWFwKHQsZnVuY3Rpb24odCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQ/e2xhYmVsOnQsdmFsdWU6dH06ZS5leHRlbmQoe30sdCx7bGFiZWw6dC5sYWJlbHx8dC52YWx1ZSx2YWx1ZTp0LnZhbHVlfHx0LmxhYmVsfSl9KX0sX3N1Z2dlc3Q6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5tZW51LmVsZW1lbnQuZW1wdHkoKTt0aGlzLl9yZW5kZXJNZW51KGksdCksdGhpcy5pc05ld01lbnU9ITAsdGhpcy5tZW51LnJlZnJlc2goKSxpLnNob3coKSx0aGlzLl9yZXNpemVNZW51KCksaS5wb3NpdGlvbihlLmV4dGVuZCh7b2Y6dGhpcy5lbGVtZW50fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSx0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzJiZ0aGlzLm1lbnUubmV4dCgpfSxfcmVzaXplTWVudTpmdW5jdGlvbigpe3ZhciBlPXRoaXMubWVudS5lbGVtZW50O2Uub3V0ZXJXaWR0aChNYXRoLm1heChlLndpZHRoKFwiXCIpLm91dGVyV2lkdGgoKSsxLHRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCkpKX0sX3JlbmRlck1lbnU6ZnVuY3Rpb24odCxpKXt2YXIgcz10aGlzO2UuZWFjaChpLGZ1bmN0aW9uKGUsaSl7cy5fcmVuZGVySXRlbURhdGEodCxpKX0pfSxfcmVuZGVySXRlbURhdGE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fcmVuZGVySXRlbShlLHQpLmRhdGEoXCJ1aS1hdXRvY29tcGxldGUtaXRlbVwiLHQpfSxfcmVuZGVySXRlbTpmdW5jdGlvbih0LGkpe3JldHVybiBlKFwiPGxpPlwiKS50ZXh0KGkubGFiZWwpLmFwcGVuZFRvKHQpfSxfbW92ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1lbnUuZWxlbWVudC5pcyhcIjp2aXNpYmxlXCIpP3RoaXMubWVudS5pc0ZpcnN0SXRlbSgpJiYvXnByZXZpb3VzLy50ZXN0KGUpfHx0aGlzLm1lbnUuaXNMYXN0SXRlbSgpJiYvXm5leHQvLnRlc3QoZSk/KHRoaXMuaXNNdWx0aUxpbmV8fHRoaXMuX3ZhbHVlKHRoaXMudGVybSksdGhpcy5tZW51LmJsdXIoKSx2b2lkIDApOih0aGlzLm1lbnVbZV0odCksdm9pZCAwKToodGhpcy5zZWFyY2gobnVsbCx0KSx2b2lkIDApfSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW51LmVsZW1lbnR9LF92YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlTWV0aG9kLmFwcGx5KHRoaXMuZWxlbWVudCxhcmd1bWVudHMpfSxfa2V5RXZlbnQ6ZnVuY3Rpb24oZSx0KXsoIXRoaXMuaXNNdWx0aUxpbmV8fHRoaXMubWVudS5lbGVtZW50LmlzKFwiOnZpc2libGVcIikpJiYodGhpcy5fbW92ZShlLHQpLHQucHJldmVudERlZmF1bHQoKSl9fSksZS5leHRlbmQoZS51aS5hdXRvY29tcGxldGUse2VzY2FwZVJlZ2V4OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1tcXC1cXFtcXF17fSgpKis/LixcXFxcXFxeJHwjXFxzXS9nLFwiXFxcXCQmXCIpfSxmaWx0ZXI6ZnVuY3Rpb24odCxpKXt2YXIgcz1SZWdFeHAoZS51aS5hdXRvY29tcGxldGUuZXNjYXBlUmVnZXgoaSksXCJpXCIpO3JldHVybiBlLmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gcy50ZXN0KGUubGFiZWx8fGUudmFsdWV8fGUpfSl9fSksZS53aWRnZXQoXCJ1aS5hdXRvY29tcGxldGVcIixlLnVpLmF1dG9jb21wbGV0ZSx7b3B0aW9uczp7bWVzc2FnZXM6e25vUmVzdWx0czpcIk5vIHNlYXJjaCByZXN1bHRzLlwiLHJlc3VsdHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUrKGU+MT9cIiByZXN1bHRzIGFyZVwiOlwiIHJlc3VsdCBpc1wiKStcIiBhdmFpbGFibGUsIHVzZSB1cCBhbmQgZG93biBhcnJvdyBrZXlzIHRvIG5hdmlnYXRlLlwifX19LF9fcmVzcG9uc2U6ZnVuY3Rpb24odCl7dmFyIGk7dGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpLHRoaXMub3B0aW9ucy5kaXNhYmxlZHx8dGhpcy5jYW5jZWxTZWFyY2h8fChpPXQmJnQubGVuZ3RoP3RoaXMub3B0aW9ucy5tZXNzYWdlcy5yZXN1bHRzKHQubGVuZ3RoKTp0aGlzLm9wdGlvbnMubWVzc2FnZXMubm9SZXN1bHRzLHRoaXMubGl2ZVJlZ2lvbi5jaGlsZHJlbigpLmhpZGUoKSxlKFwiPGRpdj5cIikudGV4dChpKS5hcHBlbmRUbyh0aGlzLmxpdmVSZWdpb24pKX19KSxlLnVpLmF1dG9jb21wbGV0ZTt2YXIgYyxwPVwidWktYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGxcIixmPVwidWktYnV0dG9uLWljb25zLW9ubHkgdWktYnV0dG9uLWljb24tb25seSB1aS1idXR0b24tdGV4dC1pY29ucyB1aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgdWktYnV0dG9uLXRleHQtaWNvbi1zZWNvbmRhcnkgdWktYnV0dG9uLXRleHQtb25seVwiLG09ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmZpbmQoXCI6dWktYnV0dG9uXCIpLmJ1dHRvbihcInJlZnJlc2hcIil9LDEpfSxnPWZ1bmN0aW9uKHQpe3ZhciBpPXQubmFtZSxzPXQuZm9ybSxuPWUoW10pO3JldHVybiBpJiYoaT1pLnJlcGxhY2UoLycvZyxcIlxcXFwnXCIpLG49cz9lKHMpLmZpbmQoXCJbbmFtZT0nXCIraStcIiddW3R5cGU9cmFkaW9dXCIpOmUoXCJbbmFtZT0nXCIraStcIiddW3R5cGU9cmFkaW9dXCIsdC5vd25lckRvY3VtZW50KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5mb3JtfSkpLG59O2Uud2lkZ2V0KFwidWkuYnV0dG9uXCIse3ZlcnNpb246XCIxLjExLjRcIixkZWZhdWx0RWxlbWVudDpcIjxidXR0b24+XCIsb3B0aW9uczp7ZGlzYWJsZWQ6bnVsbCx0ZXh0OiEwLGxhYmVsOm51bGwsaWNvbnM6e3ByaW1hcnk6bnVsbCxzZWNvbmRhcnk6bnVsbH19LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuY2xvc2VzdChcImZvcm1cIikudW5iaW5kKFwicmVzZXRcIit0aGlzLmV2ZW50TmFtZXNwYWNlKS5iaW5kKFwicmVzZXRcIit0aGlzLmV2ZW50TmFtZXNwYWNlLG0pLFwiYm9vbGVhblwiIT10eXBlb2YgdGhpcy5vcHRpb25zLmRpc2FibGVkP3RoaXMub3B0aW9ucy5kaXNhYmxlZD0hIXRoaXMuZWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIik6dGhpcy5lbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiLHRoaXMub3B0aW9ucy5kaXNhYmxlZCksdGhpcy5fZGV0ZXJtaW5lQnV0dG9uVHlwZSgpLHRoaXMuaGFzVGl0bGU9ISF0aGlzLmJ1dHRvbkVsZW1lbnQuYXR0cihcInRpdGxlXCIpO3ZhciB0PXRoaXMsaT10aGlzLm9wdGlvbnMscz1cImNoZWNrYm94XCI9PT10aGlzLnR5cGV8fFwicmFkaW9cIj09PXRoaXMudHlwZSxuPXM/XCJcIjpcInVpLXN0YXRlLWFjdGl2ZVwiO251bGw9PT1pLmxhYmVsJiYoaS5sYWJlbD1cImlucHV0XCI9PT10aGlzLnR5cGU/dGhpcy5idXR0b25FbGVtZW50LnZhbCgpOnRoaXMuYnV0dG9uRWxlbWVudC5odG1sKCkpLHRoaXMuX2hvdmVyYWJsZSh0aGlzLmJ1dHRvbkVsZW1lbnQpLHRoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcyhwKS5hdHRyKFwicm9sZVwiLFwiYnV0dG9uXCIpLmJpbmQoXCJtb3VzZWVudGVyXCIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2kuZGlzYWJsZWR8fHRoaXM9PT1jJiZlKHRoaXMpLmFkZENsYXNzKFwidWktc3RhdGUtYWN0aXZlXCIpfSkuYmluZChcIm1vdXNlbGVhdmVcIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7aS5kaXNhYmxlZHx8ZSh0aGlzKS5yZW1vdmVDbGFzcyhuKX0pLmJpbmQoXCJjbGlja1wiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oZSl7aS5kaXNhYmxlZCYmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX0pLHRoaXMuX29uKHtmb2N1czpmdW5jdGlvbigpe3RoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcyhcInVpLXN0YXRlLWZvY3VzXCIpfSxibHVyOmZ1bmN0aW9uKCl7dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKFwidWktc3RhdGUtZm9jdXNcIil9fSkscyYmdGhpcy5lbGVtZW50LmJpbmQoXCJjaGFuZ2VcIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7dC5yZWZyZXNoKCl9KSxcImNoZWNrYm94XCI9PT10aGlzLnR5cGU/dGhpcy5idXR0b25FbGVtZW50LmJpbmQoXCJjbGlja1wiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXtyZXR1cm4gaS5kaXNhYmxlZD8hMTp2b2lkIDB9KTpcInJhZGlvXCI9PT10aGlzLnR5cGU/dGhpcy5idXR0b25FbGVtZW50LmJpbmQoXCJjbGlja1wiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXtpZihpLmRpc2FibGVkKXJldHVybiExO2UodGhpcykuYWRkQ2xhc3MoXCJ1aS1zdGF0ZS1hY3RpdmVcIiksdC5idXR0b25FbGVtZW50LmF0dHIoXCJhcmlhLXByZXNzZWRcIixcInRydWVcIik7dmFyIHM9dC5lbGVtZW50WzBdO2cocykubm90KHMpLm1hcChmdW5jdGlvbigpe3JldHVybiBlKHRoaXMpLmJ1dHRvbihcIndpZGdldFwiKVswXX0pLnJlbW92ZUNsYXNzKFwidWktc3RhdGUtYWN0aXZlXCIpLmF0dHIoXCJhcmlhLXByZXNzZWRcIixcImZhbHNlXCIpfSk6KHRoaXMuYnV0dG9uRWxlbWVudC5iaW5kKFwibW91c2Vkb3duXCIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe3JldHVybiBpLmRpc2FibGVkPyExOihlKHRoaXMpLmFkZENsYXNzKFwidWktc3RhdGUtYWN0aXZlXCIpLGM9dGhpcyx0LmRvY3VtZW50Lm9uZShcIm1vdXNldXBcIixmdW5jdGlvbigpe2M9bnVsbH0pLHZvaWQgMCl9KS5iaW5kKFwibW91c2V1cFwiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXtyZXR1cm4gaS5kaXNhYmxlZD8hMTooZSh0aGlzKS5yZW1vdmVDbGFzcyhcInVpLXN0YXRlLWFjdGl2ZVwiKSx2b2lkIDApfSkuYmluZChcImtleWRvd25cIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKHQpe3JldHVybiBpLmRpc2FibGVkPyExOigodC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLlNQQUNFfHx0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuRU5URVIpJiZlKHRoaXMpLmFkZENsYXNzKFwidWktc3RhdGUtYWN0aXZlXCIpLHZvaWQgMCl9KS5iaW5kKFwia2V5dXBcIit0aGlzLmV2ZW50TmFtZXNwYWNlK1wiIGJsdXJcIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7ZSh0aGlzKS5yZW1vdmVDbGFzcyhcInVpLXN0YXRlLWFjdGl2ZVwiKX0pLHRoaXMuYnV0dG9uRWxlbWVudC5pcyhcImFcIikmJnRoaXMuYnV0dG9uRWxlbWVudC5rZXl1cChmdW5jdGlvbih0KXt0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuU1BBQ0UmJmUodGhpcykuY2xpY2soKX0pKSx0aGlzLl9zZXRPcHRpb24oXCJkaXNhYmxlZFwiLGkuZGlzYWJsZWQpLHRoaXMuX3Jlc2V0QnV0dG9uKCl9LF9kZXRlcm1pbmVCdXR0b25UeXBlOmZ1bmN0aW9uKCl7dmFyIGUsdCxpO3RoaXMudHlwZT10aGlzLmVsZW1lbnQuaXMoXCJbdHlwZT1jaGVja2JveF1cIik/XCJjaGVja2JveFwiOnRoaXMuZWxlbWVudC5pcyhcIlt0eXBlPXJhZGlvXVwiKT9cInJhZGlvXCI6dGhpcy5lbGVtZW50LmlzKFwiaW5wdXRcIik/XCJpbnB1dFwiOlwiYnV0dG9uXCIsXCJjaGVja2JveFwiPT09dGhpcy50eXBlfHxcInJhZGlvXCI9PT10aGlzLnR5cGU/KGU9dGhpcy5lbGVtZW50LnBhcmVudHMoKS5sYXN0KCksdD1cImxhYmVsW2Zvcj0nXCIrdGhpcy5lbGVtZW50LmF0dHIoXCJpZFwiKStcIiddXCIsdGhpcy5idXR0b25FbGVtZW50PWUuZmluZCh0KSx0aGlzLmJ1dHRvbkVsZW1lbnQubGVuZ3RofHwoZT1lLmxlbmd0aD9lLnNpYmxpbmdzKCk6dGhpcy5lbGVtZW50LnNpYmxpbmdzKCksdGhpcy5idXR0b25FbGVtZW50PWUuZmlsdGVyKHQpLHRoaXMuYnV0dG9uRWxlbWVudC5sZW5ndGh8fCh0aGlzLmJ1dHRvbkVsZW1lbnQ9ZS5maW5kKHQpKSksdGhpcy5lbGVtZW50LmFkZENsYXNzKFwidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlXCIpLGk9dGhpcy5lbGVtZW50LmlzKFwiOmNoZWNrZWRcIiksaSYmdGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKFwidWktc3RhdGUtYWN0aXZlXCIpLHRoaXMuYnV0dG9uRWxlbWVudC5wcm9wKFwiYXJpYS1wcmVzc2VkXCIsaSkpOnRoaXMuYnV0dG9uRWxlbWVudD10aGlzLmVsZW1lbnR9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1dHRvbkVsZW1lbnR9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKFwidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlXCIpLHRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcyhwK1wiIHVpLXN0YXRlLWFjdGl2ZSBcIitmKS5yZW1vdmVBdHRyKFwicm9sZVwiKS5yZW1vdmVBdHRyKFwiYXJpYS1wcmVzc2VkXCIpLmh0bWwodGhpcy5idXR0b25FbGVtZW50LmZpbmQoXCIudWktYnV0dG9uLXRleHRcIikuaHRtbCgpKSx0aGlzLmhhc1RpdGxlfHx0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQXR0cihcInRpdGxlXCIpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3N1cGVyKGUsdCksXCJkaXNhYmxlZFwiPT09ZT8odGhpcy53aWRnZXQoKS50b2dnbGVDbGFzcyhcInVpLXN0YXRlLWRpc2FibGVkXCIsISF0KSx0aGlzLmVsZW1lbnQucHJvcChcImRpc2FibGVkXCIsISF0KSx0JiYoXCJjaGVja2JveFwiPT09dGhpcy50eXBlfHxcInJhZGlvXCI9PT10aGlzLnR5cGU/dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKFwidWktc3RhdGUtZm9jdXNcIik6dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKFwidWktc3RhdGUtZm9jdXMgdWktc3RhdGUtYWN0aXZlXCIpKSx2b2lkIDApOih0aGlzLl9yZXNldEJ1dHRvbigpLHZvaWQgMCl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQuaXMoXCJpbnB1dCwgYnV0dG9uXCIpP3RoaXMuZWxlbWVudC5pcyhcIjpkaXNhYmxlZFwiKTp0aGlzLmVsZW1lbnQuaGFzQ2xhc3MoXCJ1aS1idXR0b24tZGlzYWJsZWRcIik7dCE9PXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5fc2V0T3B0aW9uKFwiZGlzYWJsZWRcIix0KSxcInJhZGlvXCI9PT10aGlzLnR5cGU/Zyh0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmlzKFwiOmNoZWNrZWRcIik/ZSh0aGlzKS5idXR0b24oXCJ3aWRnZXRcIikuYWRkQ2xhc3MoXCJ1aS1zdGF0ZS1hY3RpdmVcIikuYXR0cihcImFyaWEtcHJlc3NlZFwiLFwidHJ1ZVwiKTplKHRoaXMpLmJ1dHRvbihcIndpZGdldFwiKS5yZW1vdmVDbGFzcyhcInVpLXN0YXRlLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1wcmVzc2VkXCIsXCJmYWxzZVwiKX0pOlwiY2hlY2tib3hcIj09PXRoaXMudHlwZSYmKHRoaXMuZWxlbWVudC5pcyhcIjpjaGVja2VkXCIpP3RoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcyhcInVpLXN0YXRlLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1wcmVzc2VkXCIsXCJ0cnVlXCIpOnRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcyhcInVpLXN0YXRlLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1wcmVzc2VkXCIsXCJmYWxzZVwiKSl9LF9yZXNldEJ1dHRvbjpmdW5jdGlvbigpe2lmKFwiaW5wdXRcIj09PXRoaXMudHlwZSlyZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsJiZ0aGlzLmVsZW1lbnQudmFsKHRoaXMub3B0aW9ucy5sYWJlbCksdm9pZCAwO3ZhciB0PXRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcyhmKSxpPWUoXCI8c3Bhbj48L3NwYW4+XCIsdGhpcy5kb2N1bWVudFswXSkuYWRkQ2xhc3MoXCJ1aS1idXR0b24tdGV4dFwiKS5odG1sKHRoaXMub3B0aW9ucy5sYWJlbCkuYXBwZW5kVG8odC5lbXB0eSgpKS50ZXh0KCkscz10aGlzLm9wdGlvbnMuaWNvbnMsbj1zLnByaW1hcnkmJnMuc2Vjb25kYXJ5LGE9W107cy5wcmltYXJ5fHxzLnNlY29uZGFyeT8odGhpcy5vcHRpb25zLnRleHQmJmEucHVzaChcInVpLWJ1dHRvbi10ZXh0LWljb25cIisobj9cInNcIjpzLnByaW1hcnk/XCItcHJpbWFyeVwiOlwiLXNlY29uZGFyeVwiKSkscy5wcmltYXJ5JiZ0LnByZXBlbmQoXCI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24tcHJpbWFyeSB1aS1pY29uIFwiK3MucHJpbWFyeStcIic+PC9zcGFuPlwiKSxzLnNlY29uZGFyeSYmdC5hcHBlbmQoXCI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24tc2Vjb25kYXJ5IHVpLWljb24gXCIrcy5zZWNvbmRhcnkrXCInPjwvc3Bhbj5cIiksdGhpcy5vcHRpb25zLnRleHR8fChhLnB1c2gobj9cInVpLWJ1dHRvbi1pY29ucy1vbmx5XCI6XCJ1aS1idXR0b24taWNvbi1vbmx5XCIpLHRoaXMuaGFzVGl0bGV8fHQuYXR0cihcInRpdGxlXCIsZS50cmltKGkpKSkpOmEucHVzaChcInVpLWJ1dHRvbi10ZXh0LW9ubHlcIiksdC5hZGRDbGFzcyhhLmpvaW4oXCIgXCIpKX19KSxlLndpZGdldChcInVpLmJ1dHRvbnNldFwiLHt2ZXJzaW9uOlwiMS4xMS40XCIsb3B0aW9uczp7aXRlbXM6XCJidXR0b24sIGlucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1zdWJtaXRdLCBpbnB1dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dLCBhLCA6ZGF0YSh1aS1idXR0b24pXCJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoXCJ1aS1idXR0b25zZXRcIil9LF9pbml0OmZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtcImRpc2FibGVkXCI9PT1lJiZ0aGlzLmJ1dHRvbnMuYnV0dG9uKFwib3B0aW9uXCIsZSx0KSx0aGlzLl9zdXBlcihlLHQpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIHQ9XCJydGxcIj09PXRoaXMuZWxlbWVudC5jc3MoXCJkaXJlY3Rpb25cIiksaT10aGlzLmVsZW1lbnQuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpLHM9aS5maWx0ZXIoXCI6dWktYnV0dG9uXCIpO2kubm90KFwiOnVpLWJ1dHRvblwiKS5idXR0b24oKSxzLmJ1dHRvbihcInJlZnJlc2hcIiksdGhpcy5idXR0b25zPWkubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcykuYnV0dG9uKFwid2lkZ2V0XCIpWzBdfSkucmVtb3ZlQ2xhc3MoXCJ1aS1jb3JuZXItYWxsIHVpLWNvcm5lci1sZWZ0IHVpLWNvcm5lci1yaWdodFwiKS5maWx0ZXIoXCI6Zmlyc3RcIikuYWRkQ2xhc3ModD9cInVpLWNvcm5lci1yaWdodFwiOlwidWktY29ybmVyLWxlZnRcIikuZW5kKCkuZmlsdGVyKFwiOmxhc3RcIikuYWRkQ2xhc3ModD9cInVpLWNvcm5lci1sZWZ0XCI6XCJ1aS1jb3JuZXItcmlnaHRcIikuZW5kKCkuZW5kKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKFwidWktYnV0dG9uc2V0XCIpLHRoaXMuYnV0dG9ucy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzKS5idXR0b24oXCJ3aWRnZXRcIilbMF19KS5yZW1vdmVDbGFzcyhcInVpLWNvcm5lci1sZWZ0IHVpLWNvcm5lci1yaWdodFwiKS5lbmQoKS5idXR0b24oXCJkZXN0cm95XCIpfX0pLGUudWkuYnV0dG9uLGUuZXh0ZW5kKGUudWkse2RhdGVwaWNrZXI6e3ZlcnNpb246XCIxLjExLjRcIn19KTt2YXIgdjtlLmV4dGVuZChuLnByb3RvdHlwZSx7bWFya2VyQ2xhc3NOYW1lOlwiaGFzRGF0ZXBpY2tlclwiLG1heFJvd3M6NCxfd2lkZ2V0RGF0ZXBpY2tlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRwRGl2fSxzZXREZWZhdWx0czpmdW5jdGlvbihlKXtyZXR1cm4gcih0aGlzLl9kZWZhdWx0cyxlfHx7fSksdGhpc30sX2F0dGFjaERhdGVwaWNrZXI6ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGE7cz10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj1cImRpdlwiPT09c3x8XCJzcGFuXCI9PT1zLHQuaWR8fCh0aGlzLnV1aWQrPTEsdC5pZD1cImRwXCIrdGhpcy51dWlkKSxhPXRoaXMuX25ld0luc3QoZSh0KSxuKSxhLnNldHRpbmdzPWUuZXh0ZW5kKHt9LGl8fHt9KSxcImlucHV0XCI9PT1zP3RoaXMuX2Nvbm5lY3REYXRlcGlja2VyKHQsYSk6biYmdGhpcy5faW5saW5lRGF0ZXBpY2tlcih0LGEpfSxfbmV3SW5zdDpmdW5jdGlvbih0LGkpe3ZhciBzPXRbMF0uaWQucmVwbGFjZSgvKFteQS1aYS16MC05X1xcLV0pL2csXCJcXFxcXFxcXCQxXCIpO3JldHVybntpZDpzLGlucHV0OnQsc2VsZWN0ZWREYXk6MCxzZWxlY3RlZE1vbnRoOjAsc2VsZWN0ZWRZZWFyOjAsZHJhd01vbnRoOjAsZHJhd1llYXI6MCxpbmxpbmU6aSxkcERpdjppP2EoZShcIjxkaXYgY2xhc3M9J1wiK3RoaXMuX2lubGluZUNsYXNzK1wiIHVpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsJz48L2Rpdj5cIikpOnRoaXMuZHBEaXZ9fSxfY29ubmVjdERhdGVwaWNrZXI6ZnVuY3Rpb24odCxpKXt2YXIgcz1lKHQpO2kuYXBwZW5kPWUoW10pLGkudHJpZ2dlcj1lKFtdKSxzLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKXx8KHRoaXMuX2F0dGFjaG1lbnRzKHMsaSkscy5hZGRDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkua2V5ZG93bih0aGlzLl9kb0tleURvd24pLmtleXByZXNzKHRoaXMuX2RvS2V5UHJlc3MpLmtleXVwKHRoaXMuX2RvS2V5VXApLHRoaXMuX2F1dG9TaXplKGkpLGUuZGF0YSh0LFwiZGF0ZXBpY2tlclwiLGkpLGkuc2V0dGluZ3MuZGlzYWJsZWQmJnRoaXMuX2Rpc2FibGVEYXRlcGlja2VyKHQpKX0sX2F0dGFjaG1lbnRzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhLG89dGhpcy5fZ2V0KGksXCJhcHBlbmRUZXh0XCIpLHI9dGhpcy5fZ2V0KGksXCJpc1JUTFwiKTtpLmFwcGVuZCYmaS5hcHBlbmQucmVtb3ZlKCksbyYmKGkuYXBwZW5kPWUoXCI8c3BhbiBjbGFzcz0nXCIrdGhpcy5fYXBwZW5kQ2xhc3MrXCInPlwiK28rXCI8L3NwYW4+XCIpLHRbcj9cImJlZm9yZVwiOlwiYWZ0ZXJcIl0oaS5hcHBlbmQpKSx0LnVuYmluZChcImZvY3VzXCIsdGhpcy5fc2hvd0RhdGVwaWNrZXIpLGkudHJpZ2dlciYmaS50cmlnZ2VyLnJlbW92ZSgpLHM9dGhpcy5fZ2V0KGksXCJzaG93T25cIiksKFwiZm9jdXNcIj09PXN8fFwiYm90aFwiPT09cykmJnQuZm9jdXModGhpcy5fc2hvd0RhdGVwaWNrZXIpLChcImJ1dHRvblwiPT09c3x8XCJib3RoXCI9PT1zKSYmKG49dGhpcy5fZ2V0KGksXCJidXR0b25UZXh0XCIpLGE9dGhpcy5fZ2V0KGksXCJidXR0b25JbWFnZVwiKSxpLnRyaWdnZXI9ZSh0aGlzLl9nZXQoaSxcImJ1dHRvbkltYWdlT25seVwiKT9lKFwiPGltZy8+XCIpLmFkZENsYXNzKHRoaXMuX3RyaWdnZXJDbGFzcykuYXR0cih7c3JjOmEsYWx0Om4sdGl0bGU6bn0pOmUoXCI8YnV0dG9uIHR5cGU9J2J1dHRvbic+PC9idXR0b24+XCIpLmFkZENsYXNzKHRoaXMuX3RyaWdnZXJDbGFzcykuaHRtbChhP2UoXCI8aW1nLz5cIikuYXR0cih7c3JjOmEsYWx0Om4sdGl0bGU6bn0pOm4pKSx0W3I/XCJiZWZvcmVcIjpcImFmdGVyXCJdKGkudHJpZ2dlciksaS50cmlnZ2VyLmNsaWNrKGZ1bmN0aW9uKCl7cmV0dXJuIGUuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJmUuZGF0ZXBpY2tlci5fbGFzdElucHV0PT09dFswXT9lLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk6ZS5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmZS5kYXRlcGlja2VyLl9sYXN0SW5wdXQhPT10WzBdPyhlLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksZS5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0WzBdKSk6ZS5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0WzBdKSwhMX0pKX0sX2F1dG9TaXplOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX2dldChlLFwiYXV0b1NpemVcIikmJiFlLmlubGluZSl7dmFyIHQsaSxzLG4sYT1uZXcgRGF0ZSgyMDA5LDExLDIwKSxvPXRoaXMuX2dldChlLFwiZGF0ZUZvcm1hdFwiKTtvLm1hdGNoKC9bRE1dLykmJih0PWZ1bmN0aW9uKGUpe2ZvcihpPTAscz0wLG49MDtlLmxlbmd0aD5uO24rKyllW25dLmxlbmd0aD5pJiYoaT1lW25dLmxlbmd0aCxzPW4pO3JldHVybiBzfSxhLnNldE1vbnRoKHQodGhpcy5fZ2V0KGUsby5tYXRjaCgvTU0vKT9cIm1vbnRoTmFtZXNcIjpcIm1vbnRoTmFtZXNTaG9ydFwiKSkpLGEuc2V0RGF0ZSh0KHRoaXMuX2dldChlLG8ubWF0Y2goL0RELyk/XCJkYXlOYW1lc1wiOlwiZGF5TmFtZXNTaG9ydFwiKSkrMjAtYS5nZXREYXkoKSkpLGUuaW5wdXQuYXR0cihcInNpemVcIix0aGlzLl9mb3JtYXREYXRlKGUsYSkubGVuZ3RoKX19LF9pbmxpbmVEYXRlcGlja2VyOmZ1bmN0aW9uKHQsaSl7dmFyIHM9ZSh0KTtzLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKXx8KHMuYWRkQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmFwcGVuZChpLmRwRGl2KSxlLmRhdGEodCxcImRhdGVwaWNrZXJcIixpKSx0aGlzLl9zZXREYXRlKGksdGhpcy5fZ2V0RGVmYXVsdERhdGUoaSksITApLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaSksdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGkpLGkuc2V0dGluZ3MuZGlzYWJsZWQmJnRoaXMuX2Rpc2FibGVEYXRlcGlja2VyKHQpLGkuZHBEaXYuY3NzKFwiZGlzcGxheVwiLFwiYmxvY2tcIikpfSxfZGlhbG9nRGF0ZXBpY2tlcjpmdW5jdGlvbih0LGkscyxuLGEpe3ZhciBvLGgsbCx1LGQsYz10aGlzLl9kaWFsb2dJbnN0O3JldHVybiBjfHwodGhpcy51dWlkKz0xLG89XCJkcFwiK3RoaXMudXVpZCx0aGlzLl9kaWFsb2dJbnB1dD1lKFwiPGlucHV0IHR5cGU9J3RleHQnIGlkPSdcIitvK1wiJyBzdHlsZT0ncG9zaXRpb246IGFic29sdXRlOyB0b3A6IC0xMDBweDsgd2lkdGg6IDBweDsnLz5cIiksdGhpcy5fZGlhbG9nSW5wdXQua2V5ZG93bih0aGlzLl9kb0tleURvd24pLGUoXCJib2R5XCIpLmFwcGVuZCh0aGlzLl9kaWFsb2dJbnB1dCksYz10aGlzLl9kaWFsb2dJbnN0PXRoaXMuX25ld0luc3QodGhpcy5fZGlhbG9nSW5wdXQsITEpLGMuc2V0dGluZ3M9e30sZS5kYXRhKHRoaXMuX2RpYWxvZ0lucHV0WzBdLFwiZGF0ZXBpY2tlclwiLGMpKSxyKGMuc2V0dGluZ3Msbnx8e30pLGk9aSYmaS5jb25zdHJ1Y3Rvcj09PURhdGU/dGhpcy5fZm9ybWF0RGF0ZShjLGkpOmksdGhpcy5fZGlhbG9nSW5wdXQudmFsKGkpLHRoaXMuX3Bvcz1hP2EubGVuZ3RoP2E6W2EucGFnZVgsYS5wYWdlWV06bnVsbCx0aGlzLl9wb3N8fChoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxsPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsdT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0LGQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AsdGhpcy5fcG9zPVtoLzItMTAwK3UsbC8yLTE1MCtkXSksdGhpcy5fZGlhbG9nSW5wdXQuY3NzKFwibGVmdFwiLHRoaXMuX3Bvc1swXSsyMCtcInB4XCIpLmNzcyhcInRvcFwiLHRoaXMuX3Bvc1sxXStcInB4XCIpLGMuc2V0dGluZ3Mub25TZWxlY3Q9cyx0aGlzLl9pbkRpYWxvZz0hMCx0aGlzLmRwRGl2LmFkZENsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKSx0aGlzLl9zaG93RGF0ZXBpY2tlcih0aGlzLl9kaWFsb2dJbnB1dFswXSksZS5ibG9ja1VJJiZlLmJsb2NrVUkodGhpcy5kcERpdiksZS5kYXRhKHRoaXMuX2RpYWxvZ0lucHV0WzBdLFwiZGF0ZXBpY2tlclwiLGMpLHRoaXN9LF9kZXN0cm95RGF0ZXBpY2tlcjpmdW5jdGlvbih0KXt2YXIgaSxzPWUodCksbj1lLmRhdGEodCxcImRhdGVwaWNrZXJcIik7cy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkmJihpPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxlLnJlbW92ZURhdGEodCxcImRhdGVwaWNrZXJcIiksXCJpbnB1dFwiPT09aT8obi5hcHBlbmQucmVtb3ZlKCksbi50cmlnZ2VyLnJlbW92ZSgpLHMucmVtb3ZlQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLnVuYmluZChcImZvY3VzXCIsdGhpcy5fc2hvd0RhdGVwaWNrZXIpLnVuYmluZChcImtleWRvd25cIix0aGlzLl9kb0tleURvd24pLnVuYmluZChcImtleXByZXNzXCIsdGhpcy5fZG9LZXlQcmVzcykudW5iaW5kKFwia2V5dXBcIix0aGlzLl9kb0tleVVwKSk6KFwiZGl2XCI9PT1pfHxcInNwYW5cIj09PWkpJiZzLnJlbW92ZUNsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5lbXB0eSgpLHY9PT1uJiYodj1udWxsKSl9LF9lbmFibGVEYXRlcGlja2VyOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbj1lKHQpLGE9ZS5kYXRhKHQsXCJkYXRlcGlja2VyXCIpO24uaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpJiYoaT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXCJpbnB1dFwiPT09aT8odC5kaXNhYmxlZD0hMSxhLnRyaWdnZXIuZmlsdGVyKFwiYnV0dG9uXCIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkPSExfSkuZW5kKCkuZmlsdGVyKFwiaW1nXCIpLmNzcyh7b3BhY2l0eTpcIjEuMFwiLGN1cnNvcjpcIlwifSkpOihcImRpdlwiPT09aXx8XCJzcGFuXCI9PT1pKSYmKHM9bi5jaGlsZHJlbihcIi5cIit0aGlzLl9pbmxpbmVDbGFzcykscy5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKFwidWktc3RhdGUtZGlzYWJsZWRcIikscy5maW5kKFwic2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXJcIikucHJvcChcImRpc2FibGVkXCIsITEpKSx0aGlzLl9kaXNhYmxlZElucHV0cz1lLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cyxmdW5jdGlvbihlKXtyZXR1cm4gZT09PXQ/bnVsbDplfSkpfSxfZGlzYWJsZURhdGVwaWNrZXI6ZnVuY3Rpb24odCl7dmFyIGkscyxuPWUodCksYT1lLmRhdGEodCxcImRhdGVwaWNrZXJcIik7bi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkmJihpPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxcImlucHV0XCI9PT1pPyh0LmRpc2FibGVkPSEwLGEudHJpZ2dlci5maWx0ZXIoXCJidXR0b25cIikuZWFjaChmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9ITB9KS5lbmQoKS5maWx0ZXIoXCJpbWdcIikuY3NzKHtvcGFjaXR5OlwiMC41XCIsY3Vyc29yOlwiZGVmYXVsdFwifSkpOihcImRpdlwiPT09aXx8XCJzcGFuXCI9PT1pKSYmKHM9bi5jaGlsZHJlbihcIi5cIit0aGlzLl9pbmxpbmVDbGFzcykscy5jaGlsZHJlbigpLmFkZENsYXNzKFwidWktc3RhdGUtZGlzYWJsZWRcIikscy5maW5kKFwic2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXJcIikucHJvcChcImRpc2FibGVkXCIsITApKSx0aGlzLl9kaXNhYmxlZElucHV0cz1lLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cyxmdW5jdGlvbihlKXtyZXR1cm4gZT09PXQ/bnVsbDplfSksdGhpcy5fZGlzYWJsZWRJbnB1dHNbdGhpcy5fZGlzYWJsZWRJbnB1dHMubGVuZ3RoXT10KX0sX2lzRGlzYWJsZWREYXRlcGlja2VyOmZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiExO2Zvcih2YXIgdD0wO3RoaXMuX2Rpc2FibGVkSW5wdXRzLmxlbmd0aD50O3QrKylpZih0aGlzLl9kaXNhYmxlZElucHV0c1t0XT09PWUpcmV0dXJuITA7cmV0dXJuITF9LF9nZXRJbnN0OmZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gZS5kYXRhKHQsXCJkYXRlcGlja2VyXCIpfWNhdGNoKGkpe3Rocm93XCJNaXNzaW5nIGluc3RhbmNlIGRhdGEgZm9yIHRoaXMgZGF0ZXBpY2tlclwifX0sX29wdGlvbkRhdGVwaWNrZXI6ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGEsbyxoLGw9dGhpcy5fZ2V0SW5zdCh0KTtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJlwic3RyaW5nXCI9PXR5cGVvZiBpP1wiZGVmYXVsdHNcIj09PWk/ZS5leHRlbmQoe30sZS5kYXRlcGlja2VyLl9kZWZhdWx0cyk6bD9cImFsbFwiPT09aT9lLmV4dGVuZCh7fSxsLnNldHRpbmdzKTp0aGlzLl9nZXQobCxpKTpudWxsOihuPWl8fHt9LFwic3RyaW5nXCI9PXR5cGVvZiBpJiYobj17fSxuW2ldPXMpLGwmJih0aGlzLl9jdXJJbnN0PT09bCYmdGhpcy5faGlkZURhdGVwaWNrZXIoKSxhPXRoaXMuX2dldERhdGVEYXRlcGlja2VyKHQsITApLG89dGhpcy5fZ2V0TWluTWF4RGF0ZShsLFwibWluXCIpLGg9dGhpcy5fZ2V0TWluTWF4RGF0ZShsLFwibWF4XCIpLHIobC5zZXR0aW5ncyxuKSxudWxsIT09byYmdm9pZCAwIT09bi5kYXRlRm9ybWF0JiZ2b2lkIDA9PT1uLm1pbkRhdGUmJihsLnNldHRpbmdzLm1pbkRhdGU9dGhpcy5fZm9ybWF0RGF0ZShsLG8pKSxudWxsIT09aCYmdm9pZCAwIT09bi5kYXRlRm9ybWF0JiZ2b2lkIDA9PT1uLm1heERhdGUmJihsLnNldHRpbmdzLm1heERhdGU9dGhpcy5fZm9ybWF0RGF0ZShsLGgpKSxcImRpc2FibGVkXCJpbiBuJiYobi5kaXNhYmxlZD90aGlzLl9kaXNhYmxlRGF0ZXBpY2tlcih0KTp0aGlzLl9lbmFibGVEYXRlcGlja2VyKHQpKSx0aGlzLl9hdHRhY2htZW50cyhlKHQpLGwpLHRoaXMuX2F1dG9TaXplKGwpLHRoaXMuX3NldERhdGUobCxhKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUobCksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihsKSksdm9pZCAwKX0sX2NoYW5nZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSx0LGkpe3RoaXMuX29wdGlvbkRhdGVwaWNrZXIoZSx0LGkpfSxfcmVmcmVzaERhdGVwaWNrZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0SW5zdChlKTt0JiZ0aGlzLl91cGRhdGVEYXRlcGlja2VyKHQpfSxfc2V0RGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLl9nZXRJbnN0KGUpO2kmJih0aGlzLl9zZXREYXRlKGksdCksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoaSkpfSxfZ2V0RGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLl9nZXRJbnN0KGUpO3JldHVybiBpJiYhaS5pbmxpbmUmJnRoaXMuX3NldERhdGVGcm9tRmllbGQoaSx0KSxpP3RoaXMuX2dldERhdGUoaSk6bnVsbH0sX2RvS2V5RG93bjpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYT1lLmRhdGVwaWNrZXIuX2dldEluc3QodC50YXJnZXQpLG89ITAscj1hLmRwRGl2LmlzKFwiLnVpLWRhdGVwaWNrZXItcnRsXCIpO2lmKGEuX2tleUV2ZW50PSEwLGUuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcpc3dpdGNoKHQua2V5Q29kZSl7Y2FzZSA5OmUuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKSxvPSExO2JyZWFrO2Nhc2UgMTM6cmV0dXJuIG49ZShcInRkLlwiK2UuZGF0ZXBpY2tlci5fZGF5T3ZlckNsYXNzK1wiOm5vdCguXCIrZS5kYXRlcGlja2VyLl9jdXJyZW50Q2xhc3MrXCIpXCIsYS5kcERpdiksblswXSYmZS5kYXRlcGlja2VyLl9zZWxlY3REYXkodC50YXJnZXQsYS5zZWxlY3RlZE1vbnRoLGEuc2VsZWN0ZWRZZWFyLG5bMF0pLGk9ZS5kYXRlcGlja2VyLl9nZXQoYSxcIm9uU2VsZWN0XCIpLGk/KHM9ZS5kYXRlcGlja2VyLl9mb3JtYXREYXRlKGEpLGkuYXBwbHkoYS5pbnB1dD9hLmlucHV0WzBdOm51bGwsW3MsYV0pKTplLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksITE7Y2FzZSAyNzplLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk7YnJlYWs7Y2FzZSAzMzplLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQsdC5jdHJsS2V5Py1lLmRhdGVwaWNrZXIuX2dldChhLFwic3RlcEJpZ01vbnRoc1wiKTotZS5kYXRlcGlja2VyLl9nZXQoYSxcInN0ZXBNb250aHNcIiksXCJNXCIpO2JyZWFrO2Nhc2UgMzQ6ZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHQudGFyZ2V0LHQuY3RybEtleT8rZS5kYXRlcGlja2VyLl9nZXQoYSxcInN0ZXBCaWdNb250aHNcIik6K2UuZGF0ZXBpY2tlci5fZ2V0KGEsXCJzdGVwTW9udGhzXCIpLFwiTVwiKTticmVhaztjYXNlIDM1Oih0LmN0cmxLZXl8fHQubWV0YUtleSkmJmUuZGF0ZXBpY2tlci5fY2xlYXJEYXRlKHQudGFyZ2V0KSxvPXQuY3RybEtleXx8dC5tZXRhS2V5O2JyZWFrO2Nhc2UgMzY6KHQuY3RybEtleXx8dC5tZXRhS2V5KSYmZS5kYXRlcGlja2VyLl9nb3RvVG9kYXkodC50YXJnZXQpLG89dC5jdHJsS2V5fHx0Lm1ldGFLZXk7YnJlYWs7Y2FzZSAzNzoodC5jdHJsS2V5fHx0Lm1ldGFLZXkpJiZlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQscj8xOi0xLFwiRFwiKSxvPXQuY3RybEtleXx8dC5tZXRhS2V5LHQub3JpZ2luYWxFdmVudC5hbHRLZXkmJmUuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZSh0LnRhcmdldCx0LmN0cmxLZXk/LWUuZGF0ZXBpY2tlci5fZ2V0KGEsXCJzdGVwQmlnTW9udGhzXCIpOi1lLmRhdGVwaWNrZXIuX2dldChhLFwic3RlcE1vbnRoc1wiKSxcIk1cIik7YnJlYWs7Y2FzZSAzODoodC5jdHJsS2V5fHx0Lm1ldGFLZXkpJiZlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQsLTcsXCJEXCIpLG89dC5jdHJsS2V5fHx0Lm1ldGFLZXk7YnJlYWs7Y2FzZSAzOToodC5jdHJsS2V5fHx0Lm1ldGFLZXkpJiZlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQscj8tMToxLFwiRFwiKSxvPXQuY3RybEtleXx8dC5tZXRhS2V5LHQub3JpZ2luYWxFdmVudC5hbHRLZXkmJmUuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZSh0LnRhcmdldCx0LmN0cmxLZXk/K2UuZGF0ZXBpY2tlci5fZ2V0KGEsXCJzdGVwQmlnTW9udGhzXCIpOitlLmRhdGVwaWNrZXIuX2dldChhLFwic3RlcE1vbnRoc1wiKSxcIk1cIik7YnJlYWs7Y2FzZSA0MDoodC5jdHJsS2V5fHx0Lm1ldGFLZXkpJiZlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQsNyxcIkRcIiksbz10LmN0cmxLZXl8fHQubWV0YUtleTticmVhaztkZWZhdWx0Om89ITF9ZWxzZSAzNj09PXQua2V5Q29kZSYmdC5jdHJsS2V5P2UuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIodGhpcyk6bz0hMTtvJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfSxfZG9LZXlQcmVzczpmdW5jdGlvbih0KXt2YXIgaSxzLG49ZS5kYXRlcGlja2VyLl9nZXRJbnN0KHQudGFyZ2V0KTtcbnJldHVybiBlLmRhdGVwaWNrZXIuX2dldChuLFwiY29uc3RyYWluSW5wdXRcIik/KGk9ZS5kYXRlcGlja2VyLl9wb3NzaWJsZUNoYXJzKGUuZGF0ZXBpY2tlci5fZ2V0KG4sXCJkYXRlRm9ybWF0XCIpKSxzPVN0cmluZy5mcm9tQ2hhckNvZGUobnVsbD09dC5jaGFyQ29kZT90LmtleUNvZGU6dC5jaGFyQ29kZSksdC5jdHJsS2V5fHx0Lm1ldGFLZXl8fFwiIFwiPnN8fCFpfHxpLmluZGV4T2Yocyk+LTEpOnZvaWQgMH0sX2RvS2V5VXA6ZnVuY3Rpb24odCl7dmFyIGkscz1lLmRhdGVwaWNrZXIuX2dldEluc3QodC50YXJnZXQpO2lmKHMuaW5wdXQudmFsKCkhPT1zLmxhc3RWYWwpdHJ5e2k9ZS5kYXRlcGlja2VyLnBhcnNlRGF0ZShlLmRhdGVwaWNrZXIuX2dldChzLFwiZGF0ZUZvcm1hdFwiKSxzLmlucHV0P3MuaW5wdXQudmFsKCk6bnVsbCxlLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyhzKSksaSYmKGUuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZChzKSxlLmRhdGVwaWNrZXIuX3VwZGF0ZUFsdGVybmF0ZShzKSxlLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIocykpfWNhdGNoKG4pe31yZXR1cm4hMH0sX3Nob3dEYXRlcGlja2VyOmZ1bmN0aW9uKHQpe2lmKHQ9dC50YXJnZXR8fHQsXCJpbnB1dFwiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYodD1lKFwiaW5wdXRcIix0LnBhcmVudE5vZGUpWzBdKSwhZS5kYXRlcGlja2VyLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcih0KSYmZS5kYXRlcGlja2VyLl9sYXN0SW5wdXQhPT10KXt2YXIgaSxuLGEsbyxoLGwsdTtpPWUuZGF0ZXBpY2tlci5fZ2V0SW5zdCh0KSxlLmRhdGVwaWNrZXIuX2N1ckluc3QmJmUuZGF0ZXBpY2tlci5fY3VySW5zdCE9PWkmJihlLmRhdGVwaWNrZXIuX2N1ckluc3QuZHBEaXYuc3RvcCghMCwhMCksaSYmZS5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmZS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcihlLmRhdGVwaWNrZXIuX2N1ckluc3QuaW5wdXRbMF0pKSxuPWUuZGF0ZXBpY2tlci5fZ2V0KGksXCJiZWZvcmVTaG93XCIpLGE9bj9uLmFwcGx5KHQsW3QsaV0pOnt9LGEhPT0hMSYmKHIoaS5zZXR0aW5ncyxhKSxpLmxhc3RWYWw9bnVsbCxlLmRhdGVwaWNrZXIuX2xhc3RJbnB1dD10LGUuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZChpKSxlLmRhdGVwaWNrZXIuX2luRGlhbG9nJiYodC52YWx1ZT1cIlwiKSxlLmRhdGVwaWNrZXIuX3Bvc3x8KGUuZGF0ZXBpY2tlci5fcG9zPWUuZGF0ZXBpY2tlci5fZmluZFBvcyh0KSxlLmRhdGVwaWNrZXIuX3Bvc1sxXSs9dC5vZmZzZXRIZWlnaHQpLG89ITEsZSh0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe3JldHVybiBvfD1cImZpeGVkXCI9PT1lKHRoaXMpLmNzcyhcInBvc2l0aW9uXCIpLCFvfSksaD17bGVmdDplLmRhdGVwaWNrZXIuX3Bvc1swXSx0b3A6ZS5kYXRlcGlja2VyLl9wb3NbMV19LGUuZGF0ZXBpY2tlci5fcG9zPW51bGwsaS5kcERpdi5lbXB0eSgpLGkuZHBEaXYuY3NzKHtwb3NpdGlvbjpcImFic29sdXRlXCIsZGlzcGxheTpcImJsb2NrXCIsdG9wOlwiLTEwMDBweFwifSksZS5kYXRlcGlja2VyLl91cGRhdGVEYXRlcGlja2VyKGkpLGg9ZS5kYXRlcGlja2VyLl9jaGVja09mZnNldChpLGgsbyksaS5kcERpdi5jc3Moe3Bvc2l0aW9uOmUuZGF0ZXBpY2tlci5faW5EaWFsb2cmJmUuYmxvY2tVST9cInN0YXRpY1wiOm8/XCJmaXhlZFwiOlwiYWJzb2x1dGVcIixkaXNwbGF5Olwibm9uZVwiLGxlZnQ6aC5sZWZ0K1wicHhcIix0b3A6aC50b3ArXCJweFwifSksaS5pbmxpbmV8fChsPWUuZGF0ZXBpY2tlci5fZ2V0KGksXCJzaG93QW5pbVwiKSx1PWUuZGF0ZXBpY2tlci5fZ2V0KGksXCJkdXJhdGlvblwiKSxpLmRwRGl2LmNzcyhcInotaW5kZXhcIixzKGUodCkpKzEpLGUuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmc9ITAsZS5lZmZlY3RzJiZlLmVmZmVjdHMuZWZmZWN0W2xdP2kuZHBEaXYuc2hvdyhsLGUuZGF0ZXBpY2tlci5fZ2V0KGksXCJzaG93T3B0aW9uc1wiKSx1KTppLmRwRGl2W2x8fFwic2hvd1wiXShsP3U6bnVsbCksZS5kYXRlcGlja2VyLl9zaG91bGRGb2N1c0lucHV0KGkpJiZpLmlucHV0LmZvY3VzKCksZS5kYXRlcGlja2VyLl9jdXJJbnN0PWkpKX19LF91cGRhdGVEYXRlcGlja2VyOmZ1bmN0aW9uKHQpe3RoaXMubWF4Um93cz00LHY9dCx0LmRwRGl2LmVtcHR5KCkuYXBwZW5kKHRoaXMuX2dlbmVyYXRlSFRNTCh0KSksdGhpcy5fYXR0YWNoSGFuZGxlcnModCk7dmFyIGkscz10aGlzLl9nZXROdW1iZXJPZk1vbnRocyh0KSxuPXNbMV0sYT0xNyxyPXQuZHBEaXYuZmluZChcIi5cIit0aGlzLl9kYXlPdmVyQ2xhc3MrXCIgYVwiKTtyLmxlbmd0aD4wJiZvLmFwcGx5KHIuZ2V0KDApKSx0LmRwRGl2LnJlbW92ZUNsYXNzKFwidWktZGF0ZXBpY2tlci1tdWx0aS0yIHVpLWRhdGVwaWNrZXItbXVsdGktMyB1aS1kYXRlcGlja2VyLW11bHRpLTRcIikud2lkdGgoXCJcIiksbj4xJiZ0LmRwRGl2LmFkZENsYXNzKFwidWktZGF0ZXBpY2tlci1tdWx0aS1cIituKS5jc3MoXCJ3aWR0aFwiLGEqbitcImVtXCIpLHQuZHBEaXZbKDEhPT1zWzBdfHwxIT09c1sxXT9cImFkZFwiOlwicmVtb3ZlXCIpK1wiQ2xhc3NcIl0oXCJ1aS1kYXRlcGlja2VyLW11bHRpXCIpLHQuZHBEaXZbKHRoaXMuX2dldCh0LFwiaXNSVExcIik/XCJhZGRcIjpcInJlbW92ZVwiKStcIkNsYXNzXCJdKFwidWktZGF0ZXBpY2tlci1ydGxcIiksdD09PWUuZGF0ZXBpY2tlci5fY3VySW5zdCYmZS5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmZS5kYXRlcGlja2VyLl9zaG91bGRGb2N1c0lucHV0KHQpJiZ0LmlucHV0LmZvY3VzKCksdC55ZWFyc2h0bWwmJihpPXQueWVhcnNodG1sLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPT09dC55ZWFyc2h0bWwmJnQueWVhcnNodG1sJiZ0LmRwRGl2LmZpbmQoXCJzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyOmZpcnN0XCIpLnJlcGxhY2VXaXRoKHQueWVhcnNodG1sKSxpPXQueWVhcnNodG1sPW51bGx9LDApKX0sX3Nob3VsZEZvY3VzSW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5wdXQmJmUuaW5wdXQuaXMoXCI6dmlzaWJsZVwiKSYmIWUuaW5wdXQuaXMoXCI6ZGlzYWJsZWRcIikmJiFlLmlucHV0LmlzKFwiOmZvY3VzXCIpfSxfY2hlY2tPZmZzZXQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPXQuZHBEaXYub3V0ZXJXaWR0aCgpLGE9dC5kcERpdi5vdXRlckhlaWdodCgpLG89dC5pbnB1dD90LmlucHV0Lm91dGVyV2lkdGgoKTowLHI9dC5pbnB1dD90LmlucHV0Lm91dGVySGVpZ2h0KCk6MCxoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCsocz8wOmUoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSksbD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KyhzPzA6ZShkb2N1bWVudCkuc2Nyb2xsVG9wKCkpO3JldHVybiBpLmxlZnQtPXRoaXMuX2dldCh0LFwiaXNSVExcIik/bi1vOjAsaS5sZWZ0LT1zJiZpLmxlZnQ9PT10LmlucHV0Lm9mZnNldCgpLmxlZnQ/ZShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpOjAsaS50b3AtPXMmJmkudG9wPT09dC5pbnB1dC5vZmZzZXQoKS50b3Arcj9lKGRvY3VtZW50KS5zY3JvbGxUb3AoKTowLGkubGVmdC09TWF0aC5taW4oaS5sZWZ0LGkubGVmdCtuPmgmJmg+bj9NYXRoLmFicyhpLmxlZnQrbi1oKTowKSxpLnRvcC09TWF0aC5taW4oaS50b3AsaS50b3ArYT5sJiZsPmE/TWF0aC5hYnMoYStyKTowKSxpfSxfZmluZFBvczpmdW5jdGlvbih0KXtmb3IodmFyIGkscz10aGlzLl9nZXRJbnN0KHQpLG49dGhpcy5fZ2V0KHMsXCJpc1JUTFwiKTt0JiYoXCJoaWRkZW5cIj09PXQudHlwZXx8MSE9PXQubm9kZVR5cGV8fGUuZXhwci5maWx0ZXJzLmhpZGRlbih0KSk7KXQ9dFtuP1wicHJldmlvdXNTaWJsaW5nXCI6XCJuZXh0U2libGluZ1wiXTtyZXR1cm4gaT1lKHQpLm9mZnNldCgpLFtpLmxlZnQsaS50b3BdfSxfaGlkZURhdGVwaWNrZXI6ZnVuY3Rpb24odCl7dmFyIGkscyxuLGEsbz10aGlzLl9jdXJJbnN0OyFvfHx0JiZvIT09ZS5kYXRhKHQsXCJkYXRlcGlja2VyXCIpfHx0aGlzLl9kYXRlcGlja2VyU2hvd2luZyYmKGk9dGhpcy5fZ2V0KG8sXCJzaG93QW5pbVwiKSxzPXRoaXMuX2dldChvLFwiZHVyYXRpb25cIiksbj1mdW5jdGlvbigpe2UuZGF0ZXBpY2tlci5fdGlkeURpYWxvZyhvKX0sZS5lZmZlY3RzJiYoZS5lZmZlY3RzLmVmZmVjdFtpXXx8ZS5lZmZlY3RzW2ldKT9vLmRwRGl2LmhpZGUoaSxlLmRhdGVwaWNrZXIuX2dldChvLFwic2hvd09wdGlvbnNcIikscyxuKTpvLmRwRGl2W1wic2xpZGVEb3duXCI9PT1pP1wic2xpZGVVcFwiOlwiZmFkZUluXCI9PT1pP1wiZmFkZU91dFwiOlwiaGlkZVwiXShpP3M6bnVsbCxuKSxpfHxuKCksdGhpcy5fZGF0ZXBpY2tlclNob3dpbmc9ITEsYT10aGlzLl9nZXQobyxcIm9uQ2xvc2VcIiksYSYmYS5hcHBseShvLmlucHV0P28uaW5wdXRbMF06bnVsbCxbby5pbnB1dD9vLmlucHV0LnZhbCgpOlwiXCIsb10pLHRoaXMuX2xhc3RJbnB1dD1udWxsLHRoaXMuX2luRGlhbG9nJiYodGhpcy5fZGlhbG9nSW5wdXQuY3NzKHtwb3NpdGlvbjpcImFic29sdXRlXCIsbGVmdDpcIjBcIix0b3A6XCItMTAwcHhcIn0pLGUuYmxvY2tVSSYmKGUudW5ibG9ja1VJKCksZShcImJvZHlcIikuYXBwZW5kKHRoaXMuZHBEaXYpKSksdGhpcy5faW5EaWFsb2c9ITEpfSxfdGlkeURpYWxvZzpmdW5jdGlvbihlKXtlLmRwRGl2LnJlbW92ZUNsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKS51bmJpbmQoXCIudWktZGF0ZXBpY2tlci1jYWxlbmRhclwiKX0sX2NoZWNrRXh0ZXJuYWxDbGljazpmdW5jdGlvbih0KXtpZihlLmRhdGVwaWNrZXIuX2N1ckluc3Qpe3ZhciBpPWUodC50YXJnZXQpLHM9ZS5kYXRlcGlja2VyLl9nZXRJbnN0KGlbMF0pOyhpWzBdLmlkIT09ZS5kYXRlcGlja2VyLl9tYWluRGl2SWQmJjA9PT1pLnBhcmVudHMoXCIjXCIrZS5kYXRlcGlja2VyLl9tYWluRGl2SWQpLmxlbmd0aCYmIWkuaGFzQ2xhc3MoZS5kYXRlcGlja2VyLm1hcmtlckNsYXNzTmFtZSkmJiFpLmNsb3Nlc3QoXCIuXCIrZS5kYXRlcGlja2VyLl90cmlnZ2VyQ2xhc3MpLmxlbmd0aCYmZS5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmKCFlLmRhdGVwaWNrZXIuX2luRGlhbG9nfHwhZS5ibG9ja1VJKXx8aS5oYXNDbGFzcyhlLmRhdGVwaWNrZXIubWFya2VyQ2xhc3NOYW1lKSYmZS5kYXRlcGlja2VyLl9jdXJJbnN0IT09cykmJmUuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKX19LF9hZGp1c3REYXRlOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1lKHQpLGE9dGhpcy5fZ2V0SW5zdChuWzBdKTt0aGlzLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihuWzBdKXx8KHRoaXMuX2FkanVzdEluc3REYXRlKGEsaSsoXCJNXCI9PT1zP3RoaXMuX2dldChhLFwic2hvd0N1cnJlbnRBdFBvc1wiKTowKSxzKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGEpKX0sX2dvdG9Ub2RheTpmdW5jdGlvbih0KXt2YXIgaSxzPWUodCksbj10aGlzLl9nZXRJbnN0KHNbMF0pO3RoaXMuX2dldChuLFwiZ290b0N1cnJlbnRcIikmJm4uY3VycmVudERheT8obi5zZWxlY3RlZERheT1uLmN1cnJlbnREYXksbi5kcmF3TW9udGg9bi5zZWxlY3RlZE1vbnRoPW4uY3VycmVudE1vbnRoLG4uZHJhd1llYXI9bi5zZWxlY3RlZFllYXI9bi5jdXJyZW50WWVhcik6KGk9bmV3IERhdGUsbi5zZWxlY3RlZERheT1pLmdldERhdGUoKSxuLmRyYXdNb250aD1uLnNlbGVjdGVkTW9udGg9aS5nZXRNb250aCgpLG4uZHJhd1llYXI9bi5zZWxlY3RlZFllYXI9aS5nZXRGdWxsWWVhcigpKSx0aGlzLl9ub3RpZnlDaGFuZ2UobiksdGhpcy5fYWRqdXN0RGF0ZShzKX0sX3NlbGVjdE1vbnRoWWVhcjpmdW5jdGlvbih0LGkscyl7dmFyIG49ZSh0KSxhPXRoaXMuX2dldEluc3QoblswXSk7YVtcInNlbGVjdGVkXCIrKFwiTVwiPT09cz9cIk1vbnRoXCI6XCJZZWFyXCIpXT1hW1wiZHJhd1wiKyhcIk1cIj09PXM/XCJNb250aFwiOlwiWWVhclwiKV09cGFyc2VJbnQoaS5vcHRpb25zW2kuc2VsZWN0ZWRJbmRleF0udmFsdWUsMTApLHRoaXMuX25vdGlmeUNoYW5nZShhKSx0aGlzLl9hZGp1c3REYXRlKG4pfSxfc2VsZWN0RGF5OmZ1bmN0aW9uKHQsaSxzLG4pe3ZhciBhLG89ZSh0KTtlKG4pLmhhc0NsYXNzKHRoaXMuX3Vuc2VsZWN0YWJsZUNsYXNzKXx8dGhpcy5faXNEaXNhYmxlZERhdGVwaWNrZXIob1swXSl8fChhPXRoaXMuX2dldEluc3Qob1swXSksYS5zZWxlY3RlZERheT1hLmN1cnJlbnREYXk9ZShcImFcIixuKS5odG1sKCksYS5zZWxlY3RlZE1vbnRoPWEuY3VycmVudE1vbnRoPWksYS5zZWxlY3RlZFllYXI9YS5jdXJyZW50WWVhcj1zLHRoaXMuX3NlbGVjdERhdGUodCx0aGlzLl9mb3JtYXREYXRlKGEsYS5jdXJyZW50RGF5LGEuY3VycmVudE1vbnRoLGEuY3VycmVudFllYXIpKSl9LF9jbGVhckRhdGU6ZnVuY3Rpb24odCl7dmFyIGk9ZSh0KTt0aGlzLl9zZWxlY3REYXRlKGksXCJcIil9LF9zZWxlY3REYXRlOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbj1lKHQpLGE9dGhpcy5fZ2V0SW5zdChuWzBdKTtpPW51bGwhPWk/aTp0aGlzLl9mb3JtYXREYXRlKGEpLGEuaW5wdXQmJmEuaW5wdXQudmFsKGkpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShhKSxzPXRoaXMuX2dldChhLFwib25TZWxlY3RcIikscz9zLmFwcGx5KGEuaW5wdXQ/YS5pbnB1dFswXTpudWxsLFtpLGFdKTphLmlucHV0JiZhLmlucHV0LnRyaWdnZXIoXCJjaGFuZ2VcIiksYS5pbmxpbmU/dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihhKToodGhpcy5faGlkZURhdGVwaWNrZXIoKSx0aGlzLl9sYXN0SW5wdXQ9YS5pbnB1dFswXSxcIm9iamVjdFwiIT10eXBlb2YgYS5pbnB1dFswXSYmYS5pbnB1dC5mb2N1cygpLHRoaXMuX2xhc3RJbnB1dD1udWxsKX0sX3VwZGF0ZUFsdGVybmF0ZTpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYT10aGlzLl9nZXQodCxcImFsdEZpZWxkXCIpO2EmJihpPXRoaXMuX2dldCh0LFwiYWx0Rm9ybWF0XCIpfHx0aGlzLl9nZXQodCxcImRhdGVGb3JtYXRcIikscz10aGlzLl9nZXREYXRlKHQpLG49dGhpcy5mb3JtYXREYXRlKGkscyx0aGlzLl9nZXRGb3JtYXRDb25maWcodCkpLGUoYSkuZWFjaChmdW5jdGlvbigpe2UodGhpcykudmFsKG4pfSkpfSxub1dlZWtlbmRzOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0RGF5KCk7cmV0dXJuW3Q+MCYmNj50LFwiXCJdfSxpc284NjAxV2VlazpmdW5jdGlvbihlKXt2YXIgdCxpPW5ldyBEYXRlKGUuZ2V0VGltZSgpKTtyZXR1cm4gaS5zZXREYXRlKGkuZ2V0RGF0ZSgpKzQtKGkuZ2V0RGF5KCl8fDcpKSx0PWkuZ2V0VGltZSgpLGkuc2V0TW9udGgoMCksaS5zZXREYXRlKDEpLE1hdGguZmxvb3IoTWF0aC5yb3VuZCgodC1pKS84NjRlNSkvNykrMX0scGFyc2VEYXRlOmZ1bmN0aW9uKHQsaSxzKXtpZihudWxsPT10fHxudWxsPT1pKXRocm93XCJJbnZhbGlkIGFyZ3VtZW50c1wiO2lmKGk9XCJvYmplY3RcIj09dHlwZW9mIGk/XCJcIitpOmkrXCJcIixcIlwiPT09aSlyZXR1cm4gbnVsbDt2YXIgbixhLG8scixoPTAsbD0ocz9zLnNob3J0WWVhckN1dG9mZjpudWxsKXx8dGhpcy5fZGVmYXVsdHMuc2hvcnRZZWFyQ3V0b2ZmLHU9XCJzdHJpbmdcIiE9dHlwZW9mIGw/bDoobmV3IERhdGUpLmdldEZ1bGxZZWFyKCklMTAwK3BhcnNlSW50KGwsMTApLGQ9KHM/cy5kYXlOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lc1Nob3J0LGM9KHM/cy5kYXlOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXMscD0ocz9zLm1vbnRoTmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lc1Nob3J0LGY9KHM/cy5tb250aE5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzLG09LTEsZz0tMSx2PS0xLHk9LTEsYj0hMSxfPWZ1bmN0aW9uKGUpe3ZhciBpPXQubGVuZ3RoPm4rMSYmdC5jaGFyQXQobisxKT09PWU7cmV0dXJuIGkmJm4rKyxpfSx4PWZ1bmN0aW9uKGUpe3ZhciB0PV8oZSkscz1cIkBcIj09PWU/MTQ6XCIhXCI9PT1lPzIwOlwieVwiPT09ZSYmdD80Olwib1wiPT09ZT8zOjIsbj1cInlcIj09PWU/czoxLGE9UmVnRXhwKFwiXlxcXFxke1wiK24rXCIsXCIrcytcIn1cIiksbz1pLnN1YnN0cmluZyhoKS5tYXRjaChhKTtpZighbyl0aHJvd1wiTWlzc2luZyBudW1iZXIgYXQgcG9zaXRpb24gXCIraDtyZXR1cm4gaCs9b1swXS5sZW5ndGgscGFyc2VJbnQob1swXSwxMCl9LHc9ZnVuY3Rpb24odCxzLG4pe3ZhciBhPS0xLG89ZS5tYXAoXyh0KT9uOnMsZnVuY3Rpb24oZSx0KXtyZXR1cm5bW3QsZV1dfSkuc29ydChmdW5jdGlvbihlLHQpe3JldHVybi0oZVsxXS5sZW5ndGgtdFsxXS5sZW5ndGgpfSk7aWYoZS5lYWNoKG8sZnVuY3Rpb24oZSx0KXt2YXIgcz10WzFdO3JldHVybiBpLnN1YnN0cihoLHMubGVuZ3RoKS50b0xvd2VyQ2FzZSgpPT09cy50b0xvd2VyQ2FzZSgpPyhhPXRbMF0saCs9cy5sZW5ndGgsITEpOnZvaWQgMH0pLC0xIT09YSlyZXR1cm4gYSsxO3Rocm93XCJVbmtub3duIG5hbWUgYXQgcG9zaXRpb24gXCIraH0saz1mdW5jdGlvbigpe2lmKGkuY2hhckF0KGgpIT09dC5jaGFyQXQobikpdGhyb3dcIlVuZXhwZWN0ZWQgbGl0ZXJhbCBhdCBwb3NpdGlvbiBcIitoO2grK307Zm9yKG49MDt0Lmxlbmd0aD5uO24rKylpZihiKVwiJ1wiIT09dC5jaGFyQXQobil8fF8oXCInXCIpP2soKTpiPSExO2Vsc2Ugc3dpdGNoKHQuY2hhckF0KG4pKXtjYXNlXCJkXCI6dj14KFwiZFwiKTticmVhaztjYXNlXCJEXCI6dyhcIkRcIixkLGMpO2JyZWFrO2Nhc2VcIm9cIjp5PXgoXCJvXCIpO2JyZWFrO2Nhc2VcIm1cIjpnPXgoXCJtXCIpO2JyZWFrO2Nhc2VcIk1cIjpnPXcoXCJNXCIscCxmKTticmVhaztjYXNlXCJ5XCI6bT14KFwieVwiKTticmVhaztjYXNlXCJAXCI6cj1uZXcgRGF0ZSh4KFwiQFwiKSksbT1yLmdldEZ1bGxZZWFyKCksZz1yLmdldE1vbnRoKCkrMSx2PXIuZ2V0RGF0ZSgpO2JyZWFrO2Nhc2VcIiFcIjpyPW5ldyBEYXRlKCh4KFwiIVwiKS10aGlzLl90aWNrc1RvMTk3MCkvMWU0KSxtPXIuZ2V0RnVsbFllYXIoKSxnPXIuZ2V0TW9udGgoKSsxLHY9ci5nZXREYXRlKCk7YnJlYWs7Y2FzZVwiJ1wiOl8oXCInXCIpP2soKTpiPSEwO2JyZWFrO2RlZmF1bHQ6aygpfWlmKGkubGVuZ3RoPmgmJihvPWkuc3Vic3RyKGgpLCEvXlxccysvLnRlc3QobykpKXRocm93XCJFeHRyYS91bnBhcnNlZCBjaGFyYWN0ZXJzIGZvdW5kIGluIGRhdGU6IFwiK287aWYoLTE9PT1tP209KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpOjEwMD5tJiYobSs9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArKHU+PW0/MDotMTAwKSkseT4tMSlmb3IoZz0xLHY9eTs7KXtpZihhPXRoaXMuX2dldERheXNJbk1vbnRoKG0sZy0xKSxhPj12KWJyZWFrO2crKyx2LT1hfWlmKHI9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobSxnLTEsdikpLHIuZ2V0RnVsbFllYXIoKSE9PW18fHIuZ2V0TW9udGgoKSsxIT09Z3x8ci5nZXREYXRlKCkhPT12KXRocm93XCJJbnZhbGlkIGRhdGVcIjtyZXR1cm4gcn0sQVRPTTpcInl5LW1tLWRkXCIsQ09PS0lFOlwiRCwgZGQgTSB5eVwiLElTT184NjAxOlwieXktbW0tZGRcIixSRkNfODIyOlwiRCwgZCBNIHlcIixSRkNfODUwOlwiREQsIGRkLU0teVwiLFJGQ18xMDM2OlwiRCwgZCBNIHlcIixSRkNfMTEyMzpcIkQsIGQgTSB5eVwiLFJGQ18yODIyOlwiRCwgZCBNIHl5XCIsUlNTOlwiRCwgZCBNIHlcIixUSUNLUzpcIiFcIixUSU1FU1RBTVA6XCJAXCIsVzNDOlwieXktbW0tZGRcIixfdGlja3NUbzE5NzA6MWU3KjYwKjYwKjI0Kig3MTg2ODUrTWF0aC5mbG9vcig0OTIuNSktTWF0aC5mbG9vcigxOS43KStNYXRoLmZsb29yKDQuOTI1KSksZm9ybWF0RGF0ZTpmdW5jdGlvbihlLHQsaSl7aWYoIXQpcmV0dXJuXCJcIjt2YXIgcyxuPShpP2kuZGF5TmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCxhPShpP2kuZGF5TmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLG89KGk/aS5tb250aE5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydCxyPShpP2kubW9udGhOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcyxoPWZ1bmN0aW9uKHQpe3ZhciBpPWUubGVuZ3RoPnMrMSYmZS5jaGFyQXQocysxKT09PXQ7cmV0dXJuIGkmJnMrKyxpfSxsPWZ1bmN0aW9uKGUsdCxpKXt2YXIgcz1cIlwiK3Q7aWYoaChlKSlmb3IoO2k+cy5sZW5ndGg7KXM9XCIwXCIrcztyZXR1cm4gc30sdT1mdW5jdGlvbihlLHQsaSxzKXtyZXR1cm4gaChlKT9zW3RdOmlbdF19LGQ9XCJcIixjPSExO2lmKHQpZm9yKHM9MDtlLmxlbmd0aD5zO3MrKylpZihjKVwiJ1wiIT09ZS5jaGFyQXQocyl8fGgoXCInXCIpP2QrPWUuY2hhckF0KHMpOmM9ITE7ZWxzZSBzd2l0Y2goZS5jaGFyQXQocykpe2Nhc2VcImRcIjpkKz1sKFwiZFwiLHQuZ2V0RGF0ZSgpLDIpO2JyZWFrO2Nhc2VcIkRcIjpkKz11KFwiRFwiLHQuZ2V0RGF5KCksbixhKTticmVhaztjYXNlXCJvXCI6ZCs9bChcIm9cIixNYXRoLnJvdW5kKChuZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksdC5nZXRNb250aCgpLHQuZ2V0RGF0ZSgpKS5nZXRUaW1lKCktbmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDAsMCkuZ2V0VGltZSgpKS84NjRlNSksMyk7YnJlYWs7Y2FzZVwibVwiOmQrPWwoXCJtXCIsdC5nZXRNb250aCgpKzEsMik7YnJlYWs7Y2FzZVwiTVwiOmQrPXUoXCJNXCIsdC5nZXRNb250aCgpLG8scik7YnJlYWs7Y2FzZVwieVwiOmQrPWgoXCJ5XCIpP3QuZ2V0RnVsbFllYXIoKTooMTA+dC5nZXRZZWFyKCklMTAwP1wiMFwiOlwiXCIpK3QuZ2V0WWVhcigpJTEwMDticmVhaztjYXNlXCJAXCI6ZCs9dC5nZXRUaW1lKCk7YnJlYWs7Y2FzZVwiIVwiOmQrPTFlNCp0LmdldFRpbWUoKSt0aGlzLl90aWNrc1RvMTk3MDticmVhaztjYXNlXCInXCI6aChcIidcIik/ZCs9XCInXCI6Yz0hMDticmVhaztkZWZhdWx0OmQrPWUuY2hhckF0KHMpfXJldHVybiBkfSxfcG9zc2libGVDaGFyczpmdW5jdGlvbihlKXt2YXIgdCxpPVwiXCIscz0hMSxuPWZ1bmN0aW9uKGkpe3ZhciBzPWUubGVuZ3RoPnQrMSYmZS5jaGFyQXQodCsxKT09PWk7cmV0dXJuIHMmJnQrKyxzfTtmb3IodD0wO2UubGVuZ3RoPnQ7dCsrKWlmKHMpXCInXCIhPT1lLmNoYXJBdCh0KXx8bihcIidcIik/aSs9ZS5jaGFyQXQodCk6cz0hMTtlbHNlIHN3aXRjaChlLmNoYXJBdCh0KSl7Y2FzZVwiZFwiOmNhc2VcIm1cIjpjYXNlXCJ5XCI6Y2FzZVwiQFwiOmkrPVwiMDEyMzQ1Njc4OVwiO2JyZWFrO2Nhc2VcIkRcIjpjYXNlXCJNXCI6cmV0dXJuIG51bGw7Y2FzZVwiJ1wiOm4oXCInXCIpP2krPVwiJ1wiOnM9ITA7YnJlYWs7ZGVmYXVsdDppKz1lLmNoYXJBdCh0KX1yZXR1cm4gaX0sX2dldDpmdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDAhPT1lLnNldHRpbmdzW3RdP2Uuc2V0dGluZ3NbdF06dGhpcy5fZGVmYXVsdHNbdF19LF9zZXREYXRlRnJvbUZpZWxkOmZ1bmN0aW9uKGUsdCl7aWYoZS5pbnB1dC52YWwoKSE9PWUubGFzdFZhbCl7dmFyIGk9dGhpcy5fZ2V0KGUsXCJkYXRlRm9ybWF0XCIpLHM9ZS5sYXN0VmFsPWUuaW5wdXQ/ZS5pbnB1dC52YWwoKTpudWxsLG49dGhpcy5fZ2V0RGVmYXVsdERhdGUoZSksYT1uLG89dGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpO3RyeXthPXRoaXMucGFyc2VEYXRlKGkscyxvKXx8bn1jYXRjaChyKXtzPXQ/XCJcIjpzfWUuc2VsZWN0ZWREYXk9YS5nZXREYXRlKCksZS5kcmF3TW9udGg9ZS5zZWxlY3RlZE1vbnRoPWEuZ2V0TW9udGgoKSxlLmRyYXdZZWFyPWUuc2VsZWN0ZWRZZWFyPWEuZ2V0RnVsbFllYXIoKSxlLmN1cnJlbnREYXk9cz9hLmdldERhdGUoKTowLGUuY3VycmVudE1vbnRoPXM/YS5nZXRNb250aCgpOjAsZS5jdXJyZW50WWVhcj1zP2EuZ2V0RnVsbFllYXIoKTowLHRoaXMuX2FkanVzdEluc3REYXRlKGUpfX0sX2dldERlZmF1bHREYXRlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9yZXN0cmljdE1pbk1heChlLHRoaXMuX2RldGVybWluZURhdGUoZSx0aGlzLl9nZXQoZSxcImRlZmF1bHREYXRlXCIpLG5ldyBEYXRlKSl9LF9kZXRlcm1pbmVEYXRlOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1mdW5jdGlvbihlKXt2YXIgdD1uZXcgRGF0ZTtyZXR1cm4gdC5zZXREYXRlKHQuZ2V0RGF0ZSgpK2UpLHR9LGE9ZnVuY3Rpb24oaSl7dHJ5e3JldHVybiBlLmRhdGVwaWNrZXIucGFyc2VEYXRlKGUuZGF0ZXBpY2tlci5fZ2V0KHQsXCJkYXRlRm9ybWF0XCIpLGksZS5kYXRlcGlja2VyLl9nZXRGb3JtYXRDb25maWcodCkpfWNhdGNoKHMpe31mb3IodmFyIG49KGkudG9Mb3dlckNhc2UoKS5tYXRjaCgvXmMvKT9lLmRhdGVwaWNrZXIuX2dldERhdGUodCk6bnVsbCl8fG5ldyBEYXRlLGE9bi5nZXRGdWxsWWVhcigpLG89bi5nZXRNb250aCgpLHI9bi5nZXREYXRlKCksaD0vKFsrXFwtXT9bMC05XSspXFxzKihkfER8d3xXfG18TXx5fFkpPy9nLGw9aC5leGVjKGkpO2w7KXtzd2l0Y2gobFsyXXx8XCJkXCIpe2Nhc2VcImRcIjpjYXNlXCJEXCI6cis9cGFyc2VJbnQobFsxXSwxMCk7YnJlYWs7Y2FzZVwid1wiOmNhc2VcIldcIjpyKz03KnBhcnNlSW50KGxbMV0sMTApO2JyZWFrO2Nhc2VcIm1cIjpjYXNlXCJNXCI6bys9cGFyc2VJbnQobFsxXSwxMCkscj1NYXRoLm1pbihyLGUuZGF0ZXBpY2tlci5fZ2V0RGF5c0luTW9udGgoYSxvKSk7YnJlYWs7Y2FzZVwieVwiOmNhc2VcIllcIjphKz1wYXJzZUludChsWzFdLDEwKSxyPU1hdGgubWluKHIsZS5kYXRlcGlja2VyLl9nZXREYXlzSW5Nb250aChhLG8pKX1sPWguZXhlYyhpKX1yZXR1cm4gbmV3IERhdGUoYSxvLHIpfSxvPW51bGw9PWl8fFwiXCI9PT1pP3M6XCJzdHJpbmdcIj09dHlwZW9mIGk/YShpKTpcIm51bWJlclwiPT10eXBlb2YgaT9pc05hTihpKT9zOm4oaSk6bmV3IERhdGUoaS5nZXRUaW1lKCkpO3JldHVybiBvPW8mJlwiSW52YWxpZCBEYXRlXCI9PVwiXCIrbz9zOm8sbyYmKG8uc2V0SG91cnMoMCksby5zZXRNaW51dGVzKDApLG8uc2V0U2Vjb25kcygwKSxvLnNldE1pbGxpc2Vjb25kcygwKSksdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3Qobyl9LF9kYXlsaWdodFNhdmluZ0FkanVzdDpmdW5jdGlvbihlKXtyZXR1cm4gZT8oZS5zZXRIb3VycyhlLmdldEhvdXJzKCk+MTI/ZS5nZXRIb3VycygpKzI6MCksZSk6bnVsbH0sX3NldERhdGU6ZnVuY3Rpb24oZSx0LGkpe3ZhciBzPSF0LG49ZS5zZWxlY3RlZE1vbnRoLGE9ZS5zZWxlY3RlZFllYXIsbz10aGlzLl9yZXN0cmljdE1pbk1heChlLHRoaXMuX2RldGVybWluZURhdGUoZSx0LG5ldyBEYXRlKSk7ZS5zZWxlY3RlZERheT1lLmN1cnJlbnREYXk9by5nZXREYXRlKCksZS5kcmF3TW9udGg9ZS5zZWxlY3RlZE1vbnRoPWUuY3VycmVudE1vbnRoPW8uZ2V0TW9udGgoKSxlLmRyYXdZZWFyPWUuc2VsZWN0ZWRZZWFyPWUuY3VycmVudFllYXI9by5nZXRGdWxsWWVhcigpLG49PT1lLnNlbGVjdGVkTW9udGgmJmE9PT1lLnNlbGVjdGVkWWVhcnx8aXx8dGhpcy5fbm90aWZ5Q2hhbmdlKGUpLHRoaXMuX2FkanVzdEluc3REYXRlKGUpLGUuaW5wdXQmJmUuaW5wdXQudmFsKHM/XCJcIjp0aGlzLl9mb3JtYXREYXRlKGUpKX0sX2dldERhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9IWUuY3VycmVudFllYXJ8fGUuaW5wdXQmJlwiXCI9PT1lLmlucHV0LnZhbCgpP251bGw6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZS5jdXJyZW50WWVhcixlLmN1cnJlbnRNb250aCxlLmN1cnJlbnREYXkpKTtyZXR1cm4gdH0sX2F0dGFjaEhhbmRsZXJzOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX2dldCh0LFwic3RlcE1vbnRoc1wiKSxzPVwiI1wiK3QuaWQucmVwbGFjZSgvXFxcXFxcXFwvZyxcIlxcXFxcIik7dC5kcERpdi5maW5kKFwiW2RhdGEtaGFuZGxlcl1cIikubWFwKGZ1bmN0aW9uKCl7dmFyIHQ9e3ByZXY6ZnVuY3Rpb24oKXtlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUocywtaSxcIk1cIil9LG5leHQ6ZnVuY3Rpb24oKXtlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUocywraSxcIk1cIil9LGhpZGU6ZnVuY3Rpb24oKXtlLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCl9LHRvZGF5OmZ1bmN0aW9uKCl7ZS5kYXRlcGlja2VyLl9nb3RvVG9kYXkocyl9LHNlbGVjdERheTpmdW5jdGlvbigpe3JldHVybiBlLmRhdGVwaWNrZXIuX3NlbGVjdERheShzLCt0aGlzLmdldEF0dHJpYnV0ZShcImRhdGEtbW9udGhcIiksK3RoaXMuZ2V0QXR0cmlidXRlKFwiZGF0YS15ZWFyXCIpLHRoaXMpLCExfSxzZWxlY3RNb250aDpmdW5jdGlvbigpe3JldHVybiBlLmRhdGVwaWNrZXIuX3NlbGVjdE1vbnRoWWVhcihzLHRoaXMsXCJNXCIpLCExfSxzZWxlY3RZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKHMsdGhpcyxcIllcIiksITF9fTtlKHRoaXMpLmJpbmQodGhpcy5nZXRBdHRyaWJ1dGUoXCJkYXRhLWV2ZW50XCIpLHRbdGhpcy5nZXRBdHRyaWJ1dGUoXCJkYXRhLWhhbmRsZXJcIildKX0pfSxfZ2VuZXJhdGVIVE1MOmZ1bmN0aW9uKGUpe3ZhciB0LGkscyxuLGEsbyxyLGgsbCx1LGQsYyxwLGYsbSxnLHYseSxiLF8seCx3LGssVCxELFMsTSxDLE4sQSxQLEksSCx6LEYsRSxPLGosVyxMPW5ldyBEYXRlLFI9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoTC5nZXRGdWxsWWVhcigpLEwuZ2V0TW9udGgoKSxMLmdldERhdGUoKSkpLFk9dGhpcy5fZ2V0KGUsXCJpc1JUTFwiKSxCPXRoaXMuX2dldChlLFwic2hvd0J1dHRvblBhbmVsXCIpLEo9dGhpcy5fZ2V0KGUsXCJoaWRlSWZOb1ByZXZOZXh0XCIpLHE9dGhpcy5fZ2V0KGUsXCJuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0XCIpLEs9dGhpcy5fZ2V0TnVtYmVyT2ZNb250aHMoZSksVj10aGlzLl9nZXQoZSxcInNob3dDdXJyZW50QXRQb3NcIiksVT10aGlzLl9nZXQoZSxcInN0ZXBNb250aHNcIiksUT0xIT09S1swXXx8MSE9PUtbMV0sRz10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChlLmN1cnJlbnREYXk/bmV3IERhdGUoZS5jdXJyZW50WWVhcixlLmN1cnJlbnRNb250aCxlLmN1cnJlbnREYXkpOm5ldyBEYXRlKDk5OTksOSw5KSksWD10aGlzLl9nZXRNaW5NYXhEYXRlKGUsXCJtaW5cIiksJD10aGlzLl9nZXRNaW5NYXhEYXRlKGUsXCJtYXhcIiksWj1lLmRyYXdNb250aC1WLGV0PWUuZHJhd1llYXI7aWYoMD5aJiYoWis9MTIsZXQtLSksJClmb3IodD10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSgkLmdldEZ1bGxZZWFyKCksJC5nZXRNb250aCgpLUtbMF0qS1sxXSsxLCQuZ2V0RGF0ZSgpKSksdD1YJiZYPnQ/WDp0O3RoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGV0LFosMSkpPnQ7KVotLSwwPlomJihaPTExLGV0LS0pO2ZvcihlLmRyYXdNb250aD1aLGUuZHJhd1llYXI9ZXQsaT10aGlzLl9nZXQoZSxcInByZXZUZXh0XCIpLGk9cT90aGlzLmZvcm1hdERhdGUoaSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShldCxaLVUsMSkpLHRoaXMuX2dldEZvcm1hdENvbmZpZyhlKSk6aSxzPXRoaXMuX2NhbkFkanVzdE1vbnRoKGUsLTEsZXQsWik/XCI8YSBjbGFzcz0ndWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwnIGRhdGEtaGFuZGxlcj0ncHJldicgZGF0YS1ldmVudD0nY2xpY2snIHRpdGxlPSdcIitpK1wiJz48c3BhbiBjbGFzcz0ndWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS1cIisoWT9cImVcIjpcIndcIikrXCInPlwiK2krXCI8L3NwYW4+PC9hPlwiOko/XCJcIjpcIjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCcgdGl0bGU9J1wiK2krXCInPjxzcGFuIGNsYXNzPSd1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLVwiKyhZP1wiZVwiOlwid1wiKStcIic+XCIraStcIjwvc3Bhbj48L2E+XCIsbj10aGlzLl9nZXQoZSxcIm5leHRUZXh0XCIpLG49cT90aGlzLmZvcm1hdERhdGUobix0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShldCxaK1UsMSkpLHRoaXMuX2dldEZvcm1hdENvbmZpZyhlKSk6bixhPXRoaXMuX2NhbkFkanVzdE1vbnRoKGUsMSxldCxaKT9cIjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLW5leHQgdWktY29ybmVyLWFsbCcgZGF0YS1oYW5kbGVyPSduZXh0JyBkYXRhLWV2ZW50PSdjbGljaycgdGl0bGU9J1wiK24rXCInPjxzcGFuIGNsYXNzPSd1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLVwiKyhZP1wid1wiOlwiZVwiKStcIic+XCIrbitcIjwvc3Bhbj48L2E+XCI6Sj9cIlwiOlwiPGEgY2xhc3M9J3VpLWRhdGVwaWNrZXItbmV4dCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWRpc2FibGVkJyB0aXRsZT0nXCIrbitcIic+PHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtXCIrKFk/XCJ3XCI6XCJlXCIpK1wiJz5cIituK1wiPC9zcGFuPjwvYT5cIixvPXRoaXMuX2dldChlLFwiY3VycmVudFRleHRcIikscj10aGlzLl9nZXQoZSxcImdvdG9DdXJyZW50XCIpJiZlLmN1cnJlbnREYXk/RzpSLG89cT90aGlzLmZvcm1hdERhdGUobyxyLHRoaXMuX2dldEZvcm1hdENvbmZpZyhlKSk6byxoPWUuaW5saW5lP1wiXCI6XCI8YnV0dG9uIHR5cGU9J2J1dHRvbicgY2xhc3M9J3VpLWRhdGVwaWNrZXItY2xvc2UgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1wcmltYXJ5IHVpLWNvcm5lci1hbGwnIGRhdGEtaGFuZGxlcj0naGlkZScgZGF0YS1ldmVudD0nY2xpY2snPlwiK3RoaXMuX2dldChlLFwiY2xvc2VUZXh0XCIpK1wiPC9idXR0b24+XCIsbD1CP1wiPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1idXR0b25wYW5lIHVpLXdpZGdldC1jb250ZW50Jz5cIisoWT9oOlwiXCIpKyh0aGlzLl9pc0luUmFuZ2UoZSxyKT9cIjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0ndWktZGF0ZXBpY2tlci1jdXJyZW50IHVpLXN0YXRlLWRlZmF1bHQgdWktcHJpb3JpdHktc2Vjb25kYXJ5IHVpLWNvcm5lci1hbGwnIGRhdGEtaGFuZGxlcj0ndG9kYXknIGRhdGEtZXZlbnQ9J2NsaWNrJz5cIitvK1wiPC9idXR0b24+XCI6XCJcIikrKFk/XCJcIjpoKStcIjwvZGl2PlwiOlwiXCIsdT1wYXJzZUludCh0aGlzLl9nZXQoZSxcImZpcnN0RGF5XCIpLDEwKSx1PWlzTmFOKHUpPzA6dSxkPXRoaXMuX2dldChlLFwic2hvd1dlZWtcIiksYz10aGlzLl9nZXQoZSxcImRheU5hbWVzXCIpLHA9dGhpcy5fZ2V0KGUsXCJkYXlOYW1lc01pblwiKSxmPXRoaXMuX2dldChlLFwibW9udGhOYW1lc1wiKSxtPXRoaXMuX2dldChlLFwibW9udGhOYW1lc1Nob3J0XCIpLGc9dGhpcy5fZ2V0KGUsXCJiZWZvcmVTaG93RGF5XCIpLHY9dGhpcy5fZ2V0KGUsXCJzaG93T3RoZXJNb250aHNcIikseT10aGlzLl9nZXQoZSxcInNlbGVjdE90aGVyTW9udGhzXCIpLGI9dGhpcy5fZ2V0RGVmYXVsdERhdGUoZSksXz1cIlwiLHc9MDtLWzBdPnc7dysrKXtmb3Ioaz1cIlwiLHRoaXMubWF4Um93cz00LFQ9MDtLWzFdPlQ7VCsrKXtpZihEPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGV0LFosZS5zZWxlY3RlZERheSkpLFM9XCIgdWktY29ybmVyLWFsbFwiLE09XCJcIixRKXtpZihNKz1cIjxkaXYgY2xhc3M9J3VpLWRhdGVwaWNrZXItZ3JvdXBcIixLWzFdPjEpc3dpdGNoKFQpe2Nhc2UgMDpNKz1cIiB1aS1kYXRlcGlja2VyLWdyb3VwLWZpcnN0XCIsUz1cIiB1aS1jb3JuZXItXCIrKFk/XCJyaWdodFwiOlwibGVmdFwiKTticmVhaztjYXNlIEtbMV0tMTpNKz1cIiB1aS1kYXRlcGlja2VyLWdyb3VwLWxhc3RcIixTPVwiIHVpLWNvcm5lci1cIisoWT9cImxlZnRcIjpcInJpZ2h0XCIpO2JyZWFrO2RlZmF1bHQ6TSs9XCIgdWktZGF0ZXBpY2tlci1ncm91cC1taWRkbGVcIixTPVwiXCJ9TSs9XCInPlwifWZvcihNKz1cIjxkaXYgY2xhc3M9J3VpLWRhdGVwaWNrZXItaGVhZGVyIHVpLXdpZGdldC1oZWFkZXIgdWktaGVscGVyLWNsZWFyZml4XCIrUytcIic+XCIrKC9hbGx8bGVmdC8udGVzdChTKSYmMD09PXc/WT9hOnM6XCJcIikrKC9hbGx8cmlnaHQvLnRlc3QoUykmJjA9PT13P1k/czphOlwiXCIpK3RoaXMuX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyKGUsWixldCxYLCQsdz4wfHxUPjAsZixtKStcIjwvZGl2Pjx0YWJsZSBjbGFzcz0ndWktZGF0ZXBpY2tlci1jYWxlbmRhcic+PHRoZWFkPlwiK1wiPHRyPlwiLEM9ZD9cIjx0aCBjbGFzcz0ndWktZGF0ZXBpY2tlci13ZWVrLWNvbCc+XCIrdGhpcy5fZ2V0KGUsXCJ3ZWVrSGVhZGVyXCIpK1wiPC90aD5cIjpcIlwiLHg9MDs3Png7eCsrKU49KHgrdSklNyxDKz1cIjx0aCBzY29wZT0nY29sJ1wiKygoeCt1KzYpJTc+PTU/XCIgY2xhc3M9J3VpLWRhdGVwaWNrZXItd2Vlay1lbmQnXCI6XCJcIikrXCI+XCIrXCI8c3BhbiB0aXRsZT0nXCIrY1tOXStcIic+XCIrcFtOXStcIjwvc3Bhbj48L3RoPlwiO2ZvcihNKz1DK1wiPC90cj48L3RoZWFkPjx0Ym9keT5cIixBPXRoaXMuX2dldERheXNJbk1vbnRoKGV0LFopLGV0PT09ZS5zZWxlY3RlZFllYXImJlo9PT1lLnNlbGVjdGVkTW9udGgmJihlLnNlbGVjdGVkRGF5PU1hdGgubWluKGUuc2VsZWN0ZWREYXksQSkpLFA9KHRoaXMuX2dldEZpcnN0RGF5T2ZNb250aChldCxaKS11KzcpJTcsST1NYXRoLmNlaWwoKFArQSkvNyksSD1RP3RoaXMubWF4Um93cz5JP3RoaXMubWF4Um93czpJOkksdGhpcy5tYXhSb3dzPUgsej10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShldCxaLDEtUCkpLEY9MDtIPkY7RisrKXtmb3IoTSs9XCI8dHI+XCIsRT1kP1wiPHRkIGNsYXNzPSd1aS1kYXRlcGlja2VyLXdlZWstY29sJz5cIit0aGlzLl9nZXQoZSxcImNhbGN1bGF0ZVdlZWtcIikoeikrXCI8L3RkPlwiOlwiXCIseD0wOzc+eDt4KyspTz1nP2cuYXBwbHkoZS5pbnB1dD9lLmlucHV0WzBdOm51bGwsW3pdKTpbITAsXCJcIl0saj16LmdldE1vbnRoKCkhPT1aLFc9aiYmIXl8fCFPWzBdfHxYJiZYPnp8fCQmJno+JCxFKz1cIjx0ZCBjbGFzcz0nXCIrKCh4K3UrNiklNz49NT9cIiB1aS1kYXRlcGlja2VyLXdlZWstZW5kXCI6XCJcIikrKGo/XCIgdWktZGF0ZXBpY2tlci1vdGhlci1tb250aFwiOlwiXCIpKyh6LmdldFRpbWUoKT09PUQuZ2V0VGltZSgpJiZaPT09ZS5zZWxlY3RlZE1vbnRoJiZlLl9rZXlFdmVudHx8Yi5nZXRUaW1lKCk9PT16LmdldFRpbWUoKSYmYi5nZXRUaW1lKCk9PT1ELmdldFRpbWUoKT9cIiBcIit0aGlzLl9kYXlPdmVyQ2xhc3M6XCJcIikrKFc/XCIgXCIrdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MrXCIgdWktc3RhdGUtZGlzYWJsZWRcIjpcIlwiKSsoaiYmIXY/XCJcIjpcIiBcIitPWzFdKyh6LmdldFRpbWUoKT09PUcuZ2V0VGltZSgpP1wiIFwiK3RoaXMuX2N1cnJlbnRDbGFzczpcIlwiKSsoei5nZXRUaW1lKCk9PT1SLmdldFRpbWUoKT9cIiB1aS1kYXRlcGlja2VyLXRvZGF5XCI6XCJcIikpK1wiJ1wiKyhqJiYhdnx8IU9bMl0/XCJcIjpcIiB0aXRsZT0nXCIrT1syXS5yZXBsYWNlKC8nL2csXCImIzM5O1wiKStcIidcIikrKFc/XCJcIjpcIiBkYXRhLWhhbmRsZXI9J3NlbGVjdERheScgZGF0YS1ldmVudD0nY2xpY2snIGRhdGEtbW9udGg9J1wiK3ouZ2V0TW9udGgoKStcIicgZGF0YS15ZWFyPSdcIit6LmdldEZ1bGxZZWFyKCkrXCInXCIpK1wiPlwiKyhqJiYhdj9cIiYjeGEwO1wiOlc/XCI8c3BhbiBjbGFzcz0ndWktc3RhdGUtZGVmYXVsdCc+XCIrei5nZXREYXRlKCkrXCI8L3NwYW4+XCI6XCI8YSBjbGFzcz0ndWktc3RhdGUtZGVmYXVsdFwiKyh6LmdldFRpbWUoKT09PVIuZ2V0VGltZSgpP1wiIHVpLXN0YXRlLWhpZ2hsaWdodFwiOlwiXCIpKyh6LmdldFRpbWUoKT09PUcuZ2V0VGltZSgpP1wiIHVpLXN0YXRlLWFjdGl2ZVwiOlwiXCIpKyhqP1wiIHVpLXByaW9yaXR5LXNlY29uZGFyeVwiOlwiXCIpK1wiJyBocmVmPScjJz5cIit6LmdldERhdGUoKStcIjwvYT5cIikrXCI8L3RkPlwiLHouc2V0RGF0ZSh6LmdldERhdGUoKSsxKSx6PXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KHopO00rPUUrXCI8L3RyPlwifVorKyxaPjExJiYoWj0wLGV0KyspLE0rPVwiPC90Ym9keT48L3RhYmxlPlwiKyhRP1wiPC9kaXY+XCIrKEtbMF0+MCYmVD09PUtbMV0tMT9cIjxkaXYgY2xhc3M9J3VpLWRhdGVwaWNrZXItcm93LWJyZWFrJz48L2Rpdj5cIjpcIlwiKTpcIlwiKSxrKz1NfV8rPWt9cmV0dXJuIF8rPWwsZS5fa2V5RXZlbnQ9ITEsX30sX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyOmZ1bmN0aW9uKGUsdCxpLHMsbixhLG8scil7dmFyIGgsbCx1LGQsYyxwLGYsbSxnPXRoaXMuX2dldChlLFwiY2hhbmdlTW9udGhcIiksdj10aGlzLl9nZXQoZSxcImNoYW5nZVllYXJcIikseT10aGlzLl9nZXQoZSxcInNob3dNb250aEFmdGVyWWVhclwiKSxiPVwiPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci10aXRsZSc+XCIsXz1cIlwiO2lmKGF8fCFnKV8rPVwiPHNwYW4gY2xhc3M9J3VpLWRhdGVwaWNrZXItbW9udGgnPlwiK29bdF0rXCI8L3NwYW4+XCI7ZWxzZXtmb3IoaD1zJiZzLmdldEZ1bGxZZWFyKCk9PT1pLGw9biYmbi5nZXRGdWxsWWVhcigpPT09aSxfKz1cIjxzZWxlY3QgY2xhc3M9J3VpLWRhdGVwaWNrZXItbW9udGgnIGRhdGEtaGFuZGxlcj0nc2VsZWN0TW9udGgnIGRhdGEtZXZlbnQ9J2NoYW5nZSc+XCIsdT0wOzEyPnU7dSsrKSghaHx8dT49cy5nZXRNb250aCgpKSYmKCFsfHxuLmdldE1vbnRoKCk+PXUpJiYoXys9XCI8b3B0aW9uIHZhbHVlPSdcIit1K1wiJ1wiKyh1PT09dD9cIiBzZWxlY3RlZD0nc2VsZWN0ZWQnXCI6XCJcIikrXCI+XCIrclt1XStcIjwvb3B0aW9uPlwiKTtfKz1cIjwvc2VsZWN0PlwifWlmKHl8fChiKz1fKyghYSYmZyYmdj9cIlwiOlwiJiN4YTA7XCIpKSwhZS55ZWFyc2h0bWwpaWYoZS55ZWFyc2h0bWw9XCJcIixhfHwhdiliKz1cIjxzcGFuIGNsYXNzPSd1aS1kYXRlcGlja2VyLXllYXInPlwiK2krXCI8L3NwYW4+XCI7ZWxzZXtmb3IoZD10aGlzLl9nZXQoZSxcInllYXJSYW5nZVwiKS5zcGxpdChcIjpcIiksYz0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCkscD1mdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKC9jWytcXC1dLiovKT9pK3BhcnNlSW50KGUuc3Vic3RyaW5nKDEpLDEwKTplLm1hdGNoKC9bK1xcLV0uKi8pP2MrcGFyc2VJbnQoZSwxMCk6cGFyc2VJbnQoZSwxMCk7cmV0dXJuIGlzTmFOKHQpP2M6dH0sZj1wKGRbMF0pLG09TWF0aC5tYXgoZixwKGRbMV18fFwiXCIpKSxmPXM/TWF0aC5tYXgoZixzLmdldEZ1bGxZZWFyKCkpOmYsbT1uP01hdGgubWluKG0sbi5nZXRGdWxsWWVhcigpKTptLGUueWVhcnNodG1sKz1cIjxzZWxlY3QgY2xhc3M9J3VpLWRhdGVwaWNrZXIteWVhcicgZGF0YS1oYW5kbGVyPSdzZWxlY3RZZWFyJyBkYXRhLWV2ZW50PSdjaGFuZ2UnPlwiO20+PWY7ZisrKWUueWVhcnNodG1sKz1cIjxvcHRpb24gdmFsdWU9J1wiK2YrXCInXCIrKGY9PT1pP1wiIHNlbGVjdGVkPSdzZWxlY3RlZCdcIjpcIlwiKStcIj5cIitmK1wiPC9vcHRpb24+XCI7ZS55ZWFyc2h0bWwrPVwiPC9zZWxlY3Q+XCIsYis9ZS55ZWFyc2h0bWwsZS55ZWFyc2h0bWw9bnVsbH1yZXR1cm4gYis9dGhpcy5fZ2V0KGUsXCJ5ZWFyU3VmZml4XCIpLHkmJihiKz0oIWEmJmcmJnY/XCJcIjpcIiYjeGEwO1wiKStfKSxiKz1cIjwvZGl2PlwifSxfYWRqdXN0SW5zdERhdGU6ZnVuY3Rpb24oZSx0LGkpe3ZhciBzPWUuZHJhd1llYXIrKFwiWVwiPT09aT90OjApLG49ZS5kcmF3TW9udGgrKFwiTVwiPT09aT90OjApLGE9TWF0aC5taW4oZS5zZWxlY3RlZERheSx0aGlzLl9nZXREYXlzSW5Nb250aChzLG4pKSsoXCJEXCI9PT1pP3Q6MCksbz10aGlzLl9yZXN0cmljdE1pbk1heChlLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHMsbixhKSkpO2Uuc2VsZWN0ZWREYXk9by5nZXREYXRlKCksZS5kcmF3TW9udGg9ZS5zZWxlY3RlZE1vbnRoPW8uZ2V0TW9udGgoKSxlLmRyYXdZZWFyPWUuc2VsZWN0ZWRZZWFyPW8uZ2V0RnVsbFllYXIoKSwoXCJNXCI9PT1pfHxcIllcIj09PWkpJiZ0aGlzLl9ub3RpZnlDaGFuZ2UoZSl9LF9yZXN0cmljdE1pbk1heDpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuX2dldE1pbk1heERhdGUoZSxcIm1pblwiKSxzPXRoaXMuX2dldE1pbk1heERhdGUoZSxcIm1heFwiKSxuPWkmJmk+dD9pOnQ7cmV0dXJuIHMmJm4+cz9zOm59LF9ub3RpZnlDaGFuZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0KGUsXCJvbkNoYW5nZU1vbnRoWWVhclwiKTt0JiZ0LmFwcGx5KGUuaW5wdXQ/ZS5pbnB1dFswXTpudWxsLFtlLnNlbGVjdGVkWWVhcixlLnNlbGVjdGVkTW9udGgrMSxlXSl9LF9nZXROdW1iZXJPZk1vbnRoczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXQoZSxcIm51bWJlck9mTW9udGhzXCIpO3JldHVybiBudWxsPT10P1sxLDFdOlwibnVtYmVyXCI9PXR5cGVvZiB0P1sxLHRdOnR9LF9nZXRNaW5NYXhEYXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX2RldGVybWluZURhdGUoZSx0aGlzLl9nZXQoZSx0K1wiRGF0ZVwiKSxudWxsKX0sX2dldERheXNJbk1vbnRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIDMyLXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGUsdCwzMikpLmdldERhdGUoKX0sX2dldEZpcnN0RGF5T2ZNb250aDpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgRGF0ZShlLHQsMSkuZ2V0RGF5KCl9LF9jYW5BZGp1c3RNb250aDpmdW5jdGlvbihlLHQsaSxzKXt2YXIgbj10aGlzLl9nZXROdW1iZXJPZk1vbnRocyhlKSxhPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGkscysoMD50P3Q6blswXSpuWzFdKSwxKSk7cmV0dXJuIDA+dCYmYS5zZXREYXRlKHRoaXMuX2dldERheXNJbk1vbnRoKGEuZ2V0RnVsbFllYXIoKSxhLmdldE1vbnRoKCkpKSx0aGlzLl9pc0luUmFuZ2UoZSxhKX0sX2lzSW5SYW5nZTpmdW5jdGlvbihlLHQpe3ZhciBpLHMsbj10aGlzLl9nZXRNaW5NYXhEYXRlKGUsXCJtaW5cIiksYT10aGlzLl9nZXRNaW5NYXhEYXRlKGUsXCJtYXhcIiksbz1udWxsLHI9bnVsbCxoPXRoaXMuX2dldChlLFwieWVhclJhbmdlXCIpO3JldHVybiBoJiYoaT1oLnNwbGl0KFwiOlwiKSxzPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSxvPXBhcnNlSW50KGlbMF0sMTApLHI9cGFyc2VJbnQoaVsxXSwxMCksaVswXS5tYXRjaCgvWytcXC1dLiovKSYmKG8rPXMpLGlbMV0ubWF0Y2goL1srXFwtXS4qLykmJihyKz1zKSksKCFufHx0LmdldFRpbWUoKT49bi5nZXRUaW1lKCkpJiYoIWF8fHQuZ2V0VGltZSgpPD1hLmdldFRpbWUoKSkmJighb3x8dC5nZXRGdWxsWWVhcigpPj1vKSYmKCFyfHxyPj10LmdldEZ1bGxZZWFyKCkpfSxfZ2V0Rm9ybWF0Q29uZmlnOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldChlLFwic2hvcnRZZWFyQ3V0b2ZmXCIpO3JldHVybiB0PVwic3RyaW5nXCIhPXR5cGVvZiB0P3Q6KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpJTEwMCtwYXJzZUludCh0LDEwKSx7c2hvcnRZZWFyQ3V0b2ZmOnQsZGF5TmFtZXNTaG9ydDp0aGlzLl9nZXQoZSxcImRheU5hbWVzU2hvcnRcIiksZGF5TmFtZXM6dGhpcy5fZ2V0KGUsXCJkYXlOYW1lc1wiKSxtb250aE5hbWVzU2hvcnQ6dGhpcy5fZ2V0KGUsXCJtb250aE5hbWVzU2hvcnRcIiksbW9udGhOYW1lczp0aGlzLl9nZXQoZSxcIm1vbnRoTmFtZXNcIil9fSxfZm9ybWF0RGF0ZTpmdW5jdGlvbihlLHQsaSxzKXt0fHwoZS5jdXJyZW50RGF5PWUuc2VsZWN0ZWREYXksZS5jdXJyZW50TW9udGg9ZS5zZWxlY3RlZE1vbnRoLGUuY3VycmVudFllYXI9ZS5zZWxlY3RlZFllYXIpO3ZhciBuPXQ/XCJvYmplY3RcIj09dHlwZW9mIHQ/dDp0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShzLGksdCkpOnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGUuY3VycmVudFllYXIsZS5jdXJyZW50TW9udGgsZS5jdXJyZW50RGF5KSk7cmV0dXJuIHRoaXMuZm9ybWF0RGF0ZSh0aGlzLl9nZXQoZSxcImRhdGVGb3JtYXRcIiksbix0aGlzLl9nZXRGb3JtYXRDb25maWcoZSkpfX0pLGUuZm4uZGF0ZXBpY2tlcj1mdW5jdGlvbih0KXtpZighdGhpcy5sZW5ndGgpcmV0dXJuIHRoaXM7ZS5kYXRlcGlja2VyLmluaXRpYWxpemVkfHwoZShkb2N1bWVudCkubW91c2Vkb3duKGUuZGF0ZXBpY2tlci5fY2hlY2tFeHRlcm5hbENsaWNrKSxlLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQ9ITApLDA9PT1lKFwiI1wiK2UuZGF0ZXBpY2tlci5fbWFpbkRpdklkKS5sZW5ndGgmJmUoXCJib2R5XCIpLmFwcGVuZChlLmRhdGVwaWNrZXIuZHBEaXYpO3ZhciBpPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgdHx8XCJpc0Rpc2FibGVkXCIhPT10JiZcImdldERhdGVcIiE9PXQmJlwid2lkZ2V0XCIhPT10P1wib3B0aW9uXCI9PT10JiYyPT09YXJndW1lbnRzLmxlbmd0aCYmXCJzdHJpbmdcIj09dHlwZW9mIGFyZ3VtZW50c1sxXT9lLmRhdGVwaWNrZXJbXCJfXCIrdCtcIkRhdGVwaWNrZXJcIl0uYXBwbHkoZS5kYXRlcGlja2VyLFt0aGlzWzBdXS5jb25jYXQoaSkpOnRoaXMuZWFjaChmdW5jdGlvbigpe1wic3RyaW5nXCI9PXR5cGVvZiB0P2UuZGF0ZXBpY2tlcltcIl9cIit0K1wiRGF0ZXBpY2tlclwiXS5hcHBseShlLmRhdGVwaWNrZXIsW3RoaXNdLmNvbmNhdChpKSk6ZS5kYXRlcGlja2VyLl9hdHRhY2hEYXRlcGlja2VyKHRoaXMsdCl9KTplLmRhdGVwaWNrZXJbXCJfXCIrdCtcIkRhdGVwaWNrZXJcIl0uYXBwbHkoZS5kYXRlcGlja2VyLFt0aGlzWzBdXS5jb25jYXQoaSkpfSxlLmRhdGVwaWNrZXI9bmV3IG4sZS5kYXRlcGlja2VyLmluaXRpYWxpemVkPSExLGUuZGF0ZXBpY2tlci51dWlkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGUuZGF0ZXBpY2tlci52ZXJzaW9uPVwiMS4xMS40XCIsZS5kYXRlcGlja2VyLGUud2lkZ2V0KFwidWkuZHJhZ2dhYmxlXCIsZS51aS5tb3VzZSx7dmVyc2lvbjpcIjEuMTEuNFwiLHdpZGdldEV2ZW50UHJlZml4OlwiZHJhZ1wiLG9wdGlvbnM6e2FkZENsYXNzZXM6ITAsYXBwZW5kVG86XCJwYXJlbnRcIixheGlzOiExLGNvbm5lY3RUb1NvcnRhYmxlOiExLGNvbnRhaW5tZW50OiExLGN1cnNvcjpcImF1dG9cIixjdXJzb3JBdDohMSxncmlkOiExLGhhbmRsZTohMSxoZWxwZXI6XCJvcmlnaW5hbFwiLGlmcmFtZUZpeDohMSxvcGFjaXR5OiExLHJlZnJlc2hQb3NpdGlvbnM6ITEscmV2ZXJ0OiExLHJldmVydER1cmF0aW9uOjUwMCxzY29wZTpcImRlZmF1bHRcIixzY3JvbGw6ITAsc2Nyb2xsU2Vuc2l0aXZpdHk6MjAsc2Nyb2xsU3BlZWQ6MjAsc25hcDohMSxzbmFwTW9kZTpcImJvdGhcIixzbmFwVG9sZXJhbmNlOjIwLHN0YWNrOiExLHpJbmRleDohMSxkcmFnOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXtcIm9yaWdpbmFsXCI9PT10aGlzLm9wdGlvbnMuaGVscGVyJiZ0aGlzLl9zZXRQb3NpdGlvblJlbGF0aXZlKCksdGhpcy5vcHRpb25zLmFkZENsYXNzZXMmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyhcInVpLWRyYWdnYWJsZVwiKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyhcInVpLWRyYWdnYWJsZS1kaXNhYmxlZFwiKSx0aGlzLl9zZXRIYW5kbGVDbGFzc05hbWUoKSx0aGlzLl9tb3VzZUluaXQoKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe3RoaXMuX3N1cGVyKGUsdCksXCJoYW5kbGVcIj09PWUmJih0aGlzLl9yZW1vdmVIYW5kbGVDbGFzc05hbWUoKSx0aGlzLl9zZXRIYW5kbGVDbGFzc05hbWUoKSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuaGVscGVyfHx0aGlzLmVsZW1lbnQpLmlzKFwiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZ1wiKT8odGhpcy5kZXN0cm95T25DbGVhcj0hMCx2b2lkIDApOih0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJ1aS1kcmFnZ2FibGUgdWktZHJhZ2dhYmxlLWRyYWdnaW5nIHVpLWRyYWdnYWJsZS1kaXNhYmxlZFwiKSx0aGlzLl9yZW1vdmVIYW5kbGVDbGFzc05hbWUoKSx0aGlzLl9tb3VzZURlc3Ryb3koKSx2b2lkIDApfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5fYmx1ckFjdGl2ZUVsZW1lbnQodCksdGhpcy5oZWxwZXJ8fGkuZGlzYWJsZWR8fGUodC50YXJnZXQpLmNsb3Nlc3QoXCIudWktcmVzaXphYmxlLWhhbmRsZVwiKS5sZW5ndGg+MD8hMToodGhpcy5oYW5kbGU9dGhpcy5fZ2V0SGFuZGxlKHQpLHRoaXMuaGFuZGxlPyh0aGlzLl9ibG9ja0ZyYW1lcyhpLmlmcmFtZUZpeD09PSEwP1wiaWZyYW1lXCI6aS5pZnJhbWVGaXgpLCEwKTohMSl9LF9ibG9ja0ZyYW1lczpmdW5jdGlvbih0KXt0aGlzLmlmcmFtZUJsb2Nrcz10aGlzLmRvY3VtZW50LmZpbmQodCkubWFwKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtyZXR1cm4gZShcIjxkaXY+XCIpLmNzcyhcInBvc2l0aW9uXCIsXCJhYnNvbHV0ZVwiKS5hcHBlbmRUbyh0LnBhcmVudCgpKS5vdXRlcldpZHRoKHQub3V0ZXJXaWR0aCgpKS5vdXRlckhlaWdodCh0Lm91dGVySGVpZ2h0KCkpLm9mZnNldCh0Lm9mZnNldCgpKVswXX0pfSxfdW5ibG9ja0ZyYW1lczpmdW5jdGlvbigpe3RoaXMuaWZyYW1lQmxvY2tzJiYodGhpcy5pZnJhbWVCbG9ja3MucmVtb3ZlKCksZGVsZXRlIHRoaXMuaWZyYW1lQmxvY2tzKX0sX2JsdXJBY3RpdmVFbGVtZW50OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZG9jdW1lbnRbMF07aWYodGhpcy5oYW5kbGVFbGVtZW50LmlzKHQudGFyZ2V0KSl0cnl7aS5hY3RpdmVFbGVtZW50JiZcImJvZHlcIiE9PWkuYWN0aXZlRWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZlKGkuYWN0aXZlRWxlbWVudCkuYmx1cigpfWNhdGNoKHMpe319LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKHQpLHRoaXMuaGVscGVyLmFkZENsYXNzKFwidWktZHJhZ2dhYmxlLWRyYWdnaW5nXCIpLHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSxlLnVpLmRkbWFuYWdlciYmKGUudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpcyksdGhpcy5fY2FjaGVNYXJnaW5zKCksdGhpcy5jc3NQb3NpdGlvbj10aGlzLmhlbHBlci5jc3MoXCJwb3NpdGlvblwiKSx0aGlzLnNjcm9sbFBhcmVudD10aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoITApLHRoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpLHRoaXMuaGFzRml4ZWRBbmNlc3Rvcj10aGlzLmhlbHBlci5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuXCJmaXhlZFwiPT09ZSh0aGlzKS5jc3MoXCJwb3NpdGlvblwiKX0pLmxlbmd0aD4wLHRoaXMucG9zaXRpb25BYnM9dGhpcy5lbGVtZW50Lm9mZnNldCgpLHRoaXMuX3JlZnJlc2hPZmZzZXRzKHQpLHRoaXMub3JpZ2luYWxQb3NpdGlvbj10aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24odCwhMSksdGhpcy5vcmlnaW5hbFBhZ2VYPXQucGFnZVgsdGhpcy5vcmlnaW5hbFBhZ2VZPXQucGFnZVksaS5jdXJzb3JBdCYmdGhpcy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihpLmN1cnNvckF0KSx0aGlzLl9zZXRDb250YWlubWVudCgpLHRoaXMuX3RyaWdnZXIoXCJzdGFydFwiLHQpPT09ITE/KHRoaXMuX2NsZWFyKCksITEpOih0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksZS51aS5kZG1hbmFnZXImJiFpLmRyb3BCZWhhdmlvdXImJmUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsdCksdGhpcy5fbm9ybWFsaXplUmlnaHRCb3R0b20oKSx0aGlzLl9tb3VzZURyYWcodCwhMCksZS51aS5kZG1hbmFnZXImJmUudWkuZGRtYW5hZ2VyLmRyYWdTdGFydCh0aGlzLHQpLCEwKX0sX3JlZnJlc2hPZmZzZXRzOmZ1bmN0aW9uKGUpe3RoaXMub2Zmc2V0PXt0b3A6dGhpcy5wb3NpdGlvbkFicy50b3AtdGhpcy5tYXJnaW5zLnRvcCxsZWZ0OnRoaXMucG9zaXRpb25BYnMubGVmdC10aGlzLm1hcmdpbnMubGVmdCxzY3JvbGw6ITEscGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9LHRoaXMub2Zmc2V0LmNsaWNrPXtsZWZ0OmUucGFnZVgtdGhpcy5vZmZzZXQubGVmdCx0b3A6ZS5wYWdlWS10aGlzLm9mZnNldC50b3B9fSxfbW91c2VEcmFnOmZ1bmN0aW9uKHQsaSl7aWYodGhpcy5oYXNGaXhlZEFuY2VzdG9yJiYodGhpcy5vZmZzZXQucGFyZW50PXRoaXMuX2dldFBhcmVudE9mZnNldCgpKSx0aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24odCwhMCksdGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbyhcImFic29sdXRlXCIpLCFpKXt2YXIgcz10aGlzLl91aUhhc2goKTtpZih0aGlzLl90cmlnZ2VyKFwiZHJhZ1wiLHQscyk9PT0hMSlyZXR1cm4gdGhpcy5fbW91c2VVcCh7fSksITE7dGhpcy5wb3NpdGlvbj1zLnBvc2l0aW9ufXJldHVybiB0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCtcInB4XCIsdGhpcy5oZWxwZXJbMF0uc3R5bGUudG9wPXRoaXMucG9zaXRpb24udG9wK1wicHhcIixlLnVpLmRkbWFuYWdlciYmZS51aS5kZG1hbmFnZXIuZHJhZyh0aGlzLHQpLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMscz0hMTtyZXR1cm4gZS51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91ciYmKHM9ZS51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLHQpKSx0aGlzLmRyb3BwZWQmJihzPXRoaXMuZHJvcHBlZCx0aGlzLmRyb3BwZWQ9ITEpLFwiaW52YWxpZFwiPT09dGhpcy5vcHRpb25zLnJldmVydCYmIXN8fFwidmFsaWRcIj09PXRoaXMub3B0aW9ucy5yZXZlcnQmJnN8fHRoaXMub3B0aW9ucy5yZXZlcnQ9PT0hMHx8ZS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5yZXZlcnQpJiZ0aGlzLm9wdGlvbnMucmV2ZXJ0LmNhbGwodGhpcy5lbGVtZW50LHMpP2UodGhpcy5oZWxwZXIpLmFuaW1hdGUodGhpcy5vcmlnaW5hbFBvc2l0aW9uLHBhcnNlSW50KHRoaXMub3B0aW9ucy5yZXZlcnREdXJhdGlvbiwxMCksZnVuY3Rpb24oKXtpLl90cmlnZ2VyKFwic3RvcFwiLHQpIT09ITEmJmkuX2NsZWFyKCl9KTp0aGlzLl90cmlnZ2VyKFwic3RvcFwiLHQpIT09ITEmJnRoaXMuX2NsZWFyKCksITF9LF9tb3VzZVVwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl91bmJsb2NrRnJhbWVzKCksZS51aS5kZG1hbmFnZXImJmUudWkuZGRtYW5hZ2VyLmRyYWdTdG9wKHRoaXMsdCksdGhpcy5oYW5kbGVFbGVtZW50LmlzKHQudGFyZ2V0KSYmdGhpcy5lbGVtZW50LmZvY3VzKCksZS51aS5tb3VzZS5wcm90b3R5cGUuX21vdXNlVXAuY2FsbCh0aGlzLHQpfSxjYW5jZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oZWxwZXIuaXMoXCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nXCIpP3RoaXMuX21vdXNlVXAoe30pOnRoaXMuX2NsZWFyKCksdGhpc30sX2dldEhhbmRsZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLmhhbmRsZT8hIWUodC50YXJnZXQpLmNsb3Nlc3QodGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLmhhbmRsZSkpLmxlbmd0aDohMH0sX3NldEhhbmRsZUNsYXNzTmFtZTpmdW5jdGlvbigpe3RoaXMuaGFuZGxlRWxlbWVudD10aGlzLm9wdGlvbnMuaGFuZGxlP3RoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5oYW5kbGUpOnRoaXMuZWxlbWVudCx0aGlzLmhhbmRsZUVsZW1lbnQuYWRkQ2xhc3MoXCJ1aS1kcmFnZ2FibGUtaGFuZGxlXCIpfSxfcmVtb3ZlSGFuZGxlQ2xhc3NOYW1lOmZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVFbGVtZW50LnJlbW92ZUNsYXNzKFwidWktZHJhZ2dhYmxlLWhhbmRsZVwiKX0sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnMscz1lLmlzRnVuY3Rpb24oaS5oZWxwZXIpLG49cz9lKGkuaGVscGVyLmFwcGx5KHRoaXMuZWxlbWVudFswXSxbdF0pKTpcImNsb25lXCI9PT1pLmhlbHBlcj90aGlzLmVsZW1lbnQuY2xvbmUoKS5yZW1vdmVBdHRyKFwiaWRcIik6dGhpcy5lbGVtZW50O3JldHVybiBuLnBhcmVudHMoXCJib2R5XCIpLmxlbmd0aHx8bi5hcHBlbmRUbyhcInBhcmVudFwiPT09aS5hcHBlbmRUbz90aGlzLmVsZW1lbnRbMF0ucGFyZW50Tm9kZTppLmFwcGVuZFRvKSxzJiZuWzBdPT09dGhpcy5lbGVtZW50WzBdJiZ0aGlzLl9zZXRQb3NpdGlvblJlbGF0aXZlKCksblswXT09PXRoaXMuZWxlbWVudFswXXx8LyhmaXhlZHxhYnNvbHV0ZSkvLnRlc3Qobi5jc3MoXCJwb3NpdGlvblwiKSl8fG4uY3NzKFwicG9zaXRpb25cIixcImFic29sdXRlXCIpLG59LF9zZXRQb3NpdGlvblJlbGF0aXZlOmZ1bmN0aW9uKCl7L14oPzpyfGF8ZikvLnRlc3QodGhpcy5lbGVtZW50LmNzcyhcInBvc2l0aW9uXCIpKXx8KHRoaXMuZWxlbWVudFswXS5zdHlsZS5wb3NpdGlvbj1cInJlbGF0aXZlXCIpfSxfYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcjpmdW5jdGlvbih0KXtcInN0cmluZ1wiPT10eXBlb2YgdCYmKHQ9dC5zcGxpdChcIiBcIikpLGUuaXNBcnJheSh0KSYmKHQ9e2xlZnQ6K3RbMF0sdG9wOit0WzFdfHwwfSksXCJsZWZ0XCJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2subGVmdD10LmxlZnQrdGhpcy5tYXJnaW5zLmxlZnQpLFwicmlnaHRcImluIHQmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdC5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksXCJ0b3BcImluIHQmJih0aGlzLm9mZnNldC5jbGljay50b3A9dC50b3ArdGhpcy5tYXJnaW5zLnRvcCksXCJib3R0b21cImluIHQmJih0aGlzLm9mZnNldC5jbGljay50b3A9dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdC5ib3R0b20rdGhpcy5tYXJnaW5zLnRvcCl9LF9pc1Jvb3ROb2RlOmZ1bmN0aW9uKGUpe3JldHVybi8oaHRtbHxib2R5KS9pLnRlc3QoZS50YWdOYW1lKXx8ZT09PXRoaXMuZG9jdW1lbnRbMF19LF9nZXRQYXJlbnRPZmZzZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9mZnNldFBhcmVudC5vZmZzZXQoKSxpPXRoaXMuZG9jdW1lbnRbMF07cmV0dXJuXCJhYnNvbHV0ZVwiPT09dGhpcy5jc3NQb3NpdGlvbiYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPT1pJiZlLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKHQubGVmdCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpLHQudG9wKz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSksdGhpcy5faXNSb290Tm9kZSh0aGlzLm9mZnNldFBhcmVudFswXSkmJih0PXt0b3A6MCxsZWZ0OjB9KSx7dG9wOnQudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoXCJib3JkZXJUb3BXaWR0aFwiKSwxMCl8fDApLGxlZnQ6dC5sZWZ0KyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoXCJib3JkZXJMZWZ0V2lkdGhcIiksMTApfHwwKX19LF9nZXRSZWxhdGl2ZU9mZnNldDpmdW5jdGlvbigpe2lmKFwicmVsYXRpdmVcIiE9PXRoaXMuY3NzUG9zaXRpb24pcmV0dXJue3RvcDowLGxlZnQ6MH07dmFyIGU9dGhpcy5lbGVtZW50LnBvc2l0aW9uKCksdD10aGlzLl9pc1Jvb3ROb2RlKHRoaXMuc2Nyb2xsUGFyZW50WzBdKTtyZXR1cm57dG9wOmUudG9wLShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoXCJ0b3BcIiksMTApfHwwKSsodD8wOnRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpKSxsZWZ0OmUubGVmdC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKFwibGVmdFwiKSwxMCl8fDApKyh0PzA6dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpKX19LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1hcmdpbnM9e2xlZnQ6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcyhcIm1hcmdpbkxlZnRcIiksMTApfHwwLHRvcDpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKFwibWFyZ2luVG9wXCIpLDEwKXx8MCxyaWdodDpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKFwibWFyZ2luUmlnaHRcIiksMTApfHwwLGJvdHRvbTpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKFwibWFyZ2luQm90dG9tXCIpLDEwKXx8MH19LF9jYWNoZUhlbHBlclByb3BvcnRpb25zOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXJQcm9wb3J0aW9ucz17d2lkdGg6dGhpcy5oZWxwZXIub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmhlbHBlci5vdXRlckhlaWdodCgpfX0sX3NldENvbnRhaW5tZW50OmZ1bmN0aW9uKCl7dmFyIHQsaSxzLG49dGhpcy5vcHRpb25zLGE9dGhpcy5kb2N1bWVudFswXTtyZXR1cm4gdGhpcy5yZWxhdGl2ZUNvbnRhaW5lcj1udWxsLG4uY29udGFpbm1lbnQ/XCJ3aW5kb3dcIj09PW4uY29udGFpbm1lbnQ/KHRoaXMuY29udGFpbm1lbnQ9W2Uod2luZG93KS5zY3JvbGxMZWZ0KCktdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCxlKHdpbmRvdykuc2Nyb2xsVG9wKCktdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AsZSh3aW5kb3cpLnNjcm9sbExlZnQoKStlKHdpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LGUod2luZG93KS5zY3JvbGxUb3AoKSsoZSh3aW5kb3cpLmhlaWdodCgpfHxhLmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdLHZvaWQgMCk6XCJkb2N1bWVudFwiPT09bi5jb250YWlubWVudD8odGhpcy5jb250YWlubWVudD1bMCwwLGUoYSkud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LChlKGEpLmhlaWdodCgpfHxhLmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdLHZvaWQgMCk6bi5jb250YWlubWVudC5jb25zdHJ1Y3Rvcj09PUFycmF5Pyh0aGlzLmNvbnRhaW5tZW50PW4uY29udGFpbm1lbnQsdm9pZCAwKTooXCJwYXJlbnRcIj09PW4uY29udGFpbm1lbnQmJihuLmNvbnRhaW5tZW50PXRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUpLGk9ZShuLmNvbnRhaW5tZW50KSxzPWlbMF0scyYmKHQ9LyhzY3JvbGx8YXV0bykvLnRlc3QoaS5jc3MoXCJvdmVyZmxvd1wiKSksdGhpcy5jb250YWlubWVudD1bKHBhcnNlSW50KGkuY3NzKFwiYm9yZGVyTGVmdFdpZHRoXCIpLDEwKXx8MCkrKHBhcnNlSW50KGkuY3NzKFwicGFkZGluZ0xlZnRcIiksMTApfHwwKSwocGFyc2VJbnQoaS5jc3MoXCJib3JkZXJUb3BXaWR0aFwiKSwxMCl8fDApKyhwYXJzZUludChpLmNzcyhcInBhZGRpbmdUb3BcIiksMTApfHwwKSwodD9NYXRoLm1heChzLnNjcm9sbFdpZHRoLHMub2Zmc2V0V2lkdGgpOnMub2Zmc2V0V2lkdGgpLShwYXJzZUludChpLmNzcyhcImJvcmRlclJpZ2h0V2lkdGhcIiksMTApfHwwKS0ocGFyc2VJbnQoaS5jc3MoXCJwYWRkaW5nUmlnaHRcIiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LXRoaXMubWFyZ2lucy5yaWdodCwodD9NYXRoLm1heChzLnNjcm9sbEhlaWdodCxzLm9mZnNldEhlaWdodCk6cy5vZmZzZXRIZWlnaHQpLShwYXJzZUludChpLmNzcyhcImJvcmRlckJvdHRvbVdpZHRoXCIpLDEwKXx8MCktKHBhcnNlSW50KGkuY3NzKFwicGFkZGluZ0JvdHRvbVwiKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3AtdGhpcy5tYXJnaW5zLmJvdHRvbV0sdGhpcy5yZWxhdGl2ZUNvbnRhaW5lcj1pKSx2b2lkIDApOih0aGlzLmNvbnRhaW5tZW50PW51bGwsdm9pZCAwKVxufSxfY29udmVydFBvc2l0aW9uVG86ZnVuY3Rpb24oZSx0KXt0fHwodD10aGlzLnBvc2l0aW9uKTt2YXIgaT1cImFic29sdXRlXCI9PT1lPzE6LTEscz10aGlzLl9pc1Jvb3ROb2RlKHRoaXMuc2Nyb2xsUGFyZW50WzBdKTtyZXR1cm57dG9wOnQudG9wK3RoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCppK3RoaXMub2Zmc2V0LnBhcmVudC50b3AqaS0oXCJmaXhlZFwiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5vZmZzZXQuc2Nyb2xsLnRvcDpzPzA6dGhpcy5vZmZzZXQuc2Nyb2xsLnRvcCkqaSxsZWZ0OnQubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KmkrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqaS0oXCJmaXhlZFwiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5vZmZzZXQuc2Nyb2xsLmxlZnQ6cz8wOnRoaXMub2Zmc2V0LnNjcm9sbC5sZWZ0KSppfX0sX2dlbmVyYXRlUG9zaXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgaSxzLG4sYSxvPXRoaXMub3B0aW9ucyxyPXRoaXMuX2lzUm9vdE5vZGUodGhpcy5zY3JvbGxQYXJlbnRbMF0pLGg9ZS5wYWdlWCxsPWUucGFnZVk7cmV0dXJuIHImJnRoaXMub2Zmc2V0LnNjcm9sbHx8KHRoaXMub2Zmc2V0LnNjcm9sbD17dG9wOnRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpfSksdCYmKHRoaXMuY29udGFpbm1lbnQmJih0aGlzLnJlbGF0aXZlQ29udGFpbmVyPyhzPXRoaXMucmVsYXRpdmVDb250YWluZXIub2Zmc2V0KCksaT1bdGhpcy5jb250YWlubWVudFswXStzLmxlZnQsdGhpcy5jb250YWlubWVudFsxXStzLnRvcCx0aGlzLmNvbnRhaW5tZW50WzJdK3MubGVmdCx0aGlzLmNvbnRhaW5tZW50WzNdK3MudG9wXSk6aT10aGlzLmNvbnRhaW5tZW50LGUucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdDxpWzBdJiYoaD1pWzBdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLGUucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPGlbMV0mJihsPWlbMV0rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSxlLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+aVsyXSYmKGg9aVsyXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0KSxlLnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD5pWzNdJiYobD1pWzNdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCkpLG8uZ3JpZCYmKG49by5ncmlkWzFdP3RoaXMub3JpZ2luYWxQYWdlWStNYXRoLnJvdW5kKChsLXRoaXMub3JpZ2luYWxQYWdlWSkvby5ncmlkWzFdKSpvLmdyaWRbMV06dGhpcy5vcmlnaW5hbFBhZ2VZLGw9aT9uLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD49aVsxXXx8bi10aGlzLm9mZnNldC5jbGljay50b3A+aVszXT9uOm4tdGhpcy5vZmZzZXQuY2xpY2sudG9wPj1pWzFdP24tby5ncmlkWzFdOm4rby5ncmlkWzFdOm4sYT1vLmdyaWRbMF0/dGhpcy5vcmlnaW5hbFBhZ2VYK01hdGgucm91bmQoKGgtdGhpcy5vcmlnaW5hbFBhZ2VYKS9vLmdyaWRbMF0pKm8uZ3JpZFswXTp0aGlzLm9yaWdpbmFsUGFnZVgsaD1pP2EtdGhpcy5vZmZzZXQuY2xpY2subGVmdD49aVswXXx8YS10aGlzLm9mZnNldC5jbGljay5sZWZ0PmlbMl0/YTphLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+PWlbMF0/YS1vLmdyaWRbMF06YStvLmdyaWRbMF06YSksXCJ5XCI9PT1vLmF4aXMmJihoPXRoaXMub3JpZ2luYWxQYWdlWCksXCJ4XCI9PT1vLmF4aXMmJihsPXRoaXMub3JpZ2luYWxQYWdlWSkpLHt0b3A6bC10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKFwiZml4ZWRcIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMub2Zmc2V0LnNjcm9sbC50b3A6cj8wOnRoaXMub2Zmc2V0LnNjcm9sbC50b3ApLGxlZnQ6aC10aGlzLm9mZnNldC5jbGljay5sZWZ0LXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQrKFwiZml4ZWRcIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMub2Zmc2V0LnNjcm9sbC5sZWZ0OnI/MDp0aGlzLm9mZnNldC5zY3JvbGwubGVmdCl9fSxfY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmhlbHBlci5yZW1vdmVDbGFzcyhcInVpLWRyYWdnYWJsZS1kcmFnZ2luZ1wiKSx0aGlzLmhlbHBlclswXT09PXRoaXMuZWxlbWVudFswXXx8dGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsfHx0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsLHRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSx0aGlzLmRlc3Ryb3lPbkNsZWFyJiZ0aGlzLmRlc3Ryb3koKX0sX25vcm1hbGl6ZVJpZ2h0Qm90dG9tOmZ1bmN0aW9uKCl7XCJ5XCIhPT10aGlzLm9wdGlvbnMuYXhpcyYmXCJhdXRvXCIhPT10aGlzLmhlbHBlci5jc3MoXCJyaWdodFwiKSYmKHRoaXMuaGVscGVyLndpZHRoKHRoaXMuaGVscGVyLndpZHRoKCkpLHRoaXMuaGVscGVyLmNzcyhcInJpZ2h0XCIsXCJhdXRvXCIpKSxcInhcIiE9PXRoaXMub3B0aW9ucy5heGlzJiZcImF1dG9cIiE9PXRoaXMuaGVscGVyLmNzcyhcImJvdHRvbVwiKSYmKHRoaXMuaGVscGVyLmhlaWdodCh0aGlzLmhlbHBlci5oZWlnaHQoKSksdGhpcy5oZWxwZXIuY3NzKFwiYm90dG9tXCIsXCJhdXRvXCIpKX0sX3RyaWdnZXI6ZnVuY3Rpb24odCxpLHMpe3JldHVybiBzPXN8fHRoaXMuX3VpSGFzaCgpLGUudWkucGx1Z2luLmNhbGwodGhpcyx0LFtpLHMsdGhpc10sITApLC9eKGRyYWd8c3RhcnR8c3RvcCkvLnRlc3QodCkmJih0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKFwiYWJzb2x1dGVcIikscy5vZmZzZXQ9dGhpcy5wb3NpdGlvbkFicyksZS5XaWRnZXQucHJvdG90eXBlLl90cmlnZ2VyLmNhbGwodGhpcyx0LGkscyl9LHBsdWdpbnM6e30sX3VpSGFzaDpmdW5jdGlvbigpe3JldHVybntoZWxwZXI6dGhpcy5oZWxwZXIscG9zaXRpb246dGhpcy5wb3NpdGlvbixvcmlnaW5hbFBvc2l0aW9uOnRoaXMub3JpZ2luYWxQb3NpdGlvbixvZmZzZXQ6dGhpcy5wb3NpdGlvbkFic319fSksZS51aS5wbHVnaW4uYWRkKFwiZHJhZ2dhYmxlXCIsXCJjb25uZWN0VG9Tb3J0YWJsZVwiLHtzdGFydDpmdW5jdGlvbih0LGkscyl7dmFyIG49ZS5leHRlbmQoe30saSx7aXRlbTpzLmVsZW1lbnR9KTtzLnNvcnRhYmxlcz1bXSxlKHMub3B0aW9ucy5jb25uZWN0VG9Tb3J0YWJsZSkuZWFjaChmdW5jdGlvbigpe3ZhciBpPWUodGhpcykuc29ydGFibGUoXCJpbnN0YW5jZVwiKTtpJiYhaS5vcHRpb25zLmRpc2FibGVkJiYocy5zb3J0YWJsZXMucHVzaChpKSxpLnJlZnJlc2hQb3NpdGlvbnMoKSxpLl90cmlnZ2VyKFwiYWN0aXZhdGVcIix0LG4pKX0pfSxzdG9wOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1lLmV4dGVuZCh7fSxpLHtpdGVtOnMuZWxlbWVudH0pO3MuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSxlLmVhY2gocy5zb3J0YWJsZXMsZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuaXNPdmVyPyhlLmlzT3Zlcj0wLHMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMCxlLmNhbmNlbEhlbHBlclJlbW92YWw9ITEsZS5fc3RvcmVkQ1NTPXtwb3NpdGlvbjplLnBsYWNlaG9sZGVyLmNzcyhcInBvc2l0aW9uXCIpLHRvcDplLnBsYWNlaG9sZGVyLmNzcyhcInRvcFwiKSxsZWZ0OmUucGxhY2Vob2xkZXIuY3NzKFwibGVmdFwiKX0sZS5fbW91c2VTdG9wKHQpLGUub3B0aW9ucy5oZWxwZXI9ZS5vcHRpb25zLl9oZWxwZXIpOihlLmNhbmNlbEhlbHBlclJlbW92YWw9ITAsZS5fdHJpZ2dlcihcImRlYWN0aXZhdGVcIix0LG4pKX0pfSxkcmFnOmZ1bmN0aW9uKHQsaSxzKXtlLmVhY2gocy5zb3J0YWJsZXMsZnVuY3Rpb24oKXt2YXIgbj0hMSxhPXRoaXM7YS5wb3NpdGlvbkFicz1zLnBvc2l0aW9uQWJzLGEuaGVscGVyUHJvcG9ydGlvbnM9cy5oZWxwZXJQcm9wb3J0aW9ucyxhLm9mZnNldC5jbGljaz1zLm9mZnNldC5jbGljayxhLl9pbnRlcnNlY3RzV2l0aChhLmNvbnRhaW5lckNhY2hlKSYmKG49ITAsZS5lYWNoKHMuc29ydGFibGVzLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb25BYnM9cy5wb3NpdGlvbkFicyx0aGlzLmhlbHBlclByb3BvcnRpb25zPXMuaGVscGVyUHJvcG9ydGlvbnMsdGhpcy5vZmZzZXQuY2xpY2s9cy5vZmZzZXQuY2xpY2ssdGhpcyE9PWEmJnRoaXMuX2ludGVyc2VjdHNXaXRoKHRoaXMuY29udGFpbmVyQ2FjaGUpJiZlLmNvbnRhaW5zKGEuZWxlbWVudFswXSx0aGlzLmVsZW1lbnRbMF0pJiYobj0hMSksbn0pKSxuPyhhLmlzT3Zlcnx8KGEuaXNPdmVyPTEscy5fcGFyZW50PWkuaGVscGVyLnBhcmVudCgpLGEuY3VycmVudEl0ZW09aS5oZWxwZXIuYXBwZW5kVG8oYS5lbGVtZW50KS5kYXRhKFwidWktc29ydGFibGUtaXRlbVwiLCEwKSxhLm9wdGlvbnMuX2hlbHBlcj1hLm9wdGlvbnMuaGVscGVyLGEub3B0aW9ucy5oZWxwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gaS5oZWxwZXJbMF19LHQudGFyZ2V0PWEuY3VycmVudEl0ZW1bMF0sYS5fbW91c2VDYXB0dXJlKHQsITApLGEuX21vdXNlU3RhcnQodCwhMCwhMCksYS5vZmZzZXQuY2xpY2sudG9wPXMub2Zmc2V0LmNsaWNrLnRvcCxhLm9mZnNldC5jbGljay5sZWZ0PXMub2Zmc2V0LmNsaWNrLmxlZnQsYS5vZmZzZXQucGFyZW50LmxlZnQtPXMub2Zmc2V0LnBhcmVudC5sZWZ0LWEub2Zmc2V0LnBhcmVudC5sZWZ0LGEub2Zmc2V0LnBhcmVudC50b3AtPXMub2Zmc2V0LnBhcmVudC50b3AtYS5vZmZzZXQucGFyZW50LnRvcCxzLl90cmlnZ2VyKFwidG9Tb3J0YWJsZVwiLHQpLHMuZHJvcHBlZD1hLmVsZW1lbnQsZS5lYWNoKHMuc29ydGFibGVzLGZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoUG9zaXRpb25zKCl9KSxzLmN1cnJlbnRJdGVtPXMuZWxlbWVudCxhLmZyb21PdXRzaWRlPXMpLGEuY3VycmVudEl0ZW0mJihhLl9tb3VzZURyYWcodCksaS5wb3NpdGlvbj1hLnBvc2l0aW9uKSk6YS5pc092ZXImJihhLmlzT3Zlcj0wLGEuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMCxhLm9wdGlvbnMuX3JldmVydD1hLm9wdGlvbnMucmV2ZXJ0LGEub3B0aW9ucy5yZXZlcnQ9ITEsYS5fdHJpZ2dlcihcIm91dFwiLHQsYS5fdWlIYXNoKGEpKSxhLl9tb3VzZVN0b3AodCwhMCksYS5vcHRpb25zLnJldmVydD1hLm9wdGlvbnMuX3JldmVydCxhLm9wdGlvbnMuaGVscGVyPWEub3B0aW9ucy5faGVscGVyLGEucGxhY2Vob2xkZXImJmEucGxhY2Vob2xkZXIucmVtb3ZlKCksaS5oZWxwZXIuYXBwZW5kVG8ocy5fcGFyZW50KSxzLl9yZWZyZXNoT2Zmc2V0cyh0KSxpLnBvc2l0aW9uPXMuX2dlbmVyYXRlUG9zaXRpb24odCwhMCkscy5fdHJpZ2dlcihcImZyb21Tb3J0YWJsZVwiLHQpLHMuZHJvcHBlZD0hMSxlLmVhY2gocy5zb3J0YWJsZXMsZnVuY3Rpb24oKXt0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKX0pKX0pfX0pLGUudWkucGx1Z2luLmFkZChcImRyYWdnYWJsZVwiLFwiY3Vyc29yXCIse3N0YXJ0OmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1lKFwiYm9keVwiKSxhPXMub3B0aW9ucztuLmNzcyhcImN1cnNvclwiKSYmKGEuX2N1cnNvcj1uLmNzcyhcImN1cnNvclwiKSksbi5jc3MoXCJjdXJzb3JcIixhLmN1cnNvcil9LHN0b3A6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPXMub3B0aW9ucztuLl9jdXJzb3ImJmUoXCJib2R5XCIpLmNzcyhcImN1cnNvclwiLG4uX2N1cnNvcil9fSksZS51aS5wbHVnaW4uYWRkKFwiZHJhZ2dhYmxlXCIsXCJvcGFjaXR5XCIse3N0YXJ0OmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1lKGkuaGVscGVyKSxhPXMub3B0aW9ucztuLmNzcyhcIm9wYWNpdHlcIikmJihhLl9vcGFjaXR5PW4uY3NzKFwib3BhY2l0eVwiKSksbi5jc3MoXCJvcGFjaXR5XCIsYS5vcGFjaXR5KX0sc3RvcDpmdW5jdGlvbih0LGkscyl7dmFyIG49cy5vcHRpb25zO24uX29wYWNpdHkmJmUoaS5oZWxwZXIpLmNzcyhcIm9wYWNpdHlcIixuLl9vcGFjaXR5KX19KSxlLnVpLnBsdWdpbi5hZGQoXCJkcmFnZ2FibGVcIixcInNjcm9sbFwiLHtzdGFydDpmdW5jdGlvbihlLHQsaSl7aS5zY3JvbGxQYXJlbnROb3RIaWRkZW58fChpLnNjcm9sbFBhcmVudE5vdEhpZGRlbj1pLmhlbHBlci5zY3JvbGxQYXJlbnQoITEpKSxpLnNjcm9sbFBhcmVudE5vdEhpZGRlblswXSE9PWkuZG9jdW1lbnRbMF0mJlwiSFRNTFwiIT09aS5zY3JvbGxQYXJlbnROb3RIaWRkZW5bMF0udGFnTmFtZSYmKGkub3ZlcmZsb3dPZmZzZXQ9aS5zY3JvbGxQYXJlbnROb3RIaWRkZW4ub2Zmc2V0KCkpfSxkcmFnOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1zLm9wdGlvbnMsYT0hMSxvPXMuc2Nyb2xsUGFyZW50Tm90SGlkZGVuWzBdLHI9cy5kb2N1bWVudFswXTtvIT09ciYmXCJIVE1MXCIhPT1vLnRhZ05hbWU/KG4uYXhpcyYmXCJ4XCI9PT1uLmF4aXN8fChzLm92ZXJmbG93T2Zmc2V0LnRvcCtvLm9mZnNldEhlaWdodC10LnBhZ2VZPG4uc2Nyb2xsU2Vuc2l0aXZpdHk/by5zY3JvbGxUb3A9YT1vLnNjcm9sbFRvcCtuLnNjcm9sbFNwZWVkOnQucGFnZVktcy5vdmVyZmxvd09mZnNldC50b3A8bi5zY3JvbGxTZW5zaXRpdml0eSYmKG8uc2Nyb2xsVG9wPWE9by5zY3JvbGxUb3Atbi5zY3JvbGxTcGVlZCkpLG4uYXhpcyYmXCJ5XCI9PT1uLmF4aXN8fChzLm92ZXJmbG93T2Zmc2V0LmxlZnQrby5vZmZzZXRXaWR0aC10LnBhZ2VYPG4uc2Nyb2xsU2Vuc2l0aXZpdHk/by5zY3JvbGxMZWZ0PWE9by5zY3JvbGxMZWZ0K24uc2Nyb2xsU3BlZWQ6dC5wYWdlWC1zLm92ZXJmbG93T2Zmc2V0LmxlZnQ8bi5zY3JvbGxTZW5zaXRpdml0eSYmKG8uc2Nyb2xsTGVmdD1hPW8uc2Nyb2xsTGVmdC1uLnNjcm9sbFNwZWVkKSkpOihuLmF4aXMmJlwieFwiPT09bi5heGlzfHwodC5wYWdlWS1lKHIpLnNjcm9sbFRvcCgpPG4uc2Nyb2xsU2Vuc2l0aXZpdHk/YT1lKHIpLnNjcm9sbFRvcChlKHIpLnNjcm9sbFRvcCgpLW4uc2Nyb2xsU3BlZWQpOmUod2luZG93KS5oZWlnaHQoKS0odC5wYWdlWS1lKHIpLnNjcm9sbFRvcCgpKTxuLnNjcm9sbFNlbnNpdGl2aXR5JiYoYT1lKHIpLnNjcm9sbFRvcChlKHIpLnNjcm9sbFRvcCgpK24uc2Nyb2xsU3BlZWQpKSksbi5heGlzJiZcInlcIj09PW4uYXhpc3x8KHQucGFnZVgtZShyKS5zY3JvbGxMZWZ0KCk8bi5zY3JvbGxTZW5zaXRpdml0eT9hPWUocikuc2Nyb2xsTGVmdChlKHIpLnNjcm9sbExlZnQoKS1uLnNjcm9sbFNwZWVkKTplKHdpbmRvdykud2lkdGgoKS0odC5wYWdlWC1lKHIpLnNjcm9sbExlZnQoKSk8bi5zY3JvbGxTZW5zaXRpdml0eSYmKGE9ZShyKS5zY3JvbGxMZWZ0KGUocikuc2Nyb2xsTGVmdCgpK24uc2Nyb2xsU3BlZWQpKSkpLGEhPT0hMSYmZS51aS5kZG1hbmFnZXImJiFuLmRyb3BCZWhhdmlvdXImJmUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHMsdCl9fSksZS51aS5wbHVnaW4uYWRkKFwiZHJhZ2dhYmxlXCIsXCJzbmFwXCIse3N0YXJ0OmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1zLm9wdGlvbnM7cy5zbmFwRWxlbWVudHM9W10sZShuLnNuYXAuY29uc3RydWN0b3IhPT1TdHJpbmc/bi5zbmFwLml0ZW1zfHxcIjpkYXRhKHVpLWRyYWdnYWJsZSlcIjpuLnNuYXApLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC5vZmZzZXQoKTt0aGlzIT09cy5lbGVtZW50WzBdJiZzLnNuYXBFbGVtZW50cy5wdXNoKHtpdGVtOnRoaXMsd2lkdGg6dC5vdXRlcldpZHRoKCksaGVpZ2h0OnQub3V0ZXJIZWlnaHQoKSx0b3A6aS50b3AsbGVmdDppLmxlZnR9KX0pfSxkcmFnOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbixhLG8scixoLGwsdSxkLGMscCxmPXMub3B0aW9ucyxtPWYuc25hcFRvbGVyYW5jZSxnPWkub2Zmc2V0LmxlZnQsdj1nK3MuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgseT1pLm9mZnNldC50b3AsYj15K3MuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0O2ZvcihjPXMuc25hcEVsZW1lbnRzLmxlbmd0aC0xO2M+PTA7Yy0tKWg9cy5zbmFwRWxlbWVudHNbY10ubGVmdC1zLm1hcmdpbnMubGVmdCxsPWgrcy5zbmFwRWxlbWVudHNbY10ud2lkdGgsdT1zLnNuYXBFbGVtZW50c1tjXS50b3Atcy5tYXJnaW5zLnRvcCxkPXUrcy5zbmFwRWxlbWVudHNbY10uaGVpZ2h0LGgtbT52fHxnPmwrbXx8dS1tPmJ8fHk+ZCttfHwhZS5jb250YWlucyhzLnNuYXBFbGVtZW50c1tjXS5pdGVtLm93bmVyRG9jdW1lbnQscy5zbmFwRWxlbWVudHNbY10uaXRlbSk/KHMuc25hcEVsZW1lbnRzW2NdLnNuYXBwaW5nJiZzLm9wdGlvbnMuc25hcC5yZWxlYXNlJiZzLm9wdGlvbnMuc25hcC5yZWxlYXNlLmNhbGwocy5lbGVtZW50LHQsZS5leHRlbmQocy5fdWlIYXNoKCkse3NuYXBJdGVtOnMuc25hcEVsZW1lbnRzW2NdLml0ZW19KSkscy5zbmFwRWxlbWVudHNbY10uc25hcHBpbmc9ITEpOihcImlubmVyXCIhPT1mLnNuYXBNb2RlJiYobj1tPj1NYXRoLmFicyh1LWIpLGE9bT49TWF0aC5hYnMoZC15KSxvPW0+PU1hdGguYWJzKGgtdikscj1tPj1NYXRoLmFicyhsLWcpLG4mJihpLnBvc2l0aW9uLnRvcD1zLl9jb252ZXJ0UG9zaXRpb25UbyhcInJlbGF0aXZlXCIse3RvcDp1LXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGxlZnQ6MH0pLnRvcCksYSYmKGkucG9zaXRpb24udG9wPXMuX2NvbnZlcnRQb3NpdGlvblRvKFwicmVsYXRpdmVcIix7dG9wOmQsbGVmdDowfSkudG9wKSxvJiYoaS5wb3NpdGlvbi5sZWZ0PXMuX2NvbnZlcnRQb3NpdGlvblRvKFwicmVsYXRpdmVcIix7dG9wOjAsbGVmdDpoLXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGh9KS5sZWZ0KSxyJiYoaS5wb3NpdGlvbi5sZWZ0PXMuX2NvbnZlcnRQb3NpdGlvblRvKFwicmVsYXRpdmVcIix7dG9wOjAsbGVmdDpsfSkubGVmdCkpLHA9bnx8YXx8b3x8cixcIm91dGVyXCIhPT1mLnNuYXBNb2RlJiYobj1tPj1NYXRoLmFicyh1LXkpLGE9bT49TWF0aC5hYnMoZC1iKSxvPW0+PU1hdGguYWJzKGgtZykscj1tPj1NYXRoLmFicyhsLXYpLG4mJihpLnBvc2l0aW9uLnRvcD1zLl9jb252ZXJ0UG9zaXRpb25UbyhcInJlbGF0aXZlXCIse3RvcDp1LGxlZnQ6MH0pLnRvcCksYSYmKGkucG9zaXRpb24udG9wPXMuX2NvbnZlcnRQb3NpdGlvblRvKFwicmVsYXRpdmVcIix7dG9wOmQtcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsbGVmdDowfSkudG9wKSxvJiYoaS5wb3NpdGlvbi5sZWZ0PXMuX2NvbnZlcnRQb3NpdGlvblRvKFwicmVsYXRpdmVcIix7dG9wOjAsbGVmdDpofSkubGVmdCksciYmKGkucG9zaXRpb24ubGVmdD1zLl9jb252ZXJ0UG9zaXRpb25UbyhcInJlbGF0aXZlXCIse3RvcDowLGxlZnQ6bC1zLmhlbHBlclByb3BvcnRpb25zLndpZHRofSkubGVmdCkpLCFzLnNuYXBFbGVtZW50c1tjXS5zbmFwcGluZyYmKG58fGF8fG98fHJ8fHApJiZzLm9wdGlvbnMuc25hcC5zbmFwJiZzLm9wdGlvbnMuc25hcC5zbmFwLmNhbGwocy5lbGVtZW50LHQsZS5leHRlbmQocy5fdWlIYXNoKCkse3NuYXBJdGVtOnMuc25hcEVsZW1lbnRzW2NdLml0ZW19KSkscy5zbmFwRWxlbWVudHNbY10uc25hcHBpbmc9bnx8YXx8b3x8cnx8cCl9fSksZS51aS5wbHVnaW4uYWRkKFwiZHJhZ2dhYmxlXCIsXCJzdGFja1wiLHtzdGFydDpmdW5jdGlvbih0LGkscyl7dmFyIG4sYT1zLm9wdGlvbnMsbz1lLm1ha2VBcnJheShlKGEuc3RhY2spKS5zb3J0KGZ1bmN0aW9uKHQsaSl7cmV0dXJuKHBhcnNlSW50KGUodCkuY3NzKFwiekluZGV4XCIpLDEwKXx8MCktKHBhcnNlSW50KGUoaSkuY3NzKFwiekluZGV4XCIpLDEwKXx8MCl9KTtvLmxlbmd0aCYmKG49cGFyc2VJbnQoZShvWzBdKS5jc3MoXCJ6SW5kZXhcIiksMTApfHwwLGUobykuZWFjaChmdW5jdGlvbih0KXtlKHRoaXMpLmNzcyhcInpJbmRleFwiLG4rdCl9KSx0aGlzLmNzcyhcInpJbmRleFwiLG4rby5sZW5ndGgpKX19KSxlLnVpLnBsdWdpbi5hZGQoXCJkcmFnZ2FibGVcIixcInpJbmRleFwiLHtzdGFydDpmdW5jdGlvbih0LGkscyl7dmFyIG49ZShpLmhlbHBlciksYT1zLm9wdGlvbnM7bi5jc3MoXCJ6SW5kZXhcIikmJihhLl96SW5kZXg9bi5jc3MoXCJ6SW5kZXhcIikpLG4uY3NzKFwiekluZGV4XCIsYS56SW5kZXgpfSxzdG9wOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1zLm9wdGlvbnM7bi5fekluZGV4JiZlKGkuaGVscGVyKS5jc3MoXCJ6SW5kZXhcIixuLl96SW5kZXgpfX0pLGUudWkuZHJhZ2dhYmxlLGUud2lkZ2V0KFwidWkucmVzaXphYmxlXCIsZS51aS5tb3VzZSx7dmVyc2lvbjpcIjEuMTEuNFwiLHdpZGdldEV2ZW50UHJlZml4OlwicmVzaXplXCIsb3B0aW9uczp7YWxzb1Jlc2l6ZTohMSxhbmltYXRlOiExLGFuaW1hdGVEdXJhdGlvbjpcInNsb3dcIixhbmltYXRlRWFzaW5nOlwic3dpbmdcIixhc3BlY3RSYXRpbzohMSxhdXRvSGlkZTohMSxjb250YWlubWVudDohMSxnaG9zdDohMSxncmlkOiExLGhhbmRsZXM6XCJlLHMsc2VcIixoZWxwZXI6ITEsbWF4SGVpZ2h0Om51bGwsbWF4V2lkdGg6bnVsbCxtaW5IZWlnaHQ6MTAsbWluV2lkdGg6MTAsekluZGV4OjkwLHJlc2l6ZTpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsfSxfbnVtOmZ1bmN0aW9uKGUpe3JldHVybiBwYXJzZUludChlLDEwKXx8MH0sX2lzTnVtYmVyOmZ1bmN0aW9uKGUpe3JldHVybiFpc05hTihwYXJzZUludChlLDEwKSl9LF9oYXNTY3JvbGw6ZnVuY3Rpb24odCxpKXtpZihcImhpZGRlblwiPT09ZSh0KS5jc3MoXCJvdmVyZmxvd1wiKSlyZXR1cm4hMTt2YXIgcz1pJiZcImxlZnRcIj09PWk/XCJzY3JvbGxMZWZ0XCI6XCJzY3JvbGxUb3BcIixuPSExO3JldHVybiB0W3NdPjA/ITA6KHRbc109MSxuPXRbc10+MCx0W3NdPTAsbil9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdCxpLHMsbixhLG89dGhpcyxyPXRoaXMub3B0aW9ucztpZih0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoXCJ1aS1yZXNpemFibGVcIiksZS5leHRlbmQodGhpcyx7X2FzcGVjdFJhdGlvOiEhci5hc3BlY3RSYXRpbyxhc3BlY3RSYXRpbzpyLmFzcGVjdFJhdGlvLG9yaWdpbmFsRWxlbWVudDp0aGlzLmVsZW1lbnQsX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHM6W10sX2hlbHBlcjpyLmhlbHBlcnx8ci5naG9zdHx8ci5hbmltYXRlP3IuaGVscGVyfHxcInVpLXJlc2l6YWJsZS1oZWxwZXJcIjpudWxsfSksdGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9eKGNhbnZhc3x0ZXh0YXJlYXxpbnB1dHxzZWxlY3R8YnV0dG9ufGltZykkL2kpJiYodGhpcy5lbGVtZW50LndyYXAoZShcIjxkaXYgY2xhc3M9J3VpLXdyYXBwZXInIHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuOyc+PC9kaXY+XCIpLmNzcyh7cG9zaXRpb246dGhpcy5lbGVtZW50LmNzcyhcInBvc2l0aW9uXCIpLHdpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpLHRvcDp0aGlzLmVsZW1lbnQuY3NzKFwidG9wXCIpLGxlZnQ6dGhpcy5lbGVtZW50LmNzcyhcImxlZnRcIil9KSksdGhpcy5lbGVtZW50PXRoaXMuZWxlbWVudC5wYXJlbnQoKS5kYXRhKFwidWktcmVzaXphYmxlXCIsdGhpcy5lbGVtZW50LnJlc2l6YWJsZShcImluc3RhbmNlXCIpKSx0aGlzLmVsZW1lbnRJc1dyYXBwZXI9ITAsdGhpcy5lbGVtZW50LmNzcyh7bWFyZ2luTGVmdDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoXCJtYXJnaW5MZWZ0XCIpLG1hcmdpblRvcDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoXCJtYXJnaW5Ub3BcIiksbWFyZ2luUmlnaHQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKFwibWFyZ2luUmlnaHRcIiksbWFyZ2luQm90dG9tOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyhcIm1hcmdpbkJvdHRvbVwiKX0pLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7bWFyZ2luTGVmdDowLG1hcmdpblRvcDowLG1hcmdpblJpZ2h0OjAsbWFyZ2luQm90dG9tOjB9KSx0aGlzLm9yaWdpbmFsUmVzaXplU3R5bGU9dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKFwicmVzaXplXCIpLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyhcInJlc2l6ZVwiLFwibm9uZVwiKSx0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLnB1c2godGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHtwb3NpdGlvbjpcInN0YXRpY1wiLHpvb206MSxkaXNwbGF5OlwiYmxvY2tcIn0pKSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21hcmdpbjp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoXCJtYXJnaW5cIil9KSx0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpKSx0aGlzLmhhbmRsZXM9ci5oYW5kbGVzfHwoZShcIi51aS1yZXNpemFibGUtaGFuZGxlXCIsdGhpcy5lbGVtZW50KS5sZW5ndGg/e246XCIudWktcmVzaXphYmxlLW5cIixlOlwiLnVpLXJlc2l6YWJsZS1lXCIsczpcIi51aS1yZXNpemFibGUtc1wiLHc6XCIudWktcmVzaXphYmxlLXdcIixzZTpcIi51aS1yZXNpemFibGUtc2VcIixzdzpcIi51aS1yZXNpemFibGUtc3dcIixuZTpcIi51aS1yZXNpemFibGUtbmVcIixudzpcIi51aS1yZXNpemFibGUtbndcIn06XCJlLHMsc2VcIiksdGhpcy5faGFuZGxlcz1lKCksdGhpcy5oYW5kbGVzLmNvbnN0cnVjdG9yPT09U3RyaW5nKWZvcihcImFsbFwiPT09dGhpcy5oYW5kbGVzJiYodGhpcy5oYW5kbGVzPVwibixlLHMsdyxzZSxzdyxuZSxud1wiKSx0PXRoaXMuaGFuZGxlcy5zcGxpdChcIixcIiksdGhpcy5oYW5kbGVzPXt9LGk9MDt0Lmxlbmd0aD5pO2krKylzPWUudHJpbSh0W2ldKSxhPVwidWktcmVzaXphYmxlLVwiK3Msbj1lKFwiPGRpdiBjbGFzcz0ndWktcmVzaXphYmxlLWhhbmRsZSBcIithK1wiJz48L2Rpdj5cIiksbi5jc3Moe3pJbmRleDpyLnpJbmRleH0pLFwic2VcIj09PXMmJm4uYWRkQ2xhc3MoXCJ1aS1pY29uIHVpLWljb24tZ3JpcHNtYWxsLWRpYWdvbmFsLXNlXCIpLHRoaXMuaGFuZGxlc1tzXT1cIi51aS1yZXNpemFibGUtXCIrcyx0aGlzLmVsZW1lbnQuYXBwZW5kKG4pO3RoaXMuX3JlbmRlckF4aXM9ZnVuY3Rpb24odCl7dmFyIGkscyxuLGE7dD10fHx0aGlzLmVsZW1lbnQ7Zm9yKGkgaW4gdGhpcy5oYW5kbGVzKXRoaXMuaGFuZGxlc1tpXS5jb25zdHJ1Y3Rvcj09PVN0cmluZz90aGlzLmhhbmRsZXNbaV09dGhpcy5lbGVtZW50LmNoaWxkcmVuKHRoaXMuaGFuZGxlc1tpXSkuZmlyc3QoKS5zaG93KCk6KHRoaXMuaGFuZGxlc1tpXS5qcXVlcnl8fHRoaXMuaGFuZGxlc1tpXS5ub2RlVHlwZSkmJih0aGlzLmhhbmRsZXNbaV09ZSh0aGlzLmhhbmRsZXNbaV0pLHRoaXMuX29uKHRoaXMuaGFuZGxlc1tpXSx7bW91c2Vkb3duOm8uX21vdXNlRG93bn0pKSx0aGlzLmVsZW1lbnRJc1dyYXBwZXImJnRoaXMub3JpZ2luYWxFbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9eKHRleHRhcmVhfGlucHV0fHNlbGVjdHxidXR0b24pJC9pKSYmKHM9ZSh0aGlzLmhhbmRsZXNbaV0sdGhpcy5lbGVtZW50KSxhPS9zd3xuZXxud3xzZXxufHMvLnRlc3QoaSk/cy5vdXRlckhlaWdodCgpOnMub3V0ZXJXaWR0aCgpLG49W1wicGFkZGluZ1wiLC9uZXxud3xuLy50ZXN0KGkpP1wiVG9wXCI6L3NlfHN3fHMvLnRlc3QoaSk/XCJCb3R0b21cIjovXmUkLy50ZXN0KGkpP1wiUmlnaHRcIjpcIkxlZnRcIl0uam9pbihcIlwiKSx0LmNzcyhuLGEpLHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCkpLHRoaXMuX2hhbmRsZXM9dGhpcy5faGFuZGxlcy5hZGQodGhpcy5oYW5kbGVzW2ldKX0sdGhpcy5fcmVuZGVyQXhpcyh0aGlzLmVsZW1lbnQpLHRoaXMuX2hhbmRsZXM9dGhpcy5faGFuZGxlcy5hZGQodGhpcy5lbGVtZW50LmZpbmQoXCIudWktcmVzaXphYmxlLWhhbmRsZVwiKSksdGhpcy5faGFuZGxlcy5kaXNhYmxlU2VsZWN0aW9uKCksdGhpcy5faGFuZGxlcy5tb3VzZW92ZXIoZnVuY3Rpb24oKXtvLnJlc2l6aW5nfHwodGhpcy5jbGFzc05hbWUmJihuPXRoaXMuY2xhc3NOYW1lLm1hdGNoKC91aS1yZXNpemFibGUtKHNlfHN3fG5lfG53fG58ZXxzfHcpL2kpKSxvLmF4aXM9biYmblsxXT9uWzFdOlwic2VcIil9KSxyLmF1dG9IaWRlJiYodGhpcy5faGFuZGxlcy5oaWRlKCksZSh0aGlzLmVsZW1lbnQpLmFkZENsYXNzKFwidWktcmVzaXphYmxlLWF1dG9oaWRlXCIpLm1vdXNlZW50ZXIoZnVuY3Rpb24oKXtyLmRpc2FibGVkfHwoZSh0aGlzKS5yZW1vdmVDbGFzcyhcInVpLXJlc2l6YWJsZS1hdXRvaGlkZVwiKSxvLl9oYW5kbGVzLnNob3coKSl9KS5tb3VzZWxlYXZlKGZ1bmN0aW9uKCl7ci5kaXNhYmxlZHx8by5yZXNpemluZ3x8KGUodGhpcykuYWRkQ2xhc3MoXCJ1aS1yZXNpemFibGUtYXV0b2hpZGVcIiksby5faGFuZGxlcy5oaWRlKCkpfSkpLHRoaXMuX21vdXNlSW5pdCgpfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX21vdXNlRGVzdHJveSgpO3ZhciB0LGk9ZnVuY3Rpb24odCl7ZSh0KS5yZW1vdmVDbGFzcyhcInVpLXJlc2l6YWJsZSB1aS1yZXNpemFibGUtZGlzYWJsZWQgdWktcmVzaXphYmxlLXJlc2l6aW5nXCIpLnJlbW92ZURhdGEoXCJyZXNpemFibGVcIikucmVtb3ZlRGF0YShcInVpLXJlc2l6YWJsZVwiKS51bmJpbmQoXCIucmVzaXphYmxlXCIpLmZpbmQoXCIudWktcmVzaXphYmxlLWhhbmRsZVwiKS5yZW1vdmUoKX07cmV0dXJuIHRoaXMuZWxlbWVudElzV3JhcHBlciYmKGkodGhpcy5lbGVtZW50KSx0PXRoaXMuZWxlbWVudCx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe3Bvc2l0aW9uOnQuY3NzKFwicG9zaXRpb25cIiksd2lkdGg6dC5vdXRlcldpZHRoKCksaGVpZ2h0OnQub3V0ZXJIZWlnaHQoKSx0b3A6dC5jc3MoXCJ0b3BcIiksbGVmdDp0LmNzcyhcImxlZnRcIil9KS5pbnNlcnRBZnRlcih0KSx0LnJlbW92ZSgpKSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoXCJyZXNpemVcIix0aGlzLm9yaWdpbmFsUmVzaXplU3R5bGUpLGkodGhpcy5vcmlnaW5hbEVsZW1lbnQpLHRoaXN9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24odCl7dmFyIGkscyxuPSExO2ZvcihpIGluIHRoaXMuaGFuZGxlcylzPWUodGhpcy5oYW5kbGVzW2ldKVswXSwocz09PXQudGFyZ2V0fHxlLmNvbnRhaW5zKHMsdC50YXJnZXQpKSYmKG49ITApO3JldHVybiF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJm59LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhPXRoaXMub3B0aW9ucyxvPXRoaXMuZWxlbWVudDtyZXR1cm4gdGhpcy5yZXNpemluZz0hMCx0aGlzLl9yZW5kZXJQcm94eSgpLGk9dGhpcy5fbnVtKHRoaXMuaGVscGVyLmNzcyhcImxlZnRcIikpLHM9dGhpcy5fbnVtKHRoaXMuaGVscGVyLmNzcyhcInRvcFwiKSksYS5jb250YWlubWVudCYmKGkrPWUoYS5jb250YWlubWVudCkuc2Nyb2xsTGVmdCgpfHwwLHMrPWUoYS5jb250YWlubWVudCkuc2Nyb2xsVG9wKCl8fDApLHRoaXMub2Zmc2V0PXRoaXMuaGVscGVyLm9mZnNldCgpLHRoaXMucG9zaXRpb249e2xlZnQ6aSx0b3A6c30sdGhpcy5zaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6dGhpcy5oZWxwZXIud2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIuaGVpZ2h0KCl9Ont3aWR0aDpvLndpZHRoKCksaGVpZ2h0Om8uaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxTaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6by5vdXRlcldpZHRoKCksaGVpZ2h0Om8ub3V0ZXJIZWlnaHQoKX06e3dpZHRoOm8ud2lkdGgoKSxoZWlnaHQ6by5oZWlnaHQoKX0sdGhpcy5zaXplRGlmZj17d2lkdGg6by5vdXRlcldpZHRoKCktby53aWR0aCgpLGhlaWdodDpvLm91dGVySGVpZ2h0KCktby5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXtsZWZ0OmksdG9wOnN9LHRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uPXtsZWZ0OnQucGFnZVgsdG9wOnQucGFnZVl9LHRoaXMuYXNwZWN0UmF0aW89XCJudW1iZXJcIj09dHlwZW9mIGEuYXNwZWN0UmF0aW8/YS5hc3BlY3RSYXRpbzp0aGlzLm9yaWdpbmFsU2l6ZS53aWR0aC90aGlzLm9yaWdpbmFsU2l6ZS5oZWlnaHR8fDEsbj1lKFwiLnVpLXJlc2l6YWJsZS1cIit0aGlzLmF4aXMpLmNzcyhcImN1cnNvclwiKSxlKFwiYm9keVwiKS5jc3MoXCJjdXJzb3JcIixcImF1dG9cIj09PW4/dGhpcy5heGlzK1wiLXJlc2l6ZVwiOm4pLG8uYWRkQ2xhc3MoXCJ1aS1yZXNpemFibGUtcmVzaXppbmdcIiksdGhpcy5fcHJvcGFnYXRlKFwic3RhcnRcIix0KSwhMH0sX21vdXNlRHJhZzpmdW5jdGlvbih0KXt2YXIgaSxzLG49dGhpcy5vcmlnaW5hbE1vdXNlUG9zaXRpb24sYT10aGlzLmF4aXMsbz10LnBhZ2VYLW4ubGVmdHx8MCxyPXQucGFnZVktbi50b3B8fDAsaD10aGlzLl9jaGFuZ2VbYV07cmV0dXJuIHRoaXMuX3VwZGF0ZVByZXZQcm9wZXJ0aWVzKCksaD8oaT1oLmFwcGx5KHRoaXMsW3QsbyxyXSksdGhpcy5fdXBkYXRlVmlydHVhbEJvdW5kYXJpZXModC5zaGlmdEtleSksKHRoaXMuX2FzcGVjdFJhdGlvfHx0LnNoaWZ0S2V5KSYmKGk9dGhpcy5fdXBkYXRlUmF0aW8oaSx0KSksaT10aGlzLl9yZXNwZWN0U2l6ZShpLHQpLHRoaXMuX3VwZGF0ZUNhY2hlKGkpLHRoaXMuX3Byb3BhZ2F0ZShcInJlc2l6ZVwiLHQpLHM9dGhpcy5fYXBwbHlDaGFuZ2VzKCksIXRoaXMuX2hlbHBlciYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5sZW5ndGgmJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCksZS5pc0VtcHR5T2JqZWN0KHMpfHwodGhpcy5fdXBkYXRlUHJldlByb3BlcnRpZXMoKSx0aGlzLl90cmlnZ2VyKFwicmVzaXplXCIsdCx0aGlzLnVpKCkpLHRoaXMuX2FwcGx5Q2hhbmdlcygpKSwhMSk6ITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24odCl7dGhpcy5yZXNpemluZz0hMTt2YXIgaSxzLG4sYSxvLHIsaCxsPXRoaXMub3B0aW9ucyx1PXRoaXM7cmV0dXJuIHRoaXMuX2hlbHBlciYmKGk9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cyxzPWkubGVuZ3RoJiYvdGV4dGFyZWEvaS50ZXN0KGlbMF0ubm9kZU5hbWUpLG49cyYmdGhpcy5faGFzU2Nyb2xsKGlbMF0sXCJsZWZ0XCIpPzA6dS5zaXplRGlmZi5oZWlnaHQsYT1zPzA6dS5zaXplRGlmZi53aWR0aCxvPXt3aWR0aDp1LmhlbHBlci53aWR0aCgpLWEsaGVpZ2h0OnUuaGVscGVyLmhlaWdodCgpLW59LHI9cGFyc2VJbnQodS5lbGVtZW50LmNzcyhcImxlZnRcIiksMTApKyh1LnBvc2l0aW9uLmxlZnQtdS5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpfHxudWxsLGg9cGFyc2VJbnQodS5lbGVtZW50LmNzcyhcInRvcFwiKSwxMCkrKHUucG9zaXRpb24udG9wLXUub3JpZ2luYWxQb3NpdGlvbi50b3ApfHxudWxsLGwuYW5pbWF0ZXx8dGhpcy5lbGVtZW50LmNzcyhlLmV4dGVuZChvLHt0b3A6aCxsZWZ0OnJ9KSksdS5oZWxwZXIuaGVpZ2h0KHUuc2l6ZS5oZWlnaHQpLHUuaGVscGVyLndpZHRoKHUuc2l6ZS53aWR0aCksdGhpcy5faGVscGVyJiYhbC5hbmltYXRlJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpKSxlKFwiYm9keVwiKS5jc3MoXCJjdXJzb3JcIixcImF1dG9cIiksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKFwidWktcmVzaXphYmxlLXJlc2l6aW5nXCIpLHRoaXMuX3Byb3BhZ2F0ZShcInN0b3BcIix0KSx0aGlzLl9oZWxwZXImJnRoaXMuaGVscGVyLnJlbW92ZSgpLCExfSxfdXBkYXRlUHJldlByb3BlcnRpZXM6ZnVuY3Rpb24oKXt0aGlzLnByZXZQb3NpdGlvbj17dG9wOnRoaXMucG9zaXRpb24udG9wLGxlZnQ6dGhpcy5wb3NpdGlvbi5sZWZ0fSx0aGlzLnByZXZTaXplPXt3aWR0aDp0aGlzLnNpemUud2lkdGgsaGVpZ2h0OnRoaXMuc2l6ZS5oZWlnaHR9fSxfYXBwbHlDaGFuZ2VzOmZ1bmN0aW9uKCl7dmFyIGU9e307cmV0dXJuIHRoaXMucG9zaXRpb24udG9wIT09dGhpcy5wcmV2UG9zaXRpb24udG9wJiYoZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArXCJweFwiKSx0aGlzLnBvc2l0aW9uLmxlZnQhPT10aGlzLnByZXZQb3NpdGlvbi5sZWZ0JiYoZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCtcInB4XCIpLHRoaXMuc2l6ZS53aWR0aCE9PXRoaXMucHJldlNpemUud2lkdGgmJihlLndpZHRoPXRoaXMuc2l6ZS53aWR0aCtcInB4XCIpLHRoaXMuc2l6ZS5oZWlnaHQhPT10aGlzLnByZXZTaXplLmhlaWdodCYmKGUuaGVpZ2h0PXRoaXMuc2l6ZS5oZWlnaHQrXCJweFwiKSx0aGlzLmhlbHBlci5jc3MoZSksZX0sX3VwZGF0ZVZpcnR1YWxCb3VuZGFyaWVzOmZ1bmN0aW9uKGUpe3ZhciB0LGkscyxuLGEsbz10aGlzLm9wdGlvbnM7YT17bWluV2lkdGg6dGhpcy5faXNOdW1iZXIoby5taW5XaWR0aCk/by5taW5XaWR0aDowLG1heFdpZHRoOnRoaXMuX2lzTnVtYmVyKG8ubWF4V2lkdGgpP28ubWF4V2lkdGg6MS8wLG1pbkhlaWdodDp0aGlzLl9pc051bWJlcihvLm1pbkhlaWdodCk/by5taW5IZWlnaHQ6MCxtYXhIZWlnaHQ6dGhpcy5faXNOdW1iZXIoby5tYXhIZWlnaHQpP28ubWF4SGVpZ2h0OjEvMH0sKHRoaXMuX2FzcGVjdFJhdGlvfHxlKSYmKHQ9YS5taW5IZWlnaHQqdGhpcy5hc3BlY3RSYXRpbyxzPWEubWluV2lkdGgvdGhpcy5hc3BlY3RSYXRpbyxpPWEubWF4SGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW8sbj1hLm1heFdpZHRoL3RoaXMuYXNwZWN0UmF0aW8sdD5hLm1pbldpZHRoJiYoYS5taW5XaWR0aD10KSxzPmEubWluSGVpZ2h0JiYoYS5taW5IZWlnaHQ9cyksYS5tYXhXaWR0aD5pJiYoYS5tYXhXaWR0aD1pKSxhLm1heEhlaWdodD5uJiYoYS5tYXhIZWlnaHQ9bikpLHRoaXMuX3ZCb3VuZGFyaWVzPWF9LF91cGRhdGVDYWNoZTpmdW5jdGlvbihlKXt0aGlzLm9mZnNldD10aGlzLmhlbHBlci5vZmZzZXQoKSx0aGlzLl9pc051bWJlcihlLmxlZnQpJiYodGhpcy5wb3NpdGlvbi5sZWZ0PWUubGVmdCksdGhpcy5faXNOdW1iZXIoZS50b3ApJiYodGhpcy5wb3NpdGlvbi50b3A9ZS50b3ApLHRoaXMuX2lzTnVtYmVyKGUuaGVpZ2h0KSYmKHRoaXMuc2l6ZS5oZWlnaHQ9ZS5oZWlnaHQpLHRoaXMuX2lzTnVtYmVyKGUud2lkdGgpJiYodGhpcy5zaXplLndpZHRoPWUud2lkdGgpfSxfdXBkYXRlUmF0aW86ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wb3NpdGlvbixpPXRoaXMuc2l6ZSxzPXRoaXMuYXhpcztyZXR1cm4gdGhpcy5faXNOdW1iZXIoZS5oZWlnaHQpP2Uud2lkdGg9ZS5oZWlnaHQqdGhpcy5hc3BlY3RSYXRpbzp0aGlzLl9pc051bWJlcihlLndpZHRoKSYmKGUuaGVpZ2h0PWUud2lkdGgvdGhpcy5hc3BlY3RSYXRpbyksXCJzd1wiPT09cyYmKGUubGVmdD10LmxlZnQrKGkud2lkdGgtZS53aWR0aCksZS50b3A9bnVsbCksXCJud1wiPT09cyYmKGUudG9wPXQudG9wKyhpLmhlaWdodC1lLmhlaWdodCksZS5sZWZ0PXQubGVmdCsoaS53aWR0aC1lLndpZHRoKSksZX0sX3Jlc3BlY3RTaXplOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3ZCb3VuZGFyaWVzLGk9dGhpcy5heGlzLHM9dGhpcy5faXNOdW1iZXIoZS53aWR0aCkmJnQubWF4V2lkdGgmJnQubWF4V2lkdGg8ZS53aWR0aCxuPXRoaXMuX2lzTnVtYmVyKGUuaGVpZ2h0KSYmdC5tYXhIZWlnaHQmJnQubWF4SGVpZ2h0PGUuaGVpZ2h0LGE9dGhpcy5faXNOdW1iZXIoZS53aWR0aCkmJnQubWluV2lkdGgmJnQubWluV2lkdGg+ZS53aWR0aCxvPXRoaXMuX2lzTnVtYmVyKGUuaGVpZ2h0KSYmdC5taW5IZWlnaHQmJnQubWluSGVpZ2h0PmUuaGVpZ2h0LHI9dGhpcy5vcmlnaW5hbFBvc2l0aW9uLmxlZnQrdGhpcy5vcmlnaW5hbFNpemUud2lkdGgsaD10aGlzLnBvc2l0aW9uLnRvcCt0aGlzLnNpemUuaGVpZ2h0LGw9L3N3fG53fHcvLnRlc3QoaSksdT0vbnd8bmV8bi8udGVzdChpKTtyZXR1cm4gYSYmKGUud2lkdGg9dC5taW5XaWR0aCksbyYmKGUuaGVpZ2h0PXQubWluSGVpZ2h0KSxzJiYoZS53aWR0aD10Lm1heFdpZHRoKSxuJiYoZS5oZWlnaHQ9dC5tYXhIZWlnaHQpLGEmJmwmJihlLmxlZnQ9ci10Lm1pbldpZHRoKSxzJiZsJiYoZS5sZWZ0PXItdC5tYXhXaWR0aCksbyYmdSYmKGUudG9wPWgtdC5taW5IZWlnaHQpLG4mJnUmJihlLnRvcD1oLXQubWF4SGVpZ2h0KSxlLndpZHRofHxlLmhlaWdodHx8ZS5sZWZ0fHwhZS50b3A/ZS53aWR0aHx8ZS5oZWlnaHR8fGUudG9wfHwhZS5sZWZ0fHwoZS5sZWZ0PW51bGwpOmUudG9wPW51bGwsZX0sX2dldFBhZGRpbmdQbHVzQm9yZGVyRGltZW5zaW9uczpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxpPVtdLHM9W2UuY3NzKFwiYm9yZGVyVG9wV2lkdGhcIiksZS5jc3MoXCJib3JkZXJSaWdodFdpZHRoXCIpLGUuY3NzKFwiYm9yZGVyQm90dG9tV2lkdGhcIiksZS5jc3MoXCJib3JkZXJMZWZ0V2lkdGhcIildLG49W2UuY3NzKFwicGFkZGluZ1RvcFwiKSxlLmNzcyhcInBhZGRpbmdSaWdodFwiKSxlLmNzcyhcInBhZGRpbmdCb3R0b21cIiksZS5jc3MoXCJwYWRkaW5nTGVmdFwiKV07ND50O3QrKylpW3RdPXBhcnNlSW50KHNbdF0sMTApfHwwLGlbdF0rPXBhcnNlSW50KG5bdF0sMTApfHwwO3JldHVybntoZWlnaHQ6aVswXStpWzJdLHdpZHRoOmlbMV0raVszXX19LF9wcm9wb3J0aW9uYWxseVJlc2l6ZTpmdW5jdGlvbigpe2lmKHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKWZvcih2YXIgZSx0PTAsaT10aGlzLmhlbHBlcnx8dGhpcy5lbGVtZW50O3RoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoPnQ7dCsrKWU9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50c1t0XSx0aGlzLm91dGVyRGltZW5zaW9uc3x8KHRoaXMub3V0ZXJEaW1lbnNpb25zPXRoaXMuX2dldFBhZGRpbmdQbHVzQm9yZGVyRGltZW5zaW9ucyhlKSksZS5jc3Moe2hlaWdodDppLmhlaWdodCgpLXRoaXMub3V0ZXJEaW1lbnNpb25zLmhlaWdodHx8MCx3aWR0aDppLndpZHRoKCktdGhpcy5vdXRlckRpbWVuc2lvbnMud2lkdGh8fDB9KX0sX3JlbmRlclByb3h5OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50LGk9dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudE9mZnNldD10Lm9mZnNldCgpLHRoaXMuX2hlbHBlcj8odGhpcy5oZWxwZXI9dGhpcy5oZWxwZXJ8fGUoXCI8ZGl2IHN0eWxlPSdvdmVyZmxvdzpoaWRkZW47Jz48L2Rpdj5cIiksdGhpcy5oZWxwZXIuYWRkQ2xhc3ModGhpcy5faGVscGVyKS5jc3Moe3dpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCktMSxoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCktMSxwb3NpdGlvbjpcImFic29sdXRlXCIsbGVmdDp0aGlzLmVsZW1lbnRPZmZzZXQubGVmdCtcInB4XCIsdG9wOnRoaXMuZWxlbWVudE9mZnNldC50b3ArXCJweFwiLHpJbmRleDorK2kuekluZGV4fSksdGhpcy5oZWxwZXIuYXBwZW5kVG8oXCJib2R5XCIpLmRpc2FibGVTZWxlY3Rpb24oKSk6dGhpcy5oZWxwZXI9dGhpcy5lbGVtZW50fSxfY2hhbmdlOntlOmZ1bmN0aW9uKGUsdCl7cmV0dXJue3dpZHRoOnRoaXMub3JpZ2luYWxTaXplLndpZHRoK3R9fSx3OmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5vcmlnaW5hbFNpemUscz10aGlzLm9yaWdpbmFsUG9zaXRpb247cmV0dXJue2xlZnQ6cy5sZWZ0K3Qsd2lkdGg6aS53aWR0aC10fX0sbjpmdW5jdGlvbihlLHQsaSl7dmFyIHM9dGhpcy5vcmlnaW5hbFNpemUsbj10aGlzLm9yaWdpbmFsUG9zaXRpb247cmV0dXJue3RvcDpuLnRvcCtpLGhlaWdodDpzLmhlaWdodC1pfX0sczpmdW5jdGlvbihlLHQsaSl7cmV0dXJue2hlaWdodDp0aGlzLm9yaWdpbmFsU2l6ZS5oZWlnaHQraX19LHNlOmZ1bmN0aW9uKHQsaSxzKXtyZXR1cm4gZS5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS5lLmFwcGx5KHRoaXMsW3QsaSxzXSkpfSxzdzpmdW5jdGlvbih0LGkscyl7cmV0dXJuIGUuZXh0ZW5kKHRoaXMuX2NoYW5nZS5zLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2Uudy5hcHBseSh0aGlzLFt0LGksc10pKX0sbmU6ZnVuY3Rpb24odCxpLHMpe3JldHVybiBlLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLmUuYXBwbHkodGhpcyxbdCxpLHNdKSl9LG53OmZ1bmN0aW9uKHQsaSxzKXtyZXR1cm4gZS5leHRlbmQodGhpcy5fY2hhbmdlLm4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsW3QsaSxzXSkpfX0sX3Byb3BhZ2F0ZTpmdW5jdGlvbih0LGkpe2UudWkucGx1Z2luLmNhbGwodGhpcyx0LFtpLHRoaXMudWkoKV0pLFwicmVzaXplXCIhPT10JiZ0aGlzLl90cmlnZ2VyKHQsaSx0aGlzLnVpKCkpfSxwbHVnaW5zOnt9LHVpOmZ1bmN0aW9uKCl7cmV0dXJue29yaWdpbmFsRWxlbWVudDp0aGlzLm9yaWdpbmFsRWxlbWVudCxlbGVtZW50OnRoaXMuZWxlbWVudCxoZWxwZXI6dGhpcy5oZWxwZXIscG9zaXRpb246dGhpcy5wb3NpdGlvbixzaXplOnRoaXMuc2l6ZSxvcmlnaW5hbFNpemU6dGhpcy5vcmlnaW5hbFNpemUsb3JpZ2luYWxQb3NpdGlvbjp0aGlzLm9yaWdpbmFsUG9zaXRpb259fX0pLGUudWkucGx1Z2luLmFkZChcInJlc2l6YWJsZVwiLFwiYW5pbWF0ZVwiLHtzdG9wOmZ1bmN0aW9uKHQpe3ZhciBpPWUodGhpcykucmVzaXphYmxlKFwiaW5zdGFuY2VcIikscz1pLm9wdGlvbnMsbj1pLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLGE9bi5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3QoblswXS5ub2RlTmFtZSksbz1hJiZpLl9oYXNTY3JvbGwoblswXSxcImxlZnRcIik/MDppLnNpemVEaWZmLmhlaWdodCxyPWE/MDppLnNpemVEaWZmLndpZHRoLGg9e3dpZHRoOmkuc2l6ZS53aWR0aC1yLGhlaWdodDppLnNpemUuaGVpZ2h0LW99LGw9cGFyc2VJbnQoaS5lbGVtZW50LmNzcyhcImxlZnRcIiksMTApKyhpLnBvc2l0aW9uLmxlZnQtaS5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpfHxudWxsLHU9cGFyc2VJbnQoaS5lbGVtZW50LmNzcyhcInRvcFwiKSwxMCkrKGkucG9zaXRpb24udG9wLWkub3JpZ2luYWxQb3NpdGlvbi50b3ApfHxudWxsO2kuZWxlbWVudC5hbmltYXRlKGUuZXh0ZW5kKGgsdSYmbD97dG9wOnUsbGVmdDpsfTp7fSkse2R1cmF0aW9uOnMuYW5pbWF0ZUR1cmF0aW9uLGVhc2luZzpzLmFuaW1hdGVFYXNpbmcsc3RlcDpmdW5jdGlvbigpe3ZhciBzPXt3aWR0aDpwYXJzZUludChpLmVsZW1lbnQuY3NzKFwid2lkdGhcIiksMTApLGhlaWdodDpwYXJzZUludChpLmVsZW1lbnQuY3NzKFwiaGVpZ2h0XCIpLDEwKSx0b3A6cGFyc2VJbnQoaS5lbGVtZW50LmNzcyhcInRvcFwiKSwxMCksbGVmdDpwYXJzZUludChpLmVsZW1lbnQuY3NzKFwibGVmdFwiKSwxMCl9O24mJm4ubGVuZ3RoJiZlKG5bMF0pLmNzcyh7d2lkdGg6cy53aWR0aCxoZWlnaHQ6cy5oZWlnaHR9KSxpLl91cGRhdGVDYWNoZShzKSxpLl9wcm9wYWdhdGUoXCJyZXNpemVcIix0KX19KX19KSxlLnVpLnBsdWdpbi5hZGQoXCJyZXNpemFibGVcIixcImNvbnRhaW5tZW50XCIse3N0YXJ0OmZ1bmN0aW9uKCl7dmFyIHQsaSxzLG4sYSxvLHIsaD1lKHRoaXMpLnJlc2l6YWJsZShcImluc3RhbmNlXCIpLGw9aC5vcHRpb25zLHU9aC5lbGVtZW50LGQ9bC5jb250YWlubWVudCxjPWQgaW5zdGFuY2VvZiBlP2QuZ2V0KDApOi9wYXJlbnQvLnRlc3QoZCk/dS5wYXJlbnQoKS5nZXQoMCk6ZDtjJiYoaC5jb250YWluZXJFbGVtZW50PWUoYyksL2RvY3VtZW50Ly50ZXN0KGQpfHxkPT09ZG9jdW1lbnQ/KGguY29udGFpbmVyT2Zmc2V0PXtsZWZ0OjAsdG9wOjB9LGguY29udGFpbmVyUG9zaXRpb249e2xlZnQ6MCx0b3A6MH0saC5wYXJlbnREYXRhPXtlbGVtZW50OmUoZG9jdW1lbnQpLGxlZnQ6MCx0b3A6MCx3aWR0aDplKGRvY3VtZW50KS53aWR0aCgpLGhlaWdodDplKGRvY3VtZW50KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodH0pOih0PWUoYyksaT1bXSxlKFtcIlRvcFwiLFwiUmlnaHRcIixcIkxlZnRcIixcIkJvdHRvbVwiXSkuZWFjaChmdW5jdGlvbihlLHMpe2lbZV09aC5fbnVtKHQuY3NzKFwicGFkZGluZ1wiK3MpKX0pLGguY29udGFpbmVyT2Zmc2V0PXQub2Zmc2V0KCksaC5jb250YWluZXJQb3NpdGlvbj10LnBvc2l0aW9uKCksaC5jb250YWluZXJTaXplPXtoZWlnaHQ6dC5pbm5lckhlaWdodCgpLWlbM10sd2lkdGg6dC5pbm5lcldpZHRoKCktaVsxXX0scz1oLmNvbnRhaW5lck9mZnNldCxuPWguY29udGFpbmVyU2l6ZS5oZWlnaHQsYT1oLmNvbnRhaW5lclNpemUud2lkdGgsbz1oLl9oYXNTY3JvbGwoYyxcImxlZnRcIik/Yy5zY3JvbGxXaWR0aDphLHI9aC5faGFzU2Nyb2xsKGMpP2Muc2Nyb2xsSGVpZ2h0Om4saC5wYXJlbnREYXRhPXtlbGVtZW50OmMsbGVmdDpzLmxlZnQsdG9wOnMudG9wLHdpZHRoOm8saGVpZ2h0OnJ9KSl9LHJlc2l6ZTpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYSxvPWUodGhpcykucmVzaXphYmxlKFwiaW5zdGFuY2VcIikscj1vLm9wdGlvbnMsaD1vLmNvbnRhaW5lck9mZnNldCxsPW8ucG9zaXRpb24sdT1vLl9hc3BlY3RSYXRpb3x8dC5zaGlmdEtleSxkPXt0b3A6MCxsZWZ0OjB9LGM9by5jb250YWluZXJFbGVtZW50LHA9ITA7Y1swXSE9PWRvY3VtZW50JiYvc3RhdGljLy50ZXN0KGMuY3NzKFwicG9zaXRpb25cIikpJiYoZD1oKSxsLmxlZnQ8KG8uX2hlbHBlcj9oLmxlZnQ6MCkmJihvLnNpemUud2lkdGg9by5zaXplLndpZHRoKyhvLl9oZWxwZXI/by5wb3NpdGlvbi5sZWZ0LWgubGVmdDpvLnBvc2l0aW9uLmxlZnQtZC5sZWZ0KSx1JiYoby5zaXplLmhlaWdodD1vLnNpemUud2lkdGgvby5hc3BlY3RSYXRpbyxwPSExKSxvLnBvc2l0aW9uLmxlZnQ9ci5oZWxwZXI/aC5sZWZ0OjApLGwudG9wPChvLl9oZWxwZXI/aC50b3A6MCkmJihvLnNpemUuaGVpZ2h0PW8uc2l6ZS5oZWlnaHQrKG8uX2hlbHBlcj9vLnBvc2l0aW9uLnRvcC1oLnRvcDpvLnBvc2l0aW9uLnRvcCksdSYmKG8uc2l6ZS53aWR0aD1vLnNpemUuaGVpZ2h0Km8uYXNwZWN0UmF0aW8scD0hMSksby5wb3NpdGlvbi50b3A9by5faGVscGVyP2gudG9wOjApLG49by5jb250YWluZXJFbGVtZW50LmdldCgwKT09PW8uZWxlbWVudC5wYXJlbnQoKS5nZXQoMCksYT0vcmVsYXRpdmV8YWJzb2x1dGUvLnRlc3Qoby5jb250YWluZXJFbGVtZW50LmNzcyhcInBvc2l0aW9uXCIpKSxuJiZhPyhvLm9mZnNldC5sZWZ0PW8ucGFyZW50RGF0YS5sZWZ0K28ucG9zaXRpb24ubGVmdCxvLm9mZnNldC50b3A9by5wYXJlbnREYXRhLnRvcCtvLnBvc2l0aW9uLnRvcCk6KG8ub2Zmc2V0LmxlZnQ9by5lbGVtZW50Lm9mZnNldCgpLmxlZnQsby5vZmZzZXQudG9wPW8uZWxlbWVudC5vZmZzZXQoKS50b3ApLGk9TWF0aC5hYnMoby5zaXplRGlmZi53aWR0aCsoby5faGVscGVyP28ub2Zmc2V0LmxlZnQtZC5sZWZ0Om8ub2Zmc2V0LmxlZnQtaC5sZWZ0KSkscz1NYXRoLmFicyhvLnNpemVEaWZmLmhlaWdodCsoby5faGVscGVyP28ub2Zmc2V0LnRvcC1kLnRvcDpvLm9mZnNldC50b3AtaC50b3ApKSxpK28uc2l6ZS53aWR0aD49by5wYXJlbnREYXRhLndpZHRoJiYoby5zaXplLndpZHRoPW8ucGFyZW50RGF0YS53aWR0aC1pLHUmJihvLnNpemUuaGVpZ2h0PW8uc2l6ZS53aWR0aC9vLmFzcGVjdFJhdGlvLHA9ITEpKSxzK28uc2l6ZS5oZWlnaHQ+PW8ucGFyZW50RGF0YS5oZWlnaHQmJihvLnNpemUuaGVpZ2h0PW8ucGFyZW50RGF0YS5oZWlnaHQtcyx1JiYoby5zaXplLndpZHRoPW8uc2l6ZS5oZWlnaHQqby5hc3BlY3RSYXRpbyxwPSExKSkscHx8KG8ucG9zaXRpb24ubGVmdD1vLnByZXZQb3NpdGlvbi5sZWZ0LG8ucG9zaXRpb24udG9wPW8ucHJldlBvc2l0aW9uLnRvcCxvLnNpemUud2lkdGg9by5wcmV2U2l6ZS53aWR0aCxvLnNpemUuaGVpZ2h0PW8ucHJldlNpemUuaGVpZ2h0KX0sc3RvcDpmdW5jdGlvbigpe3ZhciB0PWUodGhpcykucmVzaXphYmxlKFwiaW5zdGFuY2VcIiksaT10Lm9wdGlvbnMscz10LmNvbnRhaW5lck9mZnNldCxuPXQuY29udGFpbmVyUG9zaXRpb24sYT10LmNvbnRhaW5lckVsZW1lbnQsbz1lKHQuaGVscGVyKSxyPW8ub2Zmc2V0KCksaD1vLm91dGVyV2lkdGgoKS10LnNpemVEaWZmLndpZHRoLGw9by5vdXRlckhlaWdodCgpLXQuc2l6ZURpZmYuaGVpZ2h0O3QuX2hlbHBlciYmIWkuYW5pbWF0ZSYmL3JlbGF0aXZlLy50ZXN0KGEuY3NzKFwicG9zaXRpb25cIikpJiZlKHRoaXMpLmNzcyh7bGVmdDpyLmxlZnQtbi5sZWZ0LXMubGVmdCx3aWR0aDpoLGhlaWdodDpsfSksdC5faGVscGVyJiYhaS5hbmltYXRlJiYvc3RhdGljLy50ZXN0KGEuY3NzKFwicG9zaXRpb25cIikpJiZlKHRoaXMpLmNzcyh7bGVmdDpyLmxlZnQtbi5sZWZ0LXMubGVmdCx3aWR0aDpoLGhlaWdodDpsfSl9fSksZS51aS5wbHVnaW4uYWRkKFwicmVzaXphYmxlXCIsXCJhbHNvUmVzaXplXCIse3N0YXJ0OmZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKS5yZXNpemFibGUoXCJpbnN0YW5jZVwiKSxpPXQub3B0aW9ucztlKGkuYWxzb1Jlc2l6ZSkuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7dC5kYXRhKFwidWktcmVzaXphYmxlLWFsc29yZXNpemVcIix7d2lkdGg6cGFyc2VJbnQodC53aWR0aCgpLDEwKSxoZWlnaHQ6cGFyc2VJbnQodC5oZWlnaHQoKSwxMCksbGVmdDpwYXJzZUludCh0LmNzcyhcImxlZnRcIiksMTApLHRvcDpwYXJzZUludCh0LmNzcyhcInRvcFwiKSwxMCl9KX0pfSxyZXNpemU6ZnVuY3Rpb24odCxpKXt2YXIgcz1lKHRoaXMpLnJlc2l6YWJsZShcImluc3RhbmNlXCIpLG49cy5vcHRpb25zLGE9cy5vcmlnaW5hbFNpemUsbz1zLm9yaWdpbmFsUG9zaXRpb24scj17aGVpZ2h0OnMuc2l6ZS5oZWlnaHQtYS5oZWlnaHR8fDAsd2lkdGg6cy5zaXplLndpZHRoLWEud2lkdGh8fDAsdG9wOnMucG9zaXRpb24udG9wLW8udG9wfHwwLGxlZnQ6cy5wb3NpdGlvbi5sZWZ0LW8ubGVmdHx8MH07ZShuLmFsc29SZXNpemUpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLHM9ZSh0aGlzKS5kYXRhKFwidWktcmVzaXphYmxlLWFsc29yZXNpemVcIiksbj17fSxhPXQucGFyZW50cyhpLm9yaWdpbmFsRWxlbWVudFswXSkubGVuZ3RoP1tcIndpZHRoXCIsXCJoZWlnaHRcIl06W1wid2lkdGhcIixcImhlaWdodFwiLFwidG9wXCIsXCJsZWZ0XCJdO2UuZWFjaChhLGZ1bmN0aW9uKGUsdCl7dmFyIGk9KHNbdF18fDApKyhyW3RdfHwwKTtpJiZpPj0wJiYoblt0XT1pfHxudWxsKX0pLHQuY3NzKG4pfSl9LHN0b3A6ZnVuY3Rpb24oKXtlKHRoaXMpLnJlbW92ZURhdGEoXCJyZXNpemFibGUtYWxzb3Jlc2l6ZVwiKX19KSxlLnVpLnBsdWdpbi5hZGQoXCJyZXNpemFibGVcIixcImdob3N0XCIse3N0YXJ0OmZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKS5yZXNpemFibGUoXCJpbnN0YW5jZVwiKSxpPXQub3B0aW9ucyxzPXQuc2l6ZTt0Lmdob3N0PXQub3JpZ2luYWxFbGVtZW50LmNsb25lKCksdC5naG9zdC5jc3Moe29wYWNpdHk6LjI1LGRpc3BsYXk6XCJibG9ja1wiLHBvc2l0aW9uOlwicmVsYXRpdmVcIixoZWlnaHQ6cy5oZWlnaHQsd2lkdGg6cy53aWR0aCxtYXJnaW46MCxsZWZ0OjAsdG9wOjB9KS5hZGRDbGFzcyhcInVpLXJlc2l6YWJsZS1naG9zdFwiKS5hZGRDbGFzcyhcInN0cmluZ1wiPT10eXBlb2YgaS5naG9zdD9pLmdob3N0OlwiXCIpLHQuZ2hvc3QuYXBwZW5kVG8odC5oZWxwZXIpfSxyZXNpemU6ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLnJlc2l6YWJsZShcImluc3RhbmNlXCIpO3QuZ2hvc3QmJnQuZ2hvc3QuY3NzKHtwb3NpdGlvbjpcInJlbGF0aXZlXCIsaGVpZ2h0OnQuc2l6ZS5oZWlnaHQsd2lkdGg6dC5zaXplLndpZHRofSl9LHN0b3A6ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLnJlc2l6YWJsZShcImluc3RhbmNlXCIpO3QuZ2hvc3QmJnQuaGVscGVyJiZ0LmhlbHBlci5nZXQoMCkucmVtb3ZlQ2hpbGQodC5naG9zdC5nZXQoMCkpfX0pLGUudWkucGx1Z2luLmFkZChcInJlc2l6YWJsZVwiLFwiZ3JpZFwiLHtyZXNpemU6ZnVuY3Rpb24oKXt2YXIgdCxpPWUodGhpcykucmVzaXphYmxlKFwiaW5zdGFuY2VcIikscz1pLm9wdGlvbnMsbj1pLnNpemUsYT1pLm9yaWdpbmFsU2l6ZSxvPWkub3JpZ2luYWxQb3NpdGlvbixyPWkuYXhpcyxoPVwibnVtYmVyXCI9PXR5cGVvZiBzLmdyaWQ/W3MuZ3JpZCxzLmdyaWRdOnMuZ3JpZCxsPWhbMF18fDEsdT1oWzFdfHwxLGQ9TWF0aC5yb3VuZCgobi53aWR0aC1hLndpZHRoKS9sKSpsLGM9TWF0aC5yb3VuZCgobi5oZWlnaHQtYS5oZWlnaHQpL3UpKnUscD1hLndpZHRoK2QsZj1hLmhlaWdodCtjLG09cy5tYXhXaWR0aCYmcD5zLm1heFdpZHRoLGc9cy5tYXhIZWlnaHQmJmY+cy5tYXhIZWlnaHQsdj1zLm1pbldpZHRoJiZzLm1pbldpZHRoPnAseT1zLm1pbkhlaWdodCYmcy5taW5IZWlnaHQ+ZjtzLmdyaWQ9aCx2JiYocCs9bCkseSYmKGYrPXUpLG0mJihwLT1sKSxnJiYoZi09dSksL14oc2V8c3xlKSQvLnRlc3Qocik/KGkuc2l6ZS53aWR0aD1wLGkuc2l6ZS5oZWlnaHQ9Zik6L14obmUpJC8udGVzdChyKT8oaS5zaXplLndpZHRoPXAsaS5zaXplLmhlaWdodD1mLGkucG9zaXRpb24udG9wPW8udG9wLWMpOi9eKHN3KSQvLnRlc3Qocik/KGkuc2l6ZS53aWR0aD1wLGkuc2l6ZS5oZWlnaHQ9ZixpLnBvc2l0aW9uLmxlZnQ9by5sZWZ0LWQpOigoMD49Zi11fHwwPj1wLWwpJiYodD1pLl9nZXRQYWRkaW5nUGx1c0JvcmRlckRpbWVuc2lvbnModGhpcykpLGYtdT4wPyhpLnNpemUuaGVpZ2h0PWYsaS5wb3NpdGlvbi50b3A9by50b3AtYyk6KGY9dS10LmhlaWdodCxpLnNpemUuaGVpZ2h0PWYsaS5wb3NpdGlvbi50b3A9by50b3ArYS5oZWlnaHQtZikscC1sPjA/KGkuc2l6ZS53aWR0aD1wLGkucG9zaXRpb24ubGVmdD1vLmxlZnQtZCk6KHA9bC10LndpZHRoLGkuc2l6ZS53aWR0aD1wLGkucG9zaXRpb24ubGVmdD1vLmxlZnQrYS53aWR0aC1wKSl9fSksZS51aS5yZXNpemFibGUsZS53aWRnZXQoXCJ1aS5kaWFsb2dcIix7dmVyc2lvbjpcIjEuMTEuNFwiLG9wdGlvbnM6e2FwcGVuZFRvOlwiYm9keVwiLGF1dG9PcGVuOiEwLGJ1dHRvbnM6W10sY2xvc2VPbkVzY2FwZTohMCxjbG9zZVRleHQ6XCJDbG9zZVwiLGRpYWxvZ0NsYXNzOlwiXCIsZHJhZ2dhYmxlOiEwLGhpZGU6bnVsbCxoZWlnaHQ6XCJhdXRvXCIsbWF4SGVpZ2h0Om51bGwsbWF4V2lkdGg6bnVsbCxtaW5IZWlnaHQ6MTUwLG1pbldpZHRoOjE1MCxtb2RhbDohMSxwb3NpdGlvbjp7bXk6XCJjZW50ZXJcIixhdDpcImNlbnRlclwiLG9mOndpbmRvdyxjb2xsaXNpb246XCJmaXRcIix1c2luZzpmdW5jdGlvbih0KXt2YXIgaT1lKHRoaXMpLmNzcyh0KS5vZmZzZXQoKS50b3A7MD5pJiZlKHRoaXMpLmNzcyhcInRvcFwiLHQudG9wLWkpfX0scmVzaXphYmxlOiEwLHNob3c6bnVsbCx0aXRsZTpudWxsLHdpZHRoOjMwMCxiZWZvcmVDbG9zZTpudWxsLGNsb3NlOm51bGwsZHJhZzpudWxsLGRyYWdTdGFydDpudWxsLGRyYWdTdG9wOm51bGwsZm9jdXM6bnVsbCxvcGVuOm51bGwscmVzaXplOm51bGwscmVzaXplU3RhcnQ6bnVsbCxyZXNpemVTdG9wOm51bGx9LHNpemVSZWxhdGVkT3B0aW9uczp7YnV0dG9uczohMCxoZWlnaHQ6ITAsbWF4SGVpZ2h0OiEwLG1heFdpZHRoOiEwLG1pbkhlaWdodDohMCxtaW5XaWR0aDohMCx3aWR0aDohMH0scmVzaXphYmxlUmVsYXRlZE9wdGlvbnM6e21heEhlaWdodDohMCxtYXhXaWR0aDohMCxtaW5IZWlnaHQ6ITAsbWluV2lkdGg6ITB9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLm9yaWdpbmFsQ3NzPXtkaXNwbGF5OnRoaXMuZWxlbWVudFswXS5zdHlsZS5kaXNwbGF5LHdpZHRoOnRoaXMuZWxlbWVudFswXS5zdHlsZS53aWR0aCxtaW5IZWlnaHQ6dGhpcy5lbGVtZW50WzBdLnN0eWxlLm1pbkhlaWdodCxtYXhIZWlnaHQ6dGhpcy5lbGVtZW50WzBdLnN0eWxlLm1heEhlaWdodCxoZWlnaHQ6dGhpcy5lbGVtZW50WzBdLnN0eWxlLmhlaWdodH0sdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXtwYXJlbnQ6dGhpcy5lbGVtZW50LnBhcmVudCgpLGluZGV4OnRoaXMuZWxlbWVudC5wYXJlbnQoKS5jaGlsZHJlbigpLmluZGV4KHRoaXMuZWxlbWVudCl9LHRoaXMub3JpZ2luYWxUaXRsZT10aGlzLmVsZW1lbnQuYXR0cihcInRpdGxlXCIpLHRoaXMub3B0aW9ucy50aXRsZT10aGlzLm9wdGlvbnMudGl0bGV8fHRoaXMub3JpZ2luYWxUaXRsZSx0aGlzLl9jcmVhdGVXcmFwcGVyKCksdGhpcy5lbGVtZW50LnNob3coKS5yZW1vdmVBdHRyKFwidGl0bGVcIikuYWRkQ2xhc3MoXCJ1aS1kaWFsb2ctY29udGVudCB1aS13aWRnZXQtY29udGVudFwiKS5hcHBlbmRUbyh0aGlzLnVpRGlhbG9nKSx0aGlzLl9jcmVhdGVUaXRsZWJhcigpLHRoaXMuX2NyZWF0ZUJ1dHRvblBhbmUoKSx0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlJiZlLmZuLmRyYWdnYWJsZSYmdGhpcy5fbWFrZURyYWdnYWJsZSgpLHRoaXMub3B0aW9ucy5yZXNpemFibGUmJmUuZm4ucmVzaXphYmxlJiZ0aGlzLl9tYWtlUmVzaXphYmxlKCksdGhpcy5faXNPcGVuPSExLHRoaXMuX3RyYWNrRm9jdXMoKX0sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuYXV0b09wZW4mJnRoaXMub3BlbigpfSxfYXBwZW5kVG86ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuYXBwZW5kVG87cmV0dXJuIHQmJih0LmpxdWVyeXx8dC5ub2RlVHlwZSk/ZSh0KTp0aGlzLmRvY3VtZW50LmZpbmQodHx8XCJib2R5XCIpLmVxKDApfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5vcmlnaW5hbFBvc2l0aW9uO3RoaXMuX3VudHJhY2tJbnN0YW5jZSgpLHRoaXMuX2Rlc3Ryb3lPdmVybGF5KCksdGhpcy5lbGVtZW50LnJlbW92ZVVuaXF1ZUlkKCkucmVtb3ZlQ2xhc3MoXCJ1aS1kaWFsb2ctY29udGVudCB1aS13aWRnZXQtY29udGVudFwiKS5jc3ModGhpcy5vcmlnaW5hbENzcykuZGV0YWNoKCksdGhpcy51aURpYWxvZy5zdG9wKCEwLCEwKS5yZW1vdmUoKSx0aGlzLm9yaWdpbmFsVGl0bGUmJnRoaXMuZWxlbWVudC5hdHRyKFwidGl0bGVcIix0aGlzLm9yaWdpbmFsVGl0bGUpLGU9dC5wYXJlbnQuY2hpbGRyZW4oKS5lcSh0LmluZGV4KSxlLmxlbmd0aCYmZVswXSE9PXRoaXMuZWxlbWVudFswXT9lLmJlZm9yZSh0aGlzLmVsZW1lbnQpOnQucGFyZW50LmFwcGVuZCh0aGlzLmVsZW1lbnQpfSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51aURpYWxvZ30sZGlzYWJsZTplLm5vb3AsZW5hYmxlOmUubm9vcCxjbG9zZTpmdW5jdGlvbih0KXt2YXIgaSxzPXRoaXM7aWYodGhpcy5faXNPcGVuJiZ0aGlzLl90cmlnZ2VyKFwiYmVmb3JlQ2xvc2VcIix0KSE9PSExKXtpZih0aGlzLl9pc09wZW49ITEsdGhpcy5fZm9jdXNlZEVsZW1lbnQ9bnVsbCx0aGlzLl9kZXN0cm95T3ZlcmxheSgpLHRoaXMuX3VudHJhY2tJbnN0YW5jZSgpLCF0aGlzLm9wZW5lci5maWx0ZXIoXCI6Zm9jdXNhYmxlXCIpLmZvY3VzKCkubGVuZ3RoKXRyeXtpPXRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCxpJiZcImJvZHlcIiE9PWkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZShpKS5ibHVyKCl9Y2F0Y2gobil7fXRoaXMuX2hpZGUodGhpcy51aURpYWxvZyx0aGlzLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe3MuX3RyaWdnZXIoXCJjbG9zZVwiLHQpfSl9fSxpc09wZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNPcGVufSxtb3ZlVG9Ub3A6ZnVuY3Rpb24oKXt0aGlzLl9tb3ZlVG9Ub3AoKX0sX21vdmVUb1RvcDpmdW5jdGlvbih0LGkpe3ZhciBzPSExLG49dGhpcy51aURpYWxvZy5zaWJsaW5ncyhcIi51aS1mcm9udDp2aXNpYmxlXCIpLm1hcChmdW5jdGlvbigpe3JldHVybitlKHRoaXMpLmNzcyhcInotaW5kZXhcIil9KS5nZXQoKSxhPU1hdGgubWF4LmFwcGx5KG51bGwsbik7cmV0dXJuIGE+PSt0aGlzLnVpRGlhbG9nLmNzcyhcInotaW5kZXhcIikmJih0aGlzLnVpRGlhbG9nLmNzcyhcInotaW5kZXhcIixhKzEpLHM9ITApLHMmJiFpJiZ0aGlzLl90cmlnZ2VyKFwiZm9jdXNcIix0KSxzfSxvcGVuOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5faXNPcGVuPyh0aGlzLl9tb3ZlVG9Ub3AoKSYmdGhpcy5fZm9jdXNUYWJiYWJsZSgpLHZvaWQgMCk6KHRoaXMuX2lzT3Blbj0hMCx0aGlzLm9wZW5lcj1lKHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCksdGhpcy5fc2l6ZSgpLHRoaXMuX3Bvc2l0aW9uKCksdGhpcy5fY3JlYXRlT3ZlcmxheSgpLHRoaXMuX21vdmVUb1RvcChudWxsLCEwKSx0aGlzLm92ZXJsYXkmJnRoaXMub3ZlcmxheS5jc3MoXCJ6LWluZGV4XCIsdGhpcy51aURpYWxvZy5jc3MoXCJ6LWluZGV4XCIpLTEpLHRoaXMuX3Nob3codGhpcy51aURpYWxvZyx0aGlzLm9wdGlvbnMuc2hvdyxmdW5jdGlvbigpe3QuX2ZvY3VzVGFiYmFibGUoKSx0Ll90cmlnZ2VyKFwiZm9jdXNcIil9KSx0aGlzLl9tYWtlRm9jdXNUYXJnZXQoKSx0aGlzLl90cmlnZ2VyKFwib3BlblwiKSx2b2lkIDApfSxfZm9jdXNUYWJiYWJsZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2ZvY3VzZWRFbGVtZW50O2V8fChlPXRoaXMuZWxlbWVudC5maW5kKFwiW2F1dG9mb2N1c11cIikpLGUubGVuZ3RofHwoZT10aGlzLmVsZW1lbnQuZmluZChcIjp0YWJiYWJsZVwiKSksZS5sZW5ndGh8fChlPXRoaXMudWlEaWFsb2dCdXR0b25QYW5lLmZpbmQoXCI6dGFiYmFibGVcIikpLGUubGVuZ3RofHwoZT10aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZS5maWx0ZXIoXCI6dGFiYmFibGVcIikpLGUubGVuZ3RofHwoZT10aGlzLnVpRGlhbG9nKSxlLmVxKDApLmZvY3VzKCl9LF9rZWVwRm9jdXM6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gaSgpe3ZhciB0PXRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCxpPXRoaXMudWlEaWFsb2dbMF09PT10fHxlLmNvbnRhaW5zKHRoaXMudWlEaWFsb2dbMF0sdCk7aXx8dGhpcy5fZm9jdXNUYWJiYWJsZSgpfXQucHJldmVudERlZmF1bHQoKSxpLmNhbGwodGhpcyksdGhpcy5fZGVsYXkoaSl9LF9jcmVhdGVXcmFwcGVyOmZ1bmN0aW9uKCl7dGhpcy51aURpYWxvZz1lKFwiPGRpdj5cIikuYWRkQ2xhc3MoXCJ1aS1kaWFsb2cgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwgdWktZnJvbnQgXCIrdGhpcy5vcHRpb25zLmRpYWxvZ0NsYXNzKS5oaWRlKCkuYXR0cih7dGFiSW5kZXg6LTEscm9sZTpcImRpYWxvZ1wifSkuYXBwZW5kVG8odGhpcy5fYXBwZW5kVG8oKSksdGhpcy5fb24odGhpcy51aURpYWxvZyx7a2V5ZG93bjpmdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMuY2xvc2VPbkVzY2FwZSYmIXQuaXNEZWZhdWx0UHJldmVudGVkKCkmJnQua2V5Q29kZSYmdC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLkVTQ0FQRSlyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2xvc2UodCksdm9pZCAwO1xuaWYodC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLlRBQiYmIXQuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBpPXRoaXMudWlEaWFsb2cuZmluZChcIjp0YWJiYWJsZVwiKSxzPWkuZmlsdGVyKFwiOmZpcnN0XCIpLG49aS5maWx0ZXIoXCI6bGFzdFwiKTt0LnRhcmdldCE9PW5bMF0mJnQudGFyZ2V0IT09dGhpcy51aURpYWxvZ1swXXx8dC5zaGlmdEtleT90LnRhcmdldCE9PXNbMF0mJnQudGFyZ2V0IT09dGhpcy51aURpYWxvZ1swXXx8IXQuc2hpZnRLZXl8fCh0aGlzLl9kZWxheShmdW5jdGlvbigpe24uZm9jdXMoKX0pLHQucHJldmVudERlZmF1bHQoKSk6KHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7cy5mb2N1cygpfSksdC5wcmV2ZW50RGVmYXVsdCgpKX19LG1vdXNlZG93bjpmdW5jdGlvbihlKXt0aGlzLl9tb3ZlVG9Ub3AoZSkmJnRoaXMuX2ZvY3VzVGFiYmFibGUoKX19KSx0aGlzLmVsZW1lbnQuZmluZChcIlthcmlhLWRlc2NyaWJlZGJ5XVwiKS5sZW5ndGh8fHRoaXMudWlEaWFsb2cuYXR0cih7XCJhcmlhLWRlc2NyaWJlZGJ5XCI6dGhpcy5lbGVtZW50LnVuaXF1ZUlkKCkuYXR0cihcImlkXCIpfSl9LF9jcmVhdGVUaXRsZWJhcjpmdW5jdGlvbigpe3ZhciB0O3RoaXMudWlEaWFsb2dUaXRsZWJhcj1lKFwiPGRpdj5cIikuYWRkQ2xhc3MoXCJ1aS1kaWFsb2ctdGl0bGViYXIgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIHVpLWhlbHBlci1jbGVhcmZpeFwiKS5wcmVwZW5kVG8odGhpcy51aURpYWxvZyksdGhpcy5fb24odGhpcy51aURpYWxvZ1RpdGxlYmFyLHttb3VzZWRvd246ZnVuY3Rpb24odCl7ZSh0LnRhcmdldCkuY2xvc2VzdChcIi51aS1kaWFsb2ctdGl0bGViYXItY2xvc2VcIil8fHRoaXMudWlEaWFsb2cuZm9jdXMoKX19KSx0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZT1lKFwiPGJ1dHRvbiB0eXBlPSdidXR0b24nPjwvYnV0dG9uPlwiKS5idXR0b24oe2xhYmVsOnRoaXMub3B0aW9ucy5jbG9zZVRleHQsaWNvbnM6e3ByaW1hcnk6XCJ1aS1pY29uLWNsb3NldGhpY2tcIn0sdGV4dDohMX0pLmFkZENsYXNzKFwidWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlXCIpLmFwcGVuZFRvKHRoaXMudWlEaWFsb2dUaXRsZWJhciksdGhpcy5fb24odGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2Use2NsaWNrOmZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKSx0aGlzLmNsb3NlKGUpfX0pLHQ9ZShcIjxzcGFuPlwiKS51bmlxdWVJZCgpLmFkZENsYXNzKFwidWktZGlhbG9nLXRpdGxlXCIpLnByZXBlbmRUbyh0aGlzLnVpRGlhbG9nVGl0bGViYXIpLHRoaXMuX3RpdGxlKHQpLHRoaXMudWlEaWFsb2cuYXR0cih7XCJhcmlhLWxhYmVsbGVkYnlcIjp0LmF0dHIoXCJpZFwiKX0pfSxfdGl0bGU6ZnVuY3Rpb24oZSl7dGhpcy5vcHRpb25zLnRpdGxlfHxlLmh0bWwoXCImIzE2MDtcIiksZS50ZXh0KHRoaXMub3B0aW9ucy50aXRsZSl9LF9jcmVhdGVCdXR0b25QYW5lOmZ1bmN0aW9uKCl7dGhpcy51aURpYWxvZ0J1dHRvblBhbmU9ZShcIjxkaXY+XCIpLmFkZENsYXNzKFwidWktZGlhbG9nLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4XCIpLHRoaXMudWlCdXR0b25TZXQ9ZShcIjxkaXY+XCIpLmFkZENsYXNzKFwidWktZGlhbG9nLWJ1dHRvbnNldFwiKS5hcHBlbmRUbyh0aGlzLnVpRGlhbG9nQnV0dG9uUGFuZSksdGhpcy5fY3JlYXRlQnV0dG9ucygpfSxfY3JlYXRlQnV0dG9uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMsaT10aGlzLm9wdGlvbnMuYnV0dG9ucztyZXR1cm4gdGhpcy51aURpYWxvZ0J1dHRvblBhbmUucmVtb3ZlKCksdGhpcy51aUJ1dHRvblNldC5lbXB0eSgpLGUuaXNFbXB0eU9iamVjdChpKXx8ZS5pc0FycmF5KGkpJiYhaS5sZW5ndGg/KHRoaXMudWlEaWFsb2cucmVtb3ZlQ2xhc3MoXCJ1aS1kaWFsb2ctYnV0dG9uc1wiKSx2b2lkIDApOihlLmVhY2goaSxmdW5jdGlvbihpLHMpe3ZhciBuLGE7cz1lLmlzRnVuY3Rpb24ocyk/e2NsaWNrOnMsdGV4dDppfTpzLHM9ZS5leHRlbmQoe3R5cGU6XCJidXR0b25cIn0scyksbj1zLmNsaWNrLHMuY2xpY2s9ZnVuY3Rpb24oKXtuLmFwcGx5KHQuZWxlbWVudFswXSxhcmd1bWVudHMpfSxhPXtpY29uczpzLmljb25zLHRleHQ6cy5zaG93VGV4dH0sZGVsZXRlIHMuaWNvbnMsZGVsZXRlIHMuc2hvd1RleHQsZShcIjxidXR0b24+PC9idXR0b24+XCIscykuYnV0dG9uKGEpLmFwcGVuZFRvKHQudWlCdXR0b25TZXQpfSksdGhpcy51aURpYWxvZy5hZGRDbGFzcyhcInVpLWRpYWxvZy1idXR0b25zXCIpLHRoaXMudWlEaWFsb2dCdXR0b25QYW5lLmFwcGVuZFRvKHRoaXMudWlEaWFsb2cpLHZvaWQgMCl9LF9tYWtlRHJhZ2dhYmxlOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtyZXR1cm57cG9zaXRpb246ZS5wb3NpdGlvbixvZmZzZXQ6ZS5vZmZzZXR9fXZhciBpPXRoaXMscz10aGlzLm9wdGlvbnM7dGhpcy51aURpYWxvZy5kcmFnZ2FibGUoe2NhbmNlbDpcIi51aS1kaWFsb2ctY29udGVudCwgLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZVwiLGhhbmRsZTpcIi51aS1kaWFsb2ctdGl0bGViYXJcIixjb250YWlubWVudDpcImRvY3VtZW50XCIsc3RhcnQ6ZnVuY3Rpb24ocyxuKXtlKHRoaXMpLmFkZENsYXNzKFwidWktZGlhbG9nLWRyYWdnaW5nXCIpLGkuX2Jsb2NrRnJhbWVzKCksaS5fdHJpZ2dlcihcImRyYWdTdGFydFwiLHMsdChuKSl9LGRyYWc6ZnVuY3Rpb24oZSxzKXtpLl90cmlnZ2VyKFwiZHJhZ1wiLGUsdChzKSl9LHN0b3A6ZnVuY3Rpb24obixhKXt2YXIgbz1hLm9mZnNldC5sZWZ0LWkuZG9jdW1lbnQuc2Nyb2xsTGVmdCgpLHI9YS5vZmZzZXQudG9wLWkuZG9jdW1lbnQuc2Nyb2xsVG9wKCk7cy5wb3NpdGlvbj17bXk6XCJsZWZ0IHRvcFwiLGF0OlwibGVmdFwiKyhvPj0wP1wiK1wiOlwiXCIpK28rXCIgXCIrXCJ0b3BcIisocj49MD9cIitcIjpcIlwiKStyLG9mOmkud2luZG93fSxlKHRoaXMpLnJlbW92ZUNsYXNzKFwidWktZGlhbG9nLWRyYWdnaW5nXCIpLGkuX3VuYmxvY2tGcmFtZXMoKSxpLl90cmlnZ2VyKFwiZHJhZ1N0b3BcIixuLHQoYSkpfX0pfSxfbWFrZVJlc2l6YWJsZTpmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7cmV0dXJue29yaWdpbmFsUG9zaXRpb246ZS5vcmlnaW5hbFBvc2l0aW9uLG9yaWdpbmFsU2l6ZTplLm9yaWdpbmFsU2l6ZSxwb3NpdGlvbjplLnBvc2l0aW9uLHNpemU6ZS5zaXplfX12YXIgaT10aGlzLHM9dGhpcy5vcHRpb25zLG49cy5yZXNpemFibGUsYT10aGlzLnVpRGlhbG9nLmNzcyhcInBvc2l0aW9uXCIpLG89XCJzdHJpbmdcIj09dHlwZW9mIG4/bjpcIm4sZSxzLHcsc2Usc3csbmUsbndcIjt0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSh7Y2FuY2VsOlwiLnVpLWRpYWxvZy1jb250ZW50XCIsY29udGFpbm1lbnQ6XCJkb2N1bWVudFwiLGFsc29SZXNpemU6dGhpcy5lbGVtZW50LG1heFdpZHRoOnMubWF4V2lkdGgsbWF4SGVpZ2h0OnMubWF4SGVpZ2h0LG1pbldpZHRoOnMubWluV2lkdGgsbWluSGVpZ2h0OnRoaXMuX21pbkhlaWdodCgpLGhhbmRsZXM6byxzdGFydDpmdW5jdGlvbihzLG4pe2UodGhpcykuYWRkQ2xhc3MoXCJ1aS1kaWFsb2ctcmVzaXppbmdcIiksaS5fYmxvY2tGcmFtZXMoKSxpLl90cmlnZ2VyKFwicmVzaXplU3RhcnRcIixzLHQobikpfSxyZXNpemU6ZnVuY3Rpb24oZSxzKXtpLl90cmlnZ2VyKFwicmVzaXplXCIsZSx0KHMpKX0sc3RvcDpmdW5jdGlvbihuLGEpe3ZhciBvPWkudWlEaWFsb2cub2Zmc2V0KCkscj1vLmxlZnQtaS5kb2N1bWVudC5zY3JvbGxMZWZ0KCksaD1vLnRvcC1pLmRvY3VtZW50LnNjcm9sbFRvcCgpO3MuaGVpZ2h0PWkudWlEaWFsb2cuaGVpZ2h0KCkscy53aWR0aD1pLnVpRGlhbG9nLndpZHRoKCkscy5wb3NpdGlvbj17bXk6XCJsZWZ0IHRvcFwiLGF0OlwibGVmdFwiKyhyPj0wP1wiK1wiOlwiXCIpK3IrXCIgXCIrXCJ0b3BcIisoaD49MD9cIitcIjpcIlwiKStoLG9mOmkud2luZG93fSxlKHRoaXMpLnJlbW92ZUNsYXNzKFwidWktZGlhbG9nLXJlc2l6aW5nXCIpLGkuX3VuYmxvY2tGcmFtZXMoKSxpLl90cmlnZ2VyKFwicmVzaXplU3RvcFwiLG4sdChhKSl9fSkuY3NzKFwicG9zaXRpb25cIixhKX0sX3RyYWNrRm9jdXM6ZnVuY3Rpb24oKXt0aGlzLl9vbih0aGlzLndpZGdldCgpLHtmb2N1c2luOmZ1bmN0aW9uKHQpe3RoaXMuX21ha2VGb2N1c1RhcmdldCgpLHRoaXMuX2ZvY3VzZWRFbGVtZW50PWUodC50YXJnZXQpfX0pfSxfbWFrZUZvY3VzVGFyZ2V0OmZ1bmN0aW9uKCl7dGhpcy5fdW50cmFja0luc3RhbmNlKCksdGhpcy5fdHJhY2tpbmdJbnN0YW5jZXMoKS51bnNoaWZ0KHRoaXMpfSxfdW50cmFja0luc3RhbmNlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdHJhY2tpbmdJbnN0YW5jZXMoKSxpPWUuaW5BcnJheSh0aGlzLHQpOy0xIT09aSYmdC5zcGxpY2UoaSwxKX0sX3RyYWNraW5nSW5zdGFuY2VzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5kb2N1bWVudC5kYXRhKFwidWktZGlhbG9nLWluc3RhbmNlc1wiKTtyZXR1cm4gZXx8KGU9W10sdGhpcy5kb2N1bWVudC5kYXRhKFwidWktZGlhbG9nLWluc3RhbmNlc1wiLGUpKSxlfSxfbWluSGVpZ2h0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zO3JldHVyblwiYXV0b1wiPT09ZS5oZWlnaHQ/ZS5taW5IZWlnaHQ6TWF0aC5taW4oZS5taW5IZWlnaHQsZS5oZWlnaHQpfSxfcG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnVpRGlhbG9nLmlzKFwiOnZpc2libGVcIik7ZXx8dGhpcy51aURpYWxvZy5zaG93KCksdGhpcy51aURpYWxvZy5wb3NpdGlvbih0aGlzLm9wdGlvbnMucG9zaXRpb24pLGV8fHRoaXMudWlEaWFsb2cuaGlkZSgpfSxfc2V0T3B0aW9uczpmdW5jdGlvbih0KXt2YXIgaT10aGlzLHM9ITEsbj17fTtlLmVhY2godCxmdW5jdGlvbihlLHQpe2kuX3NldE9wdGlvbihlLHQpLGUgaW4gaS5zaXplUmVsYXRlZE9wdGlvbnMmJihzPSEwKSxlIGluIGkucmVzaXphYmxlUmVsYXRlZE9wdGlvbnMmJihuW2VdPXQpfSkscyYmKHRoaXMuX3NpemUoKSx0aGlzLl9wb3NpdGlvbigpKSx0aGlzLnVpRGlhbG9nLmlzKFwiOmRhdGEodWktcmVzaXphYmxlKVwiKSYmdGhpcy51aURpYWxvZy5yZXNpemFibGUoXCJvcHRpb25cIixuKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBpLHMsbj10aGlzLnVpRGlhbG9nO1wiZGlhbG9nQ2xhc3NcIj09PWUmJm4ucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmRpYWxvZ0NsYXNzKS5hZGRDbGFzcyh0KSxcImRpc2FibGVkXCIhPT1lJiYodGhpcy5fc3VwZXIoZSx0KSxcImFwcGVuZFRvXCI9PT1lJiZ0aGlzLnVpRGlhbG9nLmFwcGVuZFRvKHRoaXMuX2FwcGVuZFRvKCkpLFwiYnV0dG9uc1wiPT09ZSYmdGhpcy5fY3JlYXRlQnV0dG9ucygpLFwiY2xvc2VUZXh0XCI9PT1lJiZ0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZS5idXR0b24oe2xhYmVsOlwiXCIrdH0pLFwiZHJhZ2dhYmxlXCI9PT1lJiYoaT1uLmlzKFwiOmRhdGEodWktZHJhZ2dhYmxlKVwiKSxpJiYhdCYmbi5kcmFnZ2FibGUoXCJkZXN0cm95XCIpLCFpJiZ0JiZ0aGlzLl9tYWtlRHJhZ2dhYmxlKCkpLFwicG9zaXRpb25cIj09PWUmJnRoaXMuX3Bvc2l0aW9uKCksXCJyZXNpemFibGVcIj09PWUmJihzPW4uaXMoXCI6ZGF0YSh1aS1yZXNpemFibGUpXCIpLHMmJiF0JiZuLnJlc2l6YWJsZShcImRlc3Ryb3lcIikscyYmXCJzdHJpbmdcIj09dHlwZW9mIHQmJm4ucmVzaXphYmxlKFwib3B0aW9uXCIsXCJoYW5kbGVzXCIsdCksc3x8dD09PSExfHx0aGlzLl9tYWtlUmVzaXphYmxlKCkpLFwidGl0bGVcIj09PWUmJnRoaXMuX3RpdGxlKHRoaXMudWlEaWFsb2dUaXRsZWJhci5maW5kKFwiLnVpLWRpYWxvZy10aXRsZVwiKSkpfSxfc2l6ZTpmdW5jdGlvbigpe3ZhciBlLHQsaSxzPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnQuc2hvdygpLmNzcyh7d2lkdGg6XCJhdXRvXCIsbWluSGVpZ2h0OjAsbWF4SGVpZ2h0Olwibm9uZVwiLGhlaWdodDowfSkscy5taW5XaWR0aD5zLndpZHRoJiYocy53aWR0aD1zLm1pbldpZHRoKSxlPXRoaXMudWlEaWFsb2cuY3NzKHtoZWlnaHQ6XCJhdXRvXCIsd2lkdGg6cy53aWR0aH0pLm91dGVySGVpZ2h0KCksdD1NYXRoLm1heCgwLHMubWluSGVpZ2h0LWUpLGk9XCJudW1iZXJcIj09dHlwZW9mIHMubWF4SGVpZ2h0P01hdGgubWF4KDAscy5tYXhIZWlnaHQtZSk6XCJub25lXCIsXCJhdXRvXCI9PT1zLmhlaWdodD90aGlzLmVsZW1lbnQuY3NzKHttaW5IZWlnaHQ6dCxtYXhIZWlnaHQ6aSxoZWlnaHQ6XCJhdXRvXCJ9KTp0aGlzLmVsZW1lbnQuaGVpZ2h0KE1hdGgubWF4KDAscy5oZWlnaHQtZSkpLHRoaXMudWlEaWFsb2cuaXMoXCI6ZGF0YSh1aS1yZXNpemFibGUpXCIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZShcIm9wdGlvblwiLFwibWluSGVpZ2h0XCIsdGhpcy5fbWluSGVpZ2h0KCkpfSxfYmxvY2tGcmFtZXM6ZnVuY3Rpb24oKXt0aGlzLmlmcmFtZUJsb2Nrcz10aGlzLmRvY3VtZW50LmZpbmQoXCJpZnJhbWVcIikubWFwKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtyZXR1cm4gZShcIjxkaXY+XCIpLmNzcyh7cG9zaXRpb246XCJhYnNvbHV0ZVwiLHdpZHRoOnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0Lm91dGVySGVpZ2h0KCl9KS5hcHBlbmRUbyh0LnBhcmVudCgpKS5vZmZzZXQodC5vZmZzZXQoKSlbMF19KX0sX3VuYmxvY2tGcmFtZXM6ZnVuY3Rpb24oKXt0aGlzLmlmcmFtZUJsb2NrcyYmKHRoaXMuaWZyYW1lQmxvY2tzLnJlbW92ZSgpLGRlbGV0ZSB0aGlzLmlmcmFtZUJsb2Nrcyl9LF9hbGxvd0ludGVyYWN0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiBlKHQudGFyZ2V0KS5jbG9zZXN0KFwiLnVpLWRpYWxvZ1wiKS5sZW5ndGg/ITA6ISFlKHQudGFyZ2V0KS5jbG9zZXN0KFwiLnVpLWRhdGVwaWNrZXJcIikubGVuZ3RofSxfY3JlYXRlT3ZlcmxheTpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5tb2RhbCl7dmFyIHQ9ITA7dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0PSExfSksdGhpcy5kb2N1bWVudC5kYXRhKFwidWktZGlhbG9nLW92ZXJsYXlzXCIpfHx0aGlzLl9vbih0aGlzLmRvY3VtZW50LHtmb2N1c2luOmZ1bmN0aW9uKGUpe3R8fHRoaXMuX2FsbG93SW50ZXJhY3Rpb24oZSl8fChlLnByZXZlbnREZWZhdWx0KCksdGhpcy5fdHJhY2tpbmdJbnN0YW5jZXMoKVswXS5fZm9jdXNUYWJiYWJsZSgpKX19KSx0aGlzLm92ZXJsYXk9ZShcIjxkaXY+XCIpLmFkZENsYXNzKFwidWktd2lkZ2V0LW92ZXJsYXkgdWktZnJvbnRcIikuYXBwZW5kVG8odGhpcy5fYXBwZW5kVG8oKSksdGhpcy5fb24odGhpcy5vdmVybGF5LHttb3VzZWRvd246XCJfa2VlcEZvY3VzXCJ9KSx0aGlzLmRvY3VtZW50LmRhdGEoXCJ1aS1kaWFsb2ctb3ZlcmxheXNcIiwodGhpcy5kb2N1bWVudC5kYXRhKFwidWktZGlhbG9nLW92ZXJsYXlzXCIpfHwwKSsxKX19LF9kZXN0cm95T3ZlcmxheTpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5tb2RhbCYmdGhpcy5vdmVybGF5KXt2YXIgZT10aGlzLmRvY3VtZW50LmRhdGEoXCJ1aS1kaWFsb2ctb3ZlcmxheXNcIiktMTtlP3RoaXMuZG9jdW1lbnQuZGF0YShcInVpLWRpYWxvZy1vdmVybGF5c1wiLGUpOnRoaXMuZG9jdW1lbnQudW5iaW5kKFwiZm9jdXNpblwiKS5yZW1vdmVEYXRhKFwidWktZGlhbG9nLW92ZXJsYXlzXCIpLHRoaXMub3ZlcmxheS5yZW1vdmUoKSx0aGlzLm92ZXJsYXk9bnVsbH19fSksZS53aWRnZXQoXCJ1aS5kcm9wcGFibGVcIix7dmVyc2lvbjpcIjEuMTEuNFwiLHdpZGdldEV2ZW50UHJlZml4OlwiZHJvcFwiLG9wdGlvbnM6e2FjY2VwdDpcIipcIixhY3RpdmVDbGFzczohMSxhZGRDbGFzc2VzOiEwLGdyZWVkeTohMSxob3ZlckNsYXNzOiExLHNjb3BlOlwiZGVmYXVsdFwiLHRvbGVyYW5jZTpcImludGVyc2VjdFwiLGFjdGl2YXRlOm51bGwsZGVhY3RpdmF0ZTpudWxsLGRyb3A6bnVsbCxvdXQ6bnVsbCxvdmVyOm51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdCxpPXRoaXMub3B0aW9ucyxzPWkuYWNjZXB0O3RoaXMuaXNvdmVyPSExLHRoaXMuaXNvdXQ9ITAsdGhpcy5hY2NlcHQ9ZS5pc0Z1bmN0aW9uKHMpP3M6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXMocyl9LHRoaXMucHJvcG9ydGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHNbMF0sdm9pZCAwKTp0P3Q6dD17d2lkdGg6dGhpcy5lbGVtZW50WzBdLm9mZnNldFdpZHRoLGhlaWdodDp0aGlzLmVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0fX0sdGhpcy5fYWRkVG9NYW5hZ2VyKGkuc2NvcGUpLGkuYWRkQ2xhc3NlcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKFwidWktZHJvcHBhYmxlXCIpfSxfYWRkVG9NYW5hZ2VyOmZ1bmN0aW9uKHQpe2UudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdF09ZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0XXx8W10sZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0XS5wdXNoKHRoaXMpfSxfc3BsaWNlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO2UubGVuZ3RoPnQ7dCsrKWVbdF09PT10aGlzJiZlLnNwbGljZSh0LDEpfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciB0PWUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdGhpcy5vcHRpb25zLnNjb3BlXTt0aGlzLl9zcGxpY2UodCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKFwidWktZHJvcHBhYmxlIHVpLWRyb3BwYWJsZS1kaXNhYmxlZFwiKX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGkpe2lmKFwiYWNjZXB0XCI9PT10KXRoaXMuYWNjZXB0PWUuaXNGdW5jdGlvbihpKT9pOmZ1bmN0aW9uKGUpe3JldHVybiBlLmlzKGkpfTtlbHNlIGlmKFwic2NvcGVcIj09PXQpe3ZhciBzPWUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdGhpcy5vcHRpb25zLnNjb3BlXTt0aGlzLl9zcGxpY2UocyksdGhpcy5fYWRkVG9NYW5hZ2VyKGkpfXRoaXMuX3N1cGVyKHQsaSl9LF9hY3RpdmF0ZTpmdW5jdGlvbih0KXt2YXIgaT1lLnVpLmRkbWFuYWdlci5jdXJyZW50O3RoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksaSYmdGhpcy5fdHJpZ2dlcihcImFjdGl2YXRlXCIsdCx0aGlzLnVpKGkpKX0sX2RlYWN0aXZhdGU6ZnVuY3Rpb24odCl7dmFyIGk9ZS51aS5kZG1hbmFnZXIuY3VycmVudDt0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLGkmJnRoaXMuX3RyaWdnZXIoXCJkZWFjdGl2YXRlXCIsdCx0aGlzLnVpKGkpKX0sX292ZXI6ZnVuY3Rpb24odCl7dmFyIGk9ZS51aS5kZG1hbmFnZXIuY3VycmVudDtpJiYoaS5jdXJyZW50SXRlbXx8aS5lbGVtZW50KVswXSE9PXRoaXMuZWxlbWVudFswXSYmdGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0saS5jdXJyZW50SXRlbXx8aS5lbGVtZW50KSYmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoXCJvdmVyXCIsdCx0aGlzLnVpKGkpKSl9LF9vdXQ6ZnVuY3Rpb24odCl7dmFyIGk9ZS51aS5kZG1hbmFnZXIuY3VycmVudDtpJiYoaS5jdXJyZW50SXRlbXx8aS5lbGVtZW50KVswXSE9PXRoaXMuZWxlbWVudFswXSYmdGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0saS5jdXJyZW50SXRlbXx8aS5lbGVtZW50KSYmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoXCJvdXRcIix0LHRoaXMudWkoaSkpKX0sX2Ryb3A6ZnVuY3Rpb24odCxpKXt2YXIgcz1pfHxlLnVpLmRkbWFuYWdlci5jdXJyZW50LG49ITE7cmV0dXJuIHMmJihzLmN1cnJlbnRJdGVtfHxzLmVsZW1lbnQpWzBdIT09dGhpcy5lbGVtZW50WzBdPyh0aGlzLmVsZW1lbnQuZmluZChcIjpkYXRhKHVpLWRyb3BwYWJsZSlcIikubm90KFwiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZ1wiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9ZSh0aGlzKS5kcm9wcGFibGUoXCJpbnN0YW5jZVwiKTtyZXR1cm4gaS5vcHRpb25zLmdyZWVkeSYmIWkub3B0aW9ucy5kaXNhYmxlZCYmaS5vcHRpb25zLnNjb3BlPT09cy5vcHRpb25zLnNjb3BlJiZpLmFjY2VwdC5jYWxsKGkuZWxlbWVudFswXSxzLmN1cnJlbnRJdGVtfHxzLmVsZW1lbnQpJiZlLnVpLmludGVyc2VjdChzLGUuZXh0ZW5kKGkse29mZnNldDppLmVsZW1lbnQub2Zmc2V0KCl9KSxpLm9wdGlvbnMudG9sZXJhbmNlLHQpPyhuPSEwLCExKTp2b2lkIDB9KSxuPyExOnRoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLHMuY3VycmVudEl0ZW18fHMuZWxlbWVudCk/KHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksdGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyksdGhpcy5fdHJpZ2dlcihcImRyb3BcIix0LHRoaXMudWkocykpLHRoaXMuZWxlbWVudCk6ITEpOiExfSx1aTpmdW5jdGlvbihlKXtyZXR1cm57ZHJhZ2dhYmxlOmUuY3VycmVudEl0ZW18fGUuZWxlbWVudCxoZWxwZXI6ZS5oZWxwZXIscG9zaXRpb246ZS5wb3NpdGlvbixvZmZzZXQ6ZS5wb3NpdGlvbkFic319fSksZS51aS5pbnRlcnNlY3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCxpKXtyZXR1cm4gZT49dCYmdCtpPmV9cmV0dXJuIGZ1bmN0aW9uKHQsaSxzLG4pe2lmKCFpLm9mZnNldClyZXR1cm4hMTt2YXIgYT0odC5wb3NpdGlvbkFic3x8dC5wb3NpdGlvbi5hYnNvbHV0ZSkubGVmdCt0Lm1hcmdpbnMubGVmdCxvPSh0LnBvc2l0aW9uQWJzfHx0LnBvc2l0aW9uLmFic29sdXRlKS50b3ArdC5tYXJnaW5zLnRvcCxyPWErdC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxoPW8rdC5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsbD1pLm9mZnNldC5sZWZ0LHU9aS5vZmZzZXQudG9wLGQ9bCtpLnByb3BvcnRpb25zKCkud2lkdGgsYz11K2kucHJvcG9ydGlvbnMoKS5oZWlnaHQ7c3dpdGNoKHMpe2Nhc2VcImZpdFwiOnJldHVybiBhPj1sJiZkPj1yJiZvPj11JiZjPj1oO2Nhc2VcImludGVyc2VjdFwiOnJldHVybiBhK3QuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMj5sJiZkPnItdC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yJiZvK3QuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzI+dSYmYz5oLXQuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzI7Y2FzZVwicG9pbnRlclwiOnJldHVybiBlKG4ucGFnZVksdSxpLnByb3BvcnRpb25zKCkuaGVpZ2h0KSYmZShuLnBhZ2VYLGwsaS5wcm9wb3J0aW9ucygpLndpZHRoKTtjYXNlXCJ0b3VjaFwiOnJldHVybihvPj11JiZjPj1vfHxoPj11JiZjPj1ofHx1Pm8mJmg+YykmJihhPj1sJiZkPj1hfHxyPj1sJiZkPj1yfHxsPmEmJnI+ZCk7ZGVmYXVsdDpyZXR1cm4hMX19fSgpLGUudWkuZGRtYW5hZ2VyPXtjdXJyZW50Om51bGwsZHJvcHBhYmxlczp7XCJkZWZhdWx0XCI6W119LHByZXBhcmVPZmZzZXRzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhPWUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdC5vcHRpb25zLnNjb3BlXXx8W10sbz1pP2kudHlwZTpudWxsLHI9KHQuY3VycmVudEl0ZW18fHQuZWxlbWVudCkuZmluZChcIjpkYXRhKHVpLWRyb3BwYWJsZSlcIikuYWRkQmFjaygpO2U6Zm9yKHM9MDthLmxlbmd0aD5zO3MrKylpZighKGFbc10ub3B0aW9ucy5kaXNhYmxlZHx8dCYmIWFbc10uYWNjZXB0LmNhbGwoYVtzXS5lbGVtZW50WzBdLHQuY3VycmVudEl0ZW18fHQuZWxlbWVudCkpKXtmb3Iobj0wO3IubGVuZ3RoPm47bisrKWlmKHJbbl09PT1hW3NdLmVsZW1lbnRbMF0pe2Fbc10ucHJvcG9ydGlvbnMoKS5oZWlnaHQ9MDtjb250aW51ZSBlfWFbc10udmlzaWJsZT1cIm5vbmVcIiE9PWFbc10uZWxlbWVudC5jc3MoXCJkaXNwbGF5XCIpLGFbc10udmlzaWJsZSYmKFwibW91c2Vkb3duXCI9PT1vJiZhW3NdLl9hY3RpdmF0ZS5jYWxsKGFbc10saSksYVtzXS5vZmZzZXQ9YVtzXS5lbGVtZW50Lm9mZnNldCgpLGFbc10ucHJvcG9ydGlvbnMoe3dpZHRoOmFbc10uZWxlbWVudFswXS5vZmZzZXRXaWR0aCxoZWlnaHQ6YVtzXS5lbGVtZW50WzBdLm9mZnNldEhlaWdodH0pKX19LGRyb3A6ZnVuY3Rpb24odCxpKXt2YXIgcz0hMTtyZXR1cm4gZS5lYWNoKChlLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3Qub3B0aW9ucy5zY29wZV18fFtdKS5zbGljZSgpLGZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zJiYoIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy52aXNpYmxlJiZlLnVpLmludGVyc2VjdCh0LHRoaXMsdGhpcy5vcHRpb25zLnRvbGVyYW5jZSxpKSYmKHM9dGhpcy5fZHJvcC5jYWxsKHRoaXMsaSl8fHMpLCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMudmlzaWJsZSYmdGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sdC5jdXJyZW50SXRlbXx8dC5lbGVtZW50KSYmKHRoaXMuaXNvdXQ9ITAsdGhpcy5pc292ZXI9ITEsdGhpcy5fZGVhY3RpdmF0ZS5jYWxsKHRoaXMsaSkpKX0pLHN9LGRyYWdTdGFydDpmdW5jdGlvbih0LGkpe3QuZWxlbWVudC5wYXJlbnRzVW50aWwoXCJib2R5XCIpLmJpbmQoXCJzY3JvbGwuZHJvcHBhYmxlXCIsZnVuY3Rpb24oKXt0Lm9wdGlvbnMucmVmcmVzaFBvc2l0aW9uc3x8ZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModCxpKX0pfSxkcmFnOmZ1bmN0aW9uKHQsaSl7dC5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnMmJmUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHQsaSksZS5lYWNoKGUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdC5vcHRpb25zLnNjb3BlXXx8W10sZnVuY3Rpb24oKXtpZighdGhpcy5vcHRpb25zLmRpc2FibGVkJiYhdGhpcy5ncmVlZHlDaGlsZCYmdGhpcy52aXNpYmxlKXt2YXIgcyxuLGEsbz1lLnVpLmludGVyc2VjdCh0LHRoaXMsdGhpcy5vcHRpb25zLnRvbGVyYW5jZSxpKSxyPSFvJiZ0aGlzLmlzb3Zlcj9cImlzb3V0XCI6byYmIXRoaXMuaXNvdmVyP1wiaXNvdmVyXCI6bnVsbDtyJiYodGhpcy5vcHRpb25zLmdyZWVkeSYmKG49dGhpcy5vcHRpb25zLnNjb3BlLGE9dGhpcy5lbGVtZW50LnBhcmVudHMoXCI6ZGF0YSh1aS1kcm9wcGFibGUpXCIpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBlKHRoaXMpLmRyb3BwYWJsZShcImluc3RhbmNlXCIpLm9wdGlvbnMuc2NvcGU9PT1ufSksYS5sZW5ndGgmJihzPWUoYVswXSkuZHJvcHBhYmxlKFwiaW5zdGFuY2VcIikscy5ncmVlZHlDaGlsZD1cImlzb3ZlclwiPT09cikpLHMmJlwiaXNvdmVyXCI9PT1yJiYocy5pc292ZXI9ITEscy5pc291dD0hMCxzLl9vdXQuY2FsbChzLGkpKSx0aGlzW3JdPSEwLHRoaXNbXCJpc291dFwiPT09cj9cImlzb3ZlclwiOlwiaXNvdXRcIl09ITEsdGhpc1tcImlzb3ZlclwiPT09cj9cIl9vdmVyXCI6XCJfb3V0XCJdLmNhbGwodGhpcyxpKSxzJiZcImlzb3V0XCI9PT1yJiYocy5pc291dD0hMSxzLmlzb3Zlcj0hMCxzLl9vdmVyLmNhbGwocyxpKSkpfX0pfSxkcmFnU3RvcDpmdW5jdGlvbih0LGkpe3QuZWxlbWVudC5wYXJlbnRzVW50aWwoXCJib2R5XCIpLnVuYmluZChcInNjcm9sbC5kcm9wcGFibGVcIiksdC5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnN8fGUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHQsaSl9fSxlLnVpLmRyb3BwYWJsZTt2YXIgeT1cInVpLWVmZmVjdHMtXCIsYj1lO2UuZWZmZWN0cz17ZWZmZWN0Ont9fSxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGkoZSx0LGkpe3ZhciBzPWRbdC50eXBlXXx8e307cmV0dXJuIG51bGw9PWU/aXx8IXQuZGVmP251bGw6dC5kZWY6KGU9cy5mbG9vcj9+fmU6cGFyc2VGbG9hdChlKSxpc05hTihlKT90LmRlZjpzLm1vZD8oZStzLm1vZCklcy5tb2Q6MD5lPzA6ZT5zLm1heD9zLm1heDplKX1mdW5jdGlvbiBzKGkpe3ZhciBzPWwoKSxuPXMuX3JnYmE9W107cmV0dXJuIGk9aS50b0xvd2VyQ2FzZSgpLGYoaCxmdW5jdGlvbihlLGEpe3ZhciBvLHI9YS5yZS5leGVjKGkpLGg9ciYmYS5wYXJzZShyKSxsPWEuc3BhY2V8fFwicmdiYVwiO3JldHVybiBoPyhvPXNbbF0oaCksc1t1W2xdLmNhY2hlXT1vW3VbbF0uY2FjaGVdLG49cy5fcmdiYT1vLl9yZ2JhLCExKTp0fSksbi5sZW5ndGg/KFwiMCwwLDAsMFwiPT09bi5qb2luKCkmJmUuZXh0ZW5kKG4sYS50cmFuc3BhcmVudCkscyk6YVtpXX1mdW5jdGlvbiBuKGUsdCxpKXtyZXR1cm4gaT0oaSsxKSUxLDE+NippP2UrNioodC1lKSppOjE+MippP3Q6Mj4zKmk/ZSs2Kih0LWUpKigyLzMtaSk6ZX12YXIgYSxvPVwiYmFja2dyb3VuZENvbG9yIGJvcmRlckJvdHRvbUNvbG9yIGJvcmRlckxlZnRDb2xvciBib3JkZXJSaWdodENvbG9yIGJvcmRlclRvcENvbG9yIGNvbG9yIGNvbHVtblJ1bGVDb2xvciBvdXRsaW5lQ29sb3IgdGV4dERlY29yYXRpb25Db2xvciB0ZXh0RW1waGFzaXNDb2xvclwiLHI9L14oW1xcLStdKT1cXHMqKFxcZCtcXC4/XFxkKikvLGg9W3tyZTovcmdiYT9cXChcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqLFxccyooXFxkezEsM30pXFxzKig/OixcXHMqKFxcZD8oPzpcXC5cXGQrKT8pXFxzKik/XFwpLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bZVsxXSxlWzJdLGVbM10sZVs0XV19fSx7cmU6L3JnYmE/XFwoXFxzKihcXGQrKD86XFwuXFxkKyk/KVxcJVxccyosXFxzKihcXGQrKD86XFwuXFxkKyk/KVxcJVxccyosXFxzKihcXGQrKD86XFwuXFxkKyk/KVxcJVxccyooPzosXFxzKihcXGQ/KD86XFwuXFxkKyk/KVxccyopP1xcKS8scGFyc2U6ZnVuY3Rpb24oZSl7cmV0dXJuWzIuNTUqZVsxXSwyLjU1KmVbMl0sMi41NSplWzNdLGVbNF1dfX0se3JlOi8jKFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkoW2EtZjAtOV17Mn0pLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bcGFyc2VJbnQoZVsxXSwxNikscGFyc2VJbnQoZVsyXSwxNikscGFyc2VJbnQoZVszXSwxNildfX0se3JlOi8jKFthLWYwLTldKShbYS1mMC05XSkoW2EtZjAtOV0pLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bcGFyc2VJbnQoZVsxXStlWzFdLDE2KSxwYXJzZUludChlWzJdK2VbMl0sMTYpLHBhcnNlSW50KGVbM10rZVszXSwxNildfX0se3JlOi9oc2xhP1xcKFxccyooXFxkKyg/OlxcLlxcZCspPylcXHMqLFxccyooXFxkKyg/OlxcLlxcZCspPylcXCVcXHMqLFxccyooXFxkKyg/OlxcLlxcZCspPylcXCVcXHMqKD86LFxccyooXFxkPyg/OlxcLlxcZCspPylcXHMqKT9cXCkvLHNwYWNlOlwiaHNsYVwiLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltlWzFdLGVbMl0vMTAwLGVbM10vMTAwLGVbNF1dfX1dLGw9ZS5Db2xvcj1mdW5jdGlvbih0LGkscyxuKXtyZXR1cm4gbmV3IGUuQ29sb3IuZm4ucGFyc2UodCxpLHMsbil9LHU9e3JnYmE6e3Byb3BzOntyZWQ6e2lkeDowLHR5cGU6XCJieXRlXCJ9LGdyZWVuOntpZHg6MSx0eXBlOlwiYnl0ZVwifSxibHVlOntpZHg6Mix0eXBlOlwiYnl0ZVwifX19LGhzbGE6e3Byb3BzOntodWU6e2lkeDowLHR5cGU6XCJkZWdyZWVzXCJ9LHNhdHVyYXRpb246e2lkeDoxLHR5cGU6XCJwZXJjZW50XCJ9LGxpZ2h0bmVzczp7aWR4OjIsdHlwZTpcInBlcmNlbnRcIn19fX0sZD17XCJieXRlXCI6e2Zsb29yOiEwLG1heDoyNTV9LHBlcmNlbnQ6e21heDoxfSxkZWdyZWVzOnttb2Q6MzYwLGZsb29yOiEwfX0sYz1sLnN1cHBvcnQ9e30scD1lKFwiPHA+XCIpWzBdLGY9ZS5lYWNoO3Auc3R5bGUuY3NzVGV4dD1cImJhY2tncm91bmQtY29sb3I6cmdiYSgxLDEsMSwuNSlcIixjLnJnYmE9cC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IuaW5kZXhPZihcInJnYmFcIik+LTEsZih1LGZ1bmN0aW9uKGUsdCl7dC5jYWNoZT1cIl9cIitlLHQucHJvcHMuYWxwaGE9e2lkeDozLHR5cGU6XCJwZXJjZW50XCIsZGVmOjF9fSksbC5mbj1lLmV4dGVuZChsLnByb3RvdHlwZSx7cGFyc2U6ZnVuY3Rpb24obixvLHIsaCl7aWYobj09PXQpcmV0dXJuIHRoaXMuX3JnYmE9W251bGwsbnVsbCxudWxsLG51bGxdLHRoaXM7KG4uanF1ZXJ5fHxuLm5vZGVUeXBlKSYmKG49ZShuKS5jc3Mobyksbz10KTt2YXIgZD10aGlzLGM9ZS50eXBlKG4pLHA9dGhpcy5fcmdiYT1bXTtyZXR1cm4gbyE9PXQmJihuPVtuLG8scixoXSxjPVwiYXJyYXlcIiksXCJzdHJpbmdcIj09PWM/dGhpcy5wYXJzZShzKG4pfHxhLl9kZWZhdWx0KTpcImFycmF5XCI9PT1jPyhmKHUucmdiYS5wcm9wcyxmdW5jdGlvbihlLHQpe3BbdC5pZHhdPWkoblt0LmlkeF0sdCl9KSx0aGlzKTpcIm9iamVjdFwiPT09Yz8obiBpbnN0YW5jZW9mIGw/Zih1LGZ1bmN0aW9uKGUsdCl7blt0LmNhY2hlXSYmKGRbdC5jYWNoZV09blt0LmNhY2hlXS5zbGljZSgpKX0pOmYodSxmdW5jdGlvbih0LHMpe3ZhciBhPXMuY2FjaGU7ZihzLnByb3BzLGZ1bmN0aW9uKGUsdCl7aWYoIWRbYV0mJnMudG8pe2lmKFwiYWxwaGFcIj09PWV8fG51bGw9PW5bZV0pcmV0dXJuO2RbYV09cy50byhkLl9yZ2JhKX1kW2FdW3QuaWR4XT1pKG5bZV0sdCwhMCl9KSxkW2FdJiYwPmUuaW5BcnJheShudWxsLGRbYV0uc2xpY2UoMCwzKSkmJihkW2FdWzNdPTEscy5mcm9tJiYoZC5fcmdiYT1zLmZyb20oZFthXSkpKX0pLHRoaXMpOnR9LGlzOmZ1bmN0aW9uKGUpe3ZhciBpPWwoZSkscz0hMCxuPXRoaXM7cmV0dXJuIGYodSxmdW5jdGlvbihlLGEpe3ZhciBvLHI9aVthLmNhY2hlXTtyZXR1cm4gciYmKG89blthLmNhY2hlXXx8YS50byYmYS50byhuLl9yZ2JhKXx8W10sZihhLnByb3BzLGZ1bmN0aW9uKGUsaSl7cmV0dXJuIG51bGwhPXJbaS5pZHhdP3M9cltpLmlkeF09PT1vW2kuaWR4XTp0fSkpLHN9KSxzfSxfc3BhY2U6ZnVuY3Rpb24oKXt2YXIgZT1bXSx0PXRoaXM7cmV0dXJuIGYodSxmdW5jdGlvbihpLHMpe3Rbcy5jYWNoZV0mJmUucHVzaChpKX0pLGUucG9wKCl9LHRyYW5zaXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgcz1sKGUpLG49cy5fc3BhY2UoKSxhPXVbbl0sbz0wPT09dGhpcy5hbHBoYSgpP2woXCJ0cmFuc3BhcmVudFwiKTp0aGlzLHI9b1thLmNhY2hlXXx8YS50byhvLl9yZ2JhKSxoPXIuc2xpY2UoKTtyZXR1cm4gcz1zW2EuY2FjaGVdLGYoYS5wcm9wcyxmdW5jdGlvbihlLG4pe3ZhciBhPW4uaWR4LG89clthXSxsPXNbYV0sdT1kW24udHlwZV18fHt9O251bGwhPT1sJiYobnVsbD09PW8/aFthXT1sOih1Lm1vZCYmKGwtbz51Lm1vZC8yP28rPXUubW9kOm8tbD51Lm1vZC8yJiYoby09dS5tb2QpKSxoW2FdPWkoKGwtbykqdCtvLG4pKSl9KSx0aGlzW25dKGgpfSxibGVuZDpmdW5jdGlvbih0KXtpZigxPT09dGhpcy5fcmdiYVszXSlyZXR1cm4gdGhpczt2YXIgaT10aGlzLl9yZ2JhLnNsaWNlKCkscz1pLnBvcCgpLG49bCh0KS5fcmdiYTtyZXR1cm4gbChlLm1hcChpLGZ1bmN0aW9uKGUsdCl7cmV0dXJuKDEtcykqblt0XStzKmV9KSl9LHRvUmdiYVN0cmluZzpmdW5jdGlvbigpe3ZhciB0PVwicmdiYShcIixpPWUubWFwKHRoaXMuX3JnYmEsZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09ZT90PjI/MTowOmV9KTtyZXR1cm4gMT09PWlbM10mJihpLnBvcCgpLHQ9XCJyZ2IoXCIpLHQraS5qb2luKCkrXCIpXCJ9LHRvSHNsYVN0cmluZzpmdW5jdGlvbigpe3ZhciB0PVwiaHNsYShcIixpPWUubWFwKHRoaXMuaHNsYSgpLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWUmJihlPXQ+Mj8xOjApLHQmJjM+dCYmKGU9TWF0aC5yb3VuZCgxMDAqZSkrXCIlXCIpLGV9KTtyZXR1cm4gMT09PWlbM10mJihpLnBvcCgpLHQ9XCJoc2woXCIpLHQraS5qb2luKCkrXCIpXCJ9LHRvSGV4U3RyaW5nOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX3JnYmEuc2xpY2UoKSxzPWkucG9wKCk7cmV0dXJuIHQmJmkucHVzaCh+figyNTUqcykpLFwiI1wiK2UubWFwKGksZnVuY3Rpb24oZSl7cmV0dXJuIGU9KGV8fDApLnRvU3RyaW5nKDE2KSwxPT09ZS5sZW5ndGg/XCIwXCIrZTplfSkuam9pbihcIlwiKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuX3JnYmFbM10/XCJ0cmFuc3BhcmVudFwiOnRoaXMudG9SZ2JhU3RyaW5nKCl9fSksbC5mbi5wYXJzZS5wcm90b3R5cGU9bC5mbix1LmhzbGEudG89ZnVuY3Rpb24oZSl7aWYobnVsbD09ZVswXXx8bnVsbD09ZVsxXXx8bnVsbD09ZVsyXSlyZXR1cm5bbnVsbCxudWxsLG51bGwsZVszXV07dmFyIHQsaSxzPWVbMF0vMjU1LG49ZVsxXS8yNTUsYT1lWzJdLzI1NSxvPWVbM10scj1NYXRoLm1heChzLG4sYSksaD1NYXRoLm1pbihzLG4sYSksbD1yLWgsdT1yK2gsZD0uNSp1O3JldHVybiB0PWg9PT1yPzA6cz09PXI/NjAqKG4tYSkvbCszNjA6bj09PXI/NjAqKGEtcykvbCsxMjA6NjAqKHMtbikvbCsyNDAsaT0wPT09bD8wOi41Pj1kP2wvdTpsLygyLXUpLFtNYXRoLnJvdW5kKHQpJTM2MCxpLGQsbnVsbD09bz8xOm9dfSx1LmhzbGEuZnJvbT1mdW5jdGlvbihlKXtpZihudWxsPT1lWzBdfHxudWxsPT1lWzFdfHxudWxsPT1lWzJdKXJldHVybltudWxsLG51bGwsbnVsbCxlWzNdXTt2YXIgdD1lWzBdLzM2MCxpPWVbMV0scz1lWzJdLGE9ZVszXSxvPS41Pj1zP3MqKDEraSk6cytpLXMqaSxyPTIqcy1vO3JldHVybltNYXRoLnJvdW5kKDI1NSpuKHIsbyx0KzEvMykpLE1hdGgucm91bmQoMjU1Km4ocixvLHQpKSxNYXRoLnJvdW5kKDI1NSpuKHIsbyx0LTEvMykpLGFdfSxmKHUsZnVuY3Rpb24ocyxuKXt2YXIgYT1uLnByb3BzLG89bi5jYWNoZSxoPW4udG8sdT1uLmZyb207bC5mbltzXT1mdW5jdGlvbihzKXtpZihoJiYhdGhpc1tvXSYmKHRoaXNbb109aCh0aGlzLl9yZ2JhKSkscz09PXQpcmV0dXJuIHRoaXNbb10uc2xpY2UoKTt2YXIgbixyPWUudHlwZShzKSxkPVwiYXJyYXlcIj09PXJ8fFwib2JqZWN0XCI9PT1yP3M6YXJndW1lbnRzLGM9dGhpc1tvXS5zbGljZSgpO3JldHVybiBmKGEsZnVuY3Rpb24oZSx0KXt2YXIgcz1kW1wib2JqZWN0XCI9PT1yP2U6dC5pZHhdO251bGw9PXMmJihzPWNbdC5pZHhdKSxjW3QuaWR4XT1pKHMsdCl9KSx1PyhuPWwodShjKSksbltvXT1jLG4pOmwoYyl9LGYoYSxmdW5jdGlvbih0LGkpe2wuZm5bdF18fChsLmZuW3RdPWZ1bmN0aW9uKG4pe3ZhciBhLG89ZS50eXBlKG4pLGg9XCJhbHBoYVwiPT09dD90aGlzLl9oc2xhP1wiaHNsYVwiOlwicmdiYVwiOnMsbD10aGlzW2hdKCksdT1sW2kuaWR4XTtyZXR1cm5cInVuZGVmaW5lZFwiPT09bz91OihcImZ1bmN0aW9uXCI9PT1vJiYobj1uLmNhbGwodGhpcyx1KSxvPWUudHlwZShuKSksbnVsbD09biYmaS5lbXB0eT90aGlzOihcInN0cmluZ1wiPT09byYmKGE9ci5leGVjKG4pLGEmJihuPXUrcGFyc2VGbG9hdChhWzJdKSooXCIrXCI9PT1hWzFdPzE6LTEpKSksbFtpLmlkeF09bix0aGlzW2hdKGwpKSl9KX0pfSksbC5ob29rPWZ1bmN0aW9uKHQpe3ZhciBpPXQuc3BsaXQoXCIgXCIpO2YoaSxmdW5jdGlvbih0LGkpe2UuY3NzSG9va3NbaV09e3NldDpmdW5jdGlvbih0LG4pe3ZhciBhLG8scj1cIlwiO2lmKFwidHJhbnNwYXJlbnRcIiE9PW4mJihcInN0cmluZ1wiIT09ZS50eXBlKG4pfHwoYT1zKG4pKSkpe2lmKG49bChhfHxuKSwhYy5yZ2JhJiYxIT09bi5fcmdiYVszXSl7Zm9yKG89XCJiYWNrZ3JvdW5kQ29sb3JcIj09PWk/dC5wYXJlbnROb2RlOnQ7KFwiXCI9PT1yfHxcInRyYW5zcGFyZW50XCI9PT1yKSYmbyYmby5zdHlsZTspdHJ5e3I9ZS5jc3MobyxcImJhY2tncm91bmRDb2xvclwiKSxvPW8ucGFyZW50Tm9kZX1jYXRjaChoKXt9bj1uLmJsZW5kKHImJlwidHJhbnNwYXJlbnRcIiE9PXI/cjpcIl9kZWZhdWx0XCIpfW49bi50b1JnYmFTdHJpbmcoKX10cnl7dC5zdHlsZVtpXT1ufWNhdGNoKGgpe319fSxlLmZ4LnN0ZXBbaV09ZnVuY3Rpb24odCl7dC5jb2xvckluaXR8fCh0LnN0YXJ0PWwodC5lbGVtLGkpLHQuZW5kPWwodC5lbmQpLHQuY29sb3JJbml0PSEwKSxlLmNzc0hvb2tzW2ldLnNldCh0LmVsZW0sdC5zdGFydC50cmFuc2l0aW9uKHQuZW5kLHQucG9zKSl9fSl9LGwuaG9vayhvKSxlLmNzc0hvb2tzLmJvcmRlckNvbG9yPXtleHBhbmQ6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGYoW1wiVG9wXCIsXCJSaWdodFwiLFwiQm90dG9tXCIsXCJMZWZ0XCJdLGZ1bmN0aW9uKGkscyl7dFtcImJvcmRlclwiK3MrXCJDb2xvclwiXT1lfSksdH19LGE9ZS5Db2xvci5uYW1lcz17YXF1YTpcIiMwMGZmZmZcIixibGFjazpcIiMwMDAwMDBcIixibHVlOlwiIzAwMDBmZlwiLGZ1Y2hzaWE6XCIjZmYwMGZmXCIsZ3JheTpcIiM4MDgwODBcIixncmVlbjpcIiMwMDgwMDBcIixsaW1lOlwiIzAwZmYwMFwiLG1hcm9vbjpcIiM4MDAwMDBcIixuYXZ5OlwiIzAwMDA4MFwiLG9saXZlOlwiIzgwODAwMFwiLHB1cnBsZTpcIiM4MDAwODBcIixyZWQ6XCIjZmYwMDAwXCIsc2lsdmVyOlwiI2MwYzBjMFwiLHRlYWw6XCIjMDA4MDgwXCIsd2hpdGU6XCIjZmZmZmZmXCIseWVsbG93OlwiI2ZmZmYwMFwiLHRyYW5zcGFyZW50OltudWxsLG51bGwsbnVsbCwwXSxfZGVmYXVsdDpcIiNmZmZmZmZcIn19KGIpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgaSxzLG49dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3P3Qub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCk6dC5jdXJyZW50U3R5bGUsYT17fTtpZihuJiZuLmxlbmd0aCYmblswXSYmbltuWzBdXSlmb3Iocz1uLmxlbmd0aDtzLS07KWk9bltzXSxcInN0cmluZ1wiPT10eXBlb2YgbltpXSYmKGFbZS5jYW1lbENhc2UoaSldPW5baV0pO2Vsc2UgZm9yKGkgaW4gbilcInN0cmluZ1wiPT10eXBlb2YgbltpXSYmKGFbaV09bltpXSk7cmV0dXJuIGF9ZnVuY3Rpb24gaSh0LGkpe3ZhciBzLGEsbz17fTtmb3IocyBpbiBpKWE9aVtzXSx0W3NdIT09YSYmKG5bc118fChlLmZ4LnN0ZXBbc118fCFpc05hTihwYXJzZUZsb2F0KGEpKSkmJihvW3NdPWEpKTtyZXR1cm4gb312YXIgcz1bXCJhZGRcIixcInJlbW92ZVwiLFwidG9nZ2xlXCJdLG49e2JvcmRlcjoxLGJvcmRlckJvdHRvbToxLGJvcmRlckNvbG9yOjEsYm9yZGVyTGVmdDoxLGJvcmRlclJpZ2h0OjEsYm9yZGVyVG9wOjEsYm9yZGVyV2lkdGg6MSxtYXJnaW46MSxwYWRkaW5nOjF9O2UuZWFjaChbXCJib3JkZXJMZWZ0U3R5bGVcIixcImJvcmRlclJpZ2h0U3R5bGVcIixcImJvcmRlckJvdHRvbVN0eWxlXCIsXCJib3JkZXJUb3BTdHlsZVwiXSxmdW5jdGlvbih0LGkpe2UuZnguc3RlcFtpXT1mdW5jdGlvbihlKXsoXCJub25lXCIhPT1lLmVuZCYmIWUuc2V0QXR0cnx8MT09PWUucG9zJiYhZS5zZXRBdHRyKSYmKGIuc3R5bGUoZS5lbGVtLGksZS5lbmQpLGUuc2V0QXR0cj0hMCl9fSksZS5mbi5hZGRCYWNrfHwoZS5mbi5hZGRCYWNrPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmFkZChudWxsPT1lP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGUpKX0pLGUuZWZmZWN0cy5hbmltYXRlQ2xhc3M9ZnVuY3Rpb24obixhLG8scil7dmFyIGg9ZS5zcGVlZChhLG8scik7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYSxvPWUodGhpcykscj1vLmF0dHIoXCJjbGFzc1wiKXx8XCJcIixsPWguY2hpbGRyZW4/by5maW5kKFwiKlwiKS5hZGRCYWNrKCk6bztsPWwubWFwKGZ1bmN0aW9uKCl7dmFyIGk9ZSh0aGlzKTtyZXR1cm57ZWw6aSxzdGFydDp0KHRoaXMpfX0pLGE9ZnVuY3Rpb24oKXtlLmVhY2gocyxmdW5jdGlvbihlLHQpe25bdF0mJm9bdCtcIkNsYXNzXCJdKG5bdF0pfSl9LGEoKSxsPWwubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kPXQodGhpcy5lbFswXSksdGhpcy5kaWZmPWkodGhpcy5zdGFydCx0aGlzLmVuZCksdGhpc30pLG8uYXR0cihcImNsYXNzXCIsciksbD1sLm1hcChmdW5jdGlvbigpe3ZhciB0PXRoaXMsaT1lLkRlZmVycmVkKCkscz1lLmV4dGVuZCh7fSxoLHtxdWV1ZTohMSxjb21wbGV0ZTpmdW5jdGlvbigpe2kucmVzb2x2ZSh0KX19KTtyZXR1cm4gdGhpcy5lbC5hbmltYXRlKHRoaXMuZGlmZixzKSxpLnByb21pc2UoKX0pLGUud2hlbi5hcHBseShlLGwuZ2V0KCkpLmRvbmUoZnVuY3Rpb24oKXthKCksZS5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWw7ZS5lYWNoKHRoaXMuZGlmZixmdW5jdGlvbihlKXt0LmNzcyhlLFwiXCIpfSl9KSxoLmNvbXBsZXRlLmNhbGwob1swXSl9KX0pfSxlLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkscyxuLGEpe3JldHVybiBzP2UuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHthZGQ6aX0scyxuLGEpOnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oZS5mbi5hZGRDbGFzcykscmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkscyxuLGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/ZS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5jYWxsKHRoaXMse3JlbW92ZTppfSxzLG4sYSk6dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fShlLmZuLnJlbW92ZUNsYXNzKSx0b2dnbGVDbGFzczpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oaSxzLG4sYSxvKXtyZXR1cm5cImJvb2xlYW5cIj09dHlwZW9mIHN8fHZvaWQgMD09PXM/bj9lLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyxzP3thZGQ6aX06e3JlbW92ZTppfSxuLGEsbyk6dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5jYWxsKHRoaXMse3RvZ2dsZTppfSxzLG4sYSl9fShlLmZuLnRvZ2dsZUNsYXNzKSxzd2l0Y2hDbGFzczpmdW5jdGlvbih0LGkscyxuLGEpe3JldHVybiBlLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyx7YWRkOmkscmVtb3ZlOnR9LHMsbixhKX19KX0oKSxmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxpLHMsbil7cmV0dXJuIGUuaXNQbGFpbk9iamVjdCh0KSYmKGk9dCx0PXQuZWZmZWN0KSx0PXtlZmZlY3Q6dH0sbnVsbD09aSYmKGk9e30pLGUuaXNGdW5jdGlvbihpKSYmKG49aSxzPW51bGwsaT17fSksKFwibnVtYmVyXCI9PXR5cGVvZiBpfHxlLmZ4LnNwZWVkc1tpXSkmJihuPXMscz1pLGk9e30pLGUuaXNGdW5jdGlvbihzKSYmKG49cyxzPW51bGwpLGkmJmUuZXh0ZW5kKHQsaSkscz1zfHxpLmR1cmF0aW9uLHQuZHVyYXRpb249ZS5meC5vZmY/MDpcIm51bWJlclwiPT10eXBlb2Ygcz9zOnMgaW4gZS5meC5zcGVlZHM/ZS5meC5zcGVlZHNbc106ZS5meC5zcGVlZHMuX2RlZmF1bHQsdC5jb21wbGV0ZT1ufHxpLmNvbXBsZXRlLHR9ZnVuY3Rpb24gaSh0KXtyZXR1cm4hdHx8XCJudW1iZXJcIj09dHlwZW9mIHR8fGUuZnguc3BlZWRzW3RdPyEwOlwic3RyaW5nXCIhPXR5cGVvZiB0fHxlLmVmZmVjdHMuZWZmZWN0W3RdP2UuaXNGdW5jdGlvbih0KT8hMDpcIm9iamVjdFwiIT10eXBlb2YgdHx8dC5lZmZlY3Q/ITE6ITA6ITB9ZS5leHRlbmQoZS5lZmZlY3RzLHt2ZXJzaW9uOlwiMS4xMS40XCIsc2F2ZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgaT0wO3QubGVuZ3RoPmk7aSsrKW51bGwhPT10W2ldJiZlLmRhdGEoeSt0W2ldLGVbMF0uc3R5bGVbdFtpXV0pfSxyZXN0b3JlOmZ1bmN0aW9uKGUsdCl7dmFyIGkscztmb3Iocz0wO3QubGVuZ3RoPnM7cysrKW51bGwhPT10W3NdJiYoaT1lLmRhdGEoeSt0W3NdKSx2b2lkIDA9PT1pJiYoaT1cIlwiKSxlLmNzcyh0W3NdLGkpKX0sc2V0TW9kZTpmdW5jdGlvbihlLHQpe3JldHVyblwidG9nZ2xlXCI9PT10JiYodD1lLmlzKFwiOmhpZGRlblwiKT9cInNob3dcIjpcImhpZGVcIiksdH0sZ2V0QmFzZWxpbmU6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzO3N3aXRjaChlWzBdKXtjYXNlXCJ0b3BcIjppPTA7YnJlYWs7Y2FzZVwibWlkZGxlXCI6aT0uNTticmVhaztjYXNlXCJib3R0b21cIjppPTE7YnJlYWs7ZGVmYXVsdDppPWVbMF0vdC5oZWlnaHR9c3dpdGNoKGVbMV0pe2Nhc2VcImxlZnRcIjpzPTA7YnJlYWs7Y2FzZVwiY2VudGVyXCI6cz0uNTticmVhaztjYXNlXCJyaWdodFwiOnM9MTticmVhaztkZWZhdWx0OnM9ZVsxXS90LndpZHRofXJldHVybnt4OnMseTppfX0sY3JlYXRlV3JhcHBlcjpmdW5jdGlvbih0KXtpZih0LnBhcmVudCgpLmlzKFwiLnVpLWVmZmVjdHMtd3JhcHBlclwiKSlyZXR1cm4gdC5wYXJlbnQoKTt2YXIgaT17d2lkdGg6dC5vdXRlcldpZHRoKCEwKSxoZWlnaHQ6dC5vdXRlckhlaWdodCghMCksXCJmbG9hdFwiOnQuY3NzKFwiZmxvYXRcIil9LHM9ZShcIjxkaXY+PC9kaXY+XCIpLmFkZENsYXNzKFwidWktZWZmZWN0cy13cmFwcGVyXCIpLmNzcyh7Zm9udFNpemU6XCIxMDAlXCIsYmFja2dyb3VuZDpcInRyYW5zcGFyZW50XCIsYm9yZGVyOlwibm9uZVwiLG1hcmdpbjowLHBhZGRpbmc6MH0pLG49e3dpZHRoOnQud2lkdGgoKSxoZWlnaHQ6dC5oZWlnaHQoKX0sYT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O3RyeXthLmlkfWNhdGNoKG8pe2E9ZG9jdW1lbnQuYm9keX1yZXR1cm4gdC53cmFwKHMpLCh0WzBdPT09YXx8ZS5jb250YWlucyh0WzBdLGEpKSYmZShhKS5mb2N1cygpLHM9dC5wYXJlbnQoKSxcInN0YXRpY1wiPT09dC5jc3MoXCJwb3NpdGlvblwiKT8ocy5jc3Moe3Bvc2l0aW9uOlwicmVsYXRpdmVcIn0pLHQuY3NzKHtwb3NpdGlvbjpcInJlbGF0aXZlXCJ9KSk6KGUuZXh0ZW5kKGkse3Bvc2l0aW9uOnQuY3NzKFwicG9zaXRpb25cIiksekluZGV4OnQuY3NzKFwiei1pbmRleFwiKX0pLGUuZWFjaChbXCJ0b3BcIixcImxlZnRcIixcImJvdHRvbVwiLFwicmlnaHRcIl0sZnVuY3Rpb24oZSxzKXtpW3NdPXQuY3NzKHMpLGlzTmFOKHBhcnNlSW50KGlbc10sMTApKSYmKGlbc109XCJhdXRvXCIpfSksdC5jc3Moe3Bvc2l0aW9uOlwicmVsYXRpdmVcIix0b3A6MCxsZWZ0OjAscmlnaHQ6XCJhdXRvXCIsYm90dG9tOlwiYXV0b1wifSkpLHQuY3NzKG4pLHMuY3NzKGkpLnNob3coKX0scmVtb3ZlV3JhcHBlcjpmdW5jdGlvbih0KXt2YXIgaT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O3JldHVybiB0LnBhcmVudCgpLmlzKFwiLnVpLWVmZmVjdHMtd3JhcHBlclwiKSYmKHQucGFyZW50KCkucmVwbGFjZVdpdGgodCksKHRbMF09PT1pfHxlLmNvbnRhaW5zKHRbMF0saSkpJiZlKGkpLmZvY3VzKCkpLHR9LHNldFRyYW5zaXRpb246ZnVuY3Rpb24odCxpLHMsbil7cmV0dXJuIG49bnx8e30sZS5lYWNoKGksZnVuY3Rpb24oZSxpKXt2YXIgYT10LmNzc1VuaXQoaSk7YVswXT4wJiYobltpXT1hWzBdKnMrYVsxXSl9KSxufX0pLGUuZm4uZXh0ZW5kKHtlZmZlY3Q6ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKHQpe2Z1bmN0aW9uIGkoKXtlLmlzRnVuY3Rpb24oYSkmJmEuY2FsbChuWzBdKSxlLmlzRnVuY3Rpb24odCkmJnQoKX12YXIgbj1lKHRoaXMpLGE9cy5jb21wbGV0ZSxyPXMubW9kZTsobi5pcyhcIjpoaWRkZW5cIik/XCJoaWRlXCI9PT1yOlwic2hvd1wiPT09cik/KG5bcl0oKSxpKCkpOm8uY2FsbChuWzBdLHMsaSl9dmFyIHM9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbj1zLm1vZGUsYT1zLnF1ZXVlLG89ZS5lZmZlY3RzLmVmZmVjdFtzLmVmZmVjdF07cmV0dXJuIGUuZngub2ZmfHwhbz9uP3RoaXNbbl0ocy5kdXJhdGlvbixzLmNvbXBsZXRlKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtzLmNvbXBsZXRlJiZzLmNvbXBsZXRlLmNhbGwodGhpcyl9KTphPT09ITE/dGhpcy5lYWNoKGkpOnRoaXMucXVldWUoYXx8XCJmeFwiLGkpfSxzaG93OmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihzKXtpZihpKHMpKXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbi5tb2RlPVwic2hvd1wiLHRoaXMuZWZmZWN0LmNhbGwodGhpcyxuKX19KGUuZm4uc2hvdyksaGlkZTpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24ocyl7aWYoaShzKSlyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4ubW9kZT1cImhpZGVcIix0aGlzLmVmZmVjdC5jYWxsKHRoaXMsbil9fShlLmZuLmhpZGUpLHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24ocyl7aWYoaShzKXx8XCJib29sZWFuXCI9PXR5cGVvZiBzKXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbi5tb2RlPVwidG9nZ2xlXCIsdGhpcy5lZmZlY3QuY2FsbCh0aGlzLG4pfX0oZS5mbi50b2dnbGUpLGNzc1VuaXQ6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5jc3ModCkscz1bXTtyZXR1cm4gZS5lYWNoKFtcImVtXCIsXCJweFwiLFwiJVwiLFwicHRcIl0sZnVuY3Rpb24oZSx0KXtpLmluZGV4T2YodCk+MCYmKHM9W3BhcnNlRmxvYXQoaSksdF0pfSksc319KX0oKSxmdW5jdGlvbigpe3ZhciB0PXt9O2UuZWFjaChbXCJRdWFkXCIsXCJDdWJpY1wiLFwiUXVhcnRcIixcIlF1aW50XCIsXCJFeHBvXCJdLGZ1bmN0aW9uKGUsaSl7dFtpXT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5wb3codCxlKzIpfX0pLGUuZXh0ZW5kKHQse1NpbmU6ZnVuY3Rpb24oZSl7cmV0dXJuIDEtTWF0aC5jb3MoZSpNYXRoLlBJLzIpfSxDaXJjOmZ1bmN0aW9uKGUpe3JldHVybiAxLU1hdGguc3FydCgxLWUqZSl9LEVsYXN0aWM6ZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1lfHwxPT09ZT9lOi1NYXRoLnBvdygyLDgqKGUtMSkpKk1hdGguc2luKCg4MCooZS0xKS03LjUpKk1hdGguUEkvMTUpfSxCYWNrOmZ1bmN0aW9uKGUpe3JldHVybiBlKmUqKDMqZS0yKX0sQm91bmNlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxpPTQ7KCh0PU1hdGgucG93KDIsLS1pKSktMSkvMTE+ZTspO3JldHVybiAxL01hdGgucG93KDQsMy1pKS03LjU2MjUqTWF0aC5wb3coKDMqdC0yKS8yMi1lLDIpfX0pLGUuZWFjaCh0LGZ1bmN0aW9uKHQsaSl7ZS5lYXNpbmdbXCJlYXNlSW5cIit0XT1pLGUuZWFzaW5nW1wiZWFzZU91dFwiK3RdPWZ1bmN0aW9uKGUpe3JldHVybiAxLWkoMS1lKX0sZS5lYXNpbmdbXCJlYXNlSW5PdXRcIit0XT1mdW5jdGlvbihlKXtyZXR1cm4uNT5lP2koMiplKS8yOjEtaSgtMiplKzIpLzJ9fSl9KCksZS5lZmZlY3RzLGUuZWZmZWN0cy5lZmZlY3QuYmxpbmQ9ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGEsbz1lKHRoaXMpLHI9L3VwfGRvd258dmVydGljYWwvLGg9L3VwfGxlZnR8dmVydGljYWx8aG9yaXpvbnRhbC8sbD1bXCJwb3NpdGlvblwiLFwidG9wXCIsXCJib3R0b21cIixcImxlZnRcIixcInJpZ2h0XCIsXCJoZWlnaHRcIixcIndpZHRoXCJdLHU9ZS5lZmZlY3RzLnNldE1vZGUobyx0Lm1vZGV8fFwiaGlkZVwiKSxkPXQuZGlyZWN0aW9ufHxcInVwXCIsYz1yLnRlc3QoZCkscD1jP1wiaGVpZ2h0XCI6XCJ3aWR0aFwiLGY9Yz9cInRvcFwiOlwibGVmdFwiLG09aC50ZXN0KGQpLGc9e30sdj1cInNob3dcIj09PXU7by5wYXJlbnQoKS5pcyhcIi51aS1lZmZlY3RzLXdyYXBwZXJcIik/ZS5lZmZlY3RzLnNhdmUoby5wYXJlbnQoKSxsKTplLmVmZmVjdHMuc2F2ZShvLGwpLG8uc2hvdygpLHM9ZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIobykuY3NzKHtvdmVyZmxvdzpcImhpZGRlblwifSksbj1zW3BdKCksYT1wYXJzZUZsb2F0KHMuY3NzKGYpKXx8MCxnW3BdPXY/bjowLG18fChvLmNzcyhjP1wiYm90dG9tXCI6XCJyaWdodFwiLDApLmNzcyhjP1widG9wXCI6XCJsZWZ0XCIsXCJhdXRvXCIpLmNzcyh7cG9zaXRpb246XCJhYnNvbHV0ZVwifSksZ1tmXT12P2E6bithKSx2JiYocy5jc3MocCwwKSxtfHxzLmNzcyhmLGErbikpLHMuYW5pbWF0ZShnLHtkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxxdWV1ZTohMSxjb21wbGV0ZTpmdW5jdGlvbigpe1wiaGlkZVwiPT09dSYmby5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobyxsKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihvKSxpKCl9fSl9LGUuZWZmZWN0cy5lZmZlY3QuYm91bmNlPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhLG89ZSh0aGlzKSxyPVtcInBvc2l0aW9uXCIsXCJ0b3BcIixcImJvdHRvbVwiLFwibGVmdFwiLFwicmlnaHRcIixcImhlaWdodFwiLFwid2lkdGhcIl0saD1lLmVmZmVjdHMuc2V0TW9kZShvLHQubW9kZXx8XCJlZmZlY3RcIiksbD1cImhpZGVcIj09PWgsdT1cInNob3dcIj09PWgsZD10LmRpcmVjdGlvbnx8XCJ1cFwiLGM9dC5kaXN0YW5jZSxwPXQudGltZXN8fDUsZj0yKnArKHV8fGw/MTowKSxtPXQuZHVyYXRpb24vZixnPXQuZWFzaW5nLHY9XCJ1cFwiPT09ZHx8XCJkb3duXCI9PT1kP1widG9wXCI6XCJsZWZ0XCIseT1cInVwXCI9PT1kfHxcImxlZnRcIj09PWQsYj1vLnF1ZXVlKCksXz1iLmxlbmd0aDtmb3IoKHV8fGwpJiZyLnB1c2goXCJvcGFjaXR5XCIpLGUuZWZmZWN0cy5zYXZlKG8sciksby5zaG93KCksZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIobyksY3x8KGM9b1tcInRvcFwiPT09dj9cIm91dGVySGVpZ2h0XCI6XCJvdXRlcldpZHRoXCJdKCkvMyksdSYmKGE9e29wYWNpdHk6MX0sYVt2XT0wLG8uY3NzKFwib3BhY2l0eVwiLDApLmNzcyh2LHk/MiotYzoyKmMpLmFuaW1hdGUoYSxtLGcpKSxsJiYoYy89TWF0aC5wb3coMixwLTEpKSxhPXt9LGFbdl09MCxzPTA7cD5zO3MrKyluPXt9LG5bdl09KHk/XCItPVwiOlwiKz1cIikrYyxvLmFuaW1hdGUobixtLGcpLmFuaW1hdGUoYSxtLGcpLGM9bD8yKmM6Yy8yO2wmJihuPXtvcGFjaXR5OjB9LG5bdl09KHk/XCItPVwiOlwiKz1cIikrYyxvLmFuaW1hdGUobixtLGcpKSxvLnF1ZXVlKGZ1bmN0aW9uKCl7bCYmby5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobyxyKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihvKSxpKCl9KSxfPjEmJmIuc3BsaWNlLmFwcGx5KGIsWzEsMF0uY29uY2F0KGIuc3BsaWNlKF8sZisxKSkpLG8uZGVxdWV1ZSgpfSxlLmVmZmVjdHMuZWZmZWN0LmNsaXA9ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGEsbz1lKHRoaXMpLHI9W1wicG9zaXRpb25cIixcInRvcFwiLFwiYm90dG9tXCIsXCJsZWZ0XCIsXCJyaWdodFwiLFwiaGVpZ2h0XCIsXCJ3aWR0aFwiXSxoPWUuZWZmZWN0cy5zZXRNb2RlKG8sdC5tb2RlfHxcImhpZGVcIiksbD1cInNob3dcIj09PWgsdT10LmRpcmVjdGlvbnx8XCJ2ZXJ0aWNhbFwiLGQ9XCJ2ZXJ0aWNhbFwiPT09dSxjPWQ/XCJoZWlnaHRcIjpcIndpZHRoXCIscD1kP1widG9wXCI6XCJsZWZ0XCIsZj17fTtlLmVmZmVjdHMuc2F2ZShvLHIpLG8uc2hvdygpLHM9ZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIobykuY3NzKHtvdmVyZmxvdzpcImhpZGRlblwifSksbj1cIklNR1wiPT09b1swXS50YWdOYW1lP3M6byxhPW5bY10oKSxsJiYobi5jc3MoYywwKSxuLmNzcyhwLGEvMikpLGZbY109bD9hOjAsZltwXT1sPzA6YS8yLG4uYW5pbWF0ZShmLHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpe2x8fG8uaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKG8sciksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIobyksaSgpfX0pfSxlLmVmZmVjdHMuZWZmZWN0LmRyb3A9ZnVuY3Rpb24odCxpKXt2YXIgcyxuPWUodGhpcyksYT1bXCJwb3NpdGlvblwiLFwidG9wXCIsXCJib3R0b21cIixcImxlZnRcIixcInJpZ2h0XCIsXCJvcGFjaXR5XCIsXCJoZWlnaHRcIixcIndpZHRoXCJdLG89ZS5lZmZlY3RzLnNldE1vZGUobix0Lm1vZGV8fFwiaGlkZVwiKSxyPVwic2hvd1wiPT09byxoPXQuZGlyZWN0aW9ufHxcImxlZnRcIixsPVwidXBcIj09PWh8fFwiZG93blwiPT09aD9cInRvcFwiOlwibGVmdFwiLHU9XCJ1cFwiPT09aHx8XCJsZWZ0XCI9PT1oP1wicG9zXCI6XCJuZWdcIixkPXtvcGFjaXR5OnI/MTowfTtlLmVmZmVjdHMuc2F2ZShuLGEpLG4uc2hvdygpLGUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKG4pLHM9dC5kaXN0YW5jZXx8bltcInRvcFwiPT09bD9cIm91dGVySGVpZ2h0XCI6XCJvdXRlcldpZHRoXCJdKCEwKS8yLHImJm4uY3NzKFwib3BhY2l0eVwiLDApLmNzcyhsLFwicG9zXCI9PT11Py1zOnMpLGRbbF09KHI/XCJwb3NcIj09PXU/XCIrPVwiOlwiLT1cIjpcInBvc1wiPT09dT9cIi09XCI6XCIrPVwiKStzLG4uYW5pbWF0ZShkLHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpe1wiaGlkZVwiPT09byYmbi5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobixhKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihuKSxpKCl9fSl9LGUuZWZmZWN0cy5lZmZlY3QuZXhwbG9kZT1mdW5jdGlvbih0LGkpe2Z1bmN0aW9uIHMoKXtiLnB1c2godGhpcyksYi5sZW5ndGg9PT1kKmMmJm4oKX1mdW5jdGlvbiBuKCl7cC5jc3Moe3Zpc2liaWxpdHk6XCJ2aXNpYmxlXCJ9KSxlKGIpLnJlbW92ZSgpLG18fHAuaGlkZSgpLGkoKX12YXIgYSxvLHIsaCxsLHUsZD10LnBpZWNlcz9NYXRoLnJvdW5kKE1hdGguc3FydCh0LnBpZWNlcykpOjMsYz1kLHA9ZSh0aGlzKSxmPWUuZWZmZWN0cy5zZXRNb2RlKHAsdC5tb2RlfHxcImhpZGVcIiksbT1cInNob3dcIj09PWYsZz1wLnNob3coKS5jc3MoXCJ2aXNpYmlsaXR5XCIsXCJoaWRkZW5cIikub2Zmc2V0KCksdj1NYXRoLmNlaWwocC5vdXRlcldpZHRoKCkvYykseT1NYXRoLmNlaWwocC5vdXRlckhlaWdodCgpL2QpLGI9W107Zm9yKGE9MDtkPmE7YSsrKWZvcihoPWcudG9wK2EqeSx1PWEtKGQtMSkvMixvPTA7Yz5vO28rKylyPWcubGVmdCtvKnYsbD1vLShjLTEpLzIscC5jbG9uZSgpLmFwcGVuZFRvKFwiYm9keVwiKS53cmFwKFwiPGRpdj48L2Rpdj5cIikuY3NzKHtwb3NpdGlvbjpcImFic29sdXRlXCIsdmlzaWJpbGl0eTpcInZpc2libGVcIixsZWZ0Oi1vKnYsdG9wOi1hKnl9KS5wYXJlbnQoKS5hZGRDbGFzcyhcInVpLWVmZmVjdHMtZXhwbG9kZVwiKS5jc3Moe3Bvc2l0aW9uOlwiYWJzb2x1dGVcIixvdmVyZmxvdzpcImhpZGRlblwiLHdpZHRoOnYsaGVpZ2h0OnksbGVmdDpyKyhtP2wqdjowKSx0b3A6aCsobT91Knk6MCksb3BhY2l0eTptPzA6MX0pLmFuaW1hdGUoe2xlZnQ6cisobT8wOmwqdiksdG9wOmgrKG0/MDp1KnkpLG9wYWNpdHk6bT8xOjB9LHQuZHVyYXRpb258fDUwMCx0LmVhc2luZyxzKX0sZS5lZmZlY3RzLmVmZmVjdC5mYWRlPWZ1bmN0aW9uKHQsaSl7dmFyIHM9ZSh0aGlzKSxuPWUuZWZmZWN0cy5zZXRNb2RlKHMsdC5tb2RlfHxcInRvZ2dsZVwiKTtzLmFuaW1hdGUoe29wYWNpdHk6bn0se3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOml9KX0sZS5lZmZlY3RzLmVmZmVjdC5mb2xkPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhPWUodGhpcyksbz1bXCJwb3NpdGlvblwiLFwidG9wXCIsXCJib3R0b21cIixcImxlZnRcIixcInJpZ2h0XCIsXCJoZWlnaHRcIixcIndpZHRoXCJdLHI9ZS5lZmZlY3RzLnNldE1vZGUoYSx0Lm1vZGV8fFwiaGlkZVwiKSxoPVwic2hvd1wiPT09cixsPVwiaGlkZVwiPT09cix1PXQuc2l6ZXx8MTUsZD0vKFswLTldKyklLy5leGVjKHUpLGM9ISF0Lmhvcml6Rmlyc3QscD1oIT09YyxmPXA/W1wid2lkdGhcIixcImhlaWdodFwiXTpbXCJoZWlnaHRcIixcIndpZHRoXCJdLG09dC5kdXJhdGlvbi8yLGc9e30sdj17fTtlLmVmZmVjdHMuc2F2ZShhLG8pLGEuc2hvdygpLHM9ZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYSkuY3NzKHtvdmVyZmxvdzpcImhpZGRlblwifSksbj1wP1tzLndpZHRoKCkscy5oZWlnaHQoKV06W3MuaGVpZ2h0KCkscy53aWR0aCgpXSxkJiYodT1wYXJzZUludChkWzFdLDEwKS8xMDAqbltsPzA6MV0pLGgmJnMuY3NzKGM/e2hlaWdodDowLHdpZHRoOnV9OntoZWlnaHQ6dSx3aWR0aDowfSksZ1tmWzBdXT1oP25bMF06dSx2W2ZbMV1dPWg/blsxXTowLHMuYW5pbWF0ZShnLG0sdC5lYXNpbmcpLmFuaW1hdGUodixtLHQuZWFzaW5nLGZ1bmN0aW9uKCl7bCYmYS5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUoYSxvKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihhKSxpKCl9KX0sZS5lZmZlY3RzLmVmZmVjdC5oaWdobGlnaHQ9ZnVuY3Rpb24odCxpKXt2YXIgcz1lKHRoaXMpLG49W1wiYmFja2dyb3VuZEltYWdlXCIsXCJiYWNrZ3JvdW5kQ29sb3JcIixcIm9wYWNpdHlcIl0sYT1lLmVmZmVjdHMuc2V0TW9kZShzLHQubW9kZXx8XCJzaG93XCIpLG89e2JhY2tncm91bmRDb2xvcjpzLmNzcyhcImJhY2tncm91bmRDb2xvclwiKX07XCJoaWRlXCI9PT1hJiYoby5vcGFjaXR5PTApLGUuZWZmZWN0cy5zYXZlKHMsbikscy5zaG93KCkuY3NzKHtiYWNrZ3JvdW5kSW1hZ2U6XCJub25lXCIsYmFja2dyb3VuZENvbG9yOnQuY29sb3J8fFwiI2ZmZmY5OVwifSkuYW5pbWF0ZShvLHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpe1wiaGlkZVwiPT09YSYmcy5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUocyxuKSxpKCl9fSl9LGUuZWZmZWN0cy5lZmZlY3Quc2l6ZT1mdW5jdGlvbih0LGkpe3ZhciBzLG4sYSxvPWUodGhpcykscj1bXCJwb3NpdGlvblwiLFwidG9wXCIsXCJib3R0b21cIixcImxlZnRcIixcInJpZ2h0XCIsXCJ3aWR0aFwiLFwiaGVpZ2h0XCIsXCJvdmVyZmxvd1wiLFwib3BhY2l0eVwiXSxoPVtcInBvc2l0aW9uXCIsXCJ0b3BcIixcImJvdHRvbVwiLFwibGVmdFwiLFwicmlnaHRcIixcIm92ZXJmbG93XCIsXCJvcGFjaXR5XCJdLGw9W1wid2lkdGhcIixcImhlaWdodFwiLFwib3ZlcmZsb3dcIl0sdT1bXCJmb250U2l6ZVwiXSxkPVtcImJvcmRlclRvcFdpZHRoXCIsXCJib3JkZXJCb3R0b21XaWR0aFwiLFwicGFkZGluZ1RvcFwiLFwicGFkZGluZ0JvdHRvbVwiXSxjPVtcImJvcmRlckxlZnRXaWR0aFwiLFwiYm9yZGVyUmlnaHRXaWR0aFwiLFwicGFkZGluZ0xlZnRcIixcInBhZGRpbmdSaWdodFwiXSxwPWUuZWZmZWN0cy5zZXRNb2RlKG8sdC5tb2RlfHxcImVmZmVjdFwiKSxmPXQucmVzdG9yZXx8XCJlZmZlY3RcIiE9PXAsbT10LnNjYWxlfHxcImJvdGhcIixnPXQub3JpZ2lufHxbXCJtaWRkbGVcIixcImNlbnRlclwiXSx2PW8uY3NzKFwicG9zaXRpb25cIikseT1mP3I6aCxiPXtoZWlnaHQ6MCx3aWR0aDowLG91dGVySGVpZ2h0OjAsb3V0ZXJXaWR0aDowfTtcInNob3dcIj09PXAmJm8uc2hvdygpLHM9e2hlaWdodDpvLmhlaWdodCgpLHdpZHRoOm8ud2lkdGgoKSxvdXRlckhlaWdodDpvLm91dGVySGVpZ2h0KCksb3V0ZXJXaWR0aDpvLm91dGVyV2lkdGgoKX0sXCJ0b2dnbGVcIj09PXQubW9kZSYmXCJzaG93XCI9PT1wPyhvLmZyb209dC50b3x8YixvLnRvPXQuZnJvbXx8cyk6KG8uZnJvbT10LmZyb218fChcInNob3dcIj09PXA/YjpzKSxvLnRvPXQudG98fChcImhpZGVcIj09PXA/YjpzKSksYT17ZnJvbTp7eTpvLmZyb20uaGVpZ2h0L3MuaGVpZ2h0LHg6by5mcm9tLndpZHRoL3Mud2lkdGh9LHRvOnt5Om8udG8uaGVpZ2h0L3MuaGVpZ2h0LHg6by50by53aWR0aC9zLndpZHRofX0sKFwiYm94XCI9PT1tfHxcImJvdGhcIj09PW0pJiYoYS5mcm9tLnkhPT1hLnRvLnkmJih5PXkuY29uY2F0KGQpLG8uZnJvbT1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLGQsYS5mcm9tLnksby5mcm9tKSxvLnRvPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG8sZCxhLnRvLnksby50bykpLGEuZnJvbS54IT09YS50by54JiYoeT15LmNvbmNhdChjKSxvLmZyb209ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obyxjLGEuZnJvbS54LG8uZnJvbSksby50bz1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLGMsYS50by54LG8udG8pKSksKFwiY29udGVudFwiPT09bXx8XCJib3RoXCI9PT1tKSYmYS5mcm9tLnkhPT1hLnRvLnkmJih5PXkuY29uY2F0KHUpLmNvbmNhdChsKSxvLmZyb209ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obyx1LGEuZnJvbS55LG8uZnJvbSksby50bz1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLHUsYS50by55LG8udG8pKSxlLmVmZmVjdHMuc2F2ZShvLHkpLG8uc2hvdygpLGUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKG8pLG8uY3NzKFwib3ZlcmZsb3dcIixcImhpZGRlblwiKS5jc3Moby5mcm9tKSxnJiYobj1lLmVmZmVjdHMuZ2V0QmFzZWxpbmUoZyxzKSxvLmZyb20udG9wPShzLm91dGVySGVpZ2h0LW8ub3V0ZXJIZWlnaHQoKSkqbi55LG8uZnJvbS5sZWZ0PShzLm91dGVyV2lkdGgtby5vdXRlcldpZHRoKCkpKm4ueCxvLnRvLnRvcD0ocy5vdXRlckhlaWdodC1vLnRvLm91dGVySGVpZ2h0KSpuLnksby50by5sZWZ0PShzLm91dGVyV2lkdGgtby50by5vdXRlcldpZHRoKSpuLngpLG8uY3NzKG8uZnJvbSksKFwiY29udGVudFwiPT09bXx8XCJib3RoXCI9PT1tKSYmKGQ9ZC5jb25jYXQoW1wibWFyZ2luVG9wXCIsXCJtYXJnaW5Cb3R0b21cIl0pLmNvbmNhdCh1KSxjPWMuY29uY2F0KFtcIm1hcmdpbkxlZnRcIixcIm1hcmdpblJpZ2h0XCJdKSxsPXIuY29uY2F0KGQpLmNvbmNhdChjKSxvLmZpbmQoXCIqW3dpZHRoXVwiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9ZSh0aGlzKSxzPXtoZWlnaHQ6aS5oZWlnaHQoKSx3aWR0aDppLndpZHRoKCksb3V0ZXJIZWlnaHQ6aS5vdXRlckhlaWdodCgpLG91dGVyV2lkdGg6aS5vdXRlcldpZHRoKCl9O1xuZiYmZS5lZmZlY3RzLnNhdmUoaSxsKSxpLmZyb209e2hlaWdodDpzLmhlaWdodCphLmZyb20ueSx3aWR0aDpzLndpZHRoKmEuZnJvbS54LG91dGVySGVpZ2h0OnMub3V0ZXJIZWlnaHQqYS5mcm9tLnksb3V0ZXJXaWR0aDpzLm91dGVyV2lkdGgqYS5mcm9tLnh9LGkudG89e2hlaWdodDpzLmhlaWdodCphLnRvLnksd2lkdGg6cy53aWR0aCphLnRvLngsb3V0ZXJIZWlnaHQ6cy5oZWlnaHQqYS50by55LG91dGVyV2lkdGg6cy53aWR0aCphLnRvLnh9LGEuZnJvbS55IT09YS50by55JiYoaS5mcm9tPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGksZCxhLmZyb20ueSxpLmZyb20pLGkudG89ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24oaSxkLGEudG8ueSxpLnRvKSksYS5mcm9tLnghPT1hLnRvLngmJihpLmZyb209ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24oaSxjLGEuZnJvbS54LGkuZnJvbSksaS50bz1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihpLGMsYS50by54LGkudG8pKSxpLmNzcyhpLmZyb20pLGkuYW5pbWF0ZShpLnRvLHQuZHVyYXRpb24sdC5lYXNpbmcsZnVuY3Rpb24oKXtmJiZlLmVmZmVjdHMucmVzdG9yZShpLGwpfSl9KSksby5hbmltYXRlKG8udG8se3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7MD09PW8udG8ub3BhY2l0eSYmby5jc3MoXCJvcGFjaXR5XCIsby5mcm9tLm9wYWNpdHkpLFwiaGlkZVwiPT09cCYmby5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobyx5KSxmfHwoXCJzdGF0aWNcIj09PXY/by5jc3Moe3Bvc2l0aW9uOlwicmVsYXRpdmVcIix0b3A6by50by50b3AsbGVmdDpvLnRvLmxlZnR9KTplLmVhY2goW1widG9wXCIsXCJsZWZ0XCJdLGZ1bmN0aW9uKGUsdCl7by5jc3ModCxmdW5jdGlvbih0LGkpe3ZhciBzPXBhcnNlSW50KGksMTApLG49ZT9vLnRvLmxlZnQ6by50by50b3A7cmV0dXJuXCJhdXRvXCI9PT1pP24rXCJweFwiOnMrbitcInB4XCJ9KX0pKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihvKSxpKCl9fSl9LGUuZWZmZWN0cy5lZmZlY3Quc2NhbGU9ZnVuY3Rpb24odCxpKXt2YXIgcz1lKHRoaXMpLG49ZS5leHRlbmQoITAse30sdCksYT1lLmVmZmVjdHMuc2V0TW9kZShzLHQubW9kZXx8XCJlZmZlY3RcIiksbz1wYXJzZUludCh0LnBlcmNlbnQsMTApfHwoMD09PXBhcnNlSW50KHQucGVyY2VudCwxMCk/MDpcImhpZGVcIj09PWE/MDoxMDApLHI9dC5kaXJlY3Rpb258fFwiYm90aFwiLGg9dC5vcmlnaW4sbD17aGVpZ2h0OnMuaGVpZ2h0KCksd2lkdGg6cy53aWR0aCgpLG91dGVySGVpZ2h0OnMub3V0ZXJIZWlnaHQoKSxvdXRlcldpZHRoOnMub3V0ZXJXaWR0aCgpfSx1PXt5OlwiaG9yaXpvbnRhbFwiIT09cj9vLzEwMDoxLHg6XCJ2ZXJ0aWNhbFwiIT09cj9vLzEwMDoxfTtuLmVmZmVjdD1cInNpemVcIixuLnF1ZXVlPSExLG4uY29tcGxldGU9aSxcImVmZmVjdFwiIT09YSYmKG4ub3JpZ2luPWh8fFtcIm1pZGRsZVwiLFwiY2VudGVyXCJdLG4ucmVzdG9yZT0hMCksbi5mcm9tPXQuZnJvbXx8KFwic2hvd1wiPT09YT97aGVpZ2h0OjAsd2lkdGg6MCxvdXRlckhlaWdodDowLG91dGVyV2lkdGg6MH06bCksbi50bz17aGVpZ2h0OmwuaGVpZ2h0KnUueSx3aWR0aDpsLndpZHRoKnUueCxvdXRlckhlaWdodDpsLm91dGVySGVpZ2h0KnUueSxvdXRlcldpZHRoOmwub3V0ZXJXaWR0aCp1Lnh9LG4uZmFkZSYmKFwic2hvd1wiPT09YSYmKG4uZnJvbS5vcGFjaXR5PTAsbi50by5vcGFjaXR5PTEpLFwiaGlkZVwiPT09YSYmKG4uZnJvbS5vcGFjaXR5PTEsbi50by5vcGFjaXR5PTApKSxzLmVmZmVjdChuKX0sZS5lZmZlY3RzLmVmZmVjdC5wdWZmPWZ1bmN0aW9uKHQsaSl7dmFyIHM9ZSh0aGlzKSxuPWUuZWZmZWN0cy5zZXRNb2RlKHMsdC5tb2RlfHxcImhpZGVcIiksYT1cImhpZGVcIj09PW4sbz1wYXJzZUludCh0LnBlcmNlbnQsMTApfHwxNTAscj1vLzEwMCxoPXtoZWlnaHQ6cy5oZWlnaHQoKSx3aWR0aDpzLndpZHRoKCksb3V0ZXJIZWlnaHQ6cy5vdXRlckhlaWdodCgpLG91dGVyV2lkdGg6cy5vdXRlcldpZHRoKCl9O2UuZXh0ZW5kKHQse2VmZmVjdDpcInNjYWxlXCIscXVldWU6ITEsZmFkZTohMCxtb2RlOm4sY29tcGxldGU6aSxwZXJjZW50OmE/bzoxMDAsZnJvbTphP2g6e2hlaWdodDpoLmhlaWdodCpyLHdpZHRoOmgud2lkdGgqcixvdXRlckhlaWdodDpoLm91dGVySGVpZ2h0KnIsb3V0ZXJXaWR0aDpoLm91dGVyV2lkdGgqcn19KSxzLmVmZmVjdCh0KX0sZS5lZmZlY3RzLmVmZmVjdC5wdWxzYXRlPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbj1lKHRoaXMpLGE9ZS5lZmZlY3RzLnNldE1vZGUobix0Lm1vZGV8fFwic2hvd1wiKSxvPVwic2hvd1wiPT09YSxyPVwiaGlkZVwiPT09YSxoPW98fFwiaGlkZVwiPT09YSxsPTIqKHQudGltZXN8fDUpKyhoPzE6MCksdT10LmR1cmF0aW9uL2wsZD0wLGM9bi5xdWV1ZSgpLHA9Yy5sZW5ndGg7Zm9yKChvfHwhbi5pcyhcIjp2aXNpYmxlXCIpKSYmKG4uY3NzKFwib3BhY2l0eVwiLDApLnNob3coKSxkPTEpLHM9MTtsPnM7cysrKW4uYW5pbWF0ZSh7b3BhY2l0eTpkfSx1LHQuZWFzaW5nKSxkPTEtZDtuLmFuaW1hdGUoe29wYWNpdHk6ZH0sdSx0LmVhc2luZyksbi5xdWV1ZShmdW5jdGlvbigpe3ImJm4uaGlkZSgpLGkoKX0pLHA+MSYmYy5zcGxpY2UuYXBwbHkoYyxbMSwwXS5jb25jYXQoYy5zcGxpY2UocCxsKzEpKSksbi5kZXF1ZXVlKCl9LGUuZWZmZWN0cy5lZmZlY3Quc2hha2U9ZnVuY3Rpb24odCxpKXt2YXIgcyxuPWUodGhpcyksYT1bXCJwb3NpdGlvblwiLFwidG9wXCIsXCJib3R0b21cIixcImxlZnRcIixcInJpZ2h0XCIsXCJoZWlnaHRcIixcIndpZHRoXCJdLG89ZS5lZmZlY3RzLnNldE1vZGUobix0Lm1vZGV8fFwiZWZmZWN0XCIpLHI9dC5kaXJlY3Rpb258fFwibGVmdFwiLGg9dC5kaXN0YW5jZXx8MjAsbD10LnRpbWVzfHwzLHU9MipsKzEsZD1NYXRoLnJvdW5kKHQuZHVyYXRpb24vdSksYz1cInVwXCI9PT1yfHxcImRvd25cIj09PXI/XCJ0b3BcIjpcImxlZnRcIixwPVwidXBcIj09PXJ8fFwibGVmdFwiPT09cixmPXt9LG09e30sZz17fSx2PW4ucXVldWUoKSx5PXYubGVuZ3RoO2ZvcihlLmVmZmVjdHMuc2F2ZShuLGEpLG4uc2hvdygpLGUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKG4pLGZbY109KHA/XCItPVwiOlwiKz1cIikraCxtW2NdPShwP1wiKz1cIjpcIi09XCIpKzIqaCxnW2NdPShwP1wiLT1cIjpcIis9XCIpKzIqaCxuLmFuaW1hdGUoZixkLHQuZWFzaW5nKSxzPTE7bD5zO3MrKyluLmFuaW1hdGUobSxkLHQuZWFzaW5nKS5hbmltYXRlKGcsZCx0LmVhc2luZyk7bi5hbmltYXRlKG0sZCx0LmVhc2luZykuYW5pbWF0ZShmLGQvMix0LmVhc2luZykucXVldWUoZnVuY3Rpb24oKXtcImhpZGVcIj09PW8mJm4uaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKG4sYSksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIobiksaSgpfSkseT4xJiZ2LnNwbGljZS5hcHBseSh2LFsxLDBdLmNvbmNhdCh2LnNwbGljZSh5LHUrMSkpKSxuLmRlcXVldWUoKX0sZS5lZmZlY3RzLmVmZmVjdC5zbGlkZT1mdW5jdGlvbih0LGkpe3ZhciBzLG49ZSh0aGlzKSxhPVtcInBvc2l0aW9uXCIsXCJ0b3BcIixcImJvdHRvbVwiLFwibGVmdFwiLFwicmlnaHRcIixcIndpZHRoXCIsXCJoZWlnaHRcIl0sbz1lLmVmZmVjdHMuc2V0TW9kZShuLHQubW9kZXx8XCJzaG93XCIpLHI9XCJzaG93XCI9PT1vLGg9dC5kaXJlY3Rpb258fFwibGVmdFwiLGw9XCJ1cFwiPT09aHx8XCJkb3duXCI9PT1oP1widG9wXCI6XCJsZWZ0XCIsdT1cInVwXCI9PT1ofHxcImxlZnRcIj09PWgsZD17fTtlLmVmZmVjdHMuc2F2ZShuLGEpLG4uc2hvdygpLHM9dC5kaXN0YW5jZXx8bltcInRvcFwiPT09bD9cIm91dGVySGVpZ2h0XCI6XCJvdXRlcldpZHRoXCJdKCEwKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihuKS5jc3Moe292ZXJmbG93OlwiaGlkZGVuXCJ9KSxyJiZuLmNzcyhsLHU/aXNOYU4ocyk/XCItXCIrczotczpzKSxkW2xdPShyP3U/XCIrPVwiOlwiLT1cIjp1P1wiLT1cIjpcIis9XCIpK3Msbi5hbmltYXRlKGQse3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7XCJoaWRlXCI9PT1vJiZuLmhpZGUoKSxlLmVmZmVjdHMucmVzdG9yZShuLGEpLGUuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKG4pLGkoKX19KX0sZS5lZmZlY3RzLmVmZmVjdC50cmFuc2Zlcj1mdW5jdGlvbih0LGkpe3ZhciBzPWUodGhpcyksbj1lKHQudG8pLGE9XCJmaXhlZFwiPT09bi5jc3MoXCJwb3NpdGlvblwiKSxvPWUoXCJib2R5XCIpLHI9YT9vLnNjcm9sbFRvcCgpOjAsaD1hP28uc2Nyb2xsTGVmdCgpOjAsbD1uLm9mZnNldCgpLHU9e3RvcDpsLnRvcC1yLGxlZnQ6bC5sZWZ0LWgsaGVpZ2h0Om4uaW5uZXJIZWlnaHQoKSx3aWR0aDpuLmlubmVyV2lkdGgoKX0sZD1zLm9mZnNldCgpLGM9ZShcIjxkaXYgY2xhc3M9J3VpLWVmZmVjdHMtdHJhbnNmZXInPjwvZGl2PlwiKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5hZGRDbGFzcyh0LmNsYXNzTmFtZSkuY3NzKHt0b3A6ZC50b3AtcixsZWZ0OmQubGVmdC1oLGhlaWdodDpzLmlubmVySGVpZ2h0KCksd2lkdGg6cy5pbm5lcldpZHRoKCkscG9zaXRpb246YT9cImZpeGVkXCI6XCJhYnNvbHV0ZVwifSkuYW5pbWF0ZSh1LHQuZHVyYXRpb24sdC5lYXNpbmcsZnVuY3Rpb24oKXtjLnJlbW92ZSgpLGkoKX0pfSxlLndpZGdldChcInVpLnByb2dyZXNzYmFyXCIse3ZlcnNpb246XCIxLjExLjRcIixvcHRpb25zOnttYXg6MTAwLHZhbHVlOjAsY2hhbmdlOm51bGwsY29tcGxldGU6bnVsbH0sbWluOjAsX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMub2xkVmFsdWU9dGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX2NvbnN0cmFpbmVkVmFsdWUoKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoXCJ1aS1wcm9ncmVzc2JhciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbFwiKS5hdHRyKHtyb2xlOlwicHJvZ3Jlc3NiYXJcIixcImFyaWEtdmFsdWVtaW5cIjp0aGlzLm1pbn0pLHRoaXMudmFsdWVEaXY9ZShcIjxkaXYgY2xhc3M9J3VpLXByb2dyZXNzYmFyLXZhbHVlIHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWxlZnQnPjwvZGl2PlwiKS5hcHBlbmRUbyh0aGlzLmVsZW1lbnQpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhcInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsXCIpLnJlbW92ZUF0dHIoXCJyb2xlXCIpLnJlbW92ZUF0dHIoXCJhcmlhLXZhbHVlbWluXCIpLnJlbW92ZUF0dHIoXCJhcmlhLXZhbHVlbWF4XCIpLnJlbW92ZUF0dHIoXCJhcmlhLXZhbHVlbm93XCIpLHRoaXMudmFsdWVEaXYucmVtb3ZlKCl9LHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMub3B0aW9ucy52YWx1ZToodGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX2NvbnN0cmFpbmVkVmFsdWUoZSksdGhpcy5fcmVmcmVzaFZhbHVlKCksdm9pZCAwKX0sX2NvbnN0cmFpbmVkVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXRoaXMub3B0aW9ucy52YWx1ZSksdGhpcy5pbmRldGVybWluYXRlPWU9PT0hMSxcIm51bWJlclwiIT10eXBlb2YgZSYmKGU9MCksdGhpcy5pbmRldGVybWluYXRlPyExOk1hdGgubWluKHRoaXMub3B0aW9ucy5tYXgsTWF0aC5tYXgodGhpcy5taW4sZSkpfSxfc2V0T3B0aW9uczpmdW5jdGlvbihlKXt2YXIgdD1lLnZhbHVlO2RlbGV0ZSBlLnZhbHVlLHRoaXMuX3N1cGVyKGUpLHRoaXMub3B0aW9ucy52YWx1ZT10aGlzLl9jb25zdHJhaW5lZFZhbHVlKHQpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7XCJtYXhcIj09PWUmJih0PU1hdGgubWF4KHRoaXMubWluLHQpKSxcImRpc2FibGVkXCI9PT1lJiZ0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoXCJ1aS1zdGF0ZS1kaXNhYmxlZFwiLCEhdCkuYXR0cihcImFyaWEtZGlzYWJsZWRcIix0KSx0aGlzLl9zdXBlcihlLHQpfSxfcGVyY2VudGFnZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluZGV0ZXJtaW5hdGU/MTAwOjEwMCoodGhpcy5vcHRpb25zLnZhbHVlLXRoaXMubWluKS8odGhpcy5vcHRpb25zLm1heC10aGlzLm1pbil9LF9yZWZyZXNoVmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMudmFsdWUsaT10aGlzLl9wZXJjZW50YWdlKCk7dGhpcy52YWx1ZURpdi50b2dnbGUodGhpcy5pbmRldGVybWluYXRlfHx0PnRoaXMubWluKS50b2dnbGVDbGFzcyhcInVpLWNvcm5lci1yaWdodFwiLHQ9PT10aGlzLm9wdGlvbnMubWF4KS53aWR0aChpLnRvRml4ZWQoMCkrXCIlXCIpLHRoaXMuZWxlbWVudC50b2dnbGVDbGFzcyhcInVpLXByb2dyZXNzYmFyLWluZGV0ZXJtaW5hdGVcIix0aGlzLmluZGV0ZXJtaW5hdGUpLHRoaXMuaW5kZXRlcm1pbmF0ZT8odGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoXCJhcmlhLXZhbHVlbm93XCIpLHRoaXMub3ZlcmxheURpdnx8KHRoaXMub3ZlcmxheURpdj1lKFwiPGRpdiBjbGFzcz0ndWktcHJvZ3Jlc3NiYXItb3ZlcmxheSc+PC9kaXY+XCIpLmFwcGVuZFRvKHRoaXMudmFsdWVEaXYpKSk6KHRoaXMuZWxlbWVudC5hdHRyKHtcImFyaWEtdmFsdWVtYXhcIjp0aGlzLm9wdGlvbnMubWF4LFwiYXJpYS12YWx1ZW5vd1wiOnR9KSx0aGlzLm92ZXJsYXlEaXYmJih0aGlzLm92ZXJsYXlEaXYucmVtb3ZlKCksdGhpcy5vdmVybGF5RGl2PW51bGwpKSx0aGlzLm9sZFZhbHVlIT09dCYmKHRoaXMub2xkVmFsdWU9dCx0aGlzLl90cmlnZ2VyKFwiY2hhbmdlXCIpKSx0PT09dGhpcy5vcHRpb25zLm1heCYmdGhpcy5fdHJpZ2dlcihcImNvbXBsZXRlXCIpfX0pLGUud2lkZ2V0KFwidWkuc2VsZWN0YWJsZVwiLGUudWkubW91c2Use3ZlcnNpb246XCIxLjExLjRcIixvcHRpb25zOnthcHBlbmRUbzpcImJvZHlcIixhdXRvUmVmcmVzaDohMCxkaXN0YW5jZTowLGZpbHRlcjpcIipcIix0b2xlcmFuY2U6XCJ0b3VjaFwiLHNlbGVjdGVkOm51bGwsc2VsZWN0aW5nOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGwsdW5zZWxlY3RlZDpudWxsLHVuc2VsZWN0aW5nOm51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdCxpPXRoaXM7dGhpcy5lbGVtZW50LmFkZENsYXNzKFwidWktc2VsZWN0YWJsZVwiKSx0aGlzLmRyYWdnZWQ9ITEsdGhpcy5yZWZyZXNoPWZ1bmN0aW9uKCl7dD1lKGkub3B0aW9ucy5maWx0ZXIsaS5lbGVtZW50WzBdKSx0LmFkZENsYXNzKFwidWktc2VsZWN0ZWVcIiksdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKSxpPXQub2Zmc2V0KCk7ZS5kYXRhKHRoaXMsXCJzZWxlY3RhYmxlLWl0ZW1cIix7ZWxlbWVudDp0aGlzLCRlbGVtZW50OnQsbGVmdDppLmxlZnQsdG9wOmkudG9wLHJpZ2h0OmkubGVmdCt0Lm91dGVyV2lkdGgoKSxib3R0b206aS50b3ArdC5vdXRlckhlaWdodCgpLHN0YXJ0c2VsZWN0ZWQ6ITEsc2VsZWN0ZWQ6dC5oYXNDbGFzcyhcInVpLXNlbGVjdGVkXCIpLHNlbGVjdGluZzp0Lmhhc0NsYXNzKFwidWktc2VsZWN0aW5nXCIpLHVuc2VsZWN0aW5nOnQuaGFzQ2xhc3MoXCJ1aS11bnNlbGVjdGluZ1wiKX0pfSl9LHRoaXMucmVmcmVzaCgpLHRoaXMuc2VsZWN0ZWVzPXQuYWRkQ2xhc3MoXCJ1aS1zZWxlY3RlZVwiKSx0aGlzLl9tb3VzZUluaXQoKSx0aGlzLmhlbHBlcj1lKFwiPGRpdiBjbGFzcz0ndWktc2VsZWN0YWJsZS1oZWxwZXInPjwvZGl2PlwiKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVlcy5yZW1vdmVDbGFzcyhcInVpLXNlbGVjdGVlXCIpLnJlbW92ZURhdGEoXCJzZWxlY3RhYmxlLWl0ZW1cIiksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKFwidWktc2VsZWN0YWJsZSB1aS1zZWxlY3RhYmxlLWRpc2FibGVkXCIpLHRoaXMuX21vdXNlRGVzdHJveSgpfSxfbW91c2VTdGFydDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLHM9dGhpcy5vcHRpb25zO3RoaXMub3Bvcz1bdC5wYWdlWCx0LnBhZ2VZXSx0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fCh0aGlzLnNlbGVjdGVlcz1lKHMuZmlsdGVyLHRoaXMuZWxlbWVudFswXSksdGhpcy5fdHJpZ2dlcihcInN0YXJ0XCIsdCksZShzLmFwcGVuZFRvKS5hcHBlbmQodGhpcy5oZWxwZXIpLHRoaXMuaGVscGVyLmNzcyh7bGVmdDp0LnBhZ2VYLHRvcDp0LnBhZ2VZLHdpZHRoOjAsaGVpZ2h0OjB9KSxzLmF1dG9SZWZyZXNoJiZ0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcy5maWx0ZXIoXCIudWktc2VsZWN0ZWRcIikuZWFjaChmdW5jdGlvbigpe3ZhciBzPWUuZGF0YSh0aGlzLFwic2VsZWN0YWJsZS1pdGVtXCIpO3Muc3RhcnRzZWxlY3RlZD0hMCx0Lm1ldGFLZXl8fHQuY3RybEtleXx8KHMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJ1aS1zZWxlY3RlZFwiKSxzLnNlbGVjdGVkPSExLHMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJ1aS11bnNlbGVjdGluZ1wiKSxzLnVuc2VsZWN0aW5nPSEwLGkuX3RyaWdnZXIoXCJ1bnNlbGVjdGluZ1wiLHQse3Vuc2VsZWN0aW5nOnMuZWxlbWVudH0pKX0pLGUodC50YXJnZXQpLnBhcmVudHMoKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpe3ZhciBzLG49ZS5kYXRhKHRoaXMsXCJzZWxlY3RhYmxlLWl0ZW1cIik7cmV0dXJuIG4/KHM9IXQubWV0YUtleSYmIXQuY3RybEtleXx8IW4uJGVsZW1lbnQuaGFzQ2xhc3MoXCJ1aS1zZWxlY3RlZFwiKSxuLiRlbGVtZW50LnJlbW92ZUNsYXNzKHM/XCJ1aS11bnNlbGVjdGluZ1wiOlwidWktc2VsZWN0ZWRcIikuYWRkQ2xhc3Mocz9cInVpLXNlbGVjdGluZ1wiOlwidWktdW5zZWxlY3RpbmdcIiksbi51bnNlbGVjdGluZz0hcyxuLnNlbGVjdGluZz1zLG4uc2VsZWN0ZWQ9cyxzP2kuX3RyaWdnZXIoXCJzZWxlY3RpbmdcIix0LHtzZWxlY3Rpbmc6bi5lbGVtZW50fSk6aS5fdHJpZ2dlcihcInVuc2VsZWN0aW5nXCIsdCx7dW5zZWxlY3Rpbmc6bi5lbGVtZW50fSksITEpOnZvaWQgMH0pKX0sX21vdXNlRHJhZzpmdW5jdGlvbih0KXtpZih0aGlzLmRyYWdnZWQ9ITAsIXRoaXMub3B0aW9ucy5kaXNhYmxlZCl7dmFyIGkscz10aGlzLG49dGhpcy5vcHRpb25zLGE9dGhpcy5vcG9zWzBdLG89dGhpcy5vcG9zWzFdLHI9dC5wYWdlWCxoPXQucGFnZVk7cmV0dXJuIGE+ciYmKGk9cixyPWEsYT1pKSxvPmgmJihpPWgsaD1vLG89aSksdGhpcy5oZWxwZXIuY3NzKHtsZWZ0OmEsdG9wOm8sd2lkdGg6ci1hLGhlaWdodDpoLW99KSx0aGlzLnNlbGVjdGVlcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9ZS5kYXRhKHRoaXMsXCJzZWxlY3RhYmxlLWl0ZW1cIiksbD0hMTtpJiZpLmVsZW1lbnQhPT1zLmVsZW1lbnRbMF0mJihcInRvdWNoXCI9PT1uLnRvbGVyYW5jZT9sPSEoaS5sZWZ0PnJ8fGE+aS5yaWdodHx8aS50b3A+aHx8bz5pLmJvdHRvbSk6XCJmaXRcIj09PW4udG9sZXJhbmNlJiYobD1pLmxlZnQ+YSYmcj5pLnJpZ2h0JiZpLnRvcD5vJiZoPmkuYm90dG9tKSxsPyhpLnNlbGVjdGVkJiYoaS4kZWxlbWVudC5yZW1vdmVDbGFzcyhcInVpLXNlbGVjdGVkXCIpLGkuc2VsZWN0ZWQ9ITEpLGkudW5zZWxlY3RpbmcmJihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKFwidWktdW5zZWxlY3RpbmdcIiksaS51bnNlbGVjdGluZz0hMSksaS5zZWxlY3Rpbmd8fChpLiRlbGVtZW50LmFkZENsYXNzKFwidWktc2VsZWN0aW5nXCIpLGkuc2VsZWN0aW5nPSEwLHMuX3RyaWdnZXIoXCJzZWxlY3RpbmdcIix0LHtzZWxlY3Rpbmc6aS5lbGVtZW50fSkpKTooaS5zZWxlY3RpbmcmJigodC5tZXRhS2V5fHx0LmN0cmxLZXkpJiZpLnN0YXJ0c2VsZWN0ZWQ/KGkuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJ1aS1zZWxlY3RpbmdcIiksaS5zZWxlY3Rpbmc9ITEsaS4kZWxlbWVudC5hZGRDbGFzcyhcInVpLXNlbGVjdGVkXCIpLGkuc2VsZWN0ZWQ9ITApOihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKFwidWktc2VsZWN0aW5nXCIpLGkuc2VsZWN0aW5nPSExLGkuc3RhcnRzZWxlY3RlZCYmKGkuJGVsZW1lbnQuYWRkQ2xhc3MoXCJ1aS11bnNlbGVjdGluZ1wiKSxpLnVuc2VsZWN0aW5nPSEwKSxzLl90cmlnZ2VyKFwidW5zZWxlY3RpbmdcIix0LHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpLGkuc2VsZWN0ZWQmJih0Lm1ldGFLZXl8fHQuY3RybEtleXx8aS5zdGFydHNlbGVjdGVkfHwoaS4kZWxlbWVudC5yZW1vdmVDbGFzcyhcInVpLXNlbGVjdGVkXCIpLGkuc2VsZWN0ZWQ9ITEsaS4kZWxlbWVudC5hZGRDbGFzcyhcInVpLXVuc2VsZWN0aW5nXCIpLGkudW5zZWxlY3Rpbmc9ITAscy5fdHJpZ2dlcihcInVuc2VsZWN0aW5nXCIsdCx7dW5zZWxlY3Rpbmc6aS5lbGVtZW50fSkpKSkpfSksITF9fSxfbW91c2VTdG9wOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXM7cmV0dXJuIHRoaXMuZHJhZ2dlZD0hMSxlKFwiLnVpLXVuc2VsZWN0aW5nXCIsdGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHM9ZS5kYXRhKHRoaXMsXCJzZWxlY3RhYmxlLWl0ZW1cIik7cy4kZWxlbWVudC5yZW1vdmVDbGFzcyhcInVpLXVuc2VsZWN0aW5nXCIpLHMudW5zZWxlY3Rpbmc9ITEscy5zdGFydHNlbGVjdGVkPSExLGkuX3RyaWdnZXIoXCJ1bnNlbGVjdGVkXCIsdCx7dW5zZWxlY3RlZDpzLmVsZW1lbnR9KX0pLGUoXCIudWktc2VsZWN0aW5nXCIsdGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHM9ZS5kYXRhKHRoaXMsXCJzZWxlY3RhYmxlLWl0ZW1cIik7cy4kZWxlbWVudC5yZW1vdmVDbGFzcyhcInVpLXNlbGVjdGluZ1wiKS5hZGRDbGFzcyhcInVpLXNlbGVjdGVkXCIpLHMuc2VsZWN0aW5nPSExLHMuc2VsZWN0ZWQ9ITAscy5zdGFydHNlbGVjdGVkPSEwLGkuX3RyaWdnZXIoXCJzZWxlY3RlZFwiLHQse3NlbGVjdGVkOnMuZWxlbWVudH0pfSksdGhpcy5fdHJpZ2dlcihcInN0b3BcIix0KSx0aGlzLmhlbHBlci5yZW1vdmUoKSwhMX19KSxlLndpZGdldChcInVpLnNlbGVjdG1lbnVcIix7dmVyc2lvbjpcIjEuMTEuNFwiLGRlZmF1bHRFbGVtZW50OlwiPHNlbGVjdD5cIixvcHRpb25zOnthcHBlbmRUbzpudWxsLGRpc2FibGVkOm51bGwsaWNvbnM6e2J1dHRvbjpcInVpLWljb24tdHJpYW5nbGUtMS1zXCJ9LHBvc2l0aW9uOntteTpcImxlZnQgdG9wXCIsYXQ6XCJsZWZ0IGJvdHRvbVwiLGNvbGxpc2lvbjpcIm5vbmVcIn0sd2lkdGg6bnVsbCxjaGFuZ2U6bnVsbCxjbG9zZTpudWxsLGZvY3VzOm51bGwsb3BlbjpudWxsLHNlbGVjdDpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lbGVtZW50LnVuaXF1ZUlkKCkuYXR0cihcImlkXCIpO3RoaXMuaWRzPXtlbGVtZW50OmUsYnV0dG9uOmUrXCItYnV0dG9uXCIsbWVudTplK1wiLW1lbnVcIn0sdGhpcy5fZHJhd0J1dHRvbigpLHRoaXMuX2RyYXdNZW51KCksdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLmRpc2FibGUoKX0sX2RyYXdCdXR0b246ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMubGFiZWw9ZShcImxhYmVsW2Zvcj0nXCIrdGhpcy5pZHMuZWxlbWVudCtcIiddXCIpLmF0dHIoXCJmb3JcIix0aGlzLmlkcy5idXR0b24pLHRoaXMuX29uKHRoaXMubGFiZWwse2NsaWNrOmZ1bmN0aW9uKGUpe3RoaXMuYnV0dG9uLmZvY3VzKCksZS5wcmV2ZW50RGVmYXVsdCgpfX0pLHRoaXMuZWxlbWVudC5oaWRlKCksdGhpcy5idXR0b249ZShcIjxzcGFuPlwiLHtcImNsYXNzXCI6XCJ1aS1zZWxlY3RtZW51LWJ1dHRvbiB1aS13aWRnZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsXCIsdGFiaW5kZXg6dGhpcy5vcHRpb25zLmRpc2FibGVkPy0xOjAsaWQ6dGhpcy5pZHMuYnV0dG9uLHJvbGU6XCJjb21ib2JveFwiLFwiYXJpYS1leHBhbmRlZFwiOlwiZmFsc2VcIixcImFyaWEtYXV0b2NvbXBsZXRlXCI6XCJsaXN0XCIsXCJhcmlhLW93bnNcIjp0aGlzLmlkcy5tZW51LFwiYXJpYS1oYXNwb3B1cFwiOlwidHJ1ZVwifSkuaW5zZXJ0QWZ0ZXIodGhpcy5lbGVtZW50KSxlKFwiPHNwYW4+XCIse1wiY2xhc3NcIjpcInVpLWljb24gXCIrdGhpcy5vcHRpb25zLmljb25zLmJ1dHRvbn0pLnByZXBlbmRUbyh0aGlzLmJ1dHRvbiksdGhpcy5idXR0b25UZXh0PWUoXCI8c3Bhbj5cIix7XCJjbGFzc1wiOlwidWktc2VsZWN0bWVudS10ZXh0XCJ9KS5hcHBlbmRUbyh0aGlzLmJ1dHRvbiksdGhpcy5fc2V0VGV4dCh0aGlzLmJ1dHRvblRleHQsdGhpcy5lbGVtZW50LmZpbmQoXCJvcHRpb246c2VsZWN0ZWRcIikudGV4dCgpKSx0aGlzLl9yZXNpemVCdXR0b24oKSx0aGlzLl9vbih0aGlzLmJ1dHRvbix0aGlzLl9idXR0b25FdmVudHMpLHRoaXMuYnV0dG9uLm9uZShcImZvY3VzaW5cIixmdW5jdGlvbigpe3QubWVudUl0ZW1zfHx0Ll9yZWZyZXNoTWVudSgpfSksdGhpcy5faG92ZXJhYmxlKHRoaXMuYnV0dG9uKSx0aGlzLl9mb2N1c2FibGUodGhpcy5idXR0b24pfSxfZHJhd01lbnU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMubWVudT1lKFwiPHVsPlwiLHtcImFyaWEtaGlkZGVuXCI6XCJ0cnVlXCIsXCJhcmlhLWxhYmVsbGVkYnlcIjp0aGlzLmlkcy5idXR0b24saWQ6dGhpcy5pZHMubWVudX0pLHRoaXMubWVudVdyYXA9ZShcIjxkaXY+XCIse1wiY2xhc3NcIjpcInVpLXNlbGVjdG1lbnUtbWVudSB1aS1mcm9udFwifSkuYXBwZW5kKHRoaXMubWVudSkuYXBwZW5kVG8odGhpcy5fYXBwZW5kVG8oKSksdGhpcy5tZW51SW5zdGFuY2U9dGhpcy5tZW51Lm1lbnUoe3JvbGU6XCJsaXN0Ym94XCIsc2VsZWN0OmZ1bmN0aW9uKGUsaSl7ZS5wcmV2ZW50RGVmYXVsdCgpLHQuX3NldFNlbGVjdGlvbigpLHQuX3NlbGVjdChpLml0ZW0uZGF0YShcInVpLXNlbGVjdG1lbnUtaXRlbVwiKSxlKX0sZm9jdXM6ZnVuY3Rpb24oZSxpKXt2YXIgcz1pLml0ZW0uZGF0YShcInVpLXNlbGVjdG1lbnUtaXRlbVwiKTtudWxsIT10LmZvY3VzSW5kZXgmJnMuaW5kZXghPT10LmZvY3VzSW5kZXgmJih0Ll90cmlnZ2VyKFwiZm9jdXNcIixlLHtpdGVtOnN9KSx0LmlzT3Blbnx8dC5fc2VsZWN0KHMsZSkpLHQuZm9jdXNJbmRleD1zLmluZGV4LHQuYnV0dG9uLmF0dHIoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIix0Lm1lbnVJdGVtcy5lcShzLmluZGV4KS5hdHRyKFwiaWRcIikpfX0pLm1lbnUoXCJpbnN0YW5jZVwiKSx0aGlzLm1lbnUuYWRkQ2xhc3MoXCJ1aS1jb3JuZXItYm90dG9tXCIpLnJlbW92ZUNsYXNzKFwidWktY29ybmVyLWFsbFwiKSx0aGlzLm1lbnVJbnN0YW5jZS5fb2ZmKHRoaXMubWVudSxcIm1vdXNlbGVhdmVcIiksdGhpcy5tZW51SW5zdGFuY2UuX2Nsb3NlT25Eb2N1bWVudENsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuITF9LHRoaXMubWVudUluc3RhbmNlLl9pc0RpdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMX19LHJlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLl9yZWZyZXNoTWVudSgpLHRoaXMuX3NldFRleHQodGhpcy5idXR0b25UZXh0LHRoaXMuX2dldFNlbGVjdGVkSXRlbSgpLnRleHQoKSksdGhpcy5vcHRpb25zLndpZHRofHx0aGlzLl9yZXNpemVCdXR0b24oKX0sX3JlZnJlc2hNZW51OmZ1bmN0aW9uKCl7dGhpcy5tZW51LmVtcHR5KCk7dmFyIGUsdD10aGlzLmVsZW1lbnQuZmluZChcIm9wdGlvblwiKTt0Lmxlbmd0aCYmKHRoaXMuX3BhcnNlT3B0aW9ucyh0KSx0aGlzLl9yZW5kZXJNZW51KHRoaXMubWVudSx0aGlzLml0ZW1zKSx0aGlzLm1lbnVJbnN0YW5jZS5yZWZyZXNoKCksdGhpcy5tZW51SXRlbXM9dGhpcy5tZW51LmZpbmQoXCJsaVwiKS5ub3QoXCIudWktc2VsZWN0bWVudS1vcHRncm91cFwiKSxlPXRoaXMuX2dldFNlbGVjdGVkSXRlbSgpLHRoaXMubWVudUluc3RhbmNlLmZvY3VzKG51bGwsZSksdGhpcy5fc2V0QXJpYShlLmRhdGEoXCJ1aS1zZWxlY3RtZW51LWl0ZW1cIikpLHRoaXMuX3NldE9wdGlvbihcImRpc2FibGVkXCIsdGhpcy5lbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiKSkpfSxvcGVuOmZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucy5kaXNhYmxlZHx8KHRoaXMubWVudUl0ZW1zPyh0aGlzLm1lbnUuZmluZChcIi51aS1zdGF0ZS1mb2N1c1wiKS5yZW1vdmVDbGFzcyhcInVpLXN0YXRlLWZvY3VzXCIpLHRoaXMubWVudUluc3RhbmNlLmZvY3VzKG51bGwsdGhpcy5fZ2V0U2VsZWN0ZWRJdGVtKCkpKTp0aGlzLl9yZWZyZXNoTWVudSgpLHRoaXMuaXNPcGVuPSEwLHRoaXMuX3RvZ2dsZUF0dHIoKSx0aGlzLl9yZXNpemVNZW51KCksdGhpcy5fcG9zaXRpb24oKSx0aGlzLl9vbih0aGlzLmRvY3VtZW50LHRoaXMuX2RvY3VtZW50Q2xpY2spLHRoaXMuX3RyaWdnZXIoXCJvcGVuXCIsZSkpfSxfcG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLm1lbnVXcmFwLnBvc2l0aW9uKGUuZXh0ZW5kKHtvZjp0aGlzLmJ1dHRvbn0sdGhpcy5vcHRpb25zLnBvc2l0aW9uKSl9LGNsb3NlOmZ1bmN0aW9uKGUpe3RoaXMuaXNPcGVuJiYodGhpcy5pc09wZW49ITEsdGhpcy5fdG9nZ2xlQXR0cigpLHRoaXMucmFuZ2U9bnVsbCx0aGlzLl9vZmYodGhpcy5kb2N1bWVudCksdGhpcy5fdHJpZ2dlcihcImNsb3NlXCIsZSkpfSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idXR0b259LG1lbnVXaWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW51fSxfcmVuZGVyTWVudTpmdW5jdGlvbih0LGkpe3ZhciBzPXRoaXMsbj1cIlwiO2UuZWFjaChpLGZ1bmN0aW9uKGksYSl7YS5vcHRncm91cCE9PW4mJihlKFwiPGxpPlwiLHtcImNsYXNzXCI6XCJ1aS1zZWxlY3RtZW51LW9wdGdyb3VwIHVpLW1lbnUtZGl2aWRlclwiKyhhLmVsZW1lbnQucGFyZW50KFwib3B0Z3JvdXBcIikucHJvcChcImRpc2FibGVkXCIpP1wiIHVpLXN0YXRlLWRpc2FibGVkXCI6XCJcIiksdGV4dDphLm9wdGdyb3VwfSkuYXBwZW5kVG8odCksbj1hLm9wdGdyb3VwKSxzLl9yZW5kZXJJdGVtRGF0YSh0LGEpfSl9LF9yZW5kZXJJdGVtRGF0YTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9yZW5kZXJJdGVtKGUsdCkuZGF0YShcInVpLXNlbGVjdG1lbnUtaXRlbVwiLHQpfSxfcmVuZGVySXRlbTpmdW5jdGlvbih0LGkpe3ZhciBzPWUoXCI8bGk+XCIpO3JldHVybiBpLmRpc2FibGVkJiZzLmFkZENsYXNzKFwidWktc3RhdGUtZGlzYWJsZWRcIiksdGhpcy5fc2V0VGV4dChzLGkubGFiZWwpLHMuYXBwZW5kVG8odCl9LF9zZXRUZXh0OmZ1bmN0aW9uKGUsdCl7dD9lLnRleHQodCk6ZS5odG1sKFwiJiMxNjA7XCIpfSxfbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBpLHMsbj1cIi51aS1tZW51LWl0ZW1cIjt0aGlzLmlzT3Blbj9pPXRoaXMubWVudUl0ZW1zLmVxKHRoaXMuZm9jdXNJbmRleCk6KGk9dGhpcy5tZW51SXRlbXMuZXEodGhpcy5lbGVtZW50WzBdLnNlbGVjdGVkSW5kZXgpLG4rPVwiOm5vdCgudWktc3RhdGUtZGlzYWJsZWQpXCIpLHM9XCJmaXJzdFwiPT09ZXx8XCJsYXN0XCI9PT1lP2lbXCJmaXJzdFwiPT09ZT9cInByZXZBbGxcIjpcIm5leHRBbGxcIl0obikuZXEoLTEpOmlbZStcIkFsbFwiXShuKS5lcSgwKSxzLmxlbmd0aCYmdGhpcy5tZW51SW5zdGFuY2UuZm9jdXModCxzKX0sX2dldFNlbGVjdGVkSXRlbTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lbnVJdGVtcy5lcSh0aGlzLmVsZW1lbnRbMF0uc2VsZWN0ZWRJbmRleCl9LF90b2dnbGU6ZnVuY3Rpb24oZSl7dGhpc1t0aGlzLmlzT3Blbj9cImNsb3NlXCI6XCJvcGVuXCJdKGUpfSxfc2V0U2VsZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGU7dGhpcy5yYW5nZSYmKHdpbmRvdy5nZXRTZWxlY3Rpb24/KGU9d2luZG93LmdldFNlbGVjdGlvbigpLGUucmVtb3ZlQWxsUmFuZ2VzKCksZS5hZGRSYW5nZSh0aGlzLnJhbmdlKSk6dGhpcy5yYW5nZS5zZWxlY3QoKSx0aGlzLmJ1dHRvbi5mb2N1cygpKX0sX2RvY3VtZW50Q2xpY2s6e21vdXNlZG93bjpmdW5jdGlvbih0KXt0aGlzLmlzT3BlbiYmKGUodC50YXJnZXQpLmNsb3Nlc3QoXCIudWktc2VsZWN0bWVudS1tZW51LCAjXCIrdGhpcy5pZHMuYnV0dG9uKS5sZW5ndGh8fHRoaXMuY2xvc2UodCkpfX0sX2J1dHRvbkV2ZW50czp7bW91c2Vkb3duOmZ1bmN0aW9uKCl7dmFyIGU7d2luZG93LmdldFNlbGVjdGlvbj8oZT13aW5kb3cuZ2V0U2VsZWN0aW9uKCksZS5yYW5nZUNvdW50JiYodGhpcy5yYW5nZT1lLmdldFJhbmdlQXQoMCkpKTp0aGlzLnJhbmdlPWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpfSxjbGljazpmdW5jdGlvbihlKXt0aGlzLl9zZXRTZWxlY3Rpb24oKSx0aGlzLl90b2dnbGUoZSl9LGtleWRvd246ZnVuY3Rpb24odCl7dmFyIGk9ITA7c3dpdGNoKHQua2V5Q29kZSl7Y2FzZSBlLnVpLmtleUNvZGUuVEFCOmNhc2UgZS51aS5rZXlDb2RlLkVTQ0FQRTp0aGlzLmNsb3NlKHQpLGk9ITE7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5URVI6dGhpcy5pc09wZW4mJnRoaXMuX3NlbGVjdEZvY3VzZWRJdGVtKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlVQOnQuYWx0S2V5P3RoaXMuX3RvZ2dsZSh0KTp0aGlzLl9tb3ZlKFwicHJldlwiLHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkRPV046dC5hbHRLZXk/dGhpcy5fdG9nZ2xlKHQpOnRoaXMuX21vdmUoXCJuZXh0XCIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuU1BBQ0U6dGhpcy5pc09wZW4/dGhpcy5fc2VsZWN0Rm9jdXNlZEl0ZW0odCk6dGhpcy5fdG9nZ2xlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkxFRlQ6dGhpcy5fbW92ZShcInByZXZcIix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5SSUdIVDp0aGlzLl9tb3ZlKFwibmV4dFwiLHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9VUDp0aGlzLl9tb3ZlKFwiZmlyc3RcIix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5FTkQ6Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9ET1dOOnRoaXMuX21vdmUoXCJsYXN0XCIsdCk7YnJlYWs7ZGVmYXVsdDp0aGlzLm1lbnUudHJpZ2dlcih0KSxpPSExfWkmJnQucHJldmVudERlZmF1bHQoKX19LF9zZWxlY3RGb2N1c2VkSXRlbTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLm1lbnVJdGVtcy5lcSh0aGlzLmZvY3VzSW5kZXgpO3QuaGFzQ2xhc3MoXCJ1aS1zdGF0ZS1kaXNhYmxlZFwiKXx8dGhpcy5fc2VsZWN0KHQuZGF0YShcInVpLXNlbGVjdG1lbnUtaXRlbVwiKSxlKX0sX3NlbGVjdDpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuZWxlbWVudFswXS5zZWxlY3RlZEluZGV4O3RoaXMuZWxlbWVudFswXS5zZWxlY3RlZEluZGV4PWUuaW5kZXgsdGhpcy5fc2V0VGV4dCh0aGlzLmJ1dHRvblRleHQsZS5sYWJlbCksdGhpcy5fc2V0QXJpYShlKSx0aGlzLl90cmlnZ2VyKFwic2VsZWN0XCIsdCx7aXRlbTplfSksZS5pbmRleCE9PWkmJnRoaXMuX3RyaWdnZXIoXCJjaGFuZ2VcIix0LHtpdGVtOmV9KSx0aGlzLmNsb3NlKHQpfSxfc2V0QXJpYTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLm1lbnVJdGVtcy5lcShlLmluZGV4KS5hdHRyKFwiaWRcIik7dGhpcy5idXR0b24uYXR0cih7XCJhcmlhLWxhYmVsbGVkYnlcIjp0LFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCI6dH0pLHRoaXMubWVudS5hdHRyKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsdCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtcImljb25zXCI9PT1lJiZ0aGlzLmJ1dHRvbi5maW5kKFwic3Bhbi51aS1pY29uXCIpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5pY29ucy5idXR0b24pLmFkZENsYXNzKHQuYnV0dG9uKSx0aGlzLl9zdXBlcihlLHQpLFwiYXBwZW5kVG9cIj09PWUmJnRoaXMubWVudVdyYXAuYXBwZW5kVG8odGhpcy5fYXBwZW5kVG8oKSksXCJkaXNhYmxlZFwiPT09ZSYmKHRoaXMubWVudUluc3RhbmNlLm9wdGlvbihcImRpc2FibGVkXCIsdCksdGhpcy5idXR0b24udG9nZ2xlQ2xhc3MoXCJ1aS1zdGF0ZS1kaXNhYmxlZFwiLHQpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsdCksdGhpcy5lbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiLHQpLHQ/KHRoaXMuYnV0dG9uLmF0dHIoXCJ0YWJpbmRleFwiLC0xKSx0aGlzLmNsb3NlKCkpOnRoaXMuYnV0dG9uLmF0dHIoXCJ0YWJpbmRleFwiLDApKSxcIndpZHRoXCI9PT1lJiZ0aGlzLl9yZXNpemVCdXR0b24oKX0sX2FwcGVuZFRvOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLmFwcGVuZFRvO3JldHVybiB0JiYodD10LmpxdWVyeXx8dC5ub2RlVHlwZT9lKHQpOnRoaXMuZG9jdW1lbnQuZmluZCh0KS5lcSgwKSksdCYmdFswXXx8KHQ9dGhpcy5lbGVtZW50LmNsb3Nlc3QoXCIudWktZnJvbnRcIikpLHQubGVuZ3RofHwodD10aGlzLmRvY3VtZW50WzBdLmJvZHkpLHR9LF90b2dnbGVBdHRyOmZ1bmN0aW9uKCl7dGhpcy5idXR0b24udG9nZ2xlQ2xhc3MoXCJ1aS1jb3JuZXItdG9wXCIsdGhpcy5pc09wZW4pLnRvZ2dsZUNsYXNzKFwidWktY29ybmVyLWFsbFwiLCF0aGlzLmlzT3BlbikuYXR0cihcImFyaWEtZXhwYW5kZWRcIix0aGlzLmlzT3BlbiksdGhpcy5tZW51V3JhcC50b2dnbGVDbGFzcyhcInVpLXNlbGVjdG1lbnUtb3BlblwiLHRoaXMuaXNPcGVuKSx0aGlzLm1lbnUuYXR0cihcImFyaWEtaGlkZGVuXCIsIXRoaXMuaXNPcGVuKX0sX3Jlc2l6ZUJ1dHRvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucy53aWR0aDtlfHwoZT10aGlzLmVsZW1lbnQuc2hvdygpLm91dGVyV2lkdGgoKSx0aGlzLmVsZW1lbnQuaGlkZSgpKSx0aGlzLmJ1dHRvbi5vdXRlcldpZHRoKGUpfSxfcmVzaXplTWVudTpmdW5jdGlvbigpe3RoaXMubWVudS5vdXRlcldpZHRoKE1hdGgubWF4KHRoaXMuYnV0dG9uLm91dGVyV2lkdGgoKSx0aGlzLm1lbnUud2lkdGgoXCJcIikub3V0ZXJXaWR0aCgpKzEpKX0sX2dldENyZWF0ZU9wdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm57ZGlzYWJsZWQ6dGhpcy5lbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiKX19LF9wYXJzZU9wdGlvbnM6ZnVuY3Rpb24odCl7dmFyIGk9W107dC5lYWNoKGZ1bmN0aW9uKHQscyl7dmFyIG49ZShzKSxhPW4ucGFyZW50KFwib3B0Z3JvdXBcIik7aS5wdXNoKHtlbGVtZW50Om4saW5kZXg6dCx2YWx1ZTpuLnZhbCgpLGxhYmVsOm4udGV4dCgpLG9wdGdyb3VwOmEuYXR0cihcImxhYmVsXCIpfHxcIlwiLGRpc2FibGVkOmEucHJvcChcImRpc2FibGVkXCIpfHxuLnByb3AoXCJkaXNhYmxlZFwiKX0pfSksdGhpcy5pdGVtcz1pfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMubWVudVdyYXAucmVtb3ZlKCksdGhpcy5idXR0b24ucmVtb3ZlKCksdGhpcy5lbGVtZW50LnNob3coKSx0aGlzLmVsZW1lbnQucmVtb3ZlVW5pcXVlSWQoKSx0aGlzLmxhYmVsLmF0dHIoXCJmb3JcIix0aGlzLmlkcy5lbGVtZW50KX19KSxlLndpZGdldChcInVpLnNsaWRlclwiLGUudWkubW91c2Use3ZlcnNpb246XCIxLjExLjRcIix3aWRnZXRFdmVudFByZWZpeDpcInNsaWRlXCIsb3B0aW9uczp7YW5pbWF0ZTohMSxkaXN0YW5jZTowLG1heDoxMDAsbWluOjAsb3JpZW50YXRpb246XCJob3Jpem9udGFsXCIscmFuZ2U6ITEsc3RlcDoxLHZhbHVlOjAsdmFsdWVzOm51bGwsY2hhbmdlOm51bGwsc2xpZGU6bnVsbCxzdGFydDpudWxsLHN0b3A6bnVsbH0sbnVtUGFnZXM6NSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5fa2V5U2xpZGluZz0hMSx0aGlzLl9tb3VzZVNsaWRpbmc9ITEsdGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9oYW5kbGVJbmRleD1udWxsLHRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5fbW91c2VJbml0KCksdGhpcy5fY2FsY3VsYXRlTmV3TWF4KCksdGhpcy5lbGVtZW50LmFkZENsYXNzKFwidWktc2xpZGVyIHVpLXNsaWRlci1cIit0aGlzLm9yaWVudGF0aW9uK1wiIHVpLXdpZGdldFwiK1wiIHVpLXdpZGdldC1jb250ZW50XCIrXCIgdWktY29ybmVyLWFsbFwiKSx0aGlzLl9yZWZyZXNoKCksdGhpcy5fc2V0T3B0aW9uKFwiZGlzYWJsZWRcIix0aGlzLm9wdGlvbnMuZGlzYWJsZWQpLHRoaXMuX2FuaW1hdGVPZmY9ITF9LF9yZWZyZXNoOmZ1bmN0aW9uKCl7dGhpcy5fY3JlYXRlUmFuZ2UoKSx0aGlzLl9jcmVhdGVIYW5kbGVzKCksdGhpcy5fc2V0dXBFdmVudHMoKSx0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX2NyZWF0ZUhhbmRsZXM6ZnVuY3Rpb24oKXt2YXIgdCxpLHM9dGhpcy5vcHRpb25zLG49dGhpcy5lbGVtZW50LmZpbmQoXCIudWktc2xpZGVyLWhhbmRsZVwiKS5hZGRDbGFzcyhcInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbFwiKSxhPVwiPHNwYW4gY2xhc3M9J3VpLXNsaWRlci1oYW5kbGUgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsJyB0YWJpbmRleD0nMCc+PC9zcGFuPlwiLG89W107Zm9yKGk9cy52YWx1ZXMmJnMudmFsdWVzLmxlbmd0aHx8MSxuLmxlbmd0aD5pJiYobi5zbGljZShpKS5yZW1vdmUoKSxuPW4uc2xpY2UoMCxpKSksdD1uLmxlbmd0aDtpPnQ7dCsrKW8ucHVzaChhKTt0aGlzLmhhbmRsZXM9bi5hZGQoZShvLmpvaW4oXCJcIikpLmFwcGVuZFRvKHRoaXMuZWxlbWVudCkpLHRoaXMuaGFuZGxlPXRoaXMuaGFuZGxlcy5lcSgwKSx0aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbih0KXtlKHRoaXMpLmRhdGEoXCJ1aS1zbGlkZXItaGFuZGxlLWluZGV4XCIsdCl9KX0sX2NyZWF0ZVJhbmdlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLGk9XCJcIjt0LnJhbmdlPyh0LnJhbmdlPT09ITAmJih0LnZhbHVlcz90LnZhbHVlcy5sZW5ndGgmJjIhPT10LnZhbHVlcy5sZW5ndGg/dC52YWx1ZXM9W3QudmFsdWVzWzBdLHQudmFsdWVzWzBdXTplLmlzQXJyYXkodC52YWx1ZXMpJiYodC52YWx1ZXM9dC52YWx1ZXMuc2xpY2UoMCkpOnQudmFsdWVzPVt0aGlzLl92YWx1ZU1pbigpLHRoaXMuX3ZhbHVlTWluKCldKSx0aGlzLnJhbmdlJiZ0aGlzLnJhbmdlLmxlbmd0aD90aGlzLnJhbmdlLnJlbW92ZUNsYXNzKFwidWktc2xpZGVyLXJhbmdlLW1pbiB1aS1zbGlkZXItcmFuZ2UtbWF4XCIpLmNzcyh7bGVmdDpcIlwiLGJvdHRvbTpcIlwifSk6KHRoaXMucmFuZ2U9ZShcIjxkaXY+PC9kaXY+XCIpLmFwcGVuZFRvKHRoaXMuZWxlbWVudCksaT1cInVpLXNsaWRlci1yYW5nZSB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGxcIiksdGhpcy5yYW5nZS5hZGRDbGFzcyhpKyhcIm1pblwiPT09dC5yYW5nZXx8XCJtYXhcIj09PXQucmFuZ2U/XCIgdWktc2xpZGVyLXJhbmdlLVwiK3QucmFuZ2U6XCJcIikpKToodGhpcy5yYW5nZSYmdGhpcy5yYW5nZS5yZW1vdmUoKSx0aGlzLnJhbmdlPW51bGwpfSxfc2V0dXBFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLl9vZmYodGhpcy5oYW5kbGVzKSx0aGlzLl9vbih0aGlzLmhhbmRsZXMsdGhpcy5faGFuZGxlRXZlbnRzKSx0aGlzLl9ob3ZlcmFibGUodGhpcy5oYW5kbGVzKSx0aGlzLl9mb2N1c2FibGUodGhpcy5oYW5kbGVzKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZXMucmVtb3ZlKCksdGhpcy5yYW5nZSYmdGhpcy5yYW5nZS5yZW1vdmUoKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJ1aS1zbGlkZXIgdWktc2xpZGVyLWhvcml6b250YWwgdWktc2xpZGVyLXZlcnRpY2FsIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsXCIpLHRoaXMuX21vdXNlRGVzdHJveSgpfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG8scixoLGwsdT10aGlzLGQ9dGhpcy5vcHRpb25zO3JldHVybiBkLmRpc2FibGVkPyExOih0aGlzLmVsZW1lbnRTaXplPXt3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKX0sdGhpcy5lbGVtZW50T2Zmc2V0PXRoaXMuZWxlbWVudC5vZmZzZXQoKSxpPXt4OnQucGFnZVgseTp0LnBhZ2VZfSxzPXRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZShpKSxuPXRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSsxLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKHQpe3ZhciBpPU1hdGguYWJzKHMtdS52YWx1ZXModCkpOyhuPml8fG49PT1pJiYodD09PXUuX2xhc3RDaGFuZ2VkVmFsdWV8fHUudmFsdWVzKHQpPT09ZC5taW4pKSYmKG49aSxhPWUodGhpcyksbz10KX0pLHI9dGhpcy5fc3RhcnQodCxvKSxyPT09ITE/ITE6KHRoaXMuX21vdXNlU2xpZGluZz0hMCx0aGlzLl9oYW5kbGVJbmRleD1vLGEuYWRkQ2xhc3MoXCJ1aS1zdGF0ZS1hY3RpdmVcIikuZm9jdXMoKSxoPWEub2Zmc2V0KCksbD0hZSh0LnRhcmdldCkucGFyZW50cygpLmFkZEJhY2soKS5pcyhcIi51aS1zbGlkZXItaGFuZGxlXCIpLHRoaXMuX2NsaWNrT2Zmc2V0PWw/e2xlZnQ6MCx0b3A6MH06e2xlZnQ6dC5wYWdlWC1oLmxlZnQtYS53aWR0aCgpLzIsdG9wOnQucGFnZVktaC50b3AtYS5oZWlnaHQoKS8yLShwYXJzZUludChhLmNzcyhcImJvcmRlclRvcFdpZHRoXCIpLDEwKXx8MCktKHBhcnNlSW50KGEuY3NzKFwiYm9yZGVyQm90dG9tV2lkdGhcIiksMTApfHwwKSsocGFyc2VJbnQoYS5jc3MoXCJtYXJnaW5Ub3BcIiksMTApfHwwKX0sdGhpcy5oYW5kbGVzLmhhc0NsYXNzKFwidWktc3RhdGUtaG92ZXJcIil8fHRoaXMuX3NsaWRlKHQsbyxzKSx0aGlzLl9hbmltYXRlT2ZmPSEwLCEwKSl9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuITB9LF9tb3VzZURyYWc6ZnVuY3Rpb24oZSl7dmFyIHQ9e3g6ZS5wYWdlWCx5OmUucGFnZVl9LGk9dGhpcy5fbm9ybVZhbHVlRnJvbU1vdXNlKHQpO3JldHVybiB0aGlzLl9zbGlkZShlLHRoaXMuX2hhbmRsZUluZGV4LGkpLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmhhbmRsZXMucmVtb3ZlQ2xhc3MoXCJ1aS1zdGF0ZS1hY3RpdmVcIiksdGhpcy5fbW91c2VTbGlkaW5nPSExLHRoaXMuX3N0b3AoZSx0aGlzLl9oYW5kbGVJbmRleCksdGhpcy5fY2hhbmdlKGUsdGhpcy5faGFuZGxlSW5kZXgpLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fY2xpY2tPZmZzZXQ9bnVsbCx0aGlzLl9hbmltYXRlT2ZmPSExLCExfSxfZGV0ZWN0T3JpZW50YXRpb246ZnVuY3Rpb24oKXt0aGlzLm9yaWVudGF0aW9uPVwidmVydGljYWxcIj09PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbj9cInZlcnRpY2FsXCI6XCJob3Jpem9udGFsXCJ9LF9ub3JtVmFsdWVGcm9tTW91c2U6ZnVuY3Rpb24oZSl7dmFyIHQsaSxzLG4sYTtyZXR1cm5cImhvcml6b250YWxcIj09PXRoaXMub3JpZW50YXRpb24/KHQ9dGhpcy5lbGVtZW50U2l6ZS53aWR0aCxpPWUueC10aGlzLmVsZW1lbnRPZmZzZXQubGVmdC0odGhpcy5fY2xpY2tPZmZzZXQ/dGhpcy5fY2xpY2tPZmZzZXQubGVmdDowKSk6KHQ9dGhpcy5lbGVtZW50U2l6ZS5oZWlnaHQsaT1lLnktdGhpcy5lbGVtZW50T2Zmc2V0LnRvcC0odGhpcy5fY2xpY2tPZmZzZXQ/dGhpcy5fY2xpY2tPZmZzZXQudG9wOjApKSxzPWkvdCxzPjEmJihzPTEpLDA+cyYmKHM9MCksXCJ2ZXJ0aWNhbFwiPT09dGhpcy5vcmllbnRhdGlvbiYmKHM9MS1zKSxuPXRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSxhPXRoaXMuX3ZhbHVlTWluKCkrcypuLHRoaXMuX3RyaW1BbGlnblZhbHVlKGEpfSxfc3RhcnQ6ZnVuY3Rpb24oZSx0KXt2YXIgaT17aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSx2YWx1ZTp0aGlzLnZhbHVlKCl9O3JldHVybiB0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCYmKGkudmFsdWU9dGhpcy52YWx1ZXModCksaS52YWx1ZXM9dGhpcy52YWx1ZXMoKSksdGhpcy5fdHJpZ2dlcihcInN0YXJ0XCIsZSxpKX0sX3NsaWRlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcyxuLGE7dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/KHM9dGhpcy52YWx1ZXModD8wOjEpLDI9PT10aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCYmdGhpcy5vcHRpb25zLnJhbmdlPT09ITAmJigwPT09dCYmaT5zfHwxPT09dCYmcz5pKSYmKGk9cyksaSE9PXRoaXMudmFsdWVzKHQpJiYobj10aGlzLnZhbHVlcygpLG5bdF09aSxhPXRoaXMuX3RyaWdnZXIoXCJzbGlkZVwiLGUse2hhbmRsZTp0aGlzLmhhbmRsZXNbdF0sdmFsdWU6aSx2YWx1ZXM6bn0pLHM9dGhpcy52YWx1ZXModD8wOjEpLGEhPT0hMSYmdGhpcy52YWx1ZXModCxpKSkpOmkhPT10aGlzLnZhbHVlKCkmJihhPXRoaXMuX3RyaWdnZXIoXCJzbGlkZVwiLGUse2hhbmRsZTp0aGlzLmhhbmRsZXNbdF0sdmFsdWU6aX0pLGEhPT0hMSYmdGhpcy52YWx1ZShpKSl9LF9zdG9wOmZ1bmN0aW9uKGUsdCl7dmFyIGk9e2hhbmRsZTp0aGlzLmhhbmRsZXNbdF0sdmFsdWU6dGhpcy52YWx1ZSgpfTt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCYmKGkudmFsdWU9dGhpcy52YWx1ZXModCksaS52YWx1ZXM9dGhpcy52YWx1ZXMoKSksdGhpcy5fdHJpZ2dlcihcInN0b3BcIixlLGkpfSxfY2hhbmdlOmZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuX2tleVNsaWRpbmcmJiF0aGlzLl9tb3VzZVNsaWRpbmcpe3ZhciBpPXtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOnRoaXMudmFsdWUoKX07dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihpLnZhbHVlPXRoaXMudmFsdWVzKHQpLGkudmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX2xhc3RDaGFuZ2VkVmFsdWU9dCx0aGlzLl90cmlnZ2VyKFwiY2hhbmdlXCIsZSxpKX19LHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fdHJpbUFsaWduVmFsdWUoZSksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fY2hhbmdlKG51bGwsMCksdm9pZCAwKTp0aGlzLl92YWx1ZSgpfSx2YWx1ZXM6ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGE7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXJldHVybiB0aGlzLm9wdGlvbnMudmFsdWVzW3RdPXRoaXMuX3RyaW1BbGlnblZhbHVlKGkpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2NoYW5nZShudWxsLHQpLHZvaWQgMDtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fdmFsdWVzKCk7aWYoIWUuaXNBcnJheShhcmd1bWVudHNbMF0pKXJldHVybiB0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD90aGlzLl92YWx1ZXModCk6dGhpcy52YWx1ZSgpO2ZvcihzPXRoaXMub3B0aW9ucy52YWx1ZXMsbj1hcmd1bWVudHNbMF0sYT0wO3MubGVuZ3RoPmE7YSs9MSlzW2FdPXRoaXMuX3RyaW1BbGlnblZhbHVlKG5bYV0pLHRoaXMuX2NoYW5nZShudWxsLGEpO3RoaXMuX3JlZnJlc2hWYWx1ZSgpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbj0wO3N3aXRjaChcInJhbmdlXCI9PT10JiZ0aGlzLm9wdGlvbnMucmFuZ2U9PT0hMCYmKFwibWluXCI9PT1pPyh0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fdmFsdWVzKDApLHRoaXMub3B0aW9ucy52YWx1ZXM9bnVsbCk6XCJtYXhcIj09PWkmJih0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fdmFsdWVzKHRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoLTEpLHRoaXMub3B0aW9ucy52YWx1ZXM9bnVsbCkpLGUuaXNBcnJheSh0aGlzLm9wdGlvbnMudmFsdWVzKSYmKG49dGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgpLFwiZGlzYWJsZWRcIj09PXQmJnRoaXMuZWxlbWVudC50b2dnbGVDbGFzcyhcInVpLXN0YXRlLWRpc2FibGVkXCIsISFpKSx0aGlzLl9zdXBlcih0LGkpLHQpe2Nhc2VcIm9yaWVudGF0aW9uXCI6dGhpcy5fZGV0ZWN0T3JpZW50YXRpb24oKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJ1aS1zbGlkZXItaG9yaXpvbnRhbCB1aS1zbGlkZXItdmVydGljYWxcIikuYWRkQ2xhc3MoXCJ1aS1zbGlkZXItXCIrdGhpcy5vcmllbnRhdGlvbiksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5oYW5kbGVzLmNzcyhcImhvcml6b250YWxcIj09PWk/XCJib3R0b21cIjpcImxlZnRcIixcIlwiKTticmVhaztjYXNlXCJ2YWx1ZVwiOnRoaXMuX2FuaW1hdGVPZmY9ITAsdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fY2hhbmdlKG51bGwsMCksdGhpcy5fYW5pbWF0ZU9mZj0hMTticmVhaztjYXNlXCJ2YWx1ZXNcIjpmb3IodGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSxzPTA7bj5zO3MrPTEpdGhpcy5fY2hhbmdlKG51bGwscyk7dGhpcy5fYW5pbWF0ZU9mZj0hMTticmVhaztjYXNlXCJzdGVwXCI6Y2FzZVwibWluXCI6Y2FzZVwibWF4XCI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9jYWxjdWxhdGVOZXdNYXgoKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2VcInJhbmdlXCI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoKCksdGhpcy5fYW5pbWF0ZU9mZj0hMX19LF92YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucy52YWx1ZTtyZXR1cm4gZT10aGlzLl90cmltQWxpZ25WYWx1ZShlKX0sX3ZhbHVlczpmdW5jdGlvbihlKXt2YXIgdCxpLHM7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdD10aGlzLm9wdGlvbnMudmFsdWVzW2VdLHQ9dGhpcy5fdHJpbUFsaWduVmFsdWUodCk7aWYodGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgpe2ZvcihpPXRoaXMub3B0aW9ucy52YWx1ZXMuc2xpY2UoKSxzPTA7aS5sZW5ndGg+cztzKz0xKWlbc109dGhpcy5fdHJpbUFsaWduVmFsdWUoaVtzXSk7cmV0dXJuIGl9cmV0dXJuW119LF90cmltQWxpZ25WYWx1ZTpmdW5jdGlvbihlKXtpZih0aGlzLl92YWx1ZU1pbigpPj1lKXJldHVybiB0aGlzLl92YWx1ZU1pbigpO2lmKGU+PXRoaXMuX3ZhbHVlTWF4KCkpcmV0dXJuIHRoaXMuX3ZhbHVlTWF4KCk7dmFyIHQ9dGhpcy5vcHRpb25zLnN0ZXA+MD90aGlzLm9wdGlvbnMuc3RlcDoxLGk9KGUtdGhpcy5fdmFsdWVNaW4oKSkldCxzPWUtaTtyZXR1cm4gMipNYXRoLmFicyhpKT49dCYmKHMrPWk+MD90Oi10KSxwYXJzZUZsb2F0KHMudG9GaXhlZCg1KSl9LF9jYWxjdWxhdGVOZXdNYXg6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnMubWF4LHQ9dGhpcy5fdmFsdWVNaW4oKSxpPXRoaXMub3B0aW9ucy5zdGVwLHM9TWF0aC5mbG9vcigrKGUtdCkudG9GaXhlZCh0aGlzLl9wcmVjaXNpb24oKSkvaSkqaTtlPXMrdCx0aGlzLm1heD1wYXJzZUZsb2F0KGUudG9GaXhlZCh0aGlzLl9wcmVjaXNpb24oKSkpfSxfcHJlY2lzaW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fcHJlY2lzaW9uT2YodGhpcy5vcHRpb25zLnN0ZXApO3JldHVybiBudWxsIT09dGhpcy5vcHRpb25zLm1pbiYmKGU9TWF0aC5tYXgoZSx0aGlzLl9wcmVjaXNpb25PZih0aGlzLm9wdGlvbnMubWluKSkpLGV9LF9wcmVjaXNpb25PZjpmdW5jdGlvbihlKXt2YXIgdD1cIlwiK2UsaT10LmluZGV4T2YoXCIuXCIpO3JldHVybi0xPT09aT8wOnQubGVuZ3RoLWktMX0sX3ZhbHVlTWluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5taW59LF92YWx1ZU1heDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heH0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciB0LGkscyxuLGEsbz10aGlzLm9wdGlvbnMucmFuZ2Uscj10aGlzLm9wdGlvbnMsaD10aGlzLGw9dGhpcy5fYW5pbWF0ZU9mZj8hMTpyLmFuaW1hdGUsdT17fTt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD90aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbihzKXtpPTEwMCooKGgudmFsdWVzKHMpLWguX3ZhbHVlTWluKCkpLyhoLl92YWx1ZU1heCgpLWguX3ZhbHVlTWluKCkpKSx1W1wiaG9yaXpvbnRhbFwiPT09aC5vcmllbnRhdGlvbj9cImxlZnRcIjpcImJvdHRvbVwiXT1pK1wiJVwiLGUodGhpcykuc3RvcCgxLDEpW2w/XCJhbmltYXRlXCI6XCJjc3NcIl0odSxyLmFuaW1hdGUpLGgub3B0aW9ucy5yYW5nZT09PSEwJiYoXCJob3Jpem9udGFsXCI9PT1oLm9yaWVudGF0aW9uPygwPT09cyYmaC5yYW5nZS5zdG9wKDEsMSlbbD9cImFuaW1hdGVcIjpcImNzc1wiXSh7bGVmdDppK1wiJVwifSxyLmFuaW1hdGUpLDE9PT1zJiZoLnJhbmdlW2w/XCJhbmltYXRlXCI6XCJjc3NcIl0oe3dpZHRoOmktdCtcIiVcIn0se3F1ZXVlOiExLGR1cmF0aW9uOnIuYW5pbWF0ZX0pKTooMD09PXMmJmgucmFuZ2Uuc3RvcCgxLDEpW2w/XCJhbmltYXRlXCI6XCJjc3NcIl0oe2JvdHRvbTppK1wiJVwifSxyLmFuaW1hdGUpLDE9PT1zJiZoLnJhbmdlW2w/XCJhbmltYXRlXCI6XCJjc3NcIl0oe2hlaWdodDppLXQrXCIlXCJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpyLmFuaW1hdGV9KSkpLHQ9aX0pOihzPXRoaXMudmFsdWUoKSxuPXRoaXMuX3ZhbHVlTWluKCksYT10aGlzLl92YWx1ZU1heCgpLGk9YSE9PW4/MTAwKigocy1uKS8oYS1uKSk6MCx1W1wiaG9yaXpvbnRhbFwiPT09dGhpcy5vcmllbnRhdGlvbj9cImxlZnRcIjpcImJvdHRvbVwiXT1pK1wiJVwiLHRoaXMuaGFuZGxlLnN0b3AoMSwxKVtsP1wiYW5pbWF0ZVwiOlwiY3NzXCJdKHUsci5hbmltYXRlKSxcIm1pblwiPT09byYmXCJob3Jpem9udGFsXCI9PT10aGlzLm9yaWVudGF0aW9uJiZ0aGlzLnJhbmdlLnN0b3AoMSwxKVtsP1wiYW5pbWF0ZVwiOlwiY3NzXCJdKHt3aWR0aDppK1wiJVwifSxyLmFuaW1hdGUpLFwibWF4XCI9PT1vJiZcImhvcml6b250YWxcIj09PXRoaXMub3JpZW50YXRpb24mJnRoaXMucmFuZ2VbbD9cImFuaW1hdGVcIjpcImNzc1wiXSh7d2lkdGg6MTAwLWkrXCIlXCJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpyLmFuaW1hdGV9KSxcIm1pblwiPT09byYmXCJ2ZXJ0aWNhbFwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbbD9cImFuaW1hdGVcIjpcImNzc1wiXSh7aGVpZ2h0OmkrXCIlXCJ9LHIuYW5pbWF0ZSksXCJtYXhcIj09PW8mJlwidmVydGljYWxcIj09PXRoaXMub3JpZW50YXRpb24mJnRoaXMucmFuZ2VbbD9cImFuaW1hdGVcIjpcImNzc1wiXSh7aGVpZ2h0OjEwMC1pK1wiJVwifSx7cXVldWU6ITEsZHVyYXRpb246ci5hbmltYXRlfSkpfSxfaGFuZGxlRXZlbnRzOntrZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG89ZSh0LnRhcmdldCkuZGF0YShcInVpLXNsaWRlci1oYW5kbGUtaW5kZXhcIik7c3dpdGNoKHQua2V5Q29kZSl7Y2FzZSBlLnVpLmtleUNvZGUuSE9NRTpjYXNlIGUudWkua2V5Q29kZS5FTkQ6Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9VUDpjYXNlIGUudWkua2V5Q29kZS5QQUdFX0RPV046Y2FzZSBlLnVpLmtleUNvZGUuVVA6Y2FzZSBlLnVpLmtleUNvZGUuUklHSFQ6Y2FzZSBlLnVpLmtleUNvZGUuRE9XTjpjYXNlIGUudWkua2V5Q29kZS5MRUZUOmlmKHQucHJldmVudERlZmF1bHQoKSwhdGhpcy5fa2V5U2xpZGluZyYmKHRoaXMuX2tleVNsaWRpbmc9ITAsZSh0LnRhcmdldCkuYWRkQ2xhc3MoXCJ1aS1zdGF0ZS1hY3RpdmVcIiksaT10aGlzLl9zdGFydCh0LG8pLGk9PT0hMSkpcmV0dXJufXN3aXRjaChhPXRoaXMub3B0aW9ucy5zdGVwLHM9bj10aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD90aGlzLnZhbHVlcyhvKTp0aGlzLnZhbHVlKCksdC5rZXlDb2RlKXtjYXNlIGUudWkua2V5Q29kZS5IT01FOm49dGhpcy5fdmFsdWVNaW4oKTticmVhaztjYXNlIGUudWkua2V5Q29kZS5FTkQ6bj10aGlzLl92YWx1ZU1heCgpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlBBR0VfVVA6bj10aGlzLl90cmltQWxpZ25WYWx1ZShzKyh0aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCkpL3RoaXMubnVtUGFnZXMpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlBBR0VfRE9XTjpuPXRoaXMuX3RyaW1BbGlnblZhbHVlKHMtKHRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSkvdGhpcy5udW1QYWdlcyk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuVVA6Y2FzZSBlLnVpLmtleUNvZGUuUklHSFQ6aWYocz09PXRoaXMuX3ZhbHVlTWF4KCkpcmV0dXJuO249dGhpcy5fdHJpbUFsaWduVmFsdWUocythKTticmVhaztjYXNlIGUudWkua2V5Q29kZS5ET1dOOmNhc2UgZS51aS5rZXlDb2RlLkxFRlQ6aWYocz09PXRoaXMuX3ZhbHVlTWluKCkpcmV0dXJuO249dGhpcy5fdHJpbUFsaWduVmFsdWUocy1hKX10aGlzLl9zbGlkZSh0LG8sbil9LGtleXVwOmZ1bmN0aW9uKHQpe3ZhciBpPWUodC50YXJnZXQpLmRhdGEoXCJ1aS1zbGlkZXItaGFuZGxlLWluZGV4XCIpO3RoaXMuX2tleVNsaWRpbmcmJih0aGlzLl9rZXlTbGlkaW5nPSExLHRoaXMuX3N0b3AodCxpKSx0aGlzLl9jaGFuZ2UodCxpKSxlKHQudGFyZ2V0KS5yZW1vdmVDbGFzcyhcInVpLXN0YXRlLWFjdGl2ZVwiKSl9fX0pLGUud2lkZ2V0KFwidWkuc29ydGFibGVcIixlLnVpLm1vdXNlLHt2ZXJzaW9uOlwiMS4xMS40XCIsd2lkZ2V0RXZlbnRQcmVmaXg6XCJzb3J0XCIscmVhZHk6ITEsb3B0aW9uczp7YXBwZW5kVG86XCJwYXJlbnRcIixheGlzOiExLGNvbm5lY3RXaXRoOiExLGNvbnRhaW5tZW50OiExLGN1cnNvcjpcImF1dG9cIixjdXJzb3JBdDohMSxkcm9wT25FbXB0eTohMCxmb3JjZVBsYWNlaG9sZGVyU2l6ZTohMSxmb3JjZUhlbHBlclNpemU6ITEsZ3JpZDohMSxoYW5kbGU6ITEsaGVscGVyOlwib3JpZ2luYWxcIixpdGVtczpcIj4gKlwiLG9wYWNpdHk6ITEscGxhY2Vob2xkZXI6ITEscmV2ZXJ0OiExLHNjcm9sbDohMCxzY3JvbGxTZW5zaXRpdml0eToyMCxzY3JvbGxTcGVlZDoyMCxzY29wZTpcImRlZmF1bHRcIix0b2xlcmFuY2U6XCJpbnRlcnNlY3RcIix6SW5kZXg6MWUzLGFjdGl2YXRlOm51bGwsYmVmb3JlU3RvcDpudWxsLGNoYW5nZTpudWxsLGRlYWN0aXZhdGU6bnVsbCxvdXQ6bnVsbCxvdmVyOm51bGwscmVjZWl2ZTpudWxsLHJlbW92ZTpudWxsLHNvcnQ6bnVsbCxzdGFydDpudWxsLHN0b3A6bnVsbCx1cGRhdGU6bnVsbH0sX2lzT3ZlckF4aXM6ZnVuY3Rpb24oZSx0LGkpe3JldHVybiBlPj10JiZ0K2k+ZX0sX2lzRmxvYXRpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuL2xlZnR8cmlnaHQvLnRlc3QoZS5jc3MoXCJmbG9hdFwiKSl8fC9pbmxpbmV8dGFibGUtY2VsbC8udGVzdChlLmNzcyhcImRpc3BsYXlcIikpfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5jb250YWluZXJDYWNoZT17fSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoXCJ1aS1zb3J0YWJsZVwiKSx0aGlzLnJlZnJlc2goKSx0aGlzLm9mZnNldD10aGlzLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5fbW91c2VJbml0KCksdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCksdGhpcy5yZWFkeT0hMH0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe3RoaXMuX3N1cGVyKGUsdCksXCJoYW5kbGVcIj09PWUmJnRoaXMuX3NldEhhbmRsZUNsYXNzTmFtZSgpfSxfc2V0SGFuZGxlQ2xhc3NOYW1lOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmZpbmQoXCIudWktc29ydGFibGUtaGFuZGxlXCIpLnJlbW92ZUNsYXNzKFwidWktc29ydGFibGUtaGFuZGxlXCIpLGUuZWFjaCh0aGlzLml0ZW1zLGZ1bmN0aW9uKCl7KHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oYW5kbGU/dGhpcy5pdGVtLmZpbmQodGhpcy5pbnN0YW5jZS5vcHRpb25zLmhhbmRsZSk6dGhpcy5pdGVtKS5hZGRDbGFzcyhcInVpLXNvcnRhYmxlLWhhbmRsZVwiKX0pfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhcInVpLXNvcnRhYmxlIHVpLXNvcnRhYmxlLWRpc2FibGVkXCIpLmZpbmQoXCIudWktc29ydGFibGUtaGFuZGxlXCIpLnJlbW92ZUNsYXNzKFwidWktc29ydGFibGUtaGFuZGxlXCIpLHRoaXMuX21vdXNlRGVzdHJveSgpO2Zvcih2YXIgZT10aGlzLml0ZW1zLmxlbmd0aC0xO2U+PTA7ZS0tKXRoaXMuaXRlbXNbZV0uaXRlbS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZStcIi1pdGVtXCIpO3JldHVybiB0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKHQsaSl7dmFyIHM9bnVsbCxuPSExLGE9dGhpcztyZXR1cm4gdGhpcy5yZXZlcnRpbmc/ITE6dGhpcy5vcHRpb25zLmRpc2FibGVkfHxcInN0YXRpY1wiPT09dGhpcy5vcHRpb25zLnR5cGU/ITE6KHRoaXMuX3JlZnJlc2hJdGVtcyh0KSxlKHQudGFyZ2V0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe3JldHVybiBlLmRhdGEodGhpcyxhLndpZGdldE5hbWUrXCItaXRlbVwiKT09PWE/KHM9ZSh0aGlzKSwhMSk6dm9pZCAwfSksZS5kYXRhKHQudGFyZ2V0LGEud2lkZ2V0TmFtZStcIi1pdGVtXCIpPT09YSYmKHM9ZSh0LnRhcmdldCkpLHM/IXRoaXMub3B0aW9ucy5oYW5kbGV8fGl8fChlKHRoaXMub3B0aW9ucy5oYW5kbGUscykuZmluZChcIipcIikuYWRkQmFjaygpLmVhY2goZnVuY3Rpb24oKXt0aGlzPT09dC50YXJnZXQmJihuPSEwKX0pLG4pPyh0aGlzLmN1cnJlbnRJdGVtPXMsdGhpcy5fcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXMoKSwhMCk6ITE6ITEpfSxfbW91c2VTdGFydDpmdW5jdGlvbih0LGkscyl7dmFyIG4sYSxvPXRoaXMub3B0aW9ucztpZih0aGlzLmN1cnJlbnRDb250YWluZXI9dGhpcyx0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKSx0aGlzLmhlbHBlcj10aGlzLl9jcmVhdGVIZWxwZXIodCksdGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpLHRoaXMuX2NhY2hlTWFyZ2lucygpLHRoaXMuc2Nyb2xsUGFyZW50PXRoaXMuaGVscGVyLnNjcm9sbFBhcmVudCgpLHRoaXMub2Zmc2V0PXRoaXMuY3VycmVudEl0ZW0ub2Zmc2V0KCksdGhpcy5vZmZzZXQ9e3RvcDp0aGlzLm9mZnNldC50b3AtdGhpcy5tYXJnaW5zLnRvcCxsZWZ0OnRoaXMub2Zmc2V0LmxlZnQtdGhpcy5tYXJnaW5zLmxlZnR9LGUuZXh0ZW5kKHRoaXMub2Zmc2V0LHtjbGljazp7bGVmdDp0LnBhZ2VYLXRoaXMub2Zmc2V0LmxlZnQsdG9wOnQucGFnZVktdGhpcy5vZmZzZXQudG9wfSxwYXJlbnQ6dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkscmVsYXRpdmU6dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX0pLHRoaXMuaGVscGVyLmNzcyhcInBvc2l0aW9uXCIsXCJhYnNvbHV0ZVwiKSx0aGlzLmNzc1Bvc2l0aW9uPXRoaXMuaGVscGVyLmNzcyhcInBvc2l0aW9uXCIpLHRoaXMub3JpZ2luYWxQb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKHQpLHRoaXMub3JpZ2luYWxQYWdlWD10LnBhZ2VYLHRoaXMub3JpZ2luYWxQYWdlWT10LnBhZ2VZLG8uY3Vyc29yQXQmJnRoaXMuX2FkanVzdE9mZnNldEZyb21IZWxwZXIoby5jdXJzb3JBdCksdGhpcy5kb21Qb3NpdGlvbj17cHJldjp0aGlzLmN1cnJlbnRJdGVtLnByZXYoKVswXSxwYXJlbnQ6dGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKVswXX0sdGhpcy5oZWxwZXJbMF0hPT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLmN1cnJlbnRJdGVtLmhpZGUoKSx0aGlzLl9jcmVhdGVQbGFjZWhvbGRlcigpLG8uY29udGFpbm1lbnQmJnRoaXMuX3NldENvbnRhaW5tZW50KCksby5jdXJzb3ImJlwiYXV0b1wiIT09by5jdXJzb3ImJihhPXRoaXMuZG9jdW1lbnQuZmluZChcImJvZHlcIiksdGhpcy5zdG9yZWRDdXJzb3I9YS5jc3MoXCJjdXJzb3JcIiksYS5jc3MoXCJjdXJzb3JcIixvLmN1cnNvciksdGhpcy5zdG9yZWRTdHlsZXNoZWV0PWUoXCI8c3R5bGU+KnsgY3Vyc29yOiBcIitvLmN1cnNvcitcIiAhaW1wb3J0YW50OyB9PC9zdHlsZT5cIikuYXBwZW5kVG8oYSkpLG8ub3BhY2l0eSYmKHRoaXMuaGVscGVyLmNzcyhcIm9wYWNpdHlcIikmJih0aGlzLl9zdG9yZWRPcGFjaXR5PXRoaXMuaGVscGVyLmNzcyhcIm9wYWNpdHlcIikpLHRoaXMuaGVscGVyLmNzcyhcIm9wYWNpdHlcIixvLm9wYWNpdHkpKSxvLnpJbmRleCYmKHRoaXMuaGVscGVyLmNzcyhcInpJbmRleFwiKSYmKHRoaXMuX3N0b3JlZFpJbmRleD10aGlzLmhlbHBlci5jc3MoXCJ6SW5kZXhcIikpLHRoaXMuaGVscGVyLmNzcyhcInpJbmRleFwiLG8uekluZGV4KSksdGhpcy5zY3JvbGxQYXJlbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdJiZcIkhUTUxcIiE9PXRoaXMuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUmJih0aGlzLm92ZXJmbG93T2Zmc2V0PXRoaXMuc2Nyb2xsUGFyZW50Lm9mZnNldCgpKSx0aGlzLl90cmlnZ2VyKFwic3RhcnRcIix0LHRoaXMuX3VpSGFzaCgpKSx0aGlzLl9wcmVzZXJ2ZUhlbHBlclByb3BvcnRpb25zfHx0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksIXMpZm9yKG49dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO24+PTA7bi0tKXRoaXMuY29udGFpbmVyc1tuXS5fdHJpZ2dlcihcImFjdGl2YXRlXCIsdCx0aGlzLl91aUhhc2godGhpcykpO1xucmV0dXJuIGUudWkuZGRtYW5hZ2VyJiYoZS51aS5kZG1hbmFnZXIuY3VycmVudD10aGlzKSxlLnVpLmRkbWFuYWdlciYmIW8uZHJvcEJlaGF2aW91ciYmZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyx0KSx0aGlzLmRyYWdnaW5nPSEwLHRoaXMuaGVscGVyLmFkZENsYXNzKFwidWktc29ydGFibGUtaGVscGVyXCIpLHRoaXMuX21vdXNlRHJhZyh0KSwhMH0sX21vdXNlRHJhZzpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYSxvPXRoaXMub3B0aW9ucyxyPSExO2Zvcih0aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24odCksdGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbyhcImFic29sdXRlXCIpLHRoaXMubGFzdFBvc2l0aW9uQWJzfHwodGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicyksdGhpcy5vcHRpb25zLnNjcm9sbCYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5kb2N1bWVudFswXSYmXCJIVE1MXCIhPT10aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lPyh0aGlzLm92ZXJmbG93T2Zmc2V0LnRvcCt0aGlzLnNjcm9sbFBhcmVudFswXS5vZmZzZXRIZWlnaHQtdC5wYWdlWTxvLnNjcm9sbFNlbnNpdGl2aXR5P3RoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1yPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCtvLnNjcm9sbFNwZWVkOnQucGFnZVktdGhpcy5vdmVyZmxvd09mZnNldC50b3A8by5zY3JvbGxTZW5zaXRpdml0eSYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1yPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcC1vLnNjcm9sbFNwZWVkKSx0aGlzLm92ZXJmbG93T2Zmc2V0LmxlZnQrdGhpcy5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0V2lkdGgtdC5wYWdlWDxvLnNjcm9sbFNlbnNpdGl2aXR5P3RoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9cj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0K28uc2Nyb2xsU3BlZWQ6dC5wYWdlWC10aGlzLm92ZXJmbG93T2Zmc2V0LmxlZnQ8by5zY3JvbGxTZW5zaXRpdml0eSYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9cj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0LW8uc2Nyb2xsU3BlZWQpKToodC5wYWdlWS10aGlzLmRvY3VtZW50LnNjcm9sbFRvcCgpPG8uc2Nyb2xsU2Vuc2l0aXZpdHk/cj10aGlzLmRvY3VtZW50LnNjcm9sbFRvcCh0aGlzLmRvY3VtZW50LnNjcm9sbFRvcCgpLW8uc2Nyb2xsU3BlZWQpOnRoaXMud2luZG93LmhlaWdodCgpLSh0LnBhZ2VZLXRoaXMuZG9jdW1lbnQuc2Nyb2xsVG9wKCkpPG8uc2Nyb2xsU2Vuc2l0aXZpdHkmJihyPXRoaXMuZG9jdW1lbnQuc2Nyb2xsVG9wKHRoaXMuZG9jdW1lbnQuc2Nyb2xsVG9wKCkrby5zY3JvbGxTcGVlZCkpLHQucGFnZVgtdGhpcy5kb2N1bWVudC5zY3JvbGxMZWZ0KCk8by5zY3JvbGxTZW5zaXRpdml0eT9yPXRoaXMuZG9jdW1lbnQuc2Nyb2xsTGVmdCh0aGlzLmRvY3VtZW50LnNjcm9sbExlZnQoKS1vLnNjcm9sbFNwZWVkKTp0aGlzLndpbmRvdy53aWR0aCgpLSh0LnBhZ2VYLXRoaXMuZG9jdW1lbnQuc2Nyb2xsTGVmdCgpKTxvLnNjcm9sbFNlbnNpdGl2aXR5JiYocj10aGlzLmRvY3VtZW50LnNjcm9sbExlZnQodGhpcy5kb2N1bWVudC5zY3JvbGxMZWZ0KCkrby5zY3JvbGxTcGVlZCkpKSxyIT09ITEmJmUudWkuZGRtYW5hZ2VyJiYhby5kcm9wQmVoYXZpb3VyJiZlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLHQpKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKFwiYWJzb2x1dGVcIiksdGhpcy5vcHRpb25zLmF4aXMmJlwieVwiPT09dGhpcy5vcHRpb25zLmF4aXN8fCh0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCtcInB4XCIpLHRoaXMub3B0aW9ucy5heGlzJiZcInhcIj09PXRoaXMub3B0aW9ucy5heGlzfHwodGhpcy5oZWxwZXJbMF0uc3R5bGUudG9wPXRoaXMucG9zaXRpb24udG9wK1wicHhcIiksaT10aGlzLml0ZW1zLmxlbmd0aC0xO2k+PTA7aS0tKWlmKHM9dGhpcy5pdGVtc1tpXSxuPXMuaXRlbVswXSxhPXRoaXMuX2ludGVyc2VjdHNXaXRoUG9pbnRlcihzKSxhJiZzLmluc3RhbmNlPT09dGhpcy5jdXJyZW50Q29udGFpbmVyJiZuIT09dGhpcy5jdXJyZW50SXRlbVswXSYmdGhpcy5wbGFjZWhvbGRlclsxPT09YT9cIm5leHRcIjpcInByZXZcIl0oKVswXSE9PW4mJiFlLmNvbnRhaW5zKHRoaXMucGxhY2Vob2xkZXJbMF0sbikmJihcInNlbWktZHluYW1pY1wiPT09dGhpcy5vcHRpb25zLnR5cGU/IWUuY29udGFpbnModGhpcy5lbGVtZW50WzBdLG4pOiEwKSl7aWYodGhpcy5kaXJlY3Rpb249MT09PWE/XCJkb3duXCI6XCJ1cFwiLFwicG9pbnRlclwiIT09dGhpcy5vcHRpb25zLnRvbGVyYW5jZSYmIXRoaXMuX2ludGVyc2VjdHNXaXRoU2lkZXMocykpYnJlYWs7dGhpcy5fcmVhcnJhbmdlKHQscyksdGhpcy5fdHJpZ2dlcihcImNoYW5nZVwiLHQsdGhpcy5fdWlIYXNoKCkpO2JyZWFrfXJldHVybiB0aGlzLl9jb250YWN0Q29udGFpbmVycyh0KSxlLnVpLmRkbWFuYWdlciYmZS51aS5kZG1hbmFnZXIuZHJhZyh0aGlzLHQpLHRoaXMuX3RyaWdnZXIoXCJzb3J0XCIsdCx0aGlzLl91aUhhc2goKSksdGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicywhMX0sX21vdXNlU3RvcDpmdW5jdGlvbih0LGkpe2lmKHQpe2lmKGUudWkuZGRtYW5hZ2VyJiYhdGhpcy5vcHRpb25zLmRyb3BCZWhhdmlvdXImJmUudWkuZGRtYW5hZ2VyLmRyb3AodGhpcyx0KSx0aGlzLm9wdGlvbnMucmV2ZXJ0KXt2YXIgcz10aGlzLG49dGhpcy5wbGFjZWhvbGRlci5vZmZzZXQoKSxhPXRoaXMub3B0aW9ucy5heGlzLG89e307YSYmXCJ4XCIhPT1hfHwoby5sZWZ0PW4ubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdC10aGlzLm1hcmdpbnMubGVmdCsodGhpcy5vZmZzZXRQYXJlbnRbMF09PT10aGlzLmRvY3VtZW50WzBdLmJvZHk/MDp0aGlzLm9mZnNldFBhcmVudFswXS5zY3JvbGxMZWZ0KSksYSYmXCJ5XCIhPT1hfHwoby50b3A9bi50b3AtdGhpcy5vZmZzZXQucGFyZW50LnRvcC10aGlzLm1hcmdpbnMudG9wKyh0aGlzLm9mZnNldFBhcmVudFswXT09PXRoaXMuZG9jdW1lbnRbMF0uYm9keT8wOnRoaXMub2Zmc2V0UGFyZW50WzBdLnNjcm9sbFRvcCkpLHRoaXMucmV2ZXJ0aW5nPSEwLGUodGhpcy5oZWxwZXIpLmFuaW1hdGUobyxwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0LDEwKXx8NTAwLGZ1bmN0aW9uKCl7cy5fY2xlYXIodCl9KX1lbHNlIHRoaXMuX2NsZWFyKHQsaSk7cmV0dXJuITF9fSxjYW5jZWw6ZnVuY3Rpb24oKXtpZih0aGlzLmRyYWdnaW5nKXt0aGlzLl9tb3VzZVVwKHt0YXJnZXQ6bnVsbH0pLFwib3JpZ2luYWxcIj09PXRoaXMub3B0aW9ucy5oZWxwZXI/dGhpcy5jdXJyZW50SXRlbS5jc3ModGhpcy5fc3RvcmVkQ1NTKS5yZW1vdmVDbGFzcyhcInVpLXNvcnRhYmxlLWhlbHBlclwiKTp0aGlzLmN1cnJlbnRJdGVtLnNob3coKTtmb3IodmFyIHQ9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO3Q+PTA7dC0tKXRoaXMuY29udGFpbmVyc1t0XS5fdHJpZ2dlcihcImRlYWN0aXZhdGVcIixudWxsLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW3RdLmNvbnRhaW5lckNhY2hlLm92ZXImJih0aGlzLmNvbnRhaW5lcnNbdF0uX3RyaWdnZXIoXCJvdXRcIixudWxsLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW3RdLmNvbnRhaW5lckNhY2hlLm92ZXI9MCl9cmV0dXJuIHRoaXMucGxhY2Vob2xkZXImJih0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUmJnRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBsYWNlaG9sZGVyWzBdKSxcIm9yaWdpbmFsXCIhPT10aGlzLm9wdGlvbnMuaGVscGVyJiZ0aGlzLmhlbHBlciYmdGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSYmdGhpcy5oZWxwZXIucmVtb3ZlKCksZS5leHRlbmQodGhpcyx7aGVscGVyOm51bGwsZHJhZ2dpbmc6ITEscmV2ZXJ0aW5nOiExLF9ub0ZpbmFsU29ydDpudWxsfSksdGhpcy5kb21Qb3NpdGlvbi5wcmV2P2UodGhpcy5kb21Qb3NpdGlvbi5wcmV2KS5hZnRlcih0aGlzLmN1cnJlbnRJdGVtKTplKHRoaXMuZG9tUG9zaXRpb24ucGFyZW50KS5wcmVwZW5kKHRoaXMuY3VycmVudEl0ZW0pKSx0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fZ2V0SXRlbXNBc2pRdWVyeSh0JiZ0LmNvbm5lY3RlZCkscz1bXTtyZXR1cm4gdD10fHx7fSxlKGkpLmVhY2goZnVuY3Rpb24oKXt2YXIgaT0oZSh0Lml0ZW18fHRoaXMpLmF0dHIodC5hdHRyaWJ1dGV8fFwiaWRcIil8fFwiXCIpLm1hdGNoKHQuZXhwcmVzc2lvbnx8LyguKylbXFwtPV9dKC4rKS8pO2kmJnMucHVzaCgodC5rZXl8fGlbMV0rXCJbXVwiKStcIj1cIisodC5rZXkmJnQuZXhwcmVzc2lvbj9pWzFdOmlbMl0pKX0pLCFzLmxlbmd0aCYmdC5rZXkmJnMucHVzaCh0LmtleStcIj1cIikscy5qb2luKFwiJlwiKX0sdG9BcnJheTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9nZXRJdGVtc0FzalF1ZXJ5KHQmJnQuY29ubmVjdGVkKSxzPVtdO3JldHVybiB0PXR8fHt9LGkuZWFjaChmdW5jdGlvbigpe3MucHVzaChlKHQuaXRlbXx8dGhpcykuYXR0cih0LmF0dHJpYnV0ZXx8XCJpZFwiKXx8XCJcIil9KSxzfSxfaW50ZXJzZWN0c1dpdGg6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LGk9dCt0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLHM9dGhpcy5wb3NpdGlvbkFicy50b3Asbj1zK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGE9ZS5sZWZ0LG89YStlLndpZHRoLHI9ZS50b3AsaD1yK2UuaGVpZ2h0LGw9dGhpcy5vZmZzZXQuY2xpY2sudG9wLHU9dGhpcy5vZmZzZXQuY2xpY2subGVmdCxkPVwieFwiPT09dGhpcy5vcHRpb25zLmF4aXN8fHMrbD5yJiZoPnMrbCxjPVwieVwiPT09dGhpcy5vcHRpb25zLmF4aXN8fHQrdT5hJiZvPnQrdSxwPWQmJmM7cmV0dXJuXCJwb2ludGVyXCI9PT10aGlzLm9wdGlvbnMudG9sZXJhbmNlfHx0aGlzLm9wdGlvbnMuZm9yY2VQb2ludGVyRm9yQ29udGFpbmVyc3x8XCJwb2ludGVyXCIhPT10aGlzLm9wdGlvbnMudG9sZXJhbmNlJiZ0aGlzLmhlbHBlclByb3BvcnRpb25zW3RoaXMuZmxvYXRpbmc/XCJ3aWR0aFwiOlwiaGVpZ2h0XCJdPmVbdGhpcy5mbG9hdGluZz9cIndpZHRoXCI6XCJoZWlnaHRcIl0/cDp0K3RoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMj5hJiZvPmktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yJiZzK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzI+ciYmaD5uLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzJ9LF9pbnRlcnNlY3RzV2l0aFBvaW50ZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9XCJ4XCI9PT10aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5faXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLnRvcCt0aGlzLm9mZnNldC5jbGljay50b3AsZS50b3AsZS5oZWlnaHQpLGk9XCJ5XCI9PT10aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5faXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLmxlZnQrdGhpcy5vZmZzZXQuY2xpY2subGVmdCxlLmxlZnQsZS53aWR0aCkscz10JiZpLG49dGhpcy5fZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uKCksYT10aGlzLl9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbigpO3JldHVybiBzP3RoaXMuZmxvYXRpbmc/YSYmXCJyaWdodFwiPT09YXx8XCJkb3duXCI9PT1uPzI6MTpuJiYoXCJkb3duXCI9PT1uPzI6MSk6ITF9LF9pbnRlcnNlY3RzV2l0aFNpZGVzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2lzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy50b3ArdGhpcy5vZmZzZXQuY2xpY2sudG9wLGUudG9wK2UuaGVpZ2h0LzIsZS5oZWlnaHQpLGk9dGhpcy5faXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLmxlZnQrdGhpcy5vZmZzZXQuY2xpY2subGVmdCxlLmxlZnQrZS53aWR0aC8yLGUud2lkdGgpLHM9dGhpcy5fZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uKCksbj10aGlzLl9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbigpO3JldHVybiB0aGlzLmZsb2F0aW5nJiZuP1wicmlnaHRcIj09PW4mJml8fFwibGVmdFwiPT09biYmIWk6cyYmKFwiZG93blwiPT09cyYmdHx8XCJ1cFwiPT09cyYmIXQpfSxfZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wb3NpdGlvbkFicy50b3AtdGhpcy5sYXN0UG9zaXRpb25BYnMudG9wO3JldHVybiAwIT09ZSYmKGU+MD9cImRvd25cIjpcInVwXCIpfSxfZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBvc2l0aW9uQWJzLmxlZnQtdGhpcy5sYXN0UG9zaXRpb25BYnMubGVmdDtyZXR1cm4gMCE9PWUmJihlPjA/XCJyaWdodFwiOlwibGVmdFwiKX0scmVmcmVzaDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcmVmcmVzaEl0ZW1zKGUpLHRoaXMuX3NldEhhbmRsZUNsYXNzTmFtZSgpLHRoaXMucmVmcmVzaFBvc2l0aW9ucygpLHRoaXN9LF9jb25uZWN0V2l0aDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucztyZXR1cm4gZS5jb25uZWN0V2l0aC5jb25zdHJ1Y3Rvcj09PVN0cmluZz9bZS5jb25uZWN0V2l0aF06ZS5jb25uZWN0V2l0aH0sX2dldEl0ZW1zQXNqUXVlcnk6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gaSgpe3IucHVzaCh0aGlzKX12YXIgcyxuLGEsbyxyPVtdLGg9W10sbD10aGlzLl9jb25uZWN0V2l0aCgpO2lmKGwmJnQpZm9yKHM9bC5sZW5ndGgtMTtzPj0wO3MtLSlmb3IoYT1lKGxbc10sdGhpcy5kb2N1bWVudFswXSksbj1hLmxlbmd0aC0xO24+PTA7bi0tKW89ZS5kYXRhKGFbbl0sdGhpcy53aWRnZXRGdWxsTmFtZSksbyYmbyE9PXRoaXMmJiFvLm9wdGlvbnMuZGlzYWJsZWQmJmgucHVzaChbZS5pc0Z1bmN0aW9uKG8ub3B0aW9ucy5pdGVtcyk/by5vcHRpb25zLml0ZW1zLmNhbGwoby5lbGVtZW50KTplKG8ub3B0aW9ucy5pdGVtcyxvLmVsZW1lbnQpLm5vdChcIi51aS1zb3J0YWJsZS1oZWxwZXJcIikubm90KFwiLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyXCIpLG9dKTtmb3IoaC5wdXNoKFtlLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLml0ZW1zKT90aGlzLm9wdGlvbnMuaXRlbXMuY2FsbCh0aGlzLmVsZW1lbnQsbnVsbCx7b3B0aW9uczp0aGlzLm9wdGlvbnMsaXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6ZSh0aGlzLm9wdGlvbnMuaXRlbXMsdGhpcy5lbGVtZW50KS5ub3QoXCIudWktc29ydGFibGUtaGVscGVyXCIpLm5vdChcIi51aS1zb3J0YWJsZS1wbGFjZWhvbGRlclwiKSx0aGlzXSkscz1oLmxlbmd0aC0xO3M+PTA7cy0tKWhbc11bMF0uZWFjaChpKTtyZXR1cm4gZShyKX0sX3JlbW92ZUN1cnJlbnRzRnJvbUl0ZW1zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jdXJyZW50SXRlbS5maW5kKFwiOmRhdGEoXCIrdGhpcy53aWRnZXROYW1lK1wiLWl0ZW0pXCIpO3RoaXMuaXRlbXM9ZS5ncmVwKHRoaXMuaXRlbXMsZnVuY3Rpb24oZSl7Zm9yKHZhciBpPTA7dC5sZW5ndGg+aTtpKyspaWYodFtpXT09PWUuaXRlbVswXSlyZXR1cm4hMTtyZXR1cm4hMH0pfSxfcmVmcmVzaEl0ZW1zOmZ1bmN0aW9uKHQpe3RoaXMuaXRlbXM9W10sdGhpcy5jb250YWluZXJzPVt0aGlzXTt2YXIgaSxzLG4sYSxvLHIsaCxsLHU9dGhpcy5pdGVtcyxkPVtbZS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5pdGVtcyk/dGhpcy5vcHRpb25zLml0ZW1zLmNhbGwodGhpcy5lbGVtZW50WzBdLHQse2l0ZW06dGhpcy5jdXJyZW50SXRlbX0pOmUodGhpcy5vcHRpb25zLml0ZW1zLHRoaXMuZWxlbWVudCksdGhpc11dLGM9dGhpcy5fY29ubmVjdFdpdGgoKTtpZihjJiZ0aGlzLnJlYWR5KWZvcihpPWMubGVuZ3RoLTE7aT49MDtpLS0pZm9yKG49ZShjW2ldLHRoaXMuZG9jdW1lbnRbMF0pLHM9bi5sZW5ndGgtMTtzPj0wO3MtLSlhPWUuZGF0YShuW3NdLHRoaXMud2lkZ2V0RnVsbE5hbWUpLGEmJmEhPT10aGlzJiYhYS5vcHRpb25zLmRpc2FibGVkJiYoZC5wdXNoKFtlLmlzRnVuY3Rpb24oYS5vcHRpb25zLml0ZW1zKT9hLm9wdGlvbnMuaXRlbXMuY2FsbChhLmVsZW1lbnRbMF0sdCx7aXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6ZShhLm9wdGlvbnMuaXRlbXMsYS5lbGVtZW50KSxhXSksdGhpcy5jb250YWluZXJzLnB1c2goYSkpO2ZvcihpPWQubGVuZ3RoLTE7aT49MDtpLS0pZm9yKG89ZFtpXVsxXSxyPWRbaV1bMF0scz0wLGw9ci5sZW5ndGg7bD5zO3MrKyloPWUocltzXSksaC5kYXRhKHRoaXMud2lkZ2V0TmFtZStcIi1pdGVtXCIsbyksdS5wdXNoKHtpdGVtOmgsaW5zdGFuY2U6byx3aWR0aDowLGhlaWdodDowLGxlZnQ6MCx0b3A6MH0pfSxyZWZyZXNoUG9zaXRpb25zOmZ1bmN0aW9uKHQpe3RoaXMuZmxvYXRpbmc9dGhpcy5pdGVtcy5sZW5ndGg/XCJ4XCI9PT10aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5faXNGbG9hdGluZyh0aGlzLml0ZW1zWzBdLml0ZW0pOiExLHRoaXMub2Zmc2V0UGFyZW50JiZ0aGlzLmhlbHBlciYmKHRoaXMub2Zmc2V0LnBhcmVudD10aGlzLl9nZXRQYXJlbnRPZmZzZXQoKSk7dmFyIGkscyxuLGE7Zm9yKGk9dGhpcy5pdGVtcy5sZW5ndGgtMTtpPj0wO2ktLSlzPXRoaXMuaXRlbXNbaV0scy5pbnN0YW5jZSE9PXRoaXMuY3VycmVudENvbnRhaW5lciYmdGhpcy5jdXJyZW50Q29udGFpbmVyJiZzLml0ZW1bMF0hPT10aGlzLmN1cnJlbnRJdGVtWzBdfHwobj10aGlzLm9wdGlvbnMudG9sZXJhbmNlRWxlbWVudD9lKHRoaXMub3B0aW9ucy50b2xlcmFuY2VFbGVtZW50LHMuaXRlbSk6cy5pdGVtLHR8fChzLndpZHRoPW4ub3V0ZXJXaWR0aCgpLHMuaGVpZ2h0PW4ub3V0ZXJIZWlnaHQoKSksYT1uLm9mZnNldCgpLHMubGVmdD1hLmxlZnQscy50b3A9YS50b3ApO2lmKHRoaXMub3B0aW9ucy5jdXN0b20mJnRoaXMub3B0aW9ucy5jdXN0b20ucmVmcmVzaENvbnRhaW5lcnMpdGhpcy5vcHRpb25zLmN1c3RvbS5yZWZyZXNoQ29udGFpbmVycy5jYWxsKHRoaXMpO2Vsc2UgZm9yKGk9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2k+PTA7aS0tKWE9dGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLmxlZnQ9YS5sZWZ0LHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS50b3A9YS50b3AsdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLndpZHRoPXRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50Lm91dGVyV2lkdGgoKSx0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUuaGVpZ2h0PXRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50Lm91dGVySGVpZ2h0KCk7cmV0dXJuIHRoaXN9LF9jcmVhdGVQbGFjZWhvbGRlcjpmdW5jdGlvbih0KXt0PXR8fHRoaXM7dmFyIGkscz10Lm9wdGlvbnM7cy5wbGFjZWhvbGRlciYmcy5wbGFjZWhvbGRlci5jb25zdHJ1Y3RvciE9PVN0cmluZ3x8KGk9cy5wbGFjZWhvbGRlcixzLnBsYWNlaG9sZGVyPXtlbGVtZW50OmZ1bmN0aW9uKCl7dmFyIHM9dC5jdXJyZW50SXRlbVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG49ZShcIjxcIitzK1wiPlwiLHQuZG9jdW1lbnRbMF0pLmFkZENsYXNzKGl8fHQuY3VycmVudEl0ZW1bMF0uY2xhc3NOYW1lK1wiIHVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyXCIpLnJlbW92ZUNsYXNzKFwidWktc29ydGFibGUtaGVscGVyXCIpO3JldHVyblwidGJvZHlcIj09PXM/dC5fY3JlYXRlVHJQbGFjZWhvbGRlcih0LmN1cnJlbnRJdGVtLmZpbmQoXCJ0clwiKS5lcSgwKSxlKFwiPHRyPlwiLHQuZG9jdW1lbnRbMF0pLmFwcGVuZFRvKG4pKTpcInRyXCI9PT1zP3QuX2NyZWF0ZVRyUGxhY2Vob2xkZXIodC5jdXJyZW50SXRlbSxuKTpcImltZ1wiPT09cyYmbi5hdHRyKFwic3JjXCIsdC5jdXJyZW50SXRlbS5hdHRyKFwic3JjXCIpKSxpfHxuLmNzcyhcInZpc2liaWxpdHlcIixcImhpZGRlblwiKSxufSx1cGRhdGU6ZnVuY3Rpb24oZSxuKXsoIWl8fHMuZm9yY2VQbGFjZWhvbGRlclNpemUpJiYobi5oZWlnaHQoKXx8bi5oZWlnaHQodC5jdXJyZW50SXRlbS5pbm5lckhlaWdodCgpLXBhcnNlSW50KHQuY3VycmVudEl0ZW0uY3NzKFwicGFkZGluZ1RvcFwiKXx8MCwxMCktcGFyc2VJbnQodC5jdXJyZW50SXRlbS5jc3MoXCJwYWRkaW5nQm90dG9tXCIpfHwwLDEwKSksbi53aWR0aCgpfHxuLndpZHRoKHQuY3VycmVudEl0ZW0uaW5uZXJXaWR0aCgpLXBhcnNlSW50KHQuY3VycmVudEl0ZW0uY3NzKFwicGFkZGluZ0xlZnRcIil8fDAsMTApLXBhcnNlSW50KHQuY3VycmVudEl0ZW0uY3NzKFwicGFkZGluZ1JpZ2h0XCIpfHwwLDEwKSkpfX0pLHQucGxhY2Vob2xkZXI9ZShzLnBsYWNlaG9sZGVyLmVsZW1lbnQuY2FsbCh0LmVsZW1lbnQsdC5jdXJyZW50SXRlbSkpLHQuY3VycmVudEl0ZW0uYWZ0ZXIodC5wbGFjZWhvbGRlcikscy5wbGFjZWhvbGRlci51cGRhdGUodCx0LnBsYWNlaG9sZGVyKX0sX2NyZWF0ZVRyUGxhY2Vob2xkZXI6ZnVuY3Rpb24odCxpKXt2YXIgcz10aGlzO3QuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCl7ZShcIjx0ZD4mIzE2MDs8L3RkPlwiLHMuZG9jdW1lbnRbMF0pLmF0dHIoXCJjb2xzcGFuXCIsZSh0aGlzKS5hdHRyKFwiY29sc3BhblwiKXx8MSkuYXBwZW5kVG8oaSl9KX0sX2NvbnRhY3RDb250YWluZXJzOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG8scixoLGwsdSxkLGM9bnVsbCxwPW51bGw7Zm9yKGk9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2k+PTA7aS0tKWlmKCFlLmNvbnRhaW5zKHRoaXMuY3VycmVudEl0ZW1bMF0sdGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnRbMF0pKWlmKHRoaXMuX2ludGVyc2VjdHNXaXRoKHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZSkpe2lmKGMmJmUuY29udGFpbnModGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnRbMF0sYy5lbGVtZW50WzBdKSljb250aW51ZTtjPXRoaXMuY29udGFpbmVyc1tpXSxwPWl9ZWxzZSB0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3ZlciYmKHRoaXMuY29udGFpbmVyc1tpXS5fdHJpZ2dlcihcIm91dFwiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3Zlcj0wKTtpZihjKWlmKDE9PT10aGlzLmNvbnRhaW5lcnMubGVuZ3RoKXRoaXMuY29udGFpbmVyc1twXS5jb250YWluZXJDYWNoZS5vdmVyfHwodGhpcy5jb250YWluZXJzW3BdLl90cmlnZ2VyKFwib3ZlclwiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbcF0uY29udGFpbmVyQ2FjaGUub3Zlcj0xKTtlbHNle2ZvcihuPTFlNCxhPW51bGwsdT1jLmZsb2F0aW5nfHx0aGlzLl9pc0Zsb2F0aW5nKHRoaXMuY3VycmVudEl0ZW0pLG89dT9cImxlZnRcIjpcInRvcFwiLHI9dT9cIndpZHRoXCI6XCJoZWlnaHRcIixkPXU/XCJjbGllbnRYXCI6XCJjbGllbnRZXCIscz10aGlzLml0ZW1zLmxlbmd0aC0xO3M+PTA7cy0tKWUuY29udGFpbnModGhpcy5jb250YWluZXJzW3BdLmVsZW1lbnRbMF0sdGhpcy5pdGVtc1tzXS5pdGVtWzBdKSYmdGhpcy5pdGVtc1tzXS5pdGVtWzBdIT09dGhpcy5jdXJyZW50SXRlbVswXSYmKGg9dGhpcy5pdGVtc1tzXS5pdGVtLm9mZnNldCgpW29dLGw9ITEsdFtkXS1oPnRoaXMuaXRlbXNbc11bcl0vMiYmKGw9ITApLG4+TWF0aC5hYnModFtkXS1oKSYmKG49TWF0aC5hYnModFtkXS1oKSxhPXRoaXMuaXRlbXNbc10sdGhpcy5kaXJlY3Rpb249bD9cInVwXCI6XCJkb3duXCIpKTtpZighYSYmIXRoaXMub3B0aW9ucy5kcm9wT25FbXB0eSlyZXR1cm47aWYodGhpcy5jdXJyZW50Q29udGFpbmVyPT09dGhpcy5jb250YWluZXJzW3BdKXJldHVybiB0aGlzLmN1cnJlbnRDb250YWluZXIuY29udGFpbmVyQ2FjaGUub3Zlcnx8KHRoaXMuY29udGFpbmVyc1twXS5fdHJpZ2dlcihcIm92ZXJcIix0LHRoaXMuX3VpSGFzaCgpKSx0aGlzLmN1cnJlbnRDb250YWluZXIuY29udGFpbmVyQ2FjaGUub3Zlcj0xKSx2b2lkIDA7YT90aGlzLl9yZWFycmFuZ2UodCxhLG51bGwsITApOnRoaXMuX3JlYXJyYW5nZSh0LG51bGwsdGhpcy5jb250YWluZXJzW3BdLmVsZW1lbnQsITApLHRoaXMuX3RyaWdnZXIoXCJjaGFuZ2VcIix0LHRoaXMuX3VpSGFzaCgpKSx0aGlzLmNvbnRhaW5lcnNbcF0uX3RyaWdnZXIoXCJjaGFuZ2VcIix0LHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jdXJyZW50Q29udGFpbmVyPXRoaXMuY29udGFpbmVyc1twXSx0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXIudXBkYXRlKHRoaXMuY3VycmVudENvbnRhaW5lcix0aGlzLnBsYWNlaG9sZGVyKSx0aGlzLmNvbnRhaW5lcnNbcF0uX3RyaWdnZXIoXCJvdmVyXCIsdCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1twXS5jb250YWluZXJDYWNoZS5vdmVyPTF9fSxfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucyxzPWUuaXNGdW5jdGlvbihpLmhlbHBlcik/ZShpLmhlbHBlci5hcHBseSh0aGlzLmVsZW1lbnRbMF0sW3QsdGhpcy5jdXJyZW50SXRlbV0pKTpcImNsb25lXCI9PT1pLmhlbHBlcj90aGlzLmN1cnJlbnRJdGVtLmNsb25lKCk6dGhpcy5jdXJyZW50SXRlbTtyZXR1cm4gcy5wYXJlbnRzKFwiYm9keVwiKS5sZW5ndGh8fGUoXCJwYXJlbnRcIiE9PWkuYXBwZW5kVG8/aS5hcHBlbmRUbzp0aGlzLmN1cnJlbnRJdGVtWzBdLnBhcmVudE5vZGUpWzBdLmFwcGVuZENoaWxkKHNbMF0pLHNbMF09PT10aGlzLmN1cnJlbnRJdGVtWzBdJiYodGhpcy5fc3RvcmVkQ1NTPXt3aWR0aDp0aGlzLmN1cnJlbnRJdGVtWzBdLnN0eWxlLndpZHRoLGhlaWdodDp0aGlzLmN1cnJlbnRJdGVtWzBdLnN0eWxlLmhlaWdodCxwb3NpdGlvbjp0aGlzLmN1cnJlbnRJdGVtLmNzcyhcInBvc2l0aW9uXCIpLHRvcDp0aGlzLmN1cnJlbnRJdGVtLmNzcyhcInRvcFwiKSxsZWZ0OnRoaXMuY3VycmVudEl0ZW0uY3NzKFwibGVmdFwiKX0pLCghc1swXS5zdHlsZS53aWR0aHx8aS5mb3JjZUhlbHBlclNpemUpJiZzLndpZHRoKHRoaXMuY3VycmVudEl0ZW0ud2lkdGgoKSksKCFzWzBdLnN0eWxlLmhlaWdodHx8aS5mb3JjZUhlbHBlclNpemUpJiZzLmhlaWdodCh0aGlzLmN1cnJlbnRJdGVtLmhlaWdodCgpKSxzfSxfYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcjpmdW5jdGlvbih0KXtcInN0cmluZ1wiPT10eXBlb2YgdCYmKHQ9dC5zcGxpdChcIiBcIikpLGUuaXNBcnJheSh0KSYmKHQ9e2xlZnQ6K3RbMF0sdG9wOit0WzFdfHwwfSksXCJsZWZ0XCJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2subGVmdD10LmxlZnQrdGhpcy5tYXJnaW5zLmxlZnQpLFwicmlnaHRcImluIHQmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdC5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksXCJ0b3BcImluIHQmJih0aGlzLm9mZnNldC5jbGljay50b3A9dC50b3ArdGhpcy5tYXJnaW5zLnRvcCksXCJib3R0b21cImluIHQmJih0aGlzLm9mZnNldC5jbGljay50b3A9dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdC5ib3R0b20rdGhpcy5tYXJnaW5zLnRvcCl9LF9nZXRQYXJlbnRPZmZzZXQ6ZnVuY3Rpb24oKXt0aGlzLm9mZnNldFBhcmVudD10aGlzLmhlbHBlci5vZmZzZXRQYXJlbnQoKTt2YXIgdD10aGlzLm9mZnNldFBhcmVudC5vZmZzZXQoKTtyZXR1cm5cImFic29sdXRlXCI9PT10aGlzLmNzc1Bvc2l0aW9uJiZ0aGlzLnNjcm9sbFBhcmVudFswXSE9PXRoaXMuZG9jdW1lbnRbMF0mJmUuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pJiYodC5sZWZ0Kz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCksdC50b3ArPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpKSwodGhpcy5vZmZzZXRQYXJlbnRbMF09PT10aGlzLmRvY3VtZW50WzBdLmJvZHl8fHRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUmJlwiaHRtbFwiPT09dGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpJiZlLnVpLmllKSYmKHQ9e3RvcDowLGxlZnQ6MH0pLHt0b3A6dC50b3ArKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcyhcImJvcmRlclRvcFdpZHRoXCIpLDEwKXx8MCksbGVmdDp0LmxlZnQrKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcyhcImJvcmRlckxlZnRXaWR0aFwiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYoXCJyZWxhdGl2ZVwiPT09dGhpcy5jc3NQb3NpdGlvbil7dmFyIGU9dGhpcy5jdXJyZW50SXRlbS5wb3NpdGlvbigpO3JldHVybnt0b3A6ZS50b3AtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcyhcInRvcFwiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6ZS5sZWZ0LShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoXCJsZWZ0XCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpfX1yZXR1cm57dG9wOjAsbGVmdDowfX0sX2NhY2hlTWFyZ2luczpmdW5jdGlvbigpe3RoaXMubWFyZ2lucz17bGVmdDpwYXJzZUludCh0aGlzLmN1cnJlbnRJdGVtLmNzcyhcIm1hcmdpbkxlZnRcIiksMTApfHwwLHRvcDpwYXJzZUludCh0aGlzLmN1cnJlbnRJdGVtLmNzcyhcIm1hcmdpblRvcFwiKSwxMCl8fDB9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVscGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigpe3ZhciB0LGkscyxuPXRoaXMub3B0aW9ucztcInBhcmVudFwiPT09bi5jb250YWlubWVudCYmKG4uY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSksKFwiZG9jdW1lbnRcIj09PW4uY29udGFpbm1lbnR8fFwid2luZG93XCI9PT1uLmNvbnRhaW5tZW50KSYmKHRoaXMuY29udGFpbm1lbnQ9WzAtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCwwLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLFwiZG9jdW1lbnRcIj09PW4uY29udGFpbm1lbnQ/dGhpcy5kb2N1bWVudC53aWR0aCgpOnRoaXMud2luZG93LndpZHRoKCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCwoXCJkb2N1bWVudFwiPT09bi5jb250YWlubWVudD90aGlzLmRvY3VtZW50LndpZHRoKCk6dGhpcy53aW5kb3cuaGVpZ2h0KCl8fHRoaXMuZG9jdW1lbnRbMF0uYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF0pLC9eKGRvY3VtZW50fHdpbmRvd3xwYXJlbnQpJC8udGVzdChuLmNvbnRhaW5tZW50KXx8KHQ9ZShuLmNvbnRhaW5tZW50KVswXSxpPWUobi5jb250YWlubWVudCkub2Zmc2V0KCkscz1cImhpZGRlblwiIT09ZSh0KS5jc3MoXCJvdmVyZmxvd1wiKSx0aGlzLmNvbnRhaW5tZW50PVtpLmxlZnQrKHBhcnNlSW50KGUodCkuY3NzKFwiYm9yZGVyTGVmdFdpZHRoXCIpLDEwKXx8MCkrKHBhcnNlSW50KGUodCkuY3NzKFwicGFkZGluZ0xlZnRcIiksMTApfHwwKS10aGlzLm1hcmdpbnMubGVmdCxpLnRvcCsocGFyc2VJbnQoZSh0KS5jc3MoXCJib3JkZXJUb3BXaWR0aFwiKSwxMCl8fDApKyhwYXJzZUludChlKHQpLmNzcyhcInBhZGRpbmdUb3BcIiksMTApfHwwKS10aGlzLm1hcmdpbnMudG9wLGkubGVmdCsocz9NYXRoLm1heCh0LnNjcm9sbFdpZHRoLHQub2Zmc2V0V2lkdGgpOnQub2Zmc2V0V2lkdGgpLShwYXJzZUludChlKHQpLmNzcyhcImJvcmRlckxlZnRXaWR0aFwiKSwxMCl8fDApLShwYXJzZUludChlKHQpLmNzcyhcInBhZGRpbmdSaWdodFwiKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdGhpcy5tYXJnaW5zLmxlZnQsaS50b3ArKHM/TWF0aC5tYXgodC5zY3JvbGxIZWlnaHQsdC5vZmZzZXRIZWlnaHQpOnQub2Zmc2V0SGVpZ2h0KS0ocGFyc2VJbnQoZSh0KS5jc3MoXCJib3JkZXJUb3BXaWR0aFwiKSwxMCl8fDApLShwYXJzZUludChlKHQpLmNzcyhcInBhZGRpbmdCb3R0b21cIiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXSl9LF9jb252ZXJ0UG9zaXRpb25UbzpmdW5jdGlvbih0LGkpe2l8fChpPXRoaXMucG9zaXRpb24pO3ZhciBzPVwiYWJzb2x1dGVcIj09PXQ/MTotMSxuPVwiYWJzb2x1dGVcIiE9PXRoaXMuY3NzUG9zaXRpb258fHRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5kb2N1bWVudFswXSYmZS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSk/dGhpcy5zY3JvbGxQYXJlbnQ6dGhpcy5vZmZzZXRQYXJlbnQsYT0vKGh0bWx8Ym9keSkvaS50ZXN0KG5bMF0udGFnTmFtZSk7cmV0dXJue3RvcDppLnRvcCt0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3Aqcyt0aGlzLm9mZnNldC5wYXJlbnQudG9wKnMtKFwiZml4ZWRcIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmE/MDpuLnNjcm9sbFRvcCgpKSpzLGxlZnQ6aS5sZWZ0K3RoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQqcyt0aGlzLm9mZnNldC5wYXJlbnQubGVmdCpzLShcImZpeGVkXCI9PT10aGlzLmNzc1Bvc2l0aW9uPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6YT8wOm4uc2Nyb2xsTGVmdCgpKSpzfX0sX2dlbmVyYXRlUG9zaXRpb246ZnVuY3Rpb24odCl7dmFyIGkscyxuPXRoaXMub3B0aW9ucyxhPXQucGFnZVgsbz10LnBhZ2VZLHI9XCJhYnNvbHV0ZVwiIT09dGhpcy5jc3NQb3NpdGlvbnx8dGhpcy5zY3JvbGxQYXJlbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdJiZlLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKT90aGlzLnNjcm9sbFBhcmVudDp0aGlzLm9mZnNldFBhcmVudCxoPS8oaHRtbHxib2R5KS9pLnRlc3QoclswXS50YWdOYW1lKTtyZXR1cm5cInJlbGF0aXZlXCIhPT10aGlzLmNzc1Bvc2l0aW9ufHx0aGlzLnNjcm9sbFBhcmVudFswXSE9PXRoaXMuZG9jdW1lbnRbMF0mJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5vZmZzZXRQYXJlbnRbMF18fCh0aGlzLm9mZnNldC5yZWxhdGl2ZT10aGlzLl9nZXRSZWxhdGl2ZU9mZnNldCgpKSx0aGlzLm9yaWdpbmFsUG9zaXRpb24mJih0aGlzLmNvbnRhaW5tZW50JiYodC5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF0mJihhPXRoaXMuY29udGFpbm1lbnRbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksdC5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXSYmKG89dGhpcy5jb250YWlubWVudFsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLHQucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD50aGlzLmNvbnRhaW5tZW50WzJdJiYoYT10aGlzLmNvbnRhaW5tZW50WzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLHQucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPnRoaXMuY29udGFpbm1lbnRbM10mJihvPXRoaXMuY29udGFpbm1lbnRbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSksbi5ncmlkJiYoaT10aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoby10aGlzLm9yaWdpbmFsUGFnZVkpL24uZ3JpZFsxXSkqbi5ncmlkWzFdLG89dGhpcy5jb250YWlubWVudD9pLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD49dGhpcy5jb250YWlubWVudFsxXSYmaS10aGlzLm9mZnNldC5jbGljay50b3A8PXRoaXMuY29udGFpbm1lbnRbM10/aTppLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD49dGhpcy5jb250YWlubWVudFsxXT9pLW4uZ3JpZFsxXTppK24uZ3JpZFsxXTppLHM9dGhpcy5vcmlnaW5hbFBhZ2VYK01hdGgucm91bmQoKGEtdGhpcy5vcmlnaW5hbFBhZ2VYKS9uLmdyaWRbMF0pKm4uZ3JpZFswXSxhPXRoaXMuY29udGFpbm1lbnQ/cy10aGlzLm9mZnNldC5jbGljay5sZWZ0Pj10aGlzLmNvbnRhaW5tZW50WzBdJiZzLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8PXRoaXMuY29udGFpbm1lbnRbMl0/czpzLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+PXRoaXMuY29udGFpbm1lbnRbMF0/cy1uLmdyaWRbMF06cytuLmdyaWRbMF06cykpLHt0b3A6by10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKFwiZml4ZWRcIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmg/MDpyLnNjcm9sbFRvcCgpKSxsZWZ0OmEtdGhpcy5vZmZzZXQuY2xpY2subGVmdC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KyhcImZpeGVkXCI9PT10aGlzLmNzc1Bvc2l0aW9uPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6aD8wOnIuc2Nyb2xsTGVmdCgpKX19LF9yZWFycmFuZ2U6ZnVuY3Rpb24oZSx0LGkscyl7aT9pWzBdLmFwcGVuZENoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pOnQuaXRlbVswXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnBsYWNlaG9sZGVyWzBdLFwiZG93blwiPT09dGhpcy5kaXJlY3Rpb24/dC5pdGVtWzBdOnQuaXRlbVswXS5uZXh0U2libGluZyksdGhpcy5jb3VudGVyPXRoaXMuY291bnRlcj8rK3RoaXMuY291bnRlcjoxO3ZhciBuPXRoaXMuY291bnRlcjt0aGlzLl9kZWxheShmdW5jdGlvbigpe249PT10aGlzLmNvdW50ZXImJnRoaXMucmVmcmVzaFBvc2l0aW9ucyghcyl9KX0sX2NsZWFyOmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gaShlLHQsaSl7cmV0dXJuIGZ1bmN0aW9uKHMpe2kuX3RyaWdnZXIoZSxzLHQuX3VpSGFzaCh0KSl9fXRoaXMucmV2ZXJ0aW5nPSExO3ZhciBzLG49W107aWYoIXRoaXMuX25vRmluYWxTb3J0JiZ0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpLmxlbmd0aCYmdGhpcy5wbGFjZWhvbGRlci5iZWZvcmUodGhpcy5jdXJyZW50SXRlbSksdGhpcy5fbm9GaW5hbFNvcnQ9bnVsbCx0aGlzLmhlbHBlclswXT09PXRoaXMuY3VycmVudEl0ZW1bMF0pe2ZvcihzIGluIHRoaXMuX3N0b3JlZENTUykoXCJhdXRvXCI9PT10aGlzLl9zdG9yZWRDU1Nbc118fFwic3RhdGljXCI9PT10aGlzLl9zdG9yZWRDU1Nbc10pJiYodGhpcy5fc3RvcmVkQ1NTW3NdPVwiXCIpO3RoaXMuY3VycmVudEl0ZW0uY3NzKHRoaXMuX3N0b3JlZENTUykucmVtb3ZlQ2xhc3MoXCJ1aS1zb3J0YWJsZS1oZWxwZXJcIil9ZWxzZSB0aGlzLmN1cnJlbnRJdGVtLnNob3coKTtmb3IodGhpcy5mcm9tT3V0c2lkZSYmIXQmJm4ucHVzaChmdW5jdGlvbihlKXt0aGlzLl90cmlnZ2VyKFwicmVjZWl2ZVwiLGUsdGhpcy5fdWlIYXNoKHRoaXMuZnJvbU91dHNpZGUpKX0pLCF0aGlzLmZyb21PdXRzaWRlJiZ0aGlzLmRvbVBvc2l0aW9uLnByZXY9PT10aGlzLmN1cnJlbnRJdGVtLnByZXYoKS5ub3QoXCIudWktc29ydGFibGUtaGVscGVyXCIpWzBdJiZ0aGlzLmRvbVBvc2l0aW9uLnBhcmVudD09PXRoaXMuY3VycmVudEl0ZW0ucGFyZW50KClbMF18fHR8fG4ucHVzaChmdW5jdGlvbihlKXt0aGlzLl90cmlnZ2VyKFwidXBkYXRlXCIsZSx0aGlzLl91aUhhc2goKSl9KSx0aGlzIT09dGhpcy5jdXJyZW50Q29udGFpbmVyJiYodHx8KG4ucHVzaChmdW5jdGlvbihlKXt0aGlzLl90cmlnZ2VyKFwicmVtb3ZlXCIsZSx0aGlzLl91aUhhc2goKSl9KSxuLnB1c2goZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2UuX3RyaWdnZXIoXCJyZWNlaXZlXCIsdCx0aGlzLl91aUhhc2godGhpcykpfX0uY2FsbCh0aGlzLHRoaXMuY3VycmVudENvbnRhaW5lcikpLG4ucHVzaChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7ZS5fdHJpZ2dlcihcInVwZGF0ZVwiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmN1cnJlbnRDb250YWluZXIpKSkpLHM9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO3M+PTA7cy0tKXR8fG4ucHVzaChpKFwiZGVhY3RpdmF0ZVwiLHRoaXMsdGhpcy5jb250YWluZXJzW3NdKSksdGhpcy5jb250YWluZXJzW3NdLmNvbnRhaW5lckNhY2hlLm92ZXImJihuLnB1c2goaShcIm91dFwiLHRoaXMsdGhpcy5jb250YWluZXJzW3NdKSksdGhpcy5jb250YWluZXJzW3NdLmNvbnRhaW5lckNhY2hlLm92ZXI9MCk7aWYodGhpcy5zdG9yZWRDdXJzb3ImJih0aGlzLmRvY3VtZW50LmZpbmQoXCJib2R5XCIpLmNzcyhcImN1cnNvclwiLHRoaXMuc3RvcmVkQ3Vyc29yKSx0aGlzLnN0b3JlZFN0eWxlc2hlZXQucmVtb3ZlKCkpLHRoaXMuX3N0b3JlZE9wYWNpdHkmJnRoaXMuaGVscGVyLmNzcyhcIm9wYWNpdHlcIix0aGlzLl9zdG9yZWRPcGFjaXR5KSx0aGlzLl9zdG9yZWRaSW5kZXgmJnRoaXMuaGVscGVyLmNzcyhcInpJbmRleFwiLFwiYXV0b1wiPT09dGhpcy5fc3RvcmVkWkluZGV4P1wiXCI6dGhpcy5fc3RvcmVkWkluZGV4KSx0aGlzLmRyYWdnaW5nPSExLHR8fHRoaXMuX3RyaWdnZXIoXCJiZWZvcmVTdG9wXCIsZSx0aGlzLl91aUhhc2goKSksdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pLHRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbHx8KHRoaXMuaGVscGVyWzBdIT09dGhpcy5jdXJyZW50SXRlbVswXSYmdGhpcy5oZWxwZXIucmVtb3ZlKCksdGhpcy5oZWxwZXI9bnVsbCksIXQpe2ZvcihzPTA7bi5sZW5ndGg+cztzKyspbltzXS5jYWxsKHRoaXMsZSk7dGhpcy5fdHJpZ2dlcihcInN0b3BcIixlLHRoaXMuX3VpSGFzaCgpKX1yZXR1cm4gdGhpcy5mcm9tT3V0c2lkZT0hMSwhdGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsfSxfdHJpZ2dlcjpmdW5jdGlvbigpe2UuV2lkZ2V0LnByb3RvdHlwZS5fdHJpZ2dlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk9PT0hMSYmdGhpcy5jYW5jZWwoKX0sX3VpSGFzaDpmdW5jdGlvbih0KXt2YXIgaT10fHx0aGlzO3JldHVybntoZWxwZXI6aS5oZWxwZXIscGxhY2Vob2xkZXI6aS5wbGFjZWhvbGRlcnx8ZShbXSkscG9zaXRpb246aS5wb3NpdGlvbixvcmlnaW5hbFBvc2l0aW9uOmkub3JpZ2luYWxQb3NpdGlvbixvZmZzZXQ6aS5wb3NpdGlvbkFicyxpdGVtOmkuY3VycmVudEl0ZW0sc2VuZGVyOnQ/dC5lbGVtZW50Om51bGx9fX0pLGUud2lkZ2V0KFwidWkuc3Bpbm5lclwiLHt2ZXJzaW9uOlwiMS4xMS40XCIsZGVmYXVsdEVsZW1lbnQ6XCI8aW5wdXQ+XCIsd2lkZ2V0RXZlbnRQcmVmaXg6XCJzcGluXCIsb3B0aW9uczp7Y3VsdHVyZTpudWxsLGljb25zOntkb3duOlwidWktaWNvbi10cmlhbmdsZS0xLXNcIix1cDpcInVpLWljb24tdHJpYW5nbGUtMS1uXCJ9LGluY3JlbWVudGFsOiEwLG1heDpudWxsLG1pbjpudWxsLG51bWJlckZvcm1hdDpudWxsLHBhZ2U6MTAsc3RlcDoxLGNoYW5nZTpudWxsLHNwaW46bnVsbCxzdGFydDpudWxsLHN0b3A6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX3NldE9wdGlvbihcIm1heFwiLHRoaXMub3B0aW9ucy5tYXgpLHRoaXMuX3NldE9wdGlvbihcIm1pblwiLHRoaXMub3B0aW9ucy5taW4pLHRoaXMuX3NldE9wdGlvbihcInN0ZXBcIix0aGlzLm9wdGlvbnMuc3RlcCksXCJcIiE9PXRoaXMudmFsdWUoKSYmdGhpcy5fdmFsdWUodGhpcy5lbGVtZW50LnZhbCgpLCEwKSx0aGlzLl9kcmF3KCksdGhpcy5fb24odGhpcy5fZXZlbnRzKSx0aGlzLl9yZWZyZXNoKCksdGhpcy5fb24odGhpcy53aW5kb3cse2JlZm9yZXVubG9hZDpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVBdHRyKFwiYXV0b2NvbXBsZXRlXCIpfX0pfSxfZ2V0Q3JlYXRlT3B0aW9uczpmdW5jdGlvbigpe3ZhciB0PXt9LGk9dGhpcy5lbGVtZW50O3JldHVybiBlLmVhY2goW1wibWluXCIsXCJtYXhcIixcInN0ZXBcIl0sZnVuY3Rpb24oZSxzKXt2YXIgbj1pLmF0dHIocyk7dm9pZCAwIT09biYmbi5sZW5ndGgmJih0W3NdPW4pfSksdH0sX2V2ZW50czp7a2V5ZG93bjpmdW5jdGlvbihlKXt0aGlzLl9zdGFydChlKSYmdGhpcy5fa2V5ZG93bihlKSYmZS5wcmV2ZW50RGVmYXVsdCgpfSxrZXl1cDpcIl9zdG9wXCIsZm9jdXM6ZnVuY3Rpb24oKXt0aGlzLnByZXZpb3VzPXRoaXMuZWxlbWVudC52YWwoKX0sYmx1cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jYW5jZWxCbHVyPyhkZWxldGUgdGhpcy5jYW5jZWxCbHVyLHZvaWQgMCk6KHRoaXMuX3N0b3AoKSx0aGlzLl9yZWZyZXNoKCksdGhpcy5wcmV2aW91cyE9PXRoaXMuZWxlbWVudC52YWwoKSYmdGhpcy5fdHJpZ2dlcihcImNoYW5nZVwiLGUpLHZvaWQgMCl9LG1vdXNld2hlZWw6ZnVuY3Rpb24oZSx0KXtpZih0KXtpZighdGhpcy5zcGlubmluZyYmIXRoaXMuX3N0YXJ0KGUpKXJldHVybiExO3RoaXMuX3NwaW4oKHQ+MD8xOi0xKSp0aGlzLm9wdGlvbnMuc3RlcCxlKSxjbGVhclRpbWVvdXQodGhpcy5tb3VzZXdoZWVsVGltZXIpLHRoaXMubW91c2V3aGVlbFRpbWVyPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5zcGlubmluZyYmdGhpcy5fc3RvcChlKX0sMTAwKSxlLnByZXZlbnREZWZhdWx0KCl9fSxcIm1vdXNlZG93biAudWktc3Bpbm5lci1idXR0b25cIjpmdW5jdGlvbih0KXtmdW5jdGlvbiBpKCl7dmFyIGU9dGhpcy5lbGVtZW50WzBdPT09dGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50O2V8fCh0aGlzLmVsZW1lbnQuZm9jdXMoKSx0aGlzLnByZXZpb3VzPXMsdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLnByZXZpb3VzPXN9KSl9dmFyIHM7cz10aGlzLmVsZW1lbnRbMF09PT10aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQ/dGhpcy5wcmV2aW91czp0aGlzLmVsZW1lbnQudmFsKCksdC5wcmV2ZW50RGVmYXVsdCgpLGkuY2FsbCh0aGlzKSx0aGlzLmNhbmNlbEJsdXI9ITAsdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5jYW5jZWxCbHVyLGkuY2FsbCh0aGlzKX0pLHRoaXMuX3N0YXJ0KHQpIT09ITEmJnRoaXMuX3JlcGVhdChudWxsLGUodC5jdXJyZW50VGFyZ2V0KS5oYXNDbGFzcyhcInVpLXNwaW5uZXItdXBcIik/MTotMSx0KX0sXCJtb3VzZXVwIC51aS1zcGlubmVyLWJ1dHRvblwiOlwiX3N0b3BcIixcIm1vdXNlZW50ZXIgLnVpLXNwaW5uZXItYnV0dG9uXCI6ZnVuY3Rpb24odCl7cmV0dXJuIGUodC5jdXJyZW50VGFyZ2V0KS5oYXNDbGFzcyhcInVpLXN0YXRlLWFjdGl2ZVwiKT90aGlzLl9zdGFydCh0KT09PSExPyExOih0aGlzLl9yZXBlYXQobnVsbCxlKHQuY3VycmVudFRhcmdldCkuaGFzQ2xhc3MoXCJ1aS1zcGlubmVyLXVwXCIpPzE6LTEsdCksdm9pZCAwKTp2b2lkIDB9LFwibW91c2VsZWF2ZSAudWktc3Bpbm5lci1idXR0b25cIjpcIl9zdG9wXCJ9LF9kcmF3OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy51aVNwaW5uZXI9dGhpcy5lbGVtZW50LmFkZENsYXNzKFwidWktc3Bpbm5lci1pbnB1dFwiKS5hdHRyKFwiYXV0b2NvbXBsZXRlXCIsXCJvZmZcIikud3JhcCh0aGlzLl91aVNwaW5uZXJIdG1sKCkpLnBhcmVudCgpLmFwcGVuZCh0aGlzLl9idXR0b25IdG1sKCkpO3RoaXMuZWxlbWVudC5hdHRyKFwicm9sZVwiLFwic3BpbmJ1dHRvblwiKSx0aGlzLmJ1dHRvbnM9ZS5maW5kKFwiLnVpLXNwaW5uZXItYnV0dG9uXCIpLmF0dHIoXCJ0YWJJbmRleFwiLC0xKS5idXR0b24oKS5yZW1vdmVDbGFzcyhcInVpLWNvcm5lci1hbGxcIiksdGhpcy5idXR0b25zLmhlaWdodCgpPk1hdGguY2VpbCguNSplLmhlaWdodCgpKSYmZS5oZWlnaHQoKT4wJiZlLmhlaWdodChlLmhlaWdodCgpKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuZGlzYWJsZSgpfSxfa2V5ZG93bjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnMscz1lLnVpLmtleUNvZGU7c3dpdGNoKHQua2V5Q29kZSl7Y2FzZSBzLlVQOnJldHVybiB0aGlzLl9yZXBlYXQobnVsbCwxLHQpLCEwO2Nhc2Ugcy5ET1dOOnJldHVybiB0aGlzLl9yZXBlYXQobnVsbCwtMSx0KSwhMDtjYXNlIHMuUEFHRV9VUDpyZXR1cm4gdGhpcy5fcmVwZWF0KG51bGwsaS5wYWdlLHQpLCEwO2Nhc2Ugcy5QQUdFX0RPV046cmV0dXJuIHRoaXMuX3JlcGVhdChudWxsLC1pLnBhZ2UsdCksITB9cmV0dXJuITF9LF91aVNwaW5uZXJIdG1sOmZ1bmN0aW9uKCl7cmV0dXJuXCI8c3BhbiBjbGFzcz0ndWktc3Bpbm5lciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCc+PC9zcGFuPlwifSxfYnV0dG9uSHRtbDpmdW5jdGlvbigpe3JldHVyblwiPGEgY2xhc3M9J3VpLXNwaW5uZXItYnV0dG9uIHVpLXNwaW5uZXItdXAgdWktY29ybmVyLXRyJz48c3BhbiBjbGFzcz0ndWktaWNvbiBcIit0aGlzLm9wdGlvbnMuaWNvbnMudXArXCInPiYjOTY1MDs8L3NwYW4+XCIrXCI8L2E+XCIrXCI8YSBjbGFzcz0ndWktc3Bpbm5lci1idXR0b24gdWktc3Bpbm5lci1kb3duIHVpLWNvcm5lci1icic+XCIrXCI8c3BhbiBjbGFzcz0ndWktaWNvbiBcIit0aGlzLm9wdGlvbnMuaWNvbnMuZG93bitcIic+JiM5NjYwOzwvc3Bhbj5cIitcIjwvYT5cIn0sX3N0YXJ0OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnNwaW5uaW5nfHx0aGlzLl90cmlnZ2VyKFwic3RhcnRcIixlKSE9PSExPyh0aGlzLmNvdW50ZXJ8fCh0aGlzLmNvdW50ZXI9MSksdGhpcy5zcGlubmluZz0hMCwhMCk6ITF9LF9yZXBlYXQ6ZnVuY3Rpb24oZSx0LGkpe2U9ZXx8NTAwLGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5fcmVwZWF0KDQwLHQsaSl9LGUpLHRoaXMuX3NwaW4odCp0aGlzLm9wdGlvbnMuc3RlcCxpKX0sX3NwaW46ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLnZhbHVlKCl8fDA7dGhpcy5jb3VudGVyfHwodGhpcy5jb3VudGVyPTEpLGk9dGhpcy5fYWRqdXN0VmFsdWUoaStlKnRoaXMuX2luY3JlbWVudCh0aGlzLmNvdW50ZXIpKSx0aGlzLnNwaW5uaW5nJiZ0aGlzLl90cmlnZ2VyKFwic3BpblwiLHQse3ZhbHVlOml9KT09PSExfHwodGhpcy5fdmFsdWUoaSksdGhpcy5jb3VudGVyKyspfSxfaW5jcmVtZW50OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucy5pbmNyZW1lbnRhbDtyZXR1cm4gaT9lLmlzRnVuY3Rpb24oaSk/aSh0KTpNYXRoLmZsb29yKHQqdCp0LzVlNC10KnQvNTAwKzE3KnQvMjAwKzEpOjF9LF9wcmVjaXNpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9wcmVjaXNpb25PZih0aGlzLm9wdGlvbnMuc3RlcCk7cmV0dXJuIG51bGwhPT10aGlzLm9wdGlvbnMubWluJiYoZT1NYXRoLm1heChlLHRoaXMuX3ByZWNpc2lvbk9mKHRoaXMub3B0aW9ucy5taW4pKSksZX0sX3ByZWNpc2lvbk9mOmZ1bmN0aW9uKGUpe3ZhciB0PVwiXCIrZSxpPXQuaW5kZXhPZihcIi5cIik7cmV0dXJuLTE9PT1pPzA6dC5sZW5ndGgtaS0xfSxfYWRqdXN0VmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQsaSxzPXRoaXMub3B0aW9ucztyZXR1cm4gdD1udWxsIT09cy5taW4/cy5taW46MCxpPWUtdCxpPU1hdGgucm91bmQoaS9zLnN0ZXApKnMuc3RlcCxlPXQraSxlPXBhcnNlRmxvYXQoZS50b0ZpeGVkKHRoaXMuX3ByZWNpc2lvbigpKSksbnVsbCE9PXMubWF4JiZlPnMubWF4P3MubWF4Om51bGwhPT1zLm1pbiYmcy5taW4+ZT9zLm1pbjplfSxfc3RvcDpmdW5jdGlvbihlKXt0aGlzLnNwaW5uaW5nJiYoY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLGNsZWFyVGltZW91dCh0aGlzLm1vdXNld2hlZWxUaW1lciksdGhpcy5jb3VudGVyPTAsdGhpcy5zcGlubmluZz0hMSx0aGlzLl90cmlnZ2VyKFwic3RvcFwiLGUpKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe2lmKFwiY3VsdHVyZVwiPT09ZXx8XCJudW1iZXJGb3JtYXRcIj09PWUpe3ZhciBpPXRoaXMuX3BhcnNlKHRoaXMuZWxlbWVudC52YWwoKSk7cmV0dXJuIHRoaXMub3B0aW9uc1tlXT10LHRoaXMuZWxlbWVudC52YWwodGhpcy5fZm9ybWF0KGkpKSx2b2lkIDB9KFwibWF4XCI9PT1lfHxcIm1pblwiPT09ZXx8XCJzdGVwXCI9PT1lKSYmXCJzdHJpbmdcIj09dHlwZW9mIHQmJih0PXRoaXMuX3BhcnNlKHQpKSxcImljb25zXCI9PT1lJiYodGhpcy5idXR0b25zLmZpcnN0KCkuZmluZChcIi51aS1pY29uXCIpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5pY29ucy51cCkuYWRkQ2xhc3ModC51cCksdGhpcy5idXR0b25zLmxhc3QoKS5maW5kKFwiLnVpLWljb25cIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLmRvd24pLmFkZENsYXNzKHQuZG93bikpLHRoaXMuX3N1cGVyKGUsdCksXCJkaXNhYmxlZFwiPT09ZSYmKHRoaXMud2lkZ2V0KCkudG9nZ2xlQ2xhc3MoXCJ1aS1zdGF0ZS1kaXNhYmxlZFwiLCEhdCksdGhpcy5lbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiLCEhdCksdGhpcy5idXR0b25zLmJ1dHRvbih0P1wiZGlzYWJsZVwiOlwiZW5hYmxlXCIpKX0sX3NldE9wdGlvbnM6aChmdW5jdGlvbihlKXt0aGlzLl9zdXBlcihlKX0pLF9wYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZSYmXCJcIiE9PWUmJihlPXdpbmRvdy5HbG9iYWxpemUmJnRoaXMub3B0aW9ucy5udW1iZXJGb3JtYXQ/R2xvYmFsaXplLnBhcnNlRmxvYXQoZSwxMCx0aGlzLm9wdGlvbnMuY3VsdHVyZSk6K2UpLFwiXCI9PT1lfHxpc05hTihlKT9udWxsOmV9LF9mb3JtYXQ6ZnVuY3Rpb24oZSl7cmV0dXJuXCJcIj09PWU/XCJcIjp3aW5kb3cuR2xvYmFsaXplJiZ0aGlzLm9wdGlvbnMubnVtYmVyRm9ybWF0P0dsb2JhbGl6ZS5mb3JtYXQoZSx0aGlzLm9wdGlvbnMubnVtYmVyRm9ybWF0LHRoaXMub3B0aW9ucy5jdWx0dXJlKTplfSxfcmVmcmVzaDpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5hdHRyKHtcImFyaWEtdmFsdWVtaW5cIjp0aGlzLm9wdGlvbnMubWluLFwiYXJpYS12YWx1ZW1heFwiOnRoaXMub3B0aW9ucy5tYXgsXCJhcmlhLXZhbHVlbm93XCI6dGhpcy5fcGFyc2UodGhpcy5lbGVtZW50LnZhbCgpKX0pfSxpc1ZhbGlkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy52YWx1ZSgpO3JldHVybiBudWxsPT09ZT8hMTplPT09dGhpcy5fYWRqdXN0VmFsdWUoZSl9LF92YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBpO1wiXCIhPT1lJiYoaT10aGlzLl9wYXJzZShlKSxudWxsIT09aSYmKHR8fChpPXRoaXMuX2FkanVzdFZhbHVlKGkpKSxlPXRoaXMuX2Zvcm1hdChpKSkpLHRoaXMuZWxlbWVudC52YWwoZSksdGhpcy5fcmVmcmVzaCgpfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhcInVpLXNwaW5uZXItaW5wdXRcIikucHJvcChcImRpc2FibGVkXCIsITEpLnJlbW92ZUF0dHIoXCJhdXRvY29tcGxldGVcIikucmVtb3ZlQXR0cihcInJvbGVcIikucmVtb3ZlQXR0cihcImFyaWEtdmFsdWVtaW5cIikucmVtb3ZlQXR0cihcImFyaWEtdmFsdWVtYXhcIikucmVtb3ZlQXR0cihcImFyaWEtdmFsdWVub3dcIiksdGhpcy51aVNwaW5uZXIucmVwbGFjZVdpdGgodGhpcy5lbGVtZW50KX0sc3RlcFVwOmgoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcFVwKGUpfSksX3N0ZXBVcDpmdW5jdGlvbihlKXt0aGlzLl9zdGFydCgpJiYodGhpcy5fc3BpbigoZXx8MSkqdGhpcy5vcHRpb25zLnN0ZXApLHRoaXMuX3N0b3AoKSl9LHN0ZXBEb3duOmgoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcERvd24oZSl9KSxfc3RlcERvd246ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnQoKSYmKHRoaXMuX3NwaW4oKGV8fDEpKi10aGlzLm9wdGlvbnMuc3RlcCksdGhpcy5fc3RvcCgpKX0scGFnZVVwOmgoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcFVwKChlfHwxKSp0aGlzLm9wdGlvbnMucGFnZSl9KSxwYWdlRG93bjpoKGZ1bmN0aW9uKGUpe3RoaXMuX3N0ZXBEb3duKChlfHwxKSp0aGlzLm9wdGlvbnMucGFnZSl9KSx2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaCh0aGlzLl92YWx1ZSkuY2FsbCh0aGlzLGUpLHZvaWQgMCk6dGhpcy5fcGFyc2UodGhpcy5lbGVtZW50LnZhbCgpKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWlTcGlubmVyfX0pLGUud2lkZ2V0KFwidWkudGFic1wiLHt2ZXJzaW9uOlwiMS4xMS40XCIsZGVsYXk6MzAwLG9wdGlvbnM6e2FjdGl2ZTpudWxsLGNvbGxhcHNpYmxlOiExLGV2ZW50OlwiY2xpY2tcIixoZWlnaHRTdHlsZTpcImNvbnRlbnRcIixoaWRlOm51bGwsc2hvdzpudWxsLGFjdGl2YXRlOm51bGwsYmVmb3JlQWN0aXZhdGU6bnVsbCxiZWZvcmVMb2FkOm51bGwsbG9hZDpudWxsfSxfaXNMb2NhbDpmdW5jdGlvbigpe3ZhciBlPS8jLiokLztyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGksczt0PXQuY2xvbmVOb2RlKCExKSxpPXQuaHJlZi5yZXBsYWNlKGUsXCJcIikscz1sb2NhdGlvbi5ocmVmLnJlcGxhY2UoZSxcIlwiKTt0cnl7aT1kZWNvZGVVUklDb21wb25lbnQoaSl9Y2F0Y2gobil7fXRyeXtzPWRlY29kZVVSSUNvbXBvbmVudChzKX1jYXRjaChuKXt9cmV0dXJuIHQuaGFzaC5sZW5ndGg+MSYmaT09PXN9fSgpLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGk9dGhpcy5vcHRpb25zO3RoaXMucnVubmluZz0hMSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoXCJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsXCIpLnRvZ2dsZUNsYXNzKFwidWktdGFicy1jb2xsYXBzaWJsZVwiLGkuY29sbGFwc2libGUpLHRoaXMuX3Byb2Nlc3NUYWJzKCksaS5hY3RpdmU9dGhpcy5faW5pdGlhbEFjdGl2ZSgpLGUuaXNBcnJheShpLmRpc2FibGVkKSYmKGkuZGlzYWJsZWQ9ZS51bmlxdWUoaS5kaXNhYmxlZC5jb25jYXQoZS5tYXAodGhpcy50YWJzLmZpbHRlcihcIi51aS1zdGF0ZS1kaXNhYmxlZFwiKSxmdW5jdGlvbihlKXtyZXR1cm4gdC50YWJzLmluZGV4KGUpfSkpKS5zb3J0KCkpLHRoaXMuYWN0aXZlPXRoaXMub3B0aW9ucy5hY3RpdmUhPT0hMSYmdGhpcy5hbmNob3JzLmxlbmd0aD90aGlzLl9maW5kQWN0aXZlKGkuYWN0aXZlKTplKCksdGhpcy5fcmVmcmVzaCgpLHRoaXMuYWN0aXZlLmxlbmd0aCYmdGhpcy5sb2FkKGkuYWN0aXZlKX0sX2luaXRpYWxBY3RpdmU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuYWN0aXZlLGk9dGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlLHM9bG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSk7cmV0dXJuIG51bGw9PT10JiYocyYmdGhpcy50YWJzLmVhY2goZnVuY3Rpb24oaSxuKXtyZXR1cm4gZShuKS5hdHRyKFwiYXJpYS1jb250cm9sc1wiKT09PXM/KHQ9aSwhMSk6dm9pZCAwfSksbnVsbD09PXQmJih0PXRoaXMudGFicy5pbmRleCh0aGlzLnRhYnMuZmlsdGVyKFwiLnVpLXRhYnMtYWN0aXZlXCIpKSksKG51bGw9PT10fHwtMT09PXQpJiYodD10aGlzLnRhYnMubGVuZ3RoPzA6ITEpKSx0IT09ITEmJih0PXRoaXMudGFicy5pbmRleCh0aGlzLnRhYnMuZXEodCkpLC0xPT09dCYmKHQ9aT8hMTowKSksIWkmJnQ9PT0hMSYmdGhpcy5hbmNob3JzLmxlbmd0aCYmKHQ9MCksdH0sX2dldENyZWF0ZUV2ZW50RGF0YTpmdW5jdGlvbigpe3JldHVybnt0YWI6dGhpcy5hY3RpdmUscGFuZWw6dGhpcy5hY3RpdmUubGVuZ3RoP3RoaXMuX2dldFBhbmVsRm9yVGFiKHRoaXMuYWN0aXZlKTplKCl9fSxfdGFiS2V5ZG93bjpmdW5jdGlvbih0KXt2YXIgaT1lKHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCkuY2xvc2VzdChcImxpXCIpLHM9dGhpcy50YWJzLmluZGV4KGkpLG49ITA7aWYoIXRoaXMuX2hhbmRsZVBhZ2VOYXYodCkpe3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLlJJR0hUOmNhc2UgZS51aS5rZXlDb2RlLkRPV046cysrO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlVQOmNhc2UgZS51aS5rZXlDb2RlLkxFRlQ6bj0hMSxzLS07YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5EOnM9dGhpcy5hbmNob3JzLmxlbmd0aC0xO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6cz0wO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlNQQUNFOnJldHVybiB0LnByZXZlbnREZWZhdWx0KCksY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGluZyksdGhpcy5fYWN0aXZhdGUocyksdm9pZCAwO2Nhc2UgZS51aS5rZXlDb2RlLkVOVEVSOnJldHVybiB0LnByZXZlbnREZWZhdWx0KCksY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGluZyksdGhpcy5fYWN0aXZhdGUocz09PXRoaXMub3B0aW9ucy5hY3RpdmU/ITE6cyksdm9pZCAwO2RlZmF1bHQ6cmV0dXJufXQucHJldmVudERlZmF1bHQoKSxjbGVhclRpbWVvdXQodGhpcy5hY3RpdmF0aW5nKSxzPXRoaXMuX2ZvY3VzTmV4dFRhYihzLG4pLHQuY3RybEtleXx8dC5tZXRhS2V5fHwoaS5hdHRyKFwiYXJpYS1zZWxlY3RlZFwiLFwiZmFsc2VcIiksdGhpcy50YWJzLmVxKHMpLmF0dHIoXCJhcmlhLXNlbGVjdGVkXCIsXCJ0cnVlXCIpLHRoaXMuYWN0aXZhdGluZz10aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMub3B0aW9uKFwiYWN0aXZlXCIscyl9LHRoaXMuZGVsYXkpKX19LF9wYW5lbEtleWRvd246ZnVuY3Rpb24odCl7dGhpcy5faGFuZGxlUGFnZU5hdih0KXx8dC5jdHJsS2V5JiZ0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuVVAmJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5hY3RpdmUuZm9jdXMoKSl9LF9oYW5kbGVQYWdlTmF2OmZ1bmN0aW9uKHQpe3JldHVybiB0LmFsdEtleSYmdC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLlBBR0VfVVA/KHRoaXMuX2FjdGl2YXRlKHRoaXMuX2ZvY3VzTmV4dFRhYih0aGlzLm9wdGlvbnMuYWN0aXZlLTEsITEpKSwhMCk6dC5hbHRLZXkmJnQua2V5Q29kZT09PWUudWkua2V5Q29kZS5QQUdFX0RPV04/KHRoaXMuX2FjdGl2YXRlKHRoaXMuX2ZvY3VzTmV4dFRhYih0aGlzLm9wdGlvbnMuYWN0aXZlKzEsITApKSwhMCk6dm9pZCAwfSxfZmluZE5leHRUYWI6ZnVuY3Rpb24odCxpKXtmdW5jdGlvbiBzKCl7cmV0dXJuIHQ+biYmKHQ9MCksMD50JiYodD1uKSx0fWZvcih2YXIgbj10aGlzLnRhYnMubGVuZ3RoLTE7LTEhPT1lLmluQXJyYXkocygpLHRoaXMub3B0aW9ucy5kaXNhYmxlZCk7KXQ9aT90KzE6dC0xO3JldHVybiB0fSxfZm9jdXNOZXh0VGFiOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9dGhpcy5fZmluZE5leHRUYWIoZSx0KSx0aGlzLnRhYnMuZXEoZSkuZm9jdXMoKSxlfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuXCJhY3RpdmVcIj09PWU/KHRoaXMuX2FjdGl2YXRlKHQpLHZvaWQgMCk6XCJkaXNhYmxlZFwiPT09ZT8odGhpcy5fc2V0dXBEaXNhYmxlZCh0KSx2b2lkIDApOih0aGlzLl9zdXBlcihlLHQpLFwiY29sbGFwc2libGVcIj09PWUmJih0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoXCJ1aS10YWJzLWNvbGxhcHNpYmxlXCIsdCksdHx8dGhpcy5vcHRpb25zLmFjdGl2ZSE9PSExfHx0aGlzLl9hY3RpdmF0ZSgwKSksXCJldmVudFwiPT09ZSYmdGhpcy5fc2V0dXBFdmVudHModCksXCJoZWlnaHRTdHlsZVwiPT09ZSYmdGhpcy5fc2V0dXBIZWlnaHRTdHlsZSh0KSx2b2lkIDApfSxfc2FuaXRpemVTZWxlY3RvcjpmdW5jdGlvbihlKXtyZXR1cm4gZT9lLnJlcGxhY2UoL1shXCIkJSYnKCkqKywuXFwvOjs8PT4/QFxcW1xcXVxcXmB7fH1+XS9nLFwiXFxcXCQmXCIpOlwiXCJ9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMsaT10aGlzLnRhYmxpc3QuY2hpbGRyZW4oXCI6aGFzKGFbaHJlZl0pXCIpO3QuZGlzYWJsZWQ9ZS5tYXAoaS5maWx0ZXIoXCIudWktc3RhdGUtZGlzYWJsZWRcIiksZnVuY3Rpb24oZSl7cmV0dXJuIGkuaW5kZXgoZSl9KSx0aGlzLl9wcm9jZXNzVGFicygpLHQuYWN0aXZlIT09ITEmJnRoaXMuYW5jaG9ycy5sZW5ndGg/dGhpcy5hY3RpdmUubGVuZ3RoJiYhZS5jb250YWlucyh0aGlzLnRhYmxpc3RbMF0sdGhpcy5hY3RpdmVbMF0pP3RoaXMudGFicy5sZW5ndGg9PT10LmRpc2FibGVkLmxlbmd0aD8odC5hY3RpdmU9ITEsdGhpcy5hY3RpdmU9ZSgpKTp0aGlzLl9hY3RpdmF0ZSh0aGlzLl9maW5kTmV4dFRhYihNYXRoLm1heCgwLHQuYWN0aXZlLTEpLCExKSk6dC5hY3RpdmU9dGhpcy50YWJzLmluZGV4KHRoaXMuYWN0aXZlKToodC5hY3RpdmU9ITEsdGhpcy5hY3RpdmU9ZSgpKSx0aGlzLl9yZWZyZXNoKCl9LF9yZWZyZXNoOmZ1bmN0aW9uKCl7dGhpcy5fc2V0dXBEaXNhYmxlZCh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpLHRoaXMuX3NldHVwRXZlbnRzKHRoaXMub3B0aW9ucy5ldmVudCksdGhpcy5fc2V0dXBIZWlnaHRTdHlsZSh0aGlzLm9wdGlvbnMuaGVpZ2h0U3R5bGUpLHRoaXMudGFicy5ub3QodGhpcy5hY3RpdmUpLmF0dHIoe1wiYXJpYS1zZWxlY3RlZFwiOlwiZmFsc2VcIixcImFyaWEtZXhwYW5kZWRcIjpcImZhbHNlXCIsdGFiSW5kZXg6LTF9KSx0aGlzLnBhbmVscy5ub3QodGhpcy5fZ2V0UGFuZWxGb3JUYWIodGhpcy5hY3RpdmUpKS5oaWRlKCkuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwifSksdGhpcy5hY3RpdmUubGVuZ3RoPyh0aGlzLmFjdGl2ZS5hZGRDbGFzcyhcInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZVwiKS5hdHRyKHtcImFyaWEtc2VsZWN0ZWRcIjpcInRydWVcIixcImFyaWEtZXhwYW5kZWRcIjpcInRydWVcIix0YWJJbmRleDowfSksdGhpcy5fZ2V0UGFuZWxGb3JUYWIodGhpcy5hY3RpdmUpLnNob3coKS5hdHRyKHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwifSkpOnRoaXMudGFicy5lcSgwKS5hdHRyKFwidGFiSW5kZXhcIiwwKX0sX3Byb2Nlc3NUYWJzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxpPXRoaXMudGFicyxzPXRoaXMuYW5jaG9ycyxuPXRoaXMucGFuZWxzO1xudGhpcy50YWJsaXN0PXRoaXMuX2dldExpc3QoKS5hZGRDbGFzcyhcInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxwZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsXCIpLmF0dHIoXCJyb2xlXCIsXCJ0YWJsaXN0XCIpLmRlbGVnYXRlKFwiPiBsaVwiLFwibW91c2Vkb3duXCIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbih0KXtlKHRoaXMpLmlzKFwiLnVpLXN0YXRlLWRpc2FibGVkXCIpJiZ0LnByZXZlbnREZWZhdWx0KCl9KS5kZWxlZ2F0ZShcIi51aS10YWJzLWFuY2hvclwiLFwiZm9jdXNcIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7ZSh0aGlzKS5jbG9zZXN0KFwibGlcIikuaXMoXCIudWktc3RhdGUtZGlzYWJsZWRcIikmJnRoaXMuYmx1cigpfSksdGhpcy50YWJzPXRoaXMudGFibGlzdC5maW5kKFwiPiBsaTpoYXMoYVtocmVmXSlcIikuYWRkQ2xhc3MoXCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci10b3BcIikuYXR0cih7cm9sZTpcInRhYlwiLHRhYkluZGV4Oi0xfSksdGhpcy5hbmNob3JzPXRoaXMudGFicy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZShcImFcIix0aGlzKVswXX0pLmFkZENsYXNzKFwidWktdGFicy1hbmNob3JcIikuYXR0cih7cm9sZTpcInByZXNlbnRhdGlvblwiLHRhYkluZGV4Oi0xfSksdGhpcy5wYW5lbHM9ZSgpLHRoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKGkscyl7dmFyIG4sYSxvLHI9ZShzKS51bmlxdWVJZCgpLmF0dHIoXCJpZFwiKSxoPWUocykuY2xvc2VzdChcImxpXCIpLGw9aC5hdHRyKFwiYXJpYS1jb250cm9sc1wiKTt0Ll9pc0xvY2FsKHMpPyhuPXMuaGFzaCxvPW4uc3Vic3RyaW5nKDEpLGE9dC5lbGVtZW50LmZpbmQodC5fc2FuaXRpemVTZWxlY3RvcihuKSkpOihvPWguYXR0cihcImFyaWEtY29udHJvbHNcIil8fGUoe30pLnVuaXF1ZUlkKClbMF0uaWQsbj1cIiNcIitvLGE9dC5lbGVtZW50LmZpbmQobiksYS5sZW5ndGh8fChhPXQuX2NyZWF0ZVBhbmVsKG8pLGEuaW5zZXJ0QWZ0ZXIodC5wYW5lbHNbaS0xXXx8dC50YWJsaXN0KSksYS5hdHRyKFwiYXJpYS1saXZlXCIsXCJwb2xpdGVcIikpLGEubGVuZ3RoJiYodC5wYW5lbHM9dC5wYW5lbHMuYWRkKGEpKSxsJiZoLmRhdGEoXCJ1aS10YWJzLWFyaWEtY29udHJvbHNcIixsKSxoLmF0dHIoe1wiYXJpYS1jb250cm9sc1wiOm8sXCJhcmlhLWxhYmVsbGVkYnlcIjpyfSksYS5hdHRyKFwiYXJpYS1sYWJlbGxlZGJ5XCIscil9KSx0aGlzLnBhbmVscy5hZGRDbGFzcyhcInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbVwiKS5hdHRyKFwicm9sZVwiLFwidGFicGFuZWxcIiksaSYmKHRoaXMuX29mZihpLm5vdCh0aGlzLnRhYnMpKSx0aGlzLl9vZmYocy5ub3QodGhpcy5hbmNob3JzKSksdGhpcy5fb2ZmKG4ubm90KHRoaXMucGFuZWxzKSkpfSxfZ2V0TGlzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhYmxpc3R8fHRoaXMuZWxlbWVudC5maW5kKFwib2wsdWxcIikuZXEoMCl9LF9jcmVhdGVQYW5lbDpmdW5jdGlvbih0KXtyZXR1cm4gZShcIjxkaXY+XCIpLmF0dHIoXCJpZFwiLHQpLmFkZENsYXNzKFwidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tXCIpLmRhdGEoXCJ1aS10YWJzLWRlc3Ryb3lcIiwhMCl9LF9zZXR1cERpc2FibGVkOmZ1bmN0aW9uKHQpe2UuaXNBcnJheSh0KSYmKHQubGVuZ3RoP3QubGVuZ3RoPT09dGhpcy5hbmNob3JzLmxlbmd0aCYmKHQ9ITApOnQ9ITEpO2Zvcih2YXIgaSxzPTA7aT10aGlzLnRhYnNbc107cysrKXQ9PT0hMHx8LTEhPT1lLmluQXJyYXkocyx0KT9lKGkpLmFkZENsYXNzKFwidWktc3RhdGUtZGlzYWJsZWRcIikuYXR0cihcImFyaWEtZGlzYWJsZWRcIixcInRydWVcIik6ZShpKS5yZW1vdmVDbGFzcyhcInVpLXN0YXRlLWRpc2FibGVkXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWRpc2FibGVkXCIpO3RoaXMub3B0aW9ucy5kaXNhYmxlZD10fSxfc2V0dXBFdmVudHM6ZnVuY3Rpb24odCl7dmFyIGk9e307dCYmZS5lYWNoKHQuc3BsaXQoXCIgXCIpLGZ1bmN0aW9uKGUsdCl7aVt0XT1cIl9ldmVudEhhbmRsZXJcIn0pLHRoaXMuX29mZih0aGlzLmFuY2hvcnMuYWRkKHRoaXMudGFicykuYWRkKHRoaXMucGFuZWxzKSksdGhpcy5fb24oITAsdGhpcy5hbmNob3JzLHtjbGljazpmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCl9fSksdGhpcy5fb24odGhpcy5hbmNob3JzLGkpLHRoaXMuX29uKHRoaXMudGFicyx7a2V5ZG93bjpcIl90YWJLZXlkb3duXCJ9KSx0aGlzLl9vbih0aGlzLnBhbmVscyx7a2V5ZG93bjpcIl9wYW5lbEtleWRvd25cIn0pLHRoaXMuX2ZvY3VzYWJsZSh0aGlzLnRhYnMpLHRoaXMuX2hvdmVyYWJsZSh0aGlzLnRhYnMpfSxfc2V0dXBIZWlnaHRTdHlsZTpmdW5jdGlvbih0KXt2YXIgaSxzPXRoaXMuZWxlbWVudC5wYXJlbnQoKTtcImZpbGxcIj09PXQ/KGk9cy5oZWlnaHQoKSxpLT10aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKS10aGlzLmVsZW1lbnQuaGVpZ2h0KCksdGhpcy5lbGVtZW50LnNpYmxpbmdzKFwiOnZpc2libGVcIikuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcykscz10LmNzcyhcInBvc2l0aW9uXCIpO1wiYWJzb2x1dGVcIiE9PXMmJlwiZml4ZWRcIiE9PXMmJihpLT10Lm91dGVySGVpZ2h0KCEwKSl9KSx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oKS5ub3QodGhpcy5wYW5lbHMpLmVhY2goZnVuY3Rpb24oKXtpLT1lKHRoaXMpLm91dGVySGVpZ2h0KCEwKX0pLHRoaXMucGFuZWxzLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmhlaWdodChNYXRoLm1heCgwLGktZSh0aGlzKS5pbm5lckhlaWdodCgpK2UodGhpcykuaGVpZ2h0KCkpKX0pLmNzcyhcIm92ZXJmbG93XCIsXCJhdXRvXCIpKTpcImF1dG9cIj09PXQmJihpPTAsdGhpcy5wYW5lbHMuZWFjaChmdW5jdGlvbigpe2k9TWF0aC5tYXgoaSxlKHRoaXMpLmhlaWdodChcIlwiKS5oZWlnaHQoKSl9KS5oZWlnaHQoaSkpfSxfZXZlbnRIYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucyxzPXRoaXMuYWN0aXZlLG49ZSh0LmN1cnJlbnRUYXJnZXQpLGE9bi5jbG9zZXN0KFwibGlcIiksbz1hWzBdPT09c1swXSxyPW8mJmkuY29sbGFwc2libGUsaD1yP2UoKTp0aGlzLl9nZXRQYW5lbEZvclRhYihhKSxsPXMubGVuZ3RoP3RoaXMuX2dldFBhbmVsRm9yVGFiKHMpOmUoKSx1PXtvbGRUYWI6cyxvbGRQYW5lbDpsLG5ld1RhYjpyP2UoKTphLG5ld1BhbmVsOmh9O3QucHJldmVudERlZmF1bHQoKSxhLmhhc0NsYXNzKFwidWktc3RhdGUtZGlzYWJsZWRcIil8fGEuaGFzQ2xhc3MoXCJ1aS10YWJzLWxvYWRpbmdcIil8fHRoaXMucnVubmluZ3x8byYmIWkuY29sbGFwc2libGV8fHRoaXMuX3RyaWdnZXIoXCJiZWZvcmVBY3RpdmF0ZVwiLHQsdSk9PT0hMXx8KGkuYWN0aXZlPXI/ITE6dGhpcy50YWJzLmluZGV4KGEpLHRoaXMuYWN0aXZlPW8/ZSgpOmEsdGhpcy54aHImJnRoaXMueGhyLmFib3J0KCksbC5sZW5ndGh8fGgubGVuZ3RofHxlLmVycm9yKFwialF1ZXJ5IFVJIFRhYnM6IE1pc21hdGNoaW5nIGZyYWdtZW50IGlkZW50aWZpZXIuXCIpLGgubGVuZ3RoJiZ0aGlzLmxvYWQodGhpcy50YWJzLmluZGV4KGEpLHQpLHRoaXMuX3RvZ2dsZSh0LHUpKX0sX3RvZ2dsZTpmdW5jdGlvbih0LGkpe2Z1bmN0aW9uIHMoKXthLnJ1bm5pbmc9ITEsYS5fdHJpZ2dlcihcImFjdGl2YXRlXCIsdCxpKX1mdW5jdGlvbiBuKCl7aS5uZXdUYWIuY2xvc2VzdChcImxpXCIpLmFkZENsYXNzKFwidWktdGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlXCIpLG8ubGVuZ3RoJiZhLm9wdGlvbnMuc2hvdz9hLl9zaG93KG8sYS5vcHRpb25zLnNob3cscyk6KG8uc2hvdygpLHMoKSl9dmFyIGE9dGhpcyxvPWkubmV3UGFuZWwscj1pLm9sZFBhbmVsO3RoaXMucnVubmluZz0hMCxyLmxlbmd0aCYmdGhpcy5vcHRpb25zLmhpZGU/dGhpcy5faGlkZShyLHRoaXMub3B0aW9ucy5oaWRlLGZ1bmN0aW9uKCl7aS5vbGRUYWIuY2xvc2VzdChcImxpXCIpLnJlbW92ZUNsYXNzKFwidWktdGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlXCIpLG4oKX0pOihpLm9sZFRhYi5jbG9zZXN0KFwibGlcIikucmVtb3ZlQ2xhc3MoXCJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmVcIiksci5oaWRlKCksbigpKSxyLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKSxpLm9sZFRhYi5hdHRyKHtcImFyaWEtc2VsZWN0ZWRcIjpcImZhbHNlXCIsXCJhcmlhLWV4cGFuZGVkXCI6XCJmYWxzZVwifSksby5sZW5ndGgmJnIubGVuZ3RoP2kub2xkVGFiLmF0dHIoXCJ0YWJJbmRleFwiLC0xKTpvLmxlbmd0aCYmdGhpcy50YWJzLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiAwPT09ZSh0aGlzKS5hdHRyKFwidGFiSW5kZXhcIil9KS5hdHRyKFwidGFiSW5kZXhcIiwtMSksby5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpLGkubmV3VGFiLmF0dHIoe1wiYXJpYS1zZWxlY3RlZFwiOlwidHJ1ZVwiLFwiYXJpYS1leHBhbmRlZFwiOlwidHJ1ZVwiLHRhYkluZGV4OjB9KX0sX2FjdGl2YXRlOmZ1bmN0aW9uKHQpe3ZhciBpLHM9dGhpcy5fZmluZEFjdGl2ZSh0KTtzWzBdIT09dGhpcy5hY3RpdmVbMF0mJihzLmxlbmd0aHx8KHM9dGhpcy5hY3RpdmUpLGk9cy5maW5kKFwiLnVpLXRhYnMtYW5jaG9yXCIpWzBdLHRoaXMuX2V2ZW50SGFuZGxlcih7dGFyZ2V0OmksY3VycmVudFRhcmdldDppLHByZXZlbnREZWZhdWx0OmUubm9vcH0pKX0sX2ZpbmRBY3RpdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0hMT9lKCk6dGhpcy50YWJzLmVxKHQpfSxfZ2V0SW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGUmJihlPXRoaXMuYW5jaG9ycy5pbmRleCh0aGlzLmFuY2hvcnMuZmlsdGVyKFwiW2hyZWYkPSdcIitlK1wiJ11cIikpKSxlfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhcInVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwgdWktdGFicy1jb2xsYXBzaWJsZVwiKSx0aGlzLnRhYmxpc3QucmVtb3ZlQ2xhc3MoXCJ1aS10YWJzLW5hdiB1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbFwiKS5yZW1vdmVBdHRyKFwicm9sZVwiKSx0aGlzLmFuY2hvcnMucmVtb3ZlQ2xhc3MoXCJ1aS10YWJzLWFuY2hvclwiKS5yZW1vdmVBdHRyKFwicm9sZVwiKS5yZW1vdmVBdHRyKFwidGFiSW5kZXhcIikucmVtb3ZlVW5pcXVlSWQoKSx0aGlzLnRhYmxpc3QudW5iaW5kKHRoaXMuZXZlbnROYW1lc3BhY2UpLHRoaXMudGFicy5hZGQodGhpcy5wYW5lbHMpLmVhY2goZnVuY3Rpb24oKXtlLmRhdGEodGhpcyxcInVpLXRhYnMtZGVzdHJveVwiKT9lKHRoaXMpLnJlbW92ZSgpOmUodGhpcykucmVtb3ZlQ2xhc3MoXCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCB1aS1jb3JuZXItdG9wIHVpLWNvcm5lci1ib3R0b20gdWktd2lkZ2V0LWNvbnRlbnQgdWktdGFicy1hY3RpdmUgdWktdGFicy1wYW5lbFwiKS5yZW1vdmVBdHRyKFwidGFiSW5kZXhcIikucmVtb3ZlQXR0cihcImFyaWEtbGl2ZVwiKS5yZW1vdmVBdHRyKFwiYXJpYS1idXN5XCIpLnJlbW92ZUF0dHIoXCJhcmlhLXNlbGVjdGVkXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWxhYmVsbGVkYnlcIikucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWV4cGFuZGVkXCIpLnJlbW92ZUF0dHIoXCJyb2xlXCIpfSksdGhpcy50YWJzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC5kYXRhKFwidWktdGFicy1hcmlhLWNvbnRyb2xzXCIpO2k/dC5hdHRyKFwiYXJpYS1jb250cm9sc1wiLGkpLnJlbW92ZURhdGEoXCJ1aS10YWJzLWFyaWEtY29udHJvbHNcIik6dC5yZW1vdmVBdHRyKFwiYXJpYS1jb250cm9sc1wiKX0pLHRoaXMucGFuZWxzLnNob3coKSxcImNvbnRlbnRcIiE9PXRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSYmdGhpcy5wYW5lbHMuY3NzKFwiaGVpZ2h0XCIsXCJcIil9LGVuYWJsZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnMuZGlzYWJsZWQ7aSE9PSExJiYodm9pZCAwPT09dD9pPSExOih0PXRoaXMuX2dldEluZGV4KHQpLGk9ZS5pc0FycmF5KGkpP2UubWFwKGksZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT10P2U6bnVsbH0pOmUubWFwKHRoaXMudGFicyxmdW5jdGlvbihlLGkpe3JldHVybiBpIT09dD9pOm51bGx9KSksdGhpcy5fc2V0dXBEaXNhYmxlZChpKSl9LGRpc2FibGU6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zLmRpc2FibGVkO2lmKGkhPT0hMCl7aWYodm9pZCAwPT09dClpPSEwO2Vsc2V7aWYodD10aGlzLl9nZXRJbmRleCh0KSwtMSE9PWUuaW5BcnJheSh0LGkpKXJldHVybjtpPWUuaXNBcnJheShpKT9lLm1lcmdlKFt0XSxpKS5zb3J0KCk6W3RdfXRoaXMuX3NldHVwRGlzYWJsZWQoaSl9fSxsb2FkOmZ1bmN0aW9uKHQsaSl7dD10aGlzLl9nZXRJbmRleCh0KTt2YXIgcz10aGlzLG49dGhpcy50YWJzLmVxKHQpLGE9bi5maW5kKFwiLnVpLXRhYnMtYW5jaG9yXCIpLG89dGhpcy5fZ2V0UGFuZWxGb3JUYWIobikscj17dGFiOm4scGFuZWw6b30saD1mdW5jdGlvbihlLHQpe1wiYWJvcnRcIj09PXQmJnMucGFuZWxzLnN0b3AoITEsITApLG4ucmVtb3ZlQ2xhc3MoXCJ1aS10YWJzLWxvYWRpbmdcIiksby5yZW1vdmVBdHRyKFwiYXJpYS1idXN5XCIpLGU9PT1zLnhociYmZGVsZXRlIHMueGhyfTt0aGlzLl9pc0xvY2FsKGFbMF0pfHwodGhpcy54aHI9ZS5hamF4KHRoaXMuX2FqYXhTZXR0aW5ncyhhLGkscikpLHRoaXMueGhyJiZcImNhbmNlbGVkXCIhPT10aGlzLnhoci5zdGF0dXNUZXh0JiYobi5hZGRDbGFzcyhcInVpLXRhYnMtbG9hZGluZ1wiKSxvLmF0dHIoXCJhcmlhLWJ1c3lcIixcInRydWVcIiksdGhpcy54aHIuZG9uZShmdW5jdGlvbihlLHQsbil7c2V0VGltZW91dChmdW5jdGlvbigpe28uaHRtbChlKSxzLl90cmlnZ2VyKFwibG9hZFwiLGksciksaChuLHQpfSwxKX0pLmZhaWwoZnVuY3Rpb24oZSx0KXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aChlLHQpfSwxKX0pKSl9LF9hamF4U2V0dGluZ3M6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPXRoaXM7cmV0dXJue3VybDp0LmF0dHIoXCJocmVmXCIpLGJlZm9yZVNlbmQ6ZnVuY3Rpb24odCxhKXtyZXR1cm4gbi5fdHJpZ2dlcihcImJlZm9yZUxvYWRcIixpLGUuZXh0ZW5kKHtqcVhIUjp0LGFqYXhTZXR0aW5nczphfSxzKSl9fX0sX2dldFBhbmVsRm9yVGFiOmZ1bmN0aW9uKHQpe3ZhciBpPWUodCkuYXR0cihcImFyaWEtY29udHJvbHNcIik7cmV0dXJuIHRoaXMuZWxlbWVudC5maW5kKHRoaXMuX3Nhbml0aXplU2VsZWN0b3IoXCIjXCIraSkpfX0pLGUud2lkZ2V0KFwidWkudG9vbHRpcFwiLHt2ZXJzaW9uOlwiMS4xMS40XCIsb3B0aW9uczp7Y29udGVudDpmdW5jdGlvbigpe3ZhciB0PWUodGhpcykuYXR0cihcInRpdGxlXCIpfHxcIlwiO3JldHVybiBlKFwiPGE+XCIpLnRleHQodCkuaHRtbCgpfSxoaWRlOiEwLGl0ZW1zOlwiW3RpdGxlXTpub3QoW2Rpc2FibGVkXSlcIixwb3NpdGlvbjp7bXk6XCJsZWZ0IHRvcCsxNVwiLGF0OlwibGVmdCBib3R0b21cIixjb2xsaXNpb246XCJmbGlwZml0IGZsaXBcIn0sc2hvdzohMCx0b29sdGlwQ2xhc3M6bnVsbCx0cmFjazohMSxjbG9zZTpudWxsLG9wZW46bnVsbH0sX2FkZERlc2NyaWJlZEJ5OmZ1bmN0aW9uKHQsaSl7dmFyIHM9KHQuYXR0cihcImFyaWEtZGVzY3JpYmVkYnlcIil8fFwiXCIpLnNwbGl0KC9cXHMrLyk7cy5wdXNoKGkpLHQuZGF0YShcInVpLXRvb2x0aXAtaWRcIixpKS5hdHRyKFwiYXJpYS1kZXNjcmliZWRieVwiLGUudHJpbShzLmpvaW4oXCIgXCIpKSl9LF9yZW1vdmVEZXNjcmliZWRCeTpmdW5jdGlvbih0KXt2YXIgaT10LmRhdGEoXCJ1aS10b29sdGlwLWlkXCIpLHM9KHQuYXR0cihcImFyaWEtZGVzY3JpYmVkYnlcIil8fFwiXCIpLnNwbGl0KC9cXHMrLyksbj1lLmluQXJyYXkoaSxzKTstMSE9PW4mJnMuc3BsaWNlKG4sMSksdC5yZW1vdmVEYXRhKFwidWktdG9vbHRpcC1pZFwiKSxzPWUudHJpbShzLmpvaW4oXCIgXCIpKSxzP3QuYXR0cihcImFyaWEtZGVzY3JpYmVkYnlcIixzKTp0LnJlbW92ZUF0dHIoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5fb24oe21vdXNlb3ZlcjpcIm9wZW5cIixmb2N1c2luOlwib3BlblwifSksdGhpcy50b29sdGlwcz17fSx0aGlzLnBhcmVudHM9e30sdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLl9kaXNhYmxlKCksdGhpcy5saXZlUmVnaW9uPWUoXCI8ZGl2PlwiKS5hdHRyKHtyb2xlOlwibG9nXCIsXCJhcmlhLWxpdmVcIjpcImFzc2VydGl2ZVwiLFwiYXJpYS1yZWxldmFudFwiOlwiYWRkaXRpb25zXCJ9KS5hZGRDbGFzcyhcInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZVwiKS5hcHBlbmRUbyh0aGlzLmRvY3VtZW50WzBdLmJvZHkpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKHQsaSl7dmFyIHM9dGhpcztyZXR1cm5cImRpc2FibGVkXCI9PT10Pyh0aGlzW2k/XCJfZGlzYWJsZVwiOlwiX2VuYWJsZVwiXSgpLHRoaXMub3B0aW9uc1t0XT1pLHZvaWQgMCk6KHRoaXMuX3N1cGVyKHQsaSksXCJjb250ZW50XCI9PT10JiZlLmVhY2godGhpcy50b29sdGlwcyxmdW5jdGlvbihlLHQpe3MuX3VwZGF0ZUNvbnRlbnQodC5lbGVtZW50KX0pLHZvaWQgMCl9LF9kaXNhYmxlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztlLmVhY2godGhpcy50b29sdGlwcyxmdW5jdGlvbihpLHMpe3ZhciBuPWUuRXZlbnQoXCJibHVyXCIpO24udGFyZ2V0PW4uY3VycmVudFRhcmdldD1zLmVsZW1lbnRbMF0sdC5jbG9zZShuLCEwKX0pLHRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuYWRkQmFjaygpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3QuaXMoXCJbdGl0bGVdXCIpJiZ0LmRhdGEoXCJ1aS10b29sdGlwLXRpdGxlXCIsdC5hdHRyKFwidGl0bGVcIikpLnJlbW92ZUF0dHIoXCJ0aXRsZVwiKX0pfSxfZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7dC5kYXRhKFwidWktdG9vbHRpcC10aXRsZVwiKSYmdC5hdHRyKFwidGl0bGVcIix0LmRhdGEoXCJ1aS10b29sdGlwLXRpdGxlXCIpKX0pfSxvcGVuOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMscz1lKHQ/dC50YXJnZXQ6dGhpcy5lbGVtZW50KS5jbG9zZXN0KHRoaXMub3B0aW9ucy5pdGVtcyk7cy5sZW5ndGgmJiFzLmRhdGEoXCJ1aS10b29sdGlwLWlkXCIpJiYocy5hdHRyKFwidGl0bGVcIikmJnMuZGF0YShcInVpLXRvb2x0aXAtdGl0bGVcIixzLmF0dHIoXCJ0aXRsZVwiKSkscy5kYXRhKFwidWktdG9vbHRpcC1vcGVuXCIsITApLHQmJlwibW91c2VvdmVyXCI9PT10LnR5cGUmJnMucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXt2YXIgdCxzPWUodGhpcyk7cy5kYXRhKFwidWktdG9vbHRpcC1vcGVuXCIpJiYodD1lLkV2ZW50KFwiYmx1clwiKSx0LnRhcmdldD10LmN1cnJlbnRUYXJnZXQ9dGhpcyxpLmNsb3NlKHQsITApKSxzLmF0dHIoXCJ0aXRsZVwiKSYmKHMudW5pcXVlSWQoKSxpLnBhcmVudHNbdGhpcy5pZF09e2VsZW1lbnQ6dGhpcyx0aXRsZTpzLmF0dHIoXCJ0aXRsZVwiKX0scy5hdHRyKFwidGl0bGVcIixcIlwiKSl9KSx0aGlzLl9yZWdpc3RlckNsb3NlSGFuZGxlcnModCxzKSx0aGlzLl91cGRhdGVDb250ZW50KHMsdCkpfSxfdXBkYXRlQ29udGVudDpmdW5jdGlvbihlLHQpe3ZhciBpLHM9dGhpcy5vcHRpb25zLmNvbnRlbnQsbj10aGlzLGE9dD90LnR5cGU6bnVsbDtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2Ygcz90aGlzLl9vcGVuKHQsZSxzKTooaT1zLmNhbGwoZVswXSxmdW5jdGlvbihpKXtuLl9kZWxheShmdW5jdGlvbigpe2UuZGF0YShcInVpLXRvb2x0aXAtb3BlblwiKSYmKHQmJih0LnR5cGU9YSksdGhpcy5fb3Blbih0LGUsaSkpfSl9KSxpJiZ0aGlzLl9vcGVuKHQsZSxpKSx2b2lkIDApfSxfb3BlbjpmdW5jdGlvbih0LGkscyl7ZnVuY3Rpb24gbihlKXtsLm9mPWUsby5pcyhcIjpoaWRkZW5cIil8fG8ucG9zaXRpb24obCl9dmFyIGEsbyxyLGgsbD1lLmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pO2lmKHMpe2lmKGE9dGhpcy5fZmluZChpKSlyZXR1cm4gYS50b29sdGlwLmZpbmQoXCIudWktdG9vbHRpcC1jb250ZW50XCIpLmh0bWwocyksdm9pZCAwO2kuaXMoXCJbdGl0bGVdXCIpJiYodCYmXCJtb3VzZW92ZXJcIj09PXQudHlwZT9pLmF0dHIoXCJ0aXRsZVwiLFwiXCIpOmkucmVtb3ZlQXR0cihcInRpdGxlXCIpKSxhPXRoaXMuX3Rvb2x0aXAoaSksbz1hLnRvb2x0aXAsdGhpcy5fYWRkRGVzY3JpYmVkQnkoaSxvLmF0dHIoXCJpZFwiKSksby5maW5kKFwiLnVpLXRvb2x0aXAtY29udGVudFwiKS5odG1sKHMpLHRoaXMubGl2ZVJlZ2lvbi5jaGlsZHJlbigpLmhpZGUoKSxzLmNsb25lPyhoPXMuY2xvbmUoKSxoLnJlbW92ZUF0dHIoXCJpZFwiKS5maW5kKFwiW2lkXVwiKS5yZW1vdmVBdHRyKFwiaWRcIikpOmg9cyxlKFwiPGRpdj5cIikuaHRtbChoKS5hcHBlbmRUbyh0aGlzLmxpdmVSZWdpb24pLHRoaXMub3B0aW9ucy50cmFjayYmdCYmL15tb3VzZS8udGVzdCh0LnR5cGUpPyh0aGlzLl9vbih0aGlzLmRvY3VtZW50LHttb3VzZW1vdmU6bn0pLG4odCkpOm8ucG9zaXRpb24oZS5leHRlbmQoe29mOml9LHRoaXMub3B0aW9ucy5wb3NpdGlvbikpLG8uaGlkZSgpLHRoaXMuX3Nob3cobyx0aGlzLm9wdGlvbnMuc2hvdyksdGhpcy5vcHRpb25zLnNob3cmJnRoaXMub3B0aW9ucy5zaG93LmRlbGF5JiYocj10aGlzLmRlbGF5ZWRTaG93PXNldEludGVydmFsKGZ1bmN0aW9uKCl7by5pcyhcIjp2aXNpYmxlXCIpJiYobihsLm9mKSxjbGVhckludGVydmFsKHIpKX0sZS5meC5pbnRlcnZhbCkpLHRoaXMuX3RyaWdnZXIoXCJvcGVuXCIsdCx7dG9vbHRpcDpvfSl9fSxfcmVnaXN0ZXJDbG9zZUhhbmRsZXJzOmZ1bmN0aW9uKHQsaSl7dmFyIHM9e2tleXVwOmZ1bmN0aW9uKHQpe2lmKHQua2V5Q29kZT09PWUudWkua2V5Q29kZS5FU0NBUEUpe3ZhciBzPWUuRXZlbnQodCk7cy5jdXJyZW50VGFyZ2V0PWlbMF0sdGhpcy5jbG9zZShzLCEwKX19fTtpWzBdIT09dGhpcy5lbGVtZW50WzBdJiYocy5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9yZW1vdmVUb29sdGlwKHRoaXMuX2ZpbmQoaSkudG9vbHRpcCl9KSx0JiZcIm1vdXNlb3ZlclwiIT09dC50eXBlfHwocy5tb3VzZWxlYXZlPVwiY2xvc2VcIiksdCYmXCJmb2N1c2luXCIhPT10LnR5cGV8fChzLmZvY3Vzb3V0PVwiY2xvc2VcIiksdGhpcy5fb24oITAsaSxzKX0sY2xvc2U6ZnVuY3Rpb24odCl7dmFyIGkscz10aGlzLG49ZSh0P3QuY3VycmVudFRhcmdldDp0aGlzLmVsZW1lbnQpLGE9dGhpcy5fZmluZChuKTtyZXR1cm4gYT8oaT1hLnRvb2x0aXAsYS5jbG9zaW5nfHwoY2xlYXJJbnRlcnZhbCh0aGlzLmRlbGF5ZWRTaG93KSxuLmRhdGEoXCJ1aS10b29sdGlwLXRpdGxlXCIpJiYhbi5hdHRyKFwidGl0bGVcIikmJm4uYXR0cihcInRpdGxlXCIsbi5kYXRhKFwidWktdG9vbHRpcC10aXRsZVwiKSksdGhpcy5fcmVtb3ZlRGVzY3JpYmVkQnkobiksYS5oaWRpbmc9ITAsaS5zdG9wKCEwKSx0aGlzLl9oaWRlKGksdGhpcy5vcHRpb25zLmhpZGUsZnVuY3Rpb24oKXtzLl9yZW1vdmVUb29sdGlwKGUodGhpcykpfSksbi5yZW1vdmVEYXRhKFwidWktdG9vbHRpcC1vcGVuXCIpLHRoaXMuX29mZihuLFwibW91c2VsZWF2ZSBmb2N1c291dCBrZXl1cFwiKSxuWzBdIT09dGhpcy5lbGVtZW50WzBdJiZ0aGlzLl9vZmYobixcInJlbW92ZVwiKSx0aGlzLl9vZmYodGhpcy5kb2N1bWVudCxcIm1vdXNlbW92ZVwiKSx0JiZcIm1vdXNlbGVhdmVcIj09PXQudHlwZSYmZS5lYWNoKHRoaXMucGFyZW50cyxmdW5jdGlvbih0LGkpe2UoaS5lbGVtZW50KS5hdHRyKFwidGl0bGVcIixpLnRpdGxlKSxkZWxldGUgcy5wYXJlbnRzW3RdfSksYS5jbG9zaW5nPSEwLHRoaXMuX3RyaWdnZXIoXCJjbG9zZVwiLHQse3Rvb2x0aXA6aX0pLGEuaGlkaW5nfHwoYS5jbG9zaW5nPSExKSksdm9pZCAwKToobi5yZW1vdmVEYXRhKFwidWktdG9vbHRpcC1vcGVuXCIpLHZvaWQgMCl9LF90b29sdGlwOmZ1bmN0aW9uKHQpe3ZhciBpPWUoXCI8ZGl2PlwiKS5hdHRyKFwicm9sZVwiLFwidG9vbHRpcFwiKS5hZGRDbGFzcyhcInVpLXRvb2x0aXAgdWktd2lkZ2V0IHVpLWNvcm5lci1hbGwgdWktd2lkZ2V0LWNvbnRlbnQgXCIrKHRoaXMub3B0aW9ucy50b29sdGlwQ2xhc3N8fFwiXCIpKSxzPWkudW5pcXVlSWQoKS5hdHRyKFwiaWRcIik7cmV0dXJuIGUoXCI8ZGl2PlwiKS5hZGRDbGFzcyhcInVpLXRvb2x0aXAtY29udGVudFwiKS5hcHBlbmRUbyhpKSxpLmFwcGVuZFRvKHRoaXMuZG9jdW1lbnRbMF0uYm9keSksdGhpcy50b29sdGlwc1tzXT17ZWxlbWVudDp0LHRvb2x0aXA6aX19LF9maW5kOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YShcInVpLXRvb2x0aXAtaWRcIik7cmV0dXJuIHQ/dGhpcy50b29sdGlwc1t0XTpudWxsfSxfcmVtb3ZlVG9vbHRpcDpmdW5jdGlvbihlKXtlLnJlbW92ZSgpLGRlbGV0ZSB0aGlzLnRvb2x0aXBzW2UuYXR0cihcImlkXCIpXX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2UuZWFjaCh0aGlzLnRvb2x0aXBzLGZ1bmN0aW9uKGkscyl7dmFyIG49ZS5FdmVudChcImJsdXJcIiksYT1zLmVsZW1lbnQ7bi50YXJnZXQ9bi5jdXJyZW50VGFyZ2V0PWFbMF0sdC5jbG9zZShuLCEwKSxlKFwiI1wiK2kpLnJlbW92ZSgpLGEuZGF0YShcInVpLXRvb2x0aXAtdGl0bGVcIikmJihhLmF0dHIoXCJ0aXRsZVwiKXx8YS5hdHRyKFwidGl0bGVcIixhLmRhdGEoXCJ1aS10b29sdGlwLXRpdGxlXCIpKSxhLnJlbW92ZURhdGEoXCJ1aS10b29sdGlwLXRpdGxlXCIpKX0pLHRoaXMubGl2ZVJlZ2lvbi5yZW1vdmUoKX19KX0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vdmVuZG9yL2FsbWFzYWVlZDIwMTAvYWRtaW5sdGUvYm93ZXJfY29tcG9uZW50cy9qcXVlcnktdWkvanF1ZXJ5LXVpLm1pbi5qc1xuLy8gbW9kdWxlIGlkID0gNDlcbi8vIG1vZHVsZSBjaHVua3MgPSAxIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///49\n");
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports) {
+
+eval("/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under the MIT license\n */\nif(\"undefined\"==typeof jQuery)throw new Error(\"Bootstrap's JavaScript requires jQuery\");+function(a){\"use strict\";var b=a.fn.jquery.split(\" \")[0].split(\".\");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error(\"Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4\")}(jQuery),+function(a){\"use strict\";function b(){var a=document.createElement(\"bootstrap\"),b={WebkitTransition:\"webkitTransitionEnd\",MozTransition:\"transitionend\",OTransition:\"oTransitionEnd otransitionend\",transition:\"transitionend\"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(\"bsTransitionEnd\",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){\"use strict\";function b(b){return this.each(function(){var c=a(this),e=c.data(\"bs.alert\");e||c.data(\"bs.alert\",e=new d(this)),\"string\"==typeof b&&e[b].call(c)})}var c='[data-dismiss=\"alert\"]',d=function(b){a(b).on(\"click\",c,this.close)};d.VERSION=\"3.3.7\",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger(\"closed.bs.alert\").remove()}var e=a(this),f=e.attr(\"data-target\");f||(f=e.attr(\"href\"),f=f&&f.replace(/.*(?=#[^\\s]*$)/,\"\"));var g=a(\"#\"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(\".alert\")),g.trigger(b=a.Event(\"close.bs.alert\")),b.isDefaultPrevented()||(g.removeClass(\"in\"),a.support.transition&&g.hasClass(\"fade\")?g.one(\"bsTransitionEnd\",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on(\"click.bs.alert.data-api\",c,d.prototype.close)}(jQuery),+function(a){\"use strict\";function b(b){return this.each(function(){var d=a(this),e=d.data(\"bs.button\"),f=\"object\"==typeof b&&b;e||d.data(\"bs.button\",e=new c(this,f)),\"toggle\"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION=\"3.3.7\",c.DEFAULTS={loadingText:\"loading...\"},c.prototype.setState=function(b){var c=\"disabled\",d=this.$element,e=d.is(\"input\")?\"val\":\"html\",f=d.data();b+=\"Text\",null==f.resetText&&d.data(\"resetText\",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),\"loadingText\"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle=\"buttons\"]');if(b.length){var c=this.$element.find(\"input\");\"radio\"==c.prop(\"type\")?(c.prop(\"checked\")&&(a=!1),b.find(\".active\").removeClass(\"active\"),this.$element.addClass(\"active\")):\"checkbox\"==c.prop(\"type\")&&(c.prop(\"checked\")!==this.$element.hasClass(\"active\")&&(a=!1),this.$element.toggleClass(\"active\")),c.prop(\"checked\",this.$element.hasClass(\"active\")),a&&c.trigger(\"change\")}else this.$element.attr(\"aria-pressed\",!this.$element.hasClass(\"active\")),this.$element.toggleClass(\"active\")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on(\"click.bs.button.data-api\",'[data-toggle^=\"button\"]',function(c){var d=a(c.target).closest(\".btn\");b.call(d,\"toggle\"),a(c.target).is('input[type=\"radio\"], input[type=\"checkbox\"]')||(c.preventDefault(),d.is(\"input,button\")?d.trigger(\"focus\"):d.find(\"input:visible,button:visible\").first().trigger(\"focus\"))}).on(\"focus.bs.button.data-api blur.bs.button.data-api\",'[data-toggle^=\"button\"]',function(b){a(b.target).closest(\".btn\").toggleClass(\"focus\",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){\"use strict\";function b(b){return this.each(function(){var d=a(this),e=d.data(\"bs.carousel\"),f=a.extend({},c.DEFAULTS,d.data(),\"object\"==typeof b&&b),g=\"string\"==typeof b?b:f.slide;e||d.data(\"bs.carousel\",e=new c(this,f)),\"number\"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(\".carousel-indicators\"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on(\"keydown.bs.carousel\",a.proxy(this.keydown,this)),\"hover\"==this.options.pause&&!(\"ontouchstart\"in document.documentElement)&&this.$element.on(\"mouseenter.bs.carousel\",a.proxy(this.pause,this)).on(\"mouseleave.bs.carousel\",a.proxy(this.cycle,this))};c.VERSION=\"3.3.7\",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:\"hover\",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(\".item\"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d=\"prev\"==a&&0===c||\"next\"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e=\"prev\"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(\".item.active\"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one(\"slid.bs.carousel\",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?\"next\":\"prev\",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(\".next, .prev\").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide(\"next\")},c.prototype.prev=function(){if(!this.sliding)return this.slide(\"prev\")},c.prototype.slide=function(b,d){var e=this.$element.find(\".item.active\"),f=d||this.getItemForDirection(b,e),g=this.interval,h=\"next\"==b?\"left\":\"right\",i=this;if(f.hasClass(\"active\"))return this.sliding=!1;var j=f[0],k=a.Event(\"slide.bs.carousel\",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(\".active\").removeClass(\"active\");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass(\"active\")}var m=a.Event(\"slid.bs.carousel\",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass(\"slide\")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one(\"bsTransitionEnd\",function(){f.removeClass([b,h].join(\" \")).addClass(\"active\"),e.removeClass([\"active\",h].join(\" \")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass(\"active\"),f.addClass(\"active\"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr(\"data-target\")||(d=e.attr(\"href\"))&&d.replace(/.*(?=#[^\\s]+$)/,\"\"));if(f.hasClass(\"carousel\")){var g=a.extend({},f.data(),e.data()),h=e.attr(\"data-slide-to\");h&&(g.interval=!1),b.call(f,g),h&&f.data(\"bs.carousel\").to(h),c.preventDefault()}};a(document).on(\"click.bs.carousel.data-api\",\"[data-slide]\",e).on(\"click.bs.carousel.data-api\",\"[data-slide-to]\",e),a(window).on(\"load\",function(){a('[data-ride=\"carousel\"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){\"use strict\";function b(b){var c,d=b.attr(\"data-target\")||(c=b.attr(\"href\"))&&c.replace(/.*(?=#[^\\s]+$)/,\"\");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data(\"bs.collapse\"),f=a.extend({},d.DEFAULTS,c.data(),\"object\"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data(\"bs.collapse\",e=new d(this,f)),\"string\"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle=\"collapse\"][href=\"#'+b.id+'\"],[data-toggle=\"collapse\"][data-target=\"#'+b.id+'\"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION=\"3.3.7\",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass(\"width\");return a?\"width\":\"height\"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass(\"in\")){var b,e=this.$parent&&this.$parent.children(\".panel\").children(\".in, .collapsing\");if(!(e&&e.length&&(b=e.data(\"bs.collapse\"),b&&b.transitioning))){var f=a.Event(\"show.bs.collapse\");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,\"hide\"),b||e.data(\"bs.collapse\",null));var g=this.dimension();this.$element.removeClass(\"collapse\").addClass(\"collapsing\")[g](0).attr(\"aria-expanded\",!0),this.$trigger.removeClass(\"collapsed\").attr(\"aria-expanded\",!0),this.transitioning=1;var h=function(){this.$element.removeClass(\"collapsing\").addClass(\"collapse in\")[g](\"\"),this.transitioning=0,this.$element.trigger(\"shown.bs.collapse\")};if(!a.support.transition)return h.call(this);var i=a.camelCase([\"scroll\",g].join(\"-\"));this.$element.one(\"bsTransitionEnd\",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass(\"in\")){var b=a.Event(\"hide.bs.collapse\");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass(\"collapsing\").removeClass(\"collapse in\").attr(\"aria-expanded\",!1),this.$trigger.addClass(\"collapsed\").attr(\"aria-expanded\",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass(\"collapsing\").addClass(\"collapse\").trigger(\"hidden.bs.collapse\")};return a.support.transition?void this.$element[c](0).one(\"bsTransitionEnd\",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass(\"in\")?\"hide\":\"show\"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle=\"collapse\"][data-parent=\"'+this.options.parent+'\"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass(\"in\");a.attr(\"aria-expanded\",c),b.toggleClass(\"collapsed\",!c).attr(\"aria-expanded\",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on(\"click.bs.collapse.data-api\",'[data-toggle=\"collapse\"]',function(d){var e=a(this);e.attr(\"data-target\")||d.preventDefault();var f=b(e),g=f.data(\"bs.collapse\"),h=g?\"toggle\":e.data();c.call(f,h)})}(jQuery),+function(a){\"use strict\";function b(b){var c=b.attr(\"data-target\");c||(c=b.attr(\"href\"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\\s]*$)/,\"\"));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass(\"open\")&&(c&&\"click\"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event(\"hide.bs.dropdown\",f)),c.isDefaultPrevented()||(d.attr(\"aria-expanded\",\"false\"),e.removeClass(\"open\").trigger(a.Event(\"hidden.bs.dropdown\",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data(\"bs.dropdown\");d||c.data(\"bs.dropdown\",d=new g(this)),\"string\"==typeof b&&d[b].call(c)})}var e=\".dropdown-backdrop\",f='[data-toggle=\"dropdown\"]',g=function(b){a(b).on(\"click.bs.dropdown\",this.toggle)};g.VERSION=\"3.3.7\",g.prototype.toggle=function(d){var e=a(this);if(!e.is(\".disabled, :disabled\")){var f=b(e),g=f.hasClass(\"open\");if(c(),!g){\"ontouchstart\"in document.documentElement&&!f.closest(\".navbar-nav\").length&&a(document.createElement(\"div\")).addClass(\"dropdown-backdrop\").insertAfter(a(this)).on(\"click\",c);var h={relatedTarget:this};if(f.trigger(d=a.Event(\"show.bs.dropdown\",h)),d.isDefaultPrevented())return;e.trigger(\"focus\").attr(\"aria-expanded\",\"true\"),f.toggleClass(\"open\").trigger(a.Event(\"shown.bs.dropdown\",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(\".disabled, :disabled\")){var e=b(d),g=e.hasClass(\"open\");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger(\"focus\"),d.trigger(\"click\");var h=\" li:not(.disabled):visible a\",i=e.find(\".dropdown-menu\"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger(\"focus\")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on(\"click.bs.dropdown.data-api\",c).on(\"click.bs.dropdown.data-api\",\".dropdown form\",function(a){a.stopPropagation()}).on(\"click.bs.dropdown.data-api\",f,g.prototype.toggle).on(\"keydown.bs.dropdown.data-api\",f,g.prototype.keydown).on(\"keydown.bs.dropdown.data-api\",\".dropdown-menu\",g.prototype.keydown)}(jQuery),+function(a){\"use strict\";function b(b,d){return this.each(function(){var e=a(this),f=e.data(\"bs.modal\"),g=a.extend({},c.DEFAULTS,e.data(),\"object\"==typeof b&&b);f||e.data(\"bs.modal\",f=new c(this,g)),\"string\"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(\".modal-dialog\"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(\".modal-content\").load(this.options.remote,a.proxy(function(){this.$element.trigger(\"loaded.bs.modal\")},this))};c.VERSION=\"3.3.7\",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event(\"show.bs.modal\",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass(\"modal-open\"),this.escape(),this.resize(),this.$element.on(\"click.dismiss.bs.modal\",'[data-dismiss=\"modal\"]',a.proxy(this.hide,this)),this.$dialog.on(\"mousedown.dismiss.bs.modal\",function(){d.$element.one(\"mouseup.dismiss.bs.modal\",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass(\"fade\");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass(\"in\"),d.enforceFocus();var f=a.Event(\"shown.bs.modal\",{relatedTarget:b});e?d.$dialog.one(\"bsTransitionEnd\",function(){d.$element.trigger(\"focus\").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger(\"focus\").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event(\"hide.bs.modal\"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off(\"focusin.bs.modal\"),this.$element.removeClass(\"in\").off(\"click.dismiss.bs.modal\").off(\"mouseup.dismiss.bs.modal\"),this.$dialog.off(\"mousedown.dismiss.bs.modal\"),a.support.transition&&this.$element.hasClass(\"fade\")?this.$element.one(\"bsTransitionEnd\",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off(\"focusin.bs.modal\").on(\"focusin.bs.modal\",a.proxy(function(a){document===a.target||this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger(\"focus\")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on(\"keydown.dismiss.bs.modal\",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off(\"keydown.dismiss.bs.modal\")},c.prototype.resize=function(){this.isShown?a(window).on(\"resize.bs.modal\",a.proxy(this.handleUpdate,this)):a(window).off(\"resize.bs.modal\")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass(\"modal-open\"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger(\"hidden.bs.modal\")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass(\"fade\")?\"fade\":\"\";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement(\"div\")).addClass(\"modal-backdrop \"+e).appendTo(this.$body),this.$element.on(\"click.dismiss.bs.modal\",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&(\"static\"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass(\"in\"),!b)return;f?this.$backdrop.one(\"bsTransitionEnd\",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass(\"in\");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass(\"fade\")?this.$backdrop.one(\"bsTransitionEnd\",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:\"\",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:\"\"})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:\"\",paddingRight:\"\"})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css(\"padding-right\")||0,10);this.originalBodyPad=document.body.style.paddingRight||\"\",this.bodyIsOverflowing&&this.$body.css(\"padding-right\",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css(\"padding-right\",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement(\"div\");a.className=\"modal-scrollbar-measure\",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on(\"click.bs.modal.data-api\",'[data-toggle=\"modal\"]',function(c){var d=a(this),e=d.attr(\"href\"),f=a(d.attr(\"data-target\")||e&&e.replace(/.*(?=#[^\\s]+$)/,\"\")),g=f.data(\"bs.modal\")?\"toggle\":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is(\"a\")&&c.preventDefault(),f.one(\"show.bs.modal\",function(a){a.isDefaultPrevented()||f.one(\"hidden.bs.modal\",function(){d.is(\":visible\")&&d.trigger(\"focus\")})}),b.call(f,g,this)})}(jQuery),+function(a){\"use strict\";function b(b){return this.each(function(){var d=a(this),e=d.data(\"bs.tooltip\"),f=\"object\"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data(\"bs.tooltip\",e=new c(this,f)),\"string\"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init(\"tooltip\",a,b)};c.VERSION=\"3.3.7\",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:\"top\",selector:!1,template:'<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',trigger:\"hover focus\",title:\"\",delay:0,html:!1,container:!1,viewport:{selector:\"body\",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error(\"`selector` option must be specified when initializing \"+this.type+\" on the window.document object!\");for(var e=this.options.trigger.split(\" \"),f=e.length;f--;){var g=e[f];if(\"click\"==g)this.$element.on(\"click.\"+this.type,this.options.selector,a.proxy(this.toggle,this));else if(\"manual\"!=g){var h=\"hover\"==g?\"mouseenter\":\"focusin\",i=\"hover\"==g?\"mouseleave\":\"focusout\";this.$element.on(h+\".\"+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+\".\"+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:\"manual\",selector:\"\"}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&\"number\"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data(\"bs.\"+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data(\"bs.\"+this.type,c)),b instanceof a.Event&&(c.inState[\"focusin\"==b.type?\"focus\":\"hover\"]=!0),c.tip().hasClass(\"in\")||\"in\"==c.hoverState?void(c.hoverState=\"in\"):(clearTimeout(c.timeout),c.hoverState=\"in\",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){\"in\"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data(\"bs.\"+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data(\"bs.\"+this.type,c)),b instanceof a.Event&&(c.inState[\"focusout\"==b.type?\"focus\":\"hover\"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState=\"out\",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){\"out\"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event(\"show.bs.\"+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr(\"id\",g),this.$element.attr(\"aria-describedby\",g),this.options.animation&&f.addClass(\"fade\");var h=\"function\"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\\s?auto?\\s?/i,j=i.test(h);j&&(h=h.replace(i,\"\")||\"top\"),f.detach().css({top:0,left:0,display:\"block\"}).addClass(h).data(\"bs.\"+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger(\"inserted.bs.\"+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h=\"bottom\"==h&&k.bottom+m>o.bottom?\"top\":\"top\"==h&&k.top-m<o.top?\"bottom\":\"right\"==h&&k.right+l>o.width?\"left\":\"left\"==h&&k.left-l<o.left?\"right\":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger(\"shown.bs.\"+e.type),e.hoverState=null,\"out\"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass(\"fade\")?f.one(\"bsTransitionEnd\",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css(\"margin-top\"),10),h=parseInt(d.css(\"margin-left\"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass(\"in\");var i=d[0].offsetWidth,j=d[0].offsetHeight;\"top\"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?\"offsetWidth\":\"offsetHeight\";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?\"left\":\"top\",50*(1-a/b)+\"%\").css(c?\"top\":\"left\",\"\")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(\".tooltip-inner\")[this.options.html?\"html\":\"text\"](b),a.removeClass(\"fade in top bottom left right\")},c.prototype.hide=function(b){function d(){\"in\"!=e.hoverState&&f.detach(),e.$element&&e.$element.removeAttr(\"aria-describedby\").trigger(\"hidden.bs.\"+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event(\"hide.bs.\"+this.type);if(this.$element.trigger(g),!g.isDefaultPrevented())return f.removeClass(\"in\"),a.support.transition&&f.hasClass(\"fade\")?f.one(\"bsTransitionEnd\",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this},c.prototype.fixTitle=function(){var a=this.$element;(a.attr(\"title\")||\"string\"!=typeof a.attr(\"data-original-title\"))&&a.attr(\"data-original-title\",a.attr(\"title\")||\"\").attr(\"title\",\"\")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d=\"BODY\"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=window.SVGElement&&c instanceof window.SVGElement,g=d?{top:0,left:0}:f?null:b.offset(),h={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},i=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,h,i,g)},c.prototype.getCalculatedOffset=function(a,b,c,d){return\"bottom\"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:\"top\"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:\"left\"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr(\"data-original-title\")||(\"function\"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+\" `template` option must consist of exactly 1 top-level element!\");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(\".tooltip-arrow\")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data(\"bs.\"+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data(\"bs.\"+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass(\"in\")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off(\".\"+a.type).removeData(\"bs.\"+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){\"use strict\";function b(b){return this.each(function(){var d=a(this),e=d.data(\"bs.popover\"),f=\"object\"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data(\"bs.popover\",e=new c(this,f)),\"string\"==typeof b&&e[b]())})}var c=function(a,b){this.init(\"popover\",a,b)};if(!a.fn.tooltip)throw new Error(\"Popover requires tooltip.js\");c.VERSION=\"3.3.7\",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:\"right\",trigger:\"click\",content:\"\",template:'<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(\".popover-title\")[this.options.html?\"html\":\"text\"](b),a.find(\".popover-content\").children().detach().end()[this.options.html?\"string\"==typeof c?\"html\":\"append\":\"text\"](c),a.removeClass(\"fade top bottom left right in\"),a.find(\".popover-title\").html()||a.find(\".popover-title\").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr(\"data-content\")||(\"function\"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(\".arrow\")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){\"use strict\";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||\"\")+\" .nav li > a\",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on(\"scroll.bs.scrollspy\",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data(\"bs.scrollspy\"),f=\"object\"==typeof c&&c;e||d.data(\"bs.scrollspy\",e=new b(this,f)),\"string\"==typeof c&&e[c]()})}b.VERSION=\"3.3.7\",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c=\"offset\",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c=\"position\",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data(\"target\")||b.attr(\"href\"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(\":visible\")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){\nthis.activeTarget=b,this.clear();var c=this.selector+'[data-target=\"'+b+'\"],'+this.selector+'[href=\"'+b+'\"]',d=a(c).parents(\"li\").addClass(\"active\");d.parent(\".dropdown-menu\").length&&(d=d.closest(\"li.dropdown\").addClass(\"active\")),d.trigger(\"activate.bs.scrollspy\")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,\".active\").removeClass(\"active\")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on(\"load.bs.scrollspy.data-api\",function(){a('[data-spy=\"scroll\"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){\"use strict\";function b(b){return this.each(function(){var d=a(this),e=d.data(\"bs.tab\");e||d.data(\"bs.tab\",e=new c(this)),\"string\"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION=\"3.3.7\",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest(\"ul:not(.dropdown-menu)\"),d=b.data(\"target\");if(d||(d=b.attr(\"href\"),d=d&&d.replace(/.*(?=#[^\\s]*$)/,\"\")),!b.parent(\"li\").hasClass(\"active\")){var e=c.find(\".active:last a\"),f=a.Event(\"hide.bs.tab\",{relatedTarget:b[0]}),g=a.Event(\"show.bs.tab\",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest(\"li\"),c),this.activate(h,h.parent(),function(){e.trigger({type:\"hidden.bs.tab\",relatedTarget:b[0]}),b.trigger({type:\"shown.bs.tab\",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass(\"active\").find(\"> .dropdown-menu > .active\").removeClass(\"active\").end().find('[data-toggle=\"tab\"]').attr(\"aria-expanded\",!1),b.addClass(\"active\").find('[data-toggle=\"tab\"]').attr(\"aria-expanded\",!0),h?(b[0].offsetWidth,b.addClass(\"in\")):b.removeClass(\"fade\"),b.parent(\".dropdown-menu\").length&&b.closest(\"li.dropdown\").addClass(\"active\").end().find('[data-toggle=\"tab\"]').attr(\"aria-expanded\",!0),e&&e()}var g=d.find(\"> .active\"),h=e&&a.support.transition&&(g.length&&g.hasClass(\"fade\")||!!d.find(\"> .fade\").length);g.length&&h?g.one(\"bsTransitionEnd\",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass(\"in\")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),\"show\")};a(document).on(\"click.bs.tab.data-api\",'[data-toggle=\"tab\"]',e).on(\"click.bs.tab.data-api\",'[data-toggle=\"pill\"]',e)}(jQuery),+function(a){\"use strict\";function b(b){return this.each(function(){var d=a(this),e=d.data(\"bs.affix\"),f=\"object\"==typeof b&&b;e||d.data(\"bs.affix\",e=new c(this,f)),\"string\"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on(\"scroll.bs.affix.data-api\",a.proxy(this.checkPosition,this)).on(\"click.bs.affix.data-api\",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION=\"3.3.7\",c.RESET=\"affix affix-top affix-bottom\",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&\"top\"==this.affixed)return e<c&&\"top\";if(\"bottom\"==this.affixed)return null!=c?!(e+this.unpin<=f.top)&&\"bottom\":!(e+g<=a-d)&&\"bottom\";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&e<=c?\"top\":null!=d&&i+j>=a-d&&\"bottom\"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass(\"affix\");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(\":visible\")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());\"object\"!=typeof d&&(f=e=d),\"function\"==typeof e&&(e=d.top(this.$element)),\"function\"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css(\"top\",\"\");var i=\"affix\"+(h?\"-\"+h:\"\"),j=a.Event(i+\".bs.affix\");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin=\"bottom\"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace(\"affix\",\"affixed\")+\".bs.affix\")}\"bottom\"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on(\"load\",function(){a('[data-spy=\"affix\"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC9kaXN0L2pzL2Jvb3RzdHJhcC5taW4uanM/OGZhMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0ZBQXdGLGFBQWEsYUFBYSwyQ0FBMkMsZ0tBQWdLLHNCQUFzQixhQUFhLGFBQWEsNkNBQTZDLDZJQUE2SSw2Q0FBNkMsVUFBVSxTQUFTLHNDQUFzQyxnQkFBZ0IseUNBQXlDLEtBQUssRUFBRSxpQkFBaUIsMkNBQTJDLDRCQUE0QixjQUFjLGlGQUFpRiwyRkFBMkYsMEVBQTBFLEVBQUUsRUFBRSxzQkFBc0IsYUFBYSxjQUFjLDRCQUE0QixtQ0FBbUMscUVBQXFFLEVBQUUsNkNBQTZDLCtCQUErQiwwRUFBMEUsYUFBYSwrQ0FBK0Msc0NBQXNDLDBEQUEwRCxzQkFBc0Isa1FBQWtRLGlCQUFpQix1RUFBdUUseUJBQXlCLCtEQUErRCxzQkFBc0IsYUFBYSxjQUFjLDRCQUE0Qiw0REFBNEQsK0VBQStFLEVBQUUsb0JBQW9CLDJDQUEyQyxrQ0FBa0MsOEJBQThCLHlCQUF5QixrQ0FBa0MseUVBQXlFLHNGQUFzRiw0TEFBNEwsVUFBVSwrQkFBK0IsNERBQTRELGFBQWEsa0NBQWtDLHNVQUFzVSwrR0FBK0csa0JBQWtCLDBFQUEwRSwwQkFBMEIsaUZBQWlGLGtDQUFrQywrTUFBK00sOEZBQThGLDZFQUE2RSxFQUFFLHNCQUFzQixhQUFhLGNBQWMsNEJBQTRCLG1EQUFtRCwyRUFBMkUsMkdBQTJHLEVBQUUsb0JBQW9CLHVkQUF1ZCx3REFBd0QsK0NBQStDLGlDQUFpQyw4Q0FBOEMsZ0JBQWdCLG9CQUFvQixNQUFNLG9CQUFvQixNQUFNLGVBQWUsb0JBQW9CLCtCQUErQiw0TEFBNEwsc0NBQXNDLG1GQUFtRiwrQ0FBK0Msa0ZBQWtGLGtDQUFrQyxnREFBZ0QseUJBQXlCLDRCQUE0QixnRkFB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QUFjLDRCQUE0QiwyREFBMkQsaUVBQWlFLEVBQUUsb0JBQW9CLHdCQUF3QixpU0FBaVMscUVBQXFFLHVCQUF1Qix3Q0FBd0MsZ0ZBQWdGLGtEQUFrRCxnR0FBZ0csNkNBQTZDLHVEQUF1RCx3Q0FBd0MsOENBQThDLHFEQUFxRCx3REFBd0QsaUNBQWlDLG1EQUFtRCwrQ0FBK0Msc0NBQXNDLGlDQUFpQyxpSUFBaUksNkhBQTZILDZCQUE2QixvQkFBb0IsOENBQThDLG9EQUFvRCwwREFBMEQsbUtBQW1LLG1DQUFtQyxVQUFVLElBQUksaUJBQWlCLHVFQUF1RSx5QkFBeUIsZ0NBQWdDLHdDQUF3Qyx5QkFBeUIscUJBQXFCLGtIQUFrSCxFQUFFLEVBQUUiLCJmaWxlIjoiNTAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEJvb3RzdHJhcCB2My4zLjcgKGh0dHA6Ly9nZXRib290c3RyYXAuY29tKVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqL1xuaWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGpRdWVyeSl0aHJvdyBuZXcgRXJyb3IoXCJCb290c3RyYXAncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGpRdWVyeVwiKTsrZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9YS5mbi5qcXVlcnkuc3BsaXQoXCIgXCIpWzBdLnNwbGl0KFwiLlwiKTtpZihiWzBdPDImJmJbMV08OXx8MT09YlswXSYmOT09YlsxXSYmYlsyXTwxfHxiWzBdPjMpdGhyb3cgbmV3IEVycm9yKFwiQm9vdHN0cmFwJ3MgSmF2YVNjcmlwdCByZXF1aXJlcyBqUXVlcnkgdmVyc2lvbiAxLjkuMSBvciBoaWdoZXIsIGJ1dCBsb3dlciB0aGFuIHZlcnNpb24gNFwiKX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJib290c3RyYXBcIiksYj17V2Via2l0VHJhbnNpdGlvbjpcIndlYmtpdFRyYW5zaXRpb25FbmRcIixNb3pUcmFuc2l0aW9uOlwidHJhbnNpdGlvbmVuZFwiLE9UcmFuc2l0aW9uOlwib1RyYW5zaXRpb25FbmQgb3RyYW5zaXRpb25lbmRcIix0cmFuc2l0aW9uOlwidHJhbnNpdGlvbmVuZFwifTtmb3IodmFyIGMgaW4gYilpZih2b2lkIDAhPT1hLnN0eWxlW2NdKXJldHVybntlbmQ6YltjXX07cmV0dXJuITF9YS5mbi5lbXVsYXRlVHJhbnNpdGlvbkVuZD1mdW5jdGlvbihiKXt2YXIgYz0hMSxkPXRoaXM7YSh0aGlzKS5vbmUoXCJic1RyYW5zaXRpb25FbmRcIixmdW5jdGlvbigpe2M9ITB9KTt2YXIgZT1mdW5jdGlvbigpe2N8fGEoZCkudHJpZ2dlcihhLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQpfTtyZXR1cm4gc2V0VGltZW91dChlLGIpLHRoaXN9LGEoZnVuY3Rpb24oKXthLnN1cHBvcnQudHJhbnNpdGlvbj1iKCksYS5zdXBwb3J0LnRyYW5zaXRpb24mJihhLmV2ZW50LnNwZWNpYWwuYnNUcmFuc2l0aW9uRW5kPXtiaW5kVHlwZTphLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsZGVsZWdhdGVUeXBlOmEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCxoYW5kbGU6ZnVuY3Rpb24oYil7aWYoYShiLnRhcmdldCkuaXModGhpcykpcmV0dXJuIGIuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZT1jLmRhdGEoXCJicy5hbGVydFwiKTtlfHxjLmRhdGEoXCJicy5hbGVydFwiLGU9bmV3IGQodGhpcykpLFwic3RyaW5nXCI9PXR5cGVvZiBiJiZlW2JdLmNhbGwoYyl9KX12YXIgYz0nW2RhdGEtZGlzbWlzcz1cImFsZXJ0XCJdJyxkPWZ1bmN0aW9uKGIpe2EoYikub24oXCJjbGlja1wiLGMsdGhpcy5jbG9zZSl9O2QuVkVSU0lPTj1cIjMuMy43XCIsZC5UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxkLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbihiKXtmdW5jdGlvbiBjKCl7Zy5kZXRhY2goKS50cmlnZ2VyKFwiY2xvc2VkLmJzLmFsZXJ0XCIpLnJlbW92ZSgpfXZhciBlPWEodGhpcyksZj1lLmF0dHIoXCJkYXRhLXRhcmdldFwiKTtmfHwoZj1lLmF0dHIoXCJocmVmXCIpLGY9ZiYmZi5yZXBsYWNlKC8uKig/PSNbXlxcc10qJCkvLFwiXCIpKTt2YXIgZz1hKFwiI1wiPT09Zj9bXTpmKTtiJiZiLnByZXZlbnREZWZhdWx0KCksZy5sZW5ndGh8fChnPWUuY2xvc2VzdChcIi5hbGVydFwiKSksZy50cmlnZ2VyKGI9YS5FdmVudChcImNsb3NlLmJzLmFsZXJ0XCIpKSxiLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwoZy5yZW1vdmVDbGFzcyhcImluXCIpLGEuc3VwcG9ydC50cmFuc2l0aW9uJiZnLmhhc0NsYXNzKFwiZmFkZVwiKT9nLm9uZShcImJzVHJhbnNpdGlvbkVuZFwiLGMpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGQuVFJBTlNJVElPTl9EVVJBVElPTik6YygpKX07dmFyIGU9YS5mbi5hbGVydDthLmZuLmFsZXJ0PWIsYS5mbi5hbGVydC5Db25zdHJ1Y3Rvcj1kLGEuZm4uYWxlcnQubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLmFsZXJ0PWUsdGhpc30sYShkb2N1bWVudCkub24oXCJjbGljay5icy5hbGVydC5kYXRhLWFwaVwiLGMsZC5wcm90b3R5cGUuY2xvc2UpfShqUXVlcnkpLCtmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBiKGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hKHRoaXMpLGU9ZC5kYXRhKFwiYnMuYnV0dG9uXCIpLGY9XCJvYmplY3RcIj09dHlwZW9mIGImJmI7ZXx8ZC5kYXRhKFwiYnMuYnV0dG9uXCIsZT1uZXcgYyh0aGlzLGYpKSxcInRvZ2dsZVwiPT1iP2UudG9nZ2xlKCk6YiYmZS5zZXRTdGF0ZShiKX0pfXZhciBjPWZ1bmN0aW9uKGIsZCl7dGhpcy4kZWxlbWVudD1hKGIpLHRoaXMub3B0aW9ucz1hLmV4dGVuZCh7fSxjLkRFRkFVTFRTLGQpLHRoaXMuaXNMb2FkaW5nPSExfTtjLlZFUlNJT049XCIzLjMuN1wiLGMuREVGQVVMVFM9e2xvYWRpbmdUZXh0OlwibG9hZGluZy4uLlwifSxjLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihiKXt2YXIgYz1cImRpc2FibGVkXCIsZD10aGlzLiRlbGVtZW50LGU9ZC5pcyhcImlucHV0XCIpP1widmFsXCI6XCJodG1sXCIsZj1kLmRhdGEoKTtiKz1cIlRleHRcIixudWxsPT1mLnJlc2V0VGV4dCYmZC5kYXRhKFwicmVzZXRUZXh0XCIsZFtlXSgpKSxzZXRUaW1lb3V0KGEucHJveHkoZnVuY3Rpb24oKXtkW2VdKG51bGw9PWZbYl0/dGhpcy5vcHRpb25zW2JdOmZbYl0pLFwibG9hZGluZ1RleHRcIj09Yj8odGhpcy5pc0xvYWRpbmc9ITAsZC5hZGRDbGFzcyhjKS5hdHRyKGMsYykucHJvcChjLCEwKSk6dGhpcy5pc0xvYWRpbmcmJih0aGlzLmlzTG9hZGluZz0hMSxkLnJlbW92ZUNsYXNzKGMpLnJlbW92ZUF0dHIoYykucHJvcChjLCExKSl9LHRoaXMpLDApfSxjLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24oKXt2YXIgYT0hMCxiPXRoaXMuJGVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtdG9nZ2xlPVwiYnV0dG9uc1wiXScpO2lmKGIubGVuZ3RoKXt2YXIgYz10aGlzLiRlbGVtZW50LmZpbmQoXCJpbnB1dFwiKTtcInJhZGlvXCI9PWMucHJvcChcInR5cGVcIik/KGMucHJvcChcImNoZWNrZWRcIikmJihhPSExKSxiLmZpbmQoXCIuYWN0aXZlXCIpLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpLHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJhY3RpdmVcIikpOlwiY2hlY2tib3hcIj09Yy5wcm9wKFwidHlwZVwiKSYmKGMucHJvcChcImNoZWNrZWRcIikhPT10aGlzLiRlbGVtZW50Lmhhc0NsYXNzKFwiYWN0aXZlXCIpJiYoYT0hMSksdGhpcy4kZWxlbWVudC50b2dnbGVDbGFzcyhcImFjdGl2ZVwiKSksYy5wcm9wKFwiY2hlY2tlZFwiLHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoXCJhY3RpdmVcIikpLGEmJmMudHJpZ2dlcihcImNoYW5nZVwiKX1lbHNlIHRoaXMuJGVsZW1lbnQuYXR0cihcImFyaWEtcHJlc3NlZFwiLCF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKFwiYWN0aXZlXCIpKSx0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKFwiYWN0aXZlXCIpfTt2YXIgZD1hLmZuLmJ1dHRvbjthLmZuLmJ1dHRvbj1iLGEuZm4uYnV0dG9uLkNvbnN0cnVjdG9yPWMsYS5mbi5idXR0b24ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLmJ1dHRvbj1kLHRoaXN9LGEoZG9jdW1lbnQpLm9uKFwiY2xpY2suYnMuYnV0dG9uLmRhdGEtYXBpXCIsJ1tkYXRhLXRvZ2dsZV49XCJidXR0b25cIl0nLGZ1bmN0aW9uKGMpe3ZhciBkPWEoYy50YXJnZXQpLmNsb3Nlc3QoXCIuYnRuXCIpO2IuY2FsbChkLFwidG9nZ2xlXCIpLGEoYy50YXJnZXQpLmlzKCdpbnB1dFt0eXBlPVwicmFkaW9cIl0sIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScpfHwoYy5wcmV2ZW50RGVmYXVsdCgpLGQuaXMoXCJpbnB1dCxidXR0b25cIik/ZC50cmlnZ2VyKFwiZm9jdXNcIik6ZC5maW5kKFwiaW5wdXQ6dmlzaWJsZSxidXR0b246dmlzaWJsZVwiKS5maXJzdCgpLnRyaWdnZXIoXCJmb2N1c1wiKSl9KS5vbihcImZvY3VzLmJzLmJ1dHRvbi5kYXRhLWFwaSBibHVyLmJzLmJ1dHRvbi5kYXRhLWFwaVwiLCdbZGF0YS10b2dnbGVePVwiYnV0dG9uXCJdJyxmdW5jdGlvbihiKXthKGIudGFyZ2V0KS5jbG9zZXN0KFwiLmJ0blwiKS50b2dnbGVDbGFzcyhcImZvY3VzXCIsL15mb2N1cyhpbik/JC8udGVzdChiLnR5cGUpKX0pfShqUXVlcnkpLCtmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBiKGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hKHRoaXMpLGU9ZC5kYXRhKFwiYnMuY2Fyb3VzZWxcIiksZj1hLmV4dGVuZCh7fSxjLkRFRkFVTFRTLGQuZGF0YSgpLFwib2JqZWN0XCI9PXR5cGVvZiBiJiZiKSxnPVwic3RyaW5nXCI9PXR5cGVvZiBiP2I6Zi5zbGlkZTtlfHxkLmRhdGEoXCJicy5jYXJvdXNlbFwiLGU9bmV3IGModGhpcyxmKSksXCJudW1iZXJcIj09dHlwZW9mIGI/ZS50byhiKTpnP2VbZ10oKTpmLmludGVydmFsJiZlLnBhdXNlKCkuY3ljbGUoKX0pfXZhciBjPWZ1bmN0aW9uKGIsYyl7dGhpcy4kZWxlbWVudD1hKGIpLHRoaXMuJGluZGljYXRvcnM9dGhpcy4kZWxlbWVudC5maW5kKFwiLmNhcm91c2VsLWluZGljYXRvcnNcIiksdGhpcy5vcHRpb25zPWMsdGhpcy5wYXVzZWQ9bnVsbCx0aGlzLnNsaWRpbmc9bnVsbCx0aGlzLmludGVydmFsPW51bGwsdGhpcy4kYWN0aXZlPW51bGwsdGhpcy4kaXRlbXM9bnVsbCx0aGlzLm9wdGlvbnMua2V5Ym9hcmQmJnRoaXMuJGVsZW1lbnQub24oXCJrZXlkb3duLmJzLmNhcm91c2VsXCIsYS5wcm94eSh0aGlzLmtleWRvd24sdGhpcykpLFwiaG92ZXJcIj09dGhpcy5vcHRpb25zLnBhdXNlJiYhKFwib250b3VjaHN0YXJ0XCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpJiZ0aGlzLiRlbGVtZW50Lm9uKFwibW91c2VlbnRlci5icy5jYXJvdXNlbFwiLGEucHJveHkodGhpcy5wYXVzZSx0aGlzKSkub24oXCJtb3VzZWxlYXZlLmJzLmNhcm91c2VsXCIsYS5wcm94eSh0aGlzLmN5Y2xlLHRoaXMpKX07Yy5WRVJTSU9OPVwiMy4zLjdcIixjLlRSQU5TSVRJT05fRFVSQVRJT049NjAwLGMuREVGQVVMVFM9e2ludGVydmFsOjVlMyxwYXVzZTpcImhvdmVyXCIsd3JhcDohMCxrZXlib2FyZDohMH0sYy5wcm90b3R5cGUua2V5ZG93bj1mdW5jdGlvbihhKXtpZighL2lucHV0fHRleHRhcmVhL2kudGVzdChhLnRhcmdldC50YWdOYW1lKSl7c3dpdGNoKGEud2hpY2gpe2Nhc2UgMzc6dGhpcy5wcmV2KCk7YnJlYWs7Y2FzZSAzOTp0aGlzLm5leHQoKTticmVhaztkZWZhdWx0OnJldHVybn1hLnByZXZlbnREZWZhdWx0KCl9fSxjLnByb3RvdHlwZS5jeWNsZT1mdW5jdGlvbihiKXtyZXR1cm4gYnx8KHRoaXMucGF1c2VkPSExKSx0aGlzLmludGVydmFsJiZjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpLHRoaXMub3B0aW9ucy5pbnRlcnZhbCYmIXRoaXMucGF1c2VkJiYodGhpcy5pbnRlcnZhbD1zZXRJbnRlcnZhbChhLnByb3h5KHRoaXMubmV4dCx0aGlzKSx0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpKSx0aGlzfSxjLnByb3RvdHlwZS5nZXRJdGVtSW5kZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJGl0ZW1zPWEucGFyZW50KCkuY2hpbGRyZW4oXCIuaXRlbVwiKSx0aGlzLiRpdGVtcy5pbmRleChhfHx0aGlzLiRhY3RpdmUpfSxjLnByb3RvdHlwZS5nZXRJdGVtRm9yRGlyZWN0aW9uPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5nZXRJdGVtSW5kZXgoYiksZD1cInByZXZcIj09YSYmMD09PWN8fFwibmV4dFwiPT1hJiZjPT10aGlzLiRpdGVtcy5sZW5ndGgtMTtpZihkJiYhdGhpcy5vcHRpb25zLndyYXApcmV0dXJuIGI7dmFyIGU9XCJwcmV2XCI9PWE/LTE6MSxmPShjK2UpJXRoaXMuJGl0ZW1zLmxlbmd0aDtyZXR1cm4gdGhpcy4kaXRlbXMuZXEoZil9LGMucHJvdG90eXBlLnRvPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz10aGlzLmdldEl0ZW1JbmRleCh0aGlzLiRhY3RpdmU9dGhpcy4kZWxlbWVudC5maW5kKFwiLml0ZW0uYWN0aXZlXCIpKTtpZighKGE+dGhpcy4kaXRlbXMubGVuZ3RoLTF8fGE8MCkpcmV0dXJuIHRoaXMuc2xpZGluZz90aGlzLiRlbGVtZW50Lm9uZShcInNsaWQuYnMuY2Fyb3VzZWxcIixmdW5jdGlvbigpe2IudG8oYSl9KTpjPT1hP3RoaXMucGF1c2UoKS5jeWNsZSgpOnRoaXMuc2xpZGUoYT5jP1wibmV4dFwiOlwicHJldlwiLHRoaXMuJGl0ZW1zLmVxKGEpKX0sYy5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oYil7cmV0dXJuIGJ8fCh0aGlzLnBhdXNlZD0hMCksdGhpcy4kZWxlbWVudC5maW5kKFwiLm5leHQsIC5wcmV2XCIpLmxlbmd0aCYmYS5zdXBwb3J0LnRyYW5zaXRpb24mJih0aGlzLiRlbGVtZW50LnRyaWdnZXIoYS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kKSx0aGlzLmN5Y2xlKCEwKSksdGhpcy5pbnRlcnZhbD1jbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpLHRoaXN9LGMucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZighdGhpcy5zbGlkaW5nKXJldHVybiB0aGlzLnNsaWRlKFwibmV4dFwiKX0sYy5wcm90b3R5cGUucHJldj1mdW5jdGlvbigpe2lmKCF0aGlzLnNsaWRpbmcpcmV0dXJuIHRoaXMuc2xpZGUoXCJwcmV2XCIpfSxjLnByb3RvdHlwZS5zbGlkZT1mdW5jdGlvbihiLGQpe3ZhciBlPXRoaXMuJGVsZW1lbnQuZmluZChcIi5pdGVtLmFjdGl2ZVwiKSxmPWR8fHRoaXMuZ2V0SXRlbUZvckRpcmVjdGlvbihiLGUpLGc9dGhpcy5pbnRlcnZhbCxoPVwibmV4dFwiPT1iP1wibGVmdFwiOlwicmlnaHRcIixpPXRoaXM7aWYoZi5oYXNDbGFzcyhcImFjdGl2ZVwiKSlyZXR1cm4gdGhpcy5zbGlkaW5nPSExO3ZhciBqPWZbMF0saz1hLkV2ZW50KFwic2xpZGUuYnMuY2Fyb3VzZWxcIix7cmVsYXRlZFRhcmdldDpqLGRpcmVjdGlvbjpofSk7aWYodGhpcy4kZWxlbWVudC50cmlnZ2VyKGspLCFrLmlzRGVmYXVsdFByZXZlbnRlZCgpKXtpZih0aGlzLnNsaWRpbmc9ITAsZyYmdGhpcy5wYXVzZSgpLHRoaXMuJGluZGljYXRvcnMubGVuZ3RoKXt0aGlzLiRpbmRpY2F0b3JzLmZpbmQoXCIuYWN0aXZlXCIpLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO3ZhciBsPWEodGhpcy4kaW5kaWNhdG9ycy5jaGlsZHJlbigpW3RoaXMuZ2V0SXRlbUluZGV4KGYpXSk7bCYmbC5hZGRDbGFzcyhcImFjdGl2ZVwiKX12YXIgbT1hLkV2ZW50KFwic2xpZC5icy5jYXJvdXNlbFwiLHtyZWxhdGVkVGFyZ2V0OmosZGlyZWN0aW9uOmh9KTtyZXR1cm4gYS5zdXBwb3J0LnRyYW5zaXRpb24mJnRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoXCJzbGlkZVwiKT8oZi5hZGRDbGFzcyhiKSxmWzBdLm9mZnNldFdpZHRoLGUuYWRkQ2xhc3MoaCksZi5hZGRDbGFzcyhoKSxlLm9uZShcImJzVHJhbnNpdGlvbkVuZFwiLGZ1bmN0aW9uKCl7Zi5yZW1vdmVDbGFzcyhbYixoXS5qb2luKFwiIFwiKSkuYWRkQ2xhc3MoXCJhY3RpdmVcIiksZS5yZW1vdmVDbGFzcyhbXCJhY3RpdmVcIixoXS5qb2luKFwiIFwiKSksaS5zbGlkaW5nPSExLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpLiRlbGVtZW50LnRyaWdnZXIobSl9LDApfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoYy5UUkFOU0lUSU9OX0RVUkFUSU9OKSk6KGUucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIiksZi5hZGRDbGFzcyhcImFjdGl2ZVwiKSx0aGlzLnNsaWRpbmc9ITEsdGhpcy4kZWxlbWVudC50cmlnZ2VyKG0pKSxnJiZ0aGlzLmN5Y2xlKCksdGhpc319O3ZhciBkPWEuZm4uY2Fyb3VzZWw7YS5mbi5jYXJvdXNlbD1iLGEuZm4uY2Fyb3VzZWwuQ29uc3RydWN0b3I9YyxhLmZuLmNhcm91c2VsLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5jYXJvdXNlbD1kLHRoaXN9O3ZhciBlPWZ1bmN0aW9uKGMpe3ZhciBkLGU9YSh0aGlzKSxmPWEoZS5hdHRyKFwiZGF0YS10YXJnZXRcIil8fChkPWUuYXR0cihcImhyZWZcIikpJiZkLnJlcGxhY2UoLy4qKD89I1teXFxzXSskKS8sXCJcIikpO2lmKGYuaGFzQ2xhc3MoXCJjYXJvdXNlbFwiKSl7dmFyIGc9YS5leHRlbmQoe30sZi5kYXRhKCksZS5kYXRhKCkpLGg9ZS5hdHRyKFwiZGF0YS1zbGlkZS10b1wiKTtoJiYoZy5pbnRlcnZhbD0hMSksYi5jYWxsKGYsZyksaCYmZi5kYXRhKFwiYnMuY2Fyb3VzZWxcIikudG8oaCksYy5wcmV2ZW50RGVmYXVsdCgpfX07YShkb2N1bWVudCkub24oXCJjbGljay5icy5jYXJvdXNlbC5kYXRhLWFwaVwiLFwiW2RhdGEtc2xpZGVdXCIsZSkub24oXCJjbGljay5icy5jYXJvdXNlbC5kYXRhLWFwaVwiLFwiW2RhdGEtc2xpZGUtdG9dXCIsZSksYSh3aW5kb3cpLm9uKFwibG9hZFwiLGZ1bmN0aW9uKCl7YSgnW2RhdGEtcmlkZT1cImNhcm91c2VsXCJdJykuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyk7Yi5jYWxsKGMsYy5kYXRhKCkpfSl9KX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYihiKXt2YXIgYyxkPWIuYXR0cihcImRhdGEtdGFyZ2V0XCIpfHwoYz1iLmF0dHIoXCJocmVmXCIpKSYmYy5yZXBsYWNlKC8uKig/PSNbXlxcc10rJCkvLFwiXCIpO3JldHVybiBhKGQpfWZ1bmN0aW9uIGMoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZT1jLmRhdGEoXCJicy5jb2xsYXBzZVwiKSxmPWEuZXh0ZW5kKHt9LGQuREVGQVVMVFMsYy5kYXRhKCksXCJvYmplY3RcIj09dHlwZW9mIGImJmIpOyFlJiZmLnRvZ2dsZSYmL3Nob3d8aGlkZS8udGVzdChiKSYmKGYudG9nZ2xlPSExKSxlfHxjLmRhdGEoXCJicy5jb2xsYXBzZVwiLGU9bmV3IGQodGhpcyxmKSksXCJzdHJpbmdcIj09dHlwZW9mIGImJmVbYl0oKX0pfXZhciBkPWZ1bmN0aW9uKGIsYyl7dGhpcy4kZWxlbWVudD1hKGIpLHRoaXMub3B0aW9ucz1hLmV4dGVuZCh7fSxkLkRFRkFVTFRTLGMpLHRoaXMuJHRyaWdnZXI9YSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl1baHJlZj1cIiMnK2IuaWQrJ1wiXSxbZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiXVtkYXRhLXRhcmdldD1cIiMnK2IuaWQrJ1wiXScpLHRoaXMudHJhbnNpdGlvbmluZz1udWxsLHRoaXMub3B0aW9ucy5wYXJlbnQ/dGhpcy4kcGFyZW50PXRoaXMuZ2V0UGFyZW50KCk6dGhpcy5hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModGhpcy4kZWxlbWVudCx0aGlzLiR0cmlnZ2VyKSx0aGlzLm9wdGlvbnMudG9nZ2xlJiZ0aGlzLnRvZ2dsZSgpfTtkLlZFUlNJT049XCIzLjMuN1wiLGQuVFJBTlNJVElPTl9EVVJBVElPTj0zNTAsZC5ERUZBVUxUUz17dG9nZ2xlOiEwfSxkLnByb3RvdHlwZS5kaW1lbnNpb249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRlbGVtZW50Lmhhc0NsYXNzKFwid2lkdGhcIik7cmV0dXJuIGE/XCJ3aWR0aFwiOlwiaGVpZ2h0XCJ9LGQucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXtpZighdGhpcy50cmFuc2l0aW9uaW5nJiYhdGhpcy4kZWxlbWVudC5oYXNDbGFzcyhcImluXCIpKXt2YXIgYixlPXRoaXMuJHBhcmVudCYmdGhpcy4kcGFyZW50LmNoaWxkcmVuKFwiLnBhbmVsXCIpLmNoaWxkcmVuKFwiLmluLCAuY29sbGFwc2luZ1wiKTtpZighKGUmJmUubGVuZ3RoJiYoYj1lLmRhdGEoXCJicy5jb2xsYXBzZVwiKSxiJiZiLnRyYW5zaXRpb25pbmcpKSl7dmFyIGY9YS5FdmVudChcInNob3cuYnMuY29sbGFwc2VcIik7aWYodGhpcy4kZWxlbWVudC50cmlnZ2VyKGYpLCFmLmlzRGVmYXVsdFByZXZlbnRlZCgpKXtlJiZlLmxlbmd0aCYmKGMuY2FsbChlLFwiaGlkZVwiKSxifHxlLmRhdGEoXCJicy5jb2xsYXBzZVwiLG51bGwpKTt2YXIgZz10aGlzLmRpbWVuc2lvbigpO3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJjb2xsYXBzZVwiKS5hZGRDbGFzcyhcImNvbGxhcHNpbmdcIilbZ10oMCkuYXR0cihcImFyaWEtZXhwYW5kZWRcIiwhMCksdGhpcy4kdHJpZ2dlci5yZW1vdmVDbGFzcyhcImNvbGxhcHNlZFwiKS5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLCEwKSx0aGlzLnRyYW5zaXRpb25pbmc9MTt2YXIgaD1mdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJjb2xsYXBzaW5nXCIpLmFkZENsYXNzKFwiY29sbGFwc2UgaW5cIilbZ10oXCJcIiksdGhpcy50cmFuc2l0aW9uaW5nPTAsdGhpcy4kZWxlbWVudC50cmlnZ2VyKFwic2hvd24uYnMuY29sbGFwc2VcIil9O2lmKCFhLnN1cHBvcnQudHJhbnNpdGlvbilyZXR1cm4gaC5jYWxsKHRoaXMpO3ZhciBpPWEuY2FtZWxDYXNlKFtcInNjcm9sbFwiLGddLmpvaW4oXCItXCIpKTt0aGlzLiRlbGVtZW50Lm9uZShcImJzVHJhbnNpdGlvbkVuZFwiLGEucHJveHkoaCx0aGlzKSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoZC5UUkFOU0lUSU9OX0RVUkFUSU9OKVtnXSh0aGlzLiRlbGVtZW50WzBdW2ldKX19fX0sZC5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe2lmKCF0aGlzLnRyYW5zaXRpb25pbmcmJnRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoXCJpblwiKSl7dmFyIGI9YS5FdmVudChcImhpZGUuYnMuY29sbGFwc2VcIik7aWYodGhpcy4kZWxlbWVudC50cmlnZ2VyKGIpLCFiLmlzRGVmYXVsdFByZXZlbnRlZCgpKXt2YXIgYz10aGlzLmRpbWVuc2lvbigpO3RoaXMuJGVsZW1lbnRbY10odGhpcy4kZWxlbWVudFtjXSgpKVswXS5vZmZzZXRIZWlnaHQsdGhpcy4kZWxlbWVudC5hZGRDbGFzcyhcImNvbGxhcHNpbmdcIikucmVtb3ZlQ2xhc3MoXCJjb2xsYXBzZSBpblwiKS5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLCExKSx0aGlzLiR0cmlnZ2VyLmFkZENsYXNzKFwiY29sbGFwc2VkXCIpLmF0dHIoXCJhcmlhLWV4cGFuZGVkXCIsITEpLHRoaXMudHJhbnNpdGlvbmluZz0xO3ZhciBlPWZ1bmN0aW9uKCl7dGhpcy50cmFuc2l0aW9uaW5nPTAsdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyhcImNvbGxhcHNpbmdcIikuYWRkQ2xhc3MoXCJjb2xsYXBzZVwiKS50cmlnZ2VyKFwiaGlkZGVuLmJzLmNvbGxhcHNlXCIpfTtyZXR1cm4gYS5zdXBwb3J0LnRyYW5zaXRpb24/dm9pZCB0aGlzLiRlbGVtZW50W2NdKDApLm9uZShcImJzVHJhbnNpdGlvbkVuZFwiLGEucHJveHkoZSx0aGlzKSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoZC5UUkFOU0lUSU9OX0RVUkFUSU9OKTplLmNhbGwodGhpcyl9fX0sZC5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKCl7dGhpc1t0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKFwiaW5cIik/XCJoaWRlXCI6XCJzaG93XCJdKCl9LGQucHJvdG90eXBlLmdldFBhcmVudD1mdW5jdGlvbigpe3JldHVybiBhKHRoaXMub3B0aW9ucy5wYXJlbnQpLmZpbmQoJ1tkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCJdW2RhdGEtcGFyZW50PVwiJyt0aGlzLm9wdGlvbnMucGFyZW50KydcIl0nKS5lYWNoKGEucHJveHkoZnVuY3Rpb24oYyxkKXt2YXIgZT1hKGQpO3RoaXMuYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKGIoZSksZSl9LHRoaXMpKS5lbmQoKX0sZC5wcm90b3R5cGUuYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5oYXNDbGFzcyhcImluXCIpO2EuYXR0cihcImFyaWEtZXhwYW5kZWRcIixjKSxiLnRvZ2dsZUNsYXNzKFwiY29sbGFwc2VkXCIsIWMpLmF0dHIoXCJhcmlhLWV4cGFuZGVkXCIsYyl9O3ZhciBlPWEuZm4uY29sbGFwc2U7YS5mbi5jb2xsYXBzZT1jLGEuZm4uY29sbGFwc2UuQ29uc3RydWN0b3I9ZCxhLmZuLmNvbGxhcHNlLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5jb2xsYXBzZT1lLHRoaXN9LGEoZG9jdW1lbnQpLm9uKFwiY2xpY2suYnMuY29sbGFwc2UuZGF0YS1hcGlcIiwnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLGZ1bmN0aW9uKGQpe3ZhciBlPWEodGhpcyk7ZS5hdHRyKFwiZGF0YS10YXJnZXRcIil8fGQucHJldmVudERlZmF1bHQoKTt2YXIgZj1iKGUpLGc9Zi5kYXRhKFwiYnMuY29sbGFwc2VcIiksaD1nP1widG9nZ2xlXCI6ZS5kYXRhKCk7Yy5jYWxsKGYsaCl9KX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYihiKXt2YXIgYz1iLmF0dHIoXCJkYXRhLXRhcmdldFwiKTtjfHwoYz1iLmF0dHIoXCJocmVmXCIpLGM9YyYmLyNbQS1aYS16XS8udGVzdChjKSYmYy5yZXBsYWNlKC8uKig/PSNbXlxcc10qJCkvLFwiXCIpKTt2YXIgZD1jJiZhKGMpO3JldHVybiBkJiZkLmxlbmd0aD9kOmIucGFyZW50KCl9ZnVuY3Rpb24gYyhjKXtjJiYzPT09Yy53aGljaHx8KGEoZSkucmVtb3ZlKCksYShmKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWIoZCksZj17cmVsYXRlZFRhcmdldDp0aGlzfTtlLmhhc0NsYXNzKFwib3BlblwiKSYmKGMmJlwiY2xpY2tcIj09Yy50eXBlJiYvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGMudGFyZ2V0LnRhZ05hbWUpJiZhLmNvbnRhaW5zKGVbMF0sYy50YXJnZXQpfHwoZS50cmlnZ2VyKGM9YS5FdmVudChcImhpZGUuYnMuZHJvcGRvd25cIixmKSksYy5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8KGQuYXR0cihcImFyaWEtZXhwYW5kZWRcIixcImZhbHNlXCIpLGUucmVtb3ZlQ2xhc3MoXCJvcGVuXCIpLnRyaWdnZXIoYS5FdmVudChcImhpZGRlbi5icy5kcm9wZG93blwiLGYpKSkpKX0pKX1mdW5jdGlvbiBkKGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9Yy5kYXRhKFwiYnMuZHJvcGRvd25cIik7ZHx8Yy5kYXRhKFwiYnMuZHJvcGRvd25cIixkPW5ldyBnKHRoaXMpKSxcInN0cmluZ1wiPT10eXBlb2YgYiYmZFtiXS5jYWxsKGMpfSl9dmFyIGU9XCIuZHJvcGRvd24tYmFja2Ryb3BcIixmPSdbZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScsZz1mdW5jdGlvbihiKXthKGIpLm9uKFwiY2xpY2suYnMuZHJvcGRvd25cIix0aGlzLnRvZ2dsZSl9O2cuVkVSU0lPTj1cIjMuMy43XCIsZy5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKGQpe3ZhciBlPWEodGhpcyk7aWYoIWUuaXMoXCIuZGlzYWJsZWQsIDpkaXNhYmxlZFwiKSl7dmFyIGY9YihlKSxnPWYuaGFzQ2xhc3MoXCJvcGVuXCIpO2lmKGMoKSwhZyl7XCJvbnRvdWNoc3RhcnRcImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmIWYuY2xvc2VzdChcIi5uYXZiYXItbmF2XCIpLmxlbmd0aCYmYShkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKS5hZGRDbGFzcyhcImRyb3Bkb3duLWJhY2tkcm9wXCIpLmluc2VydEFmdGVyKGEodGhpcykpLm9uKFwiY2xpY2tcIixjKTt2YXIgaD17cmVsYXRlZFRhcmdldDp0aGlzfTtpZihmLnRyaWdnZXIoZD1hLkV2ZW50KFwic2hvdy5icy5kcm9wZG93blwiLGgpKSxkLmlzRGVmYXVsdFByZXZlbnRlZCgpKXJldHVybjtlLnRyaWdnZXIoXCJmb2N1c1wiKS5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLFwidHJ1ZVwiKSxmLnRvZ2dsZUNsYXNzKFwib3BlblwiKS50cmlnZ2VyKGEuRXZlbnQoXCJzaG93bi5icy5kcm9wZG93blwiLGgpKX1yZXR1cm4hMX19LGcucHJvdG90eXBlLmtleWRvd249ZnVuY3Rpb24oYyl7aWYoLygzOHw0MHwyN3wzMikvLnRlc3QoYy53aGljaCkmJiEvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGMudGFyZ2V0LnRhZ05hbWUpKXt2YXIgZD1hKHRoaXMpO2lmKGMucHJldmVudERlZmF1bHQoKSxjLnN0b3BQcm9wYWdhdGlvbigpLCFkLmlzKFwiLmRpc2FibGVkLCA6ZGlzYWJsZWRcIikpe3ZhciBlPWIoZCksZz1lLmhhc0NsYXNzKFwib3BlblwiKTtpZighZyYmMjchPWMud2hpY2h8fGcmJjI3PT1jLndoaWNoKXJldHVybiAyNz09Yy53aGljaCYmZS5maW5kKGYpLnRyaWdnZXIoXCJmb2N1c1wiKSxkLnRyaWdnZXIoXCJjbGlja1wiKTt2YXIgaD1cIiBsaTpub3QoLmRpc2FibGVkKTp2aXNpYmxlIGFcIixpPWUuZmluZChcIi5kcm9wZG93bi1tZW51XCIraCk7aWYoaS5sZW5ndGgpe3ZhciBqPWkuaW5kZXgoYy50YXJnZXQpOzM4PT1jLndoaWNoJiZqPjAmJmotLSw0MD09Yy53aGljaCYmajxpLmxlbmd0aC0xJiZqKyssfmp8fChqPTApLGkuZXEoaikudHJpZ2dlcihcImZvY3VzXCIpfX19fTt2YXIgaD1hLmZuLmRyb3Bkb3duO2EuZm4uZHJvcGRvd249ZCxhLmZuLmRyb3Bkb3duLkNvbnN0cnVjdG9yPWcsYS5mbi5kcm9wZG93bi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4uZHJvcGRvd249aCx0aGlzfSxhKGRvY3VtZW50KS5vbihcImNsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpXCIsYykub24oXCJjbGljay5icy5kcm9wZG93bi5kYXRhLWFwaVwiLFwiLmRyb3Bkb3duIGZvcm1cIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSkub24oXCJjbGljay5icy5kcm9wZG93bi5kYXRhLWFwaVwiLGYsZy5wcm90b3R5cGUudG9nZ2xlKS5vbihcImtleWRvd24uYnMuZHJvcGRvd24uZGF0YS1hcGlcIixmLGcucHJvdG90eXBlLmtleWRvd24pLm9uKFwia2V5ZG93bi5icy5kcm9wZG93bi5kYXRhLWFwaVwiLFwiLmRyb3Bkb3duLW1lbnVcIixnLnByb3RvdHlwZS5rZXlkb3duKX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYihiLGQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1hKHRoaXMpLGY9ZS5kYXRhKFwiYnMubW9kYWxcIiksZz1hLmV4dGVuZCh7fSxjLkRFRkFVTFRTLGUuZGF0YSgpLFwib2JqZWN0XCI9PXR5cGVvZiBiJiZiKTtmfHxlLmRhdGEoXCJicy5tb2RhbFwiLGY9bmV3IGModGhpcyxnKSksXCJzdHJpbmdcIj09dHlwZW9mIGI/ZltiXShkKTpnLnNob3cmJmYuc2hvdyhkKX0pfXZhciBjPWZ1bmN0aW9uKGIsYyl7dGhpcy5vcHRpb25zPWMsdGhpcy4kYm9keT1hKGRvY3VtZW50LmJvZHkpLHRoaXMuJGVsZW1lbnQ9YShiKSx0aGlzLiRkaWFsb2c9dGhpcy4kZWxlbWVudC5maW5kKFwiLm1vZGFsLWRpYWxvZ1wiKSx0aGlzLiRiYWNrZHJvcD1udWxsLHRoaXMuaXNTaG93bj1udWxsLHRoaXMub3JpZ2luYWxCb2R5UGFkPW51bGwsdGhpcy5zY3JvbGxiYXJXaWR0aD0wLHRoaXMuaWdub3JlQmFja2Ryb3BDbGljaz0hMSx0aGlzLm9wdGlvbnMucmVtb3RlJiZ0aGlzLiRlbGVtZW50LmZpbmQoXCIubW9kYWwtY29udGVudFwiKS5sb2FkKHRoaXMub3B0aW9ucy5yZW1vdGUsYS5wcm94eShmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQudHJpZ2dlcihcImxvYWRlZC5icy5tb2RhbFwiKX0sdGhpcykpfTtjLlZFUlNJT049XCIzLjMuN1wiLGMuVFJBTlNJVElPTl9EVVJBVElPTj0zMDAsYy5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxjLkRFRkFVTFRTPXtiYWNrZHJvcDohMCxrZXlib2FyZDohMCxzaG93OiEwfSxjLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNTaG93bj90aGlzLmhpZGUoKTp0aGlzLnNob3coYSl9LGMucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcyxlPWEuRXZlbnQoXCJzaG93LmJzLm1vZGFsXCIse3JlbGF0ZWRUYXJnZXQ6Yn0pO3RoaXMuJGVsZW1lbnQudHJpZ2dlcihlKSx0aGlzLmlzU2hvd258fGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fCh0aGlzLmlzU2hvd249ITAsdGhpcy5jaGVja1Njcm9sbGJhcigpLHRoaXMuc2V0U2Nyb2xsYmFyKCksdGhpcy4kYm9keS5hZGRDbGFzcyhcIm1vZGFsLW9wZW5cIiksdGhpcy5lc2NhcGUoKSx0aGlzLnJlc2l6ZSgpLHRoaXMuJGVsZW1lbnQub24oXCJjbGljay5kaXNtaXNzLmJzLm1vZGFsXCIsJ1tkYXRhLWRpc21pc3M9XCJtb2RhbFwiXScsYS5wcm94eSh0aGlzLmhpZGUsdGhpcykpLHRoaXMuJGRpYWxvZy5vbihcIm1vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsXCIsZnVuY3Rpb24oKXtkLiRlbGVtZW50Lm9uZShcIm1vdXNldXAuZGlzbWlzcy5icy5tb2RhbFwiLGZ1bmN0aW9uKGIpe2EoYi50YXJnZXQpLmlzKGQuJGVsZW1lbnQpJiYoZC5pZ25vcmVCYWNrZHJvcENsaWNrPSEwKX0pfSksdGhpcy5iYWNrZHJvcChmdW5jdGlvbigpe3ZhciBlPWEuc3VwcG9ydC50cmFuc2l0aW9uJiZkLiRlbGVtZW50Lmhhc0NsYXNzKFwiZmFkZVwiKTtkLiRlbGVtZW50LnBhcmVudCgpLmxlbmd0aHx8ZC4kZWxlbWVudC5hcHBlbmRUbyhkLiRib2R5KSxkLiRlbGVtZW50LnNob3coKS5zY3JvbGxUb3AoMCksZC5hZGp1c3REaWFsb2coKSxlJiZkLiRlbGVtZW50WzBdLm9mZnNldFdpZHRoLGQuJGVsZW1lbnQuYWRkQ2xhc3MoXCJpblwiKSxkLmVuZm9yY2VGb2N1cygpO3ZhciBmPWEuRXZlbnQoXCJzaG93bi5icy5tb2RhbFwiLHtyZWxhdGVkVGFyZ2V0OmJ9KTtlP2QuJGRpYWxvZy5vbmUoXCJic1RyYW5zaXRpb25FbmRcIixmdW5jdGlvbigpe2QuJGVsZW1lbnQudHJpZ2dlcihcImZvY3VzXCIpLnRyaWdnZXIoZil9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZChjLlRSQU5TSVRJT05fRFVSQVRJT04pOmQuJGVsZW1lbnQudHJpZ2dlcihcImZvY3VzXCIpLnRyaWdnZXIoZil9KSl9LGMucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oYil7YiYmYi5wcmV2ZW50RGVmYXVsdCgpLGI9YS5FdmVudChcImhpZGUuYnMubW9kYWxcIiksdGhpcy4kZWxlbWVudC50cmlnZ2VyKGIpLHRoaXMuaXNTaG93biYmIWIuaXNEZWZhdWx0UHJldmVudGVkKCkmJih0aGlzLmlzU2hvd249ITEsdGhpcy5lc2NhcGUoKSx0aGlzLnJlc2l6ZSgpLGEoZG9jdW1lbnQpLm9mZihcImZvY3VzaW4uYnMubW9kYWxcIiksdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyhcImluXCIpLm9mZihcImNsaWNrLmRpc21pc3MuYnMubW9kYWxcIikub2ZmKFwibW91c2V1cC5kaXNtaXNzLmJzLm1vZGFsXCIpLHRoaXMuJGRpYWxvZy5vZmYoXCJtb3VzZWRvd24uZGlzbWlzcy5icy5tb2RhbFwiKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kZWxlbWVudC5oYXNDbGFzcyhcImZhZGVcIik/dGhpcy4kZWxlbWVudC5vbmUoXCJic1RyYW5zaXRpb25FbmRcIixhLnByb3h5KHRoaXMuaGlkZU1vZGFsLHRoaXMpKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChjLlRSQU5TSVRJT05fRFVSQVRJT04pOnRoaXMuaGlkZU1vZGFsKCkpfSxjLnByb3RvdHlwZS5lbmZvcmNlRm9jdXM9ZnVuY3Rpb24oKXthKGRvY3VtZW50KS5vZmYoXCJmb2N1c2luLmJzLm1vZGFsXCIpLm9uKFwiZm9jdXNpbi5icy5tb2RhbFwiLGEucHJveHkoZnVuY3Rpb24oYSl7ZG9jdW1lbnQ9PT1hLnRhcmdldHx8dGhpcy4kZWxlbWVudFswXT09PWEudGFyZ2V0fHx0aGlzLiRlbGVtZW50LmhhcyhhLnRhcmdldCkubGVuZ3RofHx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJmb2N1c1wiKX0sdGhpcykpfSxjLnByb3RvdHlwZS5lc2NhcGU9ZnVuY3Rpb24oKXt0aGlzLmlzU2hvd24mJnRoaXMub3B0aW9ucy5rZXlib2FyZD90aGlzLiRlbGVtZW50Lm9uKFwia2V5ZG93bi5kaXNtaXNzLmJzLm1vZGFsXCIsYS5wcm94eShmdW5jdGlvbihhKXsyNz09YS53aGljaCYmdGhpcy5oaWRlKCl9LHRoaXMpKTp0aGlzLmlzU2hvd258fHRoaXMuJGVsZW1lbnQub2ZmKFwia2V5ZG93bi5kaXNtaXNzLmJzLm1vZGFsXCIpfSxjLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXt0aGlzLmlzU2hvd24/YSh3aW5kb3cpLm9uKFwicmVzaXplLmJzLm1vZGFsXCIsYS5wcm94eSh0aGlzLmhhbmRsZVVwZGF0ZSx0aGlzKSk6YSh3aW5kb3cpLm9mZihcInJlc2l6ZS5icy5tb2RhbFwiKX0sYy5wcm90b3R5cGUuaGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLiRlbGVtZW50LmhpZGUoKSx0aGlzLmJhY2tkcm9wKGZ1bmN0aW9uKCl7YS4kYm9keS5yZW1vdmVDbGFzcyhcIm1vZGFsLW9wZW5cIiksYS5yZXNldEFkanVzdG1lbnRzKCksYS5yZXNldFNjcm9sbGJhcigpLGEuJGVsZW1lbnQudHJpZ2dlcihcImhpZGRlbi5icy5tb2RhbFwiKX0pfSxjLnByb3RvdHlwZS5yZW1vdmVCYWNrZHJvcD1mdW5jdGlvbigpe3RoaXMuJGJhY2tkcm9wJiZ0aGlzLiRiYWNrZHJvcC5yZW1vdmUoKSx0aGlzLiRiYWNrZHJvcD1udWxsfSxjLnByb3RvdHlwZS5iYWNrZHJvcD1mdW5jdGlvbihiKXt2YXIgZD10aGlzLGU9dGhpcy4kZWxlbWVudC5oYXNDbGFzcyhcImZhZGVcIik/XCJmYWRlXCI6XCJcIjtpZih0aGlzLmlzU2hvd24mJnRoaXMub3B0aW9ucy5iYWNrZHJvcCl7dmFyIGY9YS5zdXBwb3J0LnRyYW5zaXRpb24mJmU7aWYodGhpcy4kYmFja2Ryb3A9YShkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKS5hZGRDbGFzcyhcIm1vZGFsLWJhY2tkcm9wIFwiK2UpLmFwcGVuZFRvKHRoaXMuJGJvZHkpLHRoaXMuJGVsZW1lbnQub24oXCJjbGljay5kaXNtaXNzLmJzLm1vZGFsXCIsYS5wcm94eShmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pZ25vcmVCYWNrZHJvcENsaWNrP3ZvaWQodGhpcy5pZ25vcmVCYWNrZHJvcENsaWNrPSExKTp2b2lkKGEudGFyZ2V0PT09YS5jdXJyZW50VGFyZ2V0JiYoXCJzdGF0aWNcIj09dGhpcy5vcHRpb25zLmJhY2tkcm9wP3RoaXMuJGVsZW1lbnRbMF0uZm9jdXMoKTp0aGlzLmhpZGUoKSkpfSx0aGlzKSksZiYmdGhpcy4kYmFja2Ryb3BbMF0ub2Zmc2V0V2lkdGgsdGhpcy4kYmFja2Ryb3AuYWRkQ2xhc3MoXCJpblwiKSwhYilyZXR1cm47Zj90aGlzLiRiYWNrZHJvcC5vbmUoXCJic1RyYW5zaXRpb25FbmRcIixiKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChjLkJBQ0tEUk9QX1RSQU5TSVRJT05fRFVSQVRJT04pOmIoKX1lbHNlIGlmKCF0aGlzLmlzU2hvd24mJnRoaXMuJGJhY2tkcm9wKXt0aGlzLiRiYWNrZHJvcC5yZW1vdmVDbGFzcyhcImluXCIpO3ZhciBnPWZ1bmN0aW9uKCl7ZC5yZW1vdmVCYWNrZHJvcCgpLGImJmIoKX07YS5zdXBwb3J0LnRyYW5zaXRpb24mJnRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoXCJmYWRlXCIpP3RoaXMuJGJhY2tkcm9wLm9uZShcImJzVHJhbnNpdGlvbkVuZFwiLGcpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuQkFDS0RST1BfVFJBTlNJVElPTl9EVVJBVElPTik6ZygpfWVsc2UgYiYmYigpfSxjLnByb3RvdHlwZS5oYW5kbGVVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmFkanVzdERpYWxvZygpfSxjLnByb3RvdHlwZS5hZGp1c3REaWFsb2c9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRlbGVtZW50WzBdLnNjcm9sbEhlaWdodD5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O3RoaXMuJGVsZW1lbnQuY3NzKHtwYWRkaW5nTGVmdDohdGhpcy5ib2R5SXNPdmVyZmxvd2luZyYmYT90aGlzLnNjcm9sbGJhcldpZHRoOlwiXCIscGFkZGluZ1JpZ2h0OnRoaXMuYm9keUlzT3ZlcmZsb3dpbmcmJiFhP3RoaXMuc2Nyb2xsYmFyV2lkdGg6XCJcIn0pfSxjLnByb3RvdHlwZS5yZXNldEFkanVzdG1lbnRzPWZ1bmN0aW9uKCl7dGhpcy4kZWxlbWVudC5jc3Moe3BhZGRpbmdMZWZ0OlwiXCIscGFkZGluZ1JpZ2h0OlwiXCJ9KX0sYy5wcm90b3R5cGUuY2hlY2tTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuaW5uZXJXaWR0aDtpZighYSl7dmFyIGI9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2E9Yi5yaWdodC1NYXRoLmFicyhiLmxlZnQpfXRoaXMuYm9keUlzT3ZlcmZsb3dpbmc9ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDxhLHRoaXMuc2Nyb2xsYmFyV2lkdGg9dGhpcy5tZWFzdXJlU2Nyb2xsYmFyKCl9LGMucHJvdG90eXBlLnNldFNjcm9sbGJhcj1mdW5jdGlvbigpe3ZhciBhPXBhcnNlSW50KHRoaXMuJGJvZHkuY3NzKFwicGFkZGluZy1yaWdodFwiKXx8MCwxMCk7dGhpcy5vcmlnaW5hbEJvZHlQYWQ9ZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHR8fFwiXCIsdGhpcy5ib2R5SXNPdmVyZmxvd2luZyYmdGhpcy4kYm9keS5jc3MoXCJwYWRkaW5nLXJpZ2h0XCIsYSt0aGlzLnNjcm9sbGJhcldpZHRoKX0sYy5wcm90b3R5cGUucmVzZXRTY3JvbGxiYXI9ZnVuY3Rpb24oKXt0aGlzLiRib2R5LmNzcyhcInBhZGRpbmctcmlnaHRcIix0aGlzLm9yaWdpbmFsQm9keVBhZCl9LGMucHJvdG90eXBlLm1lYXN1cmVTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2EuY2xhc3NOYW1lPVwibW9kYWwtc2Nyb2xsYmFyLW1lYXN1cmVcIix0aGlzLiRib2R5LmFwcGVuZChhKTt2YXIgYj1hLm9mZnNldFdpZHRoLWEuY2xpZW50V2lkdGg7cmV0dXJuIHRoaXMuJGJvZHlbMF0ucmVtb3ZlQ2hpbGQoYSksYn07dmFyIGQ9YS5mbi5tb2RhbDthLmZuLm1vZGFsPWIsYS5mbi5tb2RhbC5Db25zdHJ1Y3Rvcj1jLGEuZm4ubW9kYWwubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLm1vZGFsPWQsdGhpc30sYShkb2N1bWVudCkub24oXCJjbGljay5icy5tb2RhbC5kYXRhLWFwaVwiLCdbZGF0YS10b2dnbGU9XCJtb2RhbFwiXScsZnVuY3Rpb24oYyl7dmFyIGQ9YSh0aGlzKSxlPWQuYXR0cihcImhyZWZcIiksZj1hKGQuYXR0cihcImRhdGEtdGFyZ2V0XCIpfHxlJiZlLnJlcGxhY2UoLy4qKD89I1teXFxzXSskKS8sXCJcIikpLGc9Zi5kYXRhKFwiYnMubW9kYWxcIik/XCJ0b2dnbGVcIjphLmV4dGVuZCh7cmVtb3RlOiEvIy8udGVzdChlKSYmZX0sZi5kYXRhKCksZC5kYXRhKCkpO2QuaXMoXCJhXCIpJiZjLnByZXZlbnREZWZhdWx0KCksZi5vbmUoXCJzaG93LmJzLm1vZGFsXCIsZnVuY3Rpb24oYSl7YS5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8Zi5vbmUoXCJoaWRkZW4uYnMubW9kYWxcIixmdW5jdGlvbigpe2QuaXMoXCI6dmlzaWJsZVwiKSYmZC50cmlnZ2VyKFwiZm9jdXNcIil9KX0pLGIuY2FsbChmLGcsdGhpcyl9KX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YShcImJzLnRvb2x0aXBcIiksZj1cIm9iamVjdFwiPT10eXBlb2YgYiYmYjshZSYmL2Rlc3Ryb3l8aGlkZS8udGVzdChiKXx8KGV8fGQuZGF0YShcImJzLnRvb2x0aXBcIixlPW5ldyBjKHRoaXMsZikpLFwic3RyaW5nXCI9PXR5cGVvZiBiJiZlW2JdKCkpfSl9dmFyIGM9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9bnVsbCx0aGlzLm9wdGlvbnM9bnVsbCx0aGlzLmVuYWJsZWQ9bnVsbCx0aGlzLnRpbWVvdXQ9bnVsbCx0aGlzLmhvdmVyU3RhdGU9bnVsbCx0aGlzLiRlbGVtZW50PW51bGwsdGhpcy5pblN0YXRlPW51bGwsdGhpcy5pbml0KFwidG9vbHRpcFwiLGEsYil9O2MuVkVSU0lPTj1cIjMuMy43XCIsYy5UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxjLkRFRkFVTFRTPXthbmltYXRpb246ITAscGxhY2VtZW50OlwidG9wXCIsc2VsZWN0b3I6ITEsdGVtcGxhdGU6JzxkaXYgY2xhc3M9XCJ0b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj48ZGl2IGNsYXNzPVwidG9vbHRpcC1hcnJvd1wiPjwvZGl2PjxkaXYgY2xhc3M9XCJ0b29sdGlwLWlubmVyXCI+PC9kaXY+PC9kaXY+Jyx0cmlnZ2VyOlwiaG92ZXIgZm9jdXNcIix0aXRsZTpcIlwiLGRlbGF5OjAsaHRtbDohMSxjb250YWluZXI6ITEsdmlld3BvcnQ6e3NlbGVjdG9yOlwiYm9keVwiLHBhZGRpbmc6MH19LGMucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oYixjLGQpe2lmKHRoaXMuZW5hYmxlZD0hMCx0aGlzLnR5cGU9Yix0aGlzLiRlbGVtZW50PWEoYyksdGhpcy5vcHRpb25zPXRoaXMuZ2V0T3B0aW9ucyhkKSx0aGlzLiR2aWV3cG9ydD10aGlzLm9wdGlvbnMudmlld3BvcnQmJmEoYS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy52aWV3cG9ydCk/dGhpcy5vcHRpb25zLnZpZXdwb3J0LmNhbGwodGhpcyx0aGlzLiRlbGVtZW50KTp0aGlzLm9wdGlvbnMudmlld3BvcnQuc2VsZWN0b3J8fHRoaXMub3B0aW9ucy52aWV3cG9ydCksdGhpcy5pblN0YXRlPXtjbGljazohMSxob3ZlcjohMSxmb2N1czohMX0sdGhpcy4kZWxlbWVudFswXWluc3RhbmNlb2YgZG9jdW1lbnQuY29uc3RydWN0b3ImJiF0aGlzLm9wdGlvbnMuc2VsZWN0b3IpdGhyb3cgbmV3IEVycm9yKFwiYHNlbGVjdG9yYCBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBpbml0aWFsaXppbmcgXCIrdGhpcy50eXBlK1wiIG9uIHRoZSB3aW5kb3cuZG9jdW1lbnQgb2JqZWN0IVwiKTtmb3IodmFyIGU9dGhpcy5vcHRpb25zLnRyaWdnZXIuc3BsaXQoXCIgXCIpLGY9ZS5sZW5ndGg7Zi0tOyl7dmFyIGc9ZVtmXTtpZihcImNsaWNrXCI9PWcpdGhpcy4kZWxlbWVudC5vbihcImNsaWNrLlwiK3RoaXMudHlwZSx0aGlzLm9wdGlvbnMuc2VsZWN0b3IsYS5wcm94eSh0aGlzLnRvZ2dsZSx0aGlzKSk7ZWxzZSBpZihcIm1hbnVhbFwiIT1nKXt2YXIgaD1cImhvdmVyXCI9PWc/XCJtb3VzZWVudGVyXCI6XCJmb2N1c2luXCIsaT1cImhvdmVyXCI9PWc/XCJtb3VzZWxlYXZlXCI6XCJmb2N1c291dFwiO3RoaXMuJGVsZW1lbnQub24oaCtcIi5cIit0aGlzLnR5cGUsdGhpcy5vcHRpb25zLnNlbGVjdG9yLGEucHJveHkodGhpcy5lbnRlcix0aGlzKSksdGhpcy4kZWxlbWVudC5vbihpK1wiLlwiK3RoaXMudHlwZSx0aGlzLm9wdGlvbnMuc2VsZWN0b3IsYS5wcm94eSh0aGlzLmxlYXZlLHRoaXMpKX19dGhpcy5vcHRpb25zLnNlbGVjdG9yP3RoaXMuX29wdGlvbnM9YS5leHRlbmQoe30sdGhpcy5vcHRpb25zLHt0cmlnZ2VyOlwibWFudWFsXCIsc2VsZWN0b3I6XCJcIn0pOnRoaXMuZml4VGl0bGUoKX0sYy5wcm90b3R5cGUuZ2V0RGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gYy5ERUZBVUxUU30sYy5wcm90b3R5cGUuZ2V0T3B0aW9ucz1mdW5jdGlvbihiKXtyZXR1cm4gYj1hLmV4dGVuZCh7fSx0aGlzLmdldERlZmF1bHRzKCksdGhpcy4kZWxlbWVudC5kYXRhKCksYiksYi5kZWxheSYmXCJudW1iZXJcIj09dHlwZW9mIGIuZGVsYXkmJihiLmRlbGF5PXtzaG93OmIuZGVsYXksaGlkZTpiLmRlbGF5fSksYn0sYy5wcm90b3R5cGUuZ2V0RGVsZWdhdGVPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIGI9e30sYz10aGlzLmdldERlZmF1bHRzKCk7cmV0dXJuIHRoaXMuX29wdGlvbnMmJmEuZWFjaCh0aGlzLl9vcHRpb25zLGZ1bmN0aW9uKGEsZCl7Y1thXSE9ZCYmKGJbYV09ZCl9KSxifSxjLnByb3RvdHlwZS5lbnRlcj1mdW5jdGlvbihiKXt2YXIgYz1iIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9iOmEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKFwiYnMuXCIrdGhpcy50eXBlKTtyZXR1cm4gY3x8KGM9bmV3IHRoaXMuY29uc3RydWN0b3IoYi5jdXJyZW50VGFyZ2V0LHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpLGEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKFwiYnMuXCIrdGhpcy50eXBlLGMpKSxiIGluc3RhbmNlb2YgYS5FdmVudCYmKGMuaW5TdGF0ZVtcImZvY3VzaW5cIj09Yi50eXBlP1wiZm9jdXNcIjpcImhvdmVyXCJdPSEwKSxjLnRpcCgpLmhhc0NsYXNzKFwiaW5cIil8fFwiaW5cIj09Yy5ob3ZlclN0YXRlP3ZvaWQoYy5ob3ZlclN0YXRlPVwiaW5cIik6KGNsZWFyVGltZW91dChjLnRpbWVvdXQpLGMuaG92ZXJTdGF0ZT1cImluXCIsYy5vcHRpb25zLmRlbGF5JiZjLm9wdGlvbnMuZGVsYXkuc2hvdz92b2lkKGMudGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XCJpblwiPT1jLmhvdmVyU3RhdGUmJmMuc2hvdygpfSxjLm9wdGlvbnMuZGVsYXkuc2hvdykpOmMuc2hvdygpKX0sYy5wcm90b3R5cGUuaXNJblN0YXRlVHJ1ZT1mdW5jdGlvbigpe2Zvcih2YXIgYSBpbiB0aGlzLmluU3RhdGUpaWYodGhpcy5pblN0YXRlW2FdKXJldHVybiEwO3JldHVybiExfSxjLnByb3RvdHlwZS5sZWF2ZT1mdW5jdGlvbihiKXt2YXIgYz1iIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9iOmEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKFwiYnMuXCIrdGhpcy50eXBlKTtpZihjfHwoYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihiLmN1cnJlbnRUYXJnZXQsdGhpcy5nZXREZWxlZ2F0ZU9wdGlvbnMoKSksYShiLmN1cnJlbnRUYXJnZXQpLmRhdGEoXCJicy5cIit0aGlzLnR5cGUsYykpLGIgaW5zdGFuY2VvZiBhLkV2ZW50JiYoYy5pblN0YXRlW1wiZm9jdXNvdXRcIj09Yi50eXBlP1wiZm9jdXNcIjpcImhvdmVyXCJdPSExKSwhYy5pc0luU3RhdGVUcnVlKCkpcmV0dXJuIGNsZWFyVGltZW91dChjLnRpbWVvdXQpLGMuaG92ZXJTdGF0ZT1cIm91dFwiLGMub3B0aW9ucy5kZWxheSYmYy5vcHRpb25zLmRlbGF5LmhpZGU/dm9pZChjLnRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe1wib3V0XCI9PWMuaG92ZXJTdGF0ZSYmYy5oaWRlKCl9LGMub3B0aW9ucy5kZWxheS5oaWRlKSk6Yy5oaWRlKCl9LGMucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt2YXIgYj1hLkV2ZW50KFwic2hvdy5icy5cIit0aGlzLnR5cGUpO2lmKHRoaXMuaGFzQ29udGVudCgpJiZ0aGlzLmVuYWJsZWQpe3RoaXMuJGVsZW1lbnQudHJpZ2dlcihiKTt2YXIgZD1hLmNvbnRhaW5zKHRoaXMuJGVsZW1lbnRbMF0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsdGhpcy4kZWxlbWVudFswXSk7aWYoYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8IWQpcmV0dXJuO3ZhciBlPXRoaXMsZj10aGlzLnRpcCgpLGc9dGhpcy5nZXRVSUQodGhpcy50eXBlKTt0aGlzLnNldENvbnRlbnQoKSxmLmF0dHIoXCJpZFwiLGcpLHRoaXMuJGVsZW1lbnQuYXR0cihcImFyaWEtZGVzY3JpYmVkYnlcIixnKSx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uJiZmLmFkZENsYXNzKFwiZmFkZVwiKTt2YXIgaD1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMucGxhY2VtZW50P3RoaXMub3B0aW9ucy5wbGFjZW1lbnQuY2FsbCh0aGlzLGZbMF0sdGhpcy4kZWxlbWVudFswXSk6dGhpcy5vcHRpb25zLnBsYWNlbWVudCxpPS9cXHM/YXV0bz9cXHM/L2ksaj1pLnRlc3QoaCk7aiYmKGg9aC5yZXBsYWNlKGksXCJcIil8fFwidG9wXCIpLGYuZGV0YWNoKCkuY3NzKHt0b3A6MCxsZWZ0OjAsZGlzcGxheTpcImJsb2NrXCJ9KS5hZGRDbGFzcyhoKS5kYXRhKFwiYnMuXCIrdGhpcy50eXBlLHRoaXMpLHRoaXMub3B0aW9ucy5jb250YWluZXI/Zi5hcHBlbmRUbyh0aGlzLm9wdGlvbnMuY29udGFpbmVyKTpmLmluc2VydEFmdGVyKHRoaXMuJGVsZW1lbnQpLHRoaXMuJGVsZW1lbnQudHJpZ2dlcihcImluc2VydGVkLmJzLlwiK3RoaXMudHlwZSk7dmFyIGs9dGhpcy5nZXRQb3NpdGlvbigpLGw9ZlswXS5vZmZzZXRXaWR0aCxtPWZbMF0ub2Zmc2V0SGVpZ2h0O2lmKGope3ZhciBuPWgsbz10aGlzLmdldFBvc2l0aW9uKHRoaXMuJHZpZXdwb3J0KTtoPVwiYm90dG9tXCI9PWgmJmsuYm90dG9tK20+by5ib3R0b20/XCJ0b3BcIjpcInRvcFwiPT1oJiZrLnRvcC1tPG8udG9wP1wiYm90dG9tXCI6XCJyaWdodFwiPT1oJiZrLnJpZ2h0K2w+by53aWR0aD9cImxlZnRcIjpcImxlZnRcIj09aCYmay5sZWZ0LWw8by5sZWZ0P1wicmlnaHRcIjpoLGYucmVtb3ZlQ2xhc3MobikuYWRkQ2xhc3MoaCl9dmFyIHA9dGhpcy5nZXRDYWxjdWxhdGVkT2Zmc2V0KGgsayxsLG0pO3RoaXMuYXBwbHlQbGFjZW1lbnQocCxoKTt2YXIgcT1mdW5jdGlvbigpe3ZhciBhPWUuaG92ZXJTdGF0ZTtlLiRlbGVtZW50LnRyaWdnZXIoXCJzaG93bi5icy5cIitlLnR5cGUpLGUuaG92ZXJTdGF0ZT1udWxsLFwib3V0XCI9PWEmJmUubGVhdmUoZSl9O2Euc3VwcG9ydC50cmFuc2l0aW9uJiZ0aGlzLiR0aXAuaGFzQ2xhc3MoXCJmYWRlXCIpP2Yub25lKFwiYnNUcmFuc2l0aW9uRW5kXCIscSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoYy5UUkFOU0lUSU9OX0RVUkFUSU9OKTpxKCl9fSxjLnByb3RvdHlwZS5hcHBseVBsYWNlbWVudD1mdW5jdGlvbihiLGMpe3ZhciBkPXRoaXMudGlwKCksZT1kWzBdLm9mZnNldFdpZHRoLGY9ZFswXS5vZmZzZXRIZWlnaHQsZz1wYXJzZUludChkLmNzcyhcIm1hcmdpbi10b3BcIiksMTApLGg9cGFyc2VJbnQoZC5jc3MoXCJtYXJnaW4tbGVmdFwiKSwxMCk7aXNOYU4oZykmJihnPTApLGlzTmFOKGgpJiYoaD0wKSxiLnRvcCs9ZyxiLmxlZnQrPWgsYS5vZmZzZXQuc2V0T2Zmc2V0KGRbMF0sYS5leHRlbmQoe3VzaW5nOmZ1bmN0aW9uKGEpe2QuY3NzKHt0b3A6TWF0aC5yb3VuZChhLnRvcCksbGVmdDpNYXRoLnJvdW5kKGEubGVmdCl9KX19LGIpLDApLGQuYWRkQ2xhc3MoXCJpblwiKTt2YXIgaT1kWzBdLm9mZnNldFdpZHRoLGo9ZFswXS5vZmZzZXRIZWlnaHQ7XCJ0b3BcIj09YyYmaiE9ZiYmKGIudG9wPWIudG9wK2Ytaik7dmFyIGs9dGhpcy5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGEoYyxiLGksaik7ay5sZWZ0P2IubGVmdCs9ay5sZWZ0OmIudG9wKz1rLnRvcDt2YXIgbD0vdG9wfGJvdHRvbS8udGVzdChjKSxtPWw/MiprLmxlZnQtZStpOjIqay50b3AtZitqLG49bD9cIm9mZnNldFdpZHRoXCI6XCJvZmZzZXRIZWlnaHRcIjtkLm9mZnNldChiKSx0aGlzLnJlcGxhY2VBcnJvdyhtLGRbMF1bbl0sbCl9LGMucHJvdG90eXBlLnJlcGxhY2VBcnJvdz1mdW5jdGlvbihhLGIsYyl7dGhpcy5hcnJvdygpLmNzcyhjP1wibGVmdFwiOlwidG9wXCIsNTAqKDEtYS9iKStcIiVcIikuY3NzKGM/XCJ0b3BcIjpcImxlZnRcIixcIlwiKX0sYy5wcm90b3R5cGUuc2V0Q29udGVudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMudGlwKCksYj10aGlzLmdldFRpdGxlKCk7YS5maW5kKFwiLnRvb2x0aXAtaW5uZXJcIilbdGhpcy5vcHRpb25zLmh0bWw/XCJodG1sXCI6XCJ0ZXh0XCJdKGIpLGEucmVtb3ZlQ2xhc3MoXCJmYWRlIGluIHRvcCBib3R0b20gbGVmdCByaWdodFwiKX0sYy5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbihiKXtmdW5jdGlvbiBkKCl7XCJpblwiIT1lLmhvdmVyU3RhdGUmJmYuZGV0YWNoKCksZS4kZWxlbWVudCYmZS4kZWxlbWVudC5yZW1vdmVBdHRyKFwiYXJpYS1kZXNjcmliZWRieVwiKS50cmlnZ2VyKFwiaGlkZGVuLmJzLlwiK2UudHlwZSksYiYmYigpfXZhciBlPXRoaXMsZj1hKHRoaXMuJHRpcCksZz1hLkV2ZW50KFwiaGlkZS5icy5cIit0aGlzLnR5cGUpO2lmKHRoaXMuJGVsZW1lbnQudHJpZ2dlcihnKSwhZy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSlyZXR1cm4gZi5yZW1vdmVDbGFzcyhcImluXCIpLGEuc3VwcG9ydC50cmFuc2l0aW9uJiZmLmhhc0NsYXNzKFwiZmFkZVwiKT9mLm9uZShcImJzVHJhbnNpdGlvbkVuZFwiLGQpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTik6ZCgpLHRoaXMuaG92ZXJTdGF0ZT1udWxsLHRoaXN9LGMucHJvdG90eXBlLmZpeFRpdGxlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kZWxlbWVudDsoYS5hdHRyKFwidGl0bGVcIil8fFwic3RyaW5nXCIhPXR5cGVvZiBhLmF0dHIoXCJkYXRhLW9yaWdpbmFsLXRpdGxlXCIpKSYmYS5hdHRyKFwiZGF0YS1vcmlnaW5hbC10aXRsZVwiLGEuYXR0cihcInRpdGxlXCIpfHxcIlwiKS5hdHRyKFwidGl0bGVcIixcIlwiKX0sYy5wcm90b3R5cGUuaGFzQ29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpdGxlKCl9LGMucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKGIpe2I9Ynx8dGhpcy4kZWxlbWVudDt2YXIgYz1iWzBdLGQ9XCJCT0RZXCI9PWMudGFnTmFtZSxlPWMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7bnVsbD09ZS53aWR0aCYmKGU9YS5leHRlbmQoe30sZSx7d2lkdGg6ZS5yaWdodC1lLmxlZnQsaGVpZ2h0OmUuYm90dG9tLWUudG9wfSkpO3ZhciBmPXdpbmRvdy5TVkdFbGVtZW50JiZjIGluc3RhbmNlb2Ygd2luZG93LlNWR0VsZW1lbnQsZz1kP3t0b3A6MCxsZWZ0OjB9OmY/bnVsbDpiLm9mZnNldCgpLGg9e3Njcm9sbDpkP2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOmIuc2Nyb2xsVG9wKCl9LGk9ZD97d2lkdGg6YSh3aW5kb3cpLndpZHRoKCksaGVpZ2h0OmEod2luZG93KS5oZWlnaHQoKX06bnVsbDtyZXR1cm4gYS5leHRlbmQoe30sZSxoLGksZyl9LGMucHJvdG90eXBlLmdldENhbGN1bGF0ZWRPZmZzZXQ9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuXCJib3R0b21cIj09YT97dG9wOmIudG9wK2IuaGVpZ2h0LGxlZnQ6Yi5sZWZ0K2Iud2lkdGgvMi1jLzJ9OlwidG9wXCI9PWE/e3RvcDpiLnRvcC1kLGxlZnQ6Yi5sZWZ0K2Iud2lkdGgvMi1jLzJ9OlwibGVmdFwiPT1hP3t0b3A6Yi50b3ArYi5oZWlnaHQvMi1kLzIsbGVmdDpiLmxlZnQtY306e3RvcDpiLnRvcCtiLmhlaWdodC8yLWQvMixsZWZ0OmIubGVmdCtiLndpZHRofX0sYy5wcm90b3R5cGUuZ2V0Vmlld3BvcnRBZGp1c3RlZERlbHRhPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXt0b3A6MCxsZWZ0OjB9O2lmKCF0aGlzLiR2aWV3cG9ydClyZXR1cm4gZTt2YXIgZj10aGlzLm9wdGlvbnMudmlld3BvcnQmJnRoaXMub3B0aW9ucy52aWV3cG9ydC5wYWRkaW5nfHwwLGc9dGhpcy5nZXRQb3NpdGlvbih0aGlzLiR2aWV3cG9ydCk7aWYoL3JpZ2h0fGxlZnQvLnRlc3QoYSkpe3ZhciBoPWIudG9wLWYtZy5zY3JvbGwsaT1iLnRvcCtmLWcuc2Nyb2xsK2Q7aDxnLnRvcD9lLnRvcD1nLnRvcC1oOmk+Zy50b3ArZy5oZWlnaHQmJihlLnRvcD1nLnRvcCtnLmhlaWdodC1pKX1lbHNle3ZhciBqPWIubGVmdC1mLGs9Yi5sZWZ0K2YrYztqPGcubGVmdD9lLmxlZnQ9Zy5sZWZ0LWo6az5nLnJpZ2h0JiYoZS5sZWZ0PWcubGVmdCtnLndpZHRoLWspfXJldHVybiBlfSxjLnByb3RvdHlwZS5nZXRUaXRsZT1mdW5jdGlvbigpe3ZhciBhLGI9dGhpcy4kZWxlbWVudCxjPXRoaXMub3B0aW9ucztyZXR1cm4gYT1iLmF0dHIoXCJkYXRhLW9yaWdpbmFsLXRpdGxlXCIpfHwoXCJmdW5jdGlvblwiPT10eXBlb2YgYy50aXRsZT9jLnRpdGxlLmNhbGwoYlswXSk6Yy50aXRsZSl9LGMucHJvdG90eXBlLmdldFVJRD1mdW5jdGlvbihhKXtkbyBhKz1+figxZTYqTWF0aC5yYW5kb20oKSk7d2hpbGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3JldHVybiBhfSxjLnByb3RvdHlwZS50aXA9ZnVuY3Rpb24oKXtpZighdGhpcy4kdGlwJiYodGhpcy4kdGlwPWEodGhpcy5vcHRpb25zLnRlbXBsYXRlKSwxIT10aGlzLiR0aXAubGVuZ3RoKSl0aHJvdyBuZXcgRXJyb3IodGhpcy50eXBlK1wiIGB0ZW1wbGF0ZWAgb3B0aW9uIG11c3QgY29uc2lzdCBvZiBleGFjdGx5IDEgdG9wLWxldmVsIGVsZW1lbnQhXCIpO3JldHVybiB0aGlzLiR0aXB9LGMucHJvdG90eXBlLmFycm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGFycm93PXRoaXMuJGFycm93fHx0aGlzLnRpcCgpLmZpbmQoXCIudG9vbHRpcC1hcnJvd1wiKX0sYy5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSEwfSxjLnByb3RvdHlwZS5kaXNhYmxlPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSExfSxjLnByb3RvdHlwZS50b2dnbGVFbmFibGVkPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSF0aGlzLmVuYWJsZWR9LGMucHJvdG90eXBlLnRvZ2dsZT1mdW5jdGlvbihiKXt2YXIgYz10aGlzO2ImJihjPWEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKFwiYnMuXCIrdGhpcy50eXBlKSxjfHwoYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihiLmN1cnJlbnRUYXJnZXQsdGhpcy5nZXREZWxlZ2F0ZU9wdGlvbnMoKSksYShiLmN1cnJlbnRUYXJnZXQpLmRhdGEoXCJicy5cIit0aGlzLnR5cGUsYykpKSxiPyhjLmluU3RhdGUuY2xpY2s9IWMuaW5TdGF0ZS5jbGljayxjLmlzSW5TdGF0ZVRydWUoKT9jLmVudGVyKGMpOmMubGVhdmUoYykpOmMudGlwKCkuaGFzQ2xhc3MoXCJpblwiKT9jLmxlYXZlKGMpOmMuZW50ZXIoYyl9LGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2NsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpLHRoaXMuaGlkZShmdW5jdGlvbigpe2EuJGVsZW1lbnQub2ZmKFwiLlwiK2EudHlwZSkucmVtb3ZlRGF0YShcImJzLlwiK2EudHlwZSksYS4kdGlwJiZhLiR0aXAuZGV0YWNoKCksYS4kdGlwPW51bGwsYS4kYXJyb3c9bnVsbCxhLiR2aWV3cG9ydD1udWxsLGEuJGVsZW1lbnQ9bnVsbH0pfTt2YXIgZD1hLmZuLnRvb2x0aXA7YS5mbi50b29sdGlwPWIsYS5mbi50b29sdGlwLkNvbnN0cnVjdG9yPWMsYS5mbi50b29sdGlwLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi50b29sdGlwPWQsdGhpc319KGpRdWVyeSksK2Z1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1kLmRhdGEoXCJicy5wb3BvdmVyXCIpLGY9XCJvYmplY3RcIj09dHlwZW9mIGImJmI7IWUmJi9kZXN0cm95fGhpZGUvLnRlc3QoYil8fChlfHxkLmRhdGEoXCJicy5wb3BvdmVyXCIsZT1uZXcgYyh0aGlzLGYpKSxcInN0cmluZ1wiPT10eXBlb2YgYiYmZVtiXSgpKX0pfXZhciBjPWZ1bmN0aW9uKGEsYil7dGhpcy5pbml0KFwicG9wb3ZlclwiLGEsYil9O2lmKCFhLmZuLnRvb2x0aXApdGhyb3cgbmV3IEVycm9yKFwiUG9wb3ZlciByZXF1aXJlcyB0b29sdGlwLmpzXCIpO2MuVkVSU0lPTj1cIjMuMy43XCIsYy5ERUZBVUxUUz1hLmV4dGVuZCh7fSxhLmZuLnRvb2x0aXAuQ29uc3RydWN0b3IuREVGQVVMVFMse3BsYWNlbWVudDpcInJpZ2h0XCIsdHJpZ2dlcjpcImNsaWNrXCIsY29udGVudDpcIlwiLHRlbXBsYXRlOic8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+PGRpdiBjbGFzcz1cImFycm93XCI+PC9kaXY+PGgzIGNsYXNzPVwicG9wb3Zlci10aXRsZVwiPjwvaDM+PGRpdiBjbGFzcz1cInBvcG92ZXItY29udGVudFwiPjwvZGl2PjwvZGl2Pid9KSxjLnByb3RvdHlwZT1hLmV4dGVuZCh7fSxhLmZuLnRvb2x0aXAuQ29uc3RydWN0b3IucHJvdG90eXBlKSxjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jLGMucHJvdG90eXBlLmdldERlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIGMuREVGQVVMVFN9LGMucHJvdG90eXBlLnNldENvbnRlbnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnRpcCgpLGI9dGhpcy5nZXRUaXRsZSgpLGM9dGhpcy5nZXRDb250ZW50KCk7YS5maW5kKFwiLnBvcG92ZXItdGl0bGVcIilbdGhpcy5vcHRpb25zLmh0bWw/XCJodG1sXCI6XCJ0ZXh0XCJdKGIpLGEuZmluZChcIi5wb3BvdmVyLWNvbnRlbnRcIikuY2hpbGRyZW4oKS5kZXRhY2goKS5lbmQoKVt0aGlzLm9wdGlvbnMuaHRtbD9cInN0cmluZ1wiPT10eXBlb2YgYz9cImh0bWxcIjpcImFwcGVuZFwiOlwidGV4dFwiXShjKSxhLnJlbW92ZUNsYXNzKFwiZmFkZSB0b3AgYm90dG9tIGxlZnQgcmlnaHQgaW5cIiksYS5maW5kKFwiLnBvcG92ZXItdGl0bGVcIikuaHRtbCgpfHxhLmZpbmQoXCIucG9wb3Zlci10aXRsZVwiKS5oaWRlKCl9LGMucHJvdG90eXBlLmhhc0NvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUaXRsZSgpfHx0aGlzLmdldENvbnRlbnQoKX0sYy5wcm90b3R5cGUuZ2V0Q29udGVudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW1lbnQsYj10aGlzLm9wdGlvbnM7cmV0dXJuIGEuYXR0cihcImRhdGEtY29udGVudFwiKXx8KFwiZnVuY3Rpb25cIj09dHlwZW9mIGIuY29udGVudD9iLmNvbnRlbnQuY2FsbChhWzBdKTpiLmNvbnRlbnQpfSxjLnByb3RvdHlwZS5hcnJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRhcnJvdz10aGlzLiRhcnJvd3x8dGhpcy50aXAoKS5maW5kKFwiLmFycm93XCIpfTt2YXIgZD1hLmZuLnBvcG92ZXI7YS5mbi5wb3BvdmVyPWIsYS5mbi5wb3BvdmVyLkNvbnN0cnVjdG9yPWMsYS5mbi5wb3BvdmVyLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5wb3BvdmVyPWQsdGhpc319KGpRdWVyeSksK2Z1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoYyxkKXt0aGlzLiRib2R5PWEoZG9jdW1lbnQuYm9keSksdGhpcy4kc2Nyb2xsRWxlbWVudD1hKGEoYykuaXMoZG9jdW1lbnQuYm9keSk/d2luZG93OmMpLHRoaXMub3B0aW9ucz1hLmV4dGVuZCh7fSxiLkRFRkFVTFRTLGQpLHRoaXMuc2VsZWN0b3I9KHRoaXMub3B0aW9ucy50YXJnZXR8fFwiXCIpK1wiIC5uYXYgbGkgPiBhXCIsdGhpcy5vZmZzZXRzPVtdLHRoaXMudGFyZ2V0cz1bXSx0aGlzLmFjdGl2ZVRhcmdldD1udWxsLHRoaXMuc2Nyb2xsSGVpZ2h0PTAsdGhpcy4kc2Nyb2xsRWxlbWVudC5vbihcInNjcm9sbC5icy5zY3JvbGxzcHlcIixhLnByb3h5KHRoaXMucHJvY2Vzcyx0aGlzKSksdGhpcy5yZWZyZXNoKCksdGhpcy5wcm9jZXNzKCl9ZnVuY3Rpb24gYyhjKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YShcImJzLnNjcm9sbHNweVwiKSxmPVwib2JqZWN0XCI9PXR5cGVvZiBjJiZjO2V8fGQuZGF0YShcImJzLnNjcm9sbHNweVwiLGU9bmV3IGIodGhpcyxmKSksXCJzdHJpbmdcIj09dHlwZW9mIGMmJmVbY10oKX0pfWIuVkVSU0lPTj1cIjMuMy43XCIsYi5ERUZBVUxUUz17b2Zmc2V0OjEwfSxiLnByb3RvdHlwZS5nZXRTY3JvbGxIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2Nyb2xsRWxlbWVudFswXS5zY3JvbGxIZWlnaHR8fE1hdGgubWF4KHRoaXMuJGJvZHlbMF0uc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQpfSxiLnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPVwib2Zmc2V0XCIsZD0wO3RoaXMub2Zmc2V0cz1bXSx0aGlzLnRhcmdldHM9W10sdGhpcy5zY3JvbGxIZWlnaHQ9dGhpcy5nZXRTY3JvbGxIZWlnaHQoKSxhLmlzV2luZG93KHRoaXMuJHNjcm9sbEVsZW1lbnRbMF0pfHwoYz1cInBvc2l0aW9uXCIsZD10aGlzLiRzY3JvbGxFbGVtZW50LnNjcm9sbFRvcCgpKSx0aGlzLiRib2R5LmZpbmQodGhpcy5zZWxlY3RvcikubWFwKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKSxlPWIuZGF0YShcInRhcmdldFwiKXx8Yi5hdHRyKFwiaHJlZlwiKSxmPS9eIy4vLnRlc3QoZSkmJmEoZSk7cmV0dXJuIGYmJmYubGVuZ3RoJiZmLmlzKFwiOnZpc2libGVcIikmJltbZltjXSgpLnRvcCtkLGVdXXx8bnVsbH0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVswXS1iWzBdfSkuZWFjaChmdW5jdGlvbigpe2Iub2Zmc2V0cy5wdXNoKHRoaXNbMF0pLGIudGFyZ2V0cy5wdXNoKHRoaXNbMV0pfSl9LGIucHJvdG90eXBlLnByb2Nlc3M9ZnVuY3Rpb24oKXt2YXIgYSxiPXRoaXMuJHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wKCkrdGhpcy5vcHRpb25zLm9mZnNldCxjPXRoaXMuZ2V0U2Nyb2xsSGVpZ2h0KCksZD10aGlzLm9wdGlvbnMub2Zmc2V0K2MtdGhpcy4kc2Nyb2xsRWxlbWVudC5oZWlnaHQoKSxlPXRoaXMub2Zmc2V0cyxmPXRoaXMudGFyZ2V0cyxnPXRoaXMuYWN0aXZlVGFyZ2V0O2lmKHRoaXMuc2Nyb2xsSGVpZ2h0IT1jJiZ0aGlzLnJlZnJlc2goKSxiPj1kKXJldHVybiBnIT0oYT1mW2YubGVuZ3RoLTFdKSYmdGhpcy5hY3RpdmF0ZShhKTtpZihnJiZiPGVbMF0pcmV0dXJuIHRoaXMuYWN0aXZlVGFyZ2V0PW51bGwsdGhpcy5jbGVhcigpO2ZvcihhPWUubGVuZ3RoO2EtLTspZyE9ZlthXSYmYj49ZVthXSYmKHZvaWQgMD09PWVbYSsxXXx8YjxlW2ErMV0pJiZ0aGlzLmFjdGl2YXRlKGZbYV0pfSxiLnByb3RvdHlwZS5hY3RpdmF0ZT1mdW5jdGlvbihiKXtcbnRoaXMuYWN0aXZlVGFyZ2V0PWIsdGhpcy5jbGVhcigpO3ZhciBjPXRoaXMuc2VsZWN0b3IrJ1tkYXRhLXRhcmdldD1cIicrYisnXCJdLCcrdGhpcy5zZWxlY3RvcisnW2hyZWY9XCInK2IrJ1wiXScsZD1hKGMpLnBhcmVudHMoXCJsaVwiKS5hZGRDbGFzcyhcImFjdGl2ZVwiKTtkLnBhcmVudChcIi5kcm9wZG93bi1tZW51XCIpLmxlbmd0aCYmKGQ9ZC5jbG9zZXN0KFwibGkuZHJvcGRvd25cIikuYWRkQ2xhc3MoXCJhY3RpdmVcIikpLGQudHJpZ2dlcihcImFjdGl2YXRlLmJzLnNjcm9sbHNweVwiKX0sYi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXthKHRoaXMuc2VsZWN0b3IpLnBhcmVudHNVbnRpbCh0aGlzLm9wdGlvbnMudGFyZ2V0LFwiLmFjdGl2ZVwiKS5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKX07dmFyIGQ9YS5mbi5zY3JvbGxzcHk7YS5mbi5zY3JvbGxzcHk9YyxhLmZuLnNjcm9sbHNweS5Db25zdHJ1Y3Rvcj1iLGEuZm4uc2Nyb2xsc3B5Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5zY3JvbGxzcHk9ZCx0aGlzfSxhKHdpbmRvdykub24oXCJsb2FkLmJzLnNjcm9sbHNweS5kYXRhLWFwaVwiLGZ1bmN0aW9uKCl7YSgnW2RhdGEtc3B5PVwic2Nyb2xsXCJdJykuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEodGhpcyk7Yy5jYWxsKGIsYi5kYXRhKCkpfSl9KX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YShcImJzLnRhYlwiKTtlfHxkLmRhdGEoXCJicy50YWJcIixlPW5ldyBjKHRoaXMpKSxcInN0cmluZ1wiPT10eXBlb2YgYiYmZVtiXSgpfSl9dmFyIGM9ZnVuY3Rpb24oYil7dGhpcy5lbGVtZW50PWEoYil9O2MuVkVSU0lPTj1cIjMuMy43XCIsYy5UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxjLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50LGM9Yi5jbG9zZXN0KFwidWw6bm90KC5kcm9wZG93bi1tZW51KVwiKSxkPWIuZGF0YShcInRhcmdldFwiKTtpZihkfHwoZD1iLmF0dHIoXCJocmVmXCIpLGQ9ZCYmZC5yZXBsYWNlKC8uKig/PSNbXlxcc10qJCkvLFwiXCIpKSwhYi5wYXJlbnQoXCJsaVwiKS5oYXNDbGFzcyhcImFjdGl2ZVwiKSl7dmFyIGU9Yy5maW5kKFwiLmFjdGl2ZTpsYXN0IGFcIiksZj1hLkV2ZW50KFwiaGlkZS5icy50YWJcIix7cmVsYXRlZFRhcmdldDpiWzBdfSksZz1hLkV2ZW50KFwic2hvdy5icy50YWJcIix7cmVsYXRlZFRhcmdldDplWzBdfSk7aWYoZS50cmlnZ2VyKGYpLGIudHJpZ2dlcihnKSwhZy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmIWYuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBoPWEoZCk7dGhpcy5hY3RpdmF0ZShiLmNsb3Nlc3QoXCJsaVwiKSxjKSx0aGlzLmFjdGl2YXRlKGgsaC5wYXJlbnQoKSxmdW5jdGlvbigpe2UudHJpZ2dlcih7dHlwZTpcImhpZGRlbi5icy50YWJcIixyZWxhdGVkVGFyZ2V0OmJbMF19KSxiLnRyaWdnZXIoe3R5cGU6XCJzaG93bi5icy50YWJcIixyZWxhdGVkVGFyZ2V0OmVbMF19KX0pfX19LGMucHJvdG90eXBlLmFjdGl2YXRlPWZ1bmN0aW9uKGIsZCxlKXtmdW5jdGlvbiBmKCl7Zy5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKS5maW5kKFwiPiAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmVcIikucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIikuZW5kKCkuZmluZCgnW2RhdGEtdG9nZ2xlPVwidGFiXCJdJykuYXR0cihcImFyaWEtZXhwYW5kZWRcIiwhMSksYi5hZGRDbGFzcyhcImFjdGl2ZVwiKS5maW5kKCdbZGF0YS10b2dnbGU9XCJ0YWJcIl0nKS5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLCEwKSxoPyhiWzBdLm9mZnNldFdpZHRoLGIuYWRkQ2xhc3MoXCJpblwiKSk6Yi5yZW1vdmVDbGFzcyhcImZhZGVcIiksYi5wYXJlbnQoXCIuZHJvcGRvd24tbWVudVwiKS5sZW5ndGgmJmIuY2xvc2VzdChcImxpLmRyb3Bkb3duXCIpLmFkZENsYXNzKFwiYWN0aXZlXCIpLmVuZCgpLmZpbmQoJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXScpLmF0dHIoXCJhcmlhLWV4cGFuZGVkXCIsITApLGUmJmUoKX12YXIgZz1kLmZpbmQoXCI+IC5hY3RpdmVcIiksaD1lJiZhLnN1cHBvcnQudHJhbnNpdGlvbiYmKGcubGVuZ3RoJiZnLmhhc0NsYXNzKFwiZmFkZVwiKXx8ISFkLmZpbmQoXCI+IC5mYWRlXCIpLmxlbmd0aCk7Zy5sZW5ndGgmJmg/Zy5vbmUoXCJic1RyYW5zaXRpb25FbmRcIixmKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChjLlRSQU5TSVRJT05fRFVSQVRJT04pOmYoKSxnLnJlbW92ZUNsYXNzKFwiaW5cIil9O3ZhciBkPWEuZm4udGFiO2EuZm4udGFiPWIsYS5mbi50YWIuQ29uc3RydWN0b3I9YyxhLmZuLnRhYi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4udGFiPWQsdGhpc307dmFyIGU9ZnVuY3Rpb24oYyl7Yy5wcmV2ZW50RGVmYXVsdCgpLGIuY2FsbChhKHRoaXMpLFwic2hvd1wiKX07YShkb2N1bWVudCkub24oXCJjbGljay5icy50YWIuZGF0YS1hcGlcIiwnW2RhdGEtdG9nZ2xlPVwidGFiXCJdJyxlKS5vbihcImNsaWNrLmJzLnRhYi5kYXRhLWFwaVwiLCdbZGF0YS10b2dnbGU9XCJwaWxsXCJdJyxlKX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YShcImJzLmFmZml4XCIpLGY9XCJvYmplY3RcIj09dHlwZW9mIGImJmI7ZXx8ZC5kYXRhKFwiYnMuYWZmaXhcIixlPW5ldyBjKHRoaXMsZikpLFwic3RyaW5nXCI9PXR5cGVvZiBiJiZlW2JdKCl9KX12YXIgYz1mdW5jdGlvbihiLGQpe3RoaXMub3B0aW9ucz1hLmV4dGVuZCh7fSxjLkRFRkFVTFRTLGQpLHRoaXMuJHRhcmdldD1hKHRoaXMub3B0aW9ucy50YXJnZXQpLm9uKFwic2Nyb2xsLmJzLmFmZml4LmRhdGEtYXBpXCIsYS5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb24sdGhpcykpLm9uKFwiY2xpY2suYnMuYWZmaXguZGF0YS1hcGlcIixhLnByb3h5KHRoaXMuY2hlY2tQb3NpdGlvbldpdGhFdmVudExvb3AsdGhpcykpLHRoaXMuJGVsZW1lbnQ9YShiKSx0aGlzLmFmZml4ZWQ9bnVsbCx0aGlzLnVucGluPW51bGwsdGhpcy5waW5uZWRPZmZzZXQ9bnVsbCx0aGlzLmNoZWNrUG9zaXRpb24oKX07Yy5WRVJTSU9OPVwiMy4zLjdcIixjLlJFU0VUPVwiYWZmaXggYWZmaXgtdG9wIGFmZml4LWJvdHRvbVwiLGMuREVGQVVMVFM9e29mZnNldDowLHRhcmdldDp3aW5kb3d9LGMucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuJHRhcmdldC5zY3JvbGxUb3AoKSxmPXRoaXMuJGVsZW1lbnQub2Zmc2V0KCksZz10aGlzLiR0YXJnZXQuaGVpZ2h0KCk7aWYobnVsbCE9YyYmXCJ0b3BcIj09dGhpcy5hZmZpeGVkKXJldHVybiBlPGMmJlwidG9wXCI7aWYoXCJib3R0b21cIj09dGhpcy5hZmZpeGVkKXJldHVybiBudWxsIT1jPyEoZSt0aGlzLnVucGluPD1mLnRvcCkmJlwiYm90dG9tXCI6IShlK2c8PWEtZCkmJlwiYm90dG9tXCI7dmFyIGg9bnVsbD09dGhpcy5hZmZpeGVkLGk9aD9lOmYudG9wLGo9aD9nOmI7cmV0dXJuIG51bGwhPWMmJmU8PWM/XCJ0b3BcIjpudWxsIT1kJiZpK2o+PWEtZCYmXCJib3R0b21cIn0sYy5wcm90b3R5cGUuZ2V0UGlubmVkT2Zmc2V0PWZ1bmN0aW9uKCl7aWYodGhpcy5waW5uZWRPZmZzZXQpcmV0dXJuIHRoaXMucGlubmVkT2Zmc2V0O3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoYy5SRVNFVCkuYWRkQ2xhc3MoXCJhZmZpeFwiKTt2YXIgYT10aGlzLiR0YXJnZXQuc2Nyb2xsVG9wKCksYj10aGlzLiRlbGVtZW50Lm9mZnNldCgpO3JldHVybiB0aGlzLnBpbm5lZE9mZnNldD1iLnRvcC1hfSxjLnByb3RvdHlwZS5jaGVja1Bvc2l0aW9uV2l0aEV2ZW50TG9vcD1mdW5jdGlvbigpe3NldFRpbWVvdXQoYS5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb24sdGhpcyksMSl9LGMucHJvdG90eXBlLmNoZWNrUG9zaXRpb249ZnVuY3Rpb24oKXtpZih0aGlzLiRlbGVtZW50LmlzKFwiOnZpc2libGVcIikpe3ZhciBiPXRoaXMuJGVsZW1lbnQuaGVpZ2h0KCksZD10aGlzLm9wdGlvbnMub2Zmc2V0LGU9ZC50b3AsZj1kLmJvdHRvbSxnPU1hdGgubWF4KGEoZG9jdW1lbnQpLmhlaWdodCgpLGEoZG9jdW1lbnQuYm9keSkuaGVpZ2h0KCkpO1wib2JqZWN0XCIhPXR5cGVvZiBkJiYoZj1lPWQpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJihlPWQudG9wKHRoaXMuJGVsZW1lbnQpKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBmJiYoZj1kLmJvdHRvbSh0aGlzLiRlbGVtZW50KSk7dmFyIGg9dGhpcy5nZXRTdGF0ZShnLGIsZSxmKTtpZih0aGlzLmFmZml4ZWQhPWgpe251bGwhPXRoaXMudW5waW4mJnRoaXMuJGVsZW1lbnQuY3NzKFwidG9wXCIsXCJcIik7dmFyIGk9XCJhZmZpeFwiKyhoP1wiLVwiK2g6XCJcIiksaj1hLkV2ZW50KGkrXCIuYnMuYWZmaXhcIik7aWYodGhpcy4kZWxlbWVudC50cmlnZ2VyKGopLGouaXNEZWZhdWx0UHJldmVudGVkKCkpcmV0dXJuO3RoaXMuYWZmaXhlZD1oLHRoaXMudW5waW49XCJib3R0b21cIj09aD90aGlzLmdldFBpbm5lZE9mZnNldCgpOm51bGwsdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyhjLlJFU0VUKS5hZGRDbGFzcyhpKS50cmlnZ2VyKGkucmVwbGFjZShcImFmZml4XCIsXCJhZmZpeGVkXCIpK1wiLmJzLmFmZml4XCIpfVwiYm90dG9tXCI9PWgmJnRoaXMuJGVsZW1lbnQub2Zmc2V0KHt0b3A6Zy1iLWZ9KX19O3ZhciBkPWEuZm4uYWZmaXg7YS5mbi5hZmZpeD1iLGEuZm4uYWZmaXguQ29uc3RydWN0b3I9YyxhLmZuLmFmZml4Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5hZmZpeD1kLHRoaXN9LGEod2luZG93KS5vbihcImxvYWRcIixmdW5jdGlvbigpe2EoJ1tkYXRhLXNweT1cImFmZml4XCJdJykuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1jLmRhdGEoKTtkLm9mZnNldD1kLm9mZnNldHx8e30sbnVsbCE9ZC5vZmZzZXRCb3R0b20mJihkLm9mZnNldC5ib3R0b209ZC5vZmZzZXRCb3R0b20pLG51bGwhPWQub2Zmc2V0VG9wJiYoZC5vZmZzZXQudG9wPWQub2Zmc2V0VG9wKSxiLmNhbGwoYyxkKX0pfSl9KGpRdWVyeSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC9kaXN0L2pzL2Jvb3RzdHJhcC5taW4uanNcbi8vIG1vZHVsZSBpZCA9IDUwXG4vLyBtb2R1bGUgY2h1bmtzID0gMSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///50\n");
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("!function t(e,r){ true?module.exports=r():\"function\"==typeof define&&define.amd?define([],r):\"object\"==typeof exports?exports.Raphael=r():e.Raphael=r()}(this,function(){return function(t){function e(i){if(r[i])return r[i].exports;var n=r[i]={exports:{},id:i,loaded:!1};return t[i].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var r={};return e.m=t,e.c=r,e.p=\"\",e(0)}([function(t,e,r){var i,n;i=[r(1),r(3),r(4)],n=function(t){return t}.apply(e,i),!(void 0!==n&&(t.exports=n))},function(t,e,r){var i,n;i=[r(2)],n=function(t){function e(r){if(e.is(r,\"function\"))return w?r():t.on(\"raphael.DOMload\",r);if(e.is(r,Q))return e._engine.create[z](e,r.splice(0,3+e.is(r[0],$))).add(r);var i=Array.prototype.slice.call(arguments,0);if(e.is(i[i.length-1],\"function\")){var n=i.pop();return w?n.call(e._engine.create[z](e,i)):t.on(\"raphael.DOMload\",function(){n.call(e._engine.create[z](e,i))})}return e._engine.create[z](e,arguments)}function r(t){if(\"function\"==typeof t||Object(t)!==t)return t;var e=new t.constructor;for(var i in t)t[A](i)&&(e[i]=r(t[i]));return e}function i(t,e){for(var r=0,i=t.length;r<i;r++)if(t[r]===e)return t.push(t.splice(r,1)[0])}function n(t,e,r){function n(){var a=Array.prototype.slice.call(arguments,0),s=a.join(\"␀\"),o=n.cache=n.cache||{},l=n.count=n.count||[];return o[A](s)?(i(l,s),r?r(o[s]):o[s]):(l.length>=1e3&&delete o[l.shift()],l.push(s),o[s]=t[z](e,a),r?r(o[s]):o[s])}return n}function a(){return this.hex}function s(t,e){for(var r=[],i=0,n=t.length;n-2*!e>i;i+=2){var a=[{x:+t[i-2],y:+t[i-1]},{x:+t[i],y:+t[i+1]},{x:+t[i+2],y:+t[i+3]},{x:+t[i+4],y:+t[i+5]}];e?i?n-4==i?a[3]={x:+t[0],y:+t[1]}:n-2==i&&(a[2]={x:+t[0],y:+t[1]},a[3]={x:+t[2],y:+t[3]}):a[0]={x:+t[n-2],y:+t[n-1]}:n-4==i?a[3]=a[2]:i||(a[0]={x:+t[i],y:+t[i+1]}),r.push([\"C\",(-a[0].x+6*a[1].x+a[2].x)/6,(-a[0].y+6*a[1].y+a[2].y)/6,(a[1].x+6*a[2].x-a[3].x)/6,(a[1].y+6*a[2].y-a[3].y)/6,a[2].x,a[2].y])}return r}function o(t,e,r,i,n){var a=-3*e+9*r-9*i+3*n,s=t*a+6*e-12*r+6*i;return t*s-3*e+3*r}function l(t,e,r,i,n,a,s,l,h){null==h&&(h=1),h=h>1?1:h<0?0:h;for(var u=h/2,c=12,f=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],p=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],d=0,g=0;g<c;g++){var v=u*f[g]+u,x=o(v,t,r,n,s),y=o(v,e,i,a,l),m=x*x+y*y;d+=p[g]*Y.sqrt(m)}return u*d}function h(t,e,r,i,n,a,s,o,h){if(!(h<0||l(t,e,r,i,n,a,s,o)<h)){var u=1,c=u/2,f=u-c,p,d=.01;for(p=l(t,e,r,i,n,a,s,o,f);H(p-h)>d;)c/=2,f+=(p<h?1:-1)*c,p=l(t,e,r,i,n,a,s,o,f);return f}}function u(t,e,r,i,n,a,s,o){if(!(W(t,r)<G(n,s)||G(t,r)>W(n,s)||W(e,i)<G(a,o)||G(e,i)>W(a,o))){var l=(t*i-e*r)*(n-s)-(t-r)*(n*o-a*s),h=(t*i-e*r)*(a-o)-(e-i)*(n*o-a*s),u=(t-r)*(a-o)-(e-i)*(n-s);if(u){var c=l/u,f=h/u,p=+c.toFixed(2),d=+f.toFixed(2);if(!(p<+G(t,r).toFixed(2)||p>+W(t,r).toFixed(2)||p<+G(n,s).toFixed(2)||p>+W(n,s).toFixed(2)||d<+G(e,i).toFixed(2)||d>+W(e,i).toFixed(2)||d<+G(a,o).toFixed(2)||d>+W(a,o).toFixed(2)))return{x:c,y:f}}}}function c(t,e){return p(t,e)}function f(t,e){return p(t,e,1)}function p(t,r,i){var n=e.bezierBBox(t),a=e.bezierBBox(r);if(!e.isBBoxIntersect(n,a))return i?0:[];for(var s=l.apply(0,t),o=l.apply(0,r),h=W(~~(s/5),1),c=W(~~(o/5),1),f=[],p=[],d={},g=i?0:[],v=0;v<h+1;v++){var x=e.findDotsAtSegment.apply(e,t.concat(v/h));f.push({x:x.x,y:x.y,t:v/h})}for(v=0;v<c+1;v++)x=e.findDotsAtSegment.apply(e,r.concat(v/c)),p.push({x:x.x,y:x.y,t:v/c});for(v=0;v<h;v++)for(var y=0;y<c;y++){var m=f[v],b=f[v+1],_=p[y],w=p[y+1],k=H(b.x-m.x)<.001?\"y\":\"x\",B=H(w.x-_.x)<.001?\"y\":\"x\",C=u(m.x,m.y,b.x,b.y,_.x,_.y,w.x,w.y);if(C){if(d[C.x.toFixed(4)]==C.y.toFixed(4))continue;d[C.x.toFixed(4)]=C.y.toFixed(4);var S=m.t+H((C[k]-m[k])/(b[k]-m[k]))*(b.t-m.t),A=_.t+H((C[B]-_[B])/(w[B]-_[B]))*(w.t-_.t);S>=0&&S<=1.001&&A>=0&&A<=1.001&&(i?g++:g.push({x:C.x,y:C.y,t1:G(S,1),t2:G(A,1)}))}}return g}function d(t,r,i){t=e._path2curve(t),r=e._path2curve(r);for(var n,a,s,o,l,h,u,c,f,d,g=i?0:[],v=0,x=t.length;v<x;v++){var y=t[v];if(\"M\"==y[0])n=l=y[1],a=h=y[2];else{\"C\"==y[0]?(f=[n,a].concat(y.slice(1)),n=f[6],a=f[7]):(f=[n,a,n,a,l,h,l,h],n=l,a=h);for(var m=0,b=r.length;m<b;m++){var _=r[m];if(\"M\"==_[0])s=u=_[1],o=c=_[2];else{\"C\"==_[0]?(d=[s,o].concat(_.slice(1)),s=d[6],o=d[7]):(d=[s,o,s,o,u,c,u,c],s=u,o=c);var w=p(f,d,i);if(i)g+=w;else{for(var k=0,B=w.length;k<B;k++)w[k].segment1=v,w[k].segment2=m,w[k].bez1=f,w[k].bez2=d;g=g.concat(w)}}}}}return g}function g(t,e,r,i,n,a){null!=t?(this.a=+t,this.b=+e,this.c=+r,this.d=+i,this.e=+n,this.f=+a):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function v(){return this.x+j+this.y}function x(){return this.x+j+this.y+j+this.width+\" × \"+this.height}function y(t,e,r,i,n,a){function s(t){return((c*t+u)*t+h)*t}function o(t,e){var r=l(t,e);return((d*r+p)*r+f)*r}function l(t,e){var r,i,n,a,o,l;for(n=t,l=0;l<8;l++){if(a=s(n)-t,H(a)<e)return n;if(o=(3*c*n+2*u)*n+h,H(o)<1e-6)break;n-=a/o}if(r=0,i=1,n=t,n<r)return r;if(n>i)return i;for(;r<i;){if(a=s(n),H(a-t)<e)return n;t>a?r=n:i=n,n=(i-r)/2+r}return n}var h=3*e,u=3*(i-e)-h,c=1-h-u,f=3*r,p=3*(n-r)-f,d=1-f-p;return o(t,1/(200*a))}function m(t,e){var r=[],i={};if(this.ms=e,this.times=1,t){for(var n in t)t[A](n)&&(i[ht(n)]=t[n],r.push(ht(n)));r.sort(Bt)}this.anim=i,this.top=r[r.length-1],this.percents=r}function b(r,i,n,a,s,o){n=ht(n);var l,h,u,c=[],f,p,d,v=r.ms,x={},m={},b={};if(a)for(w=0,B=Ee.length;w<B;w++){var _=Ee[w];if(_.el.id==i.id&&_.anim==r){_.percent!=n?(Ee.splice(w,1),u=1):h=_,i.attr(_.totalOrigin);break}}else a=+m;for(var w=0,B=r.percents.length;w<B;w++){if(r.percents[w]==n||r.percents[w]>a*r.top){n=r.percents[w],p=r.percents[w-1]||0,v=v/r.top*(n-p),f=r.percents[w+1],l=r.anim[n];break}a&&i.attr(r.anim[r.percents[w]])}if(l){if(h)h.initstatus=a,h.start=new Date-h.ms*a;else{for(var C in l)if(l[A](C)&&(pt[A](C)||i.paper.customAttributes[A](C)))switch(x[C]=i.attr(C),null==x[C]&&(x[C]=ft[C]),m[C]=l[C],pt[C]){case $:b[C]=(m[C]-x[C])/v;break;case\"colour\":x[C]=e.getRGB(x[C]);var S=e.getRGB(m[C]);b[C]={r:(S.r-x[C].r)/v,g:(S.g-x[C].g)/v,b:(S.b-x[C].b)/v};break;case\"path\":var T=Qt(x[C],m[C]),E=T[1];for(x[C]=T[0],b[C]=[],w=0,B=x[C].length;w<B;w++){b[C][w]=[0];for(var M=1,N=x[C][w].length;M<N;M++)b[C][w][M]=(E[w][M]-x[C][w][M])/v}break;case\"transform\":var L=i._,z=le(L[C],m[C]);if(z)for(x[C]=z.from,m[C]=z.to,b[C]=[],b[C].real=!0,w=0,B=x[C].length;w<B;w++)for(b[C][w]=[x[C][w][0]],M=1,N=x[C][w].length;M<N;M++)b[C][w][M]=(m[C][w][M]-x[C][w][M])/v;else{var F=i.matrix||new g,R={_:{transform:L.transform},getBBox:function(){return i.getBBox(1)}};x[C]=[F.a,F.b,F.c,F.d,F.e,F.f],se(R,m[C]),m[C]=R._.transform,b[C]=[(R.matrix.a-F.a)/v,(R.matrix.b-F.b)/v,(R.matrix.c-F.c)/v,(R.matrix.d-F.d)/v,(R.matrix.e-F.e)/v,(R.matrix.f-F.f)/v]}break;case\"csv\":var j=I(l[C])[q](k),D=I(x[C])[q](k);if(\"clip-rect\"==C)for(x[C]=D,b[C]=[],w=D.length;w--;)b[C][w]=(j[w]-x[C][w])/v;m[C]=j;break;default:for(j=[][P](l[C]),D=[][P](x[C]),b[C]=[],w=i.paper.customAttributes[C].length;w--;)b[C][w]=((j[w]||0)-(D[w]||0))/v}var V=l.easing,O=e.easing_formulas[V];if(!O)if(O=I(V).match(st),O&&5==O.length){var Y=O;O=function(t){return y(t,+Y[1],+Y[2],+Y[3],+Y[4],v)}}else O=St;if(d=l.start||r.start||+new Date,_={anim:r,percent:n,timestamp:d,start:d+(r.del||0),status:0,initstatus:a||0,stop:!1,ms:v,easing:O,from:x,diff:b,to:m,el:i,callback:l.callback,prev:p,next:f,repeat:o||r.times,origin:i.attr(),totalOrigin:s},Ee.push(_),a&&!h&&!u&&(_.stop=!0,_.start=new Date-v*a,1==Ee.length))return Ne();u&&(_.start=new Date-_.ms*a),1==Ee.length&&Me(Ne)}t(\"raphael.anim.start.\"+i.id,i,r)}}function _(t){for(var e=0;e<Ee.length;e++)Ee[e].el.paper==t&&Ee.splice(e--,1)}e.version=\"2.2.0\",e.eve=t;var w,k=/[, ]+/,B={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},C=/\\{(\\d+)\\}/g,S=\"prototype\",A=\"hasOwnProperty\",T={doc:document,win:window},E={was:Object.prototype[A].call(T.win,\"Raphael\"),is:T.win.Raphael},M=function(){this.ca=this.customAttributes={}},N,L=\"appendChild\",z=\"apply\",P=\"concat\",F=\"ontouchstart\"in T.win||T.win.DocumentTouch&&T.doc instanceof DocumentTouch,R=\"\",j=\" \",I=String,q=\"split\",D=\"click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel\"[q](j),V={mousedown:\"touchstart\",mousemove:\"touchmove\",mouseup:\"touchend\"},O=I.prototype.toLowerCase,Y=Math,W=Y.max,G=Y.min,H=Y.abs,X=Y.pow,U=Y.PI,$=\"number\",Z=\"string\",Q=\"array\",J=\"toString\",K=\"fill\",tt=Object.prototype.toString,et={},rt=\"push\",it=e._ISURL=/^url\\(['\"]?(.+?)['\"]?\\)$/i,nt=/^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?)%?\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?)%?\\s*\\))\\s*$/i,at={NaN:1,Infinity:1,\"-Infinity\":1},st=/^(?:cubic-)?bezier\\(([^,]+),([^,]+),([^,]+),([^\\)]+)\\)/,ot=Y.round,lt=\"setAttribute\",ht=parseFloat,ut=parseInt,ct=I.prototype.toUpperCase,ft=e._availableAttrs={\"arrow-end\":\"none\",\"arrow-start\":\"none\",blur:0,\"clip-rect\":\"0 0 1e9 1e9\",cursor:\"default\",cx:0,cy:0,fill:\"#fff\",\"fill-opacity\":1,font:'10px \"Arial\"',\"font-family\":'\"Arial\"',\"font-size\":\"10\",\"font-style\":\"normal\",\"font-weight\":400,gradient:0,height:0,href:\"http://raphaeljs.com/\",\"letter-spacing\":0,opacity:1,path:\"M0,0\",r:0,rx:0,ry:0,src:\"\",stroke:\"#000\",\"stroke-dasharray\":\"\",\"stroke-linecap\":\"butt\",\"stroke-linejoin\":\"butt\",\"stroke-miterlimit\":0,\"stroke-opacity\":1,\"stroke-width\":1,target:\"_blank\",\"text-anchor\":\"middle\",title:\"Raphael\",transform:\"\",width:0,x:0,y:0,\"class\":\"\"},pt=e._availableAnimAttrs={blur:$,\"clip-rect\":\"csv\",cx:$,cy:$,fill:\"colour\",\"fill-opacity\":$,\"font-size\":$,height:$,opacity:$,path:\"path\",r:$,rx:$,ry:$,stroke:\"colour\",\"stroke-opacity\":$,\"stroke-width\":$,transform:\"transform\",width:$,x:$,y:$},dt=/[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]/g,gt=/[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*/,vt={hs:1,rg:1},xt=/,?([achlmqrstvxz]),?/gi,yt=/([achlmrqstvz])[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*)+)/gi,mt=/([rstm])[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*)+)/gi,bt=/(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*/gi,_t=e._radial_gradient=/^r(?:\\(([^,]+?)[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*([^\\)]+?)\\))?/,wt={},kt=function(t,e){return t.key-e.key},Bt=function(t,e){return ht(t)-ht(e)},Ct=function(){},St=function(t){return t},At=e._rectPath=function(t,e,r,i,n){return n?[[\"M\",t+n,e],[\"l\",r-2*n,0],[\"a\",n,n,0,0,1,n,n],[\"l\",0,i-2*n],[\"a\",n,n,0,0,1,-n,n],[\"l\",2*n-r,0],[\"a\",n,n,0,0,1,-n,-n],[\"l\",0,2*n-i],[\"a\",n,n,0,0,1,n,-n],[\"z\"]]:[[\"M\",t,e],[\"l\",r,0],[\"l\",0,i],[\"l\",-r,0],[\"z\"]]},Tt=function(t,e,r,i){return null==i&&(i=r),[[\"M\",t,e],[\"m\",0,-i],[\"a\",r,i,0,1,1,0,2*i],[\"a\",r,i,0,1,1,0,-2*i],[\"z\"]]},Et=e._getPath={path:function(t){return t.attr(\"path\")},circle:function(t){var e=t.attrs;return Tt(e.cx,e.cy,e.r)},ellipse:function(t){var e=t.attrs;return Tt(e.cx,e.cy,e.rx,e.ry)},rect:function(t){var e=t.attrs;return At(e.x,e.y,e.width,e.height,e.r)},image:function(t){var e=t.attrs;return At(e.x,e.y,e.width,e.height)},text:function(t){var e=t._getBBox();return At(e.x,e.y,e.width,e.height)},set:function(t){var e=t._getBBox();return At(e.x,e.y,e.width,e.height)}},Mt=e.mapPath=function(t,e){if(!e)return t;var r,i,n,a,s,o,l;for(t=Qt(t),n=0,s=t.length;n<s;n++)for(l=t[n],a=1,o=l.length;a<o;a+=2)r=e.x(l[a],l[a+1]),i=e.y(l[a],l[a+1]),l[a]=r,l[a+1]=i;return t};if(e._g=T,e.type=T.win.SVGAngle||T.doc.implementation.hasFeature(\"http://www.w3.org/TR/SVG11/feature#BasicStructure\",\"1.1\")?\"SVG\":\"VML\",\"VML\"==e.type){var Nt=T.doc.createElement(\"div\"),Lt;if(Nt.innerHTML='<v:shape adj=\"1\"/>',Lt=Nt.firstChild,Lt.style.behavior=\"url(#default#VML)\",!Lt||\"object\"!=typeof Lt.adj)return e.type=R;Nt=null}e.svg=!(e.vml=\"VML\"==e.type),e._Paper=M,e.fn=N=M.prototype=e.prototype,e._id=0,e.is=function(t,e){return e=O.call(e),\"finite\"==e?!at[A](+t):\"array\"==e?t instanceof Array:\"null\"==e&&null===t||e==typeof t&&null!==t||\"object\"==e&&t===Object(t)||\"array\"==e&&Array.isArray&&Array.isArray(t)||tt.call(t).slice(8,-1).toLowerCase()==e},e.angle=function(t,r,i,n,a,s){if(null==a){var o=t-i,l=r-n;return o||l?(180+180*Y.atan2(-l,-o)/U+360)%360:0}return e.angle(t,r,a,s)-e.angle(i,n,a,s)},e.rad=function(t){return t%360*U/180},e.deg=function(t){return Math.round(180*t/U%360*1e3)/1e3},e.snapTo=function(t,r,i){if(i=e.is(i,\"finite\")?i:10,e.is(t,Q)){for(var n=t.length;n--;)if(H(t[n]-r)<=i)return t[n]}else{t=+t;var a=r%t;if(a<i)return r-a;if(a>t-i)return r-a+t}return r};var zt=e.createUUID=function(t,e){return function(){return\"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(t,e).toUpperCase()}}(/[xy]/g,function(t){var e=16*Y.random()|0,r=\"x\"==t?e:3&e|8;return r.toString(16)});e.setWindow=function(r){t(\"raphael.setWindow\",e,T.win,r),T.win=r,T.doc=T.win.document,e._engine.initWin&&e._engine.initWin(T.win)};var Pt=function(t){if(e.vml){var r=/^\\s+|\\s+$/g,i;try{var a=new ActiveXObject(\"htmlfile\");a.write(\"<body>\"),a.close(),i=a.body}catch(s){i=createPopup().document.body}var o=i.createTextRange();Pt=n(function(t){try{i.style.color=I(t).replace(r,R);var e=o.queryCommandValue(\"ForeColor\");return e=(255&e)<<16|65280&e|(16711680&e)>>>16,\"#\"+(\"000000\"+e.toString(16)).slice(-6)}catch(n){return\"none\"}})}else{var l=T.doc.createElement(\"i\");l.title=\"Raphaël Colour Picker\",l.style.display=\"none\",T.doc.body.appendChild(l),Pt=n(function(t){return l.style.color=t,T.doc.defaultView.getComputedStyle(l,R).getPropertyValue(\"color\")})}return Pt(t)},Ft=function(){return\"hsb(\"+[this.h,this.s,this.b]+\")\"},Rt=function(){return\"hsl(\"+[this.h,this.s,this.l]+\")\"},jt=function(){return this.hex},It=function(t,r,i){if(null==r&&e.is(t,\"object\")&&\"r\"in t&&\"g\"in t&&\"b\"in t&&(i=t.b,r=t.g,t=t.r),null==r&&e.is(t,Z)){var n=e.getRGB(t);t=n.r,r=n.g,i=n.b}return(t>1||r>1||i>1)&&(t/=255,r/=255,i/=255),[t,r,i]},qt=function(t,r,i,n){t*=255,r*=255,i*=255;var a={r:t,g:r,b:i,hex:e.rgb(t,r,i),toString:jt};return e.is(n,\"finite\")&&(a.opacity=n),a};e.color=function(t){var r;return e.is(t,\"object\")&&\"h\"in t&&\"s\"in t&&\"b\"in t?(r=e.hsb2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.hex=r.hex):e.is(t,\"object\")&&\"h\"in t&&\"s\"in t&&\"l\"in t?(r=e.hsl2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.hex=r.hex):(e.is(t,\"string\")&&(t=e.getRGB(t)),e.is(t,\"object\")&&\"r\"in t&&\"g\"in t&&\"b\"in t?(r=e.rgb2hsl(t),t.h=r.h,t.s=r.s,t.l=r.l,r=e.rgb2hsb(t),t.v=r.b):(t={hex:\"none\"},t.r=t.g=t.b=t.h=t.s=t.v=t.l=-1)),t.toString=jt,t},e.hsb2rgb=function(t,e,r,i){this.is(t,\"object\")&&\"h\"in t&&\"s\"in t&&\"b\"in t&&(r=t.b,e=t.s,i=t.o,t=t.h),t*=360;var n,a,s,o,l;return t=t%360/60,l=r*e,o=l*(1-H(t%2-1)),n=a=s=r-l,t=~~t,n+=[l,o,0,0,o,l][t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],qt(n,a,s,i)},e.hsl2rgb=function(t,e,r,i){this.is(t,\"object\")&&\"h\"in t&&\"s\"in t&&\"l\"in t&&(r=t.l,e=t.s,t=t.h),(t>1||e>1||r>1)&&(t/=360,e/=100,r/=100),t*=360;var n,a,s,o,l;return t=t%360/60,l=2*e*(r<.5?r:1-r),o=l*(1-H(t%2-1)),n=a=s=r-l/2,t=~~t,n+=[l,o,0,0,o,l][t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],qt(n,a,s,i)},e.rgb2hsb=function(t,e,r){r=It(t,e,r),t=r[0],e=r[1],r=r[2];var i,n,a,s;return a=W(t,e,r),s=a-G(t,e,r),i=0==s?null:a==t?(e-r)/s:a==e?(r-t)/s+2:(t-e)/s+4,i=(i+360)%6*60/360,n=0==s?0:s/a,{h:i,s:n,b:a,toString:Ft}},e.rgb2hsl=function(t,e,r){r=It(t,e,r),t=r[0],e=r[1],r=r[2];var i,n,a,s,o,l;return s=W(t,e,r),o=G(t,e,r),l=s-o,i=0==l?null:s==t?(e-r)/l:s==e?(r-t)/l+2:(t-e)/l+4,i=(i+360)%6*60/360,a=(s+o)/2,n=0==l?0:a<.5?l/(2*a):l/(2-2*a),{h:i,s:n,l:a,toString:Rt}},e._path2string=function(){return this.join(\",\").replace(xt,\"$1\")};var Dt=e._preload=function(t,e){var r=T.doc.createElement(\"img\");r.style.cssText=\"position:absolute;left:-9999em;top:-9999em\",r.onload=function(){e.call(this),this.onload=null,T.doc.body.removeChild(this)},r.onerror=function(){T.doc.body.removeChild(this)},T.doc.body.appendChild(r),r.src=t};e.getRGB=n(function(t){if(!t||(t=I(t)).indexOf(\"-\")+1)return{r:-1,g:-1,b:-1,hex:\"none\",error:1,toString:a};if(\"none\"==t)return{r:-1,g:-1,b:-1,hex:\"none\",toString:a};!(vt[A](t.toLowerCase().substring(0,2))||\"#\"==t.charAt())&&(t=Pt(t));var r,i,n,s,o,l,h,u=t.match(nt);return u?(u[2]&&(s=ut(u[2].substring(5),16),n=ut(u[2].substring(3,5),16),i=ut(u[2].substring(1,3),16)),u[3]&&(s=ut((l=u[3].charAt(3))+l,16),n=ut((l=u[3].charAt(2))+l,16),i=ut((l=u[3].charAt(1))+l,16)),u[4]&&(h=u[4][q](gt),i=ht(h[0]),\"%\"==h[0].slice(-1)&&(i*=2.55),n=ht(h[1]),\"%\"==h[1].slice(-1)&&(n*=2.55),s=ht(h[2]),\"%\"==h[2].slice(-1)&&(s*=2.55),\"rgba\"==u[1].toLowerCase().slice(0,4)&&(o=ht(h[3])),h[3]&&\"%\"==h[3].slice(-1)&&(o/=100)),u[5]?(h=u[5][q](gt),i=ht(h[0]),\"%\"==h[0].slice(-1)&&(i*=2.55),n=ht(h[1]),\"%\"==h[1].slice(-1)&&(n*=2.55),s=ht(h[2]),\"%\"==h[2].slice(-1)&&(s*=2.55),(\"deg\"==h[0].slice(-3)||\"°\"==h[0].slice(-1))&&(i/=360),\"hsba\"==u[1].toLowerCase().slice(0,4)&&(o=ht(h[3])),h[3]&&\"%\"==h[3].slice(-1)&&(o/=100),e.hsb2rgb(i,n,s,o)):u[6]?(h=u[6][q](gt),i=ht(h[0]),\"%\"==h[0].slice(-1)&&(i*=2.55),n=ht(h[1]),\"%\"==h[1].slice(-1)&&(n*=2.55),s=ht(h[2]),\"%\"==h[2].slice(-1)&&(s*=2.55),(\"deg\"==h[0].slice(-3)||\"°\"==h[0].slice(-1))&&(i/=360),\"hsla\"==u[1].toLowerCase().slice(0,4)&&(o=ht(h[3])),h[3]&&\"%\"==h[3].slice(-1)&&(o/=100),e.hsl2rgb(i,n,s,o)):(u={r:i,g:n,b:s,toString:a},u.hex=\"#\"+(16777216|s|n<<8|i<<16).toString(16).slice(1),e.is(o,\"finite\")&&(u.opacity=o),u)):{r:-1,g:-1,b:-1,hex:\"none\",error:1,toString:a}},e),e.hsb=n(function(t,r,i){return e.hsb2rgb(t,r,i).hex}),e.hsl=n(function(t,r,i){return e.hsl2rgb(t,r,i).hex}),e.rgb=n(function(t,e,r){function i(t){return t+.5|0}return\"#\"+(16777216|i(r)|i(e)<<8|i(t)<<16).toString(16).slice(1)}),e.getColor=function(t){var e=this.getColor.start=this.getColor.start||{h:0,s:1,b:t||.75},r=this.hsb2rgb(e.h,e.s,e.b);return e.h+=.075,e.h>1&&(e.h=0,e.s-=.2,e.s<=0&&(this.getColor.start={h:0,s:1,b:e.b})),r.hex},e.getColor.reset=function(){delete this.start},e.parsePathString=function(t){if(!t)return null;var r=Vt(t);if(r.arr)return Yt(r.arr);var i={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},n=[];return e.is(t,Q)&&e.is(t[0],Q)&&(n=Yt(t)),n.length||I(t).replace(yt,function(t,e,r){var a=[],s=e.toLowerCase();if(r.replace(bt,function(t,e){e&&a.push(+e)}),\"m\"==s&&a.length>2&&(n.push([e][P](a.splice(0,2))),s=\"l\",e=\"m\"==e?\"l\":\"L\"),\"r\"==s)n.push([e][P](a));else for(;a.length>=i[s]&&(n.push([e][P](a.splice(0,i[s]))),i[s]););}),n.toString=e._path2string,r.arr=Yt(n),n},e.parseTransformString=n(function(t){if(!t)return null;var r={r:3,s:4,t:2,m:6},i=[];return e.is(t,Q)&&e.is(t[0],Q)&&(i=Yt(t)),i.length||I(t).replace(mt,function(t,e,r){var n=[],a=O.call(e);r.replace(bt,function(t,e){e&&n.push(+e)}),i.push([e][P](n))}),i.toString=e._path2string,i});var Vt=function(t){var e=Vt.ps=Vt.ps||{};return e[t]?e[t].sleep=100:e[t]={sleep:100},setTimeout(function(){for(var r in e)e[A](r)&&r!=t&&(e[r].sleep--,!e[r].sleep&&delete e[r])}),e[t]};e.findDotsAtSegment=function(t,e,r,i,n,a,s,o,l){var h=1-l,u=X(h,3),c=X(h,2),f=l*l,p=f*l,d=u*t+3*c*l*r+3*h*l*l*n+p*s,g=u*e+3*c*l*i+3*h*l*l*a+p*o,v=t+2*l*(r-t)+f*(n-2*r+t),x=e+2*l*(i-e)+f*(a-2*i+e),y=r+2*l*(n-r)+f*(s-2*n+r),m=i+2*l*(a-i)+f*(o-2*a+i),b=h*t+l*r,_=h*e+l*i,w=h*n+l*s,k=h*a+l*o,B=90-180*Y.atan2(v-y,x-m)/U;return(v>y||x<m)&&(B+=180),{x:d,y:g,m:{x:v,y:x},n:{x:y,y:m},start:{x:b,y:_},end:{x:w,y:k},alpha:B}},e.bezierBBox=function(t,r,i,n,a,s,o,l){e.is(t,\"array\")||(t=[t,r,i,n,a,s,o,l]);var h=Zt.apply(null,t);return{x:h.min.x,y:h.min.y,x2:h.max.x,y2:h.max.y,width:h.max.x-h.min.x,height:h.max.y-h.min.y}},e.isPointInsideBBox=function(t,e,r){return e>=t.x&&e<=t.x2&&r>=t.y&&r<=t.y2},e.isBBoxIntersect=function(t,r){var i=e.isPointInsideBBox;return i(r,t.x,t.y)||i(r,t.x2,t.y)||i(r,t.x,t.y2)||i(r,t.x2,t.y2)||i(t,r.x,r.y)||i(t,r.x2,r.y)||i(t,r.x,r.y2)||i(t,r.x2,r.y2)||(t.x<r.x2&&t.x>r.x||r.x<t.x2&&r.x>t.x)&&(t.y<r.y2&&t.y>r.y||r.y<t.y2&&r.y>t.y)},e.pathIntersection=function(t,e){return d(t,e)},e.pathIntersectionNumber=function(t,e){return d(t,e,1)},e.isPointInsidePath=function(t,r,i){var n=e.pathBBox(t);return e.isPointInsideBBox(n,r,i)&&d(t,[[\"M\",r,i],[\"H\",n.x2+10]],1)%2==1},e._removedFactory=function(e){return function(){t(\"raphael.log\",null,\"Raphaël: you are calling to method “\"+e+\"” of removed object\",e)}};var Ot=e.pathBBox=function(t){var e=Vt(t);if(e.bbox)return r(e.bbox);if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0};t=Qt(t);for(var i=0,n=0,a=[],s=[],o,l=0,h=t.length;l<h;l++)if(o=t[l],\"M\"==o[0])i=o[1],n=o[2],a.push(i),s.push(n);else{var u=Zt(i,n,o[1],o[2],o[3],o[4],o[5],o[6]);a=a[P](u.min.x,u.max.x),s=s[P](u.min.y,u.max.y),i=o[5],n=o[6]}var c=G[z](0,a),f=G[z](0,s),p=W[z](0,a),d=W[z](0,s),g=p-c,v=d-f,x={x:c,y:f,x2:p,y2:d,width:g,height:v,cx:c+g/2,cy:f+v/2};return e.bbox=r(x),x},Yt=function(t){var i=r(t);return i.toString=e._path2string,i},Wt=e._pathToRelative=function(t){var r=Vt(t);if(r.rel)return Yt(r.rel);e.is(t,Q)&&e.is(t&&t[0],Q)||(t=e.parsePathString(t));var i=[],n=0,a=0,s=0,o=0,l=0;\"M\"==t[0][0]&&(n=t[0][1],a=t[0][2],s=n,o=a,l++,i.push([\"M\",n,a]));for(var h=l,u=t.length;h<u;h++){var c=i[h]=[],f=t[h];if(f[0]!=O.call(f[0]))switch(c[0]=O.call(f[0]),c[0]){case\"a\":c[1]=f[1],c[2]=f[2],c[3]=f[3],c[4]=f[4],c[5]=f[5],c[6]=+(f[6]-n).toFixed(3),c[7]=+(f[7]-a).toFixed(3);break;case\"v\":c[1]=+(f[1]-a).toFixed(3);break;case\"m\":s=f[1],o=f[2];default:for(var p=1,d=f.length;p<d;p++)c[p]=+(f[p]-(p%2?n:a)).toFixed(3)}else{c=i[h]=[],\"m\"==f[0]&&(s=f[1]+n,o=f[2]+a);for(var g=0,v=f.length;g<v;g++)i[h][g]=f[g]}var x=i[h].length;switch(i[h][0]){case\"z\":n=s,a=o;break;case\"h\":n+=+i[h][x-1];break;case\"v\":a+=+i[h][x-1];break;default:n+=+i[h][x-2],a+=+i[h][x-1]}}return i.toString=e._path2string,r.rel=Yt(i),i},Gt=e._pathToAbsolute=function(t){var r=Vt(t);if(r.abs)return Yt(r.abs);if(e.is(t,Q)&&e.is(t&&t[0],Q)||(t=e.parsePathString(t)),!t||!t.length)return[[\"M\",0,0]];var i=[],n=0,a=0,o=0,l=0,h=0;\"M\"==t[0][0]&&(n=+t[0][1],a=+t[0][2],o=n,l=a,h++,i[0]=[\"M\",n,a]);for(var u=3==t.length&&\"M\"==t[0][0]&&\"R\"==t[1][0].toUpperCase()&&\"Z\"==t[2][0].toUpperCase(),c,f,p=h,d=t.length;p<d;p++){if(i.push(c=[]),f=t[p],f[0]!=ct.call(f[0]))switch(c[0]=ct.call(f[0]),c[0]){case\"A\":c[1]=f[1],c[2]=f[2],c[3]=f[3],c[4]=f[4],c[5]=f[5],c[6]=+(f[6]+n),c[7]=+(f[7]+a);break;case\"V\":c[1]=+f[1]+a;break;case\"H\":c[1]=+f[1]+n;break;case\"R\":for(var g=[n,a][P](f.slice(1)),v=2,x=g.length;v<x;v++)g[v]=+g[v]+n,g[++v]=+g[v]+a;i.pop(),i=i[P](s(g,u));break;case\"M\":o=+f[1]+n,l=+f[2]+a;default:for(v=1,x=f.length;v<x;v++)c[v]=+f[v]+(v%2?n:a)}else if(\"R\"==f[0])g=[n,a][P](f.slice(1)),i.pop(),i=i[P](s(g,u)),c=[\"R\"][P](f.slice(-2));else for(var y=0,m=f.length;y<m;y++)c[y]=f[y];switch(c[0]){case\"Z\":n=o,a=l;break;case\"H\":n=c[1];break;case\"V\":a=c[1];break;case\"M\":o=c[c.length-2],l=c[c.length-1];default:n=c[c.length-2],a=c[c.length-1]}}return i.toString=e._path2string,r.abs=Yt(i),i},Ht=function(t,e,r,i){return[t,e,r,i,r,i]},Xt=function(t,e,r,i,n,a){var s=1/3,o=2/3;return[s*t+o*r,s*e+o*i,s*n+o*r,s*a+o*i,n,a]},Ut=function(t,e,r,i,a,s,o,l,h,u){var c=120*U/180,f=U/180*(+a||0),p=[],d,g=n(function(t,e,r){var i=t*Y.cos(r)-e*Y.sin(r),n=t*Y.sin(r)+e*Y.cos(r);return{x:i,y:n}});if(u)S=u[0],A=u[1],B=u[2],C=u[3];else{d=g(t,e,-f),t=d.x,e=d.y,d=g(l,h,-f),l=d.x,h=d.y;var v=Y.cos(U/180*a),x=Y.sin(U/180*a),y=(t-l)/2,m=(e-h)/2,b=y*y/(r*r)+m*m/(i*i);b>1&&(b=Y.sqrt(b),r=b*r,i=b*i);var _=r*r,w=i*i,k=(s==o?-1:1)*Y.sqrt(H((_*w-_*m*m-w*y*y)/(_*m*m+w*y*y))),B=k*r*m/i+(t+l)/2,C=k*-i*y/r+(e+h)/2,S=Y.asin(((e-C)/i).toFixed(9)),A=Y.asin(((h-C)/i).toFixed(9));S=t<B?U-S:S,A=l<B?U-A:A,S<0&&(S=2*U+S),A<0&&(A=2*U+A),o&&S>A&&(S-=2*U),!o&&A>S&&(A-=2*U)}var T=A-S;if(H(T)>c){var E=A,M=l,N=h;A=S+c*(o&&A>S?1:-1),l=B+r*Y.cos(A),h=C+i*Y.sin(A),p=Ut(l,h,r,i,a,0,o,M,N,[A,E,B,C])}T=A-S;var L=Y.cos(S),z=Y.sin(S),F=Y.cos(A),R=Y.sin(A),j=Y.tan(T/4),I=4/3*r*j,D=4/3*i*j,V=[t,e],O=[t+I*z,e-D*L],W=[l+I*R,h-D*F],G=[l,h];if(O[0]=2*V[0]-O[0],O[1]=2*V[1]-O[1],u)return[O,W,G][P](p);p=[O,W,G][P](p).join()[q](\",\");for(var X=[],$=0,Z=p.length;$<Z;$++)X[$]=$%2?g(p[$-1],p[$],f).y:g(p[$],p[$+1],f).x;return X},$t=function(t,e,r,i,n,a,s,o,l){var h=1-l;return{x:X(h,3)*t+3*X(h,2)*l*r+3*h*l*l*n+X(l,3)*s,y:X(h,3)*e+3*X(h,2)*l*i+3*h*l*l*a+X(l,3)*o}},Zt=n(function(t,e,r,i,n,a,s,o){var l=n-2*r+t-(s-2*n+r),h=2*(r-t)-2*(n-r),u=t-r,c=(-h+Y.sqrt(h*h-4*l*u))/2/l,f=(-h-Y.sqrt(h*h-4*l*u))/2/l,p=[e,o],d=[t,s],g;return H(c)>\"1e12\"&&(c=.5),H(f)>\"1e12\"&&(f=.5),c>0&&c<1&&(g=$t(t,e,r,i,n,a,s,o,c),d.push(g.x),p.push(g.y)),f>0&&f<1&&(g=$t(t,e,r,i,n,a,s,o,f),d.push(g.x),p.push(g.y)),l=a-2*i+e-(o-2*a+i),h=2*(i-e)-2*(a-i),u=e-i,c=(-h+Y.sqrt(h*h-4*l*u))/2/l,f=(-h-Y.sqrt(h*h-4*l*u))/2/l,H(c)>\"1e12\"&&(c=.5),H(f)>\"1e12\"&&(f=.5),c>0&&c<1&&(g=$t(t,e,r,i,n,a,s,o,c),d.push(g.x),p.push(g.y)),f>0&&f<1&&(g=$t(t,e,r,i,n,a,s,o,f),d.push(g.x),p.push(g.y)),{min:{x:G[z](0,d),y:G[z](0,p)},max:{x:W[z](0,d),y:W[z](0,p)}}}),Qt=e._path2curve=n(function(t,e){var r=!e&&Vt(t);if(!e&&r.curve)return Yt(r.curve);for(var i=Gt(t),n=e&&Gt(e),a={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},s={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},o=(function(t,e,r){var i,n,a={T:1,Q:1};if(!t)return[\"C\",e.x,e.y,e.x,e.y,e.x,e.y];switch(!(t[0]in a)&&(e.qx=e.qy=null),t[0]){case\"M\":e.X=t[1],e.Y=t[2];break;case\"A\":t=[\"C\"][P](Ut[z](0,[e.x,e.y][P](t.slice(1))));break;case\"S\":\"C\"==r||\"S\"==r?(i=2*e.x-e.bx,n=2*e.y-e.by):(i=e.x,n=e.y),t=[\"C\",i,n][P](t.slice(1));break;case\"T\":\"Q\"==r||\"T\"==r?(e.qx=2*e.x-e.qx,e.qy=2*e.y-e.qy):(e.qx=e.x,e.qy=e.y),t=[\"C\"][P](Xt(e.x,e.y,e.qx,e.qy,t[1],t[2]));break;case\"Q\":e.qx=t[1],e.qy=t[2],t=[\"C\"][P](Xt(e.x,e.y,t[1],t[2],t[3],t[4]));break;case\"L\":t=[\"C\"][P](Ht(e.x,e.y,t[1],t[2]));break;case\"H\":t=[\"C\"][P](Ht(e.x,e.y,t[1],e.y));break;case\"V\":t=[\"C\"][P](Ht(e.x,e.y,e.x,t[1]));break;case\"Z\":t=[\"C\"][P](Ht(e.x,e.y,e.X,e.Y))}return t}),l=function(t,e){if(t[e].length>7){t[e].shift();for(var r=t[e];r.length;)u[e]=\"A\",n&&(c[e]=\"A\"),t.splice(e++,0,[\"C\"][P](r.splice(0,6)));t.splice(e,1),g=W(i.length,n&&n.length||0)}},h=function(t,e,r,a,s){t&&e&&\"M\"==t[s][0]&&\"M\"!=e[s][0]&&(e.splice(s,0,[\"M\",a.x,a.y]),r.bx=0,r.by=0,r.x=t[s][1],r.y=t[s][2],g=W(i.length,n&&n.length||0))},u=[],c=[],f=\"\",p=\"\",d=0,g=W(i.length,n&&n.length||0);d<g;d++){i[d]&&(f=i[d][0]),\"C\"!=f&&(u[d]=f,d&&(p=u[d-1])),i[d]=o(i[d],a,p),\"A\"!=u[d]&&\"C\"==f&&(u[d]=\"C\"),l(i,d),n&&(n[d]&&(f=n[d][0]),\"C\"!=f&&(c[d]=f,d&&(p=c[d-1])),n[d]=o(n[d],s,p),\"A\"!=c[d]&&\"C\"==f&&(c[d]=\"C\"),l(n,d)),h(i,n,a,s,d),h(n,i,s,a,d);var v=i[d],x=n&&n[d],y=v.length,m=n&&x.length;a.x=v[y-2],a.y=v[y-1],a.bx=ht(v[y-4])||a.x,a.by=ht(v[y-3])||a.y,s.bx=n&&(ht(x[m-4])||s.x),s.by=n&&(ht(x[m-3])||s.y),s.x=n&&x[m-2],s.y=n&&x[m-1]}return n||(r.curve=Yt(i)),n?[i,n]:i},null,Yt),Jt=e._parseDots=n(function(t){for(var r=[],i=0,n=t.length;i<n;i++){var a={},s=t[i].match(/^([^:]*):?([\\d\\.]*)/);if(a.color=e.getRGB(s[1]),a.color.error)return null;a.opacity=a.color.opacity,a.color=a.color.hex,s[2]&&(a.offset=s[2]+\"%\"),r.push(a)}for(i=1,n=r.length-1;i<n;i++)if(!r[i].offset){for(var o=ht(r[i-1].offset||0),l=0,h=i+1;h<n;h++)if(r[h].offset){l=r[h].offset;break}l||(l=100,h=n),l=ht(l);for(var u=(l-o)/(h-i+1);i<h;i++)o+=u,r[i].offset=o+\"%\"}return r}),Kt=e._tear=function(t,e){t==e.top&&(e.top=t.prev),t==e.bottom&&(e.bottom=t.next),t.next&&(t.next.prev=t.prev),t.prev&&(t.prev.next=t.next)},te=e._tofront=function(t,e){e.top!==t&&(Kt(t,e),t.next=null,t.prev=e.top,e.top.next=t,e.top=t)},ee=e._toback=function(t,e){e.bottom!==t&&(Kt(t,e),t.next=e.bottom,t.prev=null,e.bottom.prev=t,e.bottom=t)},re=e._insertafter=function(t,e,r){Kt(t,r),e==r.top&&(r.top=t),e.next&&(e.next.prev=t),t.next=e.next,t.prev=e,e.next=t},ie=e._insertbefore=function(t,e,r){Kt(t,r),e==r.bottom&&(r.bottom=t),e.prev&&(e.prev.next=t),t.prev=e.prev,e.prev=t,t.next=e},ne=e.toMatrix=function(t,e){var r=Ot(t),i={_:{transform:R},getBBox:function(){return r}};return se(i,e),i.matrix},ae=e.transformPath=function(t,e){return Mt(t,ne(t,e))},se=e._extractTransform=function(t,r){if(null==r)return t._.transform;r=I(r).replace(/\\.{3}|\\u2026/g,t._.transform||R);var i=e.parseTransformString(r),n=0,a=0,s=0,o=1,l=1,h=t._,u=new g;if(h.transform=i||[],i)for(var c=0,f=i.length;c<f;c++){var p=i[c],d=p.length,v=I(p[0]).toLowerCase(),x=p[0]!=v,y=x?u.invert():0,m,b,_,w,k;\"t\"==v&&3==d?x?(m=y.x(0,0),b=y.y(0,0),_=y.x(p[1],p[2]),w=y.y(p[1],p[2]),u.translate(_-m,w-b)):u.translate(p[1],p[2]):\"r\"==v?2==d?(k=k||t.getBBox(1),u.rotate(p[1],k.x+k.width/2,k.y+k.height/2),n+=p[1]):4==d&&(x?(_=y.x(p[2],p[3]),w=y.y(p[2],p[3]),u.rotate(p[1],_,w)):u.rotate(p[1],p[2],p[3]),n+=p[1]):\"s\"==v?2==d||3==d?(k=k||t.getBBox(1),u.scale(p[1],p[d-1],k.x+k.width/2,k.y+k.height/2),o*=p[1],l*=p[d-1]):5==d&&(x?(_=y.x(p[3],p[4]),w=y.y(p[3],p[4]),u.scale(p[1],p[2],_,w)):u.scale(p[1],p[2],p[3],p[4]),o*=p[1],l*=p[2]):\"m\"==v&&7==d&&u.add(p[1],p[2],p[3],p[4],p[5],p[6]),h.dirtyT=1,t.matrix=u}t.matrix=u,h.sx=o,h.sy=l,h.deg=n,h.dx=a=u.e,h.dy=s=u.f,1==o&&1==l&&!n&&h.bbox?(h.bbox.x+=+a,h.bbox.y+=+s):h.dirtyT=1},oe=function(t){var e=t[0];switch(e.toLowerCase()){case\"t\":return[e,0,0];case\"m\":return[e,1,0,0,1,0,0];case\"r\":return 4==t.length?[e,0,t[2],t[3]]:[e,0];case\"s\":return 5==t.length?[e,1,1,t[3],t[4]]:3==t.length?[e,1,1]:[e,1]}},le=e._equaliseTransform=function(t,r){r=I(r).replace(/\\.{3}|\\u2026/g,t),t=e.parseTransformString(t)||[],r=e.parseTransformString(r)||[];for(var i=W(t.length,r.length),n=[],a=[],s=0,o,l,h,u;s<i;s++){if(h=t[s]||oe(r[s]),u=r[s]||oe(h),h[0]!=u[0]||\"r\"==h[0].toLowerCase()&&(h[2]!=u[2]||h[3]!=u[3])||\"s\"==h[0].toLowerCase()&&(h[3]!=u[3]||h[4]!=u[4]))return;for(n[s]=[],a[s]=[],o=0,l=W(h.length,u.length);o<l;o++)o in h&&(n[s][o]=h[o]),o in u&&(a[s][o]=u[o])}return{from:n,to:a}};e._getContainer=function(t,r,i,n){var a;if(a=null!=n||e.is(t,\"object\")?t:T.doc.getElementById(t),null!=a)return a.tagName?null==r?{container:a,width:a.style.pixelWidth||a.offsetWidth,height:a.style.pixelHeight||a.offsetHeight}:{container:a,width:r,height:i}:{container:1,x:t,y:r,width:i,height:n}},e.pathToRelative=Wt,e._engine={},e.path2curve=Qt,e.matrix=function(t,e,r,i,n,a){return new g(t,e,r,i,n,a)},function(t){function r(t){return t[0]*t[0]+t[1]*t[1]}function i(t){var e=Y.sqrt(r(t));t[0]&&(t[0]/=e),t[1]&&(t[1]/=e)}t.add=function(t,e,r,i,n,a){var s=[[],[],[]],o=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],l=[[t,r,n],[e,i,a],[0,0,1]],h,u,c,f;for(t&&t instanceof g&&(l=[[t.a,t.c,t.e],[t.b,t.d,t.f],[0,0,1]]),h=0;h<3;h++)for(u=0;u<3;u++){for(f=0,c=0;c<3;c++)f+=o[h][c]*l[c][u];s[h][u]=f}this.a=s[0][0],this.b=s[1][0],this.c=s[0][1],this.d=s[1][1],this.e=s[0][2],this.f=s[1][2]},t.invert=function(){var t=this,e=t.a*t.d-t.b*t.c;return new g(t.d/e,-t.b/e,-t.c/e,t.a/e,(t.c*t.f-t.d*t.e)/e,(t.b*t.e-t.a*t.f)/e)},t.clone=function(){return new g(this.a,this.b,this.c,this.d,this.e,this.f)},t.translate=function(t,e){\nthis.add(1,0,0,1,t,e)},t.scale=function(t,e,r,i){null==e&&(e=t),(r||i)&&this.add(1,0,0,1,r,i),this.add(t,0,0,e,0,0),(r||i)&&this.add(1,0,0,1,-r,-i)},t.rotate=function(t,r,i){t=e.rad(t),r=r||0,i=i||0;var n=+Y.cos(t).toFixed(9),a=+Y.sin(t).toFixed(9);this.add(n,a,-a,n,r,i),this.add(1,0,0,1,-r,-i)},t.x=function(t,e){return t*this.a+e*this.c+this.e},t.y=function(t,e){return t*this.b+e*this.d+this.f},t.get=function(t){return+this[I.fromCharCode(97+t)].toFixed(4)},t.toString=function(){return e.svg?\"matrix(\"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+\")\":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},t.toFilter=function(){return\"progid:DXImageTransform.Microsoft.Matrix(M11=\"+this.get(0)+\", M12=\"+this.get(2)+\", M21=\"+this.get(1)+\", M22=\"+this.get(3)+\", Dx=\"+this.get(4)+\", Dy=\"+this.get(5)+\", sizingmethod='auto expand')\"},t.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},t.split=function(){var t={};t.dx=this.e,t.dy=this.f;var n=[[this.a,this.c],[this.b,this.d]];t.scalex=Y.sqrt(r(n[0])),i(n[0]),t.shear=n[0][0]*n[1][0]+n[0][1]*n[1][1],n[1]=[n[1][0]-n[0][0]*t.shear,n[1][1]-n[0][1]*t.shear],t.scaley=Y.sqrt(r(n[1])),i(n[1]),t.shear/=t.scaley;var a=-n[0][1],s=n[1][1];return s<0?(t.rotate=e.deg(Y.acos(s)),a<0&&(t.rotate=360-t.rotate)):t.rotate=e.deg(Y.asin(a)),t.isSimple=!(+t.shear.toFixed(9)||t.scalex.toFixed(9)!=t.scaley.toFixed(9)&&t.rotate),t.isSuperSimple=!+t.shear.toFixed(9)&&t.scalex.toFixed(9)==t.scaley.toFixed(9)&&!t.rotate,t.noRotation=!+t.shear.toFixed(9)&&!t.rotate,t},t.toTransformString=function(t){var e=t||this[q]();return e.isSimple?(e.scalex=+e.scalex.toFixed(4),e.scaley=+e.scaley.toFixed(4),e.rotate=+e.rotate.toFixed(4),(e.dx||e.dy?\"t\"+[e.dx,e.dy]:R)+(1!=e.scalex||1!=e.scaley?\"s\"+[e.scalex,e.scaley,0,0]:R)+(e.rotate?\"r\"+[e.rotate,0,0]:R)):\"m\"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(g.prototype);for(var he=function(){this.returnValue=!1},ue=function(){return this.originalEvent.preventDefault()},ce=function(){this.cancelBubble=!0},fe=function(){return this.originalEvent.stopPropagation()},pe=function(t){var e=T.doc.documentElement.scrollTop||T.doc.body.scrollTop,r=T.doc.documentElement.scrollLeft||T.doc.body.scrollLeft;return{x:t.clientX+r,y:t.clientY+e}},de=function(){return T.doc.addEventListener?function(t,e,r,i){var n=function(t){var e=pe(t);return r.call(i,t,e.x,e.y)};if(t.addEventListener(e,n,!1),F&&V[e]){var a=function(e){for(var n=pe(e),a=e,s=0,o=e.targetTouches&&e.targetTouches.length;s<o;s++)if(e.targetTouches[s].target==t){e=e.targetTouches[s],e.originalEvent=a,e.preventDefault=ue,e.stopPropagation=fe;break}return r.call(i,e,n.x,n.y)};t.addEventListener(V[e],a,!1)}return function(){return t.removeEventListener(e,n,!1),F&&V[e]&&t.removeEventListener(V[e],a,!1),!0}}:T.doc.attachEvent?function(t,e,r,i){var n=function(t){t=t||T.win.event;var e=T.doc.documentElement.scrollTop||T.doc.body.scrollTop,n=T.doc.documentElement.scrollLeft||T.doc.body.scrollLeft,a=t.clientX+n,s=t.clientY+e;return t.preventDefault=t.preventDefault||he,t.stopPropagation=t.stopPropagation||ce,r.call(i,t,a,s)};t.attachEvent(\"on\"+e,n);var a=function(){return t.detachEvent(\"on\"+e,n),!0};return a}:void 0}(),ge=[],ve=function(e){for(var r=e.clientX,i=e.clientY,n=T.doc.documentElement.scrollTop||T.doc.body.scrollTop,a=T.doc.documentElement.scrollLeft||T.doc.body.scrollLeft,s,o=ge.length;o--;){if(s=ge[o],F&&e.touches){for(var l=e.touches.length,h;l--;)if(h=e.touches[l],h.identifier==s.el._drag.id){r=h.clientX,i=h.clientY,(e.originalEvent?e.originalEvent:e).preventDefault();break}}else e.preventDefault();var u=s.el.node,c,f=u.nextSibling,p=u.parentNode,d=u.style.display;T.win.opera&&p.removeChild(u),u.style.display=\"none\",c=s.el.paper.getElementByPoint(r,i),u.style.display=d,T.win.opera&&(f?p.insertBefore(u,f):p.appendChild(u)),c&&t(\"raphael.drag.over.\"+s.el.id,s.el,c),r+=a,i+=n,t(\"raphael.drag.move.\"+s.el.id,s.move_scope||s.el,r-s.el._drag.x,i-s.el._drag.y,r,i,e)}},xe=function(r){e.unmousemove(ve).unmouseup(xe);for(var i=ge.length,n;i--;)n=ge[i],n.el._drag={},t(\"raphael.drag.end.\"+n.el.id,n.end_scope||n.start_scope||n.move_scope||n.el,r);ge=[]},ye=e.el={},me=D.length;me--;)!function(t){e[t]=ye[t]=function(r,i){return e.is(r,\"function\")&&(this.events=this.events||[],this.events.push({name:t,f:r,unbind:de(this.shape||this.node||T.doc,t,r,i||this)})),this},e[\"un\"+t]=ye[\"un\"+t]=function(r){for(var i=this.events||[],n=i.length;n--;)i[n].name!=t||!e.is(r,\"undefined\")&&i[n].f!=r||(i[n].unbind(),i.splice(n,1),!i.length&&delete this.events);return this}}(D[me]);ye.data=function(r,i){var n=wt[this.id]=wt[this.id]||{};if(0==arguments.length)return n;if(1==arguments.length){if(e.is(r,\"object\")){for(var a in r)r[A](a)&&this.data(a,r[a]);return this}return t(\"raphael.data.get.\"+this.id,this,n[r],r),n[r]}return n[r]=i,t(\"raphael.data.set.\"+this.id,this,i,r),this},ye.removeData=function(t){return null==t?wt[this.id]={}:wt[this.id]&&delete wt[this.id][t],this},ye.getData=function(){return r(wt[this.id]||{})},ye.hover=function(t,e,r,i){return this.mouseover(t,r).mouseout(e,i||r)},ye.unhover=function(t,e){return this.unmouseover(t).unmouseout(e)};var be=[];ye.drag=function(r,i,n,a,s,o){function l(l){(l.originalEvent||l).preventDefault();var h=l.clientX,u=l.clientY,c=T.doc.documentElement.scrollTop||T.doc.body.scrollTop,f=T.doc.documentElement.scrollLeft||T.doc.body.scrollLeft;if(this._drag.id=l.identifier,F&&l.touches)for(var p=l.touches.length,d;p--;)if(d=l.touches[p],this._drag.id=d.identifier,d.identifier==this._drag.id){h=d.clientX,u=d.clientY;break}this._drag.x=h+f,this._drag.y=u+c,!ge.length&&e.mousemove(ve).mouseup(xe),ge.push({el:this,move_scope:a,start_scope:s,end_scope:o}),i&&t.on(\"raphael.drag.start.\"+this.id,i),r&&t.on(\"raphael.drag.move.\"+this.id,r),n&&t.on(\"raphael.drag.end.\"+this.id,n),t(\"raphael.drag.start.\"+this.id,s||a||this,l.clientX+f,l.clientY+c,l)}return this._drag={},be.push({el:this,start:l}),this.mousedown(l),this},ye.onDragOver=function(e){e?t.on(\"raphael.drag.over.\"+this.id,e):t.unbind(\"raphael.drag.over.\"+this.id)},ye.undrag=function(){for(var r=be.length;r--;)be[r].el==this&&(this.unmousedown(be[r].start),be.splice(r,1),t.unbind(\"raphael.drag.*.\"+this.id));!be.length&&e.unmousemove(ve).unmouseup(xe),ge=[]},N.circle=function(t,r,i){var n=e._engine.circle(this,t||0,r||0,i||0);return this.__set__&&this.__set__.push(n),n},N.rect=function(t,r,i,n,a){var s=e._engine.rect(this,t||0,r||0,i||0,n||0,a||0);return this.__set__&&this.__set__.push(s),s},N.ellipse=function(t,r,i,n){var a=e._engine.ellipse(this,t||0,r||0,i||0,n||0);return this.__set__&&this.__set__.push(a),a},N.path=function(t){t&&!e.is(t,Z)&&!e.is(t[0],Q)&&(t+=R);var r=e._engine.path(e.format[z](e,arguments),this);return this.__set__&&this.__set__.push(r),r},N.image=function(t,r,i,n,a){var s=e._engine.image(this,t||\"about:blank\",r||0,i||0,n||0,a||0);return this.__set__&&this.__set__.push(s),s},N.text=function(t,r,i){var n=e._engine.text(this,t||0,r||0,I(i));return this.__set__&&this.__set__.push(n),n},N.set=function(t){!e.is(t,\"array\")&&(t=Array.prototype.splice.call(arguments,0,arguments.length));var r=new ze(t);return this.__set__&&this.__set__.push(r),r.paper=this,r.type=\"set\",r},N.setStart=function(t){this.__set__=t||this.set()},N.setFinish=function(t){var e=this.__set__;return delete this.__set__,e},N.getSize=function(){var t=this.canvas.parentNode;return{width:t.offsetWidth,height:t.offsetHeight}},N.setSize=function(t,r){return e._engine.setSize.call(this,t,r)},N.setViewBox=function(t,r,i,n,a){return e._engine.setViewBox.call(this,t,r,i,n,a)},N.top=N.bottom=null,N.raphael=e;var _e=function(t){var e=t.getBoundingClientRect(),r=t.ownerDocument,i=r.body,n=r.documentElement,a=n.clientTop||i.clientTop||0,s=n.clientLeft||i.clientLeft||0,o=e.top+(T.win.pageYOffset||n.scrollTop||i.scrollTop)-a,l=e.left+(T.win.pageXOffset||n.scrollLeft||i.scrollLeft)-s;return{y:o,x:l}};N.getElementByPoint=function(t,e){var r=this,i=r.canvas,n=T.doc.elementFromPoint(t,e);if(T.win.opera&&\"svg\"==n.tagName){var a=_e(i),s=i.createSVGRect();s.x=t-a.x,s.y=e-a.y,s.width=s.height=1;var o=i.getIntersectionList(s,null);o.length&&(n=o[o.length-1])}if(!n)return null;for(;n.parentNode&&n!=i.parentNode&&!n.raphael;)n=n.parentNode;return n==r.canvas.parentNode&&(n=i),n=n&&n.raphael?r.getById(n.raphaelid):null},N.getElementsByBBox=function(t){var r=this.set();return this.forEach(function(i){e.isBBoxIntersect(i.getBBox(),t)&&r.push(i)}),r},N.getById=function(t){for(var e=this.bottom;e;){if(e.id==t)return e;e=e.next}return null},N.forEach=function(t,e){for(var r=this.bottom;r;){if(t.call(e,r)===!1)return this;r=r.next}return this},N.getElementsByPoint=function(t,e){var r=this.set();return this.forEach(function(i){i.isPointInside(t,e)&&r.push(i)}),r},ye.isPointInside=function(t,r){var i=this.realPath=Et[this.type](this);return this.attr(\"transform\")&&this.attr(\"transform\").length&&(i=e.transformPath(i,this.attr(\"transform\"))),e.isPointInsidePath(i,t,r)},ye.getBBox=function(t){if(this.removed)return{};var e=this._;return t?(!e.dirty&&e.bboxwt||(this.realPath=Et[this.type](this),e.bboxwt=Ot(this.realPath),e.bboxwt.toString=x,e.dirty=0),e.bboxwt):((e.dirty||e.dirtyT||!e.bbox)&&(!e.dirty&&this.realPath||(e.bboxwt=0,this.realPath=Et[this.type](this)),e.bbox=Ot(Mt(this.realPath,this.matrix)),e.bbox.toString=x,e.dirty=e.dirtyT=0),e.bbox)},ye.clone=function(){if(this.removed)return null;var t=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(t),t},ye.glow=function(t){if(\"text\"==this.type)return null;t=t||{};var e={width:(t.width||10)+(+this.attr(\"stroke-width\")||1),fill:t.fill||!1,opacity:null==t.opacity?.5:t.opacity,offsetx:t.offsetx||0,offsety:t.offsety||0,color:t.color||\"#000\"},r=e.width/2,i=this.paper,n=i.set(),a=this.realPath||Et[this.type](this);a=this.matrix?Mt(a,this.matrix):a;for(var s=1;s<r+1;s++)n.push(i.path(a).attr({stroke:e.color,fill:e.fill?e.color:\"none\",\"stroke-linejoin\":\"round\",\"stroke-linecap\":\"round\",\"stroke-width\":+(e.width/r*s).toFixed(3),opacity:+(e.opacity/r).toFixed(3)}));return n.insertBefore(this).translate(e.offsetx,e.offsety)};var we={},ke=function(t,r,i,n,a,s,o,u,c){return null==c?l(t,r,i,n,a,s,o,u):e.findDotsAtSegment(t,r,i,n,a,s,o,u,h(t,r,i,n,a,s,o,u,c))},Be=function(t,r){return function(i,n,a){i=Qt(i);for(var s,o,l,h,u=\"\",c={},f,p=0,d=0,g=i.length;d<g;d++){if(l=i[d],\"M\"==l[0])s=+l[1],o=+l[2];else{if(h=ke(s,o,l[1],l[2],l[3],l[4],l[5],l[6]),p+h>n){if(r&&!c.start){if(f=ke(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p),u+=[\"C\"+f.start.x,f.start.y,f.m.x,f.m.y,f.x,f.y],a)return u;c.start=u,u=[\"M\"+f.x,f.y+\"C\"+f.n.x,f.n.y,f.end.x,f.end.y,l[5],l[6]].join(),p+=h,s=+l[5],o=+l[6];continue}if(!t&&!r)return f=ke(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p),{x:f.x,y:f.y,alpha:f.alpha}}p+=h,s=+l[5],o=+l[6]}u+=l.shift()+l}return c.end=u,f=t?p:r?c:e.findDotsAtSegment(s,o,l[0],l[1],l[2],l[3],l[4],l[5],1),f.alpha&&(f={x:f.x,y:f.y,alpha:f.alpha}),f}},Ce=Be(1),Se=Be(),Ae=Be(0,1);e.getTotalLength=Ce,e.getPointAtLength=Se,e.getSubpath=function(t,e,r){if(this.getTotalLength(t)-r<1e-6)return Ae(t,e).end;var i=Ae(t,r,1);return e?Ae(i,e).end:i},ye.getTotalLength=function(){var t=this.getPath();if(t)return this.node.getTotalLength?this.node.getTotalLength():Ce(t)},ye.getPointAtLength=function(t){var e=this.getPath();if(e)return Se(e,t)},ye.getPath=function(){var t,r=e._getPath[this.type];if(\"text\"!=this.type&&\"set\"!=this.type)return r&&(t=r(this)),t},ye.getSubpath=function(t,r){var i=this.getPath();if(i)return e.getSubpath(i,t,r)};var Te=e.easing_formulas={linear:function(t){return t},\"<\":function(t){return X(t,1.7)},\">\":function(t){return X(t,.48)},\"<>\":function(t){var e=.48-t/1.04,r=Y.sqrt(.1734+e*e),i=r-e,n=X(H(i),1/3)*(i<0?-1:1),a=-r-e,s=X(H(a),1/3)*(a<0?-1:1),o=n+s+.5;return 3*(1-o)*o*o+o*o*o},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){t-=1;var e=1.70158;return t*t*((e+1)*t+e)+1},elastic:function(t){return t==!!t?t:X(2,-10*t)*Y.sin((t-.075)*(2*U)/.3)+1},bounce:function(t){var e=7.5625,r=2.75,i;return t<1/r?i=e*t*t:t<2/r?(t-=1.5/r,i=e*t*t+.75):t<2.5/r?(t-=2.25/r,i=e*t*t+.9375):(t-=2.625/r,i=e*t*t+.984375),i}};Te.easeIn=Te[\"ease-in\"]=Te[\"<\"],Te.easeOut=Te[\"ease-out\"]=Te[\">\"],Te.easeInOut=Te[\"ease-in-out\"]=Te[\"<>\"],Te[\"back-in\"]=Te.backIn,Te[\"back-out\"]=Te.backOut;var Ee=[],Me=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){setTimeout(t,16)},Ne=function(){for(var r=+new Date,i=0;i<Ee.length;i++){var n=Ee[i];if(!n.el.removed&&!n.paused){var a=r-n.start,s=n.ms,o=n.easing,l=n.from,h=n.diff,u=n.to,c=n.t,f=n.el,p={},d,g={},v;if(n.initstatus?(a=(n.initstatus*n.anim.top-n.prev)/(n.percent-n.prev)*s,n.status=n.initstatus,delete n.initstatus,n.stop&&Ee.splice(i--,1)):n.status=(n.prev+(n.percent-n.prev)*(a/s))/n.anim.top,!(a<0))if(a<s){var x=o(a/s);for(var y in l)if(l[A](y)){switch(pt[y]){case $:d=+l[y]+x*s*h[y];break;case\"colour\":d=\"rgb(\"+[Le(ot(l[y].r+x*s*h[y].r)),Le(ot(l[y].g+x*s*h[y].g)),Le(ot(l[y].b+x*s*h[y].b))].join(\",\")+\")\";break;case\"path\":d=[];for(var m=0,_=l[y].length;m<_;m++){d[m]=[l[y][m][0]];for(var w=1,k=l[y][m].length;w<k;w++)d[m][w]=+l[y][m][w]+x*s*h[y][m][w];d[m]=d[m].join(j)}d=d.join(j);break;case\"transform\":if(h[y].real)for(d=[],m=0,_=l[y].length;m<_;m++)for(d[m]=[l[y][m][0]],w=1,k=l[y][m].length;w<k;w++)d[m][w]=l[y][m][w]+x*s*h[y][m][w];else{var B=function(t){return+l[y][t]+x*s*h[y][t]};d=[[\"m\",B(0),B(1),B(2),B(3),B(4),B(5)]]}break;case\"csv\":if(\"clip-rect\"==y)for(d=[],m=4;m--;)d[m]=+l[y][m]+x*s*h[y][m];break;default:var C=[][P](l[y]);for(d=[],m=f.paper.customAttributes[y].length;m--;)d[m]=+C[m]+x*s*h[y][m]}p[y]=d}f.attr(p),function(e,r,i){setTimeout(function(){t(\"raphael.anim.frame.\"+e,r,i)})}(f.id,f,n.anim)}else{if(function(r,i,n){setTimeout(function(){t(\"raphael.anim.frame.\"+i.id,i,n),t(\"raphael.anim.finish.\"+i.id,i,n),e.is(r,\"function\")&&r.call(i)})}(n.callback,f,n.anim),f.attr(u),Ee.splice(i--,1),n.repeat>1&&!n.next){for(v in u)u[A](v)&&(g[v]=n.totalOrigin[v]);n.el.attr(g),b(n.anim,n.el,n.anim.percents[0],null,n.totalOrigin,n.repeat-1)}n.next&&!n.stop&&b(n.anim,n.el,n.next,null,n.totalOrigin,n.repeat)}}}Ee.length&&Me(Ne)},Le=function(t){return t>255?255:t<0?0:t};ye.animateWith=function(t,r,i,n,a,s){var o=this;if(o.removed)return s&&s.call(o),o;var l=i instanceof m?i:e.animation(i,n,a,s),h,u;b(l,o,l.percents[0],null,o.attr());for(var c=0,f=Ee.length;c<f;c++)if(Ee[c].anim==r&&Ee[c].el==t){Ee[f-1].start=Ee[c].start;break}return o},ye.onAnimation=function(e){return e?t.on(\"raphael.anim.frame.\"+this.id,e):t.unbind(\"raphael.anim.frame.\"+this.id),this},m.prototype.delay=function(t){var e=new m(this.anim,this.ms);return e.times=this.times,e.del=+t||0,e},m.prototype.repeat=function(t){var e=new m(this.anim,this.ms);return e.del=this.del,e.times=Y.floor(W(t,0))||1,e},e.animation=function(t,r,i,n){if(t instanceof m)return t;!e.is(i,\"function\")&&i||(n=n||i||null,i=null),t=Object(t),r=+r||0;var a={},s,o;for(o in t)t[A](o)&&ht(o)!=o&&ht(o)+\"%\"!=o&&(s=!0,a[o]=t[o]);if(s)return i&&(a.easing=i),n&&(a.callback=n),new m({100:a},r);if(n){var l=0;for(var h in t){var u=ut(h);t[A](h)&&u>l&&(l=u)}l+=\"%\",!t[l].callback&&(t[l].callback=n)}return new m(t,r)},ye.animate=function(t,r,i,n){var a=this;if(a.removed)return n&&n.call(a),a;var s=t instanceof m?t:e.animation(t,r,i,n);return b(s,a,s.percents[0],null,a.attr()),a},ye.setTime=function(t,e){return t&&null!=e&&this.status(t,G(e,t.ms)/t.ms),this},ye.status=function(t,e){var r=[],i=0,n,a;if(null!=e)return b(t,this,-1,G(e,1)),this;for(n=Ee.length;i<n;i++)if(a=Ee[i],a.el.id==this.id&&(!t||a.anim==t)){if(t)return a.status;r.push({anim:a.anim,status:a.status})}return t?0:r},ye.pause=function(e){for(var r=0;r<Ee.length;r++)Ee[r].el.id!=this.id||e&&Ee[r].anim!=e||t(\"raphael.anim.pause.\"+this.id,this,Ee[r].anim)!==!1&&(Ee[r].paused=!0);return this},ye.resume=function(e){for(var r=0;r<Ee.length;r++)if(Ee[r].el.id==this.id&&(!e||Ee[r].anim==e)){var i=Ee[r];t(\"raphael.anim.resume.\"+this.id,this,i.anim)!==!1&&(delete i.paused,this.status(i.anim,i.status))}return this},ye.stop=function(e){for(var r=0;r<Ee.length;r++)Ee[r].el.id!=this.id||e&&Ee[r].anim!=e||t(\"raphael.anim.stop.\"+this.id,this,Ee[r].anim)!==!1&&Ee.splice(r--,1);return this},t.on(\"raphael.remove\",_),t.on(\"raphael.clear\",_),ye.toString=function(){return\"Raphaël’s object\"};var ze=function(t){if(this.items=[],this.length=0,this.type=\"set\",t)for(var e=0,r=t.length;e<r;e++)!t[e]||t[e].constructor!=ye.constructor&&t[e].constructor!=ze||(this[this.items.length]=this.items[this.items.length]=t[e],this.length++)},Pe=ze.prototype;Pe.push=function(){for(var t,e,r=0,i=arguments.length;r<i;r++)t=arguments[r],!t||t.constructor!=ye.constructor&&t.constructor!=ze||(e=this.items.length,this[e]=this.items[e]=t,this.length++);return this},Pe.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},Pe.forEach=function(t,e){for(var r=0,i=this.items.length;r<i;r++)if(t.call(e,this.items[r],r)===!1)return this;return this};for(var Fe in ye)ye[A](Fe)&&(Pe[Fe]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t][z](r,e)})}}(Fe));return Pe.attr=function(t,r){if(t&&e.is(t,Q)&&e.is(t[0],\"object\"))for(var i=0,n=t.length;i<n;i++)this.items[i].attr(t[i]);else for(var a=0,s=this.items.length;a<s;a++)this.items[a].attr(t,r);return this},Pe.clear=function(){for(;this.length;)this.pop()},Pe.splice=function(t,e,r){t=t<0?W(this.length+t,0):t,e=W(0,G(this.length-t,e));var i=[],n=[],a=[],s;for(s=2;s<arguments.length;s++)a.push(arguments[s]);for(s=0;s<e;s++)n.push(this[t+s]);for(;s<this.length-t;s++)i.push(this[t+s]);var o=a.length;for(s=0;s<o+i.length;s++)this.items[t+s]=this[t+s]=s<o?a[s]:i[s-o];for(s=this.items.length=this.length-=e-o;this[s];)delete this[s++];return new ze(n)},Pe.exclude=function(t){for(var e=0,r=this.length;e<r;e++)if(this[e]==t)return this.splice(e,1),!0},Pe.animate=function(t,r,i,n){(e.is(i,\"function\")||!i)&&(n=i||null);var a=this.items.length,s=a,o,l=this,h;if(!a)return this;n&&(h=function(){!--a&&n.call(l)}),i=e.is(i,Z)?i:h;var u=e.animation(t,r,i,h);for(o=this.items[--s].animate(u);s--;)this.items[s]&&!this.items[s].removed&&this.items[s].animateWith(o,u,u),this.items[s]&&!this.items[s].removed||a--;return this},Pe.insertAfter=function(t){for(var e=this.items.length;e--;)this.items[e].insertAfter(t);return this},Pe.getBBox=function(){for(var t=[],e=[],r=[],i=[],n=this.items.length;n--;)if(!this.items[n].removed){var a=this.items[n].getBBox();t.push(a.x),e.push(a.y),r.push(a.x+a.width),i.push(a.y+a.height)}return t=G[z](0,t),e=G[z](0,e),r=W[z](0,r),i=W[z](0,i),{x:t,y:e,x2:r,y2:i,width:r-t,height:i-e}},Pe.clone=function(t){t=this.paper.set();for(var e=0,r=this.items.length;e<r;e++)t.push(this.items[e].clone());return t},Pe.toString=function(){return\"Raphaël‘s set\"},Pe.glow=function(t){var e=this.paper.set();return this.forEach(function(r,i){var n=r.glow(t);null!=n&&n.forEach(function(t,r){e.push(t)})}),e},Pe.isPointInside=function(t,e){var r=!1;return this.forEach(function(i){if(i.isPointInside(t,e))return r=!0,!1}),r},e.registerFont=function(t){if(!t.face)return t;this.fonts=this.fonts||{};var e={w:t.w,face:{},glyphs:{}},r=t.face[\"font-family\"];for(var i in t.face)t.face[A](i)&&(e.face[i]=t.face[i]);if(this.fonts[r]?this.fonts[r].push(e):this.fonts[r]=[e],!t.svg){e.face[\"units-per-em\"]=ut(t.face[\"units-per-em\"],10);for(var n in t.glyphs)if(t.glyphs[A](n)){var a=t.glyphs[n];if(e.glyphs[n]={w:a.w,k:{},d:a.d&&\"M\"+a.d.replace(/[mlcxtrv]/g,function(t){return{l:\"L\",c:\"C\",x:\"z\",t:\"m\",r:\"l\",v:\"c\"}[t]||\"M\"})+\"z\"},a.k)for(var s in a.k)a[A](s)&&(e.glyphs[n].k[s]=a.k[s])}}return t},N.getFont=function(t,r,i,n){if(n=n||\"normal\",i=i||\"normal\",r=+r||{normal:400,bold:700,lighter:300,bolder:800}[r]||400,e.fonts){var a=e.fonts[t];if(!a){var s=new RegExp(\"(^|\\\\s)\"+t.replace(/[^\\w\\d\\s+!~.:_-]/g,R)+\"(\\\\s|$)\",\"i\");for(var o in e.fonts)if(e.fonts[A](o)&&s.test(o)){a=e.fonts[o];break}}var l;if(a)for(var h=0,u=a.length;h<u&&(l=a[h],l.face[\"font-weight\"]!=r||l.face[\"font-style\"]!=i&&l.face[\"font-style\"]||l.face[\"font-stretch\"]!=n);h++);return l}},N.print=function(t,r,i,n,a,s,o,l){s=s||\"middle\",o=W(G(o||0,1),-1),l=W(G(l||1,3),1);var h=I(i)[q](R),u=0,c=0,f=R,p;if(e.is(n,\"string\")&&(n=this.getFont(n)),n){p=(a||16)/n.face[\"units-per-em\"];for(var d=n.face.bbox[q](k),g=+d[0],v=d[3]-d[1],x=0,y=+d[1]+(\"baseline\"==s?v+ +n.face.descent:v/2),m=0,b=h.length;m<b;m++){if(\"\\n\"==h[m])u=0,w=0,c=0,x+=v*l;else{var _=c&&n.glyphs[h[m-1]]||{},w=n.glyphs[h[m]];u+=c?(_.w||n.w)+(_.k&&_.k[h[m]]||0)+n.w*o:0,c=1}w&&w.d&&(f+=e.transformPath(w.d,[\"t\",u*p,x*p,\"s\",p,p,g,y,\"t\",(t-g)/p,(r-y)/p]))}}return this.path(f).attr({fill:\"#000\",stroke:\"none\"})},N.add=function(t){if(e.is(t,\"array\"))for(var r=this.set(),i=0,n=t.length,a;i<n;i++)a=t[i]||{},B[A](a.type)&&r.push(this[a.type]().attr(a));return r},e.format=function(t,r){var i=e.is(r,Q)?[0][P](r):arguments;return t&&e.is(t,Z)&&i.length-1&&(t=t.replace(C,function(t,e){return null==i[++e]?R:i[e]})),t||R},e.fullfill=function(){var t=/\\{([^\\}]+)\\}/g,e=/(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g,r=function(t,r,i){var n=i;return r.replace(e,function(t,e,r,i,a){e=e||i,n&&(e in n&&(n=n[e]),\"function\"==typeof n&&a&&(n=n()))}),n=(null==n||n==i?t:n)+\"\"};return function(e,i){return String(e).replace(t,function(t,e){return r(t,e,i)})}}(),e.ninja=function(){if(E.was)T.win.Raphael=E.is;else{window.Raphael=void 0;try{delete window.Raphael}catch(t){}}return e},e.st=Pe,t.on(\"raphael.DOMload\",function(){w=!0}),function(t,r,i){function n(){/in/.test(t.readyState)?setTimeout(n,9):e.eve(\"raphael.DOMload\")}null==t.readyState&&t.addEventListener&&(t.addEventListener(r,i=function(){t.removeEventListener(r,i,!1),t.readyState=\"complete\"},!1),t.readyState=\"loading\"),n()}(document,\"DOMContentLoaded\"),e}.apply(e,i),!(void 0!==n&&(t.exports=n))},function(t,e,r){var i,n;!function(r){var a=\"0.5.0\",s=\"hasOwnProperty\",o=/[\\.\\/]/,l=/\\s*,\\s*/,h=\"*\",u=function(){},c=function(t,e){return t-e},f,p,d={n:{}},g=function(){for(var t=0,e=this.length;t<e;t++)if(\"undefined\"!=typeof this[t])return this[t]},v=function(){for(var t=this.length;--t;)if(\"undefined\"!=typeof this[t])return this[t]},x=Object.prototype.toString,y=String,m=Array.isArray||function(t){return t instanceof Array||\"[object Array]\"==x.call(t)};eve=function(t,e){var r=d,i=p,n=Array.prototype.slice.call(arguments,2),a=eve.listeners(t),s=0,o=!1,l,h=[],u={},x=[],y=f,m=[];x.firstDefined=g,x.lastDefined=v,f=t,p=0;for(var b=0,_=a.length;b<_;b++)\"zIndex\"in a[b]&&(h.push(a[b].zIndex),a[b].zIndex<0&&(u[a[b].zIndex]=a[b]));for(h.sort(c);h[s]<0;)if(l=u[h[s++]],x.push(l.apply(e,n)),p)return p=i,x;for(b=0;b<_;b++)if(l=a[b],\"zIndex\"in l)if(l.zIndex==h[s]){if(x.push(l.apply(e,n)),p)break;do if(s++,l=u[h[s]],l&&x.push(l.apply(e,n)),p)break;while(l)}else u[l.zIndex]=l;else if(x.push(l.apply(e,n)),p)break;return p=i,f=y,x},eve._events=d,eve.listeners=function(t){var e=m(t)?t:t.split(o),r=d,i,n,a,s,l,u,c,f,p=[r],g=[];for(s=0,l=e.length;s<l;s++){for(f=[],u=0,c=p.length;u<c;u++)for(r=p[u].n,n=[r[e[s]],r[h]],a=2;a--;)i=n[a],i&&(f.push(i),g=g.concat(i.f||[]));p=f}return g},eve.separator=function(t){t?(t=y(t).replace(/(?=[\\.\\^\\]\\[\\-])/g,\"\\\\\"),t=\"[\"+t+\"]\",o=new RegExp(t)):o=/[\\.\\/]/},eve.on=function(t,e){if(\"function\"!=typeof e)return function(){};for(var r=m(t)?m(t[0])?t:[t]:y(t).split(l),i=0,n=r.length;i<n;i++)!function(t){for(var r=m(t)?t:y(t).split(o),i=d,n,a=0,s=r.length;a<s;a++)i=i.n,i=i.hasOwnProperty(r[a])&&i[r[a]]||(i[r[a]]={n:{}});for(i.f=i.f||[],a=0,s=i.f.length;a<s;a++)if(i.f[a]==e){n=!0;break}!n&&i.f.push(e)}(r[i]);return function(t){+t==+t&&(e.zIndex=+t)}},eve.f=function(t){var e=[].slice.call(arguments,1);return function(){eve.apply(null,[t,null].concat(e).concat([].slice.call(arguments,0)))}},eve.stop=function(){p=1},eve.nt=function(t){var e=m(f)?f.join(\".\"):f;return t?new RegExp(\"(?:\\\\.|\\\\/|^)\"+t+\"(?:\\\\.|\\\\/|$)\").test(e):e},eve.nts=function(){return m(f)?f:f.split(o)},eve.off=eve.unbind=function(t,e){if(!t)return void(eve._events=d={n:{}});var r=m(t)?m(t[0])?t:[t]:y(t).split(l);if(r.length>1)for(var i=0,n=r.length;i<n;i++)eve.off(r[i],e);else{r=m(t)?t:y(t).split(o);var a,u,c,i,n,f,p,g=[d];for(i=0,n=r.length;i<n;i++)for(f=0;f<g.length;f+=c.length-2){if(c=[f,1],a=g[f].n,r[i]!=h)a[r[i]]&&c.push(a[r[i]]);else for(u in a)a[s](u)&&c.push(a[u]);g.splice.apply(g,c)}for(i=0,n=g.length;i<n;i++)for(a=g[i];a.n;){if(e){if(a.f){for(f=0,p=a.f.length;f<p;f++)if(a.f[f]==e){a.f.splice(f,1);break}!a.f.length&&delete a.f}for(u in a.n)if(a.n[s](u)&&a.n[u].f){var v=a.n[u].f;for(f=0,p=v.length;f<p;f++)if(v[f]==e){v.splice(f,1);break}!v.length&&delete a.n[u].f}}else{delete a.f;for(u in a.n)a.n[s](u)&&a.n[u].f&&delete a.n[u].f}a=a.n}}},eve.once=function(t,e){var r=function(){return eve.off(t,r),e.apply(this,arguments)};return eve.on(t,r)},eve.version=a,eve.toString=function(){return\"You are running Eve \"+a},\"undefined\"!=typeof t&&t.exports?t.exports=eve:(i=[],n=function(){return eve}.apply(e,i),!(void 0!==n&&(t.exports=n)))}(this)},function(t,e,r){var i,n;i=[r(1)],n=function(t){if(!t||t.svg){var e=\"hasOwnProperty\",r=String,i=parseFloat,n=parseInt,a=Math,s=a.max,o=a.abs,l=a.pow,h=/[, ]+/,u=t.eve,c=\"\",f=\" \",p=\"http://www.w3.org/1999/xlink\",d={block:\"M5,0 0,2.5 5,5z\",classic:\"M5,0 0,2.5 5,5 3.5,3 3.5,2z\",diamond:\"M2.5,0 5,2.5 2.5,5 0,2.5z\",open:\"M6,1 1,3.5 6,6\",oval:\"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z\"},g={};t.toString=function(){return\"Your browser supports SVG.\\nYou are running Raphaël \"+this.version};var v=function(i,n){if(n){\"string\"==typeof i&&(i=v(i));for(var a in n)n[e](a)&&(\"xlink:\"==a.substring(0,6)?i.setAttributeNS(p,a.substring(6),r(n[a])):i.setAttribute(a,r(n[a])))}else i=t._g.doc.createElementNS(\"http://www.w3.org/2000/svg\",i),i.style&&(i.style.webkitTapHighlightColor=\"rgba(0,0,0,0)\");return i},x=function(e,n){var h=\"linear\",u=e.id+n,f=.5,p=.5,d=e.node,g=e.paper,x=d.style,y=t._g.doc.getElementById(u);if(!y){if(n=r(n).replace(t._radial_gradient,function(t,e,r){if(h=\"radial\",e&&r){f=i(e),p=i(r);var n=2*(p>.5)-1;l(f-.5,2)+l(p-.5,2)>.25&&(p=a.sqrt(.25-l(f-.5,2))*n+.5)&&.5!=p&&(p=p.toFixed(5)-1e-5*n)}return c}),n=n.split(/\\s*\\-\\s*/),\"linear\"==h){var b=n.shift();if(b=-i(b),isNaN(b))return null;var _=[0,0,a.cos(t.rad(b)),a.sin(t.rad(b))],w=1/(s(o(_[2]),o(_[3]))||1);_[2]*=w,_[3]*=w,_[2]<0&&(_[0]=-_[2],_[2]=0),_[3]<0&&(_[1]=-_[3],_[3]=0)}var k=t._parseDots(n);if(!k)return null;if(u=u.replace(/[\\(\\)\\s,\\xb0#]/g,\"_\"),e.gradient&&u!=e.gradient.id&&(g.defs.removeChild(e.gradient),delete e.gradient),!e.gradient){y=v(h+\"Gradient\",{id:u}),e.gradient=y,v(y,\"radial\"==h?{fx:f,fy:p}:{x1:_[0],y1:_[1],x2:_[2],y2:_[3],gradientTransform:e.matrix.invert()}),g.defs.appendChild(y);for(var B=0,C=k.length;B<C;B++)y.appendChild(v(\"stop\",{offset:k[B].offset?k[B].offset:B?\"100%\":\"0%\",\"stop-color\":k[B].color||\"#fff\",\"stop-opacity\":isFinite(k[B].opacity)?k[B].opacity:1}))}}return v(d,{fill:m(u),opacity:1,\"fill-opacity\":1}),x.fill=c,x.opacity=1,x.fillOpacity=1,1},y=function(){var t=document.documentMode;return t&&(9===t||10===t)},m=function(t){if(y())return\"url('#\"+t+\"')\";var e=document.location,r=e.protocol+\"//\"+e.host+e.pathname+e.search;return\"url('\"+r+\"#\"+t+\"')\"},b=function(t){var e=t.getBBox(1);v(t.pattern,{patternTransform:t.matrix.invert()+\" translate(\"+e.x+\",\"+e.y+\")\"})},_=function(i,n,a){if(\"path\"==i.type){for(var s=r(n).toLowerCase().split(\"-\"),o=i.paper,l=a?\"end\":\"start\",h=i.node,u=i.attrs,f=u[\"stroke-width\"],p=s.length,x=\"classic\",y,m,b,_,w,k=3,B=3,C=5;p--;)switch(s[p]){case\"block\":case\"classic\":case\"oval\":case\"diamond\":case\"open\":case\"none\":x=s[p];break;case\"wide\":B=5;break;case\"narrow\":B=2;break;case\"long\":k=5;break;case\"short\":k=2}if(\"open\"==x?(k+=2,B+=2,C+=2,b=1,_=a?4:1,w={fill:\"none\",stroke:u.stroke}):(_=b=k/2,w={fill:u.stroke,stroke:\"none\"}),i._.arrows?a?(i._.arrows.endPath&&g[i._.arrows.endPath]--,i._.arrows.endMarker&&g[i._.arrows.endMarker]--):(i._.arrows.startPath&&g[i._.arrows.startPath]--,i._.arrows.startMarker&&g[i._.arrows.startMarker]--):i._.arrows={},\"none\"!=x){var S=\"raphael-marker-\"+x,A=\"raphael-marker-\"+l+x+k+B+\"-obj\"+i.id;t._g.doc.getElementById(S)?g[S]++:(o.defs.appendChild(v(v(\"path\"),{\"stroke-linecap\":\"round\",d:d[x],id:S})),g[S]=1);var T=t._g.doc.getElementById(A),E;T?(g[A]++,E=T.getElementsByTagName(\"use\")[0]):(T=v(v(\"marker\"),{id:A,markerHeight:B,markerWidth:k,orient:\"auto\",refX:_,refY:B/2}),E=v(v(\"use\"),{\"xlink:href\":\"#\"+S,transform:(a?\"rotate(180 \"+k/2+\" \"+B/2+\") \":c)+\"scale(\"+k/C+\",\"+B/C+\")\",\"stroke-width\":(1/((k/C+B/C)/2)).toFixed(4)}),T.appendChild(E),o.defs.appendChild(T),g[A]=1),v(E,w);var M=b*(\"diamond\"!=x&&\"oval\"!=x);a?(y=i._.arrows.startdx*f||0,m=t.getTotalLength(u.path)-M*f):(y=M*f,m=t.getTotalLength(u.path)-(i._.arrows.enddx*f||0)),w={},w[\"marker-\"+l]=\"url(#\"+A+\")\",(m||y)&&(w.d=t.getSubpath(u.path,y,m)),v(h,w),i._.arrows[l+\"Path\"]=S,i._.arrows[l+\"Marker\"]=A,i._.arrows[l+\"dx\"]=M,i._.arrows[l+\"Type\"]=x,i._.arrows[l+\"String\"]=n}else a?(y=i._.arrows.startdx*f||0,m=t.getTotalLength(u.path)-y):(y=0,m=t.getTotalLength(u.path)-(i._.arrows.enddx*f||0)),i._.arrows[l+\"Path\"]&&v(h,{d:t.getSubpath(u.path,y,m)}),delete i._.arrows[l+\"Path\"],delete i._.arrows[l+\"Marker\"],delete i._.arrows[l+\"dx\"],delete i._.arrows[l+\"Type\"],delete i._.arrows[l+\"String\"];for(w in g)if(g[e](w)&&!g[w]){var N=t._g.doc.getElementById(w);N&&N.parentNode.removeChild(N)}}},w={\"-\":[3,1],\".\":[1,1],\"-.\":[3,1,1,1],\"-..\":[3,1,1,1,1,1],\". \":[1,3],\"- \":[4,3],\"--\":[8,3],\"- .\":[4,3,1,3],\"--.\":[8,3,1,3],\"--..\":[8,3,1,3,1,3]},k=function(t,e,i){if(e=w[r(e).toLowerCase()]){for(var n=t.attrs[\"stroke-width\"]||\"1\",a={round:n,square:n,butt:0}[t.attrs[\"stroke-linecap\"]||i[\"stroke-linecap\"]]||0,s=[],o=e.length;o--;)s[o]=e[o]*n+(o%2?1:-1)*a;v(t.node,{\"stroke-dasharray\":s.join(\",\")})}else v(t.node,{\"stroke-dasharray\":\"none\"})},B=function(i,a){var l=i.node,u=i.attrs,f=l.style.visibility;l.style.visibility=\"hidden\";for(var d in a)if(a[e](d)){if(!t._availableAttrs[e](d))continue;var g=a[d];switch(u[d]=g,d){case\"blur\":i.blur(g);break;case\"title\":var y=l.getElementsByTagName(\"title\");if(y.length&&(y=y[0]))y.firstChild.nodeValue=g;else{y=v(\"title\");var m=t._g.doc.createTextNode(g);y.appendChild(m),l.appendChild(y)}break;case\"href\":case\"target\":var w=l.parentNode;if(\"a\"!=w.tagName.toLowerCase()){var B=v(\"a\");w.insertBefore(B,l),B.appendChild(l),w=B}\"target\"==d?w.setAttributeNS(p,\"show\",\"blank\"==g?\"new\":g):w.setAttributeNS(p,d,g);break;case\"cursor\":l.style.cursor=g;break;case\"transform\":i.transform(g);break;case\"arrow-start\":_(i,g);break;case\"arrow-end\":_(i,g,1);break;case\"clip-rect\":var C=r(g).split(h);if(4==C.length){i.clip&&i.clip.parentNode.parentNode.removeChild(i.clip.parentNode);var A=v(\"clipPath\"),T=v(\"rect\");A.id=t.createUUID(),v(T,{x:C[0],y:C[1],width:C[2],height:C[3]}),A.appendChild(T),i.paper.defs.appendChild(A),v(l,{\"clip-path\":\"url(#\"+A.id+\")\"}),i.clip=T}if(!g){var E=l.getAttribute(\"clip-path\");if(E){var M=t._g.doc.getElementById(E.replace(/(^url\\(#|\\)$)/g,c));M&&M.parentNode.removeChild(M),v(l,{\"clip-path\":c}),delete i.clip}}break;case\"path\":\"path\"==i.type&&(v(l,{d:g?u.path=t._pathToAbsolute(g):\"M0,0\"}),i._.dirty=1,i._.arrows&&(\"startString\"in i._.arrows&&_(i,i._.arrows.startString),\"endString\"in i._.arrows&&_(i,i._.arrows.endString,1)));break;case\"width\":if(l.setAttribute(d,g),i._.dirty=1,!u.fx)break;d=\"x\",g=u.x;case\"x\":u.fx&&(g=-u.x-(u.width||0));case\"rx\":if(\"rx\"==d&&\"rect\"==i.type)break;case\"cx\":l.setAttribute(d,g),i.pattern&&b(i),i._.dirty=1;break;case\"height\":if(l.setAttribute(d,g),i._.dirty=1,!u.fy)break;d=\"y\",g=u.y;case\"y\":u.fy&&(g=-u.y-(u.height||0));case\"ry\":if(\"ry\"==d&&\"rect\"==i.type)break;case\"cy\":l.setAttribute(d,g),i.pattern&&b(i),i._.dirty=1;break;case\"r\":\"rect\"==i.type?v(l,{rx:g,ry:g}):l.setAttribute(d,g),i._.dirty=1;break;case\"src\":\"image\"==i.type&&l.setAttributeNS(p,\"href\",g);break;case\"stroke-width\":1==i._.sx&&1==i._.sy||(g/=s(o(i._.sx),o(i._.sy))||1),l.setAttribute(d,g),u[\"stroke-dasharray\"]&&k(i,u[\"stroke-dasharray\"],a),\ni._.arrows&&(\"startString\"in i._.arrows&&_(i,i._.arrows.startString),\"endString\"in i._.arrows&&_(i,i._.arrows.endString,1));break;case\"stroke-dasharray\":k(i,g,a);break;case\"fill\":var N=r(g).match(t._ISURL);if(N){A=v(\"pattern\");var L=v(\"image\");A.id=t.createUUID(),v(A,{x:0,y:0,patternUnits:\"userSpaceOnUse\",height:1,width:1}),v(L,{x:0,y:0,\"xlink:href\":N[1]}),A.appendChild(L),function(e){t._preload(N[1],function(){var t=this.offsetWidth,r=this.offsetHeight;v(e,{width:t,height:r}),v(L,{width:t,height:r})})}(A),i.paper.defs.appendChild(A),v(l,{fill:\"url(#\"+A.id+\")\"}),i.pattern=A,i.pattern&&b(i);break}var z=t.getRGB(g);if(z.error){if((\"circle\"==i.type||\"ellipse\"==i.type||\"r\"!=r(g).charAt())&&x(i,g)){if(\"opacity\"in u||\"fill-opacity\"in u){var P=t._g.doc.getElementById(l.getAttribute(\"fill\").replace(/^url\\(#|\\)$/g,c));if(P){var F=P.getElementsByTagName(\"stop\");v(F[F.length-1],{\"stop-opacity\":(\"opacity\"in u?u.opacity:1)*(\"fill-opacity\"in u?u[\"fill-opacity\"]:1)})}}u.gradient=g,u.fill=\"none\";break}}else delete a.gradient,delete u.gradient,!t.is(u.opacity,\"undefined\")&&t.is(a.opacity,\"undefined\")&&v(l,{opacity:u.opacity}),!t.is(u[\"fill-opacity\"],\"undefined\")&&t.is(a[\"fill-opacity\"],\"undefined\")&&v(l,{\"fill-opacity\":u[\"fill-opacity\"]});z[e](\"opacity\")&&v(l,{\"fill-opacity\":z.opacity>1?z.opacity/100:z.opacity});case\"stroke\":z=t.getRGB(g),l.setAttribute(d,z.hex),\"stroke\"==d&&z[e](\"opacity\")&&v(l,{\"stroke-opacity\":z.opacity>1?z.opacity/100:z.opacity}),\"stroke\"==d&&i._.arrows&&(\"startString\"in i._.arrows&&_(i,i._.arrows.startString),\"endString\"in i._.arrows&&_(i,i._.arrows.endString,1));break;case\"gradient\":(\"circle\"==i.type||\"ellipse\"==i.type||\"r\"!=r(g).charAt())&&x(i,g);break;case\"opacity\":u.gradient&&!u[e](\"stroke-opacity\")&&v(l,{\"stroke-opacity\":g>1?g/100:g});case\"fill-opacity\":if(u.gradient){P=t._g.doc.getElementById(l.getAttribute(\"fill\").replace(/^url\\(#|\\)$/g,c)),P&&(F=P.getElementsByTagName(\"stop\"),v(F[F.length-1],{\"stop-opacity\":g}));break}default:\"font-size\"==d&&(g=n(g,10)+\"px\");var R=d.replace(/(\\-.)/g,function(t){return t.substring(1).toUpperCase()});l.style[R]=g,i._.dirty=1,l.setAttribute(d,g)}}S(i,a),l.style.visibility=f},C=1.2,S=function(i,a){if(\"text\"==i.type&&(a[e](\"text\")||a[e](\"font\")||a[e](\"font-size\")||a[e](\"x\")||a[e](\"y\"))){var s=i.attrs,o=i.node,l=o.firstChild?n(t._g.doc.defaultView.getComputedStyle(o.firstChild,c).getPropertyValue(\"font-size\"),10):10;if(a[e](\"text\")){for(s.text=a.text;o.firstChild;)o.removeChild(o.firstChild);for(var h=r(a.text).split(\"\\n\"),u=[],f,p=0,d=h.length;p<d;p++)f=v(\"tspan\"),p&&v(f,{dy:l*C,x:s.x}),f.appendChild(t._g.doc.createTextNode(h[p])),o.appendChild(f),u[p]=f}else for(u=o.getElementsByTagName(\"tspan\"),p=0,d=u.length;p<d;p++)p?v(u[p],{dy:l*C,x:s.x}):v(u[0],{dy:0});v(o,{x:s.x,y:s.y}),i._.dirty=1;var g=i._getBBox(),x=s.y-(g.y+g.height/2);x&&t.is(x,\"finite\")&&v(u[0],{dy:x})}},A=function(t){return t.parentNode&&\"a\"===t.parentNode.tagName.toLowerCase()?t.parentNode:t},T=function(e,r){function i(){return(\"0000\"+(Math.random()*Math.pow(36,5)<<0).toString(36)).slice(-5)}var n=0,a=0;this[0]=this.node=e,e.raphael=!0,this.id=i(),e.raphaelid=this.id,this.matrix=t.matrix(),this.realPath=null,this.paper=r,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!r.bottom&&(r.bottom=this),this.prev=r.top,r.top&&(r.top.next=this),r.top=this,this.next=null},E=t.el;T.prototype=E,E.constructor=T,t._engine.path=function(t,e){var r=v(\"path\");e.canvas&&e.canvas.appendChild(r);var i=new T(r,e);return i.type=\"path\",B(i,{fill:\"none\",stroke:\"#000\",path:t}),i},E.rotate=function(t,e,n){if(this.removed)return this;if(t=r(t).split(h),t.length-1&&(e=i(t[1]),n=i(t[2])),t=i(t[0]),null==n&&(e=n),null==e||null==n){var a=this.getBBox(1);e=a.x+a.width/2,n=a.y+a.height/2}return this.transform(this._.transform.concat([[\"r\",t,e,n]])),this},E.scale=function(t,e,n,a){if(this.removed)return this;if(t=r(t).split(h),t.length-1&&(e=i(t[1]),n=i(t[2]),a=i(t[3])),t=i(t[0]),null==e&&(e=t),null==a&&(n=a),null==n||null==a)var s=this.getBBox(1);return n=null==n?s.x+s.width/2:n,a=null==a?s.y+s.height/2:a,this.transform(this._.transform.concat([[\"s\",t,e,n,a]])),this},E.translate=function(t,e){return this.removed?this:(t=r(t).split(h),t.length-1&&(e=i(t[1])),t=i(t[0])||0,e=+e||0,this.transform(this._.transform.concat([[\"t\",t,e]])),this)},E.transform=function(r){var i=this._;if(null==r)return i.transform;if(t._extractTransform(this,r),this.clip&&v(this.clip,{transform:this.matrix.invert()}),this.pattern&&b(this),this.node&&v(this.node,{transform:this.matrix}),1!=i.sx||1!=i.sy){var n=this.attrs[e](\"stroke-width\")?this.attrs[\"stroke-width\"]:1;this.attr({\"stroke-width\":n})}return this},E.hide=function(){return this.removed||(this.node.style.display=\"none\"),this},E.show=function(){return this.removed||(this.node.style.display=\"\"),this},E.remove=function(){var e=A(this.node);if(!this.removed&&e.parentNode){var r=this.paper;r.__set__&&r.__set__.exclude(this),u.unbind(\"raphael.*.*.\"+this.id),this.gradient&&r.defs.removeChild(this.gradient),t._tear(this,r),e.parentNode.removeChild(e),this.removeData();for(var i in this)this[i]=\"function\"==typeof this[i]?t._removedFactory(i):null;this.removed=!0}},E._getBBox=function(){if(\"none\"==this.node.style.display){this.show();var t=!0}var e=!1,r;this.paper.canvas.parentElement?r=this.paper.canvas.parentElement.style:this.paper.canvas.parentNode&&(r=this.paper.canvas.parentNode.style),r&&\"none\"==r.display&&(e=!0,r.display=\"\");var i={};try{i=this.node.getBBox()}catch(n){i={x:this.node.clientLeft,y:this.node.clientTop,width:this.node.clientWidth,height:this.node.clientHeight}}finally{i=i||{},e&&(r.display=\"none\")}return t&&this.hide(),i},E.attr=function(r,i){if(this.removed)return this;if(null==r){var n={};for(var a in this.attrs)this.attrs[e](a)&&(n[a]=this.attrs[a]);return n.gradient&&\"none\"==n.fill&&(n.fill=n.gradient)&&delete n.gradient,n.transform=this._.transform,n}if(null==i&&t.is(r,\"string\")){if(\"fill\"==r&&\"none\"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if(\"transform\"==r)return this._.transform;for(var s=r.split(h),o={},l=0,c=s.length;l<c;l++)r=s[l],r in this.attrs?o[r]=this.attrs[r]:t.is(this.paper.customAttributes[r],\"function\")?o[r]=this.paper.customAttributes[r].def:o[r]=t._availableAttrs[r];return c-1?o:o[s[0]]}if(null==i&&t.is(r,\"array\")){for(o={},l=0,c=r.length;l<c;l++)o[r[l]]=this.attr(r[l]);return o}if(null!=i){var f={};f[r]=i}else null!=r&&t.is(r,\"object\")&&(f=r);for(var p in f)u(\"raphael.attr.\"+p+\".\"+this.id,this,f[p]);for(p in this.paper.customAttributes)if(this.paper.customAttributes[e](p)&&f[e](p)&&t.is(this.paper.customAttributes[p],\"function\")){var d=this.paper.customAttributes[p].apply(this,[].concat(f[p]));this.attrs[p]=f[p];for(var g in d)d[e](g)&&(f[g]=d[g])}return B(this,f),this},E.toFront=function(){if(this.removed)return this;var e=A(this.node);e.parentNode.appendChild(e);var r=this.paper;return r.top!=this&&t._tofront(this,r),this},E.toBack=function(){if(this.removed)return this;var e=A(this.node),r=e.parentNode;r.insertBefore(e,r.firstChild),t._toback(this,this.paper);var i=this.paper;return this},E.insertAfter=function(e){if(this.removed||!e)return this;var r=A(this.node),i=A(e.node||e[e.length-1].node);return i.nextSibling?i.parentNode.insertBefore(r,i.nextSibling):i.parentNode.appendChild(r),t._insertafter(this,e,this.paper),this},E.insertBefore=function(e){if(this.removed||!e)return this;var r=A(this.node),i=A(e.node||e[0].node);return i.parentNode.insertBefore(r,i),t._insertbefore(this,e,this.paper),this},E.blur=function(e){var r=this;if(0!==+e){var i=v(\"filter\"),n=v(\"feGaussianBlur\");r.attrs.blur=e,i.id=t.createUUID(),v(n,{stdDeviation:+e||1.5}),i.appendChild(n),r.paper.defs.appendChild(i),r._blur=i,v(r.node,{filter:\"url(#\"+i.id+\")\"})}else r._blur&&(r._blur.parentNode.removeChild(r._blur),delete r._blur,delete r.attrs.blur),r.node.removeAttribute(\"filter\");return r},t._engine.circle=function(t,e,r,i){var n=v(\"circle\");t.canvas&&t.canvas.appendChild(n);var a=new T(n,t);return a.attrs={cx:e,cy:r,r:i,fill:\"none\",stroke:\"#000\"},a.type=\"circle\",v(n,a.attrs),a},t._engine.rect=function(t,e,r,i,n,a){var s=v(\"rect\");t.canvas&&t.canvas.appendChild(s);var o=new T(s,t);return o.attrs={x:e,y:r,width:i,height:n,rx:a||0,ry:a||0,fill:\"none\",stroke:\"#000\"},o.type=\"rect\",v(s,o.attrs),o},t._engine.ellipse=function(t,e,r,i,n){var a=v(\"ellipse\");t.canvas&&t.canvas.appendChild(a);var s=new T(a,t);return s.attrs={cx:e,cy:r,rx:i,ry:n,fill:\"none\",stroke:\"#000\"},s.type=\"ellipse\",v(a,s.attrs),s},t._engine.image=function(t,e,r,i,n,a){var s=v(\"image\");v(s,{x:r,y:i,width:n,height:a,preserveAspectRatio:\"none\"}),s.setAttributeNS(p,\"href\",e),t.canvas&&t.canvas.appendChild(s);var o=new T(s,t);return o.attrs={x:r,y:i,width:n,height:a,src:e},o.type=\"image\",o},t._engine.text=function(e,r,i,n){var a=v(\"text\");e.canvas&&e.canvas.appendChild(a);var s=new T(a,e);return s.attrs={x:r,y:i,\"text-anchor\":\"middle\",text:n,\"font-family\":t._availableAttrs[\"font-family\"],\"font-size\":t._availableAttrs[\"font-size\"],stroke:\"none\",fill:\"#000\"},s.type=\"text\",B(s,s.attrs),s},t._engine.setSize=function(t,e){return this.width=t||this.width,this.height=e||this.height,this.canvas.setAttribute(\"width\",this.width),this.canvas.setAttribute(\"height\",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},t._engine.create=function(){var e=t._getContainer.apply(0,arguments),r=e&&e.container,i=e.x,n=e.y,a=e.width,s=e.height;if(!r)throw new Error(\"SVG container not found.\");var o=v(\"svg\"),l=\"overflow:hidden;\",h;return i=i||0,n=n||0,a=a||512,s=s||342,v(o,{height:s,version:1.1,width:a,xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"}),1==r?(o.style.cssText=l+\"position:absolute;left:\"+i+\"px;top:\"+n+\"px\",t._g.doc.body.appendChild(o),h=1):(o.style.cssText=l+\"position:relative\",r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o)),r=new t._Paper,r.width=a,r.height=s,r.canvas=o,r.clear(),r._left=r._top=0,h&&(r.renderfix=function(){}),r.renderfix(),r},t._engine.setViewBox=function(t,e,r,i,n){u(\"raphael.setViewBox\",this,this._viewBox,[t,e,r,i,n]);var a=this.getSize(),o=s(r/a.width,i/a.height),l=this.top,h=n?\"xMidYMid meet\":\"xMinYMin\",c,p;for(null==t?(this._vbSize&&(o=1),delete this._vbSize,c=\"0 0 \"+this.width+f+this.height):(this._vbSize=o,c=t+f+e+f+r+f+i),v(this.canvas,{viewBox:c,preserveAspectRatio:h});o&&l;)p=\"stroke-width\"in l.attrs?l.attrs[\"stroke-width\"]:1,l.attr({\"stroke-width\":p}),l._.dirty=1,l._.dirtyT=1,l=l.prev;return this._viewBox=[t,e,r,i,!!n],this},t.prototype.renderfix=function(){var t=this.canvas,e=t.style,r;try{r=t.getScreenCTM()||t.createSVGMatrix()}catch(i){r=t.createSVGMatrix()}var n=-r.e%1,a=-r.f%1;(n||a)&&(n&&(this._left=(this._left+n)%1,e.left=this._left+\"px\"),a&&(this._top=(this._top+a)%1,e.top=this._top+\"px\"))},t.prototype.clear=function(){t.eve(\"raphael.clear\",this);for(var e=this.canvas;e.firstChild;)e.removeChild(e.firstChild);this.bottom=this.top=null,(this.desc=v(\"desc\")).appendChild(t._g.doc.createTextNode(\"Created with Raphaël \"+t.version)),e.appendChild(this.desc),e.appendChild(this.defs=v(\"defs\"))},t.prototype.remove=function(){u(\"raphael.remove\",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var e in this)this[e]=\"function\"==typeof this[e]?t._removedFactory(e):null};var M=t.st;for(var N in E)E[e](N)&&!M[e](N)&&(M[N]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t].apply(r,e)})}}(N))}}.apply(e,i),!(void 0!==n&&(t.exports=n))},function(t,e,r){var i,n;i=[r(1)],n=function(t){if(!t||t.vml){var e=\"hasOwnProperty\",r=String,i=parseFloat,n=Math,a=n.round,s=n.max,o=n.min,l=n.abs,h=\"fill\",u=/[, ]+/,c=t.eve,f=\" progid:DXImageTransform.Microsoft\",p=\" \",d=\"\",g={M:\"m\",L:\"l\",C:\"c\",Z:\"x\",m:\"t\",l:\"r\",c:\"v\",z:\"x\"},v=/([clmz]),?([^clmz]*)/gi,x=/ progid:\\S+Blur\\([^\\)]+\\)/g,y=/-?[^,\\s-]+/g,m=\"position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)\",b=21600,_={path:1,rect:1,image:1},w={circle:1,ellipse:1},k=function(e){var i=/[ahqstv]/gi,n=t._pathToAbsolute;if(r(e).match(i)&&(n=t._path2curve),i=/[clmz]/g,n==t._pathToAbsolute&&!r(e).match(i)){var s=r(e).replace(v,function(t,e,r){var i=[],n=\"m\"==e.toLowerCase(),s=g[e];return r.replace(y,function(t){n&&2==i.length&&(s+=i+g[\"m\"==e?\"l\":\"L\"],i=[]),i.push(a(t*b))}),s+i});return s}var o=n(e),l,h;s=[];for(var u=0,c=o.length;u<c;u++){l=o[u],h=o[u][0].toLowerCase(),\"z\"==h&&(h=\"x\");for(var f=1,x=l.length;f<x;f++)h+=a(l[f]*b)+(f!=x-1?\",\":d);s.push(h)}return s.join(p)},B=function(e,r,i){var n=t.matrix();return n.rotate(-e,.5,.5),{dx:n.x(r,i),dy:n.y(r,i)}},C=function(t,e,r,i,n,a){var s=t._,o=t.matrix,u=s.fillpos,c=t.node,f=c.style,d=1,g=\"\",v,x=b/e,y=b/r;if(f.visibility=\"hidden\",e&&r){if(c.coordsize=l(x)+p+l(y),f.rotation=a*(e*r<0?-1:1),a){var m=B(a,i,n);i=m.dx,n=m.dy}if(e<0&&(g+=\"x\"),r<0&&(g+=\" y\")&&(d=-1),f.flip=g,c.coordorigin=i*-x+p+n*-y,u||s.fillsize){var _=c.getElementsByTagName(h);_=_&&_[0],c.removeChild(_),u&&(m=B(a,o.x(u[0],u[1]),o.y(u[0],u[1])),_.position=m.dx*d+p+m.dy*d),s.fillsize&&(_.size=s.fillsize[0]*l(e)+p+s.fillsize[1]*l(r)),c.appendChild(_)}f.visibility=\"visible\"}};t.toString=function(){return\"Your browser doesn’t support SVG. Falling down to VML.\\nYou are running Raphaël \"+this.version};var S=function(t,e,i){for(var n=r(e).toLowerCase().split(\"-\"),a=i?\"end\":\"start\",s=n.length,o=\"classic\",l=\"medium\",h=\"medium\";s--;)switch(n[s]){case\"block\":case\"classic\":case\"oval\":case\"diamond\":case\"open\":case\"none\":o=n[s];break;case\"wide\":case\"narrow\":h=n[s];break;case\"long\":case\"short\":l=n[s]}var u=t.node.getElementsByTagName(\"stroke\")[0];u[a+\"arrow\"]=o,u[a+\"arrowlength\"]=l,u[a+\"arrowwidth\"]=h},A=function(n,l){n.attrs=n.attrs||{};var c=n.node,f=n.attrs,g=c.style,v,x=_[n.type]&&(l.x!=f.x||l.y!=f.y||l.width!=f.width||l.height!=f.height||l.cx!=f.cx||l.cy!=f.cy||l.rx!=f.rx||l.ry!=f.ry||l.r!=f.r),y=w[n.type]&&(f.cx!=l.cx||f.cy!=l.cy||f.r!=l.r||f.rx!=l.rx||f.ry!=l.ry),m=n;for(var B in l)l[e](B)&&(f[B]=l[B]);if(x&&(f.path=t._getPath[n.type](n),n._.dirty=1),l.href&&(c.href=l.href),l.title&&(c.title=l.title),l.target&&(c.target=l.target),l.cursor&&(g.cursor=l.cursor),\"blur\"in l&&n.blur(l.blur),(l.path&&\"path\"==n.type||x)&&(c.path=k(~r(f.path).toLowerCase().indexOf(\"r\")?t._pathToAbsolute(f.path):f.path),n._.dirty=1,\"image\"==n.type&&(n._.fillpos=[f.x,f.y],n._.fillsize=[f.width,f.height],C(n,1,1,0,0,0))),\"transform\"in l&&n.transform(l.transform),y){var A=+f.cx,E=+f.cy,M=+f.rx||+f.r||0,L=+f.ry||+f.r||0;c.path=t.format(\"ar{0},{1},{2},{3},{4},{1},{4},{1}x\",a((A-M)*b),a((E-L)*b),a((A+M)*b),a((E+L)*b),a(A*b)),n._.dirty=1}if(\"clip-rect\"in l){var z=r(l[\"clip-rect\"]).split(u);if(4==z.length){z[2]=+z[2]+ +z[0],z[3]=+z[3]+ +z[1];var P=c.clipRect||t._g.doc.createElement(\"div\"),F=P.style;F.clip=t.format(\"rect({1}px {2}px {3}px {0}px)\",z),c.clipRect||(F.position=\"absolute\",F.top=0,F.left=0,F.width=n.paper.width+\"px\",F.height=n.paper.height+\"px\",c.parentNode.insertBefore(P,c),P.appendChild(c),c.clipRect=P)}l[\"clip-rect\"]||c.clipRect&&(c.clipRect.style.clip=\"auto\")}if(n.textpath){var R=n.textpath.style;l.font&&(R.font=l.font),l[\"font-family\"]&&(R.fontFamily='\"'+l[\"font-family\"].split(\",\")[0].replace(/^['\"]+|['\"]+$/g,d)+'\"'),l[\"font-size\"]&&(R.fontSize=l[\"font-size\"]),l[\"font-weight\"]&&(R.fontWeight=l[\"font-weight\"]),l[\"font-style\"]&&(R.fontStyle=l[\"font-style\"])}if(\"arrow-start\"in l&&S(m,l[\"arrow-start\"]),\"arrow-end\"in l&&S(m,l[\"arrow-end\"],1),null!=l.opacity||null!=l.fill||null!=l.src||null!=l.stroke||null!=l[\"stroke-width\"]||null!=l[\"stroke-opacity\"]||null!=l[\"fill-opacity\"]||null!=l[\"stroke-dasharray\"]||null!=l[\"stroke-miterlimit\"]||null!=l[\"stroke-linejoin\"]||null!=l[\"stroke-linecap\"]){var j=c.getElementsByTagName(h),I=!1;if(j=j&&j[0],!j&&(I=j=N(h)),\"image\"==n.type&&l.src&&(j.src=l.src),l.fill&&(j.on=!0),null!=j.on&&\"none\"!=l.fill&&null!==l.fill||(j.on=!1),j.on&&l.fill){var q=r(l.fill).match(t._ISURL);if(q){j.parentNode==c&&c.removeChild(j),j.rotate=!0,j.src=q[1],j.type=\"tile\";var D=n.getBBox(1);j.position=D.x+p+D.y,n._.fillpos=[D.x,D.y],t._preload(q[1],function(){n._.fillsize=[this.offsetWidth,this.offsetHeight]})}else j.color=t.getRGB(l.fill).hex,j.src=d,j.type=\"solid\",t.getRGB(l.fill).error&&(m.type in{circle:1,ellipse:1}||\"r\"!=r(l.fill).charAt())&&T(m,l.fill,j)&&(f.fill=\"none\",f.gradient=l.fill,j.rotate=!1)}if(\"fill-opacity\"in l||\"opacity\"in l){var V=((+f[\"fill-opacity\"]+1||2)-1)*((+f.opacity+1||2)-1)*((+t.getRGB(l.fill).o+1||2)-1);V=o(s(V,0),1),j.opacity=V,j.src&&(j.color=\"none\")}c.appendChild(j);var O=c.getElementsByTagName(\"stroke\")&&c.getElementsByTagName(\"stroke\")[0],Y=!1;!O&&(Y=O=N(\"stroke\")),(l.stroke&&\"none\"!=l.stroke||l[\"stroke-width\"]||null!=l[\"stroke-opacity\"]||l[\"stroke-dasharray\"]||l[\"stroke-miterlimit\"]||l[\"stroke-linejoin\"]||l[\"stroke-linecap\"])&&(O.on=!0),(\"none\"==l.stroke||null===l.stroke||null==O.on||0==l.stroke||0==l[\"stroke-width\"])&&(O.on=!1);var W=t.getRGB(l.stroke);O.on&&l.stroke&&(O.color=W.hex),V=((+f[\"stroke-opacity\"]+1||2)-1)*((+f.opacity+1||2)-1)*((+W.o+1||2)-1);var G=.75*(i(l[\"stroke-width\"])||1);if(V=o(s(V,0),1),null==l[\"stroke-width\"]&&(G=f[\"stroke-width\"]),l[\"stroke-width\"]&&(O.weight=G),G&&G<1&&(V*=G)&&(O.weight=1),O.opacity=V,l[\"stroke-linejoin\"]&&(O.joinstyle=l[\"stroke-linejoin\"]||\"miter\"),O.miterlimit=l[\"stroke-miterlimit\"]||8,l[\"stroke-linecap\"]&&(O.endcap=\"butt\"==l[\"stroke-linecap\"]?\"flat\":\"square\"==l[\"stroke-linecap\"]?\"square\":\"round\"),\"stroke-dasharray\"in l){var H={\"-\":\"shortdash\",\".\":\"shortdot\",\"-.\":\"shortdashdot\",\"-..\":\"shortdashdotdot\",\". \":\"dot\",\"- \":\"dash\",\"--\":\"longdash\",\"- .\":\"dashdot\",\"--.\":\"longdashdot\",\"--..\":\"longdashdotdot\"};O.dashstyle=H[e](l[\"stroke-dasharray\"])?H[l[\"stroke-dasharray\"]]:d}Y&&c.appendChild(O)}if(\"text\"==m.type){m.paper.canvas.style.display=d;var X=m.paper.span,U=100,$=f.font&&f.font.match(/\\d+(?:\\.\\d*)?(?=px)/);g=X.style,f.font&&(g.font=f.font),f[\"font-family\"]&&(g.fontFamily=f[\"font-family\"]),f[\"font-weight\"]&&(g.fontWeight=f[\"font-weight\"]),f[\"font-style\"]&&(g.fontStyle=f[\"font-style\"]),$=i(f[\"font-size\"]||$&&$[0])||10,g.fontSize=$*U+\"px\",m.textpath.string&&(X.innerHTML=r(m.textpath.string).replace(/</g,\"&#60;\").replace(/&/g,\"&#38;\").replace(/\\n/g,\"<br>\"));var Z=X.getBoundingClientRect();m.W=f.w=(Z.right-Z.left)/U,m.H=f.h=(Z.bottom-Z.top)/U,m.X=f.x,m.Y=f.y+m.H/2,(\"x\"in l||\"y\"in l)&&(m.path.v=t.format(\"m{0},{1}l{2},{1}\",a(f.x*b),a(f.y*b),a(f.x*b)+1));for(var Q=[\"x\",\"y\",\"text\",\"font\",\"font-family\",\"font-weight\",\"font-style\",\"font-size\"],J=0,K=Q.length;J<K;J++)if(Q[J]in l){m._.dirty=1;break}switch(f[\"text-anchor\"]){case\"start\":m.textpath.style[\"v-text-align\"]=\"left\",m.bbx=m.W/2;break;case\"end\":m.textpath.style[\"v-text-align\"]=\"right\",m.bbx=-m.W/2;break;default:m.textpath.style[\"v-text-align\"]=\"center\",m.bbx=0}m.textpath.style[\"v-text-kern\"]=!0}},T=function(e,a,s){e.attrs=e.attrs||{};var o=e.attrs,l=Math.pow,h,u,c=\"linear\",f=\".5 .5\";if(e.attrs.gradient=a,a=r(a).replace(t._radial_gradient,function(t,e,r){return c=\"radial\",e&&r&&(e=i(e),r=i(r),l(e-.5,2)+l(r-.5,2)>.25&&(r=n.sqrt(.25-l(e-.5,2))*(2*(r>.5)-1)+.5),f=e+p+r),d}),a=a.split(/\\s*\\-\\s*/),\"linear\"==c){var g=a.shift();if(g=-i(g),isNaN(g))return null}var v=t._parseDots(a);if(!v)return null;if(e=e.shape||e.node,v.length){e.removeChild(s),s.on=!0,s.method=\"none\",s.color=v[0].color,s.color2=v[v.length-1].color;for(var x=[],y=0,m=v.length;y<m;y++)v[y].offset&&x.push(v[y].offset+p+v[y].color);s.colors=x.length?x.join():\"0% \"+s.color,\"radial\"==c?(s.type=\"gradientTitle\",s.focus=\"100%\",s.focussize=\"0 0\",s.focusposition=f,s.angle=0):(s.type=\"gradient\",s.angle=(270-g)%360),e.appendChild(s)}return 1},E=function(e,r){this[0]=this.node=e,e.raphael=!0,this.id=t._oid++,e.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=r,this.matrix=t.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!r.bottom&&(r.bottom=this),this.prev=r.top,r.top&&(r.top.next=this),r.top=this,this.next=null},M=t.el;E.prototype=M,M.constructor=E,M.transform=function(e){if(null==e)return this._.transform;var i=this.paper._viewBoxShift,n=i?\"s\"+[i.scale,i.scale]+\"-1-1t\"+[i.dx,i.dy]:d,a;i&&(a=e=r(e).replace(/\\.{3}|\\u2026/g,this._.transform||d)),t._extractTransform(this,n+e);var s=this.matrix.clone(),o=this.skew,l=this.node,h,u=~r(this.attrs.fill).indexOf(\"-\"),c=!r(this.attrs.fill).indexOf(\"url(\");if(s.translate(1,1),c||u||\"image\"==this.type)if(o.matrix=\"1 0 0 1\",o.offset=\"0 0\",h=s.split(),u&&h.noRotation||!h.isSimple){l.style.filter=s.toFilter();var f=this.getBBox(),g=this.getBBox(1),v=f.x-g.x,x=f.y-g.y;l.coordorigin=v*-b+p+x*-b,C(this,1,1,v,x,0)}else l.style.filter=d,C(this,h.scalex,h.scaley,h.dx,h.dy,h.rotate);else l.style.filter=d,o.matrix=r(s),o.offset=s.offset();return null!==a&&(this._.transform=a,t._extractTransform(this,a)),this},M.rotate=function(t,e,n){if(this.removed)return this;if(null!=t){if(t=r(t).split(u),t.length-1&&(e=i(t[1]),n=i(t[2])),t=i(t[0]),null==n&&(e=n),null==e||null==n){var a=this.getBBox(1);e=a.x+a.width/2,n=a.y+a.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([[\"r\",t,e,n]])),this}},M.translate=function(t,e){return this.removed?this:(t=r(t).split(u),t.length-1&&(e=i(t[1])),t=i(t[0])||0,e=+e||0,this._.bbox&&(this._.bbox.x+=t,this._.bbox.y+=e),this.transform(this._.transform.concat([[\"t\",t,e]])),this)},M.scale=function(t,e,n,a){if(this.removed)return this;if(t=r(t).split(u),t.length-1&&(e=i(t[1]),n=i(t[2]),a=i(t[3]),isNaN(n)&&(n=null),isNaN(a)&&(a=null)),t=i(t[0]),null==e&&(e=t),null==a&&(n=a),null==n||null==a)var s=this.getBBox(1);return n=null==n?s.x+s.width/2:n,a=null==a?s.y+s.height/2:a,this.transform(this._.transform.concat([[\"s\",t,e,n,a]])),this._.dirtyT=1,this},M.hide=function(){return!this.removed&&(this.node.style.display=\"none\"),this},M.show=function(){return!this.removed&&(this.node.style.display=d),this},M.auxGetBBox=t.el.getBBox,M.getBBox=function(){var t=this.auxGetBBox();if(this.paper&&this.paper._viewBoxShift){var e={},r=1/this.paper._viewBoxShift.scale;return e.x=t.x-this.paper._viewBoxShift.dx,e.x*=r,e.y=t.y-this.paper._viewBoxShift.dy,e.y*=r,e.width=t.width*r,e.height=t.height*r,e.x2=e.x+e.width,e.y2=e.y+e.height,e}return t},M._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},M.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),t.eve.unbind(\"raphael.*.*.\"+this.id),t._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var e in this)this[e]=\"function\"==typeof this[e]?t._removedFactory(e):null;this.removed=!0}},M.attr=function(r,i){if(this.removed)return this;if(null==r){var n={};for(var a in this.attrs)this.attrs[e](a)&&(n[a]=this.attrs[a]);return n.gradient&&\"none\"==n.fill&&(n.fill=n.gradient)&&delete n.gradient,n.transform=this._.transform,n}if(null==i&&t.is(r,\"string\")){if(r==h&&\"none\"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var s=r.split(u),o={},l=0,f=s.length;l<f;l++)r=s[l],r in this.attrs?o[r]=this.attrs[r]:t.is(this.paper.customAttributes[r],\"function\")?o[r]=this.paper.customAttributes[r].def:o[r]=t._availableAttrs[r];return f-1?o:o[s[0]]}if(this.attrs&&null==i&&t.is(r,\"array\")){for(o={},l=0,f=r.length;l<f;l++)o[r[l]]=this.attr(r[l]);return o}var p;null!=i&&(p={},p[r]=i),null==i&&t.is(r,\"object\")&&(p=r);for(var d in p)c(\"raphael.attr.\"+d+\".\"+this.id,this,p[d]);if(p){for(d in this.paper.customAttributes)if(this.paper.customAttributes[e](d)&&p[e](d)&&t.is(this.paper.customAttributes[d],\"function\")){var g=this.paper.customAttributes[d].apply(this,[].concat(p[d]));this.attrs[d]=p[d];for(var v in g)g[e](v)&&(p[v]=g[v])}p.text&&\"text\"==this.type&&(this.textpath.string=p.text),A(this,p)}return this},M.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&t._tofront(this,this.paper),this},M.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),t._toback(this,this.paper)),this)},M.insertAfter=function(e){return this.removed?this:(e.constructor==t.st.constructor&&(e=e[e.length-1]),e.node.nextSibling?e.node.parentNode.insertBefore(this.node,e.node.nextSibling):e.node.parentNode.appendChild(this.node),t._insertafter(this,e,this.paper),this)},M.insertBefore=function(e){return this.removed?this:(e.constructor==t.st.constructor&&(e=e[0]),e.node.parentNode.insertBefore(this.node,e.node),t._insertbefore(this,e,this.paper),this)},M.blur=function(e){var r=this.node.runtimeStyle,i=r.filter;return i=i.replace(x,d),0!==+e?(this.attrs.blur=e,r.filter=i+p+f+\".Blur(pixelradius=\"+(+e||1.5)+\")\",r.margin=t.format(\"-{0}px 0 0 -{0}px\",a(+e||1.5))):(r.filter=i,r.margin=0,delete this.attrs.blur),this},t._engine.path=function(t,e){var r=N(\"shape\");r.style.cssText=m,r.coordsize=b+p+b,r.coordorigin=e.coordorigin;var i=new E(r,e),n={fill:\"none\",stroke:\"#000\"};t&&(n.path=t),i.type=\"path\",i.path=[],i.Path=d,A(i,n),e.canvas&&e.canvas.appendChild(r);var a=N(\"skew\");return a.on=!0,r.appendChild(a),i.skew=a,i.transform(d),i},t._engine.rect=function(e,r,i,n,a,s){var o=t._rectPath(r,i,n,a,s),l=e.path(o),h=l.attrs;return l.X=h.x=r,l.Y=h.y=i,l.W=h.width=n,l.H=h.height=a,h.r=s,h.path=o,l.type=\"rect\",l},t._engine.ellipse=function(t,e,r,i,n){var a=t.path(),s=a.attrs;return a.X=e-i,a.Y=r-n,a.W=2*i,a.H=2*n,a.type=\"ellipse\",A(a,{cx:e,cy:r,rx:i,ry:n}),a},t._engine.circle=function(t,e,r,i){var n=t.path(),a=n.attrs;return n.X=e-i,n.Y=r-i,n.W=n.H=2*i,n.type=\"circle\",A(n,{cx:e,cy:r,r:i}),n},t._engine.image=function(e,r,i,n,a,s){var o=t._rectPath(i,n,a,s),l=e.path(o).attr({stroke:\"none\"}),u=l.attrs,c=l.node,f=c.getElementsByTagName(h)[0];return u.src=r,l.X=u.x=i,l.Y=u.y=n,l.W=u.width=a,l.H=u.height=s,u.path=o,l.type=\"image\",f.parentNode==c&&c.removeChild(f),f.rotate=!0,f.src=r,f.type=\"tile\",l._.fillpos=[i,n],l._.fillsize=[a,s],c.appendChild(f),C(l,1,1,0,0,0),l},t._engine.text=function(e,i,n,s){var o=N(\"shape\"),l=N(\"path\"),h=N(\"textpath\");i=i||0,n=n||0,s=s||\"\",l.v=t.format(\"m{0},{1}l{2},{1}\",a(i*b),a(n*b),a(i*b)+1),l.textpathok=!0,h.string=r(s),h.on=!0,o.style.cssText=m,o.coordsize=b+p+b,o.coordorigin=\"0 0\";var u=new E(o,e),c={fill:\"#000\",stroke:\"none\",font:t._availableAttrs.font,text:s};u.shape=o,u.path=l,u.textpath=h,u.type=\"text\",u.attrs.text=r(s),u.attrs.x=i,u.attrs.y=n,u.attrs.w=1,u.attrs.h=1,A(u,c),o.appendChild(h),o.appendChild(l),e.canvas.appendChild(o);var f=N(\"skew\");return f.on=!0,o.appendChild(f),u.skew=f,u.transform(d),u},t._engine.setSize=function(e,r){var i=this.canvas.style;return this.width=e,this.height=r,e==+e&&(e+=\"px\"),r==+r&&(r+=\"px\"),i.width=e,i.height=r,i.clip=\"rect(0 \"+e+\" \"+r+\" 0)\",this._viewBox&&t._engine.setViewBox.apply(this,this._viewBox),this},t._engine.setViewBox=function(e,r,i,n,a){t.eve(\"raphael.setViewBox\",this,this._viewBox,[e,r,i,n,a]);var s=this.getSize(),o=s.width,l=s.height,h,u;return a&&(h=l/n,u=o/i,i*h<o&&(e-=(o-i*h)/2/h),n*u<l&&(r-=(l-n*u)/2/u)),this._viewBox=[e,r,i,n,!!a],this._viewBoxShift={dx:-e,dy:-r,scale:s},this.forEach(function(t){t.transform(\"...\")}),this};var N;t._engine.initWin=function(t){var e=t.document;e.styleSheets.length<31?e.createStyleSheet().addRule(\".rvml\",\"behavior:url(#default#VML)\"):e.styleSheets[0].addRule(\".rvml\",\"behavior:url(#default#VML)\");try{!e.namespaces.rvml&&e.namespaces.add(\"rvml\",\"urn:schemas-microsoft-com:vml\"),N=function(t){return e.createElement(\"<rvml:\"+t+' class=\"rvml\">')}}catch(r){N=function(t){return e.createElement(\"<\"+t+' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"rvml\">')}}},t._engine.initWin(t._g.win),t._engine.create=function(){var e=t._getContainer.apply(0,arguments),r=e.container,i=e.height,n,a=e.width,s=e.x,o=e.y;if(!r)throw new Error(\"VML container not found.\");var l=new t._Paper,h=l.canvas=t._g.doc.createElement(\"div\"),u=h.style;return s=s||0,o=o||0,a=a||512,i=i||342,l.width=a,l.height=i,a==+a&&(a+=\"px\"),i==+i&&(i+=\"px\"),l.coordsize=1e3*b+p+1e3*b,l.coordorigin=\"0 0\",l.span=t._g.doc.createElement(\"span\"),l.span.style.cssText=\"position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;\",h.appendChild(l.span),u.cssText=t.format(\"top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden\",a,i),1==r?(t._g.doc.body.appendChild(h),u.left=s+\"px\",u.top=o+\"px\",u.position=\"absolute\"):r.firstChild?r.insertBefore(h,r.firstChild):r.appendChild(h),l.renderfix=function(){},l},t.prototype.clear=function(){t.eve(\"raphael.clear\",this),this.canvas.innerHTML=d,this.span=t._g.doc.createElement(\"span\"),this.span.style.cssText=\"position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;\",this.canvas.appendChild(this.span),this.bottom=this.top=null},t.prototype.remove=function(){t.eve(\"raphael.remove\",this),this.canvas.parentNode.removeChild(this.canvas);for(var e in this)this[e]=\"function\"==typeof this[e]?t._removedFactory(e):null;return!0};var L=t.st;for(var z in M)M[e](z)&&!L[e](z)&&(L[z]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t].apply(r,e)})}}(z))}}.apply(e,i),!(void 0!==n&&(t.exports=n))}])});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL3JhcGhhZWwvcmFwaGFlbC5taW4uanM/YmYwOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsdUlBQW1MLGlCQUFpQixtQkFBbUIsY0FBYyw0QkFBNEIsWUFBWSxVQUFVLGlCQUFpQixnRUFBZ0UsU0FBUywrQkFBK0Isa0JBQWtCLFFBQVEsaUNBQWlDLFNBQVMseUNBQXlDLGlCQUFpQixRQUFRLHVCQUF1QixjQUFjLDZEQUE2RCw2RUFBNkUsOENBQThDLG1DQUFtQyxjQUFjLDRFQUE0RSxpQ0FBaUMsRUFBRSx3Q0FBd0MsY0FBYyxnREFBZ0Qsd0JBQXdCLHVDQUF1QyxTQUFTLGdCQUFnQix1QkFBdUIsSUFBSSxnREFBZ0Qsa0JBQWtCLGFBQWEsaUZBQWlGLHVCQUF1QixvSEFBb0gsU0FBUyxhQUFhLGdCQUFnQixnQkFBZ0IsNEJBQTRCLFNBQVMsTUFBTSxRQUFRLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLGlCQUFpQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixPQUFPLGdCQUFnQixRQUFRLG9CQUFvQiw0QkFBNEIsa0JBQWtCLDRJQUE0SSxTQUFTLHNCQUFzQiwwQ0FBMEMsbUJBQW1CLDhCQUE4QiwrQkFBK0IseUxBQXlMLElBQUksS0FBSyx1REFBdUQsa0JBQWtCLFdBQVcsOEJBQThCLGlDQUFpQyw0QkFBNEIsMkJBQTJCLFNBQVMsNkNBQTZDLFVBQVUsNEJBQTRCLGtFQUFrRSxrR0FBa0csTUFBTSxnREFBZ0QsNExBQTRMLFdBQVcsZ0JBQWdCLGNBQWMsZ0JBQWdCLGdCQUFnQixrQkFBa0Isd0NBQXdDLHlDQUF5QyxrRkFBa0YsY0FBYyxNQUFNLEtBQUssaURBQWlELFFBQVEsa0JBQWtCLEVBQUUsUUFBUSxNQUFNLHlEQUF5RCxrQkFBa0IsRUFBRSxRQUFRLElBQUksZ0JBQWdCLElBQUks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Z0Usb0JBQW9CLDJCQUEyQix3RkFBd0YsZ0JBQWdCLDBEQUEwRCxzQ0FBc0MsbURBQW1ELHVGQUF1Rix1Q0FBdUMseUJBQXlCLDZEQUE2RCxvQkFBb0IsSUFBSSxvQ0FBb0MseUJBQXlCLHdEQUF3RCxjQUFjLElBQUksdUNBQXVDLDZDQUE2QyxjQUFjLG9EQUFvRCxtT0FBbU8sa0NBQWtDLDZDQUE2QyxzQ0FBc0MsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSx3SEFBd0gsb0JBQW9CLDhEQUE4RCxpTEFBaUwsZ0JBQWdCLDBEQUEwRCxpQ0FBaUMsd0JBQXdCLDJMQUEyTCwwQ0FBMEMsMkRBQTJELDhDQUE4Qyx3SEFBd0gsb0JBQW9CLDBCQUEwQixtQkFBbUIsUUFBUSxNQUFNLDhCQUE4QixpQkFBaUIsMEpBQTBKLElBQUksMkZBQTJGLHFEQUFxRCxTQUFTLGNBQWMsdUZBQXVGLHlEQUF5RCwwRkFBMEYsa0RBQWtELHNFQUFzRSwwTkFBME4sYUFBYSxZQUFZLFVBQVUsU0FBUyxjQUFjLGtEQUFrRCxPQUFPLE9BQU8sR0FBRyxRQUFRLEdBQUcscUJBQXFCLGtCQUFrQixhQUFhLEVBQUUsRUFBRSxFQUFFLElBQUksZ01BQWdNLEdBQUcsOEJBQThCLHdJQUF3SSxhQUFhLFlBQVksVUFBVSxTQUFTLGNBQWMsZUFBZSwrREFBK0QsK0JBQStCLDZFQUE2RSwrRUFBK0UsVUFBVSxXQUFXLG9EQUFvRCxrQkFBa0IsZ0JBQWdCLGdDQUFnQyxnQkFBZ0IsR0FBRyxNQUFNLHlDQUF5QyxHQUFHIiwiZmlsZSI6IjUxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIWZ1bmN0aW9uIHQoZSxyKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1yKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSxyKTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLlJhcGhhZWw9cigpOmUuUmFwaGFlbD1yKCl9KHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShpKXtpZihyW2ldKXJldHVybiByW2ldLmV4cG9ydHM7dmFyIG49cltpXT17ZXhwb3J0czp7fSxpZDppLGxvYWRlZDohMX07cmV0dXJuIHRbaV0uY2FsbChuLmV4cG9ydHMsbixuLmV4cG9ydHMsZSksbi5sb2FkZWQ9ITAsbi5leHBvcnRzfXZhciByPXt9O3JldHVybiBlLm09dCxlLmM9cixlLnA9XCJcIixlKDApfShbZnVuY3Rpb24odCxlLHIpe3ZhciBpLG47aT1bcigxKSxyKDMpLHIoNCldLG49ZnVuY3Rpb24odCl7cmV0dXJuIHR9LmFwcGx5KGUsaSksISh2b2lkIDAhPT1uJiYodC5leHBvcnRzPW4pKX0sZnVuY3Rpb24odCxlLHIpe3ZhciBpLG47aT1bcigyKV0sbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHIpe2lmKGUuaXMocixcImZ1bmN0aW9uXCIpKXJldHVybiB3P3IoKTp0Lm9uKFwicmFwaGFlbC5ET01sb2FkXCIscik7aWYoZS5pcyhyLFEpKXJldHVybiBlLl9lbmdpbmUuY3JlYXRlW3pdKGUsci5zcGxpY2UoMCwzK2UuaXMoclswXSwkKSkpLmFkZChyKTt2YXIgaT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7aWYoZS5pcyhpW2kubGVuZ3RoLTFdLFwiZnVuY3Rpb25cIikpe3ZhciBuPWkucG9wKCk7cmV0dXJuIHc/bi5jYWxsKGUuX2VuZ2luZS5jcmVhdGVbel0oZSxpKSk6dC5vbihcInJhcGhhZWwuRE9NbG9hZFwiLGZ1bmN0aW9uKCl7bi5jYWxsKGUuX2VuZ2luZS5jcmVhdGVbel0oZSxpKSl9KX1yZXR1cm4gZS5fZW5naW5lLmNyZWF0ZVt6XShlLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcih0KXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB0fHxPYmplY3QodCkhPT10KXJldHVybiB0O3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yO2Zvcih2YXIgaSBpbiB0KXRbQV0oaSkmJihlW2ldPXIodFtpXSkpO3JldHVybiBlfWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspaWYodFtyXT09PWUpcmV0dXJuIHQucHVzaCh0LnNwbGljZShyLDEpWzBdKX1mdW5jdGlvbiBuKHQsZSxyKXtmdW5jdGlvbiBuKCl7dmFyIGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLHM9YS5qb2luKFwi4pCAXCIpLG89bi5jYWNoZT1uLmNhY2hlfHx7fSxsPW4uY291bnQ9bi5jb3VudHx8W107cmV0dXJuIG9bQV0ocyk/KGkobCxzKSxyP3Iob1tzXSk6b1tzXSk6KGwubGVuZ3RoPj0xZTMmJmRlbGV0ZSBvW2wuc2hpZnQoKV0sbC5wdXNoKHMpLG9bc109dFt6XShlLGEpLHI/cihvW3NdKTpvW3NdKX1yZXR1cm4gbn1mdW5jdGlvbiBhKCl7cmV0dXJuIHRoaXMuaGV4fWZ1bmN0aW9uIHModCxlKXtmb3IodmFyIHI9W10saT0wLG49dC5sZW5ndGg7bi0yKiFlPmk7aSs9Mil7dmFyIGE9W3t4Oit0W2ktMl0seTordFtpLTFdfSx7eDordFtpXSx5Oit0W2krMV19LHt4Oit0W2krMl0seTordFtpKzNdfSx7eDordFtpKzRdLHk6K3RbaSs1XX1dO2U/aT9uLTQ9PWk/YVszXT17eDordFswXSx5Oit0WzFdfTpuLTI9PWkmJihhWzJdPXt4Oit0WzBdLHk6K3RbMV19LGFbM109e3g6K3RbMl0seTordFszXX0pOmFbMF09e3g6K3Rbbi0yXSx5Oit0W24tMV19Om4tND09aT9hWzNdPWFbMl06aXx8KGFbMF09e3g6K3RbaV0seTordFtpKzFdfSksci5wdXNoKFtcIkNcIiwoLWFbMF0ueCs2KmFbMV0ueCthWzJdLngpLzYsKC1hWzBdLnkrNiphWzFdLnkrYVsyXS55KS82LChhWzFdLngrNiphWzJdLngtYVszXS54KS82LChhWzFdLnkrNiphWzJdLnktYVszXS55KS82LGFbMl0ueCxhWzJdLnldKX1yZXR1cm4gcn1mdW5jdGlvbiBvKHQsZSxyLGksbil7dmFyIGE9LTMqZSs5KnItOSppKzMqbixzPXQqYSs2KmUtMTIqcis2Kmk7cmV0dXJuIHQqcy0zKmUrMypyfWZ1bmN0aW9uIGwodCxlLHIsaSxuLGEscyxsLGgpe251bGw9PWgmJihoPTEpLGg9aD4xPzE6aDwwPzA6aDtmb3IodmFyIHU9aC8yLGM9MTIsZj1bLS4xMjUyLC4xMjUyLC0uMzY3OCwuMzY3OCwtLjU4NzMsLjU4NzMsLS43Njk5LC43Njk5LC0uOTA0MSwuOTA0MSwtLjk4MTYsLjk4MTZdLHA9Wy4yNDkxLC4yNDkxLC4yMzM1LC4yMzM1LC4yMDMyLC4yMDMyLC4xNjAxLC4xNjAxLC4xMDY5LC4xMDY5LC4wNDcyLC4wNDcyXSxkPTAsZz0wO2c8YztnKyspe3ZhciB2PXUqZltnXSt1LHg9byh2LHQscixuLHMpLHk9byh2LGUsaSxhLGwpLG09eCp4K3kqeTtkKz1wW2ddKlkuc3FydChtKX1yZXR1cm4gdSpkfWZ1bmN0aW9uIGgodCxlLHIsaSxuLGEscyxvLGgpe2lmKCEoaDwwfHxsKHQsZSxyLGksbixhLHMsbyk8aCkpe3ZhciB1PTEsYz11LzIsZj11LWMscCxkPS4wMTtmb3IocD1sKHQsZSxyLGksbixhLHMsbyxmKTtIKHAtaCk+ZDspYy89MixmKz0ocDxoPzE6LTEpKmMscD1sKHQsZSxyLGksbixhLHMsbyxmKTtyZXR1cm4gZn19ZnVuY3Rpb24gdSh0LGUscixpLG4sYSxzLG8pe2lmKCEoVyh0LHIpPEcobixzKXx8Ryh0LHIpPlcobixzKXx8VyhlLGkpPEcoYSxvKXx8RyhlLGkpPlcoYSxvKSkpe3ZhciBsPSh0KmktZSpyKSoobi1zKS0odC1yKSoobipvLWEqcyksaD0odCppLWUqcikqKGEtbyktKGUtaSkqKG4qby1hKnMpLHU9KHQtcikqKGEtbyktKGUtaSkqKG4tcyk7aWYodSl7dmFyIGM9bC91LGY9aC91LHA9K2MudG9GaXhlZCgyKSxkPStmLnRvRml4ZWQoMik7aWYoIShwPCtHKHQscikudG9GaXhlZCgyKXx8cD4rVyh0LHIpLnRvRml4ZWQoMil8fHA8K0cobixzKS50b0ZpeGVkKDIpfHxwPitXKG4scykudG9GaXhlZCgyKXx8ZDwrRyhlLGkpLnRvRml4ZWQoMil8fGQ+K1coZSxpKS50b0ZpeGVkKDIpfHxkPCtHKGEsbykudG9GaXhlZCgyKXx8ZD4rVyhhLG8pLnRvRml4ZWQoMikpKXJldHVybnt4OmMseTpmfX19fWZ1bmN0aW9uIGModCxlKXtyZXR1cm4gcCh0LGUpfWZ1bmN0aW9uIGYodCxlKXtyZXR1cm4gcCh0LGUsMSl9ZnVuY3Rpb24gcCh0LHIsaSl7dmFyIG49ZS5iZXppZXJCQm94KHQpLGE9ZS5iZXppZXJCQm94KHIpO2lmKCFlLmlzQkJveEludGVyc2VjdChuLGEpKXJldHVybiBpPzA6W107Zm9yKHZhciBzPWwuYXBwbHkoMCx0KSxvPWwuYXBwbHkoMCxyKSxoPVcofn4ocy81KSwxKSxjPVcofn4oby81KSwxKSxmPVtdLHA9W10sZD17fSxnPWk/MDpbXSx2PTA7djxoKzE7disrKXt2YXIgeD1lLmZpbmREb3RzQXRTZWdtZW50LmFwcGx5KGUsdC5jb25jYXQodi9oKSk7Zi5wdXNoKHt4OngueCx5OngueSx0OnYvaH0pfWZvcih2PTA7djxjKzE7disrKXg9ZS5maW5kRG90c0F0U2VnbWVudC5hcHBseShlLHIuY29uY2F0KHYvYykpLHAucHVzaCh7eDp4LngseTp4LnksdDp2L2N9KTtmb3Iodj0wO3Y8aDt2KyspZm9yKHZhciB5PTA7eTxjO3krKyl7dmFyIG09Zlt2XSxiPWZbdisxXSxfPXBbeV0sdz1wW3krMV0saz1IKGIueC1tLngpPC4wMDE/XCJ5XCI6XCJ4XCIsQj1IKHcueC1fLngpPC4wMDE/XCJ5XCI6XCJ4XCIsQz11KG0ueCxtLnksYi54LGIueSxfLngsXy55LHcueCx3LnkpO2lmKEMpe2lmKGRbQy54LnRvRml4ZWQoNCldPT1DLnkudG9GaXhlZCg0KSljb250aW51ZTtkW0MueC50b0ZpeGVkKDQpXT1DLnkudG9GaXhlZCg0KTt2YXIgUz1tLnQrSCgoQ1trXS1tW2tdKS8oYltrXS1tW2tdKSkqKGIudC1tLnQpLEE9Xy50K0goKENbQl0tX1tCXSkvKHdbQl0tX1tCXSkpKih3LnQtXy50KTtTPj0wJiZTPD0xLjAwMSYmQT49MCYmQTw9MS4wMDEmJihpP2crKzpnLnB1c2goe3g6Qy54LHk6Qy55LHQxOkcoUywxKSx0MjpHKEEsMSl9KSl9fXJldHVybiBnfWZ1bmN0aW9uIGQodCxyLGkpe3Q9ZS5fcGF0aDJjdXJ2ZSh0KSxyPWUuX3BhdGgyY3VydmUocik7Zm9yKHZhciBuLGEscyxvLGwsaCx1LGMsZixkLGc9aT8wOltdLHY9MCx4PXQubGVuZ3RoO3Y8eDt2Kyspe3ZhciB5PXRbdl07aWYoXCJNXCI9PXlbMF0pbj1sPXlbMV0sYT1oPXlbMl07ZWxzZXtcIkNcIj09eVswXT8oZj1bbixhXS5jb25jYXQoeS5zbGljZSgxKSksbj1mWzZdLGE9Zls3XSk6KGY9W24sYSxuLGEsbCxoLGwsaF0sbj1sLGE9aCk7Zm9yKHZhciBtPTAsYj1yLmxlbmd0aDttPGI7bSsrKXt2YXIgXz1yW21dO2lmKFwiTVwiPT1fWzBdKXM9dT1fWzFdLG89Yz1fWzJdO2Vsc2V7XCJDXCI9PV9bMF0/KGQ9W3Msb10uY29uY2F0KF8uc2xpY2UoMSkpLHM9ZFs2XSxvPWRbN10pOihkPVtzLG8scyxvLHUsYyx1LGNdLHM9dSxvPWMpO3ZhciB3PXAoZixkLGkpO2lmKGkpZys9dztlbHNle2Zvcih2YXIgaz0wLEI9dy5sZW5ndGg7azxCO2srKyl3W2tdLnNlZ21lbnQxPXYsd1trXS5zZWdtZW50Mj1tLHdba10uYmV6MT1mLHdba10uYmV6Mj1kO2c9Zy5jb25jYXQodyl9fX19fXJldHVybiBnfWZ1bmN0aW9uIGcodCxlLHIsaSxuLGEpe251bGwhPXQ/KHRoaXMuYT0rdCx0aGlzLmI9K2UsdGhpcy5jPStyLHRoaXMuZD0raSx0aGlzLmU9K24sdGhpcy5mPSthKToodGhpcy5hPTEsdGhpcy5iPTAsdGhpcy5jPTAsdGhpcy5kPTEsdGhpcy5lPTAsdGhpcy5mPTApfWZ1bmN0aW9uIHYoKXtyZXR1cm4gdGhpcy54K2ordGhpcy55fWZ1bmN0aW9uIHgoKXtyZXR1cm4gdGhpcy54K2ordGhpcy55K2ordGhpcy53aWR0aCtcIiDDlyBcIit0aGlzLmhlaWdodH1mdW5jdGlvbiB5KHQsZSxyLGksbixhKXtmdW5jdGlvbiBzKHQpe3JldHVybigoYyp0K3UpKnQraCkqdH1mdW5jdGlvbiBvKHQsZSl7dmFyIHI9bCh0LGUpO3JldHVybigoZCpyK3ApKnIrZikqcn1mdW5jdGlvbiBsKHQsZSl7dmFyIHIsaSxuLGEsbyxsO2ZvcihuPXQsbD0wO2w8ODtsKyspe2lmKGE9cyhuKS10LEgoYSk8ZSlyZXR1cm4gbjtpZihvPSgzKmMqbisyKnUpKm4raCxIKG8pPDFlLTYpYnJlYWs7bi09YS9vfWlmKHI9MCxpPTEsbj10LG48cilyZXR1cm4gcjtpZihuPmkpcmV0dXJuIGk7Zm9yKDtyPGk7KXtpZihhPXMobiksSChhLXQpPGUpcmV0dXJuIG47dD5hP3I9bjppPW4sbj0oaS1yKS8yK3J9cmV0dXJuIG59dmFyIGg9MyplLHU9MyooaS1lKS1oLGM9MS1oLXUsZj0zKnIscD0zKihuLXIpLWYsZD0xLWYtcDtyZXR1cm4gbyh0LDEvKDIwMCphKSl9ZnVuY3Rpb24gbSh0LGUpe3ZhciByPVtdLGk9e307aWYodGhpcy5tcz1lLHRoaXMudGltZXM9MSx0KXtmb3IodmFyIG4gaW4gdCl0W0FdKG4pJiYoaVtodChuKV09dFtuXSxyLnB1c2goaHQobikpKTtyLnNvcnQoQnQpfXRoaXMuYW5pbT1pLHRoaXMudG9wPXJbci5sZW5ndGgtMV0sdGhpcy5wZXJjZW50cz1yfWZ1bmN0aW9uIGIocixpLG4sYSxzLG8pe249aHQobik7dmFyIGwsaCx1LGM9W10sZixwLGQsdj1yLm1zLHg9e30sbT17fSxiPXt9O2lmKGEpZm9yKHc9MCxCPUVlLmxlbmd0aDt3PEI7dysrKXt2YXIgXz1FZVt3XTtpZihfLmVsLmlkPT1pLmlkJiZfLmFuaW09PXIpe18ucGVyY2VudCE9bj8oRWUuc3BsaWNlKHcsMSksdT0xKTpoPV8saS5hdHRyKF8udG90YWxPcmlnaW4pO2JyZWFrfX1lbHNlIGE9K207Zm9yKHZhciB3PTAsQj1yLnBlcmNlbnRzLmxlbmd0aDt3PEI7dysrKXtpZihyLnBlcmNlbnRzW3ddPT1ufHxyLnBlcmNlbnRzW3ddPmEqci50b3Ape249ci5wZXJjZW50c1t3XSxwPXIucGVyY2VudHNbdy0xXXx8MCx2PXYvci50b3AqKG4tcCksZj1yLnBlcmNlbnRzW3crMV0sbD1yLmFuaW1bbl07YnJlYWt9YSYmaS5hdHRyKHIuYW5pbVtyLnBlcmNlbnRzW3ddXSl9aWYobCl7aWYoaCloLmluaXRzdGF0dXM9YSxoLnN0YXJ0PW5ldyBEYXRlLWgubXMqYTtlbHNle2Zvcih2YXIgQyBpbiBsKWlmKGxbQV0oQykmJihwdFtBXShDKXx8aS5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW0FdKEMpKSlzd2l0Y2goeFtDXT1pLmF0dHIoQyksbnVsbD09eFtDXSYmKHhbQ109ZnRbQ10pLG1bQ109bFtDXSxwdFtDXSl7Y2FzZSAkOmJbQ109KG1bQ10teFtDXSkvdjticmVhaztjYXNlXCJjb2xvdXJcIjp4W0NdPWUuZ2V0UkdCKHhbQ10pO3ZhciBTPWUuZ2V0UkdCKG1bQ10pO2JbQ109e3I6KFMuci14W0NdLnIpL3YsZzooUy5nLXhbQ10uZykvdixiOihTLmIteFtDXS5iKS92fTticmVhaztjYXNlXCJwYXRoXCI6dmFyIFQ9UXQoeFtDXSxtW0NdKSxFPVRbMV07Zm9yKHhbQ109VFswXSxiW0NdPVtdLHc9MCxCPXhbQ10ubGVuZ3RoO3c8Qjt3Kyspe2JbQ11bd109WzBdO2Zvcih2YXIgTT0xLE49eFtDXVt3XS5sZW5ndGg7TTxOO00rKyliW0NdW3ddW01dPShFW3ddW01dLXhbQ11bd11bTV0pL3Z9YnJlYWs7Y2FzZVwidHJhbnNmb3JtXCI6dmFyIEw9aS5fLHo9bGUoTFtDXSxtW0NdKTtpZih6KWZvcih4W0NdPXouZnJvbSxtW0NdPXoudG8sYltDXT1bXSxiW0NdLnJlYWw9ITAsdz0wLEI9eFtDXS5sZW5ndGg7dzxCO3crKylmb3IoYltDXVt3XT1beFtDXVt3XVswXV0sTT0xLE49eFtDXVt3XS5sZW5ndGg7TTxOO00rKyliW0NdW3ddW01dPShtW0NdW3ddW01dLXhbQ11bd11bTV0pL3Y7ZWxzZXt2YXIgRj1pLm1hdHJpeHx8bmV3IGcsUj17Xzp7dHJhbnNmb3JtOkwudHJhbnNmb3JtfSxnZXRCQm94OmZ1bmN0aW9uKCl7cmV0dXJuIGkuZ2V0QkJveCgxKX19O3hbQ109W0YuYSxGLmIsRi5jLEYuZCxGLmUsRi5mXSxzZShSLG1bQ10pLG1bQ109Ui5fLnRyYW5zZm9ybSxiW0NdPVsoUi5tYXRyaXguYS1GLmEpL3YsKFIubWF0cml4LmItRi5iKS92LChSLm1hdHJpeC5jLUYuYykvdiwoUi5tYXRyaXguZC1GLmQpL3YsKFIubWF0cml4LmUtRi5lKS92LChSLm1hdHJpeC5mLUYuZikvdl19YnJlYWs7Y2FzZVwiY3N2XCI6dmFyIGo9SShsW0NdKVtxXShrKSxEPUkoeFtDXSlbcV0oayk7aWYoXCJjbGlwLXJlY3RcIj09Qylmb3IoeFtDXT1ELGJbQ109W10sdz1ELmxlbmd0aDt3LS07KWJbQ11bd109KGpbd10teFtDXVt3XSkvdjttW0NdPWo7YnJlYWs7ZGVmYXVsdDpmb3Ioaj1bXVtQXShsW0NdKSxEPVtdW1BdKHhbQ10pLGJbQ109W10sdz1pLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbQ10ubGVuZ3RoO3ctLTspYltDXVt3XT0oKGpbd118fDApLShEW3ddfHwwKSkvdn12YXIgVj1sLmVhc2luZyxPPWUuZWFzaW5nX2Zvcm11bGFzW1ZdO2lmKCFPKWlmKE89SShWKS5tYXRjaChzdCksTyYmNT09Ty5sZW5ndGgpe3ZhciBZPU87Tz1mdW5jdGlvbih0KXtyZXR1cm4geSh0LCtZWzFdLCtZWzJdLCtZWzNdLCtZWzRdLHYpfX1lbHNlIE89U3Q7aWYoZD1sLnN0YXJ0fHxyLnN0YXJ0fHwrbmV3IERhdGUsXz17YW5pbTpyLHBlcmNlbnQ6bix0aW1lc3RhbXA6ZCxzdGFydDpkKyhyLmRlbHx8MCksc3RhdHVzOjAsaW5pdHN0YXR1czphfHwwLHN0b3A6ITEsbXM6dixlYXNpbmc6Tyxmcm9tOngsZGlmZjpiLHRvOm0sZWw6aSxjYWxsYmFjazpsLmNhbGxiYWNrLHByZXY6cCxuZXh0OmYscmVwZWF0Om98fHIudGltZXMsb3JpZ2luOmkuYXR0cigpLHRvdGFsT3JpZ2luOnN9LEVlLnB1c2goXyksYSYmIWgmJiF1JiYoXy5zdG9wPSEwLF8uc3RhcnQ9bmV3IERhdGUtdiphLDE9PUVlLmxlbmd0aCkpcmV0dXJuIE5lKCk7dSYmKF8uc3RhcnQ9bmV3IERhdGUtXy5tcyphKSwxPT1FZS5sZW5ndGgmJk1lKE5lKX10KFwicmFwaGFlbC5hbmltLnN0YXJ0LlwiK2kuaWQsaSxyKX19ZnVuY3Rpb24gXyh0KXtmb3IodmFyIGU9MDtlPEVlLmxlbmd0aDtlKyspRWVbZV0uZWwucGFwZXI9PXQmJkVlLnNwbGljZShlLS0sMSl9ZS52ZXJzaW9uPVwiMi4yLjBcIixlLmV2ZT10O3ZhciB3LGs9L1ssIF0rLyxCPXtjaXJjbGU6MSxyZWN0OjEscGF0aDoxLGVsbGlwc2U6MSx0ZXh0OjEsaW1hZ2U6MX0sQz0vXFx7KFxcZCspXFx9L2csUz1cInByb3RvdHlwZVwiLEE9XCJoYXNPd25Qcm9wZXJ0eVwiLFQ9e2RvYzpkb2N1bWVudCx3aW46d2luZG93fSxFPXt3YXM6T2JqZWN0LnByb3RvdHlwZVtBXS5jYWxsKFQud2luLFwiUmFwaGFlbFwiKSxpczpULndpbi5SYXBoYWVsfSxNPWZ1bmN0aW9uKCl7dGhpcy5jYT10aGlzLmN1c3RvbUF0dHJpYnV0ZXM9e319LE4sTD1cImFwcGVuZENoaWxkXCIsej1cImFwcGx5XCIsUD1cImNvbmNhdFwiLEY9XCJvbnRvdWNoc3RhcnRcImluIFQud2lufHxULndpbi5Eb2N1bWVudFRvdWNoJiZULmRvYyBpbnN0YW5jZW9mIERvY3VtZW50VG91Y2gsUj1cIlwiLGo9XCIgXCIsST1TdHJpbmcscT1cInNwbGl0XCIsRD1cImNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZW1vdmUgbW91c2VvdXQgbW91c2VvdmVyIG1vdXNldXAgdG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWxcIltxXShqKSxWPXttb3VzZWRvd246XCJ0b3VjaHN0YXJ0XCIsbW91c2Vtb3ZlOlwidG91Y2htb3ZlXCIsbW91c2V1cDpcInRvdWNoZW5kXCJ9LE89SS5wcm90b3R5cGUudG9Mb3dlckNhc2UsWT1NYXRoLFc9WS5tYXgsRz1ZLm1pbixIPVkuYWJzLFg9WS5wb3csVT1ZLlBJLCQ9XCJudW1iZXJcIixaPVwic3RyaW5nXCIsUT1cImFycmF5XCIsSj1cInRvU3RyaW5nXCIsSz1cImZpbGxcIix0dD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGV0PXt9LHJ0PVwicHVzaFwiLGl0PWUuX0lTVVJMPS9edXJsXFwoWydcIl0/KC4rPylbJ1wiXT9cXCkkL2ksbnQ9L15cXHMqKCgjW2EtZlxcZF17Nn0pfCgjW2EtZlxcZF17M30pfHJnYmE/XFwoXFxzKihbXFxkXFwuXSslP1xccyosXFxzKltcXGRcXC5dKyU/XFxzKixcXHMqW1xcZFxcLl0rJT8oPzpcXHMqLFxccypbXFxkXFwuXSslPyk/KVxccypcXCl8aHNiYT9cXChcXHMqKFtcXGRcXC5dKyg/OmRlZ3xcXHhiMHwlKT9cXHMqLFxccypbXFxkXFwuXSslP1xccyosXFxzKltcXGRcXC5dKyg/OiU/XFxzKixcXHMqW1xcZFxcLl0rKT8pJT9cXHMqXFwpfGhzbGE/XFwoXFxzKihbXFxkXFwuXSsoPzpkZWd8XFx4YjB8JSk/XFxzKixcXHMqW1xcZFxcLl0rJT9cXHMqLFxccypbXFxkXFwuXSsoPzolP1xccyosXFxzKltcXGRcXC5dKyk/KSU/XFxzKlxcKSlcXHMqJC9pLGF0PXtOYU46MSxJbmZpbml0eToxLFwiLUluZmluaXR5XCI6MX0sc3Q9L14oPzpjdWJpYy0pP2JlemllclxcKChbXixdKyksKFteLF0rKSwoW14sXSspLChbXlxcKV0rKVxcKS8sb3Q9WS5yb3VuZCxsdD1cInNldEF0dHJpYnV0ZVwiLGh0PXBhcnNlRmxvYXQsdXQ9cGFyc2VJbnQsY3Q9SS5wcm90b3R5cGUudG9VcHBlckNhc2UsZnQ9ZS5fYXZhaWxhYmxlQXR0cnM9e1wiYXJyb3ctZW5kXCI6XCJub25lXCIsXCJhcnJvdy1zdGFydFwiOlwibm9uZVwiLGJsdXI6MCxcImNsaXAtcmVjdFwiOlwiMCAwIDFlOSAxZTlcIixjdXJzb3I6XCJkZWZhdWx0XCIsY3g6MCxjeTowLGZpbGw6XCIjZmZmXCIsXCJmaWxsLW9wYWNpdHlcIjoxLGZvbnQ6JzEwcHggXCJBcmlhbFwiJyxcImZvbnQtZmFtaWx5XCI6J1wiQXJpYWxcIicsXCJmb250LXNpemVcIjpcIjEwXCIsXCJmb250LXN0eWxlXCI6XCJub3JtYWxcIixcImZvbnQtd2VpZ2h0XCI6NDAwLGdyYWRpZW50OjAsaGVpZ2h0OjAsaHJlZjpcImh0dHA6Ly9yYXBoYWVsanMuY29tL1wiLFwibGV0dGVyLXNwYWNpbmdcIjowLG9wYWNpdHk6MSxwYXRoOlwiTTAsMFwiLHI6MCxyeDowLHJ5OjAsc3JjOlwiXCIsc3Ryb2tlOlwiIzAwMFwiLFwic3Ryb2tlLWRhc2hhcnJheVwiOlwiXCIsXCJzdHJva2UtbGluZWNhcFwiOlwiYnV0dFwiLFwic3Ryb2tlLWxpbmVqb2luXCI6XCJidXR0XCIsXCJzdHJva2UtbWl0ZXJsaW1pdFwiOjAsXCJzdHJva2Utb3BhY2l0eVwiOjEsXCJzdHJva2Utd2lkdGhcIjoxLHRhcmdldDpcIl9ibGFua1wiLFwidGV4dC1hbmNob3JcIjpcIm1pZGRsZVwiLHRpdGxlOlwiUmFwaGFlbFwiLHRyYW5zZm9ybTpcIlwiLHdpZHRoOjAseDowLHk6MCxcImNsYXNzXCI6XCJcIn0scHQ9ZS5fYXZhaWxhYmxlQW5pbUF0dHJzPXtibHVyOiQsXCJjbGlwLXJlY3RcIjpcImNzdlwiLGN4OiQsY3k6JCxmaWxsOlwiY29sb3VyXCIsXCJmaWxsLW9wYWNpdHlcIjokLFwiZm9udC1zaXplXCI6JCxoZWlnaHQ6JCxvcGFjaXR5OiQscGF0aDpcInBhdGhcIixyOiQscng6JCxyeTokLHN0cm9rZTpcImNvbG91clwiLFwic3Ryb2tlLW9wYWNpdHlcIjokLFwic3Ryb2tlLXdpZHRoXCI6JCx0cmFuc2Zvcm06XCJ0cmFuc2Zvcm1cIix3aWR0aDokLHg6JCx5OiR9LGR0PS9bXFx4MDlcXHgwYVxceDBiXFx4MGNcXHgwZFxceDIwXFx4YTBcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1MjAyOFxcdTIwMjldL2csZ3Q9L1tcXHgwOVxceDBhXFx4MGJcXHgwY1xceDBkXFx4MjBcXHhhMFxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDBcXHUyMDI4XFx1MjAyOV0qLFtcXHgwOVxceDBhXFx4MGJcXHgwY1xceDBkXFx4MjBcXHhhMFxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDBcXHUyMDI4XFx1MjAyOV0qLyx2dD17aHM6MSxyZzoxfSx4dD0vLD8oW2FjaGxtcXJzdHZ4el0pLD8vZ2kseXQ9LyhbYWNobG1ycXN0dnpdKVtcXHgwOVxceDBhXFx4MGJcXHgwY1xceDBkXFx4MjBcXHhhMFxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDBcXHUyMDI4XFx1MjAyOSxdKigoLT9cXGQqXFwuP1xcZCooPzplW1xcLStdP1xcZCspP1tcXHgwOVxceDBhXFx4MGJcXHgwY1xceDBkXFx4MjBcXHhhMFxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDBcXHUyMDI4XFx1MjAyOV0qLD9bXFx4MDlcXHgwYVxceDBiXFx4MGNcXHgwZFxceDIwXFx4YTBcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1MjAyOFxcdTIwMjldKikrKS9naSxtdD0vKFtyc3RtXSlbXFx4MDlcXHgwYVxceDBiXFx4MGNcXHgwZFxceDIwXFx4YTBcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1MjAyOFxcdTIwMjksXSooKC0/XFxkKlxcLj9cXGQqKD86ZVtcXC0rXT9cXGQrKT9bXFx4MDlcXHgwYVxceDBiXFx4MGNcXHgwZFxceDIwXFx4YTBcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1MjAyOFxcdTIwMjldKiw/W1xceDA5XFx4MGFcXHgwYlxceDBjXFx4MGRcXHgyMFxceGEwXFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMFxcdTIwMjhcXHUyMDI5XSopKykvZ2ksYnQ9LygtP1xcZCpcXC4/XFxkKig/OmVbXFwtK10/XFxkKyk/KVtcXHgwOVxceDBhXFx4MGJcXHgwY1xceDBkXFx4MjBcXHhhMFxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDBcXHUyMDI4XFx1MjAyOV0qLD9bXFx4MDlcXHgwYVxceDBiXFx4MGNcXHgwZFxceDIwXFx4YTBcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1MjAyOFxcdTIwMjldKi9naSxfdD1lLl9yYWRpYWxfZ3JhZGllbnQ9L15yKD86XFwoKFteLF0rPylbXFx4MDlcXHgwYVxceDBiXFx4MGNcXHgwZFxceDIwXFx4YTBcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1MjAyOFxcdTIwMjldKixbXFx4MDlcXHgwYVxceDBiXFx4MGNcXHgwZFxceDIwXFx4YTBcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1MjAyOFxcdTIwMjldKihbXlxcKV0rPylcXCkpPy8sd3Q9e30sa3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5rZXktZS5rZXl9LEJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGh0KHQpLWh0KGUpfSxDdD1mdW5jdGlvbigpe30sU3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LEF0PWUuX3JlY3RQYXRoPWZ1bmN0aW9uKHQsZSxyLGksbil7cmV0dXJuIG4/W1tcIk1cIix0K24sZV0sW1wibFwiLHItMipuLDBdLFtcImFcIixuLG4sMCwwLDEsbixuXSxbXCJsXCIsMCxpLTIqbl0sW1wiYVwiLG4sbiwwLDAsMSwtbixuXSxbXCJsXCIsMipuLXIsMF0sW1wiYVwiLG4sbiwwLDAsMSwtbiwtbl0sW1wibFwiLDAsMipuLWldLFtcImFcIixuLG4sMCwwLDEsbiwtbl0sW1wielwiXV06W1tcIk1cIix0LGVdLFtcImxcIixyLDBdLFtcImxcIiwwLGldLFtcImxcIiwtciwwXSxbXCJ6XCJdXX0sVHQ9ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuIG51bGw9PWkmJihpPXIpLFtbXCJNXCIsdCxlXSxbXCJtXCIsMCwtaV0sW1wiYVwiLHIsaSwwLDEsMSwwLDIqaV0sW1wiYVwiLHIsaSwwLDEsMSwwLC0yKmldLFtcInpcIl1dfSxFdD1lLl9nZXRQYXRoPXtwYXRoOmZ1bmN0aW9uKHQpe3JldHVybiB0LmF0dHIoXCJwYXRoXCIpfSxjaXJjbGU6ZnVuY3Rpb24odCl7dmFyIGU9dC5hdHRycztyZXR1cm4gVHQoZS5jeCxlLmN5LGUucil9LGVsbGlwc2U6ZnVuY3Rpb24odCl7dmFyIGU9dC5hdHRycztyZXR1cm4gVHQoZS5jeCxlLmN5LGUucngsZS5yeSl9LHJlY3Q6ZnVuY3Rpb24odCl7dmFyIGU9dC5hdHRycztyZXR1cm4gQXQoZS54LGUueSxlLndpZHRoLGUuaGVpZ2h0LGUucil9LGltYWdlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuYXR0cnM7cmV0dXJuIEF0KGUueCxlLnksZS53aWR0aCxlLmhlaWdodCl9LHRleHQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5fZ2V0QkJveCgpO3JldHVybiBBdChlLngsZS55LGUud2lkdGgsZS5oZWlnaHQpfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5fZ2V0QkJveCgpO3JldHVybiBBdChlLngsZS55LGUud2lkdGgsZS5oZWlnaHQpfX0sTXQ9ZS5tYXBQYXRoPWZ1bmN0aW9uKHQsZSl7aWYoIWUpcmV0dXJuIHQ7dmFyIHIsaSxuLGEscyxvLGw7Zm9yKHQ9UXQodCksbj0wLHM9dC5sZW5ndGg7bjxzO24rKylmb3IobD10W25dLGE9MSxvPWwubGVuZ3RoO2E8bzthKz0yKXI9ZS54KGxbYV0sbFthKzFdKSxpPWUueShsW2FdLGxbYSsxXSksbFthXT1yLGxbYSsxXT1pO3JldHVybiB0fTtpZihlLl9nPVQsZS50eXBlPVQud2luLlNWR0FuZ2xlfHxULmRvYy5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKFwiaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNCYXNpY1N0cnVjdHVyZVwiLFwiMS4xXCIpP1wiU1ZHXCI6XCJWTUxcIixcIlZNTFwiPT1lLnR5cGUpe3ZhciBOdD1ULmRvYy5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLEx0O2lmKE50LmlubmVySFRNTD0nPHY6c2hhcGUgYWRqPVwiMVwiLz4nLEx0PU50LmZpcnN0Q2hpbGQsTHQuc3R5bGUuYmVoYXZpb3I9XCJ1cmwoI2RlZmF1bHQjVk1MKVwiLCFMdHx8XCJvYmplY3RcIiE9dHlwZW9mIEx0LmFkailyZXR1cm4gZS50eXBlPVI7TnQ9bnVsbH1lLnN2Zz0hKGUudm1sPVwiVk1MXCI9PWUudHlwZSksZS5fUGFwZXI9TSxlLmZuPU49TS5wcm90b3R5cGU9ZS5wcm90b3R5cGUsZS5faWQ9MCxlLmlzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9Ty5jYWxsKGUpLFwiZmluaXRlXCI9PWU/IWF0W0FdKCt0KTpcImFycmF5XCI9PWU/dCBpbnN0YW5jZW9mIEFycmF5OlwibnVsbFwiPT1lJiZudWxsPT09dHx8ZT09dHlwZW9mIHQmJm51bGwhPT10fHxcIm9iamVjdFwiPT1lJiZ0PT09T2JqZWN0KHQpfHxcImFycmF5XCI9PWUmJkFycmF5LmlzQXJyYXkmJkFycmF5LmlzQXJyYXkodCl8fHR0LmNhbGwodCkuc2xpY2UoOCwtMSkudG9Mb3dlckNhc2UoKT09ZX0sZS5hbmdsZT1mdW5jdGlvbih0LHIsaSxuLGEscyl7aWYobnVsbD09YSl7dmFyIG89dC1pLGw9ci1uO3JldHVybiBvfHxsPygxODArMTgwKlkuYXRhbjIoLWwsLW8pL1UrMzYwKSUzNjA6MH1yZXR1cm4gZS5hbmdsZSh0LHIsYSxzKS1lLmFuZ2xlKGksbixhLHMpfSxlLnJhZD1mdW5jdGlvbih0KXtyZXR1cm4gdCUzNjAqVS8xODB9LGUuZGVnPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKDE4MCp0L1UlMzYwKjFlMykvMWUzfSxlLnNuYXBUbz1mdW5jdGlvbih0LHIsaSl7aWYoaT1lLmlzKGksXCJmaW5pdGVcIik/aToxMCxlLmlzKHQsUSkpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKEgodFtuXS1yKTw9aSlyZXR1cm4gdFtuXX1lbHNle3Q9K3Q7dmFyIGE9ciV0O2lmKGE8aSlyZXR1cm4gci1hO2lmKGE+dC1pKXJldHVybiByLWErdH1yZXR1cm4gcn07dmFyIHp0PWUuY3JlYXRlVVVJRD1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVyblwieHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4XCIucmVwbGFjZSh0LGUpLnRvVXBwZXJDYXNlKCl9fSgvW3h5XS9nLGZ1bmN0aW9uKHQpe3ZhciBlPTE2KlkucmFuZG9tKCl8MCxyPVwieFwiPT10P2U6MyZlfDg7cmV0dXJuIHIudG9TdHJpbmcoMTYpfSk7ZS5zZXRXaW5kb3c9ZnVuY3Rpb24ocil7dChcInJhcGhhZWwuc2V0V2luZG93XCIsZSxULndpbixyKSxULndpbj1yLFQuZG9jPVQud2luLmRvY3VtZW50LGUuX2VuZ2luZS5pbml0V2luJiZlLl9lbmdpbmUuaW5pdFdpbihULndpbil9O3ZhciBQdD1mdW5jdGlvbih0KXtpZihlLnZtbCl7dmFyIHI9L15cXHMrfFxccyskL2csaTt0cnl7dmFyIGE9bmV3IEFjdGl2ZVhPYmplY3QoXCJodG1sZmlsZVwiKTthLndyaXRlKFwiPGJvZHk+XCIpLGEuY2xvc2UoKSxpPWEuYm9keX1jYXRjaChzKXtpPWNyZWF0ZVBvcHVwKCkuZG9jdW1lbnQuYm9keX12YXIgbz1pLmNyZWF0ZVRleHRSYW5nZSgpO1B0PW4oZnVuY3Rpb24odCl7dHJ5e2kuc3R5bGUuY29sb3I9SSh0KS5yZXBsYWNlKHIsUik7dmFyIGU9by5xdWVyeUNvbW1hbmRWYWx1ZShcIkZvcmVDb2xvclwiKTtyZXR1cm4gZT0oMjU1JmUpPDwxNnw2NTI4MCZlfCgxNjcxMTY4MCZlKT4+PjE2LFwiI1wiKyhcIjAwMDAwMFwiK2UudG9TdHJpbmcoMTYpKS5zbGljZSgtNil9Y2F0Y2gobil7cmV0dXJuXCJub25lXCJ9fSl9ZWxzZXt2YXIgbD1ULmRvYy5jcmVhdGVFbGVtZW50KFwiaVwiKTtsLnRpdGxlPVwiUmFwaGHDq2wgQ29sb3VyIFBpY2tlclwiLGwuc3R5bGUuZGlzcGxheT1cIm5vbmVcIixULmRvYy5ib2R5LmFwcGVuZENoaWxkKGwpLFB0PW4oZnVuY3Rpb24odCl7cmV0dXJuIGwuc3R5bGUuY29sb3I9dCxULmRvYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGwsUikuZ2V0UHJvcGVydHlWYWx1ZShcImNvbG9yXCIpfSl9cmV0dXJuIFB0KHQpfSxGdD1mdW5jdGlvbigpe3JldHVyblwiaHNiKFwiK1t0aGlzLmgsdGhpcy5zLHRoaXMuYl0rXCIpXCJ9LFJ0PWZ1bmN0aW9uKCl7cmV0dXJuXCJoc2woXCIrW3RoaXMuaCx0aGlzLnMsdGhpcy5sXStcIilcIn0sanQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oZXh9LEl0PWZ1bmN0aW9uKHQscixpKXtpZihudWxsPT1yJiZlLmlzKHQsXCJvYmplY3RcIikmJlwiclwiaW4gdCYmXCJnXCJpbiB0JiZcImJcImluIHQmJihpPXQuYixyPXQuZyx0PXQuciksbnVsbD09ciYmZS5pcyh0LFopKXt2YXIgbj1lLmdldFJHQih0KTt0PW4ucixyPW4uZyxpPW4uYn1yZXR1cm4odD4xfHxyPjF8fGk+MSkmJih0Lz0yNTUsci89MjU1LGkvPTI1NSksW3QscixpXX0scXQ9ZnVuY3Rpb24odCxyLGksbil7dCo9MjU1LHIqPTI1NSxpKj0yNTU7dmFyIGE9e3I6dCxnOnIsYjppLGhleDplLnJnYih0LHIsaSksdG9TdHJpbmc6anR9O3JldHVybiBlLmlzKG4sXCJmaW5pdGVcIikmJihhLm9wYWNpdHk9biksYX07ZS5jb2xvcj1mdW5jdGlvbih0KXt2YXIgcjtyZXR1cm4gZS5pcyh0LFwib2JqZWN0XCIpJiZcImhcImluIHQmJlwic1wiaW4gdCYmXCJiXCJpbiB0PyhyPWUuaHNiMnJnYih0KSx0LnI9ci5yLHQuZz1yLmcsdC5iPXIuYix0LmhleD1yLmhleCk6ZS5pcyh0LFwib2JqZWN0XCIpJiZcImhcImluIHQmJlwic1wiaW4gdCYmXCJsXCJpbiB0PyhyPWUuaHNsMnJnYih0KSx0LnI9ci5yLHQuZz1yLmcsdC5iPXIuYix0LmhleD1yLmhleCk6KGUuaXModCxcInN0cmluZ1wiKSYmKHQ9ZS5nZXRSR0IodCkpLGUuaXModCxcIm9iamVjdFwiKSYmXCJyXCJpbiB0JiZcImdcImluIHQmJlwiYlwiaW4gdD8ocj1lLnJnYjJoc2wodCksdC5oPXIuaCx0LnM9ci5zLHQubD1yLmwscj1lLnJnYjJoc2IodCksdC52PXIuYik6KHQ9e2hleDpcIm5vbmVcIn0sdC5yPXQuZz10LmI9dC5oPXQucz10LnY9dC5sPS0xKSksdC50b1N0cmluZz1qdCx0fSxlLmhzYjJyZ2I9ZnVuY3Rpb24odCxlLHIsaSl7dGhpcy5pcyh0LFwib2JqZWN0XCIpJiZcImhcImluIHQmJlwic1wiaW4gdCYmXCJiXCJpbiB0JiYocj10LmIsZT10LnMsaT10Lm8sdD10LmgpLHQqPTM2MDt2YXIgbixhLHMsbyxsO3JldHVybiB0PXQlMzYwLzYwLGw9ciplLG89bCooMS1IKHQlMi0xKSksbj1hPXM9ci1sLHQ9fn50LG4rPVtsLG8sMCwwLG8sbF1bdF0sYSs9W28sbCxsLG8sMCwwXVt0XSxzKz1bMCwwLG8sbCxsLG9dW3RdLHF0KG4sYSxzLGkpfSxlLmhzbDJyZ2I9ZnVuY3Rpb24odCxlLHIsaSl7dGhpcy5pcyh0LFwib2JqZWN0XCIpJiZcImhcImluIHQmJlwic1wiaW4gdCYmXCJsXCJpbiB0JiYocj10LmwsZT10LnMsdD10LmgpLCh0PjF8fGU+MXx8cj4xKSYmKHQvPTM2MCxlLz0xMDAsci89MTAwKSx0Kj0zNjA7dmFyIG4sYSxzLG8sbDtyZXR1cm4gdD10JTM2MC82MCxsPTIqZSoocjwuNT9yOjEtciksbz1sKigxLUgodCUyLTEpKSxuPWE9cz1yLWwvMix0PX5+dCxuKz1bbCxvLDAsMCxvLGxdW3RdLGErPVtvLGwsbCxvLDAsMF1bdF0scys9WzAsMCxvLGwsbCxvXVt0XSxxdChuLGEscyxpKX0sZS5yZ2IyaHNiPWZ1bmN0aW9uKHQsZSxyKXtyPUl0KHQsZSxyKSx0PXJbMF0sZT1yWzFdLHI9clsyXTt2YXIgaSxuLGEscztyZXR1cm4gYT1XKHQsZSxyKSxzPWEtRyh0LGUsciksaT0wPT1zP251bGw6YT09dD8oZS1yKS9zOmE9PWU/KHItdCkvcysyOih0LWUpL3MrNCxpPShpKzM2MCklNio2MC8zNjAsbj0wPT1zPzA6cy9hLHtoOmksczpuLGI6YSx0b1N0cmluZzpGdH19LGUucmdiMmhzbD1mdW5jdGlvbih0LGUscil7cj1JdCh0LGUsciksdD1yWzBdLGU9clsxXSxyPXJbMl07dmFyIGksbixhLHMsbyxsO3JldHVybiBzPVcodCxlLHIpLG89Ryh0LGUsciksbD1zLW8saT0wPT1sP251bGw6cz09dD8oZS1yKS9sOnM9PWU/KHItdCkvbCsyOih0LWUpL2wrNCxpPShpKzM2MCklNio2MC8zNjAsYT0ocytvKS8yLG49MD09bD8wOmE8LjU/bC8oMiphKTpsLygyLTIqYSkse2g6aSxzOm4sbDphLHRvU3RyaW5nOlJ0fX0sZS5fcGF0aDJzdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qb2luKFwiLFwiKS5yZXBsYWNlKHh0LFwiJDFcIil9O3ZhciBEdD1lLl9wcmVsb2FkPWZ1bmN0aW9uKHQsZSl7dmFyIHI9VC5kb2MuY3JlYXRlRWxlbWVudChcImltZ1wiKTtyLnN0eWxlLmNzc1RleHQ9XCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi05OTk5ZW07dG9wOi05OTk5ZW1cIixyLm9ubG9hZD1mdW5jdGlvbigpe2UuY2FsbCh0aGlzKSx0aGlzLm9ubG9hZD1udWxsLFQuZG9jLmJvZHkucmVtb3ZlQ2hpbGQodGhpcyl9LHIub25lcnJvcj1mdW5jdGlvbigpe1QuZG9jLmJvZHkucmVtb3ZlQ2hpbGQodGhpcyl9LFQuZG9jLmJvZHkuYXBwZW5kQ2hpbGQociksci5zcmM9dH07ZS5nZXRSR0I9bihmdW5jdGlvbih0KXtpZighdHx8KHQ9SSh0KSkuaW5kZXhPZihcIi1cIikrMSlyZXR1cm57cjotMSxnOi0xLGI6LTEsaGV4Olwibm9uZVwiLGVycm9yOjEsdG9TdHJpbmc6YX07aWYoXCJub25lXCI9PXQpcmV0dXJue3I6LTEsZzotMSxiOi0xLGhleDpcIm5vbmVcIix0b1N0cmluZzphfTshKHZ0W0FdKHQudG9Mb3dlckNhc2UoKS5zdWJzdHJpbmcoMCwyKSl8fFwiI1wiPT10LmNoYXJBdCgpKSYmKHQ9UHQodCkpO3ZhciByLGksbixzLG8sbCxoLHU9dC5tYXRjaChudCk7cmV0dXJuIHU/KHVbMl0mJihzPXV0KHVbMl0uc3Vic3RyaW5nKDUpLDE2KSxuPXV0KHVbMl0uc3Vic3RyaW5nKDMsNSksMTYpLGk9dXQodVsyXS5zdWJzdHJpbmcoMSwzKSwxNikpLHVbM10mJihzPXV0KChsPXVbM10uY2hhckF0KDMpKStsLDE2KSxuPXV0KChsPXVbM10uY2hhckF0KDIpKStsLDE2KSxpPXV0KChsPXVbM10uY2hhckF0KDEpKStsLDE2KSksdVs0XSYmKGg9dVs0XVtxXShndCksaT1odChoWzBdKSxcIiVcIj09aFswXS5zbGljZSgtMSkmJihpKj0yLjU1KSxuPWh0KGhbMV0pLFwiJVwiPT1oWzFdLnNsaWNlKC0xKSYmKG4qPTIuNTUpLHM9aHQoaFsyXSksXCIlXCI9PWhbMl0uc2xpY2UoLTEpJiYocyo9Mi41NSksXCJyZ2JhXCI9PXVbMV0udG9Mb3dlckNhc2UoKS5zbGljZSgwLDQpJiYobz1odChoWzNdKSksaFszXSYmXCIlXCI9PWhbM10uc2xpY2UoLTEpJiYoby89MTAwKSksdVs1XT8oaD11WzVdW3FdKGd0KSxpPWh0KGhbMF0pLFwiJVwiPT1oWzBdLnNsaWNlKC0xKSYmKGkqPTIuNTUpLG49aHQoaFsxXSksXCIlXCI9PWhbMV0uc2xpY2UoLTEpJiYobio9Mi41NSkscz1odChoWzJdKSxcIiVcIj09aFsyXS5zbGljZSgtMSkmJihzKj0yLjU1KSwoXCJkZWdcIj09aFswXS5zbGljZSgtMyl8fFwiwrBcIj09aFswXS5zbGljZSgtMSkpJiYoaS89MzYwKSxcImhzYmFcIj09dVsxXS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNCkmJihvPWh0KGhbM10pKSxoWzNdJiZcIiVcIj09aFszXS5zbGljZSgtMSkmJihvLz0xMDApLGUuaHNiMnJnYihpLG4scyxvKSk6dVs2XT8oaD11WzZdW3FdKGd0KSxpPWh0KGhbMF0pLFwiJVwiPT1oWzBdLnNsaWNlKC0xKSYmKGkqPTIuNTUpLG49aHQoaFsxXSksXCIlXCI9PWhbMV0uc2xpY2UoLTEpJiYobio9Mi41NSkscz1odChoWzJdKSxcIiVcIj09aFsyXS5zbGljZSgtMSkmJihzKj0yLjU1KSwoXCJkZWdcIj09aFswXS5zbGljZSgtMyl8fFwiwrBcIj09aFswXS5zbGljZSgtMSkpJiYoaS89MzYwKSxcImhzbGFcIj09dVsxXS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNCkmJihvPWh0KGhbM10pKSxoWzNdJiZcIiVcIj09aFszXS5zbGljZSgtMSkmJihvLz0xMDApLGUuaHNsMnJnYihpLG4scyxvKSk6KHU9e3I6aSxnOm4sYjpzLHRvU3RyaW5nOmF9LHUuaGV4PVwiI1wiKygxNjc3NzIxNnxzfG48PDh8aTw8MTYpLnRvU3RyaW5nKDE2KS5zbGljZSgxKSxlLmlzKG8sXCJmaW5pdGVcIikmJih1Lm9wYWNpdHk9byksdSkpOntyOi0xLGc6LTEsYjotMSxoZXg6XCJub25lXCIsZXJyb3I6MSx0b1N0cmluZzphfX0sZSksZS5oc2I9bihmdW5jdGlvbih0LHIsaSl7cmV0dXJuIGUuaHNiMnJnYih0LHIsaSkuaGV4fSksZS5oc2w9bihmdW5jdGlvbih0LHIsaSl7cmV0dXJuIGUuaHNsMnJnYih0LHIsaSkuaGV4fSksZS5yZ2I9bihmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdCsuNXwwfXJldHVyblwiI1wiKygxNjc3NzIxNnxpKHIpfGkoZSk8PDh8aSh0KTw8MTYpLnRvU3RyaW5nKDE2KS5zbGljZSgxKX0pLGUuZ2V0Q29sb3I9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRDb2xvci5zdGFydD10aGlzLmdldENvbG9yLnN0YXJ0fHx7aDowLHM6MSxiOnR8fC43NX0scj10aGlzLmhzYjJyZ2IoZS5oLGUucyxlLmIpO3JldHVybiBlLmgrPS4wNzUsZS5oPjEmJihlLmg9MCxlLnMtPS4yLGUuczw9MCYmKHRoaXMuZ2V0Q29sb3Iuc3RhcnQ9e2g6MCxzOjEsYjplLmJ9KSksci5oZXh9LGUuZ2V0Q29sb3IucmVzZXQ9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5zdGFydH0sZS5wYXJzZVBhdGhTdHJpbmc9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIHI9VnQodCk7aWYoci5hcnIpcmV0dXJuIFl0KHIuYXJyKTt2YXIgaT17YTo3LGM6NixoOjEsbDoyLG06MixyOjQscTo0LHM6NCx0OjIsdjoxLHo6MH0sbj1bXTtyZXR1cm4gZS5pcyh0LFEpJiZlLmlzKHRbMF0sUSkmJihuPVl0KHQpKSxuLmxlbmd0aHx8SSh0KS5yZXBsYWNlKHl0LGZ1bmN0aW9uKHQsZSxyKXt2YXIgYT1bXSxzPWUudG9Mb3dlckNhc2UoKTtpZihyLnJlcGxhY2UoYnQsZnVuY3Rpb24odCxlKXtlJiZhLnB1c2goK2UpfSksXCJtXCI9PXMmJmEubGVuZ3RoPjImJihuLnB1c2goW2VdW1BdKGEuc3BsaWNlKDAsMikpKSxzPVwibFwiLGU9XCJtXCI9PWU/XCJsXCI6XCJMXCIpLFwiclwiPT1zKW4ucHVzaChbZV1bUF0oYSkpO2Vsc2UgZm9yKDthLmxlbmd0aD49aVtzXSYmKG4ucHVzaChbZV1bUF0oYS5zcGxpY2UoMCxpW3NdKSkpLGlbc10pOyk7fSksbi50b1N0cmluZz1lLl9wYXRoMnN0cmluZyxyLmFycj1ZdChuKSxufSxlLnBhcnNlVHJhbnNmb3JtU3RyaW5nPW4oZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIHI9e3I6MyxzOjQsdDoyLG06Nn0saT1bXTtyZXR1cm4gZS5pcyh0LFEpJiZlLmlzKHRbMF0sUSkmJihpPVl0KHQpKSxpLmxlbmd0aHx8SSh0KS5yZXBsYWNlKG10LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1bXSxhPU8uY2FsbChlKTtyLnJlcGxhY2UoYnQsZnVuY3Rpb24odCxlKXtlJiZuLnB1c2goK2UpfSksaS5wdXNoKFtlXVtQXShuKSl9KSxpLnRvU3RyaW5nPWUuX3BhdGgyc3RyaW5nLGl9KTt2YXIgVnQ9ZnVuY3Rpb24odCl7dmFyIGU9VnQucHM9VnQucHN8fHt9O3JldHVybiBlW3RdP2VbdF0uc2xlZXA9MTAwOmVbdF09e3NsZWVwOjEwMH0sc2V0VGltZW91dChmdW5jdGlvbigpe2Zvcih2YXIgciBpbiBlKWVbQV0ocikmJnIhPXQmJihlW3JdLnNsZWVwLS0sIWVbcl0uc2xlZXAmJmRlbGV0ZSBlW3JdKX0pLGVbdF19O2UuZmluZERvdHNBdFNlZ21lbnQ9ZnVuY3Rpb24odCxlLHIsaSxuLGEscyxvLGwpe3ZhciBoPTEtbCx1PVgoaCwzKSxjPVgoaCwyKSxmPWwqbCxwPWYqbCxkPXUqdCszKmMqbCpyKzMqaCpsKmwqbitwKnMsZz11KmUrMypjKmwqaSszKmgqbCpsKmErcCpvLHY9dCsyKmwqKHItdCkrZioobi0yKnIrdCkseD1lKzIqbCooaS1lKStmKihhLTIqaStlKSx5PXIrMipsKihuLXIpK2YqKHMtMipuK3IpLG09aSsyKmwqKGEtaSkrZiooby0yKmEraSksYj1oKnQrbCpyLF89aCplK2wqaSx3PWgqbitsKnMsaz1oKmErbCpvLEI9OTAtMTgwKlkuYXRhbjIodi15LHgtbSkvVTtyZXR1cm4odj55fHx4PG0pJiYoQis9MTgwKSx7eDpkLHk6ZyxtOnt4OnYseTp4fSxuOnt4OnkseTptfSxzdGFydDp7eDpiLHk6X30sZW5kOnt4OncseTprfSxhbHBoYTpCfX0sZS5iZXppZXJCQm94PWZ1bmN0aW9uKHQscixpLG4sYSxzLG8sbCl7ZS5pcyh0LFwiYXJyYXlcIil8fCh0PVt0LHIsaSxuLGEscyxvLGxdKTt2YXIgaD1adC5hcHBseShudWxsLHQpO3JldHVybnt4OmgubWluLngseTpoLm1pbi55LHgyOmgubWF4LngseTI6aC5tYXgueSx3aWR0aDpoLm1heC54LWgubWluLngsaGVpZ2h0OmgubWF4LnktaC5taW4ueX19LGUuaXNQb2ludEluc2lkZUJCb3g9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBlPj10LngmJmU8PXQueDImJnI+PXQueSYmcjw9dC55Mn0sZS5pc0JCb3hJbnRlcnNlY3Q9ZnVuY3Rpb24odCxyKXt2YXIgaT1lLmlzUG9pbnRJbnNpZGVCQm94O3JldHVybiBpKHIsdC54LHQueSl8fGkocix0LngyLHQueSl8fGkocix0LngsdC55Mil8fGkocix0LngyLHQueTIpfHxpKHQsci54LHIueSl8fGkodCxyLngyLHIueSl8fGkodCxyLngsci55Mil8fGkodCxyLngyLHIueTIpfHwodC54PHIueDImJnQueD5yLnh8fHIueDx0LngyJiZyLng+dC54KSYmKHQueTxyLnkyJiZ0Lnk+ci55fHxyLnk8dC55MiYmci55PnQueSl9LGUucGF0aEludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiBkKHQsZSl9LGUucGF0aEludGVyc2VjdGlvbk51bWJlcj1mdW5jdGlvbih0LGUpe3JldHVybiBkKHQsZSwxKX0sZS5pc1BvaW50SW5zaWRlUGF0aD1mdW5jdGlvbih0LHIsaSl7dmFyIG49ZS5wYXRoQkJveCh0KTtyZXR1cm4gZS5pc1BvaW50SW5zaWRlQkJveChuLHIsaSkmJmQodCxbW1wiTVwiLHIsaV0sW1wiSFwiLG4ueDIrMTBdXSwxKSUyPT0xfSxlLl9yZW1vdmVkRmFjdG9yeT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0KFwicmFwaGFlbC5sb2dcIixudWxsLFwiUmFwaGHDq2w6IHlvdSBhcmUgY2FsbGluZyB0byBtZXRob2Qg4oCcXCIrZStcIuKAnSBvZiByZW1vdmVkIG9iamVjdFwiLGUpfX07dmFyIE90PWUucGF0aEJCb3g9ZnVuY3Rpb24odCl7dmFyIGU9VnQodCk7aWYoZS5iYm94KXJldHVybiByKGUuYmJveCk7aWYoIXQpcmV0dXJue3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MCx4MjowLHkyOjB9O3Q9UXQodCk7Zm9yKHZhciBpPTAsbj0wLGE9W10scz1bXSxvLGw9MCxoPXQubGVuZ3RoO2w8aDtsKyspaWYobz10W2xdLFwiTVwiPT1vWzBdKWk9b1sxXSxuPW9bMl0sYS5wdXNoKGkpLHMucHVzaChuKTtlbHNle3ZhciB1PVp0KGksbixvWzFdLG9bMl0sb1szXSxvWzRdLG9bNV0sb1s2XSk7YT1hW1BdKHUubWluLngsdS5tYXgueCkscz1zW1BdKHUubWluLnksdS5tYXgueSksaT1vWzVdLG49b1s2XX12YXIgYz1HW3pdKDAsYSksZj1HW3pdKDAscykscD1XW3pdKDAsYSksZD1XW3pdKDAscyksZz1wLWMsdj1kLWYseD17eDpjLHk6Zix4MjpwLHkyOmQsd2lkdGg6ZyxoZWlnaHQ6dixjeDpjK2cvMixjeTpmK3YvMn07cmV0dXJuIGUuYmJveD1yKHgpLHh9LFl0PWZ1bmN0aW9uKHQpe3ZhciBpPXIodCk7cmV0dXJuIGkudG9TdHJpbmc9ZS5fcGF0aDJzdHJpbmcsaX0sV3Q9ZS5fcGF0aFRvUmVsYXRpdmU9ZnVuY3Rpb24odCl7dmFyIHI9VnQodCk7aWYoci5yZWwpcmV0dXJuIFl0KHIucmVsKTtlLmlzKHQsUSkmJmUuaXModCYmdFswXSxRKXx8KHQ9ZS5wYXJzZVBhdGhTdHJpbmcodCkpO3ZhciBpPVtdLG49MCxhPTAscz0wLG89MCxsPTA7XCJNXCI9PXRbMF1bMF0mJihuPXRbMF1bMV0sYT10WzBdWzJdLHM9bixvPWEsbCsrLGkucHVzaChbXCJNXCIsbixhXSkpO2Zvcih2YXIgaD1sLHU9dC5sZW5ndGg7aDx1O2grKyl7dmFyIGM9aVtoXT1bXSxmPXRbaF07aWYoZlswXSE9Ty5jYWxsKGZbMF0pKXN3aXRjaChjWzBdPU8uY2FsbChmWzBdKSxjWzBdKXtjYXNlXCJhXCI6Y1sxXT1mWzFdLGNbMl09ZlsyXSxjWzNdPWZbM10sY1s0XT1mWzRdLGNbNV09Zls1XSxjWzZdPSsoZls2XS1uKS50b0ZpeGVkKDMpLGNbN109KyhmWzddLWEpLnRvRml4ZWQoMyk7YnJlYWs7Y2FzZVwidlwiOmNbMV09KyhmWzFdLWEpLnRvRml4ZWQoMyk7YnJlYWs7Y2FzZVwibVwiOnM9ZlsxXSxvPWZbMl07ZGVmYXVsdDpmb3IodmFyIHA9MSxkPWYubGVuZ3RoO3A8ZDtwKyspY1twXT0rKGZbcF0tKHAlMj9uOmEpKS50b0ZpeGVkKDMpfWVsc2V7Yz1pW2hdPVtdLFwibVwiPT1mWzBdJiYocz1mWzFdK24sbz1mWzJdK2EpO2Zvcih2YXIgZz0wLHY9Zi5sZW5ndGg7Zzx2O2crKylpW2hdW2ddPWZbZ119dmFyIHg9aVtoXS5sZW5ndGg7c3dpdGNoKGlbaF1bMF0pe2Nhc2VcInpcIjpuPXMsYT1vO2JyZWFrO2Nhc2VcImhcIjpuKz0raVtoXVt4LTFdO2JyZWFrO2Nhc2VcInZcIjphKz0raVtoXVt4LTFdO2JyZWFrO2RlZmF1bHQ6bis9K2lbaF1beC0yXSxhKz0raVtoXVt4LTFdfX1yZXR1cm4gaS50b1N0cmluZz1lLl9wYXRoMnN0cmluZyxyLnJlbD1ZdChpKSxpfSxHdD1lLl9wYXRoVG9BYnNvbHV0ZT1mdW5jdGlvbih0KXt2YXIgcj1WdCh0KTtpZihyLmFicylyZXR1cm4gWXQoci5hYnMpO2lmKGUuaXModCxRKSYmZS5pcyh0JiZ0WzBdLFEpfHwodD1lLnBhcnNlUGF0aFN0cmluZyh0KSksIXR8fCF0Lmxlbmd0aClyZXR1cm5bW1wiTVwiLDAsMF1dO3ZhciBpPVtdLG49MCxhPTAsbz0wLGw9MCxoPTA7XCJNXCI9PXRbMF1bMF0mJihuPSt0WzBdWzFdLGE9K3RbMF1bMl0sbz1uLGw9YSxoKyssaVswXT1bXCJNXCIsbixhXSk7Zm9yKHZhciB1PTM9PXQubGVuZ3RoJiZcIk1cIj09dFswXVswXSYmXCJSXCI9PXRbMV1bMF0udG9VcHBlckNhc2UoKSYmXCJaXCI9PXRbMl1bMF0udG9VcHBlckNhc2UoKSxjLGYscD1oLGQ9dC5sZW5ndGg7cDxkO3ArKyl7aWYoaS5wdXNoKGM9W10pLGY9dFtwXSxmWzBdIT1jdC5jYWxsKGZbMF0pKXN3aXRjaChjWzBdPWN0LmNhbGwoZlswXSksY1swXSl7Y2FzZVwiQVwiOmNbMV09ZlsxXSxjWzJdPWZbMl0sY1szXT1mWzNdLGNbNF09Zls0XSxjWzVdPWZbNV0sY1s2XT0rKGZbNl0rbiksY1s3XT0rKGZbN10rYSk7YnJlYWs7Y2FzZVwiVlwiOmNbMV09K2ZbMV0rYTticmVhaztjYXNlXCJIXCI6Y1sxXT0rZlsxXStuO2JyZWFrO2Nhc2VcIlJcIjpmb3IodmFyIGc9W24sYV1bUF0oZi5zbGljZSgxKSksdj0yLHg9Zy5sZW5ndGg7djx4O3YrKylnW3ZdPStnW3ZdK24sZ1srK3ZdPStnW3ZdK2E7aS5wb3AoKSxpPWlbUF0ocyhnLHUpKTticmVhaztjYXNlXCJNXCI6bz0rZlsxXStuLGw9K2ZbMl0rYTtkZWZhdWx0OmZvcih2PTEseD1mLmxlbmd0aDt2PHg7disrKWNbdl09K2Zbdl0rKHYlMj9uOmEpfWVsc2UgaWYoXCJSXCI9PWZbMF0pZz1bbixhXVtQXShmLnNsaWNlKDEpKSxpLnBvcCgpLGk9aVtQXShzKGcsdSkpLGM9W1wiUlwiXVtQXShmLnNsaWNlKC0yKSk7ZWxzZSBmb3IodmFyIHk9MCxtPWYubGVuZ3RoO3k8bTt5KyspY1t5XT1mW3ldO3N3aXRjaChjWzBdKXtjYXNlXCJaXCI6bj1vLGE9bDticmVhaztjYXNlXCJIXCI6bj1jWzFdO2JyZWFrO2Nhc2VcIlZcIjphPWNbMV07YnJlYWs7Y2FzZVwiTVwiOm89Y1tjLmxlbmd0aC0yXSxsPWNbYy5sZW5ndGgtMV07ZGVmYXVsdDpuPWNbYy5sZW5ndGgtMl0sYT1jW2MubGVuZ3RoLTFdfX1yZXR1cm4gaS50b1N0cmluZz1lLl9wYXRoMnN0cmluZyxyLmFicz1ZdChpKSxpfSxIdD1mdW5jdGlvbih0LGUscixpKXtyZXR1cm5bdCxlLHIsaSxyLGldfSxYdD1mdW5jdGlvbih0LGUscixpLG4sYSl7dmFyIHM9MS8zLG89Mi8zO3JldHVybltzKnQrbypyLHMqZStvKmkscypuK28qcixzKmErbyppLG4sYV19LFV0PWZ1bmN0aW9uKHQsZSxyLGksYSxzLG8sbCxoLHUpe3ZhciBjPTEyMCpVLzE4MCxmPVUvMTgwKigrYXx8MCkscD1bXSxkLGc9bihmdW5jdGlvbih0LGUscil7dmFyIGk9dCpZLmNvcyhyKS1lKlkuc2luKHIpLG49dCpZLnNpbihyKStlKlkuY29zKHIpO3JldHVybnt4OmkseTpufX0pO2lmKHUpUz11WzBdLEE9dVsxXSxCPXVbMl0sQz11WzNdO2Vsc2V7ZD1nKHQsZSwtZiksdD1kLngsZT1kLnksZD1nKGwsaCwtZiksbD1kLngsaD1kLnk7dmFyIHY9WS5jb3MoVS8xODAqYSkseD1ZLnNpbihVLzE4MCphKSx5PSh0LWwpLzIsbT0oZS1oKS8yLGI9eSp5LyhyKnIpK20qbS8oaSppKTtiPjEmJihiPVkuc3FydChiKSxyPWIqcixpPWIqaSk7dmFyIF89cipyLHc9aSppLGs9KHM9PW8/LTE6MSkqWS5zcXJ0KEgoKF8qdy1fKm0qbS13KnkqeSkvKF8qbSptK3cqeSp5KSkpLEI9aypyKm0vaSsodCtsKS8yLEM9ayotaSp5L3IrKGUraCkvMixTPVkuYXNpbigoKGUtQykvaSkudG9GaXhlZCg5KSksQT1ZLmFzaW4oKChoLUMpL2kpLnRvRml4ZWQoOSkpO1M9dDxCP1UtUzpTLEE9bDxCP1UtQTpBLFM8MCYmKFM9MipVK1MpLEE8MCYmKEE9MipVK0EpLG8mJlM+QSYmKFMtPTIqVSksIW8mJkE+UyYmKEEtPTIqVSl9dmFyIFQ9QS1TO2lmKEgoVCk+Yyl7dmFyIEU9QSxNPWwsTj1oO0E9UytjKihvJiZBPlM/MTotMSksbD1CK3IqWS5jb3MoQSksaD1DK2kqWS5zaW4oQSkscD1VdChsLGgscixpLGEsMCxvLE0sTixbQSxFLEIsQ10pfVQ9QS1TO3ZhciBMPVkuY29zKFMpLHo9WS5zaW4oUyksRj1ZLmNvcyhBKSxSPVkuc2luKEEpLGo9WS50YW4oVC80KSxJPTQvMypyKmosRD00LzMqaSpqLFY9W3QsZV0sTz1bdCtJKnosZS1EKkxdLFc9W2wrSSpSLGgtRCpGXSxHPVtsLGhdO2lmKE9bMF09MipWWzBdLU9bMF0sT1sxXT0yKlZbMV0tT1sxXSx1KXJldHVybltPLFcsR11bUF0ocCk7cD1bTyxXLEddW1BdKHApLmpvaW4oKVtxXShcIixcIik7Zm9yKHZhciBYPVtdLCQ9MCxaPXAubGVuZ3RoOyQ8WjskKyspWFskXT0kJTI/ZyhwWyQtMV0scFskXSxmKS55OmcocFskXSxwWyQrMV0sZikueDtyZXR1cm4gWH0sJHQ9ZnVuY3Rpb24odCxlLHIsaSxuLGEscyxvLGwpe3ZhciBoPTEtbDtyZXR1cm57eDpYKGgsMykqdCszKlgoaCwyKSpsKnIrMypoKmwqbCpuK1gobCwzKSpzLHk6WChoLDMpKmUrMypYKGgsMikqbCppKzMqaCpsKmwqYStYKGwsMykqb319LFp0PW4oZnVuY3Rpb24odCxlLHIsaSxuLGEscyxvKXt2YXIgbD1uLTIqcit0LShzLTIqbityKSxoPTIqKHItdCktMioobi1yKSx1PXQtcixjPSgtaCtZLnNxcnQoaCpoLTQqbCp1KSkvMi9sLGY9KC1oLVkuc3FydChoKmgtNCpsKnUpKS8yL2wscD1bZSxvXSxkPVt0LHNdLGc7cmV0dXJuIEgoYyk+XCIxZTEyXCImJihjPS41KSxIKGYpPlwiMWUxMlwiJiYoZj0uNSksYz4wJiZjPDEmJihnPSR0KHQsZSxyLGksbixhLHMsbyxjKSxkLnB1c2goZy54KSxwLnB1c2goZy55KSksZj4wJiZmPDEmJihnPSR0KHQsZSxyLGksbixhLHMsbyxmKSxkLnB1c2goZy54KSxwLnB1c2goZy55KSksbD1hLTIqaStlLShvLTIqYStpKSxoPTIqKGktZSktMiooYS1pKSx1PWUtaSxjPSgtaCtZLnNxcnQoaCpoLTQqbCp1KSkvMi9sLGY9KC1oLVkuc3FydChoKmgtNCpsKnUpKS8yL2wsSChjKT5cIjFlMTJcIiYmKGM9LjUpLEgoZik+XCIxZTEyXCImJihmPS41KSxjPjAmJmM8MSYmKGc9JHQodCxlLHIsaSxuLGEscyxvLGMpLGQucHVzaChnLngpLHAucHVzaChnLnkpKSxmPjAmJmY8MSYmKGc9JHQodCxlLHIsaSxuLGEscyxvLGYpLGQucHVzaChnLngpLHAucHVzaChnLnkpKSx7bWluOnt4Okdbel0oMCxkKSx5Okdbel0oMCxwKX0sbWF4Ont4Oldbel0oMCxkKSx5Oldbel0oMCxwKX19fSksUXQ9ZS5fcGF0aDJjdXJ2ZT1uKGZ1bmN0aW9uKHQsZSl7dmFyIHI9IWUmJlZ0KHQpO2lmKCFlJiZyLmN1cnZlKXJldHVybiBZdChyLmN1cnZlKTtmb3IodmFyIGk9R3QodCksbj1lJiZHdChlKSxhPXt4OjAseTowLGJ4OjAsYnk6MCxYOjAsWTowLHF4Om51bGwscXk6bnVsbH0scz17eDowLHk6MCxieDowLGJ5OjAsWDowLFk6MCxxeDpudWxsLHF5Om51bGx9LG89KGZ1bmN0aW9uKHQsZSxyKXt2YXIgaSxuLGE9e1Q6MSxROjF9O2lmKCF0KXJldHVybltcIkNcIixlLngsZS55LGUueCxlLnksZS54LGUueV07c3dpdGNoKCEodFswXWluIGEpJiYoZS5xeD1lLnF5PW51bGwpLHRbMF0pe2Nhc2VcIk1cIjplLlg9dFsxXSxlLlk9dFsyXTticmVhaztjYXNlXCJBXCI6dD1bXCJDXCJdW1BdKFV0W3pdKDAsW2UueCxlLnldW1BdKHQuc2xpY2UoMSkpKSk7YnJlYWs7Y2FzZVwiU1wiOlwiQ1wiPT1yfHxcIlNcIj09cj8oaT0yKmUueC1lLmJ4LG49MiplLnktZS5ieSk6KGk9ZS54LG49ZS55KSx0PVtcIkNcIixpLG5dW1BdKHQuc2xpY2UoMSkpO2JyZWFrO2Nhc2VcIlRcIjpcIlFcIj09cnx8XCJUXCI9PXI/KGUucXg9MiplLngtZS5xeCxlLnF5PTIqZS55LWUucXkpOihlLnF4PWUueCxlLnF5PWUueSksdD1bXCJDXCJdW1BdKFh0KGUueCxlLnksZS5xeCxlLnF5LHRbMV0sdFsyXSkpO2JyZWFrO2Nhc2VcIlFcIjplLnF4PXRbMV0sZS5xeT10WzJdLHQ9W1wiQ1wiXVtQXShYdChlLngsZS55LHRbMV0sdFsyXSx0WzNdLHRbNF0pKTticmVhaztjYXNlXCJMXCI6dD1bXCJDXCJdW1BdKEh0KGUueCxlLnksdFsxXSx0WzJdKSk7YnJlYWs7Y2FzZVwiSFwiOnQ9W1wiQ1wiXVtQXShIdChlLngsZS55LHRbMV0sZS55KSk7YnJlYWs7Y2FzZVwiVlwiOnQ9W1wiQ1wiXVtQXShIdChlLngsZS55LGUueCx0WzFdKSk7YnJlYWs7Y2FzZVwiWlwiOnQ9W1wiQ1wiXVtQXShIdChlLngsZS55LGUuWCxlLlkpKX1yZXR1cm4gdH0pLGw9ZnVuY3Rpb24odCxlKXtpZih0W2VdLmxlbmd0aD43KXt0W2VdLnNoaWZ0KCk7Zm9yKHZhciByPXRbZV07ci5sZW5ndGg7KXVbZV09XCJBXCIsbiYmKGNbZV09XCJBXCIpLHQuc3BsaWNlKGUrKywwLFtcIkNcIl1bUF0oci5zcGxpY2UoMCw2KSkpO3Quc3BsaWNlKGUsMSksZz1XKGkubGVuZ3RoLG4mJm4ubGVuZ3RofHwwKX19LGg9ZnVuY3Rpb24odCxlLHIsYSxzKXt0JiZlJiZcIk1cIj09dFtzXVswXSYmXCJNXCIhPWVbc11bMF0mJihlLnNwbGljZShzLDAsW1wiTVwiLGEueCxhLnldKSxyLmJ4PTAsci5ieT0wLHIueD10W3NdWzFdLHIueT10W3NdWzJdLGc9VyhpLmxlbmd0aCxuJiZuLmxlbmd0aHx8MCkpfSx1PVtdLGM9W10sZj1cIlwiLHA9XCJcIixkPTAsZz1XKGkubGVuZ3RoLG4mJm4ubGVuZ3RofHwwKTtkPGc7ZCsrKXtpW2RdJiYoZj1pW2RdWzBdKSxcIkNcIiE9ZiYmKHVbZF09ZixkJiYocD11W2QtMV0pKSxpW2RdPW8oaVtkXSxhLHApLFwiQVwiIT11W2RdJiZcIkNcIj09ZiYmKHVbZF09XCJDXCIpLGwoaSxkKSxuJiYobltkXSYmKGY9bltkXVswXSksXCJDXCIhPWYmJihjW2RdPWYsZCYmKHA9Y1tkLTFdKSksbltkXT1vKG5bZF0scyxwKSxcIkFcIiE9Y1tkXSYmXCJDXCI9PWYmJihjW2RdPVwiQ1wiKSxsKG4sZCkpLGgoaSxuLGEscyxkKSxoKG4saSxzLGEsZCk7dmFyIHY9aVtkXSx4PW4mJm5bZF0seT12Lmxlbmd0aCxtPW4mJngubGVuZ3RoO2EueD12W3ktMl0sYS55PXZbeS0xXSxhLmJ4PWh0KHZbeS00XSl8fGEueCxhLmJ5PWh0KHZbeS0zXSl8fGEueSxzLmJ4PW4mJihodCh4W20tNF0pfHxzLngpLHMuYnk9biYmKGh0KHhbbS0zXSl8fHMueSkscy54PW4mJnhbbS0yXSxzLnk9biYmeFttLTFdfXJldHVybiBufHwoci5jdXJ2ZT1ZdChpKSksbj9baSxuXTppfSxudWxsLFl0KSxKdD1lLl9wYXJzZURvdHM9bihmdW5jdGlvbih0KXtmb3IodmFyIHI9W10saT0wLG49dC5sZW5ndGg7aTxuO2krKyl7dmFyIGE9e30scz10W2ldLm1hdGNoKC9eKFteOl0qKTo/KFtcXGRcXC5dKikvKTtpZihhLmNvbG9yPWUuZ2V0UkdCKHNbMV0pLGEuY29sb3IuZXJyb3IpcmV0dXJuIG51bGw7YS5vcGFjaXR5PWEuY29sb3Iub3BhY2l0eSxhLmNvbG9yPWEuY29sb3IuaGV4LHNbMl0mJihhLm9mZnNldD1zWzJdK1wiJVwiKSxyLnB1c2goYSl9Zm9yKGk9MSxuPXIubGVuZ3RoLTE7aTxuO2krKylpZighcltpXS5vZmZzZXQpe2Zvcih2YXIgbz1odChyW2ktMV0ub2Zmc2V0fHwwKSxsPTAsaD1pKzE7aDxuO2grKylpZihyW2hdLm9mZnNldCl7bD1yW2hdLm9mZnNldDticmVha31sfHwobD0xMDAsaD1uKSxsPWh0KGwpO2Zvcih2YXIgdT0obC1vKS8oaC1pKzEpO2k8aDtpKyspbys9dSxyW2ldLm9mZnNldD1vK1wiJVwifXJldHVybiByfSksS3Q9ZS5fdGVhcj1mdW5jdGlvbih0LGUpe3Q9PWUudG9wJiYoZS50b3A9dC5wcmV2KSx0PT1lLmJvdHRvbSYmKGUuYm90dG9tPXQubmV4dCksdC5uZXh0JiYodC5uZXh0LnByZXY9dC5wcmV2KSx0LnByZXYmJih0LnByZXYubmV4dD10Lm5leHQpfSx0ZT1lLl90b2Zyb250PWZ1bmN0aW9uKHQsZSl7ZS50b3AhPT10JiYoS3QodCxlKSx0Lm5leHQ9bnVsbCx0LnByZXY9ZS50b3AsZS50b3AubmV4dD10LGUudG9wPXQpfSxlZT1lLl90b2JhY2s9ZnVuY3Rpb24odCxlKXtlLmJvdHRvbSE9PXQmJihLdCh0LGUpLHQubmV4dD1lLmJvdHRvbSx0LnByZXY9bnVsbCxlLmJvdHRvbS5wcmV2PXQsZS5ib3R0b209dCl9LHJlPWUuX2luc2VydGFmdGVyPWZ1bmN0aW9uKHQsZSxyKXtLdCh0LHIpLGU9PXIudG9wJiYoci50b3A9dCksZS5uZXh0JiYoZS5uZXh0LnByZXY9dCksdC5uZXh0PWUubmV4dCx0LnByZXY9ZSxlLm5leHQ9dH0saWU9ZS5faW5zZXJ0YmVmb3JlPWZ1bmN0aW9uKHQsZSxyKXtLdCh0LHIpLGU9PXIuYm90dG9tJiYoci5ib3R0b209dCksZS5wcmV2JiYoZS5wcmV2Lm5leHQ9dCksdC5wcmV2PWUucHJldixlLnByZXY9dCx0Lm5leHQ9ZX0sbmU9ZS50b01hdHJpeD1mdW5jdGlvbih0LGUpe3ZhciByPU90KHQpLGk9e186e3RyYW5zZm9ybTpSfSxnZXRCQm94OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9fTtyZXR1cm4gc2UoaSxlKSxpLm1hdHJpeH0sYWU9ZS50cmFuc2Zvcm1QYXRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE10KHQsbmUodCxlKSl9LHNlPWUuX2V4dHJhY3RUcmFuc2Zvcm09ZnVuY3Rpb24odCxyKXtpZihudWxsPT1yKXJldHVybiB0Ll8udHJhbnNmb3JtO3I9SShyKS5yZXBsYWNlKC9cXC57M318XFx1MjAyNi9nLHQuXy50cmFuc2Zvcm18fFIpO3ZhciBpPWUucGFyc2VUcmFuc2Zvcm1TdHJpbmcociksbj0wLGE9MCxzPTAsbz0xLGw9MSxoPXQuXyx1PW5ldyBnO2lmKGgudHJhbnNmb3JtPWl8fFtdLGkpZm9yKHZhciBjPTAsZj1pLmxlbmd0aDtjPGY7YysrKXt2YXIgcD1pW2NdLGQ9cC5sZW5ndGgsdj1JKHBbMF0pLnRvTG93ZXJDYXNlKCkseD1wWzBdIT12LHk9eD91LmludmVydCgpOjAsbSxiLF8sdyxrO1widFwiPT12JiYzPT1kP3g/KG09eS54KDAsMCksYj15LnkoMCwwKSxfPXkueChwWzFdLHBbMl0pLHc9eS55KHBbMV0scFsyXSksdS50cmFuc2xhdGUoXy1tLHctYikpOnUudHJhbnNsYXRlKHBbMV0scFsyXSk6XCJyXCI9PXY/Mj09ZD8oaz1rfHx0LmdldEJCb3goMSksdS5yb3RhdGUocFsxXSxrLngray53aWR0aC8yLGsueStrLmhlaWdodC8yKSxuKz1wWzFdKTo0PT1kJiYoeD8oXz15LngocFsyXSxwWzNdKSx3PXkueShwWzJdLHBbM10pLHUucm90YXRlKHBbMV0sXyx3KSk6dS5yb3RhdGUocFsxXSxwWzJdLHBbM10pLG4rPXBbMV0pOlwic1wiPT12PzI9PWR8fDM9PWQ/KGs9a3x8dC5nZXRCQm94KDEpLHUuc2NhbGUocFsxXSxwW2QtMV0say54K2sud2lkdGgvMixrLnkray5oZWlnaHQvMiksbyo9cFsxXSxsKj1wW2QtMV0pOjU9PWQmJih4PyhfPXkueChwWzNdLHBbNF0pLHc9eS55KHBbM10scFs0XSksdS5zY2FsZShwWzFdLHBbMl0sXyx3KSk6dS5zY2FsZShwWzFdLHBbMl0scFszXSxwWzRdKSxvKj1wWzFdLGwqPXBbMl0pOlwibVwiPT12JiY3PT1kJiZ1LmFkZChwWzFdLHBbMl0scFszXSxwWzRdLHBbNV0scFs2XSksaC5kaXJ0eVQ9MSx0Lm1hdHJpeD11fXQubWF0cml4PXUsaC5zeD1vLGguc3k9bCxoLmRlZz1uLGguZHg9YT11LmUsaC5keT1zPXUuZiwxPT1vJiYxPT1sJiYhbiYmaC5iYm94PyhoLmJib3gueCs9K2EsaC5iYm94LnkrPStzKTpoLmRpcnR5VD0xfSxvZT1mdW5jdGlvbih0KXt2YXIgZT10WzBdO3N3aXRjaChlLnRvTG93ZXJDYXNlKCkpe2Nhc2VcInRcIjpyZXR1cm5bZSwwLDBdO2Nhc2VcIm1cIjpyZXR1cm5bZSwxLDAsMCwxLDAsMF07Y2FzZVwiclwiOnJldHVybiA0PT10Lmxlbmd0aD9bZSwwLHRbMl0sdFszXV06W2UsMF07Y2FzZVwic1wiOnJldHVybiA1PT10Lmxlbmd0aD9bZSwxLDEsdFszXSx0WzRdXTozPT10Lmxlbmd0aD9bZSwxLDFdOltlLDFdfX0sbGU9ZS5fZXF1YWxpc2VUcmFuc2Zvcm09ZnVuY3Rpb24odCxyKXtyPUkocikucmVwbGFjZSgvXFwuezN9fFxcdTIwMjYvZyx0KSx0PWUucGFyc2VUcmFuc2Zvcm1TdHJpbmcodCl8fFtdLHI9ZS5wYXJzZVRyYW5zZm9ybVN0cmluZyhyKXx8W107Zm9yKHZhciBpPVcodC5sZW5ndGgsci5sZW5ndGgpLG49W10sYT1bXSxzPTAsbyxsLGgsdTtzPGk7cysrKXtpZihoPXRbc118fG9lKHJbc10pLHU9cltzXXx8b2UoaCksaFswXSE9dVswXXx8XCJyXCI9PWhbMF0udG9Mb3dlckNhc2UoKSYmKGhbMl0hPXVbMl18fGhbM10hPXVbM10pfHxcInNcIj09aFswXS50b0xvd2VyQ2FzZSgpJiYoaFszXSE9dVszXXx8aFs0XSE9dVs0XSkpcmV0dXJuO2ZvcihuW3NdPVtdLGFbc109W10sbz0wLGw9VyhoLmxlbmd0aCx1Lmxlbmd0aCk7bzxsO28rKylvIGluIGgmJihuW3NdW29dPWhbb10pLG8gaW4gdSYmKGFbc11bb109dVtvXSl9cmV0dXJue2Zyb206bix0bzphfX07ZS5fZ2V0Q29udGFpbmVyPWZ1bmN0aW9uKHQscixpLG4pe3ZhciBhO2lmKGE9bnVsbCE9bnx8ZS5pcyh0LFwib2JqZWN0XCIpP3Q6VC5kb2MuZ2V0RWxlbWVudEJ5SWQodCksbnVsbCE9YSlyZXR1cm4gYS50YWdOYW1lP251bGw9PXI/e2NvbnRhaW5lcjphLHdpZHRoOmEuc3R5bGUucGl4ZWxXaWR0aHx8YS5vZmZzZXRXaWR0aCxoZWlnaHQ6YS5zdHlsZS5waXhlbEhlaWdodHx8YS5vZmZzZXRIZWlnaHR9Ontjb250YWluZXI6YSx3aWR0aDpyLGhlaWdodDppfTp7Y29udGFpbmVyOjEseDp0LHk6cix3aWR0aDppLGhlaWdodDpufX0sZS5wYXRoVG9SZWxhdGl2ZT1XdCxlLl9lbmdpbmU9e30sZS5wYXRoMmN1cnZlPVF0LGUubWF0cml4PWZ1bmN0aW9uKHQsZSxyLGksbixhKXtyZXR1cm4gbmV3IGcodCxlLHIsaSxuLGEpfSxmdW5jdGlvbih0KXtmdW5jdGlvbiByKHQpe3JldHVybiB0WzBdKnRbMF0rdFsxXSp0WzFdfWZ1bmN0aW9uIGkodCl7dmFyIGU9WS5zcXJ0KHIodCkpO3RbMF0mJih0WzBdLz1lKSx0WzFdJiYodFsxXS89ZSl9dC5hZGQ9ZnVuY3Rpb24odCxlLHIsaSxuLGEpe3ZhciBzPVtbXSxbXSxbXV0sbz1bW3RoaXMuYSx0aGlzLmMsdGhpcy5lXSxbdGhpcy5iLHRoaXMuZCx0aGlzLmZdLFswLDAsMV1dLGw9W1t0LHIsbl0sW2UsaSxhXSxbMCwwLDFdXSxoLHUsYyxmO2Zvcih0JiZ0IGluc3RhbmNlb2YgZyYmKGw9W1t0LmEsdC5jLHQuZV0sW3QuYix0LmQsdC5mXSxbMCwwLDFdXSksaD0wO2g8MztoKyspZm9yKHU9MDt1PDM7dSsrKXtmb3IoZj0wLGM9MDtjPDM7YysrKWYrPW9baF1bY10qbFtjXVt1XTtzW2hdW3VdPWZ9dGhpcy5hPXNbMF1bMF0sdGhpcy5iPXNbMV1bMF0sdGhpcy5jPXNbMF1bMV0sdGhpcy5kPXNbMV1bMV0sdGhpcy5lPXNbMF1bMl0sdGhpcy5mPXNbMV1bMl19LHQuaW52ZXJ0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQuYSp0LmQtdC5iKnQuYztyZXR1cm4gbmV3IGcodC5kL2UsLXQuYi9lLC10LmMvZSx0LmEvZSwodC5jKnQuZi10LmQqdC5lKS9lLCh0LmIqdC5lLXQuYSp0LmYpL2UpfSx0LmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBnKHRoaXMuYSx0aGlzLmIsdGhpcy5jLHRoaXMuZCx0aGlzLmUsdGhpcy5mKX0sdC50cmFuc2xhdGU9ZnVuY3Rpb24odCxlKXtcbnRoaXMuYWRkKDEsMCwwLDEsdCxlKX0sdC5zY2FsZT1mdW5jdGlvbih0LGUscixpKXtudWxsPT1lJiYoZT10KSwocnx8aSkmJnRoaXMuYWRkKDEsMCwwLDEscixpKSx0aGlzLmFkZCh0LDAsMCxlLDAsMCksKHJ8fGkpJiZ0aGlzLmFkZCgxLDAsMCwxLC1yLC1pKX0sdC5yb3RhdGU9ZnVuY3Rpb24odCxyLGkpe3Q9ZS5yYWQodCkscj1yfHwwLGk9aXx8MDt2YXIgbj0rWS5jb3ModCkudG9GaXhlZCg5KSxhPStZLnNpbih0KS50b0ZpeGVkKDkpO3RoaXMuYWRkKG4sYSwtYSxuLHIsaSksdGhpcy5hZGQoMSwwLDAsMSwtciwtaSl9LHQueD1mdW5jdGlvbih0LGUpe3JldHVybiB0KnRoaXMuYStlKnRoaXMuYyt0aGlzLmV9LHQueT1mdW5jdGlvbih0LGUpe3JldHVybiB0KnRoaXMuYitlKnRoaXMuZCt0aGlzLmZ9LHQuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybit0aGlzW0kuZnJvbUNoYXJDb2RlKDk3K3QpXS50b0ZpeGVkKDQpfSx0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIGUuc3ZnP1wibWF0cml4KFwiK1t0aGlzLmdldCgwKSx0aGlzLmdldCgxKSx0aGlzLmdldCgyKSx0aGlzLmdldCgzKSx0aGlzLmdldCg0KSx0aGlzLmdldCg1KV0uam9pbigpK1wiKVwiOlt0aGlzLmdldCgwKSx0aGlzLmdldCgyKSx0aGlzLmdldCgxKSx0aGlzLmdldCgzKSwwLDBdLmpvaW4oKX0sdC50b0ZpbHRlcj1mdW5jdGlvbigpe3JldHVyblwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0Lk1hdHJpeChNMTE9XCIrdGhpcy5nZXQoMCkrXCIsIE0xMj1cIit0aGlzLmdldCgyKStcIiwgTTIxPVwiK3RoaXMuZ2V0KDEpK1wiLCBNMjI9XCIrdGhpcy5nZXQoMykrXCIsIER4PVwiK3RoaXMuZ2V0KDQpK1wiLCBEeT1cIit0aGlzLmdldCg1KStcIiwgc2l6aW5nbWV0aG9kPSdhdXRvIGV4cGFuZCcpXCJ9LHQub2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuZS50b0ZpeGVkKDQpLHRoaXMuZi50b0ZpeGVkKDQpXX0sdC5zcGxpdD1mdW5jdGlvbigpe3ZhciB0PXt9O3QuZHg9dGhpcy5lLHQuZHk9dGhpcy5mO3ZhciBuPVtbdGhpcy5hLHRoaXMuY10sW3RoaXMuYix0aGlzLmRdXTt0LnNjYWxleD1ZLnNxcnQocihuWzBdKSksaShuWzBdKSx0LnNoZWFyPW5bMF1bMF0qblsxXVswXStuWzBdWzFdKm5bMV1bMV0sblsxXT1bblsxXVswXS1uWzBdWzBdKnQuc2hlYXIsblsxXVsxXS1uWzBdWzFdKnQuc2hlYXJdLHQuc2NhbGV5PVkuc3FydChyKG5bMV0pKSxpKG5bMV0pLHQuc2hlYXIvPXQuc2NhbGV5O3ZhciBhPS1uWzBdWzFdLHM9blsxXVsxXTtyZXR1cm4gczwwPyh0LnJvdGF0ZT1lLmRlZyhZLmFjb3MocykpLGE8MCYmKHQucm90YXRlPTM2MC10LnJvdGF0ZSkpOnQucm90YXRlPWUuZGVnKFkuYXNpbihhKSksdC5pc1NpbXBsZT0hKCt0LnNoZWFyLnRvRml4ZWQoOSl8fHQuc2NhbGV4LnRvRml4ZWQoOSkhPXQuc2NhbGV5LnRvRml4ZWQoOSkmJnQucm90YXRlKSx0LmlzU3VwZXJTaW1wbGU9ISt0LnNoZWFyLnRvRml4ZWQoOSkmJnQuc2NhbGV4LnRvRml4ZWQoOSk9PXQuc2NhbGV5LnRvRml4ZWQoOSkmJiF0LnJvdGF0ZSx0Lm5vUm90YXRpb249ISt0LnNoZWFyLnRvRml4ZWQoOSkmJiF0LnJvdGF0ZSx0fSx0LnRvVHJhbnNmb3JtU3RyaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXR8fHRoaXNbcV0oKTtyZXR1cm4gZS5pc1NpbXBsZT8oZS5zY2FsZXg9K2Uuc2NhbGV4LnRvRml4ZWQoNCksZS5zY2FsZXk9K2Uuc2NhbGV5LnRvRml4ZWQoNCksZS5yb3RhdGU9K2Uucm90YXRlLnRvRml4ZWQoNCksKGUuZHh8fGUuZHk/XCJ0XCIrW2UuZHgsZS5keV06UikrKDEhPWUuc2NhbGV4fHwxIT1lLnNjYWxleT9cInNcIitbZS5zY2FsZXgsZS5zY2FsZXksMCwwXTpSKSsoZS5yb3RhdGU/XCJyXCIrW2Uucm90YXRlLDAsMF06UikpOlwibVwiK1t0aGlzLmdldCgwKSx0aGlzLmdldCgxKSx0aGlzLmdldCgyKSx0aGlzLmdldCgzKSx0aGlzLmdldCg0KSx0aGlzLmdldCg1KV19fShnLnByb3RvdHlwZSk7Zm9yKHZhciBoZT1mdW5jdGlvbigpe3RoaXMucmV0dXJuVmFsdWU9ITF9LHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxjZT1mdW5jdGlvbigpe3RoaXMuY2FuY2VsQnViYmxlPSEwfSxmZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9LHBlPWZ1bmN0aW9uKHQpe3ZhciBlPVQuZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fFQuZG9jLmJvZHkuc2Nyb2xsVG9wLHI9VC5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fFQuZG9jLmJvZHkuc2Nyb2xsTGVmdDtyZXR1cm57eDp0LmNsaWVudFgrcix5OnQuY2xpZW50WStlfX0sZGU9ZnVuY3Rpb24oKXtyZXR1cm4gVC5kb2MuYWRkRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbih0LGUscixpKXt2YXIgbj1mdW5jdGlvbih0KXt2YXIgZT1wZSh0KTtyZXR1cm4gci5jYWxsKGksdCxlLngsZS55KX07aWYodC5hZGRFdmVudExpc3RlbmVyKGUsbiwhMSksRiYmVltlXSl7dmFyIGE9ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPXBlKGUpLGE9ZSxzPTAsbz1lLnRhcmdldFRvdWNoZXMmJmUudGFyZ2V0VG91Y2hlcy5sZW5ndGg7czxvO3MrKylpZihlLnRhcmdldFRvdWNoZXNbc10udGFyZ2V0PT10KXtlPWUudGFyZ2V0VG91Y2hlc1tzXSxlLm9yaWdpbmFsRXZlbnQ9YSxlLnByZXZlbnREZWZhdWx0PXVlLGUuc3RvcFByb3BhZ2F0aW9uPWZlO2JyZWFrfXJldHVybiByLmNhbGwoaSxlLG4ueCxuLnkpfTt0LmFkZEV2ZW50TGlzdGVuZXIoVltlXSxhLCExKX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbiwhMSksRiYmVltlXSYmdC5yZW1vdmVFdmVudExpc3RlbmVyKFZbZV0sYSwhMSksITB9fTpULmRvYy5hdHRhY2hFdmVudD9mdW5jdGlvbih0LGUscixpKXt2YXIgbj1mdW5jdGlvbih0KXt0PXR8fFQud2luLmV2ZW50O3ZhciBlPVQuZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fFQuZG9jLmJvZHkuc2Nyb2xsVG9wLG49VC5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fFQuZG9jLmJvZHkuc2Nyb2xsTGVmdCxhPXQuY2xpZW50WCtuLHM9dC5jbGllbnRZK2U7cmV0dXJuIHQucHJldmVudERlZmF1bHQ9dC5wcmV2ZW50RGVmYXVsdHx8aGUsdC5zdG9wUHJvcGFnYXRpb249dC5zdG9wUHJvcGFnYXRpb258fGNlLHIuY2FsbChpLHQsYSxzKX07dC5hdHRhY2hFdmVudChcIm9uXCIrZSxuKTt2YXIgYT1mdW5jdGlvbigpe3JldHVybiB0LmRldGFjaEV2ZW50KFwib25cIitlLG4pLCEwfTtyZXR1cm4gYX06dm9pZCAwfSgpLGdlPVtdLHZlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgcj1lLmNsaWVudFgsaT1lLmNsaWVudFksbj1ULmRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfHxULmRvYy5ib2R5LnNjcm9sbFRvcCxhPVQuZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0fHxULmRvYy5ib2R5LnNjcm9sbExlZnQscyxvPWdlLmxlbmd0aDtvLS07KXtpZihzPWdlW29dLEYmJmUudG91Y2hlcyl7Zm9yKHZhciBsPWUudG91Y2hlcy5sZW5ndGgsaDtsLS07KWlmKGg9ZS50b3VjaGVzW2xdLGguaWRlbnRpZmllcj09cy5lbC5fZHJhZy5pZCl7cj1oLmNsaWVudFgsaT1oLmNsaWVudFksKGUub3JpZ2luYWxFdmVudD9lLm9yaWdpbmFsRXZlbnQ6ZSkucHJldmVudERlZmF1bHQoKTticmVha319ZWxzZSBlLnByZXZlbnREZWZhdWx0KCk7dmFyIHU9cy5lbC5ub2RlLGMsZj11Lm5leHRTaWJsaW5nLHA9dS5wYXJlbnROb2RlLGQ9dS5zdHlsZS5kaXNwbGF5O1Qud2luLm9wZXJhJiZwLnJlbW92ZUNoaWxkKHUpLHUuc3R5bGUuZGlzcGxheT1cIm5vbmVcIixjPXMuZWwucGFwZXIuZ2V0RWxlbWVudEJ5UG9pbnQocixpKSx1LnN0eWxlLmRpc3BsYXk9ZCxULndpbi5vcGVyYSYmKGY/cC5pbnNlcnRCZWZvcmUodSxmKTpwLmFwcGVuZENoaWxkKHUpKSxjJiZ0KFwicmFwaGFlbC5kcmFnLm92ZXIuXCIrcy5lbC5pZCxzLmVsLGMpLHIrPWEsaSs9bix0KFwicmFwaGFlbC5kcmFnLm1vdmUuXCIrcy5lbC5pZCxzLm1vdmVfc2NvcGV8fHMuZWwsci1zLmVsLl9kcmFnLngsaS1zLmVsLl9kcmFnLnkscixpLGUpfX0seGU9ZnVuY3Rpb24ocil7ZS51bm1vdXNlbW92ZSh2ZSkudW5tb3VzZXVwKHhlKTtmb3IodmFyIGk9Z2UubGVuZ3RoLG47aS0tOyluPWdlW2ldLG4uZWwuX2RyYWc9e30sdChcInJhcGhhZWwuZHJhZy5lbmQuXCIrbi5lbC5pZCxuLmVuZF9zY29wZXx8bi5zdGFydF9zY29wZXx8bi5tb3ZlX3Njb3BlfHxuLmVsLHIpO2dlPVtdfSx5ZT1lLmVsPXt9LG1lPUQubGVuZ3RoO21lLS07KSFmdW5jdGlvbih0KXtlW3RdPXllW3RdPWZ1bmN0aW9uKHIsaSl7cmV0dXJuIGUuaXMocixcImZ1bmN0aW9uXCIpJiYodGhpcy5ldmVudHM9dGhpcy5ldmVudHN8fFtdLHRoaXMuZXZlbnRzLnB1c2goe25hbWU6dCxmOnIsdW5iaW5kOmRlKHRoaXMuc2hhcGV8fHRoaXMubm9kZXx8VC5kb2MsdCxyLGl8fHRoaXMpfSkpLHRoaXN9LGVbXCJ1blwiK3RdPXllW1widW5cIit0XT1mdW5jdGlvbihyKXtmb3IodmFyIGk9dGhpcy5ldmVudHN8fFtdLG49aS5sZW5ndGg7bi0tOylpW25dLm5hbWUhPXR8fCFlLmlzKHIsXCJ1bmRlZmluZWRcIikmJmlbbl0uZiE9cnx8KGlbbl0udW5iaW5kKCksaS5zcGxpY2UobiwxKSwhaS5sZW5ndGgmJmRlbGV0ZSB0aGlzLmV2ZW50cyk7cmV0dXJuIHRoaXN9fShEW21lXSk7eWUuZGF0YT1mdW5jdGlvbihyLGkpe3ZhciBuPXd0W3RoaXMuaWRdPXd0W3RoaXMuaWRdfHx7fTtpZigwPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBuO2lmKDE9PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGUuaXMocixcIm9iamVjdFwiKSl7Zm9yKHZhciBhIGluIHIpcltBXShhKSYmdGhpcy5kYXRhKGEsclthXSk7cmV0dXJuIHRoaXN9cmV0dXJuIHQoXCJyYXBoYWVsLmRhdGEuZ2V0LlwiK3RoaXMuaWQsdGhpcyxuW3JdLHIpLG5bcl19cmV0dXJuIG5bcl09aSx0KFwicmFwaGFlbC5kYXRhLnNldC5cIit0aGlzLmlkLHRoaXMsaSxyKSx0aGlzfSx5ZS5yZW1vdmVEYXRhPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3d0W3RoaXMuaWRdPXt9Ond0W3RoaXMuaWRdJiZkZWxldGUgd3RbdGhpcy5pZF1bdF0sdGhpc30seWUuZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiByKHd0W3RoaXMuaWRdfHx7fSl9LHllLmhvdmVyPWZ1bmN0aW9uKHQsZSxyLGkpe3JldHVybiB0aGlzLm1vdXNlb3Zlcih0LHIpLm1vdXNlb3V0KGUsaXx8cil9LHllLnVuaG92ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy51bm1vdXNlb3Zlcih0KS51bm1vdXNlb3V0KGUpfTt2YXIgYmU9W107eWUuZHJhZz1mdW5jdGlvbihyLGksbixhLHMsbyl7ZnVuY3Rpb24gbChsKXsobC5vcmlnaW5hbEV2ZW50fHxsKS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBoPWwuY2xpZW50WCx1PWwuY2xpZW50WSxjPVQuZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fFQuZG9jLmJvZHkuc2Nyb2xsVG9wLGY9VC5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fFQuZG9jLmJvZHkuc2Nyb2xsTGVmdDtpZih0aGlzLl9kcmFnLmlkPWwuaWRlbnRpZmllcixGJiZsLnRvdWNoZXMpZm9yKHZhciBwPWwudG91Y2hlcy5sZW5ndGgsZDtwLS07KWlmKGQ9bC50b3VjaGVzW3BdLHRoaXMuX2RyYWcuaWQ9ZC5pZGVudGlmaWVyLGQuaWRlbnRpZmllcj09dGhpcy5fZHJhZy5pZCl7aD1kLmNsaWVudFgsdT1kLmNsaWVudFk7YnJlYWt9dGhpcy5fZHJhZy54PWgrZix0aGlzLl9kcmFnLnk9dStjLCFnZS5sZW5ndGgmJmUubW91c2Vtb3ZlKHZlKS5tb3VzZXVwKHhlKSxnZS5wdXNoKHtlbDp0aGlzLG1vdmVfc2NvcGU6YSxzdGFydF9zY29wZTpzLGVuZF9zY29wZTpvfSksaSYmdC5vbihcInJhcGhhZWwuZHJhZy5zdGFydC5cIit0aGlzLmlkLGkpLHImJnQub24oXCJyYXBoYWVsLmRyYWcubW92ZS5cIit0aGlzLmlkLHIpLG4mJnQub24oXCJyYXBoYWVsLmRyYWcuZW5kLlwiK3RoaXMuaWQsbiksdChcInJhcGhhZWwuZHJhZy5zdGFydC5cIit0aGlzLmlkLHN8fGF8fHRoaXMsbC5jbGllbnRYK2YsbC5jbGllbnRZK2MsbCl9cmV0dXJuIHRoaXMuX2RyYWc9e30sYmUucHVzaCh7ZWw6dGhpcyxzdGFydDpsfSksdGhpcy5tb3VzZWRvd24obCksdGhpc30seWUub25EcmFnT3Zlcj1mdW5jdGlvbihlKXtlP3Qub24oXCJyYXBoYWVsLmRyYWcub3Zlci5cIit0aGlzLmlkLGUpOnQudW5iaW5kKFwicmFwaGFlbC5kcmFnLm92ZXIuXCIrdGhpcy5pZCl9LHllLnVuZHJhZz1mdW5jdGlvbigpe2Zvcih2YXIgcj1iZS5sZW5ndGg7ci0tOyliZVtyXS5lbD09dGhpcyYmKHRoaXMudW5tb3VzZWRvd24oYmVbcl0uc3RhcnQpLGJlLnNwbGljZShyLDEpLHQudW5iaW5kKFwicmFwaGFlbC5kcmFnLiouXCIrdGhpcy5pZCkpOyFiZS5sZW5ndGgmJmUudW5tb3VzZW1vdmUodmUpLnVubW91c2V1cCh4ZSksZ2U9W119LE4uY2lyY2xlPWZ1bmN0aW9uKHQscixpKXt2YXIgbj1lLl9lbmdpbmUuY2lyY2xlKHRoaXMsdHx8MCxyfHwwLGl8fDApO3JldHVybiB0aGlzLl9fc2V0X18mJnRoaXMuX19zZXRfXy5wdXNoKG4pLG59LE4ucmVjdD1mdW5jdGlvbih0LHIsaSxuLGEpe3ZhciBzPWUuX2VuZ2luZS5yZWN0KHRoaXMsdHx8MCxyfHwwLGl8fDAsbnx8MCxhfHwwKTtyZXR1cm4gdGhpcy5fX3NldF9fJiZ0aGlzLl9fc2V0X18ucHVzaChzKSxzfSxOLmVsbGlwc2U9ZnVuY3Rpb24odCxyLGksbil7dmFyIGE9ZS5fZW5naW5lLmVsbGlwc2UodGhpcyx0fHwwLHJ8fDAsaXx8MCxufHwwKTtyZXR1cm4gdGhpcy5fX3NldF9fJiZ0aGlzLl9fc2V0X18ucHVzaChhKSxhfSxOLnBhdGg9ZnVuY3Rpb24odCl7dCYmIWUuaXModCxaKSYmIWUuaXModFswXSxRKSYmKHQrPVIpO3ZhciByPWUuX2VuZ2luZS5wYXRoKGUuZm9ybWF0W3pdKGUsYXJndW1lbnRzKSx0aGlzKTtyZXR1cm4gdGhpcy5fX3NldF9fJiZ0aGlzLl9fc2V0X18ucHVzaChyKSxyfSxOLmltYWdlPWZ1bmN0aW9uKHQscixpLG4sYSl7dmFyIHM9ZS5fZW5naW5lLmltYWdlKHRoaXMsdHx8XCJhYm91dDpibGFua1wiLHJ8fDAsaXx8MCxufHwwLGF8fDApO3JldHVybiB0aGlzLl9fc2V0X18mJnRoaXMuX19zZXRfXy5wdXNoKHMpLHN9LE4udGV4dD1mdW5jdGlvbih0LHIsaSl7dmFyIG49ZS5fZW5naW5lLnRleHQodGhpcyx0fHwwLHJ8fDAsSShpKSk7cmV0dXJuIHRoaXMuX19zZXRfXyYmdGhpcy5fX3NldF9fLnB1c2gobiksbn0sTi5zZXQ9ZnVuY3Rpb24odCl7IWUuaXModCxcImFycmF5XCIpJiYodD1BcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYXJndW1lbnRzLDAsYXJndW1lbnRzLmxlbmd0aCkpO3ZhciByPW5ldyB6ZSh0KTtyZXR1cm4gdGhpcy5fX3NldF9fJiZ0aGlzLl9fc2V0X18ucHVzaChyKSxyLnBhcGVyPXRoaXMsci50eXBlPVwic2V0XCIscn0sTi5zZXRTdGFydD1mdW5jdGlvbih0KXt0aGlzLl9fc2V0X189dHx8dGhpcy5zZXQoKX0sTi5zZXRGaW5pc2g9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX3NldF9fO3JldHVybiBkZWxldGUgdGhpcy5fX3NldF9fLGV9LE4uZ2V0U2l6ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY2FudmFzLnBhcmVudE5vZGU7cmV0dXJue3dpZHRoOnQub2Zmc2V0V2lkdGgsaGVpZ2h0OnQub2Zmc2V0SGVpZ2h0fX0sTi5zZXRTaXplPWZ1bmN0aW9uKHQscil7cmV0dXJuIGUuX2VuZ2luZS5zZXRTaXplLmNhbGwodGhpcyx0LHIpfSxOLnNldFZpZXdCb3g9ZnVuY3Rpb24odCxyLGksbixhKXtyZXR1cm4gZS5fZW5naW5lLnNldFZpZXdCb3guY2FsbCh0aGlzLHQscixpLG4sYSl9LE4udG9wPU4uYm90dG9tPW51bGwsTi5yYXBoYWVsPWU7dmFyIF9lPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj10Lm93bmVyRG9jdW1lbnQsaT1yLmJvZHksbj1yLmRvY3VtZW50RWxlbWVudCxhPW4uY2xpZW50VG9wfHxpLmNsaWVudFRvcHx8MCxzPW4uY2xpZW50TGVmdHx8aS5jbGllbnRMZWZ0fHwwLG89ZS50b3ArKFQud2luLnBhZ2VZT2Zmc2V0fHxuLnNjcm9sbFRvcHx8aS5zY3JvbGxUb3ApLWEsbD1lLmxlZnQrKFQud2luLnBhZ2VYT2Zmc2V0fHxuLnNjcm9sbExlZnR8fGkuc2Nyb2xsTGVmdCktcztyZXR1cm57eTpvLHg6bH19O04uZ2V0RWxlbWVudEJ5UG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLGk9ci5jYW52YXMsbj1ULmRvYy5lbGVtZW50RnJvbVBvaW50KHQsZSk7aWYoVC53aW4ub3BlcmEmJlwic3ZnXCI9PW4udGFnTmFtZSl7dmFyIGE9X2UoaSkscz1pLmNyZWF0ZVNWR1JlY3QoKTtzLng9dC1hLngscy55PWUtYS55LHMud2lkdGg9cy5oZWlnaHQ9MTt2YXIgbz1pLmdldEludGVyc2VjdGlvbkxpc3QocyxudWxsKTtvLmxlbmd0aCYmKG49b1tvLmxlbmd0aC0xXSl9aWYoIW4pcmV0dXJuIG51bGw7Zm9yKDtuLnBhcmVudE5vZGUmJm4hPWkucGFyZW50Tm9kZSYmIW4ucmFwaGFlbDspbj1uLnBhcmVudE5vZGU7cmV0dXJuIG49PXIuY2FudmFzLnBhcmVudE5vZGUmJihuPWkpLG49biYmbi5yYXBoYWVsP3IuZ2V0QnlJZChuLnJhcGhhZWxpZCk6bnVsbH0sTi5nZXRFbGVtZW50c0J5QkJveD1mdW5jdGlvbih0KXt2YXIgcj10aGlzLnNldCgpO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oaSl7ZS5pc0JCb3hJbnRlcnNlY3QoaS5nZXRCQm94KCksdCkmJnIucHVzaChpKX0pLHJ9LE4uZ2V0QnlJZD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib3R0b207ZTspe2lmKGUuaWQ9PXQpcmV0dXJuIGU7ZT1lLm5leHR9cmV0dXJuIG51bGx9LE4uZm9yRWFjaD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10aGlzLmJvdHRvbTtyOyl7aWYodC5jYWxsKGUscik9PT0hMSlyZXR1cm4gdGhpcztyPXIubmV4dH1yZXR1cm4gdGhpc30sTi5nZXRFbGVtZW50c0J5UG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLnNldCgpO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oaSl7aS5pc1BvaW50SW5zaWRlKHQsZSkmJnIucHVzaChpKX0pLHJ9LHllLmlzUG9pbnRJbnNpZGU9ZnVuY3Rpb24odCxyKXt2YXIgaT10aGlzLnJlYWxQYXRoPUV0W3RoaXMudHlwZV0odGhpcyk7cmV0dXJuIHRoaXMuYXR0cihcInRyYW5zZm9ybVwiKSYmdGhpcy5hdHRyKFwidHJhbnNmb3JtXCIpLmxlbmd0aCYmKGk9ZS50cmFuc2Zvcm1QYXRoKGksdGhpcy5hdHRyKFwidHJhbnNmb3JtXCIpKSksZS5pc1BvaW50SW5zaWRlUGF0aChpLHQscil9LHllLmdldEJCb3g9ZnVuY3Rpb24odCl7aWYodGhpcy5yZW1vdmVkKXJldHVybnt9O3ZhciBlPXRoaXMuXztyZXR1cm4gdD8oIWUuZGlydHkmJmUuYmJveHd0fHwodGhpcy5yZWFsUGF0aD1FdFt0aGlzLnR5cGVdKHRoaXMpLGUuYmJveHd0PU90KHRoaXMucmVhbFBhdGgpLGUuYmJveHd0LnRvU3RyaW5nPXgsZS5kaXJ0eT0wKSxlLmJib3h3dCk6KChlLmRpcnR5fHxlLmRpcnR5VHx8IWUuYmJveCkmJighZS5kaXJ0eSYmdGhpcy5yZWFsUGF0aHx8KGUuYmJveHd0PTAsdGhpcy5yZWFsUGF0aD1FdFt0aGlzLnR5cGVdKHRoaXMpKSxlLmJib3g9T3QoTXQodGhpcy5yZWFsUGF0aCx0aGlzLm1hdHJpeCkpLGUuYmJveC50b1N0cmluZz14LGUuZGlydHk9ZS5kaXJ0eVQ9MCksZS5iYm94KX0seWUuY2xvbmU9ZnVuY3Rpb24oKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5wYXBlclt0aGlzLnR5cGVdKCkuYXR0cih0aGlzLmF0dHIoKSk7cmV0dXJuIHRoaXMuX19zZXRfXyYmdGhpcy5fX3NldF9fLnB1c2godCksdH0seWUuZ2xvdz1mdW5jdGlvbih0KXtpZihcInRleHRcIj09dGhpcy50eXBlKXJldHVybiBudWxsO3Q9dHx8e307dmFyIGU9e3dpZHRoOih0LndpZHRofHwxMCkrKCt0aGlzLmF0dHIoXCJzdHJva2Utd2lkdGhcIil8fDEpLGZpbGw6dC5maWxsfHwhMSxvcGFjaXR5Om51bGw9PXQub3BhY2l0eT8uNTp0Lm9wYWNpdHksb2Zmc2V0eDp0Lm9mZnNldHh8fDAsb2Zmc2V0eTp0Lm9mZnNldHl8fDAsY29sb3I6dC5jb2xvcnx8XCIjMDAwXCJ9LHI9ZS53aWR0aC8yLGk9dGhpcy5wYXBlcixuPWkuc2V0KCksYT10aGlzLnJlYWxQYXRofHxFdFt0aGlzLnR5cGVdKHRoaXMpO2E9dGhpcy5tYXRyaXg/TXQoYSx0aGlzLm1hdHJpeCk6YTtmb3IodmFyIHM9MTtzPHIrMTtzKyspbi5wdXNoKGkucGF0aChhKS5hdHRyKHtzdHJva2U6ZS5jb2xvcixmaWxsOmUuZmlsbD9lLmNvbG9yOlwibm9uZVwiLFwic3Ryb2tlLWxpbmVqb2luXCI6XCJyb3VuZFwiLFwic3Ryb2tlLWxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2Utd2lkdGhcIjorKGUud2lkdGgvcipzKS50b0ZpeGVkKDMpLG9wYWNpdHk6KyhlLm9wYWNpdHkvcikudG9GaXhlZCgzKX0pKTtyZXR1cm4gbi5pbnNlcnRCZWZvcmUodGhpcykudHJhbnNsYXRlKGUub2Zmc2V0eCxlLm9mZnNldHkpfTt2YXIgd2U9e30sa2U9ZnVuY3Rpb24odCxyLGksbixhLHMsbyx1LGMpe3JldHVybiBudWxsPT1jP2wodCxyLGksbixhLHMsbyx1KTplLmZpbmREb3RzQXRTZWdtZW50KHQscixpLG4sYSxzLG8sdSxoKHQscixpLG4sYSxzLG8sdSxjKSl9LEJlPWZ1bmN0aW9uKHQscil7cmV0dXJuIGZ1bmN0aW9uKGksbixhKXtpPVF0KGkpO2Zvcih2YXIgcyxvLGwsaCx1PVwiXCIsYz17fSxmLHA9MCxkPTAsZz1pLmxlbmd0aDtkPGc7ZCsrKXtpZihsPWlbZF0sXCJNXCI9PWxbMF0pcz0rbFsxXSxvPStsWzJdO2Vsc2V7aWYoaD1rZShzLG8sbFsxXSxsWzJdLGxbM10sbFs0XSxsWzVdLGxbNl0pLHAraD5uKXtpZihyJiYhYy5zdGFydCl7aWYoZj1rZShzLG8sbFsxXSxsWzJdLGxbM10sbFs0XSxsWzVdLGxbNl0sbi1wKSx1Kz1bXCJDXCIrZi5zdGFydC54LGYuc3RhcnQueSxmLm0ueCxmLm0ueSxmLngsZi55XSxhKXJldHVybiB1O2Muc3RhcnQ9dSx1PVtcIk1cIitmLngsZi55K1wiQ1wiK2Yubi54LGYubi55LGYuZW5kLngsZi5lbmQueSxsWzVdLGxbNl1dLmpvaW4oKSxwKz1oLHM9K2xbNV0sbz0rbFs2XTtjb250aW51ZX1pZighdCYmIXIpcmV0dXJuIGY9a2UocyxvLGxbMV0sbFsyXSxsWzNdLGxbNF0sbFs1XSxsWzZdLG4tcCkse3g6Zi54LHk6Zi55LGFscGhhOmYuYWxwaGF9fXArPWgscz0rbFs1XSxvPStsWzZdfXUrPWwuc2hpZnQoKStsfXJldHVybiBjLmVuZD11LGY9dD9wOnI/YzplLmZpbmREb3RzQXRTZWdtZW50KHMsbyxsWzBdLGxbMV0sbFsyXSxsWzNdLGxbNF0sbFs1XSwxKSxmLmFscGhhJiYoZj17eDpmLngseTpmLnksYWxwaGE6Zi5hbHBoYX0pLGZ9fSxDZT1CZSgxKSxTZT1CZSgpLEFlPUJlKDAsMSk7ZS5nZXRUb3RhbExlbmd0aD1DZSxlLmdldFBvaW50QXRMZW5ndGg9U2UsZS5nZXRTdWJwYXRoPWZ1bmN0aW9uKHQsZSxyKXtpZih0aGlzLmdldFRvdGFsTGVuZ3RoKHQpLXI8MWUtNilyZXR1cm4gQWUodCxlKS5lbmQ7dmFyIGk9QWUodCxyLDEpO3JldHVybiBlP0FlKGksZSkuZW5kOml9LHllLmdldFRvdGFsTGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRQYXRoKCk7aWYodClyZXR1cm4gdGhpcy5ub2RlLmdldFRvdGFsTGVuZ3RoP3RoaXMubm9kZS5nZXRUb3RhbExlbmd0aCgpOkNlKHQpfSx5ZS5nZXRQb2ludEF0TGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UGF0aCgpO2lmKGUpcmV0dXJuIFNlKGUsdCl9LHllLmdldFBhdGg9ZnVuY3Rpb24oKXt2YXIgdCxyPWUuX2dldFBhdGhbdGhpcy50eXBlXTtpZihcInRleHRcIiE9dGhpcy50eXBlJiZcInNldFwiIT10aGlzLnR5cGUpcmV0dXJuIHImJih0PXIodGhpcykpLHR9LHllLmdldFN1YnBhdGg9ZnVuY3Rpb24odCxyKXt2YXIgaT10aGlzLmdldFBhdGgoKTtpZihpKXJldHVybiBlLmdldFN1YnBhdGgoaSx0LHIpfTt2YXIgVGU9ZS5lYXNpbmdfZm9ybXVsYXM9e2xpbmVhcjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sXCI8XCI6ZnVuY3Rpb24odCl7cmV0dXJuIFgodCwxLjcpfSxcIj5cIjpmdW5jdGlvbih0KXtyZXR1cm4gWCh0LC40OCl9LFwiPD5cIjpmdW5jdGlvbih0KXt2YXIgZT0uNDgtdC8xLjA0LHI9WS5zcXJ0KC4xNzM0K2UqZSksaT1yLWUsbj1YKEgoaSksMS8zKSooaTwwPy0xOjEpLGE9LXItZSxzPVgoSChhKSwxLzMpKihhPDA/LTE6MSksbz1uK3MrLjU7cmV0dXJuIDMqKDEtbykqbypvK28qbypvfSxiYWNrSW46ZnVuY3Rpb24odCl7dmFyIGU9MS43MDE1ODtyZXR1cm4gdCp0KigoZSsxKSp0LWUpfSxiYWNrT3V0OmZ1bmN0aW9uKHQpe3QtPTE7dmFyIGU9MS43MDE1ODtyZXR1cm4gdCp0KigoZSsxKSp0K2UpKzF9LGVsYXN0aWM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PSEhdD90OlgoMiwtMTAqdCkqWS5zaW4oKHQtLjA3NSkqKDIqVSkvLjMpKzF9LGJvdW5jZTpmdW5jdGlvbih0KXt2YXIgZT03LjU2MjUscj0yLjc1LGk7cmV0dXJuIHQ8MS9yP2k9ZSp0KnQ6dDwyL3I/KHQtPTEuNS9yLGk9ZSp0KnQrLjc1KTp0PDIuNS9yPyh0LT0yLjI1L3IsaT1lKnQqdCsuOTM3NSk6KHQtPTIuNjI1L3IsaT1lKnQqdCsuOTg0Mzc1KSxpfX07VGUuZWFzZUluPVRlW1wiZWFzZS1pblwiXT1UZVtcIjxcIl0sVGUuZWFzZU91dD1UZVtcImVhc2Utb3V0XCJdPVRlW1wiPlwiXSxUZS5lYXNlSW5PdXQ9VGVbXCJlYXNlLWluLW91dFwiXT1UZVtcIjw+XCJdLFRlW1wiYmFjay1pblwiXT1UZS5iYWNrSW4sVGVbXCJiYWNrLW91dFwiXT1UZS5iYWNrT3V0O3ZhciBFZT1bXSxNZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTYpfSxOZT1mdW5jdGlvbigpe2Zvcih2YXIgcj0rbmV3IERhdGUsaT0wO2k8RWUubGVuZ3RoO2krKyl7dmFyIG49RWVbaV07aWYoIW4uZWwucmVtb3ZlZCYmIW4ucGF1c2VkKXt2YXIgYT1yLW4uc3RhcnQscz1uLm1zLG89bi5lYXNpbmcsbD1uLmZyb20saD1uLmRpZmYsdT1uLnRvLGM9bi50LGY9bi5lbCxwPXt9LGQsZz17fSx2O2lmKG4uaW5pdHN0YXR1cz8oYT0obi5pbml0c3RhdHVzKm4uYW5pbS50b3Atbi5wcmV2KS8obi5wZXJjZW50LW4ucHJldikqcyxuLnN0YXR1cz1uLmluaXRzdGF0dXMsZGVsZXRlIG4uaW5pdHN0YXR1cyxuLnN0b3AmJkVlLnNwbGljZShpLS0sMSkpOm4uc3RhdHVzPShuLnByZXYrKG4ucGVyY2VudC1uLnByZXYpKihhL3MpKS9uLmFuaW0udG9wLCEoYTwwKSlpZihhPHMpe3ZhciB4PW8oYS9zKTtmb3IodmFyIHkgaW4gbClpZihsW0FdKHkpKXtzd2l0Y2gocHRbeV0pe2Nhc2UgJDpkPStsW3ldK3gqcypoW3ldO2JyZWFrO2Nhc2VcImNvbG91clwiOmQ9XCJyZ2IoXCIrW0xlKG90KGxbeV0ucit4KnMqaFt5XS5yKSksTGUob3QobFt5XS5nK3gqcypoW3ldLmcpKSxMZShvdChsW3ldLmIreCpzKmhbeV0uYikpXS5qb2luKFwiLFwiKStcIilcIjticmVhaztjYXNlXCJwYXRoXCI6ZD1bXTtmb3IodmFyIG09MCxfPWxbeV0ubGVuZ3RoO208XzttKyspe2RbbV09W2xbeV1bbV1bMF1dO2Zvcih2YXIgdz0xLGs9bFt5XVttXS5sZW5ndGg7dzxrO3crKylkW21dW3ddPStsW3ldW21dW3ddK3gqcypoW3ldW21dW3ddO2RbbV09ZFttXS5qb2luKGopfWQ9ZC5qb2luKGopO2JyZWFrO2Nhc2VcInRyYW5zZm9ybVwiOmlmKGhbeV0ucmVhbClmb3IoZD1bXSxtPTAsXz1sW3ldLmxlbmd0aDttPF87bSsrKWZvcihkW21dPVtsW3ldW21dWzBdXSx3PTEsaz1sW3ldW21dLmxlbmd0aDt3PGs7dysrKWRbbV1bd109bFt5XVttXVt3XSt4KnMqaFt5XVttXVt3XTtlbHNle3ZhciBCPWZ1bmN0aW9uKHQpe3JldHVybitsW3ldW3RdK3gqcypoW3ldW3RdfTtkPVtbXCJtXCIsQigwKSxCKDEpLEIoMiksQigzKSxCKDQpLEIoNSldXX1icmVhaztjYXNlXCJjc3ZcIjppZihcImNsaXAtcmVjdFwiPT15KWZvcihkPVtdLG09NDttLS07KWRbbV09K2xbeV1bbV0reCpzKmhbeV1bbV07YnJlYWs7ZGVmYXVsdDp2YXIgQz1bXVtQXShsW3ldKTtmb3IoZD1bXSxtPWYucGFwZXIuY3VzdG9tQXR0cmlidXRlc1t5XS5sZW5ndGg7bS0tOylkW21dPStDW21dK3gqcypoW3ldW21dfXBbeV09ZH1mLmF0dHIocCksZnVuY3Rpb24oZSxyLGkpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0KFwicmFwaGFlbC5hbmltLmZyYW1lLlwiK2UscixpKX0pfShmLmlkLGYsbi5hbmltKX1lbHNle2lmKGZ1bmN0aW9uKHIsaSxuKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dChcInJhcGhhZWwuYW5pbS5mcmFtZS5cIitpLmlkLGksbiksdChcInJhcGhhZWwuYW5pbS5maW5pc2guXCIraS5pZCxpLG4pLGUuaXMocixcImZ1bmN0aW9uXCIpJiZyLmNhbGwoaSl9KX0obi5jYWxsYmFjayxmLG4uYW5pbSksZi5hdHRyKHUpLEVlLnNwbGljZShpLS0sMSksbi5yZXBlYXQ+MSYmIW4ubmV4dCl7Zm9yKHYgaW4gdSl1W0FdKHYpJiYoZ1t2XT1uLnRvdGFsT3JpZ2luW3ZdKTtuLmVsLmF0dHIoZyksYihuLmFuaW0sbi5lbCxuLmFuaW0ucGVyY2VudHNbMF0sbnVsbCxuLnRvdGFsT3JpZ2luLG4ucmVwZWF0LTEpfW4ubmV4dCYmIW4uc3RvcCYmYihuLmFuaW0sbi5lbCxuLm5leHQsbnVsbCxuLnRvdGFsT3JpZ2luLG4ucmVwZWF0KX19fUVlLmxlbmd0aCYmTWUoTmUpfSxMZT1mdW5jdGlvbih0KXtyZXR1cm4gdD4yNTU/MjU1OnQ8MD8wOnR9O3llLmFuaW1hdGVXaXRoPWZ1bmN0aW9uKHQscixpLG4sYSxzKXt2YXIgbz10aGlzO2lmKG8ucmVtb3ZlZClyZXR1cm4gcyYmcy5jYWxsKG8pLG87dmFyIGw9aSBpbnN0YW5jZW9mIG0/aTplLmFuaW1hdGlvbihpLG4sYSxzKSxoLHU7YihsLG8sbC5wZXJjZW50c1swXSxudWxsLG8uYXR0cigpKTtmb3IodmFyIGM9MCxmPUVlLmxlbmd0aDtjPGY7YysrKWlmKEVlW2NdLmFuaW09PXImJkVlW2NdLmVsPT10KXtFZVtmLTFdLnN0YXJ0PUVlW2NdLnN0YXJ0O2JyZWFrfXJldHVybiBvfSx5ZS5vbkFuaW1hdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gZT90Lm9uKFwicmFwaGFlbC5hbmltLmZyYW1lLlwiK3RoaXMuaWQsZSk6dC51bmJpbmQoXCJyYXBoYWVsLmFuaW0uZnJhbWUuXCIrdGhpcy5pZCksdGhpc30sbS5wcm90b3R5cGUuZGVsYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IG0odGhpcy5hbmltLHRoaXMubXMpO3JldHVybiBlLnRpbWVzPXRoaXMudGltZXMsZS5kZWw9K3R8fDAsZX0sbS5wcm90b3R5cGUucmVwZWF0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBtKHRoaXMuYW5pbSx0aGlzLm1zKTtyZXR1cm4gZS5kZWw9dGhpcy5kZWwsZS50aW1lcz1ZLmZsb29yKFcodCwwKSl8fDEsZX0sZS5hbmltYXRpb249ZnVuY3Rpb24odCxyLGksbil7aWYodCBpbnN0YW5jZW9mIG0pcmV0dXJuIHQ7IWUuaXMoaSxcImZ1bmN0aW9uXCIpJiZpfHwobj1ufHxpfHxudWxsLGk9bnVsbCksdD1PYmplY3QodCkscj0rcnx8MDt2YXIgYT17fSxzLG87Zm9yKG8gaW4gdCl0W0FdKG8pJiZodChvKSE9byYmaHQobykrXCIlXCIhPW8mJihzPSEwLGFbb109dFtvXSk7aWYocylyZXR1cm4gaSYmKGEuZWFzaW5nPWkpLG4mJihhLmNhbGxiYWNrPW4pLG5ldyBtKHsxMDA6YX0scik7aWYobil7dmFyIGw9MDtmb3IodmFyIGggaW4gdCl7dmFyIHU9dXQoaCk7dFtBXShoKSYmdT5sJiYobD11KX1sKz1cIiVcIiwhdFtsXS5jYWxsYmFjayYmKHRbbF0uY2FsbGJhY2s9bil9cmV0dXJuIG5ldyBtKHQscil9LHllLmFuaW1hdGU9ZnVuY3Rpb24odCxyLGksbil7dmFyIGE9dGhpcztpZihhLnJlbW92ZWQpcmV0dXJuIG4mJm4uY2FsbChhKSxhO3ZhciBzPXQgaW5zdGFuY2VvZiBtP3Q6ZS5hbmltYXRpb24odCxyLGksbik7cmV0dXJuIGIocyxhLHMucGVyY2VudHNbMF0sbnVsbCxhLmF0dHIoKSksYX0seWUuc2V0VGltZT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZudWxsIT1lJiZ0aGlzLnN0YXR1cyh0LEcoZSx0Lm1zKS90Lm1zKSx0aGlzfSx5ZS5zdGF0dXM9ZnVuY3Rpb24odCxlKXt2YXIgcj1bXSxpPTAsbixhO2lmKG51bGwhPWUpcmV0dXJuIGIodCx0aGlzLC0xLEcoZSwxKSksdGhpcztmb3Iobj1FZS5sZW5ndGg7aTxuO2krKylpZihhPUVlW2ldLGEuZWwuaWQ9PXRoaXMuaWQmJighdHx8YS5hbmltPT10KSl7aWYodClyZXR1cm4gYS5zdGF0dXM7ci5wdXNoKHthbmltOmEuYW5pbSxzdGF0dXM6YS5zdGF0dXN9KX1yZXR1cm4gdD8wOnJ9LHllLnBhdXNlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgcj0wO3I8RWUubGVuZ3RoO3IrKylFZVtyXS5lbC5pZCE9dGhpcy5pZHx8ZSYmRWVbcl0uYW5pbSE9ZXx8dChcInJhcGhhZWwuYW5pbS5wYXVzZS5cIit0aGlzLmlkLHRoaXMsRWVbcl0uYW5pbSkhPT0hMSYmKEVlW3JdLnBhdXNlZD0hMCk7cmV0dXJuIHRoaXN9LHllLnJlc3VtZT1mdW5jdGlvbihlKXtmb3IodmFyIHI9MDtyPEVlLmxlbmd0aDtyKyspaWYoRWVbcl0uZWwuaWQ9PXRoaXMuaWQmJighZXx8RWVbcl0uYW5pbT09ZSkpe3ZhciBpPUVlW3JdO3QoXCJyYXBoYWVsLmFuaW0ucmVzdW1lLlwiK3RoaXMuaWQsdGhpcyxpLmFuaW0pIT09ITEmJihkZWxldGUgaS5wYXVzZWQsdGhpcy5zdGF0dXMoaS5hbmltLGkuc3RhdHVzKSl9cmV0dXJuIHRoaXN9LHllLnN0b3A9ZnVuY3Rpb24oZSl7Zm9yKHZhciByPTA7cjxFZS5sZW5ndGg7cisrKUVlW3JdLmVsLmlkIT10aGlzLmlkfHxlJiZFZVtyXS5hbmltIT1lfHx0KFwicmFwaGFlbC5hbmltLnN0b3AuXCIrdGhpcy5pZCx0aGlzLEVlW3JdLmFuaW0pIT09ITEmJkVlLnNwbGljZShyLS0sMSk7cmV0dXJuIHRoaXN9LHQub24oXCJyYXBoYWVsLnJlbW92ZVwiLF8pLHQub24oXCJyYXBoYWVsLmNsZWFyXCIsXykseWUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIlJhcGhhw6ts4oCZcyBvYmplY3RcIn07dmFyIHplPWZ1bmN0aW9uKHQpe2lmKHRoaXMuaXRlbXM9W10sdGhpcy5sZW5ndGg9MCx0aGlzLnR5cGU9XCJzZXRcIix0KWZvcih2YXIgZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKykhdFtlXXx8dFtlXS5jb25zdHJ1Y3RvciE9eWUuY29uc3RydWN0b3ImJnRbZV0uY29uc3RydWN0b3IhPXplfHwodGhpc1t0aGlzLml0ZW1zLmxlbmd0aF09dGhpcy5pdGVtc1t0aGlzLml0ZW1zLmxlbmd0aF09dFtlXSx0aGlzLmxlbmd0aCsrKX0sUGU9emUucHJvdG90eXBlO1BlLnB1c2g9ZnVuY3Rpb24oKXtmb3IodmFyIHQsZSxyPTAsaT1hcmd1bWVudHMubGVuZ3RoO3I8aTtyKyspdD1hcmd1bWVudHNbcl0sIXR8fHQuY29uc3RydWN0b3IhPXllLmNvbnN0cnVjdG9yJiZ0LmNvbnN0cnVjdG9yIT16ZXx8KGU9dGhpcy5pdGVtcy5sZW5ndGgsdGhpc1tlXT10aGlzLml0ZW1zW2VdPXQsdGhpcy5sZW5ndGgrKyk7cmV0dXJuIHRoaXN9LFBlLnBvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aCYmZGVsZXRlIHRoaXNbdGhpcy5sZW5ndGgtLV0sdGhpcy5pdGVtcy5wb3AoKX0sUGUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLGk9dGhpcy5pdGVtcy5sZW5ndGg7cjxpO3IrKylpZih0LmNhbGwoZSx0aGlzLml0ZW1zW3JdLHIpPT09ITEpcmV0dXJuIHRoaXM7cmV0dXJuIHRoaXN9O2Zvcih2YXIgRmUgaW4geWUpeWVbQV0oRmUpJiYoUGVbRmVdPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHIpe3JbdF1bel0ocixlKX0pfX0oRmUpKTtyZXR1cm4gUGUuYXR0cj1mdW5jdGlvbih0LHIpe2lmKHQmJmUuaXModCxRKSYmZS5pcyh0WzBdLFwib2JqZWN0XCIpKWZvcih2YXIgaT0wLG49dC5sZW5ndGg7aTxuO2krKyl0aGlzLml0ZW1zW2ldLmF0dHIodFtpXSk7ZWxzZSBmb3IodmFyIGE9MCxzPXRoaXMuaXRlbXMubGVuZ3RoO2E8czthKyspdGhpcy5pdGVtc1thXS5hdHRyKHQscik7cmV0dXJuIHRoaXN9LFBlLmNsZWFyPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLmxlbmd0aDspdGhpcy5wb3AoKX0sUGUuc3BsaWNlPWZ1bmN0aW9uKHQsZSxyKXt0PXQ8MD9XKHRoaXMubGVuZ3RoK3QsMCk6dCxlPVcoMCxHKHRoaXMubGVuZ3RoLXQsZSkpO3ZhciBpPVtdLG49W10sYT1bXSxzO2ZvcihzPTI7czxhcmd1bWVudHMubGVuZ3RoO3MrKylhLnB1c2goYXJndW1lbnRzW3NdKTtmb3Iocz0wO3M8ZTtzKyspbi5wdXNoKHRoaXNbdCtzXSk7Zm9yKDtzPHRoaXMubGVuZ3RoLXQ7cysrKWkucHVzaCh0aGlzW3Qrc10pO3ZhciBvPWEubGVuZ3RoO2ZvcihzPTA7czxvK2kubGVuZ3RoO3MrKyl0aGlzLml0ZW1zW3Qrc109dGhpc1t0K3NdPXM8bz9hW3NdOmlbcy1vXTtmb3Iocz10aGlzLml0ZW1zLmxlbmd0aD10aGlzLmxlbmd0aC09ZS1vO3RoaXNbc107KWRlbGV0ZSB0aGlzW3MrK107cmV0dXJuIG5ldyB6ZShuKX0sUGUuZXhjbHVkZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxyPXRoaXMubGVuZ3RoO2U8cjtlKyspaWYodGhpc1tlXT09dClyZXR1cm4gdGhpcy5zcGxpY2UoZSwxKSwhMH0sUGUuYW5pbWF0ZT1mdW5jdGlvbih0LHIsaSxuKXsoZS5pcyhpLFwiZnVuY3Rpb25cIil8fCFpKSYmKG49aXx8bnVsbCk7dmFyIGE9dGhpcy5pdGVtcy5sZW5ndGgscz1hLG8sbD10aGlzLGg7aWYoIWEpcmV0dXJuIHRoaXM7biYmKGg9ZnVuY3Rpb24oKXshLS1hJiZuLmNhbGwobCl9KSxpPWUuaXMoaSxaKT9pOmg7dmFyIHU9ZS5hbmltYXRpb24odCxyLGksaCk7Zm9yKG89dGhpcy5pdGVtc1stLXNdLmFuaW1hdGUodSk7cy0tOyl0aGlzLml0ZW1zW3NdJiYhdGhpcy5pdGVtc1tzXS5yZW1vdmVkJiZ0aGlzLml0ZW1zW3NdLmFuaW1hdGVXaXRoKG8sdSx1KSx0aGlzLml0ZW1zW3NdJiYhdGhpcy5pdGVtc1tzXS5yZW1vdmVkfHxhLS07cmV0dXJuIHRoaXN9LFBlLmluc2VydEFmdGVyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLml0ZW1zLmxlbmd0aDtlLS07KXRoaXMuaXRlbXNbZV0uaW5zZXJ0QWZ0ZXIodCk7cmV0dXJuIHRoaXN9LFBlLmdldEJCb3g9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT1bXSxyPVtdLGk9W10sbj10aGlzLml0ZW1zLmxlbmd0aDtuLS07KWlmKCF0aGlzLml0ZW1zW25dLnJlbW92ZWQpe3ZhciBhPXRoaXMuaXRlbXNbbl0uZ2V0QkJveCgpO3QucHVzaChhLngpLGUucHVzaChhLnkpLHIucHVzaChhLngrYS53aWR0aCksaS5wdXNoKGEueSthLmhlaWdodCl9cmV0dXJuIHQ9R1t6XSgwLHQpLGU9R1t6XSgwLGUpLHI9V1t6XSgwLHIpLGk9V1t6XSgwLGkpLHt4OnQseTplLHgyOnIseTI6aSx3aWR0aDpyLXQsaGVpZ2h0OmktZX19LFBlLmNsb25lPWZ1bmN0aW9uKHQpe3Q9dGhpcy5wYXBlci5zZXQoKTtmb3IodmFyIGU9MCxyPXRoaXMuaXRlbXMubGVuZ3RoO2U8cjtlKyspdC5wdXNoKHRoaXMuaXRlbXNbZV0uY2xvbmUoKSk7cmV0dXJuIHR9LFBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJSYXBoYcOrbOKAmHMgc2V0XCJ9LFBlLmdsb3c9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wYXBlci5zZXQoKTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHIsaSl7dmFyIG49ci5nbG93KHQpO251bGwhPW4mJm4uZm9yRWFjaChmdW5jdGlvbih0LHIpe2UucHVzaCh0KX0pfSksZX0sUGUuaXNQb2ludEluc2lkZT1mdW5jdGlvbih0LGUpe3ZhciByPSExO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oaSl7aWYoaS5pc1BvaW50SW5zaWRlKHQsZSkpcmV0dXJuIHI9ITAsITF9KSxyfSxlLnJlZ2lzdGVyRm9udD1mdW5jdGlvbih0KXtpZighdC5mYWNlKXJldHVybiB0O3RoaXMuZm9udHM9dGhpcy5mb250c3x8e307dmFyIGU9e3c6dC53LGZhY2U6e30sZ2x5cGhzOnt9fSxyPXQuZmFjZVtcImZvbnQtZmFtaWx5XCJdO2Zvcih2YXIgaSBpbiB0LmZhY2UpdC5mYWNlW0FdKGkpJiYoZS5mYWNlW2ldPXQuZmFjZVtpXSk7aWYodGhpcy5mb250c1tyXT90aGlzLmZvbnRzW3JdLnB1c2goZSk6dGhpcy5mb250c1tyXT1bZV0sIXQuc3ZnKXtlLmZhY2VbXCJ1bml0cy1wZXItZW1cIl09dXQodC5mYWNlW1widW5pdHMtcGVyLWVtXCJdLDEwKTtmb3IodmFyIG4gaW4gdC5nbHlwaHMpaWYodC5nbHlwaHNbQV0obikpe3ZhciBhPXQuZ2x5cGhzW25dO2lmKGUuZ2x5cGhzW25dPXt3OmEudyxrOnt9LGQ6YS5kJiZcIk1cIithLmQucmVwbGFjZSgvW21sY3h0cnZdL2csZnVuY3Rpb24odCl7cmV0dXJue2w6XCJMXCIsYzpcIkNcIix4OlwielwiLHQ6XCJtXCIscjpcImxcIix2OlwiY1wifVt0XXx8XCJNXCJ9KStcInpcIn0sYS5rKWZvcih2YXIgcyBpbiBhLmspYVtBXShzKSYmKGUuZ2x5cGhzW25dLmtbc109YS5rW3NdKX19cmV0dXJuIHR9LE4uZ2V0Rm9udD1mdW5jdGlvbih0LHIsaSxuKXtpZihuPW58fFwibm9ybWFsXCIsaT1pfHxcIm5vcm1hbFwiLHI9K3J8fHtub3JtYWw6NDAwLGJvbGQ6NzAwLGxpZ2h0ZXI6MzAwLGJvbGRlcjo4MDB9W3JdfHw0MDAsZS5mb250cyl7dmFyIGE9ZS5mb250c1t0XTtpZighYSl7dmFyIHM9bmV3IFJlZ0V4cChcIihefFxcXFxzKVwiK3QucmVwbGFjZSgvW15cXHdcXGRcXHMrIX4uOl8tXS9nLFIpK1wiKFxcXFxzfCQpXCIsXCJpXCIpO2Zvcih2YXIgbyBpbiBlLmZvbnRzKWlmKGUuZm9udHNbQV0obykmJnMudGVzdChvKSl7YT1lLmZvbnRzW29dO2JyZWFrfX12YXIgbDtpZihhKWZvcih2YXIgaD0wLHU9YS5sZW5ndGg7aDx1JiYobD1hW2hdLGwuZmFjZVtcImZvbnQtd2VpZ2h0XCJdIT1yfHxsLmZhY2VbXCJmb250LXN0eWxlXCJdIT1pJiZsLmZhY2VbXCJmb250LXN0eWxlXCJdfHxsLmZhY2VbXCJmb250LXN0cmV0Y2hcIl0hPW4pO2grKyk7cmV0dXJuIGx9fSxOLnByaW50PWZ1bmN0aW9uKHQscixpLG4sYSxzLG8sbCl7cz1zfHxcIm1pZGRsZVwiLG89VyhHKG98fDAsMSksLTEpLGw9VyhHKGx8fDEsMyksMSk7dmFyIGg9SShpKVtxXShSKSx1PTAsYz0wLGY9UixwO2lmKGUuaXMobixcInN0cmluZ1wiKSYmKG49dGhpcy5nZXRGb250KG4pKSxuKXtwPShhfHwxNikvbi5mYWNlW1widW5pdHMtcGVyLWVtXCJdO2Zvcih2YXIgZD1uLmZhY2UuYmJveFtxXShrKSxnPStkWzBdLHY9ZFszXS1kWzFdLHg9MCx5PStkWzFdKyhcImJhc2VsaW5lXCI9PXM/disgK24uZmFjZS5kZXNjZW50OnYvMiksbT0wLGI9aC5sZW5ndGg7bTxiO20rKyl7aWYoXCJcXG5cIj09aFttXSl1PTAsdz0wLGM9MCx4Kz12Kmw7ZWxzZXt2YXIgXz1jJiZuLmdseXBoc1toW20tMV1dfHx7fSx3PW4uZ2x5cGhzW2hbbV1dO3UrPWM/KF8ud3x8bi53KSsoXy5rJiZfLmtbaFttXV18fDApK24udypvOjAsYz0xfXcmJncuZCYmKGYrPWUudHJhbnNmb3JtUGF0aCh3LmQsW1widFwiLHUqcCx4KnAsXCJzXCIscCxwLGcseSxcInRcIiwodC1nKS9wLChyLXkpL3BdKSl9fXJldHVybiB0aGlzLnBhdGgoZikuYXR0cih7ZmlsbDpcIiMwMDBcIixzdHJva2U6XCJub25lXCJ9KX0sTi5hZGQ9ZnVuY3Rpb24odCl7aWYoZS5pcyh0LFwiYXJyYXlcIikpZm9yKHZhciByPXRoaXMuc2V0KCksaT0wLG49dC5sZW5ndGgsYTtpPG47aSsrKWE9dFtpXXx8e30sQltBXShhLnR5cGUpJiZyLnB1c2godGhpc1thLnR5cGVdKCkuYXR0cihhKSk7cmV0dXJuIHJ9LGUuZm9ybWF0PWZ1bmN0aW9uKHQscil7dmFyIGk9ZS5pcyhyLFEpP1swXVtQXShyKTphcmd1bWVudHM7cmV0dXJuIHQmJmUuaXModCxaKSYmaS5sZW5ndGgtMSYmKHQ9dC5yZXBsYWNlKEMsZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09aVsrK2VdP1I6aVtlXX0pKSx0fHxSfSxlLmZ1bGxmaWxsPWZ1bmN0aW9uKCl7dmFyIHQ9L1xceyhbXlxcfV0rKVxcfS9nLGU9Lyg/Oig/Ol58XFwuKSguKz8pKD89XFxbfFxcLnwkfFxcKCl8XFxbKCd8XCIpKC4rPylcXDJcXF0pKFxcKFxcKSk/L2cscj1mdW5jdGlvbih0LHIsaSl7dmFyIG49aTtyZXR1cm4gci5yZXBsYWNlKGUsZnVuY3Rpb24odCxlLHIsaSxhKXtlPWV8fGksbiYmKGUgaW4gbiYmKG49bltlXSksXCJmdW5jdGlvblwiPT10eXBlb2YgbiYmYSYmKG49bigpKSl9KSxuPShudWxsPT1ufHxuPT1pP3Q6bikrXCJcIn07cmV0dXJuIGZ1bmN0aW9uKGUsaSl7cmV0dXJuIFN0cmluZyhlKS5yZXBsYWNlKHQsZnVuY3Rpb24odCxlKXtyZXR1cm4gcih0LGUsaSl9KX19KCksZS5uaW5qYT1mdW5jdGlvbigpe2lmKEUud2FzKVQud2luLlJhcGhhZWw9RS5pcztlbHNle3dpbmRvdy5SYXBoYWVsPXZvaWQgMDt0cnl7ZGVsZXRlIHdpbmRvdy5SYXBoYWVsfWNhdGNoKHQpe319cmV0dXJuIGV9LGUuc3Q9UGUsdC5vbihcInJhcGhhZWwuRE9NbG9hZFwiLGZ1bmN0aW9uKCl7dz0hMH0pLGZ1bmN0aW9uKHQscixpKXtmdW5jdGlvbiBuKCl7L2luLy50ZXN0KHQucmVhZHlTdGF0ZSk/c2V0VGltZW91dChuLDkpOmUuZXZlKFwicmFwaGFlbC5ET01sb2FkXCIpfW51bGw9PXQucmVhZHlTdGF0ZSYmdC5hZGRFdmVudExpc3RlbmVyJiYodC5hZGRFdmVudExpc3RlbmVyKHIsaT1mdW5jdGlvbigpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihyLGksITEpLHQucmVhZHlTdGF0ZT1cImNvbXBsZXRlXCJ9LCExKSx0LnJlYWR5U3RhdGU9XCJsb2FkaW5nXCIpLG4oKX0oZG9jdW1lbnQsXCJET01Db250ZW50TG9hZGVkXCIpLGV9LmFwcGx5KGUsaSksISh2b2lkIDAhPT1uJiYodC5leHBvcnRzPW4pKX0sZnVuY3Rpb24odCxlLHIpe3ZhciBpLG47IWZ1bmN0aW9uKHIpe3ZhciBhPVwiMC41LjBcIixzPVwiaGFzT3duUHJvcGVydHlcIixvPS9bXFwuXFwvXS8sbD0vXFxzKixcXHMqLyxoPVwiKlwiLHU9ZnVuY3Rpb24oKXt9LGM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSxmLHAsZD17bjp7fX0sZz1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9dGhpcy5sZW5ndGg7dDxlO3QrKylpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgdGhpc1t0XSlyZXR1cm4gdGhpc1t0XX0sdj1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmxlbmd0aDstLXQ7KWlmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiB0aGlzW3RdKXJldHVybiB0aGlzW3RdfSx4PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcseT1TdHJpbmcsbT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEFycmF5fHxcIltvYmplY3QgQXJyYXldXCI9PXguY2FsbCh0KX07ZXZlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZCxpPXAsbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMiksYT1ldmUubGlzdGVuZXJzKHQpLHM9MCxvPSExLGwsaD1bXSx1PXt9LHg9W10seT1mLG09W107eC5maXJzdERlZmluZWQ9Zyx4Lmxhc3REZWZpbmVkPXYsZj10LHA9MDtmb3IodmFyIGI9MCxfPWEubGVuZ3RoO2I8XztiKyspXCJ6SW5kZXhcImluIGFbYl0mJihoLnB1c2goYVtiXS56SW5kZXgpLGFbYl0uekluZGV4PDAmJih1W2FbYl0uekluZGV4XT1hW2JdKSk7Zm9yKGguc29ydChjKTtoW3NdPDA7KWlmKGw9dVtoW3MrK11dLHgucHVzaChsLmFwcGx5KGUsbikpLHApcmV0dXJuIHA9aSx4O2ZvcihiPTA7YjxfO2IrKylpZihsPWFbYl0sXCJ6SW5kZXhcImluIGwpaWYobC56SW5kZXg9PWhbc10pe2lmKHgucHVzaChsLmFwcGx5KGUsbikpLHApYnJlYWs7ZG8gaWYocysrLGw9dVtoW3NdXSxsJiZ4LnB1c2gobC5hcHBseShlLG4pKSxwKWJyZWFrO3doaWxlKGwpfWVsc2UgdVtsLnpJbmRleF09bDtlbHNlIGlmKHgucHVzaChsLmFwcGx5KGUsbikpLHApYnJlYWs7cmV0dXJuIHA9aSxmPXkseH0sZXZlLl9ldmVudHM9ZCxldmUubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlPW0odCk/dDp0LnNwbGl0KG8pLHI9ZCxpLG4sYSxzLGwsdSxjLGYscD1bcl0sZz1bXTtmb3Iocz0wLGw9ZS5sZW5ndGg7czxsO3MrKyl7Zm9yKGY9W10sdT0wLGM9cC5sZW5ndGg7dTxjO3UrKylmb3Iocj1wW3VdLm4sbj1bcltlW3NdXSxyW2hdXSxhPTI7YS0tOylpPW5bYV0saSYmKGYucHVzaChpKSxnPWcuY29uY2F0KGkuZnx8W10pKTtwPWZ9cmV0dXJuIGd9LGV2ZS5zZXBhcmF0b3I9ZnVuY3Rpb24odCl7dD8odD15KHQpLnJlcGxhY2UoLyg/PVtcXC5cXF5cXF1cXFtcXC1dKS9nLFwiXFxcXFwiKSx0PVwiW1wiK3QrXCJdXCIsbz1uZXcgUmVnRXhwKHQpKTpvPS9bXFwuXFwvXS99LGV2ZS5vbj1mdW5jdGlvbih0LGUpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUpcmV0dXJuIGZ1bmN0aW9uKCl7fTtmb3IodmFyIHI9bSh0KT9tKHRbMF0pP3Q6W3RdOnkodCkuc3BsaXQobCksaT0wLG49ci5sZW5ndGg7aTxuO2krKykhZnVuY3Rpb24odCl7Zm9yKHZhciByPW0odCk/dDp5KHQpLnNwbGl0KG8pLGk9ZCxuLGE9MCxzPXIubGVuZ3RoO2E8czthKyspaT1pLm4saT1pLmhhc093blByb3BlcnR5KHJbYV0pJiZpW3JbYV1dfHwoaVtyW2FdXT17bjp7fX0pO2ZvcihpLmY9aS5mfHxbXSxhPTAscz1pLmYubGVuZ3RoO2E8czthKyspaWYoaS5mW2FdPT1lKXtuPSEwO2JyZWFrfSFuJiZpLmYucHVzaChlKX0ocltpXSk7cmV0dXJuIGZ1bmN0aW9uKHQpeyt0PT0rdCYmKGUuekluZGV4PSt0KX19LGV2ZS5mPWZ1bmN0aW9uKHQpe3ZhciBlPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe2V2ZS5hcHBseShudWxsLFt0LG51bGxdLmNvbmNhdChlKS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpKX19LGV2ZS5zdG9wPWZ1bmN0aW9uKCl7cD0xfSxldmUubnQ9ZnVuY3Rpb24odCl7dmFyIGU9bShmKT9mLmpvaW4oXCIuXCIpOmY7cmV0dXJuIHQ/bmV3IFJlZ0V4cChcIig/OlxcXFwufFxcXFwvfF4pXCIrdCtcIig/OlxcXFwufFxcXFwvfCQpXCIpLnRlc3QoZSk6ZX0sZXZlLm50cz1mdW5jdGlvbigpe3JldHVybiBtKGYpP2Y6Zi5zcGxpdChvKX0sZXZlLm9mZj1ldmUudW5iaW5kPWZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuIHZvaWQoZXZlLl9ldmVudHM9ZD17bjp7fX0pO3ZhciByPW0odCk/bSh0WzBdKT90Olt0XTp5KHQpLnNwbGl0KGwpO2lmKHIubGVuZ3RoPjEpZm9yKHZhciBpPTAsbj1yLmxlbmd0aDtpPG47aSsrKWV2ZS5vZmYocltpXSxlKTtlbHNle3I9bSh0KT90OnkodCkuc3BsaXQobyk7dmFyIGEsdSxjLGksbixmLHAsZz1bZF07Zm9yKGk9MCxuPXIubGVuZ3RoO2k8bjtpKyspZm9yKGY9MDtmPGcubGVuZ3RoO2YrPWMubGVuZ3RoLTIpe2lmKGM9W2YsMV0sYT1nW2ZdLm4scltpXSE9aClhW3JbaV1dJiZjLnB1c2goYVtyW2ldXSk7ZWxzZSBmb3IodSBpbiBhKWFbc10odSkmJmMucHVzaChhW3VdKTtnLnNwbGljZS5hcHBseShnLGMpfWZvcihpPTAsbj1nLmxlbmd0aDtpPG47aSsrKWZvcihhPWdbaV07YS5uOyl7aWYoZSl7aWYoYS5mKXtmb3IoZj0wLHA9YS5mLmxlbmd0aDtmPHA7ZisrKWlmKGEuZltmXT09ZSl7YS5mLnNwbGljZShmLDEpO2JyZWFrfSFhLmYubGVuZ3RoJiZkZWxldGUgYS5mfWZvcih1IGluIGEubilpZihhLm5bc10odSkmJmEublt1XS5mKXt2YXIgdj1hLm5bdV0uZjtmb3IoZj0wLHA9di5sZW5ndGg7ZjxwO2YrKylpZih2W2ZdPT1lKXt2LnNwbGljZShmLDEpO2JyZWFrfSF2Lmxlbmd0aCYmZGVsZXRlIGEublt1XS5mfX1lbHNle2RlbGV0ZSBhLmY7Zm9yKHUgaW4gYS5uKWEubltzXSh1KSYmYS5uW3VdLmYmJmRlbGV0ZSBhLm5bdV0uZn1hPWEubn19fSxldmUub25jZT1mdW5jdGlvbih0LGUpe3ZhciByPWZ1bmN0aW9uKCl7cmV0dXJuIGV2ZS5vZmYodCxyKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07cmV0dXJuIGV2ZS5vbih0LHIpfSxldmUudmVyc2lvbj1hLGV2ZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiWW91IGFyZSBydW5uaW5nIEV2ZSBcIithfSxcInVuZGVmaW5lZFwiIT10eXBlb2YgdCYmdC5leHBvcnRzP3QuZXhwb3J0cz1ldmU6KGk9W10sbj1mdW5jdGlvbigpe3JldHVybiBldmV9LmFwcGx5KGUsaSksISh2b2lkIDAhPT1uJiYodC5leHBvcnRzPW4pKSl9KHRoaXMpfSxmdW5jdGlvbih0LGUscil7dmFyIGksbjtpPVtyKDEpXSxuPWZ1bmN0aW9uKHQpe2lmKCF0fHx0LnN2Zyl7dmFyIGU9XCJoYXNPd25Qcm9wZXJ0eVwiLHI9U3RyaW5nLGk9cGFyc2VGbG9hdCxuPXBhcnNlSW50LGE9TWF0aCxzPWEubWF4LG89YS5hYnMsbD1hLnBvdyxoPS9bLCBdKy8sdT10LmV2ZSxjPVwiXCIsZj1cIiBcIixwPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLGQ9e2Jsb2NrOlwiTTUsMCAwLDIuNSA1LDV6XCIsY2xhc3NpYzpcIk01LDAgMCwyLjUgNSw1IDMuNSwzIDMuNSwyelwiLGRpYW1vbmQ6XCJNMi41LDAgNSwyLjUgMi41LDUgMCwyLjV6XCIsb3BlbjpcIk02LDEgMSwzLjUgNiw2XCIsb3ZhbDpcIk0yLjUsMEEyLjUsMi41LDAsMCwxLDIuNSw1IDIuNSwyLjUsMCwwLDEsMi41LDB6XCJ9LGc9e307dC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiWW91ciBicm93c2VyIHN1cHBvcnRzIFNWRy5cXG5Zb3UgYXJlIHJ1bm5pbmcgUmFwaGHDq2wgXCIrdGhpcy52ZXJzaW9ufTt2YXIgdj1mdW5jdGlvbihpLG4pe2lmKG4pe1wic3RyaW5nXCI9PXR5cGVvZiBpJiYoaT12KGkpKTtmb3IodmFyIGEgaW4gbiluW2VdKGEpJiYoXCJ4bGluazpcIj09YS5zdWJzdHJpbmcoMCw2KT9pLnNldEF0dHJpYnV0ZU5TKHAsYS5zdWJzdHJpbmcoNikscihuW2FdKSk6aS5zZXRBdHRyaWJ1dGUoYSxyKG5bYV0pKSl9ZWxzZSBpPXQuX2cuZG9jLmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsaSksaS5zdHlsZSYmKGkuc3R5bGUud2Via2l0VGFwSGlnaGxpZ2h0Q29sb3I9XCJyZ2JhKDAsMCwwLDApXCIpO3JldHVybiBpfSx4PWZ1bmN0aW9uKGUsbil7dmFyIGg9XCJsaW5lYXJcIix1PWUuaWQrbixmPS41LHA9LjUsZD1lLm5vZGUsZz1lLnBhcGVyLHg9ZC5zdHlsZSx5PXQuX2cuZG9jLmdldEVsZW1lbnRCeUlkKHUpO2lmKCF5KXtpZihuPXIobikucmVwbGFjZSh0Ll9yYWRpYWxfZ3JhZGllbnQsZnVuY3Rpb24odCxlLHIpe2lmKGg9XCJyYWRpYWxcIixlJiZyKXtmPWkoZSkscD1pKHIpO3ZhciBuPTIqKHA+LjUpLTE7bChmLS41LDIpK2wocC0uNSwyKT4uMjUmJihwPWEuc3FydCguMjUtbChmLS41LDIpKSpuKy41KSYmLjUhPXAmJihwPXAudG9GaXhlZCg1KS0xZS01Km4pfXJldHVybiBjfSksbj1uLnNwbGl0KC9cXHMqXFwtXFxzKi8pLFwibGluZWFyXCI9PWgpe3ZhciBiPW4uc2hpZnQoKTtpZihiPS1pKGIpLGlzTmFOKGIpKXJldHVybiBudWxsO3ZhciBfPVswLDAsYS5jb3ModC5yYWQoYikpLGEuc2luKHQucmFkKGIpKV0sdz0xLyhzKG8oX1syXSksbyhfWzNdKSl8fDEpO19bMl0qPXcsX1szXSo9dyxfWzJdPDAmJihfWzBdPS1fWzJdLF9bMl09MCksX1szXTwwJiYoX1sxXT0tX1szXSxfWzNdPTApfXZhciBrPXQuX3BhcnNlRG90cyhuKTtpZighaylyZXR1cm4gbnVsbDtpZih1PXUucmVwbGFjZSgvW1xcKFxcKVxccyxcXHhiMCNdL2csXCJfXCIpLGUuZ3JhZGllbnQmJnUhPWUuZ3JhZGllbnQuaWQmJihnLmRlZnMucmVtb3ZlQ2hpbGQoZS5ncmFkaWVudCksZGVsZXRlIGUuZ3JhZGllbnQpLCFlLmdyYWRpZW50KXt5PXYoaCtcIkdyYWRpZW50XCIse2lkOnV9KSxlLmdyYWRpZW50PXksdih5LFwicmFkaWFsXCI9PWg/e2Z4OmYsZnk6cH06e3gxOl9bMF0seTE6X1sxXSx4MjpfWzJdLHkyOl9bM10sZ3JhZGllbnRUcmFuc2Zvcm06ZS5tYXRyaXguaW52ZXJ0KCl9KSxnLmRlZnMuYXBwZW5kQ2hpbGQoeSk7Zm9yKHZhciBCPTAsQz1rLmxlbmd0aDtCPEM7QisrKXkuYXBwZW5kQ2hpbGQodihcInN0b3BcIix7b2Zmc2V0OmtbQl0ub2Zmc2V0P2tbQl0ub2Zmc2V0OkI/XCIxMDAlXCI6XCIwJVwiLFwic3RvcC1jb2xvclwiOmtbQl0uY29sb3J8fFwiI2ZmZlwiLFwic3RvcC1vcGFjaXR5XCI6aXNGaW5pdGUoa1tCXS5vcGFjaXR5KT9rW0JdLm9wYWNpdHk6MX0pKX19cmV0dXJuIHYoZCx7ZmlsbDptKHUpLG9wYWNpdHk6MSxcImZpbGwtb3BhY2l0eVwiOjF9KSx4LmZpbGw9Yyx4Lm9wYWNpdHk9MSx4LmZpbGxPcGFjaXR5PTEsMX0seT1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmRvY3VtZW50TW9kZTtyZXR1cm4gdCYmKDk9PT10fHwxMD09PXQpfSxtPWZ1bmN0aW9uKHQpe2lmKHkoKSlyZXR1cm5cInVybCgnI1wiK3QrXCInKVwiO3ZhciBlPWRvY3VtZW50LmxvY2F0aW9uLHI9ZS5wcm90b2NvbCtcIi8vXCIrZS5ob3N0K2UucGF0aG5hbWUrZS5zZWFyY2g7cmV0dXJuXCJ1cmwoJ1wiK3IrXCIjXCIrdCtcIicpXCJ9LGI9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRCQm94KDEpO3YodC5wYXR0ZXJuLHtwYXR0ZXJuVHJhbnNmb3JtOnQubWF0cml4LmludmVydCgpK1wiIHRyYW5zbGF0ZShcIitlLngrXCIsXCIrZS55K1wiKVwifSl9LF89ZnVuY3Rpb24oaSxuLGEpe2lmKFwicGF0aFwiPT1pLnR5cGUpe2Zvcih2YXIgcz1yKG4pLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCItXCIpLG89aS5wYXBlcixsPWE/XCJlbmRcIjpcInN0YXJ0XCIsaD1pLm5vZGUsdT1pLmF0dHJzLGY9dVtcInN0cm9rZS13aWR0aFwiXSxwPXMubGVuZ3RoLHg9XCJjbGFzc2ljXCIseSxtLGIsXyx3LGs9MyxCPTMsQz01O3AtLTspc3dpdGNoKHNbcF0pe2Nhc2VcImJsb2NrXCI6Y2FzZVwiY2xhc3NpY1wiOmNhc2VcIm92YWxcIjpjYXNlXCJkaWFtb25kXCI6Y2FzZVwib3BlblwiOmNhc2VcIm5vbmVcIjp4PXNbcF07YnJlYWs7Y2FzZVwid2lkZVwiOkI9NTticmVhaztjYXNlXCJuYXJyb3dcIjpCPTI7YnJlYWs7Y2FzZVwibG9uZ1wiOms9NTticmVhaztjYXNlXCJzaG9ydFwiOms9Mn1pZihcIm9wZW5cIj09eD8oays9MixCKz0yLEMrPTIsYj0xLF89YT80OjEsdz17ZmlsbDpcIm5vbmVcIixzdHJva2U6dS5zdHJva2V9KTooXz1iPWsvMix3PXtmaWxsOnUuc3Ryb2tlLHN0cm9rZTpcIm5vbmVcIn0pLGkuXy5hcnJvd3M/YT8oaS5fLmFycm93cy5lbmRQYXRoJiZnW2kuXy5hcnJvd3MuZW5kUGF0aF0tLSxpLl8uYXJyb3dzLmVuZE1hcmtlciYmZ1tpLl8uYXJyb3dzLmVuZE1hcmtlcl0tLSk6KGkuXy5hcnJvd3Muc3RhcnRQYXRoJiZnW2kuXy5hcnJvd3Muc3RhcnRQYXRoXS0tLGkuXy5hcnJvd3Muc3RhcnRNYXJrZXImJmdbaS5fLmFycm93cy5zdGFydE1hcmtlcl0tLSk6aS5fLmFycm93cz17fSxcIm5vbmVcIiE9eCl7dmFyIFM9XCJyYXBoYWVsLW1hcmtlci1cIit4LEE9XCJyYXBoYWVsLW1hcmtlci1cIitsK3graytCK1wiLW9ialwiK2kuaWQ7dC5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQoUyk/Z1tTXSsrOihvLmRlZnMuYXBwZW5kQ2hpbGQodih2KFwicGF0aFwiKSx7XCJzdHJva2UtbGluZWNhcFwiOlwicm91bmRcIixkOmRbeF0saWQ6U30pKSxnW1NdPTEpO3ZhciBUPXQuX2cuZG9jLmdldEVsZW1lbnRCeUlkKEEpLEU7VD8oZ1tBXSsrLEU9VC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInVzZVwiKVswXSk6KFQ9dih2KFwibWFya2VyXCIpLHtpZDpBLG1hcmtlckhlaWdodDpCLG1hcmtlcldpZHRoOmssb3JpZW50OlwiYXV0b1wiLHJlZlg6XyxyZWZZOkIvMn0pLEU9dih2KFwidXNlXCIpLHtcInhsaW5rOmhyZWZcIjpcIiNcIitTLHRyYW5zZm9ybTooYT9cInJvdGF0ZSgxODAgXCIray8yK1wiIFwiK0IvMitcIikgXCI6YykrXCJzY2FsZShcIitrL0MrXCIsXCIrQi9DK1wiKVwiLFwic3Ryb2tlLXdpZHRoXCI6KDEvKChrL0MrQi9DKS8yKSkudG9GaXhlZCg0KX0pLFQuYXBwZW5kQ2hpbGQoRSksby5kZWZzLmFwcGVuZENoaWxkKFQpLGdbQV09MSksdihFLHcpO3ZhciBNPWIqKFwiZGlhbW9uZFwiIT14JiZcIm92YWxcIiE9eCk7YT8oeT1pLl8uYXJyb3dzLnN0YXJ0ZHgqZnx8MCxtPXQuZ2V0VG90YWxMZW5ndGgodS5wYXRoKS1NKmYpOih5PU0qZixtPXQuZ2V0VG90YWxMZW5ndGgodS5wYXRoKS0oaS5fLmFycm93cy5lbmRkeCpmfHwwKSksdz17fSx3W1wibWFya2VyLVwiK2xdPVwidXJsKCNcIitBK1wiKVwiLChtfHx5KSYmKHcuZD10LmdldFN1YnBhdGgodS5wYXRoLHksbSkpLHYoaCx3KSxpLl8uYXJyb3dzW2wrXCJQYXRoXCJdPVMsaS5fLmFycm93c1tsK1wiTWFya2VyXCJdPUEsaS5fLmFycm93c1tsK1wiZHhcIl09TSxpLl8uYXJyb3dzW2wrXCJUeXBlXCJdPXgsaS5fLmFycm93c1tsK1wiU3RyaW5nXCJdPW59ZWxzZSBhPyh5PWkuXy5hcnJvd3Muc3RhcnRkeCpmfHwwLG09dC5nZXRUb3RhbExlbmd0aCh1LnBhdGgpLXkpOih5PTAsbT10LmdldFRvdGFsTGVuZ3RoKHUucGF0aCktKGkuXy5hcnJvd3MuZW5kZHgqZnx8MCkpLGkuXy5hcnJvd3NbbCtcIlBhdGhcIl0mJnYoaCx7ZDp0LmdldFN1YnBhdGgodS5wYXRoLHksbSl9KSxkZWxldGUgaS5fLmFycm93c1tsK1wiUGF0aFwiXSxkZWxldGUgaS5fLmFycm93c1tsK1wiTWFya2VyXCJdLGRlbGV0ZSBpLl8uYXJyb3dzW2wrXCJkeFwiXSxkZWxldGUgaS5fLmFycm93c1tsK1wiVHlwZVwiXSxkZWxldGUgaS5fLmFycm93c1tsK1wiU3RyaW5nXCJdO2Zvcih3IGluIGcpaWYoZ1tlXSh3KSYmIWdbd10pe3ZhciBOPXQuX2cuZG9jLmdldEVsZW1lbnRCeUlkKHcpO04mJk4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChOKX19fSx3PXtcIi1cIjpbMywxXSxcIi5cIjpbMSwxXSxcIi0uXCI6WzMsMSwxLDFdLFwiLS4uXCI6WzMsMSwxLDEsMSwxXSxcIi4gXCI6WzEsM10sXCItIFwiOls0LDNdLFwiLS1cIjpbOCwzXSxcIi0gLlwiOls0LDMsMSwzXSxcIi0tLlwiOls4LDMsMSwzXSxcIi0tLi5cIjpbOCwzLDEsMywxLDNdfSxrPWZ1bmN0aW9uKHQsZSxpKXtpZihlPXdbcihlKS50b0xvd2VyQ2FzZSgpXSl7Zm9yKHZhciBuPXQuYXR0cnNbXCJzdHJva2Utd2lkdGhcIl18fFwiMVwiLGE9e3JvdW5kOm4sc3F1YXJlOm4sYnV0dDowfVt0LmF0dHJzW1wic3Ryb2tlLWxpbmVjYXBcIl18fGlbXCJzdHJva2UtbGluZWNhcFwiXV18fDAscz1bXSxvPWUubGVuZ3RoO28tLTspc1tvXT1lW29dKm4rKG8lMj8xOi0xKSphO3YodC5ub2RlLHtcInN0cm9rZS1kYXNoYXJyYXlcIjpzLmpvaW4oXCIsXCIpfSl9ZWxzZSB2KHQubm9kZSx7XCJzdHJva2UtZGFzaGFycmF5XCI6XCJub25lXCJ9KX0sQj1mdW5jdGlvbihpLGEpe3ZhciBsPWkubm9kZSx1PWkuYXR0cnMsZj1sLnN0eWxlLnZpc2liaWxpdHk7bC5zdHlsZS52aXNpYmlsaXR5PVwiaGlkZGVuXCI7Zm9yKHZhciBkIGluIGEpaWYoYVtlXShkKSl7aWYoIXQuX2F2YWlsYWJsZUF0dHJzW2VdKGQpKWNvbnRpbnVlO3ZhciBnPWFbZF07c3dpdGNoKHVbZF09ZyxkKXtjYXNlXCJibHVyXCI6aS5ibHVyKGcpO2JyZWFrO2Nhc2VcInRpdGxlXCI6dmFyIHk9bC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRpdGxlXCIpO2lmKHkubGVuZ3RoJiYoeT15WzBdKSl5LmZpcnN0Q2hpbGQubm9kZVZhbHVlPWc7ZWxzZXt5PXYoXCJ0aXRsZVwiKTt2YXIgbT10Ll9nLmRvYy5jcmVhdGVUZXh0Tm9kZShnKTt5LmFwcGVuZENoaWxkKG0pLGwuYXBwZW5kQ2hpbGQoeSl9YnJlYWs7Y2FzZVwiaHJlZlwiOmNhc2VcInRhcmdldFwiOnZhciB3PWwucGFyZW50Tm9kZTtpZihcImFcIiE9dy50YWdOYW1lLnRvTG93ZXJDYXNlKCkpe3ZhciBCPXYoXCJhXCIpO3cuaW5zZXJ0QmVmb3JlKEIsbCksQi5hcHBlbmRDaGlsZChsKSx3PUJ9XCJ0YXJnZXRcIj09ZD93LnNldEF0dHJpYnV0ZU5TKHAsXCJzaG93XCIsXCJibGFua1wiPT1nP1wibmV3XCI6Zyk6dy5zZXRBdHRyaWJ1dGVOUyhwLGQsZyk7YnJlYWs7Y2FzZVwiY3Vyc29yXCI6bC5zdHlsZS5jdXJzb3I9ZzticmVhaztjYXNlXCJ0cmFuc2Zvcm1cIjppLnRyYW5zZm9ybShnKTticmVhaztjYXNlXCJhcnJvdy1zdGFydFwiOl8oaSxnKTticmVhaztjYXNlXCJhcnJvdy1lbmRcIjpfKGksZywxKTticmVhaztjYXNlXCJjbGlwLXJlY3RcIjp2YXIgQz1yKGcpLnNwbGl0KGgpO2lmKDQ9PUMubGVuZ3RoKXtpLmNsaXAmJmkuY2xpcC5wYXJlbnROb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaS5jbGlwLnBhcmVudE5vZGUpO3ZhciBBPXYoXCJjbGlwUGF0aFwiKSxUPXYoXCJyZWN0XCIpO0EuaWQ9dC5jcmVhdGVVVUlEKCksdihULHt4OkNbMF0seTpDWzFdLHdpZHRoOkNbMl0saGVpZ2h0OkNbM119KSxBLmFwcGVuZENoaWxkKFQpLGkucGFwZXIuZGVmcy5hcHBlbmRDaGlsZChBKSx2KGwse1wiY2xpcC1wYXRoXCI6XCJ1cmwoI1wiK0EuaWQrXCIpXCJ9KSxpLmNsaXA9VH1pZighZyl7dmFyIEU9bC5nZXRBdHRyaWJ1dGUoXCJjbGlwLXBhdGhcIik7aWYoRSl7dmFyIE09dC5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQoRS5yZXBsYWNlKC8oXnVybFxcKCN8XFwpJCkvZyxjKSk7TSYmTS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKE0pLHYobCx7XCJjbGlwLXBhdGhcIjpjfSksZGVsZXRlIGkuY2xpcH19YnJlYWs7Y2FzZVwicGF0aFwiOlwicGF0aFwiPT1pLnR5cGUmJih2KGwse2Q6Zz91LnBhdGg9dC5fcGF0aFRvQWJzb2x1dGUoZyk6XCJNMCwwXCJ9KSxpLl8uZGlydHk9MSxpLl8uYXJyb3dzJiYoXCJzdGFydFN0cmluZ1wiaW4gaS5fLmFycm93cyYmXyhpLGkuXy5hcnJvd3Muc3RhcnRTdHJpbmcpLFwiZW5kU3RyaW5nXCJpbiBpLl8uYXJyb3dzJiZfKGksaS5fLmFycm93cy5lbmRTdHJpbmcsMSkpKTticmVhaztjYXNlXCJ3aWR0aFwiOmlmKGwuc2V0QXR0cmlidXRlKGQsZyksaS5fLmRpcnR5PTEsIXUuZngpYnJlYWs7ZD1cInhcIixnPXUueDtjYXNlXCJ4XCI6dS5meCYmKGc9LXUueC0odS53aWR0aHx8MCkpO2Nhc2VcInJ4XCI6aWYoXCJyeFwiPT1kJiZcInJlY3RcIj09aS50eXBlKWJyZWFrO2Nhc2VcImN4XCI6bC5zZXRBdHRyaWJ1dGUoZCxnKSxpLnBhdHRlcm4mJmIoaSksaS5fLmRpcnR5PTE7YnJlYWs7Y2FzZVwiaGVpZ2h0XCI6aWYobC5zZXRBdHRyaWJ1dGUoZCxnKSxpLl8uZGlydHk9MSwhdS5meSlicmVhaztkPVwieVwiLGc9dS55O2Nhc2VcInlcIjp1LmZ5JiYoZz0tdS55LSh1LmhlaWdodHx8MCkpO2Nhc2VcInJ5XCI6aWYoXCJyeVwiPT1kJiZcInJlY3RcIj09aS50eXBlKWJyZWFrO2Nhc2VcImN5XCI6bC5zZXRBdHRyaWJ1dGUoZCxnKSxpLnBhdHRlcm4mJmIoaSksaS5fLmRpcnR5PTE7YnJlYWs7Y2FzZVwiclwiOlwicmVjdFwiPT1pLnR5cGU/dihsLHtyeDpnLHJ5Omd9KTpsLnNldEF0dHJpYnV0ZShkLGcpLGkuXy5kaXJ0eT0xO2JyZWFrO2Nhc2VcInNyY1wiOlwiaW1hZ2VcIj09aS50eXBlJiZsLnNldEF0dHJpYnV0ZU5TKHAsXCJocmVmXCIsZyk7YnJlYWs7Y2FzZVwic3Ryb2tlLXdpZHRoXCI6MT09aS5fLnN4JiYxPT1pLl8uc3l8fChnLz1zKG8oaS5fLnN4KSxvKGkuXy5zeSkpfHwxKSxsLnNldEF0dHJpYnV0ZShkLGcpLHVbXCJzdHJva2UtZGFzaGFycmF5XCJdJiZrKGksdVtcInN0cm9rZS1kYXNoYXJyYXlcIl0sYSksXG5pLl8uYXJyb3dzJiYoXCJzdGFydFN0cmluZ1wiaW4gaS5fLmFycm93cyYmXyhpLGkuXy5hcnJvd3Muc3RhcnRTdHJpbmcpLFwiZW5kU3RyaW5nXCJpbiBpLl8uYXJyb3dzJiZfKGksaS5fLmFycm93cy5lbmRTdHJpbmcsMSkpO2JyZWFrO2Nhc2VcInN0cm9rZS1kYXNoYXJyYXlcIjprKGksZyxhKTticmVhaztjYXNlXCJmaWxsXCI6dmFyIE49cihnKS5tYXRjaCh0Ll9JU1VSTCk7aWYoTil7QT12KFwicGF0dGVyblwiKTt2YXIgTD12KFwiaW1hZ2VcIik7QS5pZD10LmNyZWF0ZVVVSUQoKSx2KEEse3g6MCx5OjAscGF0dGVyblVuaXRzOlwidXNlclNwYWNlT25Vc2VcIixoZWlnaHQ6MSx3aWR0aDoxfSksdihMLHt4OjAseTowLFwieGxpbms6aHJlZlwiOk5bMV19KSxBLmFwcGVuZENoaWxkKEwpLGZ1bmN0aW9uKGUpe3QuX3ByZWxvYWQoTlsxXSxmdW5jdGlvbigpe3ZhciB0PXRoaXMub2Zmc2V0V2lkdGgscj10aGlzLm9mZnNldEhlaWdodDt2KGUse3dpZHRoOnQsaGVpZ2h0OnJ9KSx2KEwse3dpZHRoOnQsaGVpZ2h0OnJ9KX0pfShBKSxpLnBhcGVyLmRlZnMuYXBwZW5kQ2hpbGQoQSksdihsLHtmaWxsOlwidXJsKCNcIitBLmlkK1wiKVwifSksaS5wYXR0ZXJuPUEsaS5wYXR0ZXJuJiZiKGkpO2JyZWFrfXZhciB6PXQuZ2V0UkdCKGcpO2lmKHouZXJyb3Ipe2lmKChcImNpcmNsZVwiPT1pLnR5cGV8fFwiZWxsaXBzZVwiPT1pLnR5cGV8fFwiclwiIT1yKGcpLmNoYXJBdCgpKSYmeChpLGcpKXtpZihcIm9wYWNpdHlcImluIHV8fFwiZmlsbC1vcGFjaXR5XCJpbiB1KXt2YXIgUD10Ll9nLmRvYy5nZXRFbGVtZW50QnlJZChsLmdldEF0dHJpYnV0ZShcImZpbGxcIikucmVwbGFjZSgvXnVybFxcKCN8XFwpJC9nLGMpKTtpZihQKXt2YXIgRj1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic3RvcFwiKTt2KEZbRi5sZW5ndGgtMV0se1wic3RvcC1vcGFjaXR5XCI6KFwib3BhY2l0eVwiaW4gdT91Lm9wYWNpdHk6MSkqKFwiZmlsbC1vcGFjaXR5XCJpbiB1P3VbXCJmaWxsLW9wYWNpdHlcIl06MSl9KX19dS5ncmFkaWVudD1nLHUuZmlsbD1cIm5vbmVcIjticmVha319ZWxzZSBkZWxldGUgYS5ncmFkaWVudCxkZWxldGUgdS5ncmFkaWVudCwhdC5pcyh1Lm9wYWNpdHksXCJ1bmRlZmluZWRcIikmJnQuaXMoYS5vcGFjaXR5LFwidW5kZWZpbmVkXCIpJiZ2KGwse29wYWNpdHk6dS5vcGFjaXR5fSksIXQuaXModVtcImZpbGwtb3BhY2l0eVwiXSxcInVuZGVmaW5lZFwiKSYmdC5pcyhhW1wiZmlsbC1vcGFjaXR5XCJdLFwidW5kZWZpbmVkXCIpJiZ2KGwse1wiZmlsbC1vcGFjaXR5XCI6dVtcImZpbGwtb3BhY2l0eVwiXX0pO3pbZV0oXCJvcGFjaXR5XCIpJiZ2KGwse1wiZmlsbC1vcGFjaXR5XCI6ei5vcGFjaXR5PjE/ei5vcGFjaXR5LzEwMDp6Lm9wYWNpdHl9KTtjYXNlXCJzdHJva2VcIjp6PXQuZ2V0UkdCKGcpLGwuc2V0QXR0cmlidXRlKGQsei5oZXgpLFwic3Ryb2tlXCI9PWQmJnpbZV0oXCJvcGFjaXR5XCIpJiZ2KGwse1wic3Ryb2tlLW9wYWNpdHlcIjp6Lm9wYWNpdHk+MT96Lm9wYWNpdHkvMTAwOnoub3BhY2l0eX0pLFwic3Ryb2tlXCI9PWQmJmkuXy5hcnJvd3MmJihcInN0YXJ0U3RyaW5nXCJpbiBpLl8uYXJyb3dzJiZfKGksaS5fLmFycm93cy5zdGFydFN0cmluZyksXCJlbmRTdHJpbmdcImluIGkuXy5hcnJvd3MmJl8oaSxpLl8uYXJyb3dzLmVuZFN0cmluZywxKSk7YnJlYWs7Y2FzZVwiZ3JhZGllbnRcIjooXCJjaXJjbGVcIj09aS50eXBlfHxcImVsbGlwc2VcIj09aS50eXBlfHxcInJcIiE9cihnKS5jaGFyQXQoKSkmJngoaSxnKTticmVhaztjYXNlXCJvcGFjaXR5XCI6dS5ncmFkaWVudCYmIXVbZV0oXCJzdHJva2Utb3BhY2l0eVwiKSYmdihsLHtcInN0cm9rZS1vcGFjaXR5XCI6Zz4xP2cvMTAwOmd9KTtjYXNlXCJmaWxsLW9wYWNpdHlcIjppZih1LmdyYWRpZW50KXtQPXQuX2cuZG9jLmdldEVsZW1lbnRCeUlkKGwuZ2V0QXR0cmlidXRlKFwiZmlsbFwiKS5yZXBsYWNlKC9edXJsXFwoI3xcXCkkL2csYykpLFAmJihGPVAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzdG9wXCIpLHYoRltGLmxlbmd0aC0xXSx7XCJzdG9wLW9wYWNpdHlcIjpnfSkpO2JyZWFrfWRlZmF1bHQ6XCJmb250LXNpemVcIj09ZCYmKGc9bihnLDEwKStcInB4XCIpO3ZhciBSPWQucmVwbGFjZSgvKFxcLS4pL2csZnVuY3Rpb24odCl7cmV0dXJuIHQuc3Vic3RyaW5nKDEpLnRvVXBwZXJDYXNlKCl9KTtsLnN0eWxlW1JdPWcsaS5fLmRpcnR5PTEsbC5zZXRBdHRyaWJ1dGUoZCxnKX19UyhpLGEpLGwuc3R5bGUudmlzaWJpbGl0eT1mfSxDPTEuMixTPWZ1bmN0aW9uKGksYSl7aWYoXCJ0ZXh0XCI9PWkudHlwZSYmKGFbZV0oXCJ0ZXh0XCIpfHxhW2VdKFwiZm9udFwiKXx8YVtlXShcImZvbnQtc2l6ZVwiKXx8YVtlXShcInhcIil8fGFbZV0oXCJ5XCIpKSl7dmFyIHM9aS5hdHRycyxvPWkubm9kZSxsPW8uZmlyc3RDaGlsZD9uKHQuX2cuZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoby5maXJzdENoaWxkLGMpLmdldFByb3BlcnR5VmFsdWUoXCJmb250LXNpemVcIiksMTApOjEwO2lmKGFbZV0oXCJ0ZXh0XCIpKXtmb3Iocy50ZXh0PWEudGV4dDtvLmZpcnN0Q2hpbGQ7KW8ucmVtb3ZlQ2hpbGQoby5maXJzdENoaWxkKTtmb3IodmFyIGg9cihhLnRleHQpLnNwbGl0KFwiXFxuXCIpLHU9W10sZixwPTAsZD1oLmxlbmd0aDtwPGQ7cCsrKWY9dihcInRzcGFuXCIpLHAmJnYoZix7ZHk6bCpDLHg6cy54fSksZi5hcHBlbmRDaGlsZCh0Ll9nLmRvYy5jcmVhdGVUZXh0Tm9kZShoW3BdKSksby5hcHBlbmRDaGlsZChmKSx1W3BdPWZ9ZWxzZSBmb3IodT1vLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHNwYW5cIikscD0wLGQ9dS5sZW5ndGg7cDxkO3ArKylwP3YodVtwXSx7ZHk6bCpDLHg6cy54fSk6dih1WzBdLHtkeTowfSk7dihvLHt4OnMueCx5OnMueX0pLGkuXy5kaXJ0eT0xO3ZhciBnPWkuX2dldEJCb3goKSx4PXMueS0oZy55K2cuaGVpZ2h0LzIpO3gmJnQuaXMoeCxcImZpbml0ZVwiKSYmdih1WzBdLHtkeTp4fSl9fSxBPWZ1bmN0aW9uKHQpe3JldHVybiB0LnBhcmVudE5vZGUmJlwiYVwiPT09dC5wYXJlbnROb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKT90LnBhcmVudE5vZGU6dH0sVD1mdW5jdGlvbihlLHIpe2Z1bmN0aW9uIGkoKXtyZXR1cm4oXCIwMDAwXCIrKE1hdGgucmFuZG9tKCkqTWF0aC5wb3coMzYsNSk8PDApLnRvU3RyaW5nKDM2KSkuc2xpY2UoLTUpfXZhciBuPTAsYT0wO3RoaXNbMF09dGhpcy5ub2RlPWUsZS5yYXBoYWVsPSEwLHRoaXMuaWQ9aSgpLGUucmFwaGFlbGlkPXRoaXMuaWQsdGhpcy5tYXRyaXg9dC5tYXRyaXgoKSx0aGlzLnJlYWxQYXRoPW51bGwsdGhpcy5wYXBlcj1yLHRoaXMuYXR0cnM9dGhpcy5hdHRyc3x8e30sdGhpcy5fPXt0cmFuc2Zvcm06W10sc3g6MSxzeToxLGRlZzowLGR4OjAsZHk6MCxkaXJ0eToxfSwhci5ib3R0b20mJihyLmJvdHRvbT10aGlzKSx0aGlzLnByZXY9ci50b3Asci50b3AmJihyLnRvcC5uZXh0PXRoaXMpLHIudG9wPXRoaXMsdGhpcy5uZXh0PW51bGx9LEU9dC5lbDtULnByb3RvdHlwZT1FLEUuY29uc3RydWN0b3I9VCx0Ll9lbmdpbmUucGF0aD1mdW5jdGlvbih0LGUpe3ZhciByPXYoXCJwYXRoXCIpO2UuY2FudmFzJiZlLmNhbnZhcy5hcHBlbmRDaGlsZChyKTt2YXIgaT1uZXcgVChyLGUpO3JldHVybiBpLnR5cGU9XCJwYXRoXCIsQihpLHtmaWxsOlwibm9uZVwiLHN0cm9rZTpcIiMwMDBcIixwYXRoOnR9KSxpfSxFLnJvdGF0ZT1mdW5jdGlvbih0LGUsbil7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO2lmKHQ9cih0KS5zcGxpdChoKSx0Lmxlbmd0aC0xJiYoZT1pKHRbMV0pLG49aSh0WzJdKSksdD1pKHRbMF0pLG51bGw9PW4mJihlPW4pLG51bGw9PWV8fG51bGw9PW4pe3ZhciBhPXRoaXMuZ2V0QkJveCgxKTtlPWEueCthLndpZHRoLzIsbj1hLnkrYS5oZWlnaHQvMn1yZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5fLnRyYW5zZm9ybS5jb25jYXQoW1tcInJcIix0LGUsbl1dKSksdGhpc30sRS5zY2FsZT1mdW5jdGlvbih0LGUsbixhKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7aWYodD1yKHQpLnNwbGl0KGgpLHQubGVuZ3RoLTEmJihlPWkodFsxXSksbj1pKHRbMl0pLGE9aSh0WzNdKSksdD1pKHRbMF0pLG51bGw9PWUmJihlPXQpLG51bGw9PWEmJihuPWEpLG51bGw9PW58fG51bGw9PWEpdmFyIHM9dGhpcy5nZXRCQm94KDEpO3JldHVybiBuPW51bGw9PW4/cy54K3Mud2lkdGgvMjpuLGE9bnVsbD09YT9zLnkrcy5oZWlnaHQvMjphLHRoaXMudHJhbnNmb3JtKHRoaXMuXy50cmFuc2Zvcm0uY29uY2F0KFtbXCJzXCIsdCxlLG4sYV1dKSksdGhpc30sRS50cmFuc2xhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZW1vdmVkP3RoaXM6KHQ9cih0KS5zcGxpdChoKSx0Lmxlbmd0aC0xJiYoZT1pKHRbMV0pKSx0PWkodFswXSl8fDAsZT0rZXx8MCx0aGlzLnRyYW5zZm9ybSh0aGlzLl8udHJhbnNmb3JtLmNvbmNhdChbW1widFwiLHQsZV1dKSksdGhpcyl9LEUudHJhbnNmb3JtPWZ1bmN0aW9uKHIpe3ZhciBpPXRoaXMuXztpZihudWxsPT1yKXJldHVybiBpLnRyYW5zZm9ybTtpZih0Ll9leHRyYWN0VHJhbnNmb3JtKHRoaXMsciksdGhpcy5jbGlwJiZ2KHRoaXMuY2xpcCx7dHJhbnNmb3JtOnRoaXMubWF0cml4LmludmVydCgpfSksdGhpcy5wYXR0ZXJuJiZiKHRoaXMpLHRoaXMubm9kZSYmdih0aGlzLm5vZGUse3RyYW5zZm9ybTp0aGlzLm1hdHJpeH0pLDEhPWkuc3h8fDEhPWkuc3kpe3ZhciBuPXRoaXMuYXR0cnNbZV0oXCJzdHJva2Utd2lkdGhcIik/dGhpcy5hdHRyc1tcInN0cm9rZS13aWR0aFwiXToxO3RoaXMuYXR0cih7XCJzdHJva2Utd2lkdGhcIjpufSl9cmV0dXJuIHRoaXN9LEUuaGlkZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbW92ZWR8fCh0aGlzLm5vZGUuc3R5bGUuZGlzcGxheT1cIm5vbmVcIiksdGhpc30sRS5zaG93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVtb3ZlZHx8KHRoaXMubm9kZS5zdHlsZS5kaXNwbGF5PVwiXCIpLHRoaXN9LEUucmVtb3ZlPWZ1bmN0aW9uKCl7dmFyIGU9QSh0aGlzLm5vZGUpO2lmKCF0aGlzLnJlbW92ZWQmJmUucGFyZW50Tm9kZSl7dmFyIHI9dGhpcy5wYXBlcjtyLl9fc2V0X18mJnIuX19zZXRfXy5leGNsdWRlKHRoaXMpLHUudW5iaW5kKFwicmFwaGFlbC4qLiouXCIrdGhpcy5pZCksdGhpcy5ncmFkaWVudCYmci5kZWZzLnJlbW92ZUNoaWxkKHRoaXMuZ3JhZGllbnQpLHQuX3RlYXIodGhpcyxyKSxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksdGhpcy5yZW1vdmVEYXRhKCk7Zm9yKHZhciBpIGluIHRoaXMpdGhpc1tpXT1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzW2ldP3QuX3JlbW92ZWRGYWN0b3J5KGkpOm51bGw7dGhpcy5yZW1vdmVkPSEwfX0sRS5fZ2V0QkJveD1mdW5jdGlvbigpe2lmKFwibm9uZVwiPT10aGlzLm5vZGUuc3R5bGUuZGlzcGxheSl7dGhpcy5zaG93KCk7dmFyIHQ9ITB9dmFyIGU9ITEscjt0aGlzLnBhcGVyLmNhbnZhcy5wYXJlbnRFbGVtZW50P3I9dGhpcy5wYXBlci5jYW52YXMucGFyZW50RWxlbWVudC5zdHlsZTp0aGlzLnBhcGVyLmNhbnZhcy5wYXJlbnROb2RlJiYocj10aGlzLnBhcGVyLmNhbnZhcy5wYXJlbnROb2RlLnN0eWxlKSxyJiZcIm5vbmVcIj09ci5kaXNwbGF5JiYoZT0hMCxyLmRpc3BsYXk9XCJcIik7dmFyIGk9e307dHJ5e2k9dGhpcy5ub2RlLmdldEJCb3goKX1jYXRjaChuKXtpPXt4OnRoaXMubm9kZS5jbGllbnRMZWZ0LHk6dGhpcy5ub2RlLmNsaWVudFRvcCx3aWR0aDp0aGlzLm5vZGUuY2xpZW50V2lkdGgsaGVpZ2h0OnRoaXMubm9kZS5jbGllbnRIZWlnaHR9fWZpbmFsbHl7aT1pfHx7fSxlJiYoci5kaXNwbGF5PVwibm9uZVwiKX1yZXR1cm4gdCYmdGhpcy5oaWRlKCksaX0sRS5hdHRyPWZ1bmN0aW9uKHIsaSl7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO2lmKG51bGw9PXIpe3ZhciBuPXt9O2Zvcih2YXIgYSBpbiB0aGlzLmF0dHJzKXRoaXMuYXR0cnNbZV0oYSkmJihuW2FdPXRoaXMuYXR0cnNbYV0pO3JldHVybiBuLmdyYWRpZW50JiZcIm5vbmVcIj09bi5maWxsJiYobi5maWxsPW4uZ3JhZGllbnQpJiZkZWxldGUgbi5ncmFkaWVudCxuLnRyYW5zZm9ybT10aGlzLl8udHJhbnNmb3JtLG59aWYobnVsbD09aSYmdC5pcyhyLFwic3RyaW5nXCIpKXtpZihcImZpbGxcIj09ciYmXCJub25lXCI9PXRoaXMuYXR0cnMuZmlsbCYmdGhpcy5hdHRycy5ncmFkaWVudClyZXR1cm4gdGhpcy5hdHRycy5ncmFkaWVudDtpZihcInRyYW5zZm9ybVwiPT1yKXJldHVybiB0aGlzLl8udHJhbnNmb3JtO2Zvcih2YXIgcz1yLnNwbGl0KGgpLG89e30sbD0wLGM9cy5sZW5ndGg7bDxjO2wrKylyPXNbbF0sciBpbiB0aGlzLmF0dHJzP29bcl09dGhpcy5hdHRyc1tyXTp0LmlzKHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tyXSxcImZ1bmN0aW9uXCIpP29bcl09dGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW3JdLmRlZjpvW3JdPXQuX2F2YWlsYWJsZUF0dHJzW3JdO3JldHVybiBjLTE/bzpvW3NbMF1dfWlmKG51bGw9PWkmJnQuaXMocixcImFycmF5XCIpKXtmb3Iobz17fSxsPTAsYz1yLmxlbmd0aDtsPGM7bCsrKW9bcltsXV09dGhpcy5hdHRyKHJbbF0pO3JldHVybiBvfWlmKG51bGwhPWkpe3ZhciBmPXt9O2Zbcl09aX1lbHNlIG51bGwhPXImJnQuaXMocixcIm9iamVjdFwiKSYmKGY9cik7Zm9yKHZhciBwIGluIGYpdShcInJhcGhhZWwuYXR0ci5cIitwK1wiLlwiK3RoaXMuaWQsdGhpcyxmW3BdKTtmb3IocCBpbiB0aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXMpaWYodGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW2VdKHApJiZmW2VdKHApJiZ0LmlzKHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1twXSxcImZ1bmN0aW9uXCIpKXt2YXIgZD10aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbcF0uYXBwbHkodGhpcyxbXS5jb25jYXQoZltwXSkpO3RoaXMuYXR0cnNbcF09ZltwXTtmb3IodmFyIGcgaW4gZClkW2VdKGcpJiYoZltnXT1kW2ddKX1yZXR1cm4gQih0aGlzLGYpLHRoaXN9LEUudG9Gcm9udD1mdW5jdGlvbigpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpczt2YXIgZT1BKHRoaXMubm9kZSk7ZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGUpO3ZhciByPXRoaXMucGFwZXI7cmV0dXJuIHIudG9wIT10aGlzJiZ0Ll90b2Zyb250KHRoaXMsciksdGhpc30sRS50b0JhY2s9ZnVuY3Rpb24oKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7dmFyIGU9QSh0aGlzLm5vZGUpLHI9ZS5wYXJlbnROb2RlO3IuaW5zZXJ0QmVmb3JlKGUsci5maXJzdENoaWxkKSx0Ll90b2JhY2sodGhpcyx0aGlzLnBhcGVyKTt2YXIgaT10aGlzLnBhcGVyO3JldHVybiB0aGlzfSxFLmluc2VydEFmdGVyPWZ1bmN0aW9uKGUpe2lmKHRoaXMucmVtb3ZlZHx8IWUpcmV0dXJuIHRoaXM7dmFyIHI9QSh0aGlzLm5vZGUpLGk9QShlLm5vZGV8fGVbZS5sZW5ndGgtMV0ubm9kZSk7cmV0dXJuIGkubmV4dFNpYmxpbmc/aS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyLGkubmV4dFNpYmxpbmcpOmkucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChyKSx0Ll9pbnNlcnRhZnRlcih0aGlzLGUsdGhpcy5wYXBlciksdGhpc30sRS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oZSl7aWYodGhpcy5yZW1vdmVkfHwhZSlyZXR1cm4gdGhpczt2YXIgcj1BKHRoaXMubm9kZSksaT1BKGUubm9kZXx8ZVswXS5ub2RlKTtyZXR1cm4gaS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyLGkpLHQuX2luc2VydGJlZm9yZSh0aGlzLGUsdGhpcy5wYXBlciksdGhpc30sRS5ibHVyPWZ1bmN0aW9uKGUpe3ZhciByPXRoaXM7aWYoMCE9PStlKXt2YXIgaT12KFwiZmlsdGVyXCIpLG49dihcImZlR2F1c3NpYW5CbHVyXCIpO3IuYXR0cnMuYmx1cj1lLGkuaWQ9dC5jcmVhdGVVVUlEKCksdihuLHtzdGREZXZpYXRpb246K2V8fDEuNX0pLGkuYXBwZW5kQ2hpbGQobiksci5wYXBlci5kZWZzLmFwcGVuZENoaWxkKGkpLHIuX2JsdXI9aSx2KHIubm9kZSx7ZmlsdGVyOlwidXJsKCNcIitpLmlkK1wiKVwifSl9ZWxzZSByLl9ibHVyJiYoci5fYmx1ci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIuX2JsdXIpLGRlbGV0ZSByLl9ibHVyLGRlbGV0ZSByLmF0dHJzLmJsdXIpLHIubm9kZS5yZW1vdmVBdHRyaWJ1dGUoXCJmaWx0ZXJcIik7cmV0dXJuIHJ9LHQuX2VuZ2luZS5jaXJjbGU9ZnVuY3Rpb24odCxlLHIsaSl7dmFyIG49dihcImNpcmNsZVwiKTt0LmNhbnZhcyYmdC5jYW52YXMuYXBwZW5kQ2hpbGQobik7dmFyIGE9bmV3IFQobix0KTtyZXR1cm4gYS5hdHRycz17Y3g6ZSxjeTpyLHI6aSxmaWxsOlwibm9uZVwiLHN0cm9rZTpcIiMwMDBcIn0sYS50eXBlPVwiY2lyY2xlXCIsdihuLGEuYXR0cnMpLGF9LHQuX2VuZ2luZS5yZWN0PWZ1bmN0aW9uKHQsZSxyLGksbixhKXt2YXIgcz12KFwicmVjdFwiKTt0LmNhbnZhcyYmdC5jYW52YXMuYXBwZW5kQ2hpbGQocyk7dmFyIG89bmV3IFQocyx0KTtyZXR1cm4gby5hdHRycz17eDplLHk6cix3aWR0aDppLGhlaWdodDpuLHJ4OmF8fDAscnk6YXx8MCxmaWxsOlwibm9uZVwiLHN0cm9rZTpcIiMwMDBcIn0sby50eXBlPVwicmVjdFwiLHYocyxvLmF0dHJzKSxvfSx0Ll9lbmdpbmUuZWxsaXBzZT1mdW5jdGlvbih0LGUscixpLG4pe3ZhciBhPXYoXCJlbGxpcHNlXCIpO3QuY2FudmFzJiZ0LmNhbnZhcy5hcHBlbmRDaGlsZChhKTt2YXIgcz1uZXcgVChhLHQpO3JldHVybiBzLmF0dHJzPXtjeDplLGN5OnIscng6aSxyeTpuLGZpbGw6XCJub25lXCIsc3Ryb2tlOlwiIzAwMFwifSxzLnR5cGU9XCJlbGxpcHNlXCIsdihhLHMuYXR0cnMpLHN9LHQuX2VuZ2luZS5pbWFnZT1mdW5jdGlvbih0LGUscixpLG4sYSl7dmFyIHM9dihcImltYWdlXCIpO3Yocyx7eDpyLHk6aSx3aWR0aDpuLGhlaWdodDphLHByZXNlcnZlQXNwZWN0UmF0aW86XCJub25lXCJ9KSxzLnNldEF0dHJpYnV0ZU5TKHAsXCJocmVmXCIsZSksdC5jYW52YXMmJnQuY2FudmFzLmFwcGVuZENoaWxkKHMpO3ZhciBvPW5ldyBUKHMsdCk7cmV0dXJuIG8uYXR0cnM9e3g6cix5Omksd2lkdGg6bixoZWlnaHQ6YSxzcmM6ZX0sby50eXBlPVwiaW1hZ2VcIixvfSx0Ll9lbmdpbmUudGV4dD1mdW5jdGlvbihlLHIsaSxuKXt2YXIgYT12KFwidGV4dFwiKTtlLmNhbnZhcyYmZS5jYW52YXMuYXBwZW5kQ2hpbGQoYSk7dmFyIHM9bmV3IFQoYSxlKTtyZXR1cm4gcy5hdHRycz17eDpyLHk6aSxcInRleHQtYW5jaG9yXCI6XCJtaWRkbGVcIix0ZXh0Om4sXCJmb250LWZhbWlseVwiOnQuX2F2YWlsYWJsZUF0dHJzW1wiZm9udC1mYW1pbHlcIl0sXCJmb250LXNpemVcIjp0Ll9hdmFpbGFibGVBdHRyc1tcImZvbnQtc2l6ZVwiXSxzdHJva2U6XCJub25lXCIsZmlsbDpcIiMwMDBcIn0scy50eXBlPVwidGV4dFwiLEIocyxzLmF0dHJzKSxzfSx0Ll9lbmdpbmUuc2V0U2l6ZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLndpZHRoPXR8fHRoaXMud2lkdGgsdGhpcy5oZWlnaHQ9ZXx8dGhpcy5oZWlnaHQsdGhpcy5jYW52YXMuc2V0QXR0cmlidXRlKFwid2lkdGhcIix0aGlzLndpZHRoKSx0aGlzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIix0aGlzLmhlaWdodCksdGhpcy5fdmlld0JveCYmdGhpcy5zZXRWaWV3Qm94LmFwcGx5KHRoaXMsdGhpcy5fdmlld0JveCksdGhpc30sdC5fZW5naW5lLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciBlPXQuX2dldENvbnRhaW5lci5hcHBseSgwLGFyZ3VtZW50cykscj1lJiZlLmNvbnRhaW5lcixpPWUueCxuPWUueSxhPWUud2lkdGgscz1lLmhlaWdodDtpZighcil0aHJvdyBuZXcgRXJyb3IoXCJTVkcgY29udGFpbmVyIG5vdCBmb3VuZC5cIik7dmFyIG89dihcInN2Z1wiKSxsPVwib3ZlcmZsb3c6aGlkZGVuO1wiLGg7cmV0dXJuIGk9aXx8MCxuPW58fDAsYT1hfHw1MTIscz1zfHwzNDIsdihvLHtoZWlnaHQ6cyx2ZXJzaW9uOjEuMSx3aWR0aDphLHhtbG5zOlwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcInhtbG5zOnhsaW5rXCI6XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJ9KSwxPT1yPyhvLnN0eWxlLmNzc1RleHQ9bCtcInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6XCIraStcInB4O3RvcDpcIituK1wicHhcIix0Ll9nLmRvYy5ib2R5LmFwcGVuZENoaWxkKG8pLGg9MSk6KG8uc3R5bGUuY3NzVGV4dD1sK1wicG9zaXRpb246cmVsYXRpdmVcIixyLmZpcnN0Q2hpbGQ/ci5pbnNlcnRCZWZvcmUobyxyLmZpcnN0Q2hpbGQpOnIuYXBwZW5kQ2hpbGQobykpLHI9bmV3IHQuX1BhcGVyLHIud2lkdGg9YSxyLmhlaWdodD1zLHIuY2FudmFzPW8sci5jbGVhcigpLHIuX2xlZnQ9ci5fdG9wPTAsaCYmKHIucmVuZGVyZml4PWZ1bmN0aW9uKCl7fSksci5yZW5kZXJmaXgoKSxyfSx0Ll9lbmdpbmUuc2V0Vmlld0JveD1mdW5jdGlvbih0LGUscixpLG4pe3UoXCJyYXBoYWVsLnNldFZpZXdCb3hcIix0aGlzLHRoaXMuX3ZpZXdCb3gsW3QsZSxyLGksbl0pO3ZhciBhPXRoaXMuZ2V0U2l6ZSgpLG89cyhyL2Eud2lkdGgsaS9hLmhlaWdodCksbD10aGlzLnRvcCxoPW4/XCJ4TWlkWU1pZCBtZWV0XCI6XCJ4TWluWU1pblwiLGMscDtmb3IobnVsbD09dD8odGhpcy5fdmJTaXplJiYobz0xKSxkZWxldGUgdGhpcy5fdmJTaXplLGM9XCIwIDAgXCIrdGhpcy53aWR0aCtmK3RoaXMuaGVpZ2h0KToodGhpcy5fdmJTaXplPW8sYz10K2YrZStmK3IrZitpKSx2KHRoaXMuY2FudmFzLHt2aWV3Qm94OmMscHJlc2VydmVBc3BlY3RSYXRpbzpofSk7byYmbDspcD1cInN0cm9rZS13aWR0aFwiaW4gbC5hdHRycz9sLmF0dHJzW1wic3Ryb2tlLXdpZHRoXCJdOjEsbC5hdHRyKHtcInN0cm9rZS13aWR0aFwiOnB9KSxsLl8uZGlydHk9MSxsLl8uZGlydHlUPTEsbD1sLnByZXY7cmV0dXJuIHRoaXMuX3ZpZXdCb3g9W3QsZSxyLGksISFuXSx0aGlzfSx0LnByb3RvdHlwZS5yZW5kZXJmaXg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNhbnZhcyxlPXQuc3R5bGUscjt0cnl7cj10LmdldFNjcmVlbkNUTSgpfHx0LmNyZWF0ZVNWR01hdHJpeCgpfWNhdGNoKGkpe3I9dC5jcmVhdGVTVkdNYXRyaXgoKX12YXIgbj0tci5lJTEsYT0tci5mJTE7KG58fGEpJiYobiYmKHRoaXMuX2xlZnQ9KHRoaXMuX2xlZnQrbiklMSxlLmxlZnQ9dGhpcy5fbGVmdCtcInB4XCIpLGEmJih0aGlzLl90b3A9KHRoaXMuX3RvcCthKSUxLGUudG9wPXRoaXMuX3RvcCtcInB4XCIpKX0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0LmV2ZShcInJhcGhhZWwuY2xlYXJcIix0aGlzKTtmb3IodmFyIGU9dGhpcy5jYW52YXM7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7dGhpcy5ib3R0b209dGhpcy50b3A9bnVsbCwodGhpcy5kZXNjPXYoXCJkZXNjXCIpKS5hcHBlbmRDaGlsZCh0Ll9nLmRvYy5jcmVhdGVUZXh0Tm9kZShcIkNyZWF0ZWQgd2l0aCBSYXBoYcOrbCBcIit0LnZlcnNpb24pKSxlLmFwcGVuZENoaWxkKHRoaXMuZGVzYyksZS5hcHBlbmRDaGlsZCh0aGlzLmRlZnM9dihcImRlZnNcIikpfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt1KFwicmFwaGFlbC5yZW1vdmVcIix0aGlzKSx0aGlzLmNhbnZhcy5wYXJlbnROb2RlJiZ0aGlzLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2FudmFzKTtmb3IodmFyIGUgaW4gdGhpcyl0aGlzW2VdPVwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXNbZV0/dC5fcmVtb3ZlZEZhY3RvcnkoZSk6bnVsbH07dmFyIE09dC5zdDtmb3IodmFyIE4gaW4gRSlFW2VdKE4pJiYhTVtlXShOKSYmKE1bTl09ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24ocil7clt0XS5hcHBseShyLGUpfSl9fShOKSl9fS5hcHBseShlLGkpLCEodm9pZCAwIT09biYmKHQuZXhwb3J0cz1uKSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgaSxuO2k9W3IoMSldLG49ZnVuY3Rpb24odCl7aWYoIXR8fHQudm1sKXt2YXIgZT1cImhhc093blByb3BlcnR5XCIscj1TdHJpbmcsaT1wYXJzZUZsb2F0LG49TWF0aCxhPW4ucm91bmQscz1uLm1heCxvPW4ubWluLGw9bi5hYnMsaD1cImZpbGxcIix1PS9bLCBdKy8sYz10LmV2ZSxmPVwiIHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdFwiLHA9XCIgXCIsZD1cIlwiLGc9e006XCJtXCIsTDpcImxcIixDOlwiY1wiLFo6XCJ4XCIsbTpcInRcIixsOlwiclwiLGM6XCJ2XCIsejpcInhcIn0sdj0vKFtjbG16XSksPyhbXmNsbXpdKikvZ2kseD0vIHByb2dpZDpcXFMrQmx1clxcKFteXFwpXStcXCkvZyx5PS8tP1teLFxccy1dKy9nLG09XCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTClcIixiPTIxNjAwLF89e3BhdGg6MSxyZWN0OjEsaW1hZ2U6MX0sdz17Y2lyY2xlOjEsZWxsaXBzZToxfSxrPWZ1bmN0aW9uKGUpe3ZhciBpPS9bYWhxc3R2XS9naSxuPXQuX3BhdGhUb0Fic29sdXRlO2lmKHIoZSkubWF0Y2goaSkmJihuPXQuX3BhdGgyY3VydmUpLGk9L1tjbG16XS9nLG49PXQuX3BhdGhUb0Fic29sdXRlJiYhcihlKS5tYXRjaChpKSl7dmFyIHM9cihlKS5yZXBsYWNlKHYsZnVuY3Rpb24odCxlLHIpe3ZhciBpPVtdLG49XCJtXCI9PWUudG9Mb3dlckNhc2UoKSxzPWdbZV07cmV0dXJuIHIucmVwbGFjZSh5LGZ1bmN0aW9uKHQpe24mJjI9PWkubGVuZ3RoJiYocys9aStnW1wibVwiPT1lP1wibFwiOlwiTFwiXSxpPVtdKSxpLnB1c2goYSh0KmIpKX0pLHMraX0pO3JldHVybiBzfXZhciBvPW4oZSksbCxoO3M9W107Zm9yKHZhciB1PTAsYz1vLmxlbmd0aDt1PGM7dSsrKXtsPW9bdV0saD1vW3VdWzBdLnRvTG93ZXJDYXNlKCksXCJ6XCI9PWgmJihoPVwieFwiKTtmb3IodmFyIGY9MSx4PWwubGVuZ3RoO2Y8eDtmKyspaCs9YShsW2ZdKmIpKyhmIT14LTE/XCIsXCI6ZCk7cy5wdXNoKGgpfXJldHVybiBzLmpvaW4ocCl9LEI9ZnVuY3Rpb24oZSxyLGkpe3ZhciBuPXQubWF0cml4KCk7cmV0dXJuIG4ucm90YXRlKC1lLC41LC41KSx7ZHg6bi54KHIsaSksZHk6bi55KHIsaSl9fSxDPWZ1bmN0aW9uKHQsZSxyLGksbixhKXt2YXIgcz10Ll8sbz10Lm1hdHJpeCx1PXMuZmlsbHBvcyxjPXQubm9kZSxmPWMuc3R5bGUsZD0xLGc9XCJcIix2LHg9Yi9lLHk9Yi9yO2lmKGYudmlzaWJpbGl0eT1cImhpZGRlblwiLGUmJnIpe2lmKGMuY29vcmRzaXplPWwoeCkrcCtsKHkpLGYucm90YXRpb249YSooZSpyPDA/LTE6MSksYSl7dmFyIG09QihhLGksbik7aT1tLmR4LG49bS5keX1pZihlPDAmJihnKz1cInhcIikscjwwJiYoZys9XCIgeVwiKSYmKGQ9LTEpLGYuZmxpcD1nLGMuY29vcmRvcmlnaW49aSoteCtwK24qLXksdXx8cy5maWxsc2l6ZSl7dmFyIF89Yy5nZXRFbGVtZW50c0J5VGFnTmFtZShoKTtfPV8mJl9bMF0sYy5yZW1vdmVDaGlsZChfKSx1JiYobT1CKGEsby54KHVbMF0sdVsxXSksby55KHVbMF0sdVsxXSkpLF8ucG9zaXRpb249bS5keCpkK3ArbS5keSpkKSxzLmZpbGxzaXplJiYoXy5zaXplPXMuZmlsbHNpemVbMF0qbChlKStwK3MuZmlsbHNpemVbMV0qbChyKSksYy5hcHBlbmRDaGlsZChfKX1mLnZpc2liaWxpdHk9XCJ2aXNpYmxlXCJ9fTt0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJZb3VyIGJyb3dzZXIgZG9lc27igJl0IHN1cHBvcnQgU1ZHLiBGYWxsaW5nIGRvd24gdG8gVk1MLlxcbllvdSBhcmUgcnVubmluZyBSYXBoYcOrbCBcIit0aGlzLnZlcnNpb259O3ZhciBTPWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG49cihlKS50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiLVwiKSxhPWk/XCJlbmRcIjpcInN0YXJ0XCIscz1uLmxlbmd0aCxvPVwiY2xhc3NpY1wiLGw9XCJtZWRpdW1cIixoPVwibWVkaXVtXCI7cy0tOylzd2l0Y2gobltzXSl7Y2FzZVwiYmxvY2tcIjpjYXNlXCJjbGFzc2ljXCI6Y2FzZVwib3ZhbFwiOmNhc2VcImRpYW1vbmRcIjpjYXNlXCJvcGVuXCI6Y2FzZVwibm9uZVwiOm89bltzXTticmVhaztjYXNlXCJ3aWRlXCI6Y2FzZVwibmFycm93XCI6aD1uW3NdO2JyZWFrO2Nhc2VcImxvbmdcIjpjYXNlXCJzaG9ydFwiOmw9bltzXX12YXIgdT10Lm5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzdHJva2VcIilbMF07dVthK1wiYXJyb3dcIl09byx1W2ErXCJhcnJvd2xlbmd0aFwiXT1sLHVbYStcImFycm93d2lkdGhcIl09aH0sQT1mdW5jdGlvbihuLGwpe24uYXR0cnM9bi5hdHRyc3x8e307dmFyIGM9bi5ub2RlLGY9bi5hdHRycyxnPWMuc3R5bGUsdix4PV9bbi50eXBlXSYmKGwueCE9Zi54fHxsLnkhPWYueXx8bC53aWR0aCE9Zi53aWR0aHx8bC5oZWlnaHQhPWYuaGVpZ2h0fHxsLmN4IT1mLmN4fHxsLmN5IT1mLmN5fHxsLnJ4IT1mLnJ4fHxsLnJ5IT1mLnJ5fHxsLnIhPWYucikseT13W24udHlwZV0mJihmLmN4IT1sLmN4fHxmLmN5IT1sLmN5fHxmLnIhPWwucnx8Zi5yeCE9bC5yeHx8Zi5yeSE9bC5yeSksbT1uO2Zvcih2YXIgQiBpbiBsKWxbZV0oQikmJihmW0JdPWxbQl0pO2lmKHgmJihmLnBhdGg9dC5fZ2V0UGF0aFtuLnR5cGVdKG4pLG4uXy5kaXJ0eT0xKSxsLmhyZWYmJihjLmhyZWY9bC5ocmVmKSxsLnRpdGxlJiYoYy50aXRsZT1sLnRpdGxlKSxsLnRhcmdldCYmKGMudGFyZ2V0PWwudGFyZ2V0KSxsLmN1cnNvciYmKGcuY3Vyc29yPWwuY3Vyc29yKSxcImJsdXJcImluIGwmJm4uYmx1cihsLmJsdXIpLChsLnBhdGgmJlwicGF0aFwiPT1uLnR5cGV8fHgpJiYoYy5wYXRoPWsofnIoZi5wYXRoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJyXCIpP3QuX3BhdGhUb0Fic29sdXRlKGYucGF0aCk6Zi5wYXRoKSxuLl8uZGlydHk9MSxcImltYWdlXCI9PW4udHlwZSYmKG4uXy5maWxscG9zPVtmLngsZi55XSxuLl8uZmlsbHNpemU9W2Yud2lkdGgsZi5oZWlnaHRdLEMobiwxLDEsMCwwLDApKSksXCJ0cmFuc2Zvcm1cImluIGwmJm4udHJhbnNmb3JtKGwudHJhbnNmb3JtKSx5KXt2YXIgQT0rZi5jeCxFPStmLmN5LE09K2Yucnh8fCtmLnJ8fDAsTD0rZi5yeXx8K2Yucnx8MDtjLnBhdGg9dC5mb3JtYXQoXCJhcnswfSx7MX0sezJ9LHszfSx7NH0sezF9LHs0fSx7MX14XCIsYSgoQS1NKSpiKSxhKChFLUwpKmIpLGEoKEErTSkqYiksYSgoRStMKSpiKSxhKEEqYikpLG4uXy5kaXJ0eT0xfWlmKFwiY2xpcC1yZWN0XCJpbiBsKXt2YXIgej1yKGxbXCJjbGlwLXJlY3RcIl0pLnNwbGl0KHUpO2lmKDQ9PXoubGVuZ3RoKXt6WzJdPSt6WzJdKyArelswXSx6WzNdPSt6WzNdKyArelsxXTt2YXIgUD1jLmNsaXBSZWN0fHx0Ll9nLmRvYy5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLEY9UC5zdHlsZTtGLmNsaXA9dC5mb3JtYXQoXCJyZWN0KHsxfXB4IHsyfXB4IHszfXB4IHswfXB4KVwiLHopLGMuY2xpcFJlY3R8fChGLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixGLnRvcD0wLEYubGVmdD0wLEYud2lkdGg9bi5wYXBlci53aWR0aCtcInB4XCIsRi5oZWlnaHQ9bi5wYXBlci5oZWlnaHQrXCJweFwiLGMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoUCxjKSxQLmFwcGVuZENoaWxkKGMpLGMuY2xpcFJlY3Q9UCl9bFtcImNsaXAtcmVjdFwiXXx8Yy5jbGlwUmVjdCYmKGMuY2xpcFJlY3Quc3R5bGUuY2xpcD1cImF1dG9cIil9aWYobi50ZXh0cGF0aCl7dmFyIFI9bi50ZXh0cGF0aC5zdHlsZTtsLmZvbnQmJihSLmZvbnQ9bC5mb250KSxsW1wiZm9udC1mYW1pbHlcIl0mJihSLmZvbnRGYW1pbHk9J1wiJytsW1wiZm9udC1mYW1pbHlcIl0uc3BsaXQoXCIsXCIpWzBdLnJlcGxhY2UoL15bJ1wiXSt8WydcIl0rJC9nLGQpKydcIicpLGxbXCJmb250LXNpemVcIl0mJihSLmZvbnRTaXplPWxbXCJmb250LXNpemVcIl0pLGxbXCJmb250LXdlaWdodFwiXSYmKFIuZm9udFdlaWdodD1sW1wiZm9udC13ZWlnaHRcIl0pLGxbXCJmb250LXN0eWxlXCJdJiYoUi5mb250U3R5bGU9bFtcImZvbnQtc3R5bGVcIl0pfWlmKFwiYXJyb3ctc3RhcnRcImluIGwmJlMobSxsW1wiYXJyb3ctc3RhcnRcIl0pLFwiYXJyb3ctZW5kXCJpbiBsJiZTKG0sbFtcImFycm93LWVuZFwiXSwxKSxudWxsIT1sLm9wYWNpdHl8fG51bGwhPWwuZmlsbHx8bnVsbCE9bC5zcmN8fG51bGwhPWwuc3Ryb2tlfHxudWxsIT1sW1wic3Ryb2tlLXdpZHRoXCJdfHxudWxsIT1sW1wic3Ryb2tlLW9wYWNpdHlcIl18fG51bGwhPWxbXCJmaWxsLW9wYWNpdHlcIl18fG51bGwhPWxbXCJzdHJva2UtZGFzaGFycmF5XCJdfHxudWxsIT1sW1wic3Ryb2tlLW1pdGVybGltaXRcIl18fG51bGwhPWxbXCJzdHJva2UtbGluZWpvaW5cIl18fG51bGwhPWxbXCJzdHJva2UtbGluZWNhcFwiXSl7dmFyIGo9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZShoKSxJPSExO2lmKGo9aiYmalswXSwhaiYmKEk9aj1OKGgpKSxcImltYWdlXCI9PW4udHlwZSYmbC5zcmMmJihqLnNyYz1sLnNyYyksbC5maWxsJiYoai5vbj0hMCksbnVsbCE9ai5vbiYmXCJub25lXCIhPWwuZmlsbCYmbnVsbCE9PWwuZmlsbHx8KGoub249ITEpLGoub24mJmwuZmlsbCl7dmFyIHE9cihsLmZpbGwpLm1hdGNoKHQuX0lTVVJMKTtpZihxKXtqLnBhcmVudE5vZGU9PWMmJmMucmVtb3ZlQ2hpbGQoaiksai5yb3RhdGU9ITAsai5zcmM9cVsxXSxqLnR5cGU9XCJ0aWxlXCI7dmFyIEQ9bi5nZXRCQm94KDEpO2oucG9zaXRpb249RC54K3ArRC55LG4uXy5maWxscG9zPVtELngsRC55XSx0Ll9wcmVsb2FkKHFbMV0sZnVuY3Rpb24oKXtuLl8uZmlsbHNpemU9W3RoaXMub2Zmc2V0V2lkdGgsdGhpcy5vZmZzZXRIZWlnaHRdfSl9ZWxzZSBqLmNvbG9yPXQuZ2V0UkdCKGwuZmlsbCkuaGV4LGouc3JjPWQsai50eXBlPVwic29saWRcIix0LmdldFJHQihsLmZpbGwpLmVycm9yJiYobS50eXBlIGlue2NpcmNsZToxLGVsbGlwc2U6MX18fFwiclwiIT1yKGwuZmlsbCkuY2hhckF0KCkpJiZUKG0sbC5maWxsLGopJiYoZi5maWxsPVwibm9uZVwiLGYuZ3JhZGllbnQ9bC5maWxsLGoucm90YXRlPSExKX1pZihcImZpbGwtb3BhY2l0eVwiaW4gbHx8XCJvcGFjaXR5XCJpbiBsKXt2YXIgVj0oKCtmW1wiZmlsbC1vcGFjaXR5XCJdKzF8fDIpLTEpKigoK2Yub3BhY2l0eSsxfHwyKS0xKSooKCt0LmdldFJHQihsLmZpbGwpLm8rMXx8MiktMSk7Vj1vKHMoViwwKSwxKSxqLm9wYWNpdHk9VixqLnNyYyYmKGouY29sb3I9XCJub25lXCIpfWMuYXBwZW5kQ2hpbGQoaik7dmFyIE89Yy5nZXRFbGVtZW50c0J5VGFnTmFtZShcInN0cm9rZVwiKSYmYy5nZXRFbGVtZW50c0J5VGFnTmFtZShcInN0cm9rZVwiKVswXSxZPSExOyFPJiYoWT1PPU4oXCJzdHJva2VcIikpLChsLnN0cm9rZSYmXCJub25lXCIhPWwuc3Ryb2tlfHxsW1wic3Ryb2tlLXdpZHRoXCJdfHxudWxsIT1sW1wic3Ryb2tlLW9wYWNpdHlcIl18fGxbXCJzdHJva2UtZGFzaGFycmF5XCJdfHxsW1wic3Ryb2tlLW1pdGVybGltaXRcIl18fGxbXCJzdHJva2UtbGluZWpvaW5cIl18fGxbXCJzdHJva2UtbGluZWNhcFwiXSkmJihPLm9uPSEwKSwoXCJub25lXCI9PWwuc3Ryb2tlfHxudWxsPT09bC5zdHJva2V8fG51bGw9PU8ub258fDA9PWwuc3Ryb2tlfHwwPT1sW1wic3Ryb2tlLXdpZHRoXCJdKSYmKE8ub249ITEpO3ZhciBXPXQuZ2V0UkdCKGwuc3Ryb2tlKTtPLm9uJiZsLnN0cm9rZSYmKE8uY29sb3I9Vy5oZXgpLFY9KCgrZltcInN0cm9rZS1vcGFjaXR5XCJdKzF8fDIpLTEpKigoK2Yub3BhY2l0eSsxfHwyKS0xKSooKCtXLm8rMXx8MiktMSk7dmFyIEc9Ljc1KihpKGxbXCJzdHJva2Utd2lkdGhcIl0pfHwxKTtpZihWPW8ocyhWLDApLDEpLG51bGw9PWxbXCJzdHJva2Utd2lkdGhcIl0mJihHPWZbXCJzdHJva2Utd2lkdGhcIl0pLGxbXCJzdHJva2Utd2lkdGhcIl0mJihPLndlaWdodD1HKSxHJiZHPDEmJihWKj1HKSYmKE8ud2VpZ2h0PTEpLE8ub3BhY2l0eT1WLGxbXCJzdHJva2UtbGluZWpvaW5cIl0mJihPLmpvaW5zdHlsZT1sW1wic3Ryb2tlLWxpbmVqb2luXCJdfHxcIm1pdGVyXCIpLE8ubWl0ZXJsaW1pdD1sW1wic3Ryb2tlLW1pdGVybGltaXRcIl18fDgsbFtcInN0cm9rZS1saW5lY2FwXCJdJiYoTy5lbmRjYXA9XCJidXR0XCI9PWxbXCJzdHJva2UtbGluZWNhcFwiXT9cImZsYXRcIjpcInNxdWFyZVwiPT1sW1wic3Ryb2tlLWxpbmVjYXBcIl0/XCJzcXVhcmVcIjpcInJvdW5kXCIpLFwic3Ryb2tlLWRhc2hhcnJheVwiaW4gbCl7dmFyIEg9e1wiLVwiOlwic2hvcnRkYXNoXCIsXCIuXCI6XCJzaG9ydGRvdFwiLFwiLS5cIjpcInNob3J0ZGFzaGRvdFwiLFwiLS4uXCI6XCJzaG9ydGRhc2hkb3Rkb3RcIixcIi4gXCI6XCJkb3RcIixcIi0gXCI6XCJkYXNoXCIsXCItLVwiOlwibG9uZ2Rhc2hcIixcIi0gLlwiOlwiZGFzaGRvdFwiLFwiLS0uXCI6XCJsb25nZGFzaGRvdFwiLFwiLS0uLlwiOlwibG9uZ2Rhc2hkb3Rkb3RcIn07Ty5kYXNoc3R5bGU9SFtlXShsW1wic3Ryb2tlLWRhc2hhcnJheVwiXSk/SFtsW1wic3Ryb2tlLWRhc2hhcnJheVwiXV06ZH1ZJiZjLmFwcGVuZENoaWxkKE8pfWlmKFwidGV4dFwiPT1tLnR5cGUpe20ucGFwZXIuY2FudmFzLnN0eWxlLmRpc3BsYXk9ZDt2YXIgWD1tLnBhcGVyLnNwYW4sVT0xMDAsJD1mLmZvbnQmJmYuZm9udC5tYXRjaCgvXFxkKyg/OlxcLlxcZCopPyg/PXB4KS8pO2c9WC5zdHlsZSxmLmZvbnQmJihnLmZvbnQ9Zi5mb250KSxmW1wiZm9udC1mYW1pbHlcIl0mJihnLmZvbnRGYW1pbHk9ZltcImZvbnQtZmFtaWx5XCJdKSxmW1wiZm9udC13ZWlnaHRcIl0mJihnLmZvbnRXZWlnaHQ9ZltcImZvbnQtd2VpZ2h0XCJdKSxmW1wiZm9udC1zdHlsZVwiXSYmKGcuZm9udFN0eWxlPWZbXCJmb250LXN0eWxlXCJdKSwkPWkoZltcImZvbnQtc2l6ZVwiXXx8JCYmJFswXSl8fDEwLGcuZm9udFNpemU9JCpVK1wicHhcIixtLnRleHRwYXRoLnN0cmluZyYmKFguaW5uZXJIVE1MPXIobS50ZXh0cGF0aC5zdHJpbmcpLnJlcGxhY2UoLzwvZyxcIiYjNjA7XCIpLnJlcGxhY2UoLyYvZyxcIiYjMzg7XCIpLnJlcGxhY2UoL1xcbi9nLFwiPGJyPlwiKSk7dmFyIFo9WC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTttLlc9Zi53PShaLnJpZ2h0LVoubGVmdCkvVSxtLkg9Zi5oPShaLmJvdHRvbS1aLnRvcCkvVSxtLlg9Zi54LG0uWT1mLnkrbS5ILzIsKFwieFwiaW4gbHx8XCJ5XCJpbiBsKSYmKG0ucGF0aC52PXQuZm9ybWF0KFwibXswfSx7MX1sezJ9LHsxfVwiLGEoZi54KmIpLGEoZi55KmIpLGEoZi54KmIpKzEpKTtmb3IodmFyIFE9W1wieFwiLFwieVwiLFwidGV4dFwiLFwiZm9udFwiLFwiZm9udC1mYW1pbHlcIixcImZvbnQtd2VpZ2h0XCIsXCJmb250LXN0eWxlXCIsXCJmb250LXNpemVcIl0sSj0wLEs9US5sZW5ndGg7SjxLO0orKylpZihRW0pdaW4gbCl7bS5fLmRpcnR5PTE7YnJlYWt9c3dpdGNoKGZbXCJ0ZXh0LWFuY2hvclwiXSl7Y2FzZVwic3RhcnRcIjptLnRleHRwYXRoLnN0eWxlW1widi10ZXh0LWFsaWduXCJdPVwibGVmdFwiLG0uYmJ4PW0uVy8yO2JyZWFrO2Nhc2VcImVuZFwiOm0udGV4dHBhdGguc3R5bGVbXCJ2LXRleHQtYWxpZ25cIl09XCJyaWdodFwiLG0uYmJ4PS1tLlcvMjticmVhaztkZWZhdWx0Om0udGV4dHBhdGguc3R5bGVbXCJ2LXRleHQtYWxpZ25cIl09XCJjZW50ZXJcIixtLmJieD0wfW0udGV4dHBhdGguc3R5bGVbXCJ2LXRleHQta2VyblwiXT0hMH19LFQ9ZnVuY3Rpb24oZSxhLHMpe2UuYXR0cnM9ZS5hdHRyc3x8e307dmFyIG89ZS5hdHRycyxsPU1hdGgucG93LGgsdSxjPVwibGluZWFyXCIsZj1cIi41IC41XCI7aWYoZS5hdHRycy5ncmFkaWVudD1hLGE9cihhKS5yZXBsYWNlKHQuX3JhZGlhbF9ncmFkaWVudCxmdW5jdGlvbih0LGUscil7cmV0dXJuIGM9XCJyYWRpYWxcIixlJiZyJiYoZT1pKGUpLHI9aShyKSxsKGUtLjUsMikrbChyLS41LDIpPi4yNSYmKHI9bi5zcXJ0KC4yNS1sKGUtLjUsMikpKigyKihyPi41KS0xKSsuNSksZj1lK3ArciksZH0pLGE9YS5zcGxpdCgvXFxzKlxcLVxccyovKSxcImxpbmVhclwiPT1jKXt2YXIgZz1hLnNoaWZ0KCk7aWYoZz0taShnKSxpc05hTihnKSlyZXR1cm4gbnVsbH12YXIgdj10Ll9wYXJzZURvdHMoYSk7aWYoIXYpcmV0dXJuIG51bGw7aWYoZT1lLnNoYXBlfHxlLm5vZGUsdi5sZW5ndGgpe2UucmVtb3ZlQ2hpbGQocykscy5vbj0hMCxzLm1ldGhvZD1cIm5vbmVcIixzLmNvbG9yPXZbMF0uY29sb3Iscy5jb2xvcjI9dlt2Lmxlbmd0aC0xXS5jb2xvcjtmb3IodmFyIHg9W10seT0wLG09di5sZW5ndGg7eTxtO3krKyl2W3ldLm9mZnNldCYmeC5wdXNoKHZbeV0ub2Zmc2V0K3Ardlt5XS5jb2xvcik7cy5jb2xvcnM9eC5sZW5ndGg/eC5qb2luKCk6XCIwJSBcIitzLmNvbG9yLFwicmFkaWFsXCI9PWM/KHMudHlwZT1cImdyYWRpZW50VGl0bGVcIixzLmZvY3VzPVwiMTAwJVwiLHMuZm9jdXNzaXplPVwiMCAwXCIscy5mb2N1c3Bvc2l0aW9uPWYscy5hbmdsZT0wKToocy50eXBlPVwiZ3JhZGllbnRcIixzLmFuZ2xlPSgyNzAtZyklMzYwKSxlLmFwcGVuZENoaWxkKHMpfXJldHVybiAxfSxFPWZ1bmN0aW9uKGUscil7dGhpc1swXT10aGlzLm5vZGU9ZSxlLnJhcGhhZWw9ITAsdGhpcy5pZD10Ll9vaWQrKyxlLnJhcGhhZWxpZD10aGlzLmlkLHRoaXMuWD0wLHRoaXMuWT0wLHRoaXMuYXR0cnM9e30sdGhpcy5wYXBlcj1yLHRoaXMubWF0cml4PXQubWF0cml4KCksdGhpcy5fPXt0cmFuc2Zvcm06W10sc3g6MSxzeToxLGR4OjAsZHk6MCxkZWc6MCxkaXJ0eToxLGRpcnR5VDoxfSwhci5ib3R0b20mJihyLmJvdHRvbT10aGlzKSx0aGlzLnByZXY9ci50b3Asci50b3AmJihyLnRvcC5uZXh0PXRoaXMpLHIudG9wPXRoaXMsdGhpcy5uZXh0PW51bGx9LE09dC5lbDtFLnByb3RvdHlwZT1NLE0uY29uc3RydWN0b3I9RSxNLnRyYW5zZm9ybT1mdW5jdGlvbihlKXtpZihudWxsPT1lKXJldHVybiB0aGlzLl8udHJhbnNmb3JtO3ZhciBpPXRoaXMucGFwZXIuX3ZpZXdCb3hTaGlmdCxuPWk/XCJzXCIrW2kuc2NhbGUsaS5zY2FsZV0rXCItMS0xdFwiK1tpLmR4LGkuZHldOmQsYTtpJiYoYT1lPXIoZSkucmVwbGFjZSgvXFwuezN9fFxcdTIwMjYvZyx0aGlzLl8udHJhbnNmb3JtfHxkKSksdC5fZXh0cmFjdFRyYW5zZm9ybSh0aGlzLG4rZSk7dmFyIHM9dGhpcy5tYXRyaXguY2xvbmUoKSxvPXRoaXMuc2tldyxsPXRoaXMubm9kZSxoLHU9fnIodGhpcy5hdHRycy5maWxsKS5pbmRleE9mKFwiLVwiKSxjPSFyKHRoaXMuYXR0cnMuZmlsbCkuaW5kZXhPZihcInVybChcIik7aWYocy50cmFuc2xhdGUoMSwxKSxjfHx1fHxcImltYWdlXCI9PXRoaXMudHlwZSlpZihvLm1hdHJpeD1cIjEgMCAwIDFcIixvLm9mZnNldD1cIjAgMFwiLGg9cy5zcGxpdCgpLHUmJmgubm9Sb3RhdGlvbnx8IWguaXNTaW1wbGUpe2wuc3R5bGUuZmlsdGVyPXMudG9GaWx0ZXIoKTt2YXIgZj10aGlzLmdldEJCb3goKSxnPXRoaXMuZ2V0QkJveCgxKSx2PWYueC1nLngseD1mLnktZy55O2wuY29vcmRvcmlnaW49diotYitwK3gqLWIsQyh0aGlzLDEsMSx2LHgsMCl9ZWxzZSBsLnN0eWxlLmZpbHRlcj1kLEModGhpcyxoLnNjYWxleCxoLnNjYWxleSxoLmR4LGguZHksaC5yb3RhdGUpO2Vsc2UgbC5zdHlsZS5maWx0ZXI9ZCxvLm1hdHJpeD1yKHMpLG8ub2Zmc2V0PXMub2Zmc2V0KCk7cmV0dXJuIG51bGwhPT1hJiYodGhpcy5fLnRyYW5zZm9ybT1hLHQuX2V4dHJhY3RUcmFuc2Zvcm0odGhpcyxhKSksdGhpc30sTS5yb3RhdGU9ZnVuY3Rpb24odCxlLG4pe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpcztpZihudWxsIT10KXtpZih0PXIodCkuc3BsaXQodSksdC5sZW5ndGgtMSYmKGU9aSh0WzFdKSxuPWkodFsyXSkpLHQ9aSh0WzBdKSxudWxsPT1uJiYoZT1uKSxudWxsPT1lfHxudWxsPT1uKXt2YXIgYT10aGlzLmdldEJCb3goMSk7ZT1hLngrYS53aWR0aC8yLG49YS55K2EuaGVpZ2h0LzJ9cmV0dXJuIHRoaXMuXy5kaXJ0eVQ9MSx0aGlzLnRyYW5zZm9ybSh0aGlzLl8udHJhbnNmb3JtLmNvbmNhdChbW1wiclwiLHQsZSxuXV0pKSx0aGlzfX0sTS50cmFuc2xhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZW1vdmVkP3RoaXM6KHQ9cih0KS5zcGxpdCh1KSx0Lmxlbmd0aC0xJiYoZT1pKHRbMV0pKSx0PWkodFswXSl8fDAsZT0rZXx8MCx0aGlzLl8uYmJveCYmKHRoaXMuXy5iYm94LngrPXQsdGhpcy5fLmJib3gueSs9ZSksdGhpcy50cmFuc2Zvcm0odGhpcy5fLnRyYW5zZm9ybS5jb25jYXQoW1tcInRcIix0LGVdXSkpLHRoaXMpfSxNLnNjYWxlPWZ1bmN0aW9uKHQsZSxuLGEpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpcztpZih0PXIodCkuc3BsaXQodSksdC5sZW5ndGgtMSYmKGU9aSh0WzFdKSxuPWkodFsyXSksYT1pKHRbM10pLGlzTmFOKG4pJiYobj1udWxsKSxpc05hTihhKSYmKGE9bnVsbCkpLHQ9aSh0WzBdKSxudWxsPT1lJiYoZT10KSxudWxsPT1hJiYobj1hKSxudWxsPT1ufHxudWxsPT1hKXZhciBzPXRoaXMuZ2V0QkJveCgxKTtyZXR1cm4gbj1udWxsPT1uP3MueCtzLndpZHRoLzI6bixhPW51bGw9PWE/cy55K3MuaGVpZ2h0LzI6YSx0aGlzLnRyYW5zZm9ybSh0aGlzLl8udHJhbnNmb3JtLmNvbmNhdChbW1wic1wiLHQsZSxuLGFdXSkpLHRoaXMuXy5kaXJ0eVQ9MSx0aGlzfSxNLmhpZGU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5yZW1vdmVkJiYodGhpcy5ub2RlLnN0eWxlLmRpc3BsYXk9XCJub25lXCIpLHRoaXN9LE0uc2hvdz1mdW5jdGlvbigpe3JldHVybiF0aGlzLnJlbW92ZWQmJih0aGlzLm5vZGUuc3R5bGUuZGlzcGxheT1kKSx0aGlzfSxNLmF1eEdldEJCb3g9dC5lbC5nZXRCQm94LE0uZ2V0QkJveD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYXV4R2V0QkJveCgpO2lmKHRoaXMucGFwZXImJnRoaXMucGFwZXIuX3ZpZXdCb3hTaGlmdCl7dmFyIGU9e30scj0xL3RoaXMucGFwZXIuX3ZpZXdCb3hTaGlmdC5zY2FsZTtyZXR1cm4gZS54PXQueC10aGlzLnBhcGVyLl92aWV3Qm94U2hpZnQuZHgsZS54Kj1yLGUueT10LnktdGhpcy5wYXBlci5fdmlld0JveFNoaWZ0LmR5LGUueSo9cixlLndpZHRoPXQud2lkdGgqcixlLmhlaWdodD10LmhlaWdodCpyLGUueDI9ZS54K2Uud2lkdGgsZS55Mj1lLnkrZS5oZWlnaHQsZX1yZXR1cm4gdH0sTS5fZ2V0QkJveD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbW92ZWQ/e306e3g6dGhpcy5YKyh0aGlzLmJieHx8MCktdGhpcy5XLzIseTp0aGlzLlktdGhpcy5ILHdpZHRoOnRoaXMuVyxoZWlnaHQ6dGhpcy5IfX0sTS5yZW1vdmU9ZnVuY3Rpb24oKXtpZighdGhpcy5yZW1vdmVkJiZ0aGlzLm5vZGUucGFyZW50Tm9kZSl7dGhpcy5wYXBlci5fX3NldF9fJiZ0aGlzLnBhcGVyLl9fc2V0X18uZXhjbHVkZSh0aGlzKSx0LmV2ZS51bmJpbmQoXCJyYXBoYWVsLiouKi5cIit0aGlzLmlkKSx0Ll90ZWFyKHRoaXMsdGhpcy5wYXBlciksdGhpcy5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5ub2RlKSx0aGlzLnNoYXBlJiZ0aGlzLnNoYXBlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zaGFwZSk7Zm9yKHZhciBlIGluIHRoaXMpdGhpc1tlXT1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzW2VdP3QuX3JlbW92ZWRGYWN0b3J5KGUpOm51bGw7dGhpcy5yZW1vdmVkPSEwfX0sTS5hdHRyPWZ1bmN0aW9uKHIsaSl7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO2lmKG51bGw9PXIpe3ZhciBuPXt9O2Zvcih2YXIgYSBpbiB0aGlzLmF0dHJzKXRoaXMuYXR0cnNbZV0oYSkmJihuW2FdPXRoaXMuYXR0cnNbYV0pO3JldHVybiBuLmdyYWRpZW50JiZcIm5vbmVcIj09bi5maWxsJiYobi5maWxsPW4uZ3JhZGllbnQpJiZkZWxldGUgbi5ncmFkaWVudCxuLnRyYW5zZm9ybT10aGlzLl8udHJhbnNmb3JtLG59aWYobnVsbD09aSYmdC5pcyhyLFwic3RyaW5nXCIpKXtpZihyPT1oJiZcIm5vbmVcIj09dGhpcy5hdHRycy5maWxsJiZ0aGlzLmF0dHJzLmdyYWRpZW50KXJldHVybiB0aGlzLmF0dHJzLmdyYWRpZW50O2Zvcih2YXIgcz1yLnNwbGl0KHUpLG89e30sbD0wLGY9cy5sZW5ndGg7bDxmO2wrKylyPXNbbF0sciBpbiB0aGlzLmF0dHJzP29bcl09dGhpcy5hdHRyc1tyXTp0LmlzKHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tyXSxcImZ1bmN0aW9uXCIpP29bcl09dGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW3JdLmRlZjpvW3JdPXQuX2F2YWlsYWJsZUF0dHJzW3JdO3JldHVybiBmLTE/bzpvW3NbMF1dfWlmKHRoaXMuYXR0cnMmJm51bGw9PWkmJnQuaXMocixcImFycmF5XCIpKXtmb3Iobz17fSxsPTAsZj1yLmxlbmd0aDtsPGY7bCsrKW9bcltsXV09dGhpcy5hdHRyKHJbbF0pO3JldHVybiBvfXZhciBwO251bGwhPWkmJihwPXt9LHBbcl09aSksbnVsbD09aSYmdC5pcyhyLFwib2JqZWN0XCIpJiYocD1yKTtmb3IodmFyIGQgaW4gcCljKFwicmFwaGFlbC5hdHRyLlwiK2QrXCIuXCIrdGhpcy5pZCx0aGlzLHBbZF0pO2lmKHApe2ZvcihkIGluIHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlcylpZih0aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbZV0oZCkmJnBbZV0oZCkmJnQuaXModGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW2RdLFwiZnVuY3Rpb25cIikpe3ZhciBnPXRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tkXS5hcHBseSh0aGlzLFtdLmNvbmNhdChwW2RdKSk7dGhpcy5hdHRyc1tkXT1wW2RdO2Zvcih2YXIgdiBpbiBnKWdbZV0odikmJihwW3ZdPWdbdl0pfXAudGV4dCYmXCJ0ZXh0XCI9PXRoaXMudHlwZSYmKHRoaXMudGV4dHBhdGguc3RyaW5nPXAudGV4dCksQSh0aGlzLHApfXJldHVybiB0aGlzfSxNLnRvRnJvbnQ9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5yZW1vdmVkJiZ0aGlzLm5vZGUucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLm5vZGUpLHRoaXMucGFwZXImJnRoaXMucGFwZXIudG9wIT10aGlzJiZ0Ll90b2Zyb250KHRoaXMsdGhpcy5wYXBlciksdGhpc30sTS50b0JhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW1vdmVkP3RoaXM6KHRoaXMubm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQhPXRoaXMubm9kZSYmKHRoaXMubm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLm5vZGUsdGhpcy5ub2RlLnBhcmVudE5vZGUuZmlyc3RDaGlsZCksdC5fdG9iYWNrKHRoaXMsdGhpcy5wYXBlcikpLHRoaXMpfSxNLmluc2VydEFmdGVyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlbW92ZWQ/dGhpczooZS5jb25zdHJ1Y3Rvcj09dC5zdC5jb25zdHJ1Y3RvciYmKGU9ZVtlLmxlbmd0aC0xXSksZS5ub2RlLm5leHRTaWJsaW5nP2Uubm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLm5vZGUsZS5ub2RlLm5leHRTaWJsaW5nKTplLm5vZGUucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLm5vZGUpLHQuX2luc2VydGFmdGVyKHRoaXMsZSx0aGlzLnBhcGVyKSx0aGlzKX0sTS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVtb3ZlZD90aGlzOihlLmNvbnN0cnVjdG9yPT10LnN0LmNvbnN0cnVjdG9yJiYoZT1lWzBdKSxlLm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLGUubm9kZSksdC5faW5zZXJ0YmVmb3JlKHRoaXMsZSx0aGlzLnBhcGVyKSx0aGlzKX0sTS5ibHVyPWZ1bmN0aW9uKGUpe3ZhciByPXRoaXMubm9kZS5ydW50aW1lU3R5bGUsaT1yLmZpbHRlcjtyZXR1cm4gaT1pLnJlcGxhY2UoeCxkKSwwIT09K2U/KHRoaXMuYXR0cnMuYmx1cj1lLHIuZmlsdGVyPWkrcCtmK1wiLkJsdXIocGl4ZWxyYWRpdXM9XCIrKCtlfHwxLjUpK1wiKVwiLHIubWFyZ2luPXQuZm9ybWF0KFwiLXswfXB4IDAgMCAtezB9cHhcIixhKCtlfHwxLjUpKSk6KHIuZmlsdGVyPWksci5tYXJnaW49MCxkZWxldGUgdGhpcy5hdHRycy5ibHVyKSx0aGlzfSx0Ll9lbmdpbmUucGF0aD1mdW5jdGlvbih0LGUpe3ZhciByPU4oXCJzaGFwZVwiKTtyLnN0eWxlLmNzc1RleHQ9bSxyLmNvb3Jkc2l6ZT1iK3ArYixyLmNvb3Jkb3JpZ2luPWUuY29vcmRvcmlnaW47dmFyIGk9bmV3IEUocixlKSxuPXtmaWxsOlwibm9uZVwiLHN0cm9rZTpcIiMwMDBcIn07dCYmKG4ucGF0aD10KSxpLnR5cGU9XCJwYXRoXCIsaS5wYXRoPVtdLGkuUGF0aD1kLEEoaSxuKSxlLmNhbnZhcyYmZS5jYW52YXMuYXBwZW5kQ2hpbGQocik7dmFyIGE9TihcInNrZXdcIik7cmV0dXJuIGEub249ITAsci5hcHBlbmRDaGlsZChhKSxpLnNrZXc9YSxpLnRyYW5zZm9ybShkKSxpfSx0Ll9lbmdpbmUucmVjdD1mdW5jdGlvbihlLHIsaSxuLGEscyl7dmFyIG89dC5fcmVjdFBhdGgocixpLG4sYSxzKSxsPWUucGF0aChvKSxoPWwuYXR0cnM7cmV0dXJuIGwuWD1oLng9cixsLlk9aC55PWksbC5XPWgud2lkdGg9bixsLkg9aC5oZWlnaHQ9YSxoLnI9cyxoLnBhdGg9byxsLnR5cGU9XCJyZWN0XCIsbH0sdC5fZW5naW5lLmVsbGlwc2U9ZnVuY3Rpb24odCxlLHIsaSxuKXt2YXIgYT10LnBhdGgoKSxzPWEuYXR0cnM7cmV0dXJuIGEuWD1lLWksYS5ZPXItbixhLlc9MippLGEuSD0yKm4sYS50eXBlPVwiZWxsaXBzZVwiLEEoYSx7Y3g6ZSxjeTpyLHJ4Omkscnk6bn0pLGF9LHQuX2VuZ2luZS5jaXJjbGU9ZnVuY3Rpb24odCxlLHIsaSl7dmFyIG49dC5wYXRoKCksYT1uLmF0dHJzO3JldHVybiBuLlg9ZS1pLG4uWT1yLWksbi5XPW4uSD0yKmksbi50eXBlPVwiY2lyY2xlXCIsQShuLHtjeDplLGN5OnIscjppfSksbn0sdC5fZW5naW5lLmltYWdlPWZ1bmN0aW9uKGUscixpLG4sYSxzKXt2YXIgbz10Ll9yZWN0UGF0aChpLG4sYSxzKSxsPWUucGF0aChvKS5hdHRyKHtzdHJva2U6XCJub25lXCJ9KSx1PWwuYXR0cnMsYz1sLm5vZGUsZj1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdO3JldHVybiB1LnNyYz1yLGwuWD11Lng9aSxsLlk9dS55PW4sbC5XPXUud2lkdGg9YSxsLkg9dS5oZWlnaHQ9cyx1LnBhdGg9byxsLnR5cGU9XCJpbWFnZVwiLGYucGFyZW50Tm9kZT09YyYmYy5yZW1vdmVDaGlsZChmKSxmLnJvdGF0ZT0hMCxmLnNyYz1yLGYudHlwZT1cInRpbGVcIixsLl8uZmlsbHBvcz1baSxuXSxsLl8uZmlsbHNpemU9W2Esc10sYy5hcHBlbmRDaGlsZChmKSxDKGwsMSwxLDAsMCwwKSxsfSx0Ll9lbmdpbmUudGV4dD1mdW5jdGlvbihlLGksbixzKXt2YXIgbz1OKFwic2hhcGVcIiksbD1OKFwicGF0aFwiKSxoPU4oXCJ0ZXh0cGF0aFwiKTtpPWl8fDAsbj1ufHwwLHM9c3x8XCJcIixsLnY9dC5mb3JtYXQoXCJtezB9LHsxfWx7Mn0sezF9XCIsYShpKmIpLGEobipiKSxhKGkqYikrMSksbC50ZXh0cGF0aG9rPSEwLGguc3RyaW5nPXIocyksaC5vbj0hMCxvLnN0eWxlLmNzc1RleHQ9bSxvLmNvb3Jkc2l6ZT1iK3ArYixvLmNvb3Jkb3JpZ2luPVwiMCAwXCI7dmFyIHU9bmV3IEUobyxlKSxjPXtmaWxsOlwiIzAwMFwiLHN0cm9rZTpcIm5vbmVcIixmb250OnQuX2F2YWlsYWJsZUF0dHJzLmZvbnQsdGV4dDpzfTt1LnNoYXBlPW8sdS5wYXRoPWwsdS50ZXh0cGF0aD1oLHUudHlwZT1cInRleHRcIix1LmF0dHJzLnRleHQ9cihzKSx1LmF0dHJzLng9aSx1LmF0dHJzLnk9bix1LmF0dHJzLnc9MSx1LmF0dHJzLmg9MSxBKHUsYyksby5hcHBlbmRDaGlsZChoKSxvLmFwcGVuZENoaWxkKGwpLGUuY2FudmFzLmFwcGVuZENoaWxkKG8pO3ZhciBmPU4oXCJza2V3XCIpO3JldHVybiBmLm9uPSEwLG8uYXBwZW5kQ2hpbGQoZiksdS5za2V3PWYsdS50cmFuc2Zvcm0oZCksdX0sdC5fZW5naW5lLnNldFNpemU9ZnVuY3Rpb24oZSxyKXt2YXIgaT10aGlzLmNhbnZhcy5zdHlsZTtyZXR1cm4gdGhpcy53aWR0aD1lLHRoaXMuaGVpZ2h0PXIsZT09K2UmJihlKz1cInB4XCIpLHI9PStyJiYocis9XCJweFwiKSxpLndpZHRoPWUsaS5oZWlnaHQ9cixpLmNsaXA9XCJyZWN0KDAgXCIrZStcIiBcIityK1wiIDApXCIsdGhpcy5fdmlld0JveCYmdC5fZW5naW5lLnNldFZpZXdCb3guYXBwbHkodGhpcyx0aGlzLl92aWV3Qm94KSx0aGlzfSx0Ll9lbmdpbmUuc2V0Vmlld0JveD1mdW5jdGlvbihlLHIsaSxuLGEpe3QuZXZlKFwicmFwaGFlbC5zZXRWaWV3Qm94XCIsdGhpcyx0aGlzLl92aWV3Qm94LFtlLHIsaSxuLGFdKTt2YXIgcz10aGlzLmdldFNpemUoKSxvPXMud2lkdGgsbD1zLmhlaWdodCxoLHU7cmV0dXJuIGEmJihoPWwvbix1PW8vaSxpKmg8byYmKGUtPShvLWkqaCkvMi9oKSxuKnU8bCYmKHItPShsLW4qdSkvMi91KSksdGhpcy5fdmlld0JveD1bZSxyLGksbiwhIWFdLHRoaXMuX3ZpZXdCb3hTaGlmdD17ZHg6LWUsZHk6LXIsc2NhbGU6c30sdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QudHJhbnNmb3JtKFwiLi4uXCIpfSksdGhpc307dmFyIE47dC5fZW5naW5lLmluaXRXaW49ZnVuY3Rpb24odCl7dmFyIGU9dC5kb2N1bWVudDtlLnN0eWxlU2hlZXRzLmxlbmd0aDwzMT9lLmNyZWF0ZVN0eWxlU2hlZXQoKS5hZGRSdWxlKFwiLnJ2bWxcIixcImJlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpXCIpOmUuc3R5bGVTaGVldHNbMF0uYWRkUnVsZShcIi5ydm1sXCIsXCJiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKVwiKTt0cnl7IWUubmFtZXNwYWNlcy5ydm1sJiZlLm5hbWVzcGFjZXMuYWRkKFwicnZtbFwiLFwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWxcIiksTj1mdW5jdGlvbih0KXtyZXR1cm4gZS5jcmVhdGVFbGVtZW50KFwiPHJ2bWw6XCIrdCsnIGNsYXNzPVwicnZtbFwiPicpfX1jYXRjaChyKXtOPWZ1bmN0aW9uKHQpe3JldHVybiBlLmNyZWF0ZUVsZW1lbnQoXCI8XCIrdCsnIHhtbG5zPVwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LmNvbTp2bWxcIiBjbGFzcz1cInJ2bWxcIj4nKX19fSx0Ll9lbmdpbmUuaW5pdFdpbih0Ll9nLndpbiksdC5fZW5naW5lLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciBlPXQuX2dldENvbnRhaW5lci5hcHBseSgwLGFyZ3VtZW50cykscj1lLmNvbnRhaW5lcixpPWUuaGVpZ2h0LG4sYT1lLndpZHRoLHM9ZS54LG89ZS55O2lmKCFyKXRocm93IG5ldyBFcnJvcihcIlZNTCBjb250YWluZXIgbm90IGZvdW5kLlwiKTt2YXIgbD1uZXcgdC5fUGFwZXIsaD1sLmNhbnZhcz10Ll9nLmRvYy5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHU9aC5zdHlsZTtyZXR1cm4gcz1zfHwwLG89b3x8MCxhPWF8fDUxMixpPWl8fDM0MixsLndpZHRoPWEsbC5oZWlnaHQ9aSxhPT0rYSYmKGErPVwicHhcIiksaT09K2kmJihpKz1cInB4XCIpLGwuY29vcmRzaXplPTFlMypiK3ArMWUzKmIsbC5jb29yZG9yaWdpbj1cIjAgMFwiLGwuc3Bhbj10Ll9nLmRvYy5jcmVhdGVFbGVtZW50KFwic3BhblwiKSxsLnNwYW4uc3R5bGUuY3NzVGV4dD1cInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTk5OTllbTt0b3A6LTk5OTllbTtwYWRkaW5nOjA7bWFyZ2luOjA7bGluZS1oZWlnaHQ6MTtcIixoLmFwcGVuZENoaWxkKGwuc3BhbiksdS5jc3NUZXh0PXQuZm9ybWF0KFwidG9wOjA7bGVmdDowO3dpZHRoOnswfTtoZWlnaHQ6ezF9O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2NsaXA6cmVjdCgwIHswfSB7MX0gMCk7b3ZlcmZsb3c6aGlkZGVuXCIsYSxpKSwxPT1yPyh0Ll9nLmRvYy5ib2R5LmFwcGVuZENoaWxkKGgpLHUubGVmdD1zK1wicHhcIix1LnRvcD1vK1wicHhcIix1LnBvc2l0aW9uPVwiYWJzb2x1dGVcIik6ci5maXJzdENoaWxkP3IuaW5zZXJ0QmVmb3JlKGgsci5maXJzdENoaWxkKTpyLmFwcGVuZENoaWxkKGgpLGwucmVuZGVyZml4PWZ1bmN0aW9uKCl7fSxsfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3QuZXZlKFwicmFwaGFlbC5jbGVhclwiLHRoaXMpLHRoaXMuY2FudmFzLmlubmVySFRNTD1kLHRoaXMuc3Bhbj10Ll9nLmRvYy5jcmVhdGVFbGVtZW50KFwic3BhblwiKSx0aGlzLnNwYW4uc3R5bGUuY3NzVGV4dD1cInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTk5OTllbTt0b3A6LTk5OTllbTtwYWRkaW5nOjA7bWFyZ2luOjA7bGluZS1oZWlnaHQ6MTtkaXNwbGF5OmlubGluZTtcIix0aGlzLmNhbnZhcy5hcHBlbmRDaGlsZCh0aGlzLnNwYW4pLHRoaXMuYm90dG9tPXRoaXMudG9wPW51bGx9LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3QuZXZlKFwicmFwaGFlbC5yZW1vdmVcIix0aGlzKSx0aGlzLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2FudmFzKTtmb3IodmFyIGUgaW4gdGhpcyl0aGlzW2VdPVwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXNbZV0/dC5fcmVtb3ZlZEZhY3RvcnkoZSk6bnVsbDtyZXR1cm4hMH07dmFyIEw9dC5zdDtmb3IodmFyIHogaW4gTSlNW2VdKHopJiYhTFtlXSh6KSYmKExbel09ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24ocil7clt0XS5hcHBseShyLGUpfSl9fSh6KSl9fS5hcHBseShlLGkpLCEodm9pZCAwIT09biYmKHQuZXhwb3J0cz1uKSl9XSl9KTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3ZlbmRvci9hbG1hc2FlZWQyMDEwL2FkbWlubHRlL2Jvd2VyX2NvbXBvbmVudHMvcmFwaGFlbC9yYXBoYWVsLm1pbi5qc1xuLy8gbW9kdWxlIGlkID0gNTFcbi8vIG1vZHVsZSBjaHVua3MgPSAxIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///51\n");
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports) {
+
+eval("/* @license\nmorris.js v0.5.0\nCopyright 2014 Olly Smith All rights reserved.\nLicensed under the BSD-2-Clause License.\n*/\n(function(){var a,b,c,d,e=[].slice,f=function(a,b){return function(){return a.apply(b,arguments)}},g={}.hasOwnProperty,h=function(a,b){function c(){this.constructor=a}for(var d in b)g.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},i=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};b=window.Morris={},a=jQuery,b.EventEmitter=function(){function a(){}return a.prototype.on=function(a,b){return null==this.handlers&&(this.handlers={}),null==this.handlers[a]&&(this.handlers[a]=[]),this.handlers[a].push(b),this},a.prototype.fire=function(){var a,b,c,d,f,g,h;if(c=arguments[0],a=2<=arguments.length?e.call(arguments,1):[],null!=this.handlers&&null!=this.handlers[c]){for(g=this.handlers[c],h=[],d=0,f=g.length;f>d;d++)b=g[d],h.push(b.apply(null,a));return h}},a}(),b.commas=function(a){var b,c,d,e;return null!=a?(d=0>a?\"-\":\"\",b=Math.abs(a),c=Math.floor(b).toFixed(0),d+=c.replace(/(?=(?:\\d{3})+$)(?!^)/g,\",\"),e=b.toString(),e.length>c.length&&(d+=e.slice(c.length)),d):\"-\"},b.pad2=function(a){return(10>a?\"0\":\"\")+a},b.Grid=function(c){function d(b){this.resizeHandler=f(this.resizeHandler,this);var c=this;if(this.el=\"string\"==typeof b.element?a(document.getElementById(b.element)):a(b.element),null==this.el||0===this.el.length)throw new Error(\"Graph container element not found\");\"static\"===this.el.css(\"position\")&&this.el.css(\"position\",\"relative\"),this.options=a.extend({},this.gridDefaults,this.defaults||{},b),\"string\"==typeof this.options.units&&(this.options.postUnits=b.units),this.raphael=new Raphael(this.el[0]),this.elementWidth=null,this.elementHeight=null,this.dirty=!1,this.selectFrom=null,this.init&&this.init(),this.setData(this.options.data),this.el.bind(\"mousemove\",function(a){var b,d,e,f,g;return d=c.el.offset(),g=a.pageX-d.left,c.selectFrom?(b=c.data[c.hitTest(Math.min(g,c.selectFrom))]._x,e=c.data[c.hitTest(Math.max(g,c.selectFrom))]._x,f=e-b,c.selectionRect.attr({x:b,width:f})):c.fire(\"hovermove\",g,a.pageY-d.top)}),this.el.bind(\"mouseleave\",function(){return c.selectFrom&&(c.selectionRect.hide(),c.selectFrom=null),c.fire(\"hoverout\")}),this.el.bind(\"touchstart touchmove touchend\",function(a){var b,d;return d=a.originalEvent.touches[0]||a.originalEvent.changedTouches[0],b=c.el.offset(),c.fire(\"hovermove\",d.pageX-b.left,d.pageY-b.top)}),this.el.bind(\"click\",function(a){var b;return b=c.el.offset(),c.fire(\"gridclick\",a.pageX-b.left,a.pageY-b.top)}),this.options.rangeSelect&&(this.selectionRect=this.raphael.rect(0,0,0,this.el.innerHeight()).attr({fill:this.options.rangeSelectColor,stroke:!1}).toBack().hide(),this.el.bind(\"mousedown\",function(a){var b;return b=c.el.offset(),c.startRange(a.pageX-b.left)}),this.el.bind(\"mouseup\",function(a){var b;return b=c.el.offset(),c.endRange(a.pageX-b.left),c.fire(\"hovermove\",a.pageX-b.left,a.pageY-b.top)})),this.options.resize&&a(window).bind(\"resize\",function(){return null!=c.timeoutId&&window.clearTimeout(c.timeoutId),c.timeoutId=window.setTimeout(c.resizeHandler,100)}),this.el.css(\"-webkit-tap-highlight-color\",\"rgba(0,0,0,0)\"),this.postInit&&this.postInit()}return h(d,c),d.prototype.gridDefaults={dateFormat:null,axes:!0,grid:!0,gridLineColor:\"#aaa\",gridStrokeWidth:.5,gridTextColor:\"#888\",gridTextSize:12,gridTextFamily:\"sans-serif\",gridTextWeight:\"normal\",hideHover:!1,yLabelFormat:null,xLabelAngle:0,numLines:5,padding:25,parseTime:!0,postUnits:\"\",preUnits:\"\",ymax:\"auto\",ymin:\"auto 0\",goals:[],goalStrokeWidth:1,goalLineColors:[\"#666633\",\"#999966\",\"#cc6666\",\"#663333\"],events:[],eventStrokeWidth:1,eventLineColors:[\"#005a04\",\"#ccffbb\",\"#3a5f0b\",\"#005502\"],rangeSelect:null,rangeSelectColor:\"#eef\",resize:!1},d.prototype.setData=function(a,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;return null==c&&(c=!0),this.options.data=a,null==a||0===a.length?(this.data=[],this.raphael.clear(),null!=this.hover&&this.hover.hide(),void 0):(o=this.cumulative?0:null,p=this.cumulative?0:null,this.options.goals.length>0&&(h=Math.min.apply(Math,this.options.goals),g=Math.max.apply(Math,this.options.goals),p=null!=p?Math.min(p,h):h,o=null!=o?Math.max(o,g):g),this.data=function(){var c,d,g;for(g=[],f=c=0,d=a.length;d>c;f=++c)j=a[f],i={src:j},i.label=j[this.options.xkey],this.options.parseTime?(i.x=b.parseDate(i.label),this.options.dateFormat?i.label=this.options.dateFormat(i.x):\"number\"==typeof i.label&&(i.label=new Date(i.label).toString())):(i.x=f,this.options.xLabelFormat&&(i.label=this.options.xLabelFormat(i))),l=0,i.y=function(){var a,b,c,d;for(c=this.options.ykeys,d=[],e=a=0,b=c.length;b>a;e=++a)n=c[e],q=j[n],\"string\"==typeof q&&(q=parseFloat(q)),null!=q&&\"number\"!=typeof q&&(q=null),null!=q&&(this.cumulative?l+=q:null!=o?(o=Math.max(q,o),p=Math.min(q,p)):o=p=q),this.cumulative&&null!=l&&(o=Math.max(l,o),p=Math.min(l,p)),d.push(q);return d}.call(this),g.push(i);return g}.call(this),this.options.parseTime&&(this.data=this.data.sort(function(a,b){return(a.x>b.x)-(b.x>a.x)})),this.xmin=this.data[0].x,this.xmax=this.data[this.data.length-1].x,this.events=[],this.options.events.length>0&&(this.events=this.options.parseTime?function(){var a,c,e,f;for(e=this.options.events,f=[],a=0,c=e.length;c>a;a++)d=e[a],f.push(b.parseDate(d));return f}.call(this):this.options.events,this.xmax=Math.max(this.xmax,Math.max.apply(Math,this.events)),this.xmin=Math.min(this.xmin,Math.min.apply(Math,this.events))),this.xmin===this.xmax&&(this.xmin-=1,this.xmax+=1),this.ymin=this.yboundary(\"min\",p),this.ymax=this.yboundary(\"max\",o),this.ymin===this.ymax&&(p&&(this.ymin-=1),this.ymax+=1),((r=this.options.axes)===!0||\"both\"===r||\"y\"===r||this.options.grid===!0)&&(this.options.ymax===this.gridDefaults.ymax&&this.options.ymin===this.gridDefaults.ymin?(this.grid=this.autoGridLines(this.ymin,this.ymax,this.options.numLines),this.ymin=Math.min(this.ymin,this.grid[0]),this.ymax=Math.max(this.ymax,this.grid[this.grid.length-1])):(k=(this.ymax-this.ymin)/(this.options.numLines-1),this.grid=function(){var a,b,c,d;for(d=[],m=a=b=this.ymin,c=this.ymax;k>0?c>=a:a>=c;m=a+=k)d.push(m);return d}.call(this))),this.dirty=!0,c?this.redraw():void 0)},d.prototype.yboundary=function(a,b){var c,d;return c=this.options[\"y\"+a],\"string\"==typeof c?\"auto\"===c.slice(0,4)?c.length>5?(d=parseInt(c.slice(5),10),null==b?d:Math[a](b,d)):null!=b?b:0:parseInt(c,10):c},d.prototype.autoGridLines=function(a,b,c){var d,e,f,g,h,i,j,k,l;return h=b-a,l=Math.floor(Math.log(h)/Math.log(10)),j=Math.pow(10,l),e=Math.floor(a/j)*j,d=Math.ceil(b/j)*j,i=(d-e)/(c-1),1===j&&i>1&&Math.ceil(i)!==i&&(i=Math.ceil(i),d=e+i*(c-1)),0>e&&d>0&&(e=Math.floor(a/i)*i,d=Math.ceil(b/i)*i),1>i?(g=Math.floor(Math.log(i)/Math.log(10)),f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(parseFloat(k.toFixed(1-g)));return b}()):f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(k);return b}(),f},d.prototype._calc=function(){var a,b,c,d,e,f,g,h;return e=this.el.width(),c=this.el.height(),(this.elementWidth!==e||this.elementHeight!==c||this.dirty)&&(this.elementWidth=e,this.elementHeight=c,this.dirty=!1,this.left=this.options.padding,this.right=this.elementWidth-this.options.padding,this.top=this.options.padding,this.bottom=this.elementHeight-this.options.padding,((g=this.options.axes)===!0||\"both\"===g||\"y\"===g)&&(f=function(){var a,c,d,e;for(d=this.grid,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(this.measureText(this.yAxisFormat(b)).width);return e}.call(this),this.left+=Math.max.apply(Math,f)),((h=this.options.axes)===!0||\"both\"===h||\"x\"===h)&&(a=function(){var a,b,c;for(c=[],d=a=0,b=this.data.length;b>=0?b>a:a>b;d=b>=0?++a:--a)c.push(this.measureText(this.data[d].text,-this.options.xLabelAngle).height);return c}.call(this),this.bottom-=Math.max.apply(Math,a)),this.width=Math.max(1,this.right-this.left),this.height=Math.max(1,this.bottom-this.top),this.dx=this.width/(this.xmax-this.xmin),this.dy=this.height/(this.ymax-this.ymin),this.calc)?this.calc():void 0},d.prototype.transY=function(a){return this.bottom-(a-this.ymin)*this.dy},d.prototype.transX=function(a){return 1===this.data.length?(this.left+this.right)/2:this.left+(a-this.xmin)*this.dx},d.prototype.redraw=function(){return this.raphael.clear(),this._calc(),this.drawGrid(),this.drawGoals(),this.drawEvents(),this.draw?this.draw():void 0},d.prototype.measureText=function(a,b){var c,d;return null==b&&(b=0),d=this.raphael.text(100,100,a).attr(\"font-size\",this.options.gridTextSize).attr(\"font-family\",this.options.gridTextFamily).attr(\"font-weight\",this.options.gridTextWeight).rotate(b),c=d.getBBox(),d.remove(),c},d.prototype.yAxisFormat=function(a){return this.yLabelFormat(a)},d.prototype.yLabelFormat=function(a){return\"function\"==typeof this.options.yLabelFormat?this.options.yLabelFormat(a):\"\"+this.options.preUnits+b.commas(a)+this.options.postUnits},d.prototype.drawGrid=function(){var a,b,c,d,e,f,g,h;if(this.options.grid!==!1||(e=this.options.axes)===!0||\"both\"===e||\"y\"===e){for(f=this.grid,h=[],c=0,d=f.length;d>c;c++)a=f[c],b=this.transY(a),((g=this.options.axes)===!0||\"both\"===g||\"y\"===g)&&this.drawYAxisLabel(this.left-this.options.padding/2,b,this.yAxisFormat(a)),this.options.grid?h.push(this.drawGridLine(\"M\"+this.left+\",\"+b+\"H\"+(this.left+this.width))):h.push(void 0);return h}},d.prototype.drawGoals=function(){var a,b,c,d,e,f,g;for(f=this.options.goals,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.goalLineColors[c%this.options.goalLineColors.length],g.push(this.drawGoal(b,a));return g},d.prototype.drawEvents=function(){var a,b,c,d,e,f,g;for(f=this.events,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.eventLineColors[c%this.options.eventLineColors.length],g.push(this.drawEvent(b,a));return g},d.prototype.drawGoal=function(a,b){return this.raphael.path(\"M\"+this.left+\",\"+this.transY(a)+\"H\"+this.right).attr(\"stroke\",b).attr(\"stroke-width\",this.options.goalStrokeWidth)},d.prototype.drawEvent=function(a,b){return this.raphael.path(\"M\"+this.transX(a)+\",\"+this.bottom+\"V\"+this.top).attr(\"stroke\",b).attr(\"stroke-width\",this.options.eventStrokeWidth)},d.prototype.drawYAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr(\"font-size\",this.options.gridTextSize).attr(\"font-family\",this.options.gridTextFamily).attr(\"font-weight\",this.options.gridTextWeight).attr(\"fill\",this.options.gridTextColor).attr(\"text-anchor\",\"end\")},d.prototype.drawGridLine=function(a){return this.raphael.path(a).attr(\"stroke\",this.options.gridLineColor).attr(\"stroke-width\",this.options.gridStrokeWidth)},d.prototype.startRange=function(a){return this.hover.hide(),this.selectFrom=a,this.selectionRect.attr({x:a,width:0}).show()},d.prototype.endRange=function(a){var b,c;return this.selectFrom?(c=Math.min(this.selectFrom,a),b=Math.max(this.selectFrom,a),this.options.rangeSelect.call(this.el,{start:this.data[this.hitTest(c)].x,end:this.data[this.hitTest(b)].x}),this.selectFrom=null):void 0},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.parseDate=function(a){var b,c,d,e,f,g,h,i,j,k,l;return\"number\"==typeof a?a:(c=a.match(/^(\\d+) Q(\\d)$/),e=a.match(/^(\\d+)-(\\d+)$/),f=a.match(/^(\\d+)-(\\d+)-(\\d+)$/),h=a.match(/^(\\d+) W(\\d+)$/),i=a.match(/^(\\d+)-(\\d+)-(\\d+)[ T](\\d+):(\\d+)(Z|([+-])(\\d\\d):?(\\d\\d))?$/),j=a.match(/^(\\d+)-(\\d+)-(\\d+)[ T](\\d+):(\\d+):(\\d+(\\.\\d+)?)(Z|([+-])(\\d\\d):?(\\d\\d))?$/),c?new Date(parseInt(c[1],10),3*parseInt(c[2],10)-1,1).getTime():e?new Date(parseInt(e[1],10),parseInt(e[2],10)-1,1).getTime():f?new Date(parseInt(f[1],10),parseInt(f[2],10)-1,parseInt(f[3],10)).getTime():h?(k=new Date(parseInt(h[1],10),0,1),4!==k.getDay()&&k.setMonth(0,1+(4-k.getDay()+7)%7),k.getTime()+6048e5*parseInt(h[2],10)):i?i[6]?(g=0,\"Z\"!==i[6]&&(g=60*parseInt(i[8],10)+parseInt(i[9],10),\"+\"===i[7]&&(g=0-g)),Date.UTC(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)+g)):new Date(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)).getTime():j?(l=parseFloat(j[6]),b=Math.floor(l),d=Math.round(1e3*(l-b)),j[8]?(g=0,\"Z\"!==j[8]&&(g=60*parseInt(j[10],10)+parseInt(j[11],10),\"+\"===j[9]&&(g=0-g)),Date.UTC(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10)+g,b,d)):new Date(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10),b,d).getTime()):new Date(parseInt(a,10),0,1).getTime())},b.Hover=function(){function c(c){null==c&&(c={}),this.options=a.extend({},b.Hover.defaults,c),this.el=a(\"<div class='\"+this.options[\"class\"]+\"'></div>\"),this.el.hide(),this.options.parent.append(this.el)}return c.defaults={\"class\":\"morris-hover morris-default-style\"},c.prototype.update=function(a,b,c){return a?(this.html(a),this.show(),this.moveTo(b,c)):this.hide()},c.prototype.html=function(a){return this.el.html(a)},c.prototype.moveTo=function(a,b){var c,d,e,f,g,h;return g=this.options.parent.innerWidth(),f=this.options.parent.innerHeight(),d=this.el.outerWidth(),c=this.el.outerHeight(),e=Math.min(Math.max(0,a-d/2),g-d),null!=b?(h=b-c-10,0>h&&(h=b+10,h+c>f&&(h=f/2-c/2))):h=f/2-c/2,this.el.css({left:e+\"px\",top:parseInt(h)+\"px\"})},c.prototype.show=function(){return this.el.show()},c.prototype.hide=function(){return this.el.hide()},c}(),b.Line=function(a){function c(a){return this.hilight=f(this.hilight,this),this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Line?(c.__super__.constructor.call(this,a),void 0):new b.Line(a)}return h(c,a),c.prototype.init=function(){return\"always\"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on(\"hovermove\",this.onHoverMove),this.on(\"hoverout\",this.onHoverOut),this.on(\"gridclick\",this.onGridClick)):void 0},c.prototype.defaults={lineWidth:3,pointSize:4,lineColors:[\"#0b62a4\",\"#7A92A3\",\"#4da74d\",\"#afd8f8\",\"#edc240\",\"#cb4b4b\",\"#9440ed\"],pointStrokeWidths:[1],pointStrokeColors:[\"#ffffff\"],pointFillColors:[],smooth:!0,xLabels:\"auto\",xLabelFormat:null,xLabelMargin:24,hideHover:!1},c.prototype.calc=function(){return this.calcPoints(),this.generatePaths()},c.prototype.calcPoints=function(){var a,b,c,d,e,f;for(e=this.data,f=[],c=0,d=e.length;d>c;c++)a=e[c],a._x=this.transX(a.x),a._y=function(){var c,d,e,f;for(e=a.y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b?f.push(this.transY(b)):f.push(b);return f}.call(this),f.push(a._ymax=Math.min.apply(Math,[this.bottom].concat(function(){var c,d,e,f;for(e=a._y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b&&f.push(b);return f}())));return f},c.prototype.hitTest=function(a){var b,c,d,e,f;if(0===this.data.length)return null;for(f=this.data.slice(1),b=d=0,e=f.length;e>d&&(c=f[b],!(a<(c._x+this.data[b]._x)/2));b=++d);return b},c.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire(\"click\",c,this.data[c].src,a,b)},c.prototype.onHoverMove=function(a){var b;return b=this.hitTest(a),this.displayHoverForRow(b)},c.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.displayHoverForRow(null):void 0},c.prototype.displayHoverForRow=function(a){var b;return null!=a?((b=this.hover).update.apply(b,this.hoverContentForRow(a)),this.hilight(a)):(this.hover.hide(),this.hilight())},c.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h;for(d=this.data[a],b=\"<div class='morris-hover-row-label'>\"+d.label+\"</div>\",h=d.y,c=f=0,g=h.length;g>f;c=++f)e=h[c],b+=\"<div class='morris-hover-point' style='color: \"+this.colorFor(d,c,\"label\")+\"'>\\n \"+this.options.labels[c]+\":\\n \"+this.yLabelFormat(e)+\"\\n</div>\";return\"function\"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),[b,d._x,d._ymax]},c.prototype.generatePaths=function(){var a,c,d,e;return this.paths=function(){var f,g,h,j;for(j=[],c=f=0,g=this.options.ykeys.length;g>=0?g>f:f>g;c=g>=0?++f:--f)e=\"boolean\"==typeof this.options.smooth?this.options.smooth:(h=this.options.ykeys[c],i.call(this.options.smooth,h)>=0),a=function(){var a,b,e,f;for(e=this.data,f=[],a=0,b=e.length;b>a;a++)d=e[a],void 0!==d._y[c]&&f.push({x:d._x,y:d._y[c]});return f}.call(this),a.length>1?j.push(b.Line.createPath(a,e,this.bottom)):j.push(null);return j}.call(this)},c.prototype.draw=function(){var a;return((a=this.options.axes)===!0||\"both\"===a||\"x\"===a)&&this.drawXAxis(),this.drawSeries(),this.options.hideHover===!1?this.displayHoverForRow(this.data.length-1):void 0},c.prototype.drawXAxis=function(){var a,c,d,e,f,g,h,i,j,k,l=this;for(h=this.bottom+this.options.padding/2,f=null,e=null,a=function(a,b){var c,d,g,i,j;return c=l.drawXAxisLabel(l.transX(b),h,a),j=c.getBBox(),c.transform(\"r\"+-l.options.xLabelAngle),d=c.getBBox(),c.transform(\"t0,\"+d.height/2+\"...\"),0!==l.options.xLabelAngle&&(i=-.5*j.width*Math.cos(l.options.xLabelAngle*Math.PI/180),c.transform(\"t\"+i+\",0...\")),d=c.getBBox(),(null==f||f>=d.x+d.width||null!=e&&e>=d.x)&&d.x>=0&&d.x+d.width<l.el.width()?(0!==l.options.xLabelAngle&&(g=1.25*l.options.gridTextSize/Math.sin(l.options.xLabelAngle*Math.PI/180),e=d.x-g),f=d.x-l.options.xLabelMargin):c.remove()},d=this.options.parseTime?1===this.data.length&&\"auto\"===this.options.xLabels?[[this.data[0].label,this.data[0].x]]:b.labelSeries(this.xmin,this.xmax,this.width,this.options.xLabels,this.options.xLabelFormat):function(){var a,b,c,d;for(c=this.data,d=[],a=0,b=c.length;b>a;a++)g=c[a],d.push([g.label,g.x]);return d}.call(this),d.reverse(),k=[],i=0,j=d.length;j>i;i++)c=d[i],k.push(a(c[0],c[1]));return k},c.prototype.drawSeries=function(){var a,b,c,d,e,f;for(this.seriesPoints=[],a=b=d=this.options.ykeys.length-1;0>=d?0>=b:b>=0;a=0>=d?++b:--b)this._drawLineFor(a);for(f=[],a=c=e=this.options.ykeys.length-1;0>=e?0>=c:c>=0;a=0>=e?++c:--c)f.push(this._drawPointFor(a));return f},c.prototype._drawPointFor=function(a){var b,c,d,e,f,g;for(this.seriesPoints[a]=[],f=this.data,g=[],d=0,e=f.length;e>d;d++)c=f[d],b=null,null!=c._y[a]&&(b=this.drawLinePoint(c._x,c._y[a],this.colorFor(c,a,\"point\"),a)),g.push(this.seriesPoints[a].push(b));return g},c.prototype._drawLineFor=function(a){var b;return b=this.paths[a],null!==b?this.drawLinePath(b,this.colorFor(null,a,\"line\"),a):void 0},c.createPath=function(a,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r;for(k=\"\",c&&(g=b.Line.gradients(a)),l={y:null},h=q=0,r=a.length;r>q;h=++q)e=a[h],null!=e.y&&(null!=l.y?c?(f=g[h],j=g[h-1],i=(e.x-l.x)/4,m=l.x+i,o=Math.min(d,l.y+i*j),n=e.x-i,p=Math.min(d,e.y-i*f),k+=\"C\"+m+\",\"+o+\",\"+n+\",\"+p+\",\"+e.x+\",\"+e.y):k+=\"L\"+e.x+\",\"+e.y:c&&null==g[h]||(k+=\"M\"+e.x+\",\"+e.y)),l=e;return k},c.gradients=function(a){var b,c,d,e,f,g,h,i;for(c=function(a,b){return(a.y-b.y)/(a.x-b.x)},i=[],d=g=0,h=a.length;h>g;d=++g)b=a[d],null!=b.y?(e=a[d+1]||{y:null},f=a[d-1]||{y:null},null!=f.y&&null!=e.y?i.push(c(f,e)):null!=f.y?i.push(c(f,b)):null!=e.y?i.push(c(b,e)):i.push(null)):i.push(null);return i},c.prototype.hilight=function(a){var b,c,d,e,f;if(null!==this.prevHilight&&this.prevHilight!==a)for(b=c=0,e=this.seriesPoints.length-1;e>=0?e>=c:c>=e;b=e>=0?++c:--c)this.seriesPoints[b][this.prevHilight]&&this.seriesPoints[b][this.prevHilight].animate(this.pointShrinkSeries(b));if(null!==a&&this.prevHilight!==a)for(b=d=0,f=this.seriesPoints.length-1;f>=0?f>=d:d>=f;b=f>=0?++d:--d)this.seriesPoints[b][a]&&this.seriesPoints[b][a].animate(this.pointGrowSeries(b));return this.prevHilight=a},c.prototype.colorFor=function(a,b,c){return\"function\"==typeof this.options.lineColors?this.options.lineColors.call(this,a,b,c):\"point\"===c?this.options.pointFillColors[b%this.options.pointFillColors.length]||this.options.lineColors[b%this.options.lineColors.length]:this.options.lineColors[b%this.options.lineColors.length]},c.prototype.drawXAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr(\"font-size\",this.options.gridTextSize).attr(\"font-family\",this.options.gridTextFamily).attr(\"font-weight\",this.options.gridTextWeight).attr(\"fill\",this.options.gridTextColor)},c.prototype.drawLinePath=function(a,b,c){return this.raphael.path(a).attr(\"stroke\",b).attr(\"stroke-width\",this.lineWidthForSeries(c))},c.prototype.drawLinePoint=function(a,b,c,d){return this.raphael.circle(a,b,this.pointSizeForSeries(d)).attr(\"fill\",c).attr(\"stroke-width\",this.pointStrokeWidthForSeries(d)).attr(\"stroke\",this.pointStrokeColorForSeries(d))},c.prototype.pointStrokeWidthForSeries=function(a){return this.options.pointStrokeWidths[a%this.options.pointStrokeWidths.length]},c.prototype.pointStrokeColorForSeries=function(a){return this.options.pointStrokeColors[a%this.options.pointStrokeColors.length]},c.prototype.lineWidthForSeries=function(a){return this.options.lineWidth instanceof Array?this.options.lineWidth[a%this.options.lineWidth.length]:this.options.lineWidth},c.prototype.pointSizeForSeries=function(a){return this.options.pointSize instanceof Array?this.options.pointSize[a%this.options.pointSize.length]:this.options.pointSize},c.prototype.pointGrowSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)+3},25,\"linear\")},c.prototype.pointShrinkSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)},25,\"linear\")},c}(b.Grid),b.labelSeries=function(c,d,e,f,g){var h,i,j,k,l,m,n,o,p,q,r;if(j=200*(d-c)/e,i=new Date(c),n=b.LABEL_SPECS[f],void 0===n)for(r=b.AUTO_LABEL_ORDER,p=0,q=r.length;q>p;p++)if(k=r[p],m=b.LABEL_SPECS[k],j>=m.span){n=m;break}for(void 0===n&&(n=b.LABEL_SPECS.second),g&&(n=a.extend({},n,{fmt:g})),h=n.start(i),l=[];(o=h.getTime())<=d;)o>=c&&l.push([n.fmt(h),o]),n.incr(h);return l},c=function(a){return{span:60*a*1e3,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours())},fmt:function(a){return\"\"+b.pad2(a.getHours())+\":\"+b.pad2(a.getMinutes())},incr:function(b){return b.setUTCMinutes(b.getUTCMinutes()+a)}}},d=function(a){return{span:1e3*a,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours(),a.getMinutes())},fmt:function(a){return\"\"+b.pad2(a.getHours())+\":\"+b.pad2(a.getMinutes())+\":\"+b.pad2(a.getSeconds())},incr:function(b){return b.setUTCSeconds(b.getUTCSeconds()+a)}}},b.LABEL_SPECS={decade:{span:1728e8,start:function(a){return new Date(a.getFullYear()-a.getFullYear()%10,0,1)},fmt:function(a){return\"\"+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+10)}},year:{span:1728e7,start:function(a){return new Date(a.getFullYear(),0,1)},fmt:function(a){return\"\"+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+1)}},month:{span:24192e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),1)},fmt:function(a){return\"\"+a.getFullYear()+\"-\"+b.pad2(a.getMonth()+1)},incr:function(a){return a.setMonth(a.getMonth()+1)}},week:{span:6048e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return\"\"+a.getFullYear()+\"-\"+b.pad2(a.getMonth()+1)+\"-\"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+7)}},day:{span:864e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return\"\"+a.getFullYear()+\"-\"+b.pad2(a.getMonth()+1)+\"-\"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+1)}},hour:c(60),\"30min\":c(30),\"15min\":c(15),\"10min\":c(10),\"5min\":c(5),minute:c(1),\"30sec\":d(30),\"15sec\":d(15),\"10sec\":d(10),\"5sec\":d(5),second:d(1)},b.AUTO_LABEL_ORDER=[\"decade\",\"year\",\"month\",\"week\",\"day\",\"hour\",\"30min\",\"15min\",\"10min\",\"5min\",\"minute\",\"30sec\",\"15sec\",\"10sec\",\"5sec\",\"second\"],b.Area=function(c){function d(c){var f;return this instanceof b.Area?(f=a.extend({},e,c),this.cumulative=!f.behaveLikeLine,\"auto\"===f.fillOpacity&&(f.fillOpacity=f.behaveLikeLine?.8:1),d.__super__.constructor.call(this,f),void 0):new b.Area(c)}var e;return h(d,c),e={fillOpacity:\"auto\",behaveLikeLine:!1},d.prototype.calcPoints=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],d=0,e=f.length;e>d;d++)a=f[d],a._x=this.transX(a.x),b=0,a._y=function(){var d,e,f,g;for(f=a.y,g=[],d=0,e=f.length;e>d;d++)c=f[d],this.options.behaveLikeLine?g.push(this.transY(c)):(b+=c||0,g.push(this.transY(b)));return g}.call(this),g.push(a._ymax=Math.max.apply(Math,a._y));return g},d.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h;for(this.seriesPoints=[],b=this.options.behaveLikeLine?function(){f=[];for(var a=0,b=this.options.ykeys.length-1;b>=0?b>=a:a>=b;b>=0?a++:a--)f.push(a);return f}.apply(this):function(){g=[];for(var a=e=this.options.ykeys.length-1;0>=e?0>=a:a>=0;0>=e?a++:a--)g.push(a);return g}.apply(this),h=[],c=0,d=b.length;d>c;c++)a=b[c],this._drawFillFor(a),this._drawLineFor(a),h.push(this._drawPointFor(a));return h},d.prototype._drawFillFor=function(a){var b;return b=this.paths[a],null!==b?(b+=\"L\"+this.transX(this.xmax)+\",\"+this.bottom+\"L\"+this.transX(this.xmin)+\",\"+this.bottom+\"Z\",this.drawFilledPath(b,this.fillForSeries(a))):void 0},d.prototype.fillForSeries=function(a){var b;return b=Raphael.rgb2hsl(this.colorFor(this.data[a],a,\"line\")),Raphael.hsl(b.h,this.options.behaveLikeLine?.9*b.s:.75*b.s,Math.min(.98,this.options.behaveLikeLine?1.2*b.l:1.25*b.l))},d.prototype.drawFilledPath=function(a,b){return this.raphael.path(a).attr(\"fill\",b).attr(\"fill-opacity\",this.options.fillOpacity).attr(\"stroke\",\"none\")},d}(b.Line),b.Bar=function(c){function d(c){return this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Bar?(d.__super__.constructor.call(this,a.extend({},c,{parseTime:!1})),void 0):new b.Bar(c)}return h(d,c),d.prototype.init=function(){return this.cumulative=this.options.stacked,\"always\"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on(\"hovermove\",this.onHoverMove),this.on(\"hoverout\",this.onHoverOut),this.on(\"gridclick\",this.onGridClick)):void 0},d.prototype.defaults={barSizeRatio:.75,barGap:3,barColors:[\"#0b62a4\",\"#7a92a3\",\"#4da74d\",\"#afd8f8\",\"#edc240\",\"#cb4b4b\",\"#9440ed\"],barOpacity:1,barRadius:[0,0,0,0],xLabelMargin:50},d.prototype.calc=function(){var a;return this.calcBars(),this.options.hideHover===!1?(a=this.hover).update.apply(a,this.hoverContentForRow(this.data.length-1)):void 0},d.prototype.calcBars=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],a=d=0,e=f.length;e>d;a=++d)b=f[a],b._x=this.left+this.width*(a+.5)/this.data.length,g.push(b._y=function(){var a,d,e,f;for(e=b.y,f=[],a=0,d=e.length;d>a;a++)c=e[a],null!=c?f.push(this.transY(c)):f.push(null);return f}.call(this));return g},d.prototype.draw=function(){var a;return((a=this.options.axes)===!0||\"both\"===a||\"x\"===a)&&this.drawXAxis(),this.drawSeries()},d.prototype.drawXAxis=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m;for(j=this.bottom+(this.options.xAxisLabelTopPadding||this.options.padding/2),g=null,f=null,m=[],a=k=0,l=this.data.length;l>=0?l>k:k>l;a=l>=0?++k:--k)h=this.data[this.data.length-1-a],b=this.drawXAxisLabel(h._x,j,h.label),i=b.getBBox(),b.transform(\"r\"+-this.options.xLabelAngle),c=b.getBBox(),b.transform(\"t0,\"+c.height/2+\"...\"),0!==this.options.xLabelAngle&&(e=-.5*i.width*Math.cos(this.options.xLabelAngle*Math.PI/180),b.transform(\"t\"+e+\",0...\")),(null==g||g>=c.x+c.width||null!=f&&f>=c.x)&&c.x>=0&&c.x+c.width<this.el.width()?(0!==this.options.xLabelAngle&&(d=1.25*this.options.gridTextSize/Math.sin(this.options.xLabelAngle*Math.PI/180),f=c.x-d),m.push(g=c.x-this.options.xLabelMargin)):m.push(b.remove());return m},d.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;return c=this.width/this.options.data.length,h=this.options.stacked?1:this.options.ykeys.length,a=(c*this.options.barSizeRatio-this.options.barGap*(h-1))/h,this.options.barSize&&(a=Math.min(a,this.options.barSize)),l=c-a*h-this.options.barGap*(h-1),g=l/2,o=this.ymin<=0&&this.ymax>=0?this.transY(0):null,this.bars=function(){var h,l,p,q;for(p=this.data,q=[],d=h=0,l=p.length;l>h;d=++h)i=p[d],e=0,q.push(function(){var h,l,p,q;for(p=i._y,q=[],j=h=0,l=p.length;l>h;j=++h)n=p[j],null!==n?(o?(m=Math.min(n,o),b=Math.max(n,o)):(m=n,b=this.bottom),f=this.left+d*c+g,this.options.stacked||(f+=j*(a+this.options.barGap)),k=b-m,this.options.verticalGridCondition&&this.options.verticalGridCondition(i.x)&&this.drawBar(this.left+d*c,this.top,c,Math.abs(this.top-this.bottom),this.options.verticalGridColor,this.options.verticalGridOpacity,this.options.barRadius),this.options.stacked&&(m-=e),this.drawBar(f,m,a,k,this.colorFor(i,j,\"bar\"),this.options.barOpacity,this.options.barRadius),q.push(e+=k)):q.push(null);return q}.call(this));return q}.call(this)},d.prototype.colorFor=function(a,b,c){var d,e;return\"function\"==typeof this.options.barColors?(d={x:a.x,y:a.y[b],label:a.label},e={index:b,key:this.options.ykeys[b],label:this.options.labels[b]},this.options.barColors.call(this,d,e,c)):this.options.barColors[b%this.options.barColors.length]},d.prototype.hitTest=function(a){return 0===this.data.length?null:(a=Math.max(Math.min(a,this.right),this.left),Math.min(this.data.length-1,Math.floor((a-this.left)/(this.width/this.data.length))))},d.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire(\"click\",c,this.data[c].src,a,b)},d.prototype.onHoverMove=function(a){var b,c;return b=this.hitTest(a),(c=this.hover).update.apply(c,this.hoverContentForRow(b))},d.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.hover.hide():void 0},d.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h,i;for(d=this.data[a],b=\"<div class='morris-hover-row-label'>\"+d.label+\"</div>\",i=d.y,c=g=0,h=i.length;h>g;c=++g)f=i[c],b+=\"<div class='morris-hover-point' style='color: \"+this.colorFor(d,c,\"label\")+\"'>\\n \"+this.options.labels[c]+\":\\n \"+this.yLabelFormat(f)+\"\\n</div>\";return\"function\"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),e=this.left+(a+.5)*this.width/this.data.length,[b,e]},d.prototype.drawXAxisLabel=function(a,b,c){var d;return d=this.raphael.text(a,b,c).attr(\"font-size\",this.options.gridTextSize).attr(\"font-family\",this.options.gridTextFamily).attr(\"font-weight\",this.options.gridTextWeight).attr(\"fill\",this.options.gridTextColor)},d.prototype.drawBar=function(a,b,c,d,e,f,g){var h,i;return h=Math.max.apply(Math,g),i=0===h||h>d?this.raphael.rect(a,b,c,d):this.raphael.path(this.roundedRect(a,b,c,d,g)),i.attr(\"fill\",e).attr(\"fill-opacity\",f).attr(\"stroke\",\"none\")},d.prototype.roundedRect=function(a,b,c,d,e){return null==e&&(e=[0,0,0,0]),[\"M\",a,e[0]+b,\"Q\",a,b,a+e[0],b,\"L\",a+c-e[1],b,\"Q\",a+c,b,a+c,b+e[1],\"L\",a+c,b+d-e[2],\"Q\",a+c,b+d,a+c-e[2],b+d,\"L\",a+e[3],b+d,\"Q\",a,b+d,a,b+d-e[3],\"Z\"]},d}(b.Grid),b.Donut=function(c){function d(c){this.resizeHandler=f(this.resizeHandler,this),this.select=f(this.select,this),this.click=f(this.click,this);var d=this;if(!(this instanceof b.Donut))return new b.Donut(c);if(this.options=a.extend({},this.defaults,c),this.el=\"string\"==typeof c.element?a(document.getElementById(c.element)):a(c.element),null===this.el||0===this.el.length)throw new Error(\"Graph placeholder not found.\");void 0!==c.data&&0!==c.data.length&&(this.raphael=new Raphael(this.el[0]),this.options.resize&&a(window).bind(\"resize\",function(){return null!=d.timeoutId&&window.clearTimeout(d.timeoutId),d.timeoutId=window.setTimeout(d.resizeHandler,100)}),this.setData(c.data))}return h(d,c),d.prototype.defaults={colors:[\"#0B62A4\",\"#3980B5\",\"#679DC6\",\"#95BBD7\",\"#B0CCE1\",\"#095791\",\"#095085\",\"#083E67\",\"#052C48\",\"#042135\"],backgroundColor:\"#FFFFFF\",labelColor:\"#000000\",formatter:b.commas,resize:!1},d.prototype.redraw=function(){var a,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;for(this.raphael.clear(),c=this.el.width()/2,d=this.el.height()/2,n=(Math.min(c,d)-10)/3,l=0,u=this.values,o=0,r=u.length;r>o;o++)m=u[o],l+=m;for(i=5/(2*n),a=1.9999*Math.PI-i*this.data.length,g=0,f=0,this.segments=[],v=this.values,e=p=0,s=v.length;s>p;e=++p)m=v[e],j=g+i+a*(m/l),k=new b.DonutSegment(c,d,2*n,n,g,j,this.data[e].color||this.options.colors[f%this.options.colors.length],this.options.backgroundColor,f,this.raphael),k.render(),this.segments.push(k),k.on(\"hover\",this.select),k.on(\"click\",this.click),g=j,f+=1;for(this.text1=this.drawEmptyDonutLabel(c,d-10,this.options.labelColor,15,800),this.text2=this.drawEmptyDonutLabel(c,d+10,this.options.labelColor,14),h=Math.max.apply(Math,this.values),f=0,w=this.values,x=[],q=0,t=w.length;t>q;q++){if(m=w[q],m===h){this.select(f);\nbreak}x.push(f+=1)}return x},d.prototype.setData=function(a){var b;return this.data=a,this.values=function(){var a,c,d,e;for(d=this.data,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(parseFloat(b.value));return e}.call(this),this.redraw()},d.prototype.click=function(a){return this.fire(\"click\",a,this.data[a])},d.prototype.select=function(a){var b,c,d,e,f,g;for(g=this.segments,e=0,f=g.length;f>e;e++)c=g[e],c.deselect();return d=this.segments[a],d.select(),b=this.data[a],this.setLabels(b.label,this.options.formatter(b.value,b))},d.prototype.setLabels=function(a,b){var c,d,e,f,g,h,i,j;return c=2*(Math.min(this.el.width()/2,this.el.height()/2)-10)/3,f=1.8*c,e=c/2,d=c/3,this.text1.attr({text:a,transform:\"\"}),g=this.text1.getBBox(),h=Math.min(f/g.width,e/g.height),this.text1.attr({transform:\"S\"+h+\",\"+h+\",\"+(g.x+g.width/2)+\",\"+(g.y+g.height)}),this.text2.attr({text:b,transform:\"\"}),i=this.text2.getBBox(),j=Math.min(f/i.width,d/i.height),this.text2.attr({transform:\"S\"+j+\",\"+j+\",\"+(i.x+i.width/2)+\",\"+i.y})},d.prototype.drawEmptyDonutLabel=function(a,b,c,d,e){var f;return f=this.raphael.text(a,b,\"\").attr(\"font-size\",d).attr(\"fill\",c),null!=e&&f.attr(\"font-weight\",e),f},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.DonutSegment=function(a){function b(a,b,c,d,e,g,h,i,j,k){this.cx=a,this.cy=b,this.inner=c,this.outer=d,this.color=h,this.backgroundColor=i,this.index=j,this.raphael=k,this.deselect=f(this.deselect,this),this.select=f(this.select,this),this.sin_p0=Math.sin(e),this.cos_p0=Math.cos(e),this.sin_p1=Math.sin(g),this.cos_p1=Math.cos(g),this.is_long=g-e>Math.PI?1:0,this.path=this.calcSegment(this.inner+3,this.inner+this.outer-5),this.selectedPath=this.calcSegment(this.inner+3,this.inner+this.outer),this.hilight=this.calcArc(this.inner)}return h(b,a),b.prototype.calcArcPoints=function(a){return[this.cx+a*this.sin_p0,this.cy+a*this.cos_p0,this.cx+a*this.sin_p1,this.cy+a*this.cos_p1]},b.prototype.calcSegment=function(a,b){var c,d,e,f,g,h,i,j,k,l;return k=this.calcArcPoints(a),c=k[0],e=k[1],d=k[2],f=k[3],l=this.calcArcPoints(b),g=l[0],i=l[1],h=l[2],j=l[3],\"M\"+c+\",\"+e+(\"A\"+a+\",\"+a+\",0,\"+this.is_long+\",0,\"+d+\",\"+f)+(\"L\"+h+\",\"+j)+(\"A\"+b+\",\"+b+\",0,\"+this.is_long+\",1,\"+g+\",\"+i)+\"Z\"},b.prototype.calcArc=function(a){var b,c,d,e,f;return f=this.calcArcPoints(a),b=f[0],d=f[1],c=f[2],e=f[3],\"M\"+b+\",\"+d+(\"A\"+a+\",\"+a+\",0,\"+this.is_long+\",0,\"+c+\",\"+e)},b.prototype.render=function(){var a=this;return this.arc=this.drawDonutArc(this.hilight,this.color),this.seg=this.drawDonutSegment(this.path,this.color,this.backgroundColor,function(){return a.fire(\"hover\",a.index)},function(){return a.fire(\"click\",a.index)})},b.prototype.drawDonutArc=function(a,b){return this.raphael.path(a).attr({stroke:b,\"stroke-width\":2,opacity:0})},b.prototype.drawDonutSegment=function(a,b,c,d,e){return this.raphael.path(a).attr({fill:b,stroke:c,\"stroke-width\":3}).hover(d).click(e)},b.prototype.select=function(){return this.selected?void 0:(this.seg.animate({path:this.selectedPath},150,\"<>\"),this.arc.animate({opacity:1},150,\"<>\"),this.selected=!0)},b.prototype.deselect=function(){return this.selected?(this.seg.animate({path:this.path},150,\"<>\"),this.arc.animate({opacity:0},150,\"<>\"),this.selected=!1):void 0},b}(b.EventEmitter)}).call(this);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL21vcnJpcy5qcy9tb3JyaXMubWluLmpzPzUxMTIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksdUNBQXVDLGtCQUFrQiw2QkFBNkIsS0FBSyxnQ0FBZ0MsYUFBYSxtQkFBbUIsd0NBQXdDLDJFQUEyRSwyQkFBMkIsMEJBQTBCLElBQUksdUNBQXVDLFVBQVUsa0JBQWtCLG9DQUFvQyxjQUFjLG9DQUFvQyw2Q0FBNkMsOEVBQThFLDZCQUE2QixrQkFBa0IsNEdBQTRHLDJDQUEyQyxJQUFJLG1DQUFtQyxVQUFVLEdBQUcsd0JBQXdCLFlBQVksNkZBQTZGLEVBQUUsaUZBQWlGLG9CQUFvQixzQkFBc0Isb0JBQW9CLGNBQWMsOENBQThDLFdBQVcsZ0xBQWdMLCtGQUErRixvQ0FBb0MsNlJBQTZSLGNBQWMsb0xBQW9MLFlBQVksdUNBQXVDLHVDQUF1QyxtRkFBbUYsMkRBQTJELFFBQVEsd0lBQXdJLG1DQUFtQyxNQUFNLHdFQUF3RSxxR0FBcUcsNkNBQTZDLHVEQUF1RCxNQUFNLG9EQUFvRCxxQ0FBcUMsTUFBTSxtR0FBbUcsMkRBQTJELDhHQUE4Ryw0RkFBNEYsd0NBQXdDLGtnQkFBa2dCLG1DQUFtQyxrQ0FBa0MsK1hBQStYLFVBQVUsMEJBQTBCLElBQUksZ0JBQWdCLE1BQU0sMlNBQTJTLFlBQVksK0NBQStDLElBQUksc1BBQXNQLFNBQVMsc0JBQXNCLFNBQVMsNEVBQTRFLDBCQUEwQixrS0FBa0ssWUFBWSw4Q0FBOEMsSUFBSSxrQ0FBa0MsU0FBUywwdUJBQTB1QixZQUFZLHFDQUFxQyxjQUFjLGlCQUFpQixTQUFTLG9EQUFvRCxxQ0FBcUMsUUFBUSxpS0FBaUssMkNBQTJDLHNCQUFzQixpU0FBaVMsUUFBUSxlQUFlLGNBQWMsMENBQTBDLFNBQVMsaUJBQWlCLFFBQVEsZUFBZSxjQUFjLGlC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djAuNS4wXG5Db3B5cmlnaHQgMjAxNCBPbGx5IFNtaXRoIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5MaWNlbnNlZCB1bmRlciB0aGUgQlNELTItQ2xhdXNlIExpY2Vuc2UuXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZT1bXS5zbGljZSxmPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYixhcmd1bWVudHMpfX0sZz17fS5oYXNPd25Qcm9wZXJ0eSxoPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe3RoaXMuY29uc3RydWN0b3I9YX1mb3IodmFyIGQgaW4gYilnLmNhbGwoYixkKSYmKGFbZF09YltkXSk7cmV0dXJuIGMucHJvdG90eXBlPWIucHJvdG90eXBlLGEucHJvdG90eXBlPW5ldyBjLGEuX19zdXBlcl9fPWIucHJvdG90eXBlLGF9LGk9W10uaW5kZXhPZnx8ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz10aGlzLmxlbmd0aDtjPmI7YisrKWlmKGIgaW4gdGhpcyYmdGhpc1tiXT09PWEpcmV0dXJuIGI7cmV0dXJuLTF9O2I9d2luZG93Lk1vcnJpcz17fSxhPWpRdWVyeSxiLkV2ZW50RW1pdHRlcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt9cmV0dXJuIGEucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PXRoaXMuaGFuZGxlcnMmJih0aGlzLmhhbmRsZXJzPXt9KSxudWxsPT10aGlzLmhhbmRsZXJzW2FdJiYodGhpcy5oYW5kbGVyc1thXT1bXSksdGhpcy5oYW5kbGVyc1thXS5wdXNoKGIpLHRoaXN9LGEucHJvdG90eXBlLmZpcmU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxmLGcsaDtpZihjPWFyZ3VtZW50c1swXSxhPTI8PWFyZ3VtZW50cy5sZW5ndGg/ZS5jYWxsKGFyZ3VtZW50cywxKTpbXSxudWxsIT10aGlzLmhhbmRsZXJzJiZudWxsIT10aGlzLmhhbmRsZXJzW2NdKXtmb3IoZz10aGlzLmhhbmRsZXJzW2NdLGg9W10sZD0wLGY9Zy5sZW5ndGg7Zj5kO2QrKyliPWdbZF0saC5wdXNoKGIuYXBwbHkobnVsbCxhKSk7cmV0dXJuIGh9fSxhfSgpLGIuY29tbWFzPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlO3JldHVybiBudWxsIT1hPyhkPTA+YT9cIi1cIjpcIlwiLGI9TWF0aC5hYnMoYSksYz1NYXRoLmZsb29yKGIpLnRvRml4ZWQoMCksZCs9Yy5yZXBsYWNlKC8oPz0oPzpcXGR7M30pKyQpKD8hXikvZyxcIixcIiksZT1iLnRvU3RyaW5nKCksZS5sZW5ndGg+Yy5sZW5ndGgmJihkKz1lLnNsaWNlKGMubGVuZ3RoKSksZCk6XCItXCJ9LGIucGFkMj1mdW5jdGlvbihhKXtyZXR1cm4oMTA+YT9cIjBcIjpcIlwiKSthfSxiLkdyaWQ9ZnVuY3Rpb24oYyl7ZnVuY3Rpb24gZChiKXt0aGlzLnJlc2l6ZUhhbmRsZXI9Zih0aGlzLnJlc2l6ZUhhbmRsZXIsdGhpcyk7dmFyIGM9dGhpcztpZih0aGlzLmVsPVwic3RyaW5nXCI9PXR5cGVvZiBiLmVsZW1lbnQ/YShkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmVsZW1lbnQpKTphKGIuZWxlbWVudCksbnVsbD09dGhpcy5lbHx8MD09PXRoaXMuZWwubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcIkdyYXBoIGNvbnRhaW5lciBlbGVtZW50IG5vdCBmb3VuZFwiKTtcInN0YXRpY1wiPT09dGhpcy5lbC5jc3MoXCJwb3NpdGlvblwiKSYmdGhpcy5lbC5jc3MoXCJwb3NpdGlvblwiLFwicmVsYXRpdmVcIiksdGhpcy5vcHRpb25zPWEuZXh0ZW5kKHt9LHRoaXMuZ3JpZERlZmF1bHRzLHRoaXMuZGVmYXVsdHN8fHt9LGIpLFwic3RyaW5nXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMudW5pdHMmJih0aGlzLm9wdGlvbnMucG9zdFVuaXRzPWIudW5pdHMpLHRoaXMucmFwaGFlbD1uZXcgUmFwaGFlbCh0aGlzLmVsWzBdKSx0aGlzLmVsZW1lbnRXaWR0aD1udWxsLHRoaXMuZWxlbWVudEhlaWdodD1udWxsLHRoaXMuZGlydHk9ITEsdGhpcy5zZWxlY3RGcm9tPW51bGwsdGhpcy5pbml0JiZ0aGlzLmluaXQoKSx0aGlzLnNldERhdGEodGhpcy5vcHRpb25zLmRhdGEpLHRoaXMuZWwuYmluZChcIm1vdXNlbW92ZVwiLGZ1bmN0aW9uKGEpe3ZhciBiLGQsZSxmLGc7cmV0dXJuIGQ9Yy5lbC5vZmZzZXQoKSxnPWEucGFnZVgtZC5sZWZ0LGMuc2VsZWN0RnJvbT8oYj1jLmRhdGFbYy5oaXRUZXN0KE1hdGgubWluKGcsYy5zZWxlY3RGcm9tKSldLl94LGU9Yy5kYXRhW2MuaGl0VGVzdChNYXRoLm1heChnLGMuc2VsZWN0RnJvbSkpXS5feCxmPWUtYixjLnNlbGVjdGlvblJlY3QuYXR0cih7eDpiLHdpZHRoOmZ9KSk6Yy5maXJlKFwiaG92ZXJtb3ZlXCIsZyxhLnBhZ2VZLWQudG9wKX0pLHRoaXMuZWwuYmluZChcIm1vdXNlbGVhdmVcIixmdW5jdGlvbigpe3JldHVybiBjLnNlbGVjdEZyb20mJihjLnNlbGVjdGlvblJlY3QuaGlkZSgpLGMuc2VsZWN0RnJvbT1udWxsKSxjLmZpcmUoXCJob3Zlcm91dFwiKX0pLHRoaXMuZWwuYmluZChcInRvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kXCIsZnVuY3Rpb24oYSl7dmFyIGIsZDtyZXR1cm4gZD1hLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXXx8YS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLGI9Yy5lbC5vZmZzZXQoKSxjLmZpcmUoXCJob3Zlcm1vdmVcIixkLnBhZ2VYLWIubGVmdCxkLnBhZ2VZLWIudG9wKX0pLHRoaXMuZWwuYmluZChcImNsaWNrXCIsZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGI9Yy5lbC5vZmZzZXQoKSxjLmZpcmUoXCJncmlkY2xpY2tcIixhLnBhZ2VYLWIubGVmdCxhLnBhZ2VZLWIudG9wKX0pLHRoaXMub3B0aW9ucy5yYW5nZVNlbGVjdCYmKHRoaXMuc2VsZWN0aW9uUmVjdD10aGlzLnJhcGhhZWwucmVjdCgwLDAsMCx0aGlzLmVsLmlubmVySGVpZ2h0KCkpLmF0dHIoe2ZpbGw6dGhpcy5vcHRpb25zLnJhbmdlU2VsZWN0Q29sb3Isc3Ryb2tlOiExfSkudG9CYWNrKCkuaGlkZSgpLHRoaXMuZWwuYmluZChcIm1vdXNlZG93blwiLGZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBiPWMuZWwub2Zmc2V0KCksYy5zdGFydFJhbmdlKGEucGFnZVgtYi5sZWZ0KX0pLHRoaXMuZWwuYmluZChcIm1vdXNldXBcIixmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYj1jLmVsLm9mZnNldCgpLGMuZW5kUmFuZ2UoYS5wYWdlWC1iLmxlZnQpLGMuZmlyZShcImhvdmVybW92ZVwiLGEucGFnZVgtYi5sZWZ0LGEucGFnZVktYi50b3ApfSkpLHRoaXMub3B0aW9ucy5yZXNpemUmJmEod2luZG93KS5iaW5kKFwicmVzaXplXCIsZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9Yy50aW1lb3V0SWQmJndpbmRvdy5jbGVhclRpbWVvdXQoYy50aW1lb3V0SWQpLGMudGltZW91dElkPXdpbmRvdy5zZXRUaW1lb3V0KGMucmVzaXplSGFuZGxlciwxMDApfSksdGhpcy5lbC5jc3MoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIixcInJnYmEoMCwwLDAsMClcIiksdGhpcy5wb3N0SW5pdCYmdGhpcy5wb3N0SW5pdCgpfXJldHVybiBoKGQsYyksZC5wcm90b3R5cGUuZ3JpZERlZmF1bHRzPXtkYXRlRm9ybWF0Om51bGwsYXhlczohMCxncmlkOiEwLGdyaWRMaW5lQ29sb3I6XCIjYWFhXCIsZ3JpZFN0cm9rZVdpZHRoOi41LGdyaWRUZXh0Q29sb3I6XCIjODg4XCIsZ3JpZFRleHRTaXplOjEyLGdyaWRUZXh0RmFtaWx5Olwic2Fucy1zZXJpZlwiLGdyaWRUZXh0V2VpZ2h0Olwibm9ybWFsXCIsaGlkZUhvdmVyOiExLHlMYWJlbEZvcm1hdDpudWxsLHhMYWJlbEFuZ2xlOjAsbnVtTGluZXM6NSxwYWRkaW5nOjI1LHBhcnNlVGltZTohMCxwb3N0VW5pdHM6XCJcIixwcmVVbml0czpcIlwiLHltYXg6XCJhdXRvXCIseW1pbjpcImF1dG8gMFwiLGdvYWxzOltdLGdvYWxTdHJva2VXaWR0aDoxLGdvYWxMaW5lQ29sb3JzOltcIiM2NjY2MzNcIixcIiM5OTk5NjZcIixcIiNjYzY2NjZcIixcIiM2NjMzMzNcIl0sZXZlbnRzOltdLGV2ZW50U3Ryb2tlV2lkdGg6MSxldmVudExpbmVDb2xvcnM6W1wiIzAwNWEwNFwiLFwiI2NjZmZiYlwiLFwiIzNhNWYwYlwiLFwiIzAwNTUwMlwiXSxyYW5nZVNlbGVjdDpudWxsLHJhbmdlU2VsZWN0Q29sb3I6XCIjZWVmXCIscmVzaXplOiExfSxkLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKGEsYyl7dmFyIGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyO3JldHVybiBudWxsPT1jJiYoYz0hMCksdGhpcy5vcHRpb25zLmRhdGE9YSxudWxsPT1hfHwwPT09YS5sZW5ndGg/KHRoaXMuZGF0YT1bXSx0aGlzLnJhcGhhZWwuY2xlYXIoKSxudWxsIT10aGlzLmhvdmVyJiZ0aGlzLmhvdmVyLmhpZGUoKSx2b2lkIDApOihvPXRoaXMuY3VtdWxhdGl2ZT8wOm51bGwscD10aGlzLmN1bXVsYXRpdmU/MDpudWxsLHRoaXMub3B0aW9ucy5nb2Fscy5sZW5ndGg+MCYmKGg9TWF0aC5taW4uYXBwbHkoTWF0aCx0aGlzLm9wdGlvbnMuZ29hbHMpLGc9TWF0aC5tYXguYXBwbHkoTWF0aCx0aGlzLm9wdGlvbnMuZ29hbHMpLHA9bnVsbCE9cD9NYXRoLm1pbihwLGgpOmgsbz1udWxsIT1vP01hdGgubWF4KG8sZyk6ZyksdGhpcy5kYXRhPWZ1bmN0aW9uKCl7dmFyIGMsZCxnO2ZvcihnPVtdLGY9Yz0wLGQ9YS5sZW5ndGg7ZD5jO2Y9KytjKWo9YVtmXSxpPXtzcmM6an0saS5sYWJlbD1qW3RoaXMub3B0aW9ucy54a2V5XSx0aGlzLm9wdGlvbnMucGFyc2VUaW1lPyhpLng9Yi5wYXJzZURhdGUoaS5sYWJlbCksdGhpcy5vcHRpb25zLmRhdGVGb3JtYXQ/aS5sYWJlbD10aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdChpLngpOlwibnVtYmVyXCI9PXR5cGVvZiBpLmxhYmVsJiYoaS5sYWJlbD1uZXcgRGF0ZShpLmxhYmVsKS50b1N0cmluZygpKSk6KGkueD1mLHRoaXMub3B0aW9ucy54TGFiZWxGb3JtYXQmJihpLmxhYmVsPXRoaXMub3B0aW9ucy54TGFiZWxGb3JtYXQoaSkpKSxsPTAsaS55PWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7Zm9yKGM9dGhpcy5vcHRpb25zLnlrZXlzLGQ9W10sZT1hPTAsYj1jLmxlbmd0aDtiPmE7ZT0rK2Epbj1jW2VdLHE9altuXSxcInN0cmluZ1wiPT10eXBlb2YgcSYmKHE9cGFyc2VGbG9hdChxKSksbnVsbCE9cSYmXCJudW1iZXJcIiE9dHlwZW9mIHEmJihxPW51bGwpLG51bGwhPXEmJih0aGlzLmN1bXVsYXRpdmU/bCs9cTpudWxsIT1vPyhvPU1hdGgubWF4KHEsbykscD1NYXRoLm1pbihxLHApKTpvPXA9cSksdGhpcy5jdW11bGF0aXZlJiZudWxsIT1sJiYobz1NYXRoLm1heChsLG8pLHA9TWF0aC5taW4obCxwKSksZC5wdXNoKHEpO3JldHVybiBkfS5jYWxsKHRoaXMpLGcucHVzaChpKTtyZXR1cm4gZ30uY2FsbCh0aGlzKSx0aGlzLm9wdGlvbnMucGFyc2VUaW1lJiYodGhpcy5kYXRhPXRoaXMuZGF0YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuKGEueD5iLngpLShiLng+YS54KX0pKSx0aGlzLnhtaW49dGhpcy5kYXRhWzBdLngsdGhpcy54bWF4PXRoaXMuZGF0YVt0aGlzLmRhdGEubGVuZ3RoLTFdLngsdGhpcy5ldmVudHM9W10sdGhpcy5vcHRpb25zLmV2ZW50cy5sZW5ndGg+MCYmKHRoaXMuZXZlbnRzPXRoaXMub3B0aW9ucy5wYXJzZVRpbWU/ZnVuY3Rpb24oKXt2YXIgYSxjLGUsZjtmb3IoZT10aGlzLm9wdGlvbnMuZXZlbnRzLGY9W10sYT0wLGM9ZS5sZW5ndGg7Yz5hO2ErKylkPWVbYV0sZi5wdXNoKGIucGFyc2VEYXRlKGQpKTtyZXR1cm4gZn0uY2FsbCh0aGlzKTp0aGlzLm9wdGlvbnMuZXZlbnRzLHRoaXMueG1heD1NYXRoLm1heCh0aGlzLnhtYXgsTWF0aC5tYXguYXBwbHkoTWF0aCx0aGlzLmV2ZW50cykpLHRoaXMueG1pbj1NYXRoLm1pbih0aGlzLnhtaW4sTWF0aC5taW4uYXBwbHkoTWF0aCx0aGlzLmV2ZW50cykpKSx0aGlzLnhtaW49PT10aGlzLnhtYXgmJih0aGlzLnhtaW4tPTEsdGhpcy54bWF4Kz0xKSx0aGlzLnltaW49dGhpcy55Ym91bmRhcnkoXCJtaW5cIixwKSx0aGlzLnltYXg9dGhpcy55Ym91bmRhcnkoXCJtYXhcIixvKSx0aGlzLnltaW49PT10aGlzLnltYXgmJihwJiYodGhpcy55bWluLT0xKSx0aGlzLnltYXgrPTEpLCgocj10aGlzLm9wdGlvbnMuYXhlcyk9PT0hMHx8XCJib3RoXCI9PT1yfHxcInlcIj09PXJ8fHRoaXMub3B0aW9ucy5ncmlkPT09ITApJiYodGhpcy5vcHRpb25zLnltYXg9PT10aGlzLmdyaWREZWZhdWx0cy55bWF4JiZ0aGlzLm9wdGlvbnMueW1pbj09PXRoaXMuZ3JpZERlZmF1bHRzLnltaW4/KHRoaXMuZ3JpZD10aGlzLmF1dG9HcmlkTGluZXModGhpcy55bWluLHRoaXMueW1heCx0aGlzLm9wdGlvbnMubnVtTGluZXMpLHRoaXMueW1pbj1NYXRoLm1pbih0aGlzLnltaW4sdGhpcy5ncmlkWzBdKSx0aGlzLnltYXg9TWF0aC5tYXgodGhpcy55bWF4LHRoaXMuZ3JpZFt0aGlzLmdyaWQubGVuZ3RoLTFdKSk6KGs9KHRoaXMueW1heC10aGlzLnltaW4pLyh0aGlzLm9wdGlvbnMubnVtTGluZXMtMSksdGhpcy5ncmlkPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7Zm9yKGQ9W10sbT1hPWI9dGhpcy55bWluLGM9dGhpcy55bWF4O2s+MD9jPj1hOmE+PWM7bT1hKz1rKWQucHVzaChtKTtyZXR1cm4gZH0uY2FsbCh0aGlzKSkpLHRoaXMuZGlydHk9ITAsYz90aGlzLnJlZHJhdygpOnZvaWQgMCl9LGQucHJvdG90eXBlLnlib3VuZGFyeT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7cmV0dXJuIGM9dGhpcy5vcHRpb25zW1wieVwiK2FdLFwic3RyaW5nXCI9PXR5cGVvZiBjP1wiYXV0b1wiPT09Yy5zbGljZSgwLDQpP2MubGVuZ3RoPjU/KGQ9cGFyc2VJbnQoYy5zbGljZSg1KSwxMCksbnVsbD09Yj9kOk1hdGhbYV0oYixkKSk6bnVsbCE9Yj9iOjA6cGFyc2VJbnQoYywxMCk6Y30sZC5wcm90b3R5cGUuYXV0b0dyaWRMaW5lcz1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosayxsO3JldHVybiBoPWItYSxsPU1hdGguZmxvb3IoTWF0aC5sb2coaCkvTWF0aC5sb2coMTApKSxqPU1hdGgucG93KDEwLGwpLGU9TWF0aC5mbG9vcihhL2opKmosZD1NYXRoLmNlaWwoYi9qKSpqLGk9KGQtZSkvKGMtMSksMT09PWomJmk+MSYmTWF0aC5jZWlsKGkpIT09aSYmKGk9TWF0aC5jZWlsKGkpLGQ9ZStpKihjLTEpKSwwPmUmJmQ+MCYmKGU9TWF0aC5mbG9vcihhL2kpKmksZD1NYXRoLmNlaWwoYi9pKSppKSwxPmk/KGc9TWF0aC5mbG9vcihNYXRoLmxvZyhpKS9NYXRoLmxvZygxMCkpLGY9ZnVuY3Rpb24oKXt2YXIgYSxiO2ZvcihiPVtdLGs9YT1lO2k+MD9kPj1hOmE+PWQ7az1hKz1pKWIucHVzaChwYXJzZUZsb2F0KGsudG9GaXhlZCgxLWcpKSk7cmV0dXJuIGJ9KCkpOmY9ZnVuY3Rpb24oKXt2YXIgYSxiO2ZvcihiPVtdLGs9YT1lO2k+MD9kPj1hOmE+PWQ7az1hKz1pKWIucHVzaChrKTtyZXR1cm4gYn0oKSxmfSxkLnByb3RvdHlwZS5fY2FsYz1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnLGg7cmV0dXJuIGU9dGhpcy5lbC53aWR0aCgpLGM9dGhpcy5lbC5oZWlnaHQoKSwodGhpcy5lbGVtZW50V2lkdGghPT1lfHx0aGlzLmVsZW1lbnRIZWlnaHQhPT1jfHx0aGlzLmRpcnR5KSYmKHRoaXMuZWxlbWVudFdpZHRoPWUsdGhpcy5lbGVtZW50SGVpZ2h0PWMsdGhpcy5kaXJ0eT0hMSx0aGlzLmxlZnQ9dGhpcy5vcHRpb25zLnBhZGRpbmcsdGhpcy5yaWdodD10aGlzLmVsZW1lbnRXaWR0aC10aGlzLm9wdGlvbnMucGFkZGluZyx0aGlzLnRvcD10aGlzLm9wdGlvbnMucGFkZGluZyx0aGlzLmJvdHRvbT10aGlzLmVsZW1lbnRIZWlnaHQtdGhpcy5vcHRpb25zLnBhZGRpbmcsKChnPXRoaXMub3B0aW9ucy5heGVzKT09PSEwfHxcImJvdGhcIj09PWd8fFwieVwiPT09ZykmJihmPWZ1bmN0aW9uKCl7dmFyIGEsYyxkLGU7Zm9yKGQ9dGhpcy5ncmlkLGU9W10sYT0wLGM9ZC5sZW5ndGg7Yz5hO2ErKyliPWRbYV0sZS5wdXNoKHRoaXMubWVhc3VyZVRleHQodGhpcy55QXhpc0Zvcm1hdChiKSkud2lkdGgpO3JldHVybiBlfS5jYWxsKHRoaXMpLHRoaXMubGVmdCs9TWF0aC5tYXguYXBwbHkoTWF0aCxmKSksKChoPXRoaXMub3B0aW9ucy5heGVzKT09PSEwfHxcImJvdGhcIj09PWh8fFwieFwiPT09aCkmJihhPWZ1bmN0aW9uKCl7dmFyIGEsYixjO2ZvcihjPVtdLGQ9YT0wLGI9dGhpcy5kYXRhLmxlbmd0aDtiPj0wP2I+YTphPmI7ZD1iPj0wPysrYTotLWEpYy5wdXNoKHRoaXMubWVhc3VyZVRleHQodGhpcy5kYXRhW2RdLnRleHQsLXRoaXMub3B0aW9ucy54TGFiZWxBbmdsZSkuaGVpZ2h0KTtyZXR1cm4gY30uY2FsbCh0aGlzKSx0aGlzLmJvdHRvbS09TWF0aC5tYXguYXBwbHkoTWF0aCxhKSksdGhpcy53aWR0aD1NYXRoLm1heCgxLHRoaXMucmlnaHQtdGhpcy5sZWZ0KSx0aGlzLmhlaWdodD1NYXRoLm1heCgxLHRoaXMuYm90dG9tLXRoaXMudG9wKSx0aGlzLmR4PXRoaXMud2lkdGgvKHRoaXMueG1heC10aGlzLnhtaW4pLHRoaXMuZHk9dGhpcy5oZWlnaHQvKHRoaXMueW1heC10aGlzLnltaW4pLHRoaXMuY2FsYyk/dGhpcy5jYWxjKCk6dm9pZCAwfSxkLnByb3RvdHlwZS50cmFuc1k9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYm90dG9tLShhLXRoaXMueW1pbikqdGhpcy5keX0sZC5wcm90b3R5cGUudHJhbnNYPWZ1bmN0aW9uKGEpe3JldHVybiAxPT09dGhpcy5kYXRhLmxlbmd0aD8odGhpcy5sZWZ0K3RoaXMucmlnaHQpLzI6dGhpcy5sZWZ0KyhhLXRoaXMueG1pbikqdGhpcy5keH0sZC5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFwaGFlbC5jbGVhcigpLHRoaXMuX2NhbGMoKSx0aGlzLmRyYXdHcmlkKCksdGhpcy5kcmF3R29hbHMoKSx0aGlzLmRyYXdFdmVudHMoKSx0aGlzLmRyYXc/dGhpcy5kcmF3KCk6dm9pZCAwfSxkLnByb3RvdHlwZS5tZWFzdXJlVGV4dD1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7cmV0dXJuIG51bGw9PWImJihiPTApLGQ9dGhpcy5yYXBoYWVsLnRleHQoMTAwLDEwMCxhKS5hdHRyKFwiZm9udC1zaXplXCIsdGhpcy5vcHRpb25zLmdyaWRUZXh0U2l6ZSkuYXR0cihcImZvbnQtZmFtaWx5XCIsdGhpcy5vcHRpb25zLmdyaWRUZXh0RmFtaWx5KS5hdHRyKFwiZm9udC13ZWlnaHRcIix0aGlzLm9wdGlvbnMuZ3JpZFRleHRXZWlnaHQpLnJvdGF0ZShiKSxjPWQuZ2V0QkJveCgpLGQucmVtb3ZlKCksY30sZC5wcm90b3R5cGUueUF4aXNGb3JtYXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueUxhYmVsRm9ybWF0KGEpfSxkLnByb3RvdHlwZS55TGFiZWxGb3JtYXQ9ZnVuY3Rpb24oYSl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLnlMYWJlbEZvcm1hdD90aGlzLm9wdGlvbnMueUxhYmVsRm9ybWF0KGEpOlwiXCIrdGhpcy5vcHRpb25zLnByZVVuaXRzK2IuY29tbWFzKGEpK3RoaXMub3B0aW9ucy5wb3N0VW5pdHN9LGQucHJvdG90eXBlLmRyYXdHcmlkPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGcsaDtpZih0aGlzLm9wdGlvbnMuZ3JpZCE9PSExfHwoZT10aGlzLm9wdGlvbnMuYXhlcyk9PT0hMHx8XCJib3RoXCI9PT1lfHxcInlcIj09PWUpe2ZvcihmPXRoaXMuZ3JpZCxoPVtdLGM9MCxkPWYubGVuZ3RoO2Q+YztjKyspYT1mW2NdLGI9dGhpcy50cmFuc1koYSksKChnPXRoaXMub3B0aW9ucy5heGVzKT09PSEwfHxcImJvdGhcIj09PWd8fFwieVwiPT09ZykmJnRoaXMuZHJhd1lBeGlzTGFiZWwodGhpcy5sZWZ0LXRoaXMub3B0aW9ucy5wYWRkaW5nLzIsYix0aGlzLnlBeGlzRm9ybWF0KGEpKSx0aGlzLm9wdGlvbnMuZ3JpZD9oLnB1c2godGhpcy5kcmF3R3JpZExpbmUoXCJNXCIrdGhpcy5sZWZ0K1wiLFwiK2IrXCJIXCIrKHRoaXMubGVmdCt0aGlzLndpZHRoKSkpOmgucHVzaCh2b2lkIDApO3JldHVybiBofX0sZC5wcm90b3R5cGUuZHJhd0dvYWxzPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc7Zm9yKGY9dGhpcy5vcHRpb25zLmdvYWxzLGc9W10sYz1kPTAsZT1mLmxlbmd0aDtlPmQ7Yz0rK2QpYj1mW2NdLGE9dGhpcy5vcHRpb25zLmdvYWxMaW5lQ29sb3JzW2MldGhpcy5vcHRpb25zLmdvYWxMaW5lQ29sb3JzLmxlbmd0aF0sZy5wdXNoKHRoaXMuZHJhd0dvYWwoYixhKSk7cmV0dXJuIGd9LGQucHJvdG90eXBlLmRyYXdFdmVudHM9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZztmb3IoZj10aGlzLmV2ZW50cyxnPVtdLGM9ZD0wLGU9Zi5sZW5ndGg7ZT5kO2M9KytkKWI9ZltjXSxhPXRoaXMub3B0aW9ucy5ldmVudExpbmVDb2xvcnNbYyV0aGlzLm9wdGlvbnMuZXZlbnRMaW5lQ29sb3JzLmxlbmd0aF0sZy5wdXNoKHRoaXMuZHJhd0V2ZW50KGIsYSkpO3JldHVybiBnfSxkLnByb3RvdHlwZS5kcmF3R29hbD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnJhcGhhZWwucGF0aChcIk1cIit0aGlzLmxlZnQrXCIsXCIrdGhpcy50cmFuc1koYSkrXCJIXCIrdGhpcy5yaWdodCkuYXR0cihcInN0cm9rZVwiLGIpLmF0dHIoXCJzdHJva2Utd2lkdGhcIix0aGlzLm9wdGlvbnMuZ29hbFN0cm9rZVdpZHRoKX0sZC5wcm90b3R5cGUuZHJhd0V2ZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucmFwaGFlbC5wYXRoKFwiTVwiK3RoaXMudHJhbnNYKGEpK1wiLFwiK3RoaXMuYm90dG9tK1wiVlwiK3RoaXMudG9wKS5hdHRyKFwic3Ryb2tlXCIsYikuYXR0cihcInN0cm9rZS13aWR0aFwiLHRoaXMub3B0aW9ucy5ldmVudFN0cm9rZVdpZHRoKX0sZC5wcm90b3R5cGUuZHJhd1lBeGlzTGFiZWw9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLnJhcGhhZWwudGV4dChhLGIsYykuYXR0cihcImZvbnQtc2l6ZVwiLHRoaXMub3B0aW9ucy5ncmlkVGV4dFNpemUpLmF0dHIoXCJmb250LWZhbWlseVwiLHRoaXMub3B0aW9ucy5ncmlkVGV4dEZhbWlseSkuYXR0cihcImZvbnQtd2VpZ2h0XCIsdGhpcy5vcHRpb25zLmdyaWRUZXh0V2VpZ2h0KS5hdHRyKFwiZmlsbFwiLHRoaXMub3B0aW9ucy5ncmlkVGV4dENvbG9yKS5hdHRyKFwidGV4dC1hbmNob3JcIixcImVuZFwiKX0sZC5wcm90b3R5cGUuZHJhd0dyaWRMaW5lPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJhcGhhZWwucGF0aChhKS5hdHRyKFwic3Ryb2tlXCIsdGhpcy5vcHRpb25zLmdyaWRMaW5lQ29sb3IpLmF0dHIoXCJzdHJva2Utd2lkdGhcIix0aGlzLm9wdGlvbnMuZ3JpZFN0cm9rZVdpZHRoKX0sZC5wcm90b3R5cGUuc3RhcnRSYW5nZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ob3Zlci5oaWRlKCksdGhpcy5zZWxlY3RGcm9tPWEsdGhpcy5zZWxlY3Rpb25SZWN0LmF0dHIoe3g6YSx3aWR0aDowfSkuc2hvdygpfSxkLnByb3RvdHlwZS5lbmRSYW5nZT1mdW5jdGlvbihhKXt2YXIgYixjO3JldHVybiB0aGlzLnNlbGVjdEZyb20/KGM9TWF0aC5taW4odGhpcy5zZWxlY3RGcm9tLGEpLGI9TWF0aC5tYXgodGhpcy5zZWxlY3RGcm9tLGEpLHRoaXMub3B0aW9ucy5yYW5nZVNlbGVjdC5jYWxsKHRoaXMuZWwse3N0YXJ0OnRoaXMuZGF0YVt0aGlzLmhpdFRlc3QoYyldLngsZW5kOnRoaXMuZGF0YVt0aGlzLmhpdFRlc3QoYildLnh9KSx0aGlzLnNlbGVjdEZyb209bnVsbCk6dm9pZCAwfSxkLnByb3RvdHlwZS5yZXNpemVIYW5kbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZW91dElkPW51bGwsdGhpcy5yYXBoYWVsLnNldFNpemUodGhpcy5lbC53aWR0aCgpLHRoaXMuZWwuaGVpZ2h0KCkpLHRoaXMucmVkcmF3KCl9LGR9KGIuRXZlbnRFbWl0dGVyKSxiLnBhcnNlRGF0ZT1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosayxsO3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiBhP2E6KGM9YS5tYXRjaCgvXihcXGQrKSBRKFxcZCkkLyksZT1hLm1hdGNoKC9eKFxcZCspLShcXGQrKSQvKSxmPWEubWF0Y2goL14oXFxkKyktKFxcZCspLShcXGQrKSQvKSxoPWEubWF0Y2goL14oXFxkKykgVyhcXGQrKSQvKSxpPWEubWF0Y2goL14oXFxkKyktKFxcZCspLShcXGQrKVsgVF0oXFxkKyk6KFxcZCspKFp8KFsrLV0pKFxcZFxcZCk6PyhcXGRcXGQpKT8kLyksaj1hLm1hdGNoKC9eKFxcZCspLShcXGQrKS0oXFxkKylbIFRdKFxcZCspOihcXGQrKTooXFxkKyhcXC5cXGQrKT8pKFp8KFsrLV0pKFxcZFxcZCk6PyhcXGRcXGQpKT8kLyksYz9uZXcgRGF0ZShwYXJzZUludChjWzFdLDEwKSwzKnBhcnNlSW50KGNbMl0sMTApLTEsMSkuZ2V0VGltZSgpOmU/bmV3IERhdGUocGFyc2VJbnQoZVsxXSwxMCkscGFyc2VJbnQoZVsyXSwxMCktMSwxKS5nZXRUaW1lKCk6Zj9uZXcgRGF0ZShwYXJzZUludChmWzFdLDEwKSxwYXJzZUludChmWzJdLDEwKS0xLHBhcnNlSW50KGZbM10sMTApKS5nZXRUaW1lKCk6aD8oaz1uZXcgRGF0ZShwYXJzZUludChoWzFdLDEwKSwwLDEpLDQhPT1rLmdldERheSgpJiZrLnNldE1vbnRoKDAsMSsoNC1rLmdldERheSgpKzcpJTcpLGsuZ2V0VGltZSgpKzYwNDhlNSpwYXJzZUludChoWzJdLDEwKSk6aT9pWzZdPyhnPTAsXCJaXCIhPT1pWzZdJiYoZz02MCpwYXJzZUludChpWzhdLDEwKStwYXJzZUludChpWzldLDEwKSxcIitcIj09PWlbN10mJihnPTAtZykpLERhdGUuVVRDKHBhcnNlSW50KGlbMV0sMTApLHBhcnNlSW50KGlbMl0sMTApLTEscGFyc2VJbnQoaVszXSwxMCkscGFyc2VJbnQoaVs0XSwxMCkscGFyc2VJbnQoaVs1XSwxMCkrZykpOm5ldyBEYXRlKHBhcnNlSW50KGlbMV0sMTApLHBhcnNlSW50KGlbMl0sMTApLTEscGFyc2VJbnQoaVszXSwxMCkscGFyc2VJbnQoaVs0XSwxMCkscGFyc2VJbnQoaVs1XSwxMCkpLmdldFRpbWUoKTpqPyhsPXBhcnNlRmxvYXQoals2XSksYj1NYXRoLmZsb29yKGwpLGQ9TWF0aC5yb3VuZCgxZTMqKGwtYikpLGpbOF0/KGc9MCxcIlpcIiE9PWpbOF0mJihnPTYwKnBhcnNlSW50KGpbMTBdLDEwKStwYXJzZUludChqWzExXSwxMCksXCIrXCI9PT1qWzldJiYoZz0wLWcpKSxEYXRlLlVUQyhwYXJzZUludChqWzFdLDEwKSxwYXJzZUludChqWzJdLDEwKS0xLHBhcnNlSW50KGpbM10sMTApLHBhcnNlSW50KGpbNF0sMTApLHBhcnNlSW50KGpbNV0sMTApK2csYixkKSk6bmV3IERhdGUocGFyc2VJbnQoalsxXSwxMCkscGFyc2VJbnQoalsyXSwxMCktMSxwYXJzZUludChqWzNdLDEwKSxwYXJzZUludChqWzRdLDEwKSxwYXJzZUludChqWzVdLDEwKSxiLGQpLmdldFRpbWUoKSk6bmV3IERhdGUocGFyc2VJbnQoYSwxMCksMCwxKS5nZXRUaW1lKCkpfSxiLkhvdmVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYyhjKXtudWxsPT1jJiYoYz17fSksdGhpcy5vcHRpb25zPWEuZXh0ZW5kKHt9LGIuSG92ZXIuZGVmYXVsdHMsYyksdGhpcy5lbD1hKFwiPGRpdiBjbGFzcz0nXCIrdGhpcy5vcHRpb25zW1wiY2xhc3NcIl0rXCInPjwvZGl2PlwiKSx0aGlzLmVsLmhpZGUoKSx0aGlzLm9wdGlvbnMucGFyZW50LmFwcGVuZCh0aGlzLmVsKX1yZXR1cm4gYy5kZWZhdWx0cz17XCJjbGFzc1wiOlwibW9ycmlzLWhvdmVyIG1vcnJpcy1kZWZhdWx0LXN0eWxlXCJ9LGMucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGE/KHRoaXMuaHRtbChhKSx0aGlzLnNob3coKSx0aGlzLm1vdmVUbyhiLGMpKTp0aGlzLmhpZGUoKX0sYy5wcm90b3R5cGUuaHRtbD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lbC5odG1sKGEpfSxjLnByb3RvdHlwZS5tb3ZlVG89ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnLGg7cmV0dXJuIGc9dGhpcy5vcHRpb25zLnBhcmVudC5pbm5lcldpZHRoKCksZj10aGlzLm9wdGlvbnMucGFyZW50LmlubmVySGVpZ2h0KCksZD10aGlzLmVsLm91dGVyV2lkdGgoKSxjPXRoaXMuZWwub3V0ZXJIZWlnaHQoKSxlPU1hdGgubWluKE1hdGgubWF4KDAsYS1kLzIpLGctZCksbnVsbCE9Yj8oaD1iLWMtMTAsMD5oJiYoaD1iKzEwLGgrYz5mJiYoaD1mLzItYy8yKSkpOmg9Zi8yLWMvMix0aGlzLmVsLmNzcyh7bGVmdDplK1wicHhcIix0b3A6cGFyc2VJbnQoaCkrXCJweFwifSl9LGMucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5zaG93KCl9LGMucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5oaWRlKCl9LGN9KCksYi5MaW5lPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIHRoaXMuaGlsaWdodD1mKHRoaXMuaGlsaWdodCx0aGlzKSx0aGlzLm9uSG92ZXJPdXQ9Zih0aGlzLm9uSG92ZXJPdXQsdGhpcyksdGhpcy5vbkhvdmVyTW92ZT1mKHRoaXMub25Ib3Zlck1vdmUsdGhpcyksdGhpcy5vbkdyaWRDbGljaz1mKHRoaXMub25HcmlkQ2xpY2ssdGhpcyksdGhpcyBpbnN0YW5jZW9mIGIuTGluZT8oYy5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpLHZvaWQgMCk6bmV3IGIuTGluZShhKX1yZXR1cm4gaChjLGEpLGMucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm5cImFsd2F5c1wiIT09dGhpcy5vcHRpb25zLmhpZGVIb3Zlcj8odGhpcy5ob3Zlcj1uZXcgYi5Ib3Zlcih7cGFyZW50OnRoaXMuZWx9KSx0aGlzLm9uKFwiaG92ZXJtb3ZlXCIsdGhpcy5vbkhvdmVyTW92ZSksdGhpcy5vbihcImhvdmVyb3V0XCIsdGhpcy5vbkhvdmVyT3V0KSx0aGlzLm9uKFwiZ3JpZGNsaWNrXCIsdGhpcy5vbkdyaWRDbGljaykpOnZvaWQgMH0sYy5wcm90b3R5cGUuZGVmYXVsdHM9e2xpbmVXaWR0aDozLHBvaW50U2l6ZTo0LGxpbmVDb2xvcnM6W1wiIzBiNjJhNFwiLFwiIzdBOTJBM1wiLFwiIzRkYTc0ZFwiLFwiI2FmZDhmOFwiLFwiI2VkYzI0MFwiLFwiI2NiNGI0YlwiLFwiIzk0NDBlZFwiXSxwb2ludFN0cm9rZVdpZHRoczpbMV0scG9pbnRTdHJva2VDb2xvcnM6W1wiI2ZmZmZmZlwiXSxwb2ludEZpbGxDb2xvcnM6W10sc21vb3RoOiEwLHhMYWJlbHM6XCJhdXRvXCIseExhYmVsRm9ybWF0Om51bGwseExhYmVsTWFyZ2luOjI0LGhpZGVIb3ZlcjohMX0sYy5wcm90b3R5cGUuY2FsYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbGNQb2ludHMoKSx0aGlzLmdlbmVyYXRlUGF0aHMoKX0sYy5wcm90b3R5cGUuY2FsY1BvaW50cz1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZjtmb3IoZT10aGlzLmRhdGEsZj1bXSxjPTAsZD1lLmxlbmd0aDtkPmM7YysrKWE9ZVtjXSxhLl94PXRoaXMudHJhbnNYKGEueCksYS5feT1mdW5jdGlvbigpe3ZhciBjLGQsZSxmO2ZvcihlPWEueSxmPVtdLGM9MCxkPWUubGVuZ3RoO2Q+YztjKyspYj1lW2NdLG51bGwhPWI/Zi5wdXNoKHRoaXMudHJhbnNZKGIpKTpmLnB1c2goYik7cmV0dXJuIGZ9LmNhbGwodGhpcyksZi5wdXNoKGEuX3ltYXg9TWF0aC5taW4uYXBwbHkoTWF0aCxbdGhpcy5ib3R0b21dLmNvbmNhdChmdW5jdGlvbigpe3ZhciBjLGQsZSxmO2ZvcihlPWEuX3ksZj1bXSxjPTAsZD1lLmxlbmd0aDtkPmM7YysrKWI9ZVtjXSxudWxsIT1iJiZmLnB1c2goYik7cmV0dXJuIGZ9KCkpKSk7cmV0dXJuIGZ9LGMucHJvdG90eXBlLmhpdFRlc3Q9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZjtpZigwPT09dGhpcy5kYXRhLmxlbmd0aClyZXR1cm4gbnVsbDtmb3IoZj10aGlzLmRhdGEuc2xpY2UoMSksYj1kPTAsZT1mLmxlbmd0aDtlPmQmJihjPWZbYl0sIShhPChjLl94K3RoaXMuZGF0YVtiXS5feCkvMikpO2I9KytkKTtyZXR1cm4gYn0sYy5wcm90b3R5cGUub25HcmlkQ2xpY2s9ZnVuY3Rpb24oYSxiKXt2YXIgYztyZXR1cm4gYz10aGlzLmhpdFRlc3QoYSksdGhpcy5maXJlKFwiY2xpY2tcIixjLHRoaXMuZGF0YVtjXS5zcmMsYSxiKX0sYy5wcm90b3R5cGUub25Ib3Zlck1vdmU9ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGI9dGhpcy5oaXRUZXN0KGEpLHRoaXMuZGlzcGxheUhvdmVyRm9yUm93KGIpfSxjLnByb3RvdHlwZS5vbkhvdmVyT3V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5oaWRlSG92ZXIhPT0hMT90aGlzLmRpc3BsYXlIb3ZlckZvclJvdyhudWxsKTp2b2lkIDB9LGMucHJvdG90eXBlLmRpc3BsYXlIb3ZlckZvclJvdz1mdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbnVsbCE9YT8oKGI9dGhpcy5ob3ZlcikudXBkYXRlLmFwcGx5KGIsdGhpcy5ob3ZlckNvbnRlbnRGb3JSb3coYSkpLHRoaXMuaGlsaWdodChhKSk6KHRoaXMuaG92ZXIuaGlkZSgpLHRoaXMuaGlsaWdodCgpKX0sYy5wcm90b3R5cGUuaG92ZXJDb250ZW50Rm9yUm93PWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoO2ZvcihkPXRoaXMuZGF0YVthXSxiPVwiPGRpdiBjbGFzcz0nbW9ycmlzLWhvdmVyLXJvdy1sYWJlbCc+XCIrZC5sYWJlbCtcIjwvZGl2PlwiLGg9ZC55LGM9Zj0wLGc9aC5sZW5ndGg7Zz5mO2M9KytmKWU9aFtjXSxiKz1cIjxkaXYgY2xhc3M9J21vcnJpcy1ob3Zlci1wb2ludCcgc3R5bGU9J2NvbG9yOiBcIit0aGlzLmNvbG9yRm9yKGQsYyxcImxhYmVsXCIpK1wiJz5cXG4gIFwiK3RoaXMub3B0aW9ucy5sYWJlbHNbY10rXCI6XFxuICBcIit0aGlzLnlMYWJlbEZvcm1hdChlKStcIlxcbjwvZGl2PlwiO3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMub3B0aW9ucy5ob3ZlckNhbGxiYWNrJiYoYj10aGlzLm9wdGlvbnMuaG92ZXJDYWxsYmFjayhhLHRoaXMub3B0aW9ucyxiLGQuc3JjKSksW2IsZC5feCxkLl95bWF4XX0sYy5wcm90b3R5cGUuZ2VuZXJhdGVQYXRocz1mdW5jdGlvbigpe3ZhciBhLGMsZCxlO3JldHVybiB0aGlzLnBhdGhzPWZ1bmN0aW9uKCl7dmFyIGYsZyxoLGo7Zm9yKGo9W10sYz1mPTAsZz10aGlzLm9wdGlvbnMueWtleXMubGVuZ3RoO2c+PTA/Zz5mOmY+ZztjPWc+PTA/KytmOi0tZillPVwiYm9vbGVhblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLnNtb290aD90aGlzLm9wdGlvbnMuc21vb3RoOihoPXRoaXMub3B0aW9ucy55a2V5c1tjXSxpLmNhbGwodGhpcy5vcHRpb25zLnNtb290aCxoKT49MCksYT1mdW5jdGlvbigpe3ZhciBhLGIsZSxmO2ZvcihlPXRoaXMuZGF0YSxmPVtdLGE9MCxiPWUubGVuZ3RoO2I+YTthKyspZD1lW2FdLHZvaWQgMCE9PWQuX3lbY10mJmYucHVzaCh7eDpkLl94LHk6ZC5feVtjXX0pO3JldHVybiBmfS5jYWxsKHRoaXMpLGEubGVuZ3RoPjE/ai5wdXNoKGIuTGluZS5jcmVhdGVQYXRoKGEsZSx0aGlzLmJvdHRvbSkpOmoucHVzaChudWxsKTtyZXR1cm4gan0uY2FsbCh0aGlzKX0sYy5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbigpe3ZhciBhO3JldHVybigoYT10aGlzLm9wdGlvbnMuYXhlcyk9PT0hMHx8XCJib3RoXCI9PT1hfHxcInhcIj09PWEpJiZ0aGlzLmRyYXdYQXhpcygpLHRoaXMuZHJhd1NlcmllcygpLHRoaXMub3B0aW9ucy5oaWRlSG92ZXI9PT0hMT90aGlzLmRpc3BsYXlIb3ZlckZvclJvdyh0aGlzLmRhdGEubGVuZ3RoLTEpOnZvaWQgMH0sYy5wcm90b3R5cGUuZHJhd1hBeGlzPWZ1bmN0aW9uKCl7dmFyIGEsYyxkLGUsZixnLGgsaSxqLGssbD10aGlzO2ZvcihoPXRoaXMuYm90dG9tK3RoaXMub3B0aW9ucy5wYWRkaW5nLzIsZj1udWxsLGU9bnVsbCxhPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxnLGksajtyZXR1cm4gYz1sLmRyYXdYQXhpc0xhYmVsKGwudHJhbnNYKGIpLGgsYSksaj1jLmdldEJCb3goKSxjLnRyYW5zZm9ybShcInJcIistbC5vcHRpb25zLnhMYWJlbEFuZ2xlKSxkPWMuZ2V0QkJveCgpLGMudHJhbnNmb3JtKFwidDAsXCIrZC5oZWlnaHQvMitcIi4uLlwiKSwwIT09bC5vcHRpb25zLnhMYWJlbEFuZ2xlJiYoaT0tLjUqai53aWR0aCpNYXRoLmNvcyhsLm9wdGlvbnMueExhYmVsQW5nbGUqTWF0aC5QSS8xODApLGMudHJhbnNmb3JtKFwidFwiK2krXCIsMC4uLlwiKSksZD1jLmdldEJCb3goKSwobnVsbD09Znx8Zj49ZC54K2Qud2lkdGh8fG51bGwhPWUmJmU+PWQueCkmJmQueD49MCYmZC54K2Qud2lkdGg8bC5lbC53aWR0aCgpPygwIT09bC5vcHRpb25zLnhMYWJlbEFuZ2xlJiYoZz0xLjI1Kmwub3B0aW9ucy5ncmlkVGV4dFNpemUvTWF0aC5zaW4obC5vcHRpb25zLnhMYWJlbEFuZ2xlKk1hdGguUEkvMTgwKSxlPWQueC1nKSxmPWQueC1sLm9wdGlvbnMueExhYmVsTWFyZ2luKTpjLnJlbW92ZSgpfSxkPXRoaXMub3B0aW9ucy5wYXJzZVRpbWU/MT09PXRoaXMuZGF0YS5sZW5ndGgmJlwiYXV0b1wiPT09dGhpcy5vcHRpb25zLnhMYWJlbHM/W1t0aGlzLmRhdGFbMF0ubGFiZWwsdGhpcy5kYXRhWzBdLnhdXTpiLmxhYmVsU2VyaWVzKHRoaXMueG1pbix0aGlzLnhtYXgsdGhpcy53aWR0aCx0aGlzLm9wdGlvbnMueExhYmVscyx0aGlzLm9wdGlvbnMueExhYmVsRm9ybWF0KTpmdW5jdGlvbigpe3ZhciBhLGIsYyxkO2ZvcihjPXRoaXMuZGF0YSxkPVtdLGE9MCxiPWMubGVuZ3RoO2I+YTthKyspZz1jW2FdLGQucHVzaChbZy5sYWJlbCxnLnhdKTtyZXR1cm4gZH0uY2FsbCh0aGlzKSxkLnJldmVyc2UoKSxrPVtdLGk9MCxqPWQubGVuZ3RoO2o+aTtpKyspYz1kW2ldLGsucHVzaChhKGNbMF0sY1sxXSkpO3JldHVybiBrfSxjLnByb3RvdHlwZS5kcmF3U2VyaWVzPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmO2Zvcih0aGlzLnNlcmllc1BvaW50cz1bXSxhPWI9ZD10aGlzLm9wdGlvbnMueWtleXMubGVuZ3RoLTE7MD49ZD8wPj1iOmI+PTA7YT0wPj1kPysrYjotLWIpdGhpcy5fZHJhd0xpbmVGb3IoYSk7Zm9yKGY9W10sYT1jPWU9dGhpcy5vcHRpb25zLnlrZXlzLmxlbmd0aC0xOzA+PWU/MD49YzpjPj0wO2E9MD49ZT8rK2M6LS1jKWYucHVzaCh0aGlzLl9kcmF3UG9pbnRGb3IoYSkpO3JldHVybiBmfSxjLnByb3RvdHlwZS5fZHJhd1BvaW50Rm9yPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZztmb3IodGhpcy5zZXJpZXNQb2ludHNbYV09W10sZj10aGlzLmRhdGEsZz1bXSxkPTAsZT1mLmxlbmd0aDtlPmQ7ZCsrKWM9ZltkXSxiPW51bGwsbnVsbCE9Yy5feVthXSYmKGI9dGhpcy5kcmF3TGluZVBvaW50KGMuX3gsYy5feVthXSx0aGlzLmNvbG9yRm9yKGMsYSxcInBvaW50XCIpLGEpKSxnLnB1c2godGhpcy5zZXJpZXNQb2ludHNbYV0ucHVzaChiKSk7cmV0dXJuIGd9LGMucHJvdG90eXBlLl9kcmF3TGluZUZvcj1mdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYj10aGlzLnBhdGhzW2FdLG51bGwhPT1iP3RoaXMuZHJhd0xpbmVQYXRoKGIsdGhpcy5jb2xvckZvcihudWxsLGEsXCJsaW5lXCIpLGEpOnZvaWQgMH0sYy5jcmVhdGVQYXRoPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyO2ZvcihrPVwiXCIsYyYmKGc9Yi5MaW5lLmdyYWRpZW50cyhhKSksbD17eTpudWxsfSxoPXE9MCxyPWEubGVuZ3RoO3I+cTtoPSsrcSllPWFbaF0sbnVsbCE9ZS55JiYobnVsbCE9bC55P2M/KGY9Z1toXSxqPWdbaC0xXSxpPShlLngtbC54KS80LG09bC54K2ksbz1NYXRoLm1pbihkLGwueStpKmopLG49ZS54LWkscD1NYXRoLm1pbihkLGUueS1pKmYpLGsrPVwiQ1wiK20rXCIsXCIrbytcIixcIituK1wiLFwiK3ArXCIsXCIrZS54K1wiLFwiK2UueSk6ays9XCJMXCIrZS54K1wiLFwiK2UueTpjJiZudWxsPT1nW2hdfHwoays9XCJNXCIrZS54K1wiLFwiK2UueSkpLGw9ZTtyZXR1cm4ga30sYy5ncmFkaWVudHM9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaTtmb3IoYz1mdW5jdGlvbihhLGIpe3JldHVybihhLnktYi55KS8oYS54LWIueCl9LGk9W10sZD1nPTAsaD1hLmxlbmd0aDtoPmc7ZD0rK2cpYj1hW2RdLG51bGwhPWIueT8oZT1hW2QrMV18fHt5Om51bGx9LGY9YVtkLTFdfHx7eTpudWxsfSxudWxsIT1mLnkmJm51bGwhPWUueT9pLnB1c2goYyhmLGUpKTpudWxsIT1mLnk/aS5wdXNoKGMoZixiKSk6bnVsbCE9ZS55P2kucHVzaChjKGIsZSkpOmkucHVzaChudWxsKSk6aS5wdXNoKG51bGwpO3JldHVybiBpfSxjLnByb3RvdHlwZS5oaWxpZ2h0PWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGY7aWYobnVsbCE9PXRoaXMucHJldkhpbGlnaHQmJnRoaXMucHJldkhpbGlnaHQhPT1hKWZvcihiPWM9MCxlPXRoaXMuc2VyaWVzUG9pbnRzLmxlbmd0aC0xO2U+PTA/ZT49YzpjPj1lO2I9ZT49MD8rK2M6LS1jKXRoaXMuc2VyaWVzUG9pbnRzW2JdW3RoaXMucHJldkhpbGlnaHRdJiZ0aGlzLnNlcmllc1BvaW50c1tiXVt0aGlzLnByZXZIaWxpZ2h0XS5hbmltYXRlKHRoaXMucG9pbnRTaHJpbmtTZXJpZXMoYikpO2lmKG51bGwhPT1hJiZ0aGlzLnByZXZIaWxpZ2h0IT09YSlmb3IoYj1kPTAsZj10aGlzLnNlcmllc1BvaW50cy5sZW5ndGgtMTtmPj0wP2Y+PWQ6ZD49ZjtiPWY+PTA/KytkOi0tZCl0aGlzLnNlcmllc1BvaW50c1tiXVthXSYmdGhpcy5zZXJpZXNQb2ludHNbYl1bYV0uYW5pbWF0ZSh0aGlzLnBvaW50R3Jvd1NlcmllcyhiKSk7cmV0dXJuIHRoaXMucHJldkhpbGlnaHQ9YX0sYy5wcm90b3R5cGUuY29sb3JGb3I9ZnVuY3Rpb24oYSxiLGMpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMub3B0aW9ucy5saW5lQ29sb3JzP3RoaXMub3B0aW9ucy5saW5lQ29sb3JzLmNhbGwodGhpcyxhLGIsYyk6XCJwb2ludFwiPT09Yz90aGlzLm9wdGlvbnMucG9pbnRGaWxsQ29sb3JzW2IldGhpcy5vcHRpb25zLnBvaW50RmlsbENvbG9ycy5sZW5ndGhdfHx0aGlzLm9wdGlvbnMubGluZUNvbG9yc1tiJXRoaXMub3B0aW9ucy5saW5lQ29sb3JzLmxlbmd0aF06dGhpcy5vcHRpb25zLmxpbmVDb2xvcnNbYiV0aGlzLm9wdGlvbnMubGluZUNvbG9ycy5sZW5ndGhdfSxjLnByb3RvdHlwZS5kcmF3WEF4aXNMYWJlbD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMucmFwaGFlbC50ZXh0KGEsYixjKS5hdHRyKFwiZm9udC1zaXplXCIsdGhpcy5vcHRpb25zLmdyaWRUZXh0U2l6ZSkuYXR0cihcImZvbnQtZmFtaWx5XCIsdGhpcy5vcHRpb25zLmdyaWRUZXh0RmFtaWx5KS5hdHRyKFwiZm9udC13ZWlnaHRcIix0aGlzLm9wdGlvbnMuZ3JpZFRleHRXZWlnaHQpLmF0dHIoXCJmaWxsXCIsdGhpcy5vcHRpb25zLmdyaWRUZXh0Q29sb3IpfSxjLnByb3RvdHlwZS5kcmF3TGluZVBhdGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLnJhcGhhZWwucGF0aChhKS5hdHRyKFwic3Ryb2tlXCIsYikuYXR0cihcInN0cm9rZS13aWR0aFwiLHRoaXMubGluZVdpZHRoRm9yU2VyaWVzKGMpKX0sYy5wcm90b3R5cGUuZHJhd0xpbmVQb2ludD1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5yYXBoYWVsLmNpcmNsZShhLGIsdGhpcy5wb2ludFNpemVGb3JTZXJpZXMoZCkpLmF0dHIoXCJmaWxsXCIsYykuYXR0cihcInN0cm9rZS13aWR0aFwiLHRoaXMucG9pbnRTdHJva2VXaWR0aEZvclNlcmllcyhkKSkuYXR0cihcInN0cm9rZVwiLHRoaXMucG9pbnRTdHJva2VDb2xvckZvclNlcmllcyhkKSl9LGMucHJvdG90eXBlLnBvaW50U3Ryb2tlV2lkdGhGb3JTZXJpZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub3B0aW9ucy5wb2ludFN0cm9rZVdpZHRoc1thJXRoaXMub3B0aW9ucy5wb2ludFN0cm9rZVdpZHRocy5sZW5ndGhdfSxjLnByb3RvdHlwZS5wb2ludFN0cm9rZUNvbG9yRm9yU2VyaWVzPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9wdGlvbnMucG9pbnRTdHJva2VDb2xvcnNbYSV0aGlzLm9wdGlvbnMucG9pbnRTdHJva2VDb2xvcnMubGVuZ3RoXX0sYy5wcm90b3R5cGUubGluZVdpZHRoRm9yU2VyaWVzPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9wdGlvbnMubGluZVdpZHRoIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5vcHRpb25zLmxpbmVXaWR0aFthJXRoaXMub3B0aW9ucy5saW5lV2lkdGgubGVuZ3RoXTp0aGlzLm9wdGlvbnMubGluZVdpZHRofSxjLnByb3RvdHlwZS5wb2ludFNpemVGb3JTZXJpZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub3B0aW9ucy5wb2ludFNpemUgaW5zdGFuY2VvZiBBcnJheT90aGlzLm9wdGlvbnMucG9pbnRTaXplW2EldGhpcy5vcHRpb25zLnBvaW50U2l6ZS5sZW5ndGhdOnRoaXMub3B0aW9ucy5wb2ludFNpemV9LGMucHJvdG90eXBlLnBvaW50R3Jvd1Nlcmllcz1mdW5jdGlvbihhKXtyZXR1cm4gUmFwaGFlbC5hbmltYXRpb24oe3I6dGhpcy5wb2ludFNpemVGb3JTZXJpZXMoYSkrM30sMjUsXCJsaW5lYXJcIil9LGMucHJvdG90eXBlLnBvaW50U2hyaW5rU2VyaWVzPWZ1bmN0aW9uKGEpe3JldHVybiBSYXBoYWVsLmFuaW1hdGlvbih7cjp0aGlzLnBvaW50U2l6ZUZvclNlcmllcyhhKX0sMjUsXCJsaW5lYXJcIil9LGN9KGIuR3JpZCksYi5sYWJlbFNlcmllcz1mdW5jdGlvbihjLGQsZSxmLGcpe3ZhciBoLGksaixrLGwsbSxuLG8scCxxLHI7aWYoaj0yMDAqKGQtYykvZSxpPW5ldyBEYXRlKGMpLG49Yi5MQUJFTF9TUEVDU1tmXSx2b2lkIDA9PT1uKWZvcihyPWIuQVVUT19MQUJFTF9PUkRFUixwPTAscT1yLmxlbmd0aDtxPnA7cCsrKWlmKGs9cltwXSxtPWIuTEFCRUxfU1BFQ1Nba10saj49bS5zcGFuKXtuPW07YnJlYWt9Zm9yKHZvaWQgMD09PW4mJihuPWIuTEFCRUxfU1BFQ1Muc2Vjb25kKSxnJiYobj1hLmV4dGVuZCh7fSxuLHtmbXQ6Z30pKSxoPW4uc3RhcnQoaSksbD1bXTsobz1oLmdldFRpbWUoKSk8PWQ7KW8+PWMmJmwucHVzaChbbi5mbXQoaCksb10pLG4uaW5jcihoKTtyZXR1cm4gbH0sYz1mdW5jdGlvbihhKXtyZXR1cm57c3Bhbjo2MCphKjFlMyxzdGFydDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IERhdGUoYS5nZXRGdWxsWWVhcigpLGEuZ2V0TW9udGgoKSxhLmdldERhdGUoKSxhLmdldEhvdXJzKCkpfSxmbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuXCJcIitiLnBhZDIoYS5nZXRIb3VycygpKStcIjpcIitiLnBhZDIoYS5nZXRNaW51dGVzKCkpfSxpbmNyOmZ1bmN0aW9uKGIpe3JldHVybiBiLnNldFVUQ01pbnV0ZXMoYi5nZXRVVENNaW51dGVzKCkrYSl9fX0sZD1mdW5jdGlvbihhKXtyZXR1cm57c3BhbjoxZTMqYSxzdGFydDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IERhdGUoYS5nZXRGdWxsWWVhcigpLGEuZ2V0TW9udGgoKSxhLmdldERhdGUoKSxhLmdldEhvdXJzKCksYS5nZXRNaW51dGVzKCkpfSxmbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuXCJcIitiLnBhZDIoYS5nZXRIb3VycygpKStcIjpcIitiLnBhZDIoYS5nZXRNaW51dGVzKCkpK1wiOlwiK2IucGFkMihhLmdldFNlY29uZHMoKSl9LGluY3I6ZnVuY3Rpb24oYil7cmV0dXJuIGIuc2V0VVRDU2Vjb25kcyhiLmdldFVUQ1NlY29uZHMoKSthKX19fSxiLkxBQkVMX1NQRUNTPXtkZWNhZGU6e3NwYW46MTcyOGU4LHN0YXJ0OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgRGF0ZShhLmdldEZ1bGxZZWFyKCktYS5nZXRGdWxsWWVhcigpJTEwLDAsMSl9LGZtdDpmdW5jdGlvbihhKXtyZXR1cm5cIlwiK2EuZ2V0RnVsbFllYXIoKX0saW5jcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5zZXRGdWxsWWVhcihhLmdldEZ1bGxZZWFyKCkrMTApfX0seWVhcjp7c3BhbjoxNzI4ZTcsc3RhcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBEYXRlKGEuZ2V0RnVsbFllYXIoKSwwLDEpfSxmbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuXCJcIithLmdldEZ1bGxZZWFyKCl9LGluY3I6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2V0RnVsbFllYXIoYS5nZXRGdWxsWWVhcigpKzEpfX0sbW9udGg6e3NwYW46MjQxOTJlNSxzdGFydDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IERhdGUoYS5nZXRGdWxsWWVhcigpLGEuZ2V0TW9udGgoKSwxKX0sZm10OmZ1bmN0aW9uKGEpe3JldHVyblwiXCIrYS5nZXRGdWxsWWVhcigpK1wiLVwiK2IucGFkMihhLmdldE1vbnRoKCkrMSl9LGluY3I6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2V0TW9udGgoYS5nZXRNb250aCgpKzEpfX0sd2Vlazp7c3Bhbjo2MDQ4ZTUsc3RhcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBEYXRlKGEuZ2V0RnVsbFllYXIoKSxhLmdldE1vbnRoKCksYS5nZXREYXRlKCkpfSxmbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuXCJcIithLmdldEZ1bGxZZWFyKCkrXCItXCIrYi5wYWQyKGEuZ2V0TW9udGgoKSsxKStcIi1cIitiLnBhZDIoYS5nZXREYXRlKCkpfSxpbmNyOmZ1bmN0aW9uKGEpe3JldHVybiBhLnNldERhdGUoYS5nZXREYXRlKCkrNyl9fSxkYXk6e3NwYW46ODY0ZTUsc3RhcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBEYXRlKGEuZ2V0RnVsbFllYXIoKSxhLmdldE1vbnRoKCksYS5nZXREYXRlKCkpfSxmbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuXCJcIithLmdldEZ1bGxZZWFyKCkrXCItXCIrYi5wYWQyKGEuZ2V0TW9udGgoKSsxKStcIi1cIitiLnBhZDIoYS5nZXREYXRlKCkpfSxpbmNyOmZ1bmN0aW9uKGEpe3JldHVybiBhLnNldERhdGUoYS5nZXREYXRlKCkrMSl9fSxob3VyOmMoNjApLFwiMzBtaW5cIjpjKDMwKSxcIjE1bWluXCI6YygxNSksXCIxMG1pblwiOmMoMTApLFwiNW1pblwiOmMoNSksbWludXRlOmMoMSksXCIzMHNlY1wiOmQoMzApLFwiMTVzZWNcIjpkKDE1KSxcIjEwc2VjXCI6ZCgxMCksXCI1c2VjXCI6ZCg1KSxzZWNvbmQ6ZCgxKX0sYi5BVVRPX0xBQkVMX09SREVSPVtcImRlY2FkZVwiLFwieWVhclwiLFwibW9udGhcIixcIndlZWtcIixcImRheVwiLFwiaG91clwiLFwiMzBtaW5cIixcIjE1bWluXCIsXCIxMG1pblwiLFwiNW1pblwiLFwibWludXRlXCIsXCIzMHNlY1wiLFwiMTVzZWNcIixcIjEwc2VjXCIsXCI1c2VjXCIsXCJzZWNvbmRcIl0sYi5BcmVhPWZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGQoYyl7dmFyIGY7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBiLkFyZWE/KGY9YS5leHRlbmQoe30sZSxjKSx0aGlzLmN1bXVsYXRpdmU9IWYuYmVoYXZlTGlrZUxpbmUsXCJhdXRvXCI9PT1mLmZpbGxPcGFjaXR5JiYoZi5maWxsT3BhY2l0eT1mLmJlaGF2ZUxpa2VMaW5lPy44OjEpLGQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmKSx2b2lkIDApOm5ldyBiLkFyZWEoYyl9dmFyIGU7cmV0dXJuIGgoZCxjKSxlPXtmaWxsT3BhY2l0eTpcImF1dG9cIixiZWhhdmVMaWtlTGluZTohMX0sZC5wcm90b3R5cGUuY2FsY1BvaW50cz1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnO2ZvcihmPXRoaXMuZGF0YSxnPVtdLGQ9MCxlPWYubGVuZ3RoO2U+ZDtkKyspYT1mW2RdLGEuX3g9dGhpcy50cmFuc1goYS54KSxiPTAsYS5feT1mdW5jdGlvbigpe3ZhciBkLGUsZixnO2ZvcihmPWEueSxnPVtdLGQ9MCxlPWYubGVuZ3RoO2U+ZDtkKyspYz1mW2RdLHRoaXMub3B0aW9ucy5iZWhhdmVMaWtlTGluZT9nLnB1c2godGhpcy50cmFuc1koYykpOihiKz1jfHwwLGcucHVzaCh0aGlzLnRyYW5zWShiKSkpO3JldHVybiBnfS5jYWxsKHRoaXMpLGcucHVzaChhLl95bWF4PU1hdGgubWF4LmFwcGx5KE1hdGgsYS5feSkpO3JldHVybiBnfSxkLnByb3RvdHlwZS5kcmF3U2VyaWVzPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGcsaDtmb3IodGhpcy5zZXJpZXNQb2ludHM9W10sYj10aGlzLm9wdGlvbnMuYmVoYXZlTGlrZUxpbmU/ZnVuY3Rpb24oKXtmPVtdO2Zvcih2YXIgYT0wLGI9dGhpcy5vcHRpb25zLnlrZXlzLmxlbmd0aC0xO2I+PTA/Yj49YTphPj1iO2I+PTA/YSsrOmEtLSlmLnB1c2goYSk7cmV0dXJuIGZ9LmFwcGx5KHRoaXMpOmZ1bmN0aW9uKCl7Zz1bXTtmb3IodmFyIGE9ZT10aGlzLm9wdGlvbnMueWtleXMubGVuZ3RoLTE7MD49ZT8wPj1hOmE+PTA7MD49ZT9hKys6YS0tKWcucHVzaChhKTtyZXR1cm4gZ30uYXBwbHkodGhpcyksaD1bXSxjPTAsZD1iLmxlbmd0aDtkPmM7YysrKWE9YltjXSx0aGlzLl9kcmF3RmlsbEZvcihhKSx0aGlzLl9kcmF3TGluZUZvcihhKSxoLnB1c2godGhpcy5fZHJhd1BvaW50Rm9yKGEpKTtyZXR1cm4gaH0sZC5wcm90b3R5cGUuX2RyYXdGaWxsRm9yPWZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBiPXRoaXMucGF0aHNbYV0sbnVsbCE9PWI/KGIrPVwiTFwiK3RoaXMudHJhbnNYKHRoaXMueG1heCkrXCIsXCIrdGhpcy5ib3R0b20rXCJMXCIrdGhpcy50cmFuc1godGhpcy54bWluKStcIixcIit0aGlzLmJvdHRvbStcIlpcIix0aGlzLmRyYXdGaWxsZWRQYXRoKGIsdGhpcy5maWxsRm9yU2VyaWVzKGEpKSk6dm9pZCAwfSxkLnByb3RvdHlwZS5maWxsRm9yU2VyaWVzPWZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBiPVJhcGhhZWwucmdiMmhzbCh0aGlzLmNvbG9yRm9yKHRoaXMuZGF0YVthXSxhLFwibGluZVwiKSksUmFwaGFlbC5oc2woYi5oLHRoaXMub3B0aW9ucy5iZWhhdmVMaWtlTGluZT8uOSpiLnM6Ljc1KmIucyxNYXRoLm1pbiguOTgsdGhpcy5vcHRpb25zLmJlaGF2ZUxpa2VMaW5lPzEuMipiLmw6MS4yNSpiLmwpKX0sZC5wcm90b3R5cGUuZHJhd0ZpbGxlZFBhdGg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5yYXBoYWVsLnBhdGgoYSkuYXR0cihcImZpbGxcIixiKS5hdHRyKFwiZmlsbC1vcGFjaXR5XCIsdGhpcy5vcHRpb25zLmZpbGxPcGFjaXR5KS5hdHRyKFwic3Ryb2tlXCIsXCJub25lXCIpfSxkfShiLkxpbmUpLGIuQmFyPWZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGQoYyl7cmV0dXJuIHRoaXMub25Ib3Zlck91dD1mKHRoaXMub25Ib3Zlck91dCx0aGlzKSx0aGlzLm9uSG92ZXJNb3ZlPWYodGhpcy5vbkhvdmVyTW92ZSx0aGlzKSx0aGlzLm9uR3JpZENsaWNrPWYodGhpcy5vbkdyaWRDbGljayx0aGlzKSx0aGlzIGluc3RhbmNlb2YgYi5CYXI/KGQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhLmV4dGVuZCh7fSxjLHtwYXJzZVRpbWU6ITF9KSksdm9pZCAwKTpuZXcgYi5CYXIoYyl9cmV0dXJuIGgoZCxjKSxkLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VtdWxhdGl2ZT10aGlzLm9wdGlvbnMuc3RhY2tlZCxcImFsd2F5c1wiIT09dGhpcy5vcHRpb25zLmhpZGVIb3Zlcj8odGhpcy5ob3Zlcj1uZXcgYi5Ib3Zlcih7cGFyZW50OnRoaXMuZWx9KSx0aGlzLm9uKFwiaG92ZXJtb3ZlXCIsdGhpcy5vbkhvdmVyTW92ZSksdGhpcy5vbihcImhvdmVyb3V0XCIsdGhpcy5vbkhvdmVyT3V0KSx0aGlzLm9uKFwiZ3JpZGNsaWNrXCIsdGhpcy5vbkdyaWRDbGljaykpOnZvaWQgMH0sZC5wcm90b3R5cGUuZGVmYXVsdHM9e2JhclNpemVSYXRpbzouNzUsYmFyR2FwOjMsYmFyQ29sb3JzOltcIiMwYjYyYTRcIixcIiM3YTkyYTNcIixcIiM0ZGE3NGRcIixcIiNhZmQ4ZjhcIixcIiNlZGMyNDBcIixcIiNjYjRiNGJcIixcIiM5NDQwZWRcIl0sYmFyT3BhY2l0eToxLGJhclJhZGl1czpbMCwwLDAsMF0seExhYmVsTWFyZ2luOjUwfSxkLnByb3RvdHlwZS5jYWxjPWZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIHRoaXMuY2FsY0JhcnMoKSx0aGlzLm9wdGlvbnMuaGlkZUhvdmVyPT09ITE/KGE9dGhpcy5ob3ZlcikudXBkYXRlLmFwcGx5KGEsdGhpcy5ob3ZlckNvbnRlbnRGb3JSb3codGhpcy5kYXRhLmxlbmd0aC0xKSk6dm9pZCAwfSxkLnByb3RvdHlwZS5jYWxjQmFycz1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnO2ZvcihmPXRoaXMuZGF0YSxnPVtdLGE9ZD0wLGU9Zi5sZW5ndGg7ZT5kO2E9KytkKWI9ZlthXSxiLl94PXRoaXMubGVmdCt0aGlzLndpZHRoKihhKy41KS90aGlzLmRhdGEubGVuZ3RoLGcucHVzaChiLl95PWZ1bmN0aW9uKCl7dmFyIGEsZCxlLGY7Zm9yKGU9Yi55LGY9W10sYT0wLGQ9ZS5sZW5ndGg7ZD5hO2ErKyljPWVbYV0sbnVsbCE9Yz9mLnB1c2godGhpcy50cmFuc1koYykpOmYucHVzaChudWxsKTtyZXR1cm4gZn0uY2FsbCh0aGlzKSk7cmV0dXJuIGd9LGQucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4oKGE9dGhpcy5vcHRpb25zLmF4ZXMpPT09ITB8fFwiYm90aFwiPT09YXx8XCJ4XCI9PT1hKSYmdGhpcy5kcmF3WEF4aXMoKSx0aGlzLmRyYXdTZXJpZXMoKX0sZC5wcm90b3R5cGUuZHJhd1hBeGlzPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG07Zm9yKGo9dGhpcy5ib3R0b20rKHRoaXMub3B0aW9ucy54QXhpc0xhYmVsVG9wUGFkZGluZ3x8dGhpcy5vcHRpb25zLnBhZGRpbmcvMiksZz1udWxsLGY9bnVsbCxtPVtdLGE9az0wLGw9dGhpcy5kYXRhLmxlbmd0aDtsPj0wP2w+azprPmw7YT1sPj0wPysrazotLWspaD10aGlzLmRhdGFbdGhpcy5kYXRhLmxlbmd0aC0xLWFdLGI9dGhpcy5kcmF3WEF4aXNMYWJlbChoLl94LGosaC5sYWJlbCksaT1iLmdldEJCb3goKSxiLnRyYW5zZm9ybShcInJcIistdGhpcy5vcHRpb25zLnhMYWJlbEFuZ2xlKSxjPWIuZ2V0QkJveCgpLGIudHJhbnNmb3JtKFwidDAsXCIrYy5oZWlnaHQvMitcIi4uLlwiKSwwIT09dGhpcy5vcHRpb25zLnhMYWJlbEFuZ2xlJiYoZT0tLjUqaS53aWR0aCpNYXRoLmNvcyh0aGlzLm9wdGlvbnMueExhYmVsQW5nbGUqTWF0aC5QSS8xODApLGIudHJhbnNmb3JtKFwidFwiK2UrXCIsMC4uLlwiKSksKG51bGw9PWd8fGc+PWMueCtjLndpZHRofHxudWxsIT1mJiZmPj1jLngpJiZjLng+PTAmJmMueCtjLndpZHRoPHRoaXMuZWwud2lkdGgoKT8oMCE9PXRoaXMub3B0aW9ucy54TGFiZWxBbmdsZSYmKGQ9MS4yNSp0aGlzLm9wdGlvbnMuZ3JpZFRleHRTaXplL01hdGguc2luKHRoaXMub3B0aW9ucy54TGFiZWxBbmdsZSpNYXRoLlBJLzE4MCksZj1jLngtZCksbS5wdXNoKGc9Yy54LXRoaXMub3B0aW9ucy54TGFiZWxNYXJnaW4pKTptLnB1c2goYi5yZW1vdmUoKSk7cmV0dXJuIG19LGQucHJvdG90eXBlLmRyYXdTZXJpZXM9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG87cmV0dXJuIGM9dGhpcy53aWR0aC90aGlzLm9wdGlvbnMuZGF0YS5sZW5ndGgsaD10aGlzLm9wdGlvbnMuc3RhY2tlZD8xOnRoaXMub3B0aW9ucy55a2V5cy5sZW5ndGgsYT0oYyp0aGlzLm9wdGlvbnMuYmFyU2l6ZVJhdGlvLXRoaXMub3B0aW9ucy5iYXJHYXAqKGgtMSkpL2gsdGhpcy5vcHRpb25zLmJhclNpemUmJihhPU1hdGgubWluKGEsdGhpcy5vcHRpb25zLmJhclNpemUpKSxsPWMtYSpoLXRoaXMub3B0aW9ucy5iYXJHYXAqKGgtMSksZz1sLzIsbz10aGlzLnltaW48PTAmJnRoaXMueW1heD49MD90aGlzLnRyYW5zWSgwKTpudWxsLHRoaXMuYmFycz1mdW5jdGlvbigpe3ZhciBoLGwscCxxO2ZvcihwPXRoaXMuZGF0YSxxPVtdLGQ9aD0wLGw9cC5sZW5ndGg7bD5oO2Q9KytoKWk9cFtkXSxlPTAscS5wdXNoKGZ1bmN0aW9uKCl7dmFyIGgsbCxwLHE7Zm9yKHA9aS5feSxxPVtdLGo9aD0wLGw9cC5sZW5ndGg7bD5oO2o9KytoKW49cFtqXSxudWxsIT09bj8obz8obT1NYXRoLm1pbihuLG8pLGI9TWF0aC5tYXgobixvKSk6KG09bixiPXRoaXMuYm90dG9tKSxmPXRoaXMubGVmdCtkKmMrZyx0aGlzLm9wdGlvbnMuc3RhY2tlZHx8KGYrPWoqKGErdGhpcy5vcHRpb25zLmJhckdhcCkpLGs9Yi1tLHRoaXMub3B0aW9ucy52ZXJ0aWNhbEdyaWRDb25kaXRpb24mJnRoaXMub3B0aW9ucy52ZXJ0aWNhbEdyaWRDb25kaXRpb24oaS54KSYmdGhpcy5kcmF3QmFyKHRoaXMubGVmdCtkKmMsdGhpcy50b3AsYyxNYXRoLmFicyh0aGlzLnRvcC10aGlzLmJvdHRvbSksdGhpcy5vcHRpb25zLnZlcnRpY2FsR3JpZENvbG9yLHRoaXMub3B0aW9ucy52ZXJ0aWNhbEdyaWRPcGFjaXR5LHRoaXMub3B0aW9ucy5iYXJSYWRpdXMpLHRoaXMub3B0aW9ucy5zdGFja2VkJiYobS09ZSksdGhpcy5kcmF3QmFyKGYsbSxhLGssdGhpcy5jb2xvckZvcihpLGosXCJiYXJcIiksdGhpcy5vcHRpb25zLmJhck9wYWNpdHksdGhpcy5vcHRpb25zLmJhclJhZGl1cykscS5wdXNoKGUrPWspKTpxLnB1c2gobnVsbCk7cmV0dXJuIHF9LmNhbGwodGhpcykpO3JldHVybiBxfS5jYWxsKHRoaXMpfSxkLnByb3RvdHlwZS5jb2xvckZvcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuYmFyQ29sb3JzPyhkPXt4OmEueCx5OmEueVtiXSxsYWJlbDphLmxhYmVsfSxlPXtpbmRleDpiLGtleTp0aGlzLm9wdGlvbnMueWtleXNbYl0sbGFiZWw6dGhpcy5vcHRpb25zLmxhYmVsc1tiXX0sdGhpcy5vcHRpb25zLmJhckNvbG9ycy5jYWxsKHRoaXMsZCxlLGMpKTp0aGlzLm9wdGlvbnMuYmFyQ29sb3JzW2IldGhpcy5vcHRpb25zLmJhckNvbG9ycy5sZW5ndGhdfSxkLnByb3RvdHlwZS5oaXRUZXN0PWZ1bmN0aW9uKGEpe3JldHVybiAwPT09dGhpcy5kYXRhLmxlbmd0aD9udWxsOihhPU1hdGgubWF4KE1hdGgubWluKGEsdGhpcy5yaWdodCksdGhpcy5sZWZ0KSxNYXRoLm1pbih0aGlzLmRhdGEubGVuZ3RoLTEsTWF0aC5mbG9vcigoYS10aGlzLmxlZnQpLyh0aGlzLndpZHRoL3RoaXMuZGF0YS5sZW5ndGgpKSkpfSxkLnByb3RvdHlwZS5vbkdyaWRDbGljaz1mdW5jdGlvbihhLGIpe3ZhciBjO3JldHVybiBjPXRoaXMuaGl0VGVzdChhKSx0aGlzLmZpcmUoXCJjbGlja1wiLGMsdGhpcy5kYXRhW2NdLnNyYyxhLGIpfSxkLnByb3RvdHlwZS5vbkhvdmVyTW92ZT1mdW5jdGlvbihhKXt2YXIgYixjO3JldHVybiBiPXRoaXMuaGl0VGVzdChhKSwoYz10aGlzLmhvdmVyKS51cGRhdGUuYXBwbHkoYyx0aGlzLmhvdmVyQ29udGVudEZvclJvdyhiKSl9LGQucHJvdG90eXBlLm9uSG92ZXJPdXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmhpZGVIb3ZlciE9PSExP3RoaXMuaG92ZXIuaGlkZSgpOnZvaWQgMH0sZC5wcm90b3R5cGUuaG92ZXJDb250ZW50Rm9yUm93PWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGk7Zm9yKGQ9dGhpcy5kYXRhW2FdLGI9XCI8ZGl2IGNsYXNzPSdtb3JyaXMtaG92ZXItcm93LWxhYmVsJz5cIitkLmxhYmVsK1wiPC9kaXY+XCIsaT1kLnksYz1nPTAsaD1pLmxlbmd0aDtoPmc7Yz0rK2cpZj1pW2NdLGIrPVwiPGRpdiBjbGFzcz0nbW9ycmlzLWhvdmVyLXBvaW50JyBzdHlsZT0nY29sb3I6IFwiK3RoaXMuY29sb3JGb3IoZCxjLFwibGFiZWxcIikrXCInPlxcbiAgXCIrdGhpcy5vcHRpb25zLmxhYmVsc1tjXStcIjpcXG4gIFwiK3RoaXMueUxhYmVsRm9ybWF0KGYpK1wiXFxuPC9kaXY+XCI7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmhvdmVyQ2FsbGJhY2smJihiPXRoaXMub3B0aW9ucy5ob3ZlckNhbGxiYWNrKGEsdGhpcy5vcHRpb25zLGIsZC5zcmMpKSxlPXRoaXMubGVmdCsoYSsuNSkqdGhpcy53aWR0aC90aGlzLmRhdGEubGVuZ3RoLFtiLGVdfSxkLnByb3RvdHlwZS5kcmF3WEF4aXNMYWJlbD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGQ9dGhpcy5yYXBoYWVsLnRleHQoYSxiLGMpLmF0dHIoXCJmb250LXNpemVcIix0aGlzLm9wdGlvbnMuZ3JpZFRleHRTaXplKS5hdHRyKFwiZm9udC1mYW1pbHlcIix0aGlzLm9wdGlvbnMuZ3JpZFRleHRGYW1pbHkpLmF0dHIoXCJmb250LXdlaWdodFwiLHRoaXMub3B0aW9ucy5ncmlkVGV4dFdlaWdodCkuYXR0cihcImZpbGxcIix0aGlzLm9wdGlvbnMuZ3JpZFRleHRDb2xvcil9LGQucHJvdG90eXBlLmRyYXdCYXI9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGgsaTtyZXR1cm4gaD1NYXRoLm1heC5hcHBseShNYXRoLGcpLGk9MD09PWh8fGg+ZD90aGlzLnJhcGhhZWwucmVjdChhLGIsYyxkKTp0aGlzLnJhcGhhZWwucGF0aCh0aGlzLnJvdW5kZWRSZWN0KGEsYixjLGQsZykpLGkuYXR0cihcImZpbGxcIixlKS5hdHRyKFwiZmlsbC1vcGFjaXR5XCIsZikuYXR0cihcInN0cm9rZVwiLFwibm9uZVwiKX0sZC5wcm90b3R5cGUucm91bmRlZFJlY3Q9ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gbnVsbD09ZSYmKGU9WzAsMCwwLDBdKSxbXCJNXCIsYSxlWzBdK2IsXCJRXCIsYSxiLGErZVswXSxiLFwiTFwiLGErYy1lWzFdLGIsXCJRXCIsYStjLGIsYStjLGIrZVsxXSxcIkxcIixhK2MsYitkLWVbMl0sXCJRXCIsYStjLGIrZCxhK2MtZVsyXSxiK2QsXCJMXCIsYStlWzNdLGIrZCxcIlFcIixhLGIrZCxhLGIrZC1lWzNdLFwiWlwiXX0sZH0oYi5HcmlkKSxiLkRvbnV0PWZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGQoYyl7dGhpcy5yZXNpemVIYW5kbGVyPWYodGhpcy5yZXNpemVIYW5kbGVyLHRoaXMpLHRoaXMuc2VsZWN0PWYodGhpcy5zZWxlY3QsdGhpcyksdGhpcy5jbGljaz1mKHRoaXMuY2xpY2ssdGhpcyk7dmFyIGQ9dGhpcztpZighKHRoaXMgaW5zdGFuY2VvZiBiLkRvbnV0KSlyZXR1cm4gbmV3IGIuRG9udXQoYyk7aWYodGhpcy5vcHRpb25zPWEuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdHMsYyksdGhpcy5lbD1cInN0cmluZ1wiPT10eXBlb2YgYy5lbGVtZW50P2EoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5lbGVtZW50KSk6YShjLmVsZW1lbnQpLG51bGw9PT10aGlzLmVsfHwwPT09dGhpcy5lbC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiR3JhcGggcGxhY2Vob2xkZXIgbm90IGZvdW5kLlwiKTt2b2lkIDAhPT1jLmRhdGEmJjAhPT1jLmRhdGEubGVuZ3RoJiYodGhpcy5yYXBoYWVsPW5ldyBSYXBoYWVsKHRoaXMuZWxbMF0pLHRoaXMub3B0aW9ucy5yZXNpemUmJmEod2luZG93KS5iaW5kKFwicmVzaXplXCIsZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9ZC50aW1lb3V0SWQmJndpbmRvdy5jbGVhclRpbWVvdXQoZC50aW1lb3V0SWQpLGQudGltZW91dElkPXdpbmRvdy5zZXRUaW1lb3V0KGQucmVzaXplSGFuZGxlciwxMDApfSksdGhpcy5zZXREYXRhKGMuZGF0YSkpfXJldHVybiBoKGQsYyksZC5wcm90b3R5cGUuZGVmYXVsdHM9e2NvbG9yczpbXCIjMEI2MkE0XCIsXCIjMzk4MEI1XCIsXCIjNjc5REM2XCIsXCIjOTVCQkQ3XCIsXCIjQjBDQ0UxXCIsXCIjMDk1NzkxXCIsXCIjMDk1MDg1XCIsXCIjMDgzRTY3XCIsXCIjMDUyQzQ4XCIsXCIjMDQyMTM1XCJdLGJhY2tncm91bmRDb2xvcjpcIiNGRkZGRkZcIixsYWJlbENvbG9yOlwiIzAwMDAwMFwiLGZvcm1hdHRlcjpiLmNvbW1hcyxyZXNpemU6ITF9LGQucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3ZhciBhLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHUsdix3LHg7Zm9yKHRoaXMucmFwaGFlbC5jbGVhcigpLGM9dGhpcy5lbC53aWR0aCgpLzIsZD10aGlzLmVsLmhlaWdodCgpLzIsbj0oTWF0aC5taW4oYyxkKS0xMCkvMyxsPTAsdT10aGlzLnZhbHVlcyxvPTAscj11Lmxlbmd0aDtyPm87bysrKW09dVtvXSxsKz1tO2ZvcihpPTUvKDIqbiksYT0xLjk5OTkqTWF0aC5QSS1pKnRoaXMuZGF0YS5sZW5ndGgsZz0wLGY9MCx0aGlzLnNlZ21lbnRzPVtdLHY9dGhpcy52YWx1ZXMsZT1wPTAscz12Lmxlbmd0aDtzPnA7ZT0rK3ApbT12W2VdLGo9ZytpK2EqKG0vbCksaz1uZXcgYi5Eb251dFNlZ21lbnQoYyxkLDIqbixuLGcsaix0aGlzLmRhdGFbZV0uY29sb3J8fHRoaXMub3B0aW9ucy5jb2xvcnNbZiV0aGlzLm9wdGlvbnMuY29sb3JzLmxlbmd0aF0sdGhpcy5vcHRpb25zLmJhY2tncm91bmRDb2xvcixmLHRoaXMucmFwaGFlbCksay5yZW5kZXIoKSx0aGlzLnNlZ21lbnRzLnB1c2goayksay5vbihcImhvdmVyXCIsdGhpcy5zZWxlY3QpLGsub24oXCJjbGlja1wiLHRoaXMuY2xpY2spLGc9aixmKz0xO2Zvcih0aGlzLnRleHQxPXRoaXMuZHJhd0VtcHR5RG9udXRMYWJlbChjLGQtMTAsdGhpcy5vcHRpb25zLmxhYmVsQ29sb3IsMTUsODAwKSx0aGlzLnRleHQyPXRoaXMuZHJhd0VtcHR5RG9udXRMYWJlbChjLGQrMTAsdGhpcy5vcHRpb25zLmxhYmVsQ29sb3IsMTQpLGg9TWF0aC5tYXguYXBwbHkoTWF0aCx0aGlzLnZhbHVlcyksZj0wLHc9dGhpcy52YWx1ZXMseD1bXSxxPTAsdD13Lmxlbmd0aDt0PnE7cSsrKXtpZihtPXdbcV0sbT09PWgpe3RoaXMuc2VsZWN0KGYpO1xuYnJlYWt9eC5wdXNoKGYrPTEpfXJldHVybiB4fSxkLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiB0aGlzLmRhdGE9YSx0aGlzLnZhbHVlcz1mdW5jdGlvbigpe3ZhciBhLGMsZCxlO2ZvcihkPXRoaXMuZGF0YSxlPVtdLGE9MCxjPWQubGVuZ3RoO2M+YTthKyspYj1kW2FdLGUucHVzaChwYXJzZUZsb2F0KGIudmFsdWUpKTtyZXR1cm4gZX0uY2FsbCh0aGlzKSx0aGlzLnJlZHJhdygpfSxkLnByb3RvdHlwZS5jbGljaz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5maXJlKFwiY2xpY2tcIixhLHRoaXMuZGF0YVthXSl9LGQucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGc7Zm9yKGc9dGhpcy5zZWdtZW50cyxlPTAsZj1nLmxlbmd0aDtmPmU7ZSsrKWM9Z1tlXSxjLmRlc2VsZWN0KCk7cmV0dXJuIGQ9dGhpcy5zZWdtZW50c1thXSxkLnNlbGVjdCgpLGI9dGhpcy5kYXRhW2FdLHRoaXMuc2V0TGFiZWxzKGIubGFiZWwsdGhpcy5vcHRpb25zLmZvcm1hdHRlcihiLnZhbHVlLGIpKX0sZC5wcm90b3R5cGUuc2V0TGFiZWxzPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZyxoLGksajtyZXR1cm4gYz0yKihNYXRoLm1pbih0aGlzLmVsLndpZHRoKCkvMix0aGlzLmVsLmhlaWdodCgpLzIpLTEwKS8zLGY9MS44KmMsZT1jLzIsZD1jLzMsdGhpcy50ZXh0MS5hdHRyKHt0ZXh0OmEsdHJhbnNmb3JtOlwiXCJ9KSxnPXRoaXMudGV4dDEuZ2V0QkJveCgpLGg9TWF0aC5taW4oZi9nLndpZHRoLGUvZy5oZWlnaHQpLHRoaXMudGV4dDEuYXR0cih7dHJhbnNmb3JtOlwiU1wiK2grXCIsXCIraCtcIixcIisoZy54K2cud2lkdGgvMikrXCIsXCIrKGcueStnLmhlaWdodCl9KSx0aGlzLnRleHQyLmF0dHIoe3RleHQ6Yix0cmFuc2Zvcm06XCJcIn0pLGk9dGhpcy50ZXh0Mi5nZXRCQm94KCksaj1NYXRoLm1pbihmL2kud2lkdGgsZC9pLmhlaWdodCksdGhpcy50ZXh0Mi5hdHRyKHt0cmFuc2Zvcm06XCJTXCIraitcIixcIitqK1wiLFwiKyhpLngraS53aWR0aC8yKStcIixcIitpLnl9KX0sZC5wcm90b3R5cGUuZHJhd0VtcHR5RG9udXRMYWJlbD1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmO3JldHVybiBmPXRoaXMucmFwaGFlbC50ZXh0KGEsYixcIlwiKS5hdHRyKFwiZm9udC1zaXplXCIsZCkuYXR0cihcImZpbGxcIixjKSxudWxsIT1lJiZmLmF0dHIoXCJmb250LXdlaWdodFwiLGUpLGZ9LGQucHJvdG90eXBlLnJlc2l6ZUhhbmRsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lb3V0SWQ9bnVsbCx0aGlzLnJhcGhhZWwuc2V0U2l6ZSh0aGlzLmVsLndpZHRoKCksdGhpcy5lbC5oZWlnaHQoKSksdGhpcy5yZWRyYXcoKX0sZH0oYi5FdmVudEVtaXR0ZXIpLGIuRG9udXRTZWdtZW50PWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiLGMsZCxlLGcsaCxpLGosayl7dGhpcy5jeD1hLHRoaXMuY3k9Yix0aGlzLmlubmVyPWMsdGhpcy5vdXRlcj1kLHRoaXMuY29sb3I9aCx0aGlzLmJhY2tncm91bmRDb2xvcj1pLHRoaXMuaW5kZXg9aix0aGlzLnJhcGhhZWw9ayx0aGlzLmRlc2VsZWN0PWYodGhpcy5kZXNlbGVjdCx0aGlzKSx0aGlzLnNlbGVjdD1mKHRoaXMuc2VsZWN0LHRoaXMpLHRoaXMuc2luX3AwPU1hdGguc2luKGUpLHRoaXMuY29zX3AwPU1hdGguY29zKGUpLHRoaXMuc2luX3AxPU1hdGguc2luKGcpLHRoaXMuY29zX3AxPU1hdGguY29zKGcpLHRoaXMuaXNfbG9uZz1nLWU+TWF0aC5QST8xOjAsdGhpcy5wYXRoPXRoaXMuY2FsY1NlZ21lbnQodGhpcy5pbm5lciszLHRoaXMuaW5uZXIrdGhpcy5vdXRlci01KSx0aGlzLnNlbGVjdGVkUGF0aD10aGlzLmNhbGNTZWdtZW50KHRoaXMuaW5uZXIrMyx0aGlzLmlubmVyK3RoaXMub3V0ZXIpLHRoaXMuaGlsaWdodD10aGlzLmNhbGNBcmModGhpcy5pbm5lcil9cmV0dXJuIGgoYixhKSxiLnByb3RvdHlwZS5jYWxjQXJjUG9pbnRzPWZ1bmN0aW9uKGEpe3JldHVyblt0aGlzLmN4K2EqdGhpcy5zaW5fcDAsdGhpcy5jeSthKnRoaXMuY29zX3AwLHRoaXMuY3grYSp0aGlzLnNpbl9wMSx0aGlzLmN5K2EqdGhpcy5jb3NfcDFdfSxiLnByb3RvdHlwZS5jYWxjU2VnbWVudD1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGcsaCxpLGosayxsO3JldHVybiBrPXRoaXMuY2FsY0FyY1BvaW50cyhhKSxjPWtbMF0sZT1rWzFdLGQ9a1syXSxmPWtbM10sbD10aGlzLmNhbGNBcmNQb2ludHMoYiksZz1sWzBdLGk9bFsxXSxoPWxbMl0saj1sWzNdLFwiTVwiK2MrXCIsXCIrZSsoXCJBXCIrYStcIixcIithK1wiLDAsXCIrdGhpcy5pc19sb25nK1wiLDAsXCIrZCtcIixcIitmKSsoXCJMXCIraCtcIixcIitqKSsoXCJBXCIrYitcIixcIitiK1wiLDAsXCIrdGhpcy5pc19sb25nK1wiLDEsXCIrZytcIixcIitpKStcIlpcIn0sYi5wcm90b3R5cGUuY2FsY0FyYz1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmO3JldHVybiBmPXRoaXMuY2FsY0FyY1BvaW50cyhhKSxiPWZbMF0sZD1mWzFdLGM9ZlsyXSxlPWZbM10sXCJNXCIrYitcIixcIitkKyhcIkFcIithK1wiLFwiK2ErXCIsMCxcIit0aGlzLmlzX2xvbmcrXCIsMCxcIitjK1wiLFwiK2UpfSxiLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiB0aGlzLmFyYz10aGlzLmRyYXdEb251dEFyYyh0aGlzLmhpbGlnaHQsdGhpcy5jb2xvciksdGhpcy5zZWc9dGhpcy5kcmF3RG9udXRTZWdtZW50KHRoaXMucGF0aCx0aGlzLmNvbG9yLHRoaXMuYmFja2dyb3VuZENvbG9yLGZ1bmN0aW9uKCl7cmV0dXJuIGEuZmlyZShcImhvdmVyXCIsYS5pbmRleCl9LGZ1bmN0aW9uKCl7cmV0dXJuIGEuZmlyZShcImNsaWNrXCIsYS5pbmRleCl9KX0sYi5wcm90b3R5cGUuZHJhd0RvbnV0QXJjPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucmFwaGFlbC5wYXRoKGEpLmF0dHIoe3N0cm9rZTpiLFwic3Ryb2tlLXdpZHRoXCI6MixvcGFjaXR5OjB9KX0sYi5wcm90b3R5cGUuZHJhd0RvbnV0U2VnbWVudD1mdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiB0aGlzLnJhcGhhZWwucGF0aChhKS5hdHRyKHtmaWxsOmIsc3Ryb2tlOmMsXCJzdHJva2Utd2lkdGhcIjozfSkuaG92ZXIoZCkuY2xpY2soZSl9LGIucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGVkP3ZvaWQgMDoodGhpcy5zZWcuYW5pbWF0ZSh7cGF0aDp0aGlzLnNlbGVjdGVkUGF0aH0sMTUwLFwiPD5cIiksdGhpcy5hcmMuYW5pbWF0ZSh7b3BhY2l0eToxfSwxNTAsXCI8PlwiKSx0aGlzLnNlbGVjdGVkPSEwKX0sYi5wcm90b3R5cGUuZGVzZWxlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3RlZD8odGhpcy5zZWcuYW5pbWF0ZSh7cGF0aDp0aGlzLnBhdGh9LDE1MCxcIjw+XCIpLHRoaXMuYXJjLmFuaW1hdGUoe29wYWNpdHk6MH0sMTUwLFwiPD5cIiksdGhpcy5zZWxlY3RlZD0hMSk6dm9pZCAwfSxifShiLkV2ZW50RW1pdHRlcil9KS5jYWxsKHRoaXMpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vdmVuZG9yL2FsbWFzYWVlZDIwMTAvYWRtaW5sdGUvYm93ZXJfY29tcG9uZW50cy9tb3JyaXMuanMvbW9ycmlzLm1pbi5qc1xuLy8gbW9kdWxlIGlkID0gNTJcbi8vIG1vZHVsZSBjaHVua3MgPSAxIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///52\n");
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* jquery.sparkline 2.1.3 - http://omnipotent.net/jquery.sparkline/ \n** Licensed under the New BSD License - see above site for details */\n\n(function(document,Math,undefined){(function(factory){if(true){!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))}else if(jQuery&&!jQuery.fn.sparkline){factory(jQuery)}})(function($){\"use strict\";var UNSET_OPTION={},getDefaults,createClass,SPFormat,clipval,quartile,normalizeValue,normalizeValues,remove,isNumber,all,sum,addCSS,ensureArray,formatNumber,RangeMap,MouseHandler,Tooltip,barHighlightMixin,line,bar,tristate,discrete,bullet,pie,box,defaultStyles,initStyles,VShape,VCanvas_base,VCanvas_canvas,VCanvas_vml,pending,shapeCount=0;getDefaults=function(){return{common:{type:\"line\",lineColor:\"#00f\",fillColor:\"#cdf\",defaultPixelsPerValue:3,width:\"auto\",height:\"auto\",composite:false,tagValuesAttribute:\"values\",tagOptionsPrefix:\"spark\",enableTagOptions:false,enableHighlight:true,highlightLighten:1.4,tooltipSkipNull:true,tooltipPrefix:\"\",tooltipSuffix:\"\",disableHiddenCheck:false,numberFormatter:false,numberDigitGroupCount:3,numberDigitGroupSep:\",\",numberDecimalMark:\".\",disableTooltips:false,disableInteraction:false},line:{spotColor:\"#f80\",highlightSpotColor:\"#5f5\",highlightLineColor:\"#f22\",spotRadius:1.5,minSpotColor:\"#f80\",maxSpotColor:\"#f80\",lineWidth:1,normalRangeMin:undefined,normalRangeMax:undefined,normalRangeColor:\"#ccc\",drawNormalOnTop:false,chartRangeMin:undefined,chartRangeMax:undefined,chartRangeMinX:undefined,chartRangeMaxX:undefined,tooltipFormat:new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{prefix}}{{y}}{{suffix}}')},bar:{barColor:\"#3366cc\",negBarColor:\"#f44\",stackedBarColor:[\"#3366cc\",\"#dc3912\",\"#ff9900\",\"#109618\",\"#66aa00\",\"#dd4477\",\"#0099c6\",\"#990099\"],zeroColor:undefined,nullColor:undefined,zeroAxis:true,barWidth:4,barSpacing:1,chartRangeMax:undefined,chartRangeMin:undefined,chartRangeClip:false,colorMap:undefined,tooltipFormat:new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{prefix}}{{value}}{{suffix}}')},tristate:{barWidth:4,barSpacing:1,posBarColor:\"#6f6\",negBarColor:\"#f44\",zeroBarColor:\"#999\",colorMap:{},tooltipFormat:new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{value:map}}'),tooltipValueLookups:{map:{\"-1\":\"Loss\",0:\"Draw\",1:\"Win\"}}},discrete:{lineHeight:\"auto\",thresholdColor:undefined,thresholdValue:0,chartRangeMax:undefined,chartRangeMin:undefined,chartRangeClip:false,tooltipFormat:new SPFormat(\"{{prefix}}{{value}}{{suffix}}\")},bullet:{targetColor:\"#f33\",targetWidth:3,performanceColor:\"#33f\",rangeColors:[\"#d3dafe\",\"#a8b6ff\",\"#7f94ff\"],base:undefined,tooltipFormat:new SPFormat(\"{{fieldkey:fields}} - {{value}}\"),tooltipValueLookups:{fields:{r:\"Range\",p:\"Performance\",t:\"Target\"}}},pie:{offset:0,sliceColors:[\"#3366cc\",\"#dc3912\",\"#ff9900\",\"#109618\",\"#66aa00\",\"#dd4477\",\"#0099c6\",\"#990099\"],borderWidth:0,borderColor:\"#000\",tooltipFormat:new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{value}} ({{percent.1}}%)')},box:{raw:false,boxLineColor:\"#000\",boxFillColor:\"#cdf\",whiskerColor:\"#000\",outlierLineColor:\"#333\",outlierFillColor:\"#fff\",medianColor:\"#f00\",showOutliers:true,outlierIQR:1.5,spotRadius:1.5,target:undefined,targetColor:\"#4a2\",chartRangeMax:undefined,chartRangeMin:undefined,tooltipFormat:new SPFormat(\"{{field:fields}}: {{value}}\"),tooltipFormatFieldlistKey:\"field\",tooltipValueLookups:{fields:{lq:\"Lower Quartile\",med:\"Median\",uq:\"Upper Quartile\",lo:\"Left Outlier\",ro:\"Right Outlier\",lw:\"Left Whisker\",rw:\"Right Whisker\"}}}}};defaultStyles=\".jqstooltip { \"+\"position: absolute;\"+\"left: 0px;\"+\"top: 0px;\"+\"visibility: hidden;\"+\"background: rgb(0, 0, 0) transparent;\"+\"background-color: rgba(0,0,0,0.6);\"+\"filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);\"+'-ms-filter: \"progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)\";'+\"color: white;\"+\"font: 10px arial, san serif;\"+\"text-align: left;\"+\"white-space: nowrap;\"+\"padding: 5px;\"+\"border: 1px solid white;\"+\"box-sizing: content-box;\"+\"z-index: 10000;\"+\"}\"+\".jqsfield { \"+\"color: white;\"+\"font: 10px arial, san serif;\"+\"text-align: left;\"+\"}\";createClass=function(){var Class,args;Class=function(){this.init.apply(this,arguments)};if(arguments.length>1){if(arguments[0]){Class.prototype=$.extend(new arguments[0],arguments[arguments.length-1]);Class._super=arguments[0].prototype}else{Class.prototype=arguments[arguments.length-1]}if(arguments.length>2){args=Array.prototype.slice.call(arguments,1,-1);args.unshift(Class.prototype);$.extend.apply($,args)}}else{Class.prototype=arguments[0]}Class.prototype.cls=Class;return Class};$.SPFormatClass=SPFormat=createClass({fre:/\\{\\{([\\w.]+?)(:(.+?))?\\}\\}/g,precre:/(\\w+)\\.(\\d+)/,init:function(format,fclass){this.format=format;this.fclass=fclass},render:function(fieldset,lookups,options){var self=this,fields=fieldset,match,token,lookupkey,fieldvalue,prec;return this.format.replace(this.fre,function(){var lookup;token=arguments[1];lookupkey=arguments[3];match=self.precre.exec(token);if(match){prec=match[2];token=match[1]}else{prec=false}fieldvalue=fields[token];if(fieldvalue===undefined){return\"\"}if(lookupkey&&lookups&&lookups[lookupkey]){lookup=lookups[lookupkey];if(lookup.get){return lookups[lookupkey].get(fieldvalue)||fieldvalue}else{return lookups[lookupkey][fieldvalue]||fieldvalue}}if(isNumber(fieldvalue)){if(options.get(\"numberFormatter\")){fieldvalue=options.get(\"numberFormatter\")(fieldvalue)}else{fieldvalue=formatNumber(fieldvalue,prec,options.get(\"numberDigitGroupCount\"),options.get(\"numberDigitGroupSep\"),options.get(\"numberDecimalMark\"))}}return fieldvalue})}});$.spformat=function(format,fclass){return new SPFormat(format,fclass)};clipval=function(val,min,max){if(val<min){return min}if(val>max){return max}return val};quartile=function(values,q){var vl;if(q===2){vl=Math.floor(values.length/2);return values.length%2?values[vl]:(values[vl-1]+values[vl])/2}else{if(values.length%2){vl=(values.length*q+q)/4;return vl%1?(values[Math.floor(vl)]+values[Math.floor(vl)-1])/2:values[vl-1]}else{vl=(values.length*q+2)/4;return vl%1?(values[Math.floor(vl)]+values[Math.floor(vl)-1])/2:values[vl-1]}}};normalizeValue=function(val){var nf;switch(val){case\"undefined\":val=undefined;break;case\"null\":val=null;break;case\"true\":val=true;break;case\"false\":val=false;break;default:nf=parseFloat(val);if(val==nf){val=nf}}return val};normalizeValues=function(vals){var i,result=[];for(i=vals.length;i--;){result[i]=normalizeValue(vals[i])}return result};remove=function(vals,filter){var i,vl,result=[];for(i=0,vl=vals.length;i<vl;i++){if(vals[i]!==filter){result.push(vals[i])}}return result};isNumber=function(num){return!isNaN(parseFloat(num))&&isFinite(num)};formatNumber=function(num,prec,groupsize,groupsep,decsep){var p,i;num=(prec===false?parseFloat(num).toString():num.toFixed(prec)).split(\"\");p=(p=$.inArray(\".\",num))<0?num.length:p;if(p<num.length){num[p]=decsep}for(i=p-groupsize;i>0;i-=groupsize){num.splice(i,0,groupsep)}return num.join(\"\")};all=function(val,arr,ignoreNull){var i;for(i=arr.length;i--;){if(ignoreNull&&arr[i]===null)continue;if(arr[i]!==val){return false}}return true};sum=function(vals){var total=0,i;for(i=vals.length;i--;){total+=typeof vals[i]===\"number\"?vals[i]:0}return total};ensureArray=function(val){return $.isArray(val)?val:[val]};addCSS=function(css){var tag,iefail;if(document.createStyleSheet){try{document.createStyleSheet().cssText=css;return}catch(e){iefail=true}}tag=document.createElement(\"style\");tag.type=\"text/css\";document.getElementsByTagName(\"head\")[0].appendChild(tag);if(iefail){document.styleSheets[document.styleSheets.length-1].cssText=css}else{tag[typeof document.body.style.WebkitAppearance==\"string\"?\"innerText\":\"innerHTML\"]=css}};$.fn.simpledraw=function(width,height,useExisting,interact){var target,mhandler;if(useExisting&&(target=this.data(\"_jqs_vcanvas\"))){return target}if($.fn.sparkline.canvas===false){return false}else if($.fn.sparkline.canvas===undefined){var el=document.createElement(\"canvas\");if(!!(el.getContext&&el.getContext(\"2d\"))){$.fn.sparkline.canvas=function(width,height,target,interact){return new VCanvas_canvas(width,height,target,interact)}}else if(document.namespaces&&!document.namespaces.v){document.namespaces.add(\"v\",\"urn:schemas-microsoft-com:vml\",\"#default#VML\");$.fn.sparkline.canvas=function(width,height,target,interact){return new VCanvas_vml(width,height,target)}}else{$.fn.sparkline.canvas=false;return false}}if(width===undefined){width=$(this).innerWidth()}if(height===undefined){height=$(this).innerHeight()}target=$.fn.sparkline.canvas(width,height,this,interact);mhandler=$(this).data(\"_jqs_mhandler\");if(mhandler){mhandler.registerCanvas(target)}return target};$.fn.cleardraw=function(){var target=this.data(\"_jqs_vcanvas\");if(target){target.reset()}};$.RangeMapClass=RangeMap=createClass({init:function(map){var key,range,rangelist=[];for(key in map){if(map.hasOwnProperty(key)&&typeof key===\"string\"&&key.indexOf(\":\")>-1){range=key.split(\":\");range[0]=range[0].length===0?-Infinity:parseFloat(range[0]);range[1]=range[1].length===0?Infinity:parseFloat(range[1]);range[2]=map[key];rangelist.push(range)}}this.map=map;this.rangelist=rangelist||false},get:function(value){var rangelist=this.rangelist,i,range,result;if((result=this.map[value])!==undefined){return result}if(rangelist){for(i=rangelist.length;i--;){range=rangelist[i];if(range[0]<=value&&range[1]>=value){return range[2]}}}return undefined}});$.range_map=function(map){return new RangeMap(map)};MouseHandler=createClass({init:function(el,options){var $el=$(el);this.$el=$el;this.options=options;this.currentPageX=0;this.currentPageY=0;this.el=el;this.splist=[];this.tooltip=null;this.over=false;this.displayTooltips=!options.get(\"disableTooltips\");this.highlightEnabled=!options.get(\"disableHighlight\")},registerSparkline:function(sp){this.splist.push(sp);if(this.over){this.updateDisplay()}},registerCanvas:function(canvas){var $canvas=$(canvas.canvas);this.canvas=canvas;this.$canvas=$canvas;$canvas.mouseenter($.proxy(this.mouseenter,this));$canvas.mouseleave($.proxy(this.mouseleave,this));$canvas.click($.proxy(this.mouseclick,this))},reset:function(removeTooltip){this.splist=[];if(this.tooltip&&removeTooltip){this.tooltip.remove();this.tooltip=undefined}},mouseclick:function(e){var clickEvent=$.Event(\"sparklineClick\");clickEvent.originalEvent=e;clickEvent.sparklines=this.splist;this.$el.trigger(clickEvent)},mouseenter:function(e){$(document.body).unbind(\"mousemove.jqs\");$(document.body).bind(\"mousemove.jqs\",$.proxy(this.mousemove,this));this.over=true;this.currentPageX=e.pageX;this.currentPageY=e.pageY;this.currentEl=e.target;if(!this.tooltip&&this.displayTooltips){this.tooltip=new Tooltip(this.options);this.tooltip.updatePosition(e.pageX,e.pageY)}this.updateDisplay()},mouseleave:function(){$(document.body).unbind(\"mousemove.jqs\");var splist=this.splist,spcount=splist.length,needsRefresh=false,sp,i;this.over=false;this.currentEl=null;if(this.tooltip){this.tooltip.remove();this.tooltip=null}for(i=0;i<spcount;i++){sp=splist[i];if(sp.clearRegionHighlight()){needsRefresh=true}}if(needsRefresh){this.canvas.render()}},mousemove:function(e){this.currentPageX=e.pageX;this.currentPageY=e.pageY;this.currentEl=e.target;if(this.tooltip){this.tooltip.updatePosition(e.pageX,e.pageY)}this.updateDisplay()},updateDisplay:function(){var splist=this.splist,spcount=splist.length,needsRefresh=false,offset=this.$canvas.offset(),localX=this.currentPageX-offset.left,localY=this.currentPageY-offset.top,tooltiphtml,sp,i,result,changeEvent;if(!this.over){return}for(i=0;i<spcount;i++){sp=splist[i];result=sp.setRegionHighlight(this.currentEl,localX,localY);if(result){needsRefresh=true}}if(needsRefresh){changeEvent=$.Event(\"sparklineRegionChange\");changeEvent.sparklines=this.splist;this.$el.trigger(changeEvent);if(this.tooltip){tooltiphtml=\"\";for(i=0;i<spcount;i++){sp=splist[i];tooltiphtml+=sp.getCurrentRegionTooltip()}this.tooltip.setContent(tooltiphtml)}if(!this.disableHighlight){this.canvas.render()}}if(result===null){this.mouseleave()}}});Tooltip=createClass({sizeStyle:\"position: static !important;\"+\"display: block !important;\"+\"visibility: hidden !important;\"+\"float: left !important;\",init:function(options){var tooltipClassname=options.get(\"tooltipClassname\",\"jqstooltip\"),sizetipStyle=this.sizeStyle,offset;this.container=options.get(\"tooltipContainer\")||document.body;this.tooltipOffsetX=options.get(\"tooltipOffsetX\",10);this.tooltipOffsetY=options.get(\"tooltipOffsetY\",12);$(\"#jqssizetip\").remove();$(\"#jqstooltip\").remove();this.sizetip=$(\"<div/>\",{id:\"jqssizetip\",style:sizetipStyle,\"class\":tooltipClassname});this.tooltip=$(\"<div/>\",{id:\"jqstooltip\",\"class\":tooltipClassname}).appendTo(this.container);offset=this.tooltip.offset();this.offsetLeft=offset.left;this.offsetTop=offset.top;this.hidden=true;$(window).unbind(\"resize.jqs scroll.jqs\");$(window).bind(\"resize.jqs scroll.jqs\",$.proxy(this.updateWindowDims,this));this.updateWindowDims()},updateWindowDims:function(){this.scrollTop=$(window).scrollTop();this.scrollLeft=$(window).scrollLeft();this.scrollRight=this.scrollLeft+$(window).width();this.updatePosition()},getSize:function(content){this.sizetip.html(content).appendTo(this.container);this.width=this.sizetip.width()+1;this.height=this.sizetip.height();this.sizetip.remove()},setContent:function(content){if(!content){this.tooltip.css(\"visibility\",\"hidden\");this.hidden=true;return}this.getSize(content);this.tooltip.html(content).css({width:this.width,height:this.height,visibility:\"visible\"});if(this.hidden){this.hidden=false;this.updatePosition()}},updatePosition:function(x,y){if(x===undefined){if(this.mousex===undefined){return}x=this.mousex-this.offsetLeft;y=this.mousey-this.offsetTop}else{this.mousex=x=x-this.offsetLeft;this.mousey=y=y-this.offsetTop}if(!this.height||!this.width||this.hidden){return}y-=this.height+this.tooltipOffsetY;x+=this.tooltipOffsetX;if(y<this.scrollTop){y=this.scrollTop}if(x<this.scrollLeft){x=this.scrollLeft}else if(x+this.width>this.scrollRight){x=this.scrollRight-this.width}this.tooltip.css({left:x,top:y})},remove:function(){this.tooltip.remove();this.sizetip.remove();this.sizetip=this.tooltip=undefined;$(window).unbind(\"resize.jqs scroll.jqs\")}});initStyles=function(){addCSS(defaultStyles)};$(initStyles);pending=[];$.fn.sparkline=function(userValues,userOptions){return this.each(function(){var options=new $.fn.sparkline.options(this,userOptions),$this=$(this),render,i;render=function(){var values,width,height,tmp,mhandler,sp,vals;if(userValues===\"html\"||userValues===undefined){vals=this.getAttribute(options.get(\"tagValuesAttribute\"));if(vals===undefined||vals===null){vals=$this.html()}values=vals.replace(/(^\\s*<!--)|(-->\\s*$)|\\s+/g,\"\").split(\",\")}else{values=userValues}width=options.get(\"width\")===\"auto\"?values.length*options.get(\"defaultPixelsPerValue\"):options.get(\"width\");if(options.get(\"height\")===\"auto\"){if(!options.get(\"composite\")||!$.data(this,\"_jqs_vcanvas\")){tmp=document.createElement(\"span\");tmp.innerHTML=\"a\";$this.html(tmp);height=$(tmp).innerHeight()||$(tmp).height();$(tmp).remove();tmp=null}}else{height=options.get(\"height\")}if(!options.get(\"disableInteraction\")){mhandler=$.data(this,\"_jqs_mhandler\");if(!mhandler){mhandler=new MouseHandler(this,options);$.data(this,\"_jqs_mhandler\",mhandler)}else if(!options.get(\"composite\")){mhandler.reset()}}else{mhandler=false}if(options.get(\"composite\")&&!$.data(this,\"_jqs_vcanvas\")){if(!$.data(this,\"_jqs_errnotify\")){alert(\"Attempted to attach a composite sparkline to an element with no existing sparkline\");$.data(this,\"_jqs_errnotify\",true)}return}sp=new($.fn.sparkline[options.get(\"type\")])(this,values,options,width,height);sp.render();if(mhandler){mhandler.registerSparkline(sp)}};if($(this).html()&&!options.get(\"disableHiddenCheck\")&&$(this).is(\":hidden\")||!$(this).parents(\"body\").length){if(!options.get(\"composite\")&&$.data(this,\"_jqs_pending\")){for(i=pending.length;i;i--){if(pending[i-1][0]==this){pending.splice(i-1,1)}}}pending.push([this,render]);$.data(this,\"_jqs_pending\",true)}else{render.call(this)}})};$.fn.sparkline.defaults=getDefaults();$.sparkline_display_visible=function(){var el,i,pl;var done=[];for(i=0,pl=pending.length;i<pl;i++){el=pending[i][0];if($(el).is(\":visible\")&&!$(el).parents().is(\":hidden\")){pending[i][1].call(el);$.data(pending[i][0],\"_jqs_pending\",false);done.push(i)}else if(!$(el).closest(\"html\").length&&!$.data(el,\"_jqs_pending\")){$.data(pending[i][0],\"_jqs_pending\",false);done.push(i)}}for(i=done.length;i;i--){pending.splice(done[i-1],1)}};$.fn.sparkline.options=createClass({init:function(tag,userOptions){var extendedOptions,defaults,base,tagOptionType;this.userOptions=userOptions=userOptions||{};this.tag=tag;this.tagValCache={};defaults=$.fn.sparkline.defaults;base=defaults.common;this.tagOptionsPrefix=userOptions.enableTagOptions&&(userOptions.tagOptionsPrefix||base.tagOptionsPrefix);tagOptionType=this.getTagSetting(\"type\");if(tagOptionType===UNSET_OPTION){extendedOptions=defaults[userOptions.type||base.type]}else{extendedOptions=defaults[tagOptionType]}this.mergedOptions=$.extend({},base,extendedOptions,userOptions)},getTagSetting:function(key){var prefix=this.tagOptionsPrefix,val,i,pairs,keyval;if(prefix===false||prefix===undefined){return UNSET_OPTION}if(this.tagValCache.hasOwnProperty(key)){val=this.tagValCache.key}else{val=this.tag.getAttribute(prefix+key);if(val===undefined||val===null){val=UNSET_OPTION}else if(val.substr(0,1)===\"[\"){val=val.substr(1,val.length-2).split(\",\");for(i=val.length;i--;){val[i]=normalizeValue(val[i].replace(/(^\\s*)|(\\s*$)/g,\"\"))}}else if(val.substr(0,1)===\"{\"){pairs=val.substr(1,val.length-2).split(\",\");val={};for(i=pairs.length;i--;){keyval=pairs[i].split(\":\",2);val[keyval[0].replace(/(^\\s*)|(\\s*$)/g,\"\")]=normalizeValue(keyval[1].replace(/(^\\s*)|(\\s*$)/g,\"\"))}}else{val=normalizeValue(val)}this.tagValCache.key=val}return val},get:function(key,defaultval){var tagOption=this.getTagSetting(key),result;if(tagOption!==UNSET_OPTION){return tagOption}return(result=this.mergedOptions[key])===undefined?defaultval:result}});$.fn.sparkline._base=createClass({disabled:false,init:function(el,values,options,width,height){this.el=el;this.$el=$(el);this.values=values;this.options=options;this.width=width;this.height=height;this.currentRegion=undefined},initTarget:function(){var interactive=!this.options.get(\"disableInteraction\");if(!(this.target=this.$el.simpledraw(this.width,this.height,this.options.get(\"composite\"),interactive))){this.disabled=true}else{this.canvasWidth=this.target.pixelWidth;this.canvasHeight=this.target.pixelHeight}},render:function(){if(this.disabled){this.el.innerHTML=\"\";return false}return true},getRegion:function(x,y){},setRegionHighlight:function(el,x,y){var currentRegion=this.currentRegion,highlightEnabled=!this.options.get(\"disableHighlight\"),newRegion;if(x>this.canvasWidth||y>this.canvasHeight||x<0||y<0){return null}newRegion=this.getRegion(el,x,y);if(currentRegion!==newRegion){if(currentRegion!==undefined&&highlightEnabled){this.removeHighlight()}this.currentRegion=newRegion;if(newRegion!==undefined&&highlightEnabled){this.renderHighlight()}return true}return false},clearRegionHighlight:function(){if(this.currentRegion!==undefined){this.removeHighlight();this.currentRegion=undefined;return true}return false},renderHighlight:function(){this.changeHighlight(true)},removeHighlight:function(){this.changeHighlight(false)},changeHighlight:function(highlight){},getCurrentRegionTooltip:function(){var options=this.options,header=\"\",entries=[],fields,formats,formatlen,fclass,text,i,showFields,showFieldsKey,newFields,fv,formatter,format,fieldlen,j;if(this.currentRegion===undefined){return\"\"}fields=this.getCurrentRegionFields();formatter=options.get(\"tooltipFormatter\");if(formatter){return formatter(this,options,fields)}if(options.get(\"tooltipChartTitle\")){header+='<div class=\"jqs jqstitle\">'+options.get(\"tooltipChartTitle\")+\"</div>\\n\"}formats=this.options.get(\"tooltipFormat\");if(!formats){return\"\"}if(!$.isArray(formats)){formats=[formats]}if(!$.isArray(fields)){fields=[fields]}showFields=this.options.get(\"tooltipFormatFieldlist\");showFieldsKey=this.options.get(\"tooltipFormatFieldlistKey\");if(showFields&&showFieldsKey){newFields=[];for(i=fields.length;i--;){fv=fields[i][showFieldsKey];if((j=$.inArray(fv,showFields))!=-1){newFields[j]=fields[i]}}fields=newFields}formatlen=formats.length;fieldlen=fields.length;for(i=0;i<formatlen;i++){format=formats[i];if(typeof format===\"string\"){format=new SPFormat(format)}fclass=format.fclass||\"jqsfield\";for(j=0;j<fieldlen;j++){if(!fields[j].isNull||!options.get(\"tooltipSkipNull\")){$.extend(fields[j],{prefix:options.get(\"tooltipPrefix\"),suffix:options.get(\"tooltipSuffix\")});text=format.render(fields[j],options.get(\"tooltipValueLookups\"),options);entries.push('<div class=\"'+fclass+'\">'+text+\"</div>\")}}}if(entries.length){return header+entries.join(\"\\n\")}return\"\"},getCurrentRegionFields:function(){},calcHighlightColor:function(color,options){var highlightColor=options.get(\"highlightColor\"),lighten=options.get(\"highlightLighten\"),parse,mult,rgbnew,i;if(highlightColor){return highlightColor}if(lighten){parse=/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(color)||/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(color);if(parse){rgbnew=[];mult=color.length===4?16:1;for(i=0;i<3;i++){rgbnew[i]=clipval(Math.round(parseInt(parse[i+1],16)*mult*lighten),0,255)}return\"rgb(\"+rgbnew.join(\",\")+\")\"}}return color}});barHighlightMixin={changeHighlight:function(highlight){var currentRegion=this.currentRegion,target=this.target,shapeids=this.regionShapes[currentRegion],newShapes;if(shapeids){newShapes=this.renderRegion(currentRegion,highlight);if($.isArray(newShapes)||$.isArray(shapeids)){target.replaceWithShapes(shapeids,newShapes);this.regionShapes[currentRegion]=$.map(newShapes,function(newShape){return newShape.id})}else{target.replaceWithShape(shapeids,newShapes);this.regionShapes[currentRegion]=newShapes.id}}},render:function(){var values=this.values,target=this.target,regionShapes=this.regionShapes,shapes,ids,i,j;if(!this.cls._super.render.call(this)){return}for(i=values.length;i--;){shapes=this.renderRegion(i);if(shapes){if($.isArray(shapes)){ids=[];for(j=shapes.length;j--;){shapes[j].append();ids.push(shapes[j].id)}regionShapes[i]=ids}else{shapes.append();regionShapes[i]=shapes.id}}else{regionShapes[i]=null}}target.render()}};$.fn.sparkline.line=line=createClass($.fn.sparkline._base,{type:\"line\",init:function(el,values,options,width,height){line._super.init.call(this,el,values,options,width,height);this.vertices=[];this.regionMap=[];this.xvalues=[];this.yvalues=[];this.yminmax=[];this.hightlightSpotId=null;this.lastShapeId=null;this.initTarget()},getRegion:function(el,x,y){var i,regionMap=this.regionMap;for(i=regionMap.length;i--;){if(regionMap[i]!==null&&x>=regionMap[i][0]&&x<=regionMap[i][1]){return regionMap[i][2]}}return undefined},getCurrentRegionFields:function(){var currentRegion=this.currentRegion;return{isNull:this.yvalues[currentRegion]===null,x:this.xvalues[currentRegion],y:this.yvalues[currentRegion],color:this.options.get(\"lineColor\"),fillColor:this.options.get(\"fillColor\"),offset:currentRegion}},renderHighlight:function(){var currentRegion=this.currentRegion,target=this.target,vertex=this.vertices[currentRegion],options=this.options,spotRadius=options.get(\"spotRadius\"),highlightSpotColor=options.get(\"highlightSpotColor\"),highlightLineColor=options.get(\"highlightLineColor\"),highlightSpot,highlightLine;if(!vertex){return}if(spotRadius&&highlightSpotColor){highlightSpot=target.drawCircle(vertex[0],vertex[1],spotRadius,undefined,highlightSpotColor);this.highlightSpotId=highlightSpot.id;target.insertAfterShape(this.lastShapeId,highlightSpot)}if(highlightLineColor){highlightLine=target.drawLine(vertex[0],this.canvasTop,vertex[0],this.canvasTop+this.canvasHeight,highlightLineColor);this.highlightLineId=highlightLine.id;target.insertAfterShape(this.lastShapeId,highlightLine)}},removeHighlight:function(){var target=this.target;if(this.highlightSpotId){target.removeShapeId(this.highlightSpotId);this.highlightSpotId=null}if(this.highlightLineId){target.removeShapeId(this.highlightLineId);this.highlightLineId=null}},scanValues:function(){var values=this.values,valcount=values.length,xvalues=this.xvalues,yvalues=this.yvalues,yminmax=this.yminmax,i,val,isStr,isArray,sp;for(i=0;i<valcount;i++){val=values[i];isStr=typeof values[i]===\"string\";isArray=typeof values[i]===\"object\"&&values[i]instanceof Array;sp=isStr&&values[i].split(\":\");if(isStr&&sp.length===2){xvalues.push(Number(sp[0]));yvalues.push(Number(sp[1]));yminmax.push(Number(sp[1]))}else if(isArray){xvalues.push(val[0]);yvalues.push(val[1]);yminmax.push(val[1])}else{xvalues.push(i);if(values[i]===null||values[i]===\"null\"){yvalues.push(null)}else{yvalues.push(Number(val));yminmax.push(Number(val))}}}if(this.options.get(\"xvalues\")){xvalues=this.options.get(\"xvalues\")}this.maxy=this.maxyorg=Math.max.apply(Math,yminmax);this.miny=this.minyorg=Math.min.apply(Math,yminmax);this.maxx=Math.max.apply(Math,xvalues);this.minx=Math.min.apply(Math,xvalues);this.xvalues=xvalues;this.yvalues=yvalues;this.yminmax=yminmax},processRangeOptions:function(){var options=this.options,normalRangeMin=options.get(\"normalRangeMin\"),normalRangeMax=options.get(\"normalRangeMax\");if(normalRangeMin!==undefined){if(normalRangeMin<this.miny){this.miny=normalRangeMin}if(normalRangeMax>this.maxy){this.maxy=normalRangeMax}}if(options.get(\"chartRangeMin\")!==undefined&&(options.get(\"chartRangeClip\")||options.get(\"chartRangeMin\")<this.miny)){this.miny=options.get(\"chartRangeMin\")}if(options.get(\"chartRangeMax\")!==undefined&&(options.get(\"chartRangeClip\")||options.get(\"chartRangeMax\")>this.maxy)){this.maxy=options.get(\"chartRangeMax\")}if(options.get(\"chartRangeMinX\")!==undefined&&(options.get(\"chartRangeClipX\")||options.get(\"chartRangeMinX\")<this.minx)){this.minx=options.get(\"chartRangeMinX\")}if(options.get(\"chartRangeMaxX\")!==undefined&&(options.get(\"chartRangeClipX\")||options.get(\"chartRangeMaxX\")>this.maxx)){this.maxx=options.get(\"chartRangeMaxX\")}},drawNormalRange:function(canvasLeft,canvasTop,canvasHeight,canvasWidth,rangey){var normalRangeMin=this.options.get(\"normalRangeMin\"),normalRangeMax=this.options.get(\"normalRangeMax\"),ytop=canvasTop+Math.round(canvasHeight-canvasHeight*((normalRangeMax-this.miny)/rangey)),height=Math.round(canvasHeight*(normalRangeMax-normalRangeMin)/rangey);this.target.drawRect(canvasLeft,ytop,canvasWidth,height,undefined,this.options.get(\"normalRangeColor\")).append()},render:function(){var options=this.options,target=this.target,canvasWidth=this.canvasWidth,canvasHeight=this.canvasHeight,vertices=this.vertices,spotRadius=options.get(\"spotRadius\"),regionMap=this.regionMap,rangex,rangey,yvallast,canvasTop,canvasLeft,vertex,path,paths,x,y,xnext,xpos,xposnext,last,next,yvalcount,lineShapes,fillShapes,plen,valueSpots,hlSpotsEnabled,color,xvalues,yvalues,i;if(!line._super.render.call(this)){return}this.scanValues();this.processRangeOptions();xvalues=this.xvalues;yvalues=this.yvalues;if(!this.yminmax.length||this.yvalues.length<2){return}canvasTop=canvasLeft=0;rangex=this.maxx-this.minx===0?1:this.maxx-this.minx;rangey=this.maxy-this.miny===0?1:this.maxy-this.miny;yvallast=this.yvalues.length-1;if(spotRadius&&(canvasWidth<spotRadius*4||canvasHeight<spotRadius*4)){spotRadius=0}if(spotRadius){hlSpotsEnabled=options.get(\"highlightSpotColor\")&&!options.get(\"disableInteraction\");if(hlSpotsEnabled||options.get(\"minSpotColor\")||options.get(\"spotColor\")&&yvalues[yvallast]===this.miny){canvasHeight-=Math.ceil(spotRadius)}if(hlSpotsEnabled||options.get(\"maxSpotColor\")||options.get(\"spotColor\")&&yvalues[yvallast]===this.maxy){canvasHeight-=Math.ceil(spotRadius);canvasTop+=Math.ceil(spotRadius)}if(hlSpotsEnabled||(options.get(\"minSpotColor\")||options.get(\"maxSpotColor\"))&&(yvalues[0]===this.miny||yvalues[0]===this.maxy)){canvasLeft+=Math.ceil(spotRadius);canvasWidth-=Math.ceil(spotRadius)}if(hlSpotsEnabled||options.get(\"spotColor\")||(options.get(\"minSpotColor\")||options.get(\"maxSpotColor\")&&(yvalues[yvallast]===this.miny||yvalues[yvallast]===this.maxy))){canvasWidth-=Math.ceil(spotRadius)}}canvasHeight--;if(options.get(\"normalRangeMin\")!==undefined&&!options.get(\"drawNormalOnTop\")){this.drawNormalRange(canvasLeft,canvasTop,canvasHeight,canvasWidth,rangey)}path=[];paths=[path];last=next=null;yvalcount=yvalues.length;for(i=0;i<yvalcount;i++){x=xvalues[i];xnext=xvalues[i+1];y=yvalues[i];xpos=canvasLeft+Math.round((x-this.minx)*(canvasWidth/rangex));xposnext=i<yvalcount-1?canvasLeft+Math.round((xnext-this.minx)*(canvasWidth/rangex)):canvasWidth;next=xpos+(xposnext-xpos)/2;regionMap[i]=[last||0,next,i];last=next;if(y===null){if(i){if(yvalues[i-1]!==null){path=[];paths.push(path)}vertices.push(null)}}else{if(y<this.miny){y=this.miny}if(y>this.maxy){y=this.maxy}if(!path.length){path.push([xpos,canvasTop+canvasHeight])}vertex=[xpos,canvasTop+Math.round(canvasHeight-canvasHeight*((y-this.miny)/rangey))];path.push(vertex);vertices.push(vertex)}}lineShapes=[];fillShapes=[];plen=paths.length;for(i=0;i<plen;i++){path=paths[i];if(path.length){if(options.get(\"fillColor\")){path.push([path[path.length-1][0],canvasTop+canvasHeight]);fillShapes.push(path.slice(0));path.pop()}if(path.length>2){path[0]=[path[0][0],path[1][1]]}lineShapes.push(path)}}plen=fillShapes.length;for(i=0;i<plen;i++){target.drawShape(fillShapes[i],options.get(\"fillColor\"),options.get(\"fillColor\")).append()}if(options.get(\"normalRangeMin\")!==undefined&&options.get(\"drawNormalOnTop\")){this.drawNormalRange(canvasLeft,canvasTop,canvasHeight,canvasWidth,rangey)}plen=lineShapes.length;for(i=0;i<plen;i++){target.drawShape(lineShapes[i],options.get(\"lineColor\"),undefined,options.get(\"lineWidth\")).append()}if(spotRadius&&options.get(\"valueSpots\")){valueSpots=options.get(\"valueSpots\");if(valueSpots.get===undefined){valueSpots=new RangeMap(valueSpots)}for(i=0;i<yvalcount;i++){color=valueSpots.get(yvalues[i]);if(color){target.drawCircle(canvasLeft+Math.round((xvalues[i]-this.minx)*(canvasWidth/rangex)),canvasTop+Math.round(canvasHeight-canvasHeight*((yvalues[i]-this.miny)/rangey)),spotRadius,undefined,color).append()}}}if(spotRadius&&options.get(\"spotColor\")&&yvalues[yvallast]!==null){target.drawCircle(canvasLeft+Math.round((xvalues[xvalues.length-1]-this.minx)*(canvasWidth/rangex)),canvasTop+Math.round(canvasHeight-canvasHeight*((yvalues[yvallast]-this.miny)/rangey)),spotRadius,undefined,options.get(\"spotColor\")).append()}if(this.maxy!==this.minyorg){if(spotRadius&&options.get(\"minSpotColor\")){x=xvalues[$.inArray(this.minyorg,yvalues)];target.drawCircle(canvasLeft+Math.round((x-this.minx)*(canvasWidth/rangex)),canvasTop+Math.round(canvasHeight-canvasHeight*((this.minyorg-this.miny)/rangey)),spotRadius,undefined,options.get(\"minSpotColor\")).append()}if(spotRadius&&options.get(\"maxSpotColor\")){x=xvalues[$.inArray(this.maxyorg,yvalues)];target.drawCircle(canvasLeft+Math.round((x-this.minx)*(canvasWidth/rangex)),canvasTop+Math.round(canvasHeight-canvasHeight*((this.maxyorg-this.miny)/rangey)),spotRadius,undefined,options.get(\"maxSpotColor\")).append()}}this.lastShapeId=target.getLastShapeId();this.canvasTop=canvasTop;target.render()}});$.fn.sparkline.bar=bar=createClass($.fn.sparkline._base,barHighlightMixin,{type:\"bar\",init:function(el,values,options,width,height){var barWidth=parseInt(options.get(\"barWidth\"),10),barSpacing=parseInt(options.get(\"barSpacing\"),10),chartRangeMin=options.get(\"chartRangeMin\"),chartRangeMax=options.get(\"chartRangeMax\"),chartRangeClip=options.get(\"chartRangeClip\"),stackMin=Infinity,stackMax=-Infinity,isStackString,groupMin,groupMax,stackRanges,numValues,i,vlen,range,zeroAxis,xaxisOffset,min,max,clipMin,clipMax,stacked,vlist,j,slen,svals,val,yoffset,yMaxCalc,canvasHeightEf;bar._super.init.call(this,el,values,options,width,height);for(i=0,vlen=values.length;i<vlen;i++){val=values[i];isStackString=typeof val===\"string\"&&val.indexOf(\":\")>-1;if(isStackString||$.isArray(val)){stacked=true;if(isStackString){val=values[i]=normalizeValues(val.split(\":\"));\n\n}val=remove(val,null);groupMin=Math.min.apply(Math,val);groupMax=Math.max.apply(Math,val);if(groupMin<stackMin){stackMin=groupMin}if(groupMax>stackMax){stackMax=groupMax}}}this.stacked=stacked;this.regionShapes={};this.barWidth=barWidth;this.barSpacing=barSpacing;this.totalBarWidth=barWidth+barSpacing;this.width=width=values.length*barWidth+(values.length-1)*barSpacing;this.initTarget();if(chartRangeClip){clipMin=chartRangeMin===undefined?-Infinity:chartRangeMin;clipMax=chartRangeMax===undefined?Infinity:chartRangeMax}numValues=[];stackRanges=stacked?[]:numValues;var stackTotals=[];var stackRangesNeg=[];for(i=0,vlen=values.length;i<vlen;i++){if(stacked){vlist=values[i];values[i]=svals=[];stackTotals[i]=0;stackRanges[i]=stackRangesNeg[i]=0;for(j=0,slen=vlist.length;j<slen;j++){val=svals[j]=chartRangeClip?clipval(vlist[j],clipMin,clipMax):vlist[j];if(val!==null){if(val>0){stackTotals[i]+=val}if(stackMin<0&&stackMax>0){if(val<0){stackRangesNeg[i]+=Math.abs(val)}else{stackRanges[i]+=val}}else{stackRanges[i]+=Math.abs(val-(val<0?stackMax:stackMin))}numValues.push(val)}}}else{val=chartRangeClip?clipval(values[i],clipMin,clipMax):values[i];val=values[i]=normalizeValue(val);if(val!==null){numValues.push(val)}}}this.max=max=Math.max.apply(Math,numValues);this.min=min=Math.min.apply(Math,numValues);this.stackMax=stackMax=stacked?Math.max.apply(Math,stackTotals):max;this.stackMin=stackMin=stacked?Math.min.apply(Math,numValues):min;if(options.get(\"chartRangeMin\")!==undefined&&(options.get(\"chartRangeClip\")||options.get(\"chartRangeMin\")<min)){min=options.get(\"chartRangeMin\")}if(options.get(\"chartRangeMax\")!==undefined&&(options.get(\"chartRangeClip\")||options.get(\"chartRangeMax\")>max)){max=options.get(\"chartRangeMax\")}this.zeroAxis=zeroAxis=options.get(\"zeroAxis\",true);if(min<=0&&max>=0&&zeroAxis){xaxisOffset=0}else if(zeroAxis==false){xaxisOffset=min}else if(min>0){xaxisOffset=min}else{xaxisOffset=max}this.xaxisOffset=xaxisOffset;range=stacked?Math.max.apply(Math,stackRanges)+Math.max.apply(Math,stackRangesNeg):max-min;this.canvasHeightEf=zeroAxis&&min<0?this.canvasHeight-2:this.canvasHeight-1;if(min<xaxisOffset){yMaxCalc=stacked&&max>=0?stackMax:max;yoffset=(yMaxCalc-xaxisOffset)/range*this.canvasHeight;if(yoffset!==Math.ceil(yoffset)){this.canvasHeightEf-=2;yoffset=Math.ceil(yoffset)}}else{yoffset=this.canvasHeight}this.yoffset=yoffset;if($.isArray(options.get(\"colorMap\"))){this.colorMapByIndex=options.get(\"colorMap\");this.colorMapByValue=null}else{this.colorMapByIndex=null;this.colorMapByValue=options.get(\"colorMap\");if(this.colorMapByValue&&this.colorMapByValue.get===undefined){this.colorMapByValue=new RangeMap(this.colorMapByValue)}}this.range=range},getRegion:function(el,x,y){var result=Math.floor(x/this.totalBarWidth);return result<0||result>=this.values.length?undefined:result},getCurrentRegionFields:function(){var currentRegion=this.currentRegion,values=ensureArray(this.values[currentRegion]),result=[],value,i;for(i=values.length;i--;){value=values[i];result.push({isNull:value===null,value:value,color:this.calcColor(i,value,currentRegion),offset:currentRegion})}return result},calcColor:function(stacknum,value,valuenum){var colorMapByIndex=this.colorMapByIndex,colorMapByValue=this.colorMapByValue,options=this.options,color,newColor;if(this.stacked){color=options.get(\"stackedBarColor\")}else{color=value<0?options.get(\"negBarColor\"):options.get(\"barColor\")}if(value===0&&options.get(\"zeroColor\")!==undefined){color=options.get(\"zeroColor\")}if(colorMapByValue&&(newColor=colorMapByValue.get(value))){color=newColor}else if(colorMapByIndex&&colorMapByIndex.length>valuenum){color=colorMapByIndex[valuenum]}return $.isArray(color)?color[stacknum%color.length]:color},renderRegion:function(valuenum,highlight){var vals=this.values[valuenum],options=this.options,xaxisOffset=this.xaxisOffset,result=[],range=this.range,stacked=this.stacked,target=this.target,x=valuenum*this.totalBarWidth,canvasHeightEf=this.canvasHeightEf,yoffset=this.yoffset,y,height,color,isNull,yoffsetNeg,i,valcount,val,minPlotted,allMin;vals=$.isArray(vals)?vals:[vals];valcount=vals.length;val=vals[0];isNull=all(null,vals);allMin=all(xaxisOffset,vals,true);if(isNull){if(options.get(\"nullColor\")){color=highlight?options.get(\"nullColor\"):this.calcHighlightColor(options.get(\"nullColor\"),options);y=yoffset>0?yoffset-1:yoffset;return target.drawRect(x,y,this.barWidth-1,0,color,color)}else{return undefined}}yoffsetNeg=yoffset;for(i=0;i<valcount;i++){val=vals[i];if(stacked&&val===xaxisOffset){if(!allMin||minPlotted){continue}minPlotted=true}if(range>0){height=Math.floor(canvasHeightEf*(Math.abs(val-xaxisOffset)/range))+1}else{height=1}if(val<xaxisOffset||val===xaxisOffset&&yoffset===0){y=yoffsetNeg;yoffsetNeg+=height}else{y=yoffset-height;yoffset-=height}color=this.calcColor(i,val,valuenum);if(highlight){color=this.calcHighlightColor(color,options)}result.push(target.drawRect(x,y,this.barWidth-1,height-1,color,color))}if(result.length===1){return result[0]}return result}});$.fn.sparkline.tristate=tristate=createClass($.fn.sparkline._base,barHighlightMixin,{type:\"tristate\",init:function(el,values,options,width,height){var barWidth=parseInt(options.get(\"barWidth\"),10),barSpacing=parseInt(options.get(\"barSpacing\"),10);tristate._super.init.call(this,el,values,options,width,height);this.regionShapes={};this.barWidth=barWidth;this.barSpacing=barSpacing;this.totalBarWidth=barWidth+barSpacing;this.values=$.map(values,Number);this.width=width=values.length*barWidth+(values.length-1)*barSpacing;if($.isArray(options.get(\"colorMap\"))){this.colorMapByIndex=options.get(\"colorMap\");this.colorMapByValue=null}else{this.colorMapByIndex=null;this.colorMapByValue=options.get(\"colorMap\");if(this.colorMapByValue&&this.colorMapByValue.get===undefined){this.colorMapByValue=new RangeMap(this.colorMapByValue)}}this.initTarget()},getRegion:function(el,x,y){return Math.floor(x/this.totalBarWidth)},getCurrentRegionFields:function(){var currentRegion=this.currentRegion;return{isNull:this.values[currentRegion]===undefined,value:this.values[currentRegion],color:this.calcColor(this.values[currentRegion],currentRegion),offset:currentRegion}},calcColor:function(value,valuenum){var values=this.values,options=this.options,colorMapByIndex=this.colorMapByIndex,colorMapByValue=this.colorMapByValue,color,newColor;if(colorMapByValue&&(newColor=colorMapByValue.get(value))){color=newColor}else if(colorMapByIndex&&colorMapByIndex.length>valuenum){color=colorMapByIndex[valuenum]}else if(values[valuenum]<0){color=options.get(\"negBarColor\")}else if(values[valuenum]>0){color=options.get(\"posBarColor\")}else{color=options.get(\"zeroBarColor\")}return color},renderRegion:function(valuenum,highlight){var values=this.values,options=this.options,target=this.target,canvasHeight,height,halfHeight,x,y,color;canvasHeight=target.pixelHeight;halfHeight=Math.round(canvasHeight/2);x=valuenum*this.totalBarWidth;if(values[valuenum]<0){y=halfHeight;height=halfHeight-1}else if(values[valuenum]>0){y=0;height=halfHeight-1}else{y=halfHeight-1;height=2}color=this.calcColor(values[valuenum],valuenum);if(color===null){return}if(highlight){color=this.calcHighlightColor(color,options)}return target.drawRect(x,y,this.barWidth-1,height-1,color,color)}});$.fn.sparkline.discrete=discrete=createClass($.fn.sparkline._base,barHighlightMixin,{type:\"discrete\",init:function(el,values,options,width,height){discrete._super.init.call(this,el,values,options,width,height);this.regionShapes={};this.values=values=$.map(values,Number);this.min=Math.min.apply(Math,values);this.max=Math.max.apply(Math,values);this.range=this.max-this.min;this.width=width=options.get(\"width\")===\"auto\"?values.length*2:this.width;this.interval=Math.floor(width/values.length);this.itemWidth=width/values.length;if(options.get(\"chartRangeMin\")!==undefined&&(options.get(\"chartRangeClip\")||options.get(\"chartRangeMin\")<this.min)){this.min=options.get(\"chartRangeMin\")}if(options.get(\"chartRangeMax\")!==undefined&&(options.get(\"chartRangeClip\")||options.get(\"chartRangeMax\")>this.max)){this.max=options.get(\"chartRangeMax\")}this.initTarget();if(this.target){this.lineHeight=options.get(\"lineHeight\")===\"auto\"?Math.round(this.canvasHeight*.3):options.get(\"lineHeight\")}},getRegion:function(el,x,y){return Math.floor(x/this.itemWidth)},getCurrentRegionFields:function(){var currentRegion=this.currentRegion;return{isNull:this.values[currentRegion]===undefined,value:this.values[currentRegion],offset:currentRegion}},renderRegion:function(valuenum,highlight){var values=this.values,options=this.options,min=this.min,max=this.max,range=this.range,interval=this.interval,target=this.target,canvasHeight=this.canvasHeight,lineHeight=this.lineHeight,pheight=canvasHeight-lineHeight,ytop,val,color,x;val=clipval(values[valuenum],min,max);x=valuenum*interval;ytop=Math.round(pheight-pheight*((val-min)/range));color=options.get(\"thresholdColor\")&&val<options.get(\"thresholdValue\")?options.get(\"thresholdColor\"):options.get(\"lineColor\");if(highlight){color=this.calcHighlightColor(color,options)}return target.drawLine(x,ytop,x,ytop+lineHeight,color)}});$.fn.sparkline.bullet=bullet=createClass($.fn.sparkline._base,{type:\"bullet\",init:function(el,values,options,width,height){var min,max,vals;bullet._super.init.call(this,el,values,options,width,height);this.values=values=normalizeValues(values);vals=values.slice();vals[0]=vals[0]===null?vals[2]:vals[0];vals[1]=values[1]===null?vals[2]:vals[1];min=Math.min.apply(Math,values);max=Math.max.apply(Math,values);if(options.get(\"base\")===undefined){min=min<0?min:0}else{min=options.get(\"base\")}this.min=min;this.max=max;this.range=max-min;this.shapes={};this.valueShapes={};this.regiondata={};this.width=width=options.get(\"width\")===\"auto\"?\"4.0em\":width;this.target=this.$el.simpledraw(width,height,options.get(\"composite\"));if(!values.length){this.disabled=true}this.initTarget()},getRegion:function(el,x,y){var shapeid=this.target.getShapeAt(el,x,y);return shapeid!==undefined&&this.shapes[shapeid]!==undefined?this.shapes[shapeid]:undefined},getCurrentRegionFields:function(){var currentRegion=this.currentRegion;return{fieldkey:currentRegion.substr(0,1),value:this.values[currentRegion.substr(1)],region:currentRegion}},changeHighlight:function(highlight){var currentRegion=this.currentRegion,shapeid=this.valueShapes[currentRegion],shape;delete this.shapes[shapeid];switch(currentRegion.substr(0,1)){case\"r\":shape=this.renderRange(currentRegion.substr(1),highlight);break;case\"p\":shape=this.renderPerformance(highlight);break;case\"t\":shape=this.renderTarget(highlight);break}this.valueShapes[currentRegion]=shape.id;this.shapes[shape.id]=currentRegion;this.target.replaceWithShape(shapeid,shape)},renderRange:function(rn,highlight){var rangeval=this.values[rn],rangewidth=Math.round(this.canvasWidth*((rangeval-this.min)/this.range)),color=this.options.get(\"rangeColors\")[rn-2];if(highlight){color=this.calcHighlightColor(color,this.options)}return this.target.drawRect(0,0,rangewidth-1,this.canvasHeight-1,color,color)},renderPerformance:function(highlight){var perfval=this.values[1],perfwidth=Math.round(this.canvasWidth*((perfval-this.min)/this.range)),color=this.options.get(\"performanceColor\");if(highlight){color=this.calcHighlightColor(color,this.options)}return this.target.drawRect(0,Math.round(this.canvasHeight*.3),perfwidth-1,Math.round(this.canvasHeight*.4)-1,color,color)},renderTarget:function(highlight){var targetval=this.values[0],x=Math.round(this.canvasWidth*((targetval-this.min)/this.range)-this.options.get(\"targetWidth\")/2),targettop=Math.round(this.canvasHeight*.1),targetheight=this.canvasHeight-targettop*2,color=this.options.get(\"targetColor\");if(highlight){color=this.calcHighlightColor(color,this.options)}return this.target.drawRect(x,targettop,this.options.get(\"targetWidth\")-1,targetheight-1,color,color)},render:function(){var vlen=this.values.length,target=this.target,i,shape;if(!bullet._super.render.call(this)){return}for(i=2;i<vlen;i++){shape=this.renderRange(i).append();this.shapes[shape.id]=\"r\"+i;this.valueShapes[\"r\"+i]=shape.id}if(this.values[1]!==null){shape=this.renderPerformance().append();this.shapes[shape.id]=\"p1\";this.valueShapes.p1=shape.id}if(this.values[0]!==null){shape=this.renderTarget().append();this.shapes[shape.id]=\"t0\";this.valueShapes.t0=shape.id}target.render()}});$.fn.sparkline.pie=pie=createClass($.fn.sparkline._base,{type:\"pie\",init:function(el,values,options,width,height){var total=0,i;pie._super.init.call(this,el,values,options,width,height);this.shapes={};this.valueShapes={};this.values=values=$.map(values,Number);if(options.get(\"width\")===\"auto\"){this.width=this.height}if(values.length>0){for(i=values.length;i--;){total+=values[i]}}this.total=total;this.initTarget();this.radius=Math.floor(Math.min(this.canvasWidth,this.canvasHeight)/2)},getRegion:function(el,x,y){var shapeid=this.target.getShapeAt(el,x,y);return shapeid!==undefined&&this.shapes[shapeid]!==undefined?this.shapes[shapeid]:undefined},getCurrentRegionFields:function(){var currentRegion=this.currentRegion;return{isNull:this.values[currentRegion]===undefined,value:this.values[currentRegion],percent:this.values[currentRegion]/this.total*100,color:this.options.get(\"sliceColors\")[currentRegion%this.options.get(\"sliceColors\").length],offset:currentRegion}},changeHighlight:function(highlight){var currentRegion=this.currentRegion,newslice=this.renderSlice(currentRegion,highlight),shapeid=this.valueShapes[currentRegion];delete this.shapes[shapeid];this.target.replaceWithShape(shapeid,newslice);this.valueShapes[currentRegion]=newslice.id;this.shapes[newslice.id]=currentRegion},renderSlice:function(valuenum,highlight){var target=this.target,options=this.options,radius=this.radius,borderWidth=options.get(\"borderWidth\"),offset=options.get(\"offset\"),circle=2*Math.PI,values=this.values,total=this.total,next=offset?2*Math.PI*(offset/360):0,start,end,i,vlen,color;vlen=values.length;for(i=0;i<vlen;i++){start=next;end=next;if(total>0){end=next+circle*(values[i]/total)}if(valuenum===i){color=options.get(\"sliceColors\")[i%options.get(\"sliceColors\").length];if(highlight){color=this.calcHighlightColor(color,options)}return target.drawPieSlice(radius,radius,radius-borderWidth,start,end,undefined,color)}next=end}},render:function(){var target=this.target,values=this.values,options=this.options,radius=this.radius,borderWidth=options.get(\"borderWidth\"),shape,i;if(!pie._super.render.call(this)){return}if(borderWidth){target.drawCircle(radius,radius,Math.floor(radius-borderWidth/2),options.get(\"borderColor\"),undefined,borderWidth).append()}for(i=values.length;i--;){if(values[i]){shape=this.renderSlice(i).append();this.valueShapes[i]=shape.id;this.shapes[shape.id]=i}}target.render()}});$.fn.sparkline.box=box=createClass($.fn.sparkline._base,{type:\"box\",init:function(el,values,options,width,height){box._super.init.call(this,el,values,options,width,height);this.values=$.map(values,Number);this.width=options.get(\"width\")===\"auto\"?\"4.0em\":width;this.initTarget();if(!this.values.length){this.disabled=1}},getRegion:function(){return 1},getCurrentRegionFields:function(){var result=[{field:\"lq\",value:this.quartiles[0]},{field:\"med\",value:this.quartiles[1]},{field:\"uq\",value:this.quartiles[2]}];if(this.loutlier!==undefined){result.push({field:\"lo\",value:this.loutlier})}if(this.routlier!==undefined){result.push({field:\"ro\",value:this.routlier})}if(this.lwhisker!==undefined){result.push({field:\"lw\",value:this.lwhisker})}if(this.rwhisker!==undefined){result.push({field:\"rw\",value:this.rwhisker})}return result},render:function(){var target=this.target,values=this.values,vlen=values.length,options=this.options,canvasWidth=this.canvasWidth,canvasHeight=this.canvasHeight,minValue=options.get(\"chartRangeMin\")===undefined?Math.min.apply(Math,values):options.get(\"chartRangeMin\"),maxValue=options.get(\"chartRangeMax\")===undefined?Math.max.apply(Math,values):options.get(\"chartRangeMax\"),canvasLeft=0,lwhisker,loutlier,iqr,q1,q2,q3,rwhisker,routlier,i,size,unitSize;if(!box._super.render.call(this)){return}if(options.get(\"raw\")){if(options.get(\"showOutliers\")&&values.length>5){loutlier=values[0];lwhisker=values[1];q1=values[2];q2=values[3];q3=values[4];rwhisker=values[5];routlier=values[6]}else{lwhisker=values[0];q1=values[1];q2=values[2];q3=values[3];rwhisker=values[4]}}else{values.sort(function(a,b){return a-b});q1=quartile(values,1);q2=quartile(values,2);q3=quartile(values,3);iqr=q3-q1;if(options.get(\"showOutliers\")){lwhisker=rwhisker=undefined;for(i=0;i<vlen;i++){if(lwhisker===undefined&&values[i]>q1-iqr*options.get(\"outlierIQR\")){lwhisker=values[i]}if(values[i]<q3+iqr*options.get(\"outlierIQR\")){rwhisker=values[i]}}loutlier=values[0];routlier=values[vlen-1]}else{lwhisker=values[0];rwhisker=values[vlen-1]}}this.quartiles=[q1,q2,q3];this.lwhisker=lwhisker;this.rwhisker=rwhisker;this.loutlier=loutlier;this.routlier=routlier;unitSize=canvasWidth/(maxValue-minValue+1);if(options.get(\"showOutliers\")){canvasLeft=Math.ceil(options.get(\"spotRadius\"));canvasWidth-=2*Math.ceil(options.get(\"spotRadius\"));unitSize=canvasWidth/(maxValue-minValue+1);if(loutlier<lwhisker){target.drawCircle((loutlier-minValue)*unitSize+canvasLeft,canvasHeight/2,options.get(\"spotRadius\"),options.get(\"outlierLineColor\"),options.get(\"outlierFillColor\")).append()}if(routlier>rwhisker){target.drawCircle((routlier-minValue)*unitSize+canvasLeft,canvasHeight/2,options.get(\"spotRadius\"),options.get(\"outlierLineColor\"),options.get(\"outlierFillColor\")).append()}}target.drawRect(Math.round((q1-minValue)*unitSize+canvasLeft),Math.round(canvasHeight*.1),Math.round((q3-q1)*unitSize),Math.round(canvasHeight*.8),options.get(\"boxLineColor\"),options.get(\"boxFillColor\")).append();target.drawLine(Math.round((lwhisker-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/2),Math.round((q1-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/2),options.get(\"lineColor\")).append();target.drawLine(Math.round((lwhisker-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/4),Math.round((lwhisker-minValue)*unitSize+canvasLeft),Math.round(canvasHeight-canvasHeight/4),options.get(\"whiskerColor\")).append();target.drawLine(Math.round((rwhisker-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/2),Math.round((q3-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/2),options.get(\"lineColor\")).append();target.drawLine(Math.round((rwhisker-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/4),Math.round((rwhisker-minValue)*unitSize+canvasLeft),Math.round(canvasHeight-canvasHeight/4),options.get(\"whiskerColor\")).append();target.drawLine(Math.round((q2-minValue)*unitSize+canvasLeft),Math.round(canvasHeight*.1),Math.round((q2-minValue)*unitSize+canvasLeft),Math.round(canvasHeight*.9),options.get(\"medianColor\")).append();if(options.get(\"target\")){size=Math.ceil(options.get(\"spotRadius\"));target.drawLine(Math.round((options.get(\"target\")-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/2-size),Math.round((options.get(\"target\")-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/2+size),options.get(\"targetColor\")).append();target.drawLine(Math.round((options.get(\"target\")-minValue)*unitSize+canvasLeft-size),Math.round(canvasHeight/2),Math.round((options.get(\"target\")-minValue)*unitSize+canvasLeft+size),Math.round(canvasHeight/2),options.get(\"targetColor\")).append()}target.render()}});VShape=createClass({init:function(target,id,type,args){this.target=target;this.id=id;this.type=type;this.args=args},append:function(){this.target.appendShape(this);return this}});VCanvas_base=createClass({_pxregex:/(\\d+)(px)?\\s*$/i,init:function(width,height,target){if(!width){return}this.width=width;this.height=height;this.target=target;this.lastShapeId=null;if(target[0]){target=target[0]}$.data(target,\"_jqs_vcanvas\",this)},drawLine:function(x1,y1,x2,y2,lineColor,lineWidth){return this.drawShape([[x1,y1],[x2,y2]],lineColor,lineWidth)},drawShape:function(path,lineColor,fillColor,lineWidth){return this._genShape(\"Shape\",[path,lineColor,fillColor,lineWidth])},drawCircle:function(x,y,radius,lineColor,fillColor,lineWidth){return this._genShape(\"Circle\",[x,y,radius,lineColor,fillColor,lineWidth])},drawPieSlice:function(x,y,radius,startAngle,endAngle,lineColor,fillColor){return this._genShape(\"PieSlice\",[x,y,radius,startAngle,endAngle,lineColor,fillColor])},drawRect:function(x,y,width,height,lineColor,fillColor){return this._genShape(\"Rect\",[x,y,width,height,lineColor,fillColor])},getElement:function(){return this.canvas},getLastShapeId:function(){return this.lastShapeId},reset:function(){alert(\"reset not implemented\")},_insert:function(el,target){$(target).html(el)},_calculatePixelDims:function(width,height,canvas){var match;match=this._pxregex.exec(height);if(match){this.pixelHeight=match[1]}else{this.pixelHeight=$(canvas).height()}match=this._pxregex.exec(width);if(match){this.pixelWidth=match[1]}else{this.pixelWidth=$(canvas).width()}},_genShape:function(shapetype,shapeargs){var id=shapeCount++;shapeargs.unshift(id);return new VShape(this,id,shapetype,shapeargs)},appendShape:function(shape){alert(\"appendShape not implemented\")},replaceWithShape:function(shapeid,shape){alert(\"replaceWithShape not implemented\")},insertAfterShape:function(shapeid,shape){alert(\"insertAfterShape not implemented\")},removeShapeId:function(shapeid){alert(\"removeShapeId not implemented\")},getShapeAt:function(el,x,y){alert(\"getShapeAt not implemented\")},render:function(){alert(\"render not implemented\")}});VCanvas_canvas=createClass(VCanvas_base,{init:function(width,height,target,interact){VCanvas_canvas._super.init.call(this,width,height,target);this.canvas=document.createElement(\"canvas\");if(target[0]){target=target[0]}$.data(target,\"_jqs_vcanvas\",this);$(this.canvas).css({display:\"inline-block\",width:width,height:height,verticalAlign:\"top\"});this._insert(this.canvas,target);this._calculatePixelDims(width,height,this.canvas);this.canvas.width=this.pixelWidth;this.canvas.height=this.pixelHeight;this.interact=interact;this.shapes={};this.shapeseq=[];this.currentTargetShapeId=undefined;$(this.canvas).css({width:this.pixelWidth,height:this.pixelHeight})},_getContext:function(lineColor,fillColor,lineWidth){var context=this.canvas.getContext(\"2d\");if(lineColor!==undefined){context.strokeStyle=lineColor}context.lineWidth=lineWidth===undefined?1:lineWidth;if(fillColor!==undefined){context.fillStyle=fillColor}return context},reset:function(){var context=this._getContext();context.clearRect(0,0,this.pixelWidth,this.pixelHeight);this.shapes={};this.shapeseq=[];this.currentTargetShapeId=undefined},_drawShape:function(shapeid,path,lineColor,fillColor,lineWidth){var context=this._getContext(lineColor,fillColor,lineWidth),i,plen;context.beginPath();context.moveTo(path[0][0]+.5,path[0][1]+.5);for(i=1,plen=path.length;i<plen;i++){context.lineTo(path[i][0]+.5,path[i][1]+.5)}if(lineColor!==undefined){context.stroke()}if(fillColor!==undefined){context.fill()}if(this.targetX!==undefined&&this.targetY!==undefined&&context.isPointInPath(this.targetX,this.targetY)){this.currentTargetShapeId=shapeid}},_drawCircle:function(shapeid,x,y,radius,lineColor,fillColor,lineWidth){var context=this._getContext(lineColor,fillColor,lineWidth);context.beginPath();context.arc(x,y,radius,0,2*Math.PI,false);if(this.targetX!==undefined&&this.targetY!==undefined&&context.isPointInPath(this.targetX,this.targetY)){this.currentTargetShapeId=shapeid}if(lineColor!==undefined){context.stroke()}if(fillColor!==undefined){context.fill()}},_drawPieSlice:function(shapeid,x,y,radius,startAngle,endAngle,lineColor,fillColor){var context=this._getContext(lineColor,fillColor);context.beginPath();context.moveTo(x,y);context.arc(x,y,radius,startAngle,endAngle,false);context.lineTo(x,y);context.closePath();if(lineColor!==undefined){context.stroke()}if(fillColor){context.fill()}if(this.targetX!==undefined&&this.targetY!==undefined&&context.isPointInPath(this.targetX,this.targetY)){this.currentTargetShapeId=shapeid}},_drawRect:function(shapeid,x,y,width,height,lineColor,fillColor){return this._drawShape(shapeid,[[x,y],[x+width,y],[x+width,y+height],[x,y+height],[x,y]],lineColor,fillColor)},appendShape:function(shape){this.shapes[shape.id]=shape;this.shapeseq.push(shape.id);this.lastShapeId=shape.id;return shape.id},replaceWithShape:function(shapeid,shape){var shapeseq=this.shapeseq,i;this.shapes[shape.id]=shape;for(i=shapeseq.length;i--;){if(shapeseq[i]==shapeid){shapeseq[i]=shape.id}}delete this.shapes[shapeid]},replaceWithShapes:function(shapeids,shapes){var shapeseq=this.shapeseq,shapemap={},sid,i,first;for(i=shapeids.length;i--;){shapemap[shapeids[i]]=true}for(i=shapeseq.length;i--;){sid=shapeseq[i];if(shapemap[sid]){shapeseq.splice(i,1);delete this.shapes[sid];first=i}}for(i=shapes.length;i--;){shapeseq.splice(first,0,shapes[i].id);this.shapes[shapes[i].id]=shapes[i]}},insertAfterShape:function(shapeid,shape){var shapeseq=this.shapeseq,i;for(i=shapeseq.length;i--;){if(shapeseq[i]===shapeid){shapeseq.splice(i+1,0,shape.id);this.shapes[shape.id]=shape;return}}},removeShapeId:function(shapeid){var shapeseq=this.shapeseq,i;for(i=shapeseq.length;i--;){if(shapeseq[i]===shapeid){shapeseq.splice(i,1);break}}delete this.shapes[shapeid]},getShapeAt:function(el,x,y){this.targetX=x;this.targetY=y;this.render();return this.currentTargetShapeId},render:function(){var shapeseq=this.shapeseq,shapes=this.shapes,shapeCount=shapeseq.length,context=this._getContext(),shapeid,shape,i;context.clearRect(0,0,this.pixelWidth,this.pixelHeight);for(i=0;i<shapeCount;i++){shapeid=shapeseq[i];shape=shapes[shapeid];this[\"_draw\"+shape.type].apply(this,shape.args)}if(!this.interact){this.shapes={};this.shapeseq=[]}}});VCanvas_vml=createClass(VCanvas_base,{init:function(width,height,target){var groupel;VCanvas_vml._super.init.call(this,width,height,target);if(target[0]){target=target[0]}$.data(target,\"_jqs_vcanvas\",this);this.canvas=document.createElement(\"span\");$(this.canvas).css({display:\"inline-block\",position:\"relative\",overflow:\"hidden\",width:width,height:height,margin:\"0px\",padding:\"0px\",verticalAlign:\"top\"});this._insert(this.canvas,target);this._calculatePixelDims(width,height,this.canvas);this.canvas.width=this.pixelWidth;this.canvas.height=this.pixelHeight;groupel='<v:group coordorigin=\"0 0\" coordsize=\"'+this.pixelWidth+\" \"+this.pixelHeight+'\"'+' style=\"position:absolute;top:0;left:0;width:'+this.pixelWidth+\"px;height=\"+this.pixelHeight+'px;\"></v:group>';this.canvas.insertAdjacentHTML(\"beforeEnd\",groupel);this.group=$(this.canvas).children()[0];this.rendered=false;this.prerender=\"\"},_drawShape:function(shapeid,path,lineColor,fillColor,lineWidth){var vpath=[],initial,stroke,fill,closed,vel,plen,i;for(i=0,plen=path.length;i<plen;i++){vpath[i]=\"\"+path[i][0]+\",\"+path[i][1]}initial=vpath.splice(0,1);lineWidth=lineWidth===undefined?1:lineWidth;stroke=lineColor===undefined?' stroked=\"false\" ':' strokeWeight=\"'+lineWidth+'px\" strokeColor=\"'+lineColor+'\" ';fill=fillColor===undefined?' filled=\"false\"':' fillColor=\"'+fillColor+'\" filled=\"true\" ';closed=vpath[0]===vpath[vpath.length-1]?\"x \":\"\";vel='<v:shape coordorigin=\"0 0\" coordsize=\"'+this.pixelWidth+\" \"+this.pixelHeight+'\" '+' id=\"jqsshape'+shapeid+'\" '+stroke+fill+' style=\"position:absolute;left:0px;top:0px;height:'+this.pixelHeight+\"px;width:\"+this.pixelWidth+'px;padding:0px;margin:0px;\" '+' path=\"m '+initial+\" l \"+vpath.join(\", \")+\" \"+closed+'e\">'+\" </v:shape>\";return vel},_drawCircle:function(shapeid,x,y,radius,lineColor,fillColor,lineWidth){var stroke,fill,vel;x-=radius;y-=radius;stroke=lineColor===undefined?' stroked=\"false\" ':' strokeWeight=\"'+lineWidth+'px\" strokeColor=\"'+lineColor+'\" ';fill=fillColor===undefined?' filled=\"false\"':' fillColor=\"'+fillColor+'\" filled=\"true\" ';vel=\"<v:oval \"+' id=\"jqsshape'+shapeid+'\" '+stroke+fill+' style=\"position:absolute;top:'+y+\"px; left:\"+x+\"px; width:\"+radius*2+\"px; height:\"+radius*2+'px\"></v:oval>';return vel},_drawPieSlice:function(shapeid,x,y,radius,startAngle,endAngle,lineColor,fillColor){var vpath,startx,starty,endx,endy,stroke,fill,vel;if(startAngle===endAngle){return\"\"}if(endAngle-startAngle===2*Math.PI){startAngle=0;endAngle=2*Math.PI}startx=x+Math.round(Math.cos(startAngle)*radius);starty=y+Math.round(Math.sin(startAngle)*radius);endx=x+Math.round(Math.cos(endAngle)*radius);endy=y+Math.round(Math.sin(endAngle)*radius);if(startx===endx&&starty===endy){if(endAngle-startAngle<Math.PI){return\"\"}startx=endx=x+radius;starty=endy=y}if(startx===endx&&starty===endy&&endAngle-startAngle<Math.PI){return\"\"}vpath=[x-radius,y-radius,x+radius,y+radius,startx,starty,endx,endy];stroke=lineColor===undefined?' stroked=\"false\" ':' strokeWeight=\"1px\" strokeColor=\"'+lineColor+'\" ';fill=fillColor===undefined?' filled=\"false\"':' fillColor=\"'+fillColor+'\" filled=\"true\" ';vel='<v:shape coordorigin=\"0 0\" coordsize=\"'+this.pixelWidth+\" \"+this.pixelHeight+'\" '+' id=\"jqsshape'+shapeid+'\" '+stroke+fill+' style=\"position:absolute;left:0px;top:0px;height:'+this.pixelHeight+\"px;width:\"+this.pixelWidth+'px;padding:0px;margin:0px;\" '+' path=\"m '+x+\",\"+y+\" wa \"+vpath.join(\", \")+' x e\">'+\" </v:shape>\";return vel},_drawRect:function(shapeid,x,y,width,height,lineColor,fillColor){return this._drawShape(shapeid,[[x,y],[x,y+height],[x+width,y+height],[x+width,y],[x,y]],lineColor,fillColor)},reset:function(){this.group.innerHTML=\"\"},appendShape:function(shape){var vel=this[\"_draw\"+shape.type].apply(this,shape.args);if(this.rendered){this.group.insertAdjacentHTML(\"beforeEnd\",vel)}else{this.prerender+=vel}this.lastShapeId=shape.id;return shape.id},replaceWithShape:function(shapeid,shape){var existing=$(\"#jqsshape\"+shapeid),vel=this[\"_draw\"+shape.type].apply(this,shape.args);existing[0].outerHTML=vel},replaceWithShapes:function(shapeids,shapes){var existing=$(\"#jqsshape\"+shapeids[0]),replace=\"\",slen=shapes.length,i;for(i=0;i<slen;i++){replace+=this[\"_draw\"+shapes[i].type].apply(this,shapes[i].args)}existing[0].outerHTML=replace;for(i=1;i<shapeids.length;i++){$(\"#jqsshape\"+shapeids[i]).remove()}},insertAfterShape:function(shapeid,shape){var existing=$(\"#jqsshape\"+shapeid),vel=this[\"_draw\"+shape.type].apply(this,shape.args);existing[0].insertAdjacentHTML(\"afterEnd\",vel)},removeShapeId:function(shapeid){var existing=$(\"#jqsshape\"+shapeid);this.group.removeChild(existing[0])},getShapeAt:function(el,x,y){var shapeid=el.id.substr(8);return shapeid},render:function(){if(!this.rendered){this.group.innerHTML=this.prerender;this.rendered=true}}})})})(document,Math);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS1zcGFya2xpbmUvZGlzdC9qcXVlcnkuc3BhcmtsaW5lLm1pbi5qcz9lZTNhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUEsbUNBQW1DLG1CQUFtQixTQUEyQztBQUFBO0FBQUE7QUFBQSxxR0FBMkIsc0NBQXNDLGlCQUFpQixjQUFjLGFBQWEsbUJBQW1CLGlVQUFpVSx1QkFBdUIsT0FBTyxRQUFRLGtjQUFrYyxPQUFPLDRYQUE0WCxPQUFPLFNBQVMsVUFBVSxVQUFVLEtBQUssUUFBUSxHQUFHLE1BQU0sZ1dBQWdXLE9BQU8sU0FBUyxVQUFVLFVBQVUsU0FBUyxRQUFRLEdBQUcsV0FBVyw2RkFBNkYsbURBQW1ELE9BQU8sU0FBUyxVQUFVLFdBQVcsd0JBQXdCLEtBQUssK0JBQStCLFdBQVcsK0pBQStKLFVBQVUsU0FBUyxRQUFRLEdBQUcsU0FBUyxrSkFBa0osaUJBQWlCLEtBQUssT0FBTyx3QkFBd0IsUUFBUSx1Q0FBdUMsTUFBTSwwTEFBMEwsT0FBTyxTQUFTLFVBQVUsT0FBTyxJQUFJLFdBQVcsS0FBSyxNQUFNLDJTQUEyUyxjQUFjLElBQUksT0FBTywwREFBMEQsUUFBUSxvSUFBb0ksNEJBQTRCLHVCQUF1QixhQUFhLFlBQVksc0JBQXNCLHdDQUF3QyxxQ0FBcUMscUdBQXFHLDRHQUE0RyxnQkFBZ0IsK0JBQStCLG9CQUFvQix1QkFBdUIsZ0JBQWdCLDJCQUEyQiwyQkFBMkIsa0JBQWtCLElBQUksY0FBYyxpQkFBaUIsK0JBQStCLG9CQUFvQixJQUFJLEVBQUUsdUJBQXVCLGVBQWUsaUJBQWlCLGlDQUFpQyx1QkFBdUIsaUJBQWlCLHlFQUF5RSxvQ0FBb0MsS0FBSyw4Q0FBOEMsdUJBQXVCLGdEQUFnRCw4QkFBOEIsd0JBQXdCLEtBQUssNkJBQTZCLDBCQUEwQixjQUFjLHNDQUFzQyxPQUFPLEVBQUUsb0JB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QThCLFFBQVEsa0JBQWtCLEtBQUsscUNBQXFDLDBDQUEwQyx3RkFBd0YsK0NBQStDLGlDQUFpQyxvQ0FBb0Msb0NBQW9DLDZCQUE2Qiw0QkFBNEIsZUFBZSxtQkFBbUIsbUJBQW1CLG9DQUFvQyxxQkFBcUIsRUFBRSxFQUFFIiwiZmlsZSI6IjUzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoganF1ZXJ5LnNwYXJrbGluZSAyLjEuMyAtIGh0dHA6Ly9vbW5pcG90ZW50Lm5ldC9qcXVlcnkuc3BhcmtsaW5lLyBcbioqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UgLSBzZWUgYWJvdmUgc2l0ZSBmb3IgZGV0YWlscyAqL1xuXG4oZnVuY3Rpb24oZG9jdW1lbnQsTWF0aCx1bmRlZmluZWQpeyhmdW5jdGlvbihmYWN0b3J5KXtpZih0eXBlb2YgZGVmaW5lPT09XCJmdW5jdGlvblwiJiZkZWZpbmUuYW1kKXtkZWZpbmUoW1wianF1ZXJ5XCJdLGZhY3RvcnkpfWVsc2UgaWYoalF1ZXJ5JiYhalF1ZXJ5LmZuLnNwYXJrbGluZSl7ZmFjdG9yeShqUXVlcnkpfX0pKGZ1bmN0aW9uKCQpe1widXNlIHN0cmljdFwiO3ZhciBVTlNFVF9PUFRJT049e30sZ2V0RGVmYXVsdHMsY3JlYXRlQ2xhc3MsU1BGb3JtYXQsY2xpcHZhbCxxdWFydGlsZSxub3JtYWxpemVWYWx1ZSxub3JtYWxpemVWYWx1ZXMscmVtb3ZlLGlzTnVtYmVyLGFsbCxzdW0sYWRkQ1NTLGVuc3VyZUFycmF5LGZvcm1hdE51bWJlcixSYW5nZU1hcCxNb3VzZUhhbmRsZXIsVG9vbHRpcCxiYXJIaWdobGlnaHRNaXhpbixsaW5lLGJhcix0cmlzdGF0ZSxkaXNjcmV0ZSxidWxsZXQscGllLGJveCxkZWZhdWx0U3R5bGVzLGluaXRTdHlsZXMsVlNoYXBlLFZDYW52YXNfYmFzZSxWQ2FudmFzX2NhbnZhcyxWQ2FudmFzX3ZtbCxwZW5kaW5nLHNoYXBlQ291bnQ9MDtnZXREZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybntjb21tb246e3R5cGU6XCJsaW5lXCIsbGluZUNvbG9yOlwiIzAwZlwiLGZpbGxDb2xvcjpcIiNjZGZcIixkZWZhdWx0UGl4ZWxzUGVyVmFsdWU6Myx3aWR0aDpcImF1dG9cIixoZWlnaHQ6XCJhdXRvXCIsY29tcG9zaXRlOmZhbHNlLHRhZ1ZhbHVlc0F0dHJpYnV0ZTpcInZhbHVlc1wiLHRhZ09wdGlvbnNQcmVmaXg6XCJzcGFya1wiLGVuYWJsZVRhZ09wdGlvbnM6ZmFsc2UsZW5hYmxlSGlnaGxpZ2h0OnRydWUsaGlnaGxpZ2h0TGlnaHRlbjoxLjQsdG9vbHRpcFNraXBOdWxsOnRydWUsdG9vbHRpcFByZWZpeDpcIlwiLHRvb2x0aXBTdWZmaXg6XCJcIixkaXNhYmxlSGlkZGVuQ2hlY2s6ZmFsc2UsbnVtYmVyRm9ybWF0dGVyOmZhbHNlLG51bWJlckRpZ2l0R3JvdXBDb3VudDozLG51bWJlckRpZ2l0R3JvdXBTZXA6XCIsXCIsbnVtYmVyRGVjaW1hbE1hcms6XCIuXCIsZGlzYWJsZVRvb2x0aXBzOmZhbHNlLGRpc2FibGVJbnRlcmFjdGlvbjpmYWxzZX0sbGluZTp7c3BvdENvbG9yOlwiI2Y4MFwiLGhpZ2hsaWdodFNwb3RDb2xvcjpcIiM1ZjVcIixoaWdobGlnaHRMaW5lQ29sb3I6XCIjZjIyXCIsc3BvdFJhZGl1czoxLjUsbWluU3BvdENvbG9yOlwiI2Y4MFwiLG1heFNwb3RDb2xvcjpcIiNmODBcIixsaW5lV2lkdGg6MSxub3JtYWxSYW5nZU1pbjp1bmRlZmluZWQsbm9ybWFsUmFuZ2VNYXg6dW5kZWZpbmVkLG5vcm1hbFJhbmdlQ29sb3I6XCIjY2NjXCIsZHJhd05vcm1hbE9uVG9wOmZhbHNlLGNoYXJ0UmFuZ2VNaW46dW5kZWZpbmVkLGNoYXJ0UmFuZ2VNYXg6dW5kZWZpbmVkLGNoYXJ0UmFuZ2VNaW5YOnVuZGVmaW5lZCxjaGFydFJhbmdlTWF4WDp1bmRlZmluZWQsdG9vbHRpcEZvcm1hdDpuZXcgU1BGb3JtYXQoJzxzcGFuIHN0eWxlPVwiY29sb3I6IHt7Y29sb3J9fVwiPiYjOTY3OTs8L3NwYW4+IHt7cHJlZml4fX17e3l9fXt7c3VmZml4fX0nKX0sYmFyOntiYXJDb2xvcjpcIiMzMzY2Y2NcIixuZWdCYXJDb2xvcjpcIiNmNDRcIixzdGFja2VkQmFyQ29sb3I6W1wiIzMzNjZjY1wiLFwiI2RjMzkxMlwiLFwiI2ZmOTkwMFwiLFwiIzEwOTYxOFwiLFwiIzY2YWEwMFwiLFwiI2RkNDQ3N1wiLFwiIzAwOTljNlwiLFwiIzk5MDA5OVwiXSx6ZXJvQ29sb3I6dW5kZWZpbmVkLG51bGxDb2xvcjp1bmRlZmluZWQsemVyb0F4aXM6dHJ1ZSxiYXJXaWR0aDo0LGJhclNwYWNpbmc6MSxjaGFydFJhbmdlTWF4OnVuZGVmaW5lZCxjaGFydFJhbmdlTWluOnVuZGVmaW5lZCxjaGFydFJhbmdlQ2xpcDpmYWxzZSxjb2xvck1hcDp1bmRlZmluZWQsdG9vbHRpcEZvcm1hdDpuZXcgU1BGb3JtYXQoJzxzcGFuIHN0eWxlPVwiY29sb3I6IHt7Y29sb3J9fVwiPiYjOTY3OTs8L3NwYW4+IHt7cHJlZml4fX17e3ZhbHVlfX17e3N1ZmZpeH19Jyl9LHRyaXN0YXRlOntiYXJXaWR0aDo0LGJhclNwYWNpbmc6MSxwb3NCYXJDb2xvcjpcIiM2ZjZcIixuZWdCYXJDb2xvcjpcIiNmNDRcIix6ZXJvQmFyQ29sb3I6XCIjOTk5XCIsY29sb3JNYXA6e30sdG9vbHRpcEZvcm1hdDpuZXcgU1BGb3JtYXQoJzxzcGFuIHN0eWxlPVwiY29sb3I6IHt7Y29sb3J9fVwiPiYjOTY3OTs8L3NwYW4+IHt7dmFsdWU6bWFwfX0nKSx0b29sdGlwVmFsdWVMb29rdXBzOnttYXA6e1wiLTFcIjpcIkxvc3NcIiwwOlwiRHJhd1wiLDE6XCJXaW5cIn19fSxkaXNjcmV0ZTp7bGluZUhlaWdodDpcImF1dG9cIix0aHJlc2hvbGRDb2xvcjp1bmRlZmluZWQsdGhyZXNob2xkVmFsdWU6MCxjaGFydFJhbmdlTWF4OnVuZGVmaW5lZCxjaGFydFJhbmdlTWluOnVuZGVmaW5lZCxjaGFydFJhbmdlQ2xpcDpmYWxzZSx0b29sdGlwRm9ybWF0Om5ldyBTUEZvcm1hdChcInt7cHJlZml4fX17e3ZhbHVlfX17e3N1ZmZpeH19XCIpfSxidWxsZXQ6e3RhcmdldENvbG9yOlwiI2YzM1wiLHRhcmdldFdpZHRoOjMscGVyZm9ybWFuY2VDb2xvcjpcIiMzM2ZcIixyYW5nZUNvbG9yczpbXCIjZDNkYWZlXCIsXCIjYThiNmZmXCIsXCIjN2Y5NGZmXCJdLGJhc2U6dW5kZWZpbmVkLHRvb2x0aXBGb3JtYXQ6bmV3IFNQRm9ybWF0KFwie3tmaWVsZGtleTpmaWVsZHN9fSAtIHt7dmFsdWV9fVwiKSx0b29sdGlwVmFsdWVMb29rdXBzOntmaWVsZHM6e3I6XCJSYW5nZVwiLHA6XCJQZXJmb3JtYW5jZVwiLHQ6XCJUYXJnZXRcIn19fSxwaWU6e29mZnNldDowLHNsaWNlQ29sb3JzOltcIiMzMzY2Y2NcIixcIiNkYzM5MTJcIixcIiNmZjk5MDBcIixcIiMxMDk2MThcIixcIiM2NmFhMDBcIixcIiNkZDQ0NzdcIixcIiMwMDk5YzZcIixcIiM5OTAwOTlcIl0sYm9yZGVyV2lkdGg6MCxib3JkZXJDb2xvcjpcIiMwMDBcIix0b29sdGlwRm9ybWF0Om5ldyBTUEZvcm1hdCgnPHNwYW4gc3R5bGU9XCJjb2xvcjoge3tjb2xvcn19XCI+JiM5Njc5Ozwvc3Bhbj4ge3t2YWx1ZX19ICh7e3BlcmNlbnQuMX19JSknKX0sYm94OntyYXc6ZmFsc2UsYm94TGluZUNvbG9yOlwiIzAwMFwiLGJveEZpbGxDb2xvcjpcIiNjZGZcIix3aGlza2VyQ29sb3I6XCIjMDAwXCIsb3V0bGllckxpbmVDb2xvcjpcIiMzMzNcIixvdXRsaWVyRmlsbENvbG9yOlwiI2ZmZlwiLG1lZGlhbkNvbG9yOlwiI2YwMFwiLHNob3dPdXRsaWVyczp0cnVlLG91dGxpZXJJUVI6MS41LHNwb3RSYWRpdXM6MS41LHRhcmdldDp1bmRlZmluZWQsdGFyZ2V0Q29sb3I6XCIjNGEyXCIsY2hhcnRSYW5nZU1heDp1bmRlZmluZWQsY2hhcnRSYW5nZU1pbjp1bmRlZmluZWQsdG9vbHRpcEZvcm1hdDpuZXcgU1BGb3JtYXQoXCJ7e2ZpZWxkOmZpZWxkc319OiB7e3ZhbHVlfX1cIiksdG9vbHRpcEZvcm1hdEZpZWxkbGlzdEtleTpcImZpZWxkXCIsdG9vbHRpcFZhbHVlTG9va3Vwczp7ZmllbGRzOntscTpcIkxvd2VyIFF1YXJ0aWxlXCIsbWVkOlwiTWVkaWFuXCIsdXE6XCJVcHBlciBRdWFydGlsZVwiLGxvOlwiTGVmdCBPdXRsaWVyXCIscm86XCJSaWdodCBPdXRsaWVyXCIsbHc6XCJMZWZ0IFdoaXNrZXJcIixydzpcIlJpZ2h0IFdoaXNrZXJcIn19fX19O2RlZmF1bHRTdHlsZXM9XCIuanFzdG9vbHRpcCB7IFwiK1wicG9zaXRpb246IGFic29sdXRlO1wiK1wibGVmdDogMHB4O1wiK1widG9wOiAwcHg7XCIrXCJ2aXNpYmlsaXR5OiBoaWRkZW47XCIrXCJiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCkgdHJhbnNwYXJlbnQ7XCIrXCJiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuNik7XCIrXCJmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9Izk5MDAwMDAwLCBlbmRDb2xvcnN0cj0jOTkwMDAwMDApO1wiKyctbXMtZmlsdGVyOiBcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPSM5OTAwMDAwMCwgZW5kQ29sb3JzdHI9Izk5MDAwMDAwKVwiOycrXCJjb2xvcjogd2hpdGU7XCIrXCJmb250OiAxMHB4IGFyaWFsLCBzYW4gc2VyaWY7XCIrXCJ0ZXh0LWFsaWduOiBsZWZ0O1wiK1wid2hpdGUtc3BhY2U6IG5vd3JhcDtcIitcInBhZGRpbmc6IDVweDtcIitcImJvcmRlcjogMXB4IHNvbGlkIHdoaXRlO1wiK1wiYm94LXNpemluZzogY29udGVudC1ib3g7XCIrXCJ6LWluZGV4OiAxMDAwMDtcIitcIn1cIitcIi5qcXNmaWVsZCB7IFwiK1wiY29sb3I6IHdoaXRlO1wiK1wiZm9udDogMTBweCBhcmlhbCwgc2FuIHNlcmlmO1wiK1widGV4dC1hbGlnbjogbGVmdDtcIitcIn1cIjtjcmVhdGVDbGFzcz1mdW5jdGlvbigpe3ZhciBDbGFzcyxhcmdzO0NsYXNzPWZ1bmN0aW9uKCl7dGhpcy5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX07aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtpZihhcmd1bWVudHNbMF0pe0NsYXNzLnByb3RvdHlwZT0kLmV4dGVuZChuZXcgYXJndW1lbnRzWzBdLGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdKTtDbGFzcy5fc3VwZXI9YXJndW1lbnRzWzBdLnByb3RvdHlwZX1lbHNle0NsYXNzLnByb3RvdHlwZT1hcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXX1pZihhcmd1bWVudHMubGVuZ3RoPjIpe2FyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEsLTEpO2FyZ3MudW5zaGlmdChDbGFzcy5wcm90b3R5cGUpOyQuZXh0ZW5kLmFwcGx5KCQsYXJncyl9fWVsc2V7Q2xhc3MucHJvdG90eXBlPWFyZ3VtZW50c1swXX1DbGFzcy5wcm90b3R5cGUuY2xzPUNsYXNzO3JldHVybiBDbGFzc307JC5TUEZvcm1hdENsYXNzPVNQRm9ybWF0PWNyZWF0ZUNsYXNzKHtmcmU6L1xce1xceyhbXFx3Ll0rPykoOiguKz8pKT9cXH1cXH0vZyxwcmVjcmU6LyhcXHcrKVxcLihcXGQrKS8saW5pdDpmdW5jdGlvbihmb3JtYXQsZmNsYXNzKXt0aGlzLmZvcm1hdD1mb3JtYXQ7dGhpcy5mY2xhc3M9ZmNsYXNzfSxyZW5kZXI6ZnVuY3Rpb24oZmllbGRzZXQsbG9va3VwcyxvcHRpb25zKXt2YXIgc2VsZj10aGlzLGZpZWxkcz1maWVsZHNldCxtYXRjaCx0b2tlbixsb29rdXBrZXksZmllbGR2YWx1ZSxwcmVjO3JldHVybiB0aGlzLmZvcm1hdC5yZXBsYWNlKHRoaXMuZnJlLGZ1bmN0aW9uKCl7dmFyIGxvb2t1cDt0b2tlbj1hcmd1bWVudHNbMV07bG9va3Vwa2V5PWFyZ3VtZW50c1szXTttYXRjaD1zZWxmLnByZWNyZS5leGVjKHRva2VuKTtpZihtYXRjaCl7cHJlYz1tYXRjaFsyXTt0b2tlbj1tYXRjaFsxXX1lbHNle3ByZWM9ZmFsc2V9ZmllbGR2YWx1ZT1maWVsZHNbdG9rZW5dO2lmKGZpZWxkdmFsdWU9PT11bmRlZmluZWQpe3JldHVyblwiXCJ9aWYobG9va3Vwa2V5JiZsb29rdXBzJiZsb29rdXBzW2xvb2t1cGtleV0pe2xvb2t1cD1sb29rdXBzW2xvb2t1cGtleV07aWYobG9va3VwLmdldCl7cmV0dXJuIGxvb2t1cHNbbG9va3Vwa2V5XS5nZXQoZmllbGR2YWx1ZSl8fGZpZWxkdmFsdWV9ZWxzZXtyZXR1cm4gbG9va3Vwc1tsb29rdXBrZXldW2ZpZWxkdmFsdWVdfHxmaWVsZHZhbHVlfX1pZihpc051bWJlcihmaWVsZHZhbHVlKSl7aWYob3B0aW9ucy5nZXQoXCJudW1iZXJGb3JtYXR0ZXJcIikpe2ZpZWxkdmFsdWU9b3B0aW9ucy5nZXQoXCJudW1iZXJGb3JtYXR0ZXJcIikoZmllbGR2YWx1ZSl9ZWxzZXtmaWVsZHZhbHVlPWZvcm1hdE51bWJlcihmaWVsZHZhbHVlLHByZWMsb3B0aW9ucy5nZXQoXCJudW1iZXJEaWdpdEdyb3VwQ291bnRcIiksb3B0aW9ucy5nZXQoXCJudW1iZXJEaWdpdEdyb3VwU2VwXCIpLG9wdGlvbnMuZ2V0KFwibnVtYmVyRGVjaW1hbE1hcmtcIikpfX1yZXR1cm4gZmllbGR2YWx1ZX0pfX0pOyQuc3Bmb3JtYXQ9ZnVuY3Rpb24oZm9ybWF0LGZjbGFzcyl7cmV0dXJuIG5ldyBTUEZvcm1hdChmb3JtYXQsZmNsYXNzKX07Y2xpcHZhbD1mdW5jdGlvbih2YWwsbWluLG1heCl7aWYodmFsPG1pbil7cmV0dXJuIG1pbn1pZih2YWw+bWF4KXtyZXR1cm4gbWF4fXJldHVybiB2YWx9O3F1YXJ0aWxlPWZ1bmN0aW9uKHZhbHVlcyxxKXt2YXIgdmw7aWYocT09PTIpe3ZsPU1hdGguZmxvb3IodmFsdWVzLmxlbmd0aC8yKTtyZXR1cm4gdmFsdWVzLmxlbmd0aCUyP3ZhbHVlc1t2bF06KHZhbHVlc1t2bC0xXSt2YWx1ZXNbdmxdKS8yfWVsc2V7aWYodmFsdWVzLmxlbmd0aCUyKXt2bD0odmFsdWVzLmxlbmd0aCpxK3EpLzQ7cmV0dXJuIHZsJTE/KHZhbHVlc1tNYXRoLmZsb29yKHZsKV0rdmFsdWVzW01hdGguZmxvb3IodmwpLTFdKS8yOnZhbHVlc1t2bC0xXX1lbHNle3ZsPSh2YWx1ZXMubGVuZ3RoKnErMikvNDtyZXR1cm4gdmwlMT8odmFsdWVzW01hdGguZmxvb3IodmwpXSt2YWx1ZXNbTWF0aC5mbG9vcih2bCktMV0pLzI6dmFsdWVzW3ZsLTFdfX19O25vcm1hbGl6ZVZhbHVlPWZ1bmN0aW9uKHZhbCl7dmFyIG5mO3N3aXRjaCh2YWwpe2Nhc2VcInVuZGVmaW5lZFwiOnZhbD11bmRlZmluZWQ7YnJlYWs7Y2FzZVwibnVsbFwiOnZhbD1udWxsO2JyZWFrO2Nhc2VcInRydWVcIjp2YWw9dHJ1ZTticmVhaztjYXNlXCJmYWxzZVwiOnZhbD1mYWxzZTticmVhaztkZWZhdWx0Om5mPXBhcnNlRmxvYXQodmFsKTtpZih2YWw9PW5mKXt2YWw9bmZ9fXJldHVybiB2YWx9O25vcm1hbGl6ZVZhbHVlcz1mdW5jdGlvbih2YWxzKXt2YXIgaSxyZXN1bHQ9W107Zm9yKGk9dmFscy5sZW5ndGg7aS0tOyl7cmVzdWx0W2ldPW5vcm1hbGl6ZVZhbHVlKHZhbHNbaV0pfXJldHVybiByZXN1bHR9O3JlbW92ZT1mdW5jdGlvbih2YWxzLGZpbHRlcil7dmFyIGksdmwscmVzdWx0PVtdO2ZvcihpPTAsdmw9dmFscy5sZW5ndGg7aTx2bDtpKyspe2lmKHZhbHNbaV0hPT1maWx0ZXIpe3Jlc3VsdC5wdXNoKHZhbHNbaV0pfX1yZXR1cm4gcmVzdWx0fTtpc051bWJlcj1mdW5jdGlvbihudW0pe3JldHVybiFpc05hTihwYXJzZUZsb2F0KG51bSkpJiZpc0Zpbml0ZShudW0pfTtmb3JtYXROdW1iZXI9ZnVuY3Rpb24obnVtLHByZWMsZ3JvdXBzaXplLGdyb3Vwc2VwLGRlY3NlcCl7dmFyIHAsaTtudW09KHByZWM9PT1mYWxzZT9wYXJzZUZsb2F0KG51bSkudG9TdHJpbmcoKTpudW0udG9GaXhlZChwcmVjKSkuc3BsaXQoXCJcIik7cD0ocD0kLmluQXJyYXkoXCIuXCIsbnVtKSk8MD9udW0ubGVuZ3RoOnA7aWYocDxudW0ubGVuZ3RoKXtudW1bcF09ZGVjc2VwfWZvcihpPXAtZ3JvdXBzaXplO2k+MDtpLT1ncm91cHNpemUpe251bS5zcGxpY2UoaSwwLGdyb3Vwc2VwKX1yZXR1cm4gbnVtLmpvaW4oXCJcIil9O2FsbD1mdW5jdGlvbih2YWwsYXJyLGlnbm9yZU51bGwpe3ZhciBpO2ZvcihpPWFyci5sZW5ndGg7aS0tOyl7aWYoaWdub3JlTnVsbCYmYXJyW2ldPT09bnVsbCljb250aW51ZTtpZihhcnJbaV0hPT12YWwpe3JldHVybiBmYWxzZX19cmV0dXJuIHRydWV9O3N1bT1mdW5jdGlvbih2YWxzKXt2YXIgdG90YWw9MCxpO2ZvcihpPXZhbHMubGVuZ3RoO2ktLTspe3RvdGFsKz10eXBlb2YgdmFsc1tpXT09PVwibnVtYmVyXCI/dmFsc1tpXTowfXJldHVybiB0b3RhbH07ZW5zdXJlQXJyYXk9ZnVuY3Rpb24odmFsKXtyZXR1cm4gJC5pc0FycmF5KHZhbCk/dmFsOlt2YWxdfTthZGRDU1M9ZnVuY3Rpb24oY3NzKXt2YXIgdGFnLGllZmFpbDtpZihkb2N1bWVudC5jcmVhdGVTdHlsZVNoZWV0KXt0cnl7ZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldCgpLmNzc1RleHQ9Y3NzO3JldHVybn1jYXRjaChlKXtpZWZhaWw9dHJ1ZX19dGFnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTt0YWcudHlwZT1cInRleHQvY3NzXCI7ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdLmFwcGVuZENoaWxkKHRhZyk7aWYoaWVmYWlsKXtkb2N1bWVudC5zdHlsZVNoZWV0c1tkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGgtMV0uY3NzVGV4dD1jc3N9ZWxzZXt0YWdbdHlwZW9mIGRvY3VtZW50LmJvZHkuc3R5bGUuV2Via2l0QXBwZWFyYW5jZT09XCJzdHJpbmdcIj9cImlubmVyVGV4dFwiOlwiaW5uZXJIVE1MXCJdPWNzc319OyQuZm4uc2ltcGxlZHJhdz1mdW5jdGlvbih3aWR0aCxoZWlnaHQsdXNlRXhpc3RpbmcsaW50ZXJhY3Qpe3ZhciB0YXJnZXQsbWhhbmRsZXI7aWYodXNlRXhpc3RpbmcmJih0YXJnZXQ9dGhpcy5kYXRhKFwiX2pxc192Y2FudmFzXCIpKSl7cmV0dXJuIHRhcmdldH1pZigkLmZuLnNwYXJrbGluZS5jYW52YXM9PT1mYWxzZSl7cmV0dXJuIGZhbHNlfWVsc2UgaWYoJC5mbi5zcGFya2xpbmUuY2FudmFzPT09dW5kZWZpbmVkKXt2YXIgZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtpZighIShlbC5nZXRDb250ZXh0JiZlbC5nZXRDb250ZXh0KFwiMmRcIikpKXskLmZuLnNwYXJrbGluZS5jYW52YXM9ZnVuY3Rpb24od2lkdGgsaGVpZ2h0LHRhcmdldCxpbnRlcmFjdCl7cmV0dXJuIG5ldyBWQ2FudmFzX2NhbnZhcyh3aWR0aCxoZWlnaHQsdGFyZ2V0LGludGVyYWN0KX19ZWxzZSBpZihkb2N1bWVudC5uYW1lc3BhY2VzJiYhZG9jdW1lbnQubmFtZXNwYWNlcy52KXtkb2N1bWVudC5uYW1lc3BhY2VzLmFkZChcInZcIixcInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sXCIsXCIjZGVmYXVsdCNWTUxcIik7JC5mbi5zcGFya2xpbmUuY2FudmFzPWZ1bmN0aW9uKHdpZHRoLGhlaWdodCx0YXJnZXQsaW50ZXJhY3Qpe3JldHVybiBuZXcgVkNhbnZhc192bWwod2lkdGgsaGVpZ2h0LHRhcmdldCl9fWVsc2V7JC5mbi5zcGFya2xpbmUuY2FudmFzPWZhbHNlO3JldHVybiBmYWxzZX19aWYod2lkdGg9PT11bmRlZmluZWQpe3dpZHRoPSQodGhpcykuaW5uZXJXaWR0aCgpfWlmKGhlaWdodD09PXVuZGVmaW5lZCl7aGVpZ2h0PSQodGhpcykuaW5uZXJIZWlnaHQoKX10YXJnZXQ9JC5mbi5zcGFya2xpbmUuY2FudmFzKHdpZHRoLGhlaWdodCx0aGlzLGludGVyYWN0KTttaGFuZGxlcj0kKHRoaXMpLmRhdGEoXCJfanFzX21oYW5kbGVyXCIpO2lmKG1oYW5kbGVyKXttaGFuZGxlci5yZWdpc3RlckNhbnZhcyh0YXJnZXQpfXJldHVybiB0YXJnZXR9OyQuZm4uY2xlYXJkcmF3PWZ1bmN0aW9uKCl7dmFyIHRhcmdldD10aGlzLmRhdGEoXCJfanFzX3ZjYW52YXNcIik7aWYodGFyZ2V0KXt0YXJnZXQucmVzZXQoKX19OyQuUmFuZ2VNYXBDbGFzcz1SYW5nZU1hcD1jcmVhdGVDbGFzcyh7aW5pdDpmdW5jdGlvbihtYXApe3ZhciBrZXkscmFuZ2UscmFuZ2VsaXN0PVtdO2ZvcihrZXkgaW4gbWFwKXtpZihtYXAuaGFzT3duUHJvcGVydHkoa2V5KSYmdHlwZW9mIGtleT09PVwic3RyaW5nXCImJmtleS5pbmRleE9mKFwiOlwiKT4tMSl7cmFuZ2U9a2V5LnNwbGl0KFwiOlwiKTtyYW5nZVswXT1yYW5nZVswXS5sZW5ndGg9PT0wPy1JbmZpbml0eTpwYXJzZUZsb2F0KHJhbmdlWzBdKTtyYW5nZVsxXT1yYW5nZVsxXS5sZW5ndGg9PT0wP0luZmluaXR5OnBhcnNlRmxvYXQocmFuZ2VbMV0pO3JhbmdlWzJdPW1hcFtrZXldO3JhbmdlbGlzdC5wdXNoKHJhbmdlKX19dGhpcy5tYXA9bWFwO3RoaXMucmFuZ2VsaXN0PXJhbmdlbGlzdHx8ZmFsc2V9LGdldDpmdW5jdGlvbih2YWx1ZSl7dmFyIHJhbmdlbGlzdD10aGlzLnJhbmdlbGlzdCxpLHJhbmdlLHJlc3VsdDtpZigocmVzdWx0PXRoaXMubWFwW3ZhbHVlXSkhPT11bmRlZmluZWQpe3JldHVybiByZXN1bHR9aWYocmFuZ2VsaXN0KXtmb3IoaT1yYW5nZWxpc3QubGVuZ3RoO2ktLTspe3JhbmdlPXJhbmdlbGlzdFtpXTtpZihyYW5nZVswXTw9dmFsdWUmJnJhbmdlWzFdPj12YWx1ZSl7cmV0dXJuIHJhbmdlWzJdfX19cmV0dXJuIHVuZGVmaW5lZH19KTskLnJhbmdlX21hcD1mdW5jdGlvbihtYXApe3JldHVybiBuZXcgUmFuZ2VNYXAobWFwKX07TW91c2VIYW5kbGVyPWNyZWF0ZUNsYXNzKHtpbml0OmZ1bmN0aW9uKGVsLG9wdGlvbnMpe3ZhciAkZWw9JChlbCk7dGhpcy4kZWw9JGVsO3RoaXMub3B0aW9ucz1vcHRpb25zO3RoaXMuY3VycmVudFBhZ2VYPTA7dGhpcy5jdXJyZW50UGFnZVk9MDt0aGlzLmVsPWVsO3RoaXMuc3BsaXN0PVtdO3RoaXMudG9vbHRpcD1udWxsO3RoaXMub3Zlcj1mYWxzZTt0aGlzLmRpc3BsYXlUb29sdGlwcz0hb3B0aW9ucy5nZXQoXCJkaXNhYmxlVG9vbHRpcHNcIik7dGhpcy5oaWdobGlnaHRFbmFibGVkPSFvcHRpb25zLmdldChcImRpc2FibGVIaWdobGlnaHRcIil9LHJlZ2lzdGVyU3BhcmtsaW5lOmZ1bmN0aW9uKHNwKXt0aGlzLnNwbGlzdC5wdXNoKHNwKTtpZih0aGlzLm92ZXIpe3RoaXMudXBkYXRlRGlzcGxheSgpfX0scmVnaXN0ZXJDYW52YXM6ZnVuY3Rpb24oY2FudmFzKXt2YXIgJGNhbnZhcz0kKGNhbnZhcy5jYW52YXMpO3RoaXMuY2FudmFzPWNhbnZhczt0aGlzLiRjYW52YXM9JGNhbnZhczskY2FudmFzLm1vdXNlZW50ZXIoJC5wcm94eSh0aGlzLm1vdXNlZW50ZXIsdGhpcykpOyRjYW52YXMubW91c2VsZWF2ZSgkLnByb3h5KHRoaXMubW91c2VsZWF2ZSx0aGlzKSk7JGNhbnZhcy5jbGljaygkLnByb3h5KHRoaXMubW91c2VjbGljayx0aGlzKSl9LHJlc2V0OmZ1bmN0aW9uKHJlbW92ZVRvb2x0aXApe3RoaXMuc3BsaXN0PVtdO2lmKHRoaXMudG9vbHRpcCYmcmVtb3ZlVG9vbHRpcCl7dGhpcy50b29sdGlwLnJlbW92ZSgpO3RoaXMudG9vbHRpcD11bmRlZmluZWR9fSxtb3VzZWNsaWNrOmZ1bmN0aW9uKGUpe3ZhciBjbGlja0V2ZW50PSQuRXZlbnQoXCJzcGFya2xpbmVDbGlja1wiKTtjbGlja0V2ZW50Lm9yaWdpbmFsRXZlbnQ9ZTtjbGlja0V2ZW50LnNwYXJrbGluZXM9dGhpcy5zcGxpc3Q7dGhpcy4kZWwudHJpZ2dlcihjbGlja0V2ZW50KX0sbW91c2VlbnRlcjpmdW5jdGlvbihlKXskKGRvY3VtZW50LmJvZHkpLnVuYmluZChcIm1vdXNlbW92ZS5qcXNcIik7JChkb2N1bWVudC5ib2R5KS5iaW5kKFwibW91c2Vtb3ZlLmpxc1wiLCQucHJveHkodGhpcy5tb3VzZW1vdmUsdGhpcykpO3RoaXMub3Zlcj10cnVlO3RoaXMuY3VycmVudFBhZ2VYPWUucGFnZVg7dGhpcy5jdXJyZW50UGFnZVk9ZS5wYWdlWTt0aGlzLmN1cnJlbnRFbD1lLnRhcmdldDtpZighdGhpcy50b29sdGlwJiZ0aGlzLmRpc3BsYXlUb29sdGlwcyl7dGhpcy50b29sdGlwPW5ldyBUb29sdGlwKHRoaXMub3B0aW9ucyk7dGhpcy50b29sdGlwLnVwZGF0ZVBvc2l0aW9uKGUucGFnZVgsZS5wYWdlWSl9dGhpcy51cGRhdGVEaXNwbGF5KCl9LG1vdXNlbGVhdmU6ZnVuY3Rpb24oKXskKGRvY3VtZW50LmJvZHkpLnVuYmluZChcIm1vdXNlbW92ZS5qcXNcIik7dmFyIHNwbGlzdD10aGlzLnNwbGlzdCxzcGNvdW50PXNwbGlzdC5sZW5ndGgsbmVlZHNSZWZyZXNoPWZhbHNlLHNwLGk7dGhpcy5vdmVyPWZhbHNlO3RoaXMuY3VycmVudEVsPW51bGw7aWYodGhpcy50b29sdGlwKXt0aGlzLnRvb2x0aXAucmVtb3ZlKCk7dGhpcy50b29sdGlwPW51bGx9Zm9yKGk9MDtpPHNwY291bnQ7aSsrKXtzcD1zcGxpc3RbaV07aWYoc3AuY2xlYXJSZWdpb25IaWdobGlnaHQoKSl7bmVlZHNSZWZyZXNoPXRydWV9fWlmKG5lZWRzUmVmcmVzaCl7dGhpcy5jYW52YXMucmVuZGVyKCl9fSxtb3VzZW1vdmU6ZnVuY3Rpb24oZSl7dGhpcy5jdXJyZW50UGFnZVg9ZS5wYWdlWDt0aGlzLmN1cnJlbnRQYWdlWT1lLnBhZ2VZO3RoaXMuY3VycmVudEVsPWUudGFyZ2V0O2lmKHRoaXMudG9vbHRpcCl7dGhpcy50b29sdGlwLnVwZGF0ZVBvc2l0aW9uKGUucGFnZVgsZS5wYWdlWSl9dGhpcy51cGRhdGVEaXNwbGF5KCl9LHVwZGF0ZURpc3BsYXk6ZnVuY3Rpb24oKXt2YXIgc3BsaXN0PXRoaXMuc3BsaXN0LHNwY291bnQ9c3BsaXN0Lmxlbmd0aCxuZWVkc1JlZnJlc2g9ZmFsc2Usb2Zmc2V0PXRoaXMuJGNhbnZhcy5vZmZzZXQoKSxsb2NhbFg9dGhpcy5jdXJyZW50UGFnZVgtb2Zmc2V0LmxlZnQsbG9jYWxZPXRoaXMuY3VycmVudFBhZ2VZLW9mZnNldC50b3AsdG9vbHRpcGh0bWwsc3AsaSxyZXN1bHQsY2hhbmdlRXZlbnQ7aWYoIXRoaXMub3Zlcil7cmV0dXJufWZvcihpPTA7aTxzcGNvdW50O2krKyl7c3A9c3BsaXN0W2ldO3Jlc3VsdD1zcC5zZXRSZWdpb25IaWdobGlnaHQodGhpcy5jdXJyZW50RWwsbG9jYWxYLGxvY2FsWSk7aWYocmVzdWx0KXtuZWVkc1JlZnJlc2g9dHJ1ZX19aWYobmVlZHNSZWZyZXNoKXtjaGFuZ2VFdmVudD0kLkV2ZW50KFwic3BhcmtsaW5lUmVnaW9uQ2hhbmdlXCIpO2NoYW5nZUV2ZW50LnNwYXJrbGluZXM9dGhpcy5zcGxpc3Q7dGhpcy4kZWwudHJpZ2dlcihjaGFuZ2VFdmVudCk7aWYodGhpcy50b29sdGlwKXt0b29sdGlwaHRtbD1cIlwiO2ZvcihpPTA7aTxzcGNvdW50O2krKyl7c3A9c3BsaXN0W2ldO3Rvb2x0aXBodG1sKz1zcC5nZXRDdXJyZW50UmVnaW9uVG9vbHRpcCgpfXRoaXMudG9vbHRpcC5zZXRDb250ZW50KHRvb2x0aXBodG1sKX1pZighdGhpcy5kaXNhYmxlSGlnaGxpZ2h0KXt0aGlzLmNhbnZhcy5yZW5kZXIoKX19aWYocmVzdWx0PT09bnVsbCl7dGhpcy5tb3VzZWxlYXZlKCl9fX0pO1Rvb2x0aXA9Y3JlYXRlQ2xhc3Moe3NpemVTdHlsZTpcInBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDtcIitcImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XCIrXCJ2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDtcIitcImZsb2F0OiBsZWZ0ICFpbXBvcnRhbnQ7XCIsaW5pdDpmdW5jdGlvbihvcHRpb25zKXt2YXIgdG9vbHRpcENsYXNzbmFtZT1vcHRpb25zLmdldChcInRvb2x0aXBDbGFzc25hbWVcIixcImpxc3Rvb2x0aXBcIiksc2l6ZXRpcFN0eWxlPXRoaXMuc2l6ZVN0eWxlLG9mZnNldDt0aGlzLmNvbnRhaW5lcj1vcHRpb25zLmdldChcInRvb2x0aXBDb250YWluZXJcIil8fGRvY3VtZW50LmJvZHk7dGhpcy50b29sdGlwT2Zmc2V0WD1vcHRpb25zLmdldChcInRvb2x0aXBPZmZzZXRYXCIsMTApO3RoaXMudG9vbHRpcE9mZnNldFk9b3B0aW9ucy5nZXQoXCJ0b29sdGlwT2Zmc2V0WVwiLDEyKTskKFwiI2pxc3NpemV0aXBcIikucmVtb3ZlKCk7JChcIiNqcXN0b29sdGlwXCIpLnJlbW92ZSgpO3RoaXMuc2l6ZXRpcD0kKFwiPGRpdi8+XCIse2lkOlwianFzc2l6ZXRpcFwiLHN0eWxlOnNpemV0aXBTdHlsZSxcImNsYXNzXCI6dG9vbHRpcENsYXNzbmFtZX0pO3RoaXMudG9vbHRpcD0kKFwiPGRpdi8+XCIse2lkOlwianFzdG9vbHRpcFwiLFwiY2xhc3NcIjp0b29sdGlwQ2xhc3NuYW1lfSkuYXBwZW5kVG8odGhpcy5jb250YWluZXIpO29mZnNldD10aGlzLnRvb2x0aXAub2Zmc2V0KCk7dGhpcy5vZmZzZXRMZWZ0PW9mZnNldC5sZWZ0O3RoaXMub2Zmc2V0VG9wPW9mZnNldC50b3A7dGhpcy5oaWRkZW49dHJ1ZTskKHdpbmRvdykudW5iaW5kKFwicmVzaXplLmpxcyBzY3JvbGwuanFzXCIpOyQod2luZG93KS5iaW5kKFwicmVzaXplLmpxcyBzY3JvbGwuanFzXCIsJC5wcm94eSh0aGlzLnVwZGF0ZVdpbmRvd0RpbXMsdGhpcykpO3RoaXMudXBkYXRlV2luZG93RGltcygpfSx1cGRhdGVXaW5kb3dEaW1zOmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxUb3A9JCh3aW5kb3cpLnNjcm9sbFRvcCgpO3RoaXMuc2Nyb2xsTGVmdD0kKHdpbmRvdykuc2Nyb2xsTGVmdCgpO3RoaXMuc2Nyb2xsUmlnaHQ9dGhpcy5zY3JvbGxMZWZ0KyQod2luZG93KS53aWR0aCgpO3RoaXMudXBkYXRlUG9zaXRpb24oKX0sZ2V0U2l6ZTpmdW5jdGlvbihjb250ZW50KXt0aGlzLnNpemV0aXAuaHRtbChjb250ZW50KS5hcHBlbmRUbyh0aGlzLmNvbnRhaW5lcik7dGhpcy53aWR0aD10aGlzLnNpemV0aXAud2lkdGgoKSsxO3RoaXMuaGVpZ2h0PXRoaXMuc2l6ZXRpcC5oZWlnaHQoKTt0aGlzLnNpemV0aXAucmVtb3ZlKCl9LHNldENvbnRlbnQ6ZnVuY3Rpb24oY29udGVudCl7aWYoIWNvbnRlbnQpe3RoaXMudG9vbHRpcC5jc3MoXCJ2aXNpYmlsaXR5XCIsXCJoaWRkZW5cIik7dGhpcy5oaWRkZW49dHJ1ZTtyZXR1cm59dGhpcy5nZXRTaXplKGNvbnRlbnQpO3RoaXMudG9vbHRpcC5odG1sKGNvbnRlbnQpLmNzcyh7d2lkdGg6dGhpcy53aWR0aCxoZWlnaHQ6dGhpcy5oZWlnaHQsdmlzaWJpbGl0eTpcInZpc2libGVcIn0pO2lmKHRoaXMuaGlkZGVuKXt0aGlzLmhpZGRlbj1mYWxzZTt0aGlzLnVwZGF0ZVBvc2l0aW9uKCl9fSx1cGRhdGVQb3NpdGlvbjpmdW5jdGlvbih4LHkpe2lmKHg9PT11bmRlZmluZWQpe2lmKHRoaXMubW91c2V4PT09dW5kZWZpbmVkKXtyZXR1cm59eD10aGlzLm1vdXNleC10aGlzLm9mZnNldExlZnQ7eT10aGlzLm1vdXNleS10aGlzLm9mZnNldFRvcH1lbHNle3RoaXMubW91c2V4PXg9eC10aGlzLm9mZnNldExlZnQ7dGhpcy5tb3VzZXk9eT15LXRoaXMub2Zmc2V0VG9wfWlmKCF0aGlzLmhlaWdodHx8IXRoaXMud2lkdGh8fHRoaXMuaGlkZGVuKXtyZXR1cm59eS09dGhpcy5oZWlnaHQrdGhpcy50b29sdGlwT2Zmc2V0WTt4Kz10aGlzLnRvb2x0aXBPZmZzZXRYO2lmKHk8dGhpcy5zY3JvbGxUb3Ape3k9dGhpcy5zY3JvbGxUb3B9aWYoeDx0aGlzLnNjcm9sbExlZnQpe3g9dGhpcy5zY3JvbGxMZWZ0fWVsc2UgaWYoeCt0aGlzLndpZHRoPnRoaXMuc2Nyb2xsUmlnaHQpe3g9dGhpcy5zY3JvbGxSaWdodC10aGlzLndpZHRofXRoaXMudG9vbHRpcC5jc3Moe2xlZnQ6eCx0b3A6eX0pfSxyZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLnRvb2x0aXAucmVtb3ZlKCk7dGhpcy5zaXpldGlwLnJlbW92ZSgpO3RoaXMuc2l6ZXRpcD10aGlzLnRvb2x0aXA9dW5kZWZpbmVkOyQod2luZG93KS51bmJpbmQoXCJyZXNpemUuanFzIHNjcm9sbC5qcXNcIil9fSk7aW5pdFN0eWxlcz1mdW5jdGlvbigpe2FkZENTUyhkZWZhdWx0U3R5bGVzKX07JChpbml0U3R5bGVzKTtwZW5kaW5nPVtdOyQuZm4uc3BhcmtsaW5lPWZ1bmN0aW9uKHVzZXJWYWx1ZXMsdXNlck9wdGlvbnMpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgb3B0aW9ucz1uZXcgJC5mbi5zcGFya2xpbmUub3B0aW9ucyh0aGlzLHVzZXJPcHRpb25zKSwkdGhpcz0kKHRoaXMpLHJlbmRlcixpO3JlbmRlcj1mdW5jdGlvbigpe3ZhciB2YWx1ZXMsd2lkdGgsaGVpZ2h0LHRtcCxtaGFuZGxlcixzcCx2YWxzO2lmKHVzZXJWYWx1ZXM9PT1cImh0bWxcInx8dXNlclZhbHVlcz09PXVuZGVmaW5lZCl7dmFscz10aGlzLmdldEF0dHJpYnV0ZShvcHRpb25zLmdldChcInRhZ1ZhbHVlc0F0dHJpYnV0ZVwiKSk7aWYodmFscz09PXVuZGVmaW5lZHx8dmFscz09PW51bGwpe3ZhbHM9JHRoaXMuaHRtbCgpfXZhbHVlcz12YWxzLnJlcGxhY2UoLyheXFxzKjwhLS0pfCgtLT5cXHMqJCl8XFxzKy9nLFwiXCIpLnNwbGl0KFwiLFwiKX1lbHNle3ZhbHVlcz11c2VyVmFsdWVzfXdpZHRoPW9wdGlvbnMuZ2V0KFwid2lkdGhcIik9PT1cImF1dG9cIj92YWx1ZXMubGVuZ3RoKm9wdGlvbnMuZ2V0KFwiZGVmYXVsdFBpeGVsc1BlclZhbHVlXCIpOm9wdGlvbnMuZ2V0KFwid2lkdGhcIik7aWYob3B0aW9ucy5nZXQoXCJoZWlnaHRcIik9PT1cImF1dG9cIil7aWYoIW9wdGlvbnMuZ2V0KFwiY29tcG9zaXRlXCIpfHwhJC5kYXRhKHRoaXMsXCJfanFzX3ZjYW52YXNcIikpe3RtcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTt0bXAuaW5uZXJIVE1MPVwiYVwiOyR0aGlzLmh0bWwodG1wKTtoZWlnaHQ9JCh0bXApLmlubmVySGVpZ2h0KCl8fCQodG1wKS5oZWlnaHQoKTskKHRtcCkucmVtb3ZlKCk7dG1wPW51bGx9fWVsc2V7aGVpZ2h0PW9wdGlvbnMuZ2V0KFwiaGVpZ2h0XCIpfWlmKCFvcHRpb25zLmdldChcImRpc2FibGVJbnRlcmFjdGlvblwiKSl7bWhhbmRsZXI9JC5kYXRhKHRoaXMsXCJfanFzX21oYW5kbGVyXCIpO2lmKCFtaGFuZGxlcil7bWhhbmRsZXI9bmV3IE1vdXNlSGFuZGxlcih0aGlzLG9wdGlvbnMpOyQuZGF0YSh0aGlzLFwiX2pxc19taGFuZGxlclwiLG1oYW5kbGVyKX1lbHNlIGlmKCFvcHRpb25zLmdldChcImNvbXBvc2l0ZVwiKSl7bWhhbmRsZXIucmVzZXQoKX19ZWxzZXttaGFuZGxlcj1mYWxzZX1pZihvcHRpb25zLmdldChcImNvbXBvc2l0ZVwiKSYmISQuZGF0YSh0aGlzLFwiX2pxc192Y2FudmFzXCIpKXtpZighJC5kYXRhKHRoaXMsXCJfanFzX2Vycm5vdGlmeVwiKSl7YWxlcnQoXCJBdHRlbXB0ZWQgdG8gYXR0YWNoIGEgY29tcG9zaXRlIHNwYXJrbGluZSB0byBhbiBlbGVtZW50IHdpdGggbm8gZXhpc3Rpbmcgc3BhcmtsaW5lXCIpOyQuZGF0YSh0aGlzLFwiX2pxc19lcnJub3RpZnlcIix0cnVlKX1yZXR1cm59c3A9bmV3KCQuZm4uc3BhcmtsaW5lW29wdGlvbnMuZ2V0KFwidHlwZVwiKV0pKHRoaXMsdmFsdWVzLG9wdGlvbnMsd2lkdGgsaGVpZ2h0KTtzcC5yZW5kZXIoKTtpZihtaGFuZGxlcil7bWhhbmRsZXIucmVnaXN0ZXJTcGFya2xpbmUoc3ApfX07aWYoJCh0aGlzKS5odG1sKCkmJiFvcHRpb25zLmdldChcImRpc2FibGVIaWRkZW5DaGVja1wiKSYmJCh0aGlzKS5pcyhcIjpoaWRkZW5cIil8fCEkKHRoaXMpLnBhcmVudHMoXCJib2R5XCIpLmxlbmd0aCl7aWYoIW9wdGlvbnMuZ2V0KFwiY29tcG9zaXRlXCIpJiYkLmRhdGEodGhpcyxcIl9qcXNfcGVuZGluZ1wiKSl7Zm9yKGk9cGVuZGluZy5sZW5ndGg7aTtpLS0pe2lmKHBlbmRpbmdbaS0xXVswXT09dGhpcyl7cGVuZGluZy5zcGxpY2UoaS0xLDEpfX19cGVuZGluZy5wdXNoKFt0aGlzLHJlbmRlcl0pOyQuZGF0YSh0aGlzLFwiX2pxc19wZW5kaW5nXCIsdHJ1ZSl9ZWxzZXtyZW5kZXIuY2FsbCh0aGlzKX19KX07JC5mbi5zcGFya2xpbmUuZGVmYXVsdHM9Z2V0RGVmYXVsdHMoKTskLnNwYXJrbGluZV9kaXNwbGF5X3Zpc2libGU9ZnVuY3Rpb24oKXt2YXIgZWwsaSxwbDt2YXIgZG9uZT1bXTtmb3IoaT0wLHBsPXBlbmRpbmcubGVuZ3RoO2k8cGw7aSsrKXtlbD1wZW5kaW5nW2ldWzBdO2lmKCQoZWwpLmlzKFwiOnZpc2libGVcIikmJiEkKGVsKS5wYXJlbnRzKCkuaXMoXCI6aGlkZGVuXCIpKXtwZW5kaW5nW2ldWzFdLmNhbGwoZWwpOyQuZGF0YShwZW5kaW5nW2ldWzBdLFwiX2pxc19wZW5kaW5nXCIsZmFsc2UpO2RvbmUucHVzaChpKX1lbHNlIGlmKCEkKGVsKS5jbG9zZXN0KFwiaHRtbFwiKS5sZW5ndGgmJiEkLmRhdGEoZWwsXCJfanFzX3BlbmRpbmdcIikpeyQuZGF0YShwZW5kaW5nW2ldWzBdLFwiX2pxc19wZW5kaW5nXCIsZmFsc2UpO2RvbmUucHVzaChpKX19Zm9yKGk9ZG9uZS5sZW5ndGg7aTtpLS0pe3BlbmRpbmcuc3BsaWNlKGRvbmVbaS0xXSwxKX19OyQuZm4uc3BhcmtsaW5lLm9wdGlvbnM9Y3JlYXRlQ2xhc3Moe2luaXQ6ZnVuY3Rpb24odGFnLHVzZXJPcHRpb25zKXt2YXIgZXh0ZW5kZWRPcHRpb25zLGRlZmF1bHRzLGJhc2UsdGFnT3B0aW9uVHlwZTt0aGlzLnVzZXJPcHRpb25zPXVzZXJPcHRpb25zPXVzZXJPcHRpb25zfHx7fTt0aGlzLnRhZz10YWc7dGhpcy50YWdWYWxDYWNoZT17fTtkZWZhdWx0cz0kLmZuLnNwYXJrbGluZS5kZWZhdWx0cztiYXNlPWRlZmF1bHRzLmNvbW1vbjt0aGlzLnRhZ09wdGlvbnNQcmVmaXg9dXNlck9wdGlvbnMuZW5hYmxlVGFnT3B0aW9ucyYmKHVzZXJPcHRpb25zLnRhZ09wdGlvbnNQcmVmaXh8fGJhc2UudGFnT3B0aW9uc1ByZWZpeCk7dGFnT3B0aW9uVHlwZT10aGlzLmdldFRhZ1NldHRpbmcoXCJ0eXBlXCIpO2lmKHRhZ09wdGlvblR5cGU9PT1VTlNFVF9PUFRJT04pe2V4dGVuZGVkT3B0aW9ucz1kZWZhdWx0c1t1c2VyT3B0aW9ucy50eXBlfHxiYXNlLnR5cGVdfWVsc2V7ZXh0ZW5kZWRPcHRpb25zPWRlZmF1bHRzW3RhZ09wdGlvblR5cGVdfXRoaXMubWVyZ2VkT3B0aW9ucz0kLmV4dGVuZCh7fSxiYXNlLGV4dGVuZGVkT3B0aW9ucyx1c2VyT3B0aW9ucyl9LGdldFRhZ1NldHRpbmc6ZnVuY3Rpb24oa2V5KXt2YXIgcHJlZml4PXRoaXMudGFnT3B0aW9uc1ByZWZpeCx2YWwsaSxwYWlycyxrZXl2YWw7aWYocHJlZml4PT09ZmFsc2V8fHByZWZpeD09PXVuZGVmaW5lZCl7cmV0dXJuIFVOU0VUX09QVElPTn1pZih0aGlzLnRhZ1ZhbENhY2hlLmhhc093blByb3BlcnR5KGtleSkpe3ZhbD10aGlzLnRhZ1ZhbENhY2hlLmtleX1lbHNle3ZhbD10aGlzLnRhZy5nZXRBdHRyaWJ1dGUocHJlZml4K2tleSk7aWYodmFsPT09dW5kZWZpbmVkfHx2YWw9PT1udWxsKXt2YWw9VU5TRVRfT1BUSU9OfWVsc2UgaWYodmFsLnN1YnN0cigwLDEpPT09XCJbXCIpe3ZhbD12YWwuc3Vic3RyKDEsdmFsLmxlbmd0aC0yKS5zcGxpdChcIixcIik7Zm9yKGk9dmFsLmxlbmd0aDtpLS07KXt2YWxbaV09bm9ybWFsaXplVmFsdWUodmFsW2ldLnJlcGxhY2UoLyheXFxzKil8KFxccyokKS9nLFwiXCIpKX19ZWxzZSBpZih2YWwuc3Vic3RyKDAsMSk9PT1cIntcIil7cGFpcnM9dmFsLnN1YnN0cigxLHZhbC5sZW5ndGgtMikuc3BsaXQoXCIsXCIpO3ZhbD17fTtmb3IoaT1wYWlycy5sZW5ndGg7aS0tOyl7a2V5dmFsPXBhaXJzW2ldLnNwbGl0KFwiOlwiLDIpO3ZhbFtrZXl2YWxbMF0ucmVwbGFjZSgvKF5cXHMqKXwoXFxzKiQpL2csXCJcIildPW5vcm1hbGl6ZVZhbHVlKGtleXZhbFsxXS5yZXBsYWNlKC8oXlxccyopfChcXHMqJCkvZyxcIlwiKSl9fWVsc2V7dmFsPW5vcm1hbGl6ZVZhbHVlKHZhbCl9dGhpcy50YWdWYWxDYWNoZS5rZXk9dmFsfXJldHVybiB2YWx9LGdldDpmdW5jdGlvbihrZXksZGVmYXVsdHZhbCl7dmFyIHRhZ09wdGlvbj10aGlzLmdldFRhZ1NldHRpbmcoa2V5KSxyZXN1bHQ7aWYodGFnT3B0aW9uIT09VU5TRVRfT1BUSU9OKXtyZXR1cm4gdGFnT3B0aW9ufXJldHVybihyZXN1bHQ9dGhpcy5tZXJnZWRPcHRpb25zW2tleV0pPT09dW5kZWZpbmVkP2RlZmF1bHR2YWw6cmVzdWx0fX0pOyQuZm4uc3BhcmtsaW5lLl9iYXNlPWNyZWF0ZUNsYXNzKHtkaXNhYmxlZDpmYWxzZSxpbml0OmZ1bmN0aW9uKGVsLHZhbHVlcyxvcHRpb25zLHdpZHRoLGhlaWdodCl7dGhpcy5lbD1lbDt0aGlzLiRlbD0kKGVsKTt0aGlzLnZhbHVlcz12YWx1ZXM7dGhpcy5vcHRpb25zPW9wdGlvbnM7dGhpcy53aWR0aD13aWR0aDt0aGlzLmhlaWdodD1oZWlnaHQ7dGhpcy5jdXJyZW50UmVnaW9uPXVuZGVmaW5lZH0saW5pdFRhcmdldDpmdW5jdGlvbigpe3ZhciBpbnRlcmFjdGl2ZT0hdGhpcy5vcHRpb25zLmdldChcImRpc2FibGVJbnRlcmFjdGlvblwiKTtpZighKHRoaXMudGFyZ2V0PXRoaXMuJGVsLnNpbXBsZWRyYXcodGhpcy53aWR0aCx0aGlzLmhlaWdodCx0aGlzLm9wdGlvbnMuZ2V0KFwiY29tcG9zaXRlXCIpLGludGVyYWN0aXZlKSkpe3RoaXMuZGlzYWJsZWQ9dHJ1ZX1lbHNle3RoaXMuY2FudmFzV2lkdGg9dGhpcy50YXJnZXQucGl4ZWxXaWR0aDt0aGlzLmNhbnZhc0hlaWdodD10aGlzLnRhcmdldC5waXhlbEhlaWdodH19LHJlbmRlcjpmdW5jdGlvbigpe2lmKHRoaXMuZGlzYWJsZWQpe3RoaXMuZWwuaW5uZXJIVE1MPVwiXCI7cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfSxnZXRSZWdpb246ZnVuY3Rpb24oeCx5KXt9LHNldFJlZ2lvbkhpZ2hsaWdodDpmdW5jdGlvbihlbCx4LHkpe3ZhciBjdXJyZW50UmVnaW9uPXRoaXMuY3VycmVudFJlZ2lvbixoaWdobGlnaHRFbmFibGVkPSF0aGlzLm9wdGlvbnMuZ2V0KFwiZGlzYWJsZUhpZ2hsaWdodFwiKSxuZXdSZWdpb247aWYoeD50aGlzLmNhbnZhc1dpZHRofHx5PnRoaXMuY2FudmFzSGVpZ2h0fHx4PDB8fHk8MCl7cmV0dXJuIG51bGx9bmV3UmVnaW9uPXRoaXMuZ2V0UmVnaW9uKGVsLHgseSk7aWYoY3VycmVudFJlZ2lvbiE9PW5ld1JlZ2lvbil7aWYoY3VycmVudFJlZ2lvbiE9PXVuZGVmaW5lZCYmaGlnaGxpZ2h0RW5hYmxlZCl7dGhpcy5yZW1vdmVIaWdobGlnaHQoKX10aGlzLmN1cnJlbnRSZWdpb249bmV3UmVnaW9uO2lmKG5ld1JlZ2lvbiE9PXVuZGVmaW5lZCYmaGlnaGxpZ2h0RW5hYmxlZCl7dGhpcy5yZW5kZXJIaWdobGlnaHQoKX1yZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9LGNsZWFyUmVnaW9uSGlnaGxpZ2h0OmZ1bmN0aW9uKCl7aWYodGhpcy5jdXJyZW50UmVnaW9uIT09dW5kZWZpbmVkKXt0aGlzLnJlbW92ZUhpZ2hsaWdodCgpO3RoaXMuY3VycmVudFJlZ2lvbj11bmRlZmluZWQ7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfSxyZW5kZXJIaWdobGlnaHQ6ZnVuY3Rpb24oKXt0aGlzLmNoYW5nZUhpZ2hsaWdodCh0cnVlKX0scmVtb3ZlSGlnaGxpZ2h0OmZ1bmN0aW9uKCl7dGhpcy5jaGFuZ2VIaWdobGlnaHQoZmFsc2UpfSxjaGFuZ2VIaWdobGlnaHQ6ZnVuY3Rpb24oaGlnaGxpZ2h0KXt9LGdldEN1cnJlbnRSZWdpb25Ub29sdGlwOmZ1bmN0aW9uKCl7dmFyIG9wdGlvbnM9dGhpcy5vcHRpb25zLGhlYWRlcj1cIlwiLGVudHJpZXM9W10sZmllbGRzLGZvcm1hdHMsZm9ybWF0bGVuLGZjbGFzcyx0ZXh0LGksc2hvd0ZpZWxkcyxzaG93RmllbGRzS2V5LG5ld0ZpZWxkcyxmdixmb3JtYXR0ZXIsZm9ybWF0LGZpZWxkbGVuLGo7aWYodGhpcy5jdXJyZW50UmVnaW9uPT09dW5kZWZpbmVkKXtyZXR1cm5cIlwifWZpZWxkcz10aGlzLmdldEN1cnJlbnRSZWdpb25GaWVsZHMoKTtmb3JtYXR0ZXI9b3B0aW9ucy5nZXQoXCJ0b29sdGlwRm9ybWF0dGVyXCIpO2lmKGZvcm1hdHRlcil7cmV0dXJuIGZvcm1hdHRlcih0aGlzLG9wdGlvbnMsZmllbGRzKX1pZihvcHRpb25zLmdldChcInRvb2x0aXBDaGFydFRpdGxlXCIpKXtoZWFkZXIrPSc8ZGl2IGNsYXNzPVwianFzIGpxc3RpdGxlXCI+JytvcHRpb25zLmdldChcInRvb2x0aXBDaGFydFRpdGxlXCIpK1wiPC9kaXY+XFxuXCJ9Zm9ybWF0cz10aGlzLm9wdGlvbnMuZ2V0KFwidG9vbHRpcEZvcm1hdFwiKTtpZighZm9ybWF0cyl7cmV0dXJuXCJcIn1pZighJC5pc0FycmF5KGZvcm1hdHMpKXtmb3JtYXRzPVtmb3JtYXRzXX1pZighJC5pc0FycmF5KGZpZWxkcykpe2ZpZWxkcz1bZmllbGRzXX1zaG93RmllbGRzPXRoaXMub3B0aW9ucy5nZXQoXCJ0b29sdGlwRm9ybWF0RmllbGRsaXN0XCIpO3Nob3dGaWVsZHNLZXk9dGhpcy5vcHRpb25zLmdldChcInRvb2x0aXBGb3JtYXRGaWVsZGxpc3RLZXlcIik7aWYoc2hvd0ZpZWxkcyYmc2hvd0ZpZWxkc0tleSl7bmV3RmllbGRzPVtdO2ZvcihpPWZpZWxkcy5sZW5ndGg7aS0tOyl7ZnY9ZmllbGRzW2ldW3Nob3dGaWVsZHNLZXldO2lmKChqPSQuaW5BcnJheShmdixzaG93RmllbGRzKSkhPS0xKXtuZXdGaWVsZHNbal09ZmllbGRzW2ldfX1maWVsZHM9bmV3RmllbGRzfWZvcm1hdGxlbj1mb3JtYXRzLmxlbmd0aDtmaWVsZGxlbj1maWVsZHMubGVuZ3RoO2ZvcihpPTA7aTxmb3JtYXRsZW47aSsrKXtmb3JtYXQ9Zm9ybWF0c1tpXTtpZih0eXBlb2YgZm9ybWF0PT09XCJzdHJpbmdcIil7Zm9ybWF0PW5ldyBTUEZvcm1hdChmb3JtYXQpfWZjbGFzcz1mb3JtYXQuZmNsYXNzfHxcImpxc2ZpZWxkXCI7Zm9yKGo9MDtqPGZpZWxkbGVuO2orKyl7aWYoIWZpZWxkc1tqXS5pc051bGx8fCFvcHRpb25zLmdldChcInRvb2x0aXBTa2lwTnVsbFwiKSl7JC5leHRlbmQoZmllbGRzW2pdLHtwcmVmaXg6b3B0aW9ucy5nZXQoXCJ0b29sdGlwUHJlZml4XCIpLHN1ZmZpeDpvcHRpb25zLmdldChcInRvb2x0aXBTdWZmaXhcIil9KTt0ZXh0PWZvcm1hdC5yZW5kZXIoZmllbGRzW2pdLG9wdGlvbnMuZ2V0KFwidG9vbHRpcFZhbHVlTG9va3Vwc1wiKSxvcHRpb25zKTtlbnRyaWVzLnB1c2goJzxkaXYgY2xhc3M9XCInK2ZjbGFzcysnXCI+Jyt0ZXh0K1wiPC9kaXY+XCIpfX19aWYoZW50cmllcy5sZW5ndGgpe3JldHVybiBoZWFkZXIrZW50cmllcy5qb2luKFwiXFxuXCIpfXJldHVyblwiXCJ9LGdldEN1cnJlbnRSZWdpb25GaWVsZHM6ZnVuY3Rpb24oKXt9LGNhbGNIaWdobGlnaHRDb2xvcjpmdW5jdGlvbihjb2xvcixvcHRpb25zKXt2YXIgaGlnaGxpZ2h0Q29sb3I9b3B0aW9ucy5nZXQoXCJoaWdobGlnaHRDb2xvclwiKSxsaWdodGVuPW9wdGlvbnMuZ2V0KFwiaGlnaGxpZ2h0TGlnaHRlblwiKSxwYXJzZSxtdWx0LHJnYm5ldyxpO2lmKGhpZ2hsaWdodENvbG9yKXtyZXR1cm4gaGlnaGxpZ2h0Q29sb3J9aWYobGlnaHRlbil7cGFyc2U9L14jKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pJC9pLmV4ZWMoY29sb3IpfHwvXiMoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkkL2kuZXhlYyhjb2xvcik7aWYocGFyc2Upe3JnYm5ldz1bXTttdWx0PWNvbG9yLmxlbmd0aD09PTQ/MTY6MTtmb3IoaT0wO2k8MztpKyspe3JnYm5ld1tpXT1jbGlwdmFsKE1hdGgucm91bmQocGFyc2VJbnQocGFyc2VbaSsxXSwxNikqbXVsdCpsaWdodGVuKSwwLDI1NSl9cmV0dXJuXCJyZ2IoXCIrcmdibmV3LmpvaW4oXCIsXCIpK1wiKVwifX1yZXR1cm4gY29sb3J9fSk7YmFySGlnaGxpZ2h0TWl4aW49e2NoYW5nZUhpZ2hsaWdodDpmdW5jdGlvbihoaWdobGlnaHQpe3ZhciBjdXJyZW50UmVnaW9uPXRoaXMuY3VycmVudFJlZ2lvbix0YXJnZXQ9dGhpcy50YXJnZXQsc2hhcGVpZHM9dGhpcy5yZWdpb25TaGFwZXNbY3VycmVudFJlZ2lvbl0sbmV3U2hhcGVzO2lmKHNoYXBlaWRzKXtuZXdTaGFwZXM9dGhpcy5yZW5kZXJSZWdpb24oY3VycmVudFJlZ2lvbixoaWdobGlnaHQpO2lmKCQuaXNBcnJheShuZXdTaGFwZXMpfHwkLmlzQXJyYXkoc2hhcGVpZHMpKXt0YXJnZXQucmVwbGFjZVdpdGhTaGFwZXMoc2hhcGVpZHMsbmV3U2hhcGVzKTt0aGlzLnJlZ2lvblNoYXBlc1tjdXJyZW50UmVnaW9uXT0kLm1hcChuZXdTaGFwZXMsZnVuY3Rpb24obmV3U2hhcGUpe3JldHVybiBuZXdTaGFwZS5pZH0pfWVsc2V7dGFyZ2V0LnJlcGxhY2VXaXRoU2hhcGUoc2hhcGVpZHMsbmV3U2hhcGVzKTt0aGlzLnJlZ2lvblNoYXBlc1tjdXJyZW50UmVnaW9uXT1uZXdTaGFwZXMuaWR9fX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIHZhbHVlcz10aGlzLnZhbHVlcyx0YXJnZXQ9dGhpcy50YXJnZXQscmVnaW9uU2hhcGVzPXRoaXMucmVnaW9uU2hhcGVzLHNoYXBlcyxpZHMsaSxqO2lmKCF0aGlzLmNscy5fc3VwZXIucmVuZGVyLmNhbGwodGhpcykpe3JldHVybn1mb3IoaT12YWx1ZXMubGVuZ3RoO2ktLTspe3NoYXBlcz10aGlzLnJlbmRlclJlZ2lvbihpKTtpZihzaGFwZXMpe2lmKCQuaXNBcnJheShzaGFwZXMpKXtpZHM9W107Zm9yKGo9c2hhcGVzLmxlbmd0aDtqLS07KXtzaGFwZXNbal0uYXBwZW5kKCk7aWRzLnB1c2goc2hhcGVzW2pdLmlkKX1yZWdpb25TaGFwZXNbaV09aWRzfWVsc2V7c2hhcGVzLmFwcGVuZCgpO3JlZ2lvblNoYXBlc1tpXT1zaGFwZXMuaWR9fWVsc2V7cmVnaW9uU2hhcGVzW2ldPW51bGx9fXRhcmdldC5yZW5kZXIoKX19OyQuZm4uc3BhcmtsaW5lLmxpbmU9bGluZT1jcmVhdGVDbGFzcygkLmZuLnNwYXJrbGluZS5fYmFzZSx7dHlwZTpcImxpbmVcIixpbml0OmZ1bmN0aW9uKGVsLHZhbHVlcyxvcHRpb25zLHdpZHRoLGhlaWdodCl7bGluZS5fc3VwZXIuaW5pdC5jYWxsKHRoaXMsZWwsdmFsdWVzLG9wdGlvbnMsd2lkdGgsaGVpZ2h0KTt0aGlzLnZlcnRpY2VzPVtdO3RoaXMucmVnaW9uTWFwPVtdO3RoaXMueHZhbHVlcz1bXTt0aGlzLnl2YWx1ZXM9W107dGhpcy55bWlubWF4PVtdO3RoaXMuaGlnaHRsaWdodFNwb3RJZD1udWxsO3RoaXMubGFzdFNoYXBlSWQ9bnVsbDt0aGlzLmluaXRUYXJnZXQoKX0sZ2V0UmVnaW9uOmZ1bmN0aW9uKGVsLHgseSl7dmFyIGkscmVnaW9uTWFwPXRoaXMucmVnaW9uTWFwO2ZvcihpPXJlZ2lvbk1hcC5sZW5ndGg7aS0tOyl7aWYocmVnaW9uTWFwW2ldIT09bnVsbCYmeD49cmVnaW9uTWFwW2ldWzBdJiZ4PD1yZWdpb25NYXBbaV1bMV0pe3JldHVybiByZWdpb25NYXBbaV1bMl19fXJldHVybiB1bmRlZmluZWR9LGdldEN1cnJlbnRSZWdpb25GaWVsZHM6ZnVuY3Rpb24oKXt2YXIgY3VycmVudFJlZ2lvbj10aGlzLmN1cnJlbnRSZWdpb247cmV0dXJue2lzTnVsbDp0aGlzLnl2YWx1ZXNbY3VycmVudFJlZ2lvbl09PT1udWxsLHg6dGhpcy54dmFsdWVzW2N1cnJlbnRSZWdpb25dLHk6dGhpcy55dmFsdWVzW2N1cnJlbnRSZWdpb25dLGNvbG9yOnRoaXMub3B0aW9ucy5nZXQoXCJsaW5lQ29sb3JcIiksZmlsbENvbG9yOnRoaXMub3B0aW9ucy5nZXQoXCJmaWxsQ29sb3JcIiksb2Zmc2V0OmN1cnJlbnRSZWdpb259fSxyZW5kZXJIaWdobGlnaHQ6ZnVuY3Rpb24oKXt2YXIgY3VycmVudFJlZ2lvbj10aGlzLmN1cnJlbnRSZWdpb24sdGFyZ2V0PXRoaXMudGFyZ2V0LHZlcnRleD10aGlzLnZlcnRpY2VzW2N1cnJlbnRSZWdpb25dLG9wdGlvbnM9dGhpcy5vcHRpb25zLHNwb3RSYWRpdXM9b3B0aW9ucy5nZXQoXCJzcG90UmFkaXVzXCIpLGhpZ2hsaWdodFNwb3RDb2xvcj1vcHRpb25zLmdldChcImhpZ2hsaWdodFNwb3RDb2xvclwiKSxoaWdobGlnaHRMaW5lQ29sb3I9b3B0aW9ucy5nZXQoXCJoaWdobGlnaHRMaW5lQ29sb3JcIiksaGlnaGxpZ2h0U3BvdCxoaWdobGlnaHRMaW5lO2lmKCF2ZXJ0ZXgpe3JldHVybn1pZihzcG90UmFkaXVzJiZoaWdobGlnaHRTcG90Q29sb3Ipe2hpZ2hsaWdodFNwb3Q9dGFyZ2V0LmRyYXdDaXJjbGUodmVydGV4WzBdLHZlcnRleFsxXSxzcG90UmFkaXVzLHVuZGVmaW5lZCxoaWdobGlnaHRTcG90Q29sb3IpO3RoaXMuaGlnaGxpZ2h0U3BvdElkPWhpZ2hsaWdodFNwb3QuaWQ7dGFyZ2V0Lmluc2VydEFmdGVyU2hhcGUodGhpcy5sYXN0U2hhcGVJZCxoaWdobGlnaHRTcG90KX1pZihoaWdobGlnaHRMaW5lQ29sb3Ipe2hpZ2hsaWdodExpbmU9dGFyZ2V0LmRyYXdMaW5lKHZlcnRleFswXSx0aGlzLmNhbnZhc1RvcCx2ZXJ0ZXhbMF0sdGhpcy5jYW52YXNUb3ArdGhpcy5jYW52YXNIZWlnaHQsaGlnaGxpZ2h0TGluZUNvbG9yKTt0aGlzLmhpZ2hsaWdodExpbmVJZD1oaWdobGlnaHRMaW5lLmlkO3RhcmdldC5pbnNlcnRBZnRlclNoYXBlKHRoaXMubGFzdFNoYXBlSWQsaGlnaGxpZ2h0TGluZSl9fSxyZW1vdmVIaWdobGlnaHQ6ZnVuY3Rpb24oKXt2YXIgdGFyZ2V0PXRoaXMudGFyZ2V0O2lmKHRoaXMuaGlnaGxpZ2h0U3BvdElkKXt0YXJnZXQucmVtb3ZlU2hhcGVJZCh0aGlzLmhpZ2hsaWdodFNwb3RJZCk7dGhpcy5oaWdobGlnaHRTcG90SWQ9bnVsbH1pZih0aGlzLmhpZ2hsaWdodExpbmVJZCl7dGFyZ2V0LnJlbW92ZVNoYXBlSWQodGhpcy5oaWdobGlnaHRMaW5lSWQpO3RoaXMuaGlnaGxpZ2h0TGluZUlkPW51bGx9fSxzY2FuVmFsdWVzOmZ1bmN0aW9uKCl7dmFyIHZhbHVlcz10aGlzLnZhbHVlcyx2YWxjb3VudD12YWx1ZXMubGVuZ3RoLHh2YWx1ZXM9dGhpcy54dmFsdWVzLHl2YWx1ZXM9dGhpcy55dmFsdWVzLHltaW5tYXg9dGhpcy55bWlubWF4LGksdmFsLGlzU3RyLGlzQXJyYXksc3A7Zm9yKGk9MDtpPHZhbGNvdW50O2krKyl7dmFsPXZhbHVlc1tpXTtpc1N0cj10eXBlb2YgdmFsdWVzW2ldPT09XCJzdHJpbmdcIjtpc0FycmF5PXR5cGVvZiB2YWx1ZXNbaV09PT1cIm9iamVjdFwiJiZ2YWx1ZXNbaV1pbnN0YW5jZW9mIEFycmF5O3NwPWlzU3RyJiZ2YWx1ZXNbaV0uc3BsaXQoXCI6XCIpO2lmKGlzU3RyJiZzcC5sZW5ndGg9PT0yKXt4dmFsdWVzLnB1c2goTnVtYmVyKHNwWzBdKSk7eXZhbHVlcy5wdXNoKE51bWJlcihzcFsxXSkpO3ltaW5tYXgucHVzaChOdW1iZXIoc3BbMV0pKX1lbHNlIGlmKGlzQXJyYXkpe3h2YWx1ZXMucHVzaCh2YWxbMF0pO3l2YWx1ZXMucHVzaCh2YWxbMV0pO3ltaW5tYXgucHVzaCh2YWxbMV0pfWVsc2V7eHZhbHVlcy5wdXNoKGkpO2lmKHZhbHVlc1tpXT09PW51bGx8fHZhbHVlc1tpXT09PVwibnVsbFwiKXt5dmFsdWVzLnB1c2gobnVsbCl9ZWxzZXt5dmFsdWVzLnB1c2goTnVtYmVyKHZhbCkpO3ltaW5tYXgucHVzaChOdW1iZXIodmFsKSl9fX1pZih0aGlzLm9wdGlvbnMuZ2V0KFwieHZhbHVlc1wiKSl7eHZhbHVlcz10aGlzLm9wdGlvbnMuZ2V0KFwieHZhbHVlc1wiKX10aGlzLm1heHk9dGhpcy5tYXh5b3JnPU1hdGgubWF4LmFwcGx5KE1hdGgseW1pbm1heCk7dGhpcy5taW55PXRoaXMubWlueW9yZz1NYXRoLm1pbi5hcHBseShNYXRoLHltaW5tYXgpO3RoaXMubWF4eD1NYXRoLm1heC5hcHBseShNYXRoLHh2YWx1ZXMpO3RoaXMubWlueD1NYXRoLm1pbi5hcHBseShNYXRoLHh2YWx1ZXMpO3RoaXMueHZhbHVlcz14dmFsdWVzO3RoaXMueXZhbHVlcz15dmFsdWVzO3RoaXMueW1pbm1heD15bWlubWF4fSxwcm9jZXNzUmFuZ2VPcHRpb25zOmZ1bmN0aW9uKCl7dmFyIG9wdGlvbnM9dGhpcy5vcHRpb25zLG5vcm1hbFJhbmdlTWluPW9wdGlvbnMuZ2V0KFwibm9ybWFsUmFuZ2VNaW5cIiksbm9ybWFsUmFuZ2VNYXg9b3B0aW9ucy5nZXQoXCJub3JtYWxSYW5nZU1heFwiKTtpZihub3JtYWxSYW5nZU1pbiE9PXVuZGVmaW5lZCl7aWYobm9ybWFsUmFuZ2VNaW48dGhpcy5taW55KXt0aGlzLm1pbnk9bm9ybWFsUmFuZ2VNaW59aWYobm9ybWFsUmFuZ2VNYXg+dGhpcy5tYXh5KXt0aGlzLm1heHk9bm9ybWFsUmFuZ2VNYXh9fWlmKG9wdGlvbnMuZ2V0KFwiY2hhcnRSYW5nZU1pblwiKSE9PXVuZGVmaW5lZCYmKG9wdGlvbnMuZ2V0KFwiY2hhcnRSYW5nZUNsaXBcIil8fG9wdGlvbnMuZ2V0KFwiY2hhcnRSYW5nZU1pblwiKTx0aGlzLm1pbnkpKXt0aGlzLm1pbnk9b3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlTWluXCIpfWlmKG9wdGlvbnMuZ2V0KFwiY2hhcnRSYW5nZU1heFwiKSE9PXVuZGVmaW5lZCYmKG9wdGlvbnMuZ2V0KFwiY2hhcnRSYW5nZUNsaXBcIil8fG9wdGlvbnMuZ2V0KFwiY2hhcnRSYW5nZU1heFwiKT50aGlzLm1heHkpKXt0aGlzLm1heHk9b3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlTWF4XCIpfWlmKG9wdGlvbnMuZ2V0KFwiY2hhcnRSYW5nZU1pblhcIikhPT11bmRlZmluZWQmJihvcHRpb25zLmdldChcImNoYXJ0UmFuZ2VDbGlwWFwiKXx8b3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlTWluWFwiKTx0aGlzLm1pbngpKXt0aGlzLm1pbng9b3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlTWluWFwiKX1pZihvcHRpb25zLmdldChcImNoYXJ0UmFuZ2VNYXhYXCIpIT09dW5kZWZpbmVkJiYob3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlQ2xpcFhcIil8fG9wdGlvbnMuZ2V0KFwiY2hhcnRSYW5nZU1heFhcIik+dGhpcy5tYXh4KSl7dGhpcy5tYXh4PW9wdGlvbnMuZ2V0KFwiY2hhcnRSYW5nZU1heFhcIil9fSxkcmF3Tm9ybWFsUmFuZ2U6ZnVuY3Rpb24oY2FudmFzTGVmdCxjYW52YXNUb3AsY2FudmFzSGVpZ2h0LGNhbnZhc1dpZHRoLHJhbmdleSl7dmFyIG5vcm1hbFJhbmdlTWluPXRoaXMub3B0aW9ucy5nZXQoXCJub3JtYWxSYW5nZU1pblwiKSxub3JtYWxSYW5nZU1heD10aGlzLm9wdGlvbnMuZ2V0KFwibm9ybWFsUmFuZ2VNYXhcIikseXRvcD1jYW52YXNUb3ArTWF0aC5yb3VuZChjYW52YXNIZWlnaHQtY2FudmFzSGVpZ2h0Kigobm9ybWFsUmFuZ2VNYXgtdGhpcy5taW55KS9yYW5nZXkpKSxoZWlnaHQ9TWF0aC5yb3VuZChjYW52YXNIZWlnaHQqKG5vcm1hbFJhbmdlTWF4LW5vcm1hbFJhbmdlTWluKS9yYW5nZXkpO3RoaXMudGFyZ2V0LmRyYXdSZWN0KGNhbnZhc0xlZnQseXRvcCxjYW52YXNXaWR0aCxoZWlnaHQsdW5kZWZpbmVkLHRoaXMub3B0aW9ucy5nZXQoXCJub3JtYWxSYW5nZUNvbG9yXCIpKS5hcHBlbmQoKX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIG9wdGlvbnM9dGhpcy5vcHRpb25zLHRhcmdldD10aGlzLnRhcmdldCxjYW52YXNXaWR0aD10aGlzLmNhbnZhc1dpZHRoLGNhbnZhc0hlaWdodD10aGlzLmNhbnZhc0hlaWdodCx2ZXJ0aWNlcz10aGlzLnZlcnRpY2VzLHNwb3RSYWRpdXM9b3B0aW9ucy5nZXQoXCJzcG90UmFkaXVzXCIpLHJlZ2lvbk1hcD10aGlzLnJlZ2lvbk1hcCxyYW5nZXgscmFuZ2V5LHl2YWxsYXN0LGNhbnZhc1RvcCxjYW52YXNMZWZ0LHZlcnRleCxwYXRoLHBhdGhzLHgseSx4bmV4dCx4cG9zLHhwb3NuZXh0LGxhc3QsbmV4dCx5dmFsY291bnQsbGluZVNoYXBlcyxmaWxsU2hhcGVzLHBsZW4sdmFsdWVTcG90cyxobFNwb3RzRW5hYmxlZCxjb2xvcix4dmFsdWVzLHl2YWx1ZXMsaTtpZighbGluZS5fc3VwZXIucmVuZGVyLmNhbGwodGhpcykpe3JldHVybn10aGlzLnNjYW5WYWx1ZXMoKTt0aGlzLnByb2Nlc3NSYW5nZU9wdGlvbnMoKTt4dmFsdWVzPXRoaXMueHZhbHVlczt5dmFsdWVzPXRoaXMueXZhbHVlcztpZighdGhpcy55bWlubWF4Lmxlbmd0aHx8dGhpcy55dmFsdWVzLmxlbmd0aDwyKXtyZXR1cm59Y2FudmFzVG9wPWNhbnZhc0xlZnQ9MDtyYW5nZXg9dGhpcy5tYXh4LXRoaXMubWlueD09PTA/MTp0aGlzLm1heHgtdGhpcy5taW54O3JhbmdleT10aGlzLm1heHktdGhpcy5taW55PT09MD8xOnRoaXMubWF4eS10aGlzLm1pbnk7eXZhbGxhc3Q9dGhpcy55dmFsdWVzLmxlbmd0aC0xO2lmKHNwb3RSYWRpdXMmJihjYW52YXNXaWR0aDxzcG90UmFkaXVzKjR8fGNhbnZhc0hlaWdodDxzcG90UmFkaXVzKjQpKXtzcG90UmFkaXVzPTB9aWYoc3BvdFJhZGl1cyl7aGxTcG90c0VuYWJsZWQ9b3B0aW9ucy5nZXQoXCJoaWdobGlnaHRTcG90Q29sb3JcIikmJiFvcHRpb25zLmdldChcImRpc2FibGVJbnRlcmFjdGlvblwiKTtpZihobFNwb3RzRW5hYmxlZHx8b3B0aW9ucy5nZXQoXCJtaW5TcG90Q29sb3JcIil8fG9wdGlvbnMuZ2V0KFwic3BvdENvbG9yXCIpJiZ5dmFsdWVzW3l2YWxsYXN0XT09PXRoaXMubWlueSl7Y2FudmFzSGVpZ2h0LT1NYXRoLmNlaWwoc3BvdFJhZGl1cyl9aWYoaGxTcG90c0VuYWJsZWR8fG9wdGlvbnMuZ2V0KFwibWF4U3BvdENvbG9yXCIpfHxvcHRpb25zLmdldChcInNwb3RDb2xvclwiKSYmeXZhbHVlc1t5dmFsbGFzdF09PT10aGlzLm1heHkpe2NhbnZhc0hlaWdodC09TWF0aC5jZWlsKHNwb3RSYWRpdXMpO2NhbnZhc1RvcCs9TWF0aC5jZWlsKHNwb3RSYWRpdXMpfWlmKGhsU3BvdHNFbmFibGVkfHwob3B0aW9ucy5nZXQoXCJtaW5TcG90Q29sb3JcIil8fG9wdGlvbnMuZ2V0KFwibWF4U3BvdENvbG9yXCIpKSYmKHl2YWx1ZXNbMF09PT10aGlzLm1pbnl8fHl2YWx1ZXNbMF09PT10aGlzLm1heHkpKXtjYW52YXNMZWZ0Kz1NYXRoLmNlaWwoc3BvdFJhZGl1cyk7Y2FudmFzV2lkdGgtPU1hdGguY2VpbChzcG90UmFkaXVzKX1pZihobFNwb3RzRW5hYmxlZHx8b3B0aW9ucy5nZXQoXCJzcG90Q29sb3JcIil8fChvcHRpb25zLmdldChcIm1pblNwb3RDb2xvclwiKXx8b3B0aW9ucy5nZXQoXCJtYXhTcG90Q29sb3JcIikmJih5dmFsdWVzW3l2YWxsYXN0XT09PXRoaXMubWlueXx8eXZhbHVlc1t5dmFsbGFzdF09PT10aGlzLm1heHkpKSl7Y2FudmFzV2lkdGgtPU1hdGguY2VpbChzcG90UmFkaXVzKX19Y2FudmFzSGVpZ2h0LS07aWYob3B0aW9ucy5nZXQoXCJub3JtYWxSYW5nZU1pblwiKSE9PXVuZGVmaW5lZCYmIW9wdGlvbnMuZ2V0KFwiZHJhd05vcm1hbE9uVG9wXCIpKXt0aGlzLmRyYXdOb3JtYWxSYW5nZShjYW52YXNMZWZ0LGNhbnZhc1RvcCxjYW52YXNIZWlnaHQsY2FudmFzV2lkdGgscmFuZ2V5KX1wYXRoPVtdO3BhdGhzPVtwYXRoXTtsYXN0PW5leHQ9bnVsbDt5dmFsY291bnQ9eXZhbHVlcy5sZW5ndGg7Zm9yKGk9MDtpPHl2YWxjb3VudDtpKyspe3g9eHZhbHVlc1tpXTt4bmV4dD14dmFsdWVzW2krMV07eT15dmFsdWVzW2ldO3hwb3M9Y2FudmFzTGVmdCtNYXRoLnJvdW5kKCh4LXRoaXMubWlueCkqKGNhbnZhc1dpZHRoL3JhbmdleCkpO3hwb3NuZXh0PWk8eXZhbGNvdW50LTE/Y2FudmFzTGVmdCtNYXRoLnJvdW5kKCh4bmV4dC10aGlzLm1pbngpKihjYW52YXNXaWR0aC9yYW5nZXgpKTpjYW52YXNXaWR0aDtuZXh0PXhwb3MrKHhwb3NuZXh0LXhwb3MpLzI7cmVnaW9uTWFwW2ldPVtsYXN0fHwwLG5leHQsaV07bGFzdD1uZXh0O2lmKHk9PT1udWxsKXtpZihpKXtpZih5dmFsdWVzW2ktMV0hPT1udWxsKXtwYXRoPVtdO3BhdGhzLnB1c2gocGF0aCl9dmVydGljZXMucHVzaChudWxsKX19ZWxzZXtpZih5PHRoaXMubWlueSl7eT10aGlzLm1pbnl9aWYoeT50aGlzLm1heHkpe3k9dGhpcy5tYXh5fWlmKCFwYXRoLmxlbmd0aCl7cGF0aC5wdXNoKFt4cG9zLGNhbnZhc1RvcCtjYW52YXNIZWlnaHRdKX12ZXJ0ZXg9W3hwb3MsY2FudmFzVG9wK01hdGgucm91bmQoY2FudmFzSGVpZ2h0LWNhbnZhc0hlaWdodCooKHktdGhpcy5taW55KS9yYW5nZXkpKV07cGF0aC5wdXNoKHZlcnRleCk7dmVydGljZXMucHVzaCh2ZXJ0ZXgpfX1saW5lU2hhcGVzPVtdO2ZpbGxTaGFwZXM9W107cGxlbj1wYXRocy5sZW5ndGg7Zm9yKGk9MDtpPHBsZW47aSsrKXtwYXRoPXBhdGhzW2ldO2lmKHBhdGgubGVuZ3RoKXtpZihvcHRpb25zLmdldChcImZpbGxDb2xvclwiKSl7cGF0aC5wdXNoKFtwYXRoW3BhdGgubGVuZ3RoLTFdWzBdLGNhbnZhc1RvcCtjYW52YXNIZWlnaHRdKTtmaWxsU2hhcGVzLnB1c2gocGF0aC5zbGljZSgwKSk7cGF0aC5wb3AoKX1pZihwYXRoLmxlbmd0aD4yKXtwYXRoWzBdPVtwYXRoWzBdWzBdLHBhdGhbMV1bMV1dfWxpbmVTaGFwZXMucHVzaChwYXRoKX19cGxlbj1maWxsU2hhcGVzLmxlbmd0aDtmb3IoaT0wO2k8cGxlbjtpKyspe3RhcmdldC5kcmF3U2hhcGUoZmlsbFNoYXBlc1tpXSxvcHRpb25zLmdldChcImZpbGxDb2xvclwiKSxvcHRpb25zLmdldChcImZpbGxDb2xvclwiKSkuYXBwZW5kKCl9aWYob3B0aW9ucy5nZXQoXCJub3JtYWxSYW5nZU1pblwiKSE9PXVuZGVmaW5lZCYmb3B0aW9ucy5nZXQoXCJkcmF3Tm9ybWFsT25Ub3BcIikpe3RoaXMuZHJhd05vcm1hbFJhbmdlKGNhbnZhc0xlZnQsY2FudmFzVG9wLGNhbnZhc0hlaWdodCxjYW52YXNXaWR0aCxyYW5nZXkpfXBsZW49bGluZVNoYXBlcy5sZW5ndGg7Zm9yKGk9MDtpPHBsZW47aSsrKXt0YXJnZXQuZHJhd1NoYXBlKGxpbmVTaGFwZXNbaV0sb3B0aW9ucy5nZXQoXCJsaW5lQ29sb3JcIiksdW5kZWZpbmVkLG9wdGlvbnMuZ2V0KFwibGluZVdpZHRoXCIpKS5hcHBlbmQoKX1pZihzcG90UmFkaXVzJiZvcHRpb25zLmdldChcInZhbHVlU3BvdHNcIikpe3ZhbHVlU3BvdHM9b3B0aW9ucy5nZXQoXCJ2YWx1ZVNwb3RzXCIpO2lmKHZhbHVlU3BvdHMuZ2V0PT09dW5kZWZpbmVkKXt2YWx1ZVNwb3RzPW5ldyBSYW5nZU1hcCh2YWx1ZVNwb3RzKX1mb3IoaT0wO2k8eXZhbGNvdW50O2krKyl7Y29sb3I9dmFsdWVTcG90cy5nZXQoeXZhbHVlc1tpXSk7aWYoY29sb3Ipe3RhcmdldC5kcmF3Q2lyY2xlKGNhbnZhc0xlZnQrTWF0aC5yb3VuZCgoeHZhbHVlc1tpXS10aGlzLm1pbngpKihjYW52YXNXaWR0aC9yYW5nZXgpKSxjYW52YXNUb3ArTWF0aC5yb3VuZChjYW52YXNIZWlnaHQtY2FudmFzSGVpZ2h0KigoeXZhbHVlc1tpXS10aGlzLm1pbnkpL3JhbmdleSkpLHNwb3RSYWRpdXMsdW5kZWZpbmVkLGNvbG9yKS5hcHBlbmQoKX19fWlmKHNwb3RSYWRpdXMmJm9wdGlvbnMuZ2V0KFwic3BvdENvbG9yXCIpJiZ5dmFsdWVzW3l2YWxsYXN0XSE9PW51bGwpe3RhcmdldC5kcmF3Q2lyY2xlKGNhbnZhc0xlZnQrTWF0aC5yb3VuZCgoeHZhbHVlc1t4dmFsdWVzLmxlbmd0aC0xXS10aGlzLm1pbngpKihjYW52YXNXaWR0aC9yYW5nZXgpKSxjYW52YXNUb3ArTWF0aC5yb3VuZChjYW52YXNIZWlnaHQtY2FudmFzSGVpZ2h0KigoeXZhbHVlc1t5dmFsbGFzdF0tdGhpcy5taW55KS9yYW5nZXkpKSxzcG90UmFkaXVzLHVuZGVmaW5lZCxvcHRpb25zLmdldChcInNwb3RDb2xvclwiKSkuYXBwZW5kKCl9aWYodGhpcy5tYXh5IT09dGhpcy5taW55b3JnKXtpZihzcG90UmFkaXVzJiZvcHRpb25zLmdldChcIm1pblNwb3RDb2xvclwiKSl7eD14dmFsdWVzWyQuaW5BcnJheSh0aGlzLm1pbnlvcmcseXZhbHVlcyldO3RhcmdldC5kcmF3Q2lyY2xlKGNhbnZhc0xlZnQrTWF0aC5yb3VuZCgoeC10aGlzLm1pbngpKihjYW52YXNXaWR0aC9yYW5nZXgpKSxjYW52YXNUb3ArTWF0aC5yb3VuZChjYW52YXNIZWlnaHQtY2FudmFzSGVpZ2h0KigodGhpcy5taW55b3JnLXRoaXMubWlueSkvcmFuZ2V5KSksc3BvdFJhZGl1cyx1bmRlZmluZWQsb3B0aW9ucy5nZXQoXCJtaW5TcG90Q29sb3JcIikpLmFwcGVuZCgpfWlmKHNwb3RSYWRpdXMmJm9wdGlvbnMuZ2V0KFwibWF4U3BvdENvbG9yXCIpKXt4PXh2YWx1ZXNbJC5pbkFycmF5KHRoaXMubWF4eW9yZyx5dmFsdWVzKV07dGFyZ2V0LmRyYXdDaXJjbGUoY2FudmFzTGVmdCtNYXRoLnJvdW5kKCh4LXRoaXMubWlueCkqKGNhbnZhc1dpZHRoL3JhbmdleCkpLGNhbnZhc1RvcCtNYXRoLnJvdW5kKGNhbnZhc0hlaWdodC1jYW52YXNIZWlnaHQqKCh0aGlzLm1heHlvcmctdGhpcy5taW55KS9yYW5nZXkpKSxzcG90UmFkaXVzLHVuZGVmaW5lZCxvcHRpb25zLmdldChcIm1heFNwb3RDb2xvclwiKSkuYXBwZW5kKCl9fXRoaXMubGFzdFNoYXBlSWQ9dGFyZ2V0LmdldExhc3RTaGFwZUlkKCk7dGhpcy5jYW52YXNUb3A9Y2FudmFzVG9wO3RhcmdldC5yZW5kZXIoKX19KTskLmZuLnNwYXJrbGluZS5iYXI9YmFyPWNyZWF0ZUNsYXNzKCQuZm4uc3BhcmtsaW5lLl9iYXNlLGJhckhpZ2hsaWdodE1peGluLHt0eXBlOlwiYmFyXCIsaW5pdDpmdW5jdGlvbihlbCx2YWx1ZXMsb3B0aW9ucyx3aWR0aCxoZWlnaHQpe3ZhciBiYXJXaWR0aD1wYXJzZUludChvcHRpb25zLmdldChcImJhcldpZHRoXCIpLDEwKSxiYXJTcGFjaW5nPXBhcnNlSW50KG9wdGlvbnMuZ2V0KFwiYmFyU3BhY2luZ1wiKSwxMCksY2hhcnRSYW5nZU1pbj1vcHRpb25zLmdldChcImNoYXJ0UmFuZ2VNaW5cIiksY2hhcnRSYW5nZU1heD1vcHRpb25zLmdldChcImNoYXJ0UmFuZ2VNYXhcIiksY2hhcnRSYW5nZUNsaXA9b3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlQ2xpcFwiKSxzdGFja01pbj1JbmZpbml0eSxzdGFja01heD0tSW5maW5pdHksaXNTdGFja1N0cmluZyxncm91cE1pbixncm91cE1heCxzdGFja1JhbmdlcyxudW1WYWx1ZXMsaSx2bGVuLHJhbmdlLHplcm9BeGlzLHhheGlzT2Zmc2V0LG1pbixtYXgsY2xpcE1pbixjbGlwTWF4LHN0YWNrZWQsdmxpc3QsaixzbGVuLHN2YWxzLHZhbCx5b2Zmc2V0LHlNYXhDYWxjLGNhbnZhc0hlaWdodEVmO2Jhci5fc3VwZXIuaW5pdC5jYWxsKHRoaXMsZWwsdmFsdWVzLG9wdGlvbnMsd2lkdGgsaGVpZ2h0KTtmb3IoaT0wLHZsZW49dmFsdWVzLmxlbmd0aDtpPHZsZW47aSsrKXt2YWw9dmFsdWVzW2ldO2lzU3RhY2tTdHJpbmc9dHlwZW9mIHZhbD09PVwic3RyaW5nXCImJnZhbC5pbmRleE9mKFwiOlwiKT4tMTtpZihpc1N0YWNrU3RyaW5nfHwkLmlzQXJyYXkodmFsKSl7c3RhY2tlZD10cnVlO2lmKGlzU3RhY2tTdHJpbmcpe3ZhbD12YWx1ZXNbaV09bm9ybWFsaXplVmFsdWVzKHZhbC5zcGxpdChcIjpcIikpO1xuXG59dmFsPXJlbW92ZSh2YWwsbnVsbCk7Z3JvdXBNaW49TWF0aC5taW4uYXBwbHkoTWF0aCx2YWwpO2dyb3VwTWF4PU1hdGgubWF4LmFwcGx5KE1hdGgsdmFsKTtpZihncm91cE1pbjxzdGFja01pbil7c3RhY2tNaW49Z3JvdXBNaW59aWYoZ3JvdXBNYXg+c3RhY2tNYXgpe3N0YWNrTWF4PWdyb3VwTWF4fX19dGhpcy5zdGFja2VkPXN0YWNrZWQ7dGhpcy5yZWdpb25TaGFwZXM9e307dGhpcy5iYXJXaWR0aD1iYXJXaWR0aDt0aGlzLmJhclNwYWNpbmc9YmFyU3BhY2luZzt0aGlzLnRvdGFsQmFyV2lkdGg9YmFyV2lkdGgrYmFyU3BhY2luZzt0aGlzLndpZHRoPXdpZHRoPXZhbHVlcy5sZW5ndGgqYmFyV2lkdGgrKHZhbHVlcy5sZW5ndGgtMSkqYmFyU3BhY2luZzt0aGlzLmluaXRUYXJnZXQoKTtpZihjaGFydFJhbmdlQ2xpcCl7Y2xpcE1pbj1jaGFydFJhbmdlTWluPT09dW5kZWZpbmVkPy1JbmZpbml0eTpjaGFydFJhbmdlTWluO2NsaXBNYXg9Y2hhcnRSYW5nZU1heD09PXVuZGVmaW5lZD9JbmZpbml0eTpjaGFydFJhbmdlTWF4fW51bVZhbHVlcz1bXTtzdGFja1Jhbmdlcz1zdGFja2VkP1tdOm51bVZhbHVlczt2YXIgc3RhY2tUb3RhbHM9W107dmFyIHN0YWNrUmFuZ2VzTmVnPVtdO2ZvcihpPTAsdmxlbj12YWx1ZXMubGVuZ3RoO2k8dmxlbjtpKyspe2lmKHN0YWNrZWQpe3ZsaXN0PXZhbHVlc1tpXTt2YWx1ZXNbaV09c3ZhbHM9W107c3RhY2tUb3RhbHNbaV09MDtzdGFja1Jhbmdlc1tpXT1zdGFja1Jhbmdlc05lZ1tpXT0wO2ZvcihqPTAsc2xlbj12bGlzdC5sZW5ndGg7ajxzbGVuO2orKyl7dmFsPXN2YWxzW2pdPWNoYXJ0UmFuZ2VDbGlwP2NsaXB2YWwodmxpc3Rbal0sY2xpcE1pbixjbGlwTWF4KTp2bGlzdFtqXTtpZih2YWwhPT1udWxsKXtpZih2YWw+MCl7c3RhY2tUb3RhbHNbaV0rPXZhbH1pZihzdGFja01pbjwwJiZzdGFja01heD4wKXtpZih2YWw8MCl7c3RhY2tSYW5nZXNOZWdbaV0rPU1hdGguYWJzKHZhbCl9ZWxzZXtzdGFja1Jhbmdlc1tpXSs9dmFsfX1lbHNle3N0YWNrUmFuZ2VzW2ldKz1NYXRoLmFicyh2YWwtKHZhbDwwP3N0YWNrTWF4OnN0YWNrTWluKSl9bnVtVmFsdWVzLnB1c2godmFsKX19fWVsc2V7dmFsPWNoYXJ0UmFuZ2VDbGlwP2NsaXB2YWwodmFsdWVzW2ldLGNsaXBNaW4sY2xpcE1heCk6dmFsdWVzW2ldO3ZhbD12YWx1ZXNbaV09bm9ybWFsaXplVmFsdWUodmFsKTtpZih2YWwhPT1udWxsKXtudW1WYWx1ZXMucHVzaCh2YWwpfX19dGhpcy5tYXg9bWF4PU1hdGgubWF4LmFwcGx5KE1hdGgsbnVtVmFsdWVzKTt0aGlzLm1pbj1taW49TWF0aC5taW4uYXBwbHkoTWF0aCxudW1WYWx1ZXMpO3RoaXMuc3RhY2tNYXg9c3RhY2tNYXg9c3RhY2tlZD9NYXRoLm1heC5hcHBseShNYXRoLHN0YWNrVG90YWxzKTptYXg7dGhpcy5zdGFja01pbj1zdGFja01pbj1zdGFja2VkP01hdGgubWluLmFwcGx5KE1hdGgsbnVtVmFsdWVzKTptaW47aWYob3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlTWluXCIpIT09dW5kZWZpbmVkJiYob3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlQ2xpcFwiKXx8b3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlTWluXCIpPG1pbikpe21pbj1vcHRpb25zLmdldChcImNoYXJ0UmFuZ2VNaW5cIil9aWYob3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlTWF4XCIpIT09dW5kZWZpbmVkJiYob3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlQ2xpcFwiKXx8b3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlTWF4XCIpPm1heCkpe21heD1vcHRpb25zLmdldChcImNoYXJ0UmFuZ2VNYXhcIil9dGhpcy56ZXJvQXhpcz16ZXJvQXhpcz1vcHRpb25zLmdldChcInplcm9BeGlzXCIsdHJ1ZSk7aWYobWluPD0wJiZtYXg+PTAmJnplcm9BeGlzKXt4YXhpc09mZnNldD0wfWVsc2UgaWYoemVyb0F4aXM9PWZhbHNlKXt4YXhpc09mZnNldD1taW59ZWxzZSBpZihtaW4+MCl7eGF4aXNPZmZzZXQ9bWlufWVsc2V7eGF4aXNPZmZzZXQ9bWF4fXRoaXMueGF4aXNPZmZzZXQ9eGF4aXNPZmZzZXQ7cmFuZ2U9c3RhY2tlZD9NYXRoLm1heC5hcHBseShNYXRoLHN0YWNrUmFuZ2VzKStNYXRoLm1heC5hcHBseShNYXRoLHN0YWNrUmFuZ2VzTmVnKTptYXgtbWluO3RoaXMuY2FudmFzSGVpZ2h0RWY9emVyb0F4aXMmJm1pbjwwP3RoaXMuY2FudmFzSGVpZ2h0LTI6dGhpcy5jYW52YXNIZWlnaHQtMTtpZihtaW48eGF4aXNPZmZzZXQpe3lNYXhDYWxjPXN0YWNrZWQmJm1heD49MD9zdGFja01heDptYXg7eW9mZnNldD0oeU1heENhbGMteGF4aXNPZmZzZXQpL3JhbmdlKnRoaXMuY2FudmFzSGVpZ2h0O2lmKHlvZmZzZXQhPT1NYXRoLmNlaWwoeW9mZnNldCkpe3RoaXMuY2FudmFzSGVpZ2h0RWYtPTI7eW9mZnNldD1NYXRoLmNlaWwoeW9mZnNldCl9fWVsc2V7eW9mZnNldD10aGlzLmNhbnZhc0hlaWdodH10aGlzLnlvZmZzZXQ9eW9mZnNldDtpZigkLmlzQXJyYXkob3B0aW9ucy5nZXQoXCJjb2xvck1hcFwiKSkpe3RoaXMuY29sb3JNYXBCeUluZGV4PW9wdGlvbnMuZ2V0KFwiY29sb3JNYXBcIik7dGhpcy5jb2xvck1hcEJ5VmFsdWU9bnVsbH1lbHNle3RoaXMuY29sb3JNYXBCeUluZGV4PW51bGw7dGhpcy5jb2xvck1hcEJ5VmFsdWU9b3B0aW9ucy5nZXQoXCJjb2xvck1hcFwiKTtpZih0aGlzLmNvbG9yTWFwQnlWYWx1ZSYmdGhpcy5jb2xvck1hcEJ5VmFsdWUuZ2V0PT09dW5kZWZpbmVkKXt0aGlzLmNvbG9yTWFwQnlWYWx1ZT1uZXcgUmFuZ2VNYXAodGhpcy5jb2xvck1hcEJ5VmFsdWUpfX10aGlzLnJhbmdlPXJhbmdlfSxnZXRSZWdpb246ZnVuY3Rpb24oZWwseCx5KXt2YXIgcmVzdWx0PU1hdGguZmxvb3IoeC90aGlzLnRvdGFsQmFyV2lkdGgpO3JldHVybiByZXN1bHQ8MHx8cmVzdWx0Pj10aGlzLnZhbHVlcy5sZW5ndGg/dW5kZWZpbmVkOnJlc3VsdH0sZ2V0Q3VycmVudFJlZ2lvbkZpZWxkczpmdW5jdGlvbigpe3ZhciBjdXJyZW50UmVnaW9uPXRoaXMuY3VycmVudFJlZ2lvbix2YWx1ZXM9ZW5zdXJlQXJyYXkodGhpcy52YWx1ZXNbY3VycmVudFJlZ2lvbl0pLHJlc3VsdD1bXSx2YWx1ZSxpO2ZvcihpPXZhbHVlcy5sZW5ndGg7aS0tOyl7dmFsdWU9dmFsdWVzW2ldO3Jlc3VsdC5wdXNoKHtpc051bGw6dmFsdWU9PT1udWxsLHZhbHVlOnZhbHVlLGNvbG9yOnRoaXMuY2FsY0NvbG9yKGksdmFsdWUsY3VycmVudFJlZ2lvbiksb2Zmc2V0OmN1cnJlbnRSZWdpb259KX1yZXR1cm4gcmVzdWx0fSxjYWxjQ29sb3I6ZnVuY3Rpb24oc3RhY2tudW0sdmFsdWUsdmFsdWVudW0pe3ZhciBjb2xvck1hcEJ5SW5kZXg9dGhpcy5jb2xvck1hcEJ5SW5kZXgsY29sb3JNYXBCeVZhbHVlPXRoaXMuY29sb3JNYXBCeVZhbHVlLG9wdGlvbnM9dGhpcy5vcHRpb25zLGNvbG9yLG5ld0NvbG9yO2lmKHRoaXMuc3RhY2tlZCl7Y29sb3I9b3B0aW9ucy5nZXQoXCJzdGFja2VkQmFyQ29sb3JcIil9ZWxzZXtjb2xvcj12YWx1ZTwwP29wdGlvbnMuZ2V0KFwibmVnQmFyQ29sb3JcIik6b3B0aW9ucy5nZXQoXCJiYXJDb2xvclwiKX1pZih2YWx1ZT09PTAmJm9wdGlvbnMuZ2V0KFwiemVyb0NvbG9yXCIpIT09dW5kZWZpbmVkKXtjb2xvcj1vcHRpb25zLmdldChcInplcm9Db2xvclwiKX1pZihjb2xvck1hcEJ5VmFsdWUmJihuZXdDb2xvcj1jb2xvck1hcEJ5VmFsdWUuZ2V0KHZhbHVlKSkpe2NvbG9yPW5ld0NvbG9yfWVsc2UgaWYoY29sb3JNYXBCeUluZGV4JiZjb2xvck1hcEJ5SW5kZXgubGVuZ3RoPnZhbHVlbnVtKXtjb2xvcj1jb2xvck1hcEJ5SW5kZXhbdmFsdWVudW1dfXJldHVybiAkLmlzQXJyYXkoY29sb3IpP2NvbG9yW3N0YWNrbnVtJWNvbG9yLmxlbmd0aF06Y29sb3J9LHJlbmRlclJlZ2lvbjpmdW5jdGlvbih2YWx1ZW51bSxoaWdobGlnaHQpe3ZhciB2YWxzPXRoaXMudmFsdWVzW3ZhbHVlbnVtXSxvcHRpb25zPXRoaXMub3B0aW9ucyx4YXhpc09mZnNldD10aGlzLnhheGlzT2Zmc2V0LHJlc3VsdD1bXSxyYW5nZT10aGlzLnJhbmdlLHN0YWNrZWQ9dGhpcy5zdGFja2VkLHRhcmdldD10aGlzLnRhcmdldCx4PXZhbHVlbnVtKnRoaXMudG90YWxCYXJXaWR0aCxjYW52YXNIZWlnaHRFZj10aGlzLmNhbnZhc0hlaWdodEVmLHlvZmZzZXQ9dGhpcy55b2Zmc2V0LHksaGVpZ2h0LGNvbG9yLGlzTnVsbCx5b2Zmc2V0TmVnLGksdmFsY291bnQsdmFsLG1pblBsb3R0ZWQsYWxsTWluO3ZhbHM9JC5pc0FycmF5KHZhbHMpP3ZhbHM6W3ZhbHNdO3ZhbGNvdW50PXZhbHMubGVuZ3RoO3ZhbD12YWxzWzBdO2lzTnVsbD1hbGwobnVsbCx2YWxzKTthbGxNaW49YWxsKHhheGlzT2Zmc2V0LHZhbHMsdHJ1ZSk7aWYoaXNOdWxsKXtpZihvcHRpb25zLmdldChcIm51bGxDb2xvclwiKSl7Y29sb3I9aGlnaGxpZ2h0P29wdGlvbnMuZ2V0KFwibnVsbENvbG9yXCIpOnRoaXMuY2FsY0hpZ2hsaWdodENvbG9yKG9wdGlvbnMuZ2V0KFwibnVsbENvbG9yXCIpLG9wdGlvbnMpO3k9eW9mZnNldD4wP3lvZmZzZXQtMTp5b2Zmc2V0O3JldHVybiB0YXJnZXQuZHJhd1JlY3QoeCx5LHRoaXMuYmFyV2lkdGgtMSwwLGNvbG9yLGNvbG9yKX1lbHNle3JldHVybiB1bmRlZmluZWR9fXlvZmZzZXROZWc9eW9mZnNldDtmb3IoaT0wO2k8dmFsY291bnQ7aSsrKXt2YWw9dmFsc1tpXTtpZihzdGFja2VkJiZ2YWw9PT14YXhpc09mZnNldCl7aWYoIWFsbE1pbnx8bWluUGxvdHRlZCl7Y29udGludWV9bWluUGxvdHRlZD10cnVlfWlmKHJhbmdlPjApe2hlaWdodD1NYXRoLmZsb29yKGNhbnZhc0hlaWdodEVmKihNYXRoLmFicyh2YWwteGF4aXNPZmZzZXQpL3JhbmdlKSkrMX1lbHNle2hlaWdodD0xfWlmKHZhbDx4YXhpc09mZnNldHx8dmFsPT09eGF4aXNPZmZzZXQmJnlvZmZzZXQ9PT0wKXt5PXlvZmZzZXROZWc7eW9mZnNldE5lZys9aGVpZ2h0fWVsc2V7eT15b2Zmc2V0LWhlaWdodDt5b2Zmc2V0LT1oZWlnaHR9Y29sb3I9dGhpcy5jYWxjQ29sb3IoaSx2YWwsdmFsdWVudW0pO2lmKGhpZ2hsaWdodCl7Y29sb3I9dGhpcy5jYWxjSGlnaGxpZ2h0Q29sb3IoY29sb3Isb3B0aW9ucyl9cmVzdWx0LnB1c2godGFyZ2V0LmRyYXdSZWN0KHgseSx0aGlzLmJhcldpZHRoLTEsaGVpZ2h0LTEsY29sb3IsY29sb3IpKX1pZihyZXN1bHQubGVuZ3RoPT09MSl7cmV0dXJuIHJlc3VsdFswXX1yZXR1cm4gcmVzdWx0fX0pOyQuZm4uc3BhcmtsaW5lLnRyaXN0YXRlPXRyaXN0YXRlPWNyZWF0ZUNsYXNzKCQuZm4uc3BhcmtsaW5lLl9iYXNlLGJhckhpZ2hsaWdodE1peGluLHt0eXBlOlwidHJpc3RhdGVcIixpbml0OmZ1bmN0aW9uKGVsLHZhbHVlcyxvcHRpb25zLHdpZHRoLGhlaWdodCl7dmFyIGJhcldpZHRoPXBhcnNlSW50KG9wdGlvbnMuZ2V0KFwiYmFyV2lkdGhcIiksMTApLGJhclNwYWNpbmc9cGFyc2VJbnQob3B0aW9ucy5nZXQoXCJiYXJTcGFjaW5nXCIpLDEwKTt0cmlzdGF0ZS5fc3VwZXIuaW5pdC5jYWxsKHRoaXMsZWwsdmFsdWVzLG9wdGlvbnMsd2lkdGgsaGVpZ2h0KTt0aGlzLnJlZ2lvblNoYXBlcz17fTt0aGlzLmJhcldpZHRoPWJhcldpZHRoO3RoaXMuYmFyU3BhY2luZz1iYXJTcGFjaW5nO3RoaXMudG90YWxCYXJXaWR0aD1iYXJXaWR0aCtiYXJTcGFjaW5nO3RoaXMudmFsdWVzPSQubWFwKHZhbHVlcyxOdW1iZXIpO3RoaXMud2lkdGg9d2lkdGg9dmFsdWVzLmxlbmd0aCpiYXJXaWR0aCsodmFsdWVzLmxlbmd0aC0xKSpiYXJTcGFjaW5nO2lmKCQuaXNBcnJheShvcHRpb25zLmdldChcImNvbG9yTWFwXCIpKSl7dGhpcy5jb2xvck1hcEJ5SW5kZXg9b3B0aW9ucy5nZXQoXCJjb2xvck1hcFwiKTt0aGlzLmNvbG9yTWFwQnlWYWx1ZT1udWxsfWVsc2V7dGhpcy5jb2xvck1hcEJ5SW5kZXg9bnVsbDt0aGlzLmNvbG9yTWFwQnlWYWx1ZT1vcHRpb25zLmdldChcImNvbG9yTWFwXCIpO2lmKHRoaXMuY29sb3JNYXBCeVZhbHVlJiZ0aGlzLmNvbG9yTWFwQnlWYWx1ZS5nZXQ9PT11bmRlZmluZWQpe3RoaXMuY29sb3JNYXBCeVZhbHVlPW5ldyBSYW5nZU1hcCh0aGlzLmNvbG9yTWFwQnlWYWx1ZSl9fXRoaXMuaW5pdFRhcmdldCgpfSxnZXRSZWdpb246ZnVuY3Rpb24oZWwseCx5KXtyZXR1cm4gTWF0aC5mbG9vcih4L3RoaXMudG90YWxCYXJXaWR0aCl9LGdldEN1cnJlbnRSZWdpb25GaWVsZHM6ZnVuY3Rpb24oKXt2YXIgY3VycmVudFJlZ2lvbj10aGlzLmN1cnJlbnRSZWdpb247cmV0dXJue2lzTnVsbDp0aGlzLnZhbHVlc1tjdXJyZW50UmVnaW9uXT09PXVuZGVmaW5lZCx2YWx1ZTp0aGlzLnZhbHVlc1tjdXJyZW50UmVnaW9uXSxjb2xvcjp0aGlzLmNhbGNDb2xvcih0aGlzLnZhbHVlc1tjdXJyZW50UmVnaW9uXSxjdXJyZW50UmVnaW9uKSxvZmZzZXQ6Y3VycmVudFJlZ2lvbn19LGNhbGNDb2xvcjpmdW5jdGlvbih2YWx1ZSx2YWx1ZW51bSl7dmFyIHZhbHVlcz10aGlzLnZhbHVlcyxvcHRpb25zPXRoaXMub3B0aW9ucyxjb2xvck1hcEJ5SW5kZXg9dGhpcy5jb2xvck1hcEJ5SW5kZXgsY29sb3JNYXBCeVZhbHVlPXRoaXMuY29sb3JNYXBCeVZhbHVlLGNvbG9yLG5ld0NvbG9yO2lmKGNvbG9yTWFwQnlWYWx1ZSYmKG5ld0NvbG9yPWNvbG9yTWFwQnlWYWx1ZS5nZXQodmFsdWUpKSl7Y29sb3I9bmV3Q29sb3J9ZWxzZSBpZihjb2xvck1hcEJ5SW5kZXgmJmNvbG9yTWFwQnlJbmRleC5sZW5ndGg+dmFsdWVudW0pe2NvbG9yPWNvbG9yTWFwQnlJbmRleFt2YWx1ZW51bV19ZWxzZSBpZih2YWx1ZXNbdmFsdWVudW1dPDApe2NvbG9yPW9wdGlvbnMuZ2V0KFwibmVnQmFyQ29sb3JcIil9ZWxzZSBpZih2YWx1ZXNbdmFsdWVudW1dPjApe2NvbG9yPW9wdGlvbnMuZ2V0KFwicG9zQmFyQ29sb3JcIil9ZWxzZXtjb2xvcj1vcHRpb25zLmdldChcInplcm9CYXJDb2xvclwiKX1yZXR1cm4gY29sb3J9LHJlbmRlclJlZ2lvbjpmdW5jdGlvbih2YWx1ZW51bSxoaWdobGlnaHQpe3ZhciB2YWx1ZXM9dGhpcy52YWx1ZXMsb3B0aW9ucz10aGlzLm9wdGlvbnMsdGFyZ2V0PXRoaXMudGFyZ2V0LGNhbnZhc0hlaWdodCxoZWlnaHQsaGFsZkhlaWdodCx4LHksY29sb3I7Y2FudmFzSGVpZ2h0PXRhcmdldC5waXhlbEhlaWdodDtoYWxmSGVpZ2h0PU1hdGgucm91bmQoY2FudmFzSGVpZ2h0LzIpO3g9dmFsdWVudW0qdGhpcy50b3RhbEJhcldpZHRoO2lmKHZhbHVlc1t2YWx1ZW51bV08MCl7eT1oYWxmSGVpZ2h0O2hlaWdodD1oYWxmSGVpZ2h0LTF9ZWxzZSBpZih2YWx1ZXNbdmFsdWVudW1dPjApe3k9MDtoZWlnaHQ9aGFsZkhlaWdodC0xfWVsc2V7eT1oYWxmSGVpZ2h0LTE7aGVpZ2h0PTJ9Y29sb3I9dGhpcy5jYWxjQ29sb3IodmFsdWVzW3ZhbHVlbnVtXSx2YWx1ZW51bSk7aWYoY29sb3I9PT1udWxsKXtyZXR1cm59aWYoaGlnaGxpZ2h0KXtjb2xvcj10aGlzLmNhbGNIaWdobGlnaHRDb2xvcihjb2xvcixvcHRpb25zKX1yZXR1cm4gdGFyZ2V0LmRyYXdSZWN0KHgseSx0aGlzLmJhcldpZHRoLTEsaGVpZ2h0LTEsY29sb3IsY29sb3IpfX0pOyQuZm4uc3BhcmtsaW5lLmRpc2NyZXRlPWRpc2NyZXRlPWNyZWF0ZUNsYXNzKCQuZm4uc3BhcmtsaW5lLl9iYXNlLGJhckhpZ2hsaWdodE1peGluLHt0eXBlOlwiZGlzY3JldGVcIixpbml0OmZ1bmN0aW9uKGVsLHZhbHVlcyxvcHRpb25zLHdpZHRoLGhlaWdodCl7ZGlzY3JldGUuX3N1cGVyLmluaXQuY2FsbCh0aGlzLGVsLHZhbHVlcyxvcHRpb25zLHdpZHRoLGhlaWdodCk7dGhpcy5yZWdpb25TaGFwZXM9e307dGhpcy52YWx1ZXM9dmFsdWVzPSQubWFwKHZhbHVlcyxOdW1iZXIpO3RoaXMubWluPU1hdGgubWluLmFwcGx5KE1hdGgsdmFsdWVzKTt0aGlzLm1heD1NYXRoLm1heC5hcHBseShNYXRoLHZhbHVlcyk7dGhpcy5yYW5nZT10aGlzLm1heC10aGlzLm1pbjt0aGlzLndpZHRoPXdpZHRoPW9wdGlvbnMuZ2V0KFwid2lkdGhcIik9PT1cImF1dG9cIj92YWx1ZXMubGVuZ3RoKjI6dGhpcy53aWR0aDt0aGlzLmludGVydmFsPU1hdGguZmxvb3Iod2lkdGgvdmFsdWVzLmxlbmd0aCk7dGhpcy5pdGVtV2lkdGg9d2lkdGgvdmFsdWVzLmxlbmd0aDtpZihvcHRpb25zLmdldChcImNoYXJ0UmFuZ2VNaW5cIikhPT11bmRlZmluZWQmJihvcHRpb25zLmdldChcImNoYXJ0UmFuZ2VDbGlwXCIpfHxvcHRpb25zLmdldChcImNoYXJ0UmFuZ2VNaW5cIik8dGhpcy5taW4pKXt0aGlzLm1pbj1vcHRpb25zLmdldChcImNoYXJ0UmFuZ2VNaW5cIil9aWYob3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlTWF4XCIpIT09dW5kZWZpbmVkJiYob3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlQ2xpcFwiKXx8b3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlTWF4XCIpPnRoaXMubWF4KSl7dGhpcy5tYXg9b3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlTWF4XCIpfXRoaXMuaW5pdFRhcmdldCgpO2lmKHRoaXMudGFyZ2V0KXt0aGlzLmxpbmVIZWlnaHQ9b3B0aW9ucy5nZXQoXCJsaW5lSGVpZ2h0XCIpPT09XCJhdXRvXCI/TWF0aC5yb3VuZCh0aGlzLmNhbnZhc0hlaWdodCouMyk6b3B0aW9ucy5nZXQoXCJsaW5lSGVpZ2h0XCIpfX0sZ2V0UmVnaW9uOmZ1bmN0aW9uKGVsLHgseSl7cmV0dXJuIE1hdGguZmxvb3IoeC90aGlzLml0ZW1XaWR0aCl9LGdldEN1cnJlbnRSZWdpb25GaWVsZHM6ZnVuY3Rpb24oKXt2YXIgY3VycmVudFJlZ2lvbj10aGlzLmN1cnJlbnRSZWdpb247cmV0dXJue2lzTnVsbDp0aGlzLnZhbHVlc1tjdXJyZW50UmVnaW9uXT09PXVuZGVmaW5lZCx2YWx1ZTp0aGlzLnZhbHVlc1tjdXJyZW50UmVnaW9uXSxvZmZzZXQ6Y3VycmVudFJlZ2lvbn19LHJlbmRlclJlZ2lvbjpmdW5jdGlvbih2YWx1ZW51bSxoaWdobGlnaHQpe3ZhciB2YWx1ZXM9dGhpcy52YWx1ZXMsb3B0aW9ucz10aGlzLm9wdGlvbnMsbWluPXRoaXMubWluLG1heD10aGlzLm1heCxyYW5nZT10aGlzLnJhbmdlLGludGVydmFsPXRoaXMuaW50ZXJ2YWwsdGFyZ2V0PXRoaXMudGFyZ2V0LGNhbnZhc0hlaWdodD10aGlzLmNhbnZhc0hlaWdodCxsaW5lSGVpZ2h0PXRoaXMubGluZUhlaWdodCxwaGVpZ2h0PWNhbnZhc0hlaWdodC1saW5lSGVpZ2h0LHl0b3AsdmFsLGNvbG9yLHg7dmFsPWNsaXB2YWwodmFsdWVzW3ZhbHVlbnVtXSxtaW4sbWF4KTt4PXZhbHVlbnVtKmludGVydmFsO3l0b3A9TWF0aC5yb3VuZChwaGVpZ2h0LXBoZWlnaHQqKCh2YWwtbWluKS9yYW5nZSkpO2NvbG9yPW9wdGlvbnMuZ2V0KFwidGhyZXNob2xkQ29sb3JcIikmJnZhbDxvcHRpb25zLmdldChcInRocmVzaG9sZFZhbHVlXCIpP29wdGlvbnMuZ2V0KFwidGhyZXNob2xkQ29sb3JcIik6b3B0aW9ucy5nZXQoXCJsaW5lQ29sb3JcIik7aWYoaGlnaGxpZ2h0KXtjb2xvcj10aGlzLmNhbGNIaWdobGlnaHRDb2xvcihjb2xvcixvcHRpb25zKX1yZXR1cm4gdGFyZ2V0LmRyYXdMaW5lKHgseXRvcCx4LHl0b3ArbGluZUhlaWdodCxjb2xvcil9fSk7JC5mbi5zcGFya2xpbmUuYnVsbGV0PWJ1bGxldD1jcmVhdGVDbGFzcygkLmZuLnNwYXJrbGluZS5fYmFzZSx7dHlwZTpcImJ1bGxldFwiLGluaXQ6ZnVuY3Rpb24oZWwsdmFsdWVzLG9wdGlvbnMsd2lkdGgsaGVpZ2h0KXt2YXIgbWluLG1heCx2YWxzO2J1bGxldC5fc3VwZXIuaW5pdC5jYWxsKHRoaXMsZWwsdmFsdWVzLG9wdGlvbnMsd2lkdGgsaGVpZ2h0KTt0aGlzLnZhbHVlcz12YWx1ZXM9bm9ybWFsaXplVmFsdWVzKHZhbHVlcyk7dmFscz12YWx1ZXMuc2xpY2UoKTt2YWxzWzBdPXZhbHNbMF09PT1udWxsP3ZhbHNbMl06dmFsc1swXTt2YWxzWzFdPXZhbHVlc1sxXT09PW51bGw/dmFsc1syXTp2YWxzWzFdO21pbj1NYXRoLm1pbi5hcHBseShNYXRoLHZhbHVlcyk7bWF4PU1hdGgubWF4LmFwcGx5KE1hdGgsdmFsdWVzKTtpZihvcHRpb25zLmdldChcImJhc2VcIik9PT11bmRlZmluZWQpe21pbj1taW48MD9taW46MH1lbHNle21pbj1vcHRpb25zLmdldChcImJhc2VcIil9dGhpcy5taW49bWluO3RoaXMubWF4PW1heDt0aGlzLnJhbmdlPW1heC1taW47dGhpcy5zaGFwZXM9e307dGhpcy52YWx1ZVNoYXBlcz17fTt0aGlzLnJlZ2lvbmRhdGE9e307dGhpcy53aWR0aD13aWR0aD1vcHRpb25zLmdldChcIndpZHRoXCIpPT09XCJhdXRvXCI/XCI0LjBlbVwiOndpZHRoO3RoaXMudGFyZ2V0PXRoaXMuJGVsLnNpbXBsZWRyYXcod2lkdGgsaGVpZ2h0LG9wdGlvbnMuZ2V0KFwiY29tcG9zaXRlXCIpKTtpZighdmFsdWVzLmxlbmd0aCl7dGhpcy5kaXNhYmxlZD10cnVlfXRoaXMuaW5pdFRhcmdldCgpfSxnZXRSZWdpb246ZnVuY3Rpb24oZWwseCx5KXt2YXIgc2hhcGVpZD10aGlzLnRhcmdldC5nZXRTaGFwZUF0KGVsLHgseSk7cmV0dXJuIHNoYXBlaWQhPT11bmRlZmluZWQmJnRoaXMuc2hhcGVzW3NoYXBlaWRdIT09dW5kZWZpbmVkP3RoaXMuc2hhcGVzW3NoYXBlaWRdOnVuZGVmaW5lZH0sZ2V0Q3VycmVudFJlZ2lvbkZpZWxkczpmdW5jdGlvbigpe3ZhciBjdXJyZW50UmVnaW9uPXRoaXMuY3VycmVudFJlZ2lvbjtyZXR1cm57ZmllbGRrZXk6Y3VycmVudFJlZ2lvbi5zdWJzdHIoMCwxKSx2YWx1ZTp0aGlzLnZhbHVlc1tjdXJyZW50UmVnaW9uLnN1YnN0cigxKV0scmVnaW9uOmN1cnJlbnRSZWdpb259fSxjaGFuZ2VIaWdobGlnaHQ6ZnVuY3Rpb24oaGlnaGxpZ2h0KXt2YXIgY3VycmVudFJlZ2lvbj10aGlzLmN1cnJlbnRSZWdpb24sc2hhcGVpZD10aGlzLnZhbHVlU2hhcGVzW2N1cnJlbnRSZWdpb25dLHNoYXBlO2RlbGV0ZSB0aGlzLnNoYXBlc1tzaGFwZWlkXTtzd2l0Y2goY3VycmVudFJlZ2lvbi5zdWJzdHIoMCwxKSl7Y2FzZVwiclwiOnNoYXBlPXRoaXMucmVuZGVyUmFuZ2UoY3VycmVudFJlZ2lvbi5zdWJzdHIoMSksaGlnaGxpZ2h0KTticmVhaztjYXNlXCJwXCI6c2hhcGU9dGhpcy5yZW5kZXJQZXJmb3JtYW5jZShoaWdobGlnaHQpO2JyZWFrO2Nhc2VcInRcIjpzaGFwZT10aGlzLnJlbmRlclRhcmdldChoaWdobGlnaHQpO2JyZWFrfXRoaXMudmFsdWVTaGFwZXNbY3VycmVudFJlZ2lvbl09c2hhcGUuaWQ7dGhpcy5zaGFwZXNbc2hhcGUuaWRdPWN1cnJlbnRSZWdpb247dGhpcy50YXJnZXQucmVwbGFjZVdpdGhTaGFwZShzaGFwZWlkLHNoYXBlKX0scmVuZGVyUmFuZ2U6ZnVuY3Rpb24ocm4saGlnaGxpZ2h0KXt2YXIgcmFuZ2V2YWw9dGhpcy52YWx1ZXNbcm5dLHJhbmdld2lkdGg9TWF0aC5yb3VuZCh0aGlzLmNhbnZhc1dpZHRoKigocmFuZ2V2YWwtdGhpcy5taW4pL3RoaXMucmFuZ2UpKSxjb2xvcj10aGlzLm9wdGlvbnMuZ2V0KFwicmFuZ2VDb2xvcnNcIilbcm4tMl07aWYoaGlnaGxpZ2h0KXtjb2xvcj10aGlzLmNhbGNIaWdobGlnaHRDb2xvcihjb2xvcix0aGlzLm9wdGlvbnMpfXJldHVybiB0aGlzLnRhcmdldC5kcmF3UmVjdCgwLDAscmFuZ2V3aWR0aC0xLHRoaXMuY2FudmFzSGVpZ2h0LTEsY29sb3IsY29sb3IpfSxyZW5kZXJQZXJmb3JtYW5jZTpmdW5jdGlvbihoaWdobGlnaHQpe3ZhciBwZXJmdmFsPXRoaXMudmFsdWVzWzFdLHBlcmZ3aWR0aD1NYXRoLnJvdW5kKHRoaXMuY2FudmFzV2lkdGgqKChwZXJmdmFsLXRoaXMubWluKS90aGlzLnJhbmdlKSksY29sb3I9dGhpcy5vcHRpb25zLmdldChcInBlcmZvcm1hbmNlQ29sb3JcIik7aWYoaGlnaGxpZ2h0KXtjb2xvcj10aGlzLmNhbGNIaWdobGlnaHRDb2xvcihjb2xvcix0aGlzLm9wdGlvbnMpfXJldHVybiB0aGlzLnRhcmdldC5kcmF3UmVjdCgwLE1hdGgucm91bmQodGhpcy5jYW52YXNIZWlnaHQqLjMpLHBlcmZ3aWR0aC0xLE1hdGgucm91bmQodGhpcy5jYW52YXNIZWlnaHQqLjQpLTEsY29sb3IsY29sb3IpfSxyZW5kZXJUYXJnZXQ6ZnVuY3Rpb24oaGlnaGxpZ2h0KXt2YXIgdGFyZ2V0dmFsPXRoaXMudmFsdWVzWzBdLHg9TWF0aC5yb3VuZCh0aGlzLmNhbnZhc1dpZHRoKigodGFyZ2V0dmFsLXRoaXMubWluKS90aGlzLnJhbmdlKS10aGlzLm9wdGlvbnMuZ2V0KFwidGFyZ2V0V2lkdGhcIikvMiksdGFyZ2V0dG9wPU1hdGgucm91bmQodGhpcy5jYW52YXNIZWlnaHQqLjEpLHRhcmdldGhlaWdodD10aGlzLmNhbnZhc0hlaWdodC10YXJnZXR0b3AqMixjb2xvcj10aGlzLm9wdGlvbnMuZ2V0KFwidGFyZ2V0Q29sb3JcIik7aWYoaGlnaGxpZ2h0KXtjb2xvcj10aGlzLmNhbGNIaWdobGlnaHRDb2xvcihjb2xvcix0aGlzLm9wdGlvbnMpfXJldHVybiB0aGlzLnRhcmdldC5kcmF3UmVjdCh4LHRhcmdldHRvcCx0aGlzLm9wdGlvbnMuZ2V0KFwidGFyZ2V0V2lkdGhcIiktMSx0YXJnZXRoZWlnaHQtMSxjb2xvcixjb2xvcil9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciB2bGVuPXRoaXMudmFsdWVzLmxlbmd0aCx0YXJnZXQ9dGhpcy50YXJnZXQsaSxzaGFwZTtpZighYnVsbGV0Ll9zdXBlci5yZW5kZXIuY2FsbCh0aGlzKSl7cmV0dXJufWZvcihpPTI7aTx2bGVuO2krKyl7c2hhcGU9dGhpcy5yZW5kZXJSYW5nZShpKS5hcHBlbmQoKTt0aGlzLnNoYXBlc1tzaGFwZS5pZF09XCJyXCIraTt0aGlzLnZhbHVlU2hhcGVzW1wiclwiK2ldPXNoYXBlLmlkfWlmKHRoaXMudmFsdWVzWzFdIT09bnVsbCl7c2hhcGU9dGhpcy5yZW5kZXJQZXJmb3JtYW5jZSgpLmFwcGVuZCgpO3RoaXMuc2hhcGVzW3NoYXBlLmlkXT1cInAxXCI7dGhpcy52YWx1ZVNoYXBlcy5wMT1zaGFwZS5pZH1pZih0aGlzLnZhbHVlc1swXSE9PW51bGwpe3NoYXBlPXRoaXMucmVuZGVyVGFyZ2V0KCkuYXBwZW5kKCk7dGhpcy5zaGFwZXNbc2hhcGUuaWRdPVwidDBcIjt0aGlzLnZhbHVlU2hhcGVzLnQwPXNoYXBlLmlkfXRhcmdldC5yZW5kZXIoKX19KTskLmZuLnNwYXJrbGluZS5waWU9cGllPWNyZWF0ZUNsYXNzKCQuZm4uc3BhcmtsaW5lLl9iYXNlLHt0eXBlOlwicGllXCIsaW5pdDpmdW5jdGlvbihlbCx2YWx1ZXMsb3B0aW9ucyx3aWR0aCxoZWlnaHQpe3ZhciB0b3RhbD0wLGk7cGllLl9zdXBlci5pbml0LmNhbGwodGhpcyxlbCx2YWx1ZXMsb3B0aW9ucyx3aWR0aCxoZWlnaHQpO3RoaXMuc2hhcGVzPXt9O3RoaXMudmFsdWVTaGFwZXM9e307dGhpcy52YWx1ZXM9dmFsdWVzPSQubWFwKHZhbHVlcyxOdW1iZXIpO2lmKG9wdGlvbnMuZ2V0KFwid2lkdGhcIik9PT1cImF1dG9cIil7dGhpcy53aWR0aD10aGlzLmhlaWdodH1pZih2YWx1ZXMubGVuZ3RoPjApe2ZvcihpPXZhbHVlcy5sZW5ndGg7aS0tOyl7dG90YWwrPXZhbHVlc1tpXX19dGhpcy50b3RhbD10b3RhbDt0aGlzLmluaXRUYXJnZXQoKTt0aGlzLnJhZGl1cz1NYXRoLmZsb29yKE1hdGgubWluKHRoaXMuY2FudmFzV2lkdGgsdGhpcy5jYW52YXNIZWlnaHQpLzIpfSxnZXRSZWdpb246ZnVuY3Rpb24oZWwseCx5KXt2YXIgc2hhcGVpZD10aGlzLnRhcmdldC5nZXRTaGFwZUF0KGVsLHgseSk7cmV0dXJuIHNoYXBlaWQhPT11bmRlZmluZWQmJnRoaXMuc2hhcGVzW3NoYXBlaWRdIT09dW5kZWZpbmVkP3RoaXMuc2hhcGVzW3NoYXBlaWRdOnVuZGVmaW5lZH0sZ2V0Q3VycmVudFJlZ2lvbkZpZWxkczpmdW5jdGlvbigpe3ZhciBjdXJyZW50UmVnaW9uPXRoaXMuY3VycmVudFJlZ2lvbjtyZXR1cm57aXNOdWxsOnRoaXMudmFsdWVzW2N1cnJlbnRSZWdpb25dPT09dW5kZWZpbmVkLHZhbHVlOnRoaXMudmFsdWVzW2N1cnJlbnRSZWdpb25dLHBlcmNlbnQ6dGhpcy52YWx1ZXNbY3VycmVudFJlZ2lvbl0vdGhpcy50b3RhbCoxMDAsY29sb3I6dGhpcy5vcHRpb25zLmdldChcInNsaWNlQ29sb3JzXCIpW2N1cnJlbnRSZWdpb24ldGhpcy5vcHRpb25zLmdldChcInNsaWNlQ29sb3JzXCIpLmxlbmd0aF0sb2Zmc2V0OmN1cnJlbnRSZWdpb259fSxjaGFuZ2VIaWdobGlnaHQ6ZnVuY3Rpb24oaGlnaGxpZ2h0KXt2YXIgY3VycmVudFJlZ2lvbj10aGlzLmN1cnJlbnRSZWdpb24sbmV3c2xpY2U9dGhpcy5yZW5kZXJTbGljZShjdXJyZW50UmVnaW9uLGhpZ2hsaWdodCksc2hhcGVpZD10aGlzLnZhbHVlU2hhcGVzW2N1cnJlbnRSZWdpb25dO2RlbGV0ZSB0aGlzLnNoYXBlc1tzaGFwZWlkXTt0aGlzLnRhcmdldC5yZXBsYWNlV2l0aFNoYXBlKHNoYXBlaWQsbmV3c2xpY2UpO3RoaXMudmFsdWVTaGFwZXNbY3VycmVudFJlZ2lvbl09bmV3c2xpY2UuaWQ7dGhpcy5zaGFwZXNbbmV3c2xpY2UuaWRdPWN1cnJlbnRSZWdpb259LHJlbmRlclNsaWNlOmZ1bmN0aW9uKHZhbHVlbnVtLGhpZ2hsaWdodCl7dmFyIHRhcmdldD10aGlzLnRhcmdldCxvcHRpb25zPXRoaXMub3B0aW9ucyxyYWRpdXM9dGhpcy5yYWRpdXMsYm9yZGVyV2lkdGg9b3B0aW9ucy5nZXQoXCJib3JkZXJXaWR0aFwiKSxvZmZzZXQ9b3B0aW9ucy5nZXQoXCJvZmZzZXRcIiksY2lyY2xlPTIqTWF0aC5QSSx2YWx1ZXM9dGhpcy52YWx1ZXMsdG90YWw9dGhpcy50b3RhbCxuZXh0PW9mZnNldD8yKk1hdGguUEkqKG9mZnNldC8zNjApOjAsc3RhcnQsZW5kLGksdmxlbixjb2xvcjt2bGVuPXZhbHVlcy5sZW5ndGg7Zm9yKGk9MDtpPHZsZW47aSsrKXtzdGFydD1uZXh0O2VuZD1uZXh0O2lmKHRvdGFsPjApe2VuZD1uZXh0K2NpcmNsZSoodmFsdWVzW2ldL3RvdGFsKX1pZih2YWx1ZW51bT09PWkpe2NvbG9yPW9wdGlvbnMuZ2V0KFwic2xpY2VDb2xvcnNcIilbaSVvcHRpb25zLmdldChcInNsaWNlQ29sb3JzXCIpLmxlbmd0aF07aWYoaGlnaGxpZ2h0KXtjb2xvcj10aGlzLmNhbGNIaWdobGlnaHRDb2xvcihjb2xvcixvcHRpb25zKX1yZXR1cm4gdGFyZ2V0LmRyYXdQaWVTbGljZShyYWRpdXMscmFkaXVzLHJhZGl1cy1ib3JkZXJXaWR0aCxzdGFydCxlbmQsdW5kZWZpbmVkLGNvbG9yKX1uZXh0PWVuZH19LHJlbmRlcjpmdW5jdGlvbigpe3ZhciB0YXJnZXQ9dGhpcy50YXJnZXQsdmFsdWVzPXRoaXMudmFsdWVzLG9wdGlvbnM9dGhpcy5vcHRpb25zLHJhZGl1cz10aGlzLnJhZGl1cyxib3JkZXJXaWR0aD1vcHRpb25zLmdldChcImJvcmRlcldpZHRoXCIpLHNoYXBlLGk7aWYoIXBpZS5fc3VwZXIucmVuZGVyLmNhbGwodGhpcykpe3JldHVybn1pZihib3JkZXJXaWR0aCl7dGFyZ2V0LmRyYXdDaXJjbGUocmFkaXVzLHJhZGl1cyxNYXRoLmZsb29yKHJhZGl1cy1ib3JkZXJXaWR0aC8yKSxvcHRpb25zLmdldChcImJvcmRlckNvbG9yXCIpLHVuZGVmaW5lZCxib3JkZXJXaWR0aCkuYXBwZW5kKCl9Zm9yKGk9dmFsdWVzLmxlbmd0aDtpLS07KXtpZih2YWx1ZXNbaV0pe3NoYXBlPXRoaXMucmVuZGVyU2xpY2UoaSkuYXBwZW5kKCk7dGhpcy52YWx1ZVNoYXBlc1tpXT1zaGFwZS5pZDt0aGlzLnNoYXBlc1tzaGFwZS5pZF09aX19dGFyZ2V0LnJlbmRlcigpfX0pOyQuZm4uc3BhcmtsaW5lLmJveD1ib3g9Y3JlYXRlQ2xhc3MoJC5mbi5zcGFya2xpbmUuX2Jhc2Use3R5cGU6XCJib3hcIixpbml0OmZ1bmN0aW9uKGVsLHZhbHVlcyxvcHRpb25zLHdpZHRoLGhlaWdodCl7Ym94Ll9zdXBlci5pbml0LmNhbGwodGhpcyxlbCx2YWx1ZXMsb3B0aW9ucyx3aWR0aCxoZWlnaHQpO3RoaXMudmFsdWVzPSQubWFwKHZhbHVlcyxOdW1iZXIpO3RoaXMud2lkdGg9b3B0aW9ucy5nZXQoXCJ3aWR0aFwiKT09PVwiYXV0b1wiP1wiNC4wZW1cIjp3aWR0aDt0aGlzLmluaXRUYXJnZXQoKTtpZighdGhpcy52YWx1ZXMubGVuZ3RoKXt0aGlzLmRpc2FibGVkPTF9fSxnZXRSZWdpb246ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZ2V0Q3VycmVudFJlZ2lvbkZpZWxkczpmdW5jdGlvbigpe3ZhciByZXN1bHQ9W3tmaWVsZDpcImxxXCIsdmFsdWU6dGhpcy5xdWFydGlsZXNbMF19LHtmaWVsZDpcIm1lZFwiLHZhbHVlOnRoaXMucXVhcnRpbGVzWzFdfSx7ZmllbGQ6XCJ1cVwiLHZhbHVlOnRoaXMucXVhcnRpbGVzWzJdfV07aWYodGhpcy5sb3V0bGllciE9PXVuZGVmaW5lZCl7cmVzdWx0LnB1c2goe2ZpZWxkOlwibG9cIix2YWx1ZTp0aGlzLmxvdXRsaWVyfSl9aWYodGhpcy5yb3V0bGllciE9PXVuZGVmaW5lZCl7cmVzdWx0LnB1c2goe2ZpZWxkOlwicm9cIix2YWx1ZTp0aGlzLnJvdXRsaWVyfSl9aWYodGhpcy5sd2hpc2tlciE9PXVuZGVmaW5lZCl7cmVzdWx0LnB1c2goe2ZpZWxkOlwibHdcIix2YWx1ZTp0aGlzLmx3aGlza2VyfSl9aWYodGhpcy5yd2hpc2tlciE9PXVuZGVmaW5lZCl7cmVzdWx0LnB1c2goe2ZpZWxkOlwicndcIix2YWx1ZTp0aGlzLnJ3aGlza2VyfSl9cmV0dXJuIHJlc3VsdH0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIHRhcmdldD10aGlzLnRhcmdldCx2YWx1ZXM9dGhpcy52YWx1ZXMsdmxlbj12YWx1ZXMubGVuZ3RoLG9wdGlvbnM9dGhpcy5vcHRpb25zLGNhbnZhc1dpZHRoPXRoaXMuY2FudmFzV2lkdGgsY2FudmFzSGVpZ2h0PXRoaXMuY2FudmFzSGVpZ2h0LG1pblZhbHVlPW9wdGlvbnMuZ2V0KFwiY2hhcnRSYW5nZU1pblwiKT09PXVuZGVmaW5lZD9NYXRoLm1pbi5hcHBseShNYXRoLHZhbHVlcyk6b3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlTWluXCIpLG1heFZhbHVlPW9wdGlvbnMuZ2V0KFwiY2hhcnRSYW5nZU1heFwiKT09PXVuZGVmaW5lZD9NYXRoLm1heC5hcHBseShNYXRoLHZhbHVlcyk6b3B0aW9ucy5nZXQoXCJjaGFydFJhbmdlTWF4XCIpLGNhbnZhc0xlZnQ9MCxsd2hpc2tlcixsb3V0bGllcixpcXIscTEscTIscTMscndoaXNrZXIscm91dGxpZXIsaSxzaXplLHVuaXRTaXplO2lmKCFib3guX3N1cGVyLnJlbmRlci5jYWxsKHRoaXMpKXtyZXR1cm59aWYob3B0aW9ucy5nZXQoXCJyYXdcIikpe2lmKG9wdGlvbnMuZ2V0KFwic2hvd091dGxpZXJzXCIpJiZ2YWx1ZXMubGVuZ3RoPjUpe2xvdXRsaWVyPXZhbHVlc1swXTtsd2hpc2tlcj12YWx1ZXNbMV07cTE9dmFsdWVzWzJdO3EyPXZhbHVlc1szXTtxMz12YWx1ZXNbNF07cndoaXNrZXI9dmFsdWVzWzVdO3JvdXRsaWVyPXZhbHVlc1s2XX1lbHNle2x3aGlza2VyPXZhbHVlc1swXTtxMT12YWx1ZXNbMV07cTI9dmFsdWVzWzJdO3EzPXZhbHVlc1szXTtyd2hpc2tlcj12YWx1ZXNbNF19fWVsc2V7dmFsdWVzLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS1ifSk7cTE9cXVhcnRpbGUodmFsdWVzLDEpO3EyPXF1YXJ0aWxlKHZhbHVlcywyKTtxMz1xdWFydGlsZSh2YWx1ZXMsMyk7aXFyPXEzLXExO2lmKG9wdGlvbnMuZ2V0KFwic2hvd091dGxpZXJzXCIpKXtsd2hpc2tlcj1yd2hpc2tlcj11bmRlZmluZWQ7Zm9yKGk9MDtpPHZsZW47aSsrKXtpZihsd2hpc2tlcj09PXVuZGVmaW5lZCYmdmFsdWVzW2ldPnExLWlxcipvcHRpb25zLmdldChcIm91dGxpZXJJUVJcIikpe2x3aGlza2VyPXZhbHVlc1tpXX1pZih2YWx1ZXNbaV08cTMraXFyKm9wdGlvbnMuZ2V0KFwib3V0bGllcklRUlwiKSl7cndoaXNrZXI9dmFsdWVzW2ldfX1sb3V0bGllcj12YWx1ZXNbMF07cm91dGxpZXI9dmFsdWVzW3ZsZW4tMV19ZWxzZXtsd2hpc2tlcj12YWx1ZXNbMF07cndoaXNrZXI9dmFsdWVzW3ZsZW4tMV19fXRoaXMucXVhcnRpbGVzPVtxMSxxMixxM107dGhpcy5sd2hpc2tlcj1sd2hpc2tlcjt0aGlzLnJ3aGlza2VyPXJ3aGlza2VyO3RoaXMubG91dGxpZXI9bG91dGxpZXI7dGhpcy5yb3V0bGllcj1yb3V0bGllcjt1bml0U2l6ZT1jYW52YXNXaWR0aC8obWF4VmFsdWUtbWluVmFsdWUrMSk7aWYob3B0aW9ucy5nZXQoXCJzaG93T3V0bGllcnNcIikpe2NhbnZhc0xlZnQ9TWF0aC5jZWlsKG9wdGlvbnMuZ2V0KFwic3BvdFJhZGl1c1wiKSk7Y2FudmFzV2lkdGgtPTIqTWF0aC5jZWlsKG9wdGlvbnMuZ2V0KFwic3BvdFJhZGl1c1wiKSk7dW5pdFNpemU9Y2FudmFzV2lkdGgvKG1heFZhbHVlLW1pblZhbHVlKzEpO2lmKGxvdXRsaWVyPGx3aGlza2VyKXt0YXJnZXQuZHJhd0NpcmNsZSgobG91dGxpZXItbWluVmFsdWUpKnVuaXRTaXplK2NhbnZhc0xlZnQsY2FudmFzSGVpZ2h0LzIsb3B0aW9ucy5nZXQoXCJzcG90UmFkaXVzXCIpLG9wdGlvbnMuZ2V0KFwib3V0bGllckxpbmVDb2xvclwiKSxvcHRpb25zLmdldChcIm91dGxpZXJGaWxsQ29sb3JcIikpLmFwcGVuZCgpfWlmKHJvdXRsaWVyPnJ3aGlza2VyKXt0YXJnZXQuZHJhd0NpcmNsZSgocm91dGxpZXItbWluVmFsdWUpKnVuaXRTaXplK2NhbnZhc0xlZnQsY2FudmFzSGVpZ2h0LzIsb3B0aW9ucy5nZXQoXCJzcG90UmFkaXVzXCIpLG9wdGlvbnMuZ2V0KFwib3V0bGllckxpbmVDb2xvclwiKSxvcHRpb25zLmdldChcIm91dGxpZXJGaWxsQ29sb3JcIikpLmFwcGVuZCgpfX10YXJnZXQuZHJhd1JlY3QoTWF0aC5yb3VuZCgocTEtbWluVmFsdWUpKnVuaXRTaXplK2NhbnZhc0xlZnQpLE1hdGgucm91bmQoY2FudmFzSGVpZ2h0Ki4xKSxNYXRoLnJvdW5kKChxMy1xMSkqdW5pdFNpemUpLE1hdGgucm91bmQoY2FudmFzSGVpZ2h0Ki44KSxvcHRpb25zLmdldChcImJveExpbmVDb2xvclwiKSxvcHRpb25zLmdldChcImJveEZpbGxDb2xvclwiKSkuYXBwZW5kKCk7dGFyZ2V0LmRyYXdMaW5lKE1hdGgucm91bmQoKGx3aGlza2VyLW1pblZhbHVlKSp1bml0U2l6ZStjYW52YXNMZWZ0KSxNYXRoLnJvdW5kKGNhbnZhc0hlaWdodC8yKSxNYXRoLnJvdW5kKChxMS1taW5WYWx1ZSkqdW5pdFNpemUrY2FudmFzTGVmdCksTWF0aC5yb3VuZChjYW52YXNIZWlnaHQvMiksb3B0aW9ucy5nZXQoXCJsaW5lQ29sb3JcIikpLmFwcGVuZCgpO3RhcmdldC5kcmF3TGluZShNYXRoLnJvdW5kKChsd2hpc2tlci1taW5WYWx1ZSkqdW5pdFNpemUrY2FudmFzTGVmdCksTWF0aC5yb3VuZChjYW52YXNIZWlnaHQvNCksTWF0aC5yb3VuZCgobHdoaXNrZXItbWluVmFsdWUpKnVuaXRTaXplK2NhbnZhc0xlZnQpLE1hdGgucm91bmQoY2FudmFzSGVpZ2h0LWNhbnZhc0hlaWdodC80KSxvcHRpb25zLmdldChcIndoaXNrZXJDb2xvclwiKSkuYXBwZW5kKCk7dGFyZ2V0LmRyYXdMaW5lKE1hdGgucm91bmQoKHJ3aGlza2VyLW1pblZhbHVlKSp1bml0U2l6ZStjYW52YXNMZWZ0KSxNYXRoLnJvdW5kKGNhbnZhc0hlaWdodC8yKSxNYXRoLnJvdW5kKChxMy1taW5WYWx1ZSkqdW5pdFNpemUrY2FudmFzTGVmdCksTWF0aC5yb3VuZChjYW52YXNIZWlnaHQvMiksb3B0aW9ucy5nZXQoXCJsaW5lQ29sb3JcIikpLmFwcGVuZCgpO3RhcmdldC5kcmF3TGluZShNYXRoLnJvdW5kKChyd2hpc2tlci1taW5WYWx1ZSkqdW5pdFNpemUrY2FudmFzTGVmdCksTWF0aC5yb3VuZChjYW52YXNIZWlnaHQvNCksTWF0aC5yb3VuZCgocndoaXNrZXItbWluVmFsdWUpKnVuaXRTaXplK2NhbnZhc0xlZnQpLE1hdGgucm91bmQoY2FudmFzSGVpZ2h0LWNhbnZhc0hlaWdodC80KSxvcHRpb25zLmdldChcIndoaXNrZXJDb2xvclwiKSkuYXBwZW5kKCk7dGFyZ2V0LmRyYXdMaW5lKE1hdGgucm91bmQoKHEyLW1pblZhbHVlKSp1bml0U2l6ZStjYW52YXNMZWZ0KSxNYXRoLnJvdW5kKGNhbnZhc0hlaWdodCouMSksTWF0aC5yb3VuZCgocTItbWluVmFsdWUpKnVuaXRTaXplK2NhbnZhc0xlZnQpLE1hdGgucm91bmQoY2FudmFzSGVpZ2h0Ki45KSxvcHRpb25zLmdldChcIm1lZGlhbkNvbG9yXCIpKS5hcHBlbmQoKTtpZihvcHRpb25zLmdldChcInRhcmdldFwiKSl7c2l6ZT1NYXRoLmNlaWwob3B0aW9ucy5nZXQoXCJzcG90UmFkaXVzXCIpKTt0YXJnZXQuZHJhd0xpbmUoTWF0aC5yb3VuZCgob3B0aW9ucy5nZXQoXCJ0YXJnZXRcIiktbWluVmFsdWUpKnVuaXRTaXplK2NhbnZhc0xlZnQpLE1hdGgucm91bmQoY2FudmFzSGVpZ2h0LzItc2l6ZSksTWF0aC5yb3VuZCgob3B0aW9ucy5nZXQoXCJ0YXJnZXRcIiktbWluVmFsdWUpKnVuaXRTaXplK2NhbnZhc0xlZnQpLE1hdGgucm91bmQoY2FudmFzSGVpZ2h0LzIrc2l6ZSksb3B0aW9ucy5nZXQoXCJ0YXJnZXRDb2xvclwiKSkuYXBwZW5kKCk7dGFyZ2V0LmRyYXdMaW5lKE1hdGgucm91bmQoKG9wdGlvbnMuZ2V0KFwidGFyZ2V0XCIpLW1pblZhbHVlKSp1bml0U2l6ZStjYW52YXNMZWZ0LXNpemUpLE1hdGgucm91bmQoY2FudmFzSGVpZ2h0LzIpLE1hdGgucm91bmQoKG9wdGlvbnMuZ2V0KFwidGFyZ2V0XCIpLW1pblZhbHVlKSp1bml0U2l6ZStjYW52YXNMZWZ0K3NpemUpLE1hdGgucm91bmQoY2FudmFzSGVpZ2h0LzIpLG9wdGlvbnMuZ2V0KFwidGFyZ2V0Q29sb3JcIikpLmFwcGVuZCgpfXRhcmdldC5yZW5kZXIoKX19KTtWU2hhcGU9Y3JlYXRlQ2xhc3Moe2luaXQ6ZnVuY3Rpb24odGFyZ2V0LGlkLHR5cGUsYXJncyl7dGhpcy50YXJnZXQ9dGFyZ2V0O3RoaXMuaWQ9aWQ7dGhpcy50eXBlPXR5cGU7dGhpcy5hcmdzPWFyZ3N9LGFwcGVuZDpmdW5jdGlvbigpe3RoaXMudGFyZ2V0LmFwcGVuZFNoYXBlKHRoaXMpO3JldHVybiB0aGlzfX0pO1ZDYW52YXNfYmFzZT1jcmVhdGVDbGFzcyh7X3B4cmVnZXg6LyhcXGQrKShweCk/XFxzKiQvaSxpbml0OmZ1bmN0aW9uKHdpZHRoLGhlaWdodCx0YXJnZXQpe2lmKCF3aWR0aCl7cmV0dXJufXRoaXMud2lkdGg9d2lkdGg7dGhpcy5oZWlnaHQ9aGVpZ2h0O3RoaXMudGFyZ2V0PXRhcmdldDt0aGlzLmxhc3RTaGFwZUlkPW51bGw7aWYodGFyZ2V0WzBdKXt0YXJnZXQ9dGFyZ2V0WzBdfSQuZGF0YSh0YXJnZXQsXCJfanFzX3ZjYW52YXNcIix0aGlzKX0sZHJhd0xpbmU6ZnVuY3Rpb24oeDEseTEseDIseTIsbGluZUNvbG9yLGxpbmVXaWR0aCl7cmV0dXJuIHRoaXMuZHJhd1NoYXBlKFtbeDEseTFdLFt4Mix5Ml1dLGxpbmVDb2xvcixsaW5lV2lkdGgpfSxkcmF3U2hhcGU6ZnVuY3Rpb24ocGF0aCxsaW5lQ29sb3IsZmlsbENvbG9yLGxpbmVXaWR0aCl7cmV0dXJuIHRoaXMuX2dlblNoYXBlKFwiU2hhcGVcIixbcGF0aCxsaW5lQ29sb3IsZmlsbENvbG9yLGxpbmVXaWR0aF0pfSxkcmF3Q2lyY2xlOmZ1bmN0aW9uKHgseSxyYWRpdXMsbGluZUNvbG9yLGZpbGxDb2xvcixsaW5lV2lkdGgpe3JldHVybiB0aGlzLl9nZW5TaGFwZShcIkNpcmNsZVwiLFt4LHkscmFkaXVzLGxpbmVDb2xvcixmaWxsQ29sb3IsbGluZVdpZHRoXSl9LGRyYXdQaWVTbGljZTpmdW5jdGlvbih4LHkscmFkaXVzLHN0YXJ0QW5nbGUsZW5kQW5nbGUsbGluZUNvbG9yLGZpbGxDb2xvcil7cmV0dXJuIHRoaXMuX2dlblNoYXBlKFwiUGllU2xpY2VcIixbeCx5LHJhZGl1cyxzdGFydEFuZ2xlLGVuZEFuZ2xlLGxpbmVDb2xvcixmaWxsQ29sb3JdKX0sZHJhd1JlY3Q6ZnVuY3Rpb24oeCx5LHdpZHRoLGhlaWdodCxsaW5lQ29sb3IsZmlsbENvbG9yKXtyZXR1cm4gdGhpcy5fZ2VuU2hhcGUoXCJSZWN0XCIsW3gseSx3aWR0aCxoZWlnaHQsbGluZUNvbG9yLGZpbGxDb2xvcl0pfSxnZXRFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzfSxnZXRMYXN0U2hhcGVJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhc3RTaGFwZUlkfSxyZXNldDpmdW5jdGlvbigpe2FsZXJ0KFwicmVzZXQgbm90IGltcGxlbWVudGVkXCIpfSxfaW5zZXJ0OmZ1bmN0aW9uKGVsLHRhcmdldCl7JCh0YXJnZXQpLmh0bWwoZWwpfSxfY2FsY3VsYXRlUGl4ZWxEaW1zOmZ1bmN0aW9uKHdpZHRoLGhlaWdodCxjYW52YXMpe3ZhciBtYXRjaDttYXRjaD10aGlzLl9weHJlZ2V4LmV4ZWMoaGVpZ2h0KTtpZihtYXRjaCl7dGhpcy5waXhlbEhlaWdodD1tYXRjaFsxXX1lbHNle3RoaXMucGl4ZWxIZWlnaHQ9JChjYW52YXMpLmhlaWdodCgpfW1hdGNoPXRoaXMuX3B4cmVnZXguZXhlYyh3aWR0aCk7aWYobWF0Y2gpe3RoaXMucGl4ZWxXaWR0aD1tYXRjaFsxXX1lbHNle3RoaXMucGl4ZWxXaWR0aD0kKGNhbnZhcykud2lkdGgoKX19LF9nZW5TaGFwZTpmdW5jdGlvbihzaGFwZXR5cGUsc2hhcGVhcmdzKXt2YXIgaWQ9c2hhcGVDb3VudCsrO3NoYXBlYXJncy51bnNoaWZ0KGlkKTtyZXR1cm4gbmV3IFZTaGFwZSh0aGlzLGlkLHNoYXBldHlwZSxzaGFwZWFyZ3MpfSxhcHBlbmRTaGFwZTpmdW5jdGlvbihzaGFwZSl7YWxlcnQoXCJhcHBlbmRTaGFwZSBub3QgaW1wbGVtZW50ZWRcIil9LHJlcGxhY2VXaXRoU2hhcGU6ZnVuY3Rpb24oc2hhcGVpZCxzaGFwZSl7YWxlcnQoXCJyZXBsYWNlV2l0aFNoYXBlIG5vdCBpbXBsZW1lbnRlZFwiKX0saW5zZXJ0QWZ0ZXJTaGFwZTpmdW5jdGlvbihzaGFwZWlkLHNoYXBlKXthbGVydChcImluc2VydEFmdGVyU2hhcGUgbm90IGltcGxlbWVudGVkXCIpfSxyZW1vdmVTaGFwZUlkOmZ1bmN0aW9uKHNoYXBlaWQpe2FsZXJ0KFwicmVtb3ZlU2hhcGVJZCBub3QgaW1wbGVtZW50ZWRcIil9LGdldFNoYXBlQXQ6ZnVuY3Rpb24oZWwseCx5KXthbGVydChcImdldFNoYXBlQXQgbm90IGltcGxlbWVudGVkXCIpfSxyZW5kZXI6ZnVuY3Rpb24oKXthbGVydChcInJlbmRlciBub3QgaW1wbGVtZW50ZWRcIil9fSk7VkNhbnZhc19jYW52YXM9Y3JlYXRlQ2xhc3MoVkNhbnZhc19iYXNlLHtpbml0OmZ1bmN0aW9uKHdpZHRoLGhlaWdodCx0YXJnZXQsaW50ZXJhY3Qpe1ZDYW52YXNfY2FudmFzLl9zdXBlci5pbml0LmNhbGwodGhpcyx3aWR0aCxoZWlnaHQsdGFyZ2V0KTt0aGlzLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO2lmKHRhcmdldFswXSl7dGFyZ2V0PXRhcmdldFswXX0kLmRhdGEodGFyZ2V0LFwiX2pxc192Y2FudmFzXCIsdGhpcyk7JCh0aGlzLmNhbnZhcykuY3NzKHtkaXNwbGF5OlwiaW5saW5lLWJsb2NrXCIsd2lkdGg6d2lkdGgsaGVpZ2h0OmhlaWdodCx2ZXJ0aWNhbEFsaWduOlwidG9wXCJ9KTt0aGlzLl9pbnNlcnQodGhpcy5jYW52YXMsdGFyZ2V0KTt0aGlzLl9jYWxjdWxhdGVQaXhlbERpbXMod2lkdGgsaGVpZ2h0LHRoaXMuY2FudmFzKTt0aGlzLmNhbnZhcy53aWR0aD10aGlzLnBpeGVsV2lkdGg7dGhpcy5jYW52YXMuaGVpZ2h0PXRoaXMucGl4ZWxIZWlnaHQ7dGhpcy5pbnRlcmFjdD1pbnRlcmFjdDt0aGlzLnNoYXBlcz17fTt0aGlzLnNoYXBlc2VxPVtdO3RoaXMuY3VycmVudFRhcmdldFNoYXBlSWQ9dW5kZWZpbmVkOyQodGhpcy5jYW52YXMpLmNzcyh7d2lkdGg6dGhpcy5waXhlbFdpZHRoLGhlaWdodDp0aGlzLnBpeGVsSGVpZ2h0fSl9LF9nZXRDb250ZXh0OmZ1bmN0aW9uKGxpbmVDb2xvcixmaWxsQ29sb3IsbGluZVdpZHRoKXt2YXIgY29udGV4dD10aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7aWYobGluZUNvbG9yIT09dW5kZWZpbmVkKXtjb250ZXh0LnN0cm9rZVN0eWxlPWxpbmVDb2xvcn1jb250ZXh0LmxpbmVXaWR0aD1saW5lV2lkdGg9PT11bmRlZmluZWQ/MTpsaW5lV2lkdGg7aWYoZmlsbENvbG9yIT09dW5kZWZpbmVkKXtjb250ZXh0LmZpbGxTdHlsZT1maWxsQ29sb3J9cmV0dXJuIGNvbnRleHR9LHJlc2V0OmZ1bmN0aW9uKCl7dmFyIGNvbnRleHQ9dGhpcy5fZ2V0Q29udGV4dCgpO2NvbnRleHQuY2xlYXJSZWN0KDAsMCx0aGlzLnBpeGVsV2lkdGgsdGhpcy5waXhlbEhlaWdodCk7dGhpcy5zaGFwZXM9e307dGhpcy5zaGFwZXNlcT1bXTt0aGlzLmN1cnJlbnRUYXJnZXRTaGFwZUlkPXVuZGVmaW5lZH0sX2RyYXdTaGFwZTpmdW5jdGlvbihzaGFwZWlkLHBhdGgsbGluZUNvbG9yLGZpbGxDb2xvcixsaW5lV2lkdGgpe3ZhciBjb250ZXh0PXRoaXMuX2dldENvbnRleHQobGluZUNvbG9yLGZpbGxDb2xvcixsaW5lV2lkdGgpLGkscGxlbjtjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQubW92ZVRvKHBhdGhbMF1bMF0rLjUscGF0aFswXVsxXSsuNSk7Zm9yKGk9MSxwbGVuPXBhdGgubGVuZ3RoO2k8cGxlbjtpKyspe2NvbnRleHQubGluZVRvKHBhdGhbaV1bMF0rLjUscGF0aFtpXVsxXSsuNSl9aWYobGluZUNvbG9yIT09dW5kZWZpbmVkKXtjb250ZXh0LnN0cm9rZSgpfWlmKGZpbGxDb2xvciE9PXVuZGVmaW5lZCl7Y29udGV4dC5maWxsKCl9aWYodGhpcy50YXJnZXRYIT09dW5kZWZpbmVkJiZ0aGlzLnRhcmdldFkhPT11bmRlZmluZWQmJmNvbnRleHQuaXNQb2ludEluUGF0aCh0aGlzLnRhcmdldFgsdGhpcy50YXJnZXRZKSl7dGhpcy5jdXJyZW50VGFyZ2V0U2hhcGVJZD1zaGFwZWlkfX0sX2RyYXdDaXJjbGU6ZnVuY3Rpb24oc2hhcGVpZCx4LHkscmFkaXVzLGxpbmVDb2xvcixmaWxsQ29sb3IsbGluZVdpZHRoKXt2YXIgY29udGV4dD10aGlzLl9nZXRDb250ZXh0KGxpbmVDb2xvcixmaWxsQ29sb3IsbGluZVdpZHRoKTtjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQuYXJjKHgseSxyYWRpdXMsMCwyKk1hdGguUEksZmFsc2UpO2lmKHRoaXMudGFyZ2V0WCE9PXVuZGVmaW5lZCYmdGhpcy50YXJnZXRZIT09dW5kZWZpbmVkJiZjb250ZXh0LmlzUG9pbnRJblBhdGgodGhpcy50YXJnZXRYLHRoaXMudGFyZ2V0WSkpe3RoaXMuY3VycmVudFRhcmdldFNoYXBlSWQ9c2hhcGVpZH1pZihsaW5lQ29sb3IhPT11bmRlZmluZWQpe2NvbnRleHQuc3Ryb2tlKCl9aWYoZmlsbENvbG9yIT09dW5kZWZpbmVkKXtjb250ZXh0LmZpbGwoKX19LF9kcmF3UGllU2xpY2U6ZnVuY3Rpb24oc2hhcGVpZCx4LHkscmFkaXVzLHN0YXJ0QW5nbGUsZW5kQW5nbGUsbGluZUNvbG9yLGZpbGxDb2xvcil7dmFyIGNvbnRleHQ9dGhpcy5fZ2V0Q29udGV4dChsaW5lQ29sb3IsZmlsbENvbG9yKTtjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQubW92ZVRvKHgseSk7Y29udGV4dC5hcmMoeCx5LHJhZGl1cyxzdGFydEFuZ2xlLGVuZEFuZ2xlLGZhbHNlKTtjb250ZXh0LmxpbmVUbyh4LHkpO2NvbnRleHQuY2xvc2VQYXRoKCk7aWYobGluZUNvbG9yIT09dW5kZWZpbmVkKXtjb250ZXh0LnN0cm9rZSgpfWlmKGZpbGxDb2xvcil7Y29udGV4dC5maWxsKCl9aWYodGhpcy50YXJnZXRYIT09dW5kZWZpbmVkJiZ0aGlzLnRhcmdldFkhPT11bmRlZmluZWQmJmNvbnRleHQuaXNQb2ludEluUGF0aCh0aGlzLnRhcmdldFgsdGhpcy50YXJnZXRZKSl7dGhpcy5jdXJyZW50VGFyZ2V0U2hhcGVJZD1zaGFwZWlkfX0sX2RyYXdSZWN0OmZ1bmN0aW9uKHNoYXBlaWQseCx5LHdpZHRoLGhlaWdodCxsaW5lQ29sb3IsZmlsbENvbG9yKXtyZXR1cm4gdGhpcy5fZHJhd1NoYXBlKHNoYXBlaWQsW1t4LHldLFt4K3dpZHRoLHldLFt4K3dpZHRoLHkraGVpZ2h0XSxbeCx5K2hlaWdodF0sW3gseV1dLGxpbmVDb2xvcixmaWxsQ29sb3IpfSxhcHBlbmRTaGFwZTpmdW5jdGlvbihzaGFwZSl7dGhpcy5zaGFwZXNbc2hhcGUuaWRdPXNoYXBlO3RoaXMuc2hhcGVzZXEucHVzaChzaGFwZS5pZCk7dGhpcy5sYXN0U2hhcGVJZD1zaGFwZS5pZDtyZXR1cm4gc2hhcGUuaWR9LHJlcGxhY2VXaXRoU2hhcGU6ZnVuY3Rpb24oc2hhcGVpZCxzaGFwZSl7dmFyIHNoYXBlc2VxPXRoaXMuc2hhcGVzZXEsaTt0aGlzLnNoYXBlc1tzaGFwZS5pZF09c2hhcGU7Zm9yKGk9c2hhcGVzZXEubGVuZ3RoO2ktLTspe2lmKHNoYXBlc2VxW2ldPT1zaGFwZWlkKXtzaGFwZXNlcVtpXT1zaGFwZS5pZH19ZGVsZXRlIHRoaXMuc2hhcGVzW3NoYXBlaWRdfSxyZXBsYWNlV2l0aFNoYXBlczpmdW5jdGlvbihzaGFwZWlkcyxzaGFwZXMpe3ZhciBzaGFwZXNlcT10aGlzLnNoYXBlc2VxLHNoYXBlbWFwPXt9LHNpZCxpLGZpcnN0O2ZvcihpPXNoYXBlaWRzLmxlbmd0aDtpLS07KXtzaGFwZW1hcFtzaGFwZWlkc1tpXV09dHJ1ZX1mb3IoaT1zaGFwZXNlcS5sZW5ndGg7aS0tOyl7c2lkPXNoYXBlc2VxW2ldO2lmKHNoYXBlbWFwW3NpZF0pe3NoYXBlc2VxLnNwbGljZShpLDEpO2RlbGV0ZSB0aGlzLnNoYXBlc1tzaWRdO2ZpcnN0PWl9fWZvcihpPXNoYXBlcy5sZW5ndGg7aS0tOyl7c2hhcGVzZXEuc3BsaWNlKGZpcnN0LDAsc2hhcGVzW2ldLmlkKTt0aGlzLnNoYXBlc1tzaGFwZXNbaV0uaWRdPXNoYXBlc1tpXX19LGluc2VydEFmdGVyU2hhcGU6ZnVuY3Rpb24oc2hhcGVpZCxzaGFwZSl7dmFyIHNoYXBlc2VxPXRoaXMuc2hhcGVzZXEsaTtmb3IoaT1zaGFwZXNlcS5sZW5ndGg7aS0tOyl7aWYoc2hhcGVzZXFbaV09PT1zaGFwZWlkKXtzaGFwZXNlcS5zcGxpY2UoaSsxLDAsc2hhcGUuaWQpO3RoaXMuc2hhcGVzW3NoYXBlLmlkXT1zaGFwZTtyZXR1cm59fX0scmVtb3ZlU2hhcGVJZDpmdW5jdGlvbihzaGFwZWlkKXt2YXIgc2hhcGVzZXE9dGhpcy5zaGFwZXNlcSxpO2ZvcihpPXNoYXBlc2VxLmxlbmd0aDtpLS07KXtpZihzaGFwZXNlcVtpXT09PXNoYXBlaWQpe3NoYXBlc2VxLnNwbGljZShpLDEpO2JyZWFrfX1kZWxldGUgdGhpcy5zaGFwZXNbc2hhcGVpZF19LGdldFNoYXBlQXQ6ZnVuY3Rpb24oZWwseCx5KXt0aGlzLnRhcmdldFg9eDt0aGlzLnRhcmdldFk9eTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzLmN1cnJlbnRUYXJnZXRTaGFwZUlkfSxyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgc2hhcGVzZXE9dGhpcy5zaGFwZXNlcSxzaGFwZXM9dGhpcy5zaGFwZXMsc2hhcGVDb3VudD1zaGFwZXNlcS5sZW5ndGgsY29udGV4dD10aGlzLl9nZXRDb250ZXh0KCksc2hhcGVpZCxzaGFwZSxpO2NvbnRleHQuY2xlYXJSZWN0KDAsMCx0aGlzLnBpeGVsV2lkdGgsdGhpcy5waXhlbEhlaWdodCk7Zm9yKGk9MDtpPHNoYXBlQ291bnQ7aSsrKXtzaGFwZWlkPXNoYXBlc2VxW2ldO3NoYXBlPXNoYXBlc1tzaGFwZWlkXTt0aGlzW1wiX2RyYXdcIitzaGFwZS50eXBlXS5hcHBseSh0aGlzLHNoYXBlLmFyZ3MpfWlmKCF0aGlzLmludGVyYWN0KXt0aGlzLnNoYXBlcz17fTt0aGlzLnNoYXBlc2VxPVtdfX19KTtWQ2FudmFzX3ZtbD1jcmVhdGVDbGFzcyhWQ2FudmFzX2Jhc2Use2luaXQ6ZnVuY3Rpb24od2lkdGgsaGVpZ2h0LHRhcmdldCl7dmFyIGdyb3VwZWw7VkNhbnZhc192bWwuX3N1cGVyLmluaXQuY2FsbCh0aGlzLHdpZHRoLGhlaWdodCx0YXJnZXQpO2lmKHRhcmdldFswXSl7dGFyZ2V0PXRhcmdldFswXX0kLmRhdGEodGFyZ2V0LFwiX2pxc192Y2FudmFzXCIsdGhpcyk7dGhpcy5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7JCh0aGlzLmNhbnZhcykuY3NzKHtkaXNwbGF5OlwiaW5saW5lLWJsb2NrXCIscG9zaXRpb246XCJyZWxhdGl2ZVwiLG92ZXJmbG93OlwiaGlkZGVuXCIsd2lkdGg6d2lkdGgsaGVpZ2h0OmhlaWdodCxtYXJnaW46XCIwcHhcIixwYWRkaW5nOlwiMHB4XCIsdmVydGljYWxBbGlnbjpcInRvcFwifSk7dGhpcy5faW5zZXJ0KHRoaXMuY2FudmFzLHRhcmdldCk7dGhpcy5fY2FsY3VsYXRlUGl4ZWxEaW1zKHdpZHRoLGhlaWdodCx0aGlzLmNhbnZhcyk7dGhpcy5jYW52YXMud2lkdGg9dGhpcy5waXhlbFdpZHRoO3RoaXMuY2FudmFzLmhlaWdodD10aGlzLnBpeGVsSGVpZ2h0O2dyb3VwZWw9Jzx2Omdyb3VwIGNvb3Jkb3JpZ2luPVwiMCAwXCIgY29vcmRzaXplPVwiJyt0aGlzLnBpeGVsV2lkdGgrXCIgXCIrdGhpcy5waXhlbEhlaWdodCsnXCInKycgc3R5bGU9XCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6Jyt0aGlzLnBpeGVsV2lkdGgrXCJweDtoZWlnaHQ9XCIrdGhpcy5waXhlbEhlaWdodCsncHg7XCI+PC92Omdyb3VwPic7dGhpcy5jYW52YXMuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYmVmb3JlRW5kXCIsZ3JvdXBlbCk7dGhpcy5ncm91cD0kKHRoaXMuY2FudmFzKS5jaGlsZHJlbigpWzBdO3RoaXMucmVuZGVyZWQ9ZmFsc2U7dGhpcy5wcmVyZW5kZXI9XCJcIn0sX2RyYXdTaGFwZTpmdW5jdGlvbihzaGFwZWlkLHBhdGgsbGluZUNvbG9yLGZpbGxDb2xvcixsaW5lV2lkdGgpe3ZhciB2cGF0aD1bXSxpbml0aWFsLHN0cm9rZSxmaWxsLGNsb3NlZCx2ZWwscGxlbixpO2ZvcihpPTAscGxlbj1wYXRoLmxlbmd0aDtpPHBsZW47aSsrKXt2cGF0aFtpXT1cIlwiK3BhdGhbaV1bMF0rXCIsXCIrcGF0aFtpXVsxXX1pbml0aWFsPXZwYXRoLnNwbGljZSgwLDEpO2xpbmVXaWR0aD1saW5lV2lkdGg9PT11bmRlZmluZWQ/MTpsaW5lV2lkdGg7c3Ryb2tlPWxpbmVDb2xvcj09PXVuZGVmaW5lZD8nIHN0cm9rZWQ9XCJmYWxzZVwiICc6JyBzdHJva2VXZWlnaHQ9XCInK2xpbmVXaWR0aCsncHhcIiBzdHJva2VDb2xvcj1cIicrbGluZUNvbG9yKydcIiAnO2ZpbGw9ZmlsbENvbG9yPT09dW5kZWZpbmVkPycgZmlsbGVkPVwiZmFsc2VcIic6JyBmaWxsQ29sb3I9XCInK2ZpbGxDb2xvcisnXCIgZmlsbGVkPVwidHJ1ZVwiICc7Y2xvc2VkPXZwYXRoWzBdPT09dnBhdGhbdnBhdGgubGVuZ3RoLTFdP1wieCBcIjpcIlwiO3ZlbD0nPHY6c2hhcGUgY29vcmRvcmlnaW49XCIwIDBcIiBjb29yZHNpemU9XCInK3RoaXMucGl4ZWxXaWR0aCtcIiBcIit0aGlzLnBpeGVsSGVpZ2h0KydcIiAnKycgaWQ9XCJqcXNzaGFwZScrc2hhcGVpZCsnXCIgJytzdHJva2UrZmlsbCsnIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7bGVmdDowcHg7dG9wOjBweDtoZWlnaHQ6Jyt0aGlzLnBpeGVsSGVpZ2h0K1wicHg7d2lkdGg6XCIrdGhpcy5waXhlbFdpZHRoKydweDtwYWRkaW5nOjBweDttYXJnaW46MHB4O1wiICcrJyBwYXRoPVwibSAnK2luaXRpYWwrXCIgbCBcIit2cGF0aC5qb2luKFwiLCBcIikrXCIgXCIrY2xvc2VkKydlXCI+JytcIiA8L3Y6c2hhcGU+XCI7cmV0dXJuIHZlbH0sX2RyYXdDaXJjbGU6ZnVuY3Rpb24oc2hhcGVpZCx4LHkscmFkaXVzLGxpbmVDb2xvcixmaWxsQ29sb3IsbGluZVdpZHRoKXt2YXIgc3Ryb2tlLGZpbGwsdmVsO3gtPXJhZGl1czt5LT1yYWRpdXM7c3Ryb2tlPWxpbmVDb2xvcj09PXVuZGVmaW5lZD8nIHN0cm9rZWQ9XCJmYWxzZVwiICc6JyBzdHJva2VXZWlnaHQ9XCInK2xpbmVXaWR0aCsncHhcIiBzdHJva2VDb2xvcj1cIicrbGluZUNvbG9yKydcIiAnO2ZpbGw9ZmlsbENvbG9yPT09dW5kZWZpbmVkPycgZmlsbGVkPVwiZmFsc2VcIic6JyBmaWxsQ29sb3I9XCInK2ZpbGxDb2xvcisnXCIgZmlsbGVkPVwidHJ1ZVwiICc7dmVsPVwiPHY6b3ZhbCBcIisnIGlkPVwianFzc2hhcGUnK3NoYXBlaWQrJ1wiICcrc3Ryb2tlK2ZpbGwrJyBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO3RvcDonK3krXCJweDsgbGVmdDpcIit4K1wicHg7IHdpZHRoOlwiK3JhZGl1cyoyK1wicHg7IGhlaWdodDpcIityYWRpdXMqMisncHhcIj48L3Y6b3ZhbD4nO3JldHVybiB2ZWx9LF9kcmF3UGllU2xpY2U6ZnVuY3Rpb24oc2hhcGVpZCx4LHkscmFkaXVzLHN0YXJ0QW5nbGUsZW5kQW5nbGUsbGluZUNvbG9yLGZpbGxDb2xvcil7dmFyIHZwYXRoLHN0YXJ0eCxzdGFydHksZW5keCxlbmR5LHN0cm9rZSxmaWxsLHZlbDtpZihzdGFydEFuZ2xlPT09ZW5kQW5nbGUpe3JldHVyblwiXCJ9aWYoZW5kQW5nbGUtc3RhcnRBbmdsZT09PTIqTWF0aC5QSSl7c3RhcnRBbmdsZT0wO2VuZEFuZ2xlPTIqTWF0aC5QSX1zdGFydHg9eCtNYXRoLnJvdW5kKE1hdGguY29zKHN0YXJ0QW5nbGUpKnJhZGl1cyk7c3RhcnR5PXkrTWF0aC5yb3VuZChNYXRoLnNpbihzdGFydEFuZ2xlKSpyYWRpdXMpO2VuZHg9eCtNYXRoLnJvdW5kKE1hdGguY29zKGVuZEFuZ2xlKSpyYWRpdXMpO2VuZHk9eStNYXRoLnJvdW5kKE1hdGguc2luKGVuZEFuZ2xlKSpyYWRpdXMpO2lmKHN0YXJ0eD09PWVuZHgmJnN0YXJ0eT09PWVuZHkpe2lmKGVuZEFuZ2xlLXN0YXJ0QW5nbGU8TWF0aC5QSSl7cmV0dXJuXCJcIn1zdGFydHg9ZW5keD14K3JhZGl1cztzdGFydHk9ZW5keT15fWlmKHN0YXJ0eD09PWVuZHgmJnN0YXJ0eT09PWVuZHkmJmVuZEFuZ2xlLXN0YXJ0QW5nbGU8TWF0aC5QSSl7cmV0dXJuXCJcIn12cGF0aD1beC1yYWRpdXMseS1yYWRpdXMseCtyYWRpdXMseStyYWRpdXMsc3RhcnR4LHN0YXJ0eSxlbmR4LGVuZHldO3N0cm9rZT1saW5lQ29sb3I9PT11bmRlZmluZWQ/JyBzdHJva2VkPVwiZmFsc2VcIiAnOicgc3Ryb2tlV2VpZ2h0PVwiMXB4XCIgc3Ryb2tlQ29sb3I9XCInK2xpbmVDb2xvcisnXCIgJztmaWxsPWZpbGxDb2xvcj09PXVuZGVmaW5lZD8nIGZpbGxlZD1cImZhbHNlXCInOicgZmlsbENvbG9yPVwiJytmaWxsQ29sb3IrJ1wiIGZpbGxlZD1cInRydWVcIiAnO3ZlbD0nPHY6c2hhcGUgY29vcmRvcmlnaW49XCIwIDBcIiBjb29yZHNpemU9XCInK3RoaXMucGl4ZWxXaWR0aCtcIiBcIit0aGlzLnBpeGVsSGVpZ2h0KydcIiAnKycgaWQ9XCJqcXNzaGFwZScrc2hhcGVpZCsnXCIgJytzdHJva2UrZmlsbCsnIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7bGVmdDowcHg7dG9wOjBweDtoZWlnaHQ6Jyt0aGlzLnBpeGVsSGVpZ2h0K1wicHg7d2lkdGg6XCIrdGhpcy5waXhlbFdpZHRoKydweDtwYWRkaW5nOjBweDttYXJnaW46MHB4O1wiICcrJyBwYXRoPVwibSAnK3grXCIsXCIreStcIiB3YSBcIit2cGF0aC5qb2luKFwiLCBcIikrJyB4IGVcIj4nK1wiIDwvdjpzaGFwZT5cIjtyZXR1cm4gdmVsfSxfZHJhd1JlY3Q6ZnVuY3Rpb24oc2hhcGVpZCx4LHksd2lkdGgsaGVpZ2h0LGxpbmVDb2xvcixmaWxsQ29sb3Ipe3JldHVybiB0aGlzLl9kcmF3U2hhcGUoc2hhcGVpZCxbW3gseV0sW3gseStoZWlnaHRdLFt4K3dpZHRoLHkraGVpZ2h0XSxbeCt3aWR0aCx5XSxbeCx5XV0sbGluZUNvbG9yLGZpbGxDb2xvcil9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5ncm91cC5pbm5lckhUTUw9XCJcIn0sYXBwZW5kU2hhcGU6ZnVuY3Rpb24oc2hhcGUpe3ZhciB2ZWw9dGhpc1tcIl9kcmF3XCIrc2hhcGUudHlwZV0uYXBwbHkodGhpcyxzaGFwZS5hcmdzKTtpZih0aGlzLnJlbmRlcmVkKXt0aGlzLmdyb3VwLmluc2VydEFkamFjZW50SFRNTChcImJlZm9yZUVuZFwiLHZlbCl9ZWxzZXt0aGlzLnByZXJlbmRlcis9dmVsfXRoaXMubGFzdFNoYXBlSWQ9c2hhcGUuaWQ7cmV0dXJuIHNoYXBlLmlkfSxyZXBsYWNlV2l0aFNoYXBlOmZ1bmN0aW9uKHNoYXBlaWQsc2hhcGUpe3ZhciBleGlzdGluZz0kKFwiI2pxc3NoYXBlXCIrc2hhcGVpZCksdmVsPXRoaXNbXCJfZHJhd1wiK3NoYXBlLnR5cGVdLmFwcGx5KHRoaXMsc2hhcGUuYXJncyk7ZXhpc3RpbmdbMF0ub3V0ZXJIVE1MPXZlbH0scmVwbGFjZVdpdGhTaGFwZXM6ZnVuY3Rpb24oc2hhcGVpZHMsc2hhcGVzKXt2YXIgZXhpc3Rpbmc9JChcIiNqcXNzaGFwZVwiK3NoYXBlaWRzWzBdKSxyZXBsYWNlPVwiXCIsc2xlbj1zaGFwZXMubGVuZ3RoLGk7Zm9yKGk9MDtpPHNsZW47aSsrKXtyZXBsYWNlKz10aGlzW1wiX2RyYXdcIitzaGFwZXNbaV0udHlwZV0uYXBwbHkodGhpcyxzaGFwZXNbaV0uYXJncyl9ZXhpc3RpbmdbMF0ub3V0ZXJIVE1MPXJlcGxhY2U7Zm9yKGk9MTtpPHNoYXBlaWRzLmxlbmd0aDtpKyspeyQoXCIjanFzc2hhcGVcIitzaGFwZWlkc1tpXSkucmVtb3ZlKCl9fSxpbnNlcnRBZnRlclNoYXBlOmZ1bmN0aW9uKHNoYXBlaWQsc2hhcGUpe3ZhciBleGlzdGluZz0kKFwiI2pxc3NoYXBlXCIrc2hhcGVpZCksdmVsPXRoaXNbXCJfZHJhd1wiK3NoYXBlLnR5cGVdLmFwcGx5KHRoaXMsc2hhcGUuYXJncyk7ZXhpc3RpbmdbMF0uaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJFbmRcIix2ZWwpfSxyZW1vdmVTaGFwZUlkOmZ1bmN0aW9uKHNoYXBlaWQpe3ZhciBleGlzdGluZz0kKFwiI2pxc3NoYXBlXCIrc2hhcGVpZCk7dGhpcy5ncm91cC5yZW1vdmVDaGlsZChleGlzdGluZ1swXSl9LGdldFNoYXBlQXQ6ZnVuY3Rpb24oZWwseCx5KXt2YXIgc2hhcGVpZD1lbC5pZC5zdWJzdHIoOCk7cmV0dXJuIHNoYXBlaWR9LHJlbmRlcjpmdW5jdGlvbigpe2lmKCF0aGlzLnJlbmRlcmVkKXt0aGlzLmdyb3VwLmlubmVySFRNTD10aGlzLnByZXJlbmRlcjt0aGlzLnJlbmRlcmVkPXRydWV9fX0pfSl9KShkb2N1bWVudCxNYXRoKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3ZlbmRvci9hbG1hc2FlZWQyMDEwL2FkbWlubHRlL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5LXNwYXJrbGluZS9kaXN0L2pxdWVyeS5zcGFya2xpbmUubWluLmpzXG4vLyBtb2R1bGUgaWQgPSA1M1xuLy8gbW9kdWxlIGNodW5rcyA9IDEiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///53\n");
-/******/ }); \ No newline at end of file
+/***/ }),
+/* 54 */
+/***/ (function(module, exports) {
+
+eval("var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/**\n * jVectorMap version 1.2.2\n *\n * Copyright 2011-2013, Kirill Lebedev\n * Licensed under the MIT license.\n *\n */(function (e) {\n var t = { set: { colors: 1, values: 1, backgroundColor: 1, scaleColors: 1, normalizeFunction: 1, focus: 1 }, get: { selectedRegions: 1, selectedMarkers: 1, mapObject: 1, regionName: 1 } };e.fn.vectorMap = function (e) {\n var n,\n r,\n i,\n n = this.children(\".jvectormap-container\").data(\"mapObject\");if (e === \"addMap\") jvm.WorldMap.maps[arguments[1]] = arguments[2];else {\n if (!(e !== \"set\" && e !== \"get\" || !t[e][arguments[1]])) return r = arguments[1].charAt(0).toUpperCase() + arguments[1].substr(1), n[e + r].apply(n, Array.prototype.slice.call(arguments, 2));e = e || {}, e.container = this, n = new jvm.WorldMap(e);\n }return this;\n };\n})(jQuery), function (e) {\n function r(t) {\n var n = t || window.event,\n r = [].slice.call(arguments, 1),\n i = 0,\n s = !0,\n o = 0,\n u = 0;return t = e.event.fix(n), t.type = \"mousewheel\", n.wheelDelta && (i = n.wheelDelta / 120), n.detail && (i = -n.detail / 3), u = i, n.axis !== undefined && n.axis === n.HORIZONTAL_AXIS && (u = 0, o = -1 * i), n.wheelDeltaY !== undefined && (u = n.wheelDeltaY / 120), n.wheelDeltaX !== undefined && (o = -1 * n.wheelDeltaX / 120), r.unshift(t, i, o, u), (e.event.dispatch || e.event.handle).apply(this, r);\n }var t = [\"DOMMouseScroll\", \"mousewheel\"];if (e.event.fixHooks) for (var n = t.length; n;) {\n e.event.fixHooks[t[--n]] = e.event.mouseHooks;\n }e.event.special.mousewheel = { setup: function setup() {\n if (this.addEventListener) for (var e = t.length; e;) {\n this.addEventListener(t[--e], r, !1);\n } else this.onmousewheel = r;\n }, teardown: function teardown() {\n if (this.removeEventListener) for (var e = t.length; e;) {\n this.removeEventListener(t[--e], r, !1);\n } else this.onmousewheel = null;\n } }, e.fn.extend({ mousewheel: function mousewheel(e) {\n return e ? this.bind(\"mousewheel\", e) : this.trigger(\"mousewheel\");\n }, unmousewheel: function unmousewheel(e) {\n return this.unbind(\"mousewheel\", e);\n } });\n}(jQuery);var jvm = { inherits: function inherits(e, t) {\n function n() {}n.prototype = t.prototype, e.prototype = new n(), e.prototype.constructor = e, e.parentClass = t;\n }, mixin: function mixin(e, t) {\n var n;for (n in t.prototype) {\n t.prototype.hasOwnProperty(n) && (e.prototype[n] = t.prototype[n]);\n }\n }, min: function min(e) {\n var t = Number.MAX_VALUE,\n n;if (e instanceof Array) for (n = 0; n < e.length; n++) {\n e[n] < t && (t = e[n]);\n } else for (n in e) {\n e[n] < t && (t = e[n]);\n }return t;\n }, max: function max(e) {\n var t = Number.MIN_VALUE,\n n;if (e instanceof Array) for (n = 0; n < e.length; n++) {\n e[n] > t && (t = e[n]);\n } else for (n in e) {\n e[n] > t && (t = e[n]);\n }return t;\n }, keys: function keys(e) {\n var t = [],\n n;for (n in e) {\n t.push(n);\n }return t;\n }, values: function values(e) {\n var t = [],\n n,\n r;for (r = 0; r < arguments.length; r++) {\n e = arguments[r];for (n in e) {\n t.push(e[n]);\n }\n }return t;\n } };jvm.$ = jQuery, jvm.AbstractElement = function (e, t) {\n this.node = this.createElement(e), this.name = e, this.properties = {}, t && this.set(t);\n}, jvm.AbstractElement.prototype.set = function (e, t) {\n var n;if ((typeof e === \"undefined\" ? \"undefined\" : _typeof(e)) == \"object\") for (n in e) {\n this.properties[n] = e[n], this.applyAttr(n, e[n]);\n } else this.properties[e] = t, this.applyAttr(e, t);\n}, jvm.AbstractElement.prototype.get = function (e) {\n return this.properties[e];\n}, jvm.AbstractElement.prototype.applyAttr = function (e, t) {\n this.node.setAttribute(e, t);\n}, jvm.AbstractElement.prototype.remove = function () {\n jvm.$(this.node).remove();\n}, jvm.AbstractCanvasElement = function (e, t, n) {\n this.container = e, this.setSize(t, n), this.rootElement = new jvm[this.classPrefix + \"GroupElement\"](), this.node.appendChild(this.rootElement.node), this.container.appendChild(this.node);\n}, jvm.AbstractCanvasElement.prototype.add = function (e, t) {\n t = t || this.rootElement, t.add(e), e.canvas = this;\n}, jvm.AbstractCanvasElement.prototype.addPath = function (e, t, n) {\n var r = new jvm[this.classPrefix + \"PathElement\"](e, t);return this.add(r, n), r;\n}, jvm.AbstractCanvasElement.prototype.addCircle = function (e, t, n) {\n var r = new jvm[this.classPrefix + \"CircleElement\"](e, t);return this.add(r, n), r;\n}, jvm.AbstractCanvasElement.prototype.addGroup = function (e) {\n var t = new jvm[this.classPrefix + \"GroupElement\"]();return e ? e.node.appendChild(t.node) : this.node.appendChild(t.node), t.canvas = this, t;\n}, jvm.AbstractShapeElement = function (e, t, n) {\n this.style = n || {}, this.style.current = {}, this.isHovered = !1, this.isSelected = !1, this.updateStyle();\n}, jvm.AbstractShapeElement.prototype.setHovered = function (e) {\n this.isHovered !== e && (this.isHovered = e, this.updateStyle());\n}, jvm.AbstractShapeElement.prototype.setSelected = function (e) {\n this.isSelected !== e && (this.isSelected = e, this.updateStyle(), jvm.$(this.node).trigger(\"selected\", [e]));\n}, jvm.AbstractShapeElement.prototype.setStyle = function (e, t) {\n var n = {};(typeof e === \"undefined\" ? \"undefined\" : _typeof(e)) == \"object\" ? n = e : n[e] = t, jvm.$.extend(this.style.current, n), this.updateStyle();\n}, jvm.AbstractShapeElement.prototype.updateStyle = function () {\n var e = {};jvm.AbstractShapeElement.mergeStyles(e, this.style.initial), jvm.AbstractShapeElement.mergeStyles(e, this.style.current), this.isHovered && jvm.AbstractShapeElement.mergeStyles(e, this.style.hover), this.isSelected && (jvm.AbstractShapeElement.mergeStyles(e, this.style.selected), this.isHovered && jvm.AbstractShapeElement.mergeStyles(e, this.style.selectedHover)), this.set(e);\n}, jvm.AbstractShapeElement.mergeStyles = function (e, t) {\n var n;t = t || {};for (n in t) {\n t[n] === null ? delete e[n] : e[n] = t[n];\n }\n}, jvm.SVGElement = function (e, t) {\n jvm.SVGElement.parentClass.apply(this, arguments);\n}, jvm.inherits(jvm.SVGElement, jvm.AbstractElement), jvm.SVGElement.svgns = \"http://www.w3.org/2000/svg\", jvm.SVGElement.prototype.createElement = function (e) {\n return document.createElementNS(jvm.SVGElement.svgns, e);\n}, jvm.SVGElement.prototype.addClass = function (e) {\n this.node.setAttribute(\"class\", e);\n}, jvm.SVGElement.prototype.getElementCtr = function (e) {\n return jvm[\"SVG\" + e];\n}, jvm.SVGElement.prototype.getBBox = function () {\n return this.node.getBBox();\n}, jvm.SVGGroupElement = function () {\n jvm.SVGGroupElement.parentClass.call(this, \"g\");\n}, jvm.inherits(jvm.SVGGroupElement, jvm.SVGElement), jvm.SVGGroupElement.prototype.add = function (e) {\n this.node.appendChild(e.node);\n}, jvm.SVGCanvasElement = function (e, t, n) {\n this.classPrefix = \"SVG\", jvm.SVGCanvasElement.parentClass.call(this, \"svg\"), jvm.AbstractCanvasElement.apply(this, arguments);\n}, jvm.inherits(jvm.SVGCanvasElement, jvm.SVGElement), jvm.mixin(jvm.SVGCanvasElement, jvm.AbstractCanvasElement), jvm.SVGCanvasElement.prototype.setSize = function (e, t) {\n this.width = e, this.height = t, this.node.setAttribute(\"width\", e), this.node.setAttribute(\"height\", t);\n}, jvm.SVGCanvasElement.prototype.applyTransformParams = function (e, t, n) {\n this.scale = e, this.transX = t, this.transY = n, this.rootElement.node.setAttribute(\"transform\", \"scale(\" + e + \") translate(\" + t + \", \" + n + \")\");\n}, jvm.SVGShapeElement = function (e, t, n) {\n jvm.SVGShapeElement.parentClass.call(this, e, t), jvm.AbstractShapeElement.apply(this, arguments);\n}, jvm.inherits(jvm.SVGShapeElement, jvm.SVGElement), jvm.mixin(jvm.SVGShapeElement, jvm.AbstractShapeElement), jvm.SVGPathElement = function (e, t) {\n jvm.SVGPathElement.parentClass.call(this, \"path\", e, t), this.node.setAttribute(\"fill-rule\", \"evenodd\");\n}, jvm.inherits(jvm.SVGPathElement, jvm.SVGShapeElement), jvm.SVGCircleElement = function (e, t) {\n jvm.SVGCircleElement.parentClass.call(this, \"circle\", e, t);\n}, jvm.inherits(jvm.SVGCircleElement, jvm.SVGShapeElement), jvm.VMLElement = function (e, t) {\n jvm.VMLElement.VMLInitialized || jvm.VMLElement.initializeVML(), jvm.VMLElement.parentClass.apply(this, arguments);\n}, jvm.inherits(jvm.VMLElement, jvm.AbstractElement), jvm.VMLElement.VMLInitialized = !1, jvm.VMLElement.initializeVML = function () {\n try {\n document.namespaces.rvml || document.namespaces.add(\"rvml\", \"urn:schemas-microsoft-com:vml\"), jvm.VMLElement.prototype.createElement = function (e) {\n return document.createElement(\"<rvml:\" + e + ' class=\"rvml\">');\n };\n } catch (e) {\n jvm.VMLElement.prototype.createElement = function (e) {\n return document.createElement(\"<\" + e + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"rvml\">');\n };\n }document.createStyleSheet().addRule(\".rvml\", \"behavior:url(#default#VML)\"), jvm.VMLElement.VMLInitialized = !0;\n}, jvm.VMLElement.prototype.getElementCtr = function (e) {\n return jvm[\"VML\" + e];\n}, jvm.VMLElement.prototype.addClass = function (e) {\n jvm.$(this.node).addClass(e);\n}, jvm.VMLElement.prototype.applyAttr = function (e, t) {\n this.node[e] = t;\n}, jvm.VMLElement.prototype.getBBox = function () {\n var e = jvm.$(this.node);return { x: e.position().left / this.canvas.scale, y: e.position().top / this.canvas.scale, width: e.width() / this.canvas.scale, height: e.height() / this.canvas.scale };\n}, jvm.VMLGroupElement = function () {\n jvm.VMLGroupElement.parentClass.call(this, \"group\"), this.node.style.left = \"0px\", this.node.style.top = \"0px\", this.node.coordorigin = \"0 0\";\n}, jvm.inherits(jvm.VMLGroupElement, jvm.VMLElement), jvm.VMLGroupElement.prototype.add = function (e) {\n this.node.appendChild(e.node);\n}, jvm.VMLCanvasElement = function (e, t, n) {\n this.classPrefix = \"VML\", jvm.VMLCanvasElement.parentClass.call(this, \"group\"), jvm.AbstractCanvasElement.apply(this, arguments), this.node.style.position = \"absolute\";\n}, jvm.inherits(jvm.VMLCanvasElement, jvm.VMLElement), jvm.mixin(jvm.VMLCanvasElement, jvm.AbstractCanvasElement), jvm.VMLCanvasElement.prototype.setSize = function (e, t) {\n var n, r, i, s;this.width = e, this.height = t, this.node.style.width = e + \"px\", this.node.style.height = t + \"px\", this.node.coordsize = e + \" \" + t, this.node.coordorigin = \"0 0\";if (this.rootElement) {\n n = this.rootElement.node.getElementsByTagName(\"shape\");for (i = 0, s = n.length; i < s; i++) {\n n[i].coordsize = e + \" \" + t, n[i].style.width = e + \"px\", n[i].style.height = t + \"px\";\n }r = this.node.getElementsByTagName(\"group\");for (i = 0, s = r.length; i < s; i++) {\n r[i].coordsize = e + \" \" + t, r[i].style.width = e + \"px\", r[i].style.height = t + \"px\";\n }\n }\n}, jvm.VMLCanvasElement.prototype.applyTransformParams = function (e, t, n) {\n this.scale = e, this.transX = t, this.transY = n, this.rootElement.node.coordorigin = this.width - t - this.width / 100 + \",\" + (this.height - n - this.height / 100), this.rootElement.node.coordsize = this.width / e + \",\" + this.height / e;\n}, jvm.VMLShapeElement = function (e, t) {\n jvm.VMLShapeElement.parentClass.call(this, e, t), this.fillElement = new jvm.VMLElement(\"fill\"), this.strokeElement = new jvm.VMLElement(\"stroke\"), this.node.appendChild(this.fillElement.node), this.node.appendChild(this.strokeElement.node), this.node.stroked = !1, jvm.AbstractShapeElement.apply(this, arguments);\n}, jvm.inherits(jvm.VMLShapeElement, jvm.VMLElement), jvm.mixin(jvm.VMLShapeElement, jvm.AbstractShapeElement), jvm.VMLShapeElement.prototype.applyAttr = function (e, t) {\n switch (e) {case \"fill\":\n this.node.fillcolor = t;break;case \"fill-opacity\":\n this.fillElement.node.opacity = Math.round(t * 100) + \"%\";break;case \"stroke\":\n t === \"none\" ? this.node.stroked = !1 : this.node.stroked = !0, this.node.strokecolor = t;break;case \"stroke-opacity\":\n this.strokeElement.node.opacity = Math.round(t * 100) + \"%\";break;case \"stroke-width\":\n parseInt(t, 10) === 0 ? this.node.stroked = !1 : this.node.stroked = !0, this.node.strokeweight = t;break;case \"d\":\n this.node.path = jvm.VMLPathElement.pathSvgToVml(t);break;default:\n jvm.VMLShapeElement.parentClass.prototype.applyAttr.apply(this, arguments);}\n}, jvm.VMLPathElement = function (e, t) {\n var n = new jvm.VMLElement(\"skew\");jvm.VMLPathElement.parentClass.call(this, \"shape\", e, t), this.node.coordorigin = \"0 0\", n.node.on = !0, n.node.matrix = \"0.01,0,0,0.01,0,0\", n.node.offset = \"0,0\", this.node.appendChild(n.node);\n}, jvm.inherits(jvm.VMLPathElement, jvm.VMLShapeElement), jvm.VMLPathElement.prototype.applyAttr = function (e, t) {\n e === \"d\" ? this.node.path = jvm.VMLPathElement.pathSvgToVml(t) : jvm.VMLShapeElement.prototype.applyAttr.call(this, e, t);\n}, jvm.VMLPathElement.pathSvgToVml = function (e) {\n var t = \"\",\n n = 0,\n r = 0,\n i,\n s;return e = e.replace(/(-?\\d+)e(-?\\d+)/g, \"0\"), e.replace(/([MmLlHhVvCcSs])\\s*((?:-?\\d*(?:\\.\\d+)?\\s*,?\\s*)+)/g, function (e, t, o, u) {\n o = o.replace(/(\\d)-/g, \"$1,-\").replace(/^\\s+/g, \"\").replace(/\\s+$/g, \"\").replace(/\\s+/g, \",\").split(\",\"), o[0] || o.shift();for (var a = 0, f = o.length; a < f; a++) {\n o[a] = Math.round(100 * o[a]);\n }switch (t) {case \"m\":\n return n += o[0], r += o[1], \"t\" + o.join(\",\");case \"M\":\n return n = o[0], r = o[1], \"m\" + o.join(\",\");case \"l\":\n return n += o[0], r += o[1], \"r\" + o.join(\",\");case \"L\":\n return n = o[0], r = o[1], \"l\" + o.join(\",\");case \"h\":\n return n += o[0], \"r\" + o[0] + \",0\";case \"H\":\n return n = o[0], \"l\" + n + \",\" + r;case \"v\":\n return r += o[0], \"r0,\" + o[0];case \"V\":\n return r = o[0], \"l\" + n + \",\" + r;case \"c\":\n return i = n + o[o.length - 4], s = r + o[o.length - 3], n += o[o.length - 2], r += o[o.length - 1], \"v\" + o.join(\",\");case \"C\":\n return i = o[o.length - 4], s = o[o.length - 3], n = o[o.length - 2], r = o[o.length - 1], \"c\" + o.join(\",\");case \"s\":\n return o.unshift(r - s), o.unshift(n - i), i = n + o[o.length - 4], s = r + o[o.length - 3], n += o[o.length - 2], r += o[o.length - 1], \"v\" + o.join(\",\");case \"S\":\n return o.unshift(r + r - s), o.unshift(n + n - i), i = o[o.length - 4], s = o[o.length - 3], n = o[o.length - 2], r = o[o.length - 1], \"c\" + o.join(\",\");}return \"\";\n }).replace(/z/g, \"e\");\n}, jvm.VMLCircleElement = function (e, t) {\n jvm.VMLCircleElement.parentClass.call(this, \"oval\", e, t);\n}, jvm.inherits(jvm.VMLCircleElement, jvm.VMLShapeElement), jvm.VMLCircleElement.prototype.applyAttr = function (e, t) {\n switch (e) {case \"r\":\n this.node.style.width = t * 2 + \"px\", this.node.style.height = t * 2 + \"px\", this.applyAttr(\"cx\", this.get(\"cx\") || 0), this.applyAttr(\"cy\", this.get(\"cy\") || 0);break;case \"cx\":\n if (!t) return;this.node.style.left = t - (this.get(\"r\") || 0) + \"px\";break;case \"cy\":\n if (!t) return;this.node.style.top = t - (this.get(\"r\") || 0) + \"px\";break;default:\n jvm.VMLCircleElement.parentClass.prototype.applyAttr.call(this, e, t);}\n}, jvm.VectorCanvas = function (e, t, n) {\n return this.mode = window.SVGAngle ? \"svg\" : \"vml\", this.mode == \"svg\" ? this.impl = new jvm.SVGCanvasElement(e, t, n) : this.impl = new jvm.VMLCanvasElement(e, t, n), this.impl;\n}, jvm.SimpleScale = function (e) {\n this.scale = e;\n}, jvm.SimpleScale.prototype.getValue = function (e) {\n return e;\n}, jvm.OrdinalScale = function (e) {\n this.scale = e;\n}, jvm.OrdinalScale.prototype.getValue = function (e) {\n return this.scale[e];\n}, jvm.NumericScale = function (e, t, n, r) {\n this.scale = [], t = t || \"linear\", e && this.setScale(e), t && this.setNormalizeFunction(t), n && this.setMin(n), r && this.setMax(r);\n}, jvm.NumericScale.prototype = { setMin: function setMin(e) {\n this.clearMinValue = e, typeof this.normalize == \"function\" ? this.minValue = this.normalize(e) : this.minValue = e;\n }, setMax: function setMax(e) {\n this.clearMaxValue = e, typeof this.normalize == \"function\" ? this.maxValue = this.normalize(e) : this.maxValue = e;\n }, setScale: function setScale(e) {\n var t;for (t = 0; t < e.length; t++) {\n this.scale[t] = [e[t]];\n }\n }, setNormalizeFunction: function setNormalizeFunction(e) {\n e === \"polynomial\" ? this.normalize = function (e) {\n return Math.pow(e, .2);\n } : e === \"linear\" ? delete this.normalize : this.normalize = e, this.setMin(this.clearMinValue), this.setMax(this.clearMaxValue);\n }, getValue: function getValue(e) {\n var t = [],\n n = 0,\n r,\n i = 0,\n s;typeof this.normalize == \"function\" && (e = this.normalize(e));for (i = 0; i < this.scale.length - 1; i++) {\n r = this.vectorLength(this.vectorSubtract(this.scale[i + 1], this.scale[i])), t.push(r), n += r;\n }s = (this.maxValue - this.minValue) / n;for (i = 0; i < t.length; i++) {\n t[i] *= s;\n }i = 0, e -= this.minValue;while (e - t[i] >= 0) {\n e -= t[i], i++;\n }return i == this.scale.length - 1 ? e = this.vectorToNum(this.scale[i]) : e = this.vectorToNum(this.vectorAdd(this.scale[i], this.vectorMult(this.vectorSubtract(this.scale[i + 1], this.scale[i]), e / t[i]))), e;\n }, vectorToNum: function vectorToNum(e) {\n var t = 0,\n n;for (n = 0; n < e.length; n++) {\n t += Math.round(e[n]) * Math.pow(256, e.length - n - 1);\n }return t;\n }, vectorSubtract: function vectorSubtract(e, t) {\n var n = [],\n r;for (r = 0; r < e.length; r++) {\n n[r] = e[r] - t[r];\n }return n;\n }, vectorAdd: function vectorAdd(e, t) {\n var n = [],\n r;for (r = 0; r < e.length; r++) {\n n[r] = e[r] + t[r];\n }return n;\n }, vectorMult: function vectorMult(e, t) {\n var n = [],\n r;for (r = 0; r < e.length; r++) {\n n[r] = e[r] * t;\n }return n;\n }, vectorLength: function vectorLength(e) {\n var t = 0,\n n;for (n = 0; n < e.length; n++) {\n t += e[n] * e[n];\n }return Math.sqrt(t);\n } }, jvm.ColorScale = function (e, t, n, r) {\n jvm.ColorScale.parentClass.apply(this, arguments);\n}, jvm.inherits(jvm.ColorScale, jvm.NumericScale), jvm.ColorScale.prototype.setScale = function (e) {\n var t;for (t = 0; t < e.length; t++) {\n this.scale[t] = jvm.ColorScale.rgbToArray(e[t]);\n }\n}, jvm.ColorScale.prototype.getValue = function (e) {\n return jvm.ColorScale.numToRgb(jvm.ColorScale.parentClass.prototype.getValue.call(this, e));\n}, jvm.ColorScale.arrayToRgb = function (e) {\n var t = \"#\",\n n,\n r;for (r = 0; r < e.length; r++) {\n n = e[r].toString(16), t += n.length == 1 ? \"0\" + n : n;\n }return t;\n}, jvm.ColorScale.numToRgb = function (e) {\n e = e.toString(16);while (e.length < 6) {\n e = \"0\" + e;\n }return \"#\" + e;\n}, jvm.ColorScale.rgbToArray = function (e) {\n return e = e.substr(1), [parseInt(e.substr(0, 2), 16), parseInt(e.substr(2, 2), 16), parseInt(e.substr(4, 2), 16)];\n}, jvm.DataSeries = function (e, t) {\n var n;e = e || {}, e.attribute = e.attribute || \"fill\", this.elements = t, this.params = e, e.attributes && this.setAttributes(e.attributes), jvm.$.isArray(e.scale) ? (n = e.attribute === \"fill\" || e.attribute === \"stroke\" ? jvm.ColorScale : jvm.NumericScale, this.scale = new n(e.scale, e.normalizeFunction, e.min, e.max)) : e.scale ? this.scale = new jvm.OrdinalScale(e.scale) : this.scale = new jvm.SimpleScale(e.scale), this.values = e.values || {}, this.setValues(this.values);\n}, jvm.DataSeries.prototype = { setAttributes: function setAttributes(e, t) {\n var n = e,\n r;if (typeof e == \"string\") this.elements[e] && this.elements[e].setStyle(this.params.attribute, t);else for (r in n) {\n this.elements[r] && this.elements[r].element.setStyle(this.params.attribute, n[r]);\n }\n }, setValues: function setValues(e) {\n var t = Number.MIN_VALUE,\n n = Number.MAX_VALUE,\n r,\n i,\n s = {};if (this.scale instanceof jvm.OrdinalScale || this.scale instanceof jvm.SimpleScale) for (i in e) {\n e[i] ? s[i] = this.scale.getValue(e[i]) : s[i] = this.elements[i].element.style.initial[this.params.attribute];\n } else {\n if (!this.params.min || !this.params.max) {\n for (i in e) {\n r = parseFloat(e[i]), r > t && (t = e[i]), r < n && (n = r);\n }this.params.min || this.scale.setMin(n), this.params.max || this.scale.setMax(t), this.params.min = n, this.params.max = t;\n }for (i in e) {\n r = parseFloat(e[i]), isNaN(r) ? s[i] = this.elements[i].element.style.initial[this.params.attribute] : s[i] = this.scale.getValue(r);\n }\n }this.setAttributes(s), jvm.$.extend(this.values, e);\n }, clear: function clear() {\n var e,\n t = {};for (e in this.values) {\n this.elements[e] && (t[e] = this.elements[e].element.style.initial[this.params.attribute]);\n }this.setAttributes(t), this.values = {};\n }, setScale: function setScale(e) {\n this.scale.setScale(e), this.values && this.setValues(this.values);\n }, setNormalizeFunction: function setNormalizeFunction(e) {\n this.scale.setNormalizeFunction(e), this.values && this.setValues(this.values);\n } }, jvm.Proj = { degRad: 180 / Math.PI, radDeg: Math.PI / 180, radius: 6381372, sgn: function sgn(e) {\n return e > 0 ? 1 : e < 0 ? -1 : e;\n }, mill: function mill(e, t, n) {\n return { x: this.radius * (t - n) * this.radDeg, y: -this.radius * Math.log(Math.tan((45 + .4 * e) * this.radDeg)) / .8 };\n }, mill_inv: function mill_inv(e, t, n) {\n return { lat: (2.5 * Math.atan(Math.exp(.8 * t / this.radius)) - 5 * Math.PI / 8) * this.degRad, lng: (n * this.radDeg + e / this.radius) * this.degRad };\n }, merc: function merc(e, t, n) {\n return { x: this.radius * (t - n) * this.radDeg, y: -this.radius * Math.log(Math.tan(Math.PI / 4 + e * Math.PI / 360)) };\n }, merc_inv: function merc_inv(e, t, n) {\n return { lat: (2 * Math.atan(Math.exp(t / this.radius)) - Math.PI / 2) * this.degRad, lng: (n * this.radDeg + e / this.radius) * this.degRad };\n }, aea: function aea(e, t, n) {\n var r = 0,\n i = n * this.radDeg,\n s = 29.5 * this.radDeg,\n o = 45.5 * this.radDeg,\n u = e * this.radDeg,\n a = t * this.radDeg,\n f = (Math.sin(s) + Math.sin(o)) / 2,\n l = Math.cos(s) * Math.cos(s) + 2 * f * Math.sin(s),\n c = f * (a - i),\n h = Math.sqrt(l - 2 * f * Math.sin(u)) / f,\n p = Math.sqrt(l - 2 * f * Math.sin(r)) / f;return { x: h * Math.sin(c) * this.radius, y: -(p - h * Math.cos(c)) * this.radius };\n }, aea_inv: function aea_inv(e, t, n) {\n var r = e / this.radius,\n i = t / this.radius,\n s = 0,\n o = n * this.radDeg,\n u = 29.5 * this.radDeg,\n a = 45.5 * this.radDeg,\n f = (Math.sin(u) + Math.sin(a)) / 2,\n l = Math.cos(u) * Math.cos(u) + 2 * f * Math.sin(u),\n c = Math.sqrt(l - 2 * f * Math.sin(s)) / f,\n h = Math.sqrt(r * r + (c - i) * (c - i)),\n p = Math.atan(r / (c - i));return { lat: Math.asin((l - h * h * f * f) / (2 * f)) * this.degRad, lng: (o + p / f) * this.degRad };\n }, lcc: function lcc(e, t, n) {\n var r = 0,\n i = n * this.radDeg,\n s = t * this.radDeg,\n o = 33 * this.radDeg,\n u = 45 * this.radDeg,\n a = e * this.radDeg,\n f = Math.log(Math.cos(o) * (1 / Math.cos(u))) / Math.log(Math.tan(Math.PI / 4 + u / 2) * (1 / Math.tan(Math.PI / 4 + o / 2))),\n l = Math.cos(o) * Math.pow(Math.tan(Math.PI / 4 + o / 2), f) / f,\n c = l * Math.pow(1 / Math.tan(Math.PI / 4 + a / 2), f),\n h = l * Math.pow(1 / Math.tan(Math.PI / 4 + r / 2), f);return { x: c * Math.sin(f * (s - i)) * this.radius, y: -(h - c * Math.cos(f * (s - i))) * this.radius };\n }, lcc_inv: function lcc_inv(e, t, n) {\n var r = e / this.radius,\n i = t / this.radius,\n s = 0,\n o = n * this.radDeg,\n u = 33 * this.radDeg,\n a = 45 * this.radDeg,\n f = Math.log(Math.cos(u) * (1 / Math.cos(a))) / Math.log(Math.tan(Math.PI / 4 + a / 2) * (1 / Math.tan(Math.PI / 4 + u / 2))),\n l = Math.cos(u) * Math.pow(Math.tan(Math.PI / 4 + u / 2), f) / f,\n c = l * Math.pow(1 / Math.tan(Math.PI / 4 + s / 2), f),\n h = this.sgn(f) * Math.sqrt(r * r + (c - i) * (c - i)),\n p = Math.atan(r / (c - i));return { lat: (2 * Math.atan(Math.pow(l / h, 1 / f)) - Math.PI / 2) * this.degRad, lng: (o + p / f) * this.degRad };\n } }, jvm.WorldMap = function (e) {\n var t = this,\n n;this.params = jvm.$.extend(!0, {}, jvm.WorldMap.defaultParams, e);if (!jvm.WorldMap.maps[this.params.map]) throw new Error(\"Attempt to use map which was not loaded: \" + this.params.map);this.mapData = jvm.WorldMap.maps[this.params.map], this.markers = {}, this.regions = {}, this.regionsColors = {}, this.regionsData = {}, this.container = jvm.$(\"<div>\").css({ width: \"100%\", height: \"100%\" }).addClass(\"jvectormap-container\"), this.params.container.append(this.container), this.container.data(\"mapObject\", this), this.container.css({ position: \"relative\", overflow: \"hidden\" }), this.defaultWidth = this.mapData.width, this.defaultHeight = this.mapData.height, this.setBackgroundColor(this.params.backgroundColor), this.onResize = function () {\n t.setSize();\n }, jvm.$(window).resize(this.onResize);for (n in jvm.WorldMap.apiEvents) {\n this.params[n] && this.container.bind(jvm.WorldMap.apiEvents[n] + \".jvectormap\", this.params[n]);\n }this.canvas = new jvm.VectorCanvas(this.container[0], this.width, this.height), \"ontouchstart\" in window || window.DocumentTouch && document instanceof DocumentTouch ? this.params.bindTouchEvents && this.bindContainerTouchEvents() : this.bindContainerEvents(), this.bindElementEvents(), this.createLabel(), this.params.zoomButtons && this.bindZoomButtons(), this.createRegions(), this.createMarkers(this.params.markers || {}), this.setSize(), this.params.focusOn && (_typeof(this.params.focusOn) == \"object\" ? this.setFocus.call(this, this.params.focusOn.scale, this.params.focusOn.x, this.params.focusOn.y) : this.setFocus.call(this, this.params.focusOn)), this.params.selectedRegions && this.setSelectedRegions(this.params.selectedRegions), this.params.selectedMarkers && this.setSelectedMarkers(this.params.selectedMarkers), this.params.series && this.createSeries();\n}, jvm.WorldMap.prototype = { transX: 0, transY: 0, scale: 1, baseTransX: 0, baseTransY: 0, baseScale: 1, width: 0, height: 0, setBackgroundColor: function setBackgroundColor(e) {\n this.container.css(\"background-color\", e);\n }, resize: function resize() {\n var e = this.baseScale;this.width / this.height > this.defaultWidth / this.defaultHeight ? (this.baseScale = this.height / this.defaultHeight, this.baseTransX = Math.abs(this.width - this.defaultWidth * this.baseScale) / (2 * this.baseScale)) : (this.baseScale = this.width / this.defaultWidth, this.baseTransY = Math.abs(this.height - this.defaultHeight * this.baseScale) / (2 * this.baseScale)), this.scale *= this.baseScale / e, this.transX *= this.baseScale / e, this.transY *= this.baseScale / e;\n }, setSize: function setSize() {\n this.width = this.container.width(), this.height = this.container.height(), this.resize(), this.canvas.setSize(this.width, this.height), this.applyTransform();\n }, reset: function reset() {\n var e, t;for (e in this.series) {\n for (t = 0; t < this.series[e].length; t++) {\n this.series[e][t].clear();\n }\n }this.scale = this.baseScale, this.transX = this.baseTransX, this.transY = this.baseTransY, this.applyTransform();\n }, applyTransform: function applyTransform() {\n var e, t, n, r;this.defaultWidth * this.scale <= this.width ? (e = (this.width - this.defaultWidth * this.scale) / (2 * this.scale), n = (this.width - this.defaultWidth * this.scale) / (2 * this.scale)) : (e = 0, n = (this.width - this.defaultWidth * this.scale) / this.scale), this.defaultHeight * this.scale <= this.height ? (t = (this.height - this.defaultHeight * this.scale) / (2 * this.scale), r = (this.height - this.defaultHeight * this.scale) / (2 * this.scale)) : (t = 0, r = (this.height - this.defaultHeight * this.scale) / this.scale), this.transY > t ? this.transY = t : this.transY < r && (this.transY = r), this.transX > e ? this.transX = e : this.transX < n && (this.transX = n), this.canvas.applyTransformParams(this.scale, this.transX, this.transY), this.markers && this.repositionMarkers(), this.container.trigger(\"viewportChange\", [this.scale / this.baseScale, this.transX, this.transY]);\n }, bindContainerEvents: function bindContainerEvents() {\n var e = !1,\n t,\n n,\n r = this;this.container.mousemove(function (i) {\n return e && (r.transX -= (t - i.pageX) / r.scale, r.transY -= (n - i.pageY) / r.scale, r.applyTransform(), t = i.pageX, n = i.pageY), !1;\n }).mousedown(function (r) {\n return e = !0, t = r.pageX, n = r.pageY, !1;\n }), jvm.$(\"body\").mouseup(function () {\n e = !1;\n }), this.params.zoomOnScroll && this.container.mousewheel(function (e, t, n, i) {\n var s = jvm.$(r.container).offset(),\n o = e.pageX - s.left,\n u = e.pageY - s.top,\n a = Math.pow(1.3, i);r.label.hide(), r.setScale(r.scale * a, o, u), e.preventDefault();\n });\n }, bindContainerTouchEvents: function bindContainerTouchEvents() {\n var e,\n t,\n n = this,\n r,\n i,\n s,\n o,\n u,\n a = function a(_a) {\n var f = _a.originalEvent.touches,\n l,\n c,\n h,\n p;_a.type == \"touchstart\" && (u = 0), f.length == 1 ? (u == 1 && (h = n.transX, p = n.transY, n.transX -= (r - f[0].pageX) / n.scale, n.transY -= (i - f[0].pageY) / n.scale, n.applyTransform(), n.label.hide(), (h != n.transX || p != n.transY) && _a.preventDefault()), r = f[0].pageX, i = f[0].pageY) : f.length == 2 && (u == 2 ? (c = Math.sqrt(Math.pow(f[0].pageX - f[1].pageX, 2) + Math.pow(f[0].pageY - f[1].pageY, 2)) / t, n.setScale(e * c, s, o), n.label.hide(), _a.preventDefault()) : (l = jvm.$(n.container).offset(), f[0].pageX > f[1].pageX ? s = f[1].pageX + (f[0].pageX - f[1].pageX) / 2 : s = f[0].pageX + (f[1].pageX - f[0].pageX) / 2, f[0].pageY > f[1].pageY ? o = f[1].pageY + (f[0].pageY - f[1].pageY) / 2 : o = f[0].pageY + (f[1].pageY - f[0].pageY) / 2, s -= l.left, o -= l.top, e = n.scale, t = Math.sqrt(Math.pow(f[0].pageX - f[1].pageX, 2) + Math.pow(f[0].pageY - f[1].pageY, 2)))), u = f.length;\n };jvm.$(this.container).bind(\"touchstart\", a), jvm.$(this.container).bind(\"touchmove\", a);\n }, bindElementEvents: function bindElementEvents() {\n var e = this,\n t;this.container.mousemove(function () {\n t = !0;\n }), this.container.delegate(\"[class~='jvectormap-element']\", \"mouseover mouseout\", function (t) {\n var n = this,\n r = jvm.$(this).attr(\"class\").baseVal ? jvm.$(this).attr(\"class\").baseVal : jvm.$(this).attr(\"class\"),\n i = r.indexOf(\"jvectormap-region\") === -1 ? \"marker\" : \"region\",\n s = i == \"region\" ? jvm.$(this).attr(\"data-code\") : jvm.$(this).attr(\"data-index\"),\n o = i == \"region\" ? e.regions[s].element : e.markers[s].element,\n u = i == \"region\" ? e.mapData.paths[s].name : e.markers[s].config.name || \"\",\n a = jvm.$.Event(i + \"LabelShow.jvectormap\"),\n f = jvm.$.Event(i + \"Over.jvectormap\");t.type == \"mouseover\" ? (e.container.trigger(f, [s]), f.isDefaultPrevented() || o.setHovered(!0), e.label.text(u), e.container.trigger(a, [e.label, s]), a.isDefaultPrevented() || (e.label.show(), e.labelWidth = e.label.width(), e.labelHeight = e.label.height())) : (o.setHovered(!1), e.label.hide(), e.container.trigger(i + \"Out.jvectormap\", [s]));\n }), this.container.delegate(\"[class~='jvectormap-element']\", \"mousedown\", function (e) {\n t = !1;\n }), this.container.delegate(\"[class~='jvectormap-element']\", \"mouseup\", function (n) {\n var r = this,\n i = jvm.$(this).attr(\"class\").baseVal ? jvm.$(this).attr(\"class\").baseVal : jvm.$(this).attr(\"class\"),\n s = i.indexOf(\"jvectormap-region\") === -1 ? \"marker\" : \"region\",\n o = s == \"region\" ? jvm.$(this).attr(\"data-code\") : jvm.$(this).attr(\"data-index\"),\n u = jvm.$.Event(s + \"Click.jvectormap\"),\n a = s == \"region\" ? e.regions[o].element : e.markers[o].element;if (!t) {\n e.container.trigger(u, [o]);if (s === \"region\" && e.params.regionsSelectable || s === \"marker\" && e.params.markersSelectable) u.isDefaultPrevented() || (e.params[s + \"sSelectableOne\"] && e.clearSelected(s + \"s\"), a.setSelected(!a.isSelected));\n }\n });\n }, bindZoomButtons: function bindZoomButtons() {\n var e = this;jvm.$(\"<div/>\").addClass(\"jvectormap-zoomin\").text(\"+\").appendTo(this.container), jvm.$(\"<div/>\").addClass(\"jvectormap-zoomout\").html(\"&#x2212;\").appendTo(this.container), this.container.find(\".jvectormap-zoomin\").click(function () {\n e.setScale(e.scale * e.params.zoomStep, e.width / 2, e.height / 2);\n }), this.container.find(\".jvectormap-zoomout\").click(function () {\n e.setScale(e.scale / e.params.zoomStep, e.width / 2, e.height / 2);\n });\n }, createLabel: function createLabel() {\n var e = this;this.label = jvm.$(\"<div/>\").addClass(\"jvectormap-label\").appendTo(jvm.$(\"body\")), this.container.mousemove(function (t) {\n var n = t.pageX - 15 - e.labelWidth,\n r = t.pageY - 15 - e.labelHeight;n < 5 && (n = t.pageX + 15), r < 5 && (r = t.pageY + 15), e.label.is(\":visible\") && e.label.css({ left: n, top: r });\n });\n }, setScale: function setScale(e, t, n, r) {\n var i,\n s = jvm.$.Event(\"zoom.jvectormap\");e > this.params.zoomMax * this.baseScale ? e = this.params.zoomMax * this.baseScale : e < this.params.zoomMin * this.baseScale && (e = this.params.zoomMin * this.baseScale), typeof t != \"undefined\" && typeof n != \"undefined\" && (i = e / this.scale, r ? (this.transX = t + this.defaultWidth * (this.width / (this.defaultWidth * e)) / 2, this.transY = n + this.defaultHeight * (this.height / (this.defaultHeight * e)) / 2) : (this.transX -= (i - 1) / e * t, this.transY -= (i - 1) / e * n)), this.scale = e, this.applyTransform(), this.container.trigger(s, [e / this.baseScale]);\n }, setFocus: function setFocus(e, t, n) {\n var r, i, s, o, u;if (jvm.$.isArray(e) || this.regions[e]) {\n jvm.$.isArray(e) ? o = e : o = [e];for (u = 0; u < o.length; u++) {\n this.regions[o[u]] && (i = this.regions[o[u]].element.getBBox(), i && (typeof r == \"undefined\" ? r = i : (s = { x: Math.min(r.x, i.x), y: Math.min(r.y, i.y), width: Math.max(r.x + r.width, i.x + i.width) - Math.min(r.x, i.x), height: Math.max(r.y + r.height, i.y + i.height) - Math.min(r.y, i.y) }, r = s)));\n }this.setScale(Math.min(this.width / r.width, this.height / r.height), -(r.x + r.width / 2), -(r.y + r.height / 2), !0);\n } else e *= this.baseScale, this.setScale(e, -t * this.defaultWidth, -n * this.defaultHeight, !0);\n }, getSelected: function getSelected(e) {\n var t,\n n = [];for (t in this[e]) {\n this[e][t].element.isSelected && n.push(t);\n }return n;\n }, getSelectedRegions: function getSelectedRegions() {\n return this.getSelected(\"regions\");\n }, getSelectedMarkers: function getSelectedMarkers() {\n return this.getSelected(\"markers\");\n }, setSelected: function setSelected(e, t) {\n var n;(typeof t === \"undefined\" ? \"undefined\" : _typeof(t)) != \"object\" && (t = [t]);if (jvm.$.isArray(t)) for (n = 0; n < t.length; n++) {\n this[e][t[n]].element.setSelected(!0);\n } else for (n in t) {\n this[e][n].element.setSelected(!!t[n]);\n }\n }, setSelectedRegions: function setSelectedRegions(e) {\n this.setSelected(\"regions\", e);\n }, setSelectedMarkers: function setSelectedMarkers(e) {\n this.setSelected(\"markers\", e);\n }, clearSelected: function clearSelected(e) {\n var t = {},\n n = this.getSelected(e),\n r;for (r = 0; r < n.length; r++) {\n t[n[r]] = !1;\n }this.setSelected(e, t);\n }, clearSelectedRegions: function clearSelectedRegions() {\n this.clearSelected(\"regions\");\n }, clearSelectedMarkers: function clearSelectedMarkers() {\n this.clearSelected(\"markers\");\n }, getMapObject: function getMapObject() {\n return this;\n }, getRegionName: function getRegionName(e) {\n return this.mapData.paths[e].name;\n }, createRegions: function createRegions() {\n var e,\n t,\n n = this;for (e in this.mapData.paths) {\n t = this.canvas.addPath({ d: this.mapData.paths[e].path, \"data-code\": e }, jvm.$.extend(!0, {}, this.params.regionStyle)), jvm.$(t.node).bind(\"selected\", function (e, t) {\n n.container.trigger(\"regionSelected.jvectormap\", [jvm.$(this).attr(\"data-code\"), t, n.getSelectedRegions()]);\n }), t.addClass(\"jvectormap-region jvectormap-element\"), this.regions[e] = { element: t, config: this.mapData.paths[e] };\n }\n }, createMarkers: function createMarkers(e) {\n var t,\n n,\n r,\n i,\n s,\n o = this;this.markersGroup = this.markersGroup || this.canvas.addGroup();if (jvm.$.isArray(e)) {\n s = e.slice(), e = {};for (t = 0; t < s.length; t++) {\n e[t] = s[t];\n }\n }for (t in e) {\n i = e[t] instanceof Array ? { latLng: e[t] } : e[t], r = this.getMarkerPosition(i), r !== !1 && (n = this.canvas.addCircle({ \"data-index\": t, cx: r.x, cy: r.y }, jvm.$.extend(!0, {}, this.params.markerStyle, { initial: i.style || {} }), this.markersGroup), n.addClass(\"jvectormap-marker jvectormap-element\"), jvm.$(n.node).bind(\"selected\", function (e, t) {\n o.container.trigger(\"markerSelected.jvectormap\", [jvm.$(this).attr(\"data-index\"), t, o.getSelectedMarkers()]);\n }), this.markers[t] && this.removeMarkers([t]), this.markers[t] = { element: n, config: i });\n }\n }, repositionMarkers: function repositionMarkers() {\n var e, t;for (e in this.markers) {\n t = this.getMarkerPosition(this.markers[e].config), t !== !1 && this.markers[e].element.setStyle({ cx: t.x, cy: t.y });\n }\n }, getMarkerPosition: function getMarkerPosition(e) {\n return jvm.WorldMap.maps[this.params.map].projection ? this.latLngToPoint.apply(this, e.latLng || [0, 0]) : { x: e.coords[0] * this.scale + this.transX * this.scale, y: e.coords[1] * this.scale + this.transY * this.scale };\n }, addMarker: function addMarker(e, t, n) {\n var r = {},\n i = [],\n s,\n o,\n n = n || [];r[e] = t;for (o = 0; o < n.length; o++) {\n s = {}, s[e] = n[o], i.push(s);\n }this.addMarkers(r, i);\n }, addMarkers: function addMarkers(e, t) {\n var n;t = t || [], this.createMarkers(e);for (n = 0; n < t.length; n++) {\n this.series.markers[n].setValues(t[n] || {});\n }\n }, removeMarkers: function removeMarkers(e) {\n var t;for (t = 0; t < e.length; t++) {\n this.markers[e[t]].element.remove(), delete this.markers[e[t]];\n }\n }, removeAllMarkers: function removeAllMarkers() {\n var e,\n t = [];for (e in this.markers) {\n t.push(e);\n }this.removeMarkers(t);\n }, latLngToPoint: function latLngToPoint(e, t) {\n var n,\n r = jvm.WorldMap.maps[this.params.map].projection,\n i = r.centralMeridian,\n s = this.width - this.baseTransX * 2 * this.baseScale,\n o = this.height - this.baseTransY * 2 * this.baseScale,\n u,\n a,\n f = this.scale / this.baseScale;return t < -180 + i && (t += 360), n = jvm.Proj[r.type](e, t, i), u = this.getInsetForPoint(n.x, n.y), u ? (a = u.bbox, n.x = (n.x - a[0].x) / (a[1].x - a[0].x) * u.width * this.scale, n.y = (n.y - a[0].y) / (a[1].y - a[0].y) * u.height * this.scale, { x: n.x + this.transX * this.scale + u.left * this.scale, y: n.y + this.transY * this.scale + u.top * this.scale }) : !1;\n }, pointToLatLng: function pointToLatLng(e, t) {\n var n = jvm.WorldMap.maps[this.params.map].projection,\n r = n.centralMeridian,\n i = jvm.WorldMap.maps[this.params.map].insets,\n s,\n o,\n u,\n a,\n f;for (s = 0; s < i.length; s++) {\n o = i[s], u = o.bbox, a = e - (this.transX * this.scale + o.left * this.scale), f = t - (this.transY * this.scale + o.top * this.scale), a = a / (o.width * this.scale) * (u[1].x - u[0].x) + u[0].x, f = f / (o.height * this.scale) * (u[1].y - u[0].y) + u[0].y;if (a > u[0].x && a < u[1].x && f > u[0].y && f < u[1].y) return jvm.Proj[n.type + \"_inv\"](a, -f, r);\n }return !1;\n }, getInsetForPoint: function getInsetForPoint(e, t) {\n var n = jvm.WorldMap.maps[this.params.map].insets,\n r,\n i;for (r = 0; r < n.length; r++) {\n i = n[r].bbox;if (e > i[0].x && e < i[1].x && t > i[0].y && t < i[1].y) return n[r];\n }\n }, createSeries: function createSeries() {\n var e, t;this.series = { markers: [], regions: [] };for (t in this.params.series) {\n for (e = 0; e < this.params.series[t].length; e++) {\n this.series[t][e] = new jvm.DataSeries(this.params.series[t][e], this[t]);\n }\n }\n }, remove: function remove() {\n this.label.remove(), this.container.remove(), jvm.$(window).unbind(\"resize\", this.onResize);\n } }, jvm.WorldMap.maps = {}, jvm.WorldMap.defaultParams = { map: \"world_mill_en\", backgroundColor: \"#505050\", zoomButtons: !0, zoomOnScroll: !0, zoomMax: 8, zoomMin: 1, zoomStep: 1.6, regionsSelectable: !1, markersSelectable: !1, bindTouchEvents: !0, regionStyle: { initial: { fill: \"white\", \"fill-opacity\": 1, stroke: \"none\", \"stroke-width\": 0, \"stroke-opacity\": 1 }, hover: { \"fill-opacity\": .8 }, selected: { fill: \"yellow\" }, selectedHover: {} }, markerStyle: { initial: { fill: \"grey\", stroke: \"#505050\", \"fill-opacity\": 1, \"stroke-width\": 1, \"stroke-opacity\": 1, r: 5 }, hover: { stroke: \"black\", \"stroke-width\": 2 }, selected: { fill: \"blue\" }, selectedHover: {} } }, jvm.WorldMap.apiEvents = { onRegionLabelShow: \"regionLabelShow\", onRegionOver: \"regionOver\", onRegionOut: \"regionOut\", onRegionClick: \"regionClick\", onRegionSelected: \"regionSelected\", onMarkerLabelShow: \"markerLabelShow\", onMarkerOver: \"markerOver\", onMarkerOut: \"markerOut\", onMarkerClick: \"markerClick\", onMarkerSelected: \"markerSelected\", onViewportChange: \"viewportChange\" };//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9wbHVnaW5zL2p2ZWN0b3JtYXAvanF1ZXJ5LWp2ZWN0b3JtYXAtMS4yLjIubWluLmpzPzQ3MjEiXSwibmFtZXMiOlsiZSIsInQiLCJzZXQiLCJjb2xvcnMiLCJ2YWx1ZXMiLCJiYWNrZ3JvdW5kQ29sb3IiLCJzY2FsZUNvbG9ycyIsIm5vcm1hbGl6ZUZ1bmN0aW9uIiwiZm9jdXMiLCJnZXQiLCJzZWxlY3RlZFJlZ2lvbnMiLCJzZWxlY3RlZE1hcmtlcnMiLCJtYXBPYmplY3QiLCJyZWdpb25OYW1lIiwiZm4iLCJ2ZWN0b3JNYXAiLCJuIiwiciIsImkiLCJjaGlsZHJlbiIsImRhdGEiLCJqdm0iLCJXb3JsZE1hcCIsIm1hcHMiLCJhcmd1bWVudHMiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInN1YnN0ciIsImFwcGx5IiwiQXJyYXkiLCJwcm90b3R5cGUiLCJzbGljZSIsImNhbGwiLCJjb250YWluZXIiLCJqUXVlcnkiLCJ3aW5kb3ciLCJldmVudCIsInMiLCJvIiwidSIsImZpeCIsInR5cGUiLCJ3aGVlbERlbHRhIiwiZGV0YWlsIiwiYXhpcyIsInVuZGVmaW5lZCIsIkhPUklaT05UQUxfQVhJUyIsIndoZWVsRGVsdGFZIiwid2hlZWxEZWx0YVgiLCJ1bnNoaWZ0IiwiZGlzcGF0Y2giLCJoYW5kbGUiLCJmaXhIb29rcyIsImxlbmd0aCIsIm1vdXNlSG9va3MiLCJzcGVjaWFsIiwibW91c2V3aGVlbCIsInNldHVwIiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9ubW91c2V3aGVlbCIsInRlYXJkb3duIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImV4dGVuZCIsImJpbmQiLCJ0cmlnZ2VyIiwidW5tb3VzZXdoZWVsIiwidW5iaW5kIiwiaW5oZXJpdHMiLCJjb25zdHJ1Y3RvciIsInBhcmVudENsYXNzIiwibWl4aW4iLCJoYXNPd25Qcm9wZXJ0eSIsIm1pbiIsIk51bWJlciIsIk1BWF9WQUxVRSIsIm1heCIsIk1JTl9WQUxVRSIsImtleXMiLCJwdXNoIiwiJCIsIkFic3RyYWN0RWxlbWVudCIsIm5vZGUiLCJjcmVhdGVFbGVtZW50IiwibmFtZSIsInByb3BlcnRpZXMiLCJhcHBseUF0dHIiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmUiLCJBYnN0cmFjdENhbnZhc0VsZW1lbnQiLCJzZXRTaXplIiwicm9vdEVsZW1lbnQiLCJjbGFzc1ByZWZpeCIsImFwcGVuZENoaWxkIiwiYWRkIiwiY2FudmFzIiwiYWRkUGF0aCIsImFkZENpcmNsZSIsImFkZEdyb3VwIiwiQWJzdHJhY3RTaGFwZUVsZW1lbnQiLCJzdHlsZSIsImN1cnJlbnQiLCJpc0hvdmVyZWQiLCJpc1NlbGVjdGVkIiwidXBkYXRlU3R5bGUiLCJzZXRIb3ZlcmVkIiwic2V0U2VsZWN0ZWQiLCJzZXRTdHlsZSIsIm1lcmdlU3R5bGVzIiwiaW5pdGlhbCIsImhvdmVyIiwic2VsZWN0ZWQiLCJzZWxlY3RlZEhvdmVyIiwiU1ZHRWxlbWVudCIsInN2Z25zIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50TlMiLCJhZGRDbGFzcyIsImdldEVsZW1lbnRDdHIiLCJnZXRCQm94IiwiU1ZHR3JvdXBFbGVtZW50IiwiU1ZHQ2FudmFzRWxlbWVudCIsIndpZHRoIiwiaGVpZ2h0IiwiYXBwbHlUcmFuc2Zvcm1QYXJhbXMiLCJzY2FsZSIsInRyYW5zWCIsInRyYW5zWSIsIlNWR1NoYXBlRWxlbWVudCIsIlNWR1BhdGhFbGVtZW50IiwiU1ZHQ2lyY2xlRWxlbWVudCIsIlZNTEVsZW1lbnQiLCJWTUxJbml0aWFsaXplZCIsImluaXRpYWxpemVWTUwiLCJuYW1lc3BhY2VzIiwicnZtbCIsImNyZWF0ZVN0eWxlU2hlZXQiLCJhZGRSdWxlIiwieCIsInBvc2l0aW9uIiwibGVmdCIsInkiLCJ0b3AiLCJWTUxHcm91cEVsZW1lbnQiLCJjb29yZG9yaWdpbiIsIlZNTENhbnZhc0VsZW1lbnQiLCJjb29yZHNpemUiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsIlZNTFNoYXBlRWxlbWVudCIsImZpbGxFbGVtZW50Iiwic3Ryb2tlRWxlbWVudCIsInN0cm9rZWQiLCJmaWxsY29sb3IiLCJvcGFjaXR5IiwiTWF0aCIsInJvdW5kIiwic3Ryb2tlY29sb3IiLCJwYXJzZUludCIsInN0cm9rZXdlaWdodCIsInBhdGgiLCJWTUxQYXRoRWxlbWVudCIsInBhdGhTdmdUb1ZtbCIsIm9uIiwibWF0cml4Iiwib2Zmc2V0IiwicmVwbGFjZSIsInNwbGl0Iiwic2hpZnQiLCJhIiwiZiIsImpvaW4iLCJWTUxDaXJjbGVFbGVtZW50IiwiVmVjdG9yQ2FudmFzIiwibW9kZSIsIlNWR0FuZ2xlIiwiaW1wbCIsIlNpbXBsZVNjYWxlIiwiZ2V0VmFsdWUiLCJPcmRpbmFsU2NhbGUiLCJOdW1lcmljU2NhbGUiLCJzZXRTY2FsZSIsInNldE5vcm1hbGl6ZUZ1bmN0aW9uIiwic2V0TWluIiwic2V0TWF4IiwiY2xlYXJNaW5WYWx1ZSIsIm5vcm1hbGl6ZSIsIm1pblZhbHVlIiwiY2xlYXJNYXhWYWx1ZSIsIm1heFZhbHVlIiwicG93IiwidmVjdG9yTGVuZ3RoIiwidmVjdG9yU3VidHJhY3QiLCJ2ZWN0b3JUb051bSIsInZlY3RvckFkZCIsInZlY3Rvck11bHQiLCJzcXJ0IiwiQ29sb3JTY2FsZSIsInJnYlRvQXJyYXkiLCJudW1Ub1JnYiIsImFycmF5VG9SZ2IiLCJ0b1N0cmluZyIsIkRhdGFTZXJpZXMiLCJhdHRyaWJ1dGUiLCJlbGVtZW50cyIsInBhcmFtcyIsImF0dHJpYnV0ZXMiLCJzZXRBdHRyaWJ1dGVzIiwiaXNBcnJheSIsInNldFZhbHVlcyIsImVsZW1lbnQiLCJwYXJzZUZsb2F0IiwiaXNOYU4iLCJjbGVhciIsIlByb2oiLCJkZWdSYWQiLCJQSSIsInJhZERlZyIsInJhZGl1cyIsInNnbiIsIm1pbGwiLCJsb2ciLCJ0YW4iLCJtaWxsX2ludiIsImxhdCIsImF0YW4iLCJleHAiLCJsbmciLCJtZXJjIiwibWVyY19pbnYiLCJhZWEiLCJzaW4iLCJsIiwiY29zIiwiYyIsImgiLCJwIiwiYWVhX2ludiIsImFzaW4iLCJsY2MiLCJsY2NfaW52IiwiZGVmYXVsdFBhcmFtcyIsIm1hcCIsIkVycm9yIiwibWFwRGF0YSIsIm1hcmtlcnMiLCJyZWdpb25zIiwicmVnaW9uc0NvbG9ycyIsInJlZ2lvbnNEYXRhIiwiY3NzIiwiYXBwZW5kIiwib3ZlcmZsb3ciLCJkZWZhdWx0V2lkdGgiLCJkZWZhdWx0SGVpZ2h0Iiwic2V0QmFja2dyb3VuZENvbG9yIiwib25SZXNpemUiLCJyZXNpemUiLCJhcGlFdmVudHMiLCJEb2N1bWVudFRvdWNoIiwiYmluZFRvdWNoRXZlbnRzIiwiYmluZENvbnRhaW5lclRvdWNoRXZlbnRzIiwiYmluZENvbnRhaW5lckV2ZW50cyIsImJpbmRFbGVtZW50RXZlbnRzIiwiY3JlYXRlTGFiZWwiLCJ6b29tQnV0dG9ucyIsImJpbmRab29tQnV0dG9ucyIsImNyZWF0ZVJlZ2lvbnMiLCJjcmVhdGVNYXJrZXJzIiwiZm9jdXNPbiIsInNldEZvY3VzIiwic2V0U2VsZWN0ZWRSZWdpb25zIiwic2V0U2VsZWN0ZWRNYXJrZXJzIiwic2VyaWVzIiwiY3JlYXRlU2VyaWVzIiwiYmFzZVRyYW5zWCIsImJhc2VUcmFuc1kiLCJiYXNlU2NhbGUiLCJhYnMiLCJhcHBseVRyYW5zZm9ybSIsInJlc2V0IiwicmVwb3NpdGlvbk1hcmtlcnMiLCJtb3VzZW1vdmUiLCJwYWdlWCIsInBhZ2VZIiwibW91c2Vkb3duIiwibW91c2V1cCIsInpvb21PblNjcm9sbCIsImxhYmVsIiwiaGlkZSIsInByZXZlbnREZWZhdWx0Iiwib3JpZ2luYWxFdmVudCIsInRvdWNoZXMiLCJkZWxlZ2F0ZSIsImF0dHIiLCJiYXNlVmFsIiwiaW5kZXhPZiIsInBhdGhzIiwiY29uZmlnIiwiRXZlbnQiLCJpc0RlZmF1bHRQcmV2ZW50ZWQiLCJ0ZXh0Iiwic2hvdyIsImxhYmVsV2lkdGgiLCJsYWJlbEhlaWdodCIsInJlZ2lvbnNTZWxlY3RhYmxlIiwibWFya2Vyc1NlbGVjdGFibGUiLCJjbGVhclNlbGVjdGVkIiwiYXBwZW5kVG8iLCJodG1sIiwiZmluZCIsImNsaWNrIiwiem9vbVN0ZXAiLCJpcyIsInpvb21NYXgiLCJ6b29tTWluIiwiZ2V0U2VsZWN0ZWQiLCJnZXRTZWxlY3RlZFJlZ2lvbnMiLCJnZXRTZWxlY3RlZE1hcmtlcnMiLCJjbGVhclNlbGVjdGVkUmVnaW9ucyIsImNsZWFyU2VsZWN0ZWRNYXJrZXJzIiwiZ2V0TWFwT2JqZWN0IiwiZ2V0UmVnaW9uTmFtZSIsImQiLCJyZWdpb25TdHlsZSIsIm1hcmtlcnNHcm91cCIsImxhdExuZyIsImdldE1hcmtlclBvc2l0aW9uIiwiY3giLCJjeSIsIm1hcmtlclN0eWxlIiwicmVtb3ZlTWFya2VycyIsInByb2plY3Rpb24iLCJsYXRMbmdUb1BvaW50IiwiY29vcmRzIiwiYWRkTWFya2VyIiwiYWRkTWFya2VycyIsInJlbW92ZUFsbE1hcmtlcnMiLCJjZW50cmFsTWVyaWRpYW4iLCJnZXRJbnNldEZvclBvaW50IiwiYmJveCIsInBvaW50VG9MYXRMbmciLCJpbnNldHMiLCJmaWxsIiwic3Ryb2tlIiwib25SZWdpb25MYWJlbFNob3ciLCJvblJlZ2lvbk92ZXIiLCJvblJlZ2lvbk91dCIsIm9uUmVnaW9uQ2xpY2siLCJvblJlZ2lvblNlbGVjdGVkIiwib25NYXJrZXJMYWJlbFNob3ciLCJvbk1hcmtlck92ZXIiLCJvbk1hcmtlck91dCIsIm9uTWFya2VyQ2xpY2siLCJvbk1hcmtlclNlbGVjdGVkIiwib25WaWV3cG9ydENoYW5nZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0dBTUcsQ0FBQyxVQUFTQSxDQUFULEVBQVc7QUFBQyxNQUFJQyxJQUFFLEVBQUNDLEtBQUksRUFBQ0MsUUFBTyxDQUFSLEVBQVVDLFFBQU8sQ0FBakIsRUFBbUJDLGlCQUFnQixDQUFuQyxFQUFxQ0MsYUFBWSxDQUFqRCxFQUFtREMsbUJBQWtCLENBQXJFLEVBQXVFQyxPQUFNLENBQTdFLEVBQUwsRUFBcUZDLEtBQUksRUFBQ0MsaUJBQWdCLENBQWpCLEVBQW1CQyxpQkFBZ0IsQ0FBbkMsRUFBcUNDLFdB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SyxFQUQraS9CLEVBQTl6NkIsRUFDOWpFMUYsSUFBSUMsUUFBSixDQUFheU8sU0FBYixHQUF1QixFQUFDdUYsbUJBQWtCLGlCQUFuQixFQUFxQ0MsY0FBYSxZQUFsRCxFQUErREMsYUFBWSxXQUEzRSxFQUF1RkMsZUFBYyxhQUFyRyxFQUFtSEMsa0JBQWlCLGdCQUFwSSxFQUFxSkMsbUJBQWtCLGlCQUF2SyxFQUF5TEMsY0FBYSxZQUF0TSxFQUFtTkMsYUFBWSxXQUEvTixFQUEyT0MsZUFBYyxhQUF6UCxFQUF1UUMsa0JBQWlCLGdCQUF4UixFQUF5U0Msa0JBQWlCLGdCQUExVCxFQUR1aUUiLCJmaWxlIjoiNTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGpWZWN0b3JNYXAgdmVyc2lvbiAxLjIuMlxuICpcbiAqIENvcHlyaWdodCAyMDExLTIwMTMsIEtpcmlsbCBMZWJlZGV2XG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICovKGZ1bmN0aW9uKGUpe3ZhciB0PXtzZXQ6e2NvbG9yczoxLHZhbHVlczoxLGJhY2tncm91bmRDb2xvcjoxLHNjYWxlQ29sb3JzOjEsbm9ybWFsaXplRnVuY3Rpb246MSxmb2N1czoxfSxnZXQ6e3NlbGVjdGVkUmVnaW9uczoxLHNlbGVjdGVkTWFya2VyczoxLG1hcE9iamVjdDoxLHJlZ2lvbk5hbWU6MX19O2UuZm4udmVjdG9yTWFwPWZ1bmN0aW9uKGUpe3ZhciBuLHIsaSxuPXRoaXMuY2hpbGRyZW4oXCIuanZlY3Rvcm1hcC1jb250YWluZXJcIikuZGF0YShcIm1hcE9iamVjdFwiKTtpZihlPT09XCJhZGRNYXBcIilqdm0uV29ybGRNYXAubWFwc1thcmd1bWVudHNbMV1dPWFyZ3VtZW50c1syXTtlbHNle2lmKCEoZSE9PVwic2V0XCImJmUhPT1cImdldFwifHwhdFtlXVthcmd1bWVudHNbMV1dKSlyZXR1cm4gcj1hcmd1bWVudHNbMV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYXJndW1lbnRzWzFdLnN1YnN0cigxKSxuW2Urcl0uYXBwbHkobixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO2U9ZXx8e30sZS5jb250YWluZXI9dGhpcyxuPW5ldyBqdm0uV29ybGRNYXAoZSl9cmV0dXJuIHRoaXN9fSkoalF1ZXJ5KSxmdW5jdGlvbihlKXtmdW5jdGlvbiByKHQpe3ZhciBuPXR8fHdpbmRvdy5ldmVudCxyPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGk9MCxzPSEwLG89MCx1PTA7cmV0dXJuIHQ9ZS5ldmVudC5maXgobiksdC50eXBlPVwibW91c2V3aGVlbFwiLG4ud2hlZWxEZWx0YSYmKGk9bi53aGVlbERlbHRhLzEyMCksbi5kZXRhaWwmJihpPS1uLmRldGFpbC8zKSx1PWksbi5heGlzIT09dW5kZWZpbmVkJiZuLmF4aXM9PT1uLkhPUklaT05UQUxfQVhJUyYmKHU9MCxvPS0xKmkpLG4ud2hlZWxEZWx0YVkhPT11bmRlZmluZWQmJih1PW4ud2hlZWxEZWx0YVkvMTIwKSxuLndoZWVsRGVsdGFYIT09dW5kZWZpbmVkJiYobz0tMSpuLndoZWVsRGVsdGFYLzEyMCksci51bnNoaWZ0KHQsaSxvLHUpLChlLmV2ZW50LmRpc3BhdGNofHxlLmV2ZW50LmhhbmRsZSkuYXBwbHkodGhpcyxyKX12YXIgdD1bXCJET01Nb3VzZVNjcm9sbFwiLFwibW91c2V3aGVlbFwiXTtpZihlLmV2ZW50LmZpeEhvb2tzKWZvcih2YXIgbj10Lmxlbmd0aDtuOyllLmV2ZW50LmZpeEhvb2tzW3RbLS1uXV09ZS5ldmVudC5tb3VzZUhvb2tzO2UuZXZlbnQuc3BlY2lhbC5tb3VzZXdoZWVsPXtzZXR1cDpmdW5jdGlvbigpe2lmKHRoaXMuYWRkRXZlbnRMaXN0ZW5lcilmb3IodmFyIGU9dC5sZW5ndGg7ZTspdGhpcy5hZGRFdmVudExpc3RlbmVyKHRbLS1lXSxyLCExKTtlbHNlIHRoaXMub25tb3VzZXdoZWVsPXJ9LHRlYXJkb3duOmZ1bmN0aW9uKCl7aWYodGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKWZvcih2YXIgZT10Lmxlbmd0aDtlOyl0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodFstLWVdLHIsITEpO2Vsc2UgdGhpcy5vbm1vdXNld2hlZWw9bnVsbH19LGUuZm4uZXh0ZW5kKHttb3VzZXdoZWVsOmZ1bmN0aW9uKGUpe3JldHVybiBlP3RoaXMuYmluZChcIm1vdXNld2hlZWxcIixlKTp0aGlzLnRyaWdnZXIoXCJtb3VzZXdoZWVsXCIpfSx1bm1vdXNld2hlZWw6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudW5iaW5kKFwibW91c2V3aGVlbFwiLGUpfX0pfShqUXVlcnkpO3ZhciBqdm09e2luaGVyaXRzOmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbigpe31uLnByb3RvdHlwZT10LnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgbixlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucGFyZW50Q2xhc3M9dH0sbWl4aW46ZnVuY3Rpb24oZSx0KXt2YXIgbjtmb3IobiBpbiB0LnByb3RvdHlwZSl0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShuKSYmKGUucHJvdG90eXBlW25dPXQucHJvdG90eXBlW25dKX0sbWluOmZ1bmN0aW9uKGUpe3ZhciB0PU51bWJlci5NQVhfVkFMVUUsbjtpZihlIGluc3RhbmNlb2YgQXJyYXkpZm9yKG49MDtuPGUubGVuZ3RoO24rKyllW25dPHQmJih0PWVbbl0pO2Vsc2UgZm9yKG4gaW4gZSllW25dPHQmJih0PWVbbl0pO3JldHVybiB0fSxtYXg6ZnVuY3Rpb24oZSl7dmFyIHQ9TnVtYmVyLk1JTl9WQUxVRSxuO2lmKGUgaW5zdGFuY2VvZiBBcnJheSlmb3Iobj0wO248ZS5sZW5ndGg7bisrKWVbbl0+dCYmKHQ9ZVtuXSk7ZWxzZSBmb3IobiBpbiBlKWVbbl0+dCYmKHQ9ZVtuXSk7cmV0dXJuIHR9LGtleXM6ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbjtmb3IobiBpbiBlKXQucHVzaChuKTtyZXR1cm4gdH0sdmFsdWVzOmZ1bmN0aW9uKGUpe3ZhciB0PVtdLG4scjtmb3Iocj0wO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspe2U9YXJndW1lbnRzW3JdO2ZvcihuIGluIGUpdC5wdXNoKGVbbl0pfXJldHVybiB0fX07anZtLiQ9alF1ZXJ5LGp2bS5BYnN0cmFjdEVsZW1lbnQ9ZnVuY3Rpb24oZSx0KXt0aGlzLm5vZGU9dGhpcy5jcmVhdGVFbGVtZW50KGUpLHRoaXMubmFtZT1lLHRoaXMucHJvcGVydGllcz17fSx0JiZ0aGlzLnNldCh0KX0sanZtLkFic3RyYWN0RWxlbWVudC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGUsdCl7dmFyIG47aWYodHlwZW9mIGU9PVwib2JqZWN0XCIpZm9yKG4gaW4gZSl0aGlzLnByb3BlcnRpZXNbbl09ZVtuXSx0aGlzLmFwcGx5QXR0cihuLGVbbl0pO2Vsc2UgdGhpcy5wcm9wZXJ0aWVzW2VdPXQsdGhpcy5hcHBseUF0dHIoZSx0KX0sanZtLkFic3RyYWN0RWxlbWVudC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnByb3BlcnRpZXNbZV19LGp2bS5BYnN0cmFjdEVsZW1lbnQucHJvdG90eXBlLmFwcGx5QXR0cj1mdW5jdGlvbihlLHQpe3RoaXMubm9kZS5zZXRBdHRyaWJ1dGUoZSx0KX0sanZtLkFic3RyYWN0RWxlbWVudC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7anZtLiQodGhpcy5ub2RlKS5yZW1vdmUoKX0sanZtLkFic3RyYWN0Q2FudmFzRWxlbWVudD1mdW5jdGlvbihlLHQsbil7dGhpcy5jb250YWluZXI9ZSx0aGlzLnNldFNpemUodCxuKSx0aGlzLnJvb3RFbGVtZW50PW5ldyBqdm1bdGhpcy5jbGFzc1ByZWZpeCtcIkdyb3VwRWxlbWVudFwiXSx0aGlzLm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5yb290RWxlbWVudC5ub2RlKSx0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm5vZGUpfSxqdm0uQWJzdHJhY3RDYW52YXNFbGVtZW50LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSx0KXt0PXR8fHRoaXMucm9vdEVsZW1lbnQsdC5hZGQoZSksZS5jYW52YXM9dGhpc30sanZtLkFic3RyYWN0Q2FudmFzRWxlbWVudC5wcm90b3R5cGUuYWRkUGF0aD1mdW5jdGlvbihlLHQsbil7dmFyIHI9bmV3IGp2bVt0aGlzLmNsYXNzUHJlZml4K1wiUGF0aEVsZW1lbnRcIl0oZSx0KTtyZXR1cm4gdGhpcy5hZGQocixuKSxyfSxqdm0uQWJzdHJhY3RDYW52YXNFbGVtZW50LnByb3RvdHlwZS5hZGRDaXJjbGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW5ldyBqdm1bdGhpcy5jbGFzc1ByZWZpeCtcIkNpcmNsZUVsZW1lbnRcIl0oZSx0KTtyZXR1cm4gdGhpcy5hZGQocixuKSxyfSxqdm0uQWJzdHJhY3RDYW52YXNFbGVtZW50LnByb3RvdHlwZS5hZGRHcm91cD1mdW5jdGlvbihlKXt2YXIgdD1uZXcganZtW3RoaXMuY2xhc3NQcmVmaXgrXCJHcm91cEVsZW1lbnRcIl07cmV0dXJuIGU/ZS5ub2RlLmFwcGVuZENoaWxkKHQubm9kZSk6dGhpcy5ub2RlLmFwcGVuZENoaWxkKHQubm9kZSksdC5jYW52YXM9dGhpcyx0fSxqdm0uQWJzdHJhY3RTaGFwZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuc3R5bGU9bnx8e30sdGhpcy5zdHlsZS5jdXJyZW50PXt9LHRoaXMuaXNIb3ZlcmVkPSExLHRoaXMuaXNTZWxlY3RlZD0hMSx0aGlzLnVwZGF0ZVN0eWxlKCl9LGp2bS5BYnN0cmFjdFNoYXBlRWxlbWVudC5wcm90b3R5cGUuc2V0SG92ZXJlZD1mdW5jdGlvbihlKXt0aGlzLmlzSG92ZXJlZCE9PWUmJih0aGlzLmlzSG92ZXJlZD1lLHRoaXMudXBkYXRlU3R5bGUoKSl9LGp2bS5BYnN0cmFjdFNoYXBlRWxlbWVudC5wcm90b3R5cGUuc2V0U2VsZWN0ZWQ9ZnVuY3Rpb24oZSl7dGhpcy5pc1NlbGVjdGVkIT09ZSYmKHRoaXMuaXNTZWxlY3RlZD1lLHRoaXMudXBkYXRlU3R5bGUoKSxqdm0uJCh0aGlzLm5vZGUpLnRyaWdnZXIoXCJzZWxlY3RlZFwiLFtlXSkpfSxqdm0uQWJzdHJhY3RTaGFwZUVsZW1lbnQucHJvdG90eXBlLnNldFN0eWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG49e307dHlwZW9mIGU9PVwib2JqZWN0XCI/bj1lOm5bZV09dCxqdm0uJC5leHRlbmQodGhpcy5zdHlsZS5jdXJyZW50LG4pLHRoaXMudXBkYXRlU3R5bGUoKX0sanZtLkFic3RyYWN0U2hhcGVFbGVtZW50LnByb3RvdHlwZS51cGRhdGVTdHlsZT1mdW5jdGlvbigpe3ZhciBlPXt9O2p2bS5BYnN0cmFjdFNoYXBlRWxlbWVudC5tZXJnZVN0eWxlcyhlLHRoaXMuc3R5bGUuaW5pdGlhbCksanZtLkFic3RyYWN0U2hhcGVFbGVtZW50Lm1lcmdlU3R5bGVzKGUsdGhpcy5zdHlsZS5jdXJyZW50KSx0aGlzLmlzSG92ZXJlZCYmanZtLkFic3RyYWN0U2hhcGVFbGVtZW50Lm1lcmdlU3R5bGVzKGUsdGhpcy5zdHlsZS5ob3ZlciksdGhpcy5pc1NlbGVjdGVkJiYoanZtLkFic3RyYWN0U2hhcGVFbGVtZW50Lm1lcmdlU3R5bGVzKGUsdGhpcy5zdHlsZS5zZWxlY3RlZCksdGhpcy5pc0hvdmVyZWQmJmp2bS5BYnN0cmFjdFNoYXBlRWxlbWVudC5tZXJnZVN0eWxlcyhlLHRoaXMuc3R5bGUuc2VsZWN0ZWRIb3ZlcikpLHRoaXMuc2V0KGUpfSxqdm0uQWJzdHJhY3RTaGFwZUVsZW1lbnQubWVyZ2VTdHlsZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbjt0PXR8fHt9O2ZvcihuIGluIHQpdFtuXT09PW51bGw/ZGVsZXRlIGVbbl06ZVtuXT10W25dfSxqdm0uU1ZHRWxlbWVudD1mdW5jdGlvbihlLHQpe2p2bS5TVkdFbGVtZW50LnBhcmVudENsYXNzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sanZtLmluaGVyaXRzKGp2bS5TVkdFbGVtZW50LGp2bS5BYnN0cmFjdEVsZW1lbnQpLGp2bS5TVkdFbGVtZW50LnN2Z25zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixqdm0uU1ZHRWxlbWVudC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGp2bS5TVkdFbGVtZW50LnN2Z25zLGUpfSxqdm0uU1ZHRWxlbWVudC5wcm90b3R5cGUuYWRkQ2xhc3M9ZnVuY3Rpb24oZSl7dGhpcy5ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsZSl9LGp2bS5TVkdFbGVtZW50LnByb3RvdHlwZS5nZXRFbGVtZW50Q3RyPWZ1bmN0aW9uKGUpe3JldHVybiBqdm1bXCJTVkdcIitlXX0sanZtLlNWR0VsZW1lbnQucHJvdG90eXBlLmdldEJCb3g9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLmdldEJCb3goKX0sanZtLlNWR0dyb3VwRWxlbWVudD1mdW5jdGlvbigpe2p2bS5TVkdHcm91cEVsZW1lbnQucGFyZW50Q2xhc3MuY2FsbCh0aGlzLFwiZ1wiKX0sanZtLmluaGVyaXRzKGp2bS5TVkdHcm91cEVsZW1lbnQsanZtLlNWR0VsZW1lbnQpLGp2bS5TVkdHcm91cEVsZW1lbnQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoZS5ub2RlKX0sanZtLlNWR0NhbnZhc0VsZW1lbnQ9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuY2xhc3NQcmVmaXg9XCJTVkdcIixqdm0uU1ZHQ2FudmFzRWxlbWVudC5wYXJlbnRDbGFzcy5jYWxsKHRoaXMsXCJzdmdcIiksanZtLkFic3RyYWN0Q2FudmFzRWxlbWVudC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGp2bS5pbmhlcml0cyhqdm0uU1ZHQ2FudmFzRWxlbWVudCxqdm0uU1ZHRWxlbWVudCksanZtLm1peGluKGp2bS5TVkdDYW52YXNFbGVtZW50LGp2bS5BYnN0cmFjdENhbnZhc0VsZW1lbnQpLGp2bS5TVkdDYW52YXNFbGVtZW50LnByb3RvdHlwZS5zZXRTaXplPWZ1bmN0aW9uKGUsdCl7dGhpcy53aWR0aD1lLHRoaXMuaGVpZ2h0PXQsdGhpcy5ub2RlLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsZSksdGhpcy5ub2RlLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLHQpfSxqdm0uU1ZHQ2FudmFzRWxlbWVudC5wcm90b3R5cGUuYXBwbHlUcmFuc2Zvcm1QYXJhbXM9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuc2NhbGU9ZSx0aGlzLnRyYW5zWD10LHRoaXMudHJhbnNZPW4sdGhpcy5yb290RWxlbWVudC5ub2RlLnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLFwic2NhbGUoXCIrZStcIikgdHJhbnNsYXRlKFwiK3QrXCIsIFwiK24rXCIpXCIpfSxqdm0uU1ZHU2hhcGVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuKXtqdm0uU1ZHU2hhcGVFbGVtZW50LnBhcmVudENsYXNzLmNhbGwodGhpcyxlLHQpLGp2bS5BYnN0cmFjdFNoYXBlRWxlbWVudC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGp2bS5pbmhlcml0cyhqdm0uU1ZHU2hhcGVFbGVtZW50LGp2bS5TVkdFbGVtZW50KSxqdm0ubWl4aW4oanZtLlNWR1NoYXBlRWxlbWVudCxqdm0uQWJzdHJhY3RTaGFwZUVsZW1lbnQpLGp2bS5TVkdQYXRoRWxlbWVudD1mdW5jdGlvbihlLHQpe2p2bS5TVkdQYXRoRWxlbWVudC5wYXJlbnRDbGFzcy5jYWxsKHRoaXMsXCJwYXRoXCIsZSx0KSx0aGlzLm5vZGUuc2V0QXR0cmlidXRlKFwiZmlsbC1ydWxlXCIsXCJldmVub2RkXCIpfSxqdm0uaW5oZXJpdHMoanZtLlNWR1BhdGhFbGVtZW50LGp2bS5TVkdTaGFwZUVsZW1lbnQpLGp2bS5TVkdDaXJjbGVFbGVtZW50PWZ1bmN0aW9uKGUsdCl7anZtLlNWR0NpcmNsZUVsZW1lbnQucGFyZW50Q2xhc3MuY2FsbCh0aGlzLFwiY2lyY2xlXCIsZSx0KX0sanZtLmluaGVyaXRzKGp2bS5TVkdDaXJjbGVFbGVtZW50LGp2bS5TVkdTaGFwZUVsZW1lbnQpLGp2bS5WTUxFbGVtZW50PWZ1bmN0aW9uKGUsdCl7anZtLlZNTEVsZW1lbnQuVk1MSW5pdGlhbGl6ZWR8fGp2bS5WTUxFbGVtZW50LmluaXRpYWxpemVWTUwoKSxqdm0uVk1MRWxlbWVudC5wYXJlbnRDbGFzcy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGp2bS5pbmhlcml0cyhqdm0uVk1MRWxlbWVudCxqdm0uQWJzdHJhY3RFbGVtZW50KSxqdm0uVk1MRWxlbWVudC5WTUxJbml0aWFsaXplZD0hMSxqdm0uVk1MRWxlbWVudC5pbml0aWFsaXplVk1MPWZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50Lm5hbWVzcGFjZXMucnZtbHx8ZG9jdW1lbnQubmFtZXNwYWNlcy5hZGQoXCJydm1sXCIsXCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbFwiKSxqdm0uVk1MRWxlbWVudC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIjxydm1sOlwiK2UrJyBjbGFzcz1cInJ2bWxcIj4nKX19Y2F0Y2goZSl7anZtLlZNTEVsZW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCI8XCIrZSsnIHhtbG5zPVwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LmNvbTp2bWxcIiBjbGFzcz1cInJ2bWxcIj4nKX19ZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldCgpLmFkZFJ1bGUoXCIucnZtbFwiLFwiYmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTClcIiksanZtLlZNTEVsZW1lbnQuVk1MSW5pdGlhbGl6ZWQ9ITB9LGp2bS5WTUxFbGVtZW50LnByb3RvdHlwZS5nZXRFbGVtZW50Q3RyPWZ1bmN0aW9uKGUpe3JldHVybiBqdm1bXCJWTUxcIitlXX0sanZtLlZNTEVsZW1lbnQucHJvdG90eXBlLmFkZENsYXNzPWZ1bmN0aW9uKGUpe2p2bS4kKHRoaXMubm9kZSkuYWRkQ2xhc3MoZSl9LGp2bS5WTUxFbGVtZW50LnByb3RvdHlwZS5hcHBseUF0dHI9ZnVuY3Rpb24oZSx0KXt0aGlzLm5vZGVbZV09dH0sanZtLlZNTEVsZW1lbnQucHJvdG90eXBlLmdldEJCb3g9ZnVuY3Rpb24oKXt2YXIgZT1qdm0uJCh0aGlzLm5vZGUpO3JldHVybnt4OmUucG9zaXRpb24oKS5sZWZ0L3RoaXMuY2FudmFzLnNjYWxlLHk6ZS5wb3NpdGlvbigpLnRvcC90aGlzLmNhbnZhcy5zY2FsZSx3aWR0aDplLndpZHRoKCkvdGhpcy5jYW52YXMuc2NhbGUsaGVpZ2h0OmUuaGVpZ2h0KCkvdGhpcy5jYW52YXMuc2NhbGV9fSxqdm0uVk1MR3JvdXBFbGVtZW50PWZ1bmN0aW9uKCl7anZtLlZNTEdyb3VwRWxlbWVudC5wYXJlbnRDbGFzcy5jYWxsKHRoaXMsXCJncm91cFwiKSx0aGlzLm5vZGUuc3R5bGUubGVmdD1cIjBweFwiLHRoaXMubm9kZS5zdHlsZS50b3A9XCIwcHhcIix0aGlzLm5vZGUuY29vcmRvcmlnaW49XCIwIDBcIn0sanZtLmluaGVyaXRzKGp2bS5WTUxHcm91cEVsZW1lbnQsanZtLlZNTEVsZW1lbnQpLGp2bS5WTUxHcm91cEVsZW1lbnQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoZS5ub2RlKX0sanZtLlZNTENhbnZhc0VsZW1lbnQ9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuY2xhc3NQcmVmaXg9XCJWTUxcIixqdm0uVk1MQ2FudmFzRWxlbWVudC5wYXJlbnRDbGFzcy5jYWxsKHRoaXMsXCJncm91cFwiKSxqdm0uQWJzdHJhY3RDYW52YXNFbGVtZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLm5vZGUuc3R5bGUucG9zaXRpb249XCJhYnNvbHV0ZVwifSxqdm0uaW5oZXJpdHMoanZtLlZNTENhbnZhc0VsZW1lbnQsanZtLlZNTEVsZW1lbnQpLGp2bS5taXhpbihqdm0uVk1MQ2FudmFzRWxlbWVudCxqdm0uQWJzdHJhY3RDYW52YXNFbGVtZW50KSxqdm0uVk1MQ2FudmFzRWxlbWVudC5wcm90b3R5cGUuc2V0U2l6ZT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxzO3RoaXMud2lkdGg9ZSx0aGlzLmhlaWdodD10LHRoaXMubm9kZS5zdHlsZS53aWR0aD1lK1wicHhcIix0aGlzLm5vZGUuc3R5bGUuaGVpZ2h0PXQrXCJweFwiLHRoaXMubm9kZS5jb29yZHNpemU9ZStcIiBcIit0LHRoaXMubm9kZS5jb29yZG9yaWdpbj1cIjAgMFwiO2lmKHRoaXMucm9vdEVsZW1lbnQpe249dGhpcy5yb290RWxlbWVudC5ub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2hhcGVcIik7Zm9yKGk9MCxzPW4ubGVuZ3RoO2k8cztpKyspbltpXS5jb29yZHNpemU9ZStcIiBcIit0LG5baV0uc3R5bGUud2lkdGg9ZStcInB4XCIsbltpXS5zdHlsZS5oZWlnaHQ9dCtcInB4XCI7cj10aGlzLm5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJncm91cFwiKTtmb3IoaT0wLHM9ci5sZW5ndGg7aTxzO2krKylyW2ldLmNvb3Jkc2l6ZT1lK1wiIFwiK3QscltpXS5zdHlsZS53aWR0aD1lK1wicHhcIixyW2ldLnN0eWxlLmhlaWdodD10K1wicHhcIn19LGp2bS5WTUxDYW52YXNFbGVtZW50LnByb3RvdHlwZS5hcHBseVRyYW5zZm9ybVBhcmFtcz1mdW5jdGlvbihlLHQsbil7dGhpcy5zY2FsZT1lLHRoaXMudHJhbnNYPXQsdGhpcy50cmFuc1k9bix0aGlzLnJvb3RFbGVtZW50Lm5vZGUuY29vcmRvcmlnaW49dGhpcy53aWR0aC10LXRoaXMud2lkdGgvMTAwK1wiLFwiKyh0aGlzLmhlaWdodC1uLXRoaXMuaGVpZ2h0LzEwMCksdGhpcy5yb290RWxlbWVudC5ub2RlLmNvb3Jkc2l6ZT10aGlzLndpZHRoL2UrXCIsXCIrdGhpcy5oZWlnaHQvZX0sanZtLlZNTFNoYXBlRWxlbWVudD1mdW5jdGlvbihlLHQpe2p2bS5WTUxTaGFwZUVsZW1lbnQucGFyZW50Q2xhc3MuY2FsbCh0aGlzLGUsdCksdGhpcy5maWxsRWxlbWVudD1uZXcganZtLlZNTEVsZW1lbnQoXCJmaWxsXCIpLHRoaXMuc3Ryb2tlRWxlbWVudD1uZXcganZtLlZNTEVsZW1lbnQoXCJzdHJva2VcIiksdGhpcy5ub2RlLmFwcGVuZENoaWxkKHRoaXMuZmlsbEVsZW1lbnQubm9kZSksdGhpcy5ub2RlLmFwcGVuZENoaWxkKHRoaXMuc3Ryb2tlRWxlbWVudC5ub2RlKSx0aGlzLm5vZGUuc3Ryb2tlZD0hMSxqdm0uQWJzdHJhY3RTaGFwZUVsZW1lbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxqdm0uaW5oZXJpdHMoanZtLlZNTFNoYXBlRWxlbWVudCxqdm0uVk1MRWxlbWVudCksanZtLm1peGluKGp2bS5WTUxTaGFwZUVsZW1lbnQsanZtLkFic3RyYWN0U2hhcGVFbGVtZW50KSxqdm0uVk1MU2hhcGVFbGVtZW50LnByb3RvdHlwZS5hcHBseUF0dHI9ZnVuY3Rpb24oZSx0KXtzd2l0Y2goZSl7Y2FzZVwiZmlsbFwiOnRoaXMubm9kZS5maWxsY29sb3I9dDticmVhaztjYXNlXCJmaWxsLW9wYWNpdHlcIjp0aGlzLmZpbGxFbGVtZW50Lm5vZGUub3BhY2l0eT1NYXRoLnJvdW5kKHQqMTAwKStcIiVcIjticmVhaztjYXNlXCJzdHJva2VcIjp0PT09XCJub25lXCI/dGhpcy5ub2RlLnN0cm9rZWQ9ITE6dGhpcy5ub2RlLnN0cm9rZWQ9ITAsdGhpcy5ub2RlLnN0cm9rZWNvbG9yPXQ7YnJlYWs7Y2FzZVwic3Ryb2tlLW9wYWNpdHlcIjp0aGlzLnN0cm9rZUVsZW1lbnQubm9kZS5vcGFjaXR5PU1hdGgucm91bmQodCoxMDApK1wiJVwiO2JyZWFrO2Nhc2VcInN0cm9rZS13aWR0aFwiOnBhcnNlSW50KHQsMTApPT09MD90aGlzLm5vZGUuc3Ryb2tlZD0hMTp0aGlzLm5vZGUuc3Ryb2tlZD0hMCx0aGlzLm5vZGUuc3Ryb2tld2VpZ2h0PXQ7YnJlYWs7Y2FzZVwiZFwiOnRoaXMubm9kZS5wYXRoPWp2bS5WTUxQYXRoRWxlbWVudC5wYXRoU3ZnVG9WbWwodCk7YnJlYWs7ZGVmYXVsdDpqdm0uVk1MU2hhcGVFbGVtZW50LnBhcmVudENsYXNzLnByb3RvdHlwZS5hcHBseUF0dHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sanZtLlZNTFBhdGhFbGVtZW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IGp2bS5WTUxFbGVtZW50KFwic2tld1wiKTtqdm0uVk1MUGF0aEVsZW1lbnQucGFyZW50Q2xhc3MuY2FsbCh0aGlzLFwic2hhcGVcIixlLHQpLHRoaXMubm9kZS5jb29yZG9yaWdpbj1cIjAgMFwiLG4ubm9kZS5vbj0hMCxuLm5vZGUubWF0cml4PVwiMC4wMSwwLDAsMC4wMSwwLDBcIixuLm5vZGUub2Zmc2V0PVwiMCwwXCIsdGhpcy5ub2RlLmFwcGVuZENoaWxkKG4ubm9kZSl9LGp2bS5pbmhlcml0cyhqdm0uVk1MUGF0aEVsZW1lbnQsanZtLlZNTFNoYXBlRWxlbWVudCksanZtLlZNTFBhdGhFbGVtZW50LnByb3RvdHlwZS5hcHBseUF0dHI9ZnVuY3Rpb24oZSx0KXtlPT09XCJkXCI/dGhpcy5ub2RlLnBhdGg9anZtLlZNTFBhdGhFbGVtZW50LnBhdGhTdmdUb1ZtbCh0KTpqdm0uVk1MU2hhcGVFbGVtZW50LnByb3RvdHlwZS5hcHBseUF0dHIuY2FsbCh0aGlzLGUsdCl9LGp2bS5WTUxQYXRoRWxlbWVudC5wYXRoU3ZnVG9WbWw9ZnVuY3Rpb24oZSl7dmFyIHQ9XCJcIixuPTAscj0wLGkscztyZXR1cm4gZT1lLnJlcGxhY2UoLygtP1xcZCspZSgtP1xcZCspL2csXCIwXCIpLGUucmVwbGFjZSgvKFtNbUxsSGhWdkNjU3NdKVxccyooKD86LT9cXGQqKD86XFwuXFxkKyk/XFxzKiw/XFxzKikrKS9nLGZ1bmN0aW9uKGUsdCxvLHUpe289by5yZXBsYWNlKC8oXFxkKS0vZyxcIiQxLC1cIikucmVwbGFjZSgvXlxccysvZyxcIlwiKS5yZXBsYWNlKC9cXHMrJC9nLFwiXCIpLnJlcGxhY2UoL1xccysvZyxcIixcIikuc3BsaXQoXCIsXCIpLG9bMF18fG8uc2hpZnQoKTtmb3IodmFyIGE9MCxmPW8ubGVuZ3RoO2E8ZjthKyspb1thXT1NYXRoLnJvdW5kKDEwMCpvW2FdKTtzd2l0Y2godCl7Y2FzZVwibVwiOnJldHVybiBuKz1vWzBdLHIrPW9bMV0sXCJ0XCIrby5qb2luKFwiLFwiKTtjYXNlXCJNXCI6cmV0dXJuIG49b1swXSxyPW9bMV0sXCJtXCIrby5qb2luKFwiLFwiKTtjYXNlXCJsXCI6cmV0dXJuIG4rPW9bMF0scis9b1sxXSxcInJcIitvLmpvaW4oXCIsXCIpO2Nhc2VcIkxcIjpyZXR1cm4gbj1vWzBdLHI9b1sxXSxcImxcIitvLmpvaW4oXCIsXCIpO2Nhc2VcImhcIjpyZXR1cm4gbis9b1swXSxcInJcIitvWzBdK1wiLDBcIjtjYXNlXCJIXCI6cmV0dXJuIG49b1swXSxcImxcIituK1wiLFwiK3I7Y2FzZVwidlwiOnJldHVybiByKz1vWzBdLFwicjAsXCIrb1swXTtjYXNlXCJWXCI6cmV0dXJuIHI9b1swXSxcImxcIituK1wiLFwiK3I7Y2FzZVwiY1wiOnJldHVybiBpPW4rb1tvLmxlbmd0aC00XSxzPXIrb1tvLmxlbmd0aC0zXSxuKz1vW28ubGVuZ3RoLTJdLHIrPW9bby5sZW5ndGgtMV0sXCJ2XCIrby5qb2luKFwiLFwiKTtjYXNlXCJDXCI6cmV0dXJuIGk9b1tvLmxlbmd0aC00XSxzPW9bby5sZW5ndGgtM10sbj1vW28ubGVuZ3RoLTJdLHI9b1tvLmxlbmd0aC0xXSxcImNcIitvLmpvaW4oXCIsXCIpO2Nhc2VcInNcIjpyZXR1cm4gby51bnNoaWZ0KHItcyksby51bnNoaWZ0KG4taSksaT1uK29bby5sZW5ndGgtNF0scz1yK29bby5sZW5ndGgtM10sbis9b1tvLmxlbmd0aC0yXSxyKz1vW28ubGVuZ3RoLTFdLFwidlwiK28uam9pbihcIixcIik7Y2FzZVwiU1wiOnJldHVybiBvLnVuc2hpZnQocityLXMpLG8udW5zaGlmdChuK24taSksaT1vW28ubGVuZ3RoLTRdLHM9b1tvLmxlbmd0aC0zXSxuPW9bby5sZW5ndGgtMl0scj1vW28ubGVuZ3RoLTFdLFwiY1wiK28uam9pbihcIixcIil9cmV0dXJuXCJcIn0pLnJlcGxhY2UoL3ovZyxcImVcIil9LGp2bS5WTUxDaXJjbGVFbGVtZW50PWZ1bmN0aW9uKGUsdCl7anZtLlZNTENpcmNsZUVsZW1lbnQucGFyZW50Q2xhc3MuY2FsbCh0aGlzLFwib3ZhbFwiLGUsdCl9LGp2bS5pbmhlcml0cyhqdm0uVk1MQ2lyY2xlRWxlbWVudCxqdm0uVk1MU2hhcGVFbGVtZW50KSxqdm0uVk1MQ2lyY2xlRWxlbWVudC5wcm90b3R5cGUuYXBwbHlBdHRyPWZ1bmN0aW9uKGUsdCl7c3dpdGNoKGUpe2Nhc2VcInJcIjp0aGlzLm5vZGUuc3R5bGUud2lkdGg9dCoyK1wicHhcIix0aGlzLm5vZGUuc3R5bGUuaGVpZ2h0PXQqMitcInB4XCIsdGhpcy5hcHBseUF0dHIoXCJjeFwiLHRoaXMuZ2V0KFwiY3hcIil8fDApLHRoaXMuYXBwbHlBdHRyKFwiY3lcIix0aGlzLmdldChcImN5XCIpfHwwKTticmVhaztjYXNlXCJjeFwiOmlmKCF0KXJldHVybjt0aGlzLm5vZGUuc3R5bGUubGVmdD10LSh0aGlzLmdldChcInJcIil8fDApK1wicHhcIjticmVhaztjYXNlXCJjeVwiOmlmKCF0KXJldHVybjt0aGlzLm5vZGUuc3R5bGUudG9wPXQtKHRoaXMuZ2V0KFwiclwiKXx8MCkrXCJweFwiO2JyZWFrO2RlZmF1bHQ6anZtLlZNTENpcmNsZUVsZW1lbnQucGFyZW50Q2xhc3MucHJvdG90eXBlLmFwcGx5QXR0ci5jYWxsKHRoaXMsZSx0KX19LGp2bS5WZWN0b3JDYW52YXM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm1vZGU9d2luZG93LlNWR0FuZ2xlP1wic3ZnXCI6XCJ2bWxcIix0aGlzLm1vZGU9PVwic3ZnXCI/dGhpcy5pbXBsPW5ldyBqdm0uU1ZHQ2FudmFzRWxlbWVudChlLHQsbik6dGhpcy5pbXBsPW5ldyBqdm0uVk1MQ2FudmFzRWxlbWVudChlLHQsbiksdGhpcy5pbXBsfSxqdm0uU2ltcGxlU2NhbGU9ZnVuY3Rpb24oZSl7dGhpcy5zY2FsZT1lfSxqdm0uU2ltcGxlU2NhbGUucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBlfSxqdm0uT3JkaW5hbFNjYWxlPWZ1bmN0aW9uKGUpe3RoaXMuc2NhbGU9ZX0sanZtLk9yZGluYWxTY2FsZS5wcm90b3R5cGUuZ2V0VmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2NhbGVbZV19LGp2bS5OdW1lcmljU2NhbGU9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5zY2FsZT1bXSx0PXR8fFwibGluZWFyXCIsZSYmdGhpcy5zZXRTY2FsZShlKSx0JiZ0aGlzLnNldE5vcm1hbGl6ZUZ1bmN0aW9uKHQpLG4mJnRoaXMuc2V0TWluKG4pLHImJnRoaXMuc2V0TWF4KHIpfSxqdm0uTnVtZXJpY1NjYWxlLnByb3RvdHlwZT17c2V0TWluOmZ1bmN0aW9uKGUpe3RoaXMuY2xlYXJNaW5WYWx1ZT1lLHR5cGVvZiB0aGlzLm5vcm1hbGl6ZT09XCJmdW5jdGlvblwiP3RoaXMubWluVmFsdWU9dGhpcy5ub3JtYWxpemUoZSk6dGhpcy5taW5WYWx1ZT1lfSxzZXRNYXg6ZnVuY3Rpb24oZSl7dGhpcy5jbGVhck1heFZhbHVlPWUsdHlwZW9mIHRoaXMubm9ybWFsaXplPT1cImZ1bmN0aW9uXCI/dGhpcy5tYXhWYWx1ZT10aGlzLm5vcm1hbGl6ZShlKTp0aGlzLm1heFZhbHVlPWV9LHNldFNjYWxlOmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy5zY2FsZVt0XT1bZVt0XV19LHNldE5vcm1hbGl6ZUZ1bmN0aW9uOmZ1bmN0aW9uKGUpe2U9PT1cInBvbHlub21pYWxcIj90aGlzLm5vcm1hbGl6ZT1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3coZSwuMil9OmU9PT1cImxpbmVhclwiP2RlbGV0ZSB0aGlzLm5vcm1hbGl6ZTp0aGlzLm5vcm1hbGl6ZT1lLHRoaXMuc2V0TWluKHRoaXMuY2xlYXJNaW5WYWx1ZSksdGhpcy5zZXRNYXgodGhpcy5jbGVhck1heFZhbHVlKX0sZ2V0VmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj0wLHIsaT0wLHM7dHlwZW9mIHRoaXMubm9ybWFsaXplPT1cImZ1bmN0aW9uXCImJihlPXRoaXMubm9ybWFsaXplKGUpKTtmb3IoaT0wO2k8dGhpcy5zY2FsZS5sZW5ndGgtMTtpKyspcj10aGlzLnZlY3Rvckxlbmd0aCh0aGlzLnZlY3RvclN1YnRyYWN0KHRoaXMuc2NhbGVbaSsxXSx0aGlzLnNjYWxlW2ldKSksdC5wdXNoKHIpLG4rPXI7cz0odGhpcy5tYXhWYWx1ZS10aGlzLm1pblZhbHVlKS9uO2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspdFtpXSo9cztpPTAsZS09dGhpcy5taW5WYWx1ZTt3aGlsZShlLXRbaV0+PTApZS09dFtpXSxpKys7cmV0dXJuIGk9PXRoaXMuc2NhbGUubGVuZ3RoLTE/ZT10aGlzLnZlY3RvclRvTnVtKHRoaXMuc2NhbGVbaV0pOmU9dGhpcy52ZWN0b3JUb051bSh0aGlzLnZlY3RvckFkZCh0aGlzLnNjYWxlW2ldLHRoaXMudmVjdG9yTXVsdCh0aGlzLnZlY3RvclN1YnRyYWN0KHRoaXMuc2NhbGVbaSsxXSx0aGlzLnNjYWxlW2ldKSxlL3RbaV0pKSksZX0sdmVjdG9yVG9OdW06ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspdCs9TWF0aC5yb3VuZChlW25dKSpNYXRoLnBvdygyNTYsZS5sZW5ndGgtbi0xKTtyZXR1cm4gdH0sdmVjdG9yU3VidHJhY3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXSxyO2ZvcihyPTA7cjxlLmxlbmd0aDtyKyspbltyXT1lW3JdLXRbcl07cmV0dXJuIG59LHZlY3RvckFkZDpmdW5jdGlvbihlLHQpe3ZhciBuPVtdLHI7Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKyluW3JdPWVbcl0rdFtyXTtyZXR1cm4gbn0sdmVjdG9yTXVsdDpmdW5jdGlvbihlLHQpe3ZhciBuPVtdLHI7Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKyluW3JdPWVbcl0qdDtyZXR1cm4gbn0sdmVjdG9yTGVuZ3RoOmZ1bmN0aW9uKGUpe3ZhciB0PTAsbjtmb3Iobj0wO248ZS5sZW5ndGg7bisrKXQrPWVbbl0qZVtuXTtyZXR1cm4gTWF0aC5zcXJ0KHQpfX0sanZtLkNvbG9yU2NhbGU9ZnVuY3Rpb24oZSx0LG4scil7anZtLkNvbG9yU2NhbGUucGFyZW50Q2xhc3MuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxqdm0uaW5oZXJpdHMoanZtLkNvbG9yU2NhbGUsanZtLk51bWVyaWNTY2FsZSksanZtLkNvbG9yU2NhbGUucHJvdG90eXBlLnNldFNjYWxlPWZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy5zY2FsZVt0XT1qdm0uQ29sb3JTY2FsZS5yZ2JUb0FycmF5KGVbdF0pfSxqdm0uQ29sb3JTY2FsZS5wcm90b3R5cGUuZ2V0VmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGp2bS5Db2xvclNjYWxlLm51bVRvUmdiKGp2bS5Db2xvclNjYWxlLnBhcmVudENsYXNzLnByb3RvdHlwZS5nZXRWYWx1ZS5jYWxsKHRoaXMsZSkpfSxqdm0uQ29sb3JTY2FsZS5hcnJheVRvUmdiPWZ1bmN0aW9uKGUpe3ZhciB0PVwiI1wiLG4scjtmb3Iocj0wO3I8ZS5sZW5ndGg7cisrKW49ZVtyXS50b1N0cmluZygxNiksdCs9bi5sZW5ndGg9PTE/XCIwXCIrbjpuO3JldHVybiB0fSxqdm0uQ29sb3JTY2FsZS5udW1Ub1JnYj1mdW5jdGlvbihlKXtlPWUudG9TdHJpbmcoMTYpO3doaWxlKGUubGVuZ3RoPDYpZT1cIjBcIitlO3JldHVyblwiI1wiK2V9LGp2bS5Db2xvclNjYWxlLnJnYlRvQXJyYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5zdWJzdHIoMSksW3BhcnNlSW50KGUuc3Vic3RyKDAsMiksMTYpLHBhcnNlSW50KGUuc3Vic3RyKDIsMiksMTYpLHBhcnNlSW50KGUuc3Vic3RyKDQsMiksMTYpXX0sanZtLkRhdGFTZXJpZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbjtlPWV8fHt9LGUuYXR0cmlidXRlPWUuYXR0cmlidXRlfHxcImZpbGxcIix0aGlzLmVsZW1lbnRzPXQsdGhpcy5wYXJhbXM9ZSxlLmF0dHJpYnV0ZXMmJnRoaXMuc2V0QXR0cmlidXRlcyhlLmF0dHJpYnV0ZXMpLGp2bS4kLmlzQXJyYXkoZS5zY2FsZSk/KG49ZS5hdHRyaWJ1dGU9PT1cImZpbGxcInx8ZS5hdHRyaWJ1dGU9PT1cInN0cm9rZVwiP2p2bS5Db2xvclNjYWxlOmp2bS5OdW1lcmljU2NhbGUsdGhpcy5zY2FsZT1uZXcgbihlLnNjYWxlLGUubm9ybWFsaXplRnVuY3Rpb24sZS5taW4sZS5tYXgpKTplLnNjYWxlP3RoaXMuc2NhbGU9bmV3IGp2bS5PcmRpbmFsU2NhbGUoZS5zY2FsZSk6dGhpcy5zY2FsZT1uZXcganZtLlNpbXBsZVNjYWxlKGUuc2NhbGUpLHRoaXMudmFsdWVzPWUudmFsdWVzfHx7fSx0aGlzLnNldFZhbHVlcyh0aGlzLnZhbHVlcyl9LGp2bS5EYXRhU2VyaWVzLnByb3RvdHlwZT17c2V0QXR0cmlidXRlczpmdW5jdGlvbihlLHQpe3ZhciBuPWUscjtpZih0eXBlb2YgZT09XCJzdHJpbmdcIil0aGlzLmVsZW1lbnRzW2VdJiZ0aGlzLmVsZW1lbnRzW2VdLnNldFN0eWxlKHRoaXMucGFyYW1zLmF0dHJpYnV0ZSx0KTtlbHNlIGZvcihyIGluIG4pdGhpcy5lbGVtZW50c1tyXSYmdGhpcy5lbGVtZW50c1tyXS5lbGVtZW50LnNldFN0eWxlKHRoaXMucGFyYW1zLmF0dHJpYnV0ZSxuW3JdKX0sc2V0VmFsdWVzOmZ1bmN0aW9uKGUpe3ZhciB0PU51bWJlci5NSU5fVkFMVUUsbj1OdW1iZXIuTUFYX1ZBTFVFLHIsaSxzPXt9O2lmKHRoaXMuc2NhbGUgaW5zdGFuY2VvZiBqdm0uT3JkaW5hbFNjYWxlfHx0aGlzLnNjYWxlIGluc3RhbmNlb2YganZtLlNpbXBsZVNjYWxlKWZvcihpIGluIGUpZVtpXT9zW2ldPXRoaXMuc2NhbGUuZ2V0VmFsdWUoZVtpXSk6c1tpXT10aGlzLmVsZW1lbnRzW2ldLmVsZW1lbnQuc3R5bGUuaW5pdGlhbFt0aGlzLnBhcmFtcy5hdHRyaWJ1dGVdO2Vsc2V7aWYoIXRoaXMucGFyYW1zLm1pbnx8IXRoaXMucGFyYW1zLm1heCl7Zm9yKGkgaW4gZSlyPXBhcnNlRmxvYXQoZVtpXSkscj50JiYodD1lW2ldKSxyPG4mJihuPXIpO3RoaXMucGFyYW1zLm1pbnx8dGhpcy5zY2FsZS5zZXRNaW4obiksdGhpcy5wYXJhbXMubWF4fHx0aGlzLnNjYWxlLnNldE1heCh0KSx0aGlzLnBhcmFtcy5taW49bix0aGlzLnBhcmFtcy5tYXg9dH1mb3IoaSBpbiBlKXI9cGFyc2VGbG9hdChlW2ldKSxpc05hTihyKT9zW2ldPXRoaXMuZWxlbWVudHNbaV0uZWxlbWVudC5zdHlsZS5pbml0aWFsW3RoaXMucGFyYW1zLmF0dHJpYnV0ZV06c1tpXT10aGlzLnNjYWxlLmdldFZhbHVlKHIpfXRoaXMuc2V0QXR0cmlidXRlcyhzKSxqdm0uJC5leHRlbmQodGhpcy52YWx1ZXMsZSl9LGNsZWFyOmZ1bmN0aW9uKCl7dmFyIGUsdD17fTtmb3IoZSBpbiB0aGlzLnZhbHVlcyl0aGlzLmVsZW1lbnRzW2VdJiYodFtlXT10aGlzLmVsZW1lbnRzW2VdLmVsZW1lbnQuc3R5bGUuaW5pdGlhbFt0aGlzLnBhcmFtcy5hdHRyaWJ1dGVdKTt0aGlzLnNldEF0dHJpYnV0ZXModCksdGhpcy52YWx1ZXM9e319LHNldFNjYWxlOmZ1bmN0aW9uKGUpe3RoaXMuc2NhbGUuc2V0U2NhbGUoZSksdGhpcy52YWx1ZXMmJnRoaXMuc2V0VmFsdWVzKHRoaXMudmFsdWVzKX0sc2V0Tm9ybWFsaXplRnVuY3Rpb246ZnVuY3Rpb24oZSl7dGhpcy5zY2FsZS5zZXROb3JtYWxpemVGdW5jdGlvbihlKSx0aGlzLnZhbHVlcyYmdGhpcy5zZXRWYWx1ZXModGhpcy52YWx1ZXMpfX0sanZtLlByb2o9e2RlZ1JhZDoxODAvTWF0aC5QSSxyYWREZWc6TWF0aC5QSS8xODAscmFkaXVzOjYzODEzNzIsc2duOmZ1bmN0aW9uKGUpe3JldHVybiBlPjA/MTplPDA/LTE6ZX0sbWlsbDpmdW5jdGlvbihlLHQsbil7cmV0dXJue3g6dGhpcy5yYWRpdXMqKHQtbikqdGhpcy5yYWREZWcseTotdGhpcy5yYWRpdXMqTWF0aC5sb2coTWF0aC50YW4oKDQ1Ky40KmUpKnRoaXMucmFkRGVnKSkvLjh9fSxtaWxsX2ludjpmdW5jdGlvbihlLHQsbil7cmV0dXJue2xhdDooMi41Kk1hdGguYXRhbihNYXRoLmV4cCguOCp0L3RoaXMucmFkaXVzKSktNSpNYXRoLlBJLzgpKnRoaXMuZGVnUmFkLGxuZzoobip0aGlzLnJhZERlZytlL3RoaXMucmFkaXVzKSp0aGlzLmRlZ1JhZH19LG1lcmM6ZnVuY3Rpb24oZSx0LG4pe3JldHVybnt4OnRoaXMucmFkaXVzKih0LW4pKnRoaXMucmFkRGVnLHk6LXRoaXMucmFkaXVzKk1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkvNCtlKk1hdGguUEkvMzYwKSl9fSxtZXJjX2ludjpmdW5jdGlvbihlLHQsbil7cmV0dXJue2xhdDooMipNYXRoLmF0YW4oTWF0aC5leHAodC90aGlzLnJhZGl1cykpLU1hdGguUEkvMikqdGhpcy5kZWdSYWQsbG5nOihuKnRoaXMucmFkRGVnK2UvdGhpcy5yYWRpdXMpKnRoaXMuZGVnUmFkfX0sYWVhOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0wLGk9bip0aGlzLnJhZERlZyxzPTI5LjUqdGhpcy5yYWREZWcsbz00NS41KnRoaXMucmFkRGVnLHU9ZSp0aGlzLnJhZERlZyxhPXQqdGhpcy5yYWREZWcsZj0oTWF0aC5zaW4ocykrTWF0aC5zaW4obykpLzIsbD1NYXRoLmNvcyhzKSpNYXRoLmNvcyhzKSsyKmYqTWF0aC5zaW4ocyksYz1mKihhLWkpLGg9TWF0aC5zcXJ0KGwtMipmKk1hdGguc2luKHUpKS9mLHA9TWF0aC5zcXJ0KGwtMipmKk1hdGguc2luKHIpKS9mO3JldHVybnt4OmgqTWF0aC5zaW4oYykqdGhpcy5yYWRpdXMseTotKHAtaCpNYXRoLmNvcyhjKSkqdGhpcy5yYWRpdXN9fSxhZWFfaW52OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lL3RoaXMucmFkaXVzLGk9dC90aGlzLnJhZGl1cyxzPTAsbz1uKnRoaXMucmFkRGVnLHU9MjkuNSp0aGlzLnJhZERlZyxhPTQ1LjUqdGhpcy5yYWREZWcsZj0oTWF0aC5zaW4odSkrTWF0aC5zaW4oYSkpLzIsbD1NYXRoLmNvcyh1KSpNYXRoLmNvcyh1KSsyKmYqTWF0aC5zaW4odSksYz1NYXRoLnNxcnQobC0yKmYqTWF0aC5zaW4ocykpL2YsaD1NYXRoLnNxcnQocipyKyhjLWkpKihjLWkpKSxwPU1hdGguYXRhbihyLyhjLWkpKTtyZXR1cm57bGF0Ok1hdGguYXNpbigobC1oKmgqZipmKS8oMipmKSkqdGhpcy5kZWdSYWQsbG5nOihvK3AvZikqdGhpcy5kZWdSYWR9fSxsY2M6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPTAsaT1uKnRoaXMucmFkRGVnLHM9dCp0aGlzLnJhZERlZyxvPTMzKnRoaXMucmFkRGVnLHU9NDUqdGhpcy5yYWREZWcsYT1lKnRoaXMucmFkRGVnLGY9TWF0aC5sb2coTWF0aC5jb3MobykqKDEvTWF0aC5jb3ModSkpKS9NYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJLzQrdS8yKSooMS9NYXRoLnRhbihNYXRoLlBJLzQrby8yKSkpLGw9TWF0aC5jb3MobykqTWF0aC5wb3coTWF0aC50YW4oTWF0aC5QSS80K28vMiksZikvZixjPWwqTWF0aC5wb3coMS9NYXRoLnRhbihNYXRoLlBJLzQrYS8yKSxmKSxoPWwqTWF0aC5wb3coMS9NYXRoLnRhbihNYXRoLlBJLzQrci8yKSxmKTtyZXR1cm57eDpjKk1hdGguc2luKGYqKHMtaSkpKnRoaXMucmFkaXVzLHk6LShoLWMqTWF0aC5jb3MoZioocy1pKSkpKnRoaXMucmFkaXVzfX0sbGNjX2ludjpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS90aGlzLnJhZGl1cyxpPXQvdGhpcy5yYWRpdXMscz0wLG89bip0aGlzLnJhZERlZyx1PTMzKnRoaXMucmFkRGVnLGE9NDUqdGhpcy5yYWREZWcsZj1NYXRoLmxvZyhNYXRoLmNvcyh1KSooMS9NYXRoLmNvcyhhKSkpL01hdGgubG9nKE1hdGgudGFuKE1hdGguUEkvNCthLzIpKigxL01hdGgudGFuKE1hdGguUEkvNCt1LzIpKSksbD1NYXRoLmNvcyh1KSpNYXRoLnBvdyhNYXRoLnRhbihNYXRoLlBJLzQrdS8yKSxmKS9mLGM9bCpNYXRoLnBvdygxL01hdGgudGFuKE1hdGguUEkvNCtzLzIpLGYpLGg9dGhpcy5zZ24oZikqTWF0aC5zcXJ0KHIqcisoYy1pKSooYy1pKSkscD1NYXRoLmF0YW4oci8oYy1pKSk7cmV0dXJue2xhdDooMipNYXRoLmF0YW4oTWF0aC5wb3cobC9oLDEvZikpLU1hdGguUEkvMikqdGhpcy5kZWdSYWQsbG5nOihvK3AvZikqdGhpcy5kZWdSYWR9fX0sanZtLldvcmxkTWFwPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbjt0aGlzLnBhcmFtcz1qdm0uJC5leHRlbmQoITAse30sanZtLldvcmxkTWFwLmRlZmF1bHRQYXJhbXMsZSk7aWYoIWp2bS5Xb3JsZE1hcC5tYXBzW3RoaXMucGFyYW1zLm1hcF0pdGhyb3cgbmV3IEVycm9yKFwiQXR0ZW1wdCB0byB1c2UgbWFwIHdoaWNoIHdhcyBub3QgbG9hZGVkOiBcIit0aGlzLnBhcmFtcy5tYXApO3RoaXMubWFwRGF0YT1qdm0uV29ybGRNYXAubWFwc1t0aGlzLnBhcmFtcy5tYXBdLHRoaXMubWFya2Vycz17fSx0aGlzLnJlZ2lvbnM9e30sdGhpcy5yZWdpb25zQ29sb3JzPXt9LHRoaXMucmVnaW9uc0RhdGE9e30sdGhpcy5jb250YWluZXI9anZtLiQoXCI8ZGl2PlwiKS5jc3Moe3dpZHRoOlwiMTAwJVwiLGhlaWdodDpcIjEwMCVcIn0pLmFkZENsYXNzKFwianZlY3Rvcm1hcC1jb250YWluZXJcIiksdGhpcy5wYXJhbXMuY29udGFpbmVyLmFwcGVuZCh0aGlzLmNvbnRhaW5lciksdGhpcy5jb250YWluZXIuZGF0YShcIm1hcE9iamVjdFwiLHRoaXMpLHRoaXMuY29udGFpbmVyLmNzcyh7cG9zaXRpb246XCJyZWxhdGl2ZVwiLG92ZXJmbG93OlwiaGlkZGVuXCJ9KSx0aGlzLmRlZmF1bHRXaWR0aD10aGlzLm1hcERhdGEud2lkdGgsdGhpcy5kZWZhdWx0SGVpZ2h0PXRoaXMubWFwRGF0YS5oZWlnaHQsdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IodGhpcy5wYXJhbXMuYmFja2dyb3VuZENvbG9yKSx0aGlzLm9uUmVzaXplPWZ1bmN0aW9uKCl7dC5zZXRTaXplKCl9LGp2bS4kKHdpbmRvdykucmVzaXplKHRoaXMub25SZXNpemUpO2ZvcihuIGluIGp2bS5Xb3JsZE1hcC5hcGlFdmVudHMpdGhpcy5wYXJhbXNbbl0mJnRoaXMuY29udGFpbmVyLmJpbmQoanZtLldvcmxkTWFwLmFwaUV2ZW50c1tuXStcIi5qdmVjdG9ybWFwXCIsdGhpcy5wYXJhbXNbbl0pO3RoaXMuY2FudmFzPW5ldyBqdm0uVmVjdG9yQ2FudmFzKHRoaXMuY29udGFpbmVyWzBdLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLFwib250b3VjaHN0YXJ0XCJpbiB3aW5kb3d8fHdpbmRvdy5Eb2N1bWVudFRvdWNoJiZkb2N1bWVudCBpbnN0YW5jZW9mIERvY3VtZW50VG91Y2g/dGhpcy5wYXJhbXMuYmluZFRvdWNoRXZlbnRzJiZ0aGlzLmJpbmRDb250YWluZXJUb3VjaEV2ZW50cygpOnRoaXMuYmluZENvbnRhaW5lckV2ZW50cygpLHRoaXMuYmluZEVsZW1lbnRFdmVudHMoKSx0aGlzLmNyZWF0ZUxhYmVsKCksdGhpcy5wYXJhbXMuem9vbUJ1dHRvbnMmJnRoaXMuYmluZFpvb21CdXR0b25zKCksdGhpcy5jcmVhdGVSZWdpb25zKCksdGhpcy5jcmVhdGVNYXJrZXJzKHRoaXMucGFyYW1zLm1hcmtlcnN8fHt9KSx0aGlzLnNldFNpemUoKSx0aGlzLnBhcmFtcy5mb2N1c09uJiYodHlwZW9mIHRoaXMucGFyYW1zLmZvY3VzT249PVwib2JqZWN0XCI/dGhpcy5zZXRGb2N1cy5jYWxsKHRoaXMsdGhpcy5wYXJhbXMuZm9jdXNPbi5zY2FsZSx0aGlzLnBhcmFtcy5mb2N1c09uLngsdGhpcy5wYXJhbXMuZm9jdXNPbi55KTp0aGlzLnNldEZvY3VzLmNhbGwodGhpcyx0aGlzLnBhcmFtcy5mb2N1c09uKSksdGhpcy5wYXJhbXMuc2VsZWN0ZWRSZWdpb25zJiZ0aGlzLnNldFNlbGVjdGVkUmVnaW9ucyh0aGlzLnBhcmFtcy5zZWxlY3RlZFJlZ2lvbnMpLHRoaXMucGFyYW1zLnNlbGVjdGVkTWFya2VycyYmdGhpcy5zZXRTZWxlY3RlZE1hcmtlcnModGhpcy5wYXJhbXMuc2VsZWN0ZWRNYXJrZXJzKSx0aGlzLnBhcmFtcy5zZXJpZXMmJnRoaXMuY3JlYXRlU2VyaWVzKCl9LGp2bS5Xb3JsZE1hcC5wcm90b3R5cGU9e3RyYW5zWDowLHRyYW5zWTowLHNjYWxlOjEsYmFzZVRyYW5zWDowLGJhc2VUcmFuc1k6MCxiYXNlU2NhbGU6MSx3aWR0aDowLGhlaWdodDowLHNldEJhY2tncm91bmRDb2xvcjpmdW5jdGlvbihlKXt0aGlzLmNvbnRhaW5lci5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsZSl9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuYmFzZVNjYWxlO3RoaXMud2lkdGgvdGhpcy5oZWlnaHQ+dGhpcy5kZWZhdWx0V2lkdGgvdGhpcy5kZWZhdWx0SGVpZ2h0Pyh0aGlzLmJhc2VTY2FsZT10aGlzLmhlaWdodC90aGlzLmRlZmF1bHRIZWlnaHQsdGhpcy5iYXNlVHJhbnNYPU1hdGguYWJzKHRoaXMud2lkdGgtdGhpcy5kZWZhdWx0V2lkdGgqdGhpcy5iYXNlU2NhbGUpLygyKnRoaXMuYmFzZVNjYWxlKSk6KHRoaXMuYmFzZVNjYWxlPXRoaXMud2lkdGgvdGhpcy5kZWZhdWx0V2lkdGgsdGhpcy5iYXNlVHJhbnNZPU1hdGguYWJzKHRoaXMuaGVpZ2h0LXRoaXMuZGVmYXVsdEhlaWdodCp0aGlzLmJhc2VTY2FsZSkvKDIqdGhpcy5iYXNlU2NhbGUpKSx0aGlzLnNjYWxlKj10aGlzLmJhc2VTY2FsZS9lLHRoaXMudHJhbnNYKj10aGlzLmJhc2VTY2FsZS9lLHRoaXMudHJhbnNZKj10aGlzLmJhc2VTY2FsZS9lfSxzZXRTaXplOmZ1bmN0aW9uKCl7dGhpcy53aWR0aD10aGlzLmNvbnRhaW5lci53aWR0aCgpLHRoaXMuaGVpZ2h0PXRoaXMuY29udGFpbmVyLmhlaWdodCgpLHRoaXMucmVzaXplKCksdGhpcy5jYW52YXMuc2V0U2l6ZSh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLmFwcGx5VHJhbnNmb3JtKCl9LHJlc2V0OmZ1bmN0aW9uKCl7dmFyIGUsdDtmb3IoZSBpbiB0aGlzLnNlcmllcylmb3IodD0wO3Q8dGhpcy5zZXJpZXNbZV0ubGVuZ3RoO3QrKyl0aGlzLnNlcmllc1tlXVt0XS5jbGVhcigpO3RoaXMuc2NhbGU9dGhpcy5iYXNlU2NhbGUsdGhpcy50cmFuc1g9dGhpcy5iYXNlVHJhbnNYLHRoaXMudHJhbnNZPXRoaXMuYmFzZVRyYW5zWSx0aGlzLmFwcGx5VHJhbnNmb3JtKCl9LGFwcGx5VHJhbnNmb3JtOmZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7dGhpcy5kZWZhdWx0V2lkdGgqdGhpcy5zY2FsZTw9dGhpcy53aWR0aD8oZT0odGhpcy53aWR0aC10aGlzLmRlZmF1bHRXaWR0aCp0aGlzLnNjYWxlKS8oMip0aGlzLnNjYWxlKSxuPSh0aGlzLndpZHRoLXRoaXMuZGVmYXVsdFdpZHRoKnRoaXMuc2NhbGUpLygyKnRoaXMuc2NhbGUpKTooZT0wLG49KHRoaXMud2lkdGgtdGhpcy5kZWZhdWx0V2lkdGgqdGhpcy5zY2FsZSkvdGhpcy5zY2FsZSksdGhpcy5kZWZhdWx0SGVpZ2h0KnRoaXMuc2NhbGU8PXRoaXMuaGVpZ2h0Pyh0PSh0aGlzLmhlaWdodC10aGlzLmRlZmF1bHRIZWlnaHQqdGhpcy5zY2FsZSkvKDIqdGhpcy5zY2FsZSkscj0odGhpcy5oZWlnaHQtdGhpcy5kZWZhdWx0SGVpZ2h0KnRoaXMuc2NhbGUpLygyKnRoaXMuc2NhbGUpKToodD0wLHI9KHRoaXMuaGVpZ2h0LXRoaXMuZGVmYXVsdEhlaWdodCp0aGlzLnNjYWxlKS90aGlzLnNjYWxlKSx0aGlzLnRyYW5zWT50P3RoaXMudHJhbnNZPXQ6dGhpcy50cmFuc1k8ciYmKHRoaXMudHJhbnNZPXIpLHRoaXMudHJhbnNYPmU/dGhpcy50cmFuc1g9ZTp0aGlzLnRyYW5zWDxuJiYodGhpcy50cmFuc1g9biksdGhpcy5jYW52YXMuYXBwbHlUcmFuc2Zvcm1QYXJhbXModGhpcy5zY2FsZSx0aGlzLnRyYW5zWCx0aGlzLnRyYW5zWSksdGhpcy5tYXJrZXJzJiZ0aGlzLnJlcG9zaXRpb25NYXJrZXJzKCksdGhpcy5jb250YWluZXIudHJpZ2dlcihcInZpZXdwb3J0Q2hhbmdlXCIsW3RoaXMuc2NhbGUvdGhpcy5iYXNlU2NhbGUsdGhpcy50cmFuc1gsdGhpcy50cmFuc1ldKX0sYmluZENvbnRhaW5lckV2ZW50czpmdW5jdGlvbigpe3ZhciBlPSExLHQsbixyPXRoaXM7dGhpcy5jb250YWluZXIubW91c2Vtb3ZlKGZ1bmN0aW9uKGkpe3JldHVybiBlJiYoci50cmFuc1gtPSh0LWkucGFnZVgpL3Iuc2NhbGUsci50cmFuc1ktPShuLWkucGFnZVkpL3Iuc2NhbGUsci5hcHBseVRyYW5zZm9ybSgpLHQ9aS5wYWdlWCxuPWkucGFnZVkpLCExfSkubW91c2Vkb3duKGZ1bmN0aW9uKHIpe3JldHVybiBlPSEwLHQ9ci5wYWdlWCxuPXIucGFnZVksITF9KSxqdm0uJChcImJvZHlcIikubW91c2V1cChmdW5jdGlvbigpe2U9ITF9KSx0aGlzLnBhcmFtcy56b29tT25TY3JvbGwmJnRoaXMuY29udGFpbmVyLm1vdXNld2hlZWwoZnVuY3Rpb24oZSx0LG4saSl7dmFyIHM9anZtLiQoci5jb250YWluZXIpLm9mZnNldCgpLG89ZS5wYWdlWC1zLmxlZnQsdT1lLnBhZ2VZLXMudG9wLGE9TWF0aC5wb3coMS4zLGkpO3IubGFiZWwuaGlkZSgpLHIuc2V0U2NhbGUoci5zY2FsZSphLG8sdSksZS5wcmV2ZW50RGVmYXVsdCgpfSl9LGJpbmRDb250YWluZXJUb3VjaEV2ZW50czpmdW5jdGlvbigpe3ZhciBlLHQsbj10aGlzLHIsaSxzLG8sdSxhPWZ1bmN0aW9uKGEpe3ZhciBmPWEub3JpZ2luYWxFdmVudC50b3VjaGVzLGwsYyxoLHA7YS50eXBlPT1cInRvdWNoc3RhcnRcIiYmKHU9MCksZi5sZW5ndGg9PTE/KHU9PTEmJihoPW4udHJhbnNYLHA9bi50cmFuc1ksbi50cmFuc1gtPShyLWZbMF0ucGFnZVgpL24uc2NhbGUsbi50cmFuc1ktPShpLWZbMF0ucGFnZVkpL24uc2NhbGUsbi5hcHBseVRyYW5zZm9ybSgpLG4ubGFiZWwuaGlkZSgpLChoIT1uLnRyYW5zWHx8cCE9bi50cmFuc1kpJiZhLnByZXZlbnREZWZhdWx0KCkpLHI9ZlswXS5wYWdlWCxpPWZbMF0ucGFnZVkpOmYubGVuZ3RoPT0yJiYodT09Mj8oYz1NYXRoLnNxcnQoTWF0aC5wb3coZlswXS5wYWdlWC1mWzFdLnBhZ2VYLDIpK01hdGgucG93KGZbMF0ucGFnZVktZlsxXS5wYWdlWSwyKSkvdCxuLnNldFNjYWxlKGUqYyxzLG8pLG4ubGFiZWwuaGlkZSgpLGEucHJldmVudERlZmF1bHQoKSk6KGw9anZtLiQobi5jb250YWluZXIpLm9mZnNldCgpLGZbMF0ucGFnZVg+ZlsxXS5wYWdlWD9zPWZbMV0ucGFnZVgrKGZbMF0ucGFnZVgtZlsxXS5wYWdlWCkvMjpzPWZbMF0ucGFnZVgrKGZbMV0ucGFnZVgtZlswXS5wYWdlWCkvMixmWzBdLnBhZ2VZPmZbMV0ucGFnZVk/bz1mWzFdLnBhZ2VZKyhmWzBdLnBhZ2VZLWZbMV0ucGFnZVkpLzI6bz1mWzBdLnBhZ2VZKyhmWzFdLnBhZ2VZLWZbMF0ucGFnZVkpLzIscy09bC5sZWZ0LG8tPWwudG9wLGU9bi5zY2FsZSx0PU1hdGguc3FydChNYXRoLnBvdyhmWzBdLnBhZ2VYLWZbMV0ucGFnZVgsMikrTWF0aC5wb3coZlswXS5wYWdlWS1mWzFdLnBhZ2VZLDIpKSkpLHU9Zi5sZW5ndGh9O2p2bS4kKHRoaXMuY29udGFpbmVyKS5iaW5kKFwidG91Y2hzdGFydFwiLGEpLGp2bS4kKHRoaXMuY29udGFpbmVyKS5iaW5kKFwidG91Y2htb3ZlXCIsYSl9LGJpbmRFbGVtZW50RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0O3RoaXMuY29udGFpbmVyLm1vdXNlbW92ZShmdW5jdGlvbigpe3Q9ITB9KSx0aGlzLmNvbnRhaW5lci5kZWxlZ2F0ZShcIltjbGFzc349J2p2ZWN0b3JtYXAtZWxlbWVudCddXCIsXCJtb3VzZW92ZXIgbW91c2VvdXRcIixmdW5jdGlvbih0KXt2YXIgbj10aGlzLHI9anZtLiQodGhpcykuYXR0cihcImNsYXNzXCIpLmJhc2VWYWw/anZtLiQodGhpcykuYXR0cihcImNsYXNzXCIpLmJhc2VWYWw6anZtLiQodGhpcykuYXR0cihcImNsYXNzXCIpLGk9ci5pbmRleE9mKFwianZlY3Rvcm1hcC1yZWdpb25cIik9PT0tMT9cIm1hcmtlclwiOlwicmVnaW9uXCIscz1pPT1cInJlZ2lvblwiP2p2bS4kKHRoaXMpLmF0dHIoXCJkYXRhLWNvZGVcIik6anZtLiQodGhpcykuYXR0cihcImRhdGEtaW5kZXhcIiksbz1pPT1cInJlZ2lvblwiP2UucmVnaW9uc1tzXS5lbGVtZW50OmUubWFya2Vyc1tzXS5lbGVtZW50LHU9aT09XCJyZWdpb25cIj9lLm1hcERhdGEucGF0aHNbc10ubmFtZTplLm1hcmtlcnNbc10uY29uZmlnLm5hbWV8fFwiXCIsYT1qdm0uJC5FdmVudChpK1wiTGFiZWxTaG93Lmp2ZWN0b3JtYXBcIiksZj1qdm0uJC5FdmVudChpK1wiT3Zlci5qdmVjdG9ybWFwXCIpO3QudHlwZT09XCJtb3VzZW92ZXJcIj8oZS5jb250YWluZXIudHJpZ2dlcihmLFtzXSksZi5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8by5zZXRIb3ZlcmVkKCEwKSxlLmxhYmVsLnRleHQodSksZS5jb250YWluZXIudHJpZ2dlcihhLFtlLmxhYmVsLHNdKSxhLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwoZS5sYWJlbC5zaG93KCksZS5sYWJlbFdpZHRoPWUubGFiZWwud2lkdGgoKSxlLmxhYmVsSGVpZ2h0PWUubGFiZWwuaGVpZ2h0KCkpKTooby5zZXRIb3ZlcmVkKCExKSxlLmxhYmVsLmhpZGUoKSxlLmNvbnRhaW5lci50cmlnZ2VyKGkrXCJPdXQuanZlY3Rvcm1hcFwiLFtzXSkpfSksdGhpcy5jb250YWluZXIuZGVsZWdhdGUoXCJbY2xhc3N+PSdqdmVjdG9ybWFwLWVsZW1lbnQnXVwiLFwibW91c2Vkb3duXCIsZnVuY3Rpb24oZSl7dD0hMX0pLHRoaXMuY29udGFpbmVyLmRlbGVnYXRlKFwiW2NsYXNzfj0nanZlY3Rvcm1hcC1lbGVtZW50J11cIixcIm1vdXNldXBcIixmdW5jdGlvbihuKXt2YXIgcj10aGlzLGk9anZtLiQodGhpcykuYXR0cihcImNsYXNzXCIpLmJhc2VWYWw/anZtLiQodGhpcykuYXR0cihcImNsYXNzXCIpLmJhc2VWYWw6anZtLiQodGhpcykuYXR0cihcImNsYXNzXCIpLHM9aS5pbmRleE9mKFwianZlY3Rvcm1hcC1yZWdpb25cIik9PT0tMT9cIm1hcmtlclwiOlwicmVnaW9uXCIsbz1zPT1cInJlZ2lvblwiP2p2bS4kKHRoaXMpLmF0dHIoXCJkYXRhLWNvZGVcIik6anZtLiQodGhpcykuYXR0cihcImRhdGEtaW5kZXhcIiksdT1qdm0uJC5FdmVudChzK1wiQ2xpY2suanZlY3Rvcm1hcFwiKSxhPXM9PVwicmVnaW9uXCI/ZS5yZWdpb25zW29dLmVsZW1lbnQ6ZS5tYXJrZXJzW29dLmVsZW1lbnQ7aWYoIXQpe2UuY29udGFpbmVyLnRyaWdnZXIodSxbb10pO2lmKHM9PT1cInJlZ2lvblwiJiZlLnBhcmFtcy5yZWdpb25zU2VsZWN0YWJsZXx8cz09PVwibWFya2VyXCImJmUucGFyYW1zLm1hcmtlcnNTZWxlY3RhYmxlKXUuaXNEZWZhdWx0UHJldmVudGVkKCl8fChlLnBhcmFtc1tzK1wic1NlbGVjdGFibGVPbmVcIl0mJmUuY2xlYXJTZWxlY3RlZChzK1wic1wiKSxhLnNldFNlbGVjdGVkKCFhLmlzU2VsZWN0ZWQpKX19KX0sYmluZFpvb21CdXR0b25zOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztqdm0uJChcIjxkaXYvPlwiKS5hZGRDbGFzcyhcImp2ZWN0b3JtYXAtem9vbWluXCIpLnRleHQoXCIrXCIpLmFwcGVuZFRvKHRoaXMuY29udGFpbmVyKSxqdm0uJChcIjxkaXYvPlwiKS5hZGRDbGFzcyhcImp2ZWN0b3JtYXAtem9vbW91dFwiKS5odG1sKFwiJiN4MjIxMjtcIikuYXBwZW5kVG8odGhpcy5jb250YWluZXIpLHRoaXMuY29udGFpbmVyLmZpbmQoXCIuanZlY3Rvcm1hcC16b29taW5cIikuY2xpY2soZnVuY3Rpb24oKXtlLnNldFNjYWxlKGUuc2NhbGUqZS5wYXJhbXMuem9vbVN0ZXAsZS53aWR0aC8yLGUuaGVpZ2h0LzIpfSksdGhpcy5jb250YWluZXIuZmluZChcIi5qdmVjdG9ybWFwLXpvb21vdXRcIikuY2xpY2soZnVuY3Rpb24oKXtlLnNldFNjYWxlKGUuc2NhbGUvZS5wYXJhbXMuem9vbVN0ZXAsZS53aWR0aC8yLGUuaGVpZ2h0LzIpfSl9LGNyZWF0ZUxhYmVsOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmxhYmVsPWp2bS4kKFwiPGRpdi8+XCIpLmFkZENsYXNzKFwianZlY3Rvcm1hcC1sYWJlbFwiKS5hcHBlbmRUbyhqdm0uJChcImJvZHlcIikpLHRoaXMuY29udGFpbmVyLm1vdXNlbW92ZShmdW5jdGlvbih0KXt2YXIgbj10LnBhZ2VYLTE1LWUubGFiZWxXaWR0aCxyPXQucGFnZVktMTUtZS5sYWJlbEhlaWdodDtuPDUmJihuPXQucGFnZVgrMTUpLHI8NSYmKHI9dC5wYWdlWSsxNSksZS5sYWJlbC5pcyhcIjp2aXNpYmxlXCIpJiZlLmxhYmVsLmNzcyh7bGVmdDpuLHRvcDpyfSl9KX0sc2V0U2NhbGU6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGkscz1qdm0uJC5FdmVudChcInpvb20uanZlY3Rvcm1hcFwiKTtlPnRoaXMucGFyYW1zLnpvb21NYXgqdGhpcy5iYXNlU2NhbGU/ZT10aGlzLnBhcmFtcy56b29tTWF4KnRoaXMuYmFzZVNjYWxlOmU8dGhpcy5wYXJhbXMuem9vbU1pbip0aGlzLmJhc2VTY2FsZSYmKGU9dGhpcy5wYXJhbXMuem9vbU1pbip0aGlzLmJhc2VTY2FsZSksdHlwZW9mIHQhPVwidW5kZWZpbmVkXCImJnR5cGVvZiBuIT1cInVuZGVmaW5lZFwiJiYoaT1lL3RoaXMuc2NhbGUscj8odGhpcy50cmFuc1g9dCt0aGlzLmRlZmF1bHRXaWR0aCoodGhpcy53aWR0aC8odGhpcy5kZWZhdWx0V2lkdGgqZSkpLzIsdGhpcy50cmFuc1k9bit0aGlzLmRlZmF1bHRIZWlnaHQqKHRoaXMuaGVpZ2h0Lyh0aGlzLmRlZmF1bHRIZWlnaHQqZSkpLzIpOih0aGlzLnRyYW5zWC09KGktMSkvZSp0LHRoaXMudHJhbnNZLT0oaS0xKS9lKm4pKSx0aGlzLnNjYWxlPWUsdGhpcy5hcHBseVRyYW5zZm9ybSgpLHRoaXMuY29udGFpbmVyLnRyaWdnZXIocyxbZS90aGlzLmJhc2VTY2FsZV0pfSxzZXRGb2N1czpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxzLG8sdTtpZihqdm0uJC5pc0FycmF5KGUpfHx0aGlzLnJlZ2lvbnNbZV0pe2p2bS4kLmlzQXJyYXkoZSk/bz1lOm89W2VdO2Zvcih1PTA7dTxvLmxlbmd0aDt1KyspdGhpcy5yZWdpb25zW29bdV1dJiYoaT10aGlzLnJlZ2lvbnNbb1t1XV0uZWxlbWVudC5nZXRCQm94KCksaSYmKHR5cGVvZiByPT1cInVuZGVmaW5lZFwiP3I9aToocz17eDpNYXRoLm1pbihyLngsaS54KSx5Ok1hdGgubWluKHIueSxpLnkpLHdpZHRoOk1hdGgubWF4KHIueCtyLndpZHRoLGkueCtpLndpZHRoKS1NYXRoLm1pbihyLngsaS54KSxoZWlnaHQ6TWF0aC5tYXgoci55K3IuaGVpZ2h0LGkueStpLmhlaWdodCktTWF0aC5taW4oci55LGkueSl9LHI9cykpKTt0aGlzLnNldFNjYWxlKE1hdGgubWluKHRoaXMud2lkdGgvci53aWR0aCx0aGlzLmhlaWdodC9yLmhlaWdodCksLShyLngrci53aWR0aC8yKSwtKHIueStyLmhlaWdodC8yKSwhMCl9ZWxzZSBlKj10aGlzLmJhc2VTY2FsZSx0aGlzLnNldFNjYWxlKGUsLXQqdGhpcy5kZWZhdWx0V2lkdGgsLW4qdGhpcy5kZWZhdWx0SGVpZ2h0LCEwKX0sZ2V0U2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXTtmb3IodCBpbiB0aGlzW2VdKXRoaXNbZV1bdF0uZWxlbWVudC5pc1NlbGVjdGVkJiZuLnB1c2godCk7cmV0dXJuIG59LGdldFNlbGVjdGVkUmVnaW9uczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFNlbGVjdGVkKFwicmVnaW9uc1wiKX0sZ2V0U2VsZWN0ZWRNYXJrZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWQoXCJtYXJrZXJzXCIpfSxzZXRTZWxlY3RlZDpmdW5jdGlvbihlLHQpe3ZhciBuO3R5cGVvZiB0IT1cIm9iamVjdFwiJiYodD1bdF0pO2lmKGp2bS4kLmlzQXJyYXkodCkpZm9yKG49MDtuPHQubGVuZ3RoO24rKyl0aGlzW2VdW3Rbbl1dLmVsZW1lbnQuc2V0U2VsZWN0ZWQoITApO2Vsc2UgZm9yKG4gaW4gdCl0aGlzW2VdW25dLmVsZW1lbnQuc2V0U2VsZWN0ZWQoISF0W25dKX0sc2V0U2VsZWN0ZWRSZWdpb25zOmZ1bmN0aW9uKGUpe3RoaXMuc2V0U2VsZWN0ZWQoXCJyZWdpb25zXCIsZSl9LHNldFNlbGVjdGVkTWFya2VyczpmdW5jdGlvbihlKXt0aGlzLnNldFNlbGVjdGVkKFwibWFya2Vyc1wiLGUpfSxjbGVhclNlbGVjdGVkOmZ1bmN0aW9uKGUpe3ZhciB0PXt9LG49dGhpcy5nZXRTZWxlY3RlZChlKSxyO2ZvcihyPTA7cjxuLmxlbmd0aDtyKyspdFtuW3JdXT0hMTt0aGlzLnNldFNlbGVjdGVkKGUsdCl9LGNsZWFyU2VsZWN0ZWRSZWdpb25zOmZ1bmN0aW9uKCl7dGhpcy5jbGVhclNlbGVjdGVkKFwicmVnaW9uc1wiKX0sY2xlYXJTZWxlY3RlZE1hcmtlcnM6ZnVuY3Rpb24oKXt0aGlzLmNsZWFyU2VsZWN0ZWQoXCJtYXJrZXJzXCIpfSxnZXRNYXBPYmplY3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZ2V0UmVnaW9uTmFtZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5tYXBEYXRhLnBhdGhzW2VdLm5hbWV9LGNyZWF0ZVJlZ2lvbnM6ZnVuY3Rpb24oKXt2YXIgZSx0LG49dGhpcztmb3IoZSBpbiB0aGlzLm1hcERhdGEucGF0aHMpdD10aGlzLmNhbnZhcy5hZGRQYXRoKHtkOnRoaXMubWFwRGF0YS5wYXRoc1tlXS5wYXRoLFwiZGF0YS1jb2RlXCI6ZX0sanZtLiQuZXh0ZW5kKCEwLHt9LHRoaXMucGFyYW1zLnJlZ2lvblN0eWxlKSksanZtLiQodC5ub2RlKS5iaW5kKFwic2VsZWN0ZWRcIixmdW5jdGlvbihlLHQpe24uY29udGFpbmVyLnRyaWdnZXIoXCJyZWdpb25TZWxlY3RlZC5qdmVjdG9ybWFwXCIsW2p2bS4kKHRoaXMpLmF0dHIoXCJkYXRhLWNvZGVcIiksdCxuLmdldFNlbGVjdGVkUmVnaW9ucygpXSl9KSx0LmFkZENsYXNzKFwianZlY3Rvcm1hcC1yZWdpb24ganZlY3Rvcm1hcC1lbGVtZW50XCIpLHRoaXMucmVnaW9uc1tlXT17ZWxlbWVudDp0LGNvbmZpZzp0aGlzLm1hcERhdGEucGF0aHNbZV19fSxjcmVhdGVNYXJrZXJzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLHMsbz10aGlzO3RoaXMubWFya2Vyc0dyb3VwPXRoaXMubWFya2Vyc0dyb3VwfHx0aGlzLmNhbnZhcy5hZGRHcm91cCgpO2lmKGp2bS4kLmlzQXJyYXkoZSkpe3M9ZS5zbGljZSgpLGU9e307Zm9yKHQ9MDt0PHMubGVuZ3RoO3QrKyllW3RdPXNbdF19Zm9yKHQgaW4gZSlpPWVbdF1pbnN0YW5jZW9mIEFycmF5P3tsYXRMbmc6ZVt0XX06ZVt0XSxyPXRoaXMuZ2V0TWFya2VyUG9zaXRpb24oaSksciE9PSExJiYobj10aGlzLmNhbnZhcy5hZGRDaXJjbGUoe1wiZGF0YS1pbmRleFwiOnQsY3g6ci54LGN5OnIueX0sanZtLiQuZXh0ZW5kKCEwLHt9LHRoaXMucGFyYW1zLm1hcmtlclN0eWxlLHtpbml0aWFsOmkuc3R5bGV8fHt9fSksdGhpcy5tYXJrZXJzR3JvdXApLG4uYWRkQ2xhc3MoXCJqdmVjdG9ybWFwLW1hcmtlciBqdmVjdG9ybWFwLWVsZW1lbnRcIiksanZtLiQobi5ub2RlKS5iaW5kKFwic2VsZWN0ZWRcIixmdW5jdGlvbihlLHQpe28uY29udGFpbmVyLnRyaWdnZXIoXCJtYXJrZXJTZWxlY3RlZC5qdmVjdG9ybWFwXCIsW2p2bS4kKHRoaXMpLmF0dHIoXCJkYXRhLWluZGV4XCIpLHQsby5nZXRTZWxlY3RlZE1hcmtlcnMoKV0pfSksdGhpcy5tYXJrZXJzW3RdJiZ0aGlzLnJlbW92ZU1hcmtlcnMoW3RdKSx0aGlzLm1hcmtlcnNbdF09e2VsZW1lbnQ6bixjb25maWc6aX0pfSxyZXBvc2l0aW9uTWFya2VyczpmdW5jdGlvbigpe3ZhciBlLHQ7Zm9yKGUgaW4gdGhpcy5tYXJrZXJzKXQ9dGhpcy5nZXRNYXJrZXJQb3NpdGlvbih0aGlzLm1hcmtlcnNbZV0uY29uZmlnKSx0IT09ITEmJnRoaXMubWFya2Vyc1tlXS5lbGVtZW50LnNldFN0eWxlKHtjeDp0LngsY3k6dC55fSl9LGdldE1hcmtlclBvc2l0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiBqdm0uV29ybGRNYXAubWFwc1t0aGlzLnBhcmFtcy5tYXBdLnByb2plY3Rpb24/dGhpcy5sYXRMbmdUb1BvaW50LmFwcGx5KHRoaXMsZS5sYXRMbmd8fFswLDBdKTp7eDplLmNvb3Jkc1swXSp0aGlzLnNjYWxlK3RoaXMudHJhbnNYKnRoaXMuc2NhbGUseTplLmNvb3Jkc1sxXSp0aGlzLnNjYWxlK3RoaXMudHJhbnNZKnRoaXMuc2NhbGV9fSxhZGRNYXJrZXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9LGk9W10scyxvLG49bnx8W107cltlXT10O2ZvcihvPTA7bzxuLmxlbmd0aDtvKyspcz17fSxzW2VdPW5bb10saS5wdXNoKHMpO3RoaXMuYWRkTWFya2VycyhyLGkpfSxhZGRNYXJrZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIG47dD10fHxbXSx0aGlzLmNyZWF0ZU1hcmtlcnMoZSk7Zm9yKG49MDtuPHQubGVuZ3RoO24rKyl0aGlzLnNlcmllcy5tYXJrZXJzW25dLnNldFZhbHVlcyh0W25dfHx7fSl9LHJlbW92ZU1hcmtlcnM6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQ9MDt0PGUubGVuZ3RoO3QrKyl0aGlzLm1hcmtlcnNbZVt0XV0uZWxlbWVudC5yZW1vdmUoKSxkZWxldGUgdGhpcy5tYXJrZXJzW2VbdF1dfSxyZW1vdmVBbGxNYXJrZXJzOmZ1bmN0aW9uKCl7dmFyIGUsdD1bXTtmb3IoZSBpbiB0aGlzLm1hcmtlcnMpdC5wdXNoKGUpO3RoaXMucmVtb3ZlTWFya2Vycyh0KX0sbGF0TG5nVG9Qb2ludDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9anZtLldvcmxkTWFwLm1hcHNbdGhpcy5wYXJhbXMubWFwXS5wcm9qZWN0aW9uLGk9ci5jZW50cmFsTWVyaWRpYW4scz10aGlzLndpZHRoLXRoaXMuYmFzZVRyYW5zWCoyKnRoaXMuYmFzZVNjYWxlLG89dGhpcy5oZWlnaHQtdGhpcy5iYXNlVHJhbnNZKjIqdGhpcy5iYXNlU2NhbGUsdSxhLGY9dGhpcy5zY2FsZS90aGlzLmJhc2VTY2FsZTtyZXR1cm4gdDwtMTgwK2kmJih0Kz0zNjApLG49anZtLlByb2pbci50eXBlXShlLHQsaSksdT10aGlzLmdldEluc2V0Rm9yUG9pbnQobi54LG4ueSksdT8oYT11LmJib3gsbi54PShuLngtYVswXS54KS8oYVsxXS54LWFbMF0ueCkqdS53aWR0aCp0aGlzLnNjYWxlLG4ueT0obi55LWFbMF0ueSkvKGFbMV0ueS1hWzBdLnkpKnUuaGVpZ2h0KnRoaXMuc2NhbGUse3g6bi54K3RoaXMudHJhbnNYKnRoaXMuc2NhbGUrdS5sZWZ0KnRoaXMuc2NhbGUseTpuLnkrdGhpcy50cmFuc1kqdGhpcy5zY2FsZSt1LnRvcCp0aGlzLnNjYWxlfSk6ITF9LHBvaW50VG9MYXRMbmc6ZnVuY3Rpb24oZSx0KXt2YXIgbj1qdm0uV29ybGRNYXAubWFwc1t0aGlzLnBhcmFtcy5tYXBdLnByb2plY3Rpb24scj1uLmNlbnRyYWxNZXJpZGlhbixpPWp2bS5Xb3JsZE1hcC5tYXBzW3RoaXMucGFyYW1zLm1hcF0uaW5zZXRzLHMsbyx1LGEsZjtmb3Iocz0wO3M8aS5sZW5ndGg7cysrKXtvPWlbc10sdT1vLmJib3gsYT1lLSh0aGlzLnRyYW5zWCp0aGlzLnNjYWxlK28ubGVmdCp0aGlzLnNjYWxlKSxmPXQtKHRoaXMudHJhbnNZKnRoaXMuc2NhbGUrby50b3AqdGhpcy5zY2FsZSksYT1hLyhvLndpZHRoKnRoaXMuc2NhbGUpKih1WzFdLngtdVswXS54KSt1WzBdLngsZj1mLyhvLmhlaWdodCp0aGlzLnNjYWxlKSoodVsxXS55LXVbMF0ueSkrdVswXS55O2lmKGE+dVswXS54JiZhPHVbMV0ueCYmZj51WzBdLnkmJmY8dVsxXS55KXJldHVybiBqdm0uUHJvaltuLnR5cGUrXCJfaW52XCJdKGEsLWYscil9cmV0dXJuITF9LGdldEluc2V0Rm9yUG9pbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1qdm0uV29ybGRNYXAubWFwc1t0aGlzLnBhcmFtcy5tYXBdLmluc2V0cyxyLGk7Zm9yKHI9MDtyPG4ubGVuZ3RoO3IrKyl7aT1uW3JdLmJib3g7aWYoZT5pWzBdLngmJmU8aVsxXS54JiZ0PmlbMF0ueSYmdDxpWzFdLnkpcmV0dXJuIG5bcl19fSxjcmVhdGVTZXJpZXM6ZnVuY3Rpb24oKXt2YXIgZSx0O3RoaXMuc2VyaWVzPXttYXJrZXJzOltdLHJlZ2lvbnM6W119O2Zvcih0IGluIHRoaXMucGFyYW1zLnNlcmllcylmb3IoZT0wO2U8dGhpcy5wYXJhbXMuc2VyaWVzW3RdLmxlbmd0aDtlKyspdGhpcy5zZXJpZXNbdF1bZV09bmV3IGp2bS5EYXRhU2VyaWVzKHRoaXMucGFyYW1zLnNlcmllc1t0XVtlXSx0aGlzW3RdKX0scmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5sYWJlbC5yZW1vdmUoKSx0aGlzLmNvbnRhaW5lci5yZW1vdmUoKSxqdm0uJCh3aW5kb3cpLnVuYmluZChcInJlc2l6ZVwiLHRoaXMub25SZXNpemUpfX0sanZtLldvcmxkTWFwLm1hcHM9e30sanZtLldvcmxkTWFwLmRlZmF1bHRQYXJhbXM9e21hcDpcIndvcmxkX21pbGxfZW5cIixiYWNrZ3JvdW5kQ29sb3I6XCIjNTA1MDUwXCIsem9vbUJ1dHRvbnM6ITAsem9vbU9uU2Nyb2xsOiEwLHpvb21NYXg6OCx6b29tTWluOjEsem9vbVN0ZXA6MS42LHJlZ2lvbnNTZWxlY3RhYmxlOiExLG1hcmtlcnNTZWxlY3RhYmxlOiExLGJpbmRUb3VjaEV2ZW50czohMCxyZWdpb25TdHlsZTp7aW5pdGlhbDp7ZmlsbDpcIndoaXRlXCIsXCJmaWxsLW9wYWNpdHlcIjoxLHN0cm9rZTpcIm5vbmVcIixcInN0cm9rZS13aWR0aFwiOjAsXCJzdHJva2Utb3BhY2l0eVwiOjF9LGhvdmVyOntcImZpbGwtb3BhY2l0eVwiOi44fSxzZWxlY3RlZDp7ZmlsbDpcInllbGxvd1wifSxzZWxlY3RlZEhvdmVyXG46e319LG1hcmtlclN0eWxlOntpbml0aWFsOntmaWxsOlwiZ3JleVwiLHN0cm9rZTpcIiM1MDUwNTBcIixcImZpbGwtb3BhY2l0eVwiOjEsXCJzdHJva2Utd2lkdGhcIjoxLFwic3Ryb2tlLW9wYWNpdHlcIjoxLHI6NX0saG92ZXI6e3N0cm9rZTpcImJsYWNrXCIsXCJzdHJva2Utd2lkdGhcIjoyfSxzZWxlY3RlZDp7ZmlsbDpcImJsdWVcIn0sc2VsZWN0ZWRIb3Zlcjp7fX19LGp2bS5Xb3JsZE1hcC5hcGlFdmVudHM9e29uUmVnaW9uTGFiZWxTaG93OlwicmVnaW9uTGFiZWxTaG93XCIsb25SZWdpb25PdmVyOlwicmVnaW9uT3ZlclwiLG9uUmVnaW9uT3V0OlwicmVnaW9uT3V0XCIsb25SZWdpb25DbGljazpcInJlZ2lvbkNsaWNrXCIsb25SZWdpb25TZWxlY3RlZDpcInJlZ2lvblNlbGVjdGVkXCIsb25NYXJrZXJMYWJlbFNob3c6XCJtYXJrZXJMYWJlbFNob3dcIixvbk1hcmtlck92ZXI6XCJtYXJrZXJPdmVyXCIsb25NYXJrZXJPdXQ6XCJtYXJrZXJPdXRcIixvbk1hcmtlckNsaWNrOlwibWFya2VyQ2xpY2tcIixvbk1hcmtlclNlbGVjdGVkOlwibWFya2VyU2VsZWN0ZWRcIixvblZpZXdwb3J0Q2hhbmdlOlwidmlld3BvcnRDaGFuZ2VcIn07XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vdmVuZG9yL2FsbWFzYWVlZDIwMTAvYWRtaW5sdGUvcGx1Z2lucy9qdmVjdG9ybWFwL2pxdWVyeS1qdmVjdG9ybWFwLTEuMi4yLm1pbi5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///54\n");
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports) {
+
+eval("$.fn.vectorMap('addMap', 'world_mill_en', { \"insets\": [{ \"width\": 900.0, \"top\": 0, \"height\": 440.7063107441331, \"bbox\": [{ \"y\": -12671671.123330014, \"x\": -20004297.151525836 }, { \"y\": 6930392.02513512, \"x\": 20026572.394749384 }], \"left\": 0 }], \"paths\": { \"BD\": { \"path\": \"M652.71,228.85l-0.04,1.38l-0.46,-0.21l-0.42,0.3l0.05,0.65l-0.17,-1.37l-0.48,-1.26l-1.08,-1.6l-0.23,-0.13l-2.31,-0.11l-0.31,0.36l0.21,0.98l-0.6,1.11l-0.8,-0.4l-0.37,0.09l-0.23,0.3l-0.54,-0.21l-0.78,-0.19l-0.38,-2.04l-0.83,-1.89l0.4,-1.5l-0.16,-0.35l-1.24,-0.57l0.36,-0.62l1.5,-0.95l0.02,-0.49l-1.62,-1.26l0.64,-1.31l1.7,1.0l0.12,0.04l0.96,0.11l0.19,1.62l0.25,0.26l2.38,0.37l2.32,-0.04l1.06,0.33l-0.92,1.79l-0.97,0.13l-0.23,0.16l-0.77,1.51l0.05,0.35l1.37,1.37l0.5,-0.14l0.35,-1.46l0.24,-0.0l1.24,3.92Z\", \"name\": \"Bangladesh\" }, \"BE\": { \"path\": \"M429.28,143.95l1.76,0.25l0.13,-0.01l2.16,-0.64l1.46,1.34l1.26,0.71l-0.23,1.8l-0.44,0.08l-0.24,0.25l-0.2,1.36l-1.8,-1.22l-0.23,-0.05l-1.14,0.23l-1.62,-1.43l-1.15,-1.31l-0.21,-0.1l-0.95,-0.04l-0.21,-0.68l1.66,-0.54Z\", \"name\": \"Belgium\" }, \"BF\": { \"path\": \"M413.48,260.21l-1.22,-0.46l-0.13,-0.02l-1.17,0.1l-0.15,0.06l-0.73,0.53l-0.87,-0.41l-0.39,-0.75l-0.13,-0.13l-0.98,-0.48l-0.14,-1.2l0.63,-0.99l0.05,-0.18l-0.05,-0.73l1.9,-2.01l0.08,-0.14l0.35,-1.65l0.49,-0.44l1.05,0.3l0.21,-0.02l1.05,-0.52l0.13,-0.13l0.3,-0.58l1.87,-1.1l0.11,-0.1l0.43,-0.72l2.23,-1.01l1.21,-0.32l0.51,0.4l0.19,0.06l1.25,-0.01l-0.14,0.89l0.01,0.13l0.34,1.16l0.06,0.11l1.35,1.59l0.07,1.13l0.24,0.28l2.64,0.53l-0.05,1.39l-0.42,0.59l-1.11,0.21l-0.22,0.17l-0.46,0.99l-0.69,0.23l-2.12,-0.05l-1.14,-0.2l-0.19,0.03l-0.72,0.36l-1.07,-0.17l-4.35,0.12l-0.29,0.29l-0.06,1.44l0.25,1.45Z\", \"name\": \"Burkina Faso\" }, \"BG\": { \"path\": \"M477.63,166.84l0.51,0.9l0.33,0.14l0.9,-0.21l1.91,0.47l3.68,0.16l0.17,-0.05l1.2,-0.75l2.78,-0.67l1.72,1.05l1.02,0.24l-0.97,0.97l-0.91,2.17l0.0,0.24l0.56,1.19l-1.58,-0.3l-0.16,0.01l-2.55,0.95l-0.2,0.28l-0.02,1.23l-1.92,0.24l-1.68,-0.99l-0.27,-0.02l-1.94,0.8l-1.52,-0.07l-0.15,-1.72l-0.12,-0.21l-0.99,-0.76l0.18,-0.18l0.02,-0.39l-0.17,-0.22l0.33,-0.75l0.91,-0.91l0.01,-0.42l-1.16,-1.25l-0.18,-0.89l0.24,-0.27Z\", \"name\": \"Bulgaria\" }, \"BA\": { \"path\": \"M468.39,164.66l0.16,0.04l0.43,-0.0l-0.43,0.93l0.06,0.34l1.08,1.06l-0.28,1.09l-0.5,0.13l-0.47,0.28l-0.86,0.74l-0.1,0.16l-0.28,1.29l-1.81,-0.94l-0.9,-1.22l-1.0,-0.73l-1.1,-1.1l-0.55,-0.96l-1.11,-1.3l0.3,-0.75l0.59,0.46l0.42,-0.04l0.46,-0.54l1.0,-0.06l2.11,0.5l1.72,-0.03l1.06,0.64Z\", \"name\": \"Bosnia and Herzegovina\" }, \"BN\": { \"path\": \"M707.34,273.57l0.76,-0.72l1.59,-1.03l-0.18,1.93l-0.9,-0.06l-0.28,0.14l-0.31,0.51l-0.68,-0.78Z\", \"name\": \"Brunei\" }, \"BO\": { \"path\": \"M263.83,340.79l-0.23,-0.12l-2.86,-0.11l-0.28,0.17l-0.77,1.67l-1.17,-1.51l-0.18,-0.11l-3.28,-0.64l-0.28,0.1l-2.02,2.3l-1.43,0.29l-0.91,-3.35l-1.31,-2.88l0.75,-2.41l-0.09,-0.32l-1.23,-1.03l-0.31,-1.76l-0.05,-0.12l-1.12,-1.6l1.49,-2.62l0.01,-0.28l-1.0,-2.0l0.48,-0.72l0.02,-0.29l-0.37,-0.78l0.87,-1.13l0.06,-0.18l0.05,-2.17l0.12,-1.71l0.5,-0.8l0.01,-0.3l-1.9,-3.58l1.3,0.15l1.34,-0.05l0.23,-0.12l0.51,-0.7l2.12,-0.99l1.31,-0.93l2.81,-0.37l-0.21,1.51l0.01,0.13l0.29,0.91l-0.19,1.64l0.11,0.27l2.72,2.27l0.15,0.07l2.71,0.41l0.92,0.88l0.12,0.07l1.64,0.49l1.0,0.71l0.18,0.06l1.5,-0.02l1.24,0.64l0.1,1.31l0.05,0.14l0.44,0.68l0.02,0.73l-0.44,0.03l-0.27,0.39l0.96,2.99l0.28,0.21l4.43,0.1l-0.28,1.12l0.0,0.15l0.27,1.02l0.15,0.19l1.27,0.67l0.52,1.42l-0.42,1.91l-0.66,1.1l-0.04,0.2l0.21,1.3l-0.19,0.13l-0.01,-0.27l-0.15,-0.24l-2.33,-1.33l-0.14,-0.04l-2.38,-0.03l-4.36,0.76l-0.21,0.16l-1.2,2.29l-0.03,0.13l-0.06,1.37l-0.79,2.53l-0.05,-0.08Z\", \"name\": \"Bolivia\" }, \"JP\": { \"path\": \"M781.17,166.78l1.8,0.67l0.28,-0.04l1.38,-1.01l0.43,2.67l-3.44,0.77l-0.18,0.12l-2.04,2.79l-3.71,-1.94l-0.42,0.15l-1.29,3.11l-2.32,0.04l-0.3,-2.63l1.12,-2.1l2.51,-0.16l0.28,-0.25l0.73,-4.22l0.58,-1.9l2.59,2.84l2.0,1.1ZM773.66,187.36l-0.92,2.24l-0.01,0.2l0.4,1.3l-1.18,1.81l-3.06,1.28l-4.35,0.17l-0.19,0.08l-3.4,3.06l-1.36,-0.87l-0.1,-1.95l-0.34,-0.28l-4.35,0.62l-2.99,1.33l-2.87,0.05l-0.28,0.2l0.09,0.33l2.37,1.93l-1.57,4.44l-1.35,0.97l-0.9,-0.79l0.57,-2.32l-0.15,-0.34l-1.5,-0.77l-0.81,-1.53l2.04,-0.75l0.14,-0.1l1.28,-1.72l2.47,-1.43l1.84,-1.92l4.83,-0.82l2.62,0.57l0.33,-0.16l2.45,-4.77l1.38,1.14l0.38,0.0l5.1,-4.02l0.09,-0.11l1.57,-3.57l0.02,-0.16l-0.42,-3.22l0.94,-1.67l2.27,-0.47l1.26,3.82l-0.07,2.23l-2.26,2.86l-0.06,0.19l0.04,2.93ZM757.85,196.18l0.22,0.66l-1.11,1.33l-0.8,-0.7l-0.33,-0.04l-1.28,0.65l-0.14,0.15l-0.54,1.34l-1.17,-0.57l0.02,-1.03l1.2,-1.45l1.24,0.28l0.29,-0.1l0.9,-1.03l1.51,0.5Z\", \"name\": \"Japan\" }, \"BI\": { \"path\": \"M494.7,295.83l-0.14,-2.71l-0.04,-0.13l-0.34,-0.62l0.93,0.12l0.3,-0.16l0.67,-1.25l0.9,0.11l0.11,0.76l0.08,0.16l0.46,0.48l0.02,0.56l-0.55,0.48l-0.96,1.29l-0.82,0.82l-0.61,0.07Z\", \"name\": \"Burundi\" }, \"BJ\": { \"path\": \"M427.4,268.94l-1.58,0.22l-0.52,-1.45l0.11,-5.73l-0.08,-0.21l-0.43,-0.44l-0.09,-1.13l-0.09,-0.19l-1.52,-1.52l0.24,-1.01l0.7,-0.23l0.18,-0.16l0.45,-0.97l1.07,-0.21l0.19,-0.12l0.53,-0.73l0.73,-0.65l0.68,-0.0l1.69,1.3l-0.08,0.67l0.02,0.14l0.52,1.38l-0.44,0.9l-0.01,0.24l0.2,0.52l-1.1,1.42l-0.76,0.76l-0.08,0.13l-0.47,1.59l0.05,1.69l-0.13,3.79Z\", \"name\": \"Benin\" }, \"BT\": { \"path\": \"M650.38,213.78l0.88,0.75l-0.13,1.24l-1.77,0.07l-2.1,-0.18l-1.57,0.4l-2.02,-0.91l-0.02,-0.24l1.54,-1.87l1.18,-0.6l1.67,0.59l1.32,0.08l1.01,0.67Z\", \"name\": \"Bhutan\" }, \"JM\": { \"path\": \"M226.67,238.37l1.64,0.23l1.2,0.56l0.11,0.19l-1.25,0.03l-0.14,0.04l-0.65,0.37l-1.24,-0.37l-1.17,-0.77l0.11,-0.22l0.86,-0.15l0.52,0.08Z\", \"name\": \"Jamaica\" }, \"BW\": { \"path\": \"M484.91,331.96l0.53,0.52l0.82,1.53l2.83,2.86l0.14,0.08l0.85,0.22l0.03,0.81l0.74,1.66l0.21,0.17l1.87,0.39l1.17,0.87l-3.13,1.71l-2.3,2.01l-0.07,0.1l-0.82,1.74l-0.66,0.88l-1.24,0.19l-0.24,0.2l-0.65,1.98l-1.4,0.55l-1.9,-0.12l-1.2,-0.74l-1.06,-0.32l-0.22,0.02l-1.22,0.62l-0.14,0.14l-0.58,1.21l-1.16,0.79l-1.18,1.13l-1.5,0.23l-0.4,-0.68l0.22,-1.53l-0.04,-0.19l-1.48,-2.54l-0.11,-0.11l-0.53,-0.31l-0.0,-7.25l2.18,-0.08l0.29,-0.3l0.07,-9.0l1.63,-0.08l3.69,-0.86l0.84,0.93l0.38,0.05l1.53,-0.97l0.79,-0.03l1.3,-0.53l0.23,0.1l0.92,1.96Z\", \"name\": \"Botswana\" }, \"BR\": { \"path\": \"M259.49,274.87l1.42,0.25l1.97,0.62l0.28,-0.05l0.67,-0.55l1.76,-0.38l2.8,-0.94l0.12,-0.08l0.92,-0.96l0.05,-0.33l-0.15,-0.32l0.73,-0.06l0.36,0.35l-0.27,0.93l0.17,0.36l0.76,0.34l0.44,0.9l-0.58,0.73l-0.06,0.13l-0.4,2.13l0.03,0.19l0.62,1.22l0.17,1.11l0.11,0.19l1.54,1.18l0.15,0.06l1.23,0.12l0.29,-0.15l0.2,-0.36l0.71,-0.11l1.13,-0.44l0.79,-0.63l1.25,0.19l0.65,-0.08l1.32,0.2l0.32,-0.18l0.23,-0.51l-0.05,-0.31l-0.31,-0.37l0.11,-0.31l0.75,0.17l0.13,0.0l1.1,-0.24l1.34,0.5l1.08,0.51l0.33,-0.05l0.67,-0.58l0.27,0.05l0.28,0.57l0.31,0.17l1.2,-0.18l0.17,-0.08l1.03,-1.05l0.76,-1.82l1.39,-2.16l0.49,-0.07l0.52,1.17l1.4,4.37l0.2,0.2l1.14,0.35l0.05,1.39l-1.8,1.97l0.01,0.42l0.78,0.75l0.18,0.08l4.16,0.37l0.08,2.25l0.5,0.22l1.78,-1.54l2.98,0.85l4.07,1.5l1.07,1.28l-0.37,1.23l0.36,0.38l2.83,-0.75l4.8,1.3l3.75,-0.09l3.6,2.02l3.27,2.84l1.93,0.72l2.13,0.11l0.76,0.66l1.22,4.56l-0.96,4.03l-1.22,1.58l-3.52,3.51l-1.63,2.91l-1.75,2.09l-0.5,0.04l-0.26,0.19l-0.72,1.99l0.18,4.76l-0.95,5.56l-0.74,0.96l-0.06,0.15l-0.43,3.39l-2.49,3.34l-0.06,0.13l-0.4,2.56l-1.9,1.07l-0.13,0.16l-0.51,1.38l-2.59,0.0l-3.94,1.01l-1.82,1.19l-2.85,0.81l-3.01,2.17l-2.12,2.65l-0.06,0.13l-0.36,2.0l0.01,0.13l0.4,1.42l-0.45,2.63l-0.53,1.23l-1.76,1.53l-2.76,4.79l-2.16,2.15l-1.69,1.29l-0.09,0.12l-1.12,2.6l-1.3,1.26l-0.45,-1.02l0.99,-1.18l0.01,-0.37l-1.5,-1.95l-1.98,-1.54l-2.58,-1.77l-0.2,-0.05l-0.81,0.07l-2.42,-2.05l-0.25,-0.07l-0.77,0.14l2.75,-3.07l2.8,-2.61l1.67,-1.09l2.11,-1.49l0.13,-0.24l0.05,-2.15l-0.07,-0.2l-1.26,-1.54l-0.35,-0.09l-0.64,0.27l0.3,-0.95l0.34,-1.57l0.01,-1.52l-0.16,-0.26l-0.9,-0.48l-0.27,-0.01l-0.86,0.39l-0.65,-0.08l-0.23,-0.8l-0.23,-2.39l-0.04,-0.12l-0.47,-0.79l-0.14,-0.12l-1.69,-0.71l-0.25,0.01l-0.93,0.47l-2.29,-0.44l0.15,-3.3l-0.03,-0.15l-0.62,-1.22l0.57,-0.39l0.13,-0.3l-0.22,-1.37l0.67,-1.13l0.44,-2.04l-0.01,-0.17l-0.59,-1.61l-0.14,-0.16l-1.25,-0.66l-0.22,-0.82l0.35,-1.41l-0.28,-0.37l-4.59,-0.1l-0.78,-2.41l0.34,-0.02l0.28,-0.31l-0.03,-1.1l-0.05,-0.16l-0.45,-0.68l-0.1,-1.4l-0.16,-0.24l-1.45,-0.76l-0.14,-0.03l-1.48,0.02l-1.04,-0.73l-1.62,-0.48l-0.93,-0.9l-0.16,-0.08l-2.72,-0.41l-2.53,-2.12l0.18,-1.54l-0.01,-0.13l-0.29,-0.91l0.26,-1.83l-0.34,-0.34l-3.28,0.43l-0.14,0.05l-1.3,0.93l-2.16,1.01l-0.12,0.09l-0.47,0.65l-1.12,0.05l-1.84,-0.21l-0.12,0.01l-1.33,0.41l-0.82,-0.21l0.16,-3.6l-0.48,-0.26l-1.97,1.43l-1.96,-0.06l-0.86,-1.23l-0.22,-0.13l-1.23,-0.11l0.34,-0.69l-0.05,-0.33l-1.36,-1.5l-0.92,-2.0l0.45,-0.32l0.13,-0.25l-0.0,-0.87l1.34,-0.64l0.17,-0.32l-0.23,-1.23l0.56,-0.77l0.05,-0.13l0.16,-1.03l2.7,-1.61l2.01,-0.47l0.16,-0.09l0.24,-0.27l2.11,0.11l0.31,-0.25l1.13,-6.87l0.06,-1.12l-0.4,-1.53l-0.1,-0.15l-1.0,-0.82l0.01,-1.45l1.08,-0.32l0.39,0.2l0.44,-0.24l0.08,-0.96l-0.25,-0.32l-1.22,-0.22l-0.02,-1.01l4.57,0.05l0.22,-0.09l0.6,-0.63l0.44,0.5l0.47,1.42l0.45,0.16l0.27,-0.18l1.21,1.16l0.23,0.08l1.95,-0.16l0.23,-0.14l0.43,-0.67l1.76,-0.55l1.05,-0.42l0.18,-0.2l0.25,-0.92l1.65,-0.66l0.18,-0.35l-0.14,-0.53l-0.26,-0.22l-1.91,-0.19l-0.29,-1.33l0.1,-1.64l-0.15,-0.28l-0.44,-0.25Z\", \"name\": \"Brazil\" }, \"BS\": { \"path\": \"M227.51,216.69l0.3,0.18l-0.24,1.07l0.03,-1.04l-0.09,-0.21ZM226.5,224.03l-0.13,0.03l-0.54,-1.3l-0.09,-0.12l-0.78,-0.64l0.4,-1.26l0.33,0.05l0.79,2.0l0.01,1.24ZM225.76,216.5l-2.16,0.34l-0.07,-0.41l0.85,-0.16l1.36,0.07l0.02,0.16Z\", \"name\": \"The Bahamas\" }, \"BY\": { \"path\": \"M480.08,135.28l2.09,0.02l0.13,-0.03l2.72,-1.3l0.16,-0.19l0.55,-1.83l1.94,-1.06l0.15,-0.31l-0.2,-1.33l1.33,-0.52l2.58,-1.3l2.39,0.8l0.3,0.75l0.37,0.17l1.22,-0.39l2.18,0.75l0.2,1.36l-0.48,0.85l0.01,0.32l1.57,2.26l0.92,0.6l-0.1,0.41l0.19,0.35l1.61,0.57l0.48,0.6l-0.64,0.49l-1.91,-0.11l-0.18,0.05l-0.48,0.32l-0.1,0.39l0.57,1.1l0.51,1.78l-1.79,0.17l-0.18,0.08l-0.77,0.73l-0.09,0.19l-0.13,1.31l-0.75,-0.22l-2.11,0.15l-0.56,-0.66l-0.39,-0.06l-0.8,0.49l-0.79,-0.4l-0.13,-0.03l-1.94,-0.07l-2.76,-0.79l-2.58,-0.27l-1.98,0.07l-0.15,0.05l-1.31,0.86l-0.8,0.09l-0.04,-1.16l-0.03,-0.12l-0.63,-1.28l1.22,-0.56l0.17,-0.27l0.01,-1.35l-0.04,-0.15l-0.66,-1.24l-0.08,-1.12Z\", \"name\": \"Belarus\" }, \"BZ\": { \"path\": \"M198.03,239.7l0.28,0.19l0.43,-0.1l0.82,-1.42l0.0,0.07l0.29,0.29l0.16,0.0l-0.02,0.35l-0.39,1.08l0.02,0.25l0.16,0.29l-0.23,0.8l0.04,0.24l0.09,0.14l-0.25,1.12l-0.38,0.53l-0.33,0.06l-0.21,0.15l-0.41,0.74l-0.25,0.0l0.17,-2.58l0.01,-2.2Z\", \"name\": \"Belize\" }, \"RU\": { \"path\": \"M688.57,38.85l0.63,2.39l0.44,0.19l2.22,-1.23l7.18,0.07l5.54,2.49l1.85,1.77l-0.55,2.34l-2.64,1.42l-6.57,2.76l-1.95,1.5l0.12,0.53l3.09,0.68l3.69,1.23l0.21,-0.01l1.98,-0.81l1.16,2.84l0.5,0.08l1.03,-1.18l3.86,-0.74l7.79,0.78l0.56,2.05l0.27,0.22l10.47,0.71l0.32,-0.29l0.13,-3.34l4.98,0.8l3.96,-0.02l3.88,2.43l1.06,2.79l-1.38,1.83l0.01,0.38l3.15,3.64l0.1,0.08l3.94,1.86l0.4,-0.14l2.28,-4.56l3.75,1.94l0.22,0.02l4.18,-1.22l4.76,1.4l0.26,-0.04l1.74,-1.23l3.98,0.63l0.32,-0.41l-1.71,-4.1l3.0,-1.86l22.39,3.04l2.06,2.67l0.1,0.08l6.55,3.51l0.17,0.03l10.08,-0.86l4.86,0.73l1.91,1.72l-0.29,3.13l0.18,0.31l3.08,1.26l0.19,0.01l3.32,-0.9l4.37,-0.11l4.78,0.87l4.61,-0.48l4.26,3.82l0.32,0.05l3.1,-1.4l0.12,-0.45l-1.91,-2.67l0.92,-1.64l7.78,1.22l5.22,-0.26l7.12,2.1l9.6,5.22l6.4,4.15l-0.2,2.44l0.14,0.28l1.69,1.04l0.45,-0.31l-0.51,-2.66l6.31,0.58l4.52,3.61l-2.1,1.52l-4.02,0.42l-0.27,0.29l-0.06,3.83l-0.81,0.67l-2.14,-0.11l-1.91,-1.39l-3.19,-1.13l-0.51,-1.63l-0.21,-0.2l-2.54,-0.67l-0.13,-0.0l-2.69,0.5l-1.12,-1.19l0.48,-1.36l-0.38,-0.39l-3.0,0.98l-0.17,0.44l1.02,1.76l-1.27,1.55l-3.09,1.71l-3.15,-0.29l-0.3,0.18l0.07,0.34l2.22,2.1l1.47,3.22l1.15,1.09l0.25,1.41l-0.48,0.76l-4.47,-0.81l-0.17,0.02l-6.97,2.9l-2.2,0.44l-0.11,0.05l-3.83,2.68l-3.63,2.32l-0.1,0.11l-0.76,1.4l-3.3,-2.4l-0.3,-0.03l-6.31,2.85l-0.99,-1.21l-0.4,-0.06l-2.32,1.54l-3.23,-0.49l-0.33,0.2l-0.79,2.39l-2.97,3.51l-0.07,0.21l0.09,1.47l0.22,0.27l2.62,0.74l-0.3,4.7l-2.06,0.12l-0.26,0.2l-1.07,2.94l0.04,0.27l0.83,1.19l-4.03,1.63l-0.18,0.21l-0.83,3.72l-3.55,0.79l-0.23,0.23l-0.73,3.32l-3.22,2.76l-0.76,-1.88l-1.07,-4.88l-1.39,-7.59l1.17,-4.76l2.05,-2.08l0.09,-0.19l0.11,-1.46l3.67,-0.77l0.15,-0.08l4.47,-4.61l4.29,-3.82l4.48,-3.01l0.11,-0.14l2.01,-5.43l-0.31,-0.4l-3.04,0.33l-0.24,0.17l-1.47,3.11l-5.98,3.94l-1.91,-4.36l-0.33,-0.17l-6.46,1.3l-0.15,0.08l-6.27,6.33l-0.01,0.41l1.7,1.87l-5.04,0.87l-3.51,0.34l0.16,-2.32l-0.26,-0.32l-3.89,-0.56l-0.19,0.04l-3.02,1.77l-7.63,-0.63l-8.24,1.1l-0.16,0.07l-8.11,7.09l-9.6,8.31l0.16,0.52l3.79,0.42l1.16,2.03l0.17,0.14l2.43,0.76l0.31,-0.08l1.5,-1.61l2.49,0.2l3.46,3.6l0.08,2.67l-1.91,3.26l-0.04,0.14l-0.21,3.91l-1.11,5.09l-3.73,4.55l-0.87,2.21l-6.73,7.14l-1.59,1.77l-3.23,1.72l-1.38,0.03l-1.48,-1.39l-0.37,-0.03l-3.36,2.22l-0.11,0.14l-0.16,0.42l-0.01,-1.09l1.0,-0.06l0.28,-0.27l0.36,-3.6l-0.61,-2.51l1.85,-0.94l2.94,0.53l0.32,-0.15l1.71,-3.1l0.84,-3.38l0.97,-1.18l1.32,-2.88l-0.34,-0.42l-4.14,0.95l-2.18,1.25l-3.51,-0.0l-0.95,-2.81l-0.1,-0.14l-2.97,-2.3l-0.11,-0.05l-4.19,-1.0l-0.89,-3.08l-0.87,-2.03l-0.95,-1.46l-1.54,-3.37l-0.12,-0.14l-2.27,-1.28l-3.83,-1.02l-3.37,0.1l-3.11,0.61l-0.13,0.06l-2.07,1.69l0.04,0.49l1.23,0.72l0.03,1.53l-1.34,1.05l-2.26,3.51l-0.05,0.17l0.02,1.27l-3.25,1.9l-2.87,-1.17l-0.14,-0.02l-2.86,0.26l-1.22,-1.02l-0.12,-0.06l-1.5,-0.35l-0.23,0.04l-3.62,2.27l-3.24,0.53l-2.28,0.79l-3.08,-0.51l-2.24,0.03l-1.49,-1.61l-2.45,-1.57l-0.11,-0.04l-2.6,-0.43l-3.17,0.43l-2.31,0.59l-3.31,-1.28l-0.45,-2.31l-0.21,-0.23l-2.94,-0.85l-2.26,-0.39l-2.77,-1.36l-0.37,0.09l-2.59,3.45l-0.03,0.32l0.91,1.74l-2.15,2.01l-3.47,-0.79l-2.44,-0.12l-1.59,-1.46l-0.2,-0.08l-2.55,-0.05l-2.12,-0.98l-0.24,-0.01l-3.85,1.57l-4.74,2.79l-2.59,0.55l-0.79,0.21l-1.21,-1.81l-0.29,-0.13l-3.05,0.41l-0.96,-1.25l-0.14,-0.1l-1.65,-0.6l-1.15,-1.82l-0.13,-0.12l-1.38,-0.6l-0.19,-0.02l-3.49,0.82l-3.35,-1.85l-0.38,0.08l-1.08,1.4l-5.36,-8.17l-3.02,-2.52l0.72,-0.85l0.01,-0.38l-0.37,-0.08l-6.22,3.21l-1.98,0.16l0.17,-1.51l-0.2,-0.31l-3.22,-1.17l-0.19,-0.0l-2.3,0.74l-0.72,-3.27l-0.24,-0.23l-4.5,-0.75l-0.21,0.04l-2.2,1.42l-6.21,1.27l-0.11,0.05l-1.16,0.81l-9.3,1.19l-0.18,0.09l-1.15,1.17l-0.02,0.39l1.56,2.01l-2.02,0.74l-0.16,0.42l0.35,0.68l-2.18,1.49l0.02,0.51l3.83,2.16l-0.45,1.13l-3.31,-0.13l-0.25,0.12l-0.57,0.77l-2.97,-1.59l-0.15,-0.04l-3.97,0.07l-0.13,0.03l-2.53,1.32l-2.84,-1.28l-5.52,-2.3l-0.12,-0.02l-3.91,0.09l-0.16,0.05l-5.17,3.6l-0.13,0.21l-0.25,1.89l-2.17,-1.6l-0.44,0.1l-2.0,3.59l0.06,0.37l0.55,0.5l-1.32,2.23l0.04,0.36l2.13,2.17l0.23,0.09l1.7,-0.08l1.42,1.89l-0.23,1.5l0.19,0.32l0.94,0.38l-0.89,1.44l-2.3,0.49l-0.17,0.11l-2.49,3.2l0.0,0.37l2.2,2.81l-0.23,1.93l0.06,0.22l2.56,3.32l-1.27,1.02l-0.4,0.66l-0.8,-0.15l-1.65,-1.75l-0.18,-0.09l-0.66,-0.09l-1.45,-0.64l-0.72,-1.16l-0.18,-0.13l-2.34,-0.63l-0.17,0.0l-1.32,0.41l-0.31,-0.4l-0.12,-0.09l-3.49,-1.48l-3.67,-0.49l-2.1,-0.52l-0.3,0.1l-0.12,0.14l-2.96,-2.4l-2.89,-1.19l-1.69,-1.42l1.27,-0.35l0.16,-0.1l2.08,-2.61l-0.04,-0.41l-1.02,-0.9l3.21,-1.12l0.2,-0.31l-0.07,-0.69l-0.37,-0.26l-1.86,0.42l0.05,-0.86l1.11,-0.76l2.35,-0.23l0.25,-0.19l0.39,-1.07l0.0,-0.19l-0.51,-1.64l0.95,-1.58l0.04,-0.16l-0.03,-0.95l-0.22,-0.28l-3.69,-1.06l-1.43,0.02l-1.45,-1.44l-0.29,-0.08l-1.83,0.49l-2.88,-1.04l0.04,-0.42l-0.04,-0.18l-0.89,-1.43l-0.23,-0.14l-1.77,-0.14l-0.13,-0.66l0.52,-0.56l0.01,-0.4l-1.6,-1.9l-0.27,-0.1l-2.55,0.32l-0.71,-0.16l-0.3,0.1l-0.53,0.63l-0.58,-0.08l-0.56,-1.97l-0.48,-0.94l0.17,-0.11l1.92,0.11l0.2,-0.06l0.97,-0.74l0.05,-0.42l-0.72,-0.91l-0.13,-0.1l-1.43,-0.51l0.09,-0.36l-0.13,-0.33l-0.97,-0.59l-1.43,-2.06l0.44,-0.77l0.04,-0.19l-0.25,-1.64l-0.2,-0.24l-2.45,-0.84l-0.19,-0.0l-1.05,0.34l-0.25,-0.62l-0.18,-0.17l-2.5,-0.84l-0.74,-1.93l-0.21,-1.7l-0.13,-0.21l-0.92,-0.63l0.83,-0.89l0.07,-0.27l-0.71,-3.26l1.69,-2.01l0.03,-0.34l-0.24,-0.41l2.63,-1.9l-0.01,-0.49l-2.31,-1.57l5.08,-4.61l2.33,-2.24l1.01,-2.08l-0.09,-0.37l-3.52,-2.56l0.94,-2.38l-0.04,-0.29l-2.14,-2.86l1.61,-3.35l-0.01,-0.29l-2.81,-4.58l2.19,-3.04l-0.06,-0.42l-3.7,-2.76l0.32,-2.67l1.87,-0.38l4.26,-1.77l2.46,-1.47l3.96,2.58l0.12,0.05l6.81,1.04l9.37,4.87l1.81,1.92l0.15,2.55l-2.61,2.06l-3.95,1.07l-11.1,-3.15l-0.17,0.0l-1.84,0.53l-0.1,0.53l3.97,2.97l0.15,1.77l0.16,4.14l0.19,0.27l3.21,1.22l1.94,1.03l0.44,-0.22l0.32,-1.94l-0.07,-0.25l-1.32,-1.52l1.25,-1.2l5.87,2.45l0.24,-0.01l2.11,-0.98l0.13,-0.42l-1.55,-2.75l5.52,-3.84l2.13,0.22l2.28,1.42l0.43,-0.12l1.46,-2.87l-0.04,-0.33l-1.97,-2.37l1.14,-2.38l-0.02,-0.3l-1.42,-2.07l6.15,1.22l1.14,1.92l-2.74,0.46l-0.25,0.3l0.02,2.36l0.12,0.24l1.97,1.44l0.25,0.05l3.87,-0.91l0.22,-0.23l0.58,-2.55l5.09,-1.98l8.67,-3.69l1.22,0.14l-2.06,2.2l0.18,0.5l3.11,0.45l0.23,-0.07l1.71,-1.41l4.59,-0.12l0.12,-0.03l3.53,-1.72l2.7,2.48l0.42,-0.01l2.85,-2.88l-0.0,-0.43l-2.42,-2.35l1.0,-1.13l7.2,1.31l3.42,1.36l9.06,4.97l0.39,-0.08l1.67,-2.27l-0.04,-0.4l-2.46,-2.23l-0.06,-0.82l-0.26,-0.27l-2.64,-0.38l0.69,-1.76l0.0,-0.22l-1.32,-3.47l-0.07,-1.27l4.52,-4.09l0.08,-0.11l1.6,-4.18l1.67,-0.84l6.33,1.2l0.46,2.31l-2.31,3.67l0.05,0.38l1.49,1.41l0.77,3.04l-0.56,6.05l0.09,0.24l2.62,2.54l-0.99,2.65l-4.87,5.96l0.17,0.48l2.86,0.61l0.31,-0.13l0.94,-1.42l2.67,-1.04l0.18,-0.19l0.64,-2.01l2.11,-1.98l0.05,-0.37l-1.38,-2.32l1.11,-2.74l-0.24,-0.41l-2.53,-0.33l-0.53,-2.16l1.96,-4.42l-0.05,-0.32l-3.03,-3.48l4.21,-2.94l0.12,-0.3l-0.52,-3.04l0.72,-0.06l1.18,2.35l-0.97,4.39l0.2,0.35l2.68,0.84l0.37,-0.38l-1.05,-3.07l3.89,-1.71l5.05,-0.24l4.55,2.62l0.36,-0.05l0.05,-0.36l-2.19,-3.84l-0.23,-4.78l4.07,-0.92l5.98,0.21l5.47,-0.64l0.2,-0.48l-1.88,-2.37l2.65,-2.99l2.75,-0.13l0.12,-0.03l4.82,-2.48l6.56,-0.67l0.23,-0.14l0.76,-1.27l6.33,-0.46l1.97,1.11l0.28,0.01l5.55,-2.71l4.53,0.08l0.29,-0.21l0.67,-2.18l2.29,-2.15l5.75,-2.13l3.48,1.4l-2.7,1.03l-0.19,0.31l0.26,0.26l5.47,0.78ZM871.83,65.73l0.25,-0.15l1.99,0.01l3.3,1.2l-0.08,0.22l-2.41,1.03l-5.73,0.49l-0.31,-1.0l2.99,-1.8ZM797.64,48.44l-2.22,1.51l-3.85,-0.43l-4.35,-1.85l0.42,-1.13l4.42,0.72l5.59,1.17ZM783.82,46.06l-1.71,3.25l-9.05,-0.14l-4.11,1.15l-4.64,-3.04l1.21,-3.13l3.11,-0.91l6.53,0.22l8.66,2.59ZM780.37,145.71l2.28,5.23l-3.09,-0.89l-0.37,0.19l-1.54,4.65l0.04,0.27l2.38,3.17l-0.05,1.4l-1.41,-1.41l-0.46,0.04l-1.23,1.81l-0.33,-1.86l0.28,-3.1l-0.28,-3.41l0.58,-2.46l0.11,-4.39l-0.03,-0.13l-1.44,-3.2l0.21,-4.39l2.19,-1.49l0.09,-0.41l-0.81,-1.3l0.48,-0.21l0.56,1.94l0.86,3.23l-0.05,3.36l1.03,3.35ZM780.16,57.18l-3.4,0.03l-5.06,-0.53l1.97,-1.59l2.95,-0.42l3.35,1.75l0.18,0.77ZM683.84,31.18l-13.29,1.97l4.16,-6.56l1.88,-0.58l1.77,0.34l6.08,3.02l-0.6,1.8ZM670.94,28.02l-5.18,0.65l-6.89,-1.58l-4.03,-2.07l-1.88,-3.98l-0.18,-0.16l-2.8,-0.93l5.91,-3.62l5.25,-1.29l4.73,2.88l5.63,5.44l-0.57,4.66ZM564.37,68.98l-0.85,0.23l-7.93,-0.57l-0.6,-1.84l-0.21,-0.2l-4.34,-1.18l-0.3,-2.08l2.34,-0.92l0.19,-0.29l-0.08,-2.43l4.85,-4.0l-0.12,-0.52l-1.68,-0.43l5.47,-3.94l0.11,-0.33l-0.6,-2.02l5.36,-2.55l8.22,-3.27l8.29,-0.96l4.34,-1.94l4.67,-0.65l1.45,1.72l-1.43,1.37l-8.8,2.52l-7.65,2.42l-7.92,4.84l-3.73,4.75l-3.92,4.58l-0.07,0.23l0.51,3.88l0.11,0.2l4.32,3.39ZM548.86,18.57l-3.28,0.75l-2.25,0.44l-0.22,0.19l-0.3,0.81l-2.67,0.86l-2.27,-1.14l1.2,-1.51l-0.23,-0.49l-3.14,-0.1l2.48,-0.54l3.55,-0.07l0.44,1.36l0.49,0.12l1.4,-1.35l2.2,-0.9l3.13,1.08l-0.54,0.49ZM477.5,133.25l-4.21,0.05l-2.69,-0.34l0.39,-1.03l3.24,-1.06l2.51,0.58l0.85,0.43l-0.2,0.71l-0.0,0.15l0.12,0.52Z\", \"name\": \"Russia\" }, \"RW\": { \"path\": \"M497.03,288.12l0.78,1.11l-0.12,1.19l-0.49,0.21l-1.25,-0.15l-0.3,0.16l-0.67,1.24l-1.01,-0.13l0.16,-0.92l0.22,-0.12l0.15,-0.24l0.09,-1.37l0.49,-0.48l0.42,0.18l0.25,-0.01l1.26,-0.65Z\", \"name\": \"Rwanda\" }, \"RS\": { \"path\": \"M469.75,168.65l0.21,-0.21l0.36,-1.44l-0.08,-0.29l-1.06,-1.03l0.54,-1.16l-0.28,-0.43l-0.26,0.0l0.55,-0.67l-0.01,-0.39l-0.77,-0.86l-0.45,-0.89l1.56,-0.67l1.39,0.12l1.22,1.1l0.26,0.91l0.16,0.19l1.38,0.66l0.17,1.12l0.14,0.21l1.46,0.9l0.35,-0.03l0.62,-0.54l0.09,0.06l-0.28,0.25l-0.03,0.42l0.29,0.34l-0.44,0.5l-0.07,0.26l0.22,1.12l0.07,0.14l1.02,1.1l-0.81,0.84l-0.42,0.96l0.04,0.3l0.12,0.15l-0.15,0.16l-1.04,0.04l-0.39,0.08l0.33,-0.81l-0.29,-0.41l-0.21,0.01l-0.39,-0.45l-0.13,-0.09l-0.32,-0.11l-0.27,-0.4l-0.14,-0.11l-0.4,-0.16l-0.31,-0.37l-0.34,-0.09l-0.45,0.17l-0.18,0.18l-0.29,0.84l-0.96,-0.65l-0.81,-0.33l-0.32,-0.37l-0.22,-0.18Z\", \"name\": \"Republic of Serbia\" }, \"LT\": { \"path\": \"M478.13,133.31l-0.14,-0.63l0.25,-0.88l-0.15,-0.35l-1.17,-0.58l-2.43,-0.57l-0.45,-2.51l2.58,-0.97l4.14,0.22l2.3,-0.32l0.26,0.54l0.22,0.17l1.26,0.22l2.25,1.6l0.19,1.23l-1.87,1.01l-0.14,0.18l-0.54,1.83l-2.54,1.21l-2.18,-0.02l-0.52,-0.91l-0.18,-0.14l-1.11,-0.32Z\", \"name\": \"Lithuania\" }, \"LU\": { \"path\": \"M435.95,147.99l0.33,0.49l-0.11,1.07l-0.39,0.04l-0.29,-0.15l0.21,-1.4l0.25,-0.05Z\", \"name\": \"Luxembourg\" }, \"LR\": { \"path\": \"M401.37,273.67l-0.32,0.01l-2.48,-1.15l-2.24,-1.89l-2.14,-1.38l-1.47,-1.42l0.44,-0.59l0.05,-0.13l0.12,-0.65l1.07,-1.3l1.08,-1.09l0.52,-0.07l0.43,-0.18l0.84,1.24l-0.15,0.89l0.07,0.25l0.49,0.54l0.22,0.1l0.71,0.01l0.27,-0.16l0.42,-0.83l0.19,0.02l-0.06,0.52l0.23,1.12l-0.5,1.03l0.06,0.35l0.73,0.69l0.14,0.08l0.71,0.15l0.92,0.91l0.06,0.76l-0.17,0.22l-0.06,0.15l-0.17,1.8Z\", \"name\": \"Liberia\" }, \"RO\": { \"path\": \"M477.94,155.19l1.02,-0.64l1.49,0.33l1.52,0.01l1.09,0.73l0.32,0.01l0.81,-0.46l1.8,-0.3l0.18,-0.1l0.54,-0.64l0.86,0.0l0.64,0.26l0.71,0.87l0.8,1.35l1.39,1.81l0.07,1.25l-0.26,1.3l0.01,0.15l0.45,1.42l0.15,0.18l1.12,0.57l0.25,0.01l1.05,-0.45l0.86,0.4l0.03,0.43l-0.92,0.51l-0.63,-0.24l-0.4,0.22l-0.64,3.41l-1.12,-0.24l-1.78,-1.09l-0.23,-0.04l-2.95,0.71l-1.25,0.77l-3.55,-0.16l-1.89,-0.47l-0.14,-0.0l-0.75,0.17l-0.61,-1.07l-0.3,-0.36l0.36,-0.32l-0.04,-0.48l-0.62,-0.38l-0.36,0.03l-0.62,0.54l-1.15,-0.71l-0.18,-1.14l-0.17,-0.22l-1.4,-0.67l-0.24,-0.86l-0.09,-0.14l-0.96,-0.87l1.49,-0.44l0.16,-0.11l1.51,-2.14l1.15,-2.09l1.44,-0.63Z\", \"name\": \"Romania\" }, \"GW\": { \"path\": \"M383.03,256.73l-1.12,-0.88l-0.14,-0.06l-0.94,-0.15l-0.43,-0.54l0.01,-0.27l-0.13,-0.26l-0.68,-0.48l-0.05,-0.16l0.99,-0.31l0.77,0.08l0.15,-0.02l0.61,-0.26l4.25,0.1l-0.02,0.44l-0.19,0.18l-0.08,0.29l0.17,0.66l-0.17,0.14l-0.44,0.0l-0.16,0.05l-0.57,0.37l-0.66,-0.04l-0.24,0.1l-0.92,1.03Z\", \"name\": \"Guinea Bissau\" }, \"GT\": { \"path\": \"M195.13,249.89l-1.05,-0.35l-1.5,-0.04l-1.06,-0.47l-1.19,-0.93l0.04,-0.53l0.27,-0.55l-0.03,-0.31l-0.24,-0.32l1.02,-1.77l3.04,-0.01l0.3,-0.28l0.06,-0.88l-0.19,-0.3l-0.3,-0.11l-0.23,-0.45l-0.11,-0.12l-0.9,-0.58l-0.35,-0.33l0.37,-0.0l0.3,-0.3l0.0,-1.15l4.05,0.02l-0.02,1.74l-0.2,2.89l0.3,0.32l0.67,-0.0l0.75,0.42l0.4,-0.11l-0.62,0.53l-1.17,0.7l-0.13,0.16l-0.18,0.49l0.0,0.21l0.14,0.34l-0.35,0.44l-0.49,0.13l-0.2,0.41l0.03,0.06l-0.27,0.16l-0.86,0.64l-0.12,0.22ZM199.35,245.38l0.07,-0.13l0.05,0.02l-0.13,0.11Z\", \"name\": \"Guatemala\" }, \"GR\": { \"path\": \"M487.2,174.55l-0.64,1.54l-0.43,0.24l-1.41,-0.08l-1.28,-0.28l-0.14,0.0l-3.03,0.77l-0.13,0.51l1.39,1.34l-0.78,0.29l-1.2,0.0l-1.23,-1.42l-0.47,0.02l-0.47,0.65l-0.04,0.27l0.56,1.76l0.06,0.11l1.02,1.12l-0.66,0.45l-0.04,0.46l1.39,1.35l1.15,0.79l0.02,1.06l-1.91,-0.63l-0.36,0.42l0.56,1.12l-1.2,0.23l-0.22,0.4l0.8,2.14l-1.15,0.02l-1.89,-1.15l-0.89,-2.19l-0.43,-1.91l-0.05,-0.11l-0.98,-1.35l-1.24,-1.62l-0.13,-0.63l1.07,-1.32l0.06,-0.14l0.13,-0.81l0.68,-0.36l0.16,-0.25l0.03,-0.54l1.4,-0.23l0.12,-0.05l0.87,-0.6l1.26,0.05l0.25,-0.11l0.34,-0.43l0.33,-0.07l1.81,0.08l0.13,-0.02l1.87,-0.77l1.64,0.97l0.19,0.04l2.28,-0.28l0.26,-0.29l0.02,-0.95l0.56,0.36ZM480.44,192.0l1.05,0.74l0.01,0.0l-1.26,-0.23l0.2,-0.51ZM481.76,192.79l1.86,-0.15l1.53,0.17l-0.02,0.19l0.34,0.3l-2.28,0.15l0.01,-0.13l-0.25,-0.31l-1.19,-0.22ZM485.65,193.28l0.65,-0.16l-0.05,0.12l-0.6,0.04Z\", \"name\": \"Greece\" }, \"GQ\": { \"path\": \"M444.81,282.04l-0.21,-0.17l0.74,-2.4l3.56,0.05l0.02,2.42l-3.34,-0.02l-0.76,0.13Z\", \"name\": \"Equatorial Guinea\" }, \"GY\": { \"path\": \"M271.34,264.25l1.43,0.81l1.44,1.53l0.06,1.19l0.28,0.28l0.84,0.05l2.13,1.92l-0.34,1.93l-1.37,0.59l-0.17,0.34l0.12,0.51l-0.43,1.21l0.03,0.26l1.11,1.82l0.26,0.14l0.56,0.0l0.32,1.29l1.25,1.78l-0.08,0.01l-1.34,-0.21l-0.24,0.06l-0.78,0.64l-1.06,0.41l-0.76,0.1l-0.22,0.15l-0.18,0.32l-0.95,-0.1l-1.38,-1.05l-0.19,-1.13l-0.6,-1.18l0.37,-1.96l0.65,-0.83l0.03,-0.32l-0.57,-1.17l-0.15,-0.14l-0.62,-0.27l0.25,-0.85l-0.08,-0.3l-0.58,-0.58l-0.24,-0.09l-1.15,0.1l-1.41,-1.58l0.48,-0.49l0.09,-0.22l-0.04,-0.92l1.31,-0.34l0.73,-0.52l0.04,-0.44l-0.75,-0.82l0.16,-0.66l1.74,-1.3Z\", \"name\": \"Guyana\" }, \"GE\": { \"path\": \"M525.41,174.19l0.26,-0.88l-0.0,-0.17l-0.63,-2.06l-0.1,-0.15l-1.45,-1.12l-0.11,-0.05l-1.31,-0.33l-0.66,-0.69l1.97,0.48l3.65,0.49l3.3,1.41l0.39,0.5l0.33,0.1l1.43,-0.45l2.14,0.58l0.7,1.14l0.13,0.12l1.06,0.47l-0.18,0.11l-0.08,0.43l1.08,1.41l-0.06,0.06l-1.16,-0.15l-1.82,-0.84l-0.31,0.04l-0.55,0.44l-3.29,0.44l-2.32,-1.41l-0.17,-0.04l-2.25,0.12Z\", \"name\": \"Georgia\" }, \"GB\": { \"path\": \"M412.82,118.6l-2.31,3.4l-0.0,0.33l0.31,0.13l2.52,-0.49l2.34,0.02l-0.56,2.51l-2.22,3.13l0.22,0.47l2.43,0.21l2.35,4.35l0.17,0.14l1.58,0.51l1.49,3.78l0.73,1.37l0.2,0.15l2.76,0.59l-0.25,1.75l-1.18,0.91l-0.08,0.39l0.87,1.49l-1.96,1.51l-3.31,-0.02l-4.15,0.88l-1.07,-0.59l-0.35,0.04l-1.55,1.44l-2.17,-0.35l-0.22,0.05l-1.61,1.15l-0.78,-0.38l3.31,-3.12l2.18,-0.7l0.21,-0.31l-0.26,-0.27l-3.78,-0.54l-0.48,-0.9l2.3,-0.92l0.13,-0.46l-1.29,-1.71l0.39,-1.83l3.46,0.29l0.32,-0.24l0.37,-1.99l-0.06,-0.24l-1.71,-2.17l-0.18,-0.11l-2.91,-0.58l-0.43,-0.68l0.82,-1.4l-0.03,-0.35l-0.82,-0.97l-0.46,0.01l-0.85,1.05l-0.11,-2.6l-0.05,-0.16l-1.19,-1.7l0.86,-3.53l1.81,-2.75l1.88,0.26l2.38,-0.24ZM406.39,132.84l-1.09,1.92l-1.65,-0.62l-1.26,0.02l0.41,-1.46l0.0,-0.16l-0.42,-1.51l1.62,-0.11l2.39,1.92Z\", \"name\": \"United Kingdom\" }, \"GA\": { \"path\": \"M448.76,294.47l-2.38,-2.34l-1.63,-2.04l-1.46,-2.48l0.06,-0.66l0.54,-0.81l0.61,-1.82l0.46,-1.69l0.63,-0.11l3.62,0.03l0.3,-0.3l-0.02,-2.75l0.88,-0.12l1.47,0.32l0.13,0.0l1.39,-0.3l-0.13,0.87l0.03,0.19l0.7,1.29l0.3,0.16l1.74,-0.19l0.36,0.29l-1.01,2.7l0.05,0.29l1.13,1.42l0.25,1.82l-0.3,1.56l-0.64,0.99l-1.93,-0.09l-1.26,-1.13l-0.5,0.17l-0.16,0.91l-1.48,0.27l-0.12,0.05l-0.86,0.63l-0.08,0.39l0.81,1.42l-1.48,1.08Z\", \"name\": \"Gabon\" }, \"GN\": { \"path\": \"M399.83,265.31l-0.69,-0.06l-0.3,0.16l-0.43,0.85l-0.39,-0.01l-0.3,-0.33l0.14,-0.87l-0.05,-0.22l-1.05,-1.54l-0.37,-0.11l-0.61,0.27l-0.84,0.12l0.02,-0.54l-0.04,-0.17l-0.35,-0.57l0.07,-0.63l-0.03,-0.17l-0.57,-1.11l-0.7,-0.9l-0.24,-0.12l-2.0,-0.0l-0.19,0.07l-0.51,0.42l-0.6,0.05l-0.21,0.11l-0.43,0.55l-0.3,0.7l-1.04,0.86l-0.91,-1.24l-1.0,-1.02l-0.69,-0.37l-0.52,-0.42l-0.3,-1.11l-0.37,-0.56l-0.1,-0.1l-0.4,-0.23l0.77,-0.85l0.62,0.04l0.18,-0.05l0.58,-0.38l0.46,-0.0l0.19,-0.07l0.39,-0.34l0.1,-0.3l-0.17,-0.67l0.15,-0.14l0.09,-0.2l0.03,-0.57l0.87,0.02l1.76,0.6l0.13,0.01l0.55,-0.06l0.22,-0.13l0.08,-0.12l1.18,0.17l0.17,-0.02l0.09,0.56l0.3,0.25l0.4,-0.0l0.14,-0.03l0.56,-0.29l0.23,0.05l0.63,0.59l0.15,0.07l1.07,0.2l0.24,-0.06l0.65,-0.52l0.77,-0.32l0.55,-0.32l0.3,0.04l0.44,0.45l0.34,0.74l0.84,0.87l-0.35,0.45l-0.06,0.15l-0.1,0.82l0.42,0.31l0.35,-0.16l0.05,0.04l-0.1,0.59l0.09,0.27l0.42,0.4l-0.06,0.02l-0.18,0.21l-0.2,0.86l0.03,0.21l0.56,1.02l0.52,1.71l-0.65,0.21l-0.15,0.12l-0.24,0.35l-0.03,0.28l0.16,0.41l-0.1,0.76l-0.12,0.0Z\", \"name\": \"Guinea\" }, \"GM\": { \"path\": \"M379.18,251.48l0.15,-0.55l2.51,-0.07l0.21,-0.09l0.48,-0.52l0.58,-0.03l0.91,0.58l0.16,0.05l0.78,0.01l0.14,-0.03l0.59,-0.31l0.16,0.24l-0.71,0.38l-0.94,-0.04l-1.02,-0.51l-0.3,0.01l-0.86,0.55l-0.37,0.02l-0.14,0.04l-0.53,0.31l-1.81,-0.04Z\", \"name\": \"Gambia\" }, \"GL\": { \"path\": \"M304.13,6.6l8.19,-3.63l8.72,0.28l0.19,-0.06l3.12,-2.28l8.75,-0.61l19.94,0.8l14.93,4.75l-3.92,2.01l-9.52,0.27l-13.48,0.6l-0.27,0.2l0.09,0.33l1.26,1.09l0.22,0.07l8.81,-0.67l7.49,2.07l0.19,-0.01l4.68,-1.78l1.76,1.84l-2.59,3.26l-0.01,0.36l0.34,0.11l6.35,-2.2l12.09,-2.32l7.31,1.14l1.17,2.13l-9.9,4.05l-1.43,1.32l-7.91,0.98l-0.26,0.31l0.29,0.29l5.25,0.25l-2.63,3.72l-2.02,3.61l-0.04,0.15l0.08,6.05l0.07,0.19l2.61,3.0l-3.4,0.2l-4.12,1.66l-0.04,0.54l4.5,2.67l0.53,3.9l-2.39,0.42l-0.19,0.48l2.91,3.83l-5.0,0.32l-0.27,0.22l0.12,0.33l2.69,1.84l-0.65,1.35l-3.36,0.71l-3.46,0.01l-0.21,0.51l3.05,3.15l0.02,1.53l-4.54,-1.79l-0.32,0.06l-1.29,1.26l0.11,0.5l3.33,1.15l3.17,2.74l0.85,3.29l-4.0,0.78l-1.83,-1.66l-3.1,-2.64l-0.36,-0.02l-0.13,0.33l0.8,2.92l-2.76,2.26l-0.09,0.33l0.28,0.2l6.59,0.19l2.47,0.18l-5.86,3.38l-6.76,3.43l-7.26,1.48l-2.73,0.02l-0.16,0.05l-2.67,1.72l-3.44,4.42l-5.28,2.86l-1.73,0.18l-3.33,1.01l-3.59,0.96l-0.15,0.1l-2.15,2.52l-0.07,0.19l-0.03,2.76l-1.21,2.49l-4.03,3.1l-0.1,0.33l0.98,2.94l-2.31,6.57l-3.21,0.21l-3.6,-3.0l-0.19,-0.07l-4.9,-0.02l-2.29,-1.97l-1.69,-3.78l-4.31,-4.86l-1.23,-2.52l-0.34,-3.58l-0.08,-0.17l-3.35,-3.67l0.85,-2.92l-0.09,-0.31l-1.5,-1.34l2.33,-4.7l3.67,-1.57l0.15,-0.13l1.02,-1.93l0.52,-3.47l-0.44,-0.31l-2.85,1.57l-1.33,0.64l-2.12,0.59l-2.81,-1.32l-0.15,-2.79l0.88,-2.17l2.09,-0.06l5.07,1.2l0.34,-0.17l-0.11,-0.37l-4.3,-2.9l-2.24,-1.58l-0.25,-0.05l-2.38,0.62l-1.7,-0.93l2.62,-4.1l-0.03,-0.36l-1.51,-1.75l-1.97,-3.3l-3.01,-5.21l-0.1,-0.11l-3.04,-1.85l0.03,-1.94l-0.18,-0.28l-6.82,-3.01l-5.35,-0.38l-6.69,0.21l-6.03,0.37l-2.81,-1.59l-3.84,-2.9l5.94,-1.5l5.01,-0.28l0.28,-0.29l-0.26,-0.31l-10.68,-1.38l-5.38,-2.1l0.27,-1.68l9.3,-2.6l9.18,-2.68l0.19,-0.16l0.97,-2.05l-0.18,-0.42l-6.29,-1.91l1.81,-1.9l8.58,-4.05l3.6,-0.63l0.23,-0.4l-0.92,-2.37l5.59,-1.5l7.66,-0.95l7.58,-0.05l2.65,1.84l0.31,0.02l6.52,-3.29l5.85,2.24l3.55,0.49l5.17,1.95l0.38,-0.16l-0.13,-0.39l-5.77,-3.16l0.29,-2.26Z\", \"name\": \"Greenland\" }, \"KW\": { \"path\": \"M540.87,207.81l0.41,0.94l-0.18,0.51l0.0,0.21l0.65,1.66l-1.15,0.05l-0.54,-1.12l-0.24,-0.17l-1.73,-0.2l1.44,-2.06l1.33,0.18Z\", \"name\": \"Kuwait\" }, \"GH\": { \"path\": \"M423.16,269.88l-3.58,1.34l-1.41,0.87l-2.13,0.69l-1.91,-0.61l0.09,-0.75l-0.03,-0.17l-1.04,-2.07l0.62,-2.7l1.04,-2.08l0.03,-0.19l-1.0,-5.46l0.05,-1.12l4.04,-0.11l1.08,0.18l0.18,-0.03l0.72,-0.36l0.75,0.13l-0.11,0.48l0.06,0.26l0.98,1.22l-0.0,1.77l0.24,1.99l0.05,0.13l0.55,0.81l-0.52,2.14l0.19,1.37l0.69,1.66l0.38,0.62Z\", \"name\": \"Ghana\" }, \"OM\": { \"path\": \"M568.16,231.0l-0.08,0.1l-0.84,1.61l-0.93,-0.11l-0.27,0.11l-0.58,0.73l-0.4,1.32l-0.01,0.14l0.29,1.61l-0.07,0.09l-1.0,-0.01l-0.16,0.04l-1.56,0.97l-0.14,0.2l-0.23,1.17l-0.41,0.4l-1.44,-0.02l-0.17,0.05l-0.98,0.65l-0.13,0.25l0.01,0.87l-0.97,0.57l-1.27,-0.22l-0.19,0.03l-1.63,0.84l-0.88,0.11l-2.55,-5.57l7.2,-2.49l0.19,-0.19l1.67,-5.23l-0.03,-0.25l-1.1,-1.78l0.05,-0.89l0.68,-1.03l0.05,-0.16l0.01,-0.89l0.96,-0.44l0.07,-0.5l-0.32,-0.26l0.16,-1.31l0.85,-0.01l1.03,1.67l0.09,0.09l1.4,0.96l0.11,0.05l1.82,0.34l1.37,0.45l1.75,2.32l0.13,0.1l0.7,0.26l-0.0,0.3l-1.25,2.19l-1.01,0.8ZM561.88,218.47l-0.01,0.02l-0.15,-0.29l0.3,-0.38l-0.14,0.65Z\", \"name\": \"Oman\" }, \"_3\": { \"path\": \"M543.2,261.06l-1.07,1.46l-1.65,1.99l-1.91,0.01l-8.08,-2.95l-0.89,-0.84l-0.9,-1.19l-0.81,-1.23l0.44,-0.73l0.76,-1.12l0.49,0.28l0.52,1.05l1.13,1.06l0.2,0.08l1.24,0.01l2.42,-0.65l2.77,-0.31l2.17,-0.78l1.31,-0.19l0.84,-0.43l1.03,-0.06l-0.01,4.54Z\", \"name\": \"Somaliland\" }, \"_2\": { \"path\": \"M384.23,230.37l0.07,-0.06l0.28,-0.89l0.99,-1.13l0.07,-0.13l0.8,-3.54l3.4,-2.8l0.09,-0.13l0.76,-2.17l0.07,5.5l-2.07,0.21l-0.24,0.17l-0.61,1.36l-0.02,0.16l0.43,3.46l-4.01,-0.01ZM391.82,218.2l0.07,-0.06l0.75,-1.93l1.86,-0.25l0.94,0.34l1.14,0.0l0.18,-0.06l0.73,-0.56l1.41,-0.08l-0.0,2.72l-7.08,-0.12Z\", \"name\": \"Western Sahara\" }, \"_1\": { \"path\": \"M472.71,172.84l-0.07,-0.43l-0.16,-0.22l-0.53,-0.27l-0.38,-0.58l0.3,-0.43l0.51,-0.19l0.18,-0.18l0.3,-0.87l0.12,-0.04l0.22,0.26l0.12,0.09l0.38,0.15l0.28,0.41l0.15,0.12l0.34,0.12l0.43,0.5l0.15,0.07l-0.12,0.3l-0.27,0.32l-0.03,0.18l-0.31,0.06l-1.48,0.47l-0.15,0.17Z\", \"name\": \"Kosovo\" }, \"_0\": { \"path\": \"M503.54,192.92l0.09,-0.17l0.41,0.01l-0.08,0.01l-0.42,0.15ZM504.23,192.76l1.02,0.02l0.4,-0.13l-0.09,0.29l0.03,0.08l-0.35,0.16l-0.24,-0.04l-0.06,-0.1l-0.18,-0.17l-0.19,-0.08l-0.33,-0.02Z\", \"name\": \"Northern Cyprus\" }, \"JO\": { \"path\": \"M510.26,200.93l0.28,-0.57l2.53,1.0l0.27,-0.02l4.57,-2.77l0.84,2.84l-0.28,0.25l-4.95,1.37l-0.14,0.49l2.24,2.48l-0.5,0.28l-0.13,0.14l-0.35,0.78l-1.76,0.35l-0.2,0.14l-0.57,0.94l-0.94,0.73l-2.45,-0.38l-0.03,-0.12l1.23,-4.32l-0.04,-1.1l0.34,-0.75l0.03,-0.12l0.0,-1.63Z\", \"name\": \"Jordan\" }, \"HR\": { \"path\": \"M455.49,162.73l1.53,0.09l0.24,-0.1l0.29,-0.34l0.64,0.38l0.14,0.04l0.98,0.06l0.32,-0.3l-0.01,-0.66l0.67,-0.25l0.19,-0.22l0.21,-1.11l1.72,-0.72l0.65,0.32l1.94,1.37l2.07,0.6l0.22,-0.02l0.67,-0.33l0.47,0.94l0.67,0.76l-0.63,0.77l-0.91,-0.55l-0.16,-0.04l-1.69,0.04l-2.2,-0.51l-1.17,0.07l-0.21,0.11l-0.36,0.42l-0.67,-0.53l-0.46,0.12l-0.52,1.29l0.05,0.31l1.21,1.42l0.58,0.99l1.15,1.14l0.95,0.68l0.92,1.23l0.1,0.09l1.75,0.91l-1.87,-0.89l-1.5,-1.11l-2.23,-0.88l-1.77,-1.9l0.12,-0.06l0.1,-0.47l-1.07,-1.22l-0.04,-0.94l-0.21,-0.27l-1.61,-0.49l-0.35,0.14l-0.53,0.93l-0.41,-0.57l0.04,-0.73Z\", \"name\": \"Croatia\" }, \"HT\": { \"path\": \"M237.82,234.68l1.35,0.1l1.95,0.37l0.18,1.15l-0.16,0.83l-0.51,0.37l-0.06,0.44l0.57,0.68l-0.02,0.22l-1.31,-0.35l-1.26,0.17l-1.49,-0.18l-0.15,0.02l-1.03,0.43l-1.02,-0.61l0.09,-0.36l2.04,0.32l1.9,0.21l0.19,-0.05l0.9,-0.58l0.05,-0.47l-1.05,-1.03l0.02,-0.86l-0.23,-0.3l-1.13,-0.29l0.18,-0.23Z\", \"name\": \"Haiti\" }, \"HU\": { \"path\": \"M461.96,157.92l0.68,-1.66l-0.03,-0.29l-0.15,-0.22l0.84,-0.0l0.3,-0.26l0.12,-0.84l0.88,0.57l0.98,0.38l0.16,0.01l2.1,-0.39l0.23,-0.21l0.14,-0.45l0.88,-0.1l1.06,-0.43l0.13,0.1l0.28,0.04l1.18,-0.4l0.14,-0.1l0.52,-0.67l0.63,-0.15l2.6,0.95l0.26,-0.03l0.38,-0.23l1.12,0.7l0.1,0.49l-1.31,0.57l-0.14,0.13l-1.18,2.14l-1.44,2.04l-1.85,0.55l-1.51,-0.13l-0.14,0.02l-1.92,0.82l-0.85,0.42l-1.91,-0.55l-1.83,-1.31l-0.74,-0.37l-0.44,-0.97l-0.26,-0.18Z\", \"name\": \"Hungary\" }, \"HN\": { \"path\": \"M202.48,251.87l-0.33,-0.62l-0.18,-0.14l-0.5,-0.15l0.13,-0.76l-0.11,-0.28l-0.34,-0.28l-0.6,-0.23l-0.18,-0.01l-0.81,0.22l-0.16,-0.24l-0.72,-0.39l-0.51,-0.48l-0.12,-0.07l-0.31,-0.09l0.24,-0.3l0.04,-0.3l-0.16,-0.4l0.1,-0.28l1.14,-0.69l1.0,-0.86l0.09,0.04l0.3,-0.05l0.47,-0.39l0.49,-0.03l0.14,0.13l0.29,0.06l0.31,-0.1l1.16,0.22l1.24,-0.08l0.81,-0.28l0.29,-0.25l0.63,0.1l0.69,0.18l0.65,-0.06l0.49,-0.2l1.04,0.32l0.38,0.06l0.7,0.44l0.71,0.56l0.92,0.41l0.1,0.11l-0.11,-0.01l-0.23,0.09l-0.3,0.3l-0.76,0.29l-0.58,0.0l-0.15,0.04l-0.45,0.26l-0.31,-0.07l-0.37,-0.34l-0.28,-0.07l-0.26,0.07l-0.18,0.15l-0.23,0.43l-0.04,-0.0l-0.33,0.28l-0.03,0.4l-0.76,0.61l-0.45,0.3l-0.15,0.16l-0.51,-0.36l-0.41,0.06l-0.45,0.56l-0.41,-0.01l-0.59,0.06l-0.27,0.31l0.04,0.96l-0.07,0.0l-0.25,0.16l-0.24,0.45l-0.42,0.06Z\", \"name\": \"Honduras\" }, \"PR\": { \"path\": \"M254.95,238.31l1.15,0.21l0.2,0.23l-0.36,0.36l-1.76,-0.01l-1.2,0.07l-0.09,-0.69l0.17,-0.18l1.89,0.01Z\", \"name\": \"Puerto Rico\" }, \"PS\": { \"path\": \"M509.66,201.06l-0.0,1.44l-0.29,0.63l-0.59,0.19l0.02,-0.11l0.52,-0.31l-0.02,-0.53l-0.41,-0.2l0.36,-1.28l0.41,0.17Z\", \"name\": \"West Bank\" }, \"PT\": { \"path\": \"M398.65,173.6l0.75,-0.63l0.7,-0.3l0.51,1.2l0.28,0.18l1.48,-0.0l0.2,-0.08l0.33,-0.3l1.16,0.08l0.52,1.11l-0.95,0.66l-0.13,0.24l-0.03,2.2l-0.33,0.35l-0.08,0.18l-0.08,1.17l-0.86,0.19l-0.2,0.44l0.93,1.64l-0.64,1.79l0.07,0.31l0.72,0.72l-0.24,0.56l-0.9,1.05l-0.07,0.26l0.17,0.77l-0.73,0.54l-1.18,-0.36l-0.16,-0.0l-0.85,0.21l0.31,-1.81l-0.23,-1.87l-0.23,-0.25l-0.99,-0.24l-0.49,-0.91l0.18,-1.72l0.93,-0.99l0.08,-0.16l0.17,-1.17l0.52,-1.76l-0.04,-1.36l-0.51,-1.14l-0.09,-0.8Z\", \"name\": \"Portugal\" }, \"PY\": { \"path\": \"M264.33,341.43l0.93,-2.96l0.07,-1.42l1.1,-2.1l4.19,-0.73l2.22,0.04l2.12,1.21l0.07,0.76l0.7,1.38l-0.16,3.48l0.24,0.31l2.64,0.5l0.19,-0.03l0.9,-0.45l1.47,0.62l0.38,0.64l0.23,2.35l0.3,1.07l0.25,0.21l0.93,0.12l0.16,-0.02l0.8,-0.37l0.61,0.33l-0.0,1.25l-0.33,1.53l-0.5,1.57l-0.39,2.26l-2.14,1.94l-1.85,0.4l-2.74,-0.4l-2.13,-0.62l2.26,-3.75l0.03,-0.24l-0.36,-1.18l-0.17,-0.19l-2.55,-1.03l-3.04,-1.95l-2.07,-0.43l-4.4,-4.12Z\", \"name\": \"Paraguay\" }, \"PA\": { \"path\": \"M213.65,263.79l0.18,-0.43l0.02,-0.18l-0.06,-0.28l0.23,-0.18l-0.01,-0.48l-0.4,-0.29l-0.01,-0.62l0.57,-0.13l0.68,0.69l-0.04,0.39l0.26,0.33l1.0,0.11l0.27,-0.1l0.49,0.44l0.24,0.07l1.34,-0.22l1.04,-0.62l1.49,-0.5l0.86,-0.73l0.99,0.11l0.18,0.28l1.35,0.08l1.02,0.4l0.78,0.72l0.71,0.53l-0.1,0.12l-0.05,0.3l0.53,1.34l-0.28,0.44l-0.6,-0.13l-0.36,0.22l-0.2,0.76l-0.41,-0.36l-0.44,-1.12l0.49,-0.53l-0.14,-0.49l-0.51,-0.14l-0.41,-0.72l-0.11,-0.11l-1.25,-0.7l-0.19,-0.04l-1.1,0.16l-0.22,0.15l-0.47,0.81l-0.9,0.56l-0.49,0.08l-0.22,0.17l-0.25,0.52l0.05,0.32l0.93,1.07l-0.41,0.21l-0.29,0.3l-0.81,0.09l-0.36,-1.26l-0.53,-0.1l-0.21,0.28l-0.5,-0.09l-0.44,-0.88l-0.22,-0.16l-0.99,-0.16l-0.61,-0.28l-0.13,-0.03l-1.0,0.0Z\", \"name\": \"Panama\" }, \"PG\": { \"path\": \"M808.4,298.6l0.62,0.46l1.19,1.56l1.04,0.77l-0.18,0.37l-0.42,0.15l-0.92,-0.82l-1.05,-1.53l-0.27,-0.96ZM804.09,296.06l-0.3,0.26l-0.36,-1.11l-0.66,-1.06l-2.55,-1.89l-1.42,-0.59l0.17,-0.15l1.16,0.6l0.85,0.55l1.01,0.58l0.97,1.02l0.9,0.76l0.24,1.03ZM796.71,297.99l0.15,0.82l0.34,0.24l1.43,-0.19l0.19,-0.11l0.68,-0.82l1.36,-0.87l0.13,-0.31l-0.21,-1.13l1.04,-0.03l0.3,0.25l-0.04,1.17l-0.74,1.34l-1.17,0.18l-0.22,0.15l-0.35,0.62l-2.51,1.13l-1.21,-0.0l-1.99,-0.71l-1.19,-0.58l0.07,-0.28l1.98,0.32l1.46,-0.2l0.24,-0.21l0.25,-0.79ZM789.24,303.52l0.11,0.15l2.19,1.62l1.6,2.62l0.27,0.14l1.09,-0.06l-0.07,0.77l0.23,0.32l1.23,0.27l-0.14,0.09l0.05,0.53l2.39,0.95l-0.11,0.28l-1.33,0.14l-0.51,-0.55l-0.18,-0.09l-4.59,-0.65l-1.87,-1.55l-1.38,-1.35l-1.28,-2.17l-0.16,-0.13l-3.27,-1.1l-0.19,0.0l-2.12,0.72l-1.58,0.85l-0.15,0.31l0.28,1.63l-1.65,0.73l-1.37,-0.4l-2.3,-0.09l-0.08,-15.65l3.95,1.57l4.58,1.42l1.67,1.25l1.32,1.19l0.36,1.39l0.19,0.21l4.06,1.51l0.39,0.85l-1.9,0.22l-0.25,0.39l0.55,1.68Z\", \"name\": \"Papua New Guinea\" }, \"PE\": { \"path\": \"M246.44,329.21l-0.63,1.25l-1.05,0.54l-2.25,-1.33l-0.19,-0.93l-0.16,-0.21l-4.95,-2.58l-4.46,-2.79l-1.87,-1.52l-0.94,-1.91l0.33,-0.6l-0.01,-0.31l-2.11,-3.33l-2.46,-4.66l-2.36,-5.02l-1.04,-1.18l-0.77,-1.81l-0.08,-0.11l-1.95,-1.64l-1.54,-0.88l0.61,-0.85l0.02,-0.31l-1.15,-2.27l0.69,-1.56l1.59,-1.26l0.12,0.42l-0.56,0.47l-0.11,0.25l0.07,0.92l0.36,0.27l0.97,-0.19l0.85,0.23l0.99,1.19l0.41,0.05l1.42,-1.03l0.11,-0.16l0.46,-1.64l1.45,-2.06l2.92,-0.96l0.11,-0.07l2.73,-2.62l0.84,-1.72l0.02,-0.18l-0.3,-1.65l0.28,-0.1l1.49,1.06l0.77,1.14l0.1,0.09l1.08,0.6l1.43,2.55l0.21,0.15l1.86,0.31l0.18,-0.03l1.25,-0.6l0.77,0.37l0.17,0.03l1.4,-0.2l1.57,0.96l-1.45,2.29l0.23,0.46l0.63,0.05l0.66,0.7l-1.51,-0.08l-0.24,0.1l-0.27,0.31l-1.96,0.46l-2.95,1.74l-0.14,0.21l-0.17,1.1l-0.6,0.82l-0.05,0.23l0.21,1.13l-1.31,0.63l-0.17,0.27l0.0,0.91l-0.53,0.37l-0.1,0.37l1.04,2.27l1.31,1.46l-0.44,0.9l0.24,0.43l1.52,0.13l0.87,1.23l0.24,0.13l2.21,0.07l0.18,-0.06l1.55,-1.13l-0.14,3.22l0.23,0.3l1.14,0.29l0.16,-0.0l1.18,-0.36l1.97,3.71l-0.45,0.71l-0.04,0.14l-0.12,1.8l-0.05,2.07l-0.92,1.2l-0.03,0.31l0.38,0.8l-0.48,0.72l-0.02,0.3l1.01,2.02l-1.5,2.64Z\", \"name\": \"Peru\" }, \"PK\": { \"path\": \"M609.08,187.76l1.66,1.21l0.71,2.11l0.2,0.19l3.62,1.01l-1.98,1.95l-2.65,0.4l-3.75,-0.68l-0.26,0.08l-1.23,1.22l-0.07,0.31l0.89,2.46l0.88,1.92l0.1,0.12l1.67,1.14l-1.8,1.35l-0.12,0.25l0.04,1.85l-2.35,2.67l-1.59,2.79l-2.5,2.72l-2.76,-0.2l-0.24,0.09l-2.76,2.83l0.04,0.45l1.54,1.13l0.27,1.94l0.09,0.17l1.34,1.29l0.4,1.83l-5.14,-0.01l-0.22,0.09l-1.53,1.63l-1.52,-0.56l-0.76,-1.88l-1.93,-2.03l-0.25,-0.09l-4.6,0.5l-4.05,0.05l-3.1,0.33l0.77,-2.53l3.48,-1.33l0.19,-0.33l-0.21,-1.24l-0.19,-0.23l-1.01,-0.37l-0.06,-2.18l-0.17,-0.26l-2.32,-1.16l-0.96,-1.57l-0.56,-0.65l3.16,1.05l0.14,0.01l2.45,-0.4l1.44,0.33l0.3,-0.1l0.4,-0.47l1.58,0.22l0.14,-0.01l3.25,-1.14l0.2,-0.27l0.08,-2.23l1.23,-1.38l1.73,0.0l0.28,-0.2l0.22,-0.61l1.68,-0.32l0.86,0.24l0.27,-0.05l0.98,-0.78l0.11,-0.26l-0.13,-1.57l0.96,-1.52l1.51,-0.67l0.14,-0.41l-0.74,-1.4l1.86,0.07l0.26,-0.13l0.69,-1.01l0.05,-0.2l-0.09,-0.94l1.14,-1.09l0.09,-0.28l-0.29,-1.41l-0.51,-1.07l1.23,-1.05l2.6,-0.58l2.86,-0.33l1.33,-0.54l1.3,-0.29Z\", \"name\": \"Pakistan\" }, \"PH\": { \"path\": \"M737.11,263.82l0.25,1.66l0.14,1.34l-0.54,1.46l-0.64,-1.79l-0.5,-0.1l-1.17,1.28l-0.05,0.32l0.74,1.71l-0.49,0.81l-2.6,-1.28l-0.61,-1.57l0.68,-1.07l-0.07,-0.4l-1.59,-1.19l-0.42,0.06l-0.69,0.91l-1.01,-0.08l-0.21,0.06l-1.58,1.2l-0.17,-0.3l0.87,-1.88l1.48,-0.66l1.18,-0.81l0.71,0.92l0.34,0.1l1.9,-0.69l0.18,-0.18l0.34,-0.94l1.57,-0.06l0.29,-0.32l-0.1,-1.38l1.41,0.83l0.36,2.06ZM734.94,254.42l0.56,2.24l-1.41,-0.49l-0.4,0.3l0.07,0.94l0.51,1.3l-0.54,0.26l-0.08,-1.34l-0.25,-0.28l-0.56,-0.1l-0.23,-0.91l1.03,0.14l0.34,-0.31l-0.03,-0.96l-0.06,-0.18l-1.14,-1.44l1.62,0.04l0.57,0.78ZM724.68,238.33l1.48,0.71l0.33,-0.04l0.44,-0.38l0.05,0.13l-0.37,0.97l0.01,0.23l0.81,1.75l-0.59,1.92l-1.37,0.79l-0.14,0.2l-0.39,2.07l0.01,0.14l0.56,2.04l0.23,0.21l1.33,0.28l0.14,-0.0l1.0,-0.27l2.82,1.28l-0.2,1.16l0.12,0.29l0.66,0.5l-0.13,0.56l-1.54,-0.99l-0.89,-1.29l-0.49,0.0l-0.44,0.65l-1.34,-1.28l-0.26,-0.08l-2.18,0.36l-0.96,-0.44l0.09,-0.72l0.69,-0.57l-0.01,-0.47l-0.75,-0.59l-0.47,0.14l-0.15,0.43l-0.86,-1.02l-0.34,-1.02l-0.07,-1.74l0.49,0.41l0.49,-0.21l0.26,-3.99l0.73,-2.1l1.23,0.0ZM731.12,258.92l-0.82,0.75l-0.83,1.64l-0.52,0.5l-1.17,-1.33l0.36,-0.47l0.62,-0.7l0.07,-0.15l0.24,-1.35l0.73,-0.08l-0.31,1.29l0.16,0.34l0.37,-0.09l1.21,-1.6l-0.12,1.24ZM726.66,255.58l0.85,0.45l0.14,0.03l1.28,-0.0l-0.03,0.62l-1.04,0.96l-1.15,0.55l-0.05,-0.71l0.17,-1.26l-0.01,-0.13l-0.16,-0.51ZM724.92,252.06l-0.45,1.5l-0.7,-0.83l-0.95,-1.43l1.44,0.06l0.67,0.7ZM717.48,261.28l-1.87,1.35l0.21,-0.3l1.81,-1.57l1.5,-1.75l0.97,-1.84l0.23,1.08l-1.56,1.33l-1.29,1.7Z\", \"name\": \"Philippines\" }, \"PL\": { \"path\": \"M458.8,144.25l-0.96,-1.98l0.18,-1.06l-0.01,-0.15l-0.62,-1.8l-0.82,-1.11l0.56,-0.73l0.05,-0.28l-0.51,-1.51l1.48,-0.87l3.88,-1.58l3.06,-1.14l2.23,0.52l0.15,0.66l0.29,0.23l2.4,0.04l3.11,0.39l4.56,-0.05l1.12,0.32l0.51,0.89l0.1,1.45l0.03,0.12l0.66,1.23l-0.01,1.08l-1.33,0.61l-0.14,0.41l0.74,1.5l0.07,1.53l1.22,2.79l-0.19,0.66l-1.09,0.33l-0.14,0.09l-2.27,2.72l-0.04,0.31l0.35,0.8l-2.22,-1.16l-0.21,-0.02l-1.72,0.44l-1.1,-0.31l-0.21,0.02l-1.3,0.61l-1.11,-1.02l-0.32,-0.05l-0.81,0.35l-1.15,-1.61l-0.21,-0.12l-1.65,-0.17l-0.19,-0.82l-0.23,-0.23l-1.72,-0.37l-0.34,0.17l-0.25,0.56l-0.88,-0.44l0.12,-0.69l-0.25,-0.35l-1.78,-0.27l-1.08,-0.97Z\", \"name\": \"Poland\" }, \"ZM\": { \"path\": \"M502.81,308.32l1.09,1.04l0.58,1.94l-0.39,0.66l-0.5,2.05l-0.0,0.14l0.45,1.95l-0.69,0.77l-0.06,0.11l-0.76,2.37l0.15,0.36l0.62,0.31l-6.85,1.9l-0.22,0.33l0.2,1.54l-1.62,0.3l-0.12,0.05l-1.43,1.02l-0.11,0.15l-0.25,0.73l-0.73,0.17l-0.14,0.08l-2.18,2.12l-1.33,1.6l-0.65,0.05l-0.83,-0.29l-2.75,-0.28l-0.24,-0.1l-0.15,-0.27l-0.99,-0.58l-0.12,-0.04l-1.73,-0.14l-1.88,0.54l-1.5,-1.48l-1.61,-2.01l0.11,-7.73l4.92,0.03l0.29,-0.37l-0.19,-0.79l0.34,-0.86l0.0,-0.21l-0.41,-1.11l0.26,-1.14l-0.01,-0.16l-0.12,-0.36l0.18,0.01l0.1,0.56l0.31,0.25l1.14,-0.06l1.44,0.21l0.76,1.05l0.19,0.12l2.01,0.35l0.19,-0.03l1.24,-0.65l0.44,1.03l0.22,0.18l1.81,0.34l0.85,0.99l1.02,1.39l0.24,0.12l1.92,0.02l0.3,-0.32l-0.21,-2.74l-0.47,-0.23l-0.53,0.36l-1.58,-0.89l-0.51,-0.34l0.29,-2.36l0.44,-2.99l-0.03,-0.18l-0.5,-0.99l0.61,-1.38l0.53,-0.24l3.26,-0.41l0.89,0.23l1.01,0.62l1.04,0.44l1.6,0.43l1.35,0.72Z\", \"name\": \"Zambia\" }, \"EE\": { \"path\": \"M482.19,120.88l0.23,-1.68l-0.43,-0.31l-0.75,0.37l-1.34,-1.1l-0.18,-1.75l2.92,-0.95l3.07,-0.53l2.66,0.6l2.48,-0.1l0.18,0.31l-1.65,1.96l-0.06,0.26l0.71,3.25l-0.88,0.94l-1.85,-0.01l-2.08,-1.3l-1.14,-0.47l-0.2,-0.01l-1.69,0.51Z\", \"name\": \"Estonia\" }, \"EG\": { \"path\": \"M508.07,208.8l-0.66,1.06l-0.53,2.03l-0.64,1.32l-0.32,0.26l-1.74,-1.85l-1.77,-3.86l-0.48,-0.09l-0.26,0.25l-0.07,0.32l1.04,2.88l1.55,2.76l1.89,4.18l0.94,1.48l0.83,1.54l2.08,2.73l-0.3,0.28l-0.1,0.23l0.08,1.72l0.11,0.22l2.91,2.37l-28.78,0.0l0.0,-19.06l-0.73,-2.2l0.61,-1.59l0.0,-0.2l-0.34,-1.04l0.73,-1.08l3.13,-0.04l2.36,0.72l2.48,0.81l1.15,0.43l0.23,-0.01l1.93,-0.87l1.02,-0.78l2.08,-0.21l1.59,0.31l0.62,1.24l0.52,0.03l0.46,-0.71l1.86,0.59l1.95,0.16l0.17,-0.04l0.92,-0.52l1.48,4.24Z\", \"name\": \"Egypt\" }, \"ZA\": { \"path\": \"M467.06,373.27l-0.13,-0.29l0.01,-1.58l-0.02,-0.12l-0.71,-1.64l0.59,-0.37l0.14,-0.26l-0.07,-2.13l-0.05,-0.15l-1.63,-2.58l-1.25,-2.31l-1.71,-3.37l0.88,-0.98l0.7,0.52l0.39,1.08l0.23,0.19l1.1,0.19l1.55,0.51l0.14,0.01l1.35,-0.2l0.11,-0.04l2.24,-1.39l0.14,-0.25l0.0,-9.4l0.16,0.09l1.39,2.38l-0.22,1.53l0.04,0.19l0.56,0.94l0.3,0.14l1.79,-0.27l0.16,-0.08l1.23,-1.18l1.17,-0.79l0.1,-0.12l0.57,-1.19l1.02,-0.52l0.9,0.28l1.16,0.73l0.14,0.05l2.04,0.13l0.13,-0.02l1.6,-0.62l0.18,-0.19l0.63,-1.93l1.18,-0.19l0.19,-0.12l0.78,-1.05l0.81,-1.71l2.18,-1.91l3.44,-1.88l0.89,0.02l1.17,0.43l0.21,-0.0l0.76,-0.29l1.07,0.21l1.15,3.55l0.63,1.82l-0.44,2.9l0.1,0.52l-0.74,-0.29l-0.18,-0.01l-0.72,0.19l-0.21,0.2l-0.22,0.74l-0.66,0.97l-0.05,0.18l0.02,0.93l0.09,0.21l1.49,1.46l0.27,0.08l1.47,-0.29l0.22,-0.18l0.43,-1.01l1.29,0.02l-0.51,1.63l-0.29,2.2l-0.59,1.12l-2.2,1.78l-1.06,1.39l-0.72,1.44l-1.39,1.93l-2.81,2.84l-1.75,1.65l-1.85,1.24l-2.55,1.06l-1.23,0.14l-0.24,0.18l-0.22,0.54l-1.27,-0.35l-0.2,0.01l-1.15,0.5l-2.62,-0.52l-0.12,0.0l-1.46,0.33l-0.98,-0.14l-0.16,0.02l-2.55,1.1l-2.11,0.44l-1.59,1.07l-0.93,0.06l-0.97,-0.92l-0.19,-0.08l-0.72,-0.04l-1.0,-1.16l-0.25,0.05ZM493.72,359.24l-1.12,-0.86l-0.31,-0.03l-1.23,0.59l-1.36,1.07l-1.39,1.78l0.01,0.38l1.88,2.11l0.31,0.09l0.9,-0.27l0.18,-0.15l0.4,-0.77l1.28,-0.39l0.18,-0.16l0.42,-0.88l0.76,-1.32l-0.05,-0.37l-0.87,-0.82Z\", \"name\": \"South Africa\" }, \"EC\": { \"path\": \"M220.2,293.48l1.25,-1.76l0.02,-0.31l-0.54,-1.09l-0.5,-0.06l-0.78,0.94l-1.03,-0.75l0.33,-0.46l0.05,-0.23l-0.38,-2.04l0.66,-0.28l0.17,-0.19l0.45,-1.52l0.93,-1.58l0.04,-0.2l-0.13,-0.78l1.19,-0.47l1.57,-0.91l2.35,1.34l0.17,0.04l0.28,-0.02l0.52,0.91l0.21,0.15l2.12,0.35l0.2,-0.03l0.55,-0.31l1.08,0.73l0.97,0.54l0.31,1.67l-0.71,1.49l-2.64,2.54l-2.95,0.97l-0.15,0.11l-1.53,2.18l-0.49,1.68l-1.1,0.8l-0.87,-1.05l-0.15,-0.1l-1.01,-0.27l-0.13,-0.0l-0.7,0.14l-0.03,-0.43l0.6,-0.5l0.1,-0.31l-0.26,-0.91Z\", \"name\": \"Ecuador\" }, \"AL\": { \"path\": \"M470.27,171.7l0.38,0.19l0.45,-0.18l0.4,0.61l0.11,0.1l0.46,0.24l0.13,0.87l-0.3,0.95l-0.0,0.17l0.36,1.28l0.12,0.17l0.9,0.63l-0.03,0.44l-0.67,0.35l-0.16,0.22l-0.14,0.88l-0.96,1.18l-0.06,-0.03l-0.04,-0.48l-0.12,-0.22l-1.28,-0.92l-0.19,-1.25l0.2,-1.96l0.33,-0.89l-0.06,-0.3l-0.36,-0.41l-0.13,-0.75l0.66,-0.9Z\", \"name\": \"Albania\" }, \"AO\": { \"path\": \"M461.62,299.93l0.55,1.67l0.73,1.54l1.56,2.18l0.28,0.12l1.66,-0.2l0.81,-0.34l1.28,0.33l0.33,-0.14l0.39,-0.67l0.56,-1.3l1.37,-0.09l0.27,-0.21l0.07,-0.23l0.67,-0.01l-0.13,0.53l0.29,0.37l2.74,-0.02l0.04,1.29l0.03,0.13l0.46,0.87l-0.35,1.52l0.18,1.55l0.07,0.16l0.75,0.85l-0.13,2.89l0.41,0.29l0.56,-0.21l1.11,0.05l1.5,-0.37l0.9,0.12l0.18,0.53l-0.27,1.15l0.01,0.17l0.4,1.08l-0.33,0.85l-0.01,0.18l0.12,0.51l-4.83,-0.03l-0.3,0.3l-0.12,8.13l0.07,0.19l1.69,2.1l1.27,1.25l-4.03,0.92l-5.93,-0.36l-1.66,-1.19l-0.18,-0.06l-10.15,0.11l-0.34,0.13l-1.35,-1.05l-0.17,-0.06l-1.62,-0.08l-1.6,0.45l-0.88,0.36l-0.17,-1.2l0.34,-2.19l0.85,-2.32l0.14,-1.13l0.79,-2.24l0.57,-1.0l1.42,-1.64l0.82,-1.15l0.05,-0.13l0.26,-1.88l-0.13,-1.51l-0.07,-0.16l-0.72,-0.87l-1.23,-2.91l0.09,-0.37l0.73,-0.95l0.05,-0.27l-1.27,-4.12l-1.19,-1.54l0.1,-0.2l0.86,-0.28l0.78,0.03l0.83,-0.29l7.12,0.03ZM451.81,298.94l-0.17,0.07l-0.5,-1.42l0.85,-0.92l0.53,-0.29l0.48,0.44l-0.56,0.32l-0.1,0.1l-0.41,0.65l-0.05,0.14l-0.07,0.91Z\", \"name\": \"Angola\" }, \"KZ\": { \"path\": \"M598.42,172.08l-1.37,0.54l-3.3,2.09l-0.11,0.12l-1.01,1.97l-0.56,0.01l-0.6,-1.24l-0.26,-0.17l-2.95,-0.09l-0.46,-2.22l-0.29,-0.24l-0.91,-0.02l0.17,-2.72l-0.12,-0.26l-3.0,-2.22l-0.2,-0.06l-4.29,0.24l-2.8,0.42l-2.36,-2.7l-6.4,-3.65l-0.23,-0.03l-6.45,1.83l-0.22,0.29l0.1,10.94l-0.84,0.1l-1.65,-2.21l-0.11,-0.09l-1.69,-0.84l-0.2,-0.02l-2.84,0.63l-0.14,0.07l-0.71,0.64l-0.02,-0.11l0.57,-1.17l0.0,-0.26l-0.48,-1.05l-0.17,-0.16l-2.78,-0.99l-1.08,-2.62l-0.13,-0.15l-1.24,-0.7l-0.04,-0.48l2.07,0.25l0.34,-0.29l0.09,-2.03l1.84,-0.44l2.12,0.45l0.36,-0.25l0.45,-3.04l-0.45,-2.06l-0.31,-0.23l-2.44,0.15l-2.07,-0.75l-0.23,0.01l-2.88,1.38l-2.21,0.62l-0.96,-0.38l0.22,-1.39l-0.06,-0.23l-1.6,-2.12l-0.25,-0.12l-1.72,0.08l-1.87,-1.91l1.33,-2.24l-0.06,-0.38l-0.55,-0.5l1.72,-3.08l2.3,1.7l0.48,-0.2l0.29,-2.26l4.99,-3.48l3.76,-0.08l5.46,2.27l2.96,1.33l0.26,-0.01l2.59,-1.36l3.82,-0.06l3.13,1.67l0.38,-0.09l0.63,-0.85l3.36,0.14l0.29,-0.19l0.63,-1.57l-0.13,-0.37l-3.64,-2.05l2.0,-1.36l0.1,-0.38l-0.32,-0.62l2.09,-0.76l0.13,-0.47l-1.65,-2.13l0.89,-0.91l9.27,-1.18l0.13,-0.05l1.17,-0.82l6.2,-1.27l2.26,-1.43l4.19,0.7l0.74,3.39l0.38,0.22l2.52,-0.81l2.9,1.06l-0.18,1.63l0.32,0.33l2.52,-0.23l5.0,-2.58l0.03,0.39l3.16,2.62l5.57,8.48l0.49,0.02l1.18,-1.53l3.22,1.78l0.21,0.03l3.5,-0.83l1.21,0.52l1.16,1.82l0.15,0.12l1.67,0.61l1.01,1.32l0.28,0.11l3.04,-0.41l1.1,1.64l-1.68,1.89l-1.97,0.28l-0.26,0.29l-0.12,3.09l-1.2,1.23l-4.81,-1.01l-0.35,0.2l-1.77,5.51l-1.14,0.62l-4.92,1.23l-0.2,0.41l2.14,5.06l-1.45,0.67l-0.17,0.31l0.15,1.28l-1.05,-0.3l-1.21,-1.04l-0.17,-0.07l-3.73,-0.32l-4.15,-0.08l-0.92,0.31l-3.46,-1.24l-0.22,0.01l-1.42,0.63l-0.17,0.21l-0.32,1.49l-3.82,-0.97l-0.15,0.0l-1.65,0.43l-0.2,0.17l-0.51,1.21Z\", \"name\": \"Kazakhstan\" }, \"ET\": { \"path\": \"M516.0,247.63l1.21,0.92l0.3,0.04l1.3,-0.53l0.46,0.41l0.19,0.08l1.65,0.03l2.05,0.96l0.67,0.88l1.07,0.79l1.0,1.45l0.7,0.68l-0.72,0.92l-0.85,1.19l-0.04,0.25l0.19,0.67l0.04,0.74l0.29,0.28l1.4,0.04l0.55,-0.15l0.23,0.19l-0.41,0.67l0.01,0.32l0.92,1.39l0.93,1.23l0.99,0.94l0.1,0.06l8.19,2.99l1.51,0.01l-6.51,6.95l-3.14,0.11l-0.18,0.06l-2.15,1.71l-1.51,0.04l-0.22,0.1l-0.6,0.69l-1.46,-0.0l-0.93,-0.78l-0.32,-0.04l-2.29,1.05l-0.12,0.1l-0.64,0.9l-1.44,-0.17l-0.51,-0.26l-0.17,-0.03l-0.56,0.07l-0.68,-0.02l-3.1,-2.08l-0.17,-0.05l-1.62,0.0l-0.68,-0.65l0.0,-1.28l-0.21,-0.29l-1.19,-0.38l-1.42,-2.63l-0.13,-0.12l-1.05,-0.53l-0.46,-1.0l-1.27,-1.23l-0.17,-0.08l-1.08,-0.13l0.53,-0.9l1.17,-0.05l0.26,-0.17l0.37,-0.77l0.03,-0.14l-0.03,-2.23l0.7,-2.49l1.08,-0.65l0.14,-0.19l0.24,-1.0l1.03,-1.85l1.47,-1.22l0.09,-0.12l1.02,-2.51l0.36,-1.96l2.62,0.48l0.33,-0.18l0.63,-1.55Z\", \"name\": \"Ethiopia\" }, \"ZW\": { \"path\": \"M498.95,341.2l-1.16,-0.23l-0.16,0.01l-0.74,0.28l-1.11,-0.41l-1.02,-0.04l-1.52,-1.13l-0.12,-0.05l-1.79,-0.37l-0.65,-1.46l-0.01,-0.86l-0.22,-0.29l-0.99,-0.26l-2.74,-2.77l-0.77,-1.46l-0.52,-0.5l-0.72,-1.54l2.24,0.23l0.78,0.28l0.12,0.02l0.85,-0.06l0.21,-0.11l1.38,-1.66l2.11,-2.05l0.81,-0.18l0.22,-0.2l0.27,-0.8l1.29,-0.93l1.53,-0.28l0.11,0.66l0.3,0.25l2.02,-0.05l1.04,0.48l0.5,0.59l0.18,0.1l1.13,0.18l1.11,0.7l0.01,3.06l-0.49,1.82l-0.11,1.94l0.03,0.16l0.35,0.68l-0.24,1.3l-0.27,0.17l-0.12,0.15l-0.64,1.83l-2.49,2.8Z\", \"name\": \"Zimbabwe\" }, \"ES\": { \"path\": \"M398.67,172.8l0.09,-1.45l-0.06,-0.2l-0.82,-1.05l3.16,-1.96l3.01,0.54l3.33,-0.02l2.64,0.52l2.14,-0.15l3.9,0.1l0.91,1.08l0.14,0.09l4.61,1.38l0.26,-0.04l0.77,-0.55l2.66,1.29l0.17,0.03l2.59,-0.35l0.1,1.28l-2.2,1.85l-3.13,0.62l-0.23,0.23l-0.21,0.92l-1.54,1.68l-0.97,2.4l0.02,0.26l0.85,1.46l-1.27,1.14l-0.09,0.14l-0.5,1.73l-1.73,0.53l-0.15,0.1l-1.68,2.1l-3.03,0.04l-2.38,-0.05l-0.17,0.05l-1.57,1.01l-0.9,1.01l-0.96,-0.19l-0.82,-0.86l-0.69,-1.6l-0.22,-0.18l-2.14,-0.41l-0.13,-0.62l0.83,-0.97l0.39,-0.86l-0.06,-0.33l-0.73,-0.73l0.63,-1.74l-0.02,-0.25l-0.8,-1.41l0.69,-0.15l0.23,-0.27l0.09,-1.29l0.33,-0.36l0.08,-0.2l0.03,-2.16l1.03,-0.72l0.1,-0.37l-0.7,-1.5l-0.25,-0.17l-1.46,-0.11l-0.22,0.07l-0.34,0.3l-1.17,0.0l-0.55,-1.29l-0.39,-0.16l-1.02,0.44l-0.45,0.36Z\", \"name\": \"Spain\" }, \"ER\": { \"path\": \"M527.15,253.05l-0.77,-0.74l-1.01,-1.47l-1.14,-0.86l-0.62,-0.84l-0.11,-0.09l-2.18,-1.02l-0.12,-0.03l-1.61,-0.03l-0.52,-0.46l-0.31,-0.05l-1.31,0.54l-1.38,-1.06l-0.46,0.12l-0.69,1.68l-2.49,-0.46l-0.2,-0.76l1.06,-3.69l0.24,-1.65l0.66,-0.66l1.76,-0.4l0.16,-0.1l0.97,-1.13l1.24,2.55l0.68,2.34l0.09,0.14l1.4,1.27l3.39,2.4l1.37,1.43l2.14,2.34l0.94,0.6l-0.32,0.26l-0.85,-0.17Z\", \"name\": \"Eritrea\" }, \"ME\": { \"path\": \"M469.05,172.9l-0.57,-0.8l-0.1,-0.09l-0.82,-0.46l0.16,-0.33l0.35,-1.57l0.72,-0.62l0.27,-0.16l0.48,0.38l0.35,0.4l0.12,0.08l0.79,0.32l0.66,0.43l-0.43,0.62l-0.28,0.11l-0.07,-0.25l-0.53,-0.1l-1.09,1.49l-0.05,0.23l0.06,0.32Z\", \"name\": \"Montenegro\" }, \"MD\": { \"path\": \"M488.2,153.75l0.14,-0.11l1.49,-0.28l1.75,0.95l1.06,0.14l0.92,0.7l-0.15,0.9l0.15,0.31l0.8,0.46l0.33,1.2l0.09,0.14l0.72,0.66l-0.11,0.28l0.1,0.33l-0.06,0.02l-1.25,-0.08l-0.17,-0.29l-0.39,-0.12l-0.52,0.25l-0.16,0.36l0.13,0.42l-0.6,0.88l-0.43,1.03l-0.22,0.12l-0.32,-1.0l0.25,-1.34l-0.08,-1.38l-0.06,-0.17l-1.43,-1.87l-0.81,-1.36l-0.78,-0.95l-0.12,-0.09l-0.29,-0.12Z\", \"name\": \"Moldova\" }, \"MG\": { \"path\": \"M544.77,316.45l0.64,1.04l0.6,1.62l0.4,3.04l0.63,1.21l-0.22,1.07l-0.15,0.26l-0.59,-1.05l-0.52,-0.01l-0.47,0.76l-0.04,0.23l0.46,1.84l-0.19,0.92l-0.61,0.53l-0.1,0.21l-0.16,2.15l-0.97,2.98l-1.24,3.59l-1.55,4.97l-0.96,3.67l-1.08,2.93l-1.94,0.61l-2.05,1.06l-3.2,-1.53l-0.62,-1.26l-0.18,-2.39l-0.87,-2.07l-0.22,-1.8l0.4,-1.69l1.01,-0.4l0.19,-0.28l0.01,-0.79l1.15,-1.91l0.04,-0.11l0.23,-1.66l-0.03,-0.17l-0.57,-1.21l-0.46,-1.58l-0.19,-2.25l0.82,-1.36l0.33,-1.51l1.11,-0.1l1.4,-0.53l0.9,-0.45l1.03,-0.03l0.21,-0.09l1.41,-1.45l2.12,-1.65l0.75,-1.29l0.03,-0.24l-0.17,-0.56l0.53,0.15l0.32,-0.1l1.38,-1.77l0.06,-0.18l0.04,-1.44l0.54,-0.74l0.62,0.77Z\", \"name\": \"Madagascar\" }, \"MA\": { \"path\": \"M378.66,230.13l0.07,-0.75l0.93,-0.72l0.82,-1.37l0.04,-0.21l-0.14,-0.8l0.8,-1.74l1.33,-1.61l0.79,-0.4l0.14,-0.15l0.66,-1.55l0.08,-1.46l0.83,-1.52l1.6,-0.94l0.11,-0.11l1.56,-2.71l1.2,-0.99l2.24,-0.29l0.17,-0.08l1.95,-1.83l1.3,-0.77l2.09,-2.28l0.07,-0.26l-0.61,-3.34l0.92,-2.3l0.33,-1.44l1.52,-1.79l2.48,-1.27l1.86,-1.16l0.1,-0.11l1.67,-2.93l0.72,-1.59l1.54,0.01l1.43,1.14l0.21,0.06l2.33,-0.19l2.55,0.62l0.97,0.03l0.83,1.6l0.15,1.71l0.86,2.96l0.09,0.14l0.5,0.45l-0.31,0.73l-3.11,0.44l-0.16,0.07l-1.07,0.97l-1.36,0.23l-0.25,0.28l-0.1,1.85l-2.74,1.02l-0.14,0.11l-0.9,1.3l-1.93,0.69l-2.56,0.44l-4.04,2.01l-0.17,0.27l0.02,2.91l-0.08,0.0l-0.3,0.31l0.05,1.15l-1.25,0.07l-0.16,0.06l-0.73,0.55l-0.98,0.0l-0.85,-0.33l-0.15,-0.02l-2.11,0.29l-0.24,0.19l-0.76,1.95l-0.63,0.16l-0.21,0.19l-1.15,3.29l-3.42,2.81l-0.1,0.17l-0.81,3.57l-0.98,1.12l-0.3,0.85l-5.13,0.19Z\", \"name\": \"Morocco\" }, \"UZ\": { \"path\": \"M587.83,186.48l0.06,-1.46l-0.19,-0.29l-3.31,-1.24l-2.57,-1.4l-1.63,-1.38l-2.79,-1.98l-1.2,-2.98l-0.12,-0.14l-0.84,-0.54l-0.18,-0.05l-2.61,0.13l-0.76,-0.48l-0.25,-2.25l-0.17,-0.24l-3.37,-1.6l-0.32,0.04l-2.08,1.73l-2.11,1.02l-0.16,0.35l0.31,1.14l-2.14,0.03l-0.09,-10.68l6.1,-1.74l6.25,3.57l2.36,2.72l0.27,0.1l2.92,-0.44l4.17,-0.23l2.78,2.06l-0.18,2.87l0.29,0.32l0.98,0.02l0.46,2.22l0.28,0.24l3.0,0.09l0.61,1.25l0.28,0.17l0.93,-0.02l0.26,-0.16l1.06,-2.06l3.21,-2.03l1.3,-0.5l0.19,0.08l-1.75,1.62l0.05,0.48l1.85,1.12l0.27,0.02l1.65,-0.69l2.4,1.27l-2.69,1.79l-1.79,-0.27l-0.89,0.06l-0.22,-0.52l0.48,-1.26l-0.34,-0.4l-3.35,0.69l-0.22,0.18l-0.78,1.87l-1.07,1.47l-1.93,-0.13l-0.29,0.16l-0.65,1.29l0.16,0.42l1.69,0.64l0.48,1.91l-1.25,2.6l-1.64,-0.53l-1.18,-0.03Z\", \"name\": \"Uzbekistan\" }, \"MM\": { \"path\": \"M670.1,233.39l-1.46,1.11l-1.68,0.11l-0.26,0.19l-1.1,2.7l-0.95,0.42l-0.14,0.42l1.21,2.27l1.61,1.92l0.94,1.55l-0.82,1.99l-0.77,0.42l-0.13,0.39l0.64,1.35l1.62,1.97l0.26,1.32l-0.04,1.15l0.02,0.13l0.92,2.18l-1.3,2.23l-0.79,1.69l-0.1,-0.77l0.74,-1.87l-0.02,-0.26l-0.8,-1.42l0.2,-2.68l-0.06,-0.2l-0.98,-1.27l-0.8,-2.98l-0.45,-3.22l-1.11,-2.22l-0.45,-0.1l-1.64,1.28l-2.74,1.76l-1.26,-0.2l-1.27,-0.49l0.79,-2.93l0.0,-0.14l-0.52,-2.42l-1.93,-2.97l0.26,-0.8l-0.22,-0.39l-1.37,-0.31l-1.65,-1.98l-0.12,-1.5l0.41,0.19l0.42,-0.26l0.05,-1.7l1.08,-0.54l0.16,-0.34l-0.24,-1.0l0.5,-0.79l0.05,-0.15l0.08,-2.35l1.58,0.49l0.36,-0.15l1.12,-2.19l0.15,-1.34l1.35,-2.18l0.04,-0.17l-0.07,-1.35l2.97,-1.71l1.67,0.45l0.38,-0.33l-0.18,-1.46l0.7,-0.4l0.15,-0.32l-0.13,-0.72l0.94,-0.13l0.74,1.41l0.11,0.12l0.95,0.56l0.07,1.89l-0.09,2.08l-2.28,2.15l-0.09,0.19l-0.3,3.15l0.35,0.32l2.37,-0.39l0.53,2.17l0.2,0.21l1.3,0.42l-0.63,1.9l0.14,0.36l1.86,0.99l1.1,0.49l0.24,0.0l1.45,-0.6l0.04,0.51l-2.01,1.6l-0.56,0.96l-1.34,0.56Z\", \"name\": \"Myanmar\" }, \"ML\": { \"path\": \"M390.79,248.2l0.67,-0.37l0.14,-0.18l0.36,-1.31l0.51,-0.04l1.68,0.69l0.21,0.0l1.34,-0.48l0.89,0.16l0.3,-0.13l0.29,-0.44l9.89,-0.04l0.29,-0.21l0.56,-1.8l-0.11,-0.33l-0.33,-0.24l-2.37,-22.1l3.41,-0.04l8.37,5.73l8.38,5.68l0.56,1.15l0.14,0.14l1.56,0.75l0.99,0.36l0.03,1.45l0.33,0.29l2.45,-0.22l0.01,5.52l-1.3,1.64l-0.06,0.15l-0.18,1.37l-1.99,0.36l-3.4,0.22l-0.19,0.09l-0.85,0.83l-1.48,0.09l-1.49,0.01l-0.54,-0.43l-0.26,-0.05l-1.38,0.36l-2.39,1.08l-0.13,0.12l-0.44,0.73l-1.88,1.11l-0.11,0.12l-0.3,0.57l-0.86,0.42l-1.1,-0.31l-0.28,0.07l-0.69,0.62l-0.09,0.16l-0.35,1.66l-1.93,2.04l-0.08,0.23l0.05,0.76l-0.63,0.99l-0.04,0.19l0.14,1.23l-0.81,0.29l-0.32,0.17l-0.27,-0.75l-0.39,-0.18l-0.65,0.26l-0.36,-0.04l-0.29,0.14l-0.37,0.6l-1.69,-0.02l-0.63,-0.34l-0.32,0.02l-0.12,0.09l-0.47,-0.45l0.1,-0.6l-0.09,-0.27l-0.31,-0.3l-0.33,-0.05l-0.05,0.02l0.02,-0.21l0.46,-0.59l-0.02,-0.39l-0.99,-1.02l-0.34,-0.74l-0.56,-0.56l-0.17,-0.09l-0.5,-0.07l-0.19,0.04l-0.58,0.35l-0.79,0.33l-0.65,0.51l-0.85,-0.16l-0.63,-0.59l-0.14,-0.07l-0.41,-0.08l-0.2,0.03l-0.59,0.31l-0.07,0.0l-0.1,-0.63l0.11,-0.85l-0.21,-0.98l-0.11,-0.17l-0.86,-0.66l-0.45,-1.34l-0.1,-1.36Z\", \"name\": \"Mali\" }, \"MN\": { \"path\": \"M641.06,150.59l2.41,-0.53l4.76,-2.8l3.67,-1.49l2.06,0.96l0.12,0.03l2.5,0.05l1.59,1.45l0.19,0.08l2.47,0.12l3.59,0.81l0.27,-0.07l2.43,-2.28l0.06,-0.36l-0.93,-1.77l2.33,-3.1l2.66,1.3l2.26,0.39l2.75,0.8l0.44,2.3l0.19,0.22l3.56,1.38l0.18,0.01l2.35,-0.6l3.1,-0.42l2.4,0.41l2.37,1.52l1.49,1.63l0.23,0.1l2.29,-0.03l3.13,0.52l0.15,-0.01l2.28,-0.79l3.27,-0.53l0.11,-0.04l3.56,-2.23l1.31,0.31l1.26,1.05l0.22,0.07l2.45,-0.22l-0.98,1.96l-1.77,3.21l-0.01,0.28l0.64,1.31l0.35,0.16l1.35,-0.38l2.4,0.48l0.22,-0.04l1.78,-1.09l1.82,0.92l2.11,2.07l-0.17,0.68l-1.79,-0.31l-3.74,0.45l-1.85,0.96l-1.78,2.01l-3.74,1.18l-2.46,1.61l-2.45,-0.6l-1.42,-0.28l-0.31,0.13l-1.31,1.99l0.0,0.33l0.78,1.15l0.3,0.74l-1.58,0.93l-1.75,1.59l-2.83,1.03l-3.77,0.12l-4.05,1.05l-2.81,1.54l-0.95,-0.8l-0.19,-0.07l-2.96,0.0l-3.64,-1.8l-2.55,-0.48l-3.38,0.41l-5.13,-0.67l-2.66,0.06l-1.35,-1.65l-1.12,-2.78l-0.21,-0.18l-1.5,-0.33l-2.98,-1.89l-0.12,-0.04l-3.37,-0.43l-2.84,-0.51l-0.75,-1.13l0.93,-3.54l-0.04,-0.24l-1.73,-2.55l-0.15,-0.12l-3.52,-1.18l-1.99,-1.61l-0.54,-1.85Z\", \"name\": \"Mongolia\" }, \"MK\": { \"path\": \"M472.73,173.87l0.08,0.01l0.32,-0.25l0.08,-0.44l1.29,-0.41l1.37,-0.28l1.03,-0.04l1.06,0.82l0.14,1.59l-0.22,0.04l-0.17,0.11l-0.32,0.4l-1.2,-0.05l-0.18,0.05l-0.9,0.61l-1.45,0.23l-0.85,-0.59l-0.3,-1.09l0.22,-0.71Z\", \"name\": \"Macedonia\" }, \"MW\": { \"path\": \"M507.18,313.84l-0.67,1.85l-0.01,0.16l0.7,3.31l0.31,0.24l0.75,-0.03l0.78,0.71l0.99,1.75l0.2,3.03l-0.91,0.45l-0.14,0.15l-0.59,1.38l-1.24,-1.21l-0.17,-1.62l0.49,-1.12l0.02,-0.16l-0.15,-1.03l-0.13,-0.21l-0.99,-0.65l-0.26,-0.03l-0.53,0.18l-1.31,-1.12l-1.15,-0.59l0.66,-2.06l0.75,-0.84l0.07,-0.27l-0.47,-2.04l0.48,-1.94l0.4,-0.65l0.03,-0.24l-0.64,-2.15l-0.08,-0.13l-0.44,-0.42l1.34,0.26l1.25,1.73l0.67,3.3Z\", \"name\": \"Malawi\" }, \"MR\": { \"path\": \"M390.54,247.66l-1.48,-1.58l-1.51,-1.88l-0.12,-0.09l-1.64,-0.67l-1.17,-0.74l-0.17,-0.05l-1.4,0.03l-0.12,0.03l-1.14,0.52l-1.15,-0.21l-0.26,0.08l-0.44,0.43l-0.11,-0.72l0.68,-1.29l0.31,-2.43l-0.28,-2.63l-0.29,-1.27l0.24,-1.24l-0.03,-0.2l-0.65,-1.24l-1.19,-1.05l0.32,-0.51l9.64,0.02l0.3,-0.34l-0.46,-3.71l0.51,-1.12l2.17,-0.22l0.27,-0.3l-0.08,-6.5l7.91,0.13l0.31,-0.3l0.01,-3.5l8.17,5.63l-2.89,0.04l-0.29,0.33l2.42,22.56l0.12,0.21l0.26,0.19l-0.43,1.38l-9.83,0.04l-0.25,0.13l-0.27,0.41l-0.77,-0.14l-0.15,0.01l-1.3,0.47l-1.64,-0.67l-0.14,-0.02l-0.79,0.06l-0.27,0.22l-0.39,1.39l-0.53,0.29Z\", \"name\": \"Mauritania\" }, \"UG\": { \"path\": \"M500.74,287.17l-2.84,-0.02l-0.92,0.32l-1.37,0.71l-0.29,-0.12l0.02,-1.6l0.54,-0.89l0.04,-0.13l0.14,-1.96l0.49,-1.09l0.91,-1.24l0.97,-0.68l0.8,-0.89l-0.13,-0.49l-0.79,-0.27l0.13,-2.55l0.78,-0.52l1.45,0.51l0.18,0.01l1.97,-0.57l1.72,0.01l0.18,-0.06l1.29,-0.97l0.98,1.44l0.29,1.24l1.05,2.75l-0.84,1.68l-1.94,2.66l-0.06,0.18l0.02,2.36l-4.8,0.18Z\", \"name\": \"Uganda\" }, \"MY\": { \"path\": \"M717.6,273.52l-1.51,0.7l-2.13,-0.41l-2.88,-0.0l-0.29,0.21l-0.84,2.77l-0.9,0.82l-0.08,0.12l-1.23,3.34l-1.81,0.47l-2.29,-0.68l-0.14,-0.01l-1.2,0.22l-0.14,0.07l-1.36,1.18l-1.47,-0.17l-0.12,0.01l-1.46,0.46l-1.51,-1.25l-0.24,-0.97l1.26,0.59l0.2,0.02l1.93,-0.47l0.22,-0.22l0.47,-1.98l0.9,-0.4l2.97,-0.54l0.17,-0.09l1.8,-1.98l1.02,-1.32l0.9,1.03l0.48,-0.04l0.43,-0.7l1.02,0.07l0.32,-0.27l0.25,-2.72l1.84,-1.67l1.23,-1.89l0.73,-0.01l1.12,1.11l0.1,0.99l0.18,0.24l1.66,0.71l1.85,0.67l-0.09,0.51l-1.45,0.11l-0.26,0.4l0.35,0.97ZM673.78,269.53l0.17,1.14l0.35,0.25l1.65,-0.3l0.18,-0.11l0.68,-0.86l0.31,0.13l1.41,1.45l0.99,1.59l0.13,1.57l-0.26,1.09l0.0,0.15l0.24,0.84l0.18,1.46l0.11,0.2l0.82,0.64l0.92,2.08l-0.03,0.52l-1.4,0.13l-2.29,-1.79l-2.86,-1.92l-0.27,-1.16l-0.07,-0.13l-1.39,-1.61l-0.33,-1.99l-0.05,-0.12l-0.84,-1.27l0.26,-1.72l-0.03,-0.18l-0.45,-0.87l0.13,-0.13l1.71,0.92Z\", \"name\": \"Malaysia\" }, \"MX\": { \"path\": \"M133.41,213.83l0.61,0.09l0.27,-0.09l0.93,-1.01l0.08,-0.18l0.09,-1.22l-0.09,-0.23l-1.93,-1.94l-1.46,-0.77l-2.96,-5.62l-0.86,-2.1l2.44,-0.18l2.68,-0.25l-0.03,0.08l0.17,0.4l3.79,1.35l5.81,1.97l6.96,-0.02l0.3,-0.3l0.0,-0.84l3.91,0.0l0.87,0.93l1.27,0.87l1.44,1.17l0.79,1.37l0.62,1.49l0.12,0.14l1.35,0.85l2.08,0.82l0.35,-0.1l1.49,-2.04l1.81,-0.05l1.63,1.01l1.21,1.8l0.86,1.58l1.47,1.55l0.53,1.82l0.73,1.32l0.14,0.13l1.98,0.84l1.78,0.59l0.61,-0.03l-0.78,1.89l-0.45,1.96l-0.19,3.58l-0.24,1.27l0.01,0.14l0.43,1.43l0.78,1.31l0.49,1.98l0.06,0.12l1.63,1.9l0.61,1.51l0.98,1.28l0.16,0.11l2.58,0.67l0.98,1.02l0.31,0.08l2.17,-0.71l1.91,-0.26l1.87,-0.47l1.67,-0.49l1.59,-1.06l0.11,-0.14l0.6,-1.52l0.22,-2.21l0.35,-0.62l1.58,-0.64l2.59,-0.59l2.18,0.09l1.43,-0.2l0.39,0.36l-0.07,1.02l-1.28,1.48l-0.65,1.68l0.07,0.32l0.33,0.32l-0.79,2.49l-0.28,-0.3l-0.24,-0.09l-1.0,0.08l-0.24,0.15l-0.74,1.28l-0.19,-0.13l-0.28,-0.03l-0.3,0.12l-0.19,0.29l0.0,0.06l-4.34,-0.02l-0.3,0.3l-0.0,1.16l-0.83,0.0l-0.28,0.19l0.08,0.33l0.93,0.86l0.9,0.58l0.24,0.48l0.16,0.15l0.2,0.08l-0.03,0.38l-2.94,0.01l-0.26,0.15l-1.21,2.09l0.02,0.33l0.25,0.33l-0.21,0.44l-0.04,0.22l-2.42,-2.35l-1.36,-0.87l-2.04,-0.67l-0.13,-0.01l-1.4,0.19l-2.07,0.98l-1.14,0.23l-1.72,-0.66l-1.85,-0.48l-2.31,-1.16l-1.92,-0.38l-2.79,-1.18l-2.04,-1.2l-0.6,-0.66l-0.19,-0.1l-1.37,-0.15l-2.45,-0.78l-1.07,-1.18l-2.63,-1.44l-1.2,-1.56l-0.44,-0.93l0.5,-0.15l0.2,-0.39l-0.2,-0.58l0.46,-0.55l0.07,-0.19l0.01,-0.91l-0.06,-0.18l-0.81,-1.13l-0.25,-1.08l-0.86,-1.36l-2.21,-2.63l-2.53,-2.09l-1.2,-1.63l-0.11,-0.09l-2.08,-1.06l-0.34,-0.48l0.35,-1.53l-0.16,-0.34l-1.24,-0.61l-1.39,-1.23l-0.6,-1.81l-0.24,-0.2l-1.25,-0.2l-1.38,-1.35l-1.11,-1.25l-0.1,-0.76l-0.05,-0.13l-1.33,-2.04l-0.85,-2.02l0.04,-0.99l-0.14,-0.27l-1.81,-1.1l-0.2,-0.04l-0.74,0.11l-1.34,-0.72l-0.42,0.16l-0.4,1.12l-0.0,0.19l0.41,1.3l0.24,2.04l0.06,0.15l0.88,1.16l1.84,1.86l0.4,0.61l0.12,0.1l0.27,0.14l0.29,0.82l0.31,0.2l0.2,-0.02l0.43,1.51l0.09,0.14l0.72,0.65l0.51,0.91l1.58,1.4l0.8,2.42l0.77,1.23l0.66,1.19l0.13,1.34l0.28,0.27l1.08,0.08l0.92,1.1l0.83,1.08l-0.03,0.24l-0.88,0.81l-0.13,-0.0l-0.59,-1.42l-0.07,-0.11l-1.67,-1.53l-1.81,-1.28l-1.15,-0.61l0.07,-1.85l-0.38,-1.45l-0.12,-0.17l-2.91,-2.03l-0.39,0.04l-0.11,0.11l-0.42,-0.46l-0.11,-0.08l-1.49,-0.63l-1.09,-1.16Z\", \"name\": \"Mexico\" }, \"VU\": { \"path\": \"M839.92,325.66l0.78,0.73l-0.18,0.07l-0.6,-0.8ZM839.13,322.74l0.27,1.36l-0.13,-0.06l-0.21,-0.02l-0.29,0.08l-0.22,-0.43l-0.03,-1.32l0.61,0.4Z\", \"name\": \"Vanuatu\" }, \"FR\": { \"path\": \"M444.58,172.63l-0.68,1.92l-0.72,-0.38l-0.51,-1.79l0.43,-0.95l1.15,-0.83l0.33,2.04ZM429.71,147.03l1.77,1.57l0.26,0.07l1.16,-0.23l2.12,1.44l0.56,0.28l0.16,0.03l0.61,-0.06l1.09,0.78l0.13,0.05l3.18,0.53l-1.09,1.94l-0.3,2.16l-0.48,0.38l-1.0,-0.26l-0.37,0.32l0.07,0.66l-1.73,1.68l-0.09,0.21l-0.04,1.42l0.41,0.29l0.96,-0.4l0.67,1.07l-0.09,0.78l0.04,0.19l0.61,0.97l-0.71,0.78l-0.07,0.28l0.65,2.39l0.21,0.21l1.09,0.31l-0.2,0.95l-2.08,1.58l-4.81,-0.8l-0.13,0.01l-3.65,0.99l-0.22,0.24l-0.25,1.6l-2.59,0.35l-2.74,-1.33l-0.31,0.03l-0.79,0.57l-4.38,-1.31l-0.79,-0.94l1.16,-1.64l0.05,-0.15l0.48,-6.17l-0.06,-0.21l-2.58,-3.3l-1.89,-1.65l-0.11,-0.06l-3.64,-1.17l-0.2,-1.88l2.92,-0.63l4.14,0.82l0.35,-0.36l-0.65,-3.0l1.77,1.05l0.27,0.02l5.83,-2.54l0.17,-0.19l0.71,-2.54l1.75,-0.53l0.27,0.88l0.27,0.21l1.04,0.05l1.08,1.23ZM289.1,278.45l-0.85,0.84l-0.88,0.13l-0.25,-0.51l-0.21,-0.16l-0.56,-0.1l-0.25,0.07l-0.63,0.55l-0.62,-0.29l0.5,-0.88l0.21,-1.11l0.42,-1.05l-0.03,-0.28l-0.93,-1.42l-0.18,-1.54l1.13,-1.87l2.42,0.78l2.55,2.04l0.33,0.81l-1.4,2.16l-0.77,1.84Z\", \"name\": \"France\" }, \"FI\": { \"path\": \"M492.26,76.42l-0.38,3.12l0.12,0.28l3.6,2.69l-2.14,2.96l-0.01,0.33l2.83,4.61l-1.61,3.36l0.03,0.31l2.15,2.87l-0.96,2.44l0.1,0.35l3.51,2.55l-0.81,1.72l-2.28,2.19l-5.28,4.79l-4.51,0.31l-4.39,1.37l-3.87,0.75l-1.34,-1.89l-0.11,-0.09l-2.23,-1.14l0.53,-3.54l-0.01,-0.14l-1.17,-3.37l1.12,-2.13l2.23,-2.44l5.69,-4.33l1.65,-0.84l0.16,-0.31l-0.26,-1.73l-0.15,-0.22l-3.4,-1.91l-0.77,-1.47l-0.07,-6.45l-0.12,-0.24l-3.91,-2.94l-3.0,-1.92l0.97,-0.76l2.6,2.17l0.21,0.07l3.2,-0.21l2.63,1.03l0.3,-0.05l2.39,-1.94l0.09,-0.13l1.18,-3.12l3.63,-1.42l2.87,1.59l-0.98,2.87Z\", \"name\": \"Finland\" }, \"FJ\": { \"path\": \"M869.98,327.07l-1.31,0.44l-0.14,-0.41l0.96,-0.41l0.85,-0.17l1.43,-0.78l-0.16,0.65l-1.64,0.67ZM867.58,329.12l0.54,0.47l-0.31,1.0l-1.32,0.3l-1.13,-0.26l-0.17,-0.78l0.72,-0.66l0.98,0.27l0.25,-0.04l0.43,-0.29Z\", \"name\": \"Fiji\" }, \"FK\": { \"path\": \"M268.15,427.89l2.6,-1.73l1.98,0.77l0.31,-0.05l1.32,-1.17l1.58,1.18l-0.54,0.84l-3.1,0.92l-1.0,-1.04l-0.39,-0.04l-1.9,1.35l-0.86,-1.04Z\", \"name\": \"Falkland Islands\" }, \"NI\": { \"path\": \"M202.1,252.6l0.23,-0.0l0.12,-0.11l0.68,-0.09l0.22,-0.15l0.23,-0.43l0.2,-0.01l0.28,-0.31l-0.04,-0.97l0.29,-0.03l0.5,0.02l0.25,-0.11l0.37,-0.46l0.51,0.35l0.4,-0.06l0.23,-0.28l0.45,-0.29l0.87,-0.7l0.11,-0.21l0.02,-0.26l0.23,-0.12l0.25,-0.48l0.29,0.27l0.14,0.07l0.5,0.12l0.22,-0.03l0.48,-0.28l0.66,-0.02l0.87,-0.33l0.36,-0.32l0.21,0.01l-0.11,0.48l0.0,0.14l0.22,0.8l-0.54,0.85l-0.27,1.03l-0.09,1.18l0.14,0.72l0.05,0.95l-0.24,0.15l-0.13,0.19l-0.23,1.09l0.0,0.14l0.14,0.53l-0.42,0.53l-0.06,0.24l0.12,0.69l0.08,0.15l0.18,0.19l-0.26,0.23l-0.49,-0.11l-0.35,-0.44l-0.16,-0.1l-0.79,-0.21l-0.23,0.03l-0.45,0.26l-1.51,-0.62l-0.31,0.05l-0.17,0.15l-1.81,-1.62l-0.6,-0.9l-1.04,-0.79l-0.77,-0.71Z\", \"name\": \"Nicaragua\" }, \"NL\": { \"path\": \"M436.22,136.65l1.82,0.08l0.36,0.89l-0.6,2.96l-0.53,1.06l-1.32,0.0l-0.3,0.34l0.35,2.89l-0.83,-0.47l-1.56,-1.43l-0.29,-0.07l-2.26,0.67l-1.02,-0.15l0.68,-0.48l0.1,-0.12l2.14,-4.84l3.25,-1.35Z\", \"name\": \"Netherlands\" }, \"NO\": { \"path\": \"M491.45,67.31l7.06,3.0l-2.52,0.94l-0.11,0.49l2.43,2.49l-3.82,1.59l-1.48,0.3l0.89,-2.61l-0.14,-0.36l-3.21,-1.78l-0.25,-0.02l-3.89,1.52l-0.17,0.17l-1.2,3.17l-2.19,1.78l-2.53,-0.99l-0.13,-0.02l-3.15,0.21l-2.69,-2.25l-0.38,-0.01l-1.43,1.11l-1.47,0.17l-0.26,0.26l-0.33,2.57l-4.42,-0.65l-0.33,0.22l-0.6,2.19l-2.17,-0.01l-0.27,0.16l-4.15,7.68l-3.88,5.76l-0.0,0.33l0.81,1.23l-0.7,1.27l-2.3,-0.06l-0.28,0.18l-1.63,3.72l-0.02,0.13l0.15,5.17l0.07,0.18l1.51,1.84l-0.79,4.24l-2.04,2.5l-0.92,1.75l-1.39,-1.88l-0.44,-0.05l-4.89,4.21l-3.16,0.81l-3.24,-1.74l-0.86,-3.82l-0.78,-8.6l2.18,-2.36l6.56,-3.28l5.0,-4.16l4.63,-5.74l5.99,-8.09l4.17,-3.23l6.84,-5.49l5.39,-1.92l4.06,0.24l0.23,-0.09l3.72,-3.67l4.51,0.19l4.4,-0.89ZM484.58,19.95l4.42,1.82l-3.25,2.68l-7.14,0.65l-7.16,-0.91l-0.39,-1.37l-0.28,-0.22l-3.48,-0.1l-2.25,-2.15l7.09,-1.48l3.55,1.36l0.28,-0.03l2.42,-1.66l6.18,1.41ZM481.99,33.92l-4.73,1.85l-3.76,-1.06l1.27,-1.02l0.04,-0.43l-1.18,-1.35l4.46,-0.94l0.89,1.83l0.17,0.15l2.83,0.96ZM466.5,23.95l7.64,3.87l-5.63,1.94l-0.19,0.19l-1.35,3.88l-2.08,0.96l-0.16,0.19l-1.14,4.18l-2.71,0.18l-4.94,-2.95l1.95,-1.63l-0.08,-0.51l-3.7,-1.54l-4.79,-4.54l-1.78,-4.01l6.29,-1.88l1.25,1.81l0.25,0.13l3.57,-0.08l0.26,-0.17l0.87,-1.79l3.41,-0.18l3.08,1.94Z\", \"name\": \"Norway\" }, \"NA\": { \"path\": \"M461.88,357.98l-1.61,-1.77l-0.94,-1.9l-0.54,-2.58l-0.62,-1.95l-0.83,-4.05l-0.06,-3.13l-0.33,-1.5l-0.07,-0.14l-0.95,-1.06l-1.27,-2.12l-1.3,-3.1l-0.59,-1.71l-1.98,-2.46l-0.13,-1.67l0.99,-0.4l1.44,-0.42l1.48,0.07l1.42,1.11l0.31,0.03l0.32,-0.15l9.99,-0.11l1.66,1.18l0.16,0.06l6.06,0.37l4.69,-1.06l2.01,-0.57l1.5,0.14l0.63,0.37l-1.0,0.41l-0.7,0.01l-0.16,0.05l-1.38,0.88l-0.79,-0.88l-0.29,-0.09l-3.83,0.9l-1.84,0.08l-0.29,0.3l-0.07,8.99l-2.18,0.08l-0.29,0.3l-0.0,17.47l-2.04,1.27l-1.21,0.18l-1.51,-0.49l-0.99,-0.18l-0.36,-1.0l-0.1,-0.14l-0.99,-0.74l-0.4,0.04l-0.98,1.09Z\", \"name\": \"Namibia\" }, \"NC\": { \"path\": \"M835.87,338.68l2.06,1.63l1.01,0.94l-0.49,0.32l-1.21,-0.62l-1.76,-1.16l-1.58,-1.36l-1.61,-1.79l-0.16,-0.41l0.54,0.02l1.32,0.83l1.08,0.87l0.79,0.73Z\", \"name\": \"New Caledonia\" }, \"NE\": { \"path\": \"M426.67,254.17l0.03,-1.04l-0.24,-0.3l-2.66,-0.53l-0.06,-1.0l-0.07,-0.17l-1.37,-1.62l-0.3,-1.04l0.15,-0.94l1.37,-0.09l0.19,-0.09l0.85,-0.83l3.34,-0.22l2.22,-0.41l0.24,-0.26l0.2,-1.5l1.32,-1.65l0.07,-0.19l-0.01,-5.74l3.4,-1.13l7.24,-5.12l8.46,-4.95l3.76,1.08l1.35,1.39l0.36,0.05l1.39,-0.77l0.55,3.66l0.12,0.2l0.82,0.6l0.03,0.69l0.1,0.21l0.87,0.74l-0.47,0.99l-0.96,5.26l-0.13,3.25l-3.08,2.34l-0.1,0.15l-1.08,3.37l0.08,0.31l0.94,0.86l-0.01,1.51l0.29,0.3l1.25,0.05l-0.14,0.66l-0.51,0.11l-0.24,0.26l-0.06,0.57l-0.04,0.0l-1.59,-2.62l-0.21,-0.14l-0.59,-0.1l-0.23,0.05l-1.83,1.33l-1.79,-0.68l-1.42,-0.17l-0.17,0.03l-0.65,0.32l-1.39,-0.07l-0.19,0.06l-1.4,1.03l-1.12,0.05l-2.97,-1.29l-0.26,0.01l-1.12,0.59l-1.08,-0.04l-0.85,-0.88l-0.11,-0.07l-2.51,-0.95l-0.14,-0.02l-2.69,0.3l-0.16,0.07l-0.65,0.55l-0.1,0.16l-0.34,1.41l-0.69,0.98l-0.05,0.15l-0.13,1.72l-1.47,-1.13l-0.18,-0.06l-0.9,0.01l-0.2,0.08l-0.32,0.28Z\", \"name\": \"Niger\" }, \"NG\": { \"path\": \"M442.0,272.7l-2.4,0.83l-0.88,-0.12l-0.19,0.04l-0.89,0.52l-1.78,-0.05l-1.23,-1.44l-0.88,-1.87l-1.77,-1.66l-0.21,-0.08l-3.78,0.03l0.13,-3.75l-0.06,-1.58l0.44,-1.47l0.74,-0.75l1.21,-1.56l0.04,-0.29l-0.22,-0.56l0.44,-0.9l0.01,-0.24l-0.54,-1.44l0.26,-2.97l0.72,-1.06l0.33,-1.37l0.51,-0.43l2.53,-0.28l2.38,0.9l0.89,0.91l0.2,0.09l1.28,0.04l0.15,-0.03l1.06,-0.56l2.9,1.26l0.13,0.02l1.28,-0.06l0.16,-0.06l1.39,-1.02l1.36,0.07l0.15,-0.03l0.64,-0.32l1.22,0.13l1.9,0.73l0.28,-0.04l1.86,-1.35l0.33,0.06l1.62,2.67l0.29,0.14l0.32,-0.04l0.73,0.74l-0.19,0.37l-0.12,0.74l-2.03,1.89l-0.07,0.11l-0.66,1.62l-0.35,1.28l-0.48,0.51l-0.07,0.12l-0.48,1.67l-1.26,0.98l-0.1,0.15l-0.38,1.24l-0.58,1.07l-0.2,0.91l-1.43,0.7l-1.26,-0.93l-0.19,-0.06l-0.95,0.04l-0.2,0.09l-1.41,1.39l-0.61,0.02l-0.26,0.17l-1.19,2.42l-0.61,1.67Z\", \"name\": \"Nigeria\" }, \"NZ\": { \"path\": \"M857.9,379.62l1.85,3.1l0.33,0.14l0.22,-0.28l0.04,-1.41l0.57,0.4l0.35,2.06l0.17,0.22l2.02,0.94l1.78,0.26l0.22,-0.06l1.31,-1.01l0.84,0.22l-0.53,2.27l-0.67,1.5l-1.71,-0.05l-0.25,0.12l-0.67,0.89l-0.05,0.23l0.21,1.15l-0.31,0.46l-2.15,3.57l-1.6,0.99l-0.28,-0.51l-0.15,-0.13l-0.72,-0.3l1.27,-2.15l0.01,-0.29l-0.82,-1.63l-0.15,-0.14l-2.5,-1.09l0.05,-0.69l1.67,-0.94l0.15,-0.21l0.42,-2.24l-0.11,-1.95l-0.03,-0.12l-0.97,-1.85l0.05,-0.41l-0.09,-0.25l-1.18,-1.17l-1.94,-2.49l-0.86,-1.64l0.38,-0.09l1.24,1.43l0.12,0.08l1.81,0.68l0.67,2.39ZM853.93,393.55l0.57,1.24l0.44,0.12l1.51,-1.03l0.52,0.91l0.0,1.09l-0.88,1.31l-1.62,2.2l-1.26,1.2l-0.05,0.38l0.64,1.02l-1.4,0.03l-0.14,0.04l-2.14,1.16l-0.14,0.17l-0.67,2.0l-1.38,3.06l-3.07,2.19l-2.12,-0.06l-1.55,-0.99l-0.14,-0.05l-2.53,-0.2l-0.31,-0.84l1.25,-2.15l3.07,-2.97l1.62,-0.59l1.81,-1.17l2.18,-1.63l1.55,-1.65l1.08,-2.18l0.9,-0.72l0.11,-0.17l0.35,-1.56l1.37,-1.07l0.4,0.91Z\", \"name\": \"New Zealand\" }, \"NP\": { \"path\": \"M641.26,213.53l-0.14,0.95l0.32,1.64l-0.21,0.78l-1.83,0.04l-2.98,-0.62l-1.86,-0.25l-1.37,-1.3l-0.18,-0.08l-3.38,-0.34l-3.21,-1.49l-2.38,-1.34l-2.16,-0.92l0.84,-2.2l1.51,-1.18l0.89,-0.57l1.83,0.77l2.5,1.76l1.39,0.41l0.78,1.21l0.17,0.13l1.91,0.53l2.0,1.17l2.92,0.66l2.63,0.24Z\", \"name\": \"Nepal\" }, \"CI\": { \"path\": \"M413.53,272.08l-0.83,0.02l-1.79,-0.49l-1.64,0.03l-3.04,0.46l-1.73,0.72l-2.4,0.89l-0.12,-0.02l0.16,-1.7l0.19,-0.25l0.06,-0.2l-0.08,-0.99l-0.09,-0.19l-1.06,-1.05l-0.15,-0.08l-0.71,-0.15l-0.51,-0.48l0.45,-0.92l0.02,-0.19l-0.24,-1.16l0.07,-0.43l0.14,-0.0l0.3,-0.26l0.15,-1.1l-0.02,-0.15l-0.13,-0.34l0.09,-0.13l0.83,-0.27l0.19,-0.37l-0.62,-2.02l-0.55,-1.0l0.14,-0.59l0.35,-0.14l0.24,-0.16l0.53,0.29l0.14,0.04l1.93,0.02l0.26,-0.14l0.36,-0.58l0.39,0.01l0.43,-0.17l0.28,0.79l0.43,0.16l0.56,-0.31l0.89,-0.32l0.92,0.45l0.39,0.75l0.14,0.13l1.13,0.53l0.3,-0.03l0.81,-0.59l1.02,-0.08l1.49,0.57l0.62,3.33l-1.03,2.09l-0.65,2.84l0.02,0.2l1.05,2.08l-0.07,0.64Z\", \"name\": \"Ivory Coast\" }, \"CH\": { \"path\": \"M444.71,156.27l0.05,0.3l-0.34,0.69l0.13,0.4l1.13,0.58l1.07,0.1l-0.12,0.81l-0.87,0.42l-1.75,-0.37l-0.34,0.18l-0.47,1.1l-0.86,0.07l-0.33,-0.38l-0.41,-0.04l-1.34,1.01l-1.02,0.13l-0.93,-0.58l-0.82,-1.32l-0.37,-0.12l-0.77,0.32l0.02,-0.84l1.74,-1.69l0.09,-0.25l-0.04,-0.38l0.73,0.19l0.26,-0.06l0.6,-0.48l2.02,0.02l0.24,-0.12l0.38,-0.51l2.31,0.84Z\", \"name\": \"Switzerland\" }, \"CO\": { \"path\": \"M232.24,284.95l-0.94,-0.52l-1.22,-0.82l-0.31,-0.01l-0.62,0.35l-1.88,-0.31l-0.54,-0.95l-0.29,-0.15l-0.37,0.03l-2.34,-1.33l-0.15,-0.35l0.57,-0.11l0.24,-0.32l-0.1,-1.15l0.46,-0.71l1.11,-0.15l0.21,-0.13l1.05,-1.57l0.95,-1.31l-0.08,-0.43l-0.73,-0.47l0.4,-1.24l0.01,-0.16l-0.53,-2.15l0.44,-0.54l0.06,-0.24l-0.4,-2.13l-0.06,-0.13l-0.93,-1.22l0.21,-0.8l0.52,0.12l0.32,-0.13l0.47,-0.75l0.03,-0.27l-0.52,-1.32l0.09,-0.11l1.14,0.07l0.22,-0.08l1.82,-1.71l0.96,-0.25l0.22,-0.28l0.02,-0.81l0.43,-2.01l1.28,-1.04l1.48,-0.05l0.27,-0.19l0.12,-0.31l1.73,0.19l0.2,-0.05l1.96,-1.28l0.97,-0.56l1.16,-1.16l0.64,0.11l0.43,0.44l-0.31,0.55l-1.49,0.39l-0.19,0.16l-0.6,1.2l-0.97,0.74l-0.73,0.94l-0.06,0.13l-0.3,1.76l-0.68,1.44l0.23,0.43l1.1,0.14l0.27,0.97l0.08,0.13l0.49,0.49l0.17,0.85l-0.27,0.86l-0.01,0.14l0.09,0.53l0.2,0.23l0.52,0.18l0.54,0.79l0.27,0.13l3.18,-0.24l1.31,0.29l1.7,2.08l0.31,0.1l0.96,-0.26l1.75,0.13l1.41,-0.27l0.56,0.27l-0.36,1.07l-0.54,0.81l-0.05,0.13l-0.2,1.8l0.51,1.79l0.07,0.12l0.65,0.68l0.05,0.32l-1.16,1.14l0.05,0.47l0.86,0.52l0.6,0.79l0.31,1.01l-0.7,-0.81l-0.44,-0.01l-0.74,0.77l-4.75,-0.05l-0.3,0.31l0.03,1.57l0.25,0.29l1.2,0.21l-0.02,0.24l-0.1,-0.05l-0.22,-0.02l-1.41,0.41l-0.22,0.29l-0.01,1.82l0.11,0.23l1.04,0.85l0.35,1.3l-0.06,1.02l-1.02,6.26l-0.84,-0.89l-0.19,-0.09l-0.25,-0.02l1.35,-2.13l-0.1,-0.42l-1.92,-1.17l-0.2,-0.04l-1.41,0.2l-0.82,-0.39l-0.26,0.0l-1.29,0.62l-1.63,-0.27l-1.4,-2.5l-0.12,-0.12l-1.1,-0.61l-0.83,-1.2l-1.67,-1.19l-0.27,-0.04l-0.54,0.19Z\", \"name\": \"Colombia\" }, \"CN\": { \"path\": \"M740.32,148.94l0.22,0.21l4.3,1.03l2.84,2.2l0.99,2.92l0.28,0.2l3.8,0.0l0.15,-0.04l2.13,-1.24l3.5,-0.8l-1.05,2.29l-0.95,1.13l-0.06,0.12l-0.85,3.41l-1.56,2.81l-2.83,-0.51l-0.19,0.03l-2.15,1.09l-0.15,0.34l0.65,2.59l-0.33,3.3l-1.03,0.07l-0.28,0.3l0.01,0.75l-1.09,-1.2l-0.48,0.05l-0.94,1.6l-3.76,1.26l-0.2,0.36l0.29,1.19l-1.67,-0.08l-1.11,-0.88l-0.42,0.05l-1.69,2.08l-2.71,1.57l-2.04,1.88l-3.42,0.84l-0.11,0.05l-1.8,1.34l-1.54,0.46l0.52,-0.53l0.06,-0.33l-0.44,-0.96l1.84,-1.84l0.02,-0.41l-1.32,-1.56l-0.36,-0.08l-2.23,1.08l-2.83,2.06l-1.52,1.85l-2.32,0.13l-0.2,0.09l-1.28,1.37l-0.03,0.37l1.32,1.97l0.18,0.13l1.83,0.43l0.07,1.08l0.18,0.26l1.98,0.84l0.3,-0.03l2.66,-1.96l2.06,1.04l0.12,0.03l1.4,0.07l0.27,1.0l-3.24,0.73l-0.17,0.11l-1.13,1.5l-2.38,1.4l-0.1,0.1l-1.29,1.99l0.1,0.42l2.6,1.5l0.97,2.72l1.52,2.56l1.66,2.08l-0.03,1.76l-1.4,0.67l-0.15,0.38l0.6,1.47l0.13,0.15l1.29,0.75l-0.35,2.0l-0.58,1.96l-1.22,0.21l-0.2,0.14l-1.83,2.93l-2.02,3.51l-2.29,3.13l-3.4,2.42l-3.42,2.18l-2.75,0.3l-0.15,0.06l-1.32,1.01l-0.68,-0.67l-0.41,-0.01l-1.37,1.27l-3.42,1.28l-2.62,0.4l-0.24,0.21l-0.8,2.57l-0.95,0.11l-0.53,-1.54l0.52,-0.89l-0.19,-0.44l-3.36,-0.84l-0.17,0.01l-1.09,0.4l-2.36,-0.64l-1.0,-0.9l0.35,-1.34l-0.23,-0.37l-2.22,-0.47l-1.15,-0.94l-0.36,-0.02l-2.08,1.37l-2.35,0.29l-1.98,-0.01l-0.13,0.03l-1.32,0.63l-1.28,0.38l-0.21,0.33l0.33,2.65l-0.78,-0.04l-0.14,-0.39l-0.07,-1.04l-0.41,-0.26l-1.72,0.71l-0.96,-0.43l-1.63,-0.86l0.65,-1.95l-0.19,-0.38l-1.43,-0.46l-0.56,-2.27l-0.34,-0.22l-2.26,0.38l0.25,-2.65l2.29,-2.15l0.09,-0.2l0.1,-2.21l-0.07,-2.09l-0.15,-0.25l-1.02,-0.6l-0.8,-1.52l-0.31,-0.16l-1.42,0.2l-2.16,-0.32l0.55,-0.74l0.01,-0.35l-1.17,-1.7l-0.41,-0.08l-1.67,1.07l-1.97,-0.63l-0.25,0.03l-2.89,1.73l-2.26,1.99l-1.82,0.3l-1.0,-0.66l-0.15,-0.05l-1.28,-0.06l-1.75,-0.61l-0.24,0.02l-1.35,0.69l-0.1,0.08l-1.2,1.45l-0.14,-1.41l-0.4,-0.25l-1.46,0.55l-2.83,-0.26l-2.77,-0.61l-1.99,-1.17l-1.91,-0.54l-0.78,-1.21l-0.17,-0.13l-1.36,-0.38l-2.54,-1.79l-2.01,-0.84l-0.28,0.02l-0.89,0.56l-3.31,-1.83l-2.35,-1.67l-0.57,-2.49l1.34,0.28l0.36,-0.28l0.08,-1.42l-0.05,-0.19l-0.93,-1.34l0.24,-2.18l-0.07,-0.22l-2.69,-3.32l-0.15,-0.1l-3.97,-1.11l-0.69,-2.05l-0.11,-0.15l-1.79,-1.3l-0.39,-0.73l-0.36,-1.57l0.08,-1.09l-0.18,-0.3l-1.52,-0.66l-0.22,-0.01l-0.51,0.18l-0.52,-2.21l0.59,-0.55l0.06,-0.35l-0.22,-0.44l2.12,-1.24l1.63,-0.55l2.58,0.39l0.31,-0.16l0.87,-1.75l3.05,-0.34l0.21,-0.12l0.84,-1.12l3.87,-1.59l0.15,-0.14l0.35,-0.68l0.03,-0.17l-0.17,-1.51l1.52,-0.7l0.15,-0.39l-2.12,-5.0l4.62,-1.15l1.35,-0.72l0.14,-0.17l1.72,-5.37l4.7,0.99l0.28,-0.08l1.39,-1.43l0.08,-0.2l0.11,-2.95l1.83,-0.26l0.18,-0.1l1.85,-2.08l0.61,-0.17l0.57,1.97l0.1,0.15l2.2,1.75l3.48,1.17l1.59,2.36l-0.93,3.53l0.04,0.24l0.9,1.35l0.2,0.13l2.98,0.53l3.32,0.43l2.97,1.89l1.49,0.35l1.08,2.67l1.52,1.88l0.24,0.11l2.74,-0.07l5.15,0.67l3.36,-0.41l2.39,0.43l3.67,1.81l0.13,0.03l2.92,-0.0l1.02,0.86l0.34,0.03l2.88,-1.59l3.98,-1.03l3.81,-0.13l3.02,-1.12l1.77,-1.61l1.73,-1.01l0.13,-0.37l-0.41,-1.01l-0.72,-1.07l1.09,-1.66l1.21,0.24l2.57,0.63l0.24,-0.04l2.46,-1.62l3.78,-1.19l0.13,-0.09l1.8,-2.03l1.66,-0.84l3.54,-0.41l1.93,0.35l0.34,-0.22l0.27,-1.12l-0.08,-0.29l-2.27,-2.22l-2.08,-1.07l-0.29,0.01l-1.82,1.12l-2.36,-0.47l-0.14,0.01l-1.18,0.34l-0.46,-0.94l1.69,-3.08l1.1,-2.21l2.75,1.12l0.26,-0.02l3.53,-2.06l0.15,-0.26l-0.02,-1.35l2.18,-3.39l1.35,-1.04l0.12,-0.24l-0.03,-1.85l-0.15,-0.25l-1.0,-0.58l1.68,-1.37l3.01,-0.59l3.25,-0.09l3.67,0.99l2.08,1.18l1.51,3.3l0.95,1.45l0.85,1.99l0.92,3.19ZM697.0,237.37l-1.95,1.12l-1.74,-0.68l-0.06,-1.9l1.08,-1.03l2.62,-0.7l1.23,0.05l0.37,0.65l-1.01,1.08l-0.54,1.4Z\", \"name\": \"China\" }, \"CM\": { \"path\": \"M453.76,278.92l-0.26,-0.11l-0.18,-0.02l-1.42,0.31l-1.56,-0.33l-1.17,0.16l-3.7,-0.05l0.3,-1.63l-0.04,-0.21l-0.98,-1.66l-0.15,-0.13l-1.03,-0.38l-0.46,-1.01l-0.13,-0.14l-0.48,-0.27l0.02,-0.46l0.62,-1.72l1.1,-2.25l0.54,-0.02l0.2,-0.09l1.41,-1.39l0.73,-0.03l1.32,0.97l0.31,0.03l1.72,-0.85l0.16,-0.2l0.22,-1.0l0.57,-1.03l0.36,-1.18l1.26,-0.98l0.1,-0.15l0.49,-1.7l0.48,-0.51l0.07,-0.13l0.35,-1.3l0.63,-1.54l2.06,-1.92l0.09,-0.17l0.12,-0.79l0.24,-0.41l-0.04,-0.36l-0.89,-0.91l0.04,-0.45l0.28,-0.06l0.85,1.39l0.16,1.59l-0.09,1.66l0.04,0.17l1.09,1.84l-0.86,-0.02l-0.72,0.17l-1.07,-0.24l-0.34,0.17l-0.54,1.19l0.06,0.34l1.48,1.47l1.06,0.44l0.32,0.94l0.73,1.6l-0.32,0.57l-1.23,2.49l-0.54,0.41l-0.12,0.21l-0.19,1.95l0.24,1.08l-0.18,0.67l0.07,0.28l1.13,1.25l0.24,0.93l0.92,1.29l1.1,0.8l0.1,1.01l0.26,0.73l-0.12,0.93l-1.65,-0.49l-2.02,-0.66l-3.19,-0.11Z\", \"name\": \"Cameroon\" }, \"CL\": { \"path\": \"M246.8,429.1l-1.14,0.78l-2.25,1.21l-0.16,0.23l-0.37,2.94l-0.75,0.06l-2.72,-1.07l-2.83,-2.34l-3.06,-1.9l-0.71,-1.92l0.67,-1.84l-0.02,-0.25l-1.22,-2.13l-0.31,-5.41l1.02,-2.95l2.59,-2.4l-0.13,-0.51l-3.32,-0.8l2.06,-2.4l0.07,-0.15l0.79,-4.77l2.44,0.95l0.4,-0.22l1.31,-6.31l-0.16,-0.33l-1.68,-0.8l-0.42,0.21l-0.72,3.47l-1.01,-0.27l0.74,-4.06l0.85,-5.46l1.12,-1.96l0.03,-0.22l-0.71,-2.82l-0.19,-2.94l0.76,-0.07l0.26,-0.2l1.53,-4.62l1.73,-4.52l1.07,-4.2l-0.56,-4.2l0.73,-2.2l0.01,-0.12l-0.29,-3.3l1.46,-3.34l0.45,-5.19l0.8,-5.52l0.78,-5.89l-0.18,-4.33l-0.49,-3.47l1.1,-0.56l0.13,-0.13l0.44,-0.88l0.9,1.29l0.32,1.8l0.1,0.18l1.16,0.97l-0.73,2.33l0.01,0.21l1.33,2.91l0.97,3.6l0.35,0.22l1.57,-0.31l0.16,0.34l-0.79,2.51l-2.61,1.25l-0.17,0.28l0.08,4.36l-0.48,0.79l0.01,0.33l0.6,0.84l-1.62,1.55l-1.67,2.6l-0.89,2.47l-0.02,0.13l0.23,2.56l-1.5,2.76l-0.03,0.21l1.15,4.8l0.11,0.17l0.54,0.42l-0.01,2.37l-1.4,2.7l-0.03,0.15l0.06,2.25l-1.8,1.78l-0.09,0.21l0.02,2.73l0.71,2.63l-1.33,0.94l-0.12,0.17l-0.67,2.64l-0.59,3.03l0.4,3.55l-0.84,0.51l-0.14,0.31l0.58,3.5l0.08,0.16l0.96,0.99l-0.7,1.08l0.11,0.43l1.04,0.55l0.19,0.8l-0.89,0.48l-0.16,0.31l0.26,1.77l-0.89,4.06l-1.31,2.67l-0.03,0.19l0.28,1.53l-0.73,1.88l-1.85,1.37l-0.12,0.26l0.22,3.46l0.06,0.16l0.88,1.19l0.28,0.12l1.32,-0.17l-0.04,2.13l0.04,0.15l1.04,1.95l0.24,0.16l5.94,0.44ZM248.79,430.71l0.0,7.41l0.3,0.3l2.67,0.0l1.01,0.06l-0.54,0.91l-1.99,1.01l-1.13,-0.1l-1.42,-0.27l-1.87,-1.06l-2.57,-0.49l-3.09,-1.9l-2.52,-1.83l-2.65,-2.93l0.93,0.32l3.54,2.29l3.32,1.23l0.34,-0.09l1.29,-1.57l0.83,-2.32l2.11,-1.28l1.43,0.32Z\", \"name\": \"Chile\" }, \"CA\": { \"path\": \"M280.14,145.66l-1.66,2.88l0.06,0.37l0.37,0.03l1.5,-1.01l1.17,0.49l-0.64,0.83l0.13,0.46l2.22,0.89l0.28,-0.03l1.02,-0.7l2.09,0.83l-0.69,2.1l0.37,0.38l1.43,-0.45l0.27,1.43l0.74,1.88l-0.95,2.5l-0.88,0.09l-1.34,-0.48l0.49,-2.34l-0.14,-0.32l-0.7,-0.4l-0.36,0.04l-2.81,2.66l-0.63,-0.05l1.2,-1.01l-0.1,-0.52l-2.4,-0.77l-2.79,0.18l-4.65,-0.09l-0.22,-0.54l1.37,-0.99l0.01,-0.48l-0.82,-0.65l1.91,-1.79l2.57,-5.17l1.49,-1.81l2.04,-1.07l0.63,0.08l-0.27,0.51l-1.33,2.07ZM193.92,74.85l-0.01,4.24l0.19,0.28l0.33,-0.07l3.14,-3.22l2.65,2.5l-0.71,3.04l0.06,0.26l2.42,2.88l0.46,0.0l2.66,-3.14l1.83,-3.74l0.03,-0.12l0.13,-4.53l3.23,0.31l3.63,0.64l3.18,2.08l0.13,1.91l-1.79,2.22l-0.0,0.37l1.69,2.2l-0.28,1.8l-4.74,2.84l-3.33,0.62l-2.5,-1.21l-0.41,0.17l-0.73,2.05l-2.39,3.44l-0.74,1.78l-2.78,2.61l-3.48,0.26l-0.17,0.07l-1.98,1.68l-0.1,0.21l-0.15,2.33l-2.68,0.45l-0.17,0.09l-3.1,3.2l-2.75,4.38l-0.99,3.06l-0.14,4.31l0.25,0.31l3.5,0.58l1.07,3.24l1.18,2.76l0.34,0.18l3.43,-0.69l4.55,1.52l2.45,1.32l1.76,1.65l0.12,0.07l3.11,0.96l2.63,1.46l0.13,0.04l4.12,0.2l2.41,0.3l-0.36,2.81l0.8,3.51l1.81,3.78l0.08,0.1l3.73,3.17l0.34,0.03l1.93,-1.08l0.13,-0.15l1.35,-3.44l0.01,-0.18l-1.31,-5.38l-0.08,-0.14l-1.46,-1.5l3.68,-1.51l2.84,-2.46l1.45,-2.55l0.04,-0.17l-0.2,-2.39l-0.04,-0.12l-1.7,-3.07l-2.9,-2.64l2.79,-3.66l0.05,-0.27l-1.08,-3.38l-0.8,-5.75l1.45,-0.75l4.18,1.03l2.6,0.38l0.18,-0.03l1.93,-0.95l2.18,1.23l3.01,2.18l0.73,1.42l0.25,0.16l4.18,0.27l-0.06,2.95l0.83,4.7l0.22,0.24l2.19,0.55l1.75,2.08l0.38,0.07l3.63,-2.03l0.11,-0.11l2.38,-4.06l1.36,-1.43l1.76,3.01l3.26,4.68l2.68,4.19l-0.94,2.09l0.12,0.38l3.31,1.98l2.23,1.98l0.13,0.07l3.94,0.89l1.48,1.02l0.96,2.82l0.22,0.2l1.85,0.43l0.88,1.13l0.17,3.53l-1.68,1.16l-1.76,1.14l-4.08,1.17l-0.11,0.06l-3.08,2.65l-4.11,0.52l-5.35,-0.69l-3.76,-0.02l-2.62,0.23l-0.2,0.1l-2.05,2.29l-3.13,1.41l-0.11,0.08l-3.6,4.24l-2.87,2.92l-0.05,0.36l0.33,0.14l2.13,-0.52l0.15,-0.08l3.98,-4.15l5.16,-2.63l3.58,-0.31l1.82,1.3l-2.09,1.91l-0.09,0.29l0.8,3.46l0.82,2.37l0.15,0.17l3.25,1.56l0.16,0.03l4.14,-0.45l0.21,-0.12l2.03,-2.86l0.11,1.46l0.13,0.22l1.26,0.88l-2.7,1.78l-5.51,1.83l-2.52,1.26l-2.75,2.16l-1.52,-0.18l-0.08,-2.16l4.19,-2.47l0.14,-0.34l-0.3,-0.22l-4.01,0.1l-2.66,0.36l-1.45,-1.56l0.0,-4.16l-0.11,-0.23l-1.11,-0.91l-0.28,-0.05l-1.5,0.48l-0.7,-0.7l-0.45,0.02l-1.91,2.39l-0.8,2.5l-0.82,1.31l-0.95,0.43l-0.77,0.15l-0.23,0.2l-0.18,0.56l-8.2,0.02l-0.13,0.03l-1.19,0.61l-2.95,2.45l-0.78,1.13l-4.6,0.01l-0.12,0.02l-1.13,0.48l-0.13,0.44l0.37,0.55l0.2,0.82l-0.01,0.09l-3.1,1.42l-2.63,0.5l-2.84,1.57l-0.47,0.0l-0.72,-0.4l-0.18,-0.27l0.03,-0.15l0.52,-1.0l1.2,-1.71l0.73,-1.8l0.02,-0.17l-1.03,-5.47l-0.15,-0.21l-2.35,-1.32l0.16,-0.29l-0.05,-0.35l-0.37,-0.38l-0.22,-0.09l-0.56,0.0l-0.35,-0.34l-0.11,-0.65l-0.46,-0.2l-0.39,0.26l-0.2,-0.03l-0.11,-0.33l-0.48,-0.25l-0.21,-0.71l-0.15,-0.18l-3.97,-2.07l-4.8,-2.39l-0.25,-0.01l-2.19,0.89l-0.72,0.03l-3.04,-0.82l-0.14,-0.0l-1.94,0.4l-2.4,-0.98l-2.56,-0.51l-1.7,-0.19l-0.62,-0.44l-0.42,-1.67l-0.3,-0.23l-0.85,0.02l-0.29,0.3l-0.01,0.95l-69.26,-0.01l-4.77,-3.14l-1.78,-1.41l-4.51,-1.38l-1.3,-2.73l0.34,-1.96l-0.17,-0.33l-3.06,-1.37l-0.41,-2.58l-0.11,-0.18l-2.92,-2.4l-0.05,-1.53l1.32,-1.59l0.07,-0.2l-0.07,-2.21l-0.16,-0.26l-4.19,-2.22l-2.52,-4.02l-1.56,-2.6l-0.08,-0.09l-2.28,-1.64l-1.65,-1.48l-1.31,-1.89l-0.38,-0.1l-2.51,1.21l-2.28,1.92l-2.03,-2.22l-1.85,-1.71l-2.44,-1.04l-2.28,-0.12l0.03,-37.72l4.27,0.98l4.0,2.13l2.61,0.4l0.24,-0.07l2.17,-1.81l2.92,-1.33l3.63,0.53l0.18,-0.03l3.72,-1.94l3.89,-1.06l1.6,1.72l0.37,0.06l1.87,-1.04l0.14,-0.19l0.48,-1.83l1.37,0.38l4.18,3.96l0.41,0.0l2.89,-2.62l0.28,2.79l0.37,0.26l3.08,-0.73l0.17,-0.12l0.85,-1.16l2.81,0.24l3.83,1.86l5.86,1.61l3.46,0.75l2.44,-0.26l2.89,1.89l-3.12,1.89l-0.14,0.31l0.24,0.24l4.53,0.92l6.84,-0.5l2.04,-0.71l2.54,2.44l0.39,0.02l2.72,-2.16l-0.01,-0.48l-2.26,-1.61l1.27,-1.16l2.94,-0.19l1.94,-0.42l1.89,0.97l2.49,2.32l0.24,0.08l2.71,-0.33l4.35,1.9l0.17,0.02l3.86,-0.67l3.62,0.1l0.31,-0.33l-0.26,-2.44l1.9,-0.65l3.58,1.36l-0.01,3.84l0.23,0.29l0.34,-0.17l1.51,-3.23l1.81,0.1l0.31,-0.22l1.13,-4.37l-0.08,-0.29l-2.68,-2.73l-2.83,-1.76l0.19,-4.73l2.77,-3.15l3.06,0.69l2.44,1.97l3.24,4.88l-2.05,2.02l0.15,0.51l4.41,0.85ZM265.85,150.7l-0.84,0.04l-3.15,-0.99l-1.77,-1.17l0.19,-0.06l3.17,0.79l2.39,1.27l0.01,0.12ZM249.41,3.71l6.68,0.49l5.34,0.79l4.34,1.6l-0.08,1.24l-5.91,2.56l-6.03,1.21l-2.36,1.38l-0.14,0.34l0.29,0.22l4.37,-0.02l-4.96,3.01l-4.06,1.64l-0.11,0.08l-4.21,4.62l-5.07,0.92l-0.12,0.05l-1.53,1.1l-7.5,0.59l-0.28,0.28l0.24,0.31l2.67,0.54l-1.04,0.6l-0.09,0.44l1.89,2.49l-2.11,1.66l-3.83,1.52l-0.15,0.13l-1.14,2.01l-3.41,1.55l-0.16,0.36l0.35,1.19l0.3,0.22l3.98,-0.19l0.03,0.78l-6.42,2.99l-6.44,-1.41l-7.41,0.79l-3.72,-0.62l-4.48,-0.26l-0.25,-2.0l4.37,-1.13l0.21,-0.38l-1.14,-3.55l1.13,-0.28l6.61,2.29l0.35,-0.12l-0.04,-0.37l-3.41,-3.45l-0.14,-0.08l-3.57,-0.92l1.62,-1.7l4.36,-1.3l0.2,-0.18l0.71,-1.94l-0.12,-0.36l-3.45,-2.15l-0.88,-2.43l6.36,0.23l1.94,0.61l0.23,-0.02l3.91,-2.1l0.15,-0.32l-0.26,-0.24l-5.69,-0.67l-8.69,0.37l-4.3,-1.92l-2.12,-2.39l-2.82,-1.68l-0.44,-1.65l3.41,-1.06l2.93,-0.2l4.91,-0.99l3.69,-2.28l2.93,0.31l2.64,1.68l0.42,-0.1l1.84,-3.23l3.17,-0.96l4.45,-0.69l7.56,-0.26l1.26,0.64l0.18,0.03l7.2,-1.06l10.81,0.8ZM203.94,57.59l0.01,0.32l1.97,2.97l0.51,-0.01l2.26,-3.75l6.05,-1.89l4.08,4.72l-0.36,2.95l0.38,0.33l4.95,-1.36l0.11,-0.05l2.23,-1.77l5.37,2.31l3.32,2.14l0.3,1.89l0.36,0.25l4.48,-1.01l2.49,2.8l0.14,0.09l5.99,1.78l2.09,1.74l2.18,3.83l-4.29,1.91l-0.01,0.54l5.9,2.83l3.95,0.94l3.54,3.84l0.2,0.1l3.58,0.25l-0.67,2.51l-4.18,4.54l-2.84,-1.61l-3.91,-3.95l-0.26,-0.09l-3.24,0.52l-0.25,0.26l-0.32,2.37l0.1,0.26l2.63,2.38l3.42,1.89l0.96,1.0l1.57,3.8l-0.74,2.43l-2.85,-0.96l-6.26,-3.15l-0.38,0.09l0.04,0.39l3.54,3.4l2.55,2.31l0.23,0.78l-6.26,-1.43l-5.33,-2.25l-2.73,-1.73l0.67,-0.86l-0.09,-0.45l-7.38,-4.01l-0.44,0.27l0.03,0.89l-6.85,0.61l-1.8,-1.17l1.43,-2.6l4.56,-0.07l5.15,-0.52l0.23,-0.45l-0.76,-1.34l0.8,-1.89l3.21,-4.06l0.05,-0.29l-0.72,-1.95l-0.97,-1.47l-0.11,-0.1l-3.84,-2.1l-4.53,-1.33l1.09,-0.75l0.05,-0.45l-2.65,-2.75l-0.18,-0.09l-2.12,-0.24l-1.91,-1.47l-0.39,0.02l-1.27,1.25l-4.4,0.56l-9.06,-0.99l-5.28,-1.31l-4.01,-0.67l-1.72,-1.31l2.32,-1.85l0.1,-0.33l-0.28,-0.2l-3.3,-0.02l-0.74,-4.36l1.86,-4.09l2.46,-1.88l5.74,-1.15l-1.5,2.55ZM261.28,159.28l0.19,0.14l1.82,0.42l1.66,-0.05l-0.66,0.68l-0.75,0.16l-3.0,-1.25l-0.46,-0.77l0.51,-0.52l0.68,1.19ZM230.87,84.48l-2.48,0.19l-0.52,-1.74l0.96,-2.17l2.03,-0.53l1.71,1.04l0.02,1.6l-0.22,0.46l-1.5,1.16ZM229.52,58.19l0.14,0.82l-4.99,-0.22l-2.73,0.63l-0.59,-0.23l-2.61,-2.4l0.08,-1.38l0.94,-0.25l5.61,0.51l4.14,2.54ZM222.12,105.0l-0.79,1.63l-0.75,-0.22l-0.52,-0.91l0.04,-0.09l0.84,-1.01l0.74,0.06l0.44,0.55ZM183.77,38.22l2.72,1.65l0.16,0.04l4.83,-0.01l1.92,1.52l-0.51,1.75l0.18,0.36l2.84,1.14l1.56,1.19l0.16,0.06l3.37,0.22l3.65,0.42l4.07,-1.1l5.05,-0.43l3.96,0.35l2.53,1.8l0.48,1.79l-1.37,1.16l-3.6,1.03l-3.22,-0.59l-7.17,0.76l-5.1,0.09l-4.0,-0.6l-6.48,-1.56l-0.81,-2.57l-0.3,-2.49l-0.1,-0.19l-2.51,-2.25l-0.16,-0.07l-5.12,-0.63l-2.61,-1.45l0.75,-1.71l4.88,0.32ZM207.46,91.26l0.42,1.62l0.42,0.19l1.12,-0.55l1.35,0.99l2.74,1.39l2.73,1.2l0.2,1.74l0.35,0.26l1.72,-0.29l1.31,0.97l-1.72,0.96l-3.68,-0.9l-1.34,-1.71l-0.43,-0.04l-2.46,2.1l-3.23,1.85l-0.74,-1.98l-0.31,-0.19l-2.47,0.28l1.49,-1.34l0.1,-0.19l0.32,-3.15l0.79,-3.45l1.34,0.25ZM215.59,102.66l-2.73,2.0l-1.49,-0.08l-0.37,-0.7l1.61,-1.56l3.0,0.03l-0.02,0.3ZM202.79,24.07l0.11,0.12l2.54,1.53l-3.01,1.47l-4.55,4.07l-4.3,0.38l-5.07,-0.68l-2.51,-2.09l0.03,-1.72l1.86,-1.4l0.1,-0.34l-0.29,-0.2l-4.49,0.04l-2.63,-1.79l-1.45,-2.36l1.61,-2.38l1.65,-1.69l2.47,-0.4l0.19,-0.48l-0.72,-0.89l5.1,-0.26l3.1,3.05l0.13,0.07l4.21,1.25l3.99,1.06l1.92,3.65ZM187.5,59.3l-0.15,0.1l-2.59,3.4l-2.5,-0.15l-1.47,-3.92l0.04,-2.24l1.22,-1.92l2.34,-1.26l5.11,0.17l4.28,1.06l-3.36,3.86l-2.9,0.9ZM186.19,48.8l-1.15,1.63l-3.42,-0.35l-2.68,-1.15l1.11,-1.88l3.34,-1.27l2.01,1.63l0.79,1.38ZM185.78,35.41l-0.95,0.13l-4.48,-0.33l-0.4,-0.91l4.5,0.07l1.45,0.82l-0.1,0.21ZM180.76,32.56l-3.43,1.03l-1.85,-1.14l-1.01,-1.92l-0.16,-1.87l2.87,0.2l1.39,0.35l2.75,1.75l-0.55,1.6ZM181.03,76.32l-1.21,1.2l-3.19,-1.26l-0.18,-0.01l-1.92,0.45l-2.88,-1.67l1.84,-1.16l1.6,-1.77l2.45,1.17l1.45,0.77l2.05,2.28ZM169.72,54.76l2.83,0.97l0.14,0.01l4.25,-0.58l0.47,1.01l-2.19,2.16l0.07,0.48l3.61,1.95l-0.41,3.84l-3.87,1.68l-2.23,-0.36l-1.73,-1.75l-6.07,-3.53l0.03,-1.01l4.79,0.55l0.3,-0.16l-0.04,-0.34l-2.55,-2.89l2.59,-2.05ZM174.44,40.56l1.49,1.87l0.07,2.48l-1.07,3.52l-3.87,0.48l-2.41,-0.72l0.05,-2.72l-0.33,-0.3l-3.79,0.36l-0.13,-3.31l2.36,0.14l0.15,-0.03l3.7,-1.74l3.44,0.29l0.31,-0.22l0.03,-0.12ZM170.14,31.5l0.75,1.74l-3.52,-0.52l-4.19,-1.77l-4.65,-0.17l1.65,-1.11l-0.05,-0.52l-2.86,-1.26l-0.13,-1.58l4.52,0.7l6.66,1.99l1.84,2.5ZM134.64,58.08l-1.08,1.93l0.34,0.44l5.44,-1.41l3.37,2.32l0.37,-0.02l2.66,-2.28l2.03,1.38l2.01,4.53l0.53,0.04l1.26,-1.93l0.03,-0.27l-1.67,-4.55l1.82,-0.58l2.36,0.73l2.69,1.84l1.53,4.46l0.77,3.24l0.15,0.19l4.22,2.26l4.32,2.04l-0.21,1.51l-3.87,0.34l-0.19,0.5l1.45,1.54l-0.65,1.23l-4.3,-0.65l-4.4,-1.19l-2.97,0.28l-4.67,1.48l-6.31,0.65l-4.27,0.39l-1.26,-1.91l-0.15,-0.12l-3.42,-1.2l-0.16,-0.01l-2.05,0.45l-2.66,-3.02l1.2,-0.34l3.82,-0.76l3.58,0.19l3.27,-0.78l0.23,-0.29l-0.24,-0.29l-4.84,-1.06l-5.42,0.35l-3.4,-0.09l-0.97,-1.22l5.39,-1.7l0.21,-0.33l-0.3,-0.25l-3.82,0.06l-3.95,-1.1l1.88,-3.13l1.68,-1.81l6.54,-2.84l2.11,0.77ZM158.85,56.58l-1.82,2.62l-3.38,-2.9l0.49,-0.39l3.17,-0.18l1.54,0.86ZM149.71,42.7l1.0,1.87l0.37,0.14l2.17,-0.83l2.33,0.2l0.38,2.16l-1.38,2.17l-8.33,0.76l-6.34,2.15l-3.51,0.1l-0.22,-1.13l4.98,-2.12l0.17,-0.34l-0.31,-0.23l-11.27,0.6l-3.04,-0.78l3.14,-4.57l2.2,-1.35l6.87,1.7l4.4,3.0l0.14,0.05l4.37,0.39l0.27,-0.48l-3.41,-4.68l1.96,-1.62l2.28,0.53l0.79,2.32ZM145.44,29.83l-2.18,0.77l-3.79,-0.0l0.02,-0.31l2.34,-1.5l1.2,0.23l2.42,0.83ZM144.83,34.5l-4.44,1.46l-3.18,-1.48l1.6,-1.36l3.51,-0.53l3.1,0.75l-0.6,1.16ZM119.02,65.87l-6.17,2.07l-1.19,-1.82l-0.13,-0.11l-5.48,-2.32l0.92,-1.7l1.73,-3.44l2.16,-3.15l-0.02,-0.36l-2.09,-2.56l7.84,-0.71l3.59,1.02l6.32,0.27l2.35,1.37l2.25,1.71l-2.68,1.04l-6.21,3.41l-3.1,3.28l-0.08,0.21l0.0,1.81ZM129.66,35.4l-0.3,3.55l-1.77,1.67l-2.34,0.27l-4.62,2.2l-3.89,0.76l-2.83,-0.93l3.85,-3.52l5.04,-3.36l3.75,0.07l3.11,-0.7ZM111.24,152.74l-0.82,0.29l-3.92,-1.39l-0.7,-1.06l-0.12,-0.1l-2.15,-1.09l-0.41,-0.84l-0.2,-0.16l-2.44,-0.56l-0.84,-1.56l0.1,-0.36l2.34,0.64l1.53,0.5l2.28,0.34l0.78,1.04l1.24,1.55l0.09,0.08l2.42,1.3l0.81,1.39ZM88.54,134.82l0.14,0.02l2.0,-0.23l-0.67,3.48l0.06,0.24l1.78,2.22l-0.24,-0.0l-1.4,-1.42l-0.91,-1.53l-1.26,-1.08l-0.42,-1.35l0.09,-0.66l0.82,0.31Z\", \"name\": \"Canada\" }, \"CG\": { \"path\": \"M453.66,296.61l-0.9,-0.82l-0.35,-0.04l-0.83,0.48l-0.77,0.83l-1.65,-2.13l1.66,-1.2l0.08,-0.39l-0.81,-1.43l0.59,-0.43l1.62,-0.29l0.24,-0.24l0.1,-0.58l0.94,0.84l0.19,0.08l2.21,0.11l0.27,-0.14l0.81,-1.29l0.32,-1.76l-0.27,-1.96l-0.06,-0.15l-1.08,-1.35l1.02,-2.74l-0.09,-0.34l-0.62,-0.5l-0.22,-0.06l-1.66,0.18l-0.55,-1.03l0.12,-0.73l2.85,0.09l1.98,0.65l2.0,0.59l0.38,-0.25l0.17,-1.3l1.26,-2.24l1.34,-1.19l1.54,0.38l1.35,0.12l-0.11,1.15l-0.74,1.34l-0.5,1.61l-0.31,2.22l0.12,1.41l-0.4,0.9l-0.06,0.88l-0.24,0.67l-1.57,1.15l-1.24,1.41l-1.09,2.43l-0.03,0.13l0.08,1.95l-0.55,0.69l-1.46,1.23l-1.32,1.41l-0.61,-0.29l-0.13,-0.57l-0.29,-0.23l-1.36,-0.02l-0.23,0.1l-0.72,0.81l-0.41,-0.16Z\", \"name\": \"Republic of the Congo\" }, \"CF\": { \"path\": \"M459.41,266.56l1.9,-0.17l0.22,-0.12l0.36,-0.5l0.14,0.02l0.55,0.51l0.29,0.07l3.15,-0.96l0.12,-0.07l1.05,-0.97l1.29,-0.87l0.12,-0.33l-0.17,-0.61l0.38,-0.12l2.36,0.15l0.15,-0.03l2.36,-1.17l0.12,-0.1l1.78,-2.72l1.18,-0.96l1.23,-0.34l0.21,0.79l0.07,0.13l1.37,1.5l0.01,0.86l-0.39,1.0l-0.01,0.17l0.16,0.78l0.1,0.17l0.91,0.76l1.89,1.09l1.24,0.92l0.02,0.67l0.12,0.23l1.67,1.3l0.99,1.03l0.61,1.46l0.14,0.15l1.79,0.95l0.2,0.4l-0.44,0.14l-1.54,-0.06l-1.98,-0.26l-0.93,0.22l-0.19,0.14l-0.3,0.48l-0.57,0.05l-0.91,-0.49l-0.26,-0.01l-2.7,1.21l-1.04,-0.23l-0.21,0.03l-0.34,0.19l-0.12,0.13l-0.64,1.3l-1.67,-0.43l-1.77,-0.24l-1.58,-0.91l-2.06,-0.85l-0.27,0.02l-1.42,0.88l-0.97,1.27l-0.06,0.14l-0.19,1.46l-1.3,-0.11l-1.67,-0.42l-0.27,0.07l-1.55,1.41l-0.99,1.76l-0.14,-1.18l-0.13,-0.22l-1.1,-0.78l-0.86,-1.2l-0.2,-0.84l-0.07,-0.13l-1.07,-1.19l0.16,-0.59l0.0,-0.15l-0.24,-1.01l0.18,-1.77l0.5,-0.38l0.09,-0.11l1.18,-2.4Z\", \"name\": \"Central African Republic\" }, \"CD\": { \"path\": \"M497.85,276.25l-0.14,2.77l0.2,0.3l0.57,0.19l-0.47,0.52l-1.0,0.71l-0.96,1.31l-0.56,1.22l-0.16,2.04l-0.54,0.89l-0.04,0.15l-0.02,1.76l-0.63,0.61l-0.09,0.2l-0.08,1.33l-0.2,0.11l-0.15,0.21l-0.23,1.37l0.03,0.2l0.6,1.08l0.16,2.96l0.44,2.29l-0.24,1.25l0.01,0.15l0.5,1.46l0.07,0.12l1.41,1.37l1.09,2.56l-0.51,-0.11l-3.45,0.45l-0.67,0.3l-0.15,0.15l-0.71,1.61l0.01,0.26l0.52,1.03l-0.43,2.9l-0.31,2.55l0.13,0.29l0.7,0.46l1.75,0.99l0.31,-0.01l0.26,-0.17l0.15,1.9l-1.44,-0.02l-0.94,-1.28l-0.94,-1.1l-0.17,-0.1l-1.76,-0.33l-0.5,-1.18l-0.42,-0.15l-1.44,0.75l-1.79,-0.32l-0.77,-1.05l-0.2,-0.12l-1.59,-0.23l-0.97,0.04l-0.1,-0.53l-0.27,-0.25l-0.86,-0.06l-1.13,-0.15l-1.62,0.37l-1.04,-0.06l-0.32,0.09l0.11,-2.56l-0.08,-0.21l-0.77,-0.87l-0.17,-1.41l0.36,-1.47l-0.03,-0.21l-0.48,-0.91l-0.04,-1.52l-0.3,-0.29l-2.65,0.02l0.13,-0.53l-0.29,-0.37l-1.28,0.01l-0.28,0.21l-0.07,0.24l-1.35,0.09l-0.26,0.18l-0.62,1.45l-0.25,0.42l-1.17,-0.3l-0.19,0.01l-0.79,0.34l-1.44,0.18l-1.41,-1.96l-0.7,-1.47l-0.61,-1.86l-0.28,-0.21l-7.39,-0.03l-0.92,0.3l-0.78,-0.03l-0.78,0.25l-0.11,-0.25l0.35,-0.15l0.18,-0.26l0.07,-1.02l0.33,-0.52l0.72,-0.42l0.52,0.2l0.33,-0.08l0.76,-0.86l0.99,0.02l0.11,0.48l0.16,0.2l0.94,0.44l0.35,-0.07l1.46,-1.56l1.44,-1.21l0.68,-0.85l0.06,-0.2l-0.08,-1.99l1.04,-2.33l1.1,-1.23l1.62,-1.19l0.11,-0.14l0.29,-0.8l0.08,-0.94l0.38,-0.82l0.03,-0.16l-0.13,-1.38l0.3,-2.16l0.47,-1.51l0.73,-1.31l0.04,-0.12l0.15,-1.51l0.21,-1.66l0.89,-1.16l1.16,-0.7l1.9,0.79l1.69,0.95l1.81,0.24l1.85,0.48l0.35,-0.16l0.71,-1.43l0.16,-0.09l1.03,0.23l0.19,-0.02l2.65,-1.19l0.86,0.46l0.17,0.03l0.81,-0.08l0.23,-0.14l0.31,-0.5l0.75,-0.17l1.83,0.26l1.64,0.06l0.72,-0.21l1.39,1.9l0.16,0.11l1.12,0.3l0.24,-0.04l0.58,-0.36l1.05,0.15l0.15,-0.02l1.15,-0.44l0.47,0.84l0.08,0.09l2.08,1.57Z\", \"name\": \"Democratic Republic of the Congo\" }, \"CZ\": { \"path\": \"M463.29,152.22l-0.88,-0.47l-0.18,-0.03l-1.08,0.15l-1.86,-0.94l-0.21,-0.02l-0.88,0.24l-0.13,0.07l-1.25,1.17l-1.63,-0.91l-1.38,-1.36l-1.22,-0.75l-0.24,-1.24l-0.33,-0.75l1.53,-0.6l0.98,-0.84l1.74,-0.62l0.11,-0.07l0.47,-0.47l0.46,0.27l0.24,0.03l0.96,-0.3l1.06,0.95l0.15,0.07l1.57,0.24l-0.1,0.6l0.16,0.32l1.36,0.68l0.41,-0.15l0.28,-0.62l1.29,0.28l0.19,0.84l0.26,0.23l1.73,0.18l0.74,1.02l-0.17,0.0l-0.25,0.13l-0.32,0.49l-0.46,0.11l-0.22,0.23l-0.13,0.57l-0.32,0.1l-0.2,0.22l-0.03,0.14l-0.65,0.25l-1.05,-0.05l-0.28,0.17l-0.22,0.43Z\", \"name\": \"Czech Republic\" }, \"CY\": { \"path\": \"M505.03,193.75l-1.51,0.68l-1.0,-0.3l-0.32,-0.63l0.69,-0.06l0.41,0.13l0.19,-0.0l0.62,-0.22l0.31,0.02l0.06,0.22l0.49,0.17l0.06,-0.01Z\", \"name\": \"Cyprus\" }, \"CR\": { \"path\": \"M213.0,263.84l-0.98,-0.4l-0.3,-0.31l0.16,-0.24l0.05,-0.21l-0.09,-0.56l-0.1,-0.18l-0.76,-0.65l-0.99,-0.5l-0.74,-0.28l-0.13,-0.58l-0.12,-0.18l-0.66,-0.45l-0.34,-0.0l-0.13,0.31l0.13,0.59l-0.17,0.21l-0.34,-0.42l-0.14,-0.1l-0.7,-0.22l-0.23,-0.34l0.01,-0.62l0.31,-0.74l-0.14,-0.38l-0.3,-0.15l0.47,-0.4l1.48,0.6l0.26,-0.02l0.47,-0.27l0.58,0.15l0.35,0.44l0.17,0.11l0.74,0.17l0.27,-0.07l0.3,-0.27l0.52,1.09l0.97,1.02l0.77,0.71l-0.41,0.1l-0.23,0.3l0.01,1.02l0.12,0.24l0.2,0.14l-0.07,0.05l-0.11,0.3l0.08,0.37l-0.23,0.63Z\", \"name\": \"Costa Rica\" }, \"CU\": { \"path\": \"M215.01,226.09l2.08,0.18l1.94,0.03l2.24,0.86l0.95,0.92l0.25,0.08l2.22,-0.28l0.79,0.55l3.68,2.81l0.19,0.06l0.77,-0.03l1.18,0.42l-0.12,0.47l0.27,0.37l1.78,0.1l1.59,0.9l-0.11,0.22l-1.5,0.3l-1.64,0.13l-1.75,-0.2l-2.69,0.19l1.0,-0.86l-0.03,-0.48l-1.02,-0.68l-0.13,-0.05l-1.52,-0.16l-0.74,-0.64l-0.57,-1.42l-0.3,-0.19l-1.36,0.1l-2.23,-0.67l-0.71,-0.52l-0.14,-0.06l-3.2,-0.4l-0.42,-0.25l0.56,-0.39l0.12,-0.33l-0.27,-0.22l-2.46,-0.13l-0.2,0.06l-1.72,1.31l-0.94,0.03l-0.25,0.15l-0.29,0.53l-1.04,0.24l-0.29,-0.07l0.7,-0.43l0.1,-0.11l0.5,-0.87l1.04,-0.54l1.23,-0.49l1.86,-0.25l0.62,-0.28Z\", \"name\": \"Cuba\" }, \"SZ\": { \"path\": \"M500.95,353.41l-0.41,0.97l-1.16,0.23l-1.29,-1.26l-0.02,-0.71l0.63,-0.93l0.23,-0.7l0.47,-0.12l1.04,0.4l0.32,1.05l0.2,1.08Z\", \"name\": \"Swaziland\" }, \"SY\": { \"path\": \"M510.84,199.83l0.09,-0.11l0.07,-0.2l-0.04,-1.08l0.56,-1.4l1.3,-1.01l0.1,-0.34l-0.41,-1.11l-0.24,-0.19l-0.89,-0.11l-0.2,-1.84l0.55,-1.05l1.3,-1.22l0.09,-0.19l0.09,-1.09l0.39,0.27l0.25,0.04l2.66,-0.77l1.35,0.52l2.06,-0.01l2.93,-1.08l1.35,0.04l2.14,-0.34l-0.83,1.16l-1.31,0.68l-0.16,0.3l0.23,2.03l-0.9,3.25l-5.43,2.87l-4.79,2.91l-2.32,-0.92Z\", \"name\": \"Syria\" }, \"KG\": { \"path\": \"M599.04,172.15l0.38,-0.9l1.43,-0.37l4.04,1.02l0.37,-0.23l0.36,-1.64l1.17,-0.52l3.45,1.24l0.2,-0.0l0.86,-0.31l4.09,0.08l3.61,0.31l1.18,1.02l0.11,0.06l1.19,0.34l-0.13,0.26l-3.84,1.58l-0.13,0.1l-0.81,1.08l-3.08,0.34l-0.24,0.16l-0.85,1.7l-2.43,-0.37l-0.14,0.01l-1.79,0.61l-2.39,1.4l-0.12,0.39l0.25,0.49l-0.48,0.45l-4.57,0.43l-3.04,-0.94l-2.45,0.18l0.14,-1.02l2.42,0.44l0.27,-0.08l0.81,-0.81l1.76,0.27l0.21,-0.05l3.21,-2.14l-0.03,-0.51l-2.97,-1.57l-0.26,-0.01l-1.64,0.69l-1.38,-0.84l1.81,-1.67l-0.09,-0.5l-0.46,-0.18Z\", \"name\": \"Kyrgyzstan\" }, \"KE\": { \"path\": \"M523.3,287.04l0.06,0.17l1.29,1.8l-1.46,0.84l-0.11,0.11l-0.55,0.93l-0.81,0.16l-0.24,0.24l-0.34,1.69l-0.81,1.06l-0.46,1.58l-0.76,0.63l-3.3,-2.3l-0.16,-1.32l-0.15,-0.23l-9.35,-5.28l-0.02,-2.4l1.92,-2.63l0.91,-1.83l0.01,-0.24l-1.09,-2.86l-0.29,-1.24l-1.09,-1.63l2.93,-2.85l0.92,0.3l0.0,1.19l0.09,0.22l0.86,0.83l0.21,0.08l1.65,0.0l3.09,2.08l0.16,0.05l0.79,0.03l0.54,-0.06l0.58,0.28l1.67,0.2l0.28,-0.12l0.69,-0.98l2.04,-0.94l0.86,0.73l0.19,0.07l1.1,0.0l-1.82,2.36l-0.06,0.18l0.03,9.12Z\", \"name\": \"Kenya\" }, \"SS\": { \"path\": \"M505.7,261.39l0.02,1.64l-0.27,0.55l-1.15,0.05l-0.24,0.15l-0.85,1.44l0.22,0.45l1.44,0.17l1.15,1.12l0.42,0.95l0.14,0.15l1.06,0.54l1.33,2.45l-3.06,2.98l-1.44,1.08l-1.75,0.01l-1.92,0.56l-1.5,-0.53l-0.27,0.03l-0.85,0.57l-1.98,-1.5l-0.56,-1.02l-0.37,-0.13l-1.32,0.5l-1.08,-0.15l-0.2,0.04l-0.56,0.35l-0.9,-0.24l-1.44,-1.97l-0.39,-0.77l-0.13,-0.13l-1.78,-0.94l-0.65,-1.5l-1.08,-1.12l-1.57,-1.22l-0.02,-0.68l-0.12,-0.23l-1.37,-1.02l-1.17,-0.68l0.2,-0.08l0.86,-0.48l0.14,-0.18l0.63,-2.22l0.6,-1.02l1.47,-0.28l0.35,0.56l1.29,1.48l0.14,0.09l0.69,0.22l0.22,-0.02l0.83,-0.4l1.58,0.08l0.26,0.39l0.25,0.13l2.49,0.0l0.3,-0.25l0.06,-0.35l1.13,-0.42l0.18,-0.18l0.22,-0.63l0.68,-0.38l1.95,1.37l0.23,0.05l1.29,-0.26l0.19,-0.12l1.23,-1.8l1.36,-1.37l0.08,-0.25l-0.21,-1.52l-0.06,-0.15l-0.25,-0.3l0.94,-0.08l0.26,-0.21l0.1,-0.32l0.6,0.09l-0.25,1.67l0.3,1.83l0.11,0.19l1.22,0.94l0.25,0.73l-0.04,1.2l0.26,0.31l0.09,0.01Z\", \"name\": \"South Sudan\" }, \"SR\": { \"path\": \"M278.1,270.26l2.71,0.45l0.31,-0.14l0.19,-0.32l1.82,-0.16l2.25,0.56l-1.09,1.81l-0.04,0.19l0.2,1.72l0.05,0.13l0.9,1.35l-0.39,0.99l-0.21,1.09l-0.48,0.8l-1.2,-0.44l-0.17,-0.01l-1.12,0.24l-0.95,-0.21l-0.35,0.2l-0.25,0.73l0.05,0.29l0.3,0.35l-0.06,0.13l-1.01,-0.15l-1.42,-2.03l-0.32,-1.36l-0.29,-0.23l-0.63,-0.0l-0.95,-1.56l0.41,-1.16l0.01,-0.17l-0.08,-0.35l1.29,-0.56l0.18,-0.22l0.35,-1.97Z\", \"name\": \"Suriname\" }, \"KH\": { \"path\": \"M680.28,257.89l-0.93,-1.2l-1.24,-2.56l-0.56,-2.9l1.45,-1.92l3.07,-0.46l2.26,0.35l2.03,0.98l0.38,-0.11l1.0,-1.55l1.86,0.79l0.52,1.51l-0.28,2.82l-4.05,1.88l-0.12,0.45l0.79,1.1l-2.2,0.17l-2.08,0.98l-1.89,-0.33Z\", \"name\": \"Cambodia\" }, \"SV\": { \"path\": \"M197.02,248.89l0.18,-0.05l0.59,0.17l0.55,0.51l0.64,0.35l0.06,0.22l0.37,0.21l1.01,-0.28l0.38,0.13l0.16,0.13l-0.14,0.81l-0.18,0.38l-1.22,-0.03l-0.84,-0.23l-1.11,-0.52l-1.31,-0.15l-0.49,-0.38l0.02,-0.08l0.76,-0.57l0.46,-0.27l0.11,-0.35Z\", \"name\": \"El Salvador\" }, \"SK\": { \"path\": \"M468.01,150.02l0.05,0.07l0.36,0.1l0.85,-0.37l1.12,1.02l0.33,0.05l1.38,-0.65l1.07,0.3l0.16,0.0l1.69,-0.43l1.95,1.02l-0.51,0.64l-0.45,1.2l-0.32,0.2l-2.55,-0.93l-0.17,-0.01l-0.82,0.2l-0.17,0.11l-0.53,0.68l-0.94,0.32l-0.14,-0.11l-0.29,-0.04l-1.18,0.48l-0.95,0.09l-0.26,0.21l-0.15,0.47l-1.84,0.34l-0.82,-0.31l-1.14,-0.73l-0.2,-0.89l0.42,-0.84l0.91,0.05l0.12,-0.02l0.86,-0.33l0.18,-0.21l0.03,-0.13l0.32,-0.1l0.2,-0.22l0.12,-0.55l0.39,-0.1l0.18,-0.13l0.3,-0.45l0.43,-0.0Z\", \"name\": \"Slovakia\" }, \"KR\": { \"path\": \"M737.31,185.72l0.84,0.08l0.27,-0.12l0.89,-1.2l1.63,-0.13l1.1,-0.2l0.21,-0.16l0.12,-0.24l1.86,2.95l0.59,1.79l0.02,3.17l-0.84,1.38l-2.23,0.55l-1.95,1.14l-1.91,0.21l-0.22,-1.21l0.45,-2.07l-0.01,-0.17l-0.99,-2.67l1.54,-0.4l0.17,-0.46l-1.55,-2.24Z\", \"name\": \"South Korea\" }, \"SI\": { \"path\": \"M455.77,159.59l1.79,0.21l0.18,-0.04l1.2,-0.68l2.12,-0.08l0.21,-0.1l0.38,-0.42l0.1,0.01l0.28,0.62l-1.71,0.71l-0.18,0.22l-0.21,1.1l-0.71,0.26l-0.2,0.28l0.01,0.55l-0.59,-0.04l-0.79,-0.47l-0.38,0.06l-0.36,0.41l-0.84,-0.05l0.05,-0.15l-0.56,-1.24l0.21,-1.17Z\", \"name\": \"Slovenia\" }, \"KP\": { \"path\": \"M747.76,172.02l-0.23,-0.04l-0.26,0.08l-1.09,1.02l-0.78,1.06l-0.06,0.19l0.09,1.95l-1.12,0.57l-0.53,0.58l-0.88,0.82l-1.69,0.51l-1.09,0.79l-0.12,0.22l-0.07,1.17l-0.22,0.25l0.09,0.47l0.96,0.46l1.22,1.1l-0.19,0.37l-0.91,0.16l-1.75,0.14l-0.22,0.12l-0.87,1.18l-0.95,-0.09l-0.3,0.18l-0.97,-0.44l-0.39,0.13l-0.25,0.44l-0.29,0.09l-0.03,-0.2l-0.18,-0.23l-0.62,-0.25l-0.43,-0.29l0.52,-0.97l0.52,-0.3l0.13,-0.38l-0.18,-0.42l0.59,-1.47l0.01,-0.21l-0.16,-0.48l-0.22,-0.2l-1.41,-0.31l-0.82,-0.55l1.74,-1.62l2.73,-1.58l1.62,-1.96l0.96,0.76l0.17,0.06l2.17,0.11l0.31,-0.37l-0.32,-1.31l3.61,-1.21l0.16,-0.13l0.79,-1.34l1.25,1.38Z\", \"name\": \"North Korea\" }, \"SO\": { \"path\": \"M543.8,256.48l0.61,-0.05l1.14,-0.37l1.31,-0.25l0.12,-0.05l1.11,-0.81l0.57,-0.0l0.03,0.39l-0.23,1.49l0.01,1.25l-0.52,0.92l-0.7,2.71l-1.19,2.79l-1.54,3.2l-2.13,3.66l-2.12,2.79l-2.92,3.39l-2.47,2.0l-3.76,2.5l-2.33,1.9l-2.77,3.06l-0.61,1.35l-0.28,0.29l-1.22,-1.69l-0.03,-8.92l2.12,-2.76l0.59,-0.68l1.47,-0.04l0.18,-0.06l2.15,-1.71l3.16,-0.11l0.21,-0.09l7.08,-7.55l1.76,-2.12l1.14,-1.57l0.06,-0.18l0.01,-4.67Z\", \"name\": \"Somalia\" }, \"SN\": { \"path\": \"M379.28,250.34l-0.95,-1.82l-0.09,-0.1l-0.83,-0.6l0.62,-0.28l0.13,-0.11l1.21,-1.8l0.6,-1.31l0.71,-0.68l1.09,0.2l0.18,-0.02l1.17,-0.53l1.25,-0.03l1.17,0.73l1.59,0.65l1.47,1.83l1.59,1.7l0.12,1.56l0.49,1.46l0.1,0.14l0.85,0.65l0.18,0.82l-0.08,0.57l-0.13,0.05l-1.29,-0.19l-0.29,0.13l-0.11,0.16l-0.35,0.04l-1.83,-0.61l-5.84,-0.13l-0.12,0.02l-0.6,0.26l-0.87,-0.06l-1.01,0.32l-0.26,-1.26l1.9,0.04l0.16,-0.04l0.54,-0.32l0.37,-0.02l0.15,-0.05l0.78,-0.5l0.92,0.46l0.12,0.03l1.09,0.04l0.15,-0.03l1.08,-0.57l0.11,-0.44l-0.51,-0.74l-0.39,-0.1l-0.76,0.39l-0.62,-0.01l-0.92,-0.58l-0.18,-0.05l-0.79,0.04l-0.2,0.09l-0.48,0.51l-2.41,0.06Z\", \"name\": \"Senegal\" }, \"SL\": { \"path\": \"M392.19,267.53l-0.44,-0.12l-1.73,-0.97l-1.24,-1.28l-0.4,-0.84l-0.27,-1.65l1.21,-1.0l0.09,-0.12l0.27,-0.66l0.32,-0.41l0.56,-0.05l0.16,-0.07l0.5,-0.41l1.75,0.0l0.59,0.77l0.49,0.96l-0.07,0.64l0.04,0.19l0.36,0.58l-0.03,0.84l0.24,0.2l-0.64,0.65l-1.13,1.37l-0.06,0.14l-0.12,0.66l-0.43,0.58Z\", \"name\": \"Sierra Leone\" }, \"SB\": { \"path\": \"M826.74,311.51l0.23,0.29l-0.95,-0.01l-0.39,-0.63l0.65,0.27l0.45,0.09ZM825.01,308.52l-1.18,-1.39l-0.37,-1.06l0.24,0.0l0.82,1.84l0.49,0.6ZM823.21,309.42l-0.44,0.03l-1.43,-0.24l-0.32,-0.24l0.08,-0.5l1.29,0.31l0.72,0.47l0.11,0.18ZM817.9,303.81l2.59,1.44l0.3,0.41l-1.21,-0.66l-1.34,-0.89l-0.34,-0.3ZM813.77,302.4l0.48,0.34l0.1,0.08l-0.33,-0.17l-0.25,-0.25Z\", \"name\": \"Solomon Islands\" }, \"SA\": { \"path\": \"M528.24,243.1l-0.2,-0.69l-0.07,-0.12l-0.69,-0.71l-0.18,-0.94l-0.12,-0.19l-1.24,-0.89l-1.28,-2.09l-0.7,-2.08l-0.07,-0.11l-1.73,-1.79l-0.11,-0.07l-1.03,-0.39l-1.57,-2.36l-0.27,-1.72l0.1,-1.53l-0.03,-0.15l-1.44,-2.93l-1.25,-1.13l-1.34,-0.56l-0.72,-1.33l0.11,-0.49l-0.02,-0.2l-0.7,-1.38l-0.08,-0.1l-0.68,-0.56l-0.97,-1.98l-2.8,-4.03l-0.25,-0.13l-0.85,0.01l0.29,-1.11l0.12,-0.97l0.23,-0.81l2.52,0.39l0.23,-0.06l1.08,-0.84l0.6,-0.95l1.78,-0.35l0.22,-0.17l0.37,-0.83l0.74,-0.42l0.08,-0.46l-2.17,-2.4l4.55,-1.26l0.12,-0.06l0.36,-0.32l2.83,0.71l3.67,1.91l7.04,5.5l0.17,0.06l4.64,0.22l2.06,0.24l0.55,1.15l0.28,0.17l1.56,-0.06l0.9,2.15l0.14,0.15l1.14,0.57l0.39,0.85l0.11,0.13l1.59,1.06l0.12,0.91l-0.23,0.83l0.01,0.18l0.32,0.9l0.07,0.11l0.68,0.7l0.33,0.86l0.37,0.65l0.09,0.1l0.76,0.53l0.25,0.04l0.45,-0.12l0.35,0.75l0.1,0.63l0.96,2.68l0.23,0.19l7.53,1.33l0.27,-0.09l0.24,-0.26l0.87,1.41l-1.58,4.96l-7.34,2.54l-7.28,1.02l-2.34,1.17l-0.12,0.1l-1.74,2.63l-0.86,0.32l-0.49,-0.68l-0.28,-0.12l-0.92,0.12l-2.32,-0.25l-0.41,-0.23l-0.15,-0.04l-2.89,0.06l-0.63,0.2l-0.91,-0.59l-0.43,0.11l-0.66,1.27l-0.03,0.21l0.21,0.89l-0.6,0.45Z\", \"name\": \"Saudi Arabia\" }, \"SE\": { \"path\": \"M476.42,90.44l-0.15,0.1l-2.43,2.86l-0.07,0.24l0.36,2.31l-3.84,3.1l-4.83,3.38l-0.11,0.15l-1.82,5.45l0.03,0.26l1.78,2.68l2.27,1.99l-2.13,3.88l-2.49,0.82l-0.2,0.24l-0.95,6.05l-1.32,3.09l-2.82,-0.32l-0.3,0.16l-1.34,2.64l-2.48,0.14l-0.76,-3.15l-2.09,-4.04l-1.85,-5.01l1.03,-1.98l2.06,-2.53l0.06,-0.13l0.83,-4.45l-0.06,-0.25l-1.54,-1.86l-0.15,-5.0l1.52,-3.48l2.28,0.06l0.27,-0.16l0.87,-1.59l-0.01,-0.31l-0.8,-1.21l3.79,-5.63l4.07,-7.54l2.23,0.01l0.29,-0.22l0.59,-2.15l4.46,0.66l0.34,-0.26l0.34,-2.64l1.21,-0.14l3.24,2.08l3.78,2.85l0.06,6.37l0.03,0.14l0.67,1.29l-3.95,1.07Z\", \"name\": \"Sweden\" }, \"SD\": { \"path\": \"M505.98,259.75l-0.31,-0.9l-0.1,-0.14l-1.2,-0.93l-0.27,-1.66l0.29,-1.83l-0.25,-0.34l-1.16,-0.17l-0.33,0.21l-0.11,0.37l-1.3,0.11l-0.21,0.49l0.55,0.68l0.18,1.29l-1.31,1.33l-1.18,1.72l-1.04,0.21l-2.0,-1.4l-0.32,-0.02l-0.95,0.52l-0.14,0.16l-0.21,0.6l-1.16,0.43l-0.19,0.23l-0.04,0.27l-2.08,0.0l-0.25,-0.39l-0.24,-0.13l-1.81,-0.09l-0.14,0.03l-0.8,0.38l-0.49,-0.16l-1.22,-1.39l-0.42,-0.67l-0.31,-0.14l-1.81,0.35l-0.2,0.14l-0.72,1.24l-0.61,2.14l-0.73,0.4l-0.62,0.22l-0.83,-0.68l-0.12,-0.6l0.38,-0.97l0.01,-1.14l-0.08,-0.2l-1.39,-1.53l-0.25,-0.97l0.03,-0.57l-0.11,-0.25l-0.81,-0.66l-0.03,-1.34l-0.04,-0.14l-0.52,-0.98l-0.31,-0.15l-0.42,0.07l0.12,-0.44l0.63,-1.03l0.03,-0.23l-0.24,-0.88l0.69,-0.66l0.02,-0.41l-0.4,-0.46l0.58,-1.39l1.04,-1.71l1.97,0.16l0.32,-0.3l-0.12,-10.24l0.02,-0.8l2.59,-0.01l0.3,-0.3l0.0,-4.92l29.19,0.0l0.68,2.17l-0.4,0.35l-0.1,0.27l0.36,2.69l0.93,3.15l0.12,0.16l2.05,1.4l-0.99,1.15l-1.75,0.4l-0.15,0.08l-0.79,0.79l-0.08,0.17l-0.24,1.69l-1.07,3.75l-0.0,0.16l0.25,0.96l-0.38,2.1l-0.98,2.41l-1.52,1.3l-1.07,1.94l-0.25,0.99l-1.08,0.64l-0.13,0.18l-0.46,1.65Z\", \"name\": \"Sudan\" }, \"DO\": { \"path\": \"M241.7,234.97l0.15,-0.22l1.73,0.01l1.43,0.64l0.15,0.03l0.45,-0.04l0.36,0.74l0.28,0.17l1.02,-0.04l-0.04,0.43l0.27,0.33l1.03,0.09l0.91,0.7l-0.57,0.64l-0.99,-0.47l-0.16,-0.03l-1.11,0.11l-0.79,-0.12l-0.26,0.09l-0.38,0.4l-0.66,0.11l-0.28,-0.45l-0.38,-0.12l-0.83,0.37l-0.14,0.13l-0.85,1.49l-0.27,-0.17l-0.1,-0.58l0.05,-0.67l-0.07,-0.21l-0.44,-0.53l0.35,-0.25l0.12,-0.19l0.19,-1.0l-0.2,-1.4Z\", \"name\": \"Dominican Republic\" }, \"DJ\": { \"path\": \"M528.78,253.36l0.34,0.45l-0.06,0.76l-1.26,0.54l-0.05,0.53l0.82,0.53l-0.57,0.83l-0.3,-0.25l-0.27,-0.05l-0.56,0.17l-1.07,-0.03l-0.04,-0.56l-0.16,-0.56l0.76,-1.07l0.76,-0.97l0.89,0.18l0.25,-0.06l0.51,-0.42Z\", \"name\": \"Djibouti\" }, \"DK\": { \"path\": \"M452.4,129.07l-1.27,2.39l-2.25,-1.69l-0.26,-1.08l3.15,-1.0l0.63,1.39ZM447.87,126.25l-0.35,0.76l-0.47,-0.24l-0.38,0.09l-1.8,2.53l-0.03,0.29l0.56,1.4l-1.22,0.4l-1.68,-0.41l-0.92,-1.76l-0.07,-3.47l0.38,-0.88l0.62,-0.93l2.07,-0.21l0.19,-0.1l0.84,-0.95l1.5,-0.76l-0.06,1.26l-0.7,1.1l-0.03,0.25l0.3,1.0l0.18,0.19l1.06,0.42Z\", \"name\": \"Denmark\" }, \"DE\": { \"path\": \"M445.51,131.69l0.03,0.94l0.21,0.28l2.32,0.74l-0.02,1.0l0.37,0.3l2.55,-0.65l1.36,-0.89l2.63,1.27l1.09,1.01l0.51,1.51l-0.6,0.78l-0.0,0.36l0.88,1.17l0.58,1.68l-0.18,1.08l0.03,0.18l0.87,1.81l-0.66,0.2l-0.55,-0.32l-0.36,0.05l-0.58,0.58l-1.73,0.62l-0.99,0.84l-1.77,0.7l-0.16,0.4l0.42,0.94l0.26,1.34l0.14,0.2l1.25,0.76l1.22,1.2l-0.71,1.2l-0.81,0.37l-0.17,0.32l0.34,1.99l-0.04,0.09l-0.47,-0.39l-0.17,-0.07l-1.2,-0.1l-1.85,0.57l-2.15,-0.13l-0.29,0.18l-0.21,0.5l-0.96,-0.67l-0.24,-0.05l-0.67,0.16l-2.6,-0.94l-0.34,0.1l-0.42,0.57l-1.64,-0.02l0.26,-1.88l1.24,-2.15l-0.21,-0.45l-3.54,-0.58l-0.98,-0.71l0.12,-1.26l-0.05,-0.2l-0.44,-0.64l0.27,-2.18l-0.38,-3.14l1.17,-0.0l0.27,-0.17l0.63,-1.26l0.65,-3.17l-0.02,-0.17l-0.41,-1.0l0.32,-0.47l1.77,-0.16l0.37,0.6l0.47,0.06l1.7,-1.69l0.06,-0.33l-0.55,-1.24l-0.09,-1.51l1.5,0.36l0.16,-0.01l1.22,-0.4Z\", \"name\": \"Germany\" }, \"YE\": { \"path\": \"M553.53,242.65l-1.51,0.58l-0.17,0.16l-0.48,1.14l-0.07,0.79l-2.31,1.0l-3.98,1.19l-2.28,1.8l-0.97,0.12l-0.7,-0.14l-0.23,0.05l-1.42,1.03l-1.51,0.47l-2.07,0.13l-0.68,0.15l-0.17,0.1l-0.49,0.6l-0.57,0.16l-0.18,0.13l-0.3,0.49l-1.06,-0.05l-0.13,0.02l-0.73,0.32l-1.48,-0.11l-0.55,-1.26l0.07,-1.32l-0.04,-0.16l-0.39,-0.72l-0.48,-1.85l-0.52,-0.79l0.08,-0.02l0.22,-0.36l-0.23,-1.05l0.24,-0.39l0.04,-0.19l-0.09,-0.95l0.96,-0.72l0.11,-0.31l-0.23,-0.98l0.46,-0.88l0.75,0.49l0.26,0.03l0.63,-0.22l2.76,-0.06l0.5,0.25l2.42,0.26l0.85,-0.11l0.52,0.71l0.35,0.1l1.17,-0.43l0.15,-0.12l1.75,-2.64l2.22,-1.11l6.95,-0.96l2.55,5.58Z\", \"name\": \"Yemen\" }, \"AT\": { \"path\": \"M463.17,154.15l-0.14,0.99l-1.15,0.01l-0.24,0.47l0.39,0.56l-0.75,1.84l-0.36,0.4l-2.06,0.07l-0.14,0.04l-1.18,0.67l-1.96,-0.23l-3.43,-0.78l-0.5,-0.97l-0.33,-0.16l-2.47,0.55l-0.2,0.16l-0.18,0.37l-1.27,-0.38l-1.28,-0.09l-0.81,-0.41l0.25,-0.51l0.03,-0.18l-0.05,-0.28l0.35,-0.08l1.16,0.81l0.45,-0.13l0.27,-0.64l2.0,0.12l1.84,-0.57l1.05,0.09l0.71,0.59l0.47,-0.11l0.23,-0.54l0.02,-0.17l-0.32,-1.85l0.69,-0.31l0.13,-0.12l0.73,-1.23l1.61,0.89l0.35,-0.04l1.35,-1.27l0.7,-0.19l1.84,0.93l0.18,0.03l1.08,-0.15l0.81,0.43l-0.07,0.15l-0.02,0.2l0.24,1.06Z\", \"name\": \"Austria\" }, \"DZ\": { \"path\": \"M450.58,224.94l-8.31,4.86l-7.23,5.12l-3.46,1.13l-2.42,0.22l-0.02,-1.33l-0.2,-0.28l-1.15,-0.42l-1.45,-0.69l-0.55,-1.13l-0.1,-0.12l-8.45,-5.72l-17.72,-12.17l0.03,-0.38l-0.02,-3.21l3.84,-1.91l2.46,-0.41l2.1,-0.75l0.14,-0.11l0.9,-1.3l2.84,-1.06l0.19,-0.27l0.09,-1.81l1.21,-0.2l0.15,-0.07l1.06,-0.96l3.19,-0.46l0.23,-0.18l0.46,-1.08l-0.08,-0.34l-0.6,-0.54l-0.83,-2.85l-0.18,-1.8l-0.82,-1.57l2.13,-1.37l2.65,-0.49l0.13,-0.05l1.55,-1.15l2.34,-0.85l4.2,-0.51l4.07,-0.23l1.21,0.41l0.23,-0.01l2.3,-1.11l2.52,-0.02l0.94,0.62l0.2,0.05l1.25,-0.13l-0.36,1.03l-0.01,0.14l0.39,2.66l-0.56,2.2l-1.49,1.52l-0.08,0.24l0.22,2.12l0.11,0.2l1.94,1.58l0.02,0.54l0.12,0.23l1.45,1.06l1.04,4.85l0.81,2.42l0.13,1.19l-0.43,2.17l0.17,1.28l-0.31,1.53l0.2,1.56l-0.9,1.02l-0.01,0.38l1.43,1.88l0.09,1.06l0.04,0.13l0.89,1.48l0.37,0.12l1.03,-0.43l1.79,1.12l0.89,1.34Z\", \"name\": \"Algeria\" }, \"US\": { \"path\": \"M892.64,99.05l1.16,0.57l0.21,0.02l1.45,-0.38l1.92,0.99l2.17,0.47l-1.65,0.72l-1.75,-0.79l-0.93,-0.7l-0.21,-0.06l-2.11,0.22l-0.35,-0.2l0.09,-0.87ZM183.29,150.37l0.39,1.54l0.12,0.17l0.78,0.55l0.14,0.05l1.74,0.2l2.52,0.5l2.4,0.98l0.17,0.02l1.96,-0.4l3.01,0.81l0.91,-0.02l2.22,-0.88l4.67,2.33l3.86,2.01l0.21,0.71l0.15,0.18l0.33,0.17l-0.02,0.05l0.23,0.43l0.67,0.1l0.21,-0.05l0.1,-0.07l0.05,0.29l0.09,0.16l0.5,0.5l0.21,0.09l0.56,0.0l0.13,0.13l-0.2,0.36l0.12,0.41l2.49,1.39l0.99,5.24l-0.69,1.68l-1.16,1.64l-0.6,1.18l-0.06,0.31l0.04,0.22l0.28,0.43l0.11,0.1l0.85,0.47l0.15,0.04l0.63,0.0l0.14,-0.04l2.87,-1.58l2.6,-0.49l3.28,-1.5l0.17,-0.23l0.04,-0.43l-0.23,-0.93l-0.24,-0.39l0.74,-0.32l4.7,-0.01l0.25,-0.13l0.77,-1.15l2.9,-2.41l1.04,-0.52l8.35,-0.02l0.28,-0.21l0.2,-0.6l0.7,-0.14l1.06,-0.48l0.13,-0.11l0.92,-1.49l0.75,-2.39l1.67,-2.08l0.59,0.6l0.3,0.07l1.52,-0.49l0.88,0.72l-0.0,4.14l0.08,0.2l1.6,1.72l0.31,0.72l-2.42,1.35l-2.55,1.05l-2.64,0.9l-0.14,0.11l-1.33,1.81l-0.44,0.7l-0.05,0.15l-0.03,1.6l0.03,0.14l0.83,1.59l0.24,0.16l0.78,0.06l-1.15,0.33l-1.25,-0.04l-1.83,0.52l-2.51,0.29l-2.17,0.88l-0.17,0.36l0.33,0.22l3.55,-0.54l0.15,0.11l-2.87,0.73l-1.19,0.0l-0.16,-0.33l-0.36,0.06l-0.76,0.82l0.17,0.5l0.42,0.08l-0.45,1.75l-1.4,1.74l-0.04,-0.17l-0.21,-0.22l-0.48,-0.13l-0.77,-0.69l-0.36,-0.03l-0.12,0.34l0.52,1.58l0.09,0.14l0.52,0.43l0.03,0.87l-0.74,1.05l-0.39,0.63l0.05,-0.12l-0.08,-0.34l-1.19,-1.03l-0.28,-2.31l-0.26,-0.26l-0.32,0.19l-0.48,1.27l-0.01,0.19l0.39,1.33l-1.14,-0.31l-0.36,0.18l0.14,0.38l1.57,0.85l0.1,2.58l0.22,0.28l0.55,0.15l0.21,0.81l0.33,2.72l-1.46,1.94l-2.5,0.81l-0.12,0.07l-1.58,1.58l-1.15,0.17l-0.15,0.06l-1.27,1.03l-0.09,0.13l-0.32,0.85l-2.71,1.79l-1.45,1.37l-1.18,1.64l-0.05,0.12l-0.39,1.96l0.0,0.13l0.44,1.91l0.85,2.37l1.1,1.91l0.03,1.2l1.16,3.07l-0.08,1.74l-0.1,0.99l-0.57,1.48l-0.54,0.24l-0.97,-0.26l-0.34,-1.02l-0.12,-0.16l-0.89,-0.58l-2.44,-4.28l-0.34,-0.94l0.49,-1.71l-0.02,-0.21l-0.7,-1.5l-2.0,-2.35l-0.11,-0.08l-0.98,-0.42l-0.25,0.01l-2.42,1.19l-0.26,-0.08l-1.26,-1.29l-1.57,-0.68l-0.16,-0.02l-2.79,0.34l-2.18,-0.3l-1.98,0.19l-1.12,0.45l-0.14,0.44l0.4,0.65l-0.04,1.02l0.09,0.22l0.29,0.3l-0.06,0.05l-0.77,-0.33l-0.26,0.01l-0.87,0.48l-1.64,-0.08l-1.79,-1.39l-0.23,-0.06l-2.11,0.33l-1.75,-0.61l-0.14,-0.01l-1.61,0.2l-2.11,0.64l-0.11,0.06l-2.25,1.99l-2.53,1.21l-1.43,1.38l-0.58,1.22l-0.03,0.12l-0.03,1.86l0.13,1.32l0.3,0.62l-0.46,0.04l-1.71,-0.57l-1.85,-0.79l-0.63,-1.14l-0.54,-1.85l-0.07,-0.12l-1.45,-1.51l-0.86,-1.58l-1.26,-1.87l-0.09,-0.09l-1.76,-1.09l-0.17,-0.04l-2.05,0.05l-0.23,0.12l-1.44,1.97l-1.84,-0.72l-1.19,-0.76l-0.6,-1.45l-0.9,-1.52l-1.49,-1.21l-1.27,-0.87l-0.89,-0.96l-0.22,-0.1l-4.34,-0.0l-0.3,0.3l-0.0,0.84l-6.62,0.02l-5.66,-1.93l-3.48,-1.24l0.11,-0.25l-0.3,-0.42l-3.18,0.3l-2.6,0.2l-0.35,-1.19l-0.08,-0.13l-1.62,-1.61l-0.13,-0.08l-1.02,-0.29l-0.22,-0.66l-0.25,-0.2l-1.31,-0.13l-0.82,-0.7l-0.16,-0.07l-2.25,-0.27l-0.48,-0.34l-0.28,-1.44l-0.07,-0.14l-2.41,-2.84l-2.03,-3.89l0.08,-0.58l-0.1,-0.27l-1.08,-0.94l-1.87,-2.36l-0.33,-2.31l-0.07,-0.15l-1.24,-1.5l0.52,-2.4l-0.09,-2.57l-0.78,-2.3l0.96,-2.83l0.61,-5.66l-0.46,-4.26l-0.79,-2.71l-0.68,-1.4l0.13,-0.26l3.24,0.97l1.28,2.88l0.52,0.06l0.62,-0.84l0.06,-0.22l-0.4,-2.61l-0.74,-2.29l68.9,-0.0l0.3,-0.3l0.01,-0.95l0.32,-0.01ZM32.5,67.43l1.75,1.99l0.41,0.04l1.02,-0.81l3.79,0.25l-0.1,0.72l0.24,0.34l3.83,0.77l2.6,-0.44l5.21,1.41l4.84,0.43l1.9,0.57l0.15,0.01l3.25,-0.71l3.72,1.32l2.52,0.58l-0.03,38.14l0.29,0.3l2.41,0.11l2.34,1.0l1.7,1.59l2.22,2.42l0.42,0.03l2.41,-2.04l2.25,-1.08l1.23,1.76l1.71,1.53l2.24,1.62l1.54,2.56l2.56,4.09l0.11,0.11l4.1,2.17l0.06,1.93l-1.12,1.35l-1.22,-1.14l-2.08,-1.05l-0.68,-2.94l-0.09,-0.16l-3.18,-2.84l-1.32,-3.35l-0.25,-0.19l-2.43,-0.24l-3.93,-0.09l-2.85,-1.02l-5.24,-3.85l-6.77,-2.04l-3.52,0.3l-4.84,-1.7l-2.96,-1.6l-0.23,-0.02l-2.78,0.8l-0.21,0.35l0.46,2.31l-1.11,0.19l-2.9,0.78l-2.24,1.26l-2.42,0.68l-0.29,-1.79l1.07,-3.49l2.54,-1.11l0.12,-0.45l-0.69,-0.96l-0.41,-0.07l-3.19,2.12l-1.76,2.54l-3.57,2.62l-0.03,0.46l1.63,1.59l-2.14,2.38l-2.64,1.49l-2.49,1.09l-0.16,0.17l-0.58,1.48l-3.8,1.79l-0.14,0.14l-0.75,1.57l-2.75,1.41l-1.62,-0.25l-0.16,0.02l-2.35,0.98l-2.54,1.19l-2.06,1.15l-4.05,0.93l-0.1,-0.15l2.45,-1.45l2.49,-1.1l2.61,-1.88l3.03,-0.39l0.19,-0.1l1.2,-1.41l3.43,-2.11l0.61,-0.75l1.81,-1.24l0.13,-0.2l0.42,-2.7l1.24,-2.12l-0.03,-0.35l-0.34,-0.09l-2.73,1.05l-0.67,-0.53l-0.39,0.02l-1.13,1.11l-1.43,-1.62l-0.49,0.06l-0.41,0.8l-0.67,-1.31l-0.42,-0.12l-2.43,1.43l-1.18,-0.0l-0.18,-1.86l0.43,-1.3l-0.09,-0.33l-1.61,-1.33l-0.26,-0.06l-3.11,0.68l-2.0,-1.66l-1.61,-0.85l-0.01,-1.97l-0.11,-0.23l-1.76,-1.48l0.86,-1.96l2.01,-2.13l0.88,-1.94l1.79,-0.25l1.65,0.6l0.31,-0.06l1.91,-1.8l1.67,0.31l0.22,-0.04l1.91,-1.23l0.13,-0.33l-0.47,-1.82l-0.15,-0.19l-1.0,-0.52l1.51,-1.27l0.09,-0.34l-0.29,-0.19l-1.62,0.06l-2.66,0.88l-0.13,0.09l-0.62,0.72l-1.77,-0.8l-0.16,-0.02l-3.48,0.44l-3.5,-0.92l-1.06,-1.61l-2.78,-2.09l3.07,-1.51l5.52,-2.01l1.65,0.0l-0.28,1.73l0.31,0.35l5.29,-0.16l0.23,-0.49l-2.03,-2.59l-0.1,-0.08l-3.03,-1.58l-1.79,-2.12l-2.4,-1.83l-3.18,-1.27l1.13,-1.84l4.28,-0.14l0.15,-0.05l3.16,-2.0l0.13,-0.17l0.57,-2.07l2.43,-2.02l2.42,-0.52l4.67,-1.98l2.22,0.29l0.2,-0.04l3.74,-2.37l3.57,0.91ZM37.66,123.49l-2.31,1.26l-1.04,-0.75l-0.31,-1.35l2.06,-1.16l1.24,-0.51l1.48,0.22l0.76,0.81l-1.89,1.49ZM30.89,233.84l1.2,0.57l0.35,0.3l0.48,0.69l-1.6,0.86l-0.3,0.31l-0.24,-0.14l0.05,-0.54l-0.02,-0.15l-0.36,-0.83l0.05,-0.12l0.39,-0.38l0.07,-0.31l-0.09,-0.27ZM29.06,231.89l0.5,0.14l0.31,0.19l-0.46,0.1l-0.34,-0.43ZM25.02,230.13l0.2,-0.11l0.4,0.47l-0.43,-0.05l-0.17,-0.31ZM21.29,228.68l0.1,-0.07l0.22,0.02l0.02,0.21l-0.02,0.02l-0.32,-0.18ZM6.0,113.33l-1.19,0.45l-1.5,-0.64l-0.94,-0.63l1.76,-0.46l1.71,0.29l0.16,0.98Z\", \"name\": \"United States of America\" }, \"LV\": { \"path\": \"M473.99,127.16l0.07,-2.15l1.15,-2.11l2.05,-1.07l1.84,2.48l0.25,0.12l2.01,-0.07l0.29,-0.25l0.45,-2.58l1.85,-0.56l0.98,0.4l2.13,1.33l0.16,0.05l1.97,0.01l1.02,0.7l0.21,1.67l0.71,1.84l-2.44,1.23l-1.36,0.53l-2.28,-1.62l-0.12,-0.05l-1.18,-0.2l-0.28,-0.6l-0.31,-0.17l-2.43,0.35l-4.17,-0.23l-0.12,0.02l-2.45,0.93Z\", \"name\": \"Latvia\" }, \"UY\": { \"path\": \"M276.9,363.17l1.3,-0.23l2.4,2.04l0.22,0.07l0.82,-0.07l2.48,1.7l1.93,1.5l1.28,1.67l-0.95,1.14l-0.04,0.31l0.63,1.45l-0.96,1.57l-2.65,1.47l-1.73,-0.53l-0.15,-0.01l-1.25,0.28l-2.22,-1.16l-0.16,-0.03l-1.56,0.08l-1.33,-1.36l0.17,-1.58l0.48,-0.55l0.07,-0.2l-0.02,-2.74l0.66,-2.8l0.57,-2.02Z\", \"name\": \"Uruguay\" }, \"LB\": { \"path\": \"M510.44,198.11l-0.48,0.03l-0.26,0.17l-0.15,0.32l-0.21,-0.0l0.72,-1.85l1.19,-1.9l0.74,0.09l0.27,0.73l-1.19,0.93l-0.09,0.13l-0.54,1.36Z\", \"name\": \"Lebanon\" }, \"LA\": { \"path\": \"M684.87,248.8l0.61,-0.86l0.05,-0.16l0.11,-2.17l-0.08,-0.22l-1.96,-2.16l-0.15,-2.44l-0.08,-0.18l-1.9,-2.1l-0.19,-0.1l-1.89,-0.18l-0.29,0.15l-0.42,0.76l-1.21,0.06l-0.67,-0.41l-0.31,-0.0l-2.2,1.29l-0.05,-1.77l0.61,-2.7l-0.27,-0.37l-1.44,-0.1l-0.12,-1.31l-0.12,-0.21l-0.87,-0.65l0.38,-0.68l1.76,-1.41l0.08,0.22l0.27,0.2l1.33,0.07l0.31,-0.34l-0.35,-2.75l0.85,-0.25l1.32,1.88l1.11,2.36l0.27,0.17l2.89,0.02l0.78,1.82l-1.32,0.56l-0.12,0.09l-0.72,0.93l0.1,0.45l2.93,1.52l3.62,5.27l1.88,1.78l0.58,1.67l-0.38,2.11l-1.87,-0.79l-0.37,0.11l-0.99,1.54l-1.51,-0.73Z\", \"name\": \"Laos\" }, \"TW\": { \"path\": \"M725.6,222.5l-1.5,4.22l-0.82,1.65l-1.01,-1.7l-0.26,-1.8l1.4,-2.48l1.8,-1.81l0.76,0.53l-0.38,1.39Z\", \"name\": \"Taiwan\" }, \"TT\": { \"path\": \"M266.35,259.46l0.41,-0.39l0.09,-0.23l-0.04,-0.75l1.14,-0.26l0.2,0.03l-0.07,1.37l-1.73,0.23Z\", \"name\": \"Trinidad and Tobago\" }, \"TR\": { \"path\": \"M513.25,175.38l3.63,1.17l0.14,0.01l2.88,-0.45l2.11,0.26l0.18,-0.03l2.9,-1.53l2.51,-0.13l2.25,1.37l0.36,0.88l-0.23,1.36l0.19,0.33l1.81,0.72l0.61,0.53l-1.31,0.64l-0.16,0.34l0.76,3.24l-0.44,0.8l0.01,0.3l1.19,2.02l-0.71,0.29l-0.74,-0.62l-0.15,-0.07l-2.91,-0.37l-0.15,0.02l-1.04,0.43l-2.78,0.44l-1.44,-0.03l-2.83,1.06l-1.95,0.01l-1.28,-0.52l-0.2,-0.01l-2.62,0.76l-0.7,-0.48l-0.47,0.22l-0.13,1.49l-1.01,0.94l-0.58,-0.82l0.79,-0.9l0.04,-0.34l-0.31,-0.15l-1.46,0.23l-2.03,-0.64l-0.3,0.07l-1.65,1.58l-3.58,0.3l-1.94,-1.47l-0.17,-0.06l-2.7,-0.1l-0.28,0.17l-0.51,1.06l-1.47,0.29l-2.32,-1.46l-0.17,-0.05l-2.55,0.05l-1.4,-2.7l-1.72,-1.54l1.11,-2.06l-0.07,-0.37l-1.35,-1.19l2.47,-2.51l3.74,-0.11l0.26,-0.17l0.96,-2.07l4.56,0.38l0.19,-0.05l2.97,-1.92l2.84,-0.83l4.03,-0.06l4.31,2.08ZM488.85,176.8l-1.81,1.38l-0.57,-1.01l0.02,-0.36l0.45,-0.25l0.13,-0.15l0.78,-1.87l-0.11,-0.37l-0.72,-0.47l1.91,-0.71l1.89,0.35l0.25,0.97l0.17,0.2l1.87,0.83l-0.19,0.31l-2.82,0.16l-0.18,0.07l-1.06,0.91Z\", \"name\": \"Turkey\" }, \"LK\": { \"path\": \"M625.44,266.07l-0.35,2.4l-0.9,0.61l-1.91,0.5l-1.04,-1.75l-0.43,-3.5l1.0,-3.6l1.34,1.09l1.13,1.72l1.16,2.52Z\", \"name\": \"Sri Lanka\" }, \"TN\": { \"path\": \"M444.91,206.18l-0.99,-4.57l-0.12,-0.18l-1.43,-1.04l-0.02,-0.53l-0.11,-0.22l-1.95,-1.59l-0.19,-1.85l1.44,-1.47l0.08,-0.14l0.59,-2.34l-0.38,-2.77l0.44,-1.28l2.52,-1.08l1.41,0.28l-0.06,1.2l0.43,0.28l1.81,-0.9l0.02,0.06l-1.14,1.28l-0.08,0.2l-0.02,1.32l0.11,0.24l0.74,0.6l-0.29,2.18l-1.56,1.35l-0.09,0.32l0.48,1.54l0.28,0.21l1.11,0.04l0.55,1.17l0.15,0.14l0.76,0.35l-0.12,1.79l-1.1,0.72l-0.8,0.91l-1.68,1.04l-0.13,0.32l0.25,1.08l-0.18,0.96l-0.74,0.39Z\", \"name\": \"Tunisia\" }, \"TL\": { \"path\": \"M734.21,307.22l0.17,-0.34l1.99,-0.52l1.72,-0.08l0.78,-0.3l0.29,0.1l-0.43,0.32l-2.57,1.09l-1.71,0.59l-0.05,-0.49l-0.19,-0.36Z\", \"name\": \"East Timor\" }, \"TM\": { \"path\": \"M553.16,173.51l-0.12,1.0l-0.26,-0.65l0.38,-0.34ZM553.54,173.16l0.13,-0.12l0.43,-0.09l-0.56,0.21ZM555.68,172.6l0.65,-0.14l1.53,0.76l1.71,2.29l0.27,0.12l1.27,-0.14l2.81,-0.04l0.29,-0.38l-0.35,-1.27l1.98,-0.97l1.96,-1.63l3.05,1.44l0.25,2.23l0.14,0.22l0.96,0.61l0.18,0.05l2.61,-0.13l0.68,0.44l1.2,2.97l0.1,0.13l2.85,2.03l1.67,1.41l2.66,1.45l3.13,1.17l-0.05,1.23l-0.36,-0.04l-1.12,-0.73l-0.44,0.14l-0.34,0.89l-1.96,0.52l-0.22,0.23l-0.47,2.17l-1.26,0.78l-1.93,0.42l-0.21,0.18l-0.46,1.14l-1.64,0.33l-2.3,-0.97l-0.2,-2.23l-0.28,-0.27l-1.76,-0.1l-2.78,-2.48l-0.15,-0.07l-1.95,-0.31l-2.82,-1.48l-1.78,-0.27l-0.18,0.03l-1.03,0.51l-1.6,-0.08l-0.22,0.08l-1.72,1.6l-1.83,0.46l-0.39,-1.7l0.36,-3.0l-0.16,-0.3l-1.73,-0.88l0.57,-1.77l-0.25,-0.39l-1.33,-0.14l0.41,-1.85l2.05,0.63l0.21,-0.01l2.2,-0.95l0.09,-0.49l-1.78,-1.75l-0.69,-1.66l-0.07,-0.03Z\", \"name\": \"Turkmenistan\" }, \"TJ\": { \"path\": \"M597.99,178.71l-0.23,0.23l-2.57,-0.47l-0.35,0.25l-0.24,1.7l0.32,0.34l2.66,-0.22l3.15,0.95l4.47,-0.42l0.58,2.45l0.39,0.21l0.71,-0.25l1.22,0.53l-0.06,1.01l0.29,1.28l-2.19,-0.0l-1.71,-0.21l-0.23,0.07l-1.51,1.25l-1.05,0.27l-0.77,0.51l-0.71,-0.67l0.22,-2.28l-0.24,-0.32l-0.43,-0.08l0.17,-0.57l-0.16,-0.36l-1.36,-0.66l-0.34,0.05l-1.08,1.01l-0.09,0.15l-0.25,1.09l-0.24,0.26l-1.36,-0.05l-0.27,0.14l-0.65,1.06l-0.58,-0.39l-0.3,-0.02l-1.68,0.86l-0.36,-0.16l1.28,-2.65l0.02,-0.2l-0.54,-2.17l-0.18,-0.21l-1.53,-0.58l0.41,-0.82l1.89,0.13l0.26,-0.12l1.19,-1.63l0.77,-1.82l2.66,-0.55l-0.33,0.87l0.01,0.23l0.36,0.82l0.3,0.18l0.23,-0.02Z\", \"name\": \"Tajikistan\" }, \"LS\": { \"path\": \"M493.32,359.69l0.69,0.65l-0.65,1.12l-0.38,0.8l-1.27,0.39l-0.18,0.15l-0.4,0.77l-0.59,0.18l-1.59,-1.78l1.16,-1.5l1.3,-1.02l0.97,-0.46l0.94,0.72Z\", \"name\": \"Lesotho\" }, \"TH\": { \"path\": \"M677.42,253.68l-1.7,-0.88l-0.14,-0.03l-1.77,0.04l0.3,-1.64l-0.3,-0.35l-2.21,0.01l-0.3,0.28l-0.2,2.76l-2.15,5.9l-0.02,0.13l0.17,1.83l0.28,0.27l1.45,0.07l0.93,2.1l0.44,2.15l0.08,0.15l1.4,1.44l0.16,0.09l1.43,0.27l1.04,1.05l-0.58,0.73l-1.24,0.22l-0.15,-0.99l-0.15,-0.22l-2.04,-1.1l-0.36,0.06l-0.23,0.23l-0.72,-0.71l-0.41,-1.18l-0.06,-0.11l-1.33,-1.42l-1.22,-1.2l-0.5,0.13l-0.15,0.54l-0.14,-0.41l0.26,-1.48l0.73,-2.38l1.2,-2.57l1.37,-2.35l0.02,-0.27l-0.95,-2.26l0.03,-1.19l-0.29,-1.42l-0.06,-0.13l-1.65,-2.0l-0.46,-0.99l0.62,-0.34l0.13,-0.15l0.92,-2.23l-0.02,-0.27l-1.05,-1.74l-1.57,-1.86l-1.04,-1.96l0.76,-0.34l0.16,-0.16l1.07,-2.63l1.58,-0.1l0.16,-0.06l1.43,-1.11l1.24,-0.52l0.84,0.62l0.13,1.43l0.28,0.27l1.34,0.09l-0.54,2.39l0.05,2.39l0.45,0.25l2.48,-1.45l0.6,0.36l0.17,0.04l1.47,-0.07l0.25,-0.15l0.41,-0.73l1.58,0.15l1.76,1.93l0.15,2.44l0.08,0.18l1.94,2.15l-0.1,1.96l-0.66,0.93l-2.25,-0.34l-3.24,0.49l-0.19,0.12l-1.6,2.12l-0.06,0.24l0.48,2.46Z\", \"name\": \"Thailand\" }, \"TF\": { \"path\": \"M593.76,417.73l1.38,0.84l2.15,0.37l0.04,0.31l-0.59,1.24l-3.36,0.19l-0.05,-1.38l0.43,-1.56Z\", \"name\": \"French Southern and Antarctic Lands\" }, \"TG\": { \"path\": \"M425.23,269.29l-1.49,0.4l-0.43,-0.68l-0.64,-1.54l-0.18,-1.16l0.54,-2.21l-0.04,-0.24l-0.59,-0.86l-0.23,-1.9l0.0,-1.82l-0.07,-0.19l-0.95,-1.19l0.1,-0.41l1.58,0.04l-0.23,0.97l0.08,0.28l1.55,1.55l0.09,1.13l0.08,0.19l0.42,0.43l-0.11,5.66l0.52,1.53Z\", \"name\": \"Togo\" }, \"TD\": { \"path\": \"M457.57,252.46l0.23,-1.08l-0.28,-0.36l-1.32,-0.05l0.0,-1.35l-0.1,-0.22l-0.9,-0.82l0.99,-3.1l3.12,-2.37l0.12,-0.23l0.13,-3.33l0.95,-5.2l0.53,-1.09l-0.07,-0.36l-0.94,-0.81l-0.03,-0.7l-0.12,-0.23l-0.84,-0.61l-0.57,-3.76l2.21,-1.26l19.67,9.88l0.12,9.74l-1.83,-0.15l-0.28,0.14l-1.14,1.89l-0.68,1.62l0.05,0.31l0.33,0.38l-0.61,0.58l-0.08,0.3l0.25,0.93l-0.58,0.95l-0.29,1.01l0.34,0.37l0.67,-0.11l0.39,0.73l0.03,1.4l0.11,0.23l0.8,0.65l-0.01,0.24l-1.38,0.37l-0.11,0.06l-1.27,1.03l-1.83,2.76l-2.21,1.1l-2.34,-0.15l-0.82,0.25l-0.2,0.37l0.19,0.68l-1.16,0.79l-1.01,0.94l-2.92,0.89l-0.5,-0.46l-0.17,-0.08l-0.41,-0.05l-0.28,0.12l-0.38,0.54l-1.36,0.12l0.1,-0.18l0.01,-0.27l-0.78,-1.72l-0.35,-1.03l-0.17,-0.18l-1.03,-0.41l-1.29,-1.28l0.36,-0.78l0.9,0.2l0.14,-0.0l0.67,-0.17l1.36,0.02l0.26,-0.45l-1.32,-2.22l0.09,-1.64l-0.17,-1.68l-0.04,-0.13l-0.93,-1.53Z\", \"name\": \"Chad\" }, \"LY\": { \"path\": \"M457.99,226.38l-1.57,0.87l-1.25,-1.28l-0.13,-0.08l-3.85,-1.11l-1.04,-1.57l-0.09,-0.09l-1.98,-1.23l-0.27,-0.02l-0.93,0.39l-0.72,-1.2l-0.09,-1.07l-0.06,-0.16l-1.33,-1.75l0.83,-0.94l0.07,-0.24l-0.21,-1.64l0.31,-1.43l-0.17,-1.29l0.43,-2.26l-0.15,-1.33l-0.73,-2.18l0.99,-0.52l0.16,-0.21l0.22,-1.16l-0.22,-1.06l1.54,-0.95l0.81,-0.92l1.19,-0.78l0.14,-0.23l0.12,-1.76l2.57,0.84l0.16,0.01l0.99,-0.23l2.01,0.45l3.19,1.2l1.12,2.36l0.2,0.16l2.24,0.53l3.5,1.14l2.65,1.36l0.29,-0.01l1.22,-0.71l1.27,-1.32l0.07,-0.29l-0.55,-2.0l0.69,-1.19l1.7,-1.23l1.61,-0.35l3.2,0.54l0.78,1.14l0.24,0.13l0.85,0.01l0.84,0.47l2.35,0.31l0.42,0.63l-0.79,1.16l-0.04,0.26l0.35,1.08l-0.61,1.6l-0.0,0.2l0.73,2.16l0.0,24.24l-2.58,0.01l-0.3,0.29l-0.02,0.62l-19.55,-9.83l-0.28,0.01l-2.53,1.44Z\", \"name\": \"Libya\" }, \"AE\": { \"path\": \"M550.59,223.8l0.12,0.08l1.92,-0.41l3.54,0.15l0.23,-0.09l1.71,-1.79l1.86,-1.7l1.31,-1.36l0.26,0.5l0.28,1.72l-0.93,0.01l-0.3,0.26l-0.21,1.73l0.11,0.27l0.08,0.06l-0.7,0.32l-0.17,0.27l-0.01,0.99l-0.68,1.02l-0.05,0.15l-0.06,0.96l-0.32,0.36l-7.19,-1.27l-0.79,-2.22Z\", \"name\": \"United Arab Emirates\" }, \"VE\": { \"path\": \"M240.66,256.5l0.65,0.91l-0.03,1.13l-1.05,1.39l-0.03,0.31l0.95,2.0l0.32,0.17l1.08,-0.16l0.24,-0.21l0.56,-1.83l-0.06,-0.29l-0.71,-0.81l-0.1,-1.58l2.9,-0.96l0.19,-0.37l-0.29,-1.02l0.45,-0.41l0.72,1.43l0.26,0.16l1.65,0.04l1.46,1.27l0.08,0.72l0.3,0.27l2.28,0.02l2.55,-0.25l1.34,1.06l0.14,0.06l1.92,0.31l0.2,-0.03l1.4,-0.79l0.15,-0.25l0.02,-0.36l2.82,-0.14l1.17,-0.01l-0.41,0.14l-0.14,0.46l0.86,1.19l0.22,0.12l1.93,0.18l1.73,1.13l0.37,1.9l0.31,0.24l1.21,-0.05l0.52,0.32l-1.63,1.21l-0.11,0.17l-0.22,0.92l0.07,0.27l0.63,0.69l-0.31,0.24l-1.48,0.39l-0.22,0.3l0.04,1.03l-0.59,0.6l-0.01,0.41l1.67,1.87l0.23,0.48l-0.72,0.76l-2.71,0.91l-1.78,0.39l-0.13,0.06l-0.6,0.49l-1.84,-0.58l-1.89,-0.33l-0.18,0.03l-0.47,0.23l-0.02,0.53l0.96,0.56l-0.08,1.58l0.35,1.58l0.26,0.23l1.91,0.19l0.02,0.07l-1.54,0.62l-0.18,0.2l-0.25,0.92l-0.88,0.35l-1.85,0.58l-0.16,0.13l-0.4,0.64l-1.66,0.14l-1.22,-1.18l-0.79,-2.52l-0.67,-0.88l-0.66,-0.43l0.99,-0.98l0.09,-0.26l-0.09,-0.56l-0.08,-0.16l-0.66,-0.69l-0.47,-1.54l0.18,-1.67l0.55,-0.85l0.45,-1.35l-0.15,-0.36l-0.89,-0.43l-0.19,-0.02l-1.39,0.28l-1.76,-0.13l-0.92,0.23l-1.64,-2.01l-0.17,-0.1l-1.54,-0.33l-3.05,0.23l-0.5,-0.73l-0.15,-0.12l-0.45,-0.15l-0.05,-0.28l0.28,-0.86l0.01,-0.15l-0.2,-1.01l-0.08,-0.15l-0.5,-0.5l-0.3,-1.08l-0.25,-0.22l-0.89,-0.12l0.54,-1.18l0.29,-1.73l0.66,-0.85l0.94,-0.7l0.09,-0.11l0.3,-0.6Z\", \"name\": \"Venezuela\" }, \"AF\": { \"path\": \"M574.42,192.1l2.24,0.95l0.18,0.02l1.89,-0.38l0.22,-0.18l0.46,-1.14l1.82,-0.4l1.5,-0.91l0.14,-0.19l0.46,-2.12l1.93,-0.51l0.2,-0.18l0.26,-0.68l0.87,0.57l0.13,0.05l0.79,0.09l1.35,0.02l1.83,0.59l0.75,0.34l0.26,-0.01l1.66,-0.85l0.7,0.46l0.42,-0.09l0.72,-1.17l1.32,0.05l0.23,-0.1l0.39,-0.43l0.07,-0.14l0.24,-1.08l0.86,-0.81l0.94,0.46l-0.2,0.64l0.23,0.38l0.49,0.09l-0.21,2.15l0.09,0.25l0.99,0.94l0.38,0.03l0.83,-0.57l1.06,-0.27l0.12,-0.06l1.46,-1.21l1.63,0.2l2.4,0.0l0.17,0.32l-1.12,0.25l-1.23,0.52l-2.86,0.33l-2.69,0.6l-0.13,0.06l-1.46,1.25l-0.07,0.36l0.58,1.18l0.25,1.21l-1.13,1.08l-0.09,0.25l0.09,0.98l-0.53,0.79l-2.22,-0.08l-0.28,0.44l0.83,1.57l-1.3,0.58l-0.13,0.11l-1.06,1.69l-0.05,0.18l0.13,1.51l-0.73,0.58l-0.78,-0.22l-0.14,-0.01l-1.91,0.36l-0.23,0.19l-0.2,0.57l-1.65,-0.0l-0.22,0.1l-1.4,1.56l-0.08,0.19l-0.08,2.13l-2.99,1.05l-1.67,-0.23l-0.27,0.1l-0.39,0.46l-1.43,-0.31l-2.43,0.4l-3.69,-1.23l1.96,-2.15l0.08,-0.24l-0.21,-1.78l-0.23,-0.26l-1.69,-0.42l-0.19,-1.62l-0.77,-2.08l0.98,-1.41l-0.14,-0.45l-0.82,-0.31l0.6,-1.79l0.93,-3.21Z\", \"name\": \"Afghanistan\" }, \"IQ\": { \"path\": \"M534.42,190.89l0.13,0.14l1.5,0.78l0.15,1.34l-1.13,0.87l-0.11,0.16l-0.58,2.2l0.04,0.24l1.73,2.67l0.12,0.1l2.99,1.49l1.18,1.94l-0.39,1.89l0.29,0.36l0.5,-0.0l0.02,1.17l0.08,0.2l0.83,0.86l-2.36,-0.29l-0.29,0.13l-1.74,2.49l-4.4,-0.21l-7.03,-5.49l-3.73,-1.94l-2.92,-0.74l-0.89,-3.0l5.33,-2.81l0.15,-0.19l0.95,-3.43l-0.2,-2.0l1.19,-0.61l0.11,-0.09l1.23,-1.73l0.92,-0.38l2.75,0.35l0.81,0.68l0.31,0.05l0.94,-0.38l1.5,3.17Z\", \"name\": \"Iraq\" }, \"IS\": { \"path\": \"M384.26,87.96l-0.51,2.35l0.08,0.28l2.61,2.58l-2.99,2.83l-7.16,2.72l-2.08,0.7l-9.51,-1.71l1.89,-1.36l-0.07,-0.53l-4.4,-1.59l3.33,-0.59l0.25,-0.32l-0.11,-1.2l-0.25,-0.27l-4.82,-0.88l1.38,-2.2l3.54,-0.57l3.8,2.74l0.33,0.01l3.68,-2.18l3.02,1.12l0.25,-0.02l4.01,-2.18l3.72,0.27Z\", \"name\": \"Iceland\" }, \"IR\": { \"path\": \"M556.2,187.5l2.05,-0.52l0.13,-0.07l1.69,-1.57l1.55,0.08l0.15,-0.03l1.02,-0.5l1.64,0.25l2.82,1.48l1.91,0.3l2.8,2.49l0.18,0.08l1.61,0.09l0.19,2.09l-1.0,3.47l-0.69,2.04l0.18,0.38l0.73,0.28l-0.85,1.22l-0.04,0.28l0.81,2.19l0.19,1.72l0.23,0.26l1.69,0.42l0.17,1.43l-2.18,2.39l-0.01,0.4l1.22,1.42l1.0,1.62l0.12,0.11l2.23,1.11l0.06,2.2l0.2,0.27l1.03,0.38l0.14,0.83l-3.38,1.3l-0.18,0.19l-0.87,2.85l-4.44,-0.76l-2.75,-0.62l-2.64,-0.32l-1.01,-3.11l-0.17,-0.19l-1.2,-0.48l-0.18,-0.01l-1.99,0.51l-2.42,1.25l-2.89,-0.84l-2.48,-2.03l-2.41,-0.79l-1.61,-2.47l-1.84,-3.63l-0.36,-0.15l-1.22,0.4l-1.48,-0.84l-0.37,0.06l-0.72,0.82l-1.08,-1.12l-0.02,-1.35l-0.3,-0.29l-0.43,0.0l0.34,-1.64l-0.04,-0.22l-1.29,-2.11l-0.12,-0.11l-3.0,-1.49l-1.62,-2.49l0.52,-1.98l1.18,-0.92l0.11,-0.27l-0.19,-1.66l-0.16,-0.23l-1.55,-0.81l-1.58,-3.33l-1.3,-2.2l0.41,-0.75l0.03,-0.21l-0.73,-3.12l1.2,-0.59l0.35,0.9l1.26,1.35l0.15,0.09l1.81,0.39l0.91,-0.09l0.15,-0.06l2.9,-2.13l0.7,-0.16l0.48,0.56l-0.75,1.26l0.05,0.37l1.56,1.53l0.28,0.08l0.37,-0.09l0.7,1.89l0.21,0.19l2.31,0.59l1.69,1.4l0.15,0.07l3.66,0.49l3.91,-0.76l0.23,-0.19l0.19,-0.52Z\", \"name\": \"Iran\" }, \"AM\": { \"path\": \"M530.51,176.08l2.91,-0.39l0.41,0.63l0.11,0.1l0.66,0.36l-0.32,0.47l0.07,0.41l1.1,0.84l-0.53,0.7l0.06,0.42l1.06,0.8l1.01,0.44l0.04,1.56l-0.44,0.04l-0.88,-1.46l0.01,-0.37l-0.3,-0.31l-0.98,0.01l-0.65,-0.69l-0.26,-0.09l-0.38,0.06l-0.97,-0.82l-1.64,-0.65l0.2,-1.2l-0.02,-0.16l-0.28,-0.69Z\", \"name\": \"Armenia\" }, \"IT\": { \"path\": \"M451.68,158.58l0.2,0.16l3.3,0.75l-0.22,1.26l0.02,0.18l0.35,0.78l-1.4,-0.32l-0.21,0.03l-2.04,1.1l-0.16,0.29l0.13,1.47l-0.29,0.82l0.02,0.24l0.82,1.57l0.1,0.11l2.28,1.5l1.29,2.53l2.79,2.43l0.2,0.07l1.83,-0.02l0.31,0.34l-0.46,0.39l0.06,0.5l4.06,1.97l2.06,1.49l0.17,0.36l-0.24,0.53l-1.08,-1.07l-0.15,-0.08l-2.18,-0.49l-0.33,0.15l-1.05,1.91l0.11,0.4l1.63,0.98l-0.22,1.12l-0.84,0.14l-0.22,0.15l-1.27,2.38l-0.54,0.12l0.01,-0.47l0.48,-1.46l0.5,-0.58l0.03,-0.35l-0.97,-1.69l-0.76,-1.48l-0.17,-0.15l-0.94,-0.33l-0.68,-1.18l-0.16,-0.13l-1.53,-0.52l-1.03,-1.14l-0.19,-0.1l-1.78,-0.19l-1.88,-1.3l-2.27,-1.94l-1.64,-1.68l-0.76,-2.94l-0.21,-0.21l-1.22,-0.35l-2.01,-1.0l-0.24,-0.01l-1.15,0.42l-0.11,0.07l-1.38,1.36l-0.5,0.11l0.19,-0.87l-0.21,-0.35l-1.19,-0.34l-0.56,-2.06l0.76,-0.82l0.03,-0.36l-0.68,-1.08l0.04,-0.31l0.68,0.42l0.19,0.04l1.21,-0.15l0.14,-0.06l1.18,-0.89l0.25,0.29l0.25,0.1l1.19,-0.1l0.25,-0.18l0.45,-1.04l1.61,0.34l0.19,-0.02l1.1,-0.53l0.17,-0.22l0.15,-0.95l1.19,0.35l0.35,-0.16l0.23,-0.47l2.11,-0.47l0.45,0.89ZM459.35,184.63l-0.71,1.81l0.0,0.23l0.33,0.79l-0.37,1.03l-1.6,-0.91l-1.33,-0.34l-3.24,-1.36l0.23,-0.99l2.73,0.24l3.95,-0.5ZM443.95,175.91l1.26,1.77l-0.31,3.47l-0.82,-0.13l-0.26,0.08l-0.83,0.79l-0.64,-0.52l-0.1,-3.42l-0.44,-1.34l0.91,0.1l0.21,-0.06l1.01,-0.74Z\", \"name\": \"Italy\" }, \"VN\": { \"path\": \"M690.8,230.21l-2.86,1.93l-2.09,2.46l-0.06,0.11l-0.55,1.8l0.04,0.26l4.26,6.1l2.31,1.63l1.46,1.97l1.12,4.62l-0.32,4.3l-1.97,1.57l-2.85,1.62l-2.09,2.14l-2.83,2.13l-0.67,-1.19l0.65,-1.58l-0.09,-0.35l-1.47,-1.14l1.67,-0.79l2.57,-0.18l0.22,-0.47l-0.89,-1.24l3.88,-1.8l0.17,-0.24l0.31,-3.05l-0.01,-0.13l-0.56,-1.63l0.44,-2.48l-0.01,-0.15l-0.63,-1.81l-0.08,-0.12l-1.87,-1.77l-3.64,-5.3l-0.11,-0.1l-2.68,-1.39l0.45,-0.59l1.53,-0.65l0.16,-0.39l-0.97,-2.27l-0.27,-0.18l-2.89,-0.02l-1.04,-2.21l-1.28,-1.83l0.96,-0.46l1.97,0.01l2.43,-0.3l0.13,-0.05l1.95,-1.29l1.04,0.85l0.13,0.06l1.98,0.42l-0.32,1.21l0.09,0.3l1.19,1.07l0.12,0.07l1.88,0.51Z\", \"name\": \"Vietnam\" }, \"AR\": { \"path\": \"M258.11,341.34l1.4,1.81l0.51,-0.06l0.89,-1.94l2.51,0.1l0.36,0.49l4.6,4.31l0.15,0.08l1.99,0.39l3.01,1.93l2.5,1.01l0.28,0.91l-2.4,3.97l0.17,0.44l2.57,0.74l2.81,0.41l2.09,-0.44l0.14,-0.07l2.27,-2.06l0.09,-0.17l0.38,-2.2l0.88,-0.36l1.05,1.29l-0.04,1.88l-1.98,1.4l-1.72,1.13l-2.84,2.65l-3.34,3.73l-0.07,0.12l-0.63,2.22l-0.67,2.85l0.02,2.73l-0.47,0.54l-0.07,0.17l-0.36,3.28l0.12,0.27l3.03,2.32l-0.31,1.78l0.11,0.29l1.44,1.15l-0.11,1.17l-2.32,3.57l-3.59,1.51l-4.95,0.6l-2.72,-0.29l-0.32,0.38l0.5,1.67l-0.49,2.13l0.01,0.16l0.4,1.29l-1.27,0.88l-2.41,0.39l-2.33,-1.05l-0.31,0.04l-0.97,0.78l-0.11,0.27l0.35,2.98l0.16,0.23l1.69,0.91l0.31,-0.02l1.08,-0.75l0.46,0.96l-2.1,0.88l-2.01,1.89l-0.09,0.18l-0.36,3.05l-0.51,1.42l-2.16,0.01l-0.19,0.07l-1.96,1.59l-0.1,0.15l-0.72,2.34l0.08,0.31l2.46,2.31l0.13,0.07l2.09,0.56l-0.74,2.45l-2.86,1.75l-0.12,0.14l-1.59,3.71l-2.2,1.24l-0.1,0.09l-1.03,1.54l-0.04,0.23l0.81,3.45l0.06,0.13l1.13,1.32l-2.59,-0.57l-5.89,-0.44l-0.92,-1.73l0.05,-2.4l-0.34,-0.3l-1.49,0.19l-0.72,-0.98l-0.2,-3.21l1.79,-1.33l0.1,-0.13l0.79,-2.04l0.02,-0.16l-0.27,-1.52l1.31,-2.69l0.91,-4.15l-0.23,-1.72l0.91,-0.49l0.15,-0.33l-0.27,-1.16l-0.15,-0.2l-0.87,-0.46l0.65,-1.01l-0.04,-0.37l-1.06,-1.09l-0.54,-3.2l0.83,-0.51l0.14,-0.29l-0.42,-3.6l0.58,-2.98l0.64,-2.5l1.41,-1.0l0.12,-0.32l-0.75,-2.8l-0.01,-2.48l1.81,-1.78l0.09,-0.22l-0.06,-2.3l1.39,-2.69l0.03,-0.14l0.01,-2.58l-0.11,-0.24l-0.57,-0.45l-1.1,-4.59l1.49,-2.73l0.04,-0.17l-0.23,-2.59l0.86,-2.38l1.6,-2.48l1.74,-1.65l0.04,-0.39l-0.64,-0.89l0.42,-0.7l0.04,-0.16l-0.08,-4.26l2.55,-1.23l0.16,-0.18l0.86,-2.75l-0.01,-0.22l-0.22,-0.48l1.84,-2.1l3.0,0.59ZM256.77,438.98l-2.1,0.15l-1.18,-1.14l-0.19,-0.08l-1.53,-0.09l-2.38,-0.0l-0.0,-6.28l0.4,0.65l1.25,2.55l0.11,0.12l3.26,2.07l3.19,0.8l-0.82,1.26Z\", \"name\": \"Argentina\" }, \"AU\": { \"path\": \"M705.55,353.06l0.09,0.09l0.37,0.05l0.13,-0.35l-0.57,-1.69l0.48,0.3l0.71,0.99l0.34,0.11l0.2,-0.29l-0.04,-1.37l-0.04,-0.14l-1.22,-2.07l-0.28,-0.9l-0.51,-0.69l0.24,-1.33l0.52,-0.7l0.34,-1.32l0.01,-0.13l-0.25,-1.44l0.51,-0.94l0.1,1.03l0.23,0.26l0.32,-0.14l1.01,-1.72l1.94,-0.84l1.27,-1.14l1.84,-0.92l1.0,-0.18l0.6,0.28l0.26,-0.0l1.94,-0.96l1.48,-0.28l0.19,-0.13l0.32,-0.49l0.51,-0.18l1.42,0.05l2.63,-0.76l0.11,-0.06l1.36,-1.15l0.08,-0.1l0.61,-1.33l1.42,-1.27l0.1,-0.19l0.11,-1.03l0.06,-1.32l1.39,-1.74l0.85,1.79l0.4,0.14l1.07,-0.51l0.11,-0.45l-0.77,-1.05l0.53,-0.84l0.86,0.43l0.43,-0.22l0.29,-1.85l1.29,-1.19l0.6,-0.98l1.16,-0.4l0.2,-0.27l0.02,-0.34l0.74,0.2l0.38,-0.27l0.03,-0.44l1.98,-0.61l1.7,1.08l1.36,1.48l0.22,0.1l1.55,0.02l1.57,0.24l0.33,-0.4l-0.48,-1.27l1.09,-1.86l1.06,-0.63l0.1,-0.42l-0.28,-0.46l0.93,-1.24l1.36,-0.8l1.16,0.27l0.14,0.0l2.1,-0.48l0.23,-0.3l-0.05,-1.3l-0.18,-0.26l-1.08,-0.49l0.44,-0.12l1.52,0.58l1.39,1.06l2.11,0.65l0.19,-0.0l0.59,-0.21l1.44,0.72l0.27,0.0l1.37,-0.68l0.84,0.2l0.26,-0.06l0.37,-0.3l0.82,0.89l-0.56,1.14l-0.84,0.91l-0.75,0.07l-0.26,0.38l0.26,0.9l-0.67,1.15l-0.88,1.24l-0.05,0.25l0.18,0.72l0.12,0.17l1.99,1.42l1.96,0.84l1.25,0.86l1.8,1.51l0.19,0.07l0.63,-0.0l1.15,0.58l0.34,0.7l0.17,0.15l2.39,0.88l0.24,-0.02l1.65,-0.88l0.14,-0.16l0.49,-1.37l0.52,-1.19l0.31,-1.39l0.75,-2.02l0.01,-0.19l-0.33,-1.16l0.16,-0.67l0.0,-0.13l-0.28,-1.41l0.3,-1.78l0.42,-0.45l0.05,-0.33l-0.33,-0.73l0.56,-1.25l0.48,-1.39l0.07,-0.69l0.58,-0.59l0.48,0.84l0.17,1.53l0.17,0.24l0.47,0.23l0.09,0.9l0.05,0.14l0.87,1.23l0.17,1.33l-0.09,0.89l0.03,0.15l0.9,2.0l0.43,0.13l1.38,-0.83l0.71,0.92l1.06,0.88l-0.22,0.96l0.0,0.14l0.53,2.2l0.38,1.3l0.15,0.18l0.52,0.26l0.62,2.01l-0.23,1.27l0.02,0.18l0.81,1.76l0.14,0.14l2.69,1.35l3.21,2.21l-0.2,0.4l0.04,0.34l1.39,1.6l0.95,2.78l0.43,0.16l0.79,-0.46l0.85,0.96l0.39,0.05l0.22,-0.15l0.36,2.33l0.09,0.18l1.78,1.63l1.16,1.01l1.9,2.1l0.67,2.05l0.06,1.47l-0.17,1.64l0.03,0.17l1.16,2.22l-0.14,2.28l-0.43,1.24l-0.68,2.44l0.04,1.63l-0.48,1.92l-1.06,2.43l-1.79,1.32l-0.1,0.12l-0.91,2.15l-0.82,1.37l-0.76,2.47l-0.98,1.46l-0.63,2.14l-0.33,2.02l0.1,0.82l-1.21,0.85l-2.71,0.1l-0.13,0.03l-2.31,1.19l-1.21,1.17l-1.34,1.11l-1.89,-1.18l-1.33,-0.46l0.32,-1.24l-0.4,-0.35l-1.46,0.61l-2.06,1.98l-1.99,-0.73l-1.43,-0.46l-1.45,-0.22l-2.32,-0.81l-1.51,-1.67l-0.45,-2.11l-0.6,-1.5l-0.07,-0.11l-1.23,-1.16l-0.16,-0.08l-1.96,-0.28l0.59,-0.99l0.03,-0.24l-0.61,-2.1l-0.54,-0.08l-1.16,1.85l-1.23,0.29l0.73,-0.88l0.06,-0.12l0.37,-1.57l0.93,-1.33l0.05,-0.2l-0.2,-2.07l-0.53,-0.17l-2.01,2.35l-1.52,0.94l-0.12,0.14l-0.82,1.93l-1.5,-0.9l0.07,-1.32l-0.06,-0.2l-1.57,-2.04l-1.15,-0.92l0.3,-0.41l-0.1,-0.44l-3.21,-1.69l-0.13,-0.03l-1.69,-0.08l-2.35,-1.31l-0.16,-0.04l-4.55,0.27l-3.24,0.99l-2.8,0.91l-2.33,-0.18l-0.17,0.03l-2.63,1.41l-2.14,0.64l-0.2,0.19l-0.47,1.42l-0.8,0.99l-1.99,0.06l-1.55,0.24l-2.27,-0.5l-1.79,0.3l-1.71,0.13l-0.19,0.09l-1.38,1.39l-0.58,-0.1l-0.21,0.04l-1.26,0.8l-1.13,0.85l-1.72,-0.1l-1.6,-0.0l-2.58,-1.76l-1.21,-0.49l0.04,-1.19l1.04,-0.32l0.16,-0.12l0.42,-0.64l0.05,-0.19l-0.09,-0.97l0.3,-2.0l-0.28,-1.64l-1.34,-2.84l-0.39,-1.49l0.1,-1.51l-0.04,-0.17l-0.96,-1.72l-0.06,-0.73l-0.09,-0.19l-1.04,-1.01l-0.3,-2.02l-0.05,-0.12l-1.23,-1.83ZM784.95,393.35l2.39,1.01l0.2,0.01l3.26,-0.96l1.19,0.16l0.16,3.19l-0.78,0.95l-0.07,0.16l-0.19,1.83l-0.43,-0.41l-0.44,0.03l-1.61,1.96l-0.4,-0.12l-1.38,-0.09l-1.43,-2.42l-0.37,-2.03l-1.4,-2.53l0.04,-0.94l1.27,0.2Z\", \"name\": \"Australia\" }, \"IL\": { \"path\": \"M509.04,199.22l0.71,0.0l0.27,-0.17l0.15,-0.33l0.19,-0.01l0.02,0.73l-0.27,0.34l0.02,0.08l-0.32,0.62l-0.65,-0.27l-0.41,0.19l-0.52,1.85l0.16,0.35l0.14,0.07l-0.17,0.1l-0.14,0.21l-0.11,0.73l0.39,0.33l0.81,-0.26l0.03,0.64l-0.97,3.43l-1.28,-3.67l0.62,-0.78l-0.03,-0.41l0.58,-1.16l0.5,-2.07l0.27,-0.54Z\", \"name\": \"Israel\" }, \"IN\": { \"path\": \"M615.84,192.58l2.4,2.97l-0.24,2.17l0.05,0.2l0.94,1.35l-0.06,0.97l-1.46,-0.3l-0.35,0.36l0.7,3.06l0.12,0.18l2.46,1.75l3.11,1.72l-1.23,0.96l-0.1,0.13l-0.97,2.55l0.16,0.38l2.41,1.02l2.37,1.33l3.27,1.52l3.43,0.37l1.37,1.3l0.17,0.08l1.92,0.25l3.0,0.62l2.15,-0.04l0.28,-0.22l0.29,-1.06l0.0,-0.13l-0.32,-1.66l0.16,-0.94l1.0,-0.37l0.23,2.28l0.18,0.24l2.28,1.02l0.2,0.02l1.52,-0.41l2.06,0.18l2.08,-0.08l0.29,-0.27l0.18,-1.66l-0.1,-0.26l-0.53,-0.44l1.38,-0.23l0.15,-0.07l2.26,-2.0l2.75,-1.65l1.97,0.63l0.25,-0.03l1.54,-0.99l0.89,1.28l-0.72,0.97l0.2,0.48l2.49,0.37l0.11,0.61l-0.69,0.39l-0.15,0.3l0.15,1.22l-1.36,-0.37l-0.23,0.03l-3.24,1.86l-0.15,0.28l0.07,1.44l-1.33,2.16l-0.04,0.13l-0.12,1.24l-0.98,1.91l-1.72,-0.53l-0.39,0.28l-0.09,2.66l-0.52,0.83l-0.04,0.23l0.21,0.89l-0.71,0.36l-1.21,-3.85l-0.29,-0.21l-0.69,0.01l-0.29,0.23l-0.28,1.17l-0.84,-0.84l0.6,-1.17l0.97,-0.13l0.23,-0.16l1.15,-2.25l-0.18,-0.42l-1.54,-0.47l-2.3,0.04l-2.13,-0.33l-0.19,-1.63l-0.26,-0.26l-1.13,-0.13l-1.93,-1.13l-0.42,0.13l-0.88,1.82l0.08,0.37l1.47,1.15l-1.21,0.77l-0.1,0.1l-0.56,0.97l0.13,0.42l1.31,0.61l-0.36,1.35l0.01,0.2l0.85,1.95l0.37,2.05l-0.26,0.68l-1.55,-0.02l-3.09,0.54l-0.25,0.32l0.13,1.84l-1.21,1.4l-3.64,1.79l-2.79,3.04l-1.86,1.61l-2.48,1.68l-0.13,0.25l-0.0,1.0l-1.07,0.55l-2.21,0.9l-1.13,0.13l-0.25,0.19l-0.75,1.96l-0.02,0.15l0.52,3.31l0.13,2.03l-1.03,2.35l-0.03,0.12l-0.01,4.03l-1.02,0.1l-0.23,0.15l-1.14,1.93l0.04,0.36l0.44,0.48l-1.83,0.57l-0.18,0.15l-0.81,1.65l-0.74,0.53l-2.14,-2.12l-1.14,-3.47l-0.96,-2.57l-0.9,-1.26l-1.3,-2.38l-0.61,-3.14l-0.44,-1.62l-2.29,-3.56l-1.03,-4.94l-0.74,-3.29l0.01,-3.12l-0.49,-2.51l-0.41,-0.22l-3.56,1.53l-1.59,-0.28l-2.96,-2.87l0.94,-0.74l0.06,-0.41l-0.74,-1.03l-2.73,-2.1l1.35,-1.43l5.38,0.01l0.29,-0.36l-0.5,-2.29l-0.09,-0.15l-1.33,-1.28l-0.27,-1.96l-0.12,-0.2l-1.36,-1.0l2.42,-2.48l2.77,0.2l0.24,-0.1l2.62,-2.85l1.59,-2.8l2.41,-2.74l0.07,-0.2l-0.04,-1.82l2.01,-1.51l-0.01,-0.49l-1.95,-1.33l-0.83,-1.81l-0.82,-2.27l0.98,-0.97l3.64,0.66l2.89,-0.42l0.17,-0.08l2.18,-2.15Z\", \"name\": \"India\" }, \"TZ\": { \"path\": \"M505.77,287.58l0.36,0.23l8.95,5.03l0.15,1.3l0.13,0.21l3.4,2.37l-1.07,2.88l-0.02,0.14l0.15,1.42l0.15,0.23l1.47,0.84l0.05,0.42l-0.66,1.44l-0.02,0.18l0.13,0.72l-0.16,1.16l0.03,0.19l0.87,1.57l1.03,2.48l0.12,0.14l0.53,0.32l-1.59,1.18l-2.64,0.95l-1.45,-0.04l-0.2,0.07l-0.81,0.69l-1.64,0.06l-0.68,0.3l-2.9,-0.69l-1.71,0.17l-0.65,-3.18l-0.05,-0.12l-1.35,-1.88l-0.19,-0.12l-2.41,-0.46l-1.38,-0.74l-1.63,-0.44l-0.96,-0.41l-0.95,-0.58l-1.31,-3.09l-1.47,-1.46l-0.45,-1.31l0.24,-1.34l-0.39,-1.99l0.71,-0.08l0.18,-0.09l0.91,-0.91l0.98,-1.31l0.59,-0.5l0.11,-0.24l-0.02,-0.81l-0.08,-0.2l-0.47,-0.5l-0.1,-0.67l0.51,-0.23l0.18,-0.25l0.14,-1.47l-0.05,-0.2l-0.76,-1.09l0.45,-0.15l2.71,0.03l5.01,-0.19Z\", \"name\": \"Tanzania\" }, \"AZ\": { \"path\": \"M539.36,175.66l0.16,0.09l1.11,0.2l0.32,-0.15l0.4,-0.71l1.22,-0.99l1.11,1.33l1.26,2.09l0.22,0.14l1.06,0.13l0.28,0.29l-1.46,0.17l-0.26,0.24l-0.43,2.26l-0.39,0.92l-0.85,0.63l-0.12,0.25l0.06,1.2l-0.22,0.05l-1.28,-1.25l0.74,-1.25l-0.03,-0.35l-0.74,-0.86l-0.3,-0.1l-1.05,0.27l-2.49,1.82l-0.04,-1.46l-0.18,-0.27l-1.09,-0.47l-0.8,-0.6l0.53,-0.7l-0.06,-0.42l-1.11,-0.84l0.34,-0.51l-0.11,-0.43l-0.89,-0.48l-0.33,-0.49l0.25,-0.2l1.78,0.81l1.35,0.18l0.25,-0.09l0.34,-0.35l0.02,-0.39l-1.04,-1.36l0.28,-0.18l0.49,0.07l1.65,1.74ZM533.53,180.16l0.63,0.67l0.22,0.09l0.8,-0.0l0.04,0.31l0.66,1.09l-0.94,-0.21l-1.16,-1.24l-0.25,-0.71Z\", \"name\": \"Azerbaijan\" }, \"IE\": { \"path\": \"M405.17,135.35l0.36,2.16l-1.78,2.84l-4.28,1.91l-3.02,-0.43l1.81,-3.13l0.02,-0.26l-1.23,-3.26l3.24,-2.56l1.54,-1.32l0.37,1.33l-0.49,1.77l0.3,0.38l1.49,-0.05l1.68,0.63Z\", \"name\": \"Ireland\" }, \"ID\": { \"path\": \"M756.56,287.86l0.69,4.02l0.15,0.21l2.59,1.5l0.39,-0.07l2.05,-2.61l2.75,-1.45l2.09,-0.0l2.08,0.85l1.85,0.89l2.52,0.46l0.08,15.44l-1.72,-1.6l-0.15,-0.07l-2.54,-0.51l-0.29,0.1l-0.53,0.62l-2.53,0.06l0.78,-1.51l1.48,-0.66l0.17,-0.34l-0.65,-2.74l-1.23,-2.19l-0.14,-0.13l-4.85,-2.13l-2.09,-0.23l-3.7,-2.28l-0.41,0.1l-0.67,1.11l-0.63,0.14l-0.41,-0.67l-0.01,-1.01l-0.14,-0.25l-1.39,-0.89l2.05,-0.69l1.73,0.05l0.29,-0.39l-0.21,-0.66l-0.29,-0.21l-3.5,-0.0l-0.9,-1.36l-0.19,-0.13l-2.14,-0.44l-0.65,-0.76l2.86,-0.51l1.28,-0.79l3.75,0.96l0.32,0.76ZM758.01,300.37l-0.79,1.04l-0.14,-1.07l0.4,-0.81l0.29,-0.47l0.24,0.31l-0.0,1.0ZM747.45,292.9l0.48,1.02l-1.45,-0.69l-2.09,-0.21l-1.45,0.16l-1.28,-0.07l0.35,-0.81l2.86,-0.1l2.58,0.68ZM741.15,285.69l-0.16,-0.25l-0.72,-3.08l0.47,-1.86l0.35,-0.38l0.1,0.73l0.25,0.26l1.28,0.19l0.18,0.78l-0.11,1.8l-0.96,-0.18l-0.35,0.22l-0.38,1.52l0.05,0.24ZM741.19,285.75l0.76,0.97l-0.11,0.05l-0.65,-1.02ZM739.18,293.52l-0.61,0.54l-1.44,-0.38l-0.25,-0.55l1.93,-0.09l0.36,0.48ZM728.4,295.87l-0.27,-0.07l-2.26,0.89l-0.37,-0.41l0.27,-0.8l-0.09,-0.33l-1.68,-1.37l0.17,-2.29l-0.42,-0.3l-1.67,0.76l-0.17,0.29l0.21,2.92l0.09,3.34l-1.22,0.28l-0.78,-0.54l0.65,-2.1l0.01,-0.14l-0.39,-2.42l-0.29,-0.25l-0.86,-0.02l-0.63,-1.4l0.99,-1.61l0.35,-1.97l1.24,-3.73l0.49,-0.96l1.95,-1.7l1.86,0.69l3.16,0.35l2.92,-0.1l0.17,-0.06l2.24,-1.65l0.11,0.14l-1.8,2.22l-1.72,0.44l-2.41,-0.48l-4.21,0.13l-2.19,0.36l-0.25,0.24l-0.36,1.9l0.08,0.27l2.24,2.23l0.4,0.02l1.29,-1.08l3.19,-0.58l-0.19,0.06l-1.04,1.4l-2.13,0.94l-0.12,0.45l2.26,3.06l-0.37,0.69l0.03,0.32l1.51,1.95ZM728.48,295.97l0.59,0.76l-0.02,1.37l-1.0,0.55l-0.64,-0.58l1.09,-1.84l-0.02,-0.26ZM728.64,286.95l0.79,-0.14l-0.07,0.39l-0.72,-0.24ZM732.38,310.1l-1.89,0.49l-0.06,-0.06l0.17,-0.64l1.0,-1.42l2.14,-0.87l0.1,0.2l0.04,0.58l-1.49,1.72ZM728.26,305.71l-0.17,0.63l-3.53,0.67l-3.02,-0.28l-0.0,-0.42l1.66,-0.44l1.47,0.71l0.16,0.03l1.75,-0.21l1.69,-0.69ZM722.98,310.33l-0.74,0.03l-2.52,-1.35l1.42,-0.3l1.19,0.7l0.72,0.63l-0.06,0.28ZM716.24,305.63l0.66,0.49l0.22,0.06l1.35,-0.18l0.31,0.53l-4.18,0.77l-0.8,-0.01l0.51,-0.86l1.2,-0.02l0.24,-0.12l0.49,-0.65ZM715.84,280.21l0.09,0.34l2.25,1.86l-2.25,0.22l-0.24,0.17l-0.84,1.71l-0.03,0.15l0.1,2.11l-2.27,1.62l-0.13,0.24l-0.06,2.46l-0.74,2.92l-0.02,-0.05l-0.39,-0.16l-2.62,1.04l-0.86,-1.33l-0.23,-0.14l-1.71,-0.14l-1.19,-0.76l-0.25,-0.03l-2.78,0.84l-0.79,-1.05l-0.26,-0.12l-1.61,0.13l-1.8,-0.25l-0.36,-3.13l-0.15,-0.23l-1.18,-0.65l-1.13,-2.02l-0.33,-2.1l0.27,-2.19l1.05,-1.17l0.28,1.12l0.1,0.16l1.71,1.41l0.28,0.05l1.55,-0.49l1.54,0.17l0.23,-0.07l1.4,-1.21l1.05,-0.19l2.3,0.68l0.16,0.0l2.04,-0.53l0.21,-0.19l1.26,-3.41l0.91,-0.82l0.09,-0.14l0.8,-2.64l2.63,0.0l1.71,0.33l-1.19,1.89l0.02,0.34l1.74,2.24l-0.37,1.0ZM692.67,302.0l0.26,0.19l4.8,0.25l0.28,-0.16l0.44,-0.83l4.29,1.12l0.85,1.52l0.23,0.15l3.71,0.45l2.37,1.15l-2.06,0.69l-2.77,-1.0l-2.25,0.07l-2.57,-0.18l-2.31,-0.45l-2.94,-0.97l-1.84,-0.25l-0.13,0.01l-0.97,0.29l-4.34,-0.98l-0.38,-0.94l-0.25,-0.19l-1.76,-0.14l1.31,-1.84l2.81,0.14l1.97,0.96l0.95,0.19l0.28,0.74ZM685.63,299.27l-2.36,0.04l-2.07,-2.05l-3.17,-2.02l-1.06,-1.5l-1.88,-2.02l-1.22,-1.85l-1.9,-3.49l-2.2,-2.11l-0.71,-2.08l-0.94,-1.99l-0.1,-0.12l-2.21,-1.54l-1.35,-2.17l-1.86,-1.39l-2.53,-2.68l-0.14,-0.81l1.22,0.08l3.76,0.47l2.16,2.4l1.94,1.7l1.37,1.04l2.35,2.67l0.22,0.1l2.44,0.04l1.99,1.62l1.42,2.06l0.09,0.09l1.67,1.0l-0.88,1.8l0.11,0.39l1.44,0.87l0.13,0.04l0.68,0.05l0.41,1.62l0.87,1.4l0.22,0.14l1.71,0.21l1.06,1.38l-0.61,3.04l-0.09,3.6Z\", \"name\": \"Indonesia\" }, \"UA\": { \"path\": \"M500.54,141.42l0.9,0.13l0.27,-0.11l0.52,-0.62l0.68,0.13l2.43,-0.3l1.32,1.57l-0.45,0.48l-0.07,0.26l0.21,1.03l0.27,0.24l1.85,0.15l0.76,1.22l-0.05,0.55l0.2,0.31l3.18,1.15l0.18,0.01l1.75,-0.47l1.42,1.41l0.22,0.09l1.42,-0.03l3.44,0.99l0.02,0.65l-0.97,1.62l-0.03,0.24l0.52,1.67l-0.29,0.79l-2.24,0.22l-0.14,0.05l-1.29,0.89l-0.13,0.23l-0.07,1.16l-1.75,0.22l-0.12,0.04l-1.6,0.98l-2.27,0.16l-0.12,0.04l-2.16,1.17l-0.16,0.29l0.15,1.94l0.14,0.23l1.23,0.75l0.18,0.04l2.06,-0.15l-0.22,0.51l-2.67,0.54l-3.27,1.72l-1.0,-0.45l0.45,-1.19l-0.19,-0.39l-2.34,-0.78l0.15,-0.2l2.32,-1.0l0.09,-0.49l-0.73,-0.72l-0.15,-0.08l-3.69,-0.75l-0.14,-0.96l-0.35,-0.25l-2.32,0.39l-0.21,0.15l-0.91,1.7l-1.77,2.1l-0.93,-0.44l-0.24,-0.0l-1.05,0.45l-0.48,-0.25l0.13,-0.07l0.14,-0.15l0.43,-1.04l0.67,-0.97l0.04,-0.26l-0.1,-0.31l0.04,-0.02l0.11,0.19l0.24,0.15l1.48,0.09l0.78,-0.25l0.07,-0.53l-0.27,-0.19l0.09,-0.25l-0.08,-0.33l-0.81,-0.74l-0.34,-1.24l-0.14,-0.18l-0.73,-0.42l0.15,-0.87l-0.11,-0.29l-1.13,-0.86l-0.15,-0.06l-0.97,-0.11l-1.79,-0.97l-0.2,-0.03l-1.66,0.32l-0.13,0.06l-0.52,0.41l-0.95,-0.0l-0.23,0.11l-0.56,0.66l-1.74,0.29l-0.79,0.43l-1.01,-0.68l-0.16,-0.05l-1.57,-0.01l-1.52,-0.35l-0.23,0.04l-0.71,0.45l-0.09,-0.43l-0.13,-0.19l-1.18,-0.74l0.38,-1.02l0.53,-0.64l0.35,0.12l0.37,-0.41l-0.57,-1.29l2.1,-2.5l1.16,-0.36l0.2,-0.2l0.27,-0.92l-0.01,-0.2l-1.1,-2.52l0.79,-0.09l0.13,-0.05l1.3,-0.86l1.83,-0.07l2.48,0.26l2.84,0.8l1.91,0.06l0.88,0.45l0.29,-0.01l0.72,-0.44l0.49,0.58l0.25,0.11l2.2,-0.16l0.94,0.3l0.39,-0.26l0.15,-1.57l0.61,-0.59l2.01,-0.19Z\", \"name\": \"Ukraine\" }, \"QA\": { \"path\": \"M548.47,221.47l-0.15,-1.72l0.59,-1.23l0.38,-0.16l0.54,0.6l0.04,1.4l-0.47,1.37l-0.41,0.11l-0.53,-0.37Z\", \"name\": \"Qatar\" }, \"MZ\": { \"path\": \"M507.71,314.14l1.65,-0.18l2.96,0.7l0.2,-0.02l0.6,-0.29l1.68,-0.06l0.18,-0.07l0.8,-0.69l1.5,0.02l2.74,-0.98l1.74,-1.27l0.25,0.7l-0.1,2.47l0.31,2.27l0.1,3.97l0.42,1.24l-0.7,1.71l-0.94,1.73l-1.52,1.52l-5.06,2.21l-2.88,2.8l-1.01,0.51l-1.72,1.81l-0.99,0.58l-0.15,0.23l-0.21,1.86l0.04,0.19l1.17,1.95l0.47,1.47l0.03,0.74l0.39,0.28l0.05,-0.01l-0.06,2.13l-0.39,1.19l0.1,0.33l0.42,0.32l-0.28,0.83l-0.95,0.86l-2.03,0.88l-3.08,1.49l-1.1,0.99l-0.09,0.28l0.21,1.13l0.21,0.23l0.38,0.11l-0.14,0.89l-1.39,-0.02l-0.17,-0.94l-0.38,-1.23l-0.2,-0.89l0.44,-2.91l-0.01,-0.14l-0.65,-1.88l-1.15,-3.55l2.52,-2.85l0.68,-1.89l0.29,-0.18l0.14,-0.2l0.28,-1.53l-0.03,-0.19l-0.36,-0.7l0.1,-1.83l0.49,-1.84l-0.01,-3.26l-0.14,-0.25l-1.3,-0.83l-0.11,-0.04l-1.08,-0.17l-0.47,-0.55l-0.1,-0.08l-1.16,-0.54l-0.13,-0.03l-1.83,0.04l-0.32,-2.25l7.19,-1.99l1.32,1.12l0.29,0.06l0.55,-0.19l0.75,0.49l0.11,0.81l-0.49,1.11l-0.02,0.15l0.19,1.81l0.09,0.18l1.63,1.59l0.48,-0.1l0.72,-1.68l0.99,-0.49l0.17,-0.29l-0.21,-3.29l-0.04,-0.13l-1.11,-1.92l-0.9,-0.82l-0.21,-0.08l-0.62,0.03l-0.63,-2.98l0.61,-1.67Z\", \"name\": \"Mozambique\" } }, \"height\": 440.7063107441331, \"projection\": { \"type\": \"mill\", \"centralMeridian\": 11.5 }, \"width\": 900.0 });//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9wbHVnaW5zL2p2ZWN0b3JtYXAvanF1ZXJ5LWp2ZWN0b3JtYXAtd29ybGQtbWlsbC1lbi5qcz81ODVjIl0sIm5hbWVzIjpbIiQiLCJmbiIsInZlY3Rvck1hcCJdLCJtYXBwaW5ncyI6IkFBQUFBLEVBQUVDLEVBQUYsQ0FBS0MsU0FBTCxDQUFlLFFBQWYsRUFBeUIsZUFBekIsRUFBeUMsRUFBQyxVQUFVLENBQUMsRUFBQyxTQUFTLEtBQVYsRUFBaUIsT0FBTyxDQUF4QixFQUEyQixVQUFVLGlCQUFyQyxFQUF3RCxRQUFRLENBQUMsRUFBQyxLQUFLLENBQUMsa0JBQVAsRUFBMkIsS0FBSyxDQUFDLGtCQUFqQyxFQUFELEVBQXVELEVBQUMsS0FBSyxnQkFBTixFQUF3QixLQUFLLGtCQUE3QixFQUF2RCxDQUFoRSxFQUEwSyxRQUFRLENBQWxMLEVBQUQsQ0FBWCxFQUFtTSxTQUFTLEVBQUMsTUFBTSxFQUFDLFFBQVEscWZBQVQsRUFBZ2dCLFFBQVEsWUFBeGdCLEVBQVAsRUFBOGhCLE1BQU0sRUFBQyxRQUFRLHVOQUFULEVBQWtPLFFBQVEsU0FBMU8sRUFBcGlCLEVBQTB4QixNQUFNLEVBQUMsUUFBUSwra0JBQVQsRUFBMGxCLFFBQVEsY0FBbG1CLEVBQWh5QixFQUFtNUMsTUFBTSxFQUFDLFFBQVEsd1pBQVQsRUFBbWEsUUFBUSxVQUEzYSxFQUF6NUMsRUFBaTFELE1BQU0sRUFBQyxRQUFRLHlSQUFULEVBQW9TLFFBQVEsd0JBQTVTLEVBQXYxRCxFQUE4cEUsTUFBTSxFQUFDLFFBQVEsK0ZBQVQsRUFBMEcsUUFBUSxRQUFsSCxFQUFwcUUsRUFBaXlFLE1BQU0sRUFBQyxRQUFRLCs1QkFBVCxFQUEwNkIsUUFBUSxTQUFsN0IsRUFBdnlFLEVBQXF1RyxNQUFNLEVBQUMsUUFBUSxzNEJBQVQsRUFBaTVCLFFBQVEsT0FBejVCLEVBQTN1RyxFQUE4b0ksTUFBTSxFQUFDLFFBQVEsZ0xBQVQs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RUFBbW5CLFFBQVEsWUFBM25CLEVBQTVvckksRUFBc3hzSSxNQUFNLEVBQUMsUUFBUSx3S0FBVCxFQUFtTCxRQUFRLFNBQTNMLEVBQTV4c0ksRUFBbStzSSxNQUFNLEVBQUMsUUFBUSwrMkdBQVQsRUFBMDNHLFFBQVEsV0FBbDRHLEVBQXorc0ksRUFBeTN6SSxNQUFNLEVBQUMsUUFBUSw2K0NBQVQsRUFBdy9DLFFBQVEsU0FBaGdELEVBQS8zekksRUFBMjQySSxNQUFNLEVBQUMsUUFBUSx1R0FBVCxFQUFrSCxRQUFRLE9BQTFILEVBQWo1MkksRUFBcWgzSSxNQUFNLEVBQUMsUUFBUSwraENBQVQsRUFBMGlDLFFBQVEsWUFBbGpDLEVBQTNoM0ksRUFBNU0sRUFBeXk1SSxVQUFVLGlCQUFuejVJLEVBQXMwNUksY0FBYyxFQUFDLFFBQVEsTUFBVCxFQUFpQixtQkFBbUIsSUFBcEMsRUFBcDE1SSxFQUErMzVJLFNBQVMsS0FBeDQ1SSxFQUF6QyIsImZpbGUiOiI1NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIiQuZm4udmVjdG9yTWFwKCdhZGRNYXAnLCAnd29ybGRfbWlsbF9lbicse1wiaW5zZXRzXCI6IFt7XCJ3aWR0aFwiOiA5MDAuMCwgXCJ0b3BcIjogMCwgXCJoZWlnaHRcIjogNDQwLjcwNjMxMDc0NDEzMzEsIFwiYmJveFwiOiBbe1wieVwiOiAtMTI2NzE2NzEuMTIzMzMwMDE0LCBcInhcIjogLTIwMDA0Mjk3LjE1MTUyNTgzNn0sIHtcInlcIjogNjkzMDM5Mi4wMjUxMzUxMiwgXCJ4XCI6IDIwMDI2NTcyLjM5NDc0OTM4NH1dLCBcImxlZnRcIjogMH1dLCBcInBhdGhzXCI6IHtcIkJEXCI6IHtcInBhdGhcIjogXCJNNjUyLjcxLDIyOC44NWwtMC4wNCwxLjM4bC0wLjQ2LC0wLjIxbC0wLjQyLDAuM2wwLjA1LDAuNjVsLTAuMTcsLTEuMzdsLTAuNDgsLTEuMjZsLTEuMDgsLTEuNmwtMC4yMywtMC4xM2wtMi4zMSwtMC4xMWwtMC4zMSwwLjM2bDAuMjEsMC45OGwtMC42LDEuMTFsLTAuOCwtMC40bC0wLjM3LDAuMDlsLTAuMjMsMC4zbC0wLjU0LC0wLjIxbC0wLjc4LC0wLjE5bC0wLjM4LC0yLjA0bC0wLjgzLC0xLjg5bDAuNCwtMS41bC0wLjE2LC0wLjM1bC0xLjI0LC0wLjU3bDAuMzYsLTAuNjJsMS41LC0wLjk1bDAuMDIsLTAuNDlsLTEuNjIsLTEuMjZsMC42NCwtMS4zMWwxLjcsMS4wbDAuMTIsMC4wNGwwLjk2LDAuMTFsMC4xOSwxLjYybDAuMjUsMC4yNmwyLjM4LDAuMzdsMi4zMiwtMC4wNGwxLjA2LDAuMzNsLTAuOTIsMS43OWwtMC45NywwLjEzbC0wLjIzLDAuMTZsLTAuNzcsMS41MWwwLjA1LDAuMzVsMS4zNywxLjM3bDAuNSwtMC4xNGwwLjM1LC0xLjQ2bDAuMjQsLTAuMGwxLjI0LDMuOTJaXCIsIFwibmFtZVwiOiBcIkJhbmdsYWRlc2hcIn0sIFwiQkVcIjoge1wicGF0aFwiOiBcIk00MjkuMjgsMTQzLjk1bDEuNzYsMC4yNWwwLjEzLC0wLjAxbDIuMTYsLTAuNjRsMS40NiwxLjM0bDEuMjYsMC43MWwtMC4yMywxLjhsLTAuNDQsMC4wOGwtMC4yNCwwLjI1bC0wLjIsMS4zNmwtMS44LC0xLjIybC0wLjIzLC0wLjA1bC0xLjE0LDAuMjNsLTEuNjIsLTEuNDNsLTEuMTUsLTEuMzFsLTAuMjEsLTAuMWwtMC45NSwtMC4wNGwtMC4yMSwtMC42OGwxLjY2LC0wLjU0WlwiLCBcIm5hbWVcIjogXCJCZWxnaXVtXCJ9LCBcIkJGXCI6IHtcInBhdGhcIjogXCJNNDEzLjQ4LDI2MC4yMWwtMS4yMiwtMC40NmwtMC4xMywtMC4wMmwtMS4xNywwLjFsLTAuMTUsMC4wNmwtMC43MywwLjUzbC0wLjg3LC0wLjQxbC0wLjM5LC0wLjc1bC0wLjEzLC0wLjEzbC0wLjk4LC0wLjQ4bC0wLjE0LC0xLjJsMC42MywtMC45OWwwLjA1LC0wLjE4bC0wLjA1LC0wLjczbDEuOSwtMi4wMWwwLjA4LC0wLjE0bDAuMzUsLTEuNjVsMC40OSwtMC40NGwxLjA1LDAuM2wwLjIxLC0wLjAybDEuMDUsLTAuNTJsMC4xMywtMC4xM2wwLjMsLTAuNThsMS44NywtMS4xbDAuMTEsLTAuMWwwLjQzLC0wLjcybDIuMjMsLTEuMDFsMS4yMSwtMC4zMmwwLjUxLDAuNGwwLjE5LDAuMDZsMS4yNSwtMC4wMWwtMC4xNCwwLjg5bDAuMDEsMC4xM2wwLjM0LDEuMTZsMC4wNiwwLjExbDEuMzUsMS41OWwwLjA3LDEuMTNsMC4yNCwwLjI4bDIuNjQsMC41M2wtMC4wNSwxLjM5bC0wLjQyLDAuNTlsLTEuMTEsMC4yMWwtMC4yMiwwLjE3bC0wLjQ2LDAuOTlsLTAuNjksMC4yM2wtMi4xMiwtMC4wNWwtMS4xNCwtMC4ybC0wLjE5LDAuMDNsLTAuNzIsMC4zNmwtMS4wNywtMC4xN2wtNC4zNSwwLjEybC0wLjI5LDAuMjlsLTAuMDYsMS40NGwwLjI1LDEuNDVaXCIsIFwibmFtZVwiOiBcIkJ1cmtpbmEgRmFzb1wifSwgXCJCR1wiOiB7XCJwYXRoXCI6IFwiTTQ3Ny42MywxNjYuODRsMC41MSwwLjlsMC4zMywwLjE0bDAuOSwtMC4yMWwxLjkxLDAuNDdsMy42OCwwLjE2bDAuMTcsLTAuMDVsMS4yLC0wLjc1bDIuNzgsLTAuNjdsMS43MiwxLjA1bDEuMDIsMC4yNGwtMC45NywwLjk3bC0wLjkxLDIuMTdsMC4wLDAuMjRsMC41NiwxLjE5bC0xLjU4LC0wLjNsLTAuMTYsMC4wMWwtMi41NSwwLjk1bC0wLjIsMC4yOGwtMC4wMiwxLjIzbC0xLjkyLDAuMjRsLTEuNjgsLTAuOTlsLTAuMjcsLTAuMDJsLTEuOTQsMC44bC0xLjUyLC0wLjA3bC0wLjE1LC0xLjcybC0wLjEyLC0wLjIxbC0wLjk5LC0wLjc2bDAuMTgsLTAuMThsMC4wMiwtMC4zOWwtMC4xNywtMC4yMmwwLjMzLC0wLjc1bDAuOTEsLTAuOTFsMC4wMSwtMC40MmwtMS4xNiwtMS4yNWwtMC4xOCwtMC44OWwwLjI0LC0wLjI3WlwiLCBcIm5hbWVcIjogXCJCdWxnYXJpYVwifSwgXCJCQVwiOiB7XCJwYXRoXCI6IFwiTTQ2OC4zOSwxNjQuNjZsMC4xNiwwLjA0bDAuNDMsLTAuMGwtMC40MywwLjkzbDAuMDYsMC4zNGwxLjA4LDEuMDZsLTAuMjgsMS4wOWwtMC41LDAuMTNsLTAuNDcsMC4yOGwtMC44NiwwLjc0bC0wLjEsMC4xNmwtMC4yOCwxLjI5bC0xLjgxLC0wLjk0bC0wLjksLTEuMjJsLTEuMCwtMC43M2wtMS4xLC0xLjFsLTAuNTUsLTAuOTZsLTEuMTEsLTEuM2wwLjMsLTAuNzVsMC41OSwwLjQ2bDAuNDIsLTAuMDRsMC40NiwtMC41NGwxLjAsLTAuMDZsMi4xMSwwLjVsMS43MiwtMC4wM2wxLjA2LDAuNjRaXCIsIFwibmFtZVwiOiBcIkJvc25pYSBhbmQgSGVyemVnb3ZpbmFcIn0sIFwiQk5cIjoge1wicGF0aFwiOiBcIk03MDcuMzQsMjczLjU3bDAuNzYsLTAuNzJsMS41OSwtMS4wM2wtMC4xOCwxLjkzbC0wLjksLTAuMDZsLTAuMjgsMC4xNGwtMC4zMSwwLjUxbC0wLjY4LC0wLjc4WlwiLCBcIm5hbWVcIjogXCJCcnVuZWlcIn0sIFwiQk9cIjoge1wicGF0aFwiOiBcIk0yNjMuODMsMzQwLjc5bC0wLjIzLC0wLjEybC0yLjg2LC0wLjExbC0wLjI4LDAuMTdsLTAuNzcsMS42N2wtMS4xNywtMS41MWwtMC4xOCwtMC4xMWwtMy4yOCwtMC42NGwtMC4yOCwwLjFsLTIuMDIsMi4zbC0xLjQzLDAuMjlsLTAuOTEsLTMuMzVsLTEuMzEsLTIuODhsMC43NSwtMi40MWwtMC4wOSwtMC4zMmwtMS4yMywtMS4wM2wtMC4zMSwtMS43NmwtMC4wNSwtMC4xMmwtMS4xMiwtMS42bDEuNDksLTIuNjJsMC4wMSwtMC4yOGwtMS4wLC0yLjBsMC40OCwtMC43MmwwLjAyLC0wLjI5bC0wLjM3LC0wLjc4bDAuODcsLTEuMTNsMC4wNiwtMC4xOGwwLjA1LC0yLjE3bDAuMTIsLTEuNzFsMC41LC0wLjhsMC4wMSwtMC4zbC0xLjksLTMuNThsMS4zLDAuMTVsMS4zNCwtMC4wNWwwLjIzLC0wLjEybDAuNTEsLTAuN2wyLjEyLC0wLjk5bDEuMzEsLTAuOTNsMi44MSwtMC4zN2wtMC4yMSwxLjUxbDAuMDEsMC4xM2wwLjI5LDAuOTFsLTAuMTksMS42NGwwLjExLDAuMjdsMi43MiwyLjI3bDAuMTUsMC4wN2wyLjcxLDAuNDFsMC45MiwwLjg4bDAuMTIsMC4wN2wxLjY0LDAuNDlsMS4wLDAuNzFsMC4xOCwwLjA2bDEuNSwtMC4wMmwxLjI0LDAuNjRsMC4xLDEuMzFsMC4wNSwwLjE0bDAuNDQsMC42OGwwLjAyLDAuNzNsLTAuNDQsMC4wM2wtMC4yNywwLjM5bDAuOTYsMi45OWwwLjI4LDAuMjFsNC40MywwLjFsLTAuMjgsMS4xMmwwLjAsMC4xNWwwLjI3LDEuMDJsMC4xNSwwLjE5bDEuMjcsMC42N2wwLjUyLDEuNDJsLTAuNDIsMS45MWwtMC42NiwxLjFsLTAuMDQsMC4ybDAuMjEsMS4zbC0wLjE5LDAuMTNsLTAuMDEsLTAuMjdsLTAuMTUsLTAuMjRsLTIuMzMsLTEuMzNsLTAuMTQsLTAuMDRsLTIuMzgsLTAuMDNsLTQuMzYsMC43NmwtMC4yMSwwLjE2bC0xLjIsMi4yOWwtMC4wMywwLjEzbC0wLjA2LDEuMzdsLTAuNzksMi41M2wtMC4wNSwtMC4wOFpcIiwgXCJuYW1lXCI6IFwiQm9saXZpYVwifSwgXCJKUFwiOiB7XCJwYXRoXCI6IFwiTTc4MS4xNywxNjYuNzhsMS44LDAuNjdsMC4yOCwtMC4wNGwxLjM4LC0xLjAxbDAuNDMsMi42N2wtMy40NCwwLjc3bC0wLjE4LDAuMTJsLTIuMDQsMi43OWwtMy43MSwtMS45NGwtMC40MiwwLjE1bC0xLjI5LDMuMTFsLTIuMzIsMC4wNGwtMC4zLC0yLjYzbDEuMTIsLTIuMWwyLjUxLC0wLjE2bDAuMjgsLTAuMjVsMC43MywtNC4yMmwwLjU4LC0xLjlsMi41OSwyLjg0bDIuMCwxLjFaTTc3My42NiwxODcuMzZsLTAuOTIsMi4yNGwtMC4wMSwwLjJsMC40LDEuM2wtMS4xOCwxLjgxbC0zLjA2LDEuMjhsLTQuMzUsMC4xN2wtMC4xOSwwLjA4bC0zLjQsMy4wNmwtMS4zNiwtMC44N2wtMC4xLC0xLjk1bC0wLjM0LC0wLjI4bC00LjM1LDAuNjJsLTIuOTksMS4zM2wtMi44NywwLjA1bC0wLjI4LDAuMmwwLjA5LDAuMzNsMi4zNywxLjkzbC0xLjU3LDQuNDRsLTEuMzUsMC45N2wtMC45LC0wLjc5bDAuNTcsLTIuMzJsLTAuMTUsLTAuMzRsLTEuNSwtMC43N2wtMC44MSwtMS41M2wyLjA0LC0wLjc1bDAuMTQsLTAuMWwxLjI4LC0xLjcybDIuNDcsLTEuNDNsMS44NCwtMS45Mmw0LjgzLC0wLjgybDIuNjIsMC41N2wwLjMzLC0wLjE2bDIuNDUsLTQuNzdsMS4zOCwxLjE0bDAuMzgsMC4wbDUuMSwtNC4wMmwwLjA5LC0wLjExbDEuNTcsLTMuNTdsMC4wMiwtMC4xNmwtMC40MiwtMy4yMmwwLjk0LC0xLjY3bDIuMjcsLTAuNDdsMS4yNiwzLjgybC0wLjA3LDIuMjNsLTIuMjYsMi44NmwtMC4wNiwwLjE5bDAuMDQsMi45M1pNNzU3Ljg1LDE5Ni4xOGwwLjIyLDAuNjZsLTEuMTEsMS4zM2wtMC44LC0wLjdsLTAuMzMsLTAuMDRsLTEuMjgsMC42NWwtMC4xNCwwLjE1bC0wLjU0LDEuMzRsLTEuMTcsLTAuNTdsMC4wMiwtMS4wM2wxLjIsLTEuNDVsMS4yNCwwLjI4bDAuMjksLTAuMWwwLjksLTEuMDNsMS41MSwwLjVaXCIsIFwibmFtZVwiOiBcIkphcGFuXCJ9LCBcIkJJXCI6IHtcInBhdGhcIjogXCJNNDk0LjcsMjk1LjgzbC0wLjE0LC0yLjcxbC0wLjA0LC0wLjEzbC0wLjM0LC0wLjYybDAuOTMsMC4xMmwwLjMsLTAuMTZsMC42NywtMS4yNWwwLjksMC4xMWwwLjExLDAuNzZsMC4wOCwwLjE2bDAuNDYsMC40OGwwLjAyLDAuNTZsLTAuNTUsMC40OGwtMC45NiwxLjI5bC0wLjgyLDAuODJsLTAuNjEsMC4wN1pcIiwgXCJuYW1lXCI6IFwiQnVydW5kaVwifSwgXCJCSlwiOiB7XCJwYXRoXCI6IFwiTTQyNy40LDI2OC45NGwtMS41OCwwLjIybC0wLjUyLC0xLjQ1bDAuMTEsLTUuNzNsLTAuMDgsLTAuMjFsLTAuNDMsLTAuNDRsLTAuMDksLTEuMTNsLTAuMDksLTAuMTlsLTEuNTIsLTEuNTJsMC4yNCwtMS4wMWwwLjcsLTAuMjNsMC4xOCwtMC4xNmwwLjQ1LC0wLjk3bDEuMDcsLTAuMjFsMC4xOSwtMC4xMmwwLjUzLC0wLjczbDAuNzMsLTAuNjVsMC42OCwtMC4wbDEuNjksMS4zbC0wLjA4LDAuNjdsMC4wMiwwLjE0bDAuNTIsMS4zOGwtMC40NCwwLjlsLTAuMDEsMC4yNGwwLjIsMC41MmwtMS4xLDEuNDJsLTAuNzYsMC43NmwtMC4wOCwwLjEzbC0wLjQ3LDEuNTlsMC4wNSwxLjY5bC0wLjEzLDMuNzlaXCIsIFwibmFtZVwiOiBcIkJlbmluXCJ9LCBcIkJUXCI6IHtcInBhdGhcIjogXCJNNjUwLjM4LDIxMy43OGwwLjg4LDAuNzVsLTAuMTMsMS4yNGwtMS43NywwLjA3bC0yLjEsLTAuMThsLTEuNTcsMC40bC0yLjAyLC0wLjkxbC0wLjAyLC0wLjI0bDEuNTQsLTEuODdsMS4xOCwtMC42bDEuNjcsMC41OWwxLjMyLDAuMDhsMS4wMSwwLjY3WlwiLCBcIm5hbWVcIjogXCJCaHV0YW5cIn0sIFwiSk1cIjoge1wicGF0aFwiOiBcIk0yMjYuNjcsMjM4LjM3bDEuNjQsMC4yM2wxLjIsMC41NmwwLjExLDAuMTlsLTEuMjUsMC4wM2wtMC4xNCwwLjA0bC0wLjY1LDAuMzdsLTEuMjQsLTAuMzdsLTEuMTcsLTAuNzdsMC4xMSwtMC4yMmwwLjg2LC0wLjE1bDAuNTIsMC4wOFpcIiwgXCJuYW1lXCI6IFwiSmFtYWljYVwifSwgXCJCV1wiOiB7XCJwYXRoXCI6IFwiTTQ4NC45MSwzMzEuOTZsMC41MywwLjUybDAuODIsMS41M2wyLjgzLDIuODZsMC4xNCwwLjA4bDAuODUsMC4yMmwwLjAzLDAuODFsMC43NCwxLjY2bDAuMjEsMC4xN2wxLjg3LDAuMzlsMS4xNywwLjg3bC0zLjEzLDEuNzFsLTIuMywyLjAxbC0wLjA3LDAuMWwtMC44MiwxLjc0bC0wLjY2LDAuODhsLTEuMjQsMC4xOWwtMC4yNCwwLjJsLTAuNjUsMS45OGwtMS40LDAuNTVsLTEuOSwtMC4xMmwtMS4yLC0wLjc0bC0xLjA2LC0wLjMybC0wLjIyLDAuMDJsLTEuMjIsMC42MmwtMC4xNCwwLjE0bC0wLjU4LDEuMjFsLTEuMTYsMC43OWwtMS4xOCwxLjEzbC0xLjUsMC4yM2wtMC40LC0wLjY4bDAuMjIsLTEuNTNsLTAuMDQsLTAuMTlsLTEuNDgsLTIuNTRsLTAuMTEsLTAuMTFsLTAuNTMsLTAuMzFsLTAuMCwtNy4yNWwyLjE4LC0wLjA4bDAuMjksLTAuM2wwLjA3LC05LjBsMS42MywtMC4wOGwzLjY5LC0wLjg2bDAuODQsMC45M2wwLjM4LDAuMDVsMS41MywtMC45N2wwLjc5LC0wLjAzbDEuMywtMC41M2wwLjIzLDAuMWwwLjkyLDEuOTZaXCIsIFwibmFtZVwiOiBcIkJvdHN3YW5hXCJ9LCBcIkJSXCI6IHtcInBhdGhcIjogXCJNMjU5LjQ5LDI3NC44N2wxLjQyLDAuMjVsMS45NywwLjYybDAuMjgsLTAuMDVsMC42NywtMC41NWwxLjc2LC0wLjM4bDIuOCwtMC45NGwwLjEyLC0wLjA4bDAuOTIsLTAuOTZsMC4wNSwtMC4zM2wtMC4xNSwtMC4zMmwwLjczLC0wLjA2bDAuMzYsMC4zNWwtMC4yNywwLjkzbDAuMTcsMC4zNmwwLjc2LDAuMzRsMC40NCwwLjlsLTAuNTgsMC43M2wtMC4wNiwwLjEzbC0wLjQsMi4xM2wwLjAzLDAuMTlsMC42MiwxLjIybDAuMTcsMS4xMWwwLjExLDAuMTlsMS41NCwxLjE4bDAuMTUsMC4wNmwxLjIzLDAuMTJsMC4yOSwtMC4xNWwwLjIsLTAuMzZsMC43MSwtMC4xMWwxLjEzLC0wLjQ0bDAuNzksLTAuNjNsMS4yNSwwLjE5bDAuNjUsLTAuMDhsMS4zMiwwLjJsMC4zMiwtMC4xOGwwLjIzLC0wLjUxbC0wLjA1LC0wLjMxbC0wLjMxLC0wLjM3bDAuMTEsLTAuMzFsMC43NSwwLjE3bDAuMTMsMC4wbDEuMSwtMC4yNGwxLjM0LDAuNWwxLjA4LDAuNTFsMC4zMywtMC4wNWwwLjY3LC0wLjU4bDAuMjcsMC4wNWwwLjI4LDAuNTdsMC4zMSwwLjE3bDEuMiwtMC4xOGwwLjE3LC0wLjA4bDEuMDMsLTEuMDVsMC43NiwtMS44MmwxLjM5LC0yLjE2bDAuNDksLTAuMDdsMC41MiwxLjE3bDEuNCw0LjM3bDAuMiwwLjJsMS4xNCwwLjM1bDAuMDUsMS4zOWwtMS44LDEuOTdsMC4wMSwwLjQybDAuNzgsMC43NWwwLjE4LDAuMDhsNC4xNiwwLjM3bDAuMDgsMi4yNWwwLjUsMC4yMmwxLjc4LC0xLjU0bDIuOTgsMC44NWw0LjA3LDEuNWwxLjA3LDEuMjhsLTAuMzcsMS4yM2wwLjM2LDAuMzhsMi44MywtMC43NWw0LjgsMS4zbDMuNzUsLTAuMDlsMy42LDIuMDJsMy4yNywyLjg0bDEuOTMsMC43MmwyLjEzLDAuMTFsMC43NiwwLjY2bDEuMjIsNC41NmwtMC45Niw0LjAzbC0xLjIyLDEuNThsLTMuNTIsMy41MWwtMS42MywyLjkxbC0xLjc1LDIuMDlsLTAuNSwwLjA0bC0wLjI2LDAuMTlsLTAuNzIsMS45OWwwLjE4LDQuNzZsLTAuOTUsNS41NmwtMC43NCwwLjk2bC0wLjA2LDAuMTVsLTAuNDMsMy4zOWwtMi40OSwzLjM0bC0wLjA2LDAuMTNsLTAuNCwyLjU2bC0xLjksMS4wN2wtMC4xMywwLjE2bC0wLjUxLDEuMzhsLTIuNTksMC4wbC0zLjk0LDEuMDFsLTEuODIsMS4xOWwtMi44NSwwLjgxbC0zLjAxLDIuMTdsLTIuMTIsMi42NWwtMC4wNiwwLjEzbC0wLjM2LDIuMGwwLjAxLDAuMTNsMC40LDEuNDJsLTAuNDUsMi42M2wtMC41MywxLjIzbC0xLjc2LDEuNTNsLTIuNzYsNC43OWwtMi4xNiwyLjE1bC0xLjY5LDEuMjlsLTAuMDksMC4xMmwtMS4xMiwyLjZsLTEuMywxLjI2bC0wLjQ1LC0xLjAybDAuOTksLTEuMThsMC4wMSwtMC4zN2wtMS41LC0xLjk1bC0xLjk4LC0xLjU0bC0yLjU4LC0xLjc3bC0wLjIsLTAuMDVsLTAuODEsMC4wN2wtMi40MiwtMi4wNWwtMC4yNSwtMC4wN2wtMC43NywwLjE0bDIuNzUsLTMuMDdsMi44LC0yLjYxbDEuNjcsLTEuMDlsMi4xMSwtMS40OWwwLjEzLC0wLjI0bDAuMDUsLTIuMTVsLTAuMDcsLTAuMmwtMS4yNiwtMS41NGwtMC4zNSwtMC4wOWwtMC42NCwwLjI3bDAuMywtMC45NWwwLjM0LC0xLjU3bDAuMDEsLTEuNTJsLTAuMTYsLTAuMjZsLTAuOSwtMC40OGwtMC4yNywtMC4wMWwtMC44NiwwLjM5bC0wLjY1LC0wLjA4bC0wLjIzLC0wLjhsLTAuMjMsLTIuMzlsLTAuMDQsLTAuMTJsLTAuNDcsLTAuNzlsLTAuMTQsLTAuMTJsLTEuNjksLTAuNzFsLTAuMjUsMC4wMWwtMC45MywwLjQ3bC0yLjI5LC0wLjQ0bDAuMTUsLTMuM2wtMC4wMywtMC4xNWwtMC42MiwtMS4yMmwwLjU3LC0wLjM5bDAuMTMsLTAuM2wtMC4yMiwtMS4zN2wwLjY3LC0xLjEzbDAuNDQsLTIuMDRsLTAuMDEsLTAuMTdsLTAuNTksLTEuNjFsLTAuMTQsLTAuMTZsLTEuMjUsLTAuNjZsLTAuMjIsLTAuODJsMC4zNSwtMS40MWwtMC4yOCwtMC4zN2wtNC41OSwtMC4xbC0wLjc4LC0yLjQxbDAuMzQsLTAuMDJsMC4yOCwtMC4zMWwtMC4wMywtMS4xbC0wLjA1LC0wLjE2bC0wLjQ1LC0wLjY4bC0wLjEsLTEuNGwtMC4xNiwtMC4yNGwtMS40NSwtMC43NmwtMC4xNCwtMC4wM2wtMS40OCwwLjAybC0xLjA0LC0wLjczbC0xLjYyLC0wLjQ4bC0wLjkzLC0wLjlsLTAuMTYsLTAuMDhsLTIuNzIsLTAuNDFsLTIuNTMsLTIuMTJsMC4xOCwtMS41NGwtMC4wMSwtMC4xM2wtMC4yOSwtMC45MWwwLjI2LC0xLjgzbC0wLjM0LC0wLjM0bC0zLjI4LDAuNDNsLTAuMTQsMC4wNWwtMS4zLDAuOTNsLTIuMTYsMS4wMWwtMC4xMiwwLjA5bC0wLjQ3LDAuNjVsLTEuMTIsMC4wNWwtMS44NCwtMC4yMWwtMC4xMiwwLjAxbC0xLjMzLDAuNDFsLTAuODIsLTAuMjFsMC4xNiwtMy42bC0wLjQ4LC0wLjI2bC0xLjk3LDEuNDNsLTEuOTYsLTAuMDZsLTAuODYsLTEuMjNsLTAuMjIsLTAuMTNsLTEuMjMsLTAuMTFsMC4zNCwtMC42OWwtMC4wNSwtMC4zM2wtMS4zNiwtMS41bC0wLjkyLC0yLjBsMC40NSwtMC4zMmwwLjEzLC0wLjI1bC0wLjAsLTAuODdsMS4zNCwtMC42NGwwLjE3LC0wLjMybC0wLjIzLC0xLjIzbDAuNTYsLTAuNzdsMC4wNSwtMC4xM2wwLjE2LC0xLjAzbDIuNywtMS42MWwyLjAxLC0wLjQ3bDAuMTYsLTAuMDlsMC4yNCwtMC4yN2wyLjExLDAuMTFsMC4zMSwtMC4yNWwxLjEzLC02Ljg3bDAuMDYsLTEuMTJsLTAuNCwtMS41M2wtMC4xLC0wLjE1bC0xLjAsLTAuODJsMC4wMSwtMS40NWwxLjA4LC0wLjMybDAuMzksMC4ybDAuNDQsLTAuMjRsMC4wOCwtMC45NmwtMC4yNSwtMC4zMmwtMS4yMiwtMC4yMmwtMC4wMiwtMS4wMWw0LjU3LDAuMDVsMC4yMiwtMC4wOWwwLjYsLTAuNjNsMC40NCwwLjVsMC40NywxLjQybDAuNDUsMC4xNmwwLjI3LC0wLjE4bDEuMjEsMS4xNmwwLjIzLDAuMDhsMS45NSwtMC4xNmwwLjIzLC0wLjE0bDAuNDMsLTAuNjdsMS43NiwtMC41NWwxLjA1LC0wLjQybDAuMTgsLTAuMmwwLjI1LC0wLjkybDEuNjUsLTAuNjZsMC4xOCwtMC4zNWwtMC4xNCwtMC41M2wtMC4yNiwtMC4yMmwtMS45MSwtMC4xOWwtMC4yOSwtMS4zM2wwLjEsLTEuNjRsLTAuMTUsLTAuMjhsLTAuNDQsLTAuMjVaXCIsIFwibmFtZVwiOiBcIkJyYXppbFwifSwgXCJCU1wiOiB7XCJwYXRoXCI6IFwiTTIyNy41MSwyMTYuNjlsMC4zLDAuMThsLTAuMjQsMS4wN2wwLjAzLC0xLjA0bC0wLjA5LC0wLjIxWk0yMjYuNSwyMjQuMDNsLTAuMTMsMC4wM2wtMC41NCwtMS4zbC0wLjA5LC0wLjEybC0wLjc4LC0wLjY0bDAuNCwtMS4yNmwwLjMzLDAuMDVsMC43OSwyLjBsMC4wMSwxLjI0Wk0yMjUuNzYsMjE2LjVsLTIuMTYsMC4zNGwtMC4wNywtMC40MWwwLjg1LC0wLjE2bDEuMzYsMC4wN2wwLjAyLDAuMTZaXCIsIFwibmFtZVwiOiBcIlRoZSBCYWhhbWFzXCJ9LCBcIkJZXCI6IHtcInBhdGhcIjogXCJNNDgwLjA4LDEzNS4yOGwyLjA5LDAuMDJsMC4xMywtMC4wM2wyLjcyLC0xLjNsMC4xNiwtMC4xOWwwLjU1LC0xLjgzbDEuOTQsLTEuMDZsMC4xNSwtMC4zMWwtMC4yLC0xLjMzbDEuMzMsLTAuNTJsMi41OCwtMS4zbDIuMzksMC44bDAuMywwLjc1bDAuMzcsMC4xN2wxLjIyLC0wLjM5bDIuMTgsMC43NWwwLjIsMS4zNmwtMC40OCwwLjg1bDAuMDEsMC4zMmwxLjU3LDIuMjZsMC45MiwwLjZsLTAuMSwwLjQxbDAuMTksMC4zNWwxLjYxLDAuNTdsMC40OCwwLjZsLTAuNjQsMC40OWwtMS45MSwtMC4xMWwtMC4xOCwwLjA1bC0wLjQ4LDAuMzJsLTAuMSwwLjM5bDAuNTcsMS4xbDAuNTEsMS43OGwtMS43OSwwLjE3bC0wLjE4LDAuMDhsLTAuNzcsMC43M2wtMC4wOSwwLjE5bC0wLjEzLDEuMzFsLTAuNzUsLTAuMjJsLTIuMTEsMC4xNWwtMC41NiwtMC42NmwtMC4zOSwtMC4wNmwtMC44LDAuNDlsLTAuNzksLTAuNGwtMC4xMywtMC4wM2wtMS45NCwtMC4wN2wtMi43NiwtMC43OWwtMi41OCwtMC4yN2wtMS45OCwwLjA3bC0wLjE1LDAuMDVsLTEuMzEsMC44NmwtMC44LDAuMDlsLTAuMDQsLTEuMTZsLTAuMDMsLTAuMTJsLTAuNjMsLTEuMjhsMS4yMiwtMC41NmwwLjE3LC0wLjI3bDAuMDEsLTEuMzVsLTAuMDQsLTAuMTVsLTAuNjYsLTEuMjRsLTAuMDgsLTEuMTJaXCIsIFwibmFtZVwiOiBcIkJlbGFydXNcIn0sIFwiQlpcIjoge1wicGF0aFwiOiBcIk0xOTguMDMsMjM5LjdsMC4yOCwwLjE5bDAuNDMsLTAuMWwwLjgyLC0xLjQybDAuMCwwLjA3bDAuMjksMC4yOWwwLjE2LDAuMGwtMC4wMiwwLjM1bC0wLjM5LDEuMDhsMC4wMiwwLjI1bDAuMTYsMC4yOWwtMC4yMywwLjhsMC4wNCwwLjI0bDAuMDksMC4xNGwtMC4yNSwxLjEybC0wLjM4LDAuNTNsLTAuMzMsMC4wNmwtMC4yMSwwLjE1bC0wLjQxLDAuNzRsLTAuMjUsMC4wbDAuMTcsLTIuNThsMC4wMSwtMi4yWlwiLCBcIm5hbWVcIjogXCJCZWxpemVcIn0sIFwiUlVcIjoge1wicGF0aFwiOiBcIk02ODguNTcsMzguODVsMC42MywyLjM5bDAuNDQsMC4xOWwyLjIyLC0xLjIzbDcuMTgsMC4wN2w1LjU0LDIuNDlsMS44NSwxLjc3bC0wLjU1LDIuMzRsLTIuNjQsMS40MmwtNi41NywyLjc2bC0xLjk1LDEuNWwwLjEyLDAuNTNsMy4wOSwwLjY4bDMuNjksMS4yM2wwLjIxLC0wLjAxbDEuOTgsLTAuODFsMS4xNiwyLjg0bDAuNSwwLjA4bDEuMDMsLTEuMThsMy44NiwtMC43NGw3Ljc5LDAuNzhsMC41NiwyLjA1bDAuMjcsMC4yMmwxMC40NywwLjcxbDAuMzIsLTAuMjlsMC4xMywtMy4zNGw0Ljk4LDAuOGwzLjk2LC0wLjAybDMuODgsMi40M2wxLjA2LDIuNzlsLTEuMzgsMS44M2wwLjAxLDAuMzhsMy4xNSwzLjY0bDAuMSwwLjA4bDMuOTQsMS44NmwwLjQsLTAuMTRsMi4yOCwtNC41NmwzLjc1LDEuOTRsMC4yMiwwLjAybDQuMTgsLTEuMjJsNC43NiwxLjRsMC4yNiwtMC4wNGwxLjc0LC0xLjIzbDMuOTgsMC42M2wwLjMyLC0wLjQxbC0xLjcxLC00LjFsMy4wLC0xLjg2bDIyLjM5LDMuMDRsMi4wNiwyLjY3bDAuMSwwLjA4bDYuNTUsMy41MWwwLjE3LDAuMDNsMTAuMDgsLTAuODZsNC44NiwwLjczbDEuOTEsMS43MmwtMC4yOSwzLjEzbDAuMTgsMC4zMWwzLjA4LDEuMjZsMC4xOSwwLjAxbDMuMzIsLTAuOWw0LjM3LC0wLjExbDQuNzgsMC44N2w0LjYxLC0wLjQ4bDQuMjYsMy44MmwwLjMyLDAuMDVsMy4xLC0xLjRsMC4xMiwtMC40NWwtMS45MSwtMi42N2wwLjkyLC0xLjY0bDcuNzgsMS4yMmw1LjIyLC0wLjI2bDcuMTIsMi4xbDkuNiw1LjIybDYuNCw0LjE1bC0wLjIsMi40NGwwLjE0LDAuMjhsMS42OSwxLjA0bDAuNDUsLTAuMzFsLTAuNTEsLTIuNjZsNi4zMSwwLjU4bDQuNTIsMy42MWwtMi4xLDEuNTJsLTQuMDIsMC40MmwtMC4yNywwLjI5bC0wLjA2LDMuODNsLTAuODEsMC42N2wtMi4xNCwtMC4xMWwtMS45MSwtMS4zOWwtMy4xOSwtMS4xM2wtMC41MSwtMS42M2wtMC4yMSwtMC4ybC0yLjU0LC0wLjY3bC0wLjEzLC0wLjBsLTIuNjksMC41bC0xLjEyLC0xLjE5bDAuNDgsLTEuMzZsLTAuMzgsLTAuMzlsLTMuMCwwLjk4bC0wLjE3LDAuNDRsMS4wMiwxLjc2bC0xLjI3LDEuNTVsLTMuMDksMS43MWwtMy4xNSwtMC4yOWwtMC4zLDAuMThsMC4wNywwLjM0bDIuMjIsMi4xbDEuNDcsMy4yMmwxLjE1LDEuMDlsMC4yNSwxLjQxbC0wLjQ4LDAuNzZsLTQuNDcsLTAuODFsLTAuMTcsMC4wMmwtNi45NywyLjlsLTIuMiwwLjQ0bC0wLjExLDAuMDVsLTMuODMsMi42OGwtMy42MywyLjMybC0wLjEsMC4xMWwtMC43NiwxLjRsLTMuMywtMi40bC0wLjMsLTAuMDNsLTYuMzEsMi44NWwtMC45OSwtMS4yMWwtMC40LC0wLjA2bC0yLjMyLDEuNTRsLTMuMjMsLTAuNDlsLTAuMzMsMC4ybC0wLjc5LDIuMzlsLTIuOTcsMy41MWwtMC4wNywwLjIxbDAuMDksMS40N2wwLjIyLDAuMjdsMi42MiwwLjc0bC0wLjMsNC43bC0yLjA2LDAuMTJsLTAuMjYsMC4ybC0xLjA3LDIuOTRsMC4wNCwwLjI3bDAuODMsMS4xOWwtNC4wMywxLjYzbC0wLjE4LDAuMjFsLTAuODMsMy43MmwtMy41NSwwLjc5bC0wLjIzLDAuMjNsLTAuNzMsMy4zMmwtMy4yMiwyLjc2bC0wLjc2LC0xLjg4bC0xLjA3LC00Ljg4bC0xLjM5LC03LjU5bDEuMTcsLTQuNzZsMi4wNSwtMi4wOGwwLjA5LC0wLjE5bDAuMTEsLTEuNDZsMy42NywtMC43N2wwLjE1LC0wLjA4bDQuNDcsLTQuNjFsNC4yOSwtMy44Mmw0LjQ4LC0zLjAxbDAuMTEsLTAuMTRsMi4wMSwtNS40M2wtMC4zMSwtMC40bC0zLjA0LDAuMzNsLTAuMjQsMC4xN2wtMS40NywzLjExbC01Ljk4LDMuOTRsLTEuOTEsLTQuMzZsLTAuMzMsLTAuMTdsLTYuNDYsMS4zbC0wLjE1LDAuMDhsLTYuMjcsNi4zM2wtMC4wMSwwLjQxbDEuNywxLjg3bC01LjA0LDAuODdsLTMuNTEsMC4zNGwwLjE2LC0yLjMybC0wLjI2LC0wLjMybC0zLjg5LC0wLjU2bC0wLjE5LDAuMDRsLTMuMDIsMS43N2wtNy42MywtMC42M2wtOC4yNCwxLjFsLTAuMTYsMC4wN2wtOC4xMSw3LjA5bC05LjYsOC4zMWwwLjE2LDAuNTJsMy43OSwwLjQybDEuMTYsMi4wM2wwLjE3LDAuMTRsMi40MywwLjc2bDAuMzEsLTAuMDhsMS41LC0xLjYxbDIuNDksMC4ybDMuNDYsMy42bDAuMDgsMi42N2wtMS45MSwzLjI2bC0wLjA0LDAuMTRsLTAuMjEsMy45MWwtMS4xMSw1LjA5bC0zLjczLDQuNTVsLTAuODcsMi4yMWwtNi43Myw3LjE0bC0xLjU5LDEuNzdsLTMuMjMsMS43MmwtMS4zOCwwLjAzbC0xLjQ4LC0xLjM5bC0wLjM3LC0wLjAzbC0zLjM2LDIuMjJsLTAuMTEsMC4xNGwtMC4xNiwwLjQybC0wLjAxLC0xLjA5bDEuMCwtMC4wNmwwLjI4LC0wLjI3bDAuMzYsLTMuNmwtMC42MSwtMi41MWwxLjg1LC0wLjk0bDIuOTQsMC41M2wwLjMyLC0wLjE1bDEuNzEsLTMuMWwwLjg0LC0zLjM4bDAuOTcsLTEuMThsMS4zMiwtMi44OGwtMC4zNCwtMC40MmwtNC4xNCwwLjk1bC0yLjE4LDEuMjVsLTMuNTEsLTAuMGwtMC45NSwtMi44MWwtMC4xLC0wLjE0bC0yLjk3LC0yLjNsLTAuMTEsLTAuMDVsLTQuMTksLTEuMGwtMC44OSwtMy4wOGwtMC44NywtMi4wM2wtMC45NSwtMS40NmwtMS41NCwtMy4zN2wtMC4xMiwtMC4xNGwtMi4yNywtMS4yOGwtMy44MywtMS4wMmwtMy4zNywwLjFsLTMuMTEsMC42MWwtMC4xMywwLjA2bC0yLjA3LDEuNjlsMC4wNCwwLjQ5bDEuMjMsMC43MmwwLjAzLDEuNTNsLTEuMzQsMS4wNWwtMi4yNiwzLjUxbC0wLjA1LDAuMTdsMC4wMiwxLjI3bC0zLjI1LDEuOWwtMi44NywtMS4xN2wtMC4xNCwtMC4wMmwtMi44NiwwLjI2bC0xLjIyLC0xLjAybC0wLjEyLC0wLjA2bC0xLjUsLTAuMzVsLTAuMjMsMC4wNGwtMy42MiwyLjI3bC0zLjI0LDAuNTNsLTIuMjgsMC43OWwtMy4wOCwtMC41MWwtMi4yNCwwLjAzbC0xLjQ5LC0xLjYxbC0yLjQ1LC0xLjU3bC0wLjExLC0wLjA0bC0yLjYsLTAuNDNsLTMuMTcsMC40M2wtMi4zMSwwLjU5bC0zLjMxLC0xLjI4bC0wLjQ1LC0yLjMxbC0wLjIxLC0wLjIzbC0yLjk0LC0wLjg1bC0yLjI2LC0wLjM5bC0yLjc3LC0xLjM2bC0wLjM3LDAuMDlsLTIuNTksMy40NWwtMC4wMywwLjMybDAuOTEsMS43NGwtMi4xNSwyLjAxbC0zLjQ3LC0wLjc5bC0yLjQ0LC0wLjEybC0xLjU5LC0xLjQ2bC0wLjIsLTAuMDhsLTIuNTUsLTAuMDVsLTIuMTIsLTAuOThsLTAuMjQsLTAuMDFsLTMuODUsMS41N2wtNC43NCwyLjc5bC0yLjU5LDAuNTVsLTAuNzksMC4yMWwtMS4yMSwtMS44MWwtMC4yOSwtMC4xM2wtMy4wNSwwLjQxbC0wLjk2LC0xLjI1bC0wLjE0LC0wLjFsLTEuNjUsLTAuNmwtMS4xNSwtMS44MmwtMC4xMywtMC4xMmwtMS4zOCwtMC42bC0wLjE5LC0wLjAybC0zLjQ5LDAuODJsLTMuMzUsLTEuODVsLTAuMzgsMC4wOGwtMS4wOCwxLjRsLTUuMzYsLTguMTdsLTMuMDIsLTIuNTJsMC43MiwtMC44NWwwLjAxLC0wLjM4bC0wLjM3LC0wLjA4bC02LjIyLDMuMjFsLTEuOTgsMC4xNmwwLjE3LC0xLjUxbC0wLjIsLTAuMzFsLTMuMjIsLTEuMTdsLTAuMTksLTAuMGwtMi4zLDAuNzRsLTAuNzIsLTMuMjdsLTAuMjQsLTAuMjNsLTQuNSwtMC43NWwtMC4yMSwwLjA0bC0yLjIsMS40MmwtNi4yMSwxLjI3bC0wLjExLDAuMDVsLTEuMTYsMC44MWwtOS4zLDEuMTlsLTAuMTgsMC4wOWwtMS4xNSwxLjE3bC0wLjAyLDAuMzlsMS41NiwyLjAxbC0yLjAyLDAuNzRsLTAuMTYsMC40MmwwLjM1LDAuNjhsLTIuMTgsMS40OWwwLjAyLDAuNTFsMy44MywyLjE2bC0wLjQ1LDEuMTNsLTMuMzEsLTAuMTNsLTAuMjUsMC4xMmwtMC41NywwLjc3bC0yLjk3LC0xLjU5bC0wLjE1LC0wLjA0bC0zLjk3LDAuMDdsLTAuMTMsMC4wM2wtMi41MywxLjMybC0yLjg0LC0xLjI4bC01LjUyLC0yLjNsLTAuMTIsLTAuMDJsLTMuOTEsMC4wOWwtMC4xNiwwLjA1bC01LjE3LDMuNmwtMC4xMywwLjIxbC0wLjI1LDEuODlsLTIuMTcsLTEuNmwtMC40NCwwLjFsLTIuMCwzLjU5bDAuMDYsMC4zN2wwLjU1LDAuNWwtMS4zMiwyLjIzbDAuMDQsMC4zNmwyLjEzLDIuMTdsMC4yMywwLjA5bDEuNywtMC4wOGwxLjQyLDEuODlsLTAuMjMsMS41bDAuMTksMC4zMmwwLjk0LDAuMzhsLTAuODksMS40NGwtMi4zLDAuNDlsLTAuMTcsMC4xMWwtMi40OSwzLjJsMC4wLDAuMzdsMi4yLDIuODFsLTAuMjMsMS45M2wwLjA2LDAuMjJsMi41NiwzLjMybC0xLjI3LDEuMDJsLTAuNCwwLjY2bC0wLjgsLTAuMTVsLTEuNjUsLTEuNzVsLTAuMTgsLTAuMDlsLTAuNjYsLTAuMDlsLTEuNDUsLTAuNjRsLTAuNzIsLTEuMTZsLTAuMTgsLTAuMTNsLTIuMzQsLTAuNjNsLTAuMTcsMC4wbC0xLjMyLDAuNDFsLTAuMzEsLTAuNGwtMC4xMiwtMC4wOWwtMy40OSwtMS40OGwtMy42NywtMC40OWwtMi4xLC0wLjUybC0wLjMsMC4xbC0wLjEyLDAuMTRsLTIuOTYsLTIuNGwtMi44OSwtMS4xOWwtMS42OSwtMS40MmwxLjI3LC0wLjM1bDAuMTYsLTAuMWwyLjA4LC0yLjYxbC0wLjA0LC0wLjQxbC0xLjAyLC0wLjlsMy4yMSwtMS4xMmwwLjIsLTAuMzFsLTAuMDcsLTAuNjlsLTAuMzcsLTAuMjZsLTEuODYsMC40MmwwLjA1LC0wLjg2bDEuMTEsLTAuNzZsMi4zNSwtMC4yM2wwLjI1LC0wLjE5bDAuMzksLTEuMDdsMC4wLC0wLjE5bC0wLjUxLC0xLjY0bDAuOTUsLTEuNThsMC4wNCwtMC4xNmwtMC4wMywtMC45NWwtMC4yMiwtMC4yOGwtMy42OSwtMS4wNmwtMS40MywwLjAybC0xLjQ1LC0xLjQ0bC0wLjI5LC0wLjA4bC0xLjgzLDAuNDlsLTIuODgsLTEuMDRsMC4wNCwtMC40MmwtMC4wNCwtMC4xOGwtMC44OSwtMS40M2wtMC4yMywtMC4xNGwtMS43NywtMC4xNGwtMC4xMywtMC42NmwwLjUyLC0wLjU2bDAuMDEsLTAuNGwtMS42LC0xLjlsLTAuMjcsLTAuMWwtMi41NSwwLjMybC0wLjcxLC0wLjE2bC0wLjMsMC4xbC0wLjUzLDAuNjNsLTAuNTgsLTAuMDhsLTAuNTYsLTEuOTdsLTAuNDgsLTAuOTRsMC4xNywtMC4xMWwxLjkyLDAuMTFsMC4yLC0wLjA2bDAuOTcsLTAuNzRsMC4wNSwtMC40MmwtMC43MiwtMC45MWwtMC4xMywtMC4xbC0xLjQzLC0wLjUxbDAuMDksLTAuMzZsLTAuMTMsLTAuMzNsLTAuOTcsLTAuNTlsLTEuNDMsLTIuMDZsMC40NCwtMC43N2wwLjA0LC0wLjE5bC0wLjI1LC0xLjY0bC0wLjIsLTAuMjRsLTIuNDUsLTAuODRsLTAuMTksLTAuMGwtMS4wNSwwLjM0bC0wLjI1LC0wLjYybC0wLjE4LC0wLjE3bC0yLjUsLTAuODRsLTAuNzQsLTEuOTNsLTAuMjEsLTEuN2wtMC4xMywtMC4yMWwtMC45MiwtMC42M2wwLjgzLC0wLjg5bDAuMDcsLTAuMjdsLTAuNzEsLTMuMjZsMS42OSwtMi4wMWwwLjAzLC0wLjM0bC0wLjI0LC0wLjQxbDIuNjMsLTEuOWwtMC4wMSwtMC40OWwtMi4zMSwtMS41N2w1LjA4LC00LjYxbDIuMzMsLTIuMjRsMS4wMSwtMi4wOGwtMC4wOSwtMC4zN2wtMy41MiwtMi41NmwwLjk0LC0yLjM4bC0wLjA0LC0wLjI5bC0yLjE0LC0yLjg2bDEuNjEsLTMuMzVsLTAuMDEsLTAuMjlsLTIuODEsLTQuNThsMi4xOSwtMy4wNGwtMC4wNiwtMC40MmwtMy43LC0yLjc2bDAuMzIsLTIuNjdsMS44NywtMC4zOGw0LjI2LC0xLjc3bDIuNDYsLTEuNDdsMy45NiwyLjU4bDAuMTIsMC4wNWw2LjgxLDEuMDRsOS4zNyw0Ljg3bDEuODEsMS45MmwwLjE1LDIuNTVsLTIuNjEsMi4wNmwtMy45NSwxLjA3bC0xMS4xLC0zLjE1bC0wLjE3LDAuMGwtMS44NCwwLjUzbC0wLjEsMC41M2wzLjk3LDIuOTdsMC4xNSwxLjc3bDAuMTYsNC4xNGwwLjE5LDAuMjdsMy4yMSwxLjIybDEuOTQsMS4wM2wwLjQ0LC0wLjIybDAuMzIsLTEuOTRsLTAuMDcsLTAuMjVsLTEuMzIsLTEuNTJsMS4yNSwtMS4ybDUuODcsMi40NWwwLjI0LC0wLjAxbDIuMTEsLTAuOThsMC4xMywtMC40MmwtMS41NSwtMi43NWw1LjUyLC0zLjg0bDIuMTMsMC4yMmwyLjI4LDEuNDJsMC40MywtMC4xMmwxLjQ2LC0yLjg3bC0wLjA0LC0wLjMzbC0xLjk3LC0yLjM3bDEuMTQsLTIuMzhsLTAuMDIsLTAuM2wtMS40MiwtMi4wN2w2LjE1LDEuMjJsMS4xNCwxLjkybC0yLjc0LDAuNDZsLTAuMjUsMC4zbDAuMDIsMi4zNmwwLjEyLDAuMjRsMS45NywxLjQ0bDAuMjUsMC4wNWwzLjg3LC0wLjkxbDAuMjIsLTAuMjNsMC41OCwtMi41NWw1LjA5LC0xLjk4bDguNjcsLTMuNjlsMS4yMiwwLjE0bC0yLjA2LDIuMmwwLjE4LDAuNWwzLjExLDAuNDVsMC4yMywtMC4wN2wxLjcxLC0xLjQxbDQuNTksLTAuMTJsMC4xMiwtMC4wM2wzLjUzLC0xLjcybDIuNywyLjQ4bDAuNDIsLTAuMDFsMi44NSwtMi44OGwtMC4wLC0wLjQzbC0yLjQyLC0yLjM1bDEuMCwtMS4xM2w3LjIsMS4zMWwzLjQyLDEuMzZsOS4wNiw0Ljk3bDAuMzksLTAuMDhsMS42NywtMi4yN2wtMC4wNCwtMC40bC0yLjQ2LC0yLjIzbC0wLjA2LC0wLjgybC0wLjI2LC0wLjI3bC0yLjY0LC0wLjM4bDAuNjksLTEuNzZsMC4wLC0wLjIybC0xLjMyLC0zLjQ3bC0wLjA3LC0xLjI3bDQuNTIsLTQuMDlsMC4wOCwtMC4xMWwxLjYsLTQuMThsMS42NywtMC44NGw2LjMzLDEuMmwwLjQ2LDIuMzFsLTIuMzEsMy42N2wwLjA1LDAuMzhsMS40OSwxLjQxbDAuNzcsMy4wNGwtMC41Niw2LjA1bDAuMDksMC4yNGwyLjYyLDIuNTRsLTAuOTksMi42NWwtNC44Nyw1Ljk2bDAuMTcsMC40OGwyLjg2LDAuNjFsMC4zMSwtMC4xM2wwLjk0LC0xLjQybDIuNjcsLTEuMDRsMC4xOCwtMC4xOWwwLjY0LC0yLjAxbDIuMTEsLTEuOThsMC4wNSwtMC4zN2wtMS4zOCwtMi4zMmwxLjExLC0yLjc0bC0wLjI0LC0wLjQxbC0yLjUzLC0wLjMzbC0wLjUzLC0yLjE2bDEuOTYsLTQuNDJsLTAuMDUsLTAuMzJsLTMuMDMsLTMuNDhsNC4yMSwtMi45NGwwLjEyLC0wLjNsLTAuNTIsLTMuMDRsMC43MiwtMC4wNmwxLjE4LDIuMzVsLTAuOTcsNC4zOWwwLjIsMC4zNWwyLjY4LDAuODRsMC4zNywtMC4zOGwtMS4wNSwtMy4wN2wzLjg5LC0xLjcxbDUuMDUsLTAuMjRsNC41NSwyLjYybDAuMzYsLTAuMDVsMC4wNSwtMC4zNmwtMi4xOSwtMy44NGwtMC4yMywtNC43OGw0LjA3LC0wLjkybDUuOTgsMC4yMWw1LjQ3LC0wLjY0bDAuMiwtMC40OGwtMS44OCwtMi4zN2wyLjY1LC0yLjk5bDIuNzUsLTAuMTNsMC4xMiwtMC4wM2w0LjgyLC0yLjQ4bDYuNTYsLTAuNjdsMC4yMywtMC4xNGwwLjc2LC0xLjI3bDYuMzMsLTAuNDZsMS45NywxLjExbDAuMjgsMC4wMWw1LjU1LC0yLjcxbDQuNTMsMC4wOGwwLjI5LC0wLjIxbDAuNjcsLTIuMThsMi4yOSwtMi4xNWw1Ljc1LC0yLjEzbDMuNDgsMS40bC0yLjcsMS4wM2wtMC4xOSwwLjMxbDAuMjYsMC4yNmw1LjQ3LDAuNzhaTTg3MS44Myw2NS43M2wwLjI1LC0wLjE1bDEuOTksMC4wMWwzLjMsMS4ybC0wLjA4LDAuMjJsLTIuNDEsMS4wM2wtNS43MywwLjQ5bC0wLjMxLC0xLjBsMi45OSwtMS44Wk03OTcuNjQsNDguNDRsLTIuMjIsMS41MWwtMy44NSwtMC40M2wtNC4zNSwtMS44NWwwLjQyLC0xLjEzbDQuNDIsMC43Mmw1LjU5LDEuMTdaTTc4My44Miw0Ni4wNmwtMS43MSwzLjI1bC05LjA1LC0wLjE0bC00LjExLDEuMTVsLTQuNjQsLTMuMDRsMS4yMSwtMy4xM2wzLjExLC0wLjkxbDYuNTMsMC4yMmw4LjY2LDIuNTlaTTc4MC4zNywxNDUuNzFsMi4yOCw1LjIzbC0zLjA5LC0wLjg5bC0wLjM3LDAuMTlsLTEuNTQsNC42NWwwLjA0LDAuMjdsMi4zOCwzLjE3bC0wLjA1LDEuNGwtMS40MSwtMS40MWwtMC40NiwwLjA0bC0xLjIzLDEuODFsLTAuMzMsLTEuODZsMC4yOCwtMy4xbC0wLjI4LC0zLjQxbDAuNTgsLTIuNDZsMC4xMSwtNC4zOWwtMC4wMywtMC4xM2wtMS40NCwtMy4ybDAuMjEsLTQuMzlsMi4xOSwtMS40OWwwLjA5LC0wLjQxbC0wLjgxLC0xLjNsMC40OCwtMC4yMWwwLjU2LDEuOTRsMC44NiwzLjIzbC0wLjA1LDMuMzZsMS4wMywzLjM1Wk03ODAuMTYsNTcuMThsLTMuNCwwLjAzbC01LjA2LC0wLjUzbDEuOTcsLTEuNTlsMi45NSwtMC40MmwzLjM1LDEuNzVsMC4xOCwwLjc3Wk02ODMuODQsMzEuMThsLTEzLjI5LDEuOTdsNC4xNiwtNi41NmwxLjg4LC0wLjU4bDEuNzcsMC4zNGw2LjA4LDMuMDJsLTAuNiwxLjhaTTY3MC45NCwyOC4wMmwtNS4xOCwwLjY1bC02Ljg5LC0xLjU4bC00LjAzLC0yLjA3bC0xLjg4LC0zLjk4bC0wLjE4LC0wLjE2bC0yLjgsLTAuOTNsNS45MSwtMy42Mmw1LjI1LC0xLjI5bDQuNzMsMi44OGw1LjYzLDUuNDRsLTAuNTcsNC42NlpNNTY0LjM3LDY4Ljk4bC0wLjg1LDAuMjNsLTcuOTMsLTAuNTdsLTAuNiwtMS44NGwtMC4yMSwtMC4ybC00LjM0LC0xLjE4bC0wLjMsLTIuMDhsMi4zNCwtMC45MmwwLjE5LC0wLjI5bC0wLjA4LC0yLjQzbDQuODUsLTQuMGwtMC4xMiwtMC41MmwtMS42OCwtMC40M2w1LjQ3LC0zLjk0bDAuMTEsLTAuMzNsLTAuNiwtMi4wMmw1LjM2LC0yLjU1bDguMjIsLTMuMjdsOC4yOSwtMC45Nmw0LjM0LC0xLjk0bDQuNjcsLTAuNjVsMS40NSwxLjcybC0xLjQzLDEuMzdsLTguOCwyLjUybC03LjY1LDIuNDJsLTcuOTIsNC44NGwtMy43Myw0Ljc1bC0zLjkyLDQuNThsLTAuMDcsMC4yM2wwLjUxLDMuODhsMC4xMSwwLjJsNC4zMiwzLjM5Wk01NDguODYsMTguNTdsLTMuMjgsMC43NWwtMi4yNSwwLjQ0bC0wLjIyLDAuMTlsLTAuMywwLjgxbC0yLjY3LDAuODZsLTIuMjcsLTEuMTRsMS4yLC0xLjUxbC0wLjIzLC0wLjQ5bC0zLjE0LC0wLjFsMi40OCwtMC41NGwzLjU1LC0wLjA3bDAuNDQsMS4zNmwwLjQ5LDAuMTJsMS40LC0xLjM1bDIuMiwtMC45bDMuMTMsMS4wOGwtMC41NCwwLjQ5Wk00NzcuNSwxMzMuMjVsLTQuMjEsMC4wNWwtMi42OSwtMC4zNGwwLjM5LC0xLjAzbDMuMjQsLTEuMDZsMi41MSwwLjU4bDAuODUsMC40M2wtMC4yLDAuNzFsLTAuMCwwLjE1bDAuMTIsMC41MlpcIiwgXCJuYW1lXCI6IFwiUnVzc2lhXCJ9LCBcIlJXXCI6IHtcInBhdGhcIjogXCJNNDk3LjAzLDI4OC4xMmwwLjc4LDEuMTFsLTAuMTIsMS4xOWwtMC40OSwwLjIxbC0xLjI1LC0wLjE1bC0wLjMsMC4xNmwtMC42NywxLjI0bC0xLjAxLC0wLjEzbDAuMTYsLTAuOTJsMC4yMiwtMC4xMmwwLjE1LC0wLjI0bDAuMDksLTEuMzdsMC40OSwtMC40OGwwLjQyLDAuMThsMC4yNSwtMC4wMWwxLjI2LC0wLjY1WlwiLCBcIm5hbWVcIjogXCJSd2FuZGFcIn0sIFwiUlNcIjoge1wicGF0aFwiOiBcIk00NjkuNzUsMTY4LjY1bDAuMjEsLTAuMjFsMC4zNiwtMS40NGwtMC4wOCwtMC4yOWwtMS4wNiwtMS4wM2wwLjU0LC0xLjE2bC0wLjI4LC0wLjQzbC0wLjI2LDAuMGwwLjU1LC0wLjY3bC0wLjAxLC0wLjM5bC0wLjc3LC0wLjg2bC0wLjQ1LC0wLjg5bDEuNTYsLTAuNjdsMS4zOSwwLjEybDEuMjIsMS4xbDAuMjYsMC45MWwwLjE2LDAuMTlsMS4zOCwwLjY2bDAuMTcsMS4xMmwwLjE0LDAuMjFsMS40NiwwLjlsMC4zNSwtMC4wM2wwLjYyLC0wLjU0bDAuMDksMC4wNmwtMC4yOCwwLjI1bC0wLjAzLDAuNDJsMC4yOSwwLjM0bC0wLjQ0LDAuNWwtMC4wNywwLjI2bDAuMjIsMS4xMmwwLjA3LDAuMTRsMS4wMiwxLjFsLTAuODEsMC44NGwtMC40MiwwLjk2bDAuMDQsMC4zbDAuMTIsMC4xNWwtMC4xNSwwLjE2bC0xLjA0LDAuMDRsLTAuMzksMC4wOGwwLjMzLC0wLjgxbC0wLjI5LC0wLjQxbC0wLjIxLDAuMDFsLTAuMzksLTAuNDVsLTAuMTMsLTAuMDlsLTAuMzIsLTAuMTFsLTAuMjcsLTAuNGwtMC4xNCwtMC4xMWwtMC40LC0wLjE2bC0wLjMxLC0wLjM3bC0wLjM0LC0wLjA5bC0wLjQ1LDAuMTdsLTAuMTgsMC4xOGwtMC4yOSwwLjg0bC0wLjk2LC0wLjY1bC0wLjgxLC0wLjMzbC0wLjMyLC0wLjM3bC0wLjIyLC0wLjE4WlwiLCBcIm5hbWVcIjogXCJSZXB1YmxpYyBvZiBTZXJiaWFcIn0sIFwiTFRcIjoge1wicGF0aFwiOiBcIk00NzguMTMsMTMzLjMxbC0wLjE0LC0wLjYzbDAuMjUsLTAuODhsLTAuMTUsLTAuMzVsLTEuMTcsLTAuNThsLTIuNDMsLTAuNTdsLTAuNDUsLTIuNTFsMi41OCwtMC45N2w0LjE0LDAuMjJsMi4zLC0wLjMybDAuMjYsMC41NGwwLjIyLDAuMTdsMS4yNiwwLjIybDIuMjUsMS42bDAuMTksMS4yM2wtMS44NywxLjAxbC0wLjE0LDAuMThsLTAuNTQsMS44M2wtMi41NCwxLjIxbC0yLjE4LC0wLjAybC0wLjUyLC0wLjkxbC0wLjE4LC0wLjE0bC0xLjExLC0wLjMyWlwiLCBcIm5hbWVcIjogXCJMaXRodWFuaWFcIn0sIFwiTFVcIjoge1wicGF0aFwiOiBcIk00MzUuOTUsMTQ3Ljk5bDAuMzMsMC40OWwtMC4xMSwxLjA3bC0wLjM5LDAuMDRsLTAuMjksLTAuMTVsMC4yMSwtMS40bDAuMjUsLTAuMDVaXCIsIFwibmFtZVwiOiBcIkx1eGVtYm91cmdcIn0sIFwiTFJcIjoge1wicGF0aFwiOiBcIk00MDEuMzcsMjczLjY3bC0wLjMyLDAuMDFsLTIuNDgsLTEuMTVsLTIuMjQsLTEuODlsLTIuMTQsLTEuMzhsLTEuNDcsLTEuNDJsMC40NCwtMC41OWwwLjA1LC0wLjEzbDAuMTIsLTAuNjVsMS4wNywtMS4zbDEuMDgsLTEuMDlsMC41MiwtMC4wN2wwLjQzLC0wLjE4bDAuODQsMS4yNGwtMC4xNSwwLjg5bDAuMDcsMC4yNWwwLjQ5LDAuNTRsMC4yMiwwLjFsMC43MSwwLjAxbDAuMjcsLTAuMTZsMC40MiwtMC44M2wwLjE5LDAuMDJsLTAuMDYsMC41MmwwLjIzLDEuMTJsLTAuNSwxLjAzbDAuMDYsMC4zNWwwLjczLDAuNjlsMC4xNCwwLjA4bDAuNzEsMC4xNWwwLjkyLDAuOTFsMC4wNiwwLjc2bC0wLjE3LDAuMjJsLTAuMDYsMC4xNWwtMC4xNywxLjhaXCIsIFwibmFtZVwiOiBcIkxpYmVyaWFcIn0sIFwiUk9cIjoge1wicGF0aFwiOiBcIk00NzcuOTQsMTU1LjE5bDEuMDIsLTAuNjRsMS40OSwwLjMzbDEuNTIsMC4wMWwxLjA5LDAuNzNsMC4zMiwwLjAxbDAuODEsLTAuNDZsMS44LC0wLjNsMC4xOCwtMC4xbDAuNTQsLTAuNjRsMC44NiwwLjBsMC42NCwwLjI2bDAuNzEsMC44N2wwLjgsMS4zNWwxLjM5LDEuODFsMC4wNywxLjI1bC0wLjI2LDEuM2wwLjAxLDAuMTVsMC40NSwxLjQybDAuMTUsMC4xOGwxLjEyLDAuNTdsMC4yNSwwLjAxbDEuMDUsLTAuNDVsMC44NiwwLjRsMC4wMywwLjQzbC0wLjkyLDAuNTFsLTAuNjMsLTAuMjRsLTAuNCwwLjIybC0wLjY0LDMuNDFsLTEuMTIsLTAuMjRsLTEuNzgsLTEuMDlsLTAuMjMsLTAuMDRsLTIuOTUsMC43MWwtMS4yNSwwLjc3bC0zLjU1LC0wLjE2bC0xLjg5LC0wLjQ3bC0wLjE0LC0wLjBsLTAuNzUsMC4xN2wtMC42MSwtMS4wN2wtMC4zLC0wLjM2bDAuMzYsLTAuMzJsLTAuMDQsLTAuNDhsLTAuNjIsLTAuMzhsLTAuMzYsMC4wM2wtMC42MiwwLjU0bC0xLjE1LC0wLjcxbC0wLjE4LC0xLjE0bC0wLjE3LC0wLjIybC0xLjQsLTAuNjdsLTAuMjQsLTAuODZsLTAuMDksLTAuMTRsLTAuOTYsLTAuODdsMS40OSwtMC40NGwwLjE2LC0wLjExbDEuNTEsLTIuMTRsMS4xNSwtMi4wOWwxLjQ0LC0wLjYzWlwiLCBcIm5hbWVcIjogXCJSb21hbmlhXCJ9LCBcIkdXXCI6IHtcInBhdGhcIjogXCJNMzgzLjAzLDI1Ni43M2wtMS4xMiwtMC44OGwtMC4xNCwtMC4wNmwtMC45NCwtMC4xNWwtMC40MywtMC41NGwwLjAxLC0wLjI3bC0wLjEzLC0wLjI2bC0wLjY4LC0wLjQ4bC0wLjA1LC0wLjE2bDAuOTksLTAuMzFsMC43NywwLjA4bDAuMTUsLTAuMDJsMC42MSwtMC4yNmw0LjI1LDAuMWwtMC4wMiwwLjQ0bC0wLjE5LDAuMThsLTAuMDgsMC4yOWwwLjE3LDAuNjZsLTAuMTcsMC4xNGwtMC40NCwwLjBsLTAuMTYsMC4wNWwtMC41NywwLjM3bC0wLjY2LC0wLjA0bC0wLjI0LDAuMWwtMC45MiwxLjAzWlwiLCBcIm5hbWVcIjogXCJHdWluZWEgQmlzc2F1XCJ9LCBcIkdUXCI6IHtcInBhdGhcIjogXCJNMTk1LjEzLDI0OS44OWwtMS4wNSwtMC4zNWwtMS41LC0wLjA0bC0xLjA2LC0wLjQ3bC0xLjE5LC0wLjkzbDAuMDQsLTAuNTNsMC4yNywtMC41NWwtMC4wMywtMC4zMWwtMC4yNCwtMC4zMmwxLjAyLC0xLjc3bDMuMDQsLTAuMDFsMC4zLC0wLjI4bDAuMDYsLTAuODhsLTAuMTksLTAuM2wtMC4zLC0wLjExbC0wLjIzLC0wLjQ1bC0wLjExLC0wLjEybC0wLjksLTAuNThsLTAuMzUsLTAuMzNsMC4zNywtMC4wbDAuMywtMC4zbDAuMCwtMS4xNWw0LjA1LDAuMDJsLTAuMDIsMS43NGwtMC4yLDIuODlsMC4zLDAuMzJsMC42NywtMC4wbDAuNzUsMC40MmwwLjQsLTAuMTFsLTAuNjIsMC41M2wtMS4xNywwLjdsLTAuMTMsMC4xNmwtMC4xOCwwLjQ5bDAuMCwwLjIxbDAuMTQsMC4zNGwtMC4zNSwwLjQ0bC0wLjQ5LDAuMTNsLTAuMiwwLjQxbDAuMDMsMC4wNmwtMC4yNywwLjE2bC0wLjg2LDAuNjRsLTAuMTIsMC4yMlpNMTk5LjM1LDI0NS4zOGwwLjA3LC0wLjEzbDAuMDUsMC4wMmwtMC4xMywwLjExWlwiLCBcIm5hbWVcIjogXCJHdWF0ZW1hbGFcIn0sIFwiR1JcIjoge1wicGF0aFwiOiBcIk00ODcuMiwxNzQuNTVsLTAuNjQsMS41NGwtMC40MywwLjI0bC0xLjQxLC0wLjA4bC0xLjI4LC0wLjI4bC0wLjE0LDAuMGwtMy4wMywwLjc3bC0wLjEzLDAuNTFsMS4zOSwxLjM0bC0wLjc4LDAuMjlsLTEuMiwwLjBsLTEuMjMsLTEuNDJsLTAuNDcsMC4wMmwtMC40NywwLjY1bC0wLjA0LDAuMjdsMC41NiwxLjc2bDAuMDYsMC4xMWwxLjAyLDEuMTJsLTAuNjYsMC40NWwtMC4wNCwwLjQ2bDEuMzksMS4zNWwxLjE1LDAuNzlsMC4wMiwxLjA2bC0xLjkxLC0wLjYzbC0wLjM2LDAuNDJsMC41NiwxLjEybC0xLjIsMC4yM2wtMC4yMiwwLjRsMC44LDIuMTRsLTEuMTUsMC4wMmwtMS44OSwtMS4xNWwtMC44OSwtMi4xOWwtMC40MywtMS45MWwtMC4wNSwtMC4xMWwtMC45OCwtMS4zNWwtMS4yNCwtMS42MmwtMC4xMywtMC42M2wxLjA3LC0xLjMybDAuMDYsLTAuMTRsMC4xMywtMC44MWwwLjY4LC0wLjM2bDAuMTYsLTAuMjVsMC4wMywtMC41NGwxLjQsLTAuMjNsMC4xMiwtMC4wNWwwLjg3LC0wLjZsMS4yNiwwLjA1bDAuMjUsLTAuMTFsMC4zNCwtMC40M2wwLjMzLC0wLjA3bDEuODEsMC4wOGwwLjEzLC0wLjAybDEuODcsLTAuNzdsMS42NCwwLjk3bDAuMTksMC4wNGwyLjI4LC0wLjI4bDAuMjYsLTAuMjlsMC4wMiwtMC45NWwwLjU2LDAuMzZaTTQ4MC40NCwxOTIuMGwxLjA1LDAuNzRsMC4wMSwwLjBsLTEuMjYsLTAuMjNsMC4yLC0wLjUxWk00ODEuNzYsMTkyLjc5bDEuODYsLTAuMTVsMS41MywwLjE3bC0wLjAyLDAuMTlsMC4zNCwwLjNsLTIuMjgsMC4xNWwwLjAxLC0wLjEzbC0wLjI1LC0wLjMxbC0xLjE5LC0wLjIyWk00ODUuNjUsMTkzLjI4bDAuNjUsLTAuMTZsLTAuMDUsMC4xMmwtMC42LDAuMDRaXCIsIFwibmFtZVwiOiBcIkdyZWVjZVwifSwgXCJHUVwiOiB7XCJwYXRoXCI6IFwiTTQ0NC44MSwyODIuMDRsLTAuMjEsLTAuMTdsMC43NCwtMi40bDMuNTYsMC4wNWwwLjAyLDIuNDJsLTMuMzQsLTAuMDJsLTAuNzYsMC4xM1pcIiwgXCJuYW1lXCI6IFwiRXF1YXRvcmlhbCBHdWluZWFcIn0sIFwiR1lcIjoge1wicGF0aFwiOiBcIk0yNzEuMzQsMjY0LjI1bDEuNDMsMC44MWwxLjQ0LDEuNTNsMC4wNiwxLjE5bDAuMjgsMC4yOGwwLjg0LDAuMDVsMi4xMywxLjkybC0wLjM0LDEuOTNsLTEuMzcsMC41OWwtMC4xNywwLjM0bDAuMTIsMC41MWwtMC40MywxLjIxbDAuMDMsMC4yNmwxLjExLDEuODJsMC4yNiwwLjE0bDAuNTYsMC4wbDAuMzIsMS4yOWwxLjI1LDEuNzhsLTAuMDgsMC4wMWwtMS4zNCwtMC4yMWwtMC4yNCwwLjA2bC0wLjc4LDAuNjRsLTEuMDYsMC40MWwtMC43NiwwLjFsLTAuMjIsMC4xNWwtMC4xOCwwLjMybC0wLjk1LC0wLjFsLTEuMzgsLTEuMDVsLTAuMTksLTEuMTNsLTAuNiwtMS4xOGwwLjM3LC0xLjk2bDAuNjUsLTAuODNsMC4wMywtMC4zMmwtMC41NywtMS4xN2wtMC4xNSwtMC4xNGwtMC42MiwtMC4yN2wwLjI1LC0wLjg1bC0wLjA4LC0wLjNsLTAuNTgsLTAuNThsLTAuMjQsLTAuMDlsLTEuMTUsMC4xbC0xLjQxLC0xLjU4bDAuNDgsLTAuNDlsMC4wOSwtMC4yMmwtMC4wNCwtMC45MmwxLjMxLC0wLjM0bDAuNzMsLTAuNTJsMC4wNCwtMC40NGwtMC43NSwtMC44MmwwLjE2LC0wLjY2bDEuNzQsLTEuM1pcIiwgXCJuYW1lXCI6IFwiR3V5YW5hXCJ9LCBcIkdFXCI6IHtcInBhdGhcIjogXCJNNTI1LjQxLDE3NC4xOWwwLjI2LC0wLjg4bC0wLjAsLTAuMTdsLTAuNjMsLTIuMDZsLTAuMSwtMC4xNWwtMS40NSwtMS4xMmwtMC4xMSwtMC4wNWwtMS4zMSwtMC4zM2wtMC42NiwtMC42OWwxLjk3LDAuNDhsMy42NSwwLjQ5bDMuMywxLjQxbDAuMzksMC41bDAuMzMsMC4xbDEuNDMsLTAuNDVsMi4xNCwwLjU4bDAuNywxLjE0bDAuMTMsMC4xMmwxLjA2LDAuNDdsLTAuMTgsMC4xMWwtMC4wOCwwLjQzbDEuMDgsMS40MWwtMC4wNiwwLjA2bC0xLjE2LC0wLjE1bC0xLjgyLC0wLjg0bC0wLjMxLDAuMDRsLTAuNTUsMC40NGwtMy4yOSwwLjQ0bC0yLjMyLC0xLjQxbC0wLjE3LC0wLjA0bC0yLjI1LDAuMTJaXCIsIFwibmFtZVwiOiBcIkdlb3JnaWFcIn0sIFwiR0JcIjoge1wicGF0aFwiOiBcIk00MTIuODIsMTE4LjZsLTIuMzEsMy40bC0wLjAsMC4zM2wwLjMxLDAuMTNsMi41MiwtMC40OWwyLjM0LDAuMDJsLTAuNTYsMi41MWwtMi4yMiwzLjEzbDAuMjIsMC40N2wyLjQzLDAuMjFsMi4zNSw0LjM1bDAuMTcsMC4xNGwxLjU4LDAuNTFsMS40OSwzLjc4bDAuNzMsMS4zN2wwLjIsMC4xNWwyLjc2LDAuNTlsLTAuMjUsMS43NWwtMS4xOCwwLjkxbC0wLjA4LDAuMzlsMC44NywxLjQ5bC0xLjk2LDEuNTFsLTMuMzEsLTAuMDJsLTQuMTUsMC44OGwtMS4wNywtMC41OWwtMC4zNSwwLjA0bC0xLjU1LDEuNDRsLTIuMTcsLTAuMzVsLTAuMjIsMC4wNWwtMS42MSwxLjE1bC0wLjc4LC0wLjM4bDMuMzEsLTMuMTJsMi4xOCwtMC43bDAuMjEsLTAuMzFsLTAuMjYsLTAuMjdsLTMuNzgsLTAuNTRsLTAuNDgsLTAuOWwyLjMsLTAuOTJsMC4xMywtMC40NmwtMS4yOSwtMS43MWwwLjM5LC0xLjgzbDMuNDYsMC4yOWwwLjMyLC0wLjI0bDAuMzcsLTEuOTlsLTAuMDYsLTAuMjRsLTEuNzEsLTIuMTdsLTAuMTgsLTAuMTFsLTIuOTEsLTAuNThsLTAuNDMsLTAuNjhsMC44MiwtMS40bC0wLjAzLC0wLjM1bC0wLjgyLC0wLjk3bC0wLjQ2LDAuMDFsLTAuODUsMS4wNWwtMC4xMSwtMi42bC0wLjA1LC0wLjE2bC0xLjE5LC0xLjdsMC44NiwtMy41M2wxLjgxLC0yLjc1bDEuODgsMC4yNmwyLjM4LC0wLjI0Wk00MDYuMzksMTMyLjg0bC0xLjA5LDEuOTJsLTEuNjUsLTAuNjJsLTEuMjYsMC4wMmwwLjQxLC0xLjQ2bDAuMCwtMC4xNmwtMC40MiwtMS41MWwxLjYyLC0wLjExbDIuMzksMS45MlpcIiwgXCJuYW1lXCI6IFwiVW5pdGVkIEtpbmdkb21cIn0sIFwiR0FcIjoge1wicGF0aFwiOiBcIk00NDguNzYsMjk0LjQ3bC0yLjM4LC0yLjM0bC0xLjYzLC0yLjA0bC0xLjQ2LC0yLjQ4bDAuMDYsLTAuNjZsMC41NCwtMC44MWwwLjYxLC0xLjgybDAuNDYsLTEuNjlsMC42MywtMC4xMWwzLjYyLDAuMDNsMC4zLC0wLjNsLTAuMDIsLTIuNzVsMC44OCwtMC4xMmwxLjQ3LDAuMzJsMC4xMywwLjBsMS4zOSwtMC4zbC0wLjEzLDAuODdsMC4wMywwLjE5bDAuNywxLjI5bDAuMywwLjE2bDEuNzQsLTAuMTlsMC4zNiwwLjI5bC0xLjAxLDIuN2wwLjA1LDAuMjlsMS4xMywxLjQybDAuMjUsMS44MmwtMC4zLDEuNTZsLTAuNjQsMC45OWwtMS45MywtMC4wOWwtMS4yNiwtMS4xM2wtMC41LDAuMTdsLTAuMTYsMC45MWwtMS40OCwwLjI3bC0wLjEyLDAuMDVsLTAuODYsMC42M2wtMC4wOCwwLjM5bDAuODEsMS40MmwtMS40OCwxLjA4WlwiLCBcIm5hbWVcIjogXCJHYWJvblwifSwgXCJHTlwiOiB7XCJwYXRoXCI6IFwiTTM5OS44MywyNjUuMzFsLTAuNjksLTAuMDZsLTAuMywwLjE2bC0wLjQzLDAuODVsLTAuMzksLTAuMDFsLTAuMywtMC4zM2wwLjE0LC0wLjg3bC0wLjA1LC0wLjIybC0xLjA1LC0xLjU0bC0wLjM3LC0wLjExbC0wLjYxLDAuMjdsLTAuODQsMC4xMmwwLjAyLC0wLjU0bC0wLjA0LC0wLjE3bC0wLjM1LC0wLjU3bDAuMDcsLTAuNjNsLTAuMDMsLTAuMTdsLTAuNTcsLTEuMTFsLTAuNywtMC45bC0wLjI0LC0wLjEybC0yLjAsLTAuMGwtMC4xOSwwLjA3bC0wLjUxLDAuNDJsLTAuNiwwLjA1bC0wLjIxLDAuMTFsLTAuNDMsMC41NWwtMC4zLDAuN2wtMS4wNCwwLjg2bC0wLjkxLC0xLjI0bC0xLjAsLTEuMDJsLTAuNjksLTAuMzdsLTAuNTIsLTAuNDJsLTAuMywtMS4xMWwtMC4zNywtMC41NmwtMC4xLC0wLjFsLTAuNCwtMC4yM2wwLjc3LC0wLjg1bDAuNjIsMC4wNGwwLjE4LC0wLjA1bDAuNTgsLTAuMzhsMC40NiwtMC4wbDAuMTksLTAuMDdsMC4zOSwtMC4zNGwwLjEsLTAuM2wtMC4xNywtMC42N2wwLjE1LC0wLjE0bDAuMDksLTAuMmwwLjAzLC0wLjU3bDAuODcsMC4wMmwxLjc2LDAuNmwwLjEzLDAuMDFsMC41NSwtMC4wNmwwLjIyLC0wLjEzbDAuMDgsLTAuMTJsMS4xOCwwLjE3bDAuMTcsLTAuMDJsMC4wOSwwLjU2bDAuMywwLjI1bDAuNCwtMC4wbDAuMTQsLTAuMDNsMC41NiwtMC4yOWwwLjIzLDAuMDVsMC42MywwLjU5bDAuMTUsMC4wN2wxLjA3LDAuMmwwLjI0LC0wLjA2bDAuNjUsLTAuNTJsMC43NywtMC4zMmwwLjU1LC0wLjMybDAuMywwLjA0bDAuNDQsMC40NWwwLjM0LDAuNzRsMC44NCwwLjg3bC0wLjM1LDAuNDVsLTAuMDYsMC4xNWwtMC4xLDAuODJsMC40MiwwLjMxbDAuMzUsLTAuMTZsMC4wNSwwLjA0bC0wLjEsMC41OWwwLjA5LDAuMjdsMC40MiwwLjRsLTAuMDYsMC4wMmwtMC4xOCwwLjIxbC0wLjIsMC44NmwwLjAzLDAuMjFsMC41NiwxLjAybDAuNTIsMS43MWwtMC42NSwwLjIxbC0wLjE1LDAuMTJsLTAuMjQsMC4zNWwtMC4wMywwLjI4bDAuMTYsMC40MWwtMC4xLDAuNzZsLTAuMTIsMC4wWlwiLCBcIm5hbWVcIjogXCJHdWluZWFcIn0sIFwiR01cIjoge1wicGF0aFwiOiBcIk0zNzkuMTgsMjUxLjQ4bDAuMTUsLTAuNTVsMi41MSwtMC4wN2wwLjIxLC0wLjA5bDAuNDgsLTAuNTJsMC41OCwtMC4wM2wwLjkxLDAuNThsMC4xNiwwLjA1bDAuNzgsMC4wMWwwLjE0LC0wLjAzbDAuNTksLTAuMzFsMC4xNiwwLjI0bC0wLjcxLDAuMzhsLTAuOTQsLTAuMDRsLTEuMDIsLTAuNTFsLTAuMywwLjAxbC0wLjg2LDAuNTVsLTAuMzcsMC4wMmwtMC4xNCwwLjA0bC0wLjUzLDAuMzFsLTEuODEsLTAuMDRaXCIsIFwibmFtZVwiOiBcIkdhbWJpYVwifSwgXCJHTFwiOiB7XCJwYXRoXCI6IFwiTTMwNC4xMyw2LjZsOC4xOSwtMy42M2w4LjcyLDAuMjhsMC4xOSwtMC4wNmwzLjEyLC0yLjI4bDguNzUsLTAuNjFsMTkuOTQsMC44bDE0LjkzLDQuNzVsLTMuOTIsMi4wMWwtOS41MiwwLjI3bC0xMy40OCwwLjZsLTAuMjcsMC4ybDAuMDksMC4zM2wxLjI2LDEuMDlsMC4yMiwwLjA3bDguODEsLTAuNjdsNy40OSwyLjA3bDAuMTksLTAuMDFsNC42OCwtMS43OGwxLjc2LDEuODRsLTIuNTksMy4yNmwtMC4wMSwwLjM2bDAuMzQsMC4xMWw2LjM1LC0yLjJsMTIuMDksLTIuMzJsNy4zMSwxLjE0bDEuMTcsMi4xM2wtOS45LDQuMDVsLTEuNDMsMS4zMmwtNy45MSwwLjk4bC0wLjI2LDAuMzFsMC4yOSwwLjI5bDUuMjUsMC4yNWwtMi42MywzLjcybC0yLjAyLDMuNjFsLTAuMDQsMC4xNWwwLjA4LDYuMDVsMC4wNywwLjE5bDIuNjEsMy4wbC0zLjQsMC4ybC00LjEyLDEuNjZsLTAuMDQsMC41NGw0LjUsMi42N2wwLjUzLDMuOWwtMi4zOSwwLjQybC0wLjE5LDAuNDhsMi45MSwzLjgzbC01LjAsMC4zMmwtMC4yNywwLjIybDAuMTIsMC4zM2wyLjY5LDEuODRsLTAuNjUsMS4zNWwtMy4zNiwwLjcxbC0zLjQ2LDAuMDFsLTAuMjEsMC41MWwzLjA1LDMuMTVsMC4wMiwxLjUzbC00LjU0LC0xLjc5bC0wLjMyLDAuMDZsLTEuMjksMS4yNmwwLjExLDAuNWwzLjMzLDEuMTVsMy4xNywyLjc0bDAuODUsMy4yOWwtNC4wLDAuNzhsLTEuODMsLTEuNjZsLTMuMSwtMi42NGwtMC4zNiwtMC4wMmwtMC4xMywwLjMzbDAuOCwyLjkybC0yLjc2LDIuMjZsLTAuMDksMC4zM2wwLjI4LDAuMmw2LjU5LDAuMTlsMi40NywwLjE4bC01Ljg2LDMuMzhsLTYuNzYsMy40M2wtNy4yNiwxLjQ4bC0yLjczLDAuMDJsLTAuMTYsMC4wNWwtMi42NywxLjcybC0zLjQ0LDQuNDJsLTUuMjgsMi44NmwtMS43MywwLjE4bC0zLjMzLDEuMDFsLTMuNTksMC45NmwtMC4xNSwwLjFsLTIuMTUsMi41MmwtMC4wNywwLjE5bC0wLjAzLDIuNzZsLTEuMjEsMi40OWwtNC4wMywzLjFsLTAuMSwwLjMzbDAuOTgsMi45NGwtMi4zMSw2LjU3bC0zLjIxLDAuMjFsLTMuNiwtMy4wbC0wLjE5LC0wLjA3bC00LjksLTAuMDJsLTIuMjksLTEuOTdsLTEuNjksLTMuNzhsLTQuMzEsLTQuODZsLTEuMjMsLTIuNTJsLTAuMzQsLTMuNThsLTAuMDgsLTAuMTdsLTMuMzUsLTMuNjdsMC44NSwtMi45MmwtMC4wOSwtMC4zMWwtMS41LC0xLjM0bDIuMzMsLTQuN2wzLjY3LC0xLjU3bDAuMTUsLTAuMTNsMS4wMiwtMS45M2wwLjUyLC0zLjQ3bC0wLjQ0LC0wLjMxbC0yLjg1LDEuNTdsLTEuMzMsMC42NGwtMi4xMiwwLjU5bC0yLjgxLC0xLjMybC0wLjE1LC0yLjc5bDAuODgsLTIuMTdsMi4wOSwtMC4wNmw1LjA3LDEuMmwwLjM0LC0wLjE3bC0wLjExLC0wLjM3bC00LjMsLTIuOWwtMi4yNCwtMS41OGwtMC4yNSwtMC4wNWwtMi4zOCwwLjYybC0xLjcsLTAuOTNsMi42MiwtNC4xbC0wLjAzLC0wLjM2bC0xLjUxLC0xLjc1bC0xLjk3LC0zLjNsLTMuMDEsLTUuMjFsLTAuMSwtMC4xMWwtMy4wNCwtMS44NWwwLjAzLC0xLjk0bC0wLjE4LC0wLjI4bC02LjgyLC0zLjAxbC01LjM1LC0wLjM4bC02LjY5LDAuMjFsLTYuMDMsMC4zN2wtMi44MSwtMS41OWwtMy44NCwtMi45bDUuOTQsLTEuNWw1LjAxLC0wLjI4bDAuMjgsLTAuMjlsLTAuMjYsLTAuMzFsLTEwLjY4LC0xLjM4bC01LjM4LC0yLjFsMC4yNywtMS42OGw5LjMsLTIuNmw5LjE4LC0yLjY4bDAuMTksLTAuMTZsMC45NywtMi4wNWwtMC4xOCwtMC40MmwtNi4yOSwtMS45MWwxLjgxLC0xLjlsOC41OCwtNC4wNWwzLjYsLTAuNjNsMC4yMywtMC40bC0wLjkyLC0yLjM3bDUuNTksLTEuNWw3LjY2LC0wLjk1bDcuNTgsLTAuMDVsMi42NSwxLjg0bDAuMzEsMC4wMmw2LjUyLC0zLjI5bDUuODUsMi4yNGwzLjU1LDAuNDlsNS4xNywxLjk1bDAuMzgsLTAuMTZsLTAuMTMsLTAuMzlsLTUuNzcsLTMuMTZsMC4yOSwtMi4yNlpcIiwgXCJuYW1lXCI6IFwiR3JlZW5sYW5kXCJ9LCBcIktXXCI6IHtcInBhdGhcIjogXCJNNTQwLjg3LDIwNy44MWwwLjQxLDAuOTRsLTAuMTgsMC41MWwwLjAsMC4yMWwwLjY1LDEuNjZsLTEuMTUsMC4wNWwtMC41NCwtMS4xMmwtMC4yNCwtMC4xN2wtMS43MywtMC4ybDEuNDQsLTIuMDZsMS4zMywwLjE4WlwiLCBcIm5hbWVcIjogXCJLdXdhaXRcIn0sIFwiR0hcIjoge1wicGF0aFwiOiBcIk00MjMuMTYsMjY5Ljg4bC0zLjU4LDEuMzRsLTEuNDEsMC44N2wtMi4xMywwLjY5bC0xLjkxLC0wLjYxbDAuMDksLTAuNzVsLTAuMDMsLTAuMTdsLTEuMDQsLTIuMDdsMC42MiwtMi43bDEuMDQsLTIuMDhsMC4wMywtMC4xOWwtMS4wLC01LjQ2bDAuMDUsLTEuMTJsNC4wNCwtMC4xMWwxLjA4LDAuMThsMC4xOCwtMC4wM2wwLjcyLC0wLjM2bDAuNzUsMC4xM2wtMC4xMSwwLjQ4bDAuMDYsMC4yNmwwLjk4LDEuMjJsLTAuMCwxLjc3bDAuMjQsMS45OWwwLjA1LDAuMTNsMC41NSwwLjgxbC0wLjUyLDIuMTRsMC4xOSwxLjM3bDAuNjksMS42NmwwLjM4LDAuNjJaXCIsIFwibmFtZVwiOiBcIkdoYW5hXCJ9LCBcIk9NXCI6IHtcInBhdGhcIjogXCJNNTY4LjE2LDIzMS4wbC0wLjA4LDAuMWwtMC44NCwxLjYxbC0wLjkzLC0wLjExbC0wLjI3LDAuMTFsLTAuNTgsMC43M2wtMC40LDEuMzJsLTAuMDEsMC4xNGwwLjI5LDEuNjFsLTAuMDcsMC4wOWwtMS4wLC0wLjAxbC0wLjE2LDAuMDRsLTEuNTYsMC45N2wtMC4xNCwwLjJsLTAuMjMsMS4xN2wtMC40MSwwLjRsLTEuNDQsLTAuMDJsLTAuMTcsMC4wNWwtMC45OCwwLjY1bC0wLjEzLDAuMjVsMC4wMSwwLjg3bC0wLjk3LDAuNTdsLTEuMjcsLTAuMjJsLTAuMTksMC4wM2wtMS42MywwLjg0bC0wLjg4LDAuMTFsLTIuNTUsLTUuNTdsNy4yLC0yLjQ5bDAuMTksLTAuMTlsMS42NywtNS4yM2wtMC4wMywtMC4yNWwtMS4xLC0xLjc4bDAuMDUsLTAuODlsMC42OCwtMS4wM2wwLjA1LC0wLjE2bDAuMDEsLTAuODlsMC45NiwtMC40NGwwLjA3LC0wLjVsLTAuMzIsLTAuMjZsMC4xNiwtMS4zMWwwLjg1LC0wLjAxbDEuMDMsMS42N2wwLjA5LDAuMDlsMS40LDAuOTZsMC4xMSwwLjA1bDEuODIsMC4zNGwxLjM3LDAuNDVsMS43NSwyLjMybDAuMTMsMC4xbDAuNywwLjI2bC0wLjAsMC4zbC0xLjI1LDIuMTlsLTEuMDEsMC44Wk01NjEuODgsMjE4LjQ3bC0wLjAxLDAuMDJsLTAuMTUsLTAuMjlsMC4zLC0wLjM4bC0wLjE0LDAuNjVaXCIsIFwibmFtZVwiOiBcIk9tYW5cIn0sIFwiXzNcIjoge1wicGF0aFwiOiBcIk01NDMuMiwyNjEuMDZsLTEuMDcsMS40NmwtMS42NSwxLjk5bC0xLjkxLDAuMDFsLTguMDgsLTIuOTVsLTAuODksLTAuODRsLTAuOSwtMS4xOWwtMC44MSwtMS4yM2wwLjQ0LC0wLjczbDAuNzYsLTEuMTJsMC40OSwwLjI4bDAuNTIsMS4wNWwxLjEzLDEuMDZsMC4yLDAuMDhsMS4yNCwwLjAxbDIuNDIsLTAuNjVsMi43NywtMC4zMWwyLjE3LC0wLjc4bDEuMzEsLTAuMTlsMC44NCwtMC40M2wxLjAzLC0wLjA2bC0wLjAxLDQuNTRaXCIsIFwibmFtZVwiOiBcIlNvbWFsaWxhbmRcIn0sIFwiXzJcIjoge1wicGF0aFwiOiBcIk0zODQuMjMsMjMwLjM3bDAuMDcsLTAuMDZsMC4yOCwtMC44OWwwLjk5LC0xLjEzbDAuMDcsLTAuMTNsMC44LC0zLjU0bDMuNCwtMi44bDAuMDksLTAuMTNsMC43NiwtMi4xN2wwLjA3LDUuNWwtMi4wNywwLjIxbC0wLjI0LDAuMTdsLTAuNjEsMS4zNmwtMC4wMiwwLjE2bDAuNDMsMy40NmwtNC4wMSwtMC4wMVpNMzkxLjgyLDIxOC4ybDAuMDcsLTAuMDZsMC43NSwtMS45M2wxLjg2LC0wLjI1bDAuOTQsMC4zNGwxLjE0LDAuMGwwLjE4LC0wLjA2bDAuNzMsLTAuNTZsMS40MSwtMC4wOGwtMC4wLDIuNzJsLTcuMDgsLTAuMTJaXCIsIFwibmFtZVwiOiBcIldlc3Rlcm4gU2FoYXJhXCJ9LCBcIl8xXCI6IHtcInBhdGhcIjogXCJNNDcyLjcxLDE3Mi44NGwtMC4wNywtMC40M2wtMC4xNiwtMC4yMmwtMC41MywtMC4yN2wtMC4zOCwtMC41OGwwLjMsLTAuNDNsMC41MSwtMC4xOWwwLjE4LC0wLjE4bDAuMywtMC44N2wwLjEyLC0wLjA0bDAuMjIsMC4yNmwwLjEyLDAuMDlsMC4zOCwwLjE1bDAuMjgsMC40MWwwLjE1LDAuMTJsMC4zNCwwLjEybDAuNDMsMC41bDAuMTUsMC4wN2wtMC4xMiwwLjNsLTAuMjcsMC4zMmwtMC4wMywwLjE4bC0wLjMxLDAuMDZsLTEuNDgsMC40N2wtMC4xNSwwLjE3WlwiLCBcIm5hbWVcIjogXCJLb3Nvdm9cIn0sIFwiXzBcIjoge1wicGF0aFwiOiBcIk01MDMuNTQsMTkyLjkybDAuMDksLTAuMTdsMC40MSwwLjAxbC0wLjA4LDAuMDFsLTAuNDIsMC4xNVpNNTA0LjIzLDE5Mi43NmwxLjAyLDAuMDJsMC40LC0wLjEzbC0wLjA5LDAuMjlsMC4wMywwLjA4bC0wLjM1LDAuMTZsLTAuMjQsLTAuMDRsLTAuMDYsLTAuMWwtMC4xOCwtMC4xN2wtMC4xOSwtMC4wOGwtMC4zMywtMC4wMlpcIiwgXCJuYW1lXCI6IFwiTm9ydGhlcm4gQ3lwcnVzXCJ9LCBcIkpPXCI6IHtcInBhdGhcIjogXCJNNTEwLjI2LDIwMC45M2wwLjI4LC0wLjU3bDIuNTMsMS4wbDAuMjcsLTAuMDJsNC41NywtMi43N2wwLjg0LDIuODRsLTAuMjgsMC4yNWwtNC45NSwxLjM3bC0wLjE0LDAuNDlsMi4yNCwyLjQ4bC0wLjUsMC4yOGwtMC4xMywwLjE0bC0wLjM1LDAuNzhsLTEuNzYsMC4zNWwtMC4yLDAuMTRsLTAuNTcsMC45NGwtMC45NCwwLjczbC0yLjQ1LC0wLjM4bC0wLjAzLC0wLjEybDEuMjMsLTQuMzJsLTAuMDQsLTEuMWwwLjM0LC0wLjc1bDAuMDMsLTAuMTJsMC4wLC0xLjYzWlwiLCBcIm5hbWVcIjogXCJKb3JkYW5cIn0sIFwiSFJcIjoge1wicGF0aFwiOiBcIk00NTUuNDksMTYyLjczbDEuNTMsMC4wOWwwLjI0LC0wLjFsMC4yOSwtMC4zNGwwLjY0LDAuMzhsMC4xNCwwLjA0bDAuOTgsMC4wNmwwLjMyLC0wLjNsLTAuMDEsLTAuNjZsMC42NywtMC4yNWwwLjE5LC0wLjIybDAuMjEsLTEuMTFsMS43MiwtMC43MmwwLjY1LDAuMzJsMS45NCwxLjM3bDIuMDcsMC42bDAuMjIsLTAuMDJsMC42NywtMC4zM2wwLjQ3LDAuOTRsMC42NywwLjc2bC0wLjYzLDAuNzdsLTAuOTEsLTAuNTVsLTAuMTYsLTAuMDRsLTEuNjksMC4wNGwtMi4yLC0wLjUxbC0xLjE3LDAuMDdsLTAuMjEsMC4xMWwtMC4zNiwwLjQybC0wLjY3LC0wLjUzbC0wLjQ2LDAuMTJsLTAuNTIsMS4yOWwwLjA1LDAuMzFsMS4yMSwxLjQybDAuNTgsMC45OWwxLjE1LDEuMTRsMC45NSwwLjY4bDAuOTIsMS4yM2wwLjEsMC4wOWwxLjc1LDAuOTFsLTEuODcsLTAuODlsLTEuNSwtMS4xMWwtMi4yMywtMC44OGwtMS43NywtMS45bDAuMTIsLTAuMDZsMC4xLC0wLjQ3bC0xLjA3LC0xLjIybC0wLjA0LC0wLjk0bC0wLjIxLC0wLjI3bC0xLjYxLC0wLjQ5bC0wLjM1LDAuMTRsLTAuNTMsMC45M2wtMC40MSwtMC41N2wwLjA0LC0wLjczWlwiLCBcIm5hbWVcIjogXCJDcm9hdGlhXCJ9LCBcIkhUXCI6IHtcInBhdGhcIjogXCJNMjM3LjgyLDIzNC42OGwxLjM1LDAuMWwxLjk1LDAuMzdsMC4xOCwxLjE1bC0wLjE2LDAuODNsLTAuNTEsMC4zN2wtMC4wNiwwLjQ0bDAuNTcsMC42OGwtMC4wMiwwLjIybC0xLjMxLC0wLjM1bC0xLjI2LDAuMTdsLTEuNDksLTAuMThsLTAuMTUsMC4wMmwtMS4wMywwLjQzbC0xLjAyLC0wLjYxbDAuMDksLTAuMzZsMi4wNCwwLjMybDEuOSwwLjIxbDAuMTksLTAuMDVsMC45LC0wLjU4bDAuMDUsLTAuNDdsLTEuMDUsLTEuMDNsMC4wMiwtMC44NmwtMC4yMywtMC4zbC0xLjEzLC0wLjI5bDAuMTgsLTAuMjNaXCIsIFwibmFtZVwiOiBcIkhhaXRpXCJ9LCBcIkhVXCI6IHtcInBhdGhcIjogXCJNNDYxLjk2LDE1Ny45MmwwLjY4LC0xLjY2bC0wLjAzLC0wLjI5bC0wLjE1LC0wLjIybDAuODQsLTAuMGwwLjMsLTAuMjZsMC4xMiwtMC44NGwwLjg4LDAuNTdsMC45OCwwLjM4bDAuMTYsMC4wMWwyLjEsLTAuMzlsMC4yMywtMC4yMWwwLjE0LC0wLjQ1bDAuODgsLTAuMWwxLjA2LC0wLjQzbDAuMTMsMC4xbDAuMjgsMC4wNGwxLjE4LC0wLjRsMC4xNCwtMC4xbDAuNTIsLTAuNjdsMC42MywtMC4xNWwyLjYsMC45NWwwLjI2LC0wLjAzbDAuMzgsLTAuMjNsMS4xMiwwLjdsMC4xLDAuNDlsLTEuMzEsMC41N2wtMC4xNCwwLjEzbC0xLjE4LDIuMTRsLTEuNDQsMi4wNGwtMS44NSwwLjU1bC0xLjUxLC0wLjEzbC0wLjE0LDAuMDJsLTEuOTIsMC44MmwtMC44NSwwLjQybC0xLjkxLC0wLjU1bC0xLjgzLC0xLjMxbC0wLjc0LC0wLjM3bC0wLjQ0LC0wLjk3bC0wLjI2LC0wLjE4WlwiLCBcIm5hbWVcIjogXCJIdW5nYXJ5XCJ9LCBcIkhOXCI6IHtcInBhdGhcIjogXCJNMjAyLjQ4LDI1MS44N2wtMC4zMywtMC42MmwtMC4xOCwtMC4xNGwtMC41LC0wLjE1bDAuMTMsLTAuNzZsLTAuMTEsLTAuMjhsLTAuMzQsLTAuMjhsLTAuNiwtMC4yM2wtMC4xOCwtMC4wMWwtMC44MSwwLjIybC0wLjE2LC0wLjI0bC0wLjcyLC0wLjM5bC0wLjUxLC0wLjQ4bC0wLjEyLC0wLjA3bC0wLjMxLC0wLjA5bDAuMjQsLTAuM2wwLjA0LC0wLjNsLTAuMTYsLTAuNGwwLjEsLTAuMjhsMS4xNCwtMC42OWwxLjAsLTAuODZsMC4wOSwwLjA0bDAuMywtMC4wNWwwLjQ3LC0wLjM5bDAuNDksLTAuMDNsMC4xNCwwLjEzbDAuMjksMC4wNmwwLjMxLC0wLjFsMS4xNiwwLjIybDEuMjQsLTAuMDhsMC44MSwtMC4yOGwwLjI5LC0wLjI1bDAuNjMsMC4xbDAuNjksMC4xOGwwLjY1LC0wLjA2bDAuNDksLTAuMmwxLjA0LDAuMzJsMC4zOCwwLjA2bDAuNywwLjQ0bDAuNzEsMC41NmwwLjkyLDAuNDFsMC4xLDAuMTFsLTAuMTEsLTAuMDFsLTAuMjMsMC4wOWwtMC4zLDAuM2wtMC43NiwwLjI5bC0wLjU4LDAuMGwtMC4xNSwwLjA0bC0wLjQ1LDAuMjZsLTAuMzEsLTAuMDdsLTAuMzcsLTAuMzRsLTAuMjgsLTAuMDdsLTAuMjYsMC4wN2wtMC4xOCwwLjE1bC0wLjIzLDAuNDNsLTAuMDQsLTAuMGwtMC4zMywwLjI4bC0wLjAzLDAuNGwtMC43NiwwLjYxbC0wLjQ1LDAuM2wtMC4xNSwwLjE2bC0wLjUxLC0wLjM2bC0wLjQxLDAuMDZsLTAuNDUsMC41NmwtMC40MSwtMC4wMWwtMC41OSwwLjA2bC0wLjI3LDAuMzFsMC4wNCwwLjk2bC0wLjA3LDAuMGwtMC4yNSwwLjE2bC0wLjI0LDAuNDVsLTAuNDIsMC4wNlpcIiwgXCJuYW1lXCI6IFwiSG9uZHVyYXNcIn0sIFwiUFJcIjoge1wicGF0aFwiOiBcIk0yNTQuOTUsMjM4LjMxbDEuMTUsMC4yMWwwLjIsMC4yM2wtMC4zNiwwLjM2bC0xLjc2LC0wLjAxbC0xLjIsMC4wN2wtMC4wOSwtMC42OWwwLjE3LC0wLjE4bDEuODksMC4wMVpcIiwgXCJuYW1lXCI6IFwiUHVlcnRvIFJpY29cIn0sIFwiUFNcIjoge1wicGF0aFwiOiBcIk01MDkuNjYsMjAxLjA2bC0wLjAsMS40NGwtMC4yOSwwLjYzbC0wLjU5LDAuMTlsMC4wMiwtMC4xMWwwLjUyLC0wLjMxbC0wLjAyLC0wLjUzbC0wLjQxLC0wLjJsMC4zNiwtMS4yOGwwLjQxLDAuMTdaXCIsIFwibmFtZVwiOiBcIldlc3QgQmFua1wifSwgXCJQVFwiOiB7XCJwYXRoXCI6IFwiTTM5OC42NSwxNzMuNmwwLjc1LC0wLjYzbDAuNywtMC4zbDAuNTEsMS4ybDAuMjgsMC4xOGwxLjQ4LC0wLjBsMC4yLC0wLjA4bDAuMzMsLTAuM2wxLjE2LDAuMDhsMC41MiwxLjExbC0wLjk1LDAuNjZsLTAuMTMsMC4yNGwtMC4wMywyLjJsLTAuMzMsMC4zNWwtMC4wOCwwLjE4bC0wLjA4LDEuMTdsLTAuODYsMC4xOWwtMC4yLDAuNDRsMC45MywxLjY0bC0wLjY0LDEuNzlsMC4wNywwLjMxbDAuNzIsMC43MmwtMC4yNCwwLjU2bC0wLjksMS4wNWwtMC4wNywwLjI2bDAuMTcsMC43N2wtMC43MywwLjU0bC0xLjE4LC0wLjM2bC0wLjE2LC0wLjBsLTAuODUsMC4yMWwwLjMxLC0xLjgxbC0wLjIzLC0xLjg3bC0wLjIzLC0wLjI1bC0wLjk5LC0wLjI0bC0wLjQ5LC0wLjkxbDAuMTgsLTEuNzJsMC45MywtMC45OWwwLjA4LC0wLjE2bDAuMTcsLTEuMTdsMC41MiwtMS43NmwtMC4wNCwtMS4zNmwtMC41MSwtMS4xNGwtMC4wOSwtMC44WlwiLCBcIm5hbWVcIjogXCJQb3J0dWdhbFwifSwgXCJQWVwiOiB7XCJwYXRoXCI6IFwiTTI2NC4zMywzNDEuNDNsMC45MywtMi45NmwwLjA3LC0xLjQybDEuMSwtMi4xbDQuMTksLTAuNzNsMi4yMiwwLjA0bDIuMTIsMS4yMWwwLjA3LDAuNzZsMC43LDEuMzhsLTAuMTYsMy40OGwwLjI0LDAuMzFsMi42NCwwLjVsMC4xOSwtMC4wM2wwLjksLTAuNDVsMS40NywwLjYybDAuMzgsMC42NGwwLjIzLDIuMzVsMC4zLDEuMDdsMC4yNSwwLjIxbDAuOTMsMC4xMmwwLjE2LC0wLjAybDAuOCwtMC4zN2wwLjYxLDAuMzNsLTAuMCwxLjI1bC0wLjMzLDEuNTNsLTAuNSwxLjU3bC0wLjM5LDIuMjZsLTIuMTQsMS45NGwtMS44NSwwLjRsLTIuNzQsLTAuNGwtMi4xMywtMC42MmwyLjI2LC0zLjc1bDAuMDMsLTAuMjRsLTAuMzYsLTEuMThsLTAuMTcsLTAuMTlsLTIuNTUsLTEuMDNsLTMuMDQsLTEuOTVsLTIuMDcsLTAuNDNsLTQuNCwtNC4xMlpcIiwgXCJuYW1lXCI6IFwiUGFyYWd1YXlcIn0sIFwiUEFcIjoge1wicGF0aFwiOiBcIk0yMTMuNjUsMjYzLjc5bDAuMTgsLTAuNDNsMC4wMiwtMC4xOGwtMC4wNiwtMC4yOGwwLjIzLC0wLjE4bC0wLjAxLC0wLjQ4bC0wLjQsLTAuMjlsLTAuMDEsLTAuNjJsMC41NywtMC4xM2wwLjY4LDAuNjlsLTAuMDQsMC4zOWwwLjI2LDAuMzNsMS4wLDAuMTFsMC4yNywtMC4xbDAuNDksMC40NGwwLjI0LDAuMDdsMS4zNCwtMC4yMmwxLjA0LC0wLjYybDEuNDksLTAuNWwwLjg2LC0wLjczbDAuOTksMC4xMWwwLjE4LDAuMjhsMS4zNSwwLjA4bDEuMDIsMC40bDAuNzgsMC43MmwwLjcxLDAuNTNsLTAuMSwwLjEybC0wLjA1LDAuM2wwLjUzLDEuMzRsLTAuMjgsMC40NGwtMC42LC0wLjEzbC0wLjM2LDAuMjJsLTAuMiwwLjc2bC0wLjQxLC0wLjM2bC0wLjQ0LC0xLjEybDAuNDksLTAuNTNsLTAuMTQsLTAuNDlsLTAuNTEsLTAuMTRsLTAuNDEsLTAuNzJsLTAuMTEsLTAuMTFsLTEuMjUsLTAuN2wtMC4xOSwtMC4wNGwtMS4xLDAuMTZsLTAuMjIsMC4xNWwtMC40NywwLjgxbC0wLjksMC41NmwtMC40OSwwLjA4bC0wLjIyLDAuMTdsLTAuMjUsMC41MmwwLjA1LDAuMzJsMC45MywxLjA3bC0wLjQxLDAuMjFsLTAuMjksMC4zbC0wLjgxLDAuMDlsLTAuMzYsLTEuMjZsLTAuNTMsLTAuMWwtMC4yMSwwLjI4bC0wLjUsLTAuMDlsLTAuNDQsLTAuODhsLTAuMjIsLTAuMTZsLTAuOTksLTAuMTZsLTAuNjEsLTAuMjhsLTAuMTMsLTAuMDNsLTEuMCwwLjBaXCIsIFwibmFtZVwiOiBcIlBhbmFtYVwifSwgXCJQR1wiOiB7XCJwYXRoXCI6IFwiTTgwOC40LDI5OC42bDAuNjIsMC40NmwxLjE5LDEuNTZsMS4wNCwwLjc3bC0wLjE4LDAuMzdsLTAuNDIsMC4xNWwtMC45MiwtMC44MmwtMS4wNSwtMS41M2wtMC4yNywtMC45NlpNODA0LjA5LDI5Ni4wNmwtMC4zLDAuMjZsLTAuMzYsLTEuMTFsLTAuNjYsLTEuMDZsLTIuNTUsLTEuODlsLTEuNDIsLTAuNTlsMC4xNywtMC4xNWwxLjE2LDAuNmwwLjg1LDAuNTVsMS4wMSwwLjU4bDAuOTcsMS4wMmwwLjksMC43NmwwLjI0LDEuMDNaTTc5Ni43MSwyOTcuOTlsMC4xNSwwLjgybDAuMzQsMC4yNGwxLjQzLC0wLjE5bDAuMTksLTAuMTFsMC42OCwtMC44MmwxLjM2LC0wLjg3bDAuMTMsLTAuMzFsLTAuMjEsLTEuMTNsMS4wNCwtMC4wM2wwLjMsMC4yNWwtMC4wNCwxLjE3bC0wLjc0LDEuMzRsLTEuMTcsMC4xOGwtMC4yMiwwLjE1bC0wLjM1LDAuNjJsLTIuNTEsMS4xM2wtMS4yMSwtMC4wbC0xLjk5LC0wLjcxbC0xLjE5LC0wLjU4bDAuMDcsLTAuMjhsMS45OCwwLjMybDEuNDYsLTAuMmwwLjI0LC0wLjIxbDAuMjUsLTAuNzlaTTc4OS4yNCwzMDMuNTJsMC4xMSwwLjE1bDIuMTksMS42MmwxLjYsMi42MmwwLjI3LDAuMTRsMS4wOSwtMC4wNmwtMC4wNywwLjc3bDAuMjMsMC4zMmwxLjIzLDAuMjdsLTAuMTQsMC4wOWwwLjA1LDAuNTNsMi4zOSwwLjk1bC0wLjExLDAuMjhsLTEuMzMsMC4xNGwtMC41MSwtMC41NWwtMC4xOCwtMC4wOWwtNC41OSwtMC42NWwtMS44NywtMS41NWwtMS4zOCwtMS4zNWwtMS4yOCwtMi4xN2wtMC4xNiwtMC4xM2wtMy4yNywtMS4xbC0wLjE5LDAuMGwtMi4xMiwwLjcybC0xLjU4LDAuODVsLTAuMTUsMC4zMWwwLjI4LDEuNjNsLTEuNjUsMC43M2wtMS4zNywtMC40bC0yLjMsLTAuMDlsLTAuMDgsLTE1LjY1bDMuOTUsMS41N2w0LjU4LDEuNDJsMS42NywxLjI1bDEuMzIsMS4xOWwwLjM2LDEuMzlsMC4xOSwwLjIxbDQuMDYsMS41MWwwLjM5LDAuODVsLTEuOSwwLjIybC0wLjI1LDAuMzlsMC41NSwxLjY4WlwiLCBcIm5hbWVcIjogXCJQYXB1YSBOZXcgR3VpbmVhXCJ9LCBcIlBFXCI6IHtcInBhdGhcIjogXCJNMjQ2LjQ0LDMyOS4yMWwtMC42MywxLjI1bC0xLjA1LDAuNTRsLTIuMjUsLTEuMzNsLTAuMTksLTAuOTNsLTAuMTYsLTAuMjFsLTQuOTUsLTIuNThsLTQuNDYsLTIuNzlsLTEuODcsLTEuNTJsLTAuOTQsLTEuOTFsMC4zMywtMC42bC0wLjAxLC0wLjMxbC0yLjExLC0zLjMzbC0yLjQ2LC00LjY2bC0yLjM2LC01LjAybC0xLjA0LC0xLjE4bC0wLjc3LC0xLjgxbC0wLjA4LC0wLjExbC0xLjk1LC0xLjY0bC0xLjU0LC0wLjg4bDAuNjEsLTAuODVsMC4wMiwtMC4zMWwtMS4xNSwtMi4yN2wwLjY5LC0xLjU2bDEuNTksLTEuMjZsMC4xMiwwLjQybC0wLjU2LDAuNDdsLTAuMTEsMC4yNWwwLjA3LDAuOTJsMC4zNiwwLjI3bDAuOTcsLTAuMTlsMC44NSwwLjIzbDAuOTksMS4xOWwwLjQxLDAuMDVsMS40MiwtMS4wM2wwLjExLC0wLjE2bDAuNDYsLTEuNjRsMS40NSwtMi4wNmwyLjkyLC0wLjk2bDAuMTEsLTAuMDdsMi43MywtMi42MmwwLjg0LC0xLjcybDAuMDIsLTAuMThsLTAuMywtMS42NWwwLjI4LC0wLjFsMS40OSwxLjA2bDAuNzcsMS4xNGwwLjEsMC4wOWwxLjA4LDAuNmwxLjQzLDIuNTVsMC4yMSwwLjE1bDEuODYsMC4zMWwwLjE4LC0wLjAzbDEuMjUsLTAuNmwwLjc3LDAuMzdsMC4xNywwLjAzbDEuNCwtMC4ybDEuNTcsMC45NmwtMS40NSwyLjI5bDAuMjMsMC40NmwwLjYzLDAuMDVsMC42NiwwLjdsLTEuNTEsLTAuMDhsLTAuMjQsMC4xbC0wLjI3LDAuMzFsLTEuOTYsMC40NmwtMi45NSwxLjc0bC0wLjE0LDAuMjFsLTAuMTcsMS4xbC0wLjYsMC44MmwtMC4wNSwwLjIzbDAuMjEsMS4xM2wtMS4zMSwwLjYzbC0wLjE3LDAuMjdsMC4wLDAuOTFsLTAuNTMsMC4zN2wtMC4xLDAuMzdsMS4wNCwyLjI3bDEuMzEsMS40NmwtMC40NCwwLjlsMC4yNCwwLjQzbDEuNTIsMC4xM2wwLjg3LDEuMjNsMC4yNCwwLjEzbDIuMjEsMC4wN2wwLjE4LC0wLjA2bDEuNTUsLTEuMTNsLTAuMTQsMy4yMmwwLjIzLDAuM2wxLjE0LDAuMjlsMC4xNiwtMC4wbDEuMTgsLTAuMzZsMS45NywzLjcxbC0wLjQ1LDAuNzFsLTAuMDQsMC4xNGwtMC4xMiwxLjhsLTAuMDUsMi4wN2wtMC45MiwxLjJsLTAuMDMsMC4zMWwwLjM4LDAuOGwtMC40OCwwLjcybC0wLjAyLDAuM2wxLjAxLDIuMDJsLTEuNSwyLjY0WlwiLCBcIm5hbWVcIjogXCJQZXJ1XCJ9LCBcIlBLXCI6IHtcInBhdGhcIjogXCJNNjA5LjA4LDE4Ny43NmwxLjY2LDEuMjFsMC43MSwyLjExbDAuMiwwLjE5bDMuNjIsMS4wMWwtMS45OCwxLjk1bC0yLjY1LDAuNGwtMy43NSwtMC42OGwtMC4yNiwwLjA4bC0xLjIzLDEuMjJsLTAuMDcsMC4zMWwwLjg5LDIuNDZsMC44OCwxLjkybDAuMSwwLjEybDEuNjcsMS4xNGwtMS44LDEuMzVsLTAuMTIsMC4yNWwwLjA0LDEuODVsLTIuMzUsMi42N2wtMS41OSwyLjc5bC0yLjUsMi43MmwtMi43NiwtMC4ybC0wLjI0LDAuMDlsLTIuNzYsMi44M2wwLjA0LDAuNDVsMS41NCwxLjEzbDAuMjcsMS45NGwwLjA5LDAuMTdsMS4zNCwxLjI5bDAuNCwxLjgzbC01LjE0LC0wLjAxbC0wLjIyLDAuMDlsLTEuNTMsMS42M2wtMS41MiwtMC41NmwtMC43NiwtMS44OGwtMS45MywtMi4wM2wtMC4yNSwtMC4wOWwtNC42LDAuNWwtNC4wNSwwLjA1bC0zLjEsMC4zM2wwLjc3LC0yLjUzbDMuNDgsLTEuMzNsMC4xOSwtMC4zM2wtMC4yMSwtMS4yNGwtMC4xOSwtMC4yM2wtMS4wMSwtMC4zN2wtMC4wNiwtMi4xOGwtMC4xNywtMC4yNmwtMi4zMiwtMS4xNmwtMC45NiwtMS41N2wtMC41NiwtMC42NWwzLjE2LDEuMDVsMC4xNCwwLjAxbDIuNDUsLTAuNGwxLjQ0LDAuMzNsMC4zLC0wLjFsMC40LC0wLjQ3bDEuNTgsMC4yMmwwLjE0LC0wLjAxbDMuMjUsLTEuMTRsMC4yLC0wLjI3bDAuMDgsLTIuMjNsMS4yMywtMS4zOGwxLjczLDAuMGwwLjI4LC0wLjJsMC4yMiwtMC42MWwxLjY4LC0wLjMybDAuODYsMC4yNGwwLjI3LC0wLjA1bDAuOTgsLTAuNzhsMC4xMSwtMC4yNmwtMC4xMywtMS41N2wwLjk2LC0xLjUybDEuNTEsLTAuNjdsMC4xNCwtMC40MWwtMC43NCwtMS40bDEuODYsMC4wN2wwLjI2LC0wLjEzbDAuNjksLTEuMDFsMC4wNSwtMC4ybC0wLjA5LC0wLjk0bDEuMTQsLTEuMDlsMC4wOSwtMC4yOGwtMC4yOSwtMS40MWwtMC41MSwtMS4wN2wxLjIzLC0xLjA1bDIuNiwtMC41OGwyLjg2LC0wLjMzbDEuMzMsLTAuNTRsMS4zLC0wLjI5WlwiLCBcIm5hbWVcIjogXCJQYWtpc3RhblwifSwgXCJQSFwiOiB7XCJwYXRoXCI6IFwiTTczNy4xMSwyNjMuODJsMC4yNSwxLjY2bDAuMTQsMS4zNGwtMC41NCwxLjQ2bC0wLjY0LC0xLjc5bC0wLjUsLTAuMWwtMS4xNywxLjI4bC0wLjA1LDAuMzJsMC43NCwxLjcxbC0wLjQ5LDAuODFsLTIuNiwtMS4yOGwtMC42MSwtMS41N2wwLjY4LC0xLjA3bC0wLjA3LC0wLjRsLTEuNTksLTEuMTlsLTAuNDIsMC4wNmwtMC42OSwwLjkxbC0xLjAxLC0wLjA4bC0wLjIxLDAuMDZsLTEuNTgsMS4ybC0wLjE3LC0wLjNsMC44NywtMS44OGwxLjQ4LC0wLjY2bDEuMTgsLTAuODFsMC43MSwwLjkybDAuMzQsMC4xbDEuOSwtMC42OWwwLjE4LC0wLjE4bDAuMzQsLTAuOTRsMS41NywtMC4wNmwwLjI5LC0wLjMybC0wLjEsLTEuMzhsMS40MSwwLjgzbDAuMzYsMi4wNlpNNzM0Ljk0LDI1NC40MmwwLjU2LDIuMjRsLTEuNDEsLTAuNDlsLTAuNCwwLjNsMC4wNywwLjk0bDAuNTEsMS4zbC0wLjU0LDAuMjZsLTAuMDgsLTEuMzRsLTAuMjUsLTAuMjhsLTAuNTYsLTAuMWwtMC4yMywtMC45MWwxLjAzLDAuMTRsMC4zNCwtMC4zMWwtMC4wMywtMC45NmwtMC4wNiwtMC4xOGwtMS4xNCwtMS40NGwxLjYyLDAuMDRsMC41NywwLjc4Wk03MjQuNjgsMjM4LjMzbDEuNDgsMC43MWwwLjMzLC0wLjA0bDAuNDQsLTAuMzhsMC4wNSwwLjEzbC0wLjM3LDAuOTdsMC4wMSwwLjIzbDAuODEsMS43NWwtMC41OSwxLjkybC0xLjM3LDAuNzlsLTAuMTQsMC4ybC0wLjM5LDIuMDdsMC4wMSwwLjE0bDAuNTYsMi4wNGwwLjIzLDAuMjFsMS4zMywwLjI4bDAuMTQsLTAuMGwxLjAsLTAuMjdsMi44MiwxLjI4bC0wLjIsMS4xNmwwLjEyLDAuMjlsMC42NiwwLjVsLTAuMTMsMC41NmwtMS41NCwtMC45OWwtMC44OSwtMS4yOWwtMC40OSwwLjBsLTAuNDQsMC42NWwtMS4zNCwtMS4yOGwtMC4yNiwtMC4wOGwtMi4xOCwwLjM2bC0wLjk2LC0wLjQ0bDAuMDksLTAuNzJsMC42OSwtMC41N2wtMC4wMSwtMC40N2wtMC43NSwtMC41OWwtMC40NywwLjE0bC0wLjE1LDAuNDNsLTAuODYsLTEuMDJsLTAuMzQsLTEuMDJsLTAuMDcsLTEuNzRsMC40OSwwLjQxbDAuNDksLTAuMjFsMC4yNiwtMy45OWwwLjczLC0yLjFsMS4yMywwLjBaTTczMS4xMiwyNTguOTJsLTAuODIsMC43NWwtMC44MywxLjY0bC0wLjUyLDAuNWwtMS4xNywtMS4zM2wwLjM2LC0wLjQ3bDAuNjIsLTAuN2wwLjA3LC0wLjE1bDAuMjQsLTEuMzVsMC43MywtMC4wOGwtMC4zMSwxLjI5bDAuMTYsMC4zNGwwLjM3LC0wLjA5bDEuMjEsLTEuNmwtMC4xMiwxLjI0Wk03MjYuNjYsMjU1LjU4bDAuODUsMC40NWwwLjE0LDAuMDNsMS4yOCwtMC4wbC0wLjAzLDAuNjJsLTEuMDQsMC45NmwtMS4xNSwwLjU1bC0wLjA1LC0wLjcxbDAuMTcsLTEuMjZsLTAuMDEsLTAuMTNsLTAuMTYsLTAuNTFaTTcyNC45MiwyNTIuMDZsLTAuNDUsMS41bC0wLjcsLTAuODNsLTAuOTUsLTEuNDNsMS40NCwwLjA2bDAuNjcsMC43Wk03MTcuNDgsMjYxLjI4bC0xLjg3LDEuMzVsMC4yMSwtMC4zbDEuODEsLTEuNTdsMS41LC0xLjc1bDAuOTcsLTEuODRsMC4yMywxLjA4bC0xLjU2LDEuMzNsLTEuMjksMS43WlwiLCBcIm5hbWVcIjogXCJQaGlsaXBwaW5lc1wifSwgXCJQTFwiOiB7XCJwYXRoXCI6IFwiTTQ1OC44LDE0NC4yNWwtMC45NiwtMS45OGwwLjE4LC0xLjA2bC0wLjAxLC0wLjE1bC0wLjYyLC0xLjhsLTAuODIsLTEuMTFsMC41NiwtMC43M2wwLjA1LC0wLjI4bC0wLjUxLC0xLjUxbDEuNDgsLTAuODdsMy44OCwtMS41OGwzLjA2LC0xLjE0bDIuMjMsMC41MmwwLjE1LDAuNjZsMC4yOSwwLjIzbDIuNCwwLjA0bDMuMTEsMC4zOWw0LjU2LC0wLjA1bDEuMTIsMC4zMmwwLjUxLDAuODlsMC4xLDEuNDVsMC4wMywwLjEybDAuNjYsMS4yM2wtMC4wMSwxLjA4bC0xLjMzLDAuNjFsLTAuMTQsMC40MWwwLjc0LDEuNWwwLjA3LDEuNTNsMS4yMiwyLjc5bC0wLjE5LDAuNjZsLTEuMDksMC4zM2wtMC4xNCwwLjA5bC0yLjI3LDIuNzJsLTAuMDQsMC4zMWwwLjM1LDAuOGwtMi4yMiwtMS4xNmwtMC4yMSwtMC4wMmwtMS43MiwwLjQ0bC0xLjEsLTAuMzFsLTAuMjEsMC4wMmwtMS4zLDAuNjFsLTEuMTEsLTEuMDJsLTAuMzIsLTAuMDVsLTAuODEsMC4zNWwtMS4xNSwtMS42MWwtMC4yMSwtMC4xMmwtMS42NSwtMC4xN2wtMC4xOSwtMC44MmwtMC4yMywtMC4yM2wtMS43MiwtMC4zN2wtMC4zNCwwLjE3bC0wLjI1LDAuNTZsLTAuODgsLTAuNDRsMC4xMiwtMC42OWwtMC4yNSwtMC4zNWwtMS43OCwtMC4yN2wtMS4wOCwtMC45N1pcIiwgXCJuYW1lXCI6IFwiUG9sYW5kXCJ9LCBcIlpNXCI6IHtcInBhdGhcIjogXCJNNTAyLjgxLDMwOC4zMmwxLjA5LDEuMDRsMC41OCwxLjk0bC0wLjM5LDAuNjZsLTAuNSwyLjA1bC0wLjAsMC4xNGwwLjQ1LDEuOTVsLTAuNjksMC43N2wtMC4wNiwwLjExbC0wLjc2LDIuMzdsMC4xNSwwLjM2bDAuNjIsMC4zMWwtNi44NSwxLjlsLTAuMjIsMC4zM2wwLjIsMS41NGwtMS42MiwwLjNsLTAuMTIsMC4wNWwtMS40MywxLjAybC0wLjExLDAuMTVsLTAuMjUsMC43M2wtMC43MywwLjE3bC0wLjE0LDAuMDhsLTIuMTgsMi4xMmwtMS4zMywxLjZsLTAuNjUsMC4wNWwtMC44MywtMC4yOWwtMi43NSwtMC4yOGwtMC4yNCwtMC4xbC0wLjE1LC0wLjI3bC0wLjk5LC0wLjU4bC0wLjEyLC0wLjA0bC0xLjczLC0wLjE0bC0xLjg4LDAuNTRsLTEuNSwtMS40OGwtMS42MSwtMi4wMWwwLjExLC03LjczbDQuOTIsMC4wM2wwLjI5LC0wLjM3bC0wLjE5LC0wLjc5bDAuMzQsLTAuODZsMC4wLC0wLjIxbC0wLjQxLC0xLjExbDAuMjYsLTEuMTRsLTAuMDEsLTAuMTZsLTAuMTIsLTAuMzZsMC4xOCwwLjAxbDAuMSwwLjU2bDAuMzEsMC4yNWwxLjE0LC0wLjA2bDEuNDQsMC4yMWwwLjc2LDEuMDVsMC4xOSwwLjEybDIuMDEsMC4zNWwwLjE5LC0wLjAzbDEuMjQsLTAuNjVsMC40NCwxLjAzbDAuMjIsMC4xOGwxLjgxLDAuMzRsMC44NSwwLjk5bDEuMDIsMS4zOWwwLjI0LDAuMTJsMS45MiwwLjAybDAuMywtMC4zMmwtMC4yMSwtMi43NGwtMC40NywtMC4yM2wtMC41MywwLjM2bC0xLjU4LC0wLjg5bC0wLjUxLC0wLjM0bDAuMjksLTIuMzZsMC40NCwtMi45OWwtMC4wMywtMC4xOGwtMC41LC0wLjk5bDAuNjEsLTEuMzhsMC41MywtMC4yNGwzLjI2LC0wLjQxbDAuODksMC4yM2wxLjAxLDAuNjJsMS4wNCwwLjQ0bDEuNiwwLjQzbDEuMzUsMC43MlpcIiwgXCJuYW1lXCI6IFwiWmFtYmlhXCJ9LCBcIkVFXCI6IHtcInBhdGhcIjogXCJNNDgyLjE5LDEyMC44OGwwLjIzLC0xLjY4bC0wLjQzLC0wLjMxbC0wLjc1LDAuMzdsLTEuMzQsLTEuMWwtMC4xOCwtMS43NWwyLjkyLC0wLjk1bDMuMDcsLTAuNTNsMi42NiwwLjZsMi40OCwtMC4xbDAuMTgsMC4zMWwtMS42NSwxLjk2bC0wLjA2LDAuMjZsMC43MSwzLjI1bC0wLjg4LDAuOTRsLTEuODUsLTAuMDFsLTIuMDgsLTEuM2wtMS4xNCwtMC40N2wtMC4yLC0wLjAxbC0xLjY5LDAuNTFaXCIsIFwibmFtZVwiOiBcIkVzdG9uaWFcIn0sIFwiRUdcIjoge1wicGF0aFwiOiBcIk01MDguMDcsMjA4LjhsLTAuNjYsMS4wNmwtMC41MywyLjAzbC0wLjY0LDEuMzJsLTAuMzIsMC4yNmwtMS43NCwtMS44NWwtMS43NywtMy44NmwtMC40OCwtMC4wOWwtMC4yNiwwLjI1bC0wLjA3LDAuMzJsMS4wNCwyLjg4bDEuNTUsMi43NmwxLjg5LDQuMThsMC45NCwxLjQ4bDAuODMsMS41NGwyLjA4LDIuNzNsLTAuMywwLjI4bC0wLjEsMC4yM2wwLjA4LDEuNzJsMC4xMSwwLjIybDIuOTEsMi4zN2wtMjguNzgsMC4wbDAuMCwtMTkuMDZsLTAuNzMsLTIuMmwwLjYxLC0xLjU5bDAuMCwtMC4ybC0wLjM0LC0xLjA0bDAuNzMsLTEuMDhsMy4xMywtMC4wNGwyLjM2LDAuNzJsMi40OCwwLjgxbDEuMTUsMC40M2wwLjIzLC0wLjAxbDEuOTMsLTAuODdsMS4wMiwtMC43OGwyLjA4LC0wLjIxbDEuNTksMC4zMWwwLjYyLDEuMjRsMC41MiwwLjAzbDAuNDYsLTAuNzFsMS44NiwwLjU5bDEuOTUsMC4xNmwwLjE3LC0wLjA0bDAuOTIsLTAuNTJsMS40OCw0LjI0WlwiLCBcIm5hbWVcIjogXCJFZ3lwdFwifSwgXCJaQVwiOiB7XCJwYXRoXCI6IFwiTTQ2Ny4wNiwzNzMuMjdsLTAuMTMsLTAuMjlsMC4wMSwtMS41OGwtMC4wMiwtMC4xMmwtMC43MSwtMS42NGwwLjU5LC0wLjM3bDAuMTQsLTAuMjZsLTAuMDcsLTIuMTNsLTAuMDUsLTAuMTVsLTEuNjMsLTIuNThsLTEuMjUsLTIuMzFsLTEuNzEsLTMuMzdsMC44OCwtMC45OGwwLjcsMC41MmwwLjM5LDEuMDhsMC4yMywwLjE5bDEuMSwwLjE5bDEuNTUsMC41MWwwLjE0LDAuMDFsMS4zNSwtMC4ybDAuMTEsLTAuMDRsMi4yNCwtMS4zOWwwLjE0LC0wLjI1bDAuMCwtOS40bDAuMTYsMC4wOWwxLjM5LDIuMzhsLTAuMjIsMS41M2wwLjA0LDAuMTlsMC41NiwwLjk0bDAuMywwLjE0bDEuNzksLTAuMjdsMC4xNiwtMC4wOGwxLjIzLC0xLjE4bDEuMTcsLTAuNzlsMC4xLC0wLjEybDAuNTcsLTEuMTlsMS4wMiwtMC41MmwwLjksMC4yOGwxLjE2LDAuNzNsMC4xNCwwLjA1bDIuMDQsMC4xM2wwLjEzLC0wLjAybDEuNiwtMC42MmwwLjE4LC0wLjE5bDAuNjMsLTEuOTNsMS4xOCwtMC4xOWwwLjE5LC0wLjEybDAuNzgsLTEuMDVsMC44MSwtMS43MWwyLjE4LC0xLjkxbDMuNDQsLTEuODhsMC44OSwwLjAybDEuMTcsMC40M2wwLjIxLC0wLjBsMC43NiwtMC4yOWwxLjA3LDAuMjFsMS4xNSwzLjU1bDAuNjMsMS44MmwtMC40NCwyLjlsMC4xLDAuNTJsLTAuNzQsLTAuMjlsLTAuMTgsLTAuMDFsLTAuNzIsMC4xOWwtMC4yMSwwLjJsLTAuMjIsMC43NGwtMC42NiwwLjk3bC0wLjA1LDAuMThsMC4wMiwwLjkzbDAuMDksMC4yMWwxLjQ5LDEuNDZsMC4yNywwLjA4bDEuNDcsLTAuMjlsMC4yMiwtMC4xOGwwLjQzLC0xLjAxbDEuMjksMC4wMmwtMC41MSwxLjYzbC0wLjI5LDIuMmwtMC41OSwxLjEybC0yLjIsMS43OGwtMS4wNiwxLjM5bC0wLjcyLDEuNDRsLTEuMzksMS45M2wtMi44MSwyLjg0bC0xLjc1LDEuNjVsLTEuODUsMS4yNGwtMi41NSwxLjA2bC0xLjIzLDAuMTRsLTAuMjQsMC4xOGwtMC4yMiwwLjU0bC0xLjI3LC0wLjM1bC0wLjIsMC4wMWwtMS4xNSwwLjVsLTIuNjIsLTAuNTJsLTAuMTIsMC4wbC0xLjQ2LDAuMzNsLTAuOTgsLTAuMTRsLTAuMTYsMC4wMmwtMi41NSwxLjFsLTIuMTEsMC40NGwtMS41OSwxLjA3bC0wLjkzLDAuMDZsLTAuOTcsLTAuOTJsLTAuMTksLTAuMDhsLTAuNzIsLTAuMDRsLTEuMCwtMS4xNmwtMC4yNSwwLjA1Wk00OTMuNzIsMzU5LjI0bC0xLjEyLC0wLjg2bC0wLjMxLC0wLjAzbC0xLjIzLDAuNTlsLTEuMzYsMS4wN2wtMS4zOSwxLjc4bDAuMDEsMC4zOGwxLjg4LDIuMTFsMC4zMSwwLjA5bDAuOSwtMC4yN2wwLjE4LC0wLjE1bDAuNCwtMC43N2wxLjI4LC0wLjM5bDAuMTgsLTAuMTZsMC40MiwtMC44OGwwLjc2LC0xLjMybC0wLjA1LC0wLjM3bC0wLjg3LC0wLjgyWlwiLCBcIm5hbWVcIjogXCJTb3V0aCBBZnJpY2FcIn0sIFwiRUNcIjoge1wicGF0aFwiOiBcIk0yMjAuMiwyOTMuNDhsMS4yNSwtMS43NmwwLjAyLC0wLjMxbC0wLjU0LC0xLjA5bC0wLjUsLTAuMDZsLTAuNzgsMC45NGwtMS4wMywtMC43NWwwLjMzLC0wLjQ2bDAuMDUsLTAuMjNsLTAuMzgsLTIuMDRsMC42NiwtMC4yOGwwLjE3LC0wLjE5bDAuNDUsLTEuNTJsMC45MywtMS41OGwwLjA0LC0wLjJsLTAuMTMsLTAuNzhsMS4xOSwtMC40N2wxLjU3LC0wLjkxbDIuMzUsMS4zNGwwLjE3LDAuMDRsMC4yOCwtMC4wMmwwLjUyLDAuOTFsMC4yMSwwLjE1bDIuMTIsMC4zNWwwLjIsLTAuMDNsMC41NSwtMC4zMWwxLjA4LDAuNzNsMC45NywwLjU0bDAuMzEsMS42N2wtMC43MSwxLjQ5bC0yLjY0LDIuNTRsLTIuOTUsMC45N2wtMC4xNSwwLjExbC0xLjUzLDIuMThsLTAuNDksMS42OGwtMS4xLDAuOGwtMC44NywtMS4wNWwtMC4xNSwtMC4xbC0xLjAxLC0wLjI3bC0wLjEzLC0wLjBsLTAuNywwLjE0bC0wLjAzLC0wLjQzbDAuNiwtMC41bDAuMSwtMC4zMWwtMC4yNiwtMC45MVpcIiwgXCJuYW1lXCI6IFwiRWN1YWRvclwifSwgXCJBTFwiOiB7XCJwYXRoXCI6IFwiTTQ3MC4yNywxNzEuN2wwLjM4LDAuMTlsMC40NSwtMC4xOGwwLjQsMC42MWwwLjExLDAuMWwwLjQ2LDAuMjRsMC4xMywwLjg3bC0wLjMsMC45NWwtMC4wLDAuMTdsMC4zNiwxLjI4bDAuMTIsMC4xN2wwLjksMC42M2wtMC4wMywwLjQ0bC0wLjY3LDAuMzVsLTAuMTYsMC4yMmwtMC4xNCwwLjg4bC0wLjk2LDEuMThsLTAuMDYsLTAuMDNsLTAuMDQsLTAuNDhsLTAuMTIsLTAuMjJsLTEuMjgsLTAuOTJsLTAuMTksLTEuMjVsMC4yLC0xLjk2bDAuMzMsLTAuODlsLTAuMDYsLTAuM2wtMC4zNiwtMC40MWwtMC4xMywtMC43NWwwLjY2LC0wLjlaXCIsIFwibmFtZVwiOiBcIkFsYmFuaWFcIn0sIFwiQU9cIjoge1wicGF0aFwiOiBcIk00NjEuNjIsMjk5LjkzbDAuNTUsMS42N2wwLjczLDEuNTRsMS41NiwyLjE4bDAuMjgsMC4xMmwxLjY2LC0wLjJsMC44MSwtMC4zNGwxLjI4LDAuMzNsMC4zMywtMC4xNGwwLjM5LC0wLjY3bDAuNTYsLTEuM2wxLjM3LC0wLjA5bDAuMjcsLTAuMjFsMC4wNywtMC4yM2wwLjY3LC0wLjAxbC0wLjEzLDAuNTNsMC4yOSwwLjM3bDIuNzQsLTAuMDJsMC4wNCwxLjI5bDAuMDMsMC4xM2wwLjQ2LDAuODdsLTAuMzUsMS41MmwwLjE4LDEuNTVsMC4wNywwLjE2bDAuNzUsMC44NWwtMC4xMywyLjg5bDAuNDEsMC4yOWwwLjU2LC0wLjIxbDEuMTEsMC4wNWwxLjUsLTAuMzdsMC45LDAuMTJsMC4xOCwwLjUzbC0wLjI3LDEuMTVsMC4wMSwwLjE3bDAuNCwxLjA4bC0wLjMzLDAuODVsLTAuMDEsMC4xOGwwLjEyLDAuNTFsLTQuODMsLTAuMDNsLTAuMywwLjNsLTAuMTIsOC4xM2wwLjA3LDAuMTlsMS42OSwyLjFsMS4yNywxLjI1bC00LjAzLDAuOTJsLTUuOTMsLTAuMzZsLTEuNjYsLTEuMTlsLTAuMTgsLTAuMDZsLTEwLjE1LDAuMTFsLTAuMzQsMC4xM2wtMS4zNSwtMS4wNWwtMC4xNywtMC4wNmwtMS42MiwtMC4wOGwtMS42LDAuNDVsLTAuODgsMC4zNmwtMC4xNywtMS4ybDAuMzQsLTIuMTlsMC44NSwtMi4zMmwwLjE0LC0xLjEzbDAuNzksLTIuMjRsMC41NywtMS4wbDEuNDIsLTEuNjRsMC44MiwtMS4xNWwwLjA1LC0wLjEzbDAuMjYsLTEuODhsLTAuMTMsLTEuNTFsLTAuMDcsLTAuMTZsLTAuNzIsLTAuODdsLTEuMjMsLTIuOTFsMC4wOSwtMC4zN2wwLjczLC0wLjk1bDAuMDUsLTAuMjdsLTEuMjcsLTQuMTJsLTEuMTksLTEuNTRsMC4xLC0wLjJsMC44NiwtMC4yOGwwLjc4LDAuMDNsMC44MywtMC4yOWw3LjEyLDAuMDNaTTQ1MS44MSwyOTguOTRsLTAuMTcsMC4wN2wtMC41LC0xLjQybDAuODUsLTAuOTJsMC41MywtMC4yOWwwLjQ4LDAuNDRsLTAuNTYsMC4zMmwtMC4xLDAuMWwtMC40MSwwLjY1bC0wLjA1LDAuMTRsLTAuMDcsMC45MVpcIiwgXCJuYW1lXCI6IFwiQW5nb2xhXCJ9LCBcIktaXCI6IHtcInBhdGhcIjogXCJNNTk4LjQyLDE3Mi4wOGwtMS4zNywwLjU0bC0zLjMsMi4wOWwtMC4xMSwwLjEybC0xLjAxLDEuOTdsLTAuNTYsMC4wMWwtMC42LC0xLjI0bC0wLjI2LC0wLjE3bC0yLjk1LC0wLjA5bC0wLjQ2LC0yLjIybC0wLjI5LC0wLjI0bC0wLjkxLC0wLjAybDAuMTcsLTIuNzJsLTAuMTIsLTAuMjZsLTMuMCwtMi4yMmwtMC4yLC0wLjA2bC00LjI5LDAuMjRsLTIuOCwwLjQybC0yLjM2LC0yLjdsLTYuNCwtMy42NWwtMC4yMywtMC4wM2wtNi40NSwxLjgzbC0wLjIyLDAuMjlsMC4xLDEwLjk0bC0wLjg0LDAuMWwtMS42NSwtMi4yMWwtMC4xMSwtMC4wOWwtMS42OSwtMC44NGwtMC4yLC0wLjAybC0yLjg0LDAuNjNsLTAuMTQsMC4wN2wtMC43MSwwLjY0bC0wLjAyLC0wLjExbDAuNTcsLTEuMTdsMC4wLC0wLjI2bC0wLjQ4LC0xLjA1bC0wLjE3LC0wLjE2bC0yLjc4LC0wLjk5bC0xLjA4LC0yLjYybC0wLjEzLC0wLjE1bC0xLjI0LC0wLjdsLTAuMDQsLTAuNDhsMi4wNywwLjI1bDAuMzQsLTAuMjlsMC4wOSwtMi4wM2wxLjg0LC0wLjQ0bDIuMTIsMC40NWwwLjM2LC0wLjI1bDAuNDUsLTMuMDRsLTAuNDUsLTIuMDZsLTAuMzEsLTAuMjNsLTIuNDQsMC4xNWwtMi4wNywtMC43NWwtMC4yMywwLjAxbC0yLjg4LDEuMzhsLTIuMjEsMC42MmwtMC45NiwtMC4zOGwwLjIyLC0xLjM5bC0wLjA2LC0wLjIzbC0xLjYsLTIuMTJsLTAuMjUsLTAuMTJsLTEuNzIsMC4wOGwtMS44NywtMS45MWwxLjMzLC0yLjI0bC0wLjA2LC0wLjM4bC0wLjU1LC0wLjVsMS43MiwtMy4wOGwyLjMsMS43bDAuNDgsLTAuMmwwLjI5LC0yLjI2bDQuOTksLTMuNDhsMy43NiwtMC4wOGw1LjQ2LDIuMjdsMi45NiwxLjMzbDAuMjYsLTAuMDFsMi41OSwtMS4zNmwzLjgyLC0wLjA2bDMuMTMsMS42N2wwLjM4LC0wLjA5bDAuNjMsLTAuODVsMy4zNiwwLjE0bDAuMjksLTAuMTlsMC42MywtMS41N2wtMC4xMywtMC4zN2wtMy42NCwtMi4wNWwyLjAsLTEuMzZsMC4xLC0wLjM4bC0wLjMyLC0wLjYybDIuMDksLTAuNzZsMC4xMywtMC40N2wtMS42NSwtMi4xM2wwLjg5LC0wLjkxbDkuMjcsLTEuMThsMC4xMywtMC4wNWwxLjE3LC0wLjgybDYuMiwtMS4yN2wyLjI2LC0xLjQzbDQuMTksMC43bDAuNzQsMy4zOWwwLjM4LDAuMjJsMi41MiwtMC44MWwyLjksMS4wNmwtMC4xOCwxLjYzbDAuMzIsMC4zM2wyLjUyLC0wLjIzbDUuMCwtMi41OGwwLjAzLDAuMzlsMy4xNiwyLjYybDUuNTcsOC40OGwwLjQ5LDAuMDJsMS4xOCwtMS41M2wzLjIyLDEuNzhsMC4yMSwwLjAzbDMuNSwtMC44M2wxLjIxLDAuNTJsMS4xNiwxLjgybDAuMTUsMC4xMmwxLjY3LDAuNjFsMS4wMSwxLjMybDAuMjgsMC4xMWwzLjA0LC0wLjQxbDEuMSwxLjY0bC0xLjY4LDEuODlsLTEuOTcsMC4yOGwtMC4yNiwwLjI5bC0wLjEyLDMuMDlsLTEuMiwxLjIzbC00LjgxLC0xLjAxbC0wLjM1LDAuMmwtMS43Nyw1LjUxbC0xLjE0LDAuNjJsLTQuOTIsMS4yM2wtMC4yLDAuNDFsMi4xNCw1LjA2bC0xLjQ1LDAuNjdsLTAuMTcsMC4zMWwwLjE1LDEuMjhsLTEuMDUsLTAuM2wtMS4yMSwtMS4wNGwtMC4xNywtMC4wN2wtMy43MywtMC4zMmwtNC4xNSwtMC4wOGwtMC45MiwwLjMxbC0zLjQ2LC0xLjI0bC0wLjIyLDAuMDFsLTEuNDIsMC42M2wtMC4xNywwLjIxbC0wLjMyLDEuNDlsLTMuODIsLTAuOTdsLTAuMTUsMC4wbC0xLjY1LDAuNDNsLTAuMiwwLjE3bC0wLjUxLDEuMjFaXCIsIFwibmFtZVwiOiBcIkthemFraHN0YW5cIn0sIFwiRVRcIjoge1wicGF0aFwiOiBcIk01MTYuMCwyNDcuNjNsMS4yMSwwLjkybDAuMywwLjA0bDEuMywtMC41M2wwLjQ2LDAuNDFsMC4xOSwwLjA4bDEuNjUsMC4wM2wyLjA1LDAuOTZsMC42NywwLjg4bDEuMDcsMC43OWwxLjAsMS40NWwwLjcsMC42OGwtMC43MiwwLjkybC0wLjg1LDEuMTlsLTAuMDQsMC4yNWwwLjE5LDAuNjdsMC4wNCwwLjc0bDAuMjksMC4yOGwxLjQsMC4wNGwwLjU1LC0wLjE1bDAuMjMsMC4xOWwtMC40MSwwLjY3bDAuMDEsMC4zMmwwLjkyLDEuMzlsMC45MywxLjIzbDAuOTksMC45NGwwLjEsMC4wNmw4LjE5LDIuOTlsMS41MSwwLjAxbC02LjUxLDYuOTVsLTMuMTQsMC4xMWwtMC4xOCwwLjA2bC0yLjE1LDEuNzFsLTEuNTEsMC4wNGwtMC4yMiwwLjFsLTAuNiwwLjY5bC0xLjQ2LC0wLjBsLTAuOTMsLTAuNzhsLTAuMzIsLTAuMDRsLTIuMjksMS4wNWwtMC4xMiwwLjFsLTAuNjQsMC45bC0xLjQ0LC0wLjE3bC0wLjUxLC0wLjI2bC0wLjE3LC0wLjAzbC0wLjU2LDAuMDdsLTAuNjgsLTAuMDJsLTMuMSwtMi4wOGwtMC4xNywtMC4wNWwtMS42MiwwLjBsLTAuNjgsLTAuNjVsMC4wLC0xLjI4bC0wLjIxLC0wLjI5bC0xLjE5LC0wLjM4bC0xLjQyLC0yLjYzbC0wLjEzLC0wLjEybC0xLjA1LC0wLjUzbC0wLjQ2LC0xLjBsLTEuMjcsLTEuMjNsLTAuMTcsLTAuMDhsLTEuMDgsLTAuMTNsMC41MywtMC45bDEuMTcsLTAuMDVsMC4yNiwtMC4xN2wwLjM3LC0wLjc3bDAuMDMsLTAuMTRsLTAuMDMsLTIuMjNsMC43LC0yLjQ5bDEuMDgsLTAuNjVsMC4xNCwtMC4xOWwwLjI0LC0xLjBsMS4wMywtMS44NWwxLjQ3LC0xLjIybDAuMDksLTAuMTJsMS4wMiwtMi41MWwwLjM2LC0xLjk2bDIuNjIsMC40OGwwLjMzLC0wLjE4bDAuNjMsLTEuNTVaXCIsIFwibmFtZVwiOiBcIkV0aGlvcGlhXCJ9LCBcIlpXXCI6IHtcInBhdGhcIjogXCJNNDk4Ljk1LDM0MS4ybC0xLjE2LC0wLjIzbC0wLjE2LDAuMDFsLTAuNzQsMC4yOGwtMS4xMSwtMC40MWwtMS4wMiwtMC4wNGwtMS41MiwtMS4xM2wtMC4xMiwtMC4wNWwtMS43OSwtMC4zN2wtMC42NSwtMS40NmwtMC4wMSwtMC44NmwtMC4yMiwtMC4yOWwtMC45OSwtMC4yNmwtMi43NCwtMi43N2wtMC43NywtMS40NmwtMC41MiwtMC41bC0wLjcyLC0xLjU0bDIuMjQsMC4yM2wwLjc4LDAuMjhsMC4xMiwwLjAybDAuODUsLTAuMDZsMC4yMSwtMC4xMWwxLjM4LC0xLjY2bDIuMTEsLTIuMDVsMC44MSwtMC4xOGwwLjIyLC0wLjJsMC4yNywtMC44bDEuMjksLTAuOTNsMS41MywtMC4yOGwwLjExLDAuNjZsMC4zLDAuMjVsMi4wMiwtMC4wNWwxLjA0LDAuNDhsMC41LDAuNTlsMC4xOCwwLjFsMS4xMywwLjE4bDEuMTEsMC43bDAuMDEsMy4wNmwtMC40OSwxLjgybC0wLjExLDEuOTRsMC4wMywwLjE2bDAuMzUsMC42OGwtMC4yNCwxLjNsLTAuMjcsMC4xN2wtMC4xMiwwLjE1bC0wLjY0LDEuODNsLTIuNDksMi44WlwiLCBcIm5hbWVcIjogXCJaaW1iYWJ3ZVwifSwgXCJFU1wiOiB7XCJwYXRoXCI6IFwiTTM5OC42NywxNzIuOGwwLjA5LC0xLjQ1bC0wLjA2LC0wLjJsLTAuODIsLTEuMDVsMy4xNiwtMS45NmwzLjAxLDAuNTRsMy4zMywtMC4wMmwyLjY0LDAuNTJsMi4xNCwtMC4xNWwzLjksMC4xbDAuOTEsMS4wOGwwLjE0LDAuMDlsNC42MSwxLjM4bDAuMjYsLTAuMDRsMC43NywtMC41NWwyLjY2LDEuMjlsMC4xNywwLjAzbDIuNTksLTAuMzVsMC4xLDEuMjhsLTIuMiwxLjg1bC0zLjEzLDAuNjJsLTAuMjMsMC4yM2wtMC4yMSwwLjkybC0xLjU0LDEuNjhsLTAuOTcsMi40bDAuMDIsMC4yNmwwLjg1LDEuNDZsLTEuMjcsMS4xNGwtMC4wOSwwLjE0bC0wLjUsMS43M2wtMS43MywwLjUzbC0wLjE1LDAuMWwtMS42OCwyLjFsLTMuMDMsMC4wNGwtMi4zOCwtMC4wNWwtMC4xNywwLjA1bC0xLjU3LDEuMDFsLTAuOSwxLjAxbC0wLjk2LC0wLjE5bC0wLjgyLC0wLjg2bC0wLjY5LC0xLjZsLTAuMjIsLTAuMThsLTIuMTQsLTAuNDFsLTAuMTMsLTAuNjJsMC44MywtMC45N2wwLjM5LC0wLjg2bC0wLjA2LC0wLjMzbC0wLjczLC0wLjczbDAuNjMsLTEuNzRsLTAuMDIsLTAuMjVsLTAuOCwtMS40MWwwLjY5LC0wLjE1bDAuMjMsLTAuMjdsMC4wOSwtMS4yOWwwLjMzLC0wLjM2bDAuMDgsLTAuMmwwLjAzLC0yLjE2bDEuMDMsLTAuNzJsMC4xLC0wLjM3bC0wLjcsLTEuNWwtMC4yNSwtMC4xN2wtMS40NiwtMC4xMWwtMC4yMiwwLjA3bC0wLjM0LDAuM2wtMS4xNywwLjBsLTAuNTUsLTEuMjlsLTAuMzksLTAuMTZsLTEuMDIsMC40NGwtMC40NSwwLjM2WlwiLCBcIm5hbWVcIjogXCJTcGFpblwifSwgXCJFUlwiOiB7XCJwYXRoXCI6IFwiTTUyNy4xNSwyNTMuMDVsLTAuNzcsLTAuNzRsLTEuMDEsLTEuNDdsLTEuMTQsLTAuODZsLTAuNjIsLTAuODRsLTAuMTEsLTAuMDlsLTIuMTgsLTEuMDJsLTAuMTIsLTAuMDNsLTEuNjEsLTAuMDNsLTAuNTIsLTAuNDZsLTAuMzEsLTAuMDVsLTEuMzEsMC41NGwtMS4zOCwtMS4wNmwtMC40NiwwLjEybC0wLjY5LDEuNjhsLTIuNDksLTAuNDZsLTAuMiwtMC43NmwxLjA2LC0zLjY5bDAuMjQsLTEuNjVsMC42NiwtMC42NmwxLjc2LC0wLjRsMC4xNiwtMC4xbDAuOTcsLTEuMTNsMS4yNCwyLjU1bDAuNjgsMi4zNGwwLjA5LDAuMTRsMS40LDEuMjdsMy4zOSwyLjRsMS4zNywxLjQzbDIuMTQsMi4zNGwwLjk0LDAuNmwtMC4zMiwwLjI2bC0wLjg1LC0wLjE3WlwiLCBcIm5hbWVcIjogXCJFcml0cmVhXCJ9LCBcIk1FXCI6IHtcInBhdGhcIjogXCJNNDY5LjA1LDE3Mi45bC0wLjU3LC0wLjhsLTAuMSwtMC4wOWwtMC44MiwtMC40NmwwLjE2LC0wLjMzbDAuMzUsLTEuNTdsMC43MiwtMC42MmwwLjI3LC0wLjE2bDAuNDgsMC4zOGwwLjM1LDAuNGwwLjEyLDAuMDhsMC43OSwwLjMybDAuNjYsMC40M2wtMC40MywwLjYybC0wLjI4LDAuMTFsLTAuMDcsLTAuMjVsLTAuNTMsLTAuMWwtMS4wOSwxLjQ5bC0wLjA1LDAuMjNsMC4wNiwwLjMyWlwiLCBcIm5hbWVcIjogXCJNb250ZW5lZ3JvXCJ9LCBcIk1EXCI6IHtcInBhdGhcIjogXCJNNDg4LjIsMTUzLjc1bDAuMTQsLTAuMTFsMS40OSwtMC4yOGwxLjc1LDAuOTVsMS4wNiwwLjE0bDAuOTIsMC43bC0wLjE1LDAuOWwwLjE1LDAuMzFsMC44LDAuNDZsMC4zMywxLjJsMC4wOSwwLjE0bDAuNzIsMC42NmwtMC4xMSwwLjI4bDAuMSwwLjMzbC0wLjA2LDAuMDJsLTEuMjUsLTAuMDhsLTAuMTcsLTAuMjlsLTAuMzksLTAuMTJsLTAuNTIsMC4yNWwtMC4xNiwwLjM2bDAuMTMsMC40MmwtMC42LDAuODhsLTAuNDMsMS4wM2wtMC4yMiwwLjEybC0wLjMyLC0xLjBsMC4yNSwtMS4zNGwtMC4wOCwtMS4zOGwtMC4wNiwtMC4xN2wtMS40MywtMS44N2wtMC44MSwtMS4zNmwtMC43OCwtMC45NWwtMC4xMiwtMC4wOWwtMC4yOSwtMC4xMlpcIiwgXCJuYW1lXCI6IFwiTW9sZG92YVwifSwgXCJNR1wiOiB7XCJwYXRoXCI6IFwiTTU0NC43NywzMTYuNDVsMC42NCwxLjA0bDAuNiwxLjYybDAuNCwzLjA0bDAuNjMsMS4yMWwtMC4yMiwxLjA3bC0wLjE1LDAuMjZsLTAuNTksLTEuMDVsLTAuNTIsLTAuMDFsLTAuNDcsMC43NmwtMC4wNCwwLjIzbDAuNDYsMS44NGwtMC4xOSwwLjkybC0wLjYxLDAuNTNsLTAuMSwwLjIxbC0wLjE2LDIuMTVsLTAuOTcsMi45OGwtMS4yNCwzLjU5bC0xLjU1LDQuOTdsLTAuOTYsMy42N2wtMS4wOCwyLjkzbC0xLjk0LDAuNjFsLTIuMDUsMS4wNmwtMy4yLC0xLjUzbC0wLjYyLC0xLjI2bC0wLjE4LC0yLjM5bC0wLjg3LC0yLjA3bC0wLjIyLC0xLjhsMC40LC0xLjY5bDEuMDEsLTAuNGwwLjE5LC0wLjI4bDAuMDEsLTAuNzlsMS4xNSwtMS45MWwwLjA0LC0wLjExbDAuMjMsLTEuNjZsLTAuMDMsLTAuMTdsLTAuNTcsLTEuMjFsLTAuNDYsLTEuNThsLTAuMTksLTIuMjVsMC44MiwtMS4zNmwwLjMzLC0xLjUxbDEuMTEsLTAuMWwxLjQsLTAuNTNsMC45LC0wLjQ1bDEuMDMsLTAuMDNsMC4yMSwtMC4wOWwxLjQxLC0xLjQ1bDIuMTIsLTEuNjVsMC43NSwtMS4yOWwwLjAzLC0wLjI0bC0wLjE3LC0wLjU2bDAuNTMsMC4xNWwwLjMyLC0wLjFsMS4zOCwtMS43N2wwLjA2LC0wLjE4bDAuMDQsLTEuNDRsMC41NCwtMC43NGwwLjYyLDAuNzdaXCIsIFwibmFtZVwiOiBcIk1hZGFnYXNjYXJcIn0sIFwiTUFcIjoge1wicGF0aFwiOiBcIk0zNzguNjYsMjMwLjEzbDAuMDcsLTAuNzVsMC45MywtMC43MmwwLjgyLC0xLjM3bDAuMDQsLTAuMjFsLTAuMTQsLTAuOGwwLjgsLTEuNzRsMS4zMywtMS42MWwwLjc5LC0wLjRsMC4xNCwtMC4xNWwwLjY2LC0xLjU1bDAuMDgsLTEuNDZsMC44MywtMS41MmwxLjYsLTAuOTRsMC4xMSwtMC4xMWwxLjU2LC0yLjcxbDEuMiwtMC45OWwyLjI0LC0wLjI5bDAuMTcsLTAuMDhsMS45NSwtMS44M2wxLjMsLTAuNzdsMi4wOSwtMi4yOGwwLjA3LC0wLjI2bC0wLjYxLC0zLjM0bDAuOTIsLTIuM2wwLjMzLC0xLjQ0bDEuNTIsLTEuNzlsMi40OCwtMS4yN2wxLjg2LC0xLjE2bDAuMSwtMC4xMWwxLjY3LC0yLjkzbDAuNzIsLTEuNTlsMS41NCwwLjAxbDEuNDMsMS4xNGwwLjIxLDAuMDZsMi4zMywtMC4xOWwyLjU1LDAuNjJsMC45NywwLjAzbDAuODMsMS42bDAuMTUsMS43MWwwLjg2LDIuOTZsMC4wOSwwLjE0bDAuNSwwLjQ1bC0wLjMxLDAuNzNsLTMuMTEsMC40NGwtMC4xNiwwLjA3bC0xLjA3LDAuOTdsLTEuMzYsMC4yM2wtMC4yNSwwLjI4bC0wLjEsMS44NWwtMi43NCwxLjAybC0wLjE0LDAuMTFsLTAuOSwxLjNsLTEuOTMsMC42OWwtMi41NiwwLjQ0bC00LjA0LDIuMDFsLTAuMTcsMC4yN2wwLjAyLDIuOTFsLTAuMDgsMC4wbC0wLjMsMC4zMWwwLjA1LDEuMTVsLTEuMjUsMC4wN2wtMC4xNiwwLjA2bC0wLjczLDAuNTVsLTAuOTgsMC4wbC0wLjg1LC0wLjMzbC0wLjE1LC0wLjAybC0yLjExLDAuMjlsLTAuMjQsMC4xOWwtMC43NiwxLjk1bC0wLjYzLDAuMTZsLTAuMjEsMC4xOWwtMS4xNSwzLjI5bC0zLjQyLDIuODFsLTAuMSwwLjE3bC0wLjgxLDMuNTdsLTAuOTgsMS4xMmwtMC4zLDAuODVsLTUuMTMsMC4xOVpcIiwgXCJuYW1lXCI6IFwiTW9yb2Njb1wifSwgXCJVWlwiOiB7XCJwYXRoXCI6IFwiTTU4Ny44MywxODYuNDhsMC4wNiwtMS40NmwtMC4xOSwtMC4yOWwtMy4zMSwtMS4yNGwtMi41NywtMS40bC0xLjYzLC0xLjM4bC0yLjc5LC0xLjk4bC0xLjIsLTIuOThsLTAuMTIsLTAuMTRsLTAuODQsLTAuNTRsLTAuMTgsLTAuMDVsLTIuNjEsMC4xM2wtMC43NiwtMC40OGwtMC4yNSwtMi4yNWwtMC4xNywtMC4yNGwtMy4zNywtMS42bC0wLjMyLDAuMDRsLTIuMDgsMS43M2wtMi4xMSwxLjAybC0wLjE2LDAuMzVsMC4zMSwxLjE0bC0yLjE0LDAuMDNsLTAuMDksLTEwLjY4bDYuMSwtMS43NGw2LjI1LDMuNTdsMi4zNiwyLjcybDAuMjcsMC4xbDIuOTIsLTAuNDRsNC4xNywtMC4yM2wyLjc4LDIuMDZsLTAuMTgsMi44N2wwLjI5LDAuMzJsMC45OCwwLjAybDAuNDYsMi4yMmwwLjI4LDAuMjRsMy4wLDAuMDlsMC42MSwxLjI1bDAuMjgsMC4xN2wwLjkzLC0wLjAybDAuMjYsLTAuMTZsMS4wNiwtMi4wNmwzLjIxLC0yLjAzbDEuMywtMC41bDAuMTksMC4wOGwtMS43NSwxLjYybDAuMDUsMC40OGwxLjg1LDEuMTJsMC4yNywwLjAybDEuNjUsLTAuNjlsMi40LDEuMjdsLTIuNjksMS43OWwtMS43OSwtMC4yN2wtMC44OSwwLjA2bC0wLjIyLC0wLjUybDAuNDgsLTEuMjZsLTAuMzQsLTAuNGwtMy4zNSwwLjY5bC0wLjIyLDAuMThsLTAuNzgsMS44N2wtMS4wNywxLjQ3bC0xLjkzLC0wLjEzbC0wLjI5LDAuMTZsLTAuNjUsMS4yOWwwLjE2LDAuNDJsMS42OSwwLjY0bDAuNDgsMS45MWwtMS4yNSwyLjZsLTEuNjQsLTAuNTNsLTEuMTgsLTAuMDNaXCIsIFwibmFtZVwiOiBcIlV6YmVraXN0YW5cIn0sIFwiTU1cIjoge1wicGF0aFwiOiBcIk02NzAuMSwyMzMuMzlsLTEuNDYsMS4xMWwtMS42OCwwLjExbC0wLjI2LDAuMTlsLTEuMSwyLjdsLTAuOTUsMC40MmwtMC4xNCwwLjQybDEuMjEsMi4yN2wxLjYxLDEuOTJsMC45NCwxLjU1bC0wLjgyLDEuOTlsLTAuNzcsMC40MmwtMC4xMywwLjM5bDAuNjQsMS4zNWwxLjYyLDEuOTdsMC4yNiwxLjMybC0wLjA0LDEuMTVsMC4wMiwwLjEzbDAuOTIsMi4xOGwtMS4zLDIuMjNsLTAuNzksMS42OWwtMC4xLC0wLjc3bDAuNzQsLTEuODdsLTAuMDIsLTAuMjZsLTAuOCwtMS40MmwwLjIsLTIuNjhsLTAuMDYsLTAuMmwtMC45OCwtMS4yN2wtMC44LC0yLjk4bC0wLjQ1LC0zLjIybC0xLjExLC0yLjIybC0wLjQ1LC0wLjFsLTEuNjQsMS4yOGwtMi43NCwxLjc2bC0xLjI2LC0wLjJsLTEuMjcsLTAuNDlsMC43OSwtMi45M2wwLjAsLTAuMTRsLTAuNTIsLTIuNDJsLTEuOTMsLTIuOTdsMC4yNiwtMC44bC0wLjIyLC0wLjM5bC0xLjM3LC0wLjMxbC0xLjY1LC0xLjk4bC0wLjEyLC0xLjVsMC40MSwwLjE5bDAuNDIsLTAuMjZsMC4wNSwtMS43bDEuMDgsLTAuNTRsMC4xNiwtMC4zNGwtMC4yNCwtMS4wbDAuNSwtMC43OWwwLjA1LC0wLjE1bDAuMDgsLTIuMzVsMS41OCwwLjQ5bDAuMzYsLTAuMTVsMS4xMiwtMi4xOWwwLjE1LC0xLjM0bDEuMzUsLTIuMThsMC4wNCwtMC4xN2wtMC4wNywtMS4zNWwyLjk3LC0xLjcxbDEuNjcsMC40NWwwLjM4LC0wLjMzbC0wLjE4LC0xLjQ2bDAuNywtMC40bDAuMTUsLTAuMzJsLTAuMTMsLTAuNzJsMC45NCwtMC4xM2wwLjc0LDEuNDFsMC4xMSwwLjEybDAuOTUsMC41NmwwLjA3LDEuODlsLTAuMDksMi4wOGwtMi4yOCwyLjE1bC0wLjA5LDAuMTlsLTAuMywzLjE1bDAuMzUsMC4zMmwyLjM3LC0wLjM5bDAuNTMsMi4xN2wwLjIsMC4yMWwxLjMsMC40MmwtMC42MywxLjlsMC4xNCwwLjM2bDEuODYsMC45OWwxLjEsMC40OWwwLjI0LDAuMGwxLjQ1LC0wLjZsMC4wNCwwLjUxbC0yLjAxLDEuNmwtMC41NiwwLjk2bC0xLjM0LDAuNTZaXCIsIFwibmFtZVwiOiBcIk15YW5tYXJcIn0sIFwiTUxcIjoge1wicGF0aFwiOiBcIk0zOTAuNzksMjQ4LjJsMC42NywtMC4zN2wwLjE0LC0wLjE4bDAuMzYsLTEuMzFsMC41MSwtMC4wNGwxLjY4LDAuNjlsMC4yMSwwLjBsMS4zNCwtMC40OGwwLjg5LDAuMTZsMC4zLC0wLjEzbDAuMjksLTAuNDRsOS44OSwtMC4wNGwwLjI5LC0wLjIxbDAuNTYsLTEuOGwtMC4xMSwtMC4zM2wtMC4zMywtMC4yNGwtMi4zNywtMjIuMWwzLjQxLC0wLjA0bDguMzcsNS43M2w4LjM4LDUuNjhsMC41NiwxLjE1bDAuMTQsMC4xNGwxLjU2LDAuNzVsMC45OSwwLjM2bDAuMDMsMS40NWwwLjMzLDAuMjlsMi40NSwtMC4yMmwwLjAxLDUuNTJsLTEuMywxLjY0bC0wLjA2LDAuMTVsLTAuMTgsMS4zN2wtMS45OSwwLjM2bC0zLjQsMC4yMmwtMC4xOSwwLjA5bC0wLjg1LDAuODNsLTEuNDgsMC4wOWwtMS40OSwwLjAxbC0wLjU0LC0wLjQzbC0wLjI2LC0wLjA1bC0xLjM4LDAuMzZsLTIuMzksMS4wOGwtMC4xMywwLjEybC0wLjQ0LDAuNzNsLTEuODgsMS4xMWwtMC4xMSwwLjEybC0wLjMsMC41N2wtMC44NiwwLjQybC0xLjEsLTAuMzFsLTAuMjgsMC4wN2wtMC42OSwwLjYybC0wLjA5LDAuMTZsLTAuMzUsMS42NmwtMS45MywyLjA0bC0wLjA4LDAuMjNsMC4wNSwwLjc2bC0wLjYzLDAuOTlsLTAuMDQsMC4xOWwwLjE0LDEuMjNsLTAuODEsMC4yOWwtMC4zMiwwLjE3bC0wLjI3LC0wLjc1bC0wLjM5LC0wLjE4bC0wLjY1LDAuMjZsLTAuMzYsLTAuMDRsLTAuMjksMC4xNGwtMC4zNywwLjZsLTEuNjksLTAuMDJsLTAuNjMsLTAuMzRsLTAuMzIsMC4wMmwtMC4xMiwwLjA5bC0wLjQ3LC0wLjQ1bDAuMSwtMC42bC0wLjA5LC0wLjI3bC0wLjMxLC0wLjNsLTAuMzMsLTAuMDVsLTAuMDUsMC4wMmwwLjAyLC0wLjIxbDAuNDYsLTAuNTlsLTAuMDIsLTAuMzlsLTAuOTksLTEuMDJsLTAuMzQsLTAuNzRsLTAuNTYsLTAuNTZsLTAuMTcsLTAuMDlsLTAuNSwtMC4wN2wtMC4xOSwwLjA0bC0wLjU4LDAuMzVsLTAuNzksMC4zM2wtMC42NSwwLjUxbC0wLjg1LC0wLjE2bC0wLjYzLC0wLjU5bC0wLjE0LC0wLjA3bC0wLjQxLC0wLjA4bC0wLjIsMC4wM2wtMC41OSwwLjMxbC0wLjA3LDAuMGwtMC4xLC0wLjYzbDAuMTEsLTAuODVsLTAuMjEsLTAuOThsLTAuMTEsLTAuMTdsLTAuODYsLTAuNjZsLTAuNDUsLTEuMzRsLTAuMSwtMS4zNlpcIiwgXCJuYW1lXCI6IFwiTWFsaVwifSwgXCJNTlwiOiB7XCJwYXRoXCI6IFwiTTY0MS4wNiwxNTAuNTlsMi40MSwtMC41M2w0Ljc2LC0yLjhsMy42NywtMS40OWwyLjA2LDAuOTZsMC4xMiwwLjAzbDIuNSwwLjA1bDEuNTksMS40NWwwLjE5LDAuMDhsMi40NywwLjEybDMuNTksMC44MWwwLjI3LC0wLjA3bDIuNDMsLTIuMjhsMC4wNiwtMC4zNmwtMC45MywtMS43N2wyLjMzLC0zLjFsMi42NiwxLjNsMi4yNiwwLjM5bDIuNzUsMC44bDAuNDQsMi4zbDAuMTksMC4yMmwzLjU2LDEuMzhsMC4xOCwwLjAxbDIuMzUsLTAuNmwzLjEsLTAuNDJsMi40LDAuNDFsMi4zNywxLjUybDEuNDksMS42M2wwLjIzLDAuMWwyLjI5LC0wLjAzbDMuMTMsMC41MmwwLjE1LC0wLjAxbDIuMjgsLTAuNzlsMy4yNywtMC41M2wwLjExLC0wLjA0bDMuNTYsLTIuMjNsMS4zMSwwLjMxbDEuMjYsMS4wNWwwLjIyLDAuMDdsMi40NSwtMC4yMmwtMC45OCwxLjk2bC0xLjc3LDMuMjFsLTAuMDEsMC4yOGwwLjY0LDEuMzFsMC4zNSwwLjE2bDEuMzUsLTAuMzhsMi40LDAuNDhsMC4yMiwtMC4wNGwxLjc4LC0xLjA5bDEuODIsMC45MmwyLjExLDIuMDdsLTAuMTcsMC42OGwtMS43OSwtMC4zMWwtMy43NCwwLjQ1bC0xLjg1LDAuOTZsLTEuNzgsMi4wMWwtMy43NCwxLjE4bC0yLjQ2LDEuNjFsLTIuNDUsLTAuNmwtMS40MiwtMC4yOGwtMC4zMSwwLjEzbC0xLjMxLDEuOTlsMC4wLDAuMzNsMC43OCwxLjE1bDAuMywwLjc0bC0xLjU4LDAuOTNsLTEuNzUsMS41OWwtMi44MywxLjAzbC0zLjc3LDAuMTJsLTQuMDUsMS4wNWwtMi44MSwxLjU0bC0wLjk1LC0wLjhsLTAuMTksLTAuMDdsLTIuOTYsMC4wbC0zLjY0LC0xLjhsLTIuNTUsLTAuNDhsLTMuMzgsMC40MWwtNS4xMywtMC42N2wtMi42NiwwLjA2bC0xLjM1LC0xLjY1bC0xLjEyLC0yLjc4bC0wLjIxLC0wLjE4bC0xLjUsLTAuMzNsLTIuOTgsLTEuODlsLTAuMTIsLTAuMDRsLTMuMzcsLTAuNDNsLTIuODQsLTAuNTFsLTAuNzUsLTEuMTNsMC45MywtMy41NGwtMC4wNCwtMC4yNGwtMS43MywtMi41NWwtMC4xNSwtMC4xMmwtMy41MiwtMS4xOGwtMS45OSwtMS42MWwtMC41NCwtMS44NVpcIiwgXCJuYW1lXCI6IFwiTW9uZ29saWFcIn0sIFwiTUtcIjoge1wicGF0aFwiOiBcIk00NzIuNzMsMTczLjg3bDAuMDgsMC4wMWwwLjMyLC0wLjI1bDAuMDgsLTAuNDRsMS4yOSwtMC40MWwxLjM3LC0wLjI4bDEuMDMsLTAuMDRsMS4wNiwwLjgybDAuMTQsMS41OWwtMC4yMiwwLjA0bC0wLjE3LDAuMTFsLTAuMzIsMC40bC0xLjIsLTAuMDVsLTAuMTgsMC4wNWwtMC45LDAuNjFsLTEuNDUsMC4yM2wtMC44NSwtMC41OWwtMC4zLC0xLjA5bDAuMjIsLTAuNzFaXCIsIFwibmFtZVwiOiBcIk1hY2Vkb25pYVwifSwgXCJNV1wiOiB7XCJwYXRoXCI6IFwiTTUwNy4xOCwzMTMuODRsLTAuNjcsMS44NWwtMC4wMSwwLjE2bDAuNywzLjMxbDAuMzEsMC4yNGwwLjc1LC0wLjAzbDAuNzgsMC43MWwwLjk5LDEuNzVsMC4yLDMuMDNsLTAuOTEsMC40NWwtMC4xNCwwLjE1bC0wLjU5LDEuMzhsLTEuMjQsLTEuMjFsLTAuMTcsLTEuNjJsMC40OSwtMS4xMmwwLjAyLC0wLjE2bC0wLjE1LC0xLjAzbC0wLjEzLC0wLjIxbC0wLjk5LC0wLjY1bC0wLjI2LC0wLjAzbC0wLjUzLDAuMThsLTEuMzEsLTEuMTJsLTEuMTUsLTAuNTlsMC42NiwtMi4wNmwwLjc1LC0wLjg0bDAuMDcsLTAuMjdsLTAuNDcsLTIuMDRsMC40OCwtMS45NGwwLjQsLTAuNjVsMC4wMywtMC4yNGwtMC42NCwtMi4xNWwtMC4wOCwtMC4xM2wtMC40NCwtMC40MmwxLjM0LDAuMjZsMS4yNSwxLjczbDAuNjcsMy4zWlwiLCBcIm5hbWVcIjogXCJNYWxhd2lcIn0sIFwiTVJcIjoge1wicGF0aFwiOiBcIk0zOTAuNTQsMjQ3LjY2bC0xLjQ4LC0xLjU4bC0xLjUxLC0xLjg4bC0wLjEyLC0wLjA5bC0xLjY0LC0wLjY3bC0xLjE3LC0wLjc0bC0wLjE3LC0wLjA1bC0xLjQsMC4wM2wtMC4xMiwwLjAzbC0xLjE0LDAuNTJsLTEuMTUsLTAuMjFsLTAuMjYsMC4wOGwtMC40NCwwLjQzbC0wLjExLC0wLjcybDAuNjgsLTEuMjlsMC4zMSwtMi40M2wtMC4yOCwtMi42M2wtMC4yOSwtMS4yN2wwLjI0LC0xLjI0bC0wLjAzLC0wLjJsLTAuNjUsLTEuMjRsLTEuMTksLTEuMDVsMC4zMiwtMC41MWw5LjY0LDAuMDJsMC4zLC0wLjM0bC0wLjQ2LC0zLjcxbDAuNTEsLTEuMTJsMi4xNywtMC4yMmwwLjI3LC0wLjNsLTAuMDgsLTYuNWw3LjkxLDAuMTNsMC4zMSwtMC4zbDAuMDEsLTMuNWw4LjE3LDUuNjNsLTIuODksMC4wNGwtMC4yOSwwLjMzbDIuNDIsMjIuNTZsMC4xMiwwLjIxbDAuMjYsMC4xOWwtMC40MywxLjM4bC05LjgzLDAuMDRsLTAuMjUsMC4xM2wtMC4yNywwLjQxbC0wLjc3LC0wLjE0bC0wLjE1LDAuMDFsLTEuMywwLjQ3bC0xLjY0LC0wLjY3bC0wLjE0LC0wLjAybC0wLjc5LDAuMDZsLTAuMjcsMC4yMmwtMC4zOSwxLjM5bC0wLjUzLDAuMjlaXCIsIFwibmFtZVwiOiBcIk1hdXJpdGFuaWFcIn0sIFwiVUdcIjoge1wicGF0aFwiOiBcIk01MDAuNzQsMjg3LjE3bC0yLjg0LC0wLjAybC0wLjkyLDAuMzJsLTEuMzcsMC43MWwtMC4yOSwtMC4xMmwwLjAyLC0xLjZsMC41NCwtMC44OWwwLjA0LC0wLjEzbDAuMTQsLTEuOTZsMC40OSwtMS4wOWwwLjkxLC0xLjI0bDAuOTcsLTAuNjhsMC44LC0wLjg5bC0wLjEzLC0wLjQ5bC0wLjc5LC0wLjI3bDAuMTMsLTIuNTVsMC43OCwtMC41MmwxLjQ1LDAuNTFsMC4xOCwwLjAxbDEuOTcsLTAuNTdsMS43MiwwLjAxbDAuMTgsLTAuMDZsMS4yOSwtMC45N2wwLjk4LDEuNDRsMC4yOSwxLjI0bDEuMDUsMi43NWwtMC44NCwxLjY4bC0xLjk0LDIuNjZsLTAuMDYsMC4xOGwwLjAyLDIuMzZsLTQuOCwwLjE4WlwiLCBcIm5hbWVcIjogXCJVZ2FuZGFcIn0sIFwiTVlcIjoge1wicGF0aFwiOiBcIk03MTcuNiwyNzMuNTJsLTEuNTEsMC43bC0yLjEzLC0wLjQxbC0yLjg4LC0wLjBsLTAuMjksMC4yMWwtMC44NCwyLjc3bC0wLjksMC44MmwtMC4wOCwwLjEybC0xLjIzLDMuMzRsLTEuODEsMC40N2wtMi4yOSwtMC42OGwtMC4xNCwtMC4wMWwtMS4yLDAuMjJsLTAuMTQsMC4wN2wtMS4zNiwxLjE4bC0xLjQ3LC0wLjE3bC0wLjEyLDAuMDFsLTEuNDYsMC40NmwtMS41MSwtMS4yNWwtMC4yNCwtMC45N2wxLjI2LDAuNTlsMC4yLDAuMDJsMS45MywtMC40N2wwLjIyLC0wLjIybDAuNDcsLTEuOThsMC45LC0wLjRsMi45NywtMC41NGwwLjE3LC0wLjA5bDEuOCwtMS45OGwxLjAyLC0xLjMybDAuOSwxLjAzbDAuNDgsLTAuMDRsMC40MywtMC43bDEuMDIsMC4wN2wwLjMyLC0wLjI3bDAuMjUsLTIuNzJsMS44NCwtMS42N2wxLjIzLC0xLjg5bDAuNzMsLTAuMDFsMS4xMiwxLjExbDAuMSwwLjk5bDAuMTgsMC4yNGwxLjY2LDAuNzFsMS44NSwwLjY3bC0wLjA5LDAuNTFsLTEuNDUsMC4xMWwtMC4yNiwwLjRsMC4zNSwwLjk3Wk02NzMuNzgsMjY5LjUzbDAuMTcsMS4xNGwwLjM1LDAuMjVsMS42NSwtMC4zbDAuMTgsLTAuMTFsMC42OCwtMC44NmwwLjMxLDAuMTNsMS40MSwxLjQ1bDAuOTksMS41OWwwLjEzLDEuNTdsLTAuMjYsMS4wOWwwLjAsMC4xNWwwLjI0LDAuODRsMC4xOCwxLjQ2bDAuMTEsMC4ybDAuODIsMC42NGwwLjkyLDIuMDhsLTAuMDMsMC41MmwtMS40LDAuMTNsLTIuMjksLTEuNzlsLTIuODYsLTEuOTJsLTAuMjcsLTEuMTZsLTAuMDcsLTAuMTNsLTEuMzksLTEuNjFsLTAuMzMsLTEuOTlsLTAuMDUsLTAuMTJsLTAuODQsLTEuMjdsMC4yNiwtMS43MmwtMC4wMywtMC4xOGwtMC40NSwtMC44N2wwLjEzLC0wLjEzbDEuNzEsMC45MlpcIiwgXCJuYW1lXCI6IFwiTWFsYXlzaWFcIn0sIFwiTVhcIjoge1wicGF0aFwiOiBcIk0xMzMuNDEsMjEzLjgzbDAuNjEsMC4wOWwwLjI3LC0wLjA5bDAuOTMsLTEuMDFsMC4wOCwtMC4xOGwwLjA5LC0xLjIybC0wLjA5LC0wLjIzbC0xLjkzLC0xLjk0bC0xLjQ2LC0wLjc3bC0yLjk2LC01LjYybC0wLjg2LC0yLjFsMi40NCwtMC4xOGwyLjY4LC0wLjI1bC0wLjAzLDAuMDhsMC4xNywwLjRsMy43OSwxLjM1bDUuODEsMS45N2w2Ljk2LC0wLjAybDAuMywtMC4zbDAuMCwtMC44NGwzLjkxLDAuMGwwLjg3LDAuOTNsMS4yNywwLjg3bDEuNDQsMS4xN2wwLjc5LDEuMzdsMC42MiwxLjQ5bDAuMTIsMC4xNGwxLjM1LDAuODVsMi4wOCwwLjgybDAuMzUsLTAuMWwxLjQ5LC0yLjA0bDEuODEsLTAuMDVsMS42MywxLjAxbDEuMjEsMS44bDAuODYsMS41OGwxLjQ3LDEuNTVsMC41MywxLjgybDAuNzMsMS4zMmwwLjE0LDAuMTNsMS45OCwwLjg0bDEuNzgsMC41OWwwLjYxLC0wLjAzbC0wLjc4LDEuODlsLTAuNDUsMS45NmwtMC4xOSwzLjU4bC0wLjI0LDEuMjdsMC4wMSwwLjE0bDAuNDMsMS40M2wwLjc4LDEuMzFsMC40OSwxLjk4bDAuMDYsMC4xMmwxLjYzLDEuOWwwLjYxLDEuNTFsMC45OCwxLjI4bDAuMTYsMC4xMWwyLjU4LDAuNjdsMC45OCwxLjAybDAuMzEsMC4wOGwyLjE3LC0wLjcxbDEuOTEsLTAuMjZsMS44NywtMC40N2wxLjY3LC0wLjQ5bDEuNTksLTEuMDZsMC4xMSwtMC4xNGwwLjYsLTEuNTJsMC4yMiwtMi4yMWwwLjM1LC0wLjYybDEuNTgsLTAuNjRsMi41OSwtMC41OWwyLjE4LDAuMDlsMS40MywtMC4ybDAuMzksMC4zNmwtMC4wNywxLjAybC0xLjI4LDEuNDhsLTAuNjUsMS42OGwwLjA3LDAuMzJsMC4zMywwLjMybC0wLjc5LDIuNDlsLTAuMjgsLTAuM2wtMC4yNCwtMC4wOWwtMS4wLDAuMDhsLTAuMjQsMC4xNWwtMC43NCwxLjI4bC0wLjE5LC0wLjEzbC0wLjI4LC0wLjAzbC0wLjMsMC4xMmwtMC4xOSwwLjI5bDAuMCwwLjA2bC00LjM0LC0wLjAybC0wLjMsMC4zbC0wLjAsMS4xNmwtMC44MywwLjBsLTAuMjgsMC4xOWwwLjA4LDAuMzNsMC45MywwLjg2bDAuOSwwLjU4bDAuMjQsMC40OGwwLjE2LDAuMTVsMC4yLDAuMDhsLTAuMDMsMC4zOGwtMi45NCwwLjAxbC0wLjI2LDAuMTVsLTEuMjEsMi4wOWwwLjAyLDAuMzNsMC4yNSwwLjMzbC0wLjIxLDAuNDRsLTAuMDQsMC4yMmwtMi40MiwtMi4zNWwtMS4zNiwtMC44N2wtMi4wNCwtMC42N2wtMC4xMywtMC4wMWwtMS40LDAuMTlsLTIuMDcsMC45OGwtMS4xNCwwLjIzbC0xLjcyLC0wLjY2bC0xLjg1LC0wLjQ4bC0yLjMxLC0xLjE2bC0xLjkyLC0wLjM4bC0yLjc5LC0xLjE4bC0yLjA0LC0xLjJsLTAuNiwtMC42NmwtMC4xOSwtMC4xbC0xLjM3LC0wLjE1bC0yLjQ1LC0wLjc4bC0xLjA3LC0xLjE4bC0yLjYzLC0xLjQ0bC0xLjIsLTEuNTZsLTAuNDQsLTAuOTNsMC41LC0wLjE1bDAuMiwtMC4zOWwtMC4yLC0wLjU4bDAuNDYsLTAuNTVsMC4wNywtMC4xOWwwLjAxLC0wLjkxbC0wLjA2LC0wLjE4bC0wLjgxLC0xLjEzbC0wLjI1LC0xLjA4bC0wLjg2LC0xLjM2bC0yLjIxLC0yLjYzbC0yLjUzLC0yLjA5bC0xLjIsLTEuNjNsLTAuMTEsLTAuMDlsLTIuMDgsLTEuMDZsLTAuMzQsLTAuNDhsMC4zNSwtMS41M2wtMC4xNiwtMC4zNGwtMS4yNCwtMC42MWwtMS4zOSwtMS4yM2wtMC42LC0xLjgxbC0wLjI0LC0wLjJsLTEuMjUsLTAuMmwtMS4zOCwtMS4zNWwtMS4xMSwtMS4yNWwtMC4xLC0wLjc2bC0wLjA1LC0wLjEzbC0xLjMzLC0yLjA0bC0wLjg1LC0yLjAybDAuMDQsLTAuOTlsLTAuMTQsLTAuMjdsLTEuODEsLTEuMWwtMC4yLC0wLjA0bC0wLjc0LDAuMTFsLTEuMzQsLTAuNzJsLTAuNDIsMC4xNmwtMC40LDEuMTJsLTAuMCwwLjE5bDAuNDEsMS4zbDAuMjQsMi4wNGwwLjA2LDAuMTVsMC44OCwxLjE2bDEuODQsMS44NmwwLjQsMC42MWwwLjEyLDAuMWwwLjI3LDAuMTRsMC4yOSwwLjgybDAuMzEsMC4ybDAuMiwtMC4wMmwwLjQzLDEuNTFsMC4wOSwwLjE0bDAuNzIsMC42NWwwLjUxLDAuOTFsMS41OCwxLjRsMC44LDIuNDJsMC43NywxLjIzbDAuNjYsMS4xOWwwLjEzLDEuMzRsMC4yOCwwLjI3bDEuMDgsMC4wOGwwLjkyLDEuMWwwLjgzLDEuMDhsLTAuMDMsMC4yNGwtMC44OCwwLjgxbC0wLjEzLC0wLjBsLTAuNTksLTEuNDJsLTAuMDcsLTAuMTFsLTEuNjcsLTEuNTNsLTEuODEsLTEuMjhsLTEuMTUsLTAuNjFsMC4wNywtMS44NWwtMC4zOCwtMS40NWwtMC4xMiwtMC4xN2wtMi45MSwtMi4wM2wtMC4zOSwwLjA0bC0wLjExLDAuMTFsLTAuNDIsLTAuNDZsLTAuMTEsLTAuMDhsLTEuNDksLTAuNjNsLTEuMDksLTEuMTZaXCIsIFwibmFtZVwiOiBcIk1leGljb1wifSwgXCJWVVwiOiB7XCJwYXRoXCI6IFwiTTgzOS45MiwzMjUuNjZsMC43OCwwLjczbC0wLjE4LDAuMDdsLTAuNiwtMC44Wk04MzkuMTMsMzIyLjc0bDAuMjcsMS4zNmwtMC4xMywtMC4wNmwtMC4yMSwtMC4wMmwtMC4yOSwwLjA4bC0wLjIyLC0wLjQzbC0wLjAzLC0xLjMybDAuNjEsMC40WlwiLCBcIm5hbWVcIjogXCJWYW51YXR1XCJ9LCBcIkZSXCI6IHtcInBhdGhcIjogXCJNNDQ0LjU4LDE3Mi42M2wtMC42OCwxLjkybC0wLjcyLC0wLjM4bC0wLjUxLC0xLjc5bDAuNDMsLTAuOTVsMS4xNSwtMC44M2wwLjMzLDIuMDRaTTQyOS43MSwxNDcuMDNsMS43NywxLjU3bDAuMjYsMC4wN2wxLjE2LC0wLjIzbDIuMTIsMS40NGwwLjU2LDAuMjhsMC4xNiwwLjAzbDAuNjEsLTAuMDZsMS4wOSwwLjc4bDAuMTMsMC4wNWwzLjE4LDAuNTNsLTEuMDksMS45NGwtMC4zLDIuMTZsLTAuNDgsMC4zOGwtMS4wLC0wLjI2bC0wLjM3LDAuMzJsMC4wNywwLjY2bC0xLjczLDEuNjhsLTAuMDksMC4yMWwtMC4wNCwxLjQybDAuNDEsMC4yOWwwLjk2LC0wLjRsMC42NywxLjA3bC0wLjA5LDAuNzhsMC4wNCwwLjE5bDAuNjEsMC45N2wtMC43MSwwLjc4bC0wLjA3LDAuMjhsMC42NSwyLjM5bDAuMjEsMC4yMWwxLjA5LDAuMzFsLTAuMiwwLjk1bC0yLjA4LDEuNThsLTQuODEsLTAuOGwtMC4xMywwLjAxbC0zLjY1LDAuOTlsLTAuMjIsMC4yNGwtMC4yNSwxLjZsLTIuNTksMC4zNWwtMi43NCwtMS4zM2wtMC4zMSwwLjAzbC0wLjc5LDAuNTdsLTQuMzgsLTEuMzFsLTAuNzksLTAuOTRsMS4xNiwtMS42NGwwLjA1LC0wLjE1bDAuNDgsLTYuMTdsLTAuMDYsLTAuMjFsLTIuNTgsLTMuM2wtMS44OSwtMS42NWwtMC4xMSwtMC4wNmwtMy42NCwtMS4xN2wtMC4yLC0xLjg4bDIuOTIsLTAuNjNsNC4xNCwwLjgybDAuMzUsLTAuMzZsLTAuNjUsLTMuMGwxLjc3LDEuMDVsMC4yNywwLjAybDUuODMsLTIuNTRsMC4xNywtMC4xOWwwLjcxLC0yLjU0bDEuNzUsLTAuNTNsMC4yNywwLjg4bDAuMjcsMC4yMWwxLjA0LDAuMDVsMS4wOCwxLjIzWk0yODkuMSwyNzguNDVsLTAuODUsMC44NGwtMC44OCwwLjEzbC0wLjI1LC0wLjUxbC0wLjIxLC0wLjE2bC0wLjU2LC0wLjFsLTAuMjUsMC4wN2wtMC42MywwLjU1bC0wLjYyLC0wLjI5bDAuNSwtMC44OGwwLjIxLC0xLjExbDAuNDIsLTEuMDVsLTAuMDMsLTAuMjhsLTAuOTMsLTEuNDJsLTAuMTgsLTEuNTRsMS4xMywtMS44N2wyLjQyLDAuNzhsMi41NSwyLjA0bDAuMzMsMC44MWwtMS40LDIuMTZsLTAuNzcsMS44NFpcIiwgXCJuYW1lXCI6IFwiRnJhbmNlXCJ9LCBcIkZJXCI6IHtcInBhdGhcIjogXCJNNDkyLjI2LDc2LjQybC0wLjM4LDMuMTJsMC4xMiwwLjI4bDMuNiwyLjY5bC0yLjE0LDIuOTZsLTAuMDEsMC4zM2wyLjgzLDQuNjFsLTEuNjEsMy4zNmwwLjAzLDAuMzFsMi4xNSwyLjg3bC0wLjk2LDIuNDRsMC4xLDAuMzVsMy41MSwyLjU1bC0wLjgxLDEuNzJsLTIuMjgsMi4xOWwtNS4yOCw0Ljc5bC00LjUxLDAuMzFsLTQuMzksMS4zN2wtMy44NywwLjc1bC0xLjM0LC0xLjg5bC0wLjExLC0wLjA5bC0yLjIzLC0xLjE0bDAuNTMsLTMuNTRsLTAuMDEsLTAuMTRsLTEuMTcsLTMuMzdsMS4xMiwtMi4xM2wyLjIzLC0yLjQ0bDUuNjksLTQuMzNsMS42NSwtMC44NGwwLjE2LC0wLjMxbC0wLjI2LC0xLjczbC0wLjE1LC0wLjIybC0zLjQsLTEuOTFsLTAuNzcsLTEuNDdsLTAuMDcsLTYuNDVsLTAuMTIsLTAuMjRsLTMuOTEsLTIuOTRsLTMuMCwtMS45MmwwLjk3LC0wLjc2bDIuNiwyLjE3bDAuMjEsMC4wN2wzLjIsLTAuMjFsMi42MywxLjAzbDAuMywtMC4wNWwyLjM5LC0xLjk0bDAuMDksLTAuMTNsMS4xOCwtMy4xMmwzLjYzLC0xLjQybDIuODcsMS41OWwtMC45OCwyLjg3WlwiLCBcIm5hbWVcIjogXCJGaW5sYW5kXCJ9LCBcIkZKXCI6IHtcInBhdGhcIjogXCJNODY5Ljk4LDMyNy4wN2wtMS4zMSwwLjQ0bC0wLjE0LC0wLjQxbDAuOTYsLTAuNDFsMC44NSwtMC4xN2wxLjQzLC0wLjc4bC0wLjE2LDAuNjVsLTEuNjQsMC42N1pNODY3LjU4LDMyOS4xMmwwLjU0LDAuNDdsLTAuMzEsMS4wbC0xLjMyLDAuM2wtMS4xMywtMC4yNmwtMC4xNywtMC43OGwwLjcyLC0wLjY2bDAuOTgsMC4yN2wwLjI1LC0wLjA0bDAuNDMsLTAuMjlaXCIsIFwibmFtZVwiOiBcIkZpamlcIn0sIFwiRktcIjoge1wicGF0aFwiOiBcIk0yNjguMTUsNDI3Ljg5bDIuNiwtMS43M2wxLjk4LDAuNzdsMC4zMSwtMC4wNWwxLjMyLC0xLjE3bDEuNTgsMS4xOGwtMC41NCwwLjg0bC0zLjEsMC45MmwtMS4wLC0xLjA0bC0wLjM5LC0wLjA0bC0xLjksMS4zNWwtMC44NiwtMS4wNFpcIiwgXCJuYW1lXCI6IFwiRmFsa2xhbmQgSXNsYW5kc1wifSwgXCJOSVwiOiB7XCJwYXRoXCI6IFwiTTIwMi4xLDI1Mi42bDAuMjMsLTAuMGwwLjEyLC0wLjExbDAuNjgsLTAuMDlsMC4yMiwtMC4xNWwwLjIzLC0wLjQzbDAuMiwtMC4wMWwwLjI4LC0wLjMxbC0wLjA0LC0wLjk3bDAuMjksLTAuMDNsMC41LDAuMDJsMC4yNSwtMC4xMWwwLjM3LC0wLjQ2bDAuNTEsMC4zNWwwLjQsLTAuMDZsMC4yMywtMC4yOGwwLjQ1LC0wLjI5bDAuODcsLTAuN2wwLjExLC0wLjIxbDAuMDIsLTAuMjZsMC4yMywtMC4xMmwwLjI1LC0wLjQ4bDAuMjksMC4yN2wwLjE0LDAuMDdsMC41LDAuMTJsMC4yMiwtMC4wM2wwLjQ4LC0wLjI4bDAuNjYsLTAuMDJsMC44NywtMC4zM2wwLjM2LC0wLjMybDAuMjEsMC4wMWwtMC4xMSwwLjQ4bDAuMCwwLjE0bDAuMjIsMC44bC0wLjU0LDAuODVsLTAuMjcsMS4wM2wtMC4wOSwxLjE4bDAuMTQsMC43MmwwLjA1LDAuOTVsLTAuMjQsMC4xNWwtMC4xMywwLjE5bC0wLjIzLDEuMDlsMC4wLDAuMTRsMC4xNCwwLjUzbC0wLjQyLDAuNTNsLTAuMDYsMC4yNGwwLjEyLDAuNjlsMC4wOCwwLjE1bDAuMTgsMC4xOWwtMC4yNiwwLjIzbC0wLjQ5LC0wLjExbC0wLjM1LC0wLjQ0bC0wLjE2LC0wLjFsLTAuNzksLTAuMjFsLTAuMjMsMC4wM2wtMC40NSwwLjI2bC0xLjUxLC0wLjYybC0wLjMxLDAuMDVsLTAuMTcsMC4xNWwtMS44MSwtMS42MmwtMC42LC0wLjlsLTEuMDQsLTAuNzlsLTAuNzcsLTAuNzFaXCIsIFwibmFtZVwiOiBcIk5pY2FyYWd1YVwifSwgXCJOTFwiOiB7XCJwYXRoXCI6IFwiTTQzNi4yMiwxMzYuNjVsMS44MiwwLjA4bDAuMzYsMC44OWwtMC42LDIuOTZsLTAuNTMsMS4wNmwtMS4zMiwwLjBsLTAuMywwLjM0bDAuMzUsMi44OWwtMC44MywtMC40N2wtMS41NiwtMS40M2wtMC4yOSwtMC4wN2wtMi4yNiwwLjY3bC0xLjAyLC0wLjE1bDAuNjgsLTAuNDhsMC4xLC0wLjEybDIuMTQsLTQuODRsMy4yNSwtMS4zNVpcIiwgXCJuYW1lXCI6IFwiTmV0aGVybGFuZHNcIn0sIFwiTk9cIjoge1wicGF0aFwiOiBcIk00OTEuNDUsNjcuMzFsNy4wNiwzLjBsLTIuNTIsMC45NGwtMC4xMSwwLjQ5bDIuNDMsMi40OWwtMy44MiwxLjU5bC0xLjQ4LDAuM2wwLjg5LC0yLjYxbC0wLjE0LC0wLjM2bC0zLjIxLC0xLjc4bC0wLjI1LC0wLjAybC0zLjg5LDEuNTJsLTAuMTcsMC4xN2wtMS4yLDMuMTdsLTIuMTksMS43OGwtMi41MywtMC45OWwtMC4xMywtMC4wMmwtMy4xNSwwLjIxbC0yLjY5LC0yLjI1bC0wLjM4LC0wLjAxbC0xLjQzLDEuMTFsLTEuNDcsMC4xN2wtMC4yNiwwLjI2bC0wLjMzLDIuNTdsLTQuNDIsLTAuNjVsLTAuMzMsMC4yMmwtMC42LDIuMTlsLTIuMTcsLTAuMDFsLTAuMjcsMC4xNmwtNC4xNSw3LjY4bC0zLjg4LDUuNzZsLTAuMCwwLjMzbDAuODEsMS4yM2wtMC43LDEuMjdsLTIuMywtMC4wNmwtMC4yOCwwLjE4bC0xLjYzLDMuNzJsLTAuMDIsMC4xM2wwLjE1LDUuMTdsMC4wNywwLjE4bDEuNTEsMS44NGwtMC43OSw0LjI0bC0yLjA0LDIuNWwtMC45MiwxLjc1bC0xLjM5LC0xLjg4bC0wLjQ0LC0wLjA1bC00Ljg5LDQuMjFsLTMuMTYsMC44MWwtMy4yNCwtMS43NGwtMC44NiwtMy44MmwtMC43OCwtOC42bDIuMTgsLTIuMzZsNi41NiwtMy4yOGw1LjAsLTQuMTZsNC42MywtNS43NGw1Ljk5LC04LjA5bDQuMTcsLTMuMjNsNi44NCwtNS40OWw1LjM5LC0xLjkybDQuMDYsMC4yNGwwLjIzLC0wLjA5bDMuNzIsLTMuNjdsNC41MSwwLjE5bDQuNCwtMC44OVpNNDg0LjU4LDE5Ljk1bDQuNDIsMS44MmwtMy4yNSwyLjY4bC03LjE0LDAuNjVsLTcuMTYsLTAuOTFsLTAuMzksLTEuMzdsLTAuMjgsLTAuMjJsLTMuNDgsLTAuMWwtMi4yNSwtMi4xNWw3LjA5LC0xLjQ4bDMuNTUsMS4zNmwwLjI4LC0wLjAzbDIuNDIsLTEuNjZsNi4xOCwxLjQxWk00ODEuOTksMzMuOTJsLTQuNzMsMS44NWwtMy43NiwtMS4wNmwxLjI3LC0xLjAybDAuMDQsLTAuNDNsLTEuMTgsLTEuMzVsNC40NiwtMC45NGwwLjg5LDEuODNsMC4xNywwLjE1bDIuODMsMC45NlpNNDY2LjUsMjMuOTVsNy42NCwzLjg3bC01LjYzLDEuOTRsLTAuMTksMC4xOWwtMS4zNSwzLjg4bC0yLjA4LDAuOTZsLTAuMTYsMC4xOWwtMS4xNCw0LjE4bC0yLjcxLDAuMThsLTQuOTQsLTIuOTVsMS45NSwtMS42M2wtMC4wOCwtMC41MWwtMy43LC0xLjU0bC00Ljc5LC00LjU0bC0xLjc4LC00LjAxbDYuMjksLTEuODhsMS4yNSwxLjgxbDAuMjUsMC4xM2wzLjU3LC0wLjA4bDAuMjYsLTAuMTdsMC44NywtMS43OWwzLjQxLC0wLjE4bDMuMDgsMS45NFpcIiwgXCJuYW1lXCI6IFwiTm9yd2F5XCJ9LCBcIk5BXCI6IHtcInBhdGhcIjogXCJNNDYxLjg4LDM1Ny45OGwtMS42MSwtMS43N2wtMC45NCwtMS45bC0wLjU0LC0yLjU4bC0wLjYyLC0xLjk1bC0wLjgzLC00LjA1bC0wLjA2LC0zLjEzbC0wLjMzLC0xLjVsLTAuMDcsLTAuMTRsLTAuOTUsLTEuMDZsLTEuMjcsLTIuMTJsLTEuMywtMy4xbC0wLjU5LC0xLjcxbC0xLjk4LC0yLjQ2bC0wLjEzLC0xLjY3bDAuOTksLTAuNGwxLjQ0LC0wLjQybDEuNDgsMC4wN2wxLjQyLDEuMTFsMC4zMSwwLjAzbDAuMzIsLTAuMTVsOS45OSwtMC4xMWwxLjY2LDEuMThsMC4xNiwwLjA2bDYuMDYsMC4zN2w0LjY5LC0xLjA2bDIuMDEsLTAuNTdsMS41LDAuMTRsMC42MywwLjM3bC0xLjAsMC40MWwtMC43LDAuMDFsLTAuMTYsMC4wNWwtMS4zOCwwLjg4bC0wLjc5LC0wLjg4bC0wLjI5LC0wLjA5bC0zLjgzLDAuOWwtMS44NCwwLjA4bC0wLjI5LDAuM2wtMC4wNyw4Ljk5bC0yLjE4LDAuMDhsLTAuMjksMC4zbC0wLjAsMTcuNDdsLTIuMDQsMS4yN2wtMS4yMSwwLjE4bC0xLjUxLC0wLjQ5bC0wLjk5LC0wLjE4bC0wLjM2LC0xLjBsLTAuMSwtMC4xNGwtMC45OSwtMC43NGwtMC40LDAuMDRsLTAuOTgsMS4wOVpcIiwgXCJuYW1lXCI6IFwiTmFtaWJpYVwifSwgXCJOQ1wiOiB7XCJwYXRoXCI6IFwiTTgzNS44NywzMzguNjhsMi4wNiwxLjYzbDEuMDEsMC45NGwtMC40OSwwLjMybC0xLjIxLC0wLjYybC0xLjc2LC0xLjE2bC0xLjU4LC0xLjM2bC0xLjYxLC0xLjc5bC0wLjE2LC0wLjQxbDAuNTQsMC4wMmwxLjMyLDAuODNsMS4wOCwwLjg3bDAuNzksMC43M1pcIiwgXCJuYW1lXCI6IFwiTmV3IENhbGVkb25pYVwifSwgXCJORVwiOiB7XCJwYXRoXCI6IFwiTTQyNi42NywyNTQuMTdsMC4wMywtMS4wNGwtMC4yNCwtMC4zbC0yLjY2LC0wLjUzbC0wLjA2LC0xLjBsLTAuMDcsLTAuMTdsLTEuMzcsLTEuNjJsLTAuMywtMS4wNGwwLjE1LC0wLjk0bDEuMzcsLTAuMDlsMC4xOSwtMC4wOWwwLjg1LC0wLjgzbDMuMzQsLTAuMjJsMi4yMiwtMC40MWwwLjI0LC0wLjI2bDAuMiwtMS41bDEuMzIsLTEuNjVsMC4wNywtMC4xOWwtMC4wMSwtNS43NGwzLjQsLTEuMTNsNy4yNCwtNS4xMmw4LjQ2LC00Ljk1bDMuNzYsMS4wOGwxLjM1LDEuMzlsMC4zNiwwLjA1bDEuMzksLTAuNzdsMC41NSwzLjY2bDAuMTIsMC4ybDAuODIsMC42bDAuMDMsMC42OWwwLjEsMC4yMWwwLjg3LDAuNzRsLTAuNDcsMC45OWwtMC45Niw1LjI2bC0wLjEzLDMuMjVsLTMuMDgsMi4zNGwtMC4xLDAuMTVsLTEuMDgsMy4zN2wwLjA4LDAuMzFsMC45NCwwLjg2bC0wLjAxLDEuNTFsMC4yOSwwLjNsMS4yNSwwLjA1bC0wLjE0LDAuNjZsLTAuNTEsMC4xMWwtMC4yNCwwLjI2bC0wLjA2LDAuNTdsLTAuMDQsMC4wbC0xLjU5LC0yLjYybC0wLjIxLC0wLjE0bC0wLjU5LC0wLjFsLTAuMjMsMC4wNWwtMS44MywxLjMzbC0xLjc5LC0wLjY4bC0xLjQyLC0wLjE3bC0wLjE3LDAuMDNsLTAuNjUsMC4zMmwtMS4zOSwtMC4wN2wtMC4xOSwwLjA2bC0xLjQsMS4wM2wtMS4xMiwwLjA1bC0yLjk3LC0xLjI5bC0wLjI2LDAuMDFsLTEuMTIsMC41OWwtMS4wOCwtMC4wNGwtMC44NSwtMC44OGwtMC4xMSwtMC4wN2wtMi41MSwtMC45NWwtMC4xNCwtMC4wMmwtMi42OSwwLjNsLTAuMTYsMC4wN2wtMC42NSwwLjU1bC0wLjEsMC4xNmwtMC4zNCwxLjQxbC0wLjY5LDAuOThsLTAuMDUsMC4xNWwtMC4xMywxLjcybC0xLjQ3LC0xLjEzbC0wLjE4LC0wLjA2bC0wLjksMC4wMWwtMC4yLDAuMDhsLTAuMzIsMC4yOFpcIiwgXCJuYW1lXCI6IFwiTmlnZXJcIn0sIFwiTkdcIjoge1wicGF0aFwiOiBcIk00NDIuMCwyNzIuN2wtMi40LDAuODNsLTAuODgsLTAuMTJsLTAuMTksMC4wNGwtMC44OSwwLjUybC0xLjc4LC0wLjA1bC0xLjIzLC0xLjQ0bC0wLjg4LC0xLjg3bC0xLjc3LC0xLjY2bC0wLjIxLC0wLjA4bC0zLjc4LDAuMDNsMC4xMywtMy43NWwtMC4wNiwtMS41OGwwLjQ0LC0xLjQ3bDAuNzQsLTAuNzVsMS4yMSwtMS41NmwwLjA0LC0wLjI5bC0wLjIyLC0wLjU2bDAuNDQsLTAuOWwwLjAxLC0wLjI0bC0wLjU0LC0xLjQ0bDAuMjYsLTIuOTdsMC43MiwtMS4wNmwwLjMzLC0xLjM3bDAuNTEsLTAuNDNsMi41MywtMC4yOGwyLjM4LDAuOWwwLjg5LDAuOTFsMC4yLDAuMDlsMS4yOCwwLjA0bDAuMTUsLTAuMDNsMS4wNiwtMC41NmwyLjksMS4yNmwwLjEzLDAuMDJsMS4yOCwtMC4wNmwwLjE2LC0wLjA2bDEuMzksLTEuMDJsMS4zNiwwLjA3bDAuMTUsLTAuMDNsMC42NCwtMC4zMmwxLjIyLDAuMTNsMS45LDAuNzNsMC4yOCwtMC4wNGwxLjg2LC0xLjM1bDAuMzMsMC4wNmwxLjYyLDIuNjdsMC4yOSwwLjE0bDAuMzIsLTAuMDRsMC43MywwLjc0bC0wLjE5LDAuMzdsLTAuMTIsMC43NGwtMi4wMywxLjg5bC0wLjA3LDAuMTFsLTAuNjYsMS42MmwtMC4zNSwxLjI4bC0wLjQ4LDAuNTFsLTAuMDcsMC4xMmwtMC40OCwxLjY3bC0xLjI2LDAuOThsLTAuMSwwLjE1bC0wLjM4LDEuMjRsLTAuNTgsMS4wN2wtMC4yLDAuOTFsLTEuNDMsMC43bC0xLjI2LC0wLjkzbC0wLjE5LC0wLjA2bC0wLjk1LDAuMDRsLTAuMiwwLjA5bC0xLjQxLDEuMzlsLTAuNjEsMC4wMmwtMC4yNiwwLjE3bC0xLjE5LDIuNDJsLTAuNjEsMS42N1pcIiwgXCJuYW1lXCI6IFwiTmlnZXJpYVwifSwgXCJOWlwiOiB7XCJwYXRoXCI6IFwiTTg1Ny45LDM3OS42MmwxLjg1LDMuMWwwLjMzLDAuMTRsMC4yMiwtMC4yOGwwLjA0LC0xLjQxbDAuNTcsMC40bDAuMzUsMi4wNmwwLjE3LDAuMjJsMi4wMiwwLjk0bDEuNzgsMC4yNmwwLjIyLC0wLjA2bDEuMzEsLTEuMDFsMC44NCwwLjIybC0wLjUzLDIuMjdsLTAuNjcsMS41bC0xLjcxLC0wLjA1bC0wLjI1LDAuMTJsLTAuNjcsMC44OWwtMC4wNSwwLjIzbDAuMjEsMS4xNWwtMC4zMSwwLjQ2bC0yLjE1LDMuNTdsLTEuNiwwLjk5bC0wLjI4LC0wLjUxbC0wLjE1LC0wLjEzbC0wLjcyLC0wLjNsMS4yNywtMi4xNWwwLjAxLC0wLjI5bC0wLjgyLC0xLjYzbC0wLjE1LC0wLjE0bC0yLjUsLTEuMDlsMC4wNSwtMC42OWwxLjY3LC0wLjk0bDAuMTUsLTAuMjFsMC40MiwtMi4yNGwtMC4xMSwtMS45NWwtMC4wMywtMC4xMmwtMC45NywtMS44NWwwLjA1LC0wLjQxbC0wLjA5LC0wLjI1bC0xLjE4LC0xLjE3bC0xLjk0LC0yLjQ5bC0wLjg2LC0xLjY0bDAuMzgsLTAuMDlsMS4yNCwxLjQzbDAuMTIsMC4wOGwxLjgxLDAuNjhsMC42NywyLjM5Wk04NTMuOTMsMzkzLjU1bDAuNTcsMS4yNGwwLjQ0LDAuMTJsMS41MSwtMS4wM2wwLjUyLDAuOTFsMC4wLDEuMDlsLTAuODgsMS4zMWwtMS42MiwyLjJsLTEuMjYsMS4ybC0wLjA1LDAuMzhsMC42NCwxLjAybC0xLjQsMC4wM2wtMC4xNCwwLjA0bC0yLjE0LDEuMTZsLTAuMTQsMC4xN2wtMC42NywyLjBsLTEuMzgsMy4wNmwtMy4wNywyLjE5bC0yLjEyLC0wLjA2bC0xLjU1LC0wLjk5bC0wLjE0LC0wLjA1bC0yLjUzLC0wLjJsLTAuMzEsLTAuODRsMS4yNSwtMi4xNWwzLjA3LC0yLjk3bDEuNjIsLTAuNTlsMS44MSwtMS4xN2wyLjE4LC0xLjYzbDEuNTUsLTEuNjVsMS4wOCwtMi4xOGwwLjksLTAuNzJsMC4xMSwtMC4xN2wwLjM1LC0xLjU2bDEuMzcsLTEuMDdsMC40LDAuOTFaXCIsIFwibmFtZVwiOiBcIk5ldyBaZWFsYW5kXCJ9LCBcIk5QXCI6IHtcInBhdGhcIjogXCJNNjQxLjI2LDIxMy41M2wtMC4xNCwwLjk1bDAuMzIsMS42NGwtMC4yMSwwLjc4bC0xLjgzLDAuMDRsLTIuOTgsLTAuNjJsLTEuODYsLTAuMjVsLTEuMzcsLTEuM2wtMC4xOCwtMC4wOGwtMy4zOCwtMC4zNGwtMy4yMSwtMS40OWwtMi4zOCwtMS4zNGwtMi4xNiwtMC45MmwwLjg0LC0yLjJsMS41MSwtMS4xOGwwLjg5LC0wLjU3bDEuODMsMC43N2wyLjUsMS43NmwxLjM5LDAuNDFsMC43OCwxLjIxbDAuMTcsMC4xM2wxLjkxLDAuNTNsMi4wLDEuMTdsMi45MiwwLjY2bDIuNjMsMC4yNFpcIiwgXCJuYW1lXCI6IFwiTmVwYWxcIn0sIFwiQ0lcIjoge1wicGF0aFwiOiBcIk00MTMuNTMsMjcyLjA4bC0wLjgzLDAuMDJsLTEuNzksLTAuNDlsLTEuNjQsMC4wM2wtMy4wNCwwLjQ2bC0xLjczLDAuNzJsLTIuNCwwLjg5bC0wLjEyLC0wLjAybDAuMTYsLTEuN2wwLjE5LC0wLjI1bDAuMDYsLTAuMmwtMC4wOCwtMC45OWwtMC4wOSwtMC4xOWwtMS4wNiwtMS4wNWwtMC4xNSwtMC4wOGwtMC43MSwtMC4xNWwtMC41MSwtMC40OGwwLjQ1LC0wLjkybDAuMDIsLTAuMTlsLTAuMjQsLTEuMTZsMC4wNywtMC40M2wwLjE0LC0wLjBsMC4zLC0wLjI2bDAuMTUsLTEuMWwtMC4wMiwtMC4xNWwtMC4xMywtMC4zNGwwLjA5LC0wLjEzbDAuODMsLTAuMjdsMC4xOSwtMC4zN2wtMC42MiwtMi4wMmwtMC41NSwtMS4wbDAuMTQsLTAuNTlsMC4zNSwtMC4xNGwwLjI0LC0wLjE2bDAuNTMsMC4yOWwwLjE0LDAuMDRsMS45MywwLjAybDAuMjYsLTAuMTRsMC4zNiwtMC41OGwwLjM5LDAuMDFsMC40MywtMC4xN2wwLjI4LDAuNzlsMC40MywwLjE2bDAuNTYsLTAuMzFsMC44OSwtMC4zMmwwLjkyLDAuNDVsMC4zOSwwLjc1bDAuMTQsMC4xM2wxLjEzLDAuNTNsMC4zLC0wLjAzbDAuODEsLTAuNTlsMS4wMiwtMC4wOGwxLjQ5LDAuNTdsMC42MiwzLjMzbC0xLjAzLDIuMDlsLTAuNjUsMi44NGwwLjAyLDAuMmwxLjA1LDIuMDhsLTAuMDcsMC42NFpcIiwgXCJuYW1lXCI6IFwiSXZvcnkgQ29hc3RcIn0sIFwiQ0hcIjoge1wicGF0aFwiOiBcIk00NDQuNzEsMTU2LjI3bDAuMDUsMC4zbC0wLjM0LDAuNjlsMC4xMywwLjRsMS4xMywwLjU4bDEuMDcsMC4xbC0wLjEyLDAuODFsLTAuODcsMC40MmwtMS43NSwtMC4zN2wtMC4zNCwwLjE4bC0wLjQ3LDEuMWwtMC44NiwwLjA3bC0wLjMzLC0wLjM4bC0wLjQxLC0wLjA0bC0xLjM0LDEuMDFsLTEuMDIsMC4xM2wtMC45MywtMC41OGwtMC44MiwtMS4zMmwtMC4zNywtMC4xMmwtMC43NywwLjMybDAuMDIsLTAuODRsMS43NCwtMS42OWwwLjA5LC0wLjI1bC0wLjA0LC0wLjM4bDAuNzMsMC4xOWwwLjI2LC0wLjA2bDAuNiwtMC40OGwyLjAyLDAuMDJsMC4yNCwtMC4xMmwwLjM4LC0wLjUxbDIuMzEsMC44NFpcIiwgXCJuYW1lXCI6IFwiU3dpdHplcmxhbmRcIn0sIFwiQ09cIjoge1wicGF0aFwiOiBcIk0yMzIuMjQsMjg0Ljk1bC0wLjk0LC0wLjUybC0xLjIyLC0wLjgybC0wLjMxLC0wLjAxbC0wLjYyLDAuMzVsLTEuODgsLTAuMzFsLTAuNTQsLTAuOTVsLTAuMjksLTAuMTVsLTAuMzcsMC4wM2wtMi4zNCwtMS4zM2wtMC4xNSwtMC4zNWwwLjU3LC0wLjExbDAuMjQsLTAuMzJsLTAuMSwtMS4xNWwwLjQ2LC0wLjcxbDEuMTEsLTAuMTVsMC4yMSwtMC4xM2wxLjA1LC0xLjU3bDAuOTUsLTEuMzFsLTAuMDgsLTAuNDNsLTAuNzMsLTAuNDdsMC40LC0xLjI0bDAuMDEsLTAuMTZsLTAuNTMsLTIuMTVsMC40NCwtMC41NGwwLjA2LC0wLjI0bC0wLjQsLTIuMTNsLTAuMDYsLTAuMTNsLTAuOTMsLTEuMjJsMC4yMSwtMC44bDAuNTIsMC4xMmwwLjMyLC0wLjEzbDAuNDcsLTAuNzVsMC4wMywtMC4yN2wtMC41MiwtMS4zMmwwLjA5LC0wLjExbDEuMTQsMC4wN2wwLjIyLC0wLjA4bDEuODIsLTEuNzFsMC45NiwtMC4yNWwwLjIyLC0wLjI4bDAuMDIsLTAuODFsMC40MywtMi4wMWwxLjI4LC0xLjA0bDEuNDgsLTAuMDVsMC4yNywtMC4xOWwwLjEyLC0wLjMxbDEuNzMsMC4xOWwwLjIsLTAuMDVsMS45NiwtMS4yOGwwLjk3LC0wLjU2bDEuMTYsLTEuMTZsMC42NCwwLjExbDAuNDMsMC40NGwtMC4zMSwwLjU1bC0xLjQ5LDAuMzlsLTAuMTksMC4xNmwtMC42LDEuMmwtMC45NywwLjc0bC0wLjczLDAuOTRsLTAuMDYsMC4xM2wtMC4zLDEuNzZsLTAuNjgsMS40NGwwLjIzLDAuNDNsMS4xLDAuMTRsMC4yNywwLjk3bDAuMDgsMC4xM2wwLjQ5LDAuNDlsMC4xNywwLjg1bC0wLjI3LDAuODZsLTAuMDEsMC4xNGwwLjA5LDAuNTNsMC4yLDAuMjNsMC41MiwwLjE4bDAuNTQsMC43OWwwLjI3LDAuMTNsMy4xOCwtMC4yNGwxLjMxLDAuMjlsMS43LDIuMDhsMC4zMSwwLjFsMC45NiwtMC4yNmwxLjc1LDAuMTNsMS40MSwtMC4yN2wwLjU2LDAuMjdsLTAuMzYsMS4wN2wtMC41NCwwLjgxbC0wLjA1LDAuMTNsLTAuMiwxLjhsMC41MSwxLjc5bDAuMDcsMC4xMmwwLjY1LDAuNjhsMC4wNSwwLjMybC0xLjE2LDEuMTRsMC4wNSwwLjQ3bDAuODYsMC41MmwwLjYsMC43OWwwLjMxLDEuMDFsLTAuNywtMC44MWwtMC40NCwtMC4wMWwtMC43NCwwLjc3bC00Ljc1LC0wLjA1bC0wLjMsMC4zMWwwLjAzLDEuNTdsMC4yNSwwLjI5bDEuMiwwLjIxbC0wLjAyLDAuMjRsLTAuMSwtMC4wNWwtMC4yMiwtMC4wMmwtMS40MSwwLjQxbC0wLjIyLDAuMjlsLTAuMDEsMS44MmwwLjExLDAuMjNsMS4wNCwwLjg1bDAuMzUsMS4zbC0wLjA2LDEuMDJsLTEuMDIsNi4yNmwtMC44NCwtMC44OWwtMC4xOSwtMC4wOWwtMC4yNSwtMC4wMmwxLjM1LC0yLjEzbC0wLjEsLTAuNDJsLTEuOTIsLTEuMTdsLTAuMiwtMC4wNGwtMS40MSwwLjJsLTAuODIsLTAuMzlsLTAuMjYsMC4wbC0xLjI5LDAuNjJsLTEuNjMsLTAuMjdsLTEuNCwtMi41bC0wLjEyLC0wLjEybC0xLjEsLTAuNjFsLTAuODMsLTEuMmwtMS42NywtMS4xOWwtMC4yNywtMC4wNGwtMC41NCwwLjE5WlwiLCBcIm5hbWVcIjogXCJDb2xvbWJpYVwifSwgXCJDTlwiOiB7XCJwYXRoXCI6IFwiTTc0MC4zMiwxNDguOTRsMC4yMiwwLjIxbDQuMywxLjAzbDIuODQsMi4ybDAuOTksMi45MmwwLjI4LDAuMmwzLjgsMC4wbDAuMTUsLTAuMDRsMi4xMywtMS4yNGwzLjUsLTAuOGwtMS4wNSwyLjI5bC0wLjk1LDEuMTNsLTAuMDYsMC4xMmwtMC44NSwzLjQxbC0xLjU2LDIuODFsLTIuODMsLTAuNTFsLTAuMTksMC4wM2wtMi4xNSwxLjA5bC0wLjE1LDAuMzRsMC42NSwyLjU5bC0wLjMzLDMuM2wtMS4wMywwLjA3bC0wLjI4LDAuM2wwLjAxLDAuNzVsLTEuMDksLTEuMmwtMC40OCwwLjA1bC0wLjk0LDEuNmwtMy43NiwxLjI2bC0wLjIsMC4zNmwwLjI5LDEuMTlsLTEuNjcsLTAuMDhsLTEuMTEsLTAuODhsLTAuNDIsMC4wNWwtMS42OSwyLjA4bC0yLjcxLDEuNTdsLTIuMDQsMS44OGwtMy40MiwwLjg0bC0wLjExLDAuMDVsLTEuOCwxLjM0bC0xLjU0LDAuNDZsMC41MiwtMC41M2wwLjA2LC0wLjMzbC0wLjQ0LC0wLjk2bDEuODQsLTEuODRsMC4wMiwtMC40MWwtMS4zMiwtMS41NmwtMC4zNiwtMC4wOGwtMi4yMywxLjA4bC0yLjgzLDIuMDZsLTEuNTIsMS44NWwtMi4zMiwwLjEzbC0wLjIsMC4wOWwtMS4yOCwxLjM3bC0wLjAzLDAuMzdsMS4zMiwxLjk3bDAuMTgsMC4xM2wxLjgzLDAuNDNsMC4wNywxLjA4bDAuMTgsMC4yNmwxLjk4LDAuODRsMC4zLC0wLjAzbDIuNjYsLTEuOTZsMi4wNiwxLjA0bDAuMTIsMC4wM2wxLjQsMC4wN2wwLjI3LDEuMGwtMy4yNCwwLjczbC0wLjE3LDAuMTFsLTEuMTMsMS41bC0yLjM4LDEuNGwtMC4xLDAuMWwtMS4yOSwxLjk5bDAuMSwwLjQybDIuNiwxLjVsMC45NywyLjcybDEuNTIsMi41NmwxLjY2LDIuMDhsLTAuMDMsMS43NmwtMS40LDAuNjdsLTAuMTUsMC4zOGwwLjYsMS40N2wwLjEzLDAuMTVsMS4yOSwwLjc1bC0wLjM1LDIuMGwtMC41OCwxLjk2bC0xLjIyLDAuMjFsLTAuMiwwLjE0bC0xLjgzLDIuOTNsLTIuMDIsMy41MWwtMi4yOSwzLjEzbC0zLjQsMi40MmwtMy40MiwyLjE4bC0yLjc1LDAuM2wtMC4xNSwwLjA2bC0xLjMyLDEuMDFsLTAuNjgsLTAuNjdsLTAuNDEsLTAuMDFsLTEuMzcsMS4yN2wtMy40MiwxLjI4bC0yLjYyLDAuNGwtMC4yNCwwLjIxbC0wLjgsMi41N2wtMC45NSwwLjExbC0wLjUzLC0xLjU0bDAuNTIsLTAuODlsLTAuMTksLTAuNDRsLTMuMzYsLTAuODRsLTAuMTcsMC4wMWwtMS4wOSwwLjRsLTIuMzYsLTAuNjRsLTEuMCwtMC45bDAuMzUsLTEuMzRsLTAuMjMsLTAuMzdsLTIuMjIsLTAuNDdsLTEuMTUsLTAuOTRsLTAuMzYsLTAuMDJsLTIuMDgsMS4zN2wtMi4zNSwwLjI5bC0xLjk4LC0wLjAxbC0wLjEzLDAuMDNsLTEuMzIsMC42M2wtMS4yOCwwLjM4bC0wLjIxLDAuMzNsMC4zMywyLjY1bC0wLjc4LC0wLjA0bC0wLjE0LC0wLjM5bC0wLjA3LC0xLjA0bC0wLjQxLC0wLjI2bC0xLjcyLDAuNzFsLTAuOTYsLTAuNDNsLTEuNjMsLTAuODZsMC42NSwtMS45NWwtMC4xOSwtMC4zOGwtMS40MywtMC40NmwtMC41NiwtMi4yN2wtMC4zNCwtMC4yMmwtMi4yNiwwLjM4bDAuMjUsLTIuNjVsMi4yOSwtMi4xNWwwLjA5LC0wLjJsMC4xLC0yLjIxbC0wLjA3LC0yLjA5bC0wLjE1LC0wLjI1bC0xLjAyLC0wLjZsLTAuOCwtMS41MmwtMC4zMSwtMC4xNmwtMS40MiwwLjJsLTIuMTYsLTAuMzJsMC41NSwtMC43NGwwLjAxLC0wLjM1bC0xLjE3LC0xLjdsLTAuNDEsLTAuMDhsLTEuNjcsMS4wN2wtMS45NywtMC42M2wtMC4yNSwwLjAzbC0yLjg5LDEuNzNsLTIuMjYsMS45OWwtMS44MiwwLjNsLTEuMCwtMC42NmwtMC4xNSwtMC4wNWwtMS4yOCwtMC4wNmwtMS43NSwtMC42MWwtMC4yNCwwLjAybC0xLjM1LDAuNjlsLTAuMSwwLjA4bC0xLjIsMS40NWwtMC4xNCwtMS40MWwtMC40LC0wLjI1bC0xLjQ2LDAuNTVsLTIuODMsLTAuMjZsLTIuNzcsLTAuNjFsLTEuOTksLTEuMTdsLTEuOTEsLTAuNTRsLTAuNzgsLTEuMjFsLTAuMTcsLTAuMTNsLTEuMzYsLTAuMzhsLTIuNTQsLTEuNzlsLTIuMDEsLTAuODRsLTAuMjgsMC4wMmwtMC44OSwwLjU2bC0zLjMxLC0xLjgzbC0yLjM1LC0xLjY3bC0wLjU3LC0yLjQ5bDEuMzQsMC4yOGwwLjM2LC0wLjI4bDAuMDgsLTEuNDJsLTAuMDUsLTAuMTlsLTAuOTMsLTEuMzRsMC4yNCwtMi4xOGwtMC4wNywtMC4yMmwtMi42OSwtMy4zMmwtMC4xNSwtMC4xbC0zLjk3LC0xLjExbC0wLjY5LC0yLjA1bC0wLjExLC0wLjE1bC0xLjc5LC0xLjNsLTAuMzksLTAuNzNsLTAuMzYsLTEuNTdsMC4wOCwtMS4wOWwtMC4xOCwtMC4zbC0xLjUyLC0wLjY2bC0wLjIyLC0wLjAxbC0wLjUxLDAuMThsLTAuNTIsLTIuMjFsMC41OSwtMC41NWwwLjA2LC0wLjM1bC0wLjIyLC0wLjQ0bDIuMTIsLTEuMjRsMS42MywtMC41NWwyLjU4LDAuMzlsMC4zMSwtMC4xNmwwLjg3LC0xLjc1bDMuMDUsLTAuMzRsMC4yMSwtMC4xMmwwLjg0LC0xLjEybDMuODcsLTEuNTlsMC4xNSwtMC4xNGwwLjM1LC0wLjY4bDAuMDMsLTAuMTdsLTAuMTcsLTEuNTFsMS41MiwtMC43bDAuMTUsLTAuMzlsLTIuMTIsLTUuMGw0LjYyLC0xLjE1bDEuMzUsLTAuNzJsMC4xNCwtMC4xN2wxLjcyLC01LjM3bDQuNywwLjk5bDAuMjgsLTAuMDhsMS4zOSwtMS40M2wwLjA4LC0wLjJsMC4xMSwtMi45NWwxLjgzLC0wLjI2bDAuMTgsLTAuMWwxLjg1LC0yLjA4bDAuNjEsLTAuMTdsMC41NywxLjk3bDAuMSwwLjE1bDIuMiwxLjc1bDMuNDgsMS4xN2wxLjU5LDIuMzZsLTAuOTMsMy41M2wwLjA0LDAuMjRsMC45LDEuMzVsMC4yLDAuMTNsMi45OCwwLjUzbDMuMzIsMC40M2wyLjk3LDEuODlsMS40OSwwLjM1bDEuMDgsMi42N2wxLjUyLDEuODhsMC4yNCwwLjExbDIuNzQsLTAuMDdsNS4xNSwwLjY3bDMuMzYsLTAuNDFsMi4zOSwwLjQzbDMuNjcsMS44MWwwLjEzLDAuMDNsMi45MiwtMC4wbDEuMDIsMC44NmwwLjM0LDAuMDNsMi44OCwtMS41OWwzLjk4LC0xLjAzbDMuODEsLTAuMTNsMy4wMiwtMS4xMmwxLjc3LC0xLjYxbDEuNzMsLTEuMDFsMC4xMywtMC4zN2wtMC40MSwtMS4wMWwtMC43MiwtMS4wN2wxLjA5LC0xLjY2bDEuMjEsMC4yNGwyLjU3LDAuNjNsMC4yNCwtMC4wNGwyLjQ2LC0xLjYybDMuNzgsLTEuMTlsMC4xMywtMC4wOWwxLjgsLTIuMDNsMS42NiwtMC44NGwzLjU0LC0wLjQxbDEuOTMsMC4zNWwwLjM0LC0wLjIybDAuMjcsLTEuMTJsLTAuMDgsLTAuMjlsLTIuMjcsLTIuMjJsLTIuMDgsLTEuMDdsLTAuMjksMC4wMWwtMS44MiwxLjEybC0yLjM2LC0wLjQ3bC0wLjE0LDAuMDFsLTEuMTgsMC4zNGwtMC40NiwtMC45NGwxLjY5LC0zLjA4bDEuMSwtMi4yMWwyLjc1LDEuMTJsMC4yNiwtMC4wMmwzLjUzLC0yLjA2bDAuMTUsLTAuMjZsLTAuMDIsLTEuMzVsMi4xOCwtMy4zOWwxLjM1LC0xLjA0bDAuMTIsLTAuMjRsLTAuMDMsLTEuODVsLTAuMTUsLTAuMjVsLTEuMCwtMC41OGwxLjY4LC0xLjM3bDMuMDEsLTAuNTlsMy4yNSwtMC4wOWwzLjY3LDAuOTlsMi4wOCwxLjE4bDEuNTEsMy4zbDAuOTUsMS40NWwwLjg1LDEuOTlsMC45MiwzLjE5Wk02OTcuMCwyMzcuMzdsLTEuOTUsMS4xMmwtMS43NCwtMC42OGwtMC4wNiwtMS45bDEuMDgsLTEuMDNsMi42MiwtMC43bDEuMjMsMC4wNWwwLjM3LDAuNjVsLTEuMDEsMS4wOGwtMC41NCwxLjRaXCIsIFwibmFtZVwiOiBcIkNoaW5hXCJ9LCBcIkNNXCI6IHtcInBhdGhcIjogXCJNNDUzLjc2LDI3OC45MmwtMC4yNiwtMC4xMWwtMC4xOCwtMC4wMmwtMS40MiwwLjMxbC0xLjU2LC0wLjMzbC0xLjE3LDAuMTZsLTMuNywtMC4wNWwwLjMsLTEuNjNsLTAuMDQsLTAuMjFsLTAuOTgsLTEuNjZsLTAuMTUsLTAuMTNsLTEuMDMsLTAuMzhsLTAuNDYsLTEuMDFsLTAuMTMsLTAuMTRsLTAuNDgsLTAuMjdsMC4wMiwtMC40NmwwLjYyLC0xLjcybDEuMSwtMi4yNWwwLjU0LC0wLjAybDAuMiwtMC4wOWwxLjQxLC0xLjM5bDAuNzMsLTAuMDNsMS4zMiwwLjk3bDAuMzEsMC4wM2wxLjcyLC0wLjg1bDAuMTYsLTAuMmwwLjIyLC0xLjBsMC41NywtMS4wM2wwLjM2LC0xLjE4bDEuMjYsLTAuOThsMC4xLC0wLjE1bDAuNDksLTEuN2wwLjQ4LC0wLjUxbDAuMDcsLTAuMTNsMC4zNSwtMS4zbDAuNjMsLTEuNTRsMi4wNiwtMS45MmwwLjA5LC0wLjE3bDAuMTIsLTAuNzlsMC4yNCwtMC40MWwtMC4wNCwtMC4zNmwtMC44OSwtMC45MWwwLjA0LC0wLjQ1bDAuMjgsLTAuMDZsMC44NSwxLjM5bDAuMTYsMS41OWwtMC4wOSwxLjY2bDAuMDQsMC4xN2wxLjA5LDEuODRsLTAuODYsLTAuMDJsLTAuNzIsMC4xN2wtMS4wNywtMC4yNGwtMC4zNCwwLjE3bC0wLjU0LDEuMTlsMC4wNiwwLjM0bDEuNDgsMS40N2wxLjA2LDAuNDRsMC4zMiwwLjk0bDAuNzMsMS42bC0wLjMyLDAuNTdsLTEuMjMsMi40OWwtMC41NCwwLjQxbC0wLjEyLDAuMjFsLTAuMTksMS45NWwwLjI0LDEuMDhsLTAuMTgsMC42N2wwLjA3LDAuMjhsMS4xMywxLjI1bDAuMjQsMC45M2wwLjkyLDEuMjlsMS4xLDAuOGwwLjEsMS4wMWwwLjI2LDAuNzNsLTAuMTIsMC45M2wtMS42NSwtMC40OWwtMi4wMiwtMC42NmwtMy4xOSwtMC4xMVpcIiwgXCJuYW1lXCI6IFwiQ2FtZXJvb25cIn0sIFwiQ0xcIjoge1wicGF0aFwiOiBcIk0yNDYuOCw0MjkuMWwtMS4xNCwwLjc4bC0yLjI1LDEuMjFsLTAuMTYsMC4yM2wtMC4zNywyLjk0bC0wLjc1LDAuMDZsLTIuNzIsLTEuMDdsLTIuODMsLTIuMzRsLTMuMDYsLTEuOWwtMC43MSwtMS45MmwwLjY3LC0xLjg0bC0wLjAyLC0wLjI1bC0xLjIyLC0yLjEzbC0wLjMxLC01LjQxbDEuMDIsLTIuOTVsMi41OSwtMi40bC0wLjEzLC0wLjUxbC0zLjMyLC0wLjhsMi4wNiwtMi40bDAuMDcsLTAuMTVsMC43OSwtNC43N2wyLjQ0LDAuOTVsMC40LC0wLjIybDEuMzEsLTYuMzFsLTAuMTYsLTAuMzNsLTEuNjgsLTAuOGwtMC40MiwwLjIxbC0wLjcyLDMuNDdsLTEuMDEsLTAuMjdsMC43NCwtNC4wNmwwLjg1LC01LjQ2bDEuMTIsLTEuOTZsMC4wMywtMC4yMmwtMC43MSwtMi44MmwtMC4xOSwtMi45NGwwLjc2LC0wLjA3bDAuMjYsLTAuMmwxLjUzLC00LjYybDEuNzMsLTQuNTJsMS4wNywtNC4ybC0wLjU2LC00LjJsMC43MywtMi4ybDAuMDEsLTAuMTJsLTAuMjksLTMuM2wxLjQ2LC0zLjM0bDAuNDUsLTUuMTlsMC44LC01LjUybDAuNzgsLTUuODlsLTAuMTgsLTQuMzNsLTAuNDksLTMuNDdsMS4xLC0wLjU2bDAuMTMsLTAuMTNsMC40NCwtMC44OGwwLjksMS4yOWwwLjMyLDEuOGwwLjEsMC4xOGwxLjE2LDAuOTdsLTAuNzMsMi4zM2wwLjAxLDAuMjFsMS4zMywyLjkxbDAuOTcsMy42bDAuMzUsMC4yMmwxLjU3LC0wLjMxbDAuMTYsMC4zNGwtMC43OSwyLjUxbC0yLjYxLDEuMjVsLTAuMTcsMC4yOGwwLjA4LDQuMzZsLTAuNDgsMC43OWwwLjAxLDAuMzNsMC42LDAuODRsLTEuNjIsMS41NWwtMS42NywyLjZsLTAuODksMi40N2wtMC4wMiwwLjEzbDAuMjMsMi41NmwtMS41LDIuNzZsLTAuMDMsMC4yMWwxLjE1LDQuOGwwLjExLDAuMTdsMC41NCwwLjQybC0wLjAxLDIuMzdsLTEuNCwyLjdsLTAuMDMsMC4xNWwwLjA2LDIuMjVsLTEuOCwxLjc4bC0wLjA5LDAuMjFsMC4wMiwyLjczbDAuNzEsMi42M2wtMS4zMywwLjk0bC0wLjEyLDAuMTdsLTAuNjcsMi42NGwtMC41OSwzLjAzbDAuNCwzLjU1bC0wLjg0LDAuNTFsLTAuMTQsMC4zMWwwLjU4LDMuNWwwLjA4LDAuMTZsMC45NiwwLjk5bC0wLjcsMS4wOGwwLjExLDAuNDNsMS4wNCwwLjU1bDAuMTksMC44bC0wLjg5LDAuNDhsLTAuMTYsMC4zMWwwLjI2LDEuNzdsLTAuODksNC4wNmwtMS4zMSwyLjY3bC0wLjAzLDAuMTlsMC4yOCwxLjUzbC0wLjczLDEuODhsLTEuODUsMS4zN2wtMC4xMiwwLjI2bDAuMjIsMy40NmwwLjA2LDAuMTZsMC44OCwxLjE5bDAuMjgsMC4xMmwxLjMyLC0wLjE3bC0wLjA0LDIuMTNsMC4wNCwwLjE1bDEuMDQsMS45NWwwLjI0LDAuMTZsNS45NCwwLjQ0Wk0yNDguNzksNDMwLjcxbDAuMCw3LjQxbDAuMywwLjNsMi42NywwLjBsMS4wMSwwLjA2bC0wLjU0LDAuOTFsLTEuOTksMS4wMWwtMS4xMywtMC4xbC0xLjQyLC0wLjI3bC0xLjg3LC0xLjA2bC0yLjU3LC0wLjQ5bC0zLjA5LC0xLjlsLTIuNTIsLTEuODNsLTIuNjUsLTIuOTNsMC45MywwLjMybDMuNTQsMi4yOWwzLjMyLDEuMjNsMC4zNCwtMC4wOWwxLjI5LC0xLjU3bDAuODMsLTIuMzJsMi4xMSwtMS4yOGwxLjQzLDAuMzJaXCIsIFwibmFtZVwiOiBcIkNoaWxlXCJ9LCBcIkNBXCI6IHtcInBhdGhcIjogXCJNMjgwLjE0LDE0NS42NmwtMS42NiwyLjg4bDAuMDYsMC4zN2wwLjM3LDAuMDNsMS41LC0xLjAxbDEuMTcsMC40OWwtMC42NCwwLjgzbDAuMTMsMC40NmwyLjIyLDAuODlsMC4yOCwtMC4wM2wxLjAyLC0wLjdsMi4wOSwwLjgzbC0wLjY5LDIuMWwwLjM3LDAuMzhsMS40MywtMC40NWwwLjI3LDEuNDNsMC43NCwxLjg4bC0wLjk1LDIuNWwtMC44OCwwLjA5bC0xLjM0LC0wLjQ4bDAuNDksLTIuMzRsLTAuMTQsLTAuMzJsLTAuNywtMC40bC0wLjM2LDAuMDRsLTIuODEsMi42NmwtMC42MywtMC4wNWwxLjIsLTEuMDFsLTAuMSwtMC41MmwtMi40LC0wLjc3bC0yLjc5LDAuMThsLTQuNjUsLTAuMDlsLTAuMjIsLTAuNTRsMS4zNywtMC45OWwwLjAxLC0wLjQ4bC0wLjgyLC0wLjY1bDEuOTEsLTEuNzlsMi41NywtNS4xN2wxLjQ5LC0xLjgxbDIuMDQsLTEuMDdsMC42MywwLjA4bC0wLjI3LDAuNTFsLTEuMzMsMi4wN1pNMTkzLjkyLDc0Ljg1bC0wLjAxLDQuMjRsMC4xOSwwLjI4bDAuMzMsLTAuMDdsMy4xNCwtMy4yMmwyLjY1LDIuNWwtMC43MSwzLjA0bDAuMDYsMC4yNmwyLjQyLDIuODhsMC40NiwwLjBsMi42NiwtMy4xNGwxLjgzLC0zLjc0bDAuMDMsLTAuMTJsMC4xMywtNC41M2wzLjIzLDAuMzFsMy42MywwLjY0bDMuMTgsMi4wOGwwLjEzLDEuOTFsLTEuNzksMi4yMmwtMC4wLDAuMzdsMS42OSwyLjJsLTAuMjgsMS44bC00Ljc0LDIuODRsLTMuMzMsMC42MmwtMi41LC0xLjIxbC0wLjQxLDAuMTdsLTAuNzMsMi4wNWwtMi4zOSwzLjQ0bC0wLjc0LDEuNzhsLTIuNzgsMi42MWwtMy40OCwwLjI2bC0wLjE3LDAuMDdsLTEuOTgsMS42OGwtMC4xLDAuMjFsLTAuMTUsMi4zM2wtMi42OCwwLjQ1bC0wLjE3LDAuMDlsLTMuMSwzLjJsLTIuNzUsNC4zOGwtMC45OSwzLjA2bC0wLjE0LDQuMzFsMC4yNSwwLjMxbDMuNSwwLjU4bDEuMDcsMy4yNGwxLjE4LDIuNzZsMC4zNCwwLjE4bDMuNDMsLTAuNjlsNC41NSwxLjUybDIuNDUsMS4zMmwxLjc2LDEuNjVsMC4xMiwwLjA3bDMuMTEsMC45NmwyLjYzLDEuNDZsMC4xMywwLjA0bDQuMTIsMC4ybDIuNDEsMC4zbC0wLjM2LDIuODFsMC44LDMuNTFsMS44MSwzLjc4bDAuMDgsMC4xbDMuNzMsMy4xN2wwLjM0LDAuMDNsMS45MywtMS4wOGwwLjEzLC0wLjE1bDEuMzUsLTMuNDRsMC4wMSwtMC4xOGwtMS4zMSwtNS4zOGwtMC4wOCwtMC4xNGwtMS40NiwtMS41bDMuNjgsLTEuNTFsMi44NCwtMi40NmwxLjQ1LC0yLjU1bDAuMDQsLTAuMTdsLTAuMiwtMi4zOWwtMC4wNCwtMC4xMmwtMS43LC0zLjA3bC0yLjksLTIuNjRsMi43OSwtMy42NmwwLjA1LC0wLjI3bC0xLjA4LC0zLjM4bC0wLjgsLTUuNzVsMS40NSwtMC43NWw0LjE4LDEuMDNsMi42LDAuMzhsMC4xOCwtMC4wM2wxLjkzLC0wLjk1bDIuMTgsMS4yM2wzLjAxLDIuMThsMC43MywxLjQybDAuMjUsMC4xNmw0LjE4LDAuMjdsLTAuMDYsMi45NWwwLjgzLDQuN2wwLjIyLDAuMjRsMi4xOSwwLjU1bDEuNzUsMi4wOGwwLjM4LDAuMDdsMy42MywtMi4wM2wwLjExLC0wLjExbDIuMzgsLTQuMDZsMS4zNiwtMS40M2wxLjc2LDMuMDFsMy4yNiw0LjY4bDIuNjgsNC4xOWwtMC45NCwyLjA5bDAuMTIsMC4zOGwzLjMxLDEuOThsMi4yMywxLjk4bDAuMTMsMC4wN2wzLjk0LDAuODlsMS40OCwxLjAybDAuOTYsMi44MmwwLjIyLDAuMmwxLjg1LDAuNDNsMC44OCwxLjEzbDAuMTcsMy41M2wtMS42OCwxLjE2bC0xLjc2LDEuMTRsLTQuMDgsMS4xN2wtMC4xMSwwLjA2bC0zLjA4LDIuNjVsLTQuMTEsMC41MmwtNS4zNSwtMC42OWwtMy43NiwtMC4wMmwtMi42MiwwLjIzbC0wLjIsMC4xbC0yLjA1LDIuMjlsLTMuMTMsMS40MWwtMC4xMSwwLjA4bC0zLjYsNC4yNGwtMi44NywyLjkybC0wLjA1LDAuMzZsMC4zMywwLjE0bDIuMTMsLTAuNTJsMC4xNSwtMC4wOGwzLjk4LC00LjE1bDUuMTYsLTIuNjNsMy41OCwtMC4zMWwxLjgyLDEuM2wtMi4wOSwxLjkxbC0wLjA5LDAuMjlsMC44LDMuNDZsMC44MiwyLjM3bDAuMTUsMC4xN2wzLjI1LDEuNTZsMC4xNiwwLjAzbDQuMTQsLTAuNDVsMC4yMSwtMC4xMmwyLjAzLC0yLjg2bDAuMTEsMS40NmwwLjEzLDAuMjJsMS4yNiwwLjg4bC0yLjcsMS43OGwtNS41MSwxLjgzbC0yLjUyLDEuMjZsLTIuNzUsMi4xNmwtMS41MiwtMC4xOGwtMC4wOCwtMi4xNmw0LjE5LC0yLjQ3bDAuMTQsLTAuMzRsLTAuMywtMC4yMmwtNC4wMSwwLjFsLTIuNjYsMC4zNmwtMS40NSwtMS41NmwwLjAsLTQuMTZsLTAuMTEsLTAuMjNsLTEuMTEsLTAuOTFsLTAuMjgsLTAuMDVsLTEuNSwwLjQ4bC0wLjcsLTAuN2wtMC40NSwwLjAybC0xLjkxLDIuMzlsLTAuOCwyLjVsLTAuODIsMS4zMWwtMC45NSwwLjQzbC0wLjc3LDAuMTVsLTAuMjMsMC4ybC0wLjE4LDAuNTZsLTguMiwwLjAybC0wLjEzLDAuMDNsLTEuMTksMC42MWwtMi45NSwyLjQ1bC0wLjc4LDEuMTNsLTQuNiwwLjAxbC0wLjEyLDAuMDJsLTEuMTMsMC40OGwtMC4xMywwLjQ0bDAuMzcsMC41NWwwLjIsMC44MmwtMC4wMSwwLjA5bC0zLjEsMS40MmwtMi42MywwLjVsLTIuODQsMS41N2wtMC40NywwLjBsLTAuNzIsLTAuNGwtMC4xOCwtMC4yN2wwLjAzLC0wLjE1bDAuNTIsLTEuMGwxLjIsLTEuNzFsMC43MywtMS44bDAuMDIsLTAuMTdsLTEuMDMsLTUuNDdsLTAuMTUsLTAuMjFsLTIuMzUsLTEuMzJsMC4xNiwtMC4yOWwtMC4wNSwtMC4zNWwtMC4zNywtMC4zOGwtMC4yMiwtMC4wOWwtMC41NiwwLjBsLTAuMzUsLTAuMzRsLTAuMTEsLTAuNjVsLTAuNDYsLTAuMmwtMC4zOSwwLjI2bC0wLjIsLTAuMDNsLTAuMTEsLTAuMzNsLTAuNDgsLTAuMjVsLTAuMjEsLTAuNzFsLTAuMTUsLTAuMThsLTMuOTcsLTIuMDdsLTQuOCwtMi4zOWwtMC4yNSwtMC4wMWwtMi4xOSwwLjg5bC0wLjcyLDAuMDNsLTMuMDQsLTAuODJsLTAuMTQsLTAuMGwtMS45NCwwLjRsLTIuNCwtMC45OGwtMi41NiwtMC41MWwtMS43LC0wLjE5bC0wLjYyLC0wLjQ0bC0wLjQyLC0xLjY3bC0wLjMsLTAuMjNsLTAuODUsMC4wMmwtMC4yOSwwLjNsLTAuMDEsMC45NWwtNjkuMjYsLTAuMDFsLTQuNzcsLTMuMTRsLTEuNzgsLTEuNDFsLTQuNTEsLTEuMzhsLTEuMywtMi43M2wwLjM0LC0xLjk2bC0wLjE3LC0wLjMzbC0zLjA2LC0xLjM3bC0wLjQxLC0yLjU4bC0wLjExLC0wLjE4bC0yLjkyLC0yLjRsLTAuMDUsLTEuNTNsMS4zMiwtMS41OWwwLjA3LC0wLjJsLTAuMDcsLTIuMjFsLTAuMTYsLTAuMjZsLTQuMTksLTIuMjJsLTIuNTIsLTQuMDJsLTEuNTYsLTIuNmwtMC4wOCwtMC4wOWwtMi4yOCwtMS42NGwtMS42NSwtMS40OGwtMS4zMSwtMS44OWwtMC4zOCwtMC4xbC0yLjUxLDEuMjFsLTIuMjgsMS45MmwtMi4wMywtMi4yMmwtMS44NSwtMS43MWwtMi40NCwtMS4wNGwtMi4yOCwtMC4xMmwwLjAzLC0zNy43Mmw0LjI3LDAuOThsNC4wLDIuMTNsMi42MSwwLjRsMC4yNCwtMC4wN2wyLjE3LC0xLjgxbDIuOTIsLTEuMzNsMy42MywwLjUzbDAuMTgsLTAuMDNsMy43MiwtMS45NGwzLjg5LC0xLjA2bDEuNiwxLjcybDAuMzcsMC4wNmwxLjg3LC0xLjA0bDAuMTQsLTAuMTlsMC40OCwtMS44M2wxLjM3LDAuMzhsNC4xOCwzLjk2bDAuNDEsMC4wbDIuODksLTIuNjJsMC4yOCwyLjc5bDAuMzcsMC4yNmwzLjA4LC0wLjczbDAuMTcsLTAuMTJsMC44NSwtMS4xNmwyLjgxLDAuMjRsMy44MywxLjg2bDUuODYsMS42MWwzLjQ2LDAuNzVsMi40NCwtMC4yNmwyLjg5LDEuODlsLTMuMTIsMS44OWwtMC4xNCwwLjMxbDAuMjQsMC4yNGw0LjUzLDAuOTJsNi44NCwtMC41bDIuMDQsLTAuNzFsMi41NCwyLjQ0bDAuMzksMC4wMmwyLjcyLC0yLjE2bC0wLjAxLC0wLjQ4bC0yLjI2LC0xLjYxbDEuMjcsLTEuMTZsMi45NCwtMC4xOWwxLjk0LC0wLjQybDEuODksMC45N2wyLjQ5LDIuMzJsMC4yNCwwLjA4bDIuNzEsLTAuMzNsNC4zNSwxLjlsMC4xNywwLjAybDMuODYsLTAuNjdsMy42MiwwLjFsMC4zMSwtMC4zM2wtMC4yNiwtMi40NGwxLjksLTAuNjVsMy41OCwxLjM2bC0wLjAxLDMuODRsMC4yMywwLjI5bDAuMzQsLTAuMTdsMS41MSwtMy4yM2wxLjgxLDAuMWwwLjMxLC0wLjIybDEuMTMsLTQuMzdsLTAuMDgsLTAuMjlsLTIuNjgsLTIuNzNsLTIuODMsLTEuNzZsMC4xOSwtNC43M2wyLjc3LC0zLjE1bDMuMDYsMC42OWwyLjQ0LDEuOTdsMy4yNCw0Ljg4bC0yLjA1LDIuMDJsMC4xNSwwLjUxbDQuNDEsMC44NVpNMjY1Ljg1LDE1MC43bC0wLjg0LDAuMDRsLTMuMTUsLTAuOTlsLTEuNzcsLTEuMTdsMC4xOSwtMC4wNmwzLjE3LDAuNzlsMi4zOSwxLjI3bDAuMDEsMC4xMlpNMjQ5LjQxLDMuNzFsNi42OCwwLjQ5bDUuMzQsMC43OWw0LjM0LDEuNmwtMC4wOCwxLjI0bC01LjkxLDIuNTZsLTYuMDMsMS4yMWwtMi4zNiwxLjM4bC0wLjE0LDAuMzRsMC4yOSwwLjIybDQuMzcsLTAuMDJsLTQuOTYsMy4wMWwtNC4wNiwxLjY0bC0wLjExLDAuMDhsLTQuMjEsNC42MmwtNS4wNywwLjkybC0wLjEyLDAuMDVsLTEuNTMsMS4xbC03LjUsMC41OWwtMC4yOCwwLjI4bDAuMjQsMC4zMWwyLjY3LDAuNTRsLTEuMDQsMC42bC0wLjA5LDAuNDRsMS44OSwyLjQ5bC0yLjExLDEuNjZsLTMuODMsMS41MmwtMC4xNSwwLjEzbC0xLjE0LDIuMDFsLTMuNDEsMS41NWwtMC4xNiwwLjM2bDAuMzUsMS4xOWwwLjMsMC4yMmwzLjk4LC0wLjE5bDAuMDMsMC43OGwtNi40MiwyLjk5bC02LjQ0LC0xLjQxbC03LjQxLDAuNzlsLTMuNzIsLTAuNjJsLTQuNDgsLTAuMjZsLTAuMjUsLTIuMGw0LjM3LC0xLjEzbDAuMjEsLTAuMzhsLTEuMTQsLTMuNTVsMS4xMywtMC4yOGw2LjYxLDIuMjlsMC4zNSwtMC4xMmwtMC4wNCwtMC4zN2wtMy40MSwtMy40NWwtMC4xNCwtMC4wOGwtMy41NywtMC45MmwxLjYyLC0xLjdsNC4zNiwtMS4zbDAuMiwtMC4xOGwwLjcxLC0xLjk0bC0wLjEyLC0wLjM2bC0zLjQ1LC0yLjE1bC0wLjg4LC0yLjQzbDYuMzYsMC4yM2wxLjk0LDAuNjFsMC4yMywtMC4wMmwzLjkxLC0yLjFsMC4xNSwtMC4zMmwtMC4yNiwtMC4yNGwtNS42OSwtMC42N2wtOC42OSwwLjM3bC00LjMsLTEuOTJsLTIuMTIsLTIuMzlsLTIuODIsLTEuNjhsLTAuNDQsLTEuNjVsMy40MSwtMS4wNmwyLjkzLC0wLjJsNC45MSwtMC45OWwzLjY5LC0yLjI4bDIuOTMsMC4zMWwyLjY0LDEuNjhsMC40MiwtMC4xbDEuODQsLTMuMjNsMy4xNywtMC45Nmw0LjQ1LC0wLjY5bDcuNTYsLTAuMjZsMS4yNiwwLjY0bDAuMTgsMC4wM2w3LjIsLTEuMDZsMTAuODEsMC44Wk0yMDMuOTQsNTcuNTlsMC4wMSwwLjMybDEuOTcsMi45N2wwLjUxLC0wLjAxbDIuMjYsLTMuNzVsNi4wNSwtMS44OWw0LjA4LDQuNzJsLTAuMzYsMi45NWwwLjM4LDAuMzNsNC45NSwtMS4zNmwwLjExLC0wLjA1bDIuMjMsLTEuNzdsNS4zNywyLjMxbDMuMzIsMi4xNGwwLjMsMS44OWwwLjM2LDAuMjVsNC40OCwtMS4wMWwyLjQ5LDIuOGwwLjE0LDAuMDlsNS45OSwxLjc4bDIuMDksMS43NGwyLjE4LDMuODNsLTQuMjksMS45MWwtMC4wMSwwLjU0bDUuOSwyLjgzbDMuOTUsMC45NGwzLjU0LDMuODRsMC4yLDAuMWwzLjU4LDAuMjVsLTAuNjcsMi41MWwtNC4xOCw0LjU0bC0yLjg0LC0xLjYxbC0zLjkxLC0zLjk1bC0wLjI2LC0wLjA5bC0zLjI0LDAuNTJsLTAuMjUsMC4yNmwtMC4zMiwyLjM3bDAuMSwwLjI2bDIuNjMsMi4zOGwzLjQyLDEuODlsMC45NiwxLjBsMS41NywzLjhsLTAuNzQsMi40M2wtMi44NSwtMC45NmwtNi4yNiwtMy4xNWwtMC4zOCwwLjA5bDAuMDQsMC4zOWwzLjU0LDMuNGwyLjU1LDIuMzFsMC4yMywwLjc4bC02LjI2LC0xLjQzbC01LjMzLC0yLjI1bC0yLjczLC0xLjczbDAuNjcsLTAuODZsLTAuMDksLTAuNDVsLTcuMzgsLTQuMDFsLTAuNDQsMC4yN2wwLjAzLDAuODlsLTYuODUsMC42MWwtMS44LC0xLjE3bDEuNDMsLTIuNmw0LjU2LC0wLjA3bDUuMTUsLTAuNTJsMC4yMywtMC40NWwtMC43NiwtMS4zNGwwLjgsLTEuODlsMy4yMSwtNC4wNmwwLjA1LC0wLjI5bC0wLjcyLC0xLjk1bC0wLjk3LC0xLjQ3bC0wLjExLC0wLjFsLTMuODQsLTIuMWwtNC41MywtMS4zM2wxLjA5LC0wLjc1bDAuMDUsLTAuNDVsLTIuNjUsLTIuNzVsLTAuMTgsLTAuMDlsLTIuMTIsLTAuMjRsLTEuOTEsLTEuNDdsLTAuMzksMC4wMmwtMS4yNywxLjI1bC00LjQsMC41NmwtOS4wNiwtMC45OWwtNS4yOCwtMS4zMWwtNC4wMSwtMC42N2wtMS43MiwtMS4zMWwyLjMyLC0xLjg1bDAuMSwtMC4zM2wtMC4yOCwtMC4ybC0zLjMsLTAuMDJsLTAuNzQsLTQuMzZsMS44NiwtNC4wOWwyLjQ2LC0xLjg4bDUuNzQsLTEuMTVsLTEuNSwyLjU1Wk0yNjEuMjgsMTU5LjI4bDAuMTksMC4xNGwxLjgyLDAuNDJsMS42NiwtMC4wNWwtMC42NiwwLjY4bC0wLjc1LDAuMTZsLTMuMCwtMS4yNWwtMC40NiwtMC43N2wwLjUxLC0wLjUybDAuNjgsMS4xOVpNMjMwLjg3LDg0LjQ4bC0yLjQ4LDAuMTlsLTAuNTIsLTEuNzRsMC45NiwtMi4xN2wyLjAzLC0wLjUzbDEuNzEsMS4wNGwwLjAyLDEuNmwtMC4yMiwwLjQ2bC0xLjUsMS4xNlpNMjI5LjUyLDU4LjE5bDAuMTQsMC44MmwtNC45OSwtMC4yMmwtMi43MywwLjYzbC0wLjU5LC0wLjIzbC0yLjYxLC0yLjRsMC4wOCwtMS4zOGwwLjk0LC0wLjI1bDUuNjEsMC41MWw0LjE0LDIuNTRaTTIyMi4xMiwxMDUuMGwtMC43OSwxLjYzbC0wLjc1LC0wLjIybC0wLjUyLC0wLjkxbDAuMDQsLTAuMDlsMC44NCwtMS4wMWwwLjc0LDAuMDZsMC40NCwwLjU1Wk0xODMuNzcsMzguMjJsMi43MiwxLjY1bDAuMTYsMC4wNGw0LjgzLC0wLjAxbDEuOTIsMS41MmwtMC41MSwxLjc1bDAuMTgsMC4zNmwyLjg0LDEuMTRsMS41NiwxLjE5bDAuMTYsMC4wNmwzLjM3LDAuMjJsMy42NSwwLjQybDQuMDcsLTEuMWw1LjA1LC0wLjQzbDMuOTYsMC4zNWwyLjUzLDEuOGwwLjQ4LDEuNzlsLTEuMzcsMS4xNmwtMy42LDEuMDNsLTMuMjIsLTAuNTlsLTcuMTcsMC43NmwtNS4xLDAuMDlsLTQuMCwtMC42bC02LjQ4LC0xLjU2bC0wLjgxLC0yLjU3bC0wLjMsLTIuNDlsLTAuMSwtMC4xOWwtMi41MSwtMi4yNWwtMC4xNiwtMC4wN2wtNS4xMiwtMC42M2wtMi42MSwtMS40NWwwLjc1LC0xLjcxbDQuODgsMC4zMlpNMjA3LjQ2LDkxLjI2bDAuNDIsMS42MmwwLjQyLDAuMTlsMS4xMiwtMC41NWwxLjM1LDAuOTlsMi43NCwxLjM5bDIuNzMsMS4ybDAuMiwxLjc0bDAuMzUsMC4yNmwxLjcyLC0wLjI5bDEuMzEsMC45N2wtMS43MiwwLjk2bC0zLjY4LC0wLjlsLTEuMzQsLTEuNzFsLTAuNDMsLTAuMDRsLTIuNDYsMi4xbC0zLjIzLDEuODVsLTAuNzQsLTEuOThsLTAuMzEsLTAuMTlsLTIuNDcsMC4yOGwxLjQ5LC0xLjM0bDAuMSwtMC4xOWwwLjMyLC0zLjE1bDAuNzksLTMuNDVsMS4zNCwwLjI1Wk0yMTUuNTksMTAyLjY2bC0yLjczLDIuMGwtMS40OSwtMC4wOGwtMC4zNywtMC43bDEuNjEsLTEuNTZsMy4wLDAuMDNsLTAuMDIsMC4zWk0yMDIuNzksMjQuMDdsMC4xMSwwLjEybDIuNTQsMS41M2wtMy4wMSwxLjQ3bC00LjU1LDQuMDdsLTQuMywwLjM4bC01LjA3LC0wLjY4bC0yLjUxLC0yLjA5bDAuMDMsLTEuNzJsMS44NiwtMS40bDAuMSwtMC4zNGwtMC4yOSwtMC4ybC00LjQ5LDAuMDRsLTIuNjMsLTEuNzlsLTEuNDUsLTIuMzZsMS42MSwtMi4zOGwxLjY1LC0xLjY5bDIuNDcsLTAuNGwwLjE5LC0wLjQ4bC0wLjcyLC0wLjg5bDUuMSwtMC4yNmwzLjEsMy4wNWwwLjEzLDAuMDdsNC4yMSwxLjI1bDMuOTksMS4wNmwxLjkyLDMuNjVaTTE4Ny41LDU5LjNsLTAuMTUsMC4xbC0yLjU5LDMuNGwtMi41LC0wLjE1bC0xLjQ3LC0zLjkybDAuMDQsLTIuMjRsMS4yMiwtMS45MmwyLjM0LC0xLjI2bDUuMTEsMC4xN2w0LjI4LDEuMDZsLTMuMzYsMy44NmwtMi45LDAuOVpNMTg2LjE5LDQ4LjhsLTEuMTUsMS42M2wtMy40MiwtMC4zNWwtMi42OCwtMS4xNWwxLjExLC0xLjg4bDMuMzQsLTEuMjdsMi4wMSwxLjYzbDAuNzksMS4zOFpNMTg1Ljc4LDM1LjQxbC0wLjk1LDAuMTNsLTQuNDgsLTAuMzNsLTAuNCwtMC45MWw0LjUsMC4wN2wxLjQ1LDAuODJsLTAuMSwwLjIxWk0xODAuNzYsMzIuNTZsLTMuNDMsMS4wM2wtMS44NSwtMS4xNGwtMS4wMSwtMS45MmwtMC4xNiwtMS44N2wyLjg3LDAuMmwxLjM5LDAuMzVsMi43NSwxLjc1bC0wLjU1LDEuNlpNMTgxLjAzLDc2LjMybC0xLjIxLDEuMmwtMy4xOSwtMS4yNmwtMC4xOCwtMC4wMWwtMS45MiwwLjQ1bC0yLjg4LC0xLjY3bDEuODQsLTEuMTZsMS42LC0xLjc3bDIuNDUsMS4xN2wxLjQ1LDAuNzdsMi4wNSwyLjI4Wk0xNjkuNzIsNTQuNzZsMi44MywwLjk3bDAuMTQsMC4wMWw0LjI1LC0wLjU4bDAuNDcsMS4wMWwtMi4xOSwyLjE2bDAuMDcsMC40OGwzLjYxLDEuOTVsLTAuNDEsMy44NGwtMy44NywxLjY4bC0yLjIzLC0wLjM2bC0xLjczLC0xLjc1bC02LjA3LC0zLjUzbDAuMDMsLTEuMDFsNC43OSwwLjU1bDAuMywtMC4xNmwtMC4wNCwtMC4zNGwtMi41NSwtMi44OWwyLjU5LC0yLjA1Wk0xNzQuNDQsNDAuNTZsMS40OSwxLjg3bDAuMDcsMi40OGwtMS4wNywzLjUybC0zLjg3LDAuNDhsLTIuNDEsLTAuNzJsMC4wNSwtMi43MmwtMC4zMywtMC4zbC0zLjc5LDAuMzZsLTAuMTMsLTMuMzFsMi4zNiwwLjE0bDAuMTUsLTAuMDNsMy43LC0xLjc0bDMuNDQsMC4yOWwwLjMxLC0wLjIybDAuMDMsLTAuMTJaTTE3MC4xNCwzMS41bDAuNzUsMS43NGwtMy41MiwtMC41MmwtNC4xOSwtMS43N2wtNC42NSwtMC4xN2wxLjY1LC0xLjExbC0wLjA1LC0wLjUybC0yLjg2LC0xLjI2bC0wLjEzLC0xLjU4bDQuNTIsMC43bDYuNjYsMS45OWwxLjg0LDIuNVpNMTM0LjY0LDU4LjA4bC0xLjA4LDEuOTNsMC4zNCwwLjQ0bDUuNDQsLTEuNDFsMy4zNywyLjMybDAuMzcsLTAuMDJsMi42NiwtMi4yOGwyLjAzLDEuMzhsMi4wMSw0LjUzbDAuNTMsMC4wNGwxLjI2LC0xLjkzbDAuMDMsLTAuMjdsLTEuNjcsLTQuNTVsMS44MiwtMC41OGwyLjM2LDAuNzNsMi42OSwxLjg0bDEuNTMsNC40NmwwLjc3LDMuMjRsMC4xNSwwLjE5bDQuMjIsMi4yNmw0LjMyLDIuMDRsLTAuMjEsMS41MWwtMy44NywwLjM0bC0wLjE5LDAuNWwxLjQ1LDEuNTRsLTAuNjUsMS4yM2wtNC4zLC0wLjY1bC00LjQsLTEuMTlsLTIuOTcsMC4yOGwtNC42NywxLjQ4bC02LjMxLDAuNjVsLTQuMjcsMC4zOWwtMS4yNiwtMS45MWwtMC4xNSwtMC4xMmwtMy40MiwtMS4ybC0wLjE2LC0wLjAxbC0yLjA1LDAuNDVsLTIuNjYsLTMuMDJsMS4yLC0wLjM0bDMuODIsLTAuNzZsMy41OCwwLjE5bDMuMjcsLTAuNzhsMC4yMywtMC4yOWwtMC4yNCwtMC4yOWwtNC44NCwtMS4wNmwtNS40MiwwLjM1bC0zLjQsLTAuMDlsLTAuOTcsLTEuMjJsNS4zOSwtMS43bDAuMjEsLTAuMzNsLTAuMywtMC4yNWwtMy44MiwwLjA2bC0zLjk1LC0xLjFsMS44OCwtMy4xM2wxLjY4LC0xLjgxbDYuNTQsLTIuODRsMi4xMSwwLjc3Wk0xNTguODUsNTYuNThsLTEuODIsMi42MmwtMy4zOCwtMi45bDAuNDksLTAuMzlsMy4xNywtMC4xOGwxLjU0LDAuODZaTTE0OS43MSw0Mi43bDEuMCwxLjg3bDAuMzcsMC4xNGwyLjE3LC0wLjgzbDIuMzMsMC4ybDAuMzgsMi4xNmwtMS4zOCwyLjE3bC04LjMzLDAuNzZsLTYuMzQsMi4xNWwtMy41MSwwLjFsLTAuMjIsLTEuMTNsNC45OCwtMi4xMmwwLjE3LC0wLjM0bC0wLjMxLC0wLjIzbC0xMS4yNywwLjZsLTMuMDQsLTAuNzhsMy4xNCwtNC41N2wyLjIsLTEuMzVsNi44NywxLjdsNC40LDMuMGwwLjE0LDAuMDVsNC4zNywwLjM5bDAuMjcsLTAuNDhsLTMuNDEsLTQuNjhsMS45NiwtMS42MmwyLjI4LDAuNTNsMC43OSwyLjMyWk0xNDUuNDQsMjkuODNsLTIuMTgsMC43N2wtMy43OSwtMC4wbDAuMDIsLTAuMzFsMi4zNCwtMS41bDEuMiwwLjIzbDIuNDIsMC44M1pNMTQ0LjgzLDM0LjVsLTQuNDQsMS40NmwtMy4xOCwtMS40OGwxLjYsLTEuMzZsMy41MSwtMC41M2wzLjEsMC43NWwtMC42LDEuMTZaTTExOS4wMiw2NS44N2wtNi4xNywyLjA3bC0xLjE5LC0xLjgybC0wLjEzLC0wLjExbC01LjQ4LC0yLjMybDAuOTIsLTEuN2wxLjczLC0zLjQ0bDIuMTYsLTMuMTVsLTAuMDIsLTAuMzZsLTIuMDksLTIuNTZsNy44NCwtMC43MWwzLjU5LDEuMDJsNi4zMiwwLjI3bDIuMzUsMS4zN2wyLjI1LDEuNzFsLTIuNjgsMS4wNGwtNi4yMSwzLjQxbC0zLjEsMy4yOGwtMC4wOCwwLjIxbDAuMCwxLjgxWk0xMjkuNjYsMzUuNGwtMC4zLDMuNTVsLTEuNzcsMS42N2wtMi4zNCwwLjI3bC00LjYyLDIuMmwtMy44OSwwLjc2bC0yLjgzLC0wLjkzbDMuODUsLTMuNTJsNS4wNCwtMy4zNmwzLjc1LDAuMDdsMy4xMSwtMC43Wk0xMTEuMjQsMTUyLjc0bC0wLjgyLDAuMjlsLTMuOTIsLTEuMzlsLTAuNywtMS4wNmwtMC4xMiwtMC4xbC0yLjE1LC0xLjA5bC0wLjQxLC0wLjg0bC0wLjIsLTAuMTZsLTIuNDQsLTAuNTZsLTAuODQsLTEuNTZsMC4xLC0wLjM2bDIuMzQsMC42NGwxLjUzLDAuNWwyLjI4LDAuMzRsMC43OCwxLjA0bDEuMjQsMS41NWwwLjA5LDAuMDhsMi40MiwxLjNsMC44MSwxLjM5Wk04OC41NCwxMzQuODJsMC4xNCwwLjAybDIuMCwtMC4yM2wtMC42NywzLjQ4bDAuMDYsMC4yNGwxLjc4LDIuMjJsLTAuMjQsLTAuMGwtMS40LC0xLjQybC0wLjkxLC0xLjUzbC0xLjI2LC0xLjA4bC0wLjQyLC0xLjM1bDAuMDksLTAuNjZsMC44MiwwLjMxWlwiLCBcIm5hbWVcIjogXCJDYW5hZGFcIn0sIFwiQ0dcIjoge1wicGF0aFwiOiBcIk00NTMuNjYsMjk2LjYxbC0wLjksLTAuODJsLTAuMzUsLTAuMDRsLTAuODMsMC40OGwtMC43NywwLjgzbC0xLjY1LC0yLjEzbDEuNjYsLTEuMmwwLjA4LC0wLjM5bC0wLjgxLC0xLjQzbDAuNTksLTAuNDNsMS42MiwtMC4yOWwwLjI0LC0wLjI0bDAuMSwtMC41OGwwLjk0LDAuODRsMC4xOSwwLjA4bDIuMjEsMC4xMWwwLjI3LC0wLjE0bDAuODEsLTEuMjlsMC4zMiwtMS43NmwtMC4yNywtMS45NmwtMC4wNiwtMC4xNWwtMS4wOCwtMS4zNWwxLjAyLC0yLjc0bC0wLjA5LC0wLjM0bC0wLjYyLC0wLjVsLTAuMjIsLTAuMDZsLTEuNjYsMC4xOGwtMC41NSwtMS4wM2wwLjEyLC0wLjczbDIuODUsMC4wOWwxLjk4LDAuNjVsMi4wLDAuNTlsMC4zOCwtMC4yNWwwLjE3LC0xLjNsMS4yNiwtMi4yNGwxLjM0LC0xLjE5bDEuNTQsMC4zOGwxLjM1LDAuMTJsLTAuMTEsMS4xNWwtMC43NCwxLjM0bC0wLjUsMS42MWwtMC4zMSwyLjIybDAuMTIsMS40MWwtMC40LDAuOWwtMC4wNiwwLjg4bC0wLjI0LDAuNjdsLTEuNTcsMS4xNWwtMS4yNCwxLjQxbC0xLjA5LDIuNDNsLTAuMDMsMC4xM2wwLjA4LDEuOTVsLTAuNTUsMC42OWwtMS40NiwxLjIzbC0xLjMyLDEuNDFsLTAuNjEsLTAuMjlsLTAuMTMsLTAuNTdsLTAuMjksLTAuMjNsLTEuMzYsLTAuMDJsLTAuMjMsMC4xbC0wLjcyLDAuODFsLTAuNDEsLTAuMTZaXCIsIFwibmFtZVwiOiBcIlJlcHVibGljIG9mIHRoZSBDb25nb1wifSwgXCJDRlwiOiB7XCJwYXRoXCI6IFwiTTQ1OS40MSwyNjYuNTZsMS45LC0wLjE3bDAuMjIsLTAuMTJsMC4zNiwtMC41bDAuMTQsMC4wMmwwLjU1LDAuNTFsMC4yOSwwLjA3bDMuMTUsLTAuOTZsMC4xMiwtMC4wN2wxLjA1LC0wLjk3bDEuMjksLTAuODdsMC4xMiwtMC4zM2wtMC4xNywtMC42MWwwLjM4LC0wLjEybDIuMzYsMC4xNWwwLjE1LC0wLjAzbDIuMzYsLTEuMTdsMC4xMiwtMC4xbDEuNzgsLTIuNzJsMS4xOCwtMC45NmwxLjIzLC0wLjM0bDAuMjEsMC43OWwwLjA3LDAuMTNsMS4zNywxLjVsMC4wMSwwLjg2bC0wLjM5LDEuMGwtMC4wMSwwLjE3bDAuMTYsMC43OGwwLjEsMC4xN2wwLjkxLDAuNzZsMS44OSwxLjA5bDEuMjQsMC45MmwwLjAyLDAuNjdsMC4xMiwwLjIzbDEuNjcsMS4zbDAuOTksMS4wM2wwLjYxLDEuNDZsMC4xNCwwLjE1bDEuNzksMC45NWwwLjIsMC40bC0wLjQ0LDAuMTRsLTEuNTQsLTAuMDZsLTEuOTgsLTAuMjZsLTAuOTMsMC4yMmwtMC4xOSwwLjE0bC0wLjMsMC40OGwtMC41NywwLjA1bC0wLjkxLC0wLjQ5bC0wLjI2LC0wLjAxbC0yLjcsMS4yMWwtMS4wNCwtMC4yM2wtMC4yMSwwLjAzbC0wLjM0LDAuMTlsLTAuMTIsMC4xM2wtMC42NCwxLjNsLTEuNjcsLTAuNDNsLTEuNzcsLTAuMjRsLTEuNTgsLTAuOTFsLTIuMDYsLTAuODVsLTAuMjcsMC4wMmwtMS40MiwwLjg4bC0wLjk3LDEuMjdsLTAuMDYsMC4xNGwtMC4xOSwxLjQ2bC0xLjMsLTAuMTFsLTEuNjcsLTAuNDJsLTAuMjcsMC4wN2wtMS41NSwxLjQxbC0wLjk5LDEuNzZsLTAuMTQsLTEuMThsLTAuMTMsLTAuMjJsLTEuMSwtMC43OGwtMC44NiwtMS4ybC0wLjIsLTAuODRsLTAuMDcsLTAuMTNsLTEuMDcsLTEuMTlsMC4xNiwtMC41OWwwLjAsLTAuMTVsLTAuMjQsLTEuMDFsMC4xOCwtMS43N2wwLjUsLTAuMzhsMC4wOSwtMC4xMWwxLjE4LC0yLjRaXCIsIFwibmFtZVwiOiBcIkNlbnRyYWwgQWZyaWNhbiBSZXB1YmxpY1wifSwgXCJDRFwiOiB7XCJwYXRoXCI6IFwiTTQ5Ny44NSwyNzYuMjVsLTAuMTQsMi43N2wwLjIsMC4zbDAuNTcsMC4xOWwtMC40NywwLjUybC0xLjAsMC43MWwtMC45NiwxLjMxbC0wLjU2LDEuMjJsLTAuMTYsMi4wNGwtMC41NCwwLjg5bC0wLjA0LDAuMTVsLTAuMDIsMS43NmwtMC42MywwLjYxbC0wLjA5LDAuMmwtMC4wOCwxLjMzbC0wLjIsMC4xMWwtMC4xNSwwLjIxbC0wLjIzLDEuMzdsMC4wMywwLjJsMC42LDEuMDhsMC4xNiwyLjk2bDAuNDQsMi4yOWwtMC4yNCwxLjI1bDAuMDEsMC4xNWwwLjUsMS40NmwwLjA3LDAuMTJsMS40MSwxLjM3bDEuMDksMi41NmwtMC41MSwtMC4xMWwtMy40NSwwLjQ1bC0wLjY3LDAuM2wtMC4xNSwwLjE1bC0wLjcxLDEuNjFsMC4wMSwwLjI2bDAuNTIsMS4wM2wtMC40MywyLjlsLTAuMzEsMi41NWwwLjEzLDAuMjlsMC43LDAuNDZsMS43NSwwLjk5bDAuMzEsLTAuMDFsMC4yNiwtMC4xN2wwLjE1LDEuOWwtMS40NCwtMC4wMmwtMC45NCwtMS4yOGwtMC45NCwtMS4xbC0wLjE3LC0wLjFsLTEuNzYsLTAuMzNsLTAuNSwtMS4xOGwtMC40MiwtMC4xNWwtMS40NCwwLjc1bC0xLjc5LC0wLjMybC0wLjc3LC0xLjA1bC0wLjIsLTAuMTJsLTEuNTksLTAuMjNsLTAuOTcsMC4wNGwtMC4xLC0wLjUzbC0wLjI3LC0wLjI1bC0wLjg2LC0wLjA2bC0xLjEzLC0wLjE1bC0xLjYyLDAuMzdsLTEuMDQsLTAuMDZsLTAuMzIsMC4wOWwwLjExLC0yLjU2bC0wLjA4LC0wLjIxbC0wLjc3LC0wLjg3bC0wLjE3LC0xLjQxbDAuMzYsLTEuNDdsLTAuMDMsLTAuMjFsLTAuNDgsLTAuOTFsLTAuMDQsLTEuNTJsLTAuMywtMC4yOWwtMi42NSwwLjAybDAuMTMsLTAuNTNsLTAuMjksLTAuMzdsLTEuMjgsMC4wMWwtMC4yOCwwLjIxbC0wLjA3LDAuMjRsLTEuMzUsMC4wOWwtMC4yNiwwLjE4bC0wLjYyLDEuNDVsLTAuMjUsMC40MmwtMS4xNywtMC4zbC0wLjE5LDAuMDFsLTAuNzksMC4zNGwtMS40NCwwLjE4bC0xLjQxLC0xLjk2bC0wLjcsLTEuNDdsLTAuNjEsLTEuODZsLTAuMjgsLTAuMjFsLTcuMzksLTAuMDNsLTAuOTIsMC4zbC0wLjc4LC0wLjAzbC0wLjc4LDAuMjVsLTAuMTEsLTAuMjVsMC4zNSwtMC4xNWwwLjE4LC0wLjI2bDAuMDcsLTEuMDJsMC4zMywtMC41MmwwLjcyLC0wLjQybDAuNTIsMC4ybDAuMzMsLTAuMDhsMC43NiwtMC44NmwwLjk5LDAuMDJsMC4xMSwwLjQ4bDAuMTYsMC4ybDAuOTQsMC40NGwwLjM1LC0wLjA3bDEuNDYsLTEuNTZsMS40NCwtMS4yMWwwLjY4LC0wLjg1bDAuMDYsLTAuMmwtMC4wOCwtMS45OWwxLjA0LC0yLjMzbDEuMSwtMS4yM2wxLjYyLC0xLjE5bDAuMTEsLTAuMTRsMC4yOSwtMC44bDAuMDgsLTAuOTRsMC4zOCwtMC44MmwwLjAzLC0wLjE2bC0wLjEzLC0xLjM4bDAuMywtMi4xNmwwLjQ3LC0xLjUxbDAuNzMsLTEuMzFsMC4wNCwtMC4xMmwwLjE1LC0xLjUxbDAuMjEsLTEuNjZsMC44OSwtMS4xNmwxLjE2LC0wLjdsMS45LDAuNzlsMS42OSwwLjk1bDEuODEsMC4yNGwxLjg1LDAuNDhsMC4zNSwtMC4xNmwwLjcxLC0xLjQzbDAuMTYsLTAuMDlsMS4wMywwLjIzbDAuMTksLTAuMDJsMi42NSwtMS4xOWwwLjg2LDAuNDZsMC4xNywwLjAzbDAuODEsLTAuMDhsMC4yMywtMC4xNGwwLjMxLC0wLjVsMC43NSwtMC4xN2wxLjgzLDAuMjZsMS42NCwwLjA2bDAuNzIsLTAuMjFsMS4zOSwxLjlsMC4xNiwwLjExbDEuMTIsMC4zbDAuMjQsLTAuMDRsMC41OCwtMC4zNmwxLjA1LDAuMTVsMC4xNSwtMC4wMmwxLjE1LC0wLjQ0bDAuNDcsMC44NGwwLjA4LDAuMDlsMi4wOCwxLjU3WlwiLCBcIm5hbWVcIjogXCJEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSBDb25nb1wifSwgXCJDWlwiOiB7XCJwYXRoXCI6IFwiTTQ2My4yOSwxNTIuMjJsLTAuODgsLTAuNDdsLTAuMTgsLTAuMDNsLTEuMDgsMC4xNWwtMS44NiwtMC45NGwtMC4yMSwtMC4wMmwtMC44OCwwLjI0bC0wLjEzLDAuMDdsLTEuMjUsMS4xN2wtMS42MywtMC45MWwtMS4zOCwtMS4zNmwtMS4yMiwtMC43NWwtMC4yNCwtMS4yNGwtMC4zMywtMC43NWwxLjUzLC0wLjZsMC45OCwtMC44NGwxLjc0LC0wLjYybDAuMTEsLTAuMDdsMC40NywtMC40N2wwLjQ2LDAuMjdsMC4yNCwwLjAzbDAuOTYsLTAuM2wxLjA2LDAuOTVsMC4xNSwwLjA3bDEuNTcsMC4yNGwtMC4xLDAuNmwwLjE2LDAuMzJsMS4zNiwwLjY4bDAuNDEsLTAuMTVsMC4yOCwtMC42MmwxLjI5LDAuMjhsMC4xOSwwLjg0bDAuMjYsMC4yM2wxLjczLDAuMThsMC43NCwxLjAybC0wLjE3LDAuMGwtMC4yNSwwLjEzbC0wLjMyLDAuNDlsLTAuNDYsMC4xMWwtMC4yMiwwLjIzbC0wLjEzLDAuNTdsLTAuMzIsMC4xbC0wLjIsMC4yMmwtMC4wMywwLjE0bC0wLjY1LDAuMjVsLTEuMDUsLTAuMDVsLTAuMjgsMC4xN2wtMC4yMiwwLjQzWlwiLCBcIm5hbWVcIjogXCJDemVjaCBSZXB1YmxpY1wifSwgXCJDWVwiOiB7XCJwYXRoXCI6IFwiTTUwNS4wMywxOTMuNzVsLTEuNTEsMC42OGwtMS4wLC0wLjNsLTAuMzIsLTAuNjNsMC42OSwtMC4wNmwwLjQxLDAuMTNsMC4xOSwtMC4wbDAuNjIsLTAuMjJsMC4zMSwwLjAybDAuMDYsMC4yMmwwLjQ5LDAuMTdsMC4wNiwtMC4wMVpcIiwgXCJuYW1lXCI6IFwiQ3lwcnVzXCJ9LCBcIkNSXCI6IHtcInBhdGhcIjogXCJNMjEzLjAsMjYzLjg0bC0wLjk4LC0wLjRsLTAuMywtMC4zMWwwLjE2LC0wLjI0bDAuMDUsLTAuMjFsLTAuMDksLTAuNTZsLTAuMSwtMC4xOGwtMC43NiwtMC42NWwtMC45OSwtMC41bC0wLjc0LC0wLjI4bC0wLjEzLC0wLjU4bC0wLjEyLC0wLjE4bC0wLjY2LC0wLjQ1bC0wLjM0LC0wLjBsLTAuMTMsMC4zMWwwLjEzLDAuNTlsLTAuMTcsMC4yMWwtMC4zNCwtMC40MmwtMC4xNCwtMC4xbC0wLjcsLTAuMjJsLTAuMjMsLTAuMzRsMC4wMSwtMC42MmwwLjMxLC0wLjc0bC0wLjE0LC0wLjM4bC0wLjMsLTAuMTVsMC40NywtMC40bDEuNDgsMC42bDAuMjYsLTAuMDJsMC40NywtMC4yN2wwLjU4LDAuMTVsMC4zNSwwLjQ0bDAuMTcsMC4xMWwwLjc0LDAuMTdsMC4yNywtMC4wN2wwLjMsLTAuMjdsMC41MiwxLjA5bDAuOTcsMS4wMmwwLjc3LDAuNzFsLTAuNDEsMC4xbC0wLjIzLDAuM2wwLjAxLDEuMDJsMC4xMiwwLjI0bDAuMiwwLjE0bC0wLjA3LDAuMDVsLTAuMTEsMC4zbDAuMDgsMC4zN2wtMC4yMywwLjYzWlwiLCBcIm5hbWVcIjogXCJDb3N0YSBSaWNhXCJ9LCBcIkNVXCI6IHtcInBhdGhcIjogXCJNMjE1LjAxLDIyNi4wOWwyLjA4LDAuMThsMS45NCwwLjAzbDIuMjQsMC44NmwwLjk1LDAuOTJsMC4yNSwwLjA4bDIuMjIsLTAuMjhsMC43OSwwLjU1bDMuNjgsMi44MWwwLjE5LDAuMDZsMC43NywtMC4wM2wxLjE4LDAuNDJsLTAuMTIsMC40N2wwLjI3LDAuMzdsMS43OCwwLjFsMS41OSwwLjlsLTAuMTEsMC4yMmwtMS41LDAuM2wtMS42NCwwLjEzbC0xLjc1LC0wLjJsLTIuNjksMC4xOWwxLjAsLTAuODZsLTAuMDMsLTAuNDhsLTEuMDIsLTAuNjhsLTAuMTMsLTAuMDVsLTEuNTIsLTAuMTZsLTAuNzQsLTAuNjRsLTAuNTcsLTEuNDJsLTAuMywtMC4xOWwtMS4zNiwwLjFsLTIuMjMsLTAuNjdsLTAuNzEsLTAuNTJsLTAuMTQsLTAuMDZsLTMuMiwtMC40bC0wLjQyLC0wLjI1bDAuNTYsLTAuMzlsMC4xMiwtMC4zM2wtMC4yNywtMC4yMmwtMi40NiwtMC4xM2wtMC4yLDAuMDZsLTEuNzIsMS4zMWwtMC45NCwwLjAzbC0wLjI1LDAuMTVsLTAuMjksMC41M2wtMS4wNCwwLjI0bC0wLjI5LC0wLjA3bDAuNywtMC40M2wwLjEsLTAuMTFsMC41LC0wLjg3bDEuMDQsLTAuNTRsMS4yMywtMC40OWwxLjg2LC0wLjI1bDAuNjIsLTAuMjhaXCIsIFwibmFtZVwiOiBcIkN1YmFcIn0sIFwiU1pcIjoge1wicGF0aFwiOiBcIk01MDAuOTUsMzUzLjQxbC0wLjQxLDAuOTdsLTEuMTYsMC4yM2wtMS4yOSwtMS4yNmwtMC4wMiwtMC43MWwwLjYzLC0wLjkzbDAuMjMsLTAuN2wwLjQ3LC0wLjEybDEuMDQsMC40bDAuMzIsMS4wNWwwLjIsMS4wOFpcIiwgXCJuYW1lXCI6IFwiU3dhemlsYW5kXCJ9LCBcIlNZXCI6IHtcInBhdGhcIjogXCJNNTEwLjg0LDE5OS44M2wwLjA5LC0wLjExbDAuMDcsLTAuMmwtMC4wNCwtMS4wOGwwLjU2LC0xLjRsMS4zLC0xLjAxbDAuMSwtMC4zNGwtMC40MSwtMS4xMWwtMC4yNCwtMC4xOWwtMC44OSwtMC4xMWwtMC4yLC0xLjg0bDAuNTUsLTEuMDVsMS4zLC0xLjIybDAuMDksLTAuMTlsMC4wOSwtMS4wOWwwLjM5LDAuMjdsMC4yNSwwLjA0bDIuNjYsLTAuNzdsMS4zNSwwLjUybDIuMDYsLTAuMDFsMi45MywtMS4wOGwxLjM1LDAuMDRsMi4xNCwtMC4zNGwtMC44MywxLjE2bC0xLjMxLDAuNjhsLTAuMTYsMC4zbDAuMjMsMi4wM2wtMC45LDMuMjVsLTUuNDMsMi44N2wtNC43OSwyLjkxbC0yLjMyLC0wLjkyWlwiLCBcIm5hbWVcIjogXCJTeXJpYVwifSwgXCJLR1wiOiB7XCJwYXRoXCI6IFwiTTU5OS4wNCwxNzIuMTVsMC4zOCwtMC45bDEuNDMsLTAuMzdsNC4wNCwxLjAybDAuMzcsLTAuMjNsMC4zNiwtMS42NGwxLjE3LC0wLjUybDMuNDUsMS4yNGwwLjIsLTAuMGwwLjg2LC0wLjMxbDQuMDksMC4wOGwzLjYxLDAuMzFsMS4xOCwxLjAybDAuMTEsMC4wNmwxLjE5LDAuMzRsLTAuMTMsMC4yNmwtMy44NCwxLjU4bC0wLjEzLDAuMWwtMC44MSwxLjA4bC0zLjA4LDAuMzRsLTAuMjQsMC4xNmwtMC44NSwxLjdsLTIuNDMsLTAuMzdsLTAuMTQsMC4wMWwtMS43OSwwLjYxbC0yLjM5LDEuNGwtMC4xMiwwLjM5bDAuMjUsMC40OWwtMC40OCwwLjQ1bC00LjU3LDAuNDNsLTMuMDQsLTAuOTRsLTIuNDUsMC4xOGwwLjE0LC0xLjAybDIuNDIsMC40NGwwLjI3LC0wLjA4bDAuODEsLTAuODFsMS43NiwwLjI3bDAuMjEsLTAuMDVsMy4yMSwtMi4xNGwtMC4wMywtMC41MWwtMi45NywtMS41N2wtMC4yNiwtMC4wMWwtMS42NCwwLjY5bC0xLjM4LC0wLjg0bDEuODEsLTEuNjdsLTAuMDksLTAuNWwtMC40NiwtMC4xOFpcIiwgXCJuYW1lXCI6IFwiS3lyZ3l6c3RhblwifSwgXCJLRVwiOiB7XCJwYXRoXCI6IFwiTTUyMy4zLDI4Ny4wNGwwLjA2LDAuMTdsMS4yOSwxLjhsLTEuNDYsMC44NGwtMC4xMSwwLjExbC0wLjU1LDAuOTNsLTAuODEsMC4xNmwtMC4yNCwwLjI0bC0wLjM0LDEuNjlsLTAuODEsMS4wNmwtMC40NiwxLjU4bC0wLjc2LDAuNjNsLTMuMywtMi4zbC0wLjE2LC0xLjMybC0wLjE1LC0wLjIzbC05LjM1LC01LjI4bC0wLjAyLC0yLjRsMS45MiwtMi42M2wwLjkxLC0xLjgzbDAuMDEsLTAuMjRsLTEuMDksLTIuODZsLTAuMjksLTEuMjRsLTEuMDksLTEuNjNsMi45MywtMi44NWwwLjkyLDAuM2wwLjAsMS4xOWwwLjA5LDAuMjJsMC44NiwwLjgzbDAuMjEsMC4wOGwxLjY1LDAuMGwzLjA5LDIuMDhsMC4xNiwwLjA1bDAuNzksMC4wM2wwLjU0LC0wLjA2bDAuNTgsMC4yOGwxLjY3LDAuMmwwLjI4LC0wLjEybDAuNjksLTAuOThsMi4wNCwtMC45NGwwLjg2LDAuNzNsMC4xOSwwLjA3bDEuMSwwLjBsLTEuODIsMi4zNmwtMC4wNiwwLjE4bDAuMDMsOS4xMlpcIiwgXCJuYW1lXCI6IFwiS2VueWFcIn0sIFwiU1NcIjoge1wicGF0aFwiOiBcIk01MDUuNywyNjEuMzlsMC4wMiwxLjY0bC0wLjI3LDAuNTVsLTEuMTUsMC4wNWwtMC4yNCwwLjE1bC0wLjg1LDEuNDRsMC4yMiwwLjQ1bDEuNDQsMC4xN2wxLjE1LDEuMTJsMC40MiwwLjk1bDAuMTQsMC4xNWwxLjA2LDAuNTRsMS4zMywyLjQ1bC0zLjA2LDIuOThsLTEuNDQsMS4wOGwtMS43NSwwLjAxbC0xLjkyLDAuNTZsLTEuNSwtMC41M2wtMC4yNywwLjAzbC0wLjg1LDAuNTdsLTEuOTgsLTEuNWwtMC41NiwtMS4wMmwtMC4zNywtMC4xM2wtMS4zMiwwLjVsLTEuMDgsLTAuMTVsLTAuMiwwLjA0bC0wLjU2LDAuMzVsLTAuOSwtMC4yNGwtMS40NCwtMS45N2wtMC4zOSwtMC43N2wtMC4xMywtMC4xM2wtMS43OCwtMC45NGwtMC42NSwtMS41bC0xLjA4LC0xLjEybC0xLjU3LC0xLjIybC0wLjAyLC0wLjY4bC0wLjEyLC0wLjIzbC0xLjM3LC0xLjAybC0xLjE3LC0wLjY4bDAuMiwtMC4wOGwwLjg2LC0wLjQ4bDAuMTQsLTAuMThsMC42MywtMi4yMmwwLjYsLTEuMDJsMS40NywtMC4yOGwwLjM1LDAuNTZsMS4yOSwxLjQ4bDAuMTQsMC4wOWwwLjY5LDAuMjJsMC4yMiwtMC4wMmwwLjgzLC0wLjRsMS41OCwwLjA4bDAuMjYsMC4zOWwwLjI1LDAuMTNsMi40OSwwLjBsMC4zLC0wLjI1bDAuMDYsLTAuMzVsMS4xMywtMC40MmwwLjE4LC0wLjE4bDAuMjIsLTAuNjNsMC42OCwtMC4zOGwxLjk1LDEuMzdsMC4yMywwLjA1bDEuMjksLTAuMjZsMC4xOSwtMC4xMmwxLjIzLC0xLjhsMS4zNiwtMS4zN2wwLjA4LC0wLjI1bC0wLjIxLC0xLjUybC0wLjA2LC0wLjE1bC0wLjI1LC0wLjNsMC45NCwtMC4wOGwwLjI2LC0wLjIxbDAuMSwtMC4zMmwwLjYsMC4wOWwtMC4yNSwxLjY3bDAuMywxLjgzbDAuMTEsMC4xOWwxLjIyLDAuOTRsMC4yNSwwLjczbC0wLjA0LDEuMmwwLjI2LDAuMzFsMC4wOSwwLjAxWlwiLCBcIm5hbWVcIjogXCJTb3V0aCBTdWRhblwifSwgXCJTUlwiOiB7XCJwYXRoXCI6IFwiTTI3OC4xLDI3MC4yNmwyLjcxLDAuNDVsMC4zMSwtMC4xNGwwLjE5LC0wLjMybDEuODIsLTAuMTZsMi4yNSwwLjU2bC0xLjA5LDEuODFsLTAuMDQsMC4xOWwwLjIsMS43MmwwLjA1LDAuMTNsMC45LDEuMzVsLTAuMzksMC45OWwtMC4yMSwxLjA5bC0wLjQ4LDAuOGwtMS4yLC0wLjQ0bC0wLjE3LC0wLjAxbC0xLjEyLDAuMjRsLTAuOTUsLTAuMjFsLTAuMzUsMC4ybC0wLjI1LDAuNzNsMC4wNSwwLjI5bDAuMywwLjM1bC0wLjA2LDAuMTNsLTEuMDEsLTAuMTVsLTEuNDIsLTIuMDNsLTAuMzIsLTEuMzZsLTAuMjksLTAuMjNsLTAuNjMsLTAuMGwtMC45NSwtMS41NmwwLjQxLC0xLjE2bDAuMDEsLTAuMTdsLTAuMDgsLTAuMzVsMS4yOSwtMC41NmwwLjE4LC0wLjIybDAuMzUsLTEuOTdaXCIsIFwibmFtZVwiOiBcIlN1cmluYW1lXCJ9LCBcIktIXCI6IHtcInBhdGhcIjogXCJNNjgwLjI4LDI1Ny44OWwtMC45MywtMS4ybC0xLjI0LC0yLjU2bC0wLjU2LC0yLjlsMS40NSwtMS45MmwzLjA3LC0wLjQ2bDIuMjYsMC4zNWwyLjAzLDAuOThsMC4zOCwtMC4xMWwxLjAsLTEuNTVsMS44NiwwLjc5bDAuNTIsMS41MWwtMC4yOCwyLjgybC00LjA1LDEuODhsLTAuMTIsMC40NWwwLjc5LDEuMWwtMi4yLDAuMTdsLTIuMDgsMC45OGwtMS44OSwtMC4zM1pcIiwgXCJuYW1lXCI6IFwiQ2FtYm9kaWFcIn0sIFwiU1ZcIjoge1wicGF0aFwiOiBcIk0xOTcuMDIsMjQ4Ljg5bDAuMTgsLTAuMDVsMC41OSwwLjE3bDAuNTUsMC41MWwwLjY0LDAuMzVsMC4wNiwwLjIybDAuMzcsMC4yMWwxLjAxLC0wLjI4bDAuMzgsMC4xM2wwLjE2LDAuMTNsLTAuMTQsMC44MWwtMC4xOCwwLjM4bC0xLjIyLC0wLjAzbC0wLjg0LC0wLjIzbC0xLjExLC0wLjUybC0xLjMxLC0wLjE1bC0wLjQ5LC0wLjM4bDAuMDIsLTAuMDhsMC43NiwtMC41N2wwLjQ2LC0wLjI3bDAuMTEsLTAuMzVaXCIsIFwibmFtZVwiOiBcIkVsIFNhbHZhZG9yXCJ9LCBcIlNLXCI6IHtcInBhdGhcIjogXCJNNDY4LjAxLDE1MC4wMmwwLjA1LDAuMDdsMC4zNiwwLjFsMC44NSwtMC4zN2wxLjEyLDEuMDJsMC4zMywwLjA1bDEuMzgsLTAuNjVsMS4wNywwLjNsMC4xNiwwLjBsMS42OSwtMC40M2wxLjk1LDEuMDJsLTAuNTEsMC42NGwtMC40NSwxLjJsLTAuMzIsMC4ybC0yLjU1LC0wLjkzbC0wLjE3LC0wLjAxbC0wLjgyLDAuMmwtMC4xNywwLjExbC0wLjUzLDAuNjhsLTAuOTQsMC4zMmwtMC4xNCwtMC4xMWwtMC4yOSwtMC4wNGwtMS4xOCwwLjQ4bC0wLjk1LDAuMDlsLTAuMjYsMC4yMWwtMC4xNSwwLjQ3bC0xLjg0LDAuMzRsLTAuODIsLTAuMzFsLTEuMTQsLTAuNzNsLTAuMiwtMC44OWwwLjQyLC0wLjg0bDAuOTEsMC4wNWwwLjEyLC0wLjAybDAuODYsLTAuMzNsMC4xOCwtMC4yMWwwLjAzLC0wLjEzbDAuMzIsLTAuMWwwLjIsLTAuMjJsMC4xMiwtMC41NWwwLjM5LC0wLjFsMC4xOCwtMC4xM2wwLjMsLTAuNDVsMC40MywtMC4wWlwiLCBcIm5hbWVcIjogXCJTbG92YWtpYVwifSwgXCJLUlwiOiB7XCJwYXRoXCI6IFwiTTczNy4zMSwxODUuNzJsMC44NCwwLjA4bDAuMjcsLTAuMTJsMC44OSwtMS4ybDEuNjMsLTAuMTNsMS4xLC0wLjJsMC4yMSwtMC4xNmwwLjEyLC0wLjI0bDEuODYsMi45NWwwLjU5LDEuNzlsMC4wMiwzLjE3bC0wLjg0LDEuMzhsLTIuMjMsMC41NWwtMS45NSwxLjE0bC0xLjkxLDAuMjFsLTAuMjIsLTEuMjFsMC40NSwtMi4wN2wtMC4wMSwtMC4xN2wtMC45OSwtMi42N2wxLjU0LC0wLjRsMC4xNywtMC40NmwtMS41NSwtMi4yNFpcIiwgXCJuYW1lXCI6IFwiU291dGggS29yZWFcIn0sIFwiU0lcIjoge1wicGF0aFwiOiBcIk00NTUuNzcsMTU5LjU5bDEuNzksMC4yMWwwLjE4LC0wLjA0bDEuMiwtMC42OGwyLjEyLC0wLjA4bDAuMjEsLTAuMWwwLjM4LC0wLjQybDAuMSwwLjAxbDAuMjgsMC42MmwtMS43MSwwLjcxbC0wLjE4LDAuMjJsLTAuMjEsMS4xbC0wLjcxLDAuMjZsLTAuMiwwLjI4bDAuMDEsMC41NWwtMC41OSwtMC4wNGwtMC43OSwtMC40N2wtMC4zOCwwLjA2bC0wLjM2LDAuNDFsLTAuODQsLTAuMDVsMC4wNSwtMC4xNWwtMC41NiwtMS4yNGwwLjIxLC0xLjE3WlwiLCBcIm5hbWVcIjogXCJTbG92ZW5pYVwifSwgXCJLUFwiOiB7XCJwYXRoXCI6IFwiTTc0Ny43NiwxNzIuMDJsLTAuMjMsLTAuMDRsLTAuMjYsMC4wOGwtMS4wOSwxLjAybC0wLjc4LDEuMDZsLTAuMDYsMC4xOWwwLjA5LDEuOTVsLTEuMTIsMC41N2wtMC41MywwLjU4bC0wLjg4LDAuODJsLTEuNjksMC41MWwtMS4wOSwwLjc5bC0wLjEyLDAuMjJsLTAuMDcsMS4xN2wtMC4yMiwwLjI1bDAuMDksMC40N2wwLjk2LDAuNDZsMS4yMiwxLjFsLTAuMTksMC4zN2wtMC45MSwwLjE2bC0xLjc1LDAuMTRsLTAuMjIsMC4xMmwtMC44NywxLjE4bC0wLjk1LC0wLjA5bC0wLjMsMC4xOGwtMC45NywtMC40NGwtMC4zOSwwLjEzbC0wLjI1LDAuNDRsLTAuMjksMC4wOWwtMC4wMywtMC4ybC0wLjE4LC0wLjIzbC0wLjYyLC0wLjI1bC0wLjQzLC0wLjI5bDAuNTIsLTAuOTdsMC41MiwtMC4zbDAuMTMsLTAuMzhsLTAuMTgsLTAuNDJsMC41OSwtMS40N2wwLjAxLC0wLjIxbC0wLjE2LC0wLjQ4bC0wLjIyLC0wLjJsLTEuNDEsLTAuMzFsLTAuODIsLTAuNTVsMS43NCwtMS42MmwyLjczLC0xLjU4bDEuNjIsLTEuOTZsMC45NiwwLjc2bDAuMTcsMC4wNmwyLjE3LDAuMTFsMC4zMSwtMC4zN2wtMC4zMiwtMS4zMWwzLjYxLC0xLjIxbDAuMTYsLTAuMTNsMC43OSwtMS4zNGwxLjI1LDEuMzhaXCIsIFwibmFtZVwiOiBcIk5vcnRoIEtvcmVhXCJ9LCBcIlNPXCI6IHtcInBhdGhcIjogXCJNNTQzLjgsMjU2LjQ4bDAuNjEsLTAuMDVsMS4xNCwtMC4zN2wxLjMxLC0wLjI1bDAuMTIsLTAuMDVsMS4xMSwtMC44MWwwLjU3LC0wLjBsMC4wMywwLjM5bC0wLjIzLDEuNDlsMC4wMSwxLjI1bC0wLjUyLDAuOTJsLTAuNywyLjcxbC0xLjE5LDIuNzlsLTEuNTQsMy4ybC0yLjEzLDMuNjZsLTIuMTIsMi43OWwtMi45MiwzLjM5bC0yLjQ3LDIuMGwtMy43NiwyLjVsLTIuMzMsMS45bC0yLjc3LDMuMDZsLTAuNjEsMS4zNWwtMC4yOCwwLjI5bC0xLjIyLC0xLjY5bC0wLjAzLC04LjkybDIuMTIsLTIuNzZsMC41OSwtMC42OGwxLjQ3LC0wLjA0bDAuMTgsLTAuMDZsMi4xNSwtMS43MWwzLjE2LC0wLjExbDAuMjEsLTAuMDlsNy4wOCwtNy41NWwxLjc2LC0yLjEybDEuMTQsLTEuNTdsMC4wNiwtMC4xOGwwLjAxLC00LjY3WlwiLCBcIm5hbWVcIjogXCJTb21hbGlhXCJ9LCBcIlNOXCI6IHtcInBhdGhcIjogXCJNMzc5LjI4LDI1MC4zNGwtMC45NSwtMS44MmwtMC4wOSwtMC4xbC0wLjgzLC0wLjZsMC42MiwtMC4yOGwwLjEzLC0wLjExbDEuMjEsLTEuOGwwLjYsLTEuMzFsMC43MSwtMC42OGwxLjA5LDAuMmwwLjE4LC0wLjAybDEuMTcsLTAuNTNsMS4yNSwtMC4wM2wxLjE3LDAuNzNsMS41OSwwLjY1bDEuNDcsMS44M2wxLjU5LDEuN2wwLjEyLDEuNTZsMC40OSwxLjQ2bDAuMSwwLjE0bDAuODUsMC42NWwwLjE4LDAuODJsLTAuMDgsMC41N2wtMC4xMywwLjA1bC0xLjI5LC0wLjE5bC0wLjI5LDAuMTNsLTAuMTEsMC4xNmwtMC4zNSwwLjA0bC0xLjgzLC0wLjYxbC01Ljg0LC0wLjEzbC0wLjEyLDAuMDJsLTAuNiwwLjI2bC0wLjg3LC0wLjA2bC0xLjAxLDAuMzJsLTAuMjYsLTEuMjZsMS45LDAuMDRsMC4xNiwtMC4wNGwwLjU0LC0wLjMybDAuMzcsLTAuMDJsMC4xNSwtMC4wNWwwLjc4LC0wLjVsMC45MiwwLjQ2bDAuMTIsMC4wM2wxLjA5LDAuMDRsMC4xNSwtMC4wM2wxLjA4LC0wLjU3bDAuMTEsLTAuNDRsLTAuNTEsLTAuNzRsLTAuMzksLTAuMWwtMC43NiwwLjM5bC0wLjYyLC0wLjAxbC0wLjkyLC0wLjU4bC0wLjE4LC0wLjA1bC0wLjc5LDAuMDRsLTAuMiwwLjA5bC0wLjQ4LDAuNTFsLTIuNDEsMC4wNlpcIiwgXCJuYW1lXCI6IFwiU2VuZWdhbFwifSwgXCJTTFwiOiB7XCJwYXRoXCI6IFwiTTM5Mi4xOSwyNjcuNTNsLTAuNDQsLTAuMTJsLTEuNzMsLTAuOTdsLTEuMjQsLTEuMjhsLTAuNCwtMC44NGwtMC4yNywtMS42NWwxLjIxLC0xLjBsMC4wOSwtMC4xMmwwLjI3LC0wLjY2bDAuMzIsLTAuNDFsMC41NiwtMC4wNWwwLjE2LC0wLjA3bDAuNSwtMC40MWwxLjc1LDAuMGwwLjU5LDAuNzdsMC40OSwwLjk2bC0wLjA3LDAuNjRsMC4wNCwwLjE5bDAuMzYsMC41OGwtMC4wMywwLjg0bDAuMjQsMC4ybC0wLjY0LDAuNjVsLTEuMTMsMS4zN2wtMC4wNiwwLjE0bC0wLjEyLDAuNjZsLTAuNDMsMC41OFpcIiwgXCJuYW1lXCI6IFwiU2llcnJhIExlb25lXCJ9LCBcIlNCXCI6IHtcInBhdGhcIjogXCJNODI2Ljc0LDMxMS41MWwwLjIzLDAuMjlsLTAuOTUsLTAuMDFsLTAuMzksLTAuNjNsMC42NSwwLjI3bDAuNDUsMC4wOVpNODI1LjAxLDMwOC41MmwtMS4xOCwtMS4zOWwtMC4zNywtMS4wNmwwLjI0LDAuMGwwLjgyLDEuODRsMC40OSwwLjZaTTgyMy4yMSwzMDkuNDJsLTAuNDQsMC4wM2wtMS40MywtMC4yNGwtMC4zMiwtMC4yNGwwLjA4LC0wLjVsMS4yOSwwLjMxbDAuNzIsMC40N2wwLjExLDAuMThaTTgxNy45LDMwMy44MWwyLjU5LDEuNDRsMC4zLDAuNDFsLTEuMjEsLTAuNjZsLTEuMzQsLTAuODlsLTAuMzQsLTAuM1pNODEzLjc3LDMwMi40bDAuNDgsMC4zNGwwLjEsMC4wOGwtMC4zMywtMC4xN2wtMC4yNSwtMC4yNVpcIiwgXCJuYW1lXCI6IFwiU29sb21vbiBJc2xhbmRzXCJ9LCBcIlNBXCI6IHtcInBhdGhcIjogXCJNNTI4LjI0LDI0My4xbC0wLjIsLTAuNjlsLTAuMDcsLTAuMTJsLTAuNjksLTAuNzFsLTAuMTgsLTAuOTRsLTAuMTIsLTAuMTlsLTEuMjQsLTAuODlsLTEuMjgsLTIuMDlsLTAuNywtMi4wOGwtMC4wNywtMC4xMWwtMS43MywtMS43OWwtMC4xMSwtMC4wN2wtMS4wMywtMC4zOWwtMS41NywtMi4zNmwtMC4yNywtMS43MmwwLjEsLTEuNTNsLTAuMDMsLTAuMTVsLTEuNDQsLTIuOTNsLTEuMjUsLTEuMTNsLTEuMzQsLTAuNTZsLTAuNzIsLTEuMzNsMC4xMSwtMC40OWwtMC4wMiwtMC4ybC0wLjcsLTEuMzhsLTAuMDgsLTAuMWwtMC42OCwtMC41NmwtMC45NywtMS45OGwtMi44LC00LjAzbC0wLjI1LC0wLjEzbC0wLjg1LDAuMDFsMC4yOSwtMS4xMWwwLjEyLC0wLjk3bDAuMjMsLTAuODFsMi41MiwwLjM5bDAuMjMsLTAuMDZsMS4wOCwtMC44NGwwLjYsLTAuOTVsMS43OCwtMC4zNWwwLjIyLC0wLjE3bDAuMzcsLTAuODNsMC43NCwtMC40MmwwLjA4LC0wLjQ2bC0yLjE3LC0yLjRsNC41NSwtMS4yNmwwLjEyLC0wLjA2bDAuMzYsLTAuMzJsMi44MywwLjcxbDMuNjcsMS45MWw3LjA0LDUuNWwwLjE3LDAuMDZsNC42NCwwLjIybDIuMDYsMC4yNGwwLjU1LDEuMTVsMC4yOCwwLjE3bDEuNTYsLTAuMDZsMC45LDIuMTVsMC4xNCwwLjE1bDEuMTQsMC41N2wwLjM5LDAuODVsMC4xMSwwLjEzbDEuNTksMS4wNmwwLjEyLDAuOTFsLTAuMjMsMC44M2wwLjAxLDAuMThsMC4zMiwwLjlsMC4wNywwLjExbDAuNjgsMC43bDAuMzMsMC44NmwwLjM3LDAuNjVsMC4wOSwwLjFsMC43NiwwLjUzbDAuMjUsMC4wNGwwLjQ1LC0wLjEybDAuMzUsMC43NWwwLjEsMC42M2wwLjk2LDIuNjhsMC4yMywwLjE5bDcuNTMsMS4zM2wwLjI3LC0wLjA5bDAuMjQsLTAuMjZsMC44NywxLjQxbC0xLjU4LDQuOTZsLTcuMzQsMi41NGwtNy4yOCwxLjAybC0yLjM0LDEuMTdsLTAuMTIsMC4xbC0xLjc0LDIuNjNsLTAuODYsMC4zMmwtMC40OSwtMC42OGwtMC4yOCwtMC4xMmwtMC45MiwwLjEybC0yLjMyLC0wLjI1bC0wLjQxLC0wLjIzbC0wLjE1LC0wLjA0bC0yLjg5LDAuMDZsLTAuNjMsMC4ybC0wLjkxLC0wLjU5bC0wLjQzLDAuMTFsLTAuNjYsMS4yN2wtMC4wMywwLjIxbDAuMjEsMC44OWwtMC42LDAuNDVaXCIsIFwibmFtZVwiOiBcIlNhdWRpIEFyYWJpYVwifSwgXCJTRVwiOiB7XCJwYXRoXCI6IFwiTTQ3Ni40Miw5MC40NGwtMC4xNSwwLjFsLTIuNDMsMi44NmwtMC4wNywwLjI0bDAuMzYsMi4zMWwtMy44NCwzLjFsLTQuODMsMy4zOGwtMC4xMSwwLjE1bC0xLjgyLDUuNDVsMC4wMywwLjI2bDEuNzgsMi42OGwyLjI3LDEuOTlsLTIuMTMsMy44OGwtMi40OSwwLjgybC0wLjIsMC4yNGwtMC45NSw2LjA1bC0xLjMyLDMuMDlsLTIuODIsLTAuMzJsLTAuMywwLjE2bC0xLjM0LDIuNjRsLTIuNDgsMC4xNGwtMC43NiwtMy4xNWwtMi4wOSwtNC4wNGwtMS44NSwtNS4wMWwxLjAzLC0xLjk4bDIuMDYsLTIuNTNsMC4wNiwtMC4xM2wwLjgzLC00LjQ1bC0wLjA2LC0wLjI1bC0xLjU0LC0xLjg2bC0wLjE1LC01LjBsMS41MiwtMy40OGwyLjI4LDAuMDZsMC4yNywtMC4xNmwwLjg3LC0xLjU5bC0wLjAxLC0wLjMxbC0wLjgsLTEuMjFsMy43OSwtNS42M2w0LjA3LC03LjU0bDIuMjMsMC4wMWwwLjI5LC0wLjIybDAuNTksLTIuMTVsNC40NiwwLjY2bDAuMzQsLTAuMjZsMC4zNCwtMi42NGwxLjIxLC0wLjE0bDMuMjQsMi4wOGwzLjc4LDIuODVsMC4wNiw2LjM3bDAuMDMsMC4xNGwwLjY3LDEuMjlsLTMuOTUsMS4wN1pcIiwgXCJuYW1lXCI6IFwiU3dlZGVuXCJ9LCBcIlNEXCI6IHtcInBhdGhcIjogXCJNNTA1Ljk4LDI1OS43NWwtMC4zMSwtMC45bC0wLjEsLTAuMTRsLTEuMiwtMC45M2wtMC4yNywtMS42NmwwLjI5LC0xLjgzbC0wLjI1LC0wLjM0bC0xLjE2LC0wLjE3bC0wLjMzLDAuMjFsLTAuMTEsMC4zN2wtMS4zLDAuMTFsLTAuMjEsMC40OWwwLjU1LDAuNjhsMC4xOCwxLjI5bC0xLjMxLDEuMzNsLTEuMTgsMS43MmwtMS4wNCwwLjIxbC0yLjAsLTEuNGwtMC4zMiwtMC4wMmwtMC45NSwwLjUybC0wLjE0LDAuMTZsLTAuMjEsMC42bC0xLjE2LDAuNDNsLTAuMTksMC4yM2wtMC4wNCwwLjI3bC0yLjA4LDAuMGwtMC4yNSwtMC4zOWwtMC4yNCwtMC4xM2wtMS44MSwtMC4wOWwtMC4xNCwwLjAzbC0wLjgsMC4zOGwtMC40OSwtMC4xNmwtMS4yMiwtMS4zOWwtMC40MiwtMC42N2wtMC4zMSwtMC4xNGwtMS44MSwwLjM1bC0wLjIsMC4xNGwtMC43MiwxLjI0bC0wLjYxLDIuMTRsLTAuNzMsMC40bC0wLjYyLDAuMjJsLTAuODMsLTAuNjhsLTAuMTIsLTAuNmwwLjM4LC0wLjk3bDAuMDEsLTEuMTRsLTAuMDgsLTAuMmwtMS4zOSwtMS41M2wtMC4yNSwtMC45N2wwLjAzLC0wLjU3bC0wLjExLC0wLjI1bC0wLjgxLC0wLjY2bC0wLjAzLC0xLjM0bC0wLjA0LC0wLjE0bC0wLjUyLC0wLjk4bC0wLjMxLC0wLjE1bC0wLjQyLDAuMDdsMC4xMiwtMC40NGwwLjYzLC0xLjAzbDAuMDMsLTAuMjNsLTAuMjQsLTAuODhsMC42OSwtMC42NmwwLjAyLC0wLjQxbC0wLjQsLTAuNDZsMC41OCwtMS4zOWwxLjA0LC0xLjcxbDEuOTcsMC4xNmwwLjMyLC0wLjNsLTAuMTIsLTEwLjI0bDAuMDIsLTAuOGwyLjU5LC0wLjAxbDAuMywtMC4zbDAuMCwtNC45MmwyOS4xOSwwLjBsMC42OCwyLjE3bC0wLjQsMC4zNWwtMC4xLDAuMjdsMC4zNiwyLjY5bDAuOTMsMy4xNWwwLjEyLDAuMTZsMi4wNSwxLjRsLTAuOTksMS4xNWwtMS43NSwwLjRsLTAuMTUsMC4wOGwtMC43OSwwLjc5bC0wLjA4LDAuMTdsLTAuMjQsMS42OWwtMS4wNywzLjc1bC0wLjAsMC4xNmwwLjI1LDAuOTZsLTAuMzgsMi4xbC0wLjk4LDIuNDFsLTEuNTIsMS4zbC0xLjA3LDEuOTRsLTAuMjUsMC45OWwtMS4wOCwwLjY0bC0wLjEzLDAuMThsLTAuNDYsMS42NVpcIiwgXCJuYW1lXCI6IFwiU3VkYW5cIn0sIFwiRE9cIjoge1wicGF0aFwiOiBcIk0yNDEuNywyMzQuOTdsMC4xNSwtMC4yMmwxLjczLDAuMDFsMS40MywwLjY0bDAuMTUsMC4wM2wwLjQ1LC0wLjA0bDAuMzYsMC43NGwwLjI4LDAuMTdsMS4wMiwtMC4wNGwtMC4wNCwwLjQzbDAuMjcsMC4zM2wxLjAzLDAuMDlsMC45MSwwLjdsLTAuNTcsMC42NGwtMC45OSwtMC40N2wtMC4xNiwtMC4wM2wtMS4xMSwwLjExbC0wLjc5LC0wLjEybC0wLjI2LDAuMDlsLTAuMzgsMC40bC0wLjY2LDAuMTFsLTAuMjgsLTAuNDVsLTAuMzgsLTAuMTJsLTAuODMsMC4zN2wtMC4xNCwwLjEzbC0wLjg1LDEuNDlsLTAuMjcsLTAuMTdsLTAuMSwtMC41OGwwLjA1LC0wLjY3bC0wLjA3LC0wLjIxbC0wLjQ0LC0wLjUzbDAuMzUsLTAuMjVsMC4xMiwtMC4xOWwwLjE5LC0xLjBsLTAuMiwtMS40WlwiLCBcIm5hbWVcIjogXCJEb21pbmljYW4gUmVwdWJsaWNcIn0sIFwiREpcIjoge1wicGF0aFwiOiBcIk01MjguNzgsMjUzLjM2bDAuMzQsMC40NWwtMC4wNiwwLjc2bC0xLjI2LDAuNTRsLTAuMDUsMC41M2wwLjgyLDAuNTNsLTAuNTcsMC44M2wtMC4zLC0wLjI1bC0wLjI3LC0wLjA1bC0wLjU2LDAuMTdsLTEuMDcsLTAuMDNsLTAuMDQsLTAuNTZsLTAuMTYsLTAuNTZsMC43NiwtMS4wN2wwLjc2LC0wLjk3bDAuODksMC4xOGwwLjI1LC0wLjA2bDAuNTEsLTAuNDJaXCIsIFwibmFtZVwiOiBcIkRqaWJvdXRpXCJ9LCBcIkRLXCI6IHtcInBhdGhcIjogXCJNNDUyLjQsMTI5LjA3bC0xLjI3LDIuMzlsLTIuMjUsLTEuNjlsLTAuMjYsLTEuMDhsMy4xNSwtMS4wbDAuNjMsMS4zOVpNNDQ3Ljg3LDEyNi4yNWwtMC4zNSwwLjc2bC0wLjQ3LC0wLjI0bC0wLjM4LDAuMDlsLTEuOCwyLjUzbC0wLjAzLDAuMjlsMC41NiwxLjRsLTEuMjIsMC40bC0xLjY4LC0wLjQxbC0wLjkyLC0xLjc2bC0wLjA3LC0zLjQ3bDAuMzgsLTAuODhsMC42MiwtMC45M2wyLjA3LC0wLjIxbDAuMTksLTAuMWwwLjg0LC0wLjk1bDEuNSwtMC43NmwtMC4wNiwxLjI2bC0wLjcsMS4xbC0wLjAzLDAuMjVsMC4zLDEuMGwwLjE4LDAuMTlsMS4wNiwwLjQyWlwiLCBcIm5hbWVcIjogXCJEZW5tYXJrXCJ9LCBcIkRFXCI6IHtcInBhdGhcIjogXCJNNDQ1LjUxLDEzMS42OWwwLjAzLDAuOTRsMC4yMSwwLjI4bDIuMzIsMC43NGwtMC4wMiwxLjBsMC4zNywwLjNsMi41NSwtMC42NWwxLjM2LC0wLjg5bDIuNjMsMS4yN2wxLjA5LDEuMDFsMC41MSwxLjUxbC0wLjYsMC43OGwtMC4wLDAuMzZsMC44OCwxLjE3bDAuNTgsMS42OGwtMC4xOCwxLjA4bDAuMDMsMC4xOGwwLjg3LDEuODFsLTAuNjYsMC4ybC0wLjU1LC0wLjMybC0wLjM2LDAuMDVsLTAuNTgsMC41OGwtMS43MywwLjYybC0wLjk5LDAuODRsLTEuNzcsMC43bC0wLjE2LDAuNGwwLjQyLDAuOTRsMC4yNiwxLjM0bDAuMTQsMC4ybDEuMjUsMC43NmwxLjIyLDEuMmwtMC43MSwxLjJsLTAuODEsMC4zN2wtMC4xNywwLjMybDAuMzQsMS45OWwtMC4wNCwwLjA5bC0wLjQ3LC0wLjM5bC0wLjE3LC0wLjA3bC0xLjIsLTAuMWwtMS44NSwwLjU3bC0yLjE1LC0wLjEzbC0wLjI5LDAuMThsLTAuMjEsMC41bC0wLjk2LC0wLjY3bC0wLjI0LC0wLjA1bC0wLjY3LDAuMTZsLTIuNiwtMC45NGwtMC4zNCwwLjFsLTAuNDIsMC41N2wtMS42NCwtMC4wMmwwLjI2LC0xLjg4bDEuMjQsLTIuMTVsLTAuMjEsLTAuNDVsLTMuNTQsLTAuNThsLTAuOTgsLTAuNzFsMC4xMiwtMS4yNmwtMC4wNSwtMC4ybC0wLjQ0LC0wLjY0bDAuMjcsLTIuMThsLTAuMzgsLTMuMTRsMS4xNywtMC4wbDAuMjcsLTAuMTdsMC42MywtMS4yNmwwLjY1LC0zLjE3bC0wLjAyLC0wLjE3bC0wLjQxLC0xLjBsMC4zMiwtMC40N2wxLjc3LC0wLjE2bDAuMzcsMC42bDAuNDcsMC4wNmwxLjcsLTEuNjlsMC4wNiwtMC4zM2wtMC41NSwtMS4yNGwtMC4wOSwtMS41MWwxLjUsMC4zNmwwLjE2LC0wLjAxbDEuMjIsLTAuNFpcIiwgXCJuYW1lXCI6IFwiR2VybWFueVwifSwgXCJZRVwiOiB7XCJwYXRoXCI6IFwiTTU1My41MywyNDIuNjVsLTEuNTEsMC41OGwtMC4xNywwLjE2bC0wLjQ4LDEuMTRsLTAuMDcsMC43OWwtMi4zMSwxLjBsLTMuOTgsMS4xOWwtMi4yOCwxLjhsLTAuOTcsMC4xMmwtMC43LC0wLjE0bC0wLjIzLDAuMDVsLTEuNDIsMS4wM2wtMS41MSwwLjQ3bC0yLjA3LDAuMTNsLTAuNjgsMC4xNWwtMC4xNywwLjFsLTAuNDksMC42bC0wLjU3LDAuMTZsLTAuMTgsMC4xM2wtMC4zLDAuNDlsLTEuMDYsLTAuMDVsLTAuMTMsMC4wMmwtMC43MywwLjMybC0xLjQ4LC0wLjExbC0wLjU1LC0xLjI2bDAuMDcsLTEuMzJsLTAuMDQsLTAuMTZsLTAuMzksLTAuNzJsLTAuNDgsLTEuODVsLTAuNTIsLTAuNzlsMC4wOCwtMC4wMmwwLjIyLC0wLjM2bC0wLjIzLC0xLjA1bDAuMjQsLTAuMzlsMC4wNCwtMC4xOWwtMC4wOSwtMC45NWwwLjk2LC0wLjcybDAuMTEsLTAuMzFsLTAuMjMsLTAuOThsMC40NiwtMC44OGwwLjc1LDAuNDlsMC4yNiwwLjAzbDAuNjMsLTAuMjJsMi43NiwtMC4wNmwwLjUsMC4yNWwyLjQyLDAuMjZsMC44NSwtMC4xMWwwLjUyLDAuNzFsMC4zNSwwLjFsMS4xNywtMC40M2wwLjE1LC0wLjEybDEuNzUsLTIuNjRsMi4yMiwtMS4xMWw2Ljk1LC0wLjk2bDIuNTUsNS41OFpcIiwgXCJuYW1lXCI6IFwiWWVtZW5cIn0sIFwiQVRcIjoge1wicGF0aFwiOiBcIk00NjMuMTcsMTU0LjE1bC0wLjE0LDAuOTlsLTEuMTUsMC4wMWwtMC4yNCwwLjQ3bDAuMzksMC41NmwtMC43NSwxLjg0bC0wLjM2LDAuNGwtMi4wNiwwLjA3bC0wLjE0LDAuMDRsLTEuMTgsMC42N2wtMS45NiwtMC4yM2wtMy40MywtMC43OGwtMC41LC0wLjk3bC0wLjMzLC0wLjE2bC0yLjQ3LDAuNTVsLTAuMiwwLjE2bC0wLjE4LDAuMzdsLTEuMjcsLTAuMzhsLTEuMjgsLTAuMDlsLTAuODEsLTAuNDFsMC4yNSwtMC41MWwwLjAzLC0wLjE4bC0wLjA1LC0wLjI4bDAuMzUsLTAuMDhsMS4xNiwwLjgxbDAuNDUsLTAuMTNsMC4yNywtMC42NGwyLjAsMC4xMmwxLjg0LC0wLjU3bDEuMDUsMC4wOWwwLjcxLDAuNTlsMC40NywtMC4xMWwwLjIzLC0wLjU0bDAuMDIsLTAuMTdsLTAuMzIsLTEuODVsMC42OSwtMC4zMWwwLjEzLC0wLjEybDAuNzMsLTEuMjNsMS42MSwwLjg5bDAuMzUsLTAuMDRsMS4zNSwtMS4yN2wwLjcsLTAuMTlsMS44NCwwLjkzbDAuMTgsMC4wM2wxLjA4LC0wLjE1bDAuODEsMC40M2wtMC4wNywwLjE1bC0wLjAyLDAuMmwwLjI0LDEuMDZaXCIsIFwibmFtZVwiOiBcIkF1c3RyaWFcIn0sIFwiRFpcIjoge1wicGF0aFwiOiBcIk00NTAuNTgsMjI0Ljk0bC04LjMxLDQuODZsLTcuMjMsNS4xMmwtMy40NiwxLjEzbC0yLjQyLDAuMjJsLTAuMDIsLTEuMzNsLTAuMiwtMC4yOGwtMS4xNSwtMC40MmwtMS40NSwtMC42OWwtMC41NSwtMS4xM2wtMC4xLC0wLjEybC04LjQ1LC01LjcybC0xNy43MiwtMTIuMTdsMC4wMywtMC4zOGwtMC4wMiwtMy4yMWwzLjg0LC0xLjkxbDIuNDYsLTAuNDFsMi4xLC0wLjc1bDAuMTQsLTAuMTFsMC45LC0xLjNsMi44NCwtMS4wNmwwLjE5LC0wLjI3bDAuMDksLTEuODFsMS4yMSwtMC4ybDAuMTUsLTAuMDdsMS4wNiwtMC45NmwzLjE5LC0wLjQ2bDAuMjMsLTAuMThsMC40NiwtMS4wOGwtMC4wOCwtMC4zNGwtMC42LC0wLjU0bC0wLjgzLC0yLjg1bC0wLjE4LC0xLjhsLTAuODIsLTEuNTdsMi4xMywtMS4zN2wyLjY1LC0wLjQ5bDAuMTMsLTAuMDVsMS41NSwtMS4xNWwyLjM0LC0wLjg1bDQuMiwtMC41MWw0LjA3LC0wLjIzbDEuMjEsMC40MWwwLjIzLC0wLjAxbDIuMywtMS4xMWwyLjUyLC0wLjAybDAuOTQsMC42MmwwLjIsMC4wNWwxLjI1LC0wLjEzbC0wLjM2LDEuMDNsLTAuMDEsMC4xNGwwLjM5LDIuNjZsLTAuNTYsMi4ybC0xLjQ5LDEuNTJsLTAuMDgsMC4yNGwwLjIyLDIuMTJsMC4xMSwwLjJsMS45NCwxLjU4bDAuMDIsMC41NGwwLjEyLDAuMjNsMS40NSwxLjA2bDEuMDQsNC44NWwwLjgxLDIuNDJsMC4xMywxLjE5bC0wLjQzLDIuMTdsMC4xNywxLjI4bC0wLjMxLDEuNTNsMC4yLDEuNTZsLTAuOSwxLjAybC0wLjAxLDAuMzhsMS40MywxLjg4bDAuMDksMS4wNmwwLjA0LDAuMTNsMC44OSwxLjQ4bDAuMzcsMC4xMmwxLjAzLC0wLjQzbDEuNzksMS4xMmwwLjg5LDEuMzRaXCIsIFwibmFtZVwiOiBcIkFsZ2VyaWFcIn0sIFwiVVNcIjoge1wicGF0aFwiOiBcIk04OTIuNjQsOTkuMDVsMS4xNiwwLjU3bDAuMjEsMC4wMmwxLjQ1LC0wLjM4bDEuOTIsMC45OWwyLjE3LDAuNDdsLTEuNjUsMC43MmwtMS43NSwtMC43OWwtMC45MywtMC43bC0wLjIxLC0wLjA2bC0yLjExLDAuMjJsLTAuMzUsLTAuMmwwLjA5LC0wLjg3Wk0xODMuMjksMTUwLjM3bDAuMzksMS41NGwwLjEyLDAuMTdsMC43OCwwLjU1bDAuMTQsMC4wNWwxLjc0LDAuMmwyLjUyLDAuNWwyLjQsMC45OGwwLjE3LDAuMDJsMS45NiwtMC40bDMuMDEsMC44MWwwLjkxLC0wLjAybDIuMjIsLTAuODhsNC42NywyLjMzbDMuODYsMi4wMWwwLjIxLDAuNzFsMC4xNSwwLjE4bDAuMzMsMC4xN2wtMC4wMiwwLjA1bDAuMjMsMC40M2wwLjY3LDAuMWwwLjIxLC0wLjA1bDAuMSwtMC4wN2wwLjA1LDAuMjlsMC4wOSwwLjE2bDAuNSwwLjVsMC4yMSwwLjA5bDAuNTYsMC4wbDAuMTMsMC4xM2wtMC4yLDAuMzZsMC4xMiwwLjQxbDIuNDksMS4zOWwwLjk5LDUuMjRsLTAuNjksMS42OGwtMS4xNiwxLjY0bC0wLjYsMS4xOGwtMC4wNiwwLjMxbDAuMDQsMC4yMmwwLjI4LDAuNDNsMC4xMSwwLjFsMC44NSwwLjQ3bDAuMTUsMC4wNGwwLjYzLDAuMGwwLjE0LC0wLjA0bDIuODcsLTEuNThsMi42LC0wLjQ5bDMuMjgsLTEuNWwwLjE3LC0wLjIzbDAuMDQsLTAuNDNsLTAuMjMsLTAuOTNsLTAuMjQsLTAuMzlsMC43NCwtMC4zMmw0LjcsLTAuMDFsMC4yNSwtMC4xM2wwLjc3LC0xLjE1bDIuOSwtMi40MWwxLjA0LC0wLjUybDguMzUsLTAuMDJsMC4yOCwtMC4yMWwwLjIsLTAuNmwwLjcsLTAuMTRsMS4wNiwtMC40OGwwLjEzLC0wLjExbDAuOTIsLTEuNDlsMC43NSwtMi4zOWwxLjY3LC0yLjA4bDAuNTksMC42bDAuMywwLjA3bDEuNTIsLTAuNDlsMC44OCwwLjcybC0wLjAsNC4xNGwwLjA4LDAuMmwxLjYsMS43MmwwLjMxLDAuNzJsLTIuNDIsMS4zNWwtMi41NSwxLjA1bC0yLjY0LDAuOWwtMC4xNCwwLjExbC0xLjMzLDEuODFsLTAuNDQsMC43bC0wLjA1LDAuMTVsLTAuMDMsMS42bDAuMDMsMC4xNGwwLjgzLDEuNTlsMC4yNCwwLjE2bDAuNzgsMC4wNmwtMS4xNSwwLjMzbC0xLjI1LC0wLjA0bC0xLjgzLDAuNTJsLTIuNTEsMC4yOWwtMi4xNywwLjg4bC0wLjE3LDAuMzZsMC4zMywwLjIybDMuNTUsLTAuNTRsMC4xNSwwLjExbC0yLjg3LDAuNzNsLTEuMTksMC4wbC0wLjE2LC0wLjMzbC0wLjM2LDAuMDZsLTAuNzYsMC44MmwwLjE3LDAuNWwwLjQyLDAuMDhsLTAuNDUsMS43NWwtMS40LDEuNzRsLTAuMDQsLTAuMTdsLTAuMjEsLTAuMjJsLTAuNDgsLTAuMTNsLTAuNzcsLTAuNjlsLTAuMzYsLTAuMDNsLTAuMTIsMC4zNGwwLjUyLDEuNThsMC4wOSwwLjE0bDAuNTIsMC40M2wwLjAzLDAuODdsLTAuNzQsMS4wNWwtMC4zOSwwLjYzbDAuMDUsLTAuMTJsLTAuMDgsLTAuMzRsLTEuMTksLTEuMDNsLTAuMjgsLTIuMzFsLTAuMjYsLTAuMjZsLTAuMzIsMC4xOWwtMC40OCwxLjI3bC0wLjAxLDAuMTlsMC4zOSwxLjMzbC0xLjE0LC0wLjMxbC0wLjM2LDAuMThsMC4xNCwwLjM4bDEuNTcsMC44NWwwLjEsMi41OGwwLjIyLDAuMjhsMC41NSwwLjE1bDAuMjEsMC44MWwwLjMzLDIuNzJsLTEuNDYsMS45NGwtMi41LDAuODFsLTAuMTIsMC4wN2wtMS41OCwxLjU4bC0xLjE1LDAuMTdsLTAuMTUsMC4wNmwtMS4yNywxLjAzbC0wLjA5LDAuMTNsLTAuMzIsMC44NWwtMi43MSwxLjc5bC0xLjQ1LDEuMzdsLTEuMTgsMS42NGwtMC4wNSwwLjEybC0wLjM5LDEuOTZsMC4wLDAuMTNsMC40NCwxLjkxbDAuODUsMi4zN2wxLjEsMS45MWwwLjAzLDEuMmwxLjE2LDMuMDdsLTAuMDgsMS43NGwtMC4xLDAuOTlsLTAuNTcsMS40OGwtMC41NCwwLjI0bC0wLjk3LC0wLjI2bC0wLjM0LC0xLjAybC0wLjEyLC0wLjE2bC0wLjg5LC0wLjU4bC0yLjQ0LC00LjI4bC0wLjM0LC0wLjk0bDAuNDksLTEuNzFsLTAuMDIsLTAuMjFsLTAuNywtMS41bC0yLjAsLTIuMzVsLTAuMTEsLTAuMDhsLTAuOTgsLTAuNDJsLTAuMjUsMC4wMWwtMi40MiwxLjE5bC0wLjI2LC0wLjA4bC0xLjI2LC0xLjI5bC0xLjU3LC0wLjY4bC0wLjE2LC0wLjAybC0yLjc5LDAuMzRsLTIuMTgsLTAuM2wtMS45OCwwLjE5bC0xLjEyLDAuNDVsLTAuMTQsMC40NGwwLjQsMC42NWwtMC4wNCwxLjAybDAuMDksMC4yMmwwLjI5LDAuM2wtMC4wNiwwLjA1bC0wLjc3LC0wLjMzbC0wLjI2LDAuMDFsLTAuODcsMC40OGwtMS42NCwtMC4wOGwtMS43OSwtMS4zOWwtMC4yMywtMC4wNmwtMi4xMSwwLjMzbC0xLjc1LC0wLjYxbC0wLjE0LC0wLjAxbC0xLjYxLDAuMmwtMi4xMSwwLjY0bC0wLjExLDAuMDZsLTIuMjUsMS45OWwtMi41MywxLjIxbC0xLjQzLDEuMzhsLTAuNTgsMS4yMmwtMC4wMywwLjEybC0wLjAzLDEuODZsMC4xMywxLjMybDAuMywwLjYybC0wLjQ2LDAuMDRsLTEuNzEsLTAuNTdsLTEuODUsLTAuNzlsLTAuNjMsLTEuMTRsLTAuNTQsLTEuODVsLTAuMDcsLTAuMTJsLTEuNDUsLTEuNTFsLTAuODYsLTEuNThsLTEuMjYsLTEuODdsLTAuMDksLTAuMDlsLTEuNzYsLTEuMDlsLTAuMTcsLTAuMDRsLTIuMDUsMC4wNWwtMC4yMywwLjEybC0xLjQ0LDEuOTdsLTEuODQsLTAuNzJsLTEuMTksLTAuNzZsLTAuNiwtMS40NWwtMC45LC0xLjUybC0xLjQ5LC0xLjIxbC0xLjI3LC0wLjg3bC0wLjg5LC0wLjk2bC0wLjIyLC0wLjFsLTQuMzQsLTAuMGwtMC4zLDAuM2wtMC4wLDAuODRsLTYuNjIsMC4wMmwtNS42NiwtMS45M2wtMy40OCwtMS4yNGwwLjExLC0wLjI1bC0wLjMsLTAuNDJsLTMuMTgsMC4zbC0yLjYsMC4ybC0wLjM1LC0xLjE5bC0wLjA4LC0wLjEzbC0xLjYyLC0xLjYxbC0wLjEzLC0wLjA4bC0xLjAyLC0wLjI5bC0wLjIyLC0wLjY2bC0wLjI1LC0wLjJsLTEuMzEsLTAuMTNsLTAuODIsLTAuN2wtMC4xNiwtMC4wN2wtMi4yNSwtMC4yN2wtMC40OCwtMC4zNGwtMC4yOCwtMS40NGwtMC4wNywtMC4xNGwtMi40MSwtMi44NGwtMi4wMywtMy44OWwwLjA4LC0wLjU4bC0wLjEsLTAuMjdsLTEuMDgsLTAuOTRsLTEuODcsLTIuMzZsLTAuMzMsLTIuMzFsLTAuMDcsLTAuMTVsLTEuMjQsLTEuNWwwLjUyLC0yLjRsLTAuMDksLTIuNTdsLTAuNzgsLTIuM2wwLjk2LC0yLjgzbDAuNjEsLTUuNjZsLTAuNDYsLTQuMjZsLTAuNzksLTIuNzFsLTAuNjgsLTEuNGwwLjEzLC0wLjI2bDMuMjQsMC45N2wxLjI4LDIuODhsMC41MiwwLjA2bDAuNjIsLTAuODRsMC4wNiwtMC4yMmwtMC40LC0yLjYxbC0wLjc0LC0yLjI5bDY4LjksLTAuMGwwLjMsLTAuM2wwLjAxLC0wLjk1bDAuMzIsLTAuMDFaTTMyLjUsNjcuNDNsMS43NSwxLjk5bDAuNDEsMC4wNGwxLjAyLC0wLjgxbDMuNzksMC4yNWwtMC4xLDAuNzJsMC4yNCwwLjM0bDMuODMsMC43N2wyLjYsLTAuNDRsNS4yMSwxLjQxbDQuODQsMC40M2wxLjksMC41N2wwLjE1LDAuMDFsMy4yNSwtMC43MWwzLjcyLDEuMzJsMi41MiwwLjU4bC0wLjAzLDM4LjE0bDAuMjksMC4zbDIuNDEsMC4xMWwyLjM0LDEuMGwxLjcsMS41OWwyLjIyLDIuNDJsMC40MiwwLjAzbDIuNDEsLTIuMDRsMi4yNSwtMS4wOGwxLjIzLDEuNzZsMS43MSwxLjUzbDIuMjQsMS42MmwxLjU0LDIuNTZsMi41Niw0LjA5bDAuMTEsMC4xMWw0LjEsMi4xN2wwLjA2LDEuOTNsLTEuMTIsMS4zNWwtMS4yMiwtMS4xNGwtMi4wOCwtMS4wNWwtMC42OCwtMi45NGwtMC4wOSwtMC4xNmwtMy4xOCwtMi44NGwtMS4zMiwtMy4zNWwtMC4yNSwtMC4xOWwtMi40MywtMC4yNGwtMy45MywtMC4wOWwtMi44NSwtMS4wMmwtNS4yNCwtMy44NWwtNi43NywtMi4wNGwtMy41MiwwLjNsLTQuODQsLTEuN2wtMi45NiwtMS42bC0wLjIzLC0wLjAybC0yLjc4LDAuOGwtMC4yMSwwLjM1bDAuNDYsMi4zMWwtMS4xMSwwLjE5bC0yLjksMC43OGwtMi4yNCwxLjI2bC0yLjQyLDAuNjhsLTAuMjksLTEuNzlsMS4wNywtMy40OWwyLjU0LC0xLjExbDAuMTIsLTAuNDVsLTAuNjksLTAuOTZsLTAuNDEsLTAuMDdsLTMuMTksMi4xMmwtMS43NiwyLjU0bC0zLjU3LDIuNjJsLTAuMDMsMC40NmwxLjYzLDEuNTlsLTIuMTQsMi4zOGwtMi42NCwxLjQ5bC0yLjQ5LDEuMDlsLTAuMTYsMC4xN2wtMC41OCwxLjQ4bC0zLjgsMS43OWwtMC4xNCwwLjE0bC0wLjc1LDEuNTdsLTIuNzUsMS40MWwtMS42MiwtMC4yNWwtMC4xNiwwLjAybC0yLjM1LDAuOThsLTIuNTQsMS4xOWwtMi4wNiwxLjE1bC00LjA1LDAuOTNsLTAuMSwtMC4xNWwyLjQ1LC0xLjQ1bDIuNDksLTEuMWwyLjYxLC0xLjg4bDMuMDMsLTAuMzlsMC4xOSwtMC4xbDEuMiwtMS40MWwzLjQzLC0yLjExbDAuNjEsLTAuNzVsMS44MSwtMS4yNGwwLjEzLC0wLjJsMC40MiwtMi43bDEuMjQsLTIuMTJsLTAuMDMsLTAuMzVsLTAuMzQsLTAuMDlsLTIuNzMsMS4wNWwtMC42NywtMC41M2wtMC4zOSwwLjAybC0xLjEzLDEuMTFsLTEuNDMsLTEuNjJsLTAuNDksMC4wNmwtMC40MSwwLjhsLTAuNjcsLTEuMzFsLTAuNDIsLTAuMTJsLTIuNDMsMS40M2wtMS4xOCwtMC4wbC0wLjE4LC0xLjg2bDAuNDMsLTEuM2wtMC4wOSwtMC4zM2wtMS42MSwtMS4zM2wtMC4yNiwtMC4wNmwtMy4xMSwwLjY4bC0yLjAsLTEuNjZsLTEuNjEsLTAuODVsLTAuMDEsLTEuOTdsLTAuMTEsLTAuMjNsLTEuNzYsLTEuNDhsMC44NiwtMS45NmwyLjAxLC0yLjEzbDAuODgsLTEuOTRsMS43OSwtMC4yNWwxLjY1LDAuNmwwLjMxLC0wLjA2bDEuOTEsLTEuOGwxLjY3LDAuMzFsMC4yMiwtMC4wNGwxLjkxLC0xLjIzbDAuMTMsLTAuMzNsLTAuNDcsLTEuODJsLTAuMTUsLTAuMTlsLTEuMCwtMC41MmwxLjUxLC0xLjI3bDAuMDksLTAuMzRsLTAuMjksLTAuMTlsLTEuNjIsMC4wNmwtMi42NiwwLjg4bC0wLjEzLDAuMDlsLTAuNjIsMC43MmwtMS43NywtMC44bC0wLjE2LC0wLjAybC0zLjQ4LDAuNDRsLTMuNSwtMC45MmwtMS4wNiwtMS42MWwtMi43OCwtMi4wOWwzLjA3LC0xLjUxbDUuNTIsLTIuMDFsMS42NSwwLjBsLTAuMjgsMS43M2wwLjMxLDAuMzVsNS4yOSwtMC4xNmwwLjIzLC0wLjQ5bC0yLjAzLC0yLjU5bC0wLjEsLTAuMDhsLTMuMDMsLTEuNThsLTEuNzksLTIuMTJsLTIuNCwtMS44M2wtMy4xOCwtMS4yN2wxLjEzLC0xLjg0bDQuMjgsLTAuMTRsMC4xNSwtMC4wNWwzLjE2LC0yLjBsMC4xMywtMC4xN2wwLjU3LC0yLjA3bDIuNDMsLTIuMDJsMi40MiwtMC41Mmw0LjY3LC0xLjk4bDIuMjIsMC4yOWwwLjIsLTAuMDRsMy43NCwtMi4zN2wzLjU3LDAuOTFaTTM3LjY2LDEyMy40OWwtMi4zMSwxLjI2bC0xLjA0LC0wLjc1bC0wLjMxLC0xLjM1bDIuMDYsLTEuMTZsMS4yNCwtMC41MWwxLjQ4LDAuMjJsMC43NiwwLjgxbC0xLjg5LDEuNDlaTTMwLjg5LDIzMy44NGwxLjIsMC41N2wwLjM1LDAuM2wwLjQ4LDAuNjlsLTEuNiwwLjg2bC0wLjMsMC4zMWwtMC4yNCwtMC4xNGwwLjA1LC0wLjU0bC0wLjAyLC0wLjE1bC0wLjM2LC0wLjgzbDAuMDUsLTAuMTJsMC4zOSwtMC4zOGwwLjA3LC0wLjMxbC0wLjA5LC0wLjI3Wk0yOS4wNiwyMzEuODlsMC41LDAuMTRsMC4zMSwwLjE5bC0wLjQ2LDAuMWwtMC4zNCwtMC40M1pNMjUuMDIsMjMwLjEzbDAuMiwtMC4xMWwwLjQsMC40N2wtMC40MywtMC4wNWwtMC4xNywtMC4zMVpNMjEuMjksMjI4LjY4bDAuMSwtMC4wN2wwLjIyLDAuMDJsMC4wMiwwLjIxbC0wLjAyLDAuMDJsLTAuMzIsLTAuMThaTTYuMCwxMTMuMzNsLTEuMTksMC40NWwtMS41LC0wLjY0bC0wLjk0LC0wLjYzbDEuNzYsLTAuNDZsMS43MSwwLjI5bDAuMTYsMC45OFpcIiwgXCJuYW1lXCI6IFwiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhXCJ9LCBcIkxWXCI6IHtcInBhdGhcIjogXCJNNDczLjk5LDEyNy4xNmwwLjA3LC0yLjE1bDEuMTUsLTIuMTFsMi4wNSwtMS4wN2wxLjg0LDIuNDhsMC4yNSwwLjEybDIuMDEsLTAuMDdsMC4yOSwtMC4yNWwwLjQ1LC0yLjU4bDEuODUsLTAuNTZsMC45OCwwLjRsMi4xMywxLjMzbDAuMTYsMC4wNWwxLjk3LDAuMDFsMS4wMiwwLjdsMC4yMSwxLjY3bDAuNzEsMS44NGwtMi40NCwxLjIzbC0xLjM2LDAuNTNsLTIuMjgsLTEuNjJsLTAuMTIsLTAuMDVsLTEuMTgsLTAuMmwtMC4yOCwtMC42bC0wLjMxLC0wLjE3bC0yLjQzLDAuMzVsLTQuMTcsLTAuMjNsLTAuMTIsMC4wMmwtMi40NSwwLjkzWlwiLCBcIm5hbWVcIjogXCJMYXR2aWFcIn0sIFwiVVlcIjoge1wicGF0aFwiOiBcIk0yNzYuOSwzNjMuMTdsMS4zLC0wLjIzbDIuNCwyLjA0bDAuMjIsMC4wN2wwLjgyLC0wLjA3bDIuNDgsMS43bDEuOTMsMS41bDEuMjgsMS42N2wtMC45NSwxLjE0bC0wLjA0LDAuMzFsMC42MywxLjQ1bC0wLjk2LDEuNTdsLTIuNjUsMS40N2wtMS43MywtMC41M2wtMC4xNSwtMC4wMWwtMS4yNSwwLjI4bC0yLjIyLC0xLjE2bC0wLjE2LC0wLjAzbC0xLjU2LDAuMDhsLTEuMzMsLTEuMzZsMC4xNywtMS41OGwwLjQ4LC0wLjU1bDAuMDcsLTAuMmwtMC4wMiwtMi43NGwwLjY2LC0yLjhsMC41NywtMi4wMlpcIiwgXCJuYW1lXCI6IFwiVXJ1Z3VheVwifSwgXCJMQlwiOiB7XCJwYXRoXCI6IFwiTTUxMC40NCwxOTguMTFsLTAuNDgsMC4wM2wtMC4yNiwwLjE3bC0wLjE1LDAuMzJsLTAuMjEsLTAuMGwwLjcyLC0xLjg1bDEuMTksLTEuOWwwLjc0LDAuMDlsMC4yNywwLjczbC0xLjE5LDAuOTNsLTAuMDksMC4xM2wtMC41NCwxLjM2WlwiLCBcIm5hbWVcIjogXCJMZWJhbm9uXCJ9LCBcIkxBXCI6IHtcInBhdGhcIjogXCJNNjg0Ljg3LDI0OC44bDAuNjEsLTAuODZsMC4wNSwtMC4xNmwwLjExLC0yLjE3bC0wLjA4LC0wLjIybC0xLjk2LC0yLjE2bC0wLjE1LC0yLjQ0bC0wLjA4LC0wLjE4bC0xLjksLTIuMWwtMC4xOSwtMC4xbC0xLjg5LC0wLjE4bC0wLjI5LDAuMTVsLTAuNDIsMC43NmwtMS4yMSwwLjA2bC0wLjY3LC0wLjQxbC0wLjMxLC0wLjBsLTIuMiwxLjI5bC0wLjA1LC0xLjc3bDAuNjEsLTIuN2wtMC4yNywtMC4zN2wtMS40NCwtMC4xbC0wLjEyLC0xLjMxbC0wLjEyLC0wLjIxbC0wLjg3LC0wLjY1bDAuMzgsLTAuNjhsMS43NiwtMS40MWwwLjA4LDAuMjJsMC4yNywwLjJsMS4zMywwLjA3bDAuMzEsLTAuMzRsLTAuMzUsLTIuNzVsMC44NSwtMC4yNWwxLjMyLDEuODhsMS4xMSwyLjM2bDAuMjcsMC4xN2wyLjg5LDAuMDJsMC43OCwxLjgybC0xLjMyLDAuNTZsLTAuMTIsMC4wOWwtMC43MiwwLjkzbDAuMSwwLjQ1bDIuOTMsMS41MmwzLjYyLDUuMjdsMS44OCwxLjc4bDAuNTgsMS42N2wtMC4zOCwyLjExbC0xLjg3LC0wLjc5bC0wLjM3LDAuMTFsLTAuOTksMS41NGwtMS41MSwtMC43M1pcIiwgXCJuYW1lXCI6IFwiTGFvc1wifSwgXCJUV1wiOiB7XCJwYXRoXCI6IFwiTTcyNS42LDIyMi41bC0xLjUsNC4yMmwtMC44MiwxLjY1bC0xLjAxLC0xLjdsLTAuMjYsLTEuOGwxLjQsLTIuNDhsMS44LC0xLjgxbDAuNzYsMC41M2wtMC4zOCwxLjM5WlwiLCBcIm5hbWVcIjogXCJUYWl3YW5cIn0sIFwiVFRcIjoge1wicGF0aFwiOiBcIk0yNjYuMzUsMjU5LjQ2bDAuNDEsLTAuMzlsMC4wOSwtMC4yM2wtMC4wNCwtMC43NWwxLjE0LC0wLjI2bDAuMiwwLjAzbC0wLjA3LDEuMzdsLTEuNzMsMC4yM1pcIiwgXCJuYW1lXCI6IFwiVHJpbmlkYWQgYW5kIFRvYmFnb1wifSwgXCJUUlwiOiB7XCJwYXRoXCI6IFwiTTUxMy4yNSwxNzUuMzhsMy42MywxLjE3bDAuMTQsMC4wMWwyLjg4LC0wLjQ1bDIuMTEsMC4yNmwwLjE4LC0wLjAzbDIuOSwtMS41M2wyLjUxLC0wLjEzbDIuMjUsMS4zN2wwLjM2LDAuODhsLTAuMjMsMS4zNmwwLjE5LDAuMzNsMS44MSwwLjcybDAuNjEsMC41M2wtMS4zMSwwLjY0bC0wLjE2LDAuMzRsMC43NiwzLjI0bC0wLjQ0LDAuOGwwLjAxLDAuM2wxLjE5LDIuMDJsLTAuNzEsMC4yOWwtMC43NCwtMC42MmwtMC4xNSwtMC4wN2wtMi45MSwtMC4zN2wtMC4xNSwwLjAybC0xLjA0LDAuNDNsLTIuNzgsMC40NGwtMS40NCwtMC4wM2wtMi44MywxLjA2bC0xLjk1LDAuMDFsLTEuMjgsLTAuNTJsLTAuMiwtMC4wMWwtMi42MiwwLjc2bC0wLjcsLTAuNDhsLTAuNDcsMC4yMmwtMC4xMywxLjQ5bC0xLjAxLDAuOTRsLTAuNTgsLTAuODJsMC43OSwtMC45bDAuMDQsLTAuMzRsLTAuMzEsLTAuMTVsLTEuNDYsMC4yM2wtMi4wMywtMC42NGwtMC4zLDAuMDdsLTEuNjUsMS41OGwtMy41OCwwLjNsLTEuOTQsLTEuNDdsLTAuMTcsLTAuMDZsLTIuNywtMC4xbC0wLjI4LDAuMTdsLTAuNTEsMS4wNmwtMS40NywwLjI5bC0yLjMyLC0xLjQ2bC0wLjE3LC0wLjA1bC0yLjU1LDAuMDVsLTEuNCwtMi43bC0xLjcyLC0xLjU0bDEuMTEsLTIuMDZsLTAuMDcsLTAuMzdsLTEuMzUsLTEuMTlsMi40NywtMi41MWwzLjc0LC0wLjExbDAuMjYsLTAuMTdsMC45NiwtMi4wN2w0LjU2LDAuMzhsMC4xOSwtMC4wNWwyLjk3LC0xLjkybDIuODQsLTAuODNsNC4wMywtMC4wNmw0LjMxLDIuMDhaTTQ4OC44NSwxNzYuOGwtMS44MSwxLjM4bC0wLjU3LC0xLjAxbDAuMDIsLTAuMzZsMC40NSwtMC4yNWwwLjEzLC0wLjE1bDAuNzgsLTEuODdsLTAuMTEsLTAuMzdsLTAuNzIsLTAuNDdsMS45MSwtMC43MWwxLjg5LDAuMzVsMC4yNSwwLjk3bDAuMTcsMC4ybDEuODcsMC44M2wtMC4xOSwwLjMxbC0yLjgyLDAuMTZsLTAuMTgsMC4wN2wtMS4wNiwwLjkxWlwiLCBcIm5hbWVcIjogXCJUdXJrZXlcIn0sIFwiTEtcIjoge1wicGF0aFwiOiBcIk02MjUuNDQsMjY2LjA3bC0wLjM1LDIuNGwtMC45LDAuNjFsLTEuOTEsMC41bC0xLjA0LC0xLjc1bC0wLjQzLC0zLjVsMS4wLC0zLjZsMS4zNCwxLjA5bDEuMTMsMS43MmwxLjE2LDIuNTJaXCIsIFwibmFtZVwiOiBcIlNyaSBMYW5rYVwifSwgXCJUTlwiOiB7XCJwYXRoXCI6IFwiTTQ0NC45MSwyMDYuMThsLTAuOTksLTQuNTdsLTAuMTIsLTAuMThsLTEuNDMsLTEuMDRsLTAuMDIsLTAuNTNsLTAuMTEsLTAuMjJsLTEuOTUsLTEuNTlsLTAuMTksLTEuODVsMS40NCwtMS40N2wwLjA4LC0wLjE0bDAuNTksLTIuMzRsLTAuMzgsLTIuNzdsMC40NCwtMS4yOGwyLjUyLC0xLjA4bDEuNDEsMC4yOGwtMC4wNiwxLjJsMC40MywwLjI4bDEuODEsLTAuOWwwLjAyLDAuMDZsLTEuMTQsMS4yOGwtMC4wOCwwLjJsLTAuMDIsMS4zMmwwLjExLDAuMjRsMC43NCwwLjZsLTAuMjksMi4xOGwtMS41NiwxLjM1bC0wLjA5LDAuMzJsMC40OCwxLjU0bDAuMjgsMC4yMWwxLjExLDAuMDRsMC41NSwxLjE3bDAuMTUsMC4xNGwwLjc2LDAuMzVsLTAuMTIsMS43OWwtMS4xLDAuNzJsLTAuOCwwLjkxbC0xLjY4LDEuMDRsLTAuMTMsMC4zMmwwLjI1LDEuMDhsLTAuMTgsMC45NmwtMC43NCwwLjM5WlwiLCBcIm5hbWVcIjogXCJUdW5pc2lhXCJ9LCBcIlRMXCI6IHtcInBhdGhcIjogXCJNNzM0LjIxLDMwNy4yMmwwLjE3LC0wLjM0bDEuOTksLTAuNTJsMS43MiwtMC4wOGwwLjc4LC0wLjNsMC4yOSwwLjFsLTAuNDMsMC4zMmwtMi41NywxLjA5bC0xLjcxLDAuNTlsLTAuMDUsLTAuNDlsLTAuMTksLTAuMzZaXCIsIFwibmFtZVwiOiBcIkVhc3QgVGltb3JcIn0sIFwiVE1cIjoge1wicGF0aFwiOiBcIk01NTMuMTYsMTczLjUxbC0wLjEyLDEuMGwtMC4yNiwtMC42NWwwLjM4LC0wLjM0Wk01NTMuNTQsMTczLjE2bDAuMTMsLTAuMTJsMC40MywtMC4wOWwtMC41NiwwLjIxWk01NTUuNjgsMTcyLjZsMC42NSwtMC4xNGwxLjUzLDAuNzZsMS43MSwyLjI5bDAuMjcsMC4xMmwxLjI3LC0wLjE0bDIuODEsLTAuMDRsMC4yOSwtMC4zOGwtMC4zNSwtMS4yN2wxLjk4LC0wLjk3bDEuOTYsLTEuNjNsMy4wNSwxLjQ0bDAuMjUsMi4yM2wwLjE0LDAuMjJsMC45NiwwLjYxbDAuMTgsMC4wNWwyLjYxLC0wLjEzbDAuNjgsMC40NGwxLjIsMi45N2wwLjEsMC4xM2wyLjg1LDIuMDNsMS42NywxLjQxbDIuNjYsMS40NWwzLjEzLDEuMTdsLTAuMDUsMS4yM2wtMC4zNiwtMC4wNGwtMS4xMiwtMC43M2wtMC40NCwwLjE0bC0wLjM0LDAuODlsLTEuOTYsMC41MmwtMC4yMiwwLjIzbC0wLjQ3LDIuMTdsLTEuMjYsMC43OGwtMS45MywwLjQybC0wLjIxLDAuMThsLTAuNDYsMS4xNGwtMS42NCwwLjMzbC0yLjMsLTAuOTdsLTAuMiwtMi4yM2wtMC4yOCwtMC4yN2wtMS43NiwtMC4xbC0yLjc4LC0yLjQ4bC0wLjE1LC0wLjA3bC0xLjk1LC0wLjMxbC0yLjgyLC0xLjQ4bC0xLjc4LC0wLjI3bC0wLjE4LDAuMDNsLTEuMDMsMC41MWwtMS42LC0wLjA4bC0wLjIyLDAuMDhsLTEuNzIsMS42bC0xLjgzLDAuNDZsLTAuMzksLTEuN2wwLjM2LC0zLjBsLTAuMTYsLTAuM2wtMS43MywtMC44OGwwLjU3LC0xLjc3bC0wLjI1LC0wLjM5bC0xLjMzLC0wLjE0bDAuNDEsLTEuODVsMi4wNSwwLjYzbDAuMjEsLTAuMDFsMi4yLC0wLjk1bDAuMDksLTAuNDlsLTEuNzgsLTEuNzVsLTAuNjksLTEuNjZsLTAuMDcsLTAuMDNaXCIsIFwibmFtZVwiOiBcIlR1cmttZW5pc3RhblwifSwgXCJUSlwiOiB7XCJwYXRoXCI6IFwiTTU5Ny45OSwxNzguNzFsLTAuMjMsMC4yM2wtMi41NywtMC40N2wtMC4zNSwwLjI1bC0wLjI0LDEuN2wwLjMyLDAuMzRsMi42NiwtMC4yMmwzLjE1LDAuOTVsNC40NywtMC40MmwwLjU4LDIuNDVsMC4zOSwwLjIxbDAuNzEsLTAuMjVsMS4yMiwwLjUzbC0wLjA2LDEuMDFsMC4yOSwxLjI4bC0yLjE5LC0wLjBsLTEuNzEsLTAuMjFsLTAuMjMsMC4wN2wtMS41MSwxLjI1bC0xLjA1LDAuMjdsLTAuNzcsMC41MWwtMC43MSwtMC42N2wwLjIyLC0yLjI4bC0wLjI0LC0wLjMybC0wLjQzLC0wLjA4bDAuMTcsLTAuNTdsLTAuMTYsLTAuMzZsLTEuMzYsLTAuNjZsLTAuMzQsMC4wNWwtMS4wOCwxLjAxbC0wLjA5LDAuMTVsLTAuMjUsMS4wOWwtMC4yNCwwLjI2bC0xLjM2LC0wLjA1bC0wLjI3LDAuMTRsLTAuNjUsMS4wNmwtMC41OCwtMC4zOWwtMC4zLC0wLjAybC0xLjY4LDAuODZsLTAuMzYsLTAuMTZsMS4yOCwtMi42NWwwLjAyLC0wLjJsLTAuNTQsLTIuMTdsLTAuMTgsLTAuMjFsLTEuNTMsLTAuNThsMC40MSwtMC44MmwxLjg5LDAuMTNsMC4yNiwtMC4xMmwxLjE5LC0xLjYzbDAuNzcsLTEuODJsMi42NiwtMC41NWwtMC4zMywwLjg3bDAuMDEsMC4yM2wwLjM2LDAuODJsMC4zLDAuMThsMC4yMywtMC4wMlpcIiwgXCJuYW1lXCI6IFwiVGFqaWtpc3RhblwifSwgXCJMU1wiOiB7XCJwYXRoXCI6IFwiTTQ5My4zMiwzNTkuNjlsMC42OSwwLjY1bC0wLjY1LDEuMTJsLTAuMzgsMC44bC0xLjI3LDAuMzlsLTAuMTgsMC4xNWwtMC40LDAuNzdsLTAuNTksMC4xOGwtMS41OSwtMS43OGwxLjE2LC0xLjVsMS4zLC0xLjAybDAuOTcsLTAuNDZsMC45NCwwLjcyWlwiLCBcIm5hbWVcIjogXCJMZXNvdGhvXCJ9LCBcIlRIXCI6IHtcInBhdGhcIjogXCJNNjc3LjQyLDI1My42OGwtMS43LC0wLjg4bC0wLjE0LC0wLjAzbC0xLjc3LDAuMDRsMC4zLC0xLjY0bC0wLjMsLTAuMzVsLTIuMjEsMC4wMWwtMC4zLDAuMjhsLTAuMiwyLjc2bC0yLjE1LDUuOWwtMC4wMiwwLjEzbDAuMTcsMS44M2wwLjI4LDAuMjdsMS40NSwwLjA3bDAuOTMsMi4xbDAuNDQsMi4xNWwwLjA4LDAuMTVsMS40LDEuNDRsMC4xNiwwLjA5bDEuNDMsMC4yN2wxLjA0LDEuMDVsLTAuNTgsMC43M2wtMS4yNCwwLjIybC0wLjE1LC0wLjk5bC0wLjE1LC0wLjIybC0yLjA0LC0xLjFsLTAuMzYsMC4wNmwtMC4yMywwLjIzbC0wLjcyLC0wLjcxbC0wLjQxLC0xLjE4bC0wLjA2LC0wLjExbC0xLjMzLC0xLjQybC0xLjIyLC0xLjJsLTAuNSwwLjEzbC0wLjE1LDAuNTRsLTAuMTQsLTAuNDFsMC4yNiwtMS40OGwwLjczLC0yLjM4bDEuMiwtMi41N2wxLjM3LC0yLjM1bDAuMDIsLTAuMjdsLTAuOTUsLTIuMjZsMC4wMywtMS4xOWwtMC4yOSwtMS40MmwtMC4wNiwtMC4xM2wtMS42NSwtMi4wbC0wLjQ2LC0wLjk5bDAuNjIsLTAuMzRsMC4xMywtMC4xNWwwLjkyLC0yLjIzbC0wLjAyLC0wLjI3bC0xLjA1LC0xLjc0bC0xLjU3LC0xLjg2bC0xLjA0LC0xLjk2bDAuNzYsLTAuMzRsMC4xNiwtMC4xNmwxLjA3LC0yLjYzbDEuNTgsLTAuMWwwLjE2LC0wLjA2bDEuNDMsLTEuMTFsMS4yNCwtMC41MmwwLjg0LDAuNjJsMC4xMywxLjQzbDAuMjgsMC4yN2wxLjM0LDAuMDlsLTAuNTQsMi4zOWwwLjA1LDIuMzlsMC40NSwwLjI1bDIuNDgsLTEuNDVsMC42LDAuMzZsMC4xNywwLjA0bDEuNDcsLTAuMDdsMC4yNSwtMC4xNWwwLjQxLC0wLjczbDEuNTgsMC4xNWwxLjc2LDEuOTNsMC4xNSwyLjQ0bDAuMDgsMC4xOGwxLjk0LDIuMTVsLTAuMSwxLjk2bC0wLjY2LDAuOTNsLTIuMjUsLTAuMzRsLTMuMjQsMC40OWwtMC4xOSwwLjEybC0xLjYsMi4xMmwtMC4wNiwwLjI0bDAuNDgsMi40NlpcIiwgXCJuYW1lXCI6IFwiVGhhaWxhbmRcIn0sIFwiVEZcIjoge1wicGF0aFwiOiBcIk01OTMuNzYsNDE3LjczbDEuMzgsMC44NGwyLjE1LDAuMzdsMC4wNCwwLjMxbC0wLjU5LDEuMjRsLTMuMzYsMC4xOWwtMC4wNSwtMS4zOGwwLjQzLC0xLjU2WlwiLCBcIm5hbWVcIjogXCJGcmVuY2ggU291dGhlcm4gYW5kIEFudGFyY3RpYyBMYW5kc1wifSwgXCJUR1wiOiB7XCJwYXRoXCI6IFwiTTQyNS4yMywyNjkuMjlsLTEuNDksMC40bC0wLjQzLC0wLjY4bC0wLjY0LC0xLjU0bC0wLjE4LC0xLjE2bDAuNTQsLTIuMjFsLTAuMDQsLTAuMjRsLTAuNTksLTAuODZsLTAuMjMsLTEuOWwwLjAsLTEuODJsLTAuMDcsLTAuMTlsLTAuOTUsLTEuMTlsMC4xLC0wLjQxbDEuNTgsMC4wNGwtMC4yMywwLjk3bDAuMDgsMC4yOGwxLjU1LDEuNTVsMC4wOSwxLjEzbDAuMDgsMC4xOWwwLjQyLDAuNDNsLTAuMTEsNS42NmwwLjUyLDEuNTNaXCIsIFwibmFtZVwiOiBcIlRvZ29cIn0sIFwiVERcIjoge1wicGF0aFwiOiBcIk00NTcuNTcsMjUyLjQ2bDAuMjMsLTEuMDhsLTAuMjgsLTAuMzZsLTEuMzIsLTAuMDVsMC4wLC0xLjM1bC0wLjEsLTAuMjJsLTAuOSwtMC44MmwwLjk5LC0zLjFsMy4xMiwtMi4zN2wwLjEyLC0wLjIzbDAuMTMsLTMuMzNsMC45NSwtNS4ybDAuNTMsLTEuMDlsLTAuMDcsLTAuMzZsLTAuOTQsLTAuODFsLTAuMDMsLTAuN2wtMC4xMiwtMC4yM2wtMC44NCwtMC42MWwtMC41NywtMy43NmwyLjIxLC0xLjI2bDE5LjY3LDkuODhsMC4xMiw5Ljc0bC0xLjgzLC0wLjE1bC0wLjI4LDAuMTRsLTEuMTQsMS44OWwtMC42OCwxLjYybDAuMDUsMC4zMWwwLjMzLDAuMzhsLTAuNjEsMC41OGwtMC4wOCwwLjNsMC4yNSwwLjkzbC0wLjU4LDAuOTVsLTAuMjksMS4wMWwwLjM0LDAuMzdsMC42NywtMC4xMWwwLjM5LDAuNzNsMC4wMywxLjRsMC4xMSwwLjIzbDAuOCwwLjY1bC0wLjAxLDAuMjRsLTEuMzgsMC4zN2wtMC4xMSwwLjA2bC0xLjI3LDEuMDNsLTEuODMsMi43NmwtMi4yMSwxLjFsLTIuMzQsLTAuMTVsLTAuODIsMC4yNWwtMC4yLDAuMzdsMC4xOSwwLjY4bC0xLjE2LDAuNzlsLTEuMDEsMC45NGwtMi45MiwwLjg5bC0wLjUsLTAuNDZsLTAuMTcsLTAuMDhsLTAuNDEsLTAuMDVsLTAuMjgsMC4xMmwtMC4zOCwwLjU0bC0xLjM2LDAuMTJsMC4xLC0wLjE4bDAuMDEsLTAuMjdsLTAuNzgsLTEuNzJsLTAuMzUsLTEuMDNsLTAuMTcsLTAuMThsLTEuMDMsLTAuNDFsLTEuMjksLTEuMjhsMC4zNiwtMC43OGwwLjksMC4ybDAuMTQsLTAuMGwwLjY3LC0wLjE3bDEuMzYsMC4wMmwwLjI2LC0wLjQ1bC0xLjMyLC0yLjIybDAuMDksLTEuNjRsLTAuMTcsLTEuNjhsLTAuMDQsLTAuMTNsLTAuOTMsLTEuNTNaXCIsIFwibmFtZVwiOiBcIkNoYWRcIn0sIFwiTFlcIjoge1wicGF0aFwiOiBcIk00NTcuOTksMjI2LjM4bC0xLjU3LDAuODdsLTEuMjUsLTEuMjhsLTAuMTMsLTAuMDhsLTMuODUsLTEuMTFsLTEuMDQsLTEuNTdsLTAuMDksLTAuMDlsLTEuOTgsLTEuMjNsLTAuMjcsLTAuMDJsLTAuOTMsMC4zOWwtMC43MiwtMS4ybC0wLjA5LC0xLjA3bC0wLjA2LC0wLjE2bC0xLjMzLC0xLjc1bDAuODMsLTAuOTRsMC4wNywtMC4yNGwtMC4yMSwtMS42NGwwLjMxLC0xLjQzbC0wLjE3LC0xLjI5bDAuNDMsLTIuMjZsLTAuMTUsLTEuMzNsLTAuNzMsLTIuMThsMC45OSwtMC41MmwwLjE2LC0wLjIxbDAuMjIsLTEuMTZsLTAuMjIsLTEuMDZsMS41NCwtMC45NWwwLjgxLC0wLjkybDEuMTksLTAuNzhsMC4xNCwtMC4yM2wwLjEyLC0xLjc2bDIuNTcsMC44NGwwLjE2LDAuMDFsMC45OSwtMC4yM2wyLjAxLDAuNDVsMy4xOSwxLjJsMS4xMiwyLjM2bDAuMiwwLjE2bDIuMjQsMC41M2wzLjUsMS4xNGwyLjY1LDEuMzZsMC4yOSwtMC4wMWwxLjIyLC0wLjcxbDEuMjcsLTEuMzJsMC4wNywtMC4yOWwtMC41NSwtMi4wbDAuNjksLTEuMTlsMS43LC0xLjIzbDEuNjEsLTAuMzVsMy4yLDAuNTRsMC43OCwxLjE0bDAuMjQsMC4xM2wwLjg1LDAuMDFsMC44NCwwLjQ3bDIuMzUsMC4zMWwwLjQyLDAuNjNsLTAuNzksMS4xNmwtMC4wNCwwLjI2bDAuMzUsMS4wOGwtMC42MSwxLjZsLTAuMCwwLjJsMC43MywyLjE2bDAuMCwyNC4yNGwtMi41OCwwLjAxbC0wLjMsMC4yOWwtMC4wMiwwLjYybC0xOS41NSwtOS44M2wtMC4yOCwwLjAxbC0yLjUzLDEuNDRaXCIsIFwibmFtZVwiOiBcIkxpYnlhXCJ9LCBcIkFFXCI6IHtcInBhdGhcIjogXCJNNTUwLjU5LDIyMy44bDAuMTIsMC4wOGwxLjkyLC0wLjQxbDMuNTQsMC4xNWwwLjIzLC0wLjA5bDEuNzEsLTEuNzlsMS44NiwtMS43bDEuMzEsLTEuMzZsMC4yNiwwLjVsMC4yOCwxLjcybC0wLjkzLDAuMDFsLTAuMywwLjI2bC0wLjIxLDEuNzNsMC4xMSwwLjI3bDAuMDgsMC4wNmwtMC43LDAuMzJsLTAuMTcsMC4yN2wtMC4wMSwwLjk5bC0wLjY4LDEuMDJsLTAuMDUsMC4xNWwtMC4wNiwwLjk2bC0wLjMyLDAuMzZsLTcuMTksLTEuMjdsLTAuNzksLTIuMjJaXCIsIFwibmFtZVwiOiBcIlVuaXRlZCBBcmFiIEVtaXJhdGVzXCJ9LCBcIlZFXCI6IHtcInBhdGhcIjogXCJNMjQwLjY2LDI1Ni41bDAuNjUsMC45MWwtMC4wMywxLjEzbC0xLjA1LDEuMzlsLTAuMDMsMC4zMWwwLjk1LDIuMGwwLjMyLDAuMTdsMS4wOCwtMC4xNmwwLjI0LC0wLjIxbDAuNTYsLTEuODNsLTAuMDYsLTAuMjlsLTAuNzEsLTAuODFsLTAuMSwtMS41OGwyLjksLTAuOTZsMC4xOSwtMC4zN2wtMC4yOSwtMS4wMmwwLjQ1LC0wLjQxbDAuNzIsMS40M2wwLjI2LDAuMTZsMS42NSwwLjA0bDEuNDYsMS4yN2wwLjA4LDAuNzJsMC4zLDAuMjdsMi4yOCwwLjAybDIuNTUsLTAuMjVsMS4zNCwxLjA2bDAuMTQsMC4wNmwxLjkyLDAuMzFsMC4yLC0wLjAzbDEuNCwtMC43OWwwLjE1LC0wLjI1bDAuMDIsLTAuMzZsMi44MiwtMC4xNGwxLjE3LC0wLjAxbC0wLjQxLDAuMTRsLTAuMTQsMC40NmwwLjg2LDEuMTlsMC4yMiwwLjEybDEuOTMsMC4xOGwxLjczLDEuMTNsMC4zNywxLjlsMC4zMSwwLjI0bDEuMjEsLTAuMDVsMC41MiwwLjMybC0xLjYzLDEuMjFsLTAuMTEsMC4xN2wtMC4yMiwwLjkybDAuMDcsMC4yN2wwLjYzLDAuNjlsLTAuMzEsMC4yNGwtMS40OCwwLjM5bC0wLjIyLDAuM2wwLjA0LDEuMDNsLTAuNTksMC42bC0wLjAxLDAuNDFsMS42NywxLjg3bDAuMjMsMC40OGwtMC43MiwwLjc2bC0yLjcxLDAuOTFsLTEuNzgsMC4zOWwtMC4xMywwLjA2bC0wLjYsMC40OWwtMS44NCwtMC41OGwtMS44OSwtMC4zM2wtMC4xOCwwLjAzbC0wLjQ3LDAuMjNsLTAuMDIsMC41M2wwLjk2LDAuNTZsLTAuMDgsMS41OGwwLjM1LDEuNThsMC4yNiwwLjIzbDEuOTEsMC4xOWwwLjAyLDAuMDdsLTEuNTQsMC42MmwtMC4xOCwwLjJsLTAuMjUsMC45MmwtMC44OCwwLjM1bC0xLjg1LDAuNThsLTAuMTYsMC4xM2wtMC40LDAuNjRsLTEuNjYsMC4xNGwtMS4yMiwtMS4xOGwtMC43OSwtMi41MmwtMC42NywtMC44OGwtMC42NiwtMC40M2wwLjk5LC0wLjk4bDAuMDksLTAuMjZsLTAuMDksLTAuNTZsLTAuMDgsLTAuMTZsLTAuNjYsLTAuNjlsLTAuNDcsLTEuNTRsMC4xOCwtMS42N2wwLjU1LC0wLjg1bDAuNDUsLTEuMzVsLTAuMTUsLTAuMzZsLTAuODksLTAuNDNsLTAuMTksLTAuMDJsLTEuMzksMC4yOGwtMS43NiwtMC4xM2wtMC45MiwwLjIzbC0xLjY0LC0yLjAxbC0wLjE3LC0wLjFsLTEuNTQsLTAuMzNsLTMuMDUsMC4yM2wtMC41LC0wLjczbC0wLjE1LC0wLjEybC0wLjQ1LC0wLjE1bC0wLjA1LC0wLjI4bDAuMjgsLTAuODZsMC4wMSwtMC4xNWwtMC4yLC0xLjAxbC0wLjA4LC0wLjE1bC0wLjUsLTAuNWwtMC4zLC0xLjA4bC0wLjI1LC0wLjIybC0wLjg5LC0wLjEybDAuNTQsLTEuMThsMC4yOSwtMS43M2wwLjY2LC0wLjg1bDAuOTQsLTAuN2wwLjA5LC0wLjExbDAuMywtMC42WlwiLCBcIm5hbWVcIjogXCJWZW5lenVlbGFcIn0sIFwiQUZcIjoge1wicGF0aFwiOiBcIk01NzQuNDIsMTkyLjFsMi4yNCwwLjk1bDAuMTgsMC4wMmwxLjg5LC0wLjM4bDAuMjIsLTAuMThsMC40NiwtMS4xNGwxLjgyLC0wLjRsMS41LC0wLjkxbDAuMTQsLTAuMTlsMC40NiwtMi4xMmwxLjkzLC0wLjUxbDAuMiwtMC4xOGwwLjI2LC0wLjY4bDAuODcsMC41N2wwLjEzLDAuMDVsMC43OSwwLjA5bDEuMzUsMC4wMmwxLjgzLDAuNTlsMC43NSwwLjM0bDAuMjYsLTAuMDFsMS42NiwtMC44NWwwLjcsMC40NmwwLjQyLC0wLjA5bDAuNzIsLTEuMTdsMS4zMiwwLjA1bDAuMjMsLTAuMWwwLjM5LC0wLjQzbDAuMDcsLTAuMTRsMC4yNCwtMS4wOGwwLjg2LC0wLjgxbDAuOTQsMC40NmwtMC4yLDAuNjRsMC4yMywwLjM4bDAuNDksMC4wOWwtMC4yMSwyLjE1bDAuMDksMC4yNWwwLjk5LDAuOTRsMC4zOCwwLjAzbDAuODMsLTAuNTdsMS4wNiwtMC4yN2wwLjEyLC0wLjA2bDEuNDYsLTEuMjFsMS42MywwLjJsMi40LDAuMGwwLjE3LDAuMzJsLTEuMTIsMC4yNWwtMS4yMywwLjUybC0yLjg2LDAuMzNsLTIuNjksMC42bC0wLjEzLDAuMDZsLTEuNDYsMS4yNWwtMC4wNywwLjM2bDAuNTgsMS4xOGwwLjI1LDEuMjFsLTEuMTMsMS4wOGwtMC4wOSwwLjI1bDAuMDksMC45OGwtMC41MywwLjc5bC0yLjIyLC0wLjA4bC0wLjI4LDAuNDRsMC44MywxLjU3bC0xLjMsMC41OGwtMC4xMywwLjExbC0xLjA2LDEuNjlsLTAuMDUsMC4xOGwwLjEzLDEuNTFsLTAuNzMsMC41OGwtMC43OCwtMC4yMmwtMC4xNCwtMC4wMWwtMS45MSwwLjM2bC0wLjIzLDAuMTlsLTAuMiwwLjU3bC0xLjY1LC0wLjBsLTAuMjIsMC4xbC0xLjQsMS41NmwtMC4wOCwwLjE5bC0wLjA4LDIuMTNsLTIuOTksMS4wNWwtMS42NywtMC4yM2wtMC4yNywwLjFsLTAuMzksMC40NmwtMS40MywtMC4zMWwtMi40MywwLjRsLTMuNjksLTEuMjNsMS45NiwtMi4xNWwwLjA4LC0wLjI0bC0wLjIxLC0xLjc4bC0wLjIzLC0wLjI2bC0xLjY5LC0wLjQybC0wLjE5LC0xLjYybC0wLjc3LC0yLjA4bDAuOTgsLTEuNDFsLTAuMTQsLTAuNDVsLTAuODIsLTAuMzFsMC42LC0xLjc5bDAuOTMsLTMuMjFaXCIsIFwibmFtZVwiOiBcIkFmZ2hhbmlzdGFuXCJ9LCBcIklRXCI6IHtcInBhdGhcIjogXCJNNTM0LjQyLDE5MC44OWwwLjEzLDAuMTRsMS41LDAuNzhsMC4xNSwxLjM0bC0xLjEzLDAuODdsLTAuMTEsMC4xNmwtMC41OCwyLjJsMC4wNCwwLjI0bDEuNzMsMi42N2wwLjEyLDAuMWwyLjk5LDEuNDlsMS4xOCwxLjk0bC0wLjM5LDEuODlsMC4yOSwwLjM2bDAuNSwtMC4wbDAuMDIsMS4xN2wwLjA4LDAuMmwwLjgzLDAuODZsLTIuMzYsLTAuMjlsLTAuMjksMC4xM2wtMS43NCwyLjQ5bC00LjQsLTAuMjFsLTcuMDMsLTUuNDlsLTMuNzMsLTEuOTRsLTIuOTIsLTAuNzRsLTAuODksLTMuMGw1LjMzLC0yLjgxbDAuMTUsLTAuMTlsMC45NSwtMy40M2wtMC4yLC0yLjBsMS4xOSwtMC42MWwwLjExLC0wLjA5bDEuMjMsLTEuNzNsMC45MiwtMC4zOGwyLjc1LDAuMzVsMC44MSwwLjY4bDAuMzEsMC4wNWwwLjk0LC0wLjM4bDEuNSwzLjE3WlwiLCBcIm5hbWVcIjogXCJJcmFxXCJ9LCBcIklTXCI6IHtcInBhdGhcIjogXCJNMzg0LjI2LDg3Ljk2bC0wLjUxLDIuMzVsMC4wOCwwLjI4bDIuNjEsMi41OGwtMi45OSwyLjgzbC03LjE2LDIuNzJsLTIuMDgsMC43bC05LjUxLC0xLjcxbDEuODksLTEuMzZsLTAuMDcsLTAuNTNsLTQuNCwtMS41OWwzLjMzLC0wLjU5bDAuMjUsLTAuMzJsLTAuMTEsLTEuMmwtMC4yNSwtMC4yN2wtNC44MiwtMC44OGwxLjM4LC0yLjJsMy41NCwtMC41N2wzLjgsMi43NGwwLjMzLDAuMDFsMy42OCwtMi4xOGwzLjAyLDEuMTJsMC4yNSwtMC4wMmw0LjAxLC0yLjE4bDMuNzIsMC4yN1pcIiwgXCJuYW1lXCI6IFwiSWNlbGFuZFwifSwgXCJJUlwiOiB7XCJwYXRoXCI6IFwiTTU1Ni4yLDE4Ny41bDIuMDUsLTAuNTJsMC4xMywtMC4wN2wxLjY5LC0xLjU3bDEuNTUsMC4wOGwwLjE1LC0wLjAzbDEuMDIsLTAuNWwxLjY0LDAuMjVsMi44MiwxLjQ4bDEuOTEsMC4zbDIuOCwyLjQ5bDAuMTgsMC4wOGwxLjYxLDAuMDlsMC4xOSwyLjA5bC0xLjAsMy40N2wtMC42OSwyLjA0bDAuMTgsMC4zOGwwLjczLDAuMjhsLTAuODUsMS4yMmwtMC4wNCwwLjI4bDAuODEsMi4xOWwwLjE5LDEuNzJsMC4yMywwLjI2bDEuNjksMC40MmwwLjE3LDEuNDNsLTIuMTgsMi4zOWwtMC4wMSwwLjRsMS4yMiwxLjQybDEuMCwxLjYybDAuMTIsMC4xMWwyLjIzLDEuMTFsMC4wNiwyLjJsMC4yLDAuMjdsMS4wMywwLjM4bDAuMTQsMC44M2wtMy4zOCwxLjNsLTAuMTgsMC4xOWwtMC44NywyLjg1bC00LjQ0LC0wLjc2bC0yLjc1LC0wLjYybC0yLjY0LC0wLjMybC0xLjAxLC0zLjExbC0wLjE3LC0wLjE5bC0xLjIsLTAuNDhsLTAuMTgsLTAuMDFsLTEuOTksMC41MWwtMi40MiwxLjI1bC0yLjg5LC0wLjg0bC0yLjQ4LC0yLjAzbC0yLjQxLC0wLjc5bC0xLjYxLC0yLjQ3bC0xLjg0LC0zLjYzbC0wLjM2LC0wLjE1bC0xLjIyLDAuNGwtMS40OCwtMC44NGwtMC4zNywwLjA2bC0wLjcyLDAuODJsLTEuMDgsLTEuMTJsLTAuMDIsLTEuMzVsLTAuMywtMC4yOWwtMC40MywwLjBsMC4zNCwtMS42NGwtMC4wNCwtMC4yMmwtMS4yOSwtMi4xMWwtMC4xMiwtMC4xMWwtMy4wLC0xLjQ5bC0xLjYyLC0yLjQ5bDAuNTIsLTEuOThsMS4xOCwtMC45MmwwLjExLC0wLjI3bC0wLjE5LC0xLjY2bC0wLjE2LC0wLjIzbC0xLjU1LC0wLjgxbC0xLjU4LC0zLjMzbC0xLjMsLTIuMmwwLjQxLC0wLjc1bDAuMDMsLTAuMjFsLTAuNzMsLTMuMTJsMS4yLC0wLjU5bDAuMzUsMC45bDEuMjYsMS4zNWwwLjE1LDAuMDlsMS44MSwwLjM5bDAuOTEsLTAuMDlsMC4xNSwtMC4wNmwyLjksLTIuMTNsMC43LC0wLjE2bDAuNDgsMC41NmwtMC43NSwxLjI2bDAuMDUsMC4zN2wxLjU2LDEuNTNsMC4yOCwwLjA4bDAuMzcsLTAuMDlsMC43LDEuODlsMC4yMSwwLjE5bDIuMzEsMC41OWwxLjY5LDEuNGwwLjE1LDAuMDdsMy42NiwwLjQ5bDMuOTEsLTAuNzZsMC4yMywtMC4xOWwwLjE5LC0wLjUyWlwiLCBcIm5hbWVcIjogXCJJcmFuXCJ9LCBcIkFNXCI6IHtcInBhdGhcIjogXCJNNTMwLjUxLDE3Ni4wOGwyLjkxLC0wLjM5bDAuNDEsMC42M2wwLjExLDAuMWwwLjY2LDAuMzZsLTAuMzIsMC40N2wwLjA3LDAuNDFsMS4xLDAuODRsLTAuNTMsMC43bDAuMDYsMC40MmwxLjA2LDAuOGwxLjAxLDAuNDRsMC4wNCwxLjU2bC0wLjQ0LDAuMDRsLTAuODgsLTEuNDZsMC4wMSwtMC4zN2wtMC4zLC0wLjMxbC0wLjk4LDAuMDFsLTAuNjUsLTAuNjlsLTAuMjYsLTAuMDlsLTAuMzgsMC4wNmwtMC45NywtMC44MmwtMS42NCwtMC42NWwwLjIsLTEuMmwtMC4wMiwtMC4xNmwtMC4yOCwtMC42OVpcIiwgXCJuYW1lXCI6IFwiQXJtZW5pYVwifSwgXCJJVFwiOiB7XCJwYXRoXCI6IFwiTTQ1MS42OCwxNTguNThsMC4yLDAuMTZsMy4zLDAuNzVsLTAuMjIsMS4yNmwwLjAyLDAuMThsMC4zNSwwLjc4bC0xLjQsLTAuMzJsLTAuMjEsMC4wM2wtMi4wNCwxLjFsLTAuMTYsMC4yOWwwLjEzLDEuNDdsLTAuMjksMC44MmwwLjAyLDAuMjRsMC44MiwxLjU3bDAuMSwwLjExbDIuMjgsMS41bDEuMjksMi41M2wyLjc5LDIuNDNsMC4yLDAuMDdsMS44MywtMC4wMmwwLjMxLDAuMzRsLTAuNDYsMC4zOWwwLjA2LDAuNWw0LjA2LDEuOTdsMi4wNiwxLjQ5bDAuMTcsMC4zNmwtMC4yNCwwLjUzbC0xLjA4LC0xLjA3bC0wLjE1LC0wLjA4bC0yLjE4LC0wLjQ5bC0wLjMzLDAuMTVsLTEuMDUsMS45MWwwLjExLDAuNGwxLjYzLDAuOThsLTAuMjIsMS4xMmwtMC44NCwwLjE0bC0wLjIyLDAuMTVsLTEuMjcsMi4zOGwtMC41NCwwLjEybDAuMDEsLTAuNDdsMC40OCwtMS40NmwwLjUsLTAuNThsMC4wMywtMC4zNWwtMC45NywtMS42OWwtMC43NiwtMS40OGwtMC4xNywtMC4xNWwtMC45NCwtMC4zM2wtMC42OCwtMS4xOGwtMC4xNiwtMC4xM2wtMS41MywtMC41MmwtMS4wMywtMS4xNGwtMC4xOSwtMC4xbC0xLjc4LC0wLjE5bC0xLjg4LC0xLjNsLTIuMjcsLTEuOTRsLTEuNjQsLTEuNjhsLTAuNzYsLTIuOTRsLTAuMjEsLTAuMjFsLTEuMjIsLTAuMzVsLTIuMDEsLTEuMGwtMC4yNCwtMC4wMWwtMS4xNSwwLjQybC0wLjExLDAuMDdsLTEuMzgsMS4zNmwtMC41LDAuMTFsMC4xOSwtMC44N2wtMC4yMSwtMC4zNWwtMS4xOSwtMC4zNGwtMC41NiwtMi4wNmwwLjc2LC0wLjgybDAuMDMsLTAuMzZsLTAuNjgsLTEuMDhsMC4wNCwtMC4zMWwwLjY4LDAuNDJsMC4xOSwwLjA0bDEuMjEsLTAuMTVsMC4xNCwtMC4wNmwxLjE4LC0wLjg5bDAuMjUsMC4yOWwwLjI1LDAuMWwxLjE5LC0wLjFsMC4yNSwtMC4xOGwwLjQ1LC0xLjA0bDEuNjEsMC4zNGwwLjE5LC0wLjAybDEuMSwtMC41M2wwLjE3LC0wLjIybDAuMTUsLTAuOTVsMS4xOSwwLjM1bDAuMzUsLTAuMTZsMC4yMywtMC40N2wyLjExLC0wLjQ3bDAuNDUsMC44OVpNNDU5LjM1LDE4NC42M2wtMC43MSwxLjgxbDAuMCwwLjIzbDAuMzMsMC43OWwtMC4zNywxLjAzbC0xLjYsLTAuOTFsLTEuMzMsLTAuMzRsLTMuMjQsLTEuMzZsMC4yMywtMC45OWwyLjczLDAuMjRsMy45NSwtMC41Wk00NDMuOTUsMTc1LjkxbDEuMjYsMS43N2wtMC4zMSwzLjQ3bC0wLjgyLC0wLjEzbC0wLjI2LDAuMDhsLTAuODMsMC43OWwtMC42NCwtMC41MmwtMC4xLC0zLjQybC0wLjQ0LC0xLjM0bDAuOTEsMC4xbDAuMjEsLTAuMDZsMS4wMSwtMC43NFpcIiwgXCJuYW1lXCI6IFwiSXRhbHlcIn0sIFwiVk5cIjoge1wicGF0aFwiOiBcIk02OTAuOCwyMzAuMjFsLTIuODYsMS45M2wtMi4wOSwyLjQ2bC0wLjA2LDAuMTFsLTAuNTUsMS44bDAuMDQsMC4yNmw0LjI2LDYuMWwyLjMxLDEuNjNsMS40NiwxLjk3bDEuMTIsNC42MmwtMC4zMiw0LjNsLTEuOTcsMS41N2wtMi44NSwxLjYybC0yLjA5LDIuMTRsLTIuODMsMi4xM2wtMC42NywtMS4xOWwwLjY1LC0xLjU4bC0wLjA5LC0wLjM1bC0xLjQ3LC0xLjE0bDEuNjcsLTAuNzlsMi41NywtMC4xOGwwLjIyLC0wLjQ3bC0wLjg5LC0xLjI0bDMuODgsLTEuOGwwLjE3LC0wLjI0bDAuMzEsLTMuMDVsLTAuMDEsLTAuMTNsLTAuNTYsLTEuNjNsMC40NCwtMi40OGwtMC4wMSwtMC4xNWwtMC42MywtMS44MWwtMC4wOCwtMC4xMmwtMS44NywtMS43N2wtMy42NCwtNS4zbC0wLjExLC0wLjFsLTIuNjgsLTEuMzlsMC40NSwtMC41OWwxLjUzLC0wLjY1bDAuMTYsLTAuMzlsLTAuOTcsLTIuMjdsLTAuMjcsLTAuMThsLTIuODksLTAuMDJsLTEuMDQsLTIuMjFsLTEuMjgsLTEuODNsMC45NiwtMC40NmwxLjk3LDAuMDFsMi40MywtMC4zbDAuMTMsLTAuMDVsMS45NSwtMS4yOWwxLjA0LDAuODVsMC4xMywwLjA2bDEuOTgsMC40MmwtMC4zMiwxLjIxbDAuMDksMC4zbDEuMTksMS4wN2wwLjEyLDAuMDdsMS44OCwwLjUxWlwiLCBcIm5hbWVcIjogXCJWaWV0bmFtXCJ9LCBcIkFSXCI6IHtcInBhdGhcIjogXCJNMjU4LjExLDM0MS4zNGwxLjQsMS44MWwwLjUxLC0wLjA2bDAuODksLTEuOTRsMi41MSwwLjFsMC4zNiwwLjQ5bDQuNiw0LjMxbDAuMTUsMC4wOGwxLjk5LDAuMzlsMy4wMSwxLjkzbDIuNSwxLjAxbDAuMjgsMC45MWwtMi40LDMuOTdsMC4xNywwLjQ0bDIuNTcsMC43NGwyLjgxLDAuNDFsMi4wOSwtMC40NGwwLjE0LC0wLjA3bDIuMjcsLTIuMDZsMC4wOSwtMC4xN2wwLjM4LC0yLjJsMC44OCwtMC4zNmwxLjA1LDEuMjlsLTAuMDQsMS44OGwtMS45OCwxLjRsLTEuNzIsMS4xM2wtMi44NCwyLjY1bC0zLjM0LDMuNzNsLTAuMDcsMC4xMmwtMC42MywyLjIybC0wLjY3LDIuODVsMC4wMiwyLjczbC0wLjQ3LDAuNTRsLTAuMDcsMC4xN2wtMC4zNiwzLjI4bDAuMTIsMC4yN2wzLjAzLDIuMzJsLTAuMzEsMS43OGwwLjExLDAuMjlsMS40NCwxLjE1bC0wLjExLDEuMTdsLTIuMzIsMy41N2wtMy41OSwxLjUxbC00Ljk1LDAuNmwtMi43MiwtMC4yOWwtMC4zMiwwLjM4bDAuNSwxLjY3bC0wLjQ5LDIuMTNsMC4wMSwwLjE2bDAuNCwxLjI5bC0xLjI3LDAuODhsLTIuNDEsMC4zOWwtMi4zMywtMS4wNWwtMC4zMSwwLjA0bC0wLjk3LDAuNzhsLTAuMTEsMC4yN2wwLjM1LDIuOThsMC4xNiwwLjIzbDEuNjksMC45MWwwLjMxLC0wLjAybDEuMDgsLTAuNzVsMC40NiwwLjk2bC0yLjEsMC44OGwtMi4wMSwxLjg5bC0wLjA5LDAuMThsLTAuMzYsMy4wNWwtMC41MSwxLjQybC0yLjE2LDAuMDFsLTAuMTksMC4wN2wtMS45NiwxLjU5bC0wLjEsMC4xNWwtMC43MiwyLjM0bDAuMDgsMC4zMWwyLjQ2LDIuMzFsMC4xMywwLjA3bDIuMDksMC41NmwtMC43NCwyLjQ1bC0yLjg2LDEuNzVsLTAuMTIsMC4xNGwtMS41OSwzLjcxbC0yLjIsMS4yNGwtMC4xLDAuMDlsLTEuMDMsMS41NGwtMC4wNCwwLjIzbDAuODEsMy40NWwwLjA2LDAuMTNsMS4xMywxLjMybC0yLjU5LC0wLjU3bC01Ljg5LC0wLjQ0bC0wLjkyLC0xLjczbDAuMDUsLTIuNGwtMC4zNCwtMC4zbC0xLjQ5LDAuMTlsLTAuNzIsLTAuOThsLTAuMiwtMy4yMWwxLjc5LC0xLjMzbDAuMSwtMC4xM2wwLjc5LC0yLjA0bDAuMDIsLTAuMTZsLTAuMjcsLTEuNTJsMS4zMSwtMi42OWwwLjkxLC00LjE1bC0wLjIzLC0xLjcybDAuOTEsLTAuNDlsMC4xNSwtMC4zM2wtMC4yNywtMS4xNmwtMC4xNSwtMC4ybC0wLjg3LC0wLjQ2bDAuNjUsLTEuMDFsLTAuMDQsLTAuMzdsLTEuMDYsLTEuMDlsLTAuNTQsLTMuMmwwLjgzLC0wLjUxbDAuMTQsLTAuMjlsLTAuNDIsLTMuNmwwLjU4LC0yLjk4bDAuNjQsLTIuNWwxLjQxLC0xLjBsMC4xMiwtMC4zMmwtMC43NSwtMi44bC0wLjAxLC0yLjQ4bDEuODEsLTEuNzhsMC4wOSwtMC4yMmwtMC4wNiwtMi4zbDEuMzksLTIuNjlsMC4wMywtMC4xNGwwLjAxLC0yLjU4bC0wLjExLC0wLjI0bC0wLjU3LC0wLjQ1bC0xLjEsLTQuNTlsMS40OSwtMi43M2wwLjA0LC0wLjE3bC0wLjIzLC0yLjU5bDAuODYsLTIuMzhsMS42LC0yLjQ4bDEuNzQsLTEuNjVsMC4wNCwtMC4zOWwtMC42NCwtMC44OWwwLjQyLC0wLjdsMC4wNCwtMC4xNmwtMC4wOCwtNC4yNmwyLjU1LC0xLjIzbDAuMTYsLTAuMThsMC44NiwtMi43NWwtMC4wMSwtMC4yMmwtMC4yMiwtMC40OGwxLjg0LC0yLjFsMy4wLDAuNTlaTTI1Ni43Nyw0MzguOThsLTIuMSwwLjE1bC0xLjE4LC0xLjE0bC0wLjE5LC0wLjA4bC0xLjUzLC0wLjA5bC0yLjM4LC0wLjBsLTAuMCwtNi4yOGwwLjQsMC42NWwxLjI1LDIuNTVsMC4xMSwwLjEybDMuMjYsMi4wN2wzLjE5LDAuOGwtMC44MiwxLjI2WlwiLCBcIm5hbWVcIjogXCJBcmdlbnRpbmFcIn0sIFwiQVVcIjoge1wicGF0aFwiOiBcIk03MDUuNTUsMzUzLjA2bDAuMDksMC4wOWwwLjM3LDAuMDVsMC4xMywtMC4zNWwtMC41NywtMS42OWwwLjQ4LDAuM2wwLjcxLDAuOTlsMC4zNCwwLjExbDAuMiwtMC4yOWwtMC4wNCwtMS4zN2wtMC4wNCwtMC4xNGwtMS4yMiwtMi4wN2wtMC4yOCwtMC45bC0wLjUxLC0wLjY5bDAuMjQsLTEuMzNsMC41MiwtMC43bDAuMzQsLTEuMzJsMC4wMSwtMC4xM2wtMC4yNSwtMS40NGwwLjUxLC0wLjk0bDAuMSwxLjAzbDAuMjMsMC4yNmwwLjMyLC0wLjE0bDEuMDEsLTEuNzJsMS45NCwtMC44NGwxLjI3LC0xLjE0bDEuODQsLTAuOTJsMS4wLC0wLjE4bDAuNiwwLjI4bDAuMjYsLTAuMGwxLjk0LC0wLjk2bDEuNDgsLTAuMjhsMC4xOSwtMC4xM2wwLjMyLC0wLjQ5bDAuNTEsLTAuMThsMS40MiwwLjA1bDIuNjMsLTAuNzZsMC4xMSwtMC4wNmwxLjM2LC0xLjE1bDAuMDgsLTAuMWwwLjYxLC0xLjMzbDEuNDIsLTEuMjdsMC4xLC0wLjE5bDAuMTEsLTEuMDNsMC4wNiwtMS4zMmwxLjM5LC0xLjc0bDAuODUsMS43OWwwLjQsMC4xNGwxLjA3LC0wLjUxbDAuMTEsLTAuNDVsLTAuNzcsLTEuMDVsMC41MywtMC44NGwwLjg2LDAuNDNsMC40MywtMC4yMmwwLjI5LC0xLjg1bDEuMjksLTEuMTlsMC42LC0wLjk4bDEuMTYsLTAuNGwwLjIsLTAuMjdsMC4wMiwtMC4zNGwwLjc0LDAuMmwwLjM4LC0wLjI3bDAuMDMsLTAuNDRsMS45OCwtMC42MWwxLjcsMS4wOGwxLjM2LDEuNDhsMC4yMiwwLjFsMS41NSwwLjAybDEuNTcsMC4yNGwwLjMzLC0wLjRsLTAuNDgsLTEuMjdsMS4wOSwtMS44NmwxLjA2LC0wLjYzbDAuMSwtMC40MmwtMC4yOCwtMC40NmwwLjkzLC0xLjI0bDEuMzYsLTAuOGwxLjE2LDAuMjdsMC4xNCwwLjBsMi4xLC0wLjQ4bDAuMjMsLTAuM2wtMC4wNSwtMS4zbC0wLjE4LC0wLjI2bC0xLjA4LC0wLjQ5bDAuNDQsLTAuMTJsMS41MiwwLjU4bDEuMzksMS4wNmwyLjExLDAuNjVsMC4xOSwtMC4wbDAuNTksLTAuMjFsMS40NCwwLjcybDAuMjcsMC4wbDEuMzcsLTAuNjhsMC44NCwwLjJsMC4yNiwtMC4wNmwwLjM3LC0wLjNsMC44MiwwLjg5bC0wLjU2LDEuMTRsLTAuODQsMC45MWwtMC43NSwwLjA3bC0wLjI2LDAuMzhsMC4yNiwwLjlsLTAuNjcsMS4xNWwtMC44OCwxLjI0bC0wLjA1LDAuMjVsMC4xOCwwLjcybDAuMTIsMC4xN2wxLjk5LDEuNDJsMS45NiwwLjg0bDEuMjUsMC44NmwxLjgsMS41MWwwLjE5LDAuMDdsMC42MywtMC4wbDEuMTUsMC41OGwwLjM0LDAuN2wwLjE3LDAuMTVsMi4zOSwwLjg4bDAuMjQsLTAuMDJsMS42NSwtMC44OGwwLjE0LC0wLjE2bDAuNDksLTEuMzdsMC41MiwtMS4xOWwwLjMxLC0xLjM5bDAuNzUsLTIuMDJsMC4wMSwtMC4xOWwtMC4zMywtMS4xNmwwLjE2LC0wLjY3bDAuMCwtMC4xM2wtMC4yOCwtMS40MWwwLjMsLTEuNzhsMC40MiwtMC40NWwwLjA1LC0wLjMzbC0wLjMzLC0wLjczbDAuNTYsLTEuMjVsMC40OCwtMS4zOWwwLjA3LC0wLjY5bDAuNTgsLTAuNTlsMC40OCwwLjg0bDAuMTcsMS41M2wwLjE3LDAuMjRsMC40NywwLjIzbDAuMDksMC45bDAuMDUsMC4xNGwwLjg3LDEuMjNsMC4xNywxLjMzbC0wLjA5LDAuODlsMC4wMywwLjE1bDAuOSwyLjBsMC40MywwLjEzbDEuMzgsLTAuODNsMC43MSwwLjkybDEuMDYsMC44OGwtMC4yMiwwLjk2bDAuMCwwLjE0bDAuNTMsMi4ybDAuMzgsMS4zbDAuMTUsMC4xOGwwLjUyLDAuMjZsMC42MiwyLjAxbC0wLjIzLDEuMjdsMC4wMiwwLjE4bDAuODEsMS43NmwwLjE0LDAuMTRsMi42OSwxLjM1bDMuMjEsMi4yMWwtMC4yLDAuNGwwLjA0LDAuMzRsMS4zOSwxLjZsMC45NSwyLjc4bDAuNDMsMC4xNmwwLjc5LC0wLjQ2bDAuODUsMC45NmwwLjM5LDAuMDVsMC4yMiwtMC4xNWwwLjM2LDIuMzNsMC4wOSwwLjE4bDEuNzgsMS42M2wxLjE2LDEuMDFsMS45LDIuMWwwLjY3LDIuMDVsMC4wNiwxLjQ3bC0wLjE3LDEuNjRsMC4wMywwLjE3bDEuMTYsMi4yMmwtMC4xNCwyLjI4bC0wLjQzLDEuMjRsLTAuNjgsMi40NGwwLjA0LDEuNjNsLTAuNDgsMS45MmwtMS4wNiwyLjQzbC0xLjc5LDEuMzJsLTAuMSwwLjEybC0wLjkxLDIuMTVsLTAuODIsMS4zN2wtMC43NiwyLjQ3bC0wLjk4LDEuNDZsLTAuNjMsMi4xNGwtMC4zMywyLjAybDAuMSwwLjgybC0xLjIxLDAuODVsLTIuNzEsMC4xbC0wLjEzLDAuMDNsLTIuMzEsMS4xOWwtMS4yMSwxLjE3bC0xLjM0LDEuMTFsLTEuODksLTEuMThsLTEuMzMsLTAuNDZsMC4zMiwtMS4yNGwtMC40LC0wLjM1bC0xLjQ2LDAuNjFsLTIuMDYsMS45OGwtMS45OSwtMC43M2wtMS40MywtMC40NmwtMS40NSwtMC4yMmwtMi4zMiwtMC44MWwtMS41MSwtMS42N2wtMC40NSwtMi4xMWwtMC42LC0xLjVsLTAuMDcsLTAuMTFsLTEuMjMsLTEuMTZsLTAuMTYsLTAuMDhsLTEuOTYsLTAuMjhsMC41OSwtMC45OWwwLjAzLC0wLjI0bC0wLjYxLC0yLjFsLTAuNTQsLTAuMDhsLTEuMTYsMS44NWwtMS4yMywwLjI5bDAuNzMsLTAuODhsMC4wNiwtMC4xMmwwLjM3LC0xLjU3bDAuOTMsLTEuMzNsMC4wNSwtMC4ybC0wLjIsLTIuMDdsLTAuNTMsLTAuMTdsLTIuMDEsMi4zNWwtMS41MiwwLjk0bC0wLjEyLDAuMTRsLTAuODIsMS45M2wtMS41LC0wLjlsMC4wNywtMS4zMmwtMC4wNiwtMC4ybC0xLjU3LC0yLjA0bC0xLjE1LC0wLjkybDAuMywtMC40MWwtMC4xLC0wLjQ0bC0zLjIxLC0xLjY5bC0wLjEzLC0wLjAzbC0xLjY5LC0wLjA4bC0yLjM1LC0xLjMxbC0wLjE2LC0wLjA0bC00LjU1LDAuMjdsLTMuMjQsMC45OWwtMi44LDAuOTFsLTIuMzMsLTAuMThsLTAuMTcsMC4wM2wtMi42MywxLjQxbC0yLjE0LDAuNjRsLTAuMiwwLjE5bC0wLjQ3LDEuNDJsLTAuOCwwLjk5bC0xLjk5LDAuMDZsLTEuNTUsMC4yNGwtMi4yNywtMC41bC0xLjc5LDAuM2wtMS43MSwwLjEzbC0wLjE5LDAuMDlsLTEuMzgsMS4zOWwtMC41OCwtMC4xbC0wLjIxLDAuMDRsLTEuMjYsMC44bC0xLjEzLDAuODVsLTEuNzIsLTAuMWwtMS42LC0wLjBsLTIuNTgsLTEuNzZsLTEuMjEsLTAuNDlsMC4wNCwtMS4xOWwxLjA0LC0wLjMybDAuMTYsLTAuMTJsMC40MiwtMC42NGwwLjA1LC0wLjE5bC0wLjA5LC0wLjk3bDAuMywtMi4wbC0wLjI4LC0xLjY0bC0xLjM0LC0yLjg0bC0wLjM5LC0xLjQ5bDAuMSwtMS41MWwtMC4wNCwtMC4xN2wtMC45NiwtMS43MmwtMC4wNiwtMC43M2wtMC4wOSwtMC4xOWwtMS4wNCwtMS4wMWwtMC4zLC0yLjAybC0wLjA1LC0wLjEybC0xLjIzLC0xLjgzWk03ODQuOTUsMzkzLjM1bDIuMzksMS4wMWwwLjIsMC4wMWwzLjI2LC0wLjk2bDEuMTksMC4xNmwwLjE2LDMuMTlsLTAuNzgsMC45NWwtMC4wNywwLjE2bC0wLjE5LDEuODNsLTAuNDMsLTAuNDFsLTAuNDQsMC4wM2wtMS42MSwxLjk2bC0wLjQsLTAuMTJsLTEuMzgsLTAuMDlsLTEuNDMsLTIuNDJsLTAuMzcsLTIuMDNsLTEuNCwtMi41M2wwLjA0LC0wLjk0bDEuMjcsMC4yWlwiLCBcIm5hbWVcIjogXCJBdXN0cmFsaWFcIn0sIFwiSUxcIjoge1wicGF0aFwiOiBcIk01MDkuMDQsMTk5LjIybDAuNzEsMC4wbDAuMjcsLTAuMTdsMC4xNSwtMC4zM2wwLjE5LC0wLjAxbDAuMDIsMC43M2wtMC4yNywwLjM0bDAuMDIsMC4wOGwtMC4zMiwwLjYybC0wLjY1LC0wLjI3bC0wLjQxLDAuMTlsLTAuNTIsMS44NWwwLjE2LDAuMzVsMC4xNCwwLjA3bC0wLjE3LDAuMWwtMC4xNCwwLjIxbC0wLjExLDAuNzNsMC4zOSwwLjMzbDAuODEsLTAuMjZsMC4wMywwLjY0bC0wLjk3LDMuNDNsLTEuMjgsLTMuNjdsMC42MiwtMC43OGwtMC4wMywtMC40MWwwLjU4LC0xLjE2bDAuNSwtMi4wN2wwLjI3LC0wLjU0WlwiLCBcIm5hbWVcIjogXCJJc3JhZWxcIn0sIFwiSU5cIjoge1wicGF0aFwiOiBcIk02MTUuODQsMTkyLjU4bDIuNCwyLjk3bC0wLjI0LDIuMTdsMC4wNSwwLjJsMC45NCwxLjM1bC0wLjA2LDAuOTdsLTEuNDYsLTAuM2wtMC4zNSwwLjM2bDAuNywzLjA2bDAuMTIsMC4xOGwyLjQ2LDEuNzVsMy4xMSwxLjcybC0xLjIzLDAuOTZsLTAuMSwwLjEzbC0wLjk3LDIuNTVsMC4xNiwwLjM4bDIuNDEsMS4wMmwyLjM3LDEuMzNsMy4yNywxLjUybDMuNDMsMC4zN2wxLjM3LDEuM2wwLjE3LDAuMDhsMS45MiwwLjI1bDMuMCwwLjYybDIuMTUsLTAuMDRsMC4yOCwtMC4yMmwwLjI5LC0xLjA2bDAuMCwtMC4xM2wtMC4zMiwtMS42NmwwLjE2LC0wLjk0bDEuMCwtMC4zN2wwLjIzLDIuMjhsMC4xOCwwLjI0bDIuMjgsMS4wMmwwLjIsMC4wMmwxLjUyLC0wLjQxbDIuMDYsMC4xOGwyLjA4LC0wLjA4bDAuMjksLTAuMjdsMC4xOCwtMS42NmwtMC4xLC0wLjI2bC0wLjUzLC0wLjQ0bDEuMzgsLTAuMjNsMC4xNSwtMC4wN2wyLjI2LC0yLjBsMi43NSwtMS42NWwxLjk3LDAuNjNsMC4yNSwtMC4wM2wxLjU0LC0wLjk5bDAuODksMS4yOGwtMC43MiwwLjk3bDAuMiwwLjQ4bDIuNDksMC4zN2wwLjExLDAuNjFsLTAuNjksMC4zOWwtMC4xNSwwLjNsMC4xNSwxLjIybC0xLjM2LC0wLjM3bC0wLjIzLDAuMDNsLTMuMjQsMS44NmwtMC4xNSwwLjI4bDAuMDcsMS40NGwtMS4zMywyLjE2bC0wLjA0LDAuMTNsLTAuMTIsMS4yNGwtMC45OCwxLjkxbC0xLjcyLC0wLjUzbC0wLjM5LDAuMjhsLTAuMDksMi42NmwtMC41MiwwLjgzbC0wLjA0LDAuMjNsMC4yMSwwLjg5bC0wLjcxLDAuMzZsLTEuMjEsLTMuODVsLTAuMjksLTAuMjFsLTAuNjksMC4wMWwtMC4yOSwwLjIzbC0wLjI4LDEuMTdsLTAuODQsLTAuODRsMC42LC0xLjE3bDAuOTcsLTAuMTNsMC4yMywtMC4xNmwxLjE1LC0yLjI1bC0wLjE4LC0wLjQybC0xLjU0LC0wLjQ3bC0yLjMsMC4wNGwtMi4xMywtMC4zM2wtMC4xOSwtMS42M2wtMC4yNiwtMC4yNmwtMS4xMywtMC4xM2wtMS45MywtMS4xM2wtMC40MiwwLjEzbC0wLjg4LDEuODJsMC4wOCwwLjM3bDEuNDcsMS4xNWwtMS4yMSwwLjc3bC0wLjEsMC4xbC0wLjU2LDAuOTdsMC4xMywwLjQybDEuMzEsMC42MWwtMC4zNiwxLjM1bDAuMDEsMC4ybDAuODUsMS45NWwwLjM3LDIuMDVsLTAuMjYsMC42OGwtMS41NSwtMC4wMmwtMy4wOSwwLjU0bC0wLjI1LDAuMzJsMC4xMywxLjg0bC0xLjIxLDEuNGwtMy42NCwxLjc5bC0yLjc5LDMuMDRsLTEuODYsMS42MWwtMi40OCwxLjY4bC0wLjEzLDAuMjVsLTAuMCwxLjBsLTEuMDcsMC41NWwtMi4yMSwwLjlsLTEuMTMsMC4xM2wtMC4yNSwwLjE5bC0wLjc1LDEuOTZsLTAuMDIsMC4xNWwwLjUyLDMuMzFsMC4xMywyLjAzbC0xLjAzLDIuMzVsLTAuMDMsMC4xMmwtMC4wMSw0LjAzbC0xLjAyLDAuMWwtMC4yMywwLjE1bC0xLjE0LDEuOTNsMC4wNCwwLjM2bDAuNDQsMC40OGwtMS44MywwLjU3bC0wLjE4LDAuMTVsLTAuODEsMS42NWwtMC43NCwwLjUzbC0yLjE0LC0yLjEybC0xLjE0LC0zLjQ3bC0wLjk2LC0yLjU3bC0wLjksLTEuMjZsLTEuMywtMi4zOGwtMC42MSwtMy4xNGwtMC40NCwtMS42MmwtMi4yOSwtMy41NmwtMS4wMywtNC45NGwtMC43NCwtMy4yOWwwLjAxLC0zLjEybC0wLjQ5LC0yLjUxbC0wLjQxLC0wLjIybC0zLjU2LDEuNTNsLTEuNTksLTAuMjhsLTIuOTYsLTIuODdsMC45NCwtMC43NGwwLjA2LC0wLjQxbC0wLjc0LC0xLjAzbC0yLjczLC0yLjFsMS4zNSwtMS40M2w1LjM4LDAuMDFsMC4yOSwtMC4zNmwtMC41LC0yLjI5bC0wLjA5LC0wLjE1bC0xLjMzLC0xLjI4bC0wLjI3LC0xLjk2bC0wLjEyLC0wLjJsLTEuMzYsLTEuMGwyLjQyLC0yLjQ4bDIuNzcsMC4ybDAuMjQsLTAuMWwyLjYyLC0yLjg1bDEuNTksLTIuOGwyLjQxLC0yLjc0bDAuMDcsLTAuMmwtMC4wNCwtMS44MmwyLjAxLC0xLjUxbC0wLjAxLC0wLjQ5bC0xLjk1LC0xLjMzbC0wLjgzLC0xLjgxbC0wLjgyLC0yLjI3bDAuOTgsLTAuOTdsMy42NCwwLjY2bDIuODksLTAuNDJsMC4xNywtMC4wOGwyLjE4LC0yLjE1WlwiLCBcIm5hbWVcIjogXCJJbmRpYVwifSwgXCJUWlwiOiB7XCJwYXRoXCI6IFwiTTUwNS43NywyODcuNThsMC4zNiwwLjIzbDguOTUsNS4wM2wwLjE1LDEuM2wwLjEzLDAuMjFsMy40LDIuMzdsLTEuMDcsMi44OGwtMC4wMiwwLjE0bDAuMTUsMS40MmwwLjE1LDAuMjNsMS40NywwLjg0bDAuMDUsMC40MmwtMC42NiwxLjQ0bC0wLjAyLDAuMThsMC4xMywwLjcybC0wLjE2LDEuMTZsMC4wMywwLjE5bDAuODcsMS41N2wxLjAzLDIuNDhsMC4xMiwwLjE0bDAuNTMsMC4zMmwtMS41OSwxLjE4bC0yLjY0LDAuOTVsLTEuNDUsLTAuMDRsLTAuMiwwLjA3bC0wLjgxLDAuNjlsLTEuNjQsMC4wNmwtMC42OCwwLjNsLTIuOSwtMC42OWwtMS43MSwwLjE3bC0wLjY1LC0zLjE4bC0wLjA1LC0wLjEybC0xLjM1LC0xLjg4bC0wLjE5LC0wLjEybC0yLjQxLC0wLjQ2bC0xLjM4LC0wLjc0bC0xLjYzLC0wLjQ0bC0wLjk2LC0wLjQxbC0wLjk1LC0wLjU4bC0xLjMxLC0zLjA5bC0xLjQ3LC0xLjQ2bC0wLjQ1LC0xLjMxbDAuMjQsLTEuMzRsLTAuMzksLTEuOTlsMC43MSwtMC4wOGwwLjE4LC0wLjA5bDAuOTEsLTAuOTFsMC45OCwtMS4zMWwwLjU5LC0wLjVsMC4xMSwtMC4yNGwtMC4wMiwtMC44MWwtMC4wOCwtMC4ybC0wLjQ3LC0wLjVsLTAuMSwtMC42N2wwLjUxLC0wLjIzbDAuMTgsLTAuMjVsMC4xNCwtMS40N2wtMC4wNSwtMC4ybC0wLjc2LC0xLjA5bDAuNDUsLTAuMTVsMi43MSwwLjAzbDUuMDEsLTAuMTlaXCIsIFwibmFtZVwiOiBcIlRhbnphbmlhXCJ9LCBcIkFaXCI6IHtcInBhdGhcIjogXCJNNTM5LjM2LDE3NS42NmwwLjE2LDAuMDlsMS4xMSwwLjJsMC4zMiwtMC4xNWwwLjQsLTAuNzFsMS4yMiwtMC45OWwxLjExLDEuMzNsMS4yNiwyLjA5bDAuMjIsMC4xNGwxLjA2LDAuMTNsMC4yOCwwLjI5bC0xLjQ2LDAuMTdsLTAuMjYsMC4yNGwtMC40MywyLjI2bC0wLjM5LDAuOTJsLTAuODUsMC42M2wtMC4xMiwwLjI1bDAuMDYsMS4ybC0wLjIyLDAuMDVsLTEuMjgsLTEuMjVsMC43NCwtMS4yNWwtMC4wMywtMC4zNWwtMC43NCwtMC44NmwtMC4zLC0wLjFsLTEuMDUsMC4yN2wtMi40OSwxLjgybC0wLjA0LC0xLjQ2bC0wLjE4LC0wLjI3bC0xLjA5LC0wLjQ3bC0wLjgsLTAuNmwwLjUzLC0wLjdsLTAuMDYsLTAuNDJsLTEuMTEsLTAuODRsMC4zNCwtMC41MWwtMC4xMSwtMC40M2wtMC44OSwtMC40OGwtMC4zMywtMC40OWwwLjI1LC0wLjJsMS43OCwwLjgxbDEuMzUsMC4xOGwwLjI1LC0wLjA5bDAuMzQsLTAuMzVsMC4wMiwtMC4zOWwtMS4wNCwtMS4zNmwwLjI4LC0wLjE4bDAuNDksMC4wN2wxLjY1LDEuNzRaTTUzMy41MywxODAuMTZsMC42MywwLjY3bDAuMjIsMC4wOWwwLjgsLTAuMGwwLjA0LDAuMzFsMC42NiwxLjA5bC0wLjk0LC0wLjIxbC0xLjE2LC0xLjI0bC0wLjI1LC0wLjcxWlwiLCBcIm5hbWVcIjogXCJBemVyYmFpamFuXCJ9LCBcIklFXCI6IHtcInBhdGhcIjogXCJNNDA1LjE3LDEzNS4zNWwwLjM2LDIuMTZsLTEuNzgsMi44NGwtNC4yOCwxLjkxbC0zLjAyLC0wLjQzbDEuODEsLTMuMTNsMC4wMiwtMC4yNmwtMS4yMywtMy4yNmwzLjI0LC0yLjU2bDEuNTQsLTEuMzJsMC4zNywxLjMzbC0wLjQ5LDEuNzdsMC4zLDAuMzhsMS40OSwtMC4wNWwxLjY4LDAuNjNaXCIsIFwibmFtZVwiOiBcIklyZWxhbmRcIn0sIFwiSURcIjoge1wicGF0aFwiOiBcIk03NTYuNTYsMjg3Ljg2bDAuNjksNC4wMmwwLjE1LDAuMjFsMi41OSwxLjVsMC4zOSwtMC4wN2wyLjA1LC0yLjYxbDIuNzUsLTEuNDVsMi4wOSwtMC4wbDIuMDgsMC44NWwxLjg1LDAuODlsMi41MiwwLjQ2bDAuMDgsMTUuNDRsLTEuNzIsLTEuNmwtMC4xNSwtMC4wN2wtMi41NCwtMC41MWwtMC4yOSwwLjFsLTAuNTMsMC42MmwtMi41MywwLjA2bDAuNzgsLTEuNTFsMS40OCwtMC42NmwwLjE3LC0wLjM0bC0wLjY1LC0yLjc0bC0xLjIzLC0yLjE5bC0wLjE0LC0wLjEzbC00Ljg1LC0yLjEzbC0yLjA5LC0wLjIzbC0zLjcsLTIuMjhsLTAuNDEsMC4xbC0wLjY3LDEuMTFsLTAuNjMsMC4xNGwtMC40MSwtMC42N2wtMC4wMSwtMS4wMWwtMC4xNCwtMC4yNWwtMS4zOSwtMC44OWwyLjA1LC0wLjY5bDEuNzMsMC4wNWwwLjI5LC0wLjM5bC0wLjIxLC0wLjY2bC0wLjI5LC0wLjIxbC0zLjUsLTAuMGwtMC45LC0xLjM2bC0wLjE5LC0wLjEzbC0yLjE0LC0wLjQ0bC0wLjY1LC0wLjc2bDIuODYsLTAuNTFsMS4yOCwtMC43OWwzLjc1LDAuOTZsMC4zMiwwLjc2Wk03NTguMDEsMzAwLjM3bC0wLjc5LDEuMDRsLTAuMTQsLTEuMDdsMC40LC0wLjgxbDAuMjksLTAuNDdsMC4yNCwwLjMxbC0wLjAsMS4wWk03NDcuNDUsMjkyLjlsMC40OCwxLjAybC0xLjQ1LC0wLjY5bC0yLjA5LC0wLjIxbC0xLjQ1LDAuMTZsLTEuMjgsLTAuMDdsMC4zNSwtMC44MWwyLjg2LC0wLjFsMi41OCwwLjY4Wk03NDEuMTUsMjg1LjY5bC0wLjE2LC0wLjI1bC0wLjcyLC0zLjA4bDAuNDcsLTEuODZsMC4zNSwtMC4zOGwwLjEsMC43M2wwLjI1LDAuMjZsMS4yOCwwLjE5bDAuMTgsMC43OGwtMC4xMSwxLjhsLTAuOTYsLTAuMThsLTAuMzUsMC4yMmwtMC4zOCwxLjUybDAuMDUsMC4yNFpNNzQxLjE5LDI4NS43NWwwLjc2LDAuOTdsLTAuMTEsMC4wNWwtMC42NSwtMS4wMlpNNzM5LjE4LDI5My41MmwtMC42MSwwLjU0bC0xLjQ0LC0wLjM4bC0wLjI1LC0wLjU1bDEuOTMsLTAuMDlsMC4zNiwwLjQ4Wk03MjguNCwyOTUuODdsLTAuMjcsLTAuMDdsLTIuMjYsMC44OWwtMC4zNywtMC40MWwwLjI3LC0wLjhsLTAuMDksLTAuMzNsLTEuNjgsLTEuMzdsMC4xNywtMi4yOWwtMC40MiwtMC4zbC0xLjY3LDAuNzZsLTAuMTcsMC4yOWwwLjIxLDIuOTJsMC4wOSwzLjM0bC0xLjIyLDAuMjhsLTAuNzgsLTAuNTRsMC42NSwtMi4xbDAuMDEsLTAuMTRsLTAuMzksLTIuNDJsLTAuMjksLTAuMjVsLTAuODYsLTAuMDJsLTAuNjMsLTEuNGwwLjk5LC0xLjYxbDAuMzUsLTEuOTdsMS4yNCwtMy43M2wwLjQ5LC0wLjk2bDEuOTUsLTEuN2wxLjg2LDAuNjlsMy4xNiwwLjM1bDIuOTIsLTAuMWwwLjE3LC0wLjA2bDIuMjQsLTEuNjVsMC4xMSwwLjE0bC0xLjgsMi4yMmwtMS43MiwwLjQ0bC0yLjQxLC0wLjQ4bC00LjIxLDAuMTNsLTIuMTksMC4zNmwtMC4yNSwwLjI0bC0wLjM2LDEuOWwwLjA4LDAuMjdsMi4yNCwyLjIzbDAuNCwwLjAybDEuMjksLTEuMDhsMy4xOSwtMC41OGwtMC4xOSwwLjA2bC0xLjA0LDEuNGwtMi4xMywwLjk0bC0wLjEyLDAuNDVsMi4yNiwzLjA2bC0wLjM3LDAuNjlsMC4wMywwLjMybDEuNTEsMS45NVpNNzI4LjQ4LDI5NS45N2wwLjU5LDAuNzZsLTAuMDIsMS4zN2wtMS4wLDAuNTVsLTAuNjQsLTAuNThsMS4wOSwtMS44NGwtMC4wMiwtMC4yNlpNNzI4LjY0LDI4Ni45NWwwLjc5LC0wLjE0bC0wLjA3LDAuMzlsLTAuNzIsLTAuMjRaTTczMi4zOCwzMTAuMWwtMS44OSwwLjQ5bC0wLjA2LC0wLjA2bDAuMTcsLTAuNjRsMS4wLC0xLjQybDIuMTQsLTAuODdsMC4xLDAuMmwwLjA0LDAuNThsLTEuNDksMS43MlpNNzI4LjI2LDMwNS43MWwtMC4xNywwLjYzbC0zLjUzLDAuNjdsLTMuMDIsLTAuMjhsLTAuMCwtMC40MmwxLjY2LC0wLjQ0bDEuNDcsMC43MWwwLjE2LDAuMDNsMS43NSwtMC4yMWwxLjY5LC0wLjY5Wk03MjIuOTgsMzEwLjMzbC0wLjc0LDAuMDNsLTIuNTIsLTEuMzVsMS40MiwtMC4zbDEuMTksMC43bDAuNzIsMC42M2wtMC4wNiwwLjI4Wk03MTYuMjQsMzA1LjYzbDAuNjYsMC40OWwwLjIyLDAuMDZsMS4zNSwtMC4xOGwwLjMxLDAuNTNsLTQuMTgsMC43N2wtMC44LC0wLjAxbDAuNTEsLTAuODZsMS4yLC0wLjAybDAuMjQsLTAuMTJsMC40OSwtMC42NVpNNzE1Ljg0LDI4MC4yMWwwLjA5LDAuMzRsMi4yNSwxLjg2bC0yLjI1LDAuMjJsLTAuMjQsMC4xN2wtMC44NCwxLjcxbC0wLjAzLDAuMTVsMC4xLDIuMTFsLTIuMjcsMS42MmwtMC4xMywwLjI0bC0wLjA2LDIuNDZsLTAuNzQsMi45MmwtMC4wMiwtMC4wNWwtMC4zOSwtMC4xNmwtMi42MiwxLjA0bC0wLjg2LC0xLjMzbC0wLjIzLC0wLjE0bC0xLjcxLC0wLjE0bC0xLjE5LC0wLjc2bC0wLjI1LC0wLjAzbC0yLjc4LDAuODRsLTAuNzksLTEuMDVsLTAuMjYsLTAuMTJsLTEuNjEsMC4xM2wtMS44LC0wLjI1bC0wLjM2LC0zLjEzbC0wLjE1LC0wLjIzbC0xLjE4LC0wLjY1bC0xLjEzLC0yLjAybC0wLjMzLC0yLjFsMC4yNywtMi4xOWwxLjA1LC0xLjE3bDAuMjgsMS4xMmwwLjEsMC4xNmwxLjcxLDEuNDFsMC4yOCwwLjA1bDEuNTUsLTAuNDlsMS41NCwwLjE3bDAuMjMsLTAuMDdsMS40LC0xLjIxbDEuMDUsLTAuMTlsMi4zLDAuNjhsMC4xNiwwLjBsMi4wNCwtMC41M2wwLjIxLC0wLjE5bDEuMjYsLTMuNDFsMC45MSwtMC44MmwwLjA5LC0wLjE0bDAuOCwtMi42NGwyLjYzLDAuMGwxLjcxLDAuMzNsLTEuMTksMS44OWwwLjAyLDAuMzRsMS43NCwyLjI0bC0wLjM3LDEuMFpNNjkyLjY3LDMwMi4wbDAuMjYsMC4xOWw0LjgsMC4yNWwwLjI4LC0wLjE2bDAuNDQsLTAuODNsNC4yOSwxLjEybDAuODUsMS41MmwwLjIzLDAuMTVsMy43MSwwLjQ1bDIuMzcsMS4xNWwtMi4wNiwwLjY5bC0yLjc3LC0xLjBsLTIuMjUsMC4wN2wtMi41NywtMC4xOGwtMi4zMSwtMC40NWwtMi45NCwtMC45N2wtMS44NCwtMC4yNWwtMC4xMywwLjAxbC0wLjk3LDAuMjlsLTQuMzQsLTAuOThsLTAuMzgsLTAuOTRsLTAuMjUsLTAuMTlsLTEuNzYsLTAuMTRsMS4zMSwtMS44NGwyLjgxLDAuMTRsMS45NywwLjk2bDAuOTUsMC4xOWwwLjI4LDAuNzRaTTY4NS42MywyOTkuMjdsLTIuMzYsMC4wNGwtMi4wNywtMi4wNWwtMy4xNywtMi4wMmwtMS4wNiwtMS41bC0xLjg4LC0yLjAybC0xLjIyLC0xLjg1bC0xLjksLTMuNDlsLTIuMiwtMi4xMWwtMC43MSwtMi4wOGwtMC45NCwtMS45OWwtMC4xLC0wLjEybC0yLjIxLC0xLjU0bC0xLjM1LC0yLjE3bC0xLjg2LC0xLjM5bC0yLjUzLC0yLjY4bC0wLjE0LC0wLjgxbDEuMjIsMC4wOGwzLjc2LDAuNDdsMi4xNiwyLjRsMS45NCwxLjdsMS4zNywxLjA0bDIuMzUsMi42N2wwLjIyLDAuMWwyLjQ0LDAuMDRsMS45OSwxLjYybDEuNDIsMi4wNmwwLjA5LDAuMDlsMS42NywxLjBsLTAuODgsMS44bDAuMTEsMC4zOWwxLjQ0LDAuODdsMC4xMywwLjA0bDAuNjgsMC4wNWwwLjQxLDEuNjJsMC44NywxLjRsMC4yMiwwLjE0bDEuNzEsMC4yMWwxLjA2LDEuMzhsLTAuNjEsMy4wNGwtMC4wOSwzLjZaXCIsIFwibmFtZVwiOiBcIkluZG9uZXNpYVwifSwgXCJVQVwiOiB7XCJwYXRoXCI6IFwiTTUwMC41NCwxNDEuNDJsMC45LDAuMTNsMC4yNywtMC4xMWwwLjUyLC0wLjYybDAuNjgsMC4xM2wyLjQzLC0wLjNsMS4zMiwxLjU3bC0wLjQ1LDAuNDhsLTAuMDcsMC4yNmwwLjIxLDEuMDNsMC4yNywwLjI0bDEuODUsMC4xNWwwLjc2LDEuMjJsLTAuMDUsMC41NWwwLjIsMC4zMWwzLjE4LDEuMTVsMC4xOCwwLjAxbDEuNzUsLTAuNDdsMS40MiwxLjQxbDAuMjIsMC4wOWwxLjQyLC0wLjAzbDMuNDQsMC45OWwwLjAyLDAuNjVsLTAuOTcsMS42MmwtMC4wMywwLjI0bDAuNTIsMS42N2wtMC4yOSwwLjc5bC0yLjI0LDAuMjJsLTAuMTQsMC4wNWwtMS4yOSwwLjg5bC0wLjEzLDAuMjNsLTAuMDcsMS4xNmwtMS43NSwwLjIybC0wLjEyLDAuMDRsLTEuNiwwLjk4bC0yLjI3LDAuMTZsLTAuMTIsMC4wNGwtMi4xNiwxLjE3bC0wLjE2LDAuMjlsMC4xNSwxLjk0bDAuMTQsMC4yM2wxLjIzLDAuNzVsMC4xOCwwLjA0bDIuMDYsLTAuMTVsLTAuMjIsMC41MWwtMi42NywwLjU0bC0zLjI3LDEuNzJsLTEuMCwtMC40NWwwLjQ1LC0xLjE5bC0wLjE5LC0wLjM5bC0yLjM0LC0wLjc4bDAuMTUsLTAuMmwyLjMyLC0xLjBsMC4wOSwtMC40OWwtMC43MywtMC43MmwtMC4xNSwtMC4wOGwtMy42OSwtMC43NWwtMC4xNCwtMC45NmwtMC4zNSwtMC4yNWwtMi4zMiwwLjM5bC0wLjIxLDAuMTVsLTAuOTEsMS43bC0xLjc3LDIuMWwtMC45MywtMC40NGwtMC4yNCwtMC4wbC0xLjA1LDAuNDVsLTAuNDgsLTAuMjVsMC4xMywtMC4wN2wwLjE0LC0wLjE1bDAuNDMsLTEuMDRsMC42NywtMC45N2wwLjA0LC0wLjI2bC0wLjEsLTAuMzFsMC4wNCwtMC4wMmwwLjExLDAuMTlsMC4yNCwwLjE1bDEuNDgsMC4wOWwwLjc4LC0wLjI1bDAuMDcsLTAuNTNsLTAuMjcsLTAuMTlsMC4wOSwtMC4yNWwtMC4wOCwtMC4zM2wtMC44MSwtMC43NGwtMC4zNCwtMS4yNGwtMC4xNCwtMC4xOGwtMC43MywtMC40MmwwLjE1LC0wLjg3bC0wLjExLC0wLjI5bC0xLjEzLC0wLjg2bC0wLjE1LC0wLjA2bC0wLjk3LC0wLjExbC0xLjc5LC0wLjk3bC0wLjIsLTAuMDNsLTEuNjYsMC4zMmwtMC4xMywwLjA2bC0wLjUyLDAuNDFsLTAuOTUsLTAuMGwtMC4yMywwLjExbC0wLjU2LDAuNjZsLTEuNzQsMC4yOWwtMC43OSwwLjQzbC0xLjAxLC0wLjY4bC0wLjE2LC0wLjA1bC0xLjU3LC0wLjAxbC0xLjUyLC0wLjM1bC0wLjIzLDAuMDRsLTAuNzEsMC40NWwtMC4wOSwtMC40M2wtMC4xMywtMC4xOWwtMS4xOCwtMC43NGwwLjM4LC0xLjAybDAuNTMsLTAuNjRsMC4zNSwwLjEybDAuMzcsLTAuNDFsLTAuNTcsLTEuMjlsMi4xLC0yLjVsMS4xNiwtMC4zNmwwLjIsLTAuMmwwLjI3LC0wLjkybC0wLjAxLC0wLjJsLTEuMSwtMi41MmwwLjc5LC0wLjA5bDAuMTMsLTAuMDVsMS4zLC0wLjg2bDEuODMsLTAuMDdsMi40OCwwLjI2bDIuODQsMC44bDEuOTEsMC4wNmwwLjg4LDAuNDVsMC4yOSwtMC4wMWwwLjcyLC0wLjQ0bDAuNDksMC41OGwwLjI1LDAuMTFsMi4yLC0wLjE2bDAuOTQsMC4zbDAuMzksLTAuMjZsMC4xNSwtMS41N2wwLjYxLC0wLjU5bDIuMDEsLTAuMTlaXCIsIFwibmFtZVwiOiBcIlVrcmFpbmVcIn0sIFwiUUFcIjoge1wicGF0aFwiOiBcIk01NDguNDcsMjIxLjQ3bC0wLjE1LC0xLjcybDAuNTksLTEuMjNsMC4zOCwtMC4xNmwwLjU0LDAuNmwwLjA0LDEuNGwtMC40NywxLjM3bC0wLjQxLDAuMTFsLTAuNTMsLTAuMzdaXCIsIFwibmFtZVwiOiBcIlFhdGFyXCJ9LCBcIk1aXCI6IHtcInBhdGhcIjogXCJNNTA3LjcxLDMxNC4xNGwxLjY1LC0wLjE4bDIuOTYsMC43bDAuMiwtMC4wMmwwLjYsLTAuMjlsMS42OCwtMC4wNmwwLjE4LC0wLjA3bDAuOCwtMC42OWwxLjUsMC4wMmwyLjc0LC0wLjk4bDEuNzQsLTEuMjdsMC4yNSwwLjdsLTAuMSwyLjQ3bDAuMzEsMi4yN2wwLjEsMy45N2wwLjQyLDEuMjRsLTAuNywxLjcxbC0wLjk0LDEuNzNsLTEuNTIsMS41MmwtNS4wNiwyLjIxbC0yLjg4LDIuOGwtMS4wMSwwLjUxbC0xLjcyLDEuODFsLTAuOTksMC41OGwtMC4xNSwwLjIzbC0wLjIxLDEuODZsMC4wNCwwLjE5bDEuMTcsMS45NWwwLjQ3LDEuNDdsMC4wMywwLjc0bDAuMzksMC4yOGwwLjA1LC0wLjAxbC0wLjA2LDIuMTNsLTAuMzksMS4xOWwwLjEsMC4zM2wwLjQyLDAuMzJsLTAuMjgsMC44M2wtMC45NSwwLjg2bC0yLjAzLDAuODhsLTMuMDgsMS40OWwtMS4xLDAuOTlsLTAuMDksMC4yOGwwLjIxLDEuMTNsMC4yMSwwLjIzbDAuMzgsMC4xMWwtMC4xNCwwLjg5bC0xLjM5LC0wLjAybC0wLjE3LC0wLjk0bC0wLjM4LC0xLjIzbC0wLjIsLTAuODlsMC40NCwtMi45MWwtMC4wMSwtMC4xNGwtMC42NSwtMS44OGwtMS4xNSwtMy41NWwyLjUyLC0yLjg1bDAuNjgsLTEuODlsMC4yOSwtMC4xOGwwLjE0LC0wLjJsMC4yOCwtMS41M2wtMC4wMywtMC4xOWwtMC4zNiwtMC43bDAuMSwtMS44M2wwLjQ5LC0xLjg0bC0wLjAxLC0zLjI2bC0wLjE0LC0wLjI1bC0xLjMsLTAuODNsLTAuMTEsLTAuMDRsLTEuMDgsLTAuMTdsLTAuNDcsLTAuNTVsLTAuMSwtMC4wOGwtMS4xNiwtMC41NGwtMC4xMywtMC4wM2wtMS44MywwLjA0bC0wLjMyLC0yLjI1bDcuMTksLTEuOTlsMS4zMiwxLjEybDAuMjksMC4wNmwwLjU1LC0wLjE5bDAuNzUsMC40OWwwLjExLDAuODFsLTAuNDksMS4xMWwtMC4wMiwwLjE1bDAuMTksMS44MWwwLjA5LDAuMThsMS42MywxLjU5bDAuNDgsLTAuMWwwLjcyLC0xLjY4bDAuOTksLTAuNDlsMC4xNywtMC4yOWwtMC4yMSwtMy4yOWwtMC4wNCwtMC4xM2wtMS4xMSwtMS45MmwtMC45LC0wLjgybC0wLjIxLC0wLjA4bC0wLjYyLDAuMDNsLTAuNjMsLTIuOThsMC42MSwtMS42N1pcIiwgXCJuYW1lXCI6IFwiTW96YW1iaXF1ZVwifX0sIFwiaGVpZ2h0XCI6IDQ0MC43MDYzMTA3NDQxMzMxLCBcInByb2plY3Rpb25cIjoge1widHlwZVwiOiBcIm1pbGxcIiwgXCJjZW50cmFsTWVyaWRpYW5cIjogMTEuNX0sIFwid2lkdGhcIjogOTAwLjB9KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9wbHVnaW5zL2p2ZWN0b3JtYXAvanF1ZXJ5LWp2ZWN0b3JtYXAtd29ybGQtbWlsbC1lbi5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///55\n");
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(e){if(true){!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1)], __WEBPACK_AMD_DEFINE_FACTORY__ = (e),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))}else{e(jQuery)}})(function(e){\"use strict\";var t={},n=Math.max,r=Math.min;t.c={};t.c.d=e(document);t.c.t=function(e){return e.originalEvent.touches.length-1};t.o=function(){var n=this;this.o=null;this.$=null;this.i=null;this.g=null;this.v=null;this.cv=null;this.x=0;this.y=0;this.w=0;this.h=0;this.$c=null;this.c=null;this.t=0;this.isInit=false;this.fgColor=null;this.pColor=null;this.dH=null;this.cH=null;this.eH=null;this.rH=null;this.scale=1;this.relative=false;this.relativeWidth=false;this.relativeHeight=false;this.$div=null;this.run=function(){var t=function(e,t){var r;for(r in t){n.o[r]=t[r]}n._carve().init();n._configure()._draw()};if(this.$.data(\"kontroled\"))return;this.$.data(\"kontroled\",true);this.extend();this.o=e.extend({min:this.$.data(\"min\")!==undefined?this.$.data(\"min\"):0,max:this.$.data(\"max\")!==undefined?this.$.data(\"max\"):100,stopper:true,readOnly:this.$.data(\"readonly\")||this.$.attr(\"readonly\")===\"readonly\",cursor:this.$.data(\"cursor\")===true&&30||this.$.data(\"cursor\")||0,thickness:this.$.data(\"thickness\")&&Math.max(Math.min(this.$.data(\"thickness\"),1),.01)||.35,lineCap:this.$.data(\"linecap\")||\"butt\",width:this.$.data(\"width\")||200,height:this.$.data(\"height\")||200,displayInput:this.$.data(\"displayinput\")==null||this.$.data(\"displayinput\"),displayPrevious:this.$.data(\"displayprevious\"),fgColor:this.$.data(\"fgcolor\")||\"#87CEEB\",inputColor:this.$.data(\"inputcolor\"),font:this.$.data(\"font\")||\"Arial\",fontWeight:this.$.data(\"font-weight\")||\"bold\",inline:false,step:this.$.data(\"step\")||1,rotation:this.$.data(\"rotation\"),draw:null,change:null,cancel:null,release:null,format:function(e){return e},parse:function(e){return parseFloat(e)}},this.o);this.o.flip=this.o.rotation===\"anticlockwise\"||this.o.rotation===\"acw\";if(!this.o.inputColor){this.o.inputColor=this.o.fgColor}if(this.$.is(\"fieldset\")){this.v={};this.i=this.$.find(\"input\");this.i.each(function(t){var r=e(this);n.i[t]=r;n.v[t]=n.o.parse(r.val());r.bind(\"change blur\",function(){var e={};e[t]=r.val();n.val(n._validate(e))})});this.$.find(\"legend\").remove()}else{this.i=this.$;this.v=this.o.parse(this.$.val());this.v===\"\"&&(this.v=this.o.min);this.$.bind(\"change blur\",function(){n.val(n._validate(n.o.parse(n.$.val())))})}!this.o.displayInput&&this.$.hide();this.$c=e(document.createElement(\"canvas\")).attr({width:this.o.width,height:this.o.height});this.$div=e('<div style=\"'+(this.o.inline?\"display:inline;\":\"\")+\"width:\"+this.o.width+\"px;height:\"+this.o.height+\"px;\"+'\"></div>');this.$.wrap(this.$div).before(this.$c);this.$div=this.$.parent();if(typeof G_vmlCanvasManager!==\"undefined\"){G_vmlCanvasManager.initElement(this.$c[0])}this.c=this.$c[0].getContext?this.$c[0].getContext(\"2d\"):null;if(!this.c){throw{name:\"CanvasNotSupportedException\",message:\"Canvas not supported. Please use excanvas on IE8.0.\",toString:function(){return this.name+\": \"+this.message}}}this.scale=(window.devicePixelRatio||1)/(this.c.webkitBackingStorePixelRatio||this.c.mozBackingStorePixelRatio||this.c.msBackingStorePixelRatio||this.c.oBackingStorePixelRatio||this.c.backingStorePixelRatio||1);this.relativeWidth=this.o.width%1!==0&&this.o.width.indexOf(\"%\");this.relativeHeight=this.o.height%1!==0&&this.o.height.indexOf(\"%\");this.relative=this.relativeWidth||this.relativeHeight;this._carve();if(this.v instanceof Object){this.cv={};this.copy(this.v,this.cv)}else{this.cv=this.v}this.$.bind(\"configure\",t).parent().bind(\"configure\",t);this._listen()._configure()._xy().init();this.isInit=true;this.$.val(this.o.format(this.v));this._draw();return this};this._carve=function(){if(this.relative){var e=this.relativeWidth?this.$div.parent().width()*parseInt(this.o.width)/100:this.$div.parent().width(),t=this.relativeHeight?this.$div.parent().height()*parseInt(this.o.height)/100:this.$div.parent().height();this.w=this.h=Math.min(e,t)}else{this.w=this.o.width;this.h=this.o.height}this.$div.css({width:this.w+\"px\",height:this.h+\"px\"});this.$c.attr({width:this.w,height:this.h});if(this.scale!==1){this.$c[0].width=this.$c[0].width*this.scale;this.$c[0].height=this.$c[0].height*this.scale;this.$c.width(this.w);this.$c.height(this.h)}return this};this._draw=function(){var e=true;n.g=n.c;n.clear();n.dH&&(e=n.dH());e!==false&&n.draw()};this._touch=function(e){var r=function(e){var t=n.xy2val(e.originalEvent.touches[n.t].pageX,e.originalEvent.touches[n.t].pageY);if(t==n.cv)return;if(n.cH&&n.cH(t)===false)return;n.change(n._validate(t));n._draw()};this.t=t.c.t(e);r(e);t.c.d.bind(\"touchmove.k\",r).bind(\"touchend.k\",function(){t.c.d.unbind(\"touchmove.k touchend.k\");n.val(n.cv)});return this};this._mouse=function(e){var r=function(e){var t=n.xy2val(e.pageX,e.pageY);if(t==n.cv)return;if(n.cH&&n.cH(t)===false)return;n.change(n._validate(t));n._draw()};r(e);t.c.d.bind(\"mousemove.k\",r).bind(\"keyup.k\",function(e){if(e.keyCode===27){t.c.d.unbind(\"mouseup.k mousemove.k keyup.k\");if(n.eH&&n.eH()===false)return;n.cancel()}}).bind(\"mouseup.k\",function(e){t.c.d.unbind(\"mousemove.k mouseup.k keyup.k\");n.val(n.cv)});return this};this._xy=function(){var e=this.$c.offset();this.x=e.left;this.y=e.top;return this};this._listen=function(){if(!this.o.readOnly){this.$c.bind(\"mousedown\",function(e){e.preventDefault();n._xy()._mouse(e)}).bind(\"touchstart\",function(e){e.preventDefault();n._xy()._touch(e)});this.listen()}else{this.$.attr(\"readonly\",\"readonly\")}if(this.relative){e(window).resize(function(){n._carve().init();n._draw()})}return this};this._configure=function(){if(this.o.draw)this.dH=this.o.draw;if(this.o.change)this.cH=this.o.change;if(this.o.cancel)this.eH=this.o.cancel;if(this.o.release)this.rH=this.o.release;if(this.o.displayPrevious){this.pColor=this.h2rgba(this.o.fgColor,\"0.4\");this.fgColor=this.h2rgba(this.o.fgColor,\"0.6\")}else{this.fgColor=this.o.fgColor}return this};this._clear=function(){this.$c[0].width=this.$c[0].width};this._validate=function(e){var t=~~((e<0?-.5:.5)+e/this.o.step)*this.o.step;return Math.round(t*100)/100};this.listen=function(){};this.extend=function(){};this.init=function(){};this.change=function(e){};this.val=function(e){};this.xy2val=function(e,t){};this.draw=function(){};this.clear=function(){this._clear()};this.h2rgba=function(e,t){var n;e=e.substring(1,7);n=[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)];return\"rgba(\"+n[0]+\",\"+n[1]+\",\"+n[2]+\",\"+t+\")\"};this.copy=function(e,t){for(var n in e){t[n]=e[n]}}};t.Dial=function(){t.o.call(this);this.startAngle=null;this.xy=null;this.radius=null;this.lineWidth=null;this.cursorExt=null;this.w2=null;this.PI2=2*Math.PI;this.extend=function(){this.o=e.extend({bgColor:this.$.data(\"bgcolor\")||\"#EEEEEE\",angleOffset:this.$.data(\"angleoffset\")||0,angleArc:this.$.data(\"anglearc\")||360,inline:true},this.o)};this.val=function(e,t){if(null!=e){e=this.o.parse(e);if(t!==false&&e!=this.v&&this.rH&&this.rH(e)===false){return}this.cv=this.o.stopper?n(r(e,this.o.max),this.o.min):e;this.v=this.cv;this.$.val(this.o.format(this.v));this._draw()}else{return this.v}};this.xy2val=function(e,t){var i,s;i=Math.atan2(e-(this.x+this.w2),-(t-this.y-this.w2))-this.angleOffset;if(this.o.flip){i=this.angleArc-i-this.PI2}if(this.angleArc!=this.PI2&&i<0&&i>-.5){i=0}else if(i<0){i+=this.PI2}s=i*(this.o.max-this.o.min)/this.angleArc+this.o.min;this.o.stopper&&(s=n(r(s,this.o.max),this.o.min));return s};this.listen=function(){var t=this,i,s,o=function(e){e.preventDefault();var o=e.originalEvent,u=o.detail||o.wheelDeltaX,a=o.detail||o.wheelDeltaY,f=t._validate(t.o.parse(t.$.val()))+(u>0||a>0?t.o.step:u<0||a<0?-t.o.step:0);f=n(r(f,t.o.max),t.o.min);t.val(f,false);if(t.rH){clearTimeout(i);i=setTimeout(function(){t.rH(f);i=null},100);if(!s){s=setTimeout(function(){if(i)t.rH(f);s=null},200)}}},u,a,f=1,l={37:-t.o.step,38:t.o.step,39:t.o.step,40:-t.o.step};this.$.bind(\"keydown\",function(i){var s=i.keyCode;if(s>=96&&s<=105){s=i.keyCode=s-48}u=parseInt(String.fromCharCode(s));if(isNaN(u)){s!==13&&s!==8&&s!==9&&s!==189&&(s!==190||t.$.val().match(/\\./))&&i.preventDefault();if(e.inArray(s,[37,38,39,40])>-1){i.preventDefault();var o=t.o.parse(t.$.val())+l[s]*f;t.o.stopper&&(o=n(r(o,t.o.max),t.o.min));t.change(t._validate(o));t._draw();a=window.setTimeout(function(){f*=2},30)}}}).bind(\"keyup\",function(e){if(isNaN(u)){if(a){window.clearTimeout(a);a=null;f=1;t.val(t.$.val())}}else{t.$.val()>t.o.max&&t.$.val(t.o.max)||t.$.val()<t.o.min&&t.$.val(t.o.min)}});this.$c.bind(\"mousewheel DOMMouseScroll\",o);this.$.bind(\"mousewheel DOMMouseScroll\",o)};this.init=function(){if(this.v<this.o.min||this.v>this.o.max){this.v=this.o.min}this.$.val(this.v);this.w2=this.w/2;this.cursorExt=this.o.cursor/100;this.xy=this.w2*this.scale;this.lineWidth=this.xy*this.o.thickness;this.lineCap=this.o.lineCap;this.radius=this.xy-this.lineWidth/2;this.o.angleOffset&&(this.o.angleOffset=isNaN(this.o.angleOffset)?0:this.o.angleOffset);this.o.angleArc&&(this.o.angleArc=isNaN(this.o.angleArc)?this.PI2:this.o.angleArc);this.angleOffset=this.o.angleOffset*Math.PI/180;this.angleArc=this.o.angleArc*Math.PI/180;this.startAngle=1.5*Math.PI+this.angleOffset;this.endAngle=1.5*Math.PI+this.angleOffset+this.angleArc;var e=n(String(Math.abs(this.o.max)).length,String(Math.abs(this.o.min)).length,2)+2;this.o.displayInput&&this.i.css({width:(this.w/2+4>>0)+\"px\",height:(this.w/3>>0)+\"px\",position:\"absolute\",\"vertical-align\":\"middle\",\"margin-top\":(this.w/3>>0)+\"px\",\"margin-left\":\"-\"+(this.w*3/4+2>>0)+\"px\",border:0,background:\"none\",font:this.o.fontWeight+\" \"+(this.w/e>>0)+\"px \"+this.o.font,\"text-align\":\"center\",color:this.o.inputColor||this.o.fgColor,padding:\"0px\",\"-webkit-appearance\":\"none\"})||this.i.css({width:\"0px\",visibility:\"hidden\"})};this.change=function(e){this.cv=e;this.$.val(this.o.format(e))};this.angle=function(e){return(e-this.o.min)*this.angleArc/(this.o.max-this.o.min)};this.arc=function(e){var t,n;e=this.angle(e);if(this.o.flip){t=this.endAngle+1e-5;n=t-e-1e-5}else{t=this.startAngle-1e-5;n=t+e+1e-5}this.o.cursor&&(t=n-this.cursorExt)&&(n=n+this.cursorExt);return{s:t,e:n,d:this.o.flip&&!this.o.cursor}};this.draw=function(){var e=this.g,t=this.arc(this.cv),n,r=1;e.lineWidth=this.lineWidth;e.lineCap=this.lineCap;if(this.o.bgColor!==\"none\"){e.beginPath();e.strokeStyle=this.o.bgColor;e.arc(this.xy,this.xy,this.radius,this.endAngle-1e-5,this.startAngle+1e-5,true);e.stroke()}if(this.o.displayPrevious){n=this.arc(this.v);e.beginPath();e.strokeStyle=this.pColor;e.arc(this.xy,this.xy,this.radius,n.s,n.e,n.d);e.stroke();r=this.cv==this.v}e.beginPath();e.strokeStyle=r?this.o.fgColor:this.fgColor;e.arc(this.xy,this.xy,this.radius,t.s,t.e,t.d);e.stroke()};this.cancel=function(){this.val(this.v)}};e.fn.dial=e.fn.knob=function(n){return this.each(function(){var r=new t.Dial;r.o=n;r.$=e(this);r.run()}).parent()}})//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS1rbm9iL2Rpc3QvanF1ZXJ5Lmtub2IubWluLmpzPzRjOTAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkdBQWEsU0FBMkM7QUFBQTtBQUFBO0FBQUEscUdBQXFCLEtBQUssV0FBVyxjQUFjLGFBQWEsUUFBUSx1QkFBdUIsT0FBTyxrQkFBa0Isa0JBQWtCLHlDQUF5QyxlQUFlLFdBQVcsWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLGFBQWEsU0FBUyxTQUFTLFNBQVMsU0FBUyxhQUFhLFlBQVksU0FBUyxrQkFBa0Isa0JBQWtCLGlCQUFpQixhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsb0JBQW9CLHlCQUF5QiwwQkFBMEIsZUFBZSxvQkFBb0Isb0JBQW9CLE1BQU0sWUFBWSxZQUFZLGtCQUFrQix3QkFBd0IsbUNBQW1DLDhCQUE4QixjQUFjLGlCQUFpQixtM0JBQW0zQixTQUFTLG1CQUFtQixzQkFBc0IsU0FBUyx1RUFBdUUsdUJBQXVCLGlDQUFpQywwQkFBMEIsVUFBVSw0QkFBNEIsd0JBQXdCLGNBQWMsU0FBUywwQkFBMEIsZ0NBQWdDLFNBQVMsYUFBYSxzQkFBc0IsRUFBRSxFQUFFLCtCQUErQixLQUFLLGNBQWMsa0NBQWtDLGlDQUFpQyxxQ0FBcUMseUNBQXlDLEVBQUUsb0NBQW9DLGtEQUFrRCx3Q0FBd0MsRUFBRSwwREFBMEQsZ0NBQWdDLDJCQUEyQixjQUFjLHVDQUF1QywwQkFBMEIsNENBQTRDLDJDQUEyQyw4REFBOEQsWUFBWSxNQUFNLHFIQUFxSCxxQ0FBcUMsbU5BQW1OLGlFQUFpRSxvRUFBb0Usc0RBQXNELGNBQWMsNkJBQTZCLFdBQVcsMEJBQTBCLEtBQUssZUFBZSx3REFBd0QseUNBQXlDLGlCQUFpQixrQ0FBa0MsYUFBYSxhQUFhLHVCQUF1QixrQkFBa0Isb05BQW9OLDRCQUE0QixLQUFLLG9CQUFvQixxQkFBcUIsZUFBZSxxQ0FBcUMsRUFBRSxjQUFjLDJCQUEyQixFQUFFLG1CQUFtQiw2Q0FBNkMsK0NBQStDLHNCQUFzQix1QkFBdUIsYUFBYSxzQkFBc0IsV0FBVyxRQUFRLFVBQVUsaUJBQWlCLHFCQUFxQix3QkFBd0Isa0JBQWtCLHNGQUFzRixrQkFBa0IsZ0NBQWdDLHlCQUF5QixXQUFXLGdCQUFnQixLQUFLLHlEQUF5RCx1Q0FBdUMsWUFBWSxFQUFFLGFBQWEsd0JBQXdCLGtCQUFrQixnQ0FBZ0Msa0JBQWtCLGdDQUFnQyx5QkFBeUIsV0FBVyxLQUFLLHVEQUF1RCxtQkFBbUIsOENBQThDLCtCQUErQixZQUFZLCtCQUErQiw4Q0FBOEMsWUFBWSxFQUFFLGFBQWEsb0JBQW9CLHVCQUF1QixjQUFjLGFBQWEsYUFBYSx3QkFBd0IscUJBQXFCLHFDQUFxQyxtQkFBbUIsa0JBQWtCLGdDQUFnQyxtQkFBbUIsa0JBQWtCLEVBQUUsY0FBYyxLQUFLLG1DQUFtQyxrQkFBa0IsNEJBQTRCLGtCQUFrQixVQUFVLEVBQUUsYUFBYSwyQkFBMkIsbUNBQW1DLHVDQUF1Qyx1Q0FBdUMseUNBQXlDLDJCQUEyQiw4Q0FBOEMsK0NBQStDLEtBQUssNEJBQTRCLGFBQWEsdUJBQXVCLG1DQUFtQywyQkFBMkIsaURBQWlELDhCQUE4Qix5QkFBeUIseUJBQXlCLHVCQUF1QiwwQkFBMEIsdUJBQXVCLDRCQUE0Qix1QkFBdUIsc0JBQXNCLGVBQWUsMEJBQTBCLE1BQU0sbUJBQW1CLDhGQUE4RixnREFBZ0Qsd0JBQXdCLGdCQUFnQixhQUFhLGtCQUFrQixlQUFlLHFCQUFxQixhQUFhLGlCQUFpQixvQkFBb0Isb0JBQW9CLGFBQWEsbUJBQW1CLHVCQUF1QixpQkFBaUIsc0lBQXNJLFVBQVUsdUJBQXVCLFlBQVksa0JBQWtCLHNEQUFzRCxPQUFPLHVEQUF1RCxlQUFlLGtDQUFrQyxhQUFhLEtBQUssZ0JBQWdCLDBCQUEwQixRQUFRLHNFQUFzRSxnQkFBZ0IsMkJBQTJCLHdDQUF3QyxJQUFJLGFBQWEsWUFBWSxxREFBcUQsa0RBQWtELFVBQVUsdUJBQXVCLDZCQUE2QixtQkFBbUIsdUpBQXVKLDBCQUEwQixlQUFlLFNBQVMsZ0JBQWdCLHdCQUF3QixRQUFRLE9BQU8sTUFBTSxPQUFPLHdCQUF3QixhQUFhLE9BQU8sUUFBUSxZQUFZLG1EQUFtRCxrQ0FBa0MsZ0JBQWdCLGtCQUFrQixpQkFBaUIsbUNBQW1DLGFBQWEsb0ZBQW9GLGtDQUFrQyxtQkFBbUIsa0NBQWtDLHlDQUF5Qyx5QkFBeUIsVUFBVSwrQkFBK0IsS0FBSyxPQUFPLDJCQUEyQixhQUFhLE1BQU0sdUJBQXVCLE9BQU8sSUFBSSxrQkFBa0IsS0FBSywwRUFBMEUsRUFBRSw0Q0FBNEMsNENBQTRDLHFCQUFxQix5Q0FBeUMsa0JBQWtCLG1CQUFtQixpQkFBaUIsaUNBQWlDLDJCQUEyQix3Q0FBd0MsNEJBQTRCLHFDQUFxQyx3RkFBd0YsbUZBQW1GLGdEQUFnRCwwQ0FBMEMsNkNBQTZDLHlEQUF5RCxxRkFBcUYsaUNBQWlDLDBXQUEwVyxlQUFlLGdDQUFnQyxHQUFHLHdCQUF3QixVQUFVLDhCQUE4Qix1QkFBdUIsNERBQTRELHFCQUFxQixRQUFRLGdCQUFnQixnQkFBZ0IscUJBQXFCLFdBQVcsS0FBSyx1QkFBdUIsV0FBVywwREFBMEQsT0FBTyx3Q0FBd0MscUJBQXFCLHVDQUF1QywyQkFBMkIsdUJBQXVCLDRCQUE0QixjQUFjLDZCQUE2QixnRkFBZ0YsV0FBVywyQkFBMkIsbUJBQW1CLGNBQWMsMEJBQTBCLCtDQUErQyxXQUFXLGtCQUFrQixjQUFjLDRDQUE0QywrQ0FBK0MsWUFBWSx1QkFBdUIsbUJBQW1CLGdDQUFnQyw0QkFBNEIsaUJBQWlCLE1BQU0sWUFBWSxRQUFRLFlBQVkiLCJmaWxlIjoiNTYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oZSl7aWYodHlwZW9mIGRlZmluZT09PVwiZnVuY3Rpb25cIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKFtcImpxdWVyeVwiXSxlKX1lbHNle2UoalF1ZXJ5KX19KShmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjt2YXIgdD17fSxuPU1hdGgubWF4LHI9TWF0aC5taW47dC5jPXt9O3QuYy5kPWUoZG9jdW1lbnQpO3QuYy50PWZ1bmN0aW9uKGUpe3JldHVybiBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcy5sZW5ndGgtMX07dC5vPWZ1bmN0aW9uKCl7dmFyIG49dGhpczt0aGlzLm89bnVsbDt0aGlzLiQ9bnVsbDt0aGlzLmk9bnVsbDt0aGlzLmc9bnVsbDt0aGlzLnY9bnVsbDt0aGlzLmN2PW51bGw7dGhpcy54PTA7dGhpcy55PTA7dGhpcy53PTA7dGhpcy5oPTA7dGhpcy4kYz1udWxsO3RoaXMuYz1udWxsO3RoaXMudD0wO3RoaXMuaXNJbml0PWZhbHNlO3RoaXMuZmdDb2xvcj1udWxsO3RoaXMucENvbG9yPW51bGw7dGhpcy5kSD1udWxsO3RoaXMuY0g9bnVsbDt0aGlzLmVIPW51bGw7dGhpcy5ySD1udWxsO3RoaXMuc2NhbGU9MTt0aGlzLnJlbGF0aXZlPWZhbHNlO3RoaXMucmVsYXRpdmVXaWR0aD1mYWxzZTt0aGlzLnJlbGF0aXZlSGVpZ2h0PWZhbHNlO3RoaXMuJGRpdj1udWxsO3RoaXMucnVuPWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oZSx0KXt2YXIgcjtmb3IociBpbiB0KXtuLm9bcl09dFtyXX1uLl9jYXJ2ZSgpLmluaXQoKTtuLl9jb25maWd1cmUoKS5fZHJhdygpfTtpZih0aGlzLiQuZGF0YShcImtvbnRyb2xlZFwiKSlyZXR1cm47dGhpcy4kLmRhdGEoXCJrb250cm9sZWRcIix0cnVlKTt0aGlzLmV4dGVuZCgpO3RoaXMubz1lLmV4dGVuZCh7bWluOnRoaXMuJC5kYXRhKFwibWluXCIpIT09dW5kZWZpbmVkP3RoaXMuJC5kYXRhKFwibWluXCIpOjAsbWF4OnRoaXMuJC5kYXRhKFwibWF4XCIpIT09dW5kZWZpbmVkP3RoaXMuJC5kYXRhKFwibWF4XCIpOjEwMCxzdG9wcGVyOnRydWUscmVhZE9ubHk6dGhpcy4kLmRhdGEoXCJyZWFkb25seVwiKXx8dGhpcy4kLmF0dHIoXCJyZWFkb25seVwiKT09PVwicmVhZG9ubHlcIixjdXJzb3I6dGhpcy4kLmRhdGEoXCJjdXJzb3JcIik9PT10cnVlJiYzMHx8dGhpcy4kLmRhdGEoXCJjdXJzb3JcIil8fDAsdGhpY2tuZXNzOnRoaXMuJC5kYXRhKFwidGhpY2tuZXNzXCIpJiZNYXRoLm1heChNYXRoLm1pbih0aGlzLiQuZGF0YShcInRoaWNrbmVzc1wiKSwxKSwuMDEpfHwuMzUsbGluZUNhcDp0aGlzLiQuZGF0YShcImxpbmVjYXBcIil8fFwiYnV0dFwiLHdpZHRoOnRoaXMuJC5kYXRhKFwid2lkdGhcIil8fDIwMCxoZWlnaHQ6dGhpcy4kLmRhdGEoXCJoZWlnaHRcIil8fDIwMCxkaXNwbGF5SW5wdXQ6dGhpcy4kLmRhdGEoXCJkaXNwbGF5aW5wdXRcIik9PW51bGx8fHRoaXMuJC5kYXRhKFwiZGlzcGxheWlucHV0XCIpLGRpc3BsYXlQcmV2aW91czp0aGlzLiQuZGF0YShcImRpc3BsYXlwcmV2aW91c1wiKSxmZ0NvbG9yOnRoaXMuJC5kYXRhKFwiZmdjb2xvclwiKXx8XCIjODdDRUVCXCIsaW5wdXRDb2xvcjp0aGlzLiQuZGF0YShcImlucHV0Y29sb3JcIiksZm9udDp0aGlzLiQuZGF0YShcImZvbnRcIil8fFwiQXJpYWxcIixmb250V2VpZ2h0OnRoaXMuJC5kYXRhKFwiZm9udC13ZWlnaHRcIil8fFwiYm9sZFwiLGlubGluZTpmYWxzZSxzdGVwOnRoaXMuJC5kYXRhKFwic3RlcFwiKXx8MSxyb3RhdGlvbjp0aGlzLiQuZGF0YShcInJvdGF0aW9uXCIpLGRyYXc6bnVsbCxjaGFuZ2U6bnVsbCxjYW5jZWw6bnVsbCxyZWxlYXNlOm51bGwsZm9ybWF0OmZ1bmN0aW9uKGUpe3JldHVybiBlfSxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VGbG9hdChlKX19LHRoaXMubyk7dGhpcy5vLmZsaXA9dGhpcy5vLnJvdGF0aW9uPT09XCJhbnRpY2xvY2t3aXNlXCJ8fHRoaXMuby5yb3RhdGlvbj09PVwiYWN3XCI7aWYoIXRoaXMuby5pbnB1dENvbG9yKXt0aGlzLm8uaW5wdXRDb2xvcj10aGlzLm8uZmdDb2xvcn1pZih0aGlzLiQuaXMoXCJmaWVsZHNldFwiKSl7dGhpcy52PXt9O3RoaXMuaT10aGlzLiQuZmluZChcImlucHV0XCIpO3RoaXMuaS5lYWNoKGZ1bmN0aW9uKHQpe3ZhciByPWUodGhpcyk7bi5pW3RdPXI7bi52W3RdPW4uby5wYXJzZShyLnZhbCgpKTtyLmJpbmQoXCJjaGFuZ2UgYmx1clwiLGZ1bmN0aW9uKCl7dmFyIGU9e307ZVt0XT1yLnZhbCgpO24udmFsKG4uX3ZhbGlkYXRlKGUpKX0pfSk7dGhpcy4kLmZpbmQoXCJsZWdlbmRcIikucmVtb3ZlKCl9ZWxzZXt0aGlzLmk9dGhpcy4kO3RoaXMudj10aGlzLm8ucGFyc2UodGhpcy4kLnZhbCgpKTt0aGlzLnY9PT1cIlwiJiYodGhpcy52PXRoaXMuby5taW4pO3RoaXMuJC5iaW5kKFwiY2hhbmdlIGJsdXJcIixmdW5jdGlvbigpe24udmFsKG4uX3ZhbGlkYXRlKG4uby5wYXJzZShuLiQudmFsKCkpKSl9KX0hdGhpcy5vLmRpc3BsYXlJbnB1dCYmdGhpcy4kLmhpZGUoKTt0aGlzLiRjPWUoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSkuYXR0cih7d2lkdGg6dGhpcy5vLndpZHRoLGhlaWdodDp0aGlzLm8uaGVpZ2h0fSk7dGhpcy4kZGl2PWUoJzxkaXYgc3R5bGU9XCInKyh0aGlzLm8uaW5saW5lP1wiZGlzcGxheTppbmxpbmU7XCI6XCJcIikrXCJ3aWR0aDpcIit0aGlzLm8ud2lkdGgrXCJweDtoZWlnaHQ6XCIrdGhpcy5vLmhlaWdodCtcInB4O1wiKydcIj48L2Rpdj4nKTt0aGlzLiQud3JhcCh0aGlzLiRkaXYpLmJlZm9yZSh0aGlzLiRjKTt0aGlzLiRkaXY9dGhpcy4kLnBhcmVudCgpO2lmKHR5cGVvZiBHX3ZtbENhbnZhc01hbmFnZXIhPT1cInVuZGVmaW5lZFwiKXtHX3ZtbENhbnZhc01hbmFnZXIuaW5pdEVsZW1lbnQodGhpcy4kY1swXSl9dGhpcy5jPXRoaXMuJGNbMF0uZ2V0Q29udGV4dD90aGlzLiRjWzBdLmdldENvbnRleHQoXCIyZFwiKTpudWxsO2lmKCF0aGlzLmMpe3Rocm93e25hbWU6XCJDYW52YXNOb3RTdXBwb3J0ZWRFeGNlcHRpb25cIixtZXNzYWdlOlwiQ2FudmFzIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgZXhjYW52YXMgb24gSUU4LjAuXCIsdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lK1wiOiBcIit0aGlzLm1lc3NhZ2V9fX10aGlzLnNjYWxlPSh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSkvKHRoaXMuYy53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0aGlzLmMubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8dGhpcy5jLm1zQmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8dGhpcy5jLm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0aGlzLmMuYmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8MSk7dGhpcy5yZWxhdGl2ZVdpZHRoPXRoaXMuby53aWR0aCUxIT09MCYmdGhpcy5vLndpZHRoLmluZGV4T2YoXCIlXCIpO3RoaXMucmVsYXRpdmVIZWlnaHQ9dGhpcy5vLmhlaWdodCUxIT09MCYmdGhpcy5vLmhlaWdodC5pbmRleE9mKFwiJVwiKTt0aGlzLnJlbGF0aXZlPXRoaXMucmVsYXRpdmVXaWR0aHx8dGhpcy5yZWxhdGl2ZUhlaWdodDt0aGlzLl9jYXJ2ZSgpO2lmKHRoaXMudiBpbnN0YW5jZW9mIE9iamVjdCl7dGhpcy5jdj17fTt0aGlzLmNvcHkodGhpcy52LHRoaXMuY3YpfWVsc2V7dGhpcy5jdj10aGlzLnZ9dGhpcy4kLmJpbmQoXCJjb25maWd1cmVcIix0KS5wYXJlbnQoKS5iaW5kKFwiY29uZmlndXJlXCIsdCk7dGhpcy5fbGlzdGVuKCkuX2NvbmZpZ3VyZSgpLl94eSgpLmluaXQoKTt0aGlzLmlzSW5pdD10cnVlO3RoaXMuJC52YWwodGhpcy5vLmZvcm1hdCh0aGlzLnYpKTt0aGlzLl9kcmF3KCk7cmV0dXJuIHRoaXN9O3RoaXMuX2NhcnZlPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWxhdGl2ZSl7dmFyIGU9dGhpcy5yZWxhdGl2ZVdpZHRoP3RoaXMuJGRpdi5wYXJlbnQoKS53aWR0aCgpKnBhcnNlSW50KHRoaXMuby53aWR0aCkvMTAwOnRoaXMuJGRpdi5wYXJlbnQoKS53aWR0aCgpLHQ9dGhpcy5yZWxhdGl2ZUhlaWdodD90aGlzLiRkaXYucGFyZW50KCkuaGVpZ2h0KCkqcGFyc2VJbnQodGhpcy5vLmhlaWdodCkvMTAwOnRoaXMuJGRpdi5wYXJlbnQoKS5oZWlnaHQoKTt0aGlzLnc9dGhpcy5oPU1hdGgubWluKGUsdCl9ZWxzZXt0aGlzLnc9dGhpcy5vLndpZHRoO3RoaXMuaD10aGlzLm8uaGVpZ2h0fXRoaXMuJGRpdi5jc3Moe3dpZHRoOnRoaXMudytcInB4XCIsaGVpZ2h0OnRoaXMuaCtcInB4XCJ9KTt0aGlzLiRjLmF0dHIoe3dpZHRoOnRoaXMudyxoZWlnaHQ6dGhpcy5ofSk7aWYodGhpcy5zY2FsZSE9PTEpe3RoaXMuJGNbMF0ud2lkdGg9dGhpcy4kY1swXS53aWR0aCp0aGlzLnNjYWxlO3RoaXMuJGNbMF0uaGVpZ2h0PXRoaXMuJGNbMF0uaGVpZ2h0KnRoaXMuc2NhbGU7dGhpcy4kYy53aWR0aCh0aGlzLncpO3RoaXMuJGMuaGVpZ2h0KHRoaXMuaCl9cmV0dXJuIHRoaXN9O3RoaXMuX2RyYXc9ZnVuY3Rpb24oKXt2YXIgZT10cnVlO24uZz1uLmM7bi5jbGVhcigpO24uZEgmJihlPW4uZEgoKSk7ZSE9PWZhbHNlJiZuLmRyYXcoKX07dGhpcy5fdG91Y2g9ZnVuY3Rpb24oZSl7dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ9bi54eTJ2YWwoZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbbi50XS5wYWdlWCxlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1tuLnRdLnBhZ2VZKTtpZih0PT1uLmN2KXJldHVybjtpZihuLmNIJiZuLmNIKHQpPT09ZmFsc2UpcmV0dXJuO24uY2hhbmdlKG4uX3ZhbGlkYXRlKHQpKTtuLl9kcmF3KCl9O3RoaXMudD10LmMudChlKTtyKGUpO3QuYy5kLmJpbmQoXCJ0b3VjaG1vdmUua1wiLHIpLmJpbmQoXCJ0b3VjaGVuZC5rXCIsZnVuY3Rpb24oKXt0LmMuZC51bmJpbmQoXCJ0b3VjaG1vdmUuayB0b3VjaGVuZC5rXCIpO24udmFsKG4uY3YpfSk7cmV0dXJuIHRoaXN9O3RoaXMuX21vdXNlPWZ1bmN0aW9uKGUpe3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PW4ueHkydmFsKGUucGFnZVgsZS5wYWdlWSk7aWYodD09bi5jdilyZXR1cm47aWYobi5jSCYmbi5jSCh0KT09PWZhbHNlKXJldHVybjtuLmNoYW5nZShuLl92YWxpZGF0ZSh0KSk7bi5fZHJhdygpfTtyKGUpO3QuYy5kLmJpbmQoXCJtb3VzZW1vdmUua1wiLHIpLmJpbmQoXCJrZXl1cC5rXCIsZnVuY3Rpb24oZSl7aWYoZS5rZXlDb2RlPT09Mjcpe3QuYy5kLnVuYmluZChcIm1vdXNldXAuayBtb3VzZW1vdmUuayBrZXl1cC5rXCIpO2lmKG4uZUgmJm4uZUgoKT09PWZhbHNlKXJldHVybjtuLmNhbmNlbCgpfX0pLmJpbmQoXCJtb3VzZXVwLmtcIixmdW5jdGlvbihlKXt0LmMuZC51bmJpbmQoXCJtb3VzZW1vdmUuayBtb3VzZXVwLmsga2V5dXAua1wiKTtuLnZhbChuLmN2KX0pO3JldHVybiB0aGlzfTt0aGlzLl94eT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJGMub2Zmc2V0KCk7dGhpcy54PWUubGVmdDt0aGlzLnk9ZS50b3A7cmV0dXJuIHRoaXN9O3RoaXMuX2xpc3Rlbj1mdW5jdGlvbigpe2lmKCF0aGlzLm8ucmVhZE9ubHkpe3RoaXMuJGMuYmluZChcIm1vdXNlZG93blwiLGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKTtuLl94eSgpLl9tb3VzZShlKX0pLmJpbmQoXCJ0b3VjaHN0YXJ0XCIsZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpO24uX3h5KCkuX3RvdWNoKGUpfSk7dGhpcy5saXN0ZW4oKX1lbHNle3RoaXMuJC5hdHRyKFwicmVhZG9ubHlcIixcInJlYWRvbmx5XCIpfWlmKHRoaXMucmVsYXRpdmUpe2Uod2luZG93KS5yZXNpemUoZnVuY3Rpb24oKXtuLl9jYXJ2ZSgpLmluaXQoKTtuLl9kcmF3KCl9KX1yZXR1cm4gdGhpc307dGhpcy5fY29uZmlndXJlPWZ1bmN0aW9uKCl7aWYodGhpcy5vLmRyYXcpdGhpcy5kSD10aGlzLm8uZHJhdztpZih0aGlzLm8uY2hhbmdlKXRoaXMuY0g9dGhpcy5vLmNoYW5nZTtpZih0aGlzLm8uY2FuY2VsKXRoaXMuZUg9dGhpcy5vLmNhbmNlbDtpZih0aGlzLm8ucmVsZWFzZSl0aGlzLnJIPXRoaXMuby5yZWxlYXNlO2lmKHRoaXMuby5kaXNwbGF5UHJldmlvdXMpe3RoaXMucENvbG9yPXRoaXMuaDJyZ2JhKHRoaXMuby5mZ0NvbG9yLFwiMC40XCIpO3RoaXMuZmdDb2xvcj10aGlzLmgycmdiYSh0aGlzLm8uZmdDb2xvcixcIjAuNlwiKX1lbHNle3RoaXMuZmdDb2xvcj10aGlzLm8uZmdDb2xvcn1yZXR1cm4gdGhpc307dGhpcy5fY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLiRjWzBdLndpZHRoPXRoaXMuJGNbMF0ud2lkdGh9O3RoaXMuX3ZhbGlkYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PX5+KChlPDA/LS41Oi41KStlL3RoaXMuby5zdGVwKSp0aGlzLm8uc3RlcDtyZXR1cm4gTWF0aC5yb3VuZCh0KjEwMCkvMTAwfTt0aGlzLmxpc3Rlbj1mdW5jdGlvbigpe307dGhpcy5leHRlbmQ9ZnVuY3Rpb24oKXt9O3RoaXMuaW5pdD1mdW5jdGlvbigpe307dGhpcy5jaGFuZ2U9ZnVuY3Rpb24oZSl7fTt0aGlzLnZhbD1mdW5jdGlvbihlKXt9O3RoaXMueHkydmFsPWZ1bmN0aW9uKGUsdCl7fTt0aGlzLmRyYXc9ZnVuY3Rpb24oKXt9O3RoaXMuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhcigpfTt0aGlzLmgycmdiYT1mdW5jdGlvbihlLHQpe3ZhciBuO2U9ZS5zdWJzdHJpbmcoMSw3KTtuPVtwYXJzZUludChlLnN1YnN0cmluZygwLDIpLDE2KSxwYXJzZUludChlLnN1YnN0cmluZygyLDQpLDE2KSxwYXJzZUludChlLnN1YnN0cmluZyg0LDYpLDE2KV07cmV0dXJuXCJyZ2JhKFwiK25bMF0rXCIsXCIrblsxXStcIixcIituWzJdK1wiLFwiK3QrXCIpXCJ9O3RoaXMuY29weT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKXt0W25dPWVbbl19fX07dC5EaWFsPWZ1bmN0aW9uKCl7dC5vLmNhbGwodGhpcyk7dGhpcy5zdGFydEFuZ2xlPW51bGw7dGhpcy54eT1udWxsO3RoaXMucmFkaXVzPW51bGw7dGhpcy5saW5lV2lkdGg9bnVsbDt0aGlzLmN1cnNvckV4dD1udWxsO3RoaXMudzI9bnVsbDt0aGlzLlBJMj0yKk1hdGguUEk7dGhpcy5leHRlbmQ9ZnVuY3Rpb24oKXt0aGlzLm89ZS5leHRlbmQoe2JnQ29sb3I6dGhpcy4kLmRhdGEoXCJiZ2NvbG9yXCIpfHxcIiNFRUVFRUVcIixhbmdsZU9mZnNldDp0aGlzLiQuZGF0YShcImFuZ2xlb2Zmc2V0XCIpfHwwLGFuZ2xlQXJjOnRoaXMuJC5kYXRhKFwiYW5nbGVhcmNcIil8fDM2MCxpbmxpbmU6dHJ1ZX0sdGhpcy5vKX07dGhpcy52YWw9ZnVuY3Rpb24oZSx0KXtpZihudWxsIT1lKXtlPXRoaXMuby5wYXJzZShlKTtpZih0IT09ZmFsc2UmJmUhPXRoaXMudiYmdGhpcy5ySCYmdGhpcy5ySChlKT09PWZhbHNlKXtyZXR1cm59dGhpcy5jdj10aGlzLm8uc3RvcHBlcj9uKHIoZSx0aGlzLm8ubWF4KSx0aGlzLm8ubWluKTplO3RoaXMudj10aGlzLmN2O3RoaXMuJC52YWwodGhpcy5vLmZvcm1hdCh0aGlzLnYpKTt0aGlzLl9kcmF3KCl9ZWxzZXtyZXR1cm4gdGhpcy52fX07dGhpcy54eTJ2YWw9ZnVuY3Rpb24oZSx0KXt2YXIgaSxzO2k9TWF0aC5hdGFuMihlLSh0aGlzLngrdGhpcy53MiksLSh0LXRoaXMueS10aGlzLncyKSktdGhpcy5hbmdsZU9mZnNldDtpZih0aGlzLm8uZmxpcCl7aT10aGlzLmFuZ2xlQXJjLWktdGhpcy5QSTJ9aWYodGhpcy5hbmdsZUFyYyE9dGhpcy5QSTImJmk8MCYmaT4tLjUpe2k9MH1lbHNlIGlmKGk8MCl7aSs9dGhpcy5QSTJ9cz1pKih0aGlzLm8ubWF4LXRoaXMuby5taW4pL3RoaXMuYW5nbGVBcmMrdGhpcy5vLm1pbjt0aGlzLm8uc3RvcHBlciYmKHM9bihyKHMsdGhpcy5vLm1heCksdGhpcy5vLm1pbikpO3JldHVybiBzfTt0aGlzLmxpc3Rlbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMsaSxzLG89ZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBvPWUub3JpZ2luYWxFdmVudCx1PW8uZGV0YWlsfHxvLndoZWVsRGVsdGFYLGE9by5kZXRhaWx8fG8ud2hlZWxEZWx0YVksZj10Ll92YWxpZGF0ZSh0Lm8ucGFyc2UodC4kLnZhbCgpKSkrKHU+MHx8YT4wP3Quby5zdGVwOnU8MHx8YTwwPy10Lm8uc3RlcDowKTtmPW4ocihmLHQuby5tYXgpLHQuby5taW4pO3QudmFsKGYsZmFsc2UpO2lmKHQuckgpe2NsZWFyVGltZW91dChpKTtpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnJIKGYpO2k9bnVsbH0sMTAwKTtpZighcyl7cz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoaSl0LnJIKGYpO3M9bnVsbH0sMjAwKX19fSx1LGEsZj0xLGw9ezM3Oi10Lm8uc3RlcCwzODp0Lm8uc3RlcCwzOTp0Lm8uc3RlcCw0MDotdC5vLnN0ZXB9O3RoaXMuJC5iaW5kKFwia2V5ZG93blwiLGZ1bmN0aW9uKGkpe3ZhciBzPWkua2V5Q29kZTtpZihzPj05NiYmczw9MTA1KXtzPWkua2V5Q29kZT1zLTQ4fXU9cGFyc2VJbnQoU3RyaW5nLmZyb21DaGFyQ29kZShzKSk7aWYoaXNOYU4odSkpe3MhPT0xMyYmcyE9PTgmJnMhPT05JiZzIT09MTg5JiYocyE9PTE5MHx8dC4kLnZhbCgpLm1hdGNoKC9cXC4vKSkmJmkucHJldmVudERlZmF1bHQoKTtpZihlLmluQXJyYXkocyxbMzcsMzgsMzksNDBdKT4tMSl7aS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBvPXQuby5wYXJzZSh0LiQudmFsKCkpK2xbc10qZjt0Lm8uc3RvcHBlciYmKG89bihyKG8sdC5vLm1heCksdC5vLm1pbikpO3QuY2hhbmdlKHQuX3ZhbGlkYXRlKG8pKTt0Ll9kcmF3KCk7YT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YqPTJ9LDMwKX19fSkuYmluZChcImtleXVwXCIsZnVuY3Rpb24oZSl7aWYoaXNOYU4odSkpe2lmKGEpe3dpbmRvdy5jbGVhclRpbWVvdXQoYSk7YT1udWxsO2Y9MTt0LnZhbCh0LiQudmFsKCkpfX1lbHNle3QuJC52YWwoKT50Lm8ubWF4JiZ0LiQudmFsKHQuby5tYXgpfHx0LiQudmFsKCk8dC5vLm1pbiYmdC4kLnZhbCh0Lm8ubWluKX19KTt0aGlzLiRjLmJpbmQoXCJtb3VzZXdoZWVsIERPTU1vdXNlU2Nyb2xsXCIsbyk7dGhpcy4kLmJpbmQoXCJtb3VzZXdoZWVsIERPTU1vdXNlU2Nyb2xsXCIsbyl9O3RoaXMuaW5pdD1mdW5jdGlvbigpe2lmKHRoaXMudjx0aGlzLm8ubWlufHx0aGlzLnY+dGhpcy5vLm1heCl7dGhpcy52PXRoaXMuby5taW59dGhpcy4kLnZhbCh0aGlzLnYpO3RoaXMudzI9dGhpcy53LzI7dGhpcy5jdXJzb3JFeHQ9dGhpcy5vLmN1cnNvci8xMDA7dGhpcy54eT10aGlzLncyKnRoaXMuc2NhbGU7dGhpcy5saW5lV2lkdGg9dGhpcy54eSp0aGlzLm8udGhpY2tuZXNzO3RoaXMubGluZUNhcD10aGlzLm8ubGluZUNhcDt0aGlzLnJhZGl1cz10aGlzLnh5LXRoaXMubGluZVdpZHRoLzI7dGhpcy5vLmFuZ2xlT2Zmc2V0JiYodGhpcy5vLmFuZ2xlT2Zmc2V0PWlzTmFOKHRoaXMuby5hbmdsZU9mZnNldCk/MDp0aGlzLm8uYW5nbGVPZmZzZXQpO3RoaXMuby5hbmdsZUFyYyYmKHRoaXMuby5hbmdsZUFyYz1pc05hTih0aGlzLm8uYW5nbGVBcmMpP3RoaXMuUEkyOnRoaXMuby5hbmdsZUFyYyk7dGhpcy5hbmdsZU9mZnNldD10aGlzLm8uYW5nbGVPZmZzZXQqTWF0aC5QSS8xODA7dGhpcy5hbmdsZUFyYz10aGlzLm8uYW5nbGVBcmMqTWF0aC5QSS8xODA7dGhpcy5zdGFydEFuZ2xlPTEuNSpNYXRoLlBJK3RoaXMuYW5nbGVPZmZzZXQ7dGhpcy5lbmRBbmdsZT0xLjUqTWF0aC5QSSt0aGlzLmFuZ2xlT2Zmc2V0K3RoaXMuYW5nbGVBcmM7dmFyIGU9bihTdHJpbmcoTWF0aC5hYnModGhpcy5vLm1heCkpLmxlbmd0aCxTdHJpbmcoTWF0aC5hYnModGhpcy5vLm1pbikpLmxlbmd0aCwyKSsyO3RoaXMuby5kaXNwbGF5SW5wdXQmJnRoaXMuaS5jc3Moe3dpZHRoOih0aGlzLncvMis0Pj4wKStcInB4XCIsaGVpZ2h0Oih0aGlzLncvMz4+MCkrXCJweFwiLHBvc2l0aW9uOlwiYWJzb2x1dGVcIixcInZlcnRpY2FsLWFsaWduXCI6XCJtaWRkbGVcIixcIm1hcmdpbi10b3BcIjoodGhpcy53LzM+PjApK1wicHhcIixcIm1hcmdpbi1sZWZ0XCI6XCItXCIrKHRoaXMudyozLzQrMj4+MCkrXCJweFwiLGJvcmRlcjowLGJhY2tncm91bmQ6XCJub25lXCIsZm9udDp0aGlzLm8uZm9udFdlaWdodCtcIiBcIisodGhpcy53L2U+PjApK1wicHggXCIrdGhpcy5vLmZvbnQsXCJ0ZXh0LWFsaWduXCI6XCJjZW50ZXJcIixjb2xvcjp0aGlzLm8uaW5wdXRDb2xvcnx8dGhpcy5vLmZnQ29sb3IscGFkZGluZzpcIjBweFwiLFwiLXdlYmtpdC1hcHBlYXJhbmNlXCI6XCJub25lXCJ9KXx8dGhpcy5pLmNzcyh7d2lkdGg6XCIwcHhcIix2aXNpYmlsaXR5OlwiaGlkZGVuXCJ9KX07dGhpcy5jaGFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5jdj1lO3RoaXMuJC52YWwodGhpcy5vLmZvcm1hdChlKSl9O3RoaXMuYW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuKGUtdGhpcy5vLm1pbikqdGhpcy5hbmdsZUFyYy8odGhpcy5vLm1heC10aGlzLm8ubWluKX07dGhpcy5hcmM9ZnVuY3Rpb24oZSl7dmFyIHQsbjtlPXRoaXMuYW5nbGUoZSk7aWYodGhpcy5vLmZsaXApe3Q9dGhpcy5lbmRBbmdsZSsxZS01O249dC1lLTFlLTV9ZWxzZXt0PXRoaXMuc3RhcnRBbmdsZS0xZS01O249dCtlKzFlLTV9dGhpcy5vLmN1cnNvciYmKHQ9bi10aGlzLmN1cnNvckV4dCkmJihuPW4rdGhpcy5jdXJzb3JFeHQpO3JldHVybntzOnQsZTpuLGQ6dGhpcy5vLmZsaXAmJiF0aGlzLm8uY3Vyc29yfX07dGhpcy5kcmF3PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nLHQ9dGhpcy5hcmModGhpcy5jdiksbixyPTE7ZS5saW5lV2lkdGg9dGhpcy5saW5lV2lkdGg7ZS5saW5lQ2FwPXRoaXMubGluZUNhcDtpZih0aGlzLm8uYmdDb2xvciE9PVwibm9uZVwiKXtlLmJlZ2luUGF0aCgpO2Uuc3Ryb2tlU3R5bGU9dGhpcy5vLmJnQ29sb3I7ZS5hcmModGhpcy54eSx0aGlzLnh5LHRoaXMucmFkaXVzLHRoaXMuZW5kQW5nbGUtMWUtNSx0aGlzLnN0YXJ0QW5nbGUrMWUtNSx0cnVlKTtlLnN0cm9rZSgpfWlmKHRoaXMuby5kaXNwbGF5UHJldmlvdXMpe249dGhpcy5hcmModGhpcy52KTtlLmJlZ2luUGF0aCgpO2Uuc3Ryb2tlU3R5bGU9dGhpcy5wQ29sb3I7ZS5hcmModGhpcy54eSx0aGlzLnh5LHRoaXMucmFkaXVzLG4ucyxuLmUsbi5kKTtlLnN0cm9rZSgpO3I9dGhpcy5jdj09dGhpcy52fWUuYmVnaW5QYXRoKCk7ZS5zdHJva2VTdHlsZT1yP3RoaXMuby5mZ0NvbG9yOnRoaXMuZmdDb2xvcjtlLmFyYyh0aGlzLnh5LHRoaXMueHksdGhpcy5yYWRpdXMsdC5zLHQuZSx0LmQpO2Uuc3Ryb2tlKCl9O3RoaXMuY2FuY2VsPWZ1bmN0aW9uKCl7dGhpcy52YWwodGhpcy52KX19O2UuZm4uZGlhbD1lLmZuLmtub2I9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciByPW5ldyB0LkRpYWw7ci5vPW47ci4kPWUodGhpcyk7ci5ydW4oKX0pLnBhcmVudCgpfX0pXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS1rbm9iL2Rpc3QvanF1ZXJ5Lmtub2IubWluLmpzXG4vLyBtb2R1bGUgaWQgPSA1NlxuLy8gbW9kdWxlIGNodW5rcyA9IDEiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///56\n");
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(module) {!function(e,t){ true?module.exports=t():\"function\"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){\"use strict\";function e(){return Qe.apply(null,arguments)}function t(e){return e instanceof Array||\"[object Array]\"===Object.prototype.toString.call(e)}function n(e){return null!=e&&\"[object Object]\"===Object.prototype.toString.call(e)}function s(e){return void 0===e}function i(e){return\"number\"==typeof e||\"[object Number]\"===Object.prototype.toString.call(e)}function r(e){return e instanceof Date||\"[object Date]\"===Object.prototype.toString.call(e)}function a(e,t){var n,s=[];for(n=0;n<e.length;++n)s.push(t(e[n],n));return s}function o(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function u(e,t){for(var n in t)o(t,n)&&(e[n]=t[n]);return o(t,\"toString\")&&(e.toString=t.toString),o(t,\"valueOf\")&&(e.valueOf=t.valueOf),e}function l(e,t,n,s){return ge(e,t,n,s,!0).utc()}function d(e){return null==e._pf&&(e._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}),e._pf}function h(e){if(null==e._isValid){var t=d(e),n=Xe.call(t.parsedDateParts,function(e){return null!=e}),s=!isNaN(e._d.getTime())&&t.overflow<0&&!t.empty&&!t.invalidMonth&&!t.invalidWeekday&&!t.weekdayMismatch&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated&&(!t.meridiem||t.meridiem&&n);if(e._strict&&(s=s&&0===t.charsLeftOver&&0===t.unusedTokens.length&&void 0===t.bigHour),null!=Object.isFrozen&&Object.isFrozen(e))return s;e._isValid=s}return e._isValid}function c(e){var t=l(NaN);return null!=e?u(d(t),e):d(t).userInvalidated=!0,t}function f(e,t){var n,i,r;if(s(t._isAMomentObject)||(e._isAMomentObject=t._isAMomentObject),s(t._i)||(e._i=t._i),s(t._f)||(e._f=t._f),s(t._l)||(e._l=t._l),s(t._strict)||(e._strict=t._strict),s(t._tzm)||(e._tzm=t._tzm),s(t._isUTC)||(e._isUTC=t._isUTC),s(t._offset)||(e._offset=t._offset),s(t._pf)||(e._pf=d(t)),s(t._locale)||(e._locale=t._locale),Ke.length>0)for(n=0;n<Ke.length;n++)s(r=t[i=Ke[n]])||(e[i]=r);return e}function m(t){f(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===et&&(et=!0,e.updateOffset(this),et=!1)}function _(e){return e instanceof m||null!=e&&null!=e._isAMomentObject}function y(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function g(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=y(t)),n}function p(e,t,n){var s,i=Math.min(e.length,t.length),r=Math.abs(e.length-t.length),a=0;for(s=0;s<i;s++)(n&&e[s]!==t[s]||!n&&g(e[s])!==g(t[s]))&&a++;return a+r}function w(t){!1===e.suppressDeprecationWarnings&&\"undefined\"!=typeof console&&console.warn&&console.warn(\"Deprecation warning: \"+t)}function v(t,n){var s=!0;return u(function(){if(null!=e.deprecationHandler&&e.deprecationHandler(null,t),s){for(var i,r=[],a=0;a<arguments.length;a++){if(i=\"\",\"object\"==typeof arguments[a]){i+=\"\\n[\"+a+\"] \";for(var o in arguments[0])i+=o+\": \"+arguments[0][o]+\", \";i=i.slice(0,-2)}else i=arguments[a];r.push(i)}w(t+\"\\nArguments: \"+Array.prototype.slice.call(r).join(\"\")+\"\\n\"+(new Error).stack),s=!1}return n.apply(this,arguments)},n)}function M(t,n){null!=e.deprecationHandler&&e.deprecationHandler(t,n),tt[t]||(w(n),tt[t]=!0)}function S(e){return e instanceof Function||\"[object Function]\"===Object.prototype.toString.call(e)}function D(e,t){var s,i=u({},e);for(s in t)o(t,s)&&(n(e[s])&&n(t[s])?(i[s]={},u(i[s],e[s]),u(i[s],t[s])):null!=t[s]?i[s]=t[s]:delete i[s]);for(s in e)o(e,s)&&!o(t,s)&&n(e[s])&&(i[s]=u({},i[s]));return i}function k(e){null!=e&&this.set(e)}function Y(e,t){var n=e.toLowerCase();st[n]=st[n+\"s\"]=st[t]=e}function O(e){return\"string\"==typeof e?st[e]||st[e.toLowerCase()]:void 0}function T(e){var t,n,s={};for(n in e)o(e,n)&&(t=O(n))&&(s[t]=e[n]);return s}function x(e,t){it[e]=t}function b(e,t,n){var s=\"\"+Math.abs(e),i=t-s.length;return(e>=0?n?\"+\":\"\":\"-\")+Math.pow(10,Math.max(0,i)).toString().substr(1)+s}function P(e,t,n,s){var i=s;\"string\"==typeof s&&(i=function(){return this[s]()}),e&&(ut[e]=i),t&&(ut[t[0]]=function(){return b(i.apply(this,arguments),t[1],t[2])}),n&&(ut[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function W(e){return e.match(/\\[[\\s\\S]/)?e.replace(/^\\[|\\]$/g,\"\"):e.replace(/\\\\/g,\"\")}function H(e,t){return e.isValid()?(t=R(t,e.localeData()),ot[t]=ot[t]||function(e){var t,n,s=e.match(rt);for(t=0,n=s.length;t<n;t++)ut[s[t]]?s[t]=ut[s[t]]:s[t]=W(s[t]);return function(t){var i,r=\"\";for(i=0;i<n;i++)r+=S(s[i])?s[i].call(t,e):s[i];return r}}(t),ot[t](e)):e.localeData().invalidDate()}function R(e,t){function n(e){return t.longDateFormat(e)||e}var s=5;for(at.lastIndex=0;s>=0&&at.test(e);)e=e.replace(at,n),at.lastIndex=0,s-=1;return e}function C(e,t,n){Yt[e]=S(t)?t:function(e,s){return e&&n?n:t}}function F(e,t){return o(Yt,e)?Yt[e](t._strict,t._locale):new RegExp(function(e){return U(e.replace(\"\\\\\",\"\").replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g,function(e,t,n,s,i){return t||n||s||i}))}(e))}function U(e){return e.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\")}function L(e,t){var n,s=t;for(\"string\"==typeof e&&(e=[e]),i(t)&&(s=function(e,n){n[t]=g(e)}),n=0;n<e.length;n++)Ot[e[n]]=s}function N(e,t){L(e,function(e,n,s,i){s._w=s._w||{},t(e,s._w,s,i)})}function G(e,t,n){null!=t&&o(Ot,e)&&Ot[e](t,n._a,n,e)}function V(e){return E(e)?366:365}function E(e){return e%4==0&&e%100!=0||e%400==0}function I(t,n){return function(s){return null!=s?(j(this,t,s),e.updateOffset(this,n),this):A(this,t)}}function A(e,t){return e.isValid()?e._d[\"get\"+(e._isUTC?\"UTC\":\"\")+t]():NaN}function j(e,t,n){e.isValid()&&!isNaN(n)&&(\"FullYear\"===t&&E(e.year())&&1===e.month()&&29===e.date()?e._d[\"set\"+(e._isUTC?\"UTC\":\"\")+t](n,e.month(),Z(n,e.month())):e._d[\"set\"+(e._isUTC?\"UTC\":\"\")+t](n))}function Z(e,t){if(isNaN(e)||isNaN(t))return NaN;var n=function(e,t){return(e%t+t)%t}(t,12);return e+=(t-n)/12,1===n?E(e)?29:28:31-n%7%2}function z(e,t){var n;if(!e.isValid())return e;if(\"string\"==typeof t)if(/^\\d+$/.test(t))t=g(t);else if(t=e.localeData().monthsParse(t),!i(t))return e;return n=Math.min(e.date(),Z(e.year(),t)),e._d[\"set\"+(e._isUTC?\"UTC\":\"\")+\"Month\"](t,n),e}function $(t){return null!=t?(z(this,t),e.updateOffset(this,!0),this):A(this,\"Month\")}function q(){function e(e,t){return t.length-e.length}var t,n,s=[],i=[],r=[];for(t=0;t<12;t++)n=l([2e3,t]),s.push(this.monthsShort(n,\"\")),i.push(this.months(n,\"\")),r.push(this.months(n,\"\")),r.push(this.monthsShort(n,\"\"));for(s.sort(e),i.sort(e),r.sort(e),t=0;t<12;t++)s[t]=U(s[t]),i[t]=U(i[t]);for(t=0;t<24;t++)r[t]=U(r[t]);this._monthsRegex=new RegExp(\"^(\"+r.join(\"|\")+\")\",\"i\"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp(\"^(\"+i.join(\"|\")+\")\",\"i\"),this._monthsShortStrictRegex=new RegExp(\"^(\"+s.join(\"|\")+\")\",\"i\")}function J(e){var t=new Date(Date.UTC.apply(null,arguments));return e<100&&e>=0&&isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e),t}function B(e,t,n){var s=7+t-n;return-((7+J(e,0,s).getUTCDay()-t)%7)+s-1}function Q(e,t,n,s,i){var r,a,o=1+7*(t-1)+(7+n-s)%7+B(e,s,i);return o<=0?a=V(r=e-1)+o:o>V(e)?(r=e+1,a=o-V(e)):(r=e,a=o),{year:r,dayOfYear:a}}function X(e,t,n){var s,i,r=B(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+K(i=e.year()-1,t,n):a>K(e.year(),t,n)?(s=a-K(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function K(e,t,n){var s=B(e,t,n),i=B(e+1,t,n);return(V(e)-s+i)/7}function ee(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],d=[];for(t=0;t<7;t++)n=l([2e3,1]).day(t),s=this.weekdaysMin(n,\"\"),i=this.weekdaysShort(n,\"\"),r=this.weekdays(n,\"\"),a.push(s),o.push(i),u.push(r),d.push(s),d.push(i),d.push(r);for(a.sort(e),o.sort(e),u.sort(e),d.sort(e),t=0;t<7;t++)o[t]=U(o[t]),u[t]=U(u[t]),d[t]=U(d[t]);this._weekdaysRegex=new RegExp(\"^(\"+d.join(\"|\")+\")\",\"i\"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp(\"^(\"+u.join(\"|\")+\")\",\"i\"),this._weekdaysShortStrictRegex=new RegExp(\"^(\"+o.join(\"|\")+\")\",\"i\"),this._weekdaysMinStrictRegex=new RegExp(\"^(\"+a.join(\"|\")+\")\",\"i\")}function te(){return this.hours()%12||12}function ne(e,t){P(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function se(e,t){return t._meridiemParse}function ie(e){return e?e.toLowerCase().replace(\"_\",\"-\"):e}function re(e){var t=null;if(!Xt[e]&&\"undefined\"!=typeof module&&module&&module.exports)try{t=Jt._abbr;!(function webpackMissingModule() { var e = new Error(\"Cannot find module \\\"./locale\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e; }()),ae(t)}catch(e){}return Xt[e]}function ae(e,t){var n;return e&&(n=s(t)?ue(e):oe(e,t))&&(Jt=n),Jt._abbr}function oe(e,t){if(null!==t){var n=Qt;if(t.abbr=e,null!=Xt[e])M(\"defineLocaleOverride\",\"use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info.\"),n=Xt[e]._config;else if(null!=t.parentLocale){if(null==Xt[t.parentLocale])return Kt[t.parentLocale]||(Kt[t.parentLocale]=[]),Kt[t.parentLocale].push({name:e,config:t}),null;n=Xt[t.parentLocale]._config}return Xt[e]=new k(D(n,t)),Kt[e]&&Kt[e].forEach(function(e){oe(e.name,e.config)}),ae(e),Xt[e]}return delete Xt[e],null}function ue(e){var n;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return Jt;if(!t(e)){if(n=re(e))return n;e=[e]}return function(e){for(var t,n,s,i,r=0;r<e.length;){for(t=(i=ie(e[r]).split(\"-\")).length,n=(n=ie(e[r+1]))?n.split(\"-\"):null;t>0;){if(s=re(i.slice(0,t).join(\"-\")))return s;if(n&&n.length>=t&&p(i,n,!0)>=t-1)break;t--}r++}return null}(e)}function le(e){var t,n=e._a;return n&&-2===d(e).overflow&&(t=n[xt]<0||n[xt]>11?xt:n[bt]<1||n[bt]>Z(n[Tt],n[xt])?bt:n[Pt]<0||n[Pt]>24||24===n[Pt]&&(0!==n[Wt]||0!==n[Ht]||0!==n[Rt])?Pt:n[Wt]<0||n[Wt]>59?Wt:n[Ht]<0||n[Ht]>59?Ht:n[Rt]<0||n[Rt]>999?Rt:-1,d(e)._overflowDayOfYear&&(t<Tt||t>bt)&&(t=bt),d(e)._overflowWeeks&&-1===t&&(t=Ct),d(e)._overflowWeekday&&-1===t&&(t=Ft),d(e).overflow=t),e}function de(e,t,n){return null!=e?e:null!=t?t:n}function he(t){var n,s,i,r,a,o=[];if(!t._d){for(i=function(t){var n=new Date(e.now());return t._useUTC?[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate()]:[n.getFullYear(),n.getMonth(),n.getDate()]}(t),t._w&&null==t._a[bt]&&null==t._a[xt]&&function(e){var t,n,s,i,r,a,o,u;if(null!=(t=e._w).GG||null!=t.W||null!=t.E)r=1,a=4,n=de(t.GG,e._a[Tt],X(pe(),1,4).year),s=de(t.W,1),((i=de(t.E,1))<1||i>7)&&(u=!0);else{r=e._locale._week.dow,a=e._locale._week.doy;var l=X(pe(),r,a);n=de(t.gg,e._a[Tt],l.year),s=de(t.w,l.week),null!=t.d?((i=t.d)<0||i>6)&&(u=!0):null!=t.e?(i=t.e+r,(t.e<0||t.e>6)&&(u=!0)):i=r}s<1||s>K(n,r,a)?d(e)._overflowWeeks=!0:null!=u?d(e)._overflowWeekday=!0:(o=Q(n,s,i,r,a),e._a[Tt]=o.year,e._dayOfYear=o.dayOfYear)}(t),null!=t._dayOfYear&&(a=de(t._a[Tt],i[Tt]),(t._dayOfYear>V(a)||0===t._dayOfYear)&&(d(t)._overflowDayOfYear=!0),s=J(a,0,t._dayOfYear),t._a[xt]=s.getUTCMonth(),t._a[bt]=s.getUTCDate()),n=0;n<3&&null==t._a[n];++n)t._a[n]=o[n]=i[n];for(;n<7;n++)t._a[n]=o[n]=null==t._a[n]?2===n?1:0:t._a[n];24===t._a[Pt]&&0===t._a[Wt]&&0===t._a[Ht]&&0===t._a[Rt]&&(t._nextDay=!0,t._a[Pt]=0),t._d=(t._useUTC?J:function(e,t,n,s,i,r,a){var o=new Date(e,t,n,s,i,r,a);return e<100&&e>=0&&isFinite(o.getFullYear())&&o.setFullYear(e),o}).apply(null,o),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[Pt]=24),t._w&&void 0!==t._w.d&&t._w.d!==r&&(d(t).weekdayMismatch=!0)}}function ce(e){var t,n,s,i,r,a,o=e._i,u=en.exec(o)||tn.exec(o);if(u){for(d(e).iso=!0,t=0,n=sn.length;t<n;t++)if(sn[t][1].exec(u[1])){i=sn[t][0],s=!1!==sn[t][2];break}if(null==i)return void(e._isValid=!1);if(u[3]){for(t=0,n=rn.length;t<n;t++)if(rn[t][1].exec(u[3])){r=(u[2]||\" \")+rn[t][0];break}if(null==r)return void(e._isValid=!1)}if(!s&&null!=r)return void(e._isValid=!1);if(u[4]){if(!nn.exec(u[4]))return void(e._isValid=!1);a=\"Z\"}e._f=i+(r||\"\")+(a||\"\"),_e(e)}else e._isValid=!1}function fe(e,t,n,s,i,r){var a=[function(e){var t=parseInt(e,10);{if(t<=49)return 2e3+t;if(t<=999)return 1900+t}return t}(e),Vt.indexOf(t),parseInt(n,10),parseInt(s,10),parseInt(i,10)];return r&&a.push(parseInt(r,10)),a}function me(e){var t=on.exec(function(e){return e.replace(/\\([^)]*\\)|[\\n\\t]/g,\" \").replace(/(\\s\\s+)/g,\" \").trim()}(e._i));if(t){var n=fe(t[4],t[3],t[2],t[5],t[6],t[7]);if(!function(e,t,n){if(e&&jt.indexOf(e)!==new Date(t[0],t[1],t[2]).getDay())return d(n).weekdayMismatch=!0,n._isValid=!1,!1;return!0}(t[1],n,e))return;e._a=n,e._tzm=function(e,t,n){if(e)return un[e];if(t)return 0;var s=parseInt(n,10),i=s%100;return(s-i)/100*60+i}(t[8],t[9],t[10]),e._d=J.apply(null,e._a),e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),d(e).rfc2822=!0}else e._isValid=!1}function _e(t){if(t._f!==e.ISO_8601)if(t._f!==e.RFC_2822){t._a=[],d(t).empty=!0;var n,s,i,r,a,o=\"\"+t._i,u=o.length,l=0;for(i=R(t._f,t._locale).match(rt)||[],n=0;n<i.length;n++)r=i[n],(s=(o.match(F(r,t))||[])[0])&&((a=o.substr(0,o.indexOf(s))).length>0&&d(t).unusedInput.push(a),o=o.slice(o.indexOf(s)+s.length),l+=s.length),ut[r]?(s?d(t).empty=!1:d(t).unusedTokens.push(r),G(r,s,t)):t._strict&&!s&&d(t).unusedTokens.push(r);d(t).charsLeftOver=u-l,o.length>0&&d(t).unusedInput.push(o),t._a[Pt]<=12&&!0===d(t).bigHour&&t._a[Pt]>0&&(d(t).bigHour=void 0),d(t).parsedDateParts=t._a.slice(0),d(t).meridiem=t._meridiem,t._a[Pt]=function(e,t,n){var s;if(null==n)return t;return null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?((s=e.isPM(n))&&t<12&&(t+=12),s||12!==t||(t=0),t):t}(t._locale,t._a[Pt],t._meridiem),he(t),le(t)}else me(t);else ce(t)}function ye(o){var l=o._i,y=o._f;return o._locale=o._locale||ue(o._l),null===l||void 0===y&&\"\"===l?c({nullInput:!0}):(\"string\"==typeof l&&(o._i=l=o._locale.preparse(l)),_(l)?new m(le(l)):(r(l)?o._d=l:t(y)?function(e){var t,n,s,i,r;if(0===e._f.length)return d(e).invalidFormat=!0,void(e._d=new Date(NaN));for(i=0;i<e._f.length;i++)r=0,t=f({},e),null!=e._useUTC&&(t._useUTC=e._useUTC),t._f=e._f[i],_e(t),h(t)&&(r+=d(t).charsLeftOver,r+=10*d(t).unusedTokens.length,d(t).score=r,(null==s||r<s)&&(s=r,n=t));u(e,n||t)}(o):y?_e(o):function(o){var u=o._i;s(u)?o._d=new Date(e.now()):r(u)?o._d=new Date(u.valueOf()):\"string\"==typeof u?function(t){var n=an.exec(t._i);null===n?(ce(t),!1===t._isValid&&(delete t._isValid,me(t),!1===t._isValid&&(delete t._isValid,e.createFromInputFallback(t)))):t._d=new Date(+n[1])}(o):t(u)?(o._a=a(u.slice(0),function(e){return parseInt(e,10)}),he(o)):n(u)?function(e){if(!e._d){var t=T(e._i);e._a=a([t.year,t.month,t.day||t.date,t.hour,t.minute,t.second,t.millisecond],function(e){return e&&parseInt(e,10)}),he(e)}}(o):i(u)?o._d=new Date(u):e.createFromInputFallback(o)}(o),h(o)||(o._d=null),o))}function ge(e,s,i,r,a){var o={};return!0!==i&&!1!==i||(r=i,i=void 0),(n(e)&&function(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;var t;for(t in e)if(e.hasOwnProperty(t))return!1;return!0}(e)||t(e)&&0===e.length)&&(e=void 0),o._isAMomentObject=!0,o._useUTC=o._isUTC=a,o._l=i,o._i=e,o._f=s,o._strict=r,function(e){var t=new m(le(ye(e)));return t._nextDay&&(t.add(1,\"d\"),t._nextDay=void 0),t}(o)}function pe(e,t,n,s){return ge(e,t,n,s,!1)}function we(e,n){var s,i;if(1===n.length&&t(n[0])&&(n=n[0]),!n.length)return pe();for(s=n[0],i=1;i<n.length;++i)n[i].isValid()&&!n[i][e](s)||(s=n[i]);return s}function ve(e){var t=T(e),n=t.year||0,s=t.quarter||0,i=t.month||0,r=t.week||0,a=t.day||0,o=t.hour||0,u=t.minute||0,l=t.second||0,d=t.millisecond||0;this._isValid=function(e){for(var t in e)if(-1===Ut.call(hn,t)||null!=e[t]&&isNaN(e[t]))return!1;for(var n=!1,s=0;s<hn.length;++s)if(e[hn[s]]){if(n)return!1;parseFloat(e[hn[s]])!==g(e[hn[s]])&&(n=!0)}return!0}(t),this._milliseconds=+d+1e3*l+6e4*u+1e3*o*60*60,this._days=+a+7*r,this._months=+i+3*s+12*n,this._data={},this._locale=ue(),this._bubble()}function Me(e){return e instanceof ve}function Se(e){return e<0?-1*Math.round(-1*e):Math.round(e)}function De(e,t){P(e,0,0,function(){var e=this.utcOffset(),n=\"+\";return e<0&&(e=-e,n=\"-\"),n+b(~~(e/60),2)+t+b(~~e%60,2)})}function ke(e,t){var n=(t||\"\").match(e);if(null===n)return null;var s=((n[n.length-1]||[])+\"\").match(cn)||[\"-\",0,0],i=60*s[1]+g(s[2]);return 0===i?0:\"+\"===s[0]?i:-i}function Ye(t,n){var s,i;return n._isUTC?(s=n.clone(),i=(_(t)||r(t)?t.valueOf():pe(t).valueOf())-s.valueOf(),s._d.setTime(s._d.valueOf()+i),e.updateOffset(s,!1),s):pe(t).local()}function Oe(e){return 15*-Math.round(e._d.getTimezoneOffset()/15)}function Te(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function xe(e,t){var n,s,r,a=e,u=null;return Me(e)?a={ms:e._milliseconds,d:e._days,M:e._months}:i(e)?(a={},t?a[t]=e:a.milliseconds=e):(u=fn.exec(e))?(n=\"-\"===u[1]?-1:1,a={y:0,d:g(u[bt])*n,h:g(u[Pt])*n,m:g(u[Wt])*n,s:g(u[Ht])*n,ms:g(Se(1e3*u[Rt]))*n}):(u=mn.exec(e))?(n=\"-\"===u[1]?-1:(u[1],1),a={y:be(u[2],n),M:be(u[3],n),w:be(u[4],n),d:be(u[5],n),h:be(u[6],n),m:be(u[7],n),s:be(u[8],n)}):null==a?a={}:\"object\"==typeof a&&(\"from\"in a||\"to\"in a)&&(r=function(e,t){var n;if(!e.isValid()||!t.isValid())return{milliseconds:0,months:0};t=Ye(t,e),e.isBefore(t)?n=Pe(e,t):((n=Pe(t,e)).milliseconds=-n.milliseconds,n.months=-n.months);return n}(pe(a.from),pe(a.to)),(a={}).ms=r.milliseconds,a.M=r.months),s=new ve(a),Me(e)&&o(e,\"_locale\")&&(s._locale=e._locale),s}function be(e,t){var n=e&&parseFloat(e.replace(\",\",\".\"));return(isNaN(n)?0:n)*t}function Pe(e,t){var n={milliseconds:0,months:0};return n.months=t.month()-e.month()+12*(t.year()-e.year()),e.clone().add(n.months,\"M\").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,\"M\"),n}function We(e,t){return function(n,s){var i,r;return null===s||isNaN(+s)||(M(t,\"moment().\"+t+\"(period, number) is deprecated. Please use moment().\"+t+\"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.\"),r=n,n=s,s=r),n=\"string\"==typeof n?+n:n,i=xe(n,s),He(this,i,e),this}}function He(t,n,s,i){var r=n._milliseconds,a=Se(n._days),o=Se(n._months);t.isValid()&&(i=null==i||i,o&&z(t,A(t,\"Month\")+o*s),a&&j(t,\"Date\",A(t,\"Date\")+a*s),r&&t._d.setTime(t._d.valueOf()+r*s),i&&e.updateOffset(t,a||o))}function Re(e,t){var n,s=12*(t.year()-e.year())+(t.month()-e.month()),i=e.clone().add(s,\"months\");return n=t-i<0?(t-i)/(i-e.clone().add(s-1,\"months\")):(t-i)/(e.clone().add(s+1,\"months\")-i),-(s+n)||0}function Ce(e){var t;return void 0===e?this._locale._abbr:(null!=(t=ue(e))&&(this._locale=t),this)}function Fe(){return this._locale}function Ue(e,t){P(0,[e,e.length],0,t)}function Le(e,t,n,s,i){var r;return null==e?X(this,s,i).year:(r=K(e,s,i),t>r&&(t=r),function(e,t,n,s,i){var r=Q(e,t,n,s,i),a=J(r.year,0,r.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}.call(this,e,t,n,s,i))}function Ne(e,t){t[Rt]=g(1e3*(\"0.\"+e))}function Ge(e){return e}function Ve(e,t,n,s){var i=ue(),r=l().set(s,t);return i[n](r,e)}function Ee(e,t,n){if(i(e)&&(t=e,e=void 0),e=e||\"\",null!=t)return Ve(e,t,n,\"month\");var s,r=[];for(s=0;s<12;s++)r[s]=Ve(e,s,n,\"month\");return r}function Ie(e,t,n,s){\"boolean\"==typeof e?(i(t)&&(n=t,t=void 0),t=t||\"\"):(n=t=e,e=!1,i(t)&&(n=t,t=void 0),t=t||\"\");var r=ue(),a=e?r._week.dow:0;if(null!=n)return Ve(t,(n+a)%7,s,\"day\");var o,u=[];for(o=0;o<7;o++)u[o]=Ve(t,(o+a)%7,s,\"day\");return u}function Ae(e,t,n,s){var i=xe(t,n);return e._milliseconds+=s*i._milliseconds,e._days+=s*i._days,e._months+=s*i._months,e._bubble()}function je(e){return e<0?Math.floor(e):Math.ceil(e)}function Ze(e){return 4800*e/146097}function ze(e){return 146097*e/4800}function $e(e){return function(){return this.as(e)}}function qe(e){return function(){return this.isValid()?this._data[e]:NaN}}function Je(e){return(e>0)-(e<0)||+e}function Be(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n=An(this._milliseconds)/1e3,s=An(this._days),i=An(this._months);t=y((e=y(n/60))/60),n%=60,e%=60;var r=y(i/12),a=i%=12,o=s,u=t,l=e,d=n?n.toFixed(3).replace(/\\.?0+$/,\"\"):\"\",h=this.asSeconds();if(!h)return\"P0D\";var c=h<0?\"-\":\"\",f=Je(this._months)!==Je(h)?\"-\":\"\",m=Je(this._days)!==Je(h)?\"-\":\"\",_=Je(this._milliseconds)!==Je(h)?\"-\":\"\";return c+\"P\"+(r?f+r+\"Y\":\"\")+(a?f+a+\"M\":\"\")+(o?m+o+\"D\":\"\")+(u||l||d?\"T\":\"\")+(u?_+u+\"H\":\"\")+(l?_+l+\"M\":\"\")+(d?_+d+\"S\":\"\")}var Qe,Xe;Xe=Array.prototype.some?Array.prototype.some:function(e){for(var t=Object(this),n=t.length>>>0,s=0;s<n;s++)if(s in t&&e.call(this,t[s],s,t))return!0;return!1};var Ke=e.momentProperties=[],et=!1,tt={};e.suppressDeprecationWarnings=!1,e.deprecationHandler=null;var nt;nt=Object.keys?Object.keys:function(e){var t,n=[];for(t in e)o(e,t)&&n.push(t);return n};var st={},it={},rt=/(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,at=/(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,ot={},ut={},lt=/\\d/,dt=/\\d\\d/,ht=/\\d{3}/,ct=/\\d{4}/,ft=/[+-]?\\d{6}/,mt=/\\d\\d?/,_t=/\\d\\d\\d\\d?/,yt=/\\d\\d\\d\\d\\d\\d?/,gt=/\\d{1,3}/,pt=/\\d{1,4}/,wt=/[+-]?\\d{1,6}/,vt=/\\d+/,Mt=/[+-]?\\d+/,St=/Z|[+-]\\d\\d:?\\d\\d/gi,Dt=/Z|[+-]\\d\\d(?::?\\d\\d)?/gi,kt=/[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i,Yt={},Ot={},Tt=0,xt=1,bt=2,Pt=3,Wt=4,Ht=5,Rt=6,Ct=7,Ft=8;P(\"Y\",0,0,function(){var e=this.year();return e<=9999?\"\"+e:\"+\"+e}),P(0,[\"YY\",2],0,function(){return this.year()%100}),P(0,[\"YYYY\",4],0,\"year\"),P(0,[\"YYYYY\",5],0,\"year\"),P(0,[\"YYYYYY\",6,!0],0,\"year\"),Y(\"year\",\"y\"),x(\"year\",1),C(\"Y\",Mt),C(\"YY\",mt,dt),C(\"YYYY\",pt,ct),C(\"YYYYY\",wt,ft),C(\"YYYYYY\",wt,ft),L([\"YYYYY\",\"YYYYYY\"],Tt),L(\"YYYY\",function(t,n){n[Tt]=2===t.length?e.parseTwoDigitYear(t):g(t)}),L(\"YY\",function(t,n){n[Tt]=e.parseTwoDigitYear(t)}),L(\"Y\",function(e,t){t[Tt]=parseInt(e,10)}),e.parseTwoDigitYear=function(e){return g(e)+(g(e)>68?1900:2e3)};var Ut,Lt=I(\"FullYear\",!0);Ut=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;t<this.length;++t)if(this[t]===e)return t;return-1},P(\"M\",[\"MM\",2],\"Mo\",function(){return this.month()+1}),P(\"MMM\",0,0,function(e){return this.localeData().monthsShort(this,e)}),P(\"MMMM\",0,0,function(e){return this.localeData().months(this,e)}),Y(\"month\",\"M\"),x(\"month\",8),C(\"M\",mt),C(\"MM\",mt,dt),C(\"MMM\",function(e,t){return t.monthsShortRegex(e)}),C(\"MMMM\",function(e,t){return t.monthsRegex(e)}),L([\"M\",\"MM\"],function(e,t){t[xt]=g(e)-1}),L([\"MMM\",\"MMMM\"],function(e,t,n,s){var i=n._locale.monthsParse(e,s,n._strict);null!=i?t[xt]=i:d(n).invalidMonth=e});var Nt=/D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/,Gt=\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),Vt=\"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec\".split(\"_\"),Et=kt,It=kt;P(\"w\",[\"ww\",2],\"wo\",\"week\"),P(\"W\",[\"WW\",2],\"Wo\",\"isoWeek\"),Y(\"week\",\"w\"),Y(\"isoWeek\",\"W\"),x(\"week\",5),x(\"isoWeek\",5),C(\"w\",mt),C(\"ww\",mt,dt),C(\"W\",mt),C(\"WW\",mt,dt),N([\"w\",\"ww\",\"W\",\"WW\"],function(e,t,n,s){t[s.substr(0,1)]=g(e)});P(\"d\",0,\"do\",\"day\"),P(\"dd\",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),P(\"ddd\",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),P(\"dddd\",0,0,function(e){return this.localeData().weekdays(this,e)}),P(\"e\",0,0,\"weekday\"),P(\"E\",0,0,\"isoWeekday\"),Y(\"day\",\"d\"),Y(\"weekday\",\"e\"),Y(\"isoWeekday\",\"E\"),x(\"day\",11),x(\"weekday\",11),x(\"isoWeekday\",11),C(\"d\",mt),C(\"e\",mt),C(\"E\",mt),C(\"dd\",function(e,t){return t.weekdaysMinRegex(e)}),C(\"ddd\",function(e,t){return t.weekdaysShortRegex(e)}),C(\"dddd\",function(e,t){return t.weekdaysRegex(e)}),N([\"dd\",\"ddd\",\"dddd\"],function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:d(n).invalidWeekday=e}),N([\"d\",\"e\",\"E\"],function(e,t,n,s){t[s]=g(e)});var At=\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),jt=\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\".split(\"_\"),Zt=\"Su_Mo_Tu_We_Th_Fr_Sa\".split(\"_\"),zt=kt,$t=kt,qt=kt;P(\"H\",[\"HH\",2],0,\"hour\"),P(\"h\",[\"hh\",2],0,te),P(\"k\",[\"kk\",2],0,function(){return this.hours()||24}),P(\"hmm\",0,0,function(){return\"\"+te.apply(this)+b(this.minutes(),2)}),P(\"hmmss\",0,0,function(){return\"\"+te.apply(this)+b(this.minutes(),2)+b(this.seconds(),2)}),P(\"Hmm\",0,0,function(){return\"\"+this.hours()+b(this.minutes(),2)}),P(\"Hmmss\",0,0,function(){return\"\"+this.hours()+b(this.minutes(),2)+b(this.seconds(),2)}),ne(\"a\",!0),ne(\"A\",!1),Y(\"hour\",\"h\"),x(\"hour\",13),C(\"a\",se),C(\"A\",se),C(\"H\",mt),C(\"h\",mt),C(\"k\",mt),C(\"HH\",mt,dt),C(\"hh\",mt,dt),C(\"kk\",mt,dt),C(\"hmm\",_t),C(\"hmmss\",yt),C(\"Hmm\",_t),C(\"Hmmss\",yt),L([\"H\",\"HH\"],Pt),L([\"k\",\"kk\"],function(e,t,n){var s=g(e);t[Pt]=24===s?0:s}),L([\"a\",\"A\"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),L([\"h\",\"hh\"],function(e,t,n){t[Pt]=g(e),d(n).bigHour=!0}),L(\"hmm\",function(e,t,n){var s=e.length-2;t[Pt]=g(e.substr(0,s)),t[Wt]=g(e.substr(s)),d(n).bigHour=!0}),L(\"hmmss\",function(e,t,n){var s=e.length-4,i=e.length-2;t[Pt]=g(e.substr(0,s)),t[Wt]=g(e.substr(s,2)),t[Ht]=g(e.substr(i)),d(n).bigHour=!0}),L(\"Hmm\",function(e,t,n){var s=e.length-2;t[Pt]=g(e.substr(0,s)),t[Wt]=g(e.substr(s))}),L(\"Hmmss\",function(e,t,n){var s=e.length-4,i=e.length-2;t[Pt]=g(e.substr(0,s)),t[Wt]=g(e.substr(s,2)),t[Ht]=g(e.substr(i))});var Jt,Bt=I(\"Hours\",!0),Qt={calendar:{sameDay:\"[Today at] LT\",nextDay:\"[Tomorrow at] LT\",nextWeek:\"dddd [at] LT\",lastDay:\"[Yesterday at] LT\",lastWeek:\"[Last] dddd [at] LT\",sameElse:\"L\"},longDateFormat:{LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},invalidDate:\"Invalid date\",ordinal:\"%d\",dayOfMonthOrdinalParse:/\\d{1,2}/,relativeTime:{future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",ss:\"%d seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"},months:Gt,monthsShort:Vt,week:{dow:0,doy:6},weekdays:At,weekdaysMin:Zt,weekdaysShort:jt,meridiemParse:/[ap]\\.?m?\\.?/i},Xt={},Kt={},en=/^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,tn=/^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,nn=/Z|[+-]\\d\\d(?::?\\d\\d)?/,sn=[[\"YYYYYY-MM-DD\",/[+-]\\d{6}-\\d\\d-\\d\\d/],[\"YYYY-MM-DD\",/\\d{4}-\\d\\d-\\d\\d/],[\"GGGG-[W]WW-E\",/\\d{4}-W\\d\\d-\\d/],[\"GGGG-[W]WW\",/\\d{4}-W\\d\\d/,!1],[\"YYYY-DDD\",/\\d{4}-\\d{3}/],[\"YYYY-MM\",/\\d{4}-\\d\\d/,!1],[\"YYYYYYMMDD\",/[+-]\\d{10}/],[\"YYYYMMDD\",/\\d{8}/],[\"GGGG[W]WWE\",/\\d{4}W\\d{3}/],[\"GGGG[W]WW\",/\\d{4}W\\d{2}/,!1],[\"YYYYDDD\",/\\d{7}/]],rn=[[\"HH:mm:ss.SSSS\",/\\d\\d:\\d\\d:\\d\\d\\.\\d+/],[\"HH:mm:ss,SSSS\",/\\d\\d:\\d\\d:\\d\\d,\\d+/],[\"HH:mm:ss\",/\\d\\d:\\d\\d:\\d\\d/],[\"HH:mm\",/\\d\\d:\\d\\d/],[\"HHmmss.SSSS\",/\\d\\d\\d\\d\\d\\d\\.\\d+/],[\"HHmmss,SSSS\",/\\d\\d\\d\\d\\d\\d,\\d+/],[\"HHmmss\",/\\d\\d\\d\\d\\d\\d/],[\"HHmm\",/\\d\\d\\d\\d/],[\"HH\",/\\d\\d/]],an=/^\\/?Date\\((\\-?\\d+)/i,on=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/,un={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};e.createFromInputFallback=v(\"value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.\",function(e){e._d=new Date(e._i+(e._useUTC?\" UTC\":\"\"))}),e.ISO_8601=function(){},e.RFC_2822=function(){};var ln=v(\"moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/\",function(){var e=pe.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:c()}),dn=v(\"moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/\",function(){var e=pe.apply(null,arguments);return this.isValid()&&e.isValid()?e>this?this:e:c()}),hn=[\"year\",\"quarter\",\"month\",\"week\",\"day\",\"hour\",\"minute\",\"second\",\"millisecond\"];De(\"Z\",\":\"),De(\"ZZ\",\"\"),C(\"Z\",Dt),C(\"ZZ\",Dt),L([\"Z\",\"ZZ\"],function(e,t,n){n._useUTC=!0,n._tzm=ke(Dt,e)});var cn=/([\\+\\-]|\\d\\d)/gi;e.updateOffset=function(){};var fn=/^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/,mn=/^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;xe.fn=ve.prototype,xe.invalid=function(){return xe(NaN)};var _n=We(1,\"add\"),yn=We(-1,\"subtract\");e.defaultFormat=\"YYYY-MM-DDTHH:mm:ssZ\",e.defaultFormatUtc=\"YYYY-MM-DDTHH:mm:ss[Z]\";var gn=v(\"moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.\",function(e){return void 0===e?this.localeData():this.locale(e)});P(0,[\"gg\",2],0,function(){return this.weekYear()%100}),P(0,[\"GG\",2],0,function(){return this.isoWeekYear()%100}),Ue(\"gggg\",\"weekYear\"),Ue(\"ggggg\",\"weekYear\"),Ue(\"GGGG\",\"isoWeekYear\"),Ue(\"GGGGG\",\"isoWeekYear\"),Y(\"weekYear\",\"gg\"),Y(\"isoWeekYear\",\"GG\"),x(\"weekYear\",1),x(\"isoWeekYear\",1),C(\"G\",Mt),C(\"g\",Mt),C(\"GG\",mt,dt),C(\"gg\",mt,dt),C(\"GGGG\",pt,ct),C(\"gggg\",pt,ct),C(\"GGGGG\",wt,ft),C(\"ggggg\",wt,ft),N([\"gggg\",\"ggggg\",\"GGGG\",\"GGGGG\"],function(e,t,n,s){t[s.substr(0,2)]=g(e)}),N([\"gg\",\"GG\"],function(t,n,s,i){n[i]=e.parseTwoDigitYear(t)}),P(\"Q\",0,\"Qo\",\"quarter\"),Y(\"quarter\",\"Q\"),x(\"quarter\",7),C(\"Q\",lt),L(\"Q\",function(e,t){t[xt]=3*(g(e)-1)}),P(\"D\",[\"DD\",2],\"Do\",\"date\"),Y(\"date\",\"D\"),x(\"date\",9),C(\"D\",mt),C(\"DD\",mt,dt),C(\"Do\",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),L([\"D\",\"DD\"],bt),L(\"Do\",function(e,t){t[bt]=g(e.match(mt)[0])});var pn=I(\"Date\",!0);P(\"DDD\",[\"DDDD\",3],\"DDDo\",\"dayOfYear\"),Y(\"dayOfYear\",\"DDD\"),x(\"dayOfYear\",4),C(\"DDD\",gt),C(\"DDDD\",ht),L([\"DDD\",\"DDDD\"],function(e,t,n){n._dayOfYear=g(e)}),P(\"m\",[\"mm\",2],0,\"minute\"),Y(\"minute\",\"m\"),x(\"minute\",14),C(\"m\",mt),C(\"mm\",mt,dt),L([\"m\",\"mm\"],Wt);var wn=I(\"Minutes\",!1);P(\"s\",[\"ss\",2],0,\"second\"),Y(\"second\",\"s\"),x(\"second\",15),C(\"s\",mt),C(\"ss\",mt,dt),L([\"s\",\"ss\"],Ht);var vn=I(\"Seconds\",!1);P(\"S\",0,0,function(){return~~(this.millisecond()/100)}),P(0,[\"SS\",2],0,function(){return~~(this.millisecond()/10)}),P(0,[\"SSS\",3],0,\"millisecond\"),P(0,[\"SSSS\",4],0,function(){return 10*this.millisecond()}),P(0,[\"SSSSS\",5],0,function(){return 100*this.millisecond()}),P(0,[\"SSSSSS\",6],0,function(){return 1e3*this.millisecond()}),P(0,[\"SSSSSSS\",7],0,function(){return 1e4*this.millisecond()}),P(0,[\"SSSSSSSS\",8],0,function(){return 1e5*this.millisecond()}),P(0,[\"SSSSSSSSS\",9],0,function(){return 1e6*this.millisecond()}),Y(\"millisecond\",\"ms\"),x(\"millisecond\",16),C(\"S\",gt,lt),C(\"SS\",gt,dt),C(\"SSS\",gt,ht);var Mn;for(Mn=\"SSSS\";Mn.length<=9;Mn+=\"S\")C(Mn,vt);for(Mn=\"S\";Mn.length<=9;Mn+=\"S\")L(Mn,Ne);var Sn=I(\"Milliseconds\",!1);P(\"z\",0,0,\"zoneAbbr\"),P(\"zz\",0,0,\"zoneName\");var Dn=m.prototype;Dn.add=_n,Dn.calendar=function(t,n){var s=t||pe(),i=Ye(s,this).startOf(\"day\"),r=e.calendarFormat(this,i)||\"sameElse\",a=n&&(S(n[r])?n[r].call(this,s):n[r]);return this.format(a||this.localeData().calendar(r,this,pe(s)))},Dn.clone=function(){return new m(this)},Dn.diff=function(e,t,n){var s,i,r;if(!this.isValid())return NaN;if(!(s=Ye(e,this)).isValid())return NaN;switch(i=6e4*(s.utcOffset()-this.utcOffset()),t=O(t)){case\"year\":r=Re(this,s)/12;break;case\"month\":r=Re(this,s);break;case\"quarter\":r=Re(this,s)/3;break;case\"second\":r=(this-s)/1e3;break;case\"minute\":r=(this-s)/6e4;break;case\"hour\":r=(this-s)/36e5;break;case\"day\":r=(this-s-i)/864e5;break;case\"week\":r=(this-s-i)/6048e5;break;default:r=this-s}return n?r:y(r)},Dn.endOf=function(e){return void 0===(e=O(e))||\"millisecond\"===e?this:(\"date\"===e&&(e=\"day\"),this.startOf(e).add(1,\"isoWeek\"===e?\"week\":e).subtract(1,\"ms\"))},Dn.format=function(t){t||(t=this.isUtc()?e.defaultFormatUtc:e.defaultFormat);var n=H(this,t);return this.localeData().postformat(n)},Dn.from=function(e,t){return this.isValid()&&(_(e)&&e.isValid()||pe(e).isValid())?xe({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},Dn.fromNow=function(e){return this.from(pe(),e)},Dn.to=function(e,t){return this.isValid()&&(_(e)&&e.isValid()||pe(e).isValid())?xe({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},Dn.toNow=function(e){return this.to(pe(),e)},Dn.get=function(e){return e=O(e),S(this[e])?this[e]():this},Dn.invalidAt=function(){return d(this).overflow},Dn.isAfter=function(e,t){var n=_(e)?e:pe(e);return!(!this.isValid()||!n.isValid())&&(\"millisecond\"===(t=O(s(t)?\"millisecond\":t))?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(t).valueOf())},Dn.isBefore=function(e,t){var n=_(e)?e:pe(e);return!(!this.isValid()||!n.isValid())&&(\"millisecond\"===(t=O(s(t)?\"millisecond\":t))?this.valueOf()<n.valueOf():this.clone().endOf(t).valueOf()<n.valueOf())},Dn.isBetween=function(e,t,n,s){return(\"(\"===(s=s||\"()\")[0]?this.isAfter(e,n):!this.isBefore(e,n))&&(\")\"===s[1]?this.isBefore(t,n):!this.isAfter(t,n))},Dn.isSame=function(e,t){var n,s=_(e)?e:pe(e);return!(!this.isValid()||!s.isValid())&&(\"millisecond\"===(t=O(t||\"millisecond\"))?this.valueOf()===s.valueOf():(n=s.valueOf(),this.clone().startOf(t).valueOf()<=n&&n<=this.clone().endOf(t).valueOf()))},Dn.isSameOrAfter=function(e,t){return this.isSame(e,t)||this.isAfter(e,t)},Dn.isSameOrBefore=function(e,t){return this.isSame(e,t)||this.isBefore(e,t)},Dn.isValid=function(){return h(this)},Dn.lang=gn,Dn.locale=Ce,Dn.localeData=Fe,Dn.max=dn,Dn.min=ln,Dn.parsingFlags=function(){return u({},d(this))},Dn.set=function(e,t){if(\"object\"==typeof e)for(var n=function(e){var t=[];for(var n in e)t.push({unit:n,priority:it[n]});return t.sort(function(e,t){return e.priority-t.priority}),t}(e=T(e)),s=0;s<n.length;s++)this[n[s].unit](e[n[s].unit]);else if(e=O(e),S(this[e]))return this[e](t);return this},Dn.startOf=function(e){switch(e=O(e)){case\"year\":this.month(0);case\"quarter\":case\"month\":this.date(1);case\"week\":case\"isoWeek\":case\"day\":case\"date\":this.hours(0);case\"hour\":this.minutes(0);case\"minute\":this.seconds(0);case\"second\":this.milliseconds(0)}return\"week\"===e&&this.weekday(0),\"isoWeek\"===e&&this.isoWeekday(1),\"quarter\"===e&&this.month(3*Math.floor(this.month()/3)),this},Dn.subtract=yn,Dn.toArray=function(){return[this.year(),this.month(),this.date(),this.hour(),this.minute(),this.second(),this.millisecond()]},Dn.toObject=function(){return{years:this.year(),months:this.month(),date:this.date(),hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()}},Dn.toDate=function(){return new Date(this.valueOf())},Dn.toISOString=function(e){if(!this.isValid())return null;var t=!0!==e,n=t?this.clone().utc():this;return n.year()<0||n.year()>9999?H(n,t?\"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]\":\"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ\"):S(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this._d.valueOf()).toISOString().replace(\"Z\",H(n,\"Z\")):H(n,t?\"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]\":\"YYYY-MM-DD[T]HH:mm:ss.SSSZ\")},Dn.inspect=function(){if(!this.isValid())return\"moment.invalid(/* \"+this._i+\" */)\";var e=\"moment\",t=\"\";this.isLocal()||(e=0===this.utcOffset()?\"moment.utc\":\"moment.parseZone\",t=\"Z\");var n=\"[\"+e+'(\"]',s=0<=this.year()&&this.year()<=9999?\"YYYY\":\"YYYYYY\",i=t+'[\")]';return this.format(n+s+\"-MM-DD[T]HH:mm:ss.SSS\"+i)},Dn.toJSON=function(){return this.isValid()?this.toISOString():null},Dn.toString=function(){return this.clone().locale(\"en\").format(\"ddd MMM DD YYYY HH:mm:ss [GMT]ZZ\")},Dn.unix=function(){return Math.floor(this.valueOf()/1e3)},Dn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},Dn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},Dn.year=Lt,Dn.isLeapYear=function(){return E(this.year())},Dn.weekYear=function(e){return Le.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},Dn.isoWeekYear=function(e){return Le.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},Dn.quarter=Dn.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},Dn.month=$,Dn.daysInMonth=function(){return Z(this.year(),this.month())},Dn.week=Dn.weeks=function(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),\"d\")},Dn.isoWeek=Dn.isoWeeks=function(e){var t=X(this,1,4).week;return null==e?t:this.add(7*(e-t),\"d\")},Dn.weeksInYear=function(){var e=this.localeData()._week;return K(this.year(),e.dow,e.doy)},Dn.isoWeeksInYear=function(){return K(this.year(),1,4)},Dn.date=pn,Dn.day=Dn.days=function(e){if(!this.isValid())return null!=e?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(e=function(e,t){return\"string\"!=typeof e?e:isNaN(e)?\"number\"==typeof(e=t.weekdaysParse(e))?e:null:parseInt(e,10)}(e,this.localeData()),this.add(e-t,\"d\")):t},Dn.weekday=function(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,\"d\")},Dn.isoWeekday=function(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){var t=function(e,t){return\"string\"==typeof e?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}(e,this.localeData());return this.day(this.day()%7?t:t-7)}return this.day()||7},Dn.dayOfYear=function(e){var t=Math.round((this.clone().startOf(\"day\")-this.clone().startOf(\"year\"))/864e5)+1;return null==e?t:this.add(e-t,\"d\")},Dn.hour=Dn.hours=Bt,Dn.minute=Dn.minutes=wn,Dn.second=Dn.seconds=vn,Dn.millisecond=Dn.milliseconds=Sn,Dn.utcOffset=function(t,n,s){var i,r=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if(\"string\"==typeof t){if(null===(t=ke(Dt,t)))return this}else Math.abs(t)<16&&!s&&(t*=60);return!this._isUTC&&n&&(i=Oe(this)),this._offset=t,this._isUTC=!0,null!=i&&this.add(i,\"m\"),r!==t&&(!n||this._changeInProgress?He(this,xe(t-r,\"m\"),1,!1):this._changeInProgress||(this._changeInProgress=!0,e.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:Oe(this)},Dn.utc=function(e){return this.utcOffset(0,e)},Dn.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(Oe(this),\"m\")),this},Dn.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if(\"string\"==typeof this._i){var e=ke(St,this._i);null!=e?this.utcOffset(e):this.utcOffset(0,!0)}return this},Dn.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?pe(e).utcOffset():0,(this.utcOffset()-e)%60==0)},Dn.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},Dn.isLocal=function(){return!!this.isValid()&&!this._isUTC},Dn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},Dn.isUtc=Te,Dn.isUTC=Te,Dn.zoneAbbr=function(){return this._isUTC?\"UTC\":\"\"},Dn.zoneName=function(){return this._isUTC?\"Coordinated Universal Time\":\"\"},Dn.dates=v(\"dates accessor is deprecated. Use date instead.\",pn),Dn.months=v(\"months accessor is deprecated. Use month instead\",$),Dn.years=v(\"years accessor is deprecated. Use year instead\",Lt),Dn.zone=v(\"moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/\",function(e,t){return null!=e?(\"string\"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),Dn.isDSTShifted=v(\"isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information\",function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var e={};if(f(e,this),(e=ye(e))._a){var t=e._isUTC?l(e._a):pe(e._a);this._isDSTShifted=this.isValid()&&p(e._a,t.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var kn=k.prototype;kn.calendar=function(e,t,n){var s=this._calendar[e]||this._calendar.sameElse;return S(s)?s.call(t,n):s},kn.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.replace(/MMMM|MM|DD|dddd/g,function(e){return e.slice(1)}),this._longDateFormat[e])},kn.invalidDate=function(){return this._invalidDate},kn.ordinal=function(e){return this._ordinal.replace(\"%d\",e)},kn.preparse=Ge,kn.postformat=Ge,kn.relativeTime=function(e,t,n,s){var i=this._relativeTime[n];return S(i)?i(e,t,n,s):i.replace(/%d/i,e)},kn.pastFuture=function(e,t){var n=this._relativeTime[e>0?\"future\":\"past\"];return S(n)?n(t):n.replace(/%s/i,t)},kn.set=function(e){var t,n;for(n in e)S(t=e[n])?this[n]=t:this[\"_\"+n]=t;this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+\"|\"+/\\d{1,2}/.source)},kn.months=function(e,n){return e?t(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||Nt).test(n)?\"format\":\"standalone\"][e.month()]:t(this._months)?this._months:this._months.standalone},kn.monthsShort=function(e,n){return e?t(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[Nt.test(n)?\"format\":\"standalone\"][e.month()]:t(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},kn.monthsParse=function(e,t,n){var s,i,r;if(this._monthsParseExact)return function(e,t,n){var s,i,r,a=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],s=0;s<12;++s)r=l([2e3,s]),this._shortMonthsParse[s]=this.monthsShort(r,\"\").toLocaleLowerCase(),this._longMonthsParse[s]=this.months(r,\"\").toLocaleLowerCase();return n?\"MMM\"===t?-1!==(i=Ut.call(this._shortMonthsParse,a))?i:null:-1!==(i=Ut.call(this._longMonthsParse,a))?i:null:\"MMM\"===t?-1!==(i=Ut.call(this._shortMonthsParse,a))?i:-1!==(i=Ut.call(this._longMonthsParse,a))?i:null:-1!==(i=Ut.call(this._longMonthsParse,a))?i:-1!==(i=Ut.call(this._shortMonthsParse,a))?i:null}.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(i=l([2e3,s]),n&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp(\"^\"+this.months(i,\"\").replace(\".\",\"\")+\"$\",\"i\"),this._shortMonthsParse[s]=new RegExp(\"^\"+this.monthsShort(i,\"\").replace(\".\",\"\")+\"$\",\"i\")),n||this._monthsParse[s]||(r=\"^\"+this.months(i,\"\")+\"|^\"+this.monthsShort(i,\"\"),this._monthsParse[s]=new RegExp(r.replace(\".\",\"\"),\"i\")),n&&\"MMMM\"===t&&this._longMonthsParse[s].test(e))return s;if(n&&\"MMM\"===t&&this._shortMonthsParse[s].test(e))return s;if(!n&&this._monthsParse[s].test(e))return s}},kn.monthsRegex=function(e){return this._monthsParseExact?(o(this,\"_monthsRegex\")||q.call(this),e?this._monthsStrictRegex:this._monthsRegex):(o(this,\"_monthsRegex\")||(this._monthsRegex=It),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},kn.monthsShortRegex=function(e){return this._monthsParseExact?(o(this,\"_monthsRegex\")||q.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(o(this,\"_monthsShortRegex\")||(this._monthsShortRegex=Et),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},kn.week=function(e){return X(e,this._week.dow,this._week.doy).week},kn.firstDayOfYear=function(){return this._week.doy},kn.firstDayOfWeek=function(){return this._week.dow},kn.weekdays=function(e,n){return e?t(this._weekdays)?this._weekdays[e.day()]:this._weekdays[this._weekdays.isFormat.test(n)?\"format\":\"standalone\"][e.day()]:t(this._weekdays)?this._weekdays:this._weekdays.standalone},kn.weekdaysMin=function(e){return e?this._weekdaysMin[e.day()]:this._weekdaysMin},kn.weekdaysShort=function(e){return e?this._weekdaysShort[e.day()]:this._weekdaysShort},kn.weekdaysParse=function(e,t,n){var s,i,r;if(this._weekdaysParseExact)return function(e,t,n){var s,i,r,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)r=l([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(r,\"\").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(r,\"\").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(r,\"\").toLocaleLowerCase();return n?\"dddd\"===t?-1!==(i=Ut.call(this._weekdaysParse,a))?i:null:\"ddd\"===t?-1!==(i=Ut.call(this._shortWeekdaysParse,a))?i:null:-1!==(i=Ut.call(this._minWeekdaysParse,a))?i:null:\"dddd\"===t?-1!==(i=Ut.call(this._weekdaysParse,a))?i:-1!==(i=Ut.call(this._shortWeekdaysParse,a))?i:-1!==(i=Ut.call(this._minWeekdaysParse,a))?i:null:\"ddd\"===t?-1!==(i=Ut.call(this._shortWeekdaysParse,a))?i:-1!==(i=Ut.call(this._weekdaysParse,a))?i:-1!==(i=Ut.call(this._minWeekdaysParse,a))?i:null:-1!==(i=Ut.call(this._minWeekdaysParse,a))?i:-1!==(i=Ut.call(this._weekdaysParse,a))?i:-1!==(i=Ut.call(this._shortWeekdaysParse,a))?i:null}.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(i=l([2e3,1]).day(s),n&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp(\"^\"+this.weekdays(i,\"\").replace(\".\",\".?\")+\"$\",\"i\"),this._shortWeekdaysParse[s]=new RegExp(\"^\"+this.weekdaysShort(i,\"\").replace(\".\",\".?\")+\"$\",\"i\"),this._minWeekdaysParse[s]=new RegExp(\"^\"+this.weekdaysMin(i,\"\").replace(\".\",\".?\")+\"$\",\"i\")),this._weekdaysParse[s]||(r=\"^\"+this.weekdays(i,\"\")+\"|^\"+this.weekdaysShort(i,\"\")+\"|^\"+this.weekdaysMin(i,\"\"),this._weekdaysParse[s]=new RegExp(r.replace(\".\",\"\"),\"i\")),n&&\"dddd\"===t&&this._fullWeekdaysParse[s].test(e))return s;if(n&&\"ddd\"===t&&this._shortWeekdaysParse[s].test(e))return s;if(n&&\"dd\"===t&&this._minWeekdaysParse[s].test(e))return s;if(!n&&this._weekdaysParse[s].test(e))return s}},kn.weekdaysRegex=function(e){return this._weekdaysParseExact?(o(this,\"_weekdaysRegex\")||ee.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(o(this,\"_weekdaysRegex\")||(this._weekdaysRegex=zt),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},kn.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(o(this,\"_weekdaysRegex\")||ee.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(o(this,\"_weekdaysShortRegex\")||(this._weekdaysShortRegex=$t),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},kn.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(o(this,\"_weekdaysRegex\")||ee.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(o(this,\"_weekdaysMinRegex\")||(this._weekdaysMinRegex=qt),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},kn.isPM=function(e){return\"p\"===(e+\"\").toLowerCase().charAt(0)},kn.meridiem=function(e,t,n){return e>11?n?\"pm\":\"PM\":n?\"am\":\"AM\"},ae(\"en\",{dayOfMonthOrdinalParse:/\\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===g(e%100/10)?\"th\":1===t?\"st\":2===t?\"nd\":3===t?\"rd\":\"th\")}}),e.lang=v(\"moment.lang is deprecated. Use moment.locale instead.\",ae),e.langData=v(\"moment.langData is deprecated. Use moment.localeData instead.\",ue);var Yn=Math.abs,On=$e(\"ms\"),Tn=$e(\"s\"),xn=$e(\"m\"),bn=$e(\"h\"),Pn=$e(\"d\"),Wn=$e(\"w\"),Hn=$e(\"M\"),Rn=$e(\"y\"),Cn=qe(\"milliseconds\"),Fn=qe(\"seconds\"),Un=qe(\"minutes\"),Ln=qe(\"hours\"),Nn=qe(\"days\"),Gn=qe(\"months\"),Vn=qe(\"years\"),En=Math.round,In={ss:44,s:45,m:45,h:22,d:26,M:11},An=Math.abs,jn=ve.prototype;return jn.isValid=function(){return this._isValid},jn.abs=function(){var e=this._data;return this._milliseconds=Yn(this._milliseconds),this._days=Yn(this._days),this._months=Yn(this._months),e.milliseconds=Yn(e.milliseconds),e.seconds=Yn(e.seconds),e.minutes=Yn(e.minutes),e.hours=Yn(e.hours),e.months=Yn(e.months),e.years=Yn(e.years),this},jn.add=function(e,t){return Ae(this,e,t,1)},jn.subtract=function(e,t){return Ae(this,e,t,-1)},jn.as=function(e){if(!this.isValid())return NaN;var t,n,s=this._milliseconds;if(\"month\"===(e=O(e))||\"year\"===e)return t=this._days+s/864e5,n=this._months+Ze(t),\"month\"===e?n:n/12;switch(t=this._days+Math.round(ze(this._months)),e){case\"week\":return t/7+s/6048e5;case\"day\":return t+s/864e5;case\"hour\":return 24*t+s/36e5;case\"minute\":return 1440*t+s/6e4;case\"second\":return 86400*t+s/1e3;case\"millisecond\":return Math.floor(864e5*t)+s;default:throw new Error(\"Unknown unit \"+e)}},jn.asMilliseconds=On,jn.asSeconds=Tn,jn.asMinutes=xn,jn.asHours=bn,jn.asDays=Pn,jn.asWeeks=Wn,jn.asMonths=Hn,jn.asYears=Rn,jn.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*g(this._months/12):NaN},jn._bubble=function(){var e,t,n,s,i,r=this._milliseconds,a=this._days,o=this._months,u=this._data;return r>=0&&a>=0&&o>=0||r<=0&&a<=0&&o<=0||(r+=864e5*je(ze(o)+a),a=0,o=0),u.milliseconds=r%1e3,e=y(r/1e3),u.seconds=e%60,t=y(e/60),u.minutes=t%60,n=y(t/60),u.hours=n%24,a+=y(n/24),i=y(Ze(a)),o+=i,a-=je(ze(i)),s=y(o/12),o%=12,u.days=a,u.months=o,u.years=s,this},jn.clone=function(){return xe(this)},jn.get=function(e){return e=O(e),this.isValid()?this[e+\"s\"]():NaN},jn.milliseconds=Cn,jn.seconds=Fn,jn.minutes=Un,jn.hours=Ln,jn.days=Nn,jn.weeks=function(){return y(this.days()/7)},jn.months=Gn,jn.years=Vn,jn.humanize=function(e){if(!this.isValid())return this.localeData().invalidDate();var t=this.localeData(),n=function(e,t,n){var s=xe(e).abs(),i=En(s.as(\"s\")),r=En(s.as(\"m\")),a=En(s.as(\"h\")),o=En(s.as(\"d\")),u=En(s.as(\"M\")),l=En(s.as(\"y\")),d=i<=In.ss&&[\"s\",i]||i<In.s&&[\"ss\",i]||r<=1&&[\"m\"]||r<In.m&&[\"mm\",r]||a<=1&&[\"h\"]||a<In.h&&[\"hh\",a]||o<=1&&[\"d\"]||o<In.d&&[\"dd\",o]||u<=1&&[\"M\"]||u<In.M&&[\"MM\",u]||l<=1&&[\"y\"]||[\"yy\",l];return d[2]=t,d[3]=+e>0,d[4]=n,function(e,t,n,s,i){return i.relativeTime(t||1,!!n,e,s)}.apply(null,d)}(this,!e,t);return e&&(n=t.pastFuture(+this,n)),t.postformat(n)},jn.toISOString=Be,jn.toString=Be,jn.toJSON=Be,jn.locale=Ce,jn.localeData=Fe,jn.toIsoString=v(\"toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)\",Be),jn.lang=gn,P(\"X\",0,0,\"unix\"),P(\"x\",0,0,\"valueOf\"),C(\"x\",Mt),C(\"X\",/[+-]?\\d+(\\.\\d{1,3})?/),L(\"X\",function(e,t,n){n._d=new Date(1e3*parseFloat(e,10))}),L(\"x\",function(e,t,n){n._d=new Date(g(e))}),e.version=\"2.20.1\",function(e){Qe=e}(pe),e.fn=Dn,e.min=function(){return we(\"isBefore\",[].slice.call(arguments,0))},e.max=function(){return we(\"isAfter\",[].slice.call(arguments,0))},e.now=function(){return Date.now?Date.now():+new Date},e.utc=l,e.unix=function(e){return pe(1e3*e)},e.months=function(e,t){return Ee(e,t,\"months\")},e.isDate=r,e.locale=ae,e.invalid=c,e.duration=xe,e.isMoment=_,e.weekdays=function(e,t,n){return Ie(e,t,n,\"weekdays\")},e.parseZone=function(){return pe.apply(null,arguments).parseZone()},e.localeData=ue,e.isDuration=Me,e.monthsShort=function(e,t){return Ee(e,t,\"monthsShort\")},e.weekdaysMin=function(e,t,n){return Ie(e,t,n,\"weekdaysMin\")},e.defineLocale=oe,e.updateLocale=function(e,t){if(null!=t){var n,s,i=Qt;null!=(s=re(e))&&(i=s._config),(n=new k(t=D(i,t))).parentLocale=Xt[e],Xt[e]=n,ae(e)}else null!=Xt[e]&&(null!=Xt[e].parentLocale?Xt[e]=Xt[e].parentLocale:null!=Xt[e]&&delete Xt[e]);return Xt[e]},e.locales=function(){return nt(Xt)},e.weekdaysShort=function(e,t,n){return Ie(e,t,n,\"weekdaysShort\")},e.normalizeUnits=O,e.relativeTimeRounding=function(e){return void 0===e?En:\"function\"==typeof e&&(En=e,!0)},e.relativeTimeThreshold=function(e,t){return void 0!==In[e]&&(void 0===t?In[e]:(In[e]=t,\"s\"===e&&(In.ss=t-1),!0))},e.calendarFormat=function(e,t){var n=e.diff(t,\"days\",!0);return n<-6?\"sameElse\":n<-1?\"lastWeek\":n<0?\"lastDay\":n<1?\"sameDay\":n<2?\"nextDay\":n<7?\"nextWeek\":\"sameElse\"},e.prototype=Dn,e.HTML5_FMT={DATETIME_LOCAL:\"YYYY-MM-DDTHH:mm\",DATETIME_LOCAL_SECONDS:\"YYYY-MM-DDTHH:mm:ss\",DATETIME_LOCAL_MS:\"YYYY-MM-DDTHH:mm:ss.SSS\",DATE:\"YYYY-MM-DD\",TIME:\"HH:mm\",TIME_SECONDS:\"HH:mm:ss\",TIME_MS:\"HH:mm:ss.SSS\",WEEK:\"YYYY-[W]WW\",MONTH:\"YYYY-MM\"},e});\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL21vbWVudC9taW4vbW9tZW50Lm1pbi5qcz9lNmQ3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUFlLHNGQUFxSSxpQkFBaUIsYUFBYSxhQUFhLGdDQUFnQyxjQUFjLGdGQUFnRixjQUFjLHNFQUFzRSxjQUFjLGtCQUFrQixjQUFjLGdGQUFnRixjQUFjLDhFQUE4RSxnQkFBZ0IsV0FBVyxRQUFRLFdBQVcsc0JBQXNCLFNBQVMsZ0JBQWdCLGlEQUFpRCxnQkFBZ0IsbUNBQW1DLHdGQUF3RixvQkFBb0IsNEJBQTRCLGNBQWMsNEJBQTRCLDZNQUE2TSxRQUFRLGNBQWMscUJBQXFCLG1EQUFtRCxlQUFlLDZMQUE2TCwySUFBMkksYUFBYSxrQkFBa0IsY0FBYyxhQUFhLG1EQUFtRCxnQkFBZ0IsVUFBVSxvVkFBb1YsWUFBWSw4QkFBOEIsU0FBUyxjQUFjLDhJQUE4SSxjQUFjLHlEQUF5RCxjQUFjLHlDQUF5QyxjQUFjLGFBQWEsc0NBQXNDLGtCQUFrQixzRUFBc0UsUUFBUSxJQUFJLGlEQUFpRCxXQUFXLGNBQWMsdUhBQXVILGdCQUFnQixTQUFTLG9CQUFvQiwrREFBK0QsbUJBQW1CLG1CQUFtQixLQUFLLHVDQUF1QyxnQkFBZ0IseURBQXlELGdCQUFnQixvQkFBb0IsVUFBVSx3RkFBd0YsK0JBQStCLElBQUksZ0JBQWdCLDZFQUE2RSxjQUFjLHNGQUFzRixnQkFBZ0IsWUFBWSxJQUFJLDZDQUE2Qyw4REFBOEQsK0NBQStDLFFBQVEsU0FBUyxjQUFjLHFCQUFxQixnQkFBZ0Isc0JBQXNCLHdCQUF3QixjQUFjLDJEQUEyRCxjQUFjLGFBQWEseUNBQXlDLFNBQVMsZ0JBQWdCLFFBQVEsa0JBQWtCLGtDQUFrQyw0RUFBNEUsb0JBQW9CLFFBQVEsa0NBQWtDLGlCQUFpQix1Q0FBdUMsNENBQTRDLHVCQUF1Qiw0REFBNEQsRUFBRSxjQUFjLHdFQUF3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OGlCLDhEQUE4RCwyREFBMkQsZ0RBQWdELDhCQUE4QiwwUEFBMFAsbUNBQW1DLDZSQUE2UixpQ0FBaUMsK1FBQStRLHFCQUFxQiwyQ0FBMkMsNkJBQTZCLG9DQUFvQyxVQUFVLDJCQUEyQixJQUFJLG1DQUFtQyxXQUFXLHVFQUF1RSx3SkFBd0osK09BQStPLCtCQUErQiw2QkFBNkIsNkJBQTZCLHFCQUFxQixtQkFBbUIsaUJBQWlCLDhQQUE4UCxzQkFBc0Isc0JBQXNCLDJCQUEyQix1QkFBdUIsbUJBQW1CLDhCQUE4Qiw2QkFBNkIsc0dBQXNHLG9EQUFvRCwrQkFBK0IsMkJBQTJCLDhCQUE4QixpQ0FBaUMsa0NBQWtDLCtDQUErQyw0Q0FBNEMsa0pBQWtKLGdIQUFnSCx1QkFBdUIsNEVBQTRFLG9RQUFvUSxxQkFBcUIsZ0JBQWdCLG9CQUFvQiwrQ0FBK0MsMkZBQTJGLHdCQUF3QixrREFBa0QsMERBQTBELDBDQUEwQywyU0FBMlMsbURBQW1ELG9DQUFvQyxlQUFlLFlBQVksb0RBQW9ELHlRQUF5USxJQUFJLDJCQUEyQixvQ0FBb0Msd0JBQXdCLG9CQUFvQixpQ0FBaUMsS0FBSyw4QkFBOEIsaURBQWlELGtCQUFrQixnREFBZ0Qsa0JBQWtCLHFDQUFxQyw0QkFBNEIsaUJBQWlCLHdCQUF3Qix3QkFBd0IsMEZBQTBGLDRCQUE0Qix3QkFBd0IsNENBQTRDLDZEQUE2RCw2QkFBNkIsK0JBQStCLCtCQUErQixnREFBZ0QsWUFBWSxhQUFhLG9GQUFvRixnR0FBZ0csYUFBYSxzQkFBc0IsY0FBYyxpQ0FBaUMsaUNBQWlDLHVEQUF1RCxxREFBcUQsdUNBQXVDLDRFQUE0RSxnQ0FBZ0MsMEJBQTBCLDJHQUEyRyw2QkFBNkIsMk9BQTJPLEdBQUcsRSIsImZpbGUiOiI1Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIiFmdW5jdGlvbihlLHQpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHQpOmUubW9tZW50PXQoKX0odGhpcyxmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGUoKXtyZXR1cm4gUWUuYXBwbHkobnVsbCxhcmd1bWVudHMpfWZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheXx8XCJbb2JqZWN0IEFycmF5XVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGwhPWUmJlwiW29iamVjdCBPYmplY3RdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gcyhlKXtyZXR1cm4gdm9pZCAwPT09ZX1mdW5jdGlvbiBpKGUpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiBlfHxcIltvYmplY3QgTnVtYmVyXVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBEYXRlfHxcIltvYmplY3QgRGF0ZV1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBhKGUsdCl7dmFyIG4scz1bXTtmb3Iobj0wO248ZS5sZW5ndGg7KytuKXMucHVzaCh0KGVbbl0sbikpO3JldHVybiBzfWZ1bmN0aW9uIG8oZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9ZnVuY3Rpb24gdShlLHQpe2Zvcih2YXIgbiBpbiB0KW8odCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIG8odCxcInRvU3RyaW5nXCIpJiYoZS50b1N0cmluZz10LnRvU3RyaW5nKSxvKHQsXCJ2YWx1ZU9mXCIpJiYoZS52YWx1ZU9mPXQudmFsdWVPZiksZX1mdW5jdGlvbiBsKGUsdCxuLHMpe3JldHVybiBnZShlLHQsbixzLCEwKS51dGMoKX1mdW5jdGlvbiBkKGUpe3JldHVybiBudWxsPT1lLl9wZiYmKGUuX3BmPXtlbXB0eTohMSx1bnVzZWRUb2tlbnM6W10sdW51c2VkSW5wdXQ6W10sb3ZlcmZsb3c6LTIsY2hhcnNMZWZ0T3ZlcjowLG51bGxJbnB1dDohMSxpbnZhbGlkTW9udGg6bnVsbCxpbnZhbGlkRm9ybWF0OiExLHVzZXJJbnZhbGlkYXRlZDohMSxpc286ITEscGFyc2VkRGF0ZVBhcnRzOltdLG1lcmlkaWVtOm51bGwscmZjMjgyMjohMSx3ZWVrZGF5TWlzbWF0Y2g6ITF9KSxlLl9wZn1mdW5jdGlvbiBoKGUpe2lmKG51bGw9PWUuX2lzVmFsaWQpe3ZhciB0PWQoZSksbj1YZS5jYWxsKHQucGFyc2VkRGF0ZVBhcnRzLGZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lfSkscz0haXNOYU4oZS5fZC5nZXRUaW1lKCkpJiZ0Lm92ZXJmbG93PDAmJiF0LmVtcHR5JiYhdC5pbnZhbGlkTW9udGgmJiF0LmludmFsaWRXZWVrZGF5JiYhdC53ZWVrZGF5TWlzbWF0Y2gmJiF0Lm51bGxJbnB1dCYmIXQuaW52YWxpZEZvcm1hdCYmIXQudXNlckludmFsaWRhdGVkJiYoIXQubWVyaWRpZW18fHQubWVyaWRpZW0mJm4pO2lmKGUuX3N0cmljdCYmKHM9cyYmMD09PXQuY2hhcnNMZWZ0T3ZlciYmMD09PXQudW51c2VkVG9rZW5zLmxlbmd0aCYmdm9pZCAwPT09dC5iaWdIb3VyKSxudWxsIT1PYmplY3QuaXNGcm96ZW4mJk9iamVjdC5pc0Zyb3plbihlKSlyZXR1cm4gcztlLl9pc1ZhbGlkPXN9cmV0dXJuIGUuX2lzVmFsaWR9ZnVuY3Rpb24gYyhlKXt2YXIgdD1sKE5hTik7cmV0dXJuIG51bGwhPWU/dShkKHQpLGUpOmQodCkudXNlckludmFsaWRhdGVkPSEwLHR9ZnVuY3Rpb24gZihlLHQpe3ZhciBuLGkscjtpZihzKHQuX2lzQU1vbWVudE9iamVjdCl8fChlLl9pc0FNb21lbnRPYmplY3Q9dC5faXNBTW9tZW50T2JqZWN0KSxzKHQuX2kpfHwoZS5faT10Ll9pKSxzKHQuX2YpfHwoZS5fZj10Ll9mKSxzKHQuX2wpfHwoZS5fbD10Ll9sKSxzKHQuX3N0cmljdCl8fChlLl9zdHJpY3Q9dC5fc3RyaWN0KSxzKHQuX3R6bSl8fChlLl90em09dC5fdHptKSxzKHQuX2lzVVRDKXx8KGUuX2lzVVRDPXQuX2lzVVRDKSxzKHQuX29mZnNldCl8fChlLl9vZmZzZXQ9dC5fb2Zmc2V0KSxzKHQuX3BmKXx8KGUuX3BmPWQodCkpLHModC5fbG9jYWxlKXx8KGUuX2xvY2FsZT10Ll9sb2NhbGUpLEtlLmxlbmd0aD4wKWZvcihuPTA7bjxLZS5sZW5ndGg7bisrKXMocj10W2k9S2Vbbl1dKXx8KGVbaV09cik7cmV0dXJuIGV9ZnVuY3Rpb24gbSh0KXtmKHRoaXMsdCksdGhpcy5fZD1uZXcgRGF0ZShudWxsIT10Ll9kP3QuX2QuZ2V0VGltZSgpOk5hTiksdGhpcy5pc1ZhbGlkKCl8fCh0aGlzLl9kPW5ldyBEYXRlKE5hTikpLCExPT09ZXQmJihldD0hMCxlLnVwZGF0ZU9mZnNldCh0aGlzKSxldD0hMSl9ZnVuY3Rpb24gXyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIG18fG51bGwhPWUmJm51bGwhPWUuX2lzQU1vbWVudE9iamVjdH1mdW5jdGlvbiB5KGUpe3JldHVybiBlPDA/TWF0aC5jZWlsKGUpfHwwOk1hdGguZmxvb3IoZSl9ZnVuY3Rpb24gZyhlKXt2YXIgdD0rZSxuPTA7cmV0dXJuIDAhPT10JiZpc0Zpbml0ZSh0KSYmKG49eSh0KSksbn1mdW5jdGlvbiBwKGUsdCxuKXt2YXIgcyxpPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKSxyPU1hdGguYWJzKGUubGVuZ3RoLXQubGVuZ3RoKSxhPTA7Zm9yKHM9MDtzPGk7cysrKShuJiZlW3NdIT09dFtzXXx8IW4mJmcoZVtzXSkhPT1nKHRbc10pKSYmYSsrO3JldHVybiBhK3J9ZnVuY3Rpb24gdyh0KXshMT09PWUuc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oXCJEZXByZWNhdGlvbiB3YXJuaW5nOiBcIit0KX1mdW5jdGlvbiB2KHQsbil7dmFyIHM9ITA7cmV0dXJuIHUoZnVuY3Rpb24oKXtpZihudWxsIT1lLmRlcHJlY2F0aW9uSGFuZGxlciYmZS5kZXByZWNhdGlvbkhhbmRsZXIobnVsbCx0KSxzKXtmb3IodmFyIGkscj1bXSxhPTA7YTxhcmd1bWVudHMubGVuZ3RoO2ErKyl7aWYoaT1cIlwiLFwib2JqZWN0XCI9PXR5cGVvZiBhcmd1bWVudHNbYV0pe2krPVwiXFxuW1wiK2ErXCJdIFwiO2Zvcih2YXIgbyBpbiBhcmd1bWVudHNbMF0paSs9bytcIjogXCIrYXJndW1lbnRzWzBdW29dK1wiLCBcIjtpPWkuc2xpY2UoMCwtMil9ZWxzZSBpPWFyZ3VtZW50c1thXTtyLnB1c2goaSl9dyh0K1wiXFxuQXJndW1lbnRzOiBcIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChyKS5qb2luKFwiXCIpK1wiXFxuXCIrKG5ldyBFcnJvcikuc3RhY2spLHM9ITF9cmV0dXJuIG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuKX1mdW5jdGlvbiBNKHQsbil7bnVsbCE9ZS5kZXByZWNhdGlvbkhhbmRsZXImJmUuZGVwcmVjYXRpb25IYW5kbGVyKHQsbiksdHRbdF18fCh3KG4pLHR0W3RdPSEwKX1mdW5jdGlvbiBTKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRnVuY3Rpb258fFwiW29iamVjdCBGdW5jdGlvbl1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBEKGUsdCl7dmFyIHMsaT11KHt9LGUpO2ZvcihzIGluIHQpbyh0LHMpJiYobihlW3NdKSYmbih0W3NdKT8oaVtzXT17fSx1KGlbc10sZVtzXSksdShpW3NdLHRbc10pKTpudWxsIT10W3NdP2lbc109dFtzXTpkZWxldGUgaVtzXSk7Zm9yKHMgaW4gZSlvKGUscykmJiFvKHQscykmJm4oZVtzXSkmJihpW3NdPXUoe30saVtzXSkpO3JldHVybiBpfWZ1bmN0aW9uIGsoZSl7bnVsbCE9ZSYmdGhpcy5zZXQoZSl9ZnVuY3Rpb24gWShlLHQpe3ZhciBuPWUudG9Mb3dlckNhc2UoKTtzdFtuXT1zdFtuK1wic1wiXT1zdFt0XT1lfWZ1bmN0aW9uIE8oZSl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGU/c3RbZV18fHN0W2UudG9Mb3dlckNhc2UoKV06dm9pZCAwfWZ1bmN0aW9uIFQoZSl7dmFyIHQsbixzPXt9O2ZvcihuIGluIGUpbyhlLG4pJiYodD1PKG4pKSYmKHNbdF09ZVtuXSk7cmV0dXJuIHN9ZnVuY3Rpb24geChlLHQpe2l0W2VdPXR9ZnVuY3Rpb24gYihlLHQsbil7dmFyIHM9XCJcIitNYXRoLmFicyhlKSxpPXQtcy5sZW5ndGg7cmV0dXJuKGU+PTA/bj9cIitcIjpcIlwiOlwiLVwiKStNYXRoLnBvdygxMCxNYXRoLm1heCgwLGkpKS50b1N0cmluZygpLnN1YnN0cigxKStzfWZ1bmN0aW9uIFAoZSx0LG4scyl7dmFyIGk9cztcInN0cmluZ1wiPT10eXBlb2YgcyYmKGk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tzXSgpfSksZSYmKHV0W2VdPWkpLHQmJih1dFt0WzBdXT1mdW5jdGlvbigpe3JldHVybiBiKGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRbMV0sdFsyXSl9KSxuJiYodXRbbl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkub3JkaW5hbChpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlKX0pfWZ1bmN0aW9uIFcoZSl7cmV0dXJuIGUubWF0Y2goL1xcW1tcXHNcXFNdLyk/ZS5yZXBsYWNlKC9eXFxbfFxcXSQvZyxcIlwiKTplLnJlcGxhY2UoL1xcXFwvZyxcIlwiKX1mdW5jdGlvbiBIKGUsdCl7cmV0dXJuIGUuaXNWYWxpZCgpPyh0PVIodCxlLmxvY2FsZURhdGEoKSksb3RbdF09b3RbdF18fGZ1bmN0aW9uKGUpe3ZhciB0LG4scz1lLm1hdGNoKHJ0KTtmb3IodD0wLG49cy5sZW5ndGg7dDxuO3QrKyl1dFtzW3RdXT9zW3RdPXV0W3NbdF1dOnNbdF09VyhzW3RdKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGkscj1cIlwiO2ZvcihpPTA7aTxuO2krKylyKz1TKHNbaV0pP3NbaV0uY2FsbCh0LGUpOnNbaV07cmV0dXJuIHJ9fSh0KSxvdFt0XShlKSk6ZS5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKX1mdW5jdGlvbiBSKGUsdCl7ZnVuY3Rpb24gbihlKXtyZXR1cm4gdC5sb25nRGF0ZUZvcm1hdChlKXx8ZX12YXIgcz01O2ZvcihhdC5sYXN0SW5kZXg9MDtzPj0wJiZhdC50ZXN0KGUpOyllPWUucmVwbGFjZShhdCxuKSxhdC5sYXN0SW5kZXg9MCxzLT0xO3JldHVybiBlfWZ1bmN0aW9uIEMoZSx0LG4pe1l0W2VdPVModCk/dDpmdW5jdGlvbihlLHMpe3JldHVybiBlJiZuP246dH19ZnVuY3Rpb24gRihlLHQpe3JldHVybiBvKFl0LGUpP1l0W2VdKHQuX3N0cmljdCx0Ll9sb2NhbGUpOm5ldyBSZWdFeHAoZnVuY3Rpb24oZSl7cmV0dXJuIFUoZS5yZXBsYWNlKFwiXFxcXFwiLFwiXCIpLnJlcGxhY2UoL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZyxmdW5jdGlvbihlLHQsbixzLGkpe3JldHVybiB0fHxufHxzfHxpfSkpfShlKSl9ZnVuY3Rpb24gVShlKXtyZXR1cm4gZS5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csXCJcXFxcJCZcIil9ZnVuY3Rpb24gTChlLHQpe3ZhciBuLHM9dDtmb3IoXCJzdHJpbmdcIj09dHlwZW9mIGUmJihlPVtlXSksaSh0KSYmKHM9ZnVuY3Rpb24oZSxuKXtuW3RdPWcoZSl9KSxuPTA7bjxlLmxlbmd0aDtuKyspT3RbZVtuXV09c31mdW5jdGlvbiBOKGUsdCl7TChlLGZ1bmN0aW9uKGUsbixzLGkpe3MuX3c9cy5fd3x8e30sdChlLHMuX3cscyxpKX0pfWZ1bmN0aW9uIEcoZSx0LG4pe251bGwhPXQmJm8oT3QsZSkmJk90W2VdKHQsbi5fYSxuLGUpfWZ1bmN0aW9uIFYoZSl7cmV0dXJuIEUoZSk/MzY2OjM2NX1mdW5jdGlvbiBFKGUpe3JldHVybiBlJTQ9PTAmJmUlMTAwIT0wfHxlJTQwMD09MH1mdW5jdGlvbiBJKHQsbil7cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybiBudWxsIT1zPyhqKHRoaXMsdCxzKSxlLnVwZGF0ZU9mZnNldCh0aGlzLG4pLHRoaXMpOkEodGhpcyx0KX19ZnVuY3Rpb24gQShlLHQpe3JldHVybiBlLmlzVmFsaWQoKT9lLl9kW1wiZ2V0XCIrKGUuX2lzVVRDP1wiVVRDXCI6XCJcIikrdF0oKTpOYU59ZnVuY3Rpb24gaihlLHQsbil7ZS5pc1ZhbGlkKCkmJiFpc05hTihuKSYmKFwiRnVsbFllYXJcIj09PXQmJkUoZS55ZWFyKCkpJiYxPT09ZS5tb250aCgpJiYyOT09PWUuZGF0ZSgpP2UuX2RbXCJzZXRcIisoZS5faXNVVEM/XCJVVENcIjpcIlwiKSt0XShuLGUubW9udGgoKSxaKG4sZS5tb250aCgpKSk6ZS5fZFtcInNldFwiKyhlLl9pc1VUQz9cIlVUQ1wiOlwiXCIpK3RdKG4pKX1mdW5jdGlvbiBaKGUsdCl7aWYoaXNOYU4oZSl8fGlzTmFOKHQpKXJldHVybiBOYU47dmFyIG49ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZSV0K3QpJXR9KHQsMTIpO3JldHVybiBlKz0odC1uKS8xMiwxPT09bj9FKGUpPzI5OjI4OjMxLW4lNyUyfWZ1bmN0aW9uIHooZSx0KXt2YXIgbjtpZighZS5pc1ZhbGlkKCkpcmV0dXJuIGU7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpaWYoL15cXGQrJC8udGVzdCh0KSl0PWcodCk7ZWxzZSBpZih0PWUubG9jYWxlRGF0YSgpLm1vbnRoc1BhcnNlKHQpLCFpKHQpKXJldHVybiBlO3JldHVybiBuPU1hdGgubWluKGUuZGF0ZSgpLFooZS55ZWFyKCksdCkpLGUuX2RbXCJzZXRcIisoZS5faXNVVEM/XCJVVENcIjpcIlwiKStcIk1vbnRoXCJdKHQsbiksZX1mdW5jdGlvbiAkKHQpe3JldHVybiBudWxsIT10Pyh6KHRoaXMsdCksZS51cGRhdGVPZmZzZXQodGhpcywhMCksdGhpcyk6QSh0aGlzLFwiTW9udGhcIil9ZnVuY3Rpb24gcSgpe2Z1bmN0aW9uIGUoZSx0KXtyZXR1cm4gdC5sZW5ndGgtZS5sZW5ndGh9dmFyIHQsbixzPVtdLGk9W10scj1bXTtmb3IodD0wO3Q8MTI7dCsrKW49bChbMmUzLHRdKSxzLnB1c2godGhpcy5tb250aHNTaG9ydChuLFwiXCIpKSxpLnB1c2godGhpcy5tb250aHMobixcIlwiKSksci5wdXNoKHRoaXMubW9udGhzKG4sXCJcIikpLHIucHVzaCh0aGlzLm1vbnRoc1Nob3J0KG4sXCJcIikpO2ZvcihzLnNvcnQoZSksaS5zb3J0KGUpLHIuc29ydChlKSx0PTA7dDwxMjt0Kyspc1t0XT1VKHNbdF0pLGlbdF09VShpW3RdKTtmb3IodD0wO3Q8MjQ7dCsrKXJbdF09VShyW3RdKTt0aGlzLl9tb250aHNSZWdleD1uZXcgUmVnRXhwKFwiXihcIityLmpvaW4oXCJ8XCIpK1wiKVwiLFwiaVwiKSx0aGlzLl9tb250aHNTaG9ydFJlZ2V4PXRoaXMuX21vbnRoc1JlZ2V4LHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4PW5ldyBSZWdFeHAoXCJeKFwiK2kuam9pbihcInxcIikrXCIpXCIsXCJpXCIpLHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg9bmV3IFJlZ0V4cChcIl4oXCIrcy5qb2luKFwifFwiKStcIilcIixcImlcIil9ZnVuY3Rpb24gSihlKXt2YXIgdD1uZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLGFyZ3VtZW50cykpO3JldHVybiBlPDEwMCYmZT49MCYmaXNGaW5pdGUodC5nZXRVVENGdWxsWWVhcigpKSYmdC5zZXRVVENGdWxsWWVhcihlKSx0fWZ1bmN0aW9uIEIoZSx0LG4pe3ZhciBzPTcrdC1uO3JldHVybi0oKDcrSihlLDAscykuZ2V0VVRDRGF5KCktdCklNykrcy0xfWZ1bmN0aW9uIFEoZSx0LG4scyxpKXt2YXIgcixhLG89MSs3Kih0LTEpKyg3K24tcyklNytCKGUscyxpKTtyZXR1cm4gbzw9MD9hPVYocj1lLTEpK286bz5WKGUpPyhyPWUrMSxhPW8tVihlKSk6KHI9ZSxhPW8pLHt5ZWFyOnIsZGF5T2ZZZWFyOmF9fWZ1bmN0aW9uIFgoZSx0LG4pe3ZhciBzLGkscj1CKGUueWVhcigpLHQsbiksYT1NYXRoLmZsb29yKChlLmRheU9mWWVhcigpLXItMSkvNykrMTtyZXR1cm4gYTwxP3M9YStLKGk9ZS55ZWFyKCktMSx0LG4pOmE+SyhlLnllYXIoKSx0LG4pPyhzPWEtSyhlLnllYXIoKSx0LG4pLGk9ZS55ZWFyKCkrMSk6KGk9ZS55ZWFyKCkscz1hKSx7d2VlazpzLHllYXI6aX19ZnVuY3Rpb24gSyhlLHQsbil7dmFyIHM9QihlLHQsbiksaT1CKGUrMSx0LG4pO3JldHVybihWKGUpLXMraSkvN31mdW5jdGlvbiBlZSgpe2Z1bmN0aW9uIGUoZSx0KXtyZXR1cm4gdC5sZW5ndGgtZS5sZW5ndGh9dmFyIHQsbixzLGkscixhPVtdLG89W10sdT1bXSxkPVtdO2Zvcih0PTA7dDw3O3QrKyluPWwoWzJlMywxXSkuZGF5KHQpLHM9dGhpcy53ZWVrZGF5c01pbihuLFwiXCIpLGk9dGhpcy53ZWVrZGF5c1Nob3J0KG4sXCJcIikscj10aGlzLndlZWtkYXlzKG4sXCJcIiksYS5wdXNoKHMpLG8ucHVzaChpKSx1LnB1c2gociksZC5wdXNoKHMpLGQucHVzaChpKSxkLnB1c2gocik7Zm9yKGEuc29ydChlKSxvLnNvcnQoZSksdS5zb3J0KGUpLGQuc29ydChlKSx0PTA7dDw3O3QrKylvW3RdPVUob1t0XSksdVt0XT1VKHVbdF0pLGRbdF09VShkW3RdKTt0aGlzLl93ZWVrZGF5c1JlZ2V4PW5ldyBSZWdFeHAoXCJeKFwiK2Quam9pbihcInxcIikrXCIpXCIsXCJpXCIpLHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleD10aGlzLl93ZWVrZGF5c1JlZ2V4LHRoaXMuX3dlZWtkYXlzTWluUmVnZXg9dGhpcy5fd2Vla2RheXNSZWdleCx0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4PW5ldyBSZWdFeHAoXCJeKFwiK3Uuam9pbihcInxcIikrXCIpXCIsXCJpXCIpLHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleD1uZXcgUmVnRXhwKFwiXihcIitvLmpvaW4oXCJ8XCIpK1wiKVwiLFwiaVwiKSx0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4PW5ldyBSZWdFeHAoXCJeKFwiK2Euam9pbihcInxcIikrXCIpXCIsXCJpXCIpfWZ1bmN0aW9uIHRlKCl7cmV0dXJuIHRoaXMuaG91cnMoKSUxMnx8MTJ9ZnVuY3Rpb24gbmUoZSx0KXtQKGUsMCwwLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1lcmlkaWVtKHRoaXMuaG91cnMoKSx0aGlzLm1pbnV0ZXMoKSx0KX0pfWZ1bmN0aW9uIHNlKGUsdCl7cmV0dXJuIHQuX21lcmlkaWVtUGFyc2V9ZnVuY3Rpb24gaWUoZSl7cmV0dXJuIGU/ZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoXCJfXCIsXCItXCIpOmV9ZnVuY3Rpb24gcmUoZSl7dmFyIHQ9bnVsbDtpZighWHRbZV0mJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmbW9kdWxlLmV4cG9ydHMpdHJ5e3Q9SnQuX2FiYnI7cmVxdWlyZShcIi4vbG9jYWxlL1wiK2UpLGFlKHQpfWNhdGNoKGUpe31yZXR1cm4gWHRbZV19ZnVuY3Rpb24gYWUoZSx0KXt2YXIgbjtyZXR1cm4gZSYmKG49cyh0KT91ZShlKTpvZShlLHQpKSYmKEp0PW4pLEp0Ll9hYmJyfWZ1bmN0aW9uIG9lKGUsdCl7aWYobnVsbCE9PXQpe3ZhciBuPVF0O2lmKHQuYWJicj1lLG51bGwhPVh0W2VdKU0oXCJkZWZpbmVMb2NhbGVPdmVycmlkZVwiLFwidXNlIG1vbWVudC51cGRhdGVMb2NhbGUobG9jYWxlTmFtZSwgY29uZmlnKSB0byBjaGFuZ2UgYW4gZXhpc3RpbmcgbG9jYWxlLiBtb21lbnQuZGVmaW5lTG9jYWxlKGxvY2FsZU5hbWUsIGNvbmZpZykgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY3JlYXRpbmcgYSBuZXcgbG9jYWxlIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RlZmluZS1sb2NhbGUvIGZvciBtb3JlIGluZm8uXCIpLG49WHRbZV0uX2NvbmZpZztlbHNlIGlmKG51bGwhPXQucGFyZW50TG9jYWxlKXtpZihudWxsPT1YdFt0LnBhcmVudExvY2FsZV0pcmV0dXJuIEt0W3QucGFyZW50TG9jYWxlXXx8KEt0W3QucGFyZW50TG9jYWxlXT1bXSksS3RbdC5wYXJlbnRMb2NhbGVdLnB1c2goe25hbWU6ZSxjb25maWc6dH0pLG51bGw7bj1YdFt0LnBhcmVudExvY2FsZV0uX2NvbmZpZ31yZXR1cm4gWHRbZV09bmV3IGsoRChuLHQpKSxLdFtlXSYmS3RbZV0uZm9yRWFjaChmdW5jdGlvbihlKXtvZShlLm5hbWUsZS5jb25maWcpfSksYWUoZSksWHRbZV19cmV0dXJuIGRlbGV0ZSBYdFtlXSxudWxsfWZ1bmN0aW9uIHVlKGUpe3ZhciBuO2lmKGUmJmUuX2xvY2FsZSYmZS5fbG9jYWxlLl9hYmJyJiYoZT1lLl9sb2NhbGUuX2FiYnIpLCFlKXJldHVybiBKdDtpZighdChlKSl7aWYobj1yZShlKSlyZXR1cm4gbjtlPVtlXX1yZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scyxpLHI9MDtyPGUubGVuZ3RoOyl7Zm9yKHQ9KGk9aWUoZVtyXSkuc3BsaXQoXCItXCIpKS5sZW5ndGgsbj0obj1pZShlW3IrMV0pKT9uLnNwbGl0KFwiLVwiKTpudWxsO3Q+MDspe2lmKHM9cmUoaS5zbGljZSgwLHQpLmpvaW4oXCItXCIpKSlyZXR1cm4gcztpZihuJiZuLmxlbmd0aD49dCYmcChpLG4sITApPj10LTEpYnJlYWs7dC0tfXIrK31yZXR1cm4gbnVsbH0oZSl9ZnVuY3Rpb24gbGUoZSl7dmFyIHQsbj1lLl9hO3JldHVybiBuJiYtMj09PWQoZSkub3ZlcmZsb3cmJih0PW5beHRdPDB8fG5beHRdPjExP3h0Om5bYnRdPDF8fG5bYnRdPloobltUdF0sblt4dF0pP2J0Om5bUHRdPDB8fG5bUHRdPjI0fHwyND09PW5bUHRdJiYoMCE9PW5bV3RdfHwwIT09bltIdF18fDAhPT1uW1J0XSk/UHQ6bltXdF08MHx8bltXdF0+NTk/V3Q6bltIdF08MHx8bltIdF0+NTk/SHQ6bltSdF08MHx8bltSdF0+OTk5P1J0Oi0xLGQoZSkuX292ZXJmbG93RGF5T2ZZZWFyJiYodDxUdHx8dD5idCkmJih0PWJ0KSxkKGUpLl9vdmVyZmxvd1dlZWtzJiYtMT09PXQmJih0PUN0KSxkKGUpLl9vdmVyZmxvd1dlZWtkYXkmJi0xPT09dCYmKHQ9RnQpLGQoZSkub3ZlcmZsb3c9dCksZX1mdW5jdGlvbiBkZShlLHQsbil7cmV0dXJuIG51bGwhPWU/ZTpudWxsIT10P3Q6bn1mdW5jdGlvbiBoZSh0KXt2YXIgbixzLGkscixhLG89W107aWYoIXQuX2Qpe2ZvcihpPWZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBEYXRlKGUubm93KCkpO3JldHVybiB0Ll91c2VVVEM/W24uZ2V0VVRDRnVsbFllYXIoKSxuLmdldFVUQ01vbnRoKCksbi5nZXRVVENEYXRlKCldOltuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpXX0odCksdC5fdyYmbnVsbD09dC5fYVtidF0mJm51bGw9PXQuX2FbeHRdJiZmdW5jdGlvbihlKXt2YXIgdCxuLHMsaSxyLGEsbyx1O2lmKG51bGwhPSh0PWUuX3cpLkdHfHxudWxsIT10Lld8fG51bGwhPXQuRSlyPTEsYT00LG49ZGUodC5HRyxlLl9hW1R0XSxYKHBlKCksMSw0KS55ZWFyKSxzPWRlKHQuVywxKSwoKGk9ZGUodC5FLDEpKTwxfHxpPjcpJiYodT0hMCk7ZWxzZXtyPWUuX2xvY2FsZS5fd2Vlay5kb3csYT1lLl9sb2NhbGUuX3dlZWsuZG95O3ZhciBsPVgocGUoKSxyLGEpO249ZGUodC5nZyxlLl9hW1R0XSxsLnllYXIpLHM9ZGUodC53LGwud2VlayksbnVsbCE9dC5kPygoaT10LmQpPDB8fGk+NikmJih1PSEwKTpudWxsIT10LmU/KGk9dC5lK3IsKHQuZTwwfHx0LmU+NikmJih1PSEwKSk6aT1yfXM8MXx8cz5LKG4scixhKT9kKGUpLl9vdmVyZmxvd1dlZWtzPSEwOm51bGwhPXU/ZChlKS5fb3ZlcmZsb3dXZWVrZGF5PSEwOihvPVEobixzLGkscixhKSxlLl9hW1R0XT1vLnllYXIsZS5fZGF5T2ZZZWFyPW8uZGF5T2ZZZWFyKX0odCksbnVsbCE9dC5fZGF5T2ZZZWFyJiYoYT1kZSh0Ll9hW1R0XSxpW1R0XSksKHQuX2RheU9mWWVhcj5WKGEpfHwwPT09dC5fZGF5T2ZZZWFyKSYmKGQodCkuX292ZXJmbG93RGF5T2ZZZWFyPSEwKSxzPUooYSwwLHQuX2RheU9mWWVhciksdC5fYVt4dF09cy5nZXRVVENNb250aCgpLHQuX2FbYnRdPXMuZ2V0VVRDRGF0ZSgpKSxuPTA7bjwzJiZudWxsPT10Ll9hW25dOysrbil0Ll9hW25dPW9bbl09aVtuXTtmb3IoO248NztuKyspdC5fYVtuXT1vW25dPW51bGw9PXQuX2Fbbl0/Mj09PW4/MTowOnQuX2Fbbl07MjQ9PT10Ll9hW1B0XSYmMD09PXQuX2FbV3RdJiYwPT09dC5fYVtIdF0mJjA9PT10Ll9hW1J0XSYmKHQuX25leHREYXk9ITAsdC5fYVtQdF09MCksdC5fZD0odC5fdXNlVVRDP0o6ZnVuY3Rpb24oZSx0LG4scyxpLHIsYSl7dmFyIG89bmV3IERhdGUoZSx0LG4scyxpLHIsYSk7cmV0dXJuIGU8MTAwJiZlPj0wJiZpc0Zpbml0ZShvLmdldEZ1bGxZZWFyKCkpJiZvLnNldEZ1bGxZZWFyKGUpLG99KS5hcHBseShudWxsLG8pLHI9dC5fdXNlVVRDP3QuX2QuZ2V0VVRDRGF5KCk6dC5fZC5nZXREYXkoKSxudWxsIT10Ll90em0mJnQuX2Quc2V0VVRDTWludXRlcyh0Ll9kLmdldFVUQ01pbnV0ZXMoKS10Ll90em0pLHQuX25leHREYXkmJih0Ll9hW1B0XT0yNCksdC5fdyYmdm9pZCAwIT09dC5fdy5kJiZ0Ll93LmQhPT1yJiYoZCh0KS53ZWVrZGF5TWlzbWF0Y2g9ITApfX1mdW5jdGlvbiBjZShlKXt2YXIgdCxuLHMsaSxyLGEsbz1lLl9pLHU9ZW4uZXhlYyhvKXx8dG4uZXhlYyhvKTtpZih1KXtmb3IoZChlKS5pc289ITAsdD0wLG49c24ubGVuZ3RoO3Q8bjt0KyspaWYoc25bdF1bMV0uZXhlYyh1WzFdKSl7aT1zblt0XVswXSxzPSExIT09c25bdF1bMl07YnJlYWt9aWYobnVsbD09aSlyZXR1cm4gdm9pZChlLl9pc1ZhbGlkPSExKTtpZih1WzNdKXtmb3IodD0wLG49cm4ubGVuZ3RoO3Q8bjt0KyspaWYocm5bdF1bMV0uZXhlYyh1WzNdKSl7cj0odVsyXXx8XCIgXCIpK3JuW3RdWzBdO2JyZWFrfWlmKG51bGw9PXIpcmV0dXJuIHZvaWQoZS5faXNWYWxpZD0hMSl9aWYoIXMmJm51bGwhPXIpcmV0dXJuIHZvaWQoZS5faXNWYWxpZD0hMSk7aWYodVs0XSl7aWYoIW5uLmV4ZWModVs0XSkpcmV0dXJuIHZvaWQoZS5faXNWYWxpZD0hMSk7YT1cIlpcIn1lLl9mPWkrKHJ8fFwiXCIpKyhhfHxcIlwiKSxfZShlKX1lbHNlIGUuX2lzVmFsaWQ9ITF9ZnVuY3Rpb24gZmUoZSx0LG4scyxpLHIpe3ZhciBhPVtmdW5jdGlvbihlKXt2YXIgdD1wYXJzZUludChlLDEwKTt7aWYodDw9NDkpcmV0dXJuIDJlMyt0O2lmKHQ8PTk5OSlyZXR1cm4gMTkwMCt0fXJldHVybiB0fShlKSxWdC5pbmRleE9mKHQpLHBhcnNlSW50KG4sMTApLHBhcnNlSW50KHMsMTApLHBhcnNlSW50KGksMTApXTtyZXR1cm4gciYmYS5wdXNoKHBhcnNlSW50KHIsMTApKSxhfWZ1bmN0aW9uIG1lKGUpe3ZhciB0PW9uLmV4ZWMoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZyxcIiBcIikucmVwbGFjZSgvKFxcc1xccyspL2csXCIgXCIpLnRyaW0oKX0oZS5faSkpO2lmKHQpe3ZhciBuPWZlKHRbNF0sdFszXSx0WzJdLHRbNV0sdFs2XSx0WzddKTtpZighZnVuY3Rpb24oZSx0LG4pe2lmKGUmJmp0LmluZGV4T2YoZSkhPT1uZXcgRGF0ZSh0WzBdLHRbMV0sdFsyXSkuZ2V0RGF5KCkpcmV0dXJuIGQobikud2Vla2RheU1pc21hdGNoPSEwLG4uX2lzVmFsaWQ9ITEsITE7cmV0dXJuITB9KHRbMV0sbixlKSlyZXR1cm47ZS5fYT1uLGUuX3R6bT1mdW5jdGlvbihlLHQsbil7aWYoZSlyZXR1cm4gdW5bZV07aWYodClyZXR1cm4gMDt2YXIgcz1wYXJzZUludChuLDEwKSxpPXMlMTAwO3JldHVybihzLWkpLzEwMCo2MCtpfSh0WzhdLHRbOV0sdFsxMF0pLGUuX2Q9Si5hcHBseShudWxsLGUuX2EpLGUuX2Quc2V0VVRDTWludXRlcyhlLl9kLmdldFVUQ01pbnV0ZXMoKS1lLl90em0pLGQoZSkucmZjMjgyMj0hMH1lbHNlIGUuX2lzVmFsaWQ9ITF9ZnVuY3Rpb24gX2UodCl7aWYodC5fZiE9PWUuSVNPXzg2MDEpaWYodC5fZiE9PWUuUkZDXzI4MjIpe3QuX2E9W10sZCh0KS5lbXB0eT0hMDt2YXIgbixzLGkscixhLG89XCJcIit0Ll9pLHU9by5sZW5ndGgsbD0wO2ZvcihpPVIodC5fZix0Ll9sb2NhbGUpLm1hdGNoKHJ0KXx8W10sbj0wO248aS5sZW5ndGg7bisrKXI9aVtuXSwocz0oby5tYXRjaChGKHIsdCkpfHxbXSlbMF0pJiYoKGE9by5zdWJzdHIoMCxvLmluZGV4T2YocykpKS5sZW5ndGg+MCYmZCh0KS51bnVzZWRJbnB1dC5wdXNoKGEpLG89by5zbGljZShvLmluZGV4T2Yocykrcy5sZW5ndGgpLGwrPXMubGVuZ3RoKSx1dFtyXT8ocz9kKHQpLmVtcHR5PSExOmQodCkudW51c2VkVG9rZW5zLnB1c2gociksRyhyLHMsdCkpOnQuX3N0cmljdCYmIXMmJmQodCkudW51c2VkVG9rZW5zLnB1c2gocik7ZCh0KS5jaGFyc0xlZnRPdmVyPXUtbCxvLmxlbmd0aD4wJiZkKHQpLnVudXNlZElucHV0LnB1c2gobyksdC5fYVtQdF08PTEyJiYhMD09PWQodCkuYmlnSG91ciYmdC5fYVtQdF0+MCYmKGQodCkuYmlnSG91cj12b2lkIDApLGQodCkucGFyc2VkRGF0ZVBhcnRzPXQuX2Euc2xpY2UoMCksZCh0KS5tZXJpZGllbT10Ll9tZXJpZGllbSx0Ll9hW1B0XT1mdW5jdGlvbihlLHQsbil7dmFyIHM7aWYobnVsbD09bilyZXR1cm4gdDtyZXR1cm4gbnVsbCE9ZS5tZXJpZGllbUhvdXI/ZS5tZXJpZGllbUhvdXIodCxuKTpudWxsIT1lLmlzUE0/KChzPWUuaXNQTShuKSkmJnQ8MTImJih0Kz0xMiksc3x8MTIhPT10fHwodD0wKSx0KTp0fSh0Ll9sb2NhbGUsdC5fYVtQdF0sdC5fbWVyaWRpZW0pLGhlKHQpLGxlKHQpfWVsc2UgbWUodCk7ZWxzZSBjZSh0KX1mdW5jdGlvbiB5ZShvKXt2YXIgbD1vLl9pLHk9by5fZjtyZXR1cm4gby5fbG9jYWxlPW8uX2xvY2FsZXx8dWUoby5fbCksbnVsbD09PWx8fHZvaWQgMD09PXkmJlwiXCI9PT1sP2Moe251bGxJbnB1dDohMH0pOihcInN0cmluZ1wiPT10eXBlb2YgbCYmKG8uX2k9bD1vLl9sb2NhbGUucHJlcGFyc2UobCkpLF8obCk/bmV3IG0obGUobCkpOihyKGwpP28uX2Q9bDp0KHkpP2Z1bmN0aW9uKGUpe3ZhciB0LG4scyxpLHI7aWYoMD09PWUuX2YubGVuZ3RoKXJldHVybiBkKGUpLmludmFsaWRGb3JtYXQ9ITAsdm9pZChlLl9kPW5ldyBEYXRlKE5hTikpO2ZvcihpPTA7aTxlLl9mLmxlbmd0aDtpKyspcj0wLHQ9Zih7fSxlKSxudWxsIT1lLl91c2VVVEMmJih0Ll91c2VVVEM9ZS5fdXNlVVRDKSx0Ll9mPWUuX2ZbaV0sX2UodCksaCh0KSYmKHIrPWQodCkuY2hhcnNMZWZ0T3ZlcixyKz0xMCpkKHQpLnVudXNlZFRva2Vucy5sZW5ndGgsZCh0KS5zY29yZT1yLChudWxsPT1zfHxyPHMpJiYocz1yLG49dCkpO3UoZSxufHx0KX0obyk6eT9fZShvKTpmdW5jdGlvbihvKXt2YXIgdT1vLl9pO3ModSk/by5fZD1uZXcgRGF0ZShlLm5vdygpKTpyKHUpP28uX2Q9bmV3IERhdGUodS52YWx1ZU9mKCkpOlwic3RyaW5nXCI9PXR5cGVvZiB1P2Z1bmN0aW9uKHQpe3ZhciBuPWFuLmV4ZWModC5faSk7bnVsbD09PW4/KGNlKHQpLCExPT09dC5faXNWYWxpZCYmKGRlbGV0ZSB0Ll9pc1ZhbGlkLG1lKHQpLCExPT09dC5faXNWYWxpZCYmKGRlbGV0ZSB0Ll9pc1ZhbGlkLGUuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2sodCkpKSk6dC5fZD1uZXcgRGF0ZSgrblsxXSl9KG8pOnQodSk/KG8uX2E9YSh1LnNsaWNlKDApLGZ1bmN0aW9uKGUpe3JldHVybiBwYXJzZUludChlLDEwKX0pLGhlKG8pKTpuKHUpP2Z1bmN0aW9uKGUpe2lmKCFlLl9kKXt2YXIgdD1UKGUuX2kpO2UuX2E9YShbdC55ZWFyLHQubW9udGgsdC5kYXl8fHQuZGF0ZSx0LmhvdXIsdC5taW51dGUsdC5zZWNvbmQsdC5taWxsaXNlY29uZF0sZnVuY3Rpb24oZSl7cmV0dXJuIGUmJnBhcnNlSW50KGUsMTApfSksaGUoZSl9fShvKTppKHUpP28uX2Q9bmV3IERhdGUodSk6ZS5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhvKX0obyksaChvKXx8KG8uX2Q9bnVsbCksbykpfWZ1bmN0aW9uIGdlKGUscyxpLHIsYSl7dmFyIG89e307cmV0dXJuITAhPT1pJiYhMSE9PWl8fChyPWksaT12b2lkIDApLChuKGUpJiZmdW5jdGlvbihlKXtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcylyZXR1cm4gMD09PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpLmxlbmd0aDt2YXIgdDtmb3IodCBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuITE7cmV0dXJuITB9KGUpfHx0KGUpJiYwPT09ZS5sZW5ndGgpJiYoZT12b2lkIDApLG8uX2lzQU1vbWVudE9iamVjdD0hMCxvLl91c2VVVEM9by5faXNVVEM9YSxvLl9sPWksby5faT1lLG8uX2Y9cyxvLl9zdHJpY3Q9cixmdW5jdGlvbihlKXt2YXIgdD1uZXcgbShsZSh5ZShlKSkpO3JldHVybiB0Ll9uZXh0RGF5JiYodC5hZGQoMSxcImRcIiksdC5fbmV4dERheT12b2lkIDApLHR9KG8pfWZ1bmN0aW9uIHBlKGUsdCxuLHMpe3JldHVybiBnZShlLHQsbixzLCExKX1mdW5jdGlvbiB3ZShlLG4pe3ZhciBzLGk7aWYoMT09PW4ubGVuZ3RoJiZ0KG5bMF0pJiYobj1uWzBdKSwhbi5sZW5ndGgpcmV0dXJuIHBlKCk7Zm9yKHM9blswXSxpPTE7aTxuLmxlbmd0aDsrK2kpbltpXS5pc1ZhbGlkKCkmJiFuW2ldW2VdKHMpfHwocz1uW2ldKTtyZXR1cm4gc31mdW5jdGlvbiB2ZShlKXt2YXIgdD1UKGUpLG49dC55ZWFyfHwwLHM9dC5xdWFydGVyfHwwLGk9dC5tb250aHx8MCxyPXQud2Vla3x8MCxhPXQuZGF5fHwwLG89dC5ob3VyfHwwLHU9dC5taW51dGV8fDAsbD10LnNlY29uZHx8MCxkPXQubWlsbGlzZWNvbmR8fDA7dGhpcy5faXNWYWxpZD1mdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSlpZigtMT09PVV0LmNhbGwoaG4sdCl8fG51bGwhPWVbdF0mJmlzTmFOKGVbdF0pKXJldHVybiExO2Zvcih2YXIgbj0hMSxzPTA7czxobi5sZW5ndGg7KytzKWlmKGVbaG5bc11dKXtpZihuKXJldHVybiExO3BhcnNlRmxvYXQoZVtobltzXV0pIT09ZyhlW2huW3NdXSkmJihuPSEwKX1yZXR1cm4hMH0odCksdGhpcy5fbWlsbGlzZWNvbmRzPStkKzFlMypsKzZlNCp1KzFlMypvKjYwKjYwLHRoaXMuX2RheXM9K2ErNypyLHRoaXMuX21vbnRocz0raSszKnMrMTIqbix0aGlzLl9kYXRhPXt9LHRoaXMuX2xvY2FsZT11ZSgpLHRoaXMuX2J1YmJsZSgpfWZ1bmN0aW9uIE1lKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdmV9ZnVuY3Rpb24gU2UoZSl7cmV0dXJuIGU8MD8tMSpNYXRoLnJvdW5kKC0xKmUpOk1hdGgucm91bmQoZSl9ZnVuY3Rpb24gRGUoZSx0KXtQKGUsMCwwLGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy51dGNPZmZzZXQoKSxuPVwiK1wiO3JldHVybiBlPDAmJihlPS1lLG49XCItXCIpLG4rYih+fihlLzYwKSwyKSt0K2Iofn5lJTYwLDIpfSl9ZnVuY3Rpb24ga2UoZSx0KXt2YXIgbj0odHx8XCJcIikubWF0Y2goZSk7aWYobnVsbD09PW4pcmV0dXJuIG51bGw7dmFyIHM9KChuW24ubGVuZ3RoLTFdfHxbXSkrXCJcIikubWF0Y2goY24pfHxbXCItXCIsMCwwXSxpPTYwKnNbMV0rZyhzWzJdKTtyZXR1cm4gMD09PWk/MDpcIitcIj09PXNbMF0/aTotaX1mdW5jdGlvbiBZZSh0LG4pe3ZhciBzLGk7cmV0dXJuIG4uX2lzVVRDPyhzPW4uY2xvbmUoKSxpPShfKHQpfHxyKHQpP3QudmFsdWVPZigpOnBlKHQpLnZhbHVlT2YoKSktcy52YWx1ZU9mKCkscy5fZC5zZXRUaW1lKHMuX2QudmFsdWVPZigpK2kpLGUudXBkYXRlT2Zmc2V0KHMsITEpLHMpOnBlKHQpLmxvY2FsKCl9ZnVuY3Rpb24gT2UoZSl7cmV0dXJuIDE1Ki1NYXRoLnJvdW5kKGUuX2QuZ2V0VGltZXpvbmVPZmZzZXQoKS8xNSl9ZnVuY3Rpb24gVGUoKXtyZXR1cm4hIXRoaXMuaXNWYWxpZCgpJiYodGhpcy5faXNVVEMmJjA9PT10aGlzLl9vZmZzZXQpfWZ1bmN0aW9uIHhlKGUsdCl7dmFyIG4scyxyLGE9ZSx1PW51bGw7cmV0dXJuIE1lKGUpP2E9e21zOmUuX21pbGxpc2Vjb25kcyxkOmUuX2RheXMsTTplLl9tb250aHN9OmkoZSk/KGE9e30sdD9hW3RdPWU6YS5taWxsaXNlY29uZHM9ZSk6KHU9Zm4uZXhlYyhlKSk/KG49XCItXCI9PT11WzFdPy0xOjEsYT17eTowLGQ6Zyh1W2J0XSkqbixoOmcodVtQdF0pKm4sbTpnKHVbV3RdKSpuLHM6Zyh1W0h0XSkqbixtczpnKFNlKDFlMyp1W1J0XSkpKm59KToodT1tbi5leGVjKGUpKT8obj1cIi1cIj09PXVbMV0/LTE6KHVbMV0sMSksYT17eTpiZSh1WzJdLG4pLE06YmUodVszXSxuKSx3OmJlKHVbNF0sbiksZDpiZSh1WzVdLG4pLGg6YmUodVs2XSxuKSxtOmJlKHVbN10sbiksczpiZSh1WzhdLG4pfSk6bnVsbD09YT9hPXt9Olwib2JqZWN0XCI9PXR5cGVvZiBhJiYoXCJmcm9tXCJpbiBhfHxcInRvXCJpbiBhKSYmKHI9ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZighZS5pc1ZhbGlkKCl8fCF0LmlzVmFsaWQoKSlyZXR1cm57bWlsbGlzZWNvbmRzOjAsbW9udGhzOjB9O3Q9WWUodCxlKSxlLmlzQmVmb3JlKHQpP249UGUoZSx0KTooKG49UGUodCxlKSkubWlsbGlzZWNvbmRzPS1uLm1pbGxpc2Vjb25kcyxuLm1vbnRocz0tbi5tb250aHMpO3JldHVybiBufShwZShhLmZyb20pLHBlKGEudG8pKSwoYT17fSkubXM9ci5taWxsaXNlY29uZHMsYS5NPXIubW9udGhzKSxzPW5ldyB2ZShhKSxNZShlKSYmbyhlLFwiX2xvY2FsZVwiKSYmKHMuX2xvY2FsZT1lLl9sb2NhbGUpLHN9ZnVuY3Rpb24gYmUoZSx0KXt2YXIgbj1lJiZwYXJzZUZsb2F0KGUucmVwbGFjZShcIixcIixcIi5cIikpO3JldHVybihpc05hTihuKT8wOm4pKnR9ZnVuY3Rpb24gUGUoZSx0KXt2YXIgbj17bWlsbGlzZWNvbmRzOjAsbW9udGhzOjB9O3JldHVybiBuLm1vbnRocz10Lm1vbnRoKCktZS5tb250aCgpKzEyKih0LnllYXIoKS1lLnllYXIoKSksZS5jbG9uZSgpLmFkZChuLm1vbnRocyxcIk1cIikuaXNBZnRlcih0KSYmLS1uLm1vbnRocyxuLm1pbGxpc2Vjb25kcz0rdC0rZS5jbG9uZSgpLmFkZChuLm1vbnRocyxcIk1cIiksbn1mdW5jdGlvbiBXZShlLHQpe3JldHVybiBmdW5jdGlvbihuLHMpe3ZhciBpLHI7cmV0dXJuIG51bGw9PT1zfHxpc05hTigrcyl8fChNKHQsXCJtb21lbnQoKS5cIit0K1wiKHBlcmlvZCwgbnVtYmVyKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIG1vbWVudCgpLlwiK3QrXCIobnVtYmVyLCBwZXJpb2QpLiBTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9hZGQtaW52ZXJ0ZWQtcGFyYW0vIGZvciBtb3JlIGluZm8uXCIpLHI9bixuPXMscz1yKSxuPVwic3RyaW5nXCI9PXR5cGVvZiBuPytuOm4saT14ZShuLHMpLEhlKHRoaXMsaSxlKSx0aGlzfX1mdW5jdGlvbiBIZSh0LG4scyxpKXt2YXIgcj1uLl9taWxsaXNlY29uZHMsYT1TZShuLl9kYXlzKSxvPVNlKG4uX21vbnRocyk7dC5pc1ZhbGlkKCkmJihpPW51bGw9PWl8fGksbyYmeih0LEEodCxcIk1vbnRoXCIpK28qcyksYSYmaih0LFwiRGF0ZVwiLEEodCxcIkRhdGVcIikrYSpzKSxyJiZ0Ll9kLnNldFRpbWUodC5fZC52YWx1ZU9mKCkrcipzKSxpJiZlLnVwZGF0ZU9mZnNldCh0LGF8fG8pKX1mdW5jdGlvbiBSZShlLHQpe3ZhciBuLHM9MTIqKHQueWVhcigpLWUueWVhcigpKSsodC5tb250aCgpLWUubW9udGgoKSksaT1lLmNsb25lKCkuYWRkKHMsXCJtb250aHNcIik7cmV0dXJuIG49dC1pPDA/KHQtaSkvKGktZS5jbG9uZSgpLmFkZChzLTEsXCJtb250aHNcIikpOih0LWkpLyhlLmNsb25lKCkuYWRkKHMrMSxcIm1vbnRoc1wiKS1pKSwtKHMrbil8fDB9ZnVuY3Rpb24gQ2UoZSl7dmFyIHQ7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5fbG9jYWxlLl9hYmJyOihudWxsIT0odD11ZShlKSkmJih0aGlzLl9sb2NhbGU9dCksdGhpcyl9ZnVuY3Rpb24gRmUoKXtyZXR1cm4gdGhpcy5fbG9jYWxlfWZ1bmN0aW9uIFVlKGUsdCl7UCgwLFtlLGUubGVuZ3RoXSwwLHQpfWZ1bmN0aW9uIExlKGUsdCxuLHMsaSl7dmFyIHI7cmV0dXJuIG51bGw9PWU/WCh0aGlzLHMsaSkueWVhcjoocj1LKGUscyxpKSx0PnImJih0PXIpLGZ1bmN0aW9uKGUsdCxuLHMsaSl7dmFyIHI9UShlLHQsbixzLGkpLGE9SihyLnllYXIsMCxyLmRheU9mWWVhcik7cmV0dXJuIHRoaXMueWVhcihhLmdldFVUQ0Z1bGxZZWFyKCkpLHRoaXMubW9udGgoYS5nZXRVVENNb250aCgpKSx0aGlzLmRhdGUoYS5nZXRVVENEYXRlKCkpLHRoaXN9LmNhbGwodGhpcyxlLHQsbixzLGkpKX1mdW5jdGlvbiBOZShlLHQpe3RbUnRdPWcoMWUzKihcIjAuXCIrZSkpfWZ1bmN0aW9uIEdlKGUpe3JldHVybiBlfWZ1bmN0aW9uIFZlKGUsdCxuLHMpe3ZhciBpPXVlKCkscj1sKCkuc2V0KHMsdCk7cmV0dXJuIGlbbl0ocixlKX1mdW5jdGlvbiBFZShlLHQsbil7aWYoaShlKSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHxcIlwiLG51bGwhPXQpcmV0dXJuIFZlKGUsdCxuLFwibW9udGhcIik7dmFyIHMscj1bXTtmb3Iocz0wO3M8MTI7cysrKXJbc109VmUoZSxzLG4sXCJtb250aFwiKTtyZXR1cm4gcn1mdW5jdGlvbiBJZShlLHQsbixzKXtcImJvb2xlYW5cIj09dHlwZW9mIGU/KGkodCkmJihuPXQsdD12b2lkIDApLHQ9dHx8XCJcIik6KG49dD1lLGU9ITEsaSh0KSYmKG49dCx0PXZvaWQgMCksdD10fHxcIlwiKTt2YXIgcj11ZSgpLGE9ZT9yLl93ZWVrLmRvdzowO2lmKG51bGwhPW4pcmV0dXJuIFZlKHQsKG4rYSklNyxzLFwiZGF5XCIpO3ZhciBvLHU9W107Zm9yKG89MDtvPDc7bysrKXVbb109VmUodCwobythKSU3LHMsXCJkYXlcIik7cmV0dXJuIHV9ZnVuY3Rpb24gQWUoZSx0LG4scyl7dmFyIGk9eGUodCxuKTtyZXR1cm4gZS5fbWlsbGlzZWNvbmRzKz1zKmkuX21pbGxpc2Vjb25kcyxlLl9kYXlzKz1zKmkuX2RheXMsZS5fbW9udGhzKz1zKmkuX21vbnRocyxlLl9idWJibGUoKX1mdW5jdGlvbiBqZShlKXtyZXR1cm4gZTwwP01hdGguZmxvb3IoZSk6TWF0aC5jZWlsKGUpfWZ1bmN0aW9uIFplKGUpe3JldHVybiA0ODAwKmUvMTQ2MDk3fWZ1bmN0aW9uIHplKGUpe3JldHVybiAxNDYwOTcqZS80ODAwfWZ1bmN0aW9uICRlKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLmFzKGUpfX1mdW5jdGlvbiBxZShlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/dGhpcy5fZGF0YVtlXTpOYU59fWZ1bmN0aW9uIEplKGUpe3JldHVybihlPjApLShlPDApfHwrZX1mdW5jdGlvbiBCZSgpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTt2YXIgZSx0LG49QW4odGhpcy5fbWlsbGlzZWNvbmRzKS8xZTMscz1Bbih0aGlzLl9kYXlzKSxpPUFuKHRoaXMuX21vbnRocyk7dD15KChlPXkobi82MCkpLzYwKSxuJT02MCxlJT02MDt2YXIgcj15KGkvMTIpLGE9aSU9MTIsbz1zLHU9dCxsPWUsZD1uP24udG9GaXhlZCgzKS5yZXBsYWNlKC9cXC4/MCskLyxcIlwiKTpcIlwiLGg9dGhpcy5hc1NlY29uZHMoKTtpZighaClyZXR1cm5cIlAwRFwiO3ZhciBjPWg8MD9cIi1cIjpcIlwiLGY9SmUodGhpcy5fbW9udGhzKSE9PUplKGgpP1wiLVwiOlwiXCIsbT1KZSh0aGlzLl9kYXlzKSE9PUplKGgpP1wiLVwiOlwiXCIsXz1KZSh0aGlzLl9taWxsaXNlY29uZHMpIT09SmUoaCk/XCItXCI6XCJcIjtyZXR1cm4gYytcIlBcIisocj9mK3IrXCJZXCI6XCJcIikrKGE/ZithK1wiTVwiOlwiXCIpKyhvP20rbytcIkRcIjpcIlwiKSsodXx8bHx8ZD9cIlRcIjpcIlwiKSsodT9fK3UrXCJIXCI6XCJcIikrKGw/XytsK1wiTVwiOlwiXCIpKyhkP18rZCtcIlNcIjpcIlwiKX12YXIgUWUsWGU7WGU9QXJyYXkucHJvdG90eXBlLnNvbWU/QXJyYXkucHJvdG90eXBlLnNvbWU6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PU9iamVjdCh0aGlzKSxuPXQubGVuZ3RoPj4+MCxzPTA7czxuO3MrKylpZihzIGluIHQmJmUuY2FsbCh0aGlzLHRbc10scyx0KSlyZXR1cm4hMDtyZXR1cm4hMX07dmFyIEtlPWUubW9tZW50UHJvcGVydGllcz1bXSxldD0hMSx0dD17fTtlLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncz0hMSxlLmRlcHJlY2F0aW9uSGFuZGxlcj1udWxsO3ZhciBudDtudD1PYmplY3Qua2V5cz9PYmplY3Qua2V5czpmdW5jdGlvbihlKXt2YXIgdCxuPVtdO2Zvcih0IGluIGUpbyhlLHQpJiZuLnB1c2godCk7cmV0dXJuIG59O3ZhciBzdD17fSxpdD17fSxydD0vKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fFlZWVlZWXxZWVlZWXxZWVlZfFlZfGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nLGF0PS8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhMVFN8TFR8TEw/TD9MP3xsezEsNH0pL2csb3Q9e30sdXQ9e30sbHQ9L1xcZC8sZHQ9L1xcZFxcZC8saHQ9L1xcZHszfS8sY3Q9L1xcZHs0fS8sZnQ9L1srLV0/XFxkezZ9LyxtdD0vXFxkXFxkPy8sX3Q9L1xcZFxcZFxcZFxcZD8vLHl0PS9cXGRcXGRcXGRcXGRcXGRcXGQ/LyxndD0vXFxkezEsM30vLHB0PS9cXGR7MSw0fS8sd3Q9L1srLV0/XFxkezEsNn0vLHZ0PS9cXGQrLyxNdD0vWystXT9cXGQrLyxTdD0vWnxbKy1dXFxkXFxkOj9cXGRcXGQvZ2ksRHQ9L1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vZ2ksa3Q9L1swLTldezAsMjU2fVsnYS16XFx1MDBBMC1cXHUwNUZGXFx1MDcwMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRjA3XFx1RkYxMC1cXHVGRkVGXXsxLDI1Nn18W1xcdTA2MDAtXFx1MDZGRlxcL117MSwyNTZ9KFxccyo/W1xcdTA2MDAtXFx1MDZGRl17MSwyNTZ9KXsxLDJ9L2ksWXQ9e30sT3Q9e30sVHQ9MCx4dD0xLGJ0PTIsUHQ9MyxXdD00LEh0PTUsUnQ9NixDdD03LEZ0PTg7UChcIllcIiwwLDAsZnVuY3Rpb24oKXt2YXIgZT10aGlzLnllYXIoKTtyZXR1cm4gZTw9OTk5OT9cIlwiK2U6XCIrXCIrZX0pLFAoMCxbXCJZWVwiLDJdLDAsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy55ZWFyKCklMTAwfSksUCgwLFtcIllZWVlcIiw0XSwwLFwieWVhclwiKSxQKDAsW1wiWVlZWVlcIiw1XSwwLFwieWVhclwiKSxQKDAsW1wiWVlZWVlZXCIsNiwhMF0sMCxcInllYXJcIiksWShcInllYXJcIixcInlcIikseChcInllYXJcIiwxKSxDKFwiWVwiLE10KSxDKFwiWVlcIixtdCxkdCksQyhcIllZWVlcIixwdCxjdCksQyhcIllZWVlZXCIsd3QsZnQpLEMoXCJZWVlZWVlcIix3dCxmdCksTChbXCJZWVlZWVwiLFwiWVlZWVlZXCJdLFR0KSxMKFwiWVlZWVwiLGZ1bmN0aW9uKHQsbil7bltUdF09Mj09PXQubGVuZ3RoP2UucGFyc2VUd29EaWdpdFllYXIodCk6Zyh0KX0pLEwoXCJZWVwiLGZ1bmN0aW9uKHQsbil7bltUdF09ZS5wYXJzZVR3b0RpZ2l0WWVhcih0KX0pLEwoXCJZXCIsZnVuY3Rpb24oZSx0KXt0W1R0XT1wYXJzZUludChlLDEwKX0pLGUucGFyc2VUd29EaWdpdFllYXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGcoZSkrKGcoZSk+Njg/MTkwMDoyZTMpfTt2YXIgVXQsTHQ9SShcIkZ1bGxZZWFyXCIsITApO1V0PUFycmF5LnByb3RvdHlwZS5pbmRleE9mP0FycmF5LnByb3RvdHlwZS5pbmRleE9mOmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0PTA7dDx0aGlzLmxlbmd0aDsrK3QpaWYodGhpc1t0XT09PWUpcmV0dXJuIHQ7cmV0dXJuLTF9LFAoXCJNXCIsW1wiTU1cIiwyXSxcIk1vXCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tb250aCgpKzF9KSxQKFwiTU1NXCIsMCwwLGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLGUpfSksUChcIk1NTU1cIiwwLDAsZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRocyh0aGlzLGUpfSksWShcIm1vbnRoXCIsXCJNXCIpLHgoXCJtb250aFwiLDgpLEMoXCJNXCIsbXQpLEMoXCJNTVwiLG10LGR0KSxDKFwiTU1NXCIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5tb250aHNTaG9ydFJlZ2V4KGUpfSksQyhcIk1NTU1cIixmdW5jdGlvbihlLHQpe3JldHVybiB0Lm1vbnRoc1JlZ2V4KGUpfSksTChbXCJNXCIsXCJNTVwiXSxmdW5jdGlvbihlLHQpe3RbeHRdPWcoZSktMX0pLEwoW1wiTU1NXCIsXCJNTU1NXCJdLGZ1bmN0aW9uKGUsdCxuLHMpe3ZhciBpPW4uX2xvY2FsZS5tb250aHNQYXJzZShlLHMsbi5fc3RyaWN0KTtudWxsIT1pP3RbeHRdPWk6ZChuKS5pbnZhbGlkTW9udGg9ZX0pO3ZhciBOdD0vRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NPy8sR3Q9XCJKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyXCIuc3BsaXQoXCJfXCIpLFZ0PVwiSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWNcIi5zcGxpdChcIl9cIiksRXQ9a3QsSXQ9a3Q7UChcIndcIixbXCJ3d1wiLDJdLFwid29cIixcIndlZWtcIiksUChcIldcIixbXCJXV1wiLDJdLFwiV29cIixcImlzb1dlZWtcIiksWShcIndlZWtcIixcIndcIiksWShcImlzb1dlZWtcIixcIldcIikseChcIndlZWtcIiw1KSx4KFwiaXNvV2Vla1wiLDUpLEMoXCJ3XCIsbXQpLEMoXCJ3d1wiLG10LGR0KSxDKFwiV1wiLG10KSxDKFwiV1dcIixtdCxkdCksTihbXCJ3XCIsXCJ3d1wiLFwiV1wiLFwiV1dcIl0sZnVuY3Rpb24oZSx0LG4scyl7dFtzLnN1YnN0cigwLDEpXT1nKGUpfSk7UChcImRcIiwwLFwiZG9cIixcImRheVwiKSxQKFwiZGRcIiwwLDAsZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzTWluKHRoaXMsZSl9KSxQKFwiZGRkXCIsMCwwLGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsZSl9KSxQKFwiZGRkZFwiLDAsMCxmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXModGhpcyxlKX0pLFAoXCJlXCIsMCwwLFwid2Vla2RheVwiKSxQKFwiRVwiLDAsMCxcImlzb1dlZWtkYXlcIiksWShcImRheVwiLFwiZFwiKSxZKFwid2Vla2RheVwiLFwiZVwiKSxZKFwiaXNvV2Vla2RheVwiLFwiRVwiKSx4KFwiZGF5XCIsMTEpLHgoXCJ3ZWVrZGF5XCIsMTEpLHgoXCJpc29XZWVrZGF5XCIsMTEpLEMoXCJkXCIsbXQpLEMoXCJlXCIsbXQpLEMoXCJFXCIsbXQpLEMoXCJkZFwiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQud2Vla2RheXNNaW5SZWdleChlKX0pLEMoXCJkZGRcIixmdW5jdGlvbihlLHQpe3JldHVybiB0LndlZWtkYXlzU2hvcnRSZWdleChlKX0pLEMoXCJkZGRkXCIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC53ZWVrZGF5c1JlZ2V4KGUpfSksTihbXCJkZFwiLFwiZGRkXCIsXCJkZGRkXCJdLGZ1bmN0aW9uKGUsdCxuLHMpe3ZhciBpPW4uX2xvY2FsZS53ZWVrZGF5c1BhcnNlKGUscyxuLl9zdHJpY3QpO251bGwhPWk/dC5kPWk6ZChuKS5pbnZhbGlkV2Vla2RheT1lfSksTihbXCJkXCIsXCJlXCIsXCJFXCJdLGZ1bmN0aW9uKGUsdCxuLHMpe3Rbc109ZyhlKX0pO3ZhciBBdD1cIlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5XCIuc3BsaXQoXCJfXCIpLGp0PVwiU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0XCIuc3BsaXQoXCJfXCIpLFp0PVwiU3VfTW9fVHVfV2VfVGhfRnJfU2FcIi5zcGxpdChcIl9cIiksenQ9a3QsJHQ9a3QscXQ9a3Q7UChcIkhcIixbXCJISFwiLDJdLDAsXCJob3VyXCIpLFAoXCJoXCIsW1wiaGhcIiwyXSwwLHRlKSxQKFwia1wiLFtcImtrXCIsMl0sMCxmdW5jdGlvbigpe3JldHVybiB0aGlzLmhvdXJzKCl8fDI0fSksUChcImhtbVwiLDAsMCxmdW5jdGlvbigpe3JldHVyblwiXCIrdGUuYXBwbHkodGhpcykrYih0aGlzLm1pbnV0ZXMoKSwyKX0pLFAoXCJobW1zc1wiLDAsMCxmdW5jdGlvbigpe3JldHVyblwiXCIrdGUuYXBwbHkodGhpcykrYih0aGlzLm1pbnV0ZXMoKSwyKStiKHRoaXMuc2Vjb25kcygpLDIpfSksUChcIkhtbVwiLDAsMCxmdW5jdGlvbigpe3JldHVyblwiXCIrdGhpcy5ob3VycygpK2IodGhpcy5taW51dGVzKCksMil9KSxQKFwiSG1tc3NcIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm5cIlwiK3RoaXMuaG91cnMoKStiKHRoaXMubWludXRlcygpLDIpK2IodGhpcy5zZWNvbmRzKCksMil9KSxuZShcImFcIiwhMCksbmUoXCJBXCIsITEpLFkoXCJob3VyXCIsXCJoXCIpLHgoXCJob3VyXCIsMTMpLEMoXCJhXCIsc2UpLEMoXCJBXCIsc2UpLEMoXCJIXCIsbXQpLEMoXCJoXCIsbXQpLEMoXCJrXCIsbXQpLEMoXCJISFwiLG10LGR0KSxDKFwiaGhcIixtdCxkdCksQyhcImtrXCIsbXQsZHQpLEMoXCJobW1cIixfdCksQyhcImhtbXNzXCIseXQpLEMoXCJIbW1cIixfdCksQyhcIkhtbXNzXCIseXQpLEwoW1wiSFwiLFwiSEhcIl0sUHQpLEwoW1wia1wiLFwia2tcIl0sZnVuY3Rpb24oZSx0LG4pe3ZhciBzPWcoZSk7dFtQdF09MjQ9PT1zPzA6c30pLEwoW1wiYVwiLFwiQVwiXSxmdW5jdGlvbihlLHQsbil7bi5faXNQbT1uLl9sb2NhbGUuaXNQTShlKSxuLl9tZXJpZGllbT1lfSksTChbXCJoXCIsXCJoaFwiXSxmdW5jdGlvbihlLHQsbil7dFtQdF09ZyhlKSxkKG4pLmJpZ0hvdXI9ITB9KSxMKFwiaG1tXCIsZnVuY3Rpb24oZSx0LG4pe3ZhciBzPWUubGVuZ3RoLTI7dFtQdF09ZyhlLnN1YnN0cigwLHMpKSx0W1d0XT1nKGUuc3Vic3RyKHMpKSxkKG4pLmJpZ0hvdXI9ITB9KSxMKFwiaG1tc3NcIixmdW5jdGlvbihlLHQsbil7dmFyIHM9ZS5sZW5ndGgtNCxpPWUubGVuZ3RoLTI7dFtQdF09ZyhlLnN1YnN0cigwLHMpKSx0W1d0XT1nKGUuc3Vic3RyKHMsMikpLHRbSHRdPWcoZS5zdWJzdHIoaSkpLGQobikuYmlnSG91cj0hMH0pLEwoXCJIbW1cIixmdW5jdGlvbihlLHQsbil7dmFyIHM9ZS5sZW5ndGgtMjt0W1B0XT1nKGUuc3Vic3RyKDAscykpLHRbV3RdPWcoZS5zdWJzdHIocykpfSksTChcIkhtbXNzXCIsZnVuY3Rpb24oZSx0LG4pe3ZhciBzPWUubGVuZ3RoLTQsaT1lLmxlbmd0aC0yO3RbUHRdPWcoZS5zdWJzdHIoMCxzKSksdFtXdF09ZyhlLnN1YnN0cihzLDIpKSx0W0h0XT1nKGUuc3Vic3RyKGkpKX0pO3ZhciBKdCxCdD1JKFwiSG91cnNcIiwhMCksUXQ9e2NhbGVuZGFyOntzYW1lRGF5OlwiW1RvZGF5IGF0XSBMVFwiLG5leHREYXk6XCJbVG9tb3Jyb3cgYXRdIExUXCIsbmV4dFdlZWs6XCJkZGRkIFthdF0gTFRcIixsYXN0RGF5OlwiW1llc3RlcmRheSBhdF0gTFRcIixsYXN0V2VlazpcIltMYXN0XSBkZGRkIFthdF0gTFRcIixzYW1lRWxzZTpcIkxcIn0sbG9uZ0RhdGVGb3JtYXQ6e0xUUzpcImg6bW06c3MgQVwiLExUOlwiaDptbSBBXCIsTDpcIk1NL0REL1lZWVlcIixMTDpcIk1NTU0gRCwgWVlZWVwiLExMTDpcIk1NTU0gRCwgWVlZWSBoOm1tIEFcIixMTExMOlwiZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQVwifSxpbnZhbGlkRGF0ZTpcIkludmFsaWQgZGF0ZVwiLG9yZGluYWw6XCIlZFwiLGRheU9mTW9udGhPcmRpbmFsUGFyc2U6L1xcZHsxLDJ9LyxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTpcImluICVzXCIscGFzdDpcIiVzIGFnb1wiLHM6XCJhIGZldyBzZWNvbmRzXCIsc3M6XCIlZCBzZWNvbmRzXCIsbTpcImEgbWludXRlXCIsbW06XCIlZCBtaW51dGVzXCIsaDpcImFuIGhvdXJcIixoaDpcIiVkIGhvdXJzXCIsZDpcImEgZGF5XCIsZGQ6XCIlZCBkYXlzXCIsTTpcImEgbW9udGhcIixNTTpcIiVkIG1vbnRoc1wiLHk6XCJhIHllYXJcIix5eTpcIiVkIHllYXJzXCJ9LG1vbnRoczpHdCxtb250aHNTaG9ydDpWdCx3ZWVrOntkb3c6MCxkb3k6Nn0sd2Vla2RheXM6QXQsd2Vla2RheXNNaW46WnQsd2Vla2RheXNTaG9ydDpqdCxtZXJpZGllbVBhcnNlOi9bYXBdXFwuP20/XFwuPy9pfSxYdD17fSxLdD17fSxlbj0vXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pLSg/OlxcZFxcZC1cXGRcXGR8V1xcZFxcZC1cXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzo6XFxkXFxkKD86OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbXFwrXFwtXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC8sdG49L15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KSg/OlxcZFxcZFxcZFxcZHxXXFxkXFxkXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86XFxkXFxkKD86XFxkXFxkKD86Wy4sXVxcZCspPyk/KT8pKFtcXCtcXC1dXFxkXFxkKD86Oj9cXGRcXGQpP3xcXHMqWik/KT8kLyxubj0vWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy8sc249W1tcIllZWVlZWS1NTS1ERFwiLC9bKy1dXFxkezZ9LVxcZFxcZC1cXGRcXGQvXSxbXCJZWVlZLU1NLUREXCIsL1xcZHs0fS1cXGRcXGQtXFxkXFxkL10sW1wiR0dHRy1bV11XVy1FXCIsL1xcZHs0fS1XXFxkXFxkLVxcZC9dLFtcIkdHR0ctW1ddV1dcIiwvXFxkezR9LVdcXGRcXGQvLCExXSxbXCJZWVlZLURERFwiLC9cXGR7NH0tXFxkezN9L10sW1wiWVlZWS1NTVwiLC9cXGR7NH0tXFxkXFxkLywhMV0sW1wiWVlZWVlZTU1ERFwiLC9bKy1dXFxkezEwfS9dLFtcIllZWVlNTUREXCIsL1xcZHs4fS9dLFtcIkdHR0dbV11XV0VcIiwvXFxkezR9V1xcZHszfS9dLFtcIkdHR0dbV11XV1wiLC9cXGR7NH1XXFxkezJ9LywhMV0sW1wiWVlZWURERFwiLC9cXGR7N30vXV0scm49W1tcIkhIOm1tOnNzLlNTU1NcIiwvXFxkXFxkOlxcZFxcZDpcXGRcXGRcXC5cXGQrL10sW1wiSEg6bW06c3MsU1NTU1wiLC9cXGRcXGQ6XFxkXFxkOlxcZFxcZCxcXGQrL10sW1wiSEg6bW06c3NcIiwvXFxkXFxkOlxcZFxcZDpcXGRcXGQvXSxbXCJISDptbVwiLC9cXGRcXGQ6XFxkXFxkL10sW1wiSEhtbXNzLlNTU1NcIiwvXFxkXFxkXFxkXFxkXFxkXFxkXFwuXFxkKy9dLFtcIkhIbW1zcyxTU1NTXCIsL1xcZFxcZFxcZFxcZFxcZFxcZCxcXGQrL10sW1wiSEhtbXNzXCIsL1xcZFxcZFxcZFxcZFxcZFxcZC9dLFtcIkhIbW1cIiwvXFxkXFxkXFxkXFxkL10sW1wiSEhcIiwvXFxkXFxkL11dLGFuPS9eXFwvP0RhdGVcXCgoXFwtP1xcZCspL2ksb249L14oPzooTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSw/XFxzKT8oXFxkezEsMn0pXFxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxccyhcXGR7Miw0fSlcXHMoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKSk/XFxzKD86KFVUfEdNVHxbRUNNUF1bU0RdVCl8KFtael0pfChbKy1dXFxkezR9KSkkLyx1bj17VVQ6MCxHTVQ6MCxFRFQ6LTI0MCxFU1Q6LTMwMCxDRFQ6LTMwMCxDU1Q6LTM2MCxNRFQ6LTM2MCxNU1Q6LTQyMCxQRFQ6LTQyMCxQU1Q6LTQ4MH07ZS5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjaz12KFwidmFsdWUgcHJvdmlkZWQgaXMgbm90IGluIGEgcmVjb2duaXplZCBSRkMyODIyIG9yIElTTyBmb3JtYXQuIG1vbWVudCBjb25zdHJ1Y3Rpb24gZmFsbHMgYmFjayB0byBqcyBEYXRlKCksIHdoaWNoIGlzIG5vdCByZWxpYWJsZSBhY3Jvc3MgYWxsIGJyb3dzZXJzIGFuZCB2ZXJzaW9ucy4gTm9uIFJGQzI4MjIvSVNPIGRhdGUgZm9ybWF0cyBhcmUgZGlzY291cmFnZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhbiB1cGNvbWluZyBtYWpvciByZWxlYXNlLiBQbGVhc2UgcmVmZXIgdG8gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9qcy1kYXRlLyBmb3IgbW9yZSBpbmZvLlwiLGZ1bmN0aW9uKGUpe2UuX2Q9bmV3IERhdGUoZS5faSsoZS5fdXNlVVRDP1wiIFVUQ1wiOlwiXCIpKX0pLGUuSVNPXzg2MDE9ZnVuY3Rpb24oKXt9LGUuUkZDXzI4MjI9ZnVuY3Rpb24oKXt9O3ZhciBsbj12KFwibW9tZW50KCkubWluIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWF4IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC9cIixmdW5jdGlvbigpe3ZhciBlPXBlLmFwcGx5KG51bGwsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJmUuaXNWYWxpZCgpP2U8dGhpcz90aGlzOmU6YygpfSksZG49dihcIm1vbWVudCgpLm1heCBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1pbiBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvXCIsZnVuY3Rpb24oKXt2YXIgZT1wZS5hcHBseShudWxsLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiZlLmlzVmFsaWQoKT9lPnRoaXM/dGhpczplOmMoKX0pLGhuPVtcInllYXJcIixcInF1YXJ0ZXJcIixcIm1vbnRoXCIsXCJ3ZWVrXCIsXCJkYXlcIixcImhvdXJcIixcIm1pbnV0ZVwiLFwic2Vjb25kXCIsXCJtaWxsaXNlY29uZFwiXTtEZShcIlpcIixcIjpcIiksRGUoXCJaWlwiLFwiXCIpLEMoXCJaXCIsRHQpLEMoXCJaWlwiLER0KSxMKFtcIlpcIixcIlpaXCJdLGZ1bmN0aW9uKGUsdCxuKXtuLl91c2VVVEM9ITAsbi5fdHptPWtlKER0LGUpfSk7dmFyIGNuPS8oW1xcK1xcLV18XFxkXFxkKS9naTtlLnVwZGF0ZU9mZnNldD1mdW5jdGlvbigpe307dmFyIGZuPS9eKFxcLXxcXCspPyg/OihcXGQqKVsuIF0pPyhcXGQrKVxcOihcXGQrKSg/OlxcOihcXGQrKShcXC5cXGQqKT8pPyQvLG1uPS9eKC18XFwrKT9QKD86KFstK10/WzAtOSwuXSopWSk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopVyk/KD86KFstK10/WzAtOSwuXSopRCk/KD86VCg/OihbLStdP1swLTksLl0qKUgpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVMpPyk/JC87eGUuZm49dmUucHJvdG90eXBlLHhlLmludmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4geGUoTmFOKX07dmFyIF9uPVdlKDEsXCJhZGRcIikseW49V2UoLTEsXCJzdWJ0cmFjdFwiKTtlLmRlZmF1bHRGb3JtYXQ9XCJZWVlZLU1NLUREVEhIOm1tOnNzWlwiLGUuZGVmYXVsdEZvcm1hdFV0Yz1cIllZWVktTU0tRERUSEg6bW06c3NbWl1cIjt2YXIgZ249dihcIm1vbWVudCgpLmxhbmcoKSBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgbW9tZW50KCkubG9jYWxlRGF0YSgpIHRvIGdldCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbi4gVXNlIG1vbWVudCgpLmxvY2FsZSgpIHRvIGNoYW5nZSBsYW5ndWFnZXMuXCIsZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5sb2NhbGVEYXRhKCk6dGhpcy5sb2NhbGUoZSl9KTtQKDAsW1wiZ2dcIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2Vla1llYXIoKSUxMDB9KSxQKDAsW1wiR0dcIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNvV2Vla1llYXIoKSUxMDB9KSxVZShcImdnZ2dcIixcIndlZWtZZWFyXCIpLFVlKFwiZ2dnZ2dcIixcIndlZWtZZWFyXCIpLFVlKFwiR0dHR1wiLFwiaXNvV2Vla1llYXJcIiksVWUoXCJHR0dHR1wiLFwiaXNvV2Vla1llYXJcIiksWShcIndlZWtZZWFyXCIsXCJnZ1wiKSxZKFwiaXNvV2Vla1llYXJcIixcIkdHXCIpLHgoXCJ3ZWVrWWVhclwiLDEpLHgoXCJpc29XZWVrWWVhclwiLDEpLEMoXCJHXCIsTXQpLEMoXCJnXCIsTXQpLEMoXCJHR1wiLG10LGR0KSxDKFwiZ2dcIixtdCxkdCksQyhcIkdHR0dcIixwdCxjdCksQyhcImdnZ2dcIixwdCxjdCksQyhcIkdHR0dHXCIsd3QsZnQpLEMoXCJnZ2dnZ1wiLHd0LGZ0KSxOKFtcImdnZ2dcIixcImdnZ2dnXCIsXCJHR0dHXCIsXCJHR0dHR1wiXSxmdW5jdGlvbihlLHQsbixzKXt0W3Muc3Vic3RyKDAsMildPWcoZSl9KSxOKFtcImdnXCIsXCJHR1wiXSxmdW5jdGlvbih0LG4scyxpKXtuW2ldPWUucGFyc2VUd29EaWdpdFllYXIodCl9KSxQKFwiUVwiLDAsXCJRb1wiLFwicXVhcnRlclwiKSxZKFwicXVhcnRlclwiLFwiUVwiKSx4KFwicXVhcnRlclwiLDcpLEMoXCJRXCIsbHQpLEwoXCJRXCIsZnVuY3Rpb24oZSx0KXt0W3h0XT0zKihnKGUpLTEpfSksUChcIkRcIixbXCJERFwiLDJdLFwiRG9cIixcImRhdGVcIiksWShcImRhdGVcIixcIkRcIikseChcImRhdGVcIiw5KSxDKFwiRFwiLG10KSxDKFwiRERcIixtdCxkdCksQyhcIkRvXCIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT90Ll9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlfHx0Ll9vcmRpbmFsUGFyc2U6dC5fZGF5T2ZNb250aE9yZGluYWxQYXJzZUxlbmllbnR9KSxMKFtcIkRcIixcIkREXCJdLGJ0KSxMKFwiRG9cIixmdW5jdGlvbihlLHQpe3RbYnRdPWcoZS5tYXRjaChtdClbMF0pfSk7dmFyIHBuPUkoXCJEYXRlXCIsITApO1AoXCJERERcIixbXCJEREREXCIsM10sXCJERERvXCIsXCJkYXlPZlllYXJcIiksWShcImRheU9mWWVhclwiLFwiREREXCIpLHgoXCJkYXlPZlllYXJcIiw0KSxDKFwiREREXCIsZ3QpLEMoXCJEREREXCIsaHQpLEwoW1wiREREXCIsXCJEREREXCJdLGZ1bmN0aW9uKGUsdCxuKXtuLl9kYXlPZlllYXI9ZyhlKX0pLFAoXCJtXCIsW1wibW1cIiwyXSwwLFwibWludXRlXCIpLFkoXCJtaW51dGVcIixcIm1cIikseChcIm1pbnV0ZVwiLDE0KSxDKFwibVwiLG10KSxDKFwibW1cIixtdCxkdCksTChbXCJtXCIsXCJtbVwiXSxXdCk7dmFyIHduPUkoXCJNaW51dGVzXCIsITEpO1AoXCJzXCIsW1wic3NcIiwyXSwwLFwic2Vjb25kXCIpLFkoXCJzZWNvbmRcIixcInNcIikseChcInNlY29uZFwiLDE1KSxDKFwic1wiLG10KSxDKFwic3NcIixtdCxkdCksTChbXCJzXCIsXCJzc1wiXSxIdCk7dmFyIHZuPUkoXCJTZWNvbmRzXCIsITEpO1AoXCJTXCIsMCwwLGZ1bmN0aW9uKCl7cmV0dXJufn4odGhpcy5taWxsaXNlY29uZCgpLzEwMCl9KSxQKDAsW1wiU1NcIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJufn4odGhpcy5taWxsaXNlY29uZCgpLzEwKX0pLFAoMCxbXCJTU1NcIiwzXSwwLFwibWlsbGlzZWNvbmRcIiksUCgwLFtcIlNTU1NcIiw0XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDEwKnRoaXMubWlsbGlzZWNvbmQoKX0pLFAoMCxbXCJTU1NTU1wiLDVdLDAsZnVuY3Rpb24oKXtyZXR1cm4gMTAwKnRoaXMubWlsbGlzZWNvbmQoKX0pLFAoMCxbXCJTU1NTU1NcIiw2XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDFlMyp0aGlzLm1pbGxpc2Vjb25kKCl9KSxQKDAsW1wiU1NTU1NTU1wiLDddLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWU0KnRoaXMubWlsbGlzZWNvbmQoKX0pLFAoMCxbXCJTU1NTU1NTU1wiLDhdLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWU1KnRoaXMubWlsbGlzZWNvbmQoKX0pLFAoMCxbXCJTU1NTU1NTU1NcIiw5XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDFlNip0aGlzLm1pbGxpc2Vjb25kKCl9KSxZKFwibWlsbGlzZWNvbmRcIixcIm1zXCIpLHgoXCJtaWxsaXNlY29uZFwiLDE2KSxDKFwiU1wiLGd0LGx0KSxDKFwiU1NcIixndCxkdCksQyhcIlNTU1wiLGd0LGh0KTt2YXIgTW47Zm9yKE1uPVwiU1NTU1wiO01uLmxlbmd0aDw9OTtNbis9XCJTXCIpQyhNbix2dCk7Zm9yKE1uPVwiU1wiO01uLmxlbmd0aDw9OTtNbis9XCJTXCIpTChNbixOZSk7dmFyIFNuPUkoXCJNaWxsaXNlY29uZHNcIiwhMSk7UChcInpcIiwwLDAsXCJ6b25lQWJiclwiKSxQKFwienpcIiwwLDAsXCJ6b25lTmFtZVwiKTt2YXIgRG49bS5wcm90b3R5cGU7RG4uYWRkPV9uLERuLmNhbGVuZGFyPWZ1bmN0aW9uKHQsbil7dmFyIHM9dHx8cGUoKSxpPVllKHMsdGhpcykuc3RhcnRPZihcImRheVwiKSxyPWUuY2FsZW5kYXJGb3JtYXQodGhpcyxpKXx8XCJzYW1lRWxzZVwiLGE9biYmKFMobltyXSk/bltyXS5jYWxsKHRoaXMscyk6bltyXSk7cmV0dXJuIHRoaXMuZm9ybWF0KGF8fHRoaXMubG9jYWxlRGF0YSgpLmNhbGVuZGFyKHIsdGhpcyxwZShzKSkpfSxEbi5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgbSh0aGlzKX0sRG4uZGlmZj1mdW5jdGlvbihlLHQsbil7dmFyIHMsaSxyO2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gTmFOO2lmKCEocz1ZZShlLHRoaXMpKS5pc1ZhbGlkKCkpcmV0dXJuIE5hTjtzd2l0Y2goaT02ZTQqKHMudXRjT2Zmc2V0KCktdGhpcy51dGNPZmZzZXQoKSksdD1PKHQpKXtjYXNlXCJ5ZWFyXCI6cj1SZSh0aGlzLHMpLzEyO2JyZWFrO2Nhc2VcIm1vbnRoXCI6cj1SZSh0aGlzLHMpO2JyZWFrO2Nhc2VcInF1YXJ0ZXJcIjpyPVJlKHRoaXMscykvMzticmVhaztjYXNlXCJzZWNvbmRcIjpyPSh0aGlzLXMpLzFlMzticmVhaztjYXNlXCJtaW51dGVcIjpyPSh0aGlzLXMpLzZlNDticmVhaztjYXNlXCJob3VyXCI6cj0odGhpcy1zKS8zNmU1O2JyZWFrO2Nhc2VcImRheVwiOnI9KHRoaXMtcy1pKS84NjRlNTticmVhaztjYXNlXCJ3ZWVrXCI6cj0odGhpcy1zLWkpLzYwNDhlNTticmVhaztkZWZhdWx0OnI9dGhpcy1zfXJldHVybiBuP3I6eShyKX0sRG4uZW5kT2Y9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PShlPU8oZSkpfHxcIm1pbGxpc2Vjb25kXCI9PT1lP3RoaXM6KFwiZGF0ZVwiPT09ZSYmKGU9XCJkYXlcIiksdGhpcy5zdGFydE9mKGUpLmFkZCgxLFwiaXNvV2Vla1wiPT09ZT9cIndlZWtcIjplKS5zdWJ0cmFjdCgxLFwibXNcIikpfSxEbi5mb3JtYXQ9ZnVuY3Rpb24odCl7dHx8KHQ9dGhpcy5pc1V0YygpP2UuZGVmYXVsdEZvcm1hdFV0YzplLmRlZmF1bHRGb3JtYXQpO3ZhciBuPUgodGhpcyx0KTtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkucG9zdGZvcm1hdChuKX0sRG4uZnJvbT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmlzVmFsaWQoKSYmKF8oZSkmJmUuaXNWYWxpZCgpfHxwZShlKS5pc1ZhbGlkKCkpP3hlKHt0bzp0aGlzLGZyb206ZX0pLmxvY2FsZSh0aGlzLmxvY2FsZSgpKS5odW1hbml6ZSghdCk6dGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKX0sRG4uZnJvbU5vdz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5mcm9tKHBlKCksZSl9LERuLnRvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiYoXyhlKSYmZS5pc1ZhbGlkKCl8fHBlKGUpLmlzVmFsaWQoKSk/eGUoe2Zyb206dGhpcyx0bzplfSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCF0KTp0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpfSxEbi50b05vdz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50byhwZSgpLGUpfSxEbi5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9TyhlKSxTKHRoaXNbZV0pP3RoaXNbZV0oKTp0aGlzfSxEbi5pbnZhbGlkQXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZCh0aGlzKS5vdmVyZmxvd30sRG4uaXNBZnRlcj1mdW5jdGlvbihlLHQpe3ZhciBuPV8oZSk/ZTpwZShlKTtyZXR1cm4hKCF0aGlzLmlzVmFsaWQoKXx8IW4uaXNWYWxpZCgpKSYmKFwibWlsbGlzZWNvbmRcIj09PSh0PU8ocyh0KT9cIm1pbGxpc2Vjb25kXCI6dCkpP3RoaXMudmFsdWVPZigpPm4udmFsdWVPZigpOm4udmFsdWVPZigpPHRoaXMuY2xvbmUoKS5zdGFydE9mKHQpLnZhbHVlT2YoKSl9LERuLmlzQmVmb3JlPWZ1bmN0aW9uKGUsdCl7dmFyIG49XyhlKT9lOnBlKGUpO3JldHVybiEoIXRoaXMuaXNWYWxpZCgpfHwhbi5pc1ZhbGlkKCkpJiYoXCJtaWxsaXNlY29uZFwiPT09KHQ9TyhzKHQpP1wibWlsbGlzZWNvbmRcIjp0KSk/dGhpcy52YWx1ZU9mKCk8bi52YWx1ZU9mKCk6dGhpcy5jbG9uZSgpLmVuZE9mKHQpLnZhbHVlT2YoKTxuLnZhbHVlT2YoKSl9LERuLmlzQmV0d2Vlbj1mdW5jdGlvbihlLHQsbixzKXtyZXR1cm4oXCIoXCI9PT0ocz1zfHxcIigpXCIpWzBdP3RoaXMuaXNBZnRlcihlLG4pOiF0aGlzLmlzQmVmb3JlKGUsbikpJiYoXCIpXCI9PT1zWzFdP3RoaXMuaXNCZWZvcmUodCxuKTohdGhpcy5pc0FmdGVyKHQsbikpfSxEbi5pc1NhbWU9ZnVuY3Rpb24oZSx0KXt2YXIgbixzPV8oZSk/ZTpwZShlKTtyZXR1cm4hKCF0aGlzLmlzVmFsaWQoKXx8IXMuaXNWYWxpZCgpKSYmKFwibWlsbGlzZWNvbmRcIj09PSh0PU8odHx8XCJtaWxsaXNlY29uZFwiKSk/dGhpcy52YWx1ZU9mKCk9PT1zLnZhbHVlT2YoKToobj1zLnZhbHVlT2YoKSx0aGlzLmNsb25lKCkuc3RhcnRPZih0KS52YWx1ZU9mKCk8PW4mJm48PXRoaXMuY2xvbmUoKS5lbmRPZih0KS52YWx1ZU9mKCkpKX0sRG4uaXNTYW1lT3JBZnRlcj1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmlzU2FtZShlLHQpfHx0aGlzLmlzQWZ0ZXIoZSx0KX0sRG4uaXNTYW1lT3JCZWZvcmU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5pc1NhbWUoZSx0KXx8dGhpcy5pc0JlZm9yZShlLHQpfSxEbi5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIGgodGhpcyl9LERuLmxhbmc9Z24sRG4ubG9jYWxlPUNlLERuLmxvY2FsZURhdGE9RmUsRG4ubWF4PWRuLERuLm1pbj1sbixEbi5wYXJzaW5nRmxhZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gdSh7fSxkKHRoaXMpKX0sRG4uc2V0PWZ1bmN0aW9uKGUsdCl7aWYoXCJvYmplY3RcIj09dHlwZW9mIGUpZm9yKHZhciBuPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiBlKXQucHVzaCh7dW5pdDpuLHByaW9yaXR5Oml0W25dfSk7cmV0dXJuIHQuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLnByaW9yaXR5LXQucHJpb3JpdHl9KSx0fShlPVQoZSkpLHM9MDtzPG4ubGVuZ3RoO3MrKyl0aGlzW25bc10udW5pdF0oZVtuW3NdLnVuaXRdKTtlbHNlIGlmKGU9TyhlKSxTKHRoaXNbZV0pKXJldHVybiB0aGlzW2VdKHQpO3JldHVybiB0aGlzfSxEbi5zdGFydE9mPWZ1bmN0aW9uKGUpe3N3aXRjaChlPU8oZSkpe2Nhc2VcInllYXJcIjp0aGlzLm1vbnRoKDApO2Nhc2VcInF1YXJ0ZXJcIjpjYXNlXCJtb250aFwiOnRoaXMuZGF0ZSgxKTtjYXNlXCJ3ZWVrXCI6Y2FzZVwiaXNvV2Vla1wiOmNhc2VcImRheVwiOmNhc2VcImRhdGVcIjp0aGlzLmhvdXJzKDApO2Nhc2VcImhvdXJcIjp0aGlzLm1pbnV0ZXMoMCk7Y2FzZVwibWludXRlXCI6dGhpcy5zZWNvbmRzKDApO2Nhc2VcInNlY29uZFwiOnRoaXMubWlsbGlzZWNvbmRzKDApfXJldHVyblwid2Vla1wiPT09ZSYmdGhpcy53ZWVrZGF5KDApLFwiaXNvV2Vla1wiPT09ZSYmdGhpcy5pc29XZWVrZGF5KDEpLFwicXVhcnRlclwiPT09ZSYmdGhpcy5tb250aCgzKk1hdGguZmxvb3IodGhpcy5tb250aCgpLzMpKSx0aGlzfSxEbi5zdWJ0cmFjdD15bixEbi50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMueWVhcigpLHRoaXMubW9udGgoKSx0aGlzLmRhdGUoKSx0aGlzLmhvdXIoKSx0aGlzLm1pbnV0ZSgpLHRoaXMuc2Vjb25kKCksdGhpcy5taWxsaXNlY29uZCgpXX0sRG4udG9PYmplY3Q9ZnVuY3Rpb24oKXtyZXR1cm57eWVhcnM6dGhpcy55ZWFyKCksbW9udGhzOnRoaXMubW9udGgoKSxkYXRlOnRoaXMuZGF0ZSgpLGhvdXJzOnRoaXMuaG91cnMoKSxtaW51dGVzOnRoaXMubWludXRlcygpLHNlY29uZHM6dGhpcy5zZWNvbmRzKCksbWlsbGlzZWNvbmRzOnRoaXMubWlsbGlzZWNvbmRzKCl9fSxEbi50b0RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkpfSxEbi50b0lTT1N0cmluZz1mdW5jdGlvbihlKXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG51bGw7dmFyIHQ9ITAhPT1lLG49dD90aGlzLmNsb25lKCkudXRjKCk6dGhpcztyZXR1cm4gbi55ZWFyKCk8MHx8bi55ZWFyKCk+OTk5OT9IKG4sdD9cIllZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXVwiOlwiWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTWlwiKTpTKERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKT90P3RoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKTpuZXcgRGF0ZSh0aGlzLl9kLnZhbHVlT2YoKSkudG9JU09TdHJpbmcoKS5yZXBsYWNlKFwiWlwiLEgobixcIlpcIikpOkgobix0P1wiWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXVwiOlwiWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1pcIil9LERuLmluc3BlY3Q9ZnVuY3Rpb24oKXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuXCJtb21lbnQuaW52YWxpZCgvKiBcIit0aGlzLl9pK1wiICovKVwiO3ZhciBlPVwibW9tZW50XCIsdD1cIlwiO3RoaXMuaXNMb2NhbCgpfHwoZT0wPT09dGhpcy51dGNPZmZzZXQoKT9cIm1vbWVudC51dGNcIjpcIm1vbWVudC5wYXJzZVpvbmVcIix0PVwiWlwiKTt2YXIgbj1cIltcIitlKycoXCJdJyxzPTA8PXRoaXMueWVhcigpJiZ0aGlzLnllYXIoKTw9OTk5OT9cIllZWVlcIjpcIllZWVlZWVwiLGk9dCsnW1wiKV0nO3JldHVybiB0aGlzLmZvcm1hdChuK3MrXCItTU0tRERbVF1ISDptbTpzcy5TU1NcIitpKX0sRG4udG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP3RoaXMudG9JU09TdHJpbmcoKTpudWxsfSxEbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkubG9jYWxlKFwiZW5cIikuZm9ybWF0KFwiZGRkIE1NTSBERCBZWVlZIEhIOm1tOnNzIFtHTVRdWlpcIil9LERuLnVuaXg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKS8xZTMpfSxEbi52YWx1ZU9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QudmFsdWVPZigpLTZlNCoodGhpcy5fb2Zmc2V0fHwwKX0sRG4uY3JlYXRpb25EYXRhPWZ1bmN0aW9uKCl7cmV0dXJue2lucHV0OnRoaXMuX2ksZm9ybWF0OnRoaXMuX2YsbG9jYWxlOnRoaXMuX2xvY2FsZSxpc1VUQzp0aGlzLl9pc1VUQyxzdHJpY3Q6dGhpcy5fc3RyaWN0fX0sRG4ueWVhcj1MdCxEbi5pc0xlYXBZZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIEUodGhpcy55ZWFyKCkpfSxEbi53ZWVrWWVhcj1mdW5jdGlvbihlKXtyZXR1cm4gTGUuY2FsbCh0aGlzLGUsdGhpcy53ZWVrKCksdGhpcy53ZWVrZGF5KCksdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93LHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRveSl9LERuLmlzb1dlZWtZZWFyPWZ1bmN0aW9uKGUpe3JldHVybiBMZS5jYWxsKHRoaXMsZSx0aGlzLmlzb1dlZWsoKSx0aGlzLmlzb1dlZWtkYXkoKSwxLDQpfSxEbi5xdWFydGVyPURuLnF1YXJ0ZXJzPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP01hdGguY2VpbCgodGhpcy5tb250aCgpKzEpLzMpOnRoaXMubW9udGgoMyooZS0xKSt0aGlzLm1vbnRoKCklMyl9LERuLm1vbnRoPSQsRG4uZGF5c0luTW9udGg9ZnVuY3Rpb24oKXtyZXR1cm4gWih0aGlzLnllYXIoKSx0aGlzLm1vbnRoKCkpfSxEbi53ZWVrPURuLndlZWtzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7cmV0dXJuIG51bGw9PWU/dDp0aGlzLmFkZCg3KihlLXQpLFwiZFwiKX0sRG4uaXNvV2Vlaz1Ebi5pc29XZWVrcz1mdW5jdGlvbihlKXt2YXIgdD1YKHRoaXMsMSw0KS53ZWVrO3JldHVybiBudWxsPT1lP3Q6dGhpcy5hZGQoNyooZS10KSxcImRcIil9LERuLndlZWtzSW5ZZWFyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sb2NhbGVEYXRhKCkuX3dlZWs7cmV0dXJuIEsodGhpcy55ZWFyKCksZS5kb3csZS5kb3kpfSxEbi5pc29XZWVrc0luWWVhcj1mdW5jdGlvbigpe3JldHVybiBLKHRoaXMueWVhcigpLDEsNCl9LERuLmRhdGU9cG4sRG4uZGF5PURuLmRheXM9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBudWxsIT1lP3RoaXM6TmFOO3ZhciB0PXRoaXMuX2lzVVRDP3RoaXMuX2QuZ2V0VVRDRGF5KCk6dGhpcy5fZC5nZXREYXkoKTtyZXR1cm4gbnVsbCE9ZT8oZT1mdW5jdGlvbihlLHQpe3JldHVyblwic3RyaW5nXCIhPXR5cGVvZiBlP2U6aXNOYU4oZSk/XCJudW1iZXJcIj09dHlwZW9mKGU9dC53ZWVrZGF5c1BhcnNlKGUpKT9lOm51bGw6cGFyc2VJbnQoZSwxMCl9KGUsdGhpcy5sb2NhbGVEYXRhKCkpLHRoaXMuYWRkKGUtdCxcImRcIikpOnR9LERuLndlZWtkYXk9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBudWxsIT1lP3RoaXM6TmFOO3ZhciB0PSh0aGlzLmRheSgpKzctdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93KSU3O3JldHVybiBudWxsPT1lP3Q6dGhpcy5hZGQoZS10LFwiZFwiKX0sRG4uaXNvV2Vla2RheT1mdW5jdGlvbihlKXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG51bGwhPWU/dGhpczpOYU47aWYobnVsbCE9ZSl7dmFyIHQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZT90LndlZWtkYXlzUGFyc2UoZSklN3x8Nzppc05hTihlKT9udWxsOmV9KGUsdGhpcy5sb2NhbGVEYXRhKCkpO3JldHVybiB0aGlzLmRheSh0aGlzLmRheSgpJTc/dDp0LTcpfXJldHVybiB0aGlzLmRheSgpfHw3fSxEbi5kYXlPZlllYXI9ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5yb3VuZCgodGhpcy5jbG9uZSgpLnN0YXJ0T2YoXCJkYXlcIiktdGhpcy5jbG9uZSgpLnN0YXJ0T2YoXCJ5ZWFyXCIpKS84NjRlNSkrMTtyZXR1cm4gbnVsbD09ZT90OnRoaXMuYWRkKGUtdCxcImRcIil9LERuLmhvdXI9RG4uaG91cnM9QnQsRG4ubWludXRlPURuLm1pbnV0ZXM9d24sRG4uc2Vjb25kPURuLnNlY29uZHM9dm4sRG4ubWlsbGlzZWNvbmQ9RG4ubWlsbGlzZWNvbmRzPVNuLERuLnV0Y09mZnNldD1mdW5jdGlvbih0LG4scyl7dmFyIGkscj10aGlzLl9vZmZzZXR8fDA7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBudWxsIT10P3RoaXM6TmFOO2lmKG51bGwhPXQpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXtpZihudWxsPT09KHQ9a2UoRHQsdCkpKXJldHVybiB0aGlzfWVsc2UgTWF0aC5hYnModCk8MTYmJiFzJiYodCo9NjApO3JldHVybiF0aGlzLl9pc1VUQyYmbiYmKGk9T2UodGhpcykpLHRoaXMuX29mZnNldD10LHRoaXMuX2lzVVRDPSEwLG51bGwhPWkmJnRoaXMuYWRkKGksXCJtXCIpLHIhPT10JiYoIW58fHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3M/SGUodGhpcyx4ZSh0LXIsXCJtXCIpLDEsITEpOnRoaXMuX2NoYW5nZUluUHJvZ3Jlc3N8fCh0aGlzLl9jaGFuZ2VJblByb2dyZXNzPSEwLGUudXBkYXRlT2Zmc2V0KHRoaXMsITApLHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3M9bnVsbCkpLHRoaXN9cmV0dXJuIHRoaXMuX2lzVVRDP3I6T2UodGhpcyl9LERuLnV0Yz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy51dGNPZmZzZXQoMCxlKX0sRG4ubG9jYWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2lzVVRDJiYodGhpcy51dGNPZmZzZXQoMCxlKSx0aGlzLl9pc1VUQz0hMSxlJiZ0aGlzLnN1YnRyYWN0KE9lKHRoaXMpLFwibVwiKSksdGhpc30sRG4ucGFyc2Vab25lPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5fdHptKXRoaXMudXRjT2Zmc2V0KHRoaXMuX3R6bSwhMSwhMCk7ZWxzZSBpZihcInN0cmluZ1wiPT10eXBlb2YgdGhpcy5faSl7dmFyIGU9a2UoU3QsdGhpcy5faSk7bnVsbCE9ZT90aGlzLnV0Y09mZnNldChlKTp0aGlzLnV0Y09mZnNldCgwLCEwKX1yZXR1cm4gdGhpc30sRG4uaGFzQWxpZ25lZEhvdXJPZmZzZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuISF0aGlzLmlzVmFsaWQoKSYmKGU9ZT9wZShlKS51dGNPZmZzZXQoKTowLCh0aGlzLnV0Y09mZnNldCgpLWUpJTYwPT0wKX0sRG4uaXNEU1Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51dGNPZmZzZXQoKT50aGlzLmNsb25lKCkubW9udGgoMCkudXRjT2Zmc2V0KCl8fHRoaXMudXRjT2Zmc2V0KCk+dGhpcy5jbG9uZSgpLm1vbnRoKDUpLnV0Y09mZnNldCgpfSxEbi5pc0xvY2FsPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmlzVmFsaWQoKSYmIXRoaXMuX2lzVVRDfSxEbi5pc1V0Y09mZnNldD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5pc1ZhbGlkKCkmJnRoaXMuX2lzVVRDfSxEbi5pc1V0Yz1UZSxEbi5pc1VUQz1UZSxEbi56b25lQWJicj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1VUQz9cIlVUQ1wiOlwiXCJ9LERuLnpvbmVOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVVRDP1wiQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWVcIjpcIlwifSxEbi5kYXRlcz12KFwiZGF0ZXMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIGRhdGUgaW5zdGVhZC5cIixwbiksRG4ubW9udGhzPXYoXCJtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWRcIiwkKSxEbi55ZWFycz12KFwieWVhcnMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIHllYXIgaW5zdGVhZFwiLEx0KSxEbi56b25lPXYoXCJtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy96b25lL1wiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGwhPWU/KFwic3RyaW5nXCIhPXR5cGVvZiBlJiYoZT0tZSksdGhpcy51dGNPZmZzZXQoZSx0KSx0aGlzKTotdGhpcy51dGNPZmZzZXQoKX0pLERuLmlzRFNUU2hpZnRlZD12KFwiaXNEU1RTaGlmdGVkIGlzIGRlcHJlY2F0ZWQuIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RzdC1zaGlmdGVkLyBmb3IgbW9yZSBpbmZvcm1hdGlvblwiLGZ1bmN0aW9uKCl7aWYoIXModGhpcy5faXNEU1RTaGlmdGVkKSlyZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO3ZhciBlPXt9O2lmKGYoZSx0aGlzKSwoZT15ZShlKSkuX2Epe3ZhciB0PWUuX2lzVVRDP2woZS5fYSk6cGUoZS5fYSk7dGhpcy5faXNEU1RTaGlmdGVkPXRoaXMuaXNWYWxpZCgpJiZwKGUuX2EsdC50b0FycmF5KCkpPjB9ZWxzZSB0aGlzLl9pc0RTVFNoaWZ0ZWQ9ITE7cmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZH0pO3ZhciBrbj1rLnByb3RvdHlwZTtrbi5jYWxlbmRhcj1mdW5jdGlvbihlLHQsbil7dmFyIHM9dGhpcy5fY2FsZW5kYXJbZV18fHRoaXMuX2NhbGVuZGFyLnNhbWVFbHNlO3JldHVybiBTKHMpP3MuY2FsbCh0LG4pOnN9LGtuLmxvbmdEYXRlRm9ybWF0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2xvbmdEYXRlRm9ybWF0W2VdLG49dGhpcy5fbG9uZ0RhdGVGb3JtYXRbZS50b1VwcGVyQ2FzZSgpXTtyZXR1cm4gdHx8IW4/dDoodGhpcy5fbG9uZ0RhdGVGb3JtYXRbZV09bi5yZXBsYWNlKC9NTU1NfE1NfEREfGRkZGQvZyxmdW5jdGlvbihlKXtyZXR1cm4gZS5zbGljZSgxKX0pLHRoaXMuX2xvbmdEYXRlRm9ybWF0W2VdKX0sa24uaW52YWxpZERhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW52YWxpZERhdGV9LGtuLm9yZGluYWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX29yZGluYWwucmVwbGFjZShcIiVkXCIsZSl9LGtuLnByZXBhcnNlPUdlLGtuLnBvc3Rmb3JtYXQ9R2Usa24ucmVsYXRpdmVUaW1lPWZ1bmN0aW9uKGUsdCxuLHMpe3ZhciBpPXRoaXMuX3JlbGF0aXZlVGltZVtuXTtyZXR1cm4gUyhpKT9pKGUsdCxuLHMpOmkucmVwbGFjZSgvJWQvaSxlKX0sa24ucGFzdEZ1dHVyZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX3JlbGF0aXZlVGltZVtlPjA/XCJmdXR1cmVcIjpcInBhc3RcIl07cmV0dXJuIFMobik/bih0KTpuLnJlcGxhY2UoLyVzL2ksdCl9LGtuLnNldD1mdW5jdGlvbihlKXt2YXIgdCxuO2ZvcihuIGluIGUpUyh0PWVbbl0pP3RoaXNbbl09dDp0aGlzW1wiX1wiK25dPXQ7dGhpcy5fY29uZmlnPWUsdGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZUxlbmllbnQ9bmV3IFJlZ0V4cCgodGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZS5zb3VyY2V8fHRoaXMuX29yZGluYWxQYXJzZS5zb3VyY2UpK1wifFwiKy9cXGR7MSwyfS8uc291cmNlKX0sa24ubW9udGhzPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGU/dCh0aGlzLl9tb250aHMpP3RoaXMuX21vbnRoc1tlLm1vbnRoKCldOnRoaXMuX21vbnRoc1sodGhpcy5fbW9udGhzLmlzRm9ybWF0fHxOdCkudGVzdChuKT9cImZvcm1hdFwiOlwic3RhbmRhbG9uZVwiXVtlLm1vbnRoKCldOnQodGhpcy5fbW9udGhzKT90aGlzLl9tb250aHM6dGhpcy5fbW9udGhzLnN0YW5kYWxvbmV9LGtuLm1vbnRoc1Nob3J0PWZ1bmN0aW9uKGUsbil7cmV0dXJuIGU/dCh0aGlzLl9tb250aHNTaG9ydCk/dGhpcy5fbW9udGhzU2hvcnRbZS5tb250aCgpXTp0aGlzLl9tb250aHNTaG9ydFtOdC50ZXN0KG4pP1wiZm9ybWF0XCI6XCJzdGFuZGFsb25lXCJdW2UubW9udGgoKV06dCh0aGlzLl9tb250aHNTaG9ydCk/dGhpcy5fbW9udGhzU2hvcnQ6dGhpcy5fbW9udGhzU2hvcnQuc3RhbmRhbG9uZX0sa24ubW9udGhzUGFyc2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciBzLGkscjtpZih0aGlzLl9tb250aHNQYXJzZUV4YWN0KXJldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHMsaSxyLGE9ZS50b0xvY2FsZUxvd2VyQ2FzZSgpO2lmKCF0aGlzLl9tb250aHNQYXJzZSlmb3IodGhpcy5fbW9udGhzUGFyc2U9W10sdGhpcy5fbG9uZ01vbnRoc1BhcnNlPVtdLHRoaXMuX3Nob3J0TW9udGhzUGFyc2U9W10scz0wO3M8MTI7KytzKXI9bChbMmUzLHNdKSx0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW3NdPXRoaXMubW9udGhzU2hvcnQocixcIlwiKS50b0xvY2FsZUxvd2VyQ2FzZSgpLHRoaXMuX2xvbmdNb250aHNQYXJzZVtzXT10aGlzLm1vbnRocyhyLFwiXCIpLnRvTG9jYWxlTG93ZXJDYXNlKCk7cmV0dXJuIG4/XCJNTU1cIj09PXQ/LTEhPT0oaT1VdC5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsYSkpP2k6bnVsbDotMSE9PShpPVV0LmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLGEpKT9pOm51bGw6XCJNTU1cIj09PXQ/LTEhPT0oaT1VdC5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsYSkpP2k6LTEhPT0oaT1VdC5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSxhKSk/aTpudWxsOi0xIT09KGk9VXQuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsYSkpP2k6LTEhPT0oaT1VdC5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsYSkpP2k6bnVsbH0uY2FsbCh0aGlzLGUsdCxuKTtmb3IodGhpcy5fbW9udGhzUGFyc2V8fCh0aGlzLl9tb250aHNQYXJzZT1bXSx0aGlzLl9sb25nTW9udGhzUGFyc2U9W10sdGhpcy5fc2hvcnRNb250aHNQYXJzZT1bXSkscz0wO3M8MTI7cysrKXtpZihpPWwoWzJlMyxzXSksbiYmIXRoaXMuX2xvbmdNb250aHNQYXJzZVtzXSYmKHRoaXMuX2xvbmdNb250aHNQYXJzZVtzXT1uZXcgUmVnRXhwKFwiXlwiK3RoaXMubW9udGhzKGksXCJcIikucmVwbGFjZShcIi5cIixcIlwiKStcIiRcIixcImlcIiksdGhpcy5fc2hvcnRNb250aHNQYXJzZVtzXT1uZXcgUmVnRXhwKFwiXlwiK3RoaXMubW9udGhzU2hvcnQoaSxcIlwiKS5yZXBsYWNlKFwiLlwiLFwiXCIpK1wiJFwiLFwiaVwiKSksbnx8dGhpcy5fbW9udGhzUGFyc2Vbc118fChyPVwiXlwiK3RoaXMubW9udGhzKGksXCJcIikrXCJ8XlwiK3RoaXMubW9udGhzU2hvcnQoaSxcIlwiKSx0aGlzLl9tb250aHNQYXJzZVtzXT1uZXcgUmVnRXhwKHIucmVwbGFjZShcIi5cIixcIlwiKSxcImlcIikpLG4mJlwiTU1NTVwiPT09dCYmdGhpcy5fbG9uZ01vbnRoc1BhcnNlW3NdLnRlc3QoZSkpcmV0dXJuIHM7aWYobiYmXCJNTU1cIj09PXQmJnRoaXMuX3Nob3J0TW9udGhzUGFyc2Vbc10udGVzdChlKSlyZXR1cm4gcztpZighbiYmdGhpcy5fbW9udGhzUGFyc2Vbc10udGVzdChlKSlyZXR1cm4gc319LGtuLm1vbnRoc1JlZ2V4PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9tb250aHNQYXJzZUV4YWN0PyhvKHRoaXMsXCJfbW9udGhzUmVnZXhcIil8fHEuY2FsbCh0aGlzKSxlP3RoaXMuX21vbnRoc1N0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1JlZ2V4KToobyh0aGlzLFwiX21vbnRoc1JlZ2V4XCIpfHwodGhpcy5fbW9udGhzUmVnZXg9SXQpLHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4JiZlP3RoaXMuX21vbnRoc1N0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1JlZ2V4KX0sa24ubW9udGhzU2hvcnRSZWdleD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbW9udGhzUGFyc2VFeGFjdD8obyh0aGlzLFwiX21vbnRoc1JlZ2V4XCIpfHxxLmNhbGwodGhpcyksZT90aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1Nob3J0UmVnZXgpOihvKHRoaXMsXCJfbW9udGhzU2hvcnRSZWdleFwiKXx8KHRoaXMuX21vbnRoc1Nob3J0UmVnZXg9RXQpLHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXgmJmU/dGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDp0aGlzLl9tb250aHNTaG9ydFJlZ2V4KX0sa24ud2Vlaz1mdW5jdGlvbihlKXtyZXR1cm4gWChlLHRoaXMuX3dlZWsuZG93LHRoaXMuX3dlZWsuZG95KS53ZWVrfSxrbi5maXJzdERheU9mWWVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl93ZWVrLmRveX0sa24uZmlyc3REYXlPZldlZWs9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd2Vlay5kb3d9LGtuLndlZWtkYXlzPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGU/dCh0aGlzLl93ZWVrZGF5cyk/dGhpcy5fd2Vla2RheXNbZS5kYXkoKV06dGhpcy5fd2Vla2RheXNbdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChuKT9cImZvcm1hdFwiOlwic3RhbmRhbG9uZVwiXVtlLmRheSgpXTp0KHRoaXMuX3dlZWtkYXlzKT90aGlzLl93ZWVrZGF5czp0aGlzLl93ZWVrZGF5cy5zdGFuZGFsb25lfSxrbi53ZWVrZGF5c01pbj1mdW5jdGlvbihlKXtyZXR1cm4gZT90aGlzLl93ZWVrZGF5c01pbltlLmRheSgpXTp0aGlzLl93ZWVrZGF5c01pbn0sa24ud2Vla2RheXNTaG9ydD1mdW5jdGlvbihlKXtyZXR1cm4gZT90aGlzLl93ZWVrZGF5c1Nob3J0W2UuZGF5KCldOnRoaXMuX3dlZWtkYXlzU2hvcnR9LGtuLndlZWtkYXlzUGFyc2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciBzLGkscjtpZih0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpcmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgcyxpLHIsYT1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7aWYoIXRoaXMuX3dlZWtkYXlzUGFyc2UpZm9yKHRoaXMuX3dlZWtkYXlzUGFyc2U9W10sdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlPVtdLHRoaXMuX21pbldlZWtkYXlzUGFyc2U9W10scz0wO3M8NzsrK3Mpcj1sKFsyZTMsMV0pLmRheShzKSx0aGlzLl9taW5XZWVrZGF5c1BhcnNlW3NdPXRoaXMud2Vla2RheXNNaW4ocixcIlwiKS50b0xvY2FsZUxvd2VyQ2FzZSgpLHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtzXT10aGlzLndlZWtkYXlzU2hvcnQocixcIlwiKS50b0xvY2FsZUxvd2VyQ2FzZSgpLHRoaXMuX3dlZWtkYXlzUGFyc2Vbc109dGhpcy53ZWVrZGF5cyhyLFwiXCIpLnRvTG9jYWxlTG93ZXJDYXNlKCk7cmV0dXJuIG4/XCJkZGRkXCI9PT10Py0xIT09KGk9VXQuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLGEpKT9pOm51bGw6XCJkZGRcIj09PXQ/LTEhPT0oaT1VdC5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSxhKSk/aTpudWxsOi0xIT09KGk9VXQuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLGEpKT9pOm51bGw6XCJkZGRkXCI9PT10Py0xIT09KGk9VXQuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLGEpKT9pOi0xIT09KGk9VXQuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsYSkpP2k6LTEhPT0oaT1VdC5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsYSkpP2k6bnVsbDpcImRkZFwiPT09dD8tMSE9PShpPVV0LmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLGEpKT9pOi0xIT09KGk9VXQuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLGEpKT9pOi0xIT09KGk9VXQuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLGEpKT9pOm51bGw6LTEhPT0oaT1VdC5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsYSkpP2k6LTEhPT0oaT1VdC5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsYSkpP2k6LTEhPT0oaT1VdC5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSxhKSk/aTpudWxsfS5jYWxsKHRoaXMsZSx0LG4pO2Zvcih0aGlzLl93ZWVrZGF5c1BhcnNlfHwodGhpcy5fd2Vla2RheXNQYXJzZT1bXSx0aGlzLl9taW5XZWVrZGF5c1BhcnNlPVtdLHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZT1bXSx0aGlzLl9mdWxsV2Vla2RheXNQYXJzZT1bXSkscz0wO3M8NztzKyspe2lmKGk9bChbMmUzLDFdKS5kYXkocyksbiYmIXRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW3NdJiYodGhpcy5fZnVsbFdlZWtkYXlzUGFyc2Vbc109bmV3IFJlZ0V4cChcIl5cIit0aGlzLndlZWtkYXlzKGksXCJcIikucmVwbGFjZShcIi5cIixcIi4/XCIpK1wiJFwiLFwiaVwiKSx0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2Vbc109bmV3IFJlZ0V4cChcIl5cIit0aGlzLndlZWtkYXlzU2hvcnQoaSxcIlwiKS5yZXBsYWNlKFwiLlwiLFwiLj9cIikrXCIkXCIsXCJpXCIpLHRoaXMuX21pbldlZWtkYXlzUGFyc2Vbc109bmV3IFJlZ0V4cChcIl5cIit0aGlzLndlZWtkYXlzTWluKGksXCJcIikucmVwbGFjZShcIi5cIixcIi4/XCIpK1wiJFwiLFwiaVwiKSksdGhpcy5fd2Vla2RheXNQYXJzZVtzXXx8KHI9XCJeXCIrdGhpcy53ZWVrZGF5cyhpLFwiXCIpK1wifF5cIit0aGlzLndlZWtkYXlzU2hvcnQoaSxcIlwiKStcInxeXCIrdGhpcy53ZWVrZGF5c01pbihpLFwiXCIpLHRoaXMuX3dlZWtkYXlzUGFyc2Vbc109bmV3IFJlZ0V4cChyLnJlcGxhY2UoXCIuXCIsXCJcIiksXCJpXCIpKSxuJiZcImRkZGRcIj09PXQmJnRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW3NdLnRlc3QoZSkpcmV0dXJuIHM7aWYobiYmXCJkZGRcIj09PXQmJnRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtzXS50ZXN0KGUpKXJldHVybiBzO2lmKG4mJlwiZGRcIj09PXQmJnRoaXMuX21pbldlZWtkYXlzUGFyc2Vbc10udGVzdChlKSlyZXR1cm4gcztpZighbiYmdGhpcy5fd2Vla2RheXNQYXJzZVtzXS50ZXN0KGUpKXJldHVybiBzfX0sa24ud2Vla2RheXNSZWdleD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0PyhvKHRoaXMsXCJfd2Vla2RheXNSZWdleFwiKXx8ZWUuY2FsbCh0aGlzKSxlP3RoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNSZWdleCk6KG8odGhpcyxcIl93ZWVrZGF5c1JlZ2V4XCIpfHwodGhpcy5fd2Vla2RheXNSZWdleD16dCksdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCYmZT90aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzUmVnZXgpfSxrbi53ZWVrZGF5c1Nob3J0UmVnZXg9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdD8obyh0aGlzLFwiX3dlZWtkYXlzUmVnZXhcIil8fGVlLmNhbGwodGhpcyksZT90aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4KToobyh0aGlzLFwiX3dlZWtkYXlzU2hvcnRSZWdleFwiKXx8KHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleD0kdCksdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4JiZlP3RoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleDp0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXgpfSxrbi53ZWVrZGF5c01pblJlZ2V4PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3Q/KG8odGhpcyxcIl93ZWVrZGF5c1JlZ2V4XCIpfHxlZS5jYWxsKHRoaXMpLGU/dGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDp0aGlzLl93ZWVrZGF5c01pblJlZ2V4KToobyh0aGlzLFwiX3dlZWtkYXlzTWluUmVnZXhcIil8fCh0aGlzLl93ZWVrZGF5c01pblJlZ2V4PXF0KSx0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4JiZlP3RoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNNaW5SZWdleCl9LGtuLmlzUE09ZnVuY3Rpb24oZSl7cmV0dXJuXCJwXCI9PT0oZStcIlwiKS50b0xvd2VyQ2FzZSgpLmNoYXJBdCgwKX0sa24ubWVyaWRpZW09ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPjExP24/XCJwbVwiOlwiUE1cIjpuP1wiYW1cIjpcIkFNXCJ9LGFlKFwiZW5cIix7ZGF5T2ZNb250aE9yZGluYWxQYXJzZTovXFxkezEsMn0odGh8c3R8bmR8cmQpLyxvcmRpbmFsOmZ1bmN0aW9uKGUpe3ZhciB0PWUlMTA7cmV0dXJuIGUrKDE9PT1nKGUlMTAwLzEwKT9cInRoXCI6MT09PXQ/XCJzdFwiOjI9PT10P1wibmRcIjozPT09dD9cInJkXCI6XCJ0aFwiKX19KSxlLmxhbmc9dihcIm1vbWVudC5sYW5nIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlIGluc3RlYWQuXCIsYWUpLGUubGFuZ0RhdGE9dihcIm1vbWVudC5sYW5nRGF0YSBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZURhdGEgaW5zdGVhZC5cIix1ZSk7dmFyIFluPU1hdGguYWJzLE9uPSRlKFwibXNcIiksVG49JGUoXCJzXCIpLHhuPSRlKFwibVwiKSxibj0kZShcImhcIiksUG49JGUoXCJkXCIpLFduPSRlKFwid1wiKSxIbj0kZShcIk1cIiksUm49JGUoXCJ5XCIpLENuPXFlKFwibWlsbGlzZWNvbmRzXCIpLEZuPXFlKFwic2Vjb25kc1wiKSxVbj1xZShcIm1pbnV0ZXNcIiksTG49cWUoXCJob3Vyc1wiKSxObj1xZShcImRheXNcIiksR249cWUoXCJtb250aHNcIiksVm49cWUoXCJ5ZWFyc1wiKSxFbj1NYXRoLnJvdW5kLEluPXtzczo0NCxzOjQ1LG06NDUsaDoyMixkOjI2LE06MTF9LEFuPU1hdGguYWJzLGpuPXZlLnByb3RvdHlwZTtyZXR1cm4gam4uaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1ZhbGlkfSxqbi5hYnM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9kYXRhO3JldHVybiB0aGlzLl9taWxsaXNlY29uZHM9WW4odGhpcy5fbWlsbGlzZWNvbmRzKSx0aGlzLl9kYXlzPVluKHRoaXMuX2RheXMpLHRoaXMuX21vbnRocz1Zbih0aGlzLl9tb250aHMpLGUubWlsbGlzZWNvbmRzPVluKGUubWlsbGlzZWNvbmRzKSxlLnNlY29uZHM9WW4oZS5zZWNvbmRzKSxlLm1pbnV0ZXM9WW4oZS5taW51dGVzKSxlLmhvdXJzPVluKGUuaG91cnMpLGUubW9udGhzPVluKGUubW9udGhzKSxlLnllYXJzPVluKGUueWVhcnMpLHRoaXN9LGpuLmFkZD1mdW5jdGlvbihlLHQpe3JldHVybiBBZSh0aGlzLGUsdCwxKX0sam4uc3VidHJhY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gQWUodGhpcyxlLHQsLTEpfSxqbi5hcz1mdW5jdGlvbihlKXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIE5hTjt2YXIgdCxuLHM9dGhpcy5fbWlsbGlzZWNvbmRzO2lmKFwibW9udGhcIj09PShlPU8oZSkpfHxcInllYXJcIj09PWUpcmV0dXJuIHQ9dGhpcy5fZGF5cytzLzg2NGU1LG49dGhpcy5fbW9udGhzK1plKHQpLFwibW9udGhcIj09PWU/bjpuLzEyO3N3aXRjaCh0PXRoaXMuX2RheXMrTWF0aC5yb3VuZCh6ZSh0aGlzLl9tb250aHMpKSxlKXtjYXNlXCJ3ZWVrXCI6cmV0dXJuIHQvNytzLzYwNDhlNTtjYXNlXCJkYXlcIjpyZXR1cm4gdCtzLzg2NGU1O2Nhc2VcImhvdXJcIjpyZXR1cm4gMjQqdCtzLzM2ZTU7Y2FzZVwibWludXRlXCI6cmV0dXJuIDE0NDAqdCtzLzZlNDtjYXNlXCJzZWNvbmRcIjpyZXR1cm4gODY0MDAqdCtzLzFlMztjYXNlXCJtaWxsaXNlY29uZFwiOnJldHVybiBNYXRoLmZsb29yKDg2NGU1KnQpK3M7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHVuaXQgXCIrZSl9fSxqbi5hc01pbGxpc2Vjb25kcz1Pbixqbi5hc1NlY29uZHM9VG4sam4uYXNNaW51dGVzPXhuLGpuLmFzSG91cnM9Ym4sam4uYXNEYXlzPVBuLGpuLmFzV2Vla3M9V24sam4uYXNNb250aHM9SG4sam4uYXNZZWFycz1Sbixqbi52YWx1ZU9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP3RoaXMuX21pbGxpc2Vjb25kcys4NjRlNSp0aGlzLl9kYXlzK3RoaXMuX21vbnRocyUxMioyNTkyZTYrMzE1MzZlNipnKHRoaXMuX21vbnRocy8xMik6TmFOfSxqbi5fYnViYmxlPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHMsaSxyPXRoaXMuX21pbGxpc2Vjb25kcyxhPXRoaXMuX2RheXMsbz10aGlzLl9tb250aHMsdT10aGlzLl9kYXRhO3JldHVybiByPj0wJiZhPj0wJiZvPj0wfHxyPD0wJiZhPD0wJiZvPD0wfHwocis9ODY0ZTUqamUoemUobykrYSksYT0wLG89MCksdS5taWxsaXNlY29uZHM9ciUxZTMsZT15KHIvMWUzKSx1LnNlY29uZHM9ZSU2MCx0PXkoZS82MCksdS5taW51dGVzPXQlNjAsbj15KHQvNjApLHUuaG91cnM9biUyNCxhKz15KG4vMjQpLGk9eShaZShhKSksbys9aSxhLT1qZSh6ZShpKSkscz15KG8vMTIpLG8lPTEyLHUuZGF5cz1hLHUubW9udGhzPW8sdS55ZWFycz1zLHRoaXN9LGpuLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIHhlKHRoaXMpfSxqbi5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9TyhlKSx0aGlzLmlzVmFsaWQoKT90aGlzW2UrXCJzXCJdKCk6TmFOfSxqbi5taWxsaXNlY29uZHM9Q24sam4uc2Vjb25kcz1Gbixqbi5taW51dGVzPVVuLGpuLmhvdXJzPUxuLGpuLmRheXM9Tm4sam4ud2Vla3M9ZnVuY3Rpb24oKXtyZXR1cm4geSh0aGlzLmRheXMoKS83KX0sam4ubW9udGhzPUduLGpuLnllYXJzPVZuLGpuLmh1bWFuaXplPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTt2YXIgdD10aGlzLmxvY2FsZURhdGEoKSxuPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz14ZShlKS5hYnMoKSxpPUVuKHMuYXMoXCJzXCIpKSxyPUVuKHMuYXMoXCJtXCIpKSxhPUVuKHMuYXMoXCJoXCIpKSxvPUVuKHMuYXMoXCJkXCIpKSx1PUVuKHMuYXMoXCJNXCIpKSxsPUVuKHMuYXMoXCJ5XCIpKSxkPWk8PUluLnNzJiZbXCJzXCIsaV18fGk8SW4ucyYmW1wic3NcIixpXXx8cjw9MSYmW1wibVwiXXx8cjxJbi5tJiZbXCJtbVwiLHJdfHxhPD0xJiZbXCJoXCJdfHxhPEluLmgmJltcImhoXCIsYV18fG88PTEmJltcImRcIl18fG88SW4uZCYmW1wiZGRcIixvXXx8dTw9MSYmW1wiTVwiXXx8dTxJbi5NJiZbXCJNTVwiLHVdfHxsPD0xJiZbXCJ5XCJdfHxbXCJ5eVwiLGxdO3JldHVybiBkWzJdPXQsZFszXT0rZT4wLGRbNF09bixmdW5jdGlvbihlLHQsbixzLGkpe3JldHVybiBpLnJlbGF0aXZlVGltZSh0fHwxLCEhbixlLHMpfS5hcHBseShudWxsLGQpfSh0aGlzLCFlLHQpO3JldHVybiBlJiYobj10LnBhc3RGdXR1cmUoK3RoaXMsbikpLHQucG9zdGZvcm1hdChuKX0sam4udG9JU09TdHJpbmc9QmUsam4udG9TdHJpbmc9QmUsam4udG9KU09OPUJlLGpuLmxvY2FsZT1DZSxqbi5sb2NhbGVEYXRhPUZlLGpuLnRvSXNvU3RyaW5nPXYoXCJ0b0lzb1N0cmluZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdG9JU09TdHJpbmcoKSBpbnN0ZWFkIChub3RpY2UgdGhlIGNhcGl0YWxzKVwiLEJlKSxqbi5sYW5nPWduLFAoXCJYXCIsMCwwLFwidW5peFwiKSxQKFwieFwiLDAsMCxcInZhbHVlT2ZcIiksQyhcInhcIixNdCksQyhcIlhcIiwvWystXT9cXGQrKFxcLlxcZHsxLDN9KT8vKSxMKFwiWFwiLGZ1bmN0aW9uKGUsdCxuKXtuLl9kPW5ldyBEYXRlKDFlMypwYXJzZUZsb2F0KGUsMTApKX0pLEwoXCJ4XCIsZnVuY3Rpb24oZSx0LG4pe24uX2Q9bmV3IERhdGUoZyhlKSl9KSxlLnZlcnNpb249XCIyLjIwLjFcIixmdW5jdGlvbihlKXtRZT1lfShwZSksZS5mbj1EbixlLm1pbj1mdW5jdGlvbigpe3JldHVybiB3ZShcImlzQmVmb3JlXCIsW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpfSxlLm1heD1mdW5jdGlvbigpe3JldHVybiB3ZShcImlzQWZ0ZXJcIixbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSl9LGUubm93PWZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93P0RhdGUubm93KCk6K25ldyBEYXRlfSxlLnV0Yz1sLGUudW5peD1mdW5jdGlvbihlKXtyZXR1cm4gcGUoMWUzKmUpfSxlLm1vbnRocz1mdW5jdGlvbihlLHQpe3JldHVybiBFZShlLHQsXCJtb250aHNcIil9LGUuaXNEYXRlPXIsZS5sb2NhbGU9YWUsZS5pbnZhbGlkPWMsZS5kdXJhdGlvbj14ZSxlLmlzTW9tZW50PV8sZS53ZWVrZGF5cz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEllKGUsdCxuLFwid2Vla2RheXNcIil9LGUucGFyc2Vab25lPWZ1bmN0aW9uKCl7cmV0dXJuIHBlLmFwcGx5KG51bGwsYXJndW1lbnRzKS5wYXJzZVpvbmUoKX0sZS5sb2NhbGVEYXRhPXVlLGUuaXNEdXJhdGlvbj1NZSxlLm1vbnRoc1Nob3J0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEVlKGUsdCxcIm1vbnRoc1Nob3J0XCIpfSxlLndlZWtkYXlzTWluPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gSWUoZSx0LG4sXCJ3ZWVrZGF5c01pblwiKX0sZS5kZWZpbmVMb2NhbGU9b2UsZS51cGRhdGVMb2NhbGU9ZnVuY3Rpb24oZSx0KXtpZihudWxsIT10KXt2YXIgbixzLGk9UXQ7bnVsbCE9KHM9cmUoZSkpJiYoaT1zLl9jb25maWcpLChuPW5ldyBrKHQ9RChpLHQpKSkucGFyZW50TG9jYWxlPVh0W2VdLFh0W2VdPW4sYWUoZSl9ZWxzZSBudWxsIT1YdFtlXSYmKG51bGwhPVh0W2VdLnBhcmVudExvY2FsZT9YdFtlXT1YdFtlXS5wYXJlbnRMb2NhbGU6bnVsbCE9WHRbZV0mJmRlbGV0ZSBYdFtlXSk7cmV0dXJuIFh0W2VdfSxlLmxvY2FsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbnQoWHQpfSxlLndlZWtkYXlzU2hvcnQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBJZShlLHQsbixcIndlZWtkYXlzU2hvcnRcIil9LGUubm9ybWFsaXplVW5pdHM9TyxlLnJlbGF0aXZlVGltZVJvdW5kaW5nPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP0VuOlwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJihFbj1lLCEwKX0sZS5yZWxhdGl2ZVRpbWVUaHJlc2hvbGQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwIT09SW5bZV0mJih2b2lkIDA9PT10P0luW2VdOihJbltlXT10LFwic1wiPT09ZSYmKEluLnNzPXQtMSksITApKX0sZS5jYWxlbmRhckZvcm1hdD1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZGlmZih0LFwiZGF5c1wiLCEwKTtyZXR1cm4gbjwtNj9cInNhbWVFbHNlXCI6bjwtMT9cImxhc3RXZWVrXCI6bjwwP1wibGFzdERheVwiOm48MT9cInNhbWVEYXlcIjpuPDI/XCJuZXh0RGF5XCI6bjw3P1wibmV4dFdlZWtcIjpcInNhbWVFbHNlXCJ9LGUucHJvdG90eXBlPURuLGUuSFRNTDVfRk1UPXtEQVRFVElNRV9MT0NBTDpcIllZWVktTU0tRERUSEg6bW1cIixEQVRFVElNRV9MT0NBTF9TRUNPTkRTOlwiWVlZWS1NTS1ERFRISDptbTpzc1wiLERBVEVUSU1FX0xPQ0FMX01TOlwiWVlZWS1NTS1ERFRISDptbTpzcy5TU1NcIixEQVRFOlwiWVlZWS1NTS1ERFwiLFRJTUU6XCJISDptbVwiLFRJTUVfU0VDT05EUzpcIkhIOm1tOnNzXCIsVElNRV9NUzpcIkhIOm1tOnNzLlNTU1wiLFdFRUs6XCJZWVlZLVtXXVdXXCIsTU9OVEg6XCJZWVlZLU1NXCJ9LGV9KTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3ZlbmRvci9hbG1hc2FlZWQyMDEwL2FkbWlubHRlL2Jvd2VyX2NvbXBvbmVudHMvbW9tZW50L21pbi9tb21lbnQubWluLmpzXG4vLyBtb2R1bGUgaWQgPSA1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDEiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///57\n");
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n* @version: 2.1.27\n* @author: Dan Grossman http://www.dangrossman.info/\n* @copyright: Copyright (c) 2012-2017 Dan Grossman. All rights reserved.\n* @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php\n* @website: http://www.daterangepicker.com/\n*/\n// Follow the UMD template https://github.com/umdjs/umd/blob/master/templates/returnExportsGlobal.js\n(function (root, factory) {\n if (true) {\n // AMD. Make globaly available as well\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [!(function webpackMissingModule() { var e = new Error(\"Cannot find module \\\"moment\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e; }()), __webpack_require__(1)], __WEBPACK_AMD_DEFINE_RESULT__ = (function (moment, jquery) {\n if (!jquery.fn) jquery.fn = {}; // webpack server rendering\n return factory(moment, jquery);\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if (typeof module === 'object' && module.exports) {\n // Node / Browserify\n //isomorphic issue\n var jQuery = (typeof window != 'undefined') ? window.jQuery : undefined;\n if (!jQuery) {\n jQuery = require('jquery');\n if (!jQuery.fn) jQuery.fn = {};\n }\n var moment = (typeof window != 'undefined' && typeof window.moment != 'undefined') ? window.moment : require('moment');\n module.exports = factory(moment, jQuery);\n } else {\n // Browser globals\n root.daterangepicker = factory(root.moment, root.jQuery);\n }\n}(this, function(moment, $) {\n var DateRangePicker = function(element, options, cb) {\n\n //default settings for options\n this.parentEl = 'body';\n this.element = $(element);\n this.startDate = moment().startOf('day');\n this.endDate = moment().endOf('day');\n this.minDate = false;\n this.maxDate = false;\n this.dateLimit = false;\n this.autoApply = false;\n this.singleDatePicker = false;\n this.showDropdowns = false;\n this.showWeekNumbers = false;\n this.showISOWeekNumbers = false;\n this.showCustomRangeLabel = true;\n this.timePicker = false;\n this.timePicker24Hour = false;\n this.timePickerIncrement = 1;\n this.timePickerSeconds = false;\n this.linkedCalendars = true;\n this.autoUpdateInput = true;\n this.alwaysShowCalendars = false;\n this.ranges = {};\n\n this.opens = 'right';\n if (this.element.hasClass('pull-right'))\n this.opens = 'left';\n\n this.drops = 'down';\n if (this.element.hasClass('dropup'))\n this.drops = 'up';\n\n this.buttonClasses = 'btn btn-sm';\n this.applyClass = 'btn-success';\n this.cancelClass = 'btn-default';\n\n this.locale = {\n direction: 'ltr',\n format: moment.localeData().longDateFormat('L'),\n separator: ' - ',\n applyLabel: 'Apply',\n cancelLabel: 'Cancel',\n weekLabel: 'W',\n customRangeLabel: 'Custom Range',\n daysOfWeek: moment.weekdaysMin(),\n monthNames: moment.monthsShort(),\n firstDay: moment.localeData().firstDayOfWeek()\n };\n\n this.callback = function() { };\n\n //some state information\n this.isShowing = false;\n this.leftCalendar = {};\n this.rightCalendar = {};\n\n //custom options from user\n if (typeof options !== 'object' || options === null)\n options = {};\n\n //allow setting options with data attributes\n //data-api options will be overwritten with custom javascript options\n options = $.extend(this.element.data(), options);\n\n //html template for the picker UI\n if (typeof options.template !== 'string' && !(options.template instanceof $))\n options.template = '<div class=\"daterangepicker dropdown-menu\">' +\n '<div class=\"calendar left\">' +\n '<div class=\"daterangepicker_input\">' +\n '<input class=\"input-mini form-control\" type=\"text\" name=\"daterangepicker_start\" value=\"\" />' +\n '<i class=\"fa fa-calendar glyphicon glyphicon-calendar\"></i>' +\n '<div class=\"calendar-time\">' +\n '<div></div>' +\n '<i class=\"fa fa-clock-o glyphicon glyphicon-time\"></i>' +\n '</div>' +\n '</div>' +\n '<div class=\"calendar-table\"></div>' +\n '</div>' +\n '<div class=\"calendar right\">' +\n '<div class=\"daterangepicker_input\">' +\n '<input class=\"input-mini form-control\" type=\"text\" name=\"daterangepicker_end\" value=\"\" />' +\n '<i class=\"fa fa-calendar glyphicon glyphicon-calendar\"></i>' +\n '<div class=\"calendar-time\">' +\n '<div></div>' +\n '<i class=\"fa fa-clock-o glyphicon glyphicon-time\"></i>' +\n '</div>' +\n '</div>' +\n '<div class=\"calendar-table\"></div>' +\n '</div>' +\n '<div class=\"ranges\">' +\n '<div class=\"range_inputs\">' +\n '<button class=\"applyBtn\" disabled=\"disabled\" type=\"button\"></button> ' +\n '<button class=\"cancelBtn\" type=\"button\"></button>' +\n '</div>' +\n '</div>' +\n '</div>';\n\n this.parentEl = (options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl);\n this.container = $(options.template).appendTo(this.parentEl);\n\n //\n // handle all the possible options overriding defaults\n //\n\n if (typeof options.locale === 'object') {\n\n if (typeof options.locale.direction === 'string')\n this.locale.direction = options.locale.direction;\n\n if (typeof options.locale.format === 'string')\n this.locale.format = options.locale.format;\n\n if (typeof options.locale.separator === 'string')\n this.locale.separator = options.locale.separator;\n\n if (typeof options.locale.daysOfWeek === 'object')\n this.locale.daysOfWeek = options.locale.daysOfWeek.slice();\n\n if (typeof options.locale.monthNames === 'object')\n this.locale.monthNames = options.locale.monthNames.slice();\n\n if (typeof options.locale.firstDay === 'number')\n this.locale.firstDay = options.locale.firstDay;\n\n if (typeof options.locale.applyLabel === 'string')\n this.locale.applyLabel = options.locale.applyLabel;\n\n if (typeof options.locale.cancelLabel === 'string')\n this.locale.cancelLabel = options.locale.cancelLabel;\n\n if (typeof options.locale.weekLabel === 'string')\n this.locale.weekLabel = options.locale.weekLabel;\n\n if (typeof options.locale.customRangeLabel === 'string'){\n //Support unicode chars in the custom range name.\n var elem = document.createElement('textarea');\n elem.innerHTML = options.locale.customRangeLabel;\n var rangeHtml = elem.value;\n this.locale.customRangeLabel = rangeHtml;\n }\n }\n this.container.addClass(this.locale.direction);\n\n if (typeof options.startDate === 'string')\n this.startDate = moment(options.startDate, this.locale.format);\n\n if (typeof options.endDate === 'string')\n this.endDate = moment(options.endDate, this.locale.format);\n\n if (typeof options.minDate === 'string')\n this.minDate = moment(options.minDate, this.locale.format);\n\n if (typeof options.maxDate === 'string')\n this.maxDate = moment(options.maxDate, this.locale.format);\n\n if (typeof options.startDate === 'object')\n this.startDate = moment(options.startDate);\n\n if (typeof options.endDate === 'object')\n this.endDate = moment(options.endDate);\n\n if (typeof options.minDate === 'object')\n this.minDate = moment(options.minDate);\n\n if (typeof options.maxDate === 'object')\n this.maxDate = moment(options.maxDate);\n\n // sanity check for bad options\n if (this.minDate && this.startDate.isBefore(this.minDate))\n this.startDate = this.minDate.clone();\n\n // sanity check for bad options\n if (this.maxDate && this.endDate.isAfter(this.maxDate))\n this.endDate = this.maxDate.clone();\n\n if (typeof options.applyClass === 'string')\n this.applyClass = options.applyClass;\n\n if (typeof options.cancelClass === 'string')\n this.cancelClass = options.cancelClass;\n\n if (typeof options.dateLimit === 'object')\n this.dateLimit = options.dateLimit;\n\n if (typeof options.opens === 'string')\n this.opens = options.opens;\n\n if (typeof options.drops === 'string')\n this.drops = options.drops;\n\n if (typeof options.showWeekNumbers === 'boolean')\n this.showWeekNumbers = options.showWeekNumbers;\n\n if (typeof options.showISOWeekNumbers === 'boolean')\n this.showISOWeekNumbers = options.showISOWeekNumbers;\n\n if (typeof options.buttonClasses === 'string')\n this.buttonClasses = options.buttonClasses;\n\n if (typeof options.buttonClasses === 'object')\n this.buttonClasses = options.buttonClasses.join(' ');\n\n if (typeof options.showDropdowns === 'boolean')\n this.showDropdowns = options.showDropdowns;\n\n if (typeof options.showCustomRangeLabel === 'boolean')\n this.showCustomRangeLabel = options.showCustomRangeLabel;\n\n if (typeof options.singleDatePicker === 'boolean') {\n this.singleDatePicker = options.singleDatePicker;\n if (this.singleDatePicker)\n this.endDate = this.startDate.clone();\n }\n\n if (typeof options.timePicker === 'boolean')\n this.timePicker = options.timePicker;\n\n if (typeof options.timePickerSeconds === 'boolean')\n this.timePickerSeconds = options.timePickerSeconds;\n\n if (typeof options.timePickerIncrement === 'number')\n this.timePickerIncrement = options.timePickerIncrement;\n\n if (typeof options.timePicker24Hour === 'boolean')\n this.timePicker24Hour = options.timePicker24Hour;\n\n if (typeof options.autoApply === 'boolean')\n this.autoApply = options.autoApply;\n\n if (typeof options.autoUpdateInput === 'boolean')\n this.autoUpdateInput = options.autoUpdateInput;\n\n if (typeof options.linkedCalendars === 'boolean')\n this.linkedCalendars = options.linkedCalendars;\n\n if (typeof options.isInvalidDate === 'function')\n this.isInvalidDate = options.isInvalidDate;\n\n if (typeof options.isCustomDate === 'function')\n this.isCustomDate = options.isCustomDate;\n\n if (typeof options.alwaysShowCalendars === 'boolean')\n this.alwaysShowCalendars = options.alwaysShowCalendars;\n\n // update day names order to firstDay\n if (this.locale.firstDay != 0) {\n var iterator = this.locale.firstDay;\n while (iterator > 0) {\n this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift());\n iterator--;\n }\n }\n\n var start, end, range;\n\n //if no start/end dates set, check if an input element contains initial values\n if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') {\n if ($(this.element).is('input[type=text]')) {\n var val = $(this.element).val(),\n split = val.split(this.locale.separator);\n\n start = end = null;\n\n if (split.length == 2) {\n start = moment(split[0], this.locale.format);\n end = moment(split[1], this.locale.format);\n } else if (this.singleDatePicker && val !== \"\") {\n start = moment(val, this.locale.format);\n end = moment(val, this.locale.format);\n }\n if (start !== null && end !== null) {\n this.setStartDate(start);\n this.setEndDate(end);\n }\n }\n }\n\n if (typeof options.ranges === 'object') {\n for (range in options.ranges) {\n\n if (typeof options.ranges[range][0] === 'string')\n start = moment(options.ranges[range][0], this.locale.format);\n else\n start = moment(options.ranges[range][0]);\n\n if (typeof options.ranges[range][1] === 'string')\n end = moment(options.ranges[range][1], this.locale.format);\n else\n end = moment(options.ranges[range][1]);\n\n // If the start or end date exceed those allowed by the minDate or dateLimit\n // options, shorten the range to the allowable period.\n if (this.minDate && start.isBefore(this.minDate))\n start = this.minDate.clone();\n\n var maxDate = this.maxDate;\n if (this.dateLimit && maxDate && start.clone().add(this.dateLimit).isAfter(maxDate))\n maxDate = start.clone().add(this.dateLimit);\n if (maxDate && end.isAfter(maxDate))\n end = maxDate.clone();\n\n // If the end of the range is before the minimum or the start of the range is\n // after the maximum, don't display this range option at all.\n if ((this.minDate && end.isBefore(this.minDate, this.timepicker ? 'minute' : 'day')) \n || (maxDate && start.isAfter(maxDate, this.timepicker ? 'minute' : 'day')))\n continue;\n\n //Support unicode chars in the range names.\n var elem = document.createElement('textarea');\n elem.innerHTML = range;\n var rangeHtml = elem.value;\n\n this.ranges[rangeHtml] = [start, end];\n }\n\n var list = '<ul>';\n for (range in this.ranges) {\n list += '<li data-range-key=\"' + range + '\">' + range + '</li>';\n }\n if (this.showCustomRangeLabel) {\n list += '<li data-range-key=\"' + this.locale.customRangeLabel + '\">' + this.locale.customRangeLabel + '</li>';\n }\n list += '</ul>';\n this.container.find('.ranges').prepend(list);\n }\n\n if (typeof cb === 'function') {\n this.callback = cb;\n }\n\n if (!this.timePicker) {\n this.startDate = this.startDate.startOf('day');\n this.endDate = this.endDate.endOf('day');\n this.container.find('.calendar-time').hide();\n }\n\n //can't be used together for now\n if (this.timePicker && this.autoApply)\n this.autoApply = false;\n\n if (this.autoApply && typeof options.ranges !== 'object') {\n this.container.find('.ranges').hide();\n } else if (this.autoApply) {\n this.container.find('.applyBtn, .cancelBtn').addClass('hide');\n }\n\n if (this.singleDatePicker) {\n this.container.addClass('single');\n this.container.find('.calendar.left').addClass('single');\n this.container.find('.calendar.left').show();\n this.container.find('.calendar.right').hide();\n this.container.find('.daterangepicker_input input, .daterangepicker_input > i').hide();\n if (this.timePicker) {\n this.container.find('.ranges ul').hide();\n } else {\n this.container.find('.ranges').hide();\n }\n }\n\n if ((typeof options.ranges === 'undefined' && !this.singleDatePicker) || this.alwaysShowCalendars) {\n this.container.addClass('show-calendar');\n }\n\n this.container.addClass('opens' + this.opens);\n\n //swap the position of the predefined ranges if opens right\n if (typeof options.ranges !== 'undefined' && this.opens == 'right') {\n this.container.find('.ranges').prependTo( this.container.find('.calendar.left').parent() );\n }\n\n //apply CSS classes and labels to buttons\n this.container.find('.applyBtn, .cancelBtn').addClass(this.buttonClasses);\n if (this.applyClass.length)\n this.container.find('.applyBtn').addClass(this.applyClass);\n if (this.cancelClass.length)\n this.container.find('.cancelBtn').addClass(this.cancelClass);\n this.container.find('.applyBtn').html(this.locale.applyLabel);\n this.container.find('.cancelBtn').html(this.locale.cancelLabel);\n\n //\n // event listeners\n //\n\n this.container.find('.calendar')\n .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this))\n .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this))\n .on('mousedown.daterangepicker', 'td.available', $.proxy(this.clickDate, this))\n .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.hoverDate, this))\n .on('mouseleave.daterangepicker', 'td.available', $.proxy(this.updateFormInputs, this))\n .on('change.daterangepicker', 'select.yearselect', $.proxy(this.monthOrYearChanged, this))\n .on('change.daterangepicker', 'select.monthselect', $.proxy(this.monthOrYearChanged, this))\n .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.secondselect,select.ampmselect', $.proxy(this.timeChanged, this))\n .on('click.daterangepicker', '.daterangepicker_input input', $.proxy(this.showCalendars, this))\n .on('focus.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsFocused, this))\n .on('blur.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsBlurred, this))\n .on('change.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsChanged, this))\n .on('keydown.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsKeydown, this));\n\n this.container.find('.ranges')\n .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this))\n .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this))\n .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this))\n .on('mouseenter.daterangepicker', 'li', $.proxy(this.hoverRange, this))\n .on('mouseleave.daterangepicker', 'li', $.proxy(this.updateFormInputs, this));\n\n if (this.element.is('input') || this.element.is('button')) {\n this.element.on({\n 'click.daterangepicker': $.proxy(this.show, this),\n 'focus.daterangepicker': $.proxy(this.show, this),\n 'keyup.daterangepicker': $.proxy(this.elementChanged, this),\n 'keydown.daterangepicker': $.proxy(this.keydown, this) //IE 11 compatibility\n });\n } else {\n this.element.on('click.daterangepicker', $.proxy(this.toggle, this));\n this.element.on('keydown.daterangepicker', $.proxy(this.toggle, this));\n }\n\n //\n // if attached to a text input, set the initial value\n //\n\n if (this.element.is('input') && !this.singleDatePicker && this.autoUpdateInput) {\n this.element.val(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format));\n this.element.trigger('change');\n } else if (this.element.is('input') && this.autoUpdateInput) {\n this.element.val(this.startDate.format(this.locale.format));\n this.element.trigger('change');\n }\n\n };\n\n DateRangePicker.prototype = {\n\n constructor: DateRangePicker,\n\n setStartDate: function(startDate) {\n if (typeof startDate === 'string')\n this.startDate = moment(startDate, this.locale.format);\n\n if (typeof startDate === 'object')\n this.startDate = moment(startDate);\n\n if (!this.timePicker)\n this.startDate = this.startDate.startOf('day');\n\n if (this.timePicker && this.timePickerIncrement)\n this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);\n\n if (this.minDate && this.startDate.isBefore(this.minDate)) {\n this.startDate = this.minDate.clone();\n if (this.timePicker && this.timePickerIncrement)\n this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);\n }\n\n if (this.maxDate && this.startDate.isAfter(this.maxDate)) {\n this.startDate = this.maxDate.clone();\n if (this.timePicker && this.timePickerIncrement)\n this.startDate.minute(Math.floor(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);\n }\n\n if (!this.isShowing)\n this.updateElement();\n\n this.updateMonthsInView();\n },\n\n setEndDate: function(endDate) {\n if (typeof endDate === 'string')\n this.endDate = moment(endDate, this.locale.format);\n\n if (typeof endDate === 'object')\n this.endDate = moment(endDate);\n\n if (!this.timePicker)\n this.endDate = this.endDate.add(1,'d').startOf('day').subtract(1,'second');\n\n if (this.timePicker && this.timePickerIncrement)\n this.endDate.minute(Math.round(this.endDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);\n\n if (this.endDate.isBefore(this.startDate))\n this.endDate = this.startDate.clone();\n\n if (this.maxDate && this.endDate.isAfter(this.maxDate))\n this.endDate = this.maxDate.clone();\n\n if (this.dateLimit && this.startDate.clone().add(this.dateLimit).isBefore(this.endDate))\n this.endDate = this.startDate.clone().add(this.dateLimit);\n\n this.previousRightTime = this.endDate.clone();\n\n if (!this.isShowing)\n this.updateElement();\n\n this.updateMonthsInView();\n },\n\n isInvalidDate: function() {\n return false;\n },\n\n isCustomDate: function() {\n return false;\n },\n\n updateView: function() {\n if (this.timePicker) {\n this.renderTimePicker('left');\n this.renderTimePicker('right');\n if (!this.endDate) {\n this.container.find('.right .calendar-time select').attr('disabled', 'disabled').addClass('disabled');\n } else {\n this.container.find('.right .calendar-time select').removeAttr('disabled').removeClass('disabled');\n }\n }\n if (this.endDate) {\n this.container.find('input[name=\"daterangepicker_end\"]').removeClass('active');\n this.container.find('input[name=\"daterangepicker_start\"]').addClass('active');\n } else {\n this.container.find('input[name=\"daterangepicker_end\"]').addClass('active');\n this.container.find('input[name=\"daterangepicker_start\"]').removeClass('active');\n }\n this.updateMonthsInView();\n this.updateCalendars();\n this.updateFormInputs();\n },\n\n updateMonthsInView: function() {\n if (this.endDate) {\n\n //if both dates are visible already, do nothing\n if (!this.singleDatePicker && this.leftCalendar.month && this.rightCalendar.month &&\n (this.startDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.startDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM'))\n &&\n (this.endDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.endDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM'))\n ) {\n return;\n }\n\n this.leftCalendar.month = this.startDate.clone().date(2);\n if (!this.linkedCalendars && (this.endDate.month() != this.startDate.month() || this.endDate.year() != this.startDate.year())) {\n this.rightCalendar.month = this.endDate.clone().date(2);\n } else {\n this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month');\n }\n\n } else {\n if (this.leftCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM') && this.rightCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM')) {\n this.leftCalendar.month = this.startDate.clone().date(2);\n this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month');\n }\n }\n if (this.maxDate && this.linkedCalendars && !this.singleDatePicker && this.rightCalendar.month > this.maxDate) {\n this.rightCalendar.month = this.maxDate.clone().date(2);\n this.leftCalendar.month = this.maxDate.clone().date(2).subtract(1, 'month');\n }\n },\n\n updateCalendars: function() {\n\n if (this.timePicker) {\n var hour, minute, second;\n if (this.endDate) {\n hour = parseInt(this.container.find('.left .hourselect').val(), 10);\n minute = parseInt(this.container.find('.left .minuteselect').val(), 10);\n second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0;\n if (!this.timePicker24Hour) {\n var ampm = this.container.find('.left .ampmselect').val();\n if (ampm === 'PM' && hour < 12)\n hour += 12;\n if (ampm === 'AM' && hour === 12)\n hour = 0;\n }\n } else {\n hour = parseInt(this.container.find('.right .hourselect').val(), 10);\n minute = parseInt(this.container.find('.right .minuteselect').val(), 10);\n second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0;\n if (!this.timePicker24Hour) {\n var ampm = this.container.find('.right .ampmselect').val();\n if (ampm === 'PM' && hour < 12)\n hour += 12;\n if (ampm === 'AM' && hour === 12)\n hour = 0;\n }\n }\n this.leftCalendar.month.hour(hour).minute(minute).second(second);\n this.rightCalendar.month.hour(hour).minute(minute).second(second);\n }\n\n this.renderCalendar('left');\n this.renderCalendar('right');\n\n //highlight any predefined range matching the current start and end dates\n this.container.find('.ranges li').removeClass('active');\n if (this.endDate == null) return;\n\n this.calculateChosenLabel();\n },\n\n renderCalendar: function(side) {\n\n //\n // Build the matrix of dates that will populate the calendar\n //\n\n var calendar = side == 'left' ? this.leftCalendar : this.rightCalendar;\n var month = calendar.month.month();\n var year = calendar.month.year();\n var hour = calendar.month.hour();\n var minute = calendar.month.minute();\n var second = calendar.month.second();\n var daysInMonth = moment([year, month]).daysInMonth();\n var firstDay = moment([year, month, 1]);\n var lastDay = moment([year, month, daysInMonth]);\n var lastMonth = moment(firstDay).subtract(1, 'month').month();\n var lastYear = moment(firstDay).subtract(1, 'month').year();\n var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth();\n var dayOfWeek = firstDay.day();\n\n //initialize a 6 rows x 7 columns array for the calendar\n var calendar = [];\n calendar.firstDay = firstDay;\n calendar.lastDay = lastDay;\n\n for (var i = 0; i < 6; i++) {\n calendar[i] = [];\n }\n\n //populate the calendar with date objects\n var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1;\n if (startDay > daysInLastMonth)\n startDay -= 7;\n\n if (dayOfWeek == this.locale.firstDay)\n startDay = daysInLastMonth - 6;\n\n var curDate = moment([lastYear, lastMonth, startDay, 12, minute, second]);\n\n var col, row;\n for (var i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add(24, 'hour')) {\n if (i > 0 && col % 7 === 0) {\n col = 0;\n row++;\n }\n calendar[row][col] = curDate.clone().hour(hour).minute(minute).second(second);\n curDate.hour(12);\n\n if (this.minDate && calendar[row][col].format('YYYY-MM-DD') == this.minDate.format('YYYY-MM-DD') && calendar[row][col].isBefore(this.minDate) && side == 'left') {\n calendar[row][col] = this.minDate.clone();\n }\n\n if (this.maxDate && calendar[row][col].format('YYYY-MM-DD') == this.maxDate.format('YYYY-MM-DD') && calendar[row][col].isAfter(this.maxDate) && side == 'right') {\n calendar[row][col] = this.maxDate.clone();\n }\n\n }\n\n //make the calendar object available to hoverDate/clickDate\n if (side == 'left') {\n this.leftCalendar.calendar = calendar;\n } else {\n this.rightCalendar.calendar = calendar;\n }\n\n //\n // Display the calendar\n //\n\n var minDate = side == 'left' ? this.minDate : this.startDate;\n var maxDate = this.maxDate;\n var selected = side == 'left' ? this.startDate : this.endDate;\n var arrow = this.locale.direction == 'ltr' ? {left: 'chevron-left', right: 'chevron-right'} : {left: 'chevron-right', right: 'chevron-left'};\n\n var html = '<table class=\"table-condensed\">';\n html += '<thead>';\n html += '<tr>';\n\n // add empty cell for week number\n if (this.showWeekNumbers || this.showISOWeekNumbers)\n html += '<th></th>';\n\n if ((!minDate || minDate.isBefore(calendar.firstDay)) && (!this.linkedCalendars || side == 'left')) {\n html += '<th class=\"prev available\"><i class=\"fa fa-' + arrow.left + ' glyphicon glyphicon-' + arrow.left + '\"></i></th>';\n } else {\n html += '<th></th>';\n }\n\n var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(\" YYYY\");\n\n if (this.showDropdowns) {\n var currentMonth = calendar[1][1].month();\n var currentYear = calendar[1][1].year();\n var maxYear = (maxDate && maxDate.year()) || (currentYear + 5);\n var minYear = (minDate && minDate.year()) || (currentYear - 50);\n var inMinYear = currentYear == minYear;\n var inMaxYear = currentYear == maxYear;\n\n var monthHtml = '<select class=\"monthselect\">';\n for (var m = 0; m < 12; m++) {\n if ((!inMinYear || m >= minDate.month()) && (!inMaxYear || m <= maxDate.month())) {\n monthHtml += \"<option value='\" + m + \"'\" +\n (m === currentMonth ? \" selected='selected'\" : \"\") +\n \">\" + this.locale.monthNames[m] + \"</option>\";\n } else {\n monthHtml += \"<option value='\" + m + \"'\" +\n (m === currentMonth ? \" selected='selected'\" : \"\") +\n \" disabled='disabled'>\" + this.locale.monthNames[m] + \"</option>\";\n }\n }\n monthHtml += \"</select>\";\n\n var yearHtml = '<select class=\"yearselect\">';\n for (var y = minYear; y <= maxYear; y++) {\n yearHtml += '<option value=\"' + y + '\"' +\n (y === currentYear ? ' selected=\"selected\"' : '') +\n '>' + y + '</option>';\n }\n yearHtml += '</select>';\n\n dateHtml = monthHtml + yearHtml;\n }\n\n html += '<th colspan=\"5\" class=\"month\">' + dateHtml + '</th>';\n if ((!maxDate || maxDate.isAfter(calendar.lastDay)) && (!this.linkedCalendars || side == 'right' || this.singleDatePicker)) {\n html += '<th class=\"next available\"><i class=\"fa fa-' + arrow.right + ' glyphicon glyphicon-' + arrow.right + '\"></i></th>';\n } else {\n html += '<th></th>';\n }\n\n html += '</tr>';\n html += '<tr>';\n\n // add week number label\n if (this.showWeekNumbers || this.showISOWeekNumbers)\n html += '<th class=\"week\">' + this.locale.weekLabel + '</th>';\n\n $.each(this.locale.daysOfWeek, function(index, dayOfWeek) {\n html += '<th>' + dayOfWeek + '</th>';\n });\n\n html += '</tr>';\n html += '</thead>';\n html += '<tbody>';\n\n //adjust maxDate to reflect the dateLimit setting in order to\n //grey out end dates beyond the dateLimit\n if (this.endDate == null && this.dateLimit) {\n var maxLimit = this.startDate.clone().add(this.dateLimit).endOf('day');\n if (!maxDate || maxLimit.isBefore(maxDate)) {\n maxDate = maxLimit;\n }\n }\n\n for (var row = 0; row < 6; row++) {\n html += '<tr>';\n\n // add week number\n if (this.showWeekNumbers)\n html += '<td class=\"week\">' + calendar[row][0].week() + '</td>';\n else if (this.showISOWeekNumbers)\n html += '<td class=\"week\">' + calendar[row][0].isoWeek() + '</td>';\n\n for (var col = 0; col < 7; col++) {\n\n var classes = [];\n\n //highlight today's date\n if (calendar[row][col].isSame(new Date(), \"day\"))\n classes.push('today');\n\n //highlight weekends\n if (calendar[row][col].isoWeekday() > 5)\n classes.push('weekend');\n\n //grey out the dates in other months displayed at beginning and end of this calendar\n if (calendar[row][col].month() != calendar[1][1].month())\n classes.push('off');\n\n //don't allow selection of dates before the minimum date\n if (this.minDate && calendar[row][col].isBefore(this.minDate, 'day'))\n classes.push('off', 'disabled');\n\n //don't allow selection of dates after the maximum date\n if (maxDate && calendar[row][col].isAfter(maxDate, 'day'))\n classes.push('off', 'disabled');\n\n //don't allow selection of date if a custom function decides it's invalid\n if (this.isInvalidDate(calendar[row][col]))\n classes.push('off', 'disabled');\n\n //highlight the currently selected start date\n if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD'))\n classes.push('active', 'start-date');\n\n //highlight the currently selected end date\n if (this.endDate != null && calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD'))\n classes.push('active', 'end-date');\n\n //highlight dates in-between the selected dates\n if (this.endDate != null && calendar[row][col] > this.startDate && calendar[row][col] < this.endDate)\n classes.push('in-range');\n\n //apply custom classes for this date\n var isCustom = this.isCustomDate(calendar[row][col]);\n if (isCustom !== false) {\n if (typeof isCustom === 'string')\n classes.push(isCustom);\n else\n Array.prototype.push.apply(classes, isCustom);\n }\n\n var cname = '', disabled = false;\n for (var i = 0; i < classes.length; i++) {\n cname += classes[i] + ' ';\n if (classes[i] == 'disabled')\n disabled = true;\n }\n if (!disabled)\n cname += 'available';\n\n html += '<td class=\"' + cname.replace(/^\\s+|\\s+$/g, '') + '\" data-title=\"' + 'r' + row + 'c' + col + '\">' + calendar[row][col].date() + '</td>';\n\n }\n html += '</tr>';\n }\n\n html += '</tbody>';\n html += '</table>';\n\n this.container.find('.calendar.' + side + ' .calendar-table').html(html);\n\n },\n\n renderTimePicker: function(side) {\n\n // Don't bother updating the time picker if it's currently disabled\n // because an end date hasn't been clicked yet\n if (side == 'right' && !this.endDate) return;\n\n var html, selected, minDate, maxDate = this.maxDate;\n\n if (this.dateLimit && (!this.maxDate || this.startDate.clone().add(this.dateLimit).isAfter(this.maxDate)))\n maxDate = this.startDate.clone().add(this.dateLimit);\n\n if (side == 'left') {\n selected = this.startDate.clone();\n minDate = this.minDate;\n } else if (side == 'right') {\n selected = this.endDate.clone();\n minDate = this.startDate;\n\n //Preserve the time already selected\n var timeSelector = this.container.find('.calendar.right .calendar-time div');\n if (timeSelector.html() != '') {\n\n selected.hour(timeSelector.find('.hourselect option:selected').val() || selected.hour());\n selected.minute(timeSelector.find('.minuteselect option:selected').val() || selected.minute());\n selected.second(timeSelector.find('.secondselect option:selected').val() || selected.second());\n\n if (!this.timePicker24Hour) {\n var ampm = timeSelector.find('.ampmselect option:selected').val();\n if (ampm === 'PM' && selected.hour() < 12)\n selected.hour(selected.hour() + 12);\n if (ampm === 'AM' && selected.hour() === 12)\n selected.hour(0);\n }\n\n }\n\n if (selected.isBefore(this.startDate))\n selected = this.startDate.clone();\n\n if (maxDate && selected.isAfter(maxDate))\n selected = maxDate.clone();\n\n }\n\n //\n // hours\n //\n\n html = '<select class=\"hourselect\">';\n\n var start = this.timePicker24Hour ? 0 : 1;\n var end = this.timePicker24Hour ? 23 : 12;\n\n for (var i = start; i <= end; i++) {\n var i_in_24 = i;\n if (!this.timePicker24Hour)\n i_in_24 = selected.hour() >= 12 ? (i == 12 ? 12 : i + 12) : (i == 12 ? 0 : i);\n\n var time = selected.clone().hour(i_in_24);\n var disabled = false;\n if (minDate && time.minute(59).isBefore(minDate))\n disabled = true;\n if (maxDate && time.minute(0).isAfter(maxDate))\n disabled = true;\n\n if (i_in_24 == selected.hour() && !disabled) {\n html += '<option value=\"' + i + '\" selected=\"selected\">' + i + '</option>';\n } else if (disabled) {\n html += '<option value=\"' + i + '\" disabled=\"disabled\" class=\"disabled\">' + i + '</option>';\n } else {\n html += '<option value=\"' + i + '\">' + i + '</option>';\n }\n }\n\n html += '</select> ';\n\n //\n // minutes\n //\n\n html += ': <select class=\"minuteselect\">';\n\n for (var i = 0; i < 60; i += this.timePickerIncrement) {\n var padded = i < 10 ? '0' + i : i;\n var time = selected.clone().minute(i);\n\n var disabled = false;\n if (minDate && time.second(59).isBefore(minDate))\n disabled = true;\n if (maxDate && time.second(0).isAfter(maxDate))\n disabled = true;\n\n if (selected.minute() == i && !disabled) {\n html += '<option value=\"' + i + '\" selected=\"selected\">' + padded + '</option>';\n } else if (disabled) {\n html += '<option value=\"' + i + '\" disabled=\"disabled\" class=\"disabled\">' + padded + '</option>';\n } else {\n html += '<option value=\"' + i + '\">' + padded + '</option>';\n }\n }\n\n html += '</select> ';\n\n //\n // seconds\n //\n\n if (this.timePickerSeconds) {\n html += ': <select class=\"secondselect\">';\n\n for (var i = 0; i < 60; i++) {\n var padded = i < 10 ? '0' + i : i;\n var time = selected.clone().second(i);\n\n var disabled = false;\n if (minDate && time.isBefore(minDate))\n disabled = true;\n if (maxDate && time.isAfter(maxDate))\n disabled = true;\n\n if (selected.second() == i && !disabled) {\n html += '<option value=\"' + i + '\" selected=\"selected\">' + padded + '</option>';\n } else if (disabled) {\n html += '<option value=\"' + i + '\" disabled=\"disabled\" class=\"disabled\">' + padded + '</option>';\n } else {\n html += '<option value=\"' + i + '\">' + padded + '</option>';\n }\n }\n\n html += '</select> ';\n }\n\n //\n // AM/PM\n //\n\n if (!this.timePicker24Hour) {\n html += '<select class=\"ampmselect\">';\n\n var am_html = '';\n var pm_html = '';\n\n if (minDate && selected.clone().hour(12).minute(0).second(0).isBefore(minDate))\n am_html = ' disabled=\"disabled\" class=\"disabled\"';\n\n if (maxDate && selected.clone().hour(0).minute(0).second(0).isAfter(maxDate))\n pm_html = ' disabled=\"disabled\" class=\"disabled\"';\n\n if (selected.hour() >= 12) {\n html += '<option value=\"AM\"' + am_html + '>AM</option><option value=\"PM\" selected=\"selected\"' + pm_html + '>PM</option>';\n } else {\n html += '<option value=\"AM\" selected=\"selected\"' + am_html + '>AM</option><option value=\"PM\"' + pm_html + '>PM</option>';\n }\n\n html += '</select>';\n }\n\n this.container.find('.calendar.' + side + ' .calendar-time div').html(html);\n\n },\n\n updateFormInputs: function() {\n\n //ignore mouse movements while an above-calendar text input has focus\n if (this.container.find('input[name=daterangepicker_start]').is(\":focus\") || this.container.find('input[name=daterangepicker_end]').is(\":focus\"))\n return;\n\n this.container.find('input[name=daterangepicker_start]').val(this.startDate.format(this.locale.format));\n if (this.endDate)\n this.container.find('input[name=daterangepicker_end]').val(this.endDate.format(this.locale.format));\n\n if (this.singleDatePicker || (this.endDate && (this.startDate.isBefore(this.endDate) || this.startDate.isSame(this.endDate)))) {\n this.container.find('button.applyBtn').removeAttr('disabled');\n } else {\n this.container.find('button.applyBtn').attr('disabled', 'disabled');\n }\n\n },\n\n move: function() {\n var parentOffset = { top: 0, left: 0 },\n containerTop;\n var parentRightEdge = $(window).width();\n if (!this.parentEl.is('body')) {\n parentOffset = {\n top: this.parentEl.offset().top - this.parentEl.scrollTop(),\n left: this.parentEl.offset().left - this.parentEl.scrollLeft()\n };\n parentRightEdge = this.parentEl[0].clientWidth + this.parentEl.offset().left;\n }\n\n if (this.drops == 'up')\n containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top;\n else\n containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top;\n this.container[this.drops == 'up' ? 'addClass' : 'removeClass']('dropup');\n\n if (this.opens == 'left') {\n this.container.css({\n top: containerTop,\n right: parentRightEdge - this.element.offset().left - this.element.outerWidth(),\n left: 'auto'\n });\n if (this.container.offset().left < 0) {\n this.container.css({\n right: 'auto',\n left: 9\n });\n }\n } else if (this.opens == 'center') {\n this.container.css({\n top: containerTop,\n left: this.element.offset().left - parentOffset.left + this.element.outerWidth() / 2\n - this.container.outerWidth() / 2,\n right: 'auto'\n });\n if (this.container.offset().left < 0) {\n this.container.css({\n right: 'auto',\n left: 9\n });\n }\n } else {\n this.container.css({\n top: containerTop,\n left: this.element.offset().left - parentOffset.left,\n right: 'auto'\n });\n if (this.container.offset().left + this.container.outerWidth() > $(window).width()) {\n this.container.css({\n left: 'auto',\n right: 0\n });\n }\n }\n },\n\n show: function(e) {\n if (this.isShowing) return;\n\n // Create a click proxy that is private to this instance of datepicker, for unbinding\n this._outsideClickProxy = $.proxy(function(e) { this.outsideClick(e); }, this);\n\n // Bind global datepicker mousedown for hiding and\n $(document)\n .on('mousedown.daterangepicker', this._outsideClickProxy)\n // also support mobile devices\n .on('touchend.daterangepicker', this._outsideClickProxy)\n // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them\n .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy)\n // and also close when focus changes to outside the picker (eg. tabbing between controls)\n .on('focusin.daterangepicker', this._outsideClickProxy);\n\n // Reposition the picker if the window is resized while it's open\n $(window).on('resize.daterangepicker', $.proxy(function(e) { this.move(e); }, this));\n\n this.oldStartDate = this.startDate.clone();\n this.oldEndDate = this.endDate.clone();\n this.previousRightTime = this.endDate.clone();\n\n this.updateView();\n this.container.show();\n this.move();\n this.element.trigger('show.daterangepicker', this);\n this.isShowing = true;\n },\n\n hide: function(e) {\n if (!this.isShowing) return;\n\n //incomplete date selection, revert to last values\n if (!this.endDate) {\n this.startDate = this.oldStartDate.clone();\n this.endDate = this.oldEndDate.clone();\n }\n\n //if a new date range was selected, invoke the user callback function\n if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate))\n this.callback(this.startDate, this.endDate, this.chosenLabel);\n\n //if picker is attached to a text input, update it\n this.updateElement();\n\n $(document).off('.daterangepicker');\n $(window).off('.daterangepicker');\n this.container.hide();\n this.element.trigger('hide.daterangepicker', this);\n this.isShowing = false;\n },\n\n toggle: function(e) {\n if (this.isShowing) {\n this.hide();\n } else {\n this.show();\n }\n },\n\n outsideClick: function(e) {\n var target = $(e.target);\n // if the page is clicked anywhere except within the daterangerpicker/button\n // itself then call this.hide()\n if (\n // ie modal dialog fix\n e.type == \"focusin\" ||\n target.closest(this.element).length ||\n target.closest(this.container).length ||\n target.closest('.calendar-table').length\n ) return;\n this.hide();\n this.element.trigger('outsideClick.daterangepicker', this);\n },\n\n showCalendars: function() {\n this.container.addClass('show-calendar');\n this.move();\n this.element.trigger('showCalendar.daterangepicker', this);\n },\n\n hideCalendars: function() {\n this.container.removeClass('show-calendar');\n this.element.trigger('hideCalendar.daterangepicker', this);\n },\n\n hoverRange: function(e) {\n\n //ignore mouse movements while an above-calendar text input has focus\n if (this.container.find('input[name=daterangepicker_start]').is(\":focus\") || this.container.find('input[name=daterangepicker_end]').is(\":focus\"))\n return;\n\n var label = e.target.getAttribute('data-range-key');\n\n if (label == this.locale.customRangeLabel) {\n this.updateView();\n } else {\n var dates = this.ranges[label];\n this.container.find('input[name=daterangepicker_start]').val(dates[0].format(this.locale.format));\n this.container.find('input[name=daterangepicker_end]').val(dates[1].format(this.locale.format));\n }\n\n },\n\n clickRange: function(e) {\n var label = e.target.getAttribute('data-range-key');\n this.chosenLabel = label;\n if (label == this.locale.customRangeLabel) {\n this.showCalendars();\n } else {\n var dates = this.ranges[label];\n this.startDate = dates[0];\n this.endDate = dates[1];\n\n if (!this.timePicker) {\n this.startDate.startOf('day');\n this.endDate.endOf('day');\n }\n\n if (!this.alwaysShowCalendars)\n this.hideCalendars();\n this.clickApply();\n }\n },\n\n clickPrev: function(e) {\n var cal = $(e.target).parents('.calendar');\n if (cal.hasClass('left')) {\n this.leftCalendar.month.subtract(1, 'month');\n if (this.linkedCalendars)\n this.rightCalendar.month.subtract(1, 'month');\n } else {\n this.rightCalendar.month.subtract(1, 'month');\n }\n this.updateCalendars();\n },\n\n clickNext: function(e) {\n var cal = $(e.target).parents('.calendar');\n if (cal.hasClass('left')) {\n this.leftCalendar.month.add(1, 'month');\n } else {\n this.rightCalendar.month.add(1, 'month');\n if (this.linkedCalendars)\n this.leftCalendar.month.add(1, 'month');\n }\n this.updateCalendars();\n },\n\n hoverDate: function(e) {\n\n //ignore mouse movements while an above-calendar text input has focus\n //if (this.container.find('input[name=daterangepicker_start]').is(\":focus\") || this.container.find('input[name=daterangepicker_end]').is(\":focus\"))\n // return;\n\n //ignore dates that can't be selected\n if (!$(e.target).hasClass('available')) return;\n\n //have the text inputs above calendars reflect the date being hovered over\n var title = $(e.target).attr('data-title');\n var row = title.substr(1, 1);\n var col = title.substr(3, 1);\n var cal = $(e.target).parents('.calendar');\n var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col];\n\n if (this.endDate && !this.container.find('input[name=daterangepicker_start]').is(\":focus\")) {\n this.container.find('input[name=daterangepicker_start]').val(date.format(this.locale.format));\n } else if (!this.endDate && !this.container.find('input[name=daterangepicker_end]').is(\":focus\")) {\n this.container.find('input[name=daterangepicker_end]').val(date.format(this.locale.format));\n }\n\n //highlight the dates between the start date and the date being hovered as a potential end date\n var leftCalendar = this.leftCalendar;\n var rightCalendar = this.rightCalendar;\n var startDate = this.startDate;\n if (!this.endDate) {\n this.container.find('.calendar tbody td').each(function(index, el) {\n\n //skip week numbers, only look at dates\n if ($(el).hasClass('week')) return;\n\n var title = $(el).attr('data-title');\n var row = title.substr(1, 1);\n var col = title.substr(3, 1);\n var cal = $(el).parents('.calendar');\n var dt = cal.hasClass('left') ? leftCalendar.calendar[row][col] : rightCalendar.calendar[row][col];\n\n if ((dt.isAfter(startDate) && dt.isBefore(date)) || dt.isSame(date, 'day')) {\n $(el).addClass('in-range');\n } else {\n $(el).removeClass('in-range');\n }\n\n });\n }\n\n },\n\n clickDate: function(e) {\n\n if (!$(e.target).hasClass('available')) return;\n\n var title = $(e.target).attr('data-title');\n var row = title.substr(1, 1);\n var col = title.substr(3, 1);\n var cal = $(e.target).parents('.calendar');\n var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col];\n\n //\n // this function needs to do a few things:\n // * alternate between selecting a start and end date for the range,\n // * if the time picker is enabled, apply the hour/minute/second from the select boxes to the clicked date\n // * if autoapply is enabled, and an end date was chosen, apply the selection\n // * if single date picker mode, and time picker isn't enabled, apply the selection immediately\n // * if one of the inputs above the calendars was focused, cancel that manual input\n //\n\n if (this.endDate || date.isBefore(this.startDate, 'day')) { //picking start\n if (this.timePicker) {\n var hour = parseInt(this.container.find('.left .hourselect').val(), 10);\n if (!this.timePicker24Hour) {\n var ampm = this.container.find('.left .ampmselect').val();\n if (ampm === 'PM' && hour < 12)\n hour += 12;\n if (ampm === 'AM' && hour === 12)\n hour = 0;\n }\n var minute = parseInt(this.container.find('.left .minuteselect').val(), 10);\n var second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0;\n date = date.clone().hour(hour).minute(minute).second(second);\n }\n this.endDate = null;\n this.setStartDate(date.clone());\n } else if (!this.endDate && date.isBefore(this.startDate)) {\n //special case: clicking the same date for start/end,\n //but the time of the end date is before the start date\n this.setEndDate(this.startDate.clone());\n } else { // picking end\n if (this.timePicker) {\n var hour = parseInt(this.container.find('.right .hourselect').val(), 10);\n if (!this.timePicker24Hour) {\n var ampm = this.container.find('.right .ampmselect').val();\n if (ampm === 'PM' && hour < 12)\n hour += 12;\n if (ampm === 'AM' && hour === 12)\n hour = 0;\n }\n var minute = parseInt(this.container.find('.right .minuteselect').val(), 10);\n var second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0;\n date = date.clone().hour(hour).minute(minute).second(second);\n }\n this.setEndDate(date.clone());\n if (this.autoApply) {\n this.calculateChosenLabel();\n this.clickApply();\n }\n }\n\n if (this.singleDatePicker) {\n this.setEndDate(this.startDate);\n if (!this.timePicker)\n this.clickApply();\n }\n\n this.updateView();\n\n //This is to cancel the blur event handler if the mouse was in one of the inputs\n e.stopPropagation();\n\n },\n\n calculateChosenLabel: function () {\n var customRange = true;\n var i = 0;\n for (var range in this.ranges) {\n if (this.timePicker) {\n var format = this.timePickerSeconds ? \"YYYY-MM-DD hh:mm:ss\" : \"YYYY-MM-DD hh:mm\";\n //ignore times when comparing dates if time picker seconds is not enabled\n if (this.startDate.format(format) == this.ranges[range][0].format(format) && this.endDate.format(format) == this.ranges[range][1].format(format)) {\n customRange = false;\n this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').html();\n break;\n }\n } else {\n //ignore times when comparing dates if time picker is not enabled\n if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) {\n customRange = false;\n this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').html();\n break;\n }\n }\n i++;\n }\n if (customRange) {\n if (this.showCustomRangeLabel) {\n this.chosenLabel = this.container.find('.ranges li:last').addClass('active').html();\n } else {\n this.chosenLabel = null;\n }\n this.showCalendars();\n }\n },\n\n clickApply: function(e) {\n this.hide();\n this.element.trigger('apply.daterangepicker', this);\n },\n\n clickCancel: function(e) {\n this.startDate = this.oldStartDate;\n this.endDate = this.oldEndDate;\n this.hide();\n this.element.trigger('cancel.daterangepicker', this);\n },\n\n monthOrYearChanged: function(e) {\n var isLeft = $(e.target).closest('.calendar').hasClass('left'),\n leftOrRight = isLeft ? 'left' : 'right',\n cal = this.container.find('.calendar.'+leftOrRight);\n\n // Month must be Number for new moment versions\n var month = parseInt(cal.find('.monthselect').val(), 10);\n var year = cal.find('.yearselect').val();\n\n if (!isLeft) {\n if (year < this.startDate.year() || (year == this.startDate.year() && month < this.startDate.month())) {\n month = this.startDate.month();\n year = this.startDate.year();\n }\n }\n\n if (this.minDate) {\n if (year < this.minDate.year() || (year == this.minDate.year() && month < this.minDate.month())) {\n month = this.minDate.month();\n year = this.minDate.year();\n }\n }\n\n if (this.maxDate) {\n if (year > this.maxDate.year() || (year == this.maxDate.year() && month > this.maxDate.month())) {\n month = this.maxDate.month();\n year = this.maxDate.year();\n }\n }\n\n if (isLeft) {\n this.leftCalendar.month.month(month).year(year);\n if (this.linkedCalendars)\n this.rightCalendar.month = this.leftCalendar.month.clone().add(1, 'month');\n } else {\n this.rightCalendar.month.month(month).year(year);\n if (this.linkedCalendars)\n this.leftCalendar.month = this.rightCalendar.month.clone().subtract(1, 'month');\n }\n this.updateCalendars();\n },\n\n timeChanged: function(e) {\n\n var cal = $(e.target).closest('.calendar'),\n isLeft = cal.hasClass('left');\n\n var hour = parseInt(cal.find('.hourselect').val(), 10);\n var minute = parseInt(cal.find('.minuteselect').val(), 10);\n var second = this.timePickerSeconds ? parseInt(cal.find('.secondselect').val(), 10) : 0;\n\n if (!this.timePicker24Hour) {\n var ampm = cal.find('.ampmselect').val();\n if (ampm === 'PM' && hour < 12)\n hour += 12;\n if (ampm === 'AM' && hour === 12)\n hour = 0;\n }\n\n if (isLeft) {\n var start = this.startDate.clone();\n start.hour(hour);\n start.minute(minute);\n start.second(second);\n this.setStartDate(start);\n if (this.singleDatePicker) {\n this.endDate = this.startDate.clone();\n } else if (this.endDate && this.endDate.format('YYYY-MM-DD') == start.format('YYYY-MM-DD') && this.endDate.isBefore(start)) {\n this.setEndDate(start.clone());\n }\n } else if (this.endDate) {\n var end = this.endDate.clone();\n end.hour(hour);\n end.minute(minute);\n end.second(second);\n this.setEndDate(end);\n }\n\n //update the calendars so all clickable dates reflect the new time component\n this.updateCalendars();\n\n //update the form inputs above the calendars with the new time\n this.updateFormInputs();\n\n //re-render the time pickers because changing one selection can affect what's enabled in another\n this.renderTimePicker('left');\n this.renderTimePicker('right');\n\n },\n\n formInputsChanged: function(e) {\n var isRight = $(e.target).closest('.calendar').hasClass('right');\n var start = moment(this.container.find('input[name=\"daterangepicker_start\"]').val(), this.locale.format);\n var end = moment(this.container.find('input[name=\"daterangepicker_end\"]').val(), this.locale.format);\n\n if (start.isValid() && end.isValid()) {\n\n if (isRight && end.isBefore(start))\n start = end.clone();\n\n this.setStartDate(start);\n this.setEndDate(end);\n\n if (isRight) {\n this.container.find('input[name=\"daterangepicker_start\"]').val(this.startDate.format(this.locale.format));\n } else {\n this.container.find('input[name=\"daterangepicker_end\"]').val(this.endDate.format(this.locale.format));\n }\n\n }\n\n this.updateView();\n },\n\n formInputsFocused: function(e) {\n\n // Highlight the focused input\n this.container.find('input[name=\"daterangepicker_start\"], input[name=\"daterangepicker_end\"]').removeClass('active');\n $(e.target).addClass('active');\n\n // Set the state such that if the user goes back to using a mouse, \n // the calendars are aware we're selecting the end of the range, not\n // the start. This allows someone to edit the end of a date range without\n // re-selecting the beginning, by clicking on the end date input then\n // using the calendar.\n var isRight = $(e.target).closest('.calendar').hasClass('right');\n if (isRight) {\n this.endDate = null;\n this.setStartDate(this.startDate.clone());\n this.updateView();\n }\n\n },\n\n formInputsBlurred: function(e) {\n\n // this function has one purpose right now: if you tab from the first\n // text input to the second in the UI, the endDate is nulled so that\n // you can click another, but if you tab out without clicking anything\n // or changing the input value, the old endDate should be retained\n\n if (!this.endDate) {\n var val = this.container.find('input[name=\"daterangepicker_end\"]').val();\n var end = moment(val, this.locale.format);\n if (end.isValid()) {\n this.setEndDate(end);\n this.updateView();\n }\n }\n\n },\n\n formInputsKeydown: function(e) {\n // This function ensures that if the 'enter' key was pressed in the input, then the calendars\n // are updated with the startDate and endDate.\n // This behaviour is automatic in Chrome/Firefox/Edge but not in IE 11 hence why this exists.\n // Other browsers and versions of IE are untested and the behaviour is unknown.\n if (e.keyCode === 13) {\n // Prevent the calendar from being updated twice on Chrome/Firefox/Edge\n e.preventDefault(); \n this.formInputsChanged(e);\n }\n },\n\n\n elementChanged: function() {\n if (!this.element.is('input')) return;\n if (!this.element.val().length) return;\n\n var dateString = this.element.val().split(this.locale.separator),\n start = null,\n end = null;\n\n if (dateString.length === 2) {\n start = moment(dateString[0], this.locale.format);\n end = moment(dateString[1], this.locale.format);\n }\n\n if (this.singleDatePicker || start === null || end === null) {\n start = moment(this.element.val(), this.locale.format);\n end = start;\n }\n\n if (!start.isValid() || !end.isValid()) return;\n\n this.setStartDate(start);\n this.setEndDate(end);\n this.updateView();\n },\n\n keydown: function(e) {\n //hide on tab or enter\n if ((e.keyCode === 9) || (e.keyCode === 13)) {\n this.hide();\n }\n\n //hide on esc and prevent propagation\n if (e.keyCode === 27) {\n e.preventDefault();\n e.stopPropagation();\n\n this.hide();\n }\n },\n\n updateElement: function() {\n if (this.element.is('input') && !this.singleDatePicker && this.autoUpdateInput) {\n this.element.val(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format));\n this.element.trigger('change');\n } else if (this.element.is('input') && this.autoUpdateInput) {\n this.element.val(this.startDate.format(this.locale.format));\n this.element.trigger('change');\n }\n },\n\n remove: function() {\n this.container.remove();\n this.element.off('.daterangepicker');\n this.element.removeData();\n }\n\n };\n\n $.fn.daterangepicker = function(options, callback) {\n var implementOptions = $.extend(true, {}, $.fn.daterangepicker.defaultOptions, options);\n this.each(function() {\n var el = $(this);\n if (el.data('daterangepicker'))\n el.data('daterangepicker').remove();\n el.data('daterangepicker', new DateRangePicker(el, implementOptions, callback));\n });\n return this;\n };\n\n return DateRangePicker;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1kYXRlcmFuZ2VwaWNrZXIvZGF0ZXJhbmdlcGlja2VyLmpzPzk2MDEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0EsU0FBUztBQUFBO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCLE9BQU87QUFDbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsNkNBQTZDLFFBQVE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCw2Q0FBNkMsSUFBSTs7QUFFM0c7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0IsUUFBUTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQ0FBcUMsY0FBYztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCLFNBQVM7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsU0FBUzs7QUFFMUM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1DQUFtQyxvQkFBb0I7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsK0JBQStCLFVBQVU7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsMkJBQTJCLFFBQVE7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLCtCQUErQixRQUFRO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUEsU0FBUzs7QUFFVDtBQUNBLGdDQUFnQyxrQkFBa0I7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQSwyREFBMkQsc0JBQXNCLEVBQUU7O0FBRW5GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdFQUF3RSxjQUFjLEVBQUU7O0FBRXhGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBLGlCQUFpQjtBQUNqQjs7QUFFQSxTQUFTOztBQUVUOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1RUFBdUU7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTOztBQUVUOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUEsQ0FBQyIsImZpbGUiOiI1OC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuKiBAdmVyc2lvbjogMi4xLjI3XG4qIEBhdXRob3I6IERhbiBHcm9zc21hbiBodHRwOi8vd3d3LmRhbmdyb3NzbWFuLmluZm8vXG4qIEBjb3B5cmlnaHQ6IENvcHlyaWdodCAoYykgMjAxMi0yMDE3IERhbiBHcm9zc21hbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogQGxpY2Vuc2U6IExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4gU2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4qIEB3ZWJzaXRlOiBodHRwOi8vd3d3LmRhdGVyYW5nZXBpY2tlci5jb20vXG4qL1xuLy8gRm9sbG93IHRoZSBVTUQgdGVtcGxhdGUgaHR0cHM6Ly9naXRodWIuY29tL3VtZGpzL3VtZC9ibG9iL21hc3Rlci90ZW1wbGF0ZXMvcmV0dXJuRXhwb3J0c0dsb2JhbC5qc1xuKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICAvLyBBTUQuIE1ha2UgZ2xvYmFseSBhdmFpbGFibGUgYXMgd2VsbFxuICAgICAgICBkZWZpbmUoWydtb21lbnQnLCAnanF1ZXJ5J10sIGZ1bmN0aW9uIChtb21lbnQsIGpxdWVyeSkge1xuICAgICAgICAgICAgaWYgKCFqcXVlcnkuZm4pIGpxdWVyeS5mbiA9IHt9OyAvLyB3ZWJwYWNrIHNlcnZlciByZW5kZXJpbmdcbiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5KG1vbWVudCwganF1ZXJ5KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgICAvLyBOb2RlIC8gQnJvd3NlcmlmeVxuICAgICAgICAvL2lzb21vcnBoaWMgaXNzdWVcbiAgICAgICAgdmFyIGpRdWVyeSA9ICh0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnKSA/IHdpbmRvdy5qUXVlcnkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghalF1ZXJ5KSB7XG4gICAgICAgICAgICBqUXVlcnkgPSByZXF1aXJlKCdqcXVlcnknKTtcbiAgICAgICAgICAgIGlmICghalF1ZXJ5LmZuKSBqUXVlcnkuZm4gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbW9tZW50ID0gKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5tb21lbnQgIT0gJ3VuZGVmaW5lZCcpID8gd2luZG93Lm1vbWVudCA6IHJlcXVpcmUoJ21vbWVudCcpO1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkobW9tZW50LCBqUXVlcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFsc1xuICAgICAgICByb290LmRhdGVyYW5nZXBpY2tlciA9IGZhY3Rvcnkocm9vdC5tb21lbnQsIHJvb3QualF1ZXJ5KTtcbiAgICB9XG59KHRoaXMsIGZ1bmN0aW9uKG1vbWVudCwgJCkge1xuICAgIHZhciBEYXRlUmFuZ2VQaWNrZXIgPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zLCBjYikge1xuXG4gICAgICAgIC8vZGVmYXVsdCBzZXR0aW5ncyBmb3Igb3B0aW9uc1xuICAgICAgICB0aGlzLnBhcmVudEVsID0gJ2JvZHknO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IG1vbWVudCgpLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICB0aGlzLmVuZERhdGUgPSBtb21lbnQoKS5lbmRPZignZGF5Jyk7XG4gICAgICAgIHRoaXMubWluRGF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1heERhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kYXRlTGltaXQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hdXRvQXBwbHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaW5nbGVEYXRlUGlja2VyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd0Ryb3Bkb3ducyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNob3dXZWVrTnVtYmVycyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNob3dJU09XZWVrTnVtYmVycyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNob3dDdXN0b21SYW5nZUxhYmVsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50aW1lUGlja2VyID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGltZVBpY2tlcjI0SG91ciA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQgPSAxO1xuICAgICAgICB0aGlzLnRpbWVQaWNrZXJTZWNvbmRzID0gZmFsc2U7XG4gICAgICAgIHRoaXMubGlua2VkQ2FsZW5kYXJzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hdXRvVXBkYXRlSW5wdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFsd2F5c1Nob3dDYWxlbmRhcnMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yYW5nZXMgPSB7fTtcblxuICAgICAgICB0aGlzLm9wZW5zID0gJ3JpZ2h0JztcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5oYXNDbGFzcygncHVsbC1yaWdodCcpKVxuICAgICAgICAgICAgdGhpcy5vcGVucyA9ICdsZWZ0JztcblxuICAgICAgICB0aGlzLmRyb3BzID0gJ2Rvd24nO1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50Lmhhc0NsYXNzKCdkcm9wdXAnKSlcbiAgICAgICAgICAgIHRoaXMuZHJvcHMgPSAndXAnO1xuXG4gICAgICAgIHRoaXMuYnV0dG9uQ2xhc3NlcyA9ICdidG4gYnRuLXNtJztcbiAgICAgICAgdGhpcy5hcHBseUNsYXNzID0gJ2J0bi1zdWNjZXNzJztcbiAgICAgICAgdGhpcy5jYW5jZWxDbGFzcyA9ICdidG4tZGVmYXVsdCc7XG5cbiAgICAgICAgdGhpcy5sb2NhbGUgPSB7XG4gICAgICAgICAgICBkaXJlY3Rpb246ICdsdHInLFxuICAgICAgICAgICAgZm9ybWF0OiBtb21lbnQubG9jYWxlRGF0YSgpLmxvbmdEYXRlRm9ybWF0KCdMJyksXG4gICAgICAgICAgICBzZXBhcmF0b3I6ICcgLSAnLFxuICAgICAgICAgICAgYXBwbHlMYWJlbDogJ0FwcGx5JyxcbiAgICAgICAgICAgIGNhbmNlbExhYmVsOiAnQ2FuY2VsJyxcbiAgICAgICAgICAgIHdlZWtMYWJlbDogJ1cnLFxuICAgICAgICAgICAgY3VzdG9tUmFuZ2VMYWJlbDogJ0N1c3RvbSBSYW5nZScsXG4gICAgICAgICAgICBkYXlzT2ZXZWVrOiBtb21lbnQud2Vla2RheXNNaW4oKSxcbiAgICAgICAgICAgIG1vbnRoTmFtZXM6IG1vbWVudC5tb250aHNTaG9ydCgpLFxuICAgICAgICAgICAgZmlyc3REYXk6IG1vbWVudC5sb2NhbGVEYXRhKCkuZmlyc3REYXlPZldlZWsoKVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBmdW5jdGlvbigpIHsgfTtcblxuICAgICAgICAvL3NvbWUgc3RhdGUgaW5mb3JtYXRpb25cbiAgICAgICAgdGhpcy5pc1Nob3dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIgPSB7fTtcbiAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyID0ge307XG5cbiAgICAgICAgLy9jdXN0b20gb3B0aW9ucyBmcm9tIHVzZXJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0JyB8fCBvcHRpb25zID09PSBudWxsKVxuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuXG4gICAgICAgIC8vYWxsb3cgc2V0dGluZyBvcHRpb25zIHdpdGggZGF0YSBhdHRyaWJ1dGVzXG4gICAgICAgIC8vZGF0YS1hcGkgb3B0aW9ucyB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggY3VzdG9tIGphdmFzY3JpcHQgb3B0aW9uc1xuICAgICAgICBvcHRpb25zID0gJC5leHRlbmQodGhpcy5lbGVtZW50LmRhdGEoKSwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy9odG1sIHRlbXBsYXRlIGZvciB0aGUgcGlja2VyIFVJXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50ZW1wbGF0ZSAhPT0gJ3N0cmluZycgJiYgIShvcHRpb25zLnRlbXBsYXRlIGluc3RhbmNlb2YgJCkpXG4gICAgICAgICAgICBvcHRpb25zLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXIgZHJvcGRvd24tbWVudVwiPicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiY2FsZW5kYXIgbGVmdFwiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cImRhdGVyYW5nZXBpY2tlcl9pbnB1dFwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICc8aW5wdXQgY2xhc3M9XCJpbnB1dC1taW5pIGZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImRhdGVyYW5nZXBpY2tlcl9zdGFydFwiIHZhbHVlPVwiXCIgLz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAnPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciBnbHlwaGljb24gZ2x5cGhpY29uLWNhbGVuZGFyXCI+PC9pPicgK1xuICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiY2FsZW5kYXItdGltZVwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXY+PC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGkgY2xhc3M9XCJmYSBmYS1jbG9jay1vIGdseXBoaWNvbiBnbHlwaGljb24tdGltZVwiPjwvaT4nICtcbiAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJjYWxlbmRhci10YWJsZVwiPjwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cImNhbGVuZGFyIHJpZ2h0XCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiZGF0ZXJhbmdlcGlja2VyX2lucHV0XCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCBjbGFzcz1cImlucHV0LW1pbmkgZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiZGF0ZXJhbmdlcGlja2VyX2VuZFwiIHZhbHVlPVwiXCIgLz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAnPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciBnbHlwaGljb24gZ2x5cGhpY29uLWNhbGVuZGFyXCI+PC9pPicgK1xuICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiY2FsZW5kYXItdGltZVwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXY+PC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGkgY2xhc3M9XCJmYSBmYS1jbG9jay1vIGdseXBoaWNvbiBnbHlwaGljb24tdGltZVwiPjwvaT4nICtcbiAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJjYWxlbmRhci10YWJsZVwiPjwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInJhbmdlc1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInJhbmdlX2lucHV0c1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gY2xhc3M9XCJhcHBseUJ0blwiIGRpc2FibGVkPVwiZGlzYWJsZWRcIiB0eXBlPVwiYnV0dG9uXCI+PC9idXR0b24+ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gY2xhc3M9XCJjYW5jZWxCdG5cIiB0eXBlPVwiYnV0dG9uXCI+PC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPC9kaXY+JztcblxuICAgICAgICB0aGlzLnBhcmVudEVsID0gKG9wdGlvbnMucGFyZW50RWwgJiYgJChvcHRpb25zLnBhcmVudEVsKS5sZW5ndGgpID8gJChvcHRpb25zLnBhcmVudEVsKSA6ICQodGhpcy5wYXJlbnRFbCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gJChvcHRpb25zLnRlbXBsYXRlKS5hcHBlbmRUbyh0aGlzLnBhcmVudEVsKTtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBoYW5kbGUgYWxsIHRoZSBwb3NzaWJsZSBvcHRpb25zIG92ZXJyaWRpbmcgZGVmYXVsdHNcbiAgICAgICAgLy9cblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubG9jYWxlID09PSAnb2JqZWN0Jykge1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubG9jYWxlLmRpcmVjdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGUuZGlyZWN0aW9uID0gb3B0aW9ucy5sb2NhbGUuZGlyZWN0aW9uO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubG9jYWxlLmZvcm1hdCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGUuZm9ybWF0ID0gb3B0aW9ucy5sb2NhbGUuZm9ybWF0O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubG9jYWxlLnNlcGFyYXRvciA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGUuc2VwYXJhdG9yID0gb3B0aW9ucy5sb2NhbGUuc2VwYXJhdG9yO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubG9jYWxlLmRheXNPZldlZWsgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgICAgIHRoaXMubG9jYWxlLmRheXNPZldlZWsgPSBvcHRpb25zLmxvY2FsZS5kYXlzT2ZXZWVrLnNsaWNlKCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5sb2NhbGUubW9udGhOYW1lcyA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICAgIHRoaXMubG9jYWxlLm1vbnRoTmFtZXMgPSBvcHRpb25zLmxvY2FsZS5tb250aE5hbWVzLnNsaWNlKCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5sb2NhbGUuZmlyc3REYXkgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICB0aGlzLmxvY2FsZS5maXJzdERheSA9IG9wdGlvbnMubG9jYWxlLmZpcnN0RGF5O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubG9jYWxlLmFwcGx5TGFiZWwgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICB0aGlzLmxvY2FsZS5hcHBseUxhYmVsID0gb3B0aW9ucy5sb2NhbGUuYXBwbHlMYWJlbDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmxvY2FsZS5jYW5jZWxMYWJlbCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgIHRoaXMubG9jYWxlLmNhbmNlbExhYmVsID0gb3B0aW9ucy5sb2NhbGUuY2FuY2VsTGFiZWw7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5sb2NhbGUud2Vla0xhYmVsID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgdGhpcy5sb2NhbGUud2Vla0xhYmVsID0gb3B0aW9ucy5sb2NhbGUud2Vla0xhYmVsO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubG9jYWxlLmN1c3RvbVJhbmdlTGFiZWwgPT09ICdzdHJpbmcnKXtcbiAgICAgICAgICAgICAgICAvL1N1cHBvcnQgdW5pY29kZSBjaGFycyBpbiB0aGUgY3VzdG9tIHJhbmdlIG5hbWUuXG4gICAgICAgICAgICAgICAgdmFyIGVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgICAgICAgICAgICAgIGVsZW0uaW5uZXJIVE1MID0gb3B0aW9ucy5sb2NhbGUuY3VzdG9tUmFuZ2VMYWJlbDtcbiAgICAgICAgICAgICAgICB2YXIgcmFuZ2VIdG1sID0gZWxlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2FsZS5jdXN0b21SYW5nZUxhYmVsID0gcmFuZ2VIdG1sO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKHRoaXMubG9jYWxlLmRpcmVjdGlvbik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnN0YXJ0RGF0ZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IG1vbWVudChvcHRpb25zLnN0YXJ0RGF0ZSwgdGhpcy5sb2NhbGUuZm9ybWF0KTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZW5kRGF0ZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICB0aGlzLmVuZERhdGUgPSBtb21lbnQob3B0aW9ucy5lbmREYXRlLCB0aGlzLmxvY2FsZS5mb3JtYXQpO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5taW5EYXRlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHRoaXMubWluRGF0ZSA9IG1vbWVudChvcHRpb25zLm1pbkRhdGUsIHRoaXMubG9jYWxlLmZvcm1hdCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm1heERhdGUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgdGhpcy5tYXhEYXRlID0gbW9tZW50KG9wdGlvbnMubWF4RGF0ZSwgdGhpcy5sb2NhbGUuZm9ybWF0KTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc3RhcnREYXRlID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlID0gbW9tZW50KG9wdGlvbnMuc3RhcnREYXRlKTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZW5kRGF0ZSA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICB0aGlzLmVuZERhdGUgPSBtb21lbnQob3B0aW9ucy5lbmREYXRlKTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubWluRGF0ZSA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICB0aGlzLm1pbkRhdGUgPSBtb21lbnQob3B0aW9ucy5taW5EYXRlKTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubWF4RGF0ZSA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICB0aGlzLm1heERhdGUgPSBtb21lbnQob3B0aW9ucy5tYXhEYXRlKTtcblxuICAgICAgICAvLyBzYW5pdHkgY2hlY2sgZm9yIGJhZCBvcHRpb25zXG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgdGhpcy5zdGFydERhdGUuaXNCZWZvcmUodGhpcy5taW5EYXRlKSlcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5taW5EYXRlLmNsb25lKCk7XG5cbiAgICAgICAgLy8gc2FuaXR5IGNoZWNrIGZvciBiYWQgb3B0aW9uc1xuICAgICAgICBpZiAodGhpcy5tYXhEYXRlICYmIHRoaXMuZW5kRGF0ZS5pc0FmdGVyKHRoaXMubWF4RGF0ZSkpXG4gICAgICAgICAgICB0aGlzLmVuZERhdGUgPSB0aGlzLm1heERhdGUuY2xvbmUoKTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYXBwbHlDbGFzcyA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICB0aGlzLmFwcGx5Q2xhc3MgPSBvcHRpb25zLmFwcGx5Q2xhc3M7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmNhbmNlbENsYXNzID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsQ2xhc3MgPSBvcHRpb25zLmNhbmNlbENsYXNzO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kYXRlTGltaXQgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgdGhpcy5kYXRlTGltaXQgPSBvcHRpb25zLmRhdGVMaW1pdDtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub3BlbnMgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgdGhpcy5vcGVucyA9IG9wdGlvbnMub3BlbnM7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmRyb3BzID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHRoaXMuZHJvcHMgPSBvcHRpb25zLmRyb3BzO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zaG93V2Vla051bWJlcnMgPT09ICdib29sZWFuJylcbiAgICAgICAgICAgIHRoaXMuc2hvd1dlZWtOdW1iZXJzID0gb3B0aW9ucy5zaG93V2Vla051bWJlcnM7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnNob3dJU09XZWVrTnVtYmVycyA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgdGhpcy5zaG93SVNPV2Vla051bWJlcnMgPSBvcHRpb25zLnNob3dJU09XZWVrTnVtYmVycztcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYnV0dG9uQ2xhc3NlcyA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICB0aGlzLmJ1dHRvbkNsYXNzZXMgPSBvcHRpb25zLmJ1dHRvbkNsYXNzZXM7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmJ1dHRvbkNsYXNzZXMgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgdGhpcy5idXR0b25DbGFzc2VzID0gb3B0aW9ucy5idXR0b25DbGFzc2VzLmpvaW4oJyAnKTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2hvd0Ryb3Bkb3ducyA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgdGhpcy5zaG93RHJvcGRvd25zID0gb3B0aW9ucy5zaG93RHJvcGRvd25zO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zaG93Q3VzdG9tUmFuZ2VMYWJlbCA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgdGhpcy5zaG93Q3VzdG9tUmFuZ2VMYWJlbCA9IG9wdGlvbnMuc2hvd0N1c3RvbVJhbmdlTGFiZWw7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnNpbmdsZURhdGVQaWNrZXIgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhpcy5zaW5nbGVEYXRlUGlja2VyID0gb3B0aW9ucy5zaW5nbGVEYXRlUGlja2VyO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2luZ2xlRGF0ZVBpY2tlcilcbiAgICAgICAgICAgICAgICB0aGlzLmVuZERhdGUgPSB0aGlzLnN0YXJ0RGF0ZS5jbG9uZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnRpbWVQaWNrZXIgPT09ICdib29sZWFuJylcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlciA9IG9wdGlvbnMudGltZVBpY2tlcjtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMudGltZVBpY2tlclNlY29uZHMgPT09ICdib29sZWFuJylcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlclNlY29uZHMgPSBvcHRpb25zLnRpbWVQaWNrZXJTZWNvbmRzO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50aW1lUGlja2VySW5jcmVtZW50ID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlckluY3JlbWVudCA9IG9wdGlvbnMudGltZVBpY2tlckluY3JlbWVudDtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMudGltZVBpY2tlcjI0SG91ciA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyMjRIb3VyID0gb3B0aW9ucy50aW1lUGlja2VyMjRIb3VyO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5hdXRvQXBwbHkgPT09ICdib29sZWFuJylcbiAgICAgICAgICAgIHRoaXMuYXV0b0FwcGx5ID0gb3B0aW9ucy5hdXRvQXBwbHk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmF1dG9VcGRhdGVJbnB1dCA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgdGhpcy5hdXRvVXBkYXRlSW5wdXQgPSBvcHRpb25zLmF1dG9VcGRhdGVJbnB1dDtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubGlua2VkQ2FsZW5kYXJzID09PSAnYm9vbGVhbicpXG4gICAgICAgICAgICB0aGlzLmxpbmtlZENhbGVuZGFycyA9IG9wdGlvbnMubGlua2VkQ2FsZW5kYXJzO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5pc0ludmFsaWREYXRlID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgdGhpcy5pc0ludmFsaWREYXRlID0gb3B0aW9ucy5pc0ludmFsaWREYXRlO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5pc0N1c3RvbURhdGUgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICB0aGlzLmlzQ3VzdG9tRGF0ZSA9IG9wdGlvbnMuaXNDdXN0b21EYXRlO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5hbHdheXNTaG93Q2FsZW5kYXJzID09PSAnYm9vbGVhbicpXG4gICAgICAgICAgICB0aGlzLmFsd2F5c1Nob3dDYWxlbmRhcnMgPSBvcHRpb25zLmFsd2F5c1Nob3dDYWxlbmRhcnM7XG5cbiAgICAgICAgLy8gdXBkYXRlIGRheSBuYW1lcyBvcmRlciB0byBmaXJzdERheVxuICAgICAgICBpZiAodGhpcy5sb2NhbGUuZmlyc3REYXkgIT0gMCkge1xuICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gdGhpcy5sb2NhbGUuZmlyc3REYXk7XG4gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGUuZGF5c09mV2Vlay5wdXNoKHRoaXMubG9jYWxlLmRheXNPZldlZWsuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3ItLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdGFydCwgZW5kLCByYW5nZTtcblxuICAgICAgICAvL2lmIG5vIHN0YXJ0L2VuZCBkYXRlcyBzZXQsIGNoZWNrIGlmIGFuIGlucHV0IGVsZW1lbnQgY29udGFpbnMgaW5pdGlhbCB2YWx1ZXNcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnN0YXJ0RGF0ZSA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuZW5kRGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmICgkKHRoaXMuZWxlbWVudCkuaXMoJ2lucHV0W3R5cGU9dGV4dF0nKSkge1xuICAgICAgICAgICAgICAgIHZhciB2YWwgPSAkKHRoaXMuZWxlbWVudCkudmFsKCksXG4gICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gdmFsLnNwbGl0KHRoaXMubG9jYWxlLnNlcGFyYXRvcik7XG5cbiAgICAgICAgICAgICAgICBzdGFydCA9IGVuZCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3BsaXQubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBtb21lbnQoc3BsaXRbMF0sIHRoaXMubG9jYWxlLmZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IG1vbWVudChzcGxpdFsxXSwgdGhpcy5sb2NhbGUuZm9ybWF0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2luZ2xlRGF0ZVBpY2tlciAmJiB2YWwgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBtb21lbnQodmFsLCB0aGlzLmxvY2FsZS5mb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBtb21lbnQodmFsLCB0aGlzLmxvY2FsZS5mb3JtYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT09IG51bGwgJiYgZW5kICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhcnREYXRlKHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbmREYXRlKGVuZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnJhbmdlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGZvciAocmFuZ2UgaW4gb3B0aW9ucy5yYW5nZXMpIHtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yYW5nZXNbcmFuZ2VdWzBdID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBtb21lbnQob3B0aW9ucy5yYW5nZXNbcmFuZ2VdWzBdLCB0aGlzLmxvY2FsZS5mb3JtYXQpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBtb21lbnQob3B0aW9ucy5yYW5nZXNbcmFuZ2VdWzBdKTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yYW5nZXNbcmFuZ2VdWzFdID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gbW9tZW50KG9wdGlvbnMucmFuZ2VzW3JhbmdlXVsxXSwgdGhpcy5sb2NhbGUuZm9ybWF0KTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IG1vbWVudChvcHRpb25zLnJhbmdlc1tyYW5nZV1bMV0pO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXJ0IG9yIGVuZCBkYXRlIGV4Y2VlZCB0aG9zZSBhbGxvd2VkIGJ5IHRoZSBtaW5EYXRlIG9yIGRhdGVMaW1pdFxuICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMsIHNob3J0ZW4gdGhlIHJhbmdlIHRvIHRoZSBhbGxvd2FibGUgcGVyaW9kLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgc3RhcnQuaXNCZWZvcmUodGhpcy5taW5EYXRlKSlcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSB0aGlzLm1pbkRhdGUuY2xvbmUoKTtcblxuICAgICAgICAgICAgICAgIHZhciBtYXhEYXRlID0gdGhpcy5tYXhEYXRlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGVMaW1pdCAmJiBtYXhEYXRlICYmIHN0YXJ0LmNsb25lKCkuYWRkKHRoaXMuZGF0ZUxpbWl0KS5pc0FmdGVyKG1heERhdGUpKVxuICAgICAgICAgICAgICAgICAgICBtYXhEYXRlID0gc3RhcnQuY2xvbmUoKS5hZGQodGhpcy5kYXRlTGltaXQpO1xuICAgICAgICAgICAgICAgIGlmIChtYXhEYXRlICYmIGVuZC5pc0FmdGVyKG1heERhdGUpKVxuICAgICAgICAgICAgICAgICAgICBlbmQgPSBtYXhEYXRlLmNsb25lKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZW5kIG9mIHRoZSByYW5nZSBpcyBiZWZvcmUgdGhlIG1pbmltdW0gb3IgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBpc1xuICAgICAgICAgICAgICAgIC8vIGFmdGVyIHRoZSBtYXhpbXVtLCBkb24ndCBkaXNwbGF5IHRoaXMgcmFuZ2Ugb3B0aW9uIGF0IGFsbC5cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMubWluRGF0ZSAmJiBlbmQuaXNCZWZvcmUodGhpcy5taW5EYXRlLCB0aGlzLnRpbWVwaWNrZXIgPyAnbWludXRlJyA6ICdkYXknKSkgXG4gICAgICAgICAgICAgICAgICB8fCAobWF4RGF0ZSAmJiBzdGFydC5pc0FmdGVyKG1heERhdGUsIHRoaXMudGltZXBpY2tlciA/ICdtaW51dGUnIDogJ2RheScpKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAvL1N1cHBvcnQgdW5pY29kZSBjaGFycyBpbiB0aGUgcmFuZ2UgbmFtZXMuXG4gICAgICAgICAgICAgICAgdmFyIGVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgICAgICAgICAgICAgIGVsZW0uaW5uZXJIVE1MID0gcmFuZ2U7XG4gICAgICAgICAgICAgICAgdmFyIHJhbmdlSHRtbCA9IGVsZW0udmFsdWU7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tyYW5nZUh0bWxdID0gW3N0YXJ0LCBlbmRdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbGlzdCA9ICc8dWw+JztcbiAgICAgICAgICAgIGZvciAocmFuZ2UgaW4gdGhpcy5yYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBsaXN0ICs9ICc8bGkgZGF0YS1yYW5nZS1rZXk9XCInICsgcmFuZ2UgKyAnXCI+JyArIHJhbmdlICsgJzwvbGk+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dDdXN0b21SYW5nZUxhYmVsKSB7XG4gICAgICAgICAgICAgICAgbGlzdCArPSAnPGxpIGRhdGEtcmFuZ2Uta2V5PVwiJyArIHRoaXMubG9jYWxlLmN1c3RvbVJhbmdlTGFiZWwgKyAnXCI+JyArIHRoaXMubG9jYWxlLmN1c3RvbVJhbmdlTGFiZWwgKyAnPC9saT4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlzdCArPSAnPC91bD4nO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuZmluZCgnLnJhbmdlcycpLnByZXBlbmQobGlzdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudGltZVBpY2tlcikge1xuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZS5zdGFydE9mKCdkYXknKTtcbiAgICAgICAgICAgIHRoaXMuZW5kRGF0ZSA9IHRoaXMuZW5kRGF0ZS5lbmRPZignZGF5Jyk7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCcuY2FsZW5kYXItdGltZScpLmhpZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2FuJ3QgYmUgdXNlZCB0b2dldGhlciBmb3Igbm93XG4gICAgICAgIGlmICh0aGlzLnRpbWVQaWNrZXIgJiYgdGhpcy5hdXRvQXBwbHkpXG4gICAgICAgICAgICB0aGlzLmF1dG9BcHBseSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLmF1dG9BcHBseSAmJiB0eXBlb2Ygb3B0aW9ucy5yYW5nZXMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCcucmFuZ2VzJykuaGlkZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXV0b0FwcGx5KSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCcuYXBwbHlCdG4sIC5jYW5jZWxCdG4nKS5hZGRDbGFzcygnaGlkZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2luZ2xlRGF0ZVBpY2tlcikge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoJ3NpbmdsZScpO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuZmluZCgnLmNhbGVuZGFyLmxlZnQnKS5hZGRDbGFzcygnc2luZ2xlJyk7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCcuY2FsZW5kYXIubGVmdCcpLnNob3coKTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJy5jYWxlbmRhci5yaWdodCcpLmhpZGUoKTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJy5kYXRlcmFuZ2VwaWNrZXJfaW5wdXQgaW5wdXQsIC5kYXRlcmFuZ2VwaWNrZXJfaW5wdXQgPiBpJykuaGlkZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMudGltZVBpY2tlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJy5yYW5nZXMgdWwnKS5oaWRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJy5yYW5nZXMnKS5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHR5cGVvZiBvcHRpb25zLnJhbmdlcyA9PT0gJ3VuZGVmaW5lZCcgJiYgIXRoaXMuc2luZ2xlRGF0ZVBpY2tlcikgfHwgdGhpcy5hbHdheXNTaG93Q2FsZW5kYXJzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcygnc2hvdy1jYWxlbmRhcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoJ29wZW5zJyArIHRoaXMub3BlbnMpO1xuXG4gICAgICAgIC8vc3dhcCB0aGUgcG9zaXRpb24gb2YgdGhlIHByZWRlZmluZWQgcmFuZ2VzIGlmIG9wZW5zIHJpZ2h0XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yYW5nZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMub3BlbnMgPT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuZmluZCgnLnJhbmdlcycpLnByZXBlbmRUbyggdGhpcy5jb250YWluZXIuZmluZCgnLmNhbGVuZGFyLmxlZnQnKS5wYXJlbnQoKSApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9hcHBseSBDU1MgY2xhc3NlcyBhbmQgbGFiZWxzIHRvIGJ1dHRvbnNcbiAgICAgICAgdGhpcy5jb250YWluZXIuZmluZCgnLmFwcGx5QnRuLCAuY2FuY2VsQnRuJykuYWRkQ2xhc3ModGhpcy5idXR0b25DbGFzc2VzKTtcbiAgICAgICAgaWYgKHRoaXMuYXBwbHlDbGFzcy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCcuYXBwbHlCdG4nKS5hZGRDbGFzcyh0aGlzLmFwcGx5Q2xhc3MpO1xuICAgICAgICBpZiAodGhpcy5jYW5jZWxDbGFzcy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCcuY2FuY2VsQnRuJykuYWRkQ2xhc3ModGhpcy5jYW5jZWxDbGFzcyk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJy5hcHBseUJ0bicpLmh0bWwodGhpcy5sb2NhbGUuYXBwbHlMYWJlbCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJy5jYW5jZWxCdG4nKS5odG1sKHRoaXMubG9jYWxlLmNhbmNlbExhYmVsKTtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgLy9cblxuICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCcuY2FsZW5kYXInKVxuICAgICAgICAgICAgLm9uKCdjbGljay5kYXRlcmFuZ2VwaWNrZXInLCAnLnByZXYnLCAkLnByb3h5KHRoaXMuY2xpY2tQcmV2LCB0aGlzKSlcbiAgICAgICAgICAgIC5vbignY2xpY2suZGF0ZXJhbmdlcGlja2VyJywgJy5uZXh0JywgJC5wcm94eSh0aGlzLmNsaWNrTmV4dCwgdGhpcykpXG4gICAgICAgICAgICAub24oJ21vdXNlZG93bi5kYXRlcmFuZ2VwaWNrZXInLCAndGQuYXZhaWxhYmxlJywgJC5wcm94eSh0aGlzLmNsaWNrRGF0ZSwgdGhpcykpXG4gICAgICAgICAgICAub24oJ21vdXNlZW50ZXIuZGF0ZXJhbmdlcGlja2VyJywgJ3RkLmF2YWlsYWJsZScsICQucHJveHkodGhpcy5ob3ZlckRhdGUsIHRoaXMpKVxuICAgICAgICAgICAgLm9uKCdtb3VzZWxlYXZlLmRhdGVyYW5nZXBpY2tlcicsICd0ZC5hdmFpbGFibGUnLCAkLnByb3h5KHRoaXMudXBkYXRlRm9ybUlucHV0cywgdGhpcykpXG4gICAgICAgICAgICAub24oJ2NoYW5nZS5kYXRlcmFuZ2VwaWNrZXInLCAnc2VsZWN0LnllYXJzZWxlY3QnLCAkLnByb3h5KHRoaXMubW9udGhPclllYXJDaGFuZ2VkLCB0aGlzKSlcbiAgICAgICAgICAgIC5vbignY2hhbmdlLmRhdGVyYW5nZXBpY2tlcicsICdzZWxlY3QubW9udGhzZWxlY3QnLCAkLnByb3h5KHRoaXMubW9udGhPclllYXJDaGFuZ2VkLCB0aGlzKSlcbiAgICAgICAgICAgIC5vbignY2hhbmdlLmRhdGVyYW5nZXBpY2tlcicsICdzZWxlY3QuaG91cnNlbGVjdCxzZWxlY3QubWludXRlc2VsZWN0LHNlbGVjdC5zZWNvbmRzZWxlY3Qsc2VsZWN0LmFtcG1zZWxlY3QnLCAkLnByb3h5KHRoaXMudGltZUNoYW5nZWQsIHRoaXMpKVxuICAgICAgICAgICAgLm9uKCdjbGljay5kYXRlcmFuZ2VwaWNrZXInLCAnLmRhdGVyYW5nZXBpY2tlcl9pbnB1dCBpbnB1dCcsICQucHJveHkodGhpcy5zaG93Q2FsZW5kYXJzLCB0aGlzKSlcbiAgICAgICAgICAgIC5vbignZm9jdXMuZGF0ZXJhbmdlcGlja2VyJywgJy5kYXRlcmFuZ2VwaWNrZXJfaW5wdXQgaW5wdXQnLCAkLnByb3h5KHRoaXMuZm9ybUlucHV0c0ZvY3VzZWQsIHRoaXMpKVxuICAgICAgICAgICAgLm9uKCdibHVyLmRhdGVyYW5nZXBpY2tlcicsICcuZGF0ZXJhbmdlcGlja2VyX2lucHV0IGlucHV0JywgJC5wcm94eSh0aGlzLmZvcm1JbnB1dHNCbHVycmVkLCB0aGlzKSlcbiAgICAgICAgICAgIC5vbignY2hhbmdlLmRhdGVyYW5nZXBpY2tlcicsICcuZGF0ZXJhbmdlcGlja2VyX2lucHV0IGlucHV0JywgJC5wcm94eSh0aGlzLmZvcm1JbnB1dHNDaGFuZ2VkLCB0aGlzKSlcbiAgICAgICAgICAgIC5vbigna2V5ZG93bi5kYXRlcmFuZ2VwaWNrZXInLCAnLmRhdGVyYW5nZXBpY2tlcl9pbnB1dCBpbnB1dCcsICQucHJveHkodGhpcy5mb3JtSW5wdXRzS2V5ZG93biwgdGhpcykpO1xuXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJy5yYW5nZXMnKVxuICAgICAgICAgICAgLm9uKCdjbGljay5kYXRlcmFuZ2VwaWNrZXInLCAnYnV0dG9uLmFwcGx5QnRuJywgJC5wcm94eSh0aGlzLmNsaWNrQXBwbHksIHRoaXMpKVxuICAgICAgICAgICAgLm9uKCdjbGljay5kYXRlcmFuZ2VwaWNrZXInLCAnYnV0dG9uLmNhbmNlbEJ0bicsICQucHJveHkodGhpcy5jbGlja0NhbmNlbCwgdGhpcykpXG4gICAgICAgICAgICAub24oJ2NsaWNrLmRhdGVyYW5nZXBpY2tlcicsICdsaScsICQucHJveHkodGhpcy5jbGlja1JhbmdlLCB0aGlzKSlcbiAgICAgICAgICAgIC5vbignbW91c2VlbnRlci5kYXRlcmFuZ2VwaWNrZXInLCAnbGknLCAkLnByb3h5KHRoaXMuaG92ZXJSYW5nZSwgdGhpcykpXG4gICAgICAgICAgICAub24oJ21vdXNlbGVhdmUuZGF0ZXJhbmdlcGlja2VyJywgJ2xpJywgJC5wcm94eSh0aGlzLnVwZGF0ZUZvcm1JbnB1dHMsIHRoaXMpKTtcblxuICAgICAgICBpZiAodGhpcy5lbGVtZW50LmlzKCdpbnB1dCcpIHx8IHRoaXMuZWxlbWVudC5pcygnYnV0dG9uJykpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5vbih7XG4gICAgICAgICAgICAgICAgJ2NsaWNrLmRhdGVyYW5nZXBpY2tlcic6ICQucHJveHkodGhpcy5zaG93LCB0aGlzKSxcbiAgICAgICAgICAgICAgICAnZm9jdXMuZGF0ZXJhbmdlcGlja2VyJzogJC5wcm94eSh0aGlzLnNob3csIHRoaXMpLFxuICAgICAgICAgICAgICAgICdrZXl1cC5kYXRlcmFuZ2VwaWNrZXInOiAkLnByb3h5KHRoaXMuZWxlbWVudENoYW5nZWQsIHRoaXMpLFxuICAgICAgICAgICAgICAgICdrZXlkb3duLmRhdGVyYW5nZXBpY2tlcic6ICQucHJveHkodGhpcy5rZXlkb3duLCB0aGlzKSAvL0lFIDExIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm9uKCdjbGljay5kYXRlcmFuZ2VwaWNrZXInLCAkLnByb3h5KHRoaXMudG9nZ2xlLCB0aGlzKSk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQub24oJ2tleWRvd24uZGF0ZXJhbmdlcGlja2VyJywgJC5wcm94eSh0aGlzLnRvZ2dsZSwgdGhpcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gaWYgYXR0YWNoZWQgdG8gYSB0ZXh0IGlucHV0LCBzZXQgdGhlIGluaXRpYWwgdmFsdWVcbiAgICAgICAgLy9cblxuICAgICAgICBpZiAodGhpcy5lbGVtZW50LmlzKCdpbnB1dCcpICYmICF0aGlzLnNpbmdsZURhdGVQaWNrZXIgJiYgdGhpcy5hdXRvVXBkYXRlSW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC52YWwodGhpcy5zdGFydERhdGUuZm9ybWF0KHRoaXMubG9jYWxlLmZvcm1hdCkgKyB0aGlzLmxvY2FsZS5zZXBhcmF0b3IgKyB0aGlzLmVuZERhdGUuZm9ybWF0KHRoaXMubG9jYWxlLmZvcm1hdCkpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5pcygnaW5wdXQnKSAmJiB0aGlzLmF1dG9VcGRhdGVJbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnZhbCh0aGlzLnN0YXJ0RGF0ZS5mb3JtYXQodGhpcy5sb2NhbGUuZm9ybWF0KSk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBEYXRlUmFuZ2VQaWNrZXIucHJvdG90eXBlID0ge1xuXG4gICAgICAgIGNvbnN0cnVjdG9yOiBEYXRlUmFuZ2VQaWNrZXIsXG5cbiAgICAgICAgc2V0U3RhcnREYXRlOiBmdW5jdGlvbihzdGFydERhdGUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RhcnREYXRlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IG1vbWVudChzdGFydERhdGUsIHRoaXMubG9jYWxlLmZvcm1hdCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RhcnREYXRlID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IG1vbWVudChzdGFydERhdGUpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMudGltZVBpY2tlcilcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlLnN0YXJ0T2YoJ2RheScpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy50aW1lUGlja2VyICYmIHRoaXMudGltZVBpY2tlckluY3JlbWVudClcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5taW51dGUoTWF0aC5yb3VuZCh0aGlzLnN0YXJ0RGF0ZS5taW51dGUoKSAvIHRoaXMudGltZVBpY2tlckluY3JlbWVudCkgKiB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5taW5EYXRlICYmIHRoaXMuc3RhcnREYXRlLmlzQmVmb3JlKHRoaXMubWluRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMubWluRGF0ZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVQaWNrZXIgJiYgdGhpcy50aW1lUGlja2VySW5jcmVtZW50KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5taW51dGUoTWF0aC5yb3VuZCh0aGlzLnN0YXJ0RGF0ZS5taW51dGUoKSAvIHRoaXMudGltZVBpY2tlckluY3JlbWVudCkgKiB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5tYXhEYXRlICYmIHRoaXMuc3RhcnREYXRlLmlzQWZ0ZXIodGhpcy5tYXhEYXRlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5tYXhEYXRlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZVBpY2tlciAmJiB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLm1pbnV0ZShNYXRoLmZsb29yKHRoaXMuc3RhcnREYXRlLm1pbnV0ZSgpIC8gdGhpcy50aW1lUGlja2VySW5jcmVtZW50KSAqIHRoaXMudGltZVBpY2tlckluY3JlbWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pc1Nob3dpbmcpXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50KCk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlTW9udGhzSW5WaWV3KCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0RW5kRGF0ZTogZnVuY3Rpb24oZW5kRGF0ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbmREYXRlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICB0aGlzLmVuZERhdGUgPSBtb21lbnQoZW5kRGF0ZSwgdGhpcy5sb2NhbGUuZm9ybWF0KTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbmREYXRlID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICB0aGlzLmVuZERhdGUgPSBtb21lbnQoZW5kRGF0ZSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy50aW1lUGlja2VyKVxuICAgICAgICAgICAgICAgIHRoaXMuZW5kRGF0ZSA9IHRoaXMuZW5kRGF0ZS5hZGQoMSwnZCcpLnN0YXJ0T2YoJ2RheScpLnN1YnRyYWN0KDEsJ3NlY29uZCcpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy50aW1lUGlja2VyICYmIHRoaXMudGltZVBpY2tlckluY3JlbWVudClcbiAgICAgICAgICAgICAgICB0aGlzLmVuZERhdGUubWludXRlKE1hdGgucm91bmQodGhpcy5lbmREYXRlLm1pbnV0ZSgpIC8gdGhpcy50aW1lUGlja2VySW5jcmVtZW50KSAqIHRoaXMudGltZVBpY2tlckluY3JlbWVudCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVuZERhdGUuaXNCZWZvcmUodGhpcy5zdGFydERhdGUpKVxuICAgICAgICAgICAgICAgIHRoaXMuZW5kRGF0ZSA9IHRoaXMuc3RhcnREYXRlLmNsb25lKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1heERhdGUgJiYgdGhpcy5lbmREYXRlLmlzQWZ0ZXIodGhpcy5tYXhEYXRlKSlcbiAgICAgICAgICAgICAgICB0aGlzLmVuZERhdGUgPSB0aGlzLm1heERhdGUuY2xvbmUoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0ZUxpbWl0ICYmIHRoaXMuc3RhcnREYXRlLmNsb25lKCkuYWRkKHRoaXMuZGF0ZUxpbWl0KS5pc0JlZm9yZSh0aGlzLmVuZERhdGUpKVxuICAgICAgICAgICAgICAgIHRoaXMuZW5kRGF0ZSA9IHRoaXMuc3RhcnREYXRlLmNsb25lKCkuYWRkKHRoaXMuZGF0ZUxpbWl0KTtcblxuICAgICAgICAgICAgdGhpcy5wcmV2aW91c1JpZ2h0VGltZSA9IHRoaXMuZW5kRGF0ZS5jbG9uZSgpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTaG93aW5nKVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudCgpO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzSW52YWxpZERhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzQ3VzdG9tRGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlVmlldzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50aW1lUGlja2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKCdsZWZ0Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKCdyaWdodCcpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5lbmREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJy5yaWdodCAuY2FsZW5kYXItdGltZSBzZWxlY3QnKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJy5yaWdodCAuY2FsZW5kYXItdGltZSBzZWxlY3QnKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmVuZERhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dFtuYW1lPVwiZGF0ZXJhbmdlcGlja2VyX2VuZFwiXScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dFtuYW1lPVwiZGF0ZXJhbmdlcGlja2VyX3N0YXJ0XCJdJykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dFtuYW1lPVwiZGF0ZXJhbmdlcGlja2VyX2VuZFwiXScpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dFtuYW1lPVwiZGF0ZXJhbmdlcGlja2VyX3N0YXJ0XCJdJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1JbnB1dHMoKTtcbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGVNb250aHNJblZpZXc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZSkge1xuXG4gICAgICAgICAgICAgICAgLy9pZiBib3RoIGRhdGVzIGFyZSB2aXNpYmxlIGFscmVhZHksIGRvIG5vdGhpbmdcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2luZ2xlRGF0ZVBpY2tlciAmJiB0aGlzLmxlZnRDYWxlbmRhci5tb250aCAmJiB0aGlzLnJpZ2h0Q2FsZW5kYXIubW9udGggJiZcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3RhcnREYXRlLmZvcm1hdCgnWVlZWS1NTScpID09IHRoaXMubGVmdENhbGVuZGFyLm1vbnRoLmZvcm1hdCgnWVlZWS1NTScpIHx8IHRoaXMuc3RhcnREYXRlLmZvcm1hdCgnWVlZWS1NTScpID09IHRoaXMucmlnaHRDYWxlbmRhci5tb250aC5mb3JtYXQoJ1lZWVktTU0nKSlcbiAgICAgICAgICAgICAgICAgICAgJiZcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZW5kRGF0ZS5mb3JtYXQoJ1lZWVktTU0nKSA9PSB0aGlzLmxlZnRDYWxlbmRhci5tb250aC5mb3JtYXQoJ1lZWVktTU0nKSB8fCB0aGlzLmVuZERhdGUuZm9ybWF0KCdZWVlZLU1NJykgPT0gdGhpcy5yaWdodENhbGVuZGFyLm1vbnRoLmZvcm1hdCgnWVlZWS1NTScpKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubGVmdENhbGVuZGFyLm1vbnRoID0gdGhpcy5zdGFydERhdGUuY2xvbmUoKS5kYXRlKDIpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5saW5rZWRDYWxlbmRhcnMgJiYgKHRoaXMuZW5kRGF0ZS5tb250aCgpICE9IHRoaXMuc3RhcnREYXRlLm1vbnRoKCkgfHwgdGhpcy5lbmREYXRlLnllYXIoKSAhPSB0aGlzLnN0YXJ0RGF0ZS55ZWFyKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHRDYWxlbmRhci5tb250aCA9IHRoaXMuZW5kRGF0ZS5jbG9uZSgpLmRhdGUoMik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLm1vbnRoID0gdGhpcy5zdGFydERhdGUuY2xvbmUoKS5kYXRlKDIpLmFkZCgxLCAnbW9udGgnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGVmdENhbGVuZGFyLm1vbnRoLmZvcm1hdCgnWVlZWS1NTScpICE9IHRoaXMuc3RhcnREYXRlLmZvcm1hdCgnWVlZWS1NTScpICYmIHRoaXMucmlnaHRDYWxlbmRhci5tb250aC5mb3JtYXQoJ1lZWVktTU0nKSAhPSB0aGlzLnN0YXJ0RGF0ZS5mb3JtYXQoJ1lZWVktTU0nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZnRDYWxlbmRhci5tb250aCA9IHRoaXMuc3RhcnREYXRlLmNsb25lKCkuZGF0ZSgyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLm1vbnRoID0gdGhpcy5zdGFydERhdGUuY2xvbmUoKS5kYXRlKDIpLmFkZCgxLCAnbW9udGgnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5tYXhEYXRlICYmIHRoaXMubGlua2VkQ2FsZW5kYXJzICYmICF0aGlzLnNpbmdsZURhdGVQaWNrZXIgJiYgdGhpcy5yaWdodENhbGVuZGFyLm1vbnRoID4gdGhpcy5tYXhEYXRlKSB7XG4gICAgICAgICAgICAgIHRoaXMucmlnaHRDYWxlbmRhci5tb250aCA9IHRoaXMubWF4RGF0ZS5jbG9uZSgpLmRhdGUoMik7XG4gICAgICAgICAgICAgIHRoaXMubGVmdENhbGVuZGFyLm1vbnRoID0gdGhpcy5tYXhEYXRlLmNsb25lKCkuZGF0ZSgyKS5zdWJ0cmFjdCgxLCAnbW9udGgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGVDYWxlbmRhcnM6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICBpZiAodGhpcy50aW1lUGlja2VyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGhvdXIsIG1pbnV0ZSwgc2Vjb25kO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVuZERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaG91ciA9IHBhcnNlSW50KHRoaXMuY29udGFpbmVyLmZpbmQoJy5sZWZ0IC5ob3Vyc2VsZWN0JykudmFsKCksIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgbWludXRlID0gcGFyc2VJbnQodGhpcy5jb250YWluZXIuZmluZCgnLmxlZnQgLm1pbnV0ZXNlbGVjdCcpLnZhbCgpLCAxMCk7XG4gICAgICAgICAgICAgICAgICAgIHNlY29uZCA9IHRoaXMudGltZVBpY2tlclNlY29uZHMgPyBwYXJzZUludCh0aGlzLmNvbnRhaW5lci5maW5kKCcubGVmdCAuc2Vjb25kc2VsZWN0JykudmFsKCksIDEwKSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy50aW1lUGlja2VyMjRIb3VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYW1wbSA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy5sZWZ0IC5hbXBtc2VsZWN0JykudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW1wbSA9PT0gJ1BNJyAmJiBob3VyIDwgMTIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciArPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbXBtID09PSAnQU0nICYmIGhvdXIgPT09IDEyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaG91ciA9IHBhcnNlSW50KHRoaXMuY29udGFpbmVyLmZpbmQoJy5yaWdodCAuaG91cnNlbGVjdCcpLnZhbCgpLCAxMCk7XG4gICAgICAgICAgICAgICAgICAgIG1pbnV0ZSA9IHBhcnNlSW50KHRoaXMuY29udGFpbmVyLmZpbmQoJy5yaWdodCAubWludXRlc2VsZWN0JykudmFsKCksIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgc2Vjb25kID0gdGhpcy50aW1lUGlja2VyU2Vjb25kcyA/IHBhcnNlSW50KHRoaXMuY29udGFpbmVyLmZpbmQoJy5yaWdodCAuc2Vjb25kc2VsZWN0JykudmFsKCksIDEwKSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy50aW1lUGlja2VyMjRIb3VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYW1wbSA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy5yaWdodCAuYW1wbXNlbGVjdCcpLnZhbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFtcG0gPT09ICdQTScgJiYgaG91ciA8IDEyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgKz0gMTI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW1wbSA9PT0gJ0FNJyAmJiBob3VyID09PSAxMilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmxlZnRDYWxlbmRhci5tb250aC5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUpLnNlY29uZChzZWNvbmQpO1xuICAgICAgICAgICAgICAgIHRoaXMucmlnaHRDYWxlbmRhci5tb250aC5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUpLnNlY29uZChzZWNvbmQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJlbmRlckNhbGVuZGFyKCdsZWZ0Jyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNhbGVuZGFyKCdyaWdodCcpO1xuXG4gICAgICAgICAgICAvL2hpZ2hsaWdodCBhbnkgcHJlZGVmaW5lZCByYW5nZSBtYXRjaGluZyB0aGUgY3VycmVudCBzdGFydCBhbmQgZW5kIGRhdGVzXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCcucmFuZ2VzIGxpJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZSA9PSBudWxsKSByZXR1cm47XG5cbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ2hvc2VuTGFiZWwoKTtcbiAgICAgICAgfSxcblxuICAgICAgICByZW5kZXJDYWxlbmRhcjogZnVuY3Rpb24oc2lkZSkge1xuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQnVpbGQgdGhlIG1hdHJpeCBvZiBkYXRlcyB0aGF0IHdpbGwgcG9wdWxhdGUgdGhlIGNhbGVuZGFyXG4gICAgICAgICAgICAvL1xuXG4gICAgICAgICAgICB2YXIgY2FsZW5kYXIgPSBzaWRlID09ICdsZWZ0JyA/IHRoaXMubGVmdENhbGVuZGFyIDogdGhpcy5yaWdodENhbGVuZGFyO1xuICAgICAgICAgICAgdmFyIG1vbnRoID0gY2FsZW5kYXIubW9udGgubW9udGgoKTtcbiAgICAgICAgICAgIHZhciB5ZWFyID0gY2FsZW5kYXIubW9udGgueWVhcigpO1xuICAgICAgICAgICAgdmFyIGhvdXIgPSBjYWxlbmRhci5tb250aC5ob3VyKCk7XG4gICAgICAgICAgICB2YXIgbWludXRlID0gY2FsZW5kYXIubW9udGgubWludXRlKCk7XG4gICAgICAgICAgICB2YXIgc2Vjb25kID0gY2FsZW5kYXIubW9udGguc2Vjb25kKCk7XG4gICAgICAgICAgICB2YXIgZGF5c0luTW9udGggPSBtb21lbnQoW3llYXIsIG1vbnRoXSkuZGF5c0luTW9udGgoKTtcbiAgICAgICAgICAgIHZhciBmaXJzdERheSA9IG1vbWVudChbeWVhciwgbW9udGgsIDFdKTtcbiAgICAgICAgICAgIHZhciBsYXN0RGF5ID0gbW9tZW50KFt5ZWFyLCBtb250aCwgZGF5c0luTW9udGhdKTtcbiAgICAgICAgICAgIHZhciBsYXN0TW9udGggPSBtb21lbnQoZmlyc3REYXkpLnN1YnRyYWN0KDEsICdtb250aCcpLm1vbnRoKCk7XG4gICAgICAgICAgICB2YXIgbGFzdFllYXIgPSBtb21lbnQoZmlyc3REYXkpLnN1YnRyYWN0KDEsICdtb250aCcpLnllYXIoKTtcbiAgICAgICAgICAgIHZhciBkYXlzSW5MYXN0TW9udGggPSBtb21lbnQoW2xhc3RZZWFyLCBsYXN0TW9udGhdKS5kYXlzSW5Nb250aCgpO1xuICAgICAgICAgICAgdmFyIGRheU9mV2VlayA9IGZpcnN0RGF5LmRheSgpO1xuXG4gICAgICAgICAgICAvL2luaXRpYWxpemUgYSA2IHJvd3MgeCA3IGNvbHVtbnMgYXJyYXkgZm9yIHRoZSBjYWxlbmRhclxuICAgICAgICAgICAgdmFyIGNhbGVuZGFyID0gW107XG4gICAgICAgICAgICBjYWxlbmRhci5maXJzdERheSA9IGZpcnN0RGF5O1xuICAgICAgICAgICAgY2FsZW5kYXIubGFzdERheSA9IGxhc3REYXk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJbaV0gPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9wb3B1bGF0ZSB0aGUgY2FsZW5kYXIgd2l0aCBkYXRlIG9iamVjdHNcbiAgICAgICAgICAgIHZhciBzdGFydERheSA9IGRheXNJbkxhc3RNb250aCAtIGRheU9mV2VlayArIHRoaXMubG9jYWxlLmZpcnN0RGF5ICsgMTtcbiAgICAgICAgICAgIGlmIChzdGFydERheSA+IGRheXNJbkxhc3RNb250aClcbiAgICAgICAgICAgICAgICBzdGFydERheSAtPSA3O1xuXG4gICAgICAgICAgICBpZiAoZGF5T2ZXZWVrID09IHRoaXMubG9jYWxlLmZpcnN0RGF5KVxuICAgICAgICAgICAgICAgIHN0YXJ0RGF5ID0gZGF5c0luTGFzdE1vbnRoIC0gNjtcblxuICAgICAgICAgICAgdmFyIGN1ckRhdGUgPSBtb21lbnQoW2xhc3RZZWFyLCBsYXN0TW9udGgsIHN0YXJ0RGF5LCAxMiwgbWludXRlLCBzZWNvbmRdKTtcblxuICAgICAgICAgICAgdmFyIGNvbCwgcm93O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGNvbCA9IDAsIHJvdyA9IDA7IGkgPCA0MjsgaSsrLCBjb2wrKywgY3VyRGF0ZSA9IG1vbWVudChjdXJEYXRlKS5hZGQoMjQsICdob3VyJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgY29sICUgNyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb2wgPSAwO1xuICAgICAgICAgICAgICAgICAgICByb3crKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJbcm93XVtjb2xdID0gY3VyRGF0ZS5jbG9uZSgpLmhvdXIoaG91cikubWludXRlKG1pbnV0ZSkuc2Vjb25kKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgY3VyRGF0ZS5ob3VyKDEyKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09IHRoaXMubWluRGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uaXNCZWZvcmUodGhpcy5taW5EYXRlKSAmJiBzaWRlID09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgICAgICBjYWxlbmRhcltyb3ddW2NvbF0gPSB0aGlzLm1pbkRhdGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXhEYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PSB0aGlzLm1heERhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmlzQWZ0ZXIodGhpcy5tYXhEYXRlKSAmJiBzaWRlID09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJbcm93XVtjb2xdID0gdGhpcy5tYXhEYXRlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vbWFrZSB0aGUgY2FsZW5kYXIgb2JqZWN0IGF2YWlsYWJsZSB0byBob3ZlckRhdGUvY2xpY2tEYXRlXG4gICAgICAgICAgICBpZiAoc2lkZSA9PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnRDYWxlbmRhci5jYWxlbmRhciA9IGNhbGVuZGFyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIuY2FsZW5kYXIgPSBjYWxlbmRhcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIERpc3BsYXkgdGhlIGNhbGVuZGFyXG4gICAgICAgICAgICAvL1xuXG4gICAgICAgICAgICB2YXIgbWluRGF0ZSA9IHNpZGUgPT0gJ2xlZnQnID8gdGhpcy5taW5EYXRlIDogdGhpcy5zdGFydERhdGU7XG4gICAgICAgICAgICB2YXIgbWF4RGF0ZSA9IHRoaXMubWF4RGF0ZTtcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNpZGUgPT0gJ2xlZnQnID8gdGhpcy5zdGFydERhdGUgOiB0aGlzLmVuZERhdGU7XG4gICAgICAgICAgICB2YXIgYXJyb3cgPSB0aGlzLmxvY2FsZS5kaXJlY3Rpb24gPT0gJ2x0cicgPyB7bGVmdDogJ2NoZXZyb24tbGVmdCcsIHJpZ2h0OiAnY2hldnJvbi1yaWdodCd9IDoge2xlZnQ6ICdjaGV2cm9uLXJpZ2h0JywgcmlnaHQ6ICdjaGV2cm9uLWxlZnQnfTtcblxuICAgICAgICAgICAgdmFyIGh0bWwgPSAnPHRhYmxlIGNsYXNzPVwidGFibGUtY29uZGVuc2VkXCI+JztcbiAgICAgICAgICAgIGh0bWwgKz0gJzx0aGVhZD4nO1xuICAgICAgICAgICAgaHRtbCArPSAnPHRyPic7XG5cbiAgICAgICAgICAgIC8vIGFkZCBlbXB0eSBjZWxsIGZvciB3ZWVrIG51bWJlclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1dlZWtOdW1iZXJzIHx8IHRoaXMuc2hvd0lTT1dlZWtOdW1iZXJzKVxuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzx0aD48L3RoPic7XG5cbiAgICAgICAgICAgIGlmICgoIW1pbkRhdGUgfHwgbWluRGF0ZS5pc0JlZm9yZShjYWxlbmRhci5maXJzdERheSkpICYmICghdGhpcy5saW5rZWRDYWxlbmRhcnMgfHwgc2lkZSA9PSAnbGVmdCcpKSB7XG4gICAgICAgICAgICAgICAgaHRtbCArPSAnPHRoIGNsYXNzPVwicHJldiBhdmFpbGFibGVcIj48aSBjbGFzcz1cImZhIGZhLScgKyBhcnJvdy5sZWZ0ICsgJyBnbHlwaGljb24gZ2x5cGhpY29uLScgKyBhcnJvdy5sZWZ0ICsgJ1wiPjwvaT48L3RoPic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzx0aD48L3RoPic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBkYXRlSHRtbCA9IHRoaXMubG9jYWxlLm1vbnRoTmFtZXNbY2FsZW5kYXJbMV1bMV0ubW9udGgoKV0gKyBjYWxlbmRhclsxXVsxXS5mb3JtYXQoXCIgWVlZWVwiKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0Ryb3Bkb3ducykge1xuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TW9udGggPSBjYWxlbmRhclsxXVsxXS5tb250aCgpO1xuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50WWVhciA9IGNhbGVuZGFyWzFdWzFdLnllYXIoKTtcbiAgICAgICAgICAgICAgICB2YXIgbWF4WWVhciA9IChtYXhEYXRlICYmIG1heERhdGUueWVhcigpKSB8fCAoY3VycmVudFllYXIgKyA1KTtcbiAgICAgICAgICAgICAgICB2YXIgbWluWWVhciA9IChtaW5EYXRlICYmIG1pbkRhdGUueWVhcigpKSB8fCAoY3VycmVudFllYXIgLSA1MCk7XG4gICAgICAgICAgICAgICAgdmFyIGluTWluWWVhciA9IGN1cnJlbnRZZWFyID09IG1pblllYXI7XG4gICAgICAgICAgICAgICAgdmFyIGluTWF4WWVhciA9IGN1cnJlbnRZZWFyID09IG1heFllYXI7XG5cbiAgICAgICAgICAgICAgICB2YXIgbW9udGhIdG1sID0gJzxzZWxlY3QgY2xhc3M9XCJtb250aHNlbGVjdFwiPic7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCAxMjsgbSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoIWluTWluWWVhciB8fCBtID49IG1pbkRhdGUubW9udGgoKSkgJiYgKCFpbk1heFllYXIgfHwgbSA8PSBtYXhEYXRlLm1vbnRoKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb250aEh0bWwgKz0gXCI8b3B0aW9uIHZhbHVlPSdcIiArIG0gKyBcIidcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG0gPT09IGN1cnJlbnRNb250aCA/IFwiIHNlbGVjdGVkPSdzZWxlY3RlZCdcIiA6IFwiXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cIiArIHRoaXMubG9jYWxlLm1vbnRoTmFtZXNbbV0gKyBcIjwvb3B0aW9uPlwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhIdG1sICs9IFwiPG9wdGlvbiB2YWx1ZT0nXCIgKyBtICsgXCInXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtID09PSBjdXJyZW50TW9udGggPyBcIiBzZWxlY3RlZD0nc2VsZWN0ZWQnXCIgOiBcIlwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgZGlzYWJsZWQ9J2Rpc2FibGVkJz5cIiArIHRoaXMubG9jYWxlLm1vbnRoTmFtZXNbbV0gKyBcIjwvb3B0aW9uPlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1vbnRoSHRtbCArPSBcIjwvc2VsZWN0PlwiO1xuXG4gICAgICAgICAgICAgICAgdmFyIHllYXJIdG1sID0gJzxzZWxlY3QgY2xhc3M9XCJ5ZWFyc2VsZWN0XCI+JztcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB5ID0gbWluWWVhcjsgeSA8PSBtYXhZZWFyOyB5KyspIHtcbiAgICAgICAgICAgICAgICAgICAgeWVhckh0bWwgKz0gJzxvcHRpb24gdmFsdWU9XCInICsgeSArICdcIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHkgPT09IGN1cnJlbnRZZWFyID8gJyBzZWxlY3RlZD1cInNlbGVjdGVkXCInIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc+JyArIHkgKyAnPC9vcHRpb24+JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeWVhckh0bWwgKz0gJzwvc2VsZWN0Pic7XG5cbiAgICAgICAgICAgICAgICBkYXRlSHRtbCA9IG1vbnRoSHRtbCArIHllYXJIdG1sO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBodG1sICs9ICc8dGggY29sc3Bhbj1cIjVcIiBjbGFzcz1cIm1vbnRoXCI+JyArIGRhdGVIdG1sICsgJzwvdGg+JztcbiAgICAgICAgICAgIGlmICgoIW1heERhdGUgfHwgbWF4RGF0ZS5pc0FmdGVyKGNhbGVuZGFyLmxhc3REYXkpKSAmJiAoIXRoaXMubGlua2VkQ2FsZW5kYXJzIHx8IHNpZGUgPT0gJ3JpZ2h0JyB8fCB0aGlzLnNpbmdsZURhdGVQaWNrZXIpKSB7XG4gICAgICAgICAgICAgICAgaHRtbCArPSAnPHRoIGNsYXNzPVwibmV4dCBhdmFpbGFibGVcIj48aSBjbGFzcz1cImZhIGZhLScgKyBhcnJvdy5yaWdodCArICcgZ2x5cGhpY29uIGdseXBoaWNvbi0nICsgYXJyb3cucmlnaHQgKyAnXCI+PC9pPjwvdGg+JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaHRtbCArPSAnPHRoPjwvdGg+JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICAgICAgaHRtbCArPSAnPHRyPic7XG5cbiAgICAgICAgICAgIC8vIGFkZCB3ZWVrIG51bWJlciBsYWJlbFxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1dlZWtOdW1iZXJzIHx8IHRoaXMuc2hvd0lTT1dlZWtOdW1iZXJzKVxuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzx0aCBjbGFzcz1cIndlZWtcIj4nICsgdGhpcy5sb2NhbGUud2Vla0xhYmVsICsgJzwvdGg+JztcblxuICAgICAgICAgICAgJC5lYWNoKHRoaXMubG9jYWxlLmRheXNPZldlZWssIGZ1bmN0aW9uKGluZGV4LCBkYXlPZldlZWspIHtcbiAgICAgICAgICAgICAgICBodG1sICs9ICc8dGg+JyArIGRheU9mV2VlayArICc8L3RoPic7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICAgICAgaHRtbCArPSAnPC90aGVhZD4nO1xuICAgICAgICAgICAgaHRtbCArPSAnPHRib2R5Pic7XG5cbiAgICAgICAgICAgIC8vYWRqdXN0IG1heERhdGUgdG8gcmVmbGVjdCB0aGUgZGF0ZUxpbWl0IHNldHRpbmcgaW4gb3JkZXIgdG9cbiAgICAgICAgICAgIC8vZ3JleSBvdXQgZW5kIGRhdGVzIGJleW9uZCB0aGUgZGF0ZUxpbWl0XG4gICAgICAgICAgICBpZiAodGhpcy5lbmREYXRlID09IG51bGwgJiYgdGhpcy5kYXRlTGltaXQpIHtcbiAgICAgICAgICAgICAgICB2YXIgbWF4TGltaXQgPSB0aGlzLnN0YXJ0RGF0ZS5jbG9uZSgpLmFkZCh0aGlzLmRhdGVMaW1pdCkuZW5kT2YoJ2RheScpO1xuICAgICAgICAgICAgICAgIGlmICghbWF4RGF0ZSB8fCBtYXhMaW1pdC5pc0JlZm9yZShtYXhEYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXhEYXRlID0gbWF4TGltaXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCA2OyByb3crKykge1xuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzx0cj4nO1xuXG4gICAgICAgICAgICAgICAgLy8gYWRkIHdlZWsgbnVtYmVyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1dlZWtOdW1iZXJzKVxuICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8dGQgY2xhc3M9XCJ3ZWVrXCI+JyArIGNhbGVuZGFyW3Jvd11bMF0ud2VlaygpICsgJzwvdGQ+JztcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNob3dJU09XZWVrTnVtYmVycylcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPHRkIGNsYXNzPVwid2Vla1wiPicgKyBjYWxlbmRhcltyb3ddWzBdLmlzb1dlZWsoKSArICc8L3RkPic7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCA3OyBjb2wrKykge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBjbGFzc2VzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgLy9oaWdobGlnaHQgdG9kYXkncyBkYXRlXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxlbmRhcltyb3ddW2NvbF0uaXNTYW1lKG5ldyBEYXRlKCksIFwiZGF5XCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCd0b2RheScpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vaGlnaGxpZ2h0IHdlZWtlbmRzXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxlbmRhcltyb3ddW2NvbF0uaXNvV2Vla2RheSgpID4gNSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnd2Vla2VuZCcpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vZ3JleSBvdXQgdGhlIGRhdGVzIGluIG90aGVyIG1vbnRocyBkaXNwbGF5ZWQgYXQgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhpcyBjYWxlbmRhclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsZW5kYXJbcm93XVtjb2xdLm1vbnRoKCkgIT0gY2FsZW5kYXJbMV1bMV0ubW9udGgoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnb2ZmJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBhbGxvdyBzZWxlY3Rpb24gb2YgZGF0ZXMgYmVmb3JlIHRoZSBtaW5pbXVtIGRhdGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWluRGF0ZSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uaXNCZWZvcmUodGhpcy5taW5EYXRlLCAnZGF5JykpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ29mZicsICdkaXNhYmxlZCcpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgYWxsb3cgc2VsZWN0aW9uIG9mIGRhdGVzIGFmdGVyIHRoZSBtYXhpbXVtIGRhdGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmlzQWZ0ZXIobWF4RGF0ZSwgJ2RheScpKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdvZmYnLCAnZGlzYWJsZWQnKTtcblxuICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IGFsbG93IHNlbGVjdGlvbiBvZiBkYXRlIGlmIGEgY3VzdG9tIGZ1bmN0aW9uIGRlY2lkZXMgaXQncyBpbnZhbGlkXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW52YWxpZERhdGUoY2FsZW5kYXJbcm93XVtjb2xdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnb2ZmJywgJ2Rpc2FibGVkJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9oaWdobGlnaHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzdGFydCBkYXRlXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxlbmRhcltyb3ddW2NvbF0uZm9ybWF0KCdZWVlZLU1NLUREJykgPT0gdGhpcy5zdGFydERhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2FjdGl2ZScsICdzdGFydC1kYXRlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9oaWdobGlnaHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbmQgZGF0ZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lbmREYXRlICE9IG51bGwgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09IHRoaXMuZW5kRGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnYWN0aXZlJywgJ2VuZC1kYXRlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9oaWdobGlnaHQgZGF0ZXMgaW4tYmV0d2VlbiB0aGUgc2VsZWN0ZWQgZGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZSAhPSBudWxsICYmIGNhbGVuZGFyW3Jvd11bY29sXSA+IHRoaXMuc3RhcnREYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXSA8IHRoaXMuZW5kRGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaW4tcmFuZ2UnKTtcblxuICAgICAgICAgICAgICAgICAgICAvL2FwcGx5IGN1c3RvbSBjbGFzc2VzIGZvciB0aGlzIGRhdGVcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzQ3VzdG9tID0gdGhpcy5pc0N1c3RvbURhdGUoY2FsZW5kYXJbcm93XVtjb2xdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ3VzdG9tICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpc0N1c3RvbSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKGlzQ3VzdG9tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShjbGFzc2VzLCBpc0N1c3RvbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgY25hbWUgPSAnJywgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSArPSBjbGFzc2VzW2ldICsgJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzZXNbaV0gPT0gJ2Rpc2FibGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICs9ICdhdmFpbGFibGUnO1xuXG4gICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzx0ZCBjbGFzcz1cIicgKyBjbmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJykgKyAnXCIgZGF0YS10aXRsZT1cIicgKyAncicgKyByb3cgKyAnYycgKyBjb2wgKyAnXCI+JyArIGNhbGVuZGFyW3Jvd11bY29sXS5kYXRlKCkgKyAnPC90ZD4nO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaHRtbCArPSAnPC90Ym9keT4nO1xuICAgICAgICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCcuY2FsZW5kYXIuJyArIHNpZGUgKyAnIC5jYWxlbmRhci10YWJsZScpLmh0bWwoaHRtbCk7XG5cbiAgICAgICAgfSxcblxuICAgICAgICByZW5kZXJUaW1lUGlja2VyOiBmdW5jdGlvbihzaWRlKSB7XG5cbiAgICAgICAgICAgIC8vIERvbid0IGJvdGhlciB1cGRhdGluZyB0aGUgdGltZSBwaWNrZXIgaWYgaXQncyBjdXJyZW50bHkgZGlzYWJsZWRcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgYW4gZW5kIGRhdGUgaGFzbid0IGJlZW4gY2xpY2tlZCB5ZXRcbiAgICAgICAgICAgIGlmIChzaWRlID09ICdyaWdodCcgJiYgIXRoaXMuZW5kRGF0ZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICB2YXIgaHRtbCwgc2VsZWN0ZWQsIG1pbkRhdGUsIG1heERhdGUgPSB0aGlzLm1heERhdGU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGVMaW1pdCAmJiAoIXRoaXMubWF4RGF0ZSB8fCB0aGlzLnN0YXJ0RGF0ZS5jbG9uZSgpLmFkZCh0aGlzLmRhdGVMaW1pdCkuaXNBZnRlcih0aGlzLm1heERhdGUpKSlcbiAgICAgICAgICAgICAgICBtYXhEYXRlID0gdGhpcy5zdGFydERhdGUuY2xvbmUoKS5hZGQodGhpcy5kYXRlTGltaXQpO1xuXG4gICAgICAgICAgICBpZiAoc2lkZSA9PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRoaXMuc3RhcnREYXRlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgbWluRGF0ZSA9IHRoaXMubWluRGF0ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2lkZSA9PSAncmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSB0aGlzLmVuZERhdGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICBtaW5EYXRlID0gdGhpcy5zdGFydERhdGU7XG5cbiAgICAgICAgICAgICAgICAvL1ByZXNlcnZlIHRoZSB0aW1lIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICB2YXIgdGltZVNlbGVjdG9yID0gdGhpcy5jb250YWluZXIuZmluZCgnLmNhbGVuZGFyLnJpZ2h0IC5jYWxlbmRhci10aW1lIGRpdicpO1xuICAgICAgICAgICAgICAgIGlmICh0aW1lU2VsZWN0b3IuaHRtbCgpICE9ICcnKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQuaG91cih0aW1lU2VsZWN0b3IuZmluZCgnLmhvdXJzZWxlY3Qgb3B0aW9uOnNlbGVjdGVkJykudmFsKCkgfHwgc2VsZWN0ZWQuaG91cigpKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQubWludXRlKHRpbWVTZWxlY3Rvci5maW5kKCcubWludXRlc2VsZWN0IG9wdGlvbjpzZWxlY3RlZCcpLnZhbCgpIHx8IHNlbGVjdGVkLm1pbnV0ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQuc2Vjb25kKHRpbWVTZWxlY3Rvci5maW5kKCcuc2Vjb25kc2VsZWN0IG9wdGlvbjpzZWxlY3RlZCcpLnZhbCgpIHx8IHNlbGVjdGVkLnNlY29uZCgpKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMudGltZVBpY2tlcjI0SG91cikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFtcG0gPSB0aW1lU2VsZWN0b3IuZmluZCgnLmFtcG1zZWxlY3Qgb3B0aW9uOnNlbGVjdGVkJykudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW1wbSA9PT0gJ1BNJyAmJiBzZWxlY3RlZC5ob3VyKCkgPCAxMilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC5ob3VyKHNlbGVjdGVkLmhvdXIoKSArIDEyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbXBtID09PSAnQU0nICYmIHNlbGVjdGVkLmhvdXIoKSA9PT0gMTIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQuaG91cigwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkLmlzQmVmb3JlKHRoaXMuc3RhcnREYXRlKSlcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSB0aGlzLnN0YXJ0RGF0ZS5jbG9uZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1heERhdGUgJiYgc2VsZWN0ZWQuaXNBZnRlcihtYXhEYXRlKSlcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBtYXhEYXRlLmNsb25lKCk7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIGhvdXJzXG4gICAgICAgICAgICAvL1xuXG4gICAgICAgICAgICBodG1sID0gJzxzZWxlY3QgY2xhc3M9XCJob3Vyc2VsZWN0XCI+JztcblxuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy50aW1lUGlja2VyMjRIb3VyID8gMCA6IDE7XG4gICAgICAgICAgICB2YXIgZW5kID0gdGhpcy50aW1lUGlja2VyMjRIb3VyID8gMjMgOiAxMjtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlfaW5fMjQgPSBpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy50aW1lUGlja2VyMjRIb3VyKVxuICAgICAgICAgICAgICAgICAgICBpX2luXzI0ID0gc2VsZWN0ZWQuaG91cigpID49IDEyID8gKGkgPT0gMTIgPyAxMiA6IGkgKyAxMikgOiAoaSA9PSAxMiA/IDAgOiBpKTtcblxuICAgICAgICAgICAgICAgIHZhciB0aW1lID0gc2VsZWN0ZWQuY2xvbmUoKS5ob3VyKGlfaW5fMjQpO1xuICAgICAgICAgICAgICAgIHZhciBkaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChtaW5EYXRlICYmIHRpbWUubWludXRlKDU5KS5pc0JlZm9yZShtaW5EYXRlKSlcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChtYXhEYXRlICYmIHRpbWUubWludXRlKDApLmlzQWZ0ZXIobWF4RGF0ZSkpXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChpX2luXzI0ID09IHNlbGVjdGVkLmhvdXIoKSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyBpICsgJ1wiIHNlbGVjdGVkPVwic2VsZWN0ZWRcIj4nICsgaSArICc8L29wdGlvbj4nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyBpICsgJ1wiIGRpc2FibGVkPVwiZGlzYWJsZWRcIiBjbGFzcz1cImRpc2FibGVkXCI+JyArIGkgKyAnPC9vcHRpb24+JztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIGkgKyAnXCI+JyArIGkgKyAnPC9vcHRpb24+JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGh0bWwgKz0gJzwvc2VsZWN0PiAnO1xuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gbWludXRlc1xuICAgICAgICAgICAgLy9cblxuICAgICAgICAgICAgaHRtbCArPSAnOiA8c2VsZWN0IGNsYXNzPVwibWludXRlc2VsZWN0XCI+JztcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2MDsgaSArPSB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFkZGVkID0gaSA8IDEwID8gJzAnICsgaSA6IGk7XG4gICAgICAgICAgICAgICAgdmFyIHRpbWUgPSBzZWxlY3RlZC5jbG9uZSgpLm1pbnV0ZShpKTtcblxuICAgICAgICAgICAgICAgIHZhciBkaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChtaW5EYXRlICYmIHRpbWUuc2Vjb25kKDU5KS5pc0JlZm9yZShtaW5EYXRlKSlcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChtYXhEYXRlICYmIHRpbWUuc2Vjb25kKDApLmlzQWZ0ZXIobWF4RGF0ZSkpXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZC5taW51dGUoKSA9PSBpICYmICFkaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIGkgKyAnXCIgc2VsZWN0ZWQ9XCJzZWxlY3RlZFwiPicgKyBwYWRkZWQgKyAnPC9vcHRpb24+JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxvcHRpb24gdmFsdWU9XCInICsgaSArICdcIiBkaXNhYmxlZD1cImRpc2FibGVkXCIgY2xhc3M9XCJkaXNhYmxlZFwiPicgKyBwYWRkZWQgKyAnPC9vcHRpb24+JztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIGkgKyAnXCI+JyArIHBhZGRlZCArICc8L29wdGlvbj4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaHRtbCArPSAnPC9zZWxlY3Q+ICc7XG5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBzZWNvbmRzXG4gICAgICAgICAgICAvL1xuXG4gICAgICAgICAgICBpZiAodGhpcy50aW1lUGlja2VyU2Vjb25kcykge1xuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzogPHNlbGVjdCBjbGFzcz1cInNlY29uZHNlbGVjdFwiPic7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDYwOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhZGRlZCA9IGkgPCAxMCA/ICcwJyArIGkgOiBpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGltZSA9IHNlbGVjdGVkLmNsb25lKCkuc2Vjb25kKGkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWluRGF0ZSAmJiB0aW1lLmlzQmVmb3JlKG1pbkRhdGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF4RGF0ZSAmJiB0aW1lLmlzQWZ0ZXIobWF4RGF0ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkLnNlY29uZCgpID09IGkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIGkgKyAnXCIgc2VsZWN0ZWQ9XCJzZWxlY3RlZFwiPicgKyBwYWRkZWQgKyAnPC9vcHRpb24+JztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyBpICsgJ1wiIGRpc2FibGVkPVwiZGlzYWJsZWRcIiBjbGFzcz1cImRpc2FibGVkXCI+JyArIHBhZGRlZCArICc8L29wdGlvbj4nO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyBpICsgJ1wiPicgKyBwYWRkZWQgKyAnPC9vcHRpb24+JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzwvc2VsZWN0PiAnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQU0vUE1cbiAgICAgICAgICAgIC8vXG5cbiAgICAgICAgICAgIGlmICghdGhpcy50aW1lUGlja2VyMjRIb3VyKSB7XG4gICAgICAgICAgICAgICAgaHRtbCArPSAnPHNlbGVjdCBjbGFzcz1cImFtcG1zZWxlY3RcIj4nO1xuXG4gICAgICAgICAgICAgICAgdmFyIGFtX2h0bWwgPSAnJztcbiAgICAgICAgICAgICAgICB2YXIgcG1faHRtbCA9ICcnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1pbkRhdGUgJiYgc2VsZWN0ZWQuY2xvbmUoKS5ob3VyKDEyKS5taW51dGUoMCkuc2Vjb25kKDApLmlzQmVmb3JlKG1pbkRhdGUpKVxuICAgICAgICAgICAgICAgICAgICBhbV9odG1sID0gJyBkaXNhYmxlZD1cImRpc2FibGVkXCIgY2xhc3M9XCJkaXNhYmxlZFwiJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXhEYXRlICYmIHNlbGVjdGVkLmNsb25lKCkuaG91cigwKS5taW51dGUoMCkuc2Vjb25kKDApLmlzQWZ0ZXIobWF4RGF0ZSkpXG4gICAgICAgICAgICAgICAgICAgIHBtX2h0bWwgPSAnIGRpc2FibGVkPVwiZGlzYWJsZWRcIiBjbGFzcz1cImRpc2FibGVkXCInO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkLmhvdXIoKSA+PSAxMikge1xuICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8b3B0aW9uIHZhbHVlPVwiQU1cIicgKyBhbV9odG1sICsgJz5BTTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJQTVwiIHNlbGVjdGVkPVwic2VsZWN0ZWRcIicgKyBwbV9odG1sICsgJz5QTTwvb3B0aW9uPic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT1cIkFNXCIgc2VsZWN0ZWQ9XCJzZWxlY3RlZFwiJyArIGFtX2h0bWwgKyAnPkFNPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIlBNXCInICsgcG1faHRtbCArICc+UE08L29wdGlvbj4nO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzwvc2VsZWN0Pic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJy5jYWxlbmRhci4nICsgc2lkZSArICcgLmNhbGVuZGFyLXRpbWUgZGl2JykuaHRtbChodG1sKTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZUZvcm1JbnB1dHM6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvL2lnbm9yZSBtb3VzZSBtb3ZlbWVudHMgd2hpbGUgYW4gYWJvdmUtY2FsZW5kYXIgdGV4dCBpbnB1dCBoYXMgZm9jdXNcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dFtuYW1lPWRhdGVyYW5nZXBpY2tlcl9zdGFydF0nKS5pcyhcIjpmb2N1c1wiKSB8fCB0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dFtuYW1lPWRhdGVyYW5nZXBpY2tlcl9lbmRdJykuaXMoXCI6Zm9jdXNcIikpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dFtuYW1lPWRhdGVyYW5nZXBpY2tlcl9zdGFydF0nKS52YWwodGhpcy5zdGFydERhdGUuZm9ybWF0KHRoaXMubG9jYWxlLmZvcm1hdCkpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZSlcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dFtuYW1lPWRhdGVyYW5nZXBpY2tlcl9lbmRdJykudmFsKHRoaXMuZW5kRGF0ZS5mb3JtYXQodGhpcy5sb2NhbGUuZm9ybWF0KSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNpbmdsZURhdGVQaWNrZXIgfHwgKHRoaXMuZW5kRGF0ZSAmJiAodGhpcy5zdGFydERhdGUuaXNCZWZvcmUodGhpcy5lbmREYXRlKSB8fCB0aGlzLnN0YXJ0RGF0ZS5pc1NhbWUodGhpcy5lbmREYXRlKSkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuZmluZCgnYnV0dG9uLmFwcGx5QnRuJykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuZmluZCgnYnV0dG9uLmFwcGx5QnRuJykuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIG1vdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIHBhcmVudE9mZnNldCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH0sXG4gICAgICAgICAgICAgICAgY29udGFpbmVyVG9wO1xuICAgICAgICAgICAgdmFyIHBhcmVudFJpZ2h0RWRnZSA9ICQod2luZG93KS53aWR0aCgpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcmVudEVsLmlzKCdib2R5JykpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRPZmZzZXQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogdGhpcy5wYXJlbnRFbC5vZmZzZXQoKS50b3AgLSB0aGlzLnBhcmVudEVsLnNjcm9sbFRvcCgpLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiB0aGlzLnBhcmVudEVsLm9mZnNldCgpLmxlZnQgLSB0aGlzLnBhcmVudEVsLnNjcm9sbExlZnQoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcGFyZW50UmlnaHRFZGdlID0gdGhpcy5wYXJlbnRFbFswXS5jbGllbnRXaWR0aCArIHRoaXMucGFyZW50RWwub2Zmc2V0KCkubGVmdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZHJvcHMgPT0gJ3VwJylcbiAgICAgICAgICAgICAgICBjb250YWluZXJUb3AgPSB0aGlzLmVsZW1lbnQub2Zmc2V0KCkudG9wIC0gdGhpcy5jb250YWluZXIub3V0ZXJIZWlnaHQoKSAtIHBhcmVudE9mZnNldC50b3A7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY29udGFpbmVyVG9wID0gdGhpcy5lbGVtZW50Lm9mZnNldCgpLnRvcCArIHRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpIC0gcGFyZW50T2Zmc2V0LnRvcDtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyW3RoaXMuZHJvcHMgPT0gJ3VwJyA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnXSgnZHJvcHVwJyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wZW5zID09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogY29udGFpbmVyVG9wLFxuICAgICAgICAgICAgICAgICAgICByaWdodDogcGFyZW50UmlnaHRFZGdlIC0gdGhpcy5lbGVtZW50Lm9mZnNldCgpLmxlZnQgLSB0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAnYXV0bydcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXIub2Zmc2V0KCkubGVmdCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAnYXV0bycsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiA5XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcGVucyA9PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogY29udGFpbmVyVG9wLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiB0aGlzLmVsZW1lbnQub2Zmc2V0KCkubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0ICsgdGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSAvIDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoaXMuY29udGFpbmVyLm91dGVyV2lkdGgoKSAvIDIsXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAnYXV0bydcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXIub2Zmc2V0KCkubGVmdCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAnYXV0bycsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiA5XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBjb250YWluZXJUb3AsXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IHRoaXMuZWxlbWVudC5vZmZzZXQoKS5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQsXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAnYXV0bydcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXIub2Zmc2V0KCkubGVmdCArIHRoaXMuY29udGFpbmVyLm91dGVyV2lkdGgoKSA+ICQod2luZG93KS53aWR0aCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAnYXV0bycsXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodDogMFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2hvdzogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTaG93aW5nKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNsaWNrIHByb3h5IHRoYXQgaXMgcHJpdmF0ZSB0byB0aGlzIGluc3RhbmNlIG9mIGRhdGVwaWNrZXIsIGZvciB1bmJpbmRpbmdcbiAgICAgICAgICAgIHRoaXMuX291dHNpZGVDbGlja1Byb3h5ID0gJC5wcm94eShmdW5jdGlvbihlKSB7IHRoaXMub3V0c2lkZUNsaWNrKGUpOyB9LCB0aGlzKTtcblxuICAgICAgICAgICAgLy8gQmluZCBnbG9iYWwgZGF0ZXBpY2tlciBtb3VzZWRvd24gZm9yIGhpZGluZyBhbmRcbiAgICAgICAgICAgICQoZG9jdW1lbnQpXG4gICAgICAgICAgICAgIC5vbignbW91c2Vkb3duLmRhdGVyYW5nZXBpY2tlcicsIHRoaXMuX291dHNpZGVDbGlja1Byb3h5KVxuICAgICAgICAgICAgICAvLyBhbHNvIHN1cHBvcnQgbW9iaWxlIGRldmljZXNcbiAgICAgICAgICAgICAgLm9uKCd0b3VjaGVuZC5kYXRlcmFuZ2VwaWNrZXInLCB0aGlzLl9vdXRzaWRlQ2xpY2tQcm94eSlcbiAgICAgICAgICAgICAgLy8gYWxzbyBleHBsaWNpdGx5IHBsYXkgbmljZSB3aXRoIEJvb3RzdHJhcCBkcm9wZG93bnMsIHdoaWNoIHN0b3BQcm9wYWdhdGlvbiB3aGVuIGNsaWNraW5nIHRoZW1cbiAgICAgICAgICAgICAgLm9uKCdjbGljay5kYXRlcmFuZ2VwaWNrZXInLCAnW2RhdGEtdG9nZ2xlPWRyb3Bkb3duXScsIHRoaXMuX291dHNpZGVDbGlja1Byb3h5KVxuICAgICAgICAgICAgICAvLyBhbmQgYWxzbyBjbG9zZSB3aGVuIGZvY3VzIGNoYW5nZXMgdG8gb3V0c2lkZSB0aGUgcGlja2VyIChlZy4gdGFiYmluZyBiZXR3ZWVuIGNvbnRyb2xzKVxuICAgICAgICAgICAgICAub24oJ2ZvY3VzaW4uZGF0ZXJhbmdlcGlja2VyJywgdGhpcy5fb3V0c2lkZUNsaWNrUHJveHkpO1xuXG4gICAgICAgICAgICAvLyBSZXBvc2l0aW9uIHRoZSBwaWNrZXIgaWYgdGhlIHdpbmRvdyBpcyByZXNpemVkIHdoaWxlIGl0J3Mgb3BlblxuICAgICAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUuZGF0ZXJhbmdlcGlja2VyJywgJC5wcm94eShmdW5jdGlvbihlKSB7IHRoaXMubW92ZShlKTsgfSwgdGhpcykpO1xuXG4gICAgICAgICAgICB0aGlzLm9sZFN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlLmNsb25lKCk7XG4gICAgICAgICAgICB0aGlzLm9sZEVuZERhdGUgPSB0aGlzLmVuZERhdGUuY2xvbmUoKTtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNSaWdodFRpbWUgPSB0aGlzLmVuZERhdGUuY2xvbmUoKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zaG93KCk7XG4gICAgICAgICAgICB0aGlzLm1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC50cmlnZ2VyKCdzaG93LmRhdGVyYW5nZXBpY2tlcicsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5pc1Nob3dpbmcgPSB0cnVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIGhpZGU6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1Nob3dpbmcpIHJldHVybjtcblxuICAgICAgICAgICAgLy9pbmNvbXBsZXRlIGRhdGUgc2VsZWN0aW9uLCByZXZlcnQgdG8gbGFzdCB2YWx1ZXNcbiAgICAgICAgICAgIGlmICghdGhpcy5lbmREYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLm9sZFN0YXJ0RGF0ZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kRGF0ZSA9IHRoaXMub2xkRW5kRGF0ZS5jbG9uZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2lmIGEgbmV3IGRhdGUgcmFuZ2Ugd2FzIHNlbGVjdGVkLCBpbnZva2UgdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgICAgICAgIGlmICghdGhpcy5zdGFydERhdGUuaXNTYW1lKHRoaXMub2xkU3RhcnREYXRlKSB8fCAhdGhpcy5lbmREYXRlLmlzU2FtZSh0aGlzLm9sZEVuZERhdGUpKVxuICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZSwgdGhpcy5jaG9zZW5MYWJlbCk7XG5cbiAgICAgICAgICAgIC8vaWYgcGlja2VyIGlzIGF0dGFjaGVkIHRvIGEgdGV4dCBpbnB1dCwgdXBkYXRlIGl0XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcblxuICAgICAgICAgICAgJChkb2N1bWVudCkub2ZmKCcuZGF0ZXJhbmdlcGlja2VyJyk7XG4gICAgICAgICAgICAkKHdpbmRvdykub2ZmKCcuZGF0ZXJhbmdlcGlja2VyJyk7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5oaWRlKCk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQudHJpZ2dlcignaGlkZS5kYXRlcmFuZ2VwaWNrZXInLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuaXNTaG93aW5nID0gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9nZ2xlOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1Nob3dpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgb3V0c2lkZUNsaWNrOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gJChlLnRhcmdldCk7XG4gICAgICAgICAgICAvLyBpZiB0aGUgcGFnZSBpcyBjbGlja2VkIGFueXdoZXJlIGV4Y2VwdCB3aXRoaW4gdGhlIGRhdGVyYW5nZXJwaWNrZXIvYnV0dG9uXG4gICAgICAgICAgICAvLyBpdHNlbGYgdGhlbiBjYWxsIHRoaXMuaGlkZSgpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgLy8gaWUgbW9kYWwgZGlhbG9nIGZpeFxuICAgICAgICAgICAgICAgIGUudHlwZSA9PSBcImZvY3VzaW5cIiB8fFxuICAgICAgICAgICAgICAgIHRhcmdldC5jbG9zZXN0KHRoaXMuZWxlbWVudCkubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgdGFyZ2V0LmNsb3Nlc3QodGhpcy5jb250YWluZXIpLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIHRhcmdldC5jbG9zZXN0KCcuY2FsZW5kYXItdGFibGUnKS5sZW5ndGhcbiAgICAgICAgICAgICAgICApIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnRyaWdnZXIoJ291dHNpZGVDbGljay5kYXRlcmFuZ2VwaWNrZXInLCB0aGlzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBzaG93Q2FsZW5kYXJzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKCdzaG93LWNhbGVuZGFyJyk7XG4gICAgICAgICAgICB0aGlzLm1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC50cmlnZ2VyKCdzaG93Q2FsZW5kYXIuZGF0ZXJhbmdlcGlja2VyJywgdGhpcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaGlkZUNhbGVuZGFyczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcygnc2hvdy1jYWxlbmRhcicpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnRyaWdnZXIoJ2hpZGVDYWxlbmRhci5kYXRlcmFuZ2VwaWNrZXInLCB0aGlzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBob3ZlclJhbmdlOiBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgIC8vaWdub3JlIG1vdXNlIG1vdmVtZW50cyB3aGlsZSBhbiBhYm92ZS1jYWxlbmRhciB0ZXh0IGlucHV0IGhhcyBmb2N1c1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyLmZpbmQoJ2lucHV0W25hbWU9ZGF0ZXJhbmdlcGlja2VyX3N0YXJ0XScpLmlzKFwiOmZvY3VzXCIpIHx8IHRoaXMuY29udGFpbmVyLmZpbmQoJ2lucHV0W25hbWU9ZGF0ZXJhbmdlcGlja2VyX2VuZF0nKS5pcyhcIjpmb2N1c1wiKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIHZhciBsYWJlbCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1yYW5nZS1rZXknKTtcblxuICAgICAgICAgICAgaWYgKGxhYmVsID09IHRoaXMubG9jYWxlLmN1c3RvbVJhbmdlTGFiZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGVzID0gdGhpcy5yYW5nZXNbbGFiZWxdO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJ2lucHV0W25hbWU9ZGF0ZXJhbmdlcGlja2VyX3N0YXJ0XScpLnZhbChkYXRlc1swXS5mb3JtYXQodGhpcy5sb2NhbGUuZm9ybWF0KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuZmluZCgnaW5wdXRbbmFtZT1kYXRlcmFuZ2VwaWNrZXJfZW5kXScpLnZhbChkYXRlc1sxXS5mb3JtYXQodGhpcy5sb2NhbGUuZm9ybWF0KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBjbGlja1JhbmdlOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgbGFiZWwgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmFuZ2Uta2V5Jyk7XG4gICAgICAgICAgICB0aGlzLmNob3NlbkxhYmVsID0gbGFiZWw7XG4gICAgICAgICAgICBpZiAobGFiZWwgPT0gdGhpcy5sb2NhbGUuY3VzdG9tUmFuZ2VMYWJlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0NhbGVuZGFycygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0ZXMgPSB0aGlzLnJhbmdlc1tsYWJlbF07XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydERhdGUgPSBkYXRlc1swXTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZERhdGUgPSBkYXRlc1sxXTtcblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy50aW1lUGlja2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZERhdGUuZW5kT2YoJ2RheScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5hbHdheXNTaG93Q2FsZW5kYXJzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVDYWxlbmRhcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrQXBwbHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBjbGlja1ByZXY6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciBjYWwgPSAkKGUudGFyZ2V0KS5wYXJlbnRzKCcuY2FsZW5kYXInKTtcbiAgICAgICAgICAgIGlmIChjYWwuaGFzQ2xhc3MoJ2xlZnQnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGVmdENhbGVuZGFyLm1vbnRoLnN1YnRyYWN0KDEsICdtb250aCcpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxpbmtlZENhbGVuZGFycylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLm1vbnRoLnN1YnRyYWN0KDEsICdtb250aCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIubW9udGguc3VidHJhY3QoMSwgJ21vbnRoJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNsaWNrTmV4dDogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIGNhbCA9ICQoZS50YXJnZXQpLnBhcmVudHMoJy5jYWxlbmRhcicpO1xuICAgICAgICAgICAgaWYgKGNhbC5oYXNDbGFzcygnbGVmdCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIubW9udGguYWRkKDEsICdtb250aCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIubW9udGguYWRkKDEsICdtb250aCcpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxpbmtlZENhbGVuZGFycylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIubW9udGguYWRkKDEsICdtb250aCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBob3ZlckRhdGU6IGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgLy9pZ25vcmUgbW91c2UgbW92ZW1lbnRzIHdoaWxlIGFuIGFib3ZlLWNhbGVuZGFyIHRleHQgaW5wdXQgaGFzIGZvY3VzXG4gICAgICAgICAgICAvL2lmICh0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dFtuYW1lPWRhdGVyYW5nZXBpY2tlcl9zdGFydF0nKS5pcyhcIjpmb2N1c1wiKSB8fCB0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dFtuYW1lPWRhdGVyYW5nZXBpY2tlcl9lbmRdJykuaXMoXCI6Zm9jdXNcIikpXG4gICAgICAgICAgICAvLyAgICByZXR1cm47XG5cbiAgICAgICAgICAgIC8vaWdub3JlIGRhdGVzIHRoYXQgY2FuJ3QgYmUgc2VsZWN0ZWRcbiAgICAgICAgICAgIGlmICghJChlLnRhcmdldCkuaGFzQ2xhc3MoJ2F2YWlsYWJsZScpKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vaGF2ZSB0aGUgdGV4dCBpbnB1dHMgYWJvdmUgY2FsZW5kYXJzIHJlZmxlY3QgdGhlIGRhdGUgYmVpbmcgaG92ZXJlZCBvdmVyXG4gICAgICAgICAgICB2YXIgdGl0bGUgPSAkKGUudGFyZ2V0KS5hdHRyKCdkYXRhLXRpdGxlJyk7XG4gICAgICAgICAgICB2YXIgcm93ID0gdGl0bGUuc3Vic3RyKDEsIDEpO1xuICAgICAgICAgICAgdmFyIGNvbCA9IHRpdGxlLnN1YnN0cigzLCAxKTtcbiAgICAgICAgICAgIHZhciBjYWwgPSAkKGUudGFyZ2V0KS5wYXJlbnRzKCcuY2FsZW5kYXInKTtcbiAgICAgICAgICAgIHZhciBkYXRlID0gY2FsLmhhc0NsYXNzKCdsZWZ0JykgPyB0aGlzLmxlZnRDYWxlbmRhci5jYWxlbmRhcltyb3ddW2NvbF0gOiB0aGlzLnJpZ2h0Q2FsZW5kYXIuY2FsZW5kYXJbcm93XVtjb2xdO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5lbmREYXRlICYmICF0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dFtuYW1lPWRhdGVyYW5nZXBpY2tlcl9zdGFydF0nKS5pcyhcIjpmb2N1c1wiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJ2lucHV0W25hbWU9ZGF0ZXJhbmdlcGlja2VyX3N0YXJ0XScpLnZhbChkYXRlLmZvcm1hdCh0aGlzLmxvY2FsZS5mb3JtYXQpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZW5kRGF0ZSAmJiAhdGhpcy5jb250YWluZXIuZmluZCgnaW5wdXRbbmFtZT1kYXRlcmFuZ2VwaWNrZXJfZW5kXScpLmlzKFwiOmZvY3VzXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuZmluZCgnaW5wdXRbbmFtZT1kYXRlcmFuZ2VwaWNrZXJfZW5kXScpLnZhbChkYXRlLmZvcm1hdCh0aGlzLmxvY2FsZS5mb3JtYXQpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9oaWdobGlnaHQgdGhlIGRhdGVzIGJldHdlZW4gdGhlIHN0YXJ0IGRhdGUgYW5kIHRoZSBkYXRlIGJlaW5nIGhvdmVyZWQgYXMgYSBwb3RlbnRpYWwgZW5kIGRhdGVcbiAgICAgICAgICAgIHZhciBsZWZ0Q2FsZW5kYXIgPSB0aGlzLmxlZnRDYWxlbmRhcjtcbiAgICAgICAgICAgIHZhciByaWdodENhbGVuZGFyID0gdGhpcy5yaWdodENhbGVuZGFyO1xuICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmVuZERhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCcuY2FsZW5kYXIgdGJvZHkgdGQnKS5lYWNoKGZ1bmN0aW9uKGluZGV4LCBlbCkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vc2tpcCB3ZWVrIG51bWJlcnMsIG9ubHkgbG9vayBhdCBkYXRlc1xuICAgICAgICAgICAgICAgICAgICBpZiAoJChlbCkuaGFzQ2xhc3MoJ3dlZWsnKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9ICQoZWwpLmF0dHIoJ2RhdGEtdGl0bGUnKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IHRpdGxlLnN1YnN0cigxLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbCA9IHRpdGxlLnN1YnN0cigzLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbCA9ICQoZWwpLnBhcmVudHMoJy5jYWxlbmRhcicpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZHQgPSBjYWwuaGFzQ2xhc3MoJ2xlZnQnKSA/IGxlZnRDYWxlbmRhci5jYWxlbmRhcltyb3ddW2NvbF0gOiByaWdodENhbGVuZGFyLmNhbGVuZGFyW3Jvd11bY29sXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKGR0LmlzQWZ0ZXIoc3RhcnREYXRlKSAmJiBkdC5pc0JlZm9yZShkYXRlKSkgfHwgZHQuaXNTYW1lKGRhdGUsICdkYXknKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJChlbCkuYWRkQ2xhc3MoJ2luLXJhbmdlJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygnaW4tcmFuZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBjbGlja0RhdGU6IGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgaWYgKCEkKGUudGFyZ2V0KS5oYXNDbGFzcygnYXZhaWxhYmxlJykpIHJldHVybjtcblxuICAgICAgICAgICAgdmFyIHRpdGxlID0gJChlLnRhcmdldCkuYXR0cignZGF0YS10aXRsZScpO1xuICAgICAgICAgICAgdmFyIHJvdyA9IHRpdGxlLnN1YnN0cigxLCAxKTtcbiAgICAgICAgICAgIHZhciBjb2wgPSB0aXRsZS5zdWJzdHIoMywgMSk7XG4gICAgICAgICAgICB2YXIgY2FsID0gJChlLnRhcmdldCkucGFyZW50cygnLmNhbGVuZGFyJyk7XG4gICAgICAgICAgICB2YXIgZGF0ZSA9IGNhbC5oYXNDbGFzcygnbGVmdCcpID8gdGhpcy5sZWZ0Q2FsZW5kYXIuY2FsZW5kYXJbcm93XVtjb2xdIDogdGhpcy5yaWdodENhbGVuZGFyLmNhbGVuZGFyW3Jvd11bY29sXTtcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gZG8gYSBmZXcgdGhpbmdzOlxuICAgICAgICAgICAgLy8gKiBhbHRlcm5hdGUgYmV0d2VlbiBzZWxlY3RpbmcgYSBzdGFydCBhbmQgZW5kIGRhdGUgZm9yIHRoZSByYW5nZSxcbiAgICAgICAgICAgIC8vICogaWYgdGhlIHRpbWUgcGlja2VyIGlzIGVuYWJsZWQsIGFwcGx5IHRoZSBob3VyL21pbnV0ZS9zZWNvbmQgZnJvbSB0aGUgc2VsZWN0IGJveGVzIHRvIHRoZSBjbGlja2VkIGRhdGVcbiAgICAgICAgICAgIC8vICogaWYgYXV0b2FwcGx5IGlzIGVuYWJsZWQsIGFuZCBhbiBlbmQgZGF0ZSB3YXMgY2hvc2VuLCBhcHBseSB0aGUgc2VsZWN0aW9uXG4gICAgICAgICAgICAvLyAqIGlmIHNpbmdsZSBkYXRlIHBpY2tlciBtb2RlLCBhbmQgdGltZSBwaWNrZXIgaXNuJ3QgZW5hYmxlZCwgYXBwbHkgdGhlIHNlbGVjdGlvbiBpbW1lZGlhdGVseVxuICAgICAgICAgICAgLy8gKiBpZiBvbmUgb2YgdGhlIGlucHV0cyBhYm92ZSB0aGUgY2FsZW5kYXJzIHdhcyBmb2N1c2VkLCBjYW5jZWwgdGhhdCBtYW51YWwgaW5wdXRcbiAgICAgICAgICAgIC8vXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVuZERhdGUgfHwgZGF0ZS5pc0JlZm9yZSh0aGlzLnN0YXJ0RGF0ZSwgJ2RheScpKSB7IC8vcGlja2luZyBzdGFydFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVQaWNrZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhvdXIgPSBwYXJzZUludCh0aGlzLmNvbnRhaW5lci5maW5kKCcubGVmdCAuaG91cnNlbGVjdCcpLnZhbCgpLCAxMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy50aW1lUGlja2VyMjRIb3VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYW1wbSA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy5sZWZ0IC5hbXBtc2VsZWN0JykudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW1wbSA9PT0gJ1BNJyAmJiBob3VyIDwgMTIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciArPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbXBtID09PSAnQU0nICYmIGhvdXIgPT09IDEyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBtaW51dGUgPSBwYXJzZUludCh0aGlzLmNvbnRhaW5lci5maW5kKCcubGVmdCAubWludXRlc2VsZWN0JykudmFsKCksIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlY29uZCA9IHRoaXMudGltZVBpY2tlclNlY29uZHMgPyBwYXJzZUludCh0aGlzLmNvbnRhaW5lci5maW5kKCcubGVmdCAuc2Vjb25kc2VsZWN0JykudmFsKCksIDEwKSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGRhdGUgPSBkYXRlLmNsb25lKCkuaG91cihob3VyKS5taW51dGUobWludXRlKS5zZWNvbmQoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5lbmREYXRlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXJ0RGF0ZShkYXRlLmNsb25lKCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5lbmREYXRlICYmIGRhdGUuaXNCZWZvcmUodGhpcy5zdGFydERhdGUpKSB7XG4gICAgICAgICAgICAgICAgLy9zcGVjaWFsIGNhc2U6IGNsaWNraW5nIHRoZSBzYW1lIGRhdGUgZm9yIHN0YXJ0L2VuZCxcbiAgICAgICAgICAgICAgICAvL2J1dCB0aGUgdGltZSBvZiB0aGUgZW5kIGRhdGUgaXMgYmVmb3JlIHRoZSBzdGFydCBkYXRlXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRFbmREYXRlKHRoaXMuc3RhcnREYXRlLmNsb25lKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHsgLy8gcGlja2luZyBlbmRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lUGlja2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBob3VyID0gcGFyc2VJbnQodGhpcy5jb250YWluZXIuZmluZCgnLnJpZ2h0IC5ob3Vyc2VsZWN0JykudmFsKCksIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRpbWVQaWNrZXIyNEhvdXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbXBtID0gdGhpcy5jb250YWluZXIuZmluZCgnLnJpZ2h0IC5hbXBtc2VsZWN0JykudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW1wbSA9PT0gJ1BNJyAmJiBob3VyIDwgMTIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciArPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbXBtID09PSAnQU0nICYmIGhvdXIgPT09IDEyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBtaW51dGUgPSBwYXJzZUludCh0aGlzLmNvbnRhaW5lci5maW5kKCcucmlnaHQgLm1pbnV0ZXNlbGVjdCcpLnZhbCgpLCAxMCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWNvbmQgPSB0aGlzLnRpbWVQaWNrZXJTZWNvbmRzID8gcGFyc2VJbnQodGhpcy5jb250YWluZXIuZmluZCgnLnJpZ2h0IC5zZWNvbmRzZWxlY3QnKS52YWwoKSwgMTApIDogMDtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IGRhdGUuY2xvbmUoKS5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUpLnNlY29uZChzZWNvbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNldEVuZERhdGUoZGF0ZS5jbG9uZSgpKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRvQXBwbHkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ2hvc2VuTGFiZWwoKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tBcHBseSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuc2luZ2xlRGF0ZVBpY2tlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RW5kRGF0ZSh0aGlzLnN0YXJ0RGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRpbWVQaWNrZXIpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tBcHBseSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcblxuICAgICAgICAgICAgLy9UaGlzIGlzIHRvIGNhbmNlbCB0aGUgYmx1ciBldmVudCBoYW5kbGVyIGlmIHRoZSBtb3VzZSB3YXMgaW4gb25lIG9mIHRoZSBpbnB1dHNcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgfSxcblxuICAgICAgICBjYWxjdWxhdGVDaG9zZW5MYWJlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGN1c3RvbVJhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIGZvciAodmFyIHJhbmdlIGluIHRoaXMucmFuZ2VzKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVQaWNrZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMudGltZVBpY2tlclNlY29uZHMgPyBcIllZWVktTU0tREQgaGg6bW06c3NcIiA6IFwiWVlZWS1NTS1ERCBoaDptbVwiO1xuICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZSB0aW1lcyB3aGVuIGNvbXBhcmluZyBkYXRlcyBpZiB0aW1lIHBpY2tlciBzZWNvbmRzIGlzIG5vdCBlbmFibGVkXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0RGF0ZS5mb3JtYXQoZm9ybWF0KSA9PSB0aGlzLnJhbmdlc1tyYW5nZV1bMF0uZm9ybWF0KGZvcm1hdCkgJiYgdGhpcy5lbmREYXRlLmZvcm1hdChmb3JtYXQpID09IHRoaXMucmFuZ2VzW3JhbmdlXVsxXS5mb3JtYXQoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tUmFuZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hvc2VuTGFiZWwgPSB0aGlzLmNvbnRhaW5lci5maW5kKCcucmFuZ2VzIGxpOmVxKCcgKyBpICsgJyknKS5hZGRDbGFzcygnYWN0aXZlJykuaHRtbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZSB0aW1lcyB3aGVuIGNvbXBhcmluZyBkYXRlcyBpZiB0aW1lIHBpY2tlciBpcyBub3QgZW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGFydERhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykgPT0gdGhpcy5yYW5nZXNbcmFuZ2VdWzBdLmZvcm1hdCgnWVlZWS1NTS1ERCcpICYmIHRoaXMuZW5kRGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PSB0aGlzLnJhbmdlc1tyYW5nZV1bMV0uZm9ybWF0KCdZWVlZLU1NLUREJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVJhbmdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNob3NlbkxhYmVsID0gdGhpcy5jb250YWluZXIuZmluZCgnLnJhbmdlcyBsaTplcSgnICsgaSArICcpJykuYWRkQ2xhc3MoJ2FjdGl2ZScpLmh0bWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXN0b21SYW5nZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dDdXN0b21SYW5nZUxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hvc2VuTGFiZWwgPSB0aGlzLmNvbnRhaW5lci5maW5kKCcucmFuZ2VzIGxpOmxhc3QnKS5hZGRDbGFzcygnYWN0aXZlJykuaHRtbCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hvc2VuTGFiZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNob3dDYWxlbmRhcnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBjbGlja0FwcGx5OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC50cmlnZ2VyKCdhcHBseS5kYXRlcmFuZ2VwaWNrZXInLCB0aGlzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjbGlja0NhbmNlbDogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLm9sZFN0YXJ0RGF0ZTtcbiAgICAgICAgICAgIHRoaXMuZW5kRGF0ZSA9IHRoaXMub2xkRW5kRGF0ZTtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnRyaWdnZXIoJ2NhbmNlbC5kYXRlcmFuZ2VwaWNrZXInLCB0aGlzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBtb250aE9yWWVhckNoYW5nZWQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciBpc0xlZnQgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCcuY2FsZW5kYXInKS5oYXNDbGFzcygnbGVmdCcpLFxuICAgICAgICAgICAgICAgIGxlZnRPclJpZ2h0ID0gaXNMZWZ0ID8gJ2xlZnQnIDogJ3JpZ2h0JyxcbiAgICAgICAgICAgICAgICBjYWwgPSB0aGlzLmNvbnRhaW5lci5maW5kKCcuY2FsZW5kYXIuJytsZWZ0T3JSaWdodCk7XG5cbiAgICAgICAgICAgIC8vIE1vbnRoIG11c3QgYmUgTnVtYmVyIGZvciBuZXcgbW9tZW50IHZlcnNpb25zXG4gICAgICAgICAgICB2YXIgbW9udGggPSBwYXJzZUludChjYWwuZmluZCgnLm1vbnRoc2VsZWN0JykudmFsKCksIDEwKTtcbiAgICAgICAgICAgIHZhciB5ZWFyID0gY2FsLmZpbmQoJy55ZWFyc2VsZWN0JykudmFsKCk7XG5cbiAgICAgICAgICAgIGlmICghaXNMZWZ0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHllYXIgPCB0aGlzLnN0YXJ0RGF0ZS55ZWFyKCkgfHwgKHllYXIgPT0gdGhpcy5zdGFydERhdGUueWVhcigpICYmIG1vbnRoIDwgdGhpcy5zdGFydERhdGUubW9udGgoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9udGggPSB0aGlzLnN0YXJ0RGF0ZS5tb250aCgpO1xuICAgICAgICAgICAgICAgICAgICB5ZWFyID0gdGhpcy5zdGFydERhdGUueWVhcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMubWluRGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmICh5ZWFyIDwgdGhpcy5taW5EYXRlLnllYXIoKSB8fCAoeWVhciA9PSB0aGlzLm1pbkRhdGUueWVhcigpICYmIG1vbnRoIDwgdGhpcy5taW5EYXRlLm1vbnRoKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vbnRoID0gdGhpcy5taW5EYXRlLm1vbnRoKCk7XG4gICAgICAgICAgICAgICAgICAgIHllYXIgPSB0aGlzLm1pbkRhdGUueWVhcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMubWF4RGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmICh5ZWFyID4gdGhpcy5tYXhEYXRlLnllYXIoKSB8fCAoeWVhciA9PSB0aGlzLm1heERhdGUueWVhcigpICYmIG1vbnRoID4gdGhpcy5tYXhEYXRlLm1vbnRoKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vbnRoID0gdGhpcy5tYXhEYXRlLm1vbnRoKCk7XG4gICAgICAgICAgICAgICAgICAgIHllYXIgPSB0aGlzLm1heERhdGUueWVhcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzTGVmdCkge1xuICAgICAgICAgICAgICAgIHRoaXMubGVmdENhbGVuZGFyLm1vbnRoLm1vbnRoKG1vbnRoKS55ZWFyKHllYXIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxpbmtlZENhbGVuZGFycylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLm1vbnRoID0gdGhpcy5sZWZ0Q2FsZW5kYXIubW9udGguY2xvbmUoKS5hZGQoMSwgJ21vbnRoJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmlnaHRDYWxlbmRhci5tb250aC5tb250aChtb250aCkueWVhcih5ZWFyKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5saW5rZWRDYWxlbmRhcnMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdENhbGVuZGFyLm1vbnRoID0gdGhpcy5yaWdodENhbGVuZGFyLm1vbnRoLmNsb25lKCkuc3VidHJhY3QoMSwgJ21vbnRoJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRpbWVDaGFuZ2VkOiBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgIHZhciBjYWwgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCcuY2FsZW5kYXInKSxcbiAgICAgICAgICAgICAgICBpc0xlZnQgPSBjYWwuaGFzQ2xhc3MoJ2xlZnQnKTtcblxuICAgICAgICAgICAgdmFyIGhvdXIgPSBwYXJzZUludChjYWwuZmluZCgnLmhvdXJzZWxlY3QnKS52YWwoKSwgMTApO1xuICAgICAgICAgICAgdmFyIG1pbnV0ZSA9IHBhcnNlSW50KGNhbC5maW5kKCcubWludXRlc2VsZWN0JykudmFsKCksIDEwKTtcbiAgICAgICAgICAgIHZhciBzZWNvbmQgPSB0aGlzLnRpbWVQaWNrZXJTZWNvbmRzID8gcGFyc2VJbnQoY2FsLmZpbmQoJy5zZWNvbmRzZWxlY3QnKS52YWwoKSwgMTApIDogMDtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnRpbWVQaWNrZXIyNEhvdXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgYW1wbSA9IGNhbC5maW5kKCcuYW1wbXNlbGVjdCcpLnZhbCgpO1xuICAgICAgICAgICAgICAgIGlmIChhbXBtID09PSAnUE0nICYmIGhvdXIgPCAxMilcbiAgICAgICAgICAgICAgICAgICAgaG91ciArPSAxMjtcbiAgICAgICAgICAgICAgICBpZiAoYW1wbSA9PT0gJ0FNJyAmJiBob3VyID09PSAxMilcbiAgICAgICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0xlZnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnN0YXJ0RGF0ZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIHN0YXJ0LmhvdXIoaG91cik7XG4gICAgICAgICAgICAgICAgc3RhcnQubWludXRlKG1pbnV0ZSk7XG4gICAgICAgICAgICAgICAgc3RhcnQuc2Vjb25kKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGFydERhdGUoc3RhcnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNpbmdsZURhdGVQaWNrZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmREYXRlID0gdGhpcy5zdGFydERhdGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZW5kRGF0ZSAmJiB0aGlzLmVuZERhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykgPT0gc3RhcnQuZm9ybWF0KCdZWVlZLU1NLUREJykgJiYgdGhpcy5lbmREYXRlLmlzQmVmb3JlKHN0YXJ0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEVuZERhdGUoc3RhcnQuY2xvbmUoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVuZERhdGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZW5kID0gdGhpcy5lbmREYXRlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgZW5kLmhvdXIoaG91cik7XG4gICAgICAgICAgICAgICAgZW5kLm1pbnV0ZShtaW51dGUpO1xuICAgICAgICAgICAgICAgIGVuZC5zZWNvbmQoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEVuZERhdGUoZW5kKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy91cGRhdGUgdGhlIGNhbGVuZGFycyBzbyBhbGwgY2xpY2thYmxlIGRhdGVzIHJlZmxlY3QgdGhlIG5ldyB0aW1lIGNvbXBvbmVudFxuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcblxuICAgICAgICAgICAgLy91cGRhdGUgdGhlIGZvcm0gaW5wdXRzIGFib3ZlIHRoZSBjYWxlbmRhcnMgd2l0aCB0aGUgbmV3IHRpbWVcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybUlucHV0cygpO1xuXG4gICAgICAgICAgICAvL3JlLXJlbmRlciB0aGUgdGltZSBwaWNrZXJzIGJlY2F1c2UgY2hhbmdpbmcgb25lIHNlbGVjdGlvbiBjYW4gYWZmZWN0IHdoYXQncyBlbmFibGVkIGluIGFub3RoZXJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyVGltZVBpY2tlcignbGVmdCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKCdyaWdodCcpO1xuXG4gICAgICAgIH0sXG5cbiAgICAgICAgZm9ybUlucHV0c0NoYW5nZWQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciBpc1JpZ2h0ID0gJChlLnRhcmdldCkuY2xvc2VzdCgnLmNhbGVuZGFyJykuaGFzQ2xhc3MoJ3JpZ2h0Jyk7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBtb21lbnQodGhpcy5jb250YWluZXIuZmluZCgnaW5wdXRbbmFtZT1cImRhdGVyYW5nZXBpY2tlcl9zdGFydFwiXScpLnZhbCgpLCB0aGlzLmxvY2FsZS5mb3JtYXQpO1xuICAgICAgICAgICAgdmFyIGVuZCA9IG1vbWVudCh0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dFtuYW1lPVwiZGF0ZXJhbmdlcGlja2VyX2VuZFwiXScpLnZhbCgpLCB0aGlzLmxvY2FsZS5mb3JtYXQpO1xuXG4gICAgICAgICAgICBpZiAoc3RhcnQuaXNWYWxpZCgpICYmIGVuZC5pc1ZhbGlkKCkpIHtcblxuICAgICAgICAgICAgICAgIGlmIChpc1JpZ2h0ICYmIGVuZC5pc0JlZm9yZShzdGFydCkpXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kLmNsb25lKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXJ0RGF0ZShzdGFydCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRFbmREYXRlKGVuZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNSaWdodCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dFtuYW1lPVwiZGF0ZXJhbmdlcGlja2VyX3N0YXJ0XCJdJykudmFsKHRoaXMuc3RhcnREYXRlLmZvcm1hdCh0aGlzLmxvY2FsZS5mb3JtYXQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dFtuYW1lPVwiZGF0ZXJhbmdlcGlja2VyX2VuZFwiXScpLnZhbCh0aGlzLmVuZERhdGUuZm9ybWF0KHRoaXMubG9jYWxlLmZvcm1hdCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBmb3JtSW5wdXRzRm9jdXNlZDogZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAvLyBIaWdobGlnaHQgdGhlIGZvY3VzZWQgaW5wdXRcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJ2lucHV0W25hbWU9XCJkYXRlcmFuZ2VwaWNrZXJfc3RhcnRcIl0sIGlucHV0W25hbWU9XCJkYXRlcmFuZ2VwaWNrZXJfZW5kXCJdJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgJChlLnRhcmdldCkuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHN0YXRlIHN1Y2ggdGhhdCBpZiB0aGUgdXNlciBnb2VzIGJhY2sgdG8gdXNpbmcgYSBtb3VzZSwgXG4gICAgICAgICAgICAvLyB0aGUgY2FsZW5kYXJzIGFyZSBhd2FyZSB3ZSdyZSBzZWxlY3RpbmcgdGhlIGVuZCBvZiB0aGUgcmFuZ2UsIG5vdFxuICAgICAgICAgICAgLy8gdGhlIHN0YXJ0LiBUaGlzIGFsbG93cyBzb21lb25lIHRvIGVkaXQgdGhlIGVuZCBvZiBhIGRhdGUgcmFuZ2Ugd2l0aG91dFxuICAgICAgICAgICAgLy8gcmUtc2VsZWN0aW5nIHRoZSBiZWdpbm5pbmcsIGJ5IGNsaWNraW5nIG9uIHRoZSBlbmQgZGF0ZSBpbnB1dCB0aGVuXG4gICAgICAgICAgICAvLyB1c2luZyB0aGUgY2FsZW5kYXIuXG4gICAgICAgICAgICB2YXIgaXNSaWdodCA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJy5jYWxlbmRhcicpLmhhc0NsYXNzKCdyaWdodCcpO1xuICAgICAgICAgICAgaWYgKGlzUmlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZERhdGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhcnREYXRlKHRoaXMuc3RhcnREYXRlLmNsb25lKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgZm9ybUlucHV0c0JsdXJyZWQ6IGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiBoYXMgb25lIHB1cnBvc2UgcmlnaHQgbm93OiBpZiB5b3UgdGFiIGZyb20gdGhlIGZpcnN0XG4gICAgICAgICAgICAvLyB0ZXh0IGlucHV0IHRvIHRoZSBzZWNvbmQgaW4gdGhlIFVJLCB0aGUgZW5kRGF0ZSBpcyBudWxsZWQgc28gdGhhdFxuICAgICAgICAgICAgLy8geW91IGNhbiBjbGljayBhbm90aGVyLCBidXQgaWYgeW91IHRhYiBvdXQgd2l0aG91dCBjbGlja2luZyBhbnl0aGluZ1xuICAgICAgICAgICAgLy8gb3IgY2hhbmdpbmcgdGhlIGlucHV0IHZhbHVlLCB0aGUgb2xkIGVuZERhdGUgc2hvdWxkIGJlIHJldGFpbmVkXG5cbiAgICAgICAgICAgIGlmICghdGhpcy5lbmREYXRlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ2lucHV0W25hbWU9XCJkYXRlcmFuZ2VwaWNrZXJfZW5kXCJdJykudmFsKCk7XG4gICAgICAgICAgICAgICAgdmFyIGVuZCA9IG1vbWVudCh2YWwsIHRoaXMubG9jYWxlLmZvcm1hdCk7XG4gICAgICAgICAgICAgICAgaWYgKGVuZC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbmREYXRlKGVuZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIGZvcm1JbnB1dHNLZXlkb3duOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCBpZiB0aGUgJ2VudGVyJyBrZXkgd2FzIHByZXNzZWQgaW4gdGhlIGlucHV0LCB0aGVuIHRoZSBjYWxlbmRhcnNcbiAgICAgICAgICAgIC8vIGFyZSB1cGRhdGVkIHdpdGggdGhlIHN0YXJ0RGF0ZSBhbmQgZW5kRGF0ZS5cbiAgICAgICAgICAgIC8vIFRoaXMgYmVoYXZpb3VyIGlzIGF1dG9tYXRpYyBpbiBDaHJvbWUvRmlyZWZveC9FZGdlIGJ1dCBub3QgaW4gSUUgMTEgaGVuY2Ugd2h5IHRoaXMgZXhpc3RzLlxuICAgICAgICAgICAgLy8gT3RoZXIgYnJvd3NlcnMgYW5kIHZlcnNpb25zIG9mIElFIGFyZSB1bnRlc3RlZCBhbmQgdGhlIGJlaGF2aW91ciBpcyB1bmtub3duLlxuICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHRoZSBjYWxlbmRhciBmcm9tIGJlaW5nIHVwZGF0ZWQgdHdpY2Ugb24gQ2hyb21lL0ZpcmVmb3gvRWRnZVxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsgXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtSW5wdXRzQ2hhbmdlZChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuXG4gICAgICAgIGVsZW1lbnRDaGFuZ2VkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5lbGVtZW50LmlzKCdpbnB1dCcpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIXRoaXMuZWxlbWVudC52YWwoKS5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgICAgdmFyIGRhdGVTdHJpbmcgPSB0aGlzLmVsZW1lbnQudmFsKCkuc3BsaXQodGhpcy5sb2NhbGUuc2VwYXJhdG9yKSxcbiAgICAgICAgICAgICAgICBzdGFydCA9IG51bGwsXG4gICAgICAgICAgICAgICAgZW5kID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGRhdGVTdHJpbmcubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBtb21lbnQoZGF0ZVN0cmluZ1swXSwgdGhpcy5sb2NhbGUuZm9ybWF0KTtcbiAgICAgICAgICAgICAgICBlbmQgPSBtb21lbnQoZGF0ZVN0cmluZ1sxXSwgdGhpcy5sb2NhbGUuZm9ybWF0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuc2luZ2xlRGF0ZVBpY2tlciB8fCBzdGFydCA9PT0gbnVsbCB8fCBlbmQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IG1vbWVudCh0aGlzLmVsZW1lbnQudmFsKCksIHRoaXMubG9jYWxlLmZvcm1hdCk7XG4gICAgICAgICAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghc3RhcnQuaXNWYWxpZCgpIHx8ICFlbmQuaXNWYWxpZCgpKSByZXR1cm47XG5cbiAgICAgICAgICAgIHRoaXMuc2V0U3RhcnREYXRlKHN0YXJ0KTtcbiAgICAgICAgICAgIHRoaXMuc2V0RW5kRGF0ZShlbmQpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAga2V5ZG93bjogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgLy9oaWRlIG9uIHRhYiBvciBlbnRlclxuICAgICAgICAgICAgaWYgKChlLmtleUNvZGUgPT09IDkpIHx8IChlLmtleUNvZGUgPT09IDEzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2hpZGUgb24gZXNjIGFuZCBwcmV2ZW50IHByb3BhZ2F0aW9uXG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlRWxlbWVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50LmlzKCdpbnB1dCcpICYmICF0aGlzLnNpbmdsZURhdGVQaWNrZXIgJiYgdGhpcy5hdXRvVXBkYXRlSW5wdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQudmFsKHRoaXMuc3RhcnREYXRlLmZvcm1hdCh0aGlzLmxvY2FsZS5mb3JtYXQpICsgdGhpcy5sb2NhbGUuc2VwYXJhdG9yICsgdGhpcy5lbmREYXRlLmZvcm1hdCh0aGlzLmxvY2FsZS5mb3JtYXQpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5pcygnaW5wdXQnKSAmJiB0aGlzLmF1dG9VcGRhdGVJbnB1dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC52YWwodGhpcy5zdGFydERhdGUuZm9ybWF0KHRoaXMubG9jYWxlLmZvcm1hdCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQub2ZmKCcuZGF0ZXJhbmdlcGlja2VyJyk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRGF0YSgpO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgJC5mbi5kYXRlcmFuZ2VwaWNrZXIgPSBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaW1wbGVtZW50T3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCAkLmZuLmRhdGVyYW5nZXBpY2tlci5kZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlbCA9ICQodGhpcyk7XG4gICAgICAgICAgICBpZiAoZWwuZGF0YSgnZGF0ZXJhbmdlcGlja2VyJykpXG4gICAgICAgICAgICAgICAgZWwuZGF0YSgnZGF0ZXJhbmdlcGlja2VyJykucmVtb3ZlKCk7XG4gICAgICAgICAgICBlbC5kYXRhKCdkYXRlcmFuZ2VwaWNrZXInLCBuZXcgRGF0ZVJhbmdlUGlja2VyKGVsLCBpbXBsZW1lbnRPcHRpb25zLCBjYWxsYmFjaykpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIHJldHVybiBEYXRlUmFuZ2VQaWNrZXI7XG5cbn0pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vdmVuZG9yL2FsbWFzYWVlZDIwMTAvYWRtaW5sdGUvYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtZGF0ZXJhbmdlcGlja2VyL2RhdGVyYW5nZXBpY2tlci5qc1xuLy8gbW9kdWxlIGlkID0gNThcbi8vIG1vZHVsZSBjaHVua3MgPSAxIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///58\n");
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Datepicker for Bootstrap v1.7.1 (https://github.com/uxsolutions/bootstrap-datepicker)\n *\n * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)\n */\n\n!function(a){ true?!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1)], __WEBPACK_AMD_DEFINE_FACTORY__ = (a),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)):a(\"object\"==typeof exports?require(\"jquery\"):jQuery)}(function(a,b){function c(){return new Date(Date.UTC.apply(Date,arguments))}function d(){var a=new Date;return c(a.getFullYear(),a.getMonth(),a.getDate())}function e(a,b){return a.getUTCFullYear()===b.getUTCFullYear()&&a.getUTCMonth()===b.getUTCMonth()&&a.getUTCDate()===b.getUTCDate()}function f(c,d){return function(){return d!==b&&a.fn.datepicker.deprecated(d),this[c].apply(this,arguments)}}function g(a){return a&&!isNaN(a.getTime())}function h(b,c){function d(a,b){return b.toLowerCase()}var e,f=a(b).data(),g={},h=new RegExp(\"^\"+c.toLowerCase()+\"([A-Z])\");c=new RegExp(\"^\"+c.toLowerCase());for(var i in f)c.test(i)&&(e=i.replace(h,d),g[e]=f[i]);return g}function i(b){var c={};if(q[b]||(b=b.split(\"-\")[0],q[b])){var d=q[b];return a.each(p,function(a,b){b in d&&(c[b]=d[b])}),c}}var j=function(){var b={get:function(a){return this.slice(a)[0]},contains:function(a){for(var b=a&&a.valueOf(),c=0,d=this.length;c<d;c++)if(0<=this[c].valueOf()-b&&this[c].valueOf()-b<864e5)return c;return-1},remove:function(a){this.splice(a,1)},replace:function(b){b&&(a.isArray(b)||(b=[b]),this.clear(),this.push.apply(this,b))},clear:function(){this.length=0},copy:function(){var a=new j;return a.replace(this),a}};return function(){var c=[];return c.push.apply(c,arguments),a.extend(c,b),c}}(),k=function(b,c){a.data(b,\"datepicker\",this),this._process_options(c),this.dates=new j,this.viewDate=this.o.defaultViewDate,this.focusDate=null,this.element=a(b),this.isInput=this.element.is(\"input\"),this.inputField=this.isInput?this.element:this.element.find(\"input\"),this.component=!!this.element.hasClass(\"date\")&&this.element.find(\".add-on, .input-group-addon, .btn\"),this.component&&0===this.component.length&&(this.component=!1),this.isInline=!this.component&&this.element.is(\"div\"),this.picker=a(r.template),this._check_template(this.o.templates.leftArrow)&&this.picker.find(\".prev\").html(this.o.templates.leftArrow),this._check_template(this.o.templates.rightArrow)&&this.picker.find(\".next\").html(this.o.templates.rightArrow),this._buildEvents(),this._attachEvents(),this.isInline?this.picker.addClass(\"datepicker-inline\").appendTo(this.element):this.picker.addClass(\"datepicker-dropdown dropdown-menu\"),this.o.rtl&&this.picker.addClass(\"datepicker-rtl\"),this.o.calendarWeeks&&this.picker.find(\".datepicker-days .datepicker-switch, thead .datepicker-title, tfoot .today, tfoot .clear\").attr(\"colspan\",function(a,b){return Number(b)+1}),this._process_options({startDate:this._o.startDate,endDate:this._o.endDate,daysOfWeekDisabled:this.o.daysOfWeekDisabled,daysOfWeekHighlighted:this.o.daysOfWeekHighlighted,datesDisabled:this.o.datesDisabled}),this._allow_update=!1,this.setViewMode(this.o.startView),this._allow_update=!0,this.fillDow(),this.fillMonths(),this.update(),this.isInline&&this.show()};k.prototype={constructor:k,_resolveViewName:function(b){return a.each(r.viewModes,function(c,d){if(b===c||a.inArray(b,d.names)!==-1)return b=c,!1}),b},_resolveDaysOfWeek:function(b){return a.isArray(b)||(b=b.split(/[,\\s]*/)),a.map(b,Number)},_check_template:function(c){try{if(c===b||\"\"===c)return!1;if((c.match(/[<>]/g)||[]).length<=0)return!0;var d=a(c);return d.length>0}catch(a){return!1}},_process_options:function(b){this._o=a.extend({},this._o,b);var e=this.o=a.extend({},this._o),f=e.language;q[f]||(f=f.split(\"-\")[0],q[f]||(f=o.language)),e.language=f,e.startView=this._resolveViewName(e.startView),e.minViewMode=this._resolveViewName(e.minViewMode),e.maxViewMode=this._resolveViewName(e.maxViewMode),e.startView=Math.max(this.o.minViewMode,Math.min(this.o.maxViewMode,e.startView)),e.multidate!==!0&&(e.multidate=Number(e.multidate)||!1,e.multidate!==!1&&(e.multidate=Math.max(0,e.multidate))),e.multidateSeparator=String(e.multidateSeparator),e.weekStart%=7,e.weekEnd=(e.weekStart+6)%7;var g=r.parseFormat(e.format);e.startDate!==-(1/0)&&(e.startDate?e.startDate instanceof Date?e.startDate=this._local_to_utc(this._zero_time(e.startDate)):e.startDate=r.parseDate(e.startDate,g,e.language,e.assumeNearbyYear):e.startDate=-(1/0)),e.endDate!==1/0&&(e.endDate?e.endDate instanceof Date?e.endDate=this._local_to_utc(this._zero_time(e.endDate)):e.endDate=r.parseDate(e.endDate,g,e.language,e.assumeNearbyYear):e.endDate=1/0),e.daysOfWeekDisabled=this._resolveDaysOfWeek(e.daysOfWeekDisabled||[]),e.daysOfWeekHighlighted=this._resolveDaysOfWeek(e.daysOfWeekHighlighted||[]),e.datesDisabled=e.datesDisabled||[],a.isArray(e.datesDisabled)||(e.datesDisabled=e.datesDisabled.split(\",\")),e.datesDisabled=a.map(e.datesDisabled,function(a){return r.parseDate(a,g,e.language,e.assumeNearbyYear)});var h=String(e.orientation).toLowerCase().split(/\\s+/g),i=e.orientation.toLowerCase();if(h=a.grep(h,function(a){return/^auto|left|right|top|bottom$/.test(a)}),e.orientation={x:\"auto\",y:\"auto\"},i&&\"auto\"!==i)if(1===h.length)switch(h[0]){case\"top\":case\"bottom\":e.orientation.y=h[0];break;case\"left\":case\"right\":e.orientation.x=h[0]}else i=a.grep(h,function(a){return/^left|right$/.test(a)}),e.orientation.x=i[0]||\"auto\",i=a.grep(h,function(a){return/^top|bottom$/.test(a)}),e.orientation.y=i[0]||\"auto\";else;if(e.defaultViewDate instanceof Date||\"string\"==typeof e.defaultViewDate)e.defaultViewDate=r.parseDate(e.defaultViewDate,g,e.language,e.assumeNearbyYear);else if(e.defaultViewDate){var j=e.defaultViewDate.year||(new Date).getFullYear(),k=e.defaultViewDate.month||0,l=e.defaultViewDate.day||1;e.defaultViewDate=c(j,k,l)}else e.defaultViewDate=d()},_events:[],_secondaryEvents:[],_applyEvents:function(a){for(var c,d,e,f=0;f<a.length;f++)c=a[f][0],2===a[f].length?(d=b,e=a[f][1]):3===a[f].length&&(d=a[f][1],e=a[f][2]),c.on(e,d)},_unapplyEvents:function(a){for(var c,d,e,f=0;f<a.length;f++)c=a[f][0],2===a[f].length?(e=b,d=a[f][1]):3===a[f].length&&(e=a[f][1],d=a[f][2]),c.off(d,e)},_buildEvents:function(){var b={keyup:a.proxy(function(b){a.inArray(b.keyCode,[27,37,39,38,40,32,13,9])===-1&&this.update()},this),keydown:a.proxy(this.keydown,this),paste:a.proxy(this.paste,this)};this.o.showOnFocus===!0&&(b.focus=a.proxy(this.show,this)),this.isInput?this._events=[[this.element,b]]:this.component&&this.inputField.length?this._events=[[this.inputField,b],[this.component,{click:a.proxy(this.show,this)}]]:this._events=[[this.element,{click:a.proxy(this.show,this),keydown:a.proxy(this.keydown,this)}]],this._events.push([this.element,\"*\",{blur:a.proxy(function(a){this._focused_from=a.target},this)}],[this.element,{blur:a.proxy(function(a){this._focused_from=a.target},this)}]),this.o.immediateUpdates&&this._events.push([this.element,{\"changeYear changeMonth\":a.proxy(function(a){this.update(a.date)},this)}]),this._secondaryEvents=[[this.picker,{click:a.proxy(this.click,this)}],[this.picker,\".prev, .next\",{click:a.proxy(this.navArrowsClick,this)}],[this.picker,\".day:not(.disabled)\",{click:a.proxy(this.dayCellClick,this)}],[a(window),{resize:a.proxy(this.place,this)}],[a(document),{\"mousedown touchstart\":a.proxy(function(a){this.element.is(a.target)||this.element.find(a.target).length||this.picker.is(a.target)||this.picker.find(a.target).length||this.isInline||this.hide()},this)}]]},_attachEvents:function(){this._detachEvents(),this._applyEvents(this._events)},_detachEvents:function(){this._unapplyEvents(this._events)},_attachSecondaryEvents:function(){this._detachSecondaryEvents(),this._applyEvents(this._secondaryEvents)},_detachSecondaryEvents:function(){this._unapplyEvents(this._secondaryEvents)},_trigger:function(b,c){var d=c||this.dates.get(-1),e=this._utc_to_local(d);this.element.trigger({type:b,date:e,viewMode:this.viewMode,dates:a.map(this.dates,this._utc_to_local),format:a.proxy(function(a,b){0===arguments.length?(a=this.dates.length-1,b=this.o.format):\"string\"==typeof a&&(b=a,a=this.dates.length-1),b=b||this.o.format;var c=this.dates.get(a);return r.formatDate(c,b,this.o.language)},this)})},show:function(){if(!(this.inputField.prop(\"disabled\")||this.inputField.prop(\"readonly\")&&this.o.enableOnReadonly===!1))return this.isInline||this.picker.appendTo(this.o.container),this.place(),this.picker.show(),this._attachSecondaryEvents(),this._trigger(\"show\"),(window.navigator.msMaxTouchPoints||\"ontouchstart\"in document)&&this.o.disableTouchKeyboard&&a(this.element).blur(),this},hide:function(){return this.isInline||!this.picker.is(\":visible\")?this:(this.focusDate=null,this.picker.hide().detach(),this._detachSecondaryEvents(),this.setViewMode(this.o.startView),this.o.forceParse&&this.inputField.val()&&this.setValue(),this._trigger(\"hide\"),this)},destroy:function(){return this.hide(),this._detachEvents(),this._detachSecondaryEvents(),this.picker.remove(),delete this.element.data().datepicker,this.isInput||delete this.element.data().date,this},paste:function(b){var c;if(b.originalEvent.clipboardData&&b.originalEvent.clipboardData.types&&a.inArray(\"text/plain\",b.originalEvent.clipboardData.types)!==-1)c=b.originalEvent.clipboardData.getData(\"text/plain\");else{if(!window.clipboardData)return;c=window.clipboardData.getData(\"Text\")}this.setDate(c),this.update(),b.preventDefault()},_utc_to_local:function(a){if(!a)return a;var b=new Date(a.getTime()+6e4*a.getTimezoneOffset());return b.getTimezoneOffset()!==a.getTimezoneOffset()&&(b=new Date(a.getTime()+6e4*b.getTimezoneOffset())),b},_local_to_utc:function(a){return a&&new Date(a.getTime()-6e4*a.getTimezoneOffset())},_zero_time:function(a){return a&&new Date(a.getFullYear(),a.getMonth(),a.getDate())},_zero_utc_time:function(a){return a&&c(a.getUTCFullYear(),a.getUTCMonth(),a.getUTCDate())},getDates:function(){return a.map(this.dates,this._utc_to_local)},getUTCDates:function(){return a.map(this.dates,function(a){return new Date(a)})},getDate:function(){return this._utc_to_local(this.getUTCDate())},getUTCDate:function(){var a=this.dates.get(-1);return a!==b?new Date(a):null},clearDates:function(){this.inputField.val(\"\"),this.update(),this._trigger(\"changeDate\"),this.o.autoclose&&this.hide()},setDates:function(){var b=a.isArray(arguments[0])?arguments[0]:arguments;return this.update.apply(this,b),this._trigger(\"changeDate\"),this.setValue(),this},setUTCDates:function(){var b=a.isArray(arguments[0])?arguments[0]:arguments;return this.setDates.apply(this,a.map(b,this._utc_to_local)),this},setDate:f(\"setDates\"),setUTCDate:f(\"setUTCDates\"),remove:f(\"destroy\",\"Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead\"),setValue:function(){var a=this.getFormattedDate();return this.inputField.val(a),this},getFormattedDate:function(c){c===b&&(c=this.o.format);var d=this.o.language;return a.map(this.dates,function(a){return r.formatDate(a,c,d)}).join(this.o.multidateSeparator)},getStartDate:function(){return this.o.startDate},setStartDate:function(a){return this._process_options({startDate:a}),this.update(),this.updateNavArrows(),this},getEndDate:function(){return this.o.endDate},setEndDate:function(a){return this._process_options({endDate:a}),this.update(),this.updateNavArrows(),this},setDaysOfWeekDisabled:function(a){return this._process_options({daysOfWeekDisabled:a}),this.update(),this},setDaysOfWeekHighlighted:function(a){return this._process_options({daysOfWeekHighlighted:a}),this.update(),this},setDatesDisabled:function(a){return this._process_options({datesDisabled:a}),this.update(),this},place:function(){if(this.isInline)return this;var b=this.picker.outerWidth(),c=this.picker.outerHeight(),d=10,e=a(this.o.container),f=e.width(),g=\"body\"===this.o.container?a(document).scrollTop():e.scrollTop(),h=e.offset(),i=[0];this.element.parents().each(function(){var b=a(this).css(\"z-index\");\"auto\"!==b&&0!==Number(b)&&i.push(Number(b))});var j=Math.max.apply(Math,i)+this.o.zIndexOffset,k=this.component?this.component.parent().offset():this.element.offset(),l=this.component?this.component.outerHeight(!0):this.element.outerHeight(!1),m=this.component?this.component.outerWidth(!0):this.element.outerWidth(!1),n=k.left-h.left,o=k.top-h.top;\"body\"!==this.o.container&&(o+=g),this.picker.removeClass(\"datepicker-orient-top datepicker-orient-bottom datepicker-orient-right datepicker-orient-left\"),\"auto\"!==this.o.orientation.x?(this.picker.addClass(\"datepicker-orient-\"+this.o.orientation.x),\"right\"===this.o.orientation.x&&(n-=b-m)):k.left<0?(this.picker.addClass(\"datepicker-orient-left\"),n-=k.left-d):n+b>f?(this.picker.addClass(\"datepicker-orient-right\"),n+=m-b):this.o.rtl?this.picker.addClass(\"datepicker-orient-right\"):this.picker.addClass(\"datepicker-orient-left\");var p,q=this.o.orientation.y;if(\"auto\"===q&&(p=-g+o-c,q=p<0?\"bottom\":\"top\"),this.picker.addClass(\"datepicker-orient-\"+q),\"top\"===q?o-=c+parseInt(this.picker.css(\"padding-top\")):o+=l,this.o.rtl){var r=f-(n+m);this.picker.css({top:o,right:r,zIndex:j})}else this.picker.css({top:o,left:n,zIndex:j});return this},_allow_update:!0,update:function(){if(!this._allow_update)return this;var b=this.dates.copy(),c=[],d=!1;return arguments.length?(a.each(arguments,a.proxy(function(a,b){b instanceof Date&&(b=this._local_to_utc(b)),c.push(b)},this)),d=!0):(c=this.isInput?this.element.val():this.element.data(\"date\")||this.inputField.val(),c=c&&this.o.multidate?c.split(this.o.multidateSeparator):[c],delete this.element.data().date),c=a.map(c,a.proxy(function(a){return r.parseDate(a,this.o.format,this.o.language,this.o.assumeNearbyYear)},this)),c=a.grep(c,a.proxy(function(a){return!this.dateWithinRange(a)||!a},this),!0),this.dates.replace(c),this.o.updateViewDate&&(this.dates.length?this.viewDate=new Date(this.dates.get(-1)):this.viewDate<this.o.startDate?this.viewDate=new Date(this.o.startDate):this.viewDate>this.o.endDate?this.viewDate=new Date(this.o.endDate):this.viewDate=this.o.defaultViewDate),d?(this.setValue(),this.element.change()):this.dates.length&&String(b)!==String(this.dates)&&d&&(this._trigger(\"changeDate\"),this.element.change()),!this.dates.length&&b.length&&(this._trigger(\"clearDate\"),this.element.change()),this.fill(),this},fillDow:function(){if(this.o.showWeekDays){var b=this.o.weekStart,c=\"<tr>\";for(this.o.calendarWeeks&&(c+='<th class=\"cw\">&#160;</th>');b<this.o.weekStart+7;)c+='<th class=\"dow',a.inArray(b,this.o.daysOfWeekDisabled)!==-1&&(c+=\" disabled\"),c+='\">'+q[this.o.language].daysMin[b++%7]+\"</th>\";c+=\"</tr>\",this.picker.find(\".datepicker-days thead\").append(c)}},fillMonths:function(){for(var a,b=this._utc_to_local(this.viewDate),c=\"\",d=0;d<12;d++)a=b&&b.getMonth()===d?\" focused\":\"\",c+='<span class=\"month'+a+'\">'+q[this.o.language].monthsShort[d]+\"</span>\";this.picker.find(\".datepicker-months td\").html(c)},setRange:function(b){b&&b.length?this.range=a.map(b,function(a){return a.valueOf()}):delete this.range,this.fill()},getClassNames:function(b){var c=[],f=this.viewDate.getUTCFullYear(),g=this.viewDate.getUTCMonth(),h=d();return b.getUTCFullYear()<f||b.getUTCFullYear()===f&&b.getUTCMonth()<g?c.push(\"old\"):(b.getUTCFullYear()>f||b.getUTCFullYear()===f&&b.getUTCMonth()>g)&&c.push(\"new\"),this.focusDate&&b.valueOf()===this.focusDate.valueOf()&&c.push(\"focused\"),this.o.todayHighlight&&e(b,h)&&c.push(\"today\"),this.dates.contains(b)!==-1&&c.push(\"active\"),this.dateWithinRange(b)||c.push(\"disabled\"),this.dateIsDisabled(b)&&c.push(\"disabled\",\"disabled-date\"),a.inArray(b.getUTCDay(),this.o.daysOfWeekHighlighted)!==-1&&c.push(\"highlighted\"),this.range&&(b>this.range[0]&&b<this.range[this.range.length-1]&&c.push(\"range\"),a.inArray(b.valueOf(),this.range)!==-1&&c.push(\"selected\"),b.valueOf()===this.range[0]&&c.push(\"range-start\"),b.valueOf()===this.range[this.range.length-1]&&c.push(\"range-end\")),c},_fill_yearsView:function(c,d,e,f,g,h,i){for(var j,k,l,m=\"\",n=e/10,o=this.picker.find(c),p=Math.floor(f/e)*e,q=p+9*n,r=Math.floor(this.viewDate.getFullYear()/n)*n,s=a.map(this.dates,function(a){return Math.floor(a.getUTCFullYear()/n)*n}),t=p-n;t<=q+n;t+=n)j=[d],k=null,t===p-n?j.push(\"old\"):t===q+n&&j.push(\"new\"),a.inArray(t,s)!==-1&&j.push(\"active\"),(t<g||t>h)&&j.push(\"disabled\"),t===r&&j.push(\"focused\"),i!==a.noop&&(l=i(new Date(t,0,1)),l===b?l={}:\"boolean\"==typeof l?l={enabled:l}:\"string\"==typeof l&&(l={classes:l}),l.enabled===!1&&j.push(\"disabled\"),l.classes&&(j=j.concat(l.classes.split(/\\s+/))),l.tooltip&&(k=l.tooltip)),m+='<span class=\"'+j.join(\" \")+'\"'+(k?' title=\"'+k+'\"':\"\")+\">\"+t+\"</span>\";o.find(\".datepicker-switch\").text(p+\"-\"+q),o.find(\"td\").html(m)},fill:function(){var d,e,f=new Date(this.viewDate),g=f.getUTCFullYear(),h=f.getUTCMonth(),i=this.o.startDate!==-(1/0)?this.o.startDate.getUTCFullYear():-(1/0),j=this.o.startDate!==-(1/0)?this.o.startDate.getUTCMonth():-(1/0),k=this.o.endDate!==1/0?this.o.endDate.getUTCFullYear():1/0,l=this.o.endDate!==1/0?this.o.endDate.getUTCMonth():1/0,m=q[this.o.language].today||q.en.today||\"\",n=q[this.o.language].clear||q.en.clear||\"\",o=q[this.o.language].titleFormat||q.en.titleFormat;if(!isNaN(g)&&!isNaN(h)){this.picker.find(\".datepicker-days .datepicker-switch\").text(r.formatDate(f,o,this.o.language)),this.picker.find(\"tfoot .today\").text(m).css(\"display\",this.o.todayBtn===!0||\"linked\"===this.o.todayBtn?\"table-cell\":\"none\"),this.picker.find(\"tfoot .clear\").text(n).css(\"display\",this.o.clearBtn===!0?\"table-cell\":\"none\"),this.picker.find(\"thead .datepicker-title\").text(this.o.title).css(\"display\",\"string\"==typeof this.o.title&&\"\"!==this.o.title?\"table-cell\":\"none\"),this.updateNavArrows(),this.fillMonths();var p=c(g,h,0),s=p.getUTCDate();p.setUTCDate(s-(p.getUTCDay()-this.o.weekStart+7)%7);var t=new Date(p);p.getUTCFullYear()<100&&t.setUTCFullYear(p.getUTCFullYear()),t.setUTCDate(t.getUTCDate()+42),t=t.valueOf();for(var u,v,w=[];p.valueOf()<t;){if(u=p.getUTCDay(),u===this.o.weekStart&&(w.push(\"<tr>\"),this.o.calendarWeeks)){var x=new Date(+p+(this.o.weekStart-u-7)%7*864e5),y=new Date(Number(x)+(11-x.getUTCDay())%7*864e5),z=new Date(Number(z=c(y.getUTCFullYear(),0,1))+(11-z.getUTCDay())%7*864e5),A=(y-z)/864e5/7+1;w.push('<td class=\"cw\">'+A+\"</td>\")}v=this.getClassNames(p),v.push(\"day\");var B=p.getUTCDate();this.o.beforeShowDay!==a.noop&&(e=this.o.beforeShowDay(this._utc_to_local(p)),e===b?e={}:\"boolean\"==typeof e?e={enabled:e}:\"string\"==typeof e&&(e={classes:e}),e.enabled===!1&&v.push(\"disabled\"),e.classes&&(v=v.concat(e.classes.split(/\\s+/))),e.tooltip&&(d=e.tooltip),e.content&&(B=e.content)),v=a.isFunction(a.uniqueSort)?a.uniqueSort(v):a.unique(v),w.push('<td class=\"'+v.join(\" \")+'\"'+(d?' title=\"'+d+'\"':\"\")+' data-date=\"'+p.getTime().toString()+'\">'+B+\"</td>\"),d=null,u===this.o.weekEnd&&w.push(\"</tr>\"),p.setUTCDate(p.getUTCDate()+1)}this.picker.find(\".datepicker-days tbody\").html(w.join(\"\"));var C=q[this.o.language].monthsTitle||q.en.monthsTitle||\"Months\",D=this.picker.find(\".datepicker-months\").find(\".datepicker-switch\").text(this.o.maxViewMode<2?C:g).end().find(\"tbody span\").removeClass(\"active\");if(a.each(this.dates,function(a,b){b.getUTCFullYear()===g&&D.eq(b.getUTCMonth()).addClass(\"active\")}),(g<i||g>k)&&D.addClass(\"disabled\"),g===i&&D.slice(0,j).addClass(\"disabled\"),g===k&&D.slice(l+1).addClass(\"disabled\"),this.o.beforeShowMonth!==a.noop){var E=this;a.each(D,function(c,d){var e=new Date(g,c,1),f=E.o.beforeShowMonth(e);f===b?f={}:\"boolean\"==typeof f?f={enabled:f}:\"string\"==typeof f&&(f={classes:f}),f.enabled!==!1||a(d).hasClass(\"disabled\")||a(d).addClass(\"disabled\"),f.classes&&a(d).addClass(f.classes),f.tooltip&&a(d).prop(\"title\",f.tooltip)})}this._fill_yearsView(\".datepicker-years\",\"year\",10,g,i,k,this.o.beforeShowYear),this._fill_yearsView(\".datepicker-decades\",\"decade\",100,g,i,k,this.o.beforeShowDecade),this._fill_yearsView(\".datepicker-centuries\",\"century\",1e3,g,i,k,this.o.beforeShowCentury)}},updateNavArrows:function(){if(this._allow_update){var a,b,c=new Date(this.viewDate),d=c.getUTCFullYear(),e=c.getUTCMonth(),f=this.o.startDate!==-(1/0)?this.o.startDate.getUTCFullYear():-(1/0),g=this.o.startDate!==-(1/0)?this.o.startDate.getUTCMonth():-(1/0),h=this.o.endDate!==1/0?this.o.endDate.getUTCFullYear():1/0,i=this.o.endDate!==1/0?this.o.endDate.getUTCMonth():1/0,j=1;switch(this.viewMode){case 0:a=d<=f&&e<=g,b=d>=h&&e>=i;break;case 4:j*=10;case 3:j*=10;case 2:j*=10;case 1:a=Math.floor(d/j)*j<=f,b=Math.floor(d/j)*j+j>=h}this.picker.find(\".prev\").toggleClass(\"disabled\",a),this.picker.find(\".next\").toggleClass(\"disabled\",b)}},click:function(b){b.preventDefault(),b.stopPropagation();var e,f,g,h;e=a(b.target),e.hasClass(\"datepicker-switch\")&&this.viewMode!==this.o.maxViewMode&&this.setViewMode(this.viewMode+1),e.hasClass(\"today\")&&!e.hasClass(\"day\")&&(this.setViewMode(0),this._setDate(d(),\"linked\"===this.o.todayBtn?null:\"view\")),e.hasClass(\"clear\")&&this.clearDates(),e.hasClass(\"disabled\")||(e.hasClass(\"month\")||e.hasClass(\"year\")||e.hasClass(\"decade\")||e.hasClass(\"century\"))&&(this.viewDate.setUTCDate(1),f=1,1===this.viewMode?(h=e.parent().find(\"span\").index(e),g=this.viewDate.getUTCFullYear(),this.viewDate.setUTCMonth(h)):(h=0,g=Number(e.text()),this.viewDate.setUTCFullYear(g)),this._trigger(r.viewModes[this.viewMode-1].e,this.viewDate),this.viewMode===this.o.minViewMode?this._setDate(c(g,h,f)):(this.setViewMode(this.viewMode-1),this.fill())),this.picker.is(\":visible\")&&this._focused_from&&this._focused_from.focus(),delete this._focused_from},dayCellClick:function(b){var c=a(b.currentTarget),d=c.data(\"date\"),e=new Date(d);this.o.updateViewDate&&(e.getUTCFullYear()!==this.viewDate.getUTCFullYear()&&this._trigger(\"changeYear\",this.viewDate),e.getUTCMonth()!==this.viewDate.getUTCMonth()&&this._trigger(\"changeMonth\",this.viewDate)),this._setDate(e)},navArrowsClick:function(b){var c=a(b.currentTarget),d=c.hasClass(\"prev\")?-1:1;0!==this.viewMode&&(d*=12*r.viewModes[this.viewMode].navStep),this.viewDate=this.moveMonth(this.viewDate,d),this._trigger(r.viewModes[this.viewMode].e,this.viewDate),this.fill()},_toggle_multidate:function(a){var b=this.dates.contains(a);if(a||this.dates.clear(),b!==-1?(this.o.multidate===!0||this.o.multidate>1||this.o.toggleActive)&&this.dates.remove(b):this.o.multidate===!1?(this.dates.clear(),this.dates.push(a)):this.dates.push(a),\"number\"==typeof this.o.multidate)for(;this.dates.length>this.o.multidate;)this.dates.remove(0)},_setDate:function(a,b){b&&\"date\"!==b||this._toggle_multidate(a&&new Date(a)),(!b&&this.o.updateViewDate||\"view\"===b)&&(this.viewDate=a&&new Date(a)),this.fill(),this.setValue(),b&&\"view\"===b||this._trigger(\"changeDate\"),this.inputField.trigger(\"change\"),!this.o.autoclose||b&&\"date\"!==b||this.hide()},moveDay:function(a,b){var c=new Date(a);return c.setUTCDate(a.getUTCDate()+b),c},moveWeek:function(a,b){return this.moveDay(a,7*b)},moveMonth:function(a,b){if(!g(a))return this.o.defaultViewDate;if(!b)return a;var c,d,e=new Date(a.valueOf()),f=e.getUTCDate(),h=e.getUTCMonth(),i=Math.abs(b);if(b=b>0?1:-1,1===i)d=b===-1?function(){return e.getUTCMonth()===h}:function(){return e.getUTCMonth()!==c},c=h+b,e.setUTCMonth(c),c=(c+12)%12;else{for(var j=0;j<i;j++)e=this.moveMonth(e,b);c=e.getUTCMonth(),e.setUTCDate(f),d=function(){return c!==e.getUTCMonth()}}for(;d();)e.setUTCDate(--f),e.setUTCMonth(c);return e},moveYear:function(a,b){return this.moveMonth(a,12*b)},moveAvailableDate:function(a,b,c){do{if(a=this[c](a,b),!this.dateWithinRange(a))return!1;c=\"moveDay\"}while(this.dateIsDisabled(a));return a},weekOfDateIsDisabled:function(b){return a.inArray(b.getUTCDay(),this.o.daysOfWeekDisabled)!==-1},dateIsDisabled:function(b){return this.weekOfDateIsDisabled(b)||a.grep(this.o.datesDisabled,function(a){return e(b,a)}).length>0},dateWithinRange:function(a){return a>=this.o.startDate&&a<=this.o.endDate},keydown:function(a){if(!this.picker.is(\":visible\"))return void(40!==a.keyCode&&27!==a.keyCode||(this.show(),a.stopPropagation()));var b,c,d=!1,e=this.focusDate||this.viewDate;switch(a.keyCode){case 27:this.focusDate?(this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.fill()):this.hide(),a.preventDefault(),a.stopPropagation();break;case 37:case 38:case 39:case 40:if(!this.o.keyboardNavigation||7===this.o.daysOfWeekDisabled.length)break;b=37===a.keyCode||38===a.keyCode?-1:1,0===this.viewMode?a.ctrlKey?(c=this.moveAvailableDate(e,b,\"moveYear\"),c&&this._trigger(\"changeYear\",this.viewDate)):a.shiftKey?(c=this.moveAvailableDate(e,b,\"moveMonth\"),c&&this._trigger(\"changeMonth\",this.viewDate)):37===a.keyCode||39===a.keyCode?c=this.moveAvailableDate(e,b,\"moveDay\"):this.weekOfDateIsDisabled(e)||(c=this.moveAvailableDate(e,b,\"moveWeek\")):1===this.viewMode?(38!==a.keyCode&&40!==a.keyCode||(b*=4),c=this.moveAvailableDate(e,b,\"moveMonth\")):2===this.viewMode&&(38!==a.keyCode&&40!==a.keyCode||(b*=4),c=this.moveAvailableDate(e,b,\"moveYear\")),c&&(this.focusDate=this.viewDate=c,this.setValue(),this.fill(),a.preventDefault());break;case 13:if(!this.o.forceParse)break;e=this.focusDate||this.dates.get(-1)||this.viewDate,this.o.keyboardNavigation&&(this._toggle_multidate(e),d=!0),this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.setValue(),this.fill(),this.picker.is(\":visible\")&&(a.preventDefault(),a.stopPropagation(),this.o.autoclose&&this.hide());break;case 9:this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.fill(),this.hide()}d&&(this.dates.length?this._trigger(\"changeDate\"):this._trigger(\"clearDate\"),this.inputField.trigger(\"change\"))},setViewMode:function(a){this.viewMode=a,this.picker.children(\"div\").hide().filter(\".datepicker-\"+r.viewModes[this.viewMode].clsName).show(),this.updateNavArrows(),this._trigger(\"changeViewMode\",new Date(this.viewDate))}};var l=function(b,c){a.data(b,\"datepicker\",this),this.element=a(b),this.inputs=a.map(c.inputs,function(a){return a.jquery?a[0]:a}),delete c.inputs,this.keepEmptyValues=c.keepEmptyValues,delete c.keepEmptyValues,n.call(a(this.inputs),c).on(\"changeDate\",a.proxy(this.dateUpdated,this)),this.pickers=a.map(this.inputs,function(b){return a.data(b,\"datepicker\")}),this.updateDates()};l.prototype={updateDates:function(){this.dates=a.map(this.pickers,function(a){return a.getUTCDate()}),this.updateRanges()},updateRanges:function(){var b=a.map(this.dates,function(a){return a.valueOf()});a.each(this.pickers,function(a,c){c.setRange(b)})},dateUpdated:function(c){if(!this.updating){this.updating=!0;var d=a.data(c.target,\"datepicker\");if(d!==b){var e=d.getUTCDate(),f=this.keepEmptyValues,g=a.inArray(c.target,this.inputs),h=g-1,i=g+1,j=this.inputs.length;if(g!==-1){if(a.each(this.pickers,function(a,b){b.getUTCDate()||b!==d&&f||b.setUTCDate(e)}),e<this.dates[h])for(;h>=0&&e<this.dates[h];)this.pickers[h--].setUTCDate(e);else if(e>this.dates[i])for(;i<j&&e>this.dates[i];)this.pickers[i++].setUTCDate(e);this.updateDates(),delete this.updating}}}},destroy:function(){a.map(this.pickers,function(a){a.destroy()}),a(this.inputs).off(\"changeDate\",this.dateUpdated),delete this.element.data().datepicker},remove:f(\"destroy\",\"Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead\")};var m=a.fn.datepicker,n=function(c){var d=Array.apply(null,arguments);d.shift();var e;if(this.each(function(){var b=a(this),f=b.data(\"datepicker\"),g=\"object\"==typeof c&&c;if(!f){var j=h(this,\"date\"),m=a.extend({},o,j,g),n=i(m.language),p=a.extend({},o,n,j,g);b.hasClass(\"input-daterange\")||p.inputs?(a.extend(p,{inputs:p.inputs||b.find(\"input\").toArray()}),f=new l(this,p)):f=new k(this,p),b.data(\"datepicker\",f)}\"string\"==typeof c&&\"function\"==typeof f[c]&&(e=f[c].apply(f,d))}),e===b||e instanceof k||e instanceof l)return this;if(this.length>1)throw new Error(\"Using only allowed for the collection of a single element (\"+c+\" function)\");return e};a.fn.datepicker=n;var o=a.fn.datepicker.defaults={assumeNearbyYear:!1,autoclose:!1,beforeShowDay:a.noop,beforeShowMonth:a.noop,beforeShowYear:a.noop,beforeShowDecade:a.noop,beforeShowCentury:a.noop,calendarWeeks:!1,clearBtn:!1,toggleActive:!1,daysOfWeekDisabled:[],daysOfWeekHighlighted:[],datesDisabled:[],endDate:1/0,forceParse:!0,format:\"mm/dd/yyyy\",keepEmptyValues:!1,keyboardNavigation:!0,language:\"en\",minViewMode:0,maxViewMode:4,multidate:!1,multidateSeparator:\",\",orientation:\"auto\",rtl:!1,startDate:-(1/0),startView:0,todayBtn:!1,todayHighlight:!1,updateViewDate:!0,weekStart:0,disableTouchKeyboard:!1,enableOnReadonly:!0,showOnFocus:!0,zIndexOffset:10,container:\"body\",immediateUpdates:!1,title:\"\",templates:{leftArrow:\"&#x00AB;\",rightArrow:\"&#x00BB;\"},showWeekDays:!0},p=a.fn.datepicker.locale_opts=[\"format\",\"rtl\",\"weekStart\"];a.fn.datepicker.Constructor=k;var q=a.fn.datepicker.dates={en:{days:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],daysShort:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],daysMin:[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],months:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],monthsShort:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],today:\"Today\",clear:\"Clear\",titleFormat:\"MM yyyy\"}},r={viewModes:[{names:[\"days\",\"month\"],clsName:\"days\",e:\"changeMonth\"},{names:[\"months\",\"year\"],clsName:\"months\",e:\"changeYear\",navStep:1},{names:[\"years\",\"decade\"],clsName:\"years\",e:\"changeDecade\",navStep:10},{names:[\"decades\",\"century\"],clsName:\"decades\",e:\"changeCentury\",navStep:100},{names:[\"centuries\",\"millennium\"],clsName:\"centuries\",e:\"changeMillennium\",navStep:1e3}],validParts:/dd?|DD?|mm?|MM?|yy(?:yy)?/g,nonpunctuation:/[^ -\\/:-@\\u5e74\\u6708\\u65e5\\[-`{-~\\t\\n\\r]+/g,parseFormat:function(a){if(\"function\"==typeof a.toValue&&\"function\"==typeof a.toDisplay)return a;var b=a.replace(this.validParts,\"\\0\").split(\"\\0\"),c=a.match(this.validParts);if(!b||!b.length||!c||0===c.length)throw new Error(\"Invalid date format.\");return{separators:b,parts:c}},parseDate:function(c,e,f,g){function h(a,b){return b===!0&&(b=10),a<100&&(a+=2e3,a>(new Date).getFullYear()+b&&(a-=100)),a}function i(){var a=this.slice(0,j[n].length),b=j[n].slice(0,a.length);return a.toLowerCase()===b.toLowerCase()}if(!c)return b;if(c instanceof Date)return c;if(\"string\"==typeof e&&(e=r.parseFormat(e)),e.toValue)return e.toValue(c,e,f);var j,l,m,n,o,p={d:\"moveDay\",m:\"moveMonth\",w:\"moveWeek\",y:\"moveYear\"},s={yesterday:\"-1d\",today:\"+0d\",tomorrow:\"+1d\"};if(c in s&&(c=s[c]),/^[\\-+]\\d+[dmwy]([\\s,]+[\\-+]\\d+[dmwy])*$/i.test(c)){for(j=c.match(/([\\-+]\\d+)([dmwy])/gi),c=new Date,n=0;n<j.length;n++)l=j[n].match(/([\\-+]\\d+)([dmwy])/i),m=Number(l[1]),o=p[l[2].toLowerCase()],c=k.prototype[o](c,m);return k.prototype._zero_utc_time(c)}j=c&&c.match(this.nonpunctuation)||[];var t,u,v={},w=[\"yyyy\",\"yy\",\"M\",\"MM\",\"m\",\"mm\",\"d\",\"dd\"],x={yyyy:function(a,b){return a.setUTCFullYear(g?h(b,g):b)},m:function(a,b){if(isNaN(a))return a;for(b-=1;b<0;)b+=12;for(b%=12,a.setUTCMonth(b);a.getUTCMonth()!==b;)a.setUTCDate(a.getUTCDate()-1);return a},d:function(a,b){return a.setUTCDate(b)}};x.yy=x.yyyy,x.M=x.MM=x.mm=x.m,x.dd=x.d,c=d();var y=e.parts.slice();if(j.length!==y.length&&(y=a(y).filter(function(b,c){return a.inArray(c,w)!==-1}).toArray()),j.length===y.length){var z;for(n=0,z=y.length;n<z;n++){if(t=parseInt(j[n],10),l=y[n],isNaN(t))switch(l){case\"MM\":u=a(q[f].months).filter(i),t=a.inArray(u[0],q[f].months)+1;break;case\"M\":u=a(q[f].monthsShort).filter(i),t=a.inArray(u[0],q[f].monthsShort)+1}v[l]=t}var A,B;for(n=0;n<w.length;n++)B=w[n],B in v&&!isNaN(v[B])&&(A=new Date(c),x[B](A,v[B]),isNaN(A)||(c=A))}return c},formatDate:function(b,c,d){if(!b)return\"\";if(\"string\"==typeof c&&(c=r.parseFormat(c)),c.toDisplay)return c.toDisplay(b,c,d);var e={d:b.getUTCDate(),D:q[d].daysShort[b.getUTCDay()],DD:q[d].days[b.getUTCDay()],m:b.getUTCMonth()+1,M:q[d].monthsShort[b.getUTCMonth()],MM:q[d].months[b.getUTCMonth()],yy:b.getUTCFullYear().toString().substring(2),yyyy:b.getUTCFullYear()};e.dd=(e.d<10?\"0\":\"\")+e.d,e.mm=(e.m<10?\"0\":\"\")+e.m,b=[];for(var f=a.extend([],c.separators),g=0,h=c.parts.length;g<=h;g++)f.length&&b.push(f.shift()),b.push(e[c.parts[g]]);return b.join(\"\")},headTemplate:'<thead><tr><th colspan=\"7\" class=\"datepicker-title\"></th></tr><tr><th class=\"prev\">'+o.templates.leftArrow+'</th><th colspan=\"5\" class=\"datepicker-switch\"></th><th class=\"next\">'+o.templates.rightArrow+\"</th></tr></thead>\",\ncontTemplate:'<tbody><tr><td colspan=\"7\"></td></tr></tbody>',footTemplate:'<tfoot><tr><th colspan=\"7\" class=\"today\"></th></tr><tr><th colspan=\"7\" class=\"clear\"></th></tr></tfoot>'};r.template='<div class=\"datepicker\"><div class=\"datepicker-days\"><table class=\"table-condensed\">'+r.headTemplate+\"<tbody></tbody>\"+r.footTemplate+'</table></div><div class=\"datepicker-months\"><table class=\"table-condensed\">'+r.headTemplate+r.contTemplate+r.footTemplate+'</table></div><div class=\"datepicker-years\"><table class=\"table-condensed\">'+r.headTemplate+r.contTemplate+r.footTemplate+'</table></div><div class=\"datepicker-decades\"><table class=\"table-condensed\">'+r.headTemplate+r.contTemplate+r.footTemplate+'</table></div><div class=\"datepicker-centuries\"><table class=\"table-condensed\">'+r.headTemplate+r.contTemplate+r.footTemplate+\"</table></div></div>\",a.fn.datepicker.DPGlobal=r,a.fn.datepicker.noConflict=function(){return a.fn.datepicker=m,this},a.fn.datepicker.version=\"1.7.1\",a.fn.datepicker.deprecated=function(a){var b=window.console;b&&b.warn&&b.warn(\"DEPRECATED: \"+a)},a(document).on(\"focus.datepicker.data-api click.datepicker.data-api\",'[data-provide=\"datepicker\"]',function(b){var c=a(this);c.data(\"datepicker\")||(b.preventDefault(),n.call(c,\"show\"))}),a(function(){n.call(a('[data-provide=\"datepicker-inline\"]'))})});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1kYXRlcGlja2VyL2Rpc3QvanMvYm9vdHN0cmFwLWRhdGVwaWNrZXIubWluLmpzP2U4MzMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhO0FBQUE7QUFBQTtBQUFBLDBKQUFnSCxlQUFlLGFBQWEsZ0RBQWdELGFBQWEsZUFBZSxtREFBbUQsZ0JBQWdCLG1IQUFtSCxnQkFBZ0Isa0JBQWtCLDJFQUEyRSxjQUFjLDhCQUE4QixnQkFBZ0IsZ0JBQWdCLHVCQUF1Qix3QkFBd0IsNkNBQTZDLGtDQUFrQyx1REFBdUQsU0FBUyxjQUFjLFNBQVMsbUNBQW1DLFdBQVcsOEJBQThCLG9CQUFvQixLQUFLLGlCQUFpQixPQUFPLGdCQUFnQix3QkFBd0Isc0JBQXNCLDJDQUEyQyxJQUFJLGtFQUFrRSxTQUFTLG9CQUFvQixpQkFBaUIscUJBQXFCLGdFQUFnRSxrQkFBa0IsY0FBYyxpQkFBaUIsWUFBWSwyQkFBMkIsa0JBQWtCLFNBQVMsa0RBQWtELG1CQUFtQixtbENBQW1sQyxtQkFBbUIseUJBQXlCLHVMQUF1TCw0SkFBNEosYUFBYSwyQ0FBMkMsd0NBQXdDLGtEQUFrRCxJQUFJLGdDQUFnQywyREFBMkQsNkJBQTZCLElBQUksMEJBQTBCLDZDQUE2QyxXQUFXLGtCQUFrQixTQUFTLFVBQVUsOEJBQThCLG1CQUFtQixZQUFZLHdCQUF3Qix1QkFBdUIsZ2ZBQWdmLDhCQUE4Qix1c0JBQXVzQixzREFBc0QsRUFBRSxzRkFBc0YsMEJBQTBCLDZDQUE2QyxpQkFBaUIsa0JBQWtCLDRDQUE0Qyw0Q0FBNEMsTUFBTSw0Q0FBNEMsNEJBQTRCLDZCQUE2QixzREFBc0QsNkJBQTZCLCtCQUErQixLQUFLLDBKQUEwSiwyQkFBMkIsK0dBQStHLDJCQUEyQiwyQkFBMkIseURBQXlELGtCQUFrQixXQUFX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ZSw4QkFBOEIsOEVBQThFLGlCQUFpQixvREFBb0QsSUFBSSw0Q0FBNEMsd0VBQXdFLHFEQUFxRCxXQUFXLHFHQUFxRyxxQ0FBcUMsc0NBQXNDLFlBQVksK0NBQStDLG1CQUFtQixvQ0FBb0MsaUJBQWlCLHFCQUFxQixTQUFTLElBQUksT0FBTywyQkFBMkIsb0JBQW9CLGdDQUFnQyxTQUFTLGlCQUFpQix5QkFBeUIsNkNBQTZDLHNCQUFzQixxREFBcUQsMkJBQTJCLGtDQUFrQyxNQUFNLG1CQUFtQixJQUFJLEtBQUssaURBQWlELG9FQUFvRSxNQUFNLDZFQUE2RSxPQUFPLFFBQVEsUUFBUSxXQUFXLDhFQUE4RSxTQUFTLDRCQUE0QixlQUFlLGtGQUFrRixPQUFPLDRPQUE0Tyx1REFBdUQseURBQXlELEtBQUssc0RBQXNELGtCQUFrQjtBQUNoaStCLHFMQUFxTCw2dEJBQTZ0Qiw4QkFBOEIsd0VBQXdFLHFCQUFxQixvQ0FBb0MsZ0hBQWdILGNBQWMsNERBQTRELGVBQWUsZ0RBQWdELEVBQUUiLCJmaWxlIjoiNTkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIERhdGVwaWNrZXIgZm9yIEJvb3RzdHJhcCB2MS43LjEgKGh0dHBzOi8vZ2l0aHViLmNvbS91eHNvbHV0aW9ucy9ib290c3RyYXAtZGF0ZXBpY2tlcilcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgdjIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuICovXG5cbiFmdW5jdGlvbihhKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcImpxdWVyeVwiXSxhKTphKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP3JlcXVpcmUoXCJqcXVlcnlcIik6alF1ZXJ5KX0oZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKCl7cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KERhdGUsYXJndW1lbnRzKSl9ZnVuY3Rpb24gZCgpe3ZhciBhPW5ldyBEYXRlO3JldHVybiBjKGEuZ2V0RnVsbFllYXIoKSxhLmdldE1vbnRoKCksYS5nZXREYXRlKCkpfWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYS5nZXRVVENGdWxsWWVhcigpPT09Yi5nZXRVVENGdWxsWWVhcigpJiZhLmdldFVUQ01vbnRoKCk9PT1iLmdldFVUQ01vbnRoKCkmJmEuZ2V0VVRDRGF0ZSgpPT09Yi5nZXRVVENEYXRlKCl9ZnVuY3Rpb24gZihjLGQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBkIT09YiYmYS5mbi5kYXRlcGlja2VyLmRlcHJlY2F0ZWQoZCksdGhpc1tjXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGEmJiFpc05hTihhLmdldFRpbWUoKSl9ZnVuY3Rpb24gaChiLGMpe2Z1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYi50b0xvd2VyQ2FzZSgpfXZhciBlLGY9YShiKS5kYXRhKCksZz17fSxoPW5ldyBSZWdFeHAoXCJeXCIrYy50b0xvd2VyQ2FzZSgpK1wiKFtBLVpdKVwiKTtjPW5ldyBSZWdFeHAoXCJeXCIrYy50b0xvd2VyQ2FzZSgpKTtmb3IodmFyIGkgaW4gZiljLnRlc3QoaSkmJihlPWkucmVwbGFjZShoLGQpLGdbZV09ZltpXSk7cmV0dXJuIGd9ZnVuY3Rpb24gaShiKXt2YXIgYz17fTtpZihxW2JdfHwoYj1iLnNwbGl0KFwiLVwiKVswXSxxW2JdKSl7dmFyIGQ9cVtiXTtyZXR1cm4gYS5lYWNoKHAsZnVuY3Rpb24oYSxiKXtiIGluIGQmJihjW2JdPWRbYl0pfSksY319dmFyIGo9ZnVuY3Rpb24oKXt2YXIgYj17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNsaWNlKGEpWzBdfSxjb250YWluczpmdW5jdGlvbihhKXtmb3IodmFyIGI9YSYmYS52YWx1ZU9mKCksYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKylpZigwPD10aGlzW2NdLnZhbHVlT2YoKS1iJiZ0aGlzW2NdLnZhbHVlT2YoKS1iPDg2NGU1KXJldHVybiBjO3JldHVybi0xfSxyZW1vdmU6ZnVuY3Rpb24oYSl7dGhpcy5zcGxpY2UoYSwxKX0scmVwbGFjZTpmdW5jdGlvbihiKXtiJiYoYS5pc0FycmF5KGIpfHwoYj1bYl0pLHRoaXMuY2xlYXIoKSx0aGlzLnB1c2guYXBwbHkodGhpcyxiKSl9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5sZW5ndGg9MH0sY29weTpmdW5jdGlvbigpe3ZhciBhPW5ldyBqO3JldHVybiBhLnJlcGxhY2UodGhpcyksYX19O3JldHVybiBmdW5jdGlvbigpe3ZhciBjPVtdO3JldHVybiBjLnB1c2guYXBwbHkoYyxhcmd1bWVudHMpLGEuZXh0ZW5kKGMsYiksY319KCksaz1mdW5jdGlvbihiLGMpe2EuZGF0YShiLFwiZGF0ZXBpY2tlclwiLHRoaXMpLHRoaXMuX3Byb2Nlc3Nfb3B0aW9ucyhjKSx0aGlzLmRhdGVzPW5ldyBqLHRoaXMudmlld0RhdGU9dGhpcy5vLmRlZmF1bHRWaWV3RGF0ZSx0aGlzLmZvY3VzRGF0ZT1udWxsLHRoaXMuZWxlbWVudD1hKGIpLHRoaXMuaXNJbnB1dD10aGlzLmVsZW1lbnQuaXMoXCJpbnB1dFwiKSx0aGlzLmlucHV0RmllbGQ9dGhpcy5pc0lucHV0P3RoaXMuZWxlbWVudDp0aGlzLmVsZW1lbnQuZmluZChcImlucHV0XCIpLHRoaXMuY29tcG9uZW50PSEhdGhpcy5lbGVtZW50Lmhhc0NsYXNzKFwiZGF0ZVwiKSYmdGhpcy5lbGVtZW50LmZpbmQoXCIuYWRkLW9uLCAuaW5wdXQtZ3JvdXAtYWRkb24sIC5idG5cIiksdGhpcy5jb21wb25lbnQmJjA9PT10aGlzLmNvbXBvbmVudC5sZW5ndGgmJih0aGlzLmNvbXBvbmVudD0hMSksdGhpcy5pc0lubGluZT0hdGhpcy5jb21wb25lbnQmJnRoaXMuZWxlbWVudC5pcyhcImRpdlwiKSx0aGlzLnBpY2tlcj1hKHIudGVtcGxhdGUpLHRoaXMuX2NoZWNrX3RlbXBsYXRlKHRoaXMuby50ZW1wbGF0ZXMubGVmdEFycm93KSYmdGhpcy5waWNrZXIuZmluZChcIi5wcmV2XCIpLmh0bWwodGhpcy5vLnRlbXBsYXRlcy5sZWZ0QXJyb3cpLHRoaXMuX2NoZWNrX3RlbXBsYXRlKHRoaXMuby50ZW1wbGF0ZXMucmlnaHRBcnJvdykmJnRoaXMucGlja2VyLmZpbmQoXCIubmV4dFwiKS5odG1sKHRoaXMuby50ZW1wbGF0ZXMucmlnaHRBcnJvdyksdGhpcy5fYnVpbGRFdmVudHMoKSx0aGlzLl9hdHRhY2hFdmVudHMoKSx0aGlzLmlzSW5saW5lP3RoaXMucGlja2VyLmFkZENsYXNzKFwiZGF0ZXBpY2tlci1pbmxpbmVcIikuYXBwZW5kVG8odGhpcy5lbGVtZW50KTp0aGlzLnBpY2tlci5hZGRDbGFzcyhcImRhdGVwaWNrZXItZHJvcGRvd24gZHJvcGRvd24tbWVudVwiKSx0aGlzLm8ucnRsJiZ0aGlzLnBpY2tlci5hZGRDbGFzcyhcImRhdGVwaWNrZXItcnRsXCIpLHRoaXMuby5jYWxlbmRhcldlZWtzJiZ0aGlzLnBpY2tlci5maW5kKFwiLmRhdGVwaWNrZXItZGF5cyAuZGF0ZXBpY2tlci1zd2l0Y2gsIHRoZWFkIC5kYXRlcGlja2VyLXRpdGxlLCB0Zm9vdCAudG9kYXksIHRmb290IC5jbGVhclwiKS5hdHRyKFwiY29sc3BhblwiLGZ1bmN0aW9uKGEsYil7cmV0dXJuIE51bWJlcihiKSsxfSksdGhpcy5fcHJvY2Vzc19vcHRpb25zKHtzdGFydERhdGU6dGhpcy5fby5zdGFydERhdGUsZW5kRGF0ZTp0aGlzLl9vLmVuZERhdGUsZGF5c09mV2Vla0Rpc2FibGVkOnRoaXMuby5kYXlzT2ZXZWVrRGlzYWJsZWQsZGF5c09mV2Vla0hpZ2hsaWdodGVkOnRoaXMuby5kYXlzT2ZXZWVrSGlnaGxpZ2h0ZWQsZGF0ZXNEaXNhYmxlZDp0aGlzLm8uZGF0ZXNEaXNhYmxlZH0pLHRoaXMuX2FsbG93X3VwZGF0ZT0hMSx0aGlzLnNldFZpZXdNb2RlKHRoaXMuby5zdGFydFZpZXcpLHRoaXMuX2FsbG93X3VwZGF0ZT0hMCx0aGlzLmZpbGxEb3coKSx0aGlzLmZpbGxNb250aHMoKSx0aGlzLnVwZGF0ZSgpLHRoaXMuaXNJbmxpbmUmJnRoaXMuc2hvdygpfTtrLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ayxfcmVzb2x2ZVZpZXdOYW1lOmZ1bmN0aW9uKGIpe3JldHVybiBhLmVhY2goci52aWV3TW9kZXMsZnVuY3Rpb24oYyxkKXtpZihiPT09Y3x8YS5pbkFycmF5KGIsZC5uYW1lcykhPT0tMSlyZXR1cm4gYj1jLCExfSksYn0sX3Jlc29sdmVEYXlzT2ZXZWVrOmZ1bmN0aW9uKGIpe3JldHVybiBhLmlzQXJyYXkoYil8fChiPWIuc3BsaXQoL1ssXFxzXSovKSksYS5tYXAoYixOdW1iZXIpfSxfY2hlY2tfdGVtcGxhdGU6ZnVuY3Rpb24oYyl7dHJ5e2lmKGM9PT1ifHxcIlwiPT09YylyZXR1cm4hMTtpZigoYy5tYXRjaCgvWzw+XS9nKXx8W10pLmxlbmd0aDw9MClyZXR1cm4hMDt2YXIgZD1hKGMpO3JldHVybiBkLmxlbmd0aD4wfWNhdGNoKGEpe3JldHVybiExfX0sX3Byb2Nlc3Nfb3B0aW9uczpmdW5jdGlvbihiKXt0aGlzLl9vPWEuZXh0ZW5kKHt9LHRoaXMuX28sYik7dmFyIGU9dGhpcy5vPWEuZXh0ZW5kKHt9LHRoaXMuX28pLGY9ZS5sYW5ndWFnZTtxW2ZdfHwoZj1mLnNwbGl0KFwiLVwiKVswXSxxW2ZdfHwoZj1vLmxhbmd1YWdlKSksZS5sYW5ndWFnZT1mLGUuc3RhcnRWaWV3PXRoaXMuX3Jlc29sdmVWaWV3TmFtZShlLnN0YXJ0VmlldyksZS5taW5WaWV3TW9kZT10aGlzLl9yZXNvbHZlVmlld05hbWUoZS5taW5WaWV3TW9kZSksZS5tYXhWaWV3TW9kZT10aGlzLl9yZXNvbHZlVmlld05hbWUoZS5tYXhWaWV3TW9kZSksZS5zdGFydFZpZXc9TWF0aC5tYXgodGhpcy5vLm1pblZpZXdNb2RlLE1hdGgubWluKHRoaXMuby5tYXhWaWV3TW9kZSxlLnN0YXJ0VmlldykpLGUubXVsdGlkYXRlIT09ITAmJihlLm11bHRpZGF0ZT1OdW1iZXIoZS5tdWx0aWRhdGUpfHwhMSxlLm11bHRpZGF0ZSE9PSExJiYoZS5tdWx0aWRhdGU9TWF0aC5tYXgoMCxlLm11bHRpZGF0ZSkpKSxlLm11bHRpZGF0ZVNlcGFyYXRvcj1TdHJpbmcoZS5tdWx0aWRhdGVTZXBhcmF0b3IpLGUud2Vla1N0YXJ0JT03LGUud2Vla0VuZD0oZS53ZWVrU3RhcnQrNiklNzt2YXIgZz1yLnBhcnNlRm9ybWF0KGUuZm9ybWF0KTtlLnN0YXJ0RGF0ZSE9PS0oMS8wKSYmKGUuc3RhcnREYXRlP2Uuc3RhcnREYXRlIGluc3RhbmNlb2YgRGF0ZT9lLnN0YXJ0RGF0ZT10aGlzLl9sb2NhbF90b191dGModGhpcy5femVyb190aW1lKGUuc3RhcnREYXRlKSk6ZS5zdGFydERhdGU9ci5wYXJzZURhdGUoZS5zdGFydERhdGUsZyxlLmxhbmd1YWdlLGUuYXNzdW1lTmVhcmJ5WWVhcik6ZS5zdGFydERhdGU9LSgxLzApKSxlLmVuZERhdGUhPT0xLzAmJihlLmVuZERhdGU/ZS5lbmREYXRlIGluc3RhbmNlb2YgRGF0ZT9lLmVuZERhdGU9dGhpcy5fbG9jYWxfdG9fdXRjKHRoaXMuX3plcm9fdGltZShlLmVuZERhdGUpKTplLmVuZERhdGU9ci5wYXJzZURhdGUoZS5lbmREYXRlLGcsZS5sYW5ndWFnZSxlLmFzc3VtZU5lYXJieVllYXIpOmUuZW5kRGF0ZT0xLzApLGUuZGF5c09mV2Vla0Rpc2FibGVkPXRoaXMuX3Jlc29sdmVEYXlzT2ZXZWVrKGUuZGF5c09mV2Vla0Rpc2FibGVkfHxbXSksZS5kYXlzT2ZXZWVrSGlnaGxpZ2h0ZWQ9dGhpcy5fcmVzb2x2ZURheXNPZldlZWsoZS5kYXlzT2ZXZWVrSGlnaGxpZ2h0ZWR8fFtdKSxlLmRhdGVzRGlzYWJsZWQ9ZS5kYXRlc0Rpc2FibGVkfHxbXSxhLmlzQXJyYXkoZS5kYXRlc0Rpc2FibGVkKXx8KGUuZGF0ZXNEaXNhYmxlZD1lLmRhdGVzRGlzYWJsZWQuc3BsaXQoXCIsXCIpKSxlLmRhdGVzRGlzYWJsZWQ9YS5tYXAoZS5kYXRlc0Rpc2FibGVkLGZ1bmN0aW9uKGEpe3JldHVybiByLnBhcnNlRGF0ZShhLGcsZS5sYW5ndWFnZSxlLmFzc3VtZU5lYXJieVllYXIpfSk7dmFyIGg9U3RyaW5nKGUub3JpZW50YXRpb24pLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xccysvZyksaT1lLm9yaWVudGF0aW9uLnRvTG93ZXJDYXNlKCk7aWYoaD1hLmdyZXAoaCxmdW5jdGlvbihhKXtyZXR1cm4vXmF1dG98bGVmdHxyaWdodHx0b3B8Ym90dG9tJC8udGVzdChhKX0pLGUub3JpZW50YXRpb249e3g6XCJhdXRvXCIseTpcImF1dG9cIn0saSYmXCJhdXRvXCIhPT1pKWlmKDE9PT1oLmxlbmd0aClzd2l0Y2goaFswXSl7Y2FzZVwidG9wXCI6Y2FzZVwiYm90dG9tXCI6ZS5vcmllbnRhdGlvbi55PWhbMF07YnJlYWs7Y2FzZVwibGVmdFwiOmNhc2VcInJpZ2h0XCI6ZS5vcmllbnRhdGlvbi54PWhbMF19ZWxzZSBpPWEuZ3JlcChoLGZ1bmN0aW9uKGEpe3JldHVybi9ebGVmdHxyaWdodCQvLnRlc3QoYSl9KSxlLm9yaWVudGF0aW9uLng9aVswXXx8XCJhdXRvXCIsaT1hLmdyZXAoaCxmdW5jdGlvbihhKXtyZXR1cm4vXnRvcHxib3R0b20kLy50ZXN0KGEpfSksZS5vcmllbnRhdGlvbi55PWlbMF18fFwiYXV0b1wiO2Vsc2U7aWYoZS5kZWZhdWx0Vmlld0RhdGUgaW5zdGFuY2VvZiBEYXRlfHxcInN0cmluZ1wiPT10eXBlb2YgZS5kZWZhdWx0Vmlld0RhdGUpZS5kZWZhdWx0Vmlld0RhdGU9ci5wYXJzZURhdGUoZS5kZWZhdWx0Vmlld0RhdGUsZyxlLmxhbmd1YWdlLGUuYXNzdW1lTmVhcmJ5WWVhcik7ZWxzZSBpZihlLmRlZmF1bHRWaWV3RGF0ZSl7dmFyIGo9ZS5kZWZhdWx0Vmlld0RhdGUueWVhcnx8KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLGs9ZS5kZWZhdWx0Vmlld0RhdGUubW9udGh8fDAsbD1lLmRlZmF1bHRWaWV3RGF0ZS5kYXl8fDE7ZS5kZWZhdWx0Vmlld0RhdGU9YyhqLGssbCl9ZWxzZSBlLmRlZmF1bHRWaWV3RGF0ZT1kKCl9LF9ldmVudHM6W10sX3NlY29uZGFyeUV2ZW50czpbXSxfYXBwbHlFdmVudHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjLGQsZSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1hW2ZdWzBdLDI9PT1hW2ZdLmxlbmd0aD8oZD1iLGU9YVtmXVsxXSk6Mz09PWFbZl0ubGVuZ3RoJiYoZD1hW2ZdWzFdLGU9YVtmXVsyXSksYy5vbihlLGQpfSxfdW5hcHBseUV2ZW50czpmdW5jdGlvbihhKXtmb3IodmFyIGMsZCxlLGY9MDtmPGEubGVuZ3RoO2YrKyljPWFbZl1bMF0sMj09PWFbZl0ubGVuZ3RoPyhlPWIsZD1hW2ZdWzFdKTozPT09YVtmXS5sZW5ndGgmJihlPWFbZl1bMV0sZD1hW2ZdWzJdKSxjLm9mZihkLGUpfSxfYnVpbGRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgYj17a2V5dXA6YS5wcm94eShmdW5jdGlvbihiKXthLmluQXJyYXkoYi5rZXlDb2RlLFsyNywzNywzOSwzOCw0MCwzMiwxMyw5XSk9PT0tMSYmdGhpcy51cGRhdGUoKX0sdGhpcyksa2V5ZG93bjphLnByb3h5KHRoaXMua2V5ZG93bix0aGlzKSxwYXN0ZTphLnByb3h5KHRoaXMucGFzdGUsdGhpcyl9O3RoaXMuby5zaG93T25Gb2N1cz09PSEwJiYoYi5mb2N1cz1hLnByb3h5KHRoaXMuc2hvdyx0aGlzKSksdGhpcy5pc0lucHV0P3RoaXMuX2V2ZW50cz1bW3RoaXMuZWxlbWVudCxiXV06dGhpcy5jb21wb25lbnQmJnRoaXMuaW5wdXRGaWVsZC5sZW5ndGg/dGhpcy5fZXZlbnRzPVtbdGhpcy5pbnB1dEZpZWxkLGJdLFt0aGlzLmNvbXBvbmVudCx7Y2xpY2s6YS5wcm94eSh0aGlzLnNob3csdGhpcyl9XV06dGhpcy5fZXZlbnRzPVtbdGhpcy5lbGVtZW50LHtjbGljazphLnByb3h5KHRoaXMuc2hvdyx0aGlzKSxrZXlkb3duOmEucHJveHkodGhpcy5rZXlkb3duLHRoaXMpfV1dLHRoaXMuX2V2ZW50cy5wdXNoKFt0aGlzLmVsZW1lbnQsXCIqXCIse2JsdXI6YS5wcm94eShmdW5jdGlvbihhKXt0aGlzLl9mb2N1c2VkX2Zyb209YS50YXJnZXR9LHRoaXMpfV0sW3RoaXMuZWxlbWVudCx7Ymx1cjphLnByb3h5KGZ1bmN0aW9uKGEpe3RoaXMuX2ZvY3VzZWRfZnJvbT1hLnRhcmdldH0sdGhpcyl9XSksdGhpcy5vLmltbWVkaWF0ZVVwZGF0ZXMmJnRoaXMuX2V2ZW50cy5wdXNoKFt0aGlzLmVsZW1lbnQse1wiY2hhbmdlWWVhciBjaGFuZ2VNb250aFwiOmEucHJveHkoZnVuY3Rpb24oYSl7dGhpcy51cGRhdGUoYS5kYXRlKX0sdGhpcyl9XSksdGhpcy5fc2Vjb25kYXJ5RXZlbnRzPVtbdGhpcy5waWNrZXIse2NsaWNrOmEucHJveHkodGhpcy5jbGljayx0aGlzKX1dLFt0aGlzLnBpY2tlcixcIi5wcmV2LCAubmV4dFwiLHtjbGljazphLnByb3h5KHRoaXMubmF2QXJyb3dzQ2xpY2ssdGhpcyl9XSxbdGhpcy5waWNrZXIsXCIuZGF5Om5vdCguZGlzYWJsZWQpXCIse2NsaWNrOmEucHJveHkodGhpcy5kYXlDZWxsQ2xpY2ssdGhpcyl9XSxbYSh3aW5kb3cpLHtyZXNpemU6YS5wcm94eSh0aGlzLnBsYWNlLHRoaXMpfV0sW2EoZG9jdW1lbnQpLHtcIm1vdXNlZG93biB0b3VjaHN0YXJ0XCI6YS5wcm94eShmdW5jdGlvbihhKXt0aGlzLmVsZW1lbnQuaXMoYS50YXJnZXQpfHx0aGlzLmVsZW1lbnQuZmluZChhLnRhcmdldCkubGVuZ3RofHx0aGlzLnBpY2tlci5pcyhhLnRhcmdldCl8fHRoaXMucGlja2VyLmZpbmQoYS50YXJnZXQpLmxlbmd0aHx8dGhpcy5pc0lubGluZXx8dGhpcy5oaWRlKCl9LHRoaXMpfV1dfSxfYXR0YWNoRXZlbnRzOmZ1bmN0aW9uKCl7dGhpcy5fZGV0YWNoRXZlbnRzKCksdGhpcy5fYXBwbHlFdmVudHModGhpcy5fZXZlbnRzKX0sX2RldGFjaEV2ZW50czpmdW5jdGlvbigpe3RoaXMuX3VuYXBwbHlFdmVudHModGhpcy5fZXZlbnRzKX0sX2F0dGFjaFNlY29uZGFyeUV2ZW50czpmdW5jdGlvbigpe3RoaXMuX2RldGFjaFNlY29uZGFyeUV2ZW50cygpLHRoaXMuX2FwcGx5RXZlbnRzKHRoaXMuX3NlY29uZGFyeUV2ZW50cyl9LF9kZXRhY2hTZWNvbmRhcnlFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLl91bmFwcGx5RXZlbnRzKHRoaXMuX3NlY29uZGFyeUV2ZW50cyl9LF90cmlnZ2VyOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9Y3x8dGhpcy5kYXRlcy5nZXQoLTEpLGU9dGhpcy5fdXRjX3RvX2xvY2FsKGQpO3RoaXMuZWxlbWVudC50cmlnZ2VyKHt0eXBlOmIsZGF0ZTplLHZpZXdNb2RlOnRoaXMudmlld01vZGUsZGF0ZXM6YS5tYXAodGhpcy5kYXRlcyx0aGlzLl91dGNfdG9fbG9jYWwpLGZvcm1hdDphLnByb3h5KGZ1bmN0aW9uKGEsYil7MD09PWFyZ3VtZW50cy5sZW5ndGg/KGE9dGhpcy5kYXRlcy5sZW5ndGgtMSxiPXRoaXMuby5mb3JtYXQpOlwic3RyaW5nXCI9PXR5cGVvZiBhJiYoYj1hLGE9dGhpcy5kYXRlcy5sZW5ndGgtMSksYj1ifHx0aGlzLm8uZm9ybWF0O3ZhciBjPXRoaXMuZGF0ZXMuZ2V0KGEpO3JldHVybiByLmZvcm1hdERhdGUoYyxiLHRoaXMuby5sYW5ndWFnZSl9LHRoaXMpfSl9LHNob3c6ZnVuY3Rpb24oKXtpZighKHRoaXMuaW5wdXRGaWVsZC5wcm9wKFwiZGlzYWJsZWRcIil8fHRoaXMuaW5wdXRGaWVsZC5wcm9wKFwicmVhZG9ubHlcIikmJnRoaXMuby5lbmFibGVPblJlYWRvbmx5PT09ITEpKXJldHVybiB0aGlzLmlzSW5saW5lfHx0aGlzLnBpY2tlci5hcHBlbmRUbyh0aGlzLm8uY29udGFpbmVyKSx0aGlzLnBsYWNlKCksdGhpcy5waWNrZXIuc2hvdygpLHRoaXMuX2F0dGFjaFNlY29uZGFyeUV2ZW50cygpLHRoaXMuX3RyaWdnZXIoXCJzaG93XCIpLCh3aW5kb3cubmF2aWdhdG9yLm1zTWF4VG91Y2hQb2ludHN8fFwib250b3VjaHN0YXJ0XCJpbiBkb2N1bWVudCkmJnRoaXMuby5kaXNhYmxlVG91Y2hLZXlib2FyZCYmYSh0aGlzLmVsZW1lbnQpLmJsdXIoKSx0aGlzfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNJbmxpbmV8fCF0aGlzLnBpY2tlci5pcyhcIjp2aXNpYmxlXCIpP3RoaXM6KHRoaXMuZm9jdXNEYXRlPW51bGwsdGhpcy5waWNrZXIuaGlkZSgpLmRldGFjaCgpLHRoaXMuX2RldGFjaFNlY29uZGFyeUV2ZW50cygpLHRoaXMuc2V0Vmlld01vZGUodGhpcy5vLnN0YXJ0VmlldyksdGhpcy5vLmZvcmNlUGFyc2UmJnRoaXMuaW5wdXRGaWVsZC52YWwoKSYmdGhpcy5zZXRWYWx1ZSgpLHRoaXMuX3RyaWdnZXIoXCJoaWRlXCIpLHRoaXMpfSxkZXN0cm95OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGlkZSgpLHRoaXMuX2RldGFjaEV2ZW50cygpLHRoaXMuX2RldGFjaFNlY29uZGFyeUV2ZW50cygpLHRoaXMucGlja2VyLnJlbW92ZSgpLGRlbGV0ZSB0aGlzLmVsZW1lbnQuZGF0YSgpLmRhdGVwaWNrZXIsdGhpcy5pc0lucHV0fHxkZWxldGUgdGhpcy5lbGVtZW50LmRhdGEoKS5kYXRlLHRoaXN9LHBhc3RlOmZ1bmN0aW9uKGIpe3ZhciBjO2lmKGIub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhJiZiLm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YS50eXBlcyYmYS5pbkFycmF5KFwidGV4dC9wbGFpblwiLGIub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhLnR5cGVzKSE9PS0xKWM9Yi5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIik7ZWxzZXtpZighd2luZG93LmNsaXBib2FyZERhdGEpcmV0dXJuO2M9d2luZG93LmNsaXBib2FyZERhdGEuZ2V0RGF0YShcIlRleHRcIil9dGhpcy5zZXREYXRlKGMpLHRoaXMudXBkYXRlKCksYi5wcmV2ZW50RGVmYXVsdCgpfSxfdXRjX3RvX2xvY2FsOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiBhO3ZhciBiPW5ldyBEYXRlKGEuZ2V0VGltZSgpKzZlNCphLmdldFRpbWV6b25lT2Zmc2V0KCkpO3JldHVybiBiLmdldFRpbWV6b25lT2Zmc2V0KCkhPT1hLmdldFRpbWV6b25lT2Zmc2V0KCkmJihiPW5ldyBEYXRlKGEuZ2V0VGltZSgpKzZlNCpiLmdldFRpbWV6b25lT2Zmc2V0KCkpKSxifSxfbG9jYWxfdG9fdXRjOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZuZXcgRGF0ZShhLmdldFRpbWUoKS02ZTQqYS5nZXRUaW1lem9uZU9mZnNldCgpKX0sX3plcm9fdGltZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmbmV3IERhdGUoYS5nZXRGdWxsWWVhcigpLGEuZ2V0TW9udGgoKSxhLmdldERhdGUoKSl9LF96ZXJvX3V0Y190aW1lOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZjKGEuZ2V0VVRDRnVsbFllYXIoKSxhLmdldFVUQ01vbnRoKCksYS5nZXRVVENEYXRlKCkpfSxnZXREYXRlczpmdW5jdGlvbigpe3JldHVybiBhLm1hcCh0aGlzLmRhdGVzLHRoaXMuX3V0Y190b19sb2NhbCl9LGdldFVUQ0RhdGVzOmZ1bmN0aW9uKCl7cmV0dXJuIGEubWFwKHRoaXMuZGF0ZXMsZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBEYXRlKGEpfSl9LGdldERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXRjX3RvX2xvY2FsKHRoaXMuZ2V0VVRDRGF0ZSgpKX0sZ2V0VVRDRGF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZGF0ZXMuZ2V0KC0xKTtyZXR1cm4gYSE9PWI/bmV3IERhdGUoYSk6bnVsbH0sY2xlYXJEYXRlczpmdW5jdGlvbigpe3RoaXMuaW5wdXRGaWVsZC52YWwoXCJcIiksdGhpcy51cGRhdGUoKSx0aGlzLl90cmlnZ2VyKFwiY2hhbmdlRGF0ZVwiKSx0aGlzLm8uYXV0b2Nsb3NlJiZ0aGlzLmhpZGUoKX0sc2V0RGF0ZXM6ZnVuY3Rpb24oKXt2YXIgYj1hLmlzQXJyYXkoYXJndW1lbnRzWzBdKT9hcmd1bWVudHNbMF06YXJndW1lbnRzO3JldHVybiB0aGlzLnVwZGF0ZS5hcHBseSh0aGlzLGIpLHRoaXMuX3RyaWdnZXIoXCJjaGFuZ2VEYXRlXCIpLHRoaXMuc2V0VmFsdWUoKSx0aGlzfSxzZXRVVENEYXRlczpmdW5jdGlvbigpe3ZhciBiPWEuaXNBcnJheShhcmd1bWVudHNbMF0pP2FyZ3VtZW50c1swXTphcmd1bWVudHM7cmV0dXJuIHRoaXMuc2V0RGF0ZXMuYXBwbHkodGhpcyxhLm1hcChiLHRoaXMuX3V0Y190b19sb2NhbCkpLHRoaXN9LHNldERhdGU6ZihcInNldERhdGVzXCIpLHNldFVUQ0RhdGU6ZihcInNldFVUQ0RhdGVzXCIpLHJlbW92ZTpmKFwiZGVzdHJveVwiLFwiTWV0aG9kIGByZW1vdmVgIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDIuMC4gVXNlIGBkZXN0cm95YCBpbnN0ZWFkXCIpLHNldFZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRGb3JtYXR0ZWREYXRlKCk7cmV0dXJuIHRoaXMuaW5wdXRGaWVsZC52YWwoYSksdGhpc30sZ2V0Rm9ybWF0dGVkRGF0ZTpmdW5jdGlvbihjKXtjPT09YiYmKGM9dGhpcy5vLmZvcm1hdCk7dmFyIGQ9dGhpcy5vLmxhbmd1YWdlO3JldHVybiBhLm1hcCh0aGlzLmRhdGVzLGZ1bmN0aW9uKGEpe3JldHVybiByLmZvcm1hdERhdGUoYSxjLGQpfSkuam9pbih0aGlzLm8ubXVsdGlkYXRlU2VwYXJhdG9yKX0sZ2V0U3RhcnREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuby5zdGFydERhdGV9LHNldFN0YXJ0RGF0ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fcHJvY2Vzc19vcHRpb25zKHtzdGFydERhdGU6YX0pLHRoaXMudXBkYXRlKCksdGhpcy51cGRhdGVOYXZBcnJvd3MoKSx0aGlzfSxnZXRFbmREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuby5lbmREYXRlfSxzZXRFbmREYXRlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9wcm9jZXNzX29wdGlvbnMoe2VuZERhdGU6YX0pLHRoaXMudXBkYXRlKCksdGhpcy51cGRhdGVOYXZBcnJvd3MoKSx0aGlzfSxzZXREYXlzT2ZXZWVrRGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3Byb2Nlc3Nfb3B0aW9ucyh7ZGF5c09mV2Vla0Rpc2FibGVkOmF9KSx0aGlzLnVwZGF0ZSgpLHRoaXN9LHNldERheXNPZldlZWtIaWdobGlnaHRlZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fcHJvY2Vzc19vcHRpb25zKHtkYXlzT2ZXZWVrSGlnaGxpZ2h0ZWQ6YX0pLHRoaXMudXBkYXRlKCksdGhpc30sc2V0RGF0ZXNEaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fcHJvY2Vzc19vcHRpb25zKHtkYXRlc0Rpc2FibGVkOmF9KSx0aGlzLnVwZGF0ZSgpLHRoaXN9LHBsYWNlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0lubGluZSlyZXR1cm4gdGhpczt2YXIgYj10aGlzLnBpY2tlci5vdXRlcldpZHRoKCksYz10aGlzLnBpY2tlci5vdXRlckhlaWdodCgpLGQ9MTAsZT1hKHRoaXMuby5jb250YWluZXIpLGY9ZS53aWR0aCgpLGc9XCJib2R5XCI9PT10aGlzLm8uY29udGFpbmVyP2EoZG9jdW1lbnQpLnNjcm9sbFRvcCgpOmUuc2Nyb2xsVG9wKCksaD1lLm9mZnNldCgpLGk9WzBdO3RoaXMuZWxlbWVudC5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEodGhpcykuY3NzKFwiei1pbmRleFwiKTtcImF1dG9cIiE9PWImJjAhPT1OdW1iZXIoYikmJmkucHVzaChOdW1iZXIoYikpfSk7dmFyIGo9TWF0aC5tYXguYXBwbHkoTWF0aCxpKSt0aGlzLm8uekluZGV4T2Zmc2V0LGs9dGhpcy5jb21wb25lbnQ/dGhpcy5jb21wb25lbnQucGFyZW50KCkub2Zmc2V0KCk6dGhpcy5lbGVtZW50Lm9mZnNldCgpLGw9dGhpcy5jb21wb25lbnQ/dGhpcy5jb21wb25lbnQub3V0ZXJIZWlnaHQoITApOnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCghMSksbT10aGlzLmNvbXBvbmVudD90aGlzLmNvbXBvbmVudC5vdXRlcldpZHRoKCEwKTp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCghMSksbj1rLmxlZnQtaC5sZWZ0LG89ay50b3AtaC50b3A7XCJib2R5XCIhPT10aGlzLm8uY29udGFpbmVyJiYobys9ZyksdGhpcy5waWNrZXIucmVtb3ZlQ2xhc3MoXCJkYXRlcGlja2VyLW9yaWVudC10b3AgZGF0ZXBpY2tlci1vcmllbnQtYm90dG9tIGRhdGVwaWNrZXItb3JpZW50LXJpZ2h0IGRhdGVwaWNrZXItb3JpZW50LWxlZnRcIiksXCJhdXRvXCIhPT10aGlzLm8ub3JpZW50YXRpb24ueD8odGhpcy5waWNrZXIuYWRkQ2xhc3MoXCJkYXRlcGlja2VyLW9yaWVudC1cIit0aGlzLm8ub3JpZW50YXRpb24ueCksXCJyaWdodFwiPT09dGhpcy5vLm9yaWVudGF0aW9uLngmJihuLT1iLW0pKTprLmxlZnQ8MD8odGhpcy5waWNrZXIuYWRkQ2xhc3MoXCJkYXRlcGlja2VyLW9yaWVudC1sZWZ0XCIpLG4tPWsubGVmdC1kKTpuK2I+Zj8odGhpcy5waWNrZXIuYWRkQ2xhc3MoXCJkYXRlcGlja2VyLW9yaWVudC1yaWdodFwiKSxuKz1tLWIpOnRoaXMuby5ydGw/dGhpcy5waWNrZXIuYWRkQ2xhc3MoXCJkYXRlcGlja2VyLW9yaWVudC1yaWdodFwiKTp0aGlzLnBpY2tlci5hZGRDbGFzcyhcImRhdGVwaWNrZXItb3JpZW50LWxlZnRcIik7dmFyIHAscT10aGlzLm8ub3JpZW50YXRpb24ueTtpZihcImF1dG9cIj09PXEmJihwPS1nK28tYyxxPXA8MD9cImJvdHRvbVwiOlwidG9wXCIpLHRoaXMucGlja2VyLmFkZENsYXNzKFwiZGF0ZXBpY2tlci1vcmllbnQtXCIrcSksXCJ0b3BcIj09PXE/by09YytwYXJzZUludCh0aGlzLnBpY2tlci5jc3MoXCJwYWRkaW5nLXRvcFwiKSk6bys9bCx0aGlzLm8ucnRsKXt2YXIgcj1mLShuK20pO3RoaXMucGlja2VyLmNzcyh7dG9wOm8scmlnaHQ6cix6SW5kZXg6an0pfWVsc2UgdGhpcy5waWNrZXIuY3NzKHt0b3A6byxsZWZ0Om4sekluZGV4Omp9KTtyZXR1cm4gdGhpc30sX2FsbG93X3VwZGF0ZTohMCx1cGRhdGU6ZnVuY3Rpb24oKXtpZighdGhpcy5fYWxsb3dfdXBkYXRlKXJldHVybiB0aGlzO3ZhciBiPXRoaXMuZGF0ZXMuY29weSgpLGM9W10sZD0hMTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5lYWNoKGFyZ3VtZW50cyxhLnByb3h5KGZ1bmN0aW9uKGEsYil7YiBpbnN0YW5jZW9mIERhdGUmJihiPXRoaXMuX2xvY2FsX3RvX3V0YyhiKSksYy5wdXNoKGIpfSx0aGlzKSksZD0hMCk6KGM9dGhpcy5pc0lucHV0P3RoaXMuZWxlbWVudC52YWwoKTp0aGlzLmVsZW1lbnQuZGF0YShcImRhdGVcIil8fHRoaXMuaW5wdXRGaWVsZC52YWwoKSxjPWMmJnRoaXMuby5tdWx0aWRhdGU/Yy5zcGxpdCh0aGlzLm8ubXVsdGlkYXRlU2VwYXJhdG9yKTpbY10sZGVsZXRlIHRoaXMuZWxlbWVudC5kYXRhKCkuZGF0ZSksYz1hLm1hcChjLGEucHJveHkoZnVuY3Rpb24oYSl7cmV0dXJuIHIucGFyc2VEYXRlKGEsdGhpcy5vLmZvcm1hdCx0aGlzLm8ubGFuZ3VhZ2UsdGhpcy5vLmFzc3VtZU5lYXJieVllYXIpfSx0aGlzKSksYz1hLmdyZXAoYyxhLnByb3h5KGZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLmRhdGVXaXRoaW5SYW5nZShhKXx8IWF9LHRoaXMpLCEwKSx0aGlzLmRhdGVzLnJlcGxhY2UoYyksdGhpcy5vLnVwZGF0ZVZpZXdEYXRlJiYodGhpcy5kYXRlcy5sZW5ndGg/dGhpcy52aWV3RGF0ZT1uZXcgRGF0ZSh0aGlzLmRhdGVzLmdldCgtMSkpOnRoaXMudmlld0RhdGU8dGhpcy5vLnN0YXJ0RGF0ZT90aGlzLnZpZXdEYXRlPW5ldyBEYXRlKHRoaXMuby5zdGFydERhdGUpOnRoaXMudmlld0RhdGU+dGhpcy5vLmVuZERhdGU/dGhpcy52aWV3RGF0ZT1uZXcgRGF0ZSh0aGlzLm8uZW5kRGF0ZSk6dGhpcy52aWV3RGF0ZT10aGlzLm8uZGVmYXVsdFZpZXdEYXRlKSxkPyh0aGlzLnNldFZhbHVlKCksdGhpcy5lbGVtZW50LmNoYW5nZSgpKTp0aGlzLmRhdGVzLmxlbmd0aCYmU3RyaW5nKGIpIT09U3RyaW5nKHRoaXMuZGF0ZXMpJiZkJiYodGhpcy5fdHJpZ2dlcihcImNoYW5nZURhdGVcIiksdGhpcy5lbGVtZW50LmNoYW5nZSgpKSwhdGhpcy5kYXRlcy5sZW5ndGgmJmIubGVuZ3RoJiYodGhpcy5fdHJpZ2dlcihcImNsZWFyRGF0ZVwiKSx0aGlzLmVsZW1lbnQuY2hhbmdlKCkpLHRoaXMuZmlsbCgpLHRoaXN9LGZpbGxEb3c6ZnVuY3Rpb24oKXtpZih0aGlzLm8uc2hvd1dlZWtEYXlzKXt2YXIgYj10aGlzLm8ud2Vla1N0YXJ0LGM9XCI8dHI+XCI7Zm9yKHRoaXMuby5jYWxlbmRhcldlZWtzJiYoYys9Jzx0aCBjbGFzcz1cImN3XCI+JiMxNjA7PC90aD4nKTtiPHRoaXMuby53ZWVrU3RhcnQrNzspYys9Jzx0aCBjbGFzcz1cImRvdycsYS5pbkFycmF5KGIsdGhpcy5vLmRheXNPZldlZWtEaXNhYmxlZCkhPT0tMSYmKGMrPVwiIGRpc2FibGVkXCIpLGMrPSdcIj4nK3FbdGhpcy5vLmxhbmd1YWdlXS5kYXlzTWluW2IrKyU3XStcIjwvdGg+XCI7Yys9XCI8L3RyPlwiLHRoaXMucGlja2VyLmZpbmQoXCIuZGF0ZXBpY2tlci1kYXlzIHRoZWFkXCIpLmFwcGVuZChjKX19LGZpbGxNb250aHM6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj10aGlzLl91dGNfdG9fbG9jYWwodGhpcy52aWV3RGF0ZSksYz1cIlwiLGQ9MDtkPDEyO2QrKylhPWImJmIuZ2V0TW9udGgoKT09PWQ/XCIgZm9jdXNlZFwiOlwiXCIsYys9JzxzcGFuIGNsYXNzPVwibW9udGgnK2ErJ1wiPicrcVt0aGlzLm8ubGFuZ3VhZ2VdLm1vbnRoc1Nob3J0W2RdK1wiPC9zcGFuPlwiO3RoaXMucGlja2VyLmZpbmQoXCIuZGF0ZXBpY2tlci1tb250aHMgdGRcIikuaHRtbChjKX0sc2V0UmFuZ2U6ZnVuY3Rpb24oYil7YiYmYi5sZW5ndGg/dGhpcy5yYW5nZT1hLm1hcChiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlT2YoKX0pOmRlbGV0ZSB0aGlzLnJhbmdlLHRoaXMuZmlsbCgpfSxnZXRDbGFzc05hbWVzOmZ1bmN0aW9uKGIpe3ZhciBjPVtdLGY9dGhpcy52aWV3RGF0ZS5nZXRVVENGdWxsWWVhcigpLGc9dGhpcy52aWV3RGF0ZS5nZXRVVENNb250aCgpLGg9ZCgpO3JldHVybiBiLmdldFVUQ0Z1bGxZZWFyKCk8Znx8Yi5nZXRVVENGdWxsWWVhcigpPT09ZiYmYi5nZXRVVENNb250aCgpPGc/Yy5wdXNoKFwib2xkXCIpOihiLmdldFVUQ0Z1bGxZZWFyKCk+Znx8Yi5nZXRVVENGdWxsWWVhcigpPT09ZiYmYi5nZXRVVENNb250aCgpPmcpJiZjLnB1c2goXCJuZXdcIiksdGhpcy5mb2N1c0RhdGUmJmIudmFsdWVPZigpPT09dGhpcy5mb2N1c0RhdGUudmFsdWVPZigpJiZjLnB1c2goXCJmb2N1c2VkXCIpLHRoaXMuby50b2RheUhpZ2hsaWdodCYmZShiLGgpJiZjLnB1c2goXCJ0b2RheVwiKSx0aGlzLmRhdGVzLmNvbnRhaW5zKGIpIT09LTEmJmMucHVzaChcImFjdGl2ZVwiKSx0aGlzLmRhdGVXaXRoaW5SYW5nZShiKXx8Yy5wdXNoKFwiZGlzYWJsZWRcIiksdGhpcy5kYXRlSXNEaXNhYmxlZChiKSYmYy5wdXNoKFwiZGlzYWJsZWRcIixcImRpc2FibGVkLWRhdGVcIiksYS5pbkFycmF5KGIuZ2V0VVRDRGF5KCksdGhpcy5vLmRheXNPZldlZWtIaWdobGlnaHRlZCkhPT0tMSYmYy5wdXNoKFwiaGlnaGxpZ2h0ZWRcIiksdGhpcy5yYW5nZSYmKGI+dGhpcy5yYW5nZVswXSYmYjx0aGlzLnJhbmdlW3RoaXMucmFuZ2UubGVuZ3RoLTFdJiZjLnB1c2goXCJyYW5nZVwiKSxhLmluQXJyYXkoYi52YWx1ZU9mKCksdGhpcy5yYW5nZSkhPT0tMSYmYy5wdXNoKFwic2VsZWN0ZWRcIiksYi52YWx1ZU9mKCk9PT10aGlzLnJhbmdlWzBdJiZjLnB1c2goXCJyYW5nZS1zdGFydFwiKSxiLnZhbHVlT2YoKT09PXRoaXMucmFuZ2VbdGhpcy5yYW5nZS5sZW5ndGgtMV0mJmMucHVzaChcInJhbmdlLWVuZFwiKSksY30sX2ZpbGxfeWVhcnNWaWV3OmZ1bmN0aW9uKGMsZCxlLGYsZyxoLGkpe2Zvcih2YXIgaixrLGwsbT1cIlwiLG49ZS8xMCxvPXRoaXMucGlja2VyLmZpbmQoYykscD1NYXRoLmZsb29yKGYvZSkqZSxxPXArOSpuLHI9TWF0aC5mbG9vcih0aGlzLnZpZXdEYXRlLmdldEZ1bGxZZWFyKCkvbikqbixzPWEubWFwKHRoaXMuZGF0ZXMsZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguZmxvb3IoYS5nZXRVVENGdWxsWWVhcigpL24pKm59KSx0PXAtbjt0PD1xK247dCs9bilqPVtkXSxrPW51bGwsdD09PXAtbj9qLnB1c2goXCJvbGRcIik6dD09PXErbiYmai5wdXNoKFwibmV3XCIpLGEuaW5BcnJheSh0LHMpIT09LTEmJmoucHVzaChcImFjdGl2ZVwiKSwodDxnfHx0PmgpJiZqLnB1c2goXCJkaXNhYmxlZFwiKSx0PT09ciYmai5wdXNoKFwiZm9jdXNlZFwiKSxpIT09YS5ub29wJiYobD1pKG5ldyBEYXRlKHQsMCwxKSksbD09PWI/bD17fTpcImJvb2xlYW5cIj09dHlwZW9mIGw/bD17ZW5hYmxlZDpsfTpcInN0cmluZ1wiPT10eXBlb2YgbCYmKGw9e2NsYXNzZXM6bH0pLGwuZW5hYmxlZD09PSExJiZqLnB1c2goXCJkaXNhYmxlZFwiKSxsLmNsYXNzZXMmJihqPWouY29uY2F0KGwuY2xhc3Nlcy5zcGxpdCgvXFxzKy8pKSksbC50b29sdGlwJiYoaz1sLnRvb2x0aXApKSxtKz0nPHNwYW4gY2xhc3M9XCInK2ouam9pbihcIiBcIikrJ1wiJysoaz8nIHRpdGxlPVwiJytrKydcIic6XCJcIikrXCI+XCIrdCtcIjwvc3Bhbj5cIjtvLmZpbmQoXCIuZGF0ZXBpY2tlci1zd2l0Y2hcIikudGV4dChwK1wiLVwiK3EpLG8uZmluZChcInRkXCIpLmh0bWwobSl9LGZpbGw6ZnVuY3Rpb24oKXt2YXIgZCxlLGY9bmV3IERhdGUodGhpcy52aWV3RGF0ZSksZz1mLmdldFVUQ0Z1bGxZZWFyKCksaD1mLmdldFVUQ01vbnRoKCksaT10aGlzLm8uc3RhcnREYXRlIT09LSgxLzApP3RoaXMuby5zdGFydERhdGUuZ2V0VVRDRnVsbFllYXIoKTotKDEvMCksaj10aGlzLm8uc3RhcnREYXRlIT09LSgxLzApP3RoaXMuby5zdGFydERhdGUuZ2V0VVRDTW9udGgoKTotKDEvMCksaz10aGlzLm8uZW5kRGF0ZSE9PTEvMD90aGlzLm8uZW5kRGF0ZS5nZXRVVENGdWxsWWVhcigpOjEvMCxsPXRoaXMuby5lbmREYXRlIT09MS8wP3RoaXMuby5lbmREYXRlLmdldFVUQ01vbnRoKCk6MS8wLG09cVt0aGlzLm8ubGFuZ3VhZ2VdLnRvZGF5fHxxLmVuLnRvZGF5fHxcIlwiLG49cVt0aGlzLm8ubGFuZ3VhZ2VdLmNsZWFyfHxxLmVuLmNsZWFyfHxcIlwiLG89cVt0aGlzLm8ubGFuZ3VhZ2VdLnRpdGxlRm9ybWF0fHxxLmVuLnRpdGxlRm9ybWF0O2lmKCFpc05hTihnKSYmIWlzTmFOKGgpKXt0aGlzLnBpY2tlci5maW5kKFwiLmRhdGVwaWNrZXItZGF5cyAuZGF0ZXBpY2tlci1zd2l0Y2hcIikudGV4dChyLmZvcm1hdERhdGUoZixvLHRoaXMuby5sYW5ndWFnZSkpLHRoaXMucGlja2VyLmZpbmQoXCJ0Zm9vdCAudG9kYXlcIikudGV4dChtKS5jc3MoXCJkaXNwbGF5XCIsdGhpcy5vLnRvZGF5QnRuPT09ITB8fFwibGlua2VkXCI9PT10aGlzLm8udG9kYXlCdG4/XCJ0YWJsZS1jZWxsXCI6XCJub25lXCIpLHRoaXMucGlja2VyLmZpbmQoXCJ0Zm9vdCAuY2xlYXJcIikudGV4dChuKS5jc3MoXCJkaXNwbGF5XCIsdGhpcy5vLmNsZWFyQnRuPT09ITA/XCJ0YWJsZS1jZWxsXCI6XCJub25lXCIpLHRoaXMucGlja2VyLmZpbmQoXCJ0aGVhZCAuZGF0ZXBpY2tlci10aXRsZVwiKS50ZXh0KHRoaXMuby50aXRsZSkuY3NzKFwiZGlzcGxheVwiLFwic3RyaW5nXCI9PXR5cGVvZiB0aGlzLm8udGl0bGUmJlwiXCIhPT10aGlzLm8udGl0bGU/XCJ0YWJsZS1jZWxsXCI6XCJub25lXCIpLHRoaXMudXBkYXRlTmF2QXJyb3dzKCksdGhpcy5maWxsTW9udGhzKCk7dmFyIHA9YyhnLGgsMCkscz1wLmdldFVUQ0RhdGUoKTtwLnNldFVUQ0RhdGUocy0ocC5nZXRVVENEYXkoKS10aGlzLm8ud2Vla1N0YXJ0KzcpJTcpO3ZhciB0PW5ldyBEYXRlKHApO3AuZ2V0VVRDRnVsbFllYXIoKTwxMDAmJnQuc2V0VVRDRnVsbFllYXIocC5nZXRVVENGdWxsWWVhcigpKSx0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNDIpLHQ9dC52YWx1ZU9mKCk7Zm9yKHZhciB1LHYsdz1bXTtwLnZhbHVlT2YoKTx0Oyl7aWYodT1wLmdldFVUQ0RheSgpLHU9PT10aGlzLm8ud2Vla1N0YXJ0JiYody5wdXNoKFwiPHRyPlwiKSx0aGlzLm8uY2FsZW5kYXJXZWVrcykpe3ZhciB4PW5ldyBEYXRlKCtwKyh0aGlzLm8ud2Vla1N0YXJ0LXUtNyklNyo4NjRlNSkseT1uZXcgRGF0ZShOdW1iZXIoeCkrKDExLXguZ2V0VVRDRGF5KCkpJTcqODY0ZTUpLHo9bmV3IERhdGUoTnVtYmVyKHo9Yyh5LmdldFVUQ0Z1bGxZZWFyKCksMCwxKSkrKDExLXouZ2V0VVRDRGF5KCkpJTcqODY0ZTUpLEE9KHkteikvODY0ZTUvNysxO3cucHVzaCgnPHRkIGNsYXNzPVwiY3dcIj4nK0ErXCI8L3RkPlwiKX12PXRoaXMuZ2V0Q2xhc3NOYW1lcyhwKSx2LnB1c2goXCJkYXlcIik7dmFyIEI9cC5nZXRVVENEYXRlKCk7dGhpcy5vLmJlZm9yZVNob3dEYXkhPT1hLm5vb3AmJihlPXRoaXMuby5iZWZvcmVTaG93RGF5KHRoaXMuX3V0Y190b19sb2NhbChwKSksZT09PWI/ZT17fTpcImJvb2xlYW5cIj09dHlwZW9mIGU/ZT17ZW5hYmxlZDplfTpcInN0cmluZ1wiPT10eXBlb2YgZSYmKGU9e2NsYXNzZXM6ZX0pLGUuZW5hYmxlZD09PSExJiZ2LnB1c2goXCJkaXNhYmxlZFwiKSxlLmNsYXNzZXMmJih2PXYuY29uY2F0KGUuY2xhc3Nlcy5zcGxpdCgvXFxzKy8pKSksZS50b29sdGlwJiYoZD1lLnRvb2x0aXApLGUuY29udGVudCYmKEI9ZS5jb250ZW50KSksdj1hLmlzRnVuY3Rpb24oYS51bmlxdWVTb3J0KT9hLnVuaXF1ZVNvcnQodik6YS51bmlxdWUodiksdy5wdXNoKCc8dGQgY2xhc3M9XCInK3Yuam9pbihcIiBcIikrJ1wiJysoZD8nIHRpdGxlPVwiJytkKydcIic6XCJcIikrJyBkYXRhLWRhdGU9XCInK3AuZ2V0VGltZSgpLnRvU3RyaW5nKCkrJ1wiPicrQitcIjwvdGQ+XCIpLGQ9bnVsbCx1PT09dGhpcy5vLndlZWtFbmQmJncucHVzaChcIjwvdHI+XCIpLHAuc2V0VVRDRGF0ZShwLmdldFVUQ0RhdGUoKSsxKX10aGlzLnBpY2tlci5maW5kKFwiLmRhdGVwaWNrZXItZGF5cyB0Ym9keVwiKS5odG1sKHcuam9pbihcIlwiKSk7dmFyIEM9cVt0aGlzLm8ubGFuZ3VhZ2VdLm1vbnRoc1RpdGxlfHxxLmVuLm1vbnRoc1RpdGxlfHxcIk1vbnRoc1wiLEQ9dGhpcy5waWNrZXIuZmluZChcIi5kYXRlcGlja2VyLW1vbnRoc1wiKS5maW5kKFwiLmRhdGVwaWNrZXItc3dpdGNoXCIpLnRleHQodGhpcy5vLm1heFZpZXdNb2RlPDI/QzpnKS5lbmQoKS5maW5kKFwidGJvZHkgc3BhblwiKS5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtpZihhLmVhY2godGhpcy5kYXRlcyxmdW5jdGlvbihhLGIpe2IuZ2V0VVRDRnVsbFllYXIoKT09PWcmJkQuZXEoYi5nZXRVVENNb250aCgpKS5hZGRDbGFzcyhcImFjdGl2ZVwiKX0pLChnPGl8fGc+aykmJkQuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKSxnPT09aSYmRC5zbGljZSgwLGopLmFkZENsYXNzKFwiZGlzYWJsZWRcIiksZz09PWsmJkQuc2xpY2UobCsxKS5hZGRDbGFzcyhcImRpc2FibGVkXCIpLHRoaXMuby5iZWZvcmVTaG93TW9udGghPT1hLm5vb3Ape3ZhciBFPXRoaXM7YS5lYWNoKEQsZnVuY3Rpb24oYyxkKXt2YXIgZT1uZXcgRGF0ZShnLGMsMSksZj1FLm8uYmVmb3JlU2hvd01vbnRoKGUpO2Y9PT1iP2Y9e306XCJib29sZWFuXCI9PXR5cGVvZiBmP2Y9e2VuYWJsZWQ6Zn06XCJzdHJpbmdcIj09dHlwZW9mIGYmJihmPXtjbGFzc2VzOmZ9KSxmLmVuYWJsZWQhPT0hMXx8YShkKS5oYXNDbGFzcyhcImRpc2FibGVkXCIpfHxhKGQpLmFkZENsYXNzKFwiZGlzYWJsZWRcIiksZi5jbGFzc2VzJiZhKGQpLmFkZENsYXNzKGYuY2xhc3NlcyksZi50b29sdGlwJiZhKGQpLnByb3AoXCJ0aXRsZVwiLGYudG9vbHRpcCl9KX10aGlzLl9maWxsX3llYXJzVmlldyhcIi5kYXRlcGlja2VyLXllYXJzXCIsXCJ5ZWFyXCIsMTAsZyxpLGssdGhpcy5vLmJlZm9yZVNob3dZZWFyKSx0aGlzLl9maWxsX3llYXJzVmlldyhcIi5kYXRlcGlja2VyLWRlY2FkZXNcIixcImRlY2FkZVwiLDEwMCxnLGksayx0aGlzLm8uYmVmb3JlU2hvd0RlY2FkZSksdGhpcy5fZmlsbF95ZWFyc1ZpZXcoXCIuZGF0ZXBpY2tlci1jZW50dXJpZXNcIixcImNlbnR1cnlcIiwxZTMsZyxpLGssdGhpcy5vLmJlZm9yZVNob3dDZW50dXJ5KX19LHVwZGF0ZU5hdkFycm93czpmdW5jdGlvbigpe2lmKHRoaXMuX2FsbG93X3VwZGF0ZSl7dmFyIGEsYixjPW5ldyBEYXRlKHRoaXMudmlld0RhdGUpLGQ9Yy5nZXRVVENGdWxsWWVhcigpLGU9Yy5nZXRVVENNb250aCgpLGY9dGhpcy5vLnN0YXJ0RGF0ZSE9PS0oMS8wKT90aGlzLm8uc3RhcnREYXRlLmdldFVUQ0Z1bGxZZWFyKCk6LSgxLzApLGc9dGhpcy5vLnN0YXJ0RGF0ZSE9PS0oMS8wKT90aGlzLm8uc3RhcnREYXRlLmdldFVUQ01vbnRoKCk6LSgxLzApLGg9dGhpcy5vLmVuZERhdGUhPT0xLzA/dGhpcy5vLmVuZERhdGUuZ2V0VVRDRnVsbFllYXIoKToxLzAsaT10aGlzLm8uZW5kRGF0ZSE9PTEvMD90aGlzLm8uZW5kRGF0ZS5nZXRVVENNb250aCgpOjEvMCxqPTE7c3dpdGNoKHRoaXMudmlld01vZGUpe2Nhc2UgMDphPWQ8PWYmJmU8PWcsYj1kPj1oJiZlPj1pO2JyZWFrO2Nhc2UgNDpqKj0xMDtjYXNlIDM6aio9MTA7Y2FzZSAyOmoqPTEwO2Nhc2UgMTphPU1hdGguZmxvb3IoZC9qKSpqPD1mLGI9TWF0aC5mbG9vcihkL2opKmoraj49aH10aGlzLnBpY2tlci5maW5kKFwiLnByZXZcIikudG9nZ2xlQ2xhc3MoXCJkaXNhYmxlZFwiLGEpLHRoaXMucGlja2VyLmZpbmQoXCIubmV4dFwiKS50b2dnbGVDbGFzcyhcImRpc2FibGVkXCIsYil9fSxjbGljazpmdW5jdGlvbihiKXtiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKTt2YXIgZSxmLGcsaDtlPWEoYi50YXJnZXQpLGUuaGFzQ2xhc3MoXCJkYXRlcGlja2VyLXN3aXRjaFwiKSYmdGhpcy52aWV3TW9kZSE9PXRoaXMuby5tYXhWaWV3TW9kZSYmdGhpcy5zZXRWaWV3TW9kZSh0aGlzLnZpZXdNb2RlKzEpLGUuaGFzQ2xhc3MoXCJ0b2RheVwiKSYmIWUuaGFzQ2xhc3MoXCJkYXlcIikmJih0aGlzLnNldFZpZXdNb2RlKDApLHRoaXMuX3NldERhdGUoZCgpLFwibGlua2VkXCI9PT10aGlzLm8udG9kYXlCdG4/bnVsbDpcInZpZXdcIikpLGUuaGFzQ2xhc3MoXCJjbGVhclwiKSYmdGhpcy5jbGVhckRhdGVzKCksZS5oYXNDbGFzcyhcImRpc2FibGVkXCIpfHwoZS5oYXNDbGFzcyhcIm1vbnRoXCIpfHxlLmhhc0NsYXNzKFwieWVhclwiKXx8ZS5oYXNDbGFzcyhcImRlY2FkZVwiKXx8ZS5oYXNDbGFzcyhcImNlbnR1cnlcIikpJiYodGhpcy52aWV3RGF0ZS5zZXRVVENEYXRlKDEpLGY9MSwxPT09dGhpcy52aWV3TW9kZT8oaD1lLnBhcmVudCgpLmZpbmQoXCJzcGFuXCIpLmluZGV4KGUpLGc9dGhpcy52aWV3RGF0ZS5nZXRVVENGdWxsWWVhcigpLHRoaXMudmlld0RhdGUuc2V0VVRDTW9udGgoaCkpOihoPTAsZz1OdW1iZXIoZS50ZXh0KCkpLHRoaXMudmlld0RhdGUuc2V0VVRDRnVsbFllYXIoZykpLHRoaXMuX3RyaWdnZXIoci52aWV3TW9kZXNbdGhpcy52aWV3TW9kZS0xXS5lLHRoaXMudmlld0RhdGUpLHRoaXMudmlld01vZGU9PT10aGlzLm8ubWluVmlld01vZGU/dGhpcy5fc2V0RGF0ZShjKGcsaCxmKSk6KHRoaXMuc2V0Vmlld01vZGUodGhpcy52aWV3TW9kZS0xKSx0aGlzLmZpbGwoKSkpLHRoaXMucGlja2VyLmlzKFwiOnZpc2libGVcIikmJnRoaXMuX2ZvY3VzZWRfZnJvbSYmdGhpcy5fZm9jdXNlZF9mcm9tLmZvY3VzKCksZGVsZXRlIHRoaXMuX2ZvY3VzZWRfZnJvbX0sZGF5Q2VsbENsaWNrOmZ1bmN0aW9uKGIpe3ZhciBjPWEoYi5jdXJyZW50VGFyZ2V0KSxkPWMuZGF0YShcImRhdGVcIiksZT1uZXcgRGF0ZShkKTt0aGlzLm8udXBkYXRlVmlld0RhdGUmJihlLmdldFVUQ0Z1bGxZZWFyKCkhPT10aGlzLnZpZXdEYXRlLmdldFVUQ0Z1bGxZZWFyKCkmJnRoaXMuX3RyaWdnZXIoXCJjaGFuZ2VZZWFyXCIsdGhpcy52aWV3RGF0ZSksZS5nZXRVVENNb250aCgpIT09dGhpcy52aWV3RGF0ZS5nZXRVVENNb250aCgpJiZ0aGlzLl90cmlnZ2VyKFwiY2hhbmdlTW9udGhcIix0aGlzLnZpZXdEYXRlKSksdGhpcy5fc2V0RGF0ZShlKX0sbmF2QXJyb3dzQ2xpY2s6ZnVuY3Rpb24oYil7dmFyIGM9YShiLmN1cnJlbnRUYXJnZXQpLGQ9Yy5oYXNDbGFzcyhcInByZXZcIik/LTE6MTswIT09dGhpcy52aWV3TW9kZSYmKGQqPTEyKnIudmlld01vZGVzW3RoaXMudmlld01vZGVdLm5hdlN0ZXApLHRoaXMudmlld0RhdGU9dGhpcy5tb3ZlTW9udGgodGhpcy52aWV3RGF0ZSxkKSx0aGlzLl90cmlnZ2VyKHIudmlld01vZGVzW3RoaXMudmlld01vZGVdLmUsdGhpcy52aWV3RGF0ZSksdGhpcy5maWxsKCl9LF90b2dnbGVfbXVsdGlkYXRlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZGF0ZXMuY29udGFpbnMoYSk7aWYoYXx8dGhpcy5kYXRlcy5jbGVhcigpLGIhPT0tMT8odGhpcy5vLm11bHRpZGF0ZT09PSEwfHx0aGlzLm8ubXVsdGlkYXRlPjF8fHRoaXMuby50b2dnbGVBY3RpdmUpJiZ0aGlzLmRhdGVzLnJlbW92ZShiKTp0aGlzLm8ubXVsdGlkYXRlPT09ITE/KHRoaXMuZGF0ZXMuY2xlYXIoKSx0aGlzLmRhdGVzLnB1c2goYSkpOnRoaXMuZGF0ZXMucHVzaChhKSxcIm51bWJlclwiPT10eXBlb2YgdGhpcy5vLm11bHRpZGF0ZSlmb3IoO3RoaXMuZGF0ZXMubGVuZ3RoPnRoaXMuby5tdWx0aWRhdGU7KXRoaXMuZGF0ZXMucmVtb3ZlKDApfSxfc2V0RGF0ZTpmdW5jdGlvbihhLGIpe2ImJlwiZGF0ZVwiIT09Ynx8dGhpcy5fdG9nZ2xlX211bHRpZGF0ZShhJiZuZXcgRGF0ZShhKSksKCFiJiZ0aGlzLm8udXBkYXRlVmlld0RhdGV8fFwidmlld1wiPT09YikmJih0aGlzLnZpZXdEYXRlPWEmJm5ldyBEYXRlKGEpKSx0aGlzLmZpbGwoKSx0aGlzLnNldFZhbHVlKCksYiYmXCJ2aWV3XCI9PT1ifHx0aGlzLl90cmlnZ2VyKFwiY2hhbmdlRGF0ZVwiKSx0aGlzLmlucHV0RmllbGQudHJpZ2dlcihcImNoYW5nZVwiKSwhdGhpcy5vLmF1dG9jbG9zZXx8YiYmXCJkYXRlXCIhPT1ifHx0aGlzLmhpZGUoKX0sbW92ZURheTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBEYXRlKGEpO3JldHVybiBjLnNldFVUQ0RhdGUoYS5nZXRVVENEYXRlKCkrYiksY30sbW92ZVdlZWs6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3ZlRGF5KGEsNypiKX0sbW92ZU1vbnRoOmZ1bmN0aW9uKGEsYil7aWYoIWcoYSkpcmV0dXJuIHRoaXMuby5kZWZhdWx0Vmlld0RhdGU7aWYoIWIpcmV0dXJuIGE7dmFyIGMsZCxlPW5ldyBEYXRlKGEudmFsdWVPZigpKSxmPWUuZ2V0VVRDRGF0ZSgpLGg9ZS5nZXRVVENNb250aCgpLGk9TWF0aC5hYnMoYik7aWYoYj1iPjA/MTotMSwxPT09aSlkPWI9PT0tMT9mdW5jdGlvbigpe3JldHVybiBlLmdldFVUQ01vbnRoKCk9PT1ofTpmdW5jdGlvbigpe3JldHVybiBlLmdldFVUQ01vbnRoKCkhPT1jfSxjPWgrYixlLnNldFVUQ01vbnRoKGMpLGM9KGMrMTIpJTEyO2Vsc2V7Zm9yKHZhciBqPTA7ajxpO2orKyllPXRoaXMubW92ZU1vbnRoKGUsYik7Yz1lLmdldFVUQ01vbnRoKCksZS5zZXRVVENEYXRlKGYpLGQ9ZnVuY3Rpb24oKXtyZXR1cm4gYyE9PWUuZ2V0VVRDTW9udGgoKX19Zm9yKDtkKCk7KWUuc2V0VVRDRGF0ZSgtLWYpLGUuc2V0VVRDTW9udGgoYyk7cmV0dXJuIGV9LG1vdmVZZWFyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW92ZU1vbnRoKGEsMTIqYil9LG1vdmVBdmFpbGFibGVEYXRlOmZ1bmN0aW9uKGEsYixjKXtkb3tpZihhPXRoaXNbY10oYSxiKSwhdGhpcy5kYXRlV2l0aGluUmFuZ2UoYSkpcmV0dXJuITE7Yz1cIm1vdmVEYXlcIn13aGlsZSh0aGlzLmRhdGVJc0Rpc2FibGVkKGEpKTtyZXR1cm4gYX0sd2Vla09mRGF0ZUlzRGlzYWJsZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGEuaW5BcnJheShiLmdldFVUQ0RheSgpLHRoaXMuby5kYXlzT2ZXZWVrRGlzYWJsZWQpIT09LTF9LGRhdGVJc0Rpc2FibGVkOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLndlZWtPZkRhdGVJc0Rpc2FibGVkKGIpfHxhLmdyZXAodGhpcy5vLmRhdGVzRGlzYWJsZWQsZnVuY3Rpb24oYSl7cmV0dXJuIGUoYixhKX0pLmxlbmd0aD4wfSxkYXRlV2l0aGluUmFuZ2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGE+PXRoaXMuby5zdGFydERhdGUmJmE8PXRoaXMuby5lbmREYXRlfSxrZXlkb3duOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBpY2tlci5pcyhcIjp2aXNpYmxlXCIpKXJldHVybiB2b2lkKDQwIT09YS5rZXlDb2RlJiYyNyE9PWEua2V5Q29kZXx8KHRoaXMuc2hvdygpLGEuc3RvcFByb3BhZ2F0aW9uKCkpKTt2YXIgYixjLGQ9ITEsZT10aGlzLmZvY3VzRGF0ZXx8dGhpcy52aWV3RGF0ZTtzd2l0Y2goYS5rZXlDb2RlKXtjYXNlIDI3OnRoaXMuZm9jdXNEYXRlPyh0aGlzLmZvY3VzRGF0ZT1udWxsLHRoaXMudmlld0RhdGU9dGhpcy5kYXRlcy5nZXQoLTEpfHx0aGlzLnZpZXdEYXRlLHRoaXMuZmlsbCgpKTp0aGlzLmhpZGUoKSxhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKTticmVhaztjYXNlIDM3OmNhc2UgMzg6Y2FzZSAzOTpjYXNlIDQwOmlmKCF0aGlzLm8ua2V5Ym9hcmROYXZpZ2F0aW9ufHw3PT09dGhpcy5vLmRheXNPZldlZWtEaXNhYmxlZC5sZW5ndGgpYnJlYWs7Yj0zNz09PWEua2V5Q29kZXx8Mzg9PT1hLmtleUNvZGU/LTE6MSwwPT09dGhpcy52aWV3TW9kZT9hLmN0cmxLZXk/KGM9dGhpcy5tb3ZlQXZhaWxhYmxlRGF0ZShlLGIsXCJtb3ZlWWVhclwiKSxjJiZ0aGlzLl90cmlnZ2VyKFwiY2hhbmdlWWVhclwiLHRoaXMudmlld0RhdGUpKTphLnNoaWZ0S2V5PyhjPXRoaXMubW92ZUF2YWlsYWJsZURhdGUoZSxiLFwibW92ZU1vbnRoXCIpLGMmJnRoaXMuX3RyaWdnZXIoXCJjaGFuZ2VNb250aFwiLHRoaXMudmlld0RhdGUpKTozNz09PWEua2V5Q29kZXx8Mzk9PT1hLmtleUNvZGU/Yz10aGlzLm1vdmVBdmFpbGFibGVEYXRlKGUsYixcIm1vdmVEYXlcIik6dGhpcy53ZWVrT2ZEYXRlSXNEaXNhYmxlZChlKXx8KGM9dGhpcy5tb3ZlQXZhaWxhYmxlRGF0ZShlLGIsXCJtb3ZlV2Vla1wiKSk6MT09PXRoaXMudmlld01vZGU/KDM4IT09YS5rZXlDb2RlJiY0MCE9PWEua2V5Q29kZXx8KGIqPTQpLGM9dGhpcy5tb3ZlQXZhaWxhYmxlRGF0ZShlLGIsXCJtb3ZlTW9udGhcIikpOjI9PT10aGlzLnZpZXdNb2RlJiYoMzghPT1hLmtleUNvZGUmJjQwIT09YS5rZXlDb2RlfHwoYio9NCksYz10aGlzLm1vdmVBdmFpbGFibGVEYXRlKGUsYixcIm1vdmVZZWFyXCIpKSxjJiYodGhpcy5mb2N1c0RhdGU9dGhpcy52aWV3RGF0ZT1jLHRoaXMuc2V0VmFsdWUoKSx0aGlzLmZpbGwoKSxhLnByZXZlbnREZWZhdWx0KCkpO2JyZWFrO2Nhc2UgMTM6aWYoIXRoaXMuby5mb3JjZVBhcnNlKWJyZWFrO2U9dGhpcy5mb2N1c0RhdGV8fHRoaXMuZGF0ZXMuZ2V0KC0xKXx8dGhpcy52aWV3RGF0ZSx0aGlzLm8ua2V5Ym9hcmROYXZpZ2F0aW9uJiYodGhpcy5fdG9nZ2xlX211bHRpZGF0ZShlKSxkPSEwKSx0aGlzLmZvY3VzRGF0ZT1udWxsLHRoaXMudmlld0RhdGU9dGhpcy5kYXRlcy5nZXQoLTEpfHx0aGlzLnZpZXdEYXRlLHRoaXMuc2V0VmFsdWUoKSx0aGlzLmZpbGwoKSx0aGlzLnBpY2tlci5pcyhcIjp2aXNpYmxlXCIpJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5vLmF1dG9jbG9zZSYmdGhpcy5oaWRlKCkpO2JyZWFrO2Nhc2UgOTp0aGlzLmZvY3VzRGF0ZT1udWxsLHRoaXMudmlld0RhdGU9dGhpcy5kYXRlcy5nZXQoLTEpfHx0aGlzLnZpZXdEYXRlLHRoaXMuZmlsbCgpLHRoaXMuaGlkZSgpfWQmJih0aGlzLmRhdGVzLmxlbmd0aD90aGlzLl90cmlnZ2VyKFwiY2hhbmdlRGF0ZVwiKTp0aGlzLl90cmlnZ2VyKFwiY2xlYXJEYXRlXCIpLHRoaXMuaW5wdXRGaWVsZC50cmlnZ2VyKFwiY2hhbmdlXCIpKX0sc2V0Vmlld01vZGU6ZnVuY3Rpb24oYSl7dGhpcy52aWV3TW9kZT1hLHRoaXMucGlja2VyLmNoaWxkcmVuKFwiZGl2XCIpLmhpZGUoKS5maWx0ZXIoXCIuZGF0ZXBpY2tlci1cIityLnZpZXdNb2Rlc1t0aGlzLnZpZXdNb2RlXS5jbHNOYW1lKS5zaG93KCksdGhpcy51cGRhdGVOYXZBcnJvd3MoKSx0aGlzLl90cmlnZ2VyKFwiY2hhbmdlVmlld01vZGVcIixuZXcgRGF0ZSh0aGlzLnZpZXdEYXRlKSl9fTt2YXIgbD1mdW5jdGlvbihiLGMpe2EuZGF0YShiLFwiZGF0ZXBpY2tlclwiLHRoaXMpLHRoaXMuZWxlbWVudD1hKGIpLHRoaXMuaW5wdXRzPWEubWFwKGMuaW5wdXRzLGZ1bmN0aW9uKGEpe3JldHVybiBhLmpxdWVyeT9hWzBdOmF9KSxkZWxldGUgYy5pbnB1dHMsdGhpcy5rZWVwRW1wdHlWYWx1ZXM9Yy5rZWVwRW1wdHlWYWx1ZXMsZGVsZXRlIGMua2VlcEVtcHR5VmFsdWVzLG4uY2FsbChhKHRoaXMuaW5wdXRzKSxjKS5vbihcImNoYW5nZURhdGVcIixhLnByb3h5KHRoaXMuZGF0ZVVwZGF0ZWQsdGhpcykpLHRoaXMucGlja2Vycz1hLm1hcCh0aGlzLmlucHV0cyxmdW5jdGlvbihiKXtyZXR1cm4gYS5kYXRhKGIsXCJkYXRlcGlja2VyXCIpfSksdGhpcy51cGRhdGVEYXRlcygpfTtsLnByb3RvdHlwZT17dXBkYXRlRGF0ZXM6ZnVuY3Rpb24oKXt0aGlzLmRhdGVzPWEubWFwKHRoaXMucGlja2VycyxmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRVVENEYXRlKCl9KSx0aGlzLnVwZGF0ZVJhbmdlcygpfSx1cGRhdGVSYW5nZXM6ZnVuY3Rpb24oKXt2YXIgYj1hLm1hcCh0aGlzLmRhdGVzLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlT2YoKX0pO2EuZWFjaCh0aGlzLnBpY2tlcnMsZnVuY3Rpb24oYSxjKXtjLnNldFJhbmdlKGIpfSl9LGRhdGVVcGRhdGVkOmZ1bmN0aW9uKGMpe2lmKCF0aGlzLnVwZGF0aW5nKXt0aGlzLnVwZGF0aW5nPSEwO3ZhciBkPWEuZGF0YShjLnRhcmdldCxcImRhdGVwaWNrZXJcIik7aWYoZCE9PWIpe3ZhciBlPWQuZ2V0VVRDRGF0ZSgpLGY9dGhpcy5rZWVwRW1wdHlWYWx1ZXMsZz1hLmluQXJyYXkoYy50YXJnZXQsdGhpcy5pbnB1dHMpLGg9Zy0xLGk9ZysxLGo9dGhpcy5pbnB1dHMubGVuZ3RoO2lmKGchPT0tMSl7aWYoYS5lYWNoKHRoaXMucGlja2VycyxmdW5jdGlvbihhLGIpe2IuZ2V0VVRDRGF0ZSgpfHxiIT09ZCYmZnx8Yi5zZXRVVENEYXRlKGUpfSksZTx0aGlzLmRhdGVzW2hdKWZvcig7aD49MCYmZTx0aGlzLmRhdGVzW2hdOyl0aGlzLnBpY2tlcnNbaC0tXS5zZXRVVENEYXRlKGUpO2Vsc2UgaWYoZT50aGlzLmRhdGVzW2ldKWZvcig7aTxqJiZlPnRoaXMuZGF0ZXNbaV07KXRoaXMucGlja2Vyc1tpKytdLnNldFVUQ0RhdGUoZSk7dGhpcy51cGRhdGVEYXRlcygpLGRlbGV0ZSB0aGlzLnVwZGF0aW5nfX19fSxkZXN0cm95OmZ1bmN0aW9uKCl7YS5tYXAodGhpcy5waWNrZXJzLGZ1bmN0aW9uKGEpe2EuZGVzdHJveSgpfSksYSh0aGlzLmlucHV0cykub2ZmKFwiY2hhbmdlRGF0ZVwiLHRoaXMuZGF0ZVVwZGF0ZWQpLGRlbGV0ZSB0aGlzLmVsZW1lbnQuZGF0YSgpLmRhdGVwaWNrZXJ9LHJlbW92ZTpmKFwiZGVzdHJveVwiLFwiTWV0aG9kIGByZW1vdmVgIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDIuMC4gVXNlIGBkZXN0cm95YCBpbnN0ZWFkXCIpfTt2YXIgbT1hLmZuLmRhdGVwaWNrZXIsbj1mdW5jdGlvbihjKXt2YXIgZD1BcnJheS5hcHBseShudWxsLGFyZ3VtZW50cyk7ZC5zaGlmdCgpO3ZhciBlO2lmKHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEodGhpcyksZj1iLmRhdGEoXCJkYXRlcGlja2VyXCIpLGc9XCJvYmplY3RcIj09dHlwZW9mIGMmJmM7aWYoIWYpe3ZhciBqPWgodGhpcyxcImRhdGVcIiksbT1hLmV4dGVuZCh7fSxvLGosZyksbj1pKG0ubGFuZ3VhZ2UpLHA9YS5leHRlbmQoe30sbyxuLGosZyk7Yi5oYXNDbGFzcyhcImlucHV0LWRhdGVyYW5nZVwiKXx8cC5pbnB1dHM/KGEuZXh0ZW5kKHAse2lucHV0czpwLmlucHV0c3x8Yi5maW5kKFwiaW5wdXRcIikudG9BcnJheSgpfSksZj1uZXcgbCh0aGlzLHApKTpmPW5ldyBrKHRoaXMscCksYi5kYXRhKFwiZGF0ZXBpY2tlclwiLGYpfVwic3RyaW5nXCI9PXR5cGVvZiBjJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBmW2NdJiYoZT1mW2NdLmFwcGx5KGYsZCkpfSksZT09PWJ8fGUgaW5zdGFuY2VvZiBrfHxlIGluc3RhbmNlb2YgbClyZXR1cm4gdGhpcztpZih0aGlzLmxlbmd0aD4xKXRocm93IG5ldyBFcnJvcihcIlVzaW5nIG9ubHkgYWxsb3dlZCBmb3IgdGhlIGNvbGxlY3Rpb24gb2YgYSBzaW5nbGUgZWxlbWVudCAoXCIrYytcIiBmdW5jdGlvbilcIik7cmV0dXJuIGV9O2EuZm4uZGF0ZXBpY2tlcj1uO3ZhciBvPWEuZm4uZGF0ZXBpY2tlci5kZWZhdWx0cz17YXNzdW1lTmVhcmJ5WWVhcjohMSxhdXRvY2xvc2U6ITEsYmVmb3JlU2hvd0RheTphLm5vb3AsYmVmb3JlU2hvd01vbnRoOmEubm9vcCxiZWZvcmVTaG93WWVhcjphLm5vb3AsYmVmb3JlU2hvd0RlY2FkZTphLm5vb3AsYmVmb3JlU2hvd0NlbnR1cnk6YS5ub29wLGNhbGVuZGFyV2Vla3M6ITEsY2xlYXJCdG46ITEsdG9nZ2xlQWN0aXZlOiExLGRheXNPZldlZWtEaXNhYmxlZDpbXSxkYXlzT2ZXZWVrSGlnaGxpZ2h0ZWQ6W10sZGF0ZXNEaXNhYmxlZDpbXSxlbmREYXRlOjEvMCxmb3JjZVBhcnNlOiEwLGZvcm1hdDpcIm1tL2RkL3l5eXlcIixrZWVwRW1wdHlWYWx1ZXM6ITEsa2V5Ym9hcmROYXZpZ2F0aW9uOiEwLGxhbmd1YWdlOlwiZW5cIixtaW5WaWV3TW9kZTowLG1heFZpZXdNb2RlOjQsbXVsdGlkYXRlOiExLG11bHRpZGF0ZVNlcGFyYXRvcjpcIixcIixvcmllbnRhdGlvbjpcImF1dG9cIixydGw6ITEsc3RhcnREYXRlOi0oMS8wKSxzdGFydFZpZXc6MCx0b2RheUJ0bjohMSx0b2RheUhpZ2hsaWdodDohMSx1cGRhdGVWaWV3RGF0ZTohMCx3ZWVrU3RhcnQ6MCxkaXNhYmxlVG91Y2hLZXlib2FyZDohMSxlbmFibGVPblJlYWRvbmx5OiEwLHNob3dPbkZvY3VzOiEwLHpJbmRleE9mZnNldDoxMCxjb250YWluZXI6XCJib2R5XCIsaW1tZWRpYXRlVXBkYXRlczohMSx0aXRsZTpcIlwiLHRlbXBsYXRlczp7bGVmdEFycm93OlwiJiN4MDBBQjtcIixyaWdodEFycm93OlwiJiN4MDBCQjtcIn0sc2hvd1dlZWtEYXlzOiEwfSxwPWEuZm4uZGF0ZXBpY2tlci5sb2NhbGVfb3B0cz1bXCJmb3JtYXRcIixcInJ0bFwiLFwid2Vla1N0YXJ0XCJdO2EuZm4uZGF0ZXBpY2tlci5Db25zdHJ1Y3Rvcj1rO3ZhciBxPWEuZm4uZGF0ZXBpY2tlci5kYXRlcz17ZW46e2RheXM6W1wiU3VuZGF5XCIsXCJNb25kYXlcIixcIlR1ZXNkYXlcIixcIldlZG5lc2RheVwiLFwiVGh1cnNkYXlcIixcIkZyaWRheVwiLFwiU2F0dXJkYXlcIl0sZGF5c1Nob3J0OltcIlN1blwiLFwiTW9uXCIsXCJUdWVcIixcIldlZFwiLFwiVGh1XCIsXCJGcmlcIixcIlNhdFwiXSxkYXlzTWluOltcIlN1XCIsXCJNb1wiLFwiVHVcIixcIldlXCIsXCJUaFwiLFwiRnJcIixcIlNhXCJdLG1vbnRoczpbXCJKYW51YXJ5XCIsXCJGZWJydWFyeVwiLFwiTWFyY2hcIixcIkFwcmlsXCIsXCJNYXlcIixcIkp1bmVcIixcIkp1bHlcIixcIkF1Z3VzdFwiLFwiU2VwdGVtYmVyXCIsXCJPY3RvYmVyXCIsXCJOb3ZlbWJlclwiLFwiRGVjZW1iZXJcIl0sbW9udGhzU2hvcnQ6W1wiSmFuXCIsXCJGZWJcIixcIk1hclwiLFwiQXByXCIsXCJNYXlcIixcIkp1blwiLFwiSnVsXCIsXCJBdWdcIixcIlNlcFwiLFwiT2N0XCIsXCJOb3ZcIixcIkRlY1wiXSx0b2RheTpcIlRvZGF5XCIsY2xlYXI6XCJDbGVhclwiLHRpdGxlRm9ybWF0OlwiTU0geXl5eVwifX0scj17dmlld01vZGVzOlt7bmFtZXM6W1wiZGF5c1wiLFwibW9udGhcIl0sY2xzTmFtZTpcImRheXNcIixlOlwiY2hhbmdlTW9udGhcIn0se25hbWVzOltcIm1vbnRoc1wiLFwieWVhclwiXSxjbHNOYW1lOlwibW9udGhzXCIsZTpcImNoYW5nZVllYXJcIixuYXZTdGVwOjF9LHtuYW1lczpbXCJ5ZWFyc1wiLFwiZGVjYWRlXCJdLGNsc05hbWU6XCJ5ZWFyc1wiLGU6XCJjaGFuZ2VEZWNhZGVcIixuYXZTdGVwOjEwfSx7bmFtZXM6W1wiZGVjYWRlc1wiLFwiY2VudHVyeVwiXSxjbHNOYW1lOlwiZGVjYWRlc1wiLGU6XCJjaGFuZ2VDZW50dXJ5XCIsbmF2U3RlcDoxMDB9LHtuYW1lczpbXCJjZW50dXJpZXNcIixcIm1pbGxlbm5pdW1cIl0sY2xzTmFtZTpcImNlbnR1cmllc1wiLGU6XCJjaGFuZ2VNaWxsZW5uaXVtXCIsbmF2U3RlcDoxZTN9XSx2YWxpZFBhcnRzOi9kZD98REQ/fG1tP3xNTT98eXkoPzp5eSk/L2csbm9ucHVuY3R1YXRpb246L1teIC1cXC86LUBcXHU1ZTc0XFx1NjcwOFxcdTY1ZTVcXFstYHstflxcdFxcblxccl0rL2cscGFyc2VGb3JtYXQ6ZnVuY3Rpb24oYSl7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgYS50b1ZhbHVlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLnRvRGlzcGxheSlyZXR1cm4gYTt2YXIgYj1hLnJlcGxhY2UodGhpcy52YWxpZFBhcnRzLFwiXFwwXCIpLnNwbGl0KFwiXFwwXCIpLGM9YS5tYXRjaCh0aGlzLnZhbGlkUGFydHMpO2lmKCFifHwhYi5sZW5ndGh8fCFjfHwwPT09Yy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkYXRlIGZvcm1hdC5cIik7cmV0dXJue3NlcGFyYXRvcnM6YixwYXJ0czpjfX0scGFyc2VEYXRlOmZ1bmN0aW9uKGMsZSxmLGcpe2Z1bmN0aW9uIGgoYSxiKXtyZXR1cm4gYj09PSEwJiYoYj0xMCksYTwxMDAmJihhKz0yZTMsYT4obmV3IERhdGUpLmdldEZ1bGxZZWFyKCkrYiYmKGEtPTEwMCkpLGF9ZnVuY3Rpb24gaSgpe3ZhciBhPXRoaXMuc2xpY2UoMCxqW25dLmxlbmd0aCksYj1qW25dLnNsaWNlKDAsYS5sZW5ndGgpO3JldHVybiBhLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9aWYoIWMpcmV0dXJuIGI7aWYoYyBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIGM7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUmJihlPXIucGFyc2VGb3JtYXQoZSkpLGUudG9WYWx1ZSlyZXR1cm4gZS50b1ZhbHVlKGMsZSxmKTt2YXIgaixsLG0sbixvLHA9e2Q6XCJtb3ZlRGF5XCIsbTpcIm1vdmVNb250aFwiLHc6XCJtb3ZlV2Vla1wiLHk6XCJtb3ZlWWVhclwifSxzPXt5ZXN0ZXJkYXk6XCItMWRcIix0b2RheTpcIiswZFwiLHRvbW9ycm93OlwiKzFkXCJ9O2lmKGMgaW4gcyYmKGM9c1tjXSksL15bXFwtK11cXGQrW2Rtd3ldKFtcXHMsXStbXFwtK11cXGQrW2Rtd3ldKSokL2kudGVzdChjKSl7Zm9yKGo9Yy5tYXRjaCgvKFtcXC0rXVxcZCspKFtkbXd5XSkvZ2kpLGM9bmV3IERhdGUsbj0wO248ai5sZW5ndGg7bisrKWw9altuXS5tYXRjaCgvKFtcXC0rXVxcZCspKFtkbXd5XSkvaSksbT1OdW1iZXIobFsxXSksbz1wW2xbMl0udG9Mb3dlckNhc2UoKV0sYz1rLnByb3RvdHlwZVtvXShjLG0pO3JldHVybiBrLnByb3RvdHlwZS5femVyb191dGNfdGltZShjKX1qPWMmJmMubWF0Y2godGhpcy5ub25wdW5jdHVhdGlvbil8fFtdO3ZhciB0LHUsdj17fSx3PVtcInl5eXlcIixcInl5XCIsXCJNXCIsXCJNTVwiLFwibVwiLFwibW1cIixcImRcIixcImRkXCJdLHg9e3l5eXk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zZXRVVENGdWxsWWVhcihnP2goYixnKTpiKX0sbTpmdW5jdGlvbihhLGIpe2lmKGlzTmFOKGEpKXJldHVybiBhO2ZvcihiLT0xO2I8MDspYis9MTI7Zm9yKGIlPTEyLGEuc2V0VVRDTW9udGgoYik7YS5nZXRVVENNb250aCgpIT09YjspYS5zZXRVVENEYXRlKGEuZ2V0VVRDRGF0ZSgpLTEpO3JldHVybiBhfSxkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc2V0VVRDRGF0ZShiKX19O3gueXk9eC55eXl5LHguTT14Lk1NPXgubW09eC5tLHguZGQ9eC5kLGM9ZCgpO3ZhciB5PWUucGFydHMuc2xpY2UoKTtpZihqLmxlbmd0aCE9PXkubGVuZ3RoJiYoeT1hKHkpLmZpbHRlcihmdW5jdGlvbihiLGMpe3JldHVybiBhLmluQXJyYXkoYyx3KSE9PS0xfSkudG9BcnJheSgpKSxqLmxlbmd0aD09PXkubGVuZ3RoKXt2YXIgejtmb3Iobj0wLHo9eS5sZW5ndGg7bjx6O24rKyl7aWYodD1wYXJzZUludChqW25dLDEwKSxsPXlbbl0saXNOYU4odCkpc3dpdGNoKGwpe2Nhc2VcIk1NXCI6dT1hKHFbZl0ubW9udGhzKS5maWx0ZXIoaSksdD1hLmluQXJyYXkodVswXSxxW2ZdLm1vbnRocykrMTticmVhaztjYXNlXCJNXCI6dT1hKHFbZl0ubW9udGhzU2hvcnQpLmZpbHRlcihpKSx0PWEuaW5BcnJheSh1WzBdLHFbZl0ubW9udGhzU2hvcnQpKzF9dltsXT10fXZhciBBLEI7Zm9yKG49MDtuPHcubGVuZ3RoO24rKylCPXdbbl0sQiBpbiB2JiYhaXNOYU4odltCXSkmJihBPW5ldyBEYXRlKGMpLHhbQl0oQSx2W0JdKSxpc05hTihBKXx8KGM9QSkpfXJldHVybiBjfSxmb3JtYXREYXRlOmZ1bmN0aW9uKGIsYyxkKXtpZighYilyZXR1cm5cIlwiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBjJiYoYz1yLnBhcnNlRm9ybWF0KGMpKSxjLnRvRGlzcGxheSlyZXR1cm4gYy50b0Rpc3BsYXkoYixjLGQpO3ZhciBlPXtkOmIuZ2V0VVRDRGF0ZSgpLEQ6cVtkXS5kYXlzU2hvcnRbYi5nZXRVVENEYXkoKV0sREQ6cVtkXS5kYXlzW2IuZ2V0VVRDRGF5KCldLG06Yi5nZXRVVENNb250aCgpKzEsTTpxW2RdLm1vbnRoc1Nob3J0W2IuZ2V0VVRDTW9udGgoKV0sTU06cVtkXS5tb250aHNbYi5nZXRVVENNb250aCgpXSx5eTpiLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMikseXl5eTpiLmdldFVUQ0Z1bGxZZWFyKCl9O2UuZGQ9KGUuZDwxMD9cIjBcIjpcIlwiKStlLmQsZS5tbT0oZS5tPDEwP1wiMFwiOlwiXCIpK2UubSxiPVtdO2Zvcih2YXIgZj1hLmV4dGVuZChbXSxjLnNlcGFyYXRvcnMpLGc9MCxoPWMucGFydHMubGVuZ3RoO2c8PWg7ZysrKWYubGVuZ3RoJiZiLnB1c2goZi5zaGlmdCgpKSxiLnB1c2goZVtjLnBhcnRzW2ddXSk7cmV0dXJuIGIuam9pbihcIlwiKX0saGVhZFRlbXBsYXRlOic8dGhlYWQ+PHRyPjx0aCBjb2xzcGFuPVwiN1wiIGNsYXNzPVwiZGF0ZXBpY2tlci10aXRsZVwiPjwvdGg+PC90cj48dHI+PHRoIGNsYXNzPVwicHJldlwiPicrby50ZW1wbGF0ZXMubGVmdEFycm93Kyc8L3RoPjx0aCBjb2xzcGFuPVwiNVwiIGNsYXNzPVwiZGF0ZXBpY2tlci1zd2l0Y2hcIj48L3RoPjx0aCBjbGFzcz1cIm5leHRcIj4nK28udGVtcGxhdGVzLnJpZ2h0QXJyb3crXCI8L3RoPjwvdHI+PC90aGVhZD5cIixcbmNvbnRUZW1wbGF0ZTonPHRib2R5Pjx0cj48dGQgY29sc3Bhbj1cIjdcIj48L3RkPjwvdHI+PC90Ym9keT4nLGZvb3RUZW1wbGF0ZTonPHRmb290Pjx0cj48dGggY29sc3Bhbj1cIjdcIiBjbGFzcz1cInRvZGF5XCI+PC90aD48L3RyPjx0cj48dGggY29sc3Bhbj1cIjdcIiBjbGFzcz1cImNsZWFyXCI+PC90aD48L3RyPjwvdGZvb3Q+J307ci50ZW1wbGF0ZT0nPGRpdiBjbGFzcz1cImRhdGVwaWNrZXJcIj48ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1kYXlzXCI+PHRhYmxlIGNsYXNzPVwidGFibGUtY29uZGVuc2VkXCI+JytyLmhlYWRUZW1wbGF0ZStcIjx0Ym9keT48L3Rib2R5PlwiK3IuZm9vdFRlbXBsYXRlKyc8L3RhYmxlPjwvZGl2PjxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLW1vbnRoc1wiPjx0YWJsZSBjbGFzcz1cInRhYmxlLWNvbmRlbnNlZFwiPicrci5oZWFkVGVtcGxhdGUrci5jb250VGVtcGxhdGUrci5mb290VGVtcGxhdGUrJzwvdGFibGU+PC9kaXY+PGRpdiBjbGFzcz1cImRhdGVwaWNrZXIteWVhcnNcIj48dGFibGUgY2xhc3M9XCJ0YWJsZS1jb25kZW5zZWRcIj4nK3IuaGVhZFRlbXBsYXRlK3IuY29udFRlbXBsYXRlK3IuZm9vdFRlbXBsYXRlKyc8L3RhYmxlPjwvZGl2PjxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLWRlY2FkZXNcIj48dGFibGUgY2xhc3M9XCJ0YWJsZS1jb25kZW5zZWRcIj4nK3IuaGVhZFRlbXBsYXRlK3IuY29udFRlbXBsYXRlK3IuZm9vdFRlbXBsYXRlKyc8L3RhYmxlPjwvZGl2PjxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLWNlbnR1cmllc1wiPjx0YWJsZSBjbGFzcz1cInRhYmxlLWNvbmRlbnNlZFwiPicrci5oZWFkVGVtcGxhdGUrci5jb250VGVtcGxhdGUrci5mb290VGVtcGxhdGUrXCI8L3RhYmxlPjwvZGl2PjwvZGl2PlwiLGEuZm4uZGF0ZXBpY2tlci5EUEdsb2JhbD1yLGEuZm4uZGF0ZXBpY2tlci5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4uZGF0ZXBpY2tlcj1tLHRoaXN9LGEuZm4uZGF0ZXBpY2tlci52ZXJzaW9uPVwiMS43LjFcIixhLmZuLmRhdGVwaWNrZXIuZGVwcmVjYXRlZD1mdW5jdGlvbihhKXt2YXIgYj13aW5kb3cuY29uc29sZTtiJiZiLndhcm4mJmIud2FybihcIkRFUFJFQ0FURUQ6IFwiK2EpfSxhKGRvY3VtZW50KS5vbihcImZvY3VzLmRhdGVwaWNrZXIuZGF0YS1hcGkgY2xpY2suZGF0ZXBpY2tlci5kYXRhLWFwaVwiLCdbZGF0YS1wcm92aWRlPVwiZGF0ZXBpY2tlclwiXScsZnVuY3Rpb24oYil7dmFyIGM9YSh0aGlzKTtjLmRhdGEoXCJkYXRlcGlja2VyXCIpfHwoYi5wcmV2ZW50RGVmYXVsdCgpLG4uY2FsbChjLFwic2hvd1wiKSl9KSxhKGZ1bmN0aW9uKCl7bi5jYWxsKGEoJ1tkYXRhLXByb3ZpZGU9XCJkYXRlcGlja2VyLWlubGluZVwiXScpKX0pfSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1kYXRlcGlja2VyL2Rpc3QvanMvYm9vdHN0cmFwLWRhdGVwaWNrZXIubWluLmpzXG4vLyBtb2R1bGUgaWQgPSA1OVxuLy8gbW9kdWxlIGNodW5rcyA9IDEiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///59\n");
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_0__;var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/*! bootstrap3-wysihtml5-bower 2014-09-26 */\nvar wysihtml5, Base, Handlebars;Object.defineProperty && Object.getOwnPropertyDescriptor && Object.getOwnPropertyDescriptor(Element.prototype, \"textContent\") && !Object.getOwnPropertyDescriptor(Element.prototype, \"textContent\").get && !function () {\n var a = Object.getOwnPropertyDescriptor(Element.prototype, \"innerText\");Object.defineProperty(Element.prototype, \"textContent\", { get: function get() {\n return a.get.call(this);\n }, set: function set(b) {\n return a.set.call(this, b);\n } });\n}(), Array.isArray || (Array.isArray = function (a) {\n return \"[object Array]\" === Object.prototype.toString.call(a);\n}), wysihtml5 = { version: \"0.4.15\", commands: {}, dom: {}, quirks: {}, toolbar: {}, lang: {}, selection: {}, views: {}, INVISIBLE_SPACE: \"\", EMPTY_FUNCTION: function EMPTY_FUNCTION() {}, ELEMENT_NODE: 1, TEXT_NODE: 3, BACKSPACE_KEY: 8, ENTER_KEY: 13, ESCAPE_KEY: 27, SPACE_KEY: 32, DELETE_KEY: 46 }, function (a, b) {\n true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (a),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : b.rangy = a();\n}(function () {\n function a(a, b) {\n var c = _typeof(a[b]);return c == x || !(c != w || !a[b]) || \"unknown\" == c;\n }function b(a, b) {\n return !(_typeof(a[b]) != w || !a[b]);\n }function c(a, b) {\n return _typeof(a[b]) != y;\n }function d(a) {\n return function (b, c) {\n for (var d = c.length; d--;) {\n if (!a(b, c[d])) return !1;\n }return !0;\n };\n }function e(a) {\n return a && D(a, C) && F(a, B);\n }function f(a) {\n return b(a, \"body\") ? a.body : a.getElementsByTagName(\"body\")[0];\n }function g(c) {\n b(window, \"console\") && a(window.console, \"log\") && window.console.log(c);\n }function h(a, b) {\n b ? window.alert(a) : g(a);\n }function i(a) {\n H.initialized = !0, H.supported = !1, h(\"Rangy is not supported on this page in your browser. Reason: \" + a, H.config.alertOnFail);\n }function j(a) {\n h(\"Rangy warning: \" + a, H.config.alertOnWarn);\n }function k(a) {\n return a.message || a.description || a + \"\";\n }function l() {\n var b, c, d, h, j, l, m, o, p;if (!H.initialized) {\n if (c = !1, d = !1, a(document, \"createRange\") && (b = document.createRange(), D(b, A) && F(b, z) && (c = !0)), h = f(document), !h || \"body\" != h.nodeName.toLowerCase()) return i(\"No body element found\"), void 0;if (h && a(h, \"createTextRange\") && (b = h.createTextRange(), e(b) && (d = !0)), !c && !d) return i(\"Neither Range nor TextRange are available\"), void 0;H.initialized = !0, H.features = { implementsDomRange: c, implementsTextRange: d };for (m in G) {\n (j = G[m]) instanceof n && j.init(j, H);\n }for (o = 0, p = s.length; p > o; ++o) {\n try {\n s[o](H);\n } catch (q) {\n l = \"Rangy init listener threw an exception. Continuing. Detail: \" + k(q), g(l);\n }\n }\n }\n }function m(a) {\n a = a || window, l();for (var b = 0, c = t.length; c > b; ++b) {\n t[b](a);\n }\n }function n(a, b, c) {\n this.name = a, this.dependencies = b, this.initialized = !1, this.supported = !1, this.initializer = c;\n }function o(a, b, c, d) {\n var e = new n(b, c, function (a) {\n if (!a.initialized) {\n a.initialized = !0;try {\n d(H, a), a.supported = !0;\n } catch (c) {\n var e = \"Module '\" + b + \"' failed to load: \" + k(c);g(e);\n }\n }\n });G[b] = e;\n }function p() {}function q() {}var r,\n s,\n t,\n u,\n v,\n w = \"object\",\n x = \"function\",\n y = \"undefined\",\n z = [\"startContainer\", \"startOffset\", \"endContainer\", \"endOffset\", \"collapsed\", \"commonAncestorContainer\"],\n A = [\"setStart\", \"setStartBefore\", \"setStartAfter\", \"setEnd\", \"setEndBefore\", \"setEndAfter\", \"collapse\", \"selectNode\", \"selectNodeContents\", \"compareBoundaryPoints\", \"deleteContents\", \"extractContents\", \"cloneContents\", \"insertNode\", \"surroundContents\", \"cloneRange\", \"toString\", \"detach\"],\n B = [\"boundingHeight\", \"boundingLeft\", \"boundingTop\", \"boundingWidth\", \"htmlText\", \"text\"],\n C = [\"collapse\", \"compareEndPoints\", \"duplicate\", \"moveToElementText\", \"parentElement\", \"select\", \"setEndPoint\", \"getBoundingClientRect\"],\n D = d(a),\n E = d(b),\n F = d(c),\n G = {},\n H = { version: \"1.3alpha.20140804\", initialized: !1, supported: !0, util: { isHostMethod: a, isHostObject: b, isHostProperty: c, areHostMethods: D, areHostObjects: E, areHostProperties: F, isTextRange: e, getBody: f }, features: {}, modules: G, config: { alertOnFail: !0, alertOnWarn: !1, preferTextRange: !1, autoInitialize: (typeof rangyAutoInitialize === \"undefined\" ? \"undefined\" : _typeof(rangyAutoInitialize)) == y ? !0 : rangyAutoInitialize } };return H.fail = i, H.warn = j, {}.hasOwnProperty ? H.util.extend = function (a, b, c) {\n var d, e, f;for (f in b) {\n b.hasOwnProperty(f) && (d = a[f], e = b[f], c && null !== d && \"object\" == (typeof d === \"undefined\" ? \"undefined\" : _typeof(d)) && null !== e && \"object\" == (typeof e === \"undefined\" ? \"undefined\" : _typeof(e)) && H.util.extend(d, e, !0), a[f] = e);\n }return b.hasOwnProperty(\"toString\") && (a.toString = b.toString), a;\n } : i(\"hasOwnProperty not supported\"), function () {\n var a,\n b,\n c = document.createElement(\"div\");c.appendChild(document.createElement(\"span\")), a = [].slice;try {\n 1 == a.call(c.childNodes, 0)[0].nodeType && (b = function b(_b) {\n return a.call(_b, 0);\n });\n } catch (d) {}b || (b = function b(a) {\n var b,\n c,\n d = [];for (b = 0, c = a.length; c > b; ++b) {\n d[b] = a[b];\n }return d;\n }), H.util.toArray = b;\n }(), a(document, \"addEventListener\") ? r = function r(a, b, c) {\n a.addEventListener(b, c, !1);\n } : a(document, \"attachEvent\") ? r = function r(a, b, c) {\n a.attachEvent(\"on\" + b, c);\n } : i(\"Document does not have required addEventListener or attachEvent method\"), H.util.addListener = r, s = [], H.init = l, H.addInitListener = function (a) {\n H.initialized ? a(H) : s.push(a);\n }, t = [], H.addShimListener = function (a) {\n t.push(a);\n }, H.shim = H.createMissingNativeApi = m, n.prototype = { init: function init() {\n var a,\n b,\n c,\n d,\n e = this.dependencies || [];for (a = 0, b = e.length; b > a; ++a) {\n if (d = e[a], c = G[d], !(c && c instanceof n)) throw Error(\"required module '\" + d + \"' not found\");if (c.init(), !c.supported) throw Error(\"required module '\" + d + \"' not supported\");\n }this.initializer(this);\n }, fail: function fail(a) {\n throw this.initialized = !0, this.supported = !1, Error(\"Module '\" + this.name + \"' failed to load: \" + a);\n }, warn: function warn(a) {\n H.warn(\"Module \" + this.name + \": \" + a);\n }, deprecationNotice: function deprecationNotice(a, b) {\n H.warn(\"DEPRECATED: \" + a + \" in module \" + this.name + \"is deprecated. Please use \" + b + \" instead\");\n }, createError: function createError(a) {\n return Error(\"Error in Rangy \" + this.name + \" module: \" + a);\n } }, H.createModule = function (a) {\n var b, c, d;2 == arguments.length ? (b = arguments[1], c = []) : (b = arguments[2], c = arguments[1]), d = o(!1, a, c, b), H.initialized && d.init();\n }, H.createCoreModule = function (a, b, c) {\n o(!0, a, b, c);\n }, H.RangePrototype = p, H.rangePrototype = new p(), H.selectionPrototype = new q(), u = !1, v = function v() {\n u || (u = !0, !H.initialized && H.config.autoInitialize && l());\n }, (typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) == y ? (i(\"No window found\"), void 0) : (typeof document === \"undefined\" ? \"undefined\" : _typeof(document)) == y ? (i(\"No document found\"), void 0) : (a(document, \"addEventListener\") && document.addEventListener(\"DOMContentLoaded\", v, !1), r(window, \"load\", v), H.createCoreModule(\"DomUtil\", [], function (a, b) {\n function c(a) {\n var b;return _typeof(a.namespaceURI) == I || null === (b = a.namespaceURI) || \"http://www.w3.org/1999/xhtml\" == b;\n }function d(a) {\n var b = a.parentNode;return 1 == b.nodeType ? b : null;\n }function e(a) {\n for (var b = 0; a = a.previousSibling;) {\n ++b;\n }return b;\n }function f(a) {\n switch (a.nodeType) {case 7:case 10:\n return 0;case 3:case 8:\n return a.length;default:\n return a.childNodes.length;}\n }function g(a, b) {\n var c,\n d = [];for (c = a; c; c = c.parentNode) {\n d.push(c);\n }for (c = b; c; c = c.parentNode) {\n if (F(d, c)) return c;\n }return null;\n }function h(a, b, c) {\n for (var d = c ? b : b.parentNode; d;) {\n if (d === a) return !0;d = d.parentNode;\n }return !1;\n }function i(a, b) {\n return h(a, b, !0);\n }function j(a, b, c) {\n for (var d, e = c ? a : a.parentNode; e;) {\n if (d = e.parentNode, d === b) return e;e = d;\n }return null;\n }function k(a) {\n var b = a.nodeType;return 3 == b || 4 == b || 8 == b;\n }function l(a) {\n if (!a) return !1;var b = a.nodeType;return 3 == b || 8 == b;\n }function m(a, b) {\n var c = b.nextSibling,\n d = b.parentNode;return c ? d.insertBefore(a, c) : d.appendChild(a), a;\n }function n(a, b, c) {\n var d,\n f,\n g = a.cloneNode(!1);if (g.deleteData(0, b), a.deleteData(b, a.length - b), m(g, a), c) for (d = 0; f = c[d++];) {\n f.node == a && f.offset > b ? (f.node = g, f.offset -= b) : f.node == a.parentNode && f.offset > e(a) && ++f.offset;\n }return g;\n }function o(a) {\n if (9 == a.nodeType) return a;if (_typeof(a.ownerDocument) != I) return a.ownerDocument;if (_typeof(a.document) != I) return a.document;if (a.parentNode) return o(a.parentNode);throw b.createError(\"getDocument: no document found for node\");\n }function p(a) {\n var c = o(a);if (_typeof(c.defaultView) != I) return c.defaultView;if (_typeof(c.parentWindow) != I) return c.parentWindow;throw b.createError(\"Cannot get a window object for node\");\n }function q(a) {\n if (_typeof(a.contentDocument) != I) return a.contentDocument;if (_typeof(a.contentWindow) != I) return a.contentWindow.document;throw b.createError(\"getIframeDocument: No Document object found for iframe element\");\n }function r(a) {\n if (_typeof(a.contentWindow) != I) return a.contentWindow;if (_typeof(a.contentDocument) != I) return a.contentDocument.defaultView;throw b.createError(\"getIframeWindow: No Window object found for iframe element\");\n }function s(a) {\n return a && J.isHostMethod(a, \"setTimeout\") && J.isHostObject(a, \"document\");\n }function t(a, b, c) {\n var d;if (a ? J.isHostProperty(a, \"nodeType\") ? d = 1 == a.nodeType && \"iframe\" == a.tagName.toLowerCase() ? q(a) : o(a) : s(a) && (d = a.document) : d = document, !d) throw b.createError(c + \"(): Parameter must be a Window object or DOM node\");return d;\n }function u(a) {\n for (var b; b = a.parentNode;) {\n a = b;\n }return a;\n }function v(a, c, d, f) {\n var h, i, k, l, m;if (a == d) return c === f ? 0 : f > c ? -1 : 1;if (h = j(d, a, !0)) return c <= e(h) ? -1 : 1;if (h = j(a, d, !0)) return e(h) < f ? -1 : 1;if (i = g(a, d), !i) throw Error(\"comparePoints error: nodes have no common ancestor\");if (k = a === i ? i : j(a, i, !0), l = d === i ? i : j(d, i, !0), k === l) throw b.createError(\"comparePoints got to case 4 and childA and childB are the same!\");for (m = i.firstChild; m;) {\n if (m === k) return -1;if (m === l) return 1;m = m.nextSibling;\n }\n }function w(a) {\n var b;try {\n return b = a.parentNode, !1;\n } catch (c) {\n return !0;\n }\n }function x(a) {\n if (!a) return \"[No node]\";if (G && w(a)) return \"[Broken node]\";if (k(a)) return '\"' + a.data + '\"';if (1 == a.nodeType) {\n var b = a.id ? ' id=\"' + a.id + '\"' : \"\";return \"<\" + a.nodeName + b + \">[index:\" + e(a) + \",length:\" + a.childNodes.length + \"][\" + (a.innerHTML || \"[innerHTML not supported]\").slice(0, 25) + \"]\";\n }return a.nodeName;\n }function y(a) {\n for (var b, c = o(a).createDocumentFragment(); b = a.firstChild;) {\n c.appendChild(b);\n }return c;\n }function z(a) {\n this.root = a, this._next = a;\n }function A(a) {\n return new z(a);\n }function B(a, b) {\n this.node = a, this.offset = b;\n }function C(a) {\n this.code = this[a], this.codeName = a, this.message = \"DOMException: \" + this.codeName;\n }var D,\n E,\n F,\n G,\n H,\n I = \"undefined\",\n J = a.util;J.areHostMethods(document, [\"createDocumentFragment\", \"createElement\", \"createTextNode\"]) || b.fail(\"document missing a Node creation method\"), J.isHostMethod(document, \"getElementsByTagName\") || b.fail(\"document missing getElementsByTagName method\"), D = document.createElement(\"div\"), J.areHostMethods(D, [\"insertBefore\", \"appendChild\", \"cloneNode\"] || !J.areHostObjects(D, [\"previousSibling\", \"nextSibling\", \"childNodes\", \"parentNode\"])) || b.fail(\"Incomplete Element implementation\"), J.isHostProperty(D, \"innerHTML\") || b.fail(\"Element is missing innerHTML property\"), E = document.createTextNode(\"test\"), J.areHostMethods(E, [\"splitText\", \"deleteData\", \"insertData\", \"appendData\", \"cloneNode\"] || !J.areHostObjects(D, [\"previousSibling\", \"nextSibling\", \"childNodes\", \"parentNode\"]) || !J.areHostProperties(E, [\"data\"])) || b.fail(\"Incomplete Text Node implementation\"), F = function F(a, b) {\n for (var c = a.length; c--;) {\n if (a[c] === b) return !0;\n }return !1;\n }, G = !1, function () {\n var b,\n c = document.createElement(\"b\");c.innerHTML = \"1\", b = c.firstChild, c.innerHTML = \"<br>\", G = w(b), a.features.crashyTextNodes = G;\n }(), _typeof(window.getComputedStyle) != I ? H = function H(a, b) {\n return p(a).getComputedStyle(a, null)[b];\n } : _typeof(document.documentElement.currentStyle) != I ? H = function H(a, b) {\n return a.currentStyle[b];\n } : b.fail(\"No means of obtaining computed style properties found\"), z.prototype = { _current: null, hasNext: function hasNext() {\n return !!this._next;\n }, next: function next() {\n var a,\n b,\n c = this._current = this._next;if (this._current) if (a = c.firstChild, a) this._next = a;else {\n for (b = null; c !== this.root && !(b = c.nextSibling);) {\n c = c.parentNode;\n }this._next = b;\n }return this._current;\n }, detach: function detach() {\n this._current = this._next = this.root = null;\n } }, B.prototype = { equals: function equals(a) {\n return !!a && this.node === a.node && this.offset == a.offset;\n }, inspect: function inspect() {\n return \"[DomPosition(\" + x(this.node) + \":\" + this.offset + \")]\";\n }, toString: function toString() {\n return this.inspect();\n } }, C.prototype = { INDEX_SIZE_ERR: 1, HIERARCHY_REQUEST_ERR: 3, WRONG_DOCUMENT_ERR: 4, NO_MODIFICATION_ALLOWED_ERR: 7, NOT_FOUND_ERR: 8, NOT_SUPPORTED_ERR: 9, INVALID_STATE_ERR: 11, INVALID_NODE_TYPE_ERR: 24 }, C.prototype.toString = function () {\n return this.message;\n }, a.dom = { arrayContains: F, isHtmlNamespace: c, parentElement: d, getNodeIndex: e, getNodeLength: f, getCommonAncestor: g, isAncestorOf: h, isOrIsAncestorOf: i, getClosestAncestorIn: j, isCharacterDataNode: k, isTextOrCommentNode: l, insertAfter: m, splitDataNode: n, getDocument: o, getWindow: p, getIframeWindow: r, getIframeDocument: q, getBody: J.getBody, isWindow: s, getContentDocument: t, getRootContainer: u, comparePoints: v, isBrokenNode: w, inspectNode: x, getComputedStyleProperty: H, fragmentFromNodeChildren: y, createIterator: A, DomPosition: B }, a.DOMException = C;\n }), H.createCoreModule(\"DomRange\", [\"DomUtil\"], function (a) {\n function b(a, b) {\n return 3 != a.nodeType && (gb(a, b.startContainer) || gb(a, b.endContainer));\n }function c(a) {\n return a.document || hb(a.startContainer);\n }function d(a) {\n return new cb(a.parentNode, fb(a));\n }function e(a) {\n return new cb(a.parentNode, fb(a) + 1);\n }function f(a, b, c) {\n var d = 11 == a.nodeType ? a.firstChild : a;return eb(b) ? c == b.length ? ab.insertAfter(a, b) : b.parentNode.insertBefore(a, 0 == c ? b : jb(b, c)) : c >= b.childNodes.length ? b.appendChild(a) : b.insertBefore(a, b.childNodes[c]), d;\n }function g(a, b, d) {\n if (y(a), y(b), c(b) != c(a)) throw new db(\"WRONG_DOCUMENT_ERR\");var e = ib(a.startContainer, a.startOffset, b.endContainer, b.endOffset),\n f = ib(a.endContainer, a.endOffset, b.startContainer, b.startOffset);return d ? 0 >= e && f >= 0 : 0 > e && f > 0;\n }function h(a) {\n var b, d, e, f;for (e = c(a.range).createDocumentFragment(); d = a.next();) {\n if (b = a.isPartiallySelectedSubtree(), d = d.cloneNode(!b), b && (f = a.getSubtreeIterator(), d.appendChild(h(f)), f.detach()), 10 == d.nodeType) throw new db(\"HIERARCHY_REQUEST_ERR\");e.appendChild(d);\n }return e;\n }function i(a, b, c) {\n var d, e, f, g;for (c = c || { stop: !1 }; f = a.next();) {\n if (a.isPartiallySelectedSubtree()) {\n if (b(f) === !1) return c.stop = !0, void 0;if (g = a.getSubtreeIterator(), i(g, b, c), g.detach(), c.stop) return;\n } else for (d = ab.createIterator(f); e = d.next();) {\n if (b(e) === !1) return c.stop = !0, void 0;\n }\n }\n }function j(a) {\n for (var b; a.next();) {\n a.isPartiallySelectedSubtree() ? (b = a.getSubtreeIterator(), j(b), b.detach()) : a.remove();\n }\n }function k(a) {\n for (var b, d, e = c(a.range).createDocumentFragment(); b = a.next();) {\n if (a.isPartiallySelectedSubtree() ? (b = b.cloneNode(!1), d = a.getSubtreeIterator(), b.appendChild(k(d)), d.detach()) : a.remove(), 10 == b.nodeType) throw new db(\"HIERARCHY_REQUEST_ERR\");e.appendChild(b);\n }return e;\n }function l(a, b, c) {\n var d,\n e,\n f = !(!b || !b.length),\n g = !!c;return f && (d = RegExp(\"^(\" + b.join(\"|\") + \")$\")), e = [], i(new n(a, !1), function (b) {\n var h, i;(!f || d.test(b.nodeType)) && (!g || c(b)) && (h = a.startContainer, b == h && eb(h) && a.startOffset == h.length || (i = a.endContainer, b == i && eb(i) && 0 == a.endOffset || e.push(b)));\n }), e;\n }function m(a) {\n var b = void 0 === a.getName ? \"Range\" : a.getName();return \"[\" + b + \"(\" + ab.inspectNode(a.startContainer) + \":\" + a.startOffset + \", \" + ab.inspectNode(a.endContainer) + \":\" + a.endOffset + \")]\";\n }function n(a, b) {\n if (this.range = a, this.clonePartiallySelectedTextNodes = b, !a.collapsed) {\n this.sc = a.startContainer, this.so = a.startOffset, this.ec = a.endContainer, this.eo = a.endOffset;var c = a.commonAncestorContainer;this.sc === this.ec && eb(this.sc) ? (this.isSingleCharacterDataNode = !0, this._first = this._last = this._next = this.sc) : (this._first = this._next = this.sc !== c || eb(this.sc) ? kb(this.sc, c, !0) : this.sc.childNodes[this.so], this._last = this.ec !== c || eb(this.ec) ? kb(this.ec, c, !0) : this.ec.childNodes[this.eo - 1]);\n }\n }function o(a) {\n return function (b, c) {\n for (var d, e = c ? b : b.parentNode; e;) {\n if (d = e.nodeType, mb(a, d)) return e;e = e.parentNode;\n }return null;\n };\n }function p(a, b) {\n if (P(a, b)) throw new db(\"INVALID_NODE_TYPE_ERR\");\n }function q(a, b) {\n if (!mb(b, a.nodeType)) throw new db(\"INVALID_NODE_TYPE_ERR\");\n }function r(a, b) {\n if (0 > b || b > (eb(a) ? a.length : a.childNodes.length)) throw new db(\"INDEX_SIZE_ERR\");\n }function s(a, b) {\n if (N(a, !0) !== N(b, !0)) throw new db(\"WRONG_DOCUMENT_ERR\");\n }function t(a) {\n if (O(a, !0)) throw new db(\"NO_MODIFICATION_ALLOWED_ERR\");\n }function u(a, b) {\n if (!a) throw new db(b);\n }function v(a) {\n return ob && ab.isBrokenNode(a) || !mb(J, a.nodeType) && !N(a, !0);\n }function w(a, b) {\n return b <= (eb(a) ? a.length : a.childNodes.length);\n }function x(a) {\n return !!a.startContainer && !!a.endContainer && !v(a.startContainer) && !v(a.endContainer) && w(a.startContainer, a.startOffset) && w(a.endContainer, a.endOffset);\n }function y(a) {\n if (!x(a)) throw Error(\"Range error: Range is no longer valid after DOM mutation (\" + a.inspect() + \")\");\n }function z(a, b) {\n var c, d, e, f, g;y(a), c = a.startContainer, d = a.startOffset, e = a.endContainer, f = a.endOffset, g = c === e, eb(e) && f > 0 && f < e.length && jb(e, f, b), eb(c) && d > 0 && d < c.length && (c = jb(c, d, b), g ? (f -= d, e = c) : e == c.parentNode && f >= fb(c) && f++, d = 0), a.setStartAndEnd(c, d, e, f);\n }function A(a) {\n y(a);var b = a.commonAncestorContainer.parentNode.cloneNode(!1);return b.appendChild(a.cloneContents()), b.innerHTML;\n }function B(a) {\n a.START_TO_START = U, a.START_TO_END = V, a.END_TO_END = W, a.END_TO_START = X, a.NODE_BEFORE = Y, a.NODE_AFTER = Z, a.NODE_BEFORE_AND_AFTER = $, a.NODE_INSIDE = _;\n }function C(a) {\n B(a), B(a.prototype);\n }function D(a, b) {\n return function () {\n var c, d, f, g, h, j, k;return y(this), c = this.startContainer, d = this.startOffset, f = this.commonAncestorContainer, g = new n(this, !0), c !== f && (h = kb(c, f, !0), j = e(h), c = j.node, d = j.offset), i(g, t), g.reset(), k = a(g), g.detach(), b(this, c, d, c, d), k;\n };\n }function E(c, f) {\n function g(a, b) {\n return function (c) {\n q(c, I), q(nb(c), J);var f = (a ? d : e)(c);(b ? h : i)(this, f.node, f.offset);\n };\n }function h(a, b, c) {\n var d = a.endContainer,\n e = a.endOffset;(b !== a.startContainer || c !== a.startOffset) && ((nb(b) != nb(d) || 1 == ib(b, c, d, e)) && (d = b, e = c), f(a, b, c, d, e));\n }function i(a, b, c) {\n var d = a.startContainer,\n e = a.startOffset;(b !== a.endContainer || c !== a.endOffset) && ((nb(b) != nb(d) || -1 == ib(b, c, d, e)) && (d = b, e = c), f(a, d, e, b, c));\n }var l = function l() {};l.prototype = a.rangePrototype, c.prototype = new l(), bb.extend(c.prototype, { setStart: function setStart(a, b) {\n p(a, !0), r(a, b), h(this, a, b);\n }, setEnd: function setEnd(a, b) {\n p(a, !0), r(a, b), i(this, a, b);\n }, setStartAndEnd: function setStartAndEnd() {\n var a = arguments,\n b = a[0],\n c = a[1],\n d = b,\n e = c;switch (a.length) {case 3:\n e = a[2];break;case 4:\n d = a[2], e = a[3];}f(this, b, c, d, e);\n }, setBoundary: function setBoundary(a, b, c) {\n this[\"set\" + (c ? \"Start\" : \"End\")](a, b);\n }, setStartBefore: g(!0, !0), setStartAfter: g(!1, !0), setEndBefore: g(!0, !1), setEndAfter: g(!1, !1), collapse: function collapse(a) {\n y(this), a ? f(this, this.startContainer, this.startOffset, this.startContainer, this.startOffset) : f(this, this.endContainer, this.endOffset, this.endContainer, this.endOffset);\n }, selectNodeContents: function selectNodeContents(a) {\n p(a, !0), f(this, a, 0, a, lb(a));\n }, selectNode: function selectNode(a) {\n p(a, !1), q(a, I);var b = d(a),\n c = e(a);f(this, b.node, b.offset, c.node, c.offset);\n }, extractContents: D(k, f), deleteContents: D(j, f), canSurroundContents: function canSurroundContents() {\n var a, c;return y(this), t(this.startContainer), t(this.endContainer), a = new n(this, !0), c = a._first && b(a._first, this) || a._last && b(a._last, this), a.detach(), !c;\n }, splitBoundaries: function splitBoundaries() {\n z(this);\n }, splitBoundariesPreservingPositions: function splitBoundariesPreservingPositions(a) {\n z(this, a);\n }, normalizeBoundaries: function normalizeBoundaries() {\n var a, b, c, d, e, g, h, i, j;y(this), a = this.startContainer, b = this.startOffset, c = this.endContainer, d = this.endOffset, e = function e(a) {\n var b = a.nextSibling;b && b.nodeType == a.nodeType && (c = a, d = a.length, a.appendData(b.data), b.parentNode.removeChild(b));\n }, g = function g(e) {\n var f,\n g,\n h = e.previousSibling;h && h.nodeType == e.nodeType && (a = e, f = e.length, b = h.length, e.insertData(0, h.data), h.parentNode.removeChild(h), a == c ? (d += b, c = a) : c == e.parentNode && (g = fb(e), d == g ? (c = e, d = f) : d > g && d--));\n }, h = !0, eb(c) ? c.length == d && e(c) : (d > 0 && (i = c.childNodes[d - 1], i && eb(i) && e(i)), h = !this.collapsed), h ? eb(a) ? 0 == b && g(a) : b < a.childNodes.length && (j = a.childNodes[b], j && eb(j) && g(j)) : (a = c, b = d), f(this, a, b, c, d);\n }, collapseToPoint: function collapseToPoint(a, b) {\n p(a, !0), r(a, b), this.setStartAndEnd(a, b);\n } }), C(c);\n }function F(a) {\n a.collapsed = a.startContainer === a.endContainer && a.startOffset === a.endOffset, a.commonAncestorContainer = a.collapsed ? a.startContainer : ab.getCommonAncestor(a.startContainer, a.endContainer);\n }function G(a, b, c, d, e) {\n a.startContainer = b, a.startOffset = c, a.endContainer = d, a.endOffset = e, a.document = ab.getDocument(b), F(a);\n }function H(a) {\n this.startContainer = a, this.startOffset = 0, this.endContainer = a, this.endOffset = 0, this.document = a, F(this);\n }var I,\n J,\n K,\n L,\n M,\n N,\n O,\n P,\n Q,\n R,\n S,\n T,\n U,\n V,\n W,\n X,\n Y,\n Z,\n $,\n _,\n ab = a.dom,\n bb = a.util,\n cb = ab.DomPosition,\n db = a.DOMException,\n eb = ab.isCharacterDataNode,\n fb = ab.getNodeIndex,\n gb = ab.isOrIsAncestorOf,\n hb = ab.getDocument,\n ib = ab.comparePoints,\n jb = ab.splitDataNode,\n kb = ab.getClosestAncestorIn,\n lb = ab.getNodeLength,\n mb = ab.arrayContains,\n nb = ab.getRootContainer,\n ob = a.features.crashyTextNodes;n.prototype = { _current: null, _next: null, _first: null, _last: null, isSingleCharacterDataNode: !1, reset: function reset() {\n this._current = null, this._next = this._first;\n }, hasNext: function hasNext() {\n return !!this._next;\n }, next: function next() {\n var a = this._current = this._next;return a && (this._next = a !== this._last ? a.nextSibling : null, eb(a) && this.clonePartiallySelectedTextNodes && (a === this.ec && (a = a.cloneNode(!0)).deleteData(this.eo, a.length - this.eo), this._current === this.sc && (a = a.cloneNode(!0)).deleteData(0, this.so))), a;\n }, remove: function remove() {\n var a,\n b,\n c = this._current;!eb(c) || c !== this.sc && c !== this.ec ? c.parentNode && c.parentNode.removeChild(c) : (a = c === this.sc ? this.so : 0, b = c === this.ec ? this.eo : c.length, a != b && c.deleteData(a, b - a));\n }, isPartiallySelectedSubtree: function isPartiallySelectedSubtree() {\n var a = this._current;return b(a, this.range);\n }, getSubtreeIterator: function getSubtreeIterator() {\n var a, b, d, e, f, g;return this.isSingleCharacterDataNode ? (a = this.range.cloneRange(), a.collapse(!1)) : (a = new H(c(this.range)), b = this._current, d = b, e = 0, f = b, g = lb(b), gb(b, this.sc) && (d = this.sc, e = this.so), gb(b, this.ec) && (f = this.ec, g = this.eo), G(a, d, e, f, g)), new n(a, this.clonePartiallySelectedTextNodes);\n }, detach: function detach() {\n this.range = this._current = this._next = this._first = this._last = this.sc = this.so = this.ec = this.eo = null;\n } }, I = [1, 3, 4, 5, 7, 8, 10], J = [2, 9, 11], K = [5, 6, 10, 12], L = [1, 3, 4, 5, 7, 8, 10, 11], M = [1, 3, 4, 5, 7, 8], N = o([9, 11]), O = o(K), P = o([6, 10, 12]), Q = document.createElement(\"style\"), R = !1;try {\n Q.innerHTML = \"<b>x</b>\", R = 3 == Q.firstChild.nodeType;\n } catch (pb) {}a.features.htmlParsingConforms = R, S = R ? function (a) {\n var b,\n c = this.startContainer,\n d = hb(c);if (!c) throw new db(\"INVALID_STATE_ERR\");return b = null, 1 == c.nodeType ? b = c : eb(c) && (b = ab.parentElement(c)), b = null === b || \"HTML\" == b.nodeName && ab.isHtmlNamespace(hb(b).documentElement) && ab.isHtmlNamespace(b) ? d.createElement(\"body\") : b.cloneNode(!1), b.innerHTML = a, ab.fragmentFromNodeChildren(b);\n } : function (a) {\n var b = c(this),\n d = b.createElement(\"body\");return d.innerHTML = a, ab.fragmentFromNodeChildren(d);\n }, T = [\"startContainer\", \"startOffset\", \"endContainer\", \"endOffset\", \"collapsed\", \"commonAncestorContainer\"], U = 0, V = 1, W = 2, X = 3, Y = 0, Z = 1, $ = 2, _ = 3, bb.extend(a.rangePrototype, { compareBoundaryPoints: function compareBoundaryPoints(a, b) {\n var c, d, e, f, g, h;return y(this), s(this.startContainer, b.startContainer), g = a == X || a == U ? \"start\" : \"end\", h = a == V || a == U ? \"start\" : \"end\", c = this[g + \"Container\"], d = this[g + \"Offset\"], e = b[h + \"Container\"], f = b[h + \"Offset\"], ib(c, d, e, f);\n }, insertNode: function insertNode(a) {\n if (y(this), q(a, L), t(this.startContainer), gb(a, this.startContainer)) throw new db(\"HIERARCHY_REQUEST_ERR\");var b = f(a, this.startContainer, this.startOffset);this.setStartBefore(b);\n }, cloneContents: function cloneContents() {\n var a, b, d;return y(this), this.collapsed ? c(this).createDocumentFragment() : this.startContainer === this.endContainer && eb(this.startContainer) ? (a = this.startContainer.cloneNode(!0), a.data = a.data.slice(this.startOffset, this.endOffset), b = c(this).createDocumentFragment(), b.appendChild(a), b) : (d = new n(this, !0), a = h(d), d.detach(), a);\n }, canSurroundContents: function canSurroundContents() {\n var a, c;return y(this), t(this.startContainer), t(this.endContainer), a = new n(this, !0), c = a._first && b(a._first, this) || a._last && b(a._last, this), a.detach(), !c;\n }, surroundContents: function surroundContents(a) {\n if (q(a, M), !this.canSurroundContents()) throw new db(\"INVALID_STATE_ERR\");var b = this.extractContents();if (a.hasChildNodes()) for (; a.lastChild;) {\n a.removeChild(a.lastChild);\n }f(a, this.startContainer, this.startOffset), a.appendChild(b), this.selectNode(a);\n }, cloneRange: function cloneRange() {\n var a, b, d;for (y(this), a = new H(c(this)), b = T.length; b--;) {\n d = T[b], a[d] = this[d];\n }return a;\n }, toString: function toString() {\n var a, b, c;return y(this), a = this.startContainer, a === this.endContainer && eb(a) ? 3 == a.nodeType || 4 == a.nodeType ? a.data.slice(this.startOffset, this.endOffset) : \"\" : (b = [], c = new n(this, !0), i(c, function (a) {\n (3 == a.nodeType || 4 == a.nodeType) && b.push(a.data);\n }), c.detach(), b.join(\"\"));\n }, compareNode: function compareNode(a) {\n var b, c, d, e;if (y(this), b = a.parentNode, c = fb(a), !b) throw new db(\"NOT_FOUND_ERR\");return d = this.comparePoint(b, c), e = this.comparePoint(b, c + 1), 0 > d ? e > 0 ? $ : Y : e > 0 ? Z : _;\n }, comparePoint: function comparePoint(a, b) {\n return y(this), u(a, \"HIERARCHY_REQUEST_ERR\"), s(a, this.startContainer), ib(a, b, this.startContainer, this.startOffset) < 0 ? -1 : ib(a, b, this.endContainer, this.endOffset) > 0 ? 1 : 0;\n }, createContextualFragment: S, toHtml: function toHtml() {\n return A(this);\n }, intersectsNode: function intersectsNode(a, b) {\n var d, e, f, g;return y(this), u(a, \"NOT_FOUND_ERR\"), hb(a) !== c(this) ? !1 : (d = a.parentNode, e = fb(a), u(d, \"NOT_FOUND_ERR\"), f = ib(d, e, this.endContainer, this.endOffset), g = ib(d, e + 1, this.startContainer, this.startOffset), b ? 0 >= f && g >= 0 : 0 > f && g > 0);\n }, isPointInRange: function isPointInRange(a, b) {\n return y(this), u(a, \"HIERARCHY_REQUEST_ERR\"), s(a, this.startContainer), ib(a, b, this.startContainer, this.startOffset) >= 0 && ib(a, b, this.endContainer, this.endOffset) <= 0;\n }, intersectsRange: function intersectsRange(a) {\n return g(this, a, !1);\n }, intersectsOrTouchesRange: function intersectsOrTouchesRange(a) {\n return g(this, a, !0);\n }, intersection: function intersection(a) {\n var b, c, d;return this.intersectsRange(a) ? (b = ib(this.startContainer, this.startOffset, a.startContainer, a.startOffset), c = ib(this.endContainer, this.endOffset, a.endContainer, a.endOffset), d = this.cloneRange(), -1 == b && d.setStart(a.startContainer, a.startOffset), 1 == c && d.setEnd(a.endContainer, a.endOffset), d) : null;\n }, union: function union(a) {\n if (this.intersectsOrTouchesRange(a)) {\n var b = this.cloneRange();return -1 == ib(a.startContainer, a.startOffset, this.startContainer, this.startOffset) && b.setStart(a.startContainer, a.startOffset), 1 == ib(a.endContainer, a.endOffset, this.endContainer, this.endOffset) && b.setEnd(a.endContainer, a.endOffset), b;\n }throw new db(\"Ranges do not intersect\");\n }, containsNode: function containsNode(a, b) {\n return b ? this.intersectsNode(a, !1) : this.compareNode(a) == _;\n }, containsNodeContents: function containsNodeContents(a) {\n return this.comparePoint(a, 0) >= 0 && this.comparePoint(a, lb(a)) <= 0;\n }, containsRange: function containsRange(a) {\n var b = this.intersection(a);return null !== b && a.equals(b);\n }, containsNodeText: function containsNodeText(a) {\n var b,\n c,\n d = this.cloneRange();return d.selectNode(a), b = d.getNodes([3]), b.length > 0 ? (d.setStart(b[0], 0), c = b.pop(), d.setEnd(c, c.length), this.containsRange(d)) : this.containsNodeContents(a);\n }, getNodes: function getNodes(a, b) {\n return y(this), l(this, a, b);\n }, getDocument: function getDocument() {\n return c(this);\n }, collapseBefore: function collapseBefore(a) {\n this.setEndBefore(a), this.collapse(!1);\n }, collapseAfter: function collapseAfter(a) {\n this.setStartAfter(a), this.collapse(!0);\n }, getBookmark: function getBookmark(b) {\n var d,\n e,\n f,\n g = c(this),\n h = a.createRange(g);return b = b || ab.getBody(g), h.selectNodeContents(b), d = this.intersection(h), e = 0, f = 0, d && (h.setEnd(d.startContainer, d.startOffset), e = (\"\" + h).length, f = e + (\"\" + d).length), { start: e, end: f, containerNode: b };\n }, moveToBookmark: function moveToBookmark(a) {\n var b,\n c,\n d,\n e,\n f,\n g,\n h,\n i = a.containerNode,\n j = 0;for (this.setStart(i, 0), this.collapse(!0), b = [i], d = !1, e = !1; !e && (c = b.pop());) {\n if (3 == c.nodeType) f = j + c.length, !d && a.start >= j && a.start <= f && (this.setStart(c, a.start - j), d = !0), d && a.end >= j && a.end <= f && (this.setEnd(c, a.end - j), e = !0), j = f;else for (h = c.childNodes, g = h.length; g--;) {\n b.push(h[g]);\n }\n }\n }, getName: function getName() {\n return \"DomRange\";\n }, equals: function equals(a) {\n return H.rangesEqual(this, a);\n }, isValid: function isValid() {\n return x(this);\n }, inspect: function inspect() {\n return m(this);\n }, detach: function detach() {} }), E(H, G), bb.extend(H, { rangeProperties: T, RangeIterator: n, copyComparisonConstants: C, createPrototypeRange: E, inspect: m, toHtml: A, getRangeDocument: c, rangesEqual: function rangesEqual(a, b) {\n return a.startContainer === b.startContainer && a.startOffset === b.startOffset && a.endContainer === b.endContainer && a.endOffset === b.endOffset;\n } }), a.DomRange = H;\n }), H.createCoreModule(\"WrappedRange\", [\"DomRange\"], function (a, b) {\n var c,\n d,\n e,\n f,\n g,\n h,\n i,\n j,\n k = a.dom,\n l = a.util,\n m = k.DomPosition,\n n = a.DomRange,\n o = k.getBody,\n p = k.getContentDocument,\n q = k.isCharacterDataNode;a.features.implementsDomRange && !function () {\n function d(a) {\n for (var b, c = s.length; c--;) {\n b = s[c], a[b] = a.nativeRange[b];\n }a.collapsed = a.startContainer === a.endContainer && a.startOffset === a.endOffset;\n }function e(a, b, c, d, e) {\n var f = a.startContainer !== b || a.startOffset != c,\n g = a.endContainer !== d || a.endOffset != e,\n h = !a.equals(a.nativeRange);(f || g || h) && (a.setEnd(d, e), a.setStart(b, c));\n }var f,\n g,\n h,\n i,\n j,\n m,\n q,\n r,\n s = n.rangeProperties;c = function c(a) {\n if (!a) throw b.createError(\"WrappedRange: Range must be specified\");this.nativeRange = a, d(this);\n }, n.createPrototypeRange(c, e), f = c.prototype, f.selectNode = function (a) {\n this.nativeRange.selectNode(a), d(this);\n }, f.cloneContents = function () {\n return this.nativeRange.cloneContents();\n }, f.surroundContents = function (a) {\n this.nativeRange.surroundContents(a), d(this);\n }, f.collapse = function (a) {\n this.nativeRange.collapse(a), d(this);\n }, f.cloneRange = function () {\n return new c(this.nativeRange.cloneRange());\n }, f.refresh = function () {\n d(this);\n }, f.toString = function () {\n return \"\" + this.nativeRange;\n }, h = document.createTextNode(\"test\"), o(document).appendChild(h), i = document.createRange(), i.setStart(h, 0), i.setEnd(h, 0);try {\n i.setStart(h, 1), f.setStart = function (a, b) {\n this.nativeRange.setStart(a, b), d(this);\n }, f.setEnd = function (a, b) {\n this.nativeRange.setEnd(a, b), d(this);\n }, g = function g(a) {\n return function (b) {\n this.nativeRange[a](b), d(this);\n };\n };\n } catch (t) {\n f.setStart = function (a, b) {\n try {\n this.nativeRange.setStart(a, b);\n } catch (c) {\n this.nativeRange.setEnd(a, b), this.nativeRange.setStart(a, b);\n }d(this);\n }, f.setEnd = function (a, b) {\n try {\n this.nativeRange.setEnd(a, b);\n } catch (c) {\n this.nativeRange.setStart(a, b), this.nativeRange.setEnd(a, b);\n }d(this);\n }, g = function g(a, b) {\n return function (c) {\n try {\n this.nativeRange[a](c);\n } catch (e) {\n this.nativeRange[b](c), this.nativeRange[a](c);\n }d(this);\n };\n };\n }f.setStartBefore = g(\"setStartBefore\", \"setEndBefore\"), f.setStartAfter = g(\"setStartAfter\", \"setEndAfter\"), f.setEndBefore = g(\"setEndBefore\", \"setStartBefore\"), f.setEndAfter = g(\"setEndAfter\", \"setStartAfter\"), f.selectNodeContents = function (a) {\n this.setStartAndEnd(a, 0, k.getNodeLength(a));\n }, i.selectNodeContents(h), i.setEnd(h, 3), j = document.createRange(), j.selectNodeContents(h), j.setEnd(h, 4), j.setStart(h, 2), f.compareBoundaryPoints = -1 == i.compareBoundaryPoints(i.START_TO_END, j) && 1 == i.compareBoundaryPoints(i.END_TO_START, j) ? function (a, b) {\n return b = b.nativeRange || b, a == b.START_TO_END ? a = b.END_TO_START : a == b.END_TO_START && (a = b.START_TO_END), this.nativeRange.compareBoundaryPoints(a, b);\n } : function (a, b) {\n return this.nativeRange.compareBoundaryPoints(a, b.nativeRange || b);\n }, m = document.createElement(\"div\"), m.innerHTML = \"123\", q = m.firstChild, r = o(document), r.appendChild(m), i.setStart(q, 1), i.setEnd(q, 2), i.deleteContents(), \"13\" == q.data && (f.deleteContents = function () {\n this.nativeRange.deleteContents(), d(this);\n }, f.extractContents = function () {\n var a = this.nativeRange.extractContents();return d(this), a;\n }), r.removeChild(m), r = null, l.isHostMethod(i, \"createContextualFragment\") && (f.createContextualFragment = function (a) {\n return this.nativeRange.createContextualFragment(a);\n }), o(document).removeChild(h), f.getName = function () {\n return \"WrappedRange\";\n }, a.WrappedRange = c, a.createNativeRange = function (a) {\n return a = p(a, b, \"createNativeRange\"), a.createRange();\n };\n }(), a.features.implementsTextRange && (e = function e(a) {\n var b,\n c,\n d,\n e = a.parentElement(),\n f = a.duplicate();return f.collapse(!0), b = f.parentElement(), f = a.duplicate(), f.collapse(!1), c = f.parentElement(), d = b == c ? b : k.getCommonAncestor(b, c), d == e ? d : k.getCommonAncestor(e, d);\n }, f = function f(a) {\n return 0 == a.compareEndPoints(\"StartToEnd\", a);\n }, g = function g(a, b, c, d, e) {\n var f,\n g,\n h,\n i,\n j,\n l,\n n,\n o,\n p,\n r,\n s,\n t,\n u,\n v,\n w,\n x,\n y = a.duplicate();if (y.collapse(c), f = y.parentElement(), k.isOrIsAncestorOf(b, f) || (f = b), !f.canHaveHTML) return g = new m(f.parentNode, k.getNodeIndex(f)), { boundaryPosition: g, nodeInfo: { nodeIndex: g.offset, containerElement: g.node } };for (h = k.getDocument(f).createElement(\"span\"), h.parentNode && h.parentNode.removeChild(h), j = c ? \"StartToStart\" : \"StartToEnd\", r = e && e.containerElement == f ? e.nodeIndex : 0, s = f.childNodes.length, t = s, u = t;;) {\n if (u == s ? f.appendChild(h) : f.insertBefore(h, f.childNodes[u]), y.moveToElementText(h), i = y.compareEndPoints(j, a), 0 == i || r == t) break;if (-1 == i) {\n if (t == r + 1) break;r = u;\n } else t = t == r + 1 ? r : u;u = Math.floor((r + t) / 2), f.removeChild(h);\n }if (p = h.nextSibling, -1 == i && p && q(p)) {\n if (y.setEndPoint(c ? \"EndToStart\" : \"EndToEnd\", a), /[\\r\\n]/.test(p.data)) for (w = y.duplicate(), x = w.text.replace(/\\r\\n/g, \"\\r\").length, v = w.moveStart(\"character\", x); -1 == (i = w.compareEndPoints(\"StartToEnd\", w));) {\n v++, w.moveStart(\"character\", 1);\n } else v = y.text.length;o = new m(p, v);\n } else l = (d || !c) && h.previousSibling, n = (d || c) && h.nextSibling, o = n && q(n) ? new m(n, 0) : l && q(l) ? new m(l, l.data.length) : new m(f, k.getNodeIndex(h));return h.parentNode.removeChild(h), { boundaryPosition: o, nodeInfo: { nodeIndex: u, containerElement: f } };\n }, h = function h(a, b) {\n var c,\n d,\n e,\n f,\n g = a.offset,\n h = k.getDocument(a.node),\n i = o(h).createTextRange(),\n j = q(a.node);return j ? (c = a.node, d = c.parentNode) : (f = a.node.childNodes, c = g < f.length ? f[g] : null, d = a.node), e = h.createElement(\"span\"), e.innerHTML = \"&#feff;\", c ? d.insertBefore(e, c) : d.appendChild(e), i.moveToElementText(e), i.collapse(!b), d.removeChild(e), j && i[b ? \"moveStart\" : \"moveEnd\"](\"character\", g), i;\n }, d = function d(a) {\n this.textRange = a, this.refresh();\n }, d.prototype = new n(document), d.prototype.refresh = function () {\n var a,\n b,\n c,\n d = e(this.textRange);\n f(this.textRange) ? b = a = g(this.textRange, d, !0, !0).boundaryPosition : (c = g(this.textRange, d, !0, !1), a = c.boundaryPosition, b = g(this.textRange, d, !1, !1, c.nodeInfo).boundaryPosition), this.setStart(a.node, a.offset), this.setEnd(b.node, b.offset);\n }, d.prototype.getName = function () {\n return \"WrappedTextRange\";\n }, n.copyComparisonConstants(d), i = function i(a) {\n var b, c, d;return a.collapsed ? h(new m(a.startContainer, a.startOffset), !0) : (b = h(new m(a.startContainer, a.startOffset), !0), c = h(new m(a.endContainer, a.endOffset), !1), d = o(n.getRangeDocument(a)).createTextRange(), d.setEndPoint(\"StartToStart\", b), d.setEndPoint(\"EndToEnd\", c), d);\n }, d.rangeToTextRange = i, d.prototype.toTextRange = function () {\n return i(this);\n }, a.WrappedTextRange = d, (!a.features.implementsDomRange || a.config.preferTextRange) && (j = function () {\n return this;\n }(), void 0 === j.Range && (j.Range = d), a.createNativeRange = function (a) {\n return a = p(a, b, \"createNativeRange\"), o(a).createTextRange();\n }, a.WrappedRange = d)), a.createRange = function (c) {\n return c = p(c, b, \"createRange\"), new a.WrappedRange(a.createNativeRange(c));\n }, a.createRangyRange = function (a) {\n return a = p(a, b, \"createRangyRange\"), new n(a);\n }, a.createIframeRange = function (c) {\n return b.deprecationNotice(\"createIframeRange()\", \"createRange(iframeEl)\"), a.createRange(c);\n }, a.createIframeRangyRange = function (c) {\n return b.deprecationNotice(\"createIframeRangyRange()\", \"createRangyRange(iframeEl)\"), a.createRangyRange(c);\n }, a.addShimListener(function (b) {\n var c = b.document;void 0 === c.createRange && (c.createRange = function () {\n return a.createRange(c);\n }), c = b = null;\n });\n }), H.createCoreModule(\"WrappedSelection\", [\"DomRange\", \"WrappedRange\"], function (a, b) {\n function c(a) {\n return \"string\" == typeof a ? /^backward(s)?$/i.test(a) : !!a;\n }function d(a, c) {\n if (a) {\n if (A.isWindow(a)) return a;if (a instanceof r) return a.win;var d = A.getContentDocument(a, b, c);return A.getWindow(d);\n }return window;\n }function e(a) {\n return d(a, \"getWinSelection\").getSelection();\n }function f(a) {\n return d(a, \"getDocSelection\").document.selection;\n }function g(a) {\n var b = !1;return a.anchorNode && (b = 1 == A.comparePoints(a.anchorNode, a.anchorOffset, a.focusNode, a.focusOffset)), b;\n }function h(a, b, c) {\n var d = c ? \"end\" : \"start\",\n e = c ? \"start\" : \"end\";a.anchorNode = b[d + \"Container\"], a.anchorOffset = b[d + \"Offset\"], a.focusNode = b[e + \"Container\"], a.focusOffset = b[e + \"Offset\"];\n }function i(a) {\n var b = a.nativeSelection;a.anchorNode = b.anchorNode, a.anchorOffset = b.anchorOffset, a.focusNode = b.focusNode, a.focusOffset = b.focusOffset;\n }function j(a) {\n a.anchorNode = a.focusNode = null, a.anchorOffset = a.focusOffset = 0, a.rangeCount = 0, a.isCollapsed = !0, a._ranges.length = 0;\n }function k(b) {\n var c;return b instanceof D ? (c = a.createNativeRange(b.getDocument()), c.setEnd(b.endContainer, b.endOffset), c.setStart(b.startContainer, b.startOffset)) : b instanceof E ? c = b.nativeRange : J.implementsDomRange && b instanceof A.getWindow(b.startContainer).Range && (c = b), c;\n }function l(a) {\n if (!a.length || 1 != a[0].nodeType) return !1;for (var b = 1, c = a.length; c > b; ++b) {\n if (!A.isAncestorOf(a[0], a[b])) return !1;\n }return !0;\n }function m(a) {\n var c = a.getNodes();if (!l(c)) throw b.createError(\"getSingleElementFromRange: range \" + a.inspect() + \" did not consist of a single element\");return c[0];\n }function n(a) {\n return !!a && void 0 !== a.text;\n }function o(a, b) {\n var c = new E(b);a._ranges = [c], h(a, c, !1), a.rangeCount = 1, a.isCollapsed = c.collapsed;\n }function p(b) {\n var c, d, e, f;if (b._ranges.length = 0, \"None\" == b.docSelection.type) j(b);else if (c = b.docSelection.createRange(), n(c)) o(b, c);else {\n for (b.rangeCount = c.length, e = L(c.item(0)), f = 0; f < b.rangeCount; ++f) {\n d = a.createRange(e), d.selectNode(c.item(f)), b._ranges.push(d);\n }b.isCollapsed = 1 == b.rangeCount && b._ranges[0].collapsed, h(b, b._ranges[b.rangeCount - 1], !1);\n }\n }function q(a, c) {\n var d,\n e,\n f = a.docSelection.createRange(),\n g = m(c),\n h = L(f.item(0)),\n i = M(h).createControlRange();for (d = 0, e = f.length; e > d; ++d) {\n i.add(f.item(d));\n }try {\n i.add(g);\n } catch (j) {\n throw b.createError(\"addRange(): Element within the specified Range could not be added to control selection (does it have layout?)\");\n }i.select(), p(a);\n }function r(a, b, c) {\n this.nativeSelection = a, this.docSelection = b, this._ranges = [], this.win = c, this.refresh();\n }function s(a) {\n a.win = a.anchorNode = a.focusNode = a._ranges = null, a.rangeCount = a.anchorOffset = a.focusOffset = 0, a.detached = !0;\n }function t(a, b) {\n for (var c, d, e = bb.length; e--;) {\n if (c = bb[e], d = c.selection, \"deleteAll\" == b) s(d);else if (c.win == a) return \"delete\" == b ? (bb.splice(e, 1), !0) : d;\n }return \"deleteAll\" == b && (bb.length = 0), null;\n }function u(a, c) {\n var d,\n e,\n f,\n g = L(c[0].startContainer),\n h = M(g).createControlRange();for (d = 0, f = c.length; f > d; ++d) {\n e = m(c[d]);try {\n h.add(e);\n } catch (i) {\n throw b.createError(\"setRanges(): Element within one of the specified Ranges could not be added to control selection (does it have layout?)\");\n }\n }h.select(), p(a);\n }function v(a, b) {\n if (a.win.document != L(b)) throw new F(\"WRONG_DOCUMENT_ERR\");\n }function w(b) {\n return function (c, d) {\n var e;this.rangeCount ? (e = this.getRangeAt(0), e[\"set\" + (b ? \"Start\" : \"End\")](c, d)) : (e = a.createRange(this.win.document), e.setStartAndEnd(c, d)), this.setSingleRange(e, this.isBackward());\n };\n }function x(a) {\n var b,\n c,\n d = [],\n e = new G(a.anchorNode, a.anchorOffset),\n f = new G(a.focusNode, a.focusOffset),\n g = \"function\" == typeof a.getName ? a.getName() : \"Selection\";if (void 0 !== a.rangeCount) for (b = 0, c = a.rangeCount; c > b; ++b) {\n d[b] = D.inspect(a.getRangeAt(b));\n }return \"[\" + g + \"(Ranges: \" + d.join(\", \") + \")(anchor: \" + e.inspect() + \", focus: \" + f.inspect() + \"]\";\n }var y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, $, _, ab, bb, cb, db, eb, fb, gb, hb;if (a.config.checkSelectionRanges = !0, y = \"boolean\", z = \"number\", A = a.dom, B = a.util, C = B.isHostMethod, D = a.DomRange, E = a.WrappedRange, F = a.DOMException, G = A.DomPosition, J = a.features, K = \"Control\", L = A.getDocument, M = A.getBody, N = D.rangesEqual, O = C(window, \"getSelection\"), P = B.isHostObject(document, \"selection\"), J.implementsWinGetSelection = O, J.implementsDocSelection = P, Q = P && (!O || a.config.preferTextRange), Q ? (H = f, a.isSelectionValid = function (a) {\n var b = d(a, \"isSelectionValid\").document,\n c = b.selection;return \"None\" != c.type || L(c.createRange().parentElement()) == b;\n }) : O ? (H = e, a.isSelectionValid = function () {\n return !0;\n }) : b.fail(\"Neither document.selection or window.getSelection() detected.\"), a.getNativeSelection = H, R = H(), S = a.createNativeRange(document), T = M(document), U = B.areHostProperties(R, [\"anchorNode\", \"focusNode\", \"anchorOffset\", \"focusOffset\"]), J.selectionHasAnchorAndFocus = U, V = C(R, \"extend\"), J.selectionHasExtend = V, W = _typeof(R.rangeCount) == z, J.selectionHasRangeCount = W, X = !1, Y = !0, Z = V ? function (b, c) {\n var d = D.getRangeDocument(c),\n e = a.createRange(d);e.collapseToPoint(c.endContainer, c.endOffset), b.addRange(k(e)), b.extend(c.startContainer, c.startOffset);\n } : null, B.areHostMethods(R, [\"addRange\", \"getRangeAt\", \"removeAllRanges\"]) && _typeof(R.rangeCount) == z && J.implementsDomRange && !function () {\n var b,\n c,\n d,\n e,\n f,\n h,\n i,\n j,\n k,\n l,\n m,\n n = window.getSelection();if (n) {\n for (b = n.rangeCount, c = b > 1, d = [], e = g(n), f = 0; b > f; ++f) {\n d[f] = n.getRangeAt(f);\n }for (h = M(document), i = h.appendChild(document.createElement(\"div\")), i.contentEditable = \"false\", j = i.appendChild(document.createTextNode(\"   \")), k = document.createRange(), k.setStart(j, 1), k.collapse(!0), n.addRange(k), Y = 1 == n.rangeCount, n.removeAllRanges(), c || (l = window.navigator.appVersion.match(/Chrome\\/(.*?) /), l && parseInt(l[1]) >= 36 ? X = !1 : (m = k.cloneRange(), k.setStart(j, 0), m.setEnd(j, 3), m.setStart(j, 2), n.addRange(k), n.addRange(m), X = 2 == n.rangeCount)), h.removeChild(i), n.removeAllRanges(), f = 0; b > f; ++f) {\n 0 == f && e ? Z ? Z(n, d[f]) : (a.warn(\"Rangy initialization: original selection was backwards but selection has been restored forwards because the browser does not support Selection.extend\"), n.addRange(d[f])) : n.addRange(d[f]);\n }\n }\n }(), J.selectionSupportsMultipleRanges = X, J.collapsedNonEditableSelectionsSupported = Y, $ = !1, T && C(T, \"createControlRange\") && (_ = T.createControlRange(), B.areHostProperties(_, [\"item\", \"add\"]) && ($ = !0)), J.implementsControlRange = $, I = U ? function (a) {\n return a.anchorNode === a.focusNode && a.anchorOffset === a.focusOffset;\n } : function (a) {\n return a.rangeCount ? a.getRangeAt(a.rangeCount - 1).collapsed : !1;\n }, C(R, \"getRangeAt\") ? ab = function ab(a, b) {\n try {\n return a.getRangeAt(b);\n } catch (c) {\n return null;\n }\n } : U && (ab = function ab(b) {\n var c = L(b.anchorNode),\n d = a.createRange(c);return d.setStartAndEnd(b.anchorNode, b.anchorOffset, b.focusNode, b.focusOffset), d.collapsed !== this.isCollapsed && d.setStartAndEnd(b.focusNode, b.focusOffset, b.anchorNode, b.anchorOffset), d;\n }), r.prototype = a.selectionPrototype, bb = [], cb = function cb(a) {\n var b, c, e;return a && a instanceof r ? (a.refresh(), a) : (a = d(a, \"getNativeSelection\"), b = t(a), c = H(a), e = P ? f(a) : null, b ? (b.nativeSelection = c, b.docSelection = e, b.refresh()) : (b = new r(c, e, a), bb.push({ win: a, selection: b })), b);\n }, a.getSelection = cb, a.getIframeSelection = function (c) {\n return b.deprecationNotice(\"getIframeSelection()\", \"getSelection(iframeEl)\"), a.getSelection(A.getIframeWindow(c));\n }, db = r.prototype, !Q && U && B.areHostMethods(R, [\"removeAllRanges\", \"addRange\"])) db.removeAllRanges = function () {\n this.nativeSelection.removeAllRanges(), j(this);\n }, eb = function eb(a, b) {\n Z(a.nativeSelection, b), a.refresh();\n }, db.addRange = W ? function (b, d) {\n var e, f;$ && P && this.docSelection.type == K ? q(this, b) : c(d) && V ? eb(this, b) : (X ? e = this.rangeCount : (this.removeAllRanges(), e = 0), this.nativeSelection.addRange(k(b).cloneRange()), this.rangeCount = this.nativeSelection.rangeCount, this.rangeCount == e + 1 ? (a.config.checkSelectionRanges && (f = ab(this.nativeSelection, this.rangeCount - 1), f && !N(f, b) && (b = new E(f))), this._ranges[this.rangeCount - 1] = b, h(this, b, hb(this.nativeSelection)), this.isCollapsed = I(this)) : this.refresh());\n } : function (a, b) {\n c(b) && V ? eb(this, a) : (this.nativeSelection.addRange(k(a)), this.refresh());\n }, db.setRanges = function (a) {\n if ($ && P && a.length > 1) u(this, a);else {\n this.removeAllRanges();for (var b = 0, c = a.length; c > b; ++b) {\n this.addRange(a[b]);\n }\n }\n };else {\n if (!(C(R, \"empty\") && C(S, \"select\") && $ && Q)) return b.fail(\"No means of selecting a Range or TextRange was found\"), !1;db.removeAllRanges = function () {\n var a, b, c;try {\n this.docSelection.empty(), \"None\" != this.docSelection.type && (this.anchorNode ? a = L(this.anchorNode) : this.docSelection.type == K && (b = this.docSelection.createRange(), b.length && (a = L(b.item(0)))), a && (c = M(a).createTextRange(), c.select(), this.docSelection.empty()));\n } catch (d) {}j(this);\n }, db.addRange = function (b) {\n this.docSelection.type == K ? q(this, b) : (a.WrappedTextRange.rangeToTextRange(b).select(), this._ranges[0] = b, this.rangeCount = 1, this.isCollapsed = this._ranges[0].collapsed, h(this, b, !1));\n }, db.setRanges = function (a) {\n this.removeAllRanges();var b = a.length;b > 1 ? u(this, a) : b && this.addRange(a[0]);\n };\n }if (db.getRangeAt = function (a) {\n if (0 > a || a >= this.rangeCount) throw new F(\"INDEX_SIZE_ERR\");return this._ranges[a].cloneRange();\n }, Q) fb = function fb(b) {\n var c;a.isSelectionValid(b.win) ? c = b.docSelection.createRange() : (c = M(b.win.document).createTextRange(), c.collapse(!0)), b.docSelection.type == K ? p(b) : n(c) ? o(b, c) : j(b);\n };else if (C(R, \"getRangeAt\") && _typeof(R.rangeCount) == z) fb = function fb(b) {\n if ($ && P && b.docSelection.type == K) p(b);else if (b._ranges.length = b.rangeCount = b.nativeSelection.rangeCount, b.rangeCount) {\n for (var c = 0, d = b.rangeCount; d > c; ++c) {\n b._ranges[c] = new a.WrappedRange(b.nativeSelection.getRangeAt(c));\n }h(b, b._ranges[b.rangeCount - 1], hb(b.nativeSelection)), b.isCollapsed = I(b);\n } else j(b);\n };else {\n if (!U || _typeof(R.isCollapsed) != y || _typeof(S.collapsed) != y || !J.implementsDomRange) return b.fail(\"No means of obtaining a Range or TextRange from the user's selection was found\"), !1;fb = function fb(a) {\n var b,\n c = a.nativeSelection;c.anchorNode ? (b = ab(c, 0), a._ranges = [b], a.rangeCount = 1, i(a), a.isCollapsed = I(a)) : j(a);\n };\n }db.refresh = function (a) {\n var b,\n c = a ? this._ranges.slice(0) : null,\n d = this.anchorNode,\n e = this.anchorOffset;if (fb(this), a) {\n if (b = c.length, b != this._ranges.length) return !0;if (this.anchorNode != d || this.anchorOffset != e) return !0;for (; b--;) {\n if (!N(c[b], this._ranges[b])) return !0;\n }return !1;\n }\n }, gb = function gb(a, b) {\n var c,\n d,\n e = a.getAllRanges();for (a.removeAllRanges(), c = 0, d = e.length; d > c; ++c) {\n N(b, e[c]) || a.addRange(e[c]);\n }a.rangeCount || j(a);\n }, db.removeRange = $ && P ? function (a) {\n var b, c, d, e, f, g, h, i;if (this.docSelection.type == K) {\n for (b = this.docSelection.createRange(), c = m(a), d = L(b.item(0)), e = M(d).createControlRange(), g = !1, h = 0, i = b.length; i > h; ++h) {\n f = b.item(h), f !== c || g ? e.add(b.item(h)) : g = !0;\n }e.select(), p(this);\n } else gb(this, a);\n } : function (a) {\n gb(this, a);\n }, !Q && U && J.implementsDomRange ? (hb = g, db.isBackward = function () {\n return hb(this);\n }) : hb = db.isBackward = function () {\n return !1;\n }, db.isBackwards = db.isBackward, db.toString = function () {\n var a,\n b,\n c = [];for (a = 0, b = this.rangeCount; b > a; ++a) {\n c[a] = \"\" + this._ranges[a];\n }return c.join(\"\");\n }, db.collapse = function (b, c) {\n v(this, b);var d = a.createRange(b);d.collapseToPoint(b, c), this.setSingleRange(d), this.isCollapsed = !0;\n }, db.collapseToStart = function () {\n if (!this.rangeCount) throw new F(\"INVALID_STATE_ERR\");var a = this._ranges[0];this.collapse(a.startContainer, a.startOffset);\n }, db.collapseToEnd = function () {\n if (!this.rangeCount) throw new F(\"INVALID_STATE_ERR\");var a = this._ranges[this.rangeCount - 1];this.collapse(a.endContainer, a.endOffset);\n }, db.selectAllChildren = function (b) {\n v(this, b);var c = a.createRange(b);c.selectNodeContents(b), this.setSingleRange(c);\n }, db.deleteFromDocument = function () {\n var a, b, c, d, e;if ($ && P && this.docSelection.type == K) {\n for (a = this.docSelection.createRange(); a.length;) {\n b = a.item(0), a.remove(b), b.parentNode.removeChild(b);\n }this.refresh();\n } else if (this.rangeCount && (c = this.getAllRanges(), c.length)) {\n for (this.removeAllRanges(), d = 0, e = c.length; e > d; ++d) {\n c[d].deleteContents();\n }this.addRange(c[e - 1]);\n }\n }, db.eachRange = function (a, b) {\n for (var c = 0, d = this._ranges.length; d > c; ++c) {\n if (a(this.getRangeAt(c))) return b;\n }\n }, db.getAllRanges = function () {\n var a = [];return this.eachRange(function (b) {\n a.push(b);\n }), a;\n }, db.setSingleRange = function (a, b) {\n this.removeAllRanges(), this.addRange(a, b);\n }, db.callMethodOnEachRange = function (a, b) {\n var c = [];return this.eachRange(function (d) {\n c.push(d[a].apply(d, b));\n }), c;\n }, db.setStart = w(!0), db.setEnd = w(!1), a.rangePrototype.select = function (a) {\n cb(this.getDocument()).setSingleRange(this, a);\n }, db.changeEachRange = function (a) {\n var b = [],\n c = this.isBackward();this.eachRange(function (c) {\n a(c), b.push(c);\n }), this.removeAllRanges(), c && 1 == b.length ? this.addRange(b[0], \"backward\") : this.setRanges(b);\n }, db.containsNode = function (a, b) {\n return this.eachRange(function (c) {\n return c.containsNode(a, b);\n }, !0) || !1;\n }, db.getBookmark = function (a) {\n return { backward: this.isBackward(), rangeBookmarks: this.callMethodOnEachRange(\"getBookmark\", [a]) };\n }, db.moveToBookmark = function (b) {\n var c,\n d,\n e,\n f = [];for (c = 0; d = b.rangeBookmarks[c++];) {\n e = a.createRange(this.win), e.moveToBookmark(d), f.push(e);\n }b.backward ? this.setSingleRange(f[0], \"backward\") : this.setRanges(f);\n }, db.toHtml = function () {\n var a = [];return this.eachRange(function (b) {\n a.push(D.toHtml(b));\n }), a.join(\"\");\n }, J.implementsTextRange && (db.getNativeTextRange = function () {\n var c, d;if (c = this.docSelection) {\n if (d = c.createRange(), n(d)) return d;throw b.createError(\"getNativeTextRange: selection is a control selection\");\n }if (this.rangeCount > 0) return a.WrappedTextRange.rangeToTextRange(this.getRangeAt(0));throw b.createError(\"getNativeTextRange: selection contains no range\");\n }), db.getName = function () {\n return \"WrappedSelection\";\n }, db.inspect = function () {\n return x(this);\n }, db.detach = function () {\n t(this.win, \"delete\"), s(this);\n }, r.detachAll = function () {\n t(null, \"deleteAll\");\n }, r.inspect = x, r.isDirectionBackward = c, a.Selection = r, a.selectionPrototype = db, a.addShimListener(function (a) {\n void 0 === a.getSelection && (a.getSelection = function () {\n return cb(a);\n }), a = null;\n });\n }), H);\n}, this), function (a, b) {\n true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [!(function webpackMissingModule() { var e = new Error(\"Cannot find module \\\"rangy\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e; }())], __WEBPACK_AMD_DEFINE_FACTORY__ = (a),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : a(b.rangy);\n}(function (a) {\n a.createModule(\"SaveRestore\", [\"WrappedRange\"], function (a, b) {\n function c(a, b) {\n return (b || document).getElementById(a);\n }function d(a, b) {\n var c,\n d = \"selectionBoundary_\" + +new Date() + \"_\" + (\"\" + Math.random()).slice(2),\n e = o.getDocument(a.startContainer),\n f = a.cloneRange();return f.collapse(b), c = e.createElement(\"span\"), c.id = d, c.style.lineHeight = \"0\", c.style.display = \"none\", c.className = \"rangySelectionBoundary\", c.appendChild(e.createTextNode(p)), f.insertNode(c), c;\n }function e(a, d, e, f) {\n var g = c(e, a);g ? (d[f ? \"setStartBefore\" : \"setEndBefore\"](g), g.parentNode.removeChild(g)) : b.warn(\"Marker element has been removed. Cannot restore selection.\");\n }function f(a, b) {\n return b.compareBoundaryPoints(a.START_TO_START, a);\n }function g(b, c) {\n var e,\n f,\n g = a.DomRange.getRangeDocument(b),\n h = \"\" + b;return b.collapsed ? (f = d(b, !1), { document: g, markerId: f.id, collapsed: !0 }) : (f = d(b, !1), e = d(b, !0), { document: g, startMarkerId: e.id, endMarkerId: f.id, collapsed: !1, backward: c, toString: function toString() {\n return \"original text: '\" + h + \"', new text: '\" + b + \"'\";\n } });\n }function h(d, f) {\n var g,\n h,\n i,\n j = d.document;return void 0 === f && (f = !0), g = a.createRange(j), d.collapsed ? (h = c(d.markerId, j), h ? (h.style.display = \"inline\", i = h.previousSibling, i && 3 == i.nodeType ? (h.parentNode.removeChild(h), g.collapseToPoint(i, i.length)) : (g.collapseBefore(h), h.parentNode.removeChild(h))) : b.warn(\"Marker element has been removed. Cannot restore selection.\")) : (e(j, g, d.startMarkerId, !0), e(j, g, d.endMarkerId, !1)), f && g.normalizeBoundaries(), g;\n }function i(b, d) {\n var e,\n h,\n i,\n j,\n k = [];for (b = b.slice(0), b.sort(f), i = 0, j = b.length; j > i; ++i) {\n k[i] = g(b[i], d);\n }for (i = j - 1; i >= 0; --i) {\n e = b[i], h = a.DomRange.getRangeDocument(e), e.collapsed ? e.collapseAfter(c(k[i].markerId, h)) : (e.setEndBefore(c(k[i].endMarkerId, h)), e.setStartAfter(c(k[i].startMarkerId, h)));\n }return k;\n }function j(c) {\n var d, e, f, g;return a.isSelectionValid(c) ? (d = a.getSelection(c), e = d.getAllRanges(), f = 1 == e.length && d.isBackward(), g = i(e, f), f ? d.setSingleRange(e[0], \"backward\") : d.setRanges(e), { win: c, rangeInfos: g, restored: !1 }) : (b.warn(\"Cannot save selection. This usually happens when the selection is collapsed and the selection document has lost focus.\"), null);\n }function k(a) {\n var b,\n c = [],\n d = a.length;for (b = d - 1; b >= 0; b--) {\n c[b] = h(a[b], !0);\n }return c;\n }function l(b, c) {\n var d, e, f, g;b.restored || (d = b.rangeInfos, e = a.getSelection(b.win), f = k(d), g = d.length, 1 == g && c && a.features.selectionHasExtend && d[0].backward ? (e.removeAllRanges(), e.addRange(f[0], !0)) : e.setRanges(f), b.restored = !0);\n }function m(a, b) {\n var d = c(b, a);d && d.parentNode.removeChild(d);\n }function n(a) {\n var b,\n c,\n d,\n e = a.rangeInfos;for (b = 0, c = e.length; c > b; ++b) {\n d = e[b], d.collapsed ? m(a.doc, d.markerId) : (m(a.doc, d.startMarkerId), m(a.doc, d.endMarkerId));\n }\n }var o = a.dom,\n p = \"\";a.util.extend(a, { saveRange: g, restoreRange: h, saveRanges: i, restoreRanges: k, saveSelection: j, restoreSelection: l, removeMarkerElement: m, removeMarkers: n });\n });\n}, this), Base = function Base() {}, Base.extend = function (a, b) {\n var c,\n d,\n e,\n f = Base.prototype.extend;return Base._prototyping = !0, c = new this(), f.call(c, a), c.base = function () {}, delete Base._prototyping, d = c.constructor, e = c.constructor = function () {\n if (!Base._prototyping) if (this._constructing || this.constructor == e) this._constructing = !0, d.apply(this, arguments), delete this._constructing;else if (null != arguments[0]) return (arguments[0].extend || f).call(arguments[0], c);\n }, e.ancestor = this, e.extend = this.extend, e.forEach = this.forEach, e.implement = this.implement, e.prototype = c, e.toString = this.toString, e.valueOf = function (a) {\n return \"object\" == a ? e : d.valueOf();\n }, f.call(e, b), \"function\" == typeof e.init && e.init(), e;\n}, Base.prototype = { extend: function extend(a, b) {\n var c, d, e, f, g, h, i;if (arguments.length > 1) c = this[a], !c || \"function\" != typeof b || c.valueOf && c.valueOf() == b.valueOf() || !/\\bbase\\b/.test(b) || (d = b.valueOf(), b = function b() {\n var a,\n b = this.base || Base.prototype.base;return this.base = c, a = d.apply(this, arguments), this.base = b, a;\n }, b.valueOf = function (a) {\n return \"object\" == a ? b : d;\n }, b.toString = Base.toString), this[a] = b;else if (a) {\n for (e = Base.prototype.extend, Base._prototyping || \"function\" == typeof this || (e = this.extend || e), f = { toSource: null }, g = [\"constructor\", \"toString\", \"valueOf\"], h = Base._prototyping ? 0 : 1; i = g[h++];) {\n a[i] != f[i] && e.call(this, i, a[i]);\n }for (i in a) {\n f[i] || e.call(this, i, a[i]);\n }\n }return this;\n } }, Base = Base.extend({ constructor: function constructor() {\n this.extend(arguments[0]);\n } }, { ancestor: Object, version: \"1.1\", forEach: function forEach(a, b, c) {\n for (var d in a) {\n void 0 === this.prototype[d] && b.call(c, a[d], d, a);\n }\n }, implement: function implement() {\n for (var a = 0; a < arguments.length; a++) {\n \"function\" == typeof arguments[a] ? arguments[a](this.prototype) : this.prototype.extend(arguments[a]);\n }return this;\n }, toString: function toString() {\n return this.valueOf() + \"\";\n } }), wysihtml5.browser = function () {\n function a(a) {\n return +(/ipad|iphone|ipod/.test(a) && a.match(/ os (\\d+).+? like mac os x/) || [void 0, 0])[1];\n }function b(a) {\n return +(a.match(/android (\\d+)/) || [void 0, 0])[1];\n }function c(a, b) {\n var c,\n d = -1;return \"Microsoft Internet Explorer\" == navigator.appName ? c = RegExp(\"MSIE ([0-9]{1,}[.0-9]{0,})\") : \"Netscape\" == navigator.appName && (c = RegExp(\"Trident/.*rv:([0-9]{1,}[.0-9]{0,})\")), c && null != c.exec(navigator.userAgent) && (d = parseFloat(RegExp.$1)), -1 === d ? !1 : a ? b ? \"<\" === b ? d > a : \">\" === b ? a > d : \"<=\" === b ? d >= a : \">=\" === b ? a >= d : void 0 : a === d : !0;\n }var d = navigator.userAgent,\n e = document.createElement(\"div\"),\n f = -1 !== d.indexOf(\"Gecko\") && -1 === d.indexOf(\"KHTML\"),\n g = -1 !== d.indexOf(\"AppleWebKit/\"),\n h = -1 !== d.indexOf(\"Chrome/\"),\n i = -1 !== d.indexOf(\"Opera/\");return { USER_AGENT: d, supported: function supported() {\n var c = this.USER_AGENT.toLowerCase(),\n d = \"contentEditable\" in e,\n f = document.execCommand && document.queryCommandSupported && document.queryCommandState,\n g = document.querySelector && document.querySelectorAll,\n h = this.isIos() && a(c) < 5 || this.isAndroid() && b(c) < 4 || -1 !== c.indexOf(\"opera mobi\") || -1 !== c.indexOf(\"hpwos/\");return d && f && g && !h;\n }, isTouchDevice: function isTouchDevice() {\n return this.supportsEvent(\"touchmove\");\n }, isIos: function isIos() {\n return (/ipad|iphone|ipod/i.test(this.USER_AGENT)\n );\n }, isAndroid: function isAndroid() {\n return -1 !== this.USER_AGENT.indexOf(\"Android\");\n }, supportsSandboxedIframes: function supportsSandboxedIframes() {\n return c();\n }, throwsMixedContentWarningWhenIframeSrcIsEmpty: function throwsMixedContentWarningWhenIframeSrcIsEmpty() {\n return !(\"querySelector\" in document);\n }, displaysCaretInEmptyContentEditableCorrectly: function displaysCaretInEmptyContentEditableCorrectly() {\n return c();\n }, hasCurrentStyleProperty: function hasCurrentStyleProperty() {\n return \"currentStyle\" in e;\n }, hasHistoryIssue: function hasHistoryIssue() {\n return f && \"Mac\" === navigator.platform.substr(0, 3);\n }, insertsLineBreaksOnReturn: function insertsLineBreaksOnReturn() {\n return f;\n }, supportsPlaceholderAttributeOn: function supportsPlaceholderAttributeOn(a) {\n return \"placeholder\" in a;\n }, supportsEvent: function supportsEvent(a) {\n return \"on\" + a in e || function () {\n return e.setAttribute(\"on\" + a, \"return;\"), \"function\" == typeof e[\"on\" + a];\n }();\n }, supportsEventsInIframeCorrectly: function supportsEventsInIframeCorrectly() {\n return !i;\n }, supportsHTML5Tags: function supportsHTML5Tags(a) {\n var b = a.createElement(\"div\"),\n c = \"<article>foo</article>\";return b.innerHTML = c, b.innerHTML.toLowerCase() === c;\n }, supportsCommand: function () {\n var a = { formatBlock: c(10, \"<=\"), insertUnorderedList: c(), insertOrderedList: c() },\n b = { insertHTML: f };return function (c, d) {\n var e = a[d];if (!e) {\n try {\n return c.queryCommandSupported(d);\n } catch (f) {}try {\n return c.queryCommandEnabled(d);\n } catch (g) {\n return !!b[d];\n }\n }return !1;\n };\n }(), doesAutoLinkingInContentEditable: function doesAutoLinkingInContentEditable() {\n return c();\n }, canDisableAutoLinking: function canDisableAutoLinking() {\n return this.supportsCommand(document, \"AutoUrlDetect\");\n }, clearsContentEditableCorrectly: function clearsContentEditableCorrectly() {\n return f || i || g;\n }, supportsGetAttributeCorrectly: function supportsGetAttributeCorrectly() {\n var a = document.createElement(\"td\");return \"1\" != a.getAttribute(\"rowspan\");\n }, canSelectImagesInContentEditable: function canSelectImagesInContentEditable() {\n return f || c() || i;\n }, autoScrollsToCaret: function autoScrollsToCaret() {\n return !g;\n }, autoClosesUnclosedTags: function autoClosesUnclosedTags() {\n var a,\n b,\n c = e.cloneNode(!1);return c.innerHTML = \"<p><div></div>\", b = c.innerHTML.toLowerCase(), a = \"<p></p><div></div>\" === b || \"<p><div></div></p>\" === b, this.autoClosesUnclosedTags = function () {\n return a;\n }, a;\n }, supportsNativeGetElementsByClassName: function supportsNativeGetElementsByClassName() {\n return -1 !== (document.getElementsByClassName + \"\").indexOf(\"[native code]\");\n }, supportsSelectionModify: function supportsSelectionModify() {\n return \"getSelection\" in window && \"modify\" in window.getSelection();\n }, needsSpaceAfterLineBreak: function needsSpaceAfterLineBreak() {\n return i;\n }, supportsSpeechApiOn: function supportsSpeechApiOn(a) {\n var b = d.match(/Chrome\\/(\\d+)/) || [void 0, 0];return b[1] >= 11 && (\"onwebkitspeechchange\" in a || \"speech\" in a);\n }, crashesWhenDefineProperty: function crashesWhenDefineProperty(a) {\n return c(9) && (\"XMLHttpRequest\" === a || \"XDomainRequest\" === a);\n }, doesAsyncFocus: function doesAsyncFocus() {\n return c();\n }, hasProblemsSettingCaretAfterImg: function hasProblemsSettingCaretAfterImg() {\n return c();\n }, hasUndoInContextMenu: function hasUndoInContextMenu() {\n return f || h || i;\n }, hasInsertNodeIssue: function hasInsertNodeIssue() {\n return i;\n }, hasIframeFocusIssue: function hasIframeFocusIssue() {\n return c();\n }, createsNestedInvalidMarkupAfterPaste: function createsNestedInvalidMarkupAfterPaste() {\n return g;\n }, supportsMutationEvents: function supportsMutationEvents() {\n return \"MutationEvent\" in window;\n }, supportsModenPaste: function supportsModenPaste() {\n return !(\"clipboardData\" in window);\n } };\n}(), wysihtml5.lang.array = function (a) {\n return { contains: function contains(b) {\n if (Array.isArray(b)) {\n for (var c = b.length; c--;) {\n if (-1 !== wysihtml5.lang.array(a).indexOf(b[c])) return !0;\n }return !1;\n }return -1 !== wysihtml5.lang.array(a).indexOf(b);\n }, indexOf: function indexOf(b) {\n if (a.indexOf) return a.indexOf(b);for (var c = 0, d = a.length; d > c; c++) {\n if (a[c] === b) return c;\n }return -1;\n }, without: function without(b) {\n b = wysihtml5.lang.array(b);for (var c = [], d = 0, e = a.length; e > d; d++) {\n b.contains(a[d]) || c.push(a[d]);\n }return c;\n }, get: function get() {\n for (var b = 0, c = a.length, d = []; c > b; b++) {\n d.push(a[b]);\n }return d;\n }, map: function map(b, c) {\n if (Array.prototype.map) return a.map(b, c);for (var d = a.length >>> 0, e = Array(d), f = 0; d > f; f++) {\n e[f] = b.call(c, a[f], f, a);\n }return e;\n }, unique: function unique() {\n for (var b = [], c = a.length, d = 0; c > d;) {\n wysihtml5.lang.array(b).contains(a[d]) || b.push(a[d]), d++;\n }return b;\n } };\n}, wysihtml5.lang.Dispatcher = Base.extend({ on: function on(a, b) {\n return this.events = this.events || {}, this.events[a] = this.events[a] || [], this.events[a].push(b), this;\n }, off: function off(a, b) {\n this.events = this.events || {};var c,\n d,\n e = 0;if (a) {\n for (c = this.events[a] || [], d = []; e < c.length; e++) {\n c[e] !== b && b && d.push(c[e]);\n }this.events[a] = d;\n } else this.events = {};return this;\n }, fire: function fire(a, b) {\n this.events = this.events || {};for (var c = this.events[a] || [], d = 0; d < c.length; d++) {\n c[d].call(this, b);\n }return this;\n }, observe: function observe() {\n return this.on.apply(this, arguments);\n }, stopObserving: function stopObserving() {\n return this.off.apply(this, arguments);\n } }), wysihtml5.lang.object = function (a) {\n return { merge: function merge(b) {\n for (var c in b) {\n a[c] = b[c];\n }return this;\n }, get: function get() {\n return a;\n }, clone: function clone(b) {\n var c,\n d = {};if (null === a || !wysihtml5.lang.object(a).isPlainObject()) return a;for (c in a) {\n a.hasOwnProperty(c) && (d[c] = b ? wysihtml5.lang.object(a[c]).clone(b) : a[c]);\n }return d;\n }, isArray: function isArray() {\n return \"[object Array]\" === Object.prototype.toString.call(a);\n }, isFunction: function isFunction() {\n return \"[object Function]\" === Object.prototype.toString.call(a);\n }, isPlainObject: function isPlainObject() {\n return \"[object Object]\" === Object.prototype.toString.call(a);\n } };\n}, function () {\n var a = /^\\s+/,\n b = /\\s+$/,\n c = /[&<>\\t\"]/g,\n d = { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"\t\": \"&nbsp; \" };wysihtml5.lang.string = function (e) {\n return e += \"\", { trim: function trim() {\n return e.replace(a, \"\").replace(b, \"\");\n }, interpolate: function interpolate(a) {\n for (var b in a) {\n e = this.replace(\"#{\" + b + \"}\").by(a[b]);\n }return e;\n }, replace: function replace(a) {\n return { by: function by(b) {\n return e.split(a).join(b);\n } };\n }, escapeHTML: function escapeHTML(a, b) {\n var f = e.replace(c, function (a) {\n return d[a];\n });return a && (f = f.replace(/(?:\\r\\n|\\r|\\n)/g, \"<br />\")), b && (f = f.replace(/ /gi, \"&nbsp; \")), f;\n } };\n };\n}(), function (a) {\n function b(a, b) {\n return f(a, b) ? a : (a === a.ownerDocument.documentElement && (a = a.ownerDocument.body), g(a, b));\n }function c(a) {\n return a.replace(i, function (a, b) {\n var c,\n d,\n e = (b.match(j) || [])[1] || \"\",\n f = l[e];return b = b.replace(j, \"\"), b.split(f).length > b.split(e).length && (b += e, e = \"\"), c = b, d = b, b.length > k && (d = d.substr(0, k) + \"...\"), \"www.\" === c.substr(0, 4) && (c = \"http://\" + c), '<a href=\"' + c + '\">' + d + \"</a>\" + e;\n });\n }function d(a) {\n var b = a._wysihtml5_tempElement;return b || (b = a._wysihtml5_tempElement = a.createElement(\"div\")), b;\n }function e(b) {\n var e = b.parentNode,\n f = a.lang.string(b.data).escapeHTML(),\n g = d(e.ownerDocument);for (g.innerHTML = \"<span></span>\" + c(f), g.removeChild(g.firstChild); g.firstChild;) {\n e.insertBefore(g.firstChild, b);\n }e.removeChild(b);\n }function f(b, c) {\n for (var d; b.parentNode;) {\n if (b = b.parentNode, d = b.nodeName, b.className && a.lang.array(b.className.split(\" \")).contains(c)) return !0;if (h.contains(d)) return !0;if (\"body\" === d) return !1;\n }return !1;\n }function g(b, c) {\n if (!(h.contains(b.nodeName) || b.className && a.lang.array(b.className.split(\" \")).contains(c))) {\n if (b.nodeType === a.TEXT_NODE && b.data.match(i)) return e(b), void 0;for (var d = a.lang.array(b.childNodes).get(), f = d.length, j = 0; f > j; j++) {\n g(d[j], c);\n }return b;\n }\n }var h = a.lang.array([\"CODE\", \"PRE\", \"A\", \"SCRIPT\", \"HEAD\", \"TITLE\", \"STYLE\"]),\n i = /((https?:\\/\\/|www\\.)[^\\s<]{3,})/gi,\n j = /([^\\w\\/\\-](,?))$/i,\n k = 100,\n l = { \")\": \"(\", \"]\": \"[\", \"}\": \"{\" };a.dom.autoLink = b, a.dom.autoLink.URL_REG_EXP = i;\n}(wysihtml5), function (a) {\n var b = a.dom;b.addClass = function (a, c) {\n var d = a.classList;return d ? d.add(c) : (b.hasClass(a, c) || (a.className += \" \" + c), void 0);\n }, b.removeClass = function (a, b) {\n var c = a.classList;return c ? c.remove(b) : (a.className = a.className.replace(RegExp(\"(^|\\\\s+)\" + b + \"(\\\\s+|$)\"), \" \"), void 0);\n }, b.hasClass = function (a, b) {\n var c,\n d = a.classList;return d ? d.contains(b) : (c = a.className, c.length > 0 && (c == b || RegExp(\"(^|\\\\s)\" + b + \"(\\\\s|$)\").test(c)));\n };\n}(wysihtml5), wysihtml5.dom.contains = function () {\n var a = document.documentElement;return a.contains ? function (a, b) {\n return b.nodeType !== wysihtml5.ELEMENT_NODE && (b = b.parentNode), a !== b && a.contains(b);\n } : a.compareDocumentPosition ? function (a, b) {\n return !!(16 & a.compareDocumentPosition(b));\n } : void 0;\n}(), wysihtml5.dom.convertToList = function () {\n function a(a, b) {\n var c = a.createElement(\"li\");return b.appendChild(c), c;\n }function b(a, b) {\n return a.createElement(b);\n }function c(c, d, e) {\n if (\"UL\" === c.nodeName || \"OL\" === c.nodeName || \"MENU\" === c.nodeName) return c;var f,\n g,\n h,\n i,\n j,\n k,\n l,\n m,\n n,\n o = c.ownerDocument,\n p = b(o, d),\n q = c.querySelectorAll(\"br\"),\n r = q.length;for (n = 0; r > n; n++) {\n for (i = q[n]; (j = i.parentNode) && j !== c && j.lastChild === i;) {\n if (\"block\" === wysihtml5.dom.getStyle(\"display\").from(j)) {\n j.removeChild(i);break;\n }wysihtml5.dom.insert(i).after(i.parentNode);\n }\n }for (f = wysihtml5.lang.array(c.childNodes).get(), g = f.length, n = 0; g > n; n++) {\n m = m || a(o, p), h = f[n], k = \"block\" === wysihtml5.dom.getStyle(\"display\").from(h), l = \"BR\" === h.nodeName, !k || e && wysihtml5.dom.hasClass(h, e) ? l ? m = m.firstChild ? null : m : m.appendChild(h) : (m = m.firstChild ? a(o, p) : m, m.appendChild(h), m = null);\n }return 0 === f.length && a(o, p), c.parentNode.replaceChild(p, c), p;\n }return c;\n}(), wysihtml5.dom.copyAttributes = function (a) {\n return { from: function from(b) {\n return { to: function to(c) {\n for (var d, e = 0, f = a.length; f > e; e++) {\n d = a[e], void 0 !== b[d] && \"\" !== b[d] && (c[d] = b[d]);\n }return { andTo: arguments.callee };\n } };\n } };\n}, function (a) {\n var b = [\"-webkit-box-sizing\", \"-moz-box-sizing\", \"-ms-box-sizing\", \"box-sizing\"],\n c = function c(b) {\n return d(b) ? parseInt(a.getStyle(\"width\").from(b), 10) < b.offsetWidth : !1;\n },\n d = function d(c) {\n for (var d = 0, e = b.length; e > d; d++) {\n if (\"border-box\" === a.getStyle(b[d]).from(c)) return b[d];\n }\n };a.copyStyles = function (d) {\n return { from: function from(e) {\n c(e) && (d = wysihtml5.lang.array(d).without(b));for (var f, g = \"\", h = d.length, i = 0; h > i; i++) {\n f = d[i], g += f + \":\" + a.getStyle(f).from(e) + \";\";\n }return { to: function to(b) {\n return a.setStyles(g).on(b), { andTo: arguments.callee };\n } };\n } };\n };\n}(wysihtml5.dom), function (a) {\n a.dom.delegate = function (b, c, d, e) {\n return a.dom.observe(b, d, function (d) {\n for (var f = d.target, g = a.lang.array(b.querySelectorAll(c)); f && f !== b;) {\n if (g.contains(f)) {\n e.call(f, d);break;\n }f = f.parentNode;\n }\n });\n };\n}(wysihtml5), function (a) {\n a.dom.domNode = function (b) {\n var c = [a.ELEMENT_NODE, a.TEXT_NODE],\n d = function d(b) {\n return b.nodeType === a.TEXT_NODE && /^\\s*$/g.test(b.data);\n };return { prev: function prev(e) {\n var f = b.previousSibling,\n g = e && e.nodeTypes ? e.nodeTypes : c;return f ? !a.lang.array(g).contains(f.nodeType) || e && e.ignoreBlankTexts && d(f) ? a.dom.domNode(f).prev(e) : f : null;\n }, next: function next(e) {\n var f = b.nextSibling,\n g = e && e.nodeTypes ? e.nodeTypes : c;return f ? !a.lang.array(g).contains(f.nodeType) || e && e.ignoreBlankTexts && d(f) ? a.dom.domNode(f).next(e) : f : null;\n } };\n };\n}(wysihtml5), wysihtml5.dom.getAsDom = function () {\n var a = function a(_a, b) {\n var c = b.createElement(\"div\");c.style.display = \"none\", b.body.appendChild(c);try {\n c.innerHTML = _a;\n } catch (d) {}return b.body.removeChild(c), c;\n },\n b = function b(a) {\n if (!a._wysihtml5_supportsHTML5Tags) {\n for (var b = 0, d = c.length; d > b; b++) {\n a.createElement(c[b]);\n }a._wysihtml5_supportsHTML5Tags = !0;\n }\n },\n c = [\"abbr\", \"article\", \"aside\", \"audio\", \"bdi\", \"canvas\", \"command\", \"datalist\", \"details\", \"figcaption\", \"figure\", \"footer\", \"header\", \"hgroup\", \"keygen\", \"mark\", \"meter\", \"nav\", \"output\", \"progress\", \"rp\", \"rt\", \"ruby\", \"svg\", \"section\", \"source\", \"summary\", \"time\", \"track\", \"video\", \"wbr\"];return function (c, d) {\n d = d || document;var e;return \"object\" == (typeof c === \"undefined\" ? \"undefined\" : _typeof(c)) && c.nodeType ? (e = d.createElement(\"div\"), e.appendChild(c)) : wysihtml5.browser.supportsHTML5Tags(d) ? (e = d.createElement(\"div\"), e.innerHTML = c) : (b(d), e = a(c, d)), e;\n };\n}(), wysihtml5.dom.getParentElement = function () {\n function a(a, b) {\n return b && b.length ? \"string\" == typeof b ? a === b : wysihtml5.lang.array(b).contains(a) : !0;\n }function b(a) {\n return a.nodeType === wysihtml5.ELEMENT_NODE;\n }function c(a, b, c) {\n var d = (a.className || \"\").match(c) || [];return b ? d[d.length - 1] === b : !!d.length;\n }function d(a, b, c) {\n var d = (a.getAttribute(\"style\") || \"\").match(c) || [];return b ? d[d.length - 1] === b : !!d.length;\n }return function (e, f, g, h) {\n var i = f.cssStyle || f.styleRegExp,\n j = f.className || f.classRegExp;for (g = g || 50; g-- && e && \"BODY\" !== e.nodeName && (!h || e !== h);) {\n if (b(e) && a(e.nodeName, f.nodeName) && (!i || d(e, f.cssStyle, f.styleRegExp)) && (!j || c(e, f.className, f.classRegExp))) return e;e = e.parentNode;\n }return null;\n };\n}(), wysihtml5.dom.getStyle = function () {\n function a(a) {\n return a.replace(c, function (a) {\n return a.charAt(1).toUpperCase();\n });\n }var b = { \"float\": \"styleFloat\" in document.createElement(\"div\").style ? \"styleFloat\" : \"cssFloat\" },\n c = /\\-[a-z]/g;return function (c) {\n return { from: function from(d) {\n var e, f, g, h, i, j, k, l, m;if (d.nodeType === wysihtml5.ELEMENT_NODE) {\n if (e = d.ownerDocument, f = b[c] || a(c), g = d.style, h = d.currentStyle, i = g[f], i) return i;if (h) try {\n return h[f];\n } catch (n) {}return j = e.defaultView || e.parentWindow, k = (\"height\" === c || \"width\" === c) && \"TEXTAREA\" === d.nodeName, j.getComputedStyle ? (k && (l = g.overflow, g.overflow = \"hidden\"), m = j.getComputedStyle(d, null).getPropertyValue(c), k && (g.overflow = l || \"\"), m) : void 0;\n }\n } };\n };\n}(), wysihtml5.dom.getTextNodes = function (a, b) {\n var c = [];for (a = a.firstChild; a; a = a.nextSibling) {\n 3 == a.nodeType ? b && /^\\s*$/.test(a.innerText || a.textContent) || c.push(a) : c = c.concat(wysihtml5.dom.getTextNodes(a, b));\n }return c;\n}, wysihtml5.dom.hasElementWithTagName = function () {\n function a(a) {\n return a._wysihtml5_identifier || (a._wysihtml5_identifier = c++);\n }var b = {},\n c = 1;return function (c, d) {\n var e = a(c) + \":\" + d,\n f = b[e];return f || (f = b[e] = c.getElementsByTagName(d)), f.length > 0;\n };\n}(), function (a) {\n function b(a) {\n return a._wysihtml5_identifier || (a._wysihtml5_identifier = d++);\n }var c = {},\n d = 1;a.dom.hasElementWithClassName = function (d, e) {\n if (!a.browser.supportsNativeGetElementsByClassName()) return !!d.querySelector(\".\" + e);var f = b(d) + \":\" + e,\n g = c[f];return g || (g = c[f] = d.getElementsByClassName(e)), g.length > 0;\n };\n}(wysihtml5), wysihtml5.dom.insert = function (a) {\n return { after: function after(b) {\n b.parentNode.insertBefore(a, b.nextSibling);\n }, before: function before(b) {\n b.parentNode.insertBefore(a, b);\n }, into: function into(b) {\n b.appendChild(a);\n } };\n}, wysihtml5.dom.insertCSS = function (a) {\n return a = a.join(\"\\n\"), { into: function into(b) {\n var c,\n d,\n e = b.createElement(\"style\");return e.type = \"text/css\", e.styleSheet ? e.styleSheet.cssText = a : e.appendChild(b.createTextNode(a)), c = b.querySelector(\"head link\"), c ? (c.parentNode.insertBefore(e, c), void 0) : (d = b.querySelector(\"head\"), d && d.appendChild(e), void 0);\n } };\n}, function (a) {\n a.dom.lineBreaks = function (b) {\n function c(a) {\n return \"BR\" === a.nodeName;\n }function d(b) {\n return c(b) ? !0 : \"block\" === a.dom.getStyle(\"display\").from(b) ? !0 : !1;\n }return { add: function add() {\n var c = b.ownerDocument,\n e = a.dom.domNode(b).next({ ignoreBlankTexts: !0 }),\n f = a.dom.domNode(b).prev({ ignoreBlankTexts: !0 });e && !d(e) && a.dom.insert(c.createElement(\"br\")).after(b), f && !d(f) && a.dom.insert(c.createElement(\"br\")).before(b);\n }, remove: function remove() {\n var d = a.dom.domNode(b).next({ ignoreBlankTexts: !0 }),\n e = a.dom.domNode(b).prev({ ignoreBlankTexts: !0 });d && c(d) && d.parentNode.removeChild(d), e && c(e) && e.parentNode.removeChild(e);\n } };\n };\n}(wysihtml5), wysihtml5.dom.observe = function (a, b, c) {\n b = \"string\" == typeof b ? [b] : b;for (var d, e, f = 0, g = b.length; g > f; f++) {\n e = b[f], a.addEventListener ? a.addEventListener(e, c, !1) : (d = function d(b) {\n \"target\" in b || (b.target = b.srcElement), b.preventDefault = b.preventDefault || function () {\n this.returnValue = !1;\n }, b.stopPropagation = b.stopPropagation || function () {\n this.cancelBubble = !0;\n }, c.call(a, b);\n }, a.attachEvent(\"on\" + e, d));\n }return { stop: function stop() {\n for (var e, f = 0, g = b.length; g > f; f++) {\n e = b[f], a.removeEventListener ? a.removeEventListener(e, c, !1) : a.detachEvent(\"on\" + e, d);\n }\n } };\n}, wysihtml5.dom.parse = function (a, b) {\n function c(a, b) {\n var c, f, g, h, i, j, k, l, m;for (wysihtml5.lang.object(t).merge(s).merge(b.rules).get(), c = b.context || a.ownerDocument || document, f = c.createDocumentFragment(), g = \"string\" == typeof a, h = !1, b.clearInternals === !0 && (h = !0), i = g ? wysihtml5.dom.getAsDom(a, c) : a, t.selectors && e(i, t.selectors); i.firstChild;) {\n k = i.firstChild, j = d(k, b.cleanUp, h, b.uneditableClass), j && f.appendChild(j), k !== j && i.removeChild(k);\n }if (b.unjoinNbsps) for (l = wysihtml5.dom.getTextNodes(f), m = l.length; m--;) {\n l[m].nodeValue = l[m].nodeValue.replace(/([\\S\\u00A0])\\u00A0/gi, \"$1 \");\n }return i.innerHTML = \"\", i.appendChild(f), g ? wysihtml5.quirks.getCorrectInnerHTML(i) : i;\n }function d(a, b, c, e) {\n var f,\n g,\n h,\n i = a.nodeType,\n j = a.childNodes,\n k = j.length,\n l = p[i],\n m = 0;if (e && 1 === i && wysihtml5.dom.hasClass(a, e)) return a;if (g = l && l(a, c), !g) {\n if (g === !1) {\n for (f = a.ownerDocument.createDocumentFragment(), m = k; m--;) {\n j[m] && (h = d(j[m], b, c, e), h && (j[m] === h && m--, f.insertBefore(h, f.firstChild)));\n }return \"block\" === wysihtml5.dom.getStyle(\"display\").from(a) && f.appendChild(a.ownerDocument.createElement(\"br\")), wysihtml5.lang.array([\"div\", \"pre\", \"p\", \"table\", \"td\", \"th\", \"ul\", \"ol\", \"li\", \"dd\", \"dl\", \"footer\", \"header\", \"section\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"]).contains(a.nodeName.toLowerCase()) && a.parentNode.lastChild !== a && (a.nextSibling && 3 === a.nextSibling.nodeType && /^\\s/.test(a.nextSibling.nodeValue) || f.appendChild(a.ownerDocument.createTextNode(\" \"))), f.normalize && f.normalize(), f;\n }return null;\n }for (m = 0; k > m; m++) {\n j[m] && (h = d(j[m], b, c, e), h && (j[m] === h && m--, g.appendChild(h)));\n }if (b && g.nodeName.toLowerCase() === q && (!g.childNodes.length || /^\\s*$/gi.test(g.innerHTML) && (c || \"_wysihtml5-temp-placeholder\" !== a.className && \"rangySelectionBoundary\" !== a.className) || !g.attributes.length)) {\n for (f = g.ownerDocument.createDocumentFragment(); g.firstChild;) {\n f.appendChild(g.firstChild);\n }return f.normalize && f.normalize(), f;\n }return g.normalize && g.normalize(), g;\n }function e(a, b) {\n var c, d, e, f;for (c in b) {\n if (b.hasOwnProperty(c)) for (wysihtml5.lang.object(b[c]).isFunction() ? d = b[c] : \"string\" == typeof b[c] && z[b[c]] && (d = z[b[c]]), e = a.querySelectorAll(c), f = e.length; f--;) {\n d(e[f]);\n }\n }\n }function f(a, b) {\n var c,\n d,\n e,\n f = t.tags,\n h = a.nodeName.toLowerCase(),\n j = a.scopeName;if (a._wysihtml5) return null;if (a._wysihtml5 = 1, \"wysihtml5-temp\" === a.className) return null;if (j && \"HTML\" != j && (h = j + \":\" + h), \"outerHTML\" in a && (wysihtml5.browser.autoClosesUnclosedTags() || \"P\" !== a.nodeName || \"</p>\" === a.outerHTML.slice(-4).toLowerCase() || (h = \"div\")), h in f) {\n if (c = f[h], !c || c.remove) return null;if (c.unwrap) return !1;c = \"string\" == typeof c ? { rename_tag: c } : c;\n } else {\n if (!a.firstChild) return null;c = { rename_tag: q };\n }if (c.one_of_type && !g(a, t, c.one_of_type, b)) {\n if (!c.remove_action) return null;if (\"unwrap\" === c.remove_action) return !1;if (\"rename\" !== c.remove_action) return null;e = c.remove_action_rename_to || q;\n }return d = a.ownerDocument.createElement(e || c.rename_tag || h), m(a, d, c, b), i(a, d, c), a = null, d.normalize && d.normalize(), d;\n }function g(a, b, c, d) {\n var e, f;if (\"SPAN\" === a.nodeName && !d && (\"_wysihtml5-temp-placeholder\" === a.className || \"rangySelectionBoundary\" === a.className)) return !0;for (f in c) {\n if (c.hasOwnProperty(f) && b.type_definitions && b.type_definitions[f] && (e = b.type_definitions[f], h(a, e))) return !0;\n }return !1;\n }function h(a, b) {\n var c,\n d,\n e,\n f,\n g,\n h,\n i,\n j,\n k = a.getAttribute(\"class\"),\n l = a.getAttribute(\"style\");if (b.methods) for (h in b.methods) {\n if (b.methods.hasOwnProperty(h) && y[h] && y[h](a)) return !0;\n }if (k && b.classes) for (k = k.replace(/^\\s+/g, \"\").replace(/\\s+$/g, \"\").split(r), c = k.length, i = 0; c > i; i++) {\n if (b.classes[k[i]]) return !0;\n }if (l && b.styles) {\n l = l.split(\";\");for (d in b.styles) {\n if (b.styles.hasOwnProperty(d)) for (j = l.length; j--;) {\n if (g = l[j].split(\":\"), g[0].replace(/\\s/g, \"\").toLowerCase() === d && (b.styles[d] === !0 || 1 === b.styles[d] || wysihtml5.lang.array(b.styles[d]).contains(g[1].replace(/\\s/g, \"\").toLowerCase()))) return !0;\n }\n }\n }if (b.attrs) for (e in b.attrs) {\n if (b.attrs.hasOwnProperty(e) && (f = wysihtml5.dom.getAttribute(a, e), \"string\" == typeof f && f.search(b.attrs[e]) > -1)) return !0;\n }return !1;\n }function i(a, b, c) {\n var d, e;if (c && c.keep_styles) for (d in c.keep_styles) {\n if (c.keep_styles.hasOwnProperty(d)) {\n if (e = \"float\" === d ? a.style.styleFloat || a.style.cssFloat : a.style[d], c.keep_styles[d] instanceof RegExp && !c.keep_styles[d].test(e)) continue;\"float\" === d ? b.style[a.style.styleFloat ? \"styleFloat\" : \"cssFloat\"] = e : a.style[d] && (b.style[d] = e);\n }\n }\n }function j(a, b) {\n var c,\n d = [];for (c in b) {\n b.hasOwnProperty(c) && 0 === c.indexOf(a) && d.push(c);\n }return d;\n }function k(a, b, c, d) {\n var e,\n f = v[c];return f && (b || \"alt\" === a && \"IMG\" == d) && (e = f(b), \"string\" == typeof e) ? e : !1;\n }function l(a, b) {\n var c,\n d,\n e,\n f,\n g,\n h = wysihtml5.lang.object(t.attributes || {}).clone(),\n i = wysihtml5.lang.object(h).merge(wysihtml5.lang.object(b || {}).clone()).get(),\n l = {},\n m = wysihtml5.dom.getAttributes(a);for (c in i) {\n if (/\\*$/.test(c)) for (e = j(c.slice(0, -1), m), f = 0, g = e.length; g > f; f++) {\n d = k(e[f], m[e[f]], i[c], a.nodeName), d !== !1 && (l[e[f]] = d);\n } else d = k(c, m[c], i[c], a.nodeName), d !== !1 && (l[c] = d);\n }return l;\n }function m(a, b, c, d) {\n var e,\n f,\n g,\n h,\n i,\n j = {},\n k = c.set_class,\n m = c.add_class,\n n = c.add_style,\n o = c.set_attributes,\n p = t.classes,\n q = 0,\n s = [],\n u = [],\n v = [],\n y = [];if (o && (j = wysihtml5.lang.object(o).clone()), j = wysihtml5.lang.object(j).merge(l(a, c.check_attributes)).get(), k && s.push(k), m) for (h in m) {\n i = x[m[h]], i && (g = i(wysihtml5.dom.getAttribute(a, h)), \"string\" == typeof g && s.push(g));\n }if (n) for (h in n) {\n i = w[n[h]], i && (newStyle = i(wysihtml5.dom.getAttribute(a, h)), \"string\" == typeof newStyle && u.push(newStyle));\n }if (\"string\" == typeof p && \"any\" === p && a.getAttribute(\"class\")) {\n if (t.classes_blacklist) {\n for (y = a.getAttribute(\"class\"), y && (s = s.concat(y.split(r))), e = s.length; e > q; q++) {\n f = s[q], t.classes_blacklist[f] || v.push(f);\n }v.length && (j[\"class\"] = wysihtml5.lang.array(v).unique().join(\" \"));\n } else j[\"class\"] = a.getAttribute(\"class\");\n } else {\n for (d || (p[\"_wysihtml5-temp-placeholder\"] = 1, p._rangySelectionBoundary = 1, p[\"wysiwyg-tmp-selected-cell\"] = 1), y = a.getAttribute(\"class\"), y && (s = s.concat(y.split(r))), e = s.length; e > q; q++) {\n f = s[q], p[f] && v.push(f);\n }v.length && (j[\"class\"] = wysihtml5.lang.array(v).unique().join(\" \"));\n }j[\"class\"] && d && (j[\"class\"] = j[\"class\"].replace(\"wysiwyg-tmp-selected-cell\", \"\"), /^\\s*$/g.test(j[\"class\"]) && delete j[\"class\"]), u.length && (j.style = wysihtml5.lang.array(u).unique().join(\" \"));for (h in j) {\n try {\n b.setAttribute(h, j[h]);\n } catch (z) {}\n }j.src && (void 0 !== j.width && b.setAttribute(\"width\", j.width), void 0 !== j.height && b.setAttribute(\"height\", j.height));\n }function n(a) {\n var b,\n c = a.nextSibling;return c && c.nodeType === wysihtml5.TEXT_NODE ? (c.data = a.data.replace(u, \"\") + c.data.replace(u, \"\"), void 0) : (b = a.data.replace(u, \"\"), a.ownerDocument.createTextNode(b));\n }function o(a) {\n return t.comments ? a.ownerDocument.createComment(a.nodeValue) : void 0;\n }var p = { 1: f, 3: n, 8: o },\n q = \"span\",\n r = /\\s+/,\n s = { tags: {}, classes: {} },\n t = {},\n u = /\\uFEFF/g,\n v = { url: function () {\n var a = /^https?:\\/\\//i;return function (b) {\n return b && b.match(a) ? b.replace(a, function (a) {\n return a.toLowerCase();\n }) : null;\n };\n }(), src: function () {\n var a = /^(\\/|https?:\\/\\/)/i;return function (b) {\n return b && b.match(a) ? b.replace(a, function (a) {\n return a.toLowerCase();\n }) : null;\n };\n }(), href: function () {\n var a = /^(#|\\/|https?:\\/\\/|mailto:)/i;return function (b) {\n return b && b.match(a) ? b.replace(a, function (a) {\n return a.toLowerCase();\n }) : null;\n };\n }(), alt: function () {\n var a = /[^ a-z0-9_\\-]/gi;return function (b) {\n return b ? b.replace(a, \"\") : \"\";\n };\n }(), numbers: function () {\n var a = /\\D/g;return function (b) {\n return b = (b || \"\").replace(a, \"\"), b || null;\n };\n }(), any: function () {\n return function (a) {\n return a;\n };\n }() },\n w = { align_text: function () {\n var a = { left: \"text-align: left;\", right: \"text-align: right;\", center: \"text-align: center;\" };return function (b) {\n return a[(b + \"\").toLowerCase()];\n };\n }() },\n x = { align_img: function () {\n var a = { left: \"wysiwyg-float-left\", right: \"wysiwyg-float-right\" };return function (b) {\n return a[(b + \"\").toLowerCase()];\n };\n }(), align_text: function () {\n var a = { left: \"wysiwyg-text-align-left\", right: \"wysiwyg-text-align-right\", center: \"wysiwyg-text-align-center\", justify: \"wysiwyg-text-align-justify\" };return function (b) {\n return a[(b + \"\").toLowerCase()];\n };\n }(), clear_br: function () {\n var a = { left: \"wysiwyg-clear-left\", right: \"wysiwyg-clear-right\", both: \"wysiwyg-clear-both\", all: \"wysiwyg-clear-both\" };return function (b) {\n return a[(b + \"\").toLowerCase()];\n };\n }(), size_font: function () {\n var a = { 1: \"wysiwyg-font-size-xx-small\", 2: \"wysiwyg-font-size-small\", 3: \"wysiwyg-font-size-medium\", 4: \"wysiwyg-font-size-large\", 5: \"wysiwyg-font-size-x-large\", 6: \"wysiwyg-font-size-xx-large\", 7: \"wysiwyg-font-size-xx-large\", \"-\": \"wysiwyg-font-size-smaller\", \"+\": \"wysiwyg-font-size-larger\" };return function (b) {\n return a[(b + \"\").charAt(0)];\n };\n }() },\n y = { has_visible_contet: function () {\n var a,\n b = [\"img\", \"video\", \"picture\", \"br\", \"script\", \"noscript\", \"style\", \"table\", \"iframe\", \"object\", \"embed\", \"audio\", \"svg\", \"input\", \"button\", \"select\", \"textarea\", \"canvas\"];return function (c) {\n if (a = (c.innerText || c.textContent).replace(/\\s/g, \"\"), a && a.length > 0) return !0;for (var d = b.length; d--;) {\n if (c.querySelector(b[d])) return !0;\n }return c.offsetWidth && c.offsetWidth > 0 && c.offsetHeight && c.offsetHeight > 0 ? !0 : !1;\n };\n }() },\n z = { unwrap: function unwrap(a) {\n wysihtml5.dom.unwrap(a);\n }, remove: function remove(a) {\n a.parentNode.removeChild(a);\n } };return c(a, b);\n}, wysihtml5.dom.removeEmptyTextNodes = function (a) {\n for (var b, c = wysihtml5.lang.array(a.childNodes).get(), d = c.length, e = 0; d > e; e++) {\n b = c[e], b.nodeType === wysihtml5.TEXT_NODE && \"\" === b.data && b.parentNode.removeChild(b);\n }\n}, wysihtml5.dom.renameElement = function (a, b) {\n for (var c, d = a.ownerDocument.createElement(b); c = a.firstChild;) {\n d.appendChild(c);\n }return wysihtml5.dom.copyAttributes([\"align\", \"className\"]).from(a).to(d), a.parentNode.replaceChild(d, a), d;\n}, wysihtml5.dom.replaceWithChildNodes = function (a) {\n if (a.parentNode) {\n if (!a.firstChild) return a.parentNode.removeChild(a), void 0;for (var b = a.ownerDocument.createDocumentFragment(); a.firstChild;) {\n b.appendChild(a.firstChild);\n }a.parentNode.replaceChild(b, a), a = b = null;\n }\n}, function (a) {\n function b(b) {\n return \"block\" === a.getStyle(\"display\").from(b);\n }function c(a) {\n return \"BR\" === a.nodeName;\n }function d(a) {\n var b = a.ownerDocument.createElement(\"br\");a.appendChild(b);\n }function e(a, e) {\n if (a.nodeName.match(/^(MENU|UL|OL)$/)) {\n var f,\n g,\n h,\n i,\n j,\n k,\n l = a.ownerDocument,\n m = l.createDocumentFragment(),\n n = wysihtml5.dom.domNode(a).prev({ ignoreBlankTexts: !0 });if (e) for (!n || b(n) || c(n) || d(m); k = a.firstElementChild || a.firstChild;) {\n for (g = k.lastChild; f = k.firstChild;) {\n h = f === g, i = h && !b(f) && !c(f), m.appendChild(f), i && d(m);\n }k.parentNode.removeChild(k);\n } else for (; k = a.firstElementChild || a.firstChild;) {\n if (k.querySelector && k.querySelector(\"div, p, ul, ol, menu, blockquote, h1, h2, h3, h4, h5, h6\")) for (; f = k.firstChild;) {\n m.appendChild(f);\n } else {\n for (j = l.createElement(\"p\"); f = k.firstChild;) {\n j.appendChild(f);\n }m.appendChild(j);\n }k.parentNode.removeChild(k);\n }a.parentNode.replaceChild(m, a);\n }\n }a.resolveList = e;\n}(wysihtml5.dom), function (a) {\n var b = document,\n c = [\"parent\", \"top\", \"opener\", \"frameElement\", \"frames\", \"localStorage\", \"globalStorage\", \"sessionStorage\", \"indexedDB\"],\n d = [\"open\", \"close\", \"openDialog\", \"showModalDialog\", \"alert\", \"confirm\", \"prompt\", \"openDatabase\", \"postMessage\", \"XMLHttpRequest\", \"XDomainRequest\"],\n e = [\"referrer\", \"write\", \"open\", \"close\"];a.dom.Sandbox = Base.extend({ constructor: function constructor(b, c) {\n this.callback = b || a.EMPTY_FUNCTION, this.config = a.lang.object({}).merge(c).get(), this.editableArea = this._createIframe();\n }, insertInto: function insertInto(a) {\n \"string\" == typeof a && (a = b.getElementById(a)), a.appendChild(this.editableArea);\n }, getIframe: function getIframe() {\n return this.editableArea;\n }, getWindow: function getWindow() {\n this._readyError();\n }, getDocument: function getDocument() {\n this._readyError();\n }, destroy: function destroy() {\n var a = this.getIframe();a.parentNode.removeChild(a);\n }, _readyError: function _readyError() {\n throw Error(\"wysihtml5.Sandbox: Sandbox iframe isn't loaded yet\");\n }, _createIframe: function _createIframe() {\n var c = this,\n d = b.createElement(\"iframe\");return d.className = \"wysihtml5-sandbox\", a.dom.setAttributes({ security: \"restricted\", allowtransparency: \"true\", frameborder: 0, width: 0, height: 0, marginwidth: 0, marginheight: 0 }).on(d), a.browser.throwsMixedContentWarningWhenIframeSrcIsEmpty() && (d.src = \"javascript:'<html></html>'\"), d.onload = function () {\n d.onreadystatechange = d.onload = null, c._onLoadIframe(d);\n }, d.onreadystatechange = function () {\n /loaded|complete/.test(d.readyState) && (d.onreadystatechange = d.onload = null, c._onLoadIframe(d));\n }, d;\n }, _onLoadIframe: function _onLoadIframe(f) {\n var g, h, i, j, k, l, m;if (a.dom.contains(b.documentElement, f)) {\n if (g = this, h = f.contentWindow, i = f.contentWindow.document, j = b.characterSet || b.charset || \"utf-8\", k = this._getHtml({ charset: j, stylesheets: this.config.stylesheets }), i.open(\"text/html\", \"replace\"), i.write(k), i.close(), this.getWindow = function () {\n return f.contentWindow;\n }, this.getDocument = function () {\n return f.contentWindow.document;\n }, h.onerror = function (a, b, c) {\n throw Error(\"wysihtml5.Sandbox: \" + a, b, c);\n }, !a.browser.supportsSandboxedIframes()) {\n for (l = 0, m = c.length; m > l; l++) {\n this._unset(h, c[l]);\n }for (l = 0, m = d.length; m > l; l++) {\n this._unset(h, d[l], a.EMPTY_FUNCTION);\n }for (l = 0, m = e.length; m > l; l++) {\n this._unset(i, e[l]);\n }this._unset(i, \"cookie\", \"\", !0);\n }this.loaded = !0, setTimeout(function () {\n g.callback(g);\n }, 0);\n }\n }, _getHtml: function _getHtml(b) {\n var c,\n d = b.stylesheets,\n e = \"\",\n f = 0;if (d = \"string\" == typeof d ? [d] : d, d) for (c = d.length; c > f; f++) {\n e += '<link rel=\"stylesheet\" href=\"' + d[f] + '\">';\n }return b.stylesheets = e, a.lang.string('<!DOCTYPE html><html><head><meta charset=\"#{charset}\">#{stylesheets}</head><body></body></html>').interpolate(b);\n }, _unset: function _unset(b, c, d, e) {\n try {\n b[c] = d;\n } catch (f) {}try {\n b.__defineGetter__(c, function () {\n return d;\n });\n } catch (f) {}if (e) try {\n b.__defineSetter__(c, function () {});\n } catch (f) {}if (!a.browser.crashesWhenDefineProperty(c)) try {\n var g = { get: function get() {\n return d;\n } };e && (g.set = function () {}), Object.defineProperty(b, c, g);\n } catch (f) {}\n } });\n}(wysihtml5), function (a) {\n var b = document;a.dom.ContentEditableArea = Base.extend({ getContentEditable: function getContentEditable() {\n return this.element;\n }, getWindow: function getWindow() {\n return this.element.ownerDocument.defaultView;\n }, getDocument: function getDocument() {\n return this.element.ownerDocument;\n }, constructor: function constructor(b, c, d) {\n this.callback = b || a.EMPTY_FUNCTION, this.config = a.lang.object({}).merge(c).get(), this.element = d ? this._bindElement(d) : this._createElement();\n }, _createElement: function _createElement() {\n var a = b.createElement(\"div\");return a.className = \"wysihtml5-sandbox\", this._loadElement(a), a;\n }, _bindElement: function _bindElement(a) {\n return a.className = a.className && \"\" != a.className ? a.className + \" wysihtml5-sandbox\" : \"wysihtml5-sandbox\", this._loadElement(a, !0), a;\n }, _loadElement: function _loadElement(a, b) {\n var c,\n d = this;b || (c = this._getHtml(), a.innerHTML = c), this.getWindow = function () {\n return a.ownerDocument.defaultView;\n }, this.getDocument = function () {\n return a.ownerDocument;\n }, this.loaded = !0, setTimeout(function () {\n d.callback(d);\n }, 0);\n }, _getHtml: function _getHtml() {\n return \"\";\n } });\n}(wysihtml5), function () {\n var a = { className: \"class\" };wysihtml5.dom.setAttributes = function (b) {\n return { on: function on(c) {\n for (var d in b) {\n c.setAttribute(a[d] || d, b[d]);\n }\n } };\n };\n}(), wysihtml5.dom.setStyles = function (a) {\n return { on: function on(b) {\n var c,\n d = b.style;if (\"string\" == typeof a) return d.cssText += \";\" + a, void 0;for (c in a) {\n \"float\" === c ? (d.cssFloat = a[c], d.styleFloat = a[c]) : d[c] = a[c];\n }\n } };\n}, function (a) {\n a.simulatePlaceholder = function (b, c, d) {\n var e = \"placeholder\",\n f = function f() {\n var b = c.element.offsetWidth > 0 && c.element.offsetHeight > 0;c.hasPlaceholderSet() && (c.clear(), c.element.focus(), b && setTimeout(function () {\n var a = c.selection.getSelection();a.focusNode && a.anchorNode || c.selection.selectNode(c.element.firstChild || c.element);\n }, 0)), c.placeholderSet = !1, a.removeClass(c.element, e);\n },\n g = function g() {\n c.isEmpty() && (c.placeholderSet = !0, c.setValue(d), a.addClass(c.element, e));\n };b.on(\"set_placeholder\", g).on(\"unset_placeholder\", f).on(\"focus:composer\", f).on(\"paste:composer\", f).on(\"blur:composer\", g), g();\n };\n}(wysihtml5.dom), function (a) {\n var b = document.documentElement;\"textContent\" in b ? (a.setTextContent = function (a, b) {\n a.textContent = b;\n }, a.getTextContent = function (a) {\n return a.textContent;\n }) : \"innerText\" in b ? (a.setTextContent = function (a, b) {\n a.innerText = b;\n }, a.getTextContent = function (a) {\n return a.innerText;\n }) : (a.setTextContent = function (a, b) {\n a.nodeValue = b;\n }, a.getTextContent = function (a) {\n return a.nodeValue;\n });\n}(wysihtml5.dom), wysihtml5.dom.getAttribute = function (a, b) {\n var c,\n d,\n e,\n f = !wysihtml5.browser.supportsGetAttributeCorrectly();return b = b.toLowerCase(), c = a.nodeName, \"IMG\" == c && \"src\" == b && wysihtml5.dom.isLoadedImage(a) === !0 ? a.src : f && \"outerHTML\" in a ? (d = a.outerHTML.toLowerCase(), e = -1 != d.indexOf(\" \" + b + \"=\"), e ? a.getAttribute(b) : null) : a.getAttribute(b);\n}, wysihtml5.dom.getAttributes = function (a) {\n var b,\n c = !wysihtml5.browser.supportsGetAttributeCorrectly(),\n d = a.nodeName,\n e = [];for (b in a.attributes) {\n (a.attributes.hasOwnProperty && a.attributes.hasOwnProperty(b) || !a.attributes.hasOwnProperty && Object.prototype.hasOwnProperty.call(a.attributes, b)) && a.attributes[b].specified && (\"IMG\" == d && \"src\" == a.attributes[b].name.toLowerCase() && wysihtml5.dom.isLoadedImage(a) === !0 ? e.src = a.src : wysihtml5.lang.array([\"rowspan\", \"colspan\"]).contains(a.attributes[b].name.toLowerCase()) && c ? 1 !== a.attributes[b].value && (e[a.attributes[b].name] = a.attributes[b].value) : e[a.attributes[b].name] = a.attributes[b].value);\n }return e;\n}, wysihtml5.dom.isLoadedImage = function (a) {\n try {\n return a.complete && !a.mozMatchesSelector(\":-moz-broken\");\n } catch (b) {\n if (a.complete && \"complete\" === a.readyState) return !0;\n }\n}, function (a) {\n function b(a, b) {\n var c,\n d,\n e,\n f,\n g = [];for (d = 0, e = a.length; e > d; d++) {\n if (c = a[d].querySelectorAll(b), c) for (f = c.length; f--; g.unshift(c[f])) {}\n }return g;\n }function d(a) {\n a.parentNode.removeChild(a);\n }function e(a, b) {\n a.parentNode.insertBefore(b, a.nextSibling);\n }function f(a, b) {\n for (var c = a.nextSibling; 1 != c.nodeType;) {\n if (c = c.nextSibling, !b || b == c.tagName.toLowerCase()) return c;\n }return null;\n }var g = a.dom,\n h = function h(a) {\n this.el = a, this.isColspan = !1, this.isRowspan = !1, this.firstCol = !0, this.lastCol = !0, this.firstRow = !0, this.lastRow = !0, this.isReal = !0, this.spanCollection = [], this.modified = !1;\n },\n i = function i(a, b) {\n a ? (this.cell = a, this.table = g.getParentElement(a, { nodeName: [\"TABLE\"] })) : b && (this.table = b, this.cell = this.table.querySelectorAll(\"th, td\")[0]);\n };i.prototype = { addSpannedCellToMap: function addSpannedCellToMap(a, b, c, d, e, f) {\n var g,\n i,\n j = [],\n k = c + (f ? parseInt(f, 10) - 1 : 0),\n l = d + (e ? parseInt(e, 10) - 1 : 0);for (g = c; k >= g; g++) {\n for (void 0 === b[g] && (b[g] = []), i = d; l >= i; i++) {\n b[g][i] = new h(a), b[g][i].isColspan = e && parseInt(e, 10) > 1, b[g][i].isRowspan = f && parseInt(f, 10) > 1, b[g][i].firstCol = i == d, b[g][i].lastCol = i == l, b[g][i].firstRow = g == c, b[g][i].lastRow = g == k, b[g][i].isReal = i == d && g == c, b[g][i].spanCollection = j, j.push(b[g][i]);\n }\n }\n }, setCellAsModified: function setCellAsModified(a) {\n if (a.modified = !0, a.spanCollection.length > 0) for (var b = 0, c = a.spanCollection.length; c > b; b++) {\n a.spanCollection[b].modified = !0;\n }\n }, setTableMap: function setTableMap() {\n var a,\n b,\n c,\n d,\n e,\n f,\n i,\n j,\n k = [],\n l = this.getTableRows();for (a = 0; a < l.length; a++) {\n for (b = l[a], c = this.getRowCells(b), f = 0, void 0 === k[a] && (k[a] = []), d = 0; d < c.length; d++) {\n for (e = c[d]; void 0 !== k[a][f];) {\n f++;\n }i = g.getAttribute(e, \"colspan\"), j = g.getAttribute(e, \"rowspan\"), i || j ? (this.addSpannedCellToMap(e, k, a, f, i, j), f += i ? parseInt(i, 10) : 1) : (k[a][f] = new h(e), f++);\n }\n }return this.map = k, k;\n }, getRowCells: function getRowCells(c) {\n var d = this.table.querySelectorAll(\"table\"),\n e = d ? b(d, \"th, td\") : [],\n f = c.querySelectorAll(\"th, td\"),\n g = e.length > 0 ? a.lang.array(f).without(e) : f;return g;\n }, getTableRows: function getTableRows() {\n var c = this.table.querySelectorAll(\"table\"),\n d = c ? b(c, \"tr\") : [],\n e = this.table.querySelectorAll(\"tr\"),\n f = d.length > 0 ? a.lang.array(e).without(d) : e;return f;\n }, getMapIndex: function getMapIndex(a) {\n var b,\n c,\n d = this.map.length,\n e = this.map && this.map[0] ? this.map[0].length : 0;for (b = 0; d > b; b++) {\n for (c = 0; e > c; c++) {\n if (this.map[b][c].el === a) return { row: b, col: c };\n }\n }return !1;\n }, getElementAtIndex: function getElementAtIndex(a) {\n return this.setTableMap(), this.map[a.row] && this.map[a.row][a.col] && this.map[a.row][a.col].el ? this.map[a.row][a.col].el : null;\n }, getMapElsTo: function getMapElsTo(a) {\n var b,\n c,\n d,\n e,\n f,\n g,\n h = [];if (this.setTableMap(), this.idx_start = this.getMapIndex(this.cell), this.idx_end = this.getMapIndex(a), (this.idx_start.row > this.idx_end.row || this.idx_start.row == this.idx_end.row && this.idx_start.col > this.idx_end.col) && (b = this.idx_start, this.idx_start = this.idx_end, this.idx_end = b), this.idx_start.col > this.idx_end.col && (c = this.idx_start.col, this.idx_start.col = this.idx_end.col, this.idx_end.col = c), null != this.idx_start && null != this.idx_end) for (d = this.idx_start.row, e = this.idx_end.row; e >= d; d++) {\n for (f = this.idx_start.col, g = this.idx_end.col; g >= f; f++) {\n h.push(this.map[d][f].el);\n }\n }return h;\n }, orderSelectionEnds: function orderSelectionEnds(a) {\n var b, c;return this.setTableMap(), this.idx_start = this.getMapIndex(this.cell), this.idx_end = this.getMapIndex(a), (this.idx_start.row > this.idx_end.row || this.idx_start.row == this.idx_end.row && this.idx_start.col > this.idx_end.col) && (b = this.idx_start, this.idx_start = this.idx_end, this.idx_end = b), this.idx_start.col > this.idx_end.col && (c = this.idx_start.col, this.idx_start.col = this.idx_end.col, this.idx_end.col = c), { start: this.map[this.idx_start.row][this.idx_start.col].el, end: this.map[this.idx_end.row][this.idx_end.col].el };\n }, createCells: function createCells(a, b, c) {\n var d,\n e,\n f,\n g = this.table.ownerDocument,\n h = g.createDocumentFragment();for (e = 0; b > e; e++) {\n if (d = g.createElement(a), c) for (f in c) {\n c.hasOwnProperty(f) && d.setAttribute(f, c[f]);\n }d.appendChild(document.createTextNode(\" \")), h.appendChild(d);\n }return h;\n }, correctColIndexForUnreals: function correctColIndexForUnreals(a, b) {\n var c,\n d,\n e = this.map[b],\n f = -1;for (c = 0, d = a; a > c; c++) {\n e[c].isReal && f++;\n }return f;\n }, getLastNewCellOnRow: function getLastNewCellOnRow(a, b) {\n var c,\n d,\n e,\n f,\n g = this.getRowCells(a);for (e = 0, f = g.length; f > e; e++) {\n if (c = g[e], d = this.getMapIndex(c), d === !1 || void 0 !== b && d.row != b) return c;\n }return null;\n }, removeEmptyTable: function removeEmptyTable() {\n var a = this.table.querySelectorAll(\"td, th\");return a && 0 != a.length ? !1 : (d(this.table), !0);\n }, splitRowToCells: function splitRowToCells(a) {\n var b, c, d;a.isColspan && (b = parseInt(g.getAttribute(a.el, \"colspan\") || 1, 10), c = a.el.tagName.toLowerCase(), b > 1 && (d = this.createCells(c, b - 1), e(a.el, d)), a.el.removeAttribute(\"colspan\"));\n }, getRealRowEl: function getRealRowEl(a, b) {\n var c,\n d,\n e = null,\n f = null;for (b = b || this.idx, c = 0, d = this.map[b.row].length; d > c; c++) {\n if (f = this.map[b.row][c], f.isReal && (e = g.getParentElement(f.el, { nodeName: [\"TR\"] }), e)) return e;\n }return null === e && a && (e = g.getParentElement(this.map[b.row][b.col].el, { nodeName: [\"TR\"] }) || null), e;\n }, injectRowAt: function injectRowAt(a, b, c, d, f) {\n var h,\n i,\n j = this.getRealRowEl(!1, { row: a, col: b }),\n k = this.createCells(d, c);j ? (h = this.correctColIndexForUnreals(b, a), h >= 0 ? e(this.getRowCells(j)[h], k) : j.insertBefore(k, j.firstChild)) : (i = this.table.ownerDocument.createElement(\"tr\"), i.appendChild(k), e(g.getParentElement(f.el, { nodeName: [\"TR\"] }), i));\n }, canMerge: function canMerge(a) {\n var b, c, d, e, f, g;for (this.to = a, this.setTableMap(), this.idx_start = this.getMapIndex(this.cell), this.idx_end = this.getMapIndex(this.to), (this.idx_start.row > this.idx_end.row || this.idx_start.row == this.idx_end.row && this.idx_start.col > this.idx_end.col) && (b = this.idx_start, this.idx_start = this.idx_end, this.idx_end = b), this.idx_start.col > this.idx_end.col && (c = this.idx_start.col, this.idx_start.col = this.idx_end.col, this.idx_end.col = c), d = this.idx_start.row, e = this.idx_end.row; e >= d; d++) {\n for (f = this.idx_start.col, g = this.idx_end.col; g >= f; f++) {\n if (this.map[d][f].isColspan || this.map[d][f].isRowspan) return !1;\n }\n }return !0;\n }, decreaseCellSpan: function decreaseCellSpan(a, b) {\n var c = parseInt(g.getAttribute(a.el, b), 10) - 1;c >= 1 ? a.el.setAttribute(b, c) : (a.el.removeAttribute(b), \"colspan\" == b && (a.isColspan = !1), \"rowspan\" == b && (a.isRowspan = !1), a.firstCol = !0, a.lastCol = !0, a.firstRow = !0, a.lastRow = !0, a.isReal = !0);\n }, removeSurplusLines: function removeSurplusLines() {\n var a, b, c, e, f, h, i, j;if (this.setTableMap(), this.map) {\n for (c = 0, e = this.map.length; e > c; c++) {\n for (a = this.map[c], i = !0, f = 0, h = a.length; h > f; f++) {\n if (b = a[f], !(g.getAttribute(b.el, \"rowspan\") && parseInt(g.getAttribute(b.el, \"rowspan\"), 10) > 1 && b.firstRow !== !0)) {\n i = !1;break;\n }\n }if (i) for (f = 0; h > f; f++) {\n this.decreaseCellSpan(a[f], \"rowspan\");\n }\n }for (j = this.getTableRows(), c = 0, e = j.length; e > c; c++) {\n a = j[c], 0 == a.childNodes.length && /^\\s*$/.test(a.textContent || a.innerText) && d(a);\n }\n }\n }, fillMissingCells: function fillMissingCells() {\n var a,\n b,\n c,\n d = 0,\n f = 0,\n g = null;if (this.setTableMap(), this.map) {\n for (d = this.map.length, a = 0; d > a; a++) {\n this.map[a].length > f && (f = this.map[a].length);\n }for (b = 0; d > b; b++) {\n for (c = 0; f > c; c++) {\n this.map[b] && !this.map[b][c] && c > 0 && (this.map[b][c] = new h(this.createCells(\"td\", 1)), g = this.map[b][c - 1], g && g.el && g.el.parent && e(this.map[b][c - 1].el, this.map[b][c].el));\n }\n }\n }\n }, rectify: function rectify() {\n return this.removeEmptyTable() ? !1 : (this.removeSurplusLines(), this.fillMissingCells(), !0);\n }, unmerge: function unmerge() {\n var a, b, c, d, e, f;if (this.rectify() && (this.setTableMap(), this.idx = this.getMapIndex(this.cell), this.idx)) {\n if (a = this.map[this.idx.row][this.idx.col], b = g.getAttribute(a.el, \"colspan\") ? parseInt(g.getAttribute(a.el, \"colspan\"), 10) : 1, c = a.el.tagName.toLowerCase(), a.isRowspan) {\n if (d = parseInt(g.getAttribute(a.el, \"rowspan\"), 10), d > 1) for (e = 1, f = d - 1; f >= e; e++) {\n this.injectRowAt(this.idx.row + e, this.idx.col, b, c, a);\n }a.el.removeAttribute(\"rowspan\");\n }this.splitRowToCells(a);\n }\n }, merge: function merge(a) {\n var b, c, e, f, g, h;if (this.rectify()) if (this.canMerge(a)) {\n for (b = this.idx_end.row - this.idx_start.row + 1, c = this.idx_end.col - this.idx_start.col + 1, e = this.idx_start.row, f = this.idx_end.row; f >= e; e++) {\n for (g = this.idx_start.col, h = this.idx_end.col; h >= g; g++) {\n e == this.idx_start.row && g == this.idx_start.col ? (b > 1 && this.map[e][g].el.setAttribute(\"rowspan\", b), c > 1 && this.map[e][g].el.setAttribute(\"colspan\", c)) : (/^\\s*<br\\/?>\\s*$/.test(this.map[e][g].el.innerHTML.toLowerCase()) || (this.map[this.idx_start.row][this.idx_start.col].el.innerHTML += \" \" + this.map[e][g].el.innerHTML), d(this.map[e][g].el));\n }\n }this.rectify();\n } else window.console && void 0;\n }, collapseCellToNextRow: function collapseCellToNextRow(a) {\n var b,\n c,\n d,\n f = this.getMapIndex(a.el),\n h = f.row + 1,\n i = { row: h, col: f.col };h < this.map.length && (b = this.getRealRowEl(!1, i), null !== b && (c = this.correctColIndexForUnreals(i.col, i.row), c >= 0 ? e(this.getRowCells(b)[c], a.el) : (d = this.getLastNewCellOnRow(b, h), null !== d ? e(d, a.el) : b.insertBefore(a.el, b.firstChild)), parseInt(g.getAttribute(a.el, \"rowspan\"), 10) > 2 ? a.el.setAttribute(\"rowspan\", parseInt(g.getAttribute(a.el, \"rowspan\"), 10) - 1) : a.el.removeAttribute(\"rowspan\")));\n }, removeRowCell: function removeRowCell(a) {\n a.isReal ? a.isRowspan ? this.collapseCellToNextRow(a) : d(a.el) : parseInt(g.getAttribute(a.el, \"rowspan\"), 10) > 2 ? a.el.setAttribute(\"rowspan\", parseInt(g.getAttribute(a.el, \"rowspan\"), 10) - 1) : a.el.removeAttribute(\"rowspan\");\n }, getRowElementsByCell: function getRowElementsByCell() {\n var a,\n b,\n c,\n d = [];if (this.setTableMap(), this.idx = this.getMapIndex(this.cell), this.idx !== !1) for (a = this.map[this.idx.row], b = 0, c = a.length; c > b; b++) {\n a[b].isReal && d.push(a[b].el);\n }return d;\n }, getColumnElementsByCell: function getColumnElementsByCell() {\n var a,\n b,\n c = [];if (this.setTableMap(), this.idx = this.getMapIndex(this.cell), this.idx !== !1) for (a = 0, b = this.map.length; b > a; a++) {\n this.map[a][this.idx.col] && this.map[a][this.idx.col].isReal && c.push(this.map[a][this.idx.col].el);\n }return c;\n }, removeRow: function removeRow() {\n var a,\n b,\n c,\n e = g.getParentElement(this.cell, { nodeName: [\"TR\"] });if (e) {\n if (this.setTableMap(), this.idx = this.getMapIndex(this.cell), this.idx !== !1) for (a = this.map[this.idx.row], b = 0, c = a.length; c > b; b++) {\n a[b].modified || (this.setCellAsModified(a[b]), this.removeRowCell(a[b]));\n }d(e);\n }\n }, removeColCell: function removeColCell(a) {\n a.isColspan ? parseInt(g.getAttribute(a.el, \"colspan\"), 10) > 2 ? a.el.setAttribute(\"colspan\", parseInt(g.getAttribute(a.el, \"colspan\"), 10) - 1) : a.el.removeAttribute(\"colspan\") : a.isReal && d(a.el);\n }, removeColumn: function removeColumn() {\n if (this.setTableMap(), this.idx = this.getMapIndex(this.cell), this.idx !== !1) for (var a = 0, b = this.map.length; b > a; a++) {\n this.map[a][this.idx.col].modified || (this.setCellAsModified(this.map[a][this.idx.col]), this.removeColCell(this.map[a][this.idx.col]));\n }\n }, remove: function remove(a) {\n if (this.rectify()) {\n switch (a) {case \"row\":\n this.removeRow();break;case \"column\":\n this.removeColumn();}this.rectify();\n }\n }, addRow: function addRow(a) {\n var b,\n c,\n d,\n f,\n h,\n i = this.table.ownerDocument;if (this.setTableMap(), this.idx = this.getMapIndex(this.cell), \"below\" == a && g.getAttribute(this.cell, \"rowspan\") && (this.idx.row = this.idx.row + parseInt(g.getAttribute(this.cell, \"rowspan\"), 10) - 1), this.idx !== !1) {\n for (b = this.map[this.idx.row], c = i.createElement(\"tr\"), d = 0, f = b.length; f > d; d++) {\n b[d].modified || (this.setCellAsModified(b[d]), this.addRowCell(b[d], c, a));\n }switch (a) {case \"below\":\n e(this.getRealRowEl(!0), c);break;case \"above\":\n h = g.getParentElement(this.map[this.idx.row][this.idx.col].el, { nodeName: [\"TR\"] }), h && h.parentNode.insertBefore(c, h);}\n }\n }, addRowCell: function addRowCell(a, b, d) {\n var e = a.isColspan ? { colspan: g.getAttribute(a.el, \"colspan\") } : null;a.isReal ? \"above\" != d && a.isRowspan ? a.el.setAttribute(\"rowspan\", parseInt(g.getAttribute(a.el, \"rowspan\"), 10) + 1) : b.appendChild(this.createCells(\"td\", 1, e)) : \"above\" != d && a.isRowspan && a.lastRow ? b.appendChild(this.createCells(\"td\", 1, e)) : c.isRowspan && a.el.attr(\"rowspan\", parseInt(g.getAttribute(a.el, \"rowspan\"), 10) + 1);\n }, add: function add(a) {\n this.rectify() && ((\"below\" == a || \"above\" == a) && this.addRow(a), (\"before\" == a || \"after\" == a) && this.addColumn(a));\n }, addColCell: function addColCell(a, b, d) {\n var f,\n h = a.el.tagName.toLowerCase();switch (d) {case \"before\":\n f = !a.isColspan || a.firstCol;break;case \"after\":\n f = !a.isColspan || a.lastCol || a.isColspan && c.el == this.cell;}if (f) {\n switch (d) {case \"before\":\n a.el.parentNode.insertBefore(this.createCells(h, 1), a.el);break;case \"after\":\n e(a.el, this.createCells(h, 1));}a.isRowspan && this.handleCellAddWithRowspan(a, b + 1, d);\n } else a.el.setAttribute(\"colspan\", parseInt(g.getAttribute(a.el, \"colspan\"), 10) + 1);\n }, addColumn: function addColumn(a) {\n var b, c, d, e;if (this.setTableMap(), this.idx = this.getMapIndex(this.cell), \"after\" == a && g.getAttribute(this.cell, \"colspan\") && (this.idx.col = this.idx.col + parseInt(g.getAttribute(this.cell, \"colspan\"), 10) - 1), this.idx !== !1) for (d = 0, e = this.map.length; e > d; d++) {\n b = this.map[d], b[this.idx.col] && (c = b[this.idx.col], c.modified || (this.setCellAsModified(c), this.addColCell(c, d, a)));\n }\n }, handleCellAddWithRowspan: function handleCellAddWithRowspan(a, b, c) {\n var d,\n h,\n i,\n j,\n k = parseInt(g.getAttribute(this.cell, \"rowspan\"), 10) - 1,\n l = g.getParentElement(a.el, { nodeName: [\"TR\"] }),\n m = a.el.tagName.toLowerCase(),\n n = this.table.ownerDocument;for (j = 0; k > j; j++) {\n if (d = this.correctColIndexForUnreals(this.idx.col, b + j), l = f(l, \"tr\"), l) {\n if (d > 0) switch (c) {case \"before\":\n h = this.getRowCells(l), d > 0 && this.map[b + j][this.idx.col].el != h[d] && d == h.length - 1 ? e(h[d], this.createCells(m, 1)) : h[d].parentNode.insertBefore(this.createCells(m, 1), h[d]);\n break;case \"after\":\n e(this.getRowCells(l)[d], this.createCells(m, 1));} else l.insertBefore(this.createCells(m, 1), l.firstChild);\n } else i = n.createElement(\"tr\"), i.appendChild(this.createCells(m, 1)), this.table.appendChild(i);\n }\n } }, g.table = { getCellsBetween: function getCellsBetween(a, b) {\n var c = new i(a);return c.getMapElsTo(b);\n }, addCells: function addCells(a, b) {\n var c = new i(a);c.add(b);\n }, removeCells: function removeCells(a, b) {\n var c = new i(a);c.remove(b);\n }, mergeCellsBetween: function mergeCellsBetween(a, b) {\n var c = new i(a);c.merge(b);\n }, unmergeCell: function unmergeCell(a) {\n var b = new i(a);b.unmerge();\n }, orderSelectionEnds: function orderSelectionEnds(a, b) {\n var c = new i(a);return c.orderSelectionEnds(b);\n }, indexOf: function indexOf(a) {\n var b = new i(a);return b.setTableMap(), b.getMapIndex(a);\n }, findCell: function findCell(a, b) {\n var c = new i(null, a);return c.getElementAtIndex(b);\n }, findRowByCell: function findRowByCell(a) {\n var b = new i(a);return b.getRowElementsByCell();\n }, findColumnByCell: function findColumnByCell(a) {\n var b = new i(a);return b.getColumnElementsByCell();\n }, canMerge: function canMerge(a, b) {\n var c = new i(a);return c.canMerge(b);\n } };\n}(wysihtml5), wysihtml5.dom.query = function (a, b) {\n var c,\n d,\n e,\n f,\n g = [];for (a.nodeType && (a = [a]), d = 0, e = a.length; e > d; d++) {\n if (c = a[d].querySelectorAll(b), c) for (f = c.length; f--; g.unshift(c[f])) {}\n }return g;\n}, wysihtml5.dom.compareDocumentPosition = function () {\n var a = document.documentElement;return a.compareDocumentPosition ? function (a, b) {\n return a.compareDocumentPosition(b);\n } : function (a, b) {\n var c, d, e, f, g, h, i, j, k;if (c = 9 === a.nodeType ? a : a.ownerDocument, d = 9 === b.nodeType ? b : b.ownerDocument, a === b) return 0;if (a === b.ownerDocument) return 20;if (a.ownerDocument === b) return 10;if (c !== d) return 1;if (2 === a.nodeType && a.childNodes && -1 !== wysihtml5.lang.array(a.childNodes).indexOf(b)) return 20;if (2 === b.nodeType && b.childNodes && -1 !== wysihtml5.lang.array(b.childNodes).indexOf(a)) return 10;for (e = a, f = [], g = null; e;) {\n if (e == b) return 10;f.push(e), e = e.parentNode;\n }for (e = b, g = null; e;) {\n if (e == a) return 20;if (h = wysihtml5.lang.array(f).indexOf(e), -1 !== h) return i = f[h], j = wysihtml5.lang.array(i.childNodes).indexOf(f[h - 1]), k = wysihtml5.lang.array(i.childNodes).indexOf(g), j > k ? 2 : 4;g = e, e = e.parentNode;\n }return 1;\n };\n}(), wysihtml5.dom.unwrap = function (a) {\n if (a.parentNode) {\n for (; a.lastChild;) {\n wysihtml5.dom.insert(a.lastChild).after(a);\n }a.parentNode.removeChild(a);\n }\n}, wysihtml5.dom.getPastedHtml = function (a) {\n var b;return a.clipboardData && (wysihtml5.lang.array(a.clipboardData.types).contains(\"text/html\") ? b = a.clipboardData.getData(\"text/html\") : wysihtml5.lang.array(a.clipboardData.types).contains(\"text/plain\") && (b = wysihtml5.lang.string(a.clipboardData.getData(\"text/plain\")).escapeHTML(!0, !0))), b;\n}, wysihtml5.dom.getPastedHtmlWithDiv = function (a, b) {\n var c = a.selection.getBookmark(),\n d = a.element.ownerDocument,\n e = d.createElement(\"DIV\");d.body.appendChild(e), e.style.width = \"1px\", e.style.height = \"1px\", e.style.overflow = \"hidden\", e.setAttribute(\"contenteditable\", \"true\"), e.focus(), setTimeout(function () {\n a.selection.setBookmark(c), b(e.innerHTML), e.parentNode.removeChild(e);\n }, 0);\n}, wysihtml5.quirks.cleanPastedHTML = function () {\n var a = function a(_a2) {\n var b = wysihtml5.lang.string(_a2).trim(),\n c = b.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");return RegExp(\"^((?!^\" + c + \"$).)*$\", \"i\");\n },\n b = function b(_b2, c) {\n var d,\n e,\n f = wysihtml5.lang.object(_b2).clone(!0);for (d in f.tags) {\n if (f.tags.hasOwnProperty(d) && f.tags[d].keep_styles) for (e in f.tags[d].keep_styles) {\n f.tags[d].keep_styles.hasOwnProperty(e) && c[e] && (f.tags[d].keep_styles[e] = a(c[e]));\n }\n }return f;\n },\n c = function c(a, b) {\n var c, d, e;if (!a) return null;for (d = 0, e = a.length; e > d; d++) {\n if (a[d].condition || (c = a[d].set), a[d].condition && a[d].condition.test(b)) return a[d].set;\n }return c;\n };return function (a, d) {\n var e,\n f = { color: wysihtml5.dom.getStyle(\"color\").from(d.referenceNode), fontSize: wysihtml5.dom.getStyle(\"font-size\").from(d.referenceNode) },\n g = b(c(d.rules, a) || {}, f);return e = wysihtml5.dom.parse(a, { rules: g, cleanUp: !0, context: d.referenceNode.ownerDocument, uneditableClass: d.uneditableClass, clearInternals: !0, unjoinNbsps: !0 }), e;\n };\n}(), wysihtml5.quirks.ensureProperClearing = function () {\n var a = function a() {\n var a = this;setTimeout(function () {\n var b = a.innerHTML.toLowerCase();(\"<p>&nbsp;</p>\" == b || \"<p>&nbsp;</p><p>&nbsp;</p>\" == b) && (a.innerHTML = \"\");\n }, 0);\n };return function (b) {\n wysihtml5.dom.observe(b.element, [\"cut\", \"keydown\"], a);\n };\n}(), function (a) {\n var b = \"%7E\";a.quirks.getCorrectInnerHTML = function (c) {\n var d,\n e,\n f,\n g,\n h,\n i = c.innerHTML;if (-1 === i.indexOf(b)) return i;for (d = c.querySelectorAll(\"[href*='~'], [src*='~']\"), h = 0, g = d.length; g > h; h++) {\n e = d[h].href || d[h].src, f = a.lang.string(e).replace(\"~\").by(b), i = a.lang.string(i).replace(f).by(e);\n }return i;\n };\n}(wysihtml5), function (a) {\n var b = \"wysihtml5-quirks-redraw\";a.quirks.redraw = function (c) {\n a.dom.addClass(c, b), a.dom.removeClass(c, b);try {\n var d = c.ownerDocument;d.execCommand(\"italic\", !1, null), d.execCommand(\"italic\", !1, null);\n } catch (e) {}\n };\n}(wysihtml5), wysihtml5.quirks.tableCellsSelection = function (a, b) {\n function c() {\n return k.observe(a, \"mousedown\", function (a) {\n var b = wysihtml5.dom.getParentElement(a.target, { nodeName: [\"TD\", \"TH\"] });b && d(b);\n }), l;\n }function d(c) {\n l.start = c, l.end = c, l.cells = [c], l.table = k.getParentElement(l.start, { nodeName: [\"TABLE\"] }), l.table && (e(), k.addClass(c, m), n = k.observe(a, \"mousemove\", g), o = k.observe(a, \"mouseup\", h), b.fire(\"tableselectstart\").fire(\"tableselectstart:composer\"));\n }function e() {\n var b, c;if (a && (b = a.querySelectorAll(\".\" + m), b.length > 0)) for (c = 0; c < b.length; c++) {\n k.removeClass(b[c], m);\n }\n }function f(a) {\n for (var b = 0; b < a.length; b++) {\n k.addClass(a[b], m);\n }\n }function g(a) {\n var c,\n d = null,\n g = k.getParentElement(a.target, { nodeName: [\"TD\", \"TH\"] });g && l.table && l.start && (d = k.getParentElement(g, { nodeName: [\"TABLE\"] }), d && d === l.table && (e(), c = l.end, l.end = g, l.cells = k.table.getCellsBetween(l.start, g), l.cells.length > 1 && b.composer.selection.deselect(), f(l.cells), l.end !== c && b.fire(\"tableselectchange\").fire(\"tableselectchange:composer\")));\n }function h() {\n n.stop(), o.stop(), b.fire(\"tableselect\").fire(\"tableselect:composer\"), setTimeout(function () {\n i();\n }, 0);\n }function i() {\n var c = k.observe(a.ownerDocument, \"click\", function (a) {\n c.stop(), k.getParentElement(a.target, { nodeName: [\"TABLE\"] }) != l.table && (e(), l.table = null, l.start = null, l.end = null, b.fire(\"tableunselect\").fire(\"tableunselect:composer\"));\n });\n }function j(a, c) {\n l.start = a, l.end = c, l.table = k.getParentElement(l.start, { nodeName: [\"TABLE\"] }), selectedCells = k.table.getCellsBetween(l.start, l.end), f(selectedCells), i(), b.fire(\"tableselect\").fire(\"tableselect:composer\");\n }var k = wysihtml5.dom,\n l = { table: null, start: null, end: null, cells: null, select: j },\n m = \"wysiwyg-tmp-selected-cell\",\n n = null,\n o = null;return c();\n}, function (a) {\n var b = /^rgba\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*([\\d\\.]+)\\s*\\)/i,\n c = /^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)/i,\n d = /^#([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])/i,\n e = /^#([0-9a-f])([0-9a-f])([0-9a-f])/i,\n f = function f(a) {\n return RegExp(\"(^|\\\\s|;)\" + a + \"\\\\s*:\\\\s*[^;$]+\", \"gi\");\n };a.quirks.styleParser = { parseColor: function parseColor(g, h) {\n var i,\n j,\n k,\n l = f(h),\n m = g.match(l),\n n = 10;if (m) {\n for (k = m.length; k--;) {\n m[k] = a.lang.string(m[k].split(\":\")[1]).trim();\n }if (i = m[m.length - 1], b.test(i)) j = i.match(b);else if (c.test(i)) j = i.match(c);else if (d.test(i)) j = i.match(d), n = 16;else if (e.test(i)) return j = i.match(e), j.shift(), j.push(1), a.lang.array(j).map(function (a, b) {\n return 3 > b ? 16 * parseInt(a, 16) + parseInt(a, 16) : parseFloat(a);\n });if (j) return j.shift(), j[3] || j.push(1), a.lang.array(j).map(function (a, b) {\n return 3 > b ? parseInt(a, n) : parseFloat(a);\n });\n }return !1;\n }, unparseColor: function unparseColor(a, b) {\n if (b) {\n if (\"hex\" == b) return a[0].toString(16).toUpperCase() + a[1].toString(16).toUpperCase() + a[2].toString(16).toUpperCase();if (\"hash\" == b) return \"#\" + a[0].toString(16).toUpperCase() + a[1].toString(16).toUpperCase() + a[2].toString(16).toUpperCase();if (\"rgb\" == b) return \"rgb(\" + a[0] + \",\" + a[1] + \",\" + a[2] + \")\";if (\"rgba\" == b) return \"rgba(\" + a[0] + \",\" + a[1] + \",\" + a[2] + \",\" + a[3] + \")\";if (\"csv\" == b) return a[0] + \",\" + a[1] + \",\" + a[2] + \",\" + a[3];\n }return a[3] && 1 !== a[3] ? \"rgba(\" + a[0] + \",\" + a[1] + \",\" + a[2] + \",\" + a[3] + \")\" : \"rgb(\" + a[0] + \",\" + a[1] + \",\" + a[2] + \")\";\n }, parseFontSize: function parseFontSize(b) {\n var c = b.match(f(\"font-size\"));return c ? a.lang.string(c[c.length - 1].split(\":\")[1]).trim() : !1;\n } };\n}(wysihtml5), function (a) {\n function b(a) {\n var b = 0;if (a.parentNode) do {\n b += a.offsetTop || 0, a = a.offsetParent;\n } while (a);return b;\n }function c(a, b) {\n for (var c = 0; b !== a;) {\n if (c++, b = b.parentNode, !b) throw Error(\"not a descendant of ancestor!\");\n }return c;\n }function d(a) {\n if (!a.canSurroundContents()) for (var b = a.commonAncestorContainer, d = c(b, a.startContainer), e = c(b, a.endContainer); !a.canSurroundContents();) {\n d > e ? (a.setStartBefore(a.startContainer), d = c(b, a.startContainer)) : (a.setEndAfter(a.endContainer), e = c(b, a.endContainer));\n }\n }var e = a.dom;a.Selection = Base.extend({ constructor: function constructor(a, b, c) {\n window.rangy.init(), this.editor = a, this.composer = a.composer, this.doc = this.composer.doc, this.contain = b, this.unselectableClass = c || !1;\n }, getBookmark: function getBookmark() {\n var a = this.getRange();return a && d(a), a && a.cloneRange();\n }, setBookmark: function setBookmark(a) {\n a && this.setSelection(a);\n }, setBefore: function setBefore(a) {\n var b = rangy.createRange(this.doc);return b.setStartBefore(a), b.setEndBefore(a), this.setSelection(b);\n }, setAfter: function setAfter(a) {\n var b = rangy.createRange(this.doc);return b.setStartAfter(a), b.setEndAfter(a), this.setSelection(b);\n }, selectNode: function selectNode(b, c) {\n var d = rangy.createRange(this.doc),\n f = b.nodeType === a.ELEMENT_NODE,\n g = \"canHaveHTML\" in b ? b.canHaveHTML : \"IMG\" !== b.nodeName,\n h = f ? b.innerHTML : b.data,\n i = \"\" === h || h === a.INVISIBLE_SPACE,\n j = e.getStyle(\"display\").from(b),\n k = \"block\" === j || \"list-item\" === j;if (i && f && g && !c) try {\n b.innerHTML = a.INVISIBLE_SPACE;\n } catch (l) {}g ? d.selectNodeContents(b) : d.selectNode(b), g && i && f ? d.collapse(k) : g && i && (d.setStartAfter(b), d.setEndAfter(b)), this.setSelection(d);\n }, getSelectedNode: function getSelectedNode(a) {\n var b, c;return a && this.doc.selection && \"Control\" === this.doc.selection.type && (c = this.doc.selection.createRange(), c && c.length) ? c.item(0) : (b = this.getSelection(this.doc), b.focusNode === b.anchorNode ? b.focusNode : (c = this.getRange(this.doc), c ? c.commonAncestorContainer : this.doc.body));\n }, fixSelBorders: function fixSelBorders() {\n var a = this.getRange();d(a), this.setSelection(a);\n }, getSelectedOwnNodes: function getSelectedOwnNodes() {\n var a,\n b,\n c = this.getOwnRanges(),\n d = [];for (a = 0, b = c.length; b > a; a++) {\n d.push(c[a].commonAncestorContainer || this.doc.body);\n }return d;\n }, findNodesInSelection: function findNodesInSelection(b) {\n var c,\n d,\n e,\n f = this.getOwnRanges(),\n g = [];for (d = 0, e = f.length; e > d; d++) {\n c = f[d].getNodes([1], function (c) {\n return a.lang.array(b).contains(c.nodeName);\n }), g = g.concat(c);\n }return g;\n }, containsUneditable: function containsUneditable() {\n var a,\n b,\n c = this.getOwnUneditables(),\n d = this.getSelection();for (a = 0, b = c.length; b > a; a++) {\n if (d.containsNode(c[a])) return !0;\n }return !1;\n }, deleteContents: function deleteContents() {\n var a,\n b = this.getOwnRanges();for (a = b.length; a--;) {\n b[a].deleteContents();\n }this.setSelection(b[0]);\n }, getPreviousNode: function getPreviousNode(b, c) {\n var d, e, f;return b || (d = this.getSelection(), b = d.anchorNode), b === this.contain ? !1 : (e = b.previousSibling, e === this.contain ? !1 : (e && 3 !== e.nodeType && 1 !== e.nodeType ? e = this.getPreviousNode(e, c) : e && 3 === e.nodeType && /^\\s*$/.test(e.textContent) ? e = this.getPreviousNode(e, c) : c && e && 1 === e.nodeType && !a.lang.array([\"BR\", \"HR\", \"IMG\"]).contains(e.nodeName) && /^[\\s]*$/.test(e.innerHTML) ? e = this.getPreviousNode(e, c) : e || b === this.contain || (f = b.parentNode, f !== this.contain && (e = this.getPreviousNode(f, c))), e !== this.contain ? e : !1));\n }, getSelectionParentsByTag: function getSelectionParentsByTag() {\n var b,\n c,\n d,\n e = this.getSelectedOwnNodes(),\n f = [];for (c = 0, d = e.length; d > c; c++) {\n b = e[c].nodeName && \"LI\" === e[c].nodeName ? e[c] : a.dom.getParentElement(e[c], { nodeName: [\"LI\"] }, !1, this.contain), b && f.push(b);\n }return f.length ? f : null;\n }, getRangeToNodeEnd: function getRangeToNodeEnd() {\n if (this.isCollapsed()) {\n var a = this.getRange(),\n b = a.startContainer,\n c = a.startOffset,\n d = rangy.createRange(this.doc);return d.selectNodeContents(b), d.setStart(b, c), d;\n }\n }, caretIsLastInSelection: function caretIsLastInSelection() {\n var a = (rangy.createRange(this.doc), this.getSelection(), this.getRangeToNodeEnd().cloneContents()),\n b = a.textContent;return (/^\\s*$/.test(b)\n );\n }, caretIsFirstInSelection: function caretIsFirstInSelection() {\n var b = rangy.createRange(this.doc),\n c = this.getSelection(),\n d = this.getRange(),\n e = d.startContainer;return e.nodeType === a.TEXT_NODE ? this.isCollapsed() && e.nodeType === a.TEXT_NODE && /^\\s*$/.test(e.data.substr(0, d.startOffset)) : (b.selectNodeContents(this.getRange().commonAncestorContainer), b.collapse(!0), this.isCollapsed() && (b.startContainer === c.anchorNode || b.endContainer === c.anchorNode) && b.startOffset === c.anchorOffset);\n }, caretIsInTheBeginnig: function caretIsInTheBeginnig(b) {\n var c = this.getSelection(),\n d = c.anchorNode,\n e = c.anchorOffset;return b ? 0 === e && (d.nodeName && d.nodeName === b.toUpperCase() || a.dom.getParentElement(d.parentNode, { nodeName: b }, 1)) : 0 === e && !this.getPreviousNode(d, !0);\n }, caretIsBeforeUneditable: function caretIsBeforeUneditable() {\n var a,\n b,\n c,\n d,\n e = this.getSelection(),\n f = e.anchorNode,\n g = e.anchorOffset;if (0 === g && (a = this.getPreviousNode(f, !0), a)) for (b = this.getOwnUneditables(), c = 0, d = b.length; d > c; c++) {\n if (a === b[c]) return b[c];\n }return !1;\n }, executeAndRestoreRangy: function executeAndRestoreRangy(a) {\n var b = this.doc.defaultView || this.doc.parentWindow,\n c = rangy.saveSelection(b);if (c) try {\n a();\n } catch (d) {\n setTimeout(function () {\n throw d;\n }, 0);\n } else a();rangy.restoreSelection(c);\n }, executeAndRestore: function executeAndRestore(b, c) {\n var d,\n f,\n g,\n h,\n i,\n j,\n k,\n l,\n m,\n n = this.doc.body,\n o = c && n.scrollTop,\n p = c && n.scrollLeft,\n q = \"_wysihtml5-temp-placeholder\",\n r = '<span class=\"' + q + '\">' + a.INVISIBLE_SPACE + \"</span>\",\n s = this.getRange(!0);if (!s) return b(n, n), void 0;s.collapsed || (k = s.cloneRange(), j = k.createContextualFragment(r), k.collapse(!1), k.insertNode(j), k.detach()), i = s.createContextualFragment(r), s.insertNode(i), j && (d = this.contain.querySelectorAll(\".\" + q), s.setStartBefore(d[0]), s.setEndAfter(d[d.length - 1])), this.setSelection(s);try {\n b(s.startContainer, s.endContainer);\n } catch (t) {\n setTimeout(function () {\n throw t;\n }, 0);\n }if (d = this.contain.querySelectorAll(\".\" + q), d && d.length) for (l = rangy.createRange(this.doc), g = d[0].nextSibling, d.length > 1 && (h = d[d.length - 1].previousSibling), h && g ? (l.setStartBefore(g), l.setEndAfter(h)) : (f = this.doc.createTextNode(a.INVISIBLE_SPACE), e.insert(f).after(d[0]), l.setStartBefore(f), l.setEndAfter(f)), this.setSelection(l), m = d.length; m--;) {\n d[m].parentNode.removeChild(d[m]);\n } else this.contain.focus();c && (n.scrollTop = o, n.scrollLeft = p);try {\n d.parentNode.removeChild(d);\n } catch (u) {}\n }, set: function set(a, b) {\n var c = rangy.createRange(this.doc);c.setStart(a, b || 0), this.setSelection(c);\n }, insertHTML: function insertHTML(a) {\n var b,\n c = (rangy.createRange(this.doc), this.doc.createElement(\"DIV\")),\n d = this.doc.createDocumentFragment();for (c.innerHTML = a, b = c.lastChild; c.firstChild;) {\n d.appendChild(c.firstChild);\n }this.insertNode(d), b && this.setAfter(b);\n }, insertNode: function insertNode(a) {\n var b = this.getRange();b && b.insertNode(a);\n }, surround: function surround(a) {\n var b,\n c,\n d = this.getOwnRanges(),\n e = [];if (0 == d.length) return e;for (c = d.length; c--;) {\n b = this.doc.createElement(a.nodeName), e.push(b), a.className && (b.className = a.className), a.cssStyle && b.setAttribute(\"style\", a.cssStyle);try {\n d[c].surroundContents(b), this.selectNode(b);\n } catch (f) {\n b.appendChild(d[c].extractContents()), d[c].insertNode(b);\n }\n }return e;\n }, deblockAndSurround: function deblockAndSurround(b) {\n var c,\n d,\n e,\n f = this.doc.createElement(\"div\"),\n g = rangy.createRange(this.doc);if (f.className = b.className, this.composer.commands.exec(\"formatBlock\", b.nodeName, b.className), c = this.contain.querySelectorAll(\".\" + b.className), c[0]) for (c[0].parentNode.insertBefore(f, c[0]), g.setStartBefore(c[0]), g.setEndAfter(c[c.length - 1]), d = g.extractContents(); d.firstChild;) {\n if (e = d.firstChild, 1 == e.nodeType && a.dom.hasClass(e, b.className)) {\n for (; e.firstChild;) {\n f.appendChild(e.firstChild);\n }\"BR\" !== e.nodeName && f.appendChild(this.doc.createElement(\"br\")), d.removeChild(e);\n } else f.appendChild(e);\n } else f = null;return f;\n }, scrollIntoView: function scrollIntoView() {\n var c,\n d = this.doc,\n e = 5,\n f = d.documentElement.scrollHeight > d.documentElement.offsetHeight,\n g = d._wysihtml5ScrollIntoViewElement = d._wysihtml5ScrollIntoViewElement || function () {\n var b = d.createElement(\"span\");return b.innerHTML = a.INVISIBLE_SPACE, b;\n }();f && (this.insertNode(g), c = b(g), g.parentNode.removeChild(g), c >= d.body.scrollTop + d.documentElement.offsetHeight - e && (d.body.scrollTop = c));\n }, selectLine: function selectLine() {\n a.browser.supportsSelectionModify() ? this._selectLine_W3C() : this.doc.selection && this._selectLine_MSIE();\n }, _selectLine_W3C: function _selectLine_W3C() {\n var a = this.doc.defaultView,\n b = a.getSelection();b.modify(\"move\", \"left\", \"lineboundary\"), b.modify(\"extend\", \"right\", \"lineboundary\");\n }, _selectLine_MSIE: function _selectLine_MSIE() {\n var a,\n b,\n c,\n d,\n e,\n f = this.doc.selection.createRange(),\n g = f.boundingTop,\n h = this.doc.body.scrollWidth;if (f.moveToPoint) {\n for (0 === g && (c = this.doc.createElement(\"span\"), this.insertNode(c), g = c.offsetTop, c.parentNode.removeChild(c)), g += 1, d = -10; h > d; d += 2) {\n try {\n f.moveToPoint(d, g);break;\n } catch (i) {}\n }for (a = g, b = this.doc.selection.createRange(), e = h; e >= 0; e--) {\n try {\n b.moveToPoint(e, a);break;\n } catch (j) {}\n }f.setEndPoint(\"EndToEnd\", b), f.select();\n }\n }, getText: function getText() {\n var a = this.getSelection();return a ? \"\" + a : \"\";\n }, getNodes: function getNodes(a, b) {\n var c = this.getRange();return c ? c.getNodes([a], b) : [];\n }, fixRangeOverflow: function fixRangeOverflow(a) {\n var b, c;this.contain && this.contain.firstChild && a && (b = a.compareNode(this.contain), 2 !== b ? (1 === b && a.setStartBefore(this.contain.firstChild), 0 === b && a.setEndAfter(this.contain.lastChild), 3 === b && (a.setStartBefore(this.contain.firstChild), a.setEndAfter(this.contain.lastChild))) : this._detectInlineRangeProblems(a) && (c = a.endContainer.previousElementSibling, c && a.setEnd(c, this._endOffsetForNode(c))));\n }, _endOffsetForNode: function _endOffsetForNode(a) {\n var b = document.createRange();return b.selectNodeContents(a), b.endOffset;\n }, _detectInlineRangeProblems: function _detectInlineRangeProblems(a) {\n var b = e.compareDocumentPosition(a.startContainer, a.endContainer);return 0 == a.endOffset && 4 & b;\n }, getRange: function getRange(a) {\n var b = this.getSelection(),\n c = b && b.rangeCount && b.getRangeAt(0);return a !== !0 && this.fixRangeOverflow(c), c;\n }, getOwnUneditables: function getOwnUneditables() {\n var b = e.query(this.contain, \".\" + this.unselectableClass),\n c = e.query(b, \".\" + this.unselectableClass);return a.lang.array(b).without(c);\n }, getOwnRanges: function getOwnRanges() {\n var a,\n b,\n c,\n d,\n e,\n f,\n g,\n h = [],\n i = this.getRange();if (i && h.push(i), this.unselectableClass && this.contain && i && (b = this.getOwnUneditables(), b.length > 0)) for (d = 0, e = b.length; e > d; d++) {\n for (a = [], f = 0, g = h.length; g > f; f++) {\n if (h[f]) switch (h[f].compareNode(b[d])) {case 2:\n break;case 3:\n c = h[f].cloneRange(), c.setEndBefore(b[d]), a.push(c), c = h[f].cloneRange(), c.setStartAfter(b[d]), a.push(c);break;default:\n a.push(h[f]);}h = a;\n }\n }return h;\n }, getSelection: function getSelection() {\n return rangy.getSelection(this.doc.defaultView || this.doc.parentWindow);\n }, setSelection: function setSelection(a) {\n var b = this.doc.defaultView || this.doc.parentWindow,\n c = rangy.getSelection(b);return c.setSingleRange(a);\n }, createRange: function createRange() {\n return rangy.createRange(this.doc);\n }, isCollapsed: function isCollapsed() {\n return this.getSelection().isCollapsed;\n }, getHtml: function getHtml() {\n return this.getSelection().toHtml();\n }, isEndToEndInNode: function isEndToEndInNode(b) {\n var c = this.getRange(),\n d = c.commonAncestorContainer,\n e = c.startContainer,\n f = c.endContainer;if (d.nodeType === a.TEXT_NODE && (d = d.parentNode), e.nodeType === a.TEXT_NODE && !/^\\s*$/.test(e.data.substr(c.startOffset))) return !1;if (f.nodeType === a.TEXT_NODE && !/^\\s*$/.test(f.data.substr(c.endOffset))) return !1;for (; e && e !== d;) {\n if (e.nodeType !== a.TEXT_NODE && !a.dom.contains(d, e)) return !1;if (a.dom.domNode(e).prev({ ignoreBlankTexts: !0 })) return !1;e = e.parentNode;\n }for (; f && f !== d;) {\n if (f.nodeType !== a.TEXT_NODE && !a.dom.contains(d, f)) return !1;if (a.dom.domNode(f).next({ ignoreBlankTexts: !0 })) return !1;f = f.parentNode;\n }return a.lang.array(b).contains(d.nodeName) ? d : !1;\n }, deselect: function deselect() {\n var a = this.getSelection();a && a.removeAllRanges();\n } });\n}(wysihtml5), function (a, b) {\n function c(a, b, c) {\n if (!a.className) return !1;var d = a.className.match(c) || [];return d[d.length - 1] === b;\n }function d(a, b) {\n if (!a.getAttribute || !a.getAttribute(\"style\")) return !1;a.getAttribute(\"style\").match(b);return a.getAttribute(\"style\").match(b) ? !0 : !1;\n }function e(a, b, c) {\n a.getAttribute(\"style\") ? (h(a, c), a.getAttribute(\"style\") && !/^\\s*$/.test(a.getAttribute(\"style\")) ? a.setAttribute(\"style\", b + \";\" + a.getAttribute(\"style\")) : a.setAttribute(\"style\", b)) : a.setAttribute(\"style\", b);\n }function f(a, b, c) {\n a.className ? (g(a, c), a.className += \" \" + b) : a.className = b;\n }function g(a, b) {\n a.className && (a.className = a.className.replace(b, \"\"));\n }function h(a, b) {\n var c,\n d,\n e = [];if (a.getAttribute(\"style\")) {\n for (c = a.getAttribute(\"style\").split(\";\"), d = c.length; d--;) {\n c[d].match(b) || /^\\s*$/.test(c[d]) || e.push(c[d]);\n }e.length ? a.setAttribute(\"style\", e.join(\";\")) : a.removeAttribute(\"style\");\n }\n }function i(a, b) {\n var c,\n d,\n e,\n f = [],\n g = b.split(\";\"),\n h = a.getAttribute(\"style\");if (h) {\n for (h = h.replace(/\\s/gi, \"\").toLowerCase(), f.push(RegExp(\"(^|\\\\s|;)\" + b.replace(/\\s/gi, \"\").replace(/([\\(\\)])/gi, \"\\\\$1\").toLowerCase().replace(\";\", \";?\").replace(/rgb\\\\\\((\\d+),(\\d+),(\\d+)\\\\\\)/gi, \"\\\\s?rgb\\\\($1,\\\\s?$2,\\\\s?$3\\\\)\"), \"gi\")), c = g.length; c-- > 0;) {\n /^\\s*$/.test(g[c]) || f.push(RegExp(\"(^|\\\\s|;)\" + g[c].replace(/\\s/gi, \"\").replace(/([\\(\\)])/gi, \"\\\\$1\").toLowerCase().replace(\";\", \";?\").replace(/rgb\\\\\\((\\d+),(\\d+),(\\d+)\\\\\\)/gi, \"\\\\s?rgb\\\\($1,\\\\s?$2,\\\\s?$3\\\\)\"), \"gi\"));\n }for (d = 0, e = f.length; e > d; d++) {\n if (h.match(f[d])) return f[d];\n }\n }return !1;\n }function j(c, d, e, f) {\n return e ? i(c, e) : f ? a.dom.hasClass(c, f) : b.dom.arrayContains(d, c.tagName.toLowerCase());\n }function k(a, b, c, d) {\n for (var e = a.length; e--;) {\n if (!j(a[e], b, c, d)) return !1;\n }return a.length ? !0 : !1;\n }function l(a, b, c) {\n var d = i(a, b);return d ? (h(a, d), \"remove\") : (e(a, b, c), \"change\");\n }function m(a, b) {\n return a.className.replace(u, \" \") == b.className.replace(u, \" \");\n }function n(a) {\n for (var b = a.parentNode; a.firstChild;) {\n b.insertBefore(a.firstChild, a);\n }b.removeChild(a);\n }function o(a, b) {\n if (a.attributes.length != b.attributes.length) return !1;for (var c, d, e, f = 0, g = a.attributes.length; g > f; ++f) {\n if (c = a.attributes[f], e = c.name, \"class\" != e) {\n if (d = b.attributes.getNamedItem(e), c.specified != d.specified) return !1;if (c.specified && c.nodeValue !== d.nodeValue) return !1;\n }\n }return !0;\n }function p(a, c) {\n return b.dom.isCharacterDataNode(a) ? 0 == c ? !!a.previousSibling : c == a.length ? !!a.nextSibling : !0 : c > 0 && c < a.childNodes.length;\n }function q(a, c, d, e) {\n var f, g;if (b.dom.isCharacterDataNode(c) && (0 == d ? (d = b.dom.getNodeIndex(c), c = c.parentNode) : d == c.length ? (d = b.dom.getNodeIndex(c) + 1, c = c.parentNode) : f = b.dom.splitDataNode(c, d)), !(f || e && c === e)) {\n for (f = c.cloneNode(!1), f.id && f.removeAttribute(\"id\"); g = c.childNodes[d];) {\n f.appendChild(g);\n }b.dom.insertAfter(f, c);\n }return c == a ? f : q(a, f.parentNode, b.dom.getNodeIndex(f), e);\n }function r(b) {\n this.isElementMerge = b.nodeType == a.ELEMENT_NODE, this.firstTextNode = this.isElementMerge ? b.lastChild : b, this.textNodes = [this.firstTextNode];\n }function s(a, b, c, d, e, f, g) {\n this.tagNames = a || [t], this.cssClass = b || (b === !1 ? !1 : \"\"), this.similarClassRegExp = c, this.cssStyle = e || \"\", this.similarStyleRegExp = f, this.normalize = d, this.applyToAnyTagName = !1, this.container = g;\n }var t = \"span\",\n u = /\\s+/g;r.prototype = { doMerge: function doMerge() {\n var a,\n b,\n c,\n d,\n e,\n f = [];for (d = 0, e = this.textNodes.length; e > d; ++d) {\n a = this.textNodes[d], b = a.parentNode, f[d] = a.data, d && (b.removeChild(a), b.hasChildNodes() || b.parentNode.removeChild(b));\n }return this.firstTextNode.data = c = f.join(\"\"), c;\n }, getLength: function getLength() {\n for (var a = this.textNodes.length, b = 0; a--;) {\n b += this.textNodes[a].length;\n }return b;\n }, toString: function toString() {\n var a,\n b,\n c = [];for (a = 0, b = this.textNodes.length; b > a; ++a) {\n c[a] = \"'\" + this.textNodes[a].data + \"'\";\n }return \"[Merge(\" + c.join(\",\") + \")]\";\n } }, s.prototype = { getAncestorWithClass: function getAncestorWithClass(d) {\n for (var e; d;) {\n if (e = this.cssClass ? c(d, this.cssClass, this.similarClassRegExp) : \"\" !== this.cssStyle ? !1 : !0, d.nodeType == a.ELEMENT_NODE && \"false\" != d.getAttribute(\"contenteditable\") && b.dom.arrayContains(this.tagNames, d.tagName.toLowerCase()) && e) return d;d = d.parentNode;\n }return !1;\n }, getAncestorWithStyle: function getAncestorWithStyle(c) {\n for (var e; c;) {\n if (e = this.cssStyle ? d(c, this.similarStyleRegExp) : !1, c.nodeType == a.ELEMENT_NODE && \"false\" != c.getAttribute(\"contenteditable\") && b.dom.arrayContains(this.tagNames, c.tagName.toLowerCase()) && e) return c;c = c.parentNode;\n }return !1;\n }, getMatchingAncestor: function getMatchingAncestor(a) {\n var b = this.getAncestorWithClass(a),\n c = !1;return b ? this.cssStyle && (c = \"class\") : (b = this.getAncestorWithStyle(a), b && (c = \"style\")), { element: b, type: c };\n }, postApply: function postApply(a, b) {\n var c,\n d,\n e,\n f,\n g,\n h,\n i = a[0],\n j = a[a.length - 1],\n k = [],\n l = i,\n m = j,\n n = 0,\n o = j.length;for (f = 0, g = a.length; g > f; ++f) {\n d = a[f], e = null, d && d.parentNode && (e = this.getAdjacentMergeableTextNode(d.parentNode, !1)), e ? (c || (c = new r(e), k.push(c)), c.textNodes.push(d), d === i && (l = c.firstTextNode, n = l.length), d === j && (m = c.firstTextNode, o = c.getLength())) : c = null;\n }if (j && j.parentNode && (h = this.getAdjacentMergeableTextNode(j.parentNode, !0), h && (c || (c = new r(j), k.push(c)), c.textNodes.push(h))), k.length) {\n for (f = 0, g = k.length; g > f; ++f) {\n k[f].doMerge();\n }b.setStart(l, n), b.setEnd(m, o);\n }\n }, getAdjacentMergeableTextNode: function getAdjacentMergeableTextNode(b, c) {\n var d,\n e = b.nodeType == a.TEXT_NODE,\n f = e ? b.parentNode : b,\n g = c ? \"nextSibling\" : \"previousSibling\";if (e) {\n if (d = b[g], d && d.nodeType == a.TEXT_NODE) return d;\n } else if (d = f[g], d && this.areElementsMergeable(b, d)) return d[c ? \"firstChild\" : \"lastChild\"];return null;\n }, areElementsMergeable: function areElementsMergeable(a, c) {\n return b.dom.arrayContains(this.tagNames, (a.tagName || \"\").toLowerCase()) && b.dom.arrayContains(this.tagNames, (c.tagName || \"\").toLowerCase()) && m(a, c) && o(a, c);\n }, createContainer: function createContainer(a) {\n var b = a.createElement(this.tagNames[0]);return this.cssClass && (b.className = this.cssClass), this.cssStyle && b.setAttribute(\"style\", this.cssStyle), b;\n }, applyToTextNode: function applyToTextNode(a) {\n var c,\n d = a.parentNode;1 == d.childNodes.length && b.dom.arrayContains(this.tagNames, d.tagName.toLowerCase()) ? (this.cssClass && f(d, this.cssClass, this.similarClassRegExp), this.cssStyle && e(d, this.cssStyle, this.similarStyleRegExp)) : (c = this.createContainer(b.dom.getDocument(a)), a.parentNode.insertBefore(c, a), c.appendChild(a));\n }, isRemovable: function isRemovable(c) {\n return b.dom.arrayContains(this.tagNames, c.tagName.toLowerCase()) && \"\" === a.lang.string(c.className).trim() && (!c.getAttribute(\"style\") || \"\" === a.lang.string(c.getAttribute(\"style\")).trim());\n }, undoToTextNode: function undoToTextNode(a, b, c, d) {\n var e,\n f = c ? !1 : !0,\n h = c || d,\n i = !1;b.containsNode(h) || (e = b.cloneRange(), e.selectNode(h), e.isPointInRange(b.endContainer, b.endOffset) && p(b.endContainer, b.endOffset) && (q(h, b.endContainer, b.endOffset, this.container), b.setEndAfter(h)), e.isPointInRange(b.startContainer, b.startOffset) && p(b.startContainer, b.startOffset) && (h = q(h, b.startContainer, b.startOffset, this.container))), !f && this.similarClassRegExp && g(h, this.similarClassRegExp), f && this.similarStyleRegExp && (i = \"change\" === l(h, this.cssStyle, this.similarStyleRegExp)), this.isRemovable(h) && !i && n(h);\n }, applyToRange: function applyToRange(b) {\n var c, d, e, f, g, h;for (d = b.length; d--;) {\n if (c = b[d].getNodes([a.TEXT_NODE]), !c.length) try {\n return e = this.createContainer(b[d].endContainer.ownerDocument), b[d].surroundContents(e), this.selectNode(b[d], e), void 0;\n } catch (i) {}if (b[d].splitBoundaries(), c = b[d].getNodes([a.TEXT_NODE]), c.length) {\n for (g = 0, h = c.length; h > g; ++g) {\n f = c[g], this.getMatchingAncestor(f).element || this.applyToTextNode(f);\n }b[d].setStart(c[0], 0), f = c[c.length - 1], b[d].setEnd(f, f.length), this.normalize && this.postApply(c, b[d]);\n }\n }\n }, undoToRange: function undoToRange(b) {\n var c, d, e, f, g, h, i, j;for (f = b.length; f--;) {\n for (c = b[f].getNodes([a.TEXT_NODE]), c.length ? (b[f].splitBoundaries(), c = b[f].getNodes([a.TEXT_NODE])) : (g = b[f].endContainer.ownerDocument, h = g.createTextNode(a.INVISIBLE_SPACE), b[f].insertNode(h), b[f].selectNode(h), c = [h]), i = 0, j = c.length; j > i; ++i) {\n b[f].isValid() && (d = c[i], e = this.getMatchingAncestor(d), \"style\" === e.type ? this.undoToTextNode(d, b[f], !1, e.element) : e.element && this.undoToTextNode(d, b[f], e.element));\n }1 == j ? this.selectNode(b[f], c[0]) : (b[f].setStart(c[0], 0), d = c[c.length - 1], b[f].setEnd(d, d.length), this.normalize && this.postApply(c, b[f]));\n }\n }, selectNode: function selectNode(b, c) {\n var d = c.nodeType === a.ELEMENT_NODE,\n e = \"canHaveHTML\" in c ? c.canHaveHTML : !0,\n f = d ? c.innerHTML : c.data,\n g = \"\" === f || f === a.INVISIBLE_SPACE;if (g && d && e) try {\n c.innerHTML = a.INVISIBLE_SPACE;\n } catch (h) {}b.selectNodeContents(c), g && d ? b.collapse(!1) : g && (b.setStartAfter(c), b.setEndAfter(c));\n }, getTextSelectedByRange: function getTextSelectedByRange(a, b) {\n var c,\n d,\n e = b.cloneRange();return e.selectNodeContents(a), c = e.intersection(b), d = c ? \"\" + c : \"\", e.detach(), d;\n }, isAppliedToRange: function isAppliedToRange(b) {\n var c,\n d,\n e,\n f,\n g,\n h,\n i = [],\n j = \"full\";for (e = b.length; e--;) {\n if (d = b[e].getNodes([a.TEXT_NODE]), !d.length) return c = this.getMatchingAncestor(b[e].startContainer).element, c ? { elements: [c], coverage: j } : !1;for (f = 0, g = d.length; g > f; ++f) {\n h = this.getTextSelectedByRange(d[f], b[e]), c = this.getMatchingAncestor(d[f]).element, c && \"\" != h ? (i.push(c), 1 === a.dom.getTextNodes(c, !0).length ? j = \"full\" : \"full\" === j && (j = \"inline\")) : c || (j = \"partial\");\n }\n }return i.length ? { elements: i, coverage: j } : !1;\n }, toggleRange: function toggleRange(a) {\n var b,\n c = this.isAppliedToRange(a);c ? \"full\" === c.coverage ? this.undoToRange(a) : \"inline\" === c.coverage ? (b = k(c.elements, this.tagNames, this.cssStyle, this.cssClass), this.undoToRange(a), b || this.applyToRange(a)) : (k(c.elements, this.tagNames, this.cssStyle, this.cssClass) || this.undoToRange(a), this.applyToRange(a)) : this.applyToRange(a);\n } }, a.selection.HTMLApplier = s;\n}(wysihtml5, rangy), wysihtml5.Commands = Base.extend({ constructor: function constructor(a) {\n this.editor = a, this.composer = a.composer, this.doc = this.composer.doc;\n }, support: function support(a) {\n return wysihtml5.browser.supportsCommand(this.doc, a);\n }, exec: function exec(a, b) {\n var c = wysihtml5.commands[a],\n d = wysihtml5.lang.array(arguments).get(),\n e = c && c.exec,\n f = null;if (this.editor.fire(\"beforecommand:composer\"), e) d.unshift(this.composer), f = e.apply(c, d);else try {\n f = this.doc.execCommand(a, !1, b);\n } catch (g) {}return this.editor.fire(\"aftercommand:composer\"), f;\n }, state: function state(a) {\n var b = wysihtml5.commands[a],\n c = wysihtml5.lang.array(arguments).get(),\n d = b && b.state;if (d) return c.unshift(this.composer), d.apply(b, c);try {\n return this.doc.queryCommandState(a);\n } catch (e) {\n return !1;\n }\n }, stateValue: function stateValue(a) {\n var b = wysihtml5.commands[a],\n c = wysihtml5.lang.array(arguments).get(),\n d = b && b.stateValue;return d ? (c.unshift(this.composer), d.apply(b, c)) : !1;\n } }), wysihtml5.commands.bold = { exec: function exec(a, b) {\n wysihtml5.commands.formatInline.execWithToggle(a, b, \"b\");\n }, state: function state(a, b) {\n return wysihtml5.commands.formatInline.state(a, b, \"b\");\n } }, function (a) {\n function b(b, c) {\n var g,\n h,\n i,\n j,\n k,\n l,\n m,\n n,\n o,\n p = b.doc,\n q = \"_wysihtml5-temp-\" + +new Date(),\n r = /non-matching-class/g,\n s = 0;for (a.commands.formatInline.exec(b, d, e, q, r, d, d, !0, !0), h = p.querySelectorAll(e + \".\" + q), g = h.length; g > s; s++) {\n i = h[s], i.removeAttribute(\"class\");for (o in c) {\n \"text\" !== o && i.setAttribute(o, c[o]);\n }\n }l = i, 1 === g && (m = f.getTextContent(i), j = !!i.querySelector(\"*\"), k = \"\" === m || m === a.INVISIBLE_SPACE, !j && k && (f.setTextContent(i, c.text || i.href), n = p.createTextNode(\" \"), b.selection.setAfter(i), f.insert(n).after(i), l = n)), b.selection.setAfter(l);\n }function c(a, b, c) {\n var d, e, f, g;for (e = b.length; e--;) {\n for (d = b[e].attributes, f = d.length; f--;) {\n b[e].removeAttribute(d.item(f).name);\n }for (g in c) {\n c.hasOwnProperty(g) && b[e].setAttribute(g, c[g]);\n }\n }\n }var d,\n e = \"A\",\n f = a.dom;a.commands.createLink = { exec: function exec(a, d, e) {\n var f = this.state(a, d);f ? a.selection.executeAndRestore(function () {\n c(a, f, e);\n }) : (e = \"object\" == (typeof e === \"undefined\" ? \"undefined\" : _typeof(e)) ? e : { href: e }, b(a, e));\n }, state: function state(b, c) {\n return a.commands.formatInline.state(b, c, \"A\");\n } };\n}(wysihtml5), function (a) {\n function b(a, b) {\n for (var d, e, f, g = b.length, h = 0; g > h; h++) {\n d = b[h], e = c.getParentElement(d, { nodeName: \"code\" }), f = c.getTextContent(d), f.match(c.autoLink.URL_REG_EXP) && !e ? e = c.renameElement(d, \"code\") : c.replaceWithChildNodes(d);\n }\n }var c = a.dom;a.commands.removeLink = { exec: function exec(a, c) {\n var d = this.state(a, c);d && a.selection.executeAndRestore(function () {\n b(a, d);\n });\n }, state: function state(b, c) {\n return a.commands.formatInline.state(b, c, \"A\");\n } };\n}(wysihtml5), function (a) {\n var b = /wysiwyg-font-size-[0-9a-z\\-]+/g;a.commands.fontSize = { exec: function exec(c, d, e) {\n a.commands.formatInline.execWithToggle(c, d, \"span\", \"wysiwyg-font-size-\" + e, b);\n }, state: function state(c, d, e) {\n return a.commands.formatInline.state(c, d, \"span\", \"wysiwyg-font-size-\" + e, b);\n } };\n}(wysihtml5), function (a) {\n var b = /(\\s|^)font-size\\s*:\\s*[^;\\s]+;?/gi;a.commands.fontSizeStyle = { exec: function exec(c, d, e) {\n e = \"object\" == (typeof e === \"undefined\" ? \"undefined\" : _typeof(e)) ? e.size : e, /^\\s*$/.test(e) || a.commands.formatInline.execWithToggle(c, d, \"span\", !1, !1, \"font-size:\" + e, b);\n }, state: function state(c, d) {\n return a.commands.formatInline.state(c, d, \"span\", !1, !1, \"font-size\", b);\n }, stateValue: function stateValue(b, c) {\n var d,\n e = this.state(b, c);return e && a.lang.object(e).isArray() && (e = e[0]), e && (d = e.getAttribute(\"style\"), d) ? a.quirks.styleParser.parseFontSize(d) : !1;\n } };\n}(wysihtml5), function (a) {\n var b = /wysiwyg-color-[0-9a-z]+/g;a.commands.foreColor = { exec: function exec(c, d, e) {\n a.commands.formatInline.execWithToggle(c, d, \"span\", \"wysiwyg-color-\" + e, b);\n }, state: function state(c, d, e) {\n return a.commands.formatInline.state(c, d, \"span\", \"wysiwyg-color-\" + e, b);\n } };\n}(wysihtml5), function (a) {\n var b = /(\\s|^)color\\s*:\\s*[^;\\s]+;?/gi;a.commands.foreColorStyle = { exec: function exec(c, d, e) {\n var f,\n g = a.quirks.styleParser.parseColor(\"object\" == (typeof e === \"undefined\" ? \"undefined\" : _typeof(e)) ? \"color:\" + e.color : \"color:\" + e, \"color\");g && (f = \"color: rgb(\" + g[0] + \",\" + g[1] + \",\" + g[2] + \");\", 1 !== g[3] && (f += \"color: rgba(\" + g[0] + \",\" + g[1] + \",\" + g[2] + \",\" + g[3] + \");\"), a.commands.formatInline.execWithToggle(c, d, \"span\", !1, !1, f, b));\n }, state: function state(c, d) {\n return a.commands.formatInline.state(c, d, \"span\", !1, !1, \"color\", b);\n }, stateValue: function stateValue(b, c, d) {\n var e,\n f = this.state(b, c);return f && a.lang.object(f).isArray() && (f = f[0]), f && (e = f.getAttribute(\"style\"), e && e) ? (val = a.quirks.styleParser.parseColor(e, \"color\"), a.quirks.styleParser.unparseColor(val, d)) : !1;\n } };\n}(wysihtml5), function (a) {\n var b = /(\\s|^)background-color\\s*:\\s*[^;\\s]+;?/gi;a.commands.bgColorStyle = { exec: function exec(c, d, e) {\n var f,\n g = a.quirks.styleParser.parseColor(\"object\" == (typeof e === \"undefined\" ? \"undefined\" : _typeof(e)) ? \"background-color:\" + e.color : \"background-color:\" + e, \"background-color\");g && (f = \"background-color: rgb(\" + g[0] + \",\" + g[1] + \",\" + g[2] + \");\", 1 !== g[3] && (f += \"background-color: rgba(\" + g[0] + \",\" + g[1] + \",\" + g[2] + \",\" + g[3] + \");\"), a.commands.formatInline.execWithToggle(c, d, \"span\", !1, !1, f, b));\n }, state: function state(c, d) {\n return a.commands.formatInline.state(c, d, \"span\", !1, !1, \"background-color\", b);\n }, stateValue: function stateValue(b, c, d) {\n var e,\n f = this.state(b, c),\n g = !1;return f && a.lang.object(f).isArray() && (f = f[0]), f && (e = f.getAttribute(\"style\"), e) ? (g = a.quirks.styleParser.parseColor(e, \"background-color\"), a.quirks.styleParser.unparseColor(g, d)) : !1;\n } };\n}(wysihtml5), function (a) {\n function b(b, c, e) {\n b.className ? (d(b, e), b.className = a.lang.string(b.className + \" \" + c).trim()) : b.className = c;\n }function c(b, c, d) {\n e(b, d), b.getAttribute(\"style\") ? b.setAttribute(\"style\", a.lang.string(b.getAttribute(\"style\") + \" \" + c).trim()) : b.setAttribute(\"style\", c);\n }function d(b, c) {\n var d = c.test(b.className);return b.className = b.className.replace(c, \"\"), \"\" == a.lang.string(b.className).trim() && b.removeAttribute(\"class\"), d;\n }function e(b, c) {\n var d = c.test(b.getAttribute(\"style\"));return b.setAttribute(\"style\", (b.getAttribute(\"style\") || \"\").replace(c, \"\")), \"\" == a.lang.string(b.getAttribute(\"style\") || \"\").trim() && b.removeAttribute(\"style\"), d;\n }function f(a) {\n var b = a.lastChild;b && g(b) && b.parentNode.removeChild(b);\n }function g(a) {\n return \"BR\" === a.nodeName;\n }function h(b, c) {\n var d, e, g;for (b.selection.isCollapsed() && b.selection.selectLine(), d = b.selection.surround(c), e = 0, g = d.length; g > e; e++) {\n a.dom.lineBreaks(d[e]).remove(), f(d[e]);\n }\n }function i(b) {\n return !!a.lang.string(b.className).trim();\n }function j(b) {\n return !!a.lang.string(b.getAttribute(\"style\") || \"\").trim();\n }var k = a.dom,\n l = [\"H1\", \"H2\", \"H3\", \"H4\", \"H5\", \"H6\", \"P\", \"PRE\", \"DIV\"];a.commands.formatBlock = { exec: function exec(f, g, m, n, o, p, q) {\n var r,\n s,\n t,\n u,\n v,\n w = (f.doc, this.state(f, g, m, n, o, p, q)),\n x = f.config.useLineBreaks,\n y = x ? \"DIV\" : \"P\";return m = \"string\" == typeof m ? m.toUpperCase() : m, w.length ? (f.selection.executeAndRestoreRangy(function () {\n var b, c, f;for (b = w.length; b--;) {\n if (o && (s = d(w[b], o)), q && (u = e(w[b], q)), (u || s) && null === m && w[b].nodeName != y) return;c = i(w[b]), f = j(w[b]), c || f || !x && \"P\" !== m ? k.renameElement(w[b], \"P\" === m ? \"DIV\" : y) : (a.dom.lineBreaks(w[b]).add(), k.replaceWithChildNodes(w[b]));\n }\n }), void 0) : ((null !== m && !a.lang.array(l).contains(m) || (r = f.selection.findNodesInSelection(l).concat(f.selection.getSelectedOwnNodes()), f.selection.executeAndRestoreRangy(function () {\n for (var a = r.length; a--;) {\n v = k.getParentElement(r[a], { nodeName: l }), v == f.element && (v = null), v && (m && (v = k.renameElement(v, m)), n && b(v, n, o), p && c(v, p, q), t = !0);\n }\n }), !t)) && h(f, { nodeName: m || y, className: n || null, cssStyle: p || null }), void 0);\n }, state: function state(b, c, d, e, f, g, h) {\n var i,\n j,\n l,\n m = b.selection.getSelectedOwnNodes(),\n n = [];for (d = \"string\" == typeof d ? d.toUpperCase() : d, j = 0, l = m.length; l > j; j++) {\n i = k.getParentElement(m[j], { nodeName: d, className: e, classRegExp: f, cssStyle: g, styleRegExp: h }), i && -1 == a.lang.array(n).indexOf(i) && n.push(i);\n }return 0 == n.length ? !1 : n;\n } };\n}(wysihtml5), wysihtml5.commands.formatCode = { exec: function exec(a, b, c) {\n var d,\n e,\n f,\n g = this.state(a);g ? a.selection.executeAndRestore(function () {\n d = g.querySelector(\"code\"), wysihtml5.dom.replaceWithChildNodes(g), d && wysihtml5.dom.replaceWithChildNodes(d);\n }) : (e = a.selection.getRange(), f = e.extractContents(), g = a.doc.createElement(\"pre\"), d = a.doc.createElement(\"code\"), c && (d.className = c), g.appendChild(d), d.appendChild(f), e.insertNode(g), a.selection.selectNode(g));\n }, state: function state(a) {\n var b = a.selection.getSelectedNode();return b && b.nodeName && \"PRE\" == b.nodeName && b.firstChild && b.firstChild.nodeName && \"CODE\" == b.firstChild.nodeName ? b : wysihtml5.dom.getParentElement(b, { nodeName: \"CODE\" }) && wysihtml5.dom.getParentElement(b, { nodeName: \"PRE\" });\n } }, function (a) {\n function b(a) {\n var b = d[a];return b ? [a.toLowerCase(), b.toLowerCase()] : [a.toLowerCase()];\n }function c(c, d, f, g, h, i) {\n var j = c;return d && (j += \":\" + d), g && (j += \":\" + g), e[j] || (e[j] = new a.selection.HTMLApplier(b(c), d, f, !0, g, h, i)), e[j];\n }var d = { strong: \"b\", em: \"i\", b: \"strong\", i: \"em\" },\n e = {};a.commands.formatInline = { exec: function exec(a, b, d, e, f, g, h, i, j) {\n var k = a.selection.createRange(),\n l = a.selection.getOwnRanges();return l && 0 != l.length ? (a.selection.getSelection().removeAllRanges(), c(d, e, f, g, h, a.element).toggleRange(l), i ? j || a.cleanUp() : (k.setStart(l[0].startContainer, l[0].startOffset), k.setEnd(l[l.length - 1].endContainer, l[l.length - 1].endOffset), a.selection.setSelection(k), a.selection.executeAndRestore(function () {\n j || a.cleanUp();\n }, !0, !0)), void 0) : !1;\n }, execWithToggle: function execWithToggle(b, c, d, e, f, g, h) {\n var i,\n j = this;this.state(b, c, d, e, f, g, h) && b.selection.isCollapsed() && !b.selection.caretIsLastInSelection() && !b.selection.caretIsFirstInSelection() ? (i = j.state(b, c, d, e, f)[0], b.selection.executeAndRestoreRangy(function () {\n i.parentNode;b.selection.selectNode(i, !0), a.commands.formatInline.exec(b, c, d, e, f, g, h, !0, !0);\n })) : this.state(b, c, d, e, f, g, h) && !b.selection.isCollapsed() ? b.selection.executeAndRestoreRangy(function () {\n a.commands.formatInline.exec(b, c, d, e, f, g, h, !0, !0);\n }) : a.commands.formatInline.exec(b, c, d, e, f, g, h);\n }, state: function state(b, e, f, g, h, i, j) {\n var k,\n l,\n m = b.doc,\n n = d[f] || f;return a.dom.hasElementWithTagName(m, f) || a.dom.hasElementWithTagName(m, n) ? g && !a.dom.hasElementWithClassName(m, g) ? !1 : (k = b.selection.getOwnRanges(), k && 0 !== k.length ? (l = c(f, g, h, i, j, b.element).isAppliedToRange(k), l && l.elements ? l.elements : !1) : !1) : !1;\n } };\n}(wysihtml5), function (a) {\n a.commands.insertBlockQuote = { exec: function exec(b, c) {\n var d = this.state(b, c),\n e = b.selection.isEndToEndInNode([\"H1\", \"H2\", \"H3\", \"H4\", \"H5\", \"H6\", \"P\"]);b.selection.executeAndRestore(function () {\n if (d) b.config.useLineBreaks && a.dom.lineBreaks(d).add(), a.dom.unwrap(d);else if (b.selection.isCollapsed() && b.selection.selectLine(), e) {\n var c = e.ownerDocument.createElement(\"blockquote\");a.dom.insert(c).after(e), c.appendChild(e);\n } else b.selection.surround({ nodeName: \"blockquote\" });\n });\n }, state: function state(b) {\n var c = b.selection.getSelectedNode(),\n d = a.dom.getParentElement(c, { nodeName: \"BLOCKQUOTE\" }, !1, b.element);return d ? d : !1;\n } };\n}(wysihtml5), wysihtml5.commands.insertHTML = { exec: function exec(a, b, c) {\n a.commands.support(b) ? a.doc.execCommand(b, !1, c) : a.selection.insertHTML(c);\n }, state: function state() {\n return !1;\n } }, function (a) {\n var b = \"IMG\";a.commands.insertImage = { exec: function exec(c, d, e) {\n var f, g, h, i, j;if (e = \"object\" == (typeof e === \"undefined\" ? \"undefined\" : _typeof(e)) ? e : { src: e }, f = c.doc, g = this.state(c), g) return c.selection.setBefore(g), i = g.parentNode, i.removeChild(g), a.dom.removeEmptyTextNodes(i), \"A\" !== i.nodeName || i.firstChild || (c.selection.setAfter(i), i.parentNode.removeChild(i)), a.quirks.redraw(c.element), void 0;g = f.createElement(b);for (j in e) {\n g.setAttribute(\"className\" === j ? \"class\" : j, e[j]);\n }c.selection.insertNode(g), a.browser.hasProblemsSettingCaretAfterImg() ? (h = f.createTextNode(a.INVISIBLE_SPACE), c.selection.insertNode(h), c.selection.setAfter(h)) : c.selection.setAfter(g);\n }, state: function state(c) {\n var d,\n e,\n f,\n g = c.doc;return a.dom.hasElementWithTagName(g, b) ? (d = c.selection.getSelectedNode(), d ? d.nodeName === b ? d : d.nodeType !== a.ELEMENT_NODE ? !1 : (e = c.selection.getText(), e = a.lang.string(e).trim(), e ? !1 : (f = c.selection.getNodes(a.ELEMENT_NODE, function (a) {\n return \"IMG\" === a.nodeName;\n }), 1 !== f.length ? !1 : f[0])) : !1) : !1;\n } };\n}(wysihtml5), function (a) {\n var b = \"<br>\" + (a.browser.needsSpaceAfterLineBreak() ? \" \" : \"\");a.commands.insertLineBreak = { exec: function exec(c, d) {\n c.commands.support(d) ? (c.doc.execCommand(d, !1, null), a.browser.autoScrollsToCaret() || c.selection.scrollIntoView()) : c.commands.exec(\"insertHTML\", b);\n }, state: function state() {\n return !1;\n } };\n}(wysihtml5), wysihtml5.commands.insertOrderedList = { exec: function exec(a, b) {\n wysihtml5.commands.insertList.exec(a, b, \"OL\");\n }, state: function state(a, b) {\n return wysihtml5.commands.insertList.state(a, b, \"OL\");\n } }, wysihtml5.commands.insertUnorderedList = { exec: function exec(a, b) {\n wysihtml5.commands.insertList.exec(a, b, \"UL\");\n }, state: function state(a, b) {\n return wysihtml5.commands.insertList.state(a, b, \"UL\");\n } }, wysihtml5.commands.insertList = function (a) {\n var b = function b(a, _b3) {\n if (a && a.nodeName) {\n \"string\" == typeof _b3 && (_b3 = [_b3]);for (var c = _b3.length; c--;) {\n if (a.nodeName === _b3[c]) return !0;\n }\n }return !1;\n },\n c = function (_c) {\n function c(_x, _x2, _x3) {\n return _c.apply(this, arguments);\n }\n\n c.toString = function () {\n return _c.toString();\n };\n\n return c;\n }(function (c, d, e) {\n var f,\n g,\n h = { el: null, other: !1 };return c && (f = a.dom.getParentElement(c, { nodeName: \"LI\" }), g = \"UL\" === d ? \"OL\" : \"UL\", b(c, d) ? h.el = c : b(c, g) ? h = { el: c, other: !0 } : f && (b(f.parentNode, d) ? h.el = f.parentNode : b(f.parentNode, g) && (h = { el: f.parentNode, other: !0 }))), h.el && !e.element.contains(h.el) && (h.el = null), h;\n }),\n d = function d(b, c, _d) {\n var e,\n g = \"UL\" === c ? \"OL\" : \"UL\";_d.selection.executeAndRestore(function () {\n var h,\n i,\n j = f(g, _d);if (j.length) for (h = j.length; h--;) {\n a.dom.renameElement(j[h], c.toLowerCase());\n } else {\n for (e = f([\"OL\", \"UL\"], _d), i = e.length; i--;) {\n a.dom.resolveList(e[i], _d.config.useLineBreaks);\n }a.dom.resolveList(b, _d.config.useLineBreaks);\n }\n });\n },\n e = function e(b, c, d) {\n var e = \"UL\" === c ? \"OL\" : \"UL\";d.selection.executeAndRestore(function () {\n var g,\n h = [b].concat(f(e, d));for (g = h.length; g--;) {\n a.dom.renameElement(h[g], c.toLowerCase());\n }\n });\n },\n f = function f(a, c) {\n var d,\n e = c.selection.getOwnRanges(),\n f = [];for (d = e.length; d--;) {\n f = f.concat(e[d].getNodes([1], function (c) {\n return b(c, a);\n }));\n }return f;\n },\n g = function g(b, c) {\n c.selection.executeAndRestoreRangy(function () {\n var d,\n e,\n f = \"_wysihtml5-temp-\" + new Date().getTime(),\n g = c.selection.deblockAndSurround({ nodeName: \"div\", className: f }),\n h = /\\uFEFF/g;g.innerHTML = g.innerHTML.replace(h, \"\"), g && (d = a.lang.array([\"\", \"<br>\", a.INVISIBLE_SPACE]).contains(g.innerHTML), e = a.dom.convertToList(g, b.toLowerCase(), c.parent.config.uneditableContainerClassname), d && c.selection.selectNode(e.querySelector(\"li\"), !0));\n });\n };return { exec: function exec(a, b, f) {\n var h = a.doc,\n i = \"OL\" === f ? \"insertOrderedList\" : \"insertUnorderedList\",\n j = a.selection.getSelectedNode(),\n k = c(j, f, a);k.el ? k.other ? e(k.el, f, a) : d(k.el, f, a) : a.commands.support(i) ? h.execCommand(i, !1, null) : g(f, a);\n }, state: function state(a, b, d) {\n var e = a.selection.getSelectedNode(),\n f = c(e, d, a);return f.el && !f.other ? f.el : !1;\n } };\n}(wysihtml5), wysihtml5.commands.italic = { exec: function exec(a, b) {\n wysihtml5.commands.formatInline.execWithToggle(a, b, \"i\");\n }, state: function state(a, b) {\n return wysihtml5.commands.formatInline.state(a, b, \"i\");\n } }, function (a) {\n var b = \"wysiwyg-text-align-center\",\n c = /wysiwyg-text-align-[0-9a-z]+/g;a.commands.justifyCenter = { exec: function exec(d) {\n return a.commands.formatBlock.exec(d, \"formatBlock\", null, b, c);\n }, state: function state(d) {\n return a.commands.formatBlock.state(d, \"formatBlock\", null, b, c);\n } };\n}(wysihtml5), function (a) {\n var b = \"wysiwyg-text-align-left\",\n c = /wysiwyg-text-align-[0-9a-z]+/g;a.commands.justifyLeft = { exec: function exec(d) {\n return a.commands.formatBlock.exec(d, \"formatBlock\", null, b, c);\n }, state: function state(d) {\n return a.commands.formatBlock.state(d, \"formatBlock\", null, b, c);\n } };\n}(wysihtml5), function (a) {\n var b = \"wysiwyg-text-align-right\",\n c = /wysiwyg-text-align-[0-9a-z]+/g;a.commands.justifyRight = { exec: function exec(d) {\n return a.commands.formatBlock.exec(d, \"formatBlock\", null, b, c);\n }, state: function state(d) {\n return a.commands.formatBlock.state(d, \"formatBlock\", null, b, c);\n } };\n}(wysihtml5), function (a) {\n var b = \"wysiwyg-text-align-justify\",\n c = /wysiwyg-text-align-[0-9a-z]+/g;a.commands.justifyFull = { exec: function exec(d) {\n return a.commands.formatBlock.exec(d, \"formatBlock\", null, b, c);\n }, state: function state(d) {\n return a.commands.formatBlock.state(d, \"formatBlock\", null, b, c);\n } };\n}(wysihtml5), function (a) {\n var b = \"text-align: right;\",\n c = /(\\s|^)text-align\\s*:\\s*[^;\\s]+;?/gi;a.commands.alignRightStyle = { exec: function exec(d) {\n return a.commands.formatBlock.exec(d, \"formatBlock\", null, null, null, b, c);\n }, state: function state(d) {\n return a.commands.formatBlock.state(d, \"formatBlock\", null, null, null, b, c);\n } };\n}(wysihtml5), function (a) {\n var b = \"text-align: left;\",\n c = /(\\s|^)text-align\\s*:\\s*[^;\\s]+;?/gi;a.commands.alignLeftStyle = { exec: function exec(d) {\n return a.commands.formatBlock.exec(d, \"formatBlock\", null, null, null, b, c);\n }, state: function state(d) {\n return a.commands.formatBlock.state(d, \"formatBlock\", null, null, null, b, c);\n } };\n}(wysihtml5), function (a) {\n var b = \"text-align: center;\",\n c = /(\\s|^)text-align\\s*:\\s*[^;\\s]+;?/gi;a.commands.alignCenterStyle = { exec: function exec(d) {\n return a.commands.formatBlock.exec(d, \"formatBlock\", null, null, null, b, c);\n }, state: function state(d) {\n return a.commands.formatBlock.state(d, \"formatBlock\", null, null, null, b, c);\n } };\n}(wysihtml5), wysihtml5.commands.redo = { exec: function exec(a) {\n return a.undoManager.redo();\n }, state: function state() {\n return !1;\n } }, wysihtml5.commands.underline = { exec: function exec(a, b) {\n wysihtml5.commands.formatInline.execWithToggle(a, b, \"u\");\n }, state: function state(a, b) {\n return wysihtml5.commands.formatInline.state(a, b, \"u\");\n } }, wysihtml5.commands.undo = { exec: function exec(a) {\n return a.undoManager.undo();\n }, state: function state() {\n return !1;\n } }, wysihtml5.commands.createTable = { exec: function exec(a, b, c) {\n var d, e, f;if (c && c.cols && c.rows && parseInt(c.cols, 10) > 0 && parseInt(c.rows, 10) > 0) {\n for (f = c.tableStyle ? '<table style=\"' + c.tableStyle + '\">' : \"<table>\", f += \"<tbody>\", e = 0; e < c.rows; e++) {\n for (f += \"<tr>\", d = 0; d < c.cols; d++) {\n f += \"<td>&nbsp;</td>\";\n }f += \"</tr>\";\n }f += \"</tbody></table>\", a.commands.exec(\"insertHTML\", f);\n }\n }, state: function state() {\n return !1;\n } }, wysihtml5.commands.mergeTableCells = { exec: function exec(a, b) {\n a.tableSelection && a.tableSelection.start && a.tableSelection.end && (this.state(a, b) ? wysihtml5.dom.table.unmergeCell(a.tableSelection.start) : wysihtml5.dom.table.mergeCellsBetween(a.tableSelection.start, a.tableSelection.end));\n }, state: function state(a) {\n if (a.tableSelection) {\n var b = a.tableSelection.start,\n c = a.tableSelection.end;if (b && c && b == c && (wysihtml5.dom.getAttribute(b, \"colspan\") && parseInt(wysihtml5.dom.getAttribute(b, \"colspan\"), 10) > 1 || wysihtml5.dom.getAttribute(b, \"rowspan\") && parseInt(wysihtml5.dom.getAttribute(b, \"rowspan\"), 10) > 1)) return [b];\n }return !1;\n } }, wysihtml5.commands.addTableCells = { exec: function exec(a, b, c) {\n if (a.tableSelection && a.tableSelection.start && a.tableSelection.end) {\n var d = wysihtml5.dom.table.orderSelectionEnds(a.tableSelection.start, a.tableSelection.end);\"before\" == c || \"above\" == c ? wysihtml5.dom.table.addCells(d.start, c) : (\"after\" == c || \"below\" == c) && wysihtml5.dom.table.addCells(d.end, c), setTimeout(function () {\n a.tableSelection.select(d.start, d.end);\n }, 0);\n }\n }, state: function state() {\n return !1;\n } }, wysihtml5.commands.deleteTableCells = { exec: function exec(a, b, c) {\n if (a.tableSelection && a.tableSelection.start && a.tableSelection.end) {\n var d,\n e = wysihtml5.dom.table.orderSelectionEnds(a.tableSelection.start, a.tableSelection.end),\n f = wysihtml5.dom.table.indexOf(e.start),\n g = a.tableSelection.table;wysihtml5.dom.table.removeCells(e.start, c), setTimeout(function () {\n d = wysihtml5.dom.table.findCell(g, f), d || (\"row\" == c && (d = wysihtml5.dom.table.findCell(g, { row: f.row - 1, col: f.col })), \"column\" == c && (d = wysihtml5.dom.table.findCell(g, { row: f.row, col: f.col - 1 }))), d && a.tableSelection.select(d, d);\n }, 0);\n }\n }, state: function state() {\n return !1;\n } }, wysihtml5.commands.indentList = { exec: function exec(a) {\n var b = a.selection.getSelectionParentsByTag(\"LI\");return b ? this.tryToPushLiLevel(b, a.selection) : !1;\n }, state: function state() {\n return !1;\n }, tryToPushLiLevel: function tryToPushLiLevel(a, b) {\n var c,\n d,\n e,\n f,\n g,\n h = !1;return b.executeAndRestoreRangy(function () {\n for (var b = a.length; b--;) {\n f = a[b], c = \"OL\" === f.parentNode.nodeName ? \"OL\" : \"UL\", d = f.ownerDocument.createElement(c), e = wysihtml5.dom.domNode(f).prev({ nodeTypes: [wysihtml5.ELEMENT_NODE] }), g = e ? e.querySelector(\"ul, ol\") : null, e && (g ? g.appendChild(f) : (d.appendChild(f), e.appendChild(d)), h = !0);\n }\n }), h;\n } }, wysihtml5.commands.outdentList = { exec: function exec(a) {\n var b = a.selection.getSelectionParentsByTag(\"LI\");return b ? this.tryToPullLiLevel(b, a) : !1;\n }, state: function state() {\n return !1;\n }, tryToPullLiLevel: function tryToPullLiLevel(a, b) {\n var c,\n d,\n e,\n f,\n g,\n h = !1,\n i = this;return b.selection.executeAndRestoreRangy(function () {\n var j, k;for (j = a.length; j--;) {\n if (f = a[j], f.parentNode && (c = f.parentNode, \"OL\" === c.tagName || \"UL\" === c.tagName)) {\n if (h = !0, d = wysihtml5.dom.getParentElement(c.parentNode, { nodeName: [\"OL\", \"UL\"] }, !1, b.element), e = wysihtml5.dom.getParentElement(c.parentNode, { nodeName: [\"LI\"] }, !1, b.element), d && e) f.nextSibling && (g = i.getAfterList(c, f), f.appendChild(g)), d.insertBefore(f, e.nextSibling);else {\n for (f.nextSibling && (g = i.getAfterList(c, f), f.appendChild(g)), k = f.childNodes.length; k--;) {\n c.parentNode.insertBefore(f.childNodes[k], c.nextSibling);\n }c.parentNode.insertBefore(document.createElement(\"br\"), c.nextSibling), f.parentNode.removeChild(f);\n }0 === c.childNodes.length && c.parentNode.removeChild(c);\n }\n }\n }), h;\n }, getAfterList: function getAfterList(a, b) {\n for (var c = a.nodeName, d = document.createElement(c); b.nextSibling;) {\n d.appendChild(b.nextSibling);\n }return d;\n } }, function (a) {\n var b = 90,\n c = 89,\n d = 8,\n e = 46,\n f = 25,\n g = \"data-wysihtml5-selection-node\",\n h = \"data-wysihtml5-selection-offset\",\n i = ('<span id=\"_wysihtml5-undo\" class=\"_wysihtml5-temp\">' + a.INVISIBLE_SPACE + \"</span>\", '<span id=\"_wysihtml5-redo\" class=\"_wysihtml5-temp\">' + a.INVISIBLE_SPACE + \"</span>\", a.dom);a.UndoManager = a.lang.Dispatcher.extend({ constructor: function constructor(a) {\n this.editor = a, this.composer = a.composer, this.element = this.composer.element, this.position = 0, this.historyStr = [], this.historyDom = [], this.transact(), this._observe();\n }, _observe: function _observe() {\n {\n var a,\n f = this;this.composer.sandbox.getDocument();\n }i.observe(this.element, \"keydown\", function (a) {\n if (!a.altKey && (a.ctrlKey || a.metaKey)) {\n var d = a.keyCode,\n e = d === b && !a.shiftKey,\n g = d === b && a.shiftKey || d === c;e ? (f.undo(), a.preventDefault()) : g && (f.redo(), a.preventDefault());\n }\n }), i.observe(this.element, \"keydown\", function (b) {\n var c = b.keyCode;c !== a && (a = c, (c === d || c === e) && f.transact());\n }), this.editor.on(\"newword:composer\", function () {\n f.transact();\n }).on(\"beforecommand:composer\", function () {\n f.transact();\n });\n }, transact: function transact() {\n var b,\n c,\n d,\n e,\n i,\n j,\n k,\n l = this.historyStr[this.position - 1],\n m = this.composer.getValue(!1, !1),\n n = this.element.offsetWidth > 0 && this.element.offsetHeight > 0;m !== l && (j = this.historyStr.length = this.historyDom.length = this.position, j > f && (this.historyStr.shift(), this.historyDom.shift(), this.position--), this.position++, n && (b = this.composer.selection.getRange(), c = b && b.startContainer ? b.startContainer : this.element, d = b && b.startOffset ? b.startOffset : 0, c.nodeType === a.ELEMENT_NODE ? e = c : (e = c.parentNode, i = this.getChildNodeIndex(e, c)), e.setAttribute(h, d), void 0 !== i && e.setAttribute(g, i)), k = this.element.cloneNode(!!m), this.historyDom.push(k), this.historyStr.push(m), e && (e.removeAttribute(h), e.removeAttribute(g)));\n }, undo: function undo() {\n this.transact(), this.undoPossible() && (this.set(this.historyDom[--this.position - 1]), this.editor.fire(\"undo:composer\"));\n }, redo: function redo() {\n this.redoPossible() && (this.set(this.historyDom[++this.position - 1]), this.editor.fire(\"redo:composer\"));\n }, undoPossible: function undoPossible() {\n return this.position > 1;\n }, redoPossible: function redoPossible() {\n return this.position < this.historyStr.length;\n }, set: function set(a) {\n var b, c, d, e, f, i;for (this.element.innerHTML = \"\", b = 0, c = a.childNodes, d = a.childNodes.length; d > b; b++) {\n this.element.appendChild(c[b].cloneNode(!0));\n }a.hasAttribute(h) ? (e = a.getAttribute(h), i = a.getAttribute(g), f = this.element) : (f = this.element.querySelector(\"[\" + h + \"]\") || this.element, e = f.getAttribute(h), i = f.getAttribute(g), f.removeAttribute(h), f.removeAttribute(g)), null !== i && (f = this.getChildNodeByIndex(f, +i)), this.composer.selection.set(f, e);\n }, getChildNodeIndex: function getChildNodeIndex(a, b) {\n for (var c = 0, d = a.childNodes, e = d.length; e > c; c++) {\n if (d[c] === b) return c;\n }\n }, getChildNodeByIndex: function getChildNodeByIndex(a, b) {\n return a.childNodes[b];\n } });\n}(wysihtml5), wysihtml5.views.View = Base.extend({ constructor: function constructor(a, b, c) {\n this.parent = a, this.element = b, this.config = c, this.config.noTextarea || this._observeViewChange();\n }, _observeViewChange: function _observeViewChange() {\n var a = this;this.parent.on(\"beforeload\", function () {\n a.parent.on(\"change_view\", function (b) {\n b === a.name ? (a.parent.currentView = a, a.show(), setTimeout(function () {\n a.focus();\n }, 0)) : a.hide();\n });\n });\n }, focus: function focus() {\n if (this.element.ownerDocument.querySelector(\":focus\") !== this.element) try {\n this.element.focus();\n } catch (a) {}\n }, hide: function hide() {\n this.element.style.display = \"none\";\n }, show: function show() {\n this.element.style.display = \"\";\n }, disable: function disable() {\n this.element.setAttribute(\"disabled\", \"disabled\");\n }, enable: function enable() {\n this.element.removeAttribute(\"disabled\");\n } }), function (a) {\n var b = a.dom,\n c = a.browser;a.views.Composer = a.views.View.extend({ name: \"composer\", CARET_HACK: \"<br>\", constructor: function constructor(a, b, c) {\n this.base(a, b, c), this.config.noTextarea ? this.editableArea = b : this.textarea = this.parent.textarea, this.config.contentEditableMode ? this._initContentEditableArea() : this._initSandbox();\n }, clear: function clear() {\n this.element.innerHTML = c.displaysCaretInEmptyContentEditableCorrectly() ? \"\" : this.CARET_HACK;\n }, getValue: function getValue(b, c) {\n var d = this.isEmpty() ? \"\" : a.quirks.getCorrectInnerHTML(this.element);return b !== !1 && (d = this.parent.parse(d, c === !1 ? !1 : !0)), d;\n }, setValue: function setValue(a, b) {\n b && (a = this.parent.parse(a));try {\n this.element.innerHTML = a;\n } catch (c) {\n this.element.innerText = a;\n }\n }, cleanUp: function cleanUp() {\n this.parent.parse(this.element);\n }, show: function show() {\n this.editableArea.style.display = this._displayStyle || \"\", this.config.noTextarea || this.textarea.element.disabled || (this.disable(), this.enable());\n }, hide: function hide() {\n this._displayStyle = b.getStyle(\"display\").from(this.editableArea), \"none\" === this._displayStyle && (this._displayStyle = null), this.editableArea.style.display = \"none\";\n }, disable: function disable() {\n this.parent.fire(\"disable:composer\"), this.element.removeAttribute(\"contentEditable\");\n }, enable: function enable() {\n this.parent.fire(\"enable:composer\"), this.element.setAttribute(\"contentEditable\", \"true\");\n }, focus: function focus(b) {\n a.browser.doesAsyncFocus() && this.hasPlaceholderSet() && this.clear(), this.base();var c = this.element.lastChild;b && c && this.selection && (\"BR\" === c.nodeName ? this.selection.setBefore(this.element.lastChild) : this.selection.setAfter(this.element.lastChild));\n }, getTextContent: function getTextContent() {\n return b.getTextContent(this.element);\n }, hasPlaceholderSet: function hasPlaceholderSet() {\n return this.getTextContent() == (this.config.noTextarea ? this.editableArea.getAttribute(\"data-placeholder\") : this.textarea.element.getAttribute(\"placeholder\")) && this.placeholderSet;\n }, isEmpty: function isEmpty() {\n var a = this.element.innerHTML.toLowerCase();return (/^(\\s|<br>|<\\/br>|<p>|<\\/p>)*$/i.test(a) || \"\" === a || \"<br>\" === a || \"<p></p>\" === a || \"<p><br></p>\" === a || this.hasPlaceholderSet()\n );\n }, _initContentEditableArea: function _initContentEditableArea() {\n var a = this;this.config.noTextarea ? this.sandbox = new b.ContentEditableArea(function () {\n a._create();\n }, {}, this.editableArea) : (this.sandbox = new b.ContentEditableArea(function () {\n a._create();\n }), this.editableArea = this.sandbox.getContentEditable(), b.insert(this.editableArea).after(this.textarea.element), this._createWysiwygFormField());\n }, _initSandbox: function _initSandbox() {\n var a,\n c = this;this.sandbox = new b.Sandbox(function () {\n c._create();\n }, { stylesheets: this.config.stylesheets }), this.editableArea = this.sandbox.getIframe(), a = this.textarea.element, b.insert(this.editableArea).after(a), this._createWysiwygFormField();\n }, _createWysiwygFormField: function _createWysiwygFormField() {\n if (this.textarea.element.form) {\n var a = document.createElement(\"input\");a.type = \"hidden\", a.name = \"_wysihtml5_mode\", a.value = 1, b.insert(a).after(this.textarea.element);\n }\n }, _create: function _create() {\n var d,\n e,\n f = this;this.doc = this.sandbox.getDocument(), this.element = this.config.contentEditableMode ? this.sandbox.getContentEditable() : this.doc.body, this.config.noTextarea ? this.cleanUp() : (this.textarea = this.parent.textarea, this.element.innerHTML = this.textarea.getValue(!0, !1)), this.selection = new a.Selection(this.parent, this.element, this.config.uneditableContainerClassname), this.commands = new a.Commands(this.parent), this.config.noTextarea || b.copyAttributes([\"className\", \"spellcheck\", \"title\", \"lang\", \"dir\", \"accessKey\"]).from(this.textarea.element).to(this.element), b.addClass(this.element, this.config.composerClassName), this.config.style && !this.config.contentEditableMode && this.style(), this.observe(), d = this.config.name, d && (b.addClass(this.element, d), this.config.contentEditableMode || b.addClass(this.editableArea, d)), this.enable(), !this.config.noTextarea && this.textarea.element.disabled && this.disable(), e = \"string\" == typeof this.config.placeholder ? this.config.placeholder : this.config.noTextarea ? this.editableArea.getAttribute(\"data-placeholder\") : this.textarea.element.getAttribute(\"placeholder\"), e && b.simulatePlaceholder(this.parent, this, e), this.commands.exec(\"styleWithCSS\", !1), this._initAutoLinking(), this._initObjectResizing(), this._initUndoManager(), this._initLineBreaking(), this.config.noTextarea || !this.textarea.element.hasAttribute(\"autofocus\") && document.querySelector(\":focus\") != this.textarea.element || c.isIos() || setTimeout(function () {\n f.focus(!0);\n }, 100), c.clearsContentEditableCorrectly() || a.quirks.ensureProperClearing(this), this.initSync && this.config.sync && this.initSync(), this.config.noTextarea || this.textarea.hide(), this.parent.fire(\"beforeload\").fire(\"load\");\n }, _initAutoLinking: function _initAutoLinking() {\n var d,\n e,\n f,\n g = this,\n h = c.canDisableAutoLinking(),\n i = c.doesAutoLinkingInContentEditable();h && this.commands.exec(\"autoUrlDetect\", !1), this.config.autoLink && ((!i || i && h) && (this.parent.on(\"newword:composer\", function () {\n b.getTextContent(g.element).match(b.autoLink.URL_REG_EXP) && g.selection.executeAndRestore(function (c, d) {\n var e,\n f = g.element.querySelectorAll(\".\" + g.config.uneditableContainerClassname),\n h = !1;for (e = f.length; e--;) {\n a.dom.contains(f[e], d) && (h = !0);\n }h || b.autoLink(d.parentNode, [g.config.uneditableContainerClassname]);\n });\n }), b.observe(this.element, \"blur\", function () {\n b.autoLink(g.element, [g.config.uneditableContainerClassname]);\n })), d = this.sandbox.getDocument().getElementsByTagName(\"a\"), e = b.autoLink.URL_REG_EXP, f = function f(c) {\n var d = a.lang.string(b.getTextContent(c)).trim();return \"www.\" === d.substr(0, 4) && (d = \"http://\" + d), d;\n }, b.observe(this.element, \"keydown\", function (a) {\n if (d.length) {\n var c,\n h = g.selection.getSelectedNode(a.target.ownerDocument),\n i = b.getParentElement(h, { nodeName: \"A\" }, 4);i && (c = f(i), setTimeout(function () {\n var a = f(i);a !== c && a.match(e) && i.setAttribute(\"href\", a);\n }, 0));\n }\n }));\n }, _initObjectResizing: function _initObjectResizing() {\n if (this.commands.exec(\"enableObjectResizing\", !0), c.supportsEvent(\"resizeend\")) {\n var d = [\"width\", \"height\"],\n e = d.length,\n f = this.element;b.observe(f, \"resizeend\", function (b) {\n var c,\n g = b.target || b.srcElement,\n h = g.style,\n i = 0;if (\"IMG\" === g.nodeName) {\n for (; e > i; i++) {\n c = d[i], h[c] && (g.setAttribute(c, parseInt(h[c], 10)), h[c] = \"\");\n }a.quirks.redraw(f);\n }\n });\n }\n }, _initUndoManager: function _initUndoManager() {\n this.undoManager = new a.UndoManager(this.parent);\n }, _initLineBreaking: function _initLineBreaking() {\n function d(a) {\n var c = b.getParentElement(a, { nodeName: [\"P\", \"DIV\"] }, 2);c && b.contains(e.element, c) && e.selection.executeAndRestore(function () {\n e.config.useLineBreaks ? b.replaceWithChildNodes(c) : \"P\" !== c.nodeName && b.renameElement(c, \"p\");\n });\n }var e = this,\n f = [\"LI\", \"P\", \"H1\", \"H2\", \"H3\", \"H4\", \"H5\", \"H6\"],\n g = [\"UL\", \"OL\", \"MENU\"];this.config.useLineBreaks || b.observe(this.element, [\"focus\", \"keydown\"], function () {\n if (e.isEmpty()) {\n var a = e.doc.createElement(\"P\");e.element.innerHTML = \"\", e.element.appendChild(a), c.displaysCaretInEmptyContentEditableCorrectly() ? e.selection.selectNode(a, !0) : (a.innerHTML = \"<br>\", e.selection.setBefore(a.firstChild));\n }\n }), b.observe(this.element, \"keydown\", function (c) {\n var h,\n i = c.keyCode;if (!c.shiftKey && (i === a.ENTER_KEY || i === a.BACKSPACE_KEY)) return h = b.getParentElement(e.selection.getSelectedNode(), { nodeName: f }, 4), h ? (setTimeout(function () {\n var c,\n f = e.selection.getSelectedNode();if (\"LI\" === h.nodeName) {\n if (!f) return;c = b.getParentElement(f, { nodeName: g }, 2), c || d(f);\n }i === a.ENTER_KEY && h.nodeName.match(/^H[1-6]$/) && d(f);\n }, 0), void 0) : (e.config.useLineBreaks && i === a.ENTER_KEY && !a.browser.insertsLineBreaksOnReturn() && (c.preventDefault(), e.commands.exec(\"insertLineBreak\")), void 0);\n });\n } });\n}(wysihtml5), function (a) {\n var b = a.dom,\n c = document,\n d = window,\n e = c.createElement(\"div\"),\n f = [\"background-color\", \"color\", \"cursor\", \"font-family\", \"font-size\", \"font-style\", \"font-variant\", \"font-weight\", \"line-height\", \"letter-spacing\", \"text-align\", \"text-decoration\", \"text-indent\", \"text-rendering\", \"word-break\", \"word-wrap\", \"word-spacing\"],\n g = [\"background-color\", \"border-collapse\", \"border-bottom-color\", \"border-bottom-style\", \"border-bottom-width\", \"border-left-color\", \"border-left-style\", \"border-left-width\", \"border-right-color\", \"border-right-style\", \"border-right-width\", \"border-top-color\", \"border-top-style\", \"border-top-width\", \"clear\", \"display\", \"float\", \"margin-bottom\", \"margin-left\", \"margin-right\", \"margin-top\", \"outline-color\", \"outline-offset\", \"outline-width\", \"outline-style\", \"padding-left\", \"padding-right\", \"padding-top\", \"padding-bottom\", \"position\", \"top\", \"left\", \"right\", \"bottom\", \"z-index\", \"vertical-align\", \"text-align\", \"-webkit-box-sizing\", \"-moz-box-sizing\", \"-ms-box-sizing\", \"box-sizing\", \"-webkit-box-shadow\", \"-moz-box-shadow\", \"-ms-box-shadow\", \"box-shadow\", \"-webkit-border-top-right-radius\", \"-moz-border-radius-topright\", \"border-top-right-radius\", \"-webkit-border-bottom-right-radius\", \"-moz-border-radius-bottomright\", \"border-bottom-right-radius\", \"-webkit-border-bottom-left-radius\", \"-moz-border-radius-bottomleft\", \"border-bottom-left-radius\", \"-webkit-border-top-left-radius\", \"-moz-border-radius-topleft\", \"border-top-left-radius\", \"width\", \"height\"],\n h = [\"html { height: 100%; }\", \"body { height: 100%; padding: 1px 0 0 0; margin: -1px 0 0 0; }\", \"body > p:first-child { margin-top: 0; }\", \"._wysihtml5-temp { display: none; }\", a.browser.isGecko ? \"body.placeholder { color: graytext !important; }\" : \"body.placeholder { color: #a9a9a9 !important; }\", \"img:-moz-broken { -moz-force-broken-image-icon: 1; height: 24px; width: 24px; }\"],\n i = function i(a) {\n if (a.setActive) try {\n a.setActive();\n } catch (e) {} else {\n var f = a.style,\n g = c.documentElement.scrollTop || c.body.scrollTop,\n h = c.documentElement.scrollLeft || c.body.scrollLeft,\n i = { position: f.position, top: f.top, left: f.left, WebkitUserSelect: f.WebkitUserSelect };b.setStyles({ position: \"absolute\", top: \"-99999px\", left: \"-99999px\", WebkitUserSelect: \"none\" }).on(a), a.focus(), b.setStyles(i).on(a), d.scrollTo && d.scrollTo(h, g);\n }\n };a.views.Composer.prototype.style = function () {\n var d,\n j,\n k = this,\n l = c.querySelector(\":focus\"),\n m = this.textarea.element,\n n = m.hasAttribute(\"placeholder\"),\n o = n && m.getAttribute(\"placeholder\"),\n p = m.style.display,\n q = m.disabled;return this.focusStylesHost = e.cloneNode(!1), this.blurStylesHost = e.cloneNode(!1), this.disabledStylesHost = e.cloneNode(!1), n && m.removeAttribute(\"placeholder\"), m === l && m.blur(), m.disabled = !1, m.style.display = d = \"none\", (m.getAttribute(\"rows\") && \"auto\" === b.getStyle(\"height\").from(m) || m.getAttribute(\"cols\") && \"auto\" === b.getStyle(\"width\").from(m)) && (m.style.display = d = p), b.copyStyles(g).from(m).to(this.editableArea).andTo(this.blurStylesHost), b.copyStyles(f).from(m).to(this.element).andTo(this.blurStylesHost), b.insertCSS(h).into(this.element.ownerDocument), m.disabled = !0, b.copyStyles(g).from(m).to(this.disabledStylesHost), b.copyStyles(f).from(m).to(this.disabledStylesHost), m.disabled = q, m.style.display = p, i(m), m.style.display = d, b.copyStyles(g).from(m).to(this.focusStylesHost), b.copyStyles(f).from(m).to(this.focusStylesHost), m.style.display = p, b.copyStyles([\"display\"]).from(m).to(this.editableArea), j = a.lang.array(g).without([\"display\"]), l ? l.focus() : m.blur(), n && m.setAttribute(\"placeholder\", o), this.parent.on(\"focus:composer\", function () {\n b.copyStyles(j).from(k.focusStylesHost).to(k.editableArea), b.copyStyles(f).from(k.focusStylesHost).to(k.element);\n }), this.parent.on(\"blur:composer\", function () {\n b.copyStyles(j).from(k.blurStylesHost).to(k.editableArea), b.copyStyles(f).from(k.blurStylesHost).to(k.element);\n }), this.parent.observe(\"disable:composer\", function () {\n b.copyStyles(j).from(k.disabledStylesHost).to(k.editableArea), b.copyStyles(f).from(k.disabledStylesHost).to(k.element);\n }), this.parent.observe(\"enable:composer\", function () {\n b.copyStyles(j).from(k.blurStylesHost).to(k.editableArea), b.copyStyles(f).from(k.blurStylesHost).to(k.element);\n }), this;\n };\n}(wysihtml5), function (a) {\n var b = a.dom,\n c = a.browser,\n d = { 66: \"bold\", 73: \"italic\", 85: \"underline\" },\n e = function e(a, b, c) {\n var d,\n e = a.getPreviousNode(b, !0),\n f = a.getSelectedNode();if (1 !== f.nodeType && f.parentNode !== c && (f = f.parentNode), e) if (1 == f.nodeType) {\n if (d = f.firstChild, 1 == e.nodeType) for (; f.firstChild;) {\n e.appendChild(f.firstChild);\n } else for (; f.firstChild;) {\n b.parentNode.insertBefore(f.firstChild, b);\n }f.parentNode && f.parentNode.removeChild(f), a.setBefore(d);\n } else 1 == e.nodeType ? e.appendChild(f) : b.parentNode.insertBefore(f, b), a.setBefore(f);\n },\n f = function f(a, b, c, d) {\n var f, g, h;b.isCollapsed() ? b.caretIsInTheBeginnig(\"LI\") ? (a.preventDefault(), d.commands.exec(\"outdentList\")) : b.caretIsInTheBeginnig() ? a.preventDefault() : (b.caretIsFirstInSelection() && b.getPreviousNode() && b.getPreviousNode().nodeName && /^H\\d$/gi.test(b.getPreviousNode().nodeName) && (f = b.getPreviousNode(), a.preventDefault(), /^\\s*$/.test(f.textContent || f.innerText) ? f.parentNode.removeChild(f) : (g = f.ownerDocument.createRange(), g.selectNodeContents(f), g.collapse(!1), b.setSelection(g))), h = b.caretIsBeforeUneditable(), h && (a.preventDefault(), e(b, h, c))) : b.containsUneditable() && (a.preventDefault(), b.deleteContents());\n },\n g = function g(a) {\n if (a.selection.isCollapsed()) {\n if (a.selection.caretIsInTheBeginnig(\"LI\") && a.commands.exec(\"indentList\")) return;\n } else a.selection.deleteContents();\n a.commands.exec(\"insertHTML\", \"&emsp;\");\n };a.views.Composer.prototype.observe = function () {\n var e,\n h,\n i = this,\n j = this.getValue(!1, !1),\n k = this.sandbox.getIframe ? this.sandbox.getIframe() : this.sandbox.getContentEditable(),\n l = this.element,\n m = c.supportsEventsInIframeCorrectly() || this.sandbox.getContentEditable ? l : this.sandbox.getWindow(),\n n = [\"drop\", \"paste\", \"beforepaste\"],\n o = [\"drop\", \"paste\", \"mouseup\", \"focus\", \"keyup\"];b.observe(k, \"DOMNodeRemoved\", function () {\n clearInterval(e), i.parent.fire(\"destroy:composer\");\n }), c.supportsMutationEvents() || (e = setInterval(function () {\n b.contains(document.documentElement, k) || (clearInterval(e), i.parent.fire(\"destroy:composer\"));\n }, 250)), b.observe(m, o, function () {\n setTimeout(function () {\n i.parent.fire(\"interaction\").fire(\"interaction:composer\");\n }, 0);\n }), this.config.handleTables && (!this.tableClickHandle && this.doc.execCommand && a.browser.supportsCommand(this.doc, \"enableObjectResizing\") && a.browser.supportsCommand(this.doc, \"enableInlineTableEditing\") && (this.sandbox.getIframe ? this.tableClickHandle = b.observe(k, [\"focus\", \"mouseup\", \"mouseover\"], function () {\n i.doc.execCommand(\"enableObjectResizing\", !1, \"false\"), i.doc.execCommand(\"enableInlineTableEditing\", !1, \"false\"), i.tableClickHandle.stop();\n }) : setTimeout(function () {\n i.doc.execCommand(\"enableObjectResizing\", !1, \"false\"), i.doc.execCommand(\"enableInlineTableEditing\", !1, \"false\");\n }, 0)), this.tableSelection = a.quirks.tableCellsSelection(l, i.parent)), b.observe(m, \"focus\", function (a) {\n i.parent.fire(\"focus\", a).fire(\"focus:composer\", a), setTimeout(function () {\n j = i.getValue(!1, !1);\n }, 0);\n }), b.observe(m, \"blur\", function (a) {\n if (j !== i.getValue(!1, !1)) {\n var b = a;\"function\" == typeof Object.create && (b = Object.create(a, { type: { value: \"change\" } })), i.parent.fire(\"change\", b).fire(\"change:composer\", b);\n }i.parent.fire(\"blur\", a).fire(\"blur:composer\", a);\n }), b.observe(l, \"dragenter\", function () {\n i.parent.fire(\"unset_placeholder\");\n }), b.observe(l, n, function (a) {\n i.parent.fire(a.type, a).fire(a.type + \":composer\", a);\n }), this.config.copyedFromMarking && b.observe(l, \"copy\", function (a) {\n a.clipboardData && (a.clipboardData.setData(\"text/html\", i.config.copyedFromMarking + i.selection.getHtml()), a.preventDefault()), i.parent.fire(a.type, a).fire(a.type + \":composer\", a);\n }), b.observe(l, \"keyup\", function (b) {\n var c = b.keyCode;(c === a.SPACE_KEY || c === a.ENTER_KEY) && i.parent.fire(\"newword:composer\");\n }), this.parent.on(\"paste:composer\", function () {\n setTimeout(function () {\n i.parent.fire(\"newword:composer\");\n }, 0);\n }), c.canSelectImagesInContentEditable() || b.observe(l, \"mousedown\", function (b) {\n var c = b.target,\n d = l.querySelectorAll(\"img\"),\n e = l.querySelectorAll(\".\" + i.config.uneditableContainerClassname + \" img\"),\n f = a.lang.array(d).without(e);\"IMG\" === c.nodeName && a.lang.array(f).contains(c) && i.selection.selectNode(c);\n }), c.canSelectImagesInContentEditable() || b.observe(l, \"drop\", function () {\n setTimeout(function () {\n i.selection.getSelection().removeAllRanges();\n }, 0);\n }), c.hasHistoryIssue() && c.supportsSelectionModify() && b.observe(l, \"keydown\", function (a) {\n if (a.metaKey || a.ctrlKey) {\n var b = a.keyCode,\n c = l.ownerDocument.defaultView,\n d = c.getSelection();(37 === b || 39 === b) && (37 === b && (d.modify(\"extend\", \"left\", \"lineboundary\"), a.shiftKey || d.collapseToStart()), 39 === b && (d.modify(\"extend\", \"right\", \"lineboundary\"), a.shiftKey || d.collapseToEnd()), a.preventDefault());\n }\n }), b.observe(l, \"keydown\", function (a) {\n var b = a.keyCode,\n c = d[b];(a.ctrlKey || a.metaKey) && !a.altKey && c && (i.commands.exec(c), a.preventDefault()), 8 === b ? f(a, i.selection, l, i) : i.config.handleTabKey && 9 === b && (a.preventDefault(), g(i, l));\n }), b.observe(l, \"keydown\", function (b) {\n var c,\n d = i.selection.getSelectedNode(!0),\n e = b.keyCode;!d || \"IMG\" !== d.nodeName || e !== a.BACKSPACE_KEY && e !== a.DELETE_KEY || (c = d.parentNode, c.removeChild(d), \"A\" !== c.nodeName || c.firstChild || c.parentNode.removeChild(c), setTimeout(function () {\n a.quirks.redraw(l);\n }, 0), b.preventDefault());\n }), !this.config.contentEditableMode && c.hasIframeFocusIssue() && (b.observe(k, \"focus\", function () {\n setTimeout(function () {\n i.doc.querySelector(\":focus\") !== i.element && i.focus();\n }, 0);\n }), b.observe(this.element, \"blur\", function () {\n setTimeout(function () {\n i.selection.getSelection().removeAllRanges();\n }, 0);\n })), h = { IMG: \"Image: \", A: \"Link: \" }, b.observe(l, \"mouseover\", function (a) {\n var b,\n c,\n d = a.target,\n e = d.nodeName;(\"A\" === e || \"IMG\" === e) && (c = d.hasAttribute(\"title\"), c || (b = h[e] + (d.getAttribute(\"href\") || d.getAttribute(\"src\")), d.setAttribute(\"title\", b)));\n });\n };\n}(wysihtml5), function (a) {\n var b = 400;a.views.Synchronizer = Base.extend({ constructor: function constructor(a, b, c) {\n this.editor = a, this.textarea = b, this.composer = c, this._observe();\n }, fromComposerToTextarea: function fromComposerToTextarea(b) {\n this.textarea.setValue(a.lang.string(this.composer.getValue(!1, !1)).trim(), b);\n }, fromTextareaToComposer: function fromTextareaToComposer(a) {\n var b = this.textarea.getValue(!1, !1);b ? this.composer.setValue(b, a) : (this.composer.clear(), this.editor.fire(\"set_placeholder\"));\n }, sync: function sync(a) {\n \"textarea\" === this.editor.currentView.name ? this.fromTextareaToComposer(a) : this.fromComposerToTextarea(a);\n }, _observe: function _observe() {\n var c,\n d = this,\n e = this.textarea.element.form,\n f = function f() {\n c = setInterval(function () {\n d.fromComposerToTextarea();\n }, b);\n },\n g = function g() {\n clearInterval(c), c = null;\n };f(), e && (a.dom.observe(e, \"submit\", function () {\n d.sync(!0);\n }), a.dom.observe(e, \"reset\", function () {\n setTimeout(function () {\n d.fromTextareaToComposer();\n }, 0);\n })), this.editor.on(\"change_view\", function (a) {\n \"composer\" !== a || c ? \"textarea\" === a && (d.fromComposerToTextarea(!0), g()) : (d.fromTextareaToComposer(!0), f());\n }), this.editor.on(\"destroy:composer\", g);\n } });\n}(wysihtml5), wysihtml5.views.Textarea = wysihtml5.views.View.extend({ name: \"textarea\", constructor: function constructor(a, b, c) {\n this.base(a, b, c), this._observe();\n }, clear: function clear() {\n this.element.value = \"\";\n }, getValue: function getValue(a) {\n var b = this.isEmpty() ? \"\" : this.element.value;return a !== !1 && (b = this.parent.parse(b)), b;\n }, setValue: function setValue(a, b) {\n b && (a = this.parent.parse(a)), this.element.value = a;\n }, cleanUp: function cleanUp() {\n var a = this.parent.parse(this.element.value);this.element.value = a;\n }, hasPlaceholderSet: function hasPlaceholderSet() {\n var a = wysihtml5.browser.supportsPlaceholderAttributeOn(this.element),\n b = this.element.getAttribute(\"placeholder\") || null,\n c = this.element.value,\n d = !c;return a && d || c === b;\n }, isEmpty: function isEmpty() {\n return !wysihtml5.lang.string(this.element.value).trim() || this.hasPlaceholderSet();\n }, _observe: function _observe() {\n var a = this.element,\n b = this.parent,\n c = { focusin: \"focus\", focusout: \"blur\" },\n d = wysihtml5.browser.supportsEvent(\"focusin\") ? [\"focusin\", \"focusout\", \"change\"] : [\"focus\", \"blur\", \"change\"];b.on(\"beforeload\", function () {\n wysihtml5.dom.observe(a, d, function (a) {\n var d = c[a.type] || a.type;b.fire(d).fire(d + \":textarea\");\n }), wysihtml5.dom.observe(a, [\"paste\", \"drop\"], function () {\n setTimeout(function () {\n b.fire(\"paste\").fire(\"paste:textarea\");\n }, 0);\n });\n });\n } }), function (a) {\n var b,\n c = { name: b, style: !0, toolbar: b, showToolbarAfterInit: !0, autoLink: !0, handleTables: !0, handleTabKey: !0, parserRules: { tags: { br: {}, span: {}, div: {}, p: {} }, classes: {} }, pasteParserRulesets: null, parser: a.dom.parse, composerClassName: \"wysihtml5-editor\", bodyClassName: \"wysihtml5-supported\", useLineBreaks: !0, stylesheets: [], placeholderText: b, supportTouchDevices: !0, cleanUp: !0, contentEditableMode: !1, uneditableContainerClassname: \"wysihtml5-uneditable-container\", copyedFromMarking: '<meta name=\"copied-from\" content=\"wysihtml5\">' };a.Editor = a.lang.Dispatcher.extend({ constructor: function constructor(b, d) {\n if (this.editableElement = \"string\" == typeof b ? document.getElementById(b) : b, this.config = a.lang.object({}).merge(c).merge(d).get(), this._isCompatible = a.browser.supported(), \"textarea\" != this.editableElement.nodeName.toLowerCase() && (this.config.contentEditableMode = !0, this.config.noTextarea = !0), this.config.noTextarea || (this.textarea = new a.views.Textarea(this, this.editableElement, this.config), this.currentView = this.textarea), !this._isCompatible || !this.config.supportTouchDevices && a.browser.isTouchDevice()) {\n var e = this;return setTimeout(function () {\n e.fire(\"beforeload\").fire(\"load\");\n }, 0), void 0;\n }a.dom.addClass(document.body, this.config.bodyClassName), this.composer = new a.views.Composer(this, this.editableElement, this.config), this.currentView = this.composer, \"function\" == typeof this.config.parser && this._initParser(), this.on(\"beforeload\", this.handleBeforeLoad);\n }, handleBeforeLoad: function handleBeforeLoad() {\n this.config.noTextarea || (this.synchronizer = new a.views.Synchronizer(this, this.textarea, this.composer)), this.config.toolbar && (this.toolbar = new a.toolbar.Toolbar(this, this.config.toolbar, this.config.showToolbarAfterInit));\n }, isCompatible: function isCompatible() {\n return this._isCompatible;\n }, clear: function clear() {\n return this.currentView.clear(), this;\n }, getValue: function getValue(a, b) {\n return this.currentView.getValue(a, b);\n }, setValue: function setValue(a, b) {\n return this.fire(\"unset_placeholder\"), a ? (this.currentView.setValue(a, b), this) : this.clear();\n }, cleanUp: function cleanUp() {\n this.currentView.cleanUp();\n }, focus: function focus(a) {\n return this.currentView.focus(a), this;\n }, disable: function disable() {\n return this.currentView.disable(), this;\n }, enable: function enable() {\n return this.currentView.enable(), this;\n }, isEmpty: function isEmpty() {\n return this.currentView.isEmpty();\n }, hasPlaceholderSet: function hasPlaceholderSet() {\n return this.currentView.hasPlaceholderSet();\n }, parse: function parse(b, c) {\n var d = this.config.contentEditableMode ? document : this.composer ? this.composer.sandbox.getDocument() : null,\n e = this.config.parser(b, { rules: this.config.parserRules, cleanUp: this.config.cleanUp, context: d, uneditableClass: this.config.uneditableContainerClassname, clearInternals: c });return \"object\" == (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) && a.quirks.redraw(b), e;\n }, _initParser: function _initParser() {\n var b,\n c = this;a.browser.supportsModenPaste() ? this.on(\"paste:composer\", function (d) {\n d.preventDefault(), b = a.dom.getPastedHtml(d), b && c._cleanAndPaste(b);\n }) : this.on(\"beforepaste:composer\", function (b) {\n b.preventDefault(), a.dom.getPastedHtmlWithDiv(c.composer, function (a) {\n a && c._cleanAndPaste(a);\n });\n });\n }, _cleanAndPaste: function _cleanAndPaste(b) {\n var c = a.quirks.cleanPastedHTML(b, { referenceNode: this.composer.element, rules: this.config.pasteParserRulesets || [{ set: this.config.parserRules }], uneditableClass: this.config.uneditableContainerClassname });this.composer.selection.deleteContents(), this.composer.selection.insertHTML(c);\n } });\n}(wysihtml5), function (a) {\n var b = a.dom,\n c = \"wysihtml5-command-dialog-opened\",\n d = \"input, select, textarea\",\n e = \"[data-wysihtml5-dialog-field]\",\n f = \"data-wysihtml5-dialog-field\";a.toolbar.Dialog = a.lang.Dispatcher.extend({ constructor: function constructor(a, b) {\n this.link = a, this.container = b;\n }, _observe: function _observe() {\n var e, f, g, h, i, j;if (!this._observed) {\n for (e = this, f = function f(a) {\n var b = e._serialize();b == e.elementToChange ? e.fire(\"edit\", b) : e.fire(\"save\", b), e.hide(), a.preventDefault(), a.stopPropagation();\n }, b.observe(e.link, \"click\", function () {\n b.hasClass(e.link, c) && setTimeout(function () {\n e.hide();\n }, 0);\n }), b.observe(this.container, \"keydown\", function (b) {\n var c = b.keyCode;c === a.ENTER_KEY && f(b), c === a.ESCAPE_KEY && (e.fire(\"cancel\"), e.hide());\n }), b.delegate(this.container, \"[data-wysihtml5-dialog-action=save]\", \"click\", f), b.delegate(this.container, \"[data-wysihtml5-dialog-action=cancel]\", \"click\", function (a) {\n e.fire(\"cancel\"), e.hide(), a.preventDefault(), a.stopPropagation();\n }), g = this.container.querySelectorAll(d), h = 0, i = g.length, j = function j() {\n clearInterval(e.interval);\n }; i > h; h++) {\n b.observe(g[h], \"change\", j);\n }this._observed = !0;\n }\n }, _serialize: function _serialize() {\n for (var a = this.elementToChange || {}, b = this.container.querySelectorAll(e), c = b.length, d = 0; c > d; d++) {\n a[b[d].getAttribute(f)] = b[d].value;\n }return a;\n }, _interpolate: function _interpolate(a) {\n for (var b, c, d, g = document.querySelector(\":focus\"), h = this.container.querySelectorAll(e), i = h.length, j = 0; i > j; j++) {\n b = h[j], b !== g && (a && \"hidden\" === b.type || (c = b.getAttribute(f), d = this.elementToChange && \"boolean\" != typeof this.elementToChange ? this.elementToChange.getAttribute(c) || \"\" : b.defaultValue, b.value = d));\n }\n }, show: function show(a) {\n if (!b.hasClass(this.link, c)) {\n var e = this,\n f = this.container.querySelector(d);if (this.elementToChange = a, this._observe(), this._interpolate(), a && (this.interval = setInterval(function () {\n e._interpolate(!0);\n }, 500)), b.addClass(this.link, c), this.container.style.display = \"\", this.fire(\"show\"), f && !a) try {\n f.focus();\n } catch (g) {}\n }\n }, hide: function hide() {\n clearInterval(this.interval), this.elementToChange = null, b.removeClass(this.link, c), this.container.style.display = \"none\", this.fire(\"hide\");\n } });\n}(wysihtml5), function (a) {\n var b = a.dom,\n c = { position: \"relative\" },\n d = { left: 0, margin: 0, opacity: 0, overflow: \"hidden\", padding: 0, position: \"absolute\", top: 0, zIndex: 1 },\n e = { cursor: \"inherit\", fontSize: \"50px\", height: \"50px\", marginTop: \"-25px\", outline: 0, padding: 0, position: \"absolute\", right: \"-4px\", top: \"50%\" },\n f = { \"x-webkit-speech\": \"\", speech: \"\" };a.toolbar.Speech = function (g, h) {\n var i,\n j,\n k,\n l = document.createElement(\"input\");return a.browser.supportsSpeechApiOn(l) ? (i = g.editor.textarea.element.getAttribute(\"lang\"), i && (f.lang = i), j = document.createElement(\"div\"), a.lang.object(d).merge({ width: h.offsetWidth + \"px\", height: h.offsetHeight + \"px\" }), b.insert(l).into(j), b.insert(j).into(h), b.setStyles(e).on(l), b.setAttributes(f).on(l), b.setStyles(d).on(j), b.setStyles(c).on(h), k = \"onwebkitspeechchange\" in l ? \"webkitspeechchange\" : \"speechchange\", b.observe(l, k, function () {\n g.execCommand(\"insertText\", l.value), l.value = \"\";\n }), b.observe(l, \"click\", function (a) {\n b.hasClass(h, \"wysihtml5-command-disabled\") && a.preventDefault(), a.stopPropagation();\n }), void 0) : (h.style.display = \"none\", void 0);\n };\n}(wysihtml5), function (a) {\n var b = \"wysihtml5-command-disabled\",\n c = \"wysihtml5-commands-disabled\",\n d = \"wysihtml5-command-active\",\n e = \"wysihtml5-action-active\",\n f = a.dom;a.toolbar.Toolbar = Base.extend({ constructor: function constructor(f, g, h) {\n this.editor = f, this.container = \"string\" == typeof g ? document.getElementById(g) : g, this.composer = f.composer, this._getLinks(\"command\"), this._getLinks(\"action\"), this._observe(), h && this.show(), null != f.config.classNameCommandDisabled && (b = f.config.classNameCommandDisabled), null != f.config.classNameCommandsDisabled && (c = f.config.classNameCommandsDisabled), null != f.config.classNameCommandActive && (d = f.config.classNameCommandActive), null != f.config.classNameActionActive && (e = f.config.classNameActionActive);for (var i = this.container.querySelectorAll(\"[data-wysihtml5-command=insertSpeech]\"), j = i.length, k = 0; j > k; k++) {\n new a.toolbar.Speech(this, i[k]);\n }\n }, _getLinks: function _getLinks(b) {\n for (var c, d, e, f, g, h = this[b + \"Links\"] = a.lang.array(this.container.querySelectorAll(\"[data-wysihtml5-\" + b + \"]\")).get(), i = h.length, j = 0, k = this[b + \"Mapping\"] = {}; i > j; j++) {\n c = h[j], e = c.getAttribute(\"data-wysihtml5-\" + b), f = c.getAttribute(\"data-wysihtml5-\" + b + \"-value\"), d = this.container.querySelector(\"[data-wysihtml5-\" + b + \"-group='\" + e + \"']\"), g = this._getDialog(c, e), k[e + \":\" + f] = { link: c, group: d, name: e, value: f, dialog: g, state: !1 };\n }\n }, _getDialog: function _getDialog(b, c) {\n var d,\n e,\n f = this,\n g = this.container.querySelector(\"[data-wysihtml5-dialog='\" + c + \"']\");return g && (d = a.toolbar[\"Dialog_\" + c] ? new a.toolbar[\"Dialog_\" + c](b, g) : new a.toolbar.Dialog(b, g), d.on(\"show\", function () {\n e = f.composer.selection.getBookmark(), f.editor.fire(\"show:dialog\", { command: c, dialogContainer: g, commandLink: b });\n }), d.on(\"save\", function (a) {\n e && f.composer.selection.setBookmark(e), f._execCommand(c, a), f.editor.fire(\"save:dialog\", { command: c, dialogContainer: g, commandLink: b });\n }), d.on(\"cancel\", function () {\n f.editor.focus(!1), f.editor.fire(\"cancel:dialog\", { command: c, dialogContainer: g, commandLink: b });\n })), d;\n }, execCommand: function execCommand(a, b) {\n if (!this.commandsDisabled) {\n var c = this.commandMapping[a + \":\" + b];c && c.dialog && !c.state ? c.dialog.show() : this._execCommand(a, b);\n }\n }, _execCommand: function _execCommand(a, b) {\n this.editor.focus(!1), this.composer.commands.exec(a, b), this._updateLinkStates();\n }, execAction: function execAction(a) {\n var b = this.editor;\"change_view\" === a && b.textarea && (b.currentView === b.textarea ? b.fire(\"change_view\", \"composer\") : b.fire(\"change_view\", \"textarea\")), \"showSource\" == a && b.fire(\"showSource\");\n }, _observe: function _observe() {\n for (var a = this, b = this.editor, d = this.container, e = this.commandLinks.concat(this.actionLinks), g = e.length, h = 0; g > h; h++) {\n \"A\" === e[h].nodeName ? f.setAttributes({ href: \"javascript:;\", unselectable: \"on\" }).on(e[h]) : f.setAttributes({ unselectable: \"on\" }).on(e[h]);\n }f.delegate(d, \"[data-wysihtml5-command], [data-wysihtml5-action]\", \"mousedown\", function (a) {\n a.preventDefault();\n }), f.delegate(d, \"[data-wysihtml5-command]\", \"click\", function (b) {\n var c = this,\n d = c.getAttribute(\"data-wysihtml5-command\"),\n e = c.getAttribute(\"data-wysihtml5-command-value\");a.execCommand(d, e), b.preventDefault();\n }), f.delegate(d, \"[data-wysihtml5-action]\", \"click\", function (b) {\n var c = this.getAttribute(\"data-wysihtml5-action\");a.execAction(c), b.preventDefault();\n }), b.on(\"interaction:composer\", function () {\n a._updateLinkStates();\n }), b.on(\"focus:composer\", function () {\n a.bookmark = null;\n }), this.editor.config.handleTables && (b.on(\"tableselect:composer\", function () {\n a.container.querySelectorAll('[data-wysihtml5-hiddentools=\"table\"]')[0].style.display = \"\";\n }), b.on(\"tableunselect:composer\", function () {\n a.container.querySelectorAll('[data-wysihtml5-hiddentools=\"table\"]')[0].style.display = \"none\";\n })), b.on(\"change_view\", function (e) {\n b.textarea && setTimeout(function () {\n a.commandsDisabled = \"composer\" !== e, a._updateLinkStates(), a.commandsDisabled ? f.addClass(d, c) : f.removeClass(d, c);\n }, 0);\n });\n }, _updateLinkStates: function _updateLinkStates() {\n var c,\n g,\n h,\n i,\n j = this.commandMapping,\n k = this.actionMapping;for (c in j) {\n i = j[c], this.commandsDisabled ? (g = !1, f.removeClass(i.link, d), i.group && f.removeClass(i.group, d), i.dialog && i.dialog.hide()) : (g = this.composer.commands.state(i.name, i.value), f.removeClass(i.link, b), i.group && f.removeClass(i.group, b)), i.state !== g && (i.state = g, g ? (f.addClass(i.link, d), i.group && f.addClass(i.group, d), i.dialog && (\"object\" == (typeof g === \"undefined\" ? \"undefined\" : _typeof(g)) || a.lang.object(g).isArray() ? (!i.dialog.multiselect && a.lang.object(g).isArray() && (g = 1 === g.length ? g[0] : !0, i.state = g), i.dialog.show(g)) : i.dialog.hide())) : (f.removeClass(i.link, d), i.group && f.removeClass(i.group, d), i.dialog && i.dialog.hide()));\n }for (c in k) {\n h = k[c], \"change_view\" === h.name && (h.state = this.editor.currentView === this.editor.textarea, h.state ? f.addClass(h.link, e) : f.removeClass(h.link, e));\n }\n }, show: function show() {\n this.container.style.display = \"\";\n }, hide: function hide() {\n this.container.style.display = \"none\";\n } });\n}(wysihtml5), function (a) {\n a.toolbar.Dialog_createTable = a.toolbar.Dialog.extend({ show: function show(a) {\n this.base(a);\n } });\n}(wysihtml5), function (a) {\n var b = (a.dom, \"[data-wysihtml5-dialog-field]\"),\n c = \"data-wysihtml5-dialog-field\";a.toolbar.Dialog_foreColorStyle = a.toolbar.Dialog.extend({ multiselect: !0, _serialize: function _serialize() {\n for (var a = {}, d = this.container.querySelectorAll(b), e = d.length, f = 0; e > f; f++) {\n a[d[f].getAttribute(c)] = d[f].value;\n }return a;\n }, _interpolate: function _interpolate(d) {\n for (var e, f = document.querySelector(\":focus\"), g = this.container.querySelectorAll(b), h = g.length, i = 0, j = this.elementToChange ? a.lang.object(this.elementToChange).isArray() ? this.elementToChange[0] : this.elementToChange : null, k = j ? j.getAttribute(\"style\") : null, l = k ? a.quirks.styleParser.parseColor(k, \"color\") : null; h > i; i++) {\n e = g[i], e !== f && (d && \"hidden\" === e.type || \"color\" === e.getAttribute(c) && (e.value = l ? l[3] && 1 != l[3] ? \"rgba(\" + l[0] + \",\" + l[1] + \",\" + l[2] + \",\" + l[3] + \");\" : \"rgb(\" + l[0] + \",\" + l[1] + \",\" + l[2] + \");\" : \"rgb(0,0,0);\"));\n }\n } });\n}(wysihtml5), function (a) {\n a.dom;a.toolbar.Dialog_fontSizeStyle = a.toolbar.Dialog.extend({ multiselect: !0, _serialize: function _serialize() {\n return { size: this.container.querySelector('[data-wysihtml5-dialog-field=\"size\"]').value };\n }, _interpolate: function _interpolate() {\n var b = document.querySelector(\":focus\"),\n c = this.container.querySelector(\"[data-wysihtml5-dialog-field='size']\"),\n d = this.elementToChange ? a.lang.object(this.elementToChange).isArray() ? this.elementToChange[0] : this.elementToChange : null,\n e = d ? d.getAttribute(\"style\") : null,\n f = e ? a.quirks.styleParser.parseFontSize(e) : null;c && c !== b && f && !/^\\s*$/.test(f) && (c.value = f);\n } });\n}(wysihtml5), Handlebars = function () {\n var a = function () {\n \"use strict\";\n function a(a) {\n this.string = a;\n }var b;return a.prototype.toString = function () {\n return \"\" + this.string;\n }, b = a;\n }(),\n b = function (a) {\n \"use strict\";\n function b(a) {\n return k[a] || \"&amp;\";\n }function c(a, b) {\n for (var c in b) {\n Object.prototype.hasOwnProperty.call(b, c) && (a[c] = b[c]);\n }\n }function d(a) {\n return a instanceof j ? \"\" + a : a || 0 === a ? (a = \"\" + a, m.test(a) ? a.replace(l, b) : a) : \"\";\n }function e(a) {\n return a || 0 === a ? h(a) && 0 === a.length ? !0 : !1 : !0;\n }var f,\n g,\n h,\n i = {},\n j = a,\n k = { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#x27;\", \"`\": \"&#x60;\" },\n l = /[&<>\"'`]/g,\n m = /[&<>\"'`]/;return i.extend = c, f = Object.prototype.toString, i.toString = f, g = function g(a) {\n return \"function\" == typeof a;\n }, g(/x/) && (g = function g(a) {\n return \"function\" == typeof a && \"[object Function]\" === f.call(a);\n }), i.isFunction = g, h = Array.isArray || function (a) {\n return a && \"object\" == (typeof a === \"undefined\" ? \"undefined\" : _typeof(a)) ? \"[object Array]\" === f.call(a) : !1;\n }, i.isArray = h, i.escapeExpression = d, i.isEmpty = e, i;\n }(a),\n c = function () {\n \"use strict\";\n function a(a, b) {\n var d, e, f;for (b && b.firstLine && (d = b.firstLine, a += \" - \" + d + \":\" + b.firstColumn), e = Error.prototype.constructor.call(this, a), f = 0; f < c.length; f++) {\n this[c[f]] = e[c[f]];\n }d && (this.lineNumber = d, this.column = b.firstColumn);\n }var b,\n c = [\"description\", \"fileName\", \"lineNumber\", \"message\", \"name\", \"number\", \"stack\"];return a.prototype = Error(), b = a;\n }(),\n d = function (a, b) {\n \"use strict\";\n function c(a, b) {\n this.helpers = a || {}, this.partials = b || {}, d(this);\n }function d(a) {\n a.registerHelper(\"helperMissing\", function (a) {\n if (2 === arguments.length) return void 0;throw new p(\"Missing helper: '\" + a + \"'\");\n }), a.registerHelper(\"blockHelperMissing\", function (b, c) {\n var d = c.inverse || function () {},\n e = c.fn;return i(b) && (b = b.call(this)), b === !0 ? e(this) : b === !1 || null == b ? d(this) : h(b) ? b.length > 0 ? a.helpers.each(b, c) : d(this) : e(b);\n }), a.registerHelper(\"each\", function (a, b) {\n var c,\n d,\n e,\n f = b.fn,\n g = b.inverse,\n j = 0,\n k = \"\";if (i(a) && (a = a.call(this)), b.data && (c = m(b.data)), a && \"object\" == (typeof a === \"undefined\" ? \"undefined\" : _typeof(a))) if (h(a)) for (d = a.length; d > j; j++) {\n c && (c.index = j, c.first = 0 === j, c.last = j === a.length - 1), k += f(a[j], { data: c });\n } else for (e in a) {\n a.hasOwnProperty(e) && (c && (c.key = e, c.index = j, c.first = 0 === j), k += f(a[e], { data: c }), j++);\n }return 0 === j && (k = g(this)), k;\n }), a.registerHelper(\"if\", function (a, b) {\n return i(a) && (a = a.call(this)), !b.hash.includeZero && !a || o.isEmpty(a) ? b.inverse(this) : b.fn(this);\n }), a.registerHelper(\"unless\", function (b, c) {\n return a.helpers[\"if\"].call(this, b, { fn: c.inverse, inverse: c.fn, hash: c.hash });\n }), a.registerHelper(\"with\", function (a, b) {\n return i(a) && (a = a.call(this)), o.isEmpty(a) ? void 0 : b.fn(a);\n }), a.registerHelper(\"log\", function (b, c) {\n var d = c.data && null != c.data.level ? parseInt(c.data.level, 10) : 1;a.log(d, b);\n });\n }function e(a, b) {\n l.log(a, b);\n }var f,\n g,\n h,\n i,\n j,\n k,\n l,\n m,\n n = {},\n o = a,\n p = b,\n q = \"1.3.0\";return n.VERSION = q, f = 4, n.COMPILER_REVISION = f, g = { 1: \"<= 1.0.rc.2\", 2: \"== 1.0.0-rc.3\", 3: \"== 1.0.0-rc.4\", 4: \">= 1.0.0\" }, n.REVISION_CHANGES = g, h = o.isArray, i = o.isFunction, j = o.toString, k = \"[object Object]\", n.HandlebarsEnvironment = c, c.prototype = { constructor: c, logger: l, log: e, registerHelper: function registerHelper(a, b, c) {\n if (j.call(a) === k) {\n if (c || b) throw new p(\"Arg not supported with multiple helpers\");o.extend(this.helpers, a);\n } else c && (b.not = c), this.helpers[a] = b;\n }, registerPartial: function registerPartial(a, b) {\n j.call(a) === k ? o.extend(this.partials, a) : this.partials[a] = b;\n } }, l = { methodMap: { 0: \"debug\", 1: \"info\", 2: \"warn\", 3: \"error\" }, DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3, log: function log(a, b) {\n if (l.level <= a) {\n var c = l.methodMap[a];\"undefined\" != typeof console && console[c] && console[c].call(console, b);\n }\n } }, n.logger = l, n.log = e, m = function m(a) {\n var b = {};return o.extend(b, a), b;\n }, n.createFrame = m, n;\n }(b, c),\n e = function (a, b, c) {\n \"use strict\";\n function d(a) {\n var b,\n c,\n d = a && a[0] || 1,\n e = m;if (d !== e) {\n if (e > d) throw b = n[e], c = n[d], new l(\"Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version (\" + b + \") or downgrade your runtime to an older version (\" + c + \").\");throw new l(\"Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version (\" + a[1] + \").\");\n }\n }function e(a, b) {\n if (!b) throw new l(\"No environment passed to template\");var c = function (_c2) {\n function c(_x4, _x5, _x6, _x7, _x8, _x9) {\n return _c2.apply(this, arguments);\n }\n\n c.toString = function () {\n return _c2.toString();\n };\n\n return c;\n }(function (a, c, d, e, f, g) {\n var h,\n i = b.VM.invokePartial.apply(this, arguments);if (null != i) return i;if (b.compile) return h = { helpers: e, partials: f, data: g }, f[c] = b.compile(a, { data: void 0 !== g }, b), f[c](d, h);throw new l(\"The partial \" + c + \" could not be compiled when running in runtime-only mode\");\n }),\n d = { escapeExpression: k.escapeExpression, invokePartial: c, programs: [], program: function program(a, b, c) {\n var d = this.programs[a];return c ? d = g(a, b, c) : d || (d = this.programs[a] = g(a, b)), d;\n }, merge: function merge(a, b) {\n var c = a || b;return a && b && a !== b && (c = {}, k.extend(c, b), k.extend(c, a)), c;\n }, programWithDepth: b.VM.programWithDepth, noop: b.VM.noop, compilerInfo: null };return function (c, e) {\n var f, g, h, i;return e = e || {}, h = e.partial ? e : b, e.partial || (f = e.helpers, g = e.partials), i = a.call(d, h, c, f, g, e.data), e.partial || b.VM.checkRevision(d.compilerInfo), i;\n };\n }function f(a, b, c) {\n var d = Array.prototype.slice.call(arguments, 3),\n e = function e(a, _e) {\n return _e = _e || {}, b.apply(this, [a, _e.data || c].concat(d));\n };return e.program = a, e.depth = d.length, e;\n }function g(a, b, c) {\n var d = function d(a, _d2) {\n return _d2 = _d2 || {}, b(a, _d2.data || c);\n };return d.program = a, d.depth = 0, d;\n }function h(a, b, c, d, e, f) {\n var g = { partial: !0, helpers: d, partials: e, data: f };if (void 0 === a) throw new l(\"The partial \" + b + \" could not be found\");return a instanceof Function ? a(c, g) : void 0;\n }function i() {\n return \"\";\n }var j = {},\n k = a,\n l = b,\n m = c.COMPILER_REVISION,\n n = c.REVISION_CHANGES;return j.checkRevision = d, j.template = e, j.programWithDepth = f, j.program = g, j.invokePartial = h, j.noop = i, j;\n }(b, c, d),\n f = function (a, b, c, d, e) {\n \"use strict\";\n var f,\n g = a,\n h = b,\n i = c,\n j = d,\n k = e,\n l = function l() {\n var a = new g.HandlebarsEnvironment();return j.extend(a, g), a.SafeString = h, a.Exception = i, a.Utils = j, a.VM = k, a.template = function (b) {\n return k.template(b, a);\n }, a;\n },\n m = l();return m.create = l, f = m;\n }(d, a, c, b, e);return f;\n}(), this.wysihtml5 = this.wysihtml5 || {}, this.wysihtml5.tpl = this.wysihtml5.tpl || {}, this.wysihtml5.tpl.blockquote = Handlebars.template(function (a, b, c, d, e) {\n function f(a) {\n var b,\n c = \"\";return c += \"btn-\" + l((b = a && a.options, b = null == b || b === !1 ? b : b.toolbar, b = null == b || b === !1 ? b : b.size, (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) === k ? b.apply(a) : b)), c;\n }function g() {\n return ' \\n <span class=\"fa fa-quote-left\"></span>\\n ';\n }function h() {\n return '\\n <span class=\"glyphicon glyphicon-quote\"></span>\\n ';\n }this.compilerInfo = [4, \">= 1.0.0\"], c = this.merge(c, a.helpers), e = e || {};var i,\n j = \"\",\n k = \"function\",\n l = this.escapeExpression,\n m = this;return j += '<li>\\n <a class=\"btn ', i = c[\"if\"].call(b, (i = b && b.options, i = null == i || i === !1 ? i : i.toolbar, null == i || i === !1 ? i : i.size), { hash: {}, inverse: m.noop, fn: m.program(1, f, e), data: e }), (i || 0 === i) && (j += i), j += ' btn-default\" data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"blockquote\" data-wysihtml5-display-format-name=\"false\" tabindex=\"-1\">\\n ', i = c[\"if\"].call(b, (i = b && b.options, i = null == i || i === !1 ? i : i.toolbar, null == i || i === !1 ? i : i.fa), { hash: {}, inverse: m.program(5, h, e), fn: m.program(3, g, e), data: e }), (i || 0 === i) && (j += i), j += \"\\n </a>\\n</li>\\n\", j;\n}), this.wysihtml5.tpl.color = Handlebars.template(function (a, b, c, d, e) {\n function f(a) {\n var b,\n c = \"\";return c += \"btn-\" + j((b = a && a.options, b = null == b || b === !1 ? b : b.toolbar, b = null == b || b === !1 ? b : b.size, (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) === i ? b.apply(a) : b)), c;\n }this.compilerInfo = [4, \">= 1.0.0\"], c = this.merge(c, a.helpers), e = e || {};var g,\n h = \"\",\n i = \"function\",\n j = this.escapeExpression,\n k = this;return h += '<li class=\"dropdown\">\\n <a class=\"btn btn-default dropdown-toggle ', g = c[\"if\"].call(b, (g = b && b.options, g = null == g || g === !1 ? g : g.toolbar, null == g || g === !1 ? g : g.size), { hash: {}, inverse: k.noop, fn: k.program(1, f, e), data: e }), (g || 0 === g) && (h += g), h += '\" data-toggle=\"dropdown\" tabindex=\"-1\">\\n <span class=\"current-color\">' + j((g = b && b.locale, g = null == g || g === !1 ? g : g.colours, g = null == g || g === !1 ? g : g.black, (typeof g === \"undefined\" ? \"undefined\" : _typeof(g)) === i ? g.apply(b) : g)) + '</span>\\n <b class=\"caret\"></b>\\n </a>\\n <ul class=\"dropdown-menu\">\\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"black\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"black\">' + j((g = b && b.locale, g = null == g || g === !1 ? g : g.colours, g = null == g || g === !1 ? g : g.black, (typeof g === \"undefined\" ? \"undefined\" : _typeof(g)) === i ? g.apply(b) : g)) + '</a></li>\\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"silver\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"silver\">' + j((g = b && b.locale, g = null == g || g === !1 ? g : g.colours, g = null == g || g === !1 ? g : g.silver, (typeof g === \"undefined\" ? \"undefined\" : _typeof(g)) === i ? g.apply(b) : g)) + '</a></li>\\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"gray\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"gray\">' + j((g = b && b.locale, g = null == g || g === !1 ? g : g.colours, g = null == g || g === !1 ? g : g.gray, (typeof g === \"undefined\" ? \"undefined\" : _typeof(g)) === i ? g.apply(b) : g)) + '</a></li>\\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"maroon\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"maroon\">' + j((g = b && b.locale, g = null == g || g === !1 ? g : g.colours, g = null == g || g === !1 ? g : g.maroon, (typeof g === \"undefined\" ? \"undefined\" : _typeof(g)) === i ? g.apply(b) : g)) + '</a></li>\\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"red\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"red\">' + j((g = b && b.locale, g = null == g || g === !1 ? g : g.colours, g = null == g || g === !1 ? g : g.red, (typeof g === \"undefined\" ? \"undefined\" : _typeof(g)) === i ? g.apply(b) : g)) + '</a></li>\\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"purple\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"purple\">' + j((g = b && b.locale, g = null == g || g === !1 ? g : g.colours, g = null == g || g === !1 ? g : g.purple, (typeof g === \"undefined\" ? \"undefined\" : _typeof(g)) === i ? g.apply(b) : g)) + '</a></li>\\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"green\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"green\">' + j((g = b && b.locale, g = null == g || g === !1 ? g : g.colours, g = null == g || g === !1 ? g : g.green, (typeof g === \"undefined\" ? \"undefined\" : _typeof(g)) === i ? g.apply(b) : g)) + '</a></li>\\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"olive\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"olive\">' + j((g = b && b.locale, g = null == g || g === !1 ? g : g.colours, g = null == g || g === !1 ? g : g.olive, (typeof g === \"undefined\" ? \"undefined\" : _typeof(g)) === i ? g.apply(b) : g)) + '</a></li>\\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"navy\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"navy\">' + j((g = b && b.locale, g = null == g || g === !1 ? g : g.colours, g = null == g || g === !1 ? g : g.navy, (typeof g === \"undefined\" ? \"undefined\" : _typeof(g)) === i ? g.apply(b) : g)) + '</a></li>\\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"blue\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"blue\">' + j((g = b && b.locale, g = null == g || g === !1 ? g : g.colours, g = null == g || g === !1 ? g : g.blue, (typeof g === \"undefined\" ? \"undefined\" : _typeof(g)) === i ? g.apply(b) : g)) + '</a></li>\\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"orange\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"orange\">' + j((g = b && b.locale, g = null == g || g === !1 ? g : g.colours, g = null == g || g === !1 ? g : g.orange, (typeof g === \"undefined\" ? \"undefined\" : _typeof(g)) === i ? g.apply(b) : g)) + \"</a></li>\\n </ul>\\n</li>\\n\", h;\n}), this.wysihtml5.tpl.emphasis = Handlebars.template(function (a, b, c, d, e) {\n function f(a) {\n var b,\n c = \"\";return c += \"btn-\" + k((b = a && a.options, b = null == b || b === !1 ? b : b.toolbar, b = null == b || b === !1 ? b : b.size, (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) === j ? b.apply(a) : b)), c;\n }function g(a, b) {\n var d,\n e = \"\";return e += '\\n <a class=\"btn ', d = c[\"if\"].call(a, (d = a && a.options, d = null == d || d === !1 ? d : d.toolbar, null == d || d === !1 ? d : d.size), { hash: {}, inverse: l.noop, fn: l.program(1, f, b), data: b }), (d || 0 === d) && (e += d), e += ' btn-default\" data-wysihtml5-command=\"small\" title=\"CTRL+S\" tabindex=\"-1\">' + k((d = a && a.locale, d = null == d || d === !1 ? d : d.emphasis, d = null == d || d === !1 ? d : d.small, (typeof d === \"undefined\" ? \"undefined\" : _typeof(d)) === j ? d.apply(a) : d)) + \"</a>\\n \", e;\n }this.compilerInfo = [4, \">= 1.0.0\"], c = this.merge(c, a.helpers), e = e || {};var h,\n i = \"\",\n j = \"function\",\n k = this.escapeExpression,\n l = this;return i += '<li>\\n <div class=\"btn-group\">\\n <a class=\"btn ', h = c[\"if\"].call(b, (h = b && b.options, h = null == h || h === !1 ? h : h.toolbar, null == h || h === !1 ? h : h.size), { hash: {}, inverse: l.noop, fn: l.program(1, f, e), data: e }), (h || 0 === h) && (i += h), i += ' btn-default\" data-wysihtml5-command=\"bold\" title=\"CTRL+B\" tabindex=\"-1\">' + k((h = b && b.locale, h = null == h || h === !1 ? h : h.emphasis, h = null == h || h === !1 ? h : h.bold, (typeof h === \"undefined\" ? \"undefined\" : _typeof(h)) === j ? h.apply(b) : h)) + '</a>\\n <a class=\"btn ', h = c[\"if\"].call(b, (h = b && b.options, h = null == h || h === !1 ? h : h.toolbar, null == h || h === !1 ? h : h.size), { hash: {}, inverse: l.noop, fn: l.program(1, f, e), data: e }), (h || 0 === h) && (i += h), i += ' btn-default\" data-wysihtml5-command=\"italic\" title=\"CTRL+I\" tabindex=\"-1\">' + k((h = b && b.locale, h = null == h || h === !1 ? h : h.emphasis, h = null == h || h === !1 ? h : h.italic, (typeof h === \"undefined\" ? \"undefined\" : _typeof(h)) === j ? h.apply(b) : h)) + '</a>\\n <a class=\"btn ', h = c[\"if\"].call(b, (h = b && b.options, h = null == h || h === !1 ? h : h.toolbar, null == h || h === !1 ? h : h.size), { hash: {}, inverse: l.noop, fn: l.program(1, f, e), data: e }), (h || 0 === h) && (i += h), i += ' btn-default\" data-wysihtml5-command=\"underline\" title=\"CTRL+U\" tabindex=\"-1\">' + k((h = b && b.locale, h = null == h || h === !1 ? h : h.emphasis, h = null == h || h === !1 ? h : h.underline, (typeof h === \"undefined\" ? \"undefined\" : _typeof(h)) === j ? h.apply(b) : h)) + \"</a>\\n \", h = c[\"if\"].call(b, (h = b && b.options, h = null == h || h === !1 ? h : h.toolbar, h = null == h || h === !1 ? h : h.emphasis, null == h || h === !1 ? h : h.small), { hash: {}, inverse: l.noop, fn: l.program(3, g, e), data: e }), (h || 0 === h) && (i += h), i += \"\\n </div>\\n</li>\\n\", i;\n}), this.wysihtml5.tpl[\"font-styles\"] = Handlebars.template(function (a, b, c, d, e) {\n function f(a) {\n var b,\n c = \"\";return c += \"btn-\" + l((b = a && a.options, b = null == b || b === !1 ? b : b.toolbar, b = null == b || b === !1 ? b : b.size, (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) === k ? b.apply(a) : b)), c;\n }function g() {\n return '\\n <span class=\"fa fa-font\"></span>\\n ';\n }function h() {\n return '\\n <span class=\"glyphicon glyphicon-font\"></span>\\n ';\n }this.compilerInfo = [4, \">= 1.0.0\"], c = this.merge(c, a.helpers), e = e || {};var i,\n j = \"\",\n k = \"function\",\n l = this.escapeExpression,\n m = this;return j += '<li class=\"dropdown\">\\n <a class=\"btn btn-default dropdown-toggle ', i = c[\"if\"].call(b, (i = b && b.options, i = null == i || i === !1 ? i : i.toolbar, null == i || i === !1 ? i : i.size), { hash: {}, inverse: m.noop, fn: m.program(1, f, e), data: e }), (i || 0 === i) && (j += i), j += '\" data-toggle=\"dropdown\">\\n ', i = c[\"if\"].call(b, (i = b && b.options, i = null == i || i === !1 ? i : i.toolbar, null == i || i === !1 ? i : i.fa), { hash: {}, inverse: m.program(5, h, e), fn: m.program(3, g, e), data: e }), (i || 0 === i) && (j += i), j += '\\n <span class=\"current-font\">' + l((i = b && b.locale, i = null == i || i === !1 ? i : i.font_styles, i = null == i || i === !1 ? i : i.normal, (typeof i === \"undefined\" ? \"undefined\" : _typeof(i)) === k ? i.apply(b) : i)) + '</span>\\n <b class=\"caret\"></b>\\n </a>\\n <ul class=\"dropdown-menu\">\\n <li><a data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"p\" tabindex=\"-1\">' + l((i = b && b.locale, i = null == i || i === !1 ? i : i.font_styles, i = null == i || i === !1 ? i : i.normal, (typeof i === \"undefined\" ? \"undefined\" : _typeof(i)) === k ? i.apply(b) : i)) + '</a></li>\\n <li><a data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"h1\" tabindex=\"-1\">' + l((i = b && b.locale, i = null == i || i === !1 ? i : i.font_styles, i = null == i || i === !1 ? i : i.h1, (typeof i === \"undefined\" ? \"undefined\" : _typeof(i)) === k ? i.apply(b) : i)) + '</a></li>\\n <li><a data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"h2\" tabindex=\"-1\">' + l((i = b && b.locale, i = null == i || i === !1 ? i : i.font_styles, i = null == i || i === !1 ? i : i.h2, (typeof i === \"undefined\" ? \"undefined\" : _typeof(i)) === k ? i.apply(b) : i)) + '</a></li>\\n <li><a data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"h3\" tabindex=\"-1\">' + l((i = b && b.locale, i = null == i || i === !1 ? i : i.font_styles, i = null == i || i === !1 ? i : i.h3, (typeof i === \"undefined\" ? \"undefined\" : _typeof(i)) === k ? i.apply(b) : i)) + '</a></li>\\n <li><a data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"h4\" tabindex=\"-1\">' + l((i = b && b.locale, i = null == i || i === !1 ? i : i.font_styles, i = null == i || i === !1 ? i : i.h4, (typeof i === \"undefined\" ? \"undefined\" : _typeof(i)) === k ? i.apply(b) : i)) + '</a></li>\\n <li><a data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"h5\" tabindex=\"-1\">' + l((i = b && b.locale, i = null == i || i === !1 ? i : i.font_styles, i = null == i || i === !1 ? i : i.h5, (typeof i === \"undefined\" ? \"undefined\" : _typeof(i)) === k ? i.apply(b) : i)) + '</a></li>\\n <li><a data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"h6\" tabindex=\"-1\">' + l((i = b && b.locale, i = null == i || i === !1 ? i : i.font_styles, i = null == i || i === !1 ? i : i.h6, (typeof i === \"undefined\" ? \"undefined\" : _typeof(i)) === k ? i.apply(b) : i)) + \"</a></li>\\n </ul>\\n</li>\\n\", j;\n}), this.wysihtml5.tpl.html = Handlebars.template(function (a, b, c, d, e) {\n function f(a) {\n var b,\n c = \"\";return c += \"btn-\" + l((b = a && a.options, b = null == b || b === !1 ? b : b.toolbar, b = null == b || b === !1 ? b : b.size, (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) === k ? b.apply(a) : b)), c;\n }function g() {\n return '\\n <span class=\"fa fa-pencil\"></span>\\n ';\n }function h() {\n return '\\n <span class=\"glyphicon glyphicon-pencil\"></span>\\n ';\n }this.compilerInfo = [4, \">= 1.0.0\"], c = this.merge(c, a.helpers), e = e || {};var i,\n j = \"\",\n k = \"function\",\n l = this.escapeExpression,\n m = this;return j += '<li>\\n <div class=\"btn-group\">\\n <a class=\"btn ', i = c[\"if\"].call(b, (i = b && b.options, i = null == i || i === !1 ? i : i.toolbar, null == i || i === !1 ? i : i.size), { hash: {}, inverse: m.noop, fn: m.program(1, f, e), data: e }), (i || 0 === i) && (j += i), j += ' btn-default\" data-wysihtml5-action=\"change_view\" title=\"' + l((i = b && b.locale, i = null == i || i === !1 ? i : i.html, i = null == i || i === !1 ? i : i.edit, (typeof i === \"undefined\" ? \"undefined\" : _typeof(i)) === k ? i.apply(b) : i)) + '\" tabindex=\"-1\">\\n ', i = c[\"if\"].call(b, (i = b && b.options, i = null == i || i === !1 ? i : i.toolbar, null == i || i === !1 ? i : i.fa), { hash: {}, inverse: m.program(5, h, e), fn: m.program(3, g, e), data: e }), (i || 0 === i) && (j += i), j += \"\\n </a>\\n </div>\\n</li>\\n\", j;\n}), this.wysihtml5.tpl.image = Handlebars.template(function (a, b, c, d, e) {\n function f() {\n return \"modal-sm\";\n }function g(a) {\n var b,\n c = \"\";return c += \"btn-\" + m((b = a && a.options, b = null == b || b === !1 ? b : b.toolbar, b = null == b || b === !1 ? b : b.size, (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) === l ? b.apply(a) : b)), c;\n }function h() {\n return '\\n <span class=\"fa fa-file-image-o\"></span>\\n ';\n }function i() {\n return '\\n <span class=\"glyphicon glyphicon-picture\"></span>\\n ';\n }this.compilerInfo = [4, \">= 1.0.0\"], c = this.merge(c, a.helpers), e = e || {};var j,\n k = \"\",\n l = \"function\",\n m = this.escapeExpression,\n n = this;return k += '<li>\\n <div class=\"bootstrap-wysihtml5-insert-image-modal modal fade\" data-wysihtml5-dialog=\"insertImage\">\\n <div class=\"modal-dialog ', j = c[\"if\"].call(b, (j = b && b.options, j = null == j || j === !1 ? j : j.toolbar, null == j || j === !1 ? j : j.smallmodals), { hash: {}, inverse: n.noop, fn: n.program(1, f, e), data: e }), (j || 0 === j) && (k += j), k += '\">\\n <div class=\"modal-content\">\\n <div class=\"modal-header\">\\n <a class=\"close\" data-dismiss=\"modal\">&times;</a>\\n <h3>' + m((j = b && b.locale, j = null == j || j === !1 ? j : j.image, j = null == j || j === !1 ? j : j.insert, (typeof j === \"undefined\" ? \"undefined\" : _typeof(j)) === l ? j.apply(b) : j)) + '</h3>\\n </div>\\n <div class=\"modal-body\">\\n <div class=\"form-group\">\\n <input value=\"http://\" class=\"bootstrap-wysihtml5-insert-image-url form-control\" data-wysihtml5-dialog-field=\"src\">\\n </div> \\n </div>\\n <div class=\"modal-footer\">\\n <a class=\"btn btn-default\" data-dismiss=\"modal\" data-wysihtml5-dialog-action=\"cancel\" href=\"#\">' + m((j = b && b.locale, j = null == j || j === !1 ? j : j.image, j = null == j || j === !1 ? j : j.cancel, (typeof j === \"undefined\" ? \"undefined\" : _typeof(j)) === l ? j.apply(b) : j)) + '</a>\\n <a class=\"btn btn-primary\" data-dismiss=\"modal\" data-wysihtml5-dialog-action=\"save\" href=\"#\">' + m((j = b && b.locale, j = null == j || j === !1 ? j : j.image, j = null == j || j === !1 ? j : j.insert, (typeof j === \"undefined\" ? \"undefined\" : _typeof(j)) === l ? j.apply(b) : j)) + '</a>\\n </div>\\n </div>\\n </div>\\n </div>\\n <a class=\"btn ', j = c[\"if\"].call(b, (j = b && b.options, j = null == j || j === !1 ? j : j.toolbar, null == j || j === !1 ? j : j.size), { hash: {}, inverse: n.noop, fn: n.program(3, g, e), data: e }), (j || 0 === j) && (k += j), k += ' btn-default\" data-wysihtml5-command=\"insertImage\" title=\"' + m((j = b && b.locale, j = null == j || j === !1 ? j : j.image, j = null == j || j === !1 ? j : j.insert, (typeof j === \"undefined\" ? \"undefined\" : _typeof(j)) === l ? j.apply(b) : j)) + '\" tabindex=\"-1\">\\n ', j = c[\"if\"].call(b, (j = b && b.options, j = null == j || j === !1 ? j : j.toolbar, null == j || j === !1 ? j : j.fa), { hash: {}, inverse: n.program(7, i, e), fn: n.program(5, h, e), data: e }), (j || 0 === j) && (k += j), k += \"\\n </a>\\n</li>\\n\", k;\n}), this.wysihtml5.tpl.link = Handlebars.template(function (a, b, c, d, e) {\n function f() {\n return \"modal-sm\";\n }function g(a) {\n var b,\n c = \"\";return c += \"btn-\" + m((b = a && a.options, b = null == b || b === !1 ? b : b.toolbar, b = null == b || b === !1 ? b : b.size, (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) === l ? b.apply(a) : b)), c;\n }function h() {\n return '\\n <span class=\"fa fa-share-square-o\"></span>\\n ';\n }function i() {\n return '\\n <span class=\"glyphicon glyphicon-share\"></span>\\n ';\n }this.compilerInfo = [4, \">= 1.0.0\"], c = this.merge(c, a.helpers), e = e || {};var j,\n k = \"\",\n l = \"function\",\n m = this.escapeExpression,\n n = this;return k += '<li>\\n <div class=\"bootstrap-wysihtml5-insert-link-modal modal fade\" data-wysihtml5-dialog=\"createLink\">\\n <div class=\"modal-dialog ', j = c[\"if\"].call(b, (j = b && b.options, j = null == j || j === !1 ? j : j.toolbar, null == j || j === !1 ? j : j.smallmodals), { hash: {}, inverse: n.noop, fn: n.program(1, f, e), data: e }), (j || 0 === j) && (k += j), k += '\">\\n <div class=\"modal-content\">\\n <div class=\"modal-header\">\\n <a class=\"close\" data-dismiss=\"modal\">&times;</a>\\n <h3>' + m((j = b && b.locale, j = null == j || j === !1 ? j : j.link, j = null == j || j === !1 ? j : j.insert, (typeof j === \"undefined\" ? \"undefined\" : _typeof(j)) === l ? j.apply(b) : j)) + '</h3>\\n </div>\\n <div class=\"modal-body\">\\n <div class=\"form-group\">\\n <input value=\"http://\" class=\"bootstrap-wysihtml5-insert-link-url form-control\" data-wysihtml5-dialog-field=\"href\">\\n </div> \\n <div class=\"checkbox\">\\n <label> \\n <input type=\"checkbox\" class=\"bootstrap-wysihtml5-insert-link-target\" checked>' + m((j = b && b.locale, j = null == j || j === !1 ? j : j.link, j = null == j || j === !1 ? j : j.target, (typeof j === \"undefined\" ? \"undefined\" : _typeof(j)) === l ? j.apply(b) : j)) + '\\n </label>\\n </div>\\n </div>\\n <div class=\"modal-footer\">\\n <a class=\"btn btn-default\" data-dismiss=\"modal\" data-wysihtml5-dialog-action=\"cancel\" href=\"#\">' + m((j = b && b.locale, j = null == j || j === !1 ? j : j.link, j = null == j || j === !1 ? j : j.cancel, (typeof j === \"undefined\" ? \"undefined\" : _typeof(j)) === l ? j.apply(b) : j)) + '</a>\\n <a href=\"#\" class=\"btn btn-primary\" data-dismiss=\"modal\" data-wysihtml5-dialog-action=\"save\">' + m((j = b && b.locale, j = null == j || j === !1 ? j : j.link, j = null == j || j === !1 ? j : j.insert, (typeof j === \"undefined\" ? \"undefined\" : _typeof(j)) === l ? j.apply(b) : j)) + '</a>\\n </div>\\n </div>\\n </div>\\n </div>\\n <a class=\"btn ', j = c[\"if\"].call(b, (j = b && b.options, j = null == j || j === !1 ? j : j.toolbar, null == j || j === !1 ? j : j.size), { hash: {}, inverse: n.noop, fn: n.program(3, g, e), data: e }), (j || 0 === j) && (k += j), k += ' btn-default\" data-wysihtml5-command=\"createLink\" title=\"' + m((j = b && b.locale, j = null == j || j === !1 ? j : j.link, j = null == j || j === !1 ? j : j.insert, (typeof j === \"undefined\" ? \"undefined\" : _typeof(j)) === l ? j.apply(b) : j)) + '\" tabindex=\"-1\">\\n ', j = c[\"if\"].call(b, (j = b && b.options, j = null == j || j === !1 ? j : j.toolbar, null == j || j === !1 ? j : j.fa), { hash: {}, inverse: n.program(7, i, e), fn: n.program(5, h, e), data: e }), (j || 0 === j) && (k += j), k += \"\\n </a>\\n</li>\\n\", k;\n}), this.wysihtml5.tpl.lists = Handlebars.template(function (a, b, c, d, e) {\n function f(a) {\n var b,\n c = \"\";return c += \"btn-\" + r((b = a && a.options, b = null == b || b === !1 ? b : b.toolbar, b = null == b || b === !1 ? b : b.size, (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) === q ? b.apply(a) : b)), c;\n }function g() {\n return '\\n <span class=\"fa fa-list-ul\"></span>\\n ';\n }function h() {\n return '\\n <span class=\"glyphicon glyphicon-list\"></span>\\n ';\n }function i() {\n return '\\n <span class=\"fa fa-list-ol\"></span>\\n ';\n }function j() {\n return '\\n <span class=\"glyphicon glyphicon-th-list\"></span>\\n ';\n }function k() {\n return '\\n <span class=\"fa fa-outdent\"></span>\\n ';\n }function l() {\n return '\\n <span class=\"glyphicon glyphicon-indent-right\"></span>\\n ';\n }function m() {\n return '\\n <span class=\"fa fa-indent\"></span>\\n ';\n }function n() {\n return '\\n <span class=\"glyphicon glyphicon-indent-left\"></span>\\n ';\n }this.compilerInfo = [4, \">= 1.0.0\"], c = this.merge(c, a.helpers), e = e || {};var o,\n p = \"\",\n q = \"function\",\n r = this.escapeExpression,\n s = this;return p += '<li>\\n <div class=\"btn-group\">\\n <a class=\"btn ', o = c[\"if\"].call(b, (o = b && b.options, o = null == o || o === !1 ? o : o.toolbar, null == o || o === !1 ? o : o.size), { hash: {}, inverse: s.noop, fn: s.program(1, f, e), data: e }), (o || 0 === o) && (p += o), p += ' btn-default\" data-wysihtml5-command=\"insertUnorderedList\" title=\"' + r((o = b && b.locale, o = null == o || o === !1 ? o : o.lists, o = null == o || o === !1 ? o : o.unordered, (typeof o === \"undefined\" ? \"undefined\" : _typeof(o)) === q ? o.apply(b) : o)) + '\" tabindex=\"-1\">\\n ', o = c[\"if\"].call(b, (o = b && b.options, o = null == o || o === !1 ? o : o.toolbar, null == o || o === !1 ? o : o.fa), { hash: {}, inverse: s.program(5, h, e), fn: s.program(3, g, e), data: e }), (o || 0 === o) && (p += o), p += '\\n </a>\\n <a class=\"btn ', o = c[\"if\"].call(b, (o = b && b.options, o = null == o || o === !1 ? o : o.toolbar, null == o || o === !1 ? o : o.size), { hash: {}, inverse: s.noop, fn: s.program(1, f, e), data: e }), (o || 0 === o) && (p += o), p += ' btn-default\" data-wysihtml5-command=\"insertOrderedList\" title=\"' + r((o = b && b.locale, o = null == o || o === !1 ? o : o.lists, o = null == o || o === !1 ? o : o.ordered, (typeof o === \"undefined\" ? \"undefined\" : _typeof(o)) === q ? o.apply(b) : o)) + '\" tabindex=\"-1\">\\n ', o = c[\"if\"].call(b, (o = b && b.options, o = null == o || o === !1 ? o : o.toolbar, null == o || o === !1 ? o : o.fa), { hash: {}, inverse: s.program(9, j, e), fn: s.program(7, i, e), data: e }), (o || 0 === o) && (p += o), p += '\\n </a>\\n <a class=\"btn ', o = c[\"if\"].call(b, (o = b && b.options, o = null == o || o === !1 ? o : o.toolbar, null == o || o === !1 ? o : o.size), { hash: {}, inverse: s.noop, fn: s.program(1, f, e), data: e }), (o || 0 === o) && (p += o), p += ' btn-default\" data-wysihtml5-command=\"Outdent\" title=\"' + r((o = b && b.locale, o = null == o || o === !1 ? o : o.lists, o = null == o || o === !1 ? o : o.outdent, (typeof o === \"undefined\" ? \"undefined\" : _typeof(o)) === q ? o.apply(b) : o)) + '\" tabindex=\"-1\">\\n ', o = c[\"if\"].call(b, (o = b && b.options, o = null == o || o === !1 ? o : o.toolbar, null == o || o === !1 ? o : o.fa), { hash: {}, inverse: s.program(13, l, e), fn: s.program(11, k, e), data: e }), (o || 0 === o) && (p += o), p += '\\n </a>\\n <a class=\"btn ', o = c[\"if\"].call(b, (o = b && b.options, o = null == o || o === !1 ? o : o.toolbar, null == o || o === !1 ? o : o.size), { hash: {}, inverse: s.noop, fn: s.program(1, f, e), data: e }), (o || 0 === o) && (p += o), p += ' btn-default\" data-wysihtml5-command=\"Indent\" title=\"' + r((o = b && b.locale, o = null == o || o === !1 ? o : o.lists, o = null == o || o === !1 ? o : o.indent, (typeof o === \"undefined\" ? \"undefined\" : _typeof(o)) === q ? o.apply(b) : o)) + '\" tabindex=\"-1\">\\n ', o = c[\"if\"].call(b, (o = b && b.options, o = null == o || o === !1 ? o : o.toolbar, null == o || o === !1 ? o : o.fa), { hash: {}, inverse: s.program(17, n, e), fn: s.program(15, m, e), data: e }), (o || 0 === o) && (p += o), p += \"\\n </a>\\n </div>\\n</li>\\n\", p;\n}), function (a) {\n \"use strict\";\n true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1), !(function webpackMissingModule() { var e = new Error(\"Cannot find module \\\"wysihtml5\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e; }()), __webpack_require__(5), !(function webpackMissingModule() { var e = new Error(\"Cannot find module \\\"bootstrap.wysihtml5.templates\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e; }()), !(function webpackMissingModule() { var e = new Error(\"Cannot find module \\\"bootstrap.wysihtml5.commands\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e; }())], __WEBPACK_AMD_DEFINE_FACTORY__ = (a),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_0__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__)) : a(jQuery, wysihtml5);\n}(function (a, b) {\n \"use strict\";\n var c = function c(a, b) {\n var c,\n d,\n e,\n f = function f(a, c, d) {\n return b.tpl[a] ? b.tpl[a]({ locale: c, options: d }) : void 0;\n },\n g = function g(c, e) {\n var f, g;this.el = c, f = a.extend(!0, {}, d, e);for (g in f.customTemplates) {\n f.customTemplates.hasOwnProperty(g) && (b.tpl[g] = f.customTemplates[g]);\n }this.toolbar = this.createToolbar(c, f), this.editor = this.createEditor(f);\n };g.prototype = { constructor: g, createEditor: function createEditor(b) {\n b = b || {}, b = a.extend(!0, {}, b), b.toolbar = this.toolbar[0], this.initializeEditor(this.el[0], b);\n }, initializeEditor: function initializeEditor(a, c) {\n var d,\n e = new b.Editor(this.el[0], c);if (e.on(\"beforeload\", this.syncBootstrapDialogEvents), e.on(\"beforeload\", this.loadParserRules), e.composer.editableArea.contentDocument ? this.addMoreShortcuts(e, e.composer.editableArea.contentDocument.body || e.composer.editableArea.contentDocument, c.shortcuts) : this.addMoreShortcuts(e, e.composer.editableArea, c.shortcuts), c && c.events) for (d in c.events) {\n c.events.hasOwnProperty(d) && e.on(d, c.events[d]);\n }return e;\n }, loadParserRules: function loadParserRules() {\n \"string\" === a.type(this.config.parserRules) && a.ajax({ dataType: \"json\", url: this.config.parserRules, context: this, error: function error(a, b, c) {\n void 0;\n }, success: function success(a) {\n this.config.parserRules = a, void 0;\n } }), this.config.pasteParserRulesets && \"string\" === a.type(this.config.pasteParserRulesets) && a.ajax({ dataType: \"json\", url: this.config.pasteParserRulesets, context: this, error: function error(a, b, c) {\n void 0;\n }, success: function success(a) {\n this.config.pasteParserRulesets = a;\n } });\n }, syncBootstrapDialogEvents: function syncBootstrapDialogEvents() {\n var b = this;a.map(this.toolbar.commandMapping, function (a) {\n return [a];\n }).filter(function (a) {\n return a.dialog;\n }).map(function (a) {\n return a.dialog;\n }).forEach(function (c) {\n c.on(\"show\", function () {\n a(this.container).modal(\"show\");\n }), c.on(\"hide\", function () {\n a(this.container).modal(\"hide\"), setTimeout(b.composer.focus, 0);\n }), a(c.container).on(\"shown.bs.modal\", function () {\n a(this).find(\"input, select, textarea\").first().focus();\n });\n }), this.on(\"change_view\", function () {\n a(this.toolbar.container.children).find(\"a.btn\").not('[data-wysihtml5-action=\"change_view\"]').toggleClass(\"disabled\");\n });\n }, createToolbar: function createToolbar(b, c) {\n var g,\n h,\n i = this,\n j = a(\"<ul/>\", { \"class\": \"wysihtml5-toolbar\", style: \"display:none\" }),\n k = c.locale || d.locale || \"en\";e.hasOwnProperty(k) || (void 0, k = \"en\"), g = a.extend(!0, {}, e.en, e[k]);for (h in c.toolbar) {\n c.toolbar[h] && j.append(f(h, g, c));\n }return j.find('a[data-wysihtml5-command=\"formatBlock\"]').click(function (b) {\n var c = b.delegateTarget || b.target || b.srcElement,\n d = a(c),\n e = d.data(\"wysihtml5-display-format-name\"),\n f = d.data(\"wysihtml5-format-name\") || d.html();(void 0 === e || \"true\" === e) && i.toolbar.find(\".current-font\").text(f);\n }), j.find('a[data-wysihtml5-command=\"foreColor\"]').click(function (b) {\n var c = b.target || b.srcElement,\n d = a(c);i.toolbar.find(\".current-color\").text(d.html());\n }), this.el.before(j), j;\n }, addMoreShortcuts: function addMoreShortcuts(a, c, d) {\n b.dom.observe(c, \"keydown\", function (c) {\n var e,\n f = c.keyCode,\n g = d[f];(c.ctrlKey || c.metaKey || c.altKey) && g && b.commands[g] && (e = a.toolbar.commandMapping[g + \":null\"], e && e.dialog && !e.state ? e.dialog.show() : b.commands[g].exec(a.composer, g), c.preventDefault());\n });\n } }, c = { resetDefaults: function resetDefaults() {\n a.fn.wysihtml5.defaultOptions = a.extend(!0, {}, a.fn.wysihtml5.defaultOptionsCache);\n }, bypassDefaults: function bypassDefaults(b) {\n return this.each(function () {\n var c = a(this);c.data(\"wysihtml5\", new g(c, b));\n });\n }, shallowExtend: function shallowExtend(b) {\n var d = a.extend({}, a.fn.wysihtml5.defaultOptions, b || {}, a(this).data()),\n e = this;return c.bypassDefaults.apply(e, [d]);\n }, deepExtend: function deepExtend(b) {\n var d = a.extend(!0, {}, a.fn.wysihtml5.defaultOptions, b || {}),\n e = this;return c.bypassDefaults.apply(e, [d]);\n }, init: function init(a) {\n var b = this;return c.shallowExtend.apply(b, [a]);\n } }, a.fn.wysihtml5 = function (b) {\n return c[b] ? c[b].apply(this, Array.prototype.slice.call(arguments, 1)) : \"object\" != (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) && b ? (a.error(\"Method \" + b + \" does not exist on jQuery.wysihtml5\"), void 0) : c.init.apply(this, arguments);\n }, a.fn.wysihtml5.Constructor = g, d = a.fn.wysihtml5.defaultOptions = { toolbar: { \"font-styles\": !0, color: !1, emphasis: { small: !0 }, blockquote: !0, lists: !0, html: !1, link: !0, image: !0, smallmodals: !1 }, useLineBreaks: !1, parserRules: { classes: { \"wysiwyg-color-silver\": 1, \"wysiwyg-color-gray\": 1, \"wysiwyg-color-white\": 1, \"wysiwyg-color-maroon\": 1, \"wysiwyg-color-red\": 1, \"wysiwyg-color-purple\": 1, \"wysiwyg-color-fuchsia\": 1, \"wysiwyg-color-green\": 1, \"wysiwyg-color-lime\": 1, \"wysiwyg-color-olive\": 1, \"wysiwyg-color-yellow\": 1, \"wysiwyg-color-navy\": 1, \"wysiwyg-color-blue\": 1, \"wysiwyg-color-teal\": 1, \"wysiwyg-color-aqua\": 1, \"wysiwyg-color-orange\": 1 }, tags: { b: {}, i: {}, strong: {}, em: {}, p: {}, br: {}, ol: {}, ul: {}, li: {}, h1: {}, h2: {}, h3: {}, h4: {}, h5: {}, h6: {}, blockquote: {}, u: 1, img: { check_attributes: { width: \"numbers\", alt: \"alt\", src: \"url\", height: \"numbers\" } }, a: { check_attributes: { href: \"url\" }, set_attributes: { target: \"_blank\", rel: \"nofollow\" } }, span: 1, div: 1, small: 1, code: 1, pre: 1 } }, locale: \"en\", shortcuts: { 83: \"small\", 75: \"createLink\" } }, void 0 === a.fn.wysihtml5.defaultOptionsCache && (a.fn.wysihtml5.defaultOptionsCache = a.extend(!0, {}, a.fn.wysihtml5.defaultOptions)), e = a.fn.wysihtml5.locale = {};\n };c(a, b);\n}), function (a) {\n a.commands.small = { exec: function exec(b, c) {\n return a.commands.formatInline.exec(b, c, \"small\");\n }, state: function state(b, c) {\n return a.commands.formatInline.state(b, c, \"small\");\n } };\n}(wysihtml5), function (a) {\n true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1), __WEBPACK_LOCAL_MODULE_0__], __WEBPACK_AMD_DEFINE_FACTORY__ = (a),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : a(jQuery);\n}(function (a) {\n a.fn.wysihtml5.locale.en = a.fn.wysihtml5.locale[\"en-US\"] = { font_styles: { normal: \"Normal text\", h1: \"Heading 1\", h2: \"Heading 2\", h3: \"Heading 3\", h4: \"Heading 4\", h5: \"Heading 5\", h6: \"Heading 6\" }, emphasis: { bold: \"Bold\", italic: \"Italic\", underline: \"Underline\", small: \"Small\" }, lists: { unordered: \"Unordered list\", ordered: \"Ordered list\", outdent: \"Outdent\", indent: \"Indent\" }, link: { insert: \"Insert link\", cancel: \"Cancel\", target: \"Open link in new window\" }, image: { insert: \"Insert image\", cancel: \"Cancel\" }, html: { edit: \"Edit HTML\" }, colours: { black: \"Black\", silver: \"Silver\", gray: \"Grey\", maroon: \"Maroon\", red: \"Red\", purple: \"Purple\", green: \"Green\", olive: \"Olive\", navy: \"Navy\", blue: \"Blue\", orange: \"Orange\" } };\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9wbHVnaW5zL2Jvb3RzdHJhcC13eXNpaHRtbDUvYm9vdHN0cmFwMy13eXNpaHRtbDUuYWxsLm1pbi5qcz80NzRhIl0sIm5hbWVzIjpbInd5c2lodG1sNSIsIkJhc2UiLCJIYW5kbGViYXJzIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJFbGVtZW50IiwicHJvdG90eXBlIiwiZ2V0IiwiYSIsImNhbGwiLCJzZXQiLCJiIiwiQXJyYXkiLCJpc0FycmF5IiwidG9TdHJpbmciLCJ2ZXJzaW9uIiwiY29tbWFuZHMiLCJkb20iLCJxdWlya3MiLCJ0b29sYmFyIiwibGFuZyIsInNlbGVjdGlvbiIsInZpZXdzIiwiSU5WSVNJQkxFX1NQQUNFIiwiRU1QVFlfRlVOQ1RJT04iLCJFTEVNRU5UX05PREUiLCJURVhUX05PREUiLCJCQUNLU1BBQ0VfS0VZIiwiRU5URVJfS0VZIiwiRVNDQVBFX0tFWSIsIlNQQUNFX0tFWSIsIkRFTEVURV9LRVkiLCJyYW5neSIsImMiLCJ4IiwidyIsInkiLCJkIiwibGVuZ3RoIiwiZSIsIkQiLCJDIiwiRiIsIkIiLCJmIiwiYm9keSIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZyIsIndpbmRvdyIsImNvbnNvbGUiLCJsb2ciLCJoIiwiYWxlcnQiLCJpIiwiSCIsImluaXRpYWxpemVkIiwic3VwcG9ydGVkIiwiY29uZmlnIiwiYWxlcnRPbkZhaWwiLCJqIiwiYWxlcnRPbldhcm4iLCJrIiwibWVzc2FnZSIsImRlc2NyaXB0aW9uIiwibCIsIm0iLCJvIiwicCIsImRvY3VtZW50IiwiY3JlYXRlUmFuZ2UiLCJBIiwieiIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJjcmVhdGVUZXh0UmFuZ2UiLCJmZWF0dXJlcyIsImltcGxlbWVudHNEb21SYW5nZSIsImltcGxlbWVudHNUZXh0UmFuZ2UiLCJHIiwibiIsImluaXQiLCJzIiwicSIsInQiLCJuYW1lIiwiZGVwZW5kZW5jaWVzIiwiaW5pdGlhbGl6ZXIiLCJyIiwidSIsInYiLCJFIiwidXRpbCIsImlzSG9zdE1ldGhvZCIsImlzSG9zdE9iamVjdCIsImlzSG9zdFByb3BlcnR5IiwiYXJlSG9zdE1ldGhvZHMiLCJhcmVIb3N0T2JqZWN0cyIsImFyZUhvc3RQcm9wZXJ0aWVzIiwiaXNUZXh0UmFuZ2UiLCJnZXRCb2R5IiwibW9kdWxlcyIsInByZWZlclRleHRSYW5nZSIsImF1dG9Jbml0aWFsaXplIiwicmFuZ3lBdXRvSW5pdGlhbGl6ZSIsImZhaWwiLCJ3YXJuIiwiaGFzT3duUHJvcGVydHkiLCJleHRlbmQiLCJjcmVhdGVFbGVtZW50IiwiYXBwZW5kQ2hpbGQiLCJzbGljZSIsImNoaWxkTm9kZXMiLCJub2RlVHlwZSIsInRvQXJyYXkiLCJhZGRFdmVudExpc3RlbmVyIiwiYXR0YWNoRXZlbnQiLCJhZGRMaXN0ZW5lciIsImFkZEluaXRMaXN0ZW5lciIsInB1c2giLCJhZGRTaGltTGlzdGVuZXIiLCJzaGltIiwiY3JlYXRlTWlzc2luZ05hdGl2ZUFwaSIsIkVycm9yIiwiZGVwcmVjYXRpb25Ob3RpY2UiLCJjcmVhdGVFcnJvciIsImNyZWF0ZU1vZHVsZSIsImFyZ3VtZW50cyIsImNyZWF0ZUNvcmVNb2R1bGUiLCJSYW5nZVByb3RvdHlwZSIsInJhbmdlUHJvdG90eXBlIiwic2VsZWN0aW9uUHJvdG90eXBlIiwibmFtZXNwYWNlVVJJIiwiSSIsInBhcmVudE5vZGUiLCJwcmV2aW91c1NpYmxpbmciLCJuZXh0U2libGluZyIsImluc2VydEJlZm9yZSIsImNsb25lTm9kZSIsImRlbGV0ZURhdGEiLCJub2RlIiwib2Zmc2V0Iiwib3duZXJEb2N1bWVudCIsImRlZmF1bHRWaWV3IiwicGFyZW50V2luZG93IiwiY29udGVudERvY3VtZW50IiwiY29udGVudFdpbmRvdyIsIkoiLCJ0YWdOYW1lIiwiZmlyc3RDaGlsZCIsImRhdGEiLCJpZCIsImlubmVySFRNTCIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJyb290IiwiX25leHQiLCJjb2RlIiwiY29kZU5hbWUiLCJjcmVhdGVUZXh0Tm9kZSIsImNyYXNoeVRleHROb2RlcyIsImdldENvbXB1dGVkU3R5bGUiLCJkb2N1bWVudEVsZW1lbnQiLCJjdXJyZW50U3R5bGUiLCJfY3VycmVudCIsImhhc05leHQiLCJuZXh0IiwiZGV0YWNoIiwiZXF1YWxzIiwiaW5zcGVjdCIsIklOREVYX1NJWkVfRVJSIiwiSElFUkFSQ0hZX1JFUVVFU1RfRVJSIiwiV1JPTkdfRE9DVU1FTlRfRVJSIiwiTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSIiwiTk9UX0ZPVU5EX0VSUiIsIk5PVF9TVVBQT1JURURfRVJSIiwiSU5WQUxJRF9TVEFURV9FUlIiLCJJTlZBTElEX05PREVfVFlQRV9FUlIiLCJhcnJheUNvbnRhaW5zIiwiaXNIdG1sTmFtZXNwYWNlIiwicGFyZW50RWxlbWVudCIsImdldE5vZGVJbmRleCIsImdldE5vZGVMZW5ndGgiLCJnZXRDb21tb25BbmNlc3RvciIsImlzQW5jZXN0b3JPZiIsImlzT3JJc0FuY2VzdG9yT2YiLCJnZXRDbG9zZXN0QW5jZXN0b3JJbiIsImlzQ2hhcmFjdGVyRGF0YU5vZGUiLCJpc1RleHRPckNvbW1lbnROb2RlIiwiaW5zZXJ0QWZ0ZXIiLCJzcGxpdERhdGFOb2RlIiwiZ2V0RG9jdW1lbnQiLCJnZXRXaW5kb3ciLCJnZXRJZnJhbWVXaW5kb3ciLCJnZXRJZnJhbWVEb2N1bWVudCIsImlzV2luZG93IiwiZ2V0Q29udGVudERvY3VtZW50IiwiZ2V0Um9vdENvbnRhaW5lciIsImNvbXBhcmVQb2ludHMiLCJpc0Jyb2tlbk5vZGUiLCJpbnNwZWN0Tm9kZSIsImdldENvbXB1dGVkU3R5bGVQcm9wZXJ0eSIsImZyYWdtZW50RnJvbU5vZGVDaGlsZHJlbiIsImNyZWF0ZUl0ZXJhdG9yIiwiRG9tUG9zaXRpb24iLCJET01FeGNlcHRpb24iLCJnYiIsInN0YXJ0Q29udGFpbmVyIiwiZW5kQ29udGFpbmVyIiwiaGIiLCJjYiIsImZiIiwiZWIiLCJhYiIsImpiIiwiZGIiLCJpYiIsInN0YXJ0T2Zmc2V0IiwiZW5kT2Zmc2V0IiwicmFuZ2UiLCJpc1BhcnRpYWxseVNlbGVjdGVkU3VidHJlZSIsImdldFN1YnRyZWVJdGVyYXRvciIsInN0b3AiLCJyZW1vdmUiLCJSZWdFeHAiLCJqb2luIiwidGVzdCIsImdldE5hbWUiLCJjbG9uZVBhcnRpYWxseVNlbGVjdGVkVGV4dE5vZGVzIiwiY29sbGFwc2VkIiwic2MiLCJzbyIsImVjIiwiZW8iLCJjb21tb25BbmNlc3RvckNvbnRhaW5lciIsImlzU2luZ2xlQ2hhcmFjdGVyRGF0YU5vZGUiLCJfZmlyc3QiLCJfbGFzdCIsImtiIiwibWIiLCJQIiwiTiIsIk8iLCJvYiIsInNldFN0YXJ0QW5kRW5kIiwiY2xvbmVDb250ZW50cyIsIlNUQVJUX1RPX1NUQVJUIiwiVSIsIlNUQVJUX1RPX0VORCIsIlYiLCJFTkRfVE9fRU5EIiwiVyIsIkVORF9UT19TVEFSVCIsIlgiLCJOT0RFX0JFRk9SRSIsIlkiLCJOT0RFX0FGVEVSIiwiWiIsIk5PREVfQkVGT1JFX0FORF9BRlRFUiIsIiQiLCJOT0RFX0lOU0lERSIsIl8iLCJyZXNldCIsIm5iIiwiYmIiLCJzZXRTdGFydCIsInNldEVuZCIsInNldEJvdW5kYXJ5Iiwic2V0U3RhcnRCZWZvcmUiLCJzZXRTdGFydEFmdGVyIiwic2V0RW5kQmVmb3JlIiwic2V0RW5kQWZ0ZXIiLCJjb2xsYXBzZSIsInNlbGVjdE5vZGVDb250ZW50cyIsImxiIiwic2VsZWN0Tm9kZSIsImV4dHJhY3RDb250ZW50cyIsImRlbGV0ZUNvbnRlbnRzIiwiY2FuU3Vycm91bmRDb250ZW50cyIsInNwbGl0Qm91bmRhcmllcyIsInNwbGl0Qm91bmRhcmllc1ByZXNlcnZpbmdQb3NpdGlvbnMiLCJub3JtYWxpemVCb3VuZGFyaWVzIiwiYXBwZW5kRGF0YSIsInJlbW92ZUNoaWxkIiwiaW5zZXJ0RGF0YSIsImNvbGxhcHNlVG9Qb2ludCIsIksiLCJMIiwiTSIsIlEiLCJSIiwiUyIsIlQiLCJjbG9uZVJhbmdlIiwicGIiLCJodG1sUGFyc2luZ0NvbmZvcm1zIiwiY29tcGFyZUJvdW5kYXJ5UG9pbnRzIiwiaW5zZXJ0Tm9kZSIsInN1cnJvdW5kQ29udGVudHMiLCJoYXNDaGlsZE5vZGVzIiwibGFzdENoaWxkIiwiY29tcGFyZU5vZGUiLCJjb21wYXJlUG9pbnQiLCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiLCJ0b0h0bWwiLCJpbnRlcnNlY3RzTm9kZSIsImlzUG9pbnRJblJhbmdlIiwiaW50ZXJzZWN0c1JhbmdlIiwiaW50ZXJzZWN0c09yVG91Y2hlc1JhbmdlIiwiaW50ZXJzZWN0aW9uIiwidW5pb24iLCJjb250YWluc05vZGUiLCJjb250YWluc05vZGVDb250ZW50cyIsImNvbnRhaW5zUmFuZ2UiLCJjb250YWluc05vZGVUZXh0IiwiZ2V0Tm9kZXMiLCJwb3AiLCJjb2xsYXBzZUJlZm9yZSIsImNvbGxhcHNlQWZ0ZXIiLCJnZXRCb29rbWFyayIsInN0YXJ0IiwiZW5kIiwiY29udGFpbmVyTm9kZSIsIm1vdmVUb0Jvb2ttYXJrIiwicmFuZ2VzRXF1YWwiLCJpc1ZhbGlkIiwicmFuZ2VQcm9wZXJ0aWVzIiwiUmFuZ2VJdGVyYXRvciIsImNvcHlDb21wYXJpc29uQ29uc3RhbnRzIiwiY3JlYXRlUHJvdG90eXBlUmFuZ2UiLCJnZXRSYW5nZURvY3VtZW50IiwiRG9tUmFuZ2UiLCJuYXRpdmVSYW5nZSIsInJlZnJlc2giLCJXcmFwcGVkUmFuZ2UiLCJjcmVhdGVOYXRpdmVSYW5nZSIsImR1cGxpY2F0ZSIsImNvbXBhcmVFbmRQb2ludHMiLCJjYW5IYXZlSFRNTCIsImJvdW5kYXJ5UG9zaXRpb24iLCJub2RlSW5mbyIsIm5vZGVJbmRleCIsImNvbnRhaW5lckVsZW1lbnQiLCJtb3ZlVG9FbGVtZW50VGV4dCIsIk1hdGgiLCJmbG9vciIsInNldEVuZFBvaW50IiwidGV4dCIsInJlcGxhY2UiLCJtb3ZlU3RhcnQiLCJ0ZXh0UmFuZ2UiLCJyYW5nZVRvVGV4dFJhbmdlIiwidG9UZXh0UmFuZ2UiLCJXcmFwcGVkVGV4dFJhbmdlIiwiUmFuZ2UiLCJjcmVhdGVSYW5neVJhbmdlIiwiY3JlYXRlSWZyYW1lUmFuZ2UiLCJjcmVhdGVJZnJhbWVSYW5neVJhbmdlIiwid2luIiwiZ2V0U2VsZWN0aW9uIiwiYW5jaG9yTm9kZSIsImFuY2hvck9mZnNldCIsImZvY3VzTm9kZSIsImZvY3VzT2Zmc2V0IiwibmF0aXZlU2VsZWN0aW9uIiwicmFuZ2VDb3VudCIsImlzQ29sbGFwc2VkIiwiX3JhbmdlcyIsImRvY1NlbGVjdGlvbiIsInR5cGUiLCJpdGVtIiwiY3JlYXRlQ29udHJvbFJhbmdlIiwiYWRkIiwic2VsZWN0IiwiZGV0YWNoZWQiLCJzcGxpY2UiLCJnZXRSYW5nZUF0Iiwic2V0U2luZ2xlUmFuZ2UiLCJpc0JhY2t3YXJkIiwiY2hlY2tTZWxlY3Rpb25SYW5nZXMiLCJpbXBsZW1lbnRzV2luR2V0U2VsZWN0aW9uIiwiaW1wbGVtZW50c0RvY1NlbGVjdGlvbiIsImlzU2VsZWN0aW9uVmFsaWQiLCJnZXROYXRpdmVTZWxlY3Rpb24iLCJzZWxlY3Rpb25IYXNBbmNob3JBbmRGb2N1cyIsInNlbGVjdGlvbkhhc0V4dGVuZCIsInNlbGVjdGlvbkhhc1JhbmdlQ291bnQiLCJhZGRSYW5nZSIsImNvbnRlbnRFZGl0YWJsZSIsInJlbW92ZUFsbFJhbmdlcyIsIm5hdmlnYXRvciIsImFwcFZlcnNpb24iLCJtYXRjaCIsInBhcnNlSW50Iiwic2VsZWN0aW9uU3VwcG9ydHNNdWx0aXBsZVJhbmdlcyIsImNvbGxhcHNlZE5vbkVkaXRhYmxlU2VsZWN0aW9uc1N1cHBvcnRlZCIsImltcGxlbWVudHNDb250cm9sUmFuZ2UiLCJnZXRJZnJhbWVTZWxlY3Rpb24iLCJzZXRSYW5nZXMiLCJlbXB0eSIsImdldEFsbFJhbmdlcyIsInJlbW92ZVJhbmdlIiwiaXNCYWNrd2FyZHMiLCJjb2xsYXBzZVRvU3RhcnQiLCJjb2xsYXBzZVRvRW5kIiwic2VsZWN0QWxsQ2hpbGRyZW4iLCJkZWxldGVGcm9tRG9jdW1lbnQiLCJlYWNoUmFuZ2UiLCJjYWxsTWV0aG9kT25FYWNoUmFuZ2UiLCJhcHBseSIsImNoYW5nZUVhY2hSYW5nZSIsImJhY2t3YXJkIiwicmFuZ2VCb29rbWFya3MiLCJnZXROYXRpdmVUZXh0UmFuZ2UiLCJkZXRhY2hBbGwiLCJpc0RpcmVjdGlvbkJhY2t3YXJkIiwiU2VsZWN0aW9uIiwiZ2V0RWxlbWVudEJ5SWQiLCJEYXRlIiwicmFuZG9tIiwic3R5bGUiLCJsaW5lSGVpZ2h0IiwiZGlzcGxheSIsImNsYXNzTmFtZSIsIm1hcmtlcklkIiwic3RhcnRNYXJrZXJJZCIsImVuZE1hcmtlcklkIiwic29ydCIsInJhbmdlSW5mb3MiLCJyZXN0b3JlZCIsImRvYyIsInNhdmVSYW5nZSIsInJlc3RvcmVSYW5nZSIsInNhdmVSYW5nZXMiLCJyZXN0b3JlUmFuZ2VzIiwic2F2ZVNlbGVjdGlvbiIsInJlc3RvcmVTZWxlY3Rpb24iLCJyZW1vdmVNYXJrZXJFbGVtZW50IiwicmVtb3ZlTWFya2VycyIsIl9wcm90b3R5cGluZyIsImJhc2UiLCJjb25zdHJ1Y3RvciIsIl9jb25zdHJ1Y3RpbmciLCJhbmNlc3RvciIsImZvckVhY2giLCJpbXBsZW1lbnQiLCJ2YWx1ZU9mIiwidG9Tb3VyY2UiLCJicm93c2VyIiwiYXBwTmFtZSIsImV4ZWMiLCJ1c2VyQWdlbnQiLCJwYXJzZUZsb2F0IiwiJDEiLCJpbmRleE9mIiwiVVNFUl9BR0VOVCIsImV4ZWNDb21tYW5kIiwicXVlcnlDb21tYW5kU3VwcG9ydGVkIiwicXVlcnlDb21tYW5kU3RhdGUiLCJxdWVyeVNlbGVjdG9yIiwicXVlcnlTZWxlY3RvckFsbCIsImlzSW9zIiwiaXNBbmRyb2lkIiwiaXNUb3VjaERldmljZSIsInN1cHBvcnRzRXZlbnQiLCJzdXBwb3J0c1NhbmRib3hlZElmcmFtZXMiLCJ0aHJvd3NNaXhlZENvbnRlbnRXYXJuaW5nV2hlbklmcmFtZVNyY0lzRW1wdHkiLCJkaXNwbGF5c0NhcmV0SW5FbXB0eUNvbnRlbnRFZGl0YWJsZUNvcnJlY3RseSIsImhhc0N1cnJlbnRTdHlsZVByb3BlcnR5IiwiaGFzSGlzdG9yeUlzc3VlIiwicGxhdGZvcm0iLCJzdWJzdHIiLCJpbnNlcnRzTGluZUJyZWFrc09uUmV0dXJuIiwic3VwcG9ydHNQbGFjZWhvbGRlckF0dHJpYnV0ZU9uIiwic2V0QXR0cmlidXRlIiwic3VwcG9ydHNFdmVudHNJbklmcmFtZUNvcnJlY3RseSIsInN1cHBvcnRzSFRNTDVUYWdzIiwic3VwcG9ydHNDb21tYW5kIiwiZm9ybWF0QmxvY2siLCJpbnNlcnRVbm9yZGVyZWRMaXN0IiwiaW5zZXJ0T3JkZXJlZExpc3QiLCJpbnNlcnRIVE1MIiwicXVlcnlDb21tYW5kRW5hYmxlZCIsImRvZXNBdXRvTGlua2luZ0luQ29udGVudEVkaXRhYmxlIiwiY2FuRGlzYWJsZUF1dG9MaW5raW5nIiwiY2xlYXJzQ29udGVudEVkaXRhYmxlQ29ycmVjdGx5Iiwic3VwcG9ydHNHZXRBdHRyaWJ1dGVDb3JyZWN0bHkiLCJnZXRBdHRyaWJ1dGUiLCJjYW5TZWxlY3RJbWFnZXNJbkNvbnRlbnRFZGl0YWJsZSIsImF1dG9TY3JvbGxzVG9DYXJldCIsImF1dG9DbG9zZXNVbmNsb3NlZFRhZ3MiLCJzdXBwb3J0c05hdGl2ZUdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwic3VwcG9ydHNTZWxlY3Rpb25Nb2RpZnkiLCJuZWVkc1NwYWNlQWZ0ZXJMaW5lQnJlYWsiLCJzdXBwb3J0c1NwZWVjaEFwaU9uIiwiY3Jhc2hlc1doZW5EZWZpbmVQcm9wZXJ0eSIsImRvZXNBc3luY0ZvY3VzIiwiaGFzUHJvYmxlbXNTZXR0aW5nQ2FyZXRBZnRlckltZyIsImhhc1VuZG9JbkNvbnRleHRNZW51IiwiaGFzSW5zZXJ0Tm9kZUlzc3VlIiwiaGFzSWZyYW1lRm9jdXNJc3N1ZSIsImNyZWF0ZXNOZXN0ZWRJbnZhbGlkTWFya3VwQWZ0ZXJQYXN0ZSIsInN1cHBvcnRzTXV0YXRpb25FdmVudHMiLCJzdXBwb3J0c01vZGVuUGFzdGUiLCJhcnJheSIsImNvbnRhaW5zIiwid2l0aG91dCIsIm1hcCIsInVuaXF1ZSIsIkRpc3BhdGNoZXIiLCJvbiIsImV2ZW50cyIsIm9mZiIsImZpcmUiLCJvYnNlcnZlIiwic3RvcE9ic2VydmluZyIsIm9iamVjdCIsIm1lcmdlIiwiY2xvbmUiLCJpc1BsYWluT2JqZWN0IiwiaXNGdW5jdGlvbiIsInN0cmluZyIsInRyaW0iLCJpbnRlcnBvbGF0ZSIsImJ5Iiwic3BsaXQiLCJlc2NhcGVIVE1MIiwiX3d5c2lodG1sNV90ZW1wRWxlbWVudCIsImF1dG9MaW5rIiwiVVJMX1JFR19FWFAiLCJhZGRDbGFzcyIsImNsYXNzTGlzdCIsImhhc0NsYXNzIiwicmVtb3ZlQ2xhc3MiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsImNvbnZlcnRUb0xpc3QiLCJnZXRTdHlsZSIsImZyb20iLCJpbnNlcnQiLCJhZnRlciIsInJlcGxhY2VDaGlsZCIsImNvcHlBdHRyaWJ1dGVzIiwidG8iLCJhbmRUbyIsImNhbGxlZSIsIm9mZnNldFdpZHRoIiwiY29weVN0eWxlcyIsInNldFN0eWxlcyIsImRlbGVnYXRlIiwidGFyZ2V0IiwiZG9tTm9kZSIsInByZXYiLCJub2RlVHlwZXMiLCJpZ25vcmVCbGFua1RleHRzIiwiZ2V0QXNEb20iLCJfd3lzaWh0bWw1X3N1cHBvcnRzSFRNTDVUYWdzIiwiZ2V0UGFyZW50RWxlbWVudCIsImNzc1N0eWxlIiwic3R5bGVSZWdFeHAiLCJjbGFzc1JlZ0V4cCIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwib3ZlcmZsb3ciLCJnZXRQcm9wZXJ0eVZhbHVlIiwiZ2V0VGV4dE5vZGVzIiwiaW5uZXJUZXh0IiwidGV4dENvbnRlbnQiLCJjb25jYXQiLCJoYXNFbGVtZW50V2l0aFRhZ05hbWUiLCJfd3lzaWh0bWw1X2lkZW50aWZpZXIiLCJoYXNFbGVtZW50V2l0aENsYXNzTmFtZSIsImJlZm9yZSIsImludG8iLCJpbnNlcnRDU1MiLCJzdHlsZVNoZWV0IiwiY3NzVGV4dCIsImxpbmVCcmVha3MiLCJzcmNFbGVtZW50IiwicHJldmVudERlZmF1bHQiLCJyZXR1cm5WYWx1ZSIsInN0b3BQcm9wYWdhdGlvbiIsImNhbmNlbEJ1YmJsZSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJkZXRhY2hFdmVudCIsInBhcnNlIiwicnVsZXMiLCJjb250ZXh0IiwiY2xlYXJJbnRlcm5hbHMiLCJzZWxlY3RvcnMiLCJjbGVhblVwIiwidW5lZGl0YWJsZUNsYXNzIiwidW5qb2luTmJzcHMiLCJub2RlVmFsdWUiLCJnZXRDb3JyZWN0SW5uZXJIVE1MIiwibm9ybWFsaXplIiwiYXR0cmlidXRlcyIsInRhZ3MiLCJzY29wZU5hbWUiLCJfd3lzaWh0bWw1Iiwib3V0ZXJIVE1MIiwidW53cmFwIiwicmVuYW1lX3RhZyIsIm9uZV9vZl90eXBlIiwicmVtb3ZlX2FjdGlvbiIsInJlbW92ZV9hY3Rpb25fcmVuYW1lX3RvIiwidHlwZV9kZWZpbml0aW9ucyIsIm1ldGhvZHMiLCJjbGFzc2VzIiwic3R5bGVzIiwiYXR0cnMiLCJzZWFyY2giLCJrZWVwX3N0eWxlcyIsInN0eWxlRmxvYXQiLCJjc3NGbG9hdCIsImdldEF0dHJpYnV0ZXMiLCJzZXRfY2xhc3MiLCJhZGRfY2xhc3MiLCJhZGRfc3R5bGUiLCJzZXRfYXR0cmlidXRlcyIsImNoZWNrX2F0dHJpYnV0ZXMiLCJuZXdTdHlsZSIsImNsYXNzZXNfYmxhY2tsaXN0IiwiX3Jhbmd5U2VsZWN0aW9uQm91bmRhcnkiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCIsImNvbW1lbnRzIiwiY3JlYXRlQ29tbWVudCIsInVybCIsImhyZWYiLCJhbHQiLCJudW1iZXJzIiwiYW55IiwiYWxpZ25fdGV4dCIsImxlZnQiLCJyaWdodCIsImNlbnRlciIsImFsaWduX2ltZyIsImp1c3RpZnkiLCJjbGVhcl9iciIsImJvdGgiLCJhbGwiLCJzaXplX2ZvbnQiLCJoYXNfdmlzaWJsZV9jb250ZXQiLCJvZmZzZXRIZWlnaHQiLCJyZW1vdmVFbXB0eVRleHROb2RlcyIsInJlbmFtZUVsZW1lbnQiLCJyZXBsYWNlV2l0aENoaWxkTm9kZXMiLCJmaXJzdEVsZW1lbnRDaGlsZCIsInJlc29sdmVMaXN0IiwiU2FuZGJveCIsImNhbGxiYWNrIiwiZWRpdGFibGVBcmVhIiwiX2NyZWF0ZUlmcmFtZSIsImluc2VydEludG8iLCJnZXRJZnJhbWUiLCJfcmVhZHlFcnJvciIsImRlc3Ryb3kiLCJzZXRBdHRyaWJ1dGVzIiwic2VjdXJpdHkiLCJhbGxvd3RyYW5zcGFyZW5jeSIsImZyYW1lYm9yZGVyIiwibWFyZ2lud2lkdGgiLCJtYXJnaW5oZWlnaHQiLCJvbmxvYWQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJfb25Mb2FkSWZyYW1lIiwicmVhZHlTdGF0ZSIsImNoYXJhY3RlclNldCIsImNoYXJzZXQiLCJfZ2V0SHRtbCIsInN0eWxlc2hlZXRzIiwib3BlbiIsIndyaXRlIiwiY2xvc2UiLCJvbmVycm9yIiwiX3Vuc2V0IiwibG9hZGVkIiwic2V0VGltZW91dCIsIl9fZGVmaW5lR2V0dGVyX18iLCJfX2RlZmluZVNldHRlcl9fIiwiQ29udGVudEVkaXRhYmxlQXJlYSIsImdldENvbnRlbnRFZGl0YWJsZSIsImVsZW1lbnQiLCJfYmluZEVsZW1lbnQiLCJfY3JlYXRlRWxlbWVudCIsIl9sb2FkRWxlbWVudCIsInNpbXVsYXRlUGxhY2Vob2xkZXIiLCJoYXNQbGFjZWhvbGRlclNldCIsImNsZWFyIiwiZm9jdXMiLCJwbGFjZWhvbGRlclNldCIsImlzRW1wdHkiLCJzZXRWYWx1ZSIsInNldFRleHRDb250ZW50IiwiZ2V0VGV4dENvbnRlbnQiLCJpc0xvYWRlZEltYWdlIiwic3BlY2lmaWVkIiwidmFsdWUiLCJjb21wbGV0ZSIsIm1vek1hdGNoZXNTZWxlY3RvciIsInVuc2hpZnQiLCJlbCIsImlzQ29sc3BhbiIsImlzUm93c3BhbiIsImZpcnN0Q29sIiwibGFzdENvbCIsImZpcnN0Um93IiwibGFzdFJvdyIsImlzUmVhbCIsInNwYW5Db2xsZWN0aW9uIiwibW9kaWZpZWQiLCJjZWxsIiwidGFibGUiLCJhZGRTcGFubmVkQ2VsbFRvTWFwIiwic2V0Q2VsbEFzTW9kaWZpZWQiLCJzZXRUYWJsZU1hcCIsImdldFRhYmxlUm93cyIsImdldFJvd0NlbGxzIiwiZ2V0TWFwSW5kZXgiLCJyb3ciLCJjb2wiLCJnZXRFbGVtZW50QXRJbmRleCIsImdldE1hcEVsc1RvIiwiaWR4X3N0YXJ0IiwiaWR4X2VuZCIsIm9yZGVyU2VsZWN0aW9uRW5kcyIsImNyZWF0ZUNlbGxzIiwiY29ycmVjdENvbEluZGV4Rm9yVW5yZWFscyIsImdldExhc3ROZXdDZWxsT25Sb3ciLCJyZW1vdmVFbXB0eVRhYmxlIiwic3BsaXRSb3dUb0NlbGxzIiwicmVtb3ZlQXR0cmlidXRlIiwiZ2V0UmVhbFJvd0VsIiwiaWR4IiwiaW5qZWN0Um93QXQiLCJjYW5NZXJnZSIsImRlY3JlYXNlQ2VsbFNwYW4iLCJyZW1vdmVTdXJwbHVzTGluZXMiLCJmaWxsTWlzc2luZ0NlbGxzIiwicGFyZW50IiwicmVjdGlmeSIsInVubWVyZ2UiLCJjb2xsYXBzZUNlbGxUb05leHRSb3ciLCJyZW1vdmVSb3dDZWxsIiwiZ2V0Um93RWxlbWVudHNCeUNlbGwiLCJnZXRDb2x1bW5FbGVtZW50c0J5Q2VsbCIsInJlbW92ZVJvdyIsInJlbW92ZUNvbENlbGwiLCJyZW1vdmVDb2x1bW4iLCJhZGRSb3ciLCJhZGRSb3dDZWxsIiwiY29sc3BhbiIsImF0dHIiLCJhZGRDb2x1bW4iLCJhZGRDb2xDZWxsIiwiaGFuZGxlQ2VsbEFkZFdpdGhSb3dzcGFuIiwiZ2V0Q2VsbHNCZXR3ZWVuIiwiYWRkQ2VsbHMiLCJyZW1vdmVDZWxscyIsIm1lcmdlQ2VsbHNCZXR3ZWVuIiwidW5tZXJnZUNlbGwiLCJmaW5kQ2VsbCIsImZpbmRSb3dCeUNlbGwiLCJmaW5kQ29sdW1uQnlDZWxsIiwicXVlcnkiLCJnZXRQYXN0ZWRIdG1sIiwiY2xpcGJvYXJkRGF0YSIsInR5cGVzIiwiZ2V0RGF0YSIsImdldFBhc3RlZEh0bWxXaXRoRGl2Iiwic2V0Qm9va21hcmsiLCJjbGVhblBhc3RlZEhUTUwiLCJjb25kaXRpb24iLCJjb2xvciIsInJlZmVyZW5jZU5vZGUiLCJmb250U2l6ZSIsImVuc3VyZVByb3BlckNsZWFyaW5nIiwicmVkcmF3IiwidGFibGVDZWxsc1NlbGVjdGlvbiIsImNlbGxzIiwiY29tcG9zZXIiLCJkZXNlbGVjdCIsInNlbGVjdGVkQ2VsbHMiLCJzdHlsZVBhcnNlciIsInBhcnNlQ29sb3IiLCJzaGlmdCIsInVucGFyc2VDb2xvciIsInBhcnNlRm9udFNpemUiLCJvZmZzZXRUb3AiLCJvZmZzZXRQYXJlbnQiLCJlZGl0b3IiLCJjb250YWluIiwidW5zZWxlY3RhYmxlQ2xhc3MiLCJnZXRSYW5nZSIsInNldFNlbGVjdGlvbiIsInNldEJlZm9yZSIsInNldEFmdGVyIiwiZ2V0U2VsZWN0ZWROb2RlIiwiZml4U2VsQm9yZGVycyIsImdldFNlbGVjdGVkT3duTm9kZXMiLCJnZXRPd25SYW5nZXMiLCJmaW5kTm9kZXNJblNlbGVjdGlvbiIsImNvbnRhaW5zVW5lZGl0YWJsZSIsImdldE93blVuZWRpdGFibGVzIiwiZ2V0UHJldmlvdXNOb2RlIiwiZ2V0U2VsZWN0aW9uUGFyZW50c0J5VGFnIiwiZ2V0UmFuZ2VUb05vZGVFbmQiLCJjYXJldElzTGFzdEluU2VsZWN0aW9uIiwiY2FyZXRJc0ZpcnN0SW5TZWxlY3Rpb24iLCJjYXJldElzSW5UaGVCZWdpbm5pZyIsImNhcmV0SXNCZWZvcmVVbmVkaXRhYmxlIiwiZXhlY3V0ZUFuZFJlc3RvcmVSYW5neSIsImV4ZWN1dGVBbmRSZXN0b3JlIiwic2Nyb2xsVG9wIiwic2Nyb2xsTGVmdCIsInN1cnJvdW5kIiwiZGVibG9ja0FuZFN1cnJvdW5kIiwic2Nyb2xsSW50b1ZpZXciLCJzY3JvbGxIZWlnaHQiLCJfd3lzaWh0bWw1U2Nyb2xsSW50b1ZpZXdFbGVtZW50Iiwic2VsZWN0TGluZSIsIl9zZWxlY3RMaW5lX1czQyIsIl9zZWxlY3RMaW5lX01TSUUiLCJtb2RpZnkiLCJib3VuZGluZ1RvcCIsInNjcm9sbFdpZHRoIiwibW92ZVRvUG9pbnQiLCJnZXRUZXh0IiwiZml4UmFuZ2VPdmVyZmxvdyIsIl9kZXRlY3RJbmxpbmVSYW5nZVByb2JsZW1zIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsIl9lbmRPZmZzZXRGb3JOb2RlIiwiZ2V0SHRtbCIsImlzRW5kVG9FbmRJbk5vZGUiLCJnZXROYW1lZEl0ZW0iLCJpc0VsZW1lbnRNZXJnZSIsImZpcnN0VGV4dE5vZGUiLCJ0ZXh0Tm9kZXMiLCJ0YWdOYW1lcyIsImNzc0NsYXNzIiwic2ltaWxhckNsYXNzUmVnRXhwIiwic2ltaWxhclN0eWxlUmVnRXhwIiwiYXBwbHlUb0FueVRhZ05hbWUiLCJjb250YWluZXIiLCJkb01lcmdlIiwiZ2V0TGVuZ3RoIiwiZ2V0QW5jZXN0b3JXaXRoQ2xhc3MiLCJnZXRBbmNlc3RvcldpdGhTdHlsZSIsImdldE1hdGNoaW5nQW5jZXN0b3IiLCJwb3N0QXBwbHkiLCJnZXRBZGphY2VudE1lcmdlYWJsZVRleHROb2RlIiwiYXJlRWxlbWVudHNNZXJnZWFibGUiLCJjcmVhdGVDb250YWluZXIiLCJhcHBseVRvVGV4dE5vZGUiLCJpc1JlbW92YWJsZSIsInVuZG9Ub1RleHROb2RlIiwiYXBwbHlUb1JhbmdlIiwidW5kb1RvUmFuZ2UiLCJnZXRUZXh0U2VsZWN0ZWRCeVJhbmdlIiwiaXNBcHBsaWVkVG9SYW5nZSIsImVsZW1lbnRzIiwiY292ZXJhZ2UiLCJ0b2dnbGVSYW5nZSIsIkhUTUxBcHBsaWVyIiwiQ29tbWFuZHMiLCJzdXBwb3J0Iiwic3RhdGUiLCJzdGF0ZVZhbHVlIiwiYm9sZCIsImZvcm1hdElubGluZSIsImV4ZWNXaXRoVG9nZ2xlIiwiY3JlYXRlTGluayIsInJlbW92ZUxpbmsiLCJmb250U2l6ZVN0eWxlIiwic2l6ZSIsImZvcmVDb2xvciIsImZvcmVDb2xvclN0eWxlIiwidmFsIiwiYmdDb2xvclN0eWxlIiwidXNlTGluZUJyZWFrcyIsImZvcm1hdENvZGUiLCJzdHJvbmciLCJlbSIsImluc2VydEJsb2NrUXVvdGUiLCJpbnNlcnRJbWFnZSIsImluc2VydExpbmVCcmVhayIsImluc2VydExpc3QiLCJvdGhlciIsImdldFRpbWUiLCJ1bmVkaXRhYmxlQ29udGFpbmVyQ2xhc3NuYW1lIiwiaXRhbGljIiwianVzdGlmeUNlbnRlciIsImp1c3RpZnlMZWZ0IiwianVzdGlmeVJpZ2h0IiwianVzdGlmeUZ1bGwiLCJhbGlnblJpZ2h0U3R5bGUiLCJhbGlnbkxlZnRTdHlsZSIsImFsaWduQ2VudGVyU3R5bGUiLCJyZWRvIiwidW5kb01hbmFnZXIiLCJ1bmRlcmxpbmUiLCJ1bmRvIiwiY3JlYXRlVGFibGUiLCJjb2xzIiwicm93cyIsInRhYmxlU3R5bGUiLCJtZXJnZVRhYmxlQ2VsbHMiLCJ0YWJsZVNlbGVjdGlvbiIsImFkZFRhYmxlQ2VsbHMiLCJkZWxldGVUYWJsZUNlbGxzIiwiaW5kZW50TGlzdCIsInRyeVRvUHVzaExpTGV2ZWwiLCJvdXRkZW50TGlzdCIsInRyeVRvUHVsbExpTGV2ZWwiLCJnZXRBZnRlckxpc3QiLCJVbmRvTWFuYWdlciIsInBvc2l0aW9uIiwiaGlzdG9yeVN0ciIsImhpc3RvcnlEb20iLCJ0cmFuc2FjdCIsIl9vYnNlcnZlIiwic2FuZGJveCIsImFsdEtleSIsImN0cmxLZXkiLCJtZXRhS2V5Iiwia2V5Q29kZSIsInNoaWZ0S2V5IiwiZ2V0VmFsdWUiLCJnZXRDaGlsZE5vZGVJbmRleCIsInVuZG9Qb3NzaWJsZSIsInJlZG9Qb3NzaWJsZSIsImhhc0F0dHJpYnV0ZSIsImdldENoaWxkTm9kZUJ5SW5kZXgiLCJWaWV3Iiwibm9UZXh0YXJlYSIsIl9vYnNlcnZlVmlld0NoYW5nZSIsImN1cnJlbnRWaWV3Iiwic2hvdyIsImhpZGUiLCJkaXNhYmxlIiwiZW5hYmxlIiwiQ29tcG9zZXIiLCJDQVJFVF9IQUNLIiwidGV4dGFyZWEiLCJjb250ZW50RWRpdGFibGVNb2RlIiwiX2luaXRDb250ZW50RWRpdGFibGVBcmVhIiwiX2luaXRTYW5kYm94IiwiX2Rpc3BsYXlTdHlsZSIsImRpc2FibGVkIiwiX2NyZWF0ZSIsIl9jcmVhdGVXeXNpd3lnRm9ybUZpZWxkIiwiZm9ybSIsImNvbXBvc2VyQ2xhc3NOYW1lIiwicGxhY2Vob2xkZXIiLCJfaW5pdEF1dG9MaW5raW5nIiwiX2luaXRPYmplY3RSZXNpemluZyIsIl9pbml0VW5kb01hbmFnZXIiLCJfaW5pdExpbmVCcmVha2luZyIsImluaXRTeW5jIiwic3luYyIsImlzR2Vja28iLCJzZXRBY3RpdmUiLCJ0b3AiLCJXZWJraXRVc2VyU2VsZWN0Iiwic2Nyb2xsVG8iLCJmb2N1c1N0eWxlc0hvc3QiLCJibHVyU3R5bGVzSG9zdCIsImRpc2FibGVkU3R5bGVzSG9zdCIsImJsdXIiLCJjbGVhckludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJoYW5kbGVUYWJsZXMiLCJ0YWJsZUNsaWNrSGFuZGxlIiwiY3JlYXRlIiwiY29weWVkRnJvbU1hcmtpbmciLCJzZXREYXRhIiwiaGFuZGxlVGFiS2V5IiwiSU1HIiwiU3luY2hyb25pemVyIiwiZnJvbUNvbXBvc2VyVG9UZXh0YXJlYSIsImZyb21UZXh0YXJlYVRvQ29tcG9zZXIiLCJUZXh0YXJlYSIsImZvY3VzaW4iLCJmb2N1c291dCIsInNob3dUb29sYmFyQWZ0ZXJJbml0IiwicGFyc2VyUnVsZXMiLCJiciIsInNwYW4iLCJkaXYiLCJwYXN0ZVBhcnNlclJ1bGVzZXRzIiwicGFyc2VyIiwiYm9keUNsYXNzTmFtZSIsInBsYWNlaG9sZGVyVGV4dCIsInN1cHBvcnRUb3VjaERldmljZXMiLCJFZGl0b3IiLCJlZGl0YWJsZUVsZW1lbnQiLCJfaXNDb21wYXRpYmxlIiwiX2luaXRQYXJzZXIiLCJoYW5kbGVCZWZvcmVMb2FkIiwic3luY2hyb25pemVyIiwiVG9vbGJhciIsImlzQ29tcGF0aWJsZSIsIl9jbGVhbkFuZFBhc3RlIiwiRGlhbG9nIiwibGluayIsIl9vYnNlcnZlZCIsIl9zZXJpYWxpemUiLCJlbGVtZW50VG9DaGFuZ2UiLCJpbnRlcnZhbCIsIl9pbnRlcnBvbGF0ZSIsImRlZmF1bHRWYWx1ZSIsIm1hcmdpbiIsIm9wYWNpdHkiLCJwYWRkaW5nIiwiekluZGV4IiwiY3Vyc29yIiwibWFyZ2luVG9wIiwib3V0bGluZSIsInNwZWVjaCIsIlNwZWVjaCIsIl9nZXRMaW5rcyIsImNsYXNzTmFtZUNvbW1hbmREaXNhYmxlZCIsImNsYXNzTmFtZUNvbW1hbmRzRGlzYWJsZWQiLCJjbGFzc05hbWVDb21tYW5kQWN0aXZlIiwiY2xhc3NOYW1lQWN0aW9uQWN0aXZlIiwiX2dldERpYWxvZyIsImdyb3VwIiwiZGlhbG9nIiwiY29tbWFuZCIsImRpYWxvZ0NvbnRhaW5lciIsImNvbW1hbmRMaW5rIiwiX2V4ZWNDb21tYW5kIiwiY29tbWFuZHNEaXNhYmxlZCIsImNvbW1hbmRNYXBwaW5nIiwiX3VwZGF0ZUxpbmtTdGF0ZXMiLCJleGVjQWN0aW9uIiwiY29tbWFuZExpbmtzIiwiYWN0aW9uTGlua3MiLCJ1bnNlbGVjdGFibGUiLCJib29rbWFyayIsImFjdGlvbk1hcHBpbmciLCJtdWx0aXNlbGVjdCIsIkRpYWxvZ19jcmVhdGVUYWJsZSIsIkRpYWxvZ19mb3JlQ29sb3JTdHlsZSIsIkRpYWxvZ19mb250U2l6ZVN0eWxlIiwiZXNjYXBlRXhwcmVzc2lvbiIsImZpcnN0TGluZSIsImZpcnN0Q29sdW1uIiwibGluZU51bWJlciIsImNvbHVtbiIsImhlbHBlcnMiLCJwYXJ0aWFscyIsInJlZ2lzdGVySGVscGVyIiwiaW52ZXJzZSIsImZuIiwiZWFjaCIsImluZGV4IiwiZmlyc3QiLCJsYXN0Iiwia2V5IiwiaGFzaCIsImluY2x1ZGVaZXJvIiwibGV2ZWwiLCJWRVJTSU9OIiwiQ09NUElMRVJfUkVWSVNJT04iLCJSRVZJU0lPTl9DSEFOR0VTIiwiSGFuZGxlYmFyc0Vudmlyb25tZW50IiwibG9nZ2VyIiwibm90IiwicmVnaXN0ZXJQYXJ0aWFsIiwibWV0aG9kTWFwIiwiREVCVUciLCJJTkZPIiwiV0FSTiIsIkVSUk9SIiwiY3JlYXRlRnJhbWUiLCJWTSIsImludm9rZVBhcnRpYWwiLCJjb21waWxlIiwicHJvZ3JhbXMiLCJwcm9ncmFtIiwicHJvZ3JhbVdpdGhEZXB0aCIsIm5vb3AiLCJjb21waWxlckluZm8iLCJwYXJ0aWFsIiwiY2hlY2tSZXZpc2lvbiIsImRlcHRoIiwiRnVuY3Rpb24iLCJ0ZW1wbGF0ZSIsIlNhZmVTdHJpbmciLCJFeGNlcHRpb24iLCJVdGlscyIsInRwbCIsImJsb2NrcXVvdGUiLCJvcHRpb25zIiwiZmEiLCJsb2NhbGUiLCJjb2xvdXJzIiwiYmxhY2siLCJzaWx2ZXIiLCJncmF5IiwibWFyb29uIiwicmVkIiwicHVycGxlIiwiZ3JlZW4iLCJvbGl2ZSIsIm5hdnkiLCJibHVlIiwib3JhbmdlIiwiZW1waGFzaXMiLCJzbWFsbCIsImZvbnRfc3R5bGVzIiwibm9ybWFsIiwiaDEiLCJoMiIsImgzIiwiaDQiLCJoNSIsImg2IiwiaHRtbCIsImVkaXQiLCJpbWFnZSIsInNtYWxsbW9kYWxzIiwiY2FuY2VsIiwibGlzdHMiLCJ1bm9yZGVyZWQiLCJvcmRlcmVkIiwib3V0ZGVudCIsImluZGVudCIsImpRdWVyeSIsImN1c3RvbVRlbXBsYXRlcyIsImNyZWF0ZVRvb2xiYXIiLCJjcmVhdGVFZGl0b3IiLCJpbml0aWFsaXplRWRpdG9yIiwic3luY0Jvb3RzdHJhcERpYWxvZ0V2ZW50cyIsImxvYWRQYXJzZXJSdWxlcyIsImFkZE1vcmVTaG9ydGN1dHMiLCJzaG9ydGN1dHMiLCJhamF4IiwiZGF0YVR5cGUiLCJlcnJvciIsInN1Y2Nlc3MiLCJmaWx0ZXIiLCJtb2RhbCIsImZpbmQiLCJjaGlsZHJlbiIsInRvZ2dsZUNsYXNzIiwiZW4iLCJhcHBlbmQiLCJjbGljayIsImRlbGVnYXRlVGFyZ2V0IiwicmVzZXREZWZhdWx0cyIsImRlZmF1bHRPcHRpb25zIiwiZGVmYXVsdE9wdGlvbnNDYWNoZSIsImJ5cGFzc0RlZmF1bHRzIiwic2hhbGxvd0V4dGVuZCIsImRlZXBFeHRlbmQiLCJDb25zdHJ1Y3RvciIsIm9sIiwidWwiLCJsaSIsImltZyIsInJlbCIsInByZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBLElBQUlBLFNBQUosRUFBY0MsSUFBZCxFQUFtQkMsVUFBbkIsQ0FBOEJDLE9BQU9DLGNBQVAsSUFBdUJELE9BQU9FLHdCQUE5QixJQUF3REYs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dXJjZXNDb250ZW50IjpbIi8qISBib290c3RyYXAzLXd5c2lodG1sNS1ib3dlciAyMDE0LTA5LTI2ICovXG52YXIgd3lzaWh0bWw1LEJhc2UsSGFuZGxlYmFycztPYmplY3QuZGVmaW5lUHJvcGVydHkmJk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3ImJk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5cGUsXCJ0ZXh0Q29udGVudFwiKSYmIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5cGUsXCJ0ZXh0Q29udGVudFwiKS5nZXQmJiFmdW5jdGlvbigpe3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5cGUsXCJpbm5lclRleHRcIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KEVsZW1lbnQucHJvdG90eXBlLFwidGV4dENvbnRlbnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuZ2V0LmNhbGwodGhpcyl9LHNldDpmdW5jdGlvbihiKXtyZXR1cm4gYS5zZXQuY2FsbCh0aGlzLGIpfX0pfSgpLEFycmF5LmlzQXJyYXl8fChBcnJheS5pc0FycmF5PWZ1bmN0aW9uKGEpe3JldHVyblwiW29iamVjdCBBcnJheV1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKX0pLHd5c2lodG1sNT17dmVyc2lvbjpcIjAuNC4xNVwiLGNvbW1hbmRzOnt9LGRvbTp7fSxxdWlya3M6e30sdG9vbGJhcjp7fSxsYW5nOnt9LHNlbGVjdGlvbjp7fSx2aWV3czp7fSxJTlZJU0lCTEVfU1BBQ0U6XCLvu79cIixFTVBUWV9GVU5DVElPTjpmdW5jdGlvbigpe30sRUxFTUVOVF9OT0RFOjEsVEVYVF9OT0RFOjMsQkFDS1NQQUNFX0tFWTo4LEVOVEVSX0tFWToxMyxFU0NBUEVfS0VZOjI3LFNQQUNFX0tFWTozMixERUxFVEVfS0VZOjQ2fSxmdW5jdGlvbihhLGIpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoYSk6Yi5yYW5neT1hKCl9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPXR5cGVvZiBhW2JdO3JldHVybiBjPT14fHwhKGMhPXd8fCFhW2JdKXx8XCJ1bmtub3duXCI9PWN9ZnVuY3Rpb24gYihhLGIpe3JldHVybiEodHlwZW9mIGFbYl0hPXd8fCFhW2JdKX1mdW5jdGlvbiBjKGEsYil7cmV0dXJuIHR5cGVvZiBhW2JdIT15fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBkPWMubGVuZ3RoO2QtLTspaWYoIWEoYixjW2RdKSlyZXR1cm4hMTtyZXR1cm4hMH19ZnVuY3Rpb24gZShhKXtyZXR1cm4gYSYmRChhLEMpJiZGKGEsQil9ZnVuY3Rpb24gZihhKXtyZXR1cm4gYihhLFwiYm9keVwiKT9hLmJvZHk6YS5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIilbMF19ZnVuY3Rpb24gZyhjKXtiKHdpbmRvdyxcImNvbnNvbGVcIikmJmEod2luZG93LmNvbnNvbGUsXCJsb2dcIikmJndpbmRvdy5jb25zb2xlLmxvZyhjKX1mdW5jdGlvbiBoKGEsYil7Yj93aW5kb3cuYWxlcnQoYSk6ZyhhKX1mdW5jdGlvbiBpKGEpe0guaW5pdGlhbGl6ZWQ9ITAsSC5zdXBwb3J0ZWQ9ITEsaChcIlJhbmd5IGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwYWdlIGluIHlvdXIgYnJvd3Nlci4gUmVhc29uOiBcIithLEguY29uZmlnLmFsZXJ0T25GYWlsKX1mdW5jdGlvbiBqKGEpe2goXCJSYW5neSB3YXJuaW5nOiBcIithLEguY29uZmlnLmFsZXJ0T25XYXJuKX1mdW5jdGlvbiBrKGEpe3JldHVybiBhLm1lc3NhZ2V8fGEuZGVzY3JpcHRpb258fGErXCJcIn1mdW5jdGlvbiBsKCl7dmFyIGIsYyxkLGgsaixsLG0sbyxwO2lmKCFILmluaXRpYWxpemVkKXtpZihjPSExLGQ9ITEsYShkb2N1bWVudCxcImNyZWF0ZVJhbmdlXCIpJiYoYj1kb2N1bWVudC5jcmVhdGVSYW5nZSgpLEQoYixBKSYmRihiLHopJiYoYz0hMCkpLGg9Zihkb2N1bWVudCksIWh8fFwiYm9keVwiIT1oLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGkoXCJObyBib2R5IGVsZW1lbnQgZm91bmRcIiksdm9pZCAwO2lmKGgmJmEoaCxcImNyZWF0ZVRleHRSYW5nZVwiKSYmKGI9aC5jcmVhdGVUZXh0UmFuZ2UoKSxlKGIpJiYoZD0hMCkpLCFjJiYhZClyZXR1cm4gaShcIk5laXRoZXIgUmFuZ2Ugbm9yIFRleHRSYW5nZSBhcmUgYXZhaWxhYmxlXCIpLHZvaWQgMDtILmluaXRpYWxpemVkPSEwLEguZmVhdHVyZXM9e2ltcGxlbWVudHNEb21SYW5nZTpjLGltcGxlbWVudHNUZXh0UmFuZ2U6ZH07Zm9yKG0gaW4gRykoaj1HW21dKWluc3RhbmNlb2YgbiYmai5pbml0KGosSCk7Zm9yKG89MCxwPXMubGVuZ3RoO3A+bzsrK28pdHJ5e3Nbb10oSCl9Y2F0Y2gocSl7bD1cIlJhbmd5IGluaXQgbGlzdGVuZXIgdGhyZXcgYW4gZXhjZXB0aW9uLiBDb250aW51aW5nLiBEZXRhaWw6IFwiK2socSksZyhsKX19fWZ1bmN0aW9uIG0oYSl7YT1hfHx3aW5kb3csbCgpO2Zvcih2YXIgYj0wLGM9dC5sZW5ndGg7Yz5iOysrYil0W2JdKGEpfWZ1bmN0aW9uIG4oYSxiLGMpe3RoaXMubmFtZT1hLHRoaXMuZGVwZW5kZW5jaWVzPWIsdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLnN1cHBvcnRlZD0hMSx0aGlzLmluaXRpYWxpemVyPWN9ZnVuY3Rpb24gbyhhLGIsYyxkKXt2YXIgZT1uZXcgbihiLGMsZnVuY3Rpb24oYSl7aWYoIWEuaW5pdGlhbGl6ZWQpe2EuaW5pdGlhbGl6ZWQ9ITA7dHJ5e2QoSCxhKSxhLnN1cHBvcnRlZD0hMH1jYXRjaChjKXt2YXIgZT1cIk1vZHVsZSAnXCIrYitcIicgZmFpbGVkIHRvIGxvYWQ6IFwiK2soYyk7ZyhlKX19fSk7R1tiXT1lfWZ1bmN0aW9uIHAoKXt9ZnVuY3Rpb24gcSgpe312YXIgcixzLHQsdSx2LHc9XCJvYmplY3RcIix4PVwiZnVuY3Rpb25cIix5PVwidW5kZWZpbmVkXCIsej1bXCJzdGFydENvbnRhaW5lclwiLFwic3RhcnRPZmZzZXRcIixcImVuZENvbnRhaW5lclwiLFwiZW5kT2Zmc2V0XCIsXCJjb2xsYXBzZWRcIixcImNvbW1vbkFuY2VzdG9yQ29udGFpbmVyXCJdLEE9W1wic2V0U3RhcnRcIixcInNldFN0YXJ0QmVmb3JlXCIsXCJzZXRTdGFydEFmdGVyXCIsXCJzZXRFbmRcIixcInNldEVuZEJlZm9yZVwiLFwic2V0RW5kQWZ0ZXJcIixcImNvbGxhcHNlXCIsXCJzZWxlY3ROb2RlXCIsXCJzZWxlY3ROb2RlQ29udGVudHNcIixcImNvbXBhcmVCb3VuZGFyeVBvaW50c1wiLFwiZGVsZXRlQ29udGVudHNcIixcImV4dHJhY3RDb250ZW50c1wiLFwiY2xvbmVDb250ZW50c1wiLFwiaW5zZXJ0Tm9kZVwiLFwic3Vycm91bmRDb250ZW50c1wiLFwiY2xvbmVSYW5nZVwiLFwidG9TdHJpbmdcIixcImRldGFjaFwiXSxCPVtcImJvdW5kaW5nSGVpZ2h0XCIsXCJib3VuZGluZ0xlZnRcIixcImJvdW5kaW5nVG9wXCIsXCJib3VuZGluZ1dpZHRoXCIsXCJodG1sVGV4dFwiLFwidGV4dFwiXSxDPVtcImNvbGxhcHNlXCIsXCJjb21wYXJlRW5kUG9pbnRzXCIsXCJkdXBsaWNhdGVcIixcIm1vdmVUb0VsZW1lbnRUZXh0XCIsXCJwYXJlbnRFbGVtZW50XCIsXCJzZWxlY3RcIixcInNldEVuZFBvaW50XCIsXCJnZXRCb3VuZGluZ0NsaWVudFJlY3RcIl0sRD1kKGEpLEU9ZChiKSxGPWQoYyksRz17fSxIPXt2ZXJzaW9uOlwiMS4zYWxwaGEuMjAxNDA4MDRcIixpbml0aWFsaXplZDohMSxzdXBwb3J0ZWQ6ITAsdXRpbDp7aXNIb3N0TWV0aG9kOmEsaXNIb3N0T2JqZWN0OmIsaXNIb3N0UHJvcGVydHk6YyxhcmVIb3N0TWV0aG9kczpELGFyZUhvc3RPYmplY3RzOkUsYXJlSG9zdFByb3BlcnRpZXM6Rixpc1RleHRSYW5nZTplLGdldEJvZHk6Zn0sZmVhdHVyZXM6e30sbW9kdWxlczpHLGNvbmZpZzp7YWxlcnRPbkZhaWw6ITAsYWxlcnRPbldhcm46ITEscHJlZmVyVGV4dFJhbmdlOiExLGF1dG9Jbml0aWFsaXplOnR5cGVvZiByYW5neUF1dG9Jbml0aWFsaXplPT15PyEwOnJhbmd5QXV0b0luaXRpYWxpemV9fTtyZXR1cm4gSC5mYWlsPWksSC53YXJuPWose30uaGFzT3duUHJvcGVydHk/SC51dGlsLmV4dGVuZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmO2ZvcihmIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShmKSYmKGQ9YVtmXSxlPWJbZl0sYyYmbnVsbCE9PWQmJlwib2JqZWN0XCI9PXR5cGVvZiBkJiZudWxsIT09ZSYmXCJvYmplY3RcIj09dHlwZW9mIGUmJkgudXRpbC5leHRlbmQoZCxlLCEwKSxhW2ZdPWUpO3JldHVybiBiLmhhc093blByb3BlcnR5KFwidG9TdHJpbmdcIikmJihhLnRvU3RyaW5nPWIudG9TdHJpbmcpLGF9OmkoXCJoYXNPd25Qcm9wZXJ0eSBub3Qgc3VwcG9ydGVkXCIpLGZ1bmN0aW9uKCl7dmFyIGEsYixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Yy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSksYT1bXS5zbGljZTt0cnl7MT09YS5jYWxsKGMuY2hpbGROb2RlcywwKVswXS5ub2RlVHlwZSYmKGI9ZnVuY3Rpb24oYil7cmV0dXJuIGEuY2FsbChiLDApfSl9Y2F0Y2goZCl7fWJ8fChiPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1bXTtmb3IoYj0wLGM9YS5sZW5ndGg7Yz5iOysrYilkW2JdPWFbYl07cmV0dXJuIGR9KSxILnV0aWwudG9BcnJheT1ifSgpLGEoZG9jdW1lbnQsXCJhZGRFdmVudExpc3RlbmVyXCIpP3I9ZnVuY3Rpb24oYSxiLGMpe2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITEpfTphKGRvY3VtZW50LFwiYXR0YWNoRXZlbnRcIik/cj1mdW5jdGlvbihhLGIsYyl7YS5hdHRhY2hFdmVudChcIm9uXCIrYixjKX06aShcIkRvY3VtZW50IGRvZXMgbm90IGhhdmUgcmVxdWlyZWQgYWRkRXZlbnRMaXN0ZW5lciBvciBhdHRhY2hFdmVudCBtZXRob2RcIiksSC51dGlsLmFkZExpc3RlbmVyPXIscz1bXSxILmluaXQ9bCxILmFkZEluaXRMaXN0ZW5lcj1mdW5jdGlvbihhKXtILmluaXRpYWxpemVkP2EoSCk6cy5wdXNoKGEpfSx0PVtdLEguYWRkU2hpbUxpc3RlbmVyPWZ1bmN0aW9uKGEpe3QucHVzaChhKX0sSC5zaGltPUguY3JlYXRlTWlzc2luZ05hdGl2ZUFwaT1tLG4ucHJvdG90eXBlPXtpbml0OmZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZT10aGlzLmRlcGVuZGVuY2llc3x8W107Zm9yKGE9MCxiPWUubGVuZ3RoO2I+YTsrK2Epe2lmKGQ9ZVthXSxjPUdbZF0sIShjJiZjIGluc3RhbmNlb2YgbikpdGhyb3cgRXJyb3IoXCJyZXF1aXJlZCBtb2R1bGUgJ1wiK2QrXCInIG5vdCBmb3VuZFwiKTtpZihjLmluaXQoKSwhYy5zdXBwb3J0ZWQpdGhyb3cgRXJyb3IoXCJyZXF1aXJlZCBtb2R1bGUgJ1wiK2QrXCInIG5vdCBzdXBwb3J0ZWRcIil9dGhpcy5pbml0aWFsaXplcih0aGlzKX0sZmFpbDpmdW5jdGlvbihhKXt0aHJvdyB0aGlzLmluaXRpYWxpemVkPSEwLHRoaXMuc3VwcG9ydGVkPSExLEVycm9yKFwiTW9kdWxlICdcIit0aGlzLm5hbWUrXCInIGZhaWxlZCB0byBsb2FkOiBcIithKX0sd2FybjpmdW5jdGlvbihhKXtILndhcm4oXCJNb2R1bGUgXCIrdGhpcy5uYW1lK1wiOiBcIithKX0sZGVwcmVjYXRpb25Ob3RpY2U6ZnVuY3Rpb24oYSxiKXtILndhcm4oXCJERVBSRUNBVEVEOiBcIithK1wiIGluIG1vZHVsZSBcIit0aGlzLm5hbWUrXCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIFwiK2IrXCIgaW5zdGVhZFwiKX0sY3JlYXRlRXJyb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIEVycm9yKFwiRXJyb3IgaW4gUmFuZ3kgXCIrdGhpcy5uYW1lK1wiIG1vZHVsZTogXCIrYSl9fSxILmNyZWF0ZU1vZHVsZT1mdW5jdGlvbihhKXt2YXIgYixjLGQ7Mj09YXJndW1lbnRzLmxlbmd0aD8oYj1hcmd1bWVudHNbMV0sYz1bXSk6KGI9YXJndW1lbnRzWzJdLGM9YXJndW1lbnRzWzFdKSxkPW8oITEsYSxjLGIpLEguaW5pdGlhbGl6ZWQmJmQuaW5pdCgpfSxILmNyZWF0ZUNvcmVNb2R1bGU9ZnVuY3Rpb24oYSxiLGMpe28oITAsYSxiLGMpfSxILlJhbmdlUHJvdG90eXBlPXAsSC5yYW5nZVByb3RvdHlwZT1uZXcgcCxILnNlbGVjdGlvblByb3RvdHlwZT1uZXcgcSx1PSExLHY9ZnVuY3Rpb24oKXt1fHwodT0hMCwhSC5pbml0aWFsaXplZCYmSC5jb25maWcuYXV0b0luaXRpYWxpemUmJmwoKSl9LHR5cGVvZiB3aW5kb3c9PXk/KGkoXCJObyB3aW5kb3cgZm91bmRcIiksdm9pZCAwKTp0eXBlb2YgZG9jdW1lbnQ9PXk/KGkoXCJObyBkb2N1bWVudCBmb3VuZFwiKSx2b2lkIDApOihhKGRvY3VtZW50LFwiYWRkRXZlbnRMaXN0ZW5lclwiKSYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIix2LCExKSxyKHdpbmRvdyxcImxvYWRcIix2KSxILmNyZWF0ZUNvcmVNb2R1bGUoXCJEb21VdGlsXCIsW10sZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3ZhciBiO3JldHVybiB0eXBlb2YgYS5uYW1lc3BhY2VVUkk9PUl8fG51bGw9PT0oYj1hLm5hbWVzcGFjZVVSSSl8fFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPT1ifWZ1bmN0aW9uIGQoYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiAxPT1iLm5vZGVUeXBlP2I6bnVsbH1mdW5jdGlvbiBlKGEpe2Zvcih2YXIgYj0wO2E9YS5wcmV2aW91c1NpYmxpbmc7KSsrYjtyZXR1cm4gYn1mdW5jdGlvbiBmKGEpe3N3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDc6Y2FzZSAxMDpyZXR1cm4gMDtjYXNlIDM6Y2FzZSA4OnJldHVybiBhLmxlbmd0aDtkZWZhdWx0OnJldHVybiBhLmNoaWxkTm9kZXMubGVuZ3RofX1mdW5jdGlvbiBnKGEsYil7dmFyIGMsZD1bXTtmb3IoYz1hO2M7Yz1jLnBhcmVudE5vZGUpZC5wdXNoKGMpO2ZvcihjPWI7YztjPWMucGFyZW50Tm9kZSlpZihGKGQsYykpcmV0dXJuIGM7cmV0dXJuIG51bGx9ZnVuY3Rpb24gaChhLGIsYyl7Zm9yKHZhciBkPWM/YjpiLnBhcmVudE5vZGU7ZDspe2lmKGQ9PT1hKXJldHVybiEwO2Q9ZC5wYXJlbnROb2RlfXJldHVybiExfWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gaChhLGIsITApfWZ1bmN0aW9uIGooYSxiLGMpe2Zvcih2YXIgZCxlPWM/YTphLnBhcmVudE5vZGU7ZTspe2lmKGQ9ZS5wYXJlbnROb2RlLGQ9PT1iKXJldHVybiBlO2U9ZH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBrKGEpe3ZhciBiPWEubm9kZVR5cGU7cmV0dXJuIDM9PWJ8fDQ9PWJ8fDg9PWJ9ZnVuY3Rpb24gbChhKXtpZighYSlyZXR1cm4hMTt2YXIgYj1hLm5vZGVUeXBlO3JldHVybiAzPT1ifHw4PT1ifWZ1bmN0aW9uIG0oYSxiKXt2YXIgYz1iLm5leHRTaWJsaW5nLGQ9Yi5wYXJlbnROb2RlO3JldHVybiBjP2QuaW5zZXJ0QmVmb3JlKGEsYyk6ZC5hcHBlbmRDaGlsZChhKSxhfWZ1bmN0aW9uIG4oYSxiLGMpe3ZhciBkLGYsZz1hLmNsb25lTm9kZSghMSk7aWYoZy5kZWxldGVEYXRhKDAsYiksYS5kZWxldGVEYXRhKGIsYS5sZW5ndGgtYiksbShnLGEpLGMpZm9yKGQ9MDtmPWNbZCsrXTspZi5ub2RlPT1hJiZmLm9mZnNldD5iPyhmLm5vZGU9ZyxmLm9mZnNldC09Yik6Zi5ub2RlPT1hLnBhcmVudE5vZGUmJmYub2Zmc2V0PmUoYSkmJisrZi5vZmZzZXQ7cmV0dXJuIGd9ZnVuY3Rpb24gbyhhKXtpZig5PT1hLm5vZGVUeXBlKXJldHVybiBhO2lmKHR5cGVvZiBhLm93bmVyRG9jdW1lbnQhPUkpcmV0dXJuIGEub3duZXJEb2N1bWVudDtpZih0eXBlb2YgYS5kb2N1bWVudCE9SSlyZXR1cm4gYS5kb2N1bWVudDtpZihhLnBhcmVudE5vZGUpcmV0dXJuIG8oYS5wYXJlbnROb2RlKTt0aHJvdyBiLmNyZWF0ZUVycm9yKFwiZ2V0RG9jdW1lbnQ6IG5vIGRvY3VtZW50IGZvdW5kIGZvciBub2RlXCIpfWZ1bmN0aW9uIHAoYSl7dmFyIGM9byhhKTtpZih0eXBlb2YgYy5kZWZhdWx0VmlldyE9SSlyZXR1cm4gYy5kZWZhdWx0VmlldztpZih0eXBlb2YgYy5wYXJlbnRXaW5kb3chPUkpcmV0dXJuIGMucGFyZW50V2luZG93O3Rocm93IGIuY3JlYXRlRXJyb3IoXCJDYW5ub3QgZ2V0IGEgd2luZG93IG9iamVjdCBmb3Igbm9kZVwiKX1mdW5jdGlvbiBxKGEpe2lmKHR5cGVvZiBhLmNvbnRlbnREb2N1bWVudCE9SSlyZXR1cm4gYS5jb250ZW50RG9jdW1lbnQ7aWYodHlwZW9mIGEuY29udGVudFdpbmRvdyE9SSlyZXR1cm4gYS5jb250ZW50V2luZG93LmRvY3VtZW50O3Rocm93IGIuY3JlYXRlRXJyb3IoXCJnZXRJZnJhbWVEb2N1bWVudDogTm8gRG9jdW1lbnQgb2JqZWN0IGZvdW5kIGZvciBpZnJhbWUgZWxlbWVudFwiKX1mdW5jdGlvbiByKGEpe2lmKHR5cGVvZiBhLmNvbnRlbnRXaW5kb3chPUkpcmV0dXJuIGEuY29udGVudFdpbmRvdztpZih0eXBlb2YgYS5jb250ZW50RG9jdW1lbnQhPUkpcmV0dXJuIGEuY29udGVudERvY3VtZW50LmRlZmF1bHRWaWV3O3Rocm93IGIuY3JlYXRlRXJyb3IoXCJnZXRJZnJhbWVXaW5kb3c6IE5vIFdpbmRvdyBvYmplY3QgZm91bmQgZm9yIGlmcmFtZSBlbGVtZW50XCIpfWZ1bmN0aW9uIHMoYSl7cmV0dXJuIGEmJkouaXNIb3N0TWV0aG9kKGEsXCJzZXRUaW1lb3V0XCIpJiZKLmlzSG9zdE9iamVjdChhLFwiZG9jdW1lbnRcIil9ZnVuY3Rpb24gdChhLGIsYyl7dmFyIGQ7aWYoYT9KLmlzSG9zdFByb3BlcnR5KGEsXCJub2RlVHlwZVwiKT9kPTE9PWEubm9kZVR5cGUmJlwiaWZyYW1lXCI9PWEudGFnTmFtZS50b0xvd2VyQ2FzZSgpP3EoYSk6byhhKTpzKGEpJiYoZD1hLmRvY3VtZW50KTpkPWRvY3VtZW50LCFkKXRocm93IGIuY3JlYXRlRXJyb3IoYytcIigpOiBQYXJhbWV0ZXIgbXVzdCBiZSBhIFdpbmRvdyBvYmplY3Qgb3IgRE9NIG5vZGVcIik7cmV0dXJuIGR9ZnVuY3Rpb24gdShhKXtmb3IodmFyIGI7Yj1hLnBhcmVudE5vZGU7KWE9YjtyZXR1cm4gYX1mdW5jdGlvbiB2KGEsYyxkLGYpe3ZhciBoLGksayxsLG07aWYoYT09ZClyZXR1cm4gYz09PWY/MDpmPmM/LTE6MTtpZihoPWooZCxhLCEwKSlyZXR1cm4gYzw9ZShoKT8tMToxO2lmKGg9aihhLGQsITApKXJldHVybiBlKGgpPGY/LTE6MTtpZihpPWcoYSxkKSwhaSl0aHJvdyBFcnJvcihcImNvbXBhcmVQb2ludHMgZXJyb3I6IG5vZGVzIGhhdmUgbm8gY29tbW9uIGFuY2VzdG9yXCIpO2lmKGs9YT09PWk/aTpqKGEsaSwhMCksbD1kPT09aT9pOmooZCxpLCEwKSxrPT09bCl0aHJvdyBiLmNyZWF0ZUVycm9yKFwiY29tcGFyZVBvaW50cyBnb3QgdG8gY2FzZSA0IGFuZCBjaGlsZEEgYW5kIGNoaWxkQiBhcmUgdGhlIHNhbWUhXCIpO2ZvcihtPWkuZmlyc3RDaGlsZDttOyl7aWYobT09PWspcmV0dXJuLTE7aWYobT09PWwpcmV0dXJuIDE7bT1tLm5leHRTaWJsaW5nfX1mdW5jdGlvbiB3KGEpe3ZhciBiO3RyeXtyZXR1cm4gYj1hLnBhcmVudE5vZGUsITF9Y2F0Y2goYyl7cmV0dXJuITB9fWZ1bmN0aW9uIHgoYSl7aWYoIWEpcmV0dXJuXCJbTm8gbm9kZV1cIjtpZihHJiZ3KGEpKXJldHVyblwiW0Jyb2tlbiBub2RlXVwiO2lmKGsoYSkpcmV0dXJuJ1wiJythLmRhdGErJ1wiJztpZigxPT1hLm5vZGVUeXBlKXt2YXIgYj1hLmlkPycgaWQ9XCInK2EuaWQrJ1wiJzpcIlwiO3JldHVyblwiPFwiK2Eubm9kZU5hbWUrYitcIj5baW5kZXg6XCIrZShhKStcIixsZW5ndGg6XCIrYS5jaGlsZE5vZGVzLmxlbmd0aCtcIl1bXCIrKGEuaW5uZXJIVE1MfHxcIltpbm5lckhUTUwgbm90IHN1cHBvcnRlZF1cIikuc2xpY2UoMCwyNSkrXCJdXCJ9cmV0dXJuIGEubm9kZU5hbWV9ZnVuY3Rpb24geShhKXtmb3IodmFyIGIsYz1vKGEpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtiPWEuZmlyc3RDaGlsZDspYy5hcHBlbmRDaGlsZChiKTtyZXR1cm4gY31mdW5jdGlvbiB6KGEpe3RoaXMucm9vdD1hLHRoaXMuX25leHQ9YX1mdW5jdGlvbiBBKGEpe3JldHVybiBuZXcgeihhKX1mdW5jdGlvbiBCKGEsYil7dGhpcy5ub2RlPWEsdGhpcy5vZmZzZXQ9Yn1mdW5jdGlvbiBDKGEpe3RoaXMuY29kZT10aGlzW2FdLHRoaXMuY29kZU5hbWU9YSx0aGlzLm1lc3NhZ2U9XCJET01FeGNlcHRpb246IFwiK3RoaXMuY29kZU5hbWV9dmFyIEQsRSxGLEcsSCxJPVwidW5kZWZpbmVkXCIsSj1hLnV0aWw7Si5hcmVIb3N0TWV0aG9kcyhkb2N1bWVudCxbXCJjcmVhdGVEb2N1bWVudEZyYWdtZW50XCIsXCJjcmVhdGVFbGVtZW50XCIsXCJjcmVhdGVUZXh0Tm9kZVwiXSl8fGIuZmFpbChcImRvY3VtZW50IG1pc3NpbmcgYSBOb2RlIGNyZWF0aW9uIG1ldGhvZFwiKSxKLmlzSG9zdE1ldGhvZChkb2N1bWVudCxcImdldEVsZW1lbnRzQnlUYWdOYW1lXCIpfHxiLmZhaWwoXCJkb2N1bWVudCBtaXNzaW5nIGdldEVsZW1lbnRzQnlUYWdOYW1lIG1ldGhvZFwiKSxEPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksSi5hcmVIb3N0TWV0aG9kcyhELFtcImluc2VydEJlZm9yZVwiLFwiYXBwZW5kQ2hpbGRcIixcImNsb25lTm9kZVwiXXx8IUouYXJlSG9zdE9iamVjdHMoRCxbXCJwcmV2aW91c1NpYmxpbmdcIixcIm5leHRTaWJsaW5nXCIsXCJjaGlsZE5vZGVzXCIsXCJwYXJlbnROb2RlXCJdKSl8fGIuZmFpbChcIkluY29tcGxldGUgRWxlbWVudCBpbXBsZW1lbnRhdGlvblwiKSxKLmlzSG9zdFByb3BlcnR5KEQsXCJpbm5lckhUTUxcIil8fGIuZmFpbChcIkVsZW1lbnQgaXMgbWlzc2luZyBpbm5lckhUTUwgcHJvcGVydHlcIiksRT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcInRlc3RcIiksSi5hcmVIb3N0TWV0aG9kcyhFLFtcInNwbGl0VGV4dFwiLFwiZGVsZXRlRGF0YVwiLFwiaW5zZXJ0RGF0YVwiLFwiYXBwZW5kRGF0YVwiLFwiY2xvbmVOb2RlXCJdfHwhSi5hcmVIb3N0T2JqZWN0cyhELFtcInByZXZpb3VzU2libGluZ1wiLFwibmV4dFNpYmxpbmdcIixcImNoaWxkTm9kZXNcIixcInBhcmVudE5vZGVcIl0pfHwhSi5hcmVIb3N0UHJvcGVydGllcyhFLFtcImRhdGFcIl0pKXx8Yi5mYWlsKFwiSW5jb21wbGV0ZSBUZXh0IE5vZGUgaW1wbGVtZW50YXRpb25cIiksRj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hLmxlbmd0aDtjLS07KWlmKGFbY109PT1iKXJldHVybiEwO3JldHVybiExfSxHPSExLGZ1bmN0aW9uKCl7dmFyIGIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYlwiKTtjLmlubmVySFRNTD1cIjFcIixiPWMuZmlyc3RDaGlsZCxjLmlubmVySFRNTD1cIjxicj5cIixHPXcoYiksYS5mZWF0dXJlcy5jcmFzaHlUZXh0Tm9kZXM9R30oKSx0eXBlb2Ygd2luZG93LmdldENvbXB1dGVkU3R5bGUhPUk/SD1mdW5jdGlvbihhLGIpe3JldHVybiBwKGEpLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKVtiXX06dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUhPUk/SD1mdW5jdGlvbihhLGIpe3JldHVybiBhLmN1cnJlbnRTdHlsZVtiXX06Yi5mYWlsKFwiTm8gbWVhbnMgb2Ygb2J0YWluaW5nIGNvbXB1dGVkIHN0eWxlIHByb3BlcnRpZXMgZm91bmRcIiksei5wcm90b3R5cGU9e19jdXJyZW50Om51bGwsaGFzTmV4dDpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fbmV4dH0sbmV4dDpmdW5jdGlvbigpe3ZhciBhLGIsYz10aGlzLl9jdXJyZW50PXRoaXMuX25leHQ7aWYodGhpcy5fY3VycmVudClpZihhPWMuZmlyc3RDaGlsZCxhKXRoaXMuX25leHQ9YTtlbHNle2ZvcihiPW51bGw7YyE9PXRoaXMucm9vdCYmIShiPWMubmV4dFNpYmxpbmcpOyljPWMucGFyZW50Tm9kZTt0aGlzLl9uZXh0PWJ9cmV0dXJuIHRoaXMuX2N1cnJlbnR9LGRldGFjaDpmdW5jdGlvbigpe3RoaXMuX2N1cnJlbnQ9dGhpcy5fbmV4dD10aGlzLnJvb3Q9bnVsbH19LEIucHJvdG90eXBlPXtlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuISFhJiZ0aGlzLm5vZGU9PT1hLm5vZGUmJnRoaXMub2Zmc2V0PT1hLm9mZnNldH0saW5zcGVjdDpmdW5jdGlvbigpe3JldHVyblwiW0RvbVBvc2l0aW9uKFwiK3godGhpcy5ub2RlKStcIjpcIit0aGlzLm9mZnNldCtcIildXCJ9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zcGVjdCgpfX0sQy5wcm90b3R5cGU9e0lOREVYX1NJWkVfRVJSOjEsSElFUkFSQ0hZX1JFUVVFU1RfRVJSOjMsV1JPTkdfRE9DVU1FTlRfRVJSOjQsTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOjcsTk9UX0ZPVU5EX0VSUjo4LE5PVF9TVVBQT1JURURfRVJSOjksSU5WQUxJRF9TVEFURV9FUlI6MTEsSU5WQUxJRF9OT0RFX1RZUEVfRVJSOjI0fSxDLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1lc3NhZ2V9LGEuZG9tPXthcnJheUNvbnRhaW5zOkYsaXNIdG1sTmFtZXNwYWNlOmMscGFyZW50RWxlbWVudDpkLGdldE5vZGVJbmRleDplLGdldE5vZGVMZW5ndGg6ZixnZXRDb21tb25BbmNlc3RvcjpnLGlzQW5jZXN0b3JPZjpoLGlzT3JJc0FuY2VzdG9yT2Y6aSxnZXRDbG9zZXN0QW5jZXN0b3JJbjpqLGlzQ2hhcmFjdGVyRGF0YU5vZGU6ayxpc1RleHRPckNvbW1lbnROb2RlOmwsaW5zZXJ0QWZ0ZXI6bSxzcGxpdERhdGFOb2RlOm4sZ2V0RG9jdW1lbnQ6byxnZXRXaW5kb3c6cCxnZXRJZnJhbWVXaW5kb3c6cixnZXRJZnJhbWVEb2N1bWVudDpxLGdldEJvZHk6Si5nZXRCb2R5LGlzV2luZG93OnMsZ2V0Q29udGVudERvY3VtZW50OnQsZ2V0Um9vdENvbnRhaW5lcjp1LGNvbXBhcmVQb2ludHM6dixpc0Jyb2tlbk5vZGU6dyxpbnNwZWN0Tm9kZTp4LGdldENvbXB1dGVkU3R5bGVQcm9wZXJ0eTpILGZyYWdtZW50RnJvbU5vZGVDaGlsZHJlbjp5LGNyZWF0ZUl0ZXJhdG9yOkEsRG9tUG9zaXRpb246Qn0sYS5ET01FeGNlcHRpb249Q30pLEguY3JlYXRlQ29yZU1vZHVsZShcIkRvbVJhbmdlXCIsW1wiRG9tVXRpbFwiXSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7cmV0dXJuIDMhPWEubm9kZVR5cGUmJihnYihhLGIuc3RhcnRDb250YWluZXIpfHxnYihhLGIuZW5kQ29udGFpbmVyKSl9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gYS5kb2N1bWVudHx8aGIoYS5zdGFydENvbnRhaW5lcil9ZnVuY3Rpb24gZChhKXtyZXR1cm4gbmV3IGNiKGEucGFyZW50Tm9kZSxmYihhKSl9ZnVuY3Rpb24gZShhKXtyZXR1cm4gbmV3IGNiKGEucGFyZW50Tm9kZSxmYihhKSsxKX1mdW5jdGlvbiBmKGEsYixjKXt2YXIgZD0xMT09YS5ub2RlVHlwZT9hLmZpcnN0Q2hpbGQ6YTtyZXR1cm4gZWIoYik/Yz09Yi5sZW5ndGg/YWIuaW5zZXJ0QWZ0ZXIoYSxiKTpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsMD09Yz9iOmpiKGIsYykpOmM+PWIuY2hpbGROb2Rlcy5sZW5ndGg/Yi5hcHBlbmRDaGlsZChhKTpiLmluc2VydEJlZm9yZShhLGIuY2hpbGROb2Rlc1tjXSksZH1mdW5jdGlvbiBnKGEsYixkKXtpZih5KGEpLHkoYiksYyhiKSE9YyhhKSl0aHJvdyBuZXcgZGIoXCJXUk9OR19ET0NVTUVOVF9FUlJcIik7dmFyIGU9aWIoYS5zdGFydENvbnRhaW5lcixhLnN0YXJ0T2Zmc2V0LGIuZW5kQ29udGFpbmVyLGIuZW5kT2Zmc2V0KSxmPWliKGEuZW5kQ29udGFpbmVyLGEuZW5kT2Zmc2V0LGIuc3RhcnRDb250YWluZXIsYi5zdGFydE9mZnNldCk7cmV0dXJuIGQ/MD49ZSYmZj49MDowPmUmJmY+MH1mdW5jdGlvbiBoKGEpe3ZhciBiLGQsZSxmO2ZvcihlPWMoYS5yYW5nZSkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2Q9YS5uZXh0KCk7KXtpZihiPWEuaXNQYXJ0aWFsbHlTZWxlY3RlZFN1YnRyZWUoKSxkPWQuY2xvbmVOb2RlKCFiKSxiJiYoZj1hLmdldFN1YnRyZWVJdGVyYXRvcigpLGQuYXBwZW5kQ2hpbGQoaChmKSksZi5kZXRhY2goKSksMTA9PWQubm9kZVR5cGUpdGhyb3cgbmV3IGRiKFwiSElFUkFSQ0hZX1JFUVVFU1RfRVJSXCIpO2UuYXBwZW5kQ2hpbGQoZCl9cmV0dXJuIGV9ZnVuY3Rpb24gaShhLGIsYyl7dmFyIGQsZSxmLGc7Zm9yKGM9Y3x8e3N0b3A6ITF9O2Y9YS5uZXh0KCk7KWlmKGEuaXNQYXJ0aWFsbHlTZWxlY3RlZFN1YnRyZWUoKSl7aWYoYihmKT09PSExKXJldHVybiBjLnN0b3A9ITAsdm9pZCAwO2lmKGc9YS5nZXRTdWJ0cmVlSXRlcmF0b3IoKSxpKGcsYixjKSxnLmRldGFjaCgpLGMuc3RvcClyZXR1cm59ZWxzZSBmb3IoZD1hYi5jcmVhdGVJdGVyYXRvcihmKTtlPWQubmV4dCgpOylpZihiKGUpPT09ITEpcmV0dXJuIGMuc3RvcD0hMCx2b2lkIDB9ZnVuY3Rpb24gaihhKXtmb3IodmFyIGI7YS5uZXh0KCk7KWEuaXNQYXJ0aWFsbHlTZWxlY3RlZFN1YnRyZWUoKT8oYj1hLmdldFN1YnRyZWVJdGVyYXRvcigpLGooYiksYi5kZXRhY2goKSk6YS5yZW1vdmUoKX1mdW5jdGlvbiBrKGEpe2Zvcih2YXIgYixkLGU9YyhhLnJhbmdlKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Yj1hLm5leHQoKTspe2lmKGEuaXNQYXJ0aWFsbHlTZWxlY3RlZFN1YnRyZWUoKT8oYj1iLmNsb25lTm9kZSghMSksZD1hLmdldFN1YnRyZWVJdGVyYXRvcigpLGIuYXBwZW5kQ2hpbGQoayhkKSksZC5kZXRhY2goKSk6YS5yZW1vdmUoKSwxMD09Yi5ub2RlVHlwZSl0aHJvdyBuZXcgZGIoXCJISUVSQVJDSFlfUkVRVUVTVF9FUlJcIik7ZS5hcHBlbmRDaGlsZChiKX1yZXR1cm4gZX1mdW5jdGlvbiBsKGEsYixjKXt2YXIgZCxlLGY9ISghYnx8IWIubGVuZ3RoKSxnPSEhYztyZXR1cm4gZiYmKGQ9UmVnRXhwKFwiXihcIitiLmpvaW4oXCJ8XCIpK1wiKSRcIikpLGU9W10saShuZXcgbihhLCExKSxmdW5jdGlvbihiKXt2YXIgaCxpOyghZnx8ZC50ZXN0KGIubm9kZVR5cGUpKSYmKCFnfHxjKGIpKSYmKGg9YS5zdGFydENvbnRhaW5lcixiPT1oJiZlYihoKSYmYS5zdGFydE9mZnNldD09aC5sZW5ndGh8fChpPWEuZW5kQ29udGFpbmVyLGI9PWkmJmViKGkpJiYwPT1hLmVuZE9mZnNldHx8ZS5wdXNoKGIpKSl9KSxlfWZ1bmN0aW9uIG0oYSl7dmFyIGI9dm9pZCAwPT09YS5nZXROYW1lP1wiUmFuZ2VcIjphLmdldE5hbWUoKTtyZXR1cm5cIltcIitiK1wiKFwiK2FiLmluc3BlY3ROb2RlKGEuc3RhcnRDb250YWluZXIpK1wiOlwiK2Euc3RhcnRPZmZzZXQrXCIsIFwiK2FiLmluc3BlY3ROb2RlKGEuZW5kQ29udGFpbmVyKStcIjpcIithLmVuZE9mZnNldCtcIildXCJ9ZnVuY3Rpb24gbihhLGIpe2lmKHRoaXMucmFuZ2U9YSx0aGlzLmNsb25lUGFydGlhbGx5U2VsZWN0ZWRUZXh0Tm9kZXM9YiwhYS5jb2xsYXBzZWQpe3RoaXMuc2M9YS5zdGFydENvbnRhaW5lcix0aGlzLnNvPWEuc3RhcnRPZmZzZXQsdGhpcy5lYz1hLmVuZENvbnRhaW5lcix0aGlzLmVvPWEuZW5kT2Zmc2V0O3ZhciBjPWEuY29tbW9uQW5jZXN0b3JDb250YWluZXI7dGhpcy5zYz09PXRoaXMuZWMmJmViKHRoaXMuc2MpPyh0aGlzLmlzU2luZ2xlQ2hhcmFjdGVyRGF0YU5vZGU9ITAsdGhpcy5fZmlyc3Q9dGhpcy5fbGFzdD10aGlzLl9uZXh0PXRoaXMuc2MpOih0aGlzLl9maXJzdD10aGlzLl9uZXh0PXRoaXMuc2MhPT1jfHxlYih0aGlzLnNjKT9rYih0aGlzLnNjLGMsITApOnRoaXMuc2MuY2hpbGROb2Rlc1t0aGlzLnNvXSx0aGlzLl9sYXN0PXRoaXMuZWMhPT1jfHxlYih0aGlzLmVjKT9rYih0aGlzLmVjLGMsITApOnRoaXMuZWMuY2hpbGROb2Rlc1t0aGlzLmVvLTFdKX19ZnVuY3Rpb24gbyhhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtmb3IodmFyIGQsZT1jP2I6Yi5wYXJlbnROb2RlO2U7KXtpZihkPWUubm9kZVR5cGUsbWIoYSxkKSlyZXR1cm4gZTtlPWUucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH19ZnVuY3Rpb24gcChhLGIpe2lmKFAoYSxiKSl0aHJvdyBuZXcgZGIoXCJJTlZBTElEX05PREVfVFlQRV9FUlJcIil9ZnVuY3Rpb24gcShhLGIpe2lmKCFtYihiLGEubm9kZVR5cGUpKXRocm93IG5ldyBkYihcIklOVkFMSURfTk9ERV9UWVBFX0VSUlwiKX1mdW5jdGlvbiByKGEsYil7aWYoMD5ifHxiPihlYihhKT9hLmxlbmd0aDphLmNoaWxkTm9kZXMubGVuZ3RoKSl0aHJvdyBuZXcgZGIoXCJJTkRFWF9TSVpFX0VSUlwiKX1mdW5jdGlvbiBzKGEsYil7aWYoTihhLCEwKSE9PU4oYiwhMCkpdGhyb3cgbmV3IGRiKFwiV1JPTkdfRE9DVU1FTlRfRVJSXCIpfWZ1bmN0aW9uIHQoYSl7aWYoTyhhLCEwKSl0aHJvdyBuZXcgZGIoXCJOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlJcIil9ZnVuY3Rpb24gdShhLGIpe2lmKCFhKXRocm93IG5ldyBkYihiKX1mdW5jdGlvbiB2KGEpe3JldHVybiBvYiYmYWIuaXNCcm9rZW5Ob2RlKGEpfHwhbWIoSixhLm5vZGVUeXBlKSYmIU4oYSwhMCl9ZnVuY3Rpb24gdyhhLGIpe3JldHVybiBiPD0oZWIoYSk/YS5sZW5ndGg6YS5jaGlsZE5vZGVzLmxlbmd0aCl9ZnVuY3Rpb24geChhKXtyZXR1cm4hIWEuc3RhcnRDb250YWluZXImJiEhYS5lbmRDb250YWluZXImJiF2KGEuc3RhcnRDb250YWluZXIpJiYhdihhLmVuZENvbnRhaW5lcikmJncoYS5zdGFydENvbnRhaW5lcixhLnN0YXJ0T2Zmc2V0KSYmdyhhLmVuZENvbnRhaW5lcixhLmVuZE9mZnNldCl9ZnVuY3Rpb24geShhKXtpZigheChhKSl0aHJvdyBFcnJvcihcIlJhbmdlIGVycm9yOiBSYW5nZSBpcyBubyBsb25nZXIgdmFsaWQgYWZ0ZXIgRE9NIG11dGF0aW9uIChcIithLmluc3BlY3QoKStcIilcIil9ZnVuY3Rpb24geihhLGIpe3ZhciBjLGQsZSxmLGc7eShhKSxjPWEuc3RhcnRDb250YWluZXIsZD1hLnN0YXJ0T2Zmc2V0LGU9YS5lbmRDb250YWluZXIsZj1hLmVuZE9mZnNldCxnPWM9PT1lLGViKGUpJiZmPjAmJmY8ZS5sZW5ndGgmJmpiKGUsZixiKSxlYihjKSYmZD4wJiZkPGMubGVuZ3RoJiYoYz1qYihjLGQsYiksZz8oZi09ZCxlPWMpOmU9PWMucGFyZW50Tm9kZSYmZj49ZmIoYykmJmYrKyxkPTApLGEuc2V0U3RhcnRBbmRFbmQoYyxkLGUsZil9ZnVuY3Rpb24gQShhKXt5KGEpO3ZhciBiPWEuY29tbW9uQW5jZXN0b3JDb250YWluZXIucGFyZW50Tm9kZS5jbG9uZU5vZGUoITEpO3JldHVybiBiLmFwcGVuZENoaWxkKGEuY2xvbmVDb250ZW50cygpKSxiLmlubmVySFRNTH1mdW5jdGlvbiBCKGEpe2EuU1RBUlRfVE9fU1RBUlQ9VSxhLlNUQVJUX1RPX0VORD1WLGEuRU5EX1RPX0VORD1XLGEuRU5EX1RPX1NUQVJUPVgsYS5OT0RFX0JFRk9SRT1ZLGEuTk9ERV9BRlRFUj1aLGEuTk9ERV9CRUZPUkVfQU5EX0FGVEVSPSQsYS5OT0RFX0lOU0lERT1ffWZ1bmN0aW9uIEMoYSl7QihhKSxCKGEucHJvdG90eXBlKX1mdW5jdGlvbiBEKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGMsZCxmLGcsaCxqLGs7cmV0dXJuIHkodGhpcyksYz10aGlzLnN0YXJ0Q29udGFpbmVyLGQ9dGhpcy5zdGFydE9mZnNldCxmPXRoaXMuY29tbW9uQW5jZXN0b3JDb250YWluZXIsZz1uZXcgbih0aGlzLCEwKSxjIT09ZiYmKGg9a2IoYyxmLCEwKSxqPWUoaCksYz1qLm5vZGUsZD1qLm9mZnNldCksaShnLHQpLGcucmVzZXQoKSxrPWEoZyksZy5kZXRhY2goKSxiKHRoaXMsYyxkLGMsZCksa319ZnVuY3Rpb24gRShjLGYpe2Z1bmN0aW9uIGcoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7cShjLEkpLHEobmIoYyksSik7dmFyIGY9KGE/ZDplKShjKTsoYj9oOmkpKHRoaXMsZi5ub2RlLGYub2Zmc2V0KX19ZnVuY3Rpb24gaChhLGIsYyl7dmFyIGQ9YS5lbmRDb250YWluZXIsZT1hLmVuZE9mZnNldDsoYiE9PWEuc3RhcnRDb250YWluZXJ8fGMhPT1hLnN0YXJ0T2Zmc2V0KSYmKChuYihiKSE9bmIoZCl8fDE9PWliKGIsYyxkLGUpKSYmKGQ9YixlPWMpLGYoYSxiLGMsZCxlKSl9ZnVuY3Rpb24gaShhLGIsYyl7dmFyIGQ9YS5zdGFydENvbnRhaW5lcixlPWEuc3RhcnRPZmZzZXQ7KGIhPT1hLmVuZENvbnRhaW5lcnx8YyE9PWEuZW5kT2Zmc2V0KSYmKChuYihiKSE9bmIoZCl8fC0xPT1pYihiLGMsZCxlKSkmJihkPWIsZT1jKSxmKGEsZCxlLGIsYykpfXZhciBsPWZ1bmN0aW9uKCl7fTtsLnByb3RvdHlwZT1hLnJhbmdlUHJvdG90eXBlLGMucHJvdG90eXBlPW5ldyBsLGJiLmV4dGVuZChjLnByb3RvdHlwZSx7c2V0U3RhcnQ6ZnVuY3Rpb24oYSxiKXtwKGEsITApLHIoYSxiKSxoKHRoaXMsYSxiKX0sc2V0RW5kOmZ1bmN0aW9uKGEsYil7cChhLCEwKSxyKGEsYiksaSh0aGlzLGEsYil9LHNldFN0YXJ0QW5kRW5kOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzLGI9YVswXSxjPWFbMV0sZD1iLGU9Yztzd2l0Y2goYS5sZW5ndGgpe2Nhc2UgMzplPWFbMl07YnJlYWs7Y2FzZSA0OmQ9YVsyXSxlPWFbM119Zih0aGlzLGIsYyxkLGUpfSxzZXRCb3VuZGFyeTpmdW5jdGlvbihhLGIsYyl7dGhpc1tcInNldFwiKyhjP1wiU3RhcnRcIjpcIkVuZFwiKV0oYSxiKX0sc2V0U3RhcnRCZWZvcmU6ZyghMCwhMCksc2V0U3RhcnRBZnRlcjpnKCExLCEwKSxzZXRFbmRCZWZvcmU6ZyghMCwhMSksc2V0RW5kQWZ0ZXI6ZyghMSwhMSksY29sbGFwc2U6ZnVuY3Rpb24oYSl7eSh0aGlzKSxhP2YodGhpcyx0aGlzLnN0YXJ0Q29udGFpbmVyLHRoaXMuc3RhcnRPZmZzZXQsdGhpcy5zdGFydENvbnRhaW5lcix0aGlzLnN0YXJ0T2Zmc2V0KTpmKHRoaXMsdGhpcy5lbmRDb250YWluZXIsdGhpcy5lbmRPZmZzZXQsdGhpcy5lbmRDb250YWluZXIsdGhpcy5lbmRPZmZzZXQpfSxzZWxlY3ROb2RlQ29udGVudHM6ZnVuY3Rpb24oYSl7cChhLCEwKSxmKHRoaXMsYSwwLGEsbGIoYSkpfSxzZWxlY3ROb2RlOmZ1bmN0aW9uKGEpe3AoYSwhMSkscShhLEkpO3ZhciBiPWQoYSksYz1lKGEpO2YodGhpcyxiLm5vZGUsYi5vZmZzZXQsYy5ub2RlLGMub2Zmc2V0KX0sZXh0cmFjdENvbnRlbnRzOkQoayxmKSxkZWxldGVDb250ZW50czpEKGosZiksY2FuU3Vycm91bmRDb250ZW50czpmdW5jdGlvbigpe3ZhciBhLGM7cmV0dXJuIHkodGhpcyksdCh0aGlzLnN0YXJ0Q29udGFpbmVyKSx0KHRoaXMuZW5kQ29udGFpbmVyKSxhPW5ldyBuKHRoaXMsITApLGM9YS5fZmlyc3QmJmIoYS5fZmlyc3QsdGhpcyl8fGEuX2xhc3QmJmIoYS5fbGFzdCx0aGlzKSxhLmRldGFjaCgpLCFjfSxzcGxpdEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXt6KHRoaXMpfSxzcGxpdEJvdW5kYXJpZXNQcmVzZXJ2aW5nUG9zaXRpb25zOmZ1bmN0aW9uKGEpe3oodGhpcyxhKX0sbm9ybWFsaXplQm91bmRhcmllczpmdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZyxoLGksajt5KHRoaXMpLGE9dGhpcy5zdGFydENvbnRhaW5lcixiPXRoaXMuc3RhcnRPZmZzZXQsYz10aGlzLmVuZENvbnRhaW5lcixkPXRoaXMuZW5kT2Zmc2V0LGU9ZnVuY3Rpb24oYSl7dmFyIGI9YS5uZXh0U2libGluZztiJiZiLm5vZGVUeXBlPT1hLm5vZGVUeXBlJiYoYz1hLGQ9YS5sZW5ndGgsYS5hcHBlbmREYXRhKGIuZGF0YSksYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpKX0sZz1mdW5jdGlvbihlKXt2YXIgZixnLGg9ZS5wcmV2aW91c1NpYmxpbmc7aCYmaC5ub2RlVHlwZT09ZS5ub2RlVHlwZSYmKGE9ZSxmPWUubGVuZ3RoLGI9aC5sZW5ndGgsZS5pbnNlcnREYXRhKDAsaC5kYXRhKSxoLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaCksYT09Yz8oZCs9YixjPWEpOmM9PWUucGFyZW50Tm9kZSYmKGc9ZmIoZSksZD09Zz8oYz1lLGQ9Zik6ZD5nJiZkLS0pKX0saD0hMCxlYihjKT9jLmxlbmd0aD09ZCYmZShjKTooZD4wJiYoaT1jLmNoaWxkTm9kZXNbZC0xXSxpJiZlYihpKSYmZShpKSksaD0hdGhpcy5jb2xsYXBzZWQpLGg/ZWIoYSk/MD09YiYmZyhhKTpiPGEuY2hpbGROb2Rlcy5sZW5ndGgmJihqPWEuY2hpbGROb2Rlc1tiXSxqJiZlYihqKSYmZyhqKSk6KGE9YyxiPWQpLGYodGhpcyxhLGIsYyxkKX0sY29sbGFwc2VUb1BvaW50OmZ1bmN0aW9uKGEsYil7cChhLCEwKSxyKGEsYiksdGhpcy5zZXRTdGFydEFuZEVuZChhLGIpfX0pLEMoYyl9ZnVuY3Rpb24gRihhKXthLmNvbGxhcHNlZD1hLnN0YXJ0Q29udGFpbmVyPT09YS5lbmRDb250YWluZXImJmEuc3RhcnRPZmZzZXQ9PT1hLmVuZE9mZnNldCxhLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyPWEuY29sbGFwc2VkP2Euc3RhcnRDb250YWluZXI6YWIuZ2V0Q29tbW9uQW5jZXN0b3IoYS5zdGFydENvbnRhaW5lcixhLmVuZENvbnRhaW5lcil9ZnVuY3Rpb24gRyhhLGIsYyxkLGUpe2Euc3RhcnRDb250YWluZXI9YixhLnN0YXJ0T2Zmc2V0PWMsYS5lbmRDb250YWluZXI9ZCxhLmVuZE9mZnNldD1lLGEuZG9jdW1lbnQ9YWIuZ2V0RG9jdW1lbnQoYiksRihhKX1mdW5jdGlvbiBIKGEpe3RoaXMuc3RhcnRDb250YWluZXI9YSx0aGlzLnN0YXJ0T2Zmc2V0PTAsdGhpcy5lbmRDb250YWluZXI9YSx0aGlzLmVuZE9mZnNldD0wLHRoaXMuZG9jdW1lbnQ9YSxGKHRoaXMpfXZhciBJLEosSyxMLE0sTixPLFAsUSxSLFMsVCxVLFYsVyxYLFksWiwkLF8sYWI9YS5kb20sYmI9YS51dGlsLGNiPWFiLkRvbVBvc2l0aW9uLGRiPWEuRE9NRXhjZXB0aW9uLGViPWFiLmlzQ2hhcmFjdGVyRGF0YU5vZGUsZmI9YWIuZ2V0Tm9kZUluZGV4LGdiPWFiLmlzT3JJc0FuY2VzdG9yT2YsaGI9YWIuZ2V0RG9jdW1lbnQsaWI9YWIuY29tcGFyZVBvaW50cyxqYj1hYi5zcGxpdERhdGFOb2RlLGtiPWFiLmdldENsb3Nlc3RBbmNlc3RvckluLGxiPWFiLmdldE5vZGVMZW5ndGgsbWI9YWIuYXJyYXlDb250YWlucyxuYj1hYi5nZXRSb290Q29udGFpbmVyLG9iPWEuZmVhdHVyZXMuY3Jhc2h5VGV4dE5vZGVzO24ucHJvdG90eXBlPXtfY3VycmVudDpudWxsLF9uZXh0Om51bGwsX2ZpcnN0Om51bGwsX2xhc3Q6bnVsbCxpc1NpbmdsZUNoYXJhY3RlckRhdGFOb2RlOiExLHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fY3VycmVudD1udWxsLHRoaXMuX25leHQ9dGhpcy5fZmlyc3R9LGhhc05leHQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX25leHR9LG5leHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9jdXJyZW50PXRoaXMuX25leHQ7cmV0dXJuIGEmJih0aGlzLl9uZXh0PWEhPT10aGlzLl9sYXN0P2EubmV4dFNpYmxpbmc6bnVsbCxlYihhKSYmdGhpcy5jbG9uZVBhcnRpYWxseVNlbGVjdGVkVGV4dE5vZGVzJiYoYT09PXRoaXMuZWMmJihhPWEuY2xvbmVOb2RlKCEwKSkuZGVsZXRlRGF0YSh0aGlzLmVvLGEubGVuZ3RoLXRoaXMuZW8pLHRoaXMuX2N1cnJlbnQ9PT10aGlzLnNjJiYoYT1hLmNsb25lTm9kZSghMCkpLmRlbGV0ZURhdGEoMCx0aGlzLnNvKSkpLGF9LHJlbW92ZTpmdW5jdGlvbigpe3ZhciBhLGIsYz10aGlzLl9jdXJyZW50OyFlYihjKXx8YyE9PXRoaXMuc2MmJmMhPT10aGlzLmVjP2MucGFyZW50Tm9kZSYmYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOihhPWM9PT10aGlzLnNjP3RoaXMuc286MCxiPWM9PT10aGlzLmVjP3RoaXMuZW86Yy5sZW5ndGgsYSE9YiYmYy5kZWxldGVEYXRhKGEsYi1hKSl9LGlzUGFydGlhbGx5U2VsZWN0ZWRTdWJ0cmVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fY3VycmVudDtyZXR1cm4gYihhLHRoaXMucmFuZ2UpfSxnZXRTdWJ0cmVlSXRlcmF0b3I6ZnVuY3Rpb24oKXt2YXIgYSxiLGQsZSxmLGc7cmV0dXJuIHRoaXMuaXNTaW5nbGVDaGFyYWN0ZXJEYXRhTm9kZT8oYT10aGlzLnJhbmdlLmNsb25lUmFuZ2UoKSxhLmNvbGxhcHNlKCExKSk6KGE9bmV3IEgoYyh0aGlzLnJhbmdlKSksYj10aGlzLl9jdXJyZW50LGQ9YixlPTAsZj1iLGc9bGIoYiksZ2IoYix0aGlzLnNjKSYmKGQ9dGhpcy5zYyxlPXRoaXMuc28pLGdiKGIsdGhpcy5lYykmJihmPXRoaXMuZWMsZz10aGlzLmVvKSxHKGEsZCxlLGYsZykpLG5ldyBuKGEsdGhpcy5jbG9uZVBhcnRpYWxseVNlbGVjdGVkVGV4dE5vZGVzKX0sZGV0YWNoOmZ1bmN0aW9uKCl7dGhpcy5yYW5nZT10aGlzLl9jdXJyZW50PXRoaXMuX25leHQ9dGhpcy5fZmlyc3Q9dGhpcy5fbGFzdD10aGlzLnNjPXRoaXMuc289dGhpcy5lYz10aGlzLmVvPW51bGx9fSxJPVsxLDMsNCw1LDcsOCwxMF0sSj1bMiw5LDExXSxLPVs1LDYsMTAsMTJdLEw9WzEsMyw0LDUsNyw4LDEwLDExXSxNPVsxLDMsNCw1LDcsOF0sTj1vKFs5LDExXSksTz1vKEspLFA9byhbNiwxMCwxMl0pLFE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpLFI9ITE7dHJ5e1EuaW5uZXJIVE1MPVwiPGI+eDwvYj5cIixSPTM9PVEuZmlyc3RDaGlsZC5ub2RlVHlwZX1jYXRjaChwYil7fWEuZmVhdHVyZXMuaHRtbFBhcnNpbmdDb25mb3Jtcz1SLFM9Uj9mdW5jdGlvbihhKXt2YXIgYixjPXRoaXMuc3RhcnRDb250YWluZXIsZD1oYihjKTtpZighYyl0aHJvdyBuZXcgZGIoXCJJTlZBTElEX1NUQVRFX0VSUlwiKTtyZXR1cm4gYj1udWxsLDE9PWMubm9kZVR5cGU/Yj1jOmViKGMpJiYoYj1hYi5wYXJlbnRFbGVtZW50KGMpKSxiPW51bGw9PT1ifHxcIkhUTUxcIj09Yi5ub2RlTmFtZSYmYWIuaXNIdG1sTmFtZXNwYWNlKGhiKGIpLmRvY3VtZW50RWxlbWVudCkmJmFiLmlzSHRtbE5hbWVzcGFjZShiKT9kLmNyZWF0ZUVsZW1lbnQoXCJib2R5XCIpOmIuY2xvbmVOb2RlKCExKSxiLmlubmVySFRNTD1hLGFiLmZyYWdtZW50RnJvbU5vZGVDaGlsZHJlbihiKX06ZnVuY3Rpb24oYSl7dmFyIGI9Yyh0aGlzKSxkPWIuY3JlYXRlRWxlbWVudChcImJvZHlcIik7cmV0dXJuIGQuaW5uZXJIVE1MPWEsYWIuZnJhZ21lbnRGcm9tTm9kZUNoaWxkcmVuKGQpfSxUPVtcInN0YXJ0Q29udGFpbmVyXCIsXCJzdGFydE9mZnNldFwiLFwiZW5kQ29udGFpbmVyXCIsXCJlbmRPZmZzZXRcIixcImNvbGxhcHNlZFwiLFwiY29tbW9uQW5jZXN0b3JDb250YWluZXJcIl0sVT0wLFY9MSxXPTIsWD0zLFk9MCxaPTEsJD0yLF89MyxiYi5leHRlbmQoYS5yYW5nZVByb3RvdHlwZSx7Y29tcGFyZUJvdW5kYXJ5UG9pbnRzOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZyxoO3JldHVybiB5KHRoaXMpLHModGhpcy5zdGFydENvbnRhaW5lcixiLnN0YXJ0Q29udGFpbmVyKSxnPWE9PVh8fGE9PVU/XCJzdGFydFwiOlwiZW5kXCIsaD1hPT1WfHxhPT1VP1wic3RhcnRcIjpcImVuZFwiLGM9dGhpc1tnK1wiQ29udGFpbmVyXCJdLGQ9dGhpc1tnK1wiT2Zmc2V0XCJdLGU9YltoK1wiQ29udGFpbmVyXCJdLGY9YltoK1wiT2Zmc2V0XCJdLGliKGMsZCxlLGYpfSxpbnNlcnROb2RlOmZ1bmN0aW9uKGEpe2lmKHkodGhpcykscShhLEwpLHQodGhpcy5zdGFydENvbnRhaW5lciksZ2IoYSx0aGlzLnN0YXJ0Q29udGFpbmVyKSl0aHJvdyBuZXcgZGIoXCJISUVSQVJDSFlfUkVRVUVTVF9FUlJcIik7dmFyIGI9ZihhLHRoaXMuc3RhcnRDb250YWluZXIsdGhpcy5zdGFydE9mZnNldCk7dGhpcy5zZXRTdGFydEJlZm9yZShiKX0sY2xvbmVDb250ZW50czpmdW5jdGlvbigpe3ZhciBhLGIsZDtyZXR1cm4geSh0aGlzKSx0aGlzLmNvbGxhcHNlZD9jKHRoaXMpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTp0aGlzLnN0YXJ0Q29udGFpbmVyPT09dGhpcy5lbmRDb250YWluZXImJmViKHRoaXMuc3RhcnRDb250YWluZXIpPyhhPXRoaXMuc3RhcnRDb250YWluZXIuY2xvbmVOb2RlKCEwKSxhLmRhdGE9YS5kYXRhLnNsaWNlKHRoaXMuc3RhcnRPZmZzZXQsdGhpcy5lbmRPZmZzZXQpLGI9Yyh0aGlzKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksYi5hcHBlbmRDaGlsZChhKSxiKTooZD1uZXcgbih0aGlzLCEwKSxhPWgoZCksZC5kZXRhY2goKSxhKX0sY2FuU3Vycm91bmRDb250ZW50czpmdW5jdGlvbigpe3ZhciBhLGM7cmV0dXJuIHkodGhpcyksdCh0aGlzLnN0YXJ0Q29udGFpbmVyKSx0KHRoaXMuZW5kQ29udGFpbmVyKSxhPW5ldyBuKHRoaXMsITApLGM9YS5fZmlyc3QmJmIoYS5fZmlyc3QsdGhpcyl8fGEuX2xhc3QmJmIoYS5fbGFzdCx0aGlzKSxhLmRldGFjaCgpLCFjfSxzdXJyb3VuZENvbnRlbnRzOmZ1bmN0aW9uKGEpe2lmKHEoYSxNKSwhdGhpcy5jYW5TdXJyb3VuZENvbnRlbnRzKCkpdGhyb3cgbmV3IGRiKFwiSU5WQUxJRF9TVEFURV9FUlJcIik7dmFyIGI9dGhpcy5leHRyYWN0Q29udGVudHMoKTtpZihhLmhhc0NoaWxkTm9kZXMoKSlmb3IoO2EubGFzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKTtmKGEsdGhpcy5zdGFydENvbnRhaW5lcix0aGlzLnN0YXJ0T2Zmc2V0KSxhLmFwcGVuZENoaWxkKGIpLHRoaXMuc2VsZWN0Tm9kZShhKX0sY2xvbmVSYW5nZTpmdW5jdGlvbigpe3ZhciBhLGIsZDtmb3IoeSh0aGlzKSxhPW5ldyBIKGModGhpcykpLGI9VC5sZW5ndGg7Yi0tOylkPVRbYl0sYVtkXT10aGlzW2RdO3JldHVybiBhfSx0b1N0cmluZzpmdW5jdGlvbigpe3ZhciBhLGIsYztyZXR1cm4geSh0aGlzKSxhPXRoaXMuc3RhcnRDb250YWluZXIsYT09PXRoaXMuZW5kQ29udGFpbmVyJiZlYihhKT8zPT1hLm5vZGVUeXBlfHw0PT1hLm5vZGVUeXBlP2EuZGF0YS5zbGljZSh0aGlzLnN0YXJ0T2Zmc2V0LHRoaXMuZW5kT2Zmc2V0KTpcIlwiOihiPVtdLGM9bmV3IG4odGhpcywhMCksaShjLGZ1bmN0aW9uKGEpeygzPT1hLm5vZGVUeXBlfHw0PT1hLm5vZGVUeXBlKSYmYi5wdXNoKGEuZGF0YSl9KSxjLmRldGFjaCgpLGIuam9pbihcIlwiKSl9LGNvbXBhcmVOb2RlOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlO2lmKHkodGhpcyksYj1hLnBhcmVudE5vZGUsYz1mYihhKSwhYil0aHJvdyBuZXcgZGIoXCJOT1RfRk9VTkRfRVJSXCIpO3JldHVybiBkPXRoaXMuY29tcGFyZVBvaW50KGIsYyksZT10aGlzLmNvbXBhcmVQb2ludChiLGMrMSksMD5kP2U+MD8kOlk6ZT4wP1o6X30sY29tcGFyZVBvaW50OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHkodGhpcyksdShhLFwiSElFUkFSQ0hZX1JFUVVFU1RfRVJSXCIpLHMoYSx0aGlzLnN0YXJ0Q29udGFpbmVyKSxpYihhLGIsdGhpcy5zdGFydENvbnRhaW5lcix0aGlzLnN0YXJ0T2Zmc2V0KTwwPy0xOmliKGEsYix0aGlzLmVuZENvbnRhaW5lcix0aGlzLmVuZE9mZnNldCk+MD8xOjB9LGNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudDpTLHRvSHRtbDpmdW5jdGlvbigpe3JldHVybiBBKHRoaXMpfSxpbnRlcnNlY3RzTm9kZTpmdW5jdGlvbihhLGIpe3ZhciBkLGUsZixnO3JldHVybiB5KHRoaXMpLHUoYSxcIk5PVF9GT1VORF9FUlJcIiksaGIoYSkhPT1jKHRoaXMpPyExOihkPWEucGFyZW50Tm9kZSxlPWZiKGEpLHUoZCxcIk5PVF9GT1VORF9FUlJcIiksZj1pYihkLGUsdGhpcy5lbmRDb250YWluZXIsdGhpcy5lbmRPZmZzZXQpLGc9aWIoZCxlKzEsdGhpcy5zdGFydENvbnRhaW5lcix0aGlzLnN0YXJ0T2Zmc2V0KSxiPzA+PWYmJmc+PTA6MD5mJiZnPjApfSxpc1BvaW50SW5SYW5nZTpmdW5jdGlvbihhLGIpe3JldHVybiB5KHRoaXMpLHUoYSxcIkhJRVJBUkNIWV9SRVFVRVNUX0VSUlwiKSxzKGEsdGhpcy5zdGFydENvbnRhaW5lciksaWIoYSxiLHRoaXMuc3RhcnRDb250YWluZXIsdGhpcy5zdGFydE9mZnNldCk+PTAmJmliKGEsYix0aGlzLmVuZENvbnRhaW5lcix0aGlzLmVuZE9mZnNldCk8PTB9LGludGVyc2VjdHNSYW5nZTpmdW5jdGlvbihhKXtyZXR1cm4gZyh0aGlzLGEsITEpfSxpbnRlcnNlY3RzT3JUb3VjaGVzUmFuZ2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGcodGhpcyxhLCEwKX0saW50ZXJzZWN0aW9uOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZDtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzUmFuZ2UoYSk/KGI9aWIodGhpcy5zdGFydENvbnRhaW5lcix0aGlzLnN0YXJ0T2Zmc2V0LGEuc3RhcnRDb250YWluZXIsYS5zdGFydE9mZnNldCksYz1pYih0aGlzLmVuZENvbnRhaW5lcix0aGlzLmVuZE9mZnNldCxhLmVuZENvbnRhaW5lcixhLmVuZE9mZnNldCksZD10aGlzLmNsb25lUmFuZ2UoKSwtMT09YiYmZC5zZXRTdGFydChhLnN0YXJ0Q29udGFpbmVyLGEuc3RhcnRPZmZzZXQpLDE9PWMmJmQuc2V0RW5kKGEuZW5kQ29udGFpbmVyLGEuZW5kT2Zmc2V0KSxkKTpudWxsfSx1bmlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmludGVyc2VjdHNPclRvdWNoZXNSYW5nZShhKSl7dmFyIGI9dGhpcy5jbG9uZVJhbmdlKCk7cmV0dXJuLTE9PWliKGEuc3RhcnRDb250YWluZXIsYS5zdGFydE9mZnNldCx0aGlzLnN0YXJ0Q29udGFpbmVyLHRoaXMuc3RhcnRPZmZzZXQpJiZiLnNldFN0YXJ0KGEuc3RhcnRDb250YWluZXIsYS5zdGFydE9mZnNldCksMT09aWIoYS5lbmRDb250YWluZXIsYS5lbmRPZmZzZXQsdGhpcy5lbmRDb250YWluZXIsdGhpcy5lbmRPZmZzZXQpJiZiLnNldEVuZChhLmVuZENvbnRhaW5lcixhLmVuZE9mZnNldCksYn10aHJvdyBuZXcgZGIoXCJSYW5nZXMgZG8gbm90IGludGVyc2VjdFwiKX0sY29udGFpbnNOb2RlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/dGhpcy5pbnRlcnNlY3RzTm9kZShhLCExKTp0aGlzLmNvbXBhcmVOb2RlKGEpPT1ffSxjb250YWluc05vZGVDb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb21wYXJlUG9pbnQoYSwwKT49MCYmdGhpcy5jb21wYXJlUG9pbnQoYSxsYihhKSk8PTB9LGNvbnRhaW5zUmFuZ2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5pbnRlcnNlY3Rpb24oYSk7cmV0dXJuIG51bGwhPT1iJiZhLmVxdWFscyhiKX0sY29udGFpbnNOb2RlVGV4dDpmdW5jdGlvbihhKXt2YXIgYixjLGQ9dGhpcy5jbG9uZVJhbmdlKCk7cmV0dXJuIGQuc2VsZWN0Tm9kZShhKSxiPWQuZ2V0Tm9kZXMoWzNdKSxiLmxlbmd0aD4wPyhkLnNldFN0YXJ0KGJbMF0sMCksYz1iLnBvcCgpLGQuc2V0RW5kKGMsYy5sZW5ndGgpLHRoaXMuY29udGFpbnNSYW5nZShkKSk6dGhpcy5jb250YWluc05vZGVDb250ZW50cyhhKX0sZ2V0Tm9kZXM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4geSh0aGlzKSxsKHRoaXMsYSxiKX0sZ2V0RG9jdW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYyh0aGlzKX0sY29sbGFwc2VCZWZvcmU6ZnVuY3Rpb24oYSl7dGhpcy5zZXRFbmRCZWZvcmUoYSksdGhpcy5jb2xsYXBzZSghMSl9LGNvbGxhcHNlQWZ0ZXI6ZnVuY3Rpb24oYSl7dGhpcy5zZXRTdGFydEFmdGVyKGEpLHRoaXMuY29sbGFwc2UoITApfSxnZXRCb29rbWFyazpmdW5jdGlvbihiKXt2YXIgZCxlLGYsZz1jKHRoaXMpLGg9YS5jcmVhdGVSYW5nZShnKTtyZXR1cm4gYj1ifHxhYi5nZXRCb2R5KGcpLGguc2VsZWN0Tm9kZUNvbnRlbnRzKGIpLGQ9dGhpcy5pbnRlcnNlY3Rpb24oaCksZT0wLGY9MCxkJiYoaC5zZXRFbmQoZC5zdGFydENvbnRhaW5lcixkLnN0YXJ0T2Zmc2V0KSxlPShcIlwiK2gpLmxlbmd0aCxmPWUrKFwiXCIrZCkubGVuZ3RoKSx7c3RhcnQ6ZSxlbmQ6Zixjb250YWluZXJOb2RlOmJ9fSxtb3ZlVG9Cb29rbWFyazpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPWEuY29udGFpbmVyTm9kZSxqPTA7Zm9yKHRoaXMuc2V0U3RhcnQoaSwwKSx0aGlzLmNvbGxhcHNlKCEwKSxiPVtpXSxkPSExLGU9ITE7IWUmJihjPWIucG9wKCkpOylpZigzPT1jLm5vZGVUeXBlKWY9aitjLmxlbmd0aCwhZCYmYS5zdGFydD49aiYmYS5zdGFydDw9ZiYmKHRoaXMuc2V0U3RhcnQoYyxhLnN0YXJ0LWopLGQ9ITApLGQmJmEuZW5kPj1qJiZhLmVuZDw9ZiYmKHRoaXMuc2V0RW5kKGMsYS5lbmQtaiksZT0hMCksaj1mO2Vsc2UgZm9yKGg9Yy5jaGlsZE5vZGVzLGc9aC5sZW5ndGg7Zy0tOyliLnB1c2goaFtnXSl9LGdldE5hbWU6ZnVuY3Rpb24oKXtyZXR1cm5cIkRvbVJhbmdlXCJ9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gSC5yYW5nZXNFcXVhbCh0aGlzLGEpfSxpc1ZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuIHgodGhpcyl9LGluc3BlY3Q6ZnVuY3Rpb24oKXtyZXR1cm4gbSh0aGlzKX0sZGV0YWNoOmZ1bmN0aW9uKCl7fX0pLEUoSCxHKSxiYi5leHRlbmQoSCx7cmFuZ2VQcm9wZXJ0aWVzOlQsUmFuZ2VJdGVyYXRvcjpuLGNvcHlDb21wYXJpc29uQ29uc3RhbnRzOkMsY3JlYXRlUHJvdG90eXBlUmFuZ2U6RSxpbnNwZWN0Om0sdG9IdG1sOkEsZ2V0UmFuZ2VEb2N1bWVudDpjLHJhbmdlc0VxdWFsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3RhcnRDb250YWluZXI9PT1iLnN0YXJ0Q29udGFpbmVyJiZhLnN0YXJ0T2Zmc2V0PT09Yi5zdGFydE9mZnNldCYmYS5lbmRDb250YWluZXI9PT1iLmVuZENvbnRhaW5lciYmYS5lbmRPZmZzZXQ9PT1iLmVuZE9mZnNldH19KSxhLkRvbVJhbmdlPUh9KSxILmNyZWF0ZUNvcmVNb2R1bGUoXCJXcmFwcGVkUmFuZ2VcIixbXCJEb21SYW5nZVwiXSxmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGcsaCxpLGosaz1hLmRvbSxsPWEudXRpbCxtPWsuRG9tUG9zaXRpb24sbj1hLkRvbVJhbmdlLG89ay5nZXRCb2R5LHA9ay5nZXRDb250ZW50RG9jdW1lbnQscT1rLmlzQ2hhcmFjdGVyRGF0YU5vZGU7YS5mZWF0dXJlcy5pbXBsZW1lbnRzRG9tUmFuZ2UmJiFmdW5jdGlvbigpe2Z1bmN0aW9uIGQoYSl7Zm9yKHZhciBiLGM9cy5sZW5ndGg7Yy0tOyliPXNbY10sYVtiXT1hLm5hdGl2ZVJhbmdlW2JdO2EuY29sbGFwc2VkPWEuc3RhcnRDb250YWluZXI9PT1hLmVuZENvbnRhaW5lciYmYS5zdGFydE9mZnNldD09PWEuZW5kT2Zmc2V0fWZ1bmN0aW9uIGUoYSxiLGMsZCxlKXt2YXIgZj1hLnN0YXJ0Q29udGFpbmVyIT09Ynx8YS5zdGFydE9mZnNldCE9YyxnPWEuZW5kQ29udGFpbmVyIT09ZHx8YS5lbmRPZmZzZXQhPWUsaD0hYS5lcXVhbHMoYS5uYXRpdmVSYW5nZSk7KGZ8fGd8fGgpJiYoYS5zZXRFbmQoZCxlKSxhLnNldFN0YXJ0KGIsYykpfXZhciBmLGcsaCxpLGosbSxxLHIscz1uLnJhbmdlUHJvcGVydGllcztjPWZ1bmN0aW9uKGEpe2lmKCFhKXRocm93IGIuY3JlYXRlRXJyb3IoXCJXcmFwcGVkUmFuZ2U6IFJhbmdlIG11c3QgYmUgc3BlY2lmaWVkXCIpO3RoaXMubmF0aXZlUmFuZ2U9YSxkKHRoaXMpfSxuLmNyZWF0ZVByb3RvdHlwZVJhbmdlKGMsZSksZj1jLnByb3RvdHlwZSxmLnNlbGVjdE5vZGU9ZnVuY3Rpb24oYSl7dGhpcy5uYXRpdmVSYW5nZS5zZWxlY3ROb2RlKGEpLGQodGhpcyl9LGYuY2xvbmVDb250ZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5hdGl2ZVJhbmdlLmNsb25lQ29udGVudHMoKX0sZi5zdXJyb3VuZENvbnRlbnRzPWZ1bmN0aW9uKGEpe3RoaXMubmF0aXZlUmFuZ2Uuc3Vycm91bmRDb250ZW50cyhhKSxkKHRoaXMpfSxmLmNvbGxhcHNlPWZ1bmN0aW9uKGEpe3RoaXMubmF0aXZlUmFuZ2UuY29sbGFwc2UoYSksZCh0aGlzKX0sZi5jbG9uZVJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBjKHRoaXMubmF0aXZlUmFuZ2UuY2xvbmVSYW5nZSgpKX0sZi5yZWZyZXNoPWZ1bmN0aW9uKCl7ZCh0aGlzKX0sZi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiXCIrdGhpcy5uYXRpdmVSYW5nZX0saD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcInRlc3RcIiksbyhkb2N1bWVudCkuYXBwZW5kQ2hpbGQoaCksaT1kb2N1bWVudC5jcmVhdGVSYW5nZSgpLGkuc2V0U3RhcnQoaCwwKSxpLnNldEVuZChoLDApO3RyeXtpLnNldFN0YXJ0KGgsMSksZi5zZXRTdGFydD1mdW5jdGlvbihhLGIpe3RoaXMubmF0aXZlUmFuZ2Uuc2V0U3RhcnQoYSxiKSxkKHRoaXMpfSxmLnNldEVuZD1mdW5jdGlvbihhLGIpe3RoaXMubmF0aXZlUmFuZ2Uuc2V0RW5kKGEsYiksZCh0aGlzKX0sZz1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7dGhpcy5uYXRpdmVSYW5nZVthXShiKSxkKHRoaXMpfX19Y2F0Y2godCl7Zi5zZXRTdGFydD1mdW5jdGlvbihhLGIpe3RyeXt0aGlzLm5hdGl2ZVJhbmdlLnNldFN0YXJ0KGEsYil9Y2F0Y2goYyl7dGhpcy5uYXRpdmVSYW5nZS5zZXRFbmQoYSxiKSx0aGlzLm5hdGl2ZVJhbmdlLnNldFN0YXJ0KGEsYil9ZCh0aGlzKX0sZi5zZXRFbmQ9ZnVuY3Rpb24oYSxiKXt0cnl7dGhpcy5uYXRpdmVSYW5nZS5zZXRFbmQoYSxiKX1jYXRjaChjKXt0aGlzLm5hdGl2ZVJhbmdlLnNldFN0YXJ0KGEsYiksdGhpcy5uYXRpdmVSYW5nZS5zZXRFbmQoYSxiKX1kKHRoaXMpfSxnPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe3RyeXt0aGlzLm5hdGl2ZVJhbmdlW2FdKGMpfWNhdGNoKGUpe3RoaXMubmF0aXZlUmFuZ2VbYl0oYyksdGhpcy5uYXRpdmVSYW5nZVthXShjKX1kKHRoaXMpfX19Zi5zZXRTdGFydEJlZm9yZT1nKFwic2V0U3RhcnRCZWZvcmVcIixcInNldEVuZEJlZm9yZVwiKSxmLnNldFN0YXJ0QWZ0ZXI9ZyhcInNldFN0YXJ0QWZ0ZXJcIixcInNldEVuZEFmdGVyXCIpLGYuc2V0RW5kQmVmb3JlPWcoXCJzZXRFbmRCZWZvcmVcIixcInNldFN0YXJ0QmVmb3JlXCIpLGYuc2V0RW5kQWZ0ZXI9ZyhcInNldEVuZEFmdGVyXCIsXCJzZXRTdGFydEFmdGVyXCIpLGYuc2VsZWN0Tm9kZUNvbnRlbnRzPWZ1bmN0aW9uKGEpe3RoaXMuc2V0U3RhcnRBbmRFbmQoYSwwLGsuZ2V0Tm9kZUxlbmd0aChhKSl9LGkuc2VsZWN0Tm9kZUNvbnRlbnRzKGgpLGkuc2V0RW5kKGgsMyksaj1kb2N1bWVudC5jcmVhdGVSYW5nZSgpLGouc2VsZWN0Tm9kZUNvbnRlbnRzKGgpLGouc2V0RW5kKGgsNCksai5zZXRTdGFydChoLDIpLGYuY29tcGFyZUJvdW5kYXJ5UG9pbnRzPS0xPT1pLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhpLlNUQVJUX1RPX0VORCxqKSYmMT09aS5jb21wYXJlQm91bmRhcnlQb2ludHMoaS5FTkRfVE9fU1RBUlQsaik/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj1iLm5hdGl2ZVJhbmdlfHxiLGE9PWIuU1RBUlRfVE9fRU5EP2E9Yi5FTkRfVE9fU1RBUlQ6YT09Yi5FTkRfVE9fU1RBUlQmJihhPWIuU1RBUlRfVE9fRU5EKSx0aGlzLm5hdGl2ZVJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhhLGIpfTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm5hdGl2ZVJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhhLGIubmF0aXZlUmFuZ2V8fGIpfSxtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksbS5pbm5lckhUTUw9XCIxMjNcIixxPW0uZmlyc3RDaGlsZCxyPW8oZG9jdW1lbnQpLHIuYXBwZW5kQ2hpbGQobSksaS5zZXRTdGFydChxLDEpLGkuc2V0RW5kKHEsMiksaS5kZWxldGVDb250ZW50cygpLFwiMTNcIj09cS5kYXRhJiYoZi5kZWxldGVDb250ZW50cz1mdW5jdGlvbigpe3RoaXMubmF0aXZlUmFuZ2UuZGVsZXRlQ29udGVudHMoKSxkKHRoaXMpfSxmLmV4dHJhY3RDb250ZW50cz1mdW5jdGlvbigpe3ZhciBhPXRoaXMubmF0aXZlUmFuZ2UuZXh0cmFjdENvbnRlbnRzKCk7cmV0dXJuIGQodGhpcyksYX0pLHIucmVtb3ZlQ2hpbGQobSkscj1udWxsLGwuaXNIb3N0TWV0aG9kKGksXCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnRcIikmJihmLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5uYXRpdmVSYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoYSl9KSxvKGRvY3VtZW50KS5yZW1vdmVDaGlsZChoKSxmLmdldE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm5cIldyYXBwZWRSYW5nZVwifSxhLldyYXBwZWRSYW5nZT1jLGEuY3JlYXRlTmF0aXZlUmFuZ2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9cChhLGIsXCJjcmVhdGVOYXRpdmVSYW5nZVwiKSxhLmNyZWF0ZVJhbmdlKCl9fSgpLGEuZmVhdHVyZXMuaW1wbGVtZW50c1RleHRSYW5nZSYmKGU9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9YS5wYXJlbnRFbGVtZW50KCksZj1hLmR1cGxpY2F0ZSgpO3JldHVybiBmLmNvbGxhcHNlKCEwKSxiPWYucGFyZW50RWxlbWVudCgpLGY9YS5kdXBsaWNhdGUoKSxmLmNvbGxhcHNlKCExKSxjPWYucGFyZW50RWxlbWVudCgpLGQ9Yj09Yz9iOmsuZ2V0Q29tbW9uQW5jZXN0b3IoYixjKSxkPT1lP2Q6ay5nZXRDb21tb25BbmNlc3RvcihlLGQpfSxmPWZ1bmN0aW9uKGEpe3JldHVybiAwPT1hLmNvbXBhcmVFbmRQb2ludHMoXCJTdGFydFRvRW5kXCIsYSl9LGc9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGwsbixvLHAscixzLHQsdSx2LHcseCx5PWEuZHVwbGljYXRlKCk7aWYoeS5jb2xsYXBzZShjKSxmPXkucGFyZW50RWxlbWVudCgpLGsuaXNPcklzQW5jZXN0b3JPZihiLGYpfHwoZj1iKSwhZi5jYW5IYXZlSFRNTClyZXR1cm4gZz1uZXcgbShmLnBhcmVudE5vZGUsay5nZXROb2RlSW5kZXgoZikpLHtib3VuZGFyeVBvc2l0aW9uOmcsbm9kZUluZm86e25vZGVJbmRleDpnLm9mZnNldCxjb250YWluZXJFbGVtZW50Omcubm9kZX19O2ZvcihoPWsuZ2V0RG9jdW1lbnQoZikuY3JlYXRlRWxlbWVudChcInNwYW5cIiksaC5wYXJlbnROb2RlJiZoLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaCksaj1jP1wiU3RhcnRUb1N0YXJ0XCI6XCJTdGFydFRvRW5kXCIscj1lJiZlLmNvbnRhaW5lckVsZW1lbnQ9PWY/ZS5ub2RlSW5kZXg6MCxzPWYuY2hpbGROb2Rlcy5sZW5ndGgsdD1zLHU9dDs7KXtpZih1PT1zP2YuYXBwZW5kQ2hpbGQoaCk6Zi5pbnNlcnRCZWZvcmUoaCxmLmNoaWxkTm9kZXNbdV0pLHkubW92ZVRvRWxlbWVudFRleHQoaCksaT15LmNvbXBhcmVFbmRQb2ludHMoaixhKSwwPT1pfHxyPT10KWJyZWFrO2lmKC0xPT1pKXtpZih0PT1yKzEpYnJlYWs7cj11fWVsc2UgdD10PT1yKzE/cjp1O3U9TWF0aC5mbG9vcigocit0KS8yKSxmLnJlbW92ZUNoaWxkKGgpfWlmKHA9aC5uZXh0U2libGluZywtMT09aSYmcCYmcShwKSl7aWYoeS5zZXRFbmRQb2ludChjP1wiRW5kVG9TdGFydFwiOlwiRW5kVG9FbmRcIixhKSwvW1xcclxcbl0vLnRlc3QocC5kYXRhKSlmb3Iodz15LmR1cGxpY2F0ZSgpLHg9dy50ZXh0LnJlcGxhY2UoL1xcclxcbi9nLFwiXFxyXCIpLmxlbmd0aCx2PXcubW92ZVN0YXJ0KFwiY2hhcmFjdGVyXCIseCk7LTE9PShpPXcuY29tcGFyZUVuZFBvaW50cyhcIlN0YXJ0VG9FbmRcIix3KSk7KXYrKyx3Lm1vdmVTdGFydChcImNoYXJhY3RlclwiLDEpO2Vsc2Ugdj15LnRleHQubGVuZ3RoO289bmV3IG0ocCx2KX1lbHNlIGw9KGR8fCFjKSYmaC5wcmV2aW91c1NpYmxpbmcsbj0oZHx8YykmJmgubmV4dFNpYmxpbmcsbz1uJiZxKG4pP25ldyBtKG4sMCk6bCYmcShsKT9uZXcgbShsLGwuZGF0YS5sZW5ndGgpOm5ldyBtKGYsay5nZXROb2RlSW5kZXgoaCkpO3JldHVybiBoLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaCkse2JvdW5kYXJ5UG9zaXRpb246byxub2RlSW5mbzp7bm9kZUluZGV4OnUsY29udGFpbmVyRWxlbWVudDpmfX19LGg9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnPWEub2Zmc2V0LGg9ay5nZXREb2N1bWVudChhLm5vZGUpLGk9byhoKS5jcmVhdGVUZXh0UmFuZ2UoKSxqPXEoYS5ub2RlKTtyZXR1cm4gaj8oYz1hLm5vZGUsZD1jLnBhcmVudE5vZGUpOihmPWEubm9kZS5jaGlsZE5vZGVzLGM9ZzxmLmxlbmd0aD9mW2ddOm51bGwsZD1hLm5vZGUpLGU9aC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSxlLmlubmVySFRNTD1cIiYjZmVmZjtcIixjP2QuaW5zZXJ0QmVmb3JlKGUsYyk6ZC5hcHBlbmRDaGlsZChlKSxpLm1vdmVUb0VsZW1lbnRUZXh0KGUpLGkuY29sbGFwc2UoIWIpLGQucmVtb3ZlQ2hpbGQoZSksaiYmaVtiP1wibW92ZVN0YXJ0XCI6XCJtb3ZlRW5kXCJdKFwiY2hhcmFjdGVyXCIsZyksaX0sZD1mdW5jdGlvbihhKXt0aGlzLnRleHRSYW5nZT1hLHRoaXMucmVmcmVzaCgpfSxkLnByb3RvdHlwZT1uZXcgbihkb2N1bWVudCksZC5wcm90b3R5cGUucmVmcmVzaD1mdW5jdGlvbigpe3ZhciBhLGIsYyxkPWUodGhpcy50ZXh0UmFuZ2UpO1xuZih0aGlzLnRleHRSYW5nZSk/Yj1hPWcodGhpcy50ZXh0UmFuZ2UsZCwhMCwhMCkuYm91bmRhcnlQb3NpdGlvbjooYz1nKHRoaXMudGV4dFJhbmdlLGQsITAsITEpLGE9Yy5ib3VuZGFyeVBvc2l0aW9uLGI9Zyh0aGlzLnRleHRSYW5nZSxkLCExLCExLGMubm9kZUluZm8pLmJvdW5kYXJ5UG9zaXRpb24pLHRoaXMuc2V0U3RhcnQoYS5ub2RlLGEub2Zmc2V0KSx0aGlzLnNldEVuZChiLm5vZGUsYi5vZmZzZXQpfSxkLnByb3RvdHlwZS5nZXROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuXCJXcmFwcGVkVGV4dFJhbmdlXCJ9LG4uY29weUNvbXBhcmlzb25Db25zdGFudHMoZCksaT1mdW5jdGlvbihhKXt2YXIgYixjLGQ7cmV0dXJuIGEuY29sbGFwc2VkP2gobmV3IG0oYS5zdGFydENvbnRhaW5lcixhLnN0YXJ0T2Zmc2V0KSwhMCk6KGI9aChuZXcgbShhLnN0YXJ0Q29udGFpbmVyLGEuc3RhcnRPZmZzZXQpLCEwKSxjPWgobmV3IG0oYS5lbmRDb250YWluZXIsYS5lbmRPZmZzZXQpLCExKSxkPW8obi5nZXRSYW5nZURvY3VtZW50KGEpKS5jcmVhdGVUZXh0UmFuZ2UoKSxkLnNldEVuZFBvaW50KFwiU3RhcnRUb1N0YXJ0XCIsYiksZC5zZXRFbmRQb2ludChcIkVuZFRvRW5kXCIsYyksZCl9LGQucmFuZ2VUb1RleHRSYW5nZT1pLGQucHJvdG90eXBlLnRvVGV4dFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIGkodGhpcyl9LGEuV3JhcHBlZFRleHRSYW5nZT1kLCghYS5mZWF0dXJlcy5pbXBsZW1lbnRzRG9tUmFuZ2V8fGEuY29uZmlnLnByZWZlclRleHRSYW5nZSkmJihqPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCksdm9pZCAwPT09ai5SYW5nZSYmKGouUmFuZ2U9ZCksYS5jcmVhdGVOYXRpdmVSYW5nZT1mdW5jdGlvbihhKXtyZXR1cm4gYT1wKGEsYixcImNyZWF0ZU5hdGl2ZVJhbmdlXCIpLG8oYSkuY3JlYXRlVGV4dFJhbmdlKCl9LGEuV3JhcHBlZFJhbmdlPWQpKSxhLmNyZWF0ZVJhbmdlPWZ1bmN0aW9uKGMpe3JldHVybiBjPXAoYyxiLFwiY3JlYXRlUmFuZ2VcIiksbmV3IGEuV3JhcHBlZFJhbmdlKGEuY3JlYXRlTmF0aXZlUmFuZ2UoYykpfSxhLmNyZWF0ZVJhbmd5UmFuZ2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9cChhLGIsXCJjcmVhdGVSYW5neVJhbmdlXCIpLG5ldyBuKGEpfSxhLmNyZWF0ZUlmcmFtZVJhbmdlPWZ1bmN0aW9uKGMpe3JldHVybiBiLmRlcHJlY2F0aW9uTm90aWNlKFwiY3JlYXRlSWZyYW1lUmFuZ2UoKVwiLFwiY3JlYXRlUmFuZ2UoaWZyYW1lRWwpXCIpLGEuY3JlYXRlUmFuZ2UoYyl9LGEuY3JlYXRlSWZyYW1lUmFuZ3lSYW5nZT1mdW5jdGlvbihjKXtyZXR1cm4gYi5kZXByZWNhdGlvbk5vdGljZShcImNyZWF0ZUlmcmFtZVJhbmd5UmFuZ2UoKVwiLFwiY3JlYXRlUmFuZ3lSYW5nZShpZnJhbWVFbClcIiksYS5jcmVhdGVSYW5neVJhbmdlKGMpfSxhLmFkZFNoaW1MaXN0ZW5lcihmdW5jdGlvbihiKXt2YXIgYz1iLmRvY3VtZW50O3ZvaWQgMD09PWMuY3JlYXRlUmFuZ2UmJihjLmNyZWF0ZVJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIGEuY3JlYXRlUmFuZ2UoYyl9KSxjPWI9bnVsbH0pfSksSC5jcmVhdGVDb3JlTW9kdWxlKFwiV3JhcHBlZFNlbGVjdGlvblwiLFtcIkRvbVJhbmdlXCIsXCJXcmFwcGVkUmFuZ2VcIl0sZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBhPy9eYmFja3dhcmQocyk/JC9pLnRlc3QoYSk6ISFhfWZ1bmN0aW9uIGQoYSxjKXtpZihhKXtpZihBLmlzV2luZG93KGEpKXJldHVybiBhO2lmKGEgaW5zdGFuY2VvZiByKXJldHVybiBhLndpbjt2YXIgZD1BLmdldENvbnRlbnREb2N1bWVudChhLGIsYyk7cmV0dXJuIEEuZ2V0V2luZG93KGQpfXJldHVybiB3aW5kb3d9ZnVuY3Rpb24gZShhKXtyZXR1cm4gZChhLFwiZ2V0V2luU2VsZWN0aW9uXCIpLmdldFNlbGVjdGlvbigpfWZ1bmN0aW9uIGYoYSl7cmV0dXJuIGQoYSxcImdldERvY1NlbGVjdGlvblwiKS5kb2N1bWVudC5zZWxlY3Rpb259ZnVuY3Rpb24gZyhhKXt2YXIgYj0hMTtyZXR1cm4gYS5hbmNob3JOb2RlJiYoYj0xPT1BLmNvbXBhcmVQb2ludHMoYS5hbmNob3JOb2RlLGEuYW5jaG9yT2Zmc2V0LGEuZm9jdXNOb2RlLGEuZm9jdXNPZmZzZXQpKSxifWZ1bmN0aW9uIGgoYSxiLGMpe3ZhciBkPWM/XCJlbmRcIjpcInN0YXJ0XCIsZT1jP1wic3RhcnRcIjpcImVuZFwiO2EuYW5jaG9yTm9kZT1iW2QrXCJDb250YWluZXJcIl0sYS5hbmNob3JPZmZzZXQ9YltkK1wiT2Zmc2V0XCJdLGEuZm9jdXNOb2RlPWJbZStcIkNvbnRhaW5lclwiXSxhLmZvY3VzT2Zmc2V0PWJbZStcIk9mZnNldFwiXX1mdW5jdGlvbiBpKGEpe3ZhciBiPWEubmF0aXZlU2VsZWN0aW9uO2EuYW5jaG9yTm9kZT1iLmFuY2hvck5vZGUsYS5hbmNob3JPZmZzZXQ9Yi5hbmNob3JPZmZzZXQsYS5mb2N1c05vZGU9Yi5mb2N1c05vZGUsYS5mb2N1c09mZnNldD1iLmZvY3VzT2Zmc2V0fWZ1bmN0aW9uIGooYSl7YS5hbmNob3JOb2RlPWEuZm9jdXNOb2RlPW51bGwsYS5hbmNob3JPZmZzZXQ9YS5mb2N1c09mZnNldD0wLGEucmFuZ2VDb3VudD0wLGEuaXNDb2xsYXBzZWQ9ITAsYS5fcmFuZ2VzLmxlbmd0aD0wfWZ1bmN0aW9uIGsoYil7dmFyIGM7cmV0dXJuIGIgaW5zdGFuY2VvZiBEPyhjPWEuY3JlYXRlTmF0aXZlUmFuZ2UoYi5nZXREb2N1bWVudCgpKSxjLnNldEVuZChiLmVuZENvbnRhaW5lcixiLmVuZE9mZnNldCksYy5zZXRTdGFydChiLnN0YXJ0Q29udGFpbmVyLGIuc3RhcnRPZmZzZXQpKTpiIGluc3RhbmNlb2YgRT9jPWIubmF0aXZlUmFuZ2U6Si5pbXBsZW1lbnRzRG9tUmFuZ2UmJmIgaW5zdGFuY2VvZiBBLmdldFdpbmRvdyhiLnN0YXJ0Q29udGFpbmVyKS5SYW5nZSYmKGM9YiksY31mdW5jdGlvbiBsKGEpe2lmKCFhLmxlbmd0aHx8MSE9YVswXS5ub2RlVHlwZSlyZXR1cm4hMTtmb3IodmFyIGI9MSxjPWEubGVuZ3RoO2M+YjsrK2IpaWYoIUEuaXNBbmNlc3Rvck9mKGFbMF0sYVtiXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gbShhKXt2YXIgYz1hLmdldE5vZGVzKCk7aWYoIWwoYykpdGhyb3cgYi5jcmVhdGVFcnJvcihcImdldFNpbmdsZUVsZW1lbnRGcm9tUmFuZ2U6IHJhbmdlIFwiK2EuaW5zcGVjdCgpK1wiIGRpZCBub3QgY29uc2lzdCBvZiBhIHNpbmdsZSBlbGVtZW50XCIpO3JldHVybiBjWzBdfWZ1bmN0aW9uIG4oYSl7cmV0dXJuISFhJiZ2b2lkIDAhPT1hLnRleHR9ZnVuY3Rpb24gbyhhLGIpe3ZhciBjPW5ldyBFKGIpO2EuX3Jhbmdlcz1bY10saChhLGMsITEpLGEucmFuZ2VDb3VudD0xLGEuaXNDb2xsYXBzZWQ9Yy5jb2xsYXBzZWR9ZnVuY3Rpb24gcChiKXt2YXIgYyxkLGUsZjtpZihiLl9yYW5nZXMubGVuZ3RoPTAsXCJOb25lXCI9PWIuZG9jU2VsZWN0aW9uLnR5cGUpaihiKTtlbHNlIGlmKGM9Yi5kb2NTZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKSxuKGMpKW8oYixjKTtlbHNle2ZvcihiLnJhbmdlQ291bnQ9Yy5sZW5ndGgsZT1MKGMuaXRlbSgwKSksZj0wO2Y8Yi5yYW5nZUNvdW50OysrZilkPWEuY3JlYXRlUmFuZ2UoZSksZC5zZWxlY3ROb2RlKGMuaXRlbShmKSksYi5fcmFuZ2VzLnB1c2goZCk7Yi5pc0NvbGxhcHNlZD0xPT1iLnJhbmdlQ291bnQmJmIuX3Jhbmdlc1swXS5jb2xsYXBzZWQsaChiLGIuX3Jhbmdlc1tiLnJhbmdlQ291bnQtMV0sITEpfX1mdW5jdGlvbiBxKGEsYyl7dmFyIGQsZSxmPWEuZG9jU2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCksZz1tKGMpLGg9TChmLml0ZW0oMCkpLGk9TShoKS5jcmVhdGVDb250cm9sUmFuZ2UoKTtmb3IoZD0wLGU9Zi5sZW5ndGg7ZT5kOysrZClpLmFkZChmLml0ZW0oZCkpO3RyeXtpLmFkZChnKX1jYXRjaChqKXt0aHJvdyBiLmNyZWF0ZUVycm9yKFwiYWRkUmFuZ2UoKTogRWxlbWVudCB3aXRoaW4gdGhlIHNwZWNpZmllZCBSYW5nZSBjb3VsZCBub3QgYmUgYWRkZWQgdG8gY29udHJvbCBzZWxlY3Rpb24gKGRvZXMgaXQgaGF2ZSBsYXlvdXQ/KVwiKX1pLnNlbGVjdCgpLHAoYSl9ZnVuY3Rpb24gcihhLGIsYyl7dGhpcy5uYXRpdmVTZWxlY3Rpb249YSx0aGlzLmRvY1NlbGVjdGlvbj1iLHRoaXMuX3Jhbmdlcz1bXSx0aGlzLndpbj1jLHRoaXMucmVmcmVzaCgpfWZ1bmN0aW9uIHMoYSl7YS53aW49YS5hbmNob3JOb2RlPWEuZm9jdXNOb2RlPWEuX3Jhbmdlcz1udWxsLGEucmFuZ2VDb3VudD1hLmFuY2hvck9mZnNldD1hLmZvY3VzT2Zmc2V0PTAsYS5kZXRhY2hlZD0hMH1mdW5jdGlvbiB0KGEsYil7Zm9yKHZhciBjLGQsZT1iYi5sZW5ndGg7ZS0tOylpZihjPWJiW2VdLGQ9Yy5zZWxlY3Rpb24sXCJkZWxldGVBbGxcIj09YilzKGQpO2Vsc2UgaWYoYy53aW49PWEpcmV0dXJuXCJkZWxldGVcIj09Yj8oYmIuc3BsaWNlKGUsMSksITApOmQ7cmV0dXJuXCJkZWxldGVBbGxcIj09YiYmKGJiLmxlbmd0aD0wKSxudWxsfWZ1bmN0aW9uIHUoYSxjKXt2YXIgZCxlLGYsZz1MKGNbMF0uc3RhcnRDb250YWluZXIpLGg9TShnKS5jcmVhdGVDb250cm9sUmFuZ2UoKTtmb3IoZD0wLGY9Yy5sZW5ndGg7Zj5kOysrZCl7ZT1tKGNbZF0pO3RyeXtoLmFkZChlKX1jYXRjaChpKXt0aHJvdyBiLmNyZWF0ZUVycm9yKFwic2V0UmFuZ2VzKCk6IEVsZW1lbnQgd2l0aGluIG9uZSBvZiB0aGUgc3BlY2lmaWVkIFJhbmdlcyBjb3VsZCBub3QgYmUgYWRkZWQgdG8gY29udHJvbCBzZWxlY3Rpb24gKGRvZXMgaXQgaGF2ZSBsYXlvdXQ/KVwiKX19aC5zZWxlY3QoKSxwKGEpfWZ1bmN0aW9uIHYoYSxiKXtpZihhLndpbi5kb2N1bWVudCE9TChiKSl0aHJvdyBuZXcgRihcIldST05HX0RPQ1VNRU5UX0VSUlwiKX1mdW5jdGlvbiB3KGIpe3JldHVybiBmdW5jdGlvbihjLGQpe3ZhciBlO3RoaXMucmFuZ2VDb3VudD8oZT10aGlzLmdldFJhbmdlQXQoMCksZVtcInNldFwiKyhiP1wiU3RhcnRcIjpcIkVuZFwiKV0oYyxkKSk6KGU9YS5jcmVhdGVSYW5nZSh0aGlzLndpbi5kb2N1bWVudCksZS5zZXRTdGFydEFuZEVuZChjLGQpKSx0aGlzLnNldFNpbmdsZVJhbmdlKGUsdGhpcy5pc0JhY2t3YXJkKCkpfX1mdW5jdGlvbiB4KGEpe3ZhciBiLGMsZD1bXSxlPW5ldyBHKGEuYW5jaG9yTm9kZSxhLmFuY2hvck9mZnNldCksZj1uZXcgRyhhLmZvY3VzTm9kZSxhLmZvY3VzT2Zmc2V0KSxnPVwiZnVuY3Rpb25cIj09dHlwZW9mIGEuZ2V0TmFtZT9hLmdldE5hbWUoKTpcIlNlbGVjdGlvblwiO2lmKHZvaWQgMCE9PWEucmFuZ2VDb3VudClmb3IoYj0wLGM9YS5yYW5nZUNvdW50O2M+YjsrK2IpZFtiXT1ELmluc3BlY3QoYS5nZXRSYW5nZUF0KGIpKTtyZXR1cm5cIltcIitnK1wiKFJhbmdlczogXCIrZC5qb2luKFwiLCBcIikrXCIpKGFuY2hvcjogXCIrZS5pbnNwZWN0KCkrXCIsIGZvY3VzOiBcIitmLmluc3BlY3QoKStcIl1cIn12YXIgeSx6LEEsQixDLEQsRSxGLEcsSCxJLEosSyxMLE0sTixPLFAsUSxSLFMsVCxVLFYsVyxYLFksWiwkLF8sYWIsYmIsY2IsZGIsZWIsZmIsZ2IsaGI7aWYoYS5jb25maWcuY2hlY2tTZWxlY3Rpb25SYW5nZXM9ITAseT1cImJvb2xlYW5cIix6PVwibnVtYmVyXCIsQT1hLmRvbSxCPWEudXRpbCxDPUIuaXNIb3N0TWV0aG9kLEQ9YS5Eb21SYW5nZSxFPWEuV3JhcHBlZFJhbmdlLEY9YS5ET01FeGNlcHRpb24sRz1BLkRvbVBvc2l0aW9uLEo9YS5mZWF0dXJlcyxLPVwiQ29udHJvbFwiLEw9QS5nZXREb2N1bWVudCxNPUEuZ2V0Qm9keSxOPUQucmFuZ2VzRXF1YWwsTz1DKHdpbmRvdyxcImdldFNlbGVjdGlvblwiKSxQPUIuaXNIb3N0T2JqZWN0KGRvY3VtZW50LFwic2VsZWN0aW9uXCIpLEouaW1wbGVtZW50c1dpbkdldFNlbGVjdGlvbj1PLEouaW1wbGVtZW50c0RvY1NlbGVjdGlvbj1QLFE9UCYmKCFPfHxhLmNvbmZpZy5wcmVmZXJUZXh0UmFuZ2UpLFE/KEg9ZixhLmlzU2VsZWN0aW9uVmFsaWQ9ZnVuY3Rpb24oYSl7dmFyIGI9ZChhLFwiaXNTZWxlY3Rpb25WYWxpZFwiKS5kb2N1bWVudCxjPWIuc2VsZWN0aW9uO3JldHVyblwiTm9uZVwiIT1jLnR5cGV8fEwoYy5jcmVhdGVSYW5nZSgpLnBhcmVudEVsZW1lbnQoKSk9PWJ9KTpPPyhIPWUsYS5pc1NlbGVjdGlvblZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuITB9KTpiLmZhaWwoXCJOZWl0aGVyIGRvY3VtZW50LnNlbGVjdGlvbiBvciB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkgZGV0ZWN0ZWQuXCIpLGEuZ2V0TmF0aXZlU2VsZWN0aW9uPUgsUj1IKCksUz1hLmNyZWF0ZU5hdGl2ZVJhbmdlKGRvY3VtZW50KSxUPU0oZG9jdW1lbnQpLFU9Qi5hcmVIb3N0UHJvcGVydGllcyhSLFtcImFuY2hvck5vZGVcIixcImZvY3VzTm9kZVwiLFwiYW5jaG9yT2Zmc2V0XCIsXCJmb2N1c09mZnNldFwiXSksSi5zZWxlY3Rpb25IYXNBbmNob3JBbmRGb2N1cz1VLFY9QyhSLFwiZXh0ZW5kXCIpLEouc2VsZWN0aW9uSGFzRXh0ZW5kPVYsVz10eXBlb2YgUi5yYW5nZUNvdW50PT16LEouc2VsZWN0aW9uSGFzUmFuZ2VDb3VudD1XLFg9ITEsWT0hMCxaPVY/ZnVuY3Rpb24oYixjKXt2YXIgZD1ELmdldFJhbmdlRG9jdW1lbnQoYyksZT1hLmNyZWF0ZVJhbmdlKGQpO2UuY29sbGFwc2VUb1BvaW50KGMuZW5kQ29udGFpbmVyLGMuZW5kT2Zmc2V0KSxiLmFkZFJhbmdlKGsoZSkpLGIuZXh0ZW5kKGMuc3RhcnRDb250YWluZXIsYy5zdGFydE9mZnNldCl9Om51bGwsQi5hcmVIb3N0TWV0aG9kcyhSLFtcImFkZFJhbmdlXCIsXCJnZXRSYW5nZUF0XCIsXCJyZW1vdmVBbGxSYW5nZXNcIl0pJiZ0eXBlb2YgUi5yYW5nZUNvdW50PT16JiZKLmltcGxlbWVudHNEb21SYW5nZSYmIWZ1bmN0aW9uKCl7dmFyIGIsYyxkLGUsZixoLGksaixrLGwsbSxuPXdpbmRvdy5nZXRTZWxlY3Rpb24oKTtpZihuKXtmb3IoYj1uLnJhbmdlQ291bnQsYz1iPjEsZD1bXSxlPWcobiksZj0wO2I+ZjsrK2YpZFtmXT1uLmdldFJhbmdlQXQoZik7Zm9yKGg9TShkb2N1bWVudCksaT1oLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpLGkuY29udGVudEVkaXRhYmxlPVwiZmFsc2VcIixqPWkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCLCoMKgwqBcIikpLGs9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSxrLnNldFN0YXJ0KGosMSksay5jb2xsYXBzZSghMCksbi5hZGRSYW5nZShrKSxZPTE9PW4ucmFuZ2VDb3VudCxuLnJlbW92ZUFsbFJhbmdlcygpLGN8fChsPXdpbmRvdy5uYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvQ2hyb21lXFwvKC4qPykgLyksbCYmcGFyc2VJbnQobFsxXSk+PTM2P1g9ITE6KG09ay5jbG9uZVJhbmdlKCksay5zZXRTdGFydChqLDApLG0uc2V0RW5kKGosMyksbS5zZXRTdGFydChqLDIpLG4uYWRkUmFuZ2Uoayksbi5hZGRSYW5nZShtKSxYPTI9PW4ucmFuZ2VDb3VudCkpLGgucmVtb3ZlQ2hpbGQoaSksbi5yZW1vdmVBbGxSYW5nZXMoKSxmPTA7Yj5mOysrZikwPT1mJiZlP1o/WihuLGRbZl0pOihhLndhcm4oXCJSYW5neSBpbml0aWFsaXphdGlvbjogb3JpZ2luYWwgc2VsZWN0aW9uIHdhcyBiYWNrd2FyZHMgYnV0IHNlbGVjdGlvbiBoYXMgYmVlbiByZXN0b3JlZCBmb3J3YXJkcyBiZWNhdXNlIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgU2VsZWN0aW9uLmV4dGVuZFwiKSxuLmFkZFJhbmdlKGRbZl0pKTpuLmFkZFJhbmdlKGRbZl0pfX0oKSxKLnNlbGVjdGlvblN1cHBvcnRzTXVsdGlwbGVSYW5nZXM9WCxKLmNvbGxhcHNlZE5vbkVkaXRhYmxlU2VsZWN0aW9uc1N1cHBvcnRlZD1ZLCQ9ITEsVCYmQyhULFwiY3JlYXRlQ29udHJvbFJhbmdlXCIpJiYoXz1ULmNyZWF0ZUNvbnRyb2xSYW5nZSgpLEIuYXJlSG9zdFByb3BlcnRpZXMoXyxbXCJpdGVtXCIsXCJhZGRcIl0pJiYoJD0hMCkpLEouaW1wbGVtZW50c0NvbnRyb2xSYW5nZT0kLEk9VT9mdW5jdGlvbihhKXtyZXR1cm4gYS5hbmNob3JOb2RlPT09YS5mb2N1c05vZGUmJmEuYW5jaG9yT2Zmc2V0PT09YS5mb2N1c09mZnNldH06ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmFuZ2VDb3VudD9hLmdldFJhbmdlQXQoYS5yYW5nZUNvdW50LTEpLmNvbGxhcHNlZDohMX0sQyhSLFwiZ2V0UmFuZ2VBdFwiKT9hYj1mdW5jdGlvbihhLGIpe3RyeXtyZXR1cm4gYS5nZXRSYW5nZUF0KGIpfWNhdGNoKGMpe3JldHVybiBudWxsfX06VSYmKGFiPWZ1bmN0aW9uKGIpe3ZhciBjPUwoYi5hbmNob3JOb2RlKSxkPWEuY3JlYXRlUmFuZ2UoYyk7cmV0dXJuIGQuc2V0U3RhcnRBbmRFbmQoYi5hbmNob3JOb2RlLGIuYW5jaG9yT2Zmc2V0LGIuZm9jdXNOb2RlLGIuZm9jdXNPZmZzZXQpLGQuY29sbGFwc2VkIT09dGhpcy5pc0NvbGxhcHNlZCYmZC5zZXRTdGFydEFuZEVuZChiLmZvY3VzTm9kZSxiLmZvY3VzT2Zmc2V0LGIuYW5jaG9yTm9kZSxiLmFuY2hvck9mZnNldCksZH0pLHIucHJvdG90eXBlPWEuc2VsZWN0aW9uUHJvdG90eXBlLGJiPVtdLGNiPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZTtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHI/KGEucmVmcmVzaCgpLGEpOihhPWQoYSxcImdldE5hdGl2ZVNlbGVjdGlvblwiKSxiPXQoYSksYz1IKGEpLGU9UD9mKGEpOm51bGwsYj8oYi5uYXRpdmVTZWxlY3Rpb249YyxiLmRvY1NlbGVjdGlvbj1lLGIucmVmcmVzaCgpKTooYj1uZXcgcihjLGUsYSksYmIucHVzaCh7d2luOmEsc2VsZWN0aW9uOmJ9KSksYil9LGEuZ2V0U2VsZWN0aW9uPWNiLGEuZ2V0SWZyYW1lU2VsZWN0aW9uPWZ1bmN0aW9uKGMpe3JldHVybiBiLmRlcHJlY2F0aW9uTm90aWNlKFwiZ2V0SWZyYW1lU2VsZWN0aW9uKClcIixcImdldFNlbGVjdGlvbihpZnJhbWVFbClcIiksYS5nZXRTZWxlY3Rpb24oQS5nZXRJZnJhbWVXaW5kb3coYykpfSxkYj1yLnByb3RvdHlwZSwhUSYmVSYmQi5hcmVIb3N0TWV0aG9kcyhSLFtcInJlbW92ZUFsbFJhbmdlc1wiLFwiYWRkUmFuZ2VcIl0pKWRiLnJlbW92ZUFsbFJhbmdlcz1mdW5jdGlvbigpe3RoaXMubmF0aXZlU2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpLGoodGhpcyl9LGViPWZ1bmN0aW9uKGEsYil7WihhLm5hdGl2ZVNlbGVjdGlvbixiKSxhLnJlZnJlc2goKX0sZGIuYWRkUmFuZ2U9Vz9mdW5jdGlvbihiLGQpe3ZhciBlLGY7JCYmUCYmdGhpcy5kb2NTZWxlY3Rpb24udHlwZT09Sz9xKHRoaXMsYik6YyhkKSYmVj9lYih0aGlzLGIpOihYP2U9dGhpcy5yYW5nZUNvdW50Oih0aGlzLnJlbW92ZUFsbFJhbmdlcygpLGU9MCksdGhpcy5uYXRpdmVTZWxlY3Rpb24uYWRkUmFuZ2UoayhiKS5jbG9uZVJhbmdlKCkpLHRoaXMucmFuZ2VDb3VudD10aGlzLm5hdGl2ZVNlbGVjdGlvbi5yYW5nZUNvdW50LHRoaXMucmFuZ2VDb3VudD09ZSsxPyhhLmNvbmZpZy5jaGVja1NlbGVjdGlvblJhbmdlcyYmKGY9YWIodGhpcy5uYXRpdmVTZWxlY3Rpb24sdGhpcy5yYW5nZUNvdW50LTEpLGYmJiFOKGYsYikmJihiPW5ldyBFKGYpKSksdGhpcy5fcmFuZ2VzW3RoaXMucmFuZ2VDb3VudC0xXT1iLGgodGhpcyxiLGhiKHRoaXMubmF0aXZlU2VsZWN0aW9uKSksdGhpcy5pc0NvbGxhcHNlZD1JKHRoaXMpKTp0aGlzLnJlZnJlc2goKSl9OmZ1bmN0aW9uKGEsYil7YyhiKSYmVj9lYih0aGlzLGEpOih0aGlzLm5hdGl2ZVNlbGVjdGlvbi5hZGRSYW5nZShrKGEpKSx0aGlzLnJlZnJlc2goKSl9LGRiLnNldFJhbmdlcz1mdW5jdGlvbihhKXtpZigkJiZQJiZhLmxlbmd0aD4xKXUodGhpcyxhKTtlbHNle3RoaXMucmVtb3ZlQWxsUmFuZ2VzKCk7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aDtjPmI7KytiKXRoaXMuYWRkUmFuZ2UoYVtiXSl9fTtlbHNle2lmKCEoQyhSLFwiZW1wdHlcIikmJkMoUyxcInNlbGVjdFwiKSYmJCYmUSkpcmV0dXJuIGIuZmFpbChcIk5vIG1lYW5zIG9mIHNlbGVjdGluZyBhIFJhbmdlIG9yIFRleHRSYW5nZSB3YXMgZm91bmRcIiksITE7ZGIucmVtb3ZlQWxsUmFuZ2VzPWZ1bmN0aW9uKCl7dmFyIGEsYixjO3RyeXt0aGlzLmRvY1NlbGVjdGlvbi5lbXB0eSgpLFwiTm9uZVwiIT10aGlzLmRvY1NlbGVjdGlvbi50eXBlJiYodGhpcy5hbmNob3JOb2RlP2E9TCh0aGlzLmFuY2hvck5vZGUpOnRoaXMuZG9jU2VsZWN0aW9uLnR5cGU9PUsmJihiPXRoaXMuZG9jU2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCksYi5sZW5ndGgmJihhPUwoYi5pdGVtKDApKSkpLGEmJihjPU0oYSkuY3JlYXRlVGV4dFJhbmdlKCksYy5zZWxlY3QoKSx0aGlzLmRvY1NlbGVjdGlvbi5lbXB0eSgpKSl9Y2F0Y2goZCl7fWoodGhpcyl9LGRiLmFkZFJhbmdlPWZ1bmN0aW9uKGIpe3RoaXMuZG9jU2VsZWN0aW9uLnR5cGU9PUs/cSh0aGlzLGIpOihhLldyYXBwZWRUZXh0UmFuZ2UucmFuZ2VUb1RleHRSYW5nZShiKS5zZWxlY3QoKSx0aGlzLl9yYW5nZXNbMF09Yix0aGlzLnJhbmdlQ291bnQ9MSx0aGlzLmlzQ29sbGFwc2VkPXRoaXMuX3Jhbmdlc1swXS5jb2xsYXBzZWQsaCh0aGlzLGIsITEpKX0sZGIuc2V0UmFuZ2VzPWZ1bmN0aW9uKGEpe3RoaXMucmVtb3ZlQWxsUmFuZ2VzKCk7dmFyIGI9YS5sZW5ndGg7Yj4xP3UodGhpcyxhKTpiJiZ0aGlzLmFkZFJhbmdlKGFbMF0pfX1pZihkYi5nZXRSYW5nZUF0PWZ1bmN0aW9uKGEpe2lmKDA+YXx8YT49dGhpcy5yYW5nZUNvdW50KXRocm93IG5ldyBGKFwiSU5ERVhfU0laRV9FUlJcIik7cmV0dXJuIHRoaXMuX3Jhbmdlc1thXS5jbG9uZVJhbmdlKCl9LFEpZmI9ZnVuY3Rpb24oYil7dmFyIGM7YS5pc1NlbGVjdGlvblZhbGlkKGIud2luKT9jPWIuZG9jU2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk6KGM9TShiLndpbi5kb2N1bWVudCkuY3JlYXRlVGV4dFJhbmdlKCksYy5jb2xsYXBzZSghMCkpLGIuZG9jU2VsZWN0aW9uLnR5cGU9PUs/cChiKTpuKGMpP28oYixjKTpqKGIpfTtlbHNlIGlmKEMoUixcImdldFJhbmdlQXRcIikmJnR5cGVvZiBSLnJhbmdlQ291bnQ9PXopZmI9ZnVuY3Rpb24oYil7aWYoJCYmUCYmYi5kb2NTZWxlY3Rpb24udHlwZT09SylwKGIpO2Vsc2UgaWYoYi5fcmFuZ2VzLmxlbmd0aD1iLnJhbmdlQ291bnQ9Yi5uYXRpdmVTZWxlY3Rpb24ucmFuZ2VDb3VudCxiLnJhbmdlQ291bnQpe2Zvcih2YXIgYz0wLGQ9Yi5yYW5nZUNvdW50O2Q+YzsrK2MpYi5fcmFuZ2VzW2NdPW5ldyBhLldyYXBwZWRSYW5nZShiLm5hdGl2ZVNlbGVjdGlvbi5nZXRSYW5nZUF0KGMpKTtoKGIsYi5fcmFuZ2VzW2IucmFuZ2VDb3VudC0xXSxoYihiLm5hdGl2ZVNlbGVjdGlvbikpLGIuaXNDb2xsYXBzZWQ9SShiKX1lbHNlIGooYil9O2Vsc2V7aWYoIVV8fHR5cGVvZiBSLmlzQ29sbGFwc2VkIT15fHx0eXBlb2YgUy5jb2xsYXBzZWQhPXl8fCFKLmltcGxlbWVudHNEb21SYW5nZSlyZXR1cm4gYi5mYWlsKFwiTm8gbWVhbnMgb2Ygb2J0YWluaW5nIGEgUmFuZ2Ugb3IgVGV4dFJhbmdlIGZyb20gdGhlIHVzZXIncyBzZWxlY3Rpb24gd2FzIGZvdW5kXCIpLCExO2ZiPWZ1bmN0aW9uKGEpe3ZhciBiLGM9YS5uYXRpdmVTZWxlY3Rpb247Yy5hbmNob3JOb2RlPyhiPWFiKGMsMCksYS5fcmFuZ2VzPVtiXSxhLnJhbmdlQ291bnQ9MSxpKGEpLGEuaXNDb2xsYXBzZWQ9SShhKSk6aihhKX19ZGIucmVmcmVzaD1mdW5jdGlvbihhKXt2YXIgYixjPWE/dGhpcy5fcmFuZ2VzLnNsaWNlKDApOm51bGwsZD10aGlzLmFuY2hvck5vZGUsZT10aGlzLmFuY2hvck9mZnNldDtpZihmYih0aGlzKSxhKXtpZihiPWMubGVuZ3RoLGIhPXRoaXMuX3Jhbmdlcy5sZW5ndGgpcmV0dXJuITA7aWYodGhpcy5hbmNob3JOb2RlIT1kfHx0aGlzLmFuY2hvck9mZnNldCE9ZSlyZXR1cm4hMDtmb3IoO2ItLTspaWYoIU4oY1tiXSx0aGlzLl9yYW5nZXNbYl0pKXJldHVybiEwO3JldHVybiExfX0sZ2I9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5nZXRBbGxSYW5nZXMoKTtmb3IoYS5yZW1vdmVBbGxSYW5nZXMoKSxjPTAsZD1lLmxlbmd0aDtkPmM7KytjKU4oYixlW2NdKXx8YS5hZGRSYW5nZShlW2NdKTthLnJhbmdlQ291bnR8fGooYSl9LGRiLnJlbW92ZVJhbmdlPSQmJlA/ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaTtpZih0aGlzLmRvY1NlbGVjdGlvbi50eXBlPT1LKXtmb3IoYj10aGlzLmRvY1NlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLGM9bShhKSxkPUwoYi5pdGVtKDApKSxlPU0oZCkuY3JlYXRlQ29udHJvbFJhbmdlKCksZz0hMSxoPTAsaT1iLmxlbmd0aDtpPmg7KytoKWY9Yi5pdGVtKGgpLGYhPT1jfHxnP2UuYWRkKGIuaXRlbShoKSk6Zz0hMDtlLnNlbGVjdCgpLHAodGhpcyl9ZWxzZSBnYih0aGlzLGEpfTpmdW5jdGlvbihhKXtnYih0aGlzLGEpfSwhUSYmVSYmSi5pbXBsZW1lbnRzRG9tUmFuZ2U/KGhiPWcsZGIuaXNCYWNrd2FyZD1mdW5jdGlvbigpe3JldHVybiBoYih0aGlzKX0pOmhiPWRiLmlzQmFja3dhcmQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGIuaXNCYWNrd2FyZHM9ZGIuaXNCYWNrd2FyZCxkYi50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBhLGIsYz1bXTtmb3IoYT0wLGI9dGhpcy5yYW5nZUNvdW50O2I+YTsrK2EpY1thXT1cIlwiK3RoaXMuX3Jhbmdlc1thXTtyZXR1cm4gYy5qb2luKFwiXCIpfSxkYi5jb2xsYXBzZT1mdW5jdGlvbihiLGMpe3YodGhpcyxiKTt2YXIgZD1hLmNyZWF0ZVJhbmdlKGIpO2QuY29sbGFwc2VUb1BvaW50KGIsYyksdGhpcy5zZXRTaW5nbGVSYW5nZShkKSx0aGlzLmlzQ29sbGFwc2VkPSEwfSxkYi5jb2xsYXBzZVRvU3RhcnQ9ZnVuY3Rpb24oKXtpZighdGhpcy5yYW5nZUNvdW50KXRocm93IG5ldyBGKFwiSU5WQUxJRF9TVEFURV9FUlJcIik7dmFyIGE9dGhpcy5fcmFuZ2VzWzBdO3RoaXMuY29sbGFwc2UoYS5zdGFydENvbnRhaW5lcixhLnN0YXJ0T2Zmc2V0KX0sZGIuY29sbGFwc2VUb0VuZD1mdW5jdGlvbigpe2lmKCF0aGlzLnJhbmdlQ291bnQpdGhyb3cgbmV3IEYoXCJJTlZBTElEX1NUQVRFX0VSUlwiKTt2YXIgYT10aGlzLl9yYW5nZXNbdGhpcy5yYW5nZUNvdW50LTFdO3RoaXMuY29sbGFwc2UoYS5lbmRDb250YWluZXIsYS5lbmRPZmZzZXQpfSxkYi5zZWxlY3RBbGxDaGlsZHJlbj1mdW5jdGlvbihiKXt2KHRoaXMsYik7dmFyIGM9YS5jcmVhdGVSYW5nZShiKTtjLnNlbGVjdE5vZGVDb250ZW50cyhiKSx0aGlzLnNldFNpbmdsZVJhbmdlKGMpfSxkYi5kZWxldGVGcm9tRG9jdW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlO2lmKCQmJlAmJnRoaXMuZG9jU2VsZWN0aW9uLnR5cGU9PUspe2ZvcihhPXRoaXMuZG9jU2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7YS5sZW5ndGg7KWI9YS5pdGVtKDApLGEucmVtb3ZlKGIpLGIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTt0aGlzLnJlZnJlc2goKX1lbHNlIGlmKHRoaXMucmFuZ2VDb3VudCYmKGM9dGhpcy5nZXRBbGxSYW5nZXMoKSxjLmxlbmd0aCkpe2Zvcih0aGlzLnJlbW92ZUFsbFJhbmdlcygpLGQ9MCxlPWMubGVuZ3RoO2U+ZDsrK2QpY1tkXS5kZWxldGVDb250ZW50cygpO3RoaXMuYWRkUmFuZ2UoY1tlLTFdKX19LGRiLmVhY2hSYW5nZT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ9dGhpcy5fcmFuZ2VzLmxlbmd0aDtkPmM7KytjKWlmKGEodGhpcy5nZXRSYW5nZUF0KGMpKSlyZXR1cm4gYn0sZGIuZ2V0QWxsUmFuZ2VzPWZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIHRoaXMuZWFjaFJhbmdlKGZ1bmN0aW9uKGIpe2EucHVzaChiKX0pLGF9LGRiLnNldFNpbmdsZVJhbmdlPWZ1bmN0aW9uKGEsYil7dGhpcy5yZW1vdmVBbGxSYW5nZXMoKSx0aGlzLmFkZFJhbmdlKGEsYil9LGRiLmNhbGxNZXRob2RPbkVhY2hSYW5nZT1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO3JldHVybiB0aGlzLmVhY2hSYW5nZShmdW5jdGlvbihkKXtjLnB1c2goZFthXS5hcHBseShkLGIpKX0pLGN9LGRiLnNldFN0YXJ0PXcoITApLGRiLnNldEVuZD13KCExKSxhLnJhbmdlUHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbihhKXtjYih0aGlzLmdldERvY3VtZW50KCkpLnNldFNpbmdsZVJhbmdlKHRoaXMsYSl9LGRiLmNoYW5nZUVhY2hSYW5nZT1mdW5jdGlvbihhKXt2YXIgYj1bXSxjPXRoaXMuaXNCYWNrd2FyZCgpO3RoaXMuZWFjaFJhbmdlKGZ1bmN0aW9uKGMpe2EoYyksYi5wdXNoKGMpfSksdGhpcy5yZW1vdmVBbGxSYW5nZXMoKSxjJiYxPT1iLmxlbmd0aD90aGlzLmFkZFJhbmdlKGJbMF0sXCJiYWNrd2FyZFwiKTp0aGlzLnNldFJhbmdlcyhiKX0sZGIuY29udGFpbnNOb2RlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaFJhbmdlKGZ1bmN0aW9uKGMpe3JldHVybiBjLmNvbnRhaW5zTm9kZShhLGIpfSwhMCl8fCExfSxkYi5nZXRCb29rbWFyaz1mdW5jdGlvbihhKXtyZXR1cm57YmFja3dhcmQ6dGhpcy5pc0JhY2t3YXJkKCkscmFuZ2VCb29rbWFya3M6dGhpcy5jYWxsTWV0aG9kT25FYWNoUmFuZ2UoXCJnZXRCb29rbWFya1wiLFthXSl9fSxkYi5tb3ZlVG9Cb29rbWFyaz1mdW5jdGlvbihiKXt2YXIgYyxkLGUsZj1bXTtmb3IoYz0wO2Q9Yi5yYW5nZUJvb2ttYXJrc1tjKytdOyllPWEuY3JlYXRlUmFuZ2UodGhpcy53aW4pLGUubW92ZVRvQm9va21hcmsoZCksZi5wdXNoKGUpO2IuYmFja3dhcmQ/dGhpcy5zZXRTaW5nbGVSYW5nZShmWzBdLFwiYmFja3dhcmRcIik6dGhpcy5zZXRSYW5nZXMoZil9LGRiLnRvSHRtbD1mdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybiB0aGlzLmVhY2hSYW5nZShmdW5jdGlvbihiKXthLnB1c2goRC50b0h0bWwoYikpfSksYS5qb2luKFwiXCIpfSxKLmltcGxlbWVudHNUZXh0UmFuZ2UmJihkYi5nZXROYXRpdmVUZXh0UmFuZ2U9ZnVuY3Rpb24oKXt2YXIgYyxkO2lmKGM9dGhpcy5kb2NTZWxlY3Rpb24pe2lmKGQ9Yy5jcmVhdGVSYW5nZSgpLG4oZCkpcmV0dXJuIGQ7dGhyb3cgYi5jcmVhdGVFcnJvcihcImdldE5hdGl2ZVRleHRSYW5nZTogc2VsZWN0aW9uIGlzIGEgY29udHJvbCBzZWxlY3Rpb25cIil9aWYodGhpcy5yYW5nZUNvdW50PjApcmV0dXJuIGEuV3JhcHBlZFRleHRSYW5nZS5yYW5nZVRvVGV4dFJhbmdlKHRoaXMuZ2V0UmFuZ2VBdCgwKSk7dGhyb3cgYi5jcmVhdGVFcnJvcihcImdldE5hdGl2ZVRleHRSYW5nZTogc2VsZWN0aW9uIGNvbnRhaW5zIG5vIHJhbmdlXCIpfSksZGIuZ2V0TmFtZT1mdW5jdGlvbigpe3JldHVyblwiV3JhcHBlZFNlbGVjdGlvblwifSxkYi5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHgodGhpcyl9LGRiLmRldGFjaD1mdW5jdGlvbigpe3QodGhpcy53aW4sXCJkZWxldGVcIikscyh0aGlzKX0sci5kZXRhY2hBbGw9ZnVuY3Rpb24oKXt0KG51bGwsXCJkZWxldGVBbGxcIil9LHIuaW5zcGVjdD14LHIuaXNEaXJlY3Rpb25CYWNrd2FyZD1jLGEuU2VsZWN0aW9uPXIsYS5zZWxlY3Rpb25Qcm90b3R5cGU9ZGIsYS5hZGRTaGltTGlzdGVuZXIoZnVuY3Rpb24oYSl7dm9pZCAwPT09YS5nZXRTZWxlY3Rpb24mJihhLmdldFNlbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiBjYihhKX0pLGE9bnVsbH0pfSksSCl9LHRoaXMpLGZ1bmN0aW9uKGEsYil7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJyYW5neVwiXSxhKTphKGIucmFuZ3kpfShmdW5jdGlvbihhKXthLmNyZWF0ZU1vZHVsZShcIlNhdmVSZXN0b3JlXCIsW1wiV3JhcHBlZFJhbmdlXCJdLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe3JldHVybihifHxkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQoYSl9ZnVuY3Rpb24gZChhLGIpe3ZhciBjLGQ9XCJzZWxlY3Rpb25Cb3VuZGFyeV9cIisgK25ldyBEYXRlK1wiX1wiKyhcIlwiK01hdGgucmFuZG9tKCkpLnNsaWNlKDIpLGU9by5nZXREb2N1bWVudChhLnN0YXJ0Q29udGFpbmVyKSxmPWEuY2xvbmVSYW5nZSgpO3JldHVybiBmLmNvbGxhcHNlKGIpLGM9ZS5jcmVhdGVFbGVtZW50KFwic3BhblwiKSxjLmlkPWQsYy5zdHlsZS5saW5lSGVpZ2h0PVwiMFwiLGMuc3R5bGUuZGlzcGxheT1cIm5vbmVcIixjLmNsYXNzTmFtZT1cInJhbmd5U2VsZWN0aW9uQm91bmRhcnlcIixjLmFwcGVuZENoaWxkKGUuY3JlYXRlVGV4dE5vZGUocCkpLGYuaW5zZXJ0Tm9kZShjKSxjfWZ1bmN0aW9uIGUoYSxkLGUsZil7dmFyIGc9YyhlLGEpO2c/KGRbZj9cInNldFN0YXJ0QmVmb3JlXCI6XCJzZXRFbmRCZWZvcmVcIl0oZyksZy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGcpKTpiLndhcm4oXCJNYXJrZXIgZWxlbWVudCBoYXMgYmVlbiByZW1vdmVkLiBDYW5ub3QgcmVzdG9yZSBzZWxlY3Rpb24uXCIpfWZ1bmN0aW9uIGYoYSxiKXtyZXR1cm4gYi5jb21wYXJlQm91bmRhcnlQb2ludHMoYS5TVEFSVF9UT19TVEFSVCxhKX1mdW5jdGlvbiBnKGIsYyl7dmFyIGUsZixnPWEuRG9tUmFuZ2UuZ2V0UmFuZ2VEb2N1bWVudChiKSxoPVwiXCIrYjtyZXR1cm4gYi5jb2xsYXBzZWQ/KGY9ZChiLCExKSx7ZG9jdW1lbnQ6ZyxtYXJrZXJJZDpmLmlkLGNvbGxhcHNlZDohMH0pOihmPWQoYiwhMSksZT1kKGIsITApLHtkb2N1bWVudDpnLHN0YXJ0TWFya2VySWQ6ZS5pZCxlbmRNYXJrZXJJZDpmLmlkLGNvbGxhcHNlZDohMSxiYWNrd2FyZDpjLHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuXCJvcmlnaW5hbCB0ZXh0OiAnXCIraCtcIicsIG5ldyB0ZXh0OiAnXCIrYitcIidcIn19KX1mdW5jdGlvbiBoKGQsZil7dmFyIGcsaCxpLGo9ZC5kb2N1bWVudDtyZXR1cm4gdm9pZCAwPT09ZiYmKGY9ITApLGc9YS5jcmVhdGVSYW5nZShqKSxkLmNvbGxhcHNlZD8oaD1jKGQubWFya2VySWQsaiksaD8oaC5zdHlsZS5kaXNwbGF5PVwiaW5saW5lXCIsaT1oLnByZXZpb3VzU2libGluZyxpJiYzPT1pLm5vZGVUeXBlPyhoLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaCksZy5jb2xsYXBzZVRvUG9pbnQoaSxpLmxlbmd0aCkpOihnLmNvbGxhcHNlQmVmb3JlKGgpLGgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChoKSkpOmIud2FybihcIk1hcmtlciBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWQuIENhbm5vdCByZXN0b3JlIHNlbGVjdGlvbi5cIikpOihlKGosZyxkLnN0YXJ0TWFya2VySWQsITApLGUoaixnLGQuZW5kTWFya2VySWQsITEpKSxmJiZnLm5vcm1hbGl6ZUJvdW5kYXJpZXMoKSxnfWZ1bmN0aW9uIGkoYixkKXt2YXIgZSxoLGksaixrPVtdO2ZvcihiPWIuc2xpY2UoMCksYi5zb3J0KGYpLGk9MCxqPWIubGVuZ3RoO2o+aTsrK2kpa1tpXT1nKGJbaV0sZCk7Zm9yKGk9ai0xO2k+PTA7LS1pKWU9YltpXSxoPWEuRG9tUmFuZ2UuZ2V0UmFuZ2VEb2N1bWVudChlKSxlLmNvbGxhcHNlZD9lLmNvbGxhcHNlQWZ0ZXIoYyhrW2ldLm1hcmtlcklkLGgpKTooZS5zZXRFbmRCZWZvcmUoYyhrW2ldLmVuZE1hcmtlcklkLGgpKSxlLnNldFN0YXJ0QWZ0ZXIoYyhrW2ldLnN0YXJ0TWFya2VySWQsaCkpKTtyZXR1cm4ga31mdW5jdGlvbiBqKGMpe3ZhciBkLGUsZixnO3JldHVybiBhLmlzU2VsZWN0aW9uVmFsaWQoYyk/KGQ9YS5nZXRTZWxlY3Rpb24oYyksZT1kLmdldEFsbFJhbmdlcygpLGY9MT09ZS5sZW5ndGgmJmQuaXNCYWNrd2FyZCgpLGc9aShlLGYpLGY/ZC5zZXRTaW5nbGVSYW5nZShlWzBdLFwiYmFja3dhcmRcIik6ZC5zZXRSYW5nZXMoZSkse3dpbjpjLHJhbmdlSW5mb3M6ZyxyZXN0b3JlZDohMX0pOihiLndhcm4oXCJDYW5ub3Qgc2F2ZSBzZWxlY3Rpb24uIFRoaXMgdXN1YWxseSBoYXBwZW5zIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBjb2xsYXBzZWQgYW5kIHRoZSBzZWxlY3Rpb24gZG9jdW1lbnQgaGFzIGxvc3QgZm9jdXMuXCIpLG51bGwpfWZ1bmN0aW9uIGsoYSl7dmFyIGIsYz1bXSxkPWEubGVuZ3RoO2ZvcihiPWQtMTtiPj0wO2ItLSljW2JdPWgoYVtiXSwhMCk7cmV0dXJuIGN9ZnVuY3Rpb24gbChiLGMpe3ZhciBkLGUsZixnO2IucmVzdG9yZWR8fChkPWIucmFuZ2VJbmZvcyxlPWEuZ2V0U2VsZWN0aW9uKGIud2luKSxmPWsoZCksZz1kLmxlbmd0aCwxPT1nJiZjJiZhLmZlYXR1cmVzLnNlbGVjdGlvbkhhc0V4dGVuZCYmZFswXS5iYWNrd2FyZD8oZS5yZW1vdmVBbGxSYW5nZXMoKSxlLmFkZFJhbmdlKGZbMF0sITApKTplLnNldFJhbmdlcyhmKSxiLnJlc3RvcmVkPSEwKX1mdW5jdGlvbiBtKGEsYil7dmFyIGQ9YyhiLGEpO2QmJmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKX1mdW5jdGlvbiBuKGEpe3ZhciBiLGMsZCxlPWEucmFuZ2VJbmZvcztmb3IoYj0wLGM9ZS5sZW5ndGg7Yz5iOysrYilkPWVbYl0sZC5jb2xsYXBzZWQ/bShhLmRvYyxkLm1hcmtlcklkKToobShhLmRvYyxkLnN0YXJ0TWFya2VySWQpLG0oYS5kb2MsZC5lbmRNYXJrZXJJZCkpfXZhciBvPWEuZG9tLHA9XCLvu79cIjthLnV0aWwuZXh0ZW5kKGEse3NhdmVSYW5nZTpnLHJlc3RvcmVSYW5nZTpoLHNhdmVSYW5nZXM6aSxyZXN0b3JlUmFuZ2VzOmssc2F2ZVNlbGVjdGlvbjpqLHJlc3RvcmVTZWxlY3Rpb246bCxyZW1vdmVNYXJrZXJFbGVtZW50Om0scmVtb3ZlTWFya2VyczpufSl9KX0sdGhpcyksQmFzZT1mdW5jdGlvbigpe30sQmFzZS5leHRlbmQ9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj1CYXNlLnByb3RvdHlwZS5leHRlbmQ7cmV0dXJuIEJhc2UuX3Byb3RvdHlwaW5nPSEwLGM9bmV3IHRoaXMsZi5jYWxsKGMsYSksYy5iYXNlPWZ1bmN0aW9uKCl7fSxkZWxldGUgQmFzZS5fcHJvdG90eXBpbmcsZD1jLmNvbnN0cnVjdG9yLGU9Yy5jb25zdHJ1Y3Rvcj1mdW5jdGlvbigpe2lmKCFCYXNlLl9wcm90b3R5cGluZylpZih0aGlzLl9jb25zdHJ1Y3Rpbmd8fHRoaXMuY29uc3RydWN0b3I9PWUpdGhpcy5fY29uc3RydWN0aW5nPSEwLGQuYXBwbHkodGhpcyxhcmd1bWVudHMpLGRlbGV0ZSB0aGlzLl9jb25zdHJ1Y3Rpbmc7ZWxzZSBpZihudWxsIT1hcmd1bWVudHNbMF0pcmV0dXJuKGFyZ3VtZW50c1swXS5leHRlbmR8fGYpLmNhbGwoYXJndW1lbnRzWzBdLGMpfSxlLmFuY2VzdG9yPXRoaXMsZS5leHRlbmQ9dGhpcy5leHRlbmQsZS5mb3JFYWNoPXRoaXMuZm9yRWFjaCxlLmltcGxlbWVudD10aGlzLmltcGxlbWVudCxlLnByb3RvdHlwZT1jLGUudG9TdHJpbmc9dGhpcy50b1N0cmluZyxlLnZhbHVlT2Y9ZnVuY3Rpb24oYSl7cmV0dXJuXCJvYmplY3RcIj09YT9lOmQudmFsdWVPZigpfSxmLmNhbGwoZSxiKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmluaXQmJmUuaW5pdCgpLGV9LEJhc2UucHJvdG90eXBlPXtleHRlbmQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnLGgsaTtpZihhcmd1bWVudHMubGVuZ3RoPjEpYz10aGlzW2FdLCFjfHxcImZ1bmN0aW9uXCIhPXR5cGVvZiBifHxjLnZhbHVlT2YmJmMudmFsdWVPZigpPT1iLnZhbHVlT2YoKXx8IS9cXGJiYXNlXFxiLy50ZXN0KGIpfHwoZD1iLnZhbHVlT2YoKSxiPWZ1bmN0aW9uKCl7dmFyIGEsYj10aGlzLmJhc2V8fEJhc2UucHJvdG90eXBlLmJhc2U7cmV0dXJuIHRoaXMuYmFzZT1jLGE9ZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5iYXNlPWIsYX0sYi52YWx1ZU9mPWZ1bmN0aW9uKGEpe3JldHVyblwib2JqZWN0XCI9PWE/YjpkfSxiLnRvU3RyaW5nPUJhc2UudG9TdHJpbmcpLHRoaXNbYV09YjtlbHNlIGlmKGEpe2ZvcihlPUJhc2UucHJvdG90eXBlLmV4dGVuZCxCYXNlLl9wcm90b3R5cGluZ3x8XCJmdW5jdGlvblwiPT10eXBlb2YgdGhpc3x8KGU9dGhpcy5leHRlbmR8fGUpLGY9e3RvU291cmNlOm51bGx9LGc9W1wiY29uc3RydWN0b3JcIixcInRvU3RyaW5nXCIsXCJ2YWx1ZU9mXCJdLGg9QmFzZS5fcHJvdG90eXBpbmc/MDoxO2k9Z1toKytdOylhW2ldIT1mW2ldJiZlLmNhbGwodGhpcyxpLGFbaV0pO2ZvcihpIGluIGEpZltpXXx8ZS5jYWxsKHRoaXMsaSxhW2ldKX1yZXR1cm4gdGhpc319LEJhc2U9QmFzZS5leHRlbmQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5leHRlbmQoYXJndW1lbnRzWzBdKX19LHthbmNlc3RvcjpPYmplY3QsdmVyc2lvbjpcIjEuMVwiLGZvckVhY2g6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCBpbiBhKXZvaWQgMD09PXRoaXMucHJvdG90eXBlW2RdJiZiLmNhbGwoYyxhW2RdLGQsYSl9LGltcGxlbWVudDpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8YXJndW1lbnRzLmxlbmd0aDthKyspXCJmdW5jdGlvblwiPT10eXBlb2YgYXJndW1lbnRzW2FdP2FyZ3VtZW50c1thXSh0aGlzLnByb3RvdHlwZSk6dGhpcy5wcm90b3R5cGUuZXh0ZW5kKGFyZ3VtZW50c1thXSk7cmV0dXJuIHRoaXN9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWVPZigpK1wiXCJ9fSksd3lzaWh0bWw1LmJyb3dzZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybisoL2lwYWR8aXBob25lfGlwb2QvLnRlc3QoYSkmJmEubWF0Y2goLyBvcyAoXFxkKykuKz8gbGlrZSBtYWMgb3MgeC8pfHxbdm9pZCAwLDBdKVsxXX1mdW5jdGlvbiBiKGEpe3JldHVybisoYS5tYXRjaCgvYW5kcm9pZCAoXFxkKykvKXx8W3ZvaWQgMCwwXSlbMV19ZnVuY3Rpb24gYyhhLGIpe3ZhciBjLGQ9LTE7cmV0dXJuXCJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXJcIj09bmF2aWdhdG9yLmFwcE5hbWU/Yz1SZWdFeHAoXCJNU0lFIChbMC05XXsxLH1bLjAtOV17MCx9KVwiKTpcIk5ldHNjYXBlXCI9PW5hdmlnYXRvci5hcHBOYW1lJiYoYz1SZWdFeHAoXCJUcmlkZW50Ly4qcnY6KFswLTldezEsfVsuMC05XXswLH0pXCIpKSxjJiZudWxsIT1jLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPXBhcnNlRmxvYXQoUmVnRXhwLiQxKSksLTE9PT1kPyExOmE/Yj9cIjxcIj09PWI/ZD5hOlwiPlwiPT09Yj9hPmQ6XCI8PVwiPT09Yj9kPj1hOlwiPj1cIj09PWI/YT49ZDp2b2lkIDA6YT09PWQ6ITB9dmFyIGQ9bmF2aWdhdG9yLnVzZXJBZ2VudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksZj0tMSE9PWQuaW5kZXhPZihcIkdlY2tvXCIpJiYtMT09PWQuaW5kZXhPZihcIktIVE1MXCIpLGc9LTEhPT1kLmluZGV4T2YoXCJBcHBsZVdlYktpdC9cIiksaD0tMSE9PWQuaW5kZXhPZihcIkNocm9tZS9cIiksaT0tMSE9PWQuaW5kZXhPZihcIk9wZXJhL1wiKTtyZXR1cm57VVNFUl9BR0VOVDpkLHN1cHBvcnRlZDpmdW5jdGlvbigpe3ZhciBjPXRoaXMuVVNFUl9BR0VOVC50b0xvd2VyQ2FzZSgpLGQ9XCJjb250ZW50RWRpdGFibGVcImluIGUsZj1kb2N1bWVudC5leGVjQ29tbWFuZCYmZG9jdW1lbnQucXVlcnlDb21tYW5kU3VwcG9ydGVkJiZkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSxnPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3ImJmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwsaD10aGlzLmlzSW9zKCkmJmEoYyk8NXx8dGhpcy5pc0FuZHJvaWQoKSYmYihjKTw0fHwtMSE9PWMuaW5kZXhPZihcIm9wZXJhIG1vYmlcIil8fC0xIT09Yy5pbmRleE9mKFwiaHB3b3MvXCIpO3JldHVybiBkJiZmJiZnJiYhaH0saXNUb3VjaERldmljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN1cHBvcnRzRXZlbnQoXCJ0b3VjaG1vdmVcIil9LGlzSW9zOmZ1bmN0aW9uKCl7cmV0dXJuL2lwYWR8aXBob25lfGlwb2QvaS50ZXN0KHRoaXMuVVNFUl9BR0VOVCl9LGlzQW5kcm9pZDpmdW5jdGlvbigpe3JldHVybi0xIT09dGhpcy5VU0VSX0FHRU5ULmluZGV4T2YoXCJBbmRyb2lkXCIpfSxzdXBwb3J0c1NhbmRib3hlZElmcmFtZXM6ZnVuY3Rpb24oKXtyZXR1cm4gYygpfSx0aHJvd3NNaXhlZENvbnRlbnRXYXJuaW5nV2hlbklmcmFtZVNyY0lzRW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hKFwicXVlcnlTZWxlY3RvclwiaW4gZG9jdW1lbnQpfSxkaXNwbGF5c0NhcmV0SW5FbXB0eUNvbnRlbnRFZGl0YWJsZUNvcnJlY3RseTpmdW5jdGlvbigpe3JldHVybiBjKCl9LGhhc0N1cnJlbnRTdHlsZVByb3BlcnR5OmZ1bmN0aW9uKCl7cmV0dXJuXCJjdXJyZW50U3R5bGVcImluIGV9LGhhc0hpc3RvcnlJc3N1ZTpmdW5jdGlvbigpe3JldHVybiBmJiZcIk1hY1wiPT09bmF2aWdhdG9yLnBsYXRmb3JtLnN1YnN0cigwLDMpfSxpbnNlcnRzTGluZUJyZWFrc09uUmV0dXJuOmZ1bmN0aW9uKCl7cmV0dXJuIGZ9LHN1cHBvcnRzUGxhY2Vob2xkZXJBdHRyaWJ1dGVPbjpmdW5jdGlvbihhKXtyZXR1cm5cInBsYWNlaG9sZGVyXCJpbiBhfSxzdXBwb3J0c0V2ZW50OmZ1bmN0aW9uKGEpe3JldHVyblwib25cIithIGluIGV8fGZ1bmN0aW9uKCl7cmV0dXJuIGUuc2V0QXR0cmlidXRlKFwib25cIithLFwicmV0dXJuO1wiKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBlW1wib25cIithXX0oKX0sc3VwcG9ydHNFdmVudHNJbklmcmFtZUNvcnJlY3RseTpmdW5jdGlvbigpe3JldHVybiFpfSxzdXBwb3J0c0hUTUw1VGFnczpmdW5jdGlvbihhKXt2YXIgYj1hLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksYz1cIjxhcnRpY2xlPmZvbzwvYXJ0aWNsZT5cIjtyZXR1cm4gYi5pbm5lckhUTUw9YyxiLmlubmVySFRNTC50b0xvd2VyQ2FzZSgpPT09Y30sc3VwcG9ydHNDb21tYW5kOmZ1bmN0aW9uKCl7dmFyIGE9e2Zvcm1hdEJsb2NrOmMoMTAsXCI8PVwiKSxpbnNlcnRVbm9yZGVyZWRMaXN0OmMoKSxpbnNlcnRPcmRlcmVkTGlzdDpjKCl9LGI9e2luc2VydEhUTUw6Zn07cmV0dXJuIGZ1bmN0aW9uKGMsZCl7dmFyIGU9YVtkXTtpZighZSl7dHJ5e3JldHVybiBjLnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChkKX1jYXRjaChmKXt9dHJ5e3JldHVybiBjLnF1ZXJ5Q29tbWFuZEVuYWJsZWQoZCl9Y2F0Y2goZyl7cmV0dXJuISFiW2RdfX1yZXR1cm4hMX19KCksZG9lc0F1dG9MaW5raW5nSW5Db250ZW50RWRpdGFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gYygpfSxjYW5EaXNhYmxlQXV0b0xpbmtpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdXBwb3J0c0NvbW1hbmQoZG9jdW1lbnQsXCJBdXRvVXJsRGV0ZWN0XCIpfSxjbGVhcnNDb250ZW50RWRpdGFibGVDb3JyZWN0bHk6ZnVuY3Rpb24oKXtyZXR1cm4gZnx8aXx8Z30sc3VwcG9ydHNHZXRBdHRyaWJ1dGVDb3JyZWN0bHk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGRcIik7cmV0dXJuXCIxXCIhPWEuZ2V0QXR0cmlidXRlKFwicm93c3BhblwiKX0sY2FuU2VsZWN0SW1hZ2VzSW5Db250ZW50RWRpdGFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZnx8YygpfHxpfSxhdXRvU2Nyb2xsc1RvQ2FyZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hZ30sYXV0b0Nsb3Nlc1VuY2xvc2VkVGFnczpmdW5jdGlvbigpe3ZhciBhLGIsYz1lLmNsb25lTm9kZSghMSk7cmV0dXJuIGMuaW5uZXJIVE1MPVwiPHA+PGRpdj48L2Rpdj5cIixiPWMuaW5uZXJIVE1MLnRvTG93ZXJDYXNlKCksYT1cIjxwPjwvcD48ZGl2PjwvZGl2PlwiPT09Ynx8XCI8cD48ZGl2PjwvZGl2PjwvcD5cIj09PWIsdGhpcy5hdXRvQ2xvc2VzVW5jbG9zZWRUYWdzPWZ1bmN0aW9uKCl7cmV0dXJuIGF9LGF9LHN1cHBvcnRzTmF0aXZlR2V0RWxlbWVudHNCeUNsYXNzTmFtZTpmdW5jdGlvbigpe3JldHVybi0xIT09KGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUrXCJcIikuaW5kZXhPZihcIltuYXRpdmUgY29kZV1cIil9LHN1cHBvcnRzU2VsZWN0aW9uTW9kaWZ5OmZ1bmN0aW9uKCl7cmV0dXJuXCJnZXRTZWxlY3Rpb25cImluIHdpbmRvdyYmXCJtb2RpZnlcImluIHdpbmRvdy5nZXRTZWxlY3Rpb24oKX0sbmVlZHNTcGFjZUFmdGVyTGluZUJyZWFrOmZ1bmN0aW9uKCl7cmV0dXJuIGl9LHN1cHBvcnRzU3BlZWNoQXBpT246ZnVuY3Rpb24oYSl7dmFyIGI9ZC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyl8fFt2b2lkIDAsMF07cmV0dXJuIGJbMV0+PTExJiYoXCJvbndlYmtpdHNwZWVjaGNoYW5nZVwiaW4gYXx8XCJzcGVlY2hcImluIGEpfSxjcmFzaGVzV2hlbkRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKGEpe3JldHVybiBjKDkpJiYoXCJYTUxIdHRwUmVxdWVzdFwiPT09YXx8XCJYRG9tYWluUmVxdWVzdFwiPT09YSl9LGRvZXNBc3luY0ZvY3VzOmZ1bmN0aW9uKCl7cmV0dXJuIGMoKX0saGFzUHJvYmxlbXNTZXR0aW5nQ2FyZXRBZnRlckltZzpmdW5jdGlvbigpe3JldHVybiBjKCl9LGhhc1VuZG9JbkNvbnRleHRNZW51OmZ1bmN0aW9uKCl7cmV0dXJuIGZ8fGh8fGl9LGhhc0luc2VydE5vZGVJc3N1ZTpmdW5jdGlvbigpe3JldHVybiBpfSxoYXNJZnJhbWVGb2N1c0lzc3VlOmZ1bmN0aW9uKCl7cmV0dXJuIGMoKX0sY3JlYXRlc05lc3RlZEludmFsaWRNYXJrdXBBZnRlclBhc3RlOmZ1bmN0aW9uKCl7cmV0dXJuIGd9LHN1cHBvcnRzTXV0YXRpb25FdmVudHM6ZnVuY3Rpb24oKXtyZXR1cm5cIk11dGF0aW9uRXZlbnRcImluIHdpbmRvd30sc3VwcG9ydHNNb2RlblBhc3RlOmZ1bmN0aW9uKCl7cmV0dXJuIShcImNsaXBib2FyZERhdGFcImluIHdpbmRvdyl9fX0oKSx3eXNpaHRtbDUubGFuZy5hcnJheT1mdW5jdGlvbihhKXtyZXR1cm57Y29udGFpbnM6ZnVuY3Rpb24oYil7aWYoQXJyYXkuaXNBcnJheShiKSl7Zm9yKHZhciBjPWIubGVuZ3RoO2MtLTspaWYoLTEhPT13eXNpaHRtbDUubGFuZy5hcnJheShhKS5pbmRleE9mKGJbY10pKXJldHVybiEwO3JldHVybiExfXJldHVybi0xIT09d3lzaWh0bWw1LmxhbmcuYXJyYXkoYSkuaW5kZXhPZihiKX0saW5kZXhPZjpmdW5jdGlvbihiKXtpZihhLmluZGV4T2YpcmV0dXJuIGEuaW5kZXhPZihiKTtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspaWYoYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdpdGhvdXQ6ZnVuY3Rpb24oYil7Yj13eXNpaHRtbDUubGFuZy5hcnJheShiKTtmb3IodmFyIGM9W10sZD0wLGU9YS5sZW5ndGg7ZT5kO2QrKyliLmNvbnRhaW5zKGFbZF0pfHxjLnB1c2goYVtkXSk7cmV0dXJuIGN9LGdldDpmdW5jdGlvbigpe2Zvcih2YXIgYj0wLGM9YS5sZW5ndGgsZD1bXTtjPmI7YisrKWQucHVzaChhW2JdKTtyZXR1cm4gZH0sbWFwOmZ1bmN0aW9uKGIsYyl7aWYoQXJyYXkucHJvdG90eXBlLm1hcClyZXR1cm4gYS5tYXAoYixjKTtmb3IodmFyIGQ9YS5sZW5ndGg+Pj4wLGU9QXJyYXkoZCksZj0wO2Q+ZjtmKyspZVtmXT1iLmNhbGwoYyxhW2ZdLGYsYSk7cmV0dXJuIGV9LHVuaXF1ZTpmdW5jdGlvbigpe2Zvcih2YXIgYj1bXSxjPWEubGVuZ3RoLGQ9MDtjPmQ7KXd5c2lodG1sNS5sYW5nLmFycmF5KGIpLmNvbnRhaW5zKGFbZF0pfHxiLnB1c2goYVtkXSksZCsrO3JldHVybiBifX19LHd5c2lodG1sNS5sYW5nLkRpc3BhdGNoZXI9QmFzZS5leHRlbmQoe29uOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZXZlbnRzPXRoaXMuZXZlbnRzfHx7fSx0aGlzLmV2ZW50c1thXT10aGlzLmV2ZW50c1thXXx8W10sdGhpcy5ldmVudHNbYV0ucHVzaChiKSx0aGlzfSxvZmY6ZnVuY3Rpb24oYSxiKXt0aGlzLmV2ZW50cz10aGlzLmV2ZW50c3x8e307dmFyIGMsZCxlPTA7aWYoYSl7Zm9yKGM9dGhpcy5ldmVudHNbYV18fFtdLGQ9W107ZTxjLmxlbmd0aDtlKyspY1tlXSE9PWImJmImJmQucHVzaChjW2VdKTt0aGlzLmV2ZW50c1thXT1kfWVsc2UgdGhpcy5ldmVudHM9e307cmV0dXJuIHRoaXN9LGZpcmU6ZnVuY3Rpb24oYSxiKXt0aGlzLmV2ZW50cz10aGlzLmV2ZW50c3x8e307Zm9yKHZhciBjPXRoaXMuZXZlbnRzW2FdfHxbXSxkPTA7ZDxjLmxlbmd0aDtkKyspY1tkXS5jYWxsKHRoaXMsYik7cmV0dXJuIHRoaXN9LG9ic2VydmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHN0b3BPYnNlcnZpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vZmYuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pLHd5c2lodG1sNS5sYW5nLm9iamVjdD1mdW5jdGlvbihhKXtyZXR1cm57bWVyZ2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBjIGluIGIpYVtjXT1iW2NdO3JldHVybiB0aGlzfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sY2xvbmU6ZnVuY3Rpb24oYil7dmFyIGMsZD17fTtpZihudWxsPT09YXx8IXd5c2lodG1sNS5sYW5nLm9iamVjdChhKS5pc1BsYWluT2JqZWN0KCkpcmV0dXJuIGE7Zm9yKGMgaW4gYSlhLmhhc093blByb3BlcnR5KGMpJiYoZFtjXT1iP3d5c2lodG1sNS5sYW5nLm9iamVjdChhW2NdKS5jbG9uZShiKTphW2NdKTtyZXR1cm4gZH0saXNBcnJheTpmdW5jdGlvbigpe3JldHVyblwiW29iamVjdCBBcnJheV1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKX0saXNGdW5jdGlvbjpmdW5jdGlvbigpe3JldHVyblwiW29iamVjdCBGdW5jdGlvbl1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKX0saXNQbGFpbk9iamVjdDpmdW5jdGlvbigpe3JldHVyblwiW29iamVjdCBPYmplY3RdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSl9fX0sZnVuY3Rpb24oKXt2YXIgYT0vXlxccysvLGI9L1xccyskLyxjPS9bJjw+XFx0XCJdL2csZD17XCImXCI6XCImYW1wO1wiLFwiPFwiOlwiJmx0O1wiLFwiPlwiOlwiJmd0O1wiLCdcIic6XCImcXVvdDtcIixcIlx0XCI6XCImbmJzcDsgXCJ9O3d5c2lodG1sNS5sYW5nLnN0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gZSs9XCJcIix7dHJpbTpmdW5jdGlvbigpe3JldHVybiBlLnJlcGxhY2UoYSxcIlwiKS5yZXBsYWNlKGIsXCJcIil9LGludGVycG9sYXRlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKWU9dGhpcy5yZXBsYWNlKFwiI3tcIitiK1wifVwiKS5ieShhW2JdKTtyZXR1cm4gZX0scmVwbGFjZTpmdW5jdGlvbihhKXtyZXR1cm57Ynk6ZnVuY3Rpb24oYil7cmV0dXJuIGUuc3BsaXQoYSkuam9pbihiKX19fSxlc2NhcGVIVE1MOmZ1bmN0aW9uKGEsYil7dmFyIGY9ZS5yZXBsYWNlKGMsZnVuY3Rpb24oYSl7cmV0dXJuIGRbYV19KTtyZXR1cm4gYSYmKGY9Zi5yZXBsYWNlKC8oPzpcXHJcXG58XFxyfFxcbikvZyxcIjxiciAvPlwiKSksYiYmKGY9Zi5yZXBsYWNlKC8gIC9naSxcIiZuYnNwOyBcIikpLGZ9fX19KCksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3JldHVybiBmKGEsYik/YTooYT09PWEub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJihhPWEub3duZXJEb2N1bWVudC5ib2R5KSxnKGEsYikpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIGEucmVwbGFjZShpLGZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPShiLm1hdGNoKGopfHxbXSlbMV18fFwiXCIsZj1sW2VdO3JldHVybiBiPWIucmVwbGFjZShqLFwiXCIpLGIuc3BsaXQoZikubGVuZ3RoPmIuc3BsaXQoZSkubGVuZ3RoJiYoYis9ZSxlPVwiXCIpLGM9YixkPWIsYi5sZW5ndGg+ayYmKGQ9ZC5zdWJzdHIoMCxrKStcIi4uLlwiKSxcInd3dy5cIj09PWMuc3Vic3RyKDAsNCkmJihjPVwiaHR0cDovL1wiK2MpLCc8YSBocmVmPVwiJytjKydcIj4nK2QrXCI8L2E+XCIrZX0pfWZ1bmN0aW9uIGQoYSl7dmFyIGI9YS5fd3lzaWh0bWw1X3RlbXBFbGVtZW50O3JldHVybiBifHwoYj1hLl93eXNpaHRtbDVfdGVtcEVsZW1lbnQ9YS5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKSxifWZ1bmN0aW9uIGUoYil7dmFyIGU9Yi5wYXJlbnROb2RlLGY9YS5sYW5nLnN0cmluZyhiLmRhdGEpLmVzY2FwZUhUTUwoKSxnPWQoZS5vd25lckRvY3VtZW50KTtmb3IoZy5pbm5lckhUTUw9XCI8c3Bhbj48L3NwYW4+XCIrYyhmKSxnLnJlbW92ZUNoaWxkKGcuZmlyc3RDaGlsZCk7Zy5maXJzdENoaWxkOyllLmluc2VydEJlZm9yZShnLmZpcnN0Q2hpbGQsYik7ZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBmKGIsYyl7Zm9yKHZhciBkO2IucGFyZW50Tm9kZTspe2lmKGI9Yi5wYXJlbnROb2RlLGQ9Yi5ub2RlTmFtZSxiLmNsYXNzTmFtZSYmYS5sYW5nLmFycmF5KGIuY2xhc3NOYW1lLnNwbGl0KFwiIFwiKSkuY29udGFpbnMoYykpcmV0dXJuITA7aWYoaC5jb250YWlucyhkKSlyZXR1cm4hMDtpZihcImJvZHlcIj09PWQpcmV0dXJuITF9cmV0dXJuITF9ZnVuY3Rpb24gZyhiLGMpe2lmKCEoaC5jb250YWlucyhiLm5vZGVOYW1lKXx8Yi5jbGFzc05hbWUmJmEubGFuZy5hcnJheShiLmNsYXNzTmFtZS5zcGxpdChcIiBcIikpLmNvbnRhaW5zKGMpKSl7aWYoYi5ub2RlVHlwZT09PWEuVEVYVF9OT0RFJiZiLmRhdGEubWF0Y2goaSkpcmV0dXJuIGUoYiksdm9pZCAwO2Zvcih2YXIgZD1hLmxhbmcuYXJyYXkoYi5jaGlsZE5vZGVzKS5nZXQoKSxmPWQubGVuZ3RoLGo9MDtmPmo7aisrKWcoZFtqXSxjKTtyZXR1cm4gYn19dmFyIGg9YS5sYW5nLmFycmF5KFtcIkNPREVcIixcIlBSRVwiLFwiQVwiLFwiU0NSSVBUXCIsXCJIRUFEXCIsXCJUSVRMRVwiLFwiU1RZTEVcIl0pLGk9LygoaHR0cHM/OlxcL1xcL3x3d3dcXC4pW15cXHM8XXszLH0pL2dpLGo9LyhbXlxcd1xcL1xcLV0oLD8pKSQvaSxrPTEwMCxsPXtcIilcIjpcIihcIixcIl1cIjpcIltcIixcIn1cIjpcIntcIn07YS5kb20uYXV0b0xpbms9YixhLmRvbS5hdXRvTGluay5VUkxfUkVHX0VYUD1pfSh3eXNpaHRtbDUpLGZ1bmN0aW9uKGEpe3ZhciBiPWEuZG9tO2IuYWRkQ2xhc3M9ZnVuY3Rpb24oYSxjKXt2YXIgZD1hLmNsYXNzTGlzdDtyZXR1cm4gZD9kLmFkZChjKTooYi5oYXNDbGFzcyhhLGMpfHwoYS5jbGFzc05hbWUrPVwiIFwiK2MpLHZvaWQgMCl9LGIucmVtb3ZlQ2xhc3M9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmNsYXNzTGlzdDtyZXR1cm4gYz9jLnJlbW92ZShiKTooYS5jbGFzc05hbWU9YS5jbGFzc05hbWUucmVwbGFjZShSZWdFeHAoXCIoXnxcXFxccyspXCIrYitcIihcXFxccyt8JClcIiksXCIgXCIpLHZvaWQgMCl9LGIuaGFzQ2xhc3M9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPWEuY2xhc3NMaXN0O3JldHVybiBkP2QuY29udGFpbnMoYik6KGM9YS5jbGFzc05hbWUsYy5sZW5ndGg+MCYmKGM9PWJ8fFJlZ0V4cChcIihefFxcXFxzKVwiK2IrXCIoXFxcXHN8JClcIikudGVzdChjKSkpfX0od3lzaWh0bWw1KSx3eXNpaHRtbDUuZG9tLmNvbnRhaW5zPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3JldHVybiBhLmNvbnRhaW5zP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGIubm9kZVR5cGUhPT13eXNpaHRtbDUuRUxFTUVOVF9OT0RFJiYoYj1iLnBhcmVudE5vZGUpLGEhPT1iJiZhLmNvbnRhaW5zKGIpfTphLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGEsYil7cmV0dXJuISEoMTYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSl9OnZvaWQgMH0oKSx3eXNpaHRtbDUuZG9tLmNvbnZlcnRUb0xpc3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9YS5jcmVhdGVFbGVtZW50KFwibGlcIik7cmV0dXJuIGIuYXBwZW5kQ2hpbGQoYyksY31mdW5jdGlvbiBiKGEsYil7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX1mdW5jdGlvbiBjKGMsZCxlKXtpZihcIlVMXCI9PT1jLm5vZGVOYW1lfHxcIk9MXCI9PT1jLm5vZGVOYW1lfHxcIk1FTlVcIj09PWMubm9kZU5hbWUpcmV0dXJuIGM7dmFyIGYsZyxoLGksaixrLGwsbSxuLG89Yy5vd25lckRvY3VtZW50LHA9YihvLGQpLHE9Yy5xdWVyeVNlbGVjdG9yQWxsKFwiYnJcIikscj1xLmxlbmd0aDtmb3Iobj0wO3I+bjtuKyspZm9yKGk9cVtuXTsoaj1pLnBhcmVudE5vZGUpJiZqIT09YyYmai5sYXN0Q2hpbGQ9PT1pOyl7aWYoXCJibG9ja1wiPT09d3lzaWh0bWw1LmRvbS5nZXRTdHlsZShcImRpc3BsYXlcIikuZnJvbShqKSl7ai5yZW1vdmVDaGlsZChpKTticmVha313eXNpaHRtbDUuZG9tLmluc2VydChpKS5hZnRlcihpLnBhcmVudE5vZGUpfWZvcihmPXd5c2lodG1sNS5sYW5nLmFycmF5KGMuY2hpbGROb2RlcykuZ2V0KCksZz1mLmxlbmd0aCxuPTA7Zz5uO24rKyltPW18fGEobyxwKSxoPWZbbl0saz1cImJsb2NrXCI9PT13eXNpaHRtbDUuZG9tLmdldFN0eWxlKFwiZGlzcGxheVwiKS5mcm9tKGgpLGw9XCJCUlwiPT09aC5ub2RlTmFtZSwha3x8ZSYmd3lzaWh0bWw1LmRvbS5oYXNDbGFzcyhoLGUpP2w/bT1tLmZpcnN0Q2hpbGQ/bnVsbDptOm0uYXBwZW5kQ2hpbGQoaCk6KG09bS5maXJzdENoaWxkP2EobyxwKTptLG0uYXBwZW5kQ2hpbGQoaCksbT1udWxsKTtyZXR1cm4gMD09PWYubGVuZ3RoJiZhKG8scCksYy5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChwLGMpLHB9cmV0dXJuIGN9KCksd3lzaWh0bWw1LmRvbS5jb3B5QXR0cmlidXRlcz1mdW5jdGlvbihhKXtyZXR1cm57ZnJvbTpmdW5jdGlvbihiKXtyZXR1cm57dG86ZnVuY3Rpb24oYyl7Zm9yKHZhciBkLGU9MCxmPWEubGVuZ3RoO2Y+ZTtlKyspZD1hW2VdLHZvaWQgMCE9PWJbZF0mJlwiXCIhPT1iW2RdJiYoY1tkXT1iW2RdKTtyZXR1cm57YW5kVG86YXJndW1lbnRzLmNhbGxlZX19fX19fSxmdW5jdGlvbihhKXt2YXIgYj1bXCItd2Via2l0LWJveC1zaXppbmdcIixcIi1tb3otYm94LXNpemluZ1wiLFwiLW1zLWJveC1zaXppbmdcIixcImJveC1zaXppbmdcIl0sYz1mdW5jdGlvbihiKXtyZXR1cm4gZChiKT9wYXJzZUludChhLmdldFN0eWxlKFwid2lkdGhcIikuZnJvbShiKSwxMCk8Yi5vZmZzZXRXaWR0aDohMX0sZD1mdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPWIubGVuZ3RoO2U+ZDtkKyspaWYoXCJib3JkZXItYm94XCI9PT1hLmdldFN0eWxlKGJbZF0pLmZyb20oYykpcmV0dXJuIGJbZF19O2EuY29weVN0eWxlcz1mdW5jdGlvbihkKXtyZXR1cm57ZnJvbTpmdW5jdGlvbihlKXtjKGUpJiYoZD13eXNpaHRtbDUubGFuZy5hcnJheShkKS53aXRob3V0KGIpKTtmb3IodmFyIGYsZz1cIlwiLGg9ZC5sZW5ndGgsaT0wO2g+aTtpKyspZj1kW2ldLGcrPWYrXCI6XCIrYS5nZXRTdHlsZShmKS5mcm9tKGUpK1wiO1wiO3JldHVybnt0bzpmdW5jdGlvbihiKXtyZXR1cm4gYS5zZXRTdHlsZXMoZykub24oYikse2FuZFRvOmFyZ3VtZW50cy5jYWxsZWV9fX19fX19KHd5c2lodG1sNS5kb20pLGZ1bmN0aW9uKGEpe2EuZG9tLmRlbGVnYXRlPWZ1bmN0aW9uKGIsYyxkLGUpe3JldHVybiBhLmRvbS5vYnNlcnZlKGIsZCxmdW5jdGlvbihkKXtmb3IodmFyIGY9ZC50YXJnZXQsZz1hLmxhbmcuYXJyYXkoYi5xdWVyeVNlbGVjdG9yQWxsKGMpKTtmJiZmIT09Yjspe2lmKGcuY29udGFpbnMoZikpe2UuY2FsbChmLGQpO2JyZWFrfWY9Zi5wYXJlbnROb2RlfX0pfX0od3lzaWh0bWw1KSxmdW5jdGlvbihhKXthLmRvbS5kb21Ob2RlPWZ1bmN0aW9uKGIpe3ZhciBjPVthLkVMRU1FTlRfTk9ERSxhLlRFWFRfTk9ERV0sZD1mdW5jdGlvbihiKXtyZXR1cm4gYi5ub2RlVHlwZT09PWEuVEVYVF9OT0RFJiYvXlxccyokL2cudGVzdChiLmRhdGEpfTtyZXR1cm57cHJldjpmdW5jdGlvbihlKXt2YXIgZj1iLnByZXZpb3VzU2libGluZyxnPWUmJmUubm9kZVR5cGVzP2Uubm9kZVR5cGVzOmM7cmV0dXJuIGY/IWEubGFuZy5hcnJheShnKS5jb250YWlucyhmLm5vZGVUeXBlKXx8ZSYmZS5pZ25vcmVCbGFua1RleHRzJiZkKGYpP2EuZG9tLmRvbU5vZGUoZikucHJldihlKTpmOm51bGx9LG5leHQ6ZnVuY3Rpb24oZSl7dmFyIGY9Yi5uZXh0U2libGluZyxnPWUmJmUubm9kZVR5cGVzP2Uubm9kZVR5cGVzOmM7cmV0dXJuIGY/IWEubGFuZy5hcnJheShnKS5jb250YWlucyhmLm5vZGVUeXBlKXx8ZSYmZS5pZ25vcmVCbGFua1RleHRzJiZkKGYpP2EuZG9tLmRvbU5vZGUoZikubmV4dChlKTpmOm51bGx9fX19KHd5c2lodG1sNSksd3lzaWh0bWw1LmRvbS5nZXRBc0RvbT1mdW5jdGlvbigpe3ZhciBhPWZ1bmN0aW9uKGEsYil7dmFyIGM9Yi5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2Muc3R5bGUuZGlzcGxheT1cIm5vbmVcIixiLmJvZHkuYXBwZW5kQ2hpbGQoYyk7dHJ5e2MuaW5uZXJIVE1MPWF9Y2F0Y2goZCl7fXJldHVybiBiLmJvZHkucmVtb3ZlQ2hpbGQoYyksY30sYj1mdW5jdGlvbihhKXtpZighYS5fd3lzaWh0bWw1X3N1cHBvcnRzSFRNTDVUYWdzKXtmb3IodmFyIGI9MCxkPWMubGVuZ3RoO2Q+YjtiKyspYS5jcmVhdGVFbGVtZW50KGNbYl0pO2EuX3d5c2lodG1sNV9zdXBwb3J0c0hUTUw1VGFncz0hMH19LGM9W1wiYWJiclwiLFwiYXJ0aWNsZVwiLFwiYXNpZGVcIixcImF1ZGlvXCIsXCJiZGlcIixcImNhbnZhc1wiLFwiY29tbWFuZFwiLFwiZGF0YWxpc3RcIixcImRldGFpbHNcIixcImZpZ2NhcHRpb25cIixcImZpZ3VyZVwiLFwiZm9vdGVyXCIsXCJoZWFkZXJcIixcImhncm91cFwiLFwia2V5Z2VuXCIsXCJtYXJrXCIsXCJtZXRlclwiLFwibmF2XCIsXCJvdXRwdXRcIixcInByb2dyZXNzXCIsXCJycFwiLFwicnRcIixcInJ1YnlcIixcInN2Z1wiLFwic2VjdGlvblwiLFwic291cmNlXCIsXCJzdW1tYXJ5XCIsXCJ0aW1lXCIsXCJ0cmFja1wiLFwidmlkZW9cIixcIndiclwiXTtyZXR1cm4gZnVuY3Rpb24oYyxkKXtkPWR8fGRvY3VtZW50O3ZhciBlO3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiBjJiZjLm5vZGVUeXBlPyhlPWQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxlLmFwcGVuZENoaWxkKGMpKTp3eXNpaHRtbDUuYnJvd3Nlci5zdXBwb3J0c0hUTUw1VGFncyhkKT8oZT1kLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksZS5pbm5lckhUTUw9Yyk6KGIoZCksZT1hKGMsZCkpLGV9fSgpLHd5c2lodG1sNS5kb20uZ2V0UGFyZW50RWxlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtyZXR1cm4gYiYmYi5sZW5ndGg/XCJzdHJpbmdcIj09dHlwZW9mIGI/YT09PWI6d3lzaWh0bWw1LmxhbmcuYXJyYXkoYikuY29udGFpbnMoYSk6ITB9ZnVuY3Rpb24gYihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PXd5c2lodG1sNS5FTEVNRU5UX05PREV9ZnVuY3Rpb24gYyhhLGIsYyl7dmFyIGQ9KGEuY2xhc3NOYW1lfHxcIlwiKS5tYXRjaChjKXx8W107cmV0dXJuIGI/ZFtkLmxlbmd0aC0xXT09PWI6ISFkLmxlbmd0aH1mdW5jdGlvbiBkKGEsYixjKXt2YXIgZD0oYS5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKXx8XCJcIikubWF0Y2goYyl8fFtdO3JldHVybiBiP2RbZC5sZW5ndGgtMV09PT1iOiEhZC5sZW5ndGh9cmV0dXJuIGZ1bmN0aW9uKGUsZixnLGgpe3ZhciBpPWYuY3NzU3R5bGV8fGYuc3R5bGVSZWdFeHAsaj1mLmNsYXNzTmFtZXx8Zi5jbGFzc1JlZ0V4cDtmb3IoZz1nfHw1MDtnLS0mJmUmJlwiQk9EWVwiIT09ZS5ub2RlTmFtZSYmKCFofHxlIT09aCk7KXtpZihiKGUpJiZhKGUubm9kZU5hbWUsZi5ub2RlTmFtZSkmJighaXx8ZChlLGYuY3NzU3R5bGUsZi5zdHlsZVJlZ0V4cCkpJiYoIWp8fGMoZSxmLmNsYXNzTmFtZSxmLmNsYXNzUmVnRXhwKSkpcmV0dXJuIGU7ZT1lLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9fSgpLHd5c2lodG1sNS5kb20uZ2V0U3R5bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiBhLnJlcGxhY2UoYyxmdW5jdGlvbihhKXtyZXR1cm4gYS5jaGFyQXQoMSkudG9VcHBlckNhc2UoKVxufSl9dmFyIGI9e1wiZmxvYXRcIjpcInN0eWxlRmxvYXRcImluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikuc3R5bGU/XCJzdHlsZUZsb2F0XCI6XCJjc3NGbG9hdFwifSxjPS9cXC1bYS16XS9nO3JldHVybiBmdW5jdGlvbihjKXtyZXR1cm57ZnJvbTpmdW5jdGlvbihkKXt2YXIgZSxmLGcsaCxpLGosayxsLG07aWYoZC5ub2RlVHlwZT09PXd5c2lodG1sNS5FTEVNRU5UX05PREUpe2lmKGU9ZC5vd25lckRvY3VtZW50LGY9YltjXXx8YShjKSxnPWQuc3R5bGUsaD1kLmN1cnJlbnRTdHlsZSxpPWdbZl0saSlyZXR1cm4gaTtpZihoKXRyeXtyZXR1cm4gaFtmXX1jYXRjaChuKXt9cmV0dXJuIGo9ZS5kZWZhdWx0Vmlld3x8ZS5wYXJlbnRXaW5kb3csaz0oXCJoZWlnaHRcIj09PWN8fFwid2lkdGhcIj09PWMpJiZcIlRFWFRBUkVBXCI9PT1kLm5vZGVOYW1lLGouZ2V0Q29tcHV0ZWRTdHlsZT8oayYmKGw9Zy5vdmVyZmxvdyxnLm92ZXJmbG93PVwiaGlkZGVuXCIpLG09ai5nZXRDb21wdXRlZFN0eWxlKGQsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShjKSxrJiYoZy5vdmVyZmxvdz1sfHxcIlwiKSxtKTp2b2lkIDB9fX19fSgpLHd5c2lodG1sNS5kb20uZ2V0VGV4dE5vZGVzPWZ1bmN0aW9uKGEsYil7dmFyIGM9W107Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKTM9PWEubm9kZVR5cGU/YiYmL15cXHMqJC8udGVzdChhLmlubmVyVGV4dHx8YS50ZXh0Q29udGVudCl8fGMucHVzaChhKTpjPWMuY29uY2F0KHd5c2lodG1sNS5kb20uZ2V0VGV4dE5vZGVzKGEsYikpO3JldHVybiBjfSx3eXNpaHRtbDUuZG9tLmhhc0VsZW1lbnRXaXRoVGFnTmFtZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIGEuX3d5c2lodG1sNV9pZGVudGlmaWVyfHwoYS5fd3lzaWh0bWw1X2lkZW50aWZpZXI9YysrKX12YXIgYj17fSxjPTE7cmV0dXJuIGZ1bmN0aW9uKGMsZCl7dmFyIGU9YShjKStcIjpcIitkLGY9YltlXTtyZXR1cm4gZnx8KGY9YltlXT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKSxmLmxlbmd0aD4wfX0oKSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3JldHVybiBhLl93eXNpaHRtbDVfaWRlbnRpZmllcnx8KGEuX3d5c2lodG1sNV9pZGVudGlmaWVyPWQrKyl9dmFyIGM9e30sZD0xO2EuZG9tLmhhc0VsZW1lbnRXaXRoQ2xhc3NOYW1lPWZ1bmN0aW9uKGQsZSl7aWYoIWEuYnJvd3Nlci5zdXBwb3J0c05hdGl2ZUdldEVsZW1lbnRzQnlDbGFzc05hbWUoKSlyZXR1cm4hIWQucXVlcnlTZWxlY3RvcihcIi5cIitlKTt2YXIgZj1iKGQpK1wiOlwiK2UsZz1jW2ZdO3JldHVybiBnfHwoZz1jW2ZdPWQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKSksZy5sZW5ndGg+MH19KHd5c2lodG1sNSksd3lzaWh0bWw1LmRvbS5pbnNlcnQ9ZnVuY3Rpb24oYSl7cmV0dXJue2FmdGVyOmZ1bmN0aW9uKGIpe2IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSxiLm5leHRTaWJsaW5nKX0sYmVmb3JlOmZ1bmN0aW9uKGIpe2IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSxiKX0saW50bzpmdW5jdGlvbihiKXtiLmFwcGVuZENoaWxkKGEpfX19LHd5c2lodG1sNS5kb20uaW5zZXJ0Q1NTPWZ1bmN0aW9uKGEpe3JldHVybiBhPWEuam9pbihcIlxcblwiKSx7aW50bzpmdW5jdGlvbihiKXt2YXIgYyxkLGU9Yi5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7cmV0dXJuIGUudHlwZT1cInRleHQvY3NzXCIsZS5zdHlsZVNoZWV0P2Uuc3R5bGVTaGVldC5jc3NUZXh0PWE6ZS5hcHBlbmRDaGlsZChiLmNyZWF0ZVRleHROb2RlKGEpKSxjPWIucXVlcnlTZWxlY3RvcihcImhlYWQgbGlua1wiKSxjPyhjLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYyksdm9pZCAwKTooZD1iLnF1ZXJ5U2VsZWN0b3IoXCJoZWFkXCIpLGQmJmQuYXBwZW5kQ2hpbGQoZSksdm9pZCAwKX19fSxmdW5jdGlvbihhKXthLmRvbS5saW5lQnJlYWtzPWZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuXCJCUlwiPT09YS5ub2RlTmFtZX1mdW5jdGlvbiBkKGIpe3JldHVybiBjKGIpPyEwOlwiYmxvY2tcIj09PWEuZG9tLmdldFN0eWxlKFwiZGlzcGxheVwiKS5mcm9tKGIpPyEwOiExfXJldHVybnthZGQ6ZnVuY3Rpb24oKXt2YXIgYz1iLm93bmVyRG9jdW1lbnQsZT1hLmRvbS5kb21Ob2RlKGIpLm5leHQoe2lnbm9yZUJsYW5rVGV4dHM6ITB9KSxmPWEuZG9tLmRvbU5vZGUoYikucHJldih7aWdub3JlQmxhbmtUZXh0czohMH0pO2UmJiFkKGUpJiZhLmRvbS5pbnNlcnQoYy5jcmVhdGVFbGVtZW50KFwiYnJcIikpLmFmdGVyKGIpLGYmJiFkKGYpJiZhLmRvbS5pbnNlcnQoYy5jcmVhdGVFbGVtZW50KFwiYnJcIikpLmJlZm9yZShiKX0scmVtb3ZlOmZ1bmN0aW9uKCl7dmFyIGQ9YS5kb20uZG9tTm9kZShiKS5uZXh0KHtpZ25vcmVCbGFua1RleHRzOiEwfSksZT1hLmRvbS5kb21Ob2RlKGIpLnByZXYoe2lnbm9yZUJsYW5rVGV4dHM6ITB9KTtkJiZjKGQpJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCksZSYmYyhlKSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfX19fSh3eXNpaHRtbDUpLHd5c2lodG1sNS5kb20ub2JzZXJ2ZT1mdW5jdGlvbihhLGIsYyl7Yj1cInN0cmluZ1wiPT10eXBlb2YgYj9bYl06Yjtmb3IodmFyIGQsZSxmPTAsZz1iLmxlbmd0aDtnPmY7ZisrKWU9YltmXSxhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKGUsYywhMSk6KGQ9ZnVuY3Rpb24oYil7XCJ0YXJnZXRcImluIGJ8fChiLnRhcmdldD1iLnNyY0VsZW1lbnQpLGIucHJldmVudERlZmF1bHQ9Yi5wcmV2ZW50RGVmYXVsdHx8ZnVuY3Rpb24oKXt0aGlzLnJldHVyblZhbHVlPSExfSxiLnN0b3BQcm9wYWdhdGlvbj1iLnN0b3BQcm9wYWdhdGlvbnx8ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEJ1YmJsZT0hMH0sYy5jYWxsKGEsYil9LGEuYXR0YWNoRXZlbnQoXCJvblwiK2UsZCkpO3JldHVybntzdG9wOmZ1bmN0aW9uKCl7Zm9yKHZhciBlLGY9MCxnPWIubGVuZ3RoO2c+ZjtmKyspZT1iW2ZdLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcj9hLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxjLCExKTphLmRldGFjaEV2ZW50KFwib25cIitlLGQpfX19LHd5c2lodG1sNS5kb20ucGFyc2U9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7dmFyIGMsZixnLGgsaSxqLGssbCxtO2Zvcih3eXNpaHRtbDUubGFuZy5vYmplY3QodCkubWVyZ2UocykubWVyZ2UoYi5ydWxlcykuZ2V0KCksYz1iLmNvbnRleHR8fGEub3duZXJEb2N1bWVudHx8ZG9jdW1lbnQsZj1jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxnPVwic3RyaW5nXCI9PXR5cGVvZiBhLGg9ITEsYi5jbGVhckludGVybmFscz09PSEwJiYoaD0hMCksaT1nP3d5c2lodG1sNS5kb20uZ2V0QXNEb20oYSxjKTphLHQuc2VsZWN0b3JzJiZlKGksdC5zZWxlY3RvcnMpO2kuZmlyc3RDaGlsZDspaz1pLmZpcnN0Q2hpbGQsaj1kKGssYi5jbGVhblVwLGgsYi51bmVkaXRhYmxlQ2xhc3MpLGomJmYuYXBwZW5kQ2hpbGQoaiksayE9PWomJmkucmVtb3ZlQ2hpbGQoayk7aWYoYi51bmpvaW5OYnNwcylmb3IobD13eXNpaHRtbDUuZG9tLmdldFRleHROb2RlcyhmKSxtPWwubGVuZ3RoO20tLTspbFttXS5ub2RlVmFsdWU9bFttXS5ub2RlVmFsdWUucmVwbGFjZSgvKFtcXFNcXHUwMEEwXSlcXHUwMEEwL2dpLFwiJDEgXCIpO3JldHVybiBpLmlubmVySFRNTD1cIlwiLGkuYXBwZW5kQ2hpbGQoZiksZz93eXNpaHRtbDUucXVpcmtzLmdldENvcnJlY3RJbm5lckhUTUwoaSk6aX1mdW5jdGlvbiBkKGEsYixjLGUpe3ZhciBmLGcsaCxpPWEubm9kZVR5cGUsaj1hLmNoaWxkTm9kZXMsaz1qLmxlbmd0aCxsPXBbaV0sbT0wO2lmKGUmJjE9PT1pJiZ3eXNpaHRtbDUuZG9tLmhhc0NsYXNzKGEsZSkpcmV0dXJuIGE7aWYoZz1sJiZsKGEsYyksIWcpe2lmKGc9PT0hMSl7Zm9yKGY9YS5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxtPWs7bS0tOylqW21dJiYoaD1kKGpbbV0sYixjLGUpLGgmJihqW21dPT09aCYmbS0tLGYuaW5zZXJ0QmVmb3JlKGgsZi5maXJzdENoaWxkKSkpO3JldHVyblwiYmxvY2tcIj09PXd5c2lodG1sNS5kb20uZ2V0U3R5bGUoXCJkaXNwbGF5XCIpLmZyb20oYSkmJmYuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSksd3lzaWh0bWw1LmxhbmcuYXJyYXkoW1wiZGl2XCIsXCJwcmVcIixcInBcIixcInRhYmxlXCIsXCJ0ZFwiLFwidGhcIixcInVsXCIsXCJvbFwiLFwibGlcIixcImRkXCIsXCJkbFwiLFwiZm9vdGVyXCIsXCJoZWFkZXJcIixcInNlY3Rpb25cIixcImgxXCIsXCJoMlwiLFwiaDNcIixcImg0XCIsXCJoNVwiLFwiaDZcIl0pLmNvbnRhaW5zKGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkmJmEucGFyZW50Tm9kZS5sYXN0Q2hpbGQhPT1hJiYoYS5uZXh0U2libGluZyYmMz09PWEubmV4dFNpYmxpbmcubm9kZVR5cGUmJi9eXFxzLy50ZXN0KGEubmV4dFNpYmxpbmcubm9kZVZhbHVlKXx8Zi5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCIgXCIpKSksZi5ub3JtYWxpemUmJmYubm9ybWFsaXplKCksZn1yZXR1cm4gbnVsbH1mb3IobT0wO2s+bTttKyspalttXSYmKGg9ZChqW21dLGIsYyxlKSxoJiYoalttXT09PWgmJm0tLSxnLmFwcGVuZENoaWxkKGgpKSk7aWYoYiYmZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cSYmKCFnLmNoaWxkTm9kZXMubGVuZ3RofHwvXlxccyokL2dpLnRlc3QoZy5pbm5lckhUTUwpJiYoY3x8XCJfd3lzaWh0bWw1LXRlbXAtcGxhY2Vob2xkZXJcIiE9PWEuY2xhc3NOYW1lJiZcInJhbmd5U2VsZWN0aW9uQm91bmRhcnlcIiE9PWEuY2xhc3NOYW1lKXx8IWcuYXR0cmlidXRlcy5sZW5ndGgpKXtmb3IoZj1nLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2cuZmlyc3RDaGlsZDspZi5hcHBlbmRDaGlsZChnLmZpcnN0Q2hpbGQpO3JldHVybiBmLm5vcm1hbGl6ZSYmZi5ub3JtYWxpemUoKSxmfXJldHVybiBnLm5vcm1hbGl6ZSYmZy5ub3JtYWxpemUoKSxnfWZ1bmN0aW9uIGUoYSxiKXt2YXIgYyxkLGUsZjtmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpZm9yKHd5c2lodG1sNS5sYW5nLm9iamVjdChiW2NdKS5pc0Z1bmN0aW9uKCk/ZD1iW2NdOlwic3RyaW5nXCI9PXR5cGVvZiBiW2NdJiZ6W2JbY11dJiYoZD16W2JbY11dKSxlPWEucXVlcnlTZWxlY3RvckFsbChjKSxmPWUubGVuZ3RoO2YtLTspZChlW2ZdKX1mdW5jdGlvbiBmKGEsYil7dmFyIGMsZCxlLGY9dC50YWdzLGg9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGo9YS5zY29wZU5hbWU7aWYoYS5fd3lzaWh0bWw1KXJldHVybiBudWxsO2lmKGEuX3d5c2lodG1sNT0xLFwid3lzaWh0bWw1LXRlbXBcIj09PWEuY2xhc3NOYW1lKXJldHVybiBudWxsO2lmKGomJlwiSFRNTFwiIT1qJiYoaD1qK1wiOlwiK2gpLFwib3V0ZXJIVE1MXCJpbiBhJiYod3lzaWh0bWw1LmJyb3dzZXIuYXV0b0Nsb3Nlc1VuY2xvc2VkVGFncygpfHxcIlBcIiE9PWEubm9kZU5hbWV8fFwiPC9wPlwiPT09YS5vdXRlckhUTUwuc2xpY2UoLTQpLnRvTG93ZXJDYXNlKCl8fChoPVwiZGl2XCIpKSxoIGluIGYpe2lmKGM9ZltoXSwhY3x8Yy5yZW1vdmUpcmV0dXJuIG51bGw7aWYoYy51bndyYXApcmV0dXJuITE7Yz1cInN0cmluZ1wiPT10eXBlb2YgYz97cmVuYW1lX3RhZzpjfTpjfWVsc2V7aWYoIWEuZmlyc3RDaGlsZClyZXR1cm4gbnVsbDtjPXtyZW5hbWVfdGFnOnF9fWlmKGMub25lX29mX3R5cGUmJiFnKGEsdCxjLm9uZV9vZl90eXBlLGIpKXtpZighYy5yZW1vdmVfYWN0aW9uKXJldHVybiBudWxsO2lmKFwidW53cmFwXCI9PT1jLnJlbW92ZV9hY3Rpb24pcmV0dXJuITE7aWYoXCJyZW5hbWVcIiE9PWMucmVtb3ZlX2FjdGlvbilyZXR1cm4gbnVsbDtlPWMucmVtb3ZlX2FjdGlvbl9yZW5hbWVfdG98fHF9cmV0dXJuIGQ9YS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZXx8Yy5yZW5hbWVfdGFnfHxoKSxtKGEsZCxjLGIpLGkoYSxkLGMpLGE9bnVsbCxkLm5vcm1hbGl6ZSYmZC5ub3JtYWxpemUoKSxkfWZ1bmN0aW9uIGcoYSxiLGMsZCl7dmFyIGUsZjtpZihcIlNQQU5cIj09PWEubm9kZU5hbWUmJiFkJiYoXCJfd3lzaWh0bWw1LXRlbXAtcGxhY2Vob2xkZXJcIj09PWEuY2xhc3NOYW1lfHxcInJhbmd5U2VsZWN0aW9uQm91bmRhcnlcIj09PWEuY2xhc3NOYW1lKSlyZXR1cm4hMDtmb3IoZiBpbiBjKWlmKGMuaGFzT3duUHJvcGVydHkoZikmJmIudHlwZV9kZWZpbml0aW9ucyYmYi50eXBlX2RlZmluaXRpb25zW2ZdJiYoZT1iLnR5cGVfZGVmaW5pdGlvbnNbZl0saChhLGUpKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBoKGEsYil7dmFyIGMsZCxlLGYsZyxoLGksaixrPWEuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIiksbD1hLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO2lmKGIubWV0aG9kcylmb3IoaCBpbiBiLm1ldGhvZHMpaWYoYi5tZXRob2RzLmhhc093blByb3BlcnR5KGgpJiZ5W2hdJiZ5W2hdKGEpKXJldHVybiEwO2lmKGsmJmIuY2xhc3Nlcylmb3Ioaz1rLnJlcGxhY2UoL15cXHMrL2csXCJcIikucmVwbGFjZSgvXFxzKyQvZyxcIlwiKS5zcGxpdChyKSxjPWsubGVuZ3RoLGk9MDtjPmk7aSsrKWlmKGIuY2xhc3Nlc1trW2ldXSlyZXR1cm4hMDtpZihsJiZiLnN0eWxlcyl7bD1sLnNwbGl0KFwiO1wiKTtmb3IoZCBpbiBiLnN0eWxlcylpZihiLnN0eWxlcy5oYXNPd25Qcm9wZXJ0eShkKSlmb3Ioaj1sLmxlbmd0aDtqLS07KWlmKGc9bFtqXS5zcGxpdChcIjpcIiksZ1swXS5yZXBsYWNlKC9cXHMvZyxcIlwiKS50b0xvd2VyQ2FzZSgpPT09ZCYmKGIuc3R5bGVzW2RdPT09ITB8fDE9PT1iLnN0eWxlc1tkXXx8d3lzaWh0bWw1LmxhbmcuYXJyYXkoYi5zdHlsZXNbZF0pLmNvbnRhaW5zKGdbMV0ucmVwbGFjZSgvXFxzL2csXCJcIikudG9Mb3dlckNhc2UoKSkpKXJldHVybiEwfWlmKGIuYXR0cnMpZm9yKGUgaW4gYi5hdHRycylpZihiLmF0dHJzLmhhc093blByb3BlcnR5KGUpJiYoZj13eXNpaHRtbDUuZG9tLmdldEF0dHJpYnV0ZShhLGUpLFwic3RyaW5nXCI9PXR5cGVvZiBmJiZmLnNlYXJjaChiLmF0dHJzW2VdKT4tMSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gaShhLGIsYyl7dmFyIGQsZTtpZihjJiZjLmtlZXBfc3R5bGVzKWZvcihkIGluIGMua2VlcF9zdHlsZXMpaWYoYy5rZWVwX3N0eWxlcy5oYXNPd25Qcm9wZXJ0eShkKSl7aWYoZT1cImZsb2F0XCI9PT1kP2Euc3R5bGUuc3R5bGVGbG9hdHx8YS5zdHlsZS5jc3NGbG9hdDphLnN0eWxlW2RdLGMua2VlcF9zdHlsZXNbZF1pbnN0YW5jZW9mIFJlZ0V4cCYmIWMua2VlcF9zdHlsZXNbZF0udGVzdChlKSljb250aW51ZTtcImZsb2F0XCI9PT1kP2Iuc3R5bGVbYS5zdHlsZS5zdHlsZUZsb2F0P1wic3R5bGVGbG9hdFwiOlwiY3NzRmxvYXRcIl09ZTphLnN0eWxlW2RdJiYoYi5zdHlsZVtkXT1lKX19ZnVuY3Rpb24gaihhLGIpe3ZhciBjLGQ9W107Zm9yKGMgaW4gYiliLmhhc093blByb3BlcnR5KGMpJiYwPT09Yy5pbmRleE9mKGEpJiZkLnB1c2goYyk7cmV0dXJuIGR9ZnVuY3Rpb24gayhhLGIsYyxkKXt2YXIgZSxmPXZbY107cmV0dXJuIGYmJihifHxcImFsdFwiPT09YSYmXCJJTUdcIj09ZCkmJihlPWYoYiksXCJzdHJpbmdcIj09dHlwZW9mIGUpP2U6ITF9ZnVuY3Rpb24gbChhLGIpe3ZhciBjLGQsZSxmLGcsaD13eXNpaHRtbDUubGFuZy5vYmplY3QodC5hdHRyaWJ1dGVzfHx7fSkuY2xvbmUoKSxpPXd5c2lodG1sNS5sYW5nLm9iamVjdChoKS5tZXJnZSh3eXNpaHRtbDUubGFuZy5vYmplY3QoYnx8e30pLmNsb25lKCkpLmdldCgpLGw9e30sbT13eXNpaHRtbDUuZG9tLmdldEF0dHJpYnV0ZXMoYSk7Zm9yKGMgaW4gaSlpZigvXFwqJC8udGVzdChjKSlmb3IoZT1qKGMuc2xpY2UoMCwtMSksbSksZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKylkPWsoZVtmXSxtW2VbZl1dLGlbY10sYS5ub2RlTmFtZSksZCE9PSExJiYobFtlW2ZdXT1kKTtlbHNlIGQ9ayhjLG1bY10saVtjXSxhLm5vZGVOYW1lKSxkIT09ITEmJihsW2NdPWQpO3JldHVybiBsfWZ1bmN0aW9uIG0oYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9Yy5zZXRfY2xhc3MsbT1jLmFkZF9jbGFzcyxuPWMuYWRkX3N0eWxlLG89Yy5zZXRfYXR0cmlidXRlcyxwPXQuY2xhc3NlcyxxPTAscz1bXSx1PVtdLHY9W10seT1bXTtpZihvJiYoaj13eXNpaHRtbDUubGFuZy5vYmplY3QobykuY2xvbmUoKSksaj13eXNpaHRtbDUubGFuZy5vYmplY3QoaikubWVyZ2UobChhLGMuY2hlY2tfYXR0cmlidXRlcykpLmdldCgpLGsmJnMucHVzaChrKSxtKWZvcihoIGluIG0paT14W21baF1dLGkmJihnPWkod3lzaWh0bWw1LmRvbS5nZXRBdHRyaWJ1dGUoYSxoKSksXCJzdHJpbmdcIj09dHlwZW9mIGcmJnMucHVzaChnKSk7aWYobilmb3IoaCBpbiBuKWk9d1tuW2hdXSxpJiYobmV3U3R5bGU9aSh3eXNpaHRtbDUuZG9tLmdldEF0dHJpYnV0ZShhLGgpKSxcInN0cmluZ1wiPT10eXBlb2YgbmV3U3R5bGUmJnUucHVzaChuZXdTdHlsZSkpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBwJiZcImFueVwiPT09cCYmYS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSlpZih0LmNsYXNzZXNfYmxhY2tsaXN0KXtmb3IoeT1hLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpLHkmJihzPXMuY29uY2F0KHkuc3BsaXQocikpKSxlPXMubGVuZ3RoO2U+cTtxKyspZj1zW3FdLHQuY2xhc3Nlc19ibGFja2xpc3RbZl18fHYucHVzaChmKTt2Lmxlbmd0aCYmKGpbXCJjbGFzc1wiXT13eXNpaHRtbDUubGFuZy5hcnJheSh2KS51bmlxdWUoKS5qb2luKFwiIFwiKSl9ZWxzZSBqW1wiY2xhc3NcIl09YS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKTtlbHNle2ZvcihkfHwocFtcIl93eXNpaHRtbDUtdGVtcC1wbGFjZWhvbGRlclwiXT0xLHAuX3Jhbmd5U2VsZWN0aW9uQm91bmRhcnk9MSxwW1wid3lzaXd5Zy10bXAtc2VsZWN0ZWQtY2VsbFwiXT0xKSx5PWEuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikseSYmKHM9cy5jb25jYXQoeS5zcGxpdChyKSkpLGU9cy5sZW5ndGg7ZT5xO3ErKylmPXNbcV0scFtmXSYmdi5wdXNoKGYpO3YubGVuZ3RoJiYoaltcImNsYXNzXCJdPXd5c2lodG1sNS5sYW5nLmFycmF5KHYpLnVuaXF1ZSgpLmpvaW4oXCIgXCIpKX1qW1wiY2xhc3NcIl0mJmQmJihqW1wiY2xhc3NcIl09altcImNsYXNzXCJdLnJlcGxhY2UoXCJ3eXNpd3lnLXRtcC1zZWxlY3RlZC1jZWxsXCIsXCJcIiksL15cXHMqJC9nLnRlc3QoaltcImNsYXNzXCJdKSYmZGVsZXRlIGpbXCJjbGFzc1wiXSksdS5sZW5ndGgmJihqLnN0eWxlPXd5c2lodG1sNS5sYW5nLmFycmF5KHUpLnVuaXF1ZSgpLmpvaW4oXCIgXCIpKTtmb3IoaCBpbiBqKXRyeXtiLnNldEF0dHJpYnV0ZShoLGpbaF0pfWNhdGNoKHope31qLnNyYyYmKHZvaWQgMCE9PWoud2lkdGgmJmIuc2V0QXR0cmlidXRlKFwid2lkdGhcIixqLndpZHRoKSx2b2lkIDAhPT1qLmhlaWdodCYmYi5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIixqLmhlaWdodCkpfWZ1bmN0aW9uIG4oYSl7dmFyIGIsYz1hLm5leHRTaWJsaW5nO3JldHVybiBjJiZjLm5vZGVUeXBlPT09d3lzaWh0bWw1LlRFWFRfTk9ERT8oYy5kYXRhPWEuZGF0YS5yZXBsYWNlKHUsXCJcIikrYy5kYXRhLnJlcGxhY2UodSxcIlwiKSx2b2lkIDApOihiPWEuZGF0YS5yZXBsYWNlKHUsXCJcIiksYS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGIpKX1mdW5jdGlvbiBvKGEpe3JldHVybiB0LmNvbW1lbnRzP2Eub3duZXJEb2N1bWVudC5jcmVhdGVDb21tZW50KGEubm9kZVZhbHVlKTp2b2lkIDB9dmFyIHA9ezE6ZiwzOm4sODpvfSxxPVwic3BhblwiLHI9L1xccysvLHM9e3RhZ3M6e30sY2xhc3Nlczp7fX0sdD17fSx1PS9cXHVGRUZGL2csdj17dXJsOmZ1bmN0aW9uKCl7dmFyIGE9L15odHRwcz86XFwvXFwvL2k7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLm1hdGNoKGEpP2IucmVwbGFjZShhLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRvTG93ZXJDYXNlKCl9KTpudWxsfX0oKSxzcmM6ZnVuY3Rpb24oKXt2YXIgYT0vXihcXC98aHR0cHM/OlxcL1xcLykvaTtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGImJmIubWF0Y2goYSk/Yi5yZXBsYWNlKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEudG9Mb3dlckNhc2UoKX0pOm51bGx9fSgpLGhyZWY6ZnVuY3Rpb24oKXt2YXIgYT0vXigjfFxcL3xodHRwcz86XFwvXFwvfG1haWx0bzopL2k7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLm1hdGNoKGEpP2IucmVwbGFjZShhLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRvTG93ZXJDYXNlKCl9KTpudWxsfX0oKSxhbHQ6ZnVuY3Rpb24oKXt2YXIgYT0vW14gYS16MC05X1xcLV0vZ2k7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBiP2IucmVwbGFjZShhLFwiXCIpOlwiXCJ9fSgpLG51bWJlcnM6ZnVuY3Rpb24oKXt2YXIgYT0vXFxEL2c7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBiPShifHxcIlwiKS5yZXBsYWNlKGEsXCJcIiksYnx8bnVsbH19KCksYW55OmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBhfX0oKX0sdz17YWxpZ25fdGV4dDpmdW5jdGlvbigpe3ZhciBhPXtsZWZ0OlwidGV4dC1hbGlnbjogbGVmdDtcIixyaWdodDpcInRleHQtYWxpZ246IHJpZ2h0O1wiLGNlbnRlcjpcInRleHQtYWxpZ246IGNlbnRlcjtcIn07cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBhWyhiK1wiXCIpLnRvTG93ZXJDYXNlKCldfX0oKX0seD17YWxpZ25faW1nOmZ1bmN0aW9uKCl7dmFyIGE9e2xlZnQ6XCJ3eXNpd3lnLWZsb2F0LWxlZnRcIixyaWdodDpcInd5c2l3eWctZmxvYXQtcmlnaHRcIn07cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBhWyhiK1wiXCIpLnRvTG93ZXJDYXNlKCldfX0oKSxhbGlnbl90ZXh0OmZ1bmN0aW9uKCl7dmFyIGE9e2xlZnQ6XCJ3eXNpd3lnLXRleHQtYWxpZ24tbGVmdFwiLHJpZ2h0Olwid3lzaXd5Zy10ZXh0LWFsaWduLXJpZ2h0XCIsY2VudGVyOlwid3lzaXd5Zy10ZXh0LWFsaWduLWNlbnRlclwiLGp1c3RpZnk6XCJ3eXNpd3lnLXRleHQtYWxpZ24tanVzdGlmeVwifTtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGFbKGIrXCJcIikudG9Mb3dlckNhc2UoKV19fSgpLGNsZWFyX2JyOmZ1bmN0aW9uKCl7dmFyIGE9e2xlZnQ6XCJ3eXNpd3lnLWNsZWFyLWxlZnRcIixyaWdodDpcInd5c2l3eWctY2xlYXItcmlnaHRcIixib3RoOlwid3lzaXd5Zy1jbGVhci1ib3RoXCIsYWxsOlwid3lzaXd5Zy1jbGVhci1ib3RoXCJ9O3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gYVsoYitcIlwiKS50b0xvd2VyQ2FzZSgpXX19KCksc2l6ZV9mb250OmZ1bmN0aW9uKCl7dmFyIGE9ezE6XCJ3eXNpd3lnLWZvbnQtc2l6ZS14eC1zbWFsbFwiLDI6XCJ3eXNpd3lnLWZvbnQtc2l6ZS1zbWFsbFwiLDM6XCJ3eXNpd3lnLWZvbnQtc2l6ZS1tZWRpdW1cIiw0Olwid3lzaXd5Zy1mb250LXNpemUtbGFyZ2VcIiw1Olwid3lzaXd5Zy1mb250LXNpemUteC1sYXJnZVwiLDY6XCJ3eXNpd3lnLWZvbnQtc2l6ZS14eC1sYXJnZVwiLDc6XCJ3eXNpd3lnLWZvbnQtc2l6ZS14eC1sYXJnZVwiLFwiLVwiOlwid3lzaXd5Zy1mb250LXNpemUtc21hbGxlclwiLFwiK1wiOlwid3lzaXd5Zy1mb250LXNpemUtbGFyZ2VyXCJ9O3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gYVsoYitcIlwiKS5jaGFyQXQoMCldfX0oKX0seT17aGFzX3Zpc2libGVfY29udGV0OmZ1bmN0aW9uKCl7dmFyIGEsYj1bXCJpbWdcIixcInZpZGVvXCIsXCJwaWN0dXJlXCIsXCJiclwiLFwic2NyaXB0XCIsXCJub3NjcmlwdFwiLFwic3R5bGVcIixcInRhYmxlXCIsXCJpZnJhbWVcIixcIm9iamVjdFwiLFwiZW1iZWRcIixcImF1ZGlvXCIsXCJzdmdcIixcImlucHV0XCIsXCJidXR0b25cIixcInNlbGVjdFwiLFwidGV4dGFyZWFcIixcImNhbnZhc1wiXTtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYT0oYy5pbm5lclRleHR8fGMudGV4dENvbnRlbnQpLnJlcGxhY2UoL1xccy9nLFwiXCIpLGEmJmEubGVuZ3RoPjApcmV0dXJuITA7Zm9yKHZhciBkPWIubGVuZ3RoO2QtLTspaWYoYy5xdWVyeVNlbGVjdG9yKGJbZF0pKXJldHVybiEwO3JldHVybiBjLm9mZnNldFdpZHRoJiZjLm9mZnNldFdpZHRoPjAmJmMub2Zmc2V0SGVpZ2h0JiZjLm9mZnNldEhlaWdodD4wPyEwOiExfX0oKX0sej17dW53cmFwOmZ1bmN0aW9uKGEpe3d5c2lodG1sNS5kb20udW53cmFwKGEpfSxyZW1vdmU6ZnVuY3Rpb24oYSl7YS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfX07cmV0dXJuIGMoYSxiKX0sd3lzaWh0bWw1LmRvbS5yZW1vdmVFbXB0eVRleHROb2Rlcz1mdW5jdGlvbihhKXtmb3IodmFyIGIsYz13eXNpaHRtbDUubGFuZy5hcnJheShhLmNoaWxkTm9kZXMpLmdldCgpLGQ9Yy5sZW5ndGgsZT0wO2Q+ZTtlKyspYj1jW2VdLGIubm9kZVR5cGU9PT13eXNpaHRtbDUuVEVYVF9OT0RFJiZcIlwiPT09Yi5kYXRhJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYil9LHd5c2lodG1sNS5kb20ucmVuYW1lRWxlbWVudD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPWEub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KGIpO2M9YS5maXJzdENoaWxkOylkLmFwcGVuZENoaWxkKGMpO3JldHVybiB3eXNpaHRtbDUuZG9tLmNvcHlBdHRyaWJ1dGVzKFtcImFsaWduXCIsXCJjbGFzc05hbWVcIl0pLmZyb20oYSkudG8oZCksYS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGEpLGR9LHd5c2lodG1sNS5kb20ucmVwbGFjZVdpdGhDaGlsZE5vZGVzPWZ1bmN0aW9uKGEpe2lmKGEucGFyZW50Tm9kZSl7aWYoIWEuZmlyc3RDaGlsZClyZXR1cm4gYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpLHZvaWQgMDtmb3IodmFyIGI9YS5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTthLmZpcnN0Q2hpbGQ7KWIuYXBwZW5kQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGIsYSksYT1iPW51bGx9fSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIpe3JldHVyblwiYmxvY2tcIj09PWEuZ2V0U3R5bGUoXCJkaXNwbGF5XCIpLmZyb20oYil9ZnVuY3Rpb24gYyhhKXtyZXR1cm5cIkJSXCI9PT1hLm5vZGVOYW1lfWZ1bmN0aW9uIGQoYSl7dmFyIGI9YS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKTthLmFwcGVuZENoaWxkKGIpfWZ1bmN0aW9uIGUoYSxlKXtpZihhLm5vZGVOYW1lLm1hdGNoKC9eKE1FTlV8VUx8T0wpJC8pKXt2YXIgZixnLGgsaSxqLGssbD1hLm93bmVyRG9jdW1lbnQsbT1sLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxuPXd5c2lodG1sNS5kb20uZG9tTm9kZShhKS5wcmV2KHtpZ25vcmVCbGFua1RleHRzOiEwfSk7aWYoZSlmb3IoIW58fGIobil8fGMobil8fGQobSk7az1hLmZpcnN0RWxlbWVudENoaWxkfHxhLmZpcnN0Q2hpbGQ7KXtmb3IoZz1rLmxhc3RDaGlsZDtmPWsuZmlyc3RDaGlsZDspaD1mPT09ZyxpPWgmJiFiKGYpJiYhYyhmKSxtLmFwcGVuZENoaWxkKGYpLGkmJmQobSk7ay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGspfWVsc2UgZm9yKDtrPWEuZmlyc3RFbGVtZW50Q2hpbGR8fGEuZmlyc3RDaGlsZDspe2lmKGsucXVlcnlTZWxlY3RvciYmay5xdWVyeVNlbGVjdG9yKFwiZGl2LCBwLCB1bCwgb2wsIG1lbnUsIGJsb2NrcXVvdGUsIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDZcIikpZm9yKDtmPWsuZmlyc3RDaGlsZDspbS5hcHBlbmRDaGlsZChmKTtlbHNle2ZvcihqPWwuY3JlYXRlRWxlbWVudChcInBcIik7Zj1rLmZpcnN0Q2hpbGQ7KWouYXBwZW5kQ2hpbGQoZik7bS5hcHBlbmRDaGlsZChqKX1rLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoayl9YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChtLGEpfX1hLnJlc29sdmVMaXN0PWV9KHd5c2lodG1sNS5kb20pLGZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LGM9W1wicGFyZW50XCIsXCJ0b3BcIixcIm9wZW5lclwiLFwiZnJhbWVFbGVtZW50XCIsXCJmcmFtZXNcIixcImxvY2FsU3RvcmFnZVwiLFwiZ2xvYmFsU3RvcmFnZVwiLFwic2Vzc2lvblN0b3JhZ2VcIixcImluZGV4ZWREQlwiXSxkPVtcIm9wZW5cIixcImNsb3NlXCIsXCJvcGVuRGlhbG9nXCIsXCJzaG93TW9kYWxEaWFsb2dcIixcImFsZXJ0XCIsXCJjb25maXJtXCIsXCJwcm9tcHRcIixcIm9wZW5EYXRhYmFzZVwiLFwicG9zdE1lc3NhZ2VcIixcIlhNTEh0dHBSZXF1ZXN0XCIsXCJYRG9tYWluUmVxdWVzdFwiXSxlPVtcInJlZmVycmVyXCIsXCJ3cml0ZVwiLFwib3BlblwiLFwiY2xvc2VcIl07YS5kb20uU2FuZGJveD1CYXNlLmV4dGVuZCh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYixjKXt0aGlzLmNhbGxiYWNrPWJ8fGEuRU1QVFlfRlVOQ1RJT04sdGhpcy5jb25maWc9YS5sYW5nLm9iamVjdCh7fSkubWVyZ2UoYykuZ2V0KCksdGhpcy5lZGl0YWJsZUFyZWE9dGhpcy5fY3JlYXRlSWZyYW1lKCl9LGluc2VydEludG86ZnVuY3Rpb24oYSl7XCJzdHJpbmdcIj09dHlwZW9mIGEmJihhPWIuZ2V0RWxlbWVudEJ5SWQoYSkpLGEuYXBwZW5kQ2hpbGQodGhpcy5lZGl0YWJsZUFyZWEpfSxnZXRJZnJhbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGl0YWJsZUFyZWF9LGdldFdpbmRvdzpmdW5jdGlvbigpe3RoaXMuX3JlYWR5RXJyb3IoKX0sZ2V0RG9jdW1lbnQ6ZnVuY3Rpb24oKXt0aGlzLl9yZWFkeUVycm9yKCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldElmcmFtZSgpO2EucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sX3JlYWR5RXJyb3I6ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcihcInd5c2lodG1sNS5TYW5kYm94OiBTYW5kYm94IGlmcmFtZSBpc24ndCBsb2FkZWQgeWV0XCIpfSxfY3JlYXRlSWZyYW1lOmZ1bmN0aW9uKCl7dmFyIGM9dGhpcyxkPWIuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtyZXR1cm4gZC5jbGFzc05hbWU9XCJ3eXNpaHRtbDUtc2FuZGJveFwiLGEuZG9tLnNldEF0dHJpYnV0ZXMoe3NlY3VyaXR5OlwicmVzdHJpY3RlZFwiLGFsbG93dHJhbnNwYXJlbmN5OlwidHJ1ZVwiLGZyYW1lYm9yZGVyOjAsd2lkdGg6MCxoZWlnaHQ6MCxtYXJnaW53aWR0aDowLG1hcmdpbmhlaWdodDowfSkub24oZCksYS5icm93c2VyLnRocm93c01peGVkQ29udGVudFdhcm5pbmdXaGVuSWZyYW1lU3JjSXNFbXB0eSgpJiYoZC5zcmM9XCJqYXZhc2NyaXB0Oic8aHRtbD48L2h0bWw+J1wiKSxkLm9ubG9hZD1mdW5jdGlvbigpe2Qub25yZWFkeXN0YXRlY2hhbmdlPWQub25sb2FkPW51bGwsYy5fb25Mb2FkSWZyYW1lKGQpfSxkLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpey9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZC5yZWFkeVN0YXRlKSYmKGQub25yZWFkeXN0YXRlY2hhbmdlPWQub25sb2FkPW51bGwsYy5fb25Mb2FkSWZyYW1lKGQpKX0sZH0sX29uTG9hZElmcmFtZTpmdW5jdGlvbihmKXt2YXIgZyxoLGksaixrLGwsbTtpZihhLmRvbS5jb250YWlucyhiLmRvY3VtZW50RWxlbWVudCxmKSl7aWYoZz10aGlzLGg9Zi5jb250ZW50V2luZG93LGk9Zi5jb250ZW50V2luZG93LmRvY3VtZW50LGo9Yi5jaGFyYWN0ZXJTZXR8fGIuY2hhcnNldHx8XCJ1dGYtOFwiLGs9dGhpcy5fZ2V0SHRtbCh7Y2hhcnNldDpqLHN0eWxlc2hlZXRzOnRoaXMuY29uZmlnLnN0eWxlc2hlZXRzfSksaS5vcGVuKFwidGV4dC9odG1sXCIsXCJyZXBsYWNlXCIpLGkud3JpdGUoayksaS5jbG9zZSgpLHRoaXMuZ2V0V2luZG93PWZ1bmN0aW9uKCl7cmV0dXJuIGYuY29udGVudFdpbmRvd30sdGhpcy5nZXREb2N1bWVudD1mdW5jdGlvbigpe3JldHVybiBmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnR9LGgub25lcnJvcj1mdW5jdGlvbihhLGIsYyl7dGhyb3cgRXJyb3IoXCJ3eXNpaHRtbDUuU2FuZGJveDogXCIrYSxiLGMpfSwhYS5icm93c2VyLnN1cHBvcnRzU2FuZGJveGVkSWZyYW1lcygpKXtmb3IobD0wLG09Yy5sZW5ndGg7bT5sO2wrKyl0aGlzLl91bnNldChoLGNbbF0pO2ZvcihsPTAsbT1kLmxlbmd0aDttPmw7bCsrKXRoaXMuX3Vuc2V0KGgsZFtsXSxhLkVNUFRZX0ZVTkNUSU9OKTtmb3IobD0wLG09ZS5sZW5ndGg7bT5sO2wrKyl0aGlzLl91bnNldChpLGVbbF0pO3RoaXMuX3Vuc2V0KGksXCJjb29raWVcIixcIlwiLCEwKX10aGlzLmxvYWRlZD0hMCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5jYWxsYmFjayhnKX0sMCl9fSxfZ2V0SHRtbDpmdW5jdGlvbihiKXt2YXIgYyxkPWIuc3R5bGVzaGVldHMsZT1cIlwiLGY9MDtpZihkPVwic3RyaW5nXCI9PXR5cGVvZiBkP1tkXTpkLGQpZm9yKGM9ZC5sZW5ndGg7Yz5mO2YrKyllKz0nPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCInK2RbZl0rJ1wiPic7cmV0dXJuIGIuc3R5bGVzaGVldHM9ZSxhLmxhbmcuc3RyaW5nKCc8IURPQ1RZUEUgaHRtbD48aHRtbD48aGVhZD48bWV0YSBjaGFyc2V0PVwiI3tjaGFyc2V0fVwiPiN7c3R5bGVzaGVldHN9PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+JykuaW50ZXJwb2xhdGUoYil9LF91bnNldDpmdW5jdGlvbihiLGMsZCxlKXt0cnl7YltjXT1kfWNhdGNoKGYpe310cnl7Yi5fX2RlZmluZUdldHRlcl9fKGMsZnVuY3Rpb24oKXtyZXR1cm4gZH0pfWNhdGNoKGYpe31pZihlKXRyeXtiLl9fZGVmaW5lU2V0dGVyX18oYyxmdW5jdGlvbigpe30pfWNhdGNoKGYpe31pZighYS5icm93c2VyLmNyYXNoZXNXaGVuRGVmaW5lUHJvcGVydHkoYykpdHJ5e3ZhciBnPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZH19O2UmJihnLnNldD1mdW5jdGlvbigpe30pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLGMsZyl9Y2F0Y2goZil7fX19KX0od3lzaWh0bWw1KSxmdW5jdGlvbihhKXt2YXIgYj1kb2N1bWVudDthLmRvbS5Db250ZW50RWRpdGFibGVBcmVhPUJhc2UuZXh0ZW5kKHtnZXRDb250ZW50RWRpdGFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50fSxnZXRXaW5kb3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd9LGdldERvY3VtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50fSxjb25zdHJ1Y3RvcjpmdW5jdGlvbihiLGMsZCl7dGhpcy5jYWxsYmFjaz1ifHxhLkVNUFRZX0ZVTkNUSU9OLHRoaXMuY29uZmlnPWEubGFuZy5vYmplY3Qoe30pLm1lcmdlKGMpLmdldCgpLHRoaXMuZWxlbWVudD1kP3RoaXMuX2JpbmRFbGVtZW50KGQpOnRoaXMuX2NyZWF0ZUVsZW1lbnQoKX0sX2NyZWF0ZUVsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgYT1iLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7cmV0dXJuIGEuY2xhc3NOYW1lPVwid3lzaWh0bWw1LXNhbmRib3hcIix0aGlzLl9sb2FkRWxlbWVudChhKSxhfSxfYmluZEVsZW1lbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPWEuY2xhc3NOYW1lJiZcIlwiIT1hLmNsYXNzTmFtZT9hLmNsYXNzTmFtZStcIiB3eXNpaHRtbDUtc2FuZGJveFwiOlwid3lzaWh0bWw1LXNhbmRib3hcIix0aGlzLl9sb2FkRWxlbWVudChhLCEwKSxhfSxfbG9hZEVsZW1lbnQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPXRoaXM7Ynx8KGM9dGhpcy5fZ2V0SHRtbCgpLGEuaW5uZXJIVE1MPWMpLHRoaXMuZ2V0V2luZG93PWZ1bmN0aW9uKCl7cmV0dXJuIGEub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld30sdGhpcy5nZXREb2N1bWVudD1mdW5jdGlvbigpe3JldHVybiBhLm93bmVyRG9jdW1lbnR9LHRoaXMubG9hZGVkPSEwLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtkLmNhbGxiYWNrKGQpfSwwKX0sX2dldEh0bWw6ZnVuY3Rpb24oKXtyZXR1cm5cIlwifX0pfSh3eXNpaHRtbDUpLGZ1bmN0aW9uKCl7dmFyIGE9e2NsYXNzTmFtZTpcImNsYXNzXCJ9O3d5c2lodG1sNS5kb20uc2V0QXR0cmlidXRlcz1mdW5jdGlvbihiKXtyZXR1cm57b246ZnVuY3Rpb24oYyl7Zm9yKHZhciBkIGluIGIpYy5zZXRBdHRyaWJ1dGUoYVtkXXx8ZCxiW2RdKX19fX0oKSx3eXNpaHRtbDUuZG9tLnNldFN0eWxlcz1mdW5jdGlvbihhKXtyZXR1cm57b246ZnVuY3Rpb24oYil7dmFyIGMsZD1iLnN0eWxlO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhKXJldHVybiBkLmNzc1RleHQrPVwiO1wiK2Esdm9pZCAwO2ZvcihjIGluIGEpXCJmbG9hdFwiPT09Yz8oZC5jc3NGbG9hdD1hW2NdLGQuc3R5bGVGbG9hdD1hW2NdKTpkW2NdPWFbY119fX0sZnVuY3Rpb24oYSl7YS5zaW11bGF0ZVBsYWNlaG9sZGVyPWZ1bmN0aW9uKGIsYyxkKXt2YXIgZT1cInBsYWNlaG9sZGVyXCIsZj1mdW5jdGlvbigpe3ZhciBiPWMuZWxlbWVudC5vZmZzZXRXaWR0aD4wJiZjLmVsZW1lbnQub2Zmc2V0SGVpZ2h0PjA7Yy5oYXNQbGFjZWhvbGRlclNldCgpJiYoYy5jbGVhcigpLGMuZWxlbWVudC5mb2N1cygpLGImJnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT1jLnNlbGVjdGlvbi5nZXRTZWxlY3Rpb24oKTthLmZvY3VzTm9kZSYmYS5hbmNob3JOb2RlfHxjLnNlbGVjdGlvbi5zZWxlY3ROb2RlKGMuZWxlbWVudC5maXJzdENoaWxkfHxjLmVsZW1lbnQpfSwwKSksYy5wbGFjZWhvbGRlclNldD0hMSxhLnJlbW92ZUNsYXNzKGMuZWxlbWVudCxlKX0sZz1mdW5jdGlvbigpe2MuaXNFbXB0eSgpJiYoYy5wbGFjZWhvbGRlclNldD0hMCxjLnNldFZhbHVlKGQpLGEuYWRkQ2xhc3MoYy5lbGVtZW50LGUpKX07Yi5vbihcInNldF9wbGFjZWhvbGRlclwiLGcpLm9uKFwidW5zZXRfcGxhY2Vob2xkZXJcIixmKS5vbihcImZvY3VzOmNvbXBvc2VyXCIsZikub24oXCJwYXN0ZTpjb21wb3NlclwiLGYpLm9uKFwiYmx1cjpjb21wb3NlclwiLGcpLGcoKX19KHd5c2lodG1sNS5kb20pLGZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcInRleHRDb250ZW50XCJpbiBiPyhhLnNldFRleHRDb250ZW50PWZ1bmN0aW9uKGEsYil7YS50ZXh0Q29udGVudD1ifSxhLmdldFRleHRDb250ZW50PWZ1bmN0aW9uKGEpe3JldHVybiBhLnRleHRDb250ZW50fSk6XCJpbm5lclRleHRcImluIGI/KGEuc2V0VGV4dENvbnRlbnQ9ZnVuY3Rpb24oYSxiKXthLmlubmVyVGV4dD1ifSxhLmdldFRleHRDb250ZW50PWZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVyVGV4dH0pOihhLnNldFRleHRDb250ZW50PWZ1bmN0aW9uKGEsYil7YS5ub2RlVmFsdWU9Yn0sYS5nZXRUZXh0Q29udGVudD1mdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVmFsdWV9KX0od3lzaWh0bWw1LmRvbSksd3lzaWh0bWw1LmRvbS5nZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj0hd3lzaWh0bWw1LmJyb3dzZXIuc3VwcG9ydHNHZXRBdHRyaWJ1dGVDb3JyZWN0bHkoKTtyZXR1cm4gYj1iLnRvTG93ZXJDYXNlKCksYz1hLm5vZGVOYW1lLFwiSU1HXCI9PWMmJlwic3JjXCI9PWImJnd5c2lodG1sNS5kb20uaXNMb2FkZWRJbWFnZShhKT09PSEwP2Euc3JjOmYmJlwib3V0ZXJIVE1MXCJpbiBhPyhkPWEub3V0ZXJIVE1MLnRvTG93ZXJDYXNlKCksZT0tMSE9ZC5pbmRleE9mKFwiIFwiK2IrXCI9XCIpLGU/YS5nZXRBdHRyaWJ1dGUoYik6bnVsbCk6YS5nZXRBdHRyaWJ1dGUoYil9LHd5c2lodG1sNS5kb20uZ2V0QXR0cmlidXRlcz1mdW5jdGlvbihhKXt2YXIgYixjPSF3eXNpaHRtbDUuYnJvd3Nlci5zdXBwb3J0c0dldEF0dHJpYnV0ZUNvcnJlY3RseSgpLGQ9YS5ub2RlTmFtZSxlPVtdO2ZvcihiIGluIGEuYXR0cmlidXRlcykoYS5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5JiZhLmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoYil8fCFhLmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLmF0dHJpYnV0ZXMsYikpJiZhLmF0dHJpYnV0ZXNbYl0uc3BlY2lmaWVkJiYoXCJJTUdcIj09ZCYmXCJzcmNcIj09YS5hdHRyaWJ1dGVzW2JdLm5hbWUudG9Mb3dlckNhc2UoKSYmd3lzaWh0bWw1LmRvbS5pc0xvYWRlZEltYWdlKGEpPT09ITA/ZS5zcmM9YS5zcmM6d3lzaWh0bWw1LmxhbmcuYXJyYXkoW1wicm93c3BhblwiLFwiY29sc3BhblwiXSkuY29udGFpbnMoYS5hdHRyaWJ1dGVzW2JdLm5hbWUudG9Mb3dlckNhc2UoKSkmJmM/MSE9PWEuYXR0cmlidXRlc1tiXS52YWx1ZSYmKGVbYS5hdHRyaWJ1dGVzW2JdLm5hbWVdPWEuYXR0cmlidXRlc1tiXS52YWx1ZSk6ZVthLmF0dHJpYnV0ZXNbYl0ubmFtZV09YS5hdHRyaWJ1dGVzW2JdLnZhbHVlKTtyZXR1cm4gZX0sd3lzaWh0bWw1LmRvbS5pc0xvYWRlZEltYWdlPWZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4gYS5jb21wbGV0ZSYmIWEubW96TWF0Y2hlc1NlbGVjdG9yKFwiOi1tb3otYnJva2VuXCIpfWNhdGNoKGIpe2lmKGEuY29tcGxldGUmJlwiY29tcGxldGVcIj09PWEucmVhZHlTdGF0ZSlyZXR1cm4hMH19LGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYyxkLGUsZixnPVtdO2ZvcihkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWlmKGM9YVtkXS5xdWVyeVNlbGVjdG9yQWxsKGIpLGMpZm9yKGY9Yy5sZW5ndGg7Zi0tO2cudW5zaGlmdChjW2ZdKSk7cmV0dXJuIGd9ZnVuY3Rpb24gZChhKXthLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSl9ZnVuY3Rpb24gZShhLGIpe2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYixhLm5leHRTaWJsaW5nKX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjPWEubmV4dFNpYmxpbmc7MSE9Yy5ub2RlVHlwZTspaWYoYz1jLm5leHRTaWJsaW5nLCFifHxiPT1jLnRhZ05hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gYztyZXR1cm4gbnVsbH12YXIgZz1hLmRvbSxoPWZ1bmN0aW9uKGEpe3RoaXMuZWw9YSx0aGlzLmlzQ29sc3Bhbj0hMSx0aGlzLmlzUm93c3Bhbj0hMSx0aGlzLmZpcnN0Q29sPSEwLHRoaXMubGFzdENvbD0hMCx0aGlzLmZpcnN0Um93PSEwLHRoaXMubGFzdFJvdz0hMCx0aGlzLmlzUmVhbD0hMCx0aGlzLnNwYW5Db2xsZWN0aW9uPVtdLHRoaXMubW9kaWZpZWQ9ITF9LGk9ZnVuY3Rpb24oYSxiKXthPyh0aGlzLmNlbGw9YSx0aGlzLnRhYmxlPWcuZ2V0UGFyZW50RWxlbWVudChhLHtub2RlTmFtZTpbXCJUQUJMRVwiXX0pKTpiJiYodGhpcy50YWJsZT1iLHRoaXMuY2VsbD10aGlzLnRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0aCwgdGRcIilbMF0pfTtpLnByb3RvdHlwZT17YWRkU3Bhbm5lZENlbGxUb01hcDpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGcsaSxqPVtdLGs9YysoZj9wYXJzZUludChmLDEwKS0xOjApLGw9ZCsoZT9wYXJzZUludChlLDEwKS0xOjApO2ZvcihnPWM7az49ZztnKyspZm9yKHZvaWQgMD09PWJbZ10mJihiW2ddPVtdKSxpPWQ7bD49aTtpKyspYltnXVtpXT1uZXcgaChhKSxiW2ddW2ldLmlzQ29sc3Bhbj1lJiZwYXJzZUludChlLDEwKT4xLGJbZ11baV0uaXNSb3dzcGFuPWYmJnBhcnNlSW50KGYsMTApPjEsYltnXVtpXS5maXJzdENvbD1pPT1kLGJbZ11baV0ubGFzdENvbD1pPT1sLGJbZ11baV0uZmlyc3RSb3c9Zz09YyxiW2ddW2ldLmxhc3RSb3c9Zz09ayxiW2ddW2ldLmlzUmVhbD1pPT1kJiZnPT1jLGJbZ11baV0uc3BhbkNvbGxlY3Rpb249aixqLnB1c2goYltnXVtpXSl9LHNldENlbGxBc01vZGlmaWVkOmZ1bmN0aW9uKGEpe2lmKGEubW9kaWZpZWQ9ITAsYS5zcGFuQ29sbGVjdGlvbi5sZW5ndGg+MClmb3IodmFyIGI9MCxjPWEuc3BhbkNvbGxlY3Rpb24ubGVuZ3RoO2M+YjtiKyspYS5zcGFuQ29sbGVjdGlvbltiXS5tb2RpZmllZD0hMH0sc2V0VGFibGVNYXA6ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsaSxqLGs9W10sbD10aGlzLmdldFRhYmxlUm93cygpO2ZvcihhPTA7YTxsLmxlbmd0aDthKyspZm9yKGI9bFthXSxjPXRoaXMuZ2V0Um93Q2VsbHMoYiksZj0wLHZvaWQgMD09PWtbYV0mJihrW2FdPVtdKSxkPTA7ZDxjLmxlbmd0aDtkKyspe2ZvcihlPWNbZF07dm9pZCAwIT09a1thXVtmXTspZisrO2k9Zy5nZXRBdHRyaWJ1dGUoZSxcImNvbHNwYW5cIiksaj1nLmdldEF0dHJpYnV0ZShlLFwicm93c3BhblwiKSxpfHxqPyh0aGlzLmFkZFNwYW5uZWRDZWxsVG9NYXAoZSxrLGEsZixpLGopLGYrPWk/cGFyc2VJbnQoaSwxMCk6MSk6KGtbYV1bZl09bmV3IGgoZSksZisrKX1yZXR1cm4gdGhpcy5tYXA9ayxrfSxnZXRSb3dDZWxsczpmdW5jdGlvbihjKXt2YXIgZD10aGlzLnRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0YWJsZVwiKSxlPWQ/YihkLFwidGgsIHRkXCIpOltdLGY9Yy5xdWVyeVNlbGVjdG9yQWxsKFwidGgsIHRkXCIpLGc9ZS5sZW5ndGg+MD9hLmxhbmcuYXJyYXkoZikud2l0aG91dChlKTpmO3JldHVybiBnfSxnZXRUYWJsZVJvd3M6ZnVuY3Rpb24oKXt2YXIgYz10aGlzLnRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0YWJsZVwiKSxkPWM/YihjLFwidHJcIik6W10sZT10aGlzLnRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0clwiKSxmPWQubGVuZ3RoPjA/YS5sYW5nLmFycmF5KGUpLndpdGhvdXQoZCk6ZTtyZXR1cm4gZn0sZ2V0TWFwSW5kZXg6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPXRoaXMubWFwLmxlbmd0aCxlPXRoaXMubWFwJiZ0aGlzLm1hcFswXT90aGlzLm1hcFswXS5sZW5ndGg6MDtmb3IoYj0wO2Q+YjtiKyspZm9yKGM9MDtlPmM7YysrKWlmKHRoaXMubWFwW2JdW2NdLmVsPT09YSlyZXR1cm57cm93OmIsY29sOmN9O3JldHVybiExfSxnZXRFbGVtZW50QXRJbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRUYWJsZU1hcCgpLHRoaXMubWFwW2Eucm93XSYmdGhpcy5tYXBbYS5yb3ddW2EuY29sXSYmdGhpcy5tYXBbYS5yb3ddW2EuY29sXS5lbD90aGlzLm1hcFthLnJvd11bYS5jb2xdLmVsOm51bGx9LGdldE1hcEVsc1RvOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPVtdO2lmKHRoaXMuc2V0VGFibGVNYXAoKSx0aGlzLmlkeF9zdGFydD10aGlzLmdldE1hcEluZGV4KHRoaXMuY2VsbCksdGhpcy5pZHhfZW5kPXRoaXMuZ2V0TWFwSW5kZXgoYSksKHRoaXMuaWR4X3N0YXJ0LnJvdz50aGlzLmlkeF9lbmQucm93fHx0aGlzLmlkeF9zdGFydC5yb3c9PXRoaXMuaWR4X2VuZC5yb3cmJnRoaXMuaWR4X3N0YXJ0LmNvbD50aGlzLmlkeF9lbmQuY29sKSYmKGI9dGhpcy5pZHhfc3RhcnQsdGhpcy5pZHhfc3RhcnQ9dGhpcy5pZHhfZW5kLHRoaXMuaWR4X2VuZD1iKSx0aGlzLmlkeF9zdGFydC5jb2w+dGhpcy5pZHhfZW5kLmNvbCYmKGM9dGhpcy5pZHhfc3RhcnQuY29sLHRoaXMuaWR4X3N0YXJ0LmNvbD10aGlzLmlkeF9lbmQuY29sLHRoaXMuaWR4X2VuZC5jb2w9YyksbnVsbCE9dGhpcy5pZHhfc3RhcnQmJm51bGwhPXRoaXMuaWR4X2VuZClmb3IoZD10aGlzLmlkeF9zdGFydC5yb3csZT10aGlzLmlkeF9lbmQucm93O2U+PWQ7ZCsrKWZvcihmPXRoaXMuaWR4X3N0YXJ0LmNvbCxnPXRoaXMuaWR4X2VuZC5jb2w7Zz49ZjtmKyspaC5wdXNoKHRoaXMubWFwW2RdW2ZdLmVsKTtyZXR1cm4gaH0sb3JkZXJTZWxlY3Rpb25FbmRzOmZ1bmN0aW9uKGEpe3ZhciBiLGM7cmV0dXJuIHRoaXMuc2V0VGFibGVNYXAoKSx0aGlzLmlkeF9zdGFydD10aGlzLmdldE1hcEluZGV4KHRoaXMuY2VsbCksdGhpcy5pZHhfZW5kPXRoaXMuZ2V0TWFwSW5kZXgoYSksKHRoaXMuaWR4X3N0YXJ0LnJvdz50aGlzLmlkeF9lbmQucm93fHx0aGlzLmlkeF9zdGFydC5yb3c9PXRoaXMuaWR4X2VuZC5yb3cmJnRoaXMuaWR4X3N0YXJ0LmNvbD50aGlzLmlkeF9lbmQuY29sKSYmKGI9dGhpcy5pZHhfc3RhcnQsdGhpcy5pZHhfc3RhcnQ9dGhpcy5pZHhfZW5kLHRoaXMuaWR4X2VuZD1iKSx0aGlzLmlkeF9zdGFydC5jb2w+dGhpcy5pZHhfZW5kLmNvbCYmKGM9dGhpcy5pZHhfc3RhcnQuY29sLHRoaXMuaWR4X3N0YXJ0LmNvbD10aGlzLmlkeF9lbmQuY29sLHRoaXMuaWR4X2VuZC5jb2w9Yykse3N0YXJ0OnRoaXMubWFwW3RoaXMuaWR4X3N0YXJ0LnJvd11bdGhpcy5pZHhfc3RhcnQuY29sXS5lbCxlbmQ6dGhpcy5tYXBbdGhpcy5pZHhfZW5kLnJvd11bdGhpcy5pZHhfZW5kLmNvbF0uZWx9fSxjcmVhdGVDZWxsczpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGc9dGhpcy50YWJsZS5vd25lckRvY3VtZW50LGg9Zy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Zm9yKGU9MDtiPmU7ZSsrKXtpZihkPWcuY3JlYXRlRWxlbWVudChhKSxjKWZvcihmIGluIGMpYy5oYXNPd25Qcm9wZXJ0eShmKSYmZC5zZXRBdHRyaWJ1dGUoZixjW2ZdKTtkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiwqBcIikpLGguYXBwZW5kQ2hpbGQoZCl9cmV0dXJuIGh9LGNvcnJlY3RDb2xJbmRleEZvclVucmVhbHM6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9dGhpcy5tYXBbYl0sZj0tMTtmb3IoYz0wLGQ9YTthPmM7YysrKWVbY10uaXNSZWFsJiZmKys7cmV0dXJuIGZ9LGdldExhc3ROZXdDZWxsT25Sb3c6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnPXRoaXMuZ2V0Um93Q2VsbHMoYSk7Zm9yKGU9MCxmPWcubGVuZ3RoO2Y+ZTtlKyspaWYoYz1nW2VdLGQ9dGhpcy5nZXRNYXBJbmRleChjKSxkPT09ITF8fHZvaWQgMCE9PWImJmQucm93IT1iKXJldHVybiBjO3JldHVybiBudWxsfSxyZW1vdmVFbXB0eVRhYmxlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YWJsZS5xdWVyeVNlbGVjdG9yQWxsKFwidGQsIHRoXCIpO3JldHVybiBhJiYwIT1hLmxlbmd0aD8hMTooZCh0aGlzLnRhYmxlKSwhMCl9LHNwbGl0Um93VG9DZWxsczpmdW5jdGlvbihhKXt2YXIgYixjLGQ7YS5pc0NvbHNwYW4mJihiPXBhcnNlSW50KGcuZ2V0QXR0cmlidXRlKGEuZWwsXCJjb2xzcGFuXCIpfHwxLDEwKSxjPWEuZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpLGI+MSYmKGQ9dGhpcy5jcmVhdGVDZWxscyhjLGItMSksZShhLmVsLGQpKSxhLmVsLnJlbW92ZUF0dHJpYnV0ZShcImNvbHNwYW5cIikpfSxnZXRSZWFsUm93RWw6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9bnVsbCxmPW51bGw7Zm9yKGI9Ynx8dGhpcy5pZHgsYz0wLGQ9dGhpcy5tYXBbYi5yb3ddLmxlbmd0aDtkPmM7YysrKWlmKGY9dGhpcy5tYXBbYi5yb3ddW2NdLGYuaXNSZWFsJiYoZT1nLmdldFBhcmVudEVsZW1lbnQoZi5lbCx7bm9kZU5hbWU6W1wiVFJcIl19KSxlKSlyZXR1cm4gZTtyZXR1cm4gbnVsbD09PWUmJmEmJihlPWcuZ2V0UGFyZW50RWxlbWVudCh0aGlzLm1hcFtiLnJvd11bYi5jb2xdLmVsLHtub2RlTmFtZTpbXCJUUlwiXX0pfHxudWxsKSxlfSxpbmplY3RSb3dBdDpmdW5jdGlvbihhLGIsYyxkLGYpe3ZhciBoLGksaj10aGlzLmdldFJlYWxSb3dFbCghMSx7cm93OmEsY29sOmJ9KSxrPXRoaXMuY3JlYXRlQ2VsbHMoZCxjKTtqPyhoPXRoaXMuY29ycmVjdENvbEluZGV4Rm9yVW5yZWFscyhiLGEpLGg+PTA/ZSh0aGlzLmdldFJvd0NlbGxzKGopW2hdLGspOmouaW5zZXJ0QmVmb3JlKGssai5maXJzdENoaWxkKSk6KGk9dGhpcy50YWJsZS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0clwiKSxpLmFwcGVuZENoaWxkKGspLGUoZy5nZXRQYXJlbnRFbGVtZW50KGYuZWwse25vZGVOYW1lOltcIlRSXCJdfSksaSkpfSxjYW5NZXJnZTpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGc7Zm9yKHRoaXMudG89YSx0aGlzLnNldFRhYmxlTWFwKCksdGhpcy5pZHhfc3RhcnQ9dGhpcy5nZXRNYXBJbmRleCh0aGlzLmNlbGwpLHRoaXMuaWR4X2VuZD10aGlzLmdldE1hcEluZGV4KHRoaXMudG8pLCh0aGlzLmlkeF9zdGFydC5yb3c+dGhpcy5pZHhfZW5kLnJvd3x8dGhpcy5pZHhfc3RhcnQucm93PT10aGlzLmlkeF9lbmQucm93JiZ0aGlzLmlkeF9zdGFydC5jb2w+dGhpcy5pZHhfZW5kLmNvbCkmJihiPXRoaXMuaWR4X3N0YXJ0LHRoaXMuaWR4X3N0YXJ0PXRoaXMuaWR4X2VuZCx0aGlzLmlkeF9lbmQ9YiksdGhpcy5pZHhfc3RhcnQuY29sPnRoaXMuaWR4X2VuZC5jb2wmJihjPXRoaXMuaWR4X3N0YXJ0LmNvbCx0aGlzLmlkeF9zdGFydC5jb2w9dGhpcy5pZHhfZW5kLmNvbCx0aGlzLmlkeF9lbmQuY29sPWMpLGQ9dGhpcy5pZHhfc3RhcnQucm93LGU9dGhpcy5pZHhfZW5kLnJvdztlPj1kO2QrKylmb3IoZj10aGlzLmlkeF9zdGFydC5jb2wsZz10aGlzLmlkeF9lbmQuY29sO2c+PWY7ZisrKWlmKHRoaXMubWFwW2RdW2ZdLmlzQ29sc3Bhbnx8dGhpcy5tYXBbZF1bZl0uaXNSb3dzcGFuKXJldHVybiExO3JldHVybiEwfSxkZWNyZWFzZUNlbGxTcGFuOmZ1bmN0aW9uKGEsYil7dmFyIGM9cGFyc2VJbnQoZy5nZXRBdHRyaWJ1dGUoYS5lbCxiKSwxMCktMTtjPj0xP2EuZWwuc2V0QXR0cmlidXRlKGIsYyk6KGEuZWwucmVtb3ZlQXR0cmlidXRlKGIpLFwiY29sc3BhblwiPT1iJiYoYS5pc0NvbHNwYW49ITEpLFwicm93c3BhblwiPT1iJiYoYS5pc1Jvd3NwYW49ITEpLGEuZmlyc3RDb2w9ITAsYS5sYXN0Q29sPSEwLGEuZmlyc3RSb3c9ITAsYS5sYXN0Um93PSEwLGEuaXNSZWFsPSEwKX0scmVtb3ZlU3VycGx1c0xpbmVzOmZ1bmN0aW9uKCl7dmFyIGEsYixjLGUsZixoLGksajtpZih0aGlzLnNldFRhYmxlTWFwKCksdGhpcy5tYXApe2ZvcihjPTAsZT10aGlzLm1hcC5sZW5ndGg7ZT5jO2MrKyl7Zm9yKGE9dGhpcy5tYXBbY10saT0hMCxmPTAsaD1hLmxlbmd0aDtoPmY7ZisrKWlmKGI9YVtmXSwhKGcuZ2V0QXR0cmlidXRlKGIuZWwsXCJyb3dzcGFuXCIpJiZwYXJzZUludChnLmdldEF0dHJpYnV0ZShiLmVsLFwicm93c3BhblwiKSwxMCk+MSYmYi5maXJzdFJvdyE9PSEwKSl7aT0hMTticmVha31pZihpKWZvcihmPTA7aD5mO2YrKyl0aGlzLmRlY3JlYXNlQ2VsbFNwYW4oYVtmXSxcInJvd3NwYW5cIil9Zm9yKGo9dGhpcy5nZXRUYWJsZVJvd3MoKSxjPTAsZT1qLmxlbmd0aDtlPmM7YysrKWE9altjXSwwPT1hLmNoaWxkTm9kZXMubGVuZ3RoJiYvXlxccyokLy50ZXN0KGEudGV4dENvbnRlbnR8fGEuaW5uZXJUZXh0KSYmZChhKX19LGZpbGxNaXNzaW5nQ2VsbHM6ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZD0wLGY9MCxnPW51bGw7aWYodGhpcy5zZXRUYWJsZU1hcCgpLHRoaXMubWFwKXtmb3IoZD10aGlzLm1hcC5sZW5ndGgsYT0wO2Q+YTthKyspdGhpcy5tYXBbYV0ubGVuZ3RoPmYmJihmPXRoaXMubWFwW2FdLmxlbmd0aCk7Zm9yKGI9MDtkPmI7YisrKWZvcihjPTA7Zj5jO2MrKyl0aGlzLm1hcFtiXSYmIXRoaXMubWFwW2JdW2NdJiZjPjAmJih0aGlzLm1hcFtiXVtjXT1uZXcgaCh0aGlzLmNyZWF0ZUNlbGxzKFwidGRcIiwxKSksZz10aGlzLm1hcFtiXVtjLTFdLGcmJmcuZWwmJmcuZWwucGFyZW50JiZlKHRoaXMubWFwW2JdW2MtMV0uZWwsdGhpcy5tYXBbYl1bY10uZWwpKX19LHJlY3RpZnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW1vdmVFbXB0eVRhYmxlKCk/ITE6KHRoaXMucmVtb3ZlU3VycGx1c0xpbmVzKCksdGhpcy5maWxsTWlzc2luZ0NlbGxzKCksITApfSx1bm1lcmdlOmZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmO2lmKHRoaXMucmVjdGlmeSgpJiYodGhpcy5zZXRUYWJsZU1hcCgpLHRoaXMuaWR4PXRoaXMuZ2V0TWFwSW5kZXgodGhpcy5jZWxsKSx0aGlzLmlkeCkpe2lmKGE9dGhpcy5tYXBbdGhpcy5pZHgucm93XVt0aGlzLmlkeC5jb2xdLGI9Zy5nZXRBdHRyaWJ1dGUoYS5lbCxcImNvbHNwYW5cIik/cGFyc2VJbnQoZy5nZXRBdHRyaWJ1dGUoYS5lbCxcImNvbHNwYW5cIiksMTApOjEsYz1hLmVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSxhLmlzUm93c3Bhbil7aWYoZD1wYXJzZUludChnLmdldEF0dHJpYnV0ZShhLmVsLFwicm93c3BhblwiKSwxMCksZD4xKWZvcihlPTEsZj1kLTE7Zj49ZTtlKyspdGhpcy5pbmplY3RSb3dBdCh0aGlzLmlkeC5yb3crZSx0aGlzLmlkeC5jb2wsYixjLGEpO2EuZWwucmVtb3ZlQXR0cmlidXRlKFwicm93c3BhblwiKX10aGlzLnNwbGl0Um93VG9DZWxscyhhKX19LG1lcmdlOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZSxmLGcsaDtpZih0aGlzLnJlY3RpZnkoKSlpZih0aGlzLmNhbk1lcmdlKGEpKXtmb3IoYj10aGlzLmlkeF9lbmQucm93LXRoaXMuaWR4X3N0YXJ0LnJvdysxLGM9dGhpcy5pZHhfZW5kLmNvbC10aGlzLmlkeF9zdGFydC5jb2wrMSxlPXRoaXMuaWR4X3N0YXJ0LnJvdyxmPXRoaXMuaWR4X2VuZC5yb3c7Zj49ZTtlKyspZm9yKGc9dGhpcy5pZHhfc3RhcnQuY29sLGg9dGhpcy5pZHhfZW5kLmNvbDtoPj1nO2crKyllPT10aGlzLmlkeF9zdGFydC5yb3cmJmc9PXRoaXMuaWR4X3N0YXJ0LmNvbD8oYj4xJiZ0aGlzLm1hcFtlXVtnXS5lbC5zZXRBdHRyaWJ1dGUoXCJyb3dzcGFuXCIsYiksYz4xJiZ0aGlzLm1hcFtlXVtnXS5lbC5zZXRBdHRyaWJ1dGUoXCJjb2xzcGFuXCIsYykpOigvXlxccyo8YnJcXC8/PlxccyokLy50ZXN0KHRoaXMubWFwW2VdW2ddLmVsLmlubmVySFRNTC50b0xvd2VyQ2FzZSgpKXx8KHRoaXMubWFwW3RoaXMuaWR4X3N0YXJ0LnJvd11bdGhpcy5pZHhfc3RhcnQuY29sXS5lbC5pbm5lckhUTUwrPVwiIFwiK3RoaXMubWFwW2VdW2ddLmVsLmlubmVySFRNTCksZCh0aGlzLm1hcFtlXVtnXS5lbCkpO3RoaXMucmVjdGlmeSgpfWVsc2Ugd2luZG93LmNvbnNvbGUmJnZvaWQgMH0sY29sbGFwc2VDZWxsVG9OZXh0Um93OmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxmPXRoaXMuZ2V0TWFwSW5kZXgoYS5lbCksaD1mLnJvdysxLGk9e3JvdzpoLGNvbDpmLmNvbH07aDx0aGlzLm1hcC5sZW5ndGgmJihiPXRoaXMuZ2V0UmVhbFJvd0VsKCExLGkpLG51bGwhPT1iJiYoYz10aGlzLmNvcnJlY3RDb2xJbmRleEZvclVucmVhbHMoaS5jb2wsaS5yb3cpLGM+PTA/ZSh0aGlzLmdldFJvd0NlbGxzKGIpW2NdLGEuZWwpOihkPXRoaXMuZ2V0TGFzdE5ld0NlbGxPblJvdyhiLGgpLG51bGwhPT1kP2UoZCxhLmVsKTpiLmluc2VydEJlZm9yZShhLmVsLGIuZmlyc3RDaGlsZCkpLHBhcnNlSW50KGcuZ2V0QXR0cmlidXRlKGEuZWwsXCJyb3dzcGFuXCIpLDEwKT4yP2EuZWwuc2V0QXR0cmlidXRlKFwicm93c3BhblwiLHBhcnNlSW50KGcuZ2V0QXR0cmlidXRlKGEuZWwsXCJyb3dzcGFuXCIpLDEwKS0xKTphLmVsLnJlbW92ZUF0dHJpYnV0ZShcInJvd3NwYW5cIikpKX0scmVtb3ZlUm93Q2VsbDpmdW5jdGlvbihhKXthLmlzUmVhbD9hLmlzUm93c3Bhbj90aGlzLmNvbGxhcHNlQ2VsbFRvTmV4dFJvdyhhKTpkKGEuZWwpOnBhcnNlSW50KGcuZ2V0QXR0cmlidXRlKGEuZWwsXCJyb3dzcGFuXCIpLDEwKT4yP2EuZWwuc2V0QXR0cmlidXRlKFwicm93c3BhblwiLHBhcnNlSW50KGcuZ2V0QXR0cmlidXRlKGEuZWwsXCJyb3dzcGFuXCIpLDEwKS0xKTphLmVsLnJlbW92ZUF0dHJpYnV0ZShcInJvd3NwYW5cIil9LGdldFJvd0VsZW1lbnRzQnlDZWxsOmZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ9W107aWYodGhpcy5zZXRUYWJsZU1hcCgpLHRoaXMuaWR4PXRoaXMuZ2V0TWFwSW5kZXgodGhpcy5jZWxsKSx0aGlzLmlkeCE9PSExKWZvcihhPXRoaXMubWFwW3RoaXMuaWR4LnJvd10sYj0wLGM9YS5sZW5ndGg7Yz5iO2IrKylhW2JdLmlzUmVhbCYmZC5wdXNoKGFbYl0uZWwpO3JldHVybiBkfSxnZXRDb2x1bW5FbGVtZW50c0J5Q2VsbDpmdW5jdGlvbigpe3ZhciBhLGIsYz1bXTtpZih0aGlzLnNldFRhYmxlTWFwKCksdGhpcy5pZHg9dGhpcy5nZXRNYXBJbmRleCh0aGlzLmNlbGwpLHRoaXMuaWR4IT09ITEpZm9yKGE9MCxiPXRoaXMubWFwLmxlbmd0aDtiPmE7YSsrKXRoaXMubWFwW2FdW3RoaXMuaWR4LmNvbF0mJnRoaXMubWFwW2FdW3RoaXMuaWR4LmNvbF0uaXNSZWFsJiZjLnB1c2godGhpcy5tYXBbYV1bdGhpcy5pZHguY29sXS5lbCk7cmV0dXJuIGN9LHJlbW92ZVJvdzpmdW5jdGlvbigpe3ZhciBhLGIsYyxlPWcuZ2V0UGFyZW50RWxlbWVudCh0aGlzLmNlbGwse25vZGVOYW1lOltcIlRSXCJdfSk7aWYoZSl7aWYodGhpcy5zZXRUYWJsZU1hcCgpLHRoaXMuaWR4PXRoaXMuZ2V0TWFwSW5kZXgodGhpcy5jZWxsKSx0aGlzLmlkeCE9PSExKWZvcihhPXRoaXMubWFwW3RoaXMuaWR4LnJvd10sYj0wLGM9YS5sZW5ndGg7Yz5iO2IrKylhW2JdLm1vZGlmaWVkfHwodGhpcy5zZXRDZWxsQXNNb2RpZmllZChhW2JdKSx0aGlzLnJlbW92ZVJvd0NlbGwoYVtiXSkpO2QoZSl9fSxyZW1vdmVDb2xDZWxsOmZ1bmN0aW9uKGEpe2EuaXNDb2xzcGFuP3BhcnNlSW50KGcuZ2V0QXR0cmlidXRlKGEuZWwsXCJjb2xzcGFuXCIpLDEwKT4yP2EuZWwuc2V0QXR0cmlidXRlKFwiY29sc3BhblwiLHBhcnNlSW50KGcuZ2V0QXR0cmlidXRlKGEuZWwsXCJjb2xzcGFuXCIpLDEwKS0xKTphLmVsLnJlbW92ZUF0dHJpYnV0ZShcImNvbHNwYW5cIik6YS5pc1JlYWwmJmQoYS5lbCl9LHJlbW92ZUNvbHVtbjpmdW5jdGlvbigpe2lmKHRoaXMuc2V0VGFibGVNYXAoKSx0aGlzLmlkeD10aGlzLmdldE1hcEluZGV4KHRoaXMuY2VsbCksdGhpcy5pZHghPT0hMSlmb3IodmFyIGE9MCxiPXRoaXMubWFwLmxlbmd0aDtiPmE7YSsrKXRoaXMubWFwW2FdW3RoaXMuaWR4LmNvbF0ubW9kaWZpZWR8fCh0aGlzLnNldENlbGxBc01vZGlmaWVkKHRoaXMubWFwW2FdW3RoaXMuaWR4LmNvbF0pLHRoaXMucmVtb3ZlQ29sQ2VsbCh0aGlzLm1hcFthXVt0aGlzLmlkeC5jb2xdKSl9LHJlbW92ZTpmdW5jdGlvbihhKXtpZih0aGlzLnJlY3RpZnkoKSl7c3dpdGNoKGEpe2Nhc2VcInJvd1wiOnRoaXMucmVtb3ZlUm93KCk7YnJlYWs7Y2FzZVwiY29sdW1uXCI6dGhpcy5yZW1vdmVDb2x1bW4oKX10aGlzLnJlY3RpZnkoKX19LGFkZFJvdzpmdW5jdGlvbihhKXt2YXIgYixjLGQsZixoLGk9dGhpcy50YWJsZS5vd25lckRvY3VtZW50O2lmKHRoaXMuc2V0VGFibGVNYXAoKSx0aGlzLmlkeD10aGlzLmdldE1hcEluZGV4KHRoaXMuY2VsbCksXCJiZWxvd1wiPT1hJiZnLmdldEF0dHJpYnV0ZSh0aGlzLmNlbGwsXCJyb3dzcGFuXCIpJiYodGhpcy5pZHgucm93PXRoaXMuaWR4LnJvdytwYXJzZUludChnLmdldEF0dHJpYnV0ZSh0aGlzLmNlbGwsXCJyb3dzcGFuXCIpLDEwKS0xKSx0aGlzLmlkeCE9PSExKXtmb3IoYj10aGlzLm1hcFt0aGlzLmlkeC5yb3ddLGM9aS5jcmVhdGVFbGVtZW50KFwidHJcIiksZD0wLGY9Yi5sZW5ndGg7Zj5kO2QrKyliW2RdLm1vZGlmaWVkfHwodGhpcy5zZXRDZWxsQXNNb2RpZmllZChiW2RdKSx0aGlzLmFkZFJvd0NlbGwoYltkXSxjLGEpKTtzd2l0Y2goYSl7Y2FzZVwiYmVsb3dcIjplKHRoaXMuZ2V0UmVhbFJvd0VsKCEwKSxjKTticmVhaztjYXNlXCJhYm92ZVwiOmg9Zy5nZXRQYXJlbnRFbGVtZW50KHRoaXMubWFwW3RoaXMuaWR4LnJvd11bdGhpcy5pZHguY29sXS5lbCx7bm9kZU5hbWU6W1wiVFJcIl19KSxoJiZoLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGMsaCl9fX0sYWRkUm93Q2VsbDpmdW5jdGlvbihhLGIsZCl7dmFyIGU9YS5pc0NvbHNwYW4/e2NvbHNwYW46Zy5nZXRBdHRyaWJ1dGUoYS5lbCxcImNvbHNwYW5cIil9Om51bGw7YS5pc1JlYWw/XCJhYm92ZVwiIT1kJiZhLmlzUm93c3Bhbj9hLmVsLnNldEF0dHJpYnV0ZShcInJvd3NwYW5cIixwYXJzZUludChnLmdldEF0dHJpYnV0ZShhLmVsLFwicm93c3BhblwiKSwxMCkrMSk6Yi5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUNlbGxzKFwidGRcIiwxLGUpKTpcImFib3ZlXCIhPWQmJmEuaXNSb3dzcGFuJiZhLmxhc3RSb3c/Yi5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUNlbGxzKFwidGRcIiwxLGUpKTpjLmlzUm93c3BhbiYmYS5lbC5hdHRyKFwicm93c3BhblwiLHBhcnNlSW50KGcuZ2V0QXR0cmlidXRlKGEuZWwsXCJyb3dzcGFuXCIpLDEwKSsxKX0sYWRkOmZ1bmN0aW9uKGEpe3RoaXMucmVjdGlmeSgpJiYoKFwiYmVsb3dcIj09YXx8XCJhYm92ZVwiPT1hKSYmdGhpcy5hZGRSb3coYSksKFwiYmVmb3JlXCI9PWF8fFwiYWZ0ZXJcIj09YSkmJnRoaXMuYWRkQ29sdW1uKGEpKX0sYWRkQ29sQ2VsbDpmdW5jdGlvbihhLGIsZCl7dmFyIGYsaD1hLmVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtzd2l0Y2goZCl7Y2FzZVwiYmVmb3JlXCI6Zj0hYS5pc0NvbHNwYW58fGEuZmlyc3RDb2w7YnJlYWs7Y2FzZVwiYWZ0ZXJcIjpmPSFhLmlzQ29sc3Bhbnx8YS5sYXN0Q29sfHxhLmlzQ29sc3BhbiYmYy5lbD09dGhpcy5jZWxsfWlmKGYpe3N3aXRjaChkKXtjYXNlXCJiZWZvcmVcIjphLmVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuY3JlYXRlQ2VsbHMoaCwxKSxhLmVsKTticmVhaztjYXNlXCJhZnRlclwiOmUoYS5lbCx0aGlzLmNyZWF0ZUNlbGxzKGgsMSkpfWEuaXNSb3dzcGFuJiZ0aGlzLmhhbmRsZUNlbGxBZGRXaXRoUm93c3BhbihhLGIrMSxkKX1lbHNlIGEuZWwuc2V0QXR0cmlidXRlKFwiY29sc3BhblwiLHBhcnNlSW50KGcuZ2V0QXR0cmlidXRlKGEuZWwsXCJjb2xzcGFuXCIpLDEwKSsxKX0sYWRkQ29sdW1uOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlO2lmKHRoaXMuc2V0VGFibGVNYXAoKSx0aGlzLmlkeD10aGlzLmdldE1hcEluZGV4KHRoaXMuY2VsbCksXCJhZnRlclwiPT1hJiZnLmdldEF0dHJpYnV0ZSh0aGlzLmNlbGwsXCJjb2xzcGFuXCIpJiYodGhpcy5pZHguY29sPXRoaXMuaWR4LmNvbCtwYXJzZUludChnLmdldEF0dHJpYnV0ZSh0aGlzLmNlbGwsXCJjb2xzcGFuXCIpLDEwKS0xKSx0aGlzLmlkeCE9PSExKWZvcihkPTAsZT10aGlzLm1hcC5sZW5ndGg7ZT5kO2QrKyliPXRoaXMubWFwW2RdLGJbdGhpcy5pZHguY29sXSYmKGM9Ylt0aGlzLmlkeC5jb2xdLGMubW9kaWZpZWR8fCh0aGlzLnNldENlbGxBc01vZGlmaWVkKGMpLHRoaXMuYWRkQ29sQ2VsbChjLGQsYSkpKX0saGFuZGxlQ2VsbEFkZFdpdGhSb3dzcGFuOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxoLGksaixrPXBhcnNlSW50KGcuZ2V0QXR0cmlidXRlKHRoaXMuY2VsbCxcInJvd3NwYW5cIiksMTApLTEsbD1nLmdldFBhcmVudEVsZW1lbnQoYS5lbCx7bm9kZU5hbWU6W1wiVFJcIl19KSxtPWEuZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpLG49dGhpcy50YWJsZS5vd25lckRvY3VtZW50O2ZvcihqPTA7az5qO2orKylpZihkPXRoaXMuY29ycmVjdENvbEluZGV4Rm9yVW5yZWFscyh0aGlzLmlkeC5jb2wsYitqKSxsPWYobCxcInRyXCIpLGwpaWYoZD4wKXN3aXRjaChjKXtjYXNlXCJiZWZvcmVcIjpoPXRoaXMuZ2V0Um93Q2VsbHMobCksZD4wJiZ0aGlzLm1hcFtiK2pdW3RoaXMuaWR4LmNvbF0uZWwhPWhbZF0mJmQ9PWgubGVuZ3RoLTE/ZShoW2RdLHRoaXMuY3JlYXRlQ2VsbHMobSwxKSk6aFtkXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNyZWF0ZUNlbGxzKG0sMSksaFtkXSk7XG5icmVhaztjYXNlXCJhZnRlclwiOmUodGhpcy5nZXRSb3dDZWxscyhsKVtkXSx0aGlzLmNyZWF0ZUNlbGxzKG0sMSkpfWVsc2UgbC5pbnNlcnRCZWZvcmUodGhpcy5jcmVhdGVDZWxscyhtLDEpLGwuZmlyc3RDaGlsZCk7ZWxzZSBpPW4uY3JlYXRlRWxlbWVudChcInRyXCIpLGkuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVDZWxscyhtLDEpKSx0aGlzLnRhYmxlLmFwcGVuZENoaWxkKGkpfX0sZy50YWJsZT17Z2V0Q2VsbHNCZXR3ZWVuOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IGkoYSk7cmV0dXJuIGMuZ2V0TWFwRWxzVG8oYil9LGFkZENlbGxzOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IGkoYSk7Yy5hZGQoYil9LHJlbW92ZUNlbGxzOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IGkoYSk7Yy5yZW1vdmUoYil9LG1lcmdlQ2VsbHNCZXR3ZWVuOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IGkoYSk7Yy5tZXJnZShiKX0sdW5tZXJnZUNlbGw6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGkoYSk7Yi51bm1lcmdlKCl9LG9yZGVyU2VsZWN0aW9uRW5kczpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBpKGEpO3JldHVybiBjLm9yZGVyU2VsZWN0aW9uRW5kcyhiKX0saW5kZXhPZjpmdW5jdGlvbihhKXt2YXIgYj1uZXcgaShhKTtyZXR1cm4gYi5zZXRUYWJsZU1hcCgpLGIuZ2V0TWFwSW5kZXgoYSl9LGZpbmRDZWxsOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IGkobnVsbCxhKTtyZXR1cm4gYy5nZXRFbGVtZW50QXRJbmRleChiKX0sZmluZFJvd0J5Q2VsbDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgaShhKTtyZXR1cm4gYi5nZXRSb3dFbGVtZW50c0J5Q2VsbCgpfSxmaW5kQ29sdW1uQnlDZWxsOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBpKGEpO3JldHVybiBiLmdldENvbHVtbkVsZW1lbnRzQnlDZWxsKCl9LGNhbk1lcmdlOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IGkoYSk7cmV0dXJuIGMuY2FuTWVyZ2UoYil9fX0od3lzaWh0bWw1KSx3eXNpaHRtbDUuZG9tLnF1ZXJ5PWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZz1bXTtmb3IoYS5ub2RlVHlwZSYmKGE9W2FdKSxkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWlmKGM9YVtkXS5xdWVyeVNlbGVjdG9yQWxsKGIpLGMpZm9yKGY9Yy5sZW5ndGg7Zi0tO2cudW5zaGlmdChjW2ZdKSk7cmV0dXJuIGd9LHd5c2lodG1sNS5kb20uY29tcGFyZURvY3VtZW50UG9zaXRpb249ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKX06ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnLGgsaSxqLGs7aWYoYz05PT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudCxkPTk9PT1iLm5vZGVUeXBlP2I6Yi5vd25lckRvY3VtZW50LGE9PT1iKXJldHVybiAwO2lmKGE9PT1iLm93bmVyRG9jdW1lbnQpcmV0dXJuIDIwO2lmKGEub3duZXJEb2N1bWVudD09PWIpcmV0dXJuIDEwO2lmKGMhPT1kKXJldHVybiAxO2lmKDI9PT1hLm5vZGVUeXBlJiZhLmNoaWxkTm9kZXMmJi0xIT09d3lzaWh0bWw1LmxhbmcuYXJyYXkoYS5jaGlsZE5vZGVzKS5pbmRleE9mKGIpKXJldHVybiAyMDtpZigyPT09Yi5ub2RlVHlwZSYmYi5jaGlsZE5vZGVzJiYtMSE9PXd5c2lodG1sNS5sYW5nLmFycmF5KGIuY2hpbGROb2RlcykuaW5kZXhPZihhKSlyZXR1cm4gMTA7Zm9yKGU9YSxmPVtdLGc9bnVsbDtlOyl7aWYoZT09YilyZXR1cm4gMTA7Zi5wdXNoKGUpLGU9ZS5wYXJlbnROb2RlfWZvcihlPWIsZz1udWxsO2U7KXtpZihlPT1hKXJldHVybiAyMDtpZihoPXd5c2lodG1sNS5sYW5nLmFycmF5KGYpLmluZGV4T2YoZSksLTEhPT1oKXJldHVybiBpPWZbaF0saj13eXNpaHRtbDUubGFuZy5hcnJheShpLmNoaWxkTm9kZXMpLmluZGV4T2YoZltoLTFdKSxrPXd5c2lodG1sNS5sYW5nLmFycmF5KGkuY2hpbGROb2RlcykuaW5kZXhPZihnKSxqPms/Mjo0O2c9ZSxlPWUucGFyZW50Tm9kZX1yZXR1cm4gMX19KCksd3lzaWh0bWw1LmRvbS51bndyYXA9ZnVuY3Rpb24oYSl7aWYoYS5wYXJlbnROb2RlKXtmb3IoO2EubGFzdENoaWxkOyl3eXNpaHRtbDUuZG9tLmluc2VydChhLmxhc3RDaGlsZCkuYWZ0ZXIoYSk7YS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfX0sd3lzaWh0bWw1LmRvbS5nZXRQYXN0ZWRIdG1sPWZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBhLmNsaXBib2FyZERhdGEmJih3eXNpaHRtbDUubGFuZy5hcnJheShhLmNsaXBib2FyZERhdGEudHlwZXMpLmNvbnRhaW5zKFwidGV4dC9odG1sXCIpP2I9YS5jbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0L2h0bWxcIik6d3lzaWh0bWw1LmxhbmcuYXJyYXkoYS5jbGlwYm9hcmREYXRhLnR5cGVzKS5jb250YWlucyhcInRleHQvcGxhaW5cIikmJihiPXd5c2lodG1sNS5sYW5nLnN0cmluZyhhLmNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIikpLmVzY2FwZUhUTUwoITAsITApKSksYn0sd3lzaWh0bWw1LmRvbS5nZXRQYXN0ZWRIdG1sV2l0aERpdj1mdW5jdGlvbihhLGIpe3ZhciBjPWEuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCksZD1hLmVsZW1lbnQub3duZXJEb2N1bWVudCxlPWQuY3JlYXRlRWxlbWVudChcIkRJVlwiKTtkLmJvZHkuYXBwZW5kQ2hpbGQoZSksZS5zdHlsZS53aWR0aD1cIjFweFwiLGUuc3R5bGUuaGVpZ2h0PVwiMXB4XCIsZS5zdHlsZS5vdmVyZmxvdz1cImhpZGRlblwiLGUuc2V0QXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIsXCJ0cnVlXCIpLGUuZm9jdXMoKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5zZWxlY3Rpb24uc2V0Qm9va21hcmsoYyksYihlLmlubmVySFRNTCksZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfSwwKX0sd3lzaWh0bWw1LnF1aXJrcy5jbGVhblBhc3RlZEhUTUw9ZnVuY3Rpb24oKXt2YXIgYT1mdW5jdGlvbihhKXt2YXIgYj13eXNpaHRtbDUubGFuZy5zdHJpbmcoYSkudHJpbSgpLGM9Yi5yZXBsYWNlKC9bXFwtXFxbXFxdXFwvXFx7XFx9XFwoXFwpXFwqXFwrXFw/XFwuXFxcXFxcXlxcJFxcfF0vZyxcIlxcXFwkJlwiKTtyZXR1cm4gUmVnRXhwKFwiXigoPyFeXCIrYytcIiQpLikqJFwiLFwiaVwiKX0sYj1mdW5jdGlvbihiLGMpe3ZhciBkLGUsZj13eXNpaHRtbDUubGFuZy5vYmplY3QoYikuY2xvbmUoITApO2ZvcihkIGluIGYudGFncylpZihmLnRhZ3MuaGFzT3duUHJvcGVydHkoZCkmJmYudGFnc1tkXS5rZWVwX3N0eWxlcylmb3IoZSBpbiBmLnRhZ3NbZF0ua2VlcF9zdHlsZXMpZi50YWdzW2RdLmtlZXBfc3R5bGVzLmhhc093blByb3BlcnR5KGUpJiZjW2VdJiYoZi50YWdzW2RdLmtlZXBfc3R5bGVzW2VdPWEoY1tlXSkpO3JldHVybiBmfSxjPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlO2lmKCFhKXJldHVybiBudWxsO2ZvcihkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWlmKGFbZF0uY29uZGl0aW9ufHwoYz1hW2RdLnNldCksYVtkXS5jb25kaXRpb24mJmFbZF0uY29uZGl0aW9uLnRlc3QoYikpcmV0dXJuIGFbZF0uc2V0O3JldHVybiBjfTtyZXR1cm4gZnVuY3Rpb24oYSxkKXt2YXIgZSxmPXtjb2xvcjp3eXNpaHRtbDUuZG9tLmdldFN0eWxlKFwiY29sb3JcIikuZnJvbShkLnJlZmVyZW5jZU5vZGUpLGZvbnRTaXplOnd5c2lodG1sNS5kb20uZ2V0U3R5bGUoXCJmb250LXNpemVcIikuZnJvbShkLnJlZmVyZW5jZU5vZGUpfSxnPWIoYyhkLnJ1bGVzLGEpfHx7fSxmKTtyZXR1cm4gZT13eXNpaHRtbDUuZG9tLnBhcnNlKGEse3J1bGVzOmcsY2xlYW5VcDohMCxjb250ZXh0OmQucmVmZXJlbmNlTm9kZS5vd25lckRvY3VtZW50LHVuZWRpdGFibGVDbGFzczpkLnVuZWRpdGFibGVDbGFzcyxjbGVhckludGVybmFsczohMCx1bmpvaW5OYnNwczohMH0pLGV9fSgpLHd5c2lodG1sNS5xdWlya3MuZW5zdXJlUHJvcGVyQ2xlYXJpbmc9ZnVuY3Rpb24oKXt2YXIgYT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPWEuaW5uZXJIVE1MLnRvTG93ZXJDYXNlKCk7KFwiPHA+Jm5ic3A7PC9wPlwiPT1ifHxcIjxwPiZuYnNwOzwvcD48cD4mbmJzcDs8L3A+XCI9PWIpJiYoYS5pbm5lckhUTUw9XCJcIil9LDApfTtyZXR1cm4gZnVuY3Rpb24oYil7d3lzaWh0bWw1LmRvbS5vYnNlcnZlKGIuZWxlbWVudCxbXCJjdXRcIixcImtleWRvd25cIl0sYSl9fSgpLGZ1bmN0aW9uKGEpe3ZhciBiPVwiJTdFXCI7YS5xdWlya3MuZ2V0Q29ycmVjdElubmVySFRNTD1mdW5jdGlvbihjKXt2YXIgZCxlLGYsZyxoLGk9Yy5pbm5lckhUTUw7aWYoLTE9PT1pLmluZGV4T2YoYikpcmV0dXJuIGk7Zm9yKGQ9Yy5xdWVyeVNlbGVjdG9yQWxsKFwiW2hyZWYqPSd+J10sIFtzcmMqPSd+J11cIiksaD0wLGc9ZC5sZW5ndGg7Zz5oO2grKyllPWRbaF0uaHJlZnx8ZFtoXS5zcmMsZj1hLmxhbmcuc3RyaW5nKGUpLnJlcGxhY2UoXCJ+XCIpLmJ5KGIpLGk9YS5sYW5nLnN0cmluZyhpKS5yZXBsYWNlKGYpLmJ5KGUpO3JldHVybiBpfX0od3lzaWh0bWw1KSxmdW5jdGlvbihhKXt2YXIgYj1cInd5c2lodG1sNS1xdWlya3MtcmVkcmF3XCI7YS5xdWlya3MucmVkcmF3PWZ1bmN0aW9uKGMpe2EuZG9tLmFkZENsYXNzKGMsYiksYS5kb20ucmVtb3ZlQ2xhc3MoYyxiKTt0cnl7dmFyIGQ9Yy5vd25lckRvY3VtZW50O2QuZXhlY0NvbW1hbmQoXCJpdGFsaWNcIiwhMSxudWxsKSxkLmV4ZWNDb21tYW5kKFwiaXRhbGljXCIsITEsbnVsbCl9Y2F0Y2goZSl7fX19KHd5c2lodG1sNSksd3lzaWh0bWw1LnF1aXJrcy50YWJsZUNlbGxzU2VsZWN0aW9uPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe3JldHVybiBrLm9ic2VydmUoYSxcIm1vdXNlZG93blwiLGZ1bmN0aW9uKGEpe3ZhciBiPXd5c2lodG1sNS5kb20uZ2V0UGFyZW50RWxlbWVudChhLnRhcmdldCx7bm9kZU5hbWU6W1wiVERcIixcIlRIXCJdfSk7YiYmZChiKX0pLGx9ZnVuY3Rpb24gZChjKXtsLnN0YXJ0PWMsbC5lbmQ9YyxsLmNlbGxzPVtjXSxsLnRhYmxlPWsuZ2V0UGFyZW50RWxlbWVudChsLnN0YXJ0LHtub2RlTmFtZTpbXCJUQUJMRVwiXX0pLGwudGFibGUmJihlKCksay5hZGRDbGFzcyhjLG0pLG49ay5vYnNlcnZlKGEsXCJtb3VzZW1vdmVcIixnKSxvPWsub2JzZXJ2ZShhLFwibW91c2V1cFwiLGgpLGIuZmlyZShcInRhYmxlc2VsZWN0c3RhcnRcIikuZmlyZShcInRhYmxlc2VsZWN0c3RhcnQ6Y29tcG9zZXJcIikpfWZ1bmN0aW9uIGUoKXt2YXIgYixjO2lmKGEmJihiPWEucXVlcnlTZWxlY3RvckFsbChcIi5cIittKSxiLmxlbmd0aD4wKSlmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWsucmVtb3ZlQ2xhc3MoYltjXSxtKX1mdW5jdGlvbiBmKGEpe2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWsuYWRkQ2xhc3MoYVtiXSxtKX1mdW5jdGlvbiBnKGEpe3ZhciBjLGQ9bnVsbCxnPWsuZ2V0UGFyZW50RWxlbWVudChhLnRhcmdldCx7bm9kZU5hbWU6W1wiVERcIixcIlRIXCJdfSk7ZyYmbC50YWJsZSYmbC5zdGFydCYmKGQ9ay5nZXRQYXJlbnRFbGVtZW50KGcse25vZGVOYW1lOltcIlRBQkxFXCJdfSksZCYmZD09PWwudGFibGUmJihlKCksYz1sLmVuZCxsLmVuZD1nLGwuY2VsbHM9ay50YWJsZS5nZXRDZWxsc0JldHdlZW4obC5zdGFydCxnKSxsLmNlbGxzLmxlbmd0aD4xJiZiLmNvbXBvc2VyLnNlbGVjdGlvbi5kZXNlbGVjdCgpLGYobC5jZWxscyksbC5lbmQhPT1jJiZiLmZpcmUoXCJ0YWJsZXNlbGVjdGNoYW5nZVwiKS5maXJlKFwidGFibGVzZWxlY3RjaGFuZ2U6Y29tcG9zZXJcIikpKX1mdW5jdGlvbiBoKCl7bi5zdG9wKCksby5zdG9wKCksYi5maXJlKFwidGFibGVzZWxlY3RcIikuZmlyZShcInRhYmxlc2VsZWN0OmNvbXBvc2VyXCIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpKCl9LDApfWZ1bmN0aW9uIGkoKXt2YXIgYz1rLm9ic2VydmUoYS5vd25lckRvY3VtZW50LFwiY2xpY2tcIixmdW5jdGlvbihhKXtjLnN0b3AoKSxrLmdldFBhcmVudEVsZW1lbnQoYS50YXJnZXQse25vZGVOYW1lOltcIlRBQkxFXCJdfSkhPWwudGFibGUmJihlKCksbC50YWJsZT1udWxsLGwuc3RhcnQ9bnVsbCxsLmVuZD1udWxsLGIuZmlyZShcInRhYmxldW5zZWxlY3RcIikuZmlyZShcInRhYmxldW5zZWxlY3Q6Y29tcG9zZXJcIikpfSl9ZnVuY3Rpb24gaihhLGMpe2wuc3RhcnQ9YSxsLmVuZD1jLGwudGFibGU9ay5nZXRQYXJlbnRFbGVtZW50KGwuc3RhcnQse25vZGVOYW1lOltcIlRBQkxFXCJdfSksc2VsZWN0ZWRDZWxscz1rLnRhYmxlLmdldENlbGxzQmV0d2VlbihsLnN0YXJ0LGwuZW5kKSxmKHNlbGVjdGVkQ2VsbHMpLGkoKSxiLmZpcmUoXCJ0YWJsZXNlbGVjdFwiKS5maXJlKFwidGFibGVzZWxlY3Q6Y29tcG9zZXJcIil9dmFyIGs9d3lzaWh0bWw1LmRvbSxsPXt0YWJsZTpudWxsLHN0YXJ0Om51bGwsZW5kOm51bGwsY2VsbHM6bnVsbCxzZWxlY3Q6an0sbT1cInd5c2l3eWctdG1wLXNlbGVjdGVkLWNlbGxcIixuPW51bGwsbz1udWxsO3JldHVybiBjKCl9LGZ1bmN0aW9uKGEpe3ZhciBiPS9ecmdiYVxcKFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqLFxccyooW1xcZFxcLl0rKVxccypcXCkvaSxjPS9ecmdiXFwoXFxzKihcXGR7MSwzfSlcXHMqLFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccypcXCkvaSxkPS9eIyhbMC05YS1mXVswLTlhLWZdKShbMC05YS1mXVswLTlhLWZdKShbMC05YS1mXVswLTlhLWZdKS9pLGU9L14jKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pL2ksZj1mdW5jdGlvbihhKXtyZXR1cm4gUmVnRXhwKFwiKF58XFxcXHN8OylcIithK1wiXFxcXHMqOlxcXFxzKlteOyRdK1wiLFwiZ2lcIil9O2EucXVpcmtzLnN0eWxlUGFyc2VyPXtwYXJzZUNvbG9yOmZ1bmN0aW9uKGcsaCl7dmFyIGksaixrLGw9ZihoKSxtPWcubWF0Y2gobCksbj0xMDtpZihtKXtmb3Ioaz1tLmxlbmd0aDtrLS07KW1ba109YS5sYW5nLnN0cmluZyhtW2tdLnNwbGl0KFwiOlwiKVsxXSkudHJpbSgpO2lmKGk9bVttLmxlbmd0aC0xXSxiLnRlc3QoaSkpaj1pLm1hdGNoKGIpO2Vsc2UgaWYoYy50ZXN0KGkpKWo9aS5tYXRjaChjKTtlbHNlIGlmKGQudGVzdChpKSlqPWkubWF0Y2goZCksbj0xNjtlbHNlIGlmKGUudGVzdChpKSlyZXR1cm4gaj1pLm1hdGNoKGUpLGouc2hpZnQoKSxqLnB1c2goMSksYS5sYW5nLmFycmF5KGopLm1hcChmdW5jdGlvbihhLGIpe3JldHVybiAzPmI/MTYqcGFyc2VJbnQoYSwxNikrcGFyc2VJbnQoYSwxNik6cGFyc2VGbG9hdChhKX0pO2lmKGopcmV0dXJuIGouc2hpZnQoKSxqWzNdfHxqLnB1c2goMSksYS5sYW5nLmFycmF5KGopLm1hcChmdW5jdGlvbihhLGIpe3JldHVybiAzPmI/cGFyc2VJbnQoYSxuKTpwYXJzZUZsb2F0KGEpfSl9cmV0dXJuITF9LHVucGFyc2VDb2xvcjpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKFwiaGV4XCI9PWIpcmV0dXJuIGFbMF0udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkrYVsxXS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSthWzJdLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO2lmKFwiaGFzaFwiPT1iKXJldHVyblwiI1wiK2FbMF0udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkrYVsxXS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSthWzJdLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO2lmKFwicmdiXCI9PWIpcmV0dXJuXCJyZ2IoXCIrYVswXStcIixcIithWzFdK1wiLFwiK2FbMl0rXCIpXCI7aWYoXCJyZ2JhXCI9PWIpcmV0dXJuXCJyZ2JhKFwiK2FbMF0rXCIsXCIrYVsxXStcIixcIithWzJdK1wiLFwiK2FbM10rXCIpXCI7aWYoXCJjc3ZcIj09YilyZXR1cm4gYVswXStcIixcIithWzFdK1wiLFwiK2FbMl0rXCIsXCIrYVszXX1yZXR1cm4gYVszXSYmMSE9PWFbM10/XCJyZ2JhKFwiK2FbMF0rXCIsXCIrYVsxXStcIixcIithWzJdK1wiLFwiK2FbM10rXCIpXCI6XCJyZ2IoXCIrYVswXStcIixcIithWzFdK1wiLFwiK2FbMl0rXCIpXCJ9LHBhcnNlRm9udFNpemU6ZnVuY3Rpb24oYil7dmFyIGM9Yi5tYXRjaChmKFwiZm9udC1zaXplXCIpKTtyZXR1cm4gYz9hLmxhbmcuc3RyaW5nKGNbYy5sZW5ndGgtMV0uc3BsaXQoXCI6XCIpWzFdKS50cmltKCk6ITF9fX0od3lzaWh0bWw1KSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBiPTA7aWYoYS5wYXJlbnROb2RlKWRvIGIrPWEub2Zmc2V0VG9wfHwwLGE9YS5vZmZzZXRQYXJlbnQ7d2hpbGUoYSk7cmV0dXJuIGJ9ZnVuY3Rpb24gYyhhLGIpe2Zvcih2YXIgYz0wO2IhPT1hOylpZihjKyssYj1iLnBhcmVudE5vZGUsIWIpdGhyb3cgRXJyb3IoXCJub3QgYSBkZXNjZW5kYW50IG9mIGFuY2VzdG9yIVwiKTtyZXR1cm4gY31mdW5jdGlvbiBkKGEpe2lmKCFhLmNhblN1cnJvdW5kQ29udGVudHMoKSlmb3IodmFyIGI9YS5jb21tb25BbmNlc3RvckNvbnRhaW5lcixkPWMoYixhLnN0YXJ0Q29udGFpbmVyKSxlPWMoYixhLmVuZENvbnRhaW5lcik7IWEuY2FuU3Vycm91bmRDb250ZW50cygpOylkPmU/KGEuc2V0U3RhcnRCZWZvcmUoYS5zdGFydENvbnRhaW5lciksZD1jKGIsYS5zdGFydENvbnRhaW5lcikpOihhLnNldEVuZEFmdGVyKGEuZW5kQ29udGFpbmVyKSxlPWMoYixhLmVuZENvbnRhaW5lcikpfXZhciBlPWEuZG9tO2EuU2VsZWN0aW9uPUJhc2UuZXh0ZW5kKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIsYyl7d2luZG93LnJhbmd5LmluaXQoKSx0aGlzLmVkaXRvcj1hLHRoaXMuY29tcG9zZXI9YS5jb21wb3Nlcix0aGlzLmRvYz10aGlzLmNvbXBvc2VyLmRvYyx0aGlzLmNvbnRhaW49Yix0aGlzLnVuc2VsZWN0YWJsZUNsYXNzPWN8fCExfSxnZXRCb29rbWFyazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmFuZ2UoKTtyZXR1cm4gYSYmZChhKSxhJiZhLmNsb25lUmFuZ2UoKX0sc2V0Qm9va21hcms6ZnVuY3Rpb24oYSl7YSYmdGhpcy5zZXRTZWxlY3Rpb24oYSl9LHNldEJlZm9yZTpmdW5jdGlvbihhKXt2YXIgYj1yYW5neS5jcmVhdGVSYW5nZSh0aGlzLmRvYyk7cmV0dXJuIGIuc2V0U3RhcnRCZWZvcmUoYSksYi5zZXRFbmRCZWZvcmUoYSksdGhpcy5zZXRTZWxlY3Rpb24oYil9LHNldEFmdGVyOmZ1bmN0aW9uKGEpe3ZhciBiPXJhbmd5LmNyZWF0ZVJhbmdlKHRoaXMuZG9jKTtyZXR1cm4gYi5zZXRTdGFydEFmdGVyKGEpLGIuc2V0RW5kQWZ0ZXIoYSksdGhpcy5zZXRTZWxlY3Rpb24oYil9LHNlbGVjdE5vZGU6ZnVuY3Rpb24oYixjKXt2YXIgZD1yYW5neS5jcmVhdGVSYW5nZSh0aGlzLmRvYyksZj1iLm5vZGVUeXBlPT09YS5FTEVNRU5UX05PREUsZz1cImNhbkhhdmVIVE1MXCJpbiBiP2IuY2FuSGF2ZUhUTUw6XCJJTUdcIiE9PWIubm9kZU5hbWUsaD1mP2IuaW5uZXJIVE1MOmIuZGF0YSxpPVwiXCI9PT1ofHxoPT09YS5JTlZJU0lCTEVfU1BBQ0Usaj1lLmdldFN0eWxlKFwiZGlzcGxheVwiKS5mcm9tKGIpLGs9XCJibG9ja1wiPT09anx8XCJsaXN0LWl0ZW1cIj09PWo7aWYoaSYmZiYmZyYmIWMpdHJ5e2IuaW5uZXJIVE1MPWEuSU5WSVNJQkxFX1NQQUNFfWNhdGNoKGwpe31nP2Quc2VsZWN0Tm9kZUNvbnRlbnRzKGIpOmQuc2VsZWN0Tm9kZShiKSxnJiZpJiZmP2QuY29sbGFwc2Uoayk6ZyYmaSYmKGQuc2V0U3RhcnRBZnRlcihiKSxkLnNldEVuZEFmdGVyKGIpKSx0aGlzLnNldFNlbGVjdGlvbihkKX0sZ2V0U2VsZWN0ZWROb2RlOmZ1bmN0aW9uKGEpe3ZhciBiLGM7cmV0dXJuIGEmJnRoaXMuZG9jLnNlbGVjdGlvbiYmXCJDb250cm9sXCI9PT10aGlzLmRvYy5zZWxlY3Rpb24udHlwZSYmKGM9dGhpcy5kb2Muc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCksYyYmYy5sZW5ndGgpP2MuaXRlbSgwKTooYj10aGlzLmdldFNlbGVjdGlvbih0aGlzLmRvYyksYi5mb2N1c05vZGU9PT1iLmFuY2hvck5vZGU/Yi5mb2N1c05vZGU6KGM9dGhpcy5nZXRSYW5nZSh0aGlzLmRvYyksYz9jLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyOnRoaXMuZG9jLmJvZHkpKX0sZml4U2VsQm9yZGVyczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmFuZ2UoKTtkKGEpLHRoaXMuc2V0U2VsZWN0aW9uKGEpfSxnZXRTZWxlY3RlZE93bk5vZGVzOmZ1bmN0aW9uKCl7dmFyIGEsYixjPXRoaXMuZ2V0T3duUmFuZ2VzKCksZD1bXTtmb3IoYT0wLGI9Yy5sZW5ndGg7Yj5hO2ErKylkLnB1c2goY1thXS5jb21tb25BbmNlc3RvckNvbnRhaW5lcnx8dGhpcy5kb2MuYm9keSk7cmV0dXJuIGR9LGZpbmROb2Rlc0luU2VsZWN0aW9uOmZ1bmN0aW9uKGIpe3ZhciBjLGQsZSxmPXRoaXMuZ2V0T3duUmFuZ2VzKCksZz1bXTtmb3IoZD0wLGU9Zi5sZW5ndGg7ZT5kO2QrKyljPWZbZF0uZ2V0Tm9kZXMoWzFdLGZ1bmN0aW9uKGMpe3JldHVybiBhLmxhbmcuYXJyYXkoYikuY29udGFpbnMoYy5ub2RlTmFtZSl9KSxnPWcuY29uY2F0KGMpO3JldHVybiBnfSxjb250YWluc1VuZWRpdGFibGU6ZnVuY3Rpb24oKXt2YXIgYSxiLGM9dGhpcy5nZXRPd25VbmVkaXRhYmxlcygpLGQ9dGhpcy5nZXRTZWxlY3Rpb24oKTtmb3IoYT0wLGI9Yy5sZW5ndGg7Yj5hO2ErKylpZihkLmNvbnRhaW5zTm9kZShjW2FdKSlyZXR1cm4hMDtyZXR1cm4hMX0sZGVsZXRlQ29udGVudHM6ZnVuY3Rpb24oKXt2YXIgYSxiPXRoaXMuZ2V0T3duUmFuZ2VzKCk7Zm9yKGE9Yi5sZW5ndGg7YS0tOyliW2FdLmRlbGV0ZUNvbnRlbnRzKCk7dGhpcy5zZXRTZWxlY3Rpb24oYlswXSl9LGdldFByZXZpb3VzTm9kZTpmdW5jdGlvbihiLGMpe3ZhciBkLGUsZjtyZXR1cm4gYnx8KGQ9dGhpcy5nZXRTZWxlY3Rpb24oKSxiPWQuYW5jaG9yTm9kZSksYj09PXRoaXMuY29udGFpbj8hMTooZT1iLnByZXZpb3VzU2libGluZyxlPT09dGhpcy5jb250YWluPyExOihlJiYzIT09ZS5ub2RlVHlwZSYmMSE9PWUubm9kZVR5cGU/ZT10aGlzLmdldFByZXZpb3VzTm9kZShlLGMpOmUmJjM9PT1lLm5vZGVUeXBlJiYvXlxccyokLy50ZXN0KGUudGV4dENvbnRlbnQpP2U9dGhpcy5nZXRQcmV2aW91c05vZGUoZSxjKTpjJiZlJiYxPT09ZS5ub2RlVHlwZSYmIWEubGFuZy5hcnJheShbXCJCUlwiLFwiSFJcIixcIklNR1wiXSkuY29udGFpbnMoZS5ub2RlTmFtZSkmJi9eW1xcc10qJC8udGVzdChlLmlubmVySFRNTCk/ZT10aGlzLmdldFByZXZpb3VzTm9kZShlLGMpOmV8fGI9PT10aGlzLmNvbnRhaW58fChmPWIucGFyZW50Tm9kZSxmIT09dGhpcy5jb250YWluJiYoZT10aGlzLmdldFByZXZpb3VzTm9kZShmLGMpKSksZSE9PXRoaXMuY29udGFpbj9lOiExKSl9LGdldFNlbGVjdGlvblBhcmVudHNCeVRhZzpmdW5jdGlvbigpe3ZhciBiLGMsZCxlPXRoaXMuZ2V0U2VsZWN0ZWRPd25Ob2RlcygpLGY9W107Zm9yKGM9MCxkPWUubGVuZ3RoO2Q+YztjKyspYj1lW2NdLm5vZGVOYW1lJiZcIkxJXCI9PT1lW2NdLm5vZGVOYW1lP2VbY106YS5kb20uZ2V0UGFyZW50RWxlbWVudChlW2NdLHtub2RlTmFtZTpbXCJMSVwiXX0sITEsdGhpcy5jb250YWluKSxiJiZmLnB1c2goYik7cmV0dXJuIGYubGVuZ3RoP2Y6bnVsbH0sZ2V0UmFuZ2VUb05vZGVFbmQ6ZnVuY3Rpb24oKXtpZih0aGlzLmlzQ29sbGFwc2VkKCkpe3ZhciBhPXRoaXMuZ2V0UmFuZ2UoKSxiPWEuc3RhcnRDb250YWluZXIsYz1hLnN0YXJ0T2Zmc2V0LGQ9cmFuZ3kuY3JlYXRlUmFuZ2UodGhpcy5kb2MpO3JldHVybiBkLnNlbGVjdE5vZGVDb250ZW50cyhiKSxkLnNldFN0YXJ0KGIsYyksZH19LGNhcmV0SXNMYXN0SW5TZWxlY3Rpb246ZnVuY3Rpb24oKXt2YXIgYT0ocmFuZ3kuY3JlYXRlUmFuZ2UodGhpcy5kb2MpLHRoaXMuZ2V0U2VsZWN0aW9uKCksdGhpcy5nZXRSYW5nZVRvTm9kZUVuZCgpLmNsb25lQ29udGVudHMoKSksYj1hLnRleHRDb250ZW50O3JldHVybi9eXFxzKiQvLnRlc3QoYil9LGNhcmV0SXNGaXJzdEluU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9cmFuZ3kuY3JlYXRlUmFuZ2UodGhpcy5kb2MpLGM9dGhpcy5nZXRTZWxlY3Rpb24oKSxkPXRoaXMuZ2V0UmFuZ2UoKSxlPWQuc3RhcnRDb250YWluZXI7cmV0dXJuIGUubm9kZVR5cGU9PT1hLlRFWFRfTk9ERT90aGlzLmlzQ29sbGFwc2VkKCkmJmUubm9kZVR5cGU9PT1hLlRFWFRfTk9ERSYmL15cXHMqJC8udGVzdChlLmRhdGEuc3Vic3RyKDAsZC5zdGFydE9mZnNldCkpOihiLnNlbGVjdE5vZGVDb250ZW50cyh0aGlzLmdldFJhbmdlKCkuY29tbW9uQW5jZXN0b3JDb250YWluZXIpLGIuY29sbGFwc2UoITApLHRoaXMuaXNDb2xsYXBzZWQoKSYmKGIuc3RhcnRDb250YWluZXI9PT1jLmFuY2hvck5vZGV8fGIuZW5kQ29udGFpbmVyPT09Yy5hbmNob3JOb2RlKSYmYi5zdGFydE9mZnNldD09PWMuYW5jaG9yT2Zmc2V0KX0sY2FyZXRJc0luVGhlQmVnaW5uaWc6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5nZXRTZWxlY3Rpb24oKSxkPWMuYW5jaG9yTm9kZSxlPWMuYW5jaG9yT2Zmc2V0O3JldHVybiBiPzA9PT1lJiYoZC5ub2RlTmFtZSYmZC5ub2RlTmFtZT09PWIudG9VcHBlckNhc2UoKXx8YS5kb20uZ2V0UGFyZW50RWxlbWVudChkLnBhcmVudE5vZGUse25vZGVOYW1lOmJ9LDEpKTowPT09ZSYmIXRoaXMuZ2V0UHJldmlvdXNOb2RlKGQsITApfSxjYXJldElzQmVmb3JlVW5lZGl0YWJsZTpmdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU9dGhpcy5nZXRTZWxlY3Rpb24oKSxmPWUuYW5jaG9yTm9kZSxnPWUuYW5jaG9yT2Zmc2V0O2lmKDA9PT1nJiYoYT10aGlzLmdldFByZXZpb3VzTm9kZShmLCEwKSxhKSlmb3IoYj10aGlzLmdldE93blVuZWRpdGFibGVzKCksYz0wLGQ9Yi5sZW5ndGg7ZD5jO2MrKylpZihhPT09YltjXSlyZXR1cm4gYltjXTtyZXR1cm4hMX0sZXhlY3V0ZUFuZFJlc3RvcmVSYW5neTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmRvYy5kZWZhdWx0Vmlld3x8dGhpcy5kb2MucGFyZW50V2luZG93LGM9cmFuZ3kuc2F2ZVNlbGVjdGlvbihiKTtpZihjKXRyeXthKCl9Y2F0Y2goZCl7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGR9LDApfWVsc2UgYSgpO3Jhbmd5LnJlc3RvcmVTZWxlY3Rpb24oYyl9LGV4ZWN1dGVBbmRSZXN0b3JlOmZ1bmN0aW9uKGIsYyl7dmFyIGQsZixnLGgsaSxqLGssbCxtLG49dGhpcy5kb2MuYm9keSxvPWMmJm4uc2Nyb2xsVG9wLHA9YyYmbi5zY3JvbGxMZWZ0LHE9XCJfd3lzaWh0bWw1LXRlbXAtcGxhY2Vob2xkZXJcIixyPSc8c3BhbiBjbGFzcz1cIicrcSsnXCI+JythLklOVklTSUJMRV9TUEFDRStcIjwvc3Bhbj5cIixzPXRoaXMuZ2V0UmFuZ2UoITApO2lmKCFzKXJldHVybiBiKG4sbiksdm9pZCAwO3MuY29sbGFwc2VkfHwoaz1zLmNsb25lUmFuZ2UoKSxqPWsuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHIpLGsuY29sbGFwc2UoITEpLGsuaW5zZXJ0Tm9kZShqKSxrLmRldGFjaCgpKSxpPXMuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHIpLHMuaW5zZXJ0Tm9kZShpKSxqJiYoZD10aGlzLmNvbnRhaW4ucXVlcnlTZWxlY3RvckFsbChcIi5cIitxKSxzLnNldFN0YXJ0QmVmb3JlKGRbMF0pLHMuc2V0RW5kQWZ0ZXIoZFtkLmxlbmd0aC0xXSkpLHRoaXMuc2V0U2VsZWN0aW9uKHMpO3RyeXtiKHMuc3RhcnRDb250YWluZXIscy5lbmRDb250YWluZXIpfWNhdGNoKHQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB0fSwwKX1pZihkPXRoaXMuY29udGFpbi5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiK3EpLGQmJmQubGVuZ3RoKWZvcihsPXJhbmd5LmNyZWF0ZVJhbmdlKHRoaXMuZG9jKSxnPWRbMF0ubmV4dFNpYmxpbmcsZC5sZW5ndGg+MSYmKGg9ZFtkLmxlbmd0aC0xXS5wcmV2aW91c1NpYmxpbmcpLGgmJmc/KGwuc2V0U3RhcnRCZWZvcmUoZyksbC5zZXRFbmRBZnRlcihoKSk6KGY9dGhpcy5kb2MuY3JlYXRlVGV4dE5vZGUoYS5JTlZJU0lCTEVfU1BBQ0UpLGUuaW5zZXJ0KGYpLmFmdGVyKGRbMF0pLGwuc2V0U3RhcnRCZWZvcmUoZiksbC5zZXRFbmRBZnRlcihmKSksdGhpcy5zZXRTZWxlY3Rpb24obCksbT1kLmxlbmd0aDttLS07KWRbbV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkW21dKTtlbHNlIHRoaXMuY29udGFpbi5mb2N1cygpO2MmJihuLnNjcm9sbFRvcD1vLG4uc2Nyb2xsTGVmdD1wKTt0cnl7ZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpfWNhdGNoKHUpe319LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPXJhbmd5LmNyZWF0ZVJhbmdlKHRoaXMuZG9jKTtjLnNldFN0YXJ0KGEsYnx8MCksdGhpcy5zZXRTZWxlY3Rpb24oYyl9LGluc2VydEhUTUw6ZnVuY3Rpb24oYSl7dmFyIGIsYz0ocmFuZ3kuY3JlYXRlUmFuZ2UodGhpcy5kb2MpLHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoXCJESVZcIikpLGQ9dGhpcy5kb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2ZvcihjLmlubmVySFRNTD1hLGI9Yy5sYXN0Q2hpbGQ7Yy5maXJzdENoaWxkOylkLmFwcGVuZENoaWxkKGMuZmlyc3RDaGlsZCk7dGhpcy5pbnNlcnROb2RlKGQpLGImJnRoaXMuc2V0QWZ0ZXIoYil9LGluc2VydE5vZGU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYW5nZSgpO2ImJmIuaW5zZXJ0Tm9kZShhKX0sc3Vycm91bmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPXRoaXMuZ2V0T3duUmFuZ2VzKCksZT1bXTtpZigwPT1kLmxlbmd0aClyZXR1cm4gZTtmb3IoYz1kLmxlbmd0aDtjLS07KXtiPXRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoYS5ub2RlTmFtZSksZS5wdXNoKGIpLGEuY2xhc3NOYW1lJiYoYi5jbGFzc05hbWU9YS5jbGFzc05hbWUpLGEuY3NzU3R5bGUmJmIuc2V0QXR0cmlidXRlKFwic3R5bGVcIixhLmNzc1N0eWxlKTt0cnl7ZFtjXS5zdXJyb3VuZENvbnRlbnRzKGIpLHRoaXMuc2VsZWN0Tm9kZShiKX1jYXRjaChmKXtiLmFwcGVuZENoaWxkKGRbY10uZXh0cmFjdENvbnRlbnRzKCkpLGRbY10uaW5zZXJ0Tm9kZShiKX19cmV0dXJuIGV9LGRlYmxvY2tBbmRTdXJyb3VuZDpmdW5jdGlvbihiKXt2YXIgYyxkLGUsZj10aGlzLmRvYy5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLGc9cmFuZ3kuY3JlYXRlUmFuZ2UodGhpcy5kb2MpO2lmKGYuY2xhc3NOYW1lPWIuY2xhc3NOYW1lLHRoaXMuY29tcG9zZXIuY29tbWFuZHMuZXhlYyhcImZvcm1hdEJsb2NrXCIsYi5ub2RlTmFtZSxiLmNsYXNzTmFtZSksYz10aGlzLmNvbnRhaW4ucXVlcnlTZWxlY3RvckFsbChcIi5cIitiLmNsYXNzTmFtZSksY1swXSlmb3IoY1swXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmLGNbMF0pLGcuc2V0U3RhcnRCZWZvcmUoY1swXSksZy5zZXRFbmRBZnRlcihjW2MubGVuZ3RoLTFdKSxkPWcuZXh0cmFjdENvbnRlbnRzKCk7ZC5maXJzdENoaWxkOylpZihlPWQuZmlyc3RDaGlsZCwxPT1lLm5vZGVUeXBlJiZhLmRvbS5oYXNDbGFzcyhlLGIuY2xhc3NOYW1lKSl7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWYuYXBwZW5kQ2hpbGQoZS5maXJzdENoaWxkKTtcIkJSXCIhPT1lLm5vZGVOYW1lJiZmLmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoXCJiclwiKSksZC5yZW1vdmVDaGlsZChlKX1lbHNlIGYuYXBwZW5kQ2hpbGQoZSk7ZWxzZSBmPW51bGw7cmV0dXJuIGZ9LHNjcm9sbEludG9WaWV3OmZ1bmN0aW9uKCl7dmFyIGMsZD10aGlzLmRvYyxlPTUsZj1kLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ+ZC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0LGc9ZC5fd3lzaWh0bWw1U2Nyb2xsSW50b1ZpZXdFbGVtZW50PWQuX3d5c2lodG1sNVNjcm9sbEludG9WaWV3RWxlbWVudHx8ZnVuY3Rpb24oKXt2YXIgYj1kLmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3JldHVybiBiLmlubmVySFRNTD1hLklOVklTSUJMRV9TUEFDRSxifSgpO2YmJih0aGlzLmluc2VydE5vZGUoZyksYz1iKGcpLGcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChnKSxjPj1kLmJvZHkuc2Nyb2xsVG9wK2QuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodC1lJiYoZC5ib2R5LnNjcm9sbFRvcD1jKSl9LHNlbGVjdExpbmU6ZnVuY3Rpb24oKXthLmJyb3dzZXIuc3VwcG9ydHNTZWxlY3Rpb25Nb2RpZnkoKT90aGlzLl9zZWxlY3RMaW5lX1czQygpOnRoaXMuZG9jLnNlbGVjdGlvbiYmdGhpcy5fc2VsZWN0TGluZV9NU0lFKCl9LF9zZWxlY3RMaW5lX1czQzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZG9jLmRlZmF1bHRWaWV3LGI9YS5nZXRTZWxlY3Rpb24oKTtiLm1vZGlmeShcIm1vdmVcIixcImxlZnRcIixcImxpbmVib3VuZGFyeVwiKSxiLm1vZGlmeShcImV4dGVuZFwiLFwicmlnaHRcIixcImxpbmVib3VuZGFyeVwiKX0sX3NlbGVjdExpbmVfTVNJRTpmdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZj10aGlzLmRvYy5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKSxnPWYuYm91bmRpbmdUb3AsaD10aGlzLmRvYy5ib2R5LnNjcm9sbFdpZHRoO2lmKGYubW92ZVRvUG9pbnQpe2ZvcigwPT09ZyYmKGM9dGhpcy5kb2MuY3JlYXRlRWxlbWVudChcInNwYW5cIiksdGhpcy5pbnNlcnROb2RlKGMpLGc9Yy5vZmZzZXRUb3AsYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKSxnKz0xLGQ9LTEwO2g+ZDtkKz0yKXRyeXtmLm1vdmVUb1BvaW50KGQsZyk7YnJlYWt9Y2F0Y2goaSl7fWZvcihhPWcsYj10aGlzLmRvYy5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKSxlPWg7ZT49MDtlLS0pdHJ5e2IubW92ZVRvUG9pbnQoZSxhKTticmVha31jYXRjaChqKXt9Zi5zZXRFbmRQb2ludChcIkVuZFRvRW5kXCIsYiksZi5zZWxlY3QoKX19LGdldFRleHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFNlbGVjdGlvbigpO3JldHVybiBhP1wiXCIrYTpcIlwifSxnZXROb2RlczpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZ2V0UmFuZ2UoKTtyZXR1cm4gYz9jLmdldE5vZGVzKFthXSxiKTpbXX0sZml4UmFuZ2VPdmVyZmxvdzpmdW5jdGlvbihhKXt2YXIgYixjO3RoaXMuY29udGFpbiYmdGhpcy5jb250YWluLmZpcnN0Q2hpbGQmJmEmJihiPWEuY29tcGFyZU5vZGUodGhpcy5jb250YWluKSwyIT09Yj8oMT09PWImJmEuc2V0U3RhcnRCZWZvcmUodGhpcy5jb250YWluLmZpcnN0Q2hpbGQpLDA9PT1iJiZhLnNldEVuZEFmdGVyKHRoaXMuY29udGFpbi5sYXN0Q2hpbGQpLDM9PT1iJiYoYS5zZXRTdGFydEJlZm9yZSh0aGlzLmNvbnRhaW4uZmlyc3RDaGlsZCksYS5zZXRFbmRBZnRlcih0aGlzLmNvbnRhaW4ubGFzdENoaWxkKSkpOnRoaXMuX2RldGVjdElubGluZVJhbmdlUHJvYmxlbXMoYSkmJihjPWEuZW5kQ29udGFpbmVyLnByZXZpb3VzRWxlbWVudFNpYmxpbmcsYyYmYS5zZXRFbmQoYyx0aGlzLl9lbmRPZmZzZXRGb3JOb2RlKGMpKSkpfSxfZW5kT2Zmc2V0Rm9yTm9kZTpmdW5jdGlvbihhKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVSYW5nZSgpO3JldHVybiBiLnNlbGVjdE5vZGVDb250ZW50cyhhKSxiLmVuZE9mZnNldH0sX2RldGVjdElubGluZVJhbmdlUHJvYmxlbXM6ZnVuY3Rpb24oYSl7dmFyIGI9ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhLnN0YXJ0Q29udGFpbmVyLGEuZW5kQ29udGFpbmVyKTtyZXR1cm4gMD09YS5lbmRPZmZzZXQmJjQmYn0sZ2V0UmFuZ2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRTZWxlY3Rpb24oKSxjPWImJmIucmFuZ2VDb3VudCYmYi5nZXRSYW5nZUF0KDApO3JldHVybiBhIT09ITAmJnRoaXMuZml4UmFuZ2VPdmVyZmxvdyhjKSxjfSxnZXRPd25VbmVkaXRhYmxlczpmdW5jdGlvbigpe3ZhciBiPWUucXVlcnkodGhpcy5jb250YWluLFwiLlwiK3RoaXMudW5zZWxlY3RhYmxlQ2xhc3MpLGM9ZS5xdWVyeShiLFwiLlwiK3RoaXMudW5zZWxlY3RhYmxlQ2xhc3MpO3JldHVybiBhLmxhbmcuYXJyYXkoYikud2l0aG91dChjKX0sZ2V0T3duUmFuZ2VzOmZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGcsaD1bXSxpPXRoaXMuZ2V0UmFuZ2UoKTtpZihpJiZoLnB1c2goaSksdGhpcy51bnNlbGVjdGFibGVDbGFzcyYmdGhpcy5jb250YWluJiZpJiYoYj10aGlzLmdldE93blVuZWRpdGFibGVzKCksYi5sZW5ndGg+MCkpZm9yKGQ9MCxlPWIubGVuZ3RoO2U+ZDtkKyspZm9yKGE9W10sZj0wLGc9aC5sZW5ndGg7Zz5mO2YrKyl7aWYoaFtmXSlzd2l0Y2goaFtmXS5jb21wYXJlTm9kZShiW2RdKSl7Y2FzZSAyOmJyZWFrO2Nhc2UgMzpjPWhbZl0uY2xvbmVSYW5nZSgpLGMuc2V0RW5kQmVmb3JlKGJbZF0pLGEucHVzaChjKSxjPWhbZl0uY2xvbmVSYW5nZSgpLGMuc2V0U3RhcnRBZnRlcihiW2RdKSxhLnB1c2goYyk7YnJlYWs7ZGVmYXVsdDphLnB1c2goaFtmXSl9aD1hfXJldHVybiBofSxnZXRTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gcmFuZ3kuZ2V0U2VsZWN0aW9uKHRoaXMuZG9jLmRlZmF1bHRWaWV3fHx0aGlzLmRvYy5wYXJlbnRXaW5kb3cpfSxzZXRTZWxlY3Rpb246ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5kb2MuZGVmYXVsdFZpZXd8fHRoaXMuZG9jLnBhcmVudFdpbmRvdyxjPXJhbmd5LmdldFNlbGVjdGlvbihiKTtyZXR1cm4gYy5zZXRTaW5nbGVSYW5nZShhKX0sY3JlYXRlUmFuZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gcmFuZ3kuY3JlYXRlUmFuZ2UodGhpcy5kb2MpfSxpc0NvbGxhcHNlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFNlbGVjdGlvbigpLmlzQ29sbGFwc2VkfSxnZXRIdG1sOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U2VsZWN0aW9uKCkudG9IdG1sKCl9LGlzRW5kVG9FbmRJbk5vZGU6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5nZXRSYW5nZSgpLGQ9Yy5jb21tb25BbmNlc3RvckNvbnRhaW5lcixlPWMuc3RhcnRDb250YWluZXIsZj1jLmVuZENvbnRhaW5lcjtpZihkLm5vZGVUeXBlPT09YS5URVhUX05PREUmJihkPWQucGFyZW50Tm9kZSksZS5ub2RlVHlwZT09PWEuVEVYVF9OT0RFJiYhL15cXHMqJC8udGVzdChlLmRhdGEuc3Vic3RyKGMuc3RhcnRPZmZzZXQpKSlyZXR1cm4hMTtpZihmLm5vZGVUeXBlPT09YS5URVhUX05PREUmJiEvXlxccyokLy50ZXN0KGYuZGF0YS5zdWJzdHIoYy5lbmRPZmZzZXQpKSlyZXR1cm4hMTtmb3IoO2UmJmUhPT1kOyl7aWYoZS5ub2RlVHlwZSE9PWEuVEVYVF9OT0RFJiYhYS5kb20uY29udGFpbnMoZCxlKSlyZXR1cm4hMTtpZihhLmRvbS5kb21Ob2RlKGUpLnByZXYoe2lnbm9yZUJsYW5rVGV4dHM6ITB9KSlyZXR1cm4hMTtlPWUucGFyZW50Tm9kZX1mb3IoO2YmJmYhPT1kOyl7aWYoZi5ub2RlVHlwZSE9PWEuVEVYVF9OT0RFJiYhYS5kb20uY29udGFpbnMoZCxmKSlyZXR1cm4hMTtpZihhLmRvbS5kb21Ob2RlKGYpLm5leHQoe2lnbm9yZUJsYW5rVGV4dHM6ITB9KSlyZXR1cm4hMTtmPWYucGFyZW50Tm9kZX1yZXR1cm4gYS5sYW5nLmFycmF5KGIpLmNvbnRhaW5zKGQubm9kZU5hbWUpP2Q6ITF9LGRlc2VsZWN0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRTZWxlY3Rpb24oKTthJiZhLnJlbW92ZUFsbFJhbmdlcygpfX0pfSh3eXNpaHRtbDUpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIsYyl7aWYoIWEuY2xhc3NOYW1lKXJldHVybiExO3ZhciBkPWEuY2xhc3NOYW1lLm1hdGNoKGMpfHxbXTtyZXR1cm4gZFtkLmxlbmd0aC0xXT09PWJ9ZnVuY3Rpb24gZChhLGIpe2lmKCFhLmdldEF0dHJpYnV0ZXx8IWEuZ2V0QXR0cmlidXRlKFwic3R5bGVcIikpcmV0dXJuITE7YS5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKS5tYXRjaChiKTtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKS5tYXRjaChiKT8hMDohMX1mdW5jdGlvbiBlKGEsYixjKXthLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpPyhoKGEsYyksYS5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKSYmIS9eXFxzKiQvLnRlc3QoYS5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKSk/YS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLGIrXCI7XCIrYS5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKSk6YS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLGIpKTphLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsYil9ZnVuY3Rpb24gZihhLGIsYyl7YS5jbGFzc05hbWU/KGcoYSxjKSxhLmNsYXNzTmFtZSs9XCIgXCIrYik6YS5jbGFzc05hbWU9Yn1mdW5jdGlvbiBnKGEsYil7YS5jbGFzc05hbWUmJihhLmNsYXNzTmFtZT1hLmNsYXNzTmFtZS5yZXBsYWNlKGIsXCJcIikpfWZ1bmN0aW9uIGgoYSxiKXt2YXIgYyxkLGU9W107aWYoYS5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKSl7Zm9yKGM9YS5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKS5zcGxpdChcIjtcIiksZD1jLmxlbmd0aDtkLS07KWNbZF0ubWF0Y2goYil8fC9eXFxzKiQvLnRlc3QoY1tkXSl8fGUucHVzaChjW2RdKTtlLmxlbmd0aD9hLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsZS5qb2luKFwiO1wiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKX19ZnVuY3Rpb24gaShhLGIpe3ZhciBjLGQsZSxmPVtdLGc9Yi5zcGxpdChcIjtcIiksaD1hLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO2lmKGgpe2ZvcihoPWgucmVwbGFjZSgvXFxzL2dpLFwiXCIpLnRvTG93ZXJDYXNlKCksZi5wdXNoKFJlZ0V4cChcIihefFxcXFxzfDspXCIrYi5yZXBsYWNlKC9cXHMvZ2ksXCJcIikucmVwbGFjZSgvKFtcXChcXCldKS9naSxcIlxcXFwkMVwiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoXCI7XCIsXCI7P1wiKS5yZXBsYWNlKC9yZ2JcXFxcXFwoKFxcZCspLChcXGQrKSwoXFxkKylcXFxcXFwpL2dpLFwiXFxcXHM/cmdiXFxcXCgkMSxcXFxccz8kMixcXFxccz8kM1xcXFwpXCIpLFwiZ2lcIikpLGM9Zy5sZW5ndGg7Yy0tPjA7KS9eXFxzKiQvLnRlc3QoZ1tjXSl8fGYucHVzaChSZWdFeHAoXCIoXnxcXFxcc3w7KVwiK2dbY10ucmVwbGFjZSgvXFxzL2dpLFwiXCIpLnJlcGxhY2UoLyhbXFwoXFwpXSkvZ2ksXCJcXFxcJDFcIikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKFwiO1wiLFwiOz9cIikucmVwbGFjZSgvcmdiXFxcXFxcKChcXGQrKSwoXFxkKyksKFxcZCspXFxcXFxcKS9naSxcIlxcXFxzP3JnYlxcXFwoJDEsXFxcXHM/JDIsXFxcXHM/JDNcXFxcKVwiKSxcImdpXCIpKTtmb3IoZD0wLGU9Zi5sZW5ndGg7ZT5kO2QrKylpZihoLm1hdGNoKGZbZF0pKXJldHVybiBmW2RdfXJldHVybiExfWZ1bmN0aW9uIGooYyxkLGUsZil7cmV0dXJuIGU/aShjLGUpOmY/YS5kb20uaGFzQ2xhc3MoYyxmKTpiLmRvbS5hcnJheUNvbnRhaW5zKGQsYy50YWdOYW1lLnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIGsoYSxiLGMsZCl7Zm9yKHZhciBlPWEubGVuZ3RoO2UtLTspaWYoIWooYVtlXSxiLGMsZCkpcmV0dXJuITE7cmV0dXJuIGEubGVuZ3RoPyEwOiExfWZ1bmN0aW9uIGwoYSxiLGMpe3ZhciBkPWkoYSxiKTtyZXR1cm4gZD8oaChhLGQpLFwicmVtb3ZlXCIpOihlKGEsYixjKSxcImNoYW5nZVwiKX1mdW5jdGlvbiBtKGEsYil7cmV0dXJuIGEuY2xhc3NOYW1lLnJlcGxhY2UodSxcIiBcIik9PWIuY2xhc3NOYW1lLnJlcGxhY2UodSxcIiBcIil9ZnVuY3Rpb24gbihhKXtmb3IodmFyIGI9YS5wYXJlbnROb2RlO2EuZmlyc3RDaGlsZDspYi5pbnNlcnRCZWZvcmUoYS5maXJzdENoaWxkLGEpO2IucmVtb3ZlQ2hpbGQoYSl9ZnVuY3Rpb24gbyhhLGIpe2lmKGEuYXR0cmlidXRlcy5sZW5ndGghPWIuYXR0cmlidXRlcy5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBjLGQsZSxmPTAsZz1hLmF0dHJpYnV0ZXMubGVuZ3RoO2c+ZjsrK2YpaWYoYz1hLmF0dHJpYnV0ZXNbZl0sZT1jLm5hbWUsXCJjbGFzc1wiIT1lKXtpZihkPWIuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oZSksYy5zcGVjaWZpZWQhPWQuc3BlY2lmaWVkKXJldHVybiExO2lmKGMuc3BlY2lmaWVkJiZjLm5vZGVWYWx1ZSE9PWQubm9kZVZhbHVlKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIHAoYSxjKXtyZXR1cm4gYi5kb20uaXNDaGFyYWN0ZXJEYXRhTm9kZShhKT8wPT1jPyEhYS5wcmV2aW91c1NpYmxpbmc6Yz09YS5sZW5ndGg/ISFhLm5leHRTaWJsaW5nOiEwOmM+MCYmYzxhLmNoaWxkTm9kZXMubGVuZ3RofWZ1bmN0aW9uIHEoYSxjLGQsZSl7dmFyIGYsZztpZihiLmRvbS5pc0NoYXJhY3RlckRhdGFOb2RlKGMpJiYoMD09ZD8oZD1iLmRvbS5nZXROb2RlSW5kZXgoYyksYz1jLnBhcmVudE5vZGUpOmQ9PWMubGVuZ3RoPyhkPWIuZG9tLmdldE5vZGVJbmRleChjKSsxLGM9Yy5wYXJlbnROb2RlKTpmPWIuZG9tLnNwbGl0RGF0YU5vZGUoYyxkKSksIShmfHxlJiZjPT09ZSkpe2ZvcihmPWMuY2xvbmVOb2RlKCExKSxmLmlkJiZmLnJlbW92ZUF0dHJpYnV0ZShcImlkXCIpO2c9Yy5jaGlsZE5vZGVzW2RdOylmLmFwcGVuZENoaWxkKGcpO2IuZG9tLmluc2VydEFmdGVyKGYsYyl9cmV0dXJuIGM9PWE/ZjpxKGEsZi5wYXJlbnROb2RlLGIuZG9tLmdldE5vZGVJbmRleChmKSxlKX1mdW5jdGlvbiByKGIpe3RoaXMuaXNFbGVtZW50TWVyZ2U9Yi5ub2RlVHlwZT09YS5FTEVNRU5UX05PREUsdGhpcy5maXJzdFRleHROb2RlPXRoaXMuaXNFbGVtZW50TWVyZ2U/Yi5sYXN0Q2hpbGQ6Yix0aGlzLnRleHROb2Rlcz1bdGhpcy5maXJzdFRleHROb2RlXX1mdW5jdGlvbiBzKGEsYixjLGQsZSxmLGcpe3RoaXMudGFnTmFtZXM9YXx8W3RdLHRoaXMuY3NzQ2xhc3M9Ynx8KGI9PT0hMT8hMTpcIlwiKSx0aGlzLnNpbWlsYXJDbGFzc1JlZ0V4cD1jLHRoaXMuY3NzU3R5bGU9ZXx8XCJcIix0aGlzLnNpbWlsYXJTdHlsZVJlZ0V4cD1mLHRoaXMubm9ybWFsaXplPWQsdGhpcy5hcHBseVRvQW55VGFnTmFtZT0hMSx0aGlzLmNvbnRhaW5lcj1nfXZhciB0PVwic3BhblwiLHU9L1xccysvZztyLnByb3RvdHlwZT17ZG9NZXJnZTpmdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZj1bXTtmb3IoZD0wLGU9dGhpcy50ZXh0Tm9kZXMubGVuZ3RoO2U+ZDsrK2QpYT10aGlzLnRleHROb2Rlc1tkXSxiPWEucGFyZW50Tm9kZSxmW2RdPWEuZGF0YSxkJiYoYi5yZW1vdmVDaGlsZChhKSxiLmhhc0NoaWxkTm9kZXMoKXx8Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpKTtyZXR1cm4gdGhpcy5maXJzdFRleHROb2RlLmRhdGE9Yz1mLmpvaW4oXCJcIiksY30sZ2V0TGVuZ3RoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudGV4dE5vZGVzLmxlbmd0aCxiPTA7YS0tOyliKz10aGlzLnRleHROb2Rlc1thXS5sZW5ndGg7cmV0dXJuIGJ9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGEsYixjPVtdO2ZvcihhPTAsYj10aGlzLnRleHROb2Rlcy5sZW5ndGg7Yj5hOysrYSljW2FdPVwiJ1wiK3RoaXMudGV4dE5vZGVzW2FdLmRhdGErXCInXCI7cmV0dXJuXCJbTWVyZ2UoXCIrYy5qb2luKFwiLFwiKStcIildXCJ9fSxzLnByb3RvdHlwZT17Z2V0QW5jZXN0b3JXaXRoQ2xhc3M6ZnVuY3Rpb24oZCl7Zm9yKHZhciBlO2Q7KXtpZihlPXRoaXMuY3NzQ2xhc3M/YyhkLHRoaXMuY3NzQ2xhc3MsdGhpcy5zaW1pbGFyQ2xhc3NSZWdFeHApOlwiXCIhPT10aGlzLmNzc1N0eWxlPyExOiEwLGQubm9kZVR5cGU9PWEuRUxFTUVOVF9OT0RFJiZcImZhbHNlXCIhPWQuZ2V0QXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpJiZiLmRvbS5hcnJheUNvbnRhaW5zKHRoaXMudGFnTmFtZXMsZC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpJiZlKXJldHVybiBkO2Q9ZC5wYXJlbnROb2RlfXJldHVybiExfSxnZXRBbmNlc3RvcldpdGhTdHlsZTpmdW5jdGlvbihjKXtmb3IodmFyIGU7Yzspe2lmKGU9dGhpcy5jc3NTdHlsZT9kKGMsdGhpcy5zaW1pbGFyU3R5bGVSZWdFeHApOiExLGMubm9kZVR5cGU9PWEuRUxFTUVOVF9OT0RFJiZcImZhbHNlXCIhPWMuZ2V0QXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpJiZiLmRvbS5hcnJheUNvbnRhaW5zKHRoaXMudGFnTmFtZXMsYy50YWdOYW1lLnRvTG93ZXJDYXNlKCkpJiZlKXJldHVybiBjO2M9Yy5wYXJlbnROb2RlfXJldHVybiExfSxnZXRNYXRjaGluZ0FuY2VzdG9yOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0QW5jZXN0b3JXaXRoQ2xhc3MoYSksYz0hMTtyZXR1cm4gYj90aGlzLmNzc1N0eWxlJiYoYz1cImNsYXNzXCIpOihiPXRoaXMuZ2V0QW5jZXN0b3JXaXRoU3R5bGUoYSksYiYmKGM9XCJzdHlsZVwiKSkse2VsZW1lbnQ6Yix0eXBlOmN9fSxwb3N0QXBwbHk6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnLGgsaT1hWzBdLGo9YVthLmxlbmd0aC0xXSxrPVtdLGw9aSxtPWosbj0wLG89ai5sZW5ndGg7Zm9yKGY9MCxnPWEubGVuZ3RoO2c+ZjsrK2YpZD1hW2ZdLGU9bnVsbCxkJiZkLnBhcmVudE5vZGUmJihlPXRoaXMuZ2V0QWRqYWNlbnRNZXJnZWFibGVUZXh0Tm9kZShkLnBhcmVudE5vZGUsITEpKSxlPyhjfHwoYz1uZXcgcihlKSxrLnB1c2goYykpLGMudGV4dE5vZGVzLnB1c2goZCksZD09PWkmJihsPWMuZmlyc3RUZXh0Tm9kZSxuPWwubGVuZ3RoKSxkPT09aiYmKG09Yy5maXJzdFRleHROb2RlLG89Yy5nZXRMZW5ndGgoKSkpOmM9bnVsbDtpZihqJiZqLnBhcmVudE5vZGUmJihoPXRoaXMuZ2V0QWRqYWNlbnRNZXJnZWFibGVUZXh0Tm9kZShqLnBhcmVudE5vZGUsITApLGgmJihjfHwoYz1uZXcgcihqKSxrLnB1c2goYykpLGMudGV4dE5vZGVzLnB1c2goaCkpKSxrLmxlbmd0aCl7Zm9yKGY9MCxnPWsubGVuZ3RoO2c+ZjsrK2Ypa1tmXS5kb01lcmdlKCk7Yi5zZXRTdGFydChsLG4pLGIuc2V0RW5kKG0sbyl9fSxnZXRBZGphY2VudE1lcmdlYWJsZVRleHROb2RlOmZ1bmN0aW9uKGIsYyl7dmFyIGQsZT1iLm5vZGVUeXBlPT1hLlRFWFRfTk9ERSxmPWU/Yi5wYXJlbnROb2RlOmIsZz1jP1wibmV4dFNpYmxpbmdcIjpcInByZXZpb3VzU2libGluZ1wiO2lmKGUpe2lmKGQ9YltnXSxkJiZkLm5vZGVUeXBlPT1hLlRFWFRfTk9ERSlyZXR1cm4gZH1lbHNlIGlmKGQ9ZltnXSxkJiZ0aGlzLmFyZUVsZW1lbnRzTWVyZ2VhYmxlKGIsZCkpcmV0dXJuIGRbYz9cImZpcnN0Q2hpbGRcIjpcImxhc3RDaGlsZFwiXTtyZXR1cm4gbnVsbH0sYXJlRWxlbWVudHNNZXJnZWFibGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYi5kb20uYXJyYXlDb250YWlucyh0aGlzLnRhZ05hbWVzLChhLnRhZ05hbWV8fFwiXCIpLnRvTG93ZXJDYXNlKCkpJiZiLmRvbS5hcnJheUNvbnRhaW5zKHRoaXMudGFnTmFtZXMsKGMudGFnTmFtZXx8XCJcIikudG9Mb3dlckNhc2UoKSkmJm0oYSxjKSYmbyhhLGMpfSxjcmVhdGVDb250YWluZXI6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jcmVhdGVFbGVtZW50KHRoaXMudGFnTmFtZXNbMF0pO3JldHVybiB0aGlzLmNzc0NsYXNzJiYoYi5jbGFzc05hbWU9dGhpcy5jc3NDbGFzcyksdGhpcy5jc3NTdHlsZSYmYi5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLHRoaXMuY3NzU3R5bGUpLGJ9LGFwcGx5VG9UZXh0Tm9kZTpmdW5jdGlvbihhKXt2YXIgYyxkPWEucGFyZW50Tm9kZTsxPT1kLmNoaWxkTm9kZXMubGVuZ3RoJiZiLmRvbS5hcnJheUNvbnRhaW5zKHRoaXMudGFnTmFtZXMsZC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpPyh0aGlzLmNzc0NsYXNzJiZmKGQsdGhpcy5jc3NDbGFzcyx0aGlzLnNpbWlsYXJDbGFzc1JlZ0V4cCksdGhpcy5jc3NTdHlsZSYmZShkLHRoaXMuY3NzU3R5bGUsdGhpcy5zaW1pbGFyU3R5bGVSZWdFeHApKTooYz10aGlzLmNyZWF0ZUNvbnRhaW5lcihiLmRvbS5nZXREb2N1bWVudChhKSksYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjLGEpLGMuYXBwZW5kQ2hpbGQoYSkpfSxpc1JlbW92YWJsZTpmdW5jdGlvbihjKXtyZXR1cm4gYi5kb20uYXJyYXlDb250YWlucyh0aGlzLnRhZ05hbWVzLGMudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSYmXCJcIj09PWEubGFuZy5zdHJpbmcoYy5jbGFzc05hbWUpLnRyaW0oKSYmKCFjLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpfHxcIlwiPT09YS5sYW5nLnN0cmluZyhjLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpKS50cmltKCkpfSx1bmRvVG9UZXh0Tm9kZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmPWM/ITE6ITAsaD1jfHxkLGk9ITE7Yi5jb250YWluc05vZGUoaCl8fChlPWIuY2xvbmVSYW5nZSgpLGUuc2VsZWN0Tm9kZShoKSxlLmlzUG9pbnRJblJhbmdlKGIuZW5kQ29udGFpbmVyLGIuZW5kT2Zmc2V0KSYmcChiLmVuZENvbnRhaW5lcixiLmVuZE9mZnNldCkmJihxKGgsYi5lbmRDb250YWluZXIsYi5lbmRPZmZzZXQsdGhpcy5jb250YWluZXIpLGIuc2V0RW5kQWZ0ZXIoaCkpLGUuaXNQb2ludEluUmFuZ2UoYi5zdGFydENvbnRhaW5lcixiLnN0YXJ0T2Zmc2V0KSYmcChiLnN0YXJ0Q29udGFpbmVyLGIuc3RhcnRPZmZzZXQpJiYoaD1xKGgsYi5zdGFydENvbnRhaW5lcixiLnN0YXJ0T2Zmc2V0LHRoaXMuY29udGFpbmVyKSkpLCFmJiZ0aGlzLnNpbWlsYXJDbGFzc1JlZ0V4cCYmZyhoLHRoaXMuc2ltaWxhckNsYXNzUmVnRXhwKSxmJiZ0aGlzLnNpbWlsYXJTdHlsZVJlZ0V4cCYmKGk9XCJjaGFuZ2VcIj09PWwoaCx0aGlzLmNzc1N0eWxlLHRoaXMuc2ltaWxhclN0eWxlUmVnRXhwKSksdGhpcy5pc1JlbW92YWJsZShoKSYmIWkmJm4oaCl9LGFwcGx5VG9SYW5nZTpmdW5jdGlvbihiKXt2YXIgYyxkLGUsZixnLGg7Zm9yKGQ9Yi5sZW5ndGg7ZC0tOyl7aWYoYz1iW2RdLmdldE5vZGVzKFthLlRFWFRfTk9ERV0pLCFjLmxlbmd0aCl0cnl7cmV0dXJuIGU9dGhpcy5jcmVhdGVDb250YWluZXIoYltkXS5lbmRDb250YWluZXIub3duZXJEb2N1bWVudCksYltkXS5zdXJyb3VuZENvbnRlbnRzKGUpLHRoaXMuc2VsZWN0Tm9kZShiW2RdLGUpLHZvaWQgMH1jYXRjaChpKXt9aWYoYltkXS5zcGxpdEJvdW5kYXJpZXMoKSxjPWJbZF0uZ2V0Tm9kZXMoW2EuVEVYVF9OT0RFXSksYy5sZW5ndGgpe2ZvcihnPTAsaD1jLmxlbmd0aDtoPmc7KytnKWY9Y1tnXSx0aGlzLmdldE1hdGNoaW5nQW5jZXN0b3IoZikuZWxlbWVudHx8dGhpcy5hcHBseVRvVGV4dE5vZGUoZik7YltkXS5zZXRTdGFydChjWzBdLDApLGY9Y1tjLmxlbmd0aC0xXSxiW2RdLnNldEVuZChmLGYubGVuZ3RoKSx0aGlzLm5vcm1hbGl6ZSYmdGhpcy5wb3N0QXBwbHkoYyxiW2RdKX19fSx1bmRvVG9SYW5nZTpmdW5jdGlvbihiKXt2YXIgYyxkLGUsZixnLGgsaSxqO2ZvcihmPWIubGVuZ3RoO2YtLTspe2ZvcihjPWJbZl0uZ2V0Tm9kZXMoW2EuVEVYVF9OT0RFXSksYy5sZW5ndGg/KGJbZl0uc3BsaXRCb3VuZGFyaWVzKCksYz1iW2ZdLmdldE5vZGVzKFthLlRFWFRfTk9ERV0pKTooZz1iW2ZdLmVuZENvbnRhaW5lci5vd25lckRvY3VtZW50LGg9Zy5jcmVhdGVUZXh0Tm9kZShhLklOVklTSUJMRV9TUEFDRSksYltmXS5pbnNlcnROb2RlKGgpLGJbZl0uc2VsZWN0Tm9kZShoKSxjPVtoXSksaT0wLGo9Yy5sZW5ndGg7aj5pOysraSliW2ZdLmlzVmFsaWQoKSYmKGQ9Y1tpXSxlPXRoaXMuZ2V0TWF0Y2hpbmdBbmNlc3RvcihkKSxcInN0eWxlXCI9PT1lLnR5cGU/dGhpcy51bmRvVG9UZXh0Tm9kZShkLGJbZl0sITEsZS5lbGVtZW50KTplLmVsZW1lbnQmJnRoaXMudW5kb1RvVGV4dE5vZGUoZCxiW2ZdLGUuZWxlbWVudCkpOzE9PWo/dGhpcy5zZWxlY3ROb2RlKGJbZl0sY1swXSk6KGJbZl0uc2V0U3RhcnQoY1swXSwwKSxkPWNbYy5sZW5ndGgtMV0sYltmXS5zZXRFbmQoZCxkLmxlbmd0aCksdGhpcy5ub3JtYWxpemUmJnRoaXMucG9zdEFwcGx5KGMsYltmXSkpfX0sc2VsZWN0Tm9kZTpmdW5jdGlvbihiLGMpe3ZhciBkPWMubm9kZVR5cGU9PT1hLkVMRU1FTlRfTk9ERSxlPVwiY2FuSGF2ZUhUTUxcImluIGM/Yy5jYW5IYXZlSFRNTDohMCxmPWQ/Yy5pbm5lckhUTUw6Yy5kYXRhLGc9XCJcIj09PWZ8fGY9PT1hLklOVklTSUJMRV9TUEFDRTtpZihnJiZkJiZlKXRyeXtjLmlubmVySFRNTD1hLklOVklTSUJMRV9TUEFDRX1jYXRjaChoKXt9Yi5zZWxlY3ROb2RlQ29udGVudHMoYyksZyYmZD9iLmNvbGxhcHNlKCExKTpnJiYoYi5zZXRTdGFydEFmdGVyKGMpLGIuc2V0RW5kQWZ0ZXIoYykpfSxnZXRUZXh0U2VsZWN0ZWRCeVJhbmdlOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWIuY2xvbmVSYW5nZSgpO3JldHVybiBlLnNlbGVjdE5vZGVDb250ZW50cyhhKSxjPWUuaW50ZXJzZWN0aW9uKGIpLGQ9Yz9cIlwiK2M6XCJcIixlLmRldGFjaCgpLGR9LGlzQXBwbGllZFRvUmFuZ2U6ZnVuY3Rpb24oYil7dmFyIGMsZCxlLGYsZyxoLGk9W10saj1cImZ1bGxcIjtmb3IoZT1iLmxlbmd0aDtlLS07KXtpZihkPWJbZV0uZ2V0Tm9kZXMoW2EuVEVYVF9OT0RFXSksIWQubGVuZ3RoKXJldHVybiBjPXRoaXMuZ2V0TWF0Y2hpbmdBbmNlc3RvcihiW2VdLnN0YXJ0Q29udGFpbmVyKS5lbGVtZW50LGM/e2VsZW1lbnRzOltjXSxjb3ZlcmFnZTpqfTohMTtmb3IoZj0wLGc9ZC5sZW5ndGg7Zz5mOysrZiloPXRoaXMuZ2V0VGV4dFNlbGVjdGVkQnlSYW5nZShkW2ZdLGJbZV0pLGM9dGhpcy5nZXRNYXRjaGluZ0FuY2VzdG9yKGRbZl0pLmVsZW1lbnQsYyYmXCJcIiE9aD8oaS5wdXNoKGMpLDE9PT1hLmRvbS5nZXRUZXh0Tm9kZXMoYywhMCkubGVuZ3RoP2o9XCJmdWxsXCI6XCJmdWxsXCI9PT1qJiYoaj1cImlubGluZVwiKSk6Y3x8KGo9XCJwYXJ0aWFsXCIpfXJldHVybiBpLmxlbmd0aD97ZWxlbWVudHM6aSxjb3ZlcmFnZTpqfTohMX0sdG9nZ2xlUmFuZ2U6ZnVuY3Rpb24oYSl7dmFyIGIsYz10aGlzLmlzQXBwbGllZFRvUmFuZ2UoYSk7Yz9cImZ1bGxcIj09PWMuY292ZXJhZ2U/dGhpcy51bmRvVG9SYW5nZShhKTpcImlubGluZVwiPT09Yy5jb3ZlcmFnZT8oYj1rKGMuZWxlbWVudHMsdGhpcy50YWdOYW1lcyx0aGlzLmNzc1N0eWxlLHRoaXMuY3NzQ2xhc3MpLHRoaXMudW5kb1RvUmFuZ2UoYSksYnx8dGhpcy5hcHBseVRvUmFuZ2UoYSkpOihrKGMuZWxlbWVudHMsdGhpcy50YWdOYW1lcyx0aGlzLmNzc1N0eWxlLHRoaXMuY3NzQ2xhc3MpfHx0aGlzLnVuZG9Ub1JhbmdlKGEpLHRoaXMuYXBwbHlUb1JhbmdlKGEpKTp0aGlzLmFwcGx5VG9SYW5nZShhKX19LGEuc2VsZWN0aW9uLkhUTUxBcHBsaWVyPXN9KHd5c2lodG1sNSxyYW5neSksd3lzaWh0bWw1LkNvbW1hbmRzPUJhc2UuZXh0ZW5kKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLmVkaXRvcj1hLHRoaXMuY29tcG9zZXI9YS5jb21wb3Nlcix0aGlzLmRvYz10aGlzLmNvbXBvc2VyLmRvY30sc3VwcG9ydDpmdW5jdGlvbihhKXtyZXR1cm4gd3lzaWh0bWw1LmJyb3dzZXIuc3VwcG9ydHNDb21tYW5kKHRoaXMuZG9jLGEpfSxleGVjOmZ1bmN0aW9uKGEsYil7dmFyIGM9d3lzaWh0bWw1LmNvbW1hbmRzW2FdLGQ9d3lzaWh0bWw1LmxhbmcuYXJyYXkoYXJndW1lbnRzKS5nZXQoKSxlPWMmJmMuZXhlYyxmPW51bGw7aWYodGhpcy5lZGl0b3IuZmlyZShcImJlZm9yZWNvbW1hbmQ6Y29tcG9zZXJcIiksZSlkLnVuc2hpZnQodGhpcy5jb21wb3NlciksZj1lLmFwcGx5KGMsZCk7ZWxzZSB0cnl7Zj10aGlzLmRvYy5leGVjQ29tbWFuZChhLCExLGIpfWNhdGNoKGcpe31yZXR1cm4gdGhpcy5lZGl0b3IuZmlyZShcImFmdGVyY29tbWFuZDpjb21wb3NlclwiKSxmfSxzdGF0ZTpmdW5jdGlvbihhKXt2YXIgYj13eXNpaHRtbDUuY29tbWFuZHNbYV0sYz13eXNpaHRtbDUubGFuZy5hcnJheShhcmd1bWVudHMpLmdldCgpLGQ9YiYmYi5zdGF0ZTtpZihkKXJldHVybiBjLnVuc2hpZnQodGhpcy5jb21wb3NlciksZC5hcHBseShiLGMpO3RyeXtyZXR1cm4gdGhpcy5kb2MucXVlcnlDb21tYW5kU3RhdGUoYSl9Y2F0Y2goZSl7cmV0dXJuITF9fSxzdGF0ZVZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPXd5c2lodG1sNS5jb21tYW5kc1thXSxjPXd5c2lodG1sNS5sYW5nLmFycmF5KGFyZ3VtZW50cykuZ2V0KCksZD1iJiZiLnN0YXRlVmFsdWU7cmV0dXJuIGQ/KGMudW5zaGlmdCh0aGlzLmNvbXBvc2VyKSxkLmFwcGx5KGIsYykpOiExfX0pLHd5c2lodG1sNS5jb21tYW5kcy5ib2xkPXtleGVjOmZ1bmN0aW9uKGEsYil7d3lzaWh0bWw1LmNvbW1hbmRzLmZvcm1hdElubGluZS5leGVjV2l0aFRvZ2dsZShhLGIsXCJiXCIpfSxzdGF0ZTpmdW5jdGlvbihhLGIpe3JldHVybiB3eXNpaHRtbDUuY29tbWFuZHMuZm9ybWF0SW5saW5lLnN0YXRlKGEsYixcImJcIil9fSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYyl7dmFyIGcsaCxpLGosayxsLG0sbixvLHA9Yi5kb2MscT1cIl93eXNpaHRtbDUtdGVtcC1cIisgK25ldyBEYXRlLHI9L25vbi1tYXRjaGluZy1jbGFzcy9nLHM9MDtmb3IoYS5jb21tYW5kcy5mb3JtYXRJbmxpbmUuZXhlYyhiLGQsZSxxLHIsZCxkLCEwLCEwKSxoPXAucXVlcnlTZWxlY3RvckFsbChlK1wiLlwiK3EpLGc9aC5sZW5ndGg7Zz5zO3MrKyl7aT1oW3NdLGkucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIik7Zm9yKG8gaW4gYylcInRleHRcIiE9PW8mJmkuc2V0QXR0cmlidXRlKG8sY1tvXSl9bD1pLDE9PT1nJiYobT1mLmdldFRleHRDb250ZW50KGkpLGo9ISFpLnF1ZXJ5U2VsZWN0b3IoXCIqXCIpLGs9XCJcIj09PW18fG09PT1hLklOVklTSUJMRV9TUEFDRSwhaiYmayYmKGYuc2V0VGV4dENvbnRlbnQoaSxjLnRleHR8fGkuaHJlZiksbj1wLmNyZWF0ZVRleHROb2RlKFwiIFwiKSxiLnNlbGVjdGlvbi5zZXRBZnRlcihpKSxmLmluc2VydChuKS5hZnRlcihpKSxsPW4pKSxiLnNlbGVjdGlvbi5zZXRBZnRlcihsKX1mdW5jdGlvbiBjKGEsYixjKXt2YXIgZCxlLGYsZztmb3IoZT1iLmxlbmd0aDtlLS07KXtmb3IoZD1iW2VdLmF0dHJpYnV0ZXMsZj1kLmxlbmd0aDtmLS07KWJbZV0ucmVtb3ZlQXR0cmlidXRlKGQuaXRlbShmKS5uYW1lKTtmb3IoZyBpbiBjKWMuaGFzT3duUHJvcGVydHkoZykmJmJbZV0uc2V0QXR0cmlidXRlKGcsY1tnXSl9fXZhciBkLGU9XCJBXCIsZj1hLmRvbTthLmNvbW1hbmRzLmNyZWF0ZUxpbms9e2V4ZWM6ZnVuY3Rpb24oYSxkLGUpe3ZhciBmPXRoaXMuc3RhdGUoYSxkKTtmP2Euc2VsZWN0aW9uLmV4ZWN1dGVBbmRSZXN0b3JlKGZ1bmN0aW9uKCl7YyhhLGYsZSl9KTooZT1cIm9iamVjdFwiPT10eXBlb2YgZT9lOntocmVmOmV9LGIoYSxlKSl9LHN0YXRlOmZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY29tbWFuZHMuZm9ybWF0SW5saW5lLnN0YXRlKGIsYyxcIkFcIil9fX0od3lzaWh0bWw1KSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7Zm9yKHZhciBkLGUsZixnPWIubGVuZ3RoLGg9MDtnPmg7aCsrKWQ9YltoXSxlPWMuZ2V0UGFyZW50RWxlbWVudChkLHtub2RlTmFtZTpcImNvZGVcIn0pLGY9Yy5nZXRUZXh0Q29udGVudChkKSxmLm1hdGNoKGMuYXV0b0xpbmsuVVJMX1JFR19FWFApJiYhZT9lPWMucmVuYW1lRWxlbWVudChkLFwiY29kZVwiKTpjLnJlcGxhY2VXaXRoQ2hpbGROb2RlcyhkKX12YXIgYz1hLmRvbTthLmNvbW1hbmRzLnJlbW92ZUxpbms9e2V4ZWM6ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLnN0YXRlKGEsYyk7ZCYmYS5zZWxlY3Rpb24uZXhlY3V0ZUFuZFJlc3RvcmUoZnVuY3Rpb24oKXtiKGEsZCl9KX0sc3RhdGU6ZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jb21tYW5kcy5mb3JtYXRJbmxpbmUuc3RhdGUoYixjLFwiQVwiKX19fSh3eXNpaHRtbDUpLGZ1bmN0aW9uKGEpe3ZhciBiPS93eXNpd3lnLWZvbnQtc2l6ZS1bMC05YS16XFwtXSsvZzthLmNvbW1hbmRzLmZvbnRTaXplPXtleGVjOmZ1bmN0aW9uKGMsZCxlKXthLmNvbW1hbmRzLmZvcm1hdElubGluZS5leGVjV2l0aFRvZ2dsZShjLGQsXCJzcGFuXCIsXCJ3eXNpd3lnLWZvbnQtc2l6ZS1cIitlLGIpfSxzdGF0ZTpmdW5jdGlvbihjLGQsZSl7cmV0dXJuIGEuY29tbWFuZHMuZm9ybWF0SW5saW5lLnN0YXRlKGMsZCxcInNwYW5cIixcInd5c2l3eWctZm9udC1zaXplLVwiK2UsYil9fX0od3lzaWh0bWw1KSxmdW5jdGlvbihhKXt2YXIgYj0vKFxcc3xeKWZvbnQtc2l6ZVxccyo6XFxzKlteO1xcc10rOz8vZ2k7YS5jb21tYW5kcy5mb250U2l6ZVN0eWxlPXtleGVjOmZ1bmN0aW9uKGMsZCxlKXtlPVwib2JqZWN0XCI9PXR5cGVvZiBlP2Uuc2l6ZTplLC9eXFxzKiQvLnRlc3QoZSl8fGEuY29tbWFuZHMuZm9ybWF0SW5saW5lLmV4ZWNXaXRoVG9nZ2xlKGMsZCxcInNwYW5cIiwhMSwhMSxcImZvbnQtc2l6ZTpcIitlLGIpfSxzdGF0ZTpmdW5jdGlvbihjLGQpe3JldHVybiBhLmNvbW1hbmRzLmZvcm1hdElubGluZS5zdGF0ZShjLGQsXCJzcGFuXCIsITEsITEsXCJmb250LXNpemVcIixiKX0sc3RhdGVWYWx1ZTpmdW5jdGlvbihiLGMpe3ZhciBkLGU9dGhpcy5zdGF0ZShiLGMpO3JldHVybiBlJiZhLmxhbmcub2JqZWN0KGUpLmlzQXJyYXkoKSYmKGU9ZVswXSksZSYmKGQ9ZS5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKSxkKT9hLnF1aXJrcy5zdHlsZVBhcnNlci5wYXJzZUZvbnRTaXplKGQpOiExfX19KHd5c2lodG1sNSksZnVuY3Rpb24oYSl7dmFyIGI9L3d5c2l3eWctY29sb3ItWzAtOWEtel0rL2c7YS5jb21tYW5kcy5mb3JlQ29sb3I9e2V4ZWM6ZnVuY3Rpb24oYyxkLGUpe2EuY29tbWFuZHMuZm9ybWF0SW5saW5lLmV4ZWNXaXRoVG9nZ2xlKGMsZCxcInNwYW5cIixcInd5c2l3eWctY29sb3ItXCIrZSxiKX0sc3RhdGU6ZnVuY3Rpb24oYyxkLGUpe3JldHVybiBhLmNvbW1hbmRzLmZvcm1hdElubGluZS5zdGF0ZShjLGQsXCJzcGFuXCIsXCJ3eXNpd3lnLWNvbG9yLVwiK2UsYil9fX0od3lzaWh0bWw1KSxmdW5jdGlvbihhKXt2YXIgYj0vKFxcc3xeKWNvbG9yXFxzKjpcXHMqW147XFxzXSs7Py9naTthLmNvbW1hbmRzLmZvcmVDb2xvclN0eWxlPXtleGVjOmZ1bmN0aW9uKGMsZCxlKXt2YXIgZixnPWEucXVpcmtzLnN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoXCJvYmplY3RcIj09dHlwZW9mIGU/XCJjb2xvcjpcIitlLmNvbG9yOlwiY29sb3I6XCIrZSxcImNvbG9yXCIpO2cmJihmPVwiY29sb3I6IHJnYihcIitnWzBdK1wiLFwiK2dbMV0rXCIsXCIrZ1syXStcIik7XCIsMSE9PWdbM10mJihmKz1cImNvbG9yOiByZ2JhKFwiK2dbMF0rXCIsXCIrZ1sxXStcIixcIitnWzJdK1wiLFwiK2dbM10rXCIpO1wiKSxhLmNvbW1hbmRzLmZvcm1hdElubGluZS5leGVjV2l0aFRvZ2dsZShjLGQsXCJzcGFuXCIsITEsITEsZixiKSl9LHN0YXRlOmZ1bmN0aW9uKGMsZCl7cmV0dXJuIGEuY29tbWFuZHMuZm9ybWF0SW5saW5lLnN0YXRlKGMsZCxcInNwYW5cIiwhMSwhMSxcImNvbG9yXCIsYil9LHN0YXRlVmFsdWU6ZnVuY3Rpb24oYixjLGQpe3ZhciBlLGY9dGhpcy5zdGF0ZShiLGMpO3JldHVybiBmJiZhLmxhbmcub2JqZWN0KGYpLmlzQXJyYXkoKSYmKGY9ZlswXSksZiYmKGU9Zi5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKSxlJiZlKT8odmFsPWEucXVpcmtzLnN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoZSxcImNvbG9yXCIpLGEucXVpcmtzLnN0eWxlUGFyc2VyLnVucGFyc2VDb2xvcih2YWwsZCkpOiExXG59fX0od3lzaWh0bWw1KSxmdW5jdGlvbihhKXt2YXIgYj0vKFxcc3xeKWJhY2tncm91bmQtY29sb3JcXHMqOlxccypbXjtcXHNdKzs/L2dpO2EuY29tbWFuZHMuYmdDb2xvclN0eWxlPXtleGVjOmZ1bmN0aW9uKGMsZCxlKXt2YXIgZixnPWEucXVpcmtzLnN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoXCJvYmplY3RcIj09dHlwZW9mIGU/XCJiYWNrZ3JvdW5kLWNvbG9yOlwiK2UuY29sb3I6XCJiYWNrZ3JvdW5kLWNvbG9yOlwiK2UsXCJiYWNrZ3JvdW5kLWNvbG9yXCIpO2cmJihmPVwiYmFja2dyb3VuZC1jb2xvcjogcmdiKFwiK2dbMF0rXCIsXCIrZ1sxXStcIixcIitnWzJdK1wiKTtcIiwxIT09Z1szXSYmKGYrPVwiYmFja2dyb3VuZC1jb2xvcjogcmdiYShcIitnWzBdK1wiLFwiK2dbMV0rXCIsXCIrZ1syXStcIixcIitnWzNdK1wiKTtcIiksYS5jb21tYW5kcy5mb3JtYXRJbmxpbmUuZXhlY1dpdGhUb2dnbGUoYyxkLFwic3BhblwiLCExLCExLGYsYikpfSxzdGF0ZTpmdW5jdGlvbihjLGQpe3JldHVybiBhLmNvbW1hbmRzLmZvcm1hdElubGluZS5zdGF0ZShjLGQsXCJzcGFuXCIsITEsITEsXCJiYWNrZ3JvdW5kLWNvbG9yXCIsYil9LHN0YXRlVmFsdWU6ZnVuY3Rpb24oYixjLGQpe3ZhciBlLGY9dGhpcy5zdGF0ZShiLGMpLGc9ITE7cmV0dXJuIGYmJmEubGFuZy5vYmplY3QoZikuaXNBcnJheSgpJiYoZj1mWzBdKSxmJiYoZT1mLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLGUpPyhnPWEucXVpcmtzLnN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoZSxcImJhY2tncm91bmQtY29sb3JcIiksYS5xdWlya3Muc3R5bGVQYXJzZXIudW5wYXJzZUNvbG9yKGcsZCkpOiExfX19KHd5c2lodG1sNSksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGMsZSl7Yi5jbGFzc05hbWU/KGQoYixlKSxiLmNsYXNzTmFtZT1hLmxhbmcuc3RyaW5nKGIuY2xhc3NOYW1lK1wiIFwiK2MpLnRyaW0oKSk6Yi5jbGFzc05hbWU9Y31mdW5jdGlvbiBjKGIsYyxkKXtlKGIsZCksYi5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKT9iLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsYS5sYW5nLnN0cmluZyhiLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpK1wiIFwiK2MpLnRyaW0oKSk6Yi5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLGMpfWZ1bmN0aW9uIGQoYixjKXt2YXIgZD1jLnRlc3QoYi5jbGFzc05hbWUpO3JldHVybiBiLmNsYXNzTmFtZT1iLmNsYXNzTmFtZS5yZXBsYWNlKGMsXCJcIiksXCJcIj09YS5sYW5nLnN0cmluZyhiLmNsYXNzTmFtZSkudHJpbSgpJiZiLnJlbW92ZUF0dHJpYnV0ZShcImNsYXNzXCIpLGR9ZnVuY3Rpb24gZShiLGMpe3ZhciBkPWMudGVzdChiLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpKTtyZXR1cm4gYi5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLChiLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpfHxcIlwiKS5yZXBsYWNlKGMsXCJcIikpLFwiXCI9PWEubGFuZy5zdHJpbmcoYi5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKXx8XCJcIikudHJpbSgpJiZiLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpLGR9ZnVuY3Rpb24gZihhKXt2YXIgYj1hLmxhc3RDaGlsZDtiJiZnKGIpJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYil9ZnVuY3Rpb24gZyhhKXtyZXR1cm5cIkJSXCI9PT1hLm5vZGVOYW1lfWZ1bmN0aW9uIGgoYixjKXt2YXIgZCxlLGc7Zm9yKGIuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCkmJmIuc2VsZWN0aW9uLnNlbGVjdExpbmUoKSxkPWIuc2VsZWN0aW9uLnN1cnJvdW5kKGMpLGU9MCxnPWQubGVuZ3RoO2c+ZTtlKyspYS5kb20ubGluZUJyZWFrcyhkW2VdKS5yZW1vdmUoKSxmKGRbZV0pfWZ1bmN0aW9uIGkoYil7cmV0dXJuISFhLmxhbmcuc3RyaW5nKGIuY2xhc3NOYW1lKS50cmltKCl9ZnVuY3Rpb24gaihiKXtyZXR1cm4hIWEubGFuZy5zdHJpbmcoYi5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKXx8XCJcIikudHJpbSgpfXZhciBrPWEuZG9tLGw9W1wiSDFcIixcIkgyXCIsXCJIM1wiLFwiSDRcIixcIkg1XCIsXCJINlwiLFwiUFwiLFwiUFJFXCIsXCJESVZcIl07YS5jb21tYW5kcy5mb3JtYXRCbG9jaz17ZXhlYzpmdW5jdGlvbihmLGcsbSxuLG8scCxxKXt2YXIgcixzLHQsdSx2LHc9KGYuZG9jLHRoaXMuc3RhdGUoZixnLG0sbixvLHAscSkpLHg9Zi5jb25maWcudXNlTGluZUJyZWFrcyx5PXg/XCJESVZcIjpcIlBcIjtyZXR1cm4gbT1cInN0cmluZ1wiPT10eXBlb2YgbT9tLnRvVXBwZXJDYXNlKCk6bSx3Lmxlbmd0aD8oZi5zZWxlY3Rpb24uZXhlY3V0ZUFuZFJlc3RvcmVSYW5neShmdW5jdGlvbigpe3ZhciBiLGMsZjtmb3IoYj13Lmxlbmd0aDtiLS07KXtpZihvJiYocz1kKHdbYl0sbykpLHEmJih1PWUod1tiXSxxKSksKHV8fHMpJiZudWxsPT09bSYmd1tiXS5ub2RlTmFtZSE9eSlyZXR1cm47Yz1pKHdbYl0pLGY9aih3W2JdKSxjfHxmfHwheCYmXCJQXCIhPT1tP2sucmVuYW1lRWxlbWVudCh3W2JdLFwiUFwiPT09bT9cIkRJVlwiOnkpOihhLmRvbS5saW5lQnJlYWtzKHdbYl0pLmFkZCgpLGsucmVwbGFjZVdpdGhDaGlsZE5vZGVzKHdbYl0pKX19KSx2b2lkIDApOigobnVsbCE9PW0mJiFhLmxhbmcuYXJyYXkobCkuY29udGFpbnMobSl8fChyPWYuc2VsZWN0aW9uLmZpbmROb2Rlc0luU2VsZWN0aW9uKGwpLmNvbmNhdChmLnNlbGVjdGlvbi5nZXRTZWxlY3RlZE93bk5vZGVzKCkpLGYuc2VsZWN0aW9uLmV4ZWN1dGVBbmRSZXN0b3JlUmFuZ3koZnVuY3Rpb24oKXtmb3IodmFyIGE9ci5sZW5ndGg7YS0tOyl2PWsuZ2V0UGFyZW50RWxlbWVudChyW2FdLHtub2RlTmFtZTpsfSksdj09Zi5lbGVtZW50JiYodj1udWxsKSx2JiYobSYmKHY9ay5yZW5hbWVFbGVtZW50KHYsbSkpLG4mJmIodixuLG8pLHAmJmModixwLHEpLHQ9ITApfSksIXQpKSYmaChmLHtub2RlTmFtZTptfHx5LGNsYXNzTmFtZTpufHxudWxsLGNzc1N0eWxlOnB8fG51bGx9KSx2b2lkIDApfSxzdGF0ZTpmdW5jdGlvbihiLGMsZCxlLGYsZyxoKXt2YXIgaSxqLGwsbT1iLnNlbGVjdGlvbi5nZXRTZWxlY3RlZE93bk5vZGVzKCksbj1bXTtmb3IoZD1cInN0cmluZ1wiPT10eXBlb2YgZD9kLnRvVXBwZXJDYXNlKCk6ZCxqPTAsbD1tLmxlbmd0aDtsPmo7aisrKWk9ay5nZXRQYXJlbnRFbGVtZW50KG1bal0se25vZGVOYW1lOmQsY2xhc3NOYW1lOmUsY2xhc3NSZWdFeHA6Zixjc3NTdHlsZTpnLHN0eWxlUmVnRXhwOmh9KSxpJiYtMT09YS5sYW5nLmFycmF5KG4pLmluZGV4T2YoaSkmJm4ucHVzaChpKTtyZXR1cm4gMD09bi5sZW5ndGg/ITE6bn19fSh3eXNpaHRtbDUpLHd5c2lodG1sNS5jb21tYW5kcy5mb3JtYXRDb2RlPXtleGVjOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZz10aGlzLnN0YXRlKGEpO2c/YS5zZWxlY3Rpb24uZXhlY3V0ZUFuZFJlc3RvcmUoZnVuY3Rpb24oKXtkPWcucXVlcnlTZWxlY3RvcihcImNvZGVcIiksd3lzaWh0bWw1LmRvbS5yZXBsYWNlV2l0aENoaWxkTm9kZXMoZyksZCYmd3lzaWh0bWw1LmRvbS5yZXBsYWNlV2l0aENoaWxkTm9kZXMoZCl9KTooZT1hLnNlbGVjdGlvbi5nZXRSYW5nZSgpLGY9ZS5leHRyYWN0Q29udGVudHMoKSxnPWEuZG9jLmNyZWF0ZUVsZW1lbnQoXCJwcmVcIiksZD1hLmRvYy5jcmVhdGVFbGVtZW50KFwiY29kZVwiKSxjJiYoZC5jbGFzc05hbWU9YyksZy5hcHBlbmRDaGlsZChkKSxkLmFwcGVuZENoaWxkKGYpLGUuaW5zZXJ0Tm9kZShnKSxhLnNlbGVjdGlvbi5zZWxlY3ROb2RlKGcpKX0sc3RhdGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5zZWxlY3Rpb24uZ2V0U2VsZWN0ZWROb2RlKCk7cmV0dXJuIGImJmIubm9kZU5hbWUmJlwiUFJFXCI9PWIubm9kZU5hbWUmJmIuZmlyc3RDaGlsZCYmYi5maXJzdENoaWxkLm5vZGVOYW1lJiZcIkNPREVcIj09Yi5maXJzdENoaWxkLm5vZGVOYW1lP2I6d3lzaWh0bWw1LmRvbS5nZXRQYXJlbnRFbGVtZW50KGIse25vZGVOYW1lOlwiQ09ERVwifSkmJnd5c2lodG1sNS5kb20uZ2V0UGFyZW50RWxlbWVudChiLHtub2RlTmFtZTpcIlBSRVwifSl9fSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBiPWRbYV07cmV0dXJuIGI/W2EudG9Mb3dlckNhc2UoKSxiLnRvTG93ZXJDYXNlKCldOlthLnRvTG93ZXJDYXNlKCldfWZ1bmN0aW9uIGMoYyxkLGYsZyxoLGkpe3ZhciBqPWM7cmV0dXJuIGQmJihqKz1cIjpcIitkKSxnJiYoais9XCI6XCIrZyksZVtqXXx8KGVbal09bmV3IGEuc2VsZWN0aW9uLkhUTUxBcHBsaWVyKGIoYyksZCxmLCEwLGcsaCxpKSksZVtqXX12YXIgZD17c3Ryb25nOlwiYlwiLGVtOlwiaVwiLGI6XCJzdHJvbmdcIixpOlwiZW1cIn0sZT17fTthLmNvbW1hbmRzLmZvcm1hdElubGluZT17ZXhlYzpmdW5jdGlvbihhLGIsZCxlLGYsZyxoLGksail7dmFyIGs9YS5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKSxsPWEuc2VsZWN0aW9uLmdldE93blJhbmdlcygpO3JldHVybiBsJiYwIT1sLmxlbmd0aD8oYS5zZWxlY3Rpb24uZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCksYyhkLGUsZixnLGgsYS5lbGVtZW50KS50b2dnbGVSYW5nZShsKSxpP2p8fGEuY2xlYW5VcCgpOihrLnNldFN0YXJ0KGxbMF0uc3RhcnRDb250YWluZXIsbFswXS5zdGFydE9mZnNldCksay5zZXRFbmQobFtsLmxlbmd0aC0xXS5lbmRDb250YWluZXIsbFtsLmxlbmd0aC0xXS5lbmRPZmZzZXQpLGEuc2VsZWN0aW9uLnNldFNlbGVjdGlvbihrKSxhLnNlbGVjdGlvbi5leGVjdXRlQW5kUmVzdG9yZShmdW5jdGlvbigpe2p8fGEuY2xlYW5VcCgpfSwhMCwhMCkpLHZvaWQgMCk6ITF9LGV4ZWNXaXRoVG9nZ2xlOmZ1bmN0aW9uKGIsYyxkLGUsZixnLGgpe3ZhciBpLGo9dGhpczt0aGlzLnN0YXRlKGIsYyxkLGUsZixnLGgpJiZiLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpJiYhYi5zZWxlY3Rpb24uY2FyZXRJc0xhc3RJblNlbGVjdGlvbigpJiYhYi5zZWxlY3Rpb24uY2FyZXRJc0ZpcnN0SW5TZWxlY3Rpb24oKT8oaT1qLnN0YXRlKGIsYyxkLGUsZilbMF0sYi5zZWxlY3Rpb24uZXhlY3V0ZUFuZFJlc3RvcmVSYW5neShmdW5jdGlvbigpe2kucGFyZW50Tm9kZTtiLnNlbGVjdGlvbi5zZWxlY3ROb2RlKGksITApLGEuY29tbWFuZHMuZm9ybWF0SW5saW5lLmV4ZWMoYixjLGQsZSxmLGcsaCwhMCwhMCl9KSk6dGhpcy5zdGF0ZShiLGMsZCxlLGYsZyxoKSYmIWIuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCk/Yi5zZWxlY3Rpb24uZXhlY3V0ZUFuZFJlc3RvcmVSYW5neShmdW5jdGlvbigpe2EuY29tbWFuZHMuZm9ybWF0SW5saW5lLmV4ZWMoYixjLGQsZSxmLGcsaCwhMCwhMCl9KTphLmNvbW1hbmRzLmZvcm1hdElubGluZS5leGVjKGIsYyxkLGUsZixnLGgpfSxzdGF0ZTpmdW5jdGlvbihiLGUsZixnLGgsaSxqKXt2YXIgayxsLG09Yi5kb2Msbj1kW2ZdfHxmO3JldHVybiBhLmRvbS5oYXNFbGVtZW50V2l0aFRhZ05hbWUobSxmKXx8YS5kb20uaGFzRWxlbWVudFdpdGhUYWdOYW1lKG0sbik/ZyYmIWEuZG9tLmhhc0VsZW1lbnRXaXRoQ2xhc3NOYW1lKG0sZyk/ITE6KGs9Yi5zZWxlY3Rpb24uZ2V0T3duUmFuZ2VzKCksayYmMCE9PWsubGVuZ3RoPyhsPWMoZixnLGgsaSxqLGIuZWxlbWVudCkuaXNBcHBsaWVkVG9SYW5nZShrKSxsJiZsLmVsZW1lbnRzP2wuZWxlbWVudHM6ITEpOiExKTohMX19fSh3eXNpaHRtbDUpLGZ1bmN0aW9uKGEpe2EuY29tbWFuZHMuaW5zZXJ0QmxvY2tRdW90ZT17ZXhlYzpmdW5jdGlvbihiLGMpe3ZhciBkPXRoaXMuc3RhdGUoYixjKSxlPWIuc2VsZWN0aW9uLmlzRW5kVG9FbmRJbk5vZGUoW1wiSDFcIixcIkgyXCIsXCJIM1wiLFwiSDRcIixcIkg1XCIsXCJINlwiLFwiUFwiXSk7Yi5zZWxlY3Rpb24uZXhlY3V0ZUFuZFJlc3RvcmUoZnVuY3Rpb24oKXtpZihkKWIuY29uZmlnLnVzZUxpbmVCcmVha3MmJmEuZG9tLmxpbmVCcmVha3MoZCkuYWRkKCksYS5kb20udW53cmFwKGQpO2Vsc2UgaWYoYi5zZWxlY3Rpb24uaXNDb2xsYXBzZWQoKSYmYi5zZWxlY3Rpb24uc2VsZWN0TGluZSgpLGUpe3ZhciBjPWUub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYmxvY2txdW90ZVwiKTthLmRvbS5pbnNlcnQoYykuYWZ0ZXIoZSksYy5hcHBlbmRDaGlsZChlKX1lbHNlIGIuc2VsZWN0aW9uLnN1cnJvdW5kKHtub2RlTmFtZTpcImJsb2NrcXVvdGVcIn0pfSl9LHN0YXRlOmZ1bmN0aW9uKGIpe3ZhciBjPWIuc2VsZWN0aW9uLmdldFNlbGVjdGVkTm9kZSgpLGQ9YS5kb20uZ2V0UGFyZW50RWxlbWVudChjLHtub2RlTmFtZTpcIkJMT0NLUVVPVEVcIn0sITEsYi5lbGVtZW50KTtyZXR1cm4gZD9kOiExfX19KHd5c2lodG1sNSksd3lzaWh0bWw1LmNvbW1hbmRzLmluc2VydEhUTUw9e2V4ZWM6ZnVuY3Rpb24oYSxiLGMpe2EuY29tbWFuZHMuc3VwcG9ydChiKT9hLmRvYy5leGVjQ29tbWFuZChiLCExLGMpOmEuc2VsZWN0aW9uLmluc2VydEhUTUwoYyl9LHN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuITF9fSxmdW5jdGlvbihhKXt2YXIgYj1cIklNR1wiO2EuY29tbWFuZHMuaW5zZXJ0SW1hZ2U9e2V4ZWM6ZnVuY3Rpb24oYyxkLGUpe3ZhciBmLGcsaCxpLGo7aWYoZT1cIm9iamVjdFwiPT10eXBlb2YgZT9lOntzcmM6ZX0sZj1jLmRvYyxnPXRoaXMuc3RhdGUoYyksZylyZXR1cm4gYy5zZWxlY3Rpb24uc2V0QmVmb3JlKGcpLGk9Zy5wYXJlbnROb2RlLGkucmVtb3ZlQ2hpbGQoZyksYS5kb20ucmVtb3ZlRW1wdHlUZXh0Tm9kZXMoaSksXCJBXCIhPT1pLm5vZGVOYW1lfHxpLmZpcnN0Q2hpbGR8fChjLnNlbGVjdGlvbi5zZXRBZnRlcihpKSxpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSkpLGEucXVpcmtzLnJlZHJhdyhjLmVsZW1lbnQpLHZvaWQgMDtnPWYuY3JlYXRlRWxlbWVudChiKTtmb3IoaiBpbiBlKWcuc2V0QXR0cmlidXRlKFwiY2xhc3NOYW1lXCI9PT1qP1wiY2xhc3NcIjpqLGVbal0pO2Muc2VsZWN0aW9uLmluc2VydE5vZGUoZyksYS5icm93c2VyLmhhc1Byb2JsZW1zU2V0dGluZ0NhcmV0QWZ0ZXJJbWcoKT8oaD1mLmNyZWF0ZVRleHROb2RlKGEuSU5WSVNJQkxFX1NQQUNFKSxjLnNlbGVjdGlvbi5pbnNlcnROb2RlKGgpLGMuc2VsZWN0aW9uLnNldEFmdGVyKGgpKTpjLnNlbGVjdGlvbi5zZXRBZnRlcihnKX0sc3RhdGU6ZnVuY3Rpb24oYyl7dmFyIGQsZSxmLGc9Yy5kb2M7cmV0dXJuIGEuZG9tLmhhc0VsZW1lbnRXaXRoVGFnTmFtZShnLGIpPyhkPWMuc2VsZWN0aW9uLmdldFNlbGVjdGVkTm9kZSgpLGQ/ZC5ub2RlTmFtZT09PWI/ZDpkLm5vZGVUeXBlIT09YS5FTEVNRU5UX05PREU/ITE6KGU9Yy5zZWxlY3Rpb24uZ2V0VGV4dCgpLGU9YS5sYW5nLnN0cmluZyhlKS50cmltKCksZT8hMTooZj1jLnNlbGVjdGlvbi5nZXROb2RlcyhhLkVMRU1FTlRfTk9ERSxmdW5jdGlvbihhKXtyZXR1cm5cIklNR1wiPT09YS5ub2RlTmFtZX0pLDEhPT1mLmxlbmd0aD8hMTpmWzBdKSk6ITEpOiExfX19KHd5c2lodG1sNSksZnVuY3Rpb24oYSl7dmFyIGI9XCI8YnI+XCIrKGEuYnJvd3Nlci5uZWVkc1NwYWNlQWZ0ZXJMaW5lQnJlYWsoKT9cIiBcIjpcIlwiKTthLmNvbW1hbmRzLmluc2VydExpbmVCcmVhaz17ZXhlYzpmdW5jdGlvbihjLGQpe2MuY29tbWFuZHMuc3VwcG9ydChkKT8oYy5kb2MuZXhlY0NvbW1hbmQoZCwhMSxudWxsKSxhLmJyb3dzZXIuYXV0b1Njcm9sbHNUb0NhcmV0KCl8fGMuc2VsZWN0aW9uLnNjcm9sbEludG9WaWV3KCkpOmMuY29tbWFuZHMuZXhlYyhcImluc2VydEhUTUxcIixiKX0sc3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4hMX19fSh3eXNpaHRtbDUpLHd5c2lodG1sNS5jb21tYW5kcy5pbnNlcnRPcmRlcmVkTGlzdD17ZXhlYzpmdW5jdGlvbihhLGIpe3d5c2lodG1sNS5jb21tYW5kcy5pbnNlcnRMaXN0LmV4ZWMoYSxiLFwiT0xcIil9LHN0YXRlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHd5c2lodG1sNS5jb21tYW5kcy5pbnNlcnRMaXN0LnN0YXRlKGEsYixcIk9MXCIpfX0sd3lzaWh0bWw1LmNvbW1hbmRzLmluc2VydFVub3JkZXJlZExpc3Q9e2V4ZWM6ZnVuY3Rpb24oYSxiKXt3eXNpaHRtbDUuY29tbWFuZHMuaW5zZXJ0TGlzdC5leGVjKGEsYixcIlVMXCIpfSxzdGF0ZTpmdW5jdGlvbihhLGIpe3JldHVybiB3eXNpaHRtbDUuY29tbWFuZHMuaW5zZXJ0TGlzdC5zdGF0ZShhLGIsXCJVTFwiKX19LHd5c2lodG1sNS5jb21tYW5kcy5pbnNlcnRMaXN0PWZ1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uKGEsYil7aWYoYSYmYS5ub2RlTmFtZSl7XCJzdHJpbmdcIj09dHlwZW9mIGImJihiPVtiXSk7Zm9yKHZhciBjPWIubGVuZ3RoO2MtLTspaWYoYS5ub2RlTmFtZT09PWJbY10pcmV0dXJuITB9cmV0dXJuITF9LGM9ZnVuY3Rpb24oYyxkLGUpe3ZhciBmLGcsaD17ZWw6bnVsbCxvdGhlcjohMX07cmV0dXJuIGMmJihmPWEuZG9tLmdldFBhcmVudEVsZW1lbnQoYyx7bm9kZU5hbWU6XCJMSVwifSksZz1cIlVMXCI9PT1kP1wiT0xcIjpcIlVMXCIsYihjLGQpP2guZWw9YzpiKGMsZyk/aD17ZWw6YyxvdGhlcjohMH06ZiYmKGIoZi5wYXJlbnROb2RlLGQpP2guZWw9Zi5wYXJlbnROb2RlOmIoZi5wYXJlbnROb2RlLGcpJiYoaD17ZWw6Zi5wYXJlbnROb2RlLG90aGVyOiEwfSkpKSxoLmVsJiYhZS5lbGVtZW50LmNvbnRhaW5zKGguZWwpJiYoaC5lbD1udWxsKSxofSxkPWZ1bmN0aW9uKGIsYyxkKXt2YXIgZSxnPVwiVUxcIj09PWM/XCJPTFwiOlwiVUxcIjtkLnNlbGVjdGlvbi5leGVjdXRlQW5kUmVzdG9yZShmdW5jdGlvbigpe3ZhciBoLGksaj1mKGcsZCk7aWYoai5sZW5ndGgpZm9yKGg9ai5sZW5ndGg7aC0tOylhLmRvbS5yZW5hbWVFbGVtZW50KGpbaF0sYy50b0xvd2VyQ2FzZSgpKTtlbHNle2ZvcihlPWYoW1wiT0xcIixcIlVMXCJdLGQpLGk9ZS5sZW5ndGg7aS0tOylhLmRvbS5yZXNvbHZlTGlzdChlW2ldLGQuY29uZmlnLnVzZUxpbmVCcmVha3MpO2EuZG9tLnJlc29sdmVMaXN0KGIsZC5jb25maWcudXNlTGluZUJyZWFrcyl9fSl9LGU9ZnVuY3Rpb24oYixjLGQpe3ZhciBlPVwiVUxcIj09PWM/XCJPTFwiOlwiVUxcIjtkLnNlbGVjdGlvbi5leGVjdXRlQW5kUmVzdG9yZShmdW5jdGlvbigpe3ZhciBnLGg9W2JdLmNvbmNhdChmKGUsZCkpO2ZvcihnPWgubGVuZ3RoO2ctLTspYS5kb20ucmVuYW1lRWxlbWVudChoW2ddLGMudG9Mb3dlckNhc2UoKSl9KX0sZj1mdW5jdGlvbihhLGMpe3ZhciBkLGU9Yy5zZWxlY3Rpb24uZ2V0T3duUmFuZ2VzKCksZj1bXTtmb3IoZD1lLmxlbmd0aDtkLS07KWY9Zi5jb25jYXQoZVtkXS5nZXROb2RlcyhbMV0sZnVuY3Rpb24oYyl7cmV0dXJuIGIoYyxhKX0pKTtyZXR1cm4gZn0sZz1mdW5jdGlvbihiLGMpe2Muc2VsZWN0aW9uLmV4ZWN1dGVBbmRSZXN0b3JlUmFuZ3koZnVuY3Rpb24oKXt2YXIgZCxlLGY9XCJfd3lzaWh0bWw1LXRlbXAtXCIrKG5ldyBEYXRlKS5nZXRUaW1lKCksZz1jLnNlbGVjdGlvbi5kZWJsb2NrQW5kU3Vycm91bmQoe25vZGVOYW1lOlwiZGl2XCIsY2xhc3NOYW1lOmZ9KSxoPS9cXHVGRUZGL2c7Zy5pbm5lckhUTUw9Zy5pbm5lckhUTUwucmVwbGFjZShoLFwiXCIpLGcmJihkPWEubGFuZy5hcnJheShbXCJcIixcIjxicj5cIixhLklOVklTSUJMRV9TUEFDRV0pLmNvbnRhaW5zKGcuaW5uZXJIVE1MKSxlPWEuZG9tLmNvbnZlcnRUb0xpc3QoZyxiLnRvTG93ZXJDYXNlKCksYy5wYXJlbnQuY29uZmlnLnVuZWRpdGFibGVDb250YWluZXJDbGFzc25hbWUpLGQmJmMuc2VsZWN0aW9uLnNlbGVjdE5vZGUoZS5xdWVyeVNlbGVjdG9yKFwibGlcIiksITApKX0pfTtyZXR1cm57ZXhlYzpmdW5jdGlvbihhLGIsZil7dmFyIGg9YS5kb2MsaT1cIk9MXCI9PT1mP1wiaW5zZXJ0T3JkZXJlZExpc3RcIjpcImluc2VydFVub3JkZXJlZExpc3RcIixqPWEuc2VsZWN0aW9uLmdldFNlbGVjdGVkTm9kZSgpLGs9YyhqLGYsYSk7ay5lbD9rLm90aGVyP2Uoay5lbCxmLGEpOmQoay5lbCxmLGEpOmEuY29tbWFuZHMuc3VwcG9ydChpKT9oLmV4ZWNDb21tYW5kKGksITEsbnVsbCk6ZyhmLGEpfSxzdGF0ZTpmdW5jdGlvbihhLGIsZCl7dmFyIGU9YS5zZWxlY3Rpb24uZ2V0U2VsZWN0ZWROb2RlKCksZj1jKGUsZCxhKTtyZXR1cm4gZi5lbCYmIWYub3RoZXI/Zi5lbDohMX19fSh3eXNpaHRtbDUpLHd5c2lodG1sNS5jb21tYW5kcy5pdGFsaWM9e2V4ZWM6ZnVuY3Rpb24oYSxiKXt3eXNpaHRtbDUuY29tbWFuZHMuZm9ybWF0SW5saW5lLmV4ZWNXaXRoVG9nZ2xlKGEsYixcImlcIil9LHN0YXRlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHd5c2lodG1sNS5jb21tYW5kcy5mb3JtYXRJbmxpbmUuc3RhdGUoYSxiLFwiaVwiKX19LGZ1bmN0aW9uKGEpe3ZhciBiPVwid3lzaXd5Zy10ZXh0LWFsaWduLWNlbnRlclwiLGM9L3d5c2l3eWctdGV4dC1hbGlnbi1bMC05YS16XSsvZzthLmNvbW1hbmRzLmp1c3RpZnlDZW50ZXI9e2V4ZWM6ZnVuY3Rpb24oZCl7cmV0dXJuIGEuY29tbWFuZHMuZm9ybWF0QmxvY2suZXhlYyhkLFwiZm9ybWF0QmxvY2tcIixudWxsLGIsYyl9LHN0YXRlOmZ1bmN0aW9uKGQpe3JldHVybiBhLmNvbW1hbmRzLmZvcm1hdEJsb2NrLnN0YXRlKGQsXCJmb3JtYXRCbG9ja1wiLG51bGwsYixjKX19fSh3eXNpaHRtbDUpLGZ1bmN0aW9uKGEpe3ZhciBiPVwid3lzaXd5Zy10ZXh0LWFsaWduLWxlZnRcIixjPS93eXNpd3lnLXRleHQtYWxpZ24tWzAtOWEtel0rL2c7YS5jb21tYW5kcy5qdXN0aWZ5TGVmdD17ZXhlYzpmdW5jdGlvbihkKXtyZXR1cm4gYS5jb21tYW5kcy5mb3JtYXRCbG9jay5leGVjKGQsXCJmb3JtYXRCbG9ja1wiLG51bGwsYixjKX0sc3RhdGU6ZnVuY3Rpb24oZCl7cmV0dXJuIGEuY29tbWFuZHMuZm9ybWF0QmxvY2suc3RhdGUoZCxcImZvcm1hdEJsb2NrXCIsbnVsbCxiLGMpfX19KHd5c2lodG1sNSksZnVuY3Rpb24oYSl7dmFyIGI9XCJ3eXNpd3lnLXRleHQtYWxpZ24tcmlnaHRcIixjPS93eXNpd3lnLXRleHQtYWxpZ24tWzAtOWEtel0rL2c7YS5jb21tYW5kcy5qdXN0aWZ5UmlnaHQ9e2V4ZWM6ZnVuY3Rpb24oZCl7cmV0dXJuIGEuY29tbWFuZHMuZm9ybWF0QmxvY2suZXhlYyhkLFwiZm9ybWF0QmxvY2tcIixudWxsLGIsYyl9LHN0YXRlOmZ1bmN0aW9uKGQpe3JldHVybiBhLmNvbW1hbmRzLmZvcm1hdEJsb2NrLnN0YXRlKGQsXCJmb3JtYXRCbG9ja1wiLG51bGwsYixjKX19fSh3eXNpaHRtbDUpLGZ1bmN0aW9uKGEpe3ZhciBiPVwid3lzaXd5Zy10ZXh0LWFsaWduLWp1c3RpZnlcIixjPS93eXNpd3lnLXRleHQtYWxpZ24tWzAtOWEtel0rL2c7YS5jb21tYW5kcy5qdXN0aWZ5RnVsbD17ZXhlYzpmdW5jdGlvbihkKXtyZXR1cm4gYS5jb21tYW5kcy5mb3JtYXRCbG9jay5leGVjKGQsXCJmb3JtYXRCbG9ja1wiLG51bGwsYixjKX0sc3RhdGU6ZnVuY3Rpb24oZCl7cmV0dXJuIGEuY29tbWFuZHMuZm9ybWF0QmxvY2suc3RhdGUoZCxcImZvcm1hdEJsb2NrXCIsbnVsbCxiLGMpfX19KHd5c2lodG1sNSksZnVuY3Rpb24oYSl7dmFyIGI9XCJ0ZXh0LWFsaWduOiByaWdodDtcIixjPS8oXFxzfF4pdGV4dC1hbGlnblxccyo6XFxzKlteO1xcc10rOz8vZ2k7YS5jb21tYW5kcy5hbGlnblJpZ2h0U3R5bGU9e2V4ZWM6ZnVuY3Rpb24oZCl7cmV0dXJuIGEuY29tbWFuZHMuZm9ybWF0QmxvY2suZXhlYyhkLFwiZm9ybWF0QmxvY2tcIixudWxsLG51bGwsbnVsbCxiLGMpfSxzdGF0ZTpmdW5jdGlvbihkKXtyZXR1cm4gYS5jb21tYW5kcy5mb3JtYXRCbG9jay5zdGF0ZShkLFwiZm9ybWF0QmxvY2tcIixudWxsLG51bGwsbnVsbCxiLGMpfX19KHd5c2lodG1sNSksZnVuY3Rpb24oYSl7dmFyIGI9XCJ0ZXh0LWFsaWduOiBsZWZ0O1wiLGM9LyhcXHN8Xil0ZXh0LWFsaWduXFxzKjpcXHMqW147XFxzXSs7Py9naTthLmNvbW1hbmRzLmFsaWduTGVmdFN0eWxlPXtleGVjOmZ1bmN0aW9uKGQpe3JldHVybiBhLmNvbW1hbmRzLmZvcm1hdEJsb2NrLmV4ZWMoZCxcImZvcm1hdEJsb2NrXCIsbnVsbCxudWxsLG51bGwsYixjKX0sc3RhdGU6ZnVuY3Rpb24oZCl7cmV0dXJuIGEuY29tbWFuZHMuZm9ybWF0QmxvY2suc3RhdGUoZCxcImZvcm1hdEJsb2NrXCIsbnVsbCxudWxsLG51bGwsYixjKX19fSh3eXNpaHRtbDUpLGZ1bmN0aW9uKGEpe3ZhciBiPVwidGV4dC1hbGlnbjogY2VudGVyO1wiLGM9LyhcXHN8Xil0ZXh0LWFsaWduXFxzKjpcXHMqW147XFxzXSs7Py9naTthLmNvbW1hbmRzLmFsaWduQ2VudGVyU3R5bGU9e2V4ZWM6ZnVuY3Rpb24oZCl7cmV0dXJuIGEuY29tbWFuZHMuZm9ybWF0QmxvY2suZXhlYyhkLFwiZm9ybWF0QmxvY2tcIixudWxsLG51bGwsbnVsbCxiLGMpfSxzdGF0ZTpmdW5jdGlvbihkKXtyZXR1cm4gYS5jb21tYW5kcy5mb3JtYXRCbG9jay5zdGF0ZShkLFwiZm9ybWF0QmxvY2tcIixudWxsLG51bGwsbnVsbCxiLGMpfX19KHd5c2lodG1sNSksd3lzaWh0bWw1LmNvbW1hbmRzLnJlZG89e2V4ZWM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudW5kb01hbmFnZXIucmVkbygpfSxzdGF0ZTpmdW5jdGlvbigpe3JldHVybiExfX0sd3lzaWh0bWw1LmNvbW1hbmRzLnVuZGVybGluZT17ZXhlYzpmdW5jdGlvbihhLGIpe3d5c2lodG1sNS5jb21tYW5kcy5mb3JtYXRJbmxpbmUuZXhlY1dpdGhUb2dnbGUoYSxiLFwidVwiKX0sc3RhdGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gd3lzaWh0bWw1LmNvbW1hbmRzLmZvcm1hdElubGluZS5zdGF0ZShhLGIsXCJ1XCIpfX0sd3lzaWh0bWw1LmNvbW1hbmRzLnVuZG89e2V4ZWM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudW5kb01hbmFnZXIudW5kbygpfSxzdGF0ZTpmdW5jdGlvbigpe3JldHVybiExfX0sd3lzaWh0bWw1LmNvbW1hbmRzLmNyZWF0ZVRhYmxlPXtleGVjOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY7aWYoYyYmYy5jb2xzJiZjLnJvd3MmJnBhcnNlSW50KGMuY29scywxMCk+MCYmcGFyc2VJbnQoYy5yb3dzLDEwKT4wKXtmb3IoZj1jLnRhYmxlU3R5bGU/Jzx0YWJsZSBzdHlsZT1cIicrYy50YWJsZVN0eWxlKydcIj4nOlwiPHRhYmxlPlwiLGYrPVwiPHRib2R5PlwiLGU9MDtlPGMucm93cztlKyspe2ZvcihmKz1cIjx0cj5cIixkPTA7ZDxjLmNvbHM7ZCsrKWYrPVwiPHRkPiZuYnNwOzwvdGQ+XCI7Zis9XCI8L3RyPlwifWYrPVwiPC90Ym9keT48L3RhYmxlPlwiLGEuY29tbWFuZHMuZXhlYyhcImluc2VydEhUTUxcIixmKX19LHN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuITF9fSx3eXNpaHRtbDUuY29tbWFuZHMubWVyZ2VUYWJsZUNlbGxzPXtleGVjOmZ1bmN0aW9uKGEsYil7YS50YWJsZVNlbGVjdGlvbiYmYS50YWJsZVNlbGVjdGlvbi5zdGFydCYmYS50YWJsZVNlbGVjdGlvbi5lbmQmJih0aGlzLnN0YXRlKGEsYik/d3lzaWh0bWw1LmRvbS50YWJsZS51bm1lcmdlQ2VsbChhLnRhYmxlU2VsZWN0aW9uLnN0YXJ0KTp3eXNpaHRtbDUuZG9tLnRhYmxlLm1lcmdlQ2VsbHNCZXR3ZWVuKGEudGFibGVTZWxlY3Rpb24uc3RhcnQsYS50YWJsZVNlbGVjdGlvbi5lbmQpKX0sc3RhdGU6ZnVuY3Rpb24oYSl7aWYoYS50YWJsZVNlbGVjdGlvbil7dmFyIGI9YS50YWJsZVNlbGVjdGlvbi5zdGFydCxjPWEudGFibGVTZWxlY3Rpb24uZW5kO2lmKGImJmMmJmI9PWMmJih3eXNpaHRtbDUuZG9tLmdldEF0dHJpYnV0ZShiLFwiY29sc3BhblwiKSYmcGFyc2VJbnQod3lzaWh0bWw1LmRvbS5nZXRBdHRyaWJ1dGUoYixcImNvbHNwYW5cIiksMTApPjF8fHd5c2lodG1sNS5kb20uZ2V0QXR0cmlidXRlKGIsXCJyb3dzcGFuXCIpJiZwYXJzZUludCh3eXNpaHRtbDUuZG9tLmdldEF0dHJpYnV0ZShiLFwicm93c3BhblwiKSwxMCk+MSkpcmV0dXJuW2JdfXJldHVybiExfX0sd3lzaWh0bWw1LmNvbW1hbmRzLmFkZFRhYmxlQ2VsbHM9e2V4ZWM6ZnVuY3Rpb24oYSxiLGMpe2lmKGEudGFibGVTZWxlY3Rpb24mJmEudGFibGVTZWxlY3Rpb24uc3RhcnQmJmEudGFibGVTZWxlY3Rpb24uZW5kKXt2YXIgZD13eXNpaHRtbDUuZG9tLnRhYmxlLm9yZGVyU2VsZWN0aW9uRW5kcyhhLnRhYmxlU2VsZWN0aW9uLnN0YXJ0LGEudGFibGVTZWxlY3Rpb24uZW5kKTtcImJlZm9yZVwiPT1jfHxcImFib3ZlXCI9PWM/d3lzaWh0bWw1LmRvbS50YWJsZS5hZGRDZWxscyhkLnN0YXJ0LGMpOihcImFmdGVyXCI9PWN8fFwiYmVsb3dcIj09YykmJnd5c2lodG1sNS5kb20udGFibGUuYWRkQ2VsbHMoZC5lbmQsYyksc2V0VGltZW91dChmdW5jdGlvbigpe2EudGFibGVTZWxlY3Rpb24uc2VsZWN0KGQuc3RhcnQsZC5lbmQpfSwwKX19LHN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuITF9fSx3eXNpaHRtbDUuY29tbWFuZHMuZGVsZXRlVGFibGVDZWxscz17ZXhlYzpmdW5jdGlvbihhLGIsYyl7aWYoYS50YWJsZVNlbGVjdGlvbiYmYS50YWJsZVNlbGVjdGlvbi5zdGFydCYmYS50YWJsZVNlbGVjdGlvbi5lbmQpe3ZhciBkLGU9d3lzaWh0bWw1LmRvbS50YWJsZS5vcmRlclNlbGVjdGlvbkVuZHMoYS50YWJsZVNlbGVjdGlvbi5zdGFydCxhLnRhYmxlU2VsZWN0aW9uLmVuZCksZj13eXNpaHRtbDUuZG9tLnRhYmxlLmluZGV4T2YoZS5zdGFydCksZz1hLnRhYmxlU2VsZWN0aW9uLnRhYmxlO3d5c2lodG1sNS5kb20udGFibGUucmVtb3ZlQ2VsbHMoZS5zdGFydCxjKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZD13eXNpaHRtbDUuZG9tLnRhYmxlLmZpbmRDZWxsKGcsZiksZHx8KFwicm93XCI9PWMmJihkPXd5c2lodG1sNS5kb20udGFibGUuZmluZENlbGwoZyx7cm93OmYucm93LTEsY29sOmYuY29sfSkpLFwiY29sdW1uXCI9PWMmJihkPXd5c2lodG1sNS5kb20udGFibGUuZmluZENlbGwoZyx7cm93OmYucm93LGNvbDpmLmNvbC0xfSkpKSxkJiZhLnRhYmxlU2VsZWN0aW9uLnNlbGVjdChkLGQpfSwwKX19LHN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuITF9fSx3eXNpaHRtbDUuY29tbWFuZHMuaW5kZW50TGlzdD17ZXhlYzpmdW5jdGlvbihhKXt2YXIgYj1hLnNlbGVjdGlvbi5nZXRTZWxlY3Rpb25QYXJlbnRzQnlUYWcoXCJMSVwiKTtyZXR1cm4gYj90aGlzLnRyeVRvUHVzaExpTGV2ZWwoYixhLnNlbGVjdGlvbik6ITF9LHN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHRyeVRvUHVzaExpTGV2ZWw6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnLGg9ITE7cmV0dXJuIGIuZXhlY3V0ZUFuZFJlc3RvcmVSYW5neShmdW5jdGlvbigpe2Zvcih2YXIgYj1hLmxlbmd0aDtiLS07KWY9YVtiXSxjPVwiT0xcIj09PWYucGFyZW50Tm9kZS5ub2RlTmFtZT9cIk9MXCI6XCJVTFwiLGQ9Zi5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYyksZT13eXNpaHRtbDUuZG9tLmRvbU5vZGUoZikucHJldih7bm9kZVR5cGVzOlt3eXNpaHRtbDUuRUxFTUVOVF9OT0RFXX0pLGc9ZT9lLnF1ZXJ5U2VsZWN0b3IoXCJ1bCwgb2xcIik6bnVsbCxlJiYoZz9nLmFwcGVuZENoaWxkKGYpOihkLmFwcGVuZENoaWxkKGYpLGUuYXBwZW5kQ2hpbGQoZCkpLGg9ITApfSksaH19LHd5c2lodG1sNS5jb21tYW5kcy5vdXRkZW50TGlzdD17ZXhlYzpmdW5jdGlvbihhKXt2YXIgYj1hLnNlbGVjdGlvbi5nZXRTZWxlY3Rpb25QYXJlbnRzQnlUYWcoXCJMSVwiKTtyZXR1cm4gYj90aGlzLnRyeVRvUHVsbExpTGV2ZWwoYixhKTohMX0sc3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdHJ5VG9QdWxsTGlMZXZlbDpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGcsaD0hMSxpPXRoaXM7cmV0dXJuIGIuc2VsZWN0aW9uLmV4ZWN1dGVBbmRSZXN0b3JlUmFuZ3koZnVuY3Rpb24oKXt2YXIgaixrO2ZvcihqPWEubGVuZ3RoO2otLTspaWYoZj1hW2pdLGYucGFyZW50Tm9kZSYmKGM9Zi5wYXJlbnROb2RlLFwiT0xcIj09PWMudGFnTmFtZXx8XCJVTFwiPT09Yy50YWdOYW1lKSl7aWYoaD0hMCxkPXd5c2lodG1sNS5kb20uZ2V0UGFyZW50RWxlbWVudChjLnBhcmVudE5vZGUse25vZGVOYW1lOltcIk9MXCIsXCJVTFwiXX0sITEsYi5lbGVtZW50KSxlPXd5c2lodG1sNS5kb20uZ2V0UGFyZW50RWxlbWVudChjLnBhcmVudE5vZGUse25vZGVOYW1lOltcIkxJXCJdfSwhMSxiLmVsZW1lbnQpLGQmJmUpZi5uZXh0U2libGluZyYmKGc9aS5nZXRBZnRlckxpc3QoYyxmKSxmLmFwcGVuZENoaWxkKGcpKSxkLmluc2VydEJlZm9yZShmLGUubmV4dFNpYmxpbmcpO2Vsc2V7Zm9yKGYubmV4dFNpYmxpbmcmJihnPWkuZ2V0QWZ0ZXJMaXN0KGMsZiksZi5hcHBlbmRDaGlsZChnKSksaz1mLmNoaWxkTm9kZXMubGVuZ3RoO2stLTspYy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmLmNoaWxkTm9kZXNba10sYy5uZXh0U2libGluZyk7Yy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIiksYy5uZXh0U2libGluZyksZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfTA9PT1jLmNoaWxkTm9kZXMubGVuZ3RoJiZjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9fSksaH0sZ2V0QWZ0ZXJMaXN0OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubm9kZU5hbWUsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGMpO2IubmV4dFNpYmxpbmc7KWQuYXBwZW5kQ2hpbGQoYi5uZXh0U2libGluZyk7cmV0dXJuIGR9fSxmdW5jdGlvbihhKXt2YXIgYj05MCxjPTg5LGQ9OCxlPTQ2LGY9MjUsZz1cImRhdGEtd3lzaWh0bWw1LXNlbGVjdGlvbi1ub2RlXCIsaD1cImRhdGEtd3lzaWh0bWw1LXNlbGVjdGlvbi1vZmZzZXRcIixpPSgnPHNwYW4gaWQ9XCJfd3lzaWh0bWw1LXVuZG9cIiBjbGFzcz1cIl93eXNpaHRtbDUtdGVtcFwiPicrYS5JTlZJU0lCTEVfU1BBQ0UrXCI8L3NwYW4+XCIsJzxzcGFuIGlkPVwiX3d5c2lodG1sNS1yZWRvXCIgY2xhc3M9XCJfd3lzaWh0bWw1LXRlbXBcIj4nK2EuSU5WSVNJQkxFX1NQQUNFK1wiPC9zcGFuPlwiLGEuZG9tKTthLlVuZG9NYW5hZ2VyPWEubGFuZy5EaXNwYXRjaGVyLmV4dGVuZCh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5lZGl0b3I9YSx0aGlzLmNvbXBvc2VyPWEuY29tcG9zZXIsdGhpcy5lbGVtZW50PXRoaXMuY29tcG9zZXIuZWxlbWVudCx0aGlzLnBvc2l0aW9uPTAsdGhpcy5oaXN0b3J5U3RyPVtdLHRoaXMuaGlzdG9yeURvbT1bXSx0aGlzLnRyYW5zYWN0KCksdGhpcy5fb2JzZXJ2ZSgpfSxfb2JzZXJ2ZTpmdW5jdGlvbigpe3t2YXIgYSxmPXRoaXM7dGhpcy5jb21wb3Nlci5zYW5kYm94LmdldERvY3VtZW50KCl9aS5vYnNlcnZlKHRoaXMuZWxlbWVudCxcImtleWRvd25cIixmdW5jdGlvbihhKXtpZighYS5hbHRLZXkmJihhLmN0cmxLZXl8fGEubWV0YUtleSkpe3ZhciBkPWEua2V5Q29kZSxlPWQ9PT1iJiYhYS5zaGlmdEtleSxnPWQ9PT1iJiZhLnNoaWZ0S2V5fHxkPT09YztlPyhmLnVuZG8oKSxhLnByZXZlbnREZWZhdWx0KCkpOmcmJihmLnJlZG8oKSxhLnByZXZlbnREZWZhdWx0KCkpfX0pLGkub2JzZXJ2ZSh0aGlzLmVsZW1lbnQsXCJrZXlkb3duXCIsZnVuY3Rpb24oYil7dmFyIGM9Yi5rZXlDb2RlO2MhPT1hJiYoYT1jLChjPT09ZHx8Yz09PWUpJiZmLnRyYW5zYWN0KCkpfSksdGhpcy5lZGl0b3Iub24oXCJuZXd3b3JkOmNvbXBvc2VyXCIsZnVuY3Rpb24oKXtmLnRyYW5zYWN0KCl9KS5vbihcImJlZm9yZWNvbW1hbmQ6Y29tcG9zZXJcIixmdW5jdGlvbigpe2YudHJhbnNhY3QoKX0pfSx0cmFuc2FjdDpmdW5jdGlvbigpe3ZhciBiLGMsZCxlLGksaixrLGw9dGhpcy5oaXN0b3J5U3RyW3RoaXMucG9zaXRpb24tMV0sbT10aGlzLmNvbXBvc2VyLmdldFZhbHVlKCExLCExKSxuPXRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aD4wJiZ0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0PjA7bSE9PWwmJihqPXRoaXMuaGlzdG9yeVN0ci5sZW5ndGg9dGhpcy5oaXN0b3J5RG9tLmxlbmd0aD10aGlzLnBvc2l0aW9uLGo+ZiYmKHRoaXMuaGlzdG9yeVN0ci5zaGlmdCgpLHRoaXMuaGlzdG9yeURvbS5zaGlmdCgpLHRoaXMucG9zaXRpb24tLSksdGhpcy5wb3NpdGlvbisrLG4mJihiPXRoaXMuY29tcG9zZXIuc2VsZWN0aW9uLmdldFJhbmdlKCksYz1iJiZiLnN0YXJ0Q29udGFpbmVyP2Iuc3RhcnRDb250YWluZXI6dGhpcy5lbGVtZW50LGQ9YiYmYi5zdGFydE9mZnNldD9iLnN0YXJ0T2Zmc2V0OjAsYy5ub2RlVHlwZT09PWEuRUxFTUVOVF9OT0RFP2U9YzooZT1jLnBhcmVudE5vZGUsaT10aGlzLmdldENoaWxkTm9kZUluZGV4KGUsYykpLGUuc2V0QXR0cmlidXRlKGgsZCksdm9pZCAwIT09aSYmZS5zZXRBdHRyaWJ1dGUoZyxpKSksaz10aGlzLmVsZW1lbnQuY2xvbmVOb2RlKCEhbSksdGhpcy5oaXN0b3J5RG9tLnB1c2goayksdGhpcy5oaXN0b3J5U3RyLnB1c2gobSksZSYmKGUucmVtb3ZlQXR0cmlidXRlKGgpLGUucmVtb3ZlQXR0cmlidXRlKGcpKSl9LHVuZG86ZnVuY3Rpb24oKXt0aGlzLnRyYW5zYWN0KCksdGhpcy51bmRvUG9zc2libGUoKSYmKHRoaXMuc2V0KHRoaXMuaGlzdG9yeURvbVstLXRoaXMucG9zaXRpb24tMV0pLHRoaXMuZWRpdG9yLmZpcmUoXCJ1bmRvOmNvbXBvc2VyXCIpKX0scmVkbzpmdW5jdGlvbigpe3RoaXMucmVkb1Bvc3NpYmxlKCkmJih0aGlzLnNldCh0aGlzLmhpc3RvcnlEb21bKyt0aGlzLnBvc2l0aW9uLTFdKSx0aGlzLmVkaXRvci5maXJlKFwicmVkbzpjb21wb3NlclwiKSl9LHVuZG9Qb3NzaWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uPjF9LHJlZG9Qb3NzaWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uPHRoaXMuaGlzdG9yeVN0ci5sZW5ndGh9LHNldDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGk7Zm9yKHRoaXMuZWxlbWVudC5pbm5lckhUTUw9XCJcIixiPTAsYz1hLmNoaWxkTm9kZXMsZD1hLmNoaWxkTm9kZXMubGVuZ3RoO2Q+YjtiKyspdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGNbYl0uY2xvbmVOb2RlKCEwKSk7YS5oYXNBdHRyaWJ1dGUoaCk/KGU9YS5nZXRBdHRyaWJ1dGUoaCksaT1hLmdldEF0dHJpYnV0ZShnKSxmPXRoaXMuZWxlbWVudCk6KGY9dGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJbXCIraCtcIl1cIil8fHRoaXMuZWxlbWVudCxlPWYuZ2V0QXR0cmlidXRlKGgpLGk9Zi5nZXRBdHRyaWJ1dGUoZyksZi5yZW1vdmVBdHRyaWJ1dGUoaCksZi5yZW1vdmVBdHRyaWJ1dGUoZykpLG51bGwhPT1pJiYoZj10aGlzLmdldENoaWxkTm9kZUJ5SW5kZXgoZiwraSkpLHRoaXMuY29tcG9zZXIuc2VsZWN0aW9uLnNldChmLGUpfSxnZXRDaGlsZE5vZGVJbmRleDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ9YS5jaGlsZE5vZGVzLGU9ZC5sZW5ndGg7ZT5jO2MrKylpZihkW2NdPT09YilyZXR1cm4gY30sZ2V0Q2hpbGROb2RlQnlJbmRleDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmNoaWxkTm9kZXNbYl19fSl9KHd5c2lodG1sNSksd3lzaWh0bWw1LnZpZXdzLlZpZXc9QmFzZS5leHRlbmQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYixjKXt0aGlzLnBhcmVudD1hLHRoaXMuZWxlbWVudD1iLHRoaXMuY29uZmlnPWMsdGhpcy5jb25maWcubm9UZXh0YXJlYXx8dGhpcy5fb2JzZXJ2ZVZpZXdDaGFuZ2UoKX0sX29ic2VydmVWaWV3Q2hhbmdlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLnBhcmVudC5vbihcImJlZm9yZWxvYWRcIixmdW5jdGlvbigpe2EucGFyZW50Lm9uKFwiY2hhbmdlX3ZpZXdcIixmdW5jdGlvbihiKXtiPT09YS5uYW1lPyhhLnBhcmVudC5jdXJyZW50Vmlldz1hLGEuc2hvdygpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmZvY3VzKCl9LDApKTphLmhpZGUoKX0pfSl9LGZvY3VzOmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIjpmb2N1c1wiKSE9PXRoaXMuZWxlbWVudCl0cnl7dGhpcy5lbGVtZW50LmZvY3VzKCl9Y2F0Y2goYSl7fX0saGlkZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5PVwibm9uZVwifSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXk9XCJcIn0sZGlzYWJsZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLFwiZGlzYWJsZWRcIil9LGVuYWJsZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKX19KSxmdW5jdGlvbihhKXt2YXIgYj1hLmRvbSxjPWEuYnJvd3NlcjthLnZpZXdzLkNvbXBvc2VyPWEudmlld3MuVmlldy5leHRlbmQoe25hbWU6XCJjb21wb3NlclwiLENBUkVUX0hBQ0s6XCI8YnI+XCIsY29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmFzZShhLGIsYyksdGhpcy5jb25maWcubm9UZXh0YXJlYT90aGlzLmVkaXRhYmxlQXJlYT1iOnRoaXMudGV4dGFyZWE9dGhpcy5wYXJlbnQudGV4dGFyZWEsdGhpcy5jb25maWcuY29udGVudEVkaXRhYmxlTW9kZT90aGlzLl9pbml0Q29udGVudEVkaXRhYmxlQXJlYSgpOnRoaXMuX2luaXRTYW5kYm94KCl9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmlubmVySFRNTD1jLmRpc3BsYXlzQ2FyZXRJbkVtcHR5Q29udGVudEVkaXRhYmxlQ29ycmVjdGx5KCk/XCJcIjp0aGlzLkNBUkVUX0hBQ0t9LGdldFZhbHVlOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcy5pc0VtcHR5KCk/XCJcIjphLnF1aXJrcy5nZXRDb3JyZWN0SW5uZXJIVE1MKHRoaXMuZWxlbWVudCk7cmV0dXJuIGIhPT0hMSYmKGQ9dGhpcy5wYXJlbnQucGFyc2UoZCxjPT09ITE/ITE6ITApKSxkfSxzZXRWYWx1ZTpmdW5jdGlvbihhLGIpe2ImJihhPXRoaXMucGFyZW50LnBhcnNlKGEpKTt0cnl7dGhpcy5lbGVtZW50LmlubmVySFRNTD1hfWNhdGNoKGMpe3RoaXMuZWxlbWVudC5pbm5lclRleHQ9YX19LGNsZWFuVXA6ZnVuY3Rpb24oKXt0aGlzLnBhcmVudC5wYXJzZSh0aGlzLmVsZW1lbnQpfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5lZGl0YWJsZUFyZWEuc3R5bGUuZGlzcGxheT10aGlzLl9kaXNwbGF5U3R5bGV8fFwiXCIsdGhpcy5jb25maWcubm9UZXh0YXJlYXx8dGhpcy50ZXh0YXJlYS5lbGVtZW50LmRpc2FibGVkfHwodGhpcy5kaXNhYmxlKCksdGhpcy5lbmFibGUoKSl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLl9kaXNwbGF5U3R5bGU9Yi5nZXRTdHlsZShcImRpc3BsYXlcIikuZnJvbSh0aGlzLmVkaXRhYmxlQXJlYSksXCJub25lXCI9PT10aGlzLl9kaXNwbGF5U3R5bGUmJih0aGlzLl9kaXNwbGF5U3R5bGU9bnVsbCksdGhpcy5lZGl0YWJsZUFyZWEuc3R5bGUuZGlzcGxheT1cIm5vbmVcIn0sZGlzYWJsZTpmdW5jdGlvbigpe3RoaXMucGFyZW50LmZpcmUoXCJkaXNhYmxlOmNvbXBvc2VyXCIpLHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIil9LGVuYWJsZTpmdW5jdGlvbigpe3RoaXMucGFyZW50LmZpcmUoXCJlbmFibGU6Y29tcG9zZXJcIiksdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShcImNvbnRlbnRFZGl0YWJsZVwiLFwidHJ1ZVwiKX0sZm9jdXM6ZnVuY3Rpb24oYil7YS5icm93c2VyLmRvZXNBc3luY0ZvY3VzKCkmJnRoaXMuaGFzUGxhY2Vob2xkZXJTZXQoKSYmdGhpcy5jbGVhcigpLHRoaXMuYmFzZSgpO3ZhciBjPXRoaXMuZWxlbWVudC5sYXN0Q2hpbGQ7YiYmYyYmdGhpcy5zZWxlY3Rpb24mJihcIkJSXCI9PT1jLm5vZGVOYW1lP3RoaXMuc2VsZWN0aW9uLnNldEJlZm9yZSh0aGlzLmVsZW1lbnQubGFzdENoaWxkKTp0aGlzLnNlbGVjdGlvbi5zZXRBZnRlcih0aGlzLmVsZW1lbnQubGFzdENoaWxkKSl9LGdldFRleHRDb250ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIGIuZ2V0VGV4dENvbnRlbnQodGhpcy5lbGVtZW50KX0saGFzUGxhY2Vob2xkZXJTZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUZXh0Q29udGVudCgpPT0odGhpcy5jb25maWcubm9UZXh0YXJlYT90aGlzLmVkaXRhYmxlQXJlYS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBsYWNlaG9sZGVyXCIpOnRoaXMudGV4dGFyZWEuZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKSkmJnRoaXMucGxhY2Vob2xkZXJTZXR9LGlzRW1wdHk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnQuaW5uZXJIVE1MLnRvTG93ZXJDYXNlKCk7cmV0dXJuL14oXFxzfDxicj58PFxcL2JyPnw8cD58PFxcL3A+KSokL2kudGVzdChhKXx8XCJcIj09PWF8fFwiPGJyPlwiPT09YXx8XCI8cD48L3A+XCI9PT1hfHxcIjxwPjxicj48L3A+XCI9PT1hfHx0aGlzLmhhc1BsYWNlaG9sZGVyU2V0KCl9LF9pbml0Q29udGVudEVkaXRhYmxlQXJlYTpmdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5jb25maWcubm9UZXh0YXJlYT90aGlzLnNhbmRib3g9bmV3IGIuQ29udGVudEVkaXRhYmxlQXJlYShmdW5jdGlvbigpe2EuX2NyZWF0ZSgpfSx7fSx0aGlzLmVkaXRhYmxlQXJlYSk6KHRoaXMuc2FuZGJveD1uZXcgYi5Db250ZW50RWRpdGFibGVBcmVhKGZ1bmN0aW9uKCl7YS5fY3JlYXRlKCl9KSx0aGlzLmVkaXRhYmxlQXJlYT10aGlzLnNhbmRib3guZ2V0Q29udGVudEVkaXRhYmxlKCksYi5pbnNlcnQodGhpcy5lZGl0YWJsZUFyZWEpLmFmdGVyKHRoaXMudGV4dGFyZWEuZWxlbWVudCksdGhpcy5fY3JlYXRlV3lzaXd5Z0Zvcm1GaWVsZCgpKX0sX2luaXRTYW5kYm94OmZ1bmN0aW9uKCl7dmFyIGEsYz10aGlzO3RoaXMuc2FuZGJveD1uZXcgYi5TYW5kYm94KGZ1bmN0aW9uKCl7Yy5fY3JlYXRlKCl9LHtzdHlsZXNoZWV0czp0aGlzLmNvbmZpZy5zdHlsZXNoZWV0c30pLHRoaXMuZWRpdGFibGVBcmVhPXRoaXMuc2FuZGJveC5nZXRJZnJhbWUoKSxhPXRoaXMudGV4dGFyZWEuZWxlbWVudCxiLmluc2VydCh0aGlzLmVkaXRhYmxlQXJlYSkuYWZ0ZXIoYSksdGhpcy5fY3JlYXRlV3lzaXd5Z0Zvcm1GaWVsZCgpfSxfY3JlYXRlV3lzaXd5Z0Zvcm1GaWVsZDpmdW5jdGlvbigpe2lmKHRoaXMudGV4dGFyZWEuZWxlbWVudC5mb3JtKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7YS50eXBlPVwiaGlkZGVuXCIsYS5uYW1lPVwiX3d5c2lodG1sNV9tb2RlXCIsYS52YWx1ZT0xLGIuaW5zZXJ0KGEpLmFmdGVyKHRoaXMudGV4dGFyZWEuZWxlbWVudCl9fSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGQsZSxmPXRoaXM7dGhpcy5kb2M9dGhpcy5zYW5kYm94LmdldERvY3VtZW50KCksdGhpcy5lbGVtZW50PXRoaXMuY29uZmlnLmNvbnRlbnRFZGl0YWJsZU1vZGU/dGhpcy5zYW5kYm94LmdldENvbnRlbnRFZGl0YWJsZSgpOnRoaXMuZG9jLmJvZHksdGhpcy5jb25maWcubm9UZXh0YXJlYT90aGlzLmNsZWFuVXAoKToodGhpcy50ZXh0YXJlYT10aGlzLnBhcmVudC50ZXh0YXJlYSx0aGlzLmVsZW1lbnQuaW5uZXJIVE1MPXRoaXMudGV4dGFyZWEuZ2V0VmFsdWUoITAsITEpKSx0aGlzLnNlbGVjdGlvbj1uZXcgYS5TZWxlY3Rpb24odGhpcy5wYXJlbnQsdGhpcy5lbGVtZW50LHRoaXMuY29uZmlnLnVuZWRpdGFibGVDb250YWluZXJDbGFzc25hbWUpLHRoaXMuY29tbWFuZHM9bmV3IGEuQ29tbWFuZHModGhpcy5wYXJlbnQpLHRoaXMuY29uZmlnLm5vVGV4dGFyZWF8fGIuY29weUF0dHJpYnV0ZXMoW1wiY2xhc3NOYW1lXCIsXCJzcGVsbGNoZWNrXCIsXCJ0aXRsZVwiLFwibGFuZ1wiLFwiZGlyXCIsXCJhY2Nlc3NLZXlcIl0pLmZyb20odGhpcy50ZXh0YXJlYS5lbGVtZW50KS50byh0aGlzLmVsZW1lbnQpLGIuYWRkQ2xhc3ModGhpcy5lbGVtZW50LHRoaXMuY29uZmlnLmNvbXBvc2VyQ2xhc3NOYW1lKSx0aGlzLmNvbmZpZy5zdHlsZSYmIXRoaXMuY29uZmlnLmNvbnRlbnRFZGl0YWJsZU1vZGUmJnRoaXMuc3R5bGUoKSx0aGlzLm9ic2VydmUoKSxkPXRoaXMuY29uZmlnLm5hbWUsZCYmKGIuYWRkQ2xhc3ModGhpcy5lbGVtZW50LGQpLHRoaXMuY29uZmlnLmNvbnRlbnRFZGl0YWJsZU1vZGV8fGIuYWRkQ2xhc3ModGhpcy5lZGl0YWJsZUFyZWEsZCkpLHRoaXMuZW5hYmxlKCksIXRoaXMuY29uZmlnLm5vVGV4dGFyZWEmJnRoaXMudGV4dGFyZWEuZWxlbWVudC5kaXNhYmxlZCYmdGhpcy5kaXNhYmxlKCksZT1cInN0cmluZ1wiPT10eXBlb2YgdGhpcy5jb25maWcucGxhY2Vob2xkZXI/dGhpcy5jb25maWcucGxhY2Vob2xkZXI6dGhpcy5jb25maWcubm9UZXh0YXJlYT90aGlzLmVkaXRhYmxlQXJlYS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBsYWNlaG9sZGVyXCIpOnRoaXMudGV4dGFyZWEuZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKSxlJiZiLnNpbXVsYXRlUGxhY2Vob2xkZXIodGhpcy5wYXJlbnQsdGhpcyxlKSx0aGlzLmNvbW1hbmRzLmV4ZWMoXCJzdHlsZVdpdGhDU1NcIiwhMSksdGhpcy5faW5pdEF1dG9MaW5raW5nKCksdGhpcy5faW5pdE9iamVjdFJlc2l6aW5nKCksdGhpcy5faW5pdFVuZG9NYW5hZ2VyKCksdGhpcy5faW5pdExpbmVCcmVha2luZygpLHRoaXMuY29uZmlnLm5vVGV4dGFyZWF8fCF0aGlzLnRleHRhcmVhLmVsZW1lbnQuaGFzQXR0cmlidXRlKFwiYXV0b2ZvY3VzXCIpJiZkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiOmZvY3VzXCIpIT10aGlzLnRleHRhcmVhLmVsZW1lbnR8fGMuaXNJb3MoKXx8c2V0VGltZW91dChmdW5jdGlvbigpe2YuZm9jdXMoITApfSwxMDApLGMuY2xlYXJzQ29udGVudEVkaXRhYmxlQ29ycmVjdGx5KCl8fGEucXVpcmtzLmVuc3VyZVByb3BlckNsZWFyaW5nKHRoaXMpLHRoaXMuaW5pdFN5bmMmJnRoaXMuY29uZmlnLnN5bmMmJnRoaXMuaW5pdFN5bmMoKSx0aGlzLmNvbmZpZy5ub1RleHRhcmVhfHx0aGlzLnRleHRhcmVhLmhpZGUoKSx0aGlzLnBhcmVudC5maXJlKFwiYmVmb3JlbG9hZFwiKS5maXJlKFwibG9hZFwiKX0sX2luaXRBdXRvTGlua2luZzpmdW5jdGlvbigpe3ZhciBkLGUsZixnPXRoaXMsaD1jLmNhbkRpc2FibGVBdXRvTGlua2luZygpLGk9Yy5kb2VzQXV0b0xpbmtpbmdJbkNvbnRlbnRFZGl0YWJsZSgpO2gmJnRoaXMuY29tbWFuZHMuZXhlYyhcImF1dG9VcmxEZXRlY3RcIiwhMSksdGhpcy5jb25maWcuYXV0b0xpbmsmJigoIWl8fGkmJmgpJiYodGhpcy5wYXJlbnQub24oXCJuZXd3b3JkOmNvbXBvc2VyXCIsZnVuY3Rpb24oKXtiLmdldFRleHRDb250ZW50KGcuZWxlbWVudCkubWF0Y2goYi5hdXRvTGluay5VUkxfUkVHX0VYUCkmJmcuc2VsZWN0aW9uLmV4ZWN1dGVBbmRSZXN0b3JlKGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1nLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5cIitnLmNvbmZpZy51bmVkaXRhYmxlQ29udGFpbmVyQ2xhc3NuYW1lKSxoPSExO2ZvcihlPWYubGVuZ3RoO2UtLTspYS5kb20uY29udGFpbnMoZltlXSxkKSYmKGg9ITApO2h8fGIuYXV0b0xpbmsoZC5wYXJlbnROb2RlLFtnLmNvbmZpZy51bmVkaXRhYmxlQ29udGFpbmVyQ2xhc3NuYW1lXSl9KX0pLGIub2JzZXJ2ZSh0aGlzLmVsZW1lbnQsXCJibHVyXCIsZnVuY3Rpb24oKXtiLmF1dG9MaW5rKGcuZWxlbWVudCxbZy5jb25maWcudW5lZGl0YWJsZUNvbnRhaW5lckNsYXNzbmFtZV0pfSkpLGQ9dGhpcy5zYW5kYm94LmdldERvY3VtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJhXCIpLGU9Yi5hdXRvTGluay5VUkxfUkVHX0VYUCxmPWZ1bmN0aW9uKGMpe3ZhciBkPWEubGFuZy5zdHJpbmcoYi5nZXRUZXh0Q29udGVudChjKSkudHJpbSgpO3JldHVyblwid3d3LlwiPT09ZC5zdWJzdHIoMCw0KSYmKGQ9XCJodHRwOi8vXCIrZCksZH0sYi5vYnNlcnZlKHRoaXMuZWxlbWVudCxcImtleWRvd25cIixmdW5jdGlvbihhKXtpZihkLmxlbmd0aCl7dmFyIGMsaD1nLnNlbGVjdGlvbi5nZXRTZWxlY3RlZE5vZGUoYS50YXJnZXQub3duZXJEb2N1bWVudCksaT1iLmdldFBhcmVudEVsZW1lbnQoaCx7bm9kZU5hbWU6XCJBXCJ9LDQpO2kmJihjPWYoaSksc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPWYoaSk7YSE9PWMmJmEubWF0Y2goZSkmJmkuc2V0QXR0cmlidXRlKFwiaHJlZlwiLGEpfSwwKSl9fSkpfSxfaW5pdE9iamVjdFJlc2l6aW5nOmZ1bmN0aW9uKCl7aWYodGhpcy5jb21tYW5kcy5leGVjKFwiZW5hYmxlT2JqZWN0UmVzaXppbmdcIiwhMCksYy5zdXBwb3J0c0V2ZW50KFwicmVzaXplZW5kXCIpKXt2YXIgZD1bXCJ3aWR0aFwiLFwiaGVpZ2h0XCJdLGU9ZC5sZW5ndGgsZj10aGlzLmVsZW1lbnQ7Yi5vYnNlcnZlKGYsXCJyZXNpemVlbmRcIixmdW5jdGlvbihiKXt2YXIgYyxnPWIudGFyZ2V0fHxiLnNyY0VsZW1lbnQsaD1nLnN0eWxlLGk9MDtpZihcIklNR1wiPT09Zy5ub2RlTmFtZSl7Zm9yKDtlPmk7aSsrKWM9ZFtpXSxoW2NdJiYoZy5zZXRBdHRyaWJ1dGUoYyxwYXJzZUludChoW2NdLDEwKSksaFtjXT1cIlwiKTthLnF1aXJrcy5yZWRyYXcoZil9fSl9fSxfaW5pdFVuZG9NYW5hZ2VyOmZ1bmN0aW9uKCl7dGhpcy51bmRvTWFuYWdlcj1uZXcgYS5VbmRvTWFuYWdlcih0aGlzLnBhcmVudCl9LF9pbml0TGluZUJyZWFraW5nOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZChhKXt2YXIgYz1iLmdldFBhcmVudEVsZW1lbnQoYSx7bm9kZU5hbWU6W1wiUFwiLFwiRElWXCJdfSwyKTtjJiZiLmNvbnRhaW5zKGUuZWxlbWVudCxjKSYmZS5zZWxlY3Rpb24uZXhlY3V0ZUFuZFJlc3RvcmUoZnVuY3Rpb24oKXtlLmNvbmZpZy51c2VMaW5lQnJlYWtzP2IucmVwbGFjZVdpdGhDaGlsZE5vZGVzKGMpOlwiUFwiIT09Yy5ub2RlTmFtZSYmYi5yZW5hbWVFbGVtZW50KGMsXCJwXCIpfSl9dmFyIGU9dGhpcyxmPVtcIkxJXCIsXCJQXCIsXCJIMVwiLFwiSDJcIixcIkgzXCIsXCJINFwiLFwiSDVcIixcIkg2XCJdLGc9W1wiVUxcIixcIk9MXCIsXCJNRU5VXCJdO3RoaXMuY29uZmlnLnVzZUxpbmVCcmVha3N8fGIub2JzZXJ2ZSh0aGlzLmVsZW1lbnQsW1wiZm9jdXNcIixcImtleWRvd25cIl0sZnVuY3Rpb24oKXtpZihlLmlzRW1wdHkoKSl7dmFyIGE9ZS5kb2MuY3JlYXRlRWxlbWVudChcIlBcIik7ZS5lbGVtZW50LmlubmVySFRNTD1cIlwiLGUuZWxlbWVudC5hcHBlbmRDaGlsZChhKSxjLmRpc3BsYXlzQ2FyZXRJbkVtcHR5Q29udGVudEVkaXRhYmxlQ29ycmVjdGx5KCk/ZS5zZWxlY3Rpb24uc2VsZWN0Tm9kZShhLCEwKTooYS5pbm5lckhUTUw9XCI8YnI+XCIsZS5zZWxlY3Rpb24uc2V0QmVmb3JlKGEuZmlyc3RDaGlsZCkpfX0pLGIub2JzZXJ2ZSh0aGlzLmVsZW1lbnQsXCJrZXlkb3duXCIsZnVuY3Rpb24oYyl7dmFyIGgsaT1jLmtleUNvZGU7aWYoIWMuc2hpZnRLZXkmJihpPT09YS5FTlRFUl9LRVl8fGk9PT1hLkJBQ0tTUEFDRV9LRVkpKXJldHVybiBoPWIuZ2V0UGFyZW50RWxlbWVudChlLnNlbGVjdGlvbi5nZXRTZWxlY3RlZE5vZGUoKSx7bm9kZU5hbWU6Zn0sNCksaD8oc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBjLGY9ZS5zZWxlY3Rpb24uZ2V0U2VsZWN0ZWROb2RlKCk7aWYoXCJMSVwiPT09aC5ub2RlTmFtZSl7aWYoIWYpcmV0dXJuO2M9Yi5nZXRQYXJlbnRFbGVtZW50KGYse25vZGVOYW1lOmd9LDIpLGN8fGQoZil9aT09PWEuRU5URVJfS0VZJiZoLm5vZGVOYW1lLm1hdGNoKC9eSFsxLTZdJC8pJiZkKGYpfSwwKSx2b2lkIDApOihlLmNvbmZpZy51c2VMaW5lQnJlYWtzJiZpPT09YS5FTlRFUl9LRVkmJiFhLmJyb3dzZXIuaW5zZXJ0c0xpbmVCcmVha3NPblJldHVybigpJiYoYy5wcmV2ZW50RGVmYXVsdCgpLGUuY29tbWFuZHMuZXhlYyhcImluc2VydExpbmVCcmVha1wiKSksdm9pZCAwKX0pfX0pfSh3eXNpaHRtbDUpLGZ1bmN0aW9uKGEpe3ZhciBiPWEuZG9tLGM9ZG9jdW1lbnQsZD13aW5kb3csZT1jLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksZj1bXCJiYWNrZ3JvdW5kLWNvbG9yXCIsXCJjb2xvclwiLFwiY3Vyc29yXCIsXCJmb250LWZhbWlseVwiLFwiZm9udC1zaXplXCIsXCJmb250LXN0eWxlXCIsXCJmb250LXZhcmlhbnRcIixcImZvbnQtd2VpZ2h0XCIsXCJsaW5lLWhlaWdodFwiLFwibGV0dGVyLXNwYWNpbmdcIixcInRleHQtYWxpZ25cIixcInRleHQtZGVjb3JhdGlvblwiLFwidGV4dC1pbmRlbnRcIixcInRleHQtcmVuZGVyaW5nXCIsXCJ3b3JkLWJyZWFrXCIsXCJ3b3JkLXdyYXBcIixcIndvcmQtc3BhY2luZ1wiXSxnPVtcImJhY2tncm91bmQtY29sb3JcIixcImJvcmRlci1jb2xsYXBzZVwiLFwiYm9yZGVyLWJvdHRvbS1jb2xvclwiLFwiYm9yZGVyLWJvdHRvbS1zdHlsZVwiLFwiYm9yZGVyLWJvdHRvbS13aWR0aFwiLFwiYm9yZGVyLWxlZnQtY29sb3JcIixcImJvcmRlci1sZWZ0LXN0eWxlXCIsXCJib3JkZXItbGVmdC13aWR0aFwiLFwiYm9yZGVyLXJpZ2h0LWNvbG9yXCIsXCJib3JkZXItcmlnaHQtc3R5bGVcIixcImJvcmRlci1yaWdodC13aWR0aFwiLFwiYm9yZGVyLXRvcC1jb2xvclwiLFwiYm9yZGVyLXRvcC1zdHlsZVwiLFwiYm9yZGVyLXRvcC13aWR0aFwiLFwiY2xlYXJcIixcImRpc3BsYXlcIixcImZsb2F0XCIsXCJtYXJnaW4tYm90dG9tXCIsXCJtYXJnaW4tbGVmdFwiLFwibWFyZ2luLXJpZ2h0XCIsXCJtYXJnaW4tdG9wXCIsXCJvdXRsaW5lLWNvbG9yXCIsXCJvdXRsaW5lLW9mZnNldFwiLFwib3V0bGluZS13aWR0aFwiLFwib3V0bGluZS1zdHlsZVwiLFwicGFkZGluZy1sZWZ0XCIsXCJwYWRkaW5nLXJpZ2h0XCIsXCJwYWRkaW5nLXRvcFwiLFwicGFkZGluZy1ib3R0b21cIixcInBvc2l0aW9uXCIsXCJ0b3BcIixcImxlZnRcIixcInJpZ2h0XCIsXCJib3R0b21cIixcInotaW5kZXhcIixcInZlcnRpY2FsLWFsaWduXCIsXCJ0ZXh0LWFsaWduXCIsXCItd2Via2l0LWJveC1zaXppbmdcIixcIi1tb3otYm94LXNpemluZ1wiLFwiLW1zLWJveC1zaXppbmdcIixcImJveC1zaXppbmdcIixcIi13ZWJraXQtYm94LXNoYWRvd1wiLFwiLW1vei1ib3gtc2hhZG93XCIsXCItbXMtYm94LXNoYWRvd1wiLFwiYm94LXNoYWRvd1wiLFwiLXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1c1wiLFwiLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0XCIsXCJib3JkZXItdG9wLXJpZ2h0LXJhZGl1c1wiLFwiLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1c1wiLFwiLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0XCIsXCJib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1c1wiLFwiLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzXCIsXCItbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdFwiLFwiYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1c1wiLFwiLXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzXCIsXCItbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdFwiLFwiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1c1wiLFwid2lkdGhcIixcImhlaWdodFwiXSxoPVtcImh0bWwgICAgICAgICAgICAgICAgIHsgaGVpZ2h0OiAxMDAlOyB9XCIsXCJib2R5ICAgICAgICAgICAgICAgICB7IGhlaWdodDogMTAwJTsgcGFkZGluZzogMXB4IDAgMCAwOyBtYXJnaW46IC0xcHggMCAwIDA7IH1cIixcImJvZHkgPiBwOmZpcnN0LWNoaWxkIHsgbWFyZ2luLXRvcDogMDsgfVwiLFwiLl93eXNpaHRtbDUtdGVtcCAgICAgeyBkaXNwbGF5OiBub25lOyB9XCIsYS5icm93c2VyLmlzR2Vja28/XCJib2R5LnBsYWNlaG9sZGVyIHsgY29sb3I6IGdyYXl0ZXh0ICFpbXBvcnRhbnQ7IH1cIjpcImJvZHkucGxhY2Vob2xkZXIgeyBjb2xvcjogI2E5YTlhOSAhaW1wb3J0YW50OyB9XCIsXCJpbWc6LW1vei1icm9rZW4gICAgICB7IC1tb3otZm9yY2UtYnJva2VuLWltYWdlLWljb246IDE7IGhlaWdodDogMjRweDsgd2lkdGg6IDI0cHg7IH1cIl0saT1mdW5jdGlvbihhKXtpZihhLnNldEFjdGl2ZSl0cnl7YS5zZXRBY3RpdmUoKX1jYXRjaChlKXt9ZWxzZXt2YXIgZj1hLnN0eWxlLGc9Yy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfHxjLmJvZHkuc2Nyb2xsVG9wLGg9Yy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8Yy5ib2R5LnNjcm9sbExlZnQsaT17cG9zaXRpb246Zi5wb3NpdGlvbix0b3A6Zi50b3AsbGVmdDpmLmxlZnQsV2Via2l0VXNlclNlbGVjdDpmLldlYmtpdFVzZXJTZWxlY3R9O2Iuc2V0U3R5bGVzKHtwb3NpdGlvbjpcImFic29sdXRlXCIsdG9wOlwiLTk5OTk5cHhcIixsZWZ0OlwiLTk5OTk5cHhcIixXZWJraXRVc2VyU2VsZWN0Olwibm9uZVwifSkub24oYSksYS5mb2N1cygpLGIuc2V0U3R5bGVzKGkpLm9uKGEpLGQuc2Nyb2xsVG8mJmQuc2Nyb2xsVG8oaCxnKX19O2Eudmlld3MuQ29tcG9zZXIucHJvdG90eXBlLnN0eWxlPWZ1bmN0aW9uKCl7dmFyIGQsaixrPXRoaXMsbD1jLnF1ZXJ5U2VsZWN0b3IoXCI6Zm9jdXNcIiksbT10aGlzLnRleHRhcmVhLmVsZW1lbnQsbj1tLmhhc0F0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpLG89biYmbS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKSxwPW0uc3R5bGUuZGlzcGxheSxxPW0uZGlzYWJsZWQ7cmV0dXJuIHRoaXMuZm9jdXNTdHlsZXNIb3N0PWUuY2xvbmVOb2RlKCExKSx0aGlzLmJsdXJTdHlsZXNIb3N0PWUuY2xvbmVOb2RlKCExKSx0aGlzLmRpc2FibGVkU3R5bGVzSG9zdD1lLmNsb25lTm9kZSghMSksbiYmbS5yZW1vdmVBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKSxtPT09bCYmbS5ibHVyKCksbS5kaXNhYmxlZD0hMSxtLnN0eWxlLmRpc3BsYXk9ZD1cIm5vbmVcIiwobS5nZXRBdHRyaWJ1dGUoXCJyb3dzXCIpJiZcImF1dG9cIj09PWIuZ2V0U3R5bGUoXCJoZWlnaHRcIikuZnJvbShtKXx8bS5nZXRBdHRyaWJ1dGUoXCJjb2xzXCIpJiZcImF1dG9cIj09PWIuZ2V0U3R5bGUoXCJ3aWR0aFwiKS5mcm9tKG0pKSYmKG0uc3R5bGUuZGlzcGxheT1kPXApLGIuY29weVN0eWxlcyhnKS5mcm9tKG0pLnRvKHRoaXMuZWRpdGFibGVBcmVhKS5hbmRUbyh0aGlzLmJsdXJTdHlsZXNIb3N0KSxiLmNvcHlTdHlsZXMoZikuZnJvbShtKS50byh0aGlzLmVsZW1lbnQpLmFuZFRvKHRoaXMuYmx1clN0eWxlc0hvc3QpLGIuaW5zZXJ0Q1NTKGgpLmludG8odGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQpLG0uZGlzYWJsZWQ9ITAsYi5jb3B5U3R5bGVzKGcpLmZyb20obSkudG8odGhpcy5kaXNhYmxlZFN0eWxlc0hvc3QpLGIuY29weVN0eWxlcyhmKS5mcm9tKG0pLnRvKHRoaXMuZGlzYWJsZWRTdHlsZXNIb3N0KSxtLmRpc2FibGVkPXEsbS5zdHlsZS5kaXNwbGF5PXAsaShtKSxtLnN0eWxlLmRpc3BsYXk9ZCxiLmNvcHlTdHlsZXMoZykuZnJvbShtKS50byh0aGlzLmZvY3VzU3R5bGVzSG9zdCksYi5jb3B5U3R5bGVzKGYpLmZyb20obSkudG8odGhpcy5mb2N1c1N0eWxlc0hvc3QpLG0uc3R5bGUuZGlzcGxheT1wLGIuY29weVN0eWxlcyhbXCJkaXNwbGF5XCJdKS5mcm9tKG0pLnRvKHRoaXMuZWRpdGFibGVBcmVhKSxqPWEubGFuZy5hcnJheShnKS53aXRob3V0KFtcImRpc3BsYXlcIl0pLGw/bC5mb2N1cygpOm0uYmx1cigpLG4mJm0uc2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIixvKSx0aGlzLnBhcmVudC5vbihcImZvY3VzOmNvbXBvc2VyXCIsZnVuY3Rpb24oKXtiLmNvcHlTdHlsZXMoaikuZnJvbShrLmZvY3VzU3R5bGVzSG9zdCkudG8oay5lZGl0YWJsZUFyZWEpLGIuY29weVN0eWxlcyhmKS5mcm9tKGsuZm9jdXNTdHlsZXNIb3N0KS50byhrLmVsZW1lbnQpfSksdGhpcy5wYXJlbnQub24oXCJibHVyOmNvbXBvc2VyXCIsZnVuY3Rpb24oKXtiLmNvcHlTdHlsZXMoaikuZnJvbShrLmJsdXJTdHlsZXNIb3N0KS50byhrLmVkaXRhYmxlQXJlYSksYi5jb3B5U3R5bGVzKGYpLmZyb20oay5ibHVyU3R5bGVzSG9zdCkudG8oay5lbGVtZW50KX0pLHRoaXMucGFyZW50Lm9ic2VydmUoXCJkaXNhYmxlOmNvbXBvc2VyXCIsZnVuY3Rpb24oKXtiLmNvcHlTdHlsZXMoaikuZnJvbShrLmRpc2FibGVkU3R5bGVzSG9zdCkudG8oay5lZGl0YWJsZUFyZWEpLGIuY29weVN0eWxlcyhmKS5mcm9tKGsuZGlzYWJsZWRTdHlsZXNIb3N0KS50byhrLmVsZW1lbnQpfSksdGhpcy5wYXJlbnQub2JzZXJ2ZShcImVuYWJsZTpjb21wb3NlclwiLGZ1bmN0aW9uKCl7Yi5jb3B5U3R5bGVzKGopLmZyb20oay5ibHVyU3R5bGVzSG9zdCkudG8oay5lZGl0YWJsZUFyZWEpLGIuY29weVN0eWxlcyhmKS5mcm9tKGsuYmx1clN0eWxlc0hvc3QpLnRvKGsuZWxlbWVudCl9KSx0aGlzfX0od3lzaWh0bWw1KSxmdW5jdGlvbihhKXt2YXIgYj1hLmRvbSxjPWEuYnJvd3NlcixkPXs2NjpcImJvbGRcIiw3MzpcIml0YWxpY1wiLDg1OlwidW5kZXJsaW5lXCJ9LGU9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9YS5nZXRQcmV2aW91c05vZGUoYiwhMCksZj1hLmdldFNlbGVjdGVkTm9kZSgpO2lmKDEhPT1mLm5vZGVUeXBlJiZmLnBhcmVudE5vZGUhPT1jJiYoZj1mLnBhcmVudE5vZGUpLGUpaWYoMT09Zi5ub2RlVHlwZSl7aWYoZD1mLmZpcnN0Q2hpbGQsMT09ZS5ub2RlVHlwZSlmb3IoO2YuZmlyc3RDaGlsZDspZS5hcHBlbmRDaGlsZChmLmZpcnN0Q2hpbGQpO2Vsc2UgZm9yKDtmLmZpcnN0Q2hpbGQ7KWIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZi5maXJzdENoaWxkLGIpO2YucGFyZW50Tm9kZSYmZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpLGEuc2V0QmVmb3JlKGQpfWVsc2UgMT09ZS5ub2RlVHlwZT9lLmFwcGVuZENoaWxkKGYpOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZixiKSxhLnNldEJlZm9yZShmKX0sZj1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZixnLGg7Yi5pc0NvbGxhcHNlZCgpP2IuY2FyZXRJc0luVGhlQmVnaW5uaWcoXCJMSVwiKT8oYS5wcmV2ZW50RGVmYXVsdCgpLGQuY29tbWFuZHMuZXhlYyhcIm91dGRlbnRMaXN0XCIpKTpiLmNhcmV0SXNJblRoZUJlZ2lubmlnKCk/YS5wcmV2ZW50RGVmYXVsdCgpOihiLmNhcmV0SXNGaXJzdEluU2VsZWN0aW9uKCkmJmIuZ2V0UHJldmlvdXNOb2RlKCkmJmIuZ2V0UHJldmlvdXNOb2RlKCkubm9kZU5hbWUmJi9eSFxcZCQvZ2kudGVzdChiLmdldFByZXZpb3VzTm9kZSgpLm5vZGVOYW1lKSYmKGY9Yi5nZXRQcmV2aW91c05vZGUoKSxhLnByZXZlbnREZWZhdWx0KCksL15cXHMqJC8udGVzdChmLnRleHRDb250ZW50fHxmLmlubmVyVGV4dCk/Zi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpOihnPWYub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpLGcuc2VsZWN0Tm9kZUNvbnRlbnRzKGYpLGcuY29sbGFwc2UoITEpLGIuc2V0U2VsZWN0aW9uKGcpKSksaD1iLmNhcmV0SXNCZWZvcmVVbmVkaXRhYmxlKCksaCYmKGEucHJldmVudERlZmF1bHQoKSxlKGIsaCxjKSkpOmIuY29udGFpbnNVbmVkaXRhYmxlKCkmJihhLnByZXZlbnREZWZhdWx0KCksYi5kZWxldGVDb250ZW50cygpKX0sZz1mdW5jdGlvbihhKXtpZihhLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpKXtpZihhLnNlbGVjdGlvbi5jYXJldElzSW5UaGVCZWdpbm5pZyhcIkxJXCIpJiZhLmNvbW1hbmRzLmV4ZWMoXCJpbmRlbnRMaXN0XCIpKXJldHVybn1lbHNlIGEuc2VsZWN0aW9uLmRlbGV0ZUNvbnRlbnRzKCk7XG5hLmNvbW1hbmRzLmV4ZWMoXCJpbnNlcnRIVE1MXCIsXCImZW1zcDtcIil9O2Eudmlld3MuQ29tcG9zZXIucHJvdG90eXBlLm9ic2VydmU9ZnVuY3Rpb24oKXt2YXIgZSxoLGk9dGhpcyxqPXRoaXMuZ2V0VmFsdWUoITEsITEpLGs9dGhpcy5zYW5kYm94LmdldElmcmFtZT90aGlzLnNhbmRib3guZ2V0SWZyYW1lKCk6dGhpcy5zYW5kYm94LmdldENvbnRlbnRFZGl0YWJsZSgpLGw9dGhpcy5lbGVtZW50LG09Yy5zdXBwb3J0c0V2ZW50c0luSWZyYW1lQ29ycmVjdGx5KCl8fHRoaXMuc2FuZGJveC5nZXRDb250ZW50RWRpdGFibGU/bDp0aGlzLnNhbmRib3guZ2V0V2luZG93KCksbj1bXCJkcm9wXCIsXCJwYXN0ZVwiLFwiYmVmb3JlcGFzdGVcIl0sbz1bXCJkcm9wXCIsXCJwYXN0ZVwiLFwibW91c2V1cFwiLFwiZm9jdXNcIixcImtleXVwXCJdO2Iub2JzZXJ2ZShrLFwiRE9NTm9kZVJlbW92ZWRcIixmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoZSksaS5wYXJlbnQuZmlyZShcImRlc3Ryb3k6Y29tcG9zZXJcIil9KSxjLnN1cHBvcnRzTXV0YXRpb25FdmVudHMoKXx8KGU9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtiLmNvbnRhaW5zKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxrKXx8KGNsZWFySW50ZXJ2YWwoZSksaS5wYXJlbnQuZmlyZShcImRlc3Ryb3k6Y29tcG9zZXJcIikpfSwyNTApKSxiLm9ic2VydmUobSxvLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe2kucGFyZW50LmZpcmUoXCJpbnRlcmFjdGlvblwiKS5maXJlKFwiaW50ZXJhY3Rpb246Y29tcG9zZXJcIil9LDApfSksdGhpcy5jb25maWcuaGFuZGxlVGFibGVzJiYoIXRoaXMudGFibGVDbGlja0hhbmRsZSYmdGhpcy5kb2MuZXhlY0NvbW1hbmQmJmEuYnJvd3Nlci5zdXBwb3J0c0NvbW1hbmQodGhpcy5kb2MsXCJlbmFibGVPYmplY3RSZXNpemluZ1wiKSYmYS5icm93c2VyLnN1cHBvcnRzQ29tbWFuZCh0aGlzLmRvYyxcImVuYWJsZUlubGluZVRhYmxlRWRpdGluZ1wiKSYmKHRoaXMuc2FuZGJveC5nZXRJZnJhbWU/dGhpcy50YWJsZUNsaWNrSGFuZGxlPWIub2JzZXJ2ZShrLFtcImZvY3VzXCIsXCJtb3VzZXVwXCIsXCJtb3VzZW92ZXJcIl0sZnVuY3Rpb24oKXtpLmRvYy5leGVjQ29tbWFuZChcImVuYWJsZU9iamVjdFJlc2l6aW5nXCIsITEsXCJmYWxzZVwiKSxpLmRvYy5leGVjQ29tbWFuZChcImVuYWJsZUlubGluZVRhYmxlRWRpdGluZ1wiLCExLFwiZmFsc2VcIiksaS50YWJsZUNsaWNrSGFuZGxlLnN0b3AoKX0pOnNldFRpbWVvdXQoZnVuY3Rpb24oKXtpLmRvYy5leGVjQ29tbWFuZChcImVuYWJsZU9iamVjdFJlc2l6aW5nXCIsITEsXCJmYWxzZVwiKSxpLmRvYy5leGVjQ29tbWFuZChcImVuYWJsZUlubGluZVRhYmxlRWRpdGluZ1wiLCExLFwiZmFsc2VcIil9LDApKSx0aGlzLnRhYmxlU2VsZWN0aW9uPWEucXVpcmtzLnRhYmxlQ2VsbHNTZWxlY3Rpb24obCxpLnBhcmVudCkpLGIub2JzZXJ2ZShtLFwiZm9jdXNcIixmdW5jdGlvbihhKXtpLnBhcmVudC5maXJlKFwiZm9jdXNcIixhKS5maXJlKFwiZm9jdXM6Y29tcG9zZXJcIixhKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aj1pLmdldFZhbHVlKCExLCExKX0sMCl9KSxiLm9ic2VydmUobSxcImJsdXJcIixmdW5jdGlvbihhKXtpZihqIT09aS5nZXRWYWx1ZSghMSwhMSkpe3ZhciBiPWE7XCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmNyZWF0ZSYmKGI9T2JqZWN0LmNyZWF0ZShhLHt0eXBlOnt2YWx1ZTpcImNoYW5nZVwifX0pKSxpLnBhcmVudC5maXJlKFwiY2hhbmdlXCIsYikuZmlyZShcImNoYW5nZTpjb21wb3NlclwiLGIpfWkucGFyZW50LmZpcmUoXCJibHVyXCIsYSkuZmlyZShcImJsdXI6Y29tcG9zZXJcIixhKX0pLGIub2JzZXJ2ZShsLFwiZHJhZ2VudGVyXCIsZnVuY3Rpb24oKXtpLnBhcmVudC5maXJlKFwidW5zZXRfcGxhY2Vob2xkZXJcIil9KSxiLm9ic2VydmUobCxuLGZ1bmN0aW9uKGEpe2kucGFyZW50LmZpcmUoYS50eXBlLGEpLmZpcmUoYS50eXBlK1wiOmNvbXBvc2VyXCIsYSl9KSx0aGlzLmNvbmZpZy5jb3B5ZWRGcm9tTWFya2luZyYmYi5vYnNlcnZlKGwsXCJjb3B5XCIsZnVuY3Rpb24oYSl7YS5jbGlwYm9hcmREYXRhJiYoYS5jbGlwYm9hcmREYXRhLnNldERhdGEoXCJ0ZXh0L2h0bWxcIixpLmNvbmZpZy5jb3B5ZWRGcm9tTWFya2luZytpLnNlbGVjdGlvbi5nZXRIdG1sKCkpLGEucHJldmVudERlZmF1bHQoKSksaS5wYXJlbnQuZmlyZShhLnR5cGUsYSkuZmlyZShhLnR5cGUrXCI6Y29tcG9zZXJcIixhKX0pLGIub2JzZXJ2ZShsLFwia2V5dXBcIixmdW5jdGlvbihiKXt2YXIgYz1iLmtleUNvZGU7KGM9PT1hLlNQQUNFX0tFWXx8Yz09PWEuRU5URVJfS0VZKSYmaS5wYXJlbnQuZmlyZShcIm5ld3dvcmQ6Y29tcG9zZXJcIil9KSx0aGlzLnBhcmVudC5vbihcInBhc3RlOmNvbXBvc2VyXCIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5wYXJlbnQuZmlyZShcIm5ld3dvcmQ6Y29tcG9zZXJcIil9LDApfSksYy5jYW5TZWxlY3RJbWFnZXNJbkNvbnRlbnRFZGl0YWJsZSgpfHxiLm9ic2VydmUobCxcIm1vdXNlZG93blwiLGZ1bmN0aW9uKGIpe3ZhciBjPWIudGFyZ2V0LGQ9bC5xdWVyeVNlbGVjdG9yQWxsKFwiaW1nXCIpLGU9bC5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiK2kuY29uZmlnLnVuZWRpdGFibGVDb250YWluZXJDbGFzc25hbWUrXCIgaW1nXCIpLGY9YS5sYW5nLmFycmF5KGQpLndpdGhvdXQoZSk7XCJJTUdcIj09PWMubm9kZU5hbWUmJmEubGFuZy5hcnJheShmKS5jb250YWlucyhjKSYmaS5zZWxlY3Rpb24uc2VsZWN0Tm9kZShjKX0pLGMuY2FuU2VsZWN0SW1hZ2VzSW5Db250ZW50RWRpdGFibGUoKXx8Yi5vYnNlcnZlKGwsXCJkcm9wXCIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5zZWxlY3Rpb24uZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCl9LDApfSksYy5oYXNIaXN0b3J5SXNzdWUoKSYmYy5zdXBwb3J0c1NlbGVjdGlvbk1vZGlmeSgpJiZiLm9ic2VydmUobCxcImtleWRvd25cIixmdW5jdGlvbihhKXtpZihhLm1ldGFLZXl8fGEuY3RybEtleSl7dmFyIGI9YS5rZXlDb2RlLGM9bC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LGQ9Yy5nZXRTZWxlY3Rpb24oKTsoMzc9PT1ifHwzOT09PWIpJiYoMzc9PT1iJiYoZC5tb2RpZnkoXCJleHRlbmRcIixcImxlZnRcIixcImxpbmVib3VuZGFyeVwiKSxhLnNoaWZ0S2V5fHxkLmNvbGxhcHNlVG9TdGFydCgpKSwzOT09PWImJihkLm1vZGlmeShcImV4dGVuZFwiLFwicmlnaHRcIixcImxpbmVib3VuZGFyeVwiKSxhLnNoaWZ0S2V5fHxkLmNvbGxhcHNlVG9FbmQoKSksYS5wcmV2ZW50RGVmYXVsdCgpKX19KSxiLm9ic2VydmUobCxcImtleWRvd25cIixmdW5jdGlvbihhKXt2YXIgYj1hLmtleUNvZGUsYz1kW2JdOyhhLmN0cmxLZXl8fGEubWV0YUtleSkmJiFhLmFsdEtleSYmYyYmKGkuY29tbWFuZHMuZXhlYyhjKSxhLnByZXZlbnREZWZhdWx0KCkpLDg9PT1iP2YoYSxpLnNlbGVjdGlvbixsLGkpOmkuY29uZmlnLmhhbmRsZVRhYktleSYmOT09PWImJihhLnByZXZlbnREZWZhdWx0KCksZyhpLGwpKX0pLGIub2JzZXJ2ZShsLFwia2V5ZG93blwiLGZ1bmN0aW9uKGIpe3ZhciBjLGQ9aS5zZWxlY3Rpb24uZ2V0U2VsZWN0ZWROb2RlKCEwKSxlPWIua2V5Q29kZTshZHx8XCJJTUdcIiE9PWQubm9kZU5hbWV8fGUhPT1hLkJBQ0tTUEFDRV9LRVkmJmUhPT1hLkRFTEVURV9LRVl8fChjPWQucGFyZW50Tm9kZSxjLnJlbW92ZUNoaWxkKGQpLFwiQVwiIT09Yy5ub2RlTmFtZXx8Yy5maXJzdENoaWxkfHxjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyksc2V0VGltZW91dChmdW5jdGlvbigpe2EucXVpcmtzLnJlZHJhdyhsKX0sMCksYi5wcmV2ZW50RGVmYXVsdCgpKX0pLCF0aGlzLmNvbmZpZy5jb250ZW50RWRpdGFibGVNb2RlJiZjLmhhc0lmcmFtZUZvY3VzSXNzdWUoKSYmKGIub2JzZXJ2ZShrLFwiZm9jdXNcIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtpLmRvYy5xdWVyeVNlbGVjdG9yKFwiOmZvY3VzXCIpIT09aS5lbGVtZW50JiZpLmZvY3VzKCl9LDApfSksYi5vYnNlcnZlKHRoaXMuZWxlbWVudCxcImJsdXJcIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtpLnNlbGVjdGlvbi5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKX0sMCl9KSksaD17SU1HOlwiSW1hZ2U6IFwiLEE6XCJMaW5rOiBcIn0sYi5vYnNlcnZlKGwsXCJtb3VzZW92ZXJcIixmdW5jdGlvbihhKXt2YXIgYixjLGQ9YS50YXJnZXQsZT1kLm5vZGVOYW1lOyhcIkFcIj09PWV8fFwiSU1HXCI9PT1lKSYmKGM9ZC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSxjfHwoYj1oW2VdKyhkLmdldEF0dHJpYnV0ZShcImhyZWZcIil8fGQuZ2V0QXR0cmlidXRlKFwic3JjXCIpKSxkLnNldEF0dHJpYnV0ZShcInRpdGxlXCIsYikpKX0pfX0od3lzaWh0bWw1KSxmdW5jdGlvbihhKXt2YXIgYj00MDA7YS52aWV3cy5TeW5jaHJvbml6ZXI9QmFzZS5leHRlbmQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmVkaXRvcj1hLHRoaXMudGV4dGFyZWE9Yix0aGlzLmNvbXBvc2VyPWMsdGhpcy5fb2JzZXJ2ZSgpfSxmcm9tQ29tcG9zZXJUb1RleHRhcmVhOmZ1bmN0aW9uKGIpe3RoaXMudGV4dGFyZWEuc2V0VmFsdWUoYS5sYW5nLnN0cmluZyh0aGlzLmNvbXBvc2VyLmdldFZhbHVlKCExLCExKSkudHJpbSgpLGIpfSxmcm9tVGV4dGFyZWFUb0NvbXBvc2VyOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudGV4dGFyZWEuZ2V0VmFsdWUoITEsITEpO2I/dGhpcy5jb21wb3Nlci5zZXRWYWx1ZShiLGEpOih0aGlzLmNvbXBvc2VyLmNsZWFyKCksdGhpcy5lZGl0b3IuZmlyZShcInNldF9wbGFjZWhvbGRlclwiKSl9LHN5bmM6ZnVuY3Rpb24oYSl7XCJ0ZXh0YXJlYVwiPT09dGhpcy5lZGl0b3IuY3VycmVudFZpZXcubmFtZT90aGlzLmZyb21UZXh0YXJlYVRvQ29tcG9zZXIoYSk6dGhpcy5mcm9tQ29tcG9zZXJUb1RleHRhcmVhKGEpfSxfb2JzZXJ2ZTpmdW5jdGlvbigpe3ZhciBjLGQ9dGhpcyxlPXRoaXMudGV4dGFyZWEuZWxlbWVudC5mb3JtLGY9ZnVuY3Rpb24oKXtjPXNldEludGVydmFsKGZ1bmN0aW9uKCl7ZC5mcm9tQ29tcG9zZXJUb1RleHRhcmVhKCl9LGIpfSxnPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChjKSxjPW51bGx9O2YoKSxlJiYoYS5kb20ub2JzZXJ2ZShlLFwic3VibWl0XCIsZnVuY3Rpb24oKXtkLnN5bmMoITApfSksYS5kb20ub2JzZXJ2ZShlLFwicmVzZXRcIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtkLmZyb21UZXh0YXJlYVRvQ29tcG9zZXIoKX0sMCl9KSksdGhpcy5lZGl0b3Iub24oXCJjaGFuZ2Vfdmlld1wiLGZ1bmN0aW9uKGEpe1wiY29tcG9zZXJcIiE9PWF8fGM/XCJ0ZXh0YXJlYVwiPT09YSYmKGQuZnJvbUNvbXBvc2VyVG9UZXh0YXJlYSghMCksZygpKTooZC5mcm9tVGV4dGFyZWFUb0NvbXBvc2VyKCEwKSxmKCkpfSksdGhpcy5lZGl0b3Iub24oXCJkZXN0cm95OmNvbXBvc2VyXCIsZyl9fSl9KHd5c2lodG1sNSksd3lzaWh0bWw1LnZpZXdzLlRleHRhcmVhPXd5c2lodG1sNS52aWV3cy5WaWV3LmV4dGVuZCh7bmFtZTpcInRleHRhcmVhXCIsY29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmFzZShhLGIsYyksdGhpcy5fb2JzZXJ2ZSgpfSxjbGVhcjpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC52YWx1ZT1cIlwifSxnZXRWYWx1ZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlzRW1wdHkoKT9cIlwiOnRoaXMuZWxlbWVudC52YWx1ZTtyZXR1cm4gYSE9PSExJiYoYj10aGlzLnBhcmVudC5wYXJzZShiKSksYn0sc2V0VmFsdWU6ZnVuY3Rpb24oYSxiKXtiJiYoYT10aGlzLnBhcmVudC5wYXJzZShhKSksdGhpcy5lbGVtZW50LnZhbHVlPWF9LGNsZWFuVXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhcmVudC5wYXJzZSh0aGlzLmVsZW1lbnQudmFsdWUpO3RoaXMuZWxlbWVudC52YWx1ZT1hfSxoYXNQbGFjZWhvbGRlclNldDpmdW5jdGlvbigpe3ZhciBhPXd5c2lodG1sNS5icm93c2VyLnN1cHBvcnRzUGxhY2Vob2xkZXJBdHRyaWJ1dGVPbih0aGlzLmVsZW1lbnQpLGI9dGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpfHxudWxsLGM9dGhpcy5lbGVtZW50LnZhbHVlLGQ9IWM7cmV0dXJuIGEmJmR8fGM9PT1ifSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIXd5c2lodG1sNS5sYW5nLnN0cmluZyh0aGlzLmVsZW1lbnQudmFsdWUpLnRyaW0oKXx8dGhpcy5oYXNQbGFjZWhvbGRlclNldCgpfSxfb2JzZXJ2ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWxlbWVudCxiPXRoaXMucGFyZW50LGM9e2ZvY3VzaW46XCJmb2N1c1wiLGZvY3Vzb3V0OlwiYmx1clwifSxkPXd5c2lodG1sNS5icm93c2VyLnN1cHBvcnRzRXZlbnQoXCJmb2N1c2luXCIpP1tcImZvY3VzaW5cIixcImZvY3Vzb3V0XCIsXCJjaGFuZ2VcIl06W1wiZm9jdXNcIixcImJsdXJcIixcImNoYW5nZVwiXTtiLm9uKFwiYmVmb3JlbG9hZFwiLGZ1bmN0aW9uKCl7d3lzaWh0bWw1LmRvbS5vYnNlcnZlKGEsZCxmdW5jdGlvbihhKXt2YXIgZD1jW2EudHlwZV18fGEudHlwZTtiLmZpcmUoZCkuZmlyZShkK1wiOnRleHRhcmVhXCIpfSksd3lzaWh0bWw1LmRvbS5vYnNlcnZlKGEsW1wicGFzdGVcIixcImRyb3BcIl0sZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5maXJlKFwicGFzdGVcIikuZmlyZShcInBhc3RlOnRleHRhcmVhXCIpfSwwKX0pfSl9fSksZnVuY3Rpb24oYSl7dmFyIGIsYz17bmFtZTpiLHN0eWxlOiEwLHRvb2xiYXI6YixzaG93VG9vbGJhckFmdGVySW5pdDohMCxhdXRvTGluazohMCxoYW5kbGVUYWJsZXM6ITAsaGFuZGxlVGFiS2V5OiEwLHBhcnNlclJ1bGVzOnt0YWdzOnticjp7fSxzcGFuOnt9LGRpdjp7fSxwOnt9fSxjbGFzc2VzOnt9fSxwYXN0ZVBhcnNlclJ1bGVzZXRzOm51bGwscGFyc2VyOmEuZG9tLnBhcnNlLGNvbXBvc2VyQ2xhc3NOYW1lOlwid3lzaWh0bWw1LWVkaXRvclwiLGJvZHlDbGFzc05hbWU6XCJ3eXNpaHRtbDUtc3VwcG9ydGVkXCIsdXNlTGluZUJyZWFrczohMCxzdHlsZXNoZWV0czpbXSxwbGFjZWhvbGRlclRleHQ6YixzdXBwb3J0VG91Y2hEZXZpY2VzOiEwLGNsZWFuVXA6ITAsY29udGVudEVkaXRhYmxlTW9kZTohMSx1bmVkaXRhYmxlQ29udGFpbmVyQ2xhc3NuYW1lOlwid3lzaWh0bWw1LXVuZWRpdGFibGUtY29udGFpbmVyXCIsY29weWVkRnJvbU1hcmtpbmc6JzxtZXRhIG5hbWU9XCJjb3BpZWQtZnJvbVwiIGNvbnRlbnQ9XCJ3eXNpaHRtbDVcIj4nfTthLkVkaXRvcj1hLmxhbmcuRGlzcGF0Y2hlci5leHRlbmQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGIsZCl7aWYodGhpcy5lZGl0YWJsZUVsZW1lbnQ9XCJzdHJpbmdcIj09dHlwZW9mIGI/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik6Yix0aGlzLmNvbmZpZz1hLmxhbmcub2JqZWN0KHt9KS5tZXJnZShjKS5tZXJnZShkKS5nZXQoKSx0aGlzLl9pc0NvbXBhdGlibGU9YS5icm93c2VyLnN1cHBvcnRlZCgpLFwidGV4dGFyZWFcIiE9dGhpcy5lZGl0YWJsZUVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmKHRoaXMuY29uZmlnLmNvbnRlbnRFZGl0YWJsZU1vZGU9ITAsdGhpcy5jb25maWcubm9UZXh0YXJlYT0hMCksdGhpcy5jb25maWcubm9UZXh0YXJlYXx8KHRoaXMudGV4dGFyZWE9bmV3IGEudmlld3MuVGV4dGFyZWEodGhpcyx0aGlzLmVkaXRhYmxlRWxlbWVudCx0aGlzLmNvbmZpZyksdGhpcy5jdXJyZW50Vmlldz10aGlzLnRleHRhcmVhKSwhdGhpcy5faXNDb21wYXRpYmxlfHwhdGhpcy5jb25maWcuc3VwcG9ydFRvdWNoRGV2aWNlcyYmYS5icm93c2VyLmlzVG91Y2hEZXZpY2UoKSl7dmFyIGU9dGhpcztyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe2UuZmlyZShcImJlZm9yZWxvYWRcIikuZmlyZShcImxvYWRcIil9LDApLHZvaWQgMH1hLmRvbS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LHRoaXMuY29uZmlnLmJvZHlDbGFzc05hbWUpLHRoaXMuY29tcG9zZXI9bmV3IGEudmlld3MuQ29tcG9zZXIodGhpcyx0aGlzLmVkaXRhYmxlRWxlbWVudCx0aGlzLmNvbmZpZyksdGhpcy5jdXJyZW50Vmlldz10aGlzLmNvbXBvc2VyLFwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMuY29uZmlnLnBhcnNlciYmdGhpcy5faW5pdFBhcnNlcigpLHRoaXMub24oXCJiZWZvcmVsb2FkXCIsdGhpcy5oYW5kbGVCZWZvcmVMb2FkKX0saGFuZGxlQmVmb3JlTG9hZDpmdW5jdGlvbigpe3RoaXMuY29uZmlnLm5vVGV4dGFyZWF8fCh0aGlzLnN5bmNocm9uaXplcj1uZXcgYS52aWV3cy5TeW5jaHJvbml6ZXIodGhpcyx0aGlzLnRleHRhcmVhLHRoaXMuY29tcG9zZXIpKSx0aGlzLmNvbmZpZy50b29sYmFyJiYodGhpcy50b29sYmFyPW5ldyBhLnRvb2xiYXIuVG9vbGJhcih0aGlzLHRoaXMuY29uZmlnLnRvb2xiYXIsdGhpcy5jb25maWcuc2hvd1Rvb2xiYXJBZnRlckluaXQpKX0saXNDb21wYXRpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzQ29tcGF0aWJsZX0sY2xlYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJyZW50Vmlldy5jbGVhcigpLHRoaXN9LGdldFZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY3VycmVudFZpZXcuZ2V0VmFsdWUoYSxiKX0sc2V0VmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5maXJlKFwidW5zZXRfcGxhY2Vob2xkZXJcIiksYT8odGhpcy5jdXJyZW50Vmlldy5zZXRWYWx1ZShhLGIpLHRoaXMpOnRoaXMuY2xlYXIoKX0sY2xlYW5VcDpmdW5jdGlvbigpe3RoaXMuY3VycmVudFZpZXcuY2xlYW5VcCgpfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jdXJyZW50Vmlldy5mb2N1cyhhKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VycmVudFZpZXcuZGlzYWJsZSgpLHRoaXN9LGVuYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnJlbnRWaWV3LmVuYWJsZSgpLHRoaXN9LGlzRW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJyZW50Vmlldy5pc0VtcHR5KCl9LGhhc1BsYWNlaG9sZGVyU2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VycmVudFZpZXcuaGFzUGxhY2Vob2xkZXJTZXQoKX0scGFyc2U6ZnVuY3Rpb24oYixjKXt2YXIgZD10aGlzLmNvbmZpZy5jb250ZW50RWRpdGFibGVNb2RlP2RvY3VtZW50OnRoaXMuY29tcG9zZXI/dGhpcy5jb21wb3Nlci5zYW5kYm94LmdldERvY3VtZW50KCk6bnVsbCxlPXRoaXMuY29uZmlnLnBhcnNlcihiLHtydWxlczp0aGlzLmNvbmZpZy5wYXJzZXJSdWxlcyxjbGVhblVwOnRoaXMuY29uZmlnLmNsZWFuVXAsY29udGV4dDpkLHVuZWRpdGFibGVDbGFzczp0aGlzLmNvbmZpZy51bmVkaXRhYmxlQ29udGFpbmVyQ2xhc3NuYW1lLGNsZWFySW50ZXJuYWxzOmN9KTtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgYiYmYS5xdWlya3MucmVkcmF3KGIpLGV9LF9pbml0UGFyc2VyOmZ1bmN0aW9uKCl7dmFyIGIsYz10aGlzO2EuYnJvd3Nlci5zdXBwb3J0c01vZGVuUGFzdGUoKT90aGlzLm9uKFwicGFzdGU6Y29tcG9zZXJcIixmdW5jdGlvbihkKXtkLnByZXZlbnREZWZhdWx0KCksYj1hLmRvbS5nZXRQYXN0ZWRIdG1sKGQpLGImJmMuX2NsZWFuQW5kUGFzdGUoYil9KTp0aGlzLm9uKFwiYmVmb3JlcGFzdGU6Y29tcG9zZXJcIixmdW5jdGlvbihiKXtiLnByZXZlbnREZWZhdWx0KCksYS5kb20uZ2V0UGFzdGVkSHRtbFdpdGhEaXYoYy5jb21wb3NlcixmdW5jdGlvbihhKXthJiZjLl9jbGVhbkFuZFBhc3RlKGEpfSl9KX0sX2NsZWFuQW5kUGFzdGU6ZnVuY3Rpb24oYil7dmFyIGM9YS5xdWlya3MuY2xlYW5QYXN0ZWRIVE1MKGIse3JlZmVyZW5jZU5vZGU6dGhpcy5jb21wb3Nlci5lbGVtZW50LHJ1bGVzOnRoaXMuY29uZmlnLnBhc3RlUGFyc2VyUnVsZXNldHN8fFt7c2V0OnRoaXMuY29uZmlnLnBhcnNlclJ1bGVzfV0sdW5lZGl0YWJsZUNsYXNzOnRoaXMuY29uZmlnLnVuZWRpdGFibGVDb250YWluZXJDbGFzc25hbWV9KTt0aGlzLmNvbXBvc2VyLnNlbGVjdGlvbi5kZWxldGVDb250ZW50cygpLHRoaXMuY29tcG9zZXIuc2VsZWN0aW9uLmluc2VydEhUTUwoYyl9fSl9KHd5c2lodG1sNSksZnVuY3Rpb24oYSl7dmFyIGI9YS5kb20sYz1cInd5c2lodG1sNS1jb21tYW5kLWRpYWxvZy1vcGVuZWRcIixkPVwiaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWFcIixlPVwiW2RhdGEtd3lzaWh0bWw1LWRpYWxvZy1maWVsZF1cIixmPVwiZGF0YS13eXNpaHRtbDUtZGlhbG9nLWZpZWxkXCI7YS50b29sYmFyLkRpYWxvZz1hLmxhbmcuRGlzcGF0Y2hlci5leHRlbmQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7dGhpcy5saW5rPWEsdGhpcy5jb250YWluZXI9Yn0sX29ic2VydmU6ZnVuY3Rpb24oKXt2YXIgZSxmLGcsaCxpLGo7aWYoIXRoaXMuX29ic2VydmVkKXtmb3IoZT10aGlzLGY9ZnVuY3Rpb24oYSl7dmFyIGI9ZS5fc2VyaWFsaXplKCk7Yj09ZS5lbGVtZW50VG9DaGFuZ2U/ZS5maXJlKFwiZWRpdFwiLGIpOmUuZmlyZShcInNhdmVcIixiKSxlLmhpZGUoKSxhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKX0sYi5vYnNlcnZlKGUubGluayxcImNsaWNrXCIsZnVuY3Rpb24oKXtiLmhhc0NsYXNzKGUubGluayxjKSYmc2V0VGltZW91dChmdW5jdGlvbigpe2UuaGlkZSgpfSwwKX0pLGIub2JzZXJ2ZSh0aGlzLmNvbnRhaW5lcixcImtleWRvd25cIixmdW5jdGlvbihiKXt2YXIgYz1iLmtleUNvZGU7Yz09PWEuRU5URVJfS0VZJiZmKGIpLGM9PT1hLkVTQ0FQRV9LRVkmJihlLmZpcmUoXCJjYW5jZWxcIiksZS5oaWRlKCkpfSksYi5kZWxlZ2F0ZSh0aGlzLmNvbnRhaW5lcixcIltkYXRhLXd5c2lodG1sNS1kaWFsb2ctYWN0aW9uPXNhdmVdXCIsXCJjbGlja1wiLGYpLGIuZGVsZWdhdGUodGhpcy5jb250YWluZXIsXCJbZGF0YS13eXNpaHRtbDUtZGlhbG9nLWFjdGlvbj1jYW5jZWxdXCIsXCJjbGlja1wiLGZ1bmN0aW9uKGEpe2UuZmlyZShcImNhbmNlbFwiKSxlLmhpZGUoKSxhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKX0pLGc9dGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbChkKSxoPTAsaT1nLmxlbmd0aCxqPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChlLmludGVydmFsKX07aT5oO2grKyliLm9ic2VydmUoZ1toXSxcImNoYW5nZVwiLGopO3RoaXMuX29ic2VydmVkPSEwfX0sX3NlcmlhbGl6ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmVsZW1lbnRUb0NoYW5nZXx8e30sYj10aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGUpLGM9Yi5sZW5ndGgsZD0wO2M+ZDtkKyspYVtiW2RdLmdldEF0dHJpYnV0ZShmKV09YltkXS52YWx1ZTtyZXR1cm4gYX0sX2ludGVycG9sYXRlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQsZz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiOmZvY3VzXCIpLGg9dGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbChlKSxpPWgubGVuZ3RoLGo9MDtpPmo7aisrKWI9aFtqXSxiIT09ZyYmKGEmJlwiaGlkZGVuXCI9PT1iLnR5cGV8fChjPWIuZ2V0QXR0cmlidXRlKGYpLGQ9dGhpcy5lbGVtZW50VG9DaGFuZ2UmJlwiYm9vbGVhblwiIT10eXBlb2YgdGhpcy5lbGVtZW50VG9DaGFuZ2U/dGhpcy5lbGVtZW50VG9DaGFuZ2UuZ2V0QXR0cmlidXRlKGMpfHxcIlwiOmIuZGVmYXVsdFZhbHVlLGIudmFsdWU9ZCkpfSxzaG93OmZ1bmN0aW9uKGEpe2lmKCFiLmhhc0NsYXNzKHRoaXMubGluayxjKSl7dmFyIGU9dGhpcyxmPXRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoZCk7aWYodGhpcy5lbGVtZW50VG9DaGFuZ2U9YSx0aGlzLl9vYnNlcnZlKCksdGhpcy5faW50ZXJwb2xhdGUoKSxhJiYodGhpcy5pbnRlcnZhbD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2UuX2ludGVycG9sYXRlKCEwKX0sNTAwKSksYi5hZGRDbGFzcyh0aGlzLmxpbmssYyksdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheT1cIlwiLHRoaXMuZmlyZShcInNob3dcIiksZiYmIWEpdHJ5e2YuZm9jdXMoKX1jYXRjaChnKXt9fX0saGlkZTpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCksdGhpcy5lbGVtZW50VG9DaGFuZ2U9bnVsbCxiLnJlbW92ZUNsYXNzKHRoaXMubGluayxjKSx0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLHRoaXMuZmlyZShcImhpZGVcIil9fSl9KHd5c2lodG1sNSksZnVuY3Rpb24oYSl7dmFyIGI9YS5kb20sYz17cG9zaXRpb246XCJyZWxhdGl2ZVwifSxkPXtsZWZ0OjAsbWFyZ2luOjAsb3BhY2l0eTowLG92ZXJmbG93OlwiaGlkZGVuXCIscGFkZGluZzowLHBvc2l0aW9uOlwiYWJzb2x1dGVcIix0b3A6MCx6SW5kZXg6MX0sZT17Y3Vyc29yOlwiaW5oZXJpdFwiLGZvbnRTaXplOlwiNTBweFwiLGhlaWdodDpcIjUwcHhcIixtYXJnaW5Ub3A6XCItMjVweFwiLG91dGxpbmU6MCxwYWRkaW5nOjAscG9zaXRpb246XCJhYnNvbHV0ZVwiLHJpZ2h0OlwiLTRweFwiLHRvcDpcIjUwJVwifSxmPXtcIngtd2Via2l0LXNwZWVjaFwiOlwiXCIsc3BlZWNoOlwiXCJ9O2EudG9vbGJhci5TcGVlY2g9ZnVuY3Rpb24oZyxoKXt2YXIgaSxqLGssbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7cmV0dXJuIGEuYnJvd3Nlci5zdXBwb3J0c1NwZWVjaEFwaU9uKGwpPyhpPWcuZWRpdG9yLnRleHRhcmVhLmVsZW1lbnQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSxpJiYoZi5sYW5nPWkpLGo9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxhLmxhbmcub2JqZWN0KGQpLm1lcmdlKHt3aWR0aDpoLm9mZnNldFdpZHRoK1wicHhcIixoZWlnaHQ6aC5vZmZzZXRIZWlnaHQrXCJweFwifSksYi5pbnNlcnQobCkuaW50byhqKSxiLmluc2VydChqKS5pbnRvKGgpLGIuc2V0U3R5bGVzKGUpLm9uKGwpLGIuc2V0QXR0cmlidXRlcyhmKS5vbihsKSxiLnNldFN0eWxlcyhkKS5vbihqKSxiLnNldFN0eWxlcyhjKS5vbihoKSxrPVwib253ZWJraXRzcGVlY2hjaGFuZ2VcImluIGw/XCJ3ZWJraXRzcGVlY2hjaGFuZ2VcIjpcInNwZWVjaGNoYW5nZVwiLGIub2JzZXJ2ZShsLGssZnVuY3Rpb24oKXtnLmV4ZWNDb21tYW5kKFwiaW5zZXJ0VGV4dFwiLGwudmFsdWUpLGwudmFsdWU9XCJcIn0pLGIub2JzZXJ2ZShsLFwiY2xpY2tcIixmdW5jdGlvbihhKXtiLmhhc0NsYXNzKGgsXCJ3eXNpaHRtbDUtY29tbWFuZC1kaXNhYmxlZFwiKSYmYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCl9KSx2b2lkIDApOihoLnN0eWxlLmRpc3BsYXk9XCJub25lXCIsdm9pZCAwKX19KHd5c2lodG1sNSksZnVuY3Rpb24oYSl7dmFyIGI9XCJ3eXNpaHRtbDUtY29tbWFuZC1kaXNhYmxlZFwiLGM9XCJ3eXNpaHRtbDUtY29tbWFuZHMtZGlzYWJsZWRcIixkPVwid3lzaWh0bWw1LWNvbW1hbmQtYWN0aXZlXCIsZT1cInd5c2lodG1sNS1hY3Rpb24tYWN0aXZlXCIsZj1hLmRvbTthLnRvb2xiYXIuVG9vbGJhcj1CYXNlLmV4dGVuZCh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZixnLGgpe3RoaXMuZWRpdG9yPWYsdGhpcy5jb250YWluZXI9XCJzdHJpbmdcIj09dHlwZW9mIGc/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZyk6Zyx0aGlzLmNvbXBvc2VyPWYuY29tcG9zZXIsdGhpcy5fZ2V0TGlua3MoXCJjb21tYW5kXCIpLHRoaXMuX2dldExpbmtzKFwiYWN0aW9uXCIpLHRoaXMuX29ic2VydmUoKSxoJiZ0aGlzLnNob3coKSxudWxsIT1mLmNvbmZpZy5jbGFzc05hbWVDb21tYW5kRGlzYWJsZWQmJihiPWYuY29uZmlnLmNsYXNzTmFtZUNvbW1hbmREaXNhYmxlZCksbnVsbCE9Zi5jb25maWcuY2xhc3NOYW1lQ29tbWFuZHNEaXNhYmxlZCYmKGM9Zi5jb25maWcuY2xhc3NOYW1lQ29tbWFuZHNEaXNhYmxlZCksbnVsbCE9Zi5jb25maWcuY2xhc3NOYW1lQ29tbWFuZEFjdGl2ZSYmKGQ9Zi5jb25maWcuY2xhc3NOYW1lQ29tbWFuZEFjdGl2ZSksbnVsbCE9Zi5jb25maWcuY2xhc3NOYW1lQWN0aW9uQWN0aXZlJiYoZT1mLmNvbmZpZy5jbGFzc05hbWVBY3Rpb25BY3RpdmUpO2Zvcih2YXIgaT10aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtd3lzaWh0bWw1LWNvbW1hbmQ9aW5zZXJ0U3BlZWNoXVwiKSxqPWkubGVuZ3RoLGs9MDtqPms7aysrKW5ldyBhLnRvb2xiYXIuU3BlZWNoKHRoaXMsaVtrXSl9LF9nZXRMaW5rczpmdW5jdGlvbihiKXtmb3IodmFyIGMsZCxlLGYsZyxoPXRoaXNbYitcIkxpbmtzXCJdPWEubGFuZy5hcnJheSh0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtd3lzaWh0bWw1LVwiK2IrXCJdXCIpKS5nZXQoKSxpPWgubGVuZ3RoLGo9MCxrPXRoaXNbYitcIk1hcHBpbmdcIl09e307aT5qO2orKyljPWhbal0sZT1jLmdldEF0dHJpYnV0ZShcImRhdGEtd3lzaWh0bWw1LVwiK2IpLGY9Yy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXd5c2lodG1sNS1cIitiK1wiLXZhbHVlXCIpLGQ9dGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcihcIltkYXRhLXd5c2lodG1sNS1cIitiK1wiLWdyb3VwPSdcIitlK1wiJ11cIiksZz10aGlzLl9nZXREaWFsb2coYyxlKSxrW2UrXCI6XCIrZl09e2xpbms6Yyxncm91cDpkLG5hbWU6ZSx2YWx1ZTpmLGRpYWxvZzpnLHN0YXRlOiExfX0sX2dldERpYWxvZzpmdW5jdGlvbihiLGMpe3ZhciBkLGUsZj10aGlzLGc9dGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcihcIltkYXRhLXd5c2lodG1sNS1kaWFsb2c9J1wiK2MrXCInXVwiKTtyZXR1cm4gZyYmKGQ9YS50b29sYmFyW1wiRGlhbG9nX1wiK2NdP25ldyBhLnRvb2xiYXJbXCJEaWFsb2dfXCIrY10oYixnKTpuZXcgYS50b29sYmFyLkRpYWxvZyhiLGcpLGQub24oXCJzaG93XCIsZnVuY3Rpb24oKXtlPWYuY29tcG9zZXIuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCksZi5lZGl0b3IuZmlyZShcInNob3c6ZGlhbG9nXCIse2NvbW1hbmQ6YyxkaWFsb2dDb250YWluZXI6Zyxjb21tYW5kTGluazpifSl9KSxkLm9uKFwic2F2ZVwiLGZ1bmN0aW9uKGEpe2UmJmYuY29tcG9zZXIuc2VsZWN0aW9uLnNldEJvb2ttYXJrKGUpLGYuX2V4ZWNDb21tYW5kKGMsYSksZi5lZGl0b3IuZmlyZShcInNhdmU6ZGlhbG9nXCIse2NvbW1hbmQ6YyxkaWFsb2dDb250YWluZXI6Zyxjb21tYW5kTGluazpifSl9KSxkLm9uKFwiY2FuY2VsXCIsZnVuY3Rpb24oKXtmLmVkaXRvci5mb2N1cyghMSksZi5lZGl0b3IuZmlyZShcImNhbmNlbDpkaWFsb2dcIix7Y29tbWFuZDpjLGRpYWxvZ0NvbnRhaW5lcjpnLGNvbW1hbmRMaW5rOmJ9KX0pKSxkfSxleGVjQ29tbWFuZDpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLmNvbW1hbmRzRGlzYWJsZWQpe3ZhciBjPXRoaXMuY29tbWFuZE1hcHBpbmdbYStcIjpcIitiXTtjJiZjLmRpYWxvZyYmIWMuc3RhdGU/Yy5kaWFsb2cuc2hvdygpOnRoaXMuX2V4ZWNDb21tYW5kKGEsYil9fSxfZXhlY0NvbW1hbmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmVkaXRvci5mb2N1cyghMSksdGhpcy5jb21wb3Nlci5jb21tYW5kcy5leGVjKGEsYiksdGhpcy5fdXBkYXRlTGlua1N0YXRlcygpfSxleGVjQWN0aW9uOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZWRpdG9yO1wiY2hhbmdlX3ZpZXdcIj09PWEmJmIudGV4dGFyZWEmJihiLmN1cnJlbnRWaWV3PT09Yi50ZXh0YXJlYT9iLmZpcmUoXCJjaGFuZ2Vfdmlld1wiLFwiY29tcG9zZXJcIik6Yi5maXJlKFwiY2hhbmdlX3ZpZXdcIixcInRleHRhcmVhXCIpKSxcInNob3dTb3VyY2VcIj09YSYmYi5maXJlKFwic2hvd1NvdXJjZVwiKX0sX29ic2VydmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcyxiPXRoaXMuZWRpdG9yLGQ9dGhpcy5jb250YWluZXIsZT10aGlzLmNvbW1hbmRMaW5rcy5jb25jYXQodGhpcy5hY3Rpb25MaW5rcyksZz1lLmxlbmd0aCxoPTA7Zz5oO2grKylcIkFcIj09PWVbaF0ubm9kZU5hbWU/Zi5zZXRBdHRyaWJ1dGVzKHtocmVmOlwiamF2YXNjcmlwdDo7XCIsdW5zZWxlY3RhYmxlOlwib25cIn0pLm9uKGVbaF0pOmYuc2V0QXR0cmlidXRlcyh7dW5zZWxlY3RhYmxlOlwib25cIn0pLm9uKGVbaF0pO2YuZGVsZWdhdGUoZCxcIltkYXRhLXd5c2lodG1sNS1jb21tYW5kXSwgW2RhdGEtd3lzaWh0bWw1LWFjdGlvbl1cIixcIm1vdXNlZG93blwiLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKX0pLGYuZGVsZWdhdGUoZCxcIltkYXRhLXd5c2lodG1sNS1jb21tYW5kXVwiLFwiY2xpY2tcIixmdW5jdGlvbihiKXt2YXIgYz10aGlzLGQ9Yy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXd5c2lodG1sNS1jb21tYW5kXCIpLGU9Yy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlXCIpO2EuZXhlY0NvbW1hbmQoZCxlKSxiLnByZXZlbnREZWZhdWx0KCl9KSxmLmRlbGVnYXRlKGQsXCJbZGF0YS13eXNpaHRtbDUtYWN0aW9uXVwiLFwiY2xpY2tcIixmdW5jdGlvbihiKXt2YXIgYz10aGlzLmdldEF0dHJpYnV0ZShcImRhdGEtd3lzaWh0bWw1LWFjdGlvblwiKTthLmV4ZWNBY3Rpb24oYyksYi5wcmV2ZW50RGVmYXVsdCgpfSksYi5vbihcImludGVyYWN0aW9uOmNvbXBvc2VyXCIsZnVuY3Rpb24oKXthLl91cGRhdGVMaW5rU3RhdGVzKCl9KSxiLm9uKFwiZm9jdXM6Y29tcG9zZXJcIixmdW5jdGlvbigpe2EuYm9va21hcms9bnVsbH0pLHRoaXMuZWRpdG9yLmNvbmZpZy5oYW5kbGVUYWJsZXMmJihiLm9uKFwidGFibGVzZWxlY3Q6Y29tcG9zZXJcIixmdW5jdGlvbigpe2EuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXd5c2lodG1sNS1oaWRkZW50b29scz1cInRhYmxlXCJdJylbMF0uc3R5bGUuZGlzcGxheT1cIlwifSksYi5vbihcInRhYmxldW5zZWxlY3Q6Y29tcG9zZXJcIixmdW5jdGlvbigpe2EuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXd5c2lodG1sNS1oaWRkZW50b29scz1cInRhYmxlXCJdJylbMF0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIn0pKSxiLm9uKFwiY2hhbmdlX3ZpZXdcIixmdW5jdGlvbihlKXtiLnRleHRhcmVhJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5jb21tYW5kc0Rpc2FibGVkPVwiY29tcG9zZXJcIiE9PWUsYS5fdXBkYXRlTGlua1N0YXRlcygpLGEuY29tbWFuZHNEaXNhYmxlZD9mLmFkZENsYXNzKGQsYyk6Zi5yZW1vdmVDbGFzcyhkLGMpfSwwKX0pfSxfdXBkYXRlTGlua1N0YXRlczpmdW5jdGlvbigpe3ZhciBjLGcsaCxpLGo9dGhpcy5jb21tYW5kTWFwcGluZyxrPXRoaXMuYWN0aW9uTWFwcGluZztmb3IoYyBpbiBqKWk9altjXSx0aGlzLmNvbW1hbmRzRGlzYWJsZWQ/KGc9ITEsZi5yZW1vdmVDbGFzcyhpLmxpbmssZCksaS5ncm91cCYmZi5yZW1vdmVDbGFzcyhpLmdyb3VwLGQpLGkuZGlhbG9nJiZpLmRpYWxvZy5oaWRlKCkpOihnPXRoaXMuY29tcG9zZXIuY29tbWFuZHMuc3RhdGUoaS5uYW1lLGkudmFsdWUpLGYucmVtb3ZlQ2xhc3MoaS5saW5rLGIpLGkuZ3JvdXAmJmYucmVtb3ZlQ2xhc3MoaS5ncm91cCxiKSksaS5zdGF0ZSE9PWcmJihpLnN0YXRlPWcsZz8oZi5hZGRDbGFzcyhpLmxpbmssZCksaS5ncm91cCYmZi5hZGRDbGFzcyhpLmdyb3VwLGQpLGkuZGlhbG9nJiYoXCJvYmplY3RcIj09dHlwZW9mIGd8fGEubGFuZy5vYmplY3QoZykuaXNBcnJheSgpPyghaS5kaWFsb2cubXVsdGlzZWxlY3QmJmEubGFuZy5vYmplY3QoZykuaXNBcnJheSgpJiYoZz0xPT09Zy5sZW5ndGg/Z1swXTohMCxpLnN0YXRlPWcpLGkuZGlhbG9nLnNob3coZykpOmkuZGlhbG9nLmhpZGUoKSkpOihmLnJlbW92ZUNsYXNzKGkubGluayxkKSxpLmdyb3VwJiZmLnJlbW92ZUNsYXNzKGkuZ3JvdXAsZCksaS5kaWFsb2cmJmkuZGlhbG9nLmhpZGUoKSkpO2ZvcihjIGluIGspaD1rW2NdLFwiY2hhbmdlX3ZpZXdcIj09PWgubmFtZSYmKGguc3RhdGU9dGhpcy5lZGl0b3IuY3VycmVudFZpZXc9PT10aGlzLmVkaXRvci50ZXh0YXJlYSxoLnN0YXRlP2YuYWRkQ2xhc3MoaC5saW5rLGUpOmYucmVtb3ZlQ2xhc3MoaC5saW5rLGUpKX0sc2hvdzpmdW5jdGlvbigpe3RoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXk9XCJcIn0saGlkZTpmdW5jdGlvbigpe3RoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXk9XCJub25lXCJ9fSl9KHd5c2lodG1sNSksZnVuY3Rpb24oYSl7YS50b29sYmFyLkRpYWxvZ19jcmVhdGVUYWJsZT1hLnRvb2xiYXIuRGlhbG9nLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihhKXt0aGlzLmJhc2UoYSl9fSl9KHd5c2lodG1sNSksZnVuY3Rpb24oYSl7dmFyIGI9KGEuZG9tLFwiW2RhdGEtd3lzaWh0bWw1LWRpYWxvZy1maWVsZF1cIiksYz1cImRhdGEtd3lzaWh0bWw1LWRpYWxvZy1maWVsZFwiO2EudG9vbGJhci5EaWFsb2dfZm9yZUNvbG9yU3R5bGU9YS50b29sYmFyLkRpYWxvZy5leHRlbmQoe211bHRpc2VsZWN0OiEwLF9zZXJpYWxpemU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9e30sZD10aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGIpLGU9ZC5sZW5ndGgsZj0wO2U+ZjtmKyspYVtkW2ZdLmdldEF0dHJpYnV0ZShjKV09ZFtmXS52YWx1ZTtyZXR1cm4gYX0sX2ludGVycG9sYXRlOmZ1bmN0aW9uKGQpe2Zvcih2YXIgZSxmPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCI6Zm9jdXNcIiksZz10aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGIpLGg9Zy5sZW5ndGgsaT0wLGo9dGhpcy5lbGVtZW50VG9DaGFuZ2U/YS5sYW5nLm9iamVjdCh0aGlzLmVsZW1lbnRUb0NoYW5nZSkuaXNBcnJheSgpP3RoaXMuZWxlbWVudFRvQ2hhbmdlWzBdOnRoaXMuZWxlbWVudFRvQ2hhbmdlOm51bGwsaz1qP2ouZ2V0QXR0cmlidXRlKFwic3R5bGVcIik6bnVsbCxsPWs/YS5xdWlya3Muc3R5bGVQYXJzZXIucGFyc2VDb2xvcihrLFwiY29sb3JcIik6bnVsbDtoPmk7aSsrKWU9Z1tpXSxlIT09ZiYmKGQmJlwiaGlkZGVuXCI9PT1lLnR5cGV8fFwiY29sb3JcIj09PWUuZ2V0QXR0cmlidXRlKGMpJiYoZS52YWx1ZT1sP2xbM10mJjEhPWxbM10/XCJyZ2JhKFwiK2xbMF0rXCIsXCIrbFsxXStcIixcIitsWzJdK1wiLFwiK2xbM10rXCIpO1wiOlwicmdiKFwiK2xbMF0rXCIsXCIrbFsxXStcIixcIitsWzJdK1wiKTtcIjpcInJnYigwLDAsMCk7XCIpKX19KX0od3lzaWh0bWw1KSxmdW5jdGlvbihhKXthLmRvbTthLnRvb2xiYXIuRGlhbG9nX2ZvbnRTaXplU3R5bGU9YS50b29sYmFyLkRpYWxvZy5leHRlbmQoe211bHRpc2VsZWN0OiEwLF9zZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm57c2l6ZTp0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS13eXNpaHRtbDUtZGlhbG9nLWZpZWxkPVwic2l6ZVwiXScpLnZhbHVlfX0sX2ludGVycG9sYXRlOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIjpmb2N1c1wiKSxjPXRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCJbZGF0YS13eXNpaHRtbDUtZGlhbG9nLWZpZWxkPSdzaXplJ11cIiksZD10aGlzLmVsZW1lbnRUb0NoYW5nZT9hLmxhbmcub2JqZWN0KHRoaXMuZWxlbWVudFRvQ2hhbmdlKS5pc0FycmF5KCk/dGhpcy5lbGVtZW50VG9DaGFuZ2VbMF06dGhpcy5lbGVtZW50VG9DaGFuZ2U6bnVsbCxlPWQ/ZC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKTpudWxsLGY9ZT9hLnF1aXJrcy5zdHlsZVBhcnNlci5wYXJzZUZvbnRTaXplKGUpOm51bGw7YyYmYyE9PWImJmYmJiEvXlxccyokLy50ZXN0KGYpJiYoYy52YWx1ZT1mKX19KX0od3lzaWh0bWw1KSxIYW5kbGViYXJzPWZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBhKGEpe3RoaXMuc3RyaW5nPWF9dmFyIGI7cmV0dXJuIGEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJcIit0aGlzLnN0cmluZ30sYj1hfSgpLGI9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYihhKXtyZXR1cm4ga1thXXx8XCImYW1wO1wifWZ1bmN0aW9uIGMoYSxiKXtmb3IodmFyIGMgaW4gYilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYixjKSYmKGFbY109YltjXSl9ZnVuY3Rpb24gZChhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIGo/XCJcIithOmF8fDA9PT1hPyhhPVwiXCIrYSxtLnRlc3QoYSk/YS5yZXBsYWNlKGwsYik6YSk6XCJcIn1mdW5jdGlvbiBlKGEpe3JldHVybiBhfHwwPT09YT9oKGEpJiYwPT09YS5sZW5ndGg/ITA6ITE6ITB9dmFyIGYsZyxoLGk9e30saj1hLGs9e1wiJlwiOlwiJmFtcDtcIixcIjxcIjpcIiZsdDtcIixcIj5cIjpcIiZndDtcIiwnXCInOlwiJnF1b3Q7XCIsXCInXCI6XCImI3gyNztcIixcImBcIjpcIiYjeDYwO1wifSxsPS9bJjw+XCInYF0vZyxtPS9bJjw+XCInYF0vO3JldHVybiBpLmV4dGVuZD1jLGY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxpLnRvU3RyaW5nPWYsZz1mdW5jdGlvbihhKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBhfSxnKC94LykmJihnPWZ1bmN0aW9uKGEpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGEmJlwiW29iamVjdCBGdW5jdGlvbl1cIj09PWYuY2FsbChhKX0pLGkuaXNGdW5jdGlvbj1nLGg9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJlwib2JqZWN0XCI9PXR5cGVvZiBhP1wiW29iamVjdCBBcnJheV1cIj09PWYuY2FsbChhKTohMX0saS5pc0FycmF5PWgsaS5lc2NhcGVFeHByZXNzaW9uPWQsaS5pc0VtcHR5PWUsaX0oYSksYz1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGEoYSxiKXt2YXIgZCxlLGY7Zm9yKGImJmIuZmlyc3RMaW5lJiYoZD1iLmZpcnN0TGluZSxhKz1cIiAtIFwiK2QrXCI6XCIrYi5maXJzdENvbHVtbiksZT1FcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpLGY9MDtmPGMubGVuZ3RoO2YrKyl0aGlzW2NbZl1dPWVbY1tmXV07ZCYmKHRoaXMubGluZU51bWJlcj1kLHRoaXMuY29sdW1uPWIuZmlyc3RDb2x1bW4pfXZhciBiLGM9W1wiZGVzY3JpcHRpb25cIixcImZpbGVOYW1lXCIsXCJsaW5lTnVtYmVyXCIsXCJtZXNzYWdlXCIsXCJuYW1lXCIsXCJudW1iZXJcIixcInN0YWNrXCJdO3JldHVybiBhLnByb3RvdHlwZT1FcnJvcigpLGI9YX0oKSxkPWZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYyhhLGIpe3RoaXMuaGVscGVycz1hfHx7fSx0aGlzLnBhcnRpYWxzPWJ8fHt9LGQodGhpcyl9ZnVuY3Rpb24gZChhKXthLnJlZ2lzdGVySGVscGVyKFwiaGVscGVyTWlzc2luZ1wiLGZ1bmN0aW9uKGEpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA7dGhyb3cgbmV3IHAoXCJNaXNzaW5nIGhlbHBlcjogJ1wiK2ErXCInXCIpfSksYS5yZWdpc3RlckhlbHBlcihcImJsb2NrSGVscGVyTWlzc2luZ1wiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5pbnZlcnNlfHxmdW5jdGlvbigpe30sZT1jLmZuO3JldHVybiBpKGIpJiYoYj1iLmNhbGwodGhpcykpLGI9PT0hMD9lKHRoaXMpOmI9PT0hMXx8bnVsbD09Yj9kKHRoaXMpOmgoYik/Yi5sZW5ndGg+MD9hLmhlbHBlcnMuZWFjaChiLGMpOmQodGhpcyk6ZShiKX0pLGEucmVnaXN0ZXJIZWxwZXIoXCJlYWNoXCIsZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj1iLmZuLGc9Yi5pbnZlcnNlLGo9MCxrPVwiXCI7aWYoaShhKSYmKGE9YS5jYWxsKHRoaXMpKSxiLmRhdGEmJihjPW0oYi5kYXRhKSksYSYmXCJvYmplY3RcIj09dHlwZW9mIGEpaWYoaChhKSlmb3IoZD1hLmxlbmd0aDtkPmo7aisrKWMmJihjLmluZGV4PWosYy5maXJzdD0wPT09aixjLmxhc3Q9aj09PWEubGVuZ3RoLTEpLGsrPWYoYVtqXSx7ZGF0YTpjfSk7ZWxzZSBmb3IoZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJihjJiYoYy5rZXk9ZSxjLmluZGV4PWosYy5maXJzdD0wPT09aiksays9ZihhW2VdLHtkYXRhOmN9KSxqKyspO3JldHVybiAwPT09aiYmKGs9Zyh0aGlzKSksa30pLGEucmVnaXN0ZXJIZWxwZXIoXCJpZlwiLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGkoYSkmJihhPWEuY2FsbCh0aGlzKSksIWIuaGFzaC5pbmNsdWRlWmVybyYmIWF8fG8uaXNFbXB0eShhKT9iLmludmVyc2UodGhpcyk6Yi5mbih0aGlzKX0pLGEucmVnaXN0ZXJIZWxwZXIoXCJ1bmxlc3NcIixmdW5jdGlvbihiLGMpe3JldHVybiBhLmhlbHBlcnNbXCJpZlwiXS5jYWxsKHRoaXMsYix7Zm46Yy5pbnZlcnNlLGludmVyc2U6Yy5mbixoYXNoOmMuaGFzaH0pfSksYS5yZWdpc3RlckhlbHBlcihcIndpdGhcIixmdW5jdGlvbihhLGIpe3JldHVybiBpKGEpJiYoYT1hLmNhbGwodGhpcykpLG8uaXNFbXB0eShhKT92b2lkIDA6Yi5mbihhKX0pLGEucmVnaXN0ZXJIZWxwZXIoXCJsb2dcIixmdW5jdGlvbihiLGMpe3ZhciBkPWMuZGF0YSYmbnVsbCE9Yy5kYXRhLmxldmVsP3BhcnNlSW50KGMuZGF0YS5sZXZlbCwxMCk6MTthLmxvZyhkLGIpfSl9ZnVuY3Rpb24gZShhLGIpe2wubG9nKGEsYil9dmFyIGYsZyxoLGksaixrLGwsbSxuPXt9LG89YSxwPWIscT1cIjEuMy4wXCI7cmV0dXJuIG4uVkVSU0lPTj1xLGY9NCxuLkNPTVBJTEVSX1JFVklTSU9OPWYsZz17MTpcIjw9IDEuMC5yYy4yXCIsMjpcIj09IDEuMC4wLXJjLjNcIiwzOlwiPT0gMS4wLjAtcmMuNFwiLDQ6XCI+PSAxLjAuMFwifSxuLlJFVklTSU9OX0NIQU5HRVM9ZyxoPW8uaXNBcnJheSxpPW8uaXNGdW5jdGlvbixqPW8udG9TdHJpbmcsaz1cIltvYmplY3QgT2JqZWN0XVwiLG4uSGFuZGxlYmFyc0Vudmlyb25tZW50PWMsYy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmMsbG9nZ2VyOmwsbG9nOmUscmVnaXN0ZXJIZWxwZXI6ZnVuY3Rpb24oYSxiLGMpe2lmKGouY2FsbChhKT09PWspe2lmKGN8fGIpdGhyb3cgbmV3IHAoXCJBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnNcIik7by5leHRlbmQodGhpcy5oZWxwZXJzLGEpfWVsc2UgYyYmKGIubm90PWMpLHRoaXMuaGVscGVyc1thXT1ifSxyZWdpc3RlclBhcnRpYWw6ZnVuY3Rpb24oYSxiKXtqLmNhbGwoYSk9PT1rP28uZXh0ZW5kKHRoaXMucGFydGlhbHMsYSk6dGhpcy5wYXJ0aWFsc1thXT1ifX0sbD17bWV0aG9kTWFwOnswOlwiZGVidWdcIiwxOlwiaW5mb1wiLDI6XCJ3YXJuXCIsMzpcImVycm9yXCJ9LERFQlVHOjAsSU5GTzoxLFdBUk46MixFUlJPUjozLGxldmVsOjMsbG9nOmZ1bmN0aW9uKGEsYil7aWYobC5sZXZlbDw9YSl7dmFyIGM9bC5tZXRob2RNYXBbYV07XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGNvbnNvbGUmJmNvbnNvbGVbY10mJmNvbnNvbGVbY10uY2FsbChjb25zb2xlLGIpfX19LG4ubG9nZ2VyPWwsbi5sb2c9ZSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXt9O3JldHVybiBvLmV4dGVuZChiLGEpLGJ9LG4uY3JlYXRlRnJhbWU9bSxufShiLGMpLGU9ZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGQoYSl7dmFyIGIsYyxkPWEmJmFbMF18fDEsZT1tO2lmKGQhPT1lKXtpZihlPmQpdGhyb3cgYj1uW2VdLGM9bltkXSxuZXcgbChcIlRlbXBsYXRlIHdhcyBwcmVjb21waWxlZCB3aXRoIGFuIG9sZGVyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuIFBsZWFzZSB1cGRhdGUgeW91ciBwcmVjb21waWxlciB0byBhIG5ld2VyIHZlcnNpb24gKFwiK2IrXCIpIG9yIGRvd25ncmFkZSB5b3VyIHJ1bnRpbWUgdG8gYW4gb2xkZXIgdmVyc2lvbiAoXCIrYytcIikuXCIpO3Rocm93IG5ldyBsKFwiVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUgY3VycmVudCBydW50aW1lLiBQbGVhc2UgdXBkYXRlIHlvdXIgcnVudGltZSB0byBhIG5ld2VyIHZlcnNpb24gKFwiK2FbMV0rXCIpLlwiKX19ZnVuY3Rpb24gZShhLGIpe2lmKCFiKXRocm93IG5ldyBsKFwiTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlXCIpO3ZhciBjPWZ1bmN0aW9uKGEsYyxkLGUsZixnKXt2YXIgaCxpPWIuVk0uaW52b2tlUGFydGlhbC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYobnVsbCE9aSlyZXR1cm4gaTtpZihiLmNvbXBpbGUpcmV0dXJuIGg9e2hlbHBlcnM6ZSxwYXJ0aWFsczpmLGRhdGE6Z30sZltjXT1iLmNvbXBpbGUoYSx7ZGF0YTp2b2lkIDAhPT1nfSxiKSxmW2NdKGQsaCk7dGhyb3cgbmV3IGwoXCJUaGUgcGFydGlhbCBcIitjK1wiIGNvdWxkIG5vdCBiZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGVcIil9LGQ9e2VzY2FwZUV4cHJlc3Npb246ay5lc2NhcGVFeHByZXNzaW9uLGludm9rZVBhcnRpYWw6Yyxwcm9ncmFtczpbXSxwcm9ncmFtOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLnByb2dyYW1zW2FdO3JldHVybiBjP2Q9ZyhhLGIsYyk6ZHx8KGQ9dGhpcy5wcm9ncmFtc1thXT1nKGEsYikpLGR9LG1lcmdlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YXx8YjtyZXR1cm4gYSYmYiYmYSE9PWImJihjPXt9LGsuZXh0ZW5kKGMsYiksay5leHRlbmQoYyxhKSksY30scHJvZ3JhbVdpdGhEZXB0aDpiLlZNLnByb2dyYW1XaXRoRGVwdGgsbm9vcDpiLlZNLm5vb3AsY29tcGlsZXJJbmZvOm51bGx9O3JldHVybiBmdW5jdGlvbihjLGUpe3ZhciBmLGcsaCxpO3JldHVybiBlPWV8fHt9LGg9ZS5wYXJ0aWFsP2U6YixlLnBhcnRpYWx8fChmPWUuaGVscGVycyxnPWUucGFydGlhbHMpLGk9YS5jYWxsKGQsaCxjLGYsZyxlLmRhdGEpLGUucGFydGlhbHx8Yi5WTS5jaGVja1JldmlzaW9uKGQuY29tcGlsZXJJbmZvKSxpfX1mdW5jdGlvbiBmKGEsYixjKXt2YXIgZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMyksZT1mdW5jdGlvbihhLGUpe3JldHVybiBlPWV8fHt9LGIuYXBwbHkodGhpcyxbYSxlLmRhdGF8fGNdLmNvbmNhdChkKSl9O3JldHVybiBlLnByb2dyYW09YSxlLmRlcHRoPWQubGVuZ3RoLGV9ZnVuY3Rpb24gZyhhLGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSxkKXtyZXR1cm4gZD1kfHx7fSxiKGEsZC5kYXRhfHxjKX07cmV0dXJuIGQucHJvZ3JhbT1hLGQuZGVwdGg9MCxkfWZ1bmN0aW9uIGgoYSxiLGMsZCxlLGYpe3ZhciBnPXtwYXJ0aWFsOiEwLGhlbHBlcnM6ZCxwYXJ0aWFsczplLGRhdGE6Zn07aWYodm9pZCAwPT09YSl0aHJvdyBuZXcgbChcIlRoZSBwYXJ0aWFsIFwiK2IrXCIgY291bGQgbm90IGJlIGZvdW5kXCIpO3JldHVybiBhIGluc3RhbmNlb2YgRnVuY3Rpb24/YShjLGcpOnZvaWQgMH1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn12YXIgaj17fSxrPWEsbD1iLG09Yy5DT01QSUxFUl9SRVZJU0lPTixuPWMuUkVWSVNJT05fQ0hBTkdFUztyZXR1cm4gai5jaGVja1JldmlzaW9uPWQsai50ZW1wbGF0ZT1lLGoucHJvZ3JhbVdpdGhEZXB0aD1mLGoucHJvZ3JhbT1nLGouaW52b2tlUGFydGlhbD1oLGoubm9vcD1pLGp9KGIsYyxkKSxmPWZ1bmN0aW9uKGEsYixjLGQsZSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGYsZz1hLGg9YixpPWMsaj1kLGs9ZSxsPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGcuSGFuZGxlYmFyc0Vudmlyb25tZW50O3JldHVybiBqLmV4dGVuZChhLGcpLGEuU2FmZVN0cmluZz1oLGEuRXhjZXB0aW9uPWksYS5VdGlscz1qLGEuVk09ayxhLnRlbXBsYXRlPWZ1bmN0aW9uKGIpe3JldHVybiBrLnRlbXBsYXRlKGIsYSl9LGF9LG09bCgpO3JldHVybiBtLmNyZWF0ZT1sLGY9bX0oZCxhLGMsYixlKTtyZXR1cm4gZn0oKSx0aGlzLnd5c2lodG1sNT10aGlzLnd5c2lodG1sNXx8e30sdGhpcy53eXNpaHRtbDUudHBsPXRoaXMud3lzaWh0bWw1LnRwbHx8e30sdGhpcy53eXNpaHRtbDUudHBsLmJsb2NrcXVvdGU9SGFuZGxlYmFycy50ZW1wbGF0ZShmdW5jdGlvbihhLGIsYyxkLGUpe2Z1bmN0aW9uIGYoYSl7dmFyIGIsYz1cIlwiO3JldHVybiBjKz1cImJ0bi1cIitsKChiPWEmJmEub3B0aW9ucyxiPW51bGw9PWJ8fGI9PT0hMT9iOmIudG9vbGJhcixiPW51bGw9PWJ8fGI9PT0hMT9iOmIuc2l6ZSx0eXBlb2YgYj09PWs/Yi5hcHBseShhKTpiKSksY31mdW5jdGlvbiBnKCl7cmV0dXJuJyBcXG4gICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXF1b3RlLWxlZnRcIj48L3NwYW4+XFxuICAgICd9ZnVuY3Rpb24gaCgpe3JldHVybidcXG4gICAgICA8c3BhbiBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tcXVvdGVcIj48L3NwYW4+XFxuICAgICd9dGhpcy5jb21waWxlckluZm89WzQsXCI+PSAxLjAuMFwiXSxjPXRoaXMubWVyZ2UoYyxhLmhlbHBlcnMpLGU9ZXx8e307dmFyIGksaj1cIlwiLGs9XCJmdW5jdGlvblwiLGw9dGhpcy5lc2NhcGVFeHByZXNzaW9uLG09dGhpcztyZXR1cm4gais9JzxsaT5cXG4gIDxhIGNsYXNzPVwiYnRuICcsaT1jW1wiaWZcIl0uY2FsbChiLChpPWImJmIub3B0aW9ucyxpPW51bGw9PWl8fGk9PT0hMT9pOmkudG9vbGJhcixudWxsPT1pfHxpPT09ITE/aTppLnNpemUpLHtoYXNoOnt9LGludmVyc2U6bS5ub29wLGZuOm0ucHJvZ3JhbSgxLGYsZSksZGF0YTplfSksKGl8fDA9PT1pKSYmKGorPWkpLGorPScgYnRuLWRlZmF1bHRcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kPVwiZm9ybWF0QmxvY2tcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwiYmxvY2txdW90ZVwiIGRhdGEtd3lzaWh0bWw1LWRpc3BsYXktZm9ybWF0LW5hbWU9XCJmYWxzZVwiIHRhYmluZGV4PVwiLTFcIj5cXG4gICAgJyxpPWNbXCJpZlwiXS5jYWxsKGIsKGk9YiYmYi5vcHRpb25zLGk9bnVsbD09aXx8aT09PSExP2k6aS50b29sYmFyLG51bGw9PWl8fGk9PT0hMT9pOmkuZmEpLHtoYXNoOnt9LGludmVyc2U6bS5wcm9ncmFtKDUsaCxlKSxmbjptLnByb2dyYW0oMyxnLGUpLGRhdGE6ZX0pLChpfHwwPT09aSkmJihqKz1pKSxqKz1cIlxcbiAgPC9hPlxcbjwvbGk+XFxuXCIsan0pLHRoaXMud3lzaWh0bWw1LnRwbC5jb2xvcj1IYW5kbGViYXJzLnRlbXBsYXRlKGZ1bmN0aW9uKGEsYixjLGQsZSl7ZnVuY3Rpb24gZihhKXt2YXIgYixjPVwiXCI7cmV0dXJuIGMrPVwiYnRuLVwiK2ooKGI9YSYmYS5vcHRpb25zLGI9bnVsbD09Ynx8Yj09PSExP2I6Yi50b29sYmFyLGI9bnVsbD09Ynx8Yj09PSExP2I6Yi5zaXplLHR5cGVvZiBiPT09aT9iLmFwcGx5KGEpOmIpKSxjfXRoaXMuY29tcGlsZXJJbmZvPVs0LFwiPj0gMS4wLjBcIl0sYz10aGlzLm1lcmdlKGMsYS5oZWxwZXJzKSxlPWV8fHt9O3ZhciBnLGg9XCJcIixpPVwiZnVuY3Rpb25cIixqPXRoaXMuZXNjYXBlRXhwcmVzc2lvbixrPXRoaXM7cmV0dXJuIGgrPSc8bGkgY2xhc3M9XCJkcm9wZG93blwiPlxcbiAgPGEgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgZHJvcGRvd24tdG9nZ2xlICcsZz1jW1wiaWZcIl0uY2FsbChiLChnPWImJmIub3B0aW9ucyxnPW51bGw9PWd8fGc9PT0hMT9nOmcudG9vbGJhcixudWxsPT1nfHxnPT09ITE/ZzpnLnNpemUpLHtoYXNoOnt9LGludmVyc2U6ay5ub29wLGZuOmsucHJvZ3JhbSgxLGYsZSksZGF0YTplfSksKGd8fDA9PT1nKSYmKGgrPWcpLGgrPSdcIiBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCIgdGFiaW5kZXg9XCItMVwiPlxcbiAgICA8c3BhbiBjbGFzcz1cImN1cnJlbnQtY29sb3JcIj4nK2ooKGc9YiYmYi5sb2NhbGUsZz1udWxsPT1nfHxnPT09ITE/ZzpnLmNvbG91cnMsZz1udWxsPT1nfHxnPT09ITE/ZzpnLmJsYWNrLHR5cGVvZiBnPT09aT9nLmFwcGx5KGIpOmcpKSsnPC9zcGFuPlxcbiAgICA8YiBjbGFzcz1cImNhcmV0XCI+PC9iPlxcbiAgPC9hPlxcbiAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxcbiAgICA8bGk+PGRpdiBjbGFzcz1cInd5c2lodG1sNS1jb2xvcnNcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwiYmxhY2tcIj48L2Rpdj48YSBjbGFzcz1cInd5c2lodG1sNS1jb2xvcnMtdGl0bGVcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kPVwiZm9yZUNvbG9yXCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZC12YWx1ZT1cImJsYWNrXCI+JytqKChnPWImJmIubG9jYWxlLGc9bnVsbD09Z3x8Zz09PSExP2c6Zy5jb2xvdXJzLGc9bnVsbD09Z3x8Zz09PSExP2c6Zy5ibGFjayx0eXBlb2YgZz09PWk/Zy5hcHBseShiKTpnKSkrJzwvYT48L2xpPlxcbiAgICA8bGk+PGRpdiBjbGFzcz1cInd5c2lodG1sNS1jb2xvcnNcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwic2lsdmVyXCI+PC9kaXY+PGEgY2xhc3M9XCJ3eXNpaHRtbDUtY29sb3JzLXRpdGxlXCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZD1cImZvcmVDb2xvclwiIGRhdGEtd3lzaWh0bWw1LWNvbW1hbmQtdmFsdWU9XCJzaWx2ZXJcIj4nK2ooKGc9YiYmYi5sb2NhbGUsZz1udWxsPT1nfHxnPT09ITE/ZzpnLmNvbG91cnMsZz1udWxsPT1nfHxnPT09ITE/ZzpnLnNpbHZlcix0eXBlb2YgZz09PWk/Zy5hcHBseShiKTpnKSkrJzwvYT48L2xpPlxcbiAgICA8bGk+PGRpdiBjbGFzcz1cInd5c2lodG1sNS1jb2xvcnNcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwiZ3JheVwiPjwvZGl2PjxhIGNsYXNzPVwid3lzaWh0bWw1LWNvbG9ycy10aXRsZVwiIGRhdGEtd3lzaWh0bWw1LWNvbW1hbmQ9XCJmb3JlQ29sb3JcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwiZ3JheVwiPicraigoZz1iJiZiLmxvY2FsZSxnPW51bGw9PWd8fGc9PT0hMT9nOmcuY29sb3VycyxnPW51bGw9PWd8fGc9PT0hMT9nOmcuZ3JheSx0eXBlb2YgZz09PWk/Zy5hcHBseShiKTpnKSkrJzwvYT48L2xpPlxcbiAgICA8bGk+PGRpdiBjbGFzcz1cInd5c2lodG1sNS1jb2xvcnNcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwibWFyb29uXCI+PC9kaXY+PGEgY2xhc3M9XCJ3eXNpaHRtbDUtY29sb3JzLXRpdGxlXCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZD1cImZvcmVDb2xvclwiIGRhdGEtd3lzaWh0bWw1LWNvbW1hbmQtdmFsdWU9XCJtYXJvb25cIj4nK2ooKGc9YiYmYi5sb2NhbGUsZz1udWxsPT1nfHxnPT09ITE/ZzpnLmNvbG91cnMsZz1udWxsPT1nfHxnPT09ITE/ZzpnLm1hcm9vbix0eXBlb2YgZz09PWk/Zy5hcHBseShiKTpnKSkrJzwvYT48L2xpPlxcbiAgICA8bGk+PGRpdiBjbGFzcz1cInd5c2lodG1sNS1jb2xvcnNcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwicmVkXCI+PC9kaXY+PGEgY2xhc3M9XCJ3eXNpaHRtbDUtY29sb3JzLXRpdGxlXCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZD1cImZvcmVDb2xvclwiIGRhdGEtd3lzaWh0bWw1LWNvbW1hbmQtdmFsdWU9XCJyZWRcIj4nK2ooKGc9YiYmYi5sb2NhbGUsZz1udWxsPT1nfHxnPT09ITE/ZzpnLmNvbG91cnMsZz1udWxsPT1nfHxnPT09ITE/ZzpnLnJlZCx0eXBlb2YgZz09PWk/Zy5hcHBseShiKTpnKSkrJzwvYT48L2xpPlxcbiAgICA8bGk+PGRpdiBjbGFzcz1cInd5c2lodG1sNS1jb2xvcnNcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwicHVycGxlXCI+PC9kaXY+PGEgY2xhc3M9XCJ3eXNpaHRtbDUtY29sb3JzLXRpdGxlXCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZD1cImZvcmVDb2xvclwiIGRhdGEtd3lzaWh0bWw1LWNvbW1hbmQtdmFsdWU9XCJwdXJwbGVcIj4nK2ooKGc9YiYmYi5sb2NhbGUsZz1udWxsPT1nfHxnPT09ITE/ZzpnLmNvbG91cnMsZz1udWxsPT1nfHxnPT09ITE/ZzpnLnB1cnBsZSx0eXBlb2YgZz09PWk/Zy5hcHBseShiKTpnKSkrJzwvYT48L2xpPlxcbiAgICA8bGk+PGRpdiBjbGFzcz1cInd5c2lodG1sNS1jb2xvcnNcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwiZ3JlZW5cIj48L2Rpdj48YSBjbGFzcz1cInd5c2lodG1sNS1jb2xvcnMtdGl0bGVcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kPVwiZm9yZUNvbG9yXCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZC12YWx1ZT1cImdyZWVuXCI+JytqKChnPWImJmIubG9jYWxlLGc9bnVsbD09Z3x8Zz09PSExP2c6Zy5jb2xvdXJzLGc9bnVsbD09Z3x8Zz09PSExP2c6Zy5ncmVlbix0eXBlb2YgZz09PWk/Zy5hcHBseShiKTpnKSkrJzwvYT48L2xpPlxcbiAgICA8bGk+PGRpdiBjbGFzcz1cInd5c2lodG1sNS1jb2xvcnNcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwib2xpdmVcIj48L2Rpdj48YSBjbGFzcz1cInd5c2lodG1sNS1jb2xvcnMtdGl0bGVcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kPVwiZm9yZUNvbG9yXCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZC12YWx1ZT1cIm9saXZlXCI+JytqKChnPWImJmIubG9jYWxlLGc9bnVsbD09Z3x8Zz09PSExP2c6Zy5jb2xvdXJzLGc9bnVsbD09Z3x8Zz09PSExP2c6Zy5vbGl2ZSx0eXBlb2YgZz09PWk/Zy5hcHBseShiKTpnKSkrJzwvYT48L2xpPlxcbiAgICA8bGk+PGRpdiBjbGFzcz1cInd5c2lodG1sNS1jb2xvcnNcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwibmF2eVwiPjwvZGl2PjxhIGNsYXNzPVwid3lzaWh0bWw1LWNvbG9ycy10aXRsZVwiIGRhdGEtd3lzaWh0bWw1LWNvbW1hbmQ9XCJmb3JlQ29sb3JcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwibmF2eVwiPicraigoZz1iJiZiLmxvY2FsZSxnPW51bGw9PWd8fGc9PT0hMT9nOmcuY29sb3VycyxnPW51bGw9PWd8fGc9PT0hMT9nOmcubmF2eSx0eXBlb2YgZz09PWk/Zy5hcHBseShiKTpnKSkrJzwvYT48L2xpPlxcbiAgICA8bGk+PGRpdiBjbGFzcz1cInd5c2lodG1sNS1jb2xvcnNcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwiYmx1ZVwiPjwvZGl2PjxhIGNsYXNzPVwid3lzaWh0bWw1LWNvbG9ycy10aXRsZVwiIGRhdGEtd3lzaWh0bWw1LWNvbW1hbmQ9XCJmb3JlQ29sb3JcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwiYmx1ZVwiPicraigoZz1iJiZiLmxvY2FsZSxnPW51bGw9PWd8fGc9PT0hMT9nOmcuY29sb3VycyxnPW51bGw9PWd8fGc9PT0hMT9nOmcuYmx1ZSx0eXBlb2YgZz09PWk/Zy5hcHBseShiKTpnKSkrJzwvYT48L2xpPlxcbiAgICA8bGk+PGRpdiBjbGFzcz1cInd5c2lodG1sNS1jb2xvcnNcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwib3JhbmdlXCI+PC9kaXY+PGEgY2xhc3M9XCJ3eXNpaHRtbDUtY29sb3JzLXRpdGxlXCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZD1cImZvcmVDb2xvclwiIGRhdGEtd3lzaWh0bWw1LWNvbW1hbmQtdmFsdWU9XCJvcmFuZ2VcIj4nK2ooKGc9YiYmYi5sb2NhbGUsZz1udWxsPT1nfHxnPT09ITE/ZzpnLmNvbG91cnMsZz1udWxsPT1nfHxnPT09ITE/ZzpnLm9yYW5nZSx0eXBlb2YgZz09PWk/Zy5hcHBseShiKTpnKSkrXCI8L2E+PC9saT5cXG4gIDwvdWw+XFxuPC9saT5cXG5cIixofSksdGhpcy53eXNpaHRtbDUudHBsLmVtcGhhc2lzPUhhbmRsZWJhcnMudGVtcGxhdGUoZnVuY3Rpb24oYSxiLGMsZCxlKXtmdW5jdGlvbiBmKGEpe3ZhciBiLGM9XCJcIjtyZXR1cm4gYys9XCJidG4tXCIraygoYj1hJiZhLm9wdGlvbnMsYj1udWxsPT1ifHxiPT09ITE/YjpiLnRvb2xiYXIsYj1udWxsPT1ifHxiPT09ITE/YjpiLnNpemUsdHlwZW9mIGI9PT1qP2IuYXBwbHkoYSk6YikpLGN9ZnVuY3Rpb24gZyhhLGIpe3ZhciBkLGU9XCJcIjtyZXR1cm4gZSs9J1xcbiAgICA8YSBjbGFzcz1cImJ0biAnLGQ9Y1tcImlmXCJdLmNhbGwoYSwoZD1hJiZhLm9wdGlvbnMsZD1udWxsPT1kfHxkPT09ITE/ZDpkLnRvb2xiYXIsbnVsbD09ZHx8ZD09PSExP2Q6ZC5zaXplKSx7aGFzaDp7fSxpbnZlcnNlOmwubm9vcCxmbjpsLnByb2dyYW0oMSxmLGIpLGRhdGE6Yn0pLChkfHwwPT09ZCkmJihlKz1kKSxlKz0nIGJ0bi1kZWZhdWx0XCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZD1cInNtYWxsXCIgdGl0bGU9XCJDVFJMK1NcIiB0YWJpbmRleD1cIi0xXCI+JytrKChkPWEmJmEubG9jYWxlLGQ9bnVsbD09ZHx8ZD09PSExP2Q6ZC5lbXBoYXNpcyxkPW51bGw9PWR8fGQ9PT0hMT9kOmQuc21hbGwsdHlwZW9mIGQ9PT1qP2QuYXBwbHkoYSk6ZCkpK1wiPC9hPlxcbiAgICBcIixlfXRoaXMuY29tcGlsZXJJbmZvPVs0LFwiPj0gMS4wLjBcIl0sYz10aGlzLm1lcmdlKGMsYS5oZWxwZXJzKSxlPWV8fHt9O3ZhciBoLGk9XCJcIixqPVwiZnVuY3Rpb25cIixrPXRoaXMuZXNjYXBlRXhwcmVzc2lvbixsPXRoaXM7cmV0dXJuIGkrPSc8bGk+XFxuICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XFxuICAgIDxhIGNsYXNzPVwiYnRuICcsaD1jW1wiaWZcIl0uY2FsbChiLChoPWImJmIub3B0aW9ucyxoPW51bGw9PWh8fGg9PT0hMT9oOmgudG9vbGJhcixudWxsPT1ofHxoPT09ITE/aDpoLnNpemUpLHtoYXNoOnt9LGludmVyc2U6bC5ub29wLGZuOmwucHJvZ3JhbSgxLGYsZSksZGF0YTplfSksKGh8fDA9PT1oKSYmKGkrPWgpLGkrPScgYnRuLWRlZmF1bHRcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kPVwiYm9sZFwiIHRpdGxlPVwiQ1RSTCtCXCIgdGFiaW5kZXg9XCItMVwiPicraygoaD1iJiZiLmxvY2FsZSxoPW51bGw9PWh8fGg9PT0hMT9oOmguZW1waGFzaXMsaD1udWxsPT1ofHxoPT09ITE/aDpoLmJvbGQsdHlwZW9mIGg9PT1qP2guYXBwbHkoYik6aCkpKyc8L2E+XFxuICAgIDxhIGNsYXNzPVwiYnRuICcsaD1jW1wiaWZcIl0uY2FsbChiLChoPWImJmIub3B0aW9ucyxoPW51bGw9PWh8fGg9PT0hMT9oOmgudG9vbGJhcixudWxsPT1ofHxoPT09ITE/aDpoLnNpemUpLHtoYXNoOnt9LGludmVyc2U6bC5ub29wLGZuOmwucHJvZ3JhbSgxLGYsZSksZGF0YTplfSksKGh8fDA9PT1oKSYmKGkrPWgpLGkrPScgYnRuLWRlZmF1bHRcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kPVwiaXRhbGljXCIgdGl0bGU9XCJDVFJMK0lcIiB0YWJpbmRleD1cIi0xXCI+JytrKChoPWImJmIubG9jYWxlLGg9bnVsbD09aHx8aD09PSExP2g6aC5lbXBoYXNpcyxoPW51bGw9PWh8fGg9PT0hMT9oOmguaXRhbGljLHR5cGVvZiBoPT09aj9oLmFwcGx5KGIpOmgpKSsnPC9hPlxcbiAgICA8YSBjbGFzcz1cImJ0biAnLGg9Y1tcImlmXCJdLmNhbGwoYiwoaD1iJiZiLm9wdGlvbnMsaD1udWxsPT1ofHxoPT09ITE/aDpoLnRvb2xiYXIsbnVsbD09aHx8aD09PSExP2g6aC5zaXplKSx7aGFzaDp7fSxpbnZlcnNlOmwubm9vcCxmbjpsLnByb2dyYW0oMSxmLGUpLGRhdGE6ZX0pLChofHwwPT09aCkmJihpKz1oKSxpKz0nIGJ0bi1kZWZhdWx0XCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZD1cInVuZGVybGluZVwiIHRpdGxlPVwiQ1RSTCtVXCIgdGFiaW5kZXg9XCItMVwiPicraygoaD1iJiZiLmxvY2FsZSxoPW51bGw9PWh8fGg9PT0hMT9oOmguZW1waGFzaXMsaD1udWxsPT1ofHxoPT09ITE/aDpoLnVuZGVybGluZSx0eXBlb2YgaD09PWo/aC5hcHBseShiKTpoKSkrXCI8L2E+XFxuICAgIFwiLGg9Y1tcImlmXCJdLmNhbGwoYiwoaD1iJiZiLm9wdGlvbnMsaD1udWxsPT1ofHxoPT09ITE/aDpoLnRvb2xiYXIsaD1udWxsPT1ofHxoPT09ITE/aDpoLmVtcGhhc2lzLG51bGw9PWh8fGg9PT0hMT9oOmguc21hbGwpLHtoYXNoOnt9LGludmVyc2U6bC5ub29wLGZuOmwucHJvZ3JhbSgzLGcsZSksZGF0YTplfSksKGh8fDA9PT1oKSYmKGkrPWgpLGkrPVwiXFxuICA8L2Rpdj5cXG48L2xpPlxcblwiLGlcbn0pLHRoaXMud3lzaWh0bWw1LnRwbFtcImZvbnQtc3R5bGVzXCJdPUhhbmRsZWJhcnMudGVtcGxhdGUoZnVuY3Rpb24oYSxiLGMsZCxlKXtmdW5jdGlvbiBmKGEpe3ZhciBiLGM9XCJcIjtyZXR1cm4gYys9XCJidG4tXCIrbCgoYj1hJiZhLm9wdGlvbnMsYj1udWxsPT1ifHxiPT09ITE/YjpiLnRvb2xiYXIsYj1udWxsPT1ifHxiPT09ITE/YjpiLnNpemUsdHlwZW9mIGI9PT1rP2IuYXBwbHkoYSk6YikpLGN9ZnVuY3Rpb24gZygpe3JldHVybidcXG4gICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZvbnRcIj48L3NwYW4+XFxuICAgICd9ZnVuY3Rpb24gaCgpe3JldHVybidcXG4gICAgICA8c3BhbiBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZm9udFwiPjwvc3Bhbj5cXG4gICAgJ310aGlzLmNvbXBpbGVySW5mbz1bNCxcIj49IDEuMC4wXCJdLGM9dGhpcy5tZXJnZShjLGEuaGVscGVycyksZT1lfHx7fTt2YXIgaSxqPVwiXCIsaz1cImZ1bmN0aW9uXCIsbD10aGlzLmVzY2FwZUV4cHJlc3Npb24sbT10aGlzO3JldHVybiBqKz0nPGxpIGNsYXNzPVwiZHJvcGRvd25cIj5cXG4gIDxhIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGRyb3Bkb3duLXRvZ2dsZSAnLGk9Y1tcImlmXCJdLmNhbGwoYiwoaT1iJiZiLm9wdGlvbnMsaT1udWxsPT1pfHxpPT09ITE/aTppLnRvb2xiYXIsbnVsbD09aXx8aT09PSExP2k6aS5zaXplKSx7aGFzaDp7fSxpbnZlcnNlOm0ubm9vcCxmbjptLnByb2dyYW0oMSxmLGUpLGRhdGE6ZX0pLChpfHwwPT09aSkmJihqKz1pKSxqKz0nXCIgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiPlxcbiAgICAnLGk9Y1tcImlmXCJdLmNhbGwoYiwoaT1iJiZiLm9wdGlvbnMsaT1udWxsPT1pfHxpPT09ITE/aTppLnRvb2xiYXIsbnVsbD09aXx8aT09PSExP2k6aS5mYSkse2hhc2g6e30saW52ZXJzZTptLnByb2dyYW0oNSxoLGUpLGZuOm0ucHJvZ3JhbSgzLGcsZSksZGF0YTplfSksKGl8fDA9PT1pKSYmKGorPWkpLGorPSdcXG4gICAgPHNwYW4gY2xhc3M9XCJjdXJyZW50LWZvbnRcIj4nK2woKGk9YiYmYi5sb2NhbGUsaT1udWxsPT1pfHxpPT09ITE/aTppLmZvbnRfc3R5bGVzLGk9bnVsbD09aXx8aT09PSExP2k6aS5ub3JtYWwsdHlwZW9mIGk9PT1rP2kuYXBwbHkoYik6aSkpKyc8L3NwYW4+XFxuICAgIDxiIGNsYXNzPVwiY2FyZXRcIj48L2I+XFxuICA8L2E+XFxuICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XFxuICAgIDxsaT48YSBkYXRhLXd5c2lodG1sNS1jb21tYW5kPVwiZm9ybWF0QmxvY2tcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwicFwiIHRhYmluZGV4PVwiLTFcIj4nK2woKGk9YiYmYi5sb2NhbGUsaT1udWxsPT1pfHxpPT09ITE/aTppLmZvbnRfc3R5bGVzLGk9bnVsbD09aXx8aT09PSExP2k6aS5ub3JtYWwsdHlwZW9mIGk9PT1rP2kuYXBwbHkoYik6aSkpKyc8L2E+PC9saT5cXG4gICAgPGxpPjxhIGRhdGEtd3lzaWh0bWw1LWNvbW1hbmQ9XCJmb3JtYXRCbG9ja1wiIGRhdGEtd3lzaWh0bWw1LWNvbW1hbmQtdmFsdWU9XCJoMVwiIHRhYmluZGV4PVwiLTFcIj4nK2woKGk9YiYmYi5sb2NhbGUsaT1udWxsPT1pfHxpPT09ITE/aTppLmZvbnRfc3R5bGVzLGk9bnVsbD09aXx8aT09PSExP2k6aS5oMSx0eXBlb2YgaT09PWs/aS5hcHBseShiKTppKSkrJzwvYT48L2xpPlxcbiAgICA8bGk+PGEgZGF0YS13eXNpaHRtbDUtY29tbWFuZD1cImZvcm1hdEJsb2NrXCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZC12YWx1ZT1cImgyXCIgdGFiaW5kZXg9XCItMVwiPicrbCgoaT1iJiZiLmxvY2FsZSxpPW51bGw9PWl8fGk9PT0hMT9pOmkuZm9udF9zdHlsZXMsaT1udWxsPT1pfHxpPT09ITE/aTppLmgyLHR5cGVvZiBpPT09az9pLmFwcGx5KGIpOmkpKSsnPC9hPjwvbGk+XFxuICAgIDxsaT48YSBkYXRhLXd5c2lodG1sNS1jb21tYW5kPVwiZm9ybWF0QmxvY2tcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwiaDNcIiB0YWJpbmRleD1cIi0xXCI+JytsKChpPWImJmIubG9jYWxlLGk9bnVsbD09aXx8aT09PSExP2k6aS5mb250X3N0eWxlcyxpPW51bGw9PWl8fGk9PT0hMT9pOmkuaDMsdHlwZW9mIGk9PT1rP2kuYXBwbHkoYik6aSkpKyc8L2E+PC9saT5cXG4gICAgPGxpPjxhIGRhdGEtd3lzaWh0bWw1LWNvbW1hbmQ9XCJmb3JtYXRCbG9ja1wiIGRhdGEtd3lzaWh0bWw1LWNvbW1hbmQtdmFsdWU9XCJoNFwiIHRhYmluZGV4PVwiLTFcIj4nK2woKGk9YiYmYi5sb2NhbGUsaT1udWxsPT1pfHxpPT09ITE/aTppLmZvbnRfc3R5bGVzLGk9bnVsbD09aXx8aT09PSExP2k6aS5oNCx0eXBlb2YgaT09PWs/aS5hcHBseShiKTppKSkrJzwvYT48L2xpPlxcbiAgICA8bGk+PGEgZGF0YS13eXNpaHRtbDUtY29tbWFuZD1cImZvcm1hdEJsb2NrXCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZC12YWx1ZT1cImg1XCIgdGFiaW5kZXg9XCItMVwiPicrbCgoaT1iJiZiLmxvY2FsZSxpPW51bGw9PWl8fGk9PT0hMT9pOmkuZm9udF9zdHlsZXMsaT1udWxsPT1pfHxpPT09ITE/aTppLmg1LHR5cGVvZiBpPT09az9pLmFwcGx5KGIpOmkpKSsnPC9hPjwvbGk+XFxuICAgIDxsaT48YSBkYXRhLXd5c2lodG1sNS1jb21tYW5kPVwiZm9ybWF0QmxvY2tcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kLXZhbHVlPVwiaDZcIiB0YWJpbmRleD1cIi0xXCI+JytsKChpPWImJmIubG9jYWxlLGk9bnVsbD09aXx8aT09PSExP2k6aS5mb250X3N0eWxlcyxpPW51bGw9PWl8fGk9PT0hMT9pOmkuaDYsdHlwZW9mIGk9PT1rP2kuYXBwbHkoYik6aSkpK1wiPC9hPjwvbGk+XFxuICA8L3VsPlxcbjwvbGk+XFxuXCIsan0pLHRoaXMud3lzaWh0bWw1LnRwbC5odG1sPUhhbmRsZWJhcnMudGVtcGxhdGUoZnVuY3Rpb24oYSxiLGMsZCxlKXtmdW5jdGlvbiBmKGEpe3ZhciBiLGM9XCJcIjtyZXR1cm4gYys9XCJidG4tXCIrbCgoYj1hJiZhLm9wdGlvbnMsYj1udWxsPT1ifHxiPT09ITE/YjpiLnRvb2xiYXIsYj1udWxsPT1ifHxiPT09ITE/YjpiLnNpemUsdHlwZW9mIGI9PT1rP2IuYXBwbHkoYSk6YikpLGN9ZnVuY3Rpb24gZygpe3JldHVybidcXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGVuY2lsXCI+PC9zcGFuPlxcbiAgICAgICd9ZnVuY3Rpb24gaCgpe3JldHVybidcXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1wZW5jaWxcIj48L3NwYW4+XFxuICAgICAgJ310aGlzLmNvbXBpbGVySW5mbz1bNCxcIj49IDEuMC4wXCJdLGM9dGhpcy5tZXJnZShjLGEuaGVscGVycyksZT1lfHx7fTt2YXIgaSxqPVwiXCIsaz1cImZ1bmN0aW9uXCIsbD10aGlzLmVzY2FwZUV4cHJlc3Npb24sbT10aGlzO3JldHVybiBqKz0nPGxpPlxcbiAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxcbiAgICA8YSBjbGFzcz1cImJ0biAnLGk9Y1tcImlmXCJdLmNhbGwoYiwoaT1iJiZiLm9wdGlvbnMsaT1udWxsPT1pfHxpPT09ITE/aTppLnRvb2xiYXIsbnVsbD09aXx8aT09PSExP2k6aS5zaXplKSx7aGFzaDp7fSxpbnZlcnNlOm0ubm9vcCxmbjptLnByb2dyYW0oMSxmLGUpLGRhdGE6ZX0pLChpfHwwPT09aSkmJihqKz1pKSxqKz0nIGJ0bi1kZWZhdWx0XCIgZGF0YS13eXNpaHRtbDUtYWN0aW9uPVwiY2hhbmdlX3ZpZXdcIiB0aXRsZT1cIicrbCgoaT1iJiZiLmxvY2FsZSxpPW51bGw9PWl8fGk9PT0hMT9pOmkuaHRtbCxpPW51bGw9PWl8fGk9PT0hMT9pOmkuZWRpdCx0eXBlb2YgaT09PWs/aS5hcHBseShiKTppKSkrJ1wiIHRhYmluZGV4PVwiLTFcIj5cXG4gICAgICAnLGk9Y1tcImlmXCJdLmNhbGwoYiwoaT1iJiZiLm9wdGlvbnMsaT1udWxsPT1pfHxpPT09ITE/aTppLnRvb2xiYXIsbnVsbD09aXx8aT09PSExP2k6aS5mYSkse2hhc2g6e30saW52ZXJzZTptLnByb2dyYW0oNSxoLGUpLGZuOm0ucHJvZ3JhbSgzLGcsZSksZGF0YTplfSksKGl8fDA9PT1pKSYmKGorPWkpLGorPVwiXFxuICAgIDwvYT5cXG4gIDwvZGl2PlxcbjwvbGk+XFxuXCIsan0pLHRoaXMud3lzaWh0bWw1LnRwbC5pbWFnZT1IYW5kbGViYXJzLnRlbXBsYXRlKGZ1bmN0aW9uKGEsYixjLGQsZSl7ZnVuY3Rpb24gZigpe3JldHVyblwibW9kYWwtc21cIn1mdW5jdGlvbiBnKGEpe3ZhciBiLGM9XCJcIjtyZXR1cm4gYys9XCJidG4tXCIrbSgoYj1hJiZhLm9wdGlvbnMsYj1udWxsPT1ifHxiPT09ITE/YjpiLnRvb2xiYXIsYj1udWxsPT1ifHxiPT09ITE/YjpiLnNpemUsdHlwZW9mIGI9PT1sP2IuYXBwbHkoYSk6YikpLGN9ZnVuY3Rpb24gaCgpe3JldHVybidcXG4gICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZpbGUtaW1hZ2Utb1wiPjwvc3Bhbj5cXG4gICAgJ31mdW5jdGlvbiBpKCl7cmV0dXJuJ1xcbiAgICAgIDxzcGFuIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1waWN0dXJlXCI+PC9zcGFuPlxcbiAgICAnfXRoaXMuY29tcGlsZXJJbmZvPVs0LFwiPj0gMS4wLjBcIl0sYz10aGlzLm1lcmdlKGMsYS5oZWxwZXJzKSxlPWV8fHt9O3ZhciBqLGs9XCJcIixsPVwiZnVuY3Rpb25cIixtPXRoaXMuZXNjYXBlRXhwcmVzc2lvbixuPXRoaXM7cmV0dXJuIGsrPSc8bGk+XFxuICA8ZGl2IGNsYXNzPVwiYm9vdHN0cmFwLXd5c2lodG1sNS1pbnNlcnQtaW1hZ2UtbW9kYWwgbW9kYWwgZmFkZVwiIGRhdGEtd3lzaWh0bWw1LWRpYWxvZz1cImluc2VydEltYWdlXCI+XFxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgJyxqPWNbXCJpZlwiXS5jYWxsKGIsKGo9YiYmYi5vcHRpb25zLGo9bnVsbD09anx8aj09PSExP2o6ai50b29sYmFyLG51bGw9PWp8fGo9PT0hMT9qOmouc21hbGxtb2RhbHMpLHtoYXNoOnt9LGludmVyc2U6bi5ub29wLGZuOm4ucHJvZ3JhbSgxLGYsZSksZGF0YTplfSksKGp8fDA9PT1qKSYmKGsrPWopLGsrPSdcIj5cXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxcbiAgICAgICAgICA8YSBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj4mdGltZXM7PC9hPlxcbiAgICAgICAgICA8aDM+JyttKChqPWImJmIubG9jYWxlLGo9bnVsbD09anx8aj09PSExP2o6ai5pbWFnZSxqPW51bGw9PWp8fGo9PT0hMT9qOmouaW5zZXJ0LHR5cGVvZiBqPT09bD9qLmFwcGx5KGIpOmopKSsnPC9oMz5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cXG4gICAgICAgICAgICA8aW5wdXQgdmFsdWU9XCJodHRwOi8vXCIgY2xhc3M9XCJib290c3RyYXAtd3lzaWh0bWw1LWluc2VydC1pbWFnZS11cmwgZm9ybS1jb250cm9sXCIgZGF0YS13eXNpaHRtbDUtZGlhbG9nLWZpZWxkPVwic3JjXCI+XFxuICAgICAgICAgIDwvZGl2PiBcXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxcbiAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgZGF0YS13eXNpaHRtbDUtZGlhbG9nLWFjdGlvbj1cImNhbmNlbFwiIGhyZWY9XCIjXCI+JyttKChqPWImJmIubG9jYWxlLGo9bnVsbD09anx8aj09PSExP2o6ai5pbWFnZSxqPW51bGw9PWp8fGo9PT0hMT9qOmouY2FuY2VsLHR5cGVvZiBqPT09bD9qLmFwcGx5KGIpOmopKSsnPC9hPlxcbiAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgIGRhdGEtd3lzaWh0bWw1LWRpYWxvZy1hY3Rpb249XCJzYXZlXCIgaHJlZj1cIiNcIj4nK20oKGo9YiYmYi5sb2NhbGUsaj1udWxsPT1qfHxqPT09ITE/ajpqLmltYWdlLGo9bnVsbD09anx8aj09PSExP2o6ai5pbnNlcnQsdHlwZW9mIGo9PT1sP2ouYXBwbHkoYik6aikpKyc8L2E+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuICA8L2Rpdj5cXG4gIDxhIGNsYXNzPVwiYnRuICcsaj1jW1wiaWZcIl0uY2FsbChiLChqPWImJmIub3B0aW9ucyxqPW51bGw9PWp8fGo9PT0hMT9qOmoudG9vbGJhcixudWxsPT1qfHxqPT09ITE/ajpqLnNpemUpLHtoYXNoOnt9LGludmVyc2U6bi5ub29wLGZuOm4ucHJvZ3JhbSgzLGcsZSksZGF0YTplfSksKGp8fDA9PT1qKSYmKGsrPWopLGsrPScgYnRuLWRlZmF1bHRcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kPVwiaW5zZXJ0SW1hZ2VcIiB0aXRsZT1cIicrbSgoaj1iJiZiLmxvY2FsZSxqPW51bGw9PWp8fGo9PT0hMT9qOmouaW1hZ2Usaj1udWxsPT1qfHxqPT09ITE/ajpqLmluc2VydCx0eXBlb2Ygaj09PWw/ai5hcHBseShiKTpqKSkrJ1wiIHRhYmluZGV4PVwiLTFcIj5cXG4gICAgJyxqPWNbXCJpZlwiXS5jYWxsKGIsKGo9YiYmYi5vcHRpb25zLGo9bnVsbD09anx8aj09PSExP2o6ai50b29sYmFyLG51bGw9PWp8fGo9PT0hMT9qOmouZmEpLHtoYXNoOnt9LGludmVyc2U6bi5wcm9ncmFtKDcsaSxlKSxmbjpuLnByb2dyYW0oNSxoLGUpLGRhdGE6ZX0pLChqfHwwPT09aikmJihrKz1qKSxrKz1cIlxcbiAgPC9hPlxcbjwvbGk+XFxuXCIsa30pLHRoaXMud3lzaWh0bWw1LnRwbC5saW5rPUhhbmRsZWJhcnMudGVtcGxhdGUoZnVuY3Rpb24oYSxiLGMsZCxlKXtmdW5jdGlvbiBmKCl7cmV0dXJuXCJtb2RhbC1zbVwifWZ1bmN0aW9uIGcoYSl7dmFyIGIsYz1cIlwiO3JldHVybiBjKz1cImJ0bi1cIittKChiPWEmJmEub3B0aW9ucyxiPW51bGw9PWJ8fGI9PT0hMT9iOmIudG9vbGJhcixiPW51bGw9PWJ8fGI9PT0hMT9iOmIuc2l6ZSx0eXBlb2YgYj09PWw/Yi5hcHBseShhKTpiKSksY31mdW5jdGlvbiBoKCl7cmV0dXJuJ1xcbiAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtc2hhcmUtc3F1YXJlLW9cIj48L3NwYW4+XFxuICAgICd9ZnVuY3Rpb24gaSgpe3JldHVybidcXG4gICAgICA8c3BhbiBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tc2hhcmVcIj48L3NwYW4+XFxuICAgICd9dGhpcy5jb21waWxlckluZm89WzQsXCI+PSAxLjAuMFwiXSxjPXRoaXMubWVyZ2UoYyxhLmhlbHBlcnMpLGU9ZXx8e307dmFyIGosaz1cIlwiLGw9XCJmdW5jdGlvblwiLG09dGhpcy5lc2NhcGVFeHByZXNzaW9uLG49dGhpcztyZXR1cm4gays9JzxsaT5cXG4gIDxkaXYgY2xhc3M9XCJib290c3RyYXAtd3lzaWh0bWw1LWluc2VydC1saW5rLW1vZGFsIG1vZGFsIGZhZGVcIiBkYXRhLXd5c2lodG1sNS1kaWFsb2c9XCJjcmVhdGVMaW5rXCI+XFxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgJyxqPWNbXCJpZlwiXS5jYWxsKGIsKGo9YiYmYi5vcHRpb25zLGo9bnVsbD09anx8aj09PSExP2o6ai50b29sYmFyLG51bGw9PWp8fGo9PT0hMT9qOmouc21hbGxtb2RhbHMpLHtoYXNoOnt9LGludmVyc2U6bi5ub29wLGZuOm4ucHJvZ3JhbSgxLGYsZSksZGF0YTplfSksKGp8fDA9PT1qKSYmKGsrPWopLGsrPSdcIj5cXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxcbiAgICAgICAgICA8YSBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj4mdGltZXM7PC9hPlxcbiAgICAgICAgICA8aDM+JyttKChqPWImJmIubG9jYWxlLGo9bnVsbD09anx8aj09PSExP2o6ai5saW5rLGo9bnVsbD09anx8aj09PSExP2o6ai5pbnNlcnQsdHlwZW9mIGo9PT1sP2ouYXBwbHkoYik6aikpKyc8L2gzPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxcbiAgICAgICAgICAgIDxpbnB1dCB2YWx1ZT1cImh0dHA6Ly9cIiBjbGFzcz1cImJvb3RzdHJhcC13eXNpaHRtbDUtaW5zZXJ0LWxpbmstdXJsIGZvcm0tY29udHJvbFwiIGRhdGEtd3lzaWh0bWw1LWRpYWxvZy1maWVsZD1cImhyZWZcIj5cXG4gICAgICAgICAgPC9kaXY+IFxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cXG4gICAgICAgICAgICA8bGFiZWw+IFxcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiYm9vdHN0cmFwLXd5c2lodG1sNS1pbnNlcnQtbGluay10YXJnZXRcIiBjaGVja2VkPicrbSgoaj1iJiZiLmxvY2FsZSxqPW51bGw9PWp8fGo9PT0hMT9qOmoubGluayxqPW51bGw9PWp8fGo9PT0hMT9qOmoudGFyZ2V0LHR5cGVvZiBqPT09bD9qLmFwcGx5KGIpOmopKSsnXFxuICAgICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cXG4gICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGRhdGEtd3lzaWh0bWw1LWRpYWxvZy1hY3Rpb249XCJjYW5jZWxcIiBocmVmPVwiI1wiPicrbSgoaj1iJiZiLmxvY2FsZSxqPW51bGw9PWp8fGo9PT0hMT9qOmoubGluayxqPW51bGw9PWp8fGo9PT0hMT9qOmouY2FuY2VsLHR5cGVvZiBqPT09bD9qLmFwcGx5KGIpOmopKSsnPC9hPlxcbiAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBkYXRhLXd5c2lodG1sNS1kaWFsb2ctYWN0aW9uPVwic2F2ZVwiPicrbSgoaj1iJiZiLmxvY2FsZSxqPW51bGw9PWp8fGo9PT0hMT9qOmoubGluayxqPW51bGw9PWp8fGo9PT0hMT9qOmouaW5zZXJ0LHR5cGVvZiBqPT09bD9qLmFwcGx5KGIpOmopKSsnPC9hPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+XFxuICA8YSBjbGFzcz1cImJ0biAnLGo9Y1tcImlmXCJdLmNhbGwoYiwoaj1iJiZiLm9wdGlvbnMsaj1udWxsPT1qfHxqPT09ITE/ajpqLnRvb2xiYXIsbnVsbD09anx8aj09PSExP2o6ai5zaXplKSx7aGFzaDp7fSxpbnZlcnNlOm4ubm9vcCxmbjpuLnByb2dyYW0oMyxnLGUpLGRhdGE6ZX0pLChqfHwwPT09aikmJihrKz1qKSxrKz0nIGJ0bi1kZWZhdWx0XCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZD1cImNyZWF0ZUxpbmtcIiB0aXRsZT1cIicrbSgoaj1iJiZiLmxvY2FsZSxqPW51bGw9PWp8fGo9PT0hMT9qOmoubGluayxqPW51bGw9PWp8fGo9PT0hMT9qOmouaW5zZXJ0LHR5cGVvZiBqPT09bD9qLmFwcGx5KGIpOmopKSsnXCIgdGFiaW5kZXg9XCItMVwiPlxcbiAgICAnLGo9Y1tcImlmXCJdLmNhbGwoYiwoaj1iJiZiLm9wdGlvbnMsaj1udWxsPT1qfHxqPT09ITE/ajpqLnRvb2xiYXIsbnVsbD09anx8aj09PSExP2o6ai5mYSkse2hhc2g6e30saW52ZXJzZTpuLnByb2dyYW0oNyxpLGUpLGZuOm4ucHJvZ3JhbSg1LGgsZSksZGF0YTplfSksKGp8fDA9PT1qKSYmKGsrPWopLGsrPVwiXFxuICA8L2E+XFxuPC9saT5cXG5cIixrfSksdGhpcy53eXNpaHRtbDUudHBsLmxpc3RzPUhhbmRsZWJhcnMudGVtcGxhdGUoZnVuY3Rpb24oYSxiLGMsZCxlKXtmdW5jdGlvbiBmKGEpe3ZhciBiLGM9XCJcIjtyZXR1cm4gYys9XCJidG4tXCIrcigoYj1hJiZhLm9wdGlvbnMsYj1udWxsPT1ifHxiPT09ITE/YjpiLnRvb2xiYXIsYj1udWxsPT1ifHxiPT09ITE/YjpiLnNpemUsdHlwZW9mIGI9PT1xP2IuYXBwbHkoYSk6YikpLGN9ZnVuY3Rpb24gZygpe3JldHVybidcXG4gICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpc3QtdWxcIj48L3NwYW4+XFxuICAgICd9ZnVuY3Rpb24gaCgpe3JldHVybidcXG4gICAgICA8c3BhbiBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tbGlzdFwiPjwvc3Bhbj5cXG4gICAgJ31mdW5jdGlvbiBpKCl7cmV0dXJuJ1xcbiAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlzdC1vbFwiPjwvc3Bhbj5cXG4gICAgJ31mdW5jdGlvbiBqKCl7cmV0dXJuJ1xcbiAgICAgIDxzcGFuIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi10aC1saXN0XCI+PC9zcGFuPlxcbiAgICAnfWZ1bmN0aW9uIGsoKXtyZXR1cm4nXFxuICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1vdXRkZW50XCI+PC9zcGFuPlxcbiAgICAnfWZ1bmN0aW9uIGwoKXtyZXR1cm4nXFxuICAgICAgPHNwYW4gY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWluZGVudC1yaWdodFwiPjwvc3Bhbj5cXG4gICAgJ31mdW5jdGlvbiBtKCl7cmV0dXJuJ1xcbiAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtaW5kZW50XCI+PC9zcGFuPlxcbiAgICAnfWZ1bmN0aW9uIG4oKXtyZXR1cm4nXFxuICAgICAgPHNwYW4gY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWluZGVudC1sZWZ0XCI+PC9zcGFuPlxcbiAgICAnfXRoaXMuY29tcGlsZXJJbmZvPVs0LFwiPj0gMS4wLjBcIl0sYz10aGlzLm1lcmdlKGMsYS5oZWxwZXJzKSxlPWV8fHt9O3ZhciBvLHA9XCJcIixxPVwiZnVuY3Rpb25cIixyPXRoaXMuZXNjYXBlRXhwcmVzc2lvbixzPXRoaXM7cmV0dXJuIHArPSc8bGk+XFxuICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XFxuICAgIDxhIGNsYXNzPVwiYnRuICcsbz1jW1wiaWZcIl0uY2FsbChiLChvPWImJmIub3B0aW9ucyxvPW51bGw9PW98fG89PT0hMT9vOm8udG9vbGJhcixudWxsPT1vfHxvPT09ITE/bzpvLnNpemUpLHtoYXNoOnt9LGludmVyc2U6cy5ub29wLGZuOnMucHJvZ3JhbSgxLGYsZSksZGF0YTplfSksKG98fDA9PT1vKSYmKHArPW8pLHArPScgYnRuLWRlZmF1bHRcIiBkYXRhLXd5c2lodG1sNS1jb21tYW5kPVwiaW5zZXJ0VW5vcmRlcmVkTGlzdFwiIHRpdGxlPVwiJytyKChvPWImJmIubG9jYWxlLG89bnVsbD09b3x8bz09PSExP286by5saXN0cyxvPW51bGw9PW98fG89PT0hMT9vOm8udW5vcmRlcmVkLHR5cGVvZiBvPT09cT9vLmFwcGx5KGIpOm8pKSsnXCIgdGFiaW5kZXg9XCItMVwiPlxcbiAgICAnLG89Y1tcImlmXCJdLmNhbGwoYiwobz1iJiZiLm9wdGlvbnMsbz1udWxsPT1vfHxvPT09ITE/bzpvLnRvb2xiYXIsbnVsbD09b3x8bz09PSExP286by5mYSkse2hhc2g6e30saW52ZXJzZTpzLnByb2dyYW0oNSxoLGUpLGZuOnMucHJvZ3JhbSgzLGcsZSksZGF0YTplfSksKG98fDA9PT1vKSYmKHArPW8pLHArPSdcXG4gICAgPC9hPlxcbiAgICA8YSBjbGFzcz1cImJ0biAnLG89Y1tcImlmXCJdLmNhbGwoYiwobz1iJiZiLm9wdGlvbnMsbz1udWxsPT1vfHxvPT09ITE/bzpvLnRvb2xiYXIsbnVsbD09b3x8bz09PSExP286by5zaXplKSx7aGFzaDp7fSxpbnZlcnNlOnMubm9vcCxmbjpzLnByb2dyYW0oMSxmLGUpLGRhdGE6ZX0pLChvfHwwPT09bykmJihwKz1vKSxwKz0nIGJ0bi1kZWZhdWx0XCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZD1cImluc2VydE9yZGVyZWRMaXN0XCIgdGl0bGU9XCInK3IoKG89YiYmYi5sb2NhbGUsbz1udWxsPT1vfHxvPT09ITE/bzpvLmxpc3RzLG89bnVsbD09b3x8bz09PSExP286by5vcmRlcmVkLHR5cGVvZiBvPT09cT9vLmFwcGx5KGIpOm8pKSsnXCIgdGFiaW5kZXg9XCItMVwiPlxcbiAgICAnLG89Y1tcImlmXCJdLmNhbGwoYiwobz1iJiZiLm9wdGlvbnMsbz1udWxsPT1vfHxvPT09ITE/bzpvLnRvb2xiYXIsbnVsbD09b3x8bz09PSExP286by5mYSkse2hhc2g6e30saW52ZXJzZTpzLnByb2dyYW0oOSxqLGUpLGZuOnMucHJvZ3JhbSg3LGksZSksZGF0YTplfSksKG98fDA9PT1vKSYmKHArPW8pLHArPSdcXG4gICAgPC9hPlxcbiAgICA8YSBjbGFzcz1cImJ0biAnLG89Y1tcImlmXCJdLmNhbGwoYiwobz1iJiZiLm9wdGlvbnMsbz1udWxsPT1vfHxvPT09ITE/bzpvLnRvb2xiYXIsbnVsbD09b3x8bz09PSExP286by5zaXplKSx7aGFzaDp7fSxpbnZlcnNlOnMubm9vcCxmbjpzLnByb2dyYW0oMSxmLGUpLGRhdGE6ZX0pLChvfHwwPT09bykmJihwKz1vKSxwKz0nIGJ0bi1kZWZhdWx0XCIgZGF0YS13eXNpaHRtbDUtY29tbWFuZD1cIk91dGRlbnRcIiB0aXRsZT1cIicrcigobz1iJiZiLmxvY2FsZSxvPW51bGw9PW98fG89PT0hMT9vOm8ubGlzdHMsbz1udWxsPT1vfHxvPT09ITE/bzpvLm91dGRlbnQsdHlwZW9mIG89PT1xP28uYXBwbHkoYik6bykpKydcIiB0YWJpbmRleD1cIi0xXCI+XFxuICAgICcsbz1jW1wiaWZcIl0uY2FsbChiLChvPWImJmIub3B0aW9ucyxvPW51bGw9PW98fG89PT0hMT9vOm8udG9vbGJhcixudWxsPT1vfHxvPT09ITE/bzpvLmZhKSx7aGFzaDp7fSxpbnZlcnNlOnMucHJvZ3JhbSgxMyxsLGUpLGZuOnMucHJvZ3JhbSgxMSxrLGUpLGRhdGE6ZX0pLChvfHwwPT09bykmJihwKz1vKSxwKz0nXFxuICAgIDwvYT5cXG4gICAgPGEgY2xhc3M9XCJidG4gJyxvPWNbXCJpZlwiXS5jYWxsKGIsKG89YiYmYi5vcHRpb25zLG89bnVsbD09b3x8bz09PSExP286by50b29sYmFyLG51bGw9PW98fG89PT0hMT9vOm8uc2l6ZSkse2hhc2g6e30saW52ZXJzZTpzLm5vb3AsZm46cy5wcm9ncmFtKDEsZixlKSxkYXRhOmV9KSwob3x8MD09PW8pJiYocCs9bykscCs9JyBidG4tZGVmYXVsdFwiIGRhdGEtd3lzaWh0bWw1LWNvbW1hbmQ9XCJJbmRlbnRcIiB0aXRsZT1cIicrcigobz1iJiZiLmxvY2FsZSxvPW51bGw9PW98fG89PT0hMT9vOm8ubGlzdHMsbz1udWxsPT1vfHxvPT09ITE/bzpvLmluZGVudCx0eXBlb2Ygbz09PXE/by5hcHBseShiKTpvKSkrJ1wiIHRhYmluZGV4PVwiLTFcIj5cXG4gICAgJyxvPWNbXCJpZlwiXS5jYWxsKGIsKG89YiYmYi5vcHRpb25zLG89bnVsbD09b3x8bz09PSExP286by50b29sYmFyLG51bGw9PW98fG89PT0hMT9vOm8uZmEpLHtoYXNoOnt9LGludmVyc2U6cy5wcm9ncmFtKDE3LG4sZSksZm46cy5wcm9ncmFtKDE1LG0sZSksZGF0YTplfSksKG98fDA9PT1vKSYmKHArPW8pLHArPVwiXFxuICAgIDwvYT5cXG4gIDwvZGl2PlxcbjwvbGk+XFxuXCIscH0pLGZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoXCJib290c3RyYXAud3lzaWh0bWw1XCIsW1wianF1ZXJ5XCIsXCJ3eXNpaHRtbDVcIixcImJvb3RzdHJhcFwiLFwiYm9vdHN0cmFwLnd5c2lodG1sNS50ZW1wbGF0ZXNcIixcImJvb3RzdHJhcC53eXNpaHRtbDUuY29tbWFuZHNcIl0sYSk6YShqUXVlcnksd3lzaWh0bWw1KX0oZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjt2YXIgYz1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gYi50cGxbYV0/Yi50cGxbYV0oe2xvY2FsZTpjLG9wdGlvbnM6ZH0pOnZvaWQgMH0sZz1mdW5jdGlvbihjLGUpe3ZhciBmLGc7dGhpcy5lbD1jLGY9YS5leHRlbmQoITAse30sZCxlKTtmb3IoZyBpbiBmLmN1c3RvbVRlbXBsYXRlcylmLmN1c3RvbVRlbXBsYXRlcy5oYXNPd25Qcm9wZXJ0eShnKSYmKGIudHBsW2ddPWYuY3VzdG9tVGVtcGxhdGVzW2ddKTt0aGlzLnRvb2xiYXI9dGhpcy5jcmVhdGVUb29sYmFyKGMsZiksdGhpcy5lZGl0b3I9dGhpcy5jcmVhdGVFZGl0b3IoZil9O2cucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpnLGNyZWF0ZUVkaXRvcjpmdW5jdGlvbihiKXtiPWJ8fHt9LGI9YS5leHRlbmQoITAse30sYiksYi50b29sYmFyPXRoaXMudG9vbGJhclswXSx0aGlzLmluaXRpYWxpemVFZGl0b3IodGhpcy5lbFswXSxiKX0saW5pdGlhbGl6ZUVkaXRvcjpmdW5jdGlvbihhLGMpe3ZhciBkLGU9bmV3IGIuRWRpdG9yKHRoaXMuZWxbMF0sYyk7aWYoZS5vbihcImJlZm9yZWxvYWRcIix0aGlzLnN5bmNCb290c3RyYXBEaWFsb2dFdmVudHMpLGUub24oXCJiZWZvcmVsb2FkXCIsdGhpcy5sb2FkUGFyc2VyUnVsZXMpLGUuY29tcG9zZXIuZWRpdGFibGVBcmVhLmNvbnRlbnREb2N1bWVudD90aGlzLmFkZE1vcmVTaG9ydGN1dHMoZSxlLmNvbXBvc2VyLmVkaXRhYmxlQXJlYS5jb250ZW50RG9jdW1lbnQuYm9keXx8ZS5jb21wb3Nlci5lZGl0YWJsZUFyZWEuY29udGVudERvY3VtZW50LGMuc2hvcnRjdXRzKTp0aGlzLmFkZE1vcmVTaG9ydGN1dHMoZSxlLmNvbXBvc2VyLmVkaXRhYmxlQXJlYSxjLnNob3J0Y3V0cyksYyYmYy5ldmVudHMpZm9yKGQgaW4gYy5ldmVudHMpYy5ldmVudHMuaGFzT3duUHJvcGVydHkoZCkmJmUub24oZCxjLmV2ZW50c1tkXSk7cmV0dXJuIGV9LGxvYWRQYXJzZXJSdWxlczpmdW5jdGlvbigpe1wic3RyaW5nXCI9PT1hLnR5cGUodGhpcy5jb25maWcucGFyc2VyUnVsZXMpJiZhLmFqYXgoe2RhdGFUeXBlOlwianNvblwiLHVybDp0aGlzLmNvbmZpZy5wYXJzZXJSdWxlcyxjb250ZXh0OnRoaXMsZXJyb3I6ZnVuY3Rpb24oYSxiLGMpe3ZvaWQgMH0sc3VjY2VzczpmdW5jdGlvbihhKXt0aGlzLmNvbmZpZy5wYXJzZXJSdWxlcz1hLHZvaWQgMH19KSx0aGlzLmNvbmZpZy5wYXN0ZVBhcnNlclJ1bGVzZXRzJiZcInN0cmluZ1wiPT09YS50eXBlKHRoaXMuY29uZmlnLnBhc3RlUGFyc2VyUnVsZXNldHMpJiZhLmFqYXgoe2RhdGFUeXBlOlwianNvblwiLHVybDp0aGlzLmNvbmZpZy5wYXN0ZVBhcnNlclJ1bGVzZXRzLGNvbnRleHQ6dGhpcyxlcnJvcjpmdW5jdGlvbihhLGIsYyl7dm9pZCAwfSxzdWNjZXNzOmZ1bmN0aW9uKGEpe3RoaXMuY29uZmlnLnBhc3RlUGFyc2VyUnVsZXNldHM9YX19KX0sc3luY0Jvb3RzdHJhcERpYWxvZ0V2ZW50czpmdW5jdGlvbigpe3ZhciBiPXRoaXM7YS5tYXAodGhpcy50b29sYmFyLmNvbW1hbmRNYXBwaW5nLGZ1bmN0aW9uKGEpe3JldHVyblthXX0pLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5kaWFsb2d9KS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlhbG9nfSkuZm9yRWFjaChmdW5jdGlvbihjKXtjLm9uKFwic2hvd1wiLGZ1bmN0aW9uKCl7YSh0aGlzLmNvbnRhaW5lcikubW9kYWwoXCJzaG93XCIpfSksYy5vbihcImhpZGVcIixmdW5jdGlvbigpe2EodGhpcy5jb250YWluZXIpLm1vZGFsKFwiaGlkZVwiKSxzZXRUaW1lb3V0KGIuY29tcG9zZXIuZm9jdXMsMCl9KSxhKGMuY29udGFpbmVyKS5vbihcInNob3duLmJzLm1vZGFsXCIsZnVuY3Rpb24oKXthKHRoaXMpLmZpbmQoXCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYVwiKS5maXJzdCgpLmZvY3VzKCl9KX0pLHRoaXMub24oXCJjaGFuZ2Vfdmlld1wiLGZ1bmN0aW9uKCl7YSh0aGlzLnRvb2xiYXIuY29udGFpbmVyLmNoaWxkcmVuKS5maW5kKFwiYS5idG5cIikubm90KCdbZGF0YS13eXNpaHRtbDUtYWN0aW9uPVwiY2hhbmdlX3ZpZXdcIl0nKS50b2dnbGVDbGFzcyhcImRpc2FibGVkXCIpfSl9LGNyZWF0ZVRvb2xiYXI6ZnVuY3Rpb24oYixjKXt2YXIgZyxoLGk9dGhpcyxqPWEoXCI8dWwvPlwiLHtcImNsYXNzXCI6XCJ3eXNpaHRtbDUtdG9vbGJhclwiLHN0eWxlOlwiZGlzcGxheTpub25lXCJ9KSxrPWMubG9jYWxlfHxkLmxvY2FsZXx8XCJlblwiO2UuaGFzT3duUHJvcGVydHkoayl8fCh2b2lkIDAsaz1cImVuXCIpLGc9YS5leHRlbmQoITAse30sZS5lbixlW2tdKTtmb3IoaCBpbiBjLnRvb2xiYXIpYy50b29sYmFyW2hdJiZqLmFwcGVuZChmKGgsZyxjKSk7cmV0dXJuIGouZmluZCgnYVtkYXRhLXd5c2lodG1sNS1jb21tYW5kPVwiZm9ybWF0QmxvY2tcIl0nKS5jbGljayhmdW5jdGlvbihiKXt2YXIgYz1iLmRlbGVnYXRlVGFyZ2V0fHxiLnRhcmdldHx8Yi5zcmNFbGVtZW50LGQ9YShjKSxlPWQuZGF0YShcInd5c2lodG1sNS1kaXNwbGF5LWZvcm1hdC1uYW1lXCIpLGY9ZC5kYXRhKFwid3lzaWh0bWw1LWZvcm1hdC1uYW1lXCIpfHxkLmh0bWwoKTsodm9pZCAwPT09ZXx8XCJ0cnVlXCI9PT1lKSYmaS50b29sYmFyLmZpbmQoXCIuY3VycmVudC1mb250XCIpLnRleHQoZil9KSxqLmZpbmQoJ2FbZGF0YS13eXNpaHRtbDUtY29tbWFuZD1cImZvcmVDb2xvclwiXScpLmNsaWNrKGZ1bmN0aW9uKGIpe3ZhciBjPWIudGFyZ2V0fHxiLnNyY0VsZW1lbnQsZD1hKGMpO2kudG9vbGJhci5maW5kKFwiLmN1cnJlbnQtY29sb3JcIikudGV4dChkLmh0bWwoKSl9KSx0aGlzLmVsLmJlZm9yZShqKSxqfSxhZGRNb3JlU2hvcnRjdXRzOmZ1bmN0aW9uKGEsYyxkKXtiLmRvbS5vYnNlcnZlKGMsXCJrZXlkb3duXCIsZnVuY3Rpb24oYyl7dmFyIGUsZj1jLmtleUNvZGUsZz1kW2ZdOyhjLmN0cmxLZXl8fGMubWV0YUtleXx8Yy5hbHRLZXkpJiZnJiZiLmNvbW1hbmRzW2ddJiYoZT1hLnRvb2xiYXIuY29tbWFuZE1hcHBpbmdbZytcIjpudWxsXCJdLGUmJmUuZGlhbG9nJiYhZS5zdGF0ZT9lLmRpYWxvZy5zaG93KCk6Yi5jb21tYW5kc1tnXS5leGVjKGEuY29tcG9zZXIsZyksYy5wcmV2ZW50RGVmYXVsdCgpKX0pfX0sYz17cmVzZXREZWZhdWx0czpmdW5jdGlvbigpe2EuZm4ud3lzaWh0bWw1LmRlZmF1bHRPcHRpb25zPWEuZXh0ZW5kKCEwLHt9LGEuZm4ud3lzaWh0bWw1LmRlZmF1bHRPcHRpb25zQ2FjaGUpfSxieXBhc3NEZWZhdWx0czpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKTtjLmRhdGEoXCJ3eXNpaHRtbDVcIixuZXcgZyhjLGIpKX0pfSxzaGFsbG93RXh0ZW5kOmZ1bmN0aW9uKGIpe3ZhciBkPWEuZXh0ZW5kKHt9LGEuZm4ud3lzaWh0bWw1LmRlZmF1bHRPcHRpb25zLGJ8fHt9LGEodGhpcykuZGF0YSgpKSxlPXRoaXM7cmV0dXJuIGMuYnlwYXNzRGVmYXVsdHMuYXBwbHkoZSxbZF0pfSxkZWVwRXh0ZW5kOmZ1bmN0aW9uKGIpe3ZhciBkPWEuZXh0ZW5kKCEwLHt9LGEuZm4ud3lzaWh0bWw1LmRlZmF1bHRPcHRpb25zLGJ8fHt9KSxlPXRoaXM7cmV0dXJuIGMuYnlwYXNzRGVmYXVsdHMuYXBwbHkoZSxbZF0pfSxpbml0OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7cmV0dXJuIGMuc2hhbGxvd0V4dGVuZC5hcHBseShiLFthXSl9fSxhLmZuLnd5c2lodG1sNT1mdW5jdGlvbihiKXtyZXR1cm4gY1tiXT9jW2JdLmFwcGx5KHRoaXMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTpcIm9iamVjdFwiIT10eXBlb2YgYiYmYj8oYS5lcnJvcihcIk1ldGhvZCBcIitiK1wiIGRvZXMgbm90IGV4aXN0IG9uIGpRdWVyeS53eXNpaHRtbDVcIiksdm9pZCAwKTpjLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhLmZuLnd5c2lodG1sNS5Db25zdHJ1Y3Rvcj1nLGQ9YS5mbi53eXNpaHRtbDUuZGVmYXVsdE9wdGlvbnM9e3Rvb2xiYXI6e1wiZm9udC1zdHlsZXNcIjohMCxjb2xvcjohMSxlbXBoYXNpczp7c21hbGw6ITB9LGJsb2NrcXVvdGU6ITAsbGlzdHM6ITAsaHRtbDohMSxsaW5rOiEwLGltYWdlOiEwLHNtYWxsbW9kYWxzOiExfSx1c2VMaW5lQnJlYWtzOiExLHBhcnNlclJ1bGVzOntjbGFzc2VzOntcInd5c2l3eWctY29sb3Itc2lsdmVyXCI6MSxcInd5c2l3eWctY29sb3ItZ3JheVwiOjEsXCJ3eXNpd3lnLWNvbG9yLXdoaXRlXCI6MSxcInd5c2l3eWctY29sb3ItbWFyb29uXCI6MSxcInd5c2l3eWctY29sb3ItcmVkXCI6MSxcInd5c2l3eWctY29sb3ItcHVycGxlXCI6MSxcInd5c2l3eWctY29sb3ItZnVjaHNpYVwiOjEsXCJ3eXNpd3lnLWNvbG9yLWdyZWVuXCI6MSxcInd5c2l3eWctY29sb3ItbGltZVwiOjEsXCJ3eXNpd3lnLWNvbG9yLW9saXZlXCI6MSxcInd5c2l3eWctY29sb3IteWVsbG93XCI6MSxcInd5c2l3eWctY29sb3ItbmF2eVwiOjEsXCJ3eXNpd3lnLWNvbG9yLWJsdWVcIjoxLFwid3lzaXd5Zy1jb2xvci10ZWFsXCI6MSxcInd5c2l3eWctY29sb3ItYXF1YVwiOjEsXCJ3eXNpd3lnLWNvbG9yLW9yYW5nZVwiOjF9LHRhZ3M6e2I6e30saTp7fSxzdHJvbmc6e30sZW06e30scDp7fSxicjp7fSxvbDp7fSx1bDp7fSxsaTp7fSxoMTp7fSxoMjp7fSxoMzp7fSxoNDp7fSxoNTp7fSxoNjp7fSxibG9ja3F1b3RlOnt9LHU6MSxpbWc6e2NoZWNrX2F0dHJpYnV0ZXM6e3dpZHRoOlwibnVtYmVyc1wiLGFsdDpcImFsdFwiLHNyYzpcInVybFwiLGhlaWdodDpcIm51bWJlcnNcIn19LGE6e2NoZWNrX2F0dHJpYnV0ZXM6e2hyZWY6XCJ1cmxcIn0sc2V0X2F0dHJpYnV0ZXM6e3RhcmdldDpcIl9ibGFua1wiLHJlbDpcIm5vZm9sbG93XCJ9fSxzcGFuOjEsZGl2OjEsc21hbGw6MSxjb2RlOjEscHJlOjF9fSxsb2NhbGU6XCJlblwiLHNob3J0Y3V0czp7ODM6XCJzbWFsbFwiLDc1OlwiY3JlYXRlTGlua1wifX0sdm9pZCAwPT09YS5mbi53eXNpaHRtbDUuZGVmYXVsdE9wdGlvbnNDYWNoZSYmKGEuZm4ud3lzaWh0bWw1LmRlZmF1bHRPcHRpb25zQ2FjaGU9YS5leHRlbmQoITAse30sYS5mbi53eXNpaHRtbDUuZGVmYXVsdE9wdGlvbnMpKSxlPWEuZm4ud3lzaWh0bWw1LmxvY2FsZT17fX07YyhhLGIpfSksZnVuY3Rpb24oYSl7YS5jb21tYW5kcy5zbWFsbD17ZXhlYzpmdW5jdGlvbihiLGMpe3JldHVybiBhLmNvbW1hbmRzLmZvcm1hdElubGluZS5leGVjKGIsYyxcInNtYWxsXCIpfSxzdGF0ZTpmdW5jdGlvbihiLGMpe3JldHVybiBhLmNvbW1hbmRzLmZvcm1hdElubGluZS5zdGF0ZShiLGMsXCJzbWFsbFwiKX19fSh3eXNpaHRtbDUpLGZ1bmN0aW9uKGEpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoXCJib290c3RyYXAud3lzaWh0bWw1LmVuLVVTXCIsW1wianF1ZXJ5XCIsXCJib290c3RyYXAud3lzaWh0bWw1XCJdLGEpOmEoalF1ZXJ5KX0oZnVuY3Rpb24oYSl7YS5mbi53eXNpaHRtbDUubG9jYWxlLmVuPWEuZm4ud3lzaWh0bWw1LmxvY2FsZVtcImVuLVVTXCJdPXtmb250X3N0eWxlczp7bm9ybWFsOlwiTm9ybWFsIHRleHRcIixoMTpcIkhlYWRpbmcgMVwiLGgyOlwiSGVhZGluZyAyXCIsaDM6XCJIZWFkaW5nIDNcIixoNDpcIkhlYWRpbmcgNFwiLGg1OlwiSGVhZGluZyA1XCIsaDY6XCJIZWFkaW5nIDZcIn0sZW1waGFzaXM6e2JvbGQ6XCJCb2xkXCIsaXRhbGljOlwiSXRhbGljXCIsdW5kZXJsaW5lOlwiVW5kZXJsaW5lXCIsc21hbGw6XCJTbWFsbFwifSxsaXN0czp7dW5vcmRlcmVkOlwiVW5vcmRlcmVkIGxpc3RcIixvcmRlcmVkOlwiT3JkZXJlZCBsaXN0XCIsb3V0ZGVudDpcIk91dGRlbnRcIixpbmRlbnQ6XCJJbmRlbnRcIn0sbGluazp7aW5zZXJ0OlwiSW5zZXJ0IGxpbmtcIixjYW5jZWw6XCJDYW5jZWxcIix0YXJnZXQ6XCJPcGVuIGxpbmsgaW4gbmV3IHdpbmRvd1wifSxpbWFnZTp7aW5zZXJ0OlwiSW5zZXJ0IGltYWdlXCIsY2FuY2VsOlwiQ2FuY2VsXCJ9LGh0bWw6e2VkaXQ6XCJFZGl0IEhUTUxcIn0sY29sb3Vyczp7YmxhY2s6XCJCbGFja1wiLHNpbHZlcjpcIlNpbHZlclwiLGdyYXk6XCJHcmV5XCIsbWFyb29uOlwiTWFyb29uXCIscmVkOlwiUmVkXCIscHVycGxlOlwiUHVycGxlXCIsZ3JlZW46XCJHcmVlblwiLG9saXZlOlwiT2xpdmVcIixuYXZ5OlwiTmF2eVwiLGJsdWU6XCJCbHVlXCIsb3JhbmdlOlwiT3JhbmdlXCJ9fX0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3ZlbmRvci9hbG1hc2FlZWQyMDEwL2FkbWlubHRlL3BsdWdpbnMvYm9vdHN0cmFwLXd5c2lodG1sNS9ib290c3RyYXAzLXd5c2lodG1sNS5hbGwubWluLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///60\n");
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports) {
+
+eval("/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)\n * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)\n * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.\n *\n * Version: 1.3.8\n *\n */\n(function(e){e.fn.extend({slimScroll:function(f){var a=e.extend({width:\"auto\",height:\"250px\",size:\"7px\",color:\"#000\",position:\"right\",distance:\"1px\",start:\"top\",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:\"#333\",railOpacity:.2,railDraggable:!0,railClass:\"slimScrollRail\",barClass:\"slimScrollBar\",wrapperClass:\"slimScrollDiv\",allowPageScroll:!1,wheelStep:20,touchScrollStep:200,borderRadius:\"7px\",railBorderRadius:\"7px\"},f);this.each(function(){function v(d){if(r){d=d||window.event;\nvar c=0;d.wheelDelta&&(c=-d.wheelDelta/120);d.detail&&(c=d.detail/3);e(d.target||d.srcTarget||d.srcElement).closest(\".\"+a.wrapperClass).is(b.parent())&&n(c,!0);d.preventDefault&&!k&&d.preventDefault();k||(d.returnValue=!1)}}function n(d,g,e){k=!1;var f=b.outerHeight()-c.outerHeight();g&&(g=parseInt(c.css(\"top\"))+d*parseInt(a.wheelStep)/100*c.outerHeight(),g=Math.min(Math.max(g,0),f),g=0<d?Math.ceil(g):Math.floor(g),c.css({top:g+\"px\"}));l=parseInt(c.css(\"top\"))/(b.outerHeight()-c.outerHeight());g=\nl*(b[0].scrollHeight-b.outerHeight());e&&(g=d,d=g/b[0].scrollHeight*b.outerHeight(),d=Math.min(Math.max(d,0),f),c.css({top:d+\"px\"}));b.scrollTop(g);b.trigger(\"slimscrolling\",~~g);w();p()}function x(){u=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),30);c.css({height:u+\"px\"});var a=u==b.outerHeight()?\"none\":\"block\";c.css({display:a})}function w(){x();clearTimeout(B);l==~~l?(k=a.allowPageScroll,C!=l&&b.trigger(\"slimscroll\",0==~~l?\"top\":\"bottom\")):k=!1;C=l;u>=b.outerHeight()?k=!0:(c.stop(!0,\n!0).fadeIn(\"fast\"),a.railVisible&&m.stop(!0,!0).fadeIn(\"fast\"))}function p(){a.alwaysVisible||(B=setTimeout(function(){a.disableFadeOut&&r||y||z||(c.fadeOut(\"slow\"),m.fadeOut(\"slow\"))},1E3))}var r,y,z,B,A,u,l,C,k=!1,b=e(this);if(b.parent().hasClass(a.wrapperClass)){var q=b.scrollTop(),c=b.siblings(\".\"+a.barClass),m=b.siblings(\".\"+a.railClass);x();if(e.isPlainObject(f)){if(\"height\"in f&&\"auto\"==f.height){b.parent().css(\"height\",\"auto\");b.css(\"height\",\"auto\");var h=b.parent().parent().height();b.parent().css(\"height\",\nh);b.css(\"height\",h)}else\"height\"in f&&(h=f.height,b.parent().css(\"height\",h),b.css(\"height\",h));if(\"scrollTo\"in f)q=parseInt(a.scrollTo);else if(\"scrollBy\"in f)q+=parseInt(a.scrollBy);else if(\"destroy\"in f){c.remove();m.remove();b.unwrap();return}n(q,!1,!0)}}else if(!(e.isPlainObject(f)&&\"destroy\"in f)){a.height=\"auto\"==a.height?b.parent().height():a.height;q=e(\"<div></div>\").addClass(a.wrapperClass).css({position:\"relative\",overflow:\"hidden\",width:a.width,height:a.height});b.css({overflow:\"hidden\",\nwidth:a.width,height:a.height});var m=e(\"<div></div>\").addClass(a.railClass).css({width:a.size,height:\"100%\",position:\"absolute\",top:0,display:a.alwaysVisible&&a.railVisible?\"block\":\"none\",\"border-radius\":a.railBorderRadius,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=e(\"<div></div>\").addClass(a.barClass).css({background:a.color,width:a.size,position:\"absolute\",top:0,opacity:a.opacity,display:a.alwaysVisible?\"block\":\"none\",\"border-radius\":a.borderRadius,BorderRadius:a.borderRadius,MozBorderRadius:a.borderRadius,\nWebkitBorderRadius:a.borderRadius,zIndex:99}),h=\"right\"==a.position?{right:a.distance}:{left:a.distance};m.css(h);c.css(h);b.wrap(q);b.parent().append(c);b.parent().append(m);a.railDraggable&&c.bind(\"mousedown\",function(a){var b=e(document);z=!0;t=parseFloat(c.css(\"top\"));pageY=a.pageY;b.bind(\"mousemove.slimscroll\",function(a){currTop=t+a.pageY-pageY;c.css(\"top\",currTop);n(0,c.position().top,!1)});b.bind(\"mouseup.slimscroll\",function(a){z=!1;p();b.unbind(\".slimscroll\")});return!1}).bind(\"selectstart.slimscroll\",\nfunction(a){a.stopPropagation();a.preventDefault();return!1});m.hover(function(){w()},function(){p()});c.hover(function(){y=!0},function(){y=!1});b.hover(function(){r=!0;w();p()},function(){r=!1;p()});b.bind(\"touchstart\",function(a,b){a.originalEvent.touches.length&&(A=a.originalEvent.touches[0].pageY)});b.bind(\"touchmove\",function(b){k||b.originalEvent.preventDefault();b.originalEvent.touches.length&&(n((A-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0),A=b.originalEvent.touches[0].pageY)});\nx();\"bottom\"===a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),n(0,!0)):\"top\"!==a.start&&(n(e(a.start).position().top,null,!0),a.alwaysVisible||c.hide());window.addEventListener?(this.addEventListener(\"DOMMouseScroll\",v,!1),this.addEventListener(\"mousewheel\",v,!1)):document.attachEvent(\"onmousewheel\",v)}});return this}});e.fn.extend({slimscroll:e.fn.slimScroll})})(jQuery);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS1zbGltc2Nyb2xsL2pxdWVyeS5zbGltc2Nyb2xsLm1pbi5qcz8xNWE0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhLHVCQUF1QixnQkFBZ0IsNlhBQTZYLElBQUkscUJBQXFCLGNBQWMsTUFBTTtBQUMzZSxRQUFRLG9DQUFvQyx5QkFBeUIsMkZBQTJGLHlDQUF5Qyx1QkFBdUIsa0JBQWtCLEtBQUssc0NBQXNDLDZJQUE2SSxXQUFXLEdBQUcsMkRBQTJEO0FBQ25mLHNDQUFzQyxpRkFBaUYsV0FBVyxHQUFHLGVBQWUsK0JBQStCLElBQUksSUFBSSxhQUFhLGlFQUFpRSxPQUFPLGNBQWMsRUFBRSx3Q0FBd0MsT0FBTyxVQUFVLEVBQUUsYUFBYSxJQUFJLGdCQUFnQixzRkFBc0YsSUFBSTtBQUN0ZCxnRUFBZ0UsYUFBYSwwQ0FBMEMsaUVBQWlFLE9BQU8sbUNBQW1DLHdDQUF3QywrRUFBK0UsSUFBSSx1QkFBdUIsbUNBQW1DLGdDQUFnQyx1QkFBdUIsbUNBQW1DO0FBQ2pmLEdBQUcsa0JBQWtCLDRFQUE0RSx5Q0FBeUMsK0NBQStDLHVCQUF1QixXQUFXLFdBQVcsV0FBVyxPQUFPLFlBQVksOENBQThDLHVEQUF1RCxpREFBaUQsb0VBQW9FLEVBQUUsT0FBTztBQUN2ZSw4QkFBOEIsRUFBRSxrREFBa0QscU1BQXFNLCtDQUErQztBQUN0VSw0Q0FBNEMseUJBQXlCLGlCQUFpQixFQUFFLGlCQUFpQixTQUFTLFNBQVMsVUFBVSxxQkFBcUIscUJBQXFCLGdEQUFnRCxrQkFBa0IsS0FBSywyQkFBMkIsY0FBYywwQ0FBMEMsd0JBQXdCLHFCQUFxQix5QkFBeUIsRUFBRSx3Q0FBd0MsS0FBSyxJQUFJLHdCQUF3QixFQUFFLFNBQVM7QUFDcmUsWUFBWSxvQkFBb0IsbUJBQW1CLFNBQVMsRUFBRSxtQkFBbUIsSUFBSSxZQUFZLElBQUksRUFBRSxtQkFBbUIsS0FBSyxZQUFZLEtBQUssRUFBRSxtQkFBbUIsS0FBSyxJQUFJLElBQUksWUFBWSxLQUFLLElBQUksRUFBRSxrQ0FBa0MscUVBQXFFLEVBQUUsK0JBQStCLG9DQUFvQyxrSUFBa0k7QUFDdmYsSUFBSSwyQkFBMkIsb0NBQW9DLDZGQUE2Rix3SkFBd0osRUFBRSxhQUFhLEVBQUUsYUFBYSwyQkFBMkIsRUFBRSIsImZpbGUiOiI2MS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qISBDb3B5cmlnaHQgKGMpIDIwMTEgUGlvdHIgUm9jaGFsYSAoaHR0cDovL3JvY2hhLmxhKVxuICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocClcbiAqIGFuZCBHUEwgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhwKSBsaWNlbnNlcy5cbiAqXG4gKiBWZXJzaW9uOiAxLjMuOFxuICpcbiAqL1xuKGZ1bmN0aW9uKGUpe2UuZm4uZXh0ZW5kKHtzbGltU2Nyb2xsOmZ1bmN0aW9uKGYpe3ZhciBhPWUuZXh0ZW5kKHt3aWR0aDpcImF1dG9cIixoZWlnaHQ6XCIyNTBweFwiLHNpemU6XCI3cHhcIixjb2xvcjpcIiMwMDBcIixwb3NpdGlvbjpcInJpZ2h0XCIsZGlzdGFuY2U6XCIxcHhcIixzdGFydDpcInRvcFwiLG9wYWNpdHk6LjQsYWx3YXlzVmlzaWJsZTohMSxkaXNhYmxlRmFkZU91dDohMSxyYWlsVmlzaWJsZTohMSxyYWlsQ29sb3I6XCIjMzMzXCIscmFpbE9wYWNpdHk6LjIscmFpbERyYWdnYWJsZTohMCxyYWlsQ2xhc3M6XCJzbGltU2Nyb2xsUmFpbFwiLGJhckNsYXNzOlwic2xpbVNjcm9sbEJhclwiLHdyYXBwZXJDbGFzczpcInNsaW1TY3JvbGxEaXZcIixhbGxvd1BhZ2VTY3JvbGw6ITEsd2hlZWxTdGVwOjIwLHRvdWNoU2Nyb2xsU3RlcDoyMDAsYm9yZGVyUmFkaXVzOlwiN3B4XCIscmFpbEJvcmRlclJhZGl1czpcIjdweFwifSxmKTt0aGlzLmVhY2goZnVuY3Rpb24oKXtmdW5jdGlvbiB2KGQpe2lmKHIpe2Q9ZHx8d2luZG93LmV2ZW50O1xudmFyIGM9MDtkLndoZWVsRGVsdGEmJihjPS1kLndoZWVsRGVsdGEvMTIwKTtkLmRldGFpbCYmKGM9ZC5kZXRhaWwvMyk7ZShkLnRhcmdldHx8ZC5zcmNUYXJnZXR8fGQuc3JjRWxlbWVudCkuY2xvc2VzdChcIi5cIithLndyYXBwZXJDbGFzcykuaXMoYi5wYXJlbnQoKSkmJm4oYywhMCk7ZC5wcmV2ZW50RGVmYXVsdCYmIWsmJmQucHJldmVudERlZmF1bHQoKTtrfHwoZC5yZXR1cm5WYWx1ZT0hMSl9fWZ1bmN0aW9uIG4oZCxnLGUpe2s9ITE7dmFyIGY9Yi5vdXRlckhlaWdodCgpLWMub3V0ZXJIZWlnaHQoKTtnJiYoZz1wYXJzZUludChjLmNzcyhcInRvcFwiKSkrZCpwYXJzZUludChhLndoZWVsU3RlcCkvMTAwKmMub3V0ZXJIZWlnaHQoKSxnPU1hdGgubWluKE1hdGgubWF4KGcsMCksZiksZz0wPGQ/TWF0aC5jZWlsKGcpOk1hdGguZmxvb3IoZyksYy5jc3Moe3RvcDpnK1wicHhcIn0pKTtsPXBhcnNlSW50KGMuY3NzKFwidG9wXCIpKS8oYi5vdXRlckhlaWdodCgpLWMub3V0ZXJIZWlnaHQoKSk7Zz1cbmwqKGJbMF0uc2Nyb2xsSGVpZ2h0LWIub3V0ZXJIZWlnaHQoKSk7ZSYmKGc9ZCxkPWcvYlswXS5zY3JvbGxIZWlnaHQqYi5vdXRlckhlaWdodCgpLGQ9TWF0aC5taW4oTWF0aC5tYXgoZCwwKSxmKSxjLmNzcyh7dG9wOmQrXCJweFwifSkpO2Iuc2Nyb2xsVG9wKGcpO2IudHJpZ2dlcihcInNsaW1zY3JvbGxpbmdcIix+fmcpO3coKTtwKCl9ZnVuY3Rpb24geCgpe3U9TWF0aC5tYXgoYi5vdXRlckhlaWdodCgpL2JbMF0uc2Nyb2xsSGVpZ2h0KmIub3V0ZXJIZWlnaHQoKSwzMCk7Yy5jc3Moe2hlaWdodDp1K1wicHhcIn0pO3ZhciBhPXU9PWIub3V0ZXJIZWlnaHQoKT9cIm5vbmVcIjpcImJsb2NrXCI7Yy5jc3Moe2Rpc3BsYXk6YX0pfWZ1bmN0aW9uIHcoKXt4KCk7Y2xlYXJUaW1lb3V0KEIpO2w9PX5+bD8oaz1hLmFsbG93UGFnZVNjcm9sbCxDIT1sJiZiLnRyaWdnZXIoXCJzbGltc2Nyb2xsXCIsMD09fn5sP1widG9wXCI6XCJib3R0b21cIikpOms9ITE7Qz1sO3U+PWIub3V0ZXJIZWlnaHQoKT9rPSEwOihjLnN0b3AoITAsXG4hMCkuZmFkZUluKFwiZmFzdFwiKSxhLnJhaWxWaXNpYmxlJiZtLnN0b3AoITAsITApLmZhZGVJbihcImZhc3RcIikpfWZ1bmN0aW9uIHAoKXthLmFsd2F5c1Zpc2libGV8fChCPXNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmRpc2FibGVGYWRlT3V0JiZyfHx5fHx6fHwoYy5mYWRlT3V0KFwic2xvd1wiKSxtLmZhZGVPdXQoXCJzbG93XCIpKX0sMUUzKSl9dmFyIHIseSx6LEIsQSx1LGwsQyxrPSExLGI9ZSh0aGlzKTtpZihiLnBhcmVudCgpLmhhc0NsYXNzKGEud3JhcHBlckNsYXNzKSl7dmFyIHE9Yi5zY3JvbGxUb3AoKSxjPWIuc2libGluZ3MoXCIuXCIrYS5iYXJDbGFzcyksbT1iLnNpYmxpbmdzKFwiLlwiK2EucmFpbENsYXNzKTt4KCk7aWYoZS5pc1BsYWluT2JqZWN0KGYpKXtpZihcImhlaWdodFwiaW4gZiYmXCJhdXRvXCI9PWYuaGVpZ2h0KXtiLnBhcmVudCgpLmNzcyhcImhlaWdodFwiLFwiYXV0b1wiKTtiLmNzcyhcImhlaWdodFwiLFwiYXV0b1wiKTt2YXIgaD1iLnBhcmVudCgpLnBhcmVudCgpLmhlaWdodCgpO2IucGFyZW50KCkuY3NzKFwiaGVpZ2h0XCIsXG5oKTtiLmNzcyhcImhlaWdodFwiLGgpfWVsc2VcImhlaWdodFwiaW4gZiYmKGg9Zi5oZWlnaHQsYi5wYXJlbnQoKS5jc3MoXCJoZWlnaHRcIixoKSxiLmNzcyhcImhlaWdodFwiLGgpKTtpZihcInNjcm9sbFRvXCJpbiBmKXE9cGFyc2VJbnQoYS5zY3JvbGxUbyk7ZWxzZSBpZihcInNjcm9sbEJ5XCJpbiBmKXErPXBhcnNlSW50KGEuc2Nyb2xsQnkpO2Vsc2UgaWYoXCJkZXN0cm95XCJpbiBmKXtjLnJlbW92ZSgpO20ucmVtb3ZlKCk7Yi51bndyYXAoKTtyZXR1cm59bihxLCExLCEwKX19ZWxzZSBpZighKGUuaXNQbGFpbk9iamVjdChmKSYmXCJkZXN0cm95XCJpbiBmKSl7YS5oZWlnaHQ9XCJhdXRvXCI9PWEuaGVpZ2h0P2IucGFyZW50KCkuaGVpZ2h0KCk6YS5oZWlnaHQ7cT1lKFwiPGRpdj48L2Rpdj5cIikuYWRkQ2xhc3MoYS53cmFwcGVyQ2xhc3MpLmNzcyh7cG9zaXRpb246XCJyZWxhdGl2ZVwiLG92ZXJmbG93OlwiaGlkZGVuXCIsd2lkdGg6YS53aWR0aCxoZWlnaHQ6YS5oZWlnaHR9KTtiLmNzcyh7b3ZlcmZsb3c6XCJoaWRkZW5cIixcbndpZHRoOmEud2lkdGgsaGVpZ2h0OmEuaGVpZ2h0fSk7dmFyIG09ZShcIjxkaXY+PC9kaXY+XCIpLmFkZENsYXNzKGEucmFpbENsYXNzKS5jc3Moe3dpZHRoOmEuc2l6ZSxoZWlnaHQ6XCIxMDAlXCIscG9zaXRpb246XCJhYnNvbHV0ZVwiLHRvcDowLGRpc3BsYXk6YS5hbHdheXNWaXNpYmxlJiZhLnJhaWxWaXNpYmxlP1wiYmxvY2tcIjpcIm5vbmVcIixcImJvcmRlci1yYWRpdXNcIjphLnJhaWxCb3JkZXJSYWRpdXMsYmFja2dyb3VuZDphLnJhaWxDb2xvcixvcGFjaXR5OmEucmFpbE9wYWNpdHksekluZGV4OjkwfSksYz1lKFwiPGRpdj48L2Rpdj5cIikuYWRkQ2xhc3MoYS5iYXJDbGFzcykuY3NzKHtiYWNrZ3JvdW5kOmEuY29sb3Isd2lkdGg6YS5zaXplLHBvc2l0aW9uOlwiYWJzb2x1dGVcIix0b3A6MCxvcGFjaXR5OmEub3BhY2l0eSxkaXNwbGF5OmEuYWx3YXlzVmlzaWJsZT9cImJsb2NrXCI6XCJub25lXCIsXCJib3JkZXItcmFkaXVzXCI6YS5ib3JkZXJSYWRpdXMsQm9yZGVyUmFkaXVzOmEuYm9yZGVyUmFkaXVzLE1vekJvcmRlclJhZGl1czphLmJvcmRlclJhZGl1cyxcbldlYmtpdEJvcmRlclJhZGl1czphLmJvcmRlclJhZGl1cyx6SW5kZXg6OTl9KSxoPVwicmlnaHRcIj09YS5wb3NpdGlvbj97cmlnaHQ6YS5kaXN0YW5jZX06e2xlZnQ6YS5kaXN0YW5jZX07bS5jc3MoaCk7Yy5jc3MoaCk7Yi53cmFwKHEpO2IucGFyZW50KCkuYXBwZW5kKGMpO2IucGFyZW50KCkuYXBwZW5kKG0pO2EucmFpbERyYWdnYWJsZSYmYy5iaW5kKFwibW91c2Vkb3duXCIsZnVuY3Rpb24oYSl7dmFyIGI9ZShkb2N1bWVudCk7ej0hMDt0PXBhcnNlRmxvYXQoYy5jc3MoXCJ0b3BcIikpO3BhZ2VZPWEucGFnZVk7Yi5iaW5kKFwibW91c2Vtb3ZlLnNsaW1zY3JvbGxcIixmdW5jdGlvbihhKXtjdXJyVG9wPXQrYS5wYWdlWS1wYWdlWTtjLmNzcyhcInRvcFwiLGN1cnJUb3ApO24oMCxjLnBvc2l0aW9uKCkudG9wLCExKX0pO2IuYmluZChcIm1vdXNldXAuc2xpbXNjcm9sbFwiLGZ1bmN0aW9uKGEpe3o9ITE7cCgpO2IudW5iaW5kKFwiLnNsaW1zY3JvbGxcIil9KTtyZXR1cm4hMX0pLmJpbmQoXCJzZWxlY3RzdGFydC5zbGltc2Nyb2xsXCIsXG5mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpO2EucHJldmVudERlZmF1bHQoKTtyZXR1cm4hMX0pO20uaG92ZXIoZnVuY3Rpb24oKXt3KCl9LGZ1bmN0aW9uKCl7cCgpfSk7Yy5ob3ZlcihmdW5jdGlvbigpe3k9ITB9LGZ1bmN0aW9uKCl7eT0hMX0pO2IuaG92ZXIoZnVuY3Rpb24oKXtyPSEwO3coKTtwKCl9LGZ1bmN0aW9uKCl7cj0hMTtwKCl9KTtiLmJpbmQoXCJ0b3VjaHN0YXJ0XCIsZnVuY3Rpb24oYSxiKXthLm9yaWdpbmFsRXZlbnQudG91Y2hlcy5sZW5ndGgmJihBPWEub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLnBhZ2VZKX0pO2IuYmluZChcInRvdWNobW92ZVwiLGZ1bmN0aW9uKGIpe2t8fGIub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO2Iub3JpZ2luYWxFdmVudC50b3VjaGVzLmxlbmd0aCYmKG4oKEEtYi5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0ucGFnZVkpL2EudG91Y2hTY3JvbGxTdGVwLCEwKSxBPWIub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLnBhZ2VZKX0pO1xueCgpO1wiYm90dG9tXCI9PT1hLnN0YXJ0PyhjLmNzcyh7dG9wOmIub3V0ZXJIZWlnaHQoKS1jLm91dGVySGVpZ2h0KCl9KSxuKDAsITApKTpcInRvcFwiIT09YS5zdGFydCYmKG4oZShhLnN0YXJ0KS5wb3NpdGlvbigpLnRvcCxudWxsLCEwKSxhLmFsd2F5c1Zpc2libGV8fGMuaGlkZSgpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcj8odGhpcy5hZGRFdmVudExpc3RlbmVyKFwiRE9NTW91c2VTY3JvbGxcIix2LCExKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXdoZWVsXCIsdiwhMSkpOmRvY3VtZW50LmF0dGFjaEV2ZW50KFwib25tb3VzZXdoZWVsXCIsdil9fSk7cmV0dXJuIHRoaXN9fSk7ZS5mbi5leHRlbmQoe3NsaW1zY3JvbGw6ZS5mbi5zbGltU2Nyb2xsfSl9KShqUXVlcnkpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vdmVuZG9yL2FsbWFzYWVlZDIwMTAvYWRtaW5sdGUvYm93ZXJfY29tcG9uZW50cy9qcXVlcnktc2xpbXNjcm9sbC9qcXVlcnkuc2xpbXNjcm9sbC5taW4uanNcbi8vIG1vZHVsZSBpZCA9IDYxXG4vLyBtb2R1bGUgY2h1bmtzID0gMSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///61\n");
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var __WEBPACK_AMD_DEFINE_RESULT__;;(function () {\n\t'use strict';\n\n\t/**\n\t * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.\n\t *\n\t * @codingstandard ftlabs-jsv2\n\t * @copyright The Financial Times Limited [All Rights Reserved]\n\t * @license MIT License (see LICENSE.txt)\n\t */\n\n\t/*jslint browser:true, node:true*/\n\t/*global define, Event, Node*/\n\n\n\t/**\n\t * Instantiate fast-clicking listeners on the specified layer.\n\t *\n\t * @constructor\n\t * @param {Element} layer The layer to listen on\n\t * @param {Object} [options={}] The options to override the defaults\n\t */\n\tfunction FastClick(layer, options) {\n\t\tvar oldOnClick;\n\n\t\toptions = options || {};\n\n\t\t/**\n\t\t * Whether a click is currently being tracked.\n\t\t *\n\t\t * @type boolean\n\t\t */\n\t\tthis.trackingClick = false;\n\n\n\t\t/**\n\t\t * Timestamp for when click tracking started.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.trackingClickStart = 0;\n\n\n\t\t/**\n\t\t * The element being tracked for a click.\n\t\t *\n\t\t * @type EventTarget\n\t\t */\n\t\tthis.targetElement = null;\n\n\n\t\t/**\n\t\t * X-coordinate of touch start event.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchStartX = 0;\n\n\n\t\t/**\n\t\t * Y-coordinate of touch start event.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchStartY = 0;\n\n\n\t\t/**\n\t\t * ID of the last touch, retrieved from Touch.identifier.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.lastTouchIdentifier = 0;\n\n\n\t\t/**\n\t\t * Touchmove boundary, beyond which a click will be cancelled.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchBoundary = options.touchBoundary || 10;\n\n\n\t\t/**\n\t\t * The FastClick layer.\n\t\t *\n\t\t * @type Element\n\t\t */\n\t\tthis.layer = layer;\n\n\t\t/**\n\t\t * The minimum time between tap(touchstart and touchend) events\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.tapDelay = options.tapDelay || 200;\n\n\t\t/**\n\t\t * The maximum time for a tap\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.tapTimeout = options.tapTimeout || 700;\n\n\t\tif (FastClick.notNeeded(layer)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Some old versions of Android don't have Function.prototype.bind\n\t\tfunction bind(method, context) {\n\t\t\treturn function() { return method.apply(context, arguments); };\n\t\t}\n\n\n\t\tvar methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'];\n\t\tvar context = this;\n\t\tfor (var i = 0, l = methods.length; i < l; i++) {\n\t\t\tcontext[methods[i]] = bind(context[methods[i]], context);\n\t\t}\n\n\t\t// Set up event handlers as required\n\t\tif (deviceIsAndroid) {\n\t\t\tlayer.addEventListener('mouseover', this.onMouse, true);\n\t\t\tlayer.addEventListener('mousedown', this.onMouse, true);\n\t\t\tlayer.addEventListener('mouseup', this.onMouse, true);\n\t\t}\n\n\t\tlayer.addEventListener('click', this.onClick, true);\n\t\tlayer.addEventListener('touchstart', this.onTouchStart, false);\n\t\tlayer.addEventListener('touchmove', this.onTouchMove, false);\n\t\tlayer.addEventListener('touchend', this.onTouchEnd, false);\n\t\tlayer.addEventListener('touchcancel', this.onTouchCancel, false);\n\n\t\t// Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)\n\t\t// which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick\n\t\t// layer when they are cancelled.\n\t\tif (!Event.prototype.stopImmediatePropagation) {\n\t\t\tlayer.removeEventListener = function(type, callback, capture) {\n\t\t\t\tvar rmv = Node.prototype.removeEventListener;\n\t\t\t\tif (type === 'click') {\n\t\t\t\t\trmv.call(layer, type, callback.hijacked || callback, capture);\n\t\t\t\t} else {\n\t\t\t\t\trmv.call(layer, type, callback, capture);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlayer.addEventListener = function(type, callback, capture) {\n\t\t\t\tvar adv = Node.prototype.addEventListener;\n\t\t\t\tif (type === 'click') {\n\t\t\t\t\tadv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) {\n\t\t\t\t\t\tif (!event.propagationStopped) {\n\t\t\t\t\t\t\tcallback(event);\n\t\t\t\t\t\t}\n\t\t\t\t\t}), capture);\n\t\t\t\t} else {\n\t\t\t\t\tadv.call(layer, type, callback, capture);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t// If a handler is already declared in the element's onclick attribute, it will be fired before\n\t\t// FastClick's onClick handler. Fix this by pulling out the user-defined handler function and\n\t\t// adding it as listener.\n\t\tif (typeof layer.onclick === 'function') {\n\n\t\t\t// Android browser on at least 3.2 requires a new reference to the function in layer.onclick\n\t\t\t// - the old one won't work if passed to addEventListener directly.\n\t\t\toldOnClick = layer.onclick;\n\t\t\tlayer.addEventListener('click', function(event) {\n\t\t\t\toldOnClick(event);\n\t\t\t}, false);\n\t\t\tlayer.onclick = null;\n\t\t}\n\t}\n\n\t/**\n\t* Windows Phone 8.1 fakes user agent string to look like Android and iPhone.\n\t*\n\t* @type boolean\n\t*/\n\tvar deviceIsWindowsPhone = navigator.userAgent.indexOf(\"Windows Phone\") >= 0;\n\n\t/**\n\t * Android requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone;\n\n\n\t/**\n\t * iOS requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone;\n\n\n\t/**\n\t * iOS 4 requires an exception for select elements.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOS4 = deviceIsIOS && (/OS 4_\\d(_\\d)?/).test(navigator.userAgent);\n\n\n\t/**\n\t * iOS 6.0-7.* requires the target element to be manually derived\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\\d/).test(navigator.userAgent);\n\n\t/**\n\t * BlackBerry requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0;\n\n\t/**\n\t * Determine whether a given element requires a native click.\n\t *\n\t * @param {EventTarget|Element} target Target DOM element\n\t * @returns {boolean} Returns true if the element needs a native click\n\t */\n\tFastClick.prototype.needsClick = function(target) {\n\t\tswitch (target.nodeName.toLowerCase()) {\n\n\t\t// Don't send a synthetic click to disabled inputs (issue #62)\n\t\tcase 'button':\n\t\tcase 'select':\n\t\tcase 'textarea':\n\t\t\tif (target.disabled) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'input':\n\n\t\t\t// File inputs need real clicks on iOS 6 due to a browser bug (issue #68)\n\t\t\tif ((deviceIsIOS && target.type === 'file') || target.disabled) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'label':\n\t\tcase 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames\n\t\tcase 'video':\n\t\t\treturn true;\n\t\t}\n\n\t\treturn (/\\bneedsclick\\b/).test(target.className);\n\t};\n\n\n\t/**\n\t * Determine whether a given element requires a call to focus to simulate click into element.\n\t *\n\t * @param {EventTarget|Element} target Target DOM element\n\t * @returns {boolean} Returns true if the element requires a call to focus to simulate native click.\n\t */\n\tFastClick.prototype.needsFocus = function(target) {\n\t\tswitch (target.nodeName.toLowerCase()) {\n\t\tcase 'textarea':\n\t\t\treturn true;\n\t\tcase 'select':\n\t\t\treturn !deviceIsAndroid;\n\t\tcase 'input':\n\t\t\tswitch (target.type) {\n\t\t\tcase 'button':\n\t\t\tcase 'checkbox':\n\t\t\tcase 'file':\n\t\t\tcase 'image':\n\t\t\tcase 'radio':\n\t\t\tcase 'submit':\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// No point in attempting to focus disabled inputs\n\t\t\treturn !target.disabled && !target.readOnly;\n\t\tdefault:\n\t\t\treturn (/\\bneedsfocus\\b/).test(target.className);\n\t\t}\n\t};\n\n\n\t/**\n\t * Send a click event to the specified element.\n\t *\n\t * @param {EventTarget|Element} targetElement\n\t * @param {Event} event\n\t */\n\tFastClick.prototype.sendClick = function(targetElement, event) {\n\t\tvar clickEvent, touch;\n\n\t\t// On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24)\n\t\tif (document.activeElement && document.activeElement !== targetElement) {\n\t\t\tdocument.activeElement.blur();\n\t\t}\n\n\t\ttouch = event.changedTouches[0];\n\n\t\t// Synthesise a click event, with an extra attribute so it can be tracked\n\t\tclickEvent = document.createEvent('MouseEvents');\n\t\tclickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);\n\t\tclickEvent.forwardedTouchEvent = true;\n\t\ttargetElement.dispatchEvent(clickEvent);\n\t};\n\n\tFastClick.prototype.determineEventType = function(targetElement) {\n\n\t\t//Issue #159: Android Chrome Select Box does not open with a synthetic click event\n\t\tif (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') {\n\t\t\treturn 'mousedown';\n\t\t}\n\n\t\treturn 'click';\n\t};\n\n\n\t/**\n\t * @param {EventTarget|Element} targetElement\n\t */\n\tFastClick.prototype.focus = function(targetElement) {\n\t\tvar length;\n\n\t\t// Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724.\n\t\tif (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') {\n\t\t\tlength = targetElement.value.length;\n\t\t\ttargetElement.setSelectionRange(length, length);\n\t\t} else {\n\t\t\ttargetElement.focus();\n\t\t}\n\t};\n\n\n\t/**\n\t * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it.\n\t *\n\t * @param {EventTarget|Element} targetElement\n\t */\n\tFastClick.prototype.updateScrollParent = function(targetElement) {\n\t\tvar scrollParent, parentElement;\n\n\t\tscrollParent = targetElement.fastClickScrollParent;\n\n\t\t// Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the\n\t\t// target element was moved to another parent.\n\t\tif (!scrollParent || !scrollParent.contains(targetElement)) {\n\t\t\tparentElement = targetElement;\n\t\t\tdo {\n\t\t\t\tif (parentElement.scrollHeight > parentElement.offsetHeight) {\n\t\t\t\t\tscrollParent = parentElement;\n\t\t\t\t\ttargetElement.fastClickScrollParent = parentElement;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tparentElement = parentElement.parentElement;\n\t\t\t} while (parentElement);\n\t\t}\n\n\t\t// Always update the scroll top tracker if possible.\n\t\tif (scrollParent) {\n\t\t\tscrollParent.fastClickLastScrollTop = scrollParent.scrollTop;\n\t\t}\n\t};\n\n\n\t/**\n\t * @param {EventTarget} targetElement\n\t * @returns {Element|EventTarget}\n\t */\n\tFastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) {\n\n\t\t// On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node.\n\t\tif (eventTarget.nodeType === Node.TEXT_NODE) {\n\t\t\treturn eventTarget.parentNode;\n\t\t}\n\n\t\treturn eventTarget;\n\t};\n\n\n\t/**\n\t * On touch start, record the position and scroll offset.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchStart = function(event) {\n\t\tvar targetElement, touch, selection;\n\n\t\t// Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111).\n\t\tif (event.targetTouches.length > 1) {\n\t\t\treturn true;\n\t\t}\n\n\t\ttargetElement = this.getTargetElementFromEventTarget(event.target);\n\t\ttouch = event.targetTouches[0];\n\n\t\tif (deviceIsIOS) {\n\n\t\t\t// Only trusted events will deselect text on iOS (issue #49)\n\t\t\tselection = window.getSelection();\n\t\t\tif (selection.rangeCount && !selection.isCollapsed) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (!deviceIsIOS4) {\n\n\t\t\t\t// Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23):\n\t\t\t\t// when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched\n\t\t\t\t// with the same identifier as the touch event that previously triggered the click that triggered the alert.\n\t\t\t\t// Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an\n\t\t\t\t// immediately preceeding touch event (issue #52), so this fix is unavailable on that platform.\n\t\t\t\t// Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string,\n\t\t\t\t// which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long,\n\t\t\t\t// random integers, it's safe to to continue if the identifier is 0 here.\n\t\t\t\tif (touch.identifier && touch.identifier === this.lastTouchIdentifier) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tthis.lastTouchIdentifier = touch.identifier;\n\n\t\t\t\t// If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and:\n\t\t\t\t// 1) the user does a fling scroll on the scrollable layer\n\t\t\t\t// 2) the user stops the fling scroll with another tap\n\t\t\t\t// then the event.target of the last 'touchend' event will be the element that was under the user's finger\n\t\t\t\t// when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check\n\t\t\t\t// is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42).\n\t\t\t\tthis.updateScrollParent(targetElement);\n\t\t\t}\n\t\t}\n\n\t\tthis.trackingClick = true;\n\t\tthis.trackingClickStart = event.timeStamp;\n\t\tthis.targetElement = targetElement;\n\n\t\tthis.touchStartX = touch.pageX;\n\t\tthis.touchStartY = touch.pageY;\n\n\t\t// Prevent phantom clicks on fast double-tap (issue #36)\n\t\tif ((event.timeStamp - this.lastClickTime) < this.tapDelay) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * Based on a touchmove event object, check whether the touch has moved past a boundary since it started.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.touchHasMoved = function(event) {\n\t\tvar touch = event.changedTouches[0], boundary = this.touchBoundary;\n\n\t\tif (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * Update the last position.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchMove = function(event) {\n\t\tif (!this.trackingClick) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If the touch has moved, cancel the click tracking\n\t\tif (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) {\n\t\t\tthis.trackingClick = false;\n\t\t\tthis.targetElement = null;\n\t\t}\n\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * Attempt to find the labelled control for the given label element.\n\t *\n\t * @param {EventTarget|HTMLLabelElement} labelElement\n\t * @returns {Element|null}\n\t */\n\tFastClick.prototype.findControl = function(labelElement) {\n\n\t\t// Fast path for newer browsers supporting the HTML5 control attribute\n\t\tif (labelElement.control !== undefined) {\n\t\t\treturn labelElement.control;\n\t\t}\n\n\t\t// All browsers under test that support touch events also support the HTML5 htmlFor attribute\n\t\tif (labelElement.htmlFor) {\n\t\t\treturn document.getElementById(labelElement.htmlFor);\n\t\t}\n\n\t\t// If no for attribute exists, attempt to retrieve the first labellable descendant element\n\t\t// the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label\n\t\treturn labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea');\n\t};\n\n\n\t/**\n\t * On touch end, determine whether to send a click event at once.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchEnd = function(event) {\n\t\tvar forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement;\n\n\t\tif (!this.trackingClick) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Prevent phantom clicks on fast double-tap (issue #36)\n\t\tif ((event.timeStamp - this.lastClickTime) < this.tapDelay) {\n\t\t\tthis.cancelNextClick = true;\n\t\t\treturn true;\n\t\t}\n\n\t\tif ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Reset to prevent wrong click cancel on input (issue #156).\n\t\tthis.cancelNextClick = false;\n\n\t\tthis.lastClickTime = event.timeStamp;\n\n\t\ttrackingClickStart = this.trackingClickStart;\n\t\tthis.trackingClick = false;\n\t\tthis.trackingClickStart = 0;\n\n\t\t// On some iOS devices, the targetElement supplied with the event is invalid if the layer\n\t\t// is performing a transition or scroll, and has to be re-detected manually. Note that\n\t\t// for this to function correctly, it must be called *after* the event target is checked!\n\t\t// See issue #57; also filed as rdar://13048589 .\n\t\tif (deviceIsIOSWithBadTarget) {\n\t\t\ttouch = event.changedTouches[0];\n\n\t\t\t// In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null\n\t\t\ttargetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement;\n\t\t\ttargetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent;\n\t\t}\n\n\t\ttargetTagName = targetElement.tagName.toLowerCase();\n\t\tif (targetTagName === 'label') {\n\t\t\tforElement = this.findControl(targetElement);\n\t\t\tif (forElement) {\n\t\t\t\tthis.focus(targetElement);\n\t\t\t\tif (deviceIsAndroid) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\ttargetElement = forElement;\n\t\t\t}\n\t\t} else if (this.needsFocus(targetElement)) {\n\n\t\t\t// Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through.\n\t\t\t// Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37).\n\t\t\tif ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) {\n\t\t\t\tthis.targetElement = null;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.focus(targetElement);\n\t\t\tthis.sendClick(targetElement, event);\n\n\t\t\t// Select elements need the event to go through on iOS 4, otherwise the selector menu won't open.\n\t\t\t// Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others)\n\t\t\tif (!deviceIsIOS || targetTagName !== 'select') {\n\t\t\t\tthis.targetElement = null;\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tif (deviceIsIOS && !deviceIsIOS4) {\n\n\t\t\t// Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled\n\t\t\t// and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42).\n\t\t\tscrollParent = targetElement.fastClickScrollParent;\n\t\t\tif (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Prevent the actual click from going though - unless the target node is marked as requiring\n\t\t// real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted.\n\t\tif (!this.needsClick(targetElement)) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.sendClick(targetElement, event);\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * On touch cancel, stop tracking the click.\n\t *\n\t * @returns {void}\n\t */\n\tFastClick.prototype.onTouchCancel = function() {\n\t\tthis.trackingClick = false;\n\t\tthis.targetElement = null;\n\t};\n\n\n\t/**\n\t * Determine mouse events which should be permitted.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onMouse = function(event) {\n\n\t\t// If a target element was never set (because a touch event was never fired) allow the event\n\t\tif (!this.targetElement) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (event.forwardedTouchEvent) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Programmatically generated events targeting a specific element should be permitted\n\t\tif (!event.cancelable) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Derive and check the target element to see whether the mouse event needs to be permitted;\n\t\t// unless explicitly enabled, prevent non-touch click events from triggering actions,\n\t\t// to prevent ghost/doubleclicks.\n\t\tif (!this.needsClick(this.targetElement) || this.cancelNextClick) {\n\n\t\t\t// Prevent any user-added listeners declared on FastClick element from being fired.\n\t\t\tif (event.stopImmediatePropagation) {\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t} else {\n\n\t\t\t\t// Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)\n\t\t\t\tevent.propagationStopped = true;\n\t\t\t}\n\n\t\t\t// Cancel the event\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the mouse event is permitted, return true for the action to go through.\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * On actual clicks, determine whether this is a touch-generated click, a click action occurring\n\t * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or\n\t * an actual click which should be permitted.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onClick = function(event) {\n\t\tvar permitted;\n\n\t\t// It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early.\n\t\tif (this.trackingClick) {\n\t\t\tthis.targetElement = null;\n\t\t\tthis.trackingClick = false;\n\t\t\treturn true;\n\t\t}\n\n\t\t// Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target.\n\t\tif (event.target.type === 'submit' && event.detail === 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\tpermitted = this.onMouse(event);\n\n\t\t// Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through.\n\t\tif (!permitted) {\n\t\t\tthis.targetElement = null;\n\t\t}\n\n\t\t// If clicks are permitted, return true for the action to go through.\n\t\treturn permitted;\n\t};\n\n\n\t/**\n\t * Remove all FastClick's event listeners.\n\t *\n\t * @returns {void}\n\t */\n\tFastClick.prototype.destroy = function() {\n\t\tvar layer = this.layer;\n\n\t\tif (deviceIsAndroid) {\n\t\t\tlayer.removeEventListener('mouseover', this.onMouse, true);\n\t\t\tlayer.removeEventListener('mousedown', this.onMouse, true);\n\t\t\tlayer.removeEventListener('mouseup', this.onMouse, true);\n\t\t}\n\n\t\tlayer.removeEventListener('click', this.onClick, true);\n\t\tlayer.removeEventListener('touchstart', this.onTouchStart, false);\n\t\tlayer.removeEventListener('touchmove', this.onTouchMove, false);\n\t\tlayer.removeEventListener('touchend', this.onTouchEnd, false);\n\t\tlayer.removeEventListener('touchcancel', this.onTouchCancel, false);\n\t};\n\n\n\t/**\n\t * Check whether FastClick is needed.\n\t *\n\t * @param {Element} layer The layer to listen on\n\t */\n\tFastClick.notNeeded = function(layer) {\n\t\tvar metaViewport;\n\t\tvar chromeVersion;\n\t\tvar blackberryVersion;\n\t\tvar firefoxVersion;\n\n\t\t// Devices that don't support touch don't need FastClick\n\t\tif (typeof window.ontouchstart === 'undefined') {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Chrome version - zero for other browsers\n\t\tchromeVersion = +(/Chrome\\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];\n\n\t\tif (chromeVersion) {\n\n\t\t\tif (deviceIsAndroid) {\n\t\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\n\t\t\t\tif (metaViewport) {\n\t\t\t\t\t// Chrome on Android with user-scalable=\"no\" doesn't need FastClick (issue #89)\n\t\t\t\t\tif (metaViewport.content.indexOf('user-scalable=no') !== -1) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t// Chrome 32 and above with width=device-width or less don't need FastClick\n\t\t\t\t\tif (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Chrome desktop doesn't need FastClick (issue #15)\n\t\t\t} else {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif (deviceIsBlackBerry10) {\n\t\t\tblackberryVersion = navigator.userAgent.match(/Version\\/([0-9]*)\\.([0-9]*)/);\n\n\t\t\t// BlackBerry 10.3+ does not require Fastclick library.\n\t\t\t// https://github.com/ftlabs/fastclick/issues/251\n\t\t\tif (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) {\n\t\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\n\t\t\t\tif (metaViewport) {\n\t\t\t\t\t// user-scalable=no eliminates click delay.\n\t\t\t\t\tif (metaViewport.content.indexOf('user-scalable=no') !== -1) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t// width=device-width (or less than device-width) eliminates click delay.\n\t\t\t\t\tif (document.documentElement.scrollWidth <= window.outerWidth) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97)\n\t\tif (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Firefox version - zero for other browsers\n\t\tfirefoxVersion = +(/Firefox\\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];\n\n\t\tif (firefoxVersion >= 27) {\n\t\t\t// Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896\n\n\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\t\t\tif (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version\n\t\t// http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx\n\t\tif (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * Factory method for creating a FastClick object\n\t *\n\t * @param {Element} layer The layer to listen on\n\t * @param {Object} [options={}] The options to override the defaults\n\t */\n\tFastClick.attach = function(layer, options) {\n\t\treturn new FastClick(layer, options);\n\t};\n\n\n\tif (true) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\t!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n\t\t\treturn FastClick;\n\t\t}).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else if (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = FastClick.attach;\n\t\tmodule.exports.FastClick = FastClick;\n\t} else {\n\t\twindow.FastClick = FastClick;\n\t}\n}());\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2Zhc3RjbGljay9saWIvZmFzdGNsaWNrLmpzPzk2ODgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUNBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixZQUFZLE9BQU8sWUFBWTtBQUMvQjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQix5Q0FBeUM7QUFDL0Q7OztBQUdBO0FBQ0E7QUFDQSxxQ0FBcUMsT0FBTztBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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RUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLFlBQVksTUFBTTtBQUNsQixjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxNQUFNO0FBQ2xCLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLFlBQVksT0FBTyxZQUFZO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQUE7QUFDSCxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsQ0FBQyIsImZpbGUiOiI2Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24gKCkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0LyoqXG5cdCAqIEBwcmVzZXJ2ZSBGYXN0Q2xpY2s6IHBvbHlmaWxsIHRvIHJlbW92ZSBjbGljayBkZWxheXMgb24gYnJvd3NlcnMgd2l0aCB0b3VjaCBVSXMuXG5cdCAqXG5cdCAqIEBjb2RpbmdzdGFuZGFyZCBmdGxhYnMtanN2MlxuXHQgKiBAY29weXJpZ2h0IFRoZSBGaW5hbmNpYWwgVGltZXMgTGltaXRlZCBbQWxsIFJpZ2h0cyBSZXNlcnZlZF1cblx0ICogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKHNlZSBMSUNFTlNFLnR4dClcblx0ICovXG5cblx0Lypqc2xpbnQgYnJvd3Nlcjp0cnVlLCBub2RlOnRydWUqL1xuXHQvKmdsb2JhbCBkZWZpbmUsIEV2ZW50LCBOb2RlKi9cblxuXG5cdC8qKlxuXHQgKiBJbnN0YW50aWF0ZSBmYXN0LWNsaWNraW5nIGxpc3RlbmVycyBvbiB0aGUgc3BlY2lmaWVkIGxheWVyLlxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICogQHBhcmFtIHtFbGVtZW50fSBsYXllciBUaGUgbGF5ZXIgdG8gbGlzdGVuIG9uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzXG5cdCAqL1xuXHRmdW5jdGlvbiBGYXN0Q2xpY2sobGF5ZXIsIG9wdGlvbnMpIHtcblx0XHR2YXIgb2xkT25DbGljaztcblxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0LyoqXG5cdFx0ICogV2hldGhlciBhIGNsaWNrIGlzIGN1cnJlbnRseSBiZWluZyB0cmFja2VkLlxuXHRcdCAqXG5cdFx0ICogQHR5cGUgYm9vbGVhblxuXHRcdCAqL1xuXHRcdHRoaXMudHJhY2tpbmdDbGljayA9IGZhbHNlO1xuXG5cblx0XHQvKipcblx0XHQgKiBUaW1lc3RhbXAgZm9yIHdoZW4gY2xpY2sgdHJhY2tpbmcgc3RhcnRlZC5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIG51bWJlclxuXHRcdCAqL1xuXHRcdHRoaXMudHJhY2tpbmdDbGlja1N0YXJ0ID0gMDtcblxuXG5cdFx0LyoqXG5cdFx0ICogVGhlIGVsZW1lbnQgYmVpbmcgdHJhY2tlZCBmb3IgYSBjbGljay5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIEV2ZW50VGFyZ2V0XG5cdFx0ICovXG5cdFx0dGhpcy50YXJnZXRFbGVtZW50ID0gbnVsbDtcblxuXG5cdFx0LyoqXG5cdFx0ICogWC1jb29yZGluYXRlIG9mIHRvdWNoIHN0YXJ0IGV2ZW50LlxuXHRcdCAqXG5cdFx0ICogQHR5cGUgbnVtYmVyXG5cdFx0ICovXG5cdFx0dGhpcy50b3VjaFN0YXJ0WCA9IDA7XG5cblxuXHRcdC8qKlxuXHRcdCAqIFktY29vcmRpbmF0ZSBvZiB0b3VjaCBzdGFydCBldmVudC5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIG51bWJlclxuXHRcdCAqL1xuXHRcdHRoaXMudG91Y2hTdGFydFkgPSAwO1xuXG5cblx0XHQvKipcblx0XHQgKiBJRCBvZiB0aGUgbGFzdCB0b3VjaCwgcmV0cmlldmVkIGZyb20gVG91Y2guaWRlbnRpZmllci5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIG51bWJlclxuXHRcdCAqL1xuXHRcdHRoaXMubGFzdFRvdWNoSWRlbnRpZmllciA9IDA7XG5cblxuXHRcdC8qKlxuXHRcdCAqIFRvdWNobW92ZSBib3VuZGFyeSwgYmV5b25kIHdoaWNoIGEgY2xpY2sgd2lsbCBiZSBjYW5jZWxsZWQuXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBudW1iZXJcblx0XHQgKi9cblx0XHR0aGlzLnRvdWNoQm91bmRhcnkgPSBvcHRpb25zLnRvdWNoQm91bmRhcnkgfHwgMTA7XG5cblxuXHRcdC8qKlxuXHRcdCAqIFRoZSBGYXN0Q2xpY2sgbGF5ZXIuXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBFbGVtZW50XG5cdFx0ICovXG5cdFx0dGhpcy5sYXllciA9IGxheWVyO1xuXG5cdFx0LyoqXG5cdFx0ICogVGhlIG1pbmltdW0gdGltZSBiZXR3ZWVuIHRhcCh0b3VjaHN0YXJ0IGFuZCB0b3VjaGVuZCkgZXZlbnRzXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBudW1iZXJcblx0XHQgKi9cblx0XHR0aGlzLnRhcERlbGF5ID0gb3B0aW9ucy50YXBEZWxheSB8fCAyMDA7XG5cblx0XHQvKipcblx0XHQgKiBUaGUgbWF4aW11bSB0aW1lIGZvciBhIHRhcFxuXHRcdCAqXG5cdFx0ICogQHR5cGUgbnVtYmVyXG5cdFx0ICovXG5cdFx0dGhpcy50YXBUaW1lb3V0ID0gb3B0aW9ucy50YXBUaW1lb3V0IHx8IDcwMDtcblxuXHRcdGlmIChGYXN0Q2xpY2subm90TmVlZGVkKGxheWVyKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFNvbWUgb2xkIHZlcnNpb25zIG9mIEFuZHJvaWQgZG9uJ3QgaGF2ZSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxuXHRcdGZ1bmN0aW9uIGJpbmQobWV0aG9kLCBjb250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiBtZXRob2QuYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTsgfTtcblx0XHR9XG5cblxuXHRcdHZhciBtZXRob2RzID0gWydvbk1vdXNlJywgJ29uQ2xpY2snLCAnb25Ub3VjaFN0YXJ0JywgJ29uVG91Y2hNb3ZlJywgJ29uVG91Y2hFbmQnLCAnb25Ub3VjaENhbmNlbCddO1xuXHRcdHZhciBjb250ZXh0ID0gdGhpcztcblx0XHRmb3IgKHZhciBpID0gMCwgbCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRjb250ZXh0W21ldGhvZHNbaV1dID0gYmluZChjb250ZXh0W21ldGhvZHNbaV1dLCBjb250ZXh0KTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdXAgZXZlbnQgaGFuZGxlcnMgYXMgcmVxdWlyZWRcblx0XHRpZiAoZGV2aWNlSXNBbmRyb2lkKSB7XG5cdFx0XHRsYXllci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLm9uTW91c2UsIHRydWUpO1xuXHRcdFx0bGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5vbk1vdXNlLCB0cnVlKTtcblx0XHRcdGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2UsIHRydWUpO1xuXHRcdH1cblxuXHRcdGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkNsaWNrLCB0cnVlKTtcblx0XHRsYXllci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5vblRvdWNoU3RhcnQsIGZhbHNlKTtcblx0XHRsYXllci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm9uVG91Y2hNb3ZlLCBmYWxzZSk7XG5cdFx0bGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm9uVG91Y2hFbmQsIGZhbHNlKTtcblx0XHRsYXllci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMub25Ub3VjaENhbmNlbCwgZmFsc2UpO1xuXG5cdFx0Ly8gSGFjayBpcyByZXF1aXJlZCBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IEV2ZW50I3N0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiAoZS5nLiBBbmRyb2lkIDIpXG5cdFx0Ly8gd2hpY2ggaXMgaG93IEZhc3RDbGljayBub3JtYWxseSBzdG9wcyBjbGljayBldmVudHMgYnViYmxpbmcgdG8gY2FsbGJhY2tzIHJlZ2lzdGVyZWQgb24gdGhlIEZhc3RDbGlja1xuXHRcdC8vIGxheWVyIHdoZW4gdGhleSBhcmUgY2FuY2VsbGVkLlxuXHRcdGlmICghRXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbikge1xuXHRcdFx0bGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGNhbGxiYWNrLCBjYXB0dXJlKSB7XG5cdFx0XHRcdHZhciBybXYgPSBOb2RlLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyO1xuXHRcdFx0XHRpZiAodHlwZSA9PT0gJ2NsaWNrJykge1xuXHRcdFx0XHRcdHJtdi5jYWxsKGxheWVyLCB0eXBlLCBjYWxsYmFjay5oaWphY2tlZCB8fCBjYWxsYmFjaywgY2FwdHVyZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cm12LmNhbGwobGF5ZXIsIHR5cGUsIGNhbGxiYWNrLCBjYXB0dXJlKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0bGF5ZXIuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGNhbGxiYWNrLCBjYXB0dXJlKSB7XG5cdFx0XHRcdHZhciBhZHYgPSBOb2RlLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyO1xuXHRcdFx0XHRpZiAodHlwZSA9PT0gJ2NsaWNrJykge1xuXHRcdFx0XHRcdGFkdi5jYWxsKGxheWVyLCB0eXBlLCBjYWxsYmFjay5oaWphY2tlZCB8fCAoY2FsbGJhY2suaGlqYWNrZWQgPSBmdW5jdGlvbihldmVudCkge1xuXHRcdFx0XHRcdFx0aWYgKCFldmVudC5wcm9wYWdhdGlvblN0b3BwZWQpIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2soZXZlbnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLCBjYXB0dXJlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhZHYuY2FsbChsYXllciwgdHlwZSwgY2FsbGJhY2ssIGNhcHR1cmUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIElmIGEgaGFuZGxlciBpcyBhbHJlYWR5IGRlY2xhcmVkIGluIHRoZSBlbGVtZW50J3Mgb25jbGljayBhdHRyaWJ1dGUsIGl0IHdpbGwgYmUgZmlyZWQgYmVmb3JlXG5cdFx0Ly8gRmFzdENsaWNrJ3Mgb25DbGljayBoYW5kbGVyLiBGaXggdGhpcyBieSBwdWxsaW5nIG91dCB0aGUgdXNlci1kZWZpbmVkIGhhbmRsZXIgZnVuY3Rpb24gYW5kXG5cdFx0Ly8gYWRkaW5nIGl0IGFzIGxpc3RlbmVyLlxuXHRcdGlmICh0eXBlb2YgbGF5ZXIub25jbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuXG5cdFx0XHQvLyBBbmRyb2lkIGJyb3dzZXIgb24gYXQgbGVhc3QgMy4yIHJlcXVpcmVzIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24gaW4gbGF5ZXIub25jbGlja1xuXHRcdFx0Ly8gLSB0aGUgb2xkIG9uZSB3b24ndCB3b3JrIGlmIHBhc3NlZCB0byBhZGRFdmVudExpc3RlbmVyIGRpcmVjdGx5LlxuXHRcdFx0b2xkT25DbGljayA9IGxheWVyLm9uY2xpY2s7XG5cdFx0XHRsYXllci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0XHRcdG9sZE9uQ2xpY2soZXZlbnQpO1xuXHRcdFx0fSwgZmFsc2UpO1xuXHRcdFx0bGF5ZXIub25jbGljayA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCogV2luZG93cyBQaG9uZSA4LjEgZmFrZXMgdXNlciBhZ2VudCBzdHJpbmcgdG8gbG9vayBsaWtlIEFuZHJvaWQgYW5kIGlQaG9uZS5cblx0KlxuXHQqIEB0eXBlIGJvb2xlYW5cblx0Ki9cblx0dmFyIGRldmljZUlzV2luZG93c1Bob25lID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiV2luZG93cyBQaG9uZVwiKSA+PSAwO1xuXG5cdC8qKlxuXHQgKiBBbmRyb2lkIHJlcXVpcmVzIGV4Y2VwdGlvbnMuXG5cdCAqXG5cdCAqIEB0eXBlIGJvb2xlYW5cblx0ICovXG5cdHZhciBkZXZpY2VJc0FuZHJvaWQgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FuZHJvaWQnKSA+IDAgJiYgIWRldmljZUlzV2luZG93c1Bob25lO1xuXG5cblx0LyoqXG5cdCAqIGlPUyByZXF1aXJlcyBleGNlcHRpb25zLlxuXHQgKlxuXHQgKiBAdHlwZSBib29sZWFuXG5cdCAqL1xuXHR2YXIgZGV2aWNlSXNJT1MgPSAvaVAoYWR8aG9uZXxvZCkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgIWRldmljZUlzV2luZG93c1Bob25lO1xuXG5cblx0LyoqXG5cdCAqIGlPUyA0IHJlcXVpcmVzIGFuIGV4Y2VwdGlvbiBmb3Igc2VsZWN0IGVsZW1lbnRzLlxuXHQgKlxuXHQgKiBAdHlwZSBib29sZWFuXG5cdCAqL1xuXHR2YXIgZGV2aWNlSXNJT1M0ID0gZGV2aWNlSXNJT1MgJiYgKC9PUyA0X1xcZChfXFxkKT8vKS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG5cblx0LyoqXG5cdCAqIGlPUyA2LjAtNy4qIHJlcXVpcmVzIHRoZSB0YXJnZXQgZWxlbWVudCB0byBiZSBtYW51YWxseSBkZXJpdmVkXG5cdCAqXG5cdCAqIEB0eXBlIGJvb2xlYW5cblx0ICovXG5cdHZhciBkZXZpY2VJc0lPU1dpdGhCYWRUYXJnZXQgPSBkZXZpY2VJc0lPUyAmJiAoL09TIFs2LTddX1xcZC8pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cblx0LyoqXG5cdCAqIEJsYWNrQmVycnkgcmVxdWlyZXMgZXhjZXB0aW9ucy5cblx0ICpcblx0ICogQHR5cGUgYm9vbGVhblxuXHQgKi9cblx0dmFyIGRldmljZUlzQmxhY2tCZXJyeTEwID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdCQjEwJykgPiAwO1xuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuIGVsZW1lbnQgcmVxdWlyZXMgYSBuYXRpdmUgY2xpY2suXG5cdCAqXG5cdCAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RWxlbWVudH0gdGFyZ2V0IFRhcmdldCBET00gZWxlbWVudFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50IG5lZWRzIGEgbmF0aXZlIGNsaWNrXG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLm5lZWRzQ2xpY2sgPSBmdW5jdGlvbih0YXJnZXQpIHtcblx0XHRzd2l0Y2ggKHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG5cblx0XHQvLyBEb24ndCBzZW5kIGEgc3ludGhldGljIGNsaWNrIHRvIGRpc2FibGVkIGlucHV0cyAoaXNzdWUgIzYyKVxuXHRcdGNhc2UgJ2J1dHRvbic6XG5cdFx0Y2FzZSAnc2VsZWN0Jzpcblx0XHRjYXNlICd0ZXh0YXJlYSc6XG5cdFx0XHRpZiAodGFyZ2V0LmRpc2FibGVkKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdpbnB1dCc6XG5cblx0XHRcdC8vIEZpbGUgaW5wdXRzIG5lZWQgcmVhbCBjbGlja3Mgb24gaU9TIDYgZHVlIHRvIGEgYnJvd3NlciBidWcgKGlzc3VlICM2OClcblx0XHRcdGlmICgoZGV2aWNlSXNJT1MgJiYgdGFyZ2V0LnR5cGUgPT09ICdmaWxlJykgfHwgdGFyZ2V0LmRpc2FibGVkKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdsYWJlbCc6XG5cdFx0Y2FzZSAnaWZyYW1lJzogLy8gaU9TOCBob21lc2NyZWVuIGFwcHMgY2FuIHByZXZlbnQgZXZlbnRzIGJ1YmJsaW5nIGludG8gZnJhbWVzXG5cdFx0Y2FzZSAndmlkZW8nOlxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICgvXFxibmVlZHNjbGlja1xcYi8pLnRlc3QodGFyZ2V0LmNsYXNzTmFtZSk7XG5cdH07XG5cblxuXHQvKipcblx0ICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiBlbGVtZW50IHJlcXVpcmVzIGEgY2FsbCB0byBmb2N1cyB0byBzaW11bGF0ZSBjbGljayBpbnRvIGVsZW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RWxlbWVudH0gdGFyZ2V0IFRhcmdldCBET00gZWxlbWVudFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50IHJlcXVpcmVzIGEgY2FsbCB0byBmb2N1cyB0byBzaW11bGF0ZSBuYXRpdmUgY2xpY2suXG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLm5lZWRzRm9jdXMgPSBmdW5jdGlvbih0YXJnZXQpIHtcblx0XHRzd2l0Y2ggKHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG5cdFx0Y2FzZSAndGV4dGFyZWEnOlxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0Y2FzZSAnc2VsZWN0Jzpcblx0XHRcdHJldHVybiAhZGV2aWNlSXNBbmRyb2lkO1xuXHRcdGNhc2UgJ2lucHV0Jzpcblx0XHRcdHN3aXRjaCAodGFyZ2V0LnR5cGUpIHtcblx0XHRcdGNhc2UgJ2J1dHRvbic6XG5cdFx0XHRjYXNlICdjaGVja2JveCc6XG5cdFx0XHRjYXNlICdmaWxlJzpcblx0XHRcdGNhc2UgJ2ltYWdlJzpcblx0XHRcdGNhc2UgJ3JhZGlvJzpcblx0XHRcdGNhc2UgJ3N1Ym1pdCc6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTm8gcG9pbnQgaW4gYXR0ZW1wdGluZyB0byBmb2N1cyBkaXNhYmxlZCBpbnB1dHNcblx0XHRcdHJldHVybiAhdGFyZ2V0LmRpc2FibGVkICYmICF0YXJnZXQucmVhZE9ubHk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiAoL1xcYm5lZWRzZm9jdXNcXGIvKS50ZXN0KHRhcmdldC5jbGFzc05hbWUpO1xuXHRcdH1cblx0fTtcblxuXG5cdC8qKlxuXHQgKiBTZW5kIGEgY2xpY2sgZXZlbnQgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEVsZW1lbnR9IHRhcmdldEVsZW1lbnRcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnRcblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUuc2VuZENsaWNrID0gZnVuY3Rpb24odGFyZ2V0RWxlbWVudCwgZXZlbnQpIHtcblx0XHR2YXIgY2xpY2tFdmVudCwgdG91Y2g7XG5cblx0XHQvLyBPbiBzb21lIEFuZHJvaWQgZGV2aWNlcyBhY3RpdmVFbGVtZW50IG5lZWRzIHRvIGJlIGJsdXJyZWQgb3RoZXJ3aXNlIHRoZSBzeW50aGV0aWMgY2xpY2sgd2lsbCBoYXZlIG5vIGVmZmVjdCAoIzI0KVxuXHRcdGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHRhcmdldEVsZW1lbnQpIHtcblx0XHRcdGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpO1xuXHRcdH1cblxuXHRcdHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF07XG5cblx0XHQvLyBTeW50aGVzaXNlIGEgY2xpY2sgZXZlbnQsIHdpdGggYW4gZXh0cmEgYXR0cmlidXRlIHNvIGl0IGNhbiBiZSB0cmFja2VkXG5cdFx0Y2xpY2tFdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpO1xuXHRcdGNsaWNrRXZlbnQuaW5pdE1vdXNlRXZlbnQodGhpcy5kZXRlcm1pbmVFdmVudFR5cGUodGFyZ2V0RWxlbWVudCksIHRydWUsIHRydWUsIHdpbmRvdywgMSwgdG91Y2guc2NyZWVuWCwgdG91Y2guc2NyZWVuWSwgdG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuXHRcdGNsaWNrRXZlbnQuZm9yd2FyZGVkVG91Y2hFdmVudCA9IHRydWU7XG5cdFx0dGFyZ2V0RWxlbWVudC5kaXNwYXRjaEV2ZW50KGNsaWNrRXZlbnQpO1xuXHR9O1xuXG5cdEZhc3RDbGljay5wcm90b3R5cGUuZGV0ZXJtaW5lRXZlbnRUeXBlID0gZnVuY3Rpb24odGFyZ2V0RWxlbWVudCkge1xuXG5cdFx0Ly9Jc3N1ZSAjMTU5OiBBbmRyb2lkIENocm9tZSBTZWxlY3QgQm94IGRvZXMgbm90IG9wZW4gd2l0aCBhIHN5bnRoZXRpYyBjbGljayBldmVudFxuXHRcdGlmIChkZXZpY2VJc0FuZHJvaWQgJiYgdGFyZ2V0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzZWxlY3QnKSB7XG5cdFx0XHRyZXR1cm4gJ21vdXNlZG93bic7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICdjbGljayc7XG5cdH07XG5cblxuXHQvKipcblx0ICogQHBhcmFtIHtFdmVudFRhcmdldHxFbGVtZW50fSB0YXJnZXRFbGVtZW50XG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24odGFyZ2V0RWxlbWVudCkge1xuXHRcdHZhciBsZW5ndGg7XG5cblx0XHQvLyBJc3N1ZSAjMTYwOiBvbiBpT1MgNywgc29tZSBpbnB1dCBlbGVtZW50cyAoZS5nLiBkYXRlIGRhdGV0aW1lIG1vbnRoKSB0aHJvdyBhIHZhZ3VlIFR5cGVFcnJvciBvbiBzZXRTZWxlY3Rpb25SYW5nZS4gVGhlc2UgZWxlbWVudHMgZG9uJ3QgaGF2ZSBhbiBpbnRlZ2VyIHZhbHVlIGZvciB0aGUgc2VsZWN0aW9uU3RhcnQgYW5kIHNlbGVjdGlvbkVuZCBwcm9wZXJ0aWVzLCBidXQgdW5mb3J0dW5hdGVseSB0aGF0IGNhbid0IGJlIHVzZWQgZm9yIGRldGVjdGlvbiBiZWNhdXNlIGFjY2Vzc2luZyB0aGUgcHJvcGVydGllcyBhbHNvIHRocm93cyBhIFR5cGVFcnJvci4gSnVzdCBjaGVjayB0aGUgdHlwZSBpbnN0ZWFkLiBGaWxlZCBhcyBBcHBsZSBidWcgIzE1MTIyNzI0LlxuXHRcdGlmIChkZXZpY2VJc0lPUyAmJiB0YXJnZXRFbGVtZW50LnNldFNlbGVjdGlvblJhbmdlICYmIHRhcmdldEVsZW1lbnQudHlwZS5pbmRleE9mKCdkYXRlJykgIT09IDAgJiYgdGFyZ2V0RWxlbWVudC50eXBlICE9PSAndGltZScgJiYgdGFyZ2V0RWxlbWVudC50eXBlICE9PSAnbW9udGgnKSB7XG5cdFx0XHRsZW5ndGggPSB0YXJnZXRFbGVtZW50LnZhbHVlLmxlbmd0aDtcblx0XHRcdHRhcmdldEVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UobGVuZ3RoLCBsZW5ndGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YXJnZXRFbGVtZW50LmZvY3VzKCk7XG5cdFx0fVxuXHR9O1xuXG5cblx0LyoqXG5cdCAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHRhcmdldCBlbGVtZW50IGlzIGEgY2hpbGQgb2YgYSBzY3JvbGxhYmxlIGxheWVyIGFuZCBpZiBzbywgc2V0IGEgZmxhZyBvbiBpdC5cblx0ICpcblx0ICogQHBhcmFtIHtFdmVudFRhcmdldHxFbGVtZW50fSB0YXJnZXRFbGVtZW50XG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLnVwZGF0ZVNjcm9sbFBhcmVudCA9IGZ1bmN0aW9uKHRhcmdldEVsZW1lbnQpIHtcblx0XHR2YXIgc2Nyb2xsUGFyZW50LCBwYXJlbnRFbGVtZW50O1xuXG5cdFx0c2Nyb2xsUGFyZW50ID0gdGFyZ2V0RWxlbWVudC5mYXN0Q2xpY2tTY3JvbGxQYXJlbnQ7XG5cblx0XHQvLyBBdHRlbXB0IHRvIGRpc2NvdmVyIHdoZXRoZXIgdGhlIHRhcmdldCBlbGVtZW50IGlzIGNvbnRhaW5lZCB3aXRoaW4gYSBzY3JvbGxhYmxlIGxheWVyLiBSZS1jaGVjayBpZiB0aGVcblx0XHQvLyB0YXJnZXQgZWxlbWVudCB3YXMgbW92ZWQgdG8gYW5vdGhlciBwYXJlbnQuXG5cdFx0aWYgKCFzY3JvbGxQYXJlbnQgfHwgIXNjcm9sbFBhcmVudC5jb250YWlucyh0YXJnZXRFbGVtZW50KSkge1xuXHRcdFx0cGFyZW50RWxlbWVudCA9IHRhcmdldEVsZW1lbnQ7XG5cdFx0XHRkbyB7XG5cdFx0XHRcdGlmIChwYXJlbnRFbGVtZW50LnNjcm9sbEhlaWdodCA+IHBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0KSB7XG5cdFx0XHRcdFx0c2Nyb2xsUGFyZW50ID0gcGFyZW50RWxlbWVudDtcblx0XHRcdFx0XHR0YXJnZXRFbGVtZW50LmZhc3RDbGlja1Njcm9sbFBhcmVudCA9IHBhcmVudEVsZW1lbnQ7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRwYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXHRcdFx0fSB3aGlsZSAocGFyZW50RWxlbWVudCk7XG5cdFx0fVxuXG5cdFx0Ly8gQWx3YXlzIHVwZGF0ZSB0aGUgc2Nyb2xsIHRvcCB0cmFja2VyIGlmIHBvc3NpYmxlLlxuXHRcdGlmIChzY3JvbGxQYXJlbnQpIHtcblx0XHRcdHNjcm9sbFBhcmVudC5mYXN0Q2xpY2tMYXN0U2Nyb2xsVG9wID0gc2Nyb2xsUGFyZW50LnNjcm9sbFRvcDtcblx0XHR9XG5cdH07XG5cblxuXHQvKipcblx0ICogQHBhcmFtIHtFdmVudFRhcmdldH0gdGFyZ2V0RWxlbWVudFxuXHQgKiBAcmV0dXJucyB7RWxlbWVudHxFdmVudFRhcmdldH1cblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUuZ2V0VGFyZ2V0RWxlbWVudEZyb21FdmVudFRhcmdldCA9IGZ1bmN0aW9uKGV2ZW50VGFyZ2V0KSB7XG5cblx0XHQvLyBPbiBzb21lIG9sZGVyIGJyb3dzZXJzIChub3RhYmx5IFNhZmFyaSBvbiBpT1MgNC4xIC0gc2VlIGlzc3VlICM1NikgdGhlIGV2ZW50IHRhcmdldCBtYXkgYmUgYSB0ZXh0IG5vZGUuXG5cdFx0aWYgKGV2ZW50VGFyZ2V0Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuXHRcdFx0cmV0dXJuIGV2ZW50VGFyZ2V0LnBhcmVudE5vZGU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50VGFyZ2V0O1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIE9uIHRvdWNoIHN0YXJ0LCByZWNvcmQgdGhlIHBvc2l0aW9uIGFuZCBzY3JvbGwgb2Zmc2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUub25Ub3VjaFN0YXJ0ID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHR2YXIgdGFyZ2V0RWxlbWVudCwgdG91Y2gsIHNlbGVjdGlvbjtcblxuXHRcdC8vIElnbm9yZSBtdWx0aXBsZSB0b3VjaGVzLCBvdGhlcndpc2UgcGluY2gtdG8tem9vbSBpcyBwcmV2ZW50ZWQgaWYgYm90aCBmaW5nZXJzIGFyZSBvbiB0aGUgRmFzdENsaWNrIGVsZW1lbnQgKGlzc3VlICMxMTEpLlxuXHRcdGlmIChldmVudC50YXJnZXRUb3VjaGVzLmxlbmd0aCA+IDEpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHRhcmdldEVsZW1lbnQgPSB0aGlzLmdldFRhcmdldEVsZW1lbnRGcm9tRXZlbnRUYXJnZXQoZXZlbnQudGFyZ2V0KTtcblx0XHR0b3VjaCA9IGV2ZW50LnRhcmdldFRvdWNoZXNbMF07XG5cblx0XHRpZiAoZGV2aWNlSXNJT1MpIHtcblxuXHRcdFx0Ly8gT25seSB0cnVzdGVkIGV2ZW50cyB3aWxsIGRlc2VsZWN0IHRleHQgb24gaU9TIChpc3N1ZSAjNDkpXG5cdFx0XHRzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cdFx0XHRpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgJiYgIXNlbGVjdGlvbi5pc0NvbGxhcHNlZCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFkZXZpY2VJc0lPUzQpIHtcblxuXHRcdFx0XHQvLyBXZWlyZCB0aGluZ3MgaGFwcGVuIG9uIGlPUyB3aGVuIGFuIGFsZXJ0IG9yIGNvbmZpcm0gZGlhbG9nIGlzIG9wZW5lZCBmcm9tIGEgY2xpY2sgZXZlbnQgY2FsbGJhY2sgKGlzc3VlICMyMyk6XG5cdFx0XHRcdC8vIHdoZW4gdGhlIHVzZXIgbmV4dCB0YXBzIGFueXdoZXJlIGVsc2Ugb24gdGhlIHBhZ2UsIG5ldyB0b3VjaHN0YXJ0IGFuZCB0b3VjaGVuZCBldmVudHMgYXJlIGRpc3BhdGNoZWRcblx0XHRcdFx0Ly8gd2l0aCB0aGUgc2FtZSBpZGVudGlmaWVyIGFzIHRoZSB0b3VjaCBldmVudCB0aGF0IHByZXZpb3VzbHkgdHJpZ2dlcmVkIHRoZSBjbGljayB0aGF0IHRyaWdnZXJlZCB0aGUgYWxlcnQuXG5cdFx0XHRcdC8vIFNhZGx5LCB0aGVyZSBpcyBhbiBpc3N1ZSBvbiBpT1MgNCB0aGF0IGNhdXNlcyBzb21lIG5vcm1hbCB0b3VjaCBldmVudHMgdG8gaGF2ZSB0aGUgc2FtZSBpZGVudGlmaWVyIGFzIGFuXG5cdFx0XHRcdC8vIGltbWVkaWF0ZWx5IHByZWNlZWRpbmcgdG91Y2ggZXZlbnQgKGlzc3VlICM1MiksIHNvIHRoaXMgZml4IGlzIHVuYXZhaWxhYmxlIG9uIHRoYXQgcGxhdGZvcm0uXG5cdFx0XHRcdC8vIElzc3VlIDEyMDogdG91Y2guaWRlbnRpZmllciBpcyAwIHdoZW4gQ2hyb21lIGRldiB0b29scyAnRW11bGF0ZSB0b3VjaCBldmVudHMnIGlzIHNldCB3aXRoIGFuIGlPUyBkZXZpY2UgVUEgc3RyaW5nLFxuXHRcdFx0XHQvLyB3aGljaCBjYXVzZXMgYWxsIHRvdWNoIGV2ZW50cyB0byBiZSBpZ25vcmVkLiBBcyB0aGlzIGJsb2NrIG9ubHkgYXBwbGllcyB0byBpT1MsIGFuZCBpT1MgaWRlbnRpZmllcnMgYXJlIGFsd2F5cyBsb25nLFxuXHRcdFx0XHQvLyByYW5kb20gaW50ZWdlcnMsIGl0J3Mgc2FmZSB0byB0byBjb250aW51ZSBpZiB0aGUgaWRlbnRpZmllciBpcyAwIGhlcmUuXG5cdFx0XHRcdGlmICh0b3VjaC5pZGVudGlmaWVyICYmIHRvdWNoLmlkZW50aWZpZXIgPT09IHRoaXMubGFzdFRvdWNoSWRlbnRpZmllcikge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5sYXN0VG91Y2hJZGVudGlmaWVyID0gdG91Y2guaWRlbnRpZmllcjtcblxuXHRcdFx0XHQvLyBJZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgYSBjaGlsZCBvZiBhIHNjcm9sbGFibGUgbGF5ZXIgKHVzaW5nIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaCkgYW5kOlxuXHRcdFx0XHQvLyAxKSB0aGUgdXNlciBkb2VzIGEgZmxpbmcgc2Nyb2xsIG9uIHRoZSBzY3JvbGxhYmxlIGxheWVyXG5cdFx0XHRcdC8vIDIpIHRoZSB1c2VyIHN0b3BzIHRoZSBmbGluZyBzY3JvbGwgd2l0aCBhbm90aGVyIHRhcFxuXHRcdFx0XHQvLyB0aGVuIHRoZSBldmVudC50YXJnZXQgb2YgdGhlIGxhc3QgJ3RvdWNoZW5kJyBldmVudCB3aWxsIGJlIHRoZSBlbGVtZW50IHRoYXQgd2FzIHVuZGVyIHRoZSB1c2VyJ3MgZmluZ2VyXG5cdFx0XHRcdC8vIHdoZW4gdGhlIGZsaW5nIHNjcm9sbCB3YXMgc3RhcnRlZCwgY2F1c2luZyBGYXN0Q2xpY2sgdG8gc2VuZCBhIGNsaWNrIGV2ZW50IHRvIHRoYXQgbGF5ZXIgLSB1bmxlc3MgYSBjaGVja1xuXHRcdFx0XHQvLyBpcyBtYWRlIHRvIGVuc3VyZSB0aGF0IGEgcGFyZW50IGxheWVyIHdhcyBub3Qgc2Nyb2xsZWQgYmVmb3JlIHNlbmRpbmcgYSBzeW50aGV0aWMgY2xpY2sgKGlzc3VlICM0MikuXG5cdFx0XHRcdHRoaXMudXBkYXRlU2Nyb2xsUGFyZW50KHRhcmdldEVsZW1lbnQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMudHJhY2tpbmdDbGljayA9IHRydWU7XG5cdFx0dGhpcy50cmFja2luZ0NsaWNrU3RhcnQgPSBldmVudC50aW1lU3RhbXA7XG5cdFx0dGhpcy50YXJnZXRFbGVtZW50ID0gdGFyZ2V0RWxlbWVudDtcblxuXHRcdHRoaXMudG91Y2hTdGFydFggPSB0b3VjaC5wYWdlWDtcblx0XHR0aGlzLnRvdWNoU3RhcnRZID0gdG91Y2gucGFnZVk7XG5cblx0XHQvLyBQcmV2ZW50IHBoYW50b20gY2xpY2tzIG9uIGZhc3QgZG91YmxlLXRhcCAoaXNzdWUgIzM2KVxuXHRcdGlmICgoZXZlbnQudGltZVN0YW1wIC0gdGhpcy5sYXN0Q2xpY2tUaW1lKSA8IHRoaXMudGFwRGVsYXkpIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cblxuXHQvKipcblx0ICogQmFzZWQgb24gYSB0b3VjaG1vdmUgZXZlbnQgb2JqZWN0LCBjaGVjayB3aGV0aGVyIHRoZSB0b3VjaCBoYXMgbW92ZWQgcGFzdCBhIGJvdW5kYXJ5IHNpbmNlIGl0IHN0YXJ0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0RmFzdENsaWNrLnByb3RvdHlwZS50b3VjaEhhc01vdmVkID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHR2YXIgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSwgYm91bmRhcnkgPSB0aGlzLnRvdWNoQm91bmRhcnk7XG5cblx0XHRpZiAoTWF0aC5hYnModG91Y2gucGFnZVggLSB0aGlzLnRvdWNoU3RhcnRYKSA+IGJvdW5kYXJ5IHx8IE1hdGguYWJzKHRvdWNoLnBhZ2VZIC0gdGhpcy50b3VjaFN0YXJ0WSkgPiBib3VuZGFyeSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSB0aGUgbGFzdCBwb3NpdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnRcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLm9uVG91Y2hNb3ZlID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRpZiAoIXRoaXMudHJhY2tpbmdDbGljaykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIHRvdWNoIGhhcyBtb3ZlZCwgY2FuY2VsIHRoZSBjbGljayB0cmFja2luZ1xuXHRcdGlmICh0aGlzLnRhcmdldEVsZW1lbnQgIT09IHRoaXMuZ2V0VGFyZ2V0RWxlbWVudEZyb21FdmVudFRhcmdldChldmVudC50YXJnZXQpIHx8IHRoaXMudG91Y2hIYXNNb3ZlZChldmVudCkpIHtcblx0XHRcdHRoaXMudHJhY2tpbmdDbGljayA9IGZhbHNlO1xuXHRcdFx0dGhpcy50YXJnZXRFbGVtZW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBBdHRlbXB0IHRvIGZpbmQgdGhlIGxhYmVsbGVkIGNvbnRyb2wgZm9yIHRoZSBnaXZlbiBsYWJlbCBlbGVtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEhUTUxMYWJlbEVsZW1lbnR9IGxhYmVsRWxlbWVudFxuXHQgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuXHQgKi9cblx0RmFzdENsaWNrLnByb3RvdHlwZS5maW5kQ29udHJvbCA9IGZ1bmN0aW9uKGxhYmVsRWxlbWVudCkge1xuXG5cdFx0Ly8gRmFzdCBwYXRoIGZvciBuZXdlciBicm93c2VycyBzdXBwb3J0aW5nIHRoZSBIVE1MNSBjb250cm9sIGF0dHJpYnV0ZVxuXHRcdGlmIChsYWJlbEVsZW1lbnQuY29udHJvbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gbGFiZWxFbGVtZW50LmNvbnRyb2w7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGJyb3dzZXJzIHVuZGVyIHRlc3QgdGhhdCBzdXBwb3J0IHRvdWNoIGV2ZW50cyBhbHNvIHN1cHBvcnQgdGhlIEhUTUw1IGh0bWxGb3IgYXR0cmlidXRlXG5cdFx0aWYgKGxhYmVsRWxlbWVudC5odG1sRm9yKSB7XG5cdFx0XHRyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobGFiZWxFbGVtZW50Lmh0bWxGb3IpO1xuXHRcdH1cblxuXHRcdC8vIElmIG5vIGZvciBhdHRyaWJ1dGUgZXhpc3RzLCBhdHRlbXB0IHRvIHJldHJpZXZlIHRoZSBmaXJzdCBsYWJlbGxhYmxlIGRlc2NlbmRhbnQgZWxlbWVudFxuXHRcdC8vIHRoZSBsaXN0IG9mIHdoaWNoIGlzIGRlZmluZWQgaGVyZTogaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvZm9ybXMuaHRtbCNjYXRlZ29yeS1sYWJlbFxuXHRcdHJldHVybiBsYWJlbEVsZW1lbnQucXVlcnlTZWxlY3RvcignYnV0dG9uLCBpbnB1dDpub3QoW3R5cGU9aGlkZGVuXSksIGtleWdlbiwgbWV0ZXIsIG91dHB1dCwgcHJvZ3Jlc3MsIHNlbGVjdCwgdGV4dGFyZWEnKTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBPbiB0b3VjaCBlbmQsIGRldGVybWluZSB3aGV0aGVyIHRvIHNlbmQgYSBjbGljayBldmVudCBhdCBvbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUub25Ub3VjaEVuZCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0dmFyIGZvckVsZW1lbnQsIHRyYWNraW5nQ2xpY2tTdGFydCwgdGFyZ2V0VGFnTmFtZSwgc2Nyb2xsUGFyZW50LCB0b3VjaCwgdGFyZ2V0RWxlbWVudCA9IHRoaXMudGFyZ2V0RWxlbWVudDtcblxuXHRcdGlmICghdGhpcy50cmFja2luZ0NsaWNrKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBQcmV2ZW50IHBoYW50b20gY2xpY2tzIG9uIGZhc3QgZG91YmxlLXRhcCAoaXNzdWUgIzM2KVxuXHRcdGlmICgoZXZlbnQudGltZVN0YW1wIC0gdGhpcy5sYXN0Q2xpY2tUaW1lKSA8IHRoaXMudGFwRGVsYXkpIHtcblx0XHRcdHRoaXMuY2FuY2VsTmV4dENsaWNrID0gdHJ1ZTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICgoZXZlbnQudGltZVN0YW1wIC0gdGhpcy50cmFja2luZ0NsaWNrU3RhcnQpID4gdGhpcy50YXBUaW1lb3V0KSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBSZXNldCB0byBwcmV2ZW50IHdyb25nIGNsaWNrIGNhbmNlbCBvbiBpbnB1dCAoaXNzdWUgIzE1NikuXG5cdFx0dGhpcy5jYW5jZWxOZXh0Q2xpY2sgPSBmYWxzZTtcblxuXHRcdHRoaXMubGFzdENsaWNrVGltZSA9IGV2ZW50LnRpbWVTdGFtcDtcblxuXHRcdHRyYWNraW5nQ2xpY2tTdGFydCA9IHRoaXMudHJhY2tpbmdDbGlja1N0YXJ0O1xuXHRcdHRoaXMudHJhY2tpbmdDbGljayA9IGZhbHNlO1xuXHRcdHRoaXMudHJhY2tpbmdDbGlja1N0YXJ0ID0gMDtcblxuXHRcdC8vIE9uIHNvbWUgaU9TIGRldmljZXMsIHRoZSB0YXJnZXRFbGVtZW50IHN1cHBsaWVkIHdpdGggdGhlIGV2ZW50IGlzIGludmFsaWQgaWYgdGhlIGxheWVyXG5cdFx0Ly8gaXMgcGVyZm9ybWluZyBhIHRyYW5zaXRpb24gb3Igc2Nyb2xsLCBhbmQgaGFzIHRvIGJlIHJlLWRldGVjdGVkIG1hbnVhbGx5LiBOb3RlIHRoYXRcblx0XHQvLyBmb3IgdGhpcyB0byBmdW5jdGlvbiBjb3JyZWN0bHksIGl0IG11c3QgYmUgY2FsbGVkICphZnRlciogdGhlIGV2ZW50IHRhcmdldCBpcyBjaGVja2VkIVxuXHRcdC8vIFNlZSBpc3N1ZSAjNTc7IGFsc28gZmlsZWQgYXMgcmRhcjovLzEzMDQ4NTg5IC5cblx0XHRpZiAoZGV2aWNlSXNJT1NXaXRoQmFkVGFyZ2V0KSB7XG5cdFx0XHR0b3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdO1xuXG5cdFx0XHQvLyBJbiBjZXJ0YWluIGNhc2VzIGFyZ3VtZW50cyBvZiBlbGVtZW50RnJvbVBvaW50IGNhbiBiZSBuZWdhdGl2ZSwgc28gcHJldmVudCBzZXR0aW5nIHRhcmdldEVsZW1lbnQgdG8gbnVsbFxuXHRcdFx0dGFyZ2V0RWxlbWVudCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQodG91Y2gucGFnZVggLSB3aW5kb3cucGFnZVhPZmZzZXQsIHRvdWNoLnBhZ2VZIC0gd2luZG93LnBhZ2VZT2Zmc2V0KSB8fCB0YXJnZXRFbGVtZW50O1xuXHRcdFx0dGFyZ2V0RWxlbWVudC5mYXN0Q2xpY2tTY3JvbGxQYXJlbnQgPSB0aGlzLnRhcmdldEVsZW1lbnQuZmFzdENsaWNrU2Nyb2xsUGFyZW50O1xuXHRcdH1cblxuXHRcdHRhcmdldFRhZ05hbWUgPSB0YXJnZXRFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRpZiAodGFyZ2V0VGFnTmFtZSA9PT0gJ2xhYmVsJykge1xuXHRcdFx0Zm9yRWxlbWVudCA9IHRoaXMuZmluZENvbnRyb2wodGFyZ2V0RWxlbWVudCk7XG5cdFx0XHRpZiAoZm9yRWxlbWVudCkge1xuXHRcdFx0XHR0aGlzLmZvY3VzKHRhcmdldEVsZW1lbnQpO1xuXHRcdFx0XHRpZiAoZGV2aWNlSXNBbmRyb2lkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGFyZ2V0RWxlbWVudCA9IGZvckVsZW1lbnQ7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0aGlzLm5lZWRzRm9jdXModGFyZ2V0RWxlbWVudCkpIHtcblxuXHRcdFx0Ly8gQ2FzZSAxOiBJZiB0aGUgdG91Y2ggc3RhcnRlZCBhIHdoaWxlIGFnbyAoYmVzdCBndWVzcyBpcyAxMDBtcyBiYXNlZCBvbiB0ZXN0cyBmb3IgaXNzdWUgIzM2KSB0aGVuIGZvY3VzIHdpbGwgYmUgdHJpZ2dlcmVkIGFueXdheS4gUmV0dXJuIGVhcmx5IGFuZCB1bnNldCB0aGUgdGFyZ2V0IGVsZW1lbnQgcmVmZXJlbmNlIHNvIHRoYXQgdGhlIHN1YnNlcXVlbnQgY2xpY2sgd2lsbCBiZSBhbGxvd2VkIHRocm91Z2guXG5cdFx0XHQvLyBDYXNlIDI6IFdpdGhvdXQgdGhpcyBleGNlcHRpb24gZm9yIGlucHV0IGVsZW1lbnRzIHRhcHBlZCB3aGVuIHRoZSBkb2N1bWVudCBpcyBjb250YWluZWQgaW4gYW4gaWZyYW1lLCB0aGVuIGFueSBpbnB1dHRlZCB0ZXh0IHdvbid0IGJlIHZpc2libGUgZXZlbiB0aG91Z2ggdGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyB1cGRhdGVkIGFzIHRoZSB1c2VyIHR5cGVzIChpc3N1ZSAjMzcpLlxuXHRcdFx0aWYgKChldmVudC50aW1lU3RhbXAgLSB0cmFja2luZ0NsaWNrU3RhcnQpID4gMTAwIHx8IChkZXZpY2VJc0lPUyAmJiB3aW5kb3cudG9wICE9PSB3aW5kb3cgJiYgdGFyZ2V0VGFnTmFtZSA9PT0gJ2lucHV0JykpIHtcblx0XHRcdFx0dGhpcy50YXJnZXRFbGVtZW50ID0gbnVsbDtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmZvY3VzKHRhcmdldEVsZW1lbnQpO1xuXHRcdFx0dGhpcy5zZW5kQ2xpY2sodGFyZ2V0RWxlbWVudCwgZXZlbnQpO1xuXG5cdFx0XHQvLyBTZWxlY3QgZWxlbWVudHMgbmVlZCB0aGUgZXZlbnQgdG8gZ28gdGhyb3VnaCBvbiBpT1MgNCwgb3RoZXJ3aXNlIHRoZSBzZWxlY3RvciBtZW51IHdvbid0IG9wZW4uXG5cdFx0XHQvLyBBbHNvIHRoaXMgYnJlYWtzIG9wZW5pbmcgc2VsZWN0cyB3aGVuIFZvaWNlT3ZlciBpcyBhY3RpdmUgb24gaU9TNiwgaU9TNyAoYW5kIHBvc3NpYmx5IG90aGVycylcblx0XHRcdGlmICghZGV2aWNlSXNJT1MgfHwgdGFyZ2V0VGFnTmFtZSAhPT0gJ3NlbGVjdCcpIHtcblx0XHRcdFx0dGhpcy50YXJnZXRFbGVtZW50ID0gbnVsbDtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmIChkZXZpY2VJc0lPUyAmJiAhZGV2aWNlSXNJT1M0KSB7XG5cblx0XHRcdC8vIERvbid0IHNlbmQgYSBzeW50aGV0aWMgY2xpY2sgZXZlbnQgaWYgdGhlIHRhcmdldCBlbGVtZW50IGlzIGNvbnRhaW5lZCB3aXRoaW4gYSBwYXJlbnQgbGF5ZXIgdGhhdCB3YXMgc2Nyb2xsZWRcblx0XHRcdC8vIGFuZCB0aGlzIHRhcCBpcyBiZWluZyB1c2VkIHRvIHN0b3AgdGhlIHNjcm9sbGluZyAodXN1YWxseSBpbml0aWF0ZWQgYnkgYSBmbGluZyAtIGlzc3VlICM0MikuXG5cdFx0XHRzY3JvbGxQYXJlbnQgPSB0YXJnZXRFbGVtZW50LmZhc3RDbGlja1Njcm9sbFBhcmVudDtcblx0XHRcdGlmIChzY3JvbGxQYXJlbnQgJiYgc2Nyb2xsUGFyZW50LmZhc3RDbGlja0xhc3RTY3JvbGxUb3AgIT09IHNjcm9sbFBhcmVudC5zY3JvbGxUb3ApIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHJldmVudCB0aGUgYWN0dWFsIGNsaWNrIGZyb20gZ29pbmcgdGhvdWdoIC0gdW5sZXNzIHRoZSB0YXJnZXQgbm9kZSBpcyBtYXJrZWQgYXMgcmVxdWlyaW5nXG5cdFx0Ly8gcmVhbCBjbGlja3Mgb3IgaWYgaXQgaXMgaW4gdGhlIHdoaXRlbGlzdCBpbiB3aGljaCBjYXNlIG9ubHkgbm9uLXByb2dyYW1tYXRpYyBjbGlja3MgYXJlIHBlcm1pdHRlZC5cblx0XHRpZiAoIXRoaXMubmVlZHNDbGljayh0YXJnZXRFbGVtZW50KSkge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdHRoaXMuc2VuZENsaWNrKHRhcmdldEVsZW1lbnQsIGV2ZW50KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblxuXHQvKipcblx0ICogT24gdG91Y2ggY2FuY2VsLCBzdG9wIHRyYWNraW5nIHRoZSBjbGljay5cblx0ICpcblx0ICogQHJldHVybnMge3ZvaWR9XG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLm9uVG91Y2hDYW5jZWwgPSBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyYWNraW5nQ2xpY2sgPSBmYWxzZTtcblx0XHR0aGlzLnRhcmdldEVsZW1lbnQgPSBudWxsO1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIERldGVybWluZSBtb3VzZSBldmVudHMgd2hpY2ggc2hvdWxkIGJlIHBlcm1pdHRlZC5cblx0ICpcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnRcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLm9uTW91c2UgPSBmdW5jdGlvbihldmVudCkge1xuXG5cdFx0Ly8gSWYgYSB0YXJnZXQgZWxlbWVudCB3YXMgbmV2ZXIgc2V0IChiZWNhdXNlIGEgdG91Y2ggZXZlbnQgd2FzIG5ldmVyIGZpcmVkKSBhbGxvdyB0aGUgZXZlbnRcblx0XHRpZiAoIXRoaXMudGFyZ2V0RWxlbWVudCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKGV2ZW50LmZvcndhcmRlZFRvdWNoRXZlbnQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIFByb2dyYW1tYXRpY2FsbHkgZ2VuZXJhdGVkIGV2ZW50cyB0YXJnZXRpbmcgYSBzcGVjaWZpYyBlbGVtZW50IHNob3VsZCBiZSBwZXJtaXR0ZWRcblx0XHRpZiAoIWV2ZW50LmNhbmNlbGFibGUpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIERlcml2ZSBhbmQgY2hlY2sgdGhlIHRhcmdldCBlbGVtZW50IHRvIHNlZSB3aGV0aGVyIHRoZSBtb3VzZSBldmVudCBuZWVkcyB0byBiZSBwZXJtaXR0ZWQ7XG5cdFx0Ly8gdW5sZXNzIGV4cGxpY2l0bHkgZW5hYmxlZCwgcHJldmVudCBub24tdG91Y2ggY2xpY2sgZXZlbnRzIGZyb20gdHJpZ2dlcmluZyBhY3Rpb25zLFxuXHRcdC8vIHRvIHByZXZlbnQgZ2hvc3QvZG91YmxlY2xpY2tzLlxuXHRcdGlmICghdGhpcy5uZWVkc0NsaWNrKHRoaXMudGFyZ2V0RWxlbWVudCkgfHwgdGhpcy5jYW5jZWxOZXh0Q2xpY2spIHtcblxuXHRcdFx0Ly8gUHJldmVudCBhbnkgdXNlci1hZGRlZCBsaXN0ZW5lcnMgZGVjbGFyZWQgb24gRmFzdENsaWNrIGVsZW1lbnQgZnJvbSBiZWluZyBmaXJlZC5cblx0XHRcdGlmIChldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24pIHtcblx0XHRcdFx0ZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIFBhcnQgb2YgdGhlIGhhY2sgZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBFdmVudCNzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gKGUuZy4gQW5kcm9pZCAyKVxuXHRcdFx0XHRldmVudC5wcm9wYWdhdGlvblN0b3BwZWQgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYW5jZWwgdGhlIGV2ZW50XG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgbW91c2UgZXZlbnQgaXMgcGVybWl0dGVkLCByZXR1cm4gdHJ1ZSBmb3IgdGhlIGFjdGlvbiB0byBnbyB0aHJvdWdoLlxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIE9uIGFjdHVhbCBjbGlja3MsIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSB0b3VjaC1nZW5lcmF0ZWQgY2xpY2ssIGEgY2xpY2sgYWN0aW9uIG9jY3VycmluZ1xuXHQgKiBuYXR1cmFsbHkgYWZ0ZXIgYSBkZWxheSBhZnRlciBhIHRvdWNoICh3aGljaCBuZWVkcyB0byBiZSBjYW5jZWxsZWQgdG8gYXZvaWQgZHVwbGljYXRpb24pLCBvclxuXHQgKiBhbiBhY3R1YWwgY2xpY2sgd2hpY2ggc2hvdWxkIGJlIHBlcm1pdHRlZC5cblx0ICpcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnRcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLm9uQ2xpY2sgPSBmdW5jdGlvbihldmVudCkge1xuXHRcdHZhciBwZXJtaXR0ZWQ7XG5cblx0XHQvLyBJdCdzIHBvc3NpYmxlIGZvciBhbm90aGVyIEZhc3RDbGljay1saWtlIGxpYnJhcnkgZGVsaXZlcmVkIHdpdGggdGhpcmQtcGFydHkgY29kZSB0byBmaXJlIGEgY2xpY2sgZXZlbnQgYmVmb3JlIEZhc3RDbGljayBkb2VzIChpc3N1ZSAjNDQpLiBJbiB0aGF0IGNhc2UsIHNldCB0aGUgY2xpY2stdHJhY2tpbmcgZmxhZyBiYWNrIHRvIGZhbHNlIGFuZCByZXR1cm4gZWFybHkuIFRoaXMgd2lsbCBjYXVzZSBvblRvdWNoRW5kIHRvIHJldHVybiBlYXJseS5cblx0XHRpZiAodGhpcy50cmFja2luZ0NsaWNrKSB7XG5cdFx0XHR0aGlzLnRhcmdldEVsZW1lbnQgPSBudWxsO1xuXHRcdFx0dGhpcy50cmFja2luZ0NsaWNrID0gZmFsc2U7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBWZXJ5IG9kZCBiZWhhdmlvdXIgb24gaU9TIChpc3N1ZSAjMTgpOiBpZiBhIHN1Ym1pdCBlbGVtZW50IGlzIHByZXNlbnQgaW5zaWRlIGEgZm9ybSBhbmQgdGhlIHVzZXIgaGl0cyBlbnRlciBpbiB0aGUgaU9TIHNpbXVsYXRvciBvciBjbGlja3MgdGhlIEdvIGJ1dHRvbiBvbiB0aGUgcG9wLXVwIE9TIGtleWJvYXJkIHRoZSBhIGtpbmQgb2YgJ2Zha2UnIGNsaWNrIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkIHdpdGggdGhlIHN1Ym1pdC10eXBlIGlucHV0IGVsZW1lbnQgYXMgdGhlIHRhcmdldC5cblx0XHRpZiAoZXZlbnQudGFyZ2V0LnR5cGUgPT09ICdzdWJtaXQnICYmIGV2ZW50LmRldGFpbCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cGVybWl0dGVkID0gdGhpcy5vbk1vdXNlKGV2ZW50KTtcblxuXHRcdC8vIE9ubHkgdW5zZXQgdGFyZ2V0RWxlbWVudCBpZiB0aGUgY2xpY2sgaXMgbm90IHBlcm1pdHRlZC4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBjaGVjayBmb3IgIXRhcmdldEVsZW1lbnQgaW4gb25Nb3VzZSBmYWlscyBhbmQgdGhlIGJyb3dzZXIncyBjbGljayBkb2Vzbid0IGdvIHRocm91Z2guXG5cdFx0aWYgKCFwZXJtaXR0ZWQpIHtcblx0XHRcdHRoaXMudGFyZ2V0RWxlbWVudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgY2xpY2tzIGFyZSBwZXJtaXR0ZWQsIHJldHVybiB0cnVlIGZvciB0aGUgYWN0aW9uIHRvIGdvIHRocm91Z2guXG5cdFx0cmV0dXJuIHBlcm1pdHRlZDtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYWxsIEZhc3RDbGljaydzIGV2ZW50IGxpc3RlbmVycy5cblx0ICpcblx0ICogQHJldHVybnMge3ZvaWR9XG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgbGF5ZXIgPSB0aGlzLmxheWVyO1xuXG5cdFx0aWYgKGRldmljZUlzQW5kcm9pZCkge1xuXHRcdFx0bGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5vbk1vdXNlLCB0cnVlKTtcblx0XHRcdGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZSwgdHJ1ZSk7XG5cdFx0XHRsYXllci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlLCB0cnVlKTtcblx0XHR9XG5cblx0XHRsYXllci5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbGljaywgdHJ1ZSk7XG5cdFx0bGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25Ub3VjaFN0YXJ0LCBmYWxzZSk7XG5cdFx0bGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vblRvdWNoTW92ZSwgZmFsc2UpO1xuXHRcdGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vblRvdWNoRW5kLCBmYWxzZSk7XG5cdFx0bGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLm9uVG91Y2hDYW5jZWwsIGZhbHNlKTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBDaGVjayB3aGV0aGVyIEZhc3RDbGljayBpcyBuZWVkZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RWxlbWVudH0gbGF5ZXIgVGhlIGxheWVyIHRvIGxpc3RlbiBvblxuXHQgKi9cblx0RmFzdENsaWNrLm5vdE5lZWRlZCA9IGZ1bmN0aW9uKGxheWVyKSB7XG5cdFx0dmFyIG1ldGFWaWV3cG9ydDtcblx0XHR2YXIgY2hyb21lVmVyc2lvbjtcblx0XHR2YXIgYmxhY2tiZXJyeVZlcnNpb247XG5cdFx0dmFyIGZpcmVmb3hWZXJzaW9uO1xuXG5cdFx0Ly8gRGV2aWNlcyB0aGF0IGRvbid0IHN1cHBvcnQgdG91Y2ggZG9uJ3QgbmVlZCBGYXN0Q2xpY2tcblx0XHRpZiAodHlwZW9mIHdpbmRvdy5vbnRvdWNoc3RhcnQgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBDaHJvbWUgdmVyc2lvbiAtIHplcm8gZm9yIG90aGVyIGJyb3dzZXJzXG5cdFx0Y2hyb21lVmVyc2lvbiA9ICsoL0Nocm9tZVxcLyhbMC05XSspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IFssMF0pWzFdO1xuXG5cdFx0aWYgKGNocm9tZVZlcnNpb24pIHtcblxuXHRcdFx0aWYgKGRldmljZUlzQW5kcm9pZCkge1xuXHRcdFx0XHRtZXRhVmlld3BvcnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9dmlld3BvcnRdJyk7XG5cblx0XHRcdFx0aWYgKG1ldGFWaWV3cG9ydCkge1xuXHRcdFx0XHRcdC8vIENocm9tZSBvbiBBbmRyb2lkIHdpdGggdXNlci1zY2FsYWJsZT1cIm5vXCIgZG9lc24ndCBuZWVkIEZhc3RDbGljayAoaXNzdWUgIzg5KVxuXHRcdFx0XHRcdGlmIChtZXRhVmlld3BvcnQuY29udGVudC5pbmRleE9mKCd1c2VyLXNjYWxhYmxlPW5vJykgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQ2hyb21lIDMyIGFuZCBhYm92ZSB3aXRoIHdpZHRoPWRldmljZS13aWR0aCBvciBsZXNzIGRvbid0IG5lZWQgRmFzdENsaWNrXG5cdFx0XHRcdFx0aWYgKGNocm9tZVZlcnNpb24gPiAzMSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGggPD0gd2luZG93Lm91dGVyV2lkdGgpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBDaHJvbWUgZGVza3RvcCBkb2Vzbid0IG5lZWQgRmFzdENsaWNrIChpc3N1ZSAjMTUpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZGV2aWNlSXNCbGFja0JlcnJ5MTApIHtcblx0XHRcdGJsYWNrYmVycnlWZXJzaW9uID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvVmVyc2lvblxcLyhbMC05XSopXFwuKFswLTldKikvKTtcblxuXHRcdFx0Ly8gQmxhY2tCZXJyeSAxMC4zKyBkb2VzIG5vdCByZXF1aXJlIEZhc3RjbGljayBsaWJyYXJ5LlxuXHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2Z0bGFicy9mYXN0Y2xpY2svaXNzdWVzLzI1MVxuXHRcdFx0aWYgKGJsYWNrYmVycnlWZXJzaW9uWzFdID49IDEwICYmIGJsYWNrYmVycnlWZXJzaW9uWzJdID49IDMpIHtcblx0XHRcdFx0bWV0YVZpZXdwb3J0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPXZpZXdwb3J0XScpO1xuXG5cdFx0XHRcdGlmIChtZXRhVmlld3BvcnQpIHtcblx0XHRcdFx0XHQvLyB1c2VyLXNjYWxhYmxlPW5vIGVsaW1pbmF0ZXMgY2xpY2sgZGVsYXkuXG5cdFx0XHRcdFx0aWYgKG1ldGFWaWV3cG9ydC5jb250ZW50LmluZGV4T2YoJ3VzZXItc2NhbGFibGU9bm8nKSAhPT0gLTEpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyB3aWR0aD1kZXZpY2Utd2lkdGggKG9yIGxlc3MgdGhhbiBkZXZpY2Utd2lkdGgpIGVsaW1pbmF0ZXMgY2xpY2sgZGVsYXkuXG5cdFx0XHRcdFx0aWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCA8PSB3aW5kb3cub3V0ZXJXaWR0aCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSUUxMCB3aXRoIC1tcy10b3VjaC1hY3Rpb246IG5vbmUgb3IgbWFuaXB1bGF0aW9uLCB3aGljaCBkaXNhYmxlcyBkb3VibGUtdGFwLXRvLXpvb20gKGlzc3VlICM5Nylcblx0XHRpZiAobGF5ZXIuc3R5bGUubXNUb3VjaEFjdGlvbiA9PT0gJ25vbmUnIHx8IGxheWVyLnN0eWxlLnRvdWNoQWN0aW9uID09PSAnbWFuaXB1bGF0aW9uJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZWZveCB2ZXJzaW9uIC0gemVybyBmb3Igb3RoZXIgYnJvd3NlcnNcblx0XHRmaXJlZm94VmVyc2lvbiA9ICsoL0ZpcmVmb3hcXC8oWzAtOV0rKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KSB8fCBbLDBdKVsxXTtcblxuXHRcdGlmIChmaXJlZm94VmVyc2lvbiA+PSAyNykge1xuXHRcdFx0Ly8gRmlyZWZveCAyNysgZG9lcyBub3QgaGF2ZSB0YXAgZGVsYXkgaWYgdGhlIGNvbnRlbnQgaXMgbm90IHpvb21hYmxlIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTIyODk2XG5cblx0XHRcdG1ldGFWaWV3cG9ydCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT12aWV3cG9ydF0nKTtcblx0XHRcdGlmIChtZXRhVmlld3BvcnQgJiYgKG1ldGFWaWV3cG9ydC5jb250ZW50LmluZGV4T2YoJ3VzZXItc2NhbGFibGU9bm8nKSAhPT0gLTEgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoIDw9IHdpbmRvdy5vdXRlcldpZHRoKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBJRTExOiBwcmVmaXhlZCAtbXMtdG91Y2gtYWN0aW9uIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYW5kIGl0J3MgcmVjb21lbmRlZCB0byB1c2Ugbm9uLXByZWZpeGVkIHZlcnNpb25cblx0XHQvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9hcHBzL0hoNzY3MzEzLmFzcHhcblx0XHRpZiAobGF5ZXIuc3R5bGUudG91Y2hBY3Rpb24gPT09ICdub25lJyB8fCBsYXllci5zdHlsZS50b3VjaEFjdGlvbiA9PT0gJ21hbmlwdWxhdGlvbicpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBGYXN0Q2xpY2sgb2JqZWN0XG5cdCAqXG5cdCAqIEBwYXJhbSB7RWxlbWVudH0gbGF5ZXIgVGhlIGxheWVyIHRvIGxpc3RlbiBvblxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0c1xuXHQgKi9cblx0RmFzdENsaWNrLmF0dGFjaCA9IGZ1bmN0aW9uKGxheWVyLCBvcHRpb25zKSB7XG5cdFx0cmV0dXJuIG5ldyBGYXN0Q2xpY2sobGF5ZXIsIG9wdGlvbnMpO1xuXHR9O1xuXG5cblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcblxuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gRmFzdENsaWNrO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBGYXN0Q2xpY2suYXR0YWNoO1xuXHRcdG1vZHVsZS5leHBvcnRzLkZhc3RDbGljayA9IEZhc3RDbGljaztcblx0fSBlbHNlIHtcblx0XHR3aW5kb3cuRmFzdENsaWNrID0gRmFzdENsaWNrO1xuXHR9XG59KCkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9ib3dlcl9jb21wb25lbnRzL2Zhc3RjbGljay9saWIvZmFzdGNsaWNrLmpzXG4vLyBtb2R1bGUgaWQgPSA2MlxuLy8gbW9kdWxlIGNodW5rcyA9IDEiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///62\n");
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports) {
+
+eval("var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/*! AdminLTE app.js\n* ================\n* Main JS application file for AdminLTE v2. This file\n* should be included in all pages. It controls some layout\n* options and implements exclusive AdminLTE plugins.\n*\n* @Author Almsaeed Studio\n* @Support <https://www.almsaeedstudio.com>\n* @Email <abdullah@almsaeedstudio.com>\n* @version 2.4.2\n* @repository git://github.com/almasaeed2010/AdminLTE.git\n* @license MIT <http://opensource.org/licenses/MIT>\n*/\nif (\"undefined\" == typeof jQuery) throw new Error(\"AdminLTE requires jQuery\");+function (a) {\n \"use strict\";\n function b(b) {\n return this.each(function () {\n var e = a(this),\n g = e.data(c);if (!g) {\n var h = a.extend({}, d, e.data(), \"object\" == (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) && b);e.data(c, g = new f(e, h));\n }if (\"string\" == typeof g) {\n if (void 0 === g[b]) throw new Error(\"No method named \" + b);g[b]();\n }\n });\n }var c = \"lte.boxrefresh\",\n d = { source: \"\", params: {}, trigger: \".refresh-btn\", content: \".box-body\", loadInContent: !0, responseType: \"\", overlayTemplate: '<div class=\"overlay\"><div class=\"fa fa-refresh fa-spin\"></div></div>', onLoadStart: function onLoadStart() {}, onLoadDone: function onLoadDone(a) {\n return a;\n } },\n e = { data: '[data-widget=\"box-refresh\"]' },\n f = function f(b, c) {\n if (this.element = b, this.options = c, this.$overlay = a(c.overlay), \"\" === c.source) throw new Error(\"Source url was not defined. Please specify a url in your BoxRefresh source option.\");this._setUpListeners(), this.load();\n };f.prototype.load = function () {\n this._addOverlay(), this.options.onLoadStart.call(a(this)), a.get(this.options.source, this.options.params, function (b) {\n this.options.loadInContent && a(this.options.content).html(b), this.options.onLoadDone.call(a(this), b), this._removeOverlay();\n }.bind(this), \"\" !== this.options.responseType && this.options.responseType);\n }, f.prototype._setUpListeners = function () {\n a(this.element).on(\"click\", e.trigger, function (a) {\n a && a.preventDefault(), this.load();\n }.bind(this));\n }, f.prototype._addOverlay = function () {\n a(this.element).append(this.$overlay);\n }, f.prototype._removeOverlay = function () {\n a(this.element).remove(this.$overlay);\n };var g = a.fn.boxRefresh;a.fn.boxRefresh = b, a.fn.boxRefresh.Constructor = f, a.fn.boxRefresh.noConflict = function () {\n return a.fn.boxRefresh = g, this;\n }, a(window).on(\"load\", function () {\n a(e.data).each(function () {\n b.call(a(this));\n });\n });\n}(jQuery), function (a) {\n \"use strict\";\n function b(b) {\n return this.each(function () {\n var e = a(this),\n f = e.data(c);if (!f) {\n var g = a.extend({}, d, e.data(), \"object\" == (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) && b);e.data(c, f = new h(e, g));\n }if (\"string\" == typeof b) {\n if (void 0 === f[b]) throw new Error(\"No method named \" + b);f[b]();\n }\n });\n }var c = \"lte.boxwidget\",\n d = { animationSpeed: 500, collapseTrigger: '[data-widget=\"collapse\"]', removeTrigger: '[data-widget=\"remove\"]', collapseIcon: \"fa-minus\", expandIcon: \"fa-plus\", removeIcon: \"fa-times\" },\n e = { data: \".box\", collapsed: \".collapsed-box\", header: \".box-header\", body: \".box-body\", footer: \".box-footer\", tools: \".box-tools\" },\n f = { collapsed: \"collapsed-box\" },\n g = { collapsed: \"collapsed.boxwidget\", expanded: \"expanded.boxwidget\", removed: \"removed.boxwidget\" },\n h = function h(a, b) {\n this.element = a, this.options = b, this._setUpListeners();\n };h.prototype.toggle = function () {\n a(this.element).is(e.collapsed) ? this.expand() : this.collapse();\n }, h.prototype.expand = function () {\n var b = a.Event(g.expanded),\n c = this.options.collapseIcon,\n d = this.options.expandIcon;a(this.element).removeClass(f.collapsed), a(this.element).children(e.header + \", \" + e.body + \", \" + e.footer).children(e.tools).find(\".\" + d).removeClass(d).addClass(c), a(this.element).children(e.body + \", \" + e.footer).slideDown(this.options.animationSpeed, function () {\n a(this.element).trigger(b);\n }.bind(this));\n }, h.prototype.collapse = function () {\n var b = a.Event(g.collapsed),\n c = this.options.collapseIcon,\n d = this.options.expandIcon;a(this.element).children(e.header + \", \" + e.body + \", \" + e.footer).children(e.tools).find(\".\" + c).removeClass(c).addClass(d), a(this.element).children(e.body + \", \" + e.footer).slideUp(this.options.animationSpeed, function () {\n a(this.element).addClass(f.collapsed), a(this.element).trigger(b);\n }.bind(this));\n }, h.prototype.remove = function () {\n var b = a.Event(g.removed);a(this.element).slideUp(this.options.animationSpeed, function () {\n a(this.element).trigger(b), a(this.element).remove();\n }.bind(this));\n }, h.prototype._setUpListeners = function () {\n var b = this;a(this.element).on(\"click\", this.options.collapseTrigger, function (c) {\n return c && c.preventDefault(), b.toggle(a(this)), !1;\n }), a(this.element).on(\"click\", this.options.removeTrigger, function (c) {\n return c && c.preventDefault(), b.remove(a(this)), !1;\n });\n };var i = a.fn.boxWidget;a.fn.boxWidget = b, a.fn.boxWidget.Constructor = h, a.fn.boxWidget.noConflict = function () {\n return a.fn.boxWidget = i, this;\n }, a(window).on(\"load\", function () {\n a(e.data).each(function () {\n b.call(a(this));\n });\n });\n}(jQuery), function (a) {\n \"use strict\";\n function b(b) {\n return this.each(function () {\n var e = a(this),\n f = e.data(c);if (!f) {\n var g = a.extend({}, d, e.data(), \"object\" == (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) && b);e.data(c, f = new h(e, g));\n }\"string\" == typeof b && f.toggle();\n });\n }var c = \"lte.controlsidebar\",\n d = { slide: !0 },\n e = { sidebar: \".control-sidebar\", data: '[data-toggle=\"control-sidebar\"]', open: \".control-sidebar-open\", bg: \".control-sidebar-bg\", wrapper: \".wrapper\", content: \".content-wrapper\", boxed: \".layout-boxed\" },\n f = { open: \"control-sidebar-open\", fixed: \"fixed\" },\n g = { collapsed: \"collapsed.controlsidebar\", expanded: \"expanded.controlsidebar\" },\n h = function h(a, b) {\n this.element = a, this.options = b, this.hasBindedResize = !1, this.init();\n };h.prototype.init = function () {\n a(this.element).is(e.data) || a(this).on(\"click\", this.toggle), this.fix(), a(window).resize(function () {\n this.fix();\n }.bind(this));\n }, h.prototype.toggle = function (b) {\n b && b.preventDefault(), this.fix(), a(e.sidebar).is(e.open) || a(\"body\").is(e.open) ? this.collapse() : this.expand();\n }, h.prototype.expand = function () {\n this.options.slide ? a(e.sidebar).addClass(f.open) : a(\"body\").addClass(f.open), a(this.element).trigger(a.Event(g.expanded));\n }, h.prototype.collapse = function () {\n a(\"body, \" + e.sidebar).removeClass(f.open), a(this.element).trigger(a.Event(g.collapsed));\n }, h.prototype.fix = function () {\n a(\"body\").is(e.boxed) && this._fixForBoxed(a(e.bg));\n }, h.prototype._fixForBoxed = function (b) {\n b.css({ position: \"absolute\", height: a(e.wrapper).height() });\n };var i = a.fn.controlSidebar;a.fn.controlSidebar = b, a.fn.controlSidebar.Constructor = h, a.fn.controlSidebar.noConflict = function () {\n return a.fn.controlSidebar = i, this;\n }, a(document).on(\"click\", e.data, function (c) {\n c && c.preventDefault(), b.call(a(this), \"toggle\");\n });\n}(jQuery), function (a) {\n \"use strict\";\n function b(b) {\n return this.each(function () {\n var d = a(this),\n e = d.data(c);e || d.data(c, e = new f(d)), \"string\" == typeof b && e.toggle(d);\n });\n }var c = \"lte.directchat\",\n d = { data: '[data-widget=\"chat-pane-toggle\"]', box: \".direct-chat\" },\n e = { open: \"direct-chat-contacts-open\" },\n f = function f(a) {\n this.element = a;\n };f.prototype.toggle = function (a) {\n a.parents(d.box).first().toggleClass(e.open);\n };var g = a.fn.directChat;a.fn.directChat = b, a.fn.directChat.Constructor = f, a.fn.directChat.noConflict = function () {\n return a.fn.directChat = g, this;\n }, a(document).on(\"click\", d.data, function (c) {\n c && c.preventDefault(), b.call(a(this), \"toggle\");\n });\n}(jQuery), function (a) {\n \"use strict\";\n function b(b) {\n return this.each(function () {\n var e = a(this),\n f = e.data(c);if (!f) {\n var h = a.extend({}, d, e.data(), \"object\" == (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) && b);e.data(c, f = new g(h));\n }if (\"string\" == typeof b) {\n if (void 0 === f[b]) throw new Error(\"No method named \" + b);f[b]();\n }\n });\n }var c = \"lte.layout\",\n d = { slimscroll: !0, resetHeight: !0 },\n e = { wrapper: \".wrapper\", contentWrapper: \".content-wrapper\", layoutBoxed: \".layout-boxed\", mainFooter: \".main-footer\", mainHeader: \".main-header\", sidebar: \".sidebar\", controlSidebar: \".control-sidebar\", fixed: \".fixed\", sidebarMenu: \".sidebar-menu\", logo: \".main-header .logo\" },\n f = { fixed: \"fixed\", holdTransition: \"hold-transition\" },\n g = function g(a) {\n this.options = a, this.bindedResize = !1, this.activate();\n };g.prototype.activate = function () {\n this.fix(), this.fixSidebar(), a(\"body\").removeClass(f.holdTransition), this.options.resetHeight && a(\"body, html, \" + e.wrapper).css({ height: \"auto\", \"min-height\": \"100%\" }), this.bindedResize || (a(window).resize(function () {\n this.fix(), this.fixSidebar(), a(e.logo + \", \" + e.sidebar).one(\"webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend\", function () {\n this.fix(), this.fixSidebar();\n }.bind(this));\n }.bind(this)), this.bindedResize = !0), a(e.sidebarMenu).on(\"expanded.tree\", function () {\n this.fix(), this.fixSidebar();\n }.bind(this)), a(e.sidebarMenu).on(\"collapsed.tree\", function () {\n this.fix(), this.fixSidebar();\n }.bind(this));\n }, g.prototype.fix = function () {\n a(e.layoutBoxed + \" > \" + e.wrapper).css(\"overflow\", \"hidden\");var b = a(e.mainFooter).outerHeight() || 0,\n c = a(e.mainHeader).outerHeight() + b,\n d = a(window).height(),\n g = a(e.sidebar).height() || 0;if (a(\"body\").hasClass(f.fixed)) a(e.contentWrapper).css(\"min-height\", d - b);else {\n var h;d >= g ? (a(e.contentWrapper).css(\"min-height\", d - c), h = d - c) : (a(e.contentWrapper).css(\"min-height\", g), h = g);var i = a(e.controlSidebar);void 0 !== i && i.height() > h && a(e.contentWrapper).css(\"min-height\", i.height());\n }\n }, g.prototype.fixSidebar = function () {\n if (!a(\"body\").hasClass(f.fixed)) return void (void 0 !== a.fn.slimScroll && a(e.sidebar).slimScroll({ destroy: !0 }).height(\"auto\"));this.options.slimscroll && void 0 !== a.fn.slimScroll && a(e.sidebar).slimScroll({ height: a(window).height() - a(e.mainHeader).height() + \"px\" });\n };var h = a.fn.layout;a.fn.layout = b, a.fn.layout.Constuctor = g, a.fn.layout.noConflict = function () {\n return a.fn.layout = h, this;\n }, a(window).on(\"load\", function () {\n b.call(a(\"body\"));\n });\n}(jQuery), function (a) {\n \"use strict\";\n function b(b) {\n return this.each(function () {\n var e = a(this),\n f = e.data(c);if (!f) {\n var g = a.extend({}, d, e.data(), \"object\" == (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) && b);e.data(c, f = new h(g));\n }\"toggle\" === b && f.toggle();\n });\n }var c = \"lte.pushmenu\",\n d = { collapseScreenSize: 767, expandOnHover: !1, expandTransitionDelay: 200 },\n e = { collapsed: \".sidebar-collapse\", open: \".sidebar-open\", mainSidebar: \".main-sidebar\", contentWrapper: \".content-wrapper\", searchInput: \".sidebar-form .form-control\", button: '[data-toggle=\"push-menu\"]', mini: \".sidebar-mini\", expanded: \".sidebar-expanded-on-hover\", layoutFixed: \".fixed\" },\n f = { collapsed: \"sidebar-collapse\", open: \"sidebar-open\", mini: \"sidebar-mini\", expanded: \"sidebar-expanded-on-hover\", expandFeature: \"sidebar-mini-expand-feature\", layoutFixed: \"fixed\" },\n g = { expanded: \"expanded.pushMenu\", collapsed: \"collapsed.pushMenu\" },\n h = function h(a) {\n this.options = a, this.init();\n };h.prototype.init = function () {\n (this.options.expandOnHover || a(\"body\").is(e.mini + e.layoutFixed)) && (this.expandOnHover(), a(\"body\").addClass(f.expandFeature)), a(e.contentWrapper).click(function () {\n a(window).width() <= this.options.collapseScreenSize && a(\"body\").hasClass(f.open) && this.close();\n }.bind(this)), a(e.searchInput).click(function (a) {\n a.stopPropagation();\n });\n }, h.prototype.toggle = function () {\n var b = a(window).width(),\n c = !a(\"body\").hasClass(f.collapsed);b <= this.options.collapseScreenSize && (c = a(\"body\").hasClass(f.open)), c ? this.close() : this.open();\n }, h.prototype.open = function () {\n a(window).width() > this.options.collapseScreenSize ? a(\"body\").removeClass(f.collapsed).trigger(a.Event(g.expanded)) : a(\"body\").addClass(f.open).trigger(a.Event(g.expanded));\n }, h.prototype.close = function () {\n a(window).width() > this.options.collapseScreenSize ? a(\"body\").addClass(f.collapsed).trigger(a.Event(g.collapsed)) : a(\"body\").removeClass(f.open + \" \" + f.collapsed).trigger(a.Event(g.collapsed));\n }, h.prototype.expandOnHover = function () {\n a(e.mainSidebar).hover(function () {\n a(\"body\").is(e.mini + e.collapsed) && a(window).width() > this.options.collapseScreenSize && this.expand();\n }.bind(this), function () {\n a(\"body\").is(e.expanded) && this.collapse();\n }.bind(this));\n }, h.prototype.expand = function () {\n setTimeout(function () {\n a(\"body\").removeClass(f.collapsed).addClass(f.expanded);\n }, this.options.expandTransitionDelay);\n }, h.prototype.collapse = function () {\n setTimeout(function () {\n a(\"body\").removeClass(f.expanded).addClass(f.collapsed);\n }, this.options.expandTransitionDelay);\n };var i = a.fn.pushMenu;a.fn.pushMenu = b, a.fn.pushMenu.Constructor = h, a.fn.pushMenu.noConflict = function () {\n return a.fn.pushMenu = i, this;\n }, a(document).on(\"click\", e.button, function (c) {\n c.preventDefault(), b.call(a(this), \"toggle\");\n }), a(window).on(\"load\", function () {\n b.call(a(e.button));\n });\n}(jQuery), function (a) {\n \"use strict\";\n function b(b) {\n return this.each(function () {\n var e = a(this),\n f = e.data(c);if (!f) {\n var h = a.extend({}, d, e.data(), \"object\" == (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) && b);e.data(c, f = new g(e, h));\n }if (\"string\" == typeof f) {\n if (void 0 === f[b]) throw new Error(\"No method named \" + b);f[b]();\n }\n });\n }var c = \"lte.todolist\",\n d = { onCheck: function onCheck(a) {\n return a;\n }, onUnCheck: function onUnCheck(a) {\n return a;\n } },\n e = { data: '[data-widget=\"todo-list\"]' },\n f = { done: \"done\" },\n g = function g(a, b) {\n this.element = a, this.options = b, this._setUpListeners();\n };g.prototype.toggle = function (a) {\n if (a.parents(e.li).first().toggleClass(f.done), !a.prop(\"checked\")) return void this.unCheck(a);this.check(a);\n }, g.prototype.check = function (a) {\n this.options.onCheck.call(a);\n }, g.prototype.unCheck = function (a) {\n this.options.onUnCheck.call(a);\n }, g.prototype._setUpListeners = function () {\n var b = this;a(this.element).on(\"change ifChanged\", \"input:checkbox\", function () {\n b.toggle(a(this));\n });\n };var h = a.fn.todoList;a.fn.todoList = b, a.fn.todoList.Constructor = g, a.fn.todoList.noConflict = function () {\n return a.fn.todoList = h, this;\n }, a(window).on(\"load\", function () {\n a(e.data).each(function () {\n b.call(a(this));\n });\n });\n}(jQuery), function (a) {\n \"use strict\";\n function b(b) {\n return this.each(function () {\n var e = a(this);if (!e.data(c)) {\n var f = a.extend({}, d, e.data(), \"object\" == (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) && b);e.data(c, new h(e, f));\n }\n });\n }var c = \"lte.tree\",\n d = { animationSpeed: 500, accordion: !0, followLink: !1, trigger: \".treeview a\" },\n e = { tree: \".tree\", treeview: \".treeview\", treeviewMenu: \".treeview-menu\", open: \".menu-open, .active\", li: \"li\", data: '[data-widget=\"tree\"]', active: \".active\" },\n f = { open: \"menu-open\", tree: \"tree\" },\n g = { collapsed: \"collapsed.tree\", expanded: \"expanded.tree\" },\n h = function h(b, c) {\n this.element = b, this.options = c, a(this.element).addClass(f.tree), a(e.treeview + e.active, this.element).addClass(f.open), this._setUpListeners();\n };h.prototype.toggle = function (a, b) {\n var c = a.next(e.treeviewMenu),\n d = a.parent(),\n g = d.hasClass(f.open);d.is(e.treeview) && (this.options.followLink && \"#\" !== a.attr(\"href\") || b.preventDefault(), g ? this.collapse(c, d) : this.expand(c, d));\n }, h.prototype.expand = function (b, c) {\n var d = a.Event(g.expanded);if (this.options.accordion) {\n var h = c.siblings(e.open),\n i = h.children(e.treeviewMenu);this.collapse(i, h);\n }c.addClass(f.open), b.slideDown(this.options.animationSpeed, function () {\n a(this.element).trigger(d);\n }.bind(this));\n }, h.prototype.collapse = function (b, c) {\n var d = a.Event(g.collapsed);b.find(e.open).removeClass(f.open), c.removeClass(f.open), b.slideUp(this.options.animationSpeed, function () {\n b.find(e.open + \" > \" + e.treeview).slideUp(), a(this.element).trigger(d);\n }.bind(this));\n }, h.prototype._setUpListeners = function () {\n var b = this;a(this.element).on(\"click\", this.options.trigger, function (c) {\n b.toggle(a(this), c);\n });\n };var i = a.fn.tree;a.fn.tree = b, a.fn.tree.Constructor = h, a.fn.tree.noConflict = function () {\n return a.fn.tree = i, this;\n }, a(window).on(\"load\", function () {\n a(e.data).each(function () {\n b.call(a(this));\n });\n });\n}(jQuery);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9kaXN0L2pzL2FkbWlubHRlLm1pbi5qcz9jMDQ2Il0sIm5hbWVzIjpbImpRdWVyeSIsIkVycm9yIiwiYSIsImIiLCJlYWNoIiwiZSIsImciLCJkYXRhIiwiYyIsImgiLCJleHRlbmQiLCJkIiwiZiIsInNvdXJjZSIsInBhcmFtcyIsInRyaWdnZXIiLCJjb250ZW50IiwibG9hZEluQ29udGVudCIsInJlc3BvbnNlVHlwZSIsIm92ZXJsYXlUZW1wbGF0ZSIsIm9uTG9hZFN0YXJ0Iiwib25Mb2FkRG9uZSIsImVsZW1lbnQiLCJvcHRpb25zIiwiJG92ZXJsYXkiLCJvdmVybGF5IiwiX3NldFVwTGlzdGVuZXJzIiwibG9hZCIsInByb3RvdHlwZSIsIl9hZGRPdmVybGF5IiwiY2FsbCIsImdldCIsImh0bWwiLCJfcmVtb3ZlT3ZlcmxheSIsImJpbmQiLCJvbiIsInByZXZlbnREZWZhdWx0IiwiYXBwZW5kIiwicmVtb3ZlIiwiZm4iLCJib3hSZWZyZXNoIiwiQ29uc3RydWN0b3IiLCJub0NvbmZsaWN0Iiwid2luZG93IiwiYW5pbWF0aW9uU3BlZWQiLCJjb2xsYXBzZVRyaWdnZXIiLCJyZW1vdmVUcmlnZ2VyIiwiY29sbGFwc2VJY29uIiwiZXhwYW5kSWNvbiIsInJlbW92ZUljb24iLCJjb2xsYXBzZWQiLCJoZWFkZXIiLCJib2R5IiwiZm9vdGVyIiwidG9vbHMiLCJleHBhbmRlZCIsInJlbW92ZWQiLCJ0b2dnbGUiLCJpcyIsImV4cGFuZCIsImNvbGxhcHNlIiwiRXZlbnQiLCJyZW1vdmVDbGFzcyIsImNoaWxkcmVuIiwiZmluZCIsImFkZENsYXNzIiwic2xpZGVEb3duIiwic2xpZGVVcCIsImkiLCJib3hXaWRnZXQiLCJzbGlkZSIsInNpZGViYXIiLCJvcGVuIiwiYmciLCJ3cmFwcGVyIiwiYm94ZWQiLCJmaXhlZCIsImhhc0JpbmRlZFJlc2l6ZSIsImluaXQiLCJmaXgiLCJyZXNpemUiLCJfZml4Rm9yQm94ZWQiLCJjc3MiLCJwb3NpdGlvbiIsImhlaWdodCIsImNvbnRyb2xTaWRlYmFyIiwiZG9jdW1lbnQiLCJib3giLCJwYXJlbnRzIiwiZmlyc3QiLCJ0b2dnbGVDbGFzcyIsImRpcmVjdENoYXQiLCJzbGltc2Nyb2xsIiwicmVzZXRIZWlnaHQiLCJjb250ZW50V3JhcHBlciIsImxheW91dEJveGVkIiwibWFpbkZvb3RlciIsIm1haW5IZWFkZXIiLCJzaWRlYmFyTWVudSIsImxvZ28iLCJob2xkVHJhbnNpdGlvbiIsImJpbmRlZFJlc2l6ZSIsImFjdGl2YXRlIiwiZml4U2lkZWJhciIsIm9uZSIsIm91dGVySGVpZ2h0IiwiaGFzQ2xhc3MiLCJzbGltU2Nyb2xsIiwiZGVzdHJveSIsImxheW91dCIsIkNvbnN0dWN0b3IiLCJjb2xsYXBzZVNjcmVlblNpemUiLCJleHBhbmRPbkhvdmVyIiwiZXhwYW5kVHJhbnNpdGlvbkRlbGF5IiwibWFpblNpZGViYXIiLCJzZWFyY2hJbnB1dCIsImJ1dHRvbiIsIm1pbmkiLCJsYXlvdXRGaXhlZCIsImV4cGFuZEZlYXR1cmUiLCJjbGljayIsIndpZHRoIiwiY2xvc2UiLCJzdG9wUHJvcGFnYXRpb24iLCJob3ZlciIsInNldFRpbWVvdXQiLCJwdXNoTWVudSIsIm9uQ2hlY2siLCJvblVuQ2hlY2siLCJkb25lIiwibGkiLCJwcm9wIiwidW5DaGVjayIsImNoZWNrIiwidG9kb0xpc3QiLCJhY2NvcmRpb24iLCJmb2xsb3dMaW5rIiwidHJlZSIsInRyZWV2aWV3IiwidHJlZXZpZXdNZW51IiwiYWN0aXZlIiwibmV4dCIsInBhcmVudCIsImF0dHIiLCJzaWJsaW5ncyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7Ozs7Ozs7OztBQWFBLElBQUcsZUFBYSxPQUFPQSxNQUF2QixFQUE4QixNQUFNLElBQUlDLEtBQUosQ0FBVSwwQkFBVixDQUFOLENBQTRDLENBQUMsVUFBU0MsQ0FBVCxFQUFXO0FBQUM7QUFBYSxXQUFTQyxDQUFULENBQVdBLENBQVgsRUFBYTtB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LENBQXhCLENBQTFDO0FBQXFFLEtBQWhGLENBQWlGdUIsSUFBakYsQ0FBc0YsSUFBdEYsQ0FBdEMsQ0FBekQ7QUFBNEwsR0FBcnVCLEVBQXN1QnpCLEVBQUVtQixTQUFGLENBQVlGLGVBQVosR0FBNEIsWUFBVTtBQUFDLFFBQUl2QixJQUFFLElBQU4sQ0FBV0QsRUFBRSxLQUFLb0IsT0FBUCxFQUFnQmEsRUFBaEIsQ0FBbUIsT0FBbkIsRUFBMkIsS0FBS1osT0FBTCxDQUFhUixPQUF4QyxFQUFnRCxVQUFTUCxDQUFULEVBQVc7QUFBQ0wsUUFBRXNELE1BQUYsQ0FBU3ZELEVBQUUsSUFBRixDQUFULEVBQWlCTSxDQUFqQjtBQUFvQixLQUFoRjtBQUFrRixHQUExMkIsQ0FBMjJCLElBQUk0RCxJQUFFbEUsRUFBRXFDLEVBQUYsQ0FBS2tHLElBQVgsQ0FBZ0J2SSxFQUFFcUMsRUFBRixDQUFLa0csSUFBTCxHQUFVdEksQ0FBVixFQUFZRCxFQUFFcUMsRUFBRixDQUFLa0csSUFBTCxDQUFVaEcsV0FBVixHQUFzQmhDLENBQWxDLEVBQW9DUCxFQUFFcUMsRUFBRixDQUFLa0csSUFBTCxDQUFVL0YsVUFBVixHQUFxQixZQUFVO0FBQUMsV0FBT3hDLEVBQUVxQyxFQUFGLENBQUtrRyxJQUFMLEdBQVVyRSxDQUFWLEVBQVksSUFBbkI7QUFBd0IsR0FBNUYsRUFBNkZsRSxFQUFFeUMsTUFBRixFQUFVUixFQUFWLENBQWEsTUFBYixFQUFvQixZQUFVO0FBQUNqQyxNQUFFRyxFQUFFRSxJQUFKLEVBQVVILElBQVYsQ0FBZSxZQUFVO0FBQUNELFFBQUUyQixJQUFGLENBQU81QixFQUFFLElBQUYsQ0FBUDtBQUFnQixLQUExQztBQUE0QyxHQUEzRSxDQUE3RjtBQUEwSyxDQUFuckQsQ0FBb3JERixNQUFwckQsQ0FBN2dZIiwiZmlsZSI6IjYzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyohIEFkbWluTFRFIGFwcC5qc1xuKiA9PT09PT09PT09PT09PT09XG4qIE1haW4gSlMgYXBwbGljYXRpb24gZmlsZSBmb3IgQWRtaW5MVEUgdjIuIFRoaXMgZmlsZVxuKiBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYWxsIHBhZ2VzLiBJdCBjb250cm9scyBzb21lIGxheW91dFxuKiBvcHRpb25zIGFuZCBpbXBsZW1lbnRzIGV4Y2x1c2l2ZSBBZG1pbkxURSBwbHVnaW5zLlxuKlxuKiBAQXV0aG9yICBBbG1zYWVlZCBTdHVkaW9cbiogQFN1cHBvcnQgPGh0dHBzOi8vd3d3LmFsbXNhZWVkc3R1ZGlvLmNvbT5cbiogQEVtYWlsICAgPGFiZHVsbGFoQGFsbXNhZWVkc3R1ZGlvLmNvbT5cbiogQHZlcnNpb24gMi40LjJcbiogQHJlcG9zaXRvcnkgZ2l0Oi8vZ2l0aHViLmNvbS9hbG1hc2FlZWQyMDEwL0FkbWluTFRFLmdpdFxuKiBAbGljZW5zZSBNSVQgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+XG4qL1xuaWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGpRdWVyeSl0aHJvdyBuZXcgRXJyb3IoXCJBZG1pbkxURSByZXF1aXJlcyBqUXVlcnlcIik7K2Z1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPWEodGhpcyksZz1lLmRhdGEoYyk7aWYoIWcpe3ZhciBoPWEuZXh0ZW5kKHt9LGQsZS5kYXRhKCksXCJvYmplY3RcIj09dHlwZW9mIGImJmIpO2UuZGF0YShjLGc9bmV3IGYoZSxoKSl9aWYoXCJzdHJpbmdcIj09dHlwZW9mIGcpe2lmKHZvaWQgMD09PWdbYl0pdGhyb3cgbmV3IEVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFwiK2IpO2dbYl0oKX19KX12YXIgYz1cImx0ZS5ib3hyZWZyZXNoXCIsZD17c291cmNlOlwiXCIscGFyYW1zOnt9LHRyaWdnZXI6XCIucmVmcmVzaC1idG5cIixjb250ZW50OlwiLmJveC1ib2R5XCIsbG9hZEluQ29udGVudDohMCxyZXNwb25zZVR5cGU6XCJcIixvdmVybGF5VGVtcGxhdGU6JzxkaXYgY2xhc3M9XCJvdmVybGF5XCI+PGRpdiBjbGFzcz1cImZhIGZhLXJlZnJlc2ggZmEtc3BpblwiPjwvZGl2PjwvZGl2Picsb25Mb2FkU3RhcnQ6ZnVuY3Rpb24oKXt9LG9uTG9hZERvbmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9fSxlPXtkYXRhOidbZGF0YS13aWRnZXQ9XCJib3gtcmVmcmVzaFwiXSd9LGY9ZnVuY3Rpb24oYixjKXtpZih0aGlzLmVsZW1lbnQ9Yix0aGlzLm9wdGlvbnM9Yyx0aGlzLiRvdmVybGF5PWEoYy5vdmVybGF5KSxcIlwiPT09Yy5zb3VyY2UpdGhyb3cgbmV3IEVycm9yKFwiU291cmNlIHVybCB3YXMgbm90IGRlZmluZWQuIFBsZWFzZSBzcGVjaWZ5IGEgdXJsIGluIHlvdXIgQm94UmVmcmVzaCBzb3VyY2Ugb3B0aW9uLlwiKTt0aGlzLl9zZXRVcExpc3RlbmVycygpLHRoaXMubG9hZCgpfTtmLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dGhpcy5fYWRkT3ZlcmxheSgpLHRoaXMub3B0aW9ucy5vbkxvYWRTdGFydC5jYWxsKGEodGhpcykpLGEuZ2V0KHRoaXMub3B0aW9ucy5zb3VyY2UsdGhpcy5vcHRpb25zLnBhcmFtcyxmdW5jdGlvbihiKXt0aGlzLm9wdGlvbnMubG9hZEluQ29udGVudCYmYSh0aGlzLm9wdGlvbnMuY29udGVudCkuaHRtbChiKSx0aGlzLm9wdGlvbnMub25Mb2FkRG9uZS5jYWxsKGEodGhpcyksYiksdGhpcy5fcmVtb3ZlT3ZlcmxheSgpfS5iaW5kKHRoaXMpLFwiXCIhPT10aGlzLm9wdGlvbnMucmVzcG9uc2VUeXBlJiZ0aGlzLm9wdGlvbnMucmVzcG9uc2VUeXBlKX0sZi5wcm90b3R5cGUuX3NldFVwTGlzdGVuZXJzPWZ1bmN0aW9uKCl7YSh0aGlzLmVsZW1lbnQpLm9uKFwiY2xpY2tcIixlLnRyaWdnZXIsZnVuY3Rpb24oYSl7YSYmYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubG9hZCgpfS5iaW5kKHRoaXMpKX0sZi5wcm90b3R5cGUuX2FkZE92ZXJsYXk9ZnVuY3Rpb24oKXthKHRoaXMuZWxlbWVudCkuYXBwZW5kKHRoaXMuJG92ZXJsYXkpfSxmLnByb3RvdHlwZS5fcmVtb3ZlT3ZlcmxheT1mdW5jdGlvbigpe2EodGhpcy5lbGVtZW50KS5yZW1vdmUodGhpcy4kb3ZlcmxheSl9O3ZhciBnPWEuZm4uYm94UmVmcmVzaDthLmZuLmJveFJlZnJlc2g9YixhLmZuLmJveFJlZnJlc2guQ29uc3RydWN0b3I9ZixhLmZuLmJveFJlZnJlc2gubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLmJveFJlZnJlc2g9Zyx0aGlzfSxhKHdpbmRvdykub24oXCJsb2FkXCIsZnVuY3Rpb24oKXthKGUuZGF0YSkuZWFjaChmdW5jdGlvbigpe2IuY2FsbChhKHRoaXMpKX0pfSl9KGpRdWVyeSksZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9YSh0aGlzKSxmPWUuZGF0YShjKTtpZighZil7dmFyIGc9YS5leHRlbmQoe30sZCxlLmRhdGEoKSxcIm9iamVjdFwiPT10eXBlb2YgYiYmYik7ZS5kYXRhKGMsZj1uZXcgaChlLGcpKX1pZihcInN0cmluZ1wiPT10eXBlb2YgYil7aWYodm9pZCAwPT09ZltiXSl0aHJvdyBuZXcgRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXCIrYik7ZltiXSgpfX0pfXZhciBjPVwibHRlLmJveHdpZGdldFwiLGQ9e2FuaW1hdGlvblNwZWVkOjUwMCxjb2xsYXBzZVRyaWdnZXI6J1tkYXRhLXdpZGdldD1cImNvbGxhcHNlXCJdJyxyZW1vdmVUcmlnZ2VyOidbZGF0YS13aWRnZXQ9XCJyZW1vdmVcIl0nLGNvbGxhcHNlSWNvbjpcImZhLW1pbnVzXCIsZXhwYW5kSWNvbjpcImZhLXBsdXNcIixyZW1vdmVJY29uOlwiZmEtdGltZXNcIn0sZT17ZGF0YTpcIi5ib3hcIixjb2xsYXBzZWQ6XCIuY29sbGFwc2VkLWJveFwiLGhlYWRlcjpcIi5ib3gtaGVhZGVyXCIsYm9keTpcIi5ib3gtYm9keVwiLGZvb3RlcjpcIi5ib3gtZm9vdGVyXCIsdG9vbHM6XCIuYm94LXRvb2xzXCJ9LGY9e2NvbGxhcHNlZDpcImNvbGxhcHNlZC1ib3hcIn0sZz17Y29sbGFwc2VkOlwiY29sbGFwc2VkLmJveHdpZGdldFwiLGV4cGFuZGVkOlwiZXhwYW5kZWQuYm94d2lkZ2V0XCIscmVtb3ZlZDpcInJlbW92ZWQuYm94d2lkZ2V0XCJ9LGg9ZnVuY3Rpb24oYSxiKXt0aGlzLmVsZW1lbnQ9YSx0aGlzLm9wdGlvbnM9Yix0aGlzLl9zZXRVcExpc3RlbmVycygpfTtoLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24oKXthKHRoaXMuZWxlbWVudCkuaXMoZS5jb2xsYXBzZWQpP3RoaXMuZXhwYW5kKCk6dGhpcy5jb2xsYXBzZSgpfSxoLnByb3RvdHlwZS5leHBhbmQ9ZnVuY3Rpb24oKXt2YXIgYj1hLkV2ZW50KGcuZXhwYW5kZWQpLGM9dGhpcy5vcHRpb25zLmNvbGxhcHNlSWNvbixkPXRoaXMub3B0aW9ucy5leHBhbmRJY29uO2EodGhpcy5lbGVtZW50KS5yZW1vdmVDbGFzcyhmLmNvbGxhcHNlZCksYSh0aGlzLmVsZW1lbnQpLmNoaWxkcmVuKGUuaGVhZGVyK1wiLCBcIitlLmJvZHkrXCIsIFwiK2UuZm9vdGVyKS5jaGlsZHJlbihlLnRvb2xzKS5maW5kKFwiLlwiK2QpLnJlbW92ZUNsYXNzKGQpLmFkZENsYXNzKGMpLGEodGhpcy5lbGVtZW50KS5jaGlsZHJlbihlLmJvZHkrXCIsIFwiK2UuZm9vdGVyKS5zbGlkZURvd24odGhpcy5vcHRpb25zLmFuaW1hdGlvblNwZWVkLGZ1bmN0aW9uKCl7YSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIoYil9LmJpbmQodGhpcykpfSxoLnByb3RvdHlwZS5jb2xsYXBzZT1mdW5jdGlvbigpe3ZhciBiPWEuRXZlbnQoZy5jb2xsYXBzZWQpLGM9dGhpcy5vcHRpb25zLmNvbGxhcHNlSWNvbixkPXRoaXMub3B0aW9ucy5leHBhbmRJY29uO2EodGhpcy5lbGVtZW50KS5jaGlsZHJlbihlLmhlYWRlcitcIiwgXCIrZS5ib2R5K1wiLCBcIitlLmZvb3RlcikuY2hpbGRyZW4oZS50b29scykuZmluZChcIi5cIitjKS5yZW1vdmVDbGFzcyhjKS5hZGRDbGFzcyhkKSxhKHRoaXMuZWxlbWVudCkuY2hpbGRyZW4oZS5ib2R5K1wiLCBcIitlLmZvb3Rlcikuc2xpZGVVcCh0aGlzLm9wdGlvbnMuYW5pbWF0aW9uU3BlZWQsZnVuY3Rpb24oKXthKHRoaXMuZWxlbWVudCkuYWRkQ2xhc3MoZi5jb2xsYXBzZWQpLGEodGhpcy5lbGVtZW50KS50cmlnZ2VyKGIpfS5iaW5kKHRoaXMpKX0saC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dmFyIGI9YS5FdmVudChnLnJlbW92ZWQpO2EodGhpcy5lbGVtZW50KS5zbGlkZVVwKHRoaXMub3B0aW9ucy5hbmltYXRpb25TcGVlZCxmdW5jdGlvbigpe2EodGhpcy5lbGVtZW50KS50cmlnZ2VyKGIpLGEodGhpcy5lbGVtZW50KS5yZW1vdmUoKX0uYmluZCh0aGlzKSl9LGgucHJvdG90eXBlLl9zZXRVcExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBiPXRoaXM7YSh0aGlzLmVsZW1lbnQpLm9uKFwiY2xpY2tcIix0aGlzLm9wdGlvbnMuY29sbGFwc2VUcmlnZ2VyLGZ1bmN0aW9uKGMpe3JldHVybiBjJiZjLnByZXZlbnREZWZhdWx0KCksYi50b2dnbGUoYSh0aGlzKSksITF9KSxhKHRoaXMuZWxlbWVudCkub24oXCJjbGlja1wiLHRoaXMub3B0aW9ucy5yZW1vdmVUcmlnZ2VyLGZ1bmN0aW9uKGMpe3JldHVybiBjJiZjLnByZXZlbnREZWZhdWx0KCksYi5yZW1vdmUoYSh0aGlzKSksITF9KX07dmFyIGk9YS5mbi5ib3hXaWRnZXQ7YS5mbi5ib3hXaWRnZXQ9YixhLmZuLmJveFdpZGdldC5Db25zdHJ1Y3Rvcj1oLGEuZm4uYm94V2lkZ2V0Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5ib3hXaWRnZXQ9aSx0aGlzfSxhKHdpbmRvdykub24oXCJsb2FkXCIsZnVuY3Rpb24oKXthKGUuZGF0YSkuZWFjaChmdW5jdGlvbigpe2IuY2FsbChhKHRoaXMpKX0pfSl9KGpRdWVyeSksZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9YSh0aGlzKSxmPWUuZGF0YShjKTtpZighZil7dmFyIGc9YS5leHRlbmQoe30sZCxlLmRhdGEoKSxcIm9iamVjdFwiPT10eXBlb2YgYiYmYik7ZS5kYXRhKGMsZj1uZXcgaChlLGcpKX1cInN0cmluZ1wiPT10eXBlb2YgYiYmZi50b2dnbGUoKX0pfXZhciBjPVwibHRlLmNvbnRyb2xzaWRlYmFyXCIsZD17c2xpZGU6ITB9LGU9e3NpZGViYXI6XCIuY29udHJvbC1zaWRlYmFyXCIsZGF0YTonW2RhdGEtdG9nZ2xlPVwiY29udHJvbC1zaWRlYmFyXCJdJyxvcGVuOlwiLmNvbnRyb2wtc2lkZWJhci1vcGVuXCIsYmc6XCIuY29udHJvbC1zaWRlYmFyLWJnXCIsd3JhcHBlcjpcIi53cmFwcGVyXCIsY29udGVudDpcIi5jb250ZW50LXdyYXBwZXJcIixib3hlZDpcIi5sYXlvdXQtYm94ZWRcIn0sZj17b3BlbjpcImNvbnRyb2wtc2lkZWJhci1vcGVuXCIsZml4ZWQ6XCJmaXhlZFwifSxnPXtjb2xsYXBzZWQ6XCJjb2xsYXBzZWQuY29udHJvbHNpZGViYXJcIixleHBhbmRlZDpcImV4cGFuZGVkLmNvbnRyb2xzaWRlYmFyXCJ9LGg9ZnVuY3Rpb24oYSxiKXt0aGlzLmVsZW1lbnQ9YSx0aGlzLm9wdGlvbnM9Yix0aGlzLmhhc0JpbmRlZFJlc2l6ZT0hMSx0aGlzLmluaXQoKX07aC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe2EodGhpcy5lbGVtZW50KS5pcyhlLmRhdGEpfHxhKHRoaXMpLm9uKFwiY2xpY2tcIix0aGlzLnRvZ2dsZSksdGhpcy5maXgoKSxhKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCl7dGhpcy5maXgoKX0uYmluZCh0aGlzKSl9LGgucHJvdG90eXBlLnRvZ2dsZT1mdW5jdGlvbihiKXtiJiZiLnByZXZlbnREZWZhdWx0KCksdGhpcy5maXgoKSxhKGUuc2lkZWJhcikuaXMoZS5vcGVuKXx8YShcImJvZHlcIikuaXMoZS5vcGVuKT90aGlzLmNvbGxhcHNlKCk6dGhpcy5leHBhbmQoKX0saC5wcm90b3R5cGUuZXhwYW5kPWZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnNsaWRlP2EoZS5zaWRlYmFyKS5hZGRDbGFzcyhmLm9wZW4pOmEoXCJib2R5XCIpLmFkZENsYXNzKGYub3BlbiksYSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIoYS5FdmVudChnLmV4cGFuZGVkKSl9LGgucHJvdG90eXBlLmNvbGxhcHNlPWZ1bmN0aW9uKCl7YShcImJvZHksIFwiK2Uuc2lkZWJhcikucmVtb3ZlQ2xhc3MoZi5vcGVuKSxhKHRoaXMuZWxlbWVudCkudHJpZ2dlcihhLkV2ZW50KGcuY29sbGFwc2VkKSl9LGgucHJvdG90eXBlLmZpeD1mdW5jdGlvbigpe2EoXCJib2R5XCIpLmlzKGUuYm94ZWQpJiZ0aGlzLl9maXhGb3JCb3hlZChhKGUuYmcpKX0saC5wcm90b3R5cGUuX2ZpeEZvckJveGVkPWZ1bmN0aW9uKGIpe2IuY3NzKHtwb3NpdGlvbjpcImFic29sdXRlXCIsaGVpZ2h0OmEoZS53cmFwcGVyKS5oZWlnaHQoKX0pfTt2YXIgaT1hLmZuLmNvbnRyb2xTaWRlYmFyO2EuZm4uY29udHJvbFNpZGViYXI9YixhLmZuLmNvbnRyb2xTaWRlYmFyLkNvbnN0cnVjdG9yPWgsYS5mbi5jb250cm9sU2lkZWJhci5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4uY29udHJvbFNpZGViYXI9aSx0aGlzfSxhKGRvY3VtZW50KS5vbihcImNsaWNrXCIsZS5kYXRhLGZ1bmN0aW9uKGMpe2MmJmMucHJldmVudERlZmF1bHQoKSxiLmNhbGwoYSh0aGlzKSxcInRvZ2dsZVwiKX0pfShqUXVlcnkpLGZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1kLmRhdGEoYyk7ZXx8ZC5kYXRhKGMsZT1uZXcgZihkKSksXCJzdHJpbmdcIj09dHlwZW9mIGImJmUudG9nZ2xlKGQpfSl9dmFyIGM9XCJsdGUuZGlyZWN0Y2hhdFwiLGQ9e2RhdGE6J1tkYXRhLXdpZGdldD1cImNoYXQtcGFuZS10b2dnbGVcIl0nLGJveDpcIi5kaXJlY3QtY2hhdFwifSxlPXtvcGVuOlwiZGlyZWN0LWNoYXQtY29udGFjdHMtb3BlblwifSxmPWZ1bmN0aW9uKGEpe3RoaXMuZWxlbWVudD1hfTtmLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24oYSl7YS5wYXJlbnRzKGQuYm94KS5maXJzdCgpLnRvZ2dsZUNsYXNzKGUub3Blbil9O3ZhciBnPWEuZm4uZGlyZWN0Q2hhdDthLmZuLmRpcmVjdENoYXQ9YixhLmZuLmRpcmVjdENoYXQuQ29uc3RydWN0b3I9ZixhLmZuLmRpcmVjdENoYXQubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLmRpcmVjdENoYXQ9Zyx0aGlzfSxhKGRvY3VtZW50KS5vbihcImNsaWNrXCIsZC5kYXRhLGZ1bmN0aW9uKGMpe2MmJmMucHJldmVudERlZmF1bHQoKSxiLmNhbGwoYSh0aGlzKSxcInRvZ2dsZVwiKX0pfShqUXVlcnkpLGZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPWEodGhpcyksZj1lLmRhdGEoYyk7aWYoIWYpe3ZhciBoPWEuZXh0ZW5kKHt9LGQsZS5kYXRhKCksXCJvYmplY3RcIj09dHlwZW9mIGImJmIpO2UuZGF0YShjLGY9bmV3IGcoaCkpfWlmKFwic3RyaW5nXCI9PXR5cGVvZiBiKXtpZih2b2lkIDA9PT1mW2JdKXRocm93IG5ldyBFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcIitiKTtmW2JdKCl9fSl9dmFyIGM9XCJsdGUubGF5b3V0XCIsZD17c2xpbXNjcm9sbDohMCxyZXNldEhlaWdodDohMH0sZT17d3JhcHBlcjpcIi53cmFwcGVyXCIsY29udGVudFdyYXBwZXI6XCIuY29udGVudC13cmFwcGVyXCIsbGF5b3V0Qm94ZWQ6XCIubGF5b3V0LWJveGVkXCIsbWFpbkZvb3RlcjpcIi5tYWluLWZvb3RlclwiLG1haW5IZWFkZXI6XCIubWFpbi1oZWFkZXJcIixzaWRlYmFyOlwiLnNpZGViYXJcIixjb250cm9sU2lkZWJhcjpcIi5jb250cm9sLXNpZGViYXJcIixmaXhlZDpcIi5maXhlZFwiLHNpZGViYXJNZW51OlwiLnNpZGViYXItbWVudVwiLGxvZ286XCIubWFpbi1oZWFkZXIgLmxvZ29cIn0sZj17Zml4ZWQ6XCJmaXhlZFwiLGhvbGRUcmFuc2l0aW9uOlwiaG9sZC10cmFuc2l0aW9uXCJ9LGc9ZnVuY3Rpb24oYSl7dGhpcy5vcHRpb25zPWEsdGhpcy5iaW5kZWRSZXNpemU9ITEsdGhpcy5hY3RpdmF0ZSgpfTtnLnByb3RvdHlwZS5hY3RpdmF0ZT1mdW5jdGlvbigpe3RoaXMuZml4KCksdGhpcy5maXhTaWRlYmFyKCksYShcImJvZHlcIikucmVtb3ZlQ2xhc3MoZi5ob2xkVHJhbnNpdGlvbiksdGhpcy5vcHRpb25zLnJlc2V0SGVpZ2h0JiZhKFwiYm9keSwgaHRtbCwgXCIrZS53cmFwcGVyKS5jc3Moe2hlaWdodDpcImF1dG9cIixcIm1pbi1oZWlnaHRcIjpcIjEwMCVcIn0pLHRoaXMuYmluZGVkUmVzaXplfHwoYSh3aW5kb3cpLnJlc2l6ZShmdW5jdGlvbigpe3RoaXMuZml4KCksdGhpcy5maXhTaWRlYmFyKCksYShlLmxvZ28rXCIsIFwiK2Uuc2lkZWJhcikub25lKFwid2Via2l0VHJhbnNpdGlvbkVuZCBvdHJhbnNpdGlvbmVuZCBvVHJhbnNpdGlvbkVuZCBtc1RyYW5zaXRpb25FbmQgdHJhbnNpdGlvbmVuZFwiLGZ1bmN0aW9uKCl7dGhpcy5maXgoKSx0aGlzLmZpeFNpZGViYXIoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpLHRoaXMuYmluZGVkUmVzaXplPSEwKSxhKGUuc2lkZWJhck1lbnUpLm9uKFwiZXhwYW5kZWQudHJlZVwiLGZ1bmN0aW9uKCl7dGhpcy5maXgoKSx0aGlzLmZpeFNpZGViYXIoKX0uYmluZCh0aGlzKSksYShlLnNpZGViYXJNZW51KS5vbihcImNvbGxhcHNlZC50cmVlXCIsZnVuY3Rpb24oKXt0aGlzLmZpeCgpLHRoaXMuZml4U2lkZWJhcigpfS5iaW5kKHRoaXMpKX0sZy5wcm90b3R5cGUuZml4PWZ1bmN0aW9uKCl7YShlLmxheW91dEJveGVkK1wiID4gXCIrZS53cmFwcGVyKS5jc3MoXCJvdmVyZmxvd1wiLFwiaGlkZGVuXCIpO3ZhciBiPWEoZS5tYWluRm9vdGVyKS5vdXRlckhlaWdodCgpfHwwLGM9YShlLm1haW5IZWFkZXIpLm91dGVySGVpZ2h0KCkrYixkPWEod2luZG93KS5oZWlnaHQoKSxnPWEoZS5zaWRlYmFyKS5oZWlnaHQoKXx8MDtpZihhKFwiYm9keVwiKS5oYXNDbGFzcyhmLmZpeGVkKSlhKGUuY29udGVudFdyYXBwZXIpLmNzcyhcIm1pbi1oZWlnaHRcIixkLWIpO2Vsc2V7dmFyIGg7ZD49Zz8oYShlLmNvbnRlbnRXcmFwcGVyKS5jc3MoXCJtaW4taGVpZ2h0XCIsZC1jKSxoPWQtYyk6KGEoZS5jb250ZW50V3JhcHBlcikuY3NzKFwibWluLWhlaWdodFwiLGcpLGg9Zyk7dmFyIGk9YShlLmNvbnRyb2xTaWRlYmFyKTt2b2lkIDAhPT1pJiZpLmhlaWdodCgpPmgmJmEoZS5jb250ZW50V3JhcHBlcikuY3NzKFwibWluLWhlaWdodFwiLGkuaGVpZ2h0KCkpfX0sZy5wcm90b3R5cGUuZml4U2lkZWJhcj1mdW5jdGlvbigpe2lmKCFhKFwiYm9keVwiKS5oYXNDbGFzcyhmLmZpeGVkKSlyZXR1cm4gdm9pZCh2b2lkIDAhPT1hLmZuLnNsaW1TY3JvbGwmJmEoZS5zaWRlYmFyKS5zbGltU2Nyb2xsKHtkZXN0cm95OiEwfSkuaGVpZ2h0KFwiYXV0b1wiKSk7dGhpcy5vcHRpb25zLnNsaW1zY3JvbGwmJnZvaWQgMCE9PWEuZm4uc2xpbVNjcm9sbCYmYShlLnNpZGViYXIpLnNsaW1TY3JvbGwoe2hlaWdodDphKHdpbmRvdykuaGVpZ2h0KCktYShlLm1haW5IZWFkZXIpLmhlaWdodCgpK1wicHhcIn0pfTt2YXIgaD1hLmZuLmxheW91dDthLmZuLmxheW91dD1iLGEuZm4ubGF5b3V0LkNvbnN0dWN0b3I9ZyxhLmZuLmxheW91dC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4ubGF5b3V0PWgsdGhpc30sYSh3aW5kb3cpLm9uKFwibG9hZFwiLGZ1bmN0aW9uKCl7Yi5jYWxsKGEoXCJib2R5XCIpKX0pfShqUXVlcnkpLGZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPWEodGhpcyksZj1lLmRhdGEoYyk7aWYoIWYpe3ZhciBnPWEuZXh0ZW5kKHt9LGQsZS5kYXRhKCksXCJvYmplY3RcIj09dHlwZW9mIGImJmIpO2UuZGF0YShjLGY9bmV3IGgoZykpfVwidG9nZ2xlXCI9PT1iJiZmLnRvZ2dsZSgpfSl9dmFyIGM9XCJsdGUucHVzaG1lbnVcIixkPXtjb2xsYXBzZVNjcmVlblNpemU6NzY3LGV4cGFuZE9uSG92ZXI6ITEsZXhwYW5kVHJhbnNpdGlvbkRlbGF5OjIwMH0sZT17Y29sbGFwc2VkOlwiLnNpZGViYXItY29sbGFwc2VcIixvcGVuOlwiLnNpZGViYXItb3BlblwiLG1haW5TaWRlYmFyOlwiLm1haW4tc2lkZWJhclwiLGNvbnRlbnRXcmFwcGVyOlwiLmNvbnRlbnQtd3JhcHBlclwiLHNlYXJjaElucHV0OlwiLnNpZGViYXItZm9ybSAuZm9ybS1jb250cm9sXCIsYnV0dG9uOidbZGF0YS10b2dnbGU9XCJwdXNoLW1lbnVcIl0nLG1pbmk6XCIuc2lkZWJhci1taW5pXCIsZXhwYW5kZWQ6XCIuc2lkZWJhci1leHBhbmRlZC1vbi1ob3ZlclwiLGxheW91dEZpeGVkOlwiLmZpeGVkXCJ9LGY9e2NvbGxhcHNlZDpcInNpZGViYXItY29sbGFwc2VcIixvcGVuOlwic2lkZWJhci1vcGVuXCIsbWluaTpcInNpZGViYXItbWluaVwiLGV4cGFuZGVkOlwic2lkZWJhci1leHBhbmRlZC1vbi1ob3ZlclwiLGV4cGFuZEZlYXR1cmU6XCJzaWRlYmFyLW1pbmktZXhwYW5kLWZlYXR1cmVcIixsYXlvdXRGaXhlZDpcImZpeGVkXCJ9LGc9e2V4cGFuZGVkOlwiZXhwYW5kZWQucHVzaE1lbnVcIixjb2xsYXBzZWQ6XCJjb2xsYXBzZWQucHVzaE1lbnVcIn0saD1mdW5jdGlvbihhKXt0aGlzLm9wdGlvbnM9YSx0aGlzLmluaXQoKX07aC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpeyh0aGlzLm9wdGlvbnMuZXhwYW5kT25Ib3Zlcnx8YShcImJvZHlcIikuaXMoZS5taW5pK2UubGF5b3V0Rml4ZWQpKSYmKHRoaXMuZXhwYW5kT25Ib3ZlcigpLGEoXCJib2R5XCIpLmFkZENsYXNzKGYuZXhwYW5kRmVhdHVyZSkpLGEoZS5jb250ZW50V3JhcHBlcikuY2xpY2soZnVuY3Rpb24oKXthKHdpbmRvdykud2lkdGgoKTw9dGhpcy5vcHRpb25zLmNvbGxhcHNlU2NyZWVuU2l6ZSYmYShcImJvZHlcIikuaGFzQ2xhc3MoZi5vcGVuKSYmdGhpcy5jbG9zZSgpfS5iaW5kKHRoaXMpKSxhKGUuc2VhcmNoSW5wdXQpLmNsaWNrKGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KX0saC5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKCl7dmFyIGI9YSh3aW5kb3cpLndpZHRoKCksYz0hYShcImJvZHlcIikuaGFzQ2xhc3MoZi5jb2xsYXBzZWQpO2I8PXRoaXMub3B0aW9ucy5jb2xsYXBzZVNjcmVlblNpemUmJihjPWEoXCJib2R5XCIpLmhhc0NsYXNzKGYub3BlbikpLGM/dGhpcy5jbG9zZSgpOnRoaXMub3BlbigpfSxoLnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7YSh3aW5kb3cpLndpZHRoKCk+dGhpcy5vcHRpb25zLmNvbGxhcHNlU2NyZWVuU2l6ZT9hKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhmLmNvbGxhcHNlZCkudHJpZ2dlcihhLkV2ZW50KGcuZXhwYW5kZWQpKTphKFwiYm9keVwiKS5hZGRDbGFzcyhmLm9wZW4pLnRyaWdnZXIoYS5FdmVudChnLmV4cGFuZGVkKSl9LGgucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7YSh3aW5kb3cpLndpZHRoKCk+dGhpcy5vcHRpb25zLmNvbGxhcHNlU2NyZWVuU2l6ZT9hKFwiYm9keVwiKS5hZGRDbGFzcyhmLmNvbGxhcHNlZCkudHJpZ2dlcihhLkV2ZW50KGcuY29sbGFwc2VkKSk6YShcImJvZHlcIikucmVtb3ZlQ2xhc3MoZi5vcGVuK1wiIFwiK2YuY29sbGFwc2VkKS50cmlnZ2VyKGEuRXZlbnQoZy5jb2xsYXBzZWQpKX0saC5wcm90b3R5cGUuZXhwYW5kT25Ib3Zlcj1mdW5jdGlvbigpe2EoZS5tYWluU2lkZWJhcikuaG92ZXIoZnVuY3Rpb24oKXthKFwiYm9keVwiKS5pcyhlLm1pbmkrZS5jb2xsYXBzZWQpJiZhKHdpbmRvdykud2lkdGgoKT50aGlzLm9wdGlvbnMuY29sbGFwc2VTY3JlZW5TaXplJiZ0aGlzLmV4cGFuZCgpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YShcImJvZHlcIikuaXMoZS5leHBhbmRlZCkmJnRoaXMuY29sbGFwc2UoKX0uYmluZCh0aGlzKSl9LGgucHJvdG90eXBlLmV4cGFuZD1mdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXthKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhmLmNvbGxhcHNlZCkuYWRkQ2xhc3MoZi5leHBhbmRlZCl9LHRoaXMub3B0aW9ucy5leHBhbmRUcmFuc2l0aW9uRGVsYXkpfSxoLnByb3RvdHlwZS5jb2xsYXBzZT1mdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXthKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhmLmV4cGFuZGVkKS5hZGRDbGFzcyhmLmNvbGxhcHNlZCl9LHRoaXMub3B0aW9ucy5leHBhbmRUcmFuc2l0aW9uRGVsYXkpfTt2YXIgaT1hLmZuLnB1c2hNZW51O2EuZm4ucHVzaE1lbnU9YixhLmZuLnB1c2hNZW51LkNvbnN0cnVjdG9yPWgsYS5mbi5wdXNoTWVudS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4ucHVzaE1lbnU9aSx0aGlzfSxhKGRvY3VtZW50KS5vbihcImNsaWNrXCIsZS5idXR0b24sZnVuY3Rpb24oYyl7Yy5wcmV2ZW50RGVmYXVsdCgpLGIuY2FsbChhKHRoaXMpLFwidG9nZ2xlXCIpfSksYSh3aW5kb3cpLm9uKFwibG9hZFwiLGZ1bmN0aW9uKCl7Yi5jYWxsKGEoZS5idXR0b24pKX0pfShqUXVlcnkpLGZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPWEodGhpcyksZj1lLmRhdGEoYyk7aWYoIWYpe3ZhciBoPWEuZXh0ZW5kKHt9LGQsZS5kYXRhKCksXCJvYmplY3RcIj09dHlwZW9mIGImJmIpO2UuZGF0YShjLGY9bmV3IGcoZSxoKSl9aWYoXCJzdHJpbmdcIj09dHlwZW9mIGYpe2lmKHZvaWQgMD09PWZbYl0pdGhyb3cgbmV3IEVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFwiK2IpO2ZbYl0oKX19KX12YXIgYz1cImx0ZS50b2RvbGlzdFwiLGQ9e29uQ2hlY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LG9uVW5DaGVjazpmdW5jdGlvbihhKXtyZXR1cm4gYX19LGU9e2RhdGE6J1tkYXRhLXdpZGdldD1cInRvZG8tbGlzdFwiXSd9LGY9e2RvbmU6XCJkb25lXCJ9LGc9ZnVuY3Rpb24oYSxiKXt0aGlzLmVsZW1lbnQ9YSx0aGlzLm9wdGlvbnM9Yix0aGlzLl9zZXRVcExpc3RlbmVycygpfTtnLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24oYSl7aWYoYS5wYXJlbnRzKGUubGkpLmZpcnN0KCkudG9nZ2xlQ2xhc3MoZi5kb25lKSwhYS5wcm9wKFwiY2hlY2tlZFwiKSlyZXR1cm4gdm9pZCB0aGlzLnVuQ2hlY2soYSk7dGhpcy5jaGVjayhhKX0sZy5wcm90b3R5cGUuY2hlY2s9ZnVuY3Rpb24oYSl7dGhpcy5vcHRpb25zLm9uQ2hlY2suY2FsbChhKX0sZy5wcm90b3R5cGUudW5DaGVjaz1mdW5jdGlvbihhKXt0aGlzLm9wdGlvbnMub25VbkNoZWNrLmNhbGwoYSl9LGcucHJvdG90eXBlLl9zZXRVcExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBiPXRoaXM7YSh0aGlzLmVsZW1lbnQpLm9uKFwiY2hhbmdlIGlmQ2hhbmdlZFwiLFwiaW5wdXQ6Y2hlY2tib3hcIixmdW5jdGlvbigpe2IudG9nZ2xlKGEodGhpcykpfSl9O3ZhciBoPWEuZm4udG9kb0xpc3Q7YS5mbi50b2RvTGlzdD1iLGEuZm4udG9kb0xpc3QuQ29uc3RydWN0b3I9ZyxhLmZuLnRvZG9MaXN0Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi50b2RvTGlzdD1oLHRoaXN9LGEod2luZG93KS5vbihcImxvYWRcIixmdW5jdGlvbigpe2EoZS5kYXRhKS5lYWNoKGZ1bmN0aW9uKCl7Yi5jYWxsKGEodGhpcykpfSl9KX0oalF1ZXJ5KSxmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBiKGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1hKHRoaXMpO2lmKCFlLmRhdGEoYykpe3ZhciBmPWEuZXh0ZW5kKHt9LGQsZS5kYXRhKCksXCJvYmplY3RcIj09dHlwZW9mIGImJmIpO2UuZGF0YShjLG5ldyBoKGUsZikpfX0pfXZhciBjPVwibHRlLnRyZWVcIixkPXthbmltYXRpb25TcGVlZDo1MDAsYWNjb3JkaW9uOiEwLGZvbGxvd0xpbms6ITEsdHJpZ2dlcjpcIi50cmVldmlldyBhXCJ9LGU9e3RyZWU6XCIudHJlZVwiLHRyZWV2aWV3OlwiLnRyZWV2aWV3XCIsdHJlZXZpZXdNZW51OlwiLnRyZWV2aWV3LW1lbnVcIixvcGVuOlwiLm1lbnUtb3BlbiwgLmFjdGl2ZVwiLGxpOlwibGlcIixkYXRhOidbZGF0YS13aWRnZXQ9XCJ0cmVlXCJdJyxhY3RpdmU6XCIuYWN0aXZlXCJ9LGY9e29wZW46XCJtZW51LW9wZW5cIix0cmVlOlwidHJlZVwifSxnPXtjb2xsYXBzZWQ6XCJjb2xsYXBzZWQudHJlZVwiLGV4cGFuZGVkOlwiZXhwYW5kZWQudHJlZVwifSxoPWZ1bmN0aW9uKGIsYyl7dGhpcy5lbGVtZW50PWIsdGhpcy5vcHRpb25zPWMsYSh0aGlzLmVsZW1lbnQpLmFkZENsYXNzKGYudHJlZSksYShlLnRyZWV2aWV3K2UuYWN0aXZlLHRoaXMuZWxlbWVudCkuYWRkQ2xhc3MoZi5vcGVuKSx0aGlzLl9zZXRVcExpc3RlbmVycygpfTtoLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm5leHQoZS50cmVldmlld01lbnUpLGQ9YS5wYXJlbnQoKSxnPWQuaGFzQ2xhc3MoZi5vcGVuKTtkLmlzKGUudHJlZXZpZXcpJiYodGhpcy5vcHRpb25zLmZvbGxvd0xpbmsmJlwiI1wiIT09YS5hdHRyKFwiaHJlZlwiKXx8Yi5wcmV2ZW50RGVmYXVsdCgpLGc/dGhpcy5jb2xsYXBzZShjLGQpOnRoaXMuZXhwYW5kKGMsZCkpfSxoLnByb3RvdHlwZS5leHBhbmQ9ZnVuY3Rpb24oYixjKXt2YXIgZD1hLkV2ZW50KGcuZXhwYW5kZWQpO2lmKHRoaXMub3B0aW9ucy5hY2NvcmRpb24pe3ZhciBoPWMuc2libGluZ3MoZS5vcGVuKSxpPWguY2hpbGRyZW4oZS50cmVldmlld01lbnUpO3RoaXMuY29sbGFwc2UoaSxoKX1jLmFkZENsYXNzKGYub3BlbiksYi5zbGlkZURvd24odGhpcy5vcHRpb25zLmFuaW1hdGlvblNwZWVkLGZ1bmN0aW9uKCl7YSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIoZCl9LmJpbmQodGhpcykpfSxoLnByb3RvdHlwZS5jb2xsYXBzZT1mdW5jdGlvbihiLGMpe3ZhciBkPWEuRXZlbnQoZy5jb2xsYXBzZWQpO2IuZmluZChlLm9wZW4pLnJlbW92ZUNsYXNzKGYub3BlbiksYy5yZW1vdmVDbGFzcyhmLm9wZW4pLGIuc2xpZGVVcCh0aGlzLm9wdGlvbnMuYW5pbWF0aW9uU3BlZWQsZnVuY3Rpb24oKXtiLmZpbmQoZS5vcGVuK1wiID4gXCIrZS50cmVldmlldykuc2xpZGVVcCgpLGEodGhpcy5lbGVtZW50KS50cmlnZ2VyKGQpfS5iaW5kKHRoaXMpKX0saC5wcm90b3R5cGUuX3NldFVwTGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIGI9dGhpczthKHRoaXMuZWxlbWVudCkub24oXCJjbGlja1wiLHRoaXMub3B0aW9ucy50cmlnZ2VyLGZ1bmN0aW9uKGMpe2IudG9nZ2xlKGEodGhpcyksYyl9KX07dmFyIGk9YS5mbi50cmVlO2EuZm4udHJlZT1iLGEuZm4udHJlZS5Db25zdHJ1Y3Rvcj1oLGEuZm4udHJlZS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4udHJlZT1pLHRoaXN9LGEod2luZG93KS5vbihcImxvYWRcIixmdW5jdGlvbigpe2EoZS5kYXRhKS5lYWNoKGZ1bmN0aW9uKCl7Yi5jYWxsKGEodGhpcykpfSl9KX0oalF1ZXJ5KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9kaXN0L2pzL2FkbWlubHRlLm1pbi5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///63\n");
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports) {
+
+eval("/*\n * Author: Abdullah A Almsaeed\n * Date: 4 Jan 2014\n * Description:\n * This is a demo file used only for the main dashboard (index.html)\n **/\n\n$(function () {\n\n 'use strict';\n\n // Make the dashboard widgets sortable Using jquery UI\n\n $('.connectedSortable').sortable({\n placeholder: 'sort-highlight',\n connectWith: '.connectedSortable',\n handle: '.box-header, .nav-tabs',\n forcePlaceholderSize: true,\n zIndex: 999999\n });\n $('.connectedSortable .box-header, .connectedSortable .nav-tabs-custom').css('cursor', 'move');\n\n // jQuery UI sortable for the todo list\n $('.todo-list').sortable({\n placeholder: 'sort-highlight',\n handle: '.handle',\n forcePlaceholderSize: true,\n zIndex: 999999\n });\n\n // bootstrap WYSIHTML5 - text editor\n $('.textarea').wysihtml5();\n\n $('.daterange').daterangepicker({\n ranges: {\n 'Today': [moment(), moment()],\n 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],\n 'Last 7 Days': [moment().subtract(6, 'days'), moment()],\n 'Last 30 Days': [moment().subtract(29, 'days'), moment()],\n 'This Month': [moment().startOf('month'), moment().endOf('month')],\n 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]\n },\n startDate: moment().subtract(29, 'days'),\n endDate: moment()\n }, function (start, end) {\n window.alert('You chose: ' + start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY'));\n });\n\n /* jQueryKnob */\n $('.knob').knob();\n\n // jvectormap data\n var visitorsData = {\n US: 398, // USA\n SA: 400, // Saudi Arabia\n CA: 1000, // Canada\n DE: 500, // Germany\n FR: 760, // France\n CN: 300, // China\n AU: 700, // Australia\n BR: 600, // Brazil\n IN: 800, // India\n GB: 320, // Great Britain\n RU: 3000 // Russia\n };\n // World map by jvectormap\n $('#world-map').vectorMap({\n map: 'world_mill_en',\n backgroundColor: 'transparent',\n regionStyle: {\n initial: {\n fill: '#e4e4e4',\n 'fill-opacity': 1,\n stroke: 'none',\n 'stroke-width': 0,\n 'stroke-opacity': 1\n }\n },\n series: {\n regions: [{\n values: visitorsData,\n scale: ['#92c1dc', '#ebf4f9'],\n normalizeFunction: 'polynomial'\n }]\n },\n onRegionLabelShow: function onRegionLabelShow(e, el, code) {\n if (typeof visitorsData[code] != 'undefined') el.html(el.html() + ': ' + visitorsData[code] + ' new visitors');\n }\n });\n\n // Sparkline charts\n var myvalues = [1000, 1200, 920, 927, 931, 1027, 819, 930, 1021];\n $('#sparkline-1').sparkline(myvalues, {\n type: 'line',\n lineColor: '#92c1dc',\n fillColor: '#ebf4f9',\n height: '50',\n width: '80'\n });\n myvalues = [515, 519, 520, 522, 652, 810, 370, 627, 319, 630, 921];\n $('#sparkline-2').sparkline(myvalues, {\n type: 'line',\n lineColor: '#92c1dc',\n fillColor: '#ebf4f9',\n height: '50',\n width: '80'\n });\n myvalues = [15, 19, 20, 22, 33, 27, 31, 27, 19, 30, 21];\n $('#sparkline-3').sparkline(myvalues, {\n type: 'line',\n lineColor: '#92c1dc',\n fillColor: '#ebf4f9',\n height: '50',\n width: '80'\n });\n\n // The Calender\n $('#calendar').datepicker();\n\n // SLIMSCROLL FOR CHAT WIDGET\n $('#chat-box').slimScroll({\n height: '250px'\n });\n\n /* Morris.js Charts */\n // Sales chart\n var area = new Morris.Area({\n element: 'revenue-chart',\n resize: true,\n data: [{ y: '2011 Q1', item1: 2666, item2: 2666 }, { y: '2011 Q2', item1: 2778, item2: 2294 }, { y: '2011 Q3', item1: 4912, item2: 1969 }, { y: '2011 Q4', item1: 3767, item2: 3597 }, { y: '2012 Q1', item1: 6810, item2: 1914 }, { y: '2012 Q2', item1: 5670, item2: 4293 }, { y: '2012 Q3', item1: 4820, item2: 3795 }, { y: '2012 Q4', item1: 15073, item2: 5967 }, { y: '2013 Q1', item1: 10687, item2: 4460 }, { y: '2013 Q2', item1: 8432, item2: 5713 }],\n xkey: 'y',\n ykeys: ['item1', 'item2'],\n labels: ['Item 1', 'Item 2'],\n lineColors: ['#a0d0e0', '#3c8dbc'],\n hideHover: 'auto'\n });\n var line = new Morris.Line({\n element: 'line-chart',\n resize: true,\n data: [{ y: '2011 Q1', item1: 2666 }, { y: '2011 Q2', item1: 2778 }, { y: '2011 Q3', item1: 4912 }, { y: '2011 Q4', item1: 3767 }, { y: '2012 Q1', item1: 6810 }, { y: '2012 Q2', item1: 5670 }, { y: '2012 Q3', item1: 4820 }, { y: '2012 Q4', item1: 15073 }, { y: '2013 Q1', item1: 10687 }, { y: '2013 Q2', item1: 8432 }],\n xkey: 'y',\n ykeys: ['item1'],\n labels: ['Item 1'],\n lineColors: ['#efefef'],\n lineWidth: 2,\n hideHover: 'auto',\n gridTextColor: '#fff',\n gridStrokeWidth: 0.4,\n pointSize: 4,\n pointStrokeColors: ['#efefef'],\n gridLineColor: '#efefef',\n gridTextFamily: 'Open Sans',\n gridTextSize: 10\n });\n\n // Donut Chart\n var donut = new Morris.Donut({\n element: 'sales-chart',\n resize: true,\n colors: ['#3c8dbc', '#f56954', '#00a65a'],\n data: [{ label: 'Download Sales', value: 12 }, { label: 'In-Store Sales', value: 30 }, { label: 'Mail-Order Sales', value: 20 }],\n hideHover: 'auto'\n });\n\n // Fix for charts under tabs\n $('.box ul.nav a').on('shown.bs.tab', function () {\n area.redraw();\n donut.redraw();\n line.redraw();\n });\n\n /* The todo list plugin */\n $('.todo-list').todoList({\n onCheck: function onCheck() {\n window.console.log($(this), 'The element has been checked');\n },\n onUnCheck: function onUnCheck() {\n window.console.log($(this), 'The element has been unchecked');\n }\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92ZW5kb3IvYWxtYXNhZWVkMjAxMC9hZG1pbmx0ZS9kaXN0L2pzL3BhZ2VzL2Rhc2hib2FyZC5qcz8yYWRmIl0sIm5hbWVzIjpbIiQiLCJzb3J0YWJsZSIsInBsYWNlaG9sZGVyIiwiY29ubmVjdFdpdGgiLCJoYW5kbGUiLCJmb3JjZVBsYWNlaG9sZGVyU2l6ZSIsInpJbmRleCIsImNzcyIsInd5c2lodG1sNSIsImRhdGVyYW5nZXBpY2tlciIsInJhbmdlcyIsIm1vbWVudCIsInN1YnRyYWN0Iiwic3RhcnRPZiIsImVuZE9mIiwic3RhcnREYXRlIiwiZW5kRGF0ZSIsInN0YXJ0IiwiZW5kIiwid2luZG93IiwiYWxlcnQiLCJmb3JtYXQiLCJrbm9iIiwidmlzaXRvcnNEYXRhIiwiVVMiLCJTQSIsIkNBIiwiREUiLCJGUiIsIkNOIiwiQVUiLCJCUiIsIklOIiwiR0IiLCJSVSIsInZlY3Rvck1hcCIsIm1hcCIsImJhY2tncm91bmRDb2xvciIsInJlZ2lvblN0eWxlIiwiaW5pdGlhbCIsImZpbGwiLCJzdHJva2UiLCJzZXJpZXMiLCJyZWdpb25zIiwidmFsdWVzIiwic2NhbGUiLCJub3JtYWxpemVGdW5jdGlvbiIsIm9uUmVnaW9uTGFiZWxTaG93IiwiZSIsImVsIiwiY29kZSIsImh0bWwiLCJteXZhbHVlcyIsInNwYXJrbGluZSIsInR5cGUiLCJsaW5lQ29sb3IiLCJmaWxsQ29sb3IiLCJoZWlnaHQiLCJ3aWR0aCIsImRhdGVwaWNrZXIiLCJzbGltU2Nyb2xsIiwiYXJlYSIsIk1vcnJpcyIsIkFyZWEiLCJlbGVtZW50IiwicmVzaXplIiwiZGF0YSIsInkiLCJpdGVtMSIsIml0ZW0yIiwieGtleSIsInlrZXlzIiwibGFiZWxzIiwibGluZUNvbG9ycyIsImhpZGVIb3ZlciIsImxpbmUiLCJMaW5lIiwibGluZVdpZHRoIiwiZ3JpZFRleHRDb2xvciIsImdyaWRTdHJva2VXaWR0aCIsInBvaW50U2l6ZSIsInBvaW50U3Ryb2tlQ29sb3JzIiwiZ3JpZExpbmVDb2xvciIsImdyaWRUZXh0RmFtaWx5IiwiZ3JpZFRleHRTaXplIiwiZG9udXQiLCJEb251dCIsImNvbG9ycyIsImxhYmVsIiwidmFsdWUiLCJvbiIsInJlZHJhdyIsInRvZG9MaXN0Iiwib25DaGVjayIsImNvbnNvbGUiLCJsb2ciLCJvblVuQ2hlY2siXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0FBT0FBLEVBQUUsWUFBWTs7QUFFWjs7QUFFQTs7QUFDQUEsSUFBRSxvQkFBRixFQUF3QkMsUUFBeEIsQ0FBaUM7QUFDL0JDLGlCQUFzQixnQkFEUztBQUUvQkMsaUJBQXNCLG9CQUZTO0FBRy9CQyxZQUFzQix3QkFIUztBQUkvQkMsMEJBQXNCLElBSlM7QUFLL0JDLFlBQXNCO0FBTFMsR0FBakM7QUFPQU4sSUFBRSxxRUFBRixFQUF5RU8sR0FBekUsQ0FBNkUsUUFBN0UsRUFBdUYsTUFBdkY7O0FBRUE7QUFDQVAsSUFBRSxZQUFGLEVBQWdCQyxRQUFoQixDQUF5QjtBQUN2QkMsaUJBQXNCLGdCQURDO0FBRXZCRSxZQUFzQixTQUZDO0FBR3ZCQywwQkFBc0IsSUFIQztBQUl2QkMsWUFBc0I7QUFKQyxHQUF6Qjs7QUFPQTtBQUNBTixJQUFFLFdBQUYsRUFBZVEsU0FBZjs7QUFFQVIsSUFBRSxZQUFGLEVBQWdCUyxlQUFoQixDQUFnQztBQUM5QkMsWUFBVztBQUNULGVBQWdCLENBQUNDLFFBQUQsRUFBV0EsUUFBWCxDQURQO0FBRVQsbUJBQWdCLENBQUNBLFNBQVNDLFFBQVQsQ0FBa0IsQ0FBbEIsRUFBcUIsTUFBckIsQ0FBRCxFQUErQkQsU0FBU0MsUUFBVCxDQUFrQixDQUFsQixFQUFxQixNQUFyQixDQUEvQixDQUZQO0FBR1QscUJBQWdCLENBQUNELFNBQVNDLFFBQVQsQ0FBa0IsQ0FBbEIsRUFBcUIsTUFBckIsQ0FBRCxFQUErQkQsUUFBL0IsQ0FIUDtBQUlULHNCQUFnQixDQUFDQSxTQUFTQyxRQUFULENBQWtCLEVBQWxCLEVBQXNCLE1BQXRCLENBQUQsRUFBZ0NELFFBQWhDLENBSlA7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QXlCO0FBQ3ZCQyxhQUFXLG1CQUFZO0FBQ3JCMUUsYUFBTzJFLE9BQVAsQ0FBZUMsR0FBZixDQUFtQi9GLEVBQUUsSUFBRixDQUFuQixFQUE0Qiw4QkFBNUI7QUFDRCxLQUhzQjtBQUl2QmdHLGVBQVcscUJBQVk7QUFDckI3RSxhQUFPMkUsT0FBUCxDQUFlQyxHQUFmLENBQW1CL0YsRUFBRSxJQUFGLENBQW5CLEVBQTRCLGdDQUE1QjtBQUNEO0FBTnNCLEdBQXpCO0FBU0QsQ0ExTUQiLCJmaWxlIjoiNjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQXV0aG9yOiBBYmR1bGxhaCBBIEFsbXNhZWVkXG4gKiBEYXRlOiA0IEphbiAyMDE0XG4gKiBEZXNjcmlwdGlvbjpcbiAqICAgICAgVGhpcyBpcyBhIGRlbW8gZmlsZSB1c2VkIG9ubHkgZm9yIHRoZSBtYWluIGRhc2hib2FyZCAoaW5kZXguaHRtbClcbiAqKi9cblxuJChmdW5jdGlvbiAoKSB7XG5cbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIE1ha2UgdGhlIGRhc2hib2FyZCB3aWRnZXRzIHNvcnRhYmxlIFVzaW5nIGpxdWVyeSBVSVxuICAkKCcuY29ubmVjdGVkU29ydGFibGUnKS5zb3J0YWJsZSh7XG4gICAgcGxhY2Vob2xkZXIgICAgICAgICA6ICdzb3J0LWhpZ2hsaWdodCcsXG4gICAgY29ubmVjdFdpdGggICAgICAgICA6ICcuY29ubmVjdGVkU29ydGFibGUnLFxuICAgIGhhbmRsZSAgICAgICAgICAgICAgOiAnLmJveC1oZWFkZXIsIC5uYXYtdGFicycsXG4gICAgZm9yY2VQbGFjZWhvbGRlclNpemU6IHRydWUsXG4gICAgekluZGV4ICAgICAgICAgICAgICA6IDk5OTk5OVxuICB9KTtcbiAgJCgnLmNvbm5lY3RlZFNvcnRhYmxlIC5ib3gtaGVhZGVyLCAuY29ubmVjdGVkU29ydGFibGUgLm5hdi10YWJzLWN1c3RvbScpLmNzcygnY3Vyc29yJywgJ21vdmUnKTtcblxuICAvLyBqUXVlcnkgVUkgc29ydGFibGUgZm9yIHRoZSB0b2RvIGxpc3RcbiAgJCgnLnRvZG8tbGlzdCcpLnNvcnRhYmxlKHtcbiAgICBwbGFjZWhvbGRlciAgICAgICAgIDogJ3NvcnQtaGlnaGxpZ2h0JyxcbiAgICBoYW5kbGUgICAgICAgICAgICAgIDogJy5oYW5kbGUnLFxuICAgIGZvcmNlUGxhY2Vob2xkZXJTaXplOiB0cnVlLFxuICAgIHpJbmRleCAgICAgICAgICAgICAgOiA5OTk5OTlcbiAgfSk7XG5cbiAgLy8gYm9vdHN0cmFwIFdZU0lIVE1MNSAtIHRleHQgZWRpdG9yXG4gICQoJy50ZXh0YXJlYScpLnd5c2lodG1sNSgpO1xuXG4gICQoJy5kYXRlcmFuZ2UnKS5kYXRlcmFuZ2VwaWNrZXIoe1xuICAgIHJhbmdlcyAgIDoge1xuICAgICAgJ1RvZGF5JyAgICAgICA6IFttb21lbnQoKSwgbW9tZW50KCldLFxuICAgICAgJ1llc3RlcmRheScgICA6IFttb21lbnQoKS5zdWJ0cmFjdCgxLCAnZGF5cycpLCBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnZGF5cycpXSxcbiAgICAgICdMYXN0IDcgRGF5cycgOiBbbW9tZW50KCkuc3VidHJhY3QoNiwgJ2RheXMnKSwgbW9tZW50KCldLFxuICAgICAgJ0xhc3QgMzAgRGF5cyc6IFttb21lbnQoKS5zdWJ0cmFjdCgyOSwgJ2RheXMnKSwgbW9tZW50KCldLFxuICAgICAgJ1RoaXMgTW9udGgnICA6IFttb21lbnQoKS5zdGFydE9mKCdtb250aCcpLCBtb21lbnQoKS5lbmRPZignbW9udGgnKV0sXG4gICAgICAnTGFzdCBNb250aCcgIDogW21vbWVudCgpLnN1YnRyYWN0KDEsICdtb250aCcpLnN0YXJ0T2YoJ21vbnRoJyksIG1vbWVudCgpLnN1YnRyYWN0KDEsICdtb250aCcpLmVuZE9mKCdtb250aCcpXVxuICAgIH0sXG4gICAgc3RhcnREYXRlOiBtb21lbnQoKS5zdWJ0cmFjdCgyOSwgJ2RheXMnKSxcbiAgICBlbmREYXRlICA6IG1vbWVudCgpXG4gIH0sIGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgd2luZG93LmFsZXJ0KCdZb3UgY2hvc2U6ICcgKyBzdGFydC5mb3JtYXQoJ01NTU0gRCwgWVlZWScpICsgJyAtICcgKyBlbmQuZm9ybWF0KCdNTU1NIEQsIFlZWVknKSk7XG4gIH0pO1xuXG4gIC8qIGpRdWVyeUtub2IgKi9cbiAgJCgnLmtub2InKS5rbm9iKCk7XG5cbiAgLy8ganZlY3Rvcm1hcCBkYXRhXG4gIHZhciB2aXNpdG9yc0RhdGEgPSB7XG4gICAgVVM6IDM5OCwgLy8gVVNBXG4gICAgU0E6IDQwMCwgLy8gU2F1ZGkgQXJhYmlhXG4gICAgQ0E6IDEwMDAsIC8vIENhbmFkYVxuICAgIERFOiA1MDAsIC8vIEdlcm1hbnlcbiAgICBGUjogNzYwLCAvLyBGcmFuY2VcbiAgICBDTjogMzAwLCAvLyBDaGluYVxuICAgIEFVOiA3MDAsIC8vIEF1c3RyYWxpYVxuICAgIEJSOiA2MDAsIC8vIEJyYXppbFxuICAgIElOOiA4MDAsIC8vIEluZGlhXG4gICAgR0I6IDMyMCwgLy8gR3JlYXQgQnJpdGFpblxuICAgIFJVOiAzMDAwIC8vIFJ1c3NpYVxuICB9O1xuICAvLyBXb3JsZCBtYXAgYnkganZlY3Rvcm1hcFxuICAkKCcjd29ybGQtbWFwJykudmVjdG9yTWFwKHtcbiAgICBtYXAgICAgICAgICAgICAgIDogJ3dvcmxkX21pbGxfZW4nLFxuICAgIGJhY2tncm91bmRDb2xvciAgOiAndHJhbnNwYXJlbnQnLFxuICAgIHJlZ2lvblN0eWxlICAgICAgOiB7XG4gICAgICBpbml0aWFsOiB7XG4gICAgICAgIGZpbGwgICAgICAgICAgICA6ICcjZTRlNGU0JyxcbiAgICAgICAgJ2ZpbGwtb3BhY2l0eScgIDogMSxcbiAgICAgICAgc3Ryb2tlICAgICAgICAgIDogJ25vbmUnLFxuICAgICAgICAnc3Ryb2tlLXdpZHRoJyAgOiAwLFxuICAgICAgICAnc3Ryb2tlLW9wYWNpdHknOiAxXG4gICAgICB9XG4gICAgfSxcbiAgICBzZXJpZXMgICAgICAgICAgIDoge1xuICAgICAgcmVnaW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgdmFsdWVzICAgICAgICAgICA6IHZpc2l0b3JzRGF0YSxcbiAgICAgICAgICBzY2FsZSAgICAgICAgICAgIDogWycjOTJjMWRjJywgJyNlYmY0ZjknXSxcbiAgICAgICAgICBub3JtYWxpemVGdW5jdGlvbjogJ3BvbHlub21pYWwnXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIG9uUmVnaW9uTGFiZWxTaG93OiBmdW5jdGlvbiAoZSwgZWwsIGNvZGUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmlzaXRvcnNEYXRhW2NvZGVdICE9ICd1bmRlZmluZWQnKVxuICAgICAgICBlbC5odG1sKGVsLmh0bWwoKSArICc6ICcgKyB2aXNpdG9yc0RhdGFbY29kZV0gKyAnIG5ldyB2aXNpdG9ycycpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gU3BhcmtsaW5lIGNoYXJ0c1xuICB2YXIgbXl2YWx1ZXMgPSBbMTAwMCwgMTIwMCwgOTIwLCA5MjcsIDkzMSwgMTAyNywgODE5LCA5MzAsIDEwMjFdO1xuICAkKCcjc3BhcmtsaW5lLTEnKS5zcGFya2xpbmUobXl2YWx1ZXMsIHtcbiAgICB0eXBlICAgICA6ICdsaW5lJyxcbiAgICBsaW5lQ29sb3I6ICcjOTJjMWRjJyxcbiAgICBmaWxsQ29sb3I6ICcjZWJmNGY5JyxcbiAgICBoZWlnaHQgICA6ICc1MCcsXG4gICAgd2lkdGggICAgOiAnODAnXG4gIH0pO1xuICBteXZhbHVlcyA9IFs1MTUsIDUxOSwgNTIwLCA1MjIsIDY1MiwgODEwLCAzNzAsIDYyNywgMzE5LCA2MzAsIDkyMV07XG4gICQoJyNzcGFya2xpbmUtMicpLnNwYXJrbGluZShteXZhbHVlcywge1xuICAgIHR5cGUgICAgIDogJ2xpbmUnLFxuICAgIGxpbmVDb2xvcjogJyM5MmMxZGMnLFxuICAgIGZpbGxDb2xvcjogJyNlYmY0ZjknLFxuICAgIGhlaWdodCAgIDogJzUwJyxcbiAgICB3aWR0aCAgICA6ICc4MCdcbiAgfSk7XG4gIG15dmFsdWVzID0gWzE1LCAxOSwgMjAsIDIyLCAzMywgMjcsIDMxLCAyNywgMTksIDMwLCAyMV07XG4gICQoJyNzcGFya2xpbmUtMycpLnNwYXJrbGluZShteXZhbHVlcywge1xuICAgIHR5cGUgICAgIDogJ2xpbmUnLFxuICAgIGxpbmVDb2xvcjogJyM5MmMxZGMnLFxuICAgIGZpbGxDb2xvcjogJyNlYmY0ZjknLFxuICAgIGhlaWdodCAgIDogJzUwJyxcbiAgICB3aWR0aCAgICA6ICc4MCdcbiAgfSk7XG5cbiAgLy8gVGhlIENhbGVuZGVyXG4gICQoJyNjYWxlbmRhcicpLmRhdGVwaWNrZXIoKTtcblxuICAvLyBTTElNU0NST0xMIEZPUiBDSEFUIFdJREdFVFxuICAkKCcjY2hhdC1ib3gnKS5zbGltU2Nyb2xsKHtcbiAgICBoZWlnaHQ6ICcyNTBweCdcbiAgfSk7XG5cbiAgLyogTW9ycmlzLmpzIENoYXJ0cyAqL1xuICAvLyBTYWxlcyBjaGFydFxuICB2YXIgYXJlYSA9IG5ldyBNb3JyaXMuQXJlYSh7XG4gICAgZWxlbWVudCAgIDogJ3JldmVudWUtY2hhcnQnLFxuICAgIHJlc2l6ZSAgICA6IHRydWUsXG4gICAgZGF0YSAgICAgIDogW1xuICAgICAgeyB5OiAnMjAxMSBRMScsIGl0ZW0xOiAyNjY2LCBpdGVtMjogMjY2NiB9LFxuICAgICAgeyB5OiAnMjAxMSBRMicsIGl0ZW0xOiAyNzc4LCBpdGVtMjogMjI5NCB9LFxuICAgICAgeyB5OiAnMjAxMSBRMycsIGl0ZW0xOiA0OTEyLCBpdGVtMjogMTk2OSB9LFxuICAgICAgeyB5OiAnMjAxMSBRNCcsIGl0ZW0xOiAzNzY3LCBpdGVtMjogMzU5NyB9LFxuICAgICAgeyB5OiAnMjAxMiBRMScsIGl0ZW0xOiA2ODEwLCBpdGVtMjogMTkxNCB9LFxuICAgICAgeyB5OiAnMjAxMiBRMicsIGl0ZW0xOiA1NjcwLCBpdGVtMjogNDI5MyB9LFxuICAgICAgeyB5OiAnMjAxMiBRMycsIGl0ZW0xOiA0ODIwLCBpdGVtMjogMzc5NSB9LFxuICAgICAgeyB5OiAnMjAxMiBRNCcsIGl0ZW0xOiAxNTA3MywgaXRlbTI6IDU5NjcgfSxcbiAgICAgIHsgeTogJzIwMTMgUTEnLCBpdGVtMTogMTA2ODcsIGl0ZW0yOiA0NDYwIH0sXG4gICAgICB7IHk6ICcyMDEzIFEyJywgaXRlbTE6IDg0MzIsIGl0ZW0yOiA1NzEzIH1cbiAgICBdLFxuICAgIHhrZXkgICAgICA6ICd5JyxcbiAgICB5a2V5cyAgICAgOiBbJ2l0ZW0xJywgJ2l0ZW0yJ10sXG4gICAgbGFiZWxzICAgIDogWydJdGVtIDEnLCAnSXRlbSAyJ10sXG4gICAgbGluZUNvbG9yczogWycjYTBkMGUwJywgJyMzYzhkYmMnXSxcbiAgICBoaWRlSG92ZXIgOiAnYXV0bydcbiAgfSk7XG4gIHZhciBsaW5lID0gbmV3IE1vcnJpcy5MaW5lKHtcbiAgICBlbGVtZW50ICAgICAgICAgIDogJ2xpbmUtY2hhcnQnLFxuICAgIHJlc2l6ZSAgICAgICAgICAgOiB0cnVlLFxuICAgIGRhdGEgICAgICAgICAgICAgOiBbXG4gICAgICB7IHk6ICcyMDExIFExJywgaXRlbTE6IDI2NjYgfSxcbiAgICAgIHsgeTogJzIwMTEgUTInLCBpdGVtMTogMjc3OCB9LFxuICAgICAgeyB5OiAnMjAxMSBRMycsIGl0ZW0xOiA0OTEyIH0sXG4gICAgICB7IHk6ICcyMDExIFE0JywgaXRlbTE6IDM3NjcgfSxcbiAgICAgIHsgeTogJzIwMTIgUTEnLCBpdGVtMTogNjgxMCB9LFxuICAgICAgeyB5OiAnMjAxMiBRMicsIGl0ZW0xOiA1NjcwIH0sXG4gICAgICB7IHk6ICcyMDEyIFEzJywgaXRlbTE6IDQ4MjAgfSxcbiAgICAgIHsgeTogJzIwMTIgUTQnLCBpdGVtMTogMTUwNzMgfSxcbiAgICAgIHsgeTogJzIwMTMgUTEnLCBpdGVtMTogMTA2ODcgfSxcbiAgICAgIHsgeTogJzIwMTMgUTInLCBpdGVtMTogODQzMiB9XG4gICAgXSxcbiAgICB4a2V5ICAgICAgICAgICAgIDogJ3knLFxuICAgIHlrZXlzICAgICAgICAgICAgOiBbJ2l0ZW0xJ10sXG4gICAgbGFiZWxzICAgICAgICAgICA6IFsnSXRlbSAxJ10sXG4gICAgbGluZUNvbG9ycyAgICAgICA6IFsnI2VmZWZlZiddLFxuICAgIGxpbmVXaWR0aCAgICAgICAgOiAyLFxuICAgIGhpZGVIb3ZlciAgICAgICAgOiAnYXV0bycsXG4gICAgZ3JpZFRleHRDb2xvciAgICA6ICcjZmZmJyxcbiAgICBncmlkU3Ryb2tlV2lkdGggIDogMC40LFxuICAgIHBvaW50U2l6ZSAgICAgICAgOiA0LFxuICAgIHBvaW50U3Ryb2tlQ29sb3JzOiBbJyNlZmVmZWYnXSxcbiAgICBncmlkTGluZUNvbG9yICAgIDogJyNlZmVmZWYnLFxuICAgIGdyaWRUZXh0RmFtaWx5ICAgOiAnT3BlbiBTYW5zJyxcbiAgICBncmlkVGV4dFNpemUgICAgIDogMTBcbiAgfSk7XG5cbiAgLy8gRG9udXQgQ2hhcnRcbiAgdmFyIGRvbnV0ID0gbmV3IE1vcnJpcy5Eb251dCh7XG4gICAgZWxlbWVudCAgOiAnc2FsZXMtY2hhcnQnLFxuICAgIHJlc2l6ZSAgIDogdHJ1ZSxcbiAgICBjb2xvcnMgICA6IFsnIzNjOGRiYycsICcjZjU2OTU0JywgJyMwMGE2NWEnXSxcbiAgICBkYXRhICAgICA6IFtcbiAgICAgIHsgbGFiZWw6ICdEb3dubG9hZCBTYWxlcycsIHZhbHVlOiAxMiB9LFxuICAgICAgeyBsYWJlbDogJ0luLVN0b3JlIFNhbGVzJywgdmFsdWU6IDMwIH0sXG4gICAgICB7IGxhYmVsOiAnTWFpbC1PcmRlciBTYWxlcycsIHZhbHVlOiAyMCB9XG4gICAgXSxcbiAgICBoaWRlSG92ZXI6ICdhdXRvJ1xuICB9KTtcblxuICAvLyBGaXggZm9yIGNoYXJ0cyB1bmRlciB0YWJzXG4gICQoJy5ib3ggdWwubmF2IGEnKS5vbignc2hvd24uYnMudGFiJywgZnVuY3Rpb24gKCkge1xuICAgIGFyZWEucmVkcmF3KCk7XG4gICAgZG9udXQucmVkcmF3KCk7XG4gICAgbGluZS5yZWRyYXcoKTtcbiAgfSk7XG5cbiAgLyogVGhlIHRvZG8gbGlzdCBwbHVnaW4gKi9cbiAgJCgnLnRvZG8tbGlzdCcpLnRvZG9MaXN0KHtcbiAgICBvbkNoZWNrICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdpbmRvdy5jb25zb2xlLmxvZygkKHRoaXMpLCAnVGhlIGVsZW1lbnQgaGFzIGJlZW4gY2hlY2tlZCcpO1xuICAgIH0sXG4gICAgb25VbkNoZWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICB3aW5kb3cuY29uc29sZS5sb2coJCh0aGlzKSwgJ1RoZSBlbGVtZW50IGhhcyBiZWVuIHVuY2hlY2tlZCcpO1xuICAgIH1cbiAgfSk7XG5cbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vdmVuZG9yL2FsbWFzYWVlZDIwMTAvYWRtaW5sdGUvZGlzdC9qcy9wYWdlcy9kYXNoYm9hcmQuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///64\n");
+
+/***/ })
+/******/ ]); \ No newline at end of file
diff --git a/public/js/app.js b/public/js/app.js
index c6a97ee..0db9692 100755
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -60,35 +60,307 @@
/******/ __webpack_require__.p = "/";
/******/
/******/ // Load entry module and return exports
-/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ return __webpack_require__(__webpack_require__.s = 13);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
-__webpack_require__(1);
-__webpack_require__(2);
-module.exports = __webpack_require__(3);
-
+"use strict";
+eval("\n\nvar bind = __webpack_require__(8);\nvar isBuffer = __webpack_require__(23);\n\n/*global toString:true*/\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.replace(/^\\s*/, '').replace(/\\s*$/, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (typeof result[key] === 'object' && typeof val === 'object') {\n result[key] = merge(result[key], val);\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzPzcwNjEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQyxPQUFPO0FBQzFDO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTLEdBQUcsU0FBUztBQUM1QywyQkFBMkI7QUFDM0I7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQSx1Q0FBdUMsT0FBTztBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvYmluZCcpO1xudmFyIGlzQnVmZmVyID0gcmVxdWlyZSgnaXMtYnVmZmVyJyk7XG5cbi8qZ2xvYmFsIHRvU3RyaW5nOnRydWUqL1xuXG4vLyB1dGlscyBpcyBhIGxpYnJhcnkgb2YgZ2VuZXJpYyBoZWxwZXIgZnVuY3Rpb25zIG5vbi1zcGVjaWZpYyB0byBheGlvc1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXksIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5KHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBGb3JtRGF0YSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRm9ybURhdGEodmFsKSB7XG4gIHJldHVybiAodHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJykgJiYgKHZhbCBpbnN0YW5jZW9mIEZvcm1EYXRhKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyVmlldyh2YWwpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnKSAmJiAoQXJyYXlCdWZmZXIuaXNWaWV3KSkge1xuICAgIHJlc3VsdCA9IEFycmF5QnVmZmVyLmlzVmlldyh2YWwpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9ICh2YWwpICYmICh2YWwuYnVmZmVyKSAmJiAodmFsLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyaW5nXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJpbmcsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmluZyh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgTnVtYmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBOdW1iZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc051bWJlcih2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdudW1iZXInO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRGF0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRGF0ZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRmlsZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRmlsZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQmxvYiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQmxvYih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQmxvYl0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZ1bmN0aW9uLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyZWFtLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJlYW0odmFsKSB7XG4gIHJldHVybiBpc09iamVjdCh2YWwpICYmIGlzRnVuY3Rpb24odmFsLnBpcGUpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVVJMU2VhcmNoUGFyYW1zKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zO1xufVxuXG4vKipcbiAqIFRyaW0gZXhjZXNzIHdoaXRlc3BhY2Ugb2ZmIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIFN0cmluZyB0byB0cmltXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyovLCAnJykucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50XG4gKlxuICogVGhpcyBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlciwgYW5kIHJlYWN0LW5hdGl2ZS5cbiAqIEJvdGggZW52aXJvbm1lbnRzIHN1cHBvcnQgWE1MSHR0cFJlcXVlc3QsIGJ1dCBub3QgZnVsbHkgc3RhbmRhcmQgZ2xvYmFscy5cbiAqXG4gKiB3ZWIgd29ya2VyczpcbiAqICB0eXBlb2Ygd2luZG93IC0+IHVuZGVmaW5lZFxuICogIHR5cGVvZiBkb2N1bWVudCAtPiB1bmRlZmluZWRcbiAqXG4gKiByZWFjdC1uYXRpdmU6XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ1JlYWN0TmF0aXZlJ1xuICovXG5mdW5jdGlvbiBpc1N0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnXG4gICk7XG59XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFuIEFycmF5IG9yIGFuIE9iamVjdCBpbnZva2luZyBhIGZ1bmN0aW9uIGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgYG9iamAgaXMgYW4gQXJyYXkgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBpbmRleCwgYW5kIGNvbXBsZXRlIGFycmF5IGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgJ29iaicgaXMgYW4gT2JqZWN0IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwga2V5LCBhbmQgY29tcGxldGUgb2JqZWN0IGZvciBlYWNoIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBpdGVyYXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIGZvciBlYWNoIGl0ZW1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChvYmosIGZuKSB7XG4gIC8vIERvbid0IGJvdGhlciBpZiBubyB2YWx1ZSBwcm92aWRlZFxuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRm9yY2UgYW4gYXJyYXkgaWYgbm90IGFscmVhZHkgc29tZXRoaW5nIGl0ZXJhYmxlXG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIG9iaiA9IFtvYmpdO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBhcnJheSB2YWx1ZXNcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXNcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICBmbi5jYWxsKG51bGwsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlKC8qIG9iajEsIG9iajIsIG9iajMsIC4uLiAqLykge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGZ1bmN0aW9uIGFzc2lnblZhbHVlKHZhbCwga2V5KSB7XG4gICAgaWYgKHR5cGVvZiByZXN1bHRba2V5XSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2UocmVzdWx0W2tleV0sIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGZvckVhY2goYXJndW1lbnRzW2ldLCBhc3NpZ25WYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBhIGJ5IG11dGFibHkgYWRkaW5nIHRvIGl0IHRoZSBwcm9wZXJ0aWVzIG9mIG9iamVjdCBiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIFRoZSBvYmplY3QgdG8gYmluZCBmdW5jdGlvbiB0b1xuICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVzdWx0aW5nIHZhbHVlIG9mIG9iamVjdCBhXG4gKi9cbmZ1bmN0aW9uIGV4dGVuZChhLCBiLCB0aGlzQXJnKSB7XG4gIGZvckVhY2goYiwgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodGhpc0FyZyAmJiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhW2tleV0gPSBiaW5kKHZhbCwgdGhpc0FyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFba2V5XSA9IHZhbDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gYTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQXJyYXk6IGlzQXJyYXksXG4gIGlzQXJyYXlCdWZmZXI6IGlzQXJyYXlCdWZmZXIsXG4gIGlzQnVmZmVyOiBpc0J1ZmZlcixcbiAgaXNGb3JtRGF0YTogaXNGb3JtRGF0YSxcbiAgaXNBcnJheUJ1ZmZlclZpZXc6IGlzQXJyYXlCdWZmZXJWaWV3LFxuICBpc1N0cmluZzogaXNTdHJpbmcsXG4gIGlzTnVtYmVyOiBpc051bWJlcixcbiAgaXNPYmplY3Q6IGlzT2JqZWN0LFxuICBpc1VuZGVmaW5lZDogaXNVbmRlZmluZWQsXG4gIGlzRGF0ZTogaXNEYXRlLFxuICBpc0ZpbGU6IGlzRmlsZSxcbiAgaXNCbG9iOiBpc0Jsb2IsXG4gIGlzRnVuY3Rpb246IGlzRnVuY3Rpb24sXG4gIGlzU3RyZWFtOiBpc1N0cmVhbSxcbiAgaXNVUkxTZWFyY2hQYXJhbXM6IGlzVVJMU2VhcmNoUGFyYW1zLFxuICBpc1N0YW5kYXJkQnJvd3NlckVudjogaXNTdGFuZGFyZEJyb3dzZXJFbnYsXG4gIGZvckVhY2g6IGZvckVhY2gsXG4gIG1lcmdlOiBtZXJnZSxcbiAgZXh0ZW5kOiBleHRlbmQsXG4gIHRyaW06IHRyaW1cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvdXRpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///0\n");
/***/ }),
/* 1 */
-/***/ (function(module, exports) {
+/***/ (function(module, exports, __webpack_require__) {
-eval("throw new Error(\"Module build failed: Syntax Error \\n\\n(7:1) Unknown word\\n\\n \\u001b[90m 5 | \\u001b[39m\\u001b[90m */\\u001b[39m\\n \\u001b[90m 6 | \\u001b[39m\\n\\u001b[31m\\u001b[1m>\\u001b[22m\\u001b[39m\\u001b[90m 7 | \\u001b[39mwindow.openpgp = \\u001b[36mrequire\\u001b[39m\\u001b[36m(\\u001b[39m\\u001b[32m'openpgp'\\u001b[39m\\u001b[36m)\\u001b[39m\\u001b[33m;\\u001b[39m\\n \\u001b[90m | \\u001b[39m\\u001b[31m\\u001b[1m^\\u001b[22m\\u001b[39m\\n \\u001b[90m 8 | \\u001b[39mwindow.Vue = \\u001b[36mrequire\\u001b[39m\\u001b[36m(\\u001b[39m\\u001b[32m'vue'\\u001b[39m\\u001b[36m)\\u001b[39m\\u001b[33m;\\u001b[39m\\n \\u001b[90m 9 | \\u001b[39m\\u001b[36mrequire\\u001b[39m\\u001b[36m(\\u001b[39m\\u001b[32m'./bootstrap'\\u001b[39m\\u001b[36m)\\u001b[39m\\u001b[33m;\\u001b[39m\\n\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiIxLmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1\n");
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * jQuery JavaScript Library v3.3.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2018-01-20T17:24Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar document = window.document;\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n // Support: Chrome <=57, Firefox <=52\n // In some browsers, typeof returns \"function\" for HTML <object> elements\n // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n // We don't want to classify *any* DOM node as a function.\n return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, doc, node ) {\n\t\tdoc = doc || document;\n\n\t\tvar i,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\t\t\t\tif ( node[ i ] ) {\n\t\t\t\t\tscript[ i ] = node[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.3.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && Array.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\n\t\t/* eslint-disable no-unused-vars */\n\t\t// See https://github.com/eslint/eslint/issues/6125\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tDOMEval( code );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.3\n * https://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-08-08\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tdisabledAncestor = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && (\"form\" in elem || \"label\" in elem);\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = \"#\" + nid + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement(\"fieldset\");\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tdisabledAncestor( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( preferredDoc !== document &&\n\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( el ) {\n\t\tel.appendChild( document.createComment(\"\") );\n\t\treturn !el.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( (elem = elems[i++]) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( el ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( el ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn (sel + \"\").replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ key ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( el ) {\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( el ) {\n\treturn el.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n if ( nodeName( elem, \"iframe\" ) ) {\n return elem.contentDocument;\n }\n\n // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n // Treat the template element as a regular one in browsers that\n // don't support it.\n if ( nodeName( elem, \"template\" ) ) {\n elem = elem.content || elem;\n }\n\n return jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tjQuery.contains( elem.ownerDocument, elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE <=9 only\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE <=9 only\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, contains, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\nvar documentElement = document.documentElement;\n\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 only\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), doc, node );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1></$2>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = div.offsetWidth === 36 || \"absolute\";\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, #12537)\n\t// .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style;\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a property mapped along what jQuery.cssProps suggests or to\n// a vendor prefixed property.\nfunction finalPropName( name ) {\n\tvar ret = jQuery.cssProps[ name ];\n\tif ( !ret ) {\n\t\tret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;\n\t}\n\treturn ret;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\t\t) );\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\t\tval = curCSS( elem, dimension, styles ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox;\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\t// Check for style in case a browser which returns unreliable values\n\t// for getComputedStyle silently falls back to the reliable elem.style\n\tvalueIsBorderBox = valueIsBorderBox &&\n\t\t( support.boxSizingReliable() || val === elem.style[ dimension ] );\n\n\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t// This happens for inline elements with no explicit setting (gh-3571)\n\t// Support: Android <=4.1 - 4.3 only\n\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\tif ( val === \"auto\" ||\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) {\n\n\t\tval = elem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];\n\n\t\t// offsetWidth/offsetHeight provide border-box values\n\t\tvalueIsBorderBox = true;\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\tif ( type === \"number\" ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\t\t\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra && boxModelAdjustment(\n\t\t\t\t\telem,\n\t\t\t\t\tdimension,\n\t\t\t\t\textra,\n\t\t\t\t\tisBorderBox,\n\t\t\t\t\tstyles\n\t\t\t\t);\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && support.scrollboxSize() === styles.position ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 &&\n\t\t\t\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = Date.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce++ ) + uncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" ).prop( {\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t} ).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t// documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t}\n} );\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( true ) {\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n\t\treturn jQuery;\n\t}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzP2VlZGYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsWUFBWTs7QUFFcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGLG9CQUFvQjs7QUFFcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsWUFBWTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUyxTQUFTO0FBQ2xCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUyxZQUFZO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVSxZQUFZO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFNBQVM7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQSxnQkFBZ0IsSUFBSTs7QUFFcEI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDLElBQUk7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLFVBQVU7QUFDM0Usc0NBQXNDLDJCQUEyQjtBQUNqRTtBQUNBLGdDQUFnQyxNQUFNO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLFVBQVUsWUFBWTtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxVQUFVLFlBQVk7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsVUFBVSxVQUFVO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLFVBQVUsY0FBYztBQUN4QjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFlBQVksdUVBQXVFO0FBQ25GO0FBQ0E7QUFDQSxZQUFZLDRCQUE0QjtBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLFNBQVM7QUFDakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBLFFBQVEsR0FBRztBQUNYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBOzs7O0FBSUE7O0FBRUE7O0FBRUE7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQixTQUFTO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBOztBQUVBLGNBQWMsU0FBUztBQUN2QjtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsT0FBTztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxPQUFPO0FBQ2pCLDBCQUEwQix3QkFBd0I7O0FBRWxEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsY0FBYztBQUN4QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHdDQUF3QyxzQ0FBc0M7QUFDOUUsb0NBQW9DLHVDQUF1QztBQUMzRSxvQ0FBb0Msc0NBQXNDO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsT0FBTztBQUNQO0FBQ0EsTUFBTTtBQUNOLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXOztBQUVYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7O0FBRVY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0M7QUFDcEMscUNBQXFDO0FBQ3JDLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7OztBQUtBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVUsU0FBUztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLGFBQWE7QUFDcEMsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTs7O0FBR0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVEsZ0JBQWdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7QUFDRDs7QUFFQTs7QUFFQTs7OztBQUlBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsRUFBRTtBQUNGOztBQUVBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLE9BQU87QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0Esc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxPQUFPO0FBQ2Y7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsZ0JBQWdCO0FBQ2xCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXOztBQUVYOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDs7QUFFQTtBQUNBOztBQUVBLGNBQWMsc0JBQXNCO0FBQ3BDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwrREFBK0Q7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLGNBQWM7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsbUJBQW1CO0FBQ3BDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdUNBQXVDO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix1REFBdUQ7QUFDOUU7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQyxjQUFjO0FBQ25EO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOzs7QUFHRDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkMsT0FBTztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVSxPQUFPO0FBQ2pCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLGdCQUFnQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsK0JBQStCO0FBQ3ZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1Q0FBdUMsT0FBTztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0MsT0FBTztBQUMvQztBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMscUNBQXFDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUEsU0FBUyw4QkFBOEI7QUFDdkM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFlBQVksT0FBTztBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVztBQUNwQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7QUFJQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDLGNBQWMsV0FBVztBQUN4RSxtQkFBbUIsVUFBVTtBQUM3QjtBQUNBLHNCQUFzQixjQUFjLHNCQUFzQixnQkFBZ0I7QUFDMUUsZ0JBQWdCLFdBQVcsWUFBWTtBQUN2QyxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRixDQUFDOzs7QUFHRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLCtEQUErRDtBQUMzRTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsT0FBTzs7QUFFZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUEsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTs7QUFFQSxVQUFVLE9BQU87QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQSxRQUFRLE9BQU87QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0JBQWdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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R0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7QUFLRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBLGlDQUFpQztBQUNqQztBQUNBOztBQUVBLElBQUk7QUFDSjs7QUFFQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFNBQVM7QUFDcEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7O0FBS0Q7OztBQUdBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBOztBQUVBOztBQUVBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEyQztBQUMzQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsS0FBSztBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUscUNBQXFDOztBQUVwRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBOztBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLEtBQUs7QUFDTDs7QUFFQSxXQUFXO0FBQ1gsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCO0FBQ2pCLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBLHNCQUFzQjtBQUN0QiwyQkFBMkI7O0FBRTNCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLElBQUk7QUFDSjtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHlCQUF5QjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7QUFLRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7QUFLRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLElBQUk7QUFDSixHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHFEQUFxRDtBQUNyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxzREFBc0Q7QUFDcEU7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUk7QUFDSjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQSxjQUFjLG1DQUFtQztBQUNqRCxlQUFlLDZEQUE2RDtBQUM1RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsRUFBRTtBQUNGLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUFBO0FBQ0Y7Ozs7O0FBS0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBLENBQUMiLCJmaWxlIjoiMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My4zLjFcbiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHBzOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WlxuICovXG4oIGZ1bmN0aW9uKCBnbG9iYWwsIGZhY3RvcnkgKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0aWYgKCB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2Bcblx0XHQvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LlxuXHRcdC8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgXG5cdFx0Ly8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuXG5cdFx0Ly8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC5cblx0XHQvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpKHdpbmRvdyk7XG5cdFx0Ly8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG5cdFx0XHRmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6XG5cdFx0XHRmdW5jdGlvbiggdyApIHtcblx0XHRcdFx0aWYgKCAhdy5kb2N1bWVudCApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoIHcgKTtcblx0XHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeSggZ2xvYmFsICk7XG5cdH1cblxuLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXRcbn0gKSggdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkge1xuXG4vLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjFcbi8vIHRocm93IGV4Y2VwdGlvbnMgd2hlbiBub24tc3RyaWN0IGNvZGUgKGUuZy4sIEFTUC5ORVQgNC41KSBhY2Nlc3NlcyBzdHJpY3QgbW9kZVxuLy8gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIgKHRyYWMtMTMzMzUpLiBCdXQgYXMgb2YgalF1ZXJ5IDMuMCAoMjAxNiksIHN0cmljdCBtb2RlIHNob3VsZCBiZSBjb21tb25cbi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLlxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnIgPSBbXTtcblxudmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cbnZhciBzbGljZSA9IGFyci5zbGljZTtcblxudmFyIGNvbmNhdCA9IGFyci5jb25jYXQ7XG5cbnZhciBwdXNoID0gYXJyLnB1c2g7XG5cbnZhciBpbmRleE9mID0gYXJyLmluZGV4T2Y7XG5cbnZhciBjbGFzczJ0eXBlID0ge307XG5cbnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG5cbnZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgZm5Ub1N0cmluZyA9IGhhc093bi50b1N0cmluZztcblxudmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTtcblxudmFyIHN1cHBvcnQgPSB7fTtcblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKCBvYmogKSB7XG5cbiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTJcbiAgICAgIC8vIEluIHNvbWUgYnJvd3NlcnMsIHR5cGVvZiByZXR1cm5zIFwiZnVuY3Rpb25cIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50c1xuICAgICAgLy8gKGkuZS4sIGB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvYmplY3RcIiApID09PSBcImZ1bmN0aW9uXCJgKS5cbiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi5cbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gXCJudW1iZXJcIjtcbiAgfTtcblxuXG52YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkge1xuXHRcdHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG5cdH07XG5cblxuXG5cblx0dmFyIHByZXNlcnZlZFNjcmlwdEF0dHJpYnV0ZXMgPSB7XG5cdFx0dHlwZTogdHJ1ZSxcblx0XHRzcmM6IHRydWUsXG5cdFx0bm9Nb2R1bGU6IHRydWVcblx0fTtcblxuXHRmdW5jdGlvbiBET01FdmFsKCBjb2RlLCBkb2MsIG5vZGUgKSB7XG5cdFx0ZG9jID0gZG9jIHx8IGRvY3VtZW50O1xuXG5cdFx0dmFyIGksXG5cdFx0XHRzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXG5cdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdGlmICggbm9kZSApIHtcblx0XHRcdGZvciAoIGkgaW4gcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyApIHtcblx0XHRcdFx0aWYgKCBub2RlWyBpIF0gKSB7XG5cdFx0XHRcdFx0c2NyaXB0WyBpIF0gPSBub2RlWyBpIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApO1xuXHR9XG5cblxuZnVuY3Rpb24gdG9UeXBlKCBvYmogKSB7XG5cdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0cmV0dXJuIG9iaiArIFwiXCI7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiID9cblx0XHRjbGFzczJ0eXBlWyB0b1N0cmluZy5jYWxsKCBvYmogKSBdIHx8IFwib2JqZWN0XCIgOlxuXHRcdHR5cGVvZiBvYmo7XG59XG4vKiBnbG9iYWwgU3ltYm9sICovXG4vLyBEZWZpbmluZyB0aGlzIGdsb2JhbCBpbiAuZXNsaW50cmMuanNvbiB3b3VsZCBjcmVhdGUgYSBkYW5nZXIgb2YgdXNpbmcgdGhlIGdsb2JhbFxuLy8gdW5ndWFyZGVkIGluIGFub3RoZXIgcGxhY2UsIGl0IHNlZW1zIHNhZmVyIHRvIGRlZmluZSBnbG9iYWwgb25seSBmb3IgdGhpcyBtb2R1bGVcblxuXG5cbnZhclxuXHR2ZXJzaW9uID0gXCIzLjMuMVwiLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblxuXHRcdC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJ1xuXHRcdC8vIE5lZWQgaW5pdCBpZiBqUXVlcnkgaXMgY2FsbGVkIChqdXN0IGFsbG93IGVycm9yIHRvIGJlIHRocm93biBpZiBub3QgaW5jbHVkZWQpXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG5cdHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nO1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXG5cdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdGlmICggbnVtID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRyZXR1cm4gbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXTtcblx0fSxcblxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXG5cdC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KVxuXHRwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5cdFx0dmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApO1xuXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcblx0XHRyZXQucHJldk9iamVjdCA9IHRoaXM7XG5cblx0XHQvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldFxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2sgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzWyBqIF0gXSA6IFtdICk7XG5cdH0sXG5cblx0ZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IoKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHQvLyBFeHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcblx0aWYgKCBpID09PSBsZW5ndGggKSB7XG5cdFx0dGFyZ2V0ID0gdGhpcztcblx0XHRpLS07XG5cdH1cblxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblxuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAoICggb3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdICkgIT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggdGFyZ2V0ID09PSBjb3B5ICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdGlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvcHkgKSB8fFxuXHRcdFx0XHRcdCggY29weUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KCBjb3B5ICkgKSApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSApIHtcblx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBBcnJheS5pc0FycmF5KCBzcmMgKSA/IHNyYyA6IFtdO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIHByb3RvLCBDdG9yO1xuXG5cdFx0Ly8gRGV0ZWN0IG9idmlvdXMgbmVnYXRpdmVzXG5cdFx0Ly8gVXNlIHRvU3RyaW5nIGluc3RlYWQgb2YgalF1ZXJ5LnR5cGUgdG8gY2F0Y2ggaG9zdCBvYmplY3RzXG5cdFx0aWYgKCAhb2JqIHx8IHRvU3RyaW5nLmNhbGwoIG9iaiApICE9PSBcIltvYmplY3QgT2JqZWN0XVwiICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHByb3RvID0gZ2V0UHJvdG8oIG9iaiApO1xuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIG5vIHByb3RvdHlwZSAoZS5nLiwgYE9iamVjdC5jcmVhdGUoIG51bGwgKWApIGFyZSBwbGFpblxuXHRcdGlmICggIXByb3RvICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb25cblx0XHRDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCBcImNvbnN0cnVjdG9yXCIgKSAmJiBwcm90by5jb25zdHJ1Y3Rvcjtcblx0XHRyZXR1cm4gdHlwZW9mIEN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBmblRvU3RyaW5nLmNhbGwoIEN0b3IgKSA9PT0gT2JqZWN0RnVuY3Rpb25TdHJpbmc7XG5cdH0sXG5cblx0aXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblxuXHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5cdFx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy82MTI1XG5cdFx0dmFyIG5hbWU7XG5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0Ly8gRXZhbHVhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHRcblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUgKSB7XG5cdFx0RE9NRXZhbCggY29kZSApO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkge1xuXHRcdHZhciBsZW5ndGgsIGkgPSAwO1xuXG5cdFx0aWYgKCBpc0FycmF5TGlrZSggb2JqICkgKSB7XG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gb2JqICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvYmo7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5XG5cdHRyaW06IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFx0XCJcIiA6XG5cdFx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFsgYXJyIF0gOiBhcnJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guY2FsbCggcmV0LCBhcnIgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7XG5cdFx0cmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdG1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHtcblx0XHR2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsXG5cdFx0XHRqID0gMCxcblx0XHRcdGkgPSBmaXJzdC5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdGZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdO1xuXHRcdH1cblxuXHRcdGZpcnN0Lmxlbmd0aCA9IGk7XG5cblx0XHRyZXR1cm4gZmlyc3Q7XG5cdH0sXG5cblx0Z3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkge1xuXHRcdHZhciBjYWxsYmFja0ludmVyc2UsXG5cdFx0XHRtYXRjaGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aCxcblx0XHRcdGNhbGxiYWNrRXhwZWN0ID0gIWludmVydDtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXNcblx0XHQvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvblxuXHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0Y2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7XG5cdFx0XHRpZiAoIGNhbGxiYWNrSW52ZXJzZSAhPT0gY2FsbGJhY2tFeHBlY3QgKSB7XG5cdFx0XHRcdG1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVzO1xuXHR9LFxuXG5cdC8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHtcblx0XHR2YXIgbGVuZ3RoLCB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7XG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIGVsZW1zICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0cmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApO1xuXHR9LFxuXG5cdC8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0c1xuXHRndWlkOiAxLFxuXG5cdC8vIGpRdWVyeS5zdXBwb3J0IGlzIG5vdCB1c2VkIGluIENvcmUgYnV0IG90aGVyIHByb2plY3RzIGF0dGFjaCB0aGVpclxuXHQvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LlxuXHRzdXBwb3J0OiBzdXBwb3J0XG59ICk7XG5cbmlmICggdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTtcbn1cblxuLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwXG5qUXVlcnkuZWFjaCggXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbFwiLnNwbGl0KCBcIiBcIiApLFxuZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xufSApO1xuXG5mdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcilcblx0Ly8gYGluYCBjaGVjayB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0yMTQ1KVxuXHQvLyBoYXNPd24gaXNuJ3QgdXNlZCBoZXJlIGR1ZSB0byBmYWxzZSBuZWdhdGl2ZXNcblx0Ly8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRVxuXHR2YXIgbGVuZ3RoID0gISFvYmogJiYgXCJsZW5ndGhcIiBpbiBvYmogJiYgb2JqLmxlbmd0aCxcblx0XHR0eXBlID0gdG9UeXBlKCBvYmogKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIG9iaiApIHx8IGlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy4zXG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNi0wOC0wOFxuICovXG4oZnVuY3Rpb24oIHdpbmRvdyApIHtcblxudmFyIGksXG5cdHN1cHBvcnQsXG5cdEV4cHIsXG5cdGdldFRleHQsXG5cdGlzWE1MLFxuXHR0b2tlbml6ZSxcblx0Y29tcGlsZSxcblx0c2VsZWN0LFxuXHRvdXRlcm1vc3RDb250ZXh0LFxuXHRzb3J0SW5wdXQsXG5cdGhhc0R1cGxpY2F0ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdHNldERvY3VtZW50LFxuXHRkb2N1bWVudCxcblx0ZG9jRWxlbSxcblx0ZG9jdW1lbnRJc0hUTUwsXG5cdHJidWdneVFTQSxcblx0cmJ1Z2d5TWF0Y2hlcyxcblx0bWF0Y2hlcyxcblx0Y29udGFpbnMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0gXCJzaXp6bGVcIiArIDEgKiBuZXcgRGF0ZSgpLFxuXHRwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0c29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIDA7XG5cdH0sXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaF9uYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS90aG9yLWluZGV4b2YtdnMtZm9yLzVcblx0aW5kZXhPZiA9IGZ1bmN0aW9uKCBsaXN0LCBlbGVtICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdGxlbiA9IGxpc3QubGVuZ3RoO1xuXHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0aWYgKCBsaXN0W2ldID09PSBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllclxuXHRpZGVudGlmaWVyID0gXCIoPzpcXFxcXFxcXC58W1xcXFx3LV18W15cXDAtXFxcXHhhMF0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHRhdHRyaWJ1dGVzID0gXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XFxcXCgoXCIgK1xuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIHdoaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXG5cdHJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCBcIj1cIiArIHdoaXRlc3BhY2UgKyBcIiooW15cXFxcXSdcXFwiXSo/KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsIFwiZ1wiICksXG5cblx0cnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSxcblx0cmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCBcIl5cIiArIGlkZW50aWZpZXIgKyBcIiRcIiApLFxuXG5cdG1hdGNoRXhwciA9IHtcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIkNMQVNTXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFwuKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJUQUdcIjogbmV3IFJlZ0V4cCggXCJeKFwiICsgaWRlbnRpZmllciArIFwifFsqXSlcIiApLFxuXHRcdFwiQVRUUlwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRcIlBTRVVET1wiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIiArIHdoaXRlc3BhY2UgKyBcIiooPzooWystXXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdFwiYm9vbFwiOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxuXHRcdC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGBcblx0XHRcIm5lZWRzQ29udGV4dFwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKigoPzotXFxcXGQpP1xcXFxkKilcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpKD89W14tXXwkKVwiLCBcImlcIiApXG5cdH0sXG5cblx0cmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJoZWFkZXIgPSAvXmhcXGQkL2ksXG5cblx0cm5hdGl2ZSA9IC9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXG5cblx0Ly8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzXG5cdHJxdWlja0V4cHIgPSAvXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxcblxuXHRyc2libGluZyA9IC9bK35dLyxcblxuXHQvLyBDU1MgZXNjYXBlc1xuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFwoW1xcXFxkYS1mXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICsgXCI/fChcIiArIHdoaXRlc3BhY2UgKyBcIil8LilcIiwgXCJpZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2NhcGVkV2hpdGVzcGFjZSApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHRcdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyNFxuXHRcdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRcdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRcdGVzY2FwZWQgOlxuXHRcdFx0aGlnaCA8IDAgP1xuXHRcdFx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG5cdH0sXG5cblx0Ly8gQ1NTIHN0cmluZy9pZGVudGlmaWVyIHNlcmlhbGl6YXRpb25cblx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNjb21tb24tc2VyaWFsaXppbmctaWRpb21zXG5cdHJjc3Nlc2NhcGUgPSAvKFtcXDAtXFx4MWZcXHg3Zl18Xi0/XFxkKXxeLSR8W15cXDAtXFx4MWZcXHg3Zi1cXHVGRkZGXFx3LV0vZyxcblx0ZmNzc2VzY2FwZSA9IGZ1bmN0aW9uKCBjaCwgYXNDb2RlUG9pbnQgKSB7XG5cdFx0aWYgKCBhc0NvZGVQb2ludCApIHtcblxuXHRcdFx0Ly8gVSswMDAwIE5VTEwgYmVjb21lcyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSXG5cdFx0XHRpZiAoIGNoID09PSBcIlxcMFwiICkge1xuXHRcdFx0XHRyZXR1cm4gXCJcXHVGRkZEXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnRyb2wgY2hhcmFjdGVycyBhbmQgKGRlcGVuZGVudCB1cG9uIHBvc2l0aW9uKSBudW1iZXJzIGdldCBlc2NhcGVkIGFzIGNvZGUgcG9pbnRzXG5cdFx0XHRyZXR1cm4gY2guc2xpY2UoIDAsIC0xICkgKyBcIlxcXFxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArIFwiIFwiO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWRcblx0XHRyZXR1cm4gXCJcXFxcXCIgKyBjaDtcblx0fSxcblxuXHQvLyBVc2VkIGZvciBpZnJhbWVzXG5cdC8vIFNlZSBzZXREb2N1bWVudCgpXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRVxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fSxcblxuXHRkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcihcblx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlICYmIChcImZvcm1cIiBpbiBlbGVtIHx8IFwibGFiZWxcIiBpbiBlbGVtKTtcblx0XHR9LFxuXHRcdHsgZGlyOiBcInBhcmVudE5vZGVcIiwgbmV4dDogXCJsZWdlbmRcIiB9XG5cdCk7XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXG5cdFx0aWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHtcblx0XHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0fVxuXHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdFx0Ly8gSWYgdGhlIHNlbGVjdG9yIGlzIHN1ZmZpY2llbnRseSBzaW1wbGUsIHRyeSB1c2luZyBhIFwiZ2V0KkJ5KlwiIERPTSBtZXRob2Rcblx0XHRcdC8vIChleGNlcHRpbmcgRG9jdW1lbnRGcmFnbWVudCBjb250ZXh0LCB3aGVyZSB0aGUgbWV0aG9kcyBkb24ndCBleGlzdClcblx0XHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmIChtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0Ly8gSUQgc2VsZWN0b3Jcblx0XHRcdFx0aWYgKCAobSA9IG1hdGNoWzFdKSApIHtcblxuXHRcdFx0XHRcdC8vIERvY3VtZW50IGNvbnRleHRcblx0XHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnNcblx0XHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0XHRpZiAoIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRWxlbWVudCBjb250ZXh0XG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHRcdC8vIENsYXNzIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJlxuXHRcdFx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0aWYgKCBzdXBwb3J0LnFzYSAmJlxuXHRcdFx0XHQhY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdICYmXG5cdFx0XHRcdCghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gY29udGV4dDtcblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IHNlbGVjdG9yO1xuXG5cdFx0XHRcdC8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudFxuXHRcdFx0XHQvLyBUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhpcyB3b3JrYXJvdW5kIHRlY2huaXF1ZVxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PThcblx0XHRcdFx0Ly8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHNcblx0XHRcdFx0fSBlbHNlIGlmICggY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2FwdHVyZSB0aGUgY29udGV4dCBJRCwgc2V0dGluZyBpdCBmaXJzdCBpZiBuZWNlc3Nhcnlcblx0XHRcdFx0XHRpZiAoIChuaWQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggXCJpZFwiICkpICkge1xuXHRcdFx0XHRcdFx0bmlkID0gbmlkLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgKG5pZCA9IGV4cGFuZG8pICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0XG5cdFx0XHRcdFx0Z3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0XHRcdFx0aSA9IGdyb3Vwcy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRncm91cHNbaV0gPSBcIiNcIiArIG5pZCArIFwiIFwiICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIFwiLFwiICk7XG5cblx0XHRcdFx0XHQvLyBFeHBhbmQgY29udGV4dCBmb3Igc2libGluZyBzZWxlY3RvcnNcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHxcblx0XHRcdFx0XHRcdGNvbnRleHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIG5ld1NlbGVjdG9yICkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0XHRuZXdDb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIG5ld1NlbGVjdG9yIClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9IGNhdGNoICggcXNhRXJyb3IgKSB7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdGlmICggbmlkID09PSBleHBhbmRvICkge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cdFx0Ly8gVXNlIChrZXkgKyBcIiBcIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChzZWUgSXNzdWUgIzE1Nylcblx0XHRpZiAoIGtleXMucHVzaCgga2V5ICsgXCIgXCIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoY2FjaGVbIGtleSArIFwiIFwiIF0gPSB2YWx1ZSk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBlbCApO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGZpbmFsbHkge1xuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXHRcdC8vIHJlbGVhc2UgbWVtb3J5IGluIElFXG5cdFx0ZWwgPSBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRyc1xuICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkXG4gKi9cbmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7XG5cdHZhciBhcnIgPSBhdHRycy5zcGxpdChcInxcIiksXG5cdFx0aSA9IGFyci5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0RXhwci5hdHRySGFuZGxlWyBhcnJbaV0gXSA9IGhhbmRsZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYlxuICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiXG4gKi9cbmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHtcblx0dmFyIGN1ciA9IGIgJiYgYSxcblx0XHRkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0YS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7XG5cdFx0XHRpZiAoIGN1ciA9PT0gYiApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID8gMSA6IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciA6ZW5hYmxlZC86ZGlzYWJsZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGRpc2FibGVkICkge1xuXG5cdC8vIEtub3duIDpkaXNhYmxlZCBmYWxzZSBwb3NpdGl2ZXM6IGZpZWxkc2V0W2Rpc2FibGVkXSA+IGxlZ2VuZDpudGgtb2YtdHlwZShuKzIpIDpjYW4tZGlzYWJsZVxuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBPbmx5IGNlcnRhaW4gZWxlbWVudHMgY2FuIG1hdGNoIDplbmFibGVkIG9yIDpkaXNhYmxlZFxuXHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NjcmlwdGluZy5odG1sI3NlbGVjdG9yLWVuYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1kaXNhYmxlZFxuXHRcdGlmICggXCJmb3JtXCIgaW4gZWxlbSApIHtcblxuXHRcdFx0Ly8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOlxuXHRcdFx0Ly8gKiBsaXN0ZWQgZm9ybS1hc3NvY2lhdGVkIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgZmllbGRzZXRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjYXRlZ29yeS1saXN0ZWRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkXG5cdFx0XHQvLyAqIG9wdGlvbiBlbGVtZW50cyBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1vcHRpb24tZGlzYWJsZWRcblx0XHRcdC8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSBcImZvcm1cIiBwcm9wZXJ0eS5cblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50XG5cdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRcdFx0aWYgKCBcImxhYmVsXCIgaW4gZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0ucGFyZW50Tm9kZS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA2IC0gMTFcblx0XHRcdFx0Ly8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnNcblx0XHRcdFx0cmV0dXJuIGVsZW0uaXNEaXNhYmxlZCA9PT0gZGlzYWJsZWQgfHxcblxuXHRcdFx0XHRcdC8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5XG5cdFx0XHRcdFx0LyoganNoaW50IC1XMDE4ICovXG5cdFx0XHRcdFx0ZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRcdGRpc2FibGVkQW5jZXN0b3IoIGVsZW0gKSA9PT0gZGlzYWJsZWQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblxuXHRcdC8vIFRyeSB0byB3aW5ub3cgb3V0IGVsZW1lbnRzIHRoYXQgY2FuJ3QgYmUgZGlzYWJsZWQgYmVmb3JlIHRydXN0aW5nIHRoZSBkaXNhYmxlZCBwcm9wZXJ0eS5cblx0XHQvLyBTb21lIHZpY3RpbXMgZ2V0IGNhdWdodCBpbiBvdXIgbmV0IChsYWJlbCwgbGVnZW5kLCBtZW51LCB0cmFjayksIGJ1dCBpdCBzaG91bGRuJ3Rcblx0XHQvLyBldmVuIGV4aXN0IG9uIHRoZW0sIGxldCBhbG9uZSBoYXZlIGEgYm9vbGVhbiB2YWx1ZS5cblx0XHR9IGVsc2UgaWYgKCBcImxhYmVsXCIgaW4gZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHR9XG5cblx0XHQvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZFxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHtcblx0XHRcdFx0XHRzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0XG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxuXHR2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gXCJIVE1MXCIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5LTExLCBFZGdlXG5cdC8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNilcblx0aWYgKCBwcmVmZXJyZWREb2MgIT09IGRvY3VtZW50ICYmXG5cdFx0KHN1YldpbmRvdyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3KSAmJiBzdWJXaW5kb3cudG9wICE9PSBzdWJXaW5kb3cgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSwgRWRnZVxuXHRcdGlmICggc3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5XG5cdFx0fSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0c3ViV2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBBdHRyaWJ1dGVzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBTdXBwb3J0OiBJRTw4XG5cdC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllc1xuXHQvLyAoZXhjZXB0aW5nIElFOCBib29sZWFucylcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZShcImNsYXNzTmFtZVwiKTtcblx0fSk7XG5cblx0LyogZ2V0RWxlbWVudChzKUJ5KlxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIHJldHVybnMgb25seSBlbGVtZW50c1xuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIlwiKSApO1xuXHRcdHJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaWQgPSBleHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBJRCBmaWx0ZXIgYW5kIGZpbmRcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDcgb25seVxuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRFeHByLmZpbmRbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBub2RlLCBpLCBlbGVtcyxcblx0XHRcdFx0XHRlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHQvLyBWZXJpZnkgdGhlIGlkIGF0dHJpYnV0ZVxuXHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRmFsbCBiYWNrIG9uIGdldEVsZW1lbnRzQnlOYW1lXG5cdFx0XHRcdFx0ZWxlbXMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBpZCApO1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtc1tpKytdKSApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZFtcIlRBR1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgP1xuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgZG9uJ3QgaGF2ZSBnRUJUTlxuXHRcdFx0fSBlbHNlIGlmICggc3VwcG9ydC5xc2EgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyApO1xuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHR0bXAgPSBbXSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdC8vIEJ5IGhhcHB5IGNvaW5jaWRlbmNlLCBhIChicm9rZW4pIGdFQlROIGFwcGVhcnMgb24gRG9jdW1lbnRGcmFnbWVudCBub2RlcyB0b29cblx0XHRcdFx0cmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzXG5cdFx0XHRpZiAoIHRhZyA9PT0gXCIqXCIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdHRtcC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRtcDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdH07XG5cblx0Ly8gQ2xhc3Ncblx0RXhwci5maW5kW1wiQ0xBU1NcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHtcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4XG5cdHJidWdneVFTQSA9IFtdO1xuXG5cdGlmICggKHN1cHBvcnQucXNhID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxyXFxcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbChcIltzZWxlY3RlZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OnZhbHVlfFwiICsgYm9vbGVhbnMgKyBcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWU8MjksIEFuZHJvaWQ8NC40LCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuOCtcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6Y2hlY2tlZFwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiOmNoZWNrZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4KywgaU9TIDgrXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2ODUxXG5cdFx0XHQvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIi4jLitbK35dXCIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdGVsLmlubmVySFRNTCA9IFwiPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHNcblx0XHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdFx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIltuYW1lPWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwibmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKlsqXiR8IX5dPz1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdFx0XHQvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHNcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKFwiOmRpc2FibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZWwucXVlcnlTZWxlY3RvckFsbChcIiosOnhcIik7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaChcIiwuKjpcIik7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHxcblx0XHRkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZWwsIFwiKlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZWwsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKFwifFwiKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgc2VsZi1leGNsdXNpdmVcblx0Ly8gQXMgaW4sIGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGZcblx0Y29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID9cblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXG5cdFx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xuXHRcdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cdFx0XHRcdGFkb3duLmNvbnRhaW5zID9cblx0XHRcdFx0XHRhZG93bi5jb250YWlucyggYnVwICkgOlxuXHRcdFx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNlxuXHRcdFx0KSk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHRpZiAoIGIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkge1xuXHRcdFx0XHRcdGlmICggYiA9PT0gYSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBoYXNDb21wYXJlID9cblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG5cdFx0dmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO1xuXHRcdGlmICggY29tcGFyZSApIHtcblx0XHRcdHJldHVybiBjb21wYXJlO1xuXHRcdH1cblxuXHRcdC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnRcblx0XHRjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkge1xuXG5cdFx0XHQvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnRcblx0XHRcdGlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBiID09PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cdFx0XHRyZXR1cm4gYSA9PT0gZG9jdW1lbnQgPyAtMSA6XG5cdFx0XHRcdGIgPT09IGRvY3VtZW50ID8gMSA6XG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHRhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkXG5cdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0IWNvbXBpbGVyQ2FjaGVbIGV4cHIgKyBcIiBcIiBdICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblx0XHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHt9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVzY2FwZSA9IGZ1bmN0aW9uKCBzZWwgKSB7XG5cdHJldHVybiAoc2VsICsgXCJcIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7XG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbMl0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbM10gPSBcIiBcIiArIG1hdGNoWzNdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbMV0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09IFwiZXZlblwiIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbNV0gPSArKCAoIG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByW1wiQ0hJTERcIl0udGVzdCggbWF0Y2hbMF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRtYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJlxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSkgJiZcblx0XHRcdFx0Y2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiApO1xuXHRcdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGUsXG5cdFx0XHRcdFx0XHRkaWZmID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU2VlayBgZWxlbWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRub2RlID0gcGFyZW50O1xuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4ICYmIGNhY2hlWyAyIF07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBVc2UgcHJldmlvdXNseS1jYWNoZWQgZWxlbWVudCBpbmRleCBpZiBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4O1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8geG1sIDpudGgtY2hpbGQoLi4uKVxuXHRcdFx0XHRcdFx0XHQvLyBvciA6bnRoLWxhc3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pXG5cdFx0XHRcdFx0XHRcdGlmICggZGlmZiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7XG5cdFx0XHQvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmVcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXNcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXG5cdFx0XHQvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zXG5cdFx0XHR2YXIgYXJncyxcblx0XHRcdFx0Zm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIFNpenpsZSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaWR4LFxuXHRcdFx0XHRcdFx0XHRtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50ICksXG5cdFx0XHRcdFx0XHRcdGkgPSBtYXRjaGVkLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZuO1xuXHRcdH1cblx0fSxcblxuXHRwc2V1ZG9zOiB7XG5cdFx0Ly8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zXG5cdFx0XCJub3RcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0XHRcdHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSxcblx0XHRcdFx0XHRcdGkgPSBzZWVkLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmBcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxlbSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBlbGVtO1xuXHRcdFx0XHRcdG1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTtcblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0XHRcdGlucHV0WzBdID0gbnVsbDtcblx0XHRcdFx0XHRyZXR1cm4gIXJlc3VsdHMucG9wKCk7XG5cdFx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImhhc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJjb250YWluc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIFwiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvclxuXHRcdC8vIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlXG5cdFx0Ly8gYmVpbmcgZXF1YWwgdG8gdGhlIGlkZW50aWZpZXIgQyxcblx0XHQvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwiLVwiLlxuXHRcdC8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHRcdC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuXCJcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvXG5cdFx0XCJsYW5nXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7XG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KGxhbmcgfHwgXCJcIikgKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRcdFx0XHRlbGVtLmxhbmcgOlxuXHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImxhbmdcIikpICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHRcInRhcmdldFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRcdFx0cmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkO1xuXHRcdH0sXG5cblx0XHRcInJvb3RcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTtcblx0XHR9LFxuXG5cdFx0XCJmb2N1c1wiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmICghZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSkgJiYgISEoZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCk7XG5cdFx0fSxcblxuXHRcdC8vIEJvb2xlYW4gcHJvcGVydGllc1xuXHRcdFwiZW5hYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZmFsc2UgKSxcblx0XHRcImRpc2FibGVkXCI6IGNyZWF0ZURpc2FibGVkUHNldWRvKCB0cnVlICksXG5cblx0XHRcImNoZWNrZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gKG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0gXCJvcHRpb25cIiAmJiAhIWVsZW0uc2VsZWN0ZWQpO1xuXHRcdH0sXG5cblx0XHRcInNlbGVjdGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdFxuXHRcdFx0Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseVxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly8gQ29udGVudHNcblx0XHRcImVtcHR5XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRcInBhcmVudFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAhRXhwci5wc2V1ZG9zW1wiZW1wdHlcIl0oIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdFwiaGVhZGVyXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImlucHV0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImJ1dHRvblwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFwiYnV0dG9uXCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIjtcblx0XHR9LFxuXG5cdFx0XCJ0ZXh0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiZcblx0XHRcdFx0ZWxlbS50eXBlID09PSBcInRleHRcIiAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDhcblx0XHRcdFx0Ly8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sIFwic2VhcmNoXCIpIGFwcGVhciB3aXRoIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0KCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiICk7XG5cdFx0fSxcblxuXHRcdC8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb25cblx0XHRcImZpcnN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gWyAwIF07XG5cdFx0fSksXG5cblx0XHRcImxhc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gWyBsZW5ndGggLSAxIF07XG5cdFx0fSksXG5cblx0XHRcImVxXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9KSxcblxuXHRcdFwiZXZlblwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwib2RkXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAxO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJsdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImd0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSlcblx0fVxufTtcblxuRXhwci5wc2V1ZG9zW1wibnRoXCJdID0gRXhwci5wc2V1ZG9zW1wiZXFcIl07XG5cbi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zXG5mb3IgKCBpIGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApO1xufVxuZm9yICggaSBpbiB7IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTtcbn1cblxuLy8gRWFzeSBBUEkgZm9yIGNyZWF0aW5nIG5ldyBzZXRGaWx0ZXJzXG5mdW5jdGlvbiBzZXRGaWx0ZXJzKCkge31cbnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zO1xuRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTtcblxudG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHtcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXG5cdFx0c29GYXIsIGdyb3VwcywgcHJlRmlsdGVycyxcblx0XHRjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCBjYWNoZWQgKSB7XG5cdFx0cmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTtcblx0fVxuXG5cdHNvRmFyID0gc2VsZWN0b3I7XG5cdGdyb3VwcyA9IFtdO1xuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XG5cblx0d2hpbGUgKCBzb0ZhciApIHtcblxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cblx0XHRpZiAoICFtYXRjaGVkIHx8IChtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdGlmICggbWF0Y2ggKSB7XG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0Z3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTtcblx0XHR9XG5cblx0XHRtYXRjaGVkID0gZmFsc2U7XG5cblx0XHQvLyBDb21iaW5hdG9yc1xuXHRcdGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sIFwiIFwiIClcblx0XHRcdH0pO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0XHRtYXRjaGVzOiBtYXRjaFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFtYXRjaGVkICkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xuXHQvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnNcblx0cmV0dXJuIHBhcnNlT25seSA/XG5cdFx0c29GYXIubGVuZ3RoIDpcblx0XHRzb0ZhciA/XG5cdFx0XHRTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOlxuXHRcdFx0Ly8gQ2FjaGUgdGhlIHRva2Vuc1xuXHRcdFx0dG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7XG59O1xuXG5mdW5jdGlvbiB0b1NlbGVjdG9yKCB0b2tlbnMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdHNlbGVjdG9yID0gXCJcIjtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0c2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdHNraXAgPSBjb21iaW5hdG9yLm5leHQsXG5cdFx0a2V5ID0gc2tpcCB8fCBkaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYga2V5ID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdGlmICggc2tpcCAmJiBza2lwID09PSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdGVsZW0gPSBlbGVtWyBkaXIgXSB8fCBlbGVtO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggKG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGtleSBdKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsga2V5IF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1swXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiZcblx0XHRcdFx0XHRcdCh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbXCIgXCJdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0pXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbXCJUQUdcIl0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIFN1cHBvcnQ6IElFPDksIFNhZmFyaVxuXHRcdFx0Ly8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6IFwibGVuZ3RoXCI7IFNhZmFyaTogPG51bWJlcj4pIG1hdGNoaW5nIGVsZW1lbnRzIGJ5IGlkXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0aWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50ICkge1xuXHRcdFx0XHRcdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0XHRcdFx0XHRcdHhtbCA9ICFkb2N1bWVudElzSFRNTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCB8fCBkb2N1bWVudCwgeG1sKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGBpYCBpcyBub3cgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHZpc2l0ZWQgYWJvdmUsIGFuZCBhZGRpbmcgaXQgdG8gYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIG1ha2VzIHRoZSBsYXR0ZXIgbm9ubmVnYXRpdmUuXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBlcXVhbHMgYGlgKSwgdW5sZXNzIHdlIGRpZG4ndCB2aXNpdCBfYW55XyBlbGVtZW50cyBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhhdmVcblx0XHRcdC8vIG5vIGVsZW1lbnQgbWF0Y2hlcnMgYW5kIG5vIHNlZWQuXG5cdFx0XHQvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyBcIjBcIiBgaWAgYWxsb3dzIGBpYCB0byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0XG5cdFx0XHQvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIFwiMDBcIiBgbWF0Y2hlZENvdW50YCB0aGF0IGRpZmZlcnMgZnJvbSBgaWAgYnV0IGlzIGFsc29cblx0XHRcdC8vIG51bWVyaWNhbGx5IHplcm8uXG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoW2ldICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWRcblx0Ly8gKHRoZSBsYXR0ZXIgb2Ygd2hpY2ggZ3VhcmFudGVlcyB1cyBjb250ZXh0KVxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFJlZHVjZSBjb250ZXh0IGlmIHRoZSBsZWFkaW5nIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdFx0Y29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkge1xuXG5cdFx0XHRjb250ZXh0ID0gKCBFeHByLmZpbmRbXCJJRFwiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKHJ1bmVzY2FwZSwgZnVuZXNjYXBlKSwgY29udGV4dCApIHx8IFtdIClbMF07XG5cdFx0XHRpZiAoICFjb250ZXh0ICkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbFxuXHRcdFx0fSBlbHNlIGlmICggY29tcGlsZWQgKSB7XG5cdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmdcblx0XHRpID0gbWF0Y2hFeHByW1wibmVlZHNDb250ZXh0XCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRva2VuID0gdG9rZW5zW2ldO1xuXG5cdFx0XHQvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yXG5cdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbICh0eXBlID0gdG9rZW4udHlwZSkgXSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0pICkge1xuXHRcdFx0XHQvLyBTZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnNcblx0XHRcdFx0aWYgKCAoc2VlZCA9IGZpbmQoXG5cdFx0XHRcdFx0dG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRcdHJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0XHRcdFx0KSkgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHlcblx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTtcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3ZpZGVkXG5cdC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmVcblx0KCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKFxuXHRcdHNlZWQsXG5cdFx0Y29udGV4dCxcblx0XHQhZG9jdW1lbnRJc0hUTUwsXG5cdFx0cmVzdWx0cyxcblx0XHQhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdCk7XG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLy8gT25lLXRpbWUgYXNzaWdubWVudHNcblxuLy8gU29ydCBzdGFiaWxpdHlcbnN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoXCJcIikuc29ydCggc29ydE9yZGVyICkuam9pbihcIlwiKSA9PT0gZXhwYW5kbztcblxuLy8gU3VwcG9ydDogQ2hyb21lIDE0LTM1K1xuLy8gQWx3YXlzIGFzc3VtZSBkdXBsaWNhdGVzIGlmIHRoZXkgYXJlbid0IHBhc3NlZCB0byB0aGUgY29tcGFyaXNvbiBmdW5jdGlvblxuc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7XG5cbi8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudFxuc2V0RG9jdW1lbnQoKTtcblxuLy8gU3VwcG9ydDogV2Via2l0PDUzNy4zMiAtIFNhZmFyaSA2LjAuMy9DaHJvbWUgMjUgKGZpeGVkIGluIENocm9tZSAyNylcbi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKlxuc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGVsLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZmllbGRzZXRcIikgKSAmIDE7XG59KTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JyMnPjwvYT5cIjtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIgO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxpbnB1dC8+XCI7XG5cdGVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydChmdW5jdGlvbiggZWwgKSB7XG5cdHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA9PSBudWxsO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0pKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xuXG4vLyBEZXByZWNhdGVkXG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5qUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlO1xuXG5cblxuXG52YXIgZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XG5cdHZhciBtYXRjaGVkID0gW10sXG5cdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0dmFyIG1hdGNoZWQgPSBbXTtcblxuXHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0bWF0Y2hlZC5wdXNoKCBuICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG5cblxuZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7XG5cbiAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbn07XG52YXIgcnNpbmdsZVRhZyA9ICggL148KFthLXpdW15cXC9cXDA+OlxceDIwXFx0XFxyXFxuXFxmXSopW1xceDIwXFx0XFxyXFxuXFxmXSpcXC8/Pig/OjxcXC9cXDE+fCkkL2kgKTtcblxuXG5cbi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90XG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHtcblx0aWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICkgIT09IG5vdDtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBTaW5nbGUgZWxlbWVudFxuXHRpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gQXJyYXlsaWtlIG9mIGVsZW1lbnRzIChqUXVlcnksIGFyZ3VtZW50cywgQXJyYXkpXG5cdGlmICggdHlwZW9mIHF1YWxpZmllciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGluZGV4T2YuY2FsbCggcXVhbGlmaWVyLCBlbGVtICkgPiAtMSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9yc1xuXHRyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7XG59XG5cbmpRdWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHtcblx0dmFyIGVsZW0gPSBlbGVtc1sgMCBdO1xuXG5cdGlmICggbm90ICkge1xuXHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XG5cdH1cblxuXHRpZiAoIGVsZW1zLmxlbmd0aCA9PT0gMSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdHJldHVybiBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsgZWxlbSBdIDogW107XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTtcblx0fSApICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgaSwgcmV0LFxuXHRcdFx0bGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRzZWxmID0gdGhpcztcblxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKSApO1xuXHRcdH1cblxuXHRcdHJldCA9IHRoaXMucHVzaFN0YWNrKCBbXSApO1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbGVuID4gMSA/IGpRdWVyeS51bmlxdWVTb3J0KCByZXQgKSA6IHJldDtcblx0fSxcblx0ZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7XG5cdH0sXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSApICk7XG5cdH0sXG5cdGlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuICEhd2lubm93KFxuXHRcdFx0dGhpcyxcblxuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldFxuXHRcdFx0Ly8gc28gJChcInA6Zmlyc3RcIikuaXMoXCJwOmxhc3RcIikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvIFwicFwiLlxuXHRcdFx0dHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3IgKSA6XG5cdFx0XHRcdHNlbGVjdG9yIHx8IFtdLFxuXHRcdFx0ZmFsc2Vcblx0XHQpLmxlbmd0aDtcblx0fVxufSApO1xuXG5cbi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0XG5cblxuLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpXG52YXIgcm9vdGpRdWVyeSxcblxuXHQvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xuXHQvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHQvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkXG5cdHJxdWlja0V4cHIgPSAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkLyxcblxuXHRpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7XG5cdFx0dmFyIG1hdGNoLCBlbGVtO1xuXG5cdFx0Ly8gSEFORExFOiAkKFwiXCIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBNZXRob2QgaW5pdCgpIGFjY2VwdHMgYW4gYWx0ZXJuYXRlIHJvb3RqUXVlcnlcblx0XHQvLyBzbyBtaWdyYXRlIGNhbiBzdXBwb3J0IGpRdWVyeS5zdWIgKGdoLTIxMDEpXG5cdFx0cm9vdCA9IHJvb3QgfHwgcm9vdGpRdWVyeTtcblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbIDAgXSA9PT0gXCI8XCIgJiZcblx0XHRcdFx0c2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiZcblx0XHRcdFx0c2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcblx0XHRcdFx0bWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkXG5cdFx0XHRpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWyAxIF0gKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WyAwIF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsgMSBdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWyAxIF0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkge1xuXHRcdFx0XHRcdFx0Zm9yICggbWF0Y2ggaW4gY29udGV4dCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTtcblxuXHRcdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkge1xuXHRcdFx0cmV0dXJuIHJvb3QucmVhZHkgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0c2VsZWN0b3IoIGpRdWVyeSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cblx0Ly8gTWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcblx0Z3VhcmFudGVlZFVuaXF1ZSA9IHtcblx0XHRjaGlsZHJlbjogdHJ1ZSxcblx0XHRjb250ZW50czogdHJ1ZSxcblx0XHRuZXh0OiB0cnVlLFxuXHRcdHByZXY6IHRydWVcblx0fTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbIGkgXSApICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0bWF0Y2hlZCA9IFtdLFxuXHRcdFx0dGFyZ2V0cyA9IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTtcblxuXHRcdC8vIFBvc2l0aW9uYWwgc2VsZWN0b3JzIG5ldmVyIG1hdGNoLCBzaW5jZSB0aGVyZSdzIG5vIF9zZWxlY3Rpb25fIGNvbnRleHRcblx0XHRpZiAoICFybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmb3IgKCBjdXIgPSB0aGlzWyBpIF07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXG5cdFx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAoIHRhcmdldHMgP1xuXHRcdFx0XHRcdFx0dGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIFNpenpsZVxuXHRcdFx0XHRcdFx0Y3VyLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggY3VyLCBzZWxlY3RvcnMgKSApICkge1xuXG5cdFx0XHRcdFx0XHRtYXRjaGVkLnB1c2goIGN1ciApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApO1xuXHR9LFxuXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldFxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudFxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7XG5cdFx0fVxuXG5cdFx0Ly8gSW5kZXggaW4gc2VsZWN0b3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApO1xuXHRcdH1cblxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxuXHRcdHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsXG5cblx0XHRcdC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZFxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtXG5cdFx0KTtcblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soXG5cdFx0XHRqUXVlcnkudW5pcXVlU29ydChcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLmdldCgpLCBqUXVlcnkoIHNlbGVjdG9yLCBjb250ZXh0ICkgKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLmFkZCggc2VsZWN0b3IgPT0gbnVsbCA/XG5cdFx0XHR0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKCBzZWxlY3RvciApXG5cdFx0KTtcblx0fVxufSApO1xuXG5mdW5jdGlvbiBzaWJsaW5nKCBjdXIsIGRpciApIHtcblx0d2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fVxuXHRyZXR1cm4gY3VyO1xufVxuXG5qUXVlcnkuZWFjaCgge1xuXHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0cmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDtcblx0fSxcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcblx0fSxcblx0cGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIsIHVudGlsICk7XG5cdH0sXG5cdG5leHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTtcblx0fSxcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7XG5cdH0sXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcbiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgXCJpZnJhbWVcIiApICkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHksIGlPUyA3IG9ubHksIEFuZHJvaWQgQnJvd3NlciA8PTQuMyBvbmx5XG4gICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdFxuICAgICAgICAvLyBkb24ndCBzdXBwb3J0IGl0LlxuICAgICAgICBpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRlbXBsYXRlXCIgKSApIHtcbiAgICAgICAgICAgIGVsZW0gPSBlbGVtLmNvbnRlbnQgfHwgZWxlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTtcblx0fVxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7XG5cdFx0dmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcblxuXHRcdGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gXCJVbnRpbFwiICkge1xuXHRcdFx0c2VsZWN0b3IgPSB1bnRpbDtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlc1xuXHRcdFx0aWYgKCAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdICkge1xuXHRcdFx0XHRqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlc1xuXHRcdFx0aWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRtYXRjaGVkLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQgKTtcblx0fTtcbn0gKTtcbnZhciBybm90aHRtbHdoaXRlID0gKCAvW15cXHgyMFxcdFxcclxcblxcZl0rL2cgKTtcblxuXG5cbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xuXHR2YXIgb2JqZWN0ID0ge307XG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBfLCBmbGFnICkge1xuXHRcdG9iamVjdFsgZmxhZyBdID0gdHJ1ZTtcblx0fSApO1xuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcbiAqXHRcdFx0dGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdFxuICpcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXG4gKiBcImZpcmVkXCIgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogUG9zc2libGUgb3B0aW9uczpcbiAqXG4gKlx0b25jZTpcdFx0XHR3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdG1lbW9yeTpcdFx0XHR3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkXG4gKlx0XHRcdFx0XHRhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCBcIm1lbW9yaXplZFwiXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0dW5pcXVlOlx0XHRcdHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KVxuICpcbiAqXHRzdG9wT25GYWxzZTpcdGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICpcbiAqL1xualF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcblx0Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KVxuXHRvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgP1xuXHRcdGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6XG5cdFx0alF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTtcblxuXHR2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZ1xuXHRcdGZpcmluZyxcblxuXHRcdC8vIExhc3QgZmlyZSB2YWx1ZSBmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzXG5cdFx0bWVtb3J5LFxuXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWRcblx0XHRmaXJlZCxcblxuXHRcdC8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmdcblx0XHRsb2NrZWQsXG5cblx0XHQvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdFxuXHRcdGxpc3QgPSBbXSxcblxuXHRcdC8vIFF1ZXVlIG9mIGV4ZWN1dGlvbiBkYXRhIGZvciByZXBlYXRhYmxlIGxpc3RzXG5cdFx0cXVldWUgPSBbXSxcblxuXHRcdC8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKVxuXHRcdGZpcmluZ0luZGV4ID0gLTEsXG5cblx0XHQvLyBGaXJlIGNhbGxiYWNrc1xuXHRcdGZpcmUgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nXG5cdFx0XHRsb2NrZWQgPSBsb2NrZWQgfHwgb3B0aW9ucy5vbmNlO1xuXG5cdFx0XHQvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucyxcblx0XHRcdC8vIHJlc3BlY3RpbmcgZmlyaW5nSW5kZXggb3ZlcnJpZGVzIGFuZCBydW50aW1lIGNoYW5nZXNcblx0XHRcdGZpcmVkID0gZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkge1xuXHRcdFx0XHRtZW1vcnkgPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0XHR3aGlsZSAoICsrZmlyaW5nSW5kZXggPCBsaXN0Lmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdC8vIFJ1biBjYWxsYmFjayBhbmQgY2hlY2sgZm9yIGVhcmx5IHRlcm1pbmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBtZW1vcnlbIDAgXSwgbWVtb3J5WyAxIF0gKSA9PT0gZmFsc2UgJiZcblx0XHRcdFx0XHRcdG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEp1bXAgdG8gZW5kIGFuZCBmb3JnZXQgdGhlIGRhdGEgc28gLmFkZCBkb2Vzbid0IHJlLWZpcmVcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdFxuXHRcdFx0aWYgKCAhb3B0aW9ucy5tZW1vcnkgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRmaXJpbmcgPSBmYWxzZTtcblxuXHRcdFx0Ly8gQ2xlYW4gdXAgaWYgd2UncmUgZG9uZSBmaXJpbmcgZm9yIGdvb2Rcblx0XHRcdGlmICggbG9ja2VkICkge1xuXG5cdFx0XHRcdC8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHNcblx0XHRcdFx0aWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgdGhpcyBvYmplY3QgaXMgc3BlbnRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsaXN0ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cblx0XHRcdC8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3Rcblx0XHRcdGFkZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblxuXHRcdFx0XHRcdC8vIElmIHdlIGhhdmUgbWVtb3J5IGZyb20gYSBwYXN0IHJ1biwgd2Ugc2hvdWxkIGZpcmUgYWZ0ZXIgYWRkaW5nXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0cXVldWUucHVzaCggbWVtb3J5ICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0KCBmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdC5wdXNoKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIHRvVHlwZSggYXJnICkgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdH0gKSggYXJndW1lbnRzICk7XG5cblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3Rcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0dmFyIGluZGV4O1xuXHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHtcblx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID9cblx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDpcblx0XHRcdFx0XHRsaXN0Lmxlbmd0aCA+IDA7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlIGFuZCAuYWRkXG5cdFx0XHQvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdC8vIENsZWFyIGFsbCBjYWxsYmFja3MgYW5kIHZhbHVlc1xuXHRcdFx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRkaXNhYmxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhbGlzdDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmVcblx0XHRcdC8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpXG5cdFx0XHQvLyBBYm9ydCBhbnkgcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHRsb2NrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0bG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhbG9ja2VkO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkge1xuXHRcdFx0XHRpZiAoICFsb2NrZWQgKSB7XG5cdFx0XHRcdFx0YXJncyA9IGFyZ3MgfHwgW107XG5cdFx0XHRcdFx0YXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBhcmdzICk7XG5cdFx0XHRcdFx0aWYgKCAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXG5cdFx0XHRmaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWZpcmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIHNlbGY7XG59O1xuXG5cbmZ1bmN0aW9uIElkZW50aXR5KCB2ICkge1xuXHRyZXR1cm4gdjtcbn1cbmZ1bmN0aW9uIFRocm93ZXIoIGV4ICkge1xuXHR0aHJvdyBleDtcbn1cblxuZnVuY3Rpb24gYWRvcHRWYWx1ZSggdmFsdWUsIHJlc29sdmUsIHJlamVjdCwgbm9WYWx1ZSApIHtcblx0dmFyIG1ldGhvZDtcblxuXHR0cnkge1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIHByb21pc2UgYXNwZWN0IGZpcnN0IHRvIHByaXZpbGVnZSBzeW5jaHJvbm91cyBiZWhhdmlvclxuXHRcdGlmICggdmFsdWUgJiYgaXNGdW5jdGlvbiggKCBtZXRob2QgPSB2YWx1ZS5wcm9taXNlICkgKSApIHtcblx0XHRcdG1ldGhvZC5jYWxsKCB2YWx1ZSApLmRvbmUoIHJlc29sdmUgKS5mYWlsKCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIHRoZW5hYmxlc1xuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUsIHJlc29sdmUsIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgbm9uLXRoZW5hYmxlc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIENvbnRyb2wgYHJlc29sdmVgIGFyZ3VtZW50cyBieSBsZXR0aW5nIEFycmF5I3NsaWNlIGNhc3QgYm9vbGVhbiBgbm9WYWx1ZWAgdG8gaW50ZWdlcjpcblx0XHRcdC8vICogZmFsc2U6IFsgdmFsdWUgXS5zbGljZSggMCApID0+IHJlc29sdmUoIHZhbHVlIClcblx0XHRcdC8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpXG5cdFx0XHRyZXNvbHZlLmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXS5zbGljZSggbm9WYWx1ZSApICk7XG5cdFx0fVxuXG5cdC8vIEZvciBQcm9taXNlcy9BKywgY29udmVydCBleGNlcHRpb25zIGludG8gcmVqZWN0aW9uc1xuXHQvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluXG5cdC8vIERlZmVycmVkI3RoZW4gdG8gY29uZGl0aW9uYWxseSBzdXBwcmVzcyByZWplY3Rpb24uXG5cdH0gY2F0Y2ggKCB2YWx1ZSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIG9ubHlcblx0XHQvLyBTdHJpY3QgbW9kZSBmdW5jdGlvbnMgaW52b2tlZCB3aXRob3V0IC5jYWxsLy5hcHBseSBnZXQgZ2xvYmFsLW9iamVjdCBjb250ZXh0XG5cdFx0cmVqZWN0LmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXSApO1xuXHR9XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XG5cdFx0dmFyIHR1cGxlcyA9IFtcblxuXHRcdFx0XHQvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgY2FsbGJhY2tzLFxuXHRcdFx0XHQvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdXG5cdFx0XHRcdFsgXCJub3RpZnlcIiwgXCJwcm9ncmVzc1wiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLCAyIF0sXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMCwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCAxLCBcInJlamVjdGVkXCIgXVxuXHRcdFx0XSxcblx0XHRcdHN0YXRlID0gXCJwZW5kaW5nXCIsXG5cdFx0XHRwcm9taXNlID0ge1xuXHRcdFx0XHRzdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhbHdheXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImNhdGNoXCI6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0cGlwZTogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xuXHRcdFx0XHRcdHZhciBmbnMgPSBhcmd1bWVudHM7XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpXG5cdFx0XHRcdFx0XHRcdHZhciBmbiA9IGlzRnVuY3Rpb24oIGZuc1sgdHVwbGVbIDQgXSBdICkgJiYgZm5zWyB0dXBsZVsgNCBdIF07XG5cblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQucHJvZ3Jlc3MoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIubm90aWZ5IH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmRvbmUoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVzb2x2ZSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KVxuXHRcdFx0XHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDEgXSBdKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCAmJiBpc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBvblByb2dyZXNzICkge1xuXHRcdFx0XHRcdHZhciBtYXhEZXB0aCA9IDA7XG5cdFx0XHRcdFx0ZnVuY3Rpb24gcmVzb2x2ZSggZGVwdGgsIGRlZmVycmVkLCBoYW5kbGVyLCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdGhhdCA9IHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0YXJncyA9IGFyZ3VtZW50cyxcblx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQsIHRoZW47XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy4zXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01OVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoIDwgbWF4RGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjFcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkID09PSBkZWZlcnJlZC5wcm9taXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoIFwiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uXCIgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbnMgMi4zLjMuMSwgMy41XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNzVcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFJldHJpZXZlIGB0aGVuYCBvbmx5IG9uY2Vcblx0XHRcdFx0XHRcdFx0XHRcdHRoZW4gPSByZXR1cm5lZCAmJlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBjaGVjayBvYmplY3RzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZW5hYmlsaXR5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggdHlwZW9mIHJldHVybmVkID09PSBcIm9iamVjdFwiIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHJldHVybmVkID09PSBcImZ1bmN0aW9uXCIgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC50aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYSByZXR1cm5lZCB0aGVuYWJsZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gTm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGFsc28gaG9vayBpbnRvIHByb2dyZXNzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgZGlzcmVnYXJkIG9sZGVyIHJlc29sdXRpb24gdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWF4RGVwdGgrKztcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBhbGwgb3RoZXIgcmV0dXJuZWQgdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyByZXR1cm5lZCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUHJvY2VzcyB0aGUgdmFsdWUocylcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmYXVsdCBwcm9jZXNzIGlzIHJlc29sdmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0KCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBub3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgY2F0Y2ggYW5kIHJlamVjdCBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcyA9IHNwZWNpYWwgP1xuXHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rKCBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzLnN0YWNrVHJhY2UgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuNC4xXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgcG9zdC1yZXNvbHV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICsgMSA+PSBtYXhEZXB0aCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IFRocm93ZXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIGUgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMVxuXHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01N1xuXHRcdFx0XHRcdFx0XHQvLyBSZS1yZXNvbHZlIHByb21pc2VzIGltbWVkaWF0ZWx5IHRvIGRvZGdlIGZhbHNlIHJlamVjdGlvbiBmcm9tXG5cdFx0XHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgZXJyb3JzXG5cdFx0XHRcdFx0XHRcdGlmICggZGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcygpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2FsbCBhbiBvcHRpb25hbCBob29rIHRvIHJlY29yZCB0aGUgc3RhY2ssIGluIGNhc2Ugb2YgZXhjZXB0aW9uXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc2luY2UgaXQncyBvdGhlcndpc2UgbG9zdCB3aGVuIGV4ZWN1dGlvbiBnb2VzIGFzeW5jXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5zdGFja1RyYWNlID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25Qcm9ncmVzcyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlci5ub3RpZnlXaXRoXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDEgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGlzRnVuY3Rpb24oIG9uRnVsZmlsbGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25GdWxmaWxsZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAyIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblJlamVjdGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25SZWplY3RlZCA6XG5cdFx0XHRcdFx0XHRcdFx0XHRUaHJvd2VyXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkXG5cdFx0XHRcdC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3Rcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWZlcnJlZCA9IHt9O1xuXG5cdFx0Ly8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kc1xuXHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHtcblx0XHRcdHZhciBsaXN0ID0gdHVwbGVbIDIgXSxcblx0XHRcdFx0c3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdO1xuXG5cdFx0XHQvLyBwcm9taXNlLnByb2dyZXNzID0gbGlzdC5hZGRcblx0XHRcdC8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmZhaWwgPSBsaXN0LmFkZFxuXHRcdFx0cHJvbWlzZVsgdHVwbGVbIDEgXSBdID0gbGlzdC5hZGQ7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZVxuXHRcdFx0aWYgKCBzdGF0ZVN0cmluZyApIHtcblx0XHRcdFx0bGlzdC5hZGQoXG5cdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIHN0YXRlID0gXCJyZXNvbHZlZFwiIChpLmUuLCBmdWxmaWxsZWQpXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVqZWN0ZWRcIlxuXHRcdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0cmluZztcblx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHR0dXBsZXNbIDMgLSBpIF1bIDIgXS5kaXNhYmxlLFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAzIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrXG5cdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDIgXS5sb2NrLFxuXG5cdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0ubG9ja1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlXG5cdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0bGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApO1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnkgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQubm90aWZ5V2l0aCguLi4pIH1cblx0XHRcdC8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3QgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVqZWN0V2l0aCguLi4pIH1cblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH07XG5cblx0XHRcdC8vIGRlZmVycmVkLm5vdGlmeVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdC8vIGRlZmVycmVkLnJlamVjdFdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xuXHRcdH0gKTtcblxuXHRcdC8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZVxuXHRcdHByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTtcblxuXHRcdC8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnlcblx0XHRpZiAoIGZ1bmMgKSB7XG5cdFx0XHRmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBkb25lIVxuXHRcdHJldHVybiBkZWZlcnJlZDtcblx0fSxcblxuXHQvLyBEZWZlcnJlZCBoZWxwZXJcblx0d2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkge1xuXHRcdHZhclxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXNcblx0XHRcdHJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cblx0XHRcdC8vIGNvdW50IG9mIHVucHJvY2Vzc2VkIGFyZ3VtZW50c1xuXHRcdFx0aSA9IHJlbWFpbmluZyxcblxuXHRcdFx0Ly8gc3Vib3JkaW5hdGUgZnVsZmlsbG1lbnQgZGF0YVxuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblxuXHRcdFx0Ly8gdGhlIG1hc3RlciBEZWZlcnJlZFxuXHRcdFx0bWFzdGVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3Rvcnlcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdG1hc3Rlci5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdC8vIFNpbmdsZS0gYW5kIGVtcHR5IGFyZ3VtZW50cyBhcmUgYWRvcHRlZCBsaWtlIFByb21pc2UucmVzb2x2ZVxuXHRcdGlmICggcmVtYWluaW5nIDw9IDEgKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsXG5cdFx0XHRcdCFyZW1haW5pbmcgKTtcblxuXHRcdFx0Ly8gVXNlIC50aGVuKCkgdG8gdW53cmFwIHNlY29uZGFyeSB0aGVuYWJsZXMgKGNmLiBnaC0zMDAwKVxuXHRcdFx0aWYgKCBtYXN0ZXIuc3RhdGUoKSA9PT0gXCJwZW5kaW5nXCIgfHxcblx0XHRcdFx0aXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG1hc3Rlci50aGVuKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTXVsdGlwbGUgYXJndW1lbnRzIGFyZSBhZ2dyZWdhdGVkIGxpa2UgUHJvbWlzZS5hbGwgYXJyYXkgZWxlbWVudHNcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hc3Rlci5wcm9taXNlKCk7XG5cdH1cbn0gKTtcblxuXG4vLyBUaGVzZSB1c3VhbGx5IGluZGljYXRlIGEgcHJvZ3JhbW1lciBtaXN0YWtlIGR1cmluZyBkZXZlbG9wbWVudCxcbi8vIHdhcm4gYWJvdXQgdGhlbSBBU0FQIHJhdGhlciB0aGFuIHN3YWxsb3dpbmcgdGhlbSBieSBkZWZhdWx0LlxudmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87XG5cbmpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rID0gZnVuY3Rpb24oIGVycm9yLCBzdGFjayApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA4IC0gOSBvbmx5XG5cdC8vIENvbnNvbGUgZXhpc3RzIHdoZW4gZGV2IHRvb2xzIGFyZSBvcGVuLCB3aGljaCBjYW4gaGFwcGVuIGF0IGFueSB0aW1lXG5cdGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7XG5cdFx0d2luZG93LmNvbnNvbGUud2FybiggXCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiBcIiArIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrLCBzdGFjayApO1xuXHR9XG59O1xuXG5cblxuXG5qUXVlcnkucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHR0aHJvdyBlcnJvcjtcblx0fSApO1xufTtcblxuXG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cbmpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHtcblxuXHRyZWFkeUxpc3Rcblx0XHQudGhlbiggZm4gKVxuXG5cdFx0Ly8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXBcblx0XHQvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2tcblx0XHQvLyByZWdpc3RyYXRpb24uXG5cdFx0LmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlFeGNlcHRpb24oIGVycm9yICk7XG5cdFx0fSApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODFcblx0cmVhZHlXYWl0OiAxLFxuXG5cdC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHlcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xuXG5cdFx0Ly8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeVxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxuXHRcdGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTtcblxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXG5cdFx0aWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZVxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkucmVhZHkudGhlbiA9IHJlYWR5TGlzdC50aGVuO1xuXG4vLyBUaGUgcmVhZHkgZXZlbnQgaGFuZGxlciBhbmQgc2VsZiBjbGVhbnVwIG1ldGhvZFxuZnVuY3Rpb24gY29tcGxldGVkKCkge1xuXHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG5cdGpRdWVyeS5yZWFkeSgpO1xufVxuXG4vLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZFxuLy8gYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMCBvbmx5XG4vLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyBcImludGVyYWN0aXZlXCIgdG9vIHNvb25cbmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiIHx8XG5cdCggZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gXCJsb2FkaW5nXCIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkge1xuXG5cdC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeVxuXHR3aW5kb3cuc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7XG5cbn0gZWxzZSB7XG5cblx0Ly8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFja1xuXHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cblx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBjb21wbGV0ZWQgKTtcbn1cblxuXG5cblxuLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uXG4vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cbnZhciBhY2Nlc3MgPSBmdW5jdGlvbiggZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBlbGVtcy5sZW5ndGgsXG5cdFx0YnVsayA9IGtleSA9PSBudWxsO1xuXG5cdC8vIFNldHMgbWFueSB2YWx1ZXNcblx0aWYgKCB0b1R5cGUoIGtleSApID09PSBcIm9iamVjdFwiICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cdFx0Zm9yICggaSBpbiBrZXkgKSB7XG5cdFx0XHRhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTtcblx0XHR9XG5cblx0Ly8gU2V0cyBvbmUgdmFsdWVcblx0fSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXG5cdFx0aWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJhdyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBidWxrICkge1xuXG5cdFx0XHQvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXRcblx0XHRcdGlmICggcmF3ICkge1xuXHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcblx0XHRcdFx0Zm4gPSBudWxsO1xuXG5cdFx0XHQvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWxrID0gZm47XG5cdFx0XHRcdGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRmbihcblx0XHRcdFx0XHRlbGVtc1sgaSBdLCBrZXksIHJhdyA/XG5cdFx0XHRcdFx0dmFsdWUgOlxuXHRcdFx0XHRcdHZhbHVlLmNhbGwoIGVsZW1zWyBpIF0sIGksIGZuKCBlbGVtc1sgaSBdLCBrZXkgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBjaGFpbmFibGUgKSB7XG5cdFx0cmV0dXJuIGVsZW1zO1xuXHR9XG5cblx0Ly8gR2V0c1xuXHRpZiAoIGJ1bGsgKSB7XG5cdFx0cmV0dXJuIGZuLmNhbGwoIGVsZW1zICk7XG5cdH1cblxuXHRyZXR1cm4gbGVuID8gZm4oIGVsZW1zWyAwIF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xuXG5cbi8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xudmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbYS16XSkvZztcblxuLy8gVXNlZCBieSBjYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5mdW5jdGlvbiBmY2FtZWxDYXNlKCBhbGwsIGxldHRlciApIHtcblx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xufVxuXG4vLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSwgRWRnZSAxMiAtIDE1XG4vLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpXG5mdW5jdGlvbiBjYW1lbENhc2UoIHN0cmluZyApIHtcblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsIFwibXMtXCIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7XG59XG52YXIgYWNjZXB0RGF0YSA9IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHQvLyBBY2NlcHRzIG9ubHk6XG5cdC8vICAtIE5vZGVcblx0Ly8gICAgLSBOb2RlLkVMRU1FTlRfTk9ERVxuXHQvLyAgICAtIE5vZGUuRE9DVU1FTlRfTk9ERVxuXHQvLyAgLSBPYmplY3Rcblx0Ly8gICAgLSBBbnlcblx0cmV0dXJuIG93bmVyLm5vZGVUeXBlID09PSAxIHx8IG93bmVyLm5vZGVUeXBlID09PSA5IHx8ICEoICtvd25lci5ub2RlVHlwZSApO1xufTtcblxuXG5cblxuZnVuY3Rpb24gRGF0YSgpIHtcblx0dGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrO1xufVxuXG5EYXRhLnVpZCA9IDE7XG5cbkRhdGEucHJvdG90eXBlID0ge1xuXG5cdGNhY2hlOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGVcblx0XHR2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHQvLyBJZiBub3QsIGNyZWF0ZSBvbmVcblx0XHRpZiAoICF2YWx1ZSApIHtcblx0XHRcdHZhbHVlID0ge307XG5cblx0XHRcdC8vIFdlIGNhbiBhY2NlcHQgZGF0YSBmb3Igbm9uLWVsZW1lbnQgbm9kZXMgaW4gbW9kZXJuIGJyb3dzZXJzLFxuXHRcdFx0Ly8gYnV0IHdlIHNob3VsZCBub3QsIHNlZSAjODMzNS5cblx0XHRcdC8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBvd25lciApICkge1xuXG5cdFx0XHRcdC8vIElmIGl0IGlzIGEgbm9kZSB1bmxpa2VseSB0byBiZSBzdHJpbmdpZnktZWQgb3IgbG9vcGVkIG92ZXJcblx0XHRcdFx0Ly8gdXNlIHBsYWluIGFzc2lnbm1lbnRcblx0XHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHlcblx0XHRcdFx0Ly8gY29uZmlndXJhYmxlIG11c3QgYmUgdHJ1ZSB0byBhbGxvdyB0aGUgcHJvcGVydHkgdG8gYmVcblx0XHRcdFx0Ly8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywge1xuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGUoIG93bmVyICk7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUgXSBhcmdzXG5cdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBkYXRhICkgXSA9IHZhbHVlO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3Ncblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBwcm9wICkgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzLmNhY2hlKCBvd25lciApIDpcblxuXHRcdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdICYmIG93bmVyWyB0aGlzLmV4cGFuZG8gXVsgY2FtZWxDYXNlKCBrZXkgKSBdO1xuXHR9LFxuXHRhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHtcblxuXHRcdC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gTm8ga2V5IHdhcyBzcGVjaWZpZWRcblx0XHQvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWRcblx0XHQvL1xuXHRcdC8vIFRha2UgdGhlIFwicmVhZFwiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZVxuXHRcdC8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3Rcblx0XHQvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5XG5cdFx0Ly9cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdCggKCBrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiApICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLFxuXHRcdFx0Y2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHRpZiAoIGNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHNldCBjYW1lbENhc2Uga2V5cywgc28gcmVtb3ZlIHRoYXQuXG5cdFx0XHRcdGtleSA9IGtleS5tYXAoIGNhbWVsQ2FzZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0a2V5ID0gY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0XHQvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdGtleSA9IGtleSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0WyBrZXkgXSA6XG5cdFx0XHRcdFx0KCBrZXkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpID0ga2V5Lmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgdGhlcmUncyBubyBtb3JlIGRhdGFcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1XG5cdFx0XHQvLyBXZWJraXQgJiBCbGluayBwZXJmb3JtYW5jZSBzdWZmZXJzIHdoZW4gZGVsZXRpbmcgcHJvcGVydGllc1xuXHRcdFx0Ly8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzc4NjA3IChidWcgcmVzdHJpY3RlZClcblx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0dmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdHJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTtcblx0fVxufTtcbnZhciBkYXRhUHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvW0EtWl0vZztcblxuZnVuY3Rpb24gZ2V0RGF0YSggZGF0YSApIHtcblx0aWYgKCBkYXRhID09PSBcInRydWVcIiApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJmYWxzZVwiICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJudWxsXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuXHRpZiAoIGRhdGEgPT09ICtkYXRhICsgXCJcIiApIHtcblx0XHRyZXR1cm4gK2RhdGE7XG5cdH1cblxuXHRpZiAoIHJicmFjZS50ZXN0KCBkYXRhICkgKSB7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKTtcblx0fVxuXG5cdHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGdldERhdGEoIGRhdGEgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhVXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTtcblx0fSxcblxuXHRkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVVzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRlcHJlY2F0ZWQuXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGRhdGEsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0YXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlcztcblxuXHRcdC8vIEdldHMgYWxsIHZhbHVlc1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhUHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NClcblx0XHRcdFx0XHRcdGlmICggYXR0cnNbIGkgXSApIHtcblx0XHRcdFx0XHRcdFx0bmFtZSA9IGF0dHJzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRcdFx0aWYgKCBuYW1lLmluZGV4T2YoIFwiZGF0YS1cIiApID09PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdG5hbWUgPSBjYW1lbENhc2UoIG5hbWUuc2xpY2UoIDUgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHQvLyBTZXRzIG11bHRpcGxlIHZhbHVlc1xuXHRcdGlmICggdHlwZW9mIGtleSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBkYXRhO1xuXG5cdFx0XHQvLyBUaGUgY2FsbGluZyBqUXVlcnkgb2JqZWN0IChlbGVtZW50IG1hdGNoZXMpIGlzIG5vdCBlbXB0eVxuXHRcdFx0Ly8gKGFuZCB0aGVyZWZvcmUgaGFzIGFuIGVsZW1lbnQgYXBwZWFycyBhdCB0aGlzWyAwIF0pIGFuZCB0aGVcblx0XHRcdC8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0XG5cdFx0XHQvLyB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBmb3IgZWxlbSA9IHRoaXNbIDAgXSB3aGljaCB3aWxsXG5cdFx0XHQvLyB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gYXR0ZW1wdCB0byByZWFkIGEgZGF0YSBjYWNoZSBpcyBtYWRlLlxuXHRcdFx0aWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyBUaGUga2V5IHdpbGwgYWx3YXlzIGJlIGNhbWVsQ2FzZWQgaW4gRGF0YVxuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIFwiZGlzY292ZXJcIiB0aGUgZGF0YSBpblxuXHRcdFx0XHQvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzXG5cdFx0XHRcdGRhdGEgPSBkYXRhQXR0ciggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LlxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgZGF0YS4uLlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5XG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApO1xuXHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBxdWV1ZTtcblxuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHR5cGUgPSAoIHR5cGUgfHwgXCJmeFwiICkgKyBcInF1ZXVlXCI7XG5cdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IEFycmF5LmlzQXJyYXkoIGRhdGEgKSApIHtcblx0XHRcdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cXVldWUucHVzaCggZGF0YSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcXVldWUgfHwgW107XG5cdFx0fVxuXHR9LFxuXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLFxuXHRcdFx0c3RhcnRMZW5ndGggPSBxdWV1ZS5sZW5ndGgsXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCksXG5cdFx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLFxuXHRcdFx0bmV4dCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApO1xuXHRcdFx0fTtcblxuXHRcdC8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWxcblx0XHRpZiAoIGZuID09PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdHN0YXJ0TGVuZ3RoLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblxuXHRcdFx0Ly8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZ1xuXHRcdFx0Ly8gYXV0b21hdGljYWxseSBkZXF1ZXVlZFxuXHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgKSB7XG5cdFx0XHRcdHF1ZXVlLnVuc2hpZnQoIFwiaW5wcm9ncmVzc1wiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb25cblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0Zm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTtcblx0XHR9XG5cblx0XHRpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmVcblx0X3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHZhciBrZXkgPSB0eXBlICsgXCJxdWV1ZUhvb2tzXCI7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmdldCggZWxlbSwga2V5ICkgfHwgZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBrZXksIHtcblx0XHRcdGVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKS5hZGQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArIFwicXVldWVcIiwga2V5IF0gKTtcblx0XHRcdH0gKVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgc2V0dGVyID0gMjtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRkYXRhID0gdHlwZTtcblx0XHRcdHR5cGUgPSBcImZ4XCI7XG5cdFx0XHRzZXR0ZXItLTtcblx0XHR9XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnF1ZXVlKCB0aGlzWyAwIF0sIHR5cGUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHRoaXMgOlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBkYXRhICk7XG5cblx0XHRcdFx0Ly8gRW5zdXJlIGEgaG9va3MgZm9yIHRoaXMgcXVldWVcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgJiYgcXVldWVbIDAgXSAhPT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHR9LFxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0fSApO1xuXHR9LFxuXHRjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdH0sXG5cblx0Ly8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZVxuXHQvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdClcblx0cHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHtcblx0XHR2YXIgdG1wLFxuXHRcdFx0Y291bnQgPSAxLFxuXHRcdFx0ZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGVsZW1lbnRzID0gdGhpcyxcblx0XHRcdGkgPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJlc29sdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhKCAtLWNvdW50ICkgKSB7XG5cdFx0XHRcdFx0ZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRvYmogPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0bXAgPSBkYXRhUHJpdi5nZXQoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyBcInF1ZXVlSG9va3NcIiApO1xuXHRcdFx0aWYgKCB0bXAgJiYgdG1wLmVtcHR5ICkge1xuXHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0XHR0bXAuZW1wdHkuYWRkKCByZXNvbHZlICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlc29sdmUoKTtcblx0XHRyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7XG5cdH1cbn0gKTtcbnZhciBwbnVtID0gKCAvWystXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVsrLV0/XFxkK3wpLyApLnNvdXJjZTtcblxudmFyIHJjc3NOdW0gPSBuZXcgUmVnRXhwKCBcIl4oPzooWystXSk9fCkoXCIgKyBwbnVtICsgXCIpKFthLXolXSopJFwiLCBcImlcIiApO1xuXG5cbnZhciBjc3NFeHBhbmQgPSBbIFwiVG9wXCIsIFwiUmlnaHRcIiwgXCJCb3R0b21cIiwgXCJMZWZ0XCIgXTtcblxudmFyIGlzSGlkZGVuV2l0aGluVHJlZSA9IGZ1bmN0aW9uKCBlbGVtLCBlbCApIHtcblxuXHRcdC8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uO1xuXHRcdC8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudFxuXHRcdGVsZW0gPSBlbCB8fCBlbGVtO1xuXG5cdFx0Ly8gSW5saW5lIHN0eWxlIHRydW1wcyBhbGxcblx0XHRyZXR1cm4gZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiB8fFxuXHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmXG5cblx0XHRcdC8vIE90aGVyd2lzZSwgY2hlY2sgY29tcHV0ZWQgc3R5bGVcblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1XG5cdFx0XHQvLyBEaXNjb25uZWN0ZWQgZWxlbWVudHMgY2FuIGhhdmUgY29tcHV0ZWQgZGlzcGxheTogbm9uZSwgc28gZmlyc3QgY29uZmlybSB0aGF0IGVsZW0gaXNcblx0XHRcdC8vIGluIHRoZSBkb2N1bWVudC5cblx0XHRcdGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiZcblxuXHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCI7XG5cdH07XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrLCBhcmdzICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTtcblxuXHQvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn07XG5cblxuXG5cbmZ1bmN0aW9uIGFkanVzdENTUyggZWxlbSwgcHJvcCwgdmFsdWVQYXJ0cywgdHdlZW4gKSB7XG5cdHZhciBhZGp1c3RlZCwgc2NhbGUsXG5cdFx0bWF4SXRlcmF0aW9ucyA9IDIwLFxuXHRcdGN1cnJlbnRWYWx1ZSA9IHR3ZWVuID9cblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uY3VyKCk7XG5cdFx0XHR9IDpcblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgcHJvcCwgXCJcIiApO1xuXHRcdFx0fSxcblx0XHRpbml0aWFsID0gY3VycmVudFZhbHVlKCksXG5cdFx0dW5pdCA9IHZhbHVlUGFydHMgJiYgdmFsdWVQYXJ0c1sgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApLFxuXG5cdFx0Ly8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXNcblx0XHRpbml0aWFsSW5Vbml0ID0gKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gfHwgdW5pdCAhPT0gXCJweFwiICYmICtpbml0aWFsICkgJiZcblx0XHRcdHJjc3NOdW0uZXhlYyggalF1ZXJ5LmNzcyggZWxlbSwgcHJvcCApICk7XG5cblx0aWYgKCBpbml0aWFsSW5Vbml0ICYmIGluaXRpYWxJblVuaXRbIDMgXSAhPT0gdW5pdCApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD01NFxuXHRcdC8vIEhhbHZlIHRoZSBpdGVyYXRpb24gdGFyZ2V0IHZhbHVlIHRvIHByZXZlbnQgaW50ZXJmZXJlbmNlIGZyb20gQ1NTIHVwcGVyIGJvdW5kcyAoZ2gtMjE0NClcblx0XHRpbml0aWFsID0gaW5pdGlhbCAvIDI7XG5cblx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0dW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdO1xuXG5cdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWwgfHwgMTtcblxuXHRcdHdoaWxlICggbWF4SXRlcmF0aW9ucy0tICkge1xuXG5cdFx0XHQvLyBFdmFsdWF0ZSBhbmQgdXBkYXRlIG91ciBiZXN0IGd1ZXNzIChkb3VibGluZyBndWVzc2VzIHRoYXQgemVybyBvdXQpLlxuXHRcdFx0Ly8gRmluaXNoIGlmIHRoZSBzY2FsZSBlcXVhbHMgb3IgY3Jvc3NlcyAxIChtYWtpbmcgdGhlIG9sZCpuZXcgcHJvZHVjdCBub24tcG9zaXRpdmUpLlxuXHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXHRcdFx0aWYgKCAoIDEgLSBzY2FsZSApICogKCAxIC0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCB8fCAwLjUgKSApIDw9IDAgKSB7XG5cdFx0XHRcdG1heEl0ZXJhdGlvbnMgPSAwO1xuXHRcdFx0fVxuXHRcdFx0aW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgLyBzY2FsZTtcblxuXHRcdH1cblxuXHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0ICogMjtcblx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2VlbiBwcm9wZXJ0aWVzIGxhdGVyIG9uXG5cdFx0dmFsdWVQYXJ0cyA9IHZhbHVlUGFydHMgfHwgW107XG5cdH1cblxuXHRpZiAoIHZhbHVlUGFydHMgKSB7XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFsIHx8IDA7XG5cblx0XHQvLyBBcHBseSByZWxhdGl2ZSBvZmZzZXQgKCs9Ly09KSBpZiBzcGVjaWZpZWRcblx0XHRhZGp1c3RlZCA9IHZhbHVlUGFydHNbIDEgXSA/XG5cdFx0XHRpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOlxuXHRcdFx0K3ZhbHVlUGFydHNbIDIgXTtcblx0XHRpZiAoIHR3ZWVuICkge1xuXHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHR0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7XG5cdFx0XHR0d2Vlbi5lbmQgPSBhZGp1c3RlZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFkanVzdGVkO1xufVxuXG5cbnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApIHtcblx0dmFyIHRlbXAsXG5cdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50LFxuXHRcdG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSxcblx0XHRkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF07XG5cblx0aWYgKCBkaXNwbGF5ICkge1xuXHRcdHJldHVybiBkaXNwbGF5O1xuXHR9XG5cblx0dGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApO1xuXHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggdGVtcCwgXCJkaXNwbGF5XCIgKTtcblxuXHR0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRlbXAgKTtcblxuXHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdGRpc3BsYXkgPSBcImJsb2NrXCI7XG5cdH1cblx0ZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Ly8gRGV0ZXJtaW5lIG5ldyBkaXNwbGF5IHZhbHVlIGZvciBlbGVtZW50cyB0aGF0IG5lZWQgdG8gY2hhbmdlXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblxuXHRcdFx0Ly8gU2luY2Ugd2UgZm9yY2UgdmlzaWJpbGl0eSB1cG9uIGNhc2NhZGUtaGlkZGVuIGVsZW1lbnRzLCBhbiBpbW1lZGlhdGUgKGFuZCBzbG93KVxuXHRcdFx0Ly8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyXG5cdFx0XHQvLyBpbmxpbmUgb3IgYWJvdXQtdG8tYmUtcmVzdG9yZWQpXG5cdFx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZGlzcGxheVwiICkgfHwgbnVsbDtcblx0XHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICkge1xuXHRcdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBcIm5vbmVcIjtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB3aGF0IHdlJ3JlIG92ZXJ3cml0aW5nXG5cdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJkaXNwbGF5XCIsIGRpc3BsYXkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AgdG8gYXZvaWQgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCB2YWx1ZXNbIGluZGV4IF0gIT0gbnVsbCApIHtcblx0XHRcdGVsZW1lbnRzWyBpbmRleCBdLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZXNbIGluZGV4IF07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xuXHR9LFxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcblx0fSxcblx0dG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW5XaXRoaW5UcmVlKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcbnZhciByY2hlY2thYmxlVHlwZSA9ICggL14oPzpjaGVja2JveHxyYWRpbykkL2kgKTtcblxudmFyIHJ0YWdOYW1lID0gKCAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSspL2kgKTtcblxudmFyIHJzY3JpcHRUeXBlID0gKCAvXiR8Xm1vZHVsZSR8XFwvKD86amF2YXxlY21hKXNjcmlwdC9pICk7XG5cblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpXG5cdHZhciByZXQ7XG5cblx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIHtcblx0XHRyZXQgPSBbXTtcblx0fVxuXG5cdGlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufVxuXG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZGF0YVByaXYuc2V0KFxuXHRcdFx0ZWxlbXNbIGkgXSxcblx0XHRcdFwiZ2xvYmFsRXZhbFwiLFxuXHRcdFx0IXJlZkVsZW1lbnRzIHx8IGRhdGFQcml2LmdldCggcmVmRWxlbWVudHNbIGkgXSwgXCJnbG9iYWxFdmFsXCIgKVxuXHRcdCk7XG5cdH1cbn1cblxuXG52YXIgcmh0bWwgPSAvPHwmIz9cXHcrOy87XG5cbmZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24sIGlnbm9yZWQgKSB7XG5cdHZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosXG5cdFx0ZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRub2RlcyA9IFtdLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGVsZW0gPSBlbGVtc1sgaSBdO1xuXG5cdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0aWYgKCB0b1R5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZVxuXHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0dGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O1xuXHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHQvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnRcblx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wLmxhc3RDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMgYXJlIG9ycGhhbmVkICgjMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnRhaW5zID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdHRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgXCJzY3JpcHRcIiApO1xuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGlmICggY29udGFpbnMgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCB0bXAgKTtcblx0XHR9XG5cblx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0aWYgKCBzY3JpcHRzICkge1xuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHtcblx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZyYWdtZW50O1xufVxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICksXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIG9ubHlcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcbn0gKSgpO1xudmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG5cbnZhclxuXHRya2V5RXZlbnQgPSAvXmtleS8sXG5cdHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLFxuXHRydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlxcLiguKyl8KS87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvXG5mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0fSBjYXRjaCAoIGVyciApIHsgfVxufVxuXG5mdW5jdGlvbiBvbiggZWxlbSwgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgb25lICkge1xuXHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRvbiggZWxlbSwgdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cblx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vICggdHlwZXMsIGRhdGEsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRvcmlnRm4gPSBmbjtcblx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9O1xuXG5cdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0fVxuXHRyZXR1cm4gZWxlbS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdH0gKTtcbn1cblxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS5cbiAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuXG4gKi9cbmpRdWVyeS5ldmVudCA9IHtcblxuXHRnbG9iYWw6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHtcblxuXHRcdHZhciBoYW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpXG5cdFx0aWYgKCAhZWxlbURhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZVxuXHRcdC8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KVxuXHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGRvY3VtZW50RWxlbWVudCwgc2VsZWN0b3IgKTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0ge307XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZGF0YSBhbmQgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImhhbmRsZSBldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkge1xuXG5cdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0dmFyIGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggbmF0aXZlRXZlbnQgKTtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaiwgaGFuZGxlclF1ZXVlLFxuXHRcdFx0YXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLFxuXHRcdFx0aGFuZGxlcnMgPSAoIGRhdGFQcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWyAwIF0gPSBldmVudDtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0YXJnc1sgaSBdID0gYXJndW1lbnRzWyBpIF07XG5cdFx0fVxuXG5cdFx0ZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZFxuXHRcdGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBoYW5kbGVyc1xuXHRcdGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTtcblxuXHRcdC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtO1xuXG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSApICYmXG5cdFx0XHRcdCFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRcdC8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2Uocylcblx0XHRcdFx0Ly8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgZXZlbnQucm5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fFxuXHRcdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIgKS5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIGhhbmRsZU9iaiwgc2VsLCBtYXRjaGVkSGFuZGxlcnMsIG1hdGNoZWRTZWxlY3RvcnMsXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTlcblx0XHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICh0cmFjLTEzMTgwKVxuXHRcdFx0Y3VyLm5vZGVUeXBlICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MlxuXHRcdFx0Ly8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKVxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnQtdHlwZS1jbGlja1xuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0Ly8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgXCJjbGlja3NcIiBvZiByYWRpbyBpbnB1dHMsIHdoaWNoIGNhbiBoYXZlIGBidXR0b25gIC0xIChnaC0yMzQzKVxuXHRcdFx0ISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGV2ZW50LmJ1dHRvbiA+PSAxICkgKSB7XG5cblx0XHRcdGZvciAoIDsgY3VyICE9PSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGN1ci5kaXNhYmxlZCA9PT0gdHJ1ZSApICkge1xuXHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycyA9IFtdO1xuXHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnMgPSB7fTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID4gLTEgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggbWF0Y2hlZEhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZWRIYW5kbGVycyB9ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xuXHRcdGN1ciA9IHRoaXM7XG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhhbmRsZXJRdWV1ZTtcblx0fSxcblxuXHRhZGRQcm9wOiBmdW5jdGlvbiggbmFtZSwgaG9vayApIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGpRdWVyeS5FdmVudC5wcm90b3R5cGUsIG5hbWUsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cblx0XHRcdGdldDogaXNGdW5jdGlvbiggaG9vayApID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gOlxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwge1xuXHRcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGZpeDogZnVuY3Rpb24oIG9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0cmV0dXJuIG9yaWdpbmFsRXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0b3JpZ2luYWxFdmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblxuXHRcdFx0Ly8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZFxuXHRcdFx0bm9CdWJibGU6IHRydWVcblx0XHR9LFxuXHRcdGZvY3VzOiB7XG5cblx0XHRcdC8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkge1xuXHRcdFx0XHRcdHRoaXMuZm9jdXMoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNpblwiXG5cdFx0fSxcblx0XHRibHVyOiB7XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuYmx1ciApIHtcblx0XHRcdFx0XHR0aGlzLmJsdXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNvdXRcIlxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblxuXHRcdFx0Ly8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHRcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHRoaXMuY2xpY2soKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5LCBkb24ndCBmaXJlIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rc1xuXHRcdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0cmV0dXJuIG5vZGVOYW1lKCBldmVudC50YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblxuXHQvLyBUaGlzIFwiaWZcIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHNcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUgKTtcblx0fVxufTtcblxualF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7XG5cblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCApICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHlcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdFx0Ly8gQ3JlYXRlIHRhcmdldCBwcm9wZXJ0aWVzXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDw9NiAtIDcgb25seVxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0dGhpcy50YXJnZXQgPSAoIHNyYy50YXJnZXQgJiYgc3JjLnRhcmdldC5ub2RlVHlwZSA9PT0gMyApID9cblx0XHRcdHNyYy50YXJnZXQucGFyZW50Tm9kZSA6XG5cdFx0XHRzcmMudGFyZ2V0O1xuXG5cdFx0dGhpcy5jdXJyZW50VGFyZ2V0ID0gc3JjLmN1cnJlbnRUYXJnZXQ7XG5cdFx0dGhpcy5yZWxhdGVkVGFyZ2V0ID0gc3JjLnJlbGF0ZWRUYXJnZXQ7XG5cblx0Ly8gRXZlbnQgdHlwZVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMudHlwZSA9IHNyYztcblx0fVxuXG5cdC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XG5cdGlmICggcHJvcHMgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBpbmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lXG5cdHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTtcblxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXG5cdHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlO1xufTtcblxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LFxuXHRpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNTaW11bGF0ZWQ6IGZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cbn07XG5cbi8vIEluY2x1ZGVzIGFsbCBjb21tb24gZXZlbnQgcHJvcHMgaW5jbHVkaW5nIEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50IHNwZWNpZmljIHByb3BzXG5qUXVlcnkuZWFjaCgge1xuXHRhbHRLZXk6IHRydWUsXG5cdGJ1YmJsZXM6IHRydWUsXG5cdGNhbmNlbGFibGU6IHRydWUsXG5cdGNoYW5nZWRUb3VjaGVzOiB0cnVlLFxuXHRjdHJsS2V5OiB0cnVlLFxuXHRkZXRhaWw6IHRydWUsXG5cdGV2ZW50UGhhc2U6IHRydWUsXG5cdG1ldGFLZXk6IHRydWUsXG5cdHBhZ2VYOiB0cnVlLFxuXHRwYWdlWTogdHJ1ZSxcblx0c2hpZnRLZXk6IHRydWUsXG5cdHZpZXc6IHRydWUsXG5cdFwiY2hhclwiOiB0cnVlLFxuXHRjaGFyQ29kZTogdHJ1ZSxcblx0a2V5OiB0cnVlLFxuXHRrZXlDb2RlOiB0cnVlLFxuXHRidXR0b246IHRydWUsXG5cdGJ1dHRvbnM6IHRydWUsXG5cdGNsaWVudFg6IHRydWUsXG5cdGNsaWVudFk6IHRydWUsXG5cdG9mZnNldFg6IHRydWUsXG5cdG9mZnNldFk6IHRydWUsXG5cdHBvaW50ZXJJZDogdHJ1ZSxcblx0cG9pbnRlclR5cGU6IHRydWUsXG5cdHNjcmVlblg6IHRydWUsXG5cdHNjcmVlblk6IHRydWUsXG5cdHRhcmdldFRvdWNoZXM6IHRydWUsXG5cdHRvRWxlbWVudDogdHJ1ZSxcblx0dG91Y2hlczogdHJ1ZSxcblxuXHR3aGljaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBidXR0b24gPSBldmVudC5idXR0b247XG5cblx0XHQvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHNcblx0XHRpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHtcblx0XHRcdHJldHVybiBldmVudC5jaGFyQ29kZSAhPSBudWxsID8gZXZlbnQuY2hhckNvZGUgOiBldmVudC5rZXlDb2RlO1xuXHRcdH1cblxuXHRcdC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcblx0XHRpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCAmJiBybW91c2VFdmVudC50ZXN0KCBldmVudC50eXBlICkgKSB7XG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDEgKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDIgKSB7XG5cdFx0XHRcdHJldHVybiAzO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDQgKSB7XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQud2hpY2g7XG5cdH1cbn0sIGpRdWVyeS5ldmVudC5hZGRQcm9wICk7XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gc28gdGhhdCBldmVudCBkZWxlZ2F0aW9uIHdvcmtzIGluIGpRdWVyeS5cbi8vIERvIHRoZSBzYW1lIGZvciBwb2ludGVyZW50ZXIvcG9pbnRlcmxlYXZlIGFuZCBwb2ludGVyb3Zlci9wb2ludGVyb3V0XG4vL1xuLy8gU3VwcG9ydDogU2FmYXJpIDcgb25seVxuLy8gU2FmYXJpIHNlbmRzIG1vdXNlZW50ZXIgdG9vIG9mdGVuOyBzZWU6XG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNThcbi8vIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGJ1ZyAoaXQgZXhpc3RlZCBpbiBvbGRlciBDaHJvbWUgdmVyc2lvbnMgYXMgd2VsbCkuXG5qUXVlcnkuZWFjaCgge1xuXHRtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuXHRtb3VzZWxlYXZlOiBcIm1vdXNlb3V0XCIsXG5cdHBvaW50ZXJlbnRlcjogXCJwb2ludGVyb3ZlclwiLFxuXHRwb2ludGVybGVhdmU6IFwicG9pbnRlcm91dFwiXG59LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0ge1xuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxuXHRcdGJpbmRUeXBlOiBmaXgsXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXQsXG5cdFx0XHRcdHRhcmdldCA9IHRoaXMsXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxuXHRcdFx0XHRoYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7XG5cblx0XHRcdC8vIEZvciBtb3VzZWVudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuXG5cdFx0XHQvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvd1xuXHRcdFx0aWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkge1xuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xuXHRcdFx0XHRyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBmaXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID9cblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUgKyBcIi5cIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOlxuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzIFssIGZuXSApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxudmFyXG5cblx0LyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9pc3N1ZXMvMzIyOVxuXHRyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopW14+XSopXFwvPi9naSxcblxuXHQvKiBlc2xpbnQtZW5hYmxlICovXG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExLCBFZGdlIDEyIC0gMTMgb25seVxuXHQvLyBJbiBJRS9FZGdlIHVzaW5nIHJlZ2V4IGdyb3VwcyBoZXJlIGNhdXNlcyBzZXZlcmUgc2xvd2Rvd25zLlxuXHQvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyL1xuXHRybm9Jbm5lcmh0bWwgPSAvPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxcblxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2c7XG5cbi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93c1xuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdG5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlICE9PSAxMSA/IGNvbnRlbnQgOiBjb250ZW50LmZpcnN0Q2hpbGQsIFwidHJcIiApICkge1xuXG5cdFx0cmV0dXJuIGpRdWVyeSggZWxlbSApLmNoaWxkcmVuKCBcInRib2R5XCIgKVsgMCBdIHx8IGVsZW07XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvblxuZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHtcblx0ZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggXCJ0eXBlXCIgKSAhPT0gbnVsbCApICsgXCIvXCIgKyBlbGVtLnR5cGU7XG5cdHJldHVybiBlbGVtO1xufVxuZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHtcblx0aWYgKCAoIGVsZW0udHlwZSB8fCBcIlwiICkuc2xpY2UoIDAsIDUgKSA9PT0gXCJ0cnVlL1wiICkge1xuXHRcdGVsZW0udHlwZSA9IGVsZW0udHlwZS5zbGljZSggNSApO1xuXHR9IGVsc2Uge1xuXHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBcInR5cGVcIiApO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBpLCBsLCB0eXBlLCBwZGF0YU9sZCwgcGRhdGFDdXIsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFQcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YVByaXYuYWNjZXNzKCBzcmMgKTtcblx0XHRwZGF0YUN1ciA9IGRhdGFQcml2LnNldCggZGVzdCwgcGRhdGFPbGQgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRlbGV0ZSBwZGF0YUN1ci5oYW5kbGU7XG5cdFx0XHRwZGF0YUN1ci5ldmVudHMgPSB7fTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YVVzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhVXNlci5hY2Nlc3MoIHNyYyApO1xuXHRcdHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xkICk7XG5cblx0XHRkYXRhVXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gZG9tTWFuaXAoIGNvbGxlY3Rpb24sIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICkge1xuXG5cdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0YXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTtcblxuXHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuXHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gfHxcblx0XHRcdCggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdHJldHVybiBjb2xsZWN0aW9uLmVhY2goIGZ1bmN0aW9uKCBpbmRleCApIHtcblx0XHRcdHZhciBzZWxmID0gY29sbGVjdGlvbi5lcSggaW5kZXggKTtcblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRub2RlID0gZnJhZ21lbnQ7XG5cblx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHQvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgJiYgKCBub2RlLnR5cGUgfHwgXCJcIiApLnRvTG93ZXJDYXNlKCkgICE9PSBcIm1vZHVsZVwiICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5fZXZhbFVybCggbm9kZS5zcmMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0RE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKSwgZG9jLCBub2RlICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBEYXRhICkge1xuXHR2YXIgbm9kZSxcblx0XHRub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdGlmICggIWtlZXBEYXRhICYmIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIG5vZGUgKSApO1xuXHRcdH1cblxuXHRcdGlmICggbm9kZS5wYXJlbnROb2RlICkge1xuXHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIG5vZGUub3duZXJEb2N1bWVudCwgbm9kZSApICkge1xuXHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0fVxuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBub2RlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aHRtbFByZWZpbHRlcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0cmV0dXJuIGh0bWwucmVwbGFjZSggcnhodG1sVGFnLCBcIjwkMT48LyQyPlwiICk7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHR2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cyxcblx0XHRcdGNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKSxcblx0XHRcdGluUGFnZSA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHQvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXNcblx0XHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmXG5cdFx0XHRcdCFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBodHRwczovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblx0XHR2YXIgZGF0YSwgZWxlbSwgdHlwZSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT09IHVuZGVmaW5lZDsgaSsrICkge1xuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGlmICggKCBkYXRhID0gZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbFsgdHlwZSBdICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaWdub3JlZCA9IFtdO1xuXG5cdFx0Ly8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggbm9uLWlnbm9yZWQgY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggdGhpcywgaWdub3JlZCApIDwgMCApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTtcblx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uXG5cdFx0fSwgaWdub3JlZCApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCB7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0Ly8gLmdldCgpIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0cHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7XG5cdH07XG59ICk7XG52YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSg/IXB4KVthLXolXSskXCIsIFwiaVwiICk7XG5cbnZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seSwgRmlyZWZveCA8PTMwICgjMTUwOTgsICMxNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHR2YXIgdmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkge1xuXHRcdFx0dmlldyA9IHdpbmRvdztcblx0XHR9XG5cblx0XHRyZXR1cm4gdmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG5cdH07XG5cbnZhciByYm94U3R5bGUgPSBuZXcgUmVnRXhwKCBjc3NFeHBhbmQuam9pbiggXCJ8XCIgKSwgXCJpXCIgKTtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXG5cdFx0Ly8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZVxuXHRcdGlmICggIWRpdiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O1wiICtcblx0XHRcdFwibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowXCI7XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7XCIgK1xuXHRcdFx0XCJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O1wiICtcblx0XHRcdFwid2lkdGg6NjAlO3RvcDoxJVwiO1xuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdFx0dmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3AgIT09IFwiMSVcIjtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gNDRcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSByb3VuZFBpeGVsTWVhc3VyZXMoIGRpdlN0eWxlLm1hcmdpbkxlZnQgKSA9PT0gMTI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjNcblx0XHQvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3Rcblx0XHRkaXYuc3R5bGUucmlnaHQgPSBcIjYwJVwiO1xuXHRcdHBpeGVsQm94U3R5bGVzVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5yaWdodCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdFx0Ly8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50c1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdC8vIERldGVjdCBvdmVyZmxvdzpzY3JvbGwgc2NyZXdpbmVzcyAoZ2gtMzY5OSlcblx0XHRkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0c2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgXCJhYnNvbHV0ZVwiO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdC8vIE51bGxpZnkgdGhlIGRpdiBzbyBpdCB3b3VsZG4ndCBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeSBhbmRcblx0XHQvLyBpdCB3aWxsIGFsc28gYmUgYSBzaWduIHRoYXQgY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7XG5cdH1cblxuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsIHNjcm9sbGJveFNpemVWYWwsIHBpeGVsQm94U3R5bGVzVmFsLFxuXHRcdHJlbGlhYmxlTWFyZ2luTGVmdFZhbCxcblx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICksXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdC8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzXG5cdGlmICggIWRpdi5zdHlsZSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdC8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOClcblx0ZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJjb250ZW50LWJveFwiO1xuXHRkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcIlwiO1xuXHRzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gXCJjb250ZW50LWJveFwiO1xuXG5cdGpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHtcblx0XHRib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxCb3hTdHlsZXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbEJveFN0eWxlc1ZhbDtcblx0XHR9LFxuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5MZWZ0VmFsO1xuXHRcdH0sXG5cdFx0c2Nyb2xsYm94U2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHNjcm9sbGJveFNpemVWYWw7XG5cdFx0fVxuXHR9ICk7XG59ICkoKTtcblxuXG5mdW5jdGlvbiBjdXJDU1MoIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA1MStcblx0XHQvLyBSZXRyaWV2aW5nIHN0eWxlIGJlZm9yZSBjb21wdXRlZCBzb21laG93XG5cdFx0Ly8gZml4ZXMgYW4gaXNzdWUgd2l0aCBnZXR0aW5nIHdyb25nIHZhbHVlc1xuXHRcdC8vIG9uIGRldGFjaGVkIGVsZW1lbnRzXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdGNvbXB1dGVkID0gY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7XG5cblx0Ly8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBuZWVkZWQgZm9yOlxuXHQvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNylcblx0Ly8gICAuY3NzKCctLWN1c3RvbVByb3BlcnR5KSAoIzMxNDQpXG5cdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0cmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF07XG5cblx0XHRpZiAoIHJldCA9PT0gXCJcIiAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHtcblx0XHRcdHJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBBbmRyb2lkIEJyb3dzZXIgcmV0dXJucyBwZXJjZW50YWdlIGZvciBzb21lIHZhbHVlcyxcblx0XHQvLyBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzLlxuXHRcdC8vIFRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQgc3BlYzpcblx0XHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI3Jlc29sdmVkLXZhbHVlc1xuXHRcdGlmICggIXN1cHBvcnQucGl4ZWxCb3hTdHlsZXMoKSAmJiBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcmJveFN0eWxlLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuXHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcblx0XHRcdG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7XG5cdFx0XHRtYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoO1xuXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7XG5cdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcblxuXHRcdFx0Ly8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7XG5cdFx0XHRzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXQgKyBcIlwiIDpcblx0XHRyZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkge1xuXG5cdC8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggY29uZGl0aW9uRm4oKSApIHtcblxuXHRcdFx0XHQvLyBIb29rIG5vdCBuZWVkZWQgKG9yIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBpdCBkdWVcblx0XHRcdFx0Ly8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRkZWxldGUgdGhpcy5nZXQ7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSG9vayBuZWVkZWQ7IHJlZGVmaW5lIGl0IHNvIHRoYXQgdGhlIHN1cHBvcnQgdGVzdCBpcyBub3QgZXhlY3V0ZWQgYWdhaW4uXG5cdFx0XHRyZXR1cm4gKCB0aGlzLmdldCA9IGhvb2tGbiApLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG59XG5cblxudmFyXG5cblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZVxuXHQvLyBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0cmN1c3RvbVByb3AgPSAvXi0tLyxcblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH0sXG5cblx0Y3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIiBdLFxuXHRlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLnN0eWxlO1xuXG4vLyBSZXR1cm4gYSBjc3MgcHJvcGVydHkgbWFwcGVkIHRvIGEgcG90ZW50aWFsbHkgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5XG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHtcblxuXHQvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZFxuXHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRyZXR1cm4gbmFtZTtcblx0fVxuXG5cdC8vIENoZWNrIGZvciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXNcblx0dmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSxcblx0XHRpID0gY3NzUHJlZml4ZXMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTtcblx0XHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRcdHJldHVybiBuYW1lO1xuXHRcdH1cblx0fVxufVxuXG4vLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG9cbi8vIGEgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5LlxuZnVuY3Rpb24gZmluYWxQcm9wTmFtZSggbmFtZSApIHtcblx0dmFyIHJldCA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdO1xuXHRpZiAoICFyZXQgKSB7XG5cdFx0cmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7XG5cdH1cblx0cmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApIHtcblxuXHQvLyBBbnkgcmVsYXRpdmUgKCsvLSkgdmFsdWVzIGhhdmUgYWxyZWFkeSBiZWVuXG5cdC8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludFxuXHR2YXIgbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKTtcblx0cmV0dXJuIG1hdGNoZXMgP1xuXG5cdFx0Ly8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgXCJzdWJ0cmFjdFwiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3Ncblx0XHRNYXRoLm1heCggMCwgbWF0Y2hlc1sgMiBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApIDpcblx0XHR2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7XG5cdHZhciBpID0gZGltZW5zaW9uID09PSBcIndpZHRoXCIgPyAxIDogMCxcblx0XHRleHRyYSA9IDAsXG5cdFx0ZGVsdGEgPSAwO1xuXG5cdC8vIEFkanVzdG1lbnQgbWF5IG5vdCBiZSBuZWNlc3Nhcnlcblx0aWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHtcblxuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpblxuXHRcdGlmICggYm94ID09PSBcIm1hcmdpblwiICkge1xuXHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgYm94ICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBjb250ZW50LWJveCwgd2UncmUgc2Vla2luZyBcInBhZGRpbmdcIiBvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCJcblx0XHRpZiAoICFpc0JvcmRlckJveCApIHtcblxuXHRcdFx0Ly8gQWRkIHBhZGRpbmdcblx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBGb3IgXCJib3JkZXJcIiBvciBcIm1hcmdpblwiLCBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJwYWRkaW5nXCIgKSB7XG5cdFx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgXCJjb250ZW50XCIgb3Jcblx0XHQvLyBcInBhZGRpbmdcIiBvciBcIm1hcmdpblwiXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRm9yIFwiY29udGVudFwiLCBzdWJ0cmFjdCBwYWRkaW5nXG5cdFx0XHRpZiAoIGJveCA9PT0gXCJjb250ZW50XCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIgb3IgXCJwYWRkaW5nXCIsIHN1YnRyYWN0IGJvcmRlclxuXHRcdFx0aWYgKCBib3ggIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWxcblx0aWYgKCAhaXNCb3JkZXJCb3ggJiYgY29tcHV0ZWRWYWwgPj0gMCApIHtcblxuXHRcdC8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXJcblx0XHQvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duXG5cdFx0ZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbChcblx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRjb21wdXRlZFZhbCAtXG5cdFx0XHRkZWx0YSAtXG5cdFx0XHRleHRyYSAtXG5cdFx0XHQwLjVcblx0XHQpICk7XG5cdH1cblxuXHRyZXR1cm4gZGVsdGE7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZVxuXHR2YXIgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBkaW1lbnNpb24sIHN0eWxlcyApLFxuXHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7XG5cblx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTU0XG5cdC8vIFJldHVybiBhIGNvbmZvdW5kaW5nIG5vbi1waXhlbCB2YWx1ZSBvciBmZWlnbiBpZ25vcmFuY2UsIGFzIGFwcHJvcHJpYXRlLlxuXHRpZiAoIHJudW1ub25weC50ZXN0KCB2YWwgKSApIHtcblx0XHRpZiAoICFleHRyYSApIHtcblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fVxuXHRcdHZhbCA9IFwiYXV0b1wiO1xuXHR9XG5cblx0Ly8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcblx0Ly8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZVxuXHR2YWx1ZUlzQm9yZGVyQm94ID0gdmFsdWVJc0JvcmRlckJveCAmJlxuXHRcdCggc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gKTtcblxuXHQvLyBGYWxsIGJhY2sgdG8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IHdoZW4gdmFsdWUgaXMgXCJhdXRvXCJcblx0Ly8gVGhpcyBoYXBwZW5zIGZvciBpbmxpbmUgZWxlbWVudHMgd2l0aCBubyBleHBsaWNpdCBzZXR0aW5nIChnaC0zNTcxKVxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIC0gNC4zIG9ubHlcblx0Ly8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMilcblx0aWYgKCB2YWwgPT09IFwiYXV0b1wiIHx8XG5cdFx0IXBhcnNlRmxvYXQoIHZhbCApICYmIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiaW5saW5lXCIgKSB7XG5cblx0XHR2YWwgPSBlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF07XG5cblx0XHQvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlc1xuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlO1xuXHR9XG5cblx0Ly8gTm9ybWFsaXplIFwiXCIgYW5kIGF1dG9cblx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcblxuXHQvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsXG5cdHJldHVybiAoIHZhbCArXG5cdFx0Ym94TW9kZWxBZGp1c3RtZW50KFxuXHRcdFx0ZWxlbSxcblx0XHRcdGRpbWVuc2lvbixcblx0XHRcdGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSxcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3gsXG5cdFx0XHRzdHlsZXMsXG5cblx0XHRcdC8vIFByb3ZpZGUgdGhlIGN1cnJlbnQgY29tcHV0ZWQgc2l6ZSB0byByZXF1ZXN0IHNjcm9sbCBndXR0ZXIgY2FsY3VsYXRpb24gKGdoLTM1ODkpXG5cdFx0XHR2YWxcblx0XHQpXG5cdCkgKyBcInB4XCI7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnRcIjogdHJ1ZSxcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImxpbmVIZWlnaHRcIjogdHJ1ZSxcblx0XHRcIm9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcIm9yZGVyXCI6IHRydWUsXG5cdFx0XCJvcnBoYW5zXCI6IHRydWUsXG5cdFx0XCJ3aWRvd3NcIjogdHJ1ZSxcblx0XHRcInpJbmRleFwiOiB0cnVlLFxuXHRcdFwiem9vbVwiOiB0cnVlXG5cdH0sXG5cblx0Ly8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZVxuXHQvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlXG5cdGNzc1Byb3BzOiB7fSxcblxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxuXHRzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHtcblxuXHRcdC8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdHZhciByZXQsIHR5cGUsIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBjYW1lbENhc2UoIG5hbWUgKSxcblx0XHRcdGlzQ3VzdG9tUHJvcCA9IHJjdXN0b21Qcm9wLnRlc3QoIG5hbWUgKSxcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3Rcblx0XHQvLyB3YW50IHRvIHF1ZXJ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb25cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZVxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRcdC8vIENvbnZlcnQgXCIrPVwiIG9yIFwiLT1cIiB0byByZWxhdGl2ZSBudW1iZXJzICgjNzM0NSlcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAoIHJldCA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmIHJldFsgMSBdICkge1xuXHRcdFx0XHR2YWx1ZSA9IGFkanVzdENTUyggZWxlbSwgbmFtZSwgcmV0ICk7XG5cblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKCM3MTE2KVxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgdGhlIHVuaXQgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcylcblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8XG5cdFx0XHRcdCggdmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0XHRzdHlsZS5zZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3Rcblx0XHRcdHJldHVybiBzdHlsZVsgbmFtZSBdO1xuXHRcdH1cblx0fSxcblxuXHRjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkge1xuXHRcdHZhciB2YWwsIG51bSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZVxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcblx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IFwibm9ybWFsXCIgdG8gY29tcHV0ZWQgdmFsdWVcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcblx0XHRcdHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIE1ha2UgbnVtZXJpYyBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xuXHRcdGlmICggZXh0cmEgPT09IFwiXCIgfHwgZXh0cmEgKSB7XG5cdFx0XHRudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTtcblx0XHRcdHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggaSwgZGltZW5zaW9uICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0Ly8gQ2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXG5cdFx0XHRcdC8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0XG5cdFx0XHRcdHJldHVybiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICYmXG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCtcblx0XHRcdFx0XHQvLyBUYWJsZSBjb2x1bW5zIGluIFNhZmFyaSBoYXZlIG5vbi16ZXJvIG9mZnNldFdpZHRoICYgemVyb1xuXHRcdFx0XHRcdC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHVubGVzcyBkaXNwbGF5IGlzIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0XHRcdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHRcdFx0XHRcdC8vIGluIElFIHRocm93cyBhbiBlcnJvci5cblx0XHRcdFx0XHQoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoIHx8ICFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICkgP1xuXHRcdFx0XHRcdFx0c3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7XG5cdFx0XHR2YXIgbWF0Y2hlcyxcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0XHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0c3VidHJhY3QgPSBleHRyYSAmJiBib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRkaW1lbnNpb24sXG5cdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0aXNCb3JkZXJCb3gsXG5cdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdCk7XG5cblx0XHRcdC8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZFxuXHRcdFx0Ly8gZmFraW5nIGEgY29udGVudC1ib3ggdG8gZ2V0IGJvcmRlciBhbmQgcGFkZGluZyAoZ2gtMzY5OSlcblx0XHRcdGlmICggaXNCb3JkZXJCb3ggJiYgc3VwcG9ydC5zY3JvbGxib3hTaXplKCkgPT09IHN0eWxlcy5wb3NpdGlvbiApIHtcblx0XHRcdFx0c3VidHJhY3QgLT0gTWF0aC5jZWlsKFxuXHRcdFx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRcdFx0cGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC1cblx0XHRcdFx0XHRib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgXCJib3JkZXJcIiwgZmFsc2UsIHN0eWxlcyApIC1cblx0XHRcdFx0XHQwLjVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCB0byBwaXhlbHMgaWYgdmFsdWUgYWRqdXN0bWVudCBpcyBuZWVkZWRcblx0XHRcdGlmICggc3VidHJhY3QgJiYgKCBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiZcblx0XHRcdFx0KCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgIT09IFwicHhcIiApIHtcblxuXHRcdFx0XHRlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSA9IHZhbHVlO1xuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5jc3MoIGVsZW0sIGRpbWVuc2lvbiApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApO1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LFxuXHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdHJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIgKSApIHx8XG5cdFx0XHRcdGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXG5cdFx0XHRcdFx0c3dhcCggZWxlbSwgeyBtYXJnaW5MZWZ0OiAwIH0sIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KSArIFwicHhcIjtcblx0XHR9XG5cdH1cbik7XG5cbi8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXNcbmpRdWVyeS5lYWNoKCB7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS5zcGxpdCggXCIgXCIgKSA6IFsgdmFsdWUgXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgNDsgaSsrICkge1xuXHRcdFx0XHRleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9XG5cdFx0XHRcdFx0cGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXhwYW5kZWQ7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICggcHJlZml4ICE9PSBcIm1hcmdpblwiICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fVxufSApO1xuXG5cbmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHtcblx0cmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTtcbn1cbmpRdWVyeS5Ud2VlbiA9IFR3ZWVuO1xuXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBUd2Vlbixcblx0aW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkge1xuXHRcdHRoaXMuZWxlbSA9IGVsZW07XG5cdFx0dGhpcy5wcm9wID0gcHJvcDtcblx0XHR0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0O1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0Ly8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCxcblx0XHRcdC8vIG9yIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc3R5bGUgcHJvcGVydHkgdGhhdCBleGlzdHMuXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgIT09IDEgfHxcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07XG5cdFx0XHR9XG5cblx0XHRcdC8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseVxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscy5cblx0XHRcdC8vIFNpbXBsZSB2YWx1ZXMgc3VjaCBhcyBcIjEwcHhcIiBhcmUgcGFyc2VkIHRvIEZsb2F0O1xuXHRcdFx0Ly8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyBcInJvdGF0ZSgxcmFkKVwiIGFyZSByZXR1cm5lZCBhcy1pcy5cblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIFwiXCIgKTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fSxcblx0X2RlZmF1bHQ6IFwic3dpbmdcIlxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgY29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIGluUHJvZ3Jlc3MsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLztcblxuZnVuY3Rpb24gc2NoZWR1bGUoKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHtcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHNjaGVkdWxlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBzY2hlZHVsZSwgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdFx0fVxuXG5cdFx0alF1ZXJ5LmZ4LnRpY2soKTtcblx0fVxufVxuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LFxuXHRcdGlzQm94ID0gXCJ3aWR0aFwiIGluIHByb3BzIHx8IFwiaGVpZ2h0XCIgaW4gcHJvcHMsXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIFByZXRlbmQgdG8gYmUgaGlkZGVuIGlmIHRoaXMgaXMgYSBcInNob3dcIiBhbmRcblx0XHRcdFx0Ly8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gSWdub3JlIGFsbCBvdGhlciBuby1vcCBzaG93L2hpZGUgZGF0YVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpXG5cdHByb3BUd2VlbiA9ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcHMgKTtcblx0aWYgKCAhcHJvcFR3ZWVuICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVzdHJpY3QgXCJvdmVyZmxvd1wiIGFuZCBcImRpc3BsYXlcIiBzdHlsZXMgZHVyaW5nIGJveCBhbmltYXRpb25zXG5cdGlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90IGluZmVyIHRoZSBzaG9ydGhhbmRcblx0XHQvLyBmcm9tIGlkZW50aWNhbGx5LXZhbHVlZCBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WSBhbmQgRWRnZSBqdXN0IG1pcnJvcnNcblx0XHQvLyB0aGUgb3ZlcmZsb3dYIHZhbHVlIHRoZXJlLlxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gSWRlbnRpZnkgYSBkaXNwbGF5IHR5cGUsIHByZWZlcnJpbmcgb2xkIHNob3cvaGlkZSBkYXRhIG92ZXIgdGhlIENTUyBjYXNjYWRlXG5cdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhU2hvdyAmJiBkYXRhU2hvdy5kaXNwbGF5O1xuXHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdH1cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSApIHtcblx0XHRcdFx0ZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBHZXQgbm9uZW1wdHkgdmFsdWUocykgYnkgdGVtcG9yYXJpbHkgZm9yY2luZyB2aXNpYmlsaXR5XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSB8fCByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFuaW1hdGUgaW5saW5lIGVsZW1lbnRzIGFzIGlubGluZS1ibG9ja1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJpbmxpbmVcIiB8fCBkaXNwbGF5ID09PSBcImlubGluZS1ibG9ja1wiICYmIHJlc3RvcmVEaXNwbGF5ICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblxuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlIGF0IHRoZSBlbmQgb2YgcHVyZSBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRcdFx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG5cdFx0XHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGRpc3BsYXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSW1wbGVtZW50IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdHByb3BUd2VlbiA9IGZhbHNlO1xuXHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cblx0XHQvLyBHZW5lcmFsIHNob3cvaGlkZSBzZXR1cCBmb3IgdGhpcyBlbGVtZW50IGFuaW1hdGlvblxuXHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7IGRpc3BsYXk6IHJlc3RvcmVEaXNwbGF5IH0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RvcmUgaGlkZGVuL3Zpc2libGUgZm9yIHRvZ2dsZSBzbyBgLnN0b3AoKS50b2dnbGUoKWAgXCJyZXZlcnNlc1wiXG5cdFx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW1cblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdFx0Ly8gVGhlIGZpbmFsIHN0ZXAgb2YgYSBcImhpZGVcIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50XG5cdFx0XHRcdGlmICggIWhpZGRlbiApIHtcblx0XHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBQZXItcHJvcGVydHkgc2V0dXBcblx0XHRwcm9wVHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblx0XHRpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHtcblx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0cHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdFx0cHJvcFR3ZWVuLnN0YXJ0ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBBbmltYXRpb24ucHJlZmlsdGVycy5sZW5ndGgsXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSApLFxuXHRcdHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdFx0cmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLFxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHlcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbW9yZSB0byBkbywgeWllbGRcblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIHdhcyBhbiBlbXB0eSBhbmltYXRpb24sIHN5bnRoZXNpemUgYSBmaW5hbCBwcm9ncmVzcyBub3RpZmljYXRpb25cblx0XHRcdGlmICggIWxlbmd0aCApIHtcblx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNvbHZlIHRoZSBhbmltYXRpb24gYW5kIHJlcG9ydCBpdHMgY29uY2x1c2lvblxuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRcdGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcgKTtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApO1xuXHRcdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0XHR9LFxuXHRcdFx0c3RvcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7XG5cdFx0XHRcdHZhciBpbmRleCA9IDAsXG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSApLFxuXHRcdHByb3BzID0gYW5pbWF0aW9uLnByb3BzO1xuXG5cdHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApO1xuXHRcdGlmICggcmVzdWx0ICkge1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCByZXN1bHQuc3RvcCApICkge1xuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPVxuXHRcdFx0XHRcdHJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cdH1cblxuXHRqUXVlcnkubWFwKCBwcm9wcywgY3JlYXRlVHdlZW4sIGFuaW1hdGlvbiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdC8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXG5cdGFuaW1hdGlvblxuXHRcdC5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxuXHRcdC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApXG5cdFx0LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKVxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSApXG5cdCk7XG5cblx0cmV0dXJuIGFuaW1hdGlvbjtcbn1cblxualF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwge1xuXG5cdHR3ZWVuZXJzOiB7XG5cdFx0XCIqXCI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdFx0dmFyIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2VlbiggcHJvcCwgdmFsdWUgKTtcblx0XHRcdGFkanVzdENTUyggdHdlZW4uZWxlbSwgcHJvcCwgcmNzc051bS5leGVjKCB2YWx1ZSApLCB0d2VlbiApO1xuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH0gXVxuXHR9LFxuXG5cdHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBwcm9wcyApICkge1xuXHRcdFx0Y2FsbGJhY2sgPSBwcm9wcztcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wcyA9IHByb3BzLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0cHJvcCA9IHByb3BzWyBpbmRleCBdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gPSBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZWZpbHRlcnM6IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXG5cdHByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkge1xuXHRcdGlmICggcHJlcGVuZCApIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcblx0dmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gXCJvYmplY3RcIiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDoge1xuXHRcdGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8XG5cdFx0XHRpc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLFxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcblx0XHRlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xuXHR9O1xuXG5cdC8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZlxuXHRpZiAoIGpRdWVyeS5meC5vZmYgKSB7XG5cdFx0b3B0LmR1cmF0aW9uID0gMDtcblxuXHR9IGVsc2Uge1xuXHRcdGlmICggdHlwZW9mIG9wdC5kdXJhdGlvbiAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdGlmICggb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgKSB7XG5cdFx0XHRcdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+IFwiZnhcIlxuXHRpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHtcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XG5cdH1cblxuXHQvLyBRdWV1ZWluZ1xuXHRvcHQub2xkID0gb3B0LmNvbXBsZXRlO1xuXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW5XaXRoaW5UcmVlICkuY3NzKCBcIm9wYWNpdHlcIiwgMCApLnNob3coKVxuXG5cdFx0XHQvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWRcblx0XHRcdC5lbmQoKS5hbmltYXRlKCB7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdFxuXHRcdFx0XHR2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7XG5cblx0XHRcdFx0Ly8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5XG5cdFx0XHRcdGlmICggZW1wdHkgfHwgZGF0YVByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkZXF1ZXVlID0gdHJ1ZSxcblx0XHRcdFx0aW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArIFwicXVldWVIb29rc1wiLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJlxuXHRcdFx0XHRcdCggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkge1xuXG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXHRmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdGlmICggdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICksXG5cdFx0XHRcdHF1ZXVlID0gZGF0YVsgdHlwZSArIFwicXVldWVcIiBdLFxuXHRcdFx0XHRob29rcyA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlSG9va3NcIiBdLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7XG5cblx0XHRcdC8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGFcblx0XHRcdGRhdGEuZmluaXNoID0gdHJ1ZTtcblxuXHRcdFx0Ly8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0XG5cdFx0XHRqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7XG5cblx0XHRcdGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHtcblx0XHRcdFx0aG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9ucywgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYW5pbWF0aW9ucyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7XG5cdFx0XHRcdFx0cXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZ1xuXHRcdFx0ZGVsZXRlIGRhdGEuZmluaXNoO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcInRvZ2dsZVwiLCBcInNob3dcIiwgXCJoaWRlXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09IFwiYm9vbGVhblwiID9cblx0XHRcdGNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6XG5cdFx0XHR0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKCB7XG5cdHNsaWRlRG93bjogZ2VuRngoIFwic2hvd1wiICksXG5cdHNsaWRlVXA6IGdlbkZ4KCBcImhpZGVcIiApLFxuXHRzbGlkZVRvZ2dsZTogZ2VuRngoIFwidG9nZ2xlXCIgKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS50aW1lcnMgPSBbXTtcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XG5cdHZhciB0aW1lcixcblx0XHRpID0gMCxcblx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzO1xuXG5cdGZ4Tm93ID0gRGF0ZS5ub3coKTtcblxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0dGltZXIgPSB0aW1lcnNbIGkgXTtcblxuXHRcdC8vIFJ1biB0aGUgdGltZXIgYW5kIHNhZmVseSByZW1vdmUgaXQgd2hlbiBkb25lIChhbGxvd2luZyBmb3IgZXh0ZXJuYWwgcmVtb3ZhbClcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRqUXVlcnkuZnguc3RhcnQoKTtcbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xualF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpblByb2dyZXNzID0gdHJ1ZTtcblx0c2NoZWR1bGUoKTtcbn07XG5cbmpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdGluUHJvZ3Jlc3MgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXG5qUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHtcblx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcblx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7XG5cdFx0dmFyIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggbmV4dCwgdGltZSApO1xuXHRcdGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXQgKTtcblx0XHR9O1xuXHR9ICk7XG59O1xuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2VsZWN0XCIgKSxcblx0XHRvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib3B0aW9uXCIgKSApO1xuXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5XG5cdC8vIERlZmF1bHQgdmFsdWUgZm9yIGEgY2hlY2tib3ggc2hvdWxkIGJlIFwib25cIlxuXHRzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gXCJcIjtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3Rcblx0c3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gQW4gaW5wdXQgbG9zZXMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQudHlwZSA9IFwicmFkaW9cIjtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSApKCk7XG5cblxudmFyIGJvb2xIb29rLFxuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEF0dHJpYnV0ZSBob29rcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbG93ZXJjYXNlIHZlcnNpb25cblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IHVuZGVmaW5lZCApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkXG5cdFx0cmV0dXJuIHJldCA9PSBudWxsID8gdW5kZWZpbmVkIDogcmV0O1xuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdG5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZWxlbS52YWx1ZTtcblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIHZhbHVlICk7XG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnZhbHVlID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdHZhciBuYW1lLFxuXHRcdFx0aSA9IDAsXG5cblx0XHRcdC8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnNcblx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuXHRcdFx0YXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKTtcblxuXHRcdGlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHR3aGlsZSAoICggbmFtZSA9IGF0dHJOYW1lc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xuYm9vbEhvb2sgPSB7XG5cdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZTtcblx0fVxufTtcblxualF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXFx3Ky9nICksIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHR2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7XG5cblx0YXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciByZXQsIGhhbmRsZSxcblx0XHRcdGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRpZiAoICFpc1hNTCApIHtcblxuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRsb3dlcmNhc2VOYW1lIDpcblx0XHRcdFx0bnVsbDtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn0gKTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF07XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbGVtWyBuYW1lIF07XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGVcblx0XHRcdFx0Ly8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XG5cdFx0XHRcdC8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0L1xuXHRcdFx0XHQvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2YWwoIzEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRpZiAoIHRhYmluZGV4ICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRyY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJlxuXHRcdFx0XHRcdGVsZW0uaHJlZlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuLy8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG4vLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkXG4vLyBvbiB0aGUgb3B0aW9uXG4vLyBUaGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZFxuLy8gd2hlbiBpbiBhbiBvcHRncm91cFxuLy8gZXNsaW50IHJ1bGUgXCJuby11bnVzZWQtZXhwcmVzc2lvbnNcIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlXG4vLyBzaW5jZSBpdCBjb25zaWRlcnMgc3VjaCBhY2Nlc3Npb25zIG5vb3BcbmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XG5cdGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG5cblxuXG5cdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byBIVE1MIHNwZWNcblx0Ly8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlXG5cdGZ1bmN0aW9uIHN0cmlwQW5kQ29sbGFwc2UoIHZhbHVlICkge1xuXHRcdHZhciB0b2tlbnMgPSB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHRcdHJldHVybiB0b2tlbnMuam9pbiggXCIgXCIgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHtcblx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc2VzLmxlbmd0aCApIHtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBjdXJWYWx1ZSApICsgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hdHRyKCBcImNsYXNzXCIsIFwiXCIgKTtcblx0XHR9XG5cblx0XHRjbGFzc2VzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGNsYXNzZXMubGVuZ3RoICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhenogKyBcIiBcIiwgXCIgXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkge1xuXHRcdHZhciB0eXBlID0gdHlwZW9mIHZhbHVlLFxuXHRcdFx0aXNWYWxpZFZhbHVlID0gdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIGlzVmFsaWRWYWx1ZSApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyhcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLFxuXHRcdFx0XHRcdHN0YXRlVmFsXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgY2xhc3NOYW1lLCBpLCBzZWxmLCBjbGFzc05hbWVzO1xuXG5cdFx0XHRpZiAoIGlzVmFsaWRWYWx1ZSApIHtcblxuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHRpID0gMDtcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXHRcdFx0XHRjbGFzc05hbWVzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRcdFx0d2hpbGUgKCAoIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIixcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0XHRcdFx0XCJcIiA6XG5cdFx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0aGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgY2xhc3NOYW1lLCBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCI7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBnZXRDbGFzcyggZWxlbSApICkgKyBcIiBcIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBycmV0dXJuID0gL1xcci9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmXG5cdFx0XHRcdFx0XCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSApICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRpZiAoIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldC5yZXBsYWNlKCBycmV0dXJuLCBcIlwiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0cmV0dXJuIHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhbHVlSXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbHVlSXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSBvbmx5XG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtYW5kLWNvbGxhcHNlLXdoaXRlc3BhY2Vcblx0XHRcdFx0XHRzdHJpcEFuZENvbGxhcHNlKCBqUXVlcnkudGV4dCggZWxlbSApICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLCBpLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIixcblx0XHRcdFx0XHR2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sXG5cdFx0XHRcdFx0bWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0aWYgKCBpbmRleCA8IDAgKSB7XG5cdFx0XHRcdFx0aSA9IG1heDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGkgPSBvbmUgPyBpbmRleCA6IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0Ly8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQhb3B0aW9uLmRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8XG5cdFx0XHRcdFx0XHRcdFx0IW5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cblxuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkID1cblx0XHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBqUXVlcnkudmFsSG9va3Mub3B0aW9uLmdldCggb3B0aW9uICksIHZhbHVlcyApID4gLTFcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvblNldCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRm9yY2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXRcblx0XHRcdFx0aWYgKCAhb3B0aW9uU2V0ICkge1xuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaCggWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7XG5cdFx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb25cblxuXG5zdXBwb3J0LmZvY3VzaW4gPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG52YXIgcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXG5cdHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24oIGUgKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0fTtcblxualF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmV2ZW50LCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7XG5cblx0XHR2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCggXCIuXCIgKSA6IFtdO1xuXG5cdFx0Y3VyID0gbGFzdEVsZW1lbnQgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKCBcIi5cIiApID4gLTEgKSB7XG5cblx0XHRcdC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKClcblx0XHRcdG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCBcIi5cIiApO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoIFwiOlwiICkgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKTtcblx0XHRldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApIDpcblx0XHRcdG51bGw7XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWRcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0XG5cdFx0ZGF0YSA9IGRhdGEgPT0gbnVsbCA/XG5cdFx0XHRbIGV2ZW50IF0gOlxuXHRcdFx0alF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7XG5cblx0XHQvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzXG5cdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNClcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xuXHRcdFx0aWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHtcblx0XHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0dG1wID0gY3VyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSlcblx0XHRcdGlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aFxuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBjdXIgPSBldmVudFBhdGhbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRsYXN0RWxlbWVudCA9IGN1cjtcblx0XHRcdGV2ZW50LnR5cGUgPSBpID4gMSA/XG5cdFx0XHRcdGJ1YmJsZVR5cGUgOlxuXHRcdFx0XHRzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7XG5cblx0XHRcdC8vIGpRdWVyeSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSAoIGRhdGFQcml2LmdldCggY3VyLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmXG5cdFx0XHRcdGRhdGFQcml2LmdldCggY3VyLCBcImhhbmRsZVwiICk7XG5cdFx0XHRpZiAoIGhhbmRsZSApIHtcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmF0aXZlIGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xuXHRcdFx0aWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICggIXNwZWNpYWwuX2RlZmF1bHQgfHxcblx0XHRcdFx0c3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiZcblx0XHRcdFx0YWNjZXB0RGF0YSggZWxlbSApICkge1xuXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXG5cdFx0XHRcdFx0aWYgKCBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmVcblx0Ly8gVXNlZCBvbmx5IGZvciBgZm9jdXMoaW4gfCBvdXQpYCBldmVudHNcblx0c2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHtcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCksXG5cdFx0XHRldmVudCxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0aXNTaW11bGF0ZWQ6IHRydWVcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0fVxuXG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSApO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxuLy8gU3VwcG9ydDogRmlyZWZveCA8PTQ0XG4vLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4N1xuLy9cbi8vIFN1cHBvcnQ6IENocm9tZSA8PTQ4IC0gNDksIFNhZmFyaSA8PTkuMCAtIDkuMVxuLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsXG4vLyB3aGljaCBpcyBzcGVjIHZpb2xhdGlvbiAtIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWZvY3VzZXZlbnQtZXZlbnQtb3JkZXJcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5pZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7XG5cdGpRdWVyeS5lYWNoKCB7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cblx0XHQvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dFxuXHRcdHZhciBoYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSApO1xuXHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSxcblx0XHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFjaGVzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9ICk7XG59XG52YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247XG5cbnZhciBub25jZSA9IERhdGUubm93KCk7XG5cbnZhciBycXVlcnkgPSAoIC9cXD8vICk7XG5cblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbDtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIElFIHRocm93cyBvbiBwYXJzZUZyb21TdHJpbmcgd2l0aCBpbnZhbGlkIGlucHV0LlxuXHR0cnkge1xuXHRcdHhtbCA9ICggbmV3IHdpbmRvdy5ET01QYXJzZXIoKSApLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgXCJ0ZXh0L3htbFwiICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHhtbCA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC5cblx0XHRcdFx0YnVpbGRQYXJhbXMoXG5cdFx0XHRcdFx0cHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT0gbnVsbCA/IGkgOiBcIlwiICkgKyBcIl1cIixcblx0XHRcdFx0XHR2LFxuXHRcdFx0XHRcdHRyYWRpdGlvbmFsLFxuXHRcdFx0XHRcdGFkZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS5cblx0XHRhZGQoIHByZWZpeCwgb2JqICk7XG5cdH1cbn1cblxuLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2Zcbi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xualF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkge1xuXHR2YXIgcHJlZml4LFxuXHRcdHMgPSBbXSxcblx0XHRhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgdXNlIGl0cyByZXR1cm4gdmFsdWVcblx0XHRcdHZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID9cblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uKCkgOlxuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb247XG5cblx0XHRcdHNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgXCI9XCIgK1xuXHRcdFx0XHRlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcblx0XHR9O1xuXG5cdC8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuXG5cdGlmICggQXJyYXkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50c1xuXHRcdGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHtcblx0XHRcdGFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7XG5cdFx0fSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSBcIm9sZFwiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlclxuXHRcdC8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LlxuXHRcdGZvciAoIHByZWZpeCBpbiBhICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uXG5cdHJldHVybiBzLmpvaW4oIFwiJlwiICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7XG5cdH0sXG5cdHNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDYW4gYWRkIHByb3BIb29rIGZvciBcImVsZW1lbnRzXCIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzXG5cdFx0XHR2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgXCJlbGVtZW50c1wiICk7XG5cdFx0XHRyZXR1cm4gZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpcztcblx0XHR9IClcblx0XHQuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0XHQvLyBVc2UgLmlzKCBcIjpkaXNhYmxlZFwiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3Ncblx0XHRcdHJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCBcIjpkaXNhYmxlZFwiICkgJiZcblx0XHRcdFx0cnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJlxuXHRcdFx0XHQoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7XG5cdFx0fSApXG5cdFx0Lm1hcCggZnVuY3Rpb24oIGksIGVsZW0gKSB7XG5cdFx0XHR2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7XG5cblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9ICkuZ2V0KCk7XG5cdH1cbn0gKTtcblxuXG52YXJcblx0cjIwID0gLyUyMC9nLFxuXHRyaGFzaCA9IC8jLiokLyxcblx0cmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cdG9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblxuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbIDAgXSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhVHlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyAjOTg4N1xuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XG5cdHZhciBrZXksIGRlZXAsXG5cdFx0ZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9O1xuXG5cdGZvciAoIGtleSBpbiBzcmMgKSB7XG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHQoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdO1xuXHRcdH1cblx0fVxuXHRpZiAoIGRlZXAgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6XG4gKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKVxuICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7XG5cblx0dmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFUeXBlLFxuXHRcdGNvbnRlbnRzID0gcy5jb250ZW50cyxcblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcztcblxuXHQvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2Vzc1xuXHR3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSBcIipcIiApIHtcblx0XHRkYXRhVHlwZXMuc2hpZnQoKTtcblx0XHRpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGVcblx0aWYgKCBjdCApIHtcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xuXHRcdFx0aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHtcblx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xuXHRcdGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTtcblx0fSBlbHNlIHtcblxuXHRcdC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXNcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcblx0XHRcdGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArIFwiIFwiICsgZGF0YVR5cGVzWyAwIF0gXSApIHtcblx0XHRcdFx0ZmluYWxEYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhZmlyc3REYXRhVHlwZSApIHtcblx0XHRcdFx0Zmlyc3REYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTtcblx0fVxuXG5cdC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGVcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcblx0Ly8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuXHRpZiAoIGZpbmFsRGF0YVR5cGUgKSB7XG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcblx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7XG5cdFx0fVxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcblx0fVxufVxuXG4vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkge1xuXHR2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldixcblx0XHRjb252ZXJ0ZXJzID0ge30sXG5cblx0XHQvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTtcblxuXHQvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXNcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcblx0XHRmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHtcblx0XHRcdGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07XG5cdFx0fVxuXHR9XG5cblx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlXG5cdHdoaWxlICggY3VycmVudCApIHtcblxuXHRcdGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkge1xuXHRcdFx0anFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcblx0XHRpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7XG5cdFx0XHRyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTtcblx0XHR9XG5cblx0XHRwcmV2ID0gY3VycmVudDtcblx0XHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0XHRpZiAoIGN1cnJlbnQgKSB7XG5cblx0XHRcdC8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG9cblx0XHRcdGlmICggY3VycmVudCA9PT0gXCIqXCIgKSB7XG5cblx0XHRcdFx0Y3VycmVudCA9IHByZXY7XG5cblx0XHRcdC8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnRcblx0XHRcdH0gZWxzZSBpZiAoIHByZXYgIT09IFwiKlwiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXJcblx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyBcIiogXCIgKyBjdXJyZW50IF07XG5cblx0XHRcdFx0Ly8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXJcblx0XHRcdFx0aWYgKCAhY29udiApIHtcblx0XHRcdFx0XHRmb3IgKCBjb252MiBpbiBjb252ZXJ0ZXJzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnRcblx0XHRcdFx0XHRcdHRtcCA9IGNvbnYyLnNwbGl0KCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0aWYgKCB0bXBbIDEgXSA9PT0gY3VycmVudCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXRcblx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIHRtcFsgMCBdIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJzWyBcIiogXCIgKyB0bXBbIDAgXSBdO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjb252ID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgaW50ZXJtZWRpYXRlIGRhdGFUeXBlXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnQgPSB0bXBbIDAgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKVxuXHRcdFx0XHRpZiAoIGNvbnYgIT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHQvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtXG5cdFx0XHRcdFx0aWYgKCBjb252ICYmIHMudGhyb3dzICkge1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZTogXCJwYXJzZXJlcnJvclwiLFxuXHRcdFx0XHRcdFx0XHRcdGVycm9yOiBjb252ID8gZSA6IFwiTm8gY29udmVyc2lvbiBmcm9tIFwiICsgcHJldiArIFwiIHRvIFwiICsgY3VycmVudFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IHN0YXRlOiBcInN1Y2Nlc3NcIiwgZGF0YTogcmVzcG9uc2UgfTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIENvdW50ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgcXVlcmllc1xuXHRhY3RpdmU6IDAsXG5cblx0Ly8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdFxuXHRsYXN0TW9kaWZpZWQ6IHt9LFxuXHRldGFnOiB7fSxcblxuXHRhamF4U2V0dGluZ3M6IHtcblx0XHR1cmw6IGxvY2F0aW9uLmhyZWYsXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLFxuXHRcdGdsb2JhbDogdHJ1ZSxcblx0XHRwcm9jZXNzRGF0YTogdHJ1ZSxcblx0XHRhc3luYzogdHJ1ZSxcblx0XHRjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixcblxuXHRcdC8qXG5cdFx0dGltZW91dDogMCxcblx0XHRkYXRhOiBudWxsLFxuXHRcdGRhdGFUeXBlOiBudWxsLFxuXHRcdHVzZXJuYW1lOiBudWxsLFxuXHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdGNhY2hlOiBudWxsLFxuXHRcdHRocm93czogZmFsc2UsXG5cdFx0dHJhZGl0aW9uYWw6IGZhbHNlLFxuXHRcdGhlYWRlcnM6IHt9LFxuXHRcdCovXG5cblx0XHRhY2NlcHRzOiB7XG5cdFx0XHRcIipcIjogYWxsVHlwZXMsXG5cdFx0XHR0ZXh0OiBcInRleHQvcGxhaW5cIixcblx0XHRcdGh0bWw6IFwidGV4dC9odG1sXCIsXG5cdFx0XHR4bWw6IFwiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbFwiLFxuXHRcdFx0anNvbjogXCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHRcIlxuXHRcdH0sXG5cblx0XHRjb250ZW50czoge1xuXHRcdFx0eG1sOiAvXFxieG1sXFxiLyxcblx0XHRcdGh0bWw6IC9cXGJodG1sLyxcblx0XHRcdGpzb246IC9cXGJqc29uXFxiL1xuXHRcdH0sXG5cblx0XHRyZXNwb25zZUZpZWxkczoge1xuXHRcdFx0eG1sOiBcInJlc3BvbnNlWE1MXCIsXG5cdFx0XHR0ZXh0OiBcInJlc3BvbnNlVGV4dFwiLFxuXHRcdFx0anNvbjogXCJyZXNwb25zZUpTT05cIlxuXHRcdH0sXG5cblx0XHQvLyBEYXRhIGNvbnZlcnRlcnNcblx0XHQvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgXCIqXCIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG5cdFx0Y29udmVydGVyczoge1xuXG5cdFx0XHQvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHRcblx0XHRcdFwiKiB0ZXh0XCI6IFN0cmluZyxcblxuXHRcdFx0Ly8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pXG5cdFx0XHRcInRleHQgaHRtbFwiOiB0cnVlLFxuXG5cdFx0XHQvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uXG5cdFx0XHRcInRleHQganNvblwiOiBKU09OLnBhcnNlLFxuXG5cdFx0XHQvLyBQYXJzZSB0ZXh0IGFzIHhtbFxuXHRcdFx0XCJ0ZXh0IHhtbFwiOiBqUXVlcnkucGFyc2VYTUxcblx0XHR9LFxuXG5cdFx0Ly8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDpcblx0XHQvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmXG5cdFx0Ly8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmVcblx0XHQvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZClcblx0XHRmbGF0T3B0aW9uczoge1xuXHRcdFx0dXJsOiB0cnVlLFxuXHRcdFx0Y29udGV4dDogdHJ1ZVxuXHRcdH1cblx0fSxcblxuXHQvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldFxuXHQvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0aW5ncyBmaWVsZHMuXG5cdC8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuXG5cdGFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzID9cblxuXHRcdFx0Ly8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3Rcblx0XHRcdGFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDpcblxuXHRcdFx0Ly8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5nc1xuXHRcdFx0YWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7XG5cdH0sXG5cblx0YWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksXG5cdGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLFxuXG5cdC8vIE1haW4gbWV0aG9kXG5cdGFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBJZiB1cmwgaXMgYW4gb2JqZWN0LCBzaW11bGF0ZSBwcmUtMS41IHNpZ25hdHVyZVxuXHRcdGlmICggdHlwZW9mIHVybCA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB1cmw7XG5cdFx0XHR1cmwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3Rcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdHZhciB0cmFuc3BvcnQsXG5cblx0XHRcdC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW1cblx0XHRcdGNhY2hlVVJMLFxuXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcsXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXG5cblx0XHRcdC8vIHRpbWVvdXQgaGFuZGxlXG5cdFx0XHR0aW1lb3V0VGltZXIsXG5cblx0XHRcdC8vIFVybCBjbGVhbnVwIHZhclxuXHRcdFx0dXJsQW5jaG9yLFxuXG5cdFx0XHQvLyBSZXF1ZXN0IHN0YXRlIChiZWNvbWVzIGZhbHNlIHVwb24gc2VuZCBhbmQgdHJ1ZSB1cG9uIGNvbXBsZXRpb24pXG5cdFx0XHRjb21wbGV0ZWQsXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZFxuXHRcdFx0ZmlyZUdsb2JhbHMsXG5cblx0XHRcdC8vIExvb3AgdmFyaWFibGVcblx0XHRcdGksXG5cblx0XHRcdC8vIHVuY2FjaGVkIHBhcnQgb2YgdGhlIHVybFxuXHRcdFx0dW5jYWNoZWQsXG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3Rcblx0XHRcdHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLFxuXG5cdFx0XHQvLyBDYWxsYmFja3MgY29udGV4dFxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXG5cblx0XHRcdC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0IGlmIGl0IGlzIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb25cblx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dCA9IHMuY29udGV4dCAmJlxuXHRcdFx0XHQoIGNhbGxiYWNrQ29udGV4dC5ub2RlVHlwZSB8fCBjYWxsYmFja0NvbnRleHQuanF1ZXJ5ICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOlxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZVxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXG5cblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gPVxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApO1xuXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSlcblx0XHQvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGVcblx0XHRzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgXCJcIiApXG5cdFx0XHQucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiApO1xuXG5cdFx0Ly8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0XG5cdFx0cy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTtcblxuXHRcdC8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3Rcblx0XHRzLmRhdGFUeXBlcyA9ICggcy5kYXRhVHlwZSB8fCBcIipcIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblxuXHRcdC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLlxuXHRcdGlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkge1xuXHRcdFx0dXJsQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJhXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEsIEVkZ2UgMTIgLSAxNVxuXHRcdFx0Ly8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCxcblx0XHRcdC8vIGUuZy4gaHR0cDovL2V4YW1wbGUuY29tOjgweC9cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gcy51cmw7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEgb25seVxuXHRcdFx0XHQvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZVxuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHVybEFuY2hvci5ocmVmO1xuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gb3JpZ2luQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09XG5cdFx0XHRcdFx0dXJsQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgdXJsQW5jaG9yLmhvc3Q7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbixcblx0XHRcdFx0Ly8gaXQgY2FuIGJlIHJlamVjdGVkIGJ5IHRoZSB0cmFuc3BvcnQgaWYgaXQgaXMgaW52YWxpZFxuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcblx0XHRpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHByZWZpbHRlcnNcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlXG5cdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG9cblx0XHQvLyBEb24ndCBmaXJlIGV2ZW50cyBpZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAoIzE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0YXJ0XCIgKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHQvLyBSZW1vdmUgaGFzaCB0byBzaW1wbGlmeSB1cmwgbWFuaXB1bGF0aW9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybC5yZXBsYWNlKCByaGFzaCwgXCJcIiApO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBoYXNoIHNvIHdlIGNhbiBwdXQgaXQgYmFja1xuXHRcdFx0dW5jYWNoZWQgPSBzLnVybC5zbGljZSggY2FjaGVVUkwubGVuZ3RoICk7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICYmICggcy5wcm9jZXNzRGF0YSB8fCB0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICkgKSB7XG5cdFx0XHRcdGNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XG5cblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxuXHRcdFx0XHRkZWxldGUgcy5kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkXG5cdFx0XHRpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRjYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsIFwiJDFcIiApO1xuXHRcdFx0XHR1bmNhY2hlZCA9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyAoIG5vbmNlKysgKSArIHVuY2FjaGVkO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQdXQgaGFzaCBhbmQgYW50aS1jYWNoZSBvbiB0aGUgVVJMIHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgKGdoLTE3MzIpXG5cdFx0XHRzLnVybCA9IGNhY2hlVVJMICsgdW5jYWNoZWQ7XG5cblx0XHQvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OClcblx0XHR9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJlxuXHRcdFx0KCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKS5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgKSB7XG5cdFx0XHRzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCBcIitcIiApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/XG5cdFx0XHRcdHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdICtcblx0XHRcdFx0XHQoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJlxuXHRcdFx0KCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGNvbXBsZXRlRGVmZXJyZWQuYWRkKCBzLmNvbXBsZXRlICk7XG5cdFx0anFYSFIuZG9uZSggcy5zdWNjZXNzICk7XG5cdFx0anFYSFIuZmFpbCggcy5lcnJvciApO1xuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYWpheFNlbmQsIHN0b3AgdGhlcmVcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0anFYSFIuYWJvcnQoIFwidGltZW91dFwiICk7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb21wbGV0ZWQgPSBmYWxzZTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBSZXRocm93IHBvc3QtY29tcGxldGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHNcblx0XHRcdFx0ZG9uZSggLTEsIGUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmVcblx0XHRmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHtcblx0XHRcdHZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsXG5cdFx0XHRcdHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0O1xuXG5cdFx0XHQvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zXG5cdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb21wbGV0ZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxuXHRcdFx0Ly8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZClcblx0XHRcdHRyYW5zcG9ydCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0Ly8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTZXQgcmVhZHlTdGF0ZVxuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWxcblx0XHRcdGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0O1xuXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxuXHRcdFx0aWYgKCByZXNwb25zZXMgKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25zZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpXG5cdFx0XHRyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApO1xuXG5cdFx0XHQvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZ1xuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRcdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJMYXN0LU1vZGlmaWVkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcImV0YWdcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBFeHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dCBhbmQgbm9ybWFsaXplIGZvciBub24tYWJvcnRzXG5cdFx0XHRcdGVycm9yID0gc3RhdHVzVGV4dDtcblx0XHRcdFx0aWYgKCBzdGF0dXMgfHwgIXN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiZXJyb3JcIjtcblx0XHRcdFx0XHRpZiAoIHN0YXR1cyA8IDAgKSB7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdFxuXHRcdFx0anFYSFIuc3RhdHVzID0gc3RhdHVzO1xuXHRcdFx0anFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyBcIlwiO1xuXG5cdFx0XHQvLyBTdWNjZXNzL0Vycm9yXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTtcblx0XHRcdHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyBcImFqYXhTdWNjZXNzXCIgOiBcImFqYXhFcnJvclwiLFxuXHRcdFx0XHRcdFsganFYSFIsIHMsIGlzU3VjY2VzcyA/IHN1Y2Nlc3MgOiBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbXBsZXRlXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4Q29tcGxldGVcIiwgWyBqcVhIUiwgcyBdICk7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXG5cdFx0XHRcdGlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0b3BcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpxWEhSO1xuXHR9LFxuXG5cdGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCBcImpzb25cIiApO1xuXHR9LFxuXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgXCJzY3JpcHRcIiApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblxuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBkYXRhICkgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBjYWxsYmFjaztcblx0XHRcdGNhbGxiYWNrID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHVybCBjYW4gYmUgYW4gb3B0aW9ucyBvYmplY3QgKHdoaWNoIHRoZW4gbXVzdCBoYXZlIC51cmwpXG5cdFx0cmV0dXJuIGpRdWVyeS5hamF4KCBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSwgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHVybCApICYmIHVybCApICk7XG5cdH07XG59ICk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCApIHtcblx0cmV0dXJuIGpRdWVyeS5hamF4KCB7XG5cdFx0dXJsOiB1cmwsXG5cblx0XHQvLyBNYWtlIHRoaXMgZXhwbGljaXQsIHNpbmNlIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgdGhyb3VnaCBhamF4U2V0dXAgKCMxMTI2NClcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGNhY2hlOiB0cnVlLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXHRcdFwidGhyb3dzXCI6IHRydWVcblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdFx0aHRtbCA9IGh0bWwuY2FsbCggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gdGhpcztcblxuXHRcdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZWxlbTtcblx0XHRcdH0gKS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWxJc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHRoaXMucGFyZW50KCBzZWxlY3RvciApLm5vdCggXCJib2R5XCIgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTtcblx0XHR9ICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApO1xufTtcbmpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gISEoIGVsZW0ub2Zmc2V0V2lkdGggfHwgZWxlbS5vZmZzZXRIZWlnaHQgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApO1xufTtcblxuXG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59O1xuXG52YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHtcblxuXHRcdC8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHQvLyAjMTQ1MDogc29tZXRpbWVzIElFIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDRcblx0XHQxMjIzOiAyMDRcblx0fSxcblx0eGhyU3VwcG9ydGVkID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIoKTtcblxuc3VwcG9ydC5jb3JzID0gISF4aHJTdXBwb3J0ZWQgJiYgKCBcIndpdGhDcmVkZW50aWFsc1wiIGluIHhoclN1cHBvcnRlZCApO1xuc3VwcG9ydC5hamF4ID0geGhyU3VwcG9ydGVkID0gISF4aHJTdXBwb3J0ZWQ7XG5cbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0dmFyIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrO1xuXG5cdC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Rcblx0aWYgKCBzdXBwb3J0LmNvcnMgfHwgeGhyU3VwcG9ydGVkICYmICFvcHRpb25zLmNyb3NzRG9tYWluICkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHZhciBpLFxuXHRcdFx0XHRcdHhociA9IG9wdGlvbnMueGhyKCk7XG5cblx0XHRcdFx0eGhyLm9wZW4oXG5cdFx0XHRcdFx0b3B0aW9ucy50eXBlLFxuXHRcdFx0XHRcdG9wdGlvbnMudXJsLFxuXHRcdFx0XHRcdG9wdGlvbnMuYXN5bmMsXG5cdFx0XHRcdFx0b3B0aW9ucy51c2VybmFtZSxcblx0XHRcdFx0XHRvcHRpb25zLnBhc3N3b3JkXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdGZvciAoIGkgaW4gb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0XHR4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGUgbWltZSB0eXBlIGlmIG5lZWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7XG5cdFx0XHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoIG9wdGlvbnMubWltZVR5cGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyXG5cdFx0XHRcdC8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmVcblx0XHRcdFx0Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS5cblx0XHRcdFx0Ly8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApXG5cdFx0XHRcdC8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLlxuXHRcdFx0XHRpZiAoICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdICkge1xuXHRcdFx0XHRcdGhlYWRlcnNbIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiIF0gPSBcIlhNTEh0dHBSZXF1ZXN0XCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTZXQgaGVhZGVyc1xuXHRcdFx0XHRmb3IgKCBpIGluIGhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoIGksIGhlYWRlcnNbIGkgXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID1cblx0XHRcdFx0XHRcdFx0XHR4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9XG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiYWJvcnRcIiApIHtcblx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gXCJlcnJvclwiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBPbiBhIG1hbnVhbCBuYXRpdmUgYWJvcnQsIElFOSB0aHJvd3Ncblx0XHRcdFx0XHRcdFx0XHQvLyBlcnJvcnMgb24gYW55IHByb3BlcnR5IGFjY2VzcyB0aGF0IGlzIG5vdCByZWFkeVN0YXRlXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlb2YgeGhyLnN0YXR1cyAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCAwLCBcImVycm9yXCIgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0geGhyLm9udGltZW91dCA9IGNhbGxiYWNrKCBcImVycm9yXCIgKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0Ly8gVXNlIG9ucmVhZHlzdGF0ZWNoYW5nZSB0byByZXBsYWNlIG9uYWJvcnRcblx0XHRcdFx0Ly8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0c1xuXHRcdFx0XHRpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0eGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBpdCBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFsbG93IG9uZXJyb3IgdG8gYmUgY2FsbGVkIGZpcnN0LFxuXHRcdFx0XHRcdFx0XHQvLyBidXQgdGhhdCB3aWxsIG5vdCBoYW5kbGUgYSBuYXRpdmUgYWJvcnRcblx0XHRcdFx0XHRcdFx0Ly8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0Ly8gYXMgeGhyLm9uZXJyb3IgY2Fubm90IGJlIGFjY2Vzc2VkXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2soIFwiYWJvcnRcIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pXG5cdFx0XHRcdFx0eGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdC8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUHJldmVudCBhdXRvLWV4ZWN1dGlvbiBvZiBzY3JpcHRzIHdoZW4gbm8gZXhwbGljaXQgZGF0YVR5cGUgd2FzIHByb3ZpZGVkIChTZWUgZ2gtMjQzMilcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMuY29udGVudHMuc2NyaXB0ID0gZmFsc2U7XG5cdH1cbn0gKTtcblxuLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGVcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0YWNjZXB0czoge1xuXHRcdHNjcmlwdDogXCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIFwiICtcblx0XHRcdFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCJcblx0fSxcblx0Y29udGVudHM6IHtcblx0XHRzY3JpcHQ6IC9cXGIoPzpqYXZhfGVjbWEpc2NyaXB0XFxiL1xuXHR9LFxuXHRjb252ZXJ0ZXJzOiB7XG5cdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7XG5cdFx0XHRyZXR1cm4gdGV4dDtcblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRzLmNhY2hlID0gZmFsc2U7XG5cdH1cblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMudHlwZSA9IFwiR0VUXCI7XG5cdH1cbn0gKTtcblxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XG5qUXVlcnkuYWpheFRyYW5zcG9ydCggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cblx0Ly8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0c1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0dmFyIHNjcmlwdCwgY2FsbGJhY2s7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBfLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0c2NyaXB0ID0galF1ZXJ5KCBcIjxzY3JpcHQ+XCIgKS5wcm9wKCB7XG5cdFx0XHRcdFx0Y2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LFxuXHRcdFx0XHRcdHNyYzogcy51cmxcblx0XHRcdFx0fSApLm9uKFxuXHRcdFx0XHRcdFwibG9hZCBlcnJvclwiLFxuXHRcdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZSsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0gKTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApXG5cdFx0XHRcdFx0LmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCAmJlxuXHRcdFx0XHRyanNvbnAudGVzdCggcy5kYXRhICkgJiYgXCJkYXRhXCJcblx0XHQpO1xuXG5cdC8vIEhhbmRsZSBpZmYgdGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyBcImpzb25wXCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXRcblx0aWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSBcImpzb25wXCIgKSB7XG5cblx0XHQvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0XG5cdFx0Y2FsbGJhY2tOYW1lID0gcy5qc29ucENhbGxiYWNrID0gaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzWyBcInNjcmlwdCBqc29uXCIgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIEZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXRcblx0XHRcdGlmICggb3ZlcndyaXR0ZW4gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0alF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTtcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBvdmVyd3JpdHRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2F2ZSBiYWNrIGFzIGZyZWVcblx0XHRcdGlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBTYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSApO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gU3VwcG9ydDogU2FmYXJpIDggb25seVxuLy8gSW4gU2FmYXJpIDggZG9jdW1lbnRzIGNyZWF0ZWQgdmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudFxuLy8gY29sbGFwc2Ugc2libGluZyBmb3JtczogdGhlIHNlY29uZCBvbmUgYmVjb21lcyBhIGNoaWxkIG9mIHRoZSBmaXJzdCBvbmUuXG4vLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguXG4vLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MzM3XG5zdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCA9ICggZnVuY3Rpb24oKSB7XG5cdHZhciBib2R5ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICkuYm9keTtcblx0Ym9keS5pbm5lckhUTUwgPSBcIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+XCI7XG5cdHJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyO1xufSApKCk7XG5cblxuLy8gQXJndW1lbnQgXCJkYXRhXCIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sXG4vLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNpZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRleHQsXG4vLyBkZWZhdWx0cyB0byBkb2N1bWVudFxuLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xualF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHtcblx0aWYgKCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0a2VlcFNjcmlwdHMgPSBjb250ZXh0O1xuXHRcdGNvbnRleHQgPSBmYWxzZTtcblx0fVxuXG5cdHZhciBiYXNlLCBwYXJzZWQsIHNjcmlwdHM7XG5cblx0aWYgKCAhY29udGV4dCApIHtcblxuXHRcdC8vIFN0b3Agc2NyaXB0cyBvciBpbmxpbmUgZXZlbnQgaGFuZGxlcnMgZnJvbSBiZWluZyBleGVjdXRlZCBpbW1lZGlhdGVseVxuXHRcdC8vIGJ5IHVzaW5nIGRvY3VtZW50LmltcGxlbWVudGF0aW9uXG5cdFx0aWYgKCBzdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCApIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKTtcblxuXHRcdFx0Ly8gU2V0IHRoZSBiYXNlIGhyZWYgZm9yIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyBzbyBhbnkgcGFyc2VkIGVsZW1lbnRzIHdpdGggVVJMc1xuXHRcdFx0Ly8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSlcblx0XHRcdGJhc2UgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiYmFzZVwiICk7XG5cdFx0XHRiYXNlLmhyZWYgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0Y29udGV4dC5oZWFkLmFwcGVuZENoaWxkKCBiYXNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudDtcblx0XHR9XG5cdH1cblxuXHRwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKTtcblx0c2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTtcblxuXHQvLyBTaW5nbGUgdGFnXG5cdGlmICggcGFyc2VkICkge1xuXHRcdHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0gYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLyoqXG4gKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlXG4gKi9cbmpRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHtcblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZiggXCIgXCIgKTtcblxuXHRpZiAoIG9mZiA+IC0xICkge1xuXHRcdHNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApO1xuXHRcdHVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIGEgZnVuY3Rpb25cblx0aWYgKCBpc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoIHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBJZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkLlxuXHRcdFx0Ly8gTWFrZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGV4cGxpY2l0IHNpbmNlXG5cdFx0XHQvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2Rcblx0XHRcdHR5cGU6IHR5cGUgfHwgXCJHRVRcIixcblx0XHRcdGRhdGFUeXBlOiBcImh0bWxcIixcblx0XHRcdGRhdGE6IHBhcmFtc1xuXHRcdH0gKS5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeSggXCI8ZGl2PlwiICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0Ly8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImRhdGFcIiwgXCJzdGF0dXNcIiwgXCJqcVhIUlwiXG5cdFx0Ly8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLlxuXHRcdC8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJqcVhIUlwiLCBcInN0YXR1c1wiLCBcImVycm9yXCJcblx0XHR9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG4vLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50c1xualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSApO1xuXG5cblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiBqUXVlcnkuZ3JlcCggalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9ICkubGVuZ3RoO1xufTtcblxuXG5cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHQoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCBcImF1dG9cIiApID4gLTE7XG5cblx0XHQvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlclxuXHRcdC8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZFxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XG5cdFx0XHRjdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTtcblx0XHRcdGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDtcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdC8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KVxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgalF1ZXJ5LmV4dGVuZCgge30sIGN1ck9mZnNldCApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0Ly8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRcdGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7XG5cdFx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHR2YXIgcmVjdCwgd2luLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYVxuXHRcdC8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvclxuXHRcdGlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblx0XHR9XG5cblx0XHQvLyBHZXQgZG9jdW1lbnQtcmVsYXRpdmUgcG9zaXRpb24gYnkgYWRkaW5nIHZpZXdwb3J0IHNjcm9sbCB0byB2aWV3cG9ydC1yZWxhdGl2ZSBnQkNSXG5cdFx0cmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0d2luID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LFxuXHRcdFx0bGVmdDogcmVjdC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0XG5cdFx0fTtcblx0fSxcblxuXHQvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveFxuXHQvLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBiZWhhdmlvciBvZiBDU1MgYWJzb2x1dGUgcG9zaXRpb25pbmdcblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYyxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuXG5cdFx0Ly8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cblx0XHRcdC8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3Rcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblxuXHRcdFx0Ly8gQWNjb3VudCBmb3IgdGhlICpyZWFsKiBvZmZzZXQgcGFyZW50LCB3aGljaCBjYW4gYmUgdGhlIGRvY3VtZW50IG9yIGl0cyByb290IGVsZW1lbnRcblx0XHRcdC8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkXG5cdFx0XHRkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHRvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0d2hpbGUgKCBvZmZzZXRQYXJlbnQgJiZcblx0XHRcdFx0KCBvZmZzZXRQYXJlbnQgPT09IGRvYy5ib2R5IHx8IG9mZnNldFBhcmVudCA9PT0gZG9jLmRvY3VtZW50RWxlbWVudCApICYmXG5cdFx0XHRcdGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQgIT09IGVsZW0gJiYgb2Zmc2V0UGFyZW50Lm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIEluY29ycG9yYXRlIGJvcmRlcnMgaW50byBpdHMgb2Zmc2V0LCBzaW5jZSB0aGV5IGFyZSBvdXRzaWRlIGl0cyBjb250ZW50IG9yaWdpblxuXHRcdFx0XHRwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpO1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQudG9wICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJUb3BXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHQvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcblx0Ly8gMSkgRm9yIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgaWZyYW1lIHdpdGhvdXQgb2Zmc2V0UGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuXHQvLyAgICBkb2N1bWVudEVsZW1lbnQgb2YgdGhlIHBhcmVudCB3aW5kb3dcblx0Ly8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudFxuXHQvLyAzKSBGb3IgYm9keSBvciBodG1sIGVsZW1lbnQsIGkuZS4gaW4gY2FzZSBvZiB0aGUgaHRtbCBub2RlIC0gaXQgd2lsbCByZXR1cm4gaXRzZWxmXG5cdC8vXG5cdC8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlc1xuXHQvLyBhbmQgbWlnaHQgYmUgY29uc2lkZXJlZCBhcyBtb3JlIHByZWZlcmFibGUgcmVzdWx0cy5cblx0Ly9cblx0Ly8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmVcblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50O1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50RWxlbWVudDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXG5cdFx0XHQvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3Ncblx0XHRcdHZhciB3aW47XG5cdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW07XG5cdFx0XHR9IGVsc2UgaWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR3aW4gPSBlbGVtLmRlZmF1bHRWaWV3O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogd2luLnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IHdpbi5wYWdlWU9mZnNldFxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9O1xufSApO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmkgPD03IC0gOS4xLCBDaHJvbWUgPD0zNyAtIDQ5XG4vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvblxuLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0XG4vLyBCbGluayBidWc6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU4OTM0N1xuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sXG5cdFx0ZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cblx0XHQvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGhcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcblx0XHRcdHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09IFwiYm9vbGVhblwiICksXG5cdFx0XHRcdGV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gXCJtYXJnaW5cIiA6IFwiYm9yZGVyXCIgKTtcblxuXHRcdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZG9jO1xuXG5cdFx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vICQoIHdpbmRvdyApLm91dGVyV2lkdGgvSGVpZ2h0IHJldHVybiB3L2ggaW5jbHVkaW5nIHNjcm9sbGJhcnMgKGdoLTE3MjkpXG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmNOYW1lLmluZGV4T2YoIFwib3V0ZXJcIiApID09PSAwID9cblx0XHRcdFx0XHRcdGVsZW1bIFwiaW5uZXJcIiArIG5hbWUgXSA6XG5cdFx0XHRcdFx0XHRlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJzY3JvbGxcIiArIG5hbWUgXSwgZG9jWyBcInNjcm9sbFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcIm9mZnNldFwiICsgbmFtZSBdLCBkb2NbIFwib2Zmc2V0XCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOlxuXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7XG5cdFx0XHR9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApO1xuXHRcdH07XG5cdH0gKTtcbn0gKTtcblxuXG5qUXVlcnkuZWFjaCggKCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXG5cdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHtcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5cblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0YmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApO1xuXHR9LFxuXG5cdGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHtcblxuXHRcdC8vICggbmFtZXNwYWNlICkgb3IgKCBzZWxlY3RvciwgdHlwZXMgWywgZm5dIClcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/XG5cdFx0XHR0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDpcblx0XHRcdHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgXCIqKlwiLCBmbiApO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuLy8gYXJndW1lbnRzLlxuLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKVxuLy8gSG93ZXZlciwgaXQgaXMgbm90IHNsYXRlZCBmb3IgcmVtb3ZhbCBhbnkgdGltZSBzb29uXG5qUXVlcnkucHJveHkgPSBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRjb250ZXh0ID0gZm47XG5cdFx0Zm4gPSB0bXA7XG5cdH1cblxuXHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBTaW11bGF0ZWQgYmluZFxuXHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdH07XG5cblx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdHJldHVybiBwcm94eTtcbn07XG5cbmpRdWVyeS5ob2xkUmVhZHkgPSBmdW5jdGlvbiggaG9sZCApIHtcblx0aWYgKCBob2xkICkge1xuXHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0fSBlbHNlIHtcblx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcblx0fVxufTtcbmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbmpRdWVyeS5wYXJzZUpTT04gPSBKU09OLnBhcnNlO1xualF1ZXJ5Lm5vZGVOYW1lID0gbm9kZU5hbWU7XG5qUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5qUXVlcnkuaXNXaW5kb3cgPSBpc1dpbmRvdztcbmpRdWVyeS5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG5qUXVlcnkudHlwZSA9IHRvVHlwZTtcblxualF1ZXJ5Lm5vdyA9IERhdGUubm93O1xuXG5qUXVlcnkuaXNOdW1lcmljID0gZnVuY3Rpb24oIG9iaiApIHtcblxuXHQvLyBBcyBvZiBqUXVlcnkgMy4wLCBpc051bWVyaWMgaXMgbGltaXRlZCB0b1xuXHQvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpXG5cdC8vIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gZmluaXRlIG51bWJlcnMgKGdoLTI2NjIpXG5cdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXHRyZXR1cm4gKCB0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgKSAmJlxuXG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKFwiXCIpXG5cdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTlxuXHRcdCFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTtcbn07XG5cblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSApO1xufVxuXG5cblxuXG52YXJcblxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoICFub0dsb2JhbCApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5cblxuXG5yZXR1cm4galF1ZXJ5O1xufSApO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n");
/***/ }),
/* 2 */
/***/ (function(module, exports) {
-eval("throw new Error(\"Module build failed: ModuleBuildError: Module build failed: BrowserslistError: Unknown browser query `dead`\\n at /home/marvinborner/Coding/BEAM-Messenger/node_modules/laravel-mix/node_modules/autoprefixer/node_modules/browserslist/index.js:164:11\\n at Array.reduce (<anonymous>)\\n at resolve (/home/marvinborner/Coding/BEAM-Messenger/node_modules/laravel-mix/node_modules/autoprefixer/node_modules/browserslist/index.js:132:18)\\n at browserslist (/home/marvinborner/Coding/BEAM-Messenger/node_modules/laravel-mix/node_modules/autoprefixer/node_modules/browserslist/index.js:224:16)\\n at Browsers.parse (/home/marvinborner/Coding/BEAM-Messenger/node_modules/laravel-mix/node_modules/autoprefixer/lib/browsers.js:61:16)\\n at new Browsers (/home/marvinborner/Coding/BEAM-Messenger/node_modules/laravel-mix/node_modules/autoprefixer/lib/browsers.js:52:30)\\n at loadPrefixes (/home/marvinborner/Coding/BEAM-Messenger/node_modules/laravel-mix/node_modules/autoprefixer/lib/autoprefixer.js:70:24)\\n at plugin (/home/marvinborner/Coding/BEAM-Messenger/node_modules/laravel-mix/node_modules/autoprefixer/lib/autoprefixer.js:81:24)\\n at LazyResult.run (/home/marvinborner/Coding/BEAM-Messenger/node_modules/postcss/lib/lazy-result.js:277:20)\\n at LazyResult.asyncTick (/home/marvinborner/Coding/BEAM-Messenger/node_modules/postcss/lib/lazy-result.js:192:32)\\n at processing.Promise.then._this2.processed (/home/marvinborner/Coding/BEAM-Messenger/node_modules/postcss/lib/lazy-result.js:231:20)\\n at new Promise (<anonymous>)\\n at LazyResult.async (/home/marvinborner/Coding/BEAM-Messenger/node_modules/postcss/lib/lazy-result.js:228:27)\\n at LazyResult.then (/home/marvinborner/Coding/BEAM-Messenger/node_modules/postcss/lib/lazy-result.js:134:21)\\n at Promise.resolve.then.then (/home/marvinborner/Coding/BEAM-Messenger/node_modules/postcss-loader/lib/index.js:145:8)\\n at <anonymous>\\n at process._tickCallback (internal/process/next_tick.js:188:7)\\n at runLoaders (/home/marvinborner/Coding/BEAM-Messenger/node_modules/webpack/lib/NormalModule.js:195:19)\\n at /home/marvinborner/Coding/BEAM-Messenger/node_modules/loader-runner/lib/LoaderRunner.js:364:11\\n at /home/marvinborner/Coding/BEAM-Messenger/node_modules/loader-runner/lib/LoaderRunner.js:230:18\\n at context.callback (/home/marvinborner/Coding/BEAM-Messenger/node_modules/loader-runner/lib/LoaderRunner.js:111:13)\\n at Promise.resolve.then.then.catch (/home/marvinborner/Coding/BEAM-Messenger/node_modules/postcss-loader/lib/index.js:194:71)\\n at <anonymous>\\n at process._tickCallback (internal/process/next_tick.js:188:7)\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiIyLmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2\n");
+eval("var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzPzM2OTgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0Qzs7QUFFNUMiLCJmaWxlIjoiMi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnO1xyXG5cclxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcclxuZyA9IChmdW5jdGlvbigpIHtcclxuXHRyZXR1cm4gdGhpcztcclxufSkoKTtcclxuXHJcbnRyeSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXHJcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcclxufSBjYXRjaChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxyXG5cdFx0ZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2\n");
/***/ }),
/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* WEBPACK VAR INJECTION */(function(global) {/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.14.3\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nvar longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\nvar timeoutDuration = 0;\nfor (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n timeoutDuration = 1;\n break;\n }\n}\n\nfunction microtaskDebounce(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n called = true;\n window.Promise.resolve().then(function () {\n called = false;\n fn();\n });\n };\n}\n\nfunction taskDebounce(fn) {\n var scheduled = false;\n return function () {\n if (!scheduled) {\n scheduled = true;\n setTimeout(function () {\n scheduled = false;\n fn();\n }, timeoutDuration);\n }\n };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nfunction isFunction(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nfunction getStyleComputedProperty(element, property) {\n if (element.nodeType !== 1) {\n return [];\n }\n // NOTE: 1 DOM access here\n var css = getComputedStyle(element, null);\n return property ? css[property] : css;\n}\n\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nfunction getParentNode(element) {\n if (element.nodeName === 'HTML') {\n return element;\n }\n return element.parentNode || element.host;\n}\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nfunction getScrollParent(element) {\n // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n if (!element) {\n return document.body;\n }\n\n switch (element.nodeName) {\n case 'HTML':\n case 'BODY':\n return element.ownerDocument.body;\n case '#document':\n return element.body;\n }\n\n // Firefox want us to check `-x` and `-y` variations as well\n\n var _getStyleComputedProp = getStyleComputedProperty(element),\n overflow = _getStyleComputedProp.overflow,\n overflowX = _getStyleComputedProp.overflowX,\n overflowY = _getStyleComputedProp.overflowY;\n\n if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n return element;\n }\n\n return getScrollParent(getParentNode(element));\n}\n\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nfunction isIE(version) {\n if (version === 11) {\n return isIE11;\n }\n if (version === 10) {\n return isIE10;\n }\n return isIE11 || isIE10;\n}\n\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nfunction getOffsetParent(element) {\n if (!element) {\n return document.documentElement;\n }\n\n var noOffsetParent = isIE(10) ? document.body : null;\n\n // NOTE: 1 DOM access here\n var offsetParent = element.offsetParent;\n // Skip hidden elements which don't have an offsetParent\n while (offsetParent === noOffsetParent && element.nextElementSibling) {\n offsetParent = (element = element.nextElementSibling).offsetParent;\n }\n\n var nodeName = offsetParent && offsetParent.nodeName;\n\n if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n return element ? element.ownerDocument.documentElement : document.documentElement;\n }\n\n // .offsetParent will return the closest TD or TABLE in case\n // no offsetParent is present, I hate this job...\n if (['TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n return getOffsetParent(offsetParent);\n }\n\n return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY') {\n return false;\n }\n return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nfunction getRoot(node) {\n if (node.parentNode !== null) {\n return getRoot(node.parentNode);\n }\n\n return node;\n}\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nfunction findCommonOffsetParent(element1, element2) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n return document.documentElement;\n }\n\n // Here we make sure to give as \"start\" the element that comes first in the DOM\n var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n var start = order ? element1 : element2;\n var end = order ? element2 : element1;\n\n // Get common ancestor container\n var range = document.createRange();\n range.setStart(start, 0);\n range.setEnd(end, 0);\n var commonAncestorContainer = range.commonAncestorContainer;\n\n // Both nodes are inside #document\n\n if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n if (isOffsetContainer(commonAncestorContainer)) {\n return commonAncestorContainer;\n }\n\n return getOffsetParent(commonAncestorContainer);\n }\n\n // one of the nodes is inside shadowDOM, find which one\n var element1root = getRoot(element1);\n if (element1root.host) {\n return findCommonOffsetParent(element1root.host, element2);\n } else {\n return findCommonOffsetParent(element1, getRoot(element2).host);\n }\n}\n\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nfunction getScroll(element) {\n var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n var html = element.ownerDocument.documentElement;\n var scrollingElement = element.ownerDocument.scrollingElement || html;\n return scrollingElement[upperSide];\n }\n\n return element[upperSide];\n}\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nfunction includeScroll(rect, element) {\n var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n var modifier = subtract ? -1 : 1;\n rect.top += scrollTop * modifier;\n rect.bottom += scrollTop * modifier;\n rect.left += scrollLeft * modifier;\n rect.right += scrollLeft * modifier;\n return rect;\n}\n\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nfunction getBordersSize(styles, axis) {\n var sideA = axis === 'x' ? 'Left' : 'Top';\n var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\n}\n\nfunction getSize(axis, body, html, computedStyle) {\n return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? html['offset' + axis] + computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')] + computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')] : 0);\n}\n\nfunction getWindowSizes() {\n var body = document.body;\n var html = document.documentElement;\n var computedStyle = isIE(10) && getComputedStyle(html);\n\n return {\n height: getSize('Height', body, html, computedStyle),\n width: getSize('Width', body, html, computedStyle)\n };\n}\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\nvar defineProperty = function (obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nfunction getClientRect(offsets) {\n return _extends({}, offsets, {\n right: offsets.left + offsets.width,\n bottom: offsets.top + offsets.height\n });\n}\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nfunction getBoundingClientRect(element) {\n var rect = {};\n\n // IE10 10 FIX: Please, don't ask, the element isn't\n // considered in DOM in some circumstances...\n // This isn't reproducible in IE10 compatibility mode of IE11\n try {\n if (isIE(10)) {\n rect = element.getBoundingClientRect();\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n rect.top += scrollTop;\n rect.left += scrollLeft;\n rect.bottom += scrollTop;\n rect.right += scrollLeft;\n } else {\n rect = element.getBoundingClientRect();\n }\n } catch (e) {}\n\n var result = {\n left: rect.left,\n top: rect.top,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n\n // subtract scrollbar size from sizes\n var sizes = element.nodeName === 'HTML' ? getWindowSizes() : {};\n var width = sizes.width || element.clientWidth || result.right - result.left;\n var height = sizes.height || element.clientHeight || result.bottom - result.top;\n\n var horizScrollbar = element.offsetWidth - width;\n var vertScrollbar = element.offsetHeight - height;\n\n // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n // we make this check conditional for performance reasons\n if (horizScrollbar || vertScrollbar) {\n var styles = getStyleComputedProperty(element);\n horizScrollbar -= getBordersSize(styles, 'x');\n vertScrollbar -= getBordersSize(styles, 'y');\n\n result.width -= horizScrollbar;\n result.height -= vertScrollbar;\n }\n\n return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var isIE10 = isIE(10);\n var isHTML = parent.nodeName === 'HTML';\n var childrenRect = getBoundingClientRect(children);\n var parentRect = getBoundingClientRect(parent);\n var scrollParent = getScrollParent(children);\n\n var styles = getStyleComputedProperty(parent);\n var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\n var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\n\n // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n if (fixedPosition && parent.nodeName === 'HTML') {\n parentRect.top = Math.max(parentRect.top, 0);\n parentRect.left = Math.max(parentRect.left, 0);\n }\n var offsets = getClientRect({\n top: childrenRect.top - parentRect.top - borderTopWidth,\n left: childrenRect.left - parentRect.left - borderLeftWidth,\n width: childrenRect.width,\n height: childrenRect.height\n });\n offsets.marginTop = 0;\n offsets.marginLeft = 0;\n\n // Subtract margins of documentElement in case it's being used as parent\n // we do this only on HTML because it's the only element that behaves\n // differently when margins are applied to it. The margins are included in\n // the box of the documentElement, in the other cases not.\n if (!isIE10 && isHTML) {\n var marginTop = parseFloat(styles.marginTop, 10);\n var marginLeft = parseFloat(styles.marginLeft, 10);\n\n offsets.top -= borderTopWidth - marginTop;\n offsets.bottom -= borderTopWidth - marginTop;\n offsets.left -= borderLeftWidth - marginLeft;\n offsets.right -= borderLeftWidth - marginLeft;\n\n // Attach marginTop and marginLeft because in some circumstances we may need them\n offsets.marginTop = marginTop;\n offsets.marginLeft = marginLeft;\n }\n\n if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n offsets = includeScroll(offsets, parent);\n }\n\n return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var html = element.ownerDocument.documentElement;\n var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n var width = Math.max(html.clientWidth, window.innerWidth || 0);\n var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n var scrollTop = !excludeScroll ? getScroll(html) : 0;\n var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n var offset = {\n top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n width: width,\n height: height\n };\n\n return getClientRect(offset);\n}\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nfunction isFixed(element) {\n var nodeName = element.nodeName;\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n return false;\n }\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\n return true;\n }\n return isFixed(getParentNode(element));\n}\n\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nfunction getFixedPositionOffsetParent(element) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element || !element.parentElement || isIE()) {\n return document.documentElement;\n }\n var el = element.parentElement;\n while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n el = el.parentElement;\n }\n return el || document.documentElement;\n}\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n // NOTE: 1 DOM access here\n\n var boundaries = { top: 0, left: 0 };\n var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n\n // Handle viewport case\n if (boundariesElement === 'viewport') {\n boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n } else {\n // Handle other cases based on DOM element used as boundaries\n var boundariesNode = void 0;\n if (boundariesElement === 'scrollParent') {\n boundariesNode = getScrollParent(getParentNode(reference));\n if (boundariesNode.nodeName === 'BODY') {\n boundariesNode = popper.ownerDocument.documentElement;\n }\n } else if (boundariesElement === 'window') {\n boundariesNode = popper.ownerDocument.documentElement;\n } else {\n boundariesNode = boundariesElement;\n }\n\n var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n // In case of HTML, we need a different computation\n if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n var _getWindowSizes = getWindowSizes(),\n height = _getWindowSizes.height,\n width = _getWindowSizes.width;\n\n boundaries.top += offsets.top - offsets.marginTop;\n boundaries.bottom = height + offsets.top;\n boundaries.left += offsets.left - offsets.marginLeft;\n boundaries.right = width + offsets.left;\n } else {\n // for all the other DOM elements, this one is good\n boundaries = offsets;\n }\n }\n\n // Add paddings\n boundaries.left += padding;\n boundaries.top += padding;\n boundaries.right -= padding;\n boundaries.bottom -= padding;\n\n return boundaries;\n}\n\nfunction getArea(_ref) {\n var width = _ref.width,\n height = _ref.height;\n\n return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n if (placement.indexOf('auto') === -1) {\n return placement;\n }\n\n var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n var rects = {\n top: {\n width: boundaries.width,\n height: refRect.top - boundaries.top\n },\n right: {\n width: boundaries.right - refRect.right,\n height: boundaries.height\n },\n bottom: {\n width: boundaries.width,\n height: boundaries.bottom - refRect.bottom\n },\n left: {\n width: refRect.left - boundaries.left,\n height: boundaries.height\n }\n };\n\n var sortedAreas = Object.keys(rects).map(function (key) {\n return _extends({\n key: key\n }, rects[key], {\n area: getArea(rects[key])\n });\n }).sort(function (a, b) {\n return b.area - a.area;\n });\n\n var filteredAreas = sortedAreas.filter(function (_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n return width >= popper.clientWidth && height >= popper.clientHeight;\n });\n\n var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n var variation = placement.split('-')[1];\n\n return computedPlacement + (variation ? '-' + variation : '');\n}\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nfunction getReferenceOffsets(state, popper, reference) {\n var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nfunction getOuterSizes(element) {\n var styles = getComputedStyle(element);\n var x = parseFloat(styles.marginTop) + parseFloat(styles.marginBottom);\n var y = parseFloat(styles.marginLeft) + parseFloat(styles.marginRight);\n var result = {\n width: element.offsetWidth + y,\n height: element.offsetHeight + x\n };\n return result;\n}\n\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nfunction getOppositePlacement(placement) {\n var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n placement = placement.split('-')[0];\n\n // Get popper node sizes\n var popperRect = getOuterSizes(popper);\n\n // Add position, width and height to our offsets object\n var popperOffsets = {\n width: popperRect.width,\n height: popperRect.height\n };\n\n // depending by the popper placement we have to compute its offsets slightly differently\n var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n var mainSide = isHoriz ? 'top' : 'left';\n var secondarySide = isHoriz ? 'left' : 'top';\n var measurement = isHoriz ? 'height' : 'width';\n var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n if (placement === secondarySide) {\n popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n } else {\n popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n }\n\n return popperOffsets;\n}\n\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction find(arr, check) {\n // use native find if supported\n if (Array.prototype.find) {\n return arr.find(check);\n }\n\n // use `filter` to obtain the same behavior of `find`\n return arr.filter(check)[0];\n}\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction findIndex(arr, prop, value) {\n // use native findIndex if supported\n if (Array.prototype.findIndex) {\n return arr.findIndex(function (cur) {\n return cur[prop] === value;\n });\n }\n\n // use `find` + `indexOf` if `findIndex` isn't supported\n var match = find(arr, function (obj) {\n return obj[prop] === value;\n });\n return arr.indexOf(match);\n}\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nfunction runModifiers(modifiers, data, ends) {\n var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n modifiersToRun.forEach(function (modifier) {\n if (modifier['function']) {\n // eslint-disable-line dot-notation\n console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n }\n var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n if (modifier.enabled && isFunction(fn)) {\n // Add properties to offsets to make them a complete clientRect object\n // we do this before each modifier to make sure the previous one doesn't\n // mess with these values\n data.offsets.popper = getClientRect(data.offsets.popper);\n data.offsets.reference = getClientRect(data.offsets.reference);\n\n data = fn(data, modifier);\n }\n });\n\n return data;\n}\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nfunction update() {\n // if popper is destroyed, don't perform any further update\n if (this.state.isDestroyed) {\n return;\n }\n\n var data = {\n instance: this,\n styles: {},\n arrowStyles: {},\n attributes: {},\n flipped: false,\n offsets: {}\n };\n\n // compute reference element offsets\n data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n // store the computed placement inside `originalPlacement`\n data.originalPlacement = data.placement;\n\n data.positionFixed = this.options.positionFixed;\n\n // compute the popper offsets\n data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n // run the modifiers\n data = runModifiers(this.modifiers, data);\n\n // the first `update` will call `onCreate` callback\n // the other ones will call `onUpdate` callback\n if (!this.state.isCreated) {\n this.state.isCreated = true;\n this.options.onCreate(data);\n } else {\n this.options.onUpdate(data);\n }\n}\n\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nfunction isModifierEnabled(modifiers, modifierName) {\n return modifiers.some(function (_ref) {\n var name = _ref.name,\n enabled = _ref.enabled;\n return enabled && name === modifierName;\n });\n}\n\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nfunction getSupportedPropertyName(property) {\n var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n for (var i = 0; i < prefixes.length; i++) {\n var prefix = prefixes[i];\n var toCheck = prefix ? '' + prefix + upperProp : property;\n if (typeof document.body.style[toCheck] !== 'undefined') {\n return toCheck;\n }\n }\n return null;\n}\n\n/**\n * Destroy the popper\n * @method\n * @memberof Popper\n */\nfunction destroy() {\n this.state.isDestroyed = true;\n\n // touch DOM only if `applyStyle` modifier is enabled\n if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n this.popper.removeAttribute('x-placement');\n this.popper.style.position = '';\n this.popper.style.top = '';\n this.popper.style.left = '';\n this.popper.style.right = '';\n this.popper.style.bottom = '';\n this.popper.style.willChange = '';\n this.popper.style[getSupportedPropertyName('transform')] = '';\n }\n\n this.disableEventListeners();\n\n // remove the popper if user explicity asked for the deletion on destroy\n // do not use `remove` because IE11 doesn't support it\n if (this.options.removeOnDestroy) {\n this.popper.parentNode.removeChild(this.popper);\n }\n return this;\n}\n\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nfunction getWindow(element) {\n var ownerDocument = element.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n var isBody = scrollParent.nodeName === 'BODY';\n var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n target.addEventListener(event, callback, { passive: true });\n\n if (!isBody) {\n attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n }\n scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction setupEventListeners(reference, options, state, updateBound) {\n // Resize event listener on window\n state.updateBound = updateBound;\n getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n // Scroll event listener on scroll parents\n var scrollElement = getScrollParent(reference);\n attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n state.scrollElement = scrollElement;\n state.eventsEnabled = true;\n\n return state;\n}\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nfunction enableEventListeners() {\n if (!this.state.eventsEnabled) {\n this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n }\n}\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction removeEventListeners(reference, state) {\n // Remove resize event listener on window\n getWindow(reference).removeEventListener('resize', state.updateBound);\n\n // Remove scroll event listener on scroll parents\n state.scrollParents.forEach(function (target) {\n target.removeEventListener('scroll', state.updateBound);\n });\n\n // Reset state\n state.updateBound = null;\n state.scrollParents = [];\n state.scrollElement = null;\n state.eventsEnabled = false;\n return state;\n}\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger onUpdate callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nfunction disableEventListeners() {\n if (this.state.eventsEnabled) {\n cancelAnimationFrame(this.scheduleUpdate);\n this.state = removeEventListeners(this.reference, this.state);\n }\n}\n\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nfunction isNumeric(n) {\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setStyles(element, styles) {\n Object.keys(styles).forEach(function (prop) {\n var unit = '';\n // add unit if the value is numeric and is one of the following\n if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n unit = 'px';\n }\n element.style[prop] = styles[prop] + unit;\n });\n}\n\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setAttributes(element, attributes) {\n Object.keys(attributes).forEach(function (prop) {\n var value = attributes[prop];\n if (value !== false) {\n element.setAttribute(prop, attributes[prop]);\n } else {\n element.removeAttribute(prop);\n }\n });\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nfunction applyStyle(data) {\n // any property present in `data.styles` will be applied to the popper,\n // in this way we can make the 3rd party modifiers add custom styles to it\n // Be aware, modifiers could override the properties defined in the previous\n // lines of this modifier!\n setStyles(data.instance.popper, data.styles);\n\n // any property present in `data.attributes` will be applied to the popper,\n // they will be set as HTML attributes of the element\n setAttributes(data.instance.popper, data.attributes);\n\n // if arrowElement is defined and arrowStyles has some properties\n if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n setStyles(data.arrowElement, data.arrowStyles);\n }\n\n return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n // compute reference element offsets\n var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n popper.setAttribute('x-placement', placement);\n\n // Apply `position` to popper before anything else because\n // without the position applied we can't guarantee correct computations\n setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n return options;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeStyle(data, options) {\n var x = options.x,\n y = options.y;\n var popper = data.offsets.popper;\n\n // Remove this legacy support in Popper.js v2\n\n var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'applyStyle';\n }).gpuAcceleration;\n if (legacyGpuAccelerationOption !== undefined) {\n console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n }\n var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n var offsetParent = getOffsetParent(data.instance.popper);\n var offsetParentRect = getBoundingClientRect(offsetParent);\n\n // Styles\n var styles = {\n position: popper.position\n };\n\n // Avoid blurry text by using full pixel integers.\n // For pixel-perfect positioning, top/bottom prefers rounded\n // values, while left/right prefers floored values.\n var offsets = {\n left: Math.floor(popper.left),\n top: Math.round(popper.top),\n bottom: Math.round(popper.bottom),\n right: Math.floor(popper.right)\n };\n\n var sideA = x === 'bottom' ? 'top' : 'bottom';\n var sideB = y === 'right' ? 'left' : 'right';\n\n // if gpuAcceleration is set to `true` and transform is supported,\n // we use `translate3d` to apply the position to the popper we\n // automatically use the supported prefixed version if needed\n var prefixedProperty = getSupportedPropertyName('transform');\n\n // now, let's make a step back and look at this code closely (wtf?)\n // If the content of the popper grows once it's been positioned, it\n // may happen that the popper gets misplaced because of the new content\n // overflowing its reference element\n // To avoid this problem, we provide two options (x and y), which allow\n // the consumer to define the offset origin.\n // If we position a popper on top of a reference element, we can set\n // `x` to `top` to make the popper grow towards its top instead of\n // its bottom.\n var left = void 0,\n top = void 0;\n if (sideA === 'bottom') {\n top = -offsetParentRect.height + offsets.bottom;\n } else {\n top = offsets.top;\n }\n if (sideB === 'right') {\n left = -offsetParentRect.width + offsets.right;\n } else {\n left = offsets.left;\n }\n if (gpuAcceleration && prefixedProperty) {\n styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n styles[sideA] = 0;\n styles[sideB] = 0;\n styles.willChange = 'transform';\n } else {\n // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n var invertTop = sideA === 'bottom' ? -1 : 1;\n var invertLeft = sideB === 'right' ? -1 : 1;\n styles[sideA] = top * invertTop;\n styles[sideB] = left * invertLeft;\n styles.willChange = sideA + ', ' + sideB;\n }\n\n // Attributes\n var attributes = {\n 'x-placement': data.placement\n };\n\n // Update `data` attributes, styles and arrowStyles\n data.attributes = _extends({}, attributes, data.attributes);\n data.styles = _extends({}, styles, data.styles);\n data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n return data;\n}\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n var requesting = find(modifiers, function (_ref) {\n var name = _ref.name;\n return name === requestingName;\n });\n\n var isRequired = !!requesting && modifiers.some(function (modifier) {\n return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n });\n\n if (!isRequired) {\n var _requesting = '`' + requestingName + '`';\n var requested = '`' + requestedName + '`';\n console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n }\n return isRequired;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction arrow(data, options) {\n var _data$offsets$arrow;\n\n // arrow depends on keepTogether in order to work\n if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n return data;\n }\n\n var arrowElement = options.element;\n\n // if arrowElement is a string, suppose it's a CSS selector\n if (typeof arrowElement === 'string') {\n arrowElement = data.instance.popper.querySelector(arrowElement);\n\n // if arrowElement is not found, don't run the modifier\n if (!arrowElement) {\n return data;\n }\n } else {\n // if the arrowElement isn't a query selector we must check that the\n // provided DOM node is child of its popper node\n if (!data.instance.popper.contains(arrowElement)) {\n console.warn('WARNING: `arrow.element` must be child of its popper element!');\n return data;\n }\n }\n\n var placement = data.placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n var len = isVertical ? 'height' : 'width';\n var sideCapitalized = isVertical ? 'Top' : 'Left';\n var side = sideCapitalized.toLowerCase();\n var altSide = isVertical ? 'left' : 'top';\n var opSide = isVertical ? 'bottom' : 'right';\n var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n //\n // extends keepTogether behavior making sure the popper and its\n // reference have enough pixels in conjuction\n //\n\n // top/left side\n if (reference[opSide] - arrowElementSize < popper[side]) {\n data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n }\n // bottom/right side\n if (reference[side] + arrowElementSize > popper[opSide]) {\n data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n }\n data.offsets.popper = getClientRect(data.offsets.popper);\n\n // compute center of the popper\n var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n // Compute the sideValue using the updated popper offsets\n // take popper margin in account because we don't have this info available\n var css = getStyleComputedProperty(data.instance.popper);\n var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\n var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\n var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n // prevent arrowElement from being placed not contiguously to its popper\n sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n data.arrowElement = arrowElement;\n data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n return data;\n}\n\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nfunction getOppositeVariation(variation) {\n if (variation === 'end') {\n return 'start';\n } else if (variation === 'start') {\n return 'end';\n }\n return variation;\n}\n\n/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-right` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n// Get rid of `auto` `auto-start` and `auto-end`\nvar validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nfunction clockwise(placement) {\n var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var index = validPlacements.indexOf(placement);\n var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n FLIP: 'flip',\n CLOCKWISE: 'clockwise',\n COUNTERCLOCKWISE: 'counterclockwise'\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction flip(data, options) {\n // if `inner` modifier is enabled, we can't use the `flip` modifier\n if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n return data;\n }\n\n if (data.flipped && data.placement === data.originalPlacement) {\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n return data;\n }\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n var placement = data.placement.split('-')[0];\n var placementOpposite = getOppositePlacement(placement);\n var variation = data.placement.split('-')[1] || '';\n\n var flipOrder = [];\n\n switch (options.behavior) {\n case BEHAVIORS.FLIP:\n flipOrder = [placement, placementOpposite];\n break;\n case BEHAVIORS.CLOCKWISE:\n flipOrder = clockwise(placement);\n break;\n case BEHAVIORS.COUNTERCLOCKWISE:\n flipOrder = clockwise(placement, true);\n break;\n default:\n flipOrder = options.behavior;\n }\n\n flipOrder.forEach(function (step, index) {\n if (placement !== step || flipOrder.length === index + 1) {\n return data;\n }\n\n placement = data.placement.split('-')[0];\n placementOpposite = getOppositePlacement(placement);\n\n var popperOffsets = data.offsets.popper;\n var refOffsets = data.offsets.reference;\n\n // using floor because the reference offsets may contain decimals we are not going to consider here\n var floor = Math.floor;\n var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n // flip the variation if required\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n if (overlapsRef || overflowsBoundaries || flippedVariation) {\n // this boolean to detect any flip loop\n data.flipped = true;\n\n if (overlapsRef || overflowsBoundaries) {\n placement = flipOrder[index + 1];\n }\n\n if (flippedVariation) {\n variation = getOppositeVariation(variation);\n }\n\n data.placement = placement + (variation ? '-' + variation : '');\n\n // this object contains `position`, we want to preserve it along with\n // any additional property we may add in the future\n data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n data = runModifiers(data.instance.modifiers, data, 'flip');\n }\n });\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction keepTogether(data) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var placement = data.placement.split('-')[0];\n var floor = Math.floor;\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var side = isVertical ? 'right' : 'bottom';\n var opSide = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n if (popper[side] < floor(reference[opSide])) {\n data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n }\n if (popper[opSide] > floor(reference[side])) {\n data.offsets.popper[opSide] = floor(reference[side]);\n }\n\n return data;\n}\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n // separate value from unit\n var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n var value = +split[1];\n var unit = split[2];\n\n // If it's not a number it's an operator, I guess\n if (!value) {\n return str;\n }\n\n if (unit.indexOf('%') === 0) {\n var element = void 0;\n switch (unit) {\n case '%p':\n element = popperOffsets;\n break;\n case '%':\n case '%r':\n default:\n element = referenceOffsets;\n }\n\n var rect = getClientRect(element);\n return rect[measurement] / 100 * value;\n } else if (unit === 'vh' || unit === 'vw') {\n // if is a vh or vw, we calculate the size based on the viewport\n var size = void 0;\n if (unit === 'vh') {\n size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n } else {\n size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n return size / 100 * value;\n } else {\n // if is an explicit pixel unit, we get rid of the unit and keep the value\n // if is an implicit unit, it's px, and we return just the value\n return value;\n }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n var offsets = [0, 0];\n\n // Use height if placement is left or right and index is 0 otherwise use width\n // in this way the first offset will use an axis and the second one\n // will use the other one\n var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n // Split the offset string to obtain a list of values and operands\n // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n return frag.trim();\n });\n\n // Detect if the offset string contains a pair of values or a single one\n // they could be separated by comma or space\n var divider = fragments.indexOf(find(fragments, function (frag) {\n return frag.search(/,|\\s/) !== -1;\n }));\n\n if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n }\n\n // If divider is found, we divide the list of values and operands to divide\n // them by ofset X and Y.\n var splitRegex = /\\s*,\\s*|\\s+/;\n var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n // Convert the values with units to absolute pixels to allow our computations\n ops = ops.map(function (op, index) {\n // Most of the units rely on the orientation of the popper\n var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n var mergeWithPrevious = false;\n return op\n // This aggregates any `+` or `-` sign that aren't considered operators\n // e.g.: 10 + +5 => [10, +, +5]\n .reduce(function (a, b) {\n if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n a[a.length - 1] = b;\n mergeWithPrevious = true;\n return a;\n } else if (mergeWithPrevious) {\n a[a.length - 1] += b;\n mergeWithPrevious = false;\n return a;\n } else {\n return a.concat(b);\n }\n }, [])\n // Here we convert the string values into number values (in px)\n .map(function (str) {\n return toValue(str, measurement, popperOffsets, referenceOffsets);\n });\n });\n\n // Loop trough the offsets arrays and execute the operations\n ops.forEach(function (op, index) {\n op.forEach(function (frag, index2) {\n if (isNumeric(frag)) {\n offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n }\n });\n });\n return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nfunction offset(data, _ref) {\n var offset = _ref.offset;\n var placement = data.placement,\n _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var basePlacement = placement.split('-')[0];\n\n var offsets = void 0;\n if (isNumeric(+offset)) {\n offsets = [+offset, 0];\n } else {\n offsets = parseOffset(offset, popper, reference, basePlacement);\n }\n\n if (basePlacement === 'left') {\n popper.top += offsets[0];\n popper.left -= offsets[1];\n } else if (basePlacement === 'right') {\n popper.top += offsets[0];\n popper.left += offsets[1];\n } else if (basePlacement === 'top') {\n popper.left += offsets[0];\n popper.top -= offsets[1];\n } else if (basePlacement === 'bottom') {\n popper.left += offsets[0];\n popper.top += offsets[1];\n }\n\n data.popper = popper;\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction preventOverflow(data, options) {\n var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n // If offsetParent is the reference element, we really want to\n // go one step up and use the next offsetParent as reference to\n // avoid to make this modifier completely useless and look like broken\n if (data.instance.reference === boundariesElement) {\n boundariesElement = getOffsetParent(boundariesElement);\n }\n\n // NOTE: DOM access here\n // resets the popper's position so that the document size can be calculated excluding\n // the size of the popper element itself\n var transformProp = getSupportedPropertyName('transform');\n var popperStyles = data.instance.popper.style; // assignment to help minification\n var top = popperStyles.top,\n left = popperStyles.left,\n transform = popperStyles[transformProp];\n\n popperStyles.top = '';\n popperStyles.left = '';\n popperStyles[transformProp] = '';\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n // NOTE: DOM access here\n // restores the original style properties after the offsets have been computed\n popperStyles.top = top;\n popperStyles.left = left;\n popperStyles[transformProp] = transform;\n\n options.boundaries = boundaries;\n\n var order = options.priority;\n var popper = data.offsets.popper;\n\n var check = {\n primary: function primary(placement) {\n var value = popper[placement];\n if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n value = Math.max(popper[placement], boundaries[placement]);\n }\n return defineProperty({}, placement, value);\n },\n secondary: function secondary(placement) {\n var mainSide = placement === 'right' ? 'left' : 'top';\n var value = popper[mainSide];\n if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n }\n return defineProperty({}, mainSide, value);\n }\n };\n\n order.forEach(function (placement) {\n var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n popper = _extends({}, popper, check[side](placement));\n });\n\n data.offsets.popper = popper;\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction shift(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var shiftvariation = placement.split('-')[1];\n\n // if shift shiftvariation is specified, run the modifier\n if (shiftvariation) {\n var _data$offsets = data.offsets,\n reference = _data$offsets.reference,\n popper = _data$offsets.popper;\n\n var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n var side = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n var shiftOffsets = {\n start: defineProperty({}, side, reference[side]),\n end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n };\n\n data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction hide(data) {\n if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n return data;\n }\n\n var refRect = data.offsets.reference;\n var bound = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'preventOverflow';\n }).boundaries;\n\n if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === true) {\n return data;\n }\n\n data.hide = true;\n data.attributes['x-out-of-boundaries'] = '';\n } else {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === false) {\n return data;\n }\n\n data.hide = false;\n data.attributes['x-out-of-boundaries'] = false;\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction inner(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n data.placement = getOppositePlacement(placement);\n data.offsets.popper = getClientRect(popper);\n\n return data;\n}\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nvar modifiers = {\n /**\n * Modifier used to shift the popper on the start or end of its reference\n * element.<br />\n * It will read the variation of the `placement` property.<br />\n * It can be one either `-end` or `-start`.\n * @memberof modifiers\n * @inner\n */\n shift: {\n /** @prop {number} order=100 - Index used to define the order of execution */\n order: 100,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: shift\n },\n\n /**\n * The `offset` modifier can shift your popper on both its axis.\n *\n * It accepts the following units:\n * - `px` or unitless, interpreted as pixels\n * - `%` or `%r`, percentage relative to the length of the reference element\n * - `%p`, percentage relative to the length of the popper element\n * - `vw`, CSS viewport width unit\n * - `vh`, CSS viewport height unit\n *\n * For length is intended the main axis relative to the placement of the popper.<br />\n * This means that if the placement is `top` or `bottom`, the length will be the\n * `width`. In case of `left` or `right`, it will be the height.\n *\n * You can provide a single value (as `Number` or `String`), or a pair of values\n * as `String` divided by a comma or one (or more) white spaces.<br />\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.<br />\n * Additionally, it accepts additions and subtractions between different units.\n * Note that multiplications and divisions aren't supported.\n *\n * Valid examples are:\n * ```\n * 10\n * '10%'\n * '10, 10'\n * '10%, 10'\n * '10 + 10%'\n * '10 - 5vh + 3%'\n * '-10px + 5vh, 5px - 6%'\n * ```\n * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n * > More on this [reading this issue](https://github.com/FezVrasta/popper.js/issues/373)\n *\n * @memberof modifiers\n * @inner\n */\n offset: {\n /** @prop {number} order=200 - Index used to define the order of execution */\n order: 200,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: offset,\n /** @prop {Number|String} offset=0\n * The offset value as described in the modifier description\n */\n offset: 0\n },\n\n /**\n * Modifier used to prevent the popper from being positioned outside the boundary.\n *\n * An scenario exists where the reference itself is not within the boundaries.<br />\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n * In this case we need to decide whether the popper should either:\n *\n * - detach from the reference and remain \"trapped\" in the boundaries, or\n * - if it should ignore the boundary and \"escape with its reference\"\n *\n * When `escapeWithReference` is set to`true` and reference is completely\n * outside its boundaries, the popper will overflow (or completely leave)\n * the boundaries in order to remain attached to the edge of the reference.\n *\n * @memberof modifiers\n * @inner\n */\n preventOverflow: {\n /** @prop {number} order=300 - Index used to define the order of execution */\n order: 300,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: preventOverflow,\n /**\n * @prop {Array} [priority=['left','right','top','bottom']]\n * Popper will try to prevent overflow following these priorities by default,\n * then, it could overflow on the left and on top of the `boundariesElement`\n */\n priority: ['left', 'right', 'top', 'bottom'],\n /**\n * @prop {number} padding=5\n * Amount of pixel used to define a minimum distance between the boundaries\n * and the popper this makes sure the popper has always a little padding\n * between the edges of its container\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='scrollParent'\n * Boundaries used by the modifier, can be `scrollParent`, `window`,\n * `viewport` or any DOM element.\n */\n boundariesElement: 'scrollParent'\n },\n\n /**\n * Modifier used to make sure the reference and its popper stay near eachothers\n * without leaving any gap between the two. Expecially useful when the arrow is\n * enabled and you want to assure it to point to its reference element.\n * It cares only about the first axis, you can still have poppers with margin\n * between the popper and its reference element.\n * @memberof modifiers\n * @inner\n */\n keepTogether: {\n /** @prop {number} order=400 - Index used to define the order of execution */\n order: 400,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: keepTogether\n },\n\n /**\n * This modifier is used to move the `arrowElement` of the popper to make\n * sure it is positioned between the reference element and its popper element.\n * It will read the outer size of the `arrowElement` node to detect how many\n * pixels of conjuction are needed.\n *\n * It has no effect if no `arrowElement` is provided.\n * @memberof modifiers\n * @inner\n */\n arrow: {\n /** @prop {number} order=500 - Index used to define the order of execution */\n order: 500,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: arrow,\n /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n element: '[x-arrow]'\n },\n\n /**\n * Modifier used to flip the popper's placement when it starts to overlap its\n * reference element.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n *\n * **NOTE:** this modifier will interrupt the current update cycle and will\n * restart it if it detects the need to flip the placement.\n * @memberof modifiers\n * @inner\n */\n flip: {\n /** @prop {number} order=600 - Index used to define the order of execution */\n order: 600,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: flip,\n /**\n * @prop {String|Array} behavior='flip'\n * The behavior used to change the popper's placement. It can be one of\n * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n * placements (with optional variations).\n */\n behavior: 'flip',\n /**\n * @prop {number} padding=5\n * The popper will flip if it hits the edges of the `boundariesElement`\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='viewport'\n * The element which will define the boundaries of the popper position,\n * the popper will never be placed outside of the defined boundaries\n * (except if keepTogether is enabled)\n */\n boundariesElement: 'viewport'\n },\n\n /**\n * Modifier used to make the popper flow toward the inner of the reference element.\n * By default, when this modifier is disabled, the popper will be placed outside\n * the reference element.\n * @memberof modifiers\n * @inner\n */\n inner: {\n /** @prop {number} order=700 - Index used to define the order of execution */\n order: 700,\n /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n enabled: false,\n /** @prop {ModifierFn} */\n fn: inner\n },\n\n /**\n * Modifier used to hide the popper when its reference element is outside of the\n * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n * be used to hide with a CSS selector the popper when its reference is\n * out of boundaries.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n * @memberof modifiers\n * @inner\n */\n hide: {\n /** @prop {number} order=800 - Index used to define the order of execution */\n order: 800,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: hide\n },\n\n /**\n * Computes the style that will be applied to the popper element to gets\n * properly positioned.\n *\n * Note that this modifier will not touch the DOM, it just prepares the styles\n * so that `applyStyle` modifier can apply it. This separation is useful\n * in case you need to replace `applyStyle` with a custom implementation.\n *\n * This modifier has `850` as `order` value to maintain backward compatibility\n * with previous versions of Popper.js. Expect the modifiers ordering method\n * to change in future major versions of the library.\n *\n * @memberof modifiers\n * @inner\n */\n computeStyle: {\n /** @prop {number} order=850 - Index used to define the order of execution */\n order: 850,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: computeStyle,\n /**\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3d transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties.\n */\n gpuAcceleration: true,\n /**\n * @prop {string} [x='bottom']\n * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n * Change this if your popper should grow in a direction different from `bottom`\n */\n x: 'bottom',\n /**\n * @prop {string} [x='left']\n * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n * Change this if your popper should grow in a direction different from `right`\n */\n y: 'right'\n },\n\n /**\n * Applies the computed styles to the popper element.\n *\n * All the DOM manipulations are limited to this modifier. This is useful in case\n * you want to integrate Popper.js inside a framework or view library and you\n * want to delegate all the DOM manipulations to it.\n *\n * Note that if you disable this modifier, you must make sure the popper element\n * has its position set to `absolute` before Popper.js can do its work!\n *\n * Just disable this modifier and define you own to achieve the desired effect.\n *\n * @memberof modifiers\n * @inner\n */\n applyStyle: {\n /** @prop {number} order=900 - Index used to define the order of execution */\n order: 900,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: applyStyle,\n /** @prop {Function} */\n onLoad: applyStyleOnLoad,\n /**\n * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3d transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties.\n */\n gpuAcceleration: undefined\n }\n};\n\n/**\n * The `dataObject` is an object containing all the informations used by Popper.js\n * this object get passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper.\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper, it expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow, it expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements.\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overriden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass as 3rd argument an object with the same\n * structure of this object, example:\n * ```\n * new Popper(ref, pop, {\n * modifiers: {\n * preventOverflow: { enabled: false }\n * }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nvar Defaults = {\n /**\n * Popper's placement\n * @prop {Popper.placements} placement='bottom'\n */\n placement: 'bottom',\n\n /**\n * Set this to true if you want popper to position it self in 'fixed' mode\n * @prop {Boolean} positionFixed=false\n */\n positionFixed: false,\n\n /**\n * Whether events (resize, scroll) are initially enabled\n * @prop {Boolean} eventsEnabled=true\n */\n eventsEnabled: true,\n\n /**\n * Set to true if you want to automatically remove the popper when\n * you call the `destroy` method.\n * @prop {Boolean} removeOnDestroy=false\n */\n removeOnDestroy: false,\n\n /**\n * Callback called when the popper is created.<br />\n * By default, is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onCreate}\n */\n onCreate: function onCreate() {},\n\n /**\n * Callback called when the popper is updated, this callback is not called\n * on the initialization/creation of the popper, but only on subsequent\n * updates.<br />\n * By default, is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onUpdate}\n */\n onUpdate: function onUpdate() {},\n\n /**\n * List of modifiers used to modify the offsets before they are applied to the popper.\n * They provide most of the functionalities of Popper.js\n * @prop {modifiers}\n */\n modifiers: modifiers\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n\n// Utils\n// Methods\nvar Popper = function () {\n /**\n * Create a new Popper.js instance\n * @class Popper\n * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper.\n * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n * @return {Object} instance - The generated Popper.js instance\n */\n function Popper(reference, popper) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n classCallCheck(this, Popper);\n\n this.scheduleUpdate = function () {\n return requestAnimationFrame(_this.update);\n };\n\n // make update() debounced, so that it only runs at most once-per-tick\n this.update = debounce(this.update.bind(this));\n\n // with {} we create a new object with the options inside it\n this.options = _extends({}, Popper.Defaults, options);\n\n // init state\n this.state = {\n isDestroyed: false,\n isCreated: false,\n scrollParents: []\n };\n\n // get reference and popper elements (allow jQuery wrappers)\n this.reference = reference && reference.jquery ? reference[0] : reference;\n this.popper = popper && popper.jquery ? popper[0] : popper;\n\n // Deep merge modifiers options\n this.options.modifiers = {};\n Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n });\n\n // Refactoring modifiers' list (Object => Array)\n this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n return _extends({\n name: name\n }, _this.options.modifiers[name]);\n })\n // sort the modifiers by order\n .sort(function (a, b) {\n return a.order - b.order;\n });\n\n // modifiers have the ability to execute arbitrary code when Popper.js get inited\n // such code is executed in the same order of its modifier\n // they could add new properties to their options configuration\n // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n this.modifiers.forEach(function (modifierOptions) {\n if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n }\n });\n\n // fire the first update to position the popper in the right place\n this.update();\n\n var eventsEnabled = this.options.eventsEnabled;\n if (eventsEnabled) {\n // setup event listeners, they will take care of update the position in specific situations\n this.enableEventListeners();\n }\n\n this.state.eventsEnabled = eventsEnabled;\n }\n\n // We can't use class properties because they don't get listed in the\n // class prototype and break stuff like Sinon stubs\n\n\n createClass(Popper, [{\n key: 'update',\n value: function update$$1() {\n return update.call(this);\n }\n }, {\n key: 'destroy',\n value: function destroy$$1() {\n return destroy.call(this);\n }\n }, {\n key: 'enableEventListeners',\n value: function enableEventListeners$$1() {\n return enableEventListeners.call(this);\n }\n }, {\n key: 'disableEventListeners',\n value: function disableEventListeners$$1() {\n return disableEventListeners.call(this);\n }\n\n /**\n * Schedule an update, it will run on the next UI update available\n * @method scheduleUpdate\n * @memberof Popper\n */\n\n\n /**\n * Collection of utilities useful when writing custom modifiers.\n * Starting from version 1.7, this method is available only if you\n * include `popper-utils.js` before `popper.js`.\n *\n * **DEPRECATION**: This way to access PopperUtils is deprecated\n * and will be removed in v2! Use the PopperUtils module directly instead.\n * Due to the high instability of the methods contained in Utils, we can't\n * guarantee them to follow semver. Use them at your own risk!\n * @static\n * @private\n * @type {Object}\n * @deprecated since version 1.8\n * @member Utils\n * @memberof Popper\n */\n\n }]);\n return Popper;\n}();\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\n\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Popper);\n//# sourceMappingURL=popper.js.map\n\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(2)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcG9wcGVyLmpzL2Rpc3QvZXNtL3BvcHBlci5qcz82NjBjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxrQ0FBa0M7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsSUFBSTtBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQixjQUFjLE9BQU87QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7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QUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixhQUFhLFFBQVE7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QixXQUFXLFlBQVk7QUFDdkIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsWUFBWTtBQUN2QixXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxvQkFBb0I7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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QUFDQSxjQUFjLE9BQU87QUFDckI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiFcbiAqIEBmaWxlT3ZlcnZpZXcgS2lja2FzcyBsaWJyYXJ5IHRvIGNyZWF0ZSBhbmQgcGxhY2UgcG9wcGVycyBuZWFyIHRoZWlyIHJlZmVyZW5jZSBlbGVtZW50cy5cbiAqIEB2ZXJzaW9uIDEuMTQuM1xuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiBGZWRlcmljbyBaaXZvbG8gYW5kIGNvbnRyaWJ1dG9yc1xuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cbnZhciBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuXG52YXIgbG9uZ2VyVGltZW91dEJyb3dzZXJzID0gWydFZGdlJywgJ1RyaWRlbnQnLCAnRmlyZWZveCddO1xudmFyIHRpbWVvdXREdXJhdGlvbiA9IDA7XG5mb3IgKHZhciBpID0gMDsgaSA8IGxvbmdlclRpbWVvdXRCcm93c2Vycy5sZW5ndGg7IGkgKz0gMSkge1xuICBpZiAoaXNCcm93c2VyICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihsb25nZXJUaW1lb3V0QnJvd3NlcnNbaV0pID49IDApIHtcbiAgICB0aW1lb3V0RHVyYXRpb24gPSAxO1xuICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1pY3JvdGFza0RlYm91bmNlKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgd2luZG93LlByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGVkID0gZmFsc2U7XG4gICAgICBmbigpO1xuICAgIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0YXNrRGVib3VuY2UoZm4pIHtcbiAgdmFyIHNjaGVkdWxlZCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghc2NoZWR1bGVkKSB7XG4gICAgICBzY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgICBmbigpO1xuICAgICAgfSwgdGltZW91dER1cmF0aW9uKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBzdXBwb3J0c01pY3JvVGFza3MgPSBpc0Jyb3dzZXIgJiYgd2luZG93LlByb21pc2U7XG5cbi8qKlxuKiBDcmVhdGUgYSBkZWJvdW5jZWQgdmVyc2lvbiBvZiBhIG1ldGhvZCwgdGhhdCdzIGFzeW5jaHJvbm91c2x5IGRlZmVycmVkXG4qIGJ1dCBjYWxsZWQgaW4gdGhlIG1pbmltdW0gdGltZSBwb3NzaWJsZS5cbipcbiogQG1ldGhvZFxuKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4qIEBhcmd1bWVudCB7RnVuY3Rpb259IGZuXG4qIEByZXR1cm5zIHtGdW5jdGlvbn1cbiovXG52YXIgZGVib3VuY2UgPSBzdXBwb3J0c01pY3JvVGFza3MgPyBtaWNyb3Rhc2tEZWJvdW5jZSA6IHRhc2tEZWJvdW5jZTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYSBmdW5jdGlvblxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtBbnl9IGZ1bmN0aW9uVG9DaGVjayAtIHZhcmlhYmxlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYW5zd2VyIHRvOiBpcyBhIGZ1bmN0aW9uP1xuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGZ1bmN0aW9uVG9DaGVjaykge1xuICB2YXIgZ2V0VHlwZSA9IHt9O1xuICByZXR1cm4gZnVuY3Rpb25Ub0NoZWNrICYmIGdldFR5cGUudG9TdHJpbmcuY2FsbChmdW5jdGlvblRvQ2hlY2spID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuXG4vKipcbiAqIEdldCBDU1MgY29tcHV0ZWQgcHJvcGVydHkgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWVtZW50fSBlbGVtZW50XG4gKiBAYXJndW1lbnQge1N0cmluZ30gcHJvcGVydHlcbiAqL1xuZnVuY3Rpb24gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5KSB7XG4gIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9PSAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG4gIHZhciBjc3MgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpO1xuICByZXR1cm4gcHJvcGVydHkgPyBjc3NbcHJvcGVydHldIDogY3NzO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcmVudE5vZGUgb3IgdGhlIGhvc3Qgb2YgdGhlIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IHBhcmVudFxuICovXG5mdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHJldHVybiBlbGVtZW50LnBhcmVudE5vZGUgfHwgZWxlbWVudC5ob3N0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNjcm9sbGluZyBwYXJlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IHNjcm9sbCBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gUmV0dXJuIGJvZHksIGBnZXRTY3JvbGxgIHdpbGwgdGFrZSBjYXJlIHRvIGdldCB0aGUgY29ycmVjdCBgc2Nyb2xsVG9wYCBmcm9tIGl0XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgc3dpdGNoIChlbGVtZW50Lm5vZGVOYW1lKSB7XG4gICAgY2FzZSAnSFRNTCc6XG4gICAgY2FzZSAnQk9EWSc6XG4gICAgICByZXR1cm4gZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHk7XG4gICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgIHJldHVybiBlbGVtZW50LmJvZHk7XG4gIH1cblxuICAvLyBGaXJlZm94IHdhbnQgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcblxuICB2YXIgX2dldFN0eWxlQ29tcHV0ZWRQcm9wID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQpLFxuICAgICAgb3ZlcmZsb3cgPSBfZ2V0U3R5bGVDb21wdXRlZFByb3Aub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0U3R5bGVDb21wdXRlZFByb3Aub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldFN0eWxlQ29tcHV0ZWRQcm9wLm92ZXJmbG93WTtcblxuICBpZiAoLyhhdXRvfHNjcm9sbHxvdmVybGF5KS8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCkpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG59XG5cbnZhciBpc0lFMTEgPSBpc0Jyb3dzZXIgJiYgISEod2luZG93Lk1TSW5wdXRNZXRob2RDb250ZXh0ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSk7XG52YXIgaXNJRTEwID0gaXNCcm93c2VyICYmIC9NU0lFIDEwLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGJyb3dzZXIgaXMgSW50ZXJuZXQgRXhwbG9yZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXNJRVxuICovXG5mdW5jdGlvbiBpc0lFKHZlcnNpb24pIHtcbiAgaWYgKHZlcnNpb24gPT09IDExKSB7XG4gICAgcmV0dXJuIGlzSUUxMTtcbiAgfVxuICBpZiAodmVyc2lvbiA9PT0gMTApIHtcbiAgICByZXR1cm4gaXNJRTEwO1xuICB9XG4gIHJldHVybiBpc0lFMTEgfHwgaXNJRTEwO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG9mZnNldCBwYXJlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IG9mZnNldCBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIHZhciBub09mZnNldFBhcmVudCA9IGlzSUUoMTApID8gZG9jdW1lbnQuYm9keSA6IG51bGw7XG5cbiAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcbiAgdmFyIG9mZnNldFBhcmVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50O1xuICAvLyBTa2lwIGhpZGRlbiBlbGVtZW50cyB3aGljaCBkb24ndCBoYXZlIGFuIG9mZnNldFBhcmVudFxuICB3aGlsZSAob2Zmc2V0UGFyZW50ID09PSBub09mZnNldFBhcmVudCAmJiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZykge1xuICAgIG9mZnNldFBhcmVudCA9IChlbGVtZW50ID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpLm9mZnNldFBhcmVudDtcbiAgfVxuXG4gIHZhciBub2RlTmFtZSA9IG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQubm9kZU5hbWU7XG5cbiAgaWYgKCFub2RlTmFtZSB8fCBub2RlTmFtZSA9PT0gJ0JPRFknIHx8IG5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICByZXR1cm4gZWxlbWVudCA/IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cblxuICAvLyAub2Zmc2V0UGFyZW50IHdpbGwgcmV0dXJuIHRoZSBjbG9zZXN0IFREIG9yIFRBQkxFIGluIGNhc2VcbiAgLy8gbm8gb2Zmc2V0UGFyZW50IGlzIHByZXNlbnQsIEkgaGF0ZSB0aGlzIGpvYi4uLlxuICBpZiAoWydURCcsICdUQUJMRSddLmluZGV4T2Yob2Zmc2V0UGFyZW50Lm5vZGVOYW1lKSAhPT0gLTEgJiYgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgcmV0dXJuIGdldE9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudDtcbn1cblxuZnVuY3Rpb24gaXNPZmZzZXRDb250YWluZXIoZWxlbWVudCkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuXG4gIGlmIChub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBub2RlTmFtZSA9PT0gJ0hUTUwnIHx8IGdldE9mZnNldFBhcmVudChlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKSA9PT0gZWxlbWVudDtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgcm9vdCBub2RlIChkb2N1bWVudCwgc2hhZG93RE9NIHJvb3QpIG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IG5vZGVcbiAqIEByZXR1cm5zIHtFbGVtZW50fSByb290IG5vZGVcbiAqL1xuZnVuY3Rpb24gZ2V0Um9vdChub2RlKSB7XG4gIGlmIChub2RlLnBhcmVudE5vZGUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gZ2V0Um9vdChub2RlLnBhcmVudE5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG9mZnNldCBwYXJlbnQgY29tbW9uIHRvIHRoZSB0d28gcHJvdmlkZWQgbm9kZXNcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudDFcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudDJcbiAqIEByZXR1cm5zIHtFbGVtZW50fSBjb21tb24gb2Zmc2V0IHBhcmVudFxuICovXG5mdW5jdGlvbiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQxLCBlbGVtZW50Mikge1xuICAvLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCB0byBhdm9pZCBlcnJvcnMgaW4gY2FzZSBvbmUgb2YgdGhlIGVsZW1lbnRzIGlzbid0IGRlZmluZWQgZm9yIGFueSByZWFzb25cbiAgaWYgKCFlbGVtZW50MSB8fCAhZWxlbWVudDEubm9kZVR5cGUgfHwgIWVsZW1lbnQyIHx8ICFlbGVtZW50Mi5ub2RlVHlwZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cblxuICAvLyBIZXJlIHdlIG1ha2Ugc3VyZSB0byBnaXZlIGFzIFwic3RhcnRcIiB0aGUgZWxlbWVudCB0aGF0IGNvbWVzIGZpcnN0IGluIHRoZSBET01cbiAgdmFyIG9yZGVyID0gZWxlbWVudDEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbWVudDIpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkc7XG4gIHZhciBzdGFydCA9IG9yZGVyID8gZWxlbWVudDEgOiBlbGVtZW50MjtcbiAgdmFyIGVuZCA9IG9yZGVyID8gZWxlbWVudDIgOiBlbGVtZW50MTtcblxuICAvLyBHZXQgY29tbW9uIGFuY2VzdG9yIGNvbnRhaW5lclxuICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICByYW5nZS5zZXRTdGFydChzdGFydCwgMCk7XG4gIHJhbmdlLnNldEVuZChlbmQsIDApO1xuICB2YXIgY29tbW9uQW5jZXN0b3JDb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAvLyBCb3RoIG5vZGVzIGFyZSBpbnNpZGUgI2RvY3VtZW50XG5cbiAgaWYgKGVsZW1lbnQxICE9PSBjb21tb25BbmNlc3RvckNvbnRhaW5lciAmJiBlbGVtZW50MiAhPT0gY29tbW9uQW5jZXN0b3JDb250YWluZXIgfHwgc3RhcnQuY29udGFpbnMoZW5kKSkge1xuICAgIGlmIChpc09mZnNldENvbnRhaW5lcihjb21tb25BbmNlc3RvckNvbnRhaW5lcikpIHtcbiAgICAgIHJldHVybiBjb21tb25BbmNlc3RvckNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0T2Zmc2V0UGFyZW50KGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKTtcbiAgfVxuXG4gIC8vIG9uZSBvZiB0aGUgbm9kZXMgaXMgaW5zaWRlIHNoYWRvd0RPTSwgZmluZCB3aGljaCBvbmVcbiAgdmFyIGVsZW1lbnQxcm9vdCA9IGdldFJvb3QoZWxlbWVudDEpO1xuICBpZiAoZWxlbWVudDFyb290Lmhvc3QpIHtcbiAgICByZXR1cm4gZmluZENvbW1vbk9mZnNldFBhcmVudChlbGVtZW50MXJvb3QuaG9zdCwgZWxlbWVudDIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQxLCBnZXRSb290KGVsZW1lbnQyKS5ob3N0KTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgdGhlIHNjcm9sbCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBpbiB0aGUgZ2l2ZW4gc2lkZSAodG9wIGFuZCBsZWZ0KVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAYXJndW1lbnQge1N0cmluZ30gc2lkZSBgdG9wYCBvciBgbGVmdGBcbiAqIEByZXR1cm5zIHtudW1iZXJ9IGFtb3VudCBvZiBzY3JvbGxlZCBwaXhlbHNcbiAqL1xuZnVuY3Rpb24gZ2V0U2Nyb2xsKGVsZW1lbnQpIHtcbiAgdmFyIHNpZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICd0b3AnO1xuXG4gIHZhciB1cHBlclNpZGUgPSBzaWRlID09PSAndG9wJyA/ICdzY3JvbGxUb3AnIDogJ3Njcm9sbExlZnQnO1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuXG4gIGlmIChub2RlTmFtZSA9PT0gJ0JPRFknIHx8IG5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICB2YXIgaHRtbCA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdmFyIHNjcm9sbGluZ0VsZW1lbnQgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCB8fCBodG1sO1xuICAgIHJldHVybiBzY3JvbGxpbmdFbGVtZW50W3VwcGVyU2lkZV07XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFt1cHBlclNpZGVdO1xufVxuXG4vKlxuICogU3VtIG9yIHN1YnRyYWN0IHRoZSBlbGVtZW50IHNjcm9sbCB2YWx1ZXMgKGxlZnQgYW5kIHRvcCkgZnJvbSBhIGdpdmVuIHJlY3Qgb2JqZWN0XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge09iamVjdH0gcmVjdCAtIFJlY3Qgb2JqZWN0IHlvdSB3YW50IHRvIGNoYW5nZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IGZyb20gdGhlIGZ1bmN0aW9uIHJlYWRzIHRoZSBzY3JvbGwgdmFsdWVzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHN1YnRyYWN0IC0gc2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gc3VidHJhY3QgdGhlIHNjcm9sbCB2YWx1ZXNcbiAqIEByZXR1cm4ge09iamVjdH0gcmVjdCAtIFRoZSBtb2RpZmllciByZWN0IG9iamVjdFxuICovXG5mdW5jdGlvbiBpbmNsdWRlU2Nyb2xsKHJlY3QsIGVsZW1lbnQpIHtcbiAgdmFyIHN1YnRyYWN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcblxuICB2YXIgc2Nyb2xsVG9wID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICd0b3AnKTtcbiAgdmFyIHNjcm9sbExlZnQgPSBnZXRTY3JvbGwoZWxlbWVudCwgJ2xlZnQnKTtcbiAgdmFyIG1vZGlmaWVyID0gc3VidHJhY3QgPyAtMSA6IDE7XG4gIHJlY3QudG9wICs9IHNjcm9sbFRvcCAqIG1vZGlmaWVyO1xuICByZWN0LmJvdHRvbSArPSBzY3JvbGxUb3AgKiBtb2RpZmllcjtcbiAgcmVjdC5sZWZ0ICs9IHNjcm9sbExlZnQgKiBtb2RpZmllcjtcbiAgcmVjdC5yaWdodCArPSBzY3JvbGxMZWZ0ICogbW9kaWZpZXI7XG4gIHJldHVybiByZWN0O1xufVxuXG4vKlxuICogSGVscGVyIHRvIGRldGVjdCBib3JkZXJzIG9mIGEgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtDU1NTdHlsZURlY2xhcmF0aW9ufSBzdHlsZXNcbiAqIFJlc3VsdCBvZiBgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5YCBvbiB0aGUgZ2l2ZW4gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IGF4aXMgLSBgeGAgb3IgYHlgXG4gKiBAcmV0dXJuIHtudW1iZXJ9IGJvcmRlcnMgLSBUaGUgYm9yZGVycyBzaXplIG9mIHRoZSBnaXZlbiBheGlzXG4gKi9cblxuZnVuY3Rpb24gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCBheGlzKSB7XG4gIHZhciBzaWRlQSA9IGF4aXMgPT09ICd4JyA/ICdMZWZ0JyA6ICdUb3AnO1xuICB2YXIgc2lkZUIgPSBzaWRlQSA9PT0gJ0xlZnQnID8gJ1JpZ2h0JyA6ICdCb3R0b20nO1xuXG4gIHJldHVybiBwYXJzZUZsb2F0KHN0eWxlc1snYm9yZGVyJyArIHNpZGVBICsgJ1dpZHRoJ10sIDEwKSArIHBhcnNlRmxvYXQoc3R5bGVzWydib3JkZXInICsgc2lkZUIgKyAnV2lkdGgnXSwgMTApO1xufVxuXG5mdW5jdGlvbiBnZXRTaXplKGF4aXMsIGJvZHksIGh0bWwsIGNvbXB1dGVkU3R5bGUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KGJvZHlbJ29mZnNldCcgKyBheGlzXSwgYm9keVsnc2Nyb2xsJyArIGF4aXNdLCBodG1sWydjbGllbnQnICsgYXhpc10sIGh0bWxbJ29mZnNldCcgKyBheGlzXSwgaHRtbFsnc2Nyb2xsJyArIGF4aXNdLCBpc0lFKDEwKSA/IGh0bWxbJ29mZnNldCcgKyBheGlzXSArIGNvbXB1dGVkU3R5bGVbJ21hcmdpbicgKyAoYXhpcyA9PT0gJ0hlaWdodCcgPyAnVG9wJyA6ICdMZWZ0JyldICsgY29tcHV0ZWRTdHlsZVsnbWFyZ2luJyArIChheGlzID09PSAnSGVpZ2h0JyA/ICdCb3R0b20nIDogJ1JpZ2h0JyldIDogMCk7XG59XG5cbmZ1bmN0aW9uIGdldFdpbmRvd1NpemVzKCkge1xuICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gIHZhciBodG1sID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB2YXIgY29tcHV0ZWRTdHlsZSA9IGlzSUUoMTApICYmIGdldENvbXB1dGVkU3R5bGUoaHRtbCk7XG5cbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IGdldFNpemUoJ0hlaWdodCcsIGJvZHksIGh0bWwsIGNvbXB1dGVkU3R5bGUpLFxuICAgIHdpZHRoOiBnZXRTaXplKCdXaWR0aCcsIGJvZHksIGh0bWwsIGNvbXB1dGVkU3R5bGUpXG4gIH07XG59XG5cbnZhciBjbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59O1xuXG52YXIgY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCk7XG5cblxuXG5cblxudmFyIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuLyoqXG4gKiBHaXZlbiBlbGVtZW50IG9mZnNldHMsIGdlbmVyYXRlIGFuIG91dHB1dCBzaW1pbGFyIHRvIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IG9mZnNldHNcbiAqIEByZXR1cm5zIHtPYmplY3R9IENsaWVudFJlY3QgbGlrZSBvdXRwdXRcbiAqL1xuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdChvZmZzZXRzKSB7XG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgb2Zmc2V0cywge1xuICAgIHJpZ2h0OiBvZmZzZXRzLmxlZnQgKyBvZmZzZXRzLndpZHRoLFxuICAgIGJvdHRvbTogb2Zmc2V0cy50b3AgKyBvZmZzZXRzLmhlaWdodFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgYm91bmRpbmcgY2xpZW50IHJlY3Qgb2YgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybiB7T2JqZWN0fSBjbGllbnQgcmVjdFxuICovXG5mdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IHt9O1xuXG4gIC8vIElFMTAgMTAgRklYOiBQbGVhc2UsIGRvbid0IGFzaywgdGhlIGVsZW1lbnQgaXNuJ3RcbiAgLy8gY29uc2lkZXJlZCBpbiBET00gaW4gc29tZSBjaXJjdW1zdGFuY2VzLi4uXG4gIC8vIFRoaXMgaXNuJ3QgcmVwcm9kdWNpYmxlIGluIElFMTAgY29tcGF0aWJpbGl0eSBtb2RlIG9mIElFMTFcbiAgdHJ5IHtcbiAgICBpZiAoaXNJRSgxMCkpIHtcbiAgICAgIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIHNjcm9sbFRvcCA9IGdldFNjcm9sbChlbGVtZW50LCAndG9wJyk7XG4gICAgICB2YXIgc2Nyb2xsTGVmdCA9IGdldFNjcm9sbChlbGVtZW50LCAnbGVmdCcpO1xuICAgICAgcmVjdC50b3AgKz0gc2Nyb2xsVG9wO1xuICAgICAgcmVjdC5sZWZ0ICs9IHNjcm9sbExlZnQ7XG4gICAgICByZWN0LmJvdHRvbSArPSBzY3JvbGxUb3A7XG4gICAgICByZWN0LnJpZ2h0ICs9IHNjcm9sbExlZnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0ge1xuICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICB0b3A6IHJlY3QudG9wLFxuICAgIHdpZHRoOiByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LFxuICAgIGhlaWdodDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuICB9O1xuXG4gIC8vIHN1YnRyYWN0IHNjcm9sbGJhciBzaXplIGZyb20gc2l6ZXNcbiAgdmFyIHNpemVzID0gZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0hUTUwnID8gZ2V0V2luZG93U2l6ZXMoKSA6IHt9O1xuICB2YXIgd2lkdGggPSBzaXplcy53aWR0aCB8fCBlbGVtZW50LmNsaWVudFdpZHRoIHx8IHJlc3VsdC5yaWdodCAtIHJlc3VsdC5sZWZ0O1xuICB2YXIgaGVpZ2h0ID0gc2l6ZXMuaGVpZ2h0IHx8IGVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IHJlc3VsdC5ib3R0b20gLSByZXN1bHQudG9wO1xuXG4gIHZhciBob3JpelNjcm9sbGJhciA9IGVsZW1lbnQub2Zmc2V0V2lkdGggLSB3aWR0aDtcbiAgdmFyIHZlcnRTY3JvbGxiYXIgPSBlbGVtZW50Lm9mZnNldEhlaWdodCAtIGhlaWdodDtcblxuICAvLyBpZiBhbiBoeXBvdGhldGljYWwgc2Nyb2xsYmFyIGlzIGRldGVjdGVkLCB3ZSBtdXN0IGJlIHN1cmUgaXQncyBub3QgYSBgYm9yZGVyYFxuICAvLyB3ZSBtYWtlIHRoaXMgY2hlY2sgY29uZGl0aW9uYWwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnNcbiAgaWYgKGhvcml6U2Nyb2xsYmFyIHx8IHZlcnRTY3JvbGxiYXIpIHtcbiAgICB2YXIgc3R5bGVzID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQpO1xuICAgIGhvcml6U2Nyb2xsYmFyIC09IGdldEJvcmRlcnNTaXplKHN0eWxlcywgJ3gnKTtcbiAgICB2ZXJ0U2Nyb2xsYmFyIC09IGdldEJvcmRlcnNTaXplKHN0eWxlcywgJ3knKTtcblxuICAgIHJlc3VsdC53aWR0aCAtPSBob3JpelNjcm9sbGJhcjtcbiAgICByZXN1bHQuaGVpZ2h0IC09IHZlcnRTY3JvbGxiYXI7XG4gIH1cblxuICByZXR1cm4gZ2V0Q2xpZW50UmVjdChyZXN1bHQpO1xufVxuXG5mdW5jdGlvbiBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUoY2hpbGRyZW4sIHBhcmVudCkge1xuICB2YXIgZml4ZWRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG5cbiAgdmFyIGlzSUUxMCA9IGlzSUUoMTApO1xuICB2YXIgaXNIVE1MID0gcGFyZW50Lm5vZGVOYW1lID09PSAnSFRNTCc7XG4gIHZhciBjaGlsZHJlblJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoY2hpbGRyZW4pO1xuICB2YXIgcGFyZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChwYXJlbnQpO1xuICB2YXIgc2Nyb2xsUGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KGNoaWxkcmVuKTtcblxuICB2YXIgc3R5bGVzID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KHBhcmVudCk7XG4gIHZhciBib3JkZXJUb3BXaWR0aCA9IHBhcnNlRmxvYXQoc3R5bGVzLmJvcmRlclRvcFdpZHRoLCAxMCk7XG4gIHZhciBib3JkZXJMZWZ0V2lkdGggPSBwYXJzZUZsb2F0KHN0eWxlcy5ib3JkZXJMZWZ0V2lkdGgsIDEwKTtcblxuICAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgcGFyZW50IGlzIGZpeGVkLCB3ZSBtdXN0IGlnbm9yZSBuZWdhdGl2ZSBzY3JvbGwgaW4gb2Zmc2V0IGNhbGNcbiAgaWYgKGZpeGVkUG9zaXRpb24gJiYgcGFyZW50Lm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICBwYXJlbnRSZWN0LnRvcCA9IE1hdGgubWF4KHBhcmVudFJlY3QudG9wLCAwKTtcbiAgICBwYXJlbnRSZWN0LmxlZnQgPSBNYXRoLm1heChwYXJlbnRSZWN0LmxlZnQsIDApO1xuICB9XG4gIHZhciBvZmZzZXRzID0gZ2V0Q2xpZW50UmVjdCh7XG4gICAgdG9wOiBjaGlsZHJlblJlY3QudG9wIC0gcGFyZW50UmVjdC50b3AgLSBib3JkZXJUb3BXaWR0aCxcbiAgICBsZWZ0OiBjaGlsZHJlblJlY3QubGVmdCAtIHBhcmVudFJlY3QubGVmdCAtIGJvcmRlckxlZnRXaWR0aCxcbiAgICB3aWR0aDogY2hpbGRyZW5SZWN0LndpZHRoLFxuICAgIGhlaWdodDogY2hpbGRyZW5SZWN0LmhlaWdodFxuICB9KTtcbiAgb2Zmc2V0cy5tYXJnaW5Ub3AgPSAwO1xuICBvZmZzZXRzLm1hcmdpbkxlZnQgPSAwO1xuXG4gIC8vIFN1YnRyYWN0IG1hcmdpbnMgb2YgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgaXQncyBiZWluZyB1c2VkIGFzIHBhcmVudFxuICAvLyB3ZSBkbyB0aGlzIG9ubHkgb24gSFRNTCBiZWNhdXNlIGl0J3MgdGhlIG9ubHkgZWxlbWVudCB0aGF0IGJlaGF2ZXNcbiAgLy8gZGlmZmVyZW50bHkgd2hlbiBtYXJnaW5zIGFyZSBhcHBsaWVkIHRvIGl0LiBUaGUgbWFyZ2lucyBhcmUgaW5jbHVkZWQgaW5cbiAgLy8gdGhlIGJveCBvZiB0aGUgZG9jdW1lbnRFbGVtZW50LCBpbiB0aGUgb3RoZXIgY2FzZXMgbm90LlxuICBpZiAoIWlzSUUxMCAmJiBpc0hUTUwpIHtcbiAgICB2YXIgbWFyZ2luVG9wID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luVG9wLCAxMCk7XG4gICAgdmFyIG1hcmdpbkxlZnQgPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5MZWZ0LCAxMCk7XG5cbiAgICBvZmZzZXRzLnRvcCAtPSBib3JkZXJUb3BXaWR0aCAtIG1hcmdpblRvcDtcbiAgICBvZmZzZXRzLmJvdHRvbSAtPSBib3JkZXJUb3BXaWR0aCAtIG1hcmdpblRvcDtcbiAgICBvZmZzZXRzLmxlZnQgLT0gYm9yZGVyTGVmdFdpZHRoIC0gbWFyZ2luTGVmdDtcbiAgICBvZmZzZXRzLnJpZ2h0IC09IGJvcmRlckxlZnRXaWR0aCAtIG1hcmdpbkxlZnQ7XG5cbiAgICAvLyBBdHRhY2ggbWFyZ2luVG9wIGFuZCBtYXJnaW5MZWZ0IGJlY2F1c2UgaW4gc29tZSBjaXJjdW1zdGFuY2VzIHdlIG1heSBuZWVkIHRoZW1cbiAgICBvZmZzZXRzLm1hcmdpblRvcCA9IG1hcmdpblRvcDtcbiAgICBvZmZzZXRzLm1hcmdpbkxlZnQgPSBtYXJnaW5MZWZ0O1xuICB9XG5cbiAgaWYgKGlzSUUxMCAmJiAhZml4ZWRQb3NpdGlvbiA/IHBhcmVudC5jb250YWlucyhzY3JvbGxQYXJlbnQpIDogcGFyZW50ID09PSBzY3JvbGxQYXJlbnQgJiYgc2Nyb2xsUGFyZW50Lm5vZGVOYW1lICE9PSAnQk9EWScpIHtcbiAgICBvZmZzZXRzID0gaW5jbHVkZVNjcm9sbChvZmZzZXRzLCBwYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldHM7XG59XG5cbmZ1bmN0aW9uIGdldFZpZXdwb3J0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcnRiaXRyYXJ5Tm9kZShlbGVtZW50KSB7XG4gIHZhciBleGNsdWRlU2Nyb2xsID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICB2YXIgaHRtbCA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIHZhciByZWxhdGl2ZU9mZnNldCA9IGdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZShlbGVtZW50LCBodG1sKTtcbiAgdmFyIHdpZHRoID0gTWF0aC5tYXgoaHRtbC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7XG4gIHZhciBoZWlnaHQgPSBNYXRoLm1heChodG1sLmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuXG4gIHZhciBzY3JvbGxUb3AgPSAhZXhjbHVkZVNjcm9sbCA/IGdldFNjcm9sbChodG1sKSA6IDA7XG4gIHZhciBzY3JvbGxMZWZ0ID0gIWV4Y2x1ZGVTY3JvbGwgPyBnZXRTY3JvbGwoaHRtbCwgJ2xlZnQnKSA6IDA7XG5cbiAgdmFyIG9mZnNldCA9IHtcbiAgICB0b3A6IHNjcm9sbFRvcCAtIHJlbGF0aXZlT2Zmc2V0LnRvcCArIHJlbGF0aXZlT2Zmc2V0Lm1hcmdpblRvcCxcbiAgICBsZWZ0OiBzY3JvbGxMZWZ0IC0gcmVsYXRpdmVPZmZzZXQubGVmdCArIHJlbGF0aXZlT2Zmc2V0Lm1hcmdpbkxlZnQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG5cbiAgcmV0dXJuIGdldENsaWVudFJlY3Qob2Zmc2V0KTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBmaXhlZCBvciBpcyBpbnNpZGUgYSBmaXhlZCBwYXJlbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQGFyZ3VtZW50IHtFbGVtZW50fSBjdXN0b21Db250YWluZXJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBhbnN3ZXIgdG8gXCJpc0ZpeGVkP1wiXG4gKi9cbmZ1bmN0aW9uIGlzRml4ZWQoZWxlbWVudCkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuICBpZiAobm9kZU5hbWUgPT09ICdCT0RZJyB8fCBub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gaXNGaXhlZChnZXRQYXJlbnROb2RlKGVsZW1lbnQpKTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgZmlyc3QgcGFyZW50IG9mIGFuIGVsZW1lbnQgdGhhdCBoYXMgYSB0cmFuc2Zvcm1lZCBwcm9wZXJ0eSBkZWZpbmVkXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtFbGVtZW50fSBmaXJzdCB0cmFuc2Zvcm1lZCBwYXJlbnQgb3IgZG9jdW1lbnRFbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIC8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIHRvIGF2b2lkIGVycm9ycyBpbiBjYXNlIG9uZSBvZiB0aGUgZWxlbWVudHMgaXNuJ3QgZGVmaW5lZCBmb3IgYW55IHJlYXNvblxuICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQucGFyZW50RWxlbWVudCB8fCBpc0lFKCkpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG4gIHZhciBlbCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgd2hpbGUgKGVsICYmIGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbCwgJ3RyYW5zZm9ybScpID09PSAnbm9uZScpIHtcbiAgICBlbCA9IGVsLnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGVsIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbn1cblxuLyoqXG4gKiBDb21wdXRlZCB0aGUgYm91bmRhcmllcyBsaW1pdHMgYW5kIHJldHVybiB0aGVtXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwb3BwZXJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZVxuICogQHBhcmFtIHtudW1iZXJ9IHBhZGRpbmdcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGJvdW5kYXJpZXNFbGVtZW50IC0gRWxlbWVudCB1c2VkIHRvIGRlZmluZSB0aGUgYm91bmRhcmllc1xuICogQHBhcmFtIHtCb29sZWFufSBmaXhlZFBvc2l0aW9uIC0gSXMgaW4gZml4ZWQgcG9zaXRpb24gbW9kZVxuICogQHJldHVybnMge09iamVjdH0gQ29vcmRpbmF0ZXMgb2YgdGhlIGJvdW5kYXJpZXNcbiAqL1xuZnVuY3Rpb24gZ2V0Qm91bmRhcmllcyhwb3BwZXIsIHJlZmVyZW5jZSwgcGFkZGluZywgYm91bmRhcmllc0VsZW1lbnQpIHtcbiAgdmFyIGZpeGVkUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IGZhbHNlO1xuXG4gIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG5cbiAgdmFyIGJvdW5kYXJpZXMgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZml4ZWRQb3NpdGlvbiA/IGdldEZpeGVkUG9zaXRpb25PZmZzZXRQYXJlbnQocG9wcGVyKSA6IGZpbmRDb21tb25PZmZzZXRQYXJlbnQocG9wcGVyLCByZWZlcmVuY2UpO1xuXG4gIC8vIEhhbmRsZSB2aWV3cG9ydCBjYXNlXG4gIGlmIChib3VuZGFyaWVzRWxlbWVudCA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgIGJvdW5kYXJpZXMgPSBnZXRWaWV3cG9ydE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJ0Yml0cmFyeU5vZGUob2Zmc2V0UGFyZW50LCBmaXhlZFBvc2l0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBIYW5kbGUgb3RoZXIgY2FzZXMgYmFzZWQgb24gRE9NIGVsZW1lbnQgdXNlZCBhcyBib3VuZGFyaWVzXG4gICAgdmFyIGJvdW5kYXJpZXNOb2RlID0gdm9pZCAwO1xuICAgIGlmIChib3VuZGFyaWVzRWxlbWVudCA9PT0gJ3Njcm9sbFBhcmVudCcpIHtcbiAgICAgIGJvdW5kYXJpZXNOb2RlID0gZ2V0U2Nyb2xsUGFyZW50KGdldFBhcmVudE5vZGUocmVmZXJlbmNlKSk7XG4gICAgICBpZiAoYm91bmRhcmllc05vZGUubm9kZU5hbWUgPT09ICdCT0RZJykge1xuICAgICAgICBib3VuZGFyaWVzTm9kZSA9IHBvcHBlci5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAnd2luZG93Jykge1xuICAgICAgYm91bmRhcmllc05vZGUgPSBwb3BwZXIub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvdW5kYXJpZXNOb2RlID0gYm91bmRhcmllc0VsZW1lbnQ7XG4gICAgfVxuXG4gICAgdmFyIG9mZnNldHMgPSBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUoYm91bmRhcmllc05vZGUsIG9mZnNldFBhcmVudCwgZml4ZWRQb3NpdGlvbik7XG5cbiAgICAvLyBJbiBjYXNlIG9mIEhUTUwsIHdlIG5lZWQgYSBkaWZmZXJlbnQgY29tcHV0YXRpb25cbiAgICBpZiAoYm91bmRhcmllc05vZGUubm9kZU5hbWUgPT09ICdIVE1MJyAmJiAhaXNGaXhlZChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICB2YXIgX2dldFdpbmRvd1NpemVzID0gZ2V0V2luZG93U2l6ZXMoKSxcbiAgICAgICAgICBoZWlnaHQgPSBfZ2V0V2luZG93U2l6ZXMuaGVpZ2h0LFxuICAgICAgICAgIHdpZHRoID0gX2dldFdpbmRvd1NpemVzLndpZHRoO1xuXG4gICAgICBib3VuZGFyaWVzLnRvcCArPSBvZmZzZXRzLnRvcCAtIG9mZnNldHMubWFyZ2luVG9wO1xuICAgICAgYm91bmRhcmllcy5ib3R0b20gPSBoZWlnaHQgKyBvZmZzZXRzLnRvcDtcbiAgICAgIGJvdW5kYXJpZXMubGVmdCArPSBvZmZzZXRzLmxlZnQgLSBvZmZzZXRzLm1hcmdpbkxlZnQ7XG4gICAgICBib3VuZGFyaWVzLnJpZ2h0ID0gd2lkdGggKyBvZmZzZXRzLmxlZnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZvciBhbGwgdGhlIG90aGVyIERPTSBlbGVtZW50cywgdGhpcyBvbmUgaXMgZ29vZFxuICAgICAgYm91bmRhcmllcyA9IG9mZnNldHM7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIHBhZGRpbmdzXG4gIGJvdW5kYXJpZXMubGVmdCArPSBwYWRkaW5nO1xuICBib3VuZGFyaWVzLnRvcCArPSBwYWRkaW5nO1xuICBib3VuZGFyaWVzLnJpZ2h0IC09IHBhZGRpbmc7XG4gIGJvdW5kYXJpZXMuYm90dG9tIC09IHBhZGRpbmc7XG5cbiAgcmV0dXJuIGJvdW5kYXJpZXM7XG59XG5cbmZ1bmN0aW9uIGdldEFyZWEoX3JlZikge1xuICB2YXIgd2lkdGggPSBfcmVmLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX3JlZi5oZWlnaHQ7XG5cbiAgcmV0dXJuIHdpZHRoICogaGVpZ2h0O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdXNlZCB0byB0cmFuc2Zvcm0gdGhlIGBhdXRvYCBwbGFjZW1lbnQgdG8gdGhlIHBsYWNlbWVudCB3aXRoIG1vcmVcbiAqIGF2YWlsYWJsZSBzcGFjZS5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVBdXRvUGxhY2VtZW50KHBsYWNlbWVudCwgcmVmUmVjdCwgcG9wcGVyLCByZWZlcmVuY2UsIGJvdW5kYXJpZXNFbGVtZW50KSB7XG4gIHZhciBwYWRkaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiAwO1xuXG4gIGlmIChwbGFjZW1lbnQuaW5kZXhPZignYXV0bycpID09PSAtMSkge1xuICAgIHJldHVybiBwbGFjZW1lbnQ7XG4gIH1cblxuICB2YXIgYm91bmRhcmllcyA9IGdldEJvdW5kYXJpZXMocG9wcGVyLCByZWZlcmVuY2UsIHBhZGRpbmcsIGJvdW5kYXJpZXNFbGVtZW50KTtcblxuICB2YXIgcmVjdHMgPSB7XG4gICAgdG9wOiB7XG4gICAgICB3aWR0aDogYm91bmRhcmllcy53aWR0aCxcbiAgICAgIGhlaWdodDogcmVmUmVjdC50b3AgLSBib3VuZGFyaWVzLnRvcFxuICAgIH0sXG4gICAgcmlnaHQ6IHtcbiAgICAgIHdpZHRoOiBib3VuZGFyaWVzLnJpZ2h0IC0gcmVmUmVjdC5yaWdodCxcbiAgICAgIGhlaWdodDogYm91bmRhcmllcy5oZWlnaHRcbiAgICB9LFxuICAgIGJvdHRvbToge1xuICAgICAgd2lkdGg6IGJvdW5kYXJpZXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IGJvdW5kYXJpZXMuYm90dG9tIC0gcmVmUmVjdC5ib3R0b21cbiAgICB9LFxuICAgIGxlZnQ6IHtcbiAgICAgIHdpZHRoOiByZWZSZWN0LmxlZnQgLSBib3VuZGFyaWVzLmxlZnQsXG4gICAgICBoZWlnaHQ6IGJvdW5kYXJpZXMuaGVpZ2h0XG4gICAgfVxuICB9O1xuXG4gIHZhciBzb3J0ZWRBcmVhcyA9IE9iamVjdC5rZXlzKHJlY3RzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICBrZXk6IGtleVxuICAgIH0sIHJlY3RzW2tleV0sIHtcbiAgICAgIGFyZWE6IGdldEFyZWEocmVjdHNba2V5XSlcbiAgICB9KTtcbiAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLmFyZWEgLSBhLmFyZWE7XG4gIH0pO1xuXG4gIHZhciBmaWx0ZXJlZEFyZWFzID0gc29ydGVkQXJlYXMuZmlsdGVyKGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciB3aWR0aCA9IF9yZWYyLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfcmVmMi5oZWlnaHQ7XG4gICAgcmV0dXJuIHdpZHRoID49IHBvcHBlci5jbGllbnRXaWR0aCAmJiBoZWlnaHQgPj0gcG9wcGVyLmNsaWVudEhlaWdodDtcbiAgfSk7XG5cbiAgdmFyIGNvbXB1dGVkUGxhY2VtZW50ID0gZmlsdGVyZWRBcmVhcy5sZW5ndGggPiAwID8gZmlsdGVyZWRBcmVhc1swXS5rZXkgOiBzb3J0ZWRBcmVhc1swXS5rZXk7XG5cbiAgdmFyIHZhcmlhdGlvbiA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xuXG4gIHJldHVybiBjb21wdXRlZFBsYWNlbWVudCArICh2YXJpYXRpb24gPyAnLScgKyB2YXJpYXRpb24gOiAnJyk7XG59XG5cbi8qKlxuICogR2V0IG9mZnNldHMgdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7RWxlbWVudH0gcG9wcGVyIC0gdGhlIHBvcHBlciBlbGVtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHJlZmVyZW5jZSAtIHRoZSByZWZlcmVuY2UgZWxlbWVudCAodGhlIHBvcHBlciB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMpXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGZpeGVkUG9zaXRpb24gLSBpcyBpbiBmaXhlZCBwb3NpdGlvbiBtb2RlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgb2Zmc2V0cyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlclxuICovXG5mdW5jdGlvbiBnZXRSZWZlcmVuY2VPZmZzZXRzKHN0YXRlLCBwb3BwZXIsIHJlZmVyZW5jZSkge1xuICB2YXIgZml4ZWRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICB2YXIgY29tbW9uT2Zmc2V0UGFyZW50ID0gZml4ZWRQb3NpdGlvbiA/IGdldEZpeGVkUG9zaXRpb25PZmZzZXRQYXJlbnQocG9wcGVyKSA6IGZpbmRDb21tb25PZmZzZXRQYXJlbnQocG9wcGVyLCByZWZlcmVuY2UpO1xuICByZXR1cm4gZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcmJpdHJhcnlOb2RlKHJlZmVyZW5jZSwgY29tbW9uT2Zmc2V0UGFyZW50LCBmaXhlZFBvc2l0aW9uKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG91dGVyIHNpemVzIG9mIHRoZSBnaXZlbiBlbGVtZW50IChvZmZzZXQgc2l6ZSArIG1hcmdpbnMpXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IG9iamVjdCBjb250YWluaW5nIHdpZHRoIGFuZCBoZWlnaHQgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBnZXRPdXRlclNpemVzKGVsZW1lbnQpIHtcbiAgdmFyIHN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gIHZhciB4ID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luVG9wKSArIHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpbkJvdHRvbSk7XG4gIHZhciB5ID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luTGVmdCkgKyBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5SaWdodCk7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGggKyB5LFxuICAgIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQgKyB4XG4gIH07XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBvcHBvc2l0ZSBwbGFjZW1lbnQgb2YgdGhlIGdpdmVuIG9uZVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IHBsYWNlbWVudFxuICogQHJldHVybnMge1N0cmluZ30gZmxpcHBlZCBwbGFjZW1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHZhciBoYXNoID0geyBsZWZ0OiAncmlnaHQnLCByaWdodDogJ2xlZnQnLCBib3R0b206ICd0b3AnLCB0b3A6ICdib3R0b20nIH07XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBvZmZzZXRzIHRvIHRoZSBwb3BwZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwb3NpdGlvbiAtIENTUyBwb3NpdGlvbiB0aGUgUG9wcGVyIHdpbGwgZ2V0IGFwcGxpZWRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBvcHBlciAtIHRoZSBwb3BwZXIgZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IHJlZmVyZW5jZU9mZnNldHMgLSB0aGUgcmVmZXJlbmNlIG9mZnNldHMgKHRoZSBwb3BwZXIgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGlzKVxuICogQHBhcmFtIHtTdHJpbmd9IHBsYWNlbWVudCAtIG9uZSBvZiB0aGUgdmFsaWQgcGxhY2VtZW50IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IHBvcHBlck9mZnNldHMgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgb2Zmc2V0cyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlclxuICovXG5mdW5jdGlvbiBnZXRQb3BwZXJPZmZzZXRzKHBvcHBlciwgcmVmZXJlbmNlT2Zmc2V0cywgcGxhY2VtZW50KSB7XG4gIHBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuXG4gIC8vIEdldCBwb3BwZXIgbm9kZSBzaXplc1xuICB2YXIgcG9wcGVyUmVjdCA9IGdldE91dGVyU2l6ZXMocG9wcGVyKTtcblxuICAvLyBBZGQgcG9zaXRpb24sIHdpZHRoIGFuZCBoZWlnaHQgdG8gb3VyIG9mZnNldHMgb2JqZWN0XG4gIHZhciBwb3BwZXJPZmZzZXRzID0ge1xuICAgIHdpZHRoOiBwb3BwZXJSZWN0LndpZHRoLFxuICAgIGhlaWdodDogcG9wcGVyUmVjdC5oZWlnaHRcbiAgfTtcblxuICAvLyBkZXBlbmRpbmcgYnkgdGhlIHBvcHBlciBwbGFjZW1lbnQgd2UgaGF2ZSB0byBjb21wdXRlIGl0cyBvZmZzZXRzIHNsaWdodGx5IGRpZmZlcmVudGx5XG4gIHZhciBpc0hvcml6ID0gWydyaWdodCcsICdsZWZ0J10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTtcbiAgdmFyIG1haW5TaWRlID0gaXNIb3JpeiA/ICd0b3AnIDogJ2xlZnQnO1xuICB2YXIgc2Vjb25kYXJ5U2lkZSA9IGlzSG9yaXogPyAnbGVmdCcgOiAndG9wJztcbiAgdmFyIG1lYXN1cmVtZW50ID0gaXNIb3JpeiA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgdmFyIHNlY29uZGFyeU1lYXN1cmVtZW50ID0gIWlzSG9yaXogPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgcG9wcGVyT2Zmc2V0c1ttYWluU2lkZV0gPSByZWZlcmVuY2VPZmZzZXRzW21haW5TaWRlXSArIHJlZmVyZW5jZU9mZnNldHNbbWVhc3VyZW1lbnRdIC8gMiAtIHBvcHBlclJlY3RbbWVhc3VyZW1lbnRdIC8gMjtcbiAgaWYgKHBsYWNlbWVudCA9PT0gc2Vjb25kYXJ5U2lkZSkge1xuICAgIHBvcHBlck9mZnNldHNbc2Vjb25kYXJ5U2lkZV0gPSByZWZlcmVuY2VPZmZzZXRzW3NlY29uZGFyeVNpZGVdIC0gcG9wcGVyUmVjdFtzZWNvbmRhcnlNZWFzdXJlbWVudF07XG4gIH0gZWxzZSB7XG4gICAgcG9wcGVyT2Zmc2V0c1tzZWNvbmRhcnlTaWRlXSA9IHJlZmVyZW5jZU9mZnNldHNbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQoc2Vjb25kYXJ5U2lkZSldO1xuICB9XG5cbiAgcmV0dXJuIHBvcHBlck9mZnNldHM7XG59XG5cbi8qKlxuICogTWltaWNzIHRoZSBgZmluZGAgbWV0aG9kIG9mIEFycmF5XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0FycmF5fSBhcnJcbiAqIEBhcmd1bWVudCBwcm9wXG4gKiBAYXJndW1lbnQgdmFsdWVcbiAqIEByZXR1cm5zIGluZGV4IG9yIC0xXG4gKi9cbmZ1bmN0aW9uIGZpbmQoYXJyLCBjaGVjaykge1xuICAvLyB1c2UgbmF0aXZlIGZpbmQgaWYgc3VwcG9ydGVkXG4gIGlmIChBcnJheS5wcm90b3R5cGUuZmluZCkge1xuICAgIHJldHVybiBhcnIuZmluZChjaGVjayk7XG4gIH1cblxuICAvLyB1c2UgYGZpbHRlcmAgdG8gb2J0YWluIHRoZSBzYW1lIGJlaGF2aW9yIG9mIGBmaW5kYFxuICByZXR1cm4gYXJyLmZpbHRlcihjaGVjaylbMF07XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hpbmcgb2JqZWN0XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0FycmF5fSBhcnJcbiAqIEBhcmd1bWVudCBwcm9wXG4gKiBAYXJndW1lbnQgdmFsdWVcbiAqIEByZXR1cm5zIGluZGV4IG9yIC0xXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbmRleChhcnIsIHByb3AsIHZhbHVlKSB7XG4gIC8vIHVzZSBuYXRpdmUgZmluZEluZGV4IGlmIHN1cHBvcnRlZFxuICBpZiAoQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleCkge1xuICAgIHJldHVybiBhcnIuZmluZEluZGV4KGZ1bmN0aW9uIChjdXIpIHtcbiAgICAgIHJldHVybiBjdXJbcHJvcF0gPT09IHZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gdXNlIGBmaW5kYCArIGBpbmRleE9mYCBpZiBgZmluZEluZGV4YCBpc24ndCBzdXBwb3J0ZWRcbiAgdmFyIG1hdGNoID0gZmluZChhcnIsIGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqW3Byb3BdID09PSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiBhcnIuaW5kZXhPZihtYXRjaCk7XG59XG5cbi8qKlxuICogTG9vcCB0cm91Z2ggdGhlIGxpc3Qgb2YgbW9kaWZpZXJzIGFuZCBydW4gdGhlbSBpbiBvcmRlcixcbiAqIGVhY2ggb2YgdGhlbSB3aWxsIHRoZW4gZWRpdCB0aGUgZGF0YSBvYmplY3QuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge2RhdGFPYmplY3R9IGRhdGFcbiAqIEBwYXJhbSB7QXJyYXl9IG1vZGlmaWVyc1xuICogQHBhcmFtIHtTdHJpbmd9IGVuZHMgLSBPcHRpb25hbCBtb2RpZmllciBuYW1lIHVzZWQgYXMgc3RvcHBlclxuICogQHJldHVybnMge2RhdGFPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIHJ1bk1vZGlmaWVycyhtb2RpZmllcnMsIGRhdGEsIGVuZHMpIHtcbiAgdmFyIG1vZGlmaWVyc1RvUnVuID0gZW5kcyA9PT0gdW5kZWZpbmVkID8gbW9kaWZpZXJzIDogbW9kaWZpZXJzLnNsaWNlKDAsIGZpbmRJbmRleChtb2RpZmllcnMsICduYW1lJywgZW5kcykpO1xuXG4gIG1vZGlmaWVyc1RvUnVuLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgaWYgKG1vZGlmaWVyWydmdW5jdGlvbiddKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRvdC1ub3RhdGlvblxuICAgICAgY29uc29sZS53YXJuKCdgbW9kaWZpZXIuZnVuY3Rpb25gIGlzIGRlcHJlY2F0ZWQsIHVzZSBgbW9kaWZpZXIuZm5gIScpO1xuICAgIH1cbiAgICB2YXIgZm4gPSBtb2RpZmllclsnZnVuY3Rpb24nXSB8fCBtb2RpZmllci5mbjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICBpZiAobW9kaWZpZXIuZW5hYmxlZCAmJiBpc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgLy8gQWRkIHByb3BlcnRpZXMgdG8gb2Zmc2V0cyB0byBtYWtlIHRoZW0gYSBjb21wbGV0ZSBjbGllbnRSZWN0IG9iamVjdFxuICAgICAgLy8gd2UgZG8gdGhpcyBiZWZvcmUgZWFjaCBtb2RpZmllciB0byBtYWtlIHN1cmUgdGhlIHByZXZpb3VzIG9uZSBkb2Vzbid0XG4gICAgICAvLyBtZXNzIHdpdGggdGhlc2UgdmFsdWVzXG4gICAgICBkYXRhLm9mZnNldHMucG9wcGVyID0gZ2V0Q2xpZW50UmVjdChkYXRhLm9mZnNldHMucG9wcGVyKTtcbiAgICAgIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UgPSBnZXRDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UpO1xuXG4gICAgICBkYXRhID0gZm4oZGF0YSwgbW9kaWZpZXIpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHBvcHBlciwgY29tcHV0aW5nIHRoZSBuZXcgb2Zmc2V0cyBhbmQgYXBwbHlpbmdcbiAqIHRoZSBuZXcgc3R5bGUuPGJyIC8+XG4gKiBQcmVmZXIgYHNjaGVkdWxlVXBkYXRlYCBvdmVyIGB1cGRhdGVgIGJlY2F1c2Ugb2YgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xuZnVuY3Rpb24gdXBkYXRlKCkge1xuICAvLyBpZiBwb3BwZXIgaXMgZGVzdHJveWVkLCBkb24ndCBwZXJmb3JtIGFueSBmdXJ0aGVyIHVwZGF0ZVxuICBpZiAodGhpcy5zdGF0ZS5pc0Rlc3Ryb3llZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBkYXRhID0ge1xuICAgIGluc3RhbmNlOiB0aGlzLFxuICAgIHN0eWxlczoge30sXG4gICAgYXJyb3dTdHlsZXM6IHt9LFxuICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgIGZsaXBwZWQ6IGZhbHNlLFxuICAgIG9mZnNldHM6IHt9XG4gIH07XG5cbiAgLy8gY29tcHV0ZSByZWZlcmVuY2UgZWxlbWVudCBvZmZzZXRzXG4gIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UgPSBnZXRSZWZlcmVuY2VPZmZzZXRzKHRoaXMuc3RhdGUsIHRoaXMucG9wcGVyLCB0aGlzLnJlZmVyZW5jZSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uRml4ZWQpO1xuXG4gIC8vIGNvbXB1dGUgYXV0byBwbGFjZW1lbnQsIHN0b3JlIHBsYWNlbWVudCBpbnNpZGUgdGhlIGRhdGEgb2JqZWN0LFxuICAvLyBtb2RpZmllcnMgd2lsbCBiZSBhYmxlIHRvIGVkaXQgYHBsYWNlbWVudGAgaWYgbmVlZGVkXG4gIC8vIGFuZCByZWZlciB0byBvcmlnaW5hbFBsYWNlbWVudCB0byBrbm93IHRoZSBvcmlnaW5hbCB2YWx1ZVxuICBkYXRhLnBsYWNlbWVudCA9IGNvbXB1dGVBdXRvUGxhY2VtZW50KHRoaXMub3B0aW9ucy5wbGFjZW1lbnQsIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UsIHRoaXMucG9wcGVyLCB0aGlzLnJlZmVyZW5jZSwgdGhpcy5vcHRpb25zLm1vZGlmaWVycy5mbGlwLmJvdW5kYXJpZXNFbGVtZW50LCB0aGlzLm9wdGlvbnMubW9kaWZpZXJzLmZsaXAucGFkZGluZyk7XG5cbiAgLy8gc3RvcmUgdGhlIGNvbXB1dGVkIHBsYWNlbWVudCBpbnNpZGUgYG9yaWdpbmFsUGxhY2VtZW50YFxuICBkYXRhLm9yaWdpbmFsUGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQ7XG5cbiAgZGF0YS5wb3NpdGlvbkZpeGVkID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uRml4ZWQ7XG5cbiAgLy8gY29tcHV0ZSB0aGUgcG9wcGVyIG9mZnNldHNcbiAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IGdldFBvcHBlck9mZnNldHModGhpcy5wb3BwZXIsIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UsIGRhdGEucGxhY2VtZW50KTtcblxuICBkYXRhLm9mZnNldHMucG9wcGVyLnBvc2l0aW9uID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uRml4ZWQgPyAnZml4ZWQnIDogJ2Fic29sdXRlJztcblxuICAvLyBydW4gdGhlIG1vZGlmaWVyc1xuICBkYXRhID0gcnVuTW9kaWZpZXJzKHRoaXMubW9kaWZpZXJzLCBkYXRhKTtcblxuICAvLyB0aGUgZmlyc3QgYHVwZGF0ZWAgd2lsbCBjYWxsIGBvbkNyZWF0ZWAgY2FsbGJhY2tcbiAgLy8gdGhlIG90aGVyIG9uZXMgd2lsbCBjYWxsIGBvblVwZGF0ZWAgY2FsbGJhY2tcbiAgaWYgKCF0aGlzLnN0YXRlLmlzQ3JlYXRlZCkge1xuICAgIHRoaXMuc3RhdGUuaXNDcmVhdGVkID0gdHJ1ZTtcbiAgICB0aGlzLm9wdGlvbnMub25DcmVhdGUoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5vcHRpb25zLm9uVXBkYXRlKGRhdGEpO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIHVzZWQgdG8ga25vdyBpZiB0aGUgZ2l2ZW4gbW9kaWZpZXIgaXMgZW5hYmxlZC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc01vZGlmaWVyRW5hYmxlZChtb2RpZmllcnMsIG1vZGlmaWVyTmFtZSkge1xuICByZXR1cm4gbW9kaWZpZXJzLnNvbWUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgICAgZW5hYmxlZCA9IF9yZWYuZW5hYmxlZDtcbiAgICByZXR1cm4gZW5hYmxlZCAmJiBuYW1lID09PSBtb2RpZmllck5hbWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJlZml4ZWQgc3VwcG9ydGVkIHByb3BlcnR5IG5hbWVcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwcm9wZXJ0eSAoY2FtZWxDYXNlKVxuICogQHJldHVybnMge1N0cmluZ30gcHJlZml4ZWQgcHJvcGVydHkgKGNhbWVsQ2FzZSBvciBQYXNjYWxDYXNlLCBkZXBlbmRpbmcgb24gdGhlIHZlbmRvciBwcmVmaXgpXG4gKi9cbmZ1bmN0aW9uIGdldFN1cHBvcnRlZFByb3BlcnR5TmFtZShwcm9wZXJ0eSkge1xuICB2YXIgcHJlZml4ZXMgPSBbZmFsc2UsICdtcycsICdXZWJraXQnLCAnTW96JywgJ08nXTtcbiAgdmFyIHVwcGVyUHJvcCA9IHByb3BlcnR5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc2xpY2UoMSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwcmVmaXggPSBwcmVmaXhlc1tpXTtcbiAgICB2YXIgdG9DaGVjayA9IHByZWZpeCA/ICcnICsgcHJlZml4ICsgdXBwZXJQcm9wIDogcHJvcGVydHk7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudC5ib2R5LnN0eWxlW3RvQ2hlY2tdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRvQ2hlY2s7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIERlc3Ryb3kgdGhlIHBvcHBlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiBkZXN0cm95KCkge1xuICB0aGlzLnN0YXRlLmlzRGVzdHJveWVkID0gdHJ1ZTtcblxuICAvLyB0b3VjaCBET00gb25seSBpZiBgYXBwbHlTdHlsZWAgbW9kaWZpZXIgaXMgZW5hYmxlZFxuICBpZiAoaXNNb2RpZmllckVuYWJsZWQodGhpcy5tb2RpZmllcnMsICdhcHBseVN0eWxlJykpIHtcbiAgICB0aGlzLnBvcHBlci5yZW1vdmVBdHRyaWJ1dGUoJ3gtcGxhY2VtZW50Jyk7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUucG9zaXRpb24gPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZS50b3AgPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZS5sZWZ0ID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUucmlnaHQgPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZS5ib3R0b20gPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZS53aWxsQ2hhbmdlID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGVbZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lKCd0cmFuc2Zvcm0nKV0gPSAnJztcbiAgfVxuXG4gIHRoaXMuZGlzYWJsZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgLy8gcmVtb3ZlIHRoZSBwb3BwZXIgaWYgdXNlciBleHBsaWNpdHkgYXNrZWQgZm9yIHRoZSBkZWxldGlvbiBvbiBkZXN0cm95XG4gIC8vIGRvIG5vdCB1c2UgYHJlbW92ZWAgYmVjYXVzZSBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBpdFxuICBpZiAodGhpcy5vcHRpb25zLnJlbW92ZU9uRGVzdHJveSkge1xuICAgIHRoaXMucG9wcGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wb3BwZXIpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEdldCB0aGUgd2luZG93IGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudFxuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7V2luZG93fVxuICovXG5mdW5jdGlvbiBnZXRXaW5kb3coZWxlbWVudCkge1xuICB2YXIgb3duZXJEb2N1bWVudCA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgcmV0dXJuIG93bmVyRG9jdW1lbnQgPyBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IDogd2luZG93O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hUb1Njcm9sbFBhcmVudHMoc2Nyb2xsUGFyZW50LCBldmVudCwgY2FsbGJhY2ssIHNjcm9sbFBhcmVudHMpIHtcbiAgdmFyIGlzQm9keSA9IHNjcm9sbFBhcmVudC5ub2RlTmFtZSA9PT0gJ0JPRFknO1xuICB2YXIgdGFyZ2V0ID0gaXNCb2R5ID8gc2Nyb2xsUGFyZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgOiBzY3JvbGxQYXJlbnQ7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBjYWxsYmFjaywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gIGlmICghaXNCb2R5KSB7XG4gICAgYXR0YWNoVG9TY3JvbGxQYXJlbnRzKGdldFNjcm9sbFBhcmVudCh0YXJnZXQucGFyZW50Tm9kZSksIGV2ZW50LCBjYWxsYmFjaywgc2Nyb2xsUGFyZW50cyk7XG4gIH1cbiAgc2Nyb2xsUGFyZW50cy5wdXNoKHRhcmdldCk7XG59XG5cbi8qKlxuICogU2V0dXAgbmVlZGVkIGV2ZW50IGxpc3RlbmVycyB1c2VkIHRvIHVwZGF0ZSB0aGUgcG9wcGVyIHBvc2l0aW9uXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXR1cEV2ZW50TGlzdGVuZXJzKHJlZmVyZW5jZSwgb3B0aW9ucywgc3RhdGUsIHVwZGF0ZUJvdW5kKSB7XG4gIC8vIFJlc2l6ZSBldmVudCBsaXN0ZW5lciBvbiB3aW5kb3dcbiAgc3RhdGUudXBkYXRlQm91bmQgPSB1cGRhdGVCb3VuZDtcbiAgZ2V0V2luZG93KHJlZmVyZW5jZSkuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc3RhdGUudXBkYXRlQm91bmQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBTY3JvbGwgZXZlbnQgbGlzdGVuZXIgb24gc2Nyb2xsIHBhcmVudHNcbiAgdmFyIHNjcm9sbEVsZW1lbnQgPSBnZXRTY3JvbGxQYXJlbnQocmVmZXJlbmNlKTtcbiAgYXR0YWNoVG9TY3JvbGxQYXJlbnRzKHNjcm9sbEVsZW1lbnQsICdzY3JvbGwnLCBzdGF0ZS51cGRhdGVCb3VuZCwgc3RhdGUuc2Nyb2xsUGFyZW50cyk7XG4gIHN0YXRlLnNjcm9sbEVsZW1lbnQgPSBzY3JvbGxFbGVtZW50O1xuICBzdGF0ZS5ldmVudHNFbmFibGVkID0gdHJ1ZTtcblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogSXQgd2lsbCBhZGQgcmVzaXplL3Njcm9sbCBldmVudHMgYW5kIHN0YXJ0IHJlY2FsY3VsYXRpbmdcbiAqIHBvc2l0aW9uIG9mIHRoZSBwb3BwZXIgZWxlbWVudCB3aGVuIHRoZXkgYXJlIHRyaWdnZXJlZC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xuZnVuY3Rpb24gZW5hYmxlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gIGlmICghdGhpcy5zdGF0ZS5ldmVudHNFbmFibGVkKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHNldHVwRXZlbnRMaXN0ZW5lcnModGhpcy5yZWZlcmVuY2UsIHRoaXMub3B0aW9ucywgdGhpcy5zdGF0ZSwgdGhpcy5zY2hlZHVsZVVwZGF0ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVzZWQgdG8gdXBkYXRlIHRoZSBwb3BwZXIgcG9zaXRpb25cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHJlZmVyZW5jZSwgc3RhdGUpIHtcbiAgLy8gUmVtb3ZlIHJlc2l6ZSBldmVudCBsaXN0ZW5lciBvbiB3aW5kb3dcbiAgZ2V0V2luZG93KHJlZmVyZW5jZSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc3RhdGUudXBkYXRlQm91bmQpO1xuXG4gIC8vIFJlbW92ZSBzY3JvbGwgZXZlbnQgbGlzdGVuZXIgb24gc2Nyb2xsIHBhcmVudHNcbiAgc3RhdGUuc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc3RhdGUudXBkYXRlQm91bmQpO1xuICB9KTtcblxuICAvLyBSZXNldCBzdGF0ZVxuICBzdGF0ZS51cGRhdGVCb3VuZCA9IG51bGw7XG4gIHN0YXRlLnNjcm9sbFBhcmVudHMgPSBbXTtcbiAgc3RhdGUuc2Nyb2xsRWxlbWVudCA9IG51bGw7XG4gIHN0YXRlLmV2ZW50c0VuYWJsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIEl0IHdpbGwgcmVtb3ZlIHJlc2l6ZS9zY3JvbGwgZXZlbnRzIGFuZCB3b24ndCByZWNhbGN1bGF0ZSBwb3BwZXIgcG9zaXRpb25cbiAqIHdoZW4gdGhleSBhcmUgdHJpZ2dlcmVkLiBJdCBhbHNvIHdvbid0IHRyaWdnZXIgb25VcGRhdGUgY2FsbGJhY2sgYW55bW9yZSxcbiAqIHVubGVzcyB5b3UgY2FsbCBgdXBkYXRlYCBtZXRob2QgbWFudWFsbHkuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyXG4gKi9cbmZ1bmN0aW9uIGRpc2FibGVFdmVudExpc3RlbmVycygpIHtcbiAgaWYgKHRoaXMuc3RhdGUuZXZlbnRzRW5hYmxlZCkge1xuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuc2NoZWR1bGVVcGRhdGUpO1xuICAgIHRoaXMuc3RhdGUgPSByZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLnJlZmVyZW5jZSwgdGhpcy5zdGF0ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUZWxscyBpZiBhIGdpdmVuIGlucHV0IGlzIGEgbnVtYmVyXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0geyp9IGlucHV0IHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc051bWVyaWMobikge1xuICByZXR1cm4gbiAhPT0gJycgJiYgIWlzTmFOKHBhcnNlRmxvYXQobikpICYmIGlzRmluaXRlKG4pO1xufVxuXG4vKipcbiAqIFNldCB0aGUgc3R5bGUgdG8gdGhlIGdpdmVuIHBvcHBlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhcHBseSB0aGUgc3R5bGUgdG9cbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBzdHlsZXNcbiAqIE9iamVjdCB3aXRoIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNldFN0eWxlcyhlbGVtZW50LCBzdHlsZXMpIHtcbiAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgdmFyIHVuaXQgPSAnJztcbiAgICAvLyBhZGQgdW5pdCBpZiB0aGUgdmFsdWUgaXMgbnVtZXJpYyBhbmQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmdcbiAgICBpZiAoWyd3aWR0aCcsICdoZWlnaHQnLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10uaW5kZXhPZihwcm9wKSAhPT0gLTEgJiYgaXNOdW1lcmljKHN0eWxlc1twcm9wXSkpIHtcbiAgICAgIHVuaXQgPSAncHgnO1xuICAgIH1cbiAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gc3R5bGVzW3Byb3BdICsgdW5pdDtcbiAgfSk7XG59XG5cbi8qKlxuICogU2V0IHRoZSBhdHRyaWJ1dGVzIHRvIHRoZSBnaXZlbiBwb3BwZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYXBwbHkgdGhlIGF0dHJpYnV0ZXMgdG9cbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBzdHlsZXNcbiAqIE9iamVjdCB3aXRoIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXMoZWxlbWVudCwgYXR0cmlidXRlcykge1xuICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgdmFyIHZhbHVlID0gYXR0cmlidXRlc1twcm9wXTtcbiAgICBpZiAodmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShwcm9wLCBhdHRyaWJ1dGVzW3Byb3BdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUocHJvcCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhLnN0eWxlcyAtIExpc3Qgb2Ygc3R5bGUgcHJvcGVydGllcyAtIHZhbHVlcyB0byBhcHBseSB0byBwb3BwZXIgZWxlbWVudFxuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEuYXR0cmlidXRlcyAtIExpc3Qgb2YgYXR0cmlidXRlIHByb3BlcnRpZXMgLSB2YWx1ZXMgdG8gYXBwbHkgdG8gcG9wcGVyIGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzYW1lIGRhdGEgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGFwcGx5U3R5bGUoZGF0YSkge1xuICAvLyBhbnkgcHJvcGVydHkgcHJlc2VudCBpbiBgZGF0YS5zdHlsZXNgIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyLFxuICAvLyBpbiB0aGlzIHdheSB3ZSBjYW4gbWFrZSB0aGUgM3JkIHBhcnR5IG1vZGlmaWVycyBhZGQgY3VzdG9tIHN0eWxlcyB0byBpdFxuICAvLyBCZSBhd2FyZSwgbW9kaWZpZXJzIGNvdWxkIG92ZXJyaWRlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIHByZXZpb3VzXG4gIC8vIGxpbmVzIG9mIHRoaXMgbW9kaWZpZXIhXG4gIHNldFN0eWxlcyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5zdHlsZXMpO1xuXG4gIC8vIGFueSBwcm9wZXJ0eSBwcmVzZW50IGluIGBkYXRhLmF0dHJpYnV0ZXNgIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyLFxuICAvLyB0aGV5IHdpbGwgYmUgc2V0IGFzIEhUTUwgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudFxuICBzZXRBdHRyaWJ1dGVzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gIC8vIGlmIGFycm93RWxlbWVudCBpcyBkZWZpbmVkIGFuZCBhcnJvd1N0eWxlcyBoYXMgc29tZSBwcm9wZXJ0aWVzXG4gIGlmIChkYXRhLmFycm93RWxlbWVudCAmJiBPYmplY3Qua2V5cyhkYXRhLmFycm93U3R5bGVzKS5sZW5ndGgpIHtcbiAgICBzZXRTdHlsZXMoZGF0YS5hcnJvd0VsZW1lbnQsIGRhdGEuYXJyb3dTdHlsZXMpO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogU2V0IHRoZSB4LXBsYWNlbWVudCBhdHRyaWJ1dGUgYmVmb3JlIGV2ZXJ5dGhpbmcgZWxzZSBiZWNhdXNlIGl0IGNvdWxkIGJlIHVzZWRcbiAqIHRvIGFkZCBtYXJnaW5zIHRvIHRoZSBwb3BwZXIgbWFyZ2lucyBuZWVkcyB0byBiZSBjYWxjdWxhdGVkIHRvIGdldCB0aGVcbiAqIGNvcnJlY3QgcG9wcGVyIG9mZnNldHMuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLm1vZGlmaWVyc1xuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSBlbGVtZW50IHVzZWQgdG8gcG9zaXRpb24gdGhlIHBvcHBlclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wcGVyIC0gVGhlIEhUTUwgZWxlbWVudCB1c2VkIGFzIHBvcHBlclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBQb3BwZXIuanMgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBhcHBseVN0eWxlT25Mb2FkKHJlZmVyZW5jZSwgcG9wcGVyLCBvcHRpb25zLCBtb2RpZmllck9wdGlvbnMsIHN0YXRlKSB7XG4gIC8vIGNvbXB1dGUgcmVmZXJlbmNlIGVsZW1lbnQgb2Zmc2V0c1xuICB2YXIgcmVmZXJlbmNlT2Zmc2V0cyA9IGdldFJlZmVyZW5jZU9mZnNldHMoc3RhdGUsIHBvcHBlciwgcmVmZXJlbmNlLCBvcHRpb25zLnBvc2l0aW9uRml4ZWQpO1xuXG4gIC8vIGNvbXB1dGUgYXV0byBwbGFjZW1lbnQsIHN0b3JlIHBsYWNlbWVudCBpbnNpZGUgdGhlIGRhdGEgb2JqZWN0LFxuICAvLyBtb2RpZmllcnMgd2lsbCBiZSBhYmxlIHRvIGVkaXQgYHBsYWNlbWVudGAgaWYgbmVlZGVkXG4gIC8vIGFuZCByZWZlciB0byBvcmlnaW5hbFBsYWNlbWVudCB0byBrbm93IHRoZSBvcmlnaW5hbCB2YWx1ZVxuICB2YXIgcGxhY2VtZW50ID0gY29tcHV0ZUF1dG9QbGFjZW1lbnQob3B0aW9ucy5wbGFjZW1lbnQsIHJlZmVyZW5jZU9mZnNldHMsIHBvcHBlciwgcmVmZXJlbmNlLCBvcHRpb25zLm1vZGlmaWVycy5mbGlwLmJvdW5kYXJpZXNFbGVtZW50LCBvcHRpb25zLm1vZGlmaWVycy5mbGlwLnBhZGRpbmcpO1xuXG4gIHBvcHBlci5zZXRBdHRyaWJ1dGUoJ3gtcGxhY2VtZW50JywgcGxhY2VtZW50KTtcblxuICAvLyBBcHBseSBgcG9zaXRpb25gIHRvIHBvcHBlciBiZWZvcmUgYW55dGhpbmcgZWxzZSBiZWNhdXNlXG4gIC8vIHdpdGhvdXQgdGhlIHBvc2l0aW9uIGFwcGxpZWQgd2UgY2FuJ3QgZ3VhcmFudGVlIGNvcnJlY3QgY29tcHV0YXRpb25zXG4gIHNldFN0eWxlcyhwb3BwZXIsIHsgcG9zaXRpb246IG9wdGlvbnMucG9zaXRpb25GaXhlZCA/ICdmaXhlZCcgOiAnYWJzb2x1dGUnIH0pO1xuXG4gIHJldHVybiBvcHRpb25zO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBjb21wdXRlU3R5bGUoZGF0YSwgb3B0aW9ucykge1xuICB2YXIgeCA9IG9wdGlvbnMueCxcbiAgICAgIHkgPSBvcHRpb25zLnk7XG4gIHZhciBwb3BwZXIgPSBkYXRhLm9mZnNldHMucG9wcGVyO1xuXG4gIC8vIFJlbW92ZSB0aGlzIGxlZ2FjeSBzdXBwb3J0IGluIFBvcHBlci5qcyB2MlxuXG4gIHZhciBsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gPSBmaW5kKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCBmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICByZXR1cm4gbW9kaWZpZXIubmFtZSA9PT0gJ2FwcGx5U3R5bGUnO1xuICB9KS5ncHVBY2NlbGVyYXRpb247XG4gIGlmIChsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnNvbGUud2FybignV0FSTklORzogYGdwdUFjY2VsZXJhdGlvbmAgb3B0aW9uIG1vdmVkIHRvIGBjb21wdXRlU3R5bGVgIG1vZGlmaWVyIGFuZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFBvcHBlci5qcyEnKTtcbiAgfVxuICB2YXIgZ3B1QWNjZWxlcmF0aW9uID0gbGVnYWN5R3B1QWNjZWxlcmF0aW9uT3B0aW9uICE9PSB1bmRlZmluZWQgPyBsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gOiBvcHRpb25zLmdwdUFjY2VsZXJhdGlvbjtcblxuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGRhdGEuaW5zdGFuY2UucG9wcGVyKTtcbiAgdmFyIG9mZnNldFBhcmVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50KTtcblxuICAvLyBTdHlsZXNcbiAgdmFyIHN0eWxlcyA9IHtcbiAgICBwb3NpdGlvbjogcG9wcGVyLnBvc2l0aW9uXG4gIH07XG5cbiAgLy8gQXZvaWQgYmx1cnJ5IHRleHQgYnkgdXNpbmcgZnVsbCBwaXhlbCBpbnRlZ2Vycy5cbiAgLy8gRm9yIHBpeGVsLXBlcmZlY3QgcG9zaXRpb25pbmcsIHRvcC9ib3R0b20gcHJlZmVycyByb3VuZGVkXG4gIC8vIHZhbHVlcywgd2hpbGUgbGVmdC9yaWdodCBwcmVmZXJzIGZsb29yZWQgdmFsdWVzLlxuICB2YXIgb2Zmc2V0cyA9IHtcbiAgICBsZWZ0OiBNYXRoLmZsb29yKHBvcHBlci5sZWZ0KSxcbiAgICB0b3A6IE1hdGgucm91bmQocG9wcGVyLnRvcCksXG4gICAgYm90dG9tOiBNYXRoLnJvdW5kKHBvcHBlci5ib3R0b20pLFxuICAgIHJpZ2h0OiBNYXRoLmZsb29yKHBvcHBlci5yaWdodClcbiAgfTtcblxuICB2YXIgc2lkZUEgPSB4ID09PSAnYm90dG9tJyA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gIHZhciBzaWRlQiA9IHkgPT09ICdyaWdodCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuXG4gIC8vIGlmIGdwdUFjY2VsZXJhdGlvbiBpcyBzZXQgdG8gYHRydWVgIGFuZCB0cmFuc2Zvcm0gaXMgc3VwcG9ydGVkLFxuICAvLyAgd2UgdXNlIGB0cmFuc2xhdGUzZGAgdG8gYXBwbHkgdGhlIHBvc2l0aW9uIHRvIHRoZSBwb3BwZXIgd2VcbiAgLy8gYXV0b21hdGljYWxseSB1c2UgdGhlIHN1cHBvcnRlZCBwcmVmaXhlZCB2ZXJzaW9uIGlmIG5lZWRlZFxuICB2YXIgcHJlZml4ZWRQcm9wZXJ0eSA9IGdldFN1cHBvcnRlZFByb3BlcnR5TmFtZSgndHJhbnNmb3JtJyk7XG5cbiAgLy8gbm93LCBsZXQncyBtYWtlIGEgc3RlcCBiYWNrIGFuZCBsb29rIGF0IHRoaXMgY29kZSBjbG9zZWx5ICh3dGY/KVxuICAvLyBJZiB0aGUgY29udGVudCBvZiB0aGUgcG9wcGVyIGdyb3dzIG9uY2UgaXQncyBiZWVuIHBvc2l0aW9uZWQsIGl0XG4gIC8vIG1heSBoYXBwZW4gdGhhdCB0aGUgcG9wcGVyIGdldHMgbWlzcGxhY2VkIGJlY2F1c2Ugb2YgdGhlIG5ldyBjb250ZW50XG4gIC8vIG92ZXJmbG93aW5nIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIHByb3ZpZGUgdHdvIG9wdGlvbnMgKHggYW5kIHkpLCB3aGljaCBhbGxvd1xuICAvLyB0aGUgY29uc3VtZXIgdG8gZGVmaW5lIHRoZSBvZmZzZXQgb3JpZ2luLlxuICAvLyBJZiB3ZSBwb3NpdGlvbiBhIHBvcHBlciBvbiB0b3Agb2YgYSByZWZlcmVuY2UgZWxlbWVudCwgd2UgY2FuIHNldFxuICAvLyBgeGAgdG8gYHRvcGAgdG8gbWFrZSB0aGUgcG9wcGVyIGdyb3cgdG93YXJkcyBpdHMgdG9wIGluc3RlYWQgb2ZcbiAgLy8gaXRzIGJvdHRvbS5cbiAgdmFyIGxlZnQgPSB2b2lkIDAsXG4gICAgICB0b3AgPSB2b2lkIDA7XG4gIGlmIChzaWRlQSA9PT0gJ2JvdHRvbScpIHtcbiAgICB0b3AgPSAtb2Zmc2V0UGFyZW50UmVjdC5oZWlnaHQgKyBvZmZzZXRzLmJvdHRvbTtcbiAgfSBlbHNlIHtcbiAgICB0b3AgPSBvZmZzZXRzLnRvcDtcbiAgfVxuICBpZiAoc2lkZUIgPT09ICdyaWdodCcpIHtcbiAgICBsZWZ0ID0gLW9mZnNldFBhcmVudFJlY3Qud2lkdGggKyBvZmZzZXRzLnJpZ2h0O1xuICB9IGVsc2Uge1xuICAgIGxlZnQgPSBvZmZzZXRzLmxlZnQ7XG4gIH1cbiAgaWYgKGdwdUFjY2VsZXJhdGlvbiAmJiBwcmVmaXhlZFByb3BlcnR5KSB7XG4gICAgc3R5bGVzW3ByZWZpeGVkUHJvcGVydHldID0gJ3RyYW5zbGF0ZTNkKCcgKyBsZWZ0ICsgJ3B4LCAnICsgdG9wICsgJ3B4LCAwKSc7XG4gICAgc3R5bGVzW3NpZGVBXSA9IDA7XG4gICAgc3R5bGVzW3NpZGVCXSA9IDA7XG4gICAgc3R5bGVzLndpbGxDaGFuZ2UgPSAndHJhbnNmb3JtJztcbiAgfSBlbHNlIHtcbiAgICAvLyBvdGh3ZXJpc2UsIHdlIHVzZSB0aGUgc3RhbmRhcmQgYHRvcGAsIGBsZWZ0YCwgYGJvdHRvbWAgYW5kIGByaWdodGAgcHJvcGVydGllc1xuICAgIHZhciBpbnZlcnRUb3AgPSBzaWRlQSA9PT0gJ2JvdHRvbScgPyAtMSA6IDE7XG4gICAgdmFyIGludmVydExlZnQgPSBzaWRlQiA9PT0gJ3JpZ2h0JyA/IC0xIDogMTtcbiAgICBzdHlsZXNbc2lkZUFdID0gdG9wICogaW52ZXJ0VG9wO1xuICAgIHN0eWxlc1tzaWRlQl0gPSBsZWZ0ICogaW52ZXJ0TGVmdDtcbiAgICBzdHlsZXMud2lsbENoYW5nZSA9IHNpZGVBICsgJywgJyArIHNpZGVCO1xuICB9XG5cbiAgLy8gQXR0cmlidXRlc1xuICB2YXIgYXR0cmlidXRlcyA9IHtcbiAgICAneC1wbGFjZW1lbnQnOiBkYXRhLnBsYWNlbWVudFxuICB9O1xuXG4gIC8vIFVwZGF0ZSBgZGF0YWAgYXR0cmlidXRlcywgc3R5bGVzIGFuZCBhcnJvd1N0eWxlc1xuICBkYXRhLmF0dHJpYnV0ZXMgPSBfZXh0ZW5kcyh7fSwgYXR0cmlidXRlcywgZGF0YS5hdHRyaWJ1dGVzKTtcbiAgZGF0YS5zdHlsZXMgPSBfZXh0ZW5kcyh7fSwgc3R5bGVzLCBkYXRhLnN0eWxlcyk7XG4gIGRhdGEuYXJyb3dTdHlsZXMgPSBfZXh0ZW5kcyh7fSwgZGF0YS5vZmZzZXRzLmFycm93LCBkYXRhLmFycm93U3R5bGVzKTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdXNlZCB0byBrbm93IGlmIHRoZSBnaXZlbiBtb2RpZmllciBkZXBlbmRzIGZyb20gYW5vdGhlciBvbmUuPGJyIC8+XG4gKiBJdCBjaGVja3MgaWYgdGhlIG5lZWRlZCBtb2RpZmllciBpcyBsaXN0ZWQgYW5kIGVuYWJsZWQuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0FycmF5fSBtb2RpZmllcnMgLSBsaXN0IG9mIG1vZGlmaWVyc1xuICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RpbmdOYW1lIC0gbmFtZSBvZiByZXF1ZXN0aW5nIG1vZGlmaWVyXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdGVkTmFtZSAtIG5hbWUgb2YgcmVxdWVzdGVkIG1vZGlmaWVyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNNb2RpZmllclJlcXVpcmVkKG1vZGlmaWVycywgcmVxdWVzdGluZ05hbWUsIHJlcXVlc3RlZE5hbWUpIHtcbiAgdmFyIHJlcXVlc3RpbmcgPSBmaW5kKG1vZGlmaWVycywgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgbmFtZSA9IF9yZWYubmFtZTtcbiAgICByZXR1cm4gbmFtZSA9PT0gcmVxdWVzdGluZ05hbWU7XG4gIH0pO1xuXG4gIHZhciBpc1JlcXVpcmVkID0gISFyZXF1ZXN0aW5nICYmIG1vZGlmaWVycy5zb21lKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIHJldHVybiBtb2RpZmllci5uYW1lID09PSByZXF1ZXN0ZWROYW1lICYmIG1vZGlmaWVyLmVuYWJsZWQgJiYgbW9kaWZpZXIub3JkZXIgPCByZXF1ZXN0aW5nLm9yZGVyO1xuICB9KTtcblxuICBpZiAoIWlzUmVxdWlyZWQpIHtcbiAgICB2YXIgX3JlcXVlc3RpbmcgPSAnYCcgKyByZXF1ZXN0aW5nTmFtZSArICdgJztcbiAgICB2YXIgcmVxdWVzdGVkID0gJ2AnICsgcmVxdWVzdGVkTmFtZSArICdgJztcbiAgICBjb25zb2xlLndhcm4ocmVxdWVzdGVkICsgJyBtb2RpZmllciBpcyByZXF1aXJlZCBieSAnICsgX3JlcXVlc3RpbmcgKyAnIG1vZGlmaWVyIGluIG9yZGVyIHRvIHdvcmssIGJlIHN1cmUgdG8gaW5jbHVkZSBpdCBiZWZvcmUgJyArIF9yZXF1ZXN0aW5nICsgJyEnKTtcbiAgfVxuICByZXR1cm4gaXNSZXF1aXJlZDtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGFycm93KGRhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIF9kYXRhJG9mZnNldHMkYXJyb3c7XG5cbiAgLy8gYXJyb3cgZGVwZW5kcyBvbiBrZWVwVG9nZXRoZXIgaW4gb3JkZXIgdG8gd29ya1xuICBpZiAoIWlzTW9kaWZpZXJSZXF1aXJlZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgJ2Fycm93JywgJ2tlZXBUb2dldGhlcicpKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICB2YXIgYXJyb3dFbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50O1xuXG4gIC8vIGlmIGFycm93RWxlbWVudCBpcyBhIHN0cmluZywgc3VwcG9zZSBpdCdzIGEgQ1NTIHNlbGVjdG9yXG4gIGlmICh0eXBlb2YgYXJyb3dFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIGFycm93RWxlbWVudCA9IGRhdGEuaW5zdGFuY2UucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIC8vIGlmIGFycm93RWxlbWVudCBpcyBub3QgZm91bmQsIGRvbid0IHJ1biB0aGUgbW9kaWZpZXJcbiAgICBpZiAoIWFycm93RWxlbWVudCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGlmIHRoZSBhcnJvd0VsZW1lbnQgaXNuJ3QgYSBxdWVyeSBzZWxlY3RvciB3ZSBtdXN0IGNoZWNrIHRoYXQgdGhlXG4gICAgLy8gcHJvdmlkZWQgRE9NIG5vZGUgaXMgY2hpbGQgb2YgaXRzIHBvcHBlciBub2RlXG4gICAgaWYgKCFkYXRhLmluc3RhbmNlLnBvcHBlci5jb250YWlucyhhcnJvd0VsZW1lbnQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IGBhcnJvdy5lbGVtZW50YCBtdXN0IGJlIGNoaWxkIG9mIGl0cyBwb3BwZXIgZWxlbWVudCEnKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgfVxuXG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyLFxuICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2U7XG5cbiAgdmFyIGlzVmVydGljYWwgPSBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xO1xuXG4gIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICB2YXIgc2lkZUNhcGl0YWxpemVkID0gaXNWZXJ0aWNhbCA/ICdUb3AnIDogJ0xlZnQnO1xuICB2YXIgc2lkZSA9IHNpZGVDYXBpdGFsaXplZC50b0xvd2VyQ2FzZSgpO1xuICB2YXIgYWx0U2lkZSA9IGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJztcbiAgdmFyIG9wU2lkZSA9IGlzVmVydGljYWwgPyAnYm90dG9tJyA6ICdyaWdodCc7XG4gIHZhciBhcnJvd0VsZW1lbnRTaXplID0gZ2V0T3V0ZXJTaXplcyhhcnJvd0VsZW1lbnQpW2xlbl07XG5cbiAgLy9cbiAgLy8gZXh0ZW5kcyBrZWVwVG9nZXRoZXIgYmVoYXZpb3IgbWFraW5nIHN1cmUgdGhlIHBvcHBlciBhbmQgaXRzXG4gIC8vIHJlZmVyZW5jZSBoYXZlIGVub3VnaCBwaXhlbHMgaW4gY29uanVjdGlvblxuICAvL1xuXG4gIC8vIHRvcC9sZWZ0IHNpZGVcbiAgaWYgKHJlZmVyZW5jZVtvcFNpZGVdIC0gYXJyb3dFbGVtZW50U2l6ZSA8IHBvcHBlcltzaWRlXSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gLT0gcG9wcGVyW3NpZGVdIC0gKHJlZmVyZW5jZVtvcFNpZGVdIC0gYXJyb3dFbGVtZW50U2l6ZSk7XG4gIH1cbiAgLy8gYm90dG9tL3JpZ2h0IHNpZGVcbiAgaWYgKHJlZmVyZW5jZVtzaWRlXSArIGFycm93RWxlbWVudFNpemUgPiBwb3BwZXJbb3BTaWRlXSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gKz0gcmVmZXJlbmNlW3NpZGVdICsgYXJyb3dFbGVtZW50U2l6ZSAtIHBvcHBlcltvcFNpZGVdO1xuICB9XG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBnZXRDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5wb3BwZXIpO1xuXG4gIC8vIGNvbXB1dGUgY2VudGVyIG9mIHRoZSBwb3BwZXJcbiAgdmFyIGNlbnRlciA9IHJlZmVyZW5jZVtzaWRlXSArIHJlZmVyZW5jZVtsZW5dIC8gMiAtIGFycm93RWxlbWVudFNpemUgLyAyO1xuXG4gIC8vIENvbXB1dGUgdGhlIHNpZGVWYWx1ZSB1c2luZyB0aGUgdXBkYXRlZCBwb3BwZXIgb2Zmc2V0c1xuICAvLyB0YWtlIHBvcHBlciBtYXJnaW4gaW4gYWNjb3VudCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhpcyBpbmZvIGF2YWlsYWJsZVxuICB2YXIgY3NzID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGRhdGEuaW5zdGFuY2UucG9wcGVyKTtcbiAgdmFyIHBvcHBlck1hcmdpblNpZGUgPSBwYXJzZUZsb2F0KGNzc1snbWFyZ2luJyArIHNpZGVDYXBpdGFsaXplZF0sIDEwKTtcbiAgdmFyIHBvcHBlckJvcmRlclNpZGUgPSBwYXJzZUZsb2F0KGNzc1snYm9yZGVyJyArIHNpZGVDYXBpdGFsaXplZCArICdXaWR0aCddLCAxMCk7XG4gIHZhciBzaWRlVmFsdWUgPSBjZW50ZXIgLSBkYXRhLm9mZnNldHMucG9wcGVyW3NpZGVdIC0gcG9wcGVyTWFyZ2luU2lkZSAtIHBvcHBlckJvcmRlclNpZGU7XG5cbiAgLy8gcHJldmVudCBhcnJvd0VsZW1lbnQgZnJvbSBiZWluZyBwbGFjZWQgbm90IGNvbnRpZ3VvdXNseSB0byBpdHMgcG9wcGVyXG4gIHNpZGVWYWx1ZSA9IE1hdGgubWF4KE1hdGgubWluKHBvcHBlcltsZW5dIC0gYXJyb3dFbGVtZW50U2l6ZSwgc2lkZVZhbHVlKSwgMCk7XG5cbiAgZGF0YS5hcnJvd0VsZW1lbnQgPSBhcnJvd0VsZW1lbnQ7XG4gIGRhdGEub2Zmc2V0cy5hcnJvdyA9IChfZGF0YSRvZmZzZXRzJGFycm93ID0ge30sIGRlZmluZVByb3BlcnR5KF9kYXRhJG9mZnNldHMkYXJyb3csIHNpZGUsIE1hdGgucm91bmQoc2lkZVZhbHVlKSksIGRlZmluZVByb3BlcnR5KF9kYXRhJG9mZnNldHMkYXJyb3csIGFsdFNpZGUsICcnKSwgX2RhdGEkb2Zmc2V0cyRhcnJvdyk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogR2V0IHRoZSBvcHBvc2l0ZSBwbGFjZW1lbnQgdmFyaWF0aW9uIG9mIHRoZSBnaXZlbiBvbmVcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwbGFjZW1lbnQgdmFyaWF0aW9uXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBmbGlwcGVkIHBsYWNlbWVudCB2YXJpYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVWYXJpYXRpb24odmFyaWF0aW9uKSB7XG4gIGlmICh2YXJpYXRpb24gPT09ICdlbmQnKSB7XG4gICAgcmV0dXJuICdzdGFydCc7XG4gIH0gZWxzZSBpZiAodmFyaWF0aW9uID09PSAnc3RhcnQnKSB7XG4gICAgcmV0dXJuICdlbmQnO1xuICB9XG4gIHJldHVybiB2YXJpYXRpb247XG59XG5cbi8qKlxuICogTGlzdCBvZiBhY2NlcHRlZCBwbGFjZW1lbnRzIHRvIHVzZSBhcyB2YWx1ZXMgb2YgdGhlIGBwbGFjZW1lbnRgIG9wdGlvbi48YnIgLz5cbiAqIFZhbGlkIHBsYWNlbWVudHMgYXJlOlxuICogLSBgYXV0b2BcbiAqIC0gYHRvcGBcbiAqIC0gYHJpZ2h0YFxuICogLSBgYm90dG9tYFxuICogLSBgbGVmdGBcbiAqXG4gKiBFYWNoIHBsYWNlbWVudCBjYW4gaGF2ZSBhIHZhcmlhdGlvbiBmcm9tIHRoaXMgbGlzdDpcbiAqIC0gYC1zdGFydGBcbiAqIC0gYC1lbmRgXG4gKlxuICogVmFyaWF0aW9ucyBhcmUgaW50ZXJwcmV0ZWQgZWFzaWx5IGlmIHlvdSB0aGluayBvZiB0aGVtIGFzIHRoZSBsZWZ0IHRvIHJpZ2h0XG4gKiB3cml0dGVuIGxhbmd1YWdlcy4gSG9yaXpvbnRhbGx5IChgdG9wYCBhbmQgYGJvdHRvbWApLCBgc3RhcnRgIGlzIGxlZnQgYW5kIGBlbmRgXG4gKiBpcyByaWdodC48YnIgLz5cbiAqIFZlcnRpY2FsbHkgKGBsZWZ0YCBhbmQgYHJpZ2h0YCksIGBzdGFydGAgaXMgdG9wIGFuZCBgZW5kYCBpcyBib3R0b20uXG4gKlxuICogU29tZSB2YWxpZCBleGFtcGxlcyBhcmU6XG4gKiAtIGB0b3AtZW5kYCAob24gdG9wIG9mIHJlZmVyZW5jZSwgcmlnaHQgYWxpZ25lZClcbiAqIC0gYHJpZ2h0LXN0YXJ0YCAob24gcmlnaHQgb2YgcmVmZXJlbmNlLCB0b3AgYWxpZ25lZClcbiAqIC0gYGJvdHRvbWAgKG9uIGJvdHRvbSwgY2VudGVyZWQpXG4gKiAtIGBhdXRvLXJpZ2h0YCAob24gdGhlIHNpZGUgd2l0aCBtb3JlIHNwYWNlIGF2YWlsYWJsZSwgYWxpZ25tZW50IGRlcGVuZHMgYnkgcGxhY2VtZW50KVxuICpcbiAqIEBzdGF0aWNcbiAqIEB0eXBlIHtBcnJheX1cbiAqIEBlbnVtIHtTdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZXRob2QgcGxhY2VtZW50c1xuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG52YXIgcGxhY2VtZW50cyA9IFsnYXV0by1zdGFydCcsICdhdXRvJywgJ2F1dG8tZW5kJywgJ3RvcC1zdGFydCcsICd0b3AnLCAndG9wLWVuZCcsICdyaWdodC1zdGFydCcsICdyaWdodCcsICdyaWdodC1lbmQnLCAnYm90dG9tLWVuZCcsICdib3R0b20nLCAnYm90dG9tLXN0YXJ0JywgJ2xlZnQtZW5kJywgJ2xlZnQnLCAnbGVmdC1zdGFydCddO1xuXG4vLyBHZXQgcmlkIG9mIGBhdXRvYCBgYXV0by1zdGFydGAgYW5kIGBhdXRvLWVuZGBcbnZhciB2YWxpZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzLnNsaWNlKDMpO1xuXG4vKipcbiAqIEdpdmVuIGFuIGluaXRpYWwgcGxhY2VtZW50LCByZXR1cm5zIGFsbCB0aGUgc3Vic2VxdWVudCBwbGFjZW1lbnRzXG4gKiBjbG9ja3dpc2UgKG9yIGNvdW50ZXItY2xvY2t3aXNlKS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gcGxhY2VtZW50IC0gQSB2YWxpZCBwbGFjZW1lbnQgKGl0IGFjY2VwdHMgdmFyaWF0aW9ucylcbiAqIEBhcmd1bWVudCB7Qm9vbGVhbn0gY291bnRlciAtIFNldCB0byB0cnVlIHRvIHdhbGsgdGhlIHBsYWNlbWVudHMgY291bnRlcmNsb2Nrd2lzZVxuICogQHJldHVybnMge0FycmF5fSBwbGFjZW1lbnRzIGluY2x1ZGluZyB0aGVpciB2YXJpYXRpb25zXG4gKi9cbmZ1bmN0aW9uIGNsb2Nrd2lzZShwbGFjZW1lbnQpIHtcbiAgdmFyIGNvdW50ZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIHZhciBpbmRleCA9IHZhbGlkUGxhY2VtZW50cy5pbmRleE9mKHBsYWNlbWVudCk7XG4gIHZhciBhcnIgPSB2YWxpZFBsYWNlbWVudHMuc2xpY2UoaW5kZXggKyAxKS5jb25jYXQodmFsaWRQbGFjZW1lbnRzLnNsaWNlKDAsIGluZGV4KSk7XG4gIHJldHVybiBjb3VudGVyID8gYXJyLnJldmVyc2UoKSA6IGFycjtcbn1cblxudmFyIEJFSEFWSU9SUyA9IHtcbiAgRkxJUDogJ2ZsaXAnLFxuICBDTE9DS1dJU0U6ICdjbG9ja3dpc2UnLFxuICBDT1VOVEVSQ0xPQ0tXSVNFOiAnY291bnRlcmNsb2Nrd2lzZSdcbn07XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBmbGlwKGRhdGEsIG9wdGlvbnMpIHtcbiAgLy8gaWYgYGlubmVyYCBtb2RpZmllciBpcyBlbmFibGVkLCB3ZSBjYW4ndCB1c2UgdGhlIGBmbGlwYCBtb2RpZmllclxuICBpZiAoaXNNb2RpZmllckVuYWJsZWQoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsICdpbm5lcicpKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBpZiAoZGF0YS5mbGlwcGVkICYmIGRhdGEucGxhY2VtZW50ID09PSBkYXRhLm9yaWdpbmFsUGxhY2VtZW50KSB7XG4gICAgLy8gc2VlbXMgbGlrZSBmbGlwIGlzIHRyeWluZyB0byBsb29wLCBwcm9iYWJseSB0aGVyZSdzIG5vdCBlbm91Z2ggc3BhY2Ugb24gYW55IG9mIHRoZSBmbGlwcGFibGUgc2lkZXNcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciBib3VuZGFyaWVzID0gZ2V0Qm91bmRhcmllcyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5pbnN0YW5jZS5yZWZlcmVuY2UsIG9wdGlvbnMucGFkZGluZywgb3B0aW9ucy5ib3VuZGFyaWVzRWxlbWVudCwgZGF0YS5wb3NpdGlvbkZpeGVkKTtcblxuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgdmFyIHBsYWNlbWVudE9wcG9zaXRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgdmFyIHZhcmlhdGlvbiA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMV0gfHwgJyc7XG5cbiAgdmFyIGZsaXBPcmRlciA9IFtdO1xuXG4gIHN3aXRjaCAob3B0aW9ucy5iZWhhdmlvcikge1xuICAgIGNhc2UgQkVIQVZJT1JTLkZMSVA6XG4gICAgICBmbGlwT3JkZXIgPSBbcGxhY2VtZW50LCBwbGFjZW1lbnRPcHBvc2l0ZV07XG4gICAgICBicmVhaztcbiAgICBjYXNlIEJFSEFWSU9SUy5DTE9DS1dJU0U6XG4gICAgICBmbGlwT3JkZXIgPSBjbG9ja3dpc2UocGxhY2VtZW50KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQkVIQVZJT1JTLkNPVU5URVJDTE9DS1dJU0U6XG4gICAgICBmbGlwT3JkZXIgPSBjbG9ja3dpc2UocGxhY2VtZW50LCB0cnVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBmbGlwT3JkZXIgPSBvcHRpb25zLmJlaGF2aW9yO1xuICB9XG5cbiAgZmxpcE9yZGVyLmZvckVhY2goZnVuY3Rpb24gKHN0ZXAsIGluZGV4KSB7XG4gICAgaWYgKHBsYWNlbWVudCAhPT0gc3RlcCB8fCBmbGlwT3JkZXIubGVuZ3RoID09PSBpbmRleCArIDEpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gICAgcGxhY2VtZW50T3Bwb3NpdGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuXG4gICAgdmFyIHBvcHBlck9mZnNldHMgPSBkYXRhLm9mZnNldHMucG9wcGVyO1xuICAgIHZhciByZWZPZmZzZXRzID0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZTtcblxuICAgIC8vIHVzaW5nIGZsb29yIGJlY2F1c2UgdGhlIHJlZmVyZW5jZSBvZmZzZXRzIG1heSBjb250YWluIGRlY2ltYWxzIHdlIGFyZSBub3QgZ29pbmcgdG8gY29uc2lkZXIgaGVyZVxuICAgIHZhciBmbG9vciA9IE1hdGguZmxvb3I7XG4gICAgdmFyIG92ZXJsYXBzUmVmID0gcGxhY2VtZW50ID09PSAnbGVmdCcgJiYgZmxvb3IocG9wcGVyT2Zmc2V0cy5yaWdodCkgPiBmbG9vcihyZWZPZmZzZXRzLmxlZnQpIHx8IHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLmxlZnQpIDwgZmxvb3IocmVmT2Zmc2V0cy5yaWdodCkgfHwgcGxhY2VtZW50ID09PSAndG9wJyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLmJvdHRvbSkgPiBmbG9vcihyZWZPZmZzZXRzLnRvcCkgfHwgcGxhY2VtZW50ID09PSAnYm90dG9tJyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLnRvcCkgPCBmbG9vcihyZWZPZmZzZXRzLmJvdHRvbSk7XG5cbiAgICB2YXIgb3ZlcmZsb3dzTGVmdCA9IGZsb29yKHBvcHBlck9mZnNldHMubGVmdCkgPCBmbG9vcihib3VuZGFyaWVzLmxlZnQpO1xuICAgIHZhciBvdmVyZmxvd3NSaWdodCA9IGZsb29yKHBvcHBlck9mZnNldHMucmlnaHQpID4gZmxvb3IoYm91bmRhcmllcy5yaWdodCk7XG4gICAgdmFyIG92ZXJmbG93c1RvcCA9IGZsb29yKHBvcHBlck9mZnNldHMudG9wKSA8IGZsb29yKGJvdW5kYXJpZXMudG9wKTtcbiAgICB2YXIgb3ZlcmZsb3dzQm90dG9tID0gZmxvb3IocG9wcGVyT2Zmc2V0cy5ib3R0b20pID4gZmxvb3IoYm91bmRhcmllcy5ib3R0b20pO1xuXG4gICAgdmFyIG92ZXJmbG93c0JvdW5kYXJpZXMgPSBwbGFjZW1lbnQgPT09ICdsZWZ0JyAmJiBvdmVyZmxvd3NMZWZ0IHx8IHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyAmJiBvdmVyZmxvd3NSaWdodCB8fCBwbGFjZW1lbnQgPT09ICd0b3AnICYmIG92ZXJmbG93c1RvcCB8fCBwbGFjZW1lbnQgPT09ICdib3R0b20nICYmIG92ZXJmbG93c0JvdHRvbTtcblxuICAgIC8vIGZsaXAgdGhlIHZhcmlhdGlvbiBpZiByZXF1aXJlZFxuICAgIHZhciBpc1ZlcnRpY2FsID0gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTtcbiAgICB2YXIgZmxpcHBlZFZhcmlhdGlvbiA9ICEhb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyAmJiAoaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdzdGFydCcgJiYgb3ZlcmZsb3dzTGVmdCB8fCBpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ2VuZCcgJiYgb3ZlcmZsb3dzUmlnaHQgfHwgIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnc3RhcnQnICYmIG92ZXJmbG93c1RvcCB8fCAhaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c0JvdHRvbSk7XG5cbiAgICBpZiAob3ZlcmxhcHNSZWYgfHwgb3ZlcmZsb3dzQm91bmRhcmllcyB8fCBmbGlwcGVkVmFyaWF0aW9uKSB7XG4gICAgICAvLyB0aGlzIGJvb2xlYW4gdG8gZGV0ZWN0IGFueSBmbGlwIGxvb3BcbiAgICAgIGRhdGEuZmxpcHBlZCA9IHRydWU7XG5cbiAgICAgIGlmIChvdmVybGFwc1JlZiB8fCBvdmVyZmxvd3NCb3VuZGFyaWVzKSB7XG4gICAgICAgIHBsYWNlbWVudCA9IGZsaXBPcmRlcltpbmRleCArIDFdO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmxpcHBlZFZhcmlhdGlvbikge1xuICAgICAgICB2YXJpYXRpb24gPSBnZXRPcHBvc2l0ZVZhcmlhdGlvbih2YXJpYXRpb24pO1xuICAgICAgfVxuXG4gICAgICBkYXRhLnBsYWNlbWVudCA9IHBsYWNlbWVudCArICh2YXJpYXRpb24gPyAnLScgKyB2YXJpYXRpb24gOiAnJyk7XG5cbiAgICAgIC8vIHRoaXMgb2JqZWN0IGNvbnRhaW5zIGBwb3NpdGlvbmAsIHdlIHdhbnQgdG8gcHJlc2VydmUgaXQgYWxvbmcgd2l0aFxuICAgICAgLy8gYW55IGFkZGl0aW9uYWwgcHJvcGVydHkgd2UgbWF5IGFkZCBpbiB0aGUgZnV0dXJlXG4gICAgICBkYXRhLm9mZnNldHMucG9wcGVyID0gX2V4dGVuZHMoe30sIGRhdGEub2Zmc2V0cy5wb3BwZXIsIGdldFBvcHBlck9mZnNldHMoZGF0YS5pbnN0YW5jZS5wb3BwZXIsIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UsIGRhdGEucGxhY2VtZW50KSk7XG5cbiAgICAgIGRhdGEgPSBydW5Nb2RpZmllcnMoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsIGRhdGEsICdmbGlwJyk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBrZWVwVG9nZXRoZXIoZGF0YSkge1xuICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyLFxuICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2U7XG5cbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIHZhciBmbG9vciA9IE1hdGguZmxvb3I7XG4gIHZhciBpc1ZlcnRpY2FsID0gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTtcbiAgdmFyIHNpZGUgPSBpc1ZlcnRpY2FsID8gJ3JpZ2h0JyA6ICdib3R0b20nO1xuICB2YXIgb3BTaWRlID0gaXNWZXJ0aWNhbCA/ICdsZWZ0JyA6ICd0b3AnO1xuICB2YXIgbWVhc3VyZW1lbnQgPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuXG4gIGlmIChwb3BwZXJbc2lkZV0gPCBmbG9vcihyZWZlcmVuY2Vbb3BTaWRlXSkpIHtcbiAgICBkYXRhLm9mZnNldHMucG9wcGVyW29wU2lkZV0gPSBmbG9vcihyZWZlcmVuY2Vbb3BTaWRlXSkgLSBwb3BwZXJbbWVhc3VyZW1lbnRdO1xuICB9XG4gIGlmIChwb3BwZXJbb3BTaWRlXSA+IGZsb29yKHJlZmVyZW5jZVtzaWRlXSkpIHtcbiAgICBkYXRhLm9mZnNldHMucG9wcGVyW29wU2lkZV0gPSBmbG9vcihyZWZlcmVuY2Vbc2lkZV0pO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgY29udGFpbmluZyB2YWx1ZSArIHVuaXQgaW50byBhIHB4IHZhbHVlIG51bWJlclxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2Yge21vZGlmaWVyc35vZmZzZXR9XG4gKiBAcHJpdmF0ZVxuICogQGFyZ3VtZW50IHtTdHJpbmd9IHN0ciAtIFZhbHVlICsgdW5pdCBzdHJpbmdcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBtZWFzdXJlbWVudCAtIGBoZWlnaHRgIG9yIGB3aWR0aGBcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBwb3BwZXJPZmZzZXRzXG4gKiBAYXJndW1lbnQge09iamVjdH0gcmVmZXJlbmNlT2Zmc2V0c1xuICogQHJldHVybnMge051bWJlcnxTdHJpbmd9XG4gKiBWYWx1ZSBpbiBwaXhlbHMsIG9yIG9yaWdpbmFsIHN0cmluZyBpZiBubyB2YWx1ZXMgd2VyZSBleHRyYWN0ZWRcbiAqL1xuZnVuY3Rpb24gdG9WYWx1ZShzdHIsIG1lYXN1cmVtZW50LCBwb3BwZXJPZmZzZXRzLCByZWZlcmVuY2VPZmZzZXRzKSB7XG4gIC8vIHNlcGFyYXRlIHZhbHVlIGZyb20gdW5pdFxuICB2YXIgc3BsaXQgPSBzdHIubWF0Y2goLygoPzpcXC18XFwrKT9cXGQqXFwuP1xcZCopKC4qKS8pO1xuICB2YXIgdmFsdWUgPSArc3BsaXRbMV07XG4gIHZhciB1bml0ID0gc3BsaXRbMl07XG5cbiAgLy8gSWYgaXQncyBub3QgYSBudW1iZXIgaXQncyBhbiBvcGVyYXRvciwgSSBndWVzc1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGlmICh1bml0LmluZGV4T2YoJyUnKSA9PT0gMCkge1xuICAgIHZhciBlbGVtZW50ID0gdm9pZCAwO1xuICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgY2FzZSAnJXAnOlxuICAgICAgICBlbGVtZW50ID0gcG9wcGVyT2Zmc2V0cztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICclJzpcbiAgICAgIGNhc2UgJyVyJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGVsZW1lbnQgPSByZWZlcmVuY2VPZmZzZXRzO1xuICAgIH1cblxuICAgIHZhciByZWN0ID0gZ2V0Q2xpZW50UmVjdChlbGVtZW50KTtcbiAgICByZXR1cm4gcmVjdFttZWFzdXJlbWVudF0gLyAxMDAgKiB2YWx1ZTtcbiAgfSBlbHNlIGlmICh1bml0ID09PSAndmgnIHx8IHVuaXQgPT09ICd2dycpIHtcbiAgICAvLyBpZiBpcyBhIHZoIG9yIHZ3LCB3ZSBjYWxjdWxhdGUgdGhlIHNpemUgYmFzZWQgb24gdGhlIHZpZXdwb3J0XG4gICAgdmFyIHNpemUgPSB2b2lkIDA7XG4gICAgaWYgKHVuaXQgPT09ICd2aCcpIHtcbiAgICAgIHNpemUgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNpemUgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZSAvIDEwMCAqIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIGlzIGFuIGV4cGxpY2l0IHBpeGVsIHVuaXQsIHdlIGdldCByaWQgb2YgdGhlIHVuaXQgYW5kIGtlZXAgdGhlIHZhbHVlXG4gICAgLy8gaWYgaXMgYW4gaW1wbGljaXQgdW5pdCwgaXQncyBweCwgYW5kIHdlIHJldHVybiBqdXN0IHRoZSB2YWx1ZVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIGFuIGBvZmZzZXRgIHN0cmluZyB0byBleHRyYXBvbGF0ZSBgeGAgYW5kIGB5YCBudW1lcmljIG9mZnNldHMuXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiB7bW9kaWZpZXJzfm9mZnNldH1cbiAqIEBwcml2YXRlXG4gKiBAYXJndW1lbnQge1N0cmluZ30gb2Zmc2V0XG4gKiBAYXJndW1lbnQge09iamVjdH0gcG9wcGVyT2Zmc2V0c1xuICogQGFyZ3VtZW50IHtPYmplY3R9IHJlZmVyZW5jZU9mZnNldHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBiYXNlUGxhY2VtZW50XG4gKiBAcmV0dXJucyB7QXJyYXl9IGEgdHdvIGNlbGxzIGFycmF5IHdpdGggeCBhbmQgeSBvZmZzZXRzIGluIG51bWJlcnNcbiAqL1xuZnVuY3Rpb24gcGFyc2VPZmZzZXQob2Zmc2V0LCBwb3BwZXJPZmZzZXRzLCByZWZlcmVuY2VPZmZzZXRzLCBiYXNlUGxhY2VtZW50KSB7XG4gIHZhciBvZmZzZXRzID0gWzAsIDBdO1xuXG4gIC8vIFVzZSBoZWlnaHQgaWYgcGxhY2VtZW50IGlzIGxlZnQgb3IgcmlnaHQgYW5kIGluZGV4IGlzIDAgb3RoZXJ3aXNlIHVzZSB3aWR0aFxuICAvLyBpbiB0aGlzIHdheSB0aGUgZmlyc3Qgb2Zmc2V0IHdpbGwgdXNlIGFuIGF4aXMgYW5kIHRoZSBzZWNvbmQgb25lXG4gIC8vIHdpbGwgdXNlIHRoZSBvdGhlciBvbmVcbiAgdmFyIHVzZUhlaWdodCA9IFsncmlnaHQnLCAnbGVmdCddLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xO1xuXG4gIC8vIFNwbGl0IHRoZSBvZmZzZXQgc3RyaW5nIHRvIG9idGFpbiBhIGxpc3Qgb2YgdmFsdWVzIGFuZCBvcGVyYW5kc1xuICAvLyBUaGUgcmVnZXggYWRkcmVzc2VzIHZhbHVlcyB3aXRoIHRoZSBwbHVzIG9yIG1pbnVzIHNpZ24gaW4gZnJvbnQgKCsxMCwgLTIwLCBldGMpXG4gIHZhciBmcmFnbWVudHMgPSBvZmZzZXQuc3BsaXQoLyhcXCt8XFwtKS8pLm1hcChmdW5jdGlvbiAoZnJhZykge1xuICAgIHJldHVybiBmcmFnLnRyaW0oKTtcbiAgfSk7XG5cbiAgLy8gRGV0ZWN0IGlmIHRoZSBvZmZzZXQgc3RyaW5nIGNvbnRhaW5zIGEgcGFpciBvZiB2YWx1ZXMgb3IgYSBzaW5nbGUgb25lXG4gIC8vIHRoZXkgY291bGQgYmUgc2VwYXJhdGVkIGJ5IGNvbW1hIG9yIHNwYWNlXG4gIHZhciBkaXZpZGVyID0gZnJhZ21lbnRzLmluZGV4T2YoZmluZChmcmFnbWVudHMsIGZ1bmN0aW9uIChmcmFnKSB7XG4gICAgcmV0dXJuIGZyYWcuc2VhcmNoKC8sfFxccy8pICE9PSAtMTtcbiAgfSkpO1xuXG4gIGlmIChmcmFnbWVudHNbZGl2aWRlcl0gJiYgZnJhZ21lbnRzW2RpdmlkZXJdLmluZGV4T2YoJywnKSA9PT0gLTEpIHtcbiAgICBjb25zb2xlLndhcm4oJ09mZnNldHMgc2VwYXJhdGVkIGJ5IHdoaXRlIHNwYWNlKHMpIGFyZSBkZXByZWNhdGVkLCB1c2UgYSBjb21tYSAoLCkgaW5zdGVhZC4nKTtcbiAgfVxuXG4gIC8vIElmIGRpdmlkZXIgaXMgZm91bmQsIHdlIGRpdmlkZSB0aGUgbGlzdCBvZiB2YWx1ZXMgYW5kIG9wZXJhbmRzIHRvIGRpdmlkZVxuICAvLyB0aGVtIGJ5IG9mc2V0IFggYW5kIFkuXG4gIHZhciBzcGxpdFJlZ2V4ID0gL1xccyosXFxzKnxcXHMrLztcbiAgdmFyIG9wcyA9IGRpdmlkZXIgIT09IC0xID8gW2ZyYWdtZW50cy5zbGljZSgwLCBkaXZpZGVyKS5jb25jYXQoW2ZyYWdtZW50c1tkaXZpZGVyXS5zcGxpdChzcGxpdFJlZ2V4KVswXV0pLCBbZnJhZ21lbnRzW2RpdmlkZXJdLnNwbGl0KHNwbGl0UmVnZXgpWzFdXS5jb25jYXQoZnJhZ21lbnRzLnNsaWNlKGRpdmlkZXIgKyAxKSldIDogW2ZyYWdtZW50c107XG5cbiAgLy8gQ29udmVydCB0aGUgdmFsdWVzIHdpdGggdW5pdHMgdG8gYWJzb2x1dGUgcGl4ZWxzIHRvIGFsbG93IG91ciBjb21wdXRhdGlvbnNcbiAgb3BzID0gb3BzLm1hcChmdW5jdGlvbiAob3AsIGluZGV4KSB7XG4gICAgLy8gTW9zdCBvZiB0aGUgdW5pdHMgcmVseSBvbiB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHBvcHBlclxuICAgIHZhciBtZWFzdXJlbWVudCA9IChpbmRleCA9PT0gMSA/ICF1c2VIZWlnaHQgOiB1c2VIZWlnaHQpID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICAgIHZhciBtZXJnZVdpdGhQcmV2aW91cyA9IGZhbHNlO1xuICAgIHJldHVybiBvcFxuICAgIC8vIFRoaXMgYWdncmVnYXRlcyBhbnkgYCtgIG9yIGAtYCBzaWduIHRoYXQgYXJlbid0IGNvbnNpZGVyZWQgb3BlcmF0b3JzXG4gICAgLy8gZS5nLjogMTAgKyArNSA9PiBbMTAsICssICs1XVxuICAgIC5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIGlmIChhW2EubGVuZ3RoIC0gMV0gPT09ICcnICYmIFsnKycsICctJ10uaW5kZXhPZihiKSAhPT0gLTEpIHtcbiAgICAgICAgYVthLmxlbmd0aCAtIDFdID0gYjtcbiAgICAgICAgbWVyZ2VXaXRoUHJldmlvdXMgPSB0cnVlO1xuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH0gZWxzZSBpZiAobWVyZ2VXaXRoUHJldmlvdXMpIHtcbiAgICAgICAgYVthLmxlbmd0aCAtIDFdICs9IGI7XG4gICAgICAgIG1lcmdlV2l0aFByZXZpb3VzID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGEuY29uY2F0KGIpO1xuICAgICAgfVxuICAgIH0sIFtdKVxuICAgIC8vIEhlcmUgd2UgY29udmVydCB0aGUgc3RyaW5nIHZhbHVlcyBpbnRvIG51bWJlciB2YWx1ZXMgKGluIHB4KVxuICAgIC5tYXAoZnVuY3Rpb24gKHN0cikge1xuICAgICAgcmV0dXJuIHRvVmFsdWUoc3RyLCBtZWFzdXJlbWVudCwgcG9wcGVyT2Zmc2V0cywgcmVmZXJlbmNlT2Zmc2V0cyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIExvb3AgdHJvdWdoIHRoZSBvZmZzZXRzIGFycmF5cyBhbmQgZXhlY3V0ZSB0aGUgb3BlcmF0aW9uc1xuICBvcHMuZm9yRWFjaChmdW5jdGlvbiAob3AsIGluZGV4KSB7XG4gICAgb3AuZm9yRWFjaChmdW5jdGlvbiAoZnJhZywgaW5kZXgyKSB7XG4gICAgICBpZiAoaXNOdW1lcmljKGZyYWcpKSB7XG4gICAgICAgIG9mZnNldHNbaW5kZXhdICs9IGZyYWcgKiAob3BbaW5kZXgyIC0gMV0gPT09ICctJyA/IC0xIDogMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gb2Zmc2V0cztcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAYXJndW1lbnQge051bWJlcnxTdHJpbmd9IG9wdGlvbnMub2Zmc2V0PTBcbiAqIFRoZSBvZmZzZXQgdmFsdWUgYXMgZGVzY3JpYmVkIGluIHRoZSBtb2RpZmllciBkZXNjcmlwdGlvblxuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBvZmZzZXQoZGF0YSwgX3JlZikge1xuICB2YXIgb2Zmc2V0ID0gX3JlZi5vZmZzZXQ7XG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudCxcbiAgICAgIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcixcbiAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlO1xuXG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG5cbiAgdmFyIG9mZnNldHMgPSB2b2lkIDA7XG4gIGlmIChpc051bWVyaWMoK29mZnNldCkpIHtcbiAgICBvZmZzZXRzID0gWytvZmZzZXQsIDBdO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldHMgPSBwYXJzZU9mZnNldChvZmZzZXQsIHBvcHBlciwgcmVmZXJlbmNlLCBiYXNlUGxhY2VtZW50KTtcbiAgfVxuXG4gIGlmIChiYXNlUGxhY2VtZW50ID09PSAnbGVmdCcpIHtcbiAgICBwb3BwZXIudG9wICs9IG9mZnNldHNbMF07XG4gICAgcG9wcGVyLmxlZnQgLT0gb2Zmc2V0c1sxXTtcbiAgfSBlbHNlIGlmIChiYXNlUGxhY2VtZW50ID09PSAncmlnaHQnKSB7XG4gICAgcG9wcGVyLnRvcCArPSBvZmZzZXRzWzBdO1xuICAgIHBvcHBlci5sZWZ0ICs9IG9mZnNldHNbMV07XG4gIH0gZWxzZSBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ3RvcCcpIHtcbiAgICBwb3BwZXIubGVmdCArPSBvZmZzZXRzWzBdO1xuICAgIHBvcHBlci50b3AgLT0gb2Zmc2V0c1sxXTtcbiAgfSBlbHNlIGlmIChiYXNlUGxhY2VtZW50ID09PSAnYm90dG9tJykge1xuICAgIHBvcHBlci5sZWZ0ICs9IG9mZnNldHNbMF07XG4gICAgcG9wcGVyLnRvcCArPSBvZmZzZXRzWzFdO1xuICB9XG5cbiAgZGF0YS5wb3BwZXIgPSBwb3BwZXI7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBwcmV2ZW50T3ZlcmZsb3coZGF0YSwgb3B0aW9ucykge1xuICB2YXIgYm91bmRhcmllc0VsZW1lbnQgPSBvcHRpb25zLmJvdW5kYXJpZXNFbGVtZW50IHx8IGdldE9mZnNldFBhcmVudChkYXRhLmluc3RhbmNlLnBvcHBlcik7XG5cbiAgLy8gSWYgb2Zmc2V0UGFyZW50IGlzIHRoZSByZWZlcmVuY2UgZWxlbWVudCwgd2UgcmVhbGx5IHdhbnQgdG9cbiAgLy8gZ28gb25lIHN0ZXAgdXAgYW5kIHVzZSB0aGUgbmV4dCBvZmZzZXRQYXJlbnQgYXMgcmVmZXJlbmNlIHRvXG4gIC8vIGF2b2lkIHRvIG1ha2UgdGhpcyBtb2RpZmllciBjb21wbGV0ZWx5IHVzZWxlc3MgYW5kIGxvb2sgbGlrZSBicm9rZW5cbiAgaWYgKGRhdGEuaW5zdGFuY2UucmVmZXJlbmNlID09PSBib3VuZGFyaWVzRWxlbWVudCkge1xuICAgIGJvdW5kYXJpZXNFbGVtZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGJvdW5kYXJpZXNFbGVtZW50KTtcbiAgfVxuXG4gIC8vIE5PVEU6IERPTSBhY2Nlc3MgaGVyZVxuICAvLyByZXNldHMgdGhlIHBvcHBlcidzIHBvc2l0aW9uIHNvIHRoYXQgdGhlIGRvY3VtZW50IHNpemUgY2FuIGJlIGNhbGN1bGF0ZWQgZXhjbHVkaW5nXG4gIC8vIHRoZSBzaXplIG9mIHRoZSBwb3BwZXIgZWxlbWVudCBpdHNlbGZcbiAgdmFyIHRyYW5zZm9ybVByb3AgPSBnZXRTdXBwb3J0ZWRQcm9wZXJ0eU5hbWUoJ3RyYW5zZm9ybScpO1xuICB2YXIgcG9wcGVyU3R5bGVzID0gZGF0YS5pbnN0YW5jZS5wb3BwZXIuc3R5bGU7IC8vIGFzc2lnbm1lbnQgdG8gaGVscCBtaW5pZmljYXRpb25cbiAgdmFyIHRvcCA9IHBvcHBlclN0eWxlcy50b3AsXG4gICAgICBsZWZ0ID0gcG9wcGVyU3R5bGVzLmxlZnQsXG4gICAgICB0cmFuc2Zvcm0gPSBwb3BwZXJTdHlsZXNbdHJhbnNmb3JtUHJvcF07XG5cbiAgcG9wcGVyU3R5bGVzLnRvcCA9ICcnO1xuICBwb3BwZXJTdHlsZXMubGVmdCA9ICcnO1xuICBwb3BwZXJTdHlsZXNbdHJhbnNmb3JtUHJvcF0gPSAnJztcblxuICB2YXIgYm91bmRhcmllcyA9IGdldEJvdW5kYXJpZXMoZGF0YS5pbnN0YW5jZS5wb3BwZXIsIGRhdGEuaW5zdGFuY2UucmVmZXJlbmNlLCBvcHRpb25zLnBhZGRpbmcsIGJvdW5kYXJpZXNFbGVtZW50LCBkYXRhLnBvc2l0aW9uRml4ZWQpO1xuXG4gIC8vIE5PVEU6IERPTSBhY2Nlc3MgaGVyZVxuICAvLyByZXN0b3JlcyB0aGUgb3JpZ2luYWwgc3R5bGUgcHJvcGVydGllcyBhZnRlciB0aGUgb2Zmc2V0cyBoYXZlIGJlZW4gY29tcHV0ZWRcbiAgcG9wcGVyU3R5bGVzLnRvcCA9IHRvcDtcbiAgcG9wcGVyU3R5bGVzLmxlZnQgPSBsZWZ0O1xuICBwb3BwZXJTdHlsZXNbdHJhbnNmb3JtUHJvcF0gPSB0cmFuc2Zvcm07XG5cbiAgb3B0aW9ucy5ib3VuZGFyaWVzID0gYm91bmRhcmllcztcblxuICB2YXIgb3JkZXIgPSBvcHRpb25zLnByaW9yaXR5O1xuICB2YXIgcG9wcGVyID0gZGF0YS5vZmZzZXRzLnBvcHBlcjtcblxuICB2YXIgY2hlY2sgPSB7XG4gICAgcHJpbWFyeTogZnVuY3Rpb24gcHJpbWFyeShwbGFjZW1lbnQpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHBvcHBlcltwbGFjZW1lbnRdO1xuICAgICAgaWYgKHBvcHBlcltwbGFjZW1lbnRdIDwgYm91bmRhcmllc1twbGFjZW1lbnRdICYmICFvcHRpb25zLmVzY2FwZVdpdGhSZWZlcmVuY2UpIHtcbiAgICAgICAgdmFsdWUgPSBNYXRoLm1heChwb3BwZXJbcGxhY2VtZW50XSwgYm91bmRhcmllc1twbGFjZW1lbnRdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eSh7fSwgcGxhY2VtZW50LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZWNvbmRhcnk6IGZ1bmN0aW9uIHNlY29uZGFyeShwbGFjZW1lbnQpIHtcbiAgICAgIHZhciBtYWluU2lkZSA9IHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyA/ICdsZWZ0JyA6ICd0b3AnO1xuICAgICAgdmFyIHZhbHVlID0gcG9wcGVyW21haW5TaWRlXTtcbiAgICAgIGlmIChwb3BwZXJbcGxhY2VtZW50XSA+IGJvdW5kYXJpZXNbcGxhY2VtZW50XSAmJiAhb3B0aW9ucy5lc2NhcGVXaXRoUmVmZXJlbmNlKSB7XG4gICAgICAgIHZhbHVlID0gTWF0aC5taW4ocG9wcGVyW21haW5TaWRlXSwgYm91bmRhcmllc1twbGFjZW1lbnRdIC0gKHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyA/IHBvcHBlci53aWR0aCA6IHBvcHBlci5oZWlnaHQpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eSh7fSwgbWFpblNpZGUsIHZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgb3JkZXIuZm9yRWFjaChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgdmFyIHNpZGUgPSBbJ2xlZnQnLCAndG9wJ10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMSA/ICdwcmltYXJ5JyA6ICdzZWNvbmRhcnknO1xuICAgIHBvcHBlciA9IF9leHRlbmRzKHt9LCBwb3BwZXIsIGNoZWNrW3NpZGVdKHBsYWNlbWVudCkpO1xuICB9KTtcblxuICBkYXRhLm9mZnNldHMucG9wcGVyID0gcG9wcGVyO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBzaGlmdChkYXRhKSB7XG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgdmFyIHNoaWZ0dmFyaWF0aW9uID0gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG5cbiAgLy8gaWYgc2hpZnQgc2hpZnR2YXJpYXRpb24gaXMgc3BlY2lmaWVkLCBydW4gdGhlIG1vZGlmaWVyXG4gIGlmIChzaGlmdHZhcmlhdGlvbikge1xuICAgIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZSxcbiAgICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXI7XG5cbiAgICB2YXIgaXNWZXJ0aWNhbCA9IFsnYm90dG9tJywgJ3RvcCddLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xO1xuICAgIHZhciBzaWRlID0gaXNWZXJ0aWNhbCA/ICdsZWZ0JyA6ICd0b3AnO1xuICAgIHZhciBtZWFzdXJlbWVudCA9IGlzVmVydGljYWwgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG5cbiAgICB2YXIgc2hpZnRPZmZzZXRzID0ge1xuICAgICAgc3RhcnQ6IGRlZmluZVByb3BlcnR5KHt9LCBzaWRlLCByZWZlcmVuY2Vbc2lkZV0pLFxuICAgICAgZW5kOiBkZWZpbmVQcm9wZXJ0eSh7fSwgc2lkZSwgcmVmZXJlbmNlW3NpZGVdICsgcmVmZXJlbmNlW21lYXN1cmVtZW50XSAtIHBvcHBlclttZWFzdXJlbWVudF0pXG4gICAgfTtcblxuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBfZXh0ZW5kcyh7fSwgcG9wcGVyLCBzaGlmdE9mZnNldHNbc2hpZnR2YXJpYXRpb25dKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gaGlkZShkYXRhKSB7XG4gIGlmICghaXNNb2RpZmllclJlcXVpcmVkKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCAnaGlkZScsICdwcmV2ZW50T3ZlcmZsb3cnKSkge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgdmFyIHJlZlJlY3QgPSBkYXRhLm9mZnNldHMucmVmZXJlbmNlO1xuICB2YXIgYm91bmQgPSBmaW5kKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCBmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICByZXR1cm4gbW9kaWZpZXIubmFtZSA9PT0gJ3ByZXZlbnRPdmVyZmxvdyc7XG4gIH0pLmJvdW5kYXJpZXM7XG5cbiAgaWYgKHJlZlJlY3QuYm90dG9tIDwgYm91bmQudG9wIHx8IHJlZlJlY3QubGVmdCA+IGJvdW5kLnJpZ2h0IHx8IHJlZlJlY3QudG9wID4gYm91bmQuYm90dG9tIHx8IHJlZlJlY3QucmlnaHQgPCBib3VuZC5sZWZ0KSB7XG4gICAgLy8gQXZvaWQgdW5uZWNlc3NhcnkgRE9NIGFjY2VzcyBpZiB2aXNpYmlsaXR5IGhhc24ndCBjaGFuZ2VkXG4gICAgaWYgKGRhdGEuaGlkZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgZGF0YS5oaWRlID0gdHJ1ZTtcbiAgICBkYXRhLmF0dHJpYnV0ZXNbJ3gtb3V0LW9mLWJvdW5kYXJpZXMnXSA9ICcnO1xuICB9IGVsc2Uge1xuICAgIC8vIEF2b2lkIHVubmVjZXNzYXJ5IERPTSBhY2Nlc3MgaWYgdmlzaWJpbGl0eSBoYXNuJ3QgY2hhbmdlZFxuICAgIGlmIChkYXRhLmhpZGUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBkYXRhLmhpZGUgPSBmYWxzZTtcbiAgICBkYXRhLmF0dHJpYnV0ZXNbJ3gtb3V0LW9mLWJvdW5kYXJpZXMnXSA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGlubmVyKGRhdGEpIHtcbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyLFxuICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2U7XG5cbiAgdmFyIGlzSG9yaXogPSBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcblxuICB2YXIgc3VidHJhY3RMZW5ndGggPSBbJ3RvcCcsICdsZWZ0J10uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA9PT0gLTE7XG5cbiAgcG9wcGVyW2lzSG9yaXogPyAnbGVmdCcgOiAndG9wJ10gPSByZWZlcmVuY2VbYmFzZVBsYWNlbWVudF0gLSAoc3VidHJhY3RMZW5ndGggPyBwb3BwZXJbaXNIb3JpeiA/ICd3aWR0aCcgOiAnaGVpZ2h0J10gOiAwKTtcblxuICBkYXRhLnBsYWNlbWVudCA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBnZXRDbGllbnRSZWN0KHBvcHBlcik7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogTW9kaWZpZXIgZnVuY3Rpb24sIGVhY2ggbW9kaWZpZXIgY2FuIGhhdmUgYSBmdW5jdGlvbiBvZiB0aGlzIHR5cGUgYXNzaWduZWRcbiAqIHRvIGl0cyBgZm5gIHByb3BlcnR5LjxiciAvPlxuICogVGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggdXBkYXRlLCB0aGlzIG1lYW5zIHRoYXQgeW91IG11c3RcbiAqIG1ha2Ugc3VyZSB0aGV5IGFyZSBwZXJmb3JtYW50IGVub3VnaCB0byBhdm9pZCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcy5cbiAqXG4gKiBAZnVuY3Rpb24gTW9kaWZpZXJGblxuICogQGFyZ3VtZW50IHtkYXRhT2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtkYXRhT2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cblxuLyoqXG4gKiBNb2RpZmllcnMgYXJlIHBsdWdpbnMgdXNlZCB0byBhbHRlciB0aGUgYmVoYXZpb3Igb2YgeW91ciBwb3BwZXJzLjxiciAvPlxuICogUG9wcGVyLmpzIHVzZXMgYSBzZXQgb2YgOSBtb2RpZmllcnMgdG8gcHJvdmlkZSBhbGwgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdGllc1xuICogbmVlZGVkIGJ5IHRoZSBsaWJyYXJ5LlxuICpcbiAqIFVzdWFsbHkgeW91IGRvbid0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGBvcmRlcmAsIGBmbmAgYW5kIGBvbkxvYWRgIHByb3BzLlxuICogQWxsIHRoZSBvdGhlciBwcm9wZXJ0aWVzIGFyZSBjb25maWd1cmF0aW9ucyB0aGF0IGNvdWxkIGJlIHR3ZWFrZWQuXG4gKiBAbmFtZXNwYWNlIG1vZGlmaWVyc1xuICovXG52YXIgbW9kaWZpZXJzID0ge1xuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBzaGlmdCB0aGUgcG9wcGVyIG9uIHRoZSBzdGFydCBvciBlbmQgb2YgaXRzIHJlZmVyZW5jZVxuICAgKiBlbGVtZW50LjxiciAvPlxuICAgKiBJdCB3aWxsIHJlYWQgdGhlIHZhcmlhdGlvbiBvZiB0aGUgYHBsYWNlbWVudGAgcHJvcGVydHkuPGJyIC8+XG4gICAqIEl0IGNhbiBiZSBvbmUgZWl0aGVyIGAtZW5kYCBvciBgLXN0YXJ0YC5cbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIHNoaWZ0OiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTEwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogMTAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogc2hpZnRcbiAgfSxcblxuICAvKipcbiAgICogVGhlIGBvZmZzZXRgIG1vZGlmaWVyIGNhbiBzaGlmdCB5b3VyIHBvcHBlciBvbiBib3RoIGl0cyBheGlzLlxuICAgKlxuICAgKiBJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgdW5pdHM6XG4gICAqIC0gYHB4YCBvciB1bml0bGVzcywgaW50ZXJwcmV0ZWQgYXMgcGl4ZWxzXG4gICAqIC0gYCVgIG9yIGAlcmAsIHBlcmNlbnRhZ2UgcmVsYXRpdmUgdG8gdGhlIGxlbmd0aCBvZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnRcbiAgICogLSBgJXBgLCBwZXJjZW50YWdlIHJlbGF0aXZlIHRvIHRoZSBsZW5ndGggb2YgdGhlIHBvcHBlciBlbGVtZW50XG4gICAqIC0gYHZ3YCwgQ1NTIHZpZXdwb3J0IHdpZHRoIHVuaXRcbiAgICogLSBgdmhgLCBDU1Mgdmlld3BvcnQgaGVpZ2h0IHVuaXRcbiAgICpcbiAgICogRm9yIGxlbmd0aCBpcyBpbnRlbmRlZCB0aGUgbWFpbiBheGlzIHJlbGF0aXZlIHRvIHRoZSBwbGFjZW1lbnQgb2YgdGhlIHBvcHBlci48YnIgLz5cbiAgICogVGhpcyBtZWFucyB0aGF0IGlmIHRoZSBwbGFjZW1lbnQgaXMgYHRvcGAgb3IgYGJvdHRvbWAsIHRoZSBsZW5ndGggd2lsbCBiZSB0aGVcbiAgICogYHdpZHRoYC4gSW4gY2FzZSBvZiBgbGVmdGAgb3IgYHJpZ2h0YCwgaXQgd2lsbCBiZSB0aGUgaGVpZ2h0LlxuICAgKlxuICAgKiBZb3UgY2FuIHByb3ZpZGUgYSBzaW5nbGUgdmFsdWUgKGFzIGBOdW1iZXJgIG9yIGBTdHJpbmdgKSwgb3IgYSBwYWlyIG9mIHZhbHVlc1xuICAgKiBhcyBgU3RyaW5nYCBkaXZpZGVkIGJ5IGEgY29tbWEgb3Igb25lIChvciBtb3JlKSB3aGl0ZSBzcGFjZXMuPGJyIC8+XG4gICAqIFRoZSBsYXR0ZXIgaXMgYSBkZXByZWNhdGVkIG1ldGhvZCBiZWNhdXNlIGl0IGxlYWRzIHRvIGNvbmZ1c2lvbiBhbmQgd2lsbCBiZVxuICAgKiByZW1vdmVkIGluIHYyLjxiciAvPlxuICAgKiBBZGRpdGlvbmFsbHksIGl0IGFjY2VwdHMgYWRkaXRpb25zIGFuZCBzdWJ0cmFjdGlvbnMgYmV0d2VlbiBkaWZmZXJlbnQgdW5pdHMuXG4gICAqIE5vdGUgdGhhdCBtdWx0aXBsaWNhdGlvbnMgYW5kIGRpdmlzaW9ucyBhcmVuJ3Qgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBWYWxpZCBleGFtcGxlcyBhcmU6XG4gICAqIGBgYFxuICAgKiAxMFxuICAgKiAnMTAlJ1xuICAgKiAnMTAsIDEwJ1xuICAgKiAnMTAlLCAxMCdcbiAgICogJzEwICsgMTAlJ1xuICAgKiAnMTAgLSA1dmggKyAzJSdcbiAgICogJy0xMHB4ICsgNXZoLCA1cHggLSA2JSdcbiAgICogYGBgXG4gICAqID4gKipOQioqOiBJZiB5b3UgZGVzaXJlIHRvIGFwcGx5IG9mZnNldHMgdG8geW91ciBwb3BwZXJzIGluIGEgd2F5IHRoYXQgbWF5IG1ha2UgdGhlbSBvdmVybGFwXG4gICAqID4gd2l0aCB0aGVpciByZWZlcmVuY2UgZWxlbWVudCwgdW5mb3J0dW5hdGVseSwgeW91IHdpbGwgaGF2ZSB0byBkaXNhYmxlIHRoZSBgZmxpcGAgbW9kaWZpZXIuXG4gICAqID4gTW9yZSBvbiB0aGlzIFtyZWFkaW5nIHRoaXMgaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9GZXpWcmFzdGEvcG9wcGVyLmpzL2lzc3Vlcy8zNzMpXG4gICAqXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBvZmZzZXQ6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9MjAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiAyMDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBvZmZzZXQsXG4gICAgLyoqIEBwcm9wIHtOdW1iZXJ8U3RyaW5nfSBvZmZzZXQ9MFxuICAgICAqIFRoZSBvZmZzZXQgdmFsdWUgYXMgZGVzY3JpYmVkIGluIHRoZSBtb2RpZmllciBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIG9mZnNldDogMFxuICB9LFxuXG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIHByZXZlbnQgdGhlIHBvcHBlciBmcm9tIGJlaW5nIHBvc2l0aW9uZWQgb3V0c2lkZSB0aGUgYm91bmRhcnkuXG4gICAqXG4gICAqIEFuIHNjZW5hcmlvIGV4aXN0cyB3aGVyZSB0aGUgcmVmZXJlbmNlIGl0c2VsZiBpcyBub3Qgd2l0aGluIHRoZSBib3VuZGFyaWVzLjxiciAvPlxuICAgKiBXZSBjYW4gc2F5IGl0IGhhcyBcImVzY2FwZWQgdGhlIGJvdW5kYXJpZXNcIiDigJQgb3IganVzdCBcImVzY2FwZWRcIi48YnIgLz5cbiAgICogSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHBvcHBlciBzaG91bGQgZWl0aGVyOlxuICAgKlxuICAgKiAtIGRldGFjaCBmcm9tIHRoZSByZWZlcmVuY2UgYW5kIHJlbWFpbiBcInRyYXBwZWRcIiBpbiB0aGUgYm91bmRhcmllcywgb3JcbiAgICogLSBpZiBpdCBzaG91bGQgaWdub3JlIHRoZSBib3VuZGFyeSBhbmQgXCJlc2NhcGUgd2l0aCBpdHMgcmVmZXJlbmNlXCJcbiAgICpcbiAgICogV2hlbiBgZXNjYXBlV2l0aFJlZmVyZW5jZWAgaXMgc2V0IHRvYHRydWVgIGFuZCByZWZlcmVuY2UgaXMgY29tcGxldGVseVxuICAgKiBvdXRzaWRlIGl0cyBib3VuZGFyaWVzLCB0aGUgcG9wcGVyIHdpbGwgb3ZlcmZsb3cgKG9yIGNvbXBsZXRlbHkgbGVhdmUpXG4gICAqIHRoZSBib3VuZGFyaWVzIGluIG9yZGVyIHRvIHJlbWFpbiBhdHRhY2hlZCB0byB0aGUgZWRnZSBvZiB0aGUgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgcHJldmVudE92ZXJmbG93OiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTMwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogMzAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogcHJldmVudE92ZXJmbG93LFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtBcnJheX0gW3ByaW9yaXR5PVsnbGVmdCcsJ3JpZ2h0JywndG9wJywnYm90dG9tJ11dXG4gICAgICogUG9wcGVyIHdpbGwgdHJ5IHRvIHByZXZlbnQgb3ZlcmZsb3cgZm9sbG93aW5nIHRoZXNlIHByaW9yaXRpZXMgYnkgZGVmYXVsdCxcbiAgICAgKiB0aGVuLCBpdCBjb3VsZCBvdmVyZmxvdyBvbiB0aGUgbGVmdCBhbmQgb24gdG9wIG9mIHRoZSBgYm91bmRhcmllc0VsZW1lbnRgXG4gICAgICovXG4gICAgcHJpb3JpdHk6IFsnbGVmdCcsICdyaWdodCcsICd0b3AnLCAnYm90dG9tJ10sXG4gICAgLyoqXG4gICAgICogQHByb3Age251bWJlcn0gcGFkZGluZz01XG4gICAgICogQW1vdW50IG9mIHBpeGVsIHVzZWQgdG8gZGVmaW5lIGEgbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3VuZGFyaWVzXG4gICAgICogYW5kIHRoZSBwb3BwZXIgdGhpcyBtYWtlcyBzdXJlIHRoZSBwb3BwZXIgaGFzIGFsd2F5cyBhIGxpdHRsZSBwYWRkaW5nXG4gICAgICogYmV0d2VlbiB0aGUgZWRnZXMgb2YgaXRzIGNvbnRhaW5lclxuICAgICAqL1xuICAgIHBhZGRpbmc6IDUsXG4gICAgLyoqXG4gICAgICogQHByb3Age1N0cmluZ3xIVE1MRWxlbWVudH0gYm91bmRhcmllc0VsZW1lbnQ9J3Njcm9sbFBhcmVudCdcbiAgICAgKiBCb3VuZGFyaWVzIHVzZWQgYnkgdGhlIG1vZGlmaWVyLCBjYW4gYmUgYHNjcm9sbFBhcmVudGAsIGB3aW5kb3dgLFxuICAgICAqIGB2aWV3cG9ydGAgb3IgYW55IERPTSBlbGVtZW50LlxuICAgICAqL1xuICAgIGJvdW5kYXJpZXNFbGVtZW50OiAnc2Nyb2xsUGFyZW50J1xuICB9LFxuXG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIG1ha2Ugc3VyZSB0aGUgcmVmZXJlbmNlIGFuZCBpdHMgcG9wcGVyIHN0YXkgbmVhciBlYWNob3RoZXJzXG4gICAqIHdpdGhvdXQgbGVhdmluZyBhbnkgZ2FwIGJldHdlZW4gdGhlIHR3by4gRXhwZWNpYWxseSB1c2VmdWwgd2hlbiB0aGUgYXJyb3cgaXNcbiAgICogZW5hYmxlZCBhbmQgeW91IHdhbnQgdG8gYXNzdXJlIGl0IHRvIHBvaW50IHRvIGl0cyByZWZlcmVuY2UgZWxlbWVudC5cbiAgICogSXQgY2FyZXMgb25seSBhYm91dCB0aGUgZmlyc3QgYXhpcywgeW91IGNhbiBzdGlsbCBoYXZlIHBvcHBlcnMgd2l0aCBtYXJnaW5cbiAgICogYmV0d2VlbiB0aGUgcG9wcGVyIGFuZCBpdHMgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBrZWVwVG9nZXRoZXI6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9NDAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA0MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBrZWVwVG9nZXRoZXJcbiAgfSxcblxuICAvKipcbiAgICogVGhpcyBtb2RpZmllciBpcyB1c2VkIHRvIG1vdmUgdGhlIGBhcnJvd0VsZW1lbnRgIG9mIHRoZSBwb3BwZXIgdG8gbWFrZVxuICAgKiBzdXJlIGl0IGlzIHBvc2l0aW9uZWQgYmV0d2VlbiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgYW5kIGl0cyBwb3BwZXIgZWxlbWVudC5cbiAgICogSXQgd2lsbCByZWFkIHRoZSBvdXRlciBzaXplIG9mIHRoZSBgYXJyb3dFbGVtZW50YCBub2RlIHRvIGRldGVjdCBob3cgbWFueVxuICAgKiBwaXhlbHMgb2YgY29uanVjdGlvbiBhcmUgbmVlZGVkLlxuICAgKlxuICAgKiBJdCBoYXMgbm8gZWZmZWN0IGlmIG5vIGBhcnJvd0VsZW1lbnRgIGlzIHByb3ZpZGVkLlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgYXJyb3c6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9NTAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA1MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBhcnJvdyxcbiAgICAvKiogQHByb3Age1N0cmluZ3xIVE1MRWxlbWVudH0gZWxlbWVudD0nW3gtYXJyb3ddJyAtIFNlbGVjdG9yIG9yIG5vZGUgdXNlZCBhcyBhcnJvdyAqL1xuICAgIGVsZW1lbnQ6ICdbeC1hcnJvd10nXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gZmxpcCB0aGUgcG9wcGVyJ3MgcGxhY2VtZW50IHdoZW4gaXQgc3RhcnRzIHRvIG92ZXJsYXAgaXRzXG4gICAqIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKlxuICAgKiBSZXF1aXJlcyB0aGUgYHByZXZlbnRPdmVyZmxvd2AgbW9kaWZpZXIgYmVmb3JlIGl0IGluIG9yZGVyIHRvIHdvcmsuXG4gICAqXG4gICAqICoqTk9URToqKiB0aGlzIG1vZGlmaWVyIHdpbGwgaW50ZXJydXB0IHRoZSBjdXJyZW50IHVwZGF0ZSBjeWNsZSBhbmQgd2lsbFxuICAgKiByZXN0YXJ0IGl0IGlmIGl0IGRldGVjdHMgdGhlIG5lZWQgdG8gZmxpcCB0aGUgcGxhY2VtZW50LlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgZmxpcDoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj02MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDYwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGZsaXAsXG4gICAgLyoqXG4gICAgICogQHByb3Age1N0cmluZ3xBcnJheX0gYmVoYXZpb3I9J2ZsaXAnXG4gICAgICogVGhlIGJlaGF2aW9yIHVzZWQgdG8gY2hhbmdlIHRoZSBwb3BwZXIncyBwbGFjZW1lbnQuIEl0IGNhbiBiZSBvbmUgb2ZcbiAgICAgKiBgZmxpcGAsIGBjbG9ja3dpc2VgLCBgY291bnRlcmNsb2Nrd2lzZWAgb3IgYW4gYXJyYXkgd2l0aCBhIGxpc3Qgb2YgdmFsaWRcbiAgICAgKiBwbGFjZW1lbnRzICh3aXRoIG9wdGlvbmFsIHZhcmlhdGlvbnMpLlxuICAgICAqL1xuICAgIGJlaGF2aW9yOiAnZmxpcCcsXG4gICAgLyoqXG4gICAgICogQHByb3Age251bWJlcn0gcGFkZGluZz01XG4gICAgICogVGhlIHBvcHBlciB3aWxsIGZsaXAgaWYgaXQgaGl0cyB0aGUgZWRnZXMgb2YgdGhlIGBib3VuZGFyaWVzRWxlbWVudGBcbiAgICAgKi9cbiAgICBwYWRkaW5nOiA1LFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtTdHJpbmd8SFRNTEVsZW1lbnR9IGJvdW5kYXJpZXNFbGVtZW50PSd2aWV3cG9ydCdcbiAgICAgKiBUaGUgZWxlbWVudCB3aGljaCB3aWxsIGRlZmluZSB0aGUgYm91bmRhcmllcyBvZiB0aGUgcG9wcGVyIHBvc2l0aW9uLFxuICAgICAqIHRoZSBwb3BwZXIgd2lsbCBuZXZlciBiZSBwbGFjZWQgb3V0c2lkZSBvZiB0aGUgZGVmaW5lZCBib3VuZGFyaWVzXG4gICAgICogKGV4Y2VwdCBpZiBrZWVwVG9nZXRoZXIgaXMgZW5hYmxlZClcbiAgICAgKi9cbiAgICBib3VuZGFyaWVzRWxlbWVudDogJ3ZpZXdwb3J0J1xuICB9LFxuXG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIG1ha2UgdGhlIHBvcHBlciBmbG93IHRvd2FyZCB0aGUgaW5uZXIgb2YgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKiBCeSBkZWZhdWx0LCB3aGVuIHRoaXMgbW9kaWZpZXIgaXMgZGlzYWJsZWQsIHRoZSBwb3BwZXIgd2lsbCBiZSBwbGFjZWQgb3V0c2lkZVxuICAgKiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBpbm5lcjoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj03MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDcwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9ZmFsc2UgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogaW5uZXJcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBoaWRlIHRoZSBwb3BwZXIgd2hlbiBpdHMgcmVmZXJlbmNlIGVsZW1lbnQgaXMgb3V0c2lkZSBvZiB0aGVcbiAgICogcG9wcGVyIGJvdW5kYXJpZXMuIEl0IHdpbGwgc2V0IGEgYHgtb3V0LW9mLWJvdW5kYXJpZXNgIGF0dHJpYnV0ZSB3aGljaCBjYW5cbiAgICogYmUgdXNlZCB0byBoaWRlIHdpdGggYSBDU1Mgc2VsZWN0b3IgdGhlIHBvcHBlciB3aGVuIGl0cyByZWZlcmVuY2UgaXNcbiAgICogb3V0IG9mIGJvdW5kYXJpZXMuXG4gICAqXG4gICAqIFJlcXVpcmVzIHRoZSBgcHJldmVudE92ZXJmbG93YCBtb2RpZmllciBiZWZvcmUgaXQgaW4gb3JkZXIgdG8gd29yay5cbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGhpZGU6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9ODAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA4MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBoaWRlXG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBzdHlsZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyIGVsZW1lbnQgdG8gZ2V0c1xuICAgKiBwcm9wZXJseSBwb3NpdGlvbmVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBtb2RpZmllciB3aWxsIG5vdCB0b3VjaCB0aGUgRE9NLCBpdCBqdXN0IHByZXBhcmVzIHRoZSBzdHlsZXNcbiAgICogc28gdGhhdCBgYXBwbHlTdHlsZWAgbW9kaWZpZXIgY2FuIGFwcGx5IGl0LiBUaGlzIHNlcGFyYXRpb24gaXMgdXNlZnVsXG4gICAqIGluIGNhc2UgeW91IG5lZWQgdG8gcmVwbGFjZSBgYXBwbHlTdHlsZWAgd2l0aCBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogVGhpcyBtb2RpZmllciBoYXMgYDg1MGAgYXMgYG9yZGVyYCB2YWx1ZSB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAqIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YgUG9wcGVyLmpzLiBFeHBlY3QgdGhlIG1vZGlmaWVycyBvcmRlcmluZyBtZXRob2RcbiAgICogdG8gY2hhbmdlIGluIGZ1dHVyZSBtYWpvciB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS5cbiAgICpcbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGNvbXB1dGVTdHlsZToge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj04NTAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDg1MCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGNvbXB1dGVTdHlsZSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7Qm9vbGVhbn0gZ3B1QWNjZWxlcmF0aW9uPXRydWVcbiAgICAgKiBJZiB0cnVlLCBpdCB1c2VzIHRoZSBDU1MgM2QgdHJhbnNmb3JtYXRpb24gdG8gcG9zaXRpb24gdGhlIHBvcHBlci5cbiAgICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgdXNlIHRoZSBgdG9wYCBhbmQgYGxlZnRgIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiB0cnVlLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtzdHJpbmd9IFt4PSdib3R0b20nXVxuICAgICAqIFdoZXJlIHRvIGFuY2hvciB0aGUgWCBheGlzIChgYm90dG9tYCBvciBgdG9wYCkuIEFLQSBYIG9mZnNldCBvcmlnaW4uXG4gICAgICogQ2hhbmdlIHRoaXMgaWYgeW91ciBwb3BwZXIgc2hvdWxkIGdyb3cgaW4gYSBkaXJlY3Rpb24gZGlmZmVyZW50IGZyb20gYGJvdHRvbWBcbiAgICAgKi9cbiAgICB4OiAnYm90dG9tJyxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7c3RyaW5nfSBbeD0nbGVmdCddXG4gICAgICogV2hlcmUgdG8gYW5jaG9yIHRoZSBZIGF4aXMgKGBsZWZ0YCBvciBgcmlnaHRgKS4gQUtBIFkgb2Zmc2V0IG9yaWdpbi5cbiAgICAgKiBDaGFuZ2UgdGhpcyBpZiB5b3VyIHBvcHBlciBzaG91bGQgZ3JvdyBpbiBhIGRpcmVjdGlvbiBkaWZmZXJlbnQgZnJvbSBgcmlnaHRgXG4gICAgICovXG4gICAgeTogJ3JpZ2h0J1xuICB9LFxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBjb21wdXRlZCBzdHlsZXMgdG8gdGhlIHBvcHBlciBlbGVtZW50LlxuICAgKlxuICAgKiBBbGwgdGhlIERPTSBtYW5pcHVsYXRpb25zIGFyZSBsaW1pdGVkIHRvIHRoaXMgbW9kaWZpZXIuIFRoaXMgaXMgdXNlZnVsIGluIGNhc2VcbiAgICogeW91IHdhbnQgdG8gaW50ZWdyYXRlIFBvcHBlci5qcyBpbnNpZGUgYSBmcmFtZXdvcmsgb3IgdmlldyBsaWJyYXJ5IGFuZCB5b3VcbiAgICogd2FudCB0byBkZWxlZ2F0ZSBhbGwgdGhlIERPTSBtYW5pcHVsYXRpb25zIHRvIGl0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgaWYgeW91IGRpc2FibGUgdGhpcyBtb2RpZmllciwgeW91IG11c3QgbWFrZSBzdXJlIHRoZSBwb3BwZXIgZWxlbWVudFxuICAgKiBoYXMgaXRzIHBvc2l0aW9uIHNldCB0byBgYWJzb2x1dGVgIGJlZm9yZSBQb3BwZXIuanMgY2FuIGRvIGl0cyB3b3JrIVxuICAgKlxuICAgKiBKdXN0IGRpc2FibGUgdGhpcyBtb2RpZmllciBhbmQgZGVmaW5lIHlvdSBvd24gdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCBlZmZlY3QuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBhcHBseVN0eWxlOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTkwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogOTAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogYXBwbHlTdHlsZSxcbiAgICAvKiogQHByb3Age0Z1bmN0aW9ufSAqL1xuICAgIG9uTG9hZDogYXBwbHlTdHlsZU9uTG9hZCxcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDEuMTAuMCwgdGhlIHByb3BlcnR5IG1vdmVkIHRvIGBjb21wdXRlU3R5bGVgIG1vZGlmaWVyXG4gICAgICogQHByb3Age0Jvb2xlYW59IGdwdUFjY2VsZXJhdGlvbj10cnVlXG4gICAgICogSWYgdHJ1ZSwgaXQgdXNlcyB0aGUgQ1NTIDNkIHRyYW5zZm9ybWF0aW9uIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXIuXG4gICAgICogT3RoZXJ3aXNlLCBpdCB3aWxsIHVzZSB0aGUgYHRvcGAgYW5kIGBsZWZ0YCBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIGdwdUFjY2VsZXJhdGlvbjogdW5kZWZpbmVkXG4gIH1cbn07XG5cbi8qKlxuICogVGhlIGBkYXRhT2JqZWN0YCBpcyBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIGluZm9ybWF0aW9ucyB1c2VkIGJ5IFBvcHBlci5qc1xuICogdGhpcyBvYmplY3QgZ2V0IHBhc3NlZCB0byBtb2RpZmllcnMgYW5kIHRvIHRoZSBgb25DcmVhdGVgIGFuZCBgb25VcGRhdGVgIGNhbGxiYWNrcy5cbiAqIEBuYW1lIGRhdGFPYmplY3RcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLmluc3RhbmNlIFRoZSBQb3BwZXIuanMgaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBkYXRhLnBsYWNlbWVudCBQbGFjZW1lbnQgYXBwbGllZCB0byBwb3BwZXJcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBkYXRhLm9yaWdpbmFsUGxhY2VtZW50IFBsYWNlbWVudCBvcmlnaW5hbGx5IGRlZmluZWQgb24gaW5pdFxuICogQHByb3BlcnR5IHtCb29sZWFufSBkYXRhLmZsaXBwZWQgVHJ1ZSBpZiBwb3BwZXIgaGFzIGJlZW4gZmxpcHBlZCBieSBmbGlwIG1vZGlmaWVyXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGRhdGEuaGlkZSBUcnVlIGlmIHRoZSByZWZlcmVuY2UgZWxlbWVudCBpcyBvdXQgb2YgYm91bmRhcmllcywgdXNlZnVsIHRvIGtub3cgd2hlbiB0byBoaWRlIHRoZSBwb3BwZXIuXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBkYXRhLmFycm93RWxlbWVudCBOb2RlIHVzZWQgYXMgYXJyb3cgYnkgYXJyb3cgbW9kaWZpZXJcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLnN0eWxlcyBBbnkgQ1NTIHByb3BlcnR5IGRlZmluZWQgaGVyZSB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlciwgaXQgZXhwZWN0cyB0aGUgSmF2YVNjcmlwdCBub21lbmNsYXR1cmUgKGVnLiBgbWFyZ2luQm90dG9tYClcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLmFycm93U3R5bGVzIEFueSBDU1MgcHJvcGVydHkgZGVmaW5lZCBoZXJlIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyIGFycm93LCBpdCBleHBlY3RzIHRoZSBKYXZhU2NyaXB0IG5vbWVuY2xhdHVyZSAoZWcuIGBtYXJnaW5Cb3R0b21gKVxuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEuYm91bmRhcmllcyBPZmZzZXRzIG9mIHRoZSBwb3BwZXIgYm91bmRhcmllc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cyBUaGUgbWVhc3VyZW1lbnRzIG9mIHBvcHBlciwgcmVmZXJlbmNlIGFuZCBhcnJvdyBlbGVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLm9mZnNldHMucG9wcGVyIGB0b3BgLCBgbGVmdGAsIGB3aWR0aGAsIGBoZWlnaHRgIHZhbHVlc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UgYHRvcGAsIGBsZWZ0YCwgYHdpZHRoYCwgYGhlaWdodGAgdmFsdWVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5vZmZzZXRzLmFycm93XSBgdG9wYCBhbmQgYGxlZnRgIG9mZnNldHMsIG9ubHkgb25lIG9mIHRoZW0gd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSAwXG4gKi9cblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMgcHJvdmlkZWQgdG8gUG9wcGVyLmpzIGNvbnN0cnVjdG9yLjxiciAvPlxuICogVGhlc2UgY2FuIGJlIG92ZXJyaWRlbiB1c2luZyB0aGUgYG9wdGlvbnNgIGFyZ3VtZW50IG9mIFBvcHBlci5qcy48YnIgLz5cbiAqIFRvIG92ZXJyaWRlIGFuIG9wdGlvbiwgc2ltcGx5IHBhc3MgYXMgM3JkIGFyZ3VtZW50IGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lXG4gKiBzdHJ1Y3R1cmUgb2YgdGhpcyBvYmplY3QsIGV4YW1wbGU6XG4gKiBgYGBcbiAqIG5ldyBQb3BwZXIocmVmLCBwb3AsIHtcbiAqICAgbW9kaWZpZXJzOiB7XG4gKiAgICAgcHJldmVudE92ZXJmbG93OiB7IGVuYWJsZWQ6IGZhbHNlIH1cbiAqICAgfVxuICogfSlcbiAqIGBgYFxuICogQHR5cGUge09iamVjdH1cbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xudmFyIERlZmF1bHRzID0ge1xuICAvKipcbiAgICogUG9wcGVyJ3MgcGxhY2VtZW50XG4gICAqIEBwcm9wIHtQb3BwZXIucGxhY2VtZW50c30gcGxhY2VtZW50PSdib3R0b20nXG4gICAqL1xuICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuXG4gIC8qKlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIGlmIHlvdSB3YW50IHBvcHBlciB0byBwb3NpdGlvbiBpdCBzZWxmIGluICdmaXhlZCcgbW9kZVxuICAgKiBAcHJvcCB7Qm9vbGVhbn0gcG9zaXRpb25GaXhlZD1mYWxzZVxuICAgKi9cbiAgcG9zaXRpb25GaXhlZDogZmFsc2UsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZXZlbnRzIChyZXNpemUsIHNjcm9sbCkgYXJlIGluaXRpYWxseSBlbmFibGVkXG4gICAqIEBwcm9wIHtCb29sZWFufSBldmVudHNFbmFibGVkPXRydWVcbiAgICovXG4gIGV2ZW50c0VuYWJsZWQ6IHRydWUsXG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgcmVtb3ZlIHRoZSBwb3BwZXIgd2hlblxuICAgKiB5b3UgY2FsbCB0aGUgYGRlc3Ryb3lgIG1ldGhvZC5cbiAgICogQHByb3Age0Jvb2xlYW59IHJlbW92ZU9uRGVzdHJveT1mYWxzZVxuICAgKi9cbiAgcmVtb3ZlT25EZXN0cm95OiBmYWxzZSxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIHBvcHBlciBpcyBjcmVhdGVkLjxiciAvPlxuICAgKiBCeSBkZWZhdWx0LCBpcyBzZXQgdG8gbm8tb3AuPGJyIC8+XG4gICAqIEFjY2VzcyBQb3BwZXIuanMgaW5zdGFuY2Ugd2l0aCBgZGF0YS5pbnN0YW5jZWAuXG4gICAqIEBwcm9wIHtvbkNyZWF0ZX1cbiAgICovXG4gIG9uQ3JlYXRlOiBmdW5jdGlvbiBvbkNyZWF0ZSgpIHt9LFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiB0aGUgcG9wcGVyIGlzIHVwZGF0ZWQsIHRoaXMgY2FsbGJhY2sgaXMgbm90IGNhbGxlZFxuICAgKiBvbiB0aGUgaW5pdGlhbGl6YXRpb24vY3JlYXRpb24gb2YgdGhlIHBvcHBlciwgYnV0IG9ubHkgb24gc3Vic2VxdWVudFxuICAgKiB1cGRhdGVzLjxiciAvPlxuICAgKiBCeSBkZWZhdWx0LCBpcyBzZXQgdG8gbm8tb3AuPGJyIC8+XG4gICAqIEFjY2VzcyBQb3BwZXIuanMgaW5zdGFuY2Ugd2l0aCBgZGF0YS5pbnN0YW5jZWAuXG4gICAqIEBwcm9wIHtvblVwZGF0ZX1cbiAgICovXG4gIG9uVXBkYXRlOiBmdW5jdGlvbiBvblVwZGF0ZSgpIHt9LFxuXG4gIC8qKlxuICAgKiBMaXN0IG9mIG1vZGlmaWVycyB1c2VkIHRvIG1vZGlmeSB0aGUgb2Zmc2V0cyBiZWZvcmUgdGhleSBhcmUgYXBwbGllZCB0byB0aGUgcG9wcGVyLlxuICAgKiBUaGV5IHByb3ZpZGUgbW9zdCBvZiB0aGUgZnVuY3Rpb25hbGl0aWVzIG9mIFBvcHBlci5qc1xuICAgKiBAcHJvcCB7bW9kaWZpZXJzfVxuICAgKi9cbiAgbW9kaWZpZXJzOiBtb2RpZmllcnNcbn07XG5cbi8qKlxuICogQGNhbGxiYWNrIG9uQ3JlYXRlXG4gKiBAcGFyYW0ge2RhdGFPYmplY3R9IGRhdGFcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBvblVwZGF0ZVxuICogQHBhcmFtIHtkYXRhT2JqZWN0fSBkYXRhXG4gKi9cblxuLy8gVXRpbHNcbi8vIE1ldGhvZHNcbnZhciBQb3BwZXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgUG9wcGVyLmpzIGluc3RhbmNlXG4gICAqIEBjbGFzcyBQb3BwZXJcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudHxyZWZlcmVuY2VPYmplY3R9IHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2UgZWxlbWVudCB1c2VkIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXJcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wcGVyIC0gVGhlIEhUTUwgZWxlbWVudCB1c2VkIGFzIHBvcHBlci5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBZb3VyIGN1c3RvbSBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZSBvbmVzIGRlZmluZWQgaW4gW0RlZmF1bHRzXSgjZGVmYXVsdHMpXG4gICAqIEByZXR1cm4ge09iamVjdH0gaW5zdGFuY2UgLSBUaGUgZ2VuZXJhdGVkIFBvcHBlci5qcyBpbnN0YW5jZVxuICAgKi9cbiAgZnVuY3Rpb24gUG9wcGVyKHJlZmVyZW5jZSwgcG9wcGVyKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQb3BwZXIpO1xuXG4gICAgdGhpcy5zY2hlZHVsZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3RoaXMudXBkYXRlKTtcbiAgICB9O1xuXG4gICAgLy8gbWFrZSB1cGRhdGUoKSBkZWJvdW5jZWQsIHNvIHRoYXQgaXQgb25seSBydW5zIGF0IG1vc3Qgb25jZS1wZXItdGlja1xuICAgIHRoaXMudXBkYXRlID0gZGVib3VuY2UodGhpcy51cGRhdGUuYmluZCh0aGlzKSk7XG5cbiAgICAvLyB3aXRoIHt9IHdlIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3B0aW9ucyBpbnNpZGUgaXRcbiAgICB0aGlzLm9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgUG9wcGVyLkRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgIC8vIGluaXQgc3RhdGVcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNEZXN0cm95ZWQ6IGZhbHNlLFxuICAgICAgaXNDcmVhdGVkOiBmYWxzZSxcbiAgICAgIHNjcm9sbFBhcmVudHM6IFtdXG4gICAgfTtcblxuICAgIC8vIGdldCByZWZlcmVuY2UgYW5kIHBvcHBlciBlbGVtZW50cyAoYWxsb3cgalF1ZXJ5IHdyYXBwZXJzKVxuICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlICYmIHJlZmVyZW5jZS5qcXVlcnkgPyByZWZlcmVuY2VbMF0gOiByZWZlcmVuY2U7XG4gICAgdGhpcy5wb3BwZXIgPSBwb3BwZXIgJiYgcG9wcGVyLmpxdWVyeSA/IHBvcHBlclswXSA6IHBvcHBlcjtcblxuICAgIC8vIERlZXAgbWVyZ2UgbW9kaWZpZXJzIG9wdGlvbnNcbiAgICB0aGlzLm9wdGlvbnMubW9kaWZpZXJzID0ge307XG4gICAgT2JqZWN0LmtleXMoX2V4dGVuZHMoe30sIFBvcHBlci5EZWZhdWx0cy5tb2RpZmllcnMsIG9wdGlvbnMubW9kaWZpZXJzKSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgX3RoaXMub3B0aW9ucy5tb2RpZmllcnNbbmFtZV0gPSBfZXh0ZW5kcyh7fSwgUG9wcGVyLkRlZmF1bHRzLm1vZGlmaWVyc1tuYW1lXSB8fCB7fSwgb3B0aW9ucy5tb2RpZmllcnMgPyBvcHRpb25zLm1vZGlmaWVyc1tuYW1lXSA6IHt9KTtcbiAgICB9KTtcblxuICAgIC8vIFJlZmFjdG9yaW5nIG1vZGlmaWVycycgbGlzdCAoT2JqZWN0ID0+IEFycmF5KVxuICAgIHRoaXMubW9kaWZpZXJzID0gT2JqZWN0LmtleXModGhpcy5vcHRpb25zLm1vZGlmaWVycykubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBuYW1lOiBuYW1lXG4gICAgICB9LCBfdGhpcy5vcHRpb25zLm1vZGlmaWVyc1tuYW1lXSk7XG4gICAgfSlcbiAgICAvLyBzb3J0IHRoZSBtb2RpZmllcnMgYnkgb3JkZXJcbiAgICAuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xuICAgIH0pO1xuXG4gICAgLy8gbW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZSB3aGVuIFBvcHBlci5qcyBnZXQgaW5pdGVkXG4gICAgLy8gc3VjaCBjb2RlIGlzIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIG9mIGl0cyBtb2RpZmllclxuICAgIC8vIHRoZXkgY291bGQgYWRkIG5ldyBwcm9wZXJ0aWVzIHRvIHRoZWlyIG9wdGlvbnMgY29uZmlndXJhdGlvblxuICAgIC8vIEJFIEFXQVJFOiBkb24ndCBhZGQgb3B0aW9ucyB0byBgb3B0aW9ucy5tb2RpZmllcnMubmFtZWAgYnV0IHRvIGBtb2RpZmllck9wdGlvbnNgIVxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyT3B0aW9ucykge1xuICAgICAgaWYgKG1vZGlmaWVyT3B0aW9ucy5lbmFibGVkICYmIGlzRnVuY3Rpb24obW9kaWZpZXJPcHRpb25zLm9uTG9hZCkpIHtcbiAgICAgICAgbW9kaWZpZXJPcHRpb25zLm9uTG9hZChfdGhpcy5yZWZlcmVuY2UsIF90aGlzLnBvcHBlciwgX3RoaXMub3B0aW9ucywgbW9kaWZpZXJPcHRpb25zLCBfdGhpcy5zdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBmaXJlIHRoZSBmaXJzdCB1cGRhdGUgdG8gcG9zaXRpb24gdGhlIHBvcHBlciBpbiB0aGUgcmlnaHQgcGxhY2VcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgdmFyIGV2ZW50c0VuYWJsZWQgPSB0aGlzLm9wdGlvbnMuZXZlbnRzRW5hYmxlZDtcbiAgICBpZiAoZXZlbnRzRW5hYmxlZCkge1xuICAgICAgLy8gc2V0dXAgZXZlbnQgbGlzdGVuZXJzLCB0aGV5IHdpbGwgdGFrZSBjYXJlIG9mIHVwZGF0ZSB0aGUgcG9zaXRpb24gaW4gc3BlY2lmaWMgc2l0dWF0aW9uc1xuICAgICAgdGhpcy5lbmFibGVFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUuZXZlbnRzRW5hYmxlZCA9IGV2ZW50c0VuYWJsZWQ7XG4gIH1cblxuICAvLyBXZSBjYW4ndCB1c2UgY2xhc3MgcHJvcGVydGllcyBiZWNhdXNlIHRoZXkgZG9uJ3QgZ2V0IGxpc3RlZCBpbiB0aGVcbiAgLy8gY2xhc3MgcHJvdG90eXBlIGFuZCBicmVhayBzdHVmZiBsaWtlIFNpbm9uIHN0dWJzXG5cblxuICBjcmVhdGVDbGFzcyhQb3BwZXIsIFt7XG4gICAga2V5OiAndXBkYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlJCQxKCkge1xuICAgICAgcmV0dXJuIHVwZGF0ZS5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2Rlc3Ryb3knLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95JCQxKCkge1xuICAgICAgcmV0dXJuIGRlc3Ryb3kuY2FsbCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdlbmFibGVFdmVudExpc3RlbmVycycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuYWJsZUV2ZW50TGlzdGVuZXJzJCQxKCkge1xuICAgICAgcmV0dXJuIGVuYWJsZUV2ZW50TGlzdGVuZXJzLmNhbGwodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGlzYWJsZUV2ZW50TGlzdGVuZXJzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzYWJsZUV2ZW50TGlzdGVuZXJzJCQxKCkge1xuICAgICAgcmV0dXJuIGRpc2FibGVFdmVudExpc3RlbmVycy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlIGFuIHVwZGF0ZSwgaXQgd2lsbCBydW4gb24gdGhlIG5leHQgVUkgdXBkYXRlIGF2YWlsYWJsZVxuICAgICAqIEBtZXRob2Qgc2NoZWR1bGVVcGRhdGVcbiAgICAgKiBAbWVtYmVyb2YgUG9wcGVyXG4gICAgICovXG5cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3Rpb24gb2YgdXRpbGl0aWVzIHVzZWZ1bCB3aGVuIHdyaXRpbmcgY3VzdG9tIG1vZGlmaWVycy5cbiAgICAgKiBTdGFydGluZyBmcm9tIHZlcnNpb24gMS43LCB0aGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgb25seSBpZiB5b3VcbiAgICAgKiBpbmNsdWRlIGBwb3BwZXItdXRpbHMuanNgIGJlZm9yZSBgcG9wcGVyLmpzYC5cbiAgICAgKlxuICAgICAqICoqREVQUkVDQVRJT04qKjogVGhpcyB3YXkgdG8gYWNjZXNzIFBvcHBlclV0aWxzIGlzIGRlcHJlY2F0ZWRcbiAgICAgKiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHYyISBVc2UgdGhlIFBvcHBlclV0aWxzIG1vZHVsZSBkaXJlY3RseSBpbnN0ZWFkLlxuICAgICAqIER1ZSB0byB0aGUgaGlnaCBpbnN0YWJpbGl0eSBvZiB0aGUgbWV0aG9kcyBjb250YWluZWQgaW4gVXRpbHMsIHdlIGNhbid0XG4gICAgICogZ3VhcmFudGVlIHRoZW0gdG8gZm9sbG93IHNlbXZlci4gVXNlIHRoZW0gYXQgeW91ciBvd24gcmlzayFcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMS44XG4gICAgICogQG1lbWJlciBVdGlsc1xuICAgICAqIEBtZW1iZXJvZiBQb3BwZXJcbiAgICAgKi9cblxuICB9XSk7XG4gIHJldHVybiBQb3BwZXI7XG59KCk7XG5cbi8qKlxuICogVGhlIGByZWZlcmVuY2VPYmplY3RgIGlzIGFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFuIGludGVyZmFjZSBjb21wYXRpYmxlIHdpdGggUG9wcGVyLmpzXG4gKiBhbmQgbGV0cyB5b3UgdXNlIGl0IGFzIHJlcGxhY2VtZW50IG9mIGEgcmVhbCBET00gbm9kZS48YnIgLz5cbiAqIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIHBvc2l0aW9uIGEgcG9wcGVyIHJlbGF0aXZlbHkgdG8gYSBzZXQgb2YgY29vcmRpbmF0ZXNcbiAqIGluIGNhc2UgeW91IGRvbid0IGhhdmUgYSBET00gbm9kZSB0byB1c2UgYXMgcmVmZXJlbmNlLlxuICpcbiAqIGBgYFxuICogbmV3IFBvcHBlcihyZWZlcmVuY2VPYmplY3QsIHBvcHBlck5vZGUpO1xuICogYGBgXG4gKlxuICogTkI6IFRoaXMgZmVhdHVyZSBpc24ndCBzdXBwb3J0ZWQgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTBcbiAqIEBuYW1lIHJlZmVyZW5jZU9iamVjdFxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZGF0YS5nZXRCb3VuZGluZ0NsaWVudFJlY3RcbiAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc2V0IG9mIGNvb3JkaW5hdGVzIGNvbXBhdGlibGUgd2l0aCB0aGUgbmF0aXZlIGBnZXRCb3VuZGluZ0NsaWVudFJlY3RgIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkYXRhLmNsaWVudFdpZHRoXG4gKiBBbiBFUzYgZ2V0dGVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSB2aXJ0dWFsIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRhdGEuY2xpZW50SGVpZ2h0XG4gKiBBbiBFUzYgZ2V0dGVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgdmlydHVhbCByZWZlcmVuY2UgZWxlbWVudC5cbiAqL1xuXG5cblBvcHBlci5VdGlscyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbCkuUG9wcGVyVXRpbHM7XG5Qb3BwZXIucGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG5Qb3BwZXIuRGVmYXVsdHMgPSBEZWZhdWx0cztcblxuZXhwb3J0IGRlZmF1bHQgUG9wcGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9wcGVyLmpzLm1hcFxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcG9wcGVyLmpzL2Rpc3QvZXNtL3BvcHBlci5qc1xuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3\n");
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports) {
+
+eval("module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzP2MzYzIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xyXG5cdGlmKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XHJcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcclxuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xyXG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XHJcblx0XHRpZighbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XHJcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xyXG5cdH1cclxuXHRyZXR1cm4gbW9kdWxlO1xyXG59O1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4\n");
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/*!\n * Bootstrap v4.1.2 (https://getbootstrap.com/)\n * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n(function (global, factory) {\n true ? factory(exports, __webpack_require__(1), __webpack_require__(3)) :\n typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :\n (factory((global.bootstrap = {}),global.jQuery,global.Popper));\n}(this, (function (exports,$,Popper) { 'use strict';\n\n $ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n }\n\n function _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n }\n\n function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n }\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Util = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Private TransitionEnd Helpers\n * ------------------------------------------------------------------------\n */\n var TRANSITION_END = 'transitionend';\n var MAX_UID = 1000000;\n var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n function toType(obj) {\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n }\n\n function getSpecialTransitionEndEvent() {\n return {\n bindType: TRANSITION_END,\n delegateType: TRANSITION_END,\n handle: function handle(event) {\n if ($$$1(event.target).is(this)) {\n return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n }\n\n return undefined; // eslint-disable-line no-undefined\n }\n };\n }\n\n function transitionEndEmulator(duration) {\n var _this = this;\n\n var called = false;\n $$$1(this).one(Util.TRANSITION_END, function () {\n called = true;\n });\n setTimeout(function () {\n if (!called) {\n Util.triggerTransitionEnd(_this);\n }\n }, duration);\n return this;\n }\n\n function setTransitionEndSupport() {\n $$$1.fn.emulateTransitionEnd = transitionEndEmulator;\n $$$1.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n }\n /**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\n\n var Util = {\n TRANSITION_END: 'bsTransitionEnd',\n getUID: function getUID(prefix) {\n do {\n // eslint-disable-next-line no-bitwise\n prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix));\n\n return prefix;\n },\n getSelectorFromElement: function getSelectorFromElement(element) {\n var selector = element.getAttribute('data-target');\n\n if (!selector || selector === '#') {\n selector = element.getAttribute('href') || '';\n }\n\n try {\n return document.querySelector(selector) ? selector : null;\n } catch (err) {\n return null;\n }\n },\n getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {\n if (!element) {\n return 0;\n } // Get transition-duration of the element\n\n\n var transitionDuration = $$$1(element).css('transition-duration');\n var floatTransitionDuration = parseFloat(transitionDuration); // Return 0 if element or transition duration is not found\n\n if (!floatTransitionDuration) {\n return 0;\n } // If multiple durations are defined, take the first\n\n\n transitionDuration = transitionDuration.split(',')[0];\n return parseFloat(transitionDuration) * MILLISECONDS_MULTIPLIER;\n },\n reflow: function reflow(element) {\n return element.offsetHeight;\n },\n triggerTransitionEnd: function triggerTransitionEnd(element) {\n $$$1(element).trigger(TRANSITION_END);\n },\n // TODO: Remove in v5\n supportsTransitionEnd: function supportsTransitionEnd() {\n return Boolean(TRANSITION_END);\n },\n isElement: function isElement(obj) {\n return (obj[0] || obj).nodeType;\n },\n typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n for (var property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n var expectedTypes = configTypes[property];\n var value = config[property];\n var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n }\n }\n }\n }\n };\n setTransitionEndSupport();\n return Util;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Alert = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'alert';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.alert';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var Selector = {\n DISMISS: '[data-dismiss=\"alert\"]'\n };\n var Event = {\n CLOSE: \"close\" + EVENT_KEY,\n CLOSED: \"closed\" + EVENT_KEY,\n CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n };\n var ClassName = {\n ALERT: 'alert',\n FADE: 'fade',\n SHOW: 'show'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Alert =\n /*#__PURE__*/\n function () {\n function Alert(element) {\n this._element = element;\n } // Getters\n\n\n var _proto = Alert.prototype;\n\n // Public\n _proto.close = function close(element) {\n var rootElement = this._element;\n\n if (element) {\n rootElement = this._getRootElement(element);\n }\n\n var customEvent = this._triggerCloseEvent(rootElement);\n\n if (customEvent.isDefaultPrevented()) {\n return;\n }\n\n this._removeElement(rootElement);\n };\n\n _proto.dispose = function dispose() {\n $$$1.removeData(this._element, DATA_KEY);\n this._element = null;\n }; // Private\n\n\n _proto._getRootElement = function _getRootElement(element) {\n var selector = Util.getSelectorFromElement(element);\n var parent = false;\n\n if (selector) {\n parent = document.querySelector(selector);\n }\n\n if (!parent) {\n parent = $$$1(element).closest(\".\" + ClassName.ALERT)[0];\n }\n\n return parent;\n };\n\n _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n var closeEvent = $$$1.Event(Event.CLOSE);\n $$$1(element).trigger(closeEvent);\n return closeEvent;\n };\n\n _proto._removeElement = function _removeElement(element) {\n var _this = this;\n\n $$$1(element).removeClass(ClassName.SHOW);\n\n if (!$$$1(element).hasClass(ClassName.FADE)) {\n this._destroyElement(element);\n\n return;\n }\n\n var transitionDuration = Util.getTransitionDurationFromElement(element);\n $$$1(element).one(Util.TRANSITION_END, function (event) {\n return _this._destroyElement(element, event);\n }).emulateTransitionEnd(transitionDuration);\n };\n\n _proto._destroyElement = function _destroyElement(element) {\n $$$1(element).detach().trigger(Event.CLOSED).remove();\n }; // Static\n\n\n Alert._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var $element = $$$1(this);\n var data = $element.data(DATA_KEY);\n\n if (!data) {\n data = new Alert(this);\n $element.data(DATA_KEY, data);\n }\n\n if (config === 'close') {\n data[config](this);\n }\n });\n };\n\n Alert._handleDismiss = function _handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault();\n }\n\n alertInstance.close(this);\n };\n };\n\n _createClass(Alert, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }]);\n\n return Alert;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = Alert._jQueryInterface;\n $$$1.fn[NAME].Constructor = Alert;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Alert._jQueryInterface;\n };\n\n return Alert;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Button = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'button';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.button';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var ClassName = {\n ACTIVE: 'active',\n BUTTON: 'btn',\n FOCUS: 'focus'\n };\n var Selector = {\n DATA_TOGGLE_CARROT: '[data-toggle^=\"button\"]',\n DATA_TOGGLE: '[data-toggle=\"buttons\"]',\n INPUT: 'input',\n ACTIVE: '.active',\n BUTTON: '.btn'\n };\n var Event = {\n CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY,\n FOCUS_BLUR_DATA_API: \"focus\" + EVENT_KEY + DATA_API_KEY + \" \" + (\"blur\" + EVENT_KEY + DATA_API_KEY)\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Button =\n /*#__PURE__*/\n function () {\n function Button(element) {\n this._element = element;\n } // Getters\n\n\n var _proto = Button.prototype;\n\n // Public\n _proto.toggle = function toggle() {\n var triggerChangeEvent = true;\n var addAriaPressed = true;\n var rootElement = $$$1(this._element).closest(Selector.DATA_TOGGLE)[0];\n\n if (rootElement) {\n var input = this._element.querySelector(Selector.INPUT);\n\n if (input) {\n if (input.type === 'radio') {\n if (input.checked && this._element.classList.contains(ClassName.ACTIVE)) {\n triggerChangeEvent = false;\n } else {\n var activeElement = rootElement.querySelector(Selector.ACTIVE);\n\n if (activeElement) {\n $$$1(activeElement).removeClass(ClassName.ACTIVE);\n }\n }\n }\n\n if (triggerChangeEvent) {\n if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {\n return;\n }\n\n input.checked = !this._element.classList.contains(ClassName.ACTIVE);\n $$$1(input).trigger('change');\n }\n\n input.focus();\n addAriaPressed = false;\n }\n }\n\n if (addAriaPressed) {\n this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName.ACTIVE));\n }\n\n if (triggerChangeEvent) {\n $$$1(this._element).toggleClass(ClassName.ACTIVE);\n }\n };\n\n _proto.dispose = function dispose() {\n $$$1.removeData(this._element, DATA_KEY);\n this._element = null;\n }; // Static\n\n\n Button._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $$$1(this).data(DATA_KEY);\n\n if (!data) {\n data = new Button(this);\n $$$1(this).data(DATA_KEY, data);\n }\n\n if (config === 'toggle') {\n data[config]();\n }\n });\n };\n\n _createClass(Button, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }]);\n\n return Button;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\n event.preventDefault();\n var button = event.target;\n\n if (!$$$1(button).hasClass(ClassName.BUTTON)) {\n button = $$$1(button).closest(Selector.BUTTON);\n }\n\n Button._jQueryInterface.call($$$1(button), 'toggle');\n }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\n var button = $$$1(event.target).closest(Selector.BUTTON)[0];\n $$$1(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = Button._jQueryInterface;\n $$$1.fn[NAME].Constructor = Button;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Button._jQueryInterface;\n };\n\n return Button;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Carousel = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'carousel';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.carousel';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n var Default = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true\n };\n var DefaultType = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean'\n };\n var Direction = {\n NEXT: 'next',\n PREV: 'prev',\n LEFT: 'left',\n RIGHT: 'right'\n };\n var Event = {\n SLIDE: \"slide\" + EVENT_KEY,\n SLID: \"slid\" + EVENT_KEY,\n KEYDOWN: \"keydown\" + EVENT_KEY,\n MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n MOUSELEAVE: \"mouseleave\" + EVENT_KEY,\n TOUCHEND: \"touchend\" + EVENT_KEY,\n LOAD_DATA_API: \"load\" + EVENT_KEY + DATA_API_KEY,\n CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n };\n var ClassName = {\n CAROUSEL: 'carousel',\n ACTIVE: 'active',\n SLIDE: 'slide',\n RIGHT: 'carousel-item-right',\n LEFT: 'carousel-item-left',\n NEXT: 'carousel-item-next',\n PREV: 'carousel-item-prev',\n ITEM: 'carousel-item'\n };\n var Selector = {\n ACTIVE: '.active',\n ACTIVE_ITEM: '.active.carousel-item',\n ITEM: '.carousel-item',\n NEXT_PREV: '.carousel-item-next, .carousel-item-prev',\n INDICATORS: '.carousel-indicators',\n DATA_SLIDE: '[data-slide], [data-slide-to]',\n DATA_RIDE: '[data-ride=\"carousel\"]'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Carousel =\n /*#__PURE__*/\n function () {\n function Carousel(element, config) {\n this._items = null;\n this._interval = null;\n this._activeElement = null;\n this._isPaused = false;\n this._isSliding = false;\n this.touchTimeout = null;\n this._config = this._getConfig(config);\n this._element = $$$1(element)[0];\n this._indicatorsElement = this._element.querySelector(Selector.INDICATORS);\n\n this._addEventListeners();\n } // Getters\n\n\n var _proto = Carousel.prototype;\n\n // Public\n _proto.next = function next() {\n if (!this._isSliding) {\n this._slide(Direction.NEXT);\n }\n };\n\n _proto.nextWhenVisible = function nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && $$$1(this._element).is(':visible') && $$$1(this._element).css('visibility') !== 'hidden') {\n this.next();\n }\n };\n\n _proto.prev = function prev() {\n if (!this._isSliding) {\n this._slide(Direction.PREV);\n }\n };\n\n _proto.pause = function pause(event) {\n if (!event) {\n this._isPaused = true;\n }\n\n if (this._element.querySelector(Selector.NEXT_PREV)) {\n Util.triggerTransitionEnd(this._element);\n this.cycle(true);\n }\n\n clearInterval(this._interval);\n this._interval = null;\n };\n\n _proto.cycle = function cycle(event) {\n if (!event) {\n this._isPaused = false;\n }\n\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n\n if (this._config.interval && !this._isPaused) {\n this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n }\n };\n\n _proto.to = function to(index) {\n var _this = this;\n\n this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM);\n\n var activeIndex = this._getItemIndex(this._activeElement);\n\n if (index > this._items.length - 1 || index < 0) {\n return;\n }\n\n if (this._isSliding) {\n $$$1(this._element).one(Event.SLID, function () {\n return _this.to(index);\n });\n return;\n }\n\n if (activeIndex === index) {\n this.pause();\n this.cycle();\n return;\n }\n\n var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;\n\n this._slide(direction, this._items[index]);\n };\n\n _proto.dispose = function dispose() {\n $$$1(this._element).off(EVENT_KEY);\n $$$1.removeData(this._element, DATA_KEY);\n this._items = null;\n this._config = null;\n this._element = null;\n this._interval = null;\n this._isPaused = null;\n this._isSliding = null;\n this._activeElement = null;\n this._indicatorsElement = null;\n }; // Private\n\n\n _proto._getConfig = function _getConfig(config) {\n config = _objectSpread({}, Default, config);\n Util.typeCheckConfig(NAME, config, DefaultType);\n return config;\n };\n\n _proto._addEventListeners = function _addEventListeners() {\n var _this2 = this;\n\n if (this._config.keyboard) {\n $$$1(this._element).on(Event.KEYDOWN, function (event) {\n return _this2._keydown(event);\n });\n }\n\n if (this._config.pause === 'hover') {\n $$$1(this._element).on(Event.MOUSEENTER, function (event) {\n return _this2.pause(event);\n }).on(Event.MOUSELEAVE, function (event) {\n return _this2.cycle(event);\n });\n\n if ('ontouchstart' in document.documentElement) {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n $$$1(this._element).on(Event.TOUCHEND, function () {\n _this2.pause();\n\n if (_this2.touchTimeout) {\n clearTimeout(_this2.touchTimeout);\n }\n\n _this2.touchTimeout = setTimeout(function (event) {\n return _this2.cycle(event);\n }, TOUCHEVENT_COMPAT_WAIT + _this2._config.interval);\n });\n }\n }\n };\n\n _proto._keydown = function _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n event.preventDefault();\n this.prev();\n break;\n\n case ARROW_RIGHT_KEYCODE:\n event.preventDefault();\n this.next();\n break;\n\n default:\n }\n };\n\n _proto._getItemIndex = function _getItemIndex(element) {\n this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM)) : [];\n return this._items.indexOf(element);\n };\n\n _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n var isNextDirection = direction === Direction.NEXT;\n var isPrevDirection = direction === Direction.PREV;\n\n var activeIndex = this._getItemIndex(activeElement);\n\n var lastItemIndex = this._items.length - 1;\n var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n if (isGoingToWrap && !this._config.wrap) {\n return activeElement;\n }\n\n var delta = direction === Direction.PREV ? -1 : 1;\n var itemIndex = (activeIndex + delta) % this._items.length;\n return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n };\n\n _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n var targetIndex = this._getItemIndex(relatedTarget);\n\n var fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM));\n\n var slideEvent = $$$1.Event(Event.SLIDE, {\n relatedTarget: relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n });\n $$$1(this._element).trigger(slideEvent);\n return slideEvent;\n };\n\n _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE));\n $$$1(indicators).removeClass(ClassName.ACTIVE);\n\n var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n if (nextIndicator) {\n $$$1(nextIndicator).addClass(ClassName.ACTIVE);\n }\n }\n };\n\n _proto._slide = function _slide(direction, element) {\n var _this3 = this;\n\n var activeElement = this._element.querySelector(Selector.ACTIVE_ITEM);\n\n var activeElementIndex = this._getItemIndex(activeElement);\n\n var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n var nextElementIndex = this._getItemIndex(nextElement);\n\n var isCycling = Boolean(this._interval);\n var directionalClassName;\n var orderClassName;\n var eventDirectionName;\n\n if (direction === Direction.NEXT) {\n directionalClassName = ClassName.LEFT;\n orderClassName = ClassName.NEXT;\n eventDirectionName = Direction.LEFT;\n } else {\n directionalClassName = ClassName.RIGHT;\n orderClassName = ClassName.PREV;\n eventDirectionName = Direction.RIGHT;\n }\n\n if (nextElement && $$$1(nextElement).hasClass(ClassName.ACTIVE)) {\n this._isSliding = false;\n return;\n }\n\n var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n if (slideEvent.isDefaultPrevented()) {\n return;\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return;\n }\n\n this._isSliding = true;\n\n if (isCycling) {\n this.pause();\n }\n\n this._setActiveIndicatorElement(nextElement);\n\n var slidEvent = $$$1.Event(Event.SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n });\n\n if ($$$1(this._element).hasClass(ClassName.SLIDE)) {\n $$$1(nextElement).addClass(orderClassName);\n Util.reflow(nextElement);\n $$$1(activeElement).addClass(directionalClassName);\n $$$1(nextElement).addClass(directionalClassName);\n var transitionDuration = Util.getTransitionDurationFromElement(activeElement);\n $$$1(activeElement).one(Util.TRANSITION_END, function () {\n $$$1(nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(ClassName.ACTIVE);\n $$$1(activeElement).removeClass(ClassName.ACTIVE + \" \" + orderClassName + \" \" + directionalClassName);\n _this3._isSliding = false;\n setTimeout(function () {\n return $$$1(_this3._element).trigger(slidEvent);\n }, 0);\n }).emulateTransitionEnd(transitionDuration);\n } else {\n $$$1(activeElement).removeClass(ClassName.ACTIVE);\n $$$1(nextElement).addClass(ClassName.ACTIVE);\n this._isSliding = false;\n $$$1(this._element).trigger(slidEvent);\n }\n\n if (isCycling) {\n this.cycle();\n }\n }; // Static\n\n\n Carousel._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $$$1(this).data(DATA_KEY);\n\n var _config = _objectSpread({}, Default, $$$1(this).data());\n\n if (typeof config === 'object') {\n _config = _objectSpread({}, _config, config);\n }\n\n var action = typeof config === 'string' ? config : _config.slide;\n\n if (!data) {\n data = new Carousel(this, _config);\n $$$1(this).data(DATA_KEY, data);\n }\n\n if (typeof config === 'number') {\n data.to(config);\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + action + \"\\\"\");\n }\n\n data[action]();\n } else if (_config.interval) {\n data.pause();\n data.cycle();\n }\n });\n };\n\n Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n var selector = Util.getSelectorFromElement(this);\n\n if (!selector) {\n return;\n }\n\n var target = $$$1(selector)[0];\n\n if (!target || !$$$1(target).hasClass(ClassName.CAROUSEL)) {\n return;\n }\n\n var config = _objectSpread({}, $$$1(target).data(), $$$1(this).data());\n\n var slideIndex = this.getAttribute('data-slide-to');\n\n if (slideIndex) {\n config.interval = false;\n }\n\n Carousel._jQueryInterface.call($$$1(target), config);\n\n if (slideIndex) {\n $$$1(target).data(DATA_KEY).to(slideIndex);\n }\n\n event.preventDefault();\n };\n\n _createClass(Carousel, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }]);\n\n return Carousel;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);\n $$$1(window).on(Event.LOAD_DATA_API, function () {\n var carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE));\n\n for (var i = 0, len = carousels.length; i < len; i++) {\n var $carousel = $$$1(carousels[i]);\n\n Carousel._jQueryInterface.call($carousel, $carousel.data());\n }\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = Carousel._jQueryInterface;\n $$$1.fn[NAME].Constructor = Carousel;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Carousel._jQueryInterface;\n };\n\n return Carousel;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Collapse = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'collapse';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.collapse';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var Default = {\n toggle: true,\n parent: ''\n };\n var DefaultType = {\n toggle: 'boolean',\n parent: '(string|element)'\n };\n var Event = {\n SHOW: \"show\" + EVENT_KEY,\n SHOWN: \"shown\" + EVENT_KEY,\n HIDE: \"hide\" + EVENT_KEY,\n HIDDEN: \"hidden\" + EVENT_KEY,\n CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n };\n var ClassName = {\n SHOW: 'show',\n COLLAPSE: 'collapse',\n COLLAPSING: 'collapsing',\n COLLAPSED: 'collapsed'\n };\n var Dimension = {\n WIDTH: 'width',\n HEIGHT: 'height'\n };\n var Selector = {\n ACTIVES: '.show, .collapsing',\n DATA_TOGGLE: '[data-toggle=\"collapse\"]'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Collapse =\n /*#__PURE__*/\n function () {\n function Collapse(element, config) {\n this._isTransitioning = false;\n this._element = element;\n this._config = this._getConfig(config);\n this._triggerArray = $$$1.makeArray(document.querySelectorAll(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n var toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));\n\n for (var i = 0, len = toggleList.length; i < len; i++) {\n var elem = toggleList[i];\n var selector = Util.getSelectorFromElement(elem);\n var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {\n return foundElem === element;\n });\n\n if (selector !== null && filterElement.length > 0) {\n this._selector = selector;\n\n this._triggerArray.push(elem);\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null;\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n }\n\n if (this._config.toggle) {\n this.toggle();\n }\n } // Getters\n\n\n var _proto = Collapse.prototype;\n\n // Public\n _proto.toggle = function toggle() {\n if ($$$1(this._element).hasClass(ClassName.SHOW)) {\n this.hide();\n } else {\n this.show();\n }\n };\n\n _proto.show = function show() {\n var _this = this;\n\n if (this._isTransitioning || $$$1(this._element).hasClass(ClassName.SHOW)) {\n return;\n }\n\n var actives;\n var activesData;\n\n if (this._parent) {\n actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES)).filter(function (elem) {\n return elem.getAttribute('data-parent') === _this._config.parent;\n });\n\n if (actives.length === 0) {\n actives = null;\n }\n }\n\n if (actives) {\n activesData = $$$1(actives).not(this._selector).data(DATA_KEY);\n\n if (activesData && activesData._isTransitioning) {\n return;\n }\n }\n\n var startEvent = $$$1.Event(Event.SHOW);\n $$$1(this._element).trigger(startEvent);\n\n if (startEvent.isDefaultPrevented()) {\n return;\n }\n\n if (actives) {\n Collapse._jQueryInterface.call($$$1(actives).not(this._selector), 'hide');\n\n if (!activesData) {\n $$$1(actives).data(DATA_KEY, null);\n }\n }\n\n var dimension = this._getDimension();\n\n $$$1(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);\n this._element.style[dimension] = 0;\n\n if (this._triggerArray.length) {\n $$$1(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);\n }\n\n this.setTransitioning(true);\n\n var complete = function complete() {\n $$$1(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);\n _this._element.style[dimension] = '';\n\n _this.setTransitioning(false);\n\n $$$1(_this._element).trigger(Event.SHOWN);\n };\n\n var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n var scrollSize = \"scroll\" + capitalizedDimension;\n var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n this._element.style[dimension] = this._element[scrollSize] + \"px\";\n };\n\n _proto.hide = function hide() {\n var _this2 = this;\n\n if (this._isTransitioning || !$$$1(this._element).hasClass(ClassName.SHOW)) {\n return;\n }\n\n var startEvent = $$$1.Event(Event.HIDE);\n $$$1(this._element).trigger(startEvent);\n\n if (startEvent.isDefaultPrevented()) {\n return;\n }\n\n var dimension = this._getDimension();\n\n this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n Util.reflow(this._element);\n $$$1(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);\n var triggerArrayLength = this._triggerArray.length;\n\n if (triggerArrayLength > 0) {\n for (var i = 0; i < triggerArrayLength; i++) {\n var trigger = this._triggerArray[i];\n var selector = Util.getSelectorFromElement(trigger);\n\n if (selector !== null) {\n var $elem = $$$1([].slice.call(document.querySelectorAll(selector)));\n\n if (!$elem.hasClass(ClassName.SHOW)) {\n $$$1(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);\n }\n }\n }\n }\n\n this.setTransitioning(true);\n\n var complete = function complete() {\n _this2.setTransitioning(false);\n\n $$$1(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);\n };\n\n this._element.style[dimension] = '';\n var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n };\n\n _proto.setTransitioning = function setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning;\n };\n\n _proto.dispose = function dispose() {\n $$$1.removeData(this._element, DATA_KEY);\n this._config = null;\n this._parent = null;\n this._element = null;\n this._triggerArray = null;\n this._isTransitioning = null;\n }; // Private\n\n\n _proto._getConfig = function _getConfig(config) {\n config = _objectSpread({}, Default, config);\n config.toggle = Boolean(config.toggle); // Coerce string values\n\n Util.typeCheckConfig(NAME, config, DefaultType);\n return config;\n };\n\n _proto._getDimension = function _getDimension() {\n var hasWidth = $$$1(this._element).hasClass(Dimension.WIDTH);\n return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n };\n\n _proto._getParent = function _getParent() {\n var _this3 = this;\n\n var parent = null;\n\n if (Util.isElement(this._config.parent)) {\n parent = this._config.parent; // It's a jQuery object\n\n if (typeof this._config.parent.jquery !== 'undefined') {\n parent = this._config.parent[0];\n }\n } else {\n parent = document.querySelector(this._config.parent);\n }\n\n var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n var children = [].slice.call(parent.querySelectorAll(selector));\n $$$1(children).each(function (i, element) {\n _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n });\n return parent;\n };\n\n _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n if (element) {\n var isOpen = $$$1(element).hasClass(ClassName.SHOW);\n\n if (triggerArray.length) {\n $$$1(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n }\n }\n }; // Static\n\n\n Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n var selector = Util.getSelectorFromElement(element);\n return selector ? document.querySelector(selector) : null;\n };\n\n Collapse._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var $this = $$$1(this);\n var data = $this.data(DATA_KEY);\n\n var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config ? config : {});\n\n if (!data && _config.toggle && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n\n if (!data) {\n data = new Collapse(this, _config);\n $this.data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(Collapse, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }]);\n\n return Collapse;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.currentTarget.tagName === 'A') {\n event.preventDefault();\n }\n\n var $trigger = $$$1(this);\n var selector = Util.getSelectorFromElement(this);\n var selectors = [].slice.call(document.querySelectorAll(selector));\n $$$1(selectors).each(function () {\n var $target = $$$1(this);\n var data = $target.data(DATA_KEY);\n var config = data ? 'toggle' : $trigger.data();\n\n Collapse._jQueryInterface.call($target, config);\n });\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = Collapse._jQueryInterface;\n $$$1.fn[NAME].Constructor = Collapse;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Collapse._jQueryInterface;\n };\n\n return Collapse;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Dropdown = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'dropdown';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.dropdown';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE);\n var Event = {\n HIDE: \"hide\" + EVENT_KEY,\n HIDDEN: \"hidden\" + EVENT_KEY,\n SHOW: \"show\" + EVENT_KEY,\n SHOWN: \"shown\" + EVENT_KEY,\n CLICK: \"click\" + EVENT_KEY,\n CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY,\n KEYDOWN_DATA_API: \"keydown\" + EVENT_KEY + DATA_API_KEY,\n KEYUP_DATA_API: \"keyup\" + EVENT_KEY + DATA_API_KEY\n };\n var ClassName = {\n DISABLED: 'disabled',\n SHOW: 'show',\n DROPUP: 'dropup',\n DROPRIGHT: 'dropright',\n DROPLEFT: 'dropleft',\n MENURIGHT: 'dropdown-menu-right',\n MENULEFT: 'dropdown-menu-left',\n POSITION_STATIC: 'position-static'\n };\n var Selector = {\n DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n FORM_CHILD: '.dropdown form',\n MENU: '.dropdown-menu',\n NAVBAR_NAV: '.navbar-nav',\n VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n };\n var AttachmentMap = {\n TOP: 'top-start',\n TOPEND: 'top-end',\n BOTTOM: 'bottom-start',\n BOTTOMEND: 'bottom-end',\n RIGHT: 'right-start',\n RIGHTEND: 'right-end',\n LEFT: 'left-start',\n LEFTEND: 'left-end'\n };\n var Default = {\n offset: 0,\n flip: true,\n boundary: 'scrollParent',\n reference: 'toggle',\n display: 'dynamic'\n };\n var DefaultType = {\n offset: '(number|string|function)',\n flip: 'boolean',\n boundary: '(string|element)',\n reference: '(string|element)',\n display: 'string'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Dropdown =\n /*#__PURE__*/\n function () {\n function Dropdown(element, config) {\n this._element = element;\n this._popper = null;\n this._config = this._getConfig(config);\n this._menu = this._getMenuElement();\n this._inNavbar = this._detectNavbar();\n\n this._addEventListeners();\n } // Getters\n\n\n var _proto = Dropdown.prototype;\n\n // Public\n _proto.toggle = function toggle() {\n if (this._element.disabled || $$$1(this._element).hasClass(ClassName.DISABLED)) {\n return;\n }\n\n var parent = Dropdown._getParentFromElement(this._element);\n\n var isActive = $$$1(this._menu).hasClass(ClassName.SHOW);\n\n Dropdown._clearMenus();\n\n if (isActive) {\n return;\n }\n\n var relatedTarget = {\n relatedTarget: this._element\n };\n var showEvent = $$$1.Event(Event.SHOW, relatedTarget);\n $$$1(parent).trigger(showEvent);\n\n if (showEvent.isDefaultPrevented()) {\n return;\n } // Disable totally Popper.js for Dropdown in Navbar\n\n\n if (!this._inNavbar) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap dropdown require Popper.js (https://popper.js.org)');\n }\n\n var referenceElement = this._element;\n\n if (this._config.reference === 'parent') {\n referenceElement = parent;\n } else if (Util.isElement(this._config.reference)) {\n referenceElement = this._config.reference; // Check if it's jQuery element\n\n if (typeof this._config.reference.jquery !== 'undefined') {\n referenceElement = this._config.reference[0];\n }\n } // If boundary is not `scrollParent`, then set position to `static`\n // to allow the menu to \"escape\" the scroll parent's boundaries\n // https://github.com/twbs/bootstrap/issues/24251\n\n\n if (this._config.boundary !== 'scrollParent') {\n $$$1(parent).addClass(ClassName.POSITION_STATIC);\n }\n\n this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());\n } // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n if ('ontouchstart' in document.documentElement && $$$1(parent).closest(Selector.NAVBAR_NAV).length === 0) {\n $$$1(document.body).children().on('mouseover', null, $$$1.noop);\n }\n\n this._element.focus();\n\n this._element.setAttribute('aria-expanded', true);\n\n $$$1(this._menu).toggleClass(ClassName.SHOW);\n $$$1(parent).toggleClass(ClassName.SHOW).trigger($$$1.Event(Event.SHOWN, relatedTarget));\n };\n\n _proto.dispose = function dispose() {\n $$$1.removeData(this._element, DATA_KEY);\n $$$1(this._element).off(EVENT_KEY);\n this._element = null;\n this._menu = null;\n\n if (this._popper !== null) {\n this._popper.destroy();\n\n this._popper = null;\n }\n };\n\n _proto.update = function update() {\n this._inNavbar = this._detectNavbar();\n\n if (this._popper !== null) {\n this._popper.scheduleUpdate();\n }\n }; // Private\n\n\n _proto._addEventListeners = function _addEventListeners() {\n var _this = this;\n\n $$$1(this._element).on(Event.CLICK, function (event) {\n event.preventDefault();\n event.stopPropagation();\n\n _this.toggle();\n });\n };\n\n _proto._getConfig = function _getConfig(config) {\n config = _objectSpread({}, this.constructor.Default, $$$1(this._element).data(), config);\n Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\n return config;\n };\n\n _proto._getMenuElement = function _getMenuElement() {\n if (!this._menu) {\n var parent = Dropdown._getParentFromElement(this._element);\n\n if (parent) {\n this._menu = parent.querySelector(Selector.MENU);\n }\n }\n\n return this._menu;\n };\n\n _proto._getPlacement = function _getPlacement() {\n var $parentDropdown = $$$1(this._element.parentNode);\n var placement = AttachmentMap.BOTTOM; // Handle dropup\n\n if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n placement = AttachmentMap.TOP;\n\n if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.TOPEND;\n }\n } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n placement = AttachmentMap.RIGHT;\n } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n placement = AttachmentMap.LEFT;\n } else if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.BOTTOMEND;\n }\n\n return placement;\n };\n\n _proto._detectNavbar = function _detectNavbar() {\n return $$$1(this._element).closest('.navbar').length > 0;\n };\n\n _proto._getPopperConfig = function _getPopperConfig() {\n var _this2 = this;\n\n var offsetConf = {};\n\n if (typeof this._config.offset === 'function') {\n offsetConf.fn = function (data) {\n data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets) || {});\n return data;\n };\n } else {\n offsetConf.offset = this._config.offset;\n }\n\n var popperConfig = {\n placement: this._getPlacement(),\n modifiers: {\n offset: offsetConf,\n flip: {\n enabled: this._config.flip\n },\n preventOverflow: {\n boundariesElement: this._config.boundary\n }\n } // Disable Popper.js if we have a static display\n\n };\n\n if (this._config.display === 'static') {\n popperConfig.modifiers.applyStyle = {\n enabled: false\n };\n }\n\n return popperConfig;\n }; // Static\n\n\n Dropdown._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $$$1(this).data(DATA_KEY);\n\n var _config = typeof config === 'object' ? config : null;\n\n if (!data) {\n data = new Dropdown(this, _config);\n $$$1(this).data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n Dropdown._clearMenus = function _clearMenus(event) {\n if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n return;\n }\n\n var toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));\n\n for (var i = 0, len = toggles.length; i < len; i++) {\n var parent = Dropdown._getParentFromElement(toggles[i]);\n\n var context = $$$1(toggles[i]).data(DATA_KEY);\n var relatedTarget = {\n relatedTarget: toggles[i]\n };\n\n if (event && event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n\n if (!context) {\n continue;\n }\n\n var dropdownMenu = context._menu;\n\n if (!$$$1(parent).hasClass(ClassName.SHOW)) {\n continue;\n }\n\n if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $$$1.contains(parent, event.target)) {\n continue;\n }\n\n var hideEvent = $$$1.Event(Event.HIDE, relatedTarget);\n $$$1(parent).trigger(hideEvent);\n\n if (hideEvent.isDefaultPrevented()) {\n continue;\n } // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n\n\n if ('ontouchstart' in document.documentElement) {\n $$$1(document.body).children().off('mouseover', null, $$$1.noop);\n }\n\n toggles[i].setAttribute('aria-expanded', 'false');\n $$$1(dropdownMenu).removeClass(ClassName.SHOW);\n $$$1(parent).removeClass(ClassName.SHOW).trigger($$$1.Event(Event.HIDDEN, relatedTarget));\n }\n };\n\n Dropdown._getParentFromElement = function _getParentFromElement(element) {\n var parent;\n var selector = Util.getSelectorFromElement(element);\n\n if (selector) {\n parent = document.querySelector(selector);\n }\n\n return parent || element.parentNode;\n }; // eslint-disable-next-line complexity\n\n\n Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $$$1(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n if (this.disabled || $$$1(this).hasClass(ClassName.DISABLED)) {\n return;\n }\n\n var parent = Dropdown._getParentFromElement(this);\n\n var isActive = $$$1(parent).hasClass(ClassName.SHOW);\n\n if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n if (event.which === ESCAPE_KEYCODE) {\n var toggle = parent.querySelector(Selector.DATA_TOGGLE);\n $$$1(toggle).trigger('focus');\n }\n\n $$$1(this).trigger('click');\n return;\n }\n\n var items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS));\n\n if (items.length === 0) {\n return;\n }\n\n var index = items.indexOf(event.target);\n\n if (event.which === ARROW_UP_KEYCODE && index > 0) {\n // Up\n index--;\n }\n\n if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n // Down\n index++;\n }\n\n if (index < 0) {\n index = 0;\n }\n\n items[index].focus();\n };\n\n _createClass(Dropdown, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }, {\n key: \"DefaultType\",\n get: function get() {\n return DefaultType;\n }\n }]);\n\n return Dropdown;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + \" \" + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault();\n event.stopPropagation();\n\n Dropdown._jQueryInterface.call($$$1(this), 'toggle');\n }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {\n e.stopPropagation();\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = Dropdown._jQueryInterface;\n $$$1.fn[NAME].Constructor = Dropdown;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Dropdown._jQueryInterface;\n };\n\n return Dropdown;\n }($, Popper);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Modal = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'modal';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.modal';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n var Default = {\n backdrop: true,\n keyboard: true,\n focus: true,\n show: true\n };\n var DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean',\n show: 'boolean'\n };\n var Event = {\n HIDE: \"hide\" + EVENT_KEY,\n HIDDEN: \"hidden\" + EVENT_KEY,\n SHOW: \"show\" + EVENT_KEY,\n SHOWN: \"shown\" + EVENT_KEY,\n FOCUSIN: \"focusin\" + EVENT_KEY,\n RESIZE: \"resize\" + EVENT_KEY,\n CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY,\n KEYDOWN_DISMISS: \"keydown.dismiss\" + EVENT_KEY,\n MOUSEUP_DISMISS: \"mouseup.dismiss\" + EVENT_KEY,\n MOUSEDOWN_DISMISS: \"mousedown.dismiss\" + EVENT_KEY,\n CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n };\n var ClassName = {\n SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\n BACKDROP: 'modal-backdrop',\n OPEN: 'modal-open',\n FADE: 'fade',\n SHOW: 'show'\n };\n var Selector = {\n DIALOG: '.modal-dialog',\n DATA_TOGGLE: '[data-toggle=\"modal\"]',\n DATA_DISMISS: '[data-dismiss=\"modal\"]',\n FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n STICKY_CONTENT: '.sticky-top'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Modal =\n /*#__PURE__*/\n function () {\n function Modal(element, config) {\n this._config = this._getConfig(config);\n this._element = element;\n this._dialog = element.querySelector(Selector.DIALOG);\n this._backdrop = null;\n this._isShown = false;\n this._isBodyOverflowing = false;\n this._ignoreBackdropClick = false;\n this._scrollbarWidth = 0;\n } // Getters\n\n\n var _proto = Modal.prototype;\n\n // Public\n _proto.toggle = function toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n };\n\n _proto.show = function show(relatedTarget) {\n var _this = this;\n\n if (this._isTransitioning || this._isShown) {\n return;\n }\n\n if ($$$1(this._element).hasClass(ClassName.FADE)) {\n this._isTransitioning = true;\n }\n\n var showEvent = $$$1.Event(Event.SHOW, {\n relatedTarget: relatedTarget\n });\n $$$1(this._element).trigger(showEvent);\n\n if (this._isShown || showEvent.isDefaultPrevented()) {\n return;\n }\n\n this._isShown = true;\n\n this._checkScrollbar();\n\n this._setScrollbar();\n\n this._adjustDialog();\n\n $$$1(document.body).addClass(ClassName.OPEN);\n\n this._setEscapeEvent();\n\n this._setResizeEvent();\n\n $$$1(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {\n return _this.hide(event);\n });\n $$$1(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {\n $$$1(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {\n if ($$$1(event.target).is(_this._element)) {\n _this._ignoreBackdropClick = true;\n }\n });\n });\n\n this._showBackdrop(function () {\n return _this._showElement(relatedTarget);\n });\n };\n\n _proto.hide = function hide(event) {\n var _this2 = this;\n\n if (event) {\n event.preventDefault();\n }\n\n if (this._isTransitioning || !this._isShown) {\n return;\n }\n\n var hideEvent = $$$1.Event(Event.HIDE);\n $$$1(this._element).trigger(hideEvent);\n\n if (!this._isShown || hideEvent.isDefaultPrevented()) {\n return;\n }\n\n this._isShown = false;\n var transition = $$$1(this._element).hasClass(ClassName.FADE);\n\n if (transition) {\n this._isTransitioning = true;\n }\n\n this._setEscapeEvent();\n\n this._setResizeEvent();\n\n $$$1(document).off(Event.FOCUSIN);\n $$$1(this._element).removeClass(ClassName.SHOW);\n $$$1(this._element).off(Event.CLICK_DISMISS);\n $$$1(this._dialog).off(Event.MOUSEDOWN_DISMISS);\n\n if (transition) {\n var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n $$$1(this._element).one(Util.TRANSITION_END, function (event) {\n return _this2._hideModal(event);\n }).emulateTransitionEnd(transitionDuration);\n } else {\n this._hideModal();\n }\n };\n\n _proto.dispose = function dispose() {\n $$$1.removeData(this._element, DATA_KEY);\n $$$1(window, document, this._element, this._backdrop).off(EVENT_KEY);\n this._config = null;\n this._element = null;\n this._dialog = null;\n this._backdrop = null;\n this._isShown = null;\n this._isBodyOverflowing = null;\n this._ignoreBackdropClick = null;\n this._scrollbarWidth = null;\n };\n\n _proto.handleUpdate = function handleUpdate() {\n this._adjustDialog();\n }; // Private\n\n\n _proto._getConfig = function _getConfig(config) {\n config = _objectSpread({}, Default, config);\n Util.typeCheckConfig(NAME, config, DefaultType);\n return config;\n };\n\n _proto._showElement = function _showElement(relatedTarget) {\n var _this3 = this;\n\n var transition = $$$1(this._element).hasClass(ClassName.FADE);\n\n if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element);\n }\n\n this._element.style.display = 'block';\n\n this._element.removeAttribute('aria-hidden');\n\n this._element.scrollTop = 0;\n\n if (transition) {\n Util.reflow(this._element);\n }\n\n $$$1(this._element).addClass(ClassName.SHOW);\n\n if (this._config.focus) {\n this._enforceFocus();\n }\n\n var shownEvent = $$$1.Event(Event.SHOWN, {\n relatedTarget: relatedTarget\n });\n\n var transitionComplete = function transitionComplete() {\n if (_this3._config.focus) {\n _this3._element.focus();\n }\n\n _this3._isTransitioning = false;\n $$$1(_this3._element).trigger(shownEvent);\n };\n\n if (transition) {\n var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n $$$1(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);\n } else {\n transitionComplete();\n }\n };\n\n _proto._enforceFocus = function _enforceFocus() {\n var _this4 = this;\n\n $$$1(document).off(Event.FOCUSIN) // Guard against infinite focus loop\n .on(Event.FOCUSIN, function (event) {\n if (document !== event.target && _this4._element !== event.target && $$$1(_this4._element).has(event.target).length === 0) {\n _this4._element.focus();\n }\n });\n };\n\n _proto._setEscapeEvent = function _setEscapeEvent() {\n var _this5 = this;\n\n if (this._isShown && this._config.keyboard) {\n $$$1(this._element).on(Event.KEYDOWN_DISMISS, function (event) {\n if (event.which === ESCAPE_KEYCODE) {\n event.preventDefault();\n\n _this5.hide();\n }\n });\n } else if (!this._isShown) {\n $$$1(this._element).off(Event.KEYDOWN_DISMISS);\n }\n };\n\n _proto._setResizeEvent = function _setResizeEvent() {\n var _this6 = this;\n\n if (this._isShown) {\n $$$1(window).on(Event.RESIZE, function (event) {\n return _this6.handleUpdate(event);\n });\n } else {\n $$$1(window).off(Event.RESIZE);\n }\n };\n\n _proto._hideModal = function _hideModal() {\n var _this7 = this;\n\n this._element.style.display = 'none';\n\n this._element.setAttribute('aria-hidden', true);\n\n this._isTransitioning = false;\n\n this._showBackdrop(function () {\n $$$1(document.body).removeClass(ClassName.OPEN);\n\n _this7._resetAdjustments();\n\n _this7._resetScrollbar();\n\n $$$1(_this7._element).trigger(Event.HIDDEN);\n });\n };\n\n _proto._removeBackdrop = function _removeBackdrop() {\n if (this._backdrop) {\n $$$1(this._backdrop).remove();\n this._backdrop = null;\n }\n };\n\n _proto._showBackdrop = function _showBackdrop(callback) {\n var _this8 = this;\n\n var animate = $$$1(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';\n\n if (this._isShown && this._config.backdrop) {\n this._backdrop = document.createElement('div');\n this._backdrop.className = ClassName.BACKDROP;\n\n if (animate) {\n this._backdrop.classList.add(animate);\n }\n\n $$$1(this._backdrop).appendTo(document.body);\n $$$1(this._element).on(Event.CLICK_DISMISS, function (event) {\n if (_this8._ignoreBackdropClick) {\n _this8._ignoreBackdropClick = false;\n return;\n }\n\n if (event.target !== event.currentTarget) {\n return;\n }\n\n if (_this8._config.backdrop === 'static') {\n _this8._element.focus();\n } else {\n _this8.hide();\n }\n });\n\n if (animate) {\n Util.reflow(this._backdrop);\n }\n\n $$$1(this._backdrop).addClass(ClassName.SHOW);\n\n if (!callback) {\n return;\n }\n\n if (!animate) {\n callback();\n return;\n }\n\n var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n $$$1(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);\n } else if (!this._isShown && this._backdrop) {\n $$$1(this._backdrop).removeClass(ClassName.SHOW);\n\n var callbackRemove = function callbackRemove() {\n _this8._removeBackdrop();\n\n if (callback) {\n callback();\n }\n };\n\n if ($$$1(this._element).hasClass(ClassName.FADE)) {\n var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n\n $$$1(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);\n } else {\n callbackRemove();\n }\n } else if (callback) {\n callback();\n }\n }; // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // todo (fat): these should probably be refactored out of modal.js\n // ----------------------------------------------------------------------\n\n\n _proto._adjustDialog = function _adjustDialog() {\n var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n if (!this._isBodyOverflowing && isModalOverflowing) {\n this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n }\n\n if (this._isBodyOverflowing && !isModalOverflowing) {\n this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n }\n };\n\n _proto._resetAdjustments = function _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n };\n\n _proto._checkScrollbar = function _checkScrollbar() {\n var rect = document.body.getBoundingClientRect();\n this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;\n this._scrollbarWidth = this._getScrollbarWidth();\n };\n\n _proto._setScrollbar = function _setScrollbar() {\n var _this9 = this;\n\n if (this._isBodyOverflowing) {\n // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT));\n var stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT)); // Adjust fixed content padding\n\n $$$1(fixedContent).each(function (index, element) {\n var actualPadding = element.style.paddingRight;\n var calculatedPadding = $$$1(element).css('padding-right');\n $$$1(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + \"px\");\n }); // Adjust sticky content margin\n\n $$$1(stickyContent).each(function (index, element) {\n var actualMargin = element.style.marginRight;\n var calculatedMargin = $$$1(element).css('margin-right');\n $$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + \"px\");\n }); // Adjust body padding\n\n var actualPadding = document.body.style.paddingRight;\n var calculatedPadding = $$$1(document.body).css('padding-right');\n $$$1(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n }\n };\n\n _proto._resetScrollbar = function _resetScrollbar() {\n // Restore fixed content padding\n var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT));\n $$$1(fixedContent).each(function (index, element) {\n var padding = $$$1(element).data('padding-right');\n $$$1(element).removeData('padding-right');\n element.style.paddingRight = padding ? padding : '';\n }); // Restore sticky content\n\n var elements = [].slice.call(document.querySelectorAll(\"\" + Selector.STICKY_CONTENT));\n $$$1(elements).each(function (index, element) {\n var margin = $$$1(element).data('margin-right');\n\n if (typeof margin !== 'undefined') {\n $$$1(element).css('margin-right', margin).removeData('margin-right');\n }\n }); // Restore body padding\n\n var padding = $$$1(document.body).data('padding-right');\n $$$1(document.body).removeData('padding-right');\n document.body.style.paddingRight = padding ? padding : '';\n };\n\n _proto._getScrollbarWidth = function _getScrollbarWidth() {\n // thx d.walsh\n var scrollDiv = document.createElement('div');\n scrollDiv.className = ClassName.SCROLLBAR_MEASURER;\n document.body.appendChild(scrollDiv);\n var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n document.body.removeChild(scrollDiv);\n return scrollbarWidth;\n }; // Static\n\n\n Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n var data = $$$1(this).data(DATA_KEY);\n\n var _config = _objectSpread({}, Default, $$$1(this).data(), typeof config === 'object' && config ? config : {});\n\n if (!data) {\n data = new Modal(this, _config);\n $$$1(this).data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config](relatedTarget);\n } else if (_config.show) {\n data.show(relatedTarget);\n }\n });\n };\n\n _createClass(Modal, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }]);\n\n return Modal;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n var _this10 = this;\n\n var target;\n var selector = Util.getSelectorFromElement(this);\n\n if (selector) {\n target = document.querySelector(selector);\n }\n\n var config = $$$1(target).data(DATA_KEY) ? 'toggle' : _objectSpread({}, $$$1(target).data(), $$$1(this).data());\n\n if (this.tagName === 'A' || this.tagName === 'AREA') {\n event.preventDefault();\n }\n\n var $target = $$$1(target).one(Event.SHOW, function (showEvent) {\n if (showEvent.isDefaultPrevented()) {\n // Only register focus restorer if modal will actually get shown\n return;\n }\n\n $target.one(Event.HIDDEN, function () {\n if ($$$1(_this10).is(':visible')) {\n _this10.focus();\n }\n });\n });\n\n Modal._jQueryInterface.call($$$1(target), config, this);\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = Modal._jQueryInterface;\n $$$1.fn[NAME].Constructor = Modal;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Modal._jQueryInterface;\n };\n\n return Modal;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Tooltip = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'tooltip';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.tooltip';\n var EVENT_KEY = \".\" + DATA_KEY;\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var CLASS_PREFIX = 'bs-tooltip';\n var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n var DefaultType = {\n animation: 'boolean',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string',\n delay: '(number|object)',\n html: 'boolean',\n selector: '(string|boolean)',\n placement: '(string|function)',\n offset: '(number|string)',\n container: '(string|element|boolean)',\n fallbackPlacement: '(string|array)',\n boundary: '(string|element)'\n };\n var AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: 'right',\n BOTTOM: 'bottom',\n LEFT: 'left'\n };\n var Default = {\n animation: true,\n template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n selector: false,\n placement: 'top',\n offset: 0,\n container: false,\n fallbackPlacement: 'flip',\n boundary: 'scrollParent'\n };\n var HoverState = {\n SHOW: 'show',\n OUT: 'out'\n };\n var Event = {\n HIDE: \"hide\" + EVENT_KEY,\n HIDDEN: \"hidden\" + EVENT_KEY,\n SHOW: \"show\" + EVENT_KEY,\n SHOWN: \"shown\" + EVENT_KEY,\n INSERTED: \"inserted\" + EVENT_KEY,\n CLICK: \"click\" + EVENT_KEY,\n FOCUSIN: \"focusin\" + EVENT_KEY,\n FOCUSOUT: \"focusout\" + EVENT_KEY,\n MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n MOUSELEAVE: \"mouseleave\" + EVENT_KEY\n };\n var ClassName = {\n FADE: 'fade',\n SHOW: 'show'\n };\n var Selector = {\n TOOLTIP: '.tooltip',\n TOOLTIP_INNER: '.tooltip-inner',\n ARROW: '.arrow'\n };\n var Trigger = {\n HOVER: 'hover',\n FOCUS: 'focus',\n CLICK: 'click',\n MANUAL: 'manual'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Tooltip =\n /*#__PURE__*/\n function () {\n function Tooltip(element, config) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap tooltips require Popper.js (https://popper.js.org)');\n } // private\n\n\n this._isEnabled = true;\n this._timeout = 0;\n this._hoverState = '';\n this._activeTrigger = {};\n this._popper = null; // Protected\n\n this.element = element;\n this.config = this._getConfig(config);\n this.tip = null;\n\n this._setListeners();\n } // Getters\n\n\n var _proto = Tooltip.prototype;\n\n // Public\n _proto.enable = function enable() {\n this._isEnabled = true;\n };\n\n _proto.disable = function disable() {\n this._isEnabled = false;\n };\n\n _proto.toggleEnabled = function toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n };\n\n _proto.toggle = function toggle(event) {\n if (!this._isEnabled) {\n return;\n }\n\n if (event) {\n var dataKey = this.constructor.DATA_KEY;\n var context = $$$1(event.currentTarget).data(dataKey);\n\n if (!context) {\n context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n $$$1(event.currentTarget).data(dataKey, context);\n }\n\n context._activeTrigger.click = !context._activeTrigger.click;\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context);\n } else {\n context._leave(null, context);\n }\n } else {\n if ($$$1(this.getTipElement()).hasClass(ClassName.SHOW)) {\n this._leave(null, this);\n\n return;\n }\n\n this._enter(null, this);\n }\n };\n\n _proto.dispose = function dispose() {\n clearTimeout(this._timeout);\n $$$1.removeData(this.element, this.constructor.DATA_KEY);\n $$$1(this.element).off(this.constructor.EVENT_KEY);\n $$$1(this.element).closest('.modal').off('hide.bs.modal');\n\n if (this.tip) {\n $$$1(this.tip).remove();\n }\n\n this._isEnabled = null;\n this._timeout = null;\n this._hoverState = null;\n this._activeTrigger = null;\n\n if (this._popper !== null) {\n this._popper.destroy();\n }\n\n this._popper = null;\n this.element = null;\n this.config = null;\n this.tip = null;\n };\n\n _proto.show = function show() {\n var _this = this;\n\n if ($$$1(this.element).css('display') === 'none') {\n throw new Error('Please use show on visible elements');\n }\n\n var showEvent = $$$1.Event(this.constructor.Event.SHOW);\n\n if (this.isWithContent() && this._isEnabled) {\n $$$1(this.element).trigger(showEvent);\n var isInTheDom = $$$1.contains(this.element.ownerDocument.documentElement, this.element);\n\n if (showEvent.isDefaultPrevented() || !isInTheDom) {\n return;\n }\n\n var tip = this.getTipElement();\n var tipId = Util.getUID(this.constructor.NAME);\n tip.setAttribute('id', tipId);\n this.element.setAttribute('aria-describedby', tipId);\n this.setContent();\n\n if (this.config.animation) {\n $$$1(tip).addClass(ClassName.FADE);\n }\n\n var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n var attachment = this._getAttachment(placement);\n\n this.addAttachmentClass(attachment);\n var container = this.config.container === false ? document.body : $$$1(document).find(this.config.container);\n $$$1(tip).data(this.constructor.DATA_KEY, this);\n\n if (!$$$1.contains(this.element.ownerDocument.documentElement, this.tip)) {\n $$$1(tip).appendTo(container);\n }\n\n $$$1(this.element).trigger(this.constructor.Event.INSERTED);\n this._popper = new Popper(this.element, tip, {\n placement: attachment,\n modifiers: {\n offset: {\n offset: this.config.offset\n },\n flip: {\n behavior: this.config.fallbackPlacement\n },\n arrow: {\n element: Selector.ARROW\n },\n preventOverflow: {\n boundariesElement: this.config.boundary\n }\n },\n onCreate: function onCreate(data) {\n if (data.originalPlacement !== data.placement) {\n _this._handlePopperPlacementChange(data);\n }\n },\n onUpdate: function onUpdate(data) {\n _this._handlePopperPlacementChange(data);\n }\n });\n $$$1(tip).addClass(ClassName.SHOW); // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n if ('ontouchstart' in document.documentElement) {\n $$$1(document.body).children().on('mouseover', null, $$$1.noop);\n }\n\n var complete = function complete() {\n if (_this.config.animation) {\n _this._fixTransition();\n }\n\n var prevHoverState = _this._hoverState;\n _this._hoverState = null;\n $$$1(_this.element).trigger(_this.constructor.Event.SHOWN);\n\n if (prevHoverState === HoverState.OUT) {\n _this._leave(null, _this);\n }\n };\n\n if ($$$1(this.tip).hasClass(ClassName.FADE)) {\n var transitionDuration = Util.getTransitionDurationFromElement(this.tip);\n $$$1(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n } else {\n complete();\n }\n }\n };\n\n _proto.hide = function hide(callback) {\n var _this2 = this;\n\n var tip = this.getTipElement();\n var hideEvent = $$$1.Event(this.constructor.Event.HIDE);\n\n var complete = function complete() {\n if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {\n tip.parentNode.removeChild(tip);\n }\n\n _this2._cleanTipClass();\n\n _this2.element.removeAttribute('aria-describedby');\n\n $$$1(_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n if (_this2._popper !== null) {\n _this2._popper.destroy();\n }\n\n if (callback) {\n callback();\n }\n };\n\n $$$1(this.element).trigger(hideEvent);\n\n if (hideEvent.isDefaultPrevented()) {\n return;\n }\n\n $$$1(tip).removeClass(ClassName.SHOW); // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n\n if ('ontouchstart' in document.documentElement) {\n $$$1(document.body).children().off('mouseover', null, $$$1.noop);\n }\n\n this._activeTrigger[Trigger.CLICK] = false;\n this._activeTrigger[Trigger.FOCUS] = false;\n this._activeTrigger[Trigger.HOVER] = false;\n\n if ($$$1(this.tip).hasClass(ClassName.FADE)) {\n var transitionDuration = Util.getTransitionDurationFromElement(tip);\n $$$1(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n } else {\n complete();\n }\n\n this._hoverState = '';\n };\n\n _proto.update = function update() {\n if (this._popper !== null) {\n this._popper.scheduleUpdate();\n }\n }; // Protected\n\n\n _proto.isWithContent = function isWithContent() {\n return Boolean(this.getTitle());\n };\n\n _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n $$$1(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n };\n\n _proto.getTipElement = function getTipElement() {\n this.tip = this.tip || $$$1(this.config.template)[0];\n return this.tip;\n };\n\n _proto.setContent = function setContent() {\n var tip = this.getTipElement();\n this.setElementContent($$$1(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle());\n $$$1(tip).removeClass(ClassName.FADE + \" \" + ClassName.SHOW);\n };\n\n _proto.setElementContent = function setElementContent($element, content) {\n var html = this.config.html;\n\n if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n // Content is a DOM node or a jQuery\n if (html) {\n if (!$$$1(content).parent().is($element)) {\n $element.empty().append(content);\n }\n } else {\n $element.text($$$1(content).text());\n }\n } else {\n $element[html ? 'html' : 'text'](content);\n }\n };\n\n _proto.getTitle = function getTitle() {\n var title = this.element.getAttribute('data-original-title');\n\n if (!title) {\n title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n }\n\n return title;\n }; // Private\n\n\n _proto._getAttachment = function _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()];\n };\n\n _proto._setListeners = function _setListeners() {\n var _this3 = this;\n\n var triggers = this.config.trigger.split(' ');\n triggers.forEach(function (trigger) {\n if (trigger === 'click') {\n $$$1(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) {\n return _this3.toggle(event);\n });\n } else if (trigger !== Trigger.MANUAL) {\n var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;\n var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;\n $$$1(_this3.element).on(eventIn, _this3.config.selector, function (event) {\n return _this3._enter(event);\n }).on(eventOut, _this3.config.selector, function (event) {\n return _this3._leave(event);\n });\n }\n\n $$$1(_this3.element).closest('.modal').on('hide.bs.modal', function () {\n return _this3.hide();\n });\n });\n\n if (this.config.selector) {\n this.config = _objectSpread({}, this.config, {\n trigger: 'manual',\n selector: ''\n });\n } else {\n this._fixTitle();\n }\n };\n\n _proto._fixTitle = function _fixTitle() {\n var titleType = typeof this.element.getAttribute('data-original-title');\n\n if (this.element.getAttribute('title') || titleType !== 'string') {\n this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n this.element.setAttribute('title', '');\n }\n };\n\n _proto._enter = function _enter(event, context) {\n var dataKey = this.constructor.DATA_KEY;\n context = context || $$$1(event.currentTarget).data(dataKey);\n\n if (!context) {\n context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n $$$1(event.currentTarget).data(dataKey, context);\n }\n\n if (event) {\n context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\n }\n\n if ($$$1(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n context._hoverState = HoverState.SHOW;\n return;\n }\n\n clearTimeout(context._timeout);\n context._hoverState = HoverState.SHOW;\n\n if (!context.config.delay || !context.config.delay.show) {\n context.show();\n return;\n }\n\n context._timeout = setTimeout(function () {\n if (context._hoverState === HoverState.SHOW) {\n context.show();\n }\n }, context.config.delay.show);\n };\n\n _proto._leave = function _leave(event, context) {\n var dataKey = this.constructor.DATA_KEY;\n context = context || $$$1(event.currentTarget).data(dataKey);\n\n if (!context) {\n context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n $$$1(event.currentTarget).data(dataKey, context);\n }\n\n if (event) {\n context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\n }\n\n if (context._isWithActiveTrigger()) {\n return;\n }\n\n clearTimeout(context._timeout);\n context._hoverState = HoverState.OUT;\n\n if (!context.config.delay || !context.config.delay.hide) {\n context.hide();\n return;\n }\n\n context._timeout = setTimeout(function () {\n if (context._hoverState === HoverState.OUT) {\n context.hide();\n }\n }, context.config.delay.hide);\n };\n\n _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n for (var trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true;\n }\n }\n\n return false;\n };\n\n _proto._getConfig = function _getConfig(config) {\n config = _objectSpread({}, this.constructor.Default, $$$1(this.element).data(), typeof config === 'object' && config ? config : {});\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n\n Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\n return config;\n };\n\n _proto._getDelegateConfig = function _getDelegateConfig() {\n var config = {};\n\n if (this.config) {\n for (var key in this.config) {\n if (this.constructor.Default[key] !== this.config[key]) {\n config[key] = this.config[key];\n }\n }\n }\n\n return config;\n };\n\n _proto._cleanTipClass = function _cleanTipClass() {\n var $tip = $$$1(this.getTipElement());\n var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n if (tabClass !== null && tabClass.length) {\n $tip.removeClass(tabClass.join(''));\n }\n };\n\n _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {\n var popperInstance = popperData.instance;\n this.tip = popperInstance.popper;\n\n this._cleanTipClass();\n\n this.addAttachmentClass(this._getAttachment(popperData.placement));\n };\n\n _proto._fixTransition = function _fixTransition() {\n var tip = this.getTipElement();\n var initConfigAnimation = this.config.animation;\n\n if (tip.getAttribute('x-placement') !== null) {\n return;\n }\n\n $$$1(tip).removeClass(ClassName.FADE);\n this.config.animation = false;\n this.hide();\n this.show();\n this.config.animation = initConfigAnimation;\n }; // Static\n\n\n Tooltip._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $$$1(this).data(DATA_KEY);\n\n var _config = typeof config === 'object' && config;\n\n if (!data && /dispose|hide/.test(config)) {\n return;\n }\n\n if (!data) {\n data = new Tooltip(this, _config);\n $$$1(this).data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(Tooltip, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }, {\n key: \"NAME\",\n get: function get() {\n return NAME;\n }\n }, {\n key: \"DATA_KEY\",\n get: function get() {\n return DATA_KEY;\n }\n }, {\n key: \"Event\",\n get: function get() {\n return Event;\n }\n }, {\n key: \"EVENT_KEY\",\n get: function get() {\n return EVENT_KEY;\n }\n }, {\n key: \"DefaultType\",\n get: function get() {\n return DefaultType;\n }\n }]);\n\n return Tooltip;\n }();\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n\n $$$1.fn[NAME] = Tooltip._jQueryInterface;\n $$$1.fn[NAME].Constructor = Tooltip;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Tooltip._jQueryInterface;\n };\n\n return Tooltip;\n }($, Popper);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Popover = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'popover';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.popover';\n var EVENT_KEY = \".\" + DATA_KEY;\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var CLASS_PREFIX = 'bs-popover';\n var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n\n var Default = _objectSpread({}, Tooltip.Default, {\n placement: 'right',\n trigger: 'click',\n content: '',\n template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n });\n\n var DefaultType = _objectSpread({}, Tooltip.DefaultType, {\n content: '(string|element|function)'\n });\n\n var ClassName = {\n FADE: 'fade',\n SHOW: 'show'\n };\n var Selector = {\n TITLE: '.popover-header',\n CONTENT: '.popover-body'\n };\n var Event = {\n HIDE: \"hide\" + EVENT_KEY,\n HIDDEN: \"hidden\" + EVENT_KEY,\n SHOW: \"show\" + EVENT_KEY,\n SHOWN: \"shown\" + EVENT_KEY,\n INSERTED: \"inserted\" + EVENT_KEY,\n CLICK: \"click\" + EVENT_KEY,\n FOCUSIN: \"focusin\" + EVENT_KEY,\n FOCUSOUT: \"focusout\" + EVENT_KEY,\n MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n MOUSELEAVE: \"mouseleave\" + EVENT_KEY\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Popover =\n /*#__PURE__*/\n function (_Tooltip) {\n _inheritsLoose(Popover, _Tooltip);\n\n function Popover() {\n return _Tooltip.apply(this, arguments) || this;\n }\n\n var _proto = Popover.prototype;\n\n // Overrides\n _proto.isWithContent = function isWithContent() {\n return this.getTitle() || this._getContent();\n };\n\n _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n $$$1(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n };\n\n _proto.getTipElement = function getTipElement() {\n this.tip = this.tip || $$$1(this.config.template)[0];\n return this.tip;\n };\n\n _proto.setContent = function setContent() {\n var $tip = $$$1(this.getTipElement()); // We use append for html objects to maintain js events\n\n this.setElementContent($tip.find(Selector.TITLE), this.getTitle());\n\n var content = this._getContent();\n\n if (typeof content === 'function') {\n content = content.call(this.element);\n }\n\n this.setElementContent($tip.find(Selector.CONTENT), content);\n $tip.removeClass(ClassName.FADE + \" \" + ClassName.SHOW);\n }; // Private\n\n\n _proto._getContent = function _getContent() {\n return this.element.getAttribute('data-content') || this.config.content;\n };\n\n _proto._cleanTipClass = function _cleanTipClass() {\n var $tip = $$$1(this.getTipElement());\n var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n if (tabClass !== null && tabClass.length > 0) {\n $tip.removeClass(tabClass.join(''));\n }\n }; // Static\n\n\n Popover._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $$$1(this).data(DATA_KEY);\n\n var _config = typeof config === 'object' ? config : null;\n\n if (!data && /destroy|hide/.test(config)) {\n return;\n }\n\n if (!data) {\n data = new Popover(this, _config);\n $$$1(this).data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(Popover, null, [{\n key: \"VERSION\",\n // Getters\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }, {\n key: \"NAME\",\n get: function get() {\n return NAME;\n }\n }, {\n key: \"DATA_KEY\",\n get: function get() {\n return DATA_KEY;\n }\n }, {\n key: \"Event\",\n get: function get() {\n return Event;\n }\n }, {\n key: \"EVENT_KEY\",\n get: function get() {\n return EVENT_KEY;\n }\n }, {\n key: \"DefaultType\",\n get: function get() {\n return DefaultType;\n }\n }]);\n\n return Popover;\n }(Tooltip);\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n\n $$$1.fn[NAME] = Popover._jQueryInterface;\n $$$1.fn[NAME].Constructor = Popover;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Popover._jQueryInterface;\n };\n\n return Popover;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var ScrollSpy = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'scrollspy';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.scrollspy';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var Default = {\n offset: 10,\n method: 'auto',\n target: ''\n };\n var DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n };\n var Event = {\n ACTIVATE: \"activate\" + EVENT_KEY,\n SCROLL: \"scroll\" + EVENT_KEY,\n LOAD_DATA_API: \"load\" + EVENT_KEY + DATA_API_KEY\n };\n var ClassName = {\n DROPDOWN_ITEM: 'dropdown-item',\n DROPDOWN_MENU: 'dropdown-menu',\n ACTIVE: 'active'\n };\n var Selector = {\n DATA_SPY: '[data-spy=\"scroll\"]',\n ACTIVE: '.active',\n NAV_LIST_GROUP: '.nav, .list-group',\n NAV_LINKS: '.nav-link',\n NAV_ITEMS: '.nav-item',\n LIST_ITEMS: '.list-group-item',\n DROPDOWN: '.dropdown',\n DROPDOWN_ITEMS: '.dropdown-item',\n DROPDOWN_TOGGLE: '.dropdown-toggle'\n };\n var OffsetMethod = {\n OFFSET: 'offset',\n POSITION: 'position'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var ScrollSpy =\n /*#__PURE__*/\n function () {\n function ScrollSpy(element, config) {\n var _this = this;\n\n this._element = element;\n this._scrollElement = element.tagName === 'BODY' ? window : element;\n this._config = this._getConfig(config);\n this._selector = this._config.target + \" \" + Selector.NAV_LINKS + \",\" + (this._config.target + \" \" + Selector.LIST_ITEMS + \",\") + (this._config.target + \" \" + Selector.DROPDOWN_ITEMS);\n this._offsets = [];\n this._targets = [];\n this._activeTarget = null;\n this._scrollHeight = 0;\n $$$1(this._scrollElement).on(Event.SCROLL, function (event) {\n return _this._process(event);\n });\n this.refresh();\n\n this._process();\n } // Getters\n\n\n var _proto = ScrollSpy.prototype;\n\n // Public\n _proto.refresh = function refresh() {\n var _this2 = this;\n\n var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;\n var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\n this._offsets = [];\n this._targets = [];\n this._scrollHeight = this._getScrollHeight();\n var targets = [].slice.call(document.querySelectorAll(this._selector));\n targets.map(function (element) {\n var target;\n var targetSelector = Util.getSelectorFromElement(element);\n\n if (targetSelector) {\n target = document.querySelector(targetSelector);\n }\n\n if (target) {\n var targetBCR = target.getBoundingClientRect();\n\n if (targetBCR.width || targetBCR.height) {\n // TODO (fat): remove sketch reliance on jQuery position/offset\n return [$$$1(target)[offsetMethod]().top + offsetBase, targetSelector];\n }\n }\n\n return null;\n }).filter(function (item) {\n return item;\n }).sort(function (a, b) {\n return a[0] - b[0];\n }).forEach(function (item) {\n _this2._offsets.push(item[0]);\n\n _this2._targets.push(item[1]);\n });\n };\n\n _proto.dispose = function dispose() {\n $$$1.removeData(this._element, DATA_KEY);\n $$$1(this._scrollElement).off(EVENT_KEY);\n this._element = null;\n this._scrollElement = null;\n this._config = null;\n this._selector = null;\n this._offsets = null;\n this._targets = null;\n this._activeTarget = null;\n this._scrollHeight = null;\n }; // Private\n\n\n _proto._getConfig = function _getConfig(config) {\n config = _objectSpread({}, Default, typeof config === 'object' && config ? config : {});\n\n if (typeof config.target !== 'string') {\n var id = $$$1(config.target).attr('id');\n\n if (!id) {\n id = Util.getUID(NAME);\n $$$1(config.target).attr('id', id);\n }\n\n config.target = \"#\" + id;\n }\n\n Util.typeCheckConfig(NAME, config, DefaultType);\n return config;\n };\n\n _proto._getScrollTop = function _getScrollTop() {\n return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n };\n\n _proto._getScrollHeight = function _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n };\n\n _proto._getOffsetHeight = function _getOffsetHeight() {\n return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n };\n\n _proto._process = function _process() {\n var scrollTop = this._getScrollTop() + this._config.offset;\n\n var scrollHeight = this._getScrollHeight();\n\n var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh();\n }\n\n if (scrollTop >= maxScroll) {\n var target = this._targets[this._targets.length - 1];\n\n if (this._activeTarget !== target) {\n this._activate(target);\n }\n\n return;\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null;\n\n this._clear();\n\n return;\n }\n\n var offsetLength = this._offsets.length;\n\n for (var i = offsetLength; i--;) {\n var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n if (isActiveTarget) {\n this._activate(this._targets[i]);\n }\n }\n };\n\n _proto._activate = function _activate(target) {\n this._activeTarget = target;\n\n this._clear();\n\n var queries = this._selector.split(','); // eslint-disable-next-line arrow-body-style\n\n\n queries = queries.map(function (selector) {\n return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + (selector + \"[href=\\\"\" + target + \"\\\"]\");\n });\n var $link = $$$1([].slice.call(document.querySelectorAll(queries.join(','))));\n\n if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);\n $link.addClass(ClassName.ACTIVE);\n } else {\n // Set triggered link as active\n $link.addClass(ClassName.ACTIVE); // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_LINKS + \", \" + Selector.LIST_ITEMS).addClass(ClassName.ACTIVE); // Handle special case when .nav-link is inside .nav-item\n\n $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);\n }\n\n $$$1(this._scrollElement).trigger(Event.ACTIVATE, {\n relatedTarget: target\n });\n };\n\n _proto._clear = function _clear() {\n var nodes = [].slice.call(document.querySelectorAll(this._selector));\n $$$1(nodes).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);\n }; // Static\n\n\n ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $$$1(this).data(DATA_KEY);\n\n var _config = typeof config === 'object' && config;\n\n if (!data) {\n data = new ScrollSpy(this, _config);\n $$$1(this).data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(ScrollSpy, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }]);\n\n return ScrollSpy;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(window).on(Event.LOAD_DATA_API, function () {\n var scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY));\n var scrollSpysLength = scrollSpys.length;\n\n for (var i = scrollSpysLength; i--;) {\n var $spy = $$$1(scrollSpys[i]);\n\n ScrollSpy._jQueryInterface.call($spy, $spy.data());\n }\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = ScrollSpy._jQueryInterface;\n $$$1.fn[NAME].Constructor = ScrollSpy;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return ScrollSpy._jQueryInterface;\n };\n\n return ScrollSpy;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n var Tab = function ($$$1) {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n var NAME = 'tab';\n var VERSION = '4.1.2';\n var DATA_KEY = 'bs.tab';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n var Event = {\n HIDE: \"hide\" + EVENT_KEY,\n HIDDEN: \"hidden\" + EVENT_KEY,\n SHOW: \"show\" + EVENT_KEY,\n SHOWN: \"shown\" + EVENT_KEY,\n CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n };\n var ClassName = {\n DROPDOWN_MENU: 'dropdown-menu',\n ACTIVE: 'active',\n DISABLED: 'disabled',\n FADE: 'fade',\n SHOW: 'show'\n };\n var Selector = {\n DROPDOWN: '.dropdown',\n NAV_LIST_GROUP: '.nav, .list-group',\n ACTIVE: '.active',\n ACTIVE_UL: '> li > .active',\n DATA_TOGGLE: '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n DROPDOWN_TOGGLE: '.dropdown-toggle',\n DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n };\n\n var Tab =\n /*#__PURE__*/\n function () {\n function Tab(element) {\n this._element = element;\n } // Getters\n\n\n var _proto = Tab.prototype;\n\n // Public\n _proto.show = function show() {\n var _this = this;\n\n if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $$$1(this._element).hasClass(ClassName.ACTIVE) || $$$1(this._element).hasClass(ClassName.DISABLED)) {\n return;\n }\n\n var target;\n var previous;\n var listElement = $$$1(this._element).closest(Selector.NAV_LIST_GROUP)[0];\n var selector = Util.getSelectorFromElement(this._element);\n\n if (listElement) {\n var itemSelector = listElement.nodeName === 'UL' ? Selector.ACTIVE_UL : Selector.ACTIVE;\n previous = $$$1.makeArray($$$1(listElement).find(itemSelector));\n previous = previous[previous.length - 1];\n }\n\n var hideEvent = $$$1.Event(Event.HIDE, {\n relatedTarget: this._element\n });\n var showEvent = $$$1.Event(Event.SHOW, {\n relatedTarget: previous\n });\n\n if (previous) {\n $$$1(previous).trigger(hideEvent);\n }\n\n $$$1(this._element).trigger(showEvent);\n\n if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n return;\n }\n\n if (selector) {\n target = document.querySelector(selector);\n }\n\n this._activate(this._element, listElement);\n\n var complete = function complete() {\n var hiddenEvent = $$$1.Event(Event.HIDDEN, {\n relatedTarget: _this._element\n });\n var shownEvent = $$$1.Event(Event.SHOWN, {\n relatedTarget: previous\n });\n $$$1(previous).trigger(hiddenEvent);\n $$$1(_this._element).trigger(shownEvent);\n };\n\n if (target) {\n this._activate(target, target.parentNode, complete);\n } else {\n complete();\n }\n };\n\n _proto.dispose = function dispose() {\n $$$1.removeData(this._element, DATA_KEY);\n this._element = null;\n }; // Private\n\n\n _proto._activate = function _activate(element, container, callback) {\n var _this2 = this;\n\n var activeElements;\n\n if (container.nodeName === 'UL') {\n activeElements = $$$1(container).find(Selector.ACTIVE_UL);\n } else {\n activeElements = $$$1(container).children(Selector.ACTIVE);\n }\n\n var active = activeElements[0];\n var isTransitioning = callback && active && $$$1(active).hasClass(ClassName.FADE);\n\n var complete = function complete() {\n return _this2._transitionComplete(element, active, callback);\n };\n\n if (active && isTransitioning) {\n var transitionDuration = Util.getTransitionDurationFromElement(active);\n $$$1(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n } else {\n complete();\n }\n };\n\n _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n if (active) {\n $$$1(active).removeClass(ClassName.SHOW + \" \" + ClassName.ACTIVE);\n var dropdownChild = $$$1(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];\n\n if (dropdownChild) {\n $$$1(dropdownChild).removeClass(ClassName.ACTIVE);\n }\n\n if (active.getAttribute('role') === 'tab') {\n active.setAttribute('aria-selected', false);\n }\n }\n\n $$$1(element).addClass(ClassName.ACTIVE);\n\n if (element.getAttribute('role') === 'tab') {\n element.setAttribute('aria-selected', true);\n }\n\n Util.reflow(element);\n $$$1(element).addClass(ClassName.SHOW);\n\n if (element.parentNode && $$$1(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\n var dropdownElement = $$$1(element).closest(Selector.DROPDOWN)[0];\n\n if (dropdownElement) {\n var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE));\n $$$1(dropdownToggleList).addClass(ClassName.ACTIVE);\n }\n\n element.setAttribute('aria-expanded', true);\n }\n\n if (callback) {\n callback();\n }\n }; // Static\n\n\n Tab._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var $this = $$$1(this);\n var data = $this.data(DATA_KEY);\n\n if (!data) {\n data = new Tab(this);\n $this.data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(Tab, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }]);\n\n return Tab;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault();\n\n Tab._jQueryInterface.call($$$1(this), 'show');\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $$$1.fn[NAME] = Tab._jQueryInterface;\n $$$1.fn[NAME].Constructor = Tab;\n\n $$$1.fn[NAME].noConflict = function () {\n $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n return Tab._jQueryInterface;\n };\n\n return Tab;\n }($);\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n (function ($$$1) {\n if (typeof $$$1 === 'undefined') {\n throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n }\n\n var version = $$$1.fn.jquery.split(' ')[0].split('.');\n var minMajor = 1;\n var ltMajor = 2;\n var minMinor = 9;\n var minPatch = 1;\n var maxMajor = 4;\n\n if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n }\n })($);\n\n exports.Util = Util;\n exports.Alert = Alert;\n exports.Button = Button;\n exports.Carousel = Carousel;\n exports.Collapse = Collapse;\n exports.Dropdown = Dropdown;\n exports.Modal = Modal;\n exports.Popover = Popover;\n exports.Scrollspy = ScrollSpy;\n exports.Tab = Tab;\n exports.Tooltip = Tooltip;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=bootstrap.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2Rpc3QvanMvYm9vdHN0cmFwLmpzPzJiNzIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxDQUFDLHFDQUFxQzs7QUFFdEM7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixrQkFBa0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFO0FBQ2xFOztBQUVBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQsU0FBUzs7QUFFVDtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQSxxRUFBcUU7O0FBRXJFO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQzs7QUFFaEMsaUNBQWlDOztBQUVqQyxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPOzs7QUFHUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWU7QUFDZixhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBOztBQUVBLHdDQUF3Qzs7QUFFeEM7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUEsNkNBQTZDLFNBQVM7QUFDdEQ7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdEQUFnRCxTQUFTO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBOztBQUVBO0FB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UjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSw2Q0FBNkMsU0FBUztBQUN0RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdHQUFnRzs7QUFFaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsRUFBRTs7QUFFWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUyxFQUFFOztBQUVYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDLGdGQUFnRjs7QUFFeEg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDRFQUE0RTs7QUFFNUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTzs7QUFFUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87OztBQUdQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTOztBQUVUO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUMseUdBQXlHOztBQUUxSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUwsc0NBQXNDO0FBQ3RDO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhDQUE4Qzs7QUFFOUM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBLE9BQU87OztBQUdQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBLGlDQUFpQyw2REFBNkQ7O0FBRTlGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsa0NBQWtDLEtBQUs7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLGdEQUFnRDs7O0FBR2hEO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsMkNBQTJDO0FBQzNDOztBQUVBLGtJQUFrSTs7QUFFbEk7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0MsS0FBSztBQUN6Qzs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnREFBZ0QsY0FBYzs7QUFFOUQsQ0FBQztBQUNEIiwiZmlsZSI6IjUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAgKiBCb290c3RyYXAgdjQuMS4yIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMTggVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdqcXVlcnknKSwgcmVxdWlyZSgncG9wcGVyLmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdqcXVlcnknLCAncG9wcGVyLmpzJ10sIGZhY3RvcnkpIDpcbiAgKGZhY3RvcnkoKGdsb2JhbC5ib290c3RyYXAgPSB7fSksZ2xvYmFsLmpRdWVyeSxnbG9iYWwuUG9wcGVyKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cywkLFBvcHBlcikgeyAndXNlIHN0cmljdCc7XG5cbiAgJCA9ICQgJiYgJC5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdCcpID8gJFsnZGVmYXVsdCddIDogJDtcbiAgUG9wcGVyID0gUG9wcGVyICYmIFBvcHBlci5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdCcpID8gUG9wcGVyWydkZWZhdWx0J10gOiBQb3BwZXI7XG5cbiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9XG5cbiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgICB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG5cbiAgICAgIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcbiAgICBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuMS4yKTogdXRpbC5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgVXRpbCA9IGZ1bmN0aW9uICgkJCQxKSB7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogUHJpdmF0ZSBUcmFuc2l0aW9uRW5kIEhlbHBlcnNcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cbiAgICB2YXIgVFJBTlNJVElPTl9FTkQgPSAndHJhbnNpdGlvbmVuZCc7XG4gICAgdmFyIE1BWF9VSUQgPSAxMDAwMDAwO1xuICAgIHZhciBNSUxMSVNFQ09ORFNfTVVMVElQTElFUiA9IDEwMDA7IC8vIFNob3V0b3V0IEFuZ3VzQ3JvbGwgKGh0dHBzOi8vZ29vLmdsL3B4d1FHcClcblxuICAgIGZ1bmN0aW9uIHRvVHlwZShvYmopIHtcbiAgICAgIHJldHVybiB7fS50b1N0cmluZy5jYWxsKG9iaikubWF0Y2goL1xccyhbYS16XSspL2kpWzFdLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U3BlY2lhbFRyYW5zaXRpb25FbmRFdmVudCgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJpbmRUeXBlOiBUUkFOU0lUSU9OX0VORCxcbiAgICAgICAgZGVsZWdhdGVUeXBlOiBUUkFOU0lUSU9OX0VORCxcbiAgICAgICAgaGFuZGxlOiBmdW5jdGlvbiBoYW5kbGUoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoJCQkMShldmVudC50YXJnZXQpLmlzKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnQuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25FbmRFbXVsYXRvcihkdXJhdGlvbikge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICAgICAgJCQkMSh0aGlzKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgICBVdGlsLnRyaWdnZXJUcmFuc2l0aW9uRW5kKF90aGlzKTtcbiAgICAgICAgfVxuICAgICAgfSwgZHVyYXRpb24pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0VHJhbnNpdGlvbkVuZFN1cHBvcnQoKSB7XG4gICAgICAkJCQxLmZuLmVtdWxhdGVUcmFuc2l0aW9uRW5kID0gdHJhbnNpdGlvbkVuZEVtdWxhdG9yO1xuICAgICAgJCQkMS5ldmVudC5zcGVjaWFsW1V0aWwuVFJBTlNJVElPTl9FTkRdID0gZ2V0U3BlY2lhbFRyYW5zaXRpb25FbmRFdmVudCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIFB1YmxpYyBVdGlsIEFwaVxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG5cblxuICAgIHZhciBVdGlsID0ge1xuICAgICAgVFJBTlNJVElPTl9FTkQ6ICdic1RyYW5zaXRpb25FbmQnLFxuICAgICAgZ2V0VUlEOiBmdW5jdGlvbiBnZXRVSUQocHJlZml4KSB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgICAgICAgIHByZWZpeCArPSB+fihNYXRoLnJhbmRvbSgpICogTUFYX1VJRCk7IC8vIFwifn5cIiBhY3RzIGxpa2UgYSBmYXN0ZXIgTWF0aC5mbG9vcigpIGhlcmVcbiAgICAgICAgfSB3aGlsZSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHJlZml4KSk7XG5cbiAgICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICAgIH0sXG4gICAgICBnZXRTZWxlY3RvckZyb21FbGVtZW50OiBmdW5jdGlvbiBnZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGFyZ2V0Jyk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gJyMnKSB7XG4gICAgICAgICAgc2VsZWN0b3IgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpIHx8ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgPyBzZWxlY3RvciA6IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQ6IGZ1bmN0aW9uIGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0gLy8gR2V0IHRyYW5zaXRpb24tZHVyYXRpb24gb2YgdGhlIGVsZW1lbnRcblxuXG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSAkJCQxKGVsZW1lbnQpLmNzcygndHJhbnNpdGlvbi1kdXJhdGlvbicpO1xuICAgICAgICB2YXIgZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gPSBwYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbik7IC8vIFJldHVybiAwIGlmIGVsZW1lbnQgb3IgdHJhbnNpdGlvbiBkdXJhdGlvbiBpcyBub3QgZm91bmRcblxuICAgICAgICBpZiAoIWZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0gLy8gSWYgbXVsdGlwbGUgZHVyYXRpb25zIGFyZSBkZWZpbmVkLCB0YWtlIHRoZSBmaXJzdFxuXG5cbiAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uLnNwbGl0KCcsJylbMF07XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbikgKiBNSUxMSVNFQ09ORFNfTVVMVElQTElFUjtcbiAgICAgIH0sXG4gICAgICByZWZsb3c6IGZ1bmN0aW9uIHJlZmxvdyhlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgIH0sXG4gICAgICB0cmlnZ2VyVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24gdHJpZ2dlclRyYW5zaXRpb25FbmQoZWxlbWVudCkge1xuICAgICAgICAkJCQxKGVsZW1lbnQpLnRyaWdnZXIoVFJBTlNJVElPTl9FTkQpO1xuICAgICAgfSxcbiAgICAgIC8vIFRPRE86IFJlbW92ZSBpbiB2NVxuICAgICAgc3VwcG9ydHNUcmFuc2l0aW9uRW5kOiBmdW5jdGlvbiBzdXBwb3J0c1RyYW5zaXRpb25FbmQoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKFRSQU5TSVRJT05fRU5EKTtcbiAgICAgIH0sXG4gICAgICBpc0VsZW1lbnQ6IGZ1bmN0aW9uIGlzRWxlbWVudChvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmpbMF0gfHwgb2JqKS5ub2RlVHlwZTtcbiAgICAgIH0sXG4gICAgICB0eXBlQ2hlY2tDb25maWc6IGZ1bmN0aW9uIHR5cGVDaGVja0NvbmZpZyhjb21wb25lbnROYW1lLCBjb25maWcsIGNvbmZpZ1R5cGVzKSB7XG4gICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGNvbmZpZ1R5cGVzKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWdUeXBlcywgcHJvcGVydHkpKSB7XG4gICAgICAgICAgICB2YXIgZXhwZWN0ZWRUeXBlcyA9IGNvbmZpZ1R5cGVzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbmZpZ1twcm9wZXJ0eV07XG4gICAgICAgICAgICB2YXIgdmFsdWVUeXBlID0gdmFsdWUgJiYgVXRpbC5pc0VsZW1lbnQodmFsdWUpID8gJ2VsZW1lbnQnIDogdG9UeXBlKHZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKCFuZXcgUmVnRXhwKGV4cGVjdGVkVHlwZXMpLnRlc3QodmFsdWVUeXBlKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY29tcG9uZW50TmFtZS50b1VwcGVyQ2FzZSgpICsgXCI6IFwiICsgKFwiT3B0aW9uIFxcXCJcIiArIHByb3BlcnR5ICsgXCJcXFwiIHByb3ZpZGVkIHR5cGUgXFxcIlwiICsgdmFsdWVUeXBlICsgXCJcXFwiIFwiKSArIChcImJ1dCBleHBlY3RlZCB0eXBlIFxcXCJcIiArIGV4cGVjdGVkVHlwZXMgKyBcIlxcXCIuXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHNldFRyYW5zaXRpb25FbmRTdXBwb3J0KCk7XG4gICAgcmV0dXJuIFV0aWw7XG4gIH0oJCk7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuMS4yKTogYWxlcnQuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIEFsZXJ0ID0gZnVuY3Rpb24gKCQkJDEpIHtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBDb25zdGFudHNcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cbiAgICB2YXIgTkFNRSA9ICdhbGVydCc7XG4gICAgdmFyIFZFUlNJT04gPSAnNC4xLjInO1xuICAgIHZhciBEQVRBX0tFWSA9ICdicy5hbGVydCc7XG4gICAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gICAgdmFyIERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknO1xuICAgIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkJCQxLmZuW05BTUVdO1xuICAgIHZhciBTZWxlY3RvciA9IHtcbiAgICAgIERJU01JU1M6ICdbZGF0YS1kaXNtaXNzPVwiYWxlcnRcIl0nXG4gICAgfTtcbiAgICB2YXIgRXZlbnQgPSB7XG4gICAgICBDTE9TRTogXCJjbG9zZVwiICsgRVZFTlRfS0VZLFxuICAgICAgQ0xPU0VEOiBcImNsb3NlZFwiICsgRVZFTlRfS0VZLFxuICAgICAgQ0xJQ0tfREFUQV9BUEk6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWVxuICAgIH07XG4gICAgdmFyIENsYXNzTmFtZSA9IHtcbiAgICAgIEFMRVJUOiAnYWxlcnQnLFxuICAgICAgRkFERTogJ2ZhZGUnLFxuICAgICAgU0hPVzogJ3Nob3cnXG4gICAgICAvKipcbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgKi9cblxuICAgIH07XG5cbiAgICB2YXIgQWxlcnQgPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBBbGVydChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgICAgdmFyIF9wcm90byA9IEFsZXJ0LnByb3RvdHlwZTtcblxuICAgICAgLy8gUHVibGljXG4gICAgICBfcHJvdG8uY2xvc2UgPSBmdW5jdGlvbiBjbG9zZShlbGVtZW50KSB7XG4gICAgICAgIHZhciByb290RWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICByb290RWxlbWVudCA9IHRoaXMuX2dldFJvb3RFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGN1c3RvbUV2ZW50ID0gdGhpcy5fdHJpZ2dlckNsb3NlRXZlbnQocm9vdEVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChjdXN0b21FdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JlbW92ZUVsZW1lbnQocm9vdEVsZW1lbnQpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICAkJCQxLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgIH07IC8vIFByaXZhdGVcblxuXG4gICAgICBfcHJvdG8uX2dldFJvb3RFbGVtZW50ID0gZnVuY3Rpb24gX2dldFJvb3RFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB2YXIgcGFyZW50ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgIHBhcmVudCA9ICQkJDEoZWxlbWVudCkuY2xvc2VzdChcIi5cIiArIENsYXNzTmFtZS5BTEVSVClbMF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl90cmlnZ2VyQ2xvc2VFdmVudCA9IGZ1bmN0aW9uIF90cmlnZ2VyQ2xvc2VFdmVudChlbGVtZW50KSB7XG4gICAgICAgIHZhciBjbG9zZUV2ZW50ID0gJCQkMS5FdmVudChFdmVudC5DTE9TRSk7XG4gICAgICAgICQkJDEoZWxlbWVudCkudHJpZ2dlcihjbG9zZUV2ZW50KTtcbiAgICAgICAgcmV0dXJuIGNsb3NlRXZlbnQ7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX3JlbW92ZUVsZW1lbnQgPSBmdW5jdGlvbiBfcmVtb3ZlRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgJCQkMShlbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG5cbiAgICAgICAgaWYgKCEkJCQxKGVsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKSkge1xuICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICQkJDEoZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5fZGVzdHJveUVsZW1lbnQoZWxlbWVudCwgZXZlbnQpO1xuICAgICAgICB9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9kZXN0cm95RWxlbWVudCA9IGZ1bmN0aW9uIF9kZXN0cm95RWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgICQkJDEoZWxlbWVudCkuZGV0YWNoKCkudHJpZ2dlcihFdmVudC5DTE9TRUQpLnJlbW92ZSgpO1xuICAgICAgfTsgLy8gU3RhdGljXG5cblxuICAgICAgQWxlcnQuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAkZWxlbWVudCA9ICQkJDEodGhpcyk7XG4gICAgICAgICAgdmFyIGRhdGEgPSAkZWxlbWVudC5kYXRhKERBVEFfS0VZKTtcblxuICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgZGF0YSA9IG5ldyBBbGVydCh0aGlzKTtcbiAgICAgICAgICAgICRlbGVtZW50LmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb25maWcgPT09ICdjbG9zZScpIHtcbiAgICAgICAgICAgIGRhdGFbY29uZmlnXSh0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgQWxlcnQuX2hhbmRsZURpc21pc3MgPSBmdW5jdGlvbiBfaGFuZGxlRGlzbWlzcyhhbGVydEluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWxlcnRJbnN0YW5jZS5jbG9zZSh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgIH07XG5cbiAgICAgIF9jcmVhdGVDbGFzcyhBbGVydCwgbnVsbCwgW3tcbiAgICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIFZFUlNJT047XG4gICAgICAgIH1cbiAgICAgIH1dKTtcblxuICAgICAgcmV0dXJuIEFsZXJ0O1xuICAgIH0oKTtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG5cbiAgICAkJCQxKGRvY3VtZW50KS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuRElTTUlTUywgQWxlcnQuX2hhbmRsZURpc21pc3MobmV3IEFsZXJ0KCkpKTtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBqUXVlcnlcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuICAgICQkJDEuZm5bTkFNRV0gPSBBbGVydC5falF1ZXJ5SW50ZXJmYWNlO1xuICAgICQkJDEuZm5bTkFNRV0uQ29uc3RydWN0b3IgPSBBbGVydDtcblxuICAgICQkJDEuZm5bTkFNRV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICQkJDEuZm5bTkFNRV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgICByZXR1cm4gQWxlcnQuX2pRdWVyeUludGVyZmFjZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEFsZXJ0O1xuICB9KCQpO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgKHY0LjEuMik6IGJ1dHRvbi5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgQnV0dG9uID0gZnVuY3Rpb24gKCQkJDEpIHtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBDb25zdGFudHNcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cbiAgICB2YXIgTkFNRSA9ICdidXR0b24nO1xuICAgIHZhciBWRVJTSU9OID0gJzQuMS4yJztcbiAgICB2YXIgREFUQV9LRVkgPSAnYnMuYnV0dG9uJztcbiAgICB2YXIgRVZFTlRfS0VZID0gXCIuXCIgKyBEQVRBX0tFWTtcbiAgICB2YXIgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSc7XG4gICAgdmFyIEpRVUVSWV9OT19DT05GTElDVCA9ICQkJDEuZm5bTkFNRV07XG4gICAgdmFyIENsYXNzTmFtZSA9IHtcbiAgICAgIEFDVElWRTogJ2FjdGl2ZScsXG4gICAgICBCVVRUT046ICdidG4nLFxuICAgICAgRk9DVVM6ICdmb2N1cydcbiAgICB9O1xuICAgIHZhciBTZWxlY3RvciA9IHtcbiAgICAgIERBVEFfVE9HR0xFX0NBUlJPVDogJ1tkYXRhLXRvZ2dsZV49XCJidXR0b25cIl0nLFxuICAgICAgREFUQV9UT0dHTEU6ICdbZGF0YS10b2dnbGU9XCJidXR0b25zXCJdJyxcbiAgICAgIElOUFVUOiAnaW5wdXQnLFxuICAgICAgQUNUSVZFOiAnLmFjdGl2ZScsXG4gICAgICBCVVRUT046ICcuYnRuJ1xuICAgIH07XG4gICAgdmFyIEV2ZW50ID0ge1xuICAgICAgQ0xJQ0tfREFUQV9BUEk6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWSxcbiAgICAgIEZPQ1VTX0JMVVJfREFUQV9BUEk6IFwiZm9jdXNcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWSArIFwiIFwiICsgKFwiYmx1clwiICsgRVZFTlRfS0VZICsgREFUQV9BUElfS0VZKVxuICAgICAgLyoqXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAqIENsYXNzIERlZmluaXRpb25cbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICovXG5cbiAgICB9O1xuXG4gICAgdmFyIEJ1dHRvbiA9XG4gICAgLyojX19QVVJFX18qL1xuICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIEJ1dHRvbihlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgICAgdmFyIF9wcm90byA9IEJ1dHRvbi5wcm90b3R5cGU7XG5cbiAgICAgIC8vIFB1YmxpY1xuICAgICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgICAgdmFyIHRyaWdnZXJDaGFuZ2VFdmVudCA9IHRydWU7XG4gICAgICAgIHZhciBhZGRBcmlhUHJlc3NlZCA9IHRydWU7XG4gICAgICAgIHZhciByb290RWxlbWVudCA9ICQkJDEodGhpcy5fZWxlbWVudCkuY2xvc2VzdChTZWxlY3Rvci5EQVRBX1RPR0dMRSlbMF07XG5cbiAgICAgICAgaWYgKHJvb3RFbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGlucHV0ID0gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNlbGVjdG9yLklOUFVUKTtcblxuICAgICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICAgICAgaWYgKGlucHV0LmNoZWNrZWQgJiYgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ2xhc3NOYW1lLkFDVElWRSkpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyQ2hhbmdlRXZlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgYWN0aXZlRWxlbWVudCA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU2VsZWN0b3IuQUNUSVZFKTtcblxuICAgICAgICAgICAgICAgIGlmIChhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAkJCQxKGFjdGl2ZUVsZW1lbnQpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgICAgIGlmIChpbnB1dC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHwgcm9vdEVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpIHx8IGlucHV0LmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSB8fCByb290RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gIXRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgICAgICAgICAkJCQxKGlucHV0KS50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICAgIGFkZEFyaWFQcmVzc2VkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFkZEFyaWFQcmVzc2VkKSB7XG4gICAgICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDbGFzc05hbWUuQUNUSVZFKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJpZ2dlckNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS50b2dnbGVDbGFzcyhDbGFzc05hbWUuQUNUSVZFKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICAkJCQxLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgIH07IC8vIFN0YXRpY1xuXG5cbiAgICAgIEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0gbmV3IEJ1dHRvbih0aGlzKTtcbiAgICAgICAgICAgICQkJDEodGhpcykuZGF0YShEQVRBX0tFWSwgZGF0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvbmZpZyA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBfY3JlYXRlQ2xhc3MoQnV0dG9uLCBudWxsLCBbe1xuICAgICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gVkVSU0lPTjtcbiAgICAgICAgfVxuICAgICAgfV0pO1xuXG4gICAgICByZXR1cm4gQnV0dG9uO1xuICAgIH0oKTtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG5cbiAgICAkJCQxKGRvY3VtZW50KS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuREFUQV9UT0dHTEVfQ0FSUk9ULCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2YXIgYnV0dG9uID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICBpZiAoISQkJDEoYnV0dG9uKS5oYXNDbGFzcyhDbGFzc05hbWUuQlVUVE9OKSkge1xuICAgICAgICBidXR0b24gPSAkJCQxKGJ1dHRvbikuY2xvc2VzdChTZWxlY3Rvci5CVVRUT04pO1xuICAgICAgfVxuXG4gICAgICBCdXR0b24uX2pRdWVyeUludGVyZmFjZS5jYWxsKCQkJDEoYnV0dG9uKSwgJ3RvZ2dsZScpO1xuICAgIH0pLm9uKEV2ZW50LkZPQ1VTX0JMVVJfREFUQV9BUEksIFNlbGVjdG9yLkRBVEFfVE9HR0xFX0NBUlJPVCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgYnV0dG9uID0gJCQkMShldmVudC50YXJnZXQpLmNsb3Nlc3QoU2VsZWN0b3IuQlVUVE9OKVswXTtcbiAgICAgICQkJDEoYnV0dG9uKS50b2dnbGVDbGFzcyhDbGFzc05hbWUuRk9DVVMsIC9eZm9jdXMoaW4pPyQvLnRlc3QoZXZlbnQudHlwZSkpO1xuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIGpRdWVyeVxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG4gICAgJCQkMS5mbltOQU1FXSA9IEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlO1xuICAgICQkJDEuZm5bTkFNRV0uQ29uc3RydWN0b3IgPSBCdXR0b247XG5cbiAgICAkJCQxLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAkJCQxLmZuW05BTUVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgICAgcmV0dXJuIEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlO1xuICAgIH07XG5cbiAgICByZXR1cm4gQnV0dG9uO1xuICB9KCQpO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgKHY0LjEuMik6IGNhcm91c2VsLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBDYXJvdXNlbCA9IGZ1bmN0aW9uICgkJCQxKSB7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogQ29uc3RhbnRzXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG4gICAgdmFyIE5BTUUgPSAnY2Fyb3VzZWwnO1xuICAgIHZhciBWRVJTSU9OID0gJzQuMS4yJztcbiAgICB2YXIgREFUQV9LRVkgPSAnYnMuY2Fyb3VzZWwnO1xuICAgIHZhciBFVkVOVF9LRVkgPSBcIi5cIiArIERBVEFfS0VZO1xuICAgIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUID0gJCQkMS5mbltOQU1FXTtcbiAgICB2YXIgQVJST1dfTEVGVF9LRVlDT0RFID0gMzc7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIGxlZnQgYXJyb3cga2V5XG5cbiAgICB2YXIgQVJST1dfUklHSFRfS0VZQ09ERSA9IDM5OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciByaWdodCBhcnJvdyBrZXlcblxuICAgIHZhciBUT1VDSEVWRU5UX0NPTVBBVF9XQUlUID0gNTAwOyAvLyBUaW1lIGZvciBtb3VzZSBjb21wYXQgZXZlbnRzIHRvIGZpcmUgYWZ0ZXIgdG91Y2hcblxuICAgIHZhciBEZWZhdWx0ID0ge1xuICAgICAgaW50ZXJ2YWw6IDUwMDAsXG4gICAgICBrZXlib2FyZDogdHJ1ZSxcbiAgICAgIHNsaWRlOiBmYWxzZSxcbiAgICAgIHBhdXNlOiAnaG92ZXInLFxuICAgICAgd3JhcDogdHJ1ZVxuICAgIH07XG4gICAgdmFyIERlZmF1bHRUeXBlID0ge1xuICAgICAgaW50ZXJ2YWw6ICcobnVtYmVyfGJvb2xlYW4pJyxcbiAgICAgIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gICAgICBzbGlkZTogJyhib29sZWFufHN0cmluZyknLFxuICAgICAgcGF1c2U6ICcoc3RyaW5nfGJvb2xlYW4pJyxcbiAgICAgIHdyYXA6ICdib29sZWFuJ1xuICAgIH07XG4gICAgdmFyIERpcmVjdGlvbiA9IHtcbiAgICAgIE5FWFQ6ICduZXh0JyxcbiAgICAgIFBSRVY6ICdwcmV2JyxcbiAgICAgIExFRlQ6ICdsZWZ0JyxcbiAgICAgIFJJR0hUOiAncmlnaHQnXG4gICAgfTtcbiAgICB2YXIgRXZlbnQgPSB7XG4gICAgICBTTElERTogXCJzbGlkZVwiICsgRVZFTlRfS0VZLFxuICAgICAgU0xJRDogXCJzbGlkXCIgKyBFVkVOVF9LRVksXG4gICAgICBLRVlET1dOOiBcImtleWRvd25cIiArIEVWRU5UX0tFWSxcbiAgICAgIE1PVVNFRU5URVI6IFwibW91c2VlbnRlclwiICsgRVZFTlRfS0VZLFxuICAgICAgTU9VU0VMRUFWRTogXCJtb3VzZWxlYXZlXCIgKyBFVkVOVF9LRVksXG4gICAgICBUT1VDSEVORDogXCJ0b3VjaGVuZFwiICsgRVZFTlRfS0VZLFxuICAgICAgTE9BRF9EQVRBX0FQSTogXCJsb2FkXCIgKyBFVkVOVF9LRVkgKyBEQVRBX0FQSV9LRVksXG4gICAgICBDTElDS19EQVRBX0FQSTogXCJjbGlja1wiICsgRVZFTlRfS0VZICsgREFUQV9BUElfS0VZXG4gICAgfTtcbiAgICB2YXIgQ2xhc3NOYW1lID0ge1xuICAgICAgQ0FST1VTRUw6ICdjYXJvdXNlbCcsXG4gICAgICBBQ1RJVkU6ICdhY3RpdmUnLFxuICAgICAgU0xJREU6ICdzbGlkZScsXG4gICAgICBSSUdIVDogJ2Nhcm91c2VsLWl0ZW0tcmlnaHQnLFxuICAgICAgTEVGVDogJ2Nhcm91c2VsLWl0ZW0tbGVmdCcsXG4gICAgICBORVhUOiAnY2Fyb3VzZWwtaXRlbS1uZXh0JyxcbiAgICAgIFBSRVY6ICdjYXJvdXNlbC1pdGVtLXByZXYnLFxuICAgICAgSVRFTTogJ2Nhcm91c2VsLWl0ZW0nXG4gICAgfTtcbiAgICB2YXIgU2VsZWN0b3IgPSB7XG4gICAgICBBQ1RJVkU6ICcuYWN0aXZlJyxcbiAgICAgIEFDVElWRV9JVEVNOiAnLmFjdGl2ZS5jYXJvdXNlbC1pdGVtJyxcbiAgICAgIElURU06ICcuY2Fyb3VzZWwtaXRlbScsXG4gICAgICBORVhUX1BSRVY6ICcuY2Fyb3VzZWwtaXRlbS1uZXh0LCAuY2Fyb3VzZWwtaXRlbS1wcmV2JyxcbiAgICAgIElORElDQVRPUlM6ICcuY2Fyb3VzZWwtaW5kaWNhdG9ycycsXG4gICAgICBEQVRBX1NMSURFOiAnW2RhdGEtc2xpZGVdLCBbZGF0YS1zbGlkZS10b10nLFxuICAgICAgREFUQV9SSURFOiAnW2RhdGEtcmlkZT1cImNhcm91c2VsXCJdJ1xuICAgICAgLyoqXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAqIENsYXNzIERlZmluaXRpb25cbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICovXG5cbiAgICB9O1xuXG4gICAgdmFyIENhcm91c2VsID1cbiAgICAvKiNfX1BVUkVfXyovXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gQ2Fyb3VzZWwoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zID0gbnVsbDtcbiAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5faXNQYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG91Y2hUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSAkJCQxKGVsZW1lbnQpWzBdO1xuICAgICAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihTZWxlY3Rvci5JTkRJQ0FUT1JTKTtcblxuICAgICAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpO1xuICAgICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgICAgdmFyIF9wcm90byA9IENhcm91c2VsLnByb3RvdHlwZTtcblxuICAgICAgLy8gUHVibGljXG4gICAgICBfcHJvdG8ubmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICAgICAgdGhpcy5fc2xpZGUoRGlyZWN0aW9uLk5FWFQpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8ubmV4dFdoZW5WaXNpYmxlID0gZnVuY3Rpb24gbmV4dFdoZW5WaXNpYmxlKCkge1xuICAgICAgICAvLyBEb24ndCBjYWxsIG5leHQgd2hlbiB0aGUgcGFnZSBpc24ndCB2aXNpYmxlXG4gICAgICAgIC8vIG9yIHRoZSBjYXJvdXNlbCBvciBpdHMgcGFyZW50IGlzbid0IHZpc2libGVcbiAgICAgICAgaWYgKCFkb2N1bWVudC5oaWRkZW4gJiYgJCQkMSh0aGlzLl9lbGVtZW50KS5pcygnOnZpc2libGUnKSAmJiAkJCQxKHRoaXMuX2VsZW1lbnQpLmNzcygndmlzaWJpbGl0eScpICE9PSAnaGlkZGVuJykge1xuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8ucHJldiA9IGZ1bmN0aW9uIHByZXYoKSB7XG4gICAgICAgIGlmICghdGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICAgICAgdGhpcy5fc2xpZGUoRGlyZWN0aW9uLlBSRVYpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8ucGF1c2UgPSBmdW5jdGlvbiBwYXVzZShldmVudCkge1xuICAgICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5faXNQYXVzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihTZWxlY3Rvci5ORVhUX1BSRVYpKSB7XG4gICAgICAgICAgVXRpbC50cmlnZ2VyVHJhbnNpdGlvbkVuZCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgICB0aGlzLmN5Y2xlKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCk7XG4gICAgICAgIHRoaXMuX2ludGVydmFsID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5jeWNsZSA9IGZ1bmN0aW9uIGN5Y2xlKGV2ZW50KSB7XG4gICAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgICB0aGlzLl9pc1BhdXNlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2ludGVydmFsKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCk7XG4gICAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5pbnRlcnZhbCAmJiAhdGhpcy5faXNQYXVzZWQpIHtcbiAgICAgICAgICB0aGlzLl9pbnRlcnZhbCA9IHNldEludGVydmFsKChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPyB0aGlzLm5leHRXaGVuVmlzaWJsZSA6IHRoaXMubmV4dCkuYmluZCh0aGlzKSwgdGhpcy5fY29uZmlnLmludGVydmFsKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnRvID0gZnVuY3Rpb24gdG8oaW5kZXgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNlbGVjdG9yLkFDVElWRV9JVEVNKTtcblxuICAgICAgICB2YXIgYWN0aXZlSW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgodGhpcy5fYWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgaWYgKGluZGV4ID4gdGhpcy5faXRlbXMubGVuZ3RoIC0gMSB8fCBpbmRleCA8IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS5vbmUoRXZlbnQuU0xJRCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnRvKGluZGV4KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWN0aXZlSW5kZXggPT09IGluZGV4KSB7XG4gICAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgICAgIHRoaXMuY3ljbGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGlyZWN0aW9uID0gaW5kZXggPiBhY3RpdmVJbmRleCA/IERpcmVjdGlvbi5ORVhUIDogRGlyZWN0aW9uLlBSRVY7XG5cbiAgICAgICAgdGhpcy5fc2xpZGUoZGlyZWN0aW9uLCB0aGlzLl9pdGVtc1tpbmRleF0pO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLm9mZihFVkVOVF9LRVkpO1xuICAgICAgICAkJCQxLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgICB0aGlzLl9pdGVtcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2lzUGF1c2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2luZGljYXRvcnNFbGVtZW50ID0gbnVsbDtcbiAgICAgIH07IC8vIFByaXZhdGVcblxuXG4gICAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZyA9IF9vYmplY3RTcHJlYWQoe30sIERlZmF1bHQsIGNvbmZpZyk7XG4gICAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUsIGNvbmZpZywgRGVmYXVsdFR5cGUpO1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9hZGRFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5rZXlib2FyZCkge1xuICAgICAgICAgICQkJDEodGhpcy5fZWxlbWVudCkub24oRXZlbnQuS0VZRE9XTiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9rZXlkb3duKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcucGF1c2UgPT09ICdob3ZlcicpIHtcbiAgICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLm9uKEV2ZW50Lk1PVVNFRU5URVIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5wYXVzZShldmVudCk7XG4gICAgICAgICAgfSkub24oRXZlbnQuTU9VU0VMRUFWRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMyLmN5Y2xlKGV2ZW50KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIElmIGl0J3MgYSB0b3VjaC1lbmFibGVkIGRldmljZSwgbW91c2VlbnRlci9sZWF2ZSBhcmUgZmlyZWQgYXNcbiAgICAgICAgICAgIC8vIHBhcnQgb2YgdGhlIG1vdXNlIGNvbXBhdGliaWxpdHkgZXZlbnRzIG9uIGZpcnN0IHRhcCAtIHRoZSBjYXJvdXNlbFxuICAgICAgICAgICAgLy8gd291bGQgc3RvcCBjeWNsaW5nIHVudGlsIHVzZXIgdGFwcGVkIG91dCBvZiBpdDtcbiAgICAgICAgICAgIC8vIGhlcmUsIHdlIGxpc3RlbiBmb3IgdG91Y2hlbmQsIGV4cGxpY2l0bHkgcGF1c2UgdGhlIGNhcm91c2VsXG4gICAgICAgICAgICAvLyAoYXMgaWYgaXQncyB0aGUgc2Vjb25kIHRpbWUgd2UgdGFwIG9uIGl0LCBtb3VzZWVudGVyIGNvbXBhdCBldmVudFxuICAgICAgICAgICAgLy8gaXMgTk9UIGZpcmVkKSBhbmQgYWZ0ZXIgYSB0aW1lb3V0ICh0byBhbGxvdyBmb3IgbW91c2UgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgLy8gZXZlbnRzIHRvIGZpcmUpIHdlIGV4cGxpY2l0bHkgcmVzdGFydCBjeWNsaW5nXG4gICAgICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLm9uKEV2ZW50LlRPVUNIRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIF90aGlzMi5wYXVzZSgpO1xuXG4gICAgICAgICAgICAgIGlmIChfdGhpczIudG91Y2hUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzMi50b3VjaFRpbWVvdXQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgX3RoaXMyLnRvdWNoVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5jeWNsZShldmVudCk7XG4gICAgICAgICAgICAgIH0sIFRPVUNIRVZFTlRfQ09NUEFUX1dBSVQgKyBfdGhpczIuX2NvbmZpZy5pbnRlcnZhbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fa2V5ZG93biA9IGZ1bmN0aW9uIF9rZXlkb3duKGV2ZW50KSB7XG4gICAgICAgIGlmICgvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcbiAgICAgICAgICBjYXNlIEFSUk9XX0xFRlRfS0VZQ09ERTpcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnByZXYoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBBUlJPV19SSUdIVF9LRVlDT0RFOlxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2dldEl0ZW1JbmRleCA9IGZ1bmN0aW9uIF9nZXRJdGVtSW5kZXgoZWxlbWVudCkge1xuICAgICAgICB0aGlzLl9pdGVtcyA9IGVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnROb2RlID8gW10uc2xpY2UuY2FsbChlbGVtZW50LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbChTZWxlY3Rvci5JVEVNKSkgOiBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmluZGV4T2YoZWxlbWVudCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2dldEl0ZW1CeURpcmVjdGlvbiA9IGZ1bmN0aW9uIF9nZXRJdGVtQnlEaXJlY3Rpb24oZGlyZWN0aW9uLCBhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgIHZhciBpc05leHREaXJlY3Rpb24gPSBkaXJlY3Rpb24gPT09IERpcmVjdGlvbi5ORVhUO1xuICAgICAgICB2YXIgaXNQcmV2RGlyZWN0aW9uID0gZGlyZWN0aW9uID09PSBEaXJlY3Rpb24uUFJFVjtcblxuICAgICAgICB2YXIgYWN0aXZlSW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgoYWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgdmFyIGxhc3RJdGVtSW5kZXggPSB0aGlzLl9pdGVtcy5sZW5ndGggLSAxO1xuICAgICAgICB2YXIgaXNHb2luZ1RvV3JhcCA9IGlzUHJldkRpcmVjdGlvbiAmJiBhY3RpdmVJbmRleCA9PT0gMCB8fCBpc05leHREaXJlY3Rpb24gJiYgYWN0aXZlSW5kZXggPT09IGxhc3RJdGVtSW5kZXg7XG5cbiAgICAgICAgaWYgKGlzR29pbmdUb1dyYXAgJiYgIXRoaXMuX2NvbmZpZy53cmFwKSB7XG4gICAgICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGVsdGEgPSBkaXJlY3Rpb24gPT09IERpcmVjdGlvbi5QUkVWID8gLTEgOiAxO1xuICAgICAgICB2YXIgaXRlbUluZGV4ID0gKGFjdGl2ZUluZGV4ICsgZGVsdGEpICUgdGhpcy5faXRlbXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gaXRlbUluZGV4ID09PSAtMSA/IHRoaXMuX2l0ZW1zW3RoaXMuX2l0ZW1zLmxlbmd0aCAtIDFdIDogdGhpcy5faXRlbXNbaXRlbUluZGV4XTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fdHJpZ2dlclNsaWRlRXZlbnQgPSBmdW5jdGlvbiBfdHJpZ2dlclNsaWRlRXZlbnQocmVsYXRlZFRhcmdldCwgZXZlbnREaXJlY3Rpb25OYW1lKSB7XG4gICAgICAgIHZhciB0YXJnZXRJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleChyZWxhdGVkVGFyZ2V0KTtcblxuICAgICAgICB2YXIgZnJvbUluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihTZWxlY3Rvci5BQ1RJVkVfSVRFTSkpO1xuXG4gICAgICAgIHZhciBzbGlkZUV2ZW50ID0gJCQkMS5FdmVudChFdmVudC5TTElERSwge1xuICAgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRUYXJnZXQsXG4gICAgICAgICAgZGlyZWN0aW9uOiBldmVudERpcmVjdGlvbk5hbWUsXG4gICAgICAgICAgZnJvbTogZnJvbUluZGV4LFxuICAgICAgICAgIHRvOiB0YXJnZXRJbmRleFxuICAgICAgICB9KTtcbiAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNsaWRlRXZlbnQpO1xuICAgICAgICByZXR1cm4gc2xpZGVFdmVudDtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudCA9IGZ1bmN0aW9uIF9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2luZGljYXRvcnNFbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGluZGljYXRvcnMgPSBbXS5zbGljZS5jYWxsKHRoaXMuX2luZGljYXRvcnNFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU2VsZWN0b3IuQUNUSVZFKSk7XG4gICAgICAgICAgJCQkMShpbmRpY2F0b3JzKS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQUNUSVZFKTtcblxuICAgICAgICAgIHZhciBuZXh0SW5kaWNhdG9yID0gdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQuY2hpbGRyZW5bdGhpcy5fZ2V0SXRlbUluZGV4KGVsZW1lbnQpXTtcblxuICAgICAgICAgIGlmIChuZXh0SW5kaWNhdG9yKSB7XG4gICAgICAgICAgICAkJCQxKG5leHRJbmRpY2F0b3IpLmFkZENsYXNzKENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9zbGlkZSA9IGZ1bmN0aW9uIF9zbGlkZShkaXJlY3Rpb24sIGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU2VsZWN0b3IuQUNUSVZFX0lURU0pO1xuXG4gICAgICAgIHZhciBhY3RpdmVFbGVtZW50SW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgoYWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgdmFyIG5leHRFbGVtZW50ID0gZWxlbWVudCB8fCBhY3RpdmVFbGVtZW50ICYmIHRoaXMuX2dldEl0ZW1CeURpcmVjdGlvbihkaXJlY3Rpb24sIGFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgIHZhciBuZXh0RWxlbWVudEluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KG5leHRFbGVtZW50KTtcblxuICAgICAgICB2YXIgaXNDeWNsaW5nID0gQm9vbGVhbih0aGlzLl9pbnRlcnZhbCk7XG4gICAgICAgIHZhciBkaXJlY3Rpb25hbENsYXNzTmFtZTtcbiAgICAgICAgdmFyIG9yZGVyQ2xhc3NOYW1lO1xuICAgICAgICB2YXIgZXZlbnREaXJlY3Rpb25OYW1lO1xuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IERpcmVjdGlvbi5ORVhUKSB7XG4gICAgICAgICAgZGlyZWN0aW9uYWxDbGFzc05hbWUgPSBDbGFzc05hbWUuTEVGVDtcbiAgICAgICAgICBvcmRlckNsYXNzTmFtZSA9IENsYXNzTmFtZS5ORVhUO1xuICAgICAgICAgIGV2ZW50RGlyZWN0aW9uTmFtZSA9IERpcmVjdGlvbi5MRUZUO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpcmVjdGlvbmFsQ2xhc3NOYW1lID0gQ2xhc3NOYW1lLlJJR0hUO1xuICAgICAgICAgIG9yZGVyQ2xhc3NOYW1lID0gQ2xhc3NOYW1lLlBSRVY7XG4gICAgICAgICAgZXZlbnREaXJlY3Rpb25OYW1lID0gRGlyZWN0aW9uLlJJR0hUO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRFbGVtZW50ICYmICQkJDEobmV4dEVsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5BQ1RJVkUpKSB7XG4gICAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNsaWRlRXZlbnQgPSB0aGlzLl90cmlnZ2VyU2xpZGVFdmVudChuZXh0RWxlbWVudCwgZXZlbnREaXJlY3Rpb25OYW1lKTtcblxuICAgICAgICBpZiAoc2xpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCAhbmV4dEVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBTb21lIHdlaXJkbmVzcyBpcyBoYXBwZW5pbmcsIHNvIHdlIGJhaWxcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KG5leHRFbGVtZW50KTtcblxuICAgICAgICB2YXIgc2xpZEV2ZW50ID0gJCQkMS5FdmVudChFdmVudC5TTElELCB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogbmV4dEVsZW1lbnQsXG4gICAgICAgICAgZGlyZWN0aW9uOiBldmVudERpcmVjdGlvbk5hbWUsXG4gICAgICAgICAgZnJvbTogYWN0aXZlRWxlbWVudEluZGV4LFxuICAgICAgICAgIHRvOiBuZXh0RWxlbWVudEluZGV4XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICgkJCQxKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5TTElERSkpIHtcbiAgICAgICAgICAkJCQxKG5leHRFbGVtZW50KS5hZGRDbGFzcyhvcmRlckNsYXNzTmFtZSk7XG4gICAgICAgICAgVXRpbC5yZWZsb3cobmV4dEVsZW1lbnQpO1xuICAgICAgICAgICQkJDEoYWN0aXZlRWxlbWVudCkuYWRkQ2xhc3MoZGlyZWN0aW9uYWxDbGFzc05hbWUpO1xuICAgICAgICAgICQkJDEobmV4dEVsZW1lbnQpLmFkZENsYXNzKGRpcmVjdGlvbmFsQ2xhc3NOYW1lKTtcbiAgICAgICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChhY3RpdmVFbGVtZW50KTtcbiAgICAgICAgICAkJCQxKGFjdGl2ZUVsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkJCQxKG5leHRFbGVtZW50KS5yZW1vdmVDbGFzcyhkaXJlY3Rpb25hbENsYXNzTmFtZSArIFwiIFwiICsgb3JkZXJDbGFzc05hbWUpLmFkZENsYXNzKENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgICAgICAgJCQkMShhY3RpdmVFbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQUNUSVZFICsgXCIgXCIgKyBvcmRlckNsYXNzTmFtZSArIFwiIFwiICsgZGlyZWN0aW9uYWxDbGFzc05hbWUpO1xuICAgICAgICAgICAgX3RoaXMzLl9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gJCQkMShfdGhpczMuX2VsZW1lbnQpLnRyaWdnZXIoc2xpZEV2ZW50KTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgIH0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJCQkMShhY3RpdmVFbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQUNUSVZFKTtcbiAgICAgICAgICAkJCQxKG5leHRFbGVtZW50KS5hZGRDbGFzcyhDbGFzc05hbWUuQUNUSVZFKTtcbiAgICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoc2xpZEV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgICAgICB0aGlzLmN5Y2xlKCk7XG4gICAgICAgIH1cbiAgICAgIH07IC8vIFN0YXRpY1xuXG5cbiAgICAgIENhcm91c2VsLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9ICQkJDEodGhpcykuZGF0YShEQVRBX0tFWSk7XG5cbiAgICAgICAgICB2YXIgX2NvbmZpZyA9IF9vYmplY3RTcHJlYWQoe30sIERlZmF1bHQsICQkJDEodGhpcykuZGF0YSgpKTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgX2NvbmZpZyA9IF9vYmplY3RTcHJlYWQoe30sIF9jb25maWcsIGNvbmZpZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGFjdGlvbiA9IHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnID8gY29uZmlnIDogX2NvbmZpZy5zbGlkZTtcblxuICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgZGF0YSA9IG5ldyBDYXJvdXNlbCh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAgICQkJDEodGhpcykuZGF0YShEQVRBX0tFWSwgZGF0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBkYXRhLnRvKGNvbmZpZyk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2FjdGlvbl0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgYWN0aW9uICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2FjdGlvbl0oKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKF9jb25maWcuaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIGRhdGEucGF1c2UoKTtcbiAgICAgICAgICAgIGRhdGEuY3ljbGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgQ2Fyb3VzZWwuX2RhdGFBcGlDbGlja0hhbmRsZXIgPSBmdW5jdGlvbiBfZGF0YUFwaUNsaWNrSGFuZGxlcihldmVudCkge1xuICAgICAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodGhpcyk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0YXJnZXQgPSAkJCQxKHNlbGVjdG9yKVswXTtcblxuICAgICAgICBpZiAoIXRhcmdldCB8fCAhJCQkMSh0YXJnZXQpLmhhc0NsYXNzKENsYXNzTmFtZS5DQVJPVVNFTCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY29uZmlnID0gX29iamVjdFNwcmVhZCh7fSwgJCQkMSh0YXJnZXQpLmRhdGEoKSwgJCQkMSh0aGlzKS5kYXRhKCkpO1xuXG4gICAgICAgIHZhciBzbGlkZUluZGV4ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2xpZGUtdG8nKTtcblxuICAgICAgICBpZiAoc2xpZGVJbmRleCkge1xuICAgICAgICAgIGNvbmZpZy5pbnRlcnZhbCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgQ2Fyb3VzZWwuX2pRdWVyeUludGVyZmFjZS5jYWxsKCQkJDEodGFyZ2V0KSwgY29uZmlnKTtcblxuICAgICAgICBpZiAoc2xpZGVJbmRleCkge1xuICAgICAgICAgICQkJDEodGFyZ2V0KS5kYXRhKERBVEFfS0VZKS50byhzbGlkZUluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9O1xuXG4gICAgICBfY3JlYXRlQ2xhc3MoQ2Fyb3VzZWwsIG51bGwsIFt7XG4gICAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBWRVJTSU9OO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBEZWZhdWx0O1xuICAgICAgICB9XG4gICAgICB9XSk7XG5cbiAgICAgIHJldHVybiBDYXJvdXNlbDtcbiAgICB9KCk7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuXG4gICAgJCQkMShkb2N1bWVudCkub24oRXZlbnQuQ0xJQ0tfREFUQV9BUEksIFNlbGVjdG9yLkRBVEFfU0xJREUsIENhcm91c2VsLl9kYXRhQXBpQ2xpY2tIYW5kbGVyKTtcbiAgICAkJCQxKHdpbmRvdykub24oRXZlbnQuTE9BRF9EQVRBX0FQSSwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNhcm91c2VscyA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTZWxlY3Rvci5EQVRBX1JJREUpKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNhcm91c2Vscy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgJGNhcm91c2VsID0gJCQkMShjYXJvdXNlbHNbaV0pO1xuXG4gICAgICAgIENhcm91c2VsLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkY2Fyb3VzZWwsICRjYXJvdXNlbC5kYXRhKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIGpRdWVyeVxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG4gICAgJCQkMS5mbltOQU1FXSA9IENhcm91c2VsLl9qUXVlcnlJbnRlcmZhY2U7XG4gICAgJCQkMS5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IENhcm91c2VsO1xuXG4gICAgJCQkMS5mbltOQU1FXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgJCQkMS5mbltOQU1FXSA9IEpRVUVSWV9OT19DT05GTElDVDtcbiAgICAgIHJldHVybiBDYXJvdXNlbC5falF1ZXJ5SW50ZXJmYWNlO1xuICAgIH07XG5cbiAgICByZXR1cm4gQ2Fyb3VzZWw7XG4gIH0oJCk7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuMS4yKTogY29sbGFwc2UuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIENvbGxhcHNlID0gZnVuY3Rpb24gKCQkJDEpIHtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBDb25zdGFudHNcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cbiAgICB2YXIgTkFNRSA9ICdjb2xsYXBzZSc7XG4gICAgdmFyIFZFUlNJT04gPSAnNC4xLjInO1xuICAgIHZhciBEQVRBX0tFWSA9ICdicy5jb2xsYXBzZSc7XG4gICAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gICAgdmFyIERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknO1xuICAgIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkJCQxLmZuW05BTUVdO1xuICAgIHZhciBEZWZhdWx0ID0ge1xuICAgICAgdG9nZ2xlOiB0cnVlLFxuICAgICAgcGFyZW50OiAnJ1xuICAgIH07XG4gICAgdmFyIERlZmF1bHRUeXBlID0ge1xuICAgICAgdG9nZ2xlOiAnYm9vbGVhbicsXG4gICAgICBwYXJlbnQ6ICcoc3RyaW5nfGVsZW1lbnQpJ1xuICAgIH07XG4gICAgdmFyIEV2ZW50ID0ge1xuICAgICAgU0hPVzogXCJzaG93XCIgKyBFVkVOVF9LRVksXG4gICAgICBTSE9XTjogXCJzaG93blwiICsgRVZFTlRfS0VZLFxuICAgICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVksXG4gICAgICBISURERU46IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVksXG4gICAgICBDTElDS19EQVRBX0FQSTogXCJjbGlja1wiICsgRVZFTlRfS0VZICsgREFUQV9BUElfS0VZXG4gICAgfTtcbiAgICB2YXIgQ2xhc3NOYW1lID0ge1xuICAgICAgU0hPVzogJ3Nob3cnLFxuICAgICAgQ09MTEFQU0U6ICdjb2xsYXBzZScsXG4gICAgICBDT0xMQVBTSU5HOiAnY29sbGFwc2luZycsXG4gICAgICBDT0xMQVBTRUQ6ICdjb2xsYXBzZWQnXG4gICAgfTtcbiAgICB2YXIgRGltZW5zaW9uID0ge1xuICAgICAgV0lEVEg6ICd3aWR0aCcsXG4gICAgICBIRUlHSFQ6ICdoZWlnaHQnXG4gICAgfTtcbiAgICB2YXIgU2VsZWN0b3IgPSB7XG4gICAgICBBQ1RJVkVTOiAnLnNob3csIC5jb2xsYXBzaW5nJyxcbiAgICAgIERBVEFfVE9HR0xFOiAnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nXG4gICAgICAvKipcbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgKi9cblxuICAgIH07XG5cbiAgICB2YXIgQ29sbGFwc2UgPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBDb2xsYXBzZShlbGVtZW50LCBjb25maWcpIHtcbiAgICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gJCQkMS5tYWtlQXJyYXkoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLXRvZ2dsZT1cXFwiY29sbGFwc2VcXFwiXVtocmVmPVxcXCIjXCIgKyBlbGVtZW50LmlkICsgXCJcXFwiXSxcIiArIChcIltkYXRhLXRvZ2dsZT1cXFwiY29sbGFwc2VcXFwiXVtkYXRhLXRhcmdldD1cXFwiI1wiICsgZWxlbWVudC5pZCArIFwiXFxcIl1cIikpKTtcbiAgICAgICAgdmFyIHRvZ2dsZUxpc3QgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU2VsZWN0b3IuREFUQV9UT0dHTEUpKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdG9nZ2xlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIHZhciBlbGVtID0gdG9nZ2xlTGlzdFtpXTtcbiAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbSk7XG4gICAgICAgICAgdmFyIGZpbHRlckVsZW1lbnQgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKS5maWx0ZXIoZnVuY3Rpb24gKGZvdW5kRWxlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvdW5kRWxlbSA9PT0gZWxlbWVudDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzZWxlY3RvciAhPT0gbnVsbCAmJiBmaWx0ZXJFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG5cbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJBcnJheS5wdXNoKGVsZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BhcmVudCA9IHRoaXMuX2NvbmZpZy5wYXJlbnQgPyB0aGlzLl9nZXRQYXJlbnQoKSA6IG51bGw7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX2VsZW1lbnQsIHRoaXMuX3RyaWdnZXJBcnJheSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLnRvZ2dsZSkge1xuICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICAgIHZhciBfcHJvdG8gPSBDb2xsYXBzZS5wcm90b3R5cGU7XG5cbiAgICAgIC8vIFB1YmxpY1xuICAgICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgICAgaWYgKCQkJDEodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpKSB7XG4gICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICQkJDEodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFjdGl2ZXM7XG4gICAgICAgIHZhciBhY3RpdmVzRGF0YTtcblxuICAgICAgICBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICAgICAgYWN0aXZlcyA9IFtdLnNsaWNlLmNhbGwodGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU2VsZWN0b3IuQUNUSVZFUykpLmZpbHRlcihmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXBhcmVudCcpID09PSBfdGhpcy5fY29uZmlnLnBhcmVudDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChhY3RpdmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgYWN0aXZlcyA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGl2ZXMpIHtcbiAgICAgICAgICBhY3RpdmVzRGF0YSA9ICQkJDEoYWN0aXZlcykubm90KHRoaXMuX3NlbGVjdG9yKS5kYXRhKERBVEFfS0VZKTtcblxuICAgICAgICAgIGlmIChhY3RpdmVzRGF0YSAmJiBhY3RpdmVzRGF0YS5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0YXJ0RXZlbnQgPSAkJCQxLkV2ZW50KEV2ZW50LlNIT1cpO1xuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoc3RhcnRFdmVudCk7XG5cbiAgICAgICAgaWYgKHN0YXJ0RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWN0aXZlcykge1xuICAgICAgICAgIENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkJCQxKGFjdGl2ZXMpLm5vdCh0aGlzLl9zZWxlY3RvciksICdoaWRlJyk7XG5cbiAgICAgICAgICBpZiAoIWFjdGl2ZXNEYXRhKSB7XG4gICAgICAgICAgICAkJCQxKGFjdGl2ZXMpLmRhdGEoREFUQV9LRVksIG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKTtcblxuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5DT0xMQVBTRSkuYWRkQ2xhc3MoQ2xhc3NOYW1lLkNPTExBUFNJTkcpO1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAwO1xuXG4gICAgICAgIGlmICh0aGlzLl90cmlnZ2VyQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgJCQkMSh0aGlzLl90cmlnZ2VyQXJyYXkpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5DT0xMQVBTRUQpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0VHJhbnNpdGlvbmluZyh0cnVlKTtcblxuICAgICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICAgICAgICAkJCQxKF90aGlzLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0lORykuYWRkQ2xhc3MoQ2xhc3NOYW1lLkNPTExBUFNFKS5hZGRDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG4gICAgICAgICAgX3RoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnO1xuXG4gICAgICAgICAgX3RoaXMuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG5cbiAgICAgICAgICAkJCQxKF90aGlzLl9lbGVtZW50KS50cmlnZ2VyKEV2ZW50LlNIT1dOKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgY2FwaXRhbGl6ZWREaW1lbnNpb24gPSBkaW1lbnNpb25bMF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSgxKTtcbiAgICAgICAgdmFyIHNjcm9sbFNpemUgPSBcInNjcm9sbFwiICsgY2FwaXRhbGl6ZWREaW1lbnNpb247XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gdGhpcy5fZWxlbWVudFtzY3JvbGxTaXplXSArIFwicHhcIjtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5oaWRlID0gZnVuY3Rpb24gaGlkZSgpIHtcbiAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbmluZyB8fCAhJCQkMSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuU0hPVykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RhcnRFdmVudCA9ICQkJDEuRXZlbnQoRXZlbnQuSElERSk7XG4gICAgICAgICQkJDEodGhpcy5fZWxlbWVudCkudHJpZ2dlcihzdGFydEV2ZW50KTtcblxuICAgICAgICBpZiAoc3RhcnRFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKTtcblxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSB0aGlzLl9lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RpbWVuc2lvbl0gKyBcInB4XCI7XG4gICAgICAgIFV0aWwucmVmbG93KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKENsYXNzTmFtZS5DT0xMQVBTSU5HKS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0UpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5TSE9XKTtcbiAgICAgICAgdmFyIHRyaWdnZXJBcnJheUxlbmd0aCA9IHRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHRyaWdnZXJBcnJheUxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaWdnZXJBcnJheUxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdHJpZ2dlciA9IHRoaXMuX3RyaWdnZXJBcnJheVtpXTtcbiAgICAgICAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0cmlnZ2VyKTtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciAkZWxlbSA9ICQkJDEoW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkpO1xuXG4gICAgICAgICAgICAgIGlmICghJGVsZW0uaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpKSB7XG4gICAgICAgICAgICAgICAgJCQkMSh0cmlnZ2VyKS5hZGRDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0VEKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKHRydWUpO1xuXG4gICAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICAgIF90aGlzMi5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcblxuICAgICAgICAgICQkJDEoX3RoaXMyLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0lORykuYWRkQ2xhc3MoQ2xhc3NOYW1lLkNPTExBUFNFKS50cmlnZ2VyKEV2ZW50LkhJRERFTik7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gJyc7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5zZXRUcmFuc2l0aW9uaW5nID0gZnVuY3Rpb24gc2V0VHJhbnNpdGlvbmluZyhpc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gaXNUcmFuc2l0aW9uaW5nO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICAkJCQxLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gbnVsbDtcbiAgICAgIH07IC8vIFByaXZhdGVcblxuXG4gICAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZyA9IF9vYmplY3RTcHJlYWQoe30sIERlZmF1bHQsIGNvbmZpZyk7XG4gICAgICAgIGNvbmZpZy50b2dnbGUgPSBCb29sZWFuKGNvbmZpZy50b2dnbGUpOyAvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlc1xuXG4gICAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUsIGNvbmZpZywgRGVmYXVsdFR5cGUpO1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9nZXREaW1lbnNpb24gPSBmdW5jdGlvbiBfZ2V0RGltZW5zaW9uKCkge1xuICAgICAgICB2YXIgaGFzV2lkdGggPSAkJCQxKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKERpbWVuc2lvbi5XSURUSCk7XG4gICAgICAgIHJldHVybiBoYXNXaWR0aCA/IERpbWVuc2lvbi5XSURUSCA6IERpbWVuc2lvbi5IRUlHSFQ7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2dldFBhcmVudCA9IGZ1bmN0aW9uIF9nZXRQYXJlbnQoKSB7XG4gICAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICAgIHZhciBwYXJlbnQgPSBudWxsO1xuXG4gICAgICAgIGlmIChVdGlsLmlzRWxlbWVudCh0aGlzLl9jb25maWcucGFyZW50KSkge1xuICAgICAgICAgIHBhcmVudCA9IHRoaXMuX2NvbmZpZy5wYXJlbnQ7IC8vIEl0J3MgYSBqUXVlcnkgb2JqZWN0XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2NvbmZpZy5wYXJlbnQuanF1ZXJ5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGFyZW50ID0gdGhpcy5fY29uZmlnLnBhcmVudFswXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLl9jb25maWcucGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZWxlY3RvciA9IFwiW2RhdGEtdG9nZ2xlPVxcXCJjb2xsYXBzZVxcXCJdW2RhdGEtcGFyZW50PVxcXCJcIiArIHRoaXMuX2NvbmZpZy5wYXJlbnQgKyBcIlxcXCJdXCI7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IFtdLnNsaWNlLmNhbGwocGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTtcbiAgICAgICAgJCQkMShjaGlsZHJlbikuZWFjaChmdW5jdGlvbiAoaSwgZWxlbWVudCkge1xuICAgICAgICAgIF90aGlzMy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKENvbGxhcHNlLl9nZXRUYXJnZXRGcm9tRWxlbWVudChlbGVtZW50KSwgW2VsZW1lbnRdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyA9IGZ1bmN0aW9uIF9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoZWxlbWVudCwgdHJpZ2dlckFycmF5KSB7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGlzT3BlbiA9ICQkJDEoZWxlbWVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpO1xuXG4gICAgICAgICAgaWYgKHRyaWdnZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgICQkJDEodHJpZ2dlckFycmF5KS50b2dnbGVDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0VELCAhaXNPcGVuKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgaXNPcGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07IC8vIFN0YXRpY1xuXG5cbiAgICAgIENvbGxhcHNlLl9nZXRUYXJnZXRGcm9tRWxlbWVudCA9IGZ1bmN0aW9uIF9nZXRUYXJnZXRGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgOiBudWxsO1xuICAgICAgfTtcblxuICAgICAgQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAkdGhpcyA9ICQkJDEodGhpcyk7XG4gICAgICAgICAgdmFyIGRhdGEgPSAkdGhpcy5kYXRhKERBVEFfS0VZKTtcblxuICAgICAgICAgIHZhciBfY29uZmlnID0gX29iamVjdFNwcmVhZCh7fSwgRGVmYXVsdCwgJHRoaXMuZGF0YSgpLCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcgPyBjb25maWcgOiB7fSk7XG5cbiAgICAgICAgICBpZiAoIWRhdGEgJiYgX2NvbmZpZy50b2dnbGUgJiYgL3Nob3d8aGlkZS8udGVzdChjb25maWcpKSB7XG4gICAgICAgICAgICBfY29uZmlnLnRvZ2dsZSA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgZGF0YSA9IG5ldyBDb2xsYXBzZSh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAgICR0aGlzLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX2NyZWF0ZUNsYXNzKENvbGxhcHNlLCBudWxsLCBbe1xuICAgICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gVkVSU0lPTjtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBrZXk6IFwiRGVmYXVsdFwiLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gRGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgfV0pO1xuXG4gICAgICByZXR1cm4gQ29sbGFwc2U7XG4gICAgfSgpO1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG5cblxuICAgICQkJDEoZG9jdW1lbnQpLm9uKEV2ZW50LkNMSUNLX0RBVEFfQVBJLCBTZWxlY3Rvci5EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBwcmV2ZW50RGVmYXVsdCBvbmx5IGZvciA8YT4gZWxlbWVudHMgKHdoaWNoIGNoYW5nZSB0aGUgVVJMKSBub3QgaW5zaWRlIHRoZSBjb2xsYXBzaWJsZSBlbGVtZW50XG4gICAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgdmFyICR0cmlnZ2VyID0gJCQkMSh0aGlzKTtcbiAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKTtcbiAgICAgIHZhciBzZWxlY3RvcnMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTtcbiAgICAgICQkJDEoc2VsZWN0b3JzKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICR0YXJnZXQgPSAkJCQxKHRoaXMpO1xuICAgICAgICB2YXIgZGF0YSA9ICR0YXJnZXQuZGF0YShEQVRBX0tFWSk7XG4gICAgICAgIHZhciBjb25maWcgPSBkYXRhID8gJ3RvZ2dsZScgOiAkdHJpZ2dlci5kYXRhKCk7XG5cbiAgICAgICAgQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZS5jYWxsKCR0YXJnZXQsIGNvbmZpZyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBqUXVlcnlcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuICAgICQkJDEuZm5bTkFNRV0gPSBDb2xsYXBzZS5falF1ZXJ5SW50ZXJmYWNlO1xuICAgICQkJDEuZm5bTkFNRV0uQ29uc3RydWN0b3IgPSBDb2xsYXBzZTtcblxuICAgICQkJDEuZm5bTkFNRV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICQkJDEuZm5bTkFNRV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgICByZXR1cm4gQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIENvbGxhcHNlO1xuICB9KCQpO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgKHY0LjEuMik6IGRyb3Bkb3duLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBEcm9wZG93biA9IGZ1bmN0aW9uICgkJCQxKSB7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogQ29uc3RhbnRzXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG4gICAgdmFyIE5BTUUgPSAnZHJvcGRvd24nO1xuICAgIHZhciBWRVJTSU9OID0gJzQuMS4yJztcbiAgICB2YXIgREFUQV9LRVkgPSAnYnMuZHJvcGRvd24nO1xuICAgIHZhciBFVkVOVF9LRVkgPSBcIi5cIiArIERBVEFfS0VZO1xuICAgIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUID0gJCQkMS5mbltOQU1FXTtcbiAgICB2YXIgRVNDQVBFX0tFWUNPREUgPSAyNzsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgRXNjYXBlIChFc2MpIGtleVxuXG4gICAgdmFyIFNQQUNFX0tFWUNPREUgPSAzMjsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3Igc3BhY2Uga2V5XG5cbiAgICB2YXIgVEFCX0tFWUNPREUgPSA5OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciB0YWIga2V5XG5cbiAgICB2YXIgQVJST1dfVVBfS0VZQ09ERSA9IDM4OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciB1cCBhcnJvdyBrZXlcblxuICAgIHZhciBBUlJPV19ET1dOX0tFWUNPREUgPSA0MDsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgZG93biBhcnJvdyBrZXlcblxuICAgIHZhciBSSUdIVF9NT1VTRV9CVVRUT05fV0hJQ0ggPSAzOyAvLyBNb3VzZUV2ZW50LndoaWNoIHZhbHVlIGZvciB0aGUgcmlnaHQgYnV0dG9uIChhc3N1bWluZyBhIHJpZ2h0LWhhbmRlZCBtb3VzZSlcblxuICAgIHZhciBSRUdFWFBfS0VZRE9XTiA9IG5ldyBSZWdFeHAoQVJST1dfVVBfS0VZQ09ERSArIFwifFwiICsgQVJST1dfRE9XTl9LRVlDT0RFICsgXCJ8XCIgKyBFU0NBUEVfS0VZQ09ERSk7XG4gICAgdmFyIEV2ZW50ID0ge1xuICAgICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVksXG4gICAgICBISURERU46IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVksXG4gICAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSxcbiAgICAgIFNIT1dOOiBcInNob3duXCIgKyBFVkVOVF9LRVksXG4gICAgICBDTElDSzogXCJjbGlja1wiICsgRVZFTlRfS0VZLFxuICAgICAgQ0xJQ0tfREFUQV9BUEk6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWSxcbiAgICAgIEtFWURPV05fREFUQV9BUEk6IFwia2V5ZG93blwiICsgRVZFTlRfS0VZICsgREFUQV9BUElfS0VZLFxuICAgICAgS0VZVVBfREFUQV9BUEk6IFwia2V5dXBcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWVxuICAgIH07XG4gICAgdmFyIENsYXNzTmFtZSA9IHtcbiAgICAgIERJU0FCTEVEOiAnZGlzYWJsZWQnLFxuICAgICAgU0hPVzogJ3Nob3cnLFxuICAgICAgRFJPUFVQOiAnZHJvcHVwJyxcbiAgICAgIERST1BSSUdIVDogJ2Ryb3ByaWdodCcsXG4gICAgICBEUk9QTEVGVDogJ2Ryb3BsZWZ0JyxcbiAgICAgIE1FTlVSSUdIVDogJ2Ryb3Bkb3duLW1lbnUtcmlnaHQnLFxuICAgICAgTUVOVUxFRlQ6ICdkcm9wZG93bi1tZW51LWxlZnQnLFxuICAgICAgUE9TSVRJT05fU1RBVElDOiAncG9zaXRpb24tc3RhdGljJ1xuICAgIH07XG4gICAgdmFyIFNlbGVjdG9yID0ge1xuICAgICAgREFUQV9UT0dHTEU6ICdbZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScsXG4gICAgICBGT1JNX0NISUxEOiAnLmRyb3Bkb3duIGZvcm0nLFxuICAgICAgTUVOVTogJy5kcm9wZG93bi1tZW51JyxcbiAgICAgIE5BVkJBUl9OQVY6ICcubmF2YmFyLW5hdicsXG4gICAgICBWSVNJQkxFX0lURU1TOiAnLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWl0ZW06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCknXG4gICAgfTtcbiAgICB2YXIgQXR0YWNobWVudE1hcCA9IHtcbiAgICAgIFRPUDogJ3RvcC1zdGFydCcsXG4gICAgICBUT1BFTkQ6ICd0b3AtZW5kJyxcbiAgICAgIEJPVFRPTTogJ2JvdHRvbS1zdGFydCcsXG4gICAgICBCT1RUT01FTkQ6ICdib3R0b20tZW5kJyxcbiAgICAgIFJJR0hUOiAncmlnaHQtc3RhcnQnLFxuICAgICAgUklHSFRFTkQ6ICdyaWdodC1lbmQnLFxuICAgICAgTEVGVDogJ2xlZnQtc3RhcnQnLFxuICAgICAgTEVGVEVORDogJ2xlZnQtZW5kJ1xuICAgIH07XG4gICAgdmFyIERlZmF1bHQgPSB7XG4gICAgICBvZmZzZXQ6IDAsXG4gICAgICBmbGlwOiB0cnVlLFxuICAgICAgYm91bmRhcnk6ICdzY3JvbGxQYXJlbnQnLFxuICAgICAgcmVmZXJlbmNlOiAndG9nZ2xlJyxcbiAgICAgIGRpc3BsYXk6ICdkeW5hbWljJ1xuICAgIH07XG4gICAgdmFyIERlZmF1bHRUeXBlID0ge1xuICAgICAgb2Zmc2V0OiAnKG51bWJlcnxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgICAgIGZsaXA6ICdib29sZWFuJyxcbiAgICAgIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KScsXG4gICAgICByZWZlcmVuY2U6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgICAgIGRpc3BsYXk6ICdzdHJpbmcnXG4gICAgICAvKipcbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgKi9cblxuICAgIH07XG5cbiAgICB2YXIgRHJvcGRvd24gPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBEcm9wZG93bihlbGVtZW50LCBjb25maWcpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgICB0aGlzLl9tZW51ID0gdGhpcy5fZ2V0TWVudUVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKTtcblxuICAgICAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpO1xuICAgICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgICAgdmFyIF9wcm90byA9IERyb3Bkb3duLnByb3RvdHlwZTtcblxuICAgICAgLy8gUHVibGljXG4gICAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgICAgICBpZiAodGhpcy5fZWxlbWVudC5kaXNhYmxlZCB8fCAkJCQxKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5ESVNBQkxFRCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGFyZW50ID0gRHJvcGRvd24uX2dldFBhcmVudEZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuXG4gICAgICAgIHZhciBpc0FjdGl2ZSA9ICQkJDEodGhpcy5fbWVudSkuaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpO1xuXG4gICAgICAgIERyb3Bkb3duLl9jbGVhck1lbnVzKCk7XG5cbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgICAgICB9O1xuICAgICAgICB2YXIgc2hvd0V2ZW50ID0gJCQkMS5FdmVudChFdmVudC5TSE9XLCByZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgJCQkMShwYXJlbnQpLnRyaWdnZXIoc2hvd0V2ZW50KTtcblxuICAgICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIERpc2FibGUgdG90YWxseSBQb3BwZXIuanMgZm9yIERyb3Bkb3duIGluIE5hdmJhclxuXG5cbiAgICAgICAgaWYgKCF0aGlzLl9pbk5hdmJhcikge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIENoZWNrIGZvciBQb3BwZXIgZGVwZW5kZW5jeVxuICAgICAgICAgICAqIFBvcHBlciAtIGh0dHBzOi8vcG9wcGVyLmpzLm9yZ1xuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwIGRyb3Bkb3duIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuXG4gICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UgPT09ICdwYXJlbnQnKSB7XG4gICAgICAgICAgICByZWZlcmVuY2VFbGVtZW50ID0gcGFyZW50O1xuICAgICAgICAgIH0gZWxzZSBpZiAoVXRpbC5pc0VsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9jb25maWcucmVmZXJlbmNlOyAvLyBDaGVjayBpZiBpdCdzIGpRdWVyeSBlbGVtZW50XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLnJlZmVyZW5jZS5qcXVlcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9jb25maWcucmVmZXJlbmNlWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gSWYgYm91bmRhcnkgaXMgbm90IGBzY3JvbGxQYXJlbnRgLCB0aGVuIHNldCBwb3NpdGlvbiB0byBgc3RhdGljYFxuICAgICAgICAgIC8vIHRvIGFsbG93IHRoZSBtZW51IHRvIFwiZXNjYXBlXCIgdGhlIHNjcm9sbCBwYXJlbnQncyBib3VuZGFyaWVzXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8yNDI1MVxuXG5cbiAgICAgICAgICBpZiAodGhpcy5fY29uZmlnLmJvdW5kYXJ5ICE9PSAnc2Nyb2xsUGFyZW50Jykge1xuICAgICAgICAgICAgJCQkMShwYXJlbnQpLmFkZENsYXNzKENsYXNzTmFtZS5QT1NJVElPTl9TVEFUSUMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX3BvcHBlciA9IG5ldyBQb3BwZXIocmVmZXJlbmNlRWxlbWVudCwgdGhpcy5fbWVudSwgdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKCkpO1xuICAgICAgICB9IC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAgICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB0byB0aGUgYm9keSdzIGltbWVkaWF0ZSBjaGlsZHJlbjtcbiAgICAgICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG5cblxuICAgICAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICQkJDEocGFyZW50KS5jbG9zZXN0KFNlbGVjdG9yLk5BVkJBUl9OQVYpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICQkJDEoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vbignbW91c2VvdmVyJywgbnVsbCwgJCQkMS5ub29wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuZm9jdXMoKTtcblxuICAgICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuXG4gICAgICAgICQkJDEodGhpcy5fbWVudSkudG9nZ2xlQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpO1xuICAgICAgICAkJCQxKHBhcmVudCkudG9nZ2xlQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpLnRyaWdnZXIoJCQkMS5FdmVudChFdmVudC5TSE9XTiwgcmVsYXRlZFRhcmdldCkpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICAkJCQxLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLm9mZihFVkVOVF9LRVkpO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbWVudSA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KCk7XG5cbiAgICAgICAgICB0aGlzLl9wb3BwZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8udXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgICB0aGlzLl9pbk5hdmJhciA9IHRoaXMuX2RldGVjdE5hdmJhcigpO1xuXG4gICAgICAgIGlmICh0aGlzLl9wb3BwZXIgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfTsgLy8gUHJpdmF0ZVxuXG5cbiAgICAgIF9wcm90by5fYWRkRXZlbnRMaXN0ZW5lcnMgPSBmdW5jdGlvbiBfYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS5vbihFdmVudC5DTElDSywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgIF90aGlzLnRvZ2dsZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fZ2V0Q29uZmlnID0gZnVuY3Rpb24gX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgICAgY29uZmlnID0gX29iamVjdFNwcmVhZCh7fSwgdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LCAkJCQxKHRoaXMuX2VsZW1lbnQpLmRhdGEoKSwgY29uZmlnKTtcbiAgICAgICAgVXRpbC50eXBlQ2hlY2tDb25maWcoTkFNRSwgY29uZmlnLCB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKTtcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fZ2V0TWVudUVsZW1lbnQgPSBmdW5jdGlvbiBfZ2V0TWVudUVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWVudSkge1xuICAgICAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG5cbiAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9tZW51ID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3IoU2VsZWN0b3IuTUVOVSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX21lbnU7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2dldFBsYWNlbWVudCA9IGZ1bmN0aW9uIF9nZXRQbGFjZW1lbnQoKSB7XG4gICAgICAgIHZhciAkcGFyZW50RHJvcGRvd24gPSAkJCQxKHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSk7XG4gICAgICAgIHZhciBwbGFjZW1lbnQgPSBBdHRhY2htZW50TWFwLkJPVFRPTTsgLy8gSGFuZGxlIGRyb3B1cFxuXG4gICAgICAgIGlmICgkcGFyZW50RHJvcGRvd24uaGFzQ2xhc3MoQ2xhc3NOYW1lLkRST1BVUCkpIHtcbiAgICAgICAgICBwbGFjZW1lbnQgPSBBdHRhY2htZW50TWFwLlRPUDtcblxuICAgICAgICAgIGlmICgkJCQxKHRoaXMuX21lbnUpLmhhc0NsYXNzKENsYXNzTmFtZS5NRU5VUklHSFQpKSB7XG4gICAgICAgICAgICBwbGFjZW1lbnQgPSBBdHRhY2htZW50TWFwLlRPUEVORDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoJHBhcmVudERyb3Bkb3duLmhhc0NsYXNzKENsYXNzTmFtZS5EUk9QUklHSFQpKSB7XG4gICAgICAgICAgcGxhY2VtZW50ID0gQXR0YWNobWVudE1hcC5SSUdIVDtcbiAgICAgICAgfSBlbHNlIGlmICgkcGFyZW50RHJvcGRvd24uaGFzQ2xhc3MoQ2xhc3NOYW1lLkRST1BMRUZUKSkge1xuICAgICAgICAgIHBsYWNlbWVudCA9IEF0dGFjaG1lbnRNYXAuTEVGVDtcbiAgICAgICAgfSBlbHNlIGlmICgkJCQxKHRoaXMuX21lbnUpLmhhc0NsYXNzKENsYXNzTmFtZS5NRU5VUklHSFQpKSB7XG4gICAgICAgICAgcGxhY2VtZW50ID0gQXR0YWNobWVudE1hcC5CT1RUT01FTkQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGxhY2VtZW50O1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9kZXRlY3ROYXZiYXIgPSBmdW5jdGlvbiBfZGV0ZWN0TmF2YmFyKCkge1xuICAgICAgICByZXR1cm4gJCQkMSh0aGlzLl9lbGVtZW50KS5jbG9zZXN0KCcubmF2YmFyJykubGVuZ3RoID4gMDtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fZ2V0UG9wcGVyQ29uZmlnID0gZnVuY3Rpb24gX2dldFBvcHBlckNvbmZpZygpIHtcbiAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIG9mZnNldENvbmYgPSB7fTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2NvbmZpZy5vZmZzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvZmZzZXRDb25mLmZuID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIGRhdGEub2Zmc2V0cyA9IF9vYmplY3RTcHJlYWQoe30sIGRhdGEub2Zmc2V0cywgX3RoaXMyLl9jb25maWcub2Zmc2V0KGRhdGEub2Zmc2V0cykgfHwge30pO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXRDb25mLm9mZnNldCA9IHRoaXMuX2NvbmZpZy5vZmZzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcG9wcGVyQ29uZmlnID0ge1xuICAgICAgICAgIHBsYWNlbWVudDogdGhpcy5fZ2V0UGxhY2VtZW50KCksXG4gICAgICAgICAgbW9kaWZpZXJzOiB7XG4gICAgICAgICAgICBvZmZzZXQ6IG9mZnNldENvbmYsXG4gICAgICAgICAgICBmbGlwOiB7XG4gICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuX2NvbmZpZy5mbGlwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJldmVudE92ZXJmbG93OiB7XG4gICAgICAgICAgICAgIGJvdW5kYXJpZXNFbGVtZW50OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIERpc2FibGUgUG9wcGVyLmpzIGlmIHdlIGhhdmUgYSBzdGF0aWMgZGlzcGxheVxuXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5kaXNwbGF5ID09PSAnc3RhdGljJykge1xuICAgICAgICAgIHBvcHBlckNvbmZpZy5tb2RpZmllcnMuYXBwbHlTdHlsZSA9IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwb3BwZXJDb25maWc7XG4gICAgICB9OyAvLyBTdGF0aWNcblxuXG4gICAgICBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGw7XG5cbiAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgRHJvcGRvd24odGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgICAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgRHJvcGRvd24uX2NsZWFyTWVudXMgPSBmdW5jdGlvbiBfY2xlYXJNZW51cyhldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQgJiYgKGV2ZW50LndoaWNoID09PSBSSUdIVF9NT1VTRV9CVVRUT05fV0hJQ0ggfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC53aGljaCAhPT0gVEFCX0tFWUNPREUpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRvZ2dsZXMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU2VsZWN0b3IuREFUQV9UT0dHTEUpKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdG9nZ2xlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodG9nZ2xlc1tpXSk7XG5cbiAgICAgICAgICB2YXIgY29udGV4dCA9ICQkJDEodG9nZ2xlc1tpXSkuZGF0YShEQVRBX0tFWSk7XG4gICAgICAgICAgdmFyIHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICAgICAgICByZWxhdGVkVGFyZ2V0OiB0b2dnbGVzW2ldXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChldmVudCAmJiBldmVudC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgICAgICByZWxhdGVkVGFyZ2V0LmNsaWNrRXZlbnQgPSBldmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBkcm9wZG93bk1lbnUgPSBjb250ZXh0Ll9tZW51O1xuXG4gICAgICAgICAgaWYgKCEkJCQxKHBhcmVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXZlbnQgJiYgKGV2ZW50LnR5cGUgPT09ICdjbGljaycgJiYgL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC53aGljaCA9PT0gVEFCX0tFWUNPREUpICYmICQkJDEuY29udGFpbnMocGFyZW50LCBldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaGlkZUV2ZW50ID0gJCQkMS5FdmVudChFdmVudC5ISURFLCByZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgICAkJCQxKHBhcmVudCkudHJpZ2dlcihoaWRlRXZlbnQpO1xuXG4gICAgICAgICAgaWYgKGhpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgICAgICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG5cblxuICAgICAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICQkJDEoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vZmYoJ21vdXNlb3ZlcicsIG51bGwsICQkJDEubm9vcCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdG9nZ2xlc1tpXS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgICAkJCQxKGRyb3Bkb3duTWVudSkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpO1xuICAgICAgICAgICQkJDEocGFyZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVykudHJpZ2dlcigkJCQxLkV2ZW50KEV2ZW50LkhJRERFTiwgcmVsYXRlZFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQgPSBmdW5jdGlvbiBfZ2V0UGFyZW50RnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICB2YXIgcGFyZW50O1xuICAgICAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyZW50IHx8IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgIH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5cblxuICAgICAgRHJvcGRvd24uX2RhdGFBcGlLZXlkb3duSGFuZGxlciA9IGZ1bmN0aW9uIF9kYXRhQXBpS2V5ZG93bkhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgLy8gSWYgbm90IGlucHV0L3RleHRhcmVhOlxuICAgICAgICAvLyAgLSBBbmQgbm90IGEga2V5IGluIFJFR0VYUF9LRVlET1dOID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcbiAgICAgICAgLy8gSWYgaW5wdXQvdGV4dGFyZWE6XG4gICAgICAgIC8vICAtIElmIHNwYWNlIGtleSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgICAgIC8vICAtIElmIGtleSBpcyBvdGhlciB0aGFuIGVzY2FwZVxuICAgICAgICAvLyAgICAtIElmIGtleSBpcyBub3QgdXAgb3IgZG93biA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgICAgIC8vICAgIC0gSWYgdHJpZ2dlciBpbnNpZGUgdGhlIG1lbnUgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgICAgICBpZiAoL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkgPyBldmVudC53aGljaCA9PT0gU1BBQ0VfS0VZQ09ERSB8fCBldmVudC53aGljaCAhPT0gRVNDQVBFX0tFWUNPREUgJiYgKGV2ZW50LndoaWNoICE9PSBBUlJPV19ET1dOX0tFWUNPREUgJiYgZXZlbnQud2hpY2ggIT09IEFSUk9XX1VQX0tFWUNPREUgfHwgJCQkMShldmVudC50YXJnZXQpLmNsb3Nlc3QoU2VsZWN0b3IuTUVOVSkubGVuZ3RoKSA6ICFSRUdFWFBfS0VZRE9XTi50ZXN0KGV2ZW50LndoaWNoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICQkJDEodGhpcykuaGFzQ2xhc3MoQ2xhc3NOYW1lLkRJU0FCTEVEKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcyk7XG5cbiAgICAgICAgdmFyIGlzQWN0aXZlID0gJCQkMShwYXJlbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5TSE9XKTtcblxuICAgICAgICBpZiAoIWlzQWN0aXZlICYmIChldmVudC53aGljaCAhPT0gRVNDQVBFX0tFWUNPREUgfHwgZXZlbnQud2hpY2ggIT09IFNQQUNFX0tFWUNPREUpIHx8IGlzQWN0aXZlICYmIChldmVudC53aGljaCA9PT0gRVNDQVBFX0tFWUNPREUgfHwgZXZlbnQud2hpY2ggPT09IFNQQUNFX0tFWUNPREUpKSB7XG4gICAgICAgICAgaWYgKGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSkge1xuICAgICAgICAgICAgdmFyIHRvZ2dsZSA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKFNlbGVjdG9yLkRBVEFfVE9HR0xFKTtcbiAgICAgICAgICAgICQkJDEodG9nZ2xlKS50cmlnZ2VyKCdmb2N1cycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICQkJDEodGhpcykudHJpZ2dlcignY2xpY2snKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlbXMgPSBbXS5zbGljZS5jYWxsKHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFNlbGVjdG9yLlZJU0lCTEVfSVRFTVMpKTtcblxuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGluZGV4ID0gaXRlbXMuaW5kZXhPZihldmVudC50YXJnZXQpO1xuXG4gICAgICAgIGlmIChldmVudC53aGljaCA9PT0gQVJST1dfVVBfS0VZQ09ERSAmJiBpbmRleCA+IDApIHtcbiAgICAgICAgICAvLyBVcFxuICAgICAgICAgIGluZGV4LS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT09IEFSUk9XX0RPV05fS0VZQ09ERSAmJiBpbmRleCA8IGl0ZW1zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAvLyBEb3duXG4gICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtc1tpbmRleF0uZm9jdXMoKTtcbiAgICAgIH07XG5cbiAgICAgIF9jcmVhdGVDbGFzcyhEcm9wZG93biwgbnVsbCwgW3tcbiAgICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIFZFUlNJT047XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkRlZmF1bHRUeXBlXCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBEZWZhdWx0VHlwZTtcbiAgICAgICAgfVxuICAgICAgfV0pO1xuXG4gICAgICByZXR1cm4gRHJvcGRvd247XG4gICAgfSgpO1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG5cblxuICAgICQkJDEoZG9jdW1lbnQpLm9uKEV2ZW50LktFWURPV05fREFUQV9BUEksIFNlbGVjdG9yLkRBVEFfVE9HR0xFLCBEcm9wZG93bi5fZGF0YUFwaUtleWRvd25IYW5kbGVyKS5vbihFdmVudC5LRVlET1dOX0RBVEFfQVBJLCBTZWxlY3Rvci5NRU5VLCBEcm9wZG93bi5fZGF0YUFwaUtleWRvd25IYW5kbGVyKS5vbihFdmVudC5DTElDS19EQVRBX0FQSSArIFwiIFwiICsgRXZlbnQuS0VZVVBfREFUQV9BUEksIERyb3Bkb3duLl9jbGVhck1lbnVzKS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJCQkMSh0aGlzKSwgJ3RvZ2dsZScpO1xuICAgIH0pLm9uKEV2ZW50LkNMSUNLX0RBVEFfQVBJLCBTZWxlY3Rvci5GT1JNX0NISUxELCBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBqUXVlcnlcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuICAgICQkJDEuZm5bTkFNRV0gPSBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlO1xuICAgICQkJDEuZm5bTkFNRV0uQ29uc3RydWN0b3IgPSBEcm9wZG93bjtcblxuICAgICQkJDEuZm5bTkFNRV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICQkJDEuZm5bTkFNRV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgICByZXR1cm4gRHJvcGRvd24uX2pRdWVyeUludGVyZmFjZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIERyb3Bkb3duO1xuICB9KCQsIFBvcHBlcik7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuMS4yKTogbW9kYWwuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE1vZGFsID0gZnVuY3Rpb24gKCQkJDEpIHtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBDb25zdGFudHNcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cbiAgICB2YXIgTkFNRSA9ICdtb2RhbCc7XG4gICAgdmFyIFZFUlNJT04gPSAnNC4xLjInO1xuICAgIHZhciBEQVRBX0tFWSA9ICdicy5tb2RhbCc7XG4gICAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gICAgdmFyIERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknO1xuICAgIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkJCQxLmZuW05BTUVdO1xuICAgIHZhciBFU0NBUEVfS0VZQ09ERSA9IDI3OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciBFc2NhcGUgKEVzYykga2V5XG5cbiAgICB2YXIgRGVmYXVsdCA9IHtcbiAgICAgIGJhY2tkcm9wOiB0cnVlLFxuICAgICAga2V5Ym9hcmQ6IHRydWUsXG4gICAgICBmb2N1czogdHJ1ZSxcbiAgICAgIHNob3c6IHRydWVcbiAgICB9O1xuICAgIHZhciBEZWZhdWx0VHlwZSA9IHtcbiAgICAgIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gICAgICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICAgICAgZm9jdXM6ICdib29sZWFuJyxcbiAgICAgIHNob3c6ICdib29sZWFuJ1xuICAgIH07XG4gICAgdmFyIEV2ZW50ID0ge1xuICAgICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVksXG4gICAgICBISURERU46IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVksXG4gICAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSxcbiAgICAgIFNIT1dOOiBcInNob3duXCIgKyBFVkVOVF9LRVksXG4gICAgICBGT0NVU0lOOiBcImZvY3VzaW5cIiArIEVWRU5UX0tFWSxcbiAgICAgIFJFU0laRTogXCJyZXNpemVcIiArIEVWRU5UX0tFWSxcbiAgICAgIENMSUNLX0RJU01JU1M6IFwiY2xpY2suZGlzbWlzc1wiICsgRVZFTlRfS0VZLFxuICAgICAgS0VZRE9XTl9ESVNNSVNTOiBcImtleWRvd24uZGlzbWlzc1wiICsgRVZFTlRfS0VZLFxuICAgICAgTU9VU0VVUF9ESVNNSVNTOiBcIm1vdXNldXAuZGlzbWlzc1wiICsgRVZFTlRfS0VZLFxuICAgICAgTU9VU0VET1dOX0RJU01JU1M6IFwibW91c2Vkb3duLmRpc21pc3NcIiArIEVWRU5UX0tFWSxcbiAgICAgIENMSUNLX0RBVEFfQVBJOiBcImNsaWNrXCIgKyBFVkVOVF9LRVkgKyBEQVRBX0FQSV9LRVlcbiAgICB9O1xuICAgIHZhciBDbGFzc05hbWUgPSB7XG4gICAgICBTQ1JPTExCQVJfTUVBU1VSRVI6ICdtb2RhbC1zY3JvbGxiYXItbWVhc3VyZScsXG4gICAgICBCQUNLRFJPUDogJ21vZGFsLWJhY2tkcm9wJyxcbiAgICAgIE9QRU46ICdtb2RhbC1vcGVuJyxcbiAgICAgIEZBREU6ICdmYWRlJyxcbiAgICAgIFNIT1c6ICdzaG93J1xuICAgIH07XG4gICAgdmFyIFNlbGVjdG9yID0ge1xuICAgICAgRElBTE9HOiAnLm1vZGFsLWRpYWxvZycsXG4gICAgICBEQVRBX1RPR0dMRTogJ1tkYXRhLXRvZ2dsZT1cIm1vZGFsXCJdJyxcbiAgICAgIERBVEFfRElTTUlTUzogJ1tkYXRhLWRpc21pc3M9XCJtb2RhbFwiXScsXG4gICAgICBGSVhFRF9DT05URU5UOiAnLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcCcsXG4gICAgICBTVElDS1lfQ09OVEVOVDogJy5zdGlja3ktdG9wJ1xuICAgICAgLyoqXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAqIENsYXNzIERlZmluaXRpb25cbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICovXG5cbiAgICB9O1xuXG4gICAgdmFyIE1vZGFsID1cbiAgICAvKiNfX1BVUkVfXyovXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gTW9kYWwoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5fZGlhbG9nID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNlbGVjdG9yLkRJQUxPRyk7XG4gICAgICAgIHRoaXMuX2JhY2tkcm9wID0gbnVsbDtcbiAgICAgICAgdGhpcy5faXNTaG93biA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pZ25vcmVCYWNrZHJvcENsaWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3Njcm9sbGJhcldpZHRoID0gMDtcbiAgICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICAgIHZhciBfcHJvdG8gPSBNb2RhbC5wcm90b3R5cGU7XG5cbiAgICAgIC8vIFB1YmxpY1xuICAgICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uc2hvdyA9IGZ1bmN0aW9uIHNob3cocmVsYXRlZFRhcmdldCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25pbmcgfHwgdGhpcy5faXNTaG93bikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgkJCQxKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKSkge1xuICAgICAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2hvd0V2ZW50ID0gJCQkMS5FdmVudChFdmVudC5TSE9XLCB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogcmVsYXRlZFRhcmdldFxuICAgICAgICB9KTtcbiAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNob3dFdmVudCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzU2hvd24gfHwgc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faXNTaG93biA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fY2hlY2tTY3JvbGxiYXIoKTtcblxuICAgICAgICB0aGlzLl9zZXRTY3JvbGxiYXIoKTtcblxuICAgICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcblxuICAgICAgICAkJCQxKGRvY3VtZW50LmJvZHkpLmFkZENsYXNzKENsYXNzTmFtZS5PUEVOKTtcblxuICAgICAgICB0aGlzLl9zZXRFc2NhcGVFdmVudCgpO1xuXG4gICAgICAgIHRoaXMuX3NldFJlc2l6ZUV2ZW50KCk7XG5cbiAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS5vbihFdmVudC5DTElDS19ESVNNSVNTLCBTZWxlY3Rvci5EQVRBX0RJU01JU1MsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5oaWRlKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgICQkJDEodGhpcy5fZGlhbG9nKS5vbihFdmVudC5NT1VTRURPV05fRElTTUlTUywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICQkJDEoX3RoaXMuX2VsZW1lbnQpLm9uZShFdmVudC5NT1VTRVVQX0RJU01JU1MsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaWYgKCQkJDEoZXZlbnQudGFyZ2V0KS5pcyhfdGhpcy5fZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgX3RoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2sgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9zaG93QmFja2Ryb3AoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5fc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmhpZGUgPSBmdW5jdGlvbiBoaWRlKGV2ZW50KSB7XG4gICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICF0aGlzLl9pc1Nob3duKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhpZGVFdmVudCA9ICQkJDEuRXZlbnQoRXZlbnQuSElERSk7XG4gICAgICAgICQkJDEodGhpcy5fZWxlbWVudCkudHJpZ2dlcihoaWRlRXZlbnQpO1xuXG4gICAgICAgIGlmICghdGhpcy5faXNTaG93biB8fCBoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uID0gJCQkMSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuRkFERSk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2V0RXNjYXBlRXZlbnQoKTtcblxuICAgICAgICB0aGlzLl9zZXRSZXNpemVFdmVudCgpO1xuXG4gICAgICAgICQkJDEoZG9jdW1lbnQpLm9mZihFdmVudC5GT0NVU0lOKTtcbiAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG4gICAgICAgICQkJDEodGhpcy5fZWxlbWVudCkub2ZmKEV2ZW50LkNMSUNLX0RJU01JU1MpO1xuICAgICAgICAkJCQxKHRoaXMuX2RpYWxvZykub2ZmKEV2ZW50Lk1PVVNFRE9XTl9ESVNNSVNTKTtcblxuICAgICAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICAgICQkJDEodGhpcy5fZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5faGlkZU1vZGFsKGV2ZW50KTtcbiAgICAgICAgICB9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2hpZGVNb2RhbCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAgICQkJDEucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSk7XG4gICAgICAgICQkJDEod2luZG93LCBkb2N1bWVudCwgdGhpcy5fZWxlbWVudCwgdGhpcy5fYmFja2Ryb3ApLm9mZihFVkVOVF9LRVkpO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZGlhbG9nID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuICAgICAgICB0aGlzLl9pc1Nob3duID0gbnVsbDtcbiAgICAgICAgdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgPSBudWxsO1xuICAgICAgICB0aGlzLl9pZ25vcmVCYWNrZHJvcENsaWNrID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2Nyb2xsYmFyV2lkdGggPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmhhbmRsZVVwZGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZVVwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gICAgICB9OyAvLyBQcml2YXRlXG5cblxuICAgICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgICBjb25maWcgPSBfb2JqZWN0U3ByZWFkKHt9LCBEZWZhdWx0LCBjb25maWcpO1xuICAgICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FLCBjb25maWcsIERlZmF1bHRUeXBlKTtcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fc2hvd0VsZW1lbnQgPSBmdW5jdGlvbiBfc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkge1xuICAgICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgICB2YXIgdHJhbnNpdGlvbiA9ICQkJDEodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLkZBREUpO1xuXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlIHx8IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAvLyBEb24ndCBtb3ZlIG1vZGFsJ3MgRE9NIHBvc2l0aW9uXG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuXG4gICAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgICAgVXRpbC5yZWZsb3codGhpcy5fZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKENsYXNzTmFtZS5TSE9XKTtcblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5fZW5mb3JjZUZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2hvd25FdmVudCA9ICQkJDEuRXZlbnQoRXZlbnQuU0hPV04sIHtcbiAgICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkVGFyZ2V0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciB0cmFuc2l0aW9uQ29tcGxldGUgPSBmdW5jdGlvbiB0cmFuc2l0aW9uQ29tcGxldGUoKSB7XG4gICAgICAgICAgaWYgKF90aGlzMy5fY29uZmlnLmZvY3VzKSB7XG4gICAgICAgICAgICBfdGhpczMuX2VsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgICAgICQkJDEoX3RoaXMzLl9lbGVtZW50KS50cmlnZ2VyKHNob3duRXZlbnQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG4gICAgICAgICAgJCQkMSh0aGlzLl9kaWFsb2cpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCB0cmFuc2l0aW9uQ29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJhbnNpdGlvbkNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fZW5mb3JjZUZvY3VzID0gZnVuY3Rpb24gX2VuZm9yY2VGb2N1cygpIHtcbiAgICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgICAgJCQkMShkb2N1bWVudCkub2ZmKEV2ZW50LkZPQ1VTSU4pIC8vIEd1YXJkIGFnYWluc3QgaW5maW5pdGUgZm9jdXMgbG9vcFxuICAgICAgICAub24oRXZlbnQuRk9DVVNJTiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKGRvY3VtZW50ICE9PSBldmVudC50YXJnZXQgJiYgX3RoaXM0Ll9lbGVtZW50ICE9PSBldmVudC50YXJnZXQgJiYgJCQkMShfdGhpczQuX2VsZW1lbnQpLmhhcyhldmVudC50YXJnZXQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgX3RoaXM0Ll9lbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fc2V0RXNjYXBlRXZlbnQgPSBmdW5jdGlvbiBfc2V0RXNjYXBlRXZlbnQoKSB7XG4gICAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICAgIGlmICh0aGlzLl9pc1Nob3duICYmIHRoaXMuX2NvbmZpZy5rZXlib2FyZCkge1xuICAgICAgICAgICQkJDEodGhpcy5fZWxlbWVudCkub24oRXZlbnQuS0VZRE9XTl9ESVNNSVNTLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC53aGljaCA9PT0gRVNDQVBFX0tFWUNPREUpIHtcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICBfdGhpczUuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9pc1Nob3duKSB7XG4gICAgICAgICAgJCQkMSh0aGlzLl9lbGVtZW50KS5vZmYoRXZlbnQuS0VZRE9XTl9ESVNNSVNTKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9zZXRSZXNpemVFdmVudCA9IGZ1bmN0aW9uIF9zZXRSZXNpemVFdmVudCgpIHtcbiAgICAgICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgICAgICAkJCQxKHdpbmRvdykub24oRXZlbnQuUkVTSVpFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczYuaGFuZGxlVXBkYXRlKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkJCQxKHdpbmRvdykub2ZmKEV2ZW50LlJFU0laRSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5faGlkZU1vZGFsID0gZnVuY3Rpb24gX2hpZGVNb2RhbCgpIHtcbiAgICAgICAgdmFyIF90aGlzNyA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHRydWUpO1xuXG4gICAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX3Nob3dCYWNrZHJvcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgJCQkMShkb2N1bWVudC5ib2R5KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuT1BFTik7XG5cbiAgICAgICAgICBfdGhpczcuX3Jlc2V0QWRqdXN0bWVudHMoKTtcblxuICAgICAgICAgIF90aGlzNy5fcmVzZXRTY3JvbGxiYXIoKTtcblxuICAgICAgICAgICQkJDEoX3RoaXM3Ll9lbGVtZW50KS50cmlnZ2VyKEV2ZW50LkhJRERFTik7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9yZW1vdmVCYWNrZHJvcCA9IGZ1bmN0aW9uIF9yZW1vdmVCYWNrZHJvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2JhY2tkcm9wKSB7XG4gICAgICAgICAgJCQkMSh0aGlzLl9iYWNrZHJvcCkucmVtb3ZlKCk7XG4gICAgICAgICAgdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX3Nob3dCYWNrZHJvcCA9IGZ1bmN0aW9uIF9zaG93QmFja2Ryb3AoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICAgICAgdmFyIGFuaW1hdGUgPSAkJCQxKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKSA/IENsYXNzTmFtZS5GQURFIDogJyc7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzU2hvd24gJiYgdGhpcy5fY29uZmlnLmJhY2tkcm9wKSB7XG4gICAgICAgICAgdGhpcy5fYmFja2Ryb3AgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSBDbGFzc05hbWUuQkFDS0RST1A7XG5cbiAgICAgICAgICBpZiAoYW5pbWF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NMaXN0LmFkZChhbmltYXRlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAkJCQxKHRoaXMuX2JhY2tkcm9wKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICAkJCQxKHRoaXMuX2VsZW1lbnQpLm9uKEV2ZW50LkNMSUNLX0RJU01JU1MsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaWYgKF90aGlzOC5faWdub3JlQmFja2Ryb3BDbGljaykge1xuICAgICAgICAgICAgICBfdGhpczguX2lnbm9yZUJhY2tkcm9wQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKF90aGlzOC5fY29uZmlnLmJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgICAgICAgICBfdGhpczguX2VsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIF90aGlzOC5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoYW5pbWF0ZSkge1xuICAgICAgICAgICAgVXRpbC5yZWZsb3codGhpcy5fYmFja2Ryb3ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICQkJDEodGhpcy5fYmFja2Ryb3ApLmFkZENsYXNzKENsYXNzTmFtZS5TSE9XKTtcblxuICAgICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWFuaW1hdGUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGJhY2tkcm9wVHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9iYWNrZHJvcCk7XG4gICAgICAgICAgJCQkMSh0aGlzLl9iYWNrZHJvcCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNhbGxiYWNrKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChiYWNrZHJvcFRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzU2hvd24gJiYgdGhpcy5fYmFja2Ryb3ApIHtcbiAgICAgICAgICAkJCQxKHRoaXMuX2JhY2tkcm9wKS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG5cbiAgICAgICAgICB2YXIgY2FsbGJhY2tSZW1vdmUgPSBmdW5jdGlvbiBjYWxsYmFja1JlbW92ZSgpIHtcbiAgICAgICAgICAgIF90aGlzOC5fcmVtb3ZlQmFja2Ryb3AoKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICgkJCQxKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKSkge1xuICAgICAgICAgICAgdmFyIF9iYWNrZHJvcFRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fYmFja2Ryb3ApO1xuXG4gICAgICAgICAgICAkJCQxKHRoaXMuX2JhY2tkcm9wKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY2FsbGJhY2tSZW1vdmUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKF9iYWNrZHJvcFRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrUmVtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLy8gdGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIGhhbmRsZSBvdmVyZmxvd2luZyBtb2RhbHNcbiAgICAgIC8vIHRvZG8gKGZhdCk6IHRoZXNlIHNob3VsZCBwcm9iYWJseSBiZSByZWZhY3RvcmVkIG91dCBvZiBtb2RhbC5qc1xuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbiAgICAgIF9wcm90by5fYWRqdXN0RGlhbG9nID0gZnVuY3Rpb24gX2FkanVzdERpYWxvZygpIHtcbiAgICAgICAgdmFyIGlzTW9kYWxPdmVyZmxvd2luZyA9IHRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcblxuICAgICAgICBpZiAoIXRoaXMuX2lzQm9keU92ZXJmbG93aW5nICYmIGlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSB0aGlzLl9zY3JvbGxiYXJXaWR0aCArIFwicHhcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyAmJiAhaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSB0aGlzLl9zY3JvbGxiYXJXaWR0aCArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9yZXNldEFkanVzdG1lbnRzID0gZnVuY3Rpb24gX3Jlc2V0QWRqdXN0bWVudHMoKSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSAnJztcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnJztcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fY2hlY2tTY3JvbGxiYXIgPSBmdW5jdGlvbiBfY2hlY2tTY3JvbGxiYXIoKSB7XG4gICAgICAgIHZhciByZWN0ID0gZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgPSByZWN0LmxlZnQgKyByZWN0LnJpZ2h0IDwgd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgIHRoaXMuX3Njcm9sbGJhcldpZHRoID0gdGhpcy5fZ2V0U2Nyb2xsYmFyV2lkdGgoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fc2V0U2Nyb2xsYmFyID0gZnVuY3Rpb24gX3NldFNjcm9sbGJhcigpIHtcbiAgICAgICAgdmFyIF90aGlzOSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzQm9keU92ZXJmbG93aW5nKSB7XG4gICAgICAgICAgLy8gTm90ZTogRE9NTm9kZS5zdHlsZS5wYWRkaW5nUmlnaHQgcmV0dXJucyB0aGUgYWN0dWFsIHZhbHVlIG9yICcnIGlmIG5vdCBzZXRcbiAgICAgICAgICAvLyAgIHdoaWxlICQoRE9NTm9kZSkuY3NzKCdwYWRkaW5nLXJpZ2h0JykgcmV0dXJucyB0aGUgY2FsY3VsYXRlZCB2YWx1ZSBvciAwIGlmIG5vdCBzZXRcbiAgICAgICAgICB2YXIgZml4ZWRDb250ZW50ID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNlbGVjdG9yLkZJWEVEX0NPTlRFTlQpKTtcbiAgICAgICAgICB2YXIgc3RpY2t5Q29udGVudCA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTZWxlY3Rvci5TVElDS1lfQ09OVEVOVCkpOyAvLyBBZGp1c3QgZml4ZWQgY29udGVudCBwYWRkaW5nXG5cbiAgICAgICAgICAkJCQxKGZpeGVkQ29udGVudCkuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBhY3R1YWxQYWRkaW5nID0gZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQ7XG4gICAgICAgICAgICB2YXIgY2FsY3VsYXRlZFBhZGRpbmcgPSAkJCQxKGVsZW1lbnQpLmNzcygncGFkZGluZy1yaWdodCcpO1xuICAgICAgICAgICAgJCQkMShlbGVtZW50KS5kYXRhKCdwYWRkaW5nLXJpZ2h0JywgYWN0dWFsUGFkZGluZykuY3NzKCdwYWRkaW5nLXJpZ2h0JywgcGFyc2VGbG9hdChjYWxjdWxhdGVkUGFkZGluZykgKyBfdGhpczkuX3Njcm9sbGJhcldpZHRoICsgXCJweFwiKTtcbiAgICAgICAgICB9KTsgLy8gQWRqdXN0IHN0aWNreSBjb250ZW50IG1hcmdpblxuXG4gICAgICAgICAgJCQkMShzdGlja3lDb250ZW50KS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgICAgdmFyIGFjdHVhbE1hcmdpbiA9IGVsZW1lbnQuc3R5bGUubWFyZ2luUmlnaHQ7XG4gICAgICAgICAgICB2YXIgY2FsY3VsYXRlZE1hcmdpbiA9ICQkJDEoZWxlbWVudCkuY3NzKCdtYXJnaW4tcmlnaHQnKTtcbiAgICAgICAgICAgICQkJDEoZWxlbWVudCkuZGF0YSgnbWFyZ2luLXJpZ2h0JywgYWN0dWFsTWFyZ2luKS5jc3MoJ21hcmdpbi1yaWdodCcsIHBhcnNlRmxvYXQoY2FsY3VsYXRlZE1hcmdpbikgLSBfdGhpczkuX3Njcm9sbGJhcldpZHRoICsgXCJweFwiKTtcbiAgICAgICAgICB9KTsgLy8gQWRqdXN0IGJvZHkgcGFkZGluZ1xuXG4gICAgICAgICAgdmFyIGFjdHVhbFBhZGRpbmcgPSBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodDtcbiAgICAgICAgICB2YXIgY2FsY3VsYXRlZFBhZGRpbmcgPSAkJCQxKGRvY3VtZW50LmJvZHkpLmNzcygncGFkZGluZy1yaWdodCcpO1xuICAgICAgICAgICQkJDEoZG9jdW1lbnQuYm9keSkuZGF0YSgncGFkZGluZy1yaWdodCcsIGFjdHVhbFBhZGRpbmcpLmNzcygncGFkZGluZy1yaWdodCcsIHBhcnNlRmxvYXQoY2FsY3VsYXRlZFBhZGRpbmcpICsgdGhpcy5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCIpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX3Jlc2V0U2Nyb2xsYmFyID0gZnVuY3Rpb24gX3Jlc2V0U2Nyb2xsYmFyKCkge1xuICAgICAgICAvLyBSZXN0b3JlIGZpeGVkIGNvbnRlbnQgcGFkZGluZ1xuICAgICAgICB2YXIgZml4ZWRDb250ZW50ID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNlbGVjdG9yLkZJWEVEX0NPTlRFTlQpKTtcbiAgICAgICAgJCQkMShmaXhlZENvbnRlbnQpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIHBhZGRpbmcgPSAkJCQxKGVsZW1lbnQpLmRhdGEoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgICAkJCQxKGVsZW1lbnQpLnJlbW92ZURhdGEoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9IHBhZGRpbmcgPyBwYWRkaW5nIDogJyc7XG4gICAgICAgIH0pOyAvLyBSZXN0b3JlIHN0aWNreSBjb250ZW50XG5cbiAgICAgICAgdmFyIGVsZW1lbnRzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiXCIgKyBTZWxlY3Rvci5TVElDS1lfQ09OVEVOVCkpO1xuICAgICAgICAkJCQxKGVsZW1lbnRzKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgIHZhciBtYXJnaW4gPSAkJCQxKGVsZW1lbnQpLmRhdGEoJ21hcmdpbi1yaWdodCcpO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBtYXJnaW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAkJCQxKGVsZW1lbnQpLmNzcygnbWFyZ2luLXJpZ2h0JywgbWFyZ2luKS5yZW1vdmVEYXRhKCdtYXJnaW4tcmlnaHQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pOyAvLyBSZXN0b3JlIGJvZHkgcGFkZGluZ1xuXG4gICAgICAgIHZhciBwYWRkaW5nID0gJCQkMShkb2N1bWVudC5ib2R5KS5kYXRhKCdwYWRkaW5nLXJpZ2h0Jyk7XG4gICAgICAgICQkJDEoZG9jdW1lbnQuYm9keSkucmVtb3ZlRGF0YSgncGFkZGluZy1yaWdodCcpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHBhZGRpbmcgPyBwYWRkaW5nIDogJyc7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2dldFNjcm9sbGJhcldpZHRoID0gZnVuY3Rpb24gX2dldFNjcm9sbGJhcldpZHRoKCkge1xuICAgICAgICAvLyB0aHggZC53YWxzaFxuICAgICAgICB2YXIgc2Nyb2xsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHNjcm9sbERpdi5jbGFzc05hbWUgPSBDbGFzc05hbWUuU0NST0xMQkFSX01FQVNVUkVSO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcm9sbERpdik7XG4gICAgICAgIHZhciBzY3JvbGxiYXJXaWR0aCA9IHNjcm9sbERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIHNjcm9sbERpdi5jbGllbnRXaWR0aDtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzY3JvbGxEaXYpO1xuICAgICAgICByZXR1cm4gc2Nyb2xsYmFyV2lkdGg7XG4gICAgICB9OyAvLyBTdGF0aWNcblxuXG4gICAgICBNb2RhbC5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcsIHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgICAgdmFyIF9jb25maWcgPSBfb2JqZWN0U3ByZWFkKHt9LCBEZWZhdWx0LCAkJCQxKHRoaXMpLmRhdGEoKSwgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pO1xuXG4gICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0gbmV3IE1vZGFsKHRoaXMsIF9jb25maWcpO1xuICAgICAgICAgICAgJCQkMSh0aGlzKS5kYXRhKERBVEFfS0VZLCBkYXRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFxcXCJcIiArIGNvbmZpZyArIFwiXFxcIlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0YVtjb25maWddKHJlbGF0ZWRUYXJnZXQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoX2NvbmZpZy5zaG93KSB7XG4gICAgICAgICAgICBkYXRhLnNob3cocmVsYXRlZFRhcmdldCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIF9jcmVhdGVDbGFzcyhNb2RhbCwgbnVsbCwgW3tcbiAgICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIFZFUlNJT047XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1dKTtcblxuICAgICAgcmV0dXJuIE1vZGFsO1xuICAgIH0oKTtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG5cbiAgICAkJCQxKGRvY3VtZW50KS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIF90aGlzMTAgPSB0aGlzO1xuXG4gICAgICB2YXIgdGFyZ2V0O1xuICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMpO1xuXG4gICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb25maWcgPSAkJCQxKHRhcmdldCkuZGF0YShEQVRBX0tFWSkgPyAndG9nZ2xlJyA6IF9vYmplY3RTcHJlYWQoe30sICQkJDEodGFyZ2V0KS5kYXRhKCksICQkJDEodGhpcykuZGF0YSgpKTtcblxuICAgICAgaWYgKHRoaXMudGFnTmFtZSA9PT0gJ0EnIHx8IHRoaXMudGFnTmFtZSA9PT0gJ0FSRUEnKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIHZhciAkdGFyZ2V0ID0gJCQkMSh0YXJnZXQpLm9uZShFdmVudC5TSE9XLCBmdW5jdGlvbiAoc2hvd0V2ZW50KSB7XG4gICAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICAvLyBPbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgJHRhcmdldC5vbmUoRXZlbnQuSElEREVOLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCQkJDEoX3RoaXMxMCkuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgICAgICAgIF90aGlzMTAuZm9jdXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIE1vZGFsLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkJCQxKHRhcmdldCksIGNvbmZpZywgdGhpcyk7XG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogalF1ZXJ5XG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG5cbiAgICAkJCQxLmZuW05BTUVdID0gTW9kYWwuX2pRdWVyeUludGVyZmFjZTtcbiAgICAkJCQxLmZuW05BTUVdLkNvbnN0cnVjdG9yID0gTW9kYWw7XG5cbiAgICAkJCQxLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAkJCQxLmZuW05BTUVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgICAgcmV0dXJuIE1vZGFsLl9qUXVlcnlJbnRlcmZhY2U7XG4gICAgfTtcblxuICAgIHJldHVybiBNb2RhbDtcbiAgfSgkKTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwICh2NC4xLjIpOiB0b29sdGlwLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBUb29sdGlwID0gZnVuY3Rpb24gKCQkJDEpIHtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBDb25zdGFudHNcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cbiAgICB2YXIgTkFNRSA9ICd0b29sdGlwJztcbiAgICB2YXIgVkVSU0lPTiA9ICc0LjEuMic7XG4gICAgdmFyIERBVEFfS0VZID0gJ2JzLnRvb2x0aXAnO1xuICAgIHZhciBFVkVOVF9LRVkgPSBcIi5cIiArIERBVEFfS0VZO1xuICAgIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkJCQxLmZuW05BTUVdO1xuICAgIHZhciBDTEFTU19QUkVGSVggPSAnYnMtdG9vbHRpcCc7XG4gICAgdmFyIEJTQ0xTX1BSRUZJWF9SRUdFWCA9IG5ldyBSZWdFeHAoXCIoXnxcXFxccylcIiArIENMQVNTX1BSRUZJWCArIFwiXFxcXFMrXCIsICdnJyk7XG4gICAgdmFyIERlZmF1bHRUeXBlID0ge1xuICAgICAgYW5pbWF0aW9uOiAnYm9vbGVhbicsXG4gICAgICB0ZW1wbGF0ZTogJ3N0cmluZycsXG4gICAgICB0aXRsZTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknLFxuICAgICAgdHJpZ2dlcjogJ3N0cmluZycsXG4gICAgICBkZWxheTogJyhudW1iZXJ8b2JqZWN0KScsXG4gICAgICBodG1sOiAnYm9vbGVhbicsXG4gICAgICBzZWxlY3RvcjogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICAgICAgcGxhY2VtZW50OiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICAgICAgb2Zmc2V0OiAnKG51bWJlcnxzdHJpbmcpJyxcbiAgICAgIGNvbnRhaW5lcjogJyhzdHJpbmd8ZWxlbWVudHxib29sZWFuKScsXG4gICAgICBmYWxsYmFja1BsYWNlbWVudDogJyhzdHJpbmd8YXJyYXkpJyxcbiAgICAgIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KSdcbiAgICB9O1xuICAgIHZhciBBdHRhY2htZW50TWFwID0ge1xuICAgICAgQVVUTzogJ2F1dG8nLFxuICAgICAgVE9QOiAndG9wJyxcbiAgICAgIFJJR0hUOiAncmlnaHQnLFxuICAgICAgQk9UVE9NOiAnYm90dG9tJyxcbiAgICAgIExFRlQ6ICdsZWZ0J1xuICAgIH07XG4gICAgdmFyIERlZmF1bHQgPSB7XG4gICAgICBhbmltYXRpb246IHRydWUsXG4gICAgICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJ0b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj4nICsgJzxkaXYgY2xhc3M9XCJhcnJvd1wiPjwvZGl2PicgKyAnPGRpdiBjbGFzcz1cInRvb2x0aXAtaW5uZXJcIj48L2Rpdj48L2Rpdj4nLFxuICAgICAgdHJpZ2dlcjogJ2hvdmVyIGZvY3VzJyxcbiAgICAgIHRpdGxlOiAnJyxcbiAgICAgIGRlbGF5OiAwLFxuICAgICAgaHRtbDogZmFsc2UsXG4gICAgICBzZWxlY3RvcjogZmFsc2UsXG4gICAgICBwbGFjZW1lbnQ6ICd0b3AnLFxuICAgICAgb2Zmc2V0OiAwLFxuICAgICAgY29udGFpbmVyOiBmYWxzZSxcbiAgICAgIGZhbGxiYWNrUGxhY2VtZW50OiAnZmxpcCcsXG4gICAgICBib3VuZGFyeTogJ3Njcm9sbFBhcmVudCdcbiAgICB9O1xuICAgIHZhciBIb3ZlclN0YXRlID0ge1xuICAgICAgU0hPVzogJ3Nob3cnLFxuICAgICAgT1VUOiAnb3V0J1xuICAgIH07XG4gICAgdmFyIEV2ZW50ID0ge1xuICAgICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVksXG4gICAgICBISURERU46IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVksXG4gICAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSxcbiAgICAgIFNIT1dOOiBcInNob3duXCIgKyBFVkVOVF9LRVksXG4gICAgICBJTlNFUlRFRDogXCJpbnNlcnRlZFwiICsgRVZFTlRfS0VZLFxuICAgICAgQ0xJQ0s6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSxcbiAgICAgIEZPQ1VTSU46IFwiZm9jdXNpblwiICsgRVZFTlRfS0VZLFxuICAgICAgRk9DVVNPVVQ6IFwiZm9jdXNvdXRcIiArIEVWRU5UX0tFWSxcbiAgICAgIE1PVVNFRU5URVI6IFwibW91c2VlbnRlclwiICsgRVZFTlRfS0VZLFxuICAgICAgTU9VU0VMRUFWRTogXCJtb3VzZWxlYXZlXCIgKyBFVkVOVF9LRVlcbiAgICB9O1xuICAgIHZhciBDbGFzc05hbWUgPSB7XG4gICAgICBGQURFOiAnZmFkZScsXG4gICAgICBTSE9XOiAnc2hvdydcbiAgICB9O1xuICAgIHZhciBTZWxlY3RvciA9IHtcbiAgICAgIFRPT0xUSVA6ICcudG9vbHRpcCcsXG4gICAgICBUT09MVElQX0lOTkVSOiAnLnRvb2x0aXAtaW5uZXInLFxuICAgICAgQVJST1c6ICcuYXJyb3cnXG4gICAgfTtcbiAgICB2YXIgVHJpZ2dlciA9IHtcbiAgICAgIEhPVkVSOiAnaG92ZXInLFxuICAgICAgRk9DVVM6ICdmb2N1cycsXG4gICAgICBDTElDSzogJ2NsaWNrJyxcbiAgICAgIE1BTlVBTDogJ21hbnVhbCdcbiAgICAgIC8qKlxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAqL1xuXG4gICAgfTtcblxuICAgIHZhciBUb29sdGlwID1cbiAgICAvKiNfX1BVUkVfXyovXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gVG9vbHRpcChlbGVtZW50LCBjb25maWcpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIGZvciBQb3BwZXIgZGVwZW5kZW5jeVxuICAgICAgICAgKiBQb3BwZXIgLSBodHRwczovL3BvcHBlci5qcy5vcmdcbiAgICAgICAgICovXG4gICAgICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Jvb3RzdHJhcCB0b29sdGlwcyByZXF1aXJlIFBvcHBlci5qcyAoaHR0cHM6Ly9wb3BwZXIuanMub3JnKScpO1xuICAgICAgICB9IC8vIHByaXZhdGVcblxuXG4gICAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSAwO1xuICAgICAgICB0aGlzLl9ob3ZlclN0YXRlID0gJyc7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIgPSB7fTtcbiAgICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDsgLy8gUHJvdGVjdGVkXG5cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgICAgdGhpcy50aXAgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3NldExpc3RlbmVycygpO1xuICAgICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgICAgdmFyIF9wcm90byA9IFRvb2x0aXAucHJvdG90eXBlO1xuXG4gICAgICAvLyBQdWJsaWNcbiAgICAgIF9wcm90by5lbmFibGUgPSBmdW5jdGlvbiBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uZGlzYWJsZSA9IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnRvZ2dsZUVuYWJsZWQgPSBmdW5jdGlvbiB0b2dnbGVFbmFibGVkKCkge1xuICAgICAgICB0aGlzLl9pc0VuYWJsZWQgPSAhdGhpcy5faXNFbmFibGVkO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZShldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHZhciBkYXRhS2V5ID0gdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTtcbiAgICAgICAgICB2YXIgY29udGV4dCA9ICQkJDEoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5KTtcblxuICAgICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgICAgY29udGV4dCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGV2ZW50LmN1cnJlbnRUYXJnZXQsIHRoaXMuX2dldERlbGVnYXRlQ29uZmlnKCkpO1xuICAgICAgICAgICAgJCQkMShldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXksIGNvbnRleHQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXIuY2xpY2sgPSAhY29udGV4dC5fYWN0aXZlVHJpZ2dlci5jbGljaztcblxuICAgICAgICAgIGlmIChjb250ZXh0Ll9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgICAgIGNvbnRleHQuX2VudGVyKG51bGwsIGNvbnRleHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZXh0Ll9sZWF2ZShudWxsLCBjb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCQkJDEodGhpcy5nZXRUaXBFbGVtZW50KCkpLmhhc0NsYXNzKENsYXNzTmFtZS5TSE9XKSkge1xuICAgICAgICAgICAgdGhpcy5fbGVhdmUobnVsbCwgdGhpcyk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9lbnRlcihudWxsLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgICAgICQkJDEucmVtb3ZlRGF0YSh0aGlzLmVsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVkpO1xuICAgICAgICAkJCQxKHRoaXMuZWxlbWVudCkub2ZmKHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKTtcbiAgICAgICAgJCQkMSh0aGlzLmVsZW1lbnQpLmNsb3Nlc3QoJy5tb2RhbCcpLm9mZignaGlkZS5icy5tb2RhbCcpO1xuXG4gICAgICAgIGlmICh0aGlzLnRpcCkge1xuICAgICAgICAgICQkJDEodGhpcy50aXApLnJlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faXNFbmFibGVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdGltZW91dCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2hvdmVyU3RhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5fcG9wcGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuY29uZmlnID0gbnVsbDtcbiAgICAgICAgdGhpcy50aXAgPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnNob3cgPSBmdW5jdGlvbiBzaG93KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIGlmICgkJCQxKHRoaXMuZWxlbWVudCkuY3NzKCdkaXNwbGF5JykgPT09ICdub25lJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHVzZSBzaG93IG9uIHZpc2libGUgZWxlbWVudHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaG93RXZlbnQgPSAkJCQxLkV2ZW50KHRoaXMuY29uc3RydWN0b3IuRXZlbnQuU0hPVyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNXaXRoQ29udGVudCgpICYmIHRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgICAgICQkJDEodGhpcy5lbGVtZW50KS50cmlnZ2VyKHNob3dFdmVudCk7XG4gICAgICAgICAgdmFyIGlzSW5UaGVEb20gPSAkJCQxLmNvbnRhaW5zKHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgdGhpcy5lbGVtZW50KTtcblxuICAgICAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgfHwgIWlzSW5UaGVEb20pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgdGlwID0gdGhpcy5nZXRUaXBFbGVtZW50KCk7XG4gICAgICAgICAgdmFyIHRpcElkID0gVXRpbC5nZXRVSUQodGhpcy5jb25zdHJ1Y3Rvci5OQU1FKTtcbiAgICAgICAgICB0aXAuc2V0QXR0cmlidXRlKCdpZCcsIHRpcElkKTtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JywgdGlwSWQpO1xuICAgICAgICAgIHRoaXMuc2V0Q29udGVudCgpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgICAgICAgJCQkMSh0aXApLmFkZENsYXNzKENsYXNzTmFtZS5GQURFKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcGxhY2VtZW50ID0gdHlwZW9mIHRoaXMuY29uZmlnLnBsYWNlbWVudCA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuY29uZmlnLnBsYWNlbWVudC5jYWxsKHRoaXMsIHRpcCwgdGhpcy5lbGVtZW50KSA6IHRoaXMuY29uZmlnLnBsYWNlbWVudDtcblxuICAgICAgICAgIHZhciBhdHRhY2htZW50ID0gdGhpcy5fZ2V0QXR0YWNobWVudChwbGFjZW1lbnQpO1xuXG4gICAgICAgICAgdGhpcy5hZGRBdHRhY2htZW50Q2xhc3MoYXR0YWNobWVudCk7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29uZmlnLmNvbnRhaW5lciA9PT0gZmFsc2UgPyBkb2N1bWVudC5ib2R5IDogJCQkMShkb2N1bWVudCkuZmluZCh0aGlzLmNvbmZpZy5jb250YWluZXIpO1xuICAgICAgICAgICQkJDEodGlwKS5kYXRhKHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVksIHRoaXMpO1xuXG4gICAgICAgICAgaWYgKCEkJCQxLmNvbnRhaW5zKHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgdGhpcy50aXApKSB7XG4gICAgICAgICAgICAkJCQxKHRpcCkuYXBwZW5kVG8oY29udGFpbmVyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAkJCQxKHRoaXMuZWxlbWVudCkudHJpZ2dlcih0aGlzLmNvbnN0cnVjdG9yLkV2ZW50LklOU0VSVEVEKTtcbiAgICAgICAgICB0aGlzLl9wb3BwZXIgPSBuZXcgUG9wcGVyKHRoaXMuZWxlbWVudCwgdGlwLCB7XG4gICAgICAgICAgICBwbGFjZW1lbnQ6IGF0dGFjaG1lbnQsXG4gICAgICAgICAgICBtb2RpZmllcnM6IHtcbiAgICAgICAgICAgICAgb2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLmNvbmZpZy5vZmZzZXRcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZmxpcDoge1xuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB0aGlzLmNvbmZpZy5mYWxsYmFja1BsYWNlbWVudFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhcnJvdzoge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IFNlbGVjdG9yLkFSUk9XXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHByZXZlbnRPdmVyZmxvdzoge1xuICAgICAgICAgICAgICAgIGJvdW5kYXJpZXNFbGVtZW50OiB0aGlzLmNvbmZpZy5ib3VuZGFyeVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DcmVhdGU6IGZ1bmN0aW9uIG9uQ3JlYXRlKGRhdGEpIHtcbiAgICAgICAgICAgICAgaWYgKGRhdGEub3JpZ2luYWxQbGFjZW1lbnQgIT09IGRhdGEucGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZShkYXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uVXBkYXRlOiBmdW5jdGlvbiBvblVwZGF0ZShkYXRhKSB7XG4gICAgICAgICAgICAgIF90aGlzLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgJCQkMSh0aXApLmFkZENsYXNzKENsYXNzTmFtZS5TSE9XKTsgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgICAgICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgICAgICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAgICAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcblxuICAgICAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICQkJDEoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vbignbW91c2VvdmVyJywgbnVsbCwgJCQkMS5ub29wKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5jb25maWcuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgIF90aGlzLl9maXhUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBwcmV2SG92ZXJTdGF0ZSA9IF90aGlzLl9ob3ZlclN0YXRlO1xuICAgICAgICAgICAgX3RoaXMuX2hvdmVyU3RhdGUgPSBudWxsO1xuICAgICAgICAgICAgJCQkMShfdGhpcy5lbGVtZW50KS50cmlnZ2VyKF90aGlzLmNvbnN0cnVjdG9yLkV2ZW50LlNIT1dOKTtcblxuICAgICAgICAgICAgaWYgKHByZXZIb3ZlclN0YXRlID09PSBIb3ZlclN0YXRlLk9VVCkge1xuICAgICAgICAgICAgICBfdGhpcy5fbGVhdmUobnVsbCwgX3RoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoJCQkMSh0aGlzLnRpcCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLkZBREUpKSB7XG4gICAgICAgICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLnRpcCk7XG4gICAgICAgICAgICAkJCQxKHRoaXMudGlwKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uaGlkZSA9IGZ1bmN0aW9uIGhpZGUoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIHRpcCA9IHRoaXMuZ2V0VGlwRWxlbWVudCgpO1xuICAgICAgICB2YXIgaGlkZUV2ZW50ID0gJCQkMS5FdmVudCh0aGlzLmNvbnN0cnVjdG9yLkV2ZW50LkhJREUpO1xuXG4gICAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICAgIGlmIChfdGhpczIuX2hvdmVyU3RhdGUgIT09IEhvdmVyU3RhdGUuU0hPVyAmJiB0aXAucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGlwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGlwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczIuX2NsZWFuVGlwQ2xhc3MoKTtcblxuICAgICAgICAgIF90aGlzMi5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpO1xuXG4gICAgICAgICAgJCQkMShfdGhpczIuZWxlbWVudCkudHJpZ2dlcihfdGhpczIuY29uc3RydWN0b3IuRXZlbnQuSElEREVOKTtcblxuICAgICAgICAgIGlmIChfdGhpczIuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgX3RoaXMyLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgJCQkMSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIoaGlkZUV2ZW50KTtcblxuICAgICAgICBpZiAoaGlkZUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgJCQkMSh0aXApLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5TSE9XKTsgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIHJlbW92ZSB0aGUgZXh0cmFcbiAgICAgICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcblxuICAgICAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICAgICAgJCQkMShkb2N1bWVudC5ib2R5KS5jaGlsZHJlbigpLm9mZignbW91c2VvdmVyJywgbnVsbCwgJCQkMS5ub29wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVHJpZ2dlci5DTElDS10gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUcmlnZ2VyLkZPQ1VTXSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RyaWdnZXIuSE9WRVJdID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCQkJDEodGhpcy50aXApLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKSkge1xuICAgICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRpcCk7XG4gICAgICAgICAgJCQkMSh0aXApLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faG92ZXJTdGF0ZSA9ICcnO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX3BvcHBlci5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9OyAvLyBQcm90ZWN0ZWRcblxuXG4gICAgICBfcHJvdG8uaXNXaXRoQ29udGVudCA9IGZ1bmN0aW9uIGlzV2l0aENvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuZ2V0VGl0bGUoKSk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uYWRkQXR0YWNobWVudENsYXNzID0gZnVuY3Rpb24gYWRkQXR0YWNobWVudENsYXNzKGF0dGFjaG1lbnQpIHtcbiAgICAgICAgJCQkMSh0aGlzLmdldFRpcEVsZW1lbnQoKSkuYWRkQ2xhc3MoQ0xBU1NfUFJFRklYICsgXCItXCIgKyBhdHRhY2htZW50KTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5nZXRUaXBFbGVtZW50ID0gZnVuY3Rpb24gZ2V0VGlwRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy50aXAgPSB0aGlzLnRpcCB8fCAkJCQxKHRoaXMuY29uZmlnLnRlbXBsYXRlKVswXTtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlwO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnNldENvbnRlbnQgPSBmdW5jdGlvbiBzZXRDb250ZW50KCkge1xuICAgICAgICB2YXIgdGlwID0gdGhpcy5nZXRUaXBFbGVtZW50KCk7XG4gICAgICAgIHRoaXMuc2V0RWxlbWVudENvbnRlbnQoJCQkMSh0aXAucXVlcnlTZWxlY3RvckFsbChTZWxlY3Rvci5UT09MVElQX0lOTkVSKSksIHRoaXMuZ2V0VGl0bGUoKSk7XG4gICAgICAgICQkJDEodGlwKS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuRkFERSArIFwiIFwiICsgQ2xhc3NOYW1lLlNIT1cpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnNldEVsZW1lbnRDb250ZW50ID0gZnVuY3Rpb24gc2V0RWxlbWVudENvbnRlbnQoJGVsZW1lbnQsIGNvbnRlbnQpIHtcbiAgICAgICAgdmFyIGh0bWwgPSB0aGlzLmNvbmZpZy5odG1sO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ29iamVjdCcgJiYgKGNvbnRlbnQubm9kZVR5cGUgfHwgY29udGVudC5qcXVlcnkpKSB7XG4gICAgICAgICAgLy8gQ29udGVudCBpcyBhIERPTSBub2RlIG9yIGEgalF1ZXJ5XG4gICAgICAgICAgaWYgKGh0bWwpIHtcbiAgICAgICAgICAgIGlmICghJCQkMShjb250ZW50KS5wYXJlbnQoKS5pcygkZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgJGVsZW1lbnQuZW1wdHkoKS5hcHBlbmQoY29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRlbGVtZW50LnRleHQoJCQkMShjb250ZW50KS50ZXh0KCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkZWxlbWVudFtodG1sID8gJ2h0bWwnIDogJ3RleHQnXShjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmdldFRpdGxlID0gZnVuY3Rpb24gZ2V0VGl0bGUoKSB7XG4gICAgICAgIHZhciB0aXRsZSA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnKTtcblxuICAgICAgICBpZiAoIXRpdGxlKSB7XG4gICAgICAgICAgdGl0bGUgPSB0eXBlb2YgdGhpcy5jb25maWcudGl0bGUgPT09ICdmdW5jdGlvbicgPyB0aGlzLmNvbmZpZy50aXRsZS5jYWxsKHRoaXMuZWxlbWVudCkgOiB0aGlzLmNvbmZpZy50aXRsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aXRsZTtcbiAgICAgIH07IC8vIFByaXZhdGVcblxuXG4gICAgICBfcHJvdG8uX2dldEF0dGFjaG1lbnQgPSBmdW5jdGlvbiBfZ2V0QXR0YWNobWVudChwbGFjZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIEF0dGFjaG1lbnRNYXBbcGxhY2VtZW50LnRvVXBwZXJDYXNlKCldO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9zZXRMaXN0ZW5lcnMgPSBmdW5jdGlvbiBfc2V0TGlzdGVuZXJzKCkge1xuICAgICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgICB2YXIgdHJpZ2dlcnMgPSB0aGlzLmNvbmZpZy50cmlnZ2VyLnNwbGl0KCcgJyk7XG4gICAgICAgIHRyaWdnZXJzLmZvckVhY2goZnVuY3Rpb24gKHRyaWdnZXIpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgICAgICAgJCQkMShfdGhpczMuZWxlbWVudCkub24oX3RoaXMzLmNvbnN0cnVjdG9yLkV2ZW50LkNMSUNLLCBfdGhpczMuY29uZmlnLnNlbGVjdG9yLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy50b2dnbGUoZXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyICE9PSBUcmlnZ2VyLk1BTlVBTCkge1xuICAgICAgICAgICAgdmFyIGV2ZW50SW4gPSB0cmlnZ2VyID09PSBUcmlnZ2VyLkhPVkVSID8gX3RoaXMzLmNvbnN0cnVjdG9yLkV2ZW50Lk1PVVNFRU5URVIgOiBfdGhpczMuY29uc3RydWN0b3IuRXZlbnQuRk9DVVNJTjtcbiAgICAgICAgICAgIHZhciBldmVudE91dCA9IHRyaWdnZXIgPT09IFRyaWdnZXIuSE9WRVIgPyBfdGhpczMuY29uc3RydWN0b3IuRXZlbnQuTU9VU0VMRUFWRSA6IF90aGlzMy5jb25zdHJ1Y3Rvci5FdmVudC5GT0NVU09VVDtcbiAgICAgICAgICAgICQkJDEoX3RoaXMzLmVsZW1lbnQpLm9uKGV2ZW50SW4sIF90aGlzMy5jb25maWcuc2VsZWN0b3IsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzLl9lbnRlcihldmVudCk7XG4gICAgICAgICAgICB9KS5vbihldmVudE91dCwgX3RoaXMzLmNvbmZpZy5zZWxlY3RvciwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczMuX2xlYXZlKGV2ZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICQkJDEoX3RoaXMzLmVsZW1lbnQpLmNsb3Nlc3QoJy5tb2RhbCcpLm9uKCdoaWRlLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5oaWRlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5zZWxlY3Rvcikge1xuICAgICAgICAgIHRoaXMuY29uZmlnID0gX29iamVjdFNwcmVhZCh7fSwgdGhpcy5jb25maWcsIHtcbiAgICAgICAgICAgIHRyaWdnZXI6ICdtYW51YWwnLFxuICAgICAgICAgICAgc2VsZWN0b3I6ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fZml4VGl0bGUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9maXhUaXRsZSA9IGZ1bmN0aW9uIF9maXhUaXRsZSgpIHtcbiAgICAgICAgdmFyIHRpdGxlVHlwZSA9IHR5cGVvZiB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbmFsLXRpdGxlJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJykgfHwgdGl0bGVUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnLCB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpIHx8ICcnKTtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICcnKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9lbnRlciA9IGZ1bmN0aW9uIF9lbnRlcihldmVudCwgY29udGV4dCkge1xuICAgICAgICB2YXIgZGF0YUtleSA9IHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVk7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8ICQkJDEoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5KTtcblxuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICBjb250ZXh0ID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZXZlbnQuY3VycmVudFRhcmdldCwgdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSk7XG4gICAgICAgICAgJCQkMShldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXksIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltldmVudC50eXBlID09PSAnZm9jdXNpbicgPyBUcmlnZ2VyLkZPQ1VTIDogVHJpZ2dlci5IT1ZFUl0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCQkJDEoY29udGV4dC5nZXRUaXBFbGVtZW50KCkpLmhhc0NsYXNzKENsYXNzTmFtZS5TSE9XKSB8fCBjb250ZXh0Ll9ob3ZlclN0YXRlID09PSBIb3ZlclN0YXRlLlNIT1cpIHtcbiAgICAgICAgICBjb250ZXh0Ll9ob3ZlclN0YXRlID0gSG92ZXJTdGF0ZS5TSE9XO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsZWFyVGltZW91dChjb250ZXh0Ll90aW1lb3V0KTtcbiAgICAgICAgY29udGV4dC5faG92ZXJTdGF0ZSA9IEhvdmVyU3RhdGUuU0hPVztcblxuICAgICAgICBpZiAoIWNvbnRleHQuY29uZmlnLmRlbGF5IHx8ICFjb250ZXh0LmNvbmZpZy5kZWxheS5zaG93KSB7XG4gICAgICAgICAgY29udGV4dC5zaG93KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChjb250ZXh0Ll9ob3ZlclN0YXRlID09PSBIb3ZlclN0YXRlLlNIT1cpIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2hvdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgY29udGV4dC5jb25maWcuZGVsYXkuc2hvdyk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2xlYXZlID0gZnVuY3Rpb24gX2xlYXZlKGV2ZW50LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBkYXRhS2V5ID0gdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgJCQkMShldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXkpO1xuXG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgIGNvbnRleHQgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihldmVudC5jdXJyZW50VGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKTtcbiAgICAgICAgICAkJCQxKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoZGF0YUtleSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c291dCcgPyBUcmlnZ2VyLkZPQ1VTIDogVHJpZ2dlci5IT1ZFUl0gPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Ll9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjbGVhclRpbWVvdXQoY29udGV4dC5fdGltZW91dCk7XG4gICAgICAgIGNvbnRleHQuX2hvdmVyU3RhdGUgPSBIb3ZlclN0YXRlLk9VVDtcblxuICAgICAgICBpZiAoIWNvbnRleHQuY29uZmlnLmRlbGF5IHx8ICFjb250ZXh0LmNvbmZpZy5kZWxheS5oaWRlKSB7XG4gICAgICAgICAgY29udGV4dC5oaWRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChjb250ZXh0Ll9ob3ZlclN0YXRlID09PSBIb3ZlclN0YXRlLk9VVCkge1xuICAgICAgICAgICAgY29udGV4dC5oaWRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBjb250ZXh0LmNvbmZpZy5kZWxheS5oaWRlKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5faXNXaXRoQWN0aXZlVHJpZ2dlciA9IGZ1bmN0aW9uIF9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkge1xuICAgICAgICBmb3IgKHZhciB0cmlnZ2VyIGluIHRoaXMuX2FjdGl2ZVRyaWdnZXIpIHtcbiAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlVHJpZ2dlclt0cmlnZ2VyXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgICBjb25maWcgPSBfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHQsICQkJDEodGhpcy5lbGVtZW50KS5kYXRhKCksIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KTtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5kZWxheSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBjb25maWcuZGVsYXkgPSB7XG4gICAgICAgICAgICBzaG93OiBjb25maWcuZGVsYXksXG4gICAgICAgICAgICBoaWRlOiBjb25maWcuZGVsYXlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcudGl0bGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgY29uZmlnLnRpdGxlID0gY29uZmlnLnRpdGxlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5jb250ZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGNvbmZpZy5jb250ZW50ID0gY29uZmlnLmNvbnRlbnQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUsIGNvbmZpZywgdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSk7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2dldERlbGVnYXRlQ29uZmlnID0gZnVuY3Rpb24gX2dldERlbGVnYXRlQ29uZmlnKCkge1xuICAgICAgICB2YXIgY29uZmlnID0ge307XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuY29uZmlnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0W2tleV0gIT09IHRoaXMuY29uZmlnW2tleV0pIHtcbiAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSB0aGlzLmNvbmZpZ1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2NsZWFuVGlwQ2xhc3MgPSBmdW5jdGlvbiBfY2xlYW5UaXBDbGFzcygpIHtcbiAgICAgICAgdmFyICR0aXAgPSAkJCQxKHRoaXMuZ2V0VGlwRWxlbWVudCgpKTtcbiAgICAgICAgdmFyIHRhYkNsYXNzID0gJHRpcC5hdHRyKCdjbGFzcycpLm1hdGNoKEJTQ0xTX1BSRUZJWF9SRUdFWCk7XG5cbiAgICAgICAgaWYgKHRhYkNsYXNzICE9PSBudWxsICYmIHRhYkNsYXNzLmxlbmd0aCkge1xuICAgICAgICAgICR0aXAucmVtb3ZlQ2xhc3ModGFiQ2xhc3Muam9pbignJykpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZSA9IGZ1bmN0aW9uIF9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UocG9wcGVyRGF0YSkge1xuICAgICAgICB2YXIgcG9wcGVySW5zdGFuY2UgPSBwb3BwZXJEYXRhLmluc3RhbmNlO1xuICAgICAgICB0aGlzLnRpcCA9IHBvcHBlckluc3RhbmNlLnBvcHBlcjtcblxuICAgICAgICB0aGlzLl9jbGVhblRpcENsYXNzKCk7XG5cbiAgICAgICAgdGhpcy5hZGRBdHRhY2htZW50Q2xhc3ModGhpcy5fZ2V0QXR0YWNobWVudChwb3BwZXJEYXRhLnBsYWNlbWVudCkpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9maXhUcmFuc2l0aW9uID0gZnVuY3Rpb24gX2ZpeFRyYW5zaXRpb24oKSB7XG4gICAgICAgIHZhciB0aXAgPSB0aGlzLmdldFRpcEVsZW1lbnQoKTtcbiAgICAgICAgdmFyIGluaXRDb25maWdBbmltYXRpb24gPSB0aGlzLmNvbmZpZy5hbmltYXRpb247XG5cbiAgICAgICAgaWYgKHRpcC5nZXRBdHRyaWJ1dGUoJ3gtcGxhY2VtZW50JykgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAkJCQxKHRpcCkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLkZBREUpO1xuICAgICAgICB0aGlzLmNvbmZpZy5hbmltYXRpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICB0aGlzLmNvbmZpZy5hbmltYXRpb24gPSBpbml0Q29uZmlnQW5pbWF0aW9uO1xuICAgICAgfTsgLy8gU3RhdGljXG5cblxuICAgICAgVG9vbHRpcC5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWc7XG5cbiAgICAgICAgICBpZiAoIWRhdGEgJiYgL2Rpc3Bvc2V8aGlkZS8udGVzdChjb25maWcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0gbmV3IFRvb2x0aXAodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgICAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX2NyZWF0ZUNsYXNzKFRvb2x0aXAsIG51bGwsIFt7XG4gICAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBWRVJTSU9OO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBEZWZhdWx0O1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJOQU1FXCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBOQU1FO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJEQVRBX0tFWVwiLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gREFUQV9LRVk7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkV2ZW50XCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBFdmVudDtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBrZXk6IFwiRVZFTlRfS0VZXCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBFVkVOVF9LRVk7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkRlZmF1bHRUeXBlXCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBEZWZhdWx0VHlwZTtcbiAgICAgICAgfVxuICAgICAgfV0pO1xuXG4gICAgICByZXR1cm4gVG9vbHRpcDtcbiAgICB9KCk7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogalF1ZXJ5XG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG5cblxuICAgICQkJDEuZm5bTkFNRV0gPSBUb29sdGlwLl9qUXVlcnlJbnRlcmZhY2U7XG4gICAgJCQkMS5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IFRvb2x0aXA7XG5cbiAgICAkJCQxLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAkJCQxLmZuW05BTUVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgICAgcmV0dXJuIFRvb2x0aXAuX2pRdWVyeUludGVyZmFjZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRvb2x0aXA7XG4gIH0oJCwgUG9wcGVyKTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwICh2NC4xLjIpOiBwb3BvdmVyLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBQb3BvdmVyID0gZnVuY3Rpb24gKCQkJDEpIHtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBDb25zdGFudHNcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cbiAgICB2YXIgTkFNRSA9ICdwb3BvdmVyJztcbiAgICB2YXIgVkVSU0lPTiA9ICc0LjEuMic7XG4gICAgdmFyIERBVEFfS0VZID0gJ2JzLnBvcG92ZXInO1xuICAgIHZhciBFVkVOVF9LRVkgPSBcIi5cIiArIERBVEFfS0VZO1xuICAgIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkJCQxLmZuW05BTUVdO1xuICAgIHZhciBDTEFTU19QUkVGSVggPSAnYnMtcG9wb3Zlcic7XG4gICAgdmFyIEJTQ0xTX1BSRUZJWF9SRUdFWCA9IG5ldyBSZWdFeHAoXCIoXnxcXFxccylcIiArIENMQVNTX1BSRUZJWCArIFwiXFxcXFMrXCIsICdnJyk7XG5cbiAgICB2YXIgRGVmYXVsdCA9IF9vYmplY3RTcHJlYWQoe30sIFRvb2x0aXAuRGVmYXVsdCwge1xuICAgICAgcGxhY2VtZW50OiAncmlnaHQnLFxuICAgICAgdHJpZ2dlcjogJ2NsaWNrJyxcbiAgICAgIGNvbnRlbnQ6ICcnLFxuICAgICAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+JyArICc8ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj4nICsgJzxoMyBjbGFzcz1cInBvcG92ZXItaGVhZGVyXCI+PC9oMz4nICsgJzxkaXYgY2xhc3M9XCJwb3BvdmVyLWJvZHlcIj48L2Rpdj48L2Rpdj4nXG4gICAgfSk7XG5cbiAgICB2YXIgRGVmYXVsdFR5cGUgPSBfb2JqZWN0U3ByZWFkKHt9LCBUb29sdGlwLkRlZmF1bHRUeXBlLCB7XG4gICAgICBjb250ZW50OiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKSdcbiAgICB9KTtcblxuICAgIHZhciBDbGFzc05hbWUgPSB7XG4gICAgICBGQURFOiAnZmFkZScsXG4gICAgICBTSE9XOiAnc2hvdydcbiAgICB9O1xuICAgIHZhciBTZWxlY3RvciA9IHtcbiAgICAgIFRJVExFOiAnLnBvcG92ZXItaGVhZGVyJyxcbiAgICAgIENPTlRFTlQ6ICcucG9wb3Zlci1ib2R5J1xuICAgIH07XG4gICAgdmFyIEV2ZW50ID0ge1xuICAgICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVksXG4gICAgICBISURERU46IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVksXG4gICAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSxcbiAgICAgIFNIT1dOOiBcInNob3duXCIgKyBFVkVOVF9LRVksXG4gICAgICBJTlNFUlRFRDogXCJpbnNlcnRlZFwiICsgRVZFTlRfS0VZLFxuICAgICAgQ0xJQ0s6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSxcbiAgICAgIEZPQ1VTSU46IFwiZm9jdXNpblwiICsgRVZFTlRfS0VZLFxuICAgICAgRk9DVVNPVVQ6IFwiZm9jdXNvdXRcIiArIEVWRU5UX0tFWSxcbiAgICAgIE1PVVNFRU5URVI6IFwibW91c2VlbnRlclwiICsgRVZFTlRfS0VZLFxuICAgICAgTU9VU0VMRUFWRTogXCJtb3VzZWxlYXZlXCIgKyBFVkVOVF9LRVlcbiAgICAgIC8qKlxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAqL1xuXG4gICAgfTtcblxuICAgIHZhciBQb3BvdmVyID1cbiAgICAvKiNfX1BVUkVfXyovXG4gICAgZnVuY3Rpb24gKF9Ub29sdGlwKSB7XG4gICAgICBfaW5oZXJpdHNMb29zZShQb3BvdmVyLCBfVG9vbHRpcCk7XG5cbiAgICAgIGZ1bmN0aW9uIFBvcG92ZXIoKSB7XG4gICAgICAgIHJldHVybiBfVG9vbHRpcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBfcHJvdG8gPSBQb3BvdmVyLnByb3RvdHlwZTtcblxuICAgICAgLy8gT3ZlcnJpZGVzXG4gICAgICBfcHJvdG8uaXNXaXRoQ29udGVudCA9IGZ1bmN0aW9uIGlzV2l0aENvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRpdGxlKCkgfHwgdGhpcy5fZ2V0Q29udGVudCgpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmFkZEF0dGFjaG1lbnRDbGFzcyA9IGZ1bmN0aW9uIGFkZEF0dGFjaG1lbnRDbGFzcyhhdHRhY2htZW50KSB7XG4gICAgICAgICQkJDEodGhpcy5nZXRUaXBFbGVtZW50KCkpLmFkZENsYXNzKENMQVNTX1BSRUZJWCArIFwiLVwiICsgYXR0YWNobWVudCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uZ2V0VGlwRWxlbWVudCA9IGZ1bmN0aW9uIGdldFRpcEVsZW1lbnQoKSB7XG4gICAgICAgIHRoaXMudGlwID0gdGhpcy50aXAgfHwgJCQkMSh0aGlzLmNvbmZpZy50ZW1wbGF0ZSlbMF07XG4gICAgICAgIHJldHVybiB0aGlzLnRpcDtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5zZXRDb250ZW50ID0gZnVuY3Rpb24gc2V0Q29udGVudCgpIHtcbiAgICAgICAgdmFyICR0aXAgPSAkJCQxKHRoaXMuZ2V0VGlwRWxlbWVudCgpKTsgLy8gV2UgdXNlIGFwcGVuZCBmb3IgaHRtbCBvYmplY3RzIHRvIG1haW50YWluIGpzIGV2ZW50c1xuXG4gICAgICAgIHRoaXMuc2V0RWxlbWVudENvbnRlbnQoJHRpcC5maW5kKFNlbGVjdG9yLlRJVExFKSwgdGhpcy5nZXRUaXRsZSgpKTtcblxuICAgICAgICB2YXIgY29udGVudCA9IHRoaXMuX2dldENvbnRlbnQoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb250ZW50ID0gY29udGVudC5jYWxsKHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldEVsZW1lbnRDb250ZW50KCR0aXAuZmluZChTZWxlY3Rvci5DT05URU5UKSwgY29udGVudCk7XG4gICAgICAgICR0aXAucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLkZBREUgKyBcIiBcIiArIENsYXNzTmFtZS5TSE9XKTtcbiAgICAgIH07IC8vIFByaXZhdGVcblxuXG4gICAgICBfcHJvdG8uX2dldENvbnRlbnQgPSBmdW5jdGlvbiBfZ2V0Q29udGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29udGVudCcpIHx8IHRoaXMuY29uZmlnLmNvbnRlbnQ7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2NsZWFuVGlwQ2xhc3MgPSBmdW5jdGlvbiBfY2xlYW5UaXBDbGFzcygpIHtcbiAgICAgICAgdmFyICR0aXAgPSAkJCQxKHRoaXMuZ2V0VGlwRWxlbWVudCgpKTtcbiAgICAgICAgdmFyIHRhYkNsYXNzID0gJHRpcC5hdHRyKCdjbGFzcycpLm1hdGNoKEJTQ0xTX1BSRUZJWF9SRUdFWCk7XG5cbiAgICAgICAgaWYgKHRhYkNsYXNzICE9PSBudWxsICYmIHRhYkNsYXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAkdGlwLnJlbW92ZUNsYXNzKHRhYkNsYXNzLmpvaW4oJycpKTtcbiAgICAgICAgfVxuICAgICAgfTsgLy8gU3RhdGljXG5cblxuICAgICAgUG9wb3Zlci5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGw7XG5cbiAgICAgICAgICBpZiAoIWRhdGEgJiYgL2Rlc3Ryb3l8aGlkZS8udGVzdChjb25maWcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0gbmV3IFBvcG92ZXIodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgICAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX2NyZWF0ZUNsYXNzKFBvcG92ZXIsIG51bGwsIFt7XG4gICAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICAgIC8vIEdldHRlcnNcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIFZFUlNJT047XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIk5BTUVcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIE5BTUU7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkRBVEFfS0VZXCIsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBEQVRBX0tFWTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBrZXk6IFwiRXZlbnRcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIEV2ZW50O1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJFVkVOVF9LRVlcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIEVWRU5UX0tFWTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBrZXk6IFwiRGVmYXVsdFR5cGVcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIERlZmF1bHRUeXBlO1xuICAgICAgICB9XG4gICAgICB9XSk7XG5cbiAgICAgIHJldHVybiBQb3BvdmVyO1xuICAgIH0oVG9vbHRpcCk7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogalF1ZXJ5XG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG5cblxuICAgICQkJDEuZm5bTkFNRV0gPSBQb3BvdmVyLl9qUXVlcnlJbnRlcmZhY2U7XG4gICAgJCQkMS5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IFBvcG92ZXI7XG5cbiAgICAkJCQxLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAkJCQxLmZuW05BTUVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgICAgcmV0dXJuIFBvcG92ZXIuX2pRdWVyeUludGVyZmFjZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFBvcG92ZXI7XG4gIH0oJCk7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuMS4yKTogc2Nyb2xsc3B5LmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBTY3JvbGxTcHkgPSBmdW5jdGlvbiAoJCQkMSkge1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIENvbnN0YW50c1xuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuICAgIHZhciBOQU1FID0gJ3Njcm9sbHNweSc7XG4gICAgdmFyIFZFUlNJT04gPSAnNC4xLjInO1xuICAgIHZhciBEQVRBX0tFWSA9ICdicy5zY3JvbGxzcHknO1xuICAgIHZhciBFVkVOVF9LRVkgPSBcIi5cIiArIERBVEFfS0VZO1xuICAgIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUID0gJCQkMS5mbltOQU1FXTtcbiAgICB2YXIgRGVmYXVsdCA9IHtcbiAgICAgIG9mZnNldDogMTAsXG4gICAgICBtZXRob2Q6ICdhdXRvJyxcbiAgICAgIHRhcmdldDogJydcbiAgICB9O1xuICAgIHZhciBEZWZhdWx0VHlwZSA9IHtcbiAgICAgIG9mZnNldDogJ251bWJlcicsXG4gICAgICBtZXRob2Q6ICdzdHJpbmcnLFxuICAgICAgdGFyZ2V0OiAnKHN0cmluZ3xlbGVtZW50KSdcbiAgICB9O1xuICAgIHZhciBFdmVudCA9IHtcbiAgICAgIEFDVElWQVRFOiBcImFjdGl2YXRlXCIgKyBFVkVOVF9LRVksXG4gICAgICBTQ1JPTEw6IFwic2Nyb2xsXCIgKyBFVkVOVF9LRVksXG4gICAgICBMT0FEX0RBVEFfQVBJOiBcImxvYWRcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWVxuICAgIH07XG4gICAgdmFyIENsYXNzTmFtZSA9IHtcbiAgICAgIERST1BET1dOX0lURU06ICdkcm9wZG93bi1pdGVtJyxcbiAgICAgIERST1BET1dOX01FTlU6ICdkcm9wZG93bi1tZW51JyxcbiAgICAgIEFDVElWRTogJ2FjdGl2ZSdcbiAgICB9O1xuICAgIHZhciBTZWxlY3RvciA9IHtcbiAgICAgIERBVEFfU1BZOiAnW2RhdGEtc3B5PVwic2Nyb2xsXCJdJyxcbiAgICAgIEFDVElWRTogJy5hY3RpdmUnLFxuICAgICAgTkFWX0xJU1RfR1JPVVA6ICcubmF2LCAubGlzdC1ncm91cCcsXG4gICAgICBOQVZfTElOS1M6ICcubmF2LWxpbmsnLFxuICAgICAgTkFWX0lURU1TOiAnLm5hdi1pdGVtJyxcbiAgICAgIExJU1RfSVRFTVM6ICcubGlzdC1ncm91cC1pdGVtJyxcbiAgICAgIERST1BET1dOOiAnLmRyb3Bkb3duJyxcbiAgICAgIERST1BET1dOX0lURU1TOiAnLmRyb3Bkb3duLWl0ZW0nLFxuICAgICAgRFJPUERPV05fVE9HR0xFOiAnLmRyb3Bkb3duLXRvZ2dsZSdcbiAgICB9O1xuICAgIHZhciBPZmZzZXRNZXRob2QgPSB7XG4gICAgICBPRkZTRVQ6ICdvZmZzZXQnLFxuICAgICAgUE9TSVRJT046ICdwb3NpdGlvbidcbiAgICAgIC8qKlxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAqL1xuXG4gICAgfTtcblxuICAgIHZhciBTY3JvbGxTcHkgPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBTY3JvbGxTcHkoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX3Njcm9sbEVsZW1lbnQgPSBlbGVtZW50LnRhZ05hbWUgPT09ICdCT0RZJyA/IHdpbmRvdyA6IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgICB0aGlzLl9zZWxlY3RvciA9IHRoaXMuX2NvbmZpZy50YXJnZXQgKyBcIiBcIiArIFNlbGVjdG9yLk5BVl9MSU5LUyArIFwiLFwiICsgKHRoaXMuX2NvbmZpZy50YXJnZXQgKyBcIiBcIiArIFNlbGVjdG9yLkxJU1RfSVRFTVMgKyBcIixcIikgKyAodGhpcy5fY29uZmlnLnRhcmdldCArIFwiIFwiICsgU2VsZWN0b3IuRFJPUERPV05fSVRFTVMpO1xuICAgICAgICB0aGlzLl9vZmZzZXRzID0gW107XG4gICAgICAgIHRoaXMuX3RhcmdldHMgPSBbXTtcbiAgICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2Nyb2xsSGVpZ2h0ID0gMDtcbiAgICAgICAgJCQkMSh0aGlzLl9zY3JvbGxFbGVtZW50KS5vbihFdmVudC5TQ1JPTEwsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5fcHJvY2VzcyhldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcblxuICAgICAgICB0aGlzLl9wcm9jZXNzKCk7XG4gICAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgICB2YXIgX3Byb3RvID0gU2Nyb2xsU3B5LnByb3RvdHlwZTtcblxuICAgICAgLy8gUHVibGljXG4gICAgICBfcHJvdG8ucmVmcmVzaCA9IGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgIHZhciBhdXRvTWV0aG9kID0gdGhpcy5fc2Nyb2xsRWxlbWVudCA9PT0gdGhpcy5fc2Nyb2xsRWxlbWVudC53aW5kb3cgPyBPZmZzZXRNZXRob2QuT0ZGU0VUIDogT2Zmc2V0TWV0aG9kLlBPU0lUSU9OO1xuICAgICAgICB2YXIgb2Zmc2V0TWV0aG9kID0gdGhpcy5fY29uZmlnLm1ldGhvZCA9PT0gJ2F1dG8nID8gYXV0b01ldGhvZCA6IHRoaXMuX2NvbmZpZy5tZXRob2Q7XG4gICAgICAgIHZhciBvZmZzZXRCYXNlID0gb2Zmc2V0TWV0aG9kID09PSBPZmZzZXRNZXRob2QuUE9TSVRJT04gPyB0aGlzLl9nZXRTY3JvbGxUb3AoKSA6IDA7XG4gICAgICAgIHRoaXMuX29mZnNldHMgPSBbXTtcbiAgICAgICAgdGhpcy5fdGFyZ2V0cyA9IFtdO1xuICAgICAgICB0aGlzLl9zY3JvbGxIZWlnaHQgPSB0aGlzLl9nZXRTY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgdmFyIHRhcmdldHMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5fc2VsZWN0b3IpKTtcbiAgICAgICAgdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgdGFyZ2V0O1xuICAgICAgICAgIHZhciB0YXJnZXRTZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGlmICh0YXJnZXRTZWxlY3Rvcikge1xuICAgICAgICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXRTZWxlY3Rvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgdmFyIHRhcmdldEJDUiA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgaWYgKHRhcmdldEJDUi53aWR0aCB8fCB0YXJnZXRCQ1IuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgIC8vIFRPRE8gKGZhdCk6IHJlbW92ZSBza2V0Y2ggcmVsaWFuY2Ugb24galF1ZXJ5IHBvc2l0aW9uL29mZnNldFxuICAgICAgICAgICAgICByZXR1cm4gWyQkJDEodGFyZ2V0KVtvZmZzZXRNZXRob2RdKCkudG9wICsgb2Zmc2V0QmFzZSwgdGFyZ2V0U2VsZWN0b3JdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIHJldHVybiBhWzBdIC0gYlswXTtcbiAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIF90aGlzMi5fb2Zmc2V0cy5wdXNoKGl0ZW1bMF0pO1xuXG4gICAgICAgICAgX3RoaXMyLl90YXJnZXRzLnB1c2goaXRlbVsxXSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICAkJCQxLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgICAkJCQxKHRoaXMuX3Njcm9sbEVsZW1lbnQpLm9mZihFVkVOVF9LRVkpO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2Nyb2xsRWxlbWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NlbGVjdG9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb2Zmc2V0cyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3RhcmdldHMgPSBudWxsO1xuICAgICAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsO1xuICAgICAgICB0aGlzLl9zY3JvbGxIZWlnaHQgPSBudWxsO1xuICAgICAgfTsgLy8gUHJpdmF0ZVxuXG5cbiAgICAgIF9wcm90by5fZ2V0Q29uZmlnID0gZnVuY3Rpb24gX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgICAgY29uZmlnID0gX29iamVjdFNwcmVhZCh7fSwgRGVmYXVsdCwgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLnRhcmdldCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YXIgaWQgPSAkJCQxKGNvbmZpZy50YXJnZXQpLmF0dHIoJ2lkJyk7XG5cbiAgICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICBpZCA9IFV0aWwuZ2V0VUlEKE5BTUUpO1xuICAgICAgICAgICAgJCQkMShjb25maWcudGFyZ2V0KS5hdHRyKCdpZCcsIGlkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25maWcudGFyZ2V0ID0gXCIjXCIgKyBpZDtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUsIGNvbmZpZywgRGVmYXVsdFR5cGUpO1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9nZXRTY3JvbGxUb3AgPSBmdW5jdGlvbiBfZ2V0U2Nyb2xsVG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsRWxlbWVudCA9PT0gd2luZG93ID8gdGhpcy5fc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldCA6IHRoaXMuX3Njcm9sbEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9nZXRTY3JvbGxIZWlnaHQgPSBmdW5jdGlvbiBfZ2V0U2Nyb2xsSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsRWxlbWVudC5zY3JvbGxIZWlnaHQgfHwgTWF0aC5tYXgoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9nZXRPZmZzZXRIZWlnaHQgPSBmdW5jdGlvbiBfZ2V0T2Zmc2V0SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsRWxlbWVudCA9PT0gd2luZG93ID8gd2luZG93LmlubmVySGVpZ2h0IDogdGhpcy5fc2Nyb2xsRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX3Byb2Nlc3MgPSBmdW5jdGlvbiBfcHJvY2VzcygpIHtcbiAgICAgICAgdmFyIHNjcm9sbFRvcCA9IHRoaXMuX2dldFNjcm9sbFRvcCgpICsgdGhpcy5fY29uZmlnLm9mZnNldDtcblxuICAgICAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gdGhpcy5fZ2V0U2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgICAgdmFyIG1heFNjcm9sbCA9IHRoaXMuX2NvbmZpZy5vZmZzZXQgKyBzY3JvbGxIZWlnaHQgLSB0aGlzLl9nZXRPZmZzZXRIZWlnaHQoKTtcblxuICAgICAgICBpZiAodGhpcy5fc2Nyb2xsSGVpZ2h0ICE9PSBzY3JvbGxIZWlnaHQpIHtcbiAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY3JvbGxUb3AgPj0gbWF4U2Nyb2xsKSB7XG4gICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMuX3RhcmdldHNbdGhpcy5fdGFyZ2V0cy5sZW5ndGggLSAxXTtcblxuICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmVUYXJnZXQgIT09IHRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZhdGUodGFyZ2V0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlVGFyZ2V0ICYmIHNjcm9sbFRvcCA8IHRoaXMuX29mZnNldHNbMF0gJiYgdGhpcy5fb2Zmc2V0c1swXSA+IDApIHtcbiAgICAgICAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsO1xuXG4gICAgICAgICAgdGhpcy5fY2xlYXIoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvZmZzZXRMZW5ndGggPSB0aGlzLl9vZmZzZXRzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKHZhciBpID0gb2Zmc2V0TGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgdmFyIGlzQWN0aXZlVGFyZ2V0ID0gdGhpcy5fYWN0aXZlVGFyZ2V0ICE9PSB0aGlzLl90YXJnZXRzW2ldICYmIHNjcm9sbFRvcCA+PSB0aGlzLl9vZmZzZXRzW2ldICYmICh0eXBlb2YgdGhpcy5fb2Zmc2V0c1tpICsgMV0gPT09ICd1bmRlZmluZWQnIHx8IHNjcm9sbFRvcCA8IHRoaXMuX29mZnNldHNbaSArIDFdKTtcblxuICAgICAgICAgIGlmIChpc0FjdGl2ZVRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZhdGUodGhpcy5fdGFyZ2V0c1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uX2FjdGl2YXRlID0gZnVuY3Rpb24gX2FjdGl2YXRlKHRhcmdldCkge1xuICAgICAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSB0YXJnZXQ7XG5cbiAgICAgICAgdGhpcy5fY2xlYXIoKTtcblxuICAgICAgICB2YXIgcXVlcmllcyA9IHRoaXMuX3NlbGVjdG9yLnNwbGl0KCcsJyk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBhcnJvdy1ib2R5LXN0eWxlXG5cblxuICAgICAgICBxdWVyaWVzID0gcXVlcmllcy5tYXAoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGVjdG9yICsgXCJbZGF0YS10YXJnZXQ9XFxcIlwiICsgdGFyZ2V0ICsgXCJcXFwiXSxcIiArIChzZWxlY3RvciArIFwiW2hyZWY9XFxcIlwiICsgdGFyZ2V0ICsgXCJcXFwiXVwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciAkbGluayA9ICQkJDEoW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJpZXMuam9pbignLCcpKSkpO1xuXG4gICAgICAgIGlmICgkbGluay5oYXNDbGFzcyhDbGFzc05hbWUuRFJPUERPV05fSVRFTSkpIHtcbiAgICAgICAgICAkbGluay5jbG9zZXN0KFNlbGVjdG9yLkRST1BET1dOKS5maW5kKFNlbGVjdG9yLkRST1BET1dOX1RPR0dMRSkuYWRkQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSk7XG4gICAgICAgICAgJGxpbmsuYWRkQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2V0IHRyaWdnZXJlZCBsaW5rIGFzIGFjdGl2ZVxuICAgICAgICAgICRsaW5rLmFkZENsYXNzKENsYXNzTmFtZS5BQ1RJVkUpOyAvLyBTZXQgdHJpZ2dlcmVkIGxpbmtzIHBhcmVudHMgYXMgYWN0aXZlXG4gICAgICAgICAgLy8gV2l0aCBib3RoIDx1bD4gYW5kIDxuYXY+IG1hcmt1cCBhIHBhcmVudCBpcyB0aGUgcHJldmlvdXMgc2libGluZyBvZiBhbnkgbmF2IGFuY2VzdG9yXG5cbiAgICAgICAgICAkbGluay5wYXJlbnRzKFNlbGVjdG9yLk5BVl9MSVNUX0dST1VQKS5wcmV2KFNlbGVjdG9yLk5BVl9MSU5LUyArIFwiLCBcIiArIFNlbGVjdG9yLkxJU1RfSVRFTVMpLmFkZENsYXNzKENsYXNzTmFtZS5BQ1RJVkUpOyAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlIHdoZW4gLm5hdi1saW5rIGlzIGluc2lkZSAubmF2LWl0ZW1cblxuICAgICAgICAgICRsaW5rLnBhcmVudHMoU2VsZWN0b3IuTkFWX0xJU1RfR1JPVVApLnByZXYoU2VsZWN0b3IuTkFWX0lURU1TKS5jaGlsZHJlbihTZWxlY3Rvci5OQVZfTElOS1MpLmFkZENsYXNzKENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgICB9XG5cbiAgICAgICAgJCQkMSh0aGlzLl9zY3JvbGxFbGVtZW50KS50cmlnZ2VyKEV2ZW50LkFDVElWQVRFLCB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogdGFyZ2V0XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLl9jbGVhciA9IGZ1bmN0aW9uIF9jbGVhcigpIHtcbiAgICAgICAgdmFyIG5vZGVzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuX3NlbGVjdG9yKSk7XG4gICAgICAgICQkJDEobm9kZXMpLmZpbHRlcihTZWxlY3Rvci5BQ1RJVkUpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgfTsgLy8gU3RhdGljXG5cblxuICAgICAgU2Nyb2xsU3B5Ll9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9ICQkJDEodGhpcykuZGF0YShEQVRBX0tFWSk7XG5cbiAgICAgICAgICB2YXIgX2NvbmZpZyA9IHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZztcblxuICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgZGF0YSA9IG5ldyBTY3JvbGxTcHkodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgICAkJCQxKHRoaXMpLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX2NyZWF0ZUNsYXNzKFNjcm9sbFNweSwgbnVsbCwgW3tcbiAgICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIFZFUlNJT047XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1dKTtcblxuICAgICAgcmV0dXJuIFNjcm9sbFNweTtcbiAgICB9KCk7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuXG4gICAgJCQkMSh3aW5kb3cpLm9uKEV2ZW50LkxPQURfREFUQV9BUEksIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzY3JvbGxTcHlzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNlbGVjdG9yLkRBVEFfU1BZKSk7XG4gICAgICB2YXIgc2Nyb2xsU3B5c0xlbmd0aCA9IHNjcm9sbFNweXMubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBpID0gc2Nyb2xsU3B5c0xlbmd0aDsgaS0tOykge1xuICAgICAgICB2YXIgJHNweSA9ICQkJDEoc2Nyb2xsU3B5c1tpXSk7XG5cbiAgICAgICAgU2Nyb2xsU3B5Ll9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkc3B5LCAkc3B5LmRhdGEoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogalF1ZXJ5XG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICovXG5cbiAgICAkJCQxLmZuW05BTUVdID0gU2Nyb2xsU3B5Ll9qUXVlcnlJbnRlcmZhY2U7XG4gICAgJCQkMS5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IFNjcm9sbFNweTtcblxuICAgICQkJDEuZm5bTkFNRV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICQkJDEuZm5bTkFNRV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgICByZXR1cm4gU2Nyb2xsU3B5Ll9qUXVlcnlJbnRlcmZhY2U7XG4gICAgfTtcblxuICAgIHJldHVybiBTY3JvbGxTcHk7XG4gIH0oJCk7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuMS4yKTogdGFiLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBUYWIgPSBmdW5jdGlvbiAoJCQkMSkge1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIENvbnN0YW50c1xuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuICAgIHZhciBOQU1FID0gJ3RhYic7XG4gICAgdmFyIFZFUlNJT04gPSAnNC4xLjInO1xuICAgIHZhciBEQVRBX0tFWSA9ICdicy50YWInO1xuICAgIHZhciBFVkVOVF9LRVkgPSBcIi5cIiArIERBVEFfS0VZO1xuICAgIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUID0gJCQkMS5mbltOQU1FXTtcbiAgICB2YXIgRXZlbnQgPSB7XG4gICAgICBISURFOiBcImhpZGVcIiArIEVWRU5UX0tFWSxcbiAgICAgIEhJRERFTjogXCJoaWRkZW5cIiArIEVWRU5UX0tFWSxcbiAgICAgIFNIT1c6IFwic2hvd1wiICsgRVZFTlRfS0VZLFxuICAgICAgU0hPV046IFwic2hvd25cIiArIEVWRU5UX0tFWSxcbiAgICAgIENMSUNLX0RBVEFfQVBJOiBcImNsaWNrXCIgKyBFVkVOVF9LRVkgKyBEQVRBX0FQSV9LRVlcbiAgICB9O1xuICAgIHZhciBDbGFzc05hbWUgPSB7XG4gICAgICBEUk9QRE9XTl9NRU5VOiAnZHJvcGRvd24tbWVudScsXG4gICAgICBBQ1RJVkU6ICdhY3RpdmUnLFxuICAgICAgRElTQUJMRUQ6ICdkaXNhYmxlZCcsXG4gICAgICBGQURFOiAnZmFkZScsXG4gICAgICBTSE9XOiAnc2hvdydcbiAgICB9O1xuICAgIHZhciBTZWxlY3RvciA9IHtcbiAgICAgIERST1BET1dOOiAnLmRyb3Bkb3duJyxcbiAgICAgIE5BVl9MSVNUX0dST1VQOiAnLm5hdiwgLmxpc3QtZ3JvdXAnLFxuICAgICAgQUNUSVZFOiAnLmFjdGl2ZScsXG4gICAgICBBQ1RJVkVfVUw6ICc+IGxpID4gLmFjdGl2ZScsXG4gICAgICBEQVRBX1RPR0dMRTogJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXSwgW2RhdGEtdG9nZ2xlPVwicGlsbFwiXSwgW2RhdGEtdG9nZ2xlPVwibGlzdFwiXScsXG4gICAgICBEUk9QRE9XTl9UT0dHTEU6ICcuZHJvcGRvd24tdG9nZ2xlJyxcbiAgICAgIERST1BET1dOX0FDVElWRV9DSElMRDogJz4gLmRyb3Bkb3duLW1lbnUgLmFjdGl2ZSdcbiAgICAgIC8qKlxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAqL1xuXG4gICAgfTtcblxuICAgIHZhciBUYWIgPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBUYWIoZWxlbWVudCkge1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICAgIHZhciBfcHJvdG8gPSBUYWIucHJvdG90eXBlO1xuXG4gICAgICAvLyBQdWJsaWNcbiAgICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICBpZiAodGhpcy5fZWxlbWVudC5wYXJlbnROb2RlICYmIHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgJCQkMSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuQUNUSVZFKSB8fCAkJCQxKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5ESVNBQkxFRCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGFyZ2V0O1xuICAgICAgICB2YXIgcHJldmlvdXM7XG4gICAgICAgIHZhciBsaXN0RWxlbWVudCA9ICQkJDEodGhpcy5fZWxlbWVudCkuY2xvc2VzdChTZWxlY3Rvci5OQVZfTElTVF9HUk9VUClbMF07XG4gICAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcblxuICAgICAgICBpZiAobGlzdEVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgaXRlbVNlbGVjdG9yID0gbGlzdEVsZW1lbnQubm9kZU5hbWUgPT09ICdVTCcgPyBTZWxlY3Rvci5BQ1RJVkVfVUwgOiBTZWxlY3Rvci5BQ1RJVkU7XG4gICAgICAgICAgcHJldmlvdXMgPSAkJCQxLm1ha2VBcnJheSgkJCQxKGxpc3RFbGVtZW50KS5maW5kKGl0ZW1TZWxlY3RvcikpO1xuICAgICAgICAgIHByZXZpb3VzID0gcHJldmlvdXNbcHJldmlvdXMubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGlkZUV2ZW50ID0gJCQkMS5FdmVudChFdmVudC5ISURFLCB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHNob3dFdmVudCA9ICQkJDEuRXZlbnQoRXZlbnQuU0hPVywge1xuICAgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHByZXZpb3VzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwcmV2aW91cykge1xuICAgICAgICAgICQkJDEocHJldmlvdXMpLnRyaWdnZXIoaGlkZUV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgICQkJDEodGhpcy5fZWxlbWVudCkudHJpZ2dlcihzaG93RXZlbnQpO1xuXG4gICAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgfHwgaGlkZUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hY3RpdmF0ZSh0aGlzLl9lbGVtZW50LCBsaXN0RWxlbWVudCk7XG5cbiAgICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgICAgdmFyIGhpZGRlbkV2ZW50ID0gJCQkMS5FdmVudChFdmVudC5ISURERU4sIHtcbiAgICAgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IF90aGlzLl9lbGVtZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIHNob3duRXZlbnQgPSAkJCQxLkV2ZW50KEV2ZW50LlNIT1dOLCB7XG4gICAgICAgICAgICByZWxhdGVkVGFyZ2V0OiBwcmV2aW91c1xuICAgICAgICAgIH0pO1xuICAgICAgICAgICQkJDEocHJldmlvdXMpLnRyaWdnZXIoaGlkZGVuRXZlbnQpO1xuICAgICAgICAgICQkJDEoX3RoaXMuX2VsZW1lbnQpLnRyaWdnZXIoc2hvd25FdmVudCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIHRoaXMuX2FjdGl2YXRlKHRhcmdldCwgdGFyZ2V0LnBhcmVudE5vZGUsIGNvbXBsZXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAgICQkJDEucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSk7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgICAgfTsgLy8gUHJpdmF0ZVxuXG5cbiAgICAgIF9wcm90by5fYWN0aXZhdGUgPSBmdW5jdGlvbiBfYWN0aXZhdGUoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICB2YXIgYWN0aXZlRWxlbWVudHM7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lci5ub2RlTmFtZSA9PT0gJ1VMJykge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzID0gJCQkMShjb250YWluZXIpLmZpbmQoU2VsZWN0b3IuQUNUSVZFX1VMKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY3RpdmVFbGVtZW50cyA9ICQkJDEoY29udGFpbmVyKS5jaGlsZHJlbihTZWxlY3Rvci5BQ1RJVkUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFjdGl2ZSA9IGFjdGl2ZUVsZW1lbnRzWzBdO1xuICAgICAgICB2YXIgaXNUcmFuc2l0aW9uaW5nID0gY2FsbGJhY2sgJiYgYWN0aXZlICYmICQkJDEoYWN0aXZlKS5oYXNDbGFzcyhDbGFzc05hbWUuRkFERSk7XG5cbiAgICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5fdHJhbnNpdGlvbkNvbXBsZXRlKGVsZW1lbnQsIGFjdGl2ZSwgY2FsbGJhY2spO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChhY3RpdmUgJiYgaXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQoYWN0aXZlKTtcbiAgICAgICAgICAkJCQxKGFjdGl2ZSkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5fdHJhbnNpdGlvbkNvbXBsZXRlID0gZnVuY3Rpb24gX3RyYW5zaXRpb25Db21wbGV0ZShlbGVtZW50LCBhY3RpdmUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICAkJCQxKGFjdGl2ZSkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLlNIT1cgKyBcIiBcIiArIENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgICAgIHZhciBkcm9wZG93bkNoaWxkID0gJCQkMShhY3RpdmUucGFyZW50Tm9kZSkuZmluZChTZWxlY3Rvci5EUk9QRE9XTl9BQ1RJVkVfQ0hJTEQpWzBdO1xuXG4gICAgICAgICAgaWYgKGRyb3Bkb3duQ2hpbGQpIHtcbiAgICAgICAgICAgICQkJDEoZHJvcGRvd25DaGlsZCkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFjdGl2ZS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ3RhYicpIHtcbiAgICAgICAgICAgIGFjdGl2ZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgJCQkMShlbGVtZW50KS5hZGRDbGFzcyhDbGFzc05hbWUuQUNUSVZFKTtcblxuICAgICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ3RhYicpIHtcbiAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgVXRpbC5yZWZsb3coZWxlbWVudCk7XG4gICAgICAgICQkJDEoZWxlbWVudCkuYWRkQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpO1xuXG4gICAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUgJiYgJCQkMShlbGVtZW50LnBhcmVudE5vZGUpLmhhc0NsYXNzKENsYXNzTmFtZS5EUk9QRE9XTl9NRU5VKSkge1xuICAgICAgICAgIHZhciBkcm9wZG93bkVsZW1lbnQgPSAkJCQxKGVsZW1lbnQpLmNsb3Nlc3QoU2VsZWN0b3IuRFJPUERPV04pWzBdO1xuXG4gICAgICAgICAgaWYgKGRyb3Bkb3duRWxlbWVudCkge1xuICAgICAgICAgICAgdmFyIGRyb3Bkb3duVG9nZ2xlTGlzdCA9IFtdLnNsaWNlLmNhbGwoZHJvcGRvd25FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU2VsZWN0b3IuRFJPUERPV05fVE9HR0xFKSk7XG4gICAgICAgICAgICAkJCQxKGRyb3Bkb3duVG9nZ2xlTGlzdCkuYWRkQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH07IC8vIFN0YXRpY1xuXG5cbiAgICAgIFRhYi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyICR0aGlzID0gJCQkMSh0aGlzKTtcbiAgICAgICAgICB2YXIgZGF0YSA9ICR0aGlzLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0gbmV3IFRhYih0aGlzKTtcbiAgICAgICAgICAgICR0aGlzLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX2NyZWF0ZUNsYXNzKFRhYiwgbnVsbCwgW3tcbiAgICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIFZFUlNJT047XG4gICAgICAgIH1cbiAgICAgIH1dKTtcblxuICAgICAgcmV0dXJuIFRhYjtcbiAgICB9KCk7XG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuXG4gICAgJCQkMShkb2N1bWVudCkub24oRXZlbnQuQ0xJQ0tfREFUQV9BUEksIFNlbGVjdG9yLkRBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIFRhYi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJCQkMSh0aGlzKSwgJ3Nob3cnKTtcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKiBqUXVlcnlcbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuICAgICQkJDEuZm5bTkFNRV0gPSBUYWIuX2pRdWVyeUludGVyZmFjZTtcbiAgICAkJCQxLmZuW05BTUVdLkNvbnN0cnVjdG9yID0gVGFiO1xuXG4gICAgJCQkMS5mbltOQU1FXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgJCQkMS5mbltOQU1FXSA9IEpRVUVSWV9OT19DT05GTElDVDtcbiAgICAgIHJldHVybiBUYWIuX2pRdWVyeUludGVyZmFjZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRhYjtcbiAgfSgkKTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwICh2NC4xLjIpOiBpbmRleC5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAoZnVuY3Rpb24gKCQkJDEpIHtcbiAgICBpZiAodHlwZW9mICQkJDEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5LiBqUXVlcnkgbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgQm9vdHN0cmFwXFwncyBKYXZhU2NyaXB0LicpO1xuICAgIH1cblxuICAgIHZhciB2ZXJzaW9uID0gJCQkMS5mbi5qcXVlcnkuc3BsaXQoJyAnKVswXS5zcGxpdCgnLicpO1xuICAgIHZhciBtaW5NYWpvciA9IDE7XG4gICAgdmFyIGx0TWFqb3IgPSAyO1xuICAgIHZhciBtaW5NaW5vciA9IDk7XG4gICAgdmFyIG1pblBhdGNoID0gMTtcbiAgICB2YXIgbWF4TWFqb3IgPSA0O1xuXG4gICAgaWYgKHZlcnNpb25bMF0gPCBsdE1ham9yICYmIHZlcnNpb25bMV0gPCBtaW5NaW5vciB8fCB2ZXJzaW9uWzBdID09PSBtaW5NYWpvciAmJiB2ZXJzaW9uWzFdID09PSBtaW5NaW5vciAmJiB2ZXJzaW9uWzJdIDwgbWluUGF0Y2ggfHwgdmVyc2lvblswXSA+PSBtYXhNYWpvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCb290c3RyYXBcXCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgYXQgbGVhc3QgalF1ZXJ5IHYxLjkuMSBidXQgbGVzcyB0aGFuIHY0LjAuMCcpO1xuICAgIH1cbiAgfSkoJCk7XG5cbiAgZXhwb3J0cy5VdGlsID0gVXRpbDtcbiAgZXhwb3J0cy5BbGVydCA9IEFsZXJ0O1xuICBleHBvcnRzLkJ1dHRvbiA9IEJ1dHRvbjtcbiAgZXhwb3J0cy5DYXJvdXNlbCA9IENhcm91c2VsO1xuICBleHBvcnRzLkNvbGxhcHNlID0gQ29sbGFwc2U7XG4gIGV4cG9ydHMuRHJvcGRvd24gPSBEcm9wZG93bjtcbiAgZXhwb3J0cy5Nb2RhbCA9IE1vZGFsO1xuICBleHBvcnRzLlBvcG92ZXIgPSBQb3BvdmVyO1xuICBleHBvcnRzLlNjcm9sbHNweSA9IFNjcm9sbFNweTtcbiAgZXhwb3J0cy5UYWIgPSBUYWI7XG4gIGV4cG9ydHMuVG9vbHRpcCA9IFRvb2x0aXA7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb3RzdHJhcC5qcy5tYXBcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9kaXN0L2pzL2Jvb3RzdHJhcC5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5\n");
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/* WEBPACK VAR INJECTION */(function(process) {\n\nvar utils = __webpack_require__(0);\nvar normalizeHeaderName = __webpack_require__(25);\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = __webpack_require__(9);\n } else if (typeof process !== 'undefined') {\n // For node use HTTP adapter\n adapter = __webpack_require__(9);\n }\n return adapter;\n}\n\nvar defaults = {\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Content-Type');\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data)) {\n setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n return JSON.stringify(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n /*eslint no-param-reassign:0*/\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (e) { /* Ignore */ }\n }\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n }\n};\n\ndefaults.headers = {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzLmpzPzI4MjIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IitDQUFBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLFlBQVk7QUFDbkI7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLENBQUM7O0FBRUQiLCJmaWxlIjoiNi5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIG5vcm1hbGl6ZUhlYWRlck5hbWUgPSByZXF1aXJlKCcuL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZScpO1xuXG52YXIgREVGQVVMVF9DT05URU5UX1RZUEUgPSB7XG4gICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xufTtcblxuZnVuY3Rpb24gc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsIHZhbHVlKSB7XG4gIGlmICghdXRpbHMuaXNVbmRlZmluZWQoaGVhZGVycykgJiYgdXRpbHMuaXNVbmRlZmluZWQoaGVhZGVyc1snQ29udGVudC1UeXBlJ10pKSB7XG4gICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSB2YWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0QWRhcHRlcigpIHtcbiAgdmFyIGFkYXB0ZXI7XG4gIGlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gRm9yIGJyb3dzZXJzIHVzZSBYSFIgYWRhcHRlclxuICAgIGFkYXB0ZXIgPSByZXF1aXJlKCcuL2FkYXB0ZXJzL3hocicpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIEZvciBub2RlIHVzZSBIVFRQIGFkYXB0ZXJcbiAgICBhZGFwdGVyID0gcmVxdWlyZSgnLi9hZGFwdGVycy9odHRwJyk7XG4gIH1cbiAgcmV0dXJuIGFkYXB0ZXI7XG59XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgYWRhcHRlcjogZ2V0RGVmYXVsdEFkYXB0ZXIoKSxcblxuICB0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVxdWVzdChkYXRhLCBoZWFkZXJzKSB7XG4gICAgbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCAnQ29udGVudC1UeXBlJyk7XG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQXJyYXlCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc1N0cmVhbShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNGaWxlKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0Jsb2IoZGF0YSlcbiAgICApIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLmJ1ZmZlcjtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzVVJMU2VhcmNoUGFyYW1zKGRhdGEpKSB7XG4gICAgICBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04Jyk7XG4gICAgICByZXR1cm4gZGF0YS50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04Jyk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICB0cmFuc2Zvcm1SZXNwb25zZTogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlKGRhdGEpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgLyogSWdub3JlICovIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIC8qKlxuICAgKiBBIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFib3J0IGEgcmVxdWVzdC4gSWYgc2V0IHRvIDAgKGRlZmF1bHQpIGFcbiAgICogdGltZW91dCBpcyBub3QgY3JlYXRlZC5cbiAgICovXG4gIHRpbWVvdXQ6IDAsXG5cbiAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJyxcbiAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nLFxuXG4gIG1heENvbnRlbnRMZW5ndGg6IC0xLFxuXG4gIHZhbGlkYXRlU3RhdHVzOiBmdW5jdGlvbiB2YWxpZGF0ZVN0YXR1cyhzdGF0dXMpIHtcbiAgICByZXR1cm4gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDA7XG4gIH1cbn07XG5cbmRlZmF1bHRzLmhlYWRlcnMgPSB7XG4gIGNvbW1vbjoge1xuICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xuICB9XG59O1xuXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2ROb0RhdGEobWV0aG9kKSB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHt9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHV0aWxzLm1lcmdlKERFRkFVTFRfQ09OVEVOVF9UWVBFKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzLmpzXG4vLyBtb2R1bGUgaWQgPSA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6\n");
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports) {
+
+eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzPzViNjkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBOztBQUVBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVSIsImZpbGUiOiI3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7\n");
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcz8yNGZmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixpQkFBaUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncyk7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qc1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8\n");
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar utils = __webpack_require__(0);\nvar settle = __webpack_require__(26);\nvar buildURL = __webpack_require__(28);\nvar parseHeaders = __webpack_require__(29);\nvar isURLSameOrigin = __webpack_require__(30);\nvar createError = __webpack_require__(10);\nvar btoa = (typeof window !== 'undefined' && window.btoa && window.btoa.bind(window)) || __webpack_require__(31);\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n var loadEvent = 'onreadystatechange';\n var xDomain = false;\n\n // For IE 8/9 CORS support\n // Only supports POST and GET calls and doesn't returns the response headers.\n // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest.\n if (\"development\" !== 'test' &&\n typeof window !== 'undefined' &&\n window.XDomainRequest && !('withCredentials' in request) &&\n !isURLSameOrigin(config.url)) {\n request = new window.XDomainRequest();\n loadEvent = 'onload';\n xDomain = true;\n request.onprogress = function handleProgress() {};\n request.ontimeout = function handleTimeout() {};\n }\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password || '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n // Listen for ready state\n request[loadEvent] = function handleLoad() {\n if (!request || (request.readyState !== 4 && !xDomain)) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n var response = {\n data: responseData,\n // IE sends 1223 instead of 204 (https://github.com/axios/axios/issues/201)\n status: request.status === 1223 ? 204 : request.status,\n statusText: request.status === 1223 ? 'No Content' : request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(resolve, reject, response);\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n var cookies = __webpack_require__(32);\n\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (config.withCredentials) {\n request.withCredentials = true;\n }\n\n // Add responseType to request if needed\n if (config.responseType) {\n try {\n request.responseType = config.responseType;\n } catch (e) {\n // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n if (config.responseType !== 'json') {\n throw e;\n }\n }\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken) {\n // Handle cancellation\n config.cancelToken.promise.then(function onCanceled(cancel) {\n if (!request) {\n return;\n }\n\n request.abort();\n reject(cancel);\n // Clean up request\n request = null;\n });\n }\n\n if (requestData === undefined) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcz9lYzZjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiOS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIHNldHRsZSA9IHJlcXVpcmUoJy4vLi4vY29yZS9zZXR0bGUnKTtcbnZhciBidWlsZFVSTCA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9idWlsZFVSTCcpO1xudmFyIHBhcnNlSGVhZGVycyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9wYXJzZUhlYWRlcnMnKTtcbnZhciBpc1VSTFNhbWVPcmlnaW4gPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luJyk7XG52YXIgY3JlYXRlRXJyb3IgPSByZXF1aXJlKCcuLi9jb3JlL2NyZWF0ZUVycm9yJyk7XG52YXIgYnRvYSA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuYnRvYSAmJiB3aW5kb3cuYnRvYS5iaW5kKHdpbmRvdykpIHx8IHJlcXVpcmUoJy4vLi4vaGVscGVycy9idG9hJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24geGhyQWRhcHRlcihjb25maWcpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIGRpc3BhdGNoWGhyUmVxdWVzdChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcmVxdWVzdERhdGEgPSBjb25maWcuZGF0YTtcbiAgICB2YXIgcmVxdWVzdEhlYWRlcnMgPSBjb25maWcuaGVhZGVycztcblxuICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKHJlcXVlc3REYXRhKSkge1xuICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzWydDb250ZW50LVR5cGUnXTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH1cblxuICAgIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgdmFyIGxvYWRFdmVudCA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xuICAgIHZhciB4RG9tYWluID0gZmFsc2U7XG5cbiAgICAvLyBGb3IgSUUgOC85IENPUlMgc3VwcG9ydFxuICAgIC8vIE9ubHkgc3VwcG9ydHMgUE9TVCBhbmQgR0VUIGNhbGxzIGFuZCBkb2Vzbid0IHJldHVybnMgdGhlIHJlc3BvbnNlIGhlYWRlcnMuXG4gICAgLy8gRE9OJ1QgZG8gdGhpcyBmb3IgdGVzdGluZyBiL2MgWE1MSHR0cFJlcXVlc3QgaXMgbW9ja2VkLCBub3QgWERvbWFpblJlcXVlc3QuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiZcbiAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgd2luZG93LlhEb21haW5SZXF1ZXN0ICYmICEoJ3dpdGhDcmVkZW50aWFscycgaW4gcmVxdWVzdCkgJiZcbiAgICAgICAgIWlzVVJMU2FtZU9yaWdpbihjb25maWcudXJsKSkge1xuICAgICAgcmVxdWVzdCA9IG5ldyB3aW5kb3cuWERvbWFpblJlcXVlc3QoKTtcbiAgICAgIGxvYWRFdmVudCA9ICdvbmxvYWQnO1xuICAgICAgeERvbWFpbiA9IHRydWU7XG4gICAgICByZXF1ZXN0Lm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiBoYW5kbGVQcm9ncmVzcygpIHt9O1xuICAgICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge307XG4gICAgfVxuXG4gICAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuICAgIGlmIChjb25maWcuYXV0aCkge1xuICAgICAgdmFyIHVzZXJuYW1lID0gY29uZmlnLmF1dGgudXNlcm5hbWUgfHwgJyc7XG4gICAgICB2YXIgcGFzc3dvcmQgPSBjb25maWcuYXV0aC5wYXNzd29yZCB8fCAnJztcbiAgICAgIHJlcXVlc3RIZWFkZXJzLkF1dGhvcml6YXRpb24gPSAnQmFzaWMgJyArIGJ0b2EodXNlcm5hbWUgKyAnOicgKyBwYXNzd29yZCk7XG4gICAgfVxuXG4gICAgcmVxdWVzdC5vcGVuKGNvbmZpZy5tZXRob2QudG9VcHBlckNhc2UoKSwgYnVpbGRVUkwoY29uZmlnLnVybCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQ7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlXG4gICAgcmVxdWVzdFtsb2FkRXZlbnRdID0gZnVuY3Rpb24gaGFuZGxlTG9hZCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCB8fCAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0ICYmICF4RG9tYWluKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSByZXF1ZXN0IGVycm9yZWQgb3V0IGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UsIHRoaXMgd2lsbCBiZVxuICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcbiAgICAgIC8vIFdpdGggb25lIGV4Y2VwdGlvbjogcmVxdWVzdCB0aGF0IHVzaW5nIGZpbGU6IHByb3RvY29sLCBtb3N0IGJyb3dzZXJzXG4gICAgICAvLyB3aWxsIHJldHVybiBzdGF0dXMgYXMgMCBldmVuIHRob3VnaCBpdCdzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0XG4gICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxuICAgICAgdmFyIHJlc3BvbnNlSGVhZGVycyA9ICdnZXRBbGxSZXNwb25zZUhlYWRlcnMnIGluIHJlcXVlc3QgPyBwYXJzZUhlYWRlcnMocmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkgOiBudWxsO1xuICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9ICFjb25maWcucmVzcG9uc2VUeXBlIHx8IGNvbmZpZy5yZXNwb25zZVR5cGUgPT09ICd0ZXh0JyA/IHJlcXVlc3QucmVzcG9uc2VUZXh0IDogcmVxdWVzdC5yZXNwb25zZTtcbiAgICAgIHZhciByZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICAvLyBJRSBzZW5kcyAxMjIzIGluc3RlYWQgb2YgMjA0IChodHRwczovL2dpdGh1Yi5jb20vYXhpb3MvYXhpb3MvaXNzdWVzLzIwMSlcbiAgICAgICAgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyA9PT0gMTIyMyA/IDIwNCA6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1cyA9PT0gMTIyMyA/ICdObyBDb250ZW50JyA6IHJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdDogcmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgcmVzcG9uc2UpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIGxvdyBsZXZlbCBuZXR3b3JrIGVycm9yc1xuICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKCkge1xuICAgICAgLy8gUmVhbCBlcnJvcnMgYXJlIGhpZGRlbiBmcm9tIHVzIGJ5IHRoZSBicm93c2VyXG4gICAgICAvLyBvbmVycm9yIHNob3VsZCBvbmx5IGZpcmUgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3JcbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcignTmV0d29yayBFcnJvcicsIGNvbmZpZywgbnVsbCwgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHRpbWVvdXRcbiAgICByZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoKSB7XG4gICAgICByZWplY3QoY3JlYXRlRXJyb3IoJ3RpbWVvdXQgb2YgJyArIGNvbmZpZy50aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJywgY29uZmlnLCAnRUNPTk5BQk9SVEVEJyxcbiAgICAgICAgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgLy8gVGhpcyBpcyBvbmx5IGRvbmUgaWYgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gICAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cbiAgICBpZiAodXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSkge1xuICAgICAgdmFyIGNvb2tpZXMgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvY29va2llcycpO1xuXG4gICAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAgIHZhciB4c3JmVmFsdWUgPSAoY29uZmlnLndpdGhDcmVkZW50aWFscyB8fCBpc1VSTFNhbWVPcmlnaW4oY29uZmlnLnVybCkpICYmIGNvbmZpZy54c3JmQ29va2llTmFtZSA/XG4gICAgICAgICAgY29va2llcy5yZWFkKGNvbmZpZy54c3JmQ29va2llTmFtZSkgOlxuICAgICAgICAgIHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHhzcmZWYWx1ZSkge1xuICAgICAgICByZXF1ZXN0SGVhZGVyc1tjb25maWcueHNyZkhlYWRlck5hbWVdID0geHNyZlZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0XG4gICAgaWYgKCdzZXRSZXF1ZXN0SGVhZGVyJyBpbiByZXF1ZXN0KSB7XG4gICAgICB1dGlscy5mb3JFYWNoKHJlcXVlc3RIZWFkZXJzLCBmdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVyKHZhbCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWVzdERhdGEgPT09ICd1bmRlZmluZWQnICYmIGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJykge1xuICAgICAgICAgIC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgICAgICAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNba2V5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBPdGhlcndpc2UgYWRkIGhlYWRlciB0byB0aGUgcmVxdWVzdFxuICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCB3aXRoQ3JlZGVudGlhbHMgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAoY29uZmlnLndpdGhDcmVkZW50aWFscykge1xuICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEFkZCByZXNwb25zZVR5cGUgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVHlwZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBFeHBlY3RlZCBET01FeGNlcHRpb24gdGhyb3duIGJ5IGJyb3dzZXJzIG5vdCBjb21wYXRpYmxlIFhNTEh0dHBSZXF1ZXN0IExldmVsIDIuXG4gICAgICAgIC8vIEJ1dCwgdGhpcyBjYW4gYmUgc3VwcHJlc3NlZCBmb3IgJ2pzb24nIHR5cGUgYXMgaXQgY2FuIGJlIHBhcnNlZCBieSBkZWZhdWx0ICd0cmFuc2Zvcm1SZXNwb25zZScgZnVuY3Rpb24uXG4gICAgICAgIGlmIChjb25maWcucmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHByb2dyZXNzIGlmIG5lZWRlZFxuICAgIGlmICh0eXBlb2YgY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGNvbmZpZy5vbkRvd25sb2FkUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIC8vIE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCB1cGxvYWQgZXZlbnRzXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25VcGxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBjb25maWcub25VcGxvYWRQcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgICAgLy8gSGFuZGxlIGNhbmNlbGxhdGlvblxuICAgICAgY29uZmlnLmNhbmNlbFRva2VuLnByb21pc2UudGhlbihmdW5jdGlvbiBvbkNhbmNlbGVkKGNhbmNlbCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIHJlamVjdChjYW5jZWwpO1xuICAgICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3REYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3REYXRhID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTZW5kIHRoZSByZXF1ZXN0XG4gICAgcmVxdWVzdC5zZW5kKHJlcXVlc3REYXRhKTtcbiAgfSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9\n");
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar enhanceError = __webpack_require__(27);\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvY3JlYXRlRXJyb3IuanM/MTZkMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjEwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW5oYW5jZUVycm9yID0gcmVxdWlyZSgnLi9lbmhhbmNlRXJyb3InKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlRXJyb3IobWVzc2FnZSwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlbmhhbmNlRXJyb3IoZXJyb3IsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2NyZWF0ZUVycm9yLmpzXG4vLyBtb2R1bGUgaWQgPSAxMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///10\n");
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcz9hNDFiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQSIsImZpbGUiOiIxMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qc1xuLy8gbW9kdWxlIGlkID0gMTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///11\n");
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWwuanM/NzU1MyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEiLCJmaWxlIjoiMTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQSBgQ2FuY2VsYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbChtZXNzYWdlKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG59XG5cbkNhbmNlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuICdDYW5jZWwnICsgKHRoaXMubWVzc2FnZSA/ICc6ICcgKyB0aGlzLm1lc3NhZ2UgOiAnJyk7XG59O1xuXG5DYW5jZWwucHJvdG90eXBlLl9fQ0FOQ0VMX18gPSB0cnVlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENhbmNlbDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsLmpzXG4vLyBtb2R1bGUgaWQgPSAxMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///12\n");
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(14);
+__webpack_require__(43);
+module.exports = __webpack_require__(44);
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/**\n * First we will load all of this project's JavaScript dependencies which\n * includes Vue and other libraries. It is a great starting point when\n * building robust, powerful web applications using Vue and Laravel.\n */\n\nwindow.openpgp = __webpack_require__(15);\nwindow.Vue = __webpack_require__(16);\n__webpack_require__(19);\n__webpack_require__(40);\n__webpack_require__(41);\n__webpack_require__(42);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2FwcC5qcz9iMTVmIl0sIm5hbWVzIjpbIndpbmRvdyIsIm9wZW5wZ3AiLCJyZXF1aXJlIiwiVnVlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0FBTUFBLE9BQU9DLE9BQVAsR0FBaUIsbUJBQUFDLENBQVEsRUFBUixDQUFqQjtBQUNBRixPQUFPRyxHQUFQLEdBQWEsbUJBQUFELENBQVEsRUFBUixDQUFiO0FBQ0EsbUJBQUFBLENBQVEsRUFBUjtBQUNBLG1CQUFBQSxDQUFRLEVBQVI7QUFDQSxtQkFBQUEsQ0FBUSxFQUFSO0FBQ0EsbUJBQUFBLENBQVEsRUFBUiIsImZpbGUiOiIxNC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmlyc3Qgd2Ugd2lsbCBsb2FkIGFsbCBvZiB0aGlzIHByb2plY3QncyBKYXZhU2NyaXB0IGRlcGVuZGVuY2llcyB3aGljaFxuICogaW5jbHVkZXMgVnVlIGFuZCBvdGhlciBsaWJyYXJpZXMuIEl0IGlzIGEgZ3JlYXQgc3RhcnRpbmcgcG9pbnQgd2hlblxuICogYnVpbGRpbmcgcm9idXN0LCBwb3dlcmZ1bCB3ZWIgYXBwbGljYXRpb25zIHVzaW5nIFZ1ZSBhbmQgTGFyYXZlbC5cbiAqL1xuXG53aW5kb3cub3BlbnBncCA9IHJlcXVpcmUoJ29wZW5wZ3AnKTtcbndpbmRvdy5WdWUgPSByZXF1aXJlKCd2dWUnKTtcbnJlcXVpcmUoJy4vYm9vdHN0cmFwJyk7XG5yZXF1aXJlKCcuL3NldHVwJyk7XG5yZXF1aXJlKCcuL3Byb2ZpbGUnKTtcbnJlcXVpcmUoJy4vY2hhdCcpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9hc3NldHMvanMvYXBwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///14\n");
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(global) {var require;var require;(function(f){if(true){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.openpgp = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return require(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(_dereq_,module,exports){\n'use strict';\n\nvar _classCallCheck2 = _dereq_('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = _dereq_('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ea_lib = _dereq_('email-addresses');\n\nexports.parse = function parse(line, startAt) {\n if (!line) throw 'Nothing to parse';\n\n line = line.trim();\n\n var addr = ea_lib({\n input: line,\n rfc6532: true, // unicode\n partial: false, // return failed parses\n simple: false, // simple AST\n strict: false, // turn off obs- features in the rfc\n rejectTLD: false, // domains require a \".\"\n startAt: startAt || null\n });\n\n if (!addr) throw 'No results';\n\n // console.log(\"Parsed to: \", require('util').inspect(addr, {depth: 10, colors: true}));\n\n return addr.addresses.map(map_addresses);\n};\n\nfunction map_addresses(adr) {\n if (adr.type === 'group') {\n return new Group(adr.name, adr.addresses.map(map_addresses));\n }\n var comments = void 0;\n if (adr.parts.comments) {\n comments = adr.parts.comments.map(function (c) {\n return c.tokens.trim();\n }).join(' ').trim();\n // if (comments.length) {\n // comments = '(' + comments + ')';\n // }\n }\n var l = adr.local;\n if (!adr.name && /:/.test(l)) l = '\"' + l + '\"';\n return new Address(adr.name, l + '@' + adr.domain, comments);\n}\n\nexports.parseFrom = function (line) {\n return exports.parse(line, 'from');\n};\n\nexports.parseSender = function (line) {\n return exports.parse(line, 'sender');\n};\n\nexports.parseReplyTo = function (line) {\n return exports.parse(line, 'reply-to');\n};\n\nvar Group = function () {\n function Group(display_name, addresses) {\n (0, _classCallCheck3.default)(this, Group);\n\n this.phrase = display_name;\n this.addresses = addresses;\n }\n\n (0, _createClass3.default)(Group, [{\n key: 'format',\n value: function format() {\n return this.phrase + \":\" + this.addresses.map(function (a) {\n return a.format();\n }).join(',');\n }\n }, {\n key: 'name',\n value: function name() {\n var phrase = this.phrase;\n\n if (!(phrase && phrase.length)) {\n phrase = this.comment;\n }\n\n var name = _extract_name(phrase);\n return name;\n }\n }]);\n return Group;\n}();\n\nvar Address = function () {\n function Address(phrase, address, comment) {\n (0, _classCallCheck3.default)(this, Address);\n\n this.phrase = phrase || '';\n this.address = address || '';\n this.comment = comment || '';\n }\n\n (0, _createClass3.default)(Address, [{\n key: 'host',\n value: function host() {\n var match = /.*@(.*)$/.exec(this.address);\n if (!match) return null;\n return match[1];\n }\n }, {\n key: 'user',\n value: function user() {\n var match = /^(.*)@/.exec(this.address);\n if (!match) return null;\n return match[1];\n }\n }, {\n key: 'format',\n value: function format() {\n var phrase = this.phrase;\n var email = this.address;\n var comment = this.comment;\n\n var addr = [];\n var atext = new RegExp('^[\\\\-\\\\w !#$%&\\'*+/=?^`{|}~]+$');\n\n if (phrase && phrase.length) {\n addr.push(atext.test(phrase.trim()) ? phrase : _quote_no_esc(phrase) ? phrase : '\"' + phrase + '\"');\n\n if (email && email.length) {\n addr.push(\"<\" + email + \">\");\n }\n } else if (email && email.length) {\n addr.push(email);\n }\n\n if (comment && /\\S/.test(comment)) {\n comment = comment.replace(/^\\s*\\(?/, '(').replace(/\\)?\\s*$/, ')');\n }\n\n if (comment && comment.length) {\n addr.push(comment);\n }\n\n return addr.join(' ');\n }\n }, {\n key: 'name',\n value: function name() {\n var phrase = this.phrase;\n var addr = this.address;\n\n if (!(phrase && phrase.length)) {\n phrase = this.comment;\n }\n\n var name = _extract_name(phrase);\n\n // first.last@domain address\n if (name === '') {\n var match = /([^%.@_]+([._][^%.@_]+)+)[@%]/.exec(addr);\n if (match) {\n name = match[1].replace(/[._]+/g, ' ');\n name = _extract_name(name);\n }\n }\n\n if (name === '' && /\\/g=/i.test(addr)) {\n // X400 style address\n var _match = /\\/g=([^/]*)/i.exec(addr);\n var f = _match[1];\n _match = /\\/s=([^/]*)/i.exec(addr);\n var l = _match[1];\n name = _extract_name(f + \" \" + l);\n }\n\n return name;\n }\n }]);\n return Address;\n}();\n\nexports.Address = Address;\n\n// This is because JS regexps have no equivalent of\n// zero-width negative look-behind assertion for: /(?<!\\\\)\"/\nfunction _quote_no_esc(str) {\n if (/^\"/.test(str)) return true;\n var match = void 0;\n while (match = /^[\\s\\S]*?([\\s\\S])\"/.exec(str)) {\n if (match[1] !== '\\\\') {\n return true;\n }\n str = str.substr(match[0].length);\n }\n return false;\n}\n\nexports.isAllLower = function (string) {\n return string === string.toLowerCase();\n};\n\nexports.isAllUpper = function (string) {\n return string === string.toUpperCase();\n};\n\nexports.nameCase = function (string) {\n\n return string.toLowerCase().replace(/\\b(\\w+)/g, function (_, d1) {\n // Set the case of the name to first char upper rest lower\n return d1.charAt(0).toUpperCase() + d1.slice(1);\n }).replace(/\\bMc(\\w)/gi, function (_, d1) {\n // Scottish names such as 'McLeod'\n return 'Mc' + d1.toUpperCase();\n }).replace(/\\bo'(\\w)/gi, function (_, d1) {\n // Irish names such as 'O'Malley, O'Reilly'\n return 'O\\'' + d1.toUpperCase();\n }).replace(/\\b(x*(ix)?v*(iv)?i*)\\b/ig, function (_, d1) {\n // Roman numerals, eg 'Level III Support'\n return d1.toUpperCase();\n });\n};\n\n// given a comment, attempt to extract a person's name\nfunction _extract_name(name) {\n // Using encodings, too hard. See Mail::Message::Field::Full.\n if (/=?.*?\\?=/.test(name)) return '';\n\n // trim whitespace\n name = name.trim();\n name = name.replace(/\\s+/, ' ');\n\n // Disregard numeric names (e.g. 123456.1234@compuserve.com)\n if (/^[\\d ]+$/.test(name)) return '';\n\n name = name.replace(/^\\((.*)\\)$/, '$1') // remove outermost parenthesis\n .replace(/^\"(.*)\"$/, '$1') // remove outer quotation marks\n .replace(/\\(.*?\\)/g, '') // remove minimal embedded comments\n .replace(/\\\\/g, '') // remove all escapes\n .replace(/^\"(.*)\"$/, '$1') // remove internal quotation marks\n .replace(/^([^\\s]+) ?, ?(.*)$/, '$2 $1') // reverse \"Last, First M.\" if applicable\n .replace(/,.*/, '');\n\n // Change casing only when the name contains only upper or only\n // lower cased characters.\n if (exports.isAllUpper(name) || exports.isAllLower(name)) {\n // console.log(\"Changing case of: \" + name);\n name = exports.nameCase(name);\n // console.log(\"Now: \" + name);\n }\n\n // some cleanup\n name = name.replace(/\\[[^\\]]*\\]/g, '').replace(/(^[\\s'\"]+|[\\s'\"]+$)/g, '').replace(/\\s{2,}/g, ' ');\n\n return name;\n}\n\n},{\"babel-runtime/helpers/classCallCheck\":36,\"babel-runtime/helpers/createClass\":37,\"email-addresses\":283}],2:[function(_dereq_,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n/**\n * @file {@link http://asmjs.org Asm.js} implementation of the {@link https://en.wikipedia.org/wiki/Advanced_Encryption_Standard Advanced Encryption Standard}.\n * @author Artem S Vybornov <vybornov@gmail.com>\n * @license MIT\n */\nvar AES_asm = exports.AES_asm = function () {\n \"use strict\";\n\n /**\n * Galois Field stuff init flag\n */\n\n var ginit_done = false;\n\n /**\n * Galois Field exponentiation and logarithm tables for 3 (the generator)\n */\n var gexp3, glog3;\n\n /**\n * Init Galois Field tables\n */\n function ginit() {\n gexp3 = [], glog3 = [];\n\n var a = 1,\n c,\n d;\n for (c = 0; c < 255; c++) {\n gexp3[c] = a;\n\n // Multiply by three\n d = a & 0x80, a <<= 1, a &= 255;\n if (d === 0x80) a ^= 0x1b;\n a ^= gexp3[c];\n\n // Set the log table value\n glog3[gexp3[c]] = c;\n }\n gexp3[255] = gexp3[0];\n glog3[0] = 0;\n\n ginit_done = true;\n }\n\n /**\n * Galois Field multiplication\n * @param {number} a\n * @param {number} b\n * @return {number}\n */\n function gmul(a, b) {\n var c = gexp3[(glog3[a] + glog3[b]) % 255];\n if (a === 0 || b === 0) c = 0;\n return c;\n }\n\n /**\n * Galois Field reciprocal\n * @param {number} a\n * @return {number}\n */\n function ginv(a) {\n var i = gexp3[255 - glog3[a]];\n if (a === 0) i = 0;\n return i;\n }\n\n /**\n * AES stuff init flag\n */\n var aes_init_done = false;\n\n /**\n * Encryption, Decryption, S-Box and KeyTransform tables\n *\n * @type {number[]}\n */\n var aes_sbox;\n\n /**\n * @type {number[]}\n */\n var aes_sinv;\n\n /**\n * @type {number[][]}\n */\n var aes_enc;\n\n /**\n * @type {number[][]}\n */\n var aes_dec;\n\n /**\n * Init AES tables\n */\n function aes_init() {\n if (!ginit_done) ginit();\n\n // Calculates AES S-Box value\n function _s(a) {\n var c, s, x;\n s = x = ginv(a);\n for (c = 0; c < 4; c++) {\n s = (s << 1 | s >>> 7) & 255;\n x ^= s;\n }\n x ^= 99;\n return x;\n }\n\n // Tables\n aes_sbox = [], aes_sinv = [], aes_enc = [[], [], [], []], aes_dec = [[], [], [], []];\n\n for (var i = 0; i < 256; i++) {\n var s = _s(i);\n\n // S-Box and its inverse\n aes_sbox[i] = s;\n aes_sinv[s] = i;\n\n // Ecryption and Decryption tables\n aes_enc[0][i] = gmul(2, s) << 24 | s << 16 | s << 8 | gmul(3, s);\n aes_dec[0][s] = gmul(14, i) << 24 | gmul(9, i) << 16 | gmul(13, i) << 8 | gmul(11, i);\n // Rotate tables\n for (var t = 1; t < 4; t++) {\n aes_enc[t][i] = aes_enc[t - 1][i] >>> 8 | aes_enc[t - 1][i] << 24;\n aes_dec[t][s] = aes_dec[t - 1][s] >>> 8 | aes_dec[t - 1][s] << 24;\n }\n }\n }\n\n /**\n * Asm.js module constructor.\n *\n * <p>\n * Heap buffer layout by offset:\n * <pre>\n * 0x0000 encryption key schedule\n * 0x0400 decryption key schedule\n * 0x0800 sbox\n * 0x0c00 inv sbox\n * 0x1000 encryption tables\n * 0x2000 decryption tables\n * 0x3000 reserved (future GCM multiplication lookup table)\n * 0x4000 data\n * </pre>\n * Don't touch anything before <code>0x400</code>.\n * </p>\n *\n * @alias AES_asm\n * @class\n * @param {Object} foreign - <i>ignored</i>\n * @param {ArrayBuffer} buffer - heap buffer to link with\n */\n var wrapper = function wrapper(foreign, buffer) {\n // Init AES stuff for the first time\n if (!aes_init_done) aes_init();\n\n // Fill up AES tables\n var heap = new Uint32Array(buffer);\n heap.set(aes_sbox, 0x0800 >> 2);\n heap.set(aes_sinv, 0x0c00 >> 2);\n for (var i = 0; i < 4; i++) {\n heap.set(aes_enc[i], 0x1000 + 0x400 * i >> 2);\n heap.set(aes_dec[i], 0x2000 + 0x400 * i >> 2);\n }\n\n /**\n * Calculate AES key schedules.\n * @instance\n * @memberof AES_asm\n * @param {number} ks - key size, 4/6/8 (for 128/192/256-bit key correspondingly)\n * @param {number} k0 - key vector components\n * @param {number} k1 - key vector components\n * @param {number} k2 - key vector components\n * @param {number} k3 - key vector components\n * @param {number} k4 - key vector components\n * @param {number} k5 - key vector components\n * @param {number} k6 - key vector components\n * @param {number} k7 - key vector components\n */\n function set_key(ks, k0, k1, k2, k3, k4, k5, k6, k7) {\n var ekeys = heap.subarray(0x000, 60),\n dkeys = heap.subarray(0x100, 0x100 + 60);\n\n // Encryption key schedule\n ekeys.set([k0, k1, k2, k3, k4, k5, k6, k7]);\n for (var i = ks, rcon = 1; i < 4 * ks + 28; i++) {\n var k = ekeys[i - 1];\n if (i % ks === 0 || ks === 8 && i % ks === 4) {\n k = aes_sbox[k >>> 24] << 24 ^ aes_sbox[k >>> 16 & 255] << 16 ^ aes_sbox[k >>> 8 & 255] << 8 ^ aes_sbox[k & 255];\n }\n if (i % ks === 0) {\n k = k << 8 ^ k >>> 24 ^ rcon << 24;\n rcon = rcon << 1 ^ (rcon & 0x80 ? 0x1b : 0);\n }\n ekeys[i] = ekeys[i - ks] ^ k;\n }\n\n // Decryption key schedule\n for (var j = 0; j < i; j += 4) {\n for (var jj = 0; jj < 4; jj++) {\n var k = ekeys[i - (4 + j) + (4 - jj) % 4];\n if (j < 4 || j >= i - 4) {\n dkeys[j + jj] = k;\n } else {\n dkeys[j + jj] = aes_dec[0][aes_sbox[k >>> 24]] ^ aes_dec[1][aes_sbox[k >>> 16 & 255]] ^ aes_dec[2][aes_sbox[k >>> 8 & 255]] ^ aes_dec[3][aes_sbox[k & 255]];\n }\n }\n }\n\n // Set rounds number\n asm.set_rounds(ks + 5);\n }\n\n // create library object with necessary properties\n var stdlib = { Uint8Array: Uint8Array, Uint32Array: Uint32Array };\n\n var asm = function (stdlib, foreign, buffer) {\n \"use asm\";\n\n var S0 = 0,\n S1 = 0,\n S2 = 0,\n S3 = 0,\n I0 = 0,\n I1 = 0,\n I2 = 0,\n I3 = 0,\n N0 = 0,\n N1 = 0,\n N2 = 0,\n N3 = 0,\n M0 = 0,\n M1 = 0,\n M2 = 0,\n M3 = 0,\n H0 = 0,\n H1 = 0,\n H2 = 0,\n H3 = 0,\n R = 0;\n\n var HEAP = new stdlib.Uint32Array(buffer),\n DATA = new stdlib.Uint8Array(buffer);\n\n /**\n * AES core\n * @param {number} k - precomputed key schedule offset\n * @param {number} s - precomputed sbox table offset\n * @param {number} t - precomputed round table offset\n * @param {number} r - number of inner rounds to perform\n * @param {number} x0 - 128-bit input block vector\n * @param {number} x1 - 128-bit input block vector\n * @param {number} x2 - 128-bit input block vector\n * @param {number} x3 - 128-bit input block vector\n */\n function _core(k, s, t, r, x0, x1, x2, x3) {\n k = k | 0;\n s = s | 0;\n t = t | 0;\n r = r | 0;\n x0 = x0 | 0;\n x1 = x1 | 0;\n x2 = x2 | 0;\n x3 = x3 | 0;\n\n var t1 = 0,\n t2 = 0,\n t3 = 0,\n y0 = 0,\n y1 = 0,\n y2 = 0,\n y3 = 0,\n i = 0;\n\n t1 = t | 0x400, t2 = t | 0x800, t3 = t | 0xc00;\n\n // round 0\n x0 = x0 ^ HEAP[(k | 0) >> 2], x1 = x1 ^ HEAP[(k | 4) >> 2], x2 = x2 ^ HEAP[(k | 8) >> 2], x3 = x3 ^ HEAP[(k | 12) >> 2];\n\n // round 1..r\n for (i = 16; (i | 0) <= r << 4; i = i + 16 | 0) {\n y0 = HEAP[(t | x0 >> 22 & 1020) >> 2] ^ HEAP[(t1 | x1 >> 14 & 1020) >> 2] ^ HEAP[(t2 | x2 >> 6 & 1020) >> 2] ^ HEAP[(t3 | x3 << 2 & 1020) >> 2] ^ HEAP[(k | i | 0) >> 2], y1 = HEAP[(t | x1 >> 22 & 1020) >> 2] ^ HEAP[(t1 | x2 >> 14 & 1020) >> 2] ^ HEAP[(t2 | x3 >> 6 & 1020) >> 2] ^ HEAP[(t3 | x0 << 2 & 1020) >> 2] ^ HEAP[(k | i | 4) >> 2], y2 = HEAP[(t | x2 >> 22 & 1020) >> 2] ^ HEAP[(t1 | x3 >> 14 & 1020) >> 2] ^ HEAP[(t2 | x0 >> 6 & 1020) >> 2] ^ HEAP[(t3 | x1 << 2 & 1020) >> 2] ^ HEAP[(k | i | 8) >> 2], y3 = HEAP[(t | x3 >> 22 & 1020) >> 2] ^ HEAP[(t1 | x0 >> 14 & 1020) >> 2] ^ HEAP[(t2 | x1 >> 6 & 1020) >> 2] ^ HEAP[(t3 | x2 << 2 & 1020) >> 2] ^ HEAP[(k | i | 12) >> 2];\n x0 = y0, x1 = y1, x2 = y2, x3 = y3;\n }\n\n // final round\n S0 = HEAP[(s | x0 >> 22 & 1020) >> 2] << 24 ^ HEAP[(s | x1 >> 14 & 1020) >> 2] << 16 ^ HEAP[(s | x2 >> 6 & 1020) >> 2] << 8 ^ HEAP[(s | x3 << 2 & 1020) >> 2] ^ HEAP[(k | i | 0) >> 2], S1 = HEAP[(s | x1 >> 22 & 1020) >> 2] << 24 ^ HEAP[(s | x2 >> 14 & 1020) >> 2] << 16 ^ HEAP[(s | x3 >> 6 & 1020) >> 2] << 8 ^ HEAP[(s | x0 << 2 & 1020) >> 2] ^ HEAP[(k | i | 4) >> 2], S2 = HEAP[(s | x2 >> 22 & 1020) >> 2] << 24 ^ HEAP[(s | x3 >> 14 & 1020) >> 2] << 16 ^ HEAP[(s | x0 >> 6 & 1020) >> 2] << 8 ^ HEAP[(s | x1 << 2 & 1020) >> 2] ^ HEAP[(k | i | 8) >> 2], S3 = HEAP[(s | x3 >> 22 & 1020) >> 2] << 24 ^ HEAP[(s | x0 >> 14 & 1020) >> 2] << 16 ^ HEAP[(s | x1 >> 6 & 1020) >> 2] << 8 ^ HEAP[(s | x2 << 2 & 1020) >> 2] ^ HEAP[(k | i | 12) >> 2];\n }\n\n /**\n * ECB mode encryption\n * @param {number} x0 - 128-bit input block vector\n * @param {number} x1 - 128-bit input block vector\n * @param {number} x2 - 128-bit input block vector\n * @param {number} x3 - 128-bit input block vector\n */\n function _ecb_enc(x0, x1, x2, x3) {\n x0 = x0 | 0;\n x1 = x1 | 0;\n x2 = x2 | 0;\n x3 = x3 | 0;\n\n _core(0x0000, 0x0800, 0x1000, R, x0, x1, x2, x3);\n }\n\n /**\n * ECB mode decryption\n * @param {number} x0 - 128-bit input block vector\n * @param {number} x1 - 128-bit input block vector\n * @param {number} x2 - 128-bit input block vector\n * @param {number} x3 - 128-bit input block vector\n */\n function _ecb_dec(x0, x1, x2, x3) {\n x0 = x0 | 0;\n x1 = x1 | 0;\n x2 = x2 | 0;\n x3 = x3 | 0;\n\n var t = 0;\n\n _core(0x0400, 0x0c00, 0x2000, R, x0, x3, x2, x1);\n\n t = S1, S1 = S3, S3 = t;\n }\n\n /**\n * CBC mode encryption\n * @param {number} x0 - 128-bit input block vector\n * @param {number} x1 - 128-bit input block vector\n * @param {number} x2 - 128-bit input block vector\n * @param {number} x3 - 128-bit input block vector\n */\n function _cbc_enc(x0, x1, x2, x3) {\n x0 = x0 | 0;\n x1 = x1 | 0;\n x2 = x2 | 0;\n x3 = x3 | 0;\n\n _core(0x0000, 0x0800, 0x1000, R, I0 ^ x0, I1 ^ x1, I2 ^ x2, I3 ^ x3);\n\n I0 = S0, I1 = S1, I2 = S2, I3 = S3;\n }\n\n /**\n * CBC mode decryption\n * @param {number} x0 - 128-bit input block vector\n * @param {number} x1 - 128-bit input block vector\n * @param {number} x2 - 128-bit input block vector\n * @param {number} x3 - 128-bit input block vector\n */\n function _cbc_dec(x0, x1, x2, x3) {\n x0 = x0 | 0;\n x1 = x1 | 0;\n x2 = x2 | 0;\n x3 = x3 | 0;\n\n var t = 0;\n\n _core(0x0400, 0x0c00, 0x2000, R, x0, x3, x2, x1);\n\n t = S1, S1 = S3, S3 = t;\n\n S0 = S0 ^ I0, S1 = S1 ^ I1, S2 = S2 ^ I2, S3 = S3 ^ I3;\n\n I0 = x0, I1 = x1, I2 = x2, I3 = x3;\n }\n\n /**\n * CFB mode encryption\n * @param {number} x0 - 128-bit input block vector\n * @param {number} x1 - 128-bit input block vector\n * @param {number} x2 - 128-bit input block vector\n * @param {number} x3 - 128-bit input block vector\n */\n function _cfb_enc(x0, x1, x2, x3) {\n x0 = x0 | 0;\n x1 = x1 | 0;\n x2 = x2 | 0;\n x3 = x3 | 0;\n\n _core(0x0000, 0x0800, 0x1000, R, I0, I1, I2, I3);\n\n I0 = S0 = S0 ^ x0, I1 = S1 = S1 ^ x1, I2 = S2 = S2 ^ x2, I3 = S3 = S3 ^ x3;\n }\n\n /**\n * CFB mode decryption\n * @param {number} x0 - 128-bit input block vector\n * @param {number} x1 - 128-bit input block vector\n * @param {number} x2 - 128-bit input block vector\n * @param {number} x3 - 128-bit input block vector\n */\n function _cfb_dec(x0, x1, x2, x3) {\n x0 = x0 | 0;\n x1 = x1 | 0;\n x2 = x2 | 0;\n x3 = x3 | 0;\n\n _core(0x0000, 0x0800, 0x1000, R, I0, I1, I2, I3);\n\n S0 = S0 ^ x0, S1 = S1 ^ x1, S2 = S2 ^ x2, S3 = S3 ^ x3;\n\n I0 = x0, I1 = x1, I2 = x2, I3 = x3;\n }\n\n /**\n * OFB mode encryption / decryption\n * @param {number} x0 - 128-bit input block vector\n * @param {number} x1 - 128-bit input block vector\n * @param {number} x2 - 128-bit input block vector\n * @param {number} x3 - 128-bit input block vector\n */\n function _ofb(x0, x1, x2, x3) {\n x0 = x0 | 0;\n x1 = x1 | 0;\n x2 = x2 | 0;\n x3 = x3 | 0;\n\n _core(0x0000, 0x0800, 0x1000, R, I0, I1, I2, I3);\n\n I0 = S0, I1 = S1, I2 = S2, I3 = S3;\n\n S0 = S0 ^ x0, S1 = S1 ^ x1, S2 = S2 ^ x2, S3 = S3 ^ x3;\n }\n\n /**\n * CTR mode encryption / decryption\n * @param {number} x0 - 128-bit input block vector\n * @param {number} x1 - 128-bit input block vector\n * @param {number} x2 - 128-bit input block vector\n * @param {number} x3 - 128-bit input block vector\n */\n function _ctr(x0, x1, x2, x3) {\n x0 = x0 | 0;\n x1 = x1 | 0;\n x2 = x2 | 0;\n x3 = x3 | 0;\n\n _core(0x0000, 0x0800, 0x1000, R, N0, N1, N2, N3);\n\n N3 = ~M3 & N3 | M3 & N3 + 1;\n N2 = ~M2 & N2 | M2 & N2 + ((N3 | 0) == 0);\n N1 = ~M1 & N1 | M1 & N1 + ((N2 | 0) == 0);\n N0 = ~M0 & N0 | M0 & N0 + ((N1 | 0) == 0);\n\n S0 = S0 ^ x0;\n S1 = S1 ^ x1;\n S2 = S2 ^ x2;\n S3 = S3 ^ x3;\n }\n\n /**\n * GCM mode MAC calculation\n * @param {number} x0 - 128-bit input block vector\n * @param {number} x1 - 128-bit input block vector\n * @param {number} x2 - 128-bit input block vector\n * @param {number} x3 - 128-bit input block vector\n */\n function _gcm_mac(x0, x1, x2, x3) {\n x0 = x0 | 0;\n x1 = x1 | 0;\n x2 = x2 | 0;\n x3 = x3 | 0;\n\n var y0 = 0,\n y1 = 0,\n y2 = 0,\n y3 = 0,\n z0 = 0,\n z1 = 0,\n z2 = 0,\n z3 = 0,\n i = 0,\n c = 0;\n\n x0 = x0 ^ I0, x1 = x1 ^ I1, x2 = x2 ^ I2, x3 = x3 ^ I3;\n\n y0 = H0 | 0, y1 = H1 | 0, y2 = H2 | 0, y3 = H3 | 0;\n\n for (; (i | 0) < 128; i = i + 1 | 0) {\n if (y0 >>> 31) {\n z0 = z0 ^ x0, z1 = z1 ^ x1, z2 = z2 ^ x2, z3 = z3 ^ x3;\n }\n\n y0 = y0 << 1 | y1 >>> 31, y1 = y1 << 1 | y2 >>> 31, y2 = y2 << 1 | y3 >>> 31, y3 = y3 << 1;\n\n c = x3 & 1;\n\n x3 = x3 >>> 1 | x2 << 31, x2 = x2 >>> 1 | x1 << 31, x1 = x1 >>> 1 | x0 << 31, x0 = x0 >>> 1;\n\n if (c) x0 = x0 ^ 0xe1000000;\n }\n\n I0 = z0, I1 = z1, I2 = z2, I3 = z3;\n }\n\n /**\n * Set the internal rounds number.\n * @instance\n * @memberof AES_asm\n * @param {number} r - number if inner AES rounds\n */\n function set_rounds(r) {\n r = r | 0;\n R = r;\n }\n\n /**\n * Populate the internal state of the module.\n * @instance\n * @memberof AES_asm\n * @param {number} s0 - state vector\n * @param {number} s1 - state vector\n * @param {number} s2 - state vector\n * @param {number} s3 - state vector\n */\n function set_state(s0, s1, s2, s3) {\n s0 = s0 | 0;\n s1 = s1 | 0;\n s2 = s2 | 0;\n s3 = s3 | 0;\n\n S0 = s0, S1 = s1, S2 = s2, S3 = s3;\n }\n\n /**\n * Populate the internal iv of the module.\n * @instance\n * @memberof AES_asm\n * @param {number} i0 - iv vector\n * @param {number} i1 - iv vector\n * @param {number} i2 - iv vector\n * @param {number} i3 - iv vector\n */\n function set_iv(i0, i1, i2, i3) {\n i0 = i0 | 0;\n i1 = i1 | 0;\n i2 = i2 | 0;\n i3 = i3 | 0;\n\n I0 = i0, I1 = i1, I2 = i2, I3 = i3;\n }\n\n /**\n * Set nonce for CTR-family modes.\n * @instance\n * @memberof AES_asm\n * @param {number} n0 - nonce vector\n * @param {number} n1 - nonce vector\n * @param {number} n2 - nonce vector\n * @param {number} n3 - nonce vector\n */\n function set_nonce(n0, n1, n2, n3) {\n n0 = n0 | 0;\n n1 = n1 | 0;\n n2 = n2 | 0;\n n3 = n3 | 0;\n\n N0 = n0, N1 = n1, N2 = n2, N3 = n3;\n }\n\n /**\n * Set counter mask for CTR-family modes.\n * @instance\n * @memberof AES_asm\n * @param {number} m0 - counter mask vector\n * @param {number} m1 - counter mask vector\n * @param {number} m2 - counter mask vector\n * @param {number} m3 - counter mask vector\n */\n function set_mask(m0, m1, m2, m3) {\n m0 = m0 | 0;\n m1 = m1 | 0;\n m2 = m2 | 0;\n m3 = m3 | 0;\n\n M0 = m0, M1 = m1, M2 = m2, M3 = m3;\n }\n\n /**\n * Set counter for CTR-family modes.\n * @instance\n * @memberof AES_asm\n * @param {number} c0 - counter vector\n * @param {number} c1 - counter vector\n * @param {number} c2 - counter vector\n * @param {number} c3 - counter vector\n */\n function set_counter(c0, c1, c2, c3) {\n c0 = c0 | 0;\n c1 = c1 | 0;\n c2 = c2 | 0;\n c3 = c3 | 0;\n\n N3 = ~M3 & N3 | M3 & c3, N2 = ~M2 & N2 | M2 & c2, N1 = ~M1 & N1 | M1 & c1, N0 = ~M0 & N0 | M0 & c0;\n }\n\n /**\n * Store the internal state vector into the heap.\n * @instance\n * @memberof AES_asm\n * @param {number} pos - offset where to put the data\n * @return {number} The number of bytes have been written into the heap, always 16.\n */\n function get_state(pos) {\n pos = pos | 0;\n\n if (pos & 15) return -1;\n\n DATA[pos | 0] = S0 >>> 24, DATA[pos | 1] = S0 >>> 16 & 255, DATA[pos | 2] = S0 >>> 8 & 255, DATA[pos | 3] = S0 & 255, DATA[pos | 4] = S1 >>> 24, DATA[pos | 5] = S1 >>> 16 & 255, DATA[pos | 6] = S1 >>> 8 & 255, DATA[pos | 7] = S1 & 255, DATA[pos | 8] = S2 >>> 24, DATA[pos | 9] = S2 >>> 16 & 255, DATA[pos | 10] = S2 >>> 8 & 255, DATA[pos | 11] = S2 & 255, DATA[pos | 12] = S3 >>> 24, DATA[pos | 13] = S3 >>> 16 & 255, DATA[pos | 14] = S3 >>> 8 & 255, DATA[pos | 15] = S3 & 255;\n\n return 16;\n }\n\n /**\n * Store the internal iv vector into the heap.\n * @instance\n * @memberof AES_asm\n * @param {number} pos - offset where to put the data\n * @return {number} The number of bytes have been written into the heap, always 16.\n */\n function get_iv(pos) {\n pos = pos | 0;\n\n if (pos & 15) return -1;\n\n DATA[pos | 0] = I0 >>> 24, DATA[pos | 1] = I0 >>> 16 & 255, DATA[pos | 2] = I0 >>> 8 & 255, DATA[pos | 3] = I0 & 255, DATA[pos | 4] = I1 >>> 24, DATA[pos | 5] = I1 >>> 16 & 255, DATA[pos | 6] = I1 >>> 8 & 255, DATA[pos | 7] = I1 & 255, DATA[pos | 8] = I2 >>> 24, DATA[pos | 9] = I2 >>> 16 & 255, DATA[pos | 10] = I2 >>> 8 & 255, DATA[pos | 11] = I2 & 255, DATA[pos | 12] = I3 >>> 24, DATA[pos | 13] = I3 >>> 16 & 255, DATA[pos | 14] = I3 >>> 8 & 255, DATA[pos | 15] = I3 & 255;\n\n return 16;\n }\n\n /**\n * GCM initialization.\n * @instance\n * @memberof AES_asm\n */\n function gcm_init() {\n _ecb_enc(0, 0, 0, 0);\n H0 = S0, H1 = S1, H2 = S2, H3 = S3;\n }\n\n /**\n * Perform ciphering operation on the supplied data.\n * @instance\n * @memberof AES_asm\n * @param {number} mode - block cipher mode (see {@link AES_asm} mode constants)\n * @param {number} pos - offset of the data being processed\n * @param {number} len - length of the data being processed\n * @return {number} Actual amount of data have been processed.\n */\n function cipher(mode, pos, len) {\n mode = mode | 0;\n pos = pos | 0;\n len = len | 0;\n\n var ret = 0;\n\n if (pos & 15) return -1;\n\n while ((len | 0) >= 16) {\n _cipher_modes[mode & 7](DATA[pos | 0] << 24 | DATA[pos | 1] << 16 | DATA[pos | 2] << 8 | DATA[pos | 3], DATA[pos | 4] << 24 | DATA[pos | 5] << 16 | DATA[pos | 6] << 8 | DATA[pos | 7], DATA[pos | 8] << 24 | DATA[pos | 9] << 16 | DATA[pos | 10] << 8 | DATA[pos | 11], DATA[pos | 12] << 24 | DATA[pos | 13] << 16 | DATA[pos | 14] << 8 | DATA[pos | 15]);\n\n DATA[pos | 0] = S0 >>> 24, DATA[pos | 1] = S0 >>> 16 & 255, DATA[pos | 2] = S0 >>> 8 & 255, DATA[pos | 3] = S0 & 255, DATA[pos | 4] = S1 >>> 24, DATA[pos | 5] = S1 >>> 16 & 255, DATA[pos | 6] = S1 >>> 8 & 255, DATA[pos | 7] = S1 & 255, DATA[pos | 8] = S2 >>> 24, DATA[pos | 9] = S2 >>> 16 & 255, DATA[pos | 10] = S2 >>> 8 & 255, DATA[pos | 11] = S2 & 255, DATA[pos | 12] = S3 >>> 24, DATA[pos | 13] = S3 >>> 16 & 255, DATA[pos | 14] = S3 >>> 8 & 255, DATA[pos | 15] = S3 & 255;\n\n ret = ret + 16 | 0, pos = pos + 16 | 0, len = len - 16 | 0;\n }\n\n return ret | 0;\n }\n\n /**\n * Calculates MAC of the supplied data.\n * @instance\n * @memberof AES_asm\n * @param {number} mode - block cipher mode (see {@link AES_asm} mode constants)\n * @param {number} pos - offset of the data being processed\n * @param {number} len - length of the data being processed\n * @return {number} Actual amount of data have been processed.\n */\n function mac(mode, pos, len) {\n mode = mode | 0;\n pos = pos | 0;\n len = len | 0;\n\n var ret = 0;\n\n if (pos & 15) return -1;\n\n while ((len | 0) >= 16) {\n _mac_modes[mode & 1](DATA[pos | 0] << 24 | DATA[pos | 1] << 16 | DATA[pos | 2] << 8 | DATA[pos | 3], DATA[pos | 4] << 24 | DATA[pos | 5] << 16 | DATA[pos | 6] << 8 | DATA[pos | 7], DATA[pos | 8] << 24 | DATA[pos | 9] << 16 | DATA[pos | 10] << 8 | DATA[pos | 11], DATA[pos | 12] << 24 | DATA[pos | 13] << 16 | DATA[pos | 14] << 8 | DATA[pos | 15]);\n\n ret = ret + 16 | 0, pos = pos + 16 | 0, len = len - 16 | 0;\n }\n\n return ret | 0;\n }\n\n /**\n * AES cipher modes table (virual methods)\n */\n var _cipher_modes = [_ecb_enc, _ecb_dec, _cbc_enc, _cbc_dec, _cfb_enc, _cfb_dec, _ofb, _ctr];\n\n /**\n * AES MAC modes table (virual methods)\n */\n var _mac_modes = [_cbc_enc, _gcm_mac];\n\n /**\n * Asm.js module exports\n */\n return {\n set_rounds: set_rounds,\n set_state: set_state,\n set_iv: set_iv,\n set_nonce: set_nonce,\n set_mask: set_mask,\n set_counter: set_counter,\n get_state: get_state,\n get_iv: get_iv,\n gcm_init: gcm_init,\n cipher: cipher,\n mac: mac\n };\n }(stdlib, foreign, buffer);\n\n asm.set_key = set_key;\n\n return asm;\n };\n\n /**\n * AES enciphering mode constants\n * @enum {number}\n * @const\n */\n wrapper.ENC = {\n ECB: 0,\n CBC: 2,\n CFB: 4,\n OFB: 6,\n CTR: 7\n },\n\n /**\n * AES deciphering mode constants\n * @enum {number}\n * @const\n */\n wrapper.DEC = {\n ECB: 1,\n CBC: 3,\n CFB: 5,\n OFB: 6,\n CTR: 7\n },\n\n /**\n * AES MAC mode constants\n * @enum {number}\n * @const\n */\n wrapper.MAC = {\n CBC: 0,\n GCM: 1\n };\n\n /**\n * Heap data offset\n * @type {number}\n * @const\n */\n wrapper.HEAP_DATA = 0x4000;\n\n return wrapper;\n}();\n\n},{}],3:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.AES = undefined;\n\nvar _classCallCheck2 = _dereq_('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = _dereq_('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _aes = _dereq_('./aes.asm');\n\nvar _utils = _dereq_('../utils');\n\nvar _errors = _dereq_('../errors');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AES = exports.AES = function () {\n function AES(key, iv, padding, heap, asm) {\n (0, _classCallCheck3.default)(this, AES);\n\n this.nonce = null;\n this.counter = 0;\n this.counterSize = 0;\n\n this.heap = (0, _utils._heap_init)(Uint8Array, heap).subarray(_aes.AES_asm.HEAP_DATA);\n this.asm = asm || (0, _aes.AES_asm)(null, this.heap.buffer);\n this.mode = null;\n this.key = null;\n\n this.AES_reset(key, iv, padding);\n }\n\n /**\n * @param {Uint8Array} key\n */\n\n\n (0, _createClass3.default)(AES, [{\n key: 'AES_set_key',\n value: function AES_set_key(key) {\n if (key !== undefined) {\n if (!(0, _utils.is_bytes)(key)) {\n throw new TypeError('unexpected key type');\n }\n\n var keylen = key.length;\n if (keylen !== 16 && keylen !== 24 && keylen !== 32) throw new _errors.IllegalArgumentError('illegal key size');\n\n var keyview = new DataView(key.buffer, key.byteOffset, key.byteLength);\n this.asm.set_key(keylen >> 2, keyview.getUint32(0), keyview.getUint32(4), keyview.getUint32(8), keyview.getUint32(12), keylen > 16 ? keyview.getUint32(16) : 0, keylen > 16 ? keyview.getUint32(20) : 0, keylen > 24 ? keyview.getUint32(24) : 0, keylen > 24 ? keyview.getUint32(28) : 0);\n\n this.key = key;\n } else if (!this.key) {\n throw new Error('key is required');\n }\n }\n\n /**\n * This should be mixin instead of inheritance\n *\n * @param {Uint8Array} nonce\n * @param {number} [counter]\n * @param {number} [size]\n */\n\n }, {\n key: 'AES_CTR_set_options',\n value: function AES_CTR_set_options(nonce, counter, size) {\n if (size !== undefined) {\n if (size < 8 || size > 48) throw new _errors.IllegalArgumentError('illegal counter size');\n\n this.counterSize = size;\n\n var mask = Math.pow(2, size) - 1;\n this.asm.set_mask(0, 0, mask / 0x100000000 | 0, mask | 0);\n } else {\n this.counterSize = size = 48;\n this.asm.set_mask(0, 0, 0xffff, 0xffffffff);\n }\n\n if (nonce !== undefined) {\n if (!(0, _utils.is_bytes)(nonce)) {\n throw new TypeError('unexpected nonce type');\n }\n\n var len = nonce.length;\n if (!len || len > 16) throw new _errors.IllegalArgumentError('illegal nonce size');\n\n this.nonce = nonce;\n\n var view = new DataView(new ArrayBuffer(16));\n new Uint8Array(view.buffer).set(nonce);\n\n this.asm.set_nonce(view.getUint32(0), view.getUint32(4), view.getUint32(8), view.getUint32(12));\n } else {\n throw new Error('nonce is required');\n }\n\n if (counter !== undefined) {\n if (!(0, _utils.is_number)(counter)) throw new TypeError('unexpected counter type');\n\n if (counter < 0 || counter >= Math.pow(2, size)) throw new _errors.IllegalArgumentError('illegal counter value');\n\n this.counter = counter;\n\n this.asm.set_counter(0, 0, counter / 0x100000000 | 0, counter | 0);\n } else {\n this.counter = 0;\n }\n }\n\n /**\n * @param {Uint8Array} iv\n */\n\n }, {\n key: 'AES_set_iv',\n value: function AES_set_iv(iv) {\n if (iv !== undefined) {\n if (!(0, _utils.is_bytes)(iv)) {\n throw new TypeError('unexpected iv type');\n }\n\n if (iv.length !== 16) throw new _errors.IllegalArgumentError('illegal iv size');\n\n var ivview = new DataView(iv.buffer, iv.byteOffset, iv.byteLength);\n\n this.iv = iv;\n this.asm.set_iv(ivview.getUint32(0), ivview.getUint32(4), ivview.getUint32(8), ivview.getUint32(12));\n } else {\n this.iv = null;\n this.asm.set_iv(0, 0, 0, 0);\n }\n }\n\n /**\n * @param {boolean} padding\n */\n\n }, {\n key: 'AES_set_padding',\n value: function AES_set_padding(padding) {\n if (padding !== undefined) {\n this.padding = !!padding;\n } else {\n this.padding = true;\n }\n }\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} [iv]\n * @param {boolean} [padding]\n */\n\n }, {\n key: 'AES_reset',\n value: function AES_reset(key, iv, padding) {\n this.result = null;\n this.pos = 0;\n this.len = 0;\n\n this.AES_set_key(key);\n this.AES_set_iv(iv);\n this.AES_set_padding(padding);\n\n return this;\n }\n\n /**\n * @param {Uint8Array} data\n */\n\n }, {\n key: 'AES_Encrypt_process',\n value: function AES_Encrypt_process(data) {\n if (!(0, _utils.is_bytes)(data)) throw new TypeError(\"data isn't of expected type\");\n\n var asm = this.asm,\n heap = this.heap,\n amode = _aes.AES_asm.ENC[this.mode],\n hpos = _aes.AES_asm.HEAP_DATA,\n pos = this.pos,\n len = this.len,\n dpos = 0,\n dlen = data.length || 0,\n rpos = 0,\n rlen = len + dlen & -16,\n wlen = 0;\n\n var result = new Uint8Array(rlen);\n\n while (dlen > 0) {\n wlen = (0, _utils._heap_write)(heap, pos + len, data, dpos, dlen);\n len += wlen;\n dpos += wlen;\n dlen -= wlen;\n\n wlen = asm.cipher(amode, hpos + pos, len);\n\n if (wlen) result.set(heap.subarray(pos, pos + wlen), rpos);\n rpos += wlen;\n\n if (wlen < len) {\n pos += wlen;\n len -= wlen;\n } else {\n pos = 0;\n len = 0;\n }\n }\n\n this.result = result;\n this.pos = pos;\n this.len = len;\n\n return this;\n }\n\n /**\n * @param {Uint8Array} data\n */\n\n }, {\n key: 'AES_Encrypt_finish',\n value: function AES_Encrypt_finish(data) {\n var presult = null,\n prlen = 0;\n\n if (data !== undefined) {\n presult = this.AES_Encrypt_process(data).result;\n prlen = presult.length;\n }\n\n var asm = this.asm,\n heap = this.heap,\n amode = _aes.AES_asm.ENC[this.mode],\n hpos = _aes.AES_asm.HEAP_DATA,\n pos = this.pos,\n len = this.len,\n plen = 16 - len % 16,\n rlen = len;\n\n if (this.hasOwnProperty('padding')) {\n if (this.padding) {\n for (var p = 0; p < plen; ++p) {\n heap[pos + len + p] = plen;\n }len += plen;\n rlen = len;\n } else if (len % 16) {\n throw new _errors.IllegalArgumentError('data length must be a multiple of the block size');\n }\n } else {\n len += plen;\n }\n\n var result = new Uint8Array(prlen + rlen);\n\n if (prlen) result.set(presult);\n\n if (len) asm.cipher(amode, hpos + pos, len);\n\n if (rlen) result.set(heap.subarray(pos, pos + rlen), prlen);\n\n this.result = result;\n this.pos = 0;\n this.len = 0;\n\n return this;\n }\n\n /**\n * @param {Uint8Array} data\n */\n\n }, {\n key: 'AES_Decrypt_process',\n value: function AES_Decrypt_process(data) {\n if (!(0, _utils.is_bytes)(data)) throw new TypeError(\"data isn't of expected type\");\n\n var asm = this.asm,\n heap = this.heap,\n amode = _aes.AES_asm.DEC[this.mode],\n hpos = _aes.AES_asm.HEAP_DATA,\n pos = this.pos,\n len = this.len,\n dpos = 0,\n dlen = data.length || 0,\n rpos = 0,\n rlen = len + dlen & -16,\n plen = 0,\n wlen = 0;\n\n if (this.padding) {\n plen = len + dlen - rlen || 16;\n rlen -= plen;\n }\n\n var result = new Uint8Array(rlen);\n\n while (dlen > 0) {\n wlen = (0, _utils._heap_write)(heap, pos + len, data, dpos, dlen);\n len += wlen;\n dpos += wlen;\n dlen -= wlen;\n\n wlen = asm.cipher(amode, hpos + pos, len - (!dlen ? plen : 0));\n\n if (wlen) result.set(heap.subarray(pos, pos + wlen), rpos);\n rpos += wlen;\n\n if (wlen < len) {\n pos += wlen;\n len -= wlen;\n } else {\n pos = 0;\n len = 0;\n }\n }\n\n this.result = result;\n this.pos = pos;\n this.len = len;\n\n return this;\n }\n\n /**\n * @param {Uint8Array} data\n */\n\n }, {\n key: 'AES_Decrypt_finish',\n value: function AES_Decrypt_finish(data) {\n var presult = null,\n prlen = 0;\n\n if (data !== undefined) {\n presult = this.AES_Decrypt_process(data).result;\n prlen = presult.length;\n }\n\n var asm = this.asm,\n heap = this.heap,\n amode = _aes.AES_asm.DEC[this.mode],\n hpos = _aes.AES_asm.HEAP_DATA,\n pos = this.pos,\n len = this.len,\n rlen = len;\n\n if (len > 0) {\n if (len % 16) {\n if (this.hasOwnProperty('padding')) {\n throw new _errors.IllegalArgumentError('data length must be a multiple of the block size');\n } else {\n len += 16 - len % 16;\n }\n }\n\n asm.cipher(amode, hpos + pos, len);\n\n if (this.hasOwnProperty('padding') && this.padding) {\n var pad = heap[pos + rlen - 1];\n if (pad < 1 || pad > 16 || pad > rlen) throw new _errors.SecurityError('bad padding');\n\n var pcheck = 0;\n for (var i = pad; i > 1; i--) {\n pcheck |= pad ^ heap[pos + rlen - i];\n }if (pcheck) throw new _errors.SecurityError('bad padding');\n\n rlen -= pad;\n }\n }\n\n var result = new Uint8Array(prlen + rlen);\n\n if (prlen > 0) {\n result.set(presult);\n }\n\n if (rlen > 0) {\n result.set(heap.subarray(pos, pos + rlen), prlen);\n }\n\n this.result = result;\n this.pos = 0;\n this.len = 0;\n\n return this;\n }\n }]);\n return AES;\n}();\n\n},{\"../errors\":14,\"../utils\":19,\"./aes.asm\":2,\"babel-runtime/helpers/classCallCheck\":36,\"babel-runtime/helpers/createClass\":37}],4:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.AES_CBC_Decrypt = exports.AES_CBC_Encrypt = exports.AES_CBC = undefined;\n\nvar _getPrototypeOf = _dereq_('babel-runtime/core-js/object/get-prototype-of');\n\nvar _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);\n\nvar _classCallCheck2 = _dereq_('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = _dereq_('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _possibleConstructorReturn2 = _dereq_('babel-runtime/helpers/possibleConstructorReturn');\n\nvar _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);\n\nvar _inherits2 = _dereq_('babel-runtime/helpers/inherits');\n\nvar _inherits3 = _interopRequireDefault(_inherits2);\n\nvar _aes = _dereq_('../aes');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AES_CBC = exports.AES_CBC = function (_AES) {\n (0, _inherits3.default)(AES_CBC, _AES);\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} [iv=null]\n * @param {boolean} [padding=true]\n * @param {Uint8Array} [heap]\n * @param {Uint8Array} [asm]\n */\n function AES_CBC(key) {\n var iv = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var padding = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n var heap = arguments[3];\n var asm = arguments[4];\n (0, _classCallCheck3.default)(this, AES_CBC);\n\n var _this = (0, _possibleConstructorReturn3.default)(this, (AES_CBC.__proto__ || (0, _getPrototypeOf2.default)(AES_CBC)).call(this, key, iv, padding, heap, asm));\n\n _this.mode = 'CBC';\n _this.BLOCK_SIZE = 16;\n return _this;\n }\n\n (0, _createClass3.default)(AES_CBC, [{\n key: 'encrypt',\n value: function encrypt(data) {\n return this.AES_Encrypt_finish(data);\n }\n }, {\n key: 'decrypt',\n value: function decrypt(data) {\n return this.AES_Decrypt_finish(data);\n }\n }]);\n return AES_CBC;\n}(_aes.AES); /**\n * Cipher Block Chaining Mode (CBC)\n */\n\n\nvar AES_CBC_Encrypt = exports.AES_CBC_Encrypt = function (_AES_CBC) {\n (0, _inherits3.default)(AES_CBC_Encrypt, _AES_CBC);\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} [iv=null]\n * @param {boolean} [padding=true]\n * @param {Uint8Array} [heap]\n * @param {Uint8Array} [asm]\n */\n function AES_CBC_Encrypt(key, iv, padding, heap, asm) {\n (0, _classCallCheck3.default)(this, AES_CBC_Encrypt);\n return (0, _possibleConstructorReturn3.default)(this, (AES_CBC_Encrypt.__proto__ || (0, _getPrototypeOf2.default)(AES_CBC_Encrypt)).call(this, key, iv, padding, heap, asm));\n }\n\n /**\n * @param {Uint8Array} key\n * @returns {AES_CBC_Encrypt}\n */\n\n\n (0, _createClass3.default)(AES_CBC_Encrypt, [{\n key: 'reset',\n value: function reset(key) {\n return this.AES_reset(key, null, true);\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_CBC_Encrypt}\n */\n\n }, {\n key: 'process',\n value: function process(data) {\n return this.AES_Encrypt_process(data);\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_CBC_Encrypt}\n */\n\n }, {\n key: 'finish',\n value: function finish(data) {\n return this.AES_Encrypt_finish(data);\n }\n }]);\n return AES_CBC_Encrypt;\n}(AES_CBC);\n\nvar AES_CBC_Decrypt = exports.AES_CBC_Decrypt = function (_AES_CBC2) {\n (0, _inherits3.default)(AES_CBC_Decrypt, _AES_CBC2);\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} [iv=null]\n * @param {boolean} [padding=true]\n * @param {Uint8Array} [heap]\n * @param {Uint8Array} [asm]\n */\n function AES_CBC_Decrypt(key, iv, padding, heap, asm) {\n (0, _classCallCheck3.default)(this, AES_CBC_Decrypt);\n return (0, _possibleConstructorReturn3.default)(this, (AES_CBC_Decrypt.__proto__ || (0, _getPrototypeOf2.default)(AES_CBC_Decrypt)).call(this, key, iv, padding, heap, asm));\n }\n\n /**\n * @param {Uint8Array} key\n * @returns {AES_CBC_Decrypt}\n */\n\n\n (0, _createClass3.default)(AES_CBC_Decrypt, [{\n key: 'reset',\n value: function reset(key) {\n return this.AES_reset(key, null, true);\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_CBC_Decrypt}\n */\n\n }, {\n key: 'process',\n value: function process(data) {\n return this.AES_Decrypt_process(data);\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_CBC_Decrypt}\n */\n\n }, {\n key: 'finish',\n value: function finish(data) {\n return this.AES_Decrypt_finish(data);\n }\n }]);\n return AES_CBC_Decrypt;\n}(AES_CBC);\n\n},{\"../aes\":3,\"babel-runtime/core-js/object/get-prototype-of\":29,\"babel-runtime/helpers/classCallCheck\":36,\"babel-runtime/helpers/createClass\":37,\"babel-runtime/helpers/inherits\":38,\"babel-runtime/helpers/possibleConstructorReturn\":39}],5:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.AES_CBC_Decrypt = exports.AES_CBC_Encrypt = exports.AES_CBC = undefined;\n\nvar _exports = _dereq_('../exports');\n\nvar _cbc = _dereq_('./cbc');\n\n/**\n * @param {Uint8Array} data\n * @param {Uint8Array} key\n * @param {boolean} [padding]\n * @param {Uint8Array} [iv]\n * @returns {Uint8Array}\n */\nfunction AES_CBC_encrypt_bytes(data, key, padding, iv) {\n if (data === undefined) throw new SyntaxError('data required');\n if (key === undefined) throw new SyntaxError('key required');\n return new _cbc.AES_CBC(key, iv, padding, _exports._AES_heap_instance, _exports._AES_asm_instance).encrypt(data).result;\n}\n\n/**\n * @param {Uint8Array} data\n * @param {Uint8Array} key\n * @param {boolean} [padding]\n * @param {Uint8Array} [iv]\n * @returns {Uint8Array}\n */\nfunction AES_CBC_decrypt_bytes(data, key, padding, iv) {\n if (data === undefined) throw new SyntaxError('data required');\n if (key === undefined) throw new SyntaxError('key required');\n return new _cbc.AES_CBC(key, iv, padding, _exports._AES_heap_instance, _exports._AES_asm_instance).decrypt(data).result;\n}\n\n_cbc.AES_CBC.encrypt = AES_CBC_encrypt_bytes;\n_cbc.AES_CBC.decrypt = AES_CBC_decrypt_bytes;\n\nexports.AES_CBC = _cbc.AES_CBC;\nexports.AES_CBC_Encrypt = _cbc.AES_CBC_Encrypt;\nexports.AES_CBC_Decrypt = _cbc.AES_CBC_Decrypt;\n\n},{\"../exports\":11,\"./cbc\":4}],6:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.AES_CFB_Decrypt = exports.AES_CFB_Encrypt = exports.AES_CFB = undefined;\n\nvar _getPrototypeOf = _dereq_('babel-runtime/core-js/object/get-prototype-of');\n\nvar _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);\n\nvar _classCallCheck2 = _dereq_('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = _dereq_('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _possibleConstructorReturn2 = _dereq_('babel-runtime/helpers/possibleConstructorReturn');\n\nvar _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);\n\nvar _inherits2 = _dereq_('babel-runtime/helpers/inherits');\n\nvar _inherits3 = _interopRequireDefault(_inherits2);\n\nvar _aes = _dereq_('../aes');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AES_CFB = exports.AES_CFB = function (_AES) {\n (0, _inherits3.default)(AES_CFB, _AES);\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} [iv]\n * @param {Uint8Array} [heap]\n * @param {Uint8Array} [asm]\n */\n function AES_CFB(key, iv, heap, asm) {\n (0, _classCallCheck3.default)(this, AES_CFB);\n\n var _this = (0, _possibleConstructorReturn3.default)(this, (AES_CFB.__proto__ || (0, _getPrototypeOf2.default)(AES_CFB)).call(this, key, iv, true, heap, asm));\n\n delete _this.padding;\n\n _this.mode = 'CFB';\n _this.BLOCK_SIZE = 16;\n return _this;\n }\n\n (0, _createClass3.default)(AES_CFB, [{\n key: 'encrypt',\n value: function encrypt(data) {\n return this.AES_Encrypt_finish(data);\n }\n }, {\n key: 'decrypt',\n value: function decrypt(data) {\n return this.AES_Decrypt_finish(data);\n }\n }]);\n return AES_CFB;\n}(_aes.AES); /**\n * Cipher Feedback Mode (CFB)\n */\n\nvar AES_CFB_Encrypt = exports.AES_CFB_Encrypt = function (_AES_CFB) {\n (0, _inherits3.default)(AES_CFB_Encrypt, _AES_CFB);\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} [iv=null]\n * @param {Uint8Array} [heap]\n * @param {Uint8Array} [asm]\n */\n function AES_CFB_Encrypt(key, iv, heap, asm) {\n (0, _classCallCheck3.default)(this, AES_CFB_Encrypt);\n return (0, _possibleConstructorReturn3.default)(this, (AES_CFB_Encrypt.__proto__ || (0, _getPrototypeOf2.default)(AES_CFB_Encrypt)).call(this, key, iv, heap, asm));\n }\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} [iv]\n * @param {boolean} [padding]\n * @returns {AES_CFB_Encrypt}\n */\n\n\n (0, _createClass3.default)(AES_CFB_Encrypt, [{\n key: 'reset',\n value: function reset(key, iv, padding) {\n return this.AES_reset(key, iv, padding);\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_CFB_Encrypt}\n */\n\n }, {\n key: 'process',\n value: function process(data) {\n return this.AES_Encrypt_process(data);\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_CFB_Encrypt}\n */\n\n }, {\n key: 'finish',\n value: function finish(data) {\n return this.AES_Encrypt_finish(data);\n }\n }]);\n return AES_CFB_Encrypt;\n}(AES_CFB);\n\nvar AES_CFB_Decrypt = exports.AES_CFB_Decrypt = function (_AES_CFB2) {\n (0, _inherits3.default)(AES_CFB_Decrypt, _AES_CFB2);\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} [iv=null]\n * @param {Uint8Array} [heap]\n * @param {Uint8Array} [asm]\n */\n function AES_CFB_Decrypt(key, iv, heap, asm) {\n (0, _classCallCheck3.default)(this, AES_CFB_Decrypt);\n return (0, _possibleConstructorReturn3.default)(this, (AES_CFB_Decrypt.__proto__ || (0, _getPrototypeOf2.default)(AES_CFB_Decrypt)).call(this, key, iv, heap, asm));\n }\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} [iv]\n * @param {boolean} [padding]\n * @returns {AES_CFB_Decrypt}\n */\n\n\n (0, _createClass3.default)(AES_CFB_Decrypt, [{\n key: 'reset',\n value: function reset(key, iv, padding) {\n return this.AES_reset(key, iv, padding);\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_CFB_Decrypt}\n */\n\n }, {\n key: 'process',\n value: function process(data) {\n return this.AES_Decrypt_process(data);\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_CFB_Decrypt}\n */\n\n }, {\n key: 'finish',\n value: function finish(data) {\n return this.AES_Decrypt_finish(data);\n }\n }]);\n return AES_CFB_Decrypt;\n}(AES_CFB);\n\n},{\"../aes\":3,\"babel-runtime/core-js/object/get-prototype-of\":29,\"babel-runtime/helpers/classCallCheck\":36,\"babel-runtime/helpers/createClass\":37,\"babel-runtime/helpers/inherits\":38,\"babel-runtime/helpers/possibleConstructorReturn\":39}],7:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.AES_CFB_Decrypt = exports.AES_CFB_Encrypt = exports.AES_CFB = undefined;\n\nvar _exports = _dereq_('../exports');\n\nvar _cfb = _dereq_('./cfb');\n\n/**\n * @param {Uint8Array} data\n * @param {Uint8Array} key\n * @param {Uint8Array} [iv]\n * @returns {Uint8Array}\n */\n/**\n * AES-CFB exports\n */\n\nfunction AES_CFB_encrypt_bytes(data, key, iv) {\n if (data === undefined) throw new SyntaxError('data required');\n if (key === undefined) throw new SyntaxError('key required');\n return new _cfb.AES_CFB(key, iv, _exports._AES_heap_instance, _exports._AES_asm_instance).encrypt(data).result;\n}\n\n/**\n * @param {Uint8Array} data\n * @param {Uint8Array} key\n * @param {Uint8Array} [iv]\n * @returns {Uint8Array}\n */\nfunction AES_CFB_decrypt_bytes(data, key, iv) {\n if (data === undefined) throw new SyntaxError('data required');\n if (key === undefined) throw new SyntaxError('key required');\n return new _cfb.AES_CFB(key, iv, _exports._AES_heap_instance, _exports._AES_asm_instance).decrypt(data).result;\n}\n\n_cfb.AES_CFB.encrypt = AES_CFB_encrypt_bytes;\n_cfb.AES_CFB.decrypt = AES_CFB_decrypt_bytes;\n\nexports.AES_CFB = _cfb.AES_CFB;\nexports.AES_CFB_Encrypt = _cfb.AES_CFB_Encrypt;\nexports.AES_CFB_Decrypt = _cfb.AES_CFB_Decrypt;\n\n},{\"../exports\":11,\"./cfb\":6}],8:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.AES_CTR_Crypt = exports.AES_CTR = undefined;\n\nvar _getPrototypeOf = _dereq_('babel-runtime/core-js/object/get-prototype-of');\n\nvar _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);\n\nvar _classCallCheck2 = _dereq_('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = _dereq_('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _possibleConstructorReturn2 = _dereq_('babel-runtime/helpers/possibleConstructorReturn');\n\nvar _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);\n\nvar _inherits2 = _dereq_('babel-runtime/helpers/inherits');\n\nvar _inherits3 = _interopRequireDefault(_inherits2);\n\nvar _aes = _dereq_('../aes');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AES_CTR = exports.AES_CTR = function (_AES) {\n (0, _inherits3.default)(AES_CTR, _AES);\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} nonce\n * @param {Uint8Array} [heap]\n * @param {Uint8Array} [asm]\n */\n function AES_CTR(key, nonce, heap, asm) {\n (0, _classCallCheck3.default)(this, AES_CTR);\n\n var _this = (0, _possibleConstructorReturn3.default)(this, (AES_CTR.__proto__ || (0, _getPrototypeOf2.default)(AES_CTR)).call(this, key, undefined, undefined, heap, asm));\n\n _this.reset(key, nonce);\n\n _this.AES_CTR_set_options(nonce);\n delete _this.padding;\n\n _this.mode = 'CTR';\n _this.BLOCK_SIZE = 16;\n return _this;\n }\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} nonce\n * @param {number} [counter]\n * @param {number} [counterSize]\n * @returns {AES_CTR}\n */\n\n\n (0, _createClass3.default)(AES_CTR, [{\n key: 'reset',\n value: function reset(key, nonce, counter, counterSize) {\n this.AES_reset(key, undefined, undefined);\n\n this.AES_CTR_set_options(nonce, counter, counterSize);\n\n return this;\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_CTR}\n */\n\n }, {\n key: 'encrypt',\n value: function encrypt(data) {\n return this.AES_Encrypt_finish(data);\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_CTR}\n */\n\n }, {\n key: 'decrypt',\n value: function decrypt(data) {\n return this.AES_Encrypt_finish(data);\n }\n }]);\n return AES_CTR;\n}(_aes.AES); /**\n * Counter Mode (CTR)\n */\n\nvar AES_CTR_Crypt = exports.AES_CTR_Crypt = function (_AES_CTR) {\n (0, _inherits3.default)(AES_CTR_Crypt, _AES_CTR);\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} nonce\n * @param {Uint8Array} [heap]\n * @param {Uint8Array} [asm]\n */\n function AES_CTR_Crypt(key, nonce, heap, asm) {\n (0, _classCallCheck3.default)(this, AES_CTR_Crypt);\n\n var _this2 = (0, _possibleConstructorReturn3.default)(this, (AES_CTR_Crypt.__proto__ || (0, _getPrototypeOf2.default)(AES_CTR_Crypt)).call(this, key, nonce, heap, asm));\n\n _this2.BLOCK_SIZE = 16;\n return _this2;\n }\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} nonce\n * @param {number} [counter]\n * @param {number} [counterSize]\n * @returns {AES_CTR_Crypt}\n */\n\n\n (0, _createClass3.default)(AES_CTR_Crypt, [{\n key: 'reset',\n value: function reset(key, nonce, counter, counterSize) {\n this.AES_reset(key, undefined, undefined);\n\n this.AES_CTR_set_options(nonce, counter, counterSize);\n\n return this;\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_CTR_Crypt}\n */\n\n }, {\n key: 'process',\n value: function process(data) {\n return this.AES_Encrypt_process(data);\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_CTR_Crypt}\n */\n\n }, {\n key: 'finish',\n value: function finish(data) {\n return this.AES_Encrypt_finish(data);\n }\n }]);\n return AES_CTR_Crypt;\n}(AES_CTR);\n\n},{\"../aes\":3,\"babel-runtime/core-js/object/get-prototype-of\":29,\"babel-runtime/helpers/classCallCheck\":36,\"babel-runtime/helpers/createClass\":37,\"babel-runtime/helpers/inherits\":38,\"babel-runtime/helpers/possibleConstructorReturn\":39}],9:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.AES_CTR = undefined;\n\nvar _exports = _dereq_('../exports');\n\nvar _ctr = _dereq_('./ctr');\n\n/**\n * @param {Uint8Array} data\n * @param {Uint8Array} key\n * @param {Uint8Array} nonce\n * @returns {Uint8Array}\n */\n/**\n * AES-CTR exports\n */\n\nfunction AES_CTR_crypt_bytes(data, key, nonce) {\n if (data === undefined) throw new SyntaxError('data required');\n if (key === undefined) throw new SyntaxError('key required');\n if (nonce === undefined) throw new SyntaxError('nonce required');\n return new _ctr.AES_CTR(key, nonce, _exports._AES_heap_instance, _exports._AES_asm_instance).encrypt(data).result;\n}\n\n_ctr.AES_CTR.encrypt = AES_CTR_crypt_bytes;\n_ctr.AES_CTR.decrypt = AES_CTR_crypt_bytes;\n\nexports.AES_CTR = _ctr.AES_CTR;\n\n},{\"../exports\":11,\"./ctr\":8}],10:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.AES_ECB_Decrypt = exports.AES_ECB_Encrypt = exports.AES_ECB = undefined;\n\nvar _getPrototypeOf = _dereq_('babel-runtime/core-js/object/get-prototype-of');\n\nvar _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);\n\nvar _classCallCheck2 = _dereq_('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = _dereq_('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _possibleConstructorReturn2 = _dereq_('babel-runtime/helpers/possibleConstructorReturn');\n\nvar _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);\n\nvar _inherits2 = _dereq_('babel-runtime/helpers/inherits');\n\nvar _inherits3 = _interopRequireDefault(_inherits2);\n\nvar _aes = _dereq_('../aes');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Electronic Code Book Mode (ECB)\n */\nvar AES_ECB = exports.AES_ECB = function (_AES) {\n (0, _inherits3.default)(AES_ECB, _AES);\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} [heap]\n * @param {Uint8Array} [asm]\n */\n function AES_ECB(key, heap, asm) {\n (0, _classCallCheck3.default)(this, AES_ECB);\n\n var _this = (0, _possibleConstructorReturn3.default)(this, (AES_ECB.__proto__ || (0, _getPrototypeOf2.default)(AES_ECB)).call(this, key, undefined, false, heap, asm));\n\n _this.mode = 'ECB';\n _this.BLOCK_SIZE = 16;\n return _this;\n }\n\n (0, _createClass3.default)(AES_ECB, [{\n key: 'encrypt',\n value: function encrypt(data) {\n return this.AES_Encrypt_finish(data);\n }\n }, {\n key: 'decrypt',\n value: function decrypt(data) {\n return this.AES_Decrypt_finish(data);\n }\n }]);\n return AES_ECB;\n}(_aes.AES);\n\nvar AES_ECB_Encrypt = exports.AES_ECB_Encrypt = function (_AES_ECB) {\n (0, _inherits3.default)(AES_ECB_Encrypt, _AES_ECB);\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} [heap]\n * @param {Uint8Array} [asm]\n */\n function AES_ECB_Encrypt(key, heap, asm) {\n (0, _classCallCheck3.default)(this, AES_ECB_Encrypt);\n return (0, _possibleConstructorReturn3.default)(this, (AES_ECB_Encrypt.__proto__ || (0, _getPrototypeOf2.default)(AES_ECB_Encrypt)).call(this, key, heap, asm));\n }\n\n /**\n * @param {Uint8Array} key\n * @returns {AES_ECB_Encrypt}\n */\n\n\n (0, _createClass3.default)(AES_ECB_Encrypt, [{\n key: 'reset',\n value: function reset(key) {\n return this.AES_reset(key, null, true);\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_ECB_Encrypt}\n */\n\n }, {\n key: 'process',\n value: function process(data) {\n return this.AES_Encrypt_process(data);\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_ECB_Encrypt}\n */\n\n }, {\n key: 'finish',\n value: function finish(data) {\n return this.AES_Encrypt_finish(data);\n }\n }]);\n return AES_ECB_Encrypt;\n}(AES_ECB);\n\nvar AES_ECB_Decrypt = exports.AES_ECB_Decrypt = function (_AES_ECB2) {\n (0, _inherits3.default)(AES_ECB_Decrypt, _AES_ECB2);\n\n /**\n * @param {Uint8Array} key\n * @param {Uint8Array} [heap]\n * @param {Uint8Array} [asm]\n */\n function AES_ECB_Decrypt(key, heap, asm) {\n (0, _classCallCheck3.default)(this, AES_ECB_Decrypt);\n return (0, _possibleConstructorReturn3.default)(this, (AES_ECB_Decrypt.__proto__ || (0, _getPrototypeOf2.default)(AES_ECB_Decrypt)).call(this, key, heap, asm));\n }\n\n /**\n * @param {Uint8Array} key\n * @returns {AES_ECB_Decrypt}\n */\n\n\n (0, _createClass3.default)(AES_ECB_Decrypt, [{\n key: 'reset',\n value: function reset(key) {\n return this.AES_reset(key, null, true);\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_ECB_Decrypt}\n */\n\n }, {\n key: 'process',\n value: function process(data) {\n return this.AES_Decrypt_process(data);\n }\n\n /**\n * @param {Uint8Array} data\n * @returns {AES_ECB_Decrypt}\n */\n\n }, {\n key: 'finish',\n value: function finish(data) {\n return this.AES_Decrypt_finish(data);\n }\n }]);\n return AES_ECB_Decrypt;\n}(AES_ECB);\n\n},{\"../aes\":3,\"babel-runtime/core-js/object/get-prototype-of\":29,\"babel-runtime/helpers/classCallCheck\":36,\"babel-runtime/helpers/createClass\":37,\"babel-runtime/helpers/inherits\":38,\"babel-runtime/helpers/possibleConstructorReturn\":39}],11:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports._AES_asm_instance = exports._AES_heap_instance = undefined;\n\nvar _aes = _dereq_('./aes.asm');\n\nvar _AES_heap_instance = exports._AES_heap_instance = new Uint8Array(0x100000); // 1MB\n// shared asm.js module and heap\nvar _AES_asm_instance = exports._AES_asm_instance = (0, _aes.AES_asm)(null, _AES_heap_instance.buffer);\n\n},{\"./aes.asm\":2}],12:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.AES_GCM_Decrypt = exports.AES_GCM_Encrypt = exports.AES_GCM = undefined;\n\nvar _exports = _dereq_('../exports');\n\nvar _gcm = _dereq_('./gcm');\n\n/**\n * @param {Uint8Array} data\n * @param {Uint8Array} key\n * @param {Uint8Array} nonce\n * @param {Uint8Array} [adata]\n * @param {number} [tagSize]\n * @return {Uint8Array}\n */\n/**\n * AES-GCM exports\n */\n\nfunction AES_GCM_encrypt_bytes(data, key, nonce, adata, tagSize) {\n if (data === undefined) throw new SyntaxError('data required');\n if (key === undefined) throw new SyntaxError('key required');\n if (nonce === undefined) throw new SyntaxError('nonce required');\n return new _gcm.AES_GCM(key, nonce, adata, tagSize, _exports._AES_heap_instance, _exports._AES_asm_instance).encrypt(data).result;\n}\n\n/**\n * @param {Uint8Array} data\n * @param {Uint8Array} key\n * @param {Uint8Array} nonce\n * @param {Uint8Array} [adata]\n * @param {number} [tagSize]\n * @return {Uint8Array}\n */\nfunction AES_GCM_decrypt_bytes(data, key, nonce, adata, tagSize) {\n if (data === undefined) throw new SyntaxError('data required');\n if (key === undefined) throw new SyntaxError('key required');\n if (nonce === undefined) throw new SyntaxError('nonce required');\n return new _gcm.AES_GCM(key, nonce, adata, tagSize, _exports._AES_heap_instance, _exports._AES_asm_instance).decrypt(data).result;\n}\n\n_gcm.AES_GCM.encrypt = AES_GCM_encrypt_bytes;\n_gcm.AES_GCM.decrypt = AES_GCM_decrypt_bytes;\n\nexports.AES_GCM = _gcm.AES_GCM;\nexports.AES_GCM_Encrypt = _gcm.AES_GCM_Encrypt;\nexports.AES_GCM_Decrypt = _gcm.AES_GCM_Decrypt;\n\n},{\"../exports\":11,\"./gcm\":13}],13:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.AES_GCM_Decrypt = exports.AES_GCM_Encrypt = exports.AES_GCM = undefined;\n\nvar _getPrototypeOf = _dereq_('babel-runtime/core-js/object/get-prototype-of');\n\nvar _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);\n\nvar _classCallCheck2 = _dereq_('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = _dereq_('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _possibleConstructorReturn2 = _dereq_('babel-runtime/helpers/possibleConstructorReturn');\n\nvar _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);\n\nvar _inherits2 = _dereq_('babel-runtime/helpers/inherits');\n\nvar _inherits3 = _interopRequireDefault(_inherits2);\n\nvar _errors = _dereq_('../../errors');\n\nvar _utils = _dereq_('../../utils');\n\nvar _aes = _dereq_('../aes');\n\nvar _aes2 = _dereq_('../aes.asm');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Galois/Counter mode\n */\n\nvar _AES_GCM_data_maxLength = 68719476704; // 2^36 - 2^5\n\nvar AES_GCM = exports.AES_GCM = function (_AES) {\n (0, _inherits3.default)(AES_GCM, _AES);\n\n function AES_GCM(key, nonce, adata, tagSize, heap, asm) {\n (0, _classCallCheck3.default)(this, AES_GCM);\n\n var _this = (0, _possibleConstructorReturn3.default)(this, (AES_GCM.__proto__ || (0, _getPrototypeOf2.default)(AES_GCM)).call(this, key, undefined, false, heap, asm));\n\n _this.nonce = null;\n _this.adata = null;\n _this.iv = null;\n _this.counter = 1;\n _this.tagSize = 16;\n _this.mode = 'GCM';\n _this.BLOCK_SIZE = 16;\n\n _this.reset(key, tagSize, nonce, adata);\n return _this;\n }\n\n (0, _createClass3.default)(AES_GCM, [{\n key: 'reset',\n value: function reset(key, tagSize, nonce, adata) {\n return this.AES_GCM_reset(key, tagSize, nonce, adata);\n }\n }, {\n key: 'encrypt',\n value: function encrypt(data) {\n return this.AES_GCM_encrypt(data);\n }\n }, {\n key: 'decrypt',\n value: function decrypt(data) {\n return this.AES_GCM_decrypt(data);\n }\n }, {\n key: 'AES_GCM_Encrypt_process',\n value: function AES_GCM_Encrypt_process(data) {\n if (!(0, _utils.is_bytes)(data)) throw new TypeError(\"data isn't of expected type\");\n\n var dpos = 0,\n dlen = data.length || 0,\n asm = this.asm,\n heap = this.heap,\n counter = this.counter,\n pos = this.pos,\n len = this.len,\n rpos = 0,\n rlen = len + dlen & -16,\n wlen = 0;\n\n if ((counter - 1 << 4) + len + dlen > _AES_GCM_data_maxLength) throw new RangeError('counter overflow');\n\n var result = new Uint8Array(rlen);\n\n while (dlen > 0) {\n wlen = (0, _utils._heap_write)(heap, pos + len, data, dpos, dlen);\n len += wlen;\n dpos += wlen;\n dlen -= wlen;\n\n wlen = asm.cipher(_aes2.AES_asm.ENC.CTR, _aes2.AES_asm.HEAP_DATA + pos, len);\n wlen = asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA + pos, wlen);\n\n if (wlen) result.set(heap.subarray(pos, pos + wlen), rpos);\n counter += wlen >>> 4;\n rpos += wlen;\n\n if (wlen < len) {\n pos += wlen;\n len -= wlen;\n } else {\n pos = 0;\n len = 0;\n }\n }\n\n this.result = result;\n this.counter = counter;\n this.pos = pos;\n this.len = len;\n\n return this;\n }\n }, {\n key: 'AES_GCM_Encrypt_finish',\n value: function AES_GCM_Encrypt_finish() {\n var asm = this.asm,\n heap = this.heap,\n counter = this.counter,\n tagSize = this.tagSize,\n adata = this.adata,\n pos = this.pos,\n len = this.len;\n\n var result = new Uint8Array(len + tagSize);\n\n asm.cipher(_aes2.AES_asm.ENC.CTR, _aes2.AES_asm.HEAP_DATA + pos, len + 15 & -16);\n if (len) result.set(heap.subarray(pos, pos + len));\n\n for (var i = len; i & 15; i++) {\n heap[pos + i] = 0;\n }asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA + pos, i);\n\n var alen = adata !== null ? adata.length : 0,\n clen = (counter - 1 << 4) + len;\n heap[0] = heap[1] = heap[2] = 0, heap[3] = alen >>> 29, heap[4] = alen >>> 21, heap[5] = alen >>> 13 & 255, heap[6] = alen >>> 5 & 255, heap[7] = alen << 3 & 255, heap[8] = heap[9] = heap[10] = 0, heap[11] = clen >>> 29, heap[12] = clen >>> 21 & 255, heap[13] = clen >>> 13 & 255, heap[14] = clen >>> 5 & 255, heap[15] = clen << 3 & 255;\n asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA, 16);\n asm.get_iv(_aes2.AES_asm.HEAP_DATA);\n\n asm.set_counter(0, 0, 0, this.gamma0);\n asm.cipher(_aes2.AES_asm.ENC.CTR, _aes2.AES_asm.HEAP_DATA, 16);\n result.set(heap.subarray(0, tagSize), len);\n\n this.result = result;\n this.counter = 1;\n this.pos = 0;\n this.len = 0;\n\n return this;\n }\n }, {\n key: 'AES_GCM_Decrypt_process',\n value: function AES_GCM_Decrypt_process(data) {\n if (!(0, _utils.is_bytes)(data)) throw new TypeError(\"data isn't of expected type\");\n\n var dpos = 0,\n dlen = data.length || 0,\n asm = this.asm,\n heap = this.heap,\n counter = this.counter,\n tagSize = this.tagSize,\n pos = this.pos,\n len = this.len,\n rpos = 0,\n rlen = len + dlen > tagSize ? len + dlen - tagSize & -16 : 0,\n tlen = len + dlen - rlen,\n wlen = 0;\n\n if ((counter - 1 << 4) + len + dlen > _AES_GCM_data_maxLength) throw new RangeError('counter overflow');\n\n var result = new Uint8Array(rlen);\n\n while (dlen > tlen) {\n wlen = (0, _utils._heap_write)(heap, pos + len, data, dpos, dlen - tlen);\n len += wlen;\n dpos += wlen;\n dlen -= wlen;\n\n wlen = asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA + pos, wlen);\n wlen = asm.cipher(_aes2.AES_asm.DEC.CTR, _aes2.AES_asm.HEAP_DATA + pos, wlen);\n\n if (wlen) result.set(heap.subarray(pos, pos + wlen), rpos);\n counter += wlen >>> 4;\n rpos += wlen;\n\n pos = 0;\n len = 0;\n }\n\n if (dlen > 0) {\n len += (0, _utils._heap_write)(heap, 0, data, dpos, dlen);\n }\n\n this.result = result;\n this.counter = counter;\n this.pos = pos;\n this.len = len;\n\n return this;\n }\n }, {\n key: 'AES_GCM_Decrypt_finish',\n value: function AES_GCM_Decrypt_finish() {\n var asm = this.asm,\n heap = this.heap,\n tagSize = this.tagSize,\n adata = this.adata,\n counter = this.counter,\n pos = this.pos,\n len = this.len,\n rlen = len - tagSize,\n wlen = 0;\n\n if (len < tagSize) throw new _errors.IllegalStateError('authentication tag not found');\n\n var result = new Uint8Array(rlen),\n atag = new Uint8Array(heap.subarray(pos + rlen, pos + len));\n\n for (var i = rlen; i & 15; i++) {\n heap[pos + i] = 0;\n }wlen = asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA + pos, i);\n wlen = asm.cipher(_aes2.AES_asm.DEC.CTR, _aes2.AES_asm.HEAP_DATA + pos, i);\n if (rlen) result.set(heap.subarray(pos, pos + rlen));\n\n var alen = adata !== null ? adata.length : 0,\n clen = (counter - 1 << 4) + len - tagSize;\n heap[0] = heap[1] = heap[2] = 0, heap[3] = alen >>> 29, heap[4] = alen >>> 21, heap[5] = alen >>> 13 & 255, heap[6] = alen >>> 5 & 255, heap[7] = alen << 3 & 255, heap[8] = heap[9] = heap[10] = 0, heap[11] = clen >>> 29, heap[12] = clen >>> 21 & 255, heap[13] = clen >>> 13 & 255, heap[14] = clen >>> 5 & 255, heap[15] = clen << 3 & 255;\n asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA, 16);\n asm.get_iv(_aes2.AES_asm.HEAP_DATA);\n\n asm.set_counter(0, 0, 0, this.gamma0);\n asm.cipher(_aes2.AES_asm.ENC.CTR, _aes2.AES_asm.HEAP_DATA, 16);\n\n var acheck = 0;\n for (var i = 0; i < tagSize; ++i) {\n acheck |= atag[i] ^ heap[i];\n }if (acheck) throw new _errors.SecurityError('data integrity check failed');\n\n this.result = result;\n this.counter = 1;\n this.pos = 0;\n this.len = 0;\n\n return this;\n }\n }, {\n key: 'AES_GCM_decrypt',\n value: function AES_GCM_decrypt(data) {\n var result1 = this.AES_GCM_Decrypt_process(data).result;\n var result2 = this.AES_GCM_Decrypt_finish().result;\n\n var result = new Uint8Array(result1.length + result2.length);\n if (result1.length) result.set(result1);\n if (result2.length) result.set(result2, result1.length);\n this.result = result;\n\n return this;\n }\n }, {\n key: 'AES_GCM_encrypt',\n value: function AES_GCM_encrypt(data) {\n var result1 = this.AES_GCM_Encrypt_process(data).result;\n var result2 = this.AES_GCM_Encrypt_finish().result;\n\n var result = new Uint8Array(result1.length + result2.length);\n if (result1.length) result.set(result1);\n if (result2.length) result.set(result2, result1.length);\n this.result = result;\n\n return this;\n }\n }, {\n key: 'AES_GCM_reset',\n value: function AES_GCM_reset(key, tagSize, nonce, adata, counter, iv) {\n this.AES_reset(key, undefined, false);\n\n var asm = this.asm;\n var heap = this.heap;\n\n asm.gcm_init();\n\n var tagSize = tagSize;\n if (tagSize !== undefined) {\n if (!(0, _utils.is_number)(tagSize)) throw new TypeError('tagSize must be a number');\n\n if (tagSize < 4 || tagSize > 16) throw new _errors.IllegalArgumentError('illegal tagSize value');\n\n this.tagSize = tagSize;\n } else {\n this.tagSize = 16;\n }\n\n if (nonce !== undefined) {\n if (!(0, _utils.is_bytes)(nonce)) {\n throw new TypeError('unexpected nonce type');\n }\n\n this.nonce = nonce;\n\n var noncelen = nonce.length || 0,\n noncebuf = new Uint8Array(16);\n if (noncelen !== 12) {\n this._gcm_mac_process(nonce);\n\n heap[0] = heap[1] = heap[2] = heap[3] = heap[4] = heap[5] = heap[6] = heap[7] = heap[8] = heap[9] = heap[10] = 0, heap[11] = noncelen >>> 29, heap[12] = noncelen >>> 21 & 255, heap[13] = noncelen >>> 13 & 255, heap[14] = noncelen >>> 5 & 255, heap[15] = noncelen << 3 & 255;\n asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA, 16);\n\n asm.get_iv(_aes2.AES_asm.HEAP_DATA);\n asm.set_iv();\n\n noncebuf.set(heap.subarray(0, 16));\n } else {\n noncebuf.set(nonce);\n noncebuf[15] = 1;\n }\n\n var nonceview = new DataView(noncebuf.buffer);\n this.gamma0 = nonceview.getUint32(12);\n\n asm.set_nonce(nonceview.getUint32(0), nonceview.getUint32(4), nonceview.getUint32(8), 0);\n asm.set_mask(0, 0, 0, 0xffffffff);\n } else {\n throw new Error('nonce is required');\n }\n\n if (adata !== undefined && adata !== null) {\n if (!(0, _utils.is_bytes)(adata)) {\n throw new TypeError('unexpected adata type');\n }\n\n if (adata.length > _AES_GCM_data_maxLength) throw new _errors.IllegalArgumentError('illegal adata length');\n\n if (adata.length) {\n this.adata = adata;\n this._gcm_mac_process(adata);\n } else {\n this.adata = null;\n }\n } else {\n this.adata = null;\n }\n\n if (counter !== undefined) {\n if (!(0, _utils.is_number)(counter)) throw new TypeError('counter must be a number');\n\n if (counter < 1 || counter > 0xffffffff) throw new RangeError('counter must be a positive 32-bit integer');\n\n this.counter = counter;\n asm.set_counter(0, 0, 0, this.gamma0 + counter | 0);\n } else {\n this.counter = 1;\n asm.set_counter(0, 0, 0, this.gamma0 + 1 | 0);\n }\n\n if (iv !== undefined) {\n if (!(0, _utils.is_number)(iv)) throw new TypeError('iv must be a number');\n\n this.iv = iv;\n\n this.AES_set_iv(iv);\n }\n\n return this;\n }\n }, {\n key: '_gcm_mac_process',\n value: function _gcm_mac_process(data) {\n var heap = this.heap,\n asm = this.asm,\n dpos = 0,\n dlen = data.length || 0,\n wlen = 0;\n\n while (dlen > 0) {\n wlen = (0, _utils._heap_write)(heap, 0, data, dpos, dlen);\n dpos += wlen;\n dlen -= wlen;\n\n while (wlen & 15) {\n heap[wlen++] = 0;\n }asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA, wlen);\n }\n }\n }]);\n return AES_GCM;\n}(_aes.AES);\n\nvar AES_GCM_Encrypt = exports.AES_GCM_Encrypt = function (_AES_GCM) {\n (0, _inherits3.default)(AES_GCM_Encrypt, _AES_GCM);\n\n function AES_GCM_Encrypt(key, nonce, adata, tagSize, heap, asm) {\n (0, _classCallCheck3.default)(this, AES_GCM_Encrypt);\n return (0, _possibleConstructorReturn3.default)(this, (AES_GCM_Encrypt.__proto__ || (0, _getPrototypeOf2.default)(AES_GCM_Encrypt)).call(this, key, nonce, adata, tagSize, heap, asm));\n }\n\n (0, _createClass3.default)(AES_GCM_Encrypt, [{\n key: 'process',\n value: function process(data) {\n return this.AES_GCM_Encrypt_process(data);\n }\n }, {\n key: 'finish',\n value: function finish() {\n return this.AES_GCM_Encrypt_finish();\n }\n }]);\n return AES_GCM_Encrypt;\n}(AES_GCM);\n\nvar AES_GCM_Decrypt = exports.AES_GCM_Decrypt = function (_AES_GCM2) {\n (0, _inherits3.default)(AES_GCM_Decrypt, _AES_GCM2);\n\n function AES_GCM_Decrypt(key, nonce, adata, tagSize, heap, asm) {\n (0, _classCallCheck3.default)(this, AES_GCM_Decrypt);\n return (0, _possibleConstructorReturn3.default)(this, (AES_GCM_Decrypt.__proto__ || (0, _getPrototypeOf2.default)(AES_GCM_Decrypt)).call(this, key, nonce, adata, tagSize, heap, asm));\n }\n\n (0, _createClass3.default)(AES_GCM_Decrypt, [{\n key: 'process',\n value: function process(data) {\n return this.AES_GCM_Decrypt_process(data);\n }\n }, {\n key: 'finish',\n value: function finish() {\n return this.AES_GCM_Decrypt_finish();\n }\n }]);\n return AES_GCM_Decrypt;\n}(AES_GCM);\n\n},{\"../../errors\":14,\"../../utils\":19,\"../aes\":3,\"../aes.asm\":2,\"babel-runtime/core-js/object/get-prototype-of\":29,\"babel-runtime/helpers/classCallCheck\":36,\"babel-runtime/helpers/createClass\":37,\"babel-runtime/helpers/inherits\":38,\"babel-runtime/helpers/possibleConstructorReturn\":39}],14:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _create = _dereq_('babel-runtime/core-js/object/create');\n\nvar _create2 = _interopRequireDefault(_create);\n\nexports.IllegalStateError = IllegalStateError;\nexports.IllegalArgumentError = IllegalArgumentError;\nexports.SecurityError = SecurityError;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction IllegalStateError() {\n var err = Error.apply(this, arguments);\n this.message = err.message, this.stack = err.stack;\n}\nIllegalStateError.prototype = (0, _create2.default)(Error.prototype, { name: { value: 'IllegalStateError' } });\n\nfunction IllegalArgumentError() {\n var err = Error.apply(this, arguments);\n this.message = err.message, this.stack = err.stack;\n}\nIllegalArgumentError.prototype = (0, _create2.default)(Error.prototype, { name: { value: 'IllegalArgumentError' } });\n\nfunction SecurityError() {\n var err = Error.apply(this, arguments);\n this.message = err.message, this.stack = err.stack;\n}\nSecurityError.prototype = (0, _create2.default)(Error.prototype, { name: { value: 'SecurityError' } });\n\n},{\"babel-runtime/core-js/object/create\":25}],15:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.hash_reset = hash_reset;\nexports.hash_process = hash_process;\nexports.hash_finish = hash_finish;\n\nvar _utils = _dereq_('../utils');\n\nvar _errors = _dereq_('../errors');\n\nfunction hash_reset() {\n this.result = null;\n this.pos = 0;\n this.len = 0;\n\n this.asm.reset();\n\n return this;\n}\n\nfunction hash_process(data) {\n if (this.result !== null) throw new _errors.IllegalStateError('state must be reset before processing new data');\n\n if ((0, _utils.is_string)(data)) data = (0, _utils.string_to_bytes)(data);\n\n if ((0, _utils.is_buffer)(data)) data = new Uint8Array(data);\n\n if (!(0, _utils.is_bytes)(data)) throw new TypeError(\"data isn't of expected type\");\n\n var asm = this.asm,\n heap = this.heap,\n hpos = this.pos,\n hlen = this.len,\n dpos = 0,\n dlen = data.length,\n wlen = 0;\n\n while (dlen > 0) {\n wlen = (0, _utils._heap_write)(heap, hpos + hlen, data, dpos, dlen);\n hlen += wlen;\n dpos += wlen;\n dlen -= wlen;\n\n wlen = asm.process(hpos, hlen);\n\n hpos += wlen;\n hlen -= wlen;\n\n if (!hlen) hpos = 0;\n }\n\n this.pos = hpos;\n this.len = hlen;\n\n return this;\n}\n\nfunction hash_finish() {\n if (this.result !== null) throw new _errors.IllegalStateError('state must be reset before processing new data');\n\n this.asm.finish(this.pos, this.len, 0);\n\n this.result = new Uint8Array(this.HASH_SIZE);\n this.result.set(this.heap.subarray(0, this.HASH_SIZE));\n\n this.pos = 0;\n this.len = 0;\n\n return this;\n}\n\n},{\"../errors\":14,\"../utils\":19}],16:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.SHA256 = undefined;\n\nvar _sha = _dereq_('./sha256');\n\nvar _utils = _dereq_('../../utils');\n\n/**\n * SHA256 exports\n */\n\nfunction sha256_bytes(data) {\n if (data === undefined) throw new SyntaxError('data required');\n return (0, _sha.get_sha256_instance)().reset().process(data).finish().result;\n}\n\nfunction sha256_hex(data) {\n var result = sha256_bytes(data);\n return (0, _utils.bytes_to_hex)(result);\n}\n\nfunction sha256_base64(data) {\n var result = sha256_bytes(data);\n return (0, _utils.bytes_to_base64)(result);\n}\n\nvar SHA256 = exports.SHA256 = _sha.sha256_constructor;\nSHA256.bytes = sha256_bytes;\nSHA256.hex = sha256_hex;\nSHA256.base64 = sha256_base64;\n\n},{\"../../utils\":19,\"./sha256\":18}],17:[function(_dereq_,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.sha256_asm = sha256_asm;\nfunction sha256_asm(stdlib, foreign, buffer) {\n \"use asm\";\n\n // SHA256 state\n\n var H0 = 0,\n H1 = 0,\n H2 = 0,\n H3 = 0,\n H4 = 0,\n H5 = 0,\n H6 = 0,\n H7 = 0,\n TOTAL0 = 0,\n TOTAL1 = 0;\n\n // HMAC state\n var I0 = 0,\n I1 = 0,\n I2 = 0,\n I3 = 0,\n I4 = 0,\n I5 = 0,\n I6 = 0,\n I7 = 0,\n O0 = 0,\n O1 = 0,\n O2 = 0,\n O3 = 0,\n O4 = 0,\n O5 = 0,\n O6 = 0,\n O7 = 0;\n\n // I/O buffer\n var HEAP = new stdlib.Uint8Array(buffer);\n\n function _core(w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15) {\n w0 = w0 | 0;\n w1 = w1 | 0;\n w2 = w2 | 0;\n w3 = w3 | 0;\n w4 = w4 | 0;\n w5 = w5 | 0;\n w6 = w6 | 0;\n w7 = w7 | 0;\n w8 = w8 | 0;\n w9 = w9 | 0;\n w10 = w10 | 0;\n w11 = w11 | 0;\n w12 = w12 | 0;\n w13 = w13 | 0;\n w14 = w14 | 0;\n w15 = w15 | 0;\n\n var a = 0,\n b = 0,\n c = 0,\n d = 0,\n e = 0,\n f = 0,\n g = 0,\n h = 0;\n\n a = H0;\n b = H1;\n c = H2;\n d = H3;\n e = H4;\n f = H5;\n g = H6;\n h = H7;\n\n // 0\n h = w0 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x428a2f98 | 0;\n d = d + h | 0;\n h = h + (a & b ^ c & (a ^ b)) + (a >>> 2 ^ a >>> 13 ^ a >>> 22 ^ a << 30 ^ a << 19 ^ a << 10) | 0;\n\n // 1\n g = w1 + g + (d >>> 6 ^ d >>> 11 ^ d >>> 25 ^ d << 26 ^ d << 21 ^ d << 7) + (f ^ d & (e ^ f)) + 0x71374491 | 0;\n c = c + g | 0;\n g = g + (h & a ^ b & (h ^ a)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0;\n\n // 2\n f = w2 + f + (c >>> 6 ^ c >>> 11 ^ c >>> 25 ^ c << 26 ^ c << 21 ^ c << 7) + (e ^ c & (d ^ e)) + 0xb5c0fbcf | 0;\n b = b + f | 0;\n f = f + (g & h ^ a & (g ^ h)) + (g >>> 2 ^ g >>> 13 ^ g >>> 22 ^ g << 30 ^ g << 19 ^ g << 10) | 0;\n\n // 3\n e = w3 + e + (b >>> 6 ^ b >>> 11 ^ b >>> 25 ^ b << 26 ^ b << 21 ^ b << 7) + (d ^ b & (c ^ d)) + 0xe9b5dba5 | 0;\n a = a + e | 0;\n e = e + (f & g ^ h & (f ^ g)) + (f >>> 2 ^ f >>> 13 ^ f >>> 22 ^ f << 30 ^ f << 19 ^ f << 10) | 0;\n\n // 4\n d = w4 + d + (a >>> 6 ^ a >>> 11 ^ a >>> 25 ^ a << 26 ^ a << 21 ^ a << 7) + (c ^ a & (b ^ c)) + 0x3956c25b | 0;\n h = h + d | 0;\n d = d + (e & f ^ g & (e ^ f)) + (e >>> 2 ^ e >>> 13 ^ e >>> 22 ^ e << 30 ^ e << 19 ^ e << 10) | 0;\n\n // 5\n c = w5 + c + (h >>> 6 ^ h >>> 11 ^ h >>> 25 ^ h << 26 ^ h << 21 ^ h << 7) + (b ^ h & (a ^ b)) + 0x59f111f1 | 0;\n g = g + c | 0;\n c = c + (d & e ^ f & (d ^ e)) + (d >>> 2 ^ d >>> 13 ^ d >>> 22 ^ d << 30 ^ d << 19 ^ d << 10) | 0;\n\n // 6\n b = w6 + b + (g >>> 6 ^ g >>> 11 ^ g >>> 25 ^ g << 26 ^ g << 21 ^ g << 7) + (a ^ g & (h ^ a)) + 0x923f82a4 | 0;\n f = f + b | 0;\n b = b + (c & d ^ e & (c ^ d)) + (c >>> 2 ^ c >>> 13 ^ c >>> 22 ^ c << 30 ^ c << 19 ^ c << 10) | 0;\n\n // 7\n a = w7 + a + (f >>> 6 ^ f >>> 11 ^ f >>> 25 ^ f << 26 ^ f << 21 ^ f << 7) + (h ^ f & (g ^ h)) + 0xab1c5ed5 | 0;\n e = e + a | 0;\n a = a + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0;\n\n // 8\n h = w8 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xd807aa98 | 0;\n d = d + h | 0;\n h = h + (a & b ^ c & (a ^ b)) + (a >>> 2 ^ a >>> 13 ^ a >>> 22 ^ a << 30 ^ a << 19 ^ a << 10) | 0;\n\n // 9\n g = w9 + g + (d >>> 6 ^ d >>> 11 ^ d >>> 25 ^ d << 26 ^ d << 21 ^ d << 7) + (f ^ d & (e ^ f)) + 0x12835b01 | 0;\n c = c + g | 0;\n g = g + (h & a ^ b & (h ^ a)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0;\n\n // 10\n f = w10 + f + (c >>> 6 ^ c >>> 11 ^ c >>> 25 ^ c << 26 ^ c << 21 ^ c << 7) + (e ^ c & (d ^ e)) + 0x243185be | 0;\n b = b + f | 0;\n f = f + (g & h ^ a & (g ^ h)) + (g >>> 2 ^ g >>> 13 ^ g >>> 22 ^ g << 30 ^ g << 19 ^ g << 10) | 0;\n\n // 11\n e = w11 + e + (b >>> 6 ^ b >>> 11 ^ b >>> 25 ^ b << 26 ^ b << 21 ^ b << 7) + (d ^ b & (c ^ d)) + 0x550c7dc3 | 0;\n a = a + e | 0;\n e = e + (f & g ^ h & (f ^ g)) + (f >>> 2 ^ f >>> 13 ^ f >>> 22 ^ f << 30 ^ f << 19 ^ f << 10) | 0;\n\n // 12\n d = w12 + d + (a >>> 6 ^ a >>> 11 ^ a >>> 25 ^ a << 26 ^ a << 21 ^ a << 7) + (c ^ a & (b ^ c)) + 0x72be5d74 | 0;\n h = h + d | 0;\n d = d + (e & f ^ g & (e ^ f)) + (e >>> 2 ^ e >>> 13 ^ e >>> 22 ^ e << 30 ^ e << 19 ^ e << 10) | 0;\n\n // 13\n c = w13 + c + (h >>> 6 ^ h >>> 11 ^ h >>> 25 ^ h << 26 ^ h << 21 ^ h << 7) + (b ^ h & (a ^ b)) + 0x80deb1fe | 0;\n g = g + c | 0;\n c = c + (d & e ^ f & (d ^ e)) + (d >>> 2 ^ d >>> 13 ^ d >>> 22 ^ d << 30 ^ d << 19 ^ d << 10) | 0;\n\n // 14\n b = w14 + b + (g >>> 6 ^ g >>> 11 ^ g >>> 25 ^ g << 26 ^ g << 21 ^ g << 7) + (a ^ g & (h ^ a)) + 0x9bdc06a7 | 0;\n f = f + b | 0;\n b = b + (c & d ^ e & (c ^ d)) + (c >>> 2 ^ c >>> 13 ^ c >>> 22 ^ c << 30 ^ c << 19 ^ c << 10) | 0;\n\n // 15\n a = w15 + a + (f >>> 6 ^ f >>> 11 ^ f >>> 25 ^ f << 26 ^ f << 21 ^ f << 7) + (h ^ f & (g ^ h)) + 0xc19bf174 | 0;\n e = e + a | 0;\n a = a + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0;\n\n // 16\n w0 = (w1 >>> 7 ^ w1 >>> 18 ^ w1 >>> 3 ^ w1 << 25 ^ w1 << 14) + (w14 >>> 17 ^ w14 >>> 19 ^ w14 >>> 10 ^ w14 << 15 ^ w14 << 13) + w0 + w9 | 0;\n h = w0 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xe49b69c1 | 0;\n d = d + h | 0;\n h = h + (a & b ^ c & (a ^ b)) + (a >>> 2 ^ a >>> 13 ^ a >>> 22 ^ a << 30 ^ a << 19 ^ a << 10) | 0;\n\n // 17\n w1 = (w2 >>> 7 ^ w2 >>> 18 ^ w2 >>> 3 ^ w2 << 25 ^ w2 << 14) + (w15 >>> 17 ^ w15 >>> 19 ^ w15 >>> 10 ^ w15 << 15 ^ w15 << 13) + w1 + w10 | 0;\n g = w1 + g + (d >>> 6 ^ d >>> 11 ^ d >>> 25 ^ d << 26 ^ d << 21 ^ d << 7) + (f ^ d & (e ^ f)) + 0xefbe4786 | 0;\n c = c + g | 0;\n g = g + (h & a ^ b & (h ^ a)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0;\n\n // 18\n w2 = (w3 >>> 7 ^ w3 >>> 18 ^ w3 >>> 3 ^ w3 << 25 ^ w3 << 14) + (w0 >>> 17 ^ w0 >>> 19 ^ w0 >>> 10 ^ w0 << 15 ^ w0 << 13) + w2 + w11 | 0;\n f = w2 + f + (c >>> 6 ^ c >>> 11 ^ c >>> 25 ^ c << 26 ^ c << 21 ^ c << 7) + (e ^ c & (d ^ e)) + 0x0fc19dc6 | 0;\n b = b + f | 0;\n f = f + (g & h ^ a & (g ^ h)) + (g >>> 2 ^ g >>> 13 ^ g >>> 22 ^ g << 30 ^ g << 19 ^ g << 10) | 0;\n\n // 19\n w3 = (w4 >>> 7 ^ w4 >>> 18 ^ w4 >>> 3 ^ w4 << 25 ^ w4 << 14) + (w1 >>> 17 ^ w1 >>> 19 ^ w1 >>> 10 ^ w1 << 15 ^ w1 << 13) + w3 + w12 | 0;\n e = w3 + e + (b >>> 6 ^ b >>> 11 ^ b >>> 25 ^ b << 26 ^ b << 21 ^ b << 7) + (d ^ b & (c ^ d)) + 0x240ca1cc | 0;\n a = a + e | 0;\n e = e + (f & g ^ h & (f ^ g)) + (f >>> 2 ^ f >>> 13 ^ f >>> 22 ^ f << 30 ^ f << 19 ^ f << 10) | 0;\n\n // 20\n w4 = (w5 >>> 7 ^ w5 >>> 18 ^ w5 >>> 3 ^ w5 << 25 ^ w5 << 14) + (w2 >>> 17 ^ w2 >>> 19 ^ w2 >>> 10 ^ w2 << 15 ^ w2 << 13) + w4 + w13 | 0;\n d = w4 + d + (a >>> 6 ^ a >>> 11 ^ a >>> 25 ^ a << 26 ^ a << 21 ^ a << 7) + (c ^ a & (b ^ c)) + 0x2de92c6f | 0;\n h = h + d | 0;\n d = d + (e & f ^ g & (e ^ f)) + (e >>> 2 ^ e >>> 13 ^ e >>> 22 ^ e << 30 ^ e << 19 ^ e << 10) | 0;\n\n // 21\n w5 = (w6 >>> 7 ^ w6 >>> 18 ^ w6 >>> 3 ^ w6 << 25 ^ w6 << 14) + (w3 >>> 17 ^ w3 >>> 19 ^ w3 >>> 10 ^ w3 << 15 ^ w3 << 13) + w5 + w14 | 0;\n c = w5 + c + (h >>> 6 ^ h >>> 11 ^ h >>> 25 ^ h << 26 ^ h << 21 ^ h << 7) + (b ^ h & (a ^ b)) + 0x4a7484aa | 0;\n g = g + c | 0;\n c = c + (d & e ^ f & (d ^ e)) + (d >>> 2 ^ d >>> 13 ^ d >>> 22 ^ d << 30 ^ d << 19 ^ d << 10) | 0;\n\n // 22\n w6 = (w7 >>> 7 ^ w7 >>> 18 ^ w7 >>> 3 ^ w7 << 25 ^ w7 << 14) + (w4 >>> 17 ^ w4 >>> 19 ^ w4 >>> 10 ^ w4 << 15 ^ w4 << 13) + w6 + w15 | 0;\n b = w6 + b + (g >>> 6 ^ g >>> 11 ^ g >>> 25 ^ g << 26 ^ g << 21 ^ g << 7) + (a ^ g & (h ^ a)) + 0x5cb0a9dc | 0;\n f = f + b | 0;\n b = b + (c & d ^ e & (c ^ d)) + (c >>> 2 ^ c >>> 13 ^ c >>> 22 ^ c << 30 ^ c << 19 ^ c << 10) | 0;\n\n // 23\n w7 = (w8 >>> 7 ^ w8 >>> 18 ^ w8 >>> 3 ^ w8 << 25 ^ w8 << 14) + (w5 >>> 17 ^ w5 >>> 19 ^ w5 >>> 10 ^ w5 << 15 ^ w5 << 13) + w7 + w0 | 0;\n a = w7 + a + (f >>> 6 ^ f >>> 11 ^ f >>> 25 ^ f << 26 ^ f << 21 ^ f << 7) + (h ^ f & (g ^ h)) + 0x76f988da | 0;\n e = e + a | 0;\n a = a + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0;\n\n // 24\n w8 = (w9 >>> 7 ^ w9 >>> 18 ^ w9 >>> 3 ^ w9 << 25 ^ w9 << 14) + (w6 >>> 17 ^ w6 >>> 19 ^ w6 >>> 10 ^ w6 << 15 ^ w6 << 13) + w8 + w1 | 0;\n h = w8 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x983e5152 | 0;\n d = d + h | 0;\n h = h + (a & b ^ c & (a ^ b)) + (a >>> 2 ^ a >>> 13 ^ a >>> 22 ^ a << 30 ^ a << 19 ^ a << 10) | 0;\n\n // 25\n w9 = (w10 >>> 7 ^ w10 >>> 18 ^ w10 >>> 3 ^ w10 << 25 ^ w10 << 14) + (w7 >>> 17 ^ w7 >>> 19 ^ w7 >>> 10 ^ w7 << 15 ^ w7 << 13) + w9 + w2 | 0;\n g = w9 + g + (d >>> 6 ^ d >>> 11 ^ d >>> 25 ^ d << 26 ^ d << 21 ^ d << 7) + (f ^ d & (e ^ f)) + 0xa831c66d | 0;\n c = c + g | 0;\n g = g + (h & a ^ b & (h ^ a)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0;\n\n // 26\n w10 = (w11 >>> 7 ^ w11 >>> 18 ^ w11 >>> 3 ^ w11 << 25 ^ w11 << 14) + (w8 >>> 17 ^ w8 >>> 19 ^ w8 >>> 10 ^ w8 << 15 ^ w8 << 13) + w10 + w3 | 0;\n f = w10 + f + (c >>> 6 ^ c >>> 11 ^ c >>> 25 ^ c << 26 ^ c << 21 ^ c << 7) + (e ^ c & (d ^ e)) + 0xb00327c8 | 0;\n b = b + f | 0;\n f = f + (g & h ^ a & (g ^ h)) + (g >>> 2 ^ g >>> 13 ^ g >>> 22 ^ g << 30 ^ g << 19 ^ g << 10) | 0;\n\n // 27\n w11 = (w12 >>> 7 ^ w12 >>> 18 ^ w12 >>> 3 ^ w12 << 25 ^ w12 << 14) + (w9 >>> 17 ^ w9 >>> 19 ^ w9 >>> 10 ^ w9 << 15 ^ w9 << 13) + w11 + w4 | 0;\n e = w11 + e + (b >>> 6 ^ b >>> 11 ^ b >>> 25 ^ b << 26 ^ b << 21 ^ b << 7) + (d ^ b & (c ^ d)) + 0xbf597fc7 | 0;\n a = a + e | 0;\n e = e + (f & g ^ h & (f ^ g)) + (f >>> 2 ^ f >>> 13 ^ f >>> 22 ^ f << 30 ^ f << 19 ^ f << 10) | 0;\n\n // 28\n w12 = (w13 >>> 7 ^ w13 >>> 18 ^ w13 >>> 3 ^ w13 << 25 ^ w13 << 14) + (w10 >>> 17 ^ w10 >>> 19 ^ w10 >>> 10 ^ w10 << 15 ^ w10 << 13) + w12 + w5 | 0;\n d = w12 + d + (a >>> 6 ^ a >>> 11 ^ a >>> 25 ^ a << 26 ^ a << 21 ^ a << 7) + (c ^ a & (b ^ c)) + 0xc6e00bf3 | 0;\n h = h + d | 0;\n d = d + (e & f ^ g & (e ^ f)) + (e >>> 2 ^ e >>> 13 ^ e >>> 22 ^ e << 30 ^ e << 19 ^ e << 10) | 0;\n\n // 29\n w13 = (w14 >>> 7 ^ w14 >>> 18 ^ w14 >>> 3 ^ w14 << 25 ^ w14 << 14) + (w11 >>> 17 ^ w11 >>> 19 ^ w11 >>> 10 ^ w11 << 15 ^ w11 << 13) + w13 + w6 | 0;\n c = w13 + c + (h >>> 6 ^ h >>> 11 ^ h >>> 25 ^ h << 26 ^ h << 21 ^ h << 7) + (b ^ h & (a ^ b)) + 0xd5a79147 | 0;\n g = g + c | 0;\n c = c + (d & e ^ f & (d ^ e)) + (d >>> 2 ^ d >>> 13 ^ d >>> 22 ^ d << 30 ^ d << 19 ^ d << 10) | 0;\n\n // 30\n w14 = (w15 >>> 7 ^ w15 >>> 18 ^ w15 >>> 3 ^ w15 << 25 ^ w15 << 14) + (w12 >>> 17 ^ w12 >>> 19 ^ w12 >>> 10 ^ w12 << 15 ^ w12 << 13) + w14 + w7 | 0;\n b = w14 + b + (g >>> 6 ^ g >>> 11 ^ g >>> 25 ^ g << 26 ^ g << 21 ^ g << 7) + (a ^ g & (h ^ a)) + 0x06ca6351 | 0;\n f = f + b | 0;\n b = b + (c & d ^ e & (c ^ d)) + (c >>> 2 ^ c >>> 13 ^ c >>> 22 ^ c << 30 ^ c << 19 ^ c << 10) | 0;\n\n // 31\n w15 = (w0 >>> 7 ^ w0 >>> 18 ^ w0 >>> 3 ^ w0 << 25 ^ w0 << 14) + (w13 >>> 17 ^ w13 >>> 19 ^ w13 >>> 10 ^ w13 << 15 ^ w13 << 13) + w15 + w8 | 0;\n a = w15 + a + (f >>> 6 ^ f >>> 11 ^ f >>> 25 ^ f << 26 ^ f << 21 ^ f << 7) + (h ^ f & (g ^ h)) + 0x14292967 | 0;\n e = e + a | 0;\n a = a + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0;\n\n // 32\n w0 = (w1 >>> 7 ^ w1 >>> 18 ^ w1 >>> 3 ^ w1 << 25 ^ w1 << 14) + (w14 >>> 17 ^ w14 >>> 19 ^ w14 >>> 10 ^ w14 << 15 ^ w14 << 13) + w0 + w9 | 0;\n h = w0 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x27b70a85 | 0;\n d = d + h | 0;\n h = h + (a & b ^ c & (a ^ b)) + (a >>> 2 ^ a >>> 13 ^ a >>> 22 ^ a << 30 ^ a << 19 ^ a << 10) | 0;\n\n // 33\n w1 = (w2 >>> 7 ^ w2 >>> 18 ^ w2 >>> 3 ^ w2 << 25 ^ w2 << 14) + (w15 >>> 17 ^ w15 >>> 19 ^ w15 >>> 10 ^ w15 << 15 ^ w15 << 13) + w1 + w10 | 0;\n g = w1 + g + (d >>> 6 ^ d >>> 11 ^ d >>> 25 ^ d << 26 ^ d << 21 ^ d << 7) + (f ^ d & (e ^ f)) + 0x2e1b2138 | 0;\n c = c + g | 0;\n g = g + (h & a ^ b & (h ^ a)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0;\n\n // 34\n w2 = (w3 >>> 7 ^ w3 >>> 18 ^ w3 >>> 3 ^ w3 << 25 ^ w3 << 14) + (w0 >>> 17 ^ w0 >>> 19 ^ w0 >>> 10 ^ w0 << 15 ^ w0 << 13) + w2 + w11 | 0;\n f = w2 + f + (c >>> 6 ^ c >>> 11 ^ c >>> 25 ^ c << 26 ^ c << 21 ^ c << 7) + (e ^ c & (d ^ e)) + 0x4d2c6dfc | 0;\n b = b + f | 0;\n f = f + (g & h ^ a & (g ^ h)) + (g >>> 2 ^ g >>> 13 ^ g >>> 22 ^ g << 30 ^ g << 19 ^ g << 10) | 0;\n\n // 35\n w3 = (w4 >>> 7 ^ w4 >>> 18 ^ w4 >>> 3 ^ w4 << 25 ^ w4 << 14) + (w1 >>> 17 ^ w1 >>> 19 ^ w1 >>> 10 ^ w1 << 15 ^ w1 << 13) + w3 + w12 | 0;\n e = w3 + e + (b >>> 6 ^ b >>> 11 ^ b >>> 25 ^ b << 26 ^ b << 21 ^ b << 7) + (d ^ b & (c ^ d)) + 0x53380d13 | 0;\n a = a + e | 0;\n e = e + (f & g ^ h & (f ^ g)) + (f >>> 2 ^ f >>> 13 ^ f >>> 22 ^ f << 30 ^ f << 19 ^ f << 10) | 0;\n\n // 36\n w4 = (w5 >>> 7 ^ w5 >>> 18 ^ w5 >>> 3 ^ w5 << 25 ^ w5 << 14) + (w2 >>> 17 ^ w2 >>> 19 ^ w2 >>> 10 ^ w2 << 15 ^ w2 << 13) + w4 + w13 | 0;\n d = w4 + d + (a >>> 6 ^ a >>> 11 ^ a >>> 25 ^ a << 26 ^ a << 21 ^ a << 7) + (c ^ a & (b ^ c)) + 0x650a7354 | 0;\n h = h + d | 0;\n d = d + (e & f ^ g & (e ^ f)) + (e >>> 2 ^ e >>> 13 ^ e >>> 22 ^ e << 30 ^ e << 19 ^ e << 10) | 0;\n\n // 37\n w5 = (w6 >>> 7 ^ w6 >>> 18 ^ w6 >>> 3 ^ w6 << 25 ^ w6 << 14) + (w3 >>> 17 ^ w3 >>> 19 ^ w3 >>> 10 ^ w3 << 15 ^ w3 << 13) + w5 + w14 | 0;\n c = w5 + c + (h >>> 6 ^ h >>> 11 ^ h >>> 25 ^ h << 26 ^ h << 21 ^ h << 7) + (b ^ h & (a ^ b)) + 0x766a0abb | 0;\n g = g + c | 0;\n c = c + (d & e ^ f & (d ^ e)) + (d >>> 2 ^ d >>> 13 ^ d >>> 22 ^ d << 30 ^ d << 19 ^ d << 10) | 0;\n\n // 38\n w6 = (w7 >>> 7 ^ w7 >>> 18 ^ w7 >>> 3 ^ w7 << 25 ^ w7 << 14) + (w4 >>> 17 ^ w4 >>> 19 ^ w4 >>> 10 ^ w4 << 15 ^ w4 << 13) + w6 + w15 | 0;\n b = w6 + b + (g >>> 6 ^ g >>> 11 ^ g >>> 25 ^ g << 26 ^ g << 21 ^ g << 7) + (a ^ g & (h ^ a)) + 0x81c2c92e | 0;\n f = f + b | 0;\n b = b + (c & d ^ e & (c ^ d)) + (c >>> 2 ^ c >>> 13 ^ c >>> 22 ^ c << 30 ^ c << 19 ^ c << 10) | 0;\n\n // 39\n w7 = (w8 >>> 7 ^ w8 >>> 18 ^ w8 >>> 3 ^ w8 << 25 ^ w8 << 14) + (w5 >>> 17 ^ w5 >>> 19 ^ w5 >>> 10 ^ w5 << 15 ^ w5 << 13) + w7 + w0 | 0;\n a = w7 + a + (f >>> 6 ^ f >>> 11 ^ f >>> 25 ^ f << 26 ^ f << 21 ^ f << 7) + (h ^ f & (g ^ h)) + 0x92722c85 | 0;\n e = e + a | 0;\n a = a + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0;\n\n // 40\n w8 = (w9 >>> 7 ^ w9 >>> 18 ^ w9 >>> 3 ^ w9 << 25 ^ w9 << 14) + (w6 >>> 17 ^ w6 >>> 19 ^ w6 >>> 10 ^ w6 << 15 ^ w6 << 13) + w8 + w1 | 0;\n h = w8 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xa2bfe8a1 | 0;\n d = d + h | 0;\n h = h + (a & b ^ c & (a ^ b)) + (a >>> 2 ^ a >>> 13 ^ a >>> 22 ^ a << 30 ^ a << 19 ^ a << 10) | 0;\n\n // 41\n w9 = (w10 >>> 7 ^ w10 >>> 18 ^ w10 >>> 3 ^ w10 << 25 ^ w10 << 14) + (w7 >>> 17 ^ w7 >>> 19 ^ w7 >>> 10 ^ w7 << 15 ^ w7 << 13) + w9 + w2 | 0;\n g = w9 + g + (d >>> 6 ^ d >>> 11 ^ d >>> 25 ^ d << 26 ^ d << 21 ^ d << 7) + (f ^ d & (e ^ f)) + 0xa81a664b | 0;\n c = c + g | 0;\n g = g + (h & a ^ b & (h ^ a)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0;\n\n // 42\n w10 = (w11 >>> 7 ^ w11 >>> 18 ^ w11 >>> 3 ^ w11 << 25 ^ w11 << 14) + (w8 >>> 17 ^ w8 >>> 19 ^ w8 >>> 10 ^ w8 << 15 ^ w8 << 13) + w10 + w3 | 0;\n f = w10 + f + (c >>> 6 ^ c >>> 11 ^ c >>> 25 ^ c << 26 ^ c << 21 ^ c << 7) + (e ^ c & (d ^ e)) + 0xc24b8b70 | 0;\n b = b + f | 0;\n f = f + (g & h ^ a & (g ^ h)) + (g >>> 2 ^ g >>> 13 ^ g >>> 22 ^ g << 30 ^ g << 19 ^ g << 10) | 0;\n\n // 43\n w11 = (w12 >>> 7 ^ w12 >>> 18 ^ w12 >>> 3 ^ w12 << 25 ^ w12 << 14) + (w9 >>> 17 ^ w9 >>> 19 ^ w9 >>> 10 ^ w9 << 15 ^ w9 << 13) + w11 + w4 | 0;\n e = w11 + e + (b >>> 6 ^ b >>> 11 ^ b >>> 25 ^ b << 26 ^ b << 21 ^ b << 7) + (d ^ b & (c ^ d)) + 0xc76c51a3 | 0;\n a = a + e | 0;\n e = e + (f & g ^ h & (f ^ g)) + (f >>> 2 ^ f >>> 13 ^ f >>> 22 ^ f << 30 ^ f << 19 ^ f << 10) | 0;\n\n // 44\n w12 = (w13 >>> 7 ^ w13 >>> 18 ^ w13 >>> 3 ^ w13 << 25 ^ w13 << 14) + (w10 >>> 17 ^ w10 >>> 19 ^ w10 >>> 10 ^ w10 << 15 ^ w10 << 13) + w12 + w5 | 0;\n d = w12 + d + (a >>> 6 ^ a >>> 11 ^ a >>> 25 ^ a << 26 ^ a << 21 ^ a << 7) + (c ^ a & (b ^ c)) + 0xd192e819 | 0;\n h = h + d | 0;\n d = d + (e & f ^ g & (e ^ f)) + (e >>> 2 ^ e >>> 13 ^ e >>> 22 ^ e << 30 ^ e << 19 ^ e << 10) | 0;\n\n // 45\n w13 = (w14 >>> 7 ^ w14 >>> 18 ^ w14 >>> 3 ^ w14 << 25 ^ w14 << 14) + (w11 >>> 17 ^ w11 >>> 19 ^ w11 >>> 10 ^ w11 << 15 ^ w11 << 13) + w13 + w6 | 0;\n c = w13 + c + (h >>> 6 ^ h >>> 11 ^ h >>> 25 ^ h << 26 ^ h << 21 ^ h << 7) + (b ^ h & (a ^ b)) + 0xd6990624 | 0;\n g = g + c | 0;\n c = c + (d & e ^ f & (d ^ e)) + (d >>> 2 ^ d >>> 13 ^ d >>> 22 ^ d << 30 ^ d << 19 ^ d << 10) | 0;\n\n // 46\n w14 = (w15 >>> 7 ^ w15 >>> 18 ^ w15 >>> 3 ^ w15 << 25 ^ w15 << 14) + (w12 >>> 17 ^ w12 >>> 19 ^ w12 >>> 10 ^ w12 << 15 ^ w12 << 13) + w14 + w7 | 0;\n b = w14 + b + (g >>> 6 ^ g >>> 11 ^ g >>> 25 ^ g << 26 ^ g << 21 ^ g << 7) + (a ^ g & (h ^ a)) + 0xf40e3585 | 0;\n f = f + b | 0;\n b = b + (c & d ^ e & (c ^ d)) + (c >>> 2 ^ c >>> 13 ^ c >>> 22 ^ c << 30 ^ c << 19 ^ c << 10) | 0;\n\n // 47\n w15 = (w0 >>> 7 ^ w0 >>> 18 ^ w0 >>> 3 ^ w0 << 25 ^ w0 << 14) + (w13 >>> 17 ^ w13 >>> 19 ^ w13 >>> 10 ^ w13 << 15 ^ w13 << 13) + w15 + w8 | 0;\n a = w15 + a + (f >>> 6 ^ f >>> 11 ^ f >>> 25 ^ f << 26 ^ f << 21 ^ f << 7) + (h ^ f & (g ^ h)) + 0x106aa070 | 0;\n e = e + a | 0;\n a = a + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0;\n\n // 48\n w0 = (w1 >>> 7 ^ w1 >>> 18 ^ w1 >>> 3 ^ w1 << 25 ^ w1 << 14) + (w14 >>> 17 ^ w14 >>> 19 ^ w14 >>> 10 ^ w14 << 15 ^ w14 << 13) + w0 + w9 | 0;\n h = w0 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x19a4c116 | 0;\n d = d + h | 0;\n h = h + (a & b ^ c & (a ^ b)) + (a >>> 2 ^ a >>> 13 ^ a >>> 22 ^ a << 30 ^ a << 19 ^ a << 10) | 0;\n\n // 49\n w1 = (w2 >>> 7 ^ w2 >>> 18 ^ w2 >>> 3 ^ w2 << 25 ^ w2 << 14) + (w15 >>> 17 ^ w15 >>> 19 ^ w15 >>> 10 ^ w15 << 15 ^ w15 << 13) + w1 + w10 | 0;\n g = w1 + g + (d >>> 6 ^ d >>> 11 ^ d >>> 25 ^ d << 26 ^ d << 21 ^ d << 7) + (f ^ d & (e ^ f)) + 0x1e376c08 | 0;\n c = c + g | 0;\n g = g + (h & a ^ b & (h ^ a)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0;\n\n // 50\n w2 = (w3 >>> 7 ^ w3 >>> 18 ^ w3 >>> 3 ^ w3 << 25 ^ w3 << 14) + (w0 >>> 17 ^ w0 >>> 19 ^ w0 >>> 10 ^ w0 << 15 ^ w0 << 13) + w2 + w11 | 0;\n f = w2 + f + (c >>> 6 ^ c >>> 11 ^ c >>> 25 ^ c << 26 ^ c << 21 ^ c << 7) + (e ^ c & (d ^ e)) + 0x2748774c | 0;\n b = b + f | 0;\n f = f + (g & h ^ a & (g ^ h)) + (g >>> 2 ^ g >>> 13 ^ g >>> 22 ^ g << 30 ^ g << 19 ^ g << 10) | 0;\n\n // 51\n w3 = (w4 >>> 7 ^ w4 >>> 18 ^ w4 >>> 3 ^ w4 << 25 ^ w4 << 14) + (w1 >>> 17 ^ w1 >>> 19 ^ w1 >>> 10 ^ w1 << 15 ^ w1 << 13) + w3 + w12 | 0;\n e = w3 + e + (b >>> 6 ^ b >>> 11 ^ b >>> 25 ^ b << 26 ^ b << 21 ^ b << 7) + (d ^ b & (c ^ d)) + 0x34b0bcb5 | 0;\n a = a + e | 0;\n e = e + (f & g ^ h & (f ^ g)) + (f >>> 2 ^ f >>> 13 ^ f >>> 22 ^ f << 30 ^ f << 19 ^ f << 10) | 0;\n\n // 52\n w4 = (w5 >>> 7 ^ w5 >>> 18 ^ w5 >>> 3 ^ w5 << 25 ^ w5 << 14) + (w2 >>> 17 ^ w2 >>> 19 ^ w2 >>> 10 ^ w2 << 15 ^ w2 << 13) + w4 + w13 | 0;\n d = w4 + d + (a >>> 6 ^ a >>> 11 ^ a >>> 25 ^ a << 26 ^ a << 21 ^ a << 7) + (c ^ a & (b ^ c)) + 0x391c0cb3 | 0;\n h = h + d | 0;\n d = d + (e & f ^ g & (e ^ f)) + (e >>> 2 ^ e >>> 13 ^ e >>> 22 ^ e << 30 ^ e << 19 ^ e << 10) | 0;\n\n // 53\n w5 = (w6 >>> 7 ^ w6 >>> 18 ^ w6 >>> 3 ^ w6 << 25 ^ w6 << 14) + (w3 >>> 17 ^ w3 >>> 19 ^ w3 >>> 10 ^ w3 << 15 ^ w3 << 13) + w5 + w14 | 0;\n c = w5 + c + (h >>> 6 ^ h >>> 11 ^ h >>> 25 ^ h << 26 ^ h << 21 ^ h << 7) + (b ^ h & (a ^ b)) + 0x4ed8aa4a | 0;\n g = g + c | 0;\n c = c + (d & e ^ f & (d ^ e)) + (d >>> 2 ^ d >>> 13 ^ d >>> 22 ^ d << 30 ^ d << 19 ^ d << 10) | 0;\n\n // 54\n w6 = (w7 >>> 7 ^ w7 >>> 18 ^ w7 >>> 3 ^ w7 << 25 ^ w7 << 14) + (w4 >>> 17 ^ w4 >>> 19 ^ w4 >>> 10 ^ w4 << 15 ^ w4 << 13) + w6 + w15 | 0;\n b = w6 + b + (g >>> 6 ^ g >>> 11 ^ g >>> 25 ^ g << 26 ^ g << 21 ^ g << 7) + (a ^ g & (h ^ a)) + 0x5b9cca4f | 0;\n f = f + b | 0;\n b = b + (c & d ^ e & (c ^ d)) + (c >>> 2 ^ c >>> 13 ^ c >>> 22 ^ c << 30 ^ c << 19 ^ c << 10) | 0;\n\n // 55\n w7 = (w8 >>> 7 ^ w8 >>> 18 ^ w8 >>> 3 ^ w8 << 25 ^ w8 << 14) + (w5 >>> 17 ^ w5 >>> 19 ^ w5 >>> 10 ^ w5 << 15 ^ w5 << 13) + w7 + w0 | 0;\n a = w7 + a + (f >>> 6 ^ f >>> 11 ^ f >>> 25 ^ f << 26 ^ f << 21 ^ f << 7) + (h ^ f & (g ^ h)) + 0x682e6ff3 | 0;\n e = e + a | 0;\n a = a + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0;\n\n // 56\n w8 = (w9 >>> 7 ^ w9 >>> 18 ^ w9 >>> 3 ^ w9 << 25 ^ w9 << 14) + (w6 >>> 17 ^ w6 >>> 19 ^ w6 >>> 10 ^ w6 << 15 ^ w6 << 13) + w8 + w1 | 0;\n h = w8 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x748f82ee | 0;\n d = d + h | 0;\n h = h + (a & b ^ c & (a ^ b)) + (a >>> 2 ^ a >>> 13 ^ a >>> 22 ^ a << 30 ^ a << 19 ^ a << 10) | 0;\n\n // 57\n w9 = (w10 >>> 7 ^ w10 >>> 18 ^ w10 >>> 3 ^ w10 << 25 ^ w10 << 14) + (w7 >>> 17 ^ w7 >>> 19 ^ w7 >>> 10 ^ w7 << 15 ^ w7 << 13) + w9 + w2 | 0;\n g = w9 + g + (d >>> 6 ^ d >>> 11 ^ d >>> 25 ^ d << 26 ^ d << 21 ^ d << 7) + (f ^ d & (e ^ f)) + 0x78a5636f | 0;\n c = c + g | 0;\n g = g + (h & a ^ b & (h ^ a)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0;\n\n // 58\n w10 = (w11 >>> 7 ^ w11 >>> 18 ^ w11 >>> 3 ^ w11 << 25 ^ w11 << 14) + (w8 >>> 17 ^ w8 >>> 19 ^ w8 >>> 10 ^ w8 << 15 ^ w8 << 13) + w10 + w3 | 0;\n f = w10 + f + (c >>> 6 ^ c >>> 11 ^ c >>> 25 ^ c << 26 ^ c << 21 ^ c << 7) + (e ^ c & (d ^ e)) + 0x84c87814 | 0;\n b = b + f | 0;\n f = f + (g & h ^ a & (g ^ h)) + (g >>> 2 ^ g >>> 13 ^ g >>> 22 ^ g << 30 ^ g << 19 ^ g << 10) | 0;\n\n // 59\n w11 = (w12 >>> 7 ^ w12 >>> 18 ^ w12 >>> 3 ^ w12 << 25 ^ w12 << 14) + (w9 >>> 17 ^ w9 >>> 19 ^ w9 >>> 10 ^ w9 << 15 ^ w9 << 13) + w11 + w4 | 0;\n e = w11 + e + (b >>> 6 ^ b >>> 11 ^ b >>> 25 ^ b << 26 ^ b << 21 ^ b << 7) + (d ^ b & (c ^ d)) + 0x8cc70208 | 0;\n a = a + e | 0;\n e = e + (f & g ^ h & (f ^ g)) + (f >>> 2 ^ f >>> 13 ^ f >>> 22 ^ f << 30 ^ f << 19 ^ f << 10) | 0;\n\n // 60\n w12 = (w13 >>> 7 ^ w13 >>> 18 ^ w13 >>> 3 ^ w13 << 25 ^ w13 << 14) + (w10 >>> 17 ^ w10 >>> 19 ^ w10 >>> 10 ^ w10 << 15 ^ w10 << 13) + w12 + w5 | 0;\n d = w12 + d + (a >>> 6 ^ a >>> 11 ^ a >>> 25 ^ a << 26 ^ a << 21 ^ a << 7) + (c ^ a & (b ^ c)) + 0x90befffa | 0;\n h = h + d | 0;\n d = d + (e & f ^ g & (e ^ f)) + (e >>> 2 ^ e >>> 13 ^ e >>> 22 ^ e << 30 ^ e << 19 ^ e << 10) | 0;\n\n // 61\n w13 = (w14 >>> 7 ^ w14 >>> 18 ^ w14 >>> 3 ^ w14 << 25 ^ w14 << 14) + (w11 >>> 17 ^ w11 >>> 19 ^ w11 >>> 10 ^ w11 << 15 ^ w11 << 13) + w13 + w6 | 0;\n c = w13 + c + (h >>> 6 ^ h >>> 11 ^ h >>> 25 ^ h << 26 ^ h << 21 ^ h << 7) + (b ^ h & (a ^ b)) + 0xa4506ceb | 0;\n g = g + c | 0;\n c = c + (d & e ^ f & (d ^ e)) + (d >>> 2 ^ d >>> 13 ^ d >>> 22 ^ d << 30 ^ d << 19 ^ d << 10) | 0;\n\n // 62\n w14 = (w15 >>> 7 ^ w15 >>> 18 ^ w15 >>> 3 ^ w15 << 25 ^ w15 << 14) + (w12 >>> 17 ^ w12 >>> 19 ^ w12 >>> 10 ^ w12 << 15 ^ w12 << 13) + w14 + w7 | 0;\n b = w14 + b + (g >>> 6 ^ g >>> 11 ^ g >>> 25 ^ g << 26 ^ g << 21 ^ g << 7) + (a ^ g & (h ^ a)) + 0xbef9a3f7 | 0;\n f = f + b | 0;\n b = b + (c & d ^ e & (c ^ d)) + (c >>> 2 ^ c >>> 13 ^ c >>> 22 ^ c << 30 ^ c << 19 ^ c << 10) | 0;\n\n // 63\n w15 = (w0 >>> 7 ^ w0 >>> 18 ^ w0 >>> 3 ^ w0 << 25 ^ w0 << 14) + (w13 >>> 17 ^ w13 >>> 19 ^ w13 >>> 10 ^ w13 << 15 ^ w13 << 13) + w15 + w8 | 0;\n a = w15 + a + (f >>> 6 ^ f >>> 11 ^ f >>> 25 ^ f << 26 ^ f << 21 ^ f << 7) + (h ^ f & (g ^ h)) + 0xc67178f2 | 0;\n e = e + a | 0;\n a = a + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0;\n\n H0 = H0 + a | 0;\n H1 = H1 + b | 0;\n H2 = H2 + c | 0;\n H3 = H3 + d | 0;\n H4 = H4 + e | 0;\n H5 = H5 + f | 0;\n H6 = H6 + g | 0;\n H7 = H7 + h | 0;\n }\n\n function _core_heap(offset) {\n offset = offset | 0;\n\n _core(HEAP[offset | 0] << 24 | HEAP[offset | 1] << 16 | HEAP[offset | 2] << 8 | HEAP[offset | 3], HEAP[offset | 4] << 24 | HEAP[offset | 5] << 16 | HEAP[offset | 6] << 8 | HEAP[offset | 7], HEAP[offset | 8] << 24 | HEAP[offset | 9] << 16 | HEAP[offset | 10] << 8 | HEAP[offset | 11], HEAP[offset | 12] << 24 | HEAP[offset | 13] << 16 | HEAP[offset | 14] << 8 | HEAP[offset | 15], HEAP[offset | 16] << 24 | HEAP[offset | 17] << 16 | HEAP[offset | 18] << 8 | HEAP[offset | 19], HEAP[offset | 20] << 24 | HEAP[offset | 21] << 16 | HEAP[offset | 22] << 8 | HEAP[offset | 23], HEAP[offset | 24] << 24 | HEAP[offset | 25] << 16 | HEAP[offset | 26] << 8 | HEAP[offset | 27], HEAP[offset | 28] << 24 | HEAP[offset | 29] << 16 | HEAP[offset | 30] << 8 | HEAP[offset | 31], HEAP[offset | 32] << 24 | HEAP[offset | 33] << 16 | HEAP[offset | 34] << 8 | HEAP[offset | 35], HEAP[offset | 36] << 24 | HEAP[offset | 37] << 16 | HEAP[offset | 38] << 8 | HEAP[offset | 39], HEAP[offset | 40] << 24 | HEAP[offset | 41] << 16 | HEAP[offset | 42] << 8 | HEAP[offset | 43], HEAP[offset | 44] << 24 | HEAP[offset | 45] << 16 | HEAP[offset | 46] << 8 | HEAP[offset | 47], HEAP[offset | 48] << 24 | HEAP[offset | 49] << 16 | HEAP[offset | 50] << 8 | HEAP[offset | 51], HEAP[offset | 52] << 24 | HEAP[offset | 53] << 16 | HEAP[offset | 54] << 8 | HEAP[offset | 55], HEAP[offset | 56] << 24 | HEAP[offset | 57] << 16 | HEAP[offset | 58] << 8 | HEAP[offset | 59], HEAP[offset | 60] << 24 | HEAP[offset | 61] << 16 | HEAP[offset | 62] << 8 | HEAP[offset | 63]);\n }\n\n // offset — multiple of 32\n function _state_to_heap(output) {\n output = output | 0;\n\n HEAP[output | 0] = H0 >>> 24;\n HEAP[output | 1] = H0 >>> 16 & 255;\n HEAP[output | 2] = H0 >>> 8 & 255;\n HEAP[output | 3] = H0 & 255;\n HEAP[output | 4] = H1 >>> 24;\n HEAP[output | 5] = H1 >>> 16 & 255;\n HEAP[output | 6] = H1 >>> 8 & 255;\n HEAP[output | 7] = H1 & 255;\n HEAP[output | 8] = H2 >>> 24;\n HEAP[output | 9] = H2 >>> 16 & 255;\n HEAP[output | 10] = H2 >>> 8 & 255;\n HEAP[output | 11] = H2 & 255;\n HEAP[output | 12] = H3 >>> 24;\n HEAP[output | 13] = H3 >>> 16 & 255;\n HEAP[output | 14] = H3 >>> 8 & 255;\n HEAP[output | 15] = H3 & 255;\n HEAP[output | 16] = H4 >>> 24;\n HEAP[output | 17] = H4 >>> 16 & 255;\n HEAP[output | 18] = H4 >>> 8 & 255;\n HEAP[output | 19] = H4 & 255;\n HEAP[output | 20] = H5 >>> 24;\n HEAP[output | 21] = H5 >>> 16 & 255;\n HEAP[output | 22] = H5 >>> 8 & 255;\n HEAP[output | 23] = H5 & 255;\n HEAP[output | 24] = H6 >>> 24;\n HEAP[output | 25] = H6 >>> 16 & 255;\n HEAP[output | 26] = H6 >>> 8 & 255;\n HEAP[output | 27] = H6 & 255;\n HEAP[output | 28] = H7 >>> 24;\n HEAP[output | 29] = H7 >>> 16 & 255;\n HEAP[output | 30] = H7 >>> 8 & 255;\n HEAP[output | 31] = H7 & 255;\n }\n\n function reset() {\n H0 = 0x6a09e667;\n H1 = 0xbb67ae85;\n H2 = 0x3c6ef372;\n H3 = 0xa54ff53a;\n H4 = 0x510e527f;\n H5 = 0x9b05688c;\n H6 = 0x1f83d9ab;\n H7 = 0x5be0cd19;\n TOTAL0 = TOTAL1 = 0;\n }\n\n function init(h0, h1, h2, h3, h4, h5, h6, h7, total0, total1) {\n h0 = h0 | 0;\n h1 = h1 | 0;\n h2 = h2 | 0;\n h3 = h3 | 0;\n h4 = h4 | 0;\n h5 = h5 | 0;\n h6 = h6 | 0;\n h7 = h7 | 0;\n total0 = total0 | 0;\n total1 = total1 | 0;\n\n H0 = h0;\n H1 = h1;\n H2 = h2;\n H3 = h3;\n H4 = h4;\n H5 = h5;\n H6 = h6;\n H7 = h7;\n TOTAL0 = total0;\n TOTAL1 = total1;\n }\n\n // offset — multiple of 64\n function process(offset, length) {\n offset = offset | 0;\n length = length | 0;\n\n var hashed = 0;\n\n if (offset & 63) return -1;\n\n while ((length | 0) >= 64) {\n _core_heap(offset);\n\n offset = offset + 64 | 0;\n length = length - 64 | 0;\n\n hashed = hashed + 64 | 0;\n }\n\n TOTAL0 = TOTAL0 + hashed | 0;\n if (TOTAL0 >>> 0 < hashed >>> 0) TOTAL1 = TOTAL1 + 1 | 0;\n\n return hashed | 0;\n }\n\n // offset — multiple of 64\n // output — multiple of 32\n function finish(offset, length, output) {\n offset = offset | 0;\n length = length | 0;\n output = output | 0;\n\n var hashed = 0,\n i = 0;\n\n if (offset & 63) return -1;\n\n if (~output) if (output & 31) return -1;\n\n if ((length | 0) >= 64) {\n hashed = process(offset, length) | 0;\n if ((hashed | 0) == -1) return -1;\n\n offset = offset + hashed | 0;\n length = length - hashed | 0;\n }\n\n hashed = hashed + length | 0;\n TOTAL0 = TOTAL0 + length | 0;\n if (TOTAL0 >>> 0 < length >>> 0) TOTAL1 = TOTAL1 + 1 | 0;\n\n HEAP[offset | length] = 0x80;\n\n if ((length | 0) >= 56) {\n for (i = length + 1 | 0; (i | 0) < 64; i = i + 1 | 0) {\n HEAP[offset | i] = 0x00;\n }_core_heap(offset);\n\n length = 0;\n\n HEAP[offset | 0] = 0;\n }\n\n for (i = length + 1 | 0; (i | 0) < 59; i = i + 1 | 0) {\n HEAP[offset | i] = 0;\n }HEAP[offset | 56] = TOTAL1 >>> 21 & 255;\n HEAP[offset | 57] = TOTAL1 >>> 13 & 255;\n HEAP[offset | 58] = TOTAL1 >>> 5 & 255;\n HEAP[offset | 59] = TOTAL1 << 3 & 255 | TOTAL0 >>> 29;\n HEAP[offset | 60] = TOTAL0 >>> 21 & 255;\n HEAP[offset | 61] = TOTAL0 >>> 13 & 255;\n HEAP[offset | 62] = TOTAL0 >>> 5 & 255;\n HEAP[offset | 63] = TOTAL0 << 3 & 255;\n _core_heap(offset);\n\n if (~output) _state_to_heap(output);\n\n return hashed | 0;\n }\n\n function hmac_reset() {\n H0 = I0;\n H1 = I1;\n H2 = I2;\n H3 = I3;\n H4 = I4;\n H5 = I5;\n H6 = I6;\n H7 = I7;\n TOTAL0 = 64;\n TOTAL1 = 0;\n }\n\n function _hmac_opad() {\n H0 = O0;\n H1 = O1;\n H2 = O2;\n H3 = O3;\n H4 = O4;\n H5 = O5;\n H6 = O6;\n H7 = O7;\n TOTAL0 = 64;\n TOTAL1 = 0;\n }\n\n function hmac_init(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) {\n p0 = p0 | 0;\n p1 = p1 | 0;\n p2 = p2 | 0;\n p3 = p3 | 0;\n p4 = p4 | 0;\n p5 = p5 | 0;\n p6 = p6 | 0;\n p7 = p7 | 0;\n p8 = p8 | 0;\n p9 = p9 | 0;\n p10 = p10 | 0;\n p11 = p11 | 0;\n p12 = p12 | 0;\n p13 = p13 | 0;\n p14 = p14 | 0;\n p15 = p15 | 0;\n\n // opad\n reset();\n _core(p0 ^ 0x5c5c5c5c, p1 ^ 0x5c5c5c5c, p2 ^ 0x5c5c5c5c, p3 ^ 0x5c5c5c5c, p4 ^ 0x5c5c5c5c, p5 ^ 0x5c5c5c5c, p6 ^ 0x5c5c5c5c, p7 ^ 0x5c5c5c5c, p8 ^ 0x5c5c5c5c, p9 ^ 0x5c5c5c5c, p10 ^ 0x5c5c5c5c, p11 ^ 0x5c5c5c5c, p12 ^ 0x5c5c5c5c, p13 ^ 0x5c5c5c5c, p14 ^ 0x5c5c5c5c, p15 ^ 0x5c5c5c5c);\n O0 = H0;\n O1 = H1;\n O2 = H2;\n O3 = H3;\n O4 = H4;\n O5 = H5;\n O6 = H6;\n O7 = H7;\n\n // ipad\n reset();\n _core(p0 ^ 0x36363636, p1 ^ 0x36363636, p2 ^ 0x36363636, p3 ^ 0x36363636, p4 ^ 0x36363636, p5 ^ 0x36363636, p6 ^ 0x36363636, p7 ^ 0x36363636, p8 ^ 0x36363636, p9 ^ 0x36363636, p10 ^ 0x36363636, p11 ^ 0x36363636, p12 ^ 0x36363636, p13 ^ 0x36363636, p14 ^ 0x36363636, p15 ^ 0x36363636);\n I0 = H0;\n I1 = H1;\n I2 = H2;\n I3 = H3;\n I4 = H4;\n I5 = H5;\n I6 = H6;\n I7 = H7;\n\n TOTAL0 = 64;\n TOTAL1 = 0;\n }\n\n // offset — multiple of 64\n // output — multiple of 32\n function hmac_finish(offset, length, output) {\n offset = offset | 0;\n length = length | 0;\n output = output | 0;\n\n var t0 = 0,\n t1 = 0,\n t2 = 0,\n t3 = 0,\n t4 = 0,\n t5 = 0,\n t6 = 0,\n t7 = 0,\n hashed = 0;\n\n if (offset & 63) return -1;\n\n if (~output) if (output & 31) return -1;\n\n hashed = finish(offset, length, -1) | 0;\n t0 = H0, t1 = H1, t2 = H2, t3 = H3, t4 = H4, t5 = H5, t6 = H6, t7 = H7;\n\n _hmac_opad();\n _core(t0, t1, t2, t3, t4, t5, t6, t7, 0x80000000, 0, 0, 0, 0, 0, 0, 768);\n\n if (~output) _state_to_heap(output);\n\n return hashed | 0;\n }\n\n // salt is assumed to be already processed\n // offset — multiple of 64\n // output — multiple of 32\n function pbkdf2_generate_block(offset, length, block, count, output) {\n offset = offset | 0;\n length = length | 0;\n block = block | 0;\n count = count | 0;\n output = output | 0;\n\n var h0 = 0,\n h1 = 0,\n h2 = 0,\n h3 = 0,\n h4 = 0,\n h5 = 0,\n h6 = 0,\n h7 = 0,\n t0 = 0,\n t1 = 0,\n t2 = 0,\n t3 = 0,\n t4 = 0,\n t5 = 0,\n t6 = 0,\n t7 = 0;\n\n if (offset & 63) return -1;\n\n if (~output) if (output & 31) return -1;\n\n // pad block number into heap\n // FIXME probable OOB write\n HEAP[offset + length | 0] = block >>> 24;\n HEAP[offset + length + 1 | 0] = block >>> 16 & 255;\n HEAP[offset + length + 2 | 0] = block >>> 8 & 255;\n HEAP[offset + length + 3 | 0] = block & 255;\n\n // finish first iteration\n hmac_finish(offset, length + 4 | 0, -1) | 0;\n h0 = t0 = H0, h1 = t1 = H1, h2 = t2 = H2, h3 = t3 = H3, h4 = t4 = H4, h5 = t5 = H5, h6 = t6 = H6, h7 = t7 = H7;\n count = count - 1 | 0;\n\n // perform the rest iterations\n while ((count | 0) > 0) {\n hmac_reset();\n _core(t0, t1, t2, t3, t4, t5, t6, t7, 0x80000000, 0, 0, 0, 0, 0, 0, 768);\n t0 = H0, t1 = H1, t2 = H2, t3 = H3, t4 = H4, t5 = H5, t6 = H6, t7 = H7;\n\n _hmac_opad();\n _core(t0, t1, t2, t3, t4, t5, t6, t7, 0x80000000, 0, 0, 0, 0, 0, 0, 768);\n t0 = H0, t1 = H1, t2 = H2, t3 = H3, t4 = H4, t5 = H5, t6 = H6, t7 = H7;\n\n h0 = h0 ^ H0;\n h1 = h1 ^ H1;\n h2 = h2 ^ H2;\n h3 = h3 ^ H3;\n h4 = h4 ^ H4;\n h5 = h5 ^ H5;\n h6 = h6 ^ H6;\n h7 = h7 ^ H7;\n\n count = count - 1 | 0;\n }\n\n H0 = h0;\n H1 = h1;\n H2 = h2;\n H3 = h3;\n H4 = h4;\n H5 = h5;\n H6 = h6;\n H7 = h7;\n\n if (~output) _state_to_heap(output);\n\n return 0;\n }\n\n return {\n // SHA256\n reset: reset,\n init: init,\n process: process,\n finish: finish,\n\n // HMAC-SHA256\n hmac_reset: hmac_reset,\n hmac_init: hmac_init,\n hmac_finish: hmac_finish,\n\n // PBKDF2-HMAC-SHA256\n pbkdf2_generate_block: pbkdf2_generate_block\n };\n}\n\n},{}],18:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports._sha256_hash_size = exports._sha256_block_size = undefined;\nexports.sha256_constructor = sha256_constructor;\nexports.get_sha256_instance = get_sha256_instance;\n\nvar _sha = _dereq_('./sha256.asm');\n\nvar _hash = _dereq_('../hash');\n\nvar _utils = _dereq_('../../utils');\n\nvar _sha256_block_size = exports._sha256_block_size = 64;\nvar _sha256_hash_size = exports._sha256_hash_size = 32;\n\nfunction sha256_constructor(options) {\n options = options || {};\n\n this.heap = (0, _utils._heap_init)(Uint8Array, options.heap);\n this.asm = options.asm || (0, _sha.sha256_asm)({ Uint8Array: Uint8Array }, null, this.heap.buffer);\n\n this.BLOCK_SIZE = _sha256_block_size;\n this.HASH_SIZE = _sha256_hash_size;\n\n this.reset();\n}\n\nsha256_constructor.BLOCK_SIZE = _sha256_block_size;\nsha256_constructor.HASH_SIZE = _sha256_hash_size;\nsha256_constructor.NAME = 'sha256';\n\nvar sha256_prototype = sha256_constructor.prototype;\nsha256_prototype.reset = _hash.hash_reset;\nsha256_prototype.process = _hash.hash_process;\nsha256_prototype.finish = _hash.hash_finish;\n\nvar sha256_instance = null;\n\nfunction get_sha256_instance() {\n if (sha256_instance === null) sha256_instance = new sha256_constructor({ heapSize: 0x100000 });\n return sha256_instance;\n}\n\n},{\"../../utils\":19,\"../hash\":15,\"./sha256.asm\":17}],19:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.string_to_bytes = string_to_bytes;\nexports.hex_to_bytes = hex_to_bytes;\nexports.base64_to_bytes = base64_to_bytes;\nexports.bytes_to_string = bytes_to_string;\nexports.bytes_to_hex = bytes_to_hex;\nexports.bytes_to_base64 = bytes_to_base64;\nexports.pow2_ceil = pow2_ceil;\nexports.is_number = is_number;\nexports.is_string = is_string;\nexports.is_buffer = is_buffer;\nexports.is_bytes = is_bytes;\nexports.is_typed_array = is_typed_array;\nexports._heap_init = _heap_init;\nexports._heap_write = _heap_write;\nvar FloatArray = exports.FloatArray = typeof Float64Array !== 'undefined' ? Float64Array : Float32Array; // make PhantomJS happy\n\n/**\n * @param {string} str\n * @param {boolean} [utf8]\n * @return {Uint8Array}\n */\nfunction string_to_bytes(str, utf8) {\n utf8 = !!utf8;\n\n var len = str.length,\n bytes = new Uint8Array(utf8 ? 4 * len : len);\n\n for (var i = 0, j = 0; i < len; i++) {\n var c = str.charCodeAt(i);\n\n if (utf8 && 0xd800 <= c && c <= 0xdbff) {\n if (++i >= len) throw new Error('Malformed string, low surrogate expected at position ' + i);\n c = (c ^ 0xd800) << 10 | 0x10000 | str.charCodeAt(i) ^ 0xdc00;\n } else if (!utf8 && c >>> 8) {\n throw new Error('Wide characters are not allowed.');\n }\n\n if (!utf8 || c <= 0x7f) {\n bytes[j++] = c;\n } else if (c <= 0x7ff) {\n bytes[j++] = 0xc0 | c >> 6;\n bytes[j++] = 0x80 | c & 0x3f;\n } else if (c <= 0xffff) {\n bytes[j++] = 0xe0 | c >> 12;\n bytes[j++] = 0x80 | c >> 6 & 0x3f;\n bytes[j++] = 0x80 | c & 0x3f;\n } else {\n bytes[j++] = 0xf0 | c >> 18;\n bytes[j++] = 0x80 | c >> 12 & 0x3f;\n bytes[j++] = 0x80 | c >> 6 & 0x3f;\n bytes[j++] = 0x80 | c & 0x3f;\n }\n }\n\n return bytes.subarray(0, j);\n}\n\nfunction hex_to_bytes(str) {\n var len = str.length;\n if (len & 1) {\n str = '0' + str;\n len++;\n }\n var bytes = new Uint8Array(len >> 1);\n for (var i = 0; i < len; i += 2) {\n bytes[i >> 1] = parseInt(str.substr(i, 2), 16);\n }\n return bytes;\n}\n\nfunction base64_to_bytes(str) {\n return string_to_bytes(atob(str));\n}\n\nfunction bytes_to_string(bytes, utf8) {\n utf8 = !!utf8;\n\n var len = bytes.length,\n chars = new Array(len);\n\n for (var i = 0, j = 0; i < len; i++) {\n var b = bytes[i];\n if (!utf8 || b < 128) {\n chars[j++] = b;\n } else if (b >= 192 && b < 224 && i + 1 < len) {\n chars[j++] = (b & 0x1f) << 6 | bytes[++i] & 0x3f;\n } else if (b >= 224 && b < 240 && i + 2 < len) {\n chars[j++] = (b & 0xf) << 12 | (bytes[++i] & 0x3f) << 6 | bytes[++i] & 0x3f;\n } else if (b >= 240 && b < 248 && i + 3 < len) {\n var c = (b & 7) << 18 | (bytes[++i] & 0x3f) << 12 | (bytes[++i] & 0x3f) << 6 | bytes[++i] & 0x3f;\n if (c <= 0xffff) {\n chars[j++] = c;\n } else {\n c ^= 0x10000;\n chars[j++] = 0xd800 | c >> 10;\n chars[j++] = 0xdc00 | c & 0x3ff;\n }\n } else {\n throw new Error('Malformed UTF8 character at byte offset ' + i);\n }\n }\n\n var str = '',\n bs = 16384;\n for (var i = 0; i < j; i += bs) {\n str += String.fromCharCode.apply(String, chars.slice(i, i + bs <= j ? i + bs : j));\n }\n\n return str;\n}\n\nfunction bytes_to_hex(arr) {\n var str = '';\n for (var i = 0; i < arr.length; i++) {\n var h = (arr[i] & 0xff).toString(16);\n if (h.length < 2) str += '0';\n str += h;\n }\n return str;\n}\n\nfunction bytes_to_base64(arr) {\n return btoa(bytes_to_string(arr));\n}\n\nfunction pow2_ceil(a) {\n a -= 1;\n a |= a >>> 1;\n a |= a >>> 2;\n a |= a >>> 4;\n a |= a >>> 8;\n a |= a >>> 16;\n a += 1;\n return a;\n}\n\nfunction is_number(a) {\n return typeof a === 'number';\n}\n\nfunction is_string(a) {\n return typeof a === 'string';\n}\n\nfunction is_buffer(a) {\n return a instanceof ArrayBuffer;\n}\n\nfunction is_bytes(a) {\n return a instanceof Uint8Array;\n}\n\nfunction is_typed_array(a) {\n return a instanceof Int8Array || a instanceof Uint8Array || a instanceof Int16Array || a instanceof Uint16Array || a instanceof Int32Array || a instanceof Uint32Array || a instanceof Float32Array || a instanceof Float64Array;\n}\n\nfunction _heap_init(constructor, heap, heapSize) {\n var size = heap ? heap.byteLength : heapSize || 65536;\n\n if (size & 0xfff || size <= 0) throw new Error('heap size must be a positive integer and a multiple of 4096');\n\n heap = heap || new constructor(new ArrayBuffer(size));\n\n return heap;\n}\n\nfunction _heap_write(heap, hpos, data, dpos, dlen) {\n var hlen = heap.length - hpos,\n wlen = hlen < dlen ? hlen : dlen;\n\n heap.set(data.subarray(dpos, dpos + wlen), hpos);\n\n return wlen;\n}\n\n},{}],20:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/array/from\"), __esModule: true };\n},{\"core-js/library/fn/array/from\":56}],21:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/get-iterator\"), __esModule: true };\n},{\"core-js/library/fn/get-iterator\":57}],22:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/is-iterable\"), __esModule: true };\n},{\"core-js/library/fn/is-iterable\":58}],23:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/json/stringify\"), __esModule: true };\n},{\"core-js/library/fn/json/stringify\":59}],24:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/object/assign\"), __esModule: true };\n},{\"core-js/library/fn/object/assign\":60}],25:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/object/create\"), __esModule: true };\n},{\"core-js/library/fn/object/create\":61}],26:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/object/define-property\"), __esModule: true };\n},{\"core-js/library/fn/object/define-property\":62}],27:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/object/entries\"), __esModule: true };\n},{\"core-js/library/fn/object/entries\":63}],28:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/object/freeze\"), __esModule: true };\n},{\"core-js/library/fn/object/freeze\":64}],29:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/object/get-prototype-of\"), __esModule: true };\n},{\"core-js/library/fn/object/get-prototype-of\":65}],30:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/object/set-prototype-of\"), __esModule: true };\n},{\"core-js/library/fn/object/set-prototype-of\":66}],31:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/object/values\"), __esModule: true };\n},{\"core-js/library/fn/object/values\":67}],32:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/promise\"), __esModule: true };\n},{\"core-js/library/fn/promise\":68}],33:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/symbol\"), __esModule: true };\n},{\"core-js/library/fn/symbol\":69}],34:[function(_dereq_,module,exports){\nmodule.exports = { \"default\": _dereq_(\"core-js/library/fn/symbol/iterator\"), __esModule: true };\n},{\"core-js/library/fn/symbol/iterator\":70}],35:[function(_dereq_,module,exports){\n\"use strict\";\n\nexports.__esModule = true;\n\nvar _promise = _dereq_(\"../core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (fn) {\n return function () {\n var gen = fn.apply(this, arguments);\n return new _promise2.default(function (resolve, reject) {\n function step(key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n return _promise2.default.resolve(value).then(function (value) {\n step(\"next\", value);\n }, function (err) {\n step(\"throw\", err);\n });\n }\n }\n\n return step(\"next\");\n });\n };\n};\n},{\"../core-js/promise\":32}],36:[function(_dereq_,module,exports){\n\"use strict\";\n\nexports.__esModule = true;\n\nexports.default = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n},{}],37:[function(_dereq_,module,exports){\n\"use strict\";\n\nexports.__esModule = true;\n\nvar _defineProperty = _dereq_(\"../core-js/object/define-property\");\n\nvar _defineProperty2 = _interopRequireDefault(_defineProperty);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n (0, _defineProperty2.default)(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n},{\"../core-js/object/define-property\":26}],38:[function(_dereq_,module,exports){\n\"use strict\";\n\nexports.__esModule = true;\n\nvar _setPrototypeOf = _dereq_(\"../core-js/object/set-prototype-of\");\n\nvar _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);\n\nvar _create = _dereq_(\"../core-js/object/create\");\n\nvar _create2 = _interopRequireDefault(_create);\n\nvar _typeof2 = _dereq_(\"../helpers/typeof\");\n\nvar _typeof3 = _interopRequireDefault(_typeof2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : (0, _typeof3.default)(superClass)));\n }\n\n subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass;\n};\n},{\"../core-js/object/create\":25,\"../core-js/object/set-prototype-of\":30,\"../helpers/typeof\":41}],39:[function(_dereq_,module,exports){\n\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof2 = _dereq_(\"../helpers/typeof\");\n\nvar _typeof3 = _interopRequireDefault(_typeof2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && ((typeof call === \"undefined\" ? \"undefined\" : (0, _typeof3.default)(call)) === \"object\" || typeof call === \"function\") ? call : self;\n};\n},{\"../helpers/typeof\":41}],40:[function(_dereq_,module,exports){\n\"use strict\";\n\nexports.__esModule = true;\n\nvar _isIterable2 = _dereq_(\"../core-js/is-iterable\");\n\nvar _isIterable3 = _interopRequireDefault(_isIterable2);\n\nvar _getIterator2 = _dereq_(\"../core-js/get-iterator\");\n\nvar _getIterator3 = _interopRequireDefault(_getIterator2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function () {\n function sliceIterator(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = (0, _getIterator3.default)(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"]) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if ((0, _isIterable3.default)(Object(arr))) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n };\n}();\n},{\"../core-js/get-iterator\":21,\"../core-js/is-iterable\":22}],41:[function(_dereq_,module,exports){\n\"use strict\";\n\nexports.__esModule = true;\n\nvar _iterator = _dereq_(\"../core-js/symbol/iterator\");\n\nvar _iterator2 = _interopRequireDefault(_iterator);\n\nvar _symbol = _dereq_(\"../core-js/symbol\");\n\nvar _symbol2 = _interopRequireDefault(_symbol);\n\nvar _typeof = typeof _symbol2.default === \"function\" && typeof _iterator2.default === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj; };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = typeof _symbol2.default === \"function\" && _typeof(_iterator2.default) === \"symbol\" ? function (obj) {\n return typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n} : function (obj) {\n return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n};\n},{\"../core-js/symbol\":33,\"../core-js/symbol/iterator\":34}],42:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"regenerator-runtime\");\n\n},{\"regenerator-runtime\":318}],43:[function(_dereq_,module,exports){\n'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction placeHoldersCount (b64) {\n var len = b64.length\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // the number of equal signs (place holders)\n // if there are two placeholders, than the two characters before it\n // represent one byte\n // if there is only one, then the three characters before it represent 2 bytes\n // this is just a cheap hack to not do indexOf twice\n return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0\n}\n\nfunction byteLength (b64) {\n // base64 is 4/3 + up to two characters of the original data\n return (b64.length * 3 / 4) - placeHoldersCount(b64)\n}\n\nfunction toByteArray (b64) {\n var i, l, tmp, placeHolders, arr\n var len = b64.length\n placeHolders = placeHoldersCount(b64)\n\n arr = new Arr((len * 3 / 4) - placeHolders)\n\n // if there are placeholders, only get up to the last complete 4 chars\n l = placeHolders > 0 ? len - 4 : len\n\n var L = 0\n\n for (i = 0; i < l; i += 4) {\n tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]\n arr[L++] = (tmp >> 16) & 0xFF\n arr[L++] = (tmp >> 8) & 0xFF\n arr[L++] = tmp & 0xFF\n }\n\n if (placeHolders === 2) {\n tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[L++] = tmp & 0xFF\n } else if (placeHolders === 1) {\n tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[L++] = (tmp >> 8) & 0xFF\n arr[L++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var output = ''\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n output += lookup[tmp >> 2]\n output += lookup[(tmp << 4) & 0x3F]\n output += '=='\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + (uint8[len - 1])\n output += lookup[tmp >> 10]\n output += lookup[(tmp >> 4) & 0x3F]\n output += lookup[(tmp << 2) & 0x3F]\n output += '='\n }\n\n parts.push(output)\n\n return parts.join('')\n}\n\n},{}],44:[function(_dereq_,module,exports){\n(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n Buffer = _dereq_('buffer').Buffer;\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n }\n\n if (base === 16) {\n this._parseHex(number, start);\n } else {\n this._parseBase(number, base, start);\n }\n\n if (number[0] === '-') {\n this.negative = 1;\n }\n\n this.strip();\n\n if (endian !== 'le') return;\n\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [ number & 0x3ffffff ];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [ 0 ];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this.strip();\n };\n\n function parseHex (str, start, end) {\n var r = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r <<= 4;\n\n // 'a' - 'f'\n if (c >= 49 && c <= 54) {\n r |= c - 49 + 0xa;\n\n // 'A' - 'F'\n } else if (c >= 17 && c <= 22) {\n r |= c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n r |= c & 0xf;\n }\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n // Scan 24-bit chunks and add them to the number\n var off = 0;\n for (i = number.length - 6, j = 0; i >= start; i -= 6) {\n w = parseHex(number, i, i + 6);\n this.words[j] |= (w << off) & 0x3ffffff;\n // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb\n this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n if (i + 6 !== start) {\n w = parseHex(number, start, i + 6);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;\n }\n this.strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n r += c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n r += c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n r += c;\n }\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [ 0 ];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype.strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n BN.prototype.inspect = function inspect () {\n return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n };\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16);\n };\n\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n assert(typeof Buffer !== 'undefined');\n return this.toArrayLike(Buffer, endian, length);\n };\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n this.strip();\n var littleEndian = endian === 'le';\n var res = new ArrayType(reqLength);\n\n var b, i;\n var q = this.clone();\n if (!littleEndian) {\n // Assume big-endian\n for (i = 0; i < reqLength - byteLength; i++) {\n res[i] = 0;\n }\n\n for (i = 0; !q.isZero(); i++) {\n b = q.andln(0xff);\n q.iushrn(8);\n\n res[reqLength - i - 1] = b;\n }\n } else {\n for (i = 0; !q.isZero(); i++) {\n b = q.andln(0xff);\n q.iushrn(8);\n\n res[i] = b;\n }\n\n for (; i < reqLength; i++) {\n res[i] = 0;\n }\n }\n\n return res;\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] & (1 << wbit)) >>> wbit;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this.strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this.strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this.strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this.strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this.strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this.strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out.strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out.strip();\n }\n\n function jumboMulTo (self, num, out) {\n var fftm = new FFTM();\n return fftm.mulp(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out.strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n\n return this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this.strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this.strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n return this.strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) < num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this.strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this.strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this.strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q.strip();\n }\n a.strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modn = function modn (num) {\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return acc;\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n return this.strip();\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this.strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n r.strip();\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n return a.umod(this.m)._forceRed(this);\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1).toRed(this);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n\n},{\"buffer\":46}],45:[function(_dereq_,module,exports){\nvar r;\n\nmodule.exports = function rand(len) {\n if (!r)\n r = new Rand(null);\n\n return r.generate(len);\n};\n\nfunction Rand(rand) {\n this.rand = rand;\n}\nmodule.exports.Rand = Rand;\n\nRand.prototype.generate = function generate(len) {\n return this._rand(len);\n};\n\n// Emulate crypto API using randy\nRand.prototype._rand = function _rand(n) {\n if (this.rand.getBytes)\n return this.rand.getBytes(n);\n\n var res = new Uint8Array(n);\n for (var i = 0; i < res.length; i++)\n res[i] = this.rand.getByte();\n return res;\n};\n\nif (typeof self === 'object') {\n if (self.crypto && self.crypto.getRandomValues) {\n // Modern browsers\n Rand.prototype._rand = function _rand(n) {\n var arr = new Uint8Array(n);\n self.crypto.getRandomValues(arr);\n return arr;\n };\n } else if (self.msCrypto && self.msCrypto.getRandomValues) {\n // IE\n Rand.prototype._rand = function _rand(n) {\n var arr = new Uint8Array(n);\n self.msCrypto.getRandomValues(arr);\n return arr;\n };\n\n // Safari's WebWorkers do not have `crypto`\n } else if (typeof window === 'object') {\n // Old junk\n Rand.prototype._rand = function() {\n throw new Error('Not implemented yet');\n };\n }\n} else {\n // Node.js or Web worker with no crypto support\n try {\n var crypto = _dereq_('crypto');\n if (typeof crypto.randomBytes !== 'function')\n throw new Error('Not supported');\n\n Rand.prototype._rand = function _rand(n) {\n return crypto.randomBytes(n);\n };\n } catch (e) {\n }\n}\n\n},{\"crypto\":\"crypto\"}],46:[function(_dereq_,module,exports){\n\n},{}],47:[function(_dereq_,module,exports){\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = _dereq_('base64-js')\nvar ieee754 = _dereq_('ieee754')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nvar K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('Invalid typed array length')\n }\n // Return an augmented `Uint8Array` instance\n var buf = new Uint8Array(length)\n buf.__proto__ = Buffer.prototype\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\n// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\nif (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true,\n enumerable: false,\n writable: false\n })\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (isArrayBuffer(value)) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n return fromObject(value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nBuffer.prototype.__proto__ = Uint8Array.prototype\nBuffer.__proto__ = Uint8Array\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n var buf = createBuffer(length)\n\n var actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n var buf = createBuffer(length)\n for (var i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n var buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n buf.__proto__ = Buffer.prototype\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n var buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj) {\n if (isArrayBufferView(obj) || 'length' in obj) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (isArrayBufferView(string) || isArrayBuffer(string)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n newBuf.__proto__ = Buffer.prototype\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n var limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n var limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : new Buffer(val, encoding)\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffers from another context (i.e. an iframe) do not pass the `instanceof` check\n// but they should be treated as valid. See: https://github.com/feross/buffer/issues/166\nfunction isArrayBuffer (obj) {\n return obj instanceof ArrayBuffer ||\n (obj != null && obj.constructor != null && obj.constructor.name === 'ArrayBuffer' &&\n typeof obj.byteLength === 'number')\n}\n\n// Node 0.10 supports `ArrayBuffer` but lacks `ArrayBuffer.isView`\nfunction isArrayBufferView (obj) {\n return (typeof ArrayBuffer.isView === 'function') && ArrayBuffer.isView(obj)\n}\n\nfunction numberIsNaN (obj) {\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n},{\"base64-js\":43,\"ieee754\":297}],48:[function(_dereq_,module,exports){\n_dereq_('../../modules/es6.array.fill');\nmodule.exports = _dereq_('../../modules/_core').Array.fill;\n\n},{\"../../modules/_core\":180,\"../../modules/es6.array.fill\":251}],49:[function(_dereq_,module,exports){\n_dereq_('../../modules/es6.array.find');\nmodule.exports = _dereq_('../../modules/_core').Array.find;\n\n},{\"../../modules/_core\":180,\"../../modules/es6.array.find\":252}],50:[function(_dereq_,module,exports){\n_dereq_('../../modules/es6.string.iterator');\n_dereq_('../../modules/es6.array.from');\nmodule.exports = _dereq_('../../modules/_core').Array.from;\n\n},{\"../../modules/_core\":180,\"../../modules/es6.array.from\":253,\"../../modules/es6.string.iterator\":258}],51:[function(_dereq_,module,exports){\n_dereq_('../../modules/es6.object.assign');\nmodule.exports = _dereq_('../../modules/_core').Object.assign;\n\n},{\"../../modules/_core\":180,\"../../modules/es6.object.assign\":255}],52:[function(_dereq_,module,exports){\n_dereq_('../modules/es6.object.to-string');\n_dereq_('../modules/es6.string.iterator');\n_dereq_('../modules/web.dom.iterable');\n_dereq_('../modules/es6.promise');\n_dereq_('../modules/es7.promise.finally');\n_dereq_('../modules/es7.promise.try');\nmodule.exports = _dereq_('../modules/_core').Promise;\n\n},{\"../modules/_core\":180,\"../modules/es6.object.to-string\":256,\"../modules/es6.promise\":257,\"../modules/es6.string.iterator\":258,\"../modules/es7.promise.finally\":262,\"../modules/es7.promise.try\":263,\"../modules/web.dom.iterable\":266}],53:[function(_dereq_,module,exports){\n_dereq_('../../modules/es6.string.repeat');\nmodule.exports = _dereq_('../../modules/_core').String.repeat;\n\n},{\"../../modules/_core\":180,\"../../modules/es6.string.repeat\":259}],54:[function(_dereq_,module,exports){\n_dereq_('../../modules/es6.symbol');\n_dereq_('../../modules/es6.object.to-string');\n_dereq_('../../modules/es7.symbol.async-iterator');\n_dereq_('../../modules/es7.symbol.observable');\nmodule.exports = _dereq_('../../modules/_core').Symbol;\n\n},{\"../../modules/_core\":180,\"../../modules/es6.object.to-string\":256,\"../../modules/es6.symbol\":260,\"../../modules/es7.symbol.async-iterator\":264,\"../../modules/es7.symbol.observable\":265}],55:[function(_dereq_,module,exports){\n_dereq_('../../modules/es6.typed.uint8-array');\nmodule.exports = _dereq_('../../modules/_core').Uint8Array;\n\n},{\"../../modules/_core\":180,\"../../modules/es6.typed.uint8-array\":261}],56:[function(_dereq_,module,exports){\narguments[4][50][0].apply(exports,arguments)\n},{\"../../modules/_core\":78,\"../../modules/es6.array.from\":149,\"../../modules/es6.string.iterator\":159,\"dup\":50}],57:[function(_dereq_,module,exports){\n_dereq_('../modules/web.dom.iterable');\n_dereq_('../modules/es6.string.iterator');\nmodule.exports = _dereq_('../modules/core.get-iterator');\n\n},{\"../modules/core.get-iterator\":147,\"../modules/es6.string.iterator\":159,\"../modules/web.dom.iterable\":167}],58:[function(_dereq_,module,exports){\n_dereq_('../modules/web.dom.iterable');\n_dereq_('../modules/es6.string.iterator');\nmodule.exports = _dereq_('../modules/core.is-iterable');\n\n},{\"../modules/core.is-iterable\":148,\"../modules/es6.string.iterator\":159,\"../modules/web.dom.iterable\":167}],59:[function(_dereq_,module,exports){\nvar core = _dereq_('../../modules/_core');\nvar $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });\nmodule.exports = function stringify(it) { // eslint-disable-line no-unused-vars\n return $JSON.stringify.apply($JSON, arguments);\n};\n\n},{\"../../modules/_core\":78}],60:[function(_dereq_,module,exports){\narguments[4][51][0].apply(exports,arguments)\n},{\"../../modules/_core\":78,\"../../modules/es6.object.assign\":151,\"dup\":51}],61:[function(_dereq_,module,exports){\n_dereq_('../../modules/es6.object.create');\nvar $Object = _dereq_('../../modules/_core').Object;\nmodule.exports = function create(P, D) {\n return $Object.create(P, D);\n};\n\n},{\"../../modules/_core\":78,\"../../modules/es6.object.create\":152}],62:[function(_dereq_,module,exports){\n_dereq_('../../modules/es6.object.define-property');\nvar $Object = _dereq_('../../modules/_core').Object;\nmodule.exports = function defineProperty(it, key, desc) {\n return $Object.defineProperty(it, key, desc);\n};\n\n},{\"../../modules/_core\":78,\"../../modules/es6.object.define-property\":153}],63:[function(_dereq_,module,exports){\n_dereq_('../../modules/es7.object.entries');\nmodule.exports = _dereq_('../../modules/_core').Object.entries;\n\n},{\"../../modules/_core\":78,\"../../modules/es7.object.entries\":161}],64:[function(_dereq_,module,exports){\n_dereq_('../../modules/es6.object.freeze');\nmodule.exports = _dereq_('../../modules/_core').Object.freeze;\n\n},{\"../../modules/_core\":78,\"../../modules/es6.object.freeze\":154}],65:[function(_dereq_,module,exports){\n_dereq_('../../modules/es6.object.get-prototype-of');\nmodule.exports = _dereq_('../../modules/_core').Object.getPrototypeOf;\n\n},{\"../../modules/_core\":78,\"../../modules/es6.object.get-prototype-of\":155}],66:[function(_dereq_,module,exports){\n_dereq_('../../modules/es6.object.set-prototype-of');\nmodule.exports = _dereq_('../../modules/_core').Object.setPrototypeOf;\n\n},{\"../../modules/_core\":78,\"../../modules/es6.object.set-prototype-of\":156}],67:[function(_dereq_,module,exports){\n_dereq_('../../modules/es7.object.values');\nmodule.exports = _dereq_('../../modules/_core').Object.values;\n\n},{\"../../modules/_core\":78,\"../../modules/es7.object.values\":162}],68:[function(_dereq_,module,exports){\narguments[4][52][0].apply(exports,arguments)\n},{\"../modules/_core\":78,\"../modules/es6.object.to-string\":157,\"../modules/es6.promise\":158,\"../modules/es6.string.iterator\":159,\"../modules/es7.promise.finally\":163,\"../modules/es7.promise.try\":164,\"../modules/web.dom.iterable\":167,\"dup\":52}],69:[function(_dereq_,module,exports){\narguments[4][54][0].apply(exports,arguments)\n},{\"../../modules/_core\":78,\"../../modules/es6.object.to-string\":157,\"../../modules/es6.symbol\":160,\"../../modules/es7.symbol.async-iterator\":165,\"../../modules/es7.symbol.observable\":166,\"dup\":54}],70:[function(_dereq_,module,exports){\n_dereq_('../../modules/es6.string.iterator');\n_dereq_('../../modules/web.dom.iterable');\nmodule.exports = _dereq_('../../modules/_wks-ext').f('iterator');\n\n},{\"../../modules/_wks-ext\":144,\"../../modules/es6.string.iterator\":159,\"../../modules/web.dom.iterable\":167}],71:[function(_dereq_,module,exports){\nmodule.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n\n},{}],72:[function(_dereq_,module,exports){\nmodule.exports = function () { /* empty */ };\n\n},{}],73:[function(_dereq_,module,exports){\nmodule.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n\n},{}],74:[function(_dereq_,module,exports){\nvar isObject = _dereq_('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n\n},{\"./_is-object\":98}],75:[function(_dereq_,module,exports){\n// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = _dereq_('./_to-iobject');\nvar toLength = _dereq_('./_to-length');\nvar toAbsoluteIndex = _dereq_('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\n},{\"./_to-absolute-index\":136,\"./_to-iobject\":138,\"./_to-length\":139}],76:[function(_dereq_,module,exports){\n// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = _dereq_('./_cof');\nvar TAG = _dereq_('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n},{\"./_cof\":77,\"./_wks\":145}],77:[function(_dereq_,module,exports){\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n\n},{}],78:[function(_dereq_,module,exports){\nvar core = module.exports = { version: '2.5.3' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n},{}],79:[function(_dereq_,module,exports){\n'use strict';\nvar $defineProperty = _dereq_('./_object-dp');\nvar createDesc = _dereq_('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n\n},{\"./_object-dp\":111,\"./_property-desc\":125}],80:[function(_dereq_,module,exports){\n// optional / simple context binding\nvar aFunction = _dereq_('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n\n},{\"./_a-function\":71}],81:[function(_dereq_,module,exports){\n// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n},{}],82:[function(_dereq_,module,exports){\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !_dereq_('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\n},{\"./_fails\":87}],83:[function(_dereq_,module,exports){\nvar isObject = _dereq_('./_is-object');\nvar document = _dereq_('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n\n},{\"./_global\":89,\"./_is-object\":98}],84:[function(_dereq_,module,exports){\n// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n},{}],85:[function(_dereq_,module,exports){\n// all enumerable object keys, includes symbols\nvar getKeys = _dereq_('./_object-keys');\nvar gOPS = _dereq_('./_object-gops');\nvar pIE = _dereq_('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n\n},{\"./_object-gops\":116,\"./_object-keys\":119,\"./_object-pie\":120}],86:[function(_dereq_,module,exports){\nvar global = _dereq_('./_global');\nvar core = _dereq_('./_core');\nvar ctx = _dereq_('./_ctx');\nvar hide = _dereq_('./_hide');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var IS_WRAP = type & $export.W;\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE];\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];\n var key, own, out;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n if (own && key in exports) continue;\n // export native or passed\n out = own ? target[key] : source[key];\n // prevent global pollution for namespaces\n exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n // bind timers to global for call from export context\n : IS_BIND && own ? ctx(out, global)\n // wrap global constructors for prevent change them in library\n : IS_WRAP && target[key] == out ? (function (C) {\n var F = function (a, b, c) {\n if (this instanceof C) {\n switch (arguments.length) {\n case 0: return new C();\n case 1: return new C(a);\n case 2: return new C(a, b);\n } return new C(a, b, c);\n } return C.apply(this, arguments);\n };\n F[PROTOTYPE] = C[PROTOTYPE];\n return F;\n // make static versions for prototype methods\n })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n if (IS_PROTO) {\n (exports.virtual || (exports.virtual = {}))[key] = out;\n // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);\n }\n }\n};\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n\n},{\"./_core\":78,\"./_ctx\":80,\"./_global\":89,\"./_hide\":91}],87:[function(_dereq_,module,exports){\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n\n},{}],88:[function(_dereq_,module,exports){\nvar ctx = _dereq_('./_ctx');\nvar call = _dereq_('./_iter-call');\nvar isArrayIter = _dereq_('./_is-array-iter');\nvar anObject = _dereq_('./_an-object');\nvar toLength = _dereq_('./_to-length');\nvar getIterFn = _dereq_('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n\n},{\"./_an-object\":74,\"./_ctx\":80,\"./_is-array-iter\":96,\"./_iter-call\":99,\"./_to-length\":139,\"./core.get-iterator-method\":146}],89:[function(_dereq_,module,exports){\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n},{}],90:[function(_dereq_,module,exports){\nvar hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n\n},{}],91:[function(_dereq_,module,exports){\nvar dP = _dereq_('./_object-dp');\nvar createDesc = _dereq_('./_property-desc');\nmodule.exports = _dereq_('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n\n},{\"./_descriptors\":82,\"./_object-dp\":111,\"./_property-desc\":125}],92:[function(_dereq_,module,exports){\nvar document = _dereq_('./_global').document;\nmodule.exports = document && document.documentElement;\n\n},{\"./_global\":89}],93:[function(_dereq_,module,exports){\nmodule.exports = !_dereq_('./_descriptors') && !_dereq_('./_fails')(function () {\n return Object.defineProperty(_dereq_('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n},{\"./_descriptors\":82,\"./_dom-create\":83,\"./_fails\":87}],94:[function(_dereq_,module,exports){\n// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n\n},{}],95:[function(_dereq_,module,exports){\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = _dereq_('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n},{\"./_cof\":77}],96:[function(_dereq_,module,exports){\n// check on default Array iterator\nvar Iterators = _dereq_('./_iterators');\nvar ITERATOR = _dereq_('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n\n},{\"./_iterators\":104,\"./_wks\":145}],97:[function(_dereq_,module,exports){\n// 7.2.2 IsArray(argument)\nvar cof = _dereq_('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n\n},{\"./_cof\":77}],98:[function(_dereq_,module,exports){\nmodule.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n},{}],99:[function(_dereq_,module,exports){\n// call something on iterator step with safe closing on error\nvar anObject = _dereq_('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n\n},{\"./_an-object\":74}],100:[function(_dereq_,module,exports){\n'use strict';\nvar create = _dereq_('./_object-create');\nvar descriptor = _dereq_('./_property-desc');\nvar setToStringTag = _dereq_('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n_dereq_('./_hide')(IteratorPrototype, _dereq_('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n},{\"./_hide\":91,\"./_object-create\":110,\"./_property-desc\":125,\"./_set-to-string-tag\":130,\"./_wks\":145}],101:[function(_dereq_,module,exports){\n'use strict';\nvar LIBRARY = _dereq_('./_library');\nvar $export = _dereq_('./_export');\nvar redefine = _dereq_('./_redefine');\nvar hide = _dereq_('./_hide');\nvar has = _dereq_('./_has');\nvar Iterators = _dereq_('./_iterators');\nvar $iterCreate = _dereq_('./_iter-create');\nvar setToStringTag = _dereq_('./_set-to-string-tag');\nvar getPrototypeOf = _dereq_('./_object-gpo');\nvar ITERATOR = _dereq_('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = (!BUGGY && $native) || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n\n},{\"./_export\":86,\"./_has\":90,\"./_hide\":91,\"./_iter-create\":100,\"./_iterators\":104,\"./_library\":105,\"./_object-gpo\":117,\"./_redefine\":127,\"./_set-to-string-tag\":130,\"./_wks\":145}],102:[function(_dereq_,module,exports){\nvar ITERATOR = _dereq_('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n\n},{\"./_wks\":145}],103:[function(_dereq_,module,exports){\nmodule.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n\n},{}],104:[function(_dereq_,module,exports){\nmodule.exports = {};\n\n},{}],105:[function(_dereq_,module,exports){\nmodule.exports = true;\n\n},{}],106:[function(_dereq_,module,exports){\nvar META = _dereq_('./_uid')('meta');\nvar isObject = _dereq_('./_is-object');\nvar has = _dereq_('./_has');\nvar setDesc = _dereq_('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !_dereq_('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n\n},{\"./_fails\":87,\"./_has\":90,\"./_is-object\":98,\"./_object-dp\":111,\"./_uid\":142}],107:[function(_dereq_,module,exports){\nvar global = _dereq_('./_global');\nvar macrotask = _dereq_('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = _dereq_('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n var promise = Promise.resolve();\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n\n},{\"./_cof\":77,\"./_global\":89,\"./_task\":135}],108:[function(_dereq_,module,exports){\n'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = _dereq_('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n\n},{\"./_a-function\":71}],109:[function(_dereq_,module,exports){\n'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = _dereq_('./_object-keys');\nvar gOPS = _dereq_('./_object-gops');\nvar pIE = _dereq_('./_object-pie');\nvar toObject = _dereq_('./_to-object');\nvar IObject = _dereq_('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || _dereq_('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n\n},{\"./_fails\":87,\"./_iobject\":95,\"./_object-gops\":116,\"./_object-keys\":119,\"./_object-pie\":120,\"./_to-object\":140}],110:[function(_dereq_,module,exports){\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = _dereq_('./_an-object');\nvar dPs = _dereq_('./_object-dps');\nvar enumBugKeys = _dereq_('./_enum-bug-keys');\nvar IE_PROTO = _dereq_('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = _dereq_('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n _dereq_('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n\n},{\"./_an-object\":74,\"./_dom-create\":83,\"./_enum-bug-keys\":84,\"./_html\":92,\"./_object-dps\":112,\"./_shared-key\":131}],111:[function(_dereq_,module,exports){\nvar anObject = _dereq_('./_an-object');\nvar IE8_DOM_DEFINE = _dereq_('./_ie8-dom-define');\nvar toPrimitive = _dereq_('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = _dereq_('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n\n},{\"./_an-object\":74,\"./_descriptors\":82,\"./_ie8-dom-define\":93,\"./_to-primitive\":141}],112:[function(_dereq_,module,exports){\nvar dP = _dereq_('./_object-dp');\nvar anObject = _dereq_('./_an-object');\nvar getKeys = _dereq_('./_object-keys');\n\nmodule.exports = _dereq_('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n\n},{\"./_an-object\":74,\"./_descriptors\":82,\"./_object-dp\":111,\"./_object-keys\":119}],113:[function(_dereq_,module,exports){\nvar pIE = _dereq_('./_object-pie');\nvar createDesc = _dereq_('./_property-desc');\nvar toIObject = _dereq_('./_to-iobject');\nvar toPrimitive = _dereq_('./_to-primitive');\nvar has = _dereq_('./_has');\nvar IE8_DOM_DEFINE = _dereq_('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = _dereq_('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n\n},{\"./_descriptors\":82,\"./_has\":90,\"./_ie8-dom-define\":93,\"./_object-pie\":120,\"./_property-desc\":125,\"./_to-iobject\":138,\"./_to-primitive\":141}],114:[function(_dereq_,module,exports){\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = _dereq_('./_to-iobject');\nvar gOPN = _dereq_('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n\n},{\"./_object-gopn\":115,\"./_to-iobject\":138}],115:[function(_dereq_,module,exports){\n// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = _dereq_('./_object-keys-internal');\nvar hiddenKeys = _dereq_('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n\n},{\"./_enum-bug-keys\":84,\"./_object-keys-internal\":118}],116:[function(_dereq_,module,exports){\nexports.f = Object.getOwnPropertySymbols;\n\n},{}],117:[function(_dereq_,module,exports){\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = _dereq_('./_has');\nvar toObject = _dereq_('./_to-object');\nvar IE_PROTO = _dereq_('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n\n},{\"./_has\":90,\"./_shared-key\":131,\"./_to-object\":140}],118:[function(_dereq_,module,exports){\nvar has = _dereq_('./_has');\nvar toIObject = _dereq_('./_to-iobject');\nvar arrayIndexOf = _dereq_('./_array-includes')(false);\nvar IE_PROTO = _dereq_('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n\n},{\"./_array-includes\":75,\"./_has\":90,\"./_shared-key\":131,\"./_to-iobject\":138}],119:[function(_dereq_,module,exports){\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = _dereq_('./_object-keys-internal');\nvar enumBugKeys = _dereq_('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n\n},{\"./_enum-bug-keys\":84,\"./_object-keys-internal\":118}],120:[function(_dereq_,module,exports){\nexports.f = {}.propertyIsEnumerable;\n\n},{}],121:[function(_dereq_,module,exports){\n// most Object methods by ES6 should accept primitives\nvar $export = _dereq_('./_export');\nvar core = _dereq_('./_core');\nvar fails = _dereq_('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n\n},{\"./_core\":78,\"./_export\":86,\"./_fails\":87}],122:[function(_dereq_,module,exports){\nvar getKeys = _dereq_('./_object-keys');\nvar toIObject = _dereq_('./_to-iobject');\nvar isEnum = _dereq_('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n\n},{\"./_object-keys\":119,\"./_object-pie\":120,\"./_to-iobject\":138}],123:[function(_dereq_,module,exports){\nmodule.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n\n},{}],124:[function(_dereq_,module,exports){\nvar anObject = _dereq_('./_an-object');\nvar isObject = _dereq_('./_is-object');\nvar newPromiseCapability = _dereq_('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n\n},{\"./_an-object\":74,\"./_is-object\":98,\"./_new-promise-capability\":108}],125:[function(_dereq_,module,exports){\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\n},{}],126:[function(_dereq_,module,exports){\nvar hide = _dereq_('./_hide');\nmodule.exports = function (target, src, safe) {\n for (var key in src) {\n if (safe && target[key]) target[key] = src[key];\n else hide(target, key, src[key]);\n } return target;\n};\n\n},{\"./_hide\":91}],127:[function(_dereq_,module,exports){\nmodule.exports = _dereq_('./_hide');\n\n},{\"./_hide\":91}],128:[function(_dereq_,module,exports){\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = _dereq_('./_is-object');\nvar anObject = _dereq_('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = _dereq_('./_ctx')(Function.call, _dereq_('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n\n},{\"./_an-object\":74,\"./_ctx\":80,\"./_is-object\":98,\"./_object-gopd\":113}],129:[function(_dereq_,module,exports){\n'use strict';\nvar global = _dereq_('./_global');\nvar core = _dereq_('./_core');\nvar dP = _dereq_('./_object-dp');\nvar DESCRIPTORS = _dereq_('./_descriptors');\nvar SPECIES = _dereq_('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n\n},{\"./_core\":78,\"./_descriptors\":82,\"./_global\":89,\"./_object-dp\":111,\"./_wks\":145}],130:[function(_dereq_,module,exports){\nvar def = _dereq_('./_object-dp').f;\nvar has = _dereq_('./_has');\nvar TAG = _dereq_('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\n},{\"./_has\":90,\"./_object-dp\":111,\"./_wks\":145}],131:[function(_dereq_,module,exports){\nvar shared = _dereq_('./_shared')('keys');\nvar uid = _dereq_('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n\n},{\"./_shared\":132,\"./_uid\":142}],132:[function(_dereq_,module,exports){\nvar global = _dereq_('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n return store[key] || (store[key] = {});\n};\n\n},{\"./_global\":89}],133:[function(_dereq_,module,exports){\n// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = _dereq_('./_an-object');\nvar aFunction = _dereq_('./_a-function');\nvar SPECIES = _dereq_('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n\n},{\"./_a-function\":71,\"./_an-object\":74,\"./_wks\":145}],134:[function(_dereq_,module,exports){\nvar toInteger = _dereq_('./_to-integer');\nvar defined = _dereq_('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n\n},{\"./_defined\":81,\"./_to-integer\":137}],135:[function(_dereq_,module,exports){\nvar ctx = _dereq_('./_ctx');\nvar invoke = _dereq_('./_invoke');\nvar html = _dereq_('./_html');\nvar cel = _dereq_('./_dom-create');\nvar global = _dereq_('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (_dereq_('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n\n},{\"./_cof\":77,\"./_ctx\":80,\"./_dom-create\":83,\"./_global\":89,\"./_html\":92,\"./_invoke\":94}],136:[function(_dereq_,module,exports){\nvar toInteger = _dereq_('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n},{\"./_to-integer\":137}],137:[function(_dereq_,module,exports){\n// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n},{}],138:[function(_dereq_,module,exports){\n// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = _dereq_('./_iobject');\nvar defined = _dereq_('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n\n},{\"./_defined\":81,\"./_iobject\":95}],139:[function(_dereq_,module,exports){\n// 7.1.15 ToLength\nvar toInteger = _dereq_('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n},{\"./_to-integer\":137}],140:[function(_dereq_,module,exports){\n// 7.1.13 ToObject(argument)\nvar defined = _dereq_('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n\n},{\"./_defined\":81}],141:[function(_dereq_,module,exports){\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = _dereq_('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n\n},{\"./_is-object\":98}],142:[function(_dereq_,module,exports){\nvar id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n},{}],143:[function(_dereq_,module,exports){\nvar global = _dereq_('./_global');\nvar core = _dereq_('./_core');\nvar LIBRARY = _dereq_('./_library');\nvar wksExt = _dereq_('./_wks-ext');\nvar defineProperty = _dereq_('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n\n},{\"./_core\":78,\"./_global\":89,\"./_library\":105,\"./_object-dp\":111,\"./_wks-ext\":144}],144:[function(_dereq_,module,exports){\nexports.f = _dereq_('./_wks');\n\n},{\"./_wks\":145}],145:[function(_dereq_,module,exports){\nvar store = _dereq_('./_shared')('wks');\nvar uid = _dereq_('./_uid');\nvar Symbol = _dereq_('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n},{\"./_global\":89,\"./_shared\":132,\"./_uid\":142}],146:[function(_dereq_,module,exports){\nvar classof = _dereq_('./_classof');\nvar ITERATOR = _dereq_('./_wks')('iterator');\nvar Iterators = _dereq_('./_iterators');\nmodule.exports = _dereq_('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n\n},{\"./_classof\":76,\"./_core\":78,\"./_iterators\":104,\"./_wks\":145}],147:[function(_dereq_,module,exports){\nvar anObject = _dereq_('./_an-object');\nvar get = _dereq_('./core.get-iterator-method');\nmodule.exports = _dereq_('./_core').getIterator = function (it) {\n var iterFn = get(it);\n if (typeof iterFn != 'function') throw TypeError(it + ' is not iterable!');\n return anObject(iterFn.call(it));\n};\n\n},{\"./_an-object\":74,\"./_core\":78,\"./core.get-iterator-method\":146}],148:[function(_dereq_,module,exports){\nvar classof = _dereq_('./_classof');\nvar ITERATOR = _dereq_('./_wks')('iterator');\nvar Iterators = _dereq_('./_iterators');\nmodule.exports = _dereq_('./_core').isIterable = function (it) {\n var O = Object(it);\n return O[ITERATOR] !== undefined\n || '@@iterator' in O\n // eslint-disable-next-line no-prototype-builtins\n || Iterators.hasOwnProperty(classof(O));\n};\n\n},{\"./_classof\":76,\"./_core\":78,\"./_iterators\":104,\"./_wks\":145}],149:[function(_dereq_,module,exports){\n'use strict';\nvar ctx = _dereq_('./_ctx');\nvar $export = _dereq_('./_export');\nvar toObject = _dereq_('./_to-object');\nvar call = _dereq_('./_iter-call');\nvar isArrayIter = _dereq_('./_is-array-iter');\nvar toLength = _dereq_('./_to-length');\nvar createProperty = _dereq_('./_create-property');\nvar getIterFn = _dereq_('./core.get-iterator-method');\n\n$export($export.S + $export.F * !_dereq_('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n\n},{\"./_create-property\":79,\"./_ctx\":80,\"./_export\":86,\"./_is-array-iter\":96,\"./_iter-call\":99,\"./_iter-detect\":102,\"./_to-length\":139,\"./_to-object\":140,\"./core.get-iterator-method\":146}],150:[function(_dereq_,module,exports){\n'use strict';\nvar addToUnscopables = _dereq_('./_add-to-unscopables');\nvar step = _dereq_('./_iter-step');\nvar Iterators = _dereq_('./_iterators');\nvar toIObject = _dereq_('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = _dereq_('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n},{\"./_add-to-unscopables\":72,\"./_iter-define\":101,\"./_iter-step\":103,\"./_iterators\":104,\"./_to-iobject\":138}],151:[function(_dereq_,module,exports){\n// 19.1.3.1 Object.assign(target, source)\nvar $export = _dereq_('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: _dereq_('./_object-assign') });\n\n},{\"./_export\":86,\"./_object-assign\":109}],152:[function(_dereq_,module,exports){\nvar $export = _dereq_('./_export');\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n$export($export.S, 'Object', { create: _dereq_('./_object-create') });\n\n},{\"./_export\":86,\"./_object-create\":110}],153:[function(_dereq_,module,exports){\nvar $export = _dereq_('./_export');\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !_dereq_('./_descriptors'), 'Object', { defineProperty: _dereq_('./_object-dp').f });\n\n},{\"./_descriptors\":82,\"./_export\":86,\"./_object-dp\":111}],154:[function(_dereq_,module,exports){\n// 19.1.2.5 Object.freeze(O)\nvar isObject = _dereq_('./_is-object');\nvar meta = _dereq_('./_meta').onFreeze;\n\n_dereq_('./_object-sap')('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n\n},{\"./_is-object\":98,\"./_meta\":106,\"./_object-sap\":121}],155:[function(_dereq_,module,exports){\n// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = _dereq_('./_to-object');\nvar $getPrototypeOf = _dereq_('./_object-gpo');\n\n_dereq_('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n\n},{\"./_object-gpo\":117,\"./_object-sap\":121,\"./_to-object\":140}],156:[function(_dereq_,module,exports){\n// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = _dereq_('./_export');\n$export($export.S, 'Object', { setPrototypeOf: _dereq_('./_set-proto').set });\n\n},{\"./_export\":86,\"./_set-proto\":128}],157:[function(_dereq_,module,exports){\narguments[4][46][0].apply(exports,arguments)\n},{\"dup\":46}],158:[function(_dereq_,module,exports){\n'use strict';\nvar LIBRARY = _dereq_('./_library');\nvar global = _dereq_('./_global');\nvar ctx = _dereq_('./_ctx');\nvar classof = _dereq_('./_classof');\nvar $export = _dereq_('./_export');\nvar isObject = _dereq_('./_is-object');\nvar aFunction = _dereq_('./_a-function');\nvar anInstance = _dereq_('./_an-instance');\nvar forOf = _dereq_('./_for-of');\nvar speciesConstructor = _dereq_('./_species-constructor');\nvar task = _dereq_('./_task').set;\nvar microtask = _dereq_('./_microtask')();\nvar newPromiseCapabilityModule = _dereq_('./_new-promise-capability');\nvar perform = _dereq_('./_perform');\nvar promiseResolve = _dereq_('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[_dereq_('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value);\n if (domain) domain.exit();\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = _dereq_('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\n_dereq_('./_set-to-string-tag')($Promise, PROMISE);\n_dereq_('./_set-species')(PROMISE);\nWrapper = _dereq_('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && _dereq_('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n\n},{\"./_a-function\":71,\"./_an-instance\":73,\"./_classof\":76,\"./_core\":78,\"./_ctx\":80,\"./_export\":86,\"./_for-of\":88,\"./_global\":89,\"./_is-object\":98,\"./_iter-detect\":102,\"./_library\":105,\"./_microtask\":107,\"./_new-promise-capability\":108,\"./_perform\":123,\"./_promise-resolve\":124,\"./_redefine-all\":126,\"./_set-species\":129,\"./_set-to-string-tag\":130,\"./_species-constructor\":133,\"./_task\":135,\"./_wks\":145}],159:[function(_dereq_,module,exports){\n'use strict';\nvar $at = _dereq_('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\n_dereq_('./_iter-define')(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n\n},{\"./_iter-define\":101,\"./_string-at\":134}],160:[function(_dereq_,module,exports){\n'use strict';\n// ECMAScript 6 symbols shim\nvar global = _dereq_('./_global');\nvar has = _dereq_('./_has');\nvar DESCRIPTORS = _dereq_('./_descriptors');\nvar $export = _dereq_('./_export');\nvar redefine = _dereq_('./_redefine');\nvar META = _dereq_('./_meta').KEY;\nvar $fails = _dereq_('./_fails');\nvar shared = _dereq_('./_shared');\nvar setToStringTag = _dereq_('./_set-to-string-tag');\nvar uid = _dereq_('./_uid');\nvar wks = _dereq_('./_wks');\nvar wksExt = _dereq_('./_wks-ext');\nvar wksDefine = _dereq_('./_wks-define');\nvar enumKeys = _dereq_('./_enum-keys');\nvar isArray = _dereq_('./_is-array');\nvar anObject = _dereq_('./_an-object');\nvar isObject = _dereq_('./_is-object');\nvar toIObject = _dereq_('./_to-iobject');\nvar toPrimitive = _dereq_('./_to-primitive');\nvar createDesc = _dereq_('./_property-desc');\nvar _create = _dereq_('./_object-create');\nvar gOPNExt = _dereq_('./_object-gopn-ext');\nvar $GOPD = _dereq_('./_object-gopd');\nvar $DP = _dereq_('./_object-dp');\nvar $keys = _dereq_('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n _dereq_('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n _dereq_('./_object-pie').f = $propertyIsEnumerable;\n _dereq_('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !_dereq_('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || _dereq_('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n\n},{\"./_an-object\":74,\"./_descriptors\":82,\"./_enum-keys\":85,\"./_export\":86,\"./_fails\":87,\"./_global\":89,\"./_has\":90,\"./_hide\":91,\"./_is-array\":97,\"./_is-object\":98,\"./_library\":105,\"./_meta\":106,\"./_object-create\":110,\"./_object-dp\":111,\"./_object-gopd\":113,\"./_object-gopn\":115,\"./_object-gopn-ext\":114,\"./_object-gops\":116,\"./_object-keys\":119,\"./_object-pie\":120,\"./_property-desc\":125,\"./_redefine\":127,\"./_set-to-string-tag\":130,\"./_shared\":132,\"./_to-iobject\":138,\"./_to-primitive\":141,\"./_uid\":142,\"./_wks\":145,\"./_wks-define\":143,\"./_wks-ext\":144}],161:[function(_dereq_,module,exports){\n// https://github.com/tc39/proposal-object-values-entries\nvar $export = _dereq_('./_export');\nvar $entries = _dereq_('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n\n},{\"./_export\":86,\"./_object-to-array\":122}],162:[function(_dereq_,module,exports){\n// https://github.com/tc39/proposal-object-values-entries\nvar $export = _dereq_('./_export');\nvar $values = _dereq_('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n\n},{\"./_export\":86,\"./_object-to-array\":122}],163:[function(_dereq_,module,exports){\n// https://github.com/tc39/proposal-promise-finally\n'use strict';\nvar $export = _dereq_('./_export');\nvar core = _dereq_('./_core');\nvar global = _dereq_('./_global');\nvar speciesConstructor = _dereq_('./_species-constructor');\nvar promiseResolve = _dereq_('./_promise-resolve');\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n var C = speciesConstructor(this, core.Promise || global.Promise);\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n} });\n\n},{\"./_core\":78,\"./_export\":86,\"./_global\":89,\"./_promise-resolve\":124,\"./_species-constructor\":133}],164:[function(_dereq_,module,exports){\n'use strict';\n// https://github.com/tc39/proposal-promise-try\nvar $export = _dereq_('./_export');\nvar newPromiseCapability = _dereq_('./_new-promise-capability');\nvar perform = _dereq_('./_perform');\n\n$export($export.S, 'Promise', { 'try': function (callbackfn) {\n var promiseCapability = newPromiseCapability.f(this);\n var result = perform(callbackfn);\n (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);\n return promiseCapability.promise;\n} });\n\n},{\"./_export\":86,\"./_new-promise-capability\":108,\"./_perform\":123}],165:[function(_dereq_,module,exports){\n_dereq_('./_wks-define')('asyncIterator');\n\n},{\"./_wks-define\":143}],166:[function(_dereq_,module,exports){\n_dereq_('./_wks-define')('observable');\n\n},{\"./_wks-define\":143}],167:[function(_dereq_,module,exports){\n_dereq_('./es6.array.iterator');\nvar global = _dereq_('./_global');\nvar hide = _dereq_('./_hide');\nvar Iterators = _dereq_('./_iterators');\nvar TO_STRING_TAG = _dereq_('./_wks')('toStringTag');\n\nvar DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +\n 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +\n 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +\n 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +\n 'TextTrackList,TouchList').split(',');\n\nfor (var i = 0; i < DOMIterables.length; i++) {\n var NAME = DOMIterables[i];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = Iterators.Array;\n}\n\n},{\"./_global\":89,\"./_hide\":91,\"./_iterators\":104,\"./_wks\":145,\"./es6.array.iterator\":150}],168:[function(_dereq_,module,exports){\narguments[4][71][0].apply(exports,arguments)\n},{\"dup\":71}],169:[function(_dereq_,module,exports){\n// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = _dereq_('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) _dereq_('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n\n},{\"./_hide\":193,\"./_wks\":249}],170:[function(_dereq_,module,exports){\narguments[4][73][0].apply(exports,arguments)\n},{\"dup\":73}],171:[function(_dereq_,module,exports){\narguments[4][74][0].apply(exports,arguments)\n},{\"./_is-object\":200,\"dup\":74}],172:[function(_dereq_,module,exports){\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = _dereq_('./_to-object');\nvar toAbsoluteIndex = _dereq_('./_to-absolute-index');\nvar toLength = _dereq_('./_to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n\n},{\"./_to-absolute-index\":236,\"./_to-length\":240,\"./_to-object\":241}],173:[function(_dereq_,module,exports){\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = _dereq_('./_to-object');\nvar toAbsoluteIndex = _dereq_('./_to-absolute-index');\nvar toLength = _dereq_('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n\n},{\"./_to-absolute-index\":236,\"./_to-length\":240,\"./_to-object\":241}],174:[function(_dereq_,module,exports){\narguments[4][75][0].apply(exports,arguments)\n},{\"./_to-absolute-index\":236,\"./_to-iobject\":239,\"./_to-length\":240,\"dup\":75}],175:[function(_dereq_,module,exports){\n// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = _dereq_('./_ctx');\nvar IObject = _dereq_('./_iobject');\nvar toObject = _dereq_('./_to-object');\nvar toLength = _dereq_('./_to-length');\nvar asc = _dereq_('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n\n},{\"./_array-species-create\":177,\"./_ctx\":182,\"./_iobject\":197,\"./_to-length\":240,\"./_to-object\":241}],176:[function(_dereq_,module,exports){\nvar isObject = _dereq_('./_is-object');\nvar isArray = _dereq_('./_is-array');\nvar SPECIES = _dereq_('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n\n},{\"./_is-array\":199,\"./_is-object\":200,\"./_wks\":249}],177:[function(_dereq_,module,exports){\n// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = _dereq_('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n\n},{\"./_array-species-constructor\":176}],178:[function(_dereq_,module,exports){\narguments[4][76][0].apply(exports,arguments)\n},{\"./_cof\":179,\"./_wks\":249,\"dup\":76}],179:[function(_dereq_,module,exports){\narguments[4][77][0].apply(exports,arguments)\n},{\"dup\":77}],180:[function(_dereq_,module,exports){\narguments[4][78][0].apply(exports,arguments)\n},{\"dup\":78}],181:[function(_dereq_,module,exports){\narguments[4][79][0].apply(exports,arguments)\n},{\"./_object-dp\":213,\"./_property-desc\":225,\"dup\":79}],182:[function(_dereq_,module,exports){\narguments[4][80][0].apply(exports,arguments)\n},{\"./_a-function\":168,\"dup\":80}],183:[function(_dereq_,module,exports){\narguments[4][81][0].apply(exports,arguments)\n},{\"dup\":81}],184:[function(_dereq_,module,exports){\narguments[4][82][0].apply(exports,arguments)\n},{\"./_fails\":189,\"dup\":82}],185:[function(_dereq_,module,exports){\narguments[4][83][0].apply(exports,arguments)\n},{\"./_global\":191,\"./_is-object\":200,\"dup\":83}],186:[function(_dereq_,module,exports){\narguments[4][84][0].apply(exports,arguments)\n},{\"dup\":84}],187:[function(_dereq_,module,exports){\narguments[4][85][0].apply(exports,arguments)\n},{\"./_object-gops\":218,\"./_object-keys\":221,\"./_object-pie\":222,\"dup\":85}],188:[function(_dereq_,module,exports){\nvar global = _dereq_('./_global');\nvar core = _dereq_('./_core');\nvar hide = _dereq_('./_hide');\nvar redefine = _dereq_('./_redefine');\nvar ctx = _dereq_('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n\n},{\"./_core\":180,\"./_ctx\":182,\"./_global\":191,\"./_hide\":193,\"./_redefine\":227}],189:[function(_dereq_,module,exports){\narguments[4][87][0].apply(exports,arguments)\n},{\"dup\":87}],190:[function(_dereq_,module,exports){\narguments[4][88][0].apply(exports,arguments)\n},{\"./_an-object\":171,\"./_ctx\":182,\"./_is-array-iter\":198,\"./_iter-call\":201,\"./_to-length\":240,\"./core.get-iterator-method\":250,\"dup\":88}],191:[function(_dereq_,module,exports){\narguments[4][89][0].apply(exports,arguments)\n},{\"dup\":89}],192:[function(_dereq_,module,exports){\narguments[4][90][0].apply(exports,arguments)\n},{\"dup\":90}],193:[function(_dereq_,module,exports){\narguments[4][91][0].apply(exports,arguments)\n},{\"./_descriptors\":184,\"./_object-dp\":213,\"./_property-desc\":225,\"dup\":91}],194:[function(_dereq_,module,exports){\narguments[4][92][0].apply(exports,arguments)\n},{\"./_global\":191,\"dup\":92}],195:[function(_dereq_,module,exports){\narguments[4][93][0].apply(exports,arguments)\n},{\"./_descriptors\":184,\"./_dom-create\":185,\"./_fails\":189,\"dup\":93}],196:[function(_dereq_,module,exports){\narguments[4][94][0].apply(exports,arguments)\n},{\"dup\":94}],197:[function(_dereq_,module,exports){\narguments[4][95][0].apply(exports,arguments)\n},{\"./_cof\":179,\"dup\":95}],198:[function(_dereq_,module,exports){\narguments[4][96][0].apply(exports,arguments)\n},{\"./_iterators\":206,\"./_wks\":249,\"dup\":96}],199:[function(_dereq_,module,exports){\narguments[4][97][0].apply(exports,arguments)\n},{\"./_cof\":179,\"dup\":97}],200:[function(_dereq_,module,exports){\narguments[4][98][0].apply(exports,arguments)\n},{\"dup\":98}],201:[function(_dereq_,module,exports){\narguments[4][99][0].apply(exports,arguments)\n},{\"./_an-object\":171,\"dup\":99}],202:[function(_dereq_,module,exports){\narguments[4][100][0].apply(exports,arguments)\n},{\"./_hide\":193,\"./_object-create\":212,\"./_property-desc\":225,\"./_set-to-string-tag\":229,\"./_wks\":249,\"dup\":100}],203:[function(_dereq_,module,exports){\narguments[4][101][0].apply(exports,arguments)\n},{\"./_export\":188,\"./_has\":192,\"./_hide\":193,\"./_iter-create\":202,\"./_iterators\":206,\"./_library\":207,\"./_object-gpo\":219,\"./_redefine\":227,\"./_set-to-string-tag\":229,\"./_wks\":249,\"dup\":101}],204:[function(_dereq_,module,exports){\narguments[4][102][0].apply(exports,arguments)\n},{\"./_wks\":249,\"dup\":102}],205:[function(_dereq_,module,exports){\narguments[4][103][0].apply(exports,arguments)\n},{\"dup\":103}],206:[function(_dereq_,module,exports){\narguments[4][104][0].apply(exports,arguments)\n},{\"dup\":104}],207:[function(_dereq_,module,exports){\nmodule.exports = false;\n\n},{}],208:[function(_dereq_,module,exports){\narguments[4][106][0].apply(exports,arguments)\n},{\"./_fails\":189,\"./_has\":192,\"./_is-object\":200,\"./_object-dp\":213,\"./_uid\":246,\"dup\":106}],209:[function(_dereq_,module,exports){\narguments[4][107][0].apply(exports,arguments)\n},{\"./_cof\":179,\"./_global\":191,\"./_task\":235,\"dup\":107}],210:[function(_dereq_,module,exports){\narguments[4][108][0].apply(exports,arguments)\n},{\"./_a-function\":168,\"dup\":108}],211:[function(_dereq_,module,exports){\narguments[4][109][0].apply(exports,arguments)\n},{\"./_fails\":189,\"./_iobject\":197,\"./_object-gops\":218,\"./_object-keys\":221,\"./_object-pie\":222,\"./_to-object\":241,\"dup\":109}],212:[function(_dereq_,module,exports){\narguments[4][110][0].apply(exports,arguments)\n},{\"./_an-object\":171,\"./_dom-create\":185,\"./_enum-bug-keys\":186,\"./_html\":194,\"./_object-dps\":214,\"./_shared-key\":230,\"dup\":110}],213:[function(_dereq_,module,exports){\narguments[4][111][0].apply(exports,arguments)\n},{\"./_an-object\":171,\"./_descriptors\":184,\"./_ie8-dom-define\":195,\"./_to-primitive\":242,\"dup\":111}],214:[function(_dereq_,module,exports){\narguments[4][112][0].apply(exports,arguments)\n},{\"./_an-object\":171,\"./_descriptors\":184,\"./_object-dp\":213,\"./_object-keys\":221,\"dup\":112}],215:[function(_dereq_,module,exports){\narguments[4][113][0].apply(exports,arguments)\n},{\"./_descriptors\":184,\"./_has\":192,\"./_ie8-dom-define\":195,\"./_object-pie\":222,\"./_property-desc\":225,\"./_to-iobject\":239,\"./_to-primitive\":242,\"dup\":113}],216:[function(_dereq_,module,exports){\narguments[4][114][0].apply(exports,arguments)\n},{\"./_object-gopn\":217,\"./_to-iobject\":239,\"dup\":114}],217:[function(_dereq_,module,exports){\narguments[4][115][0].apply(exports,arguments)\n},{\"./_enum-bug-keys\":186,\"./_object-keys-internal\":220,\"dup\":115}],218:[function(_dereq_,module,exports){\narguments[4][116][0].apply(exports,arguments)\n},{\"dup\":116}],219:[function(_dereq_,module,exports){\narguments[4][117][0].apply(exports,arguments)\n},{\"./_has\":192,\"./_shared-key\":230,\"./_to-object\":241,\"dup\":117}],220:[function(_dereq_,module,exports){\narguments[4][118][0].apply(exports,arguments)\n},{\"./_array-includes\":174,\"./_has\":192,\"./_shared-key\":230,\"./_to-iobject\":239,\"dup\":118}],221:[function(_dereq_,module,exports){\narguments[4][119][0].apply(exports,arguments)\n},{\"./_enum-bug-keys\":186,\"./_object-keys-internal\":220,\"dup\":119}],222:[function(_dereq_,module,exports){\narguments[4][120][0].apply(exports,arguments)\n},{\"dup\":120}],223:[function(_dereq_,module,exports){\narguments[4][123][0].apply(exports,arguments)\n},{\"dup\":123}],224:[function(_dereq_,module,exports){\narguments[4][124][0].apply(exports,arguments)\n},{\"./_an-object\":171,\"./_is-object\":200,\"./_new-promise-capability\":210,\"dup\":124}],225:[function(_dereq_,module,exports){\narguments[4][125][0].apply(exports,arguments)\n},{\"dup\":125}],226:[function(_dereq_,module,exports){\nvar redefine = _dereq_('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n\n},{\"./_redefine\":227}],227:[function(_dereq_,module,exports){\nvar global = _dereq_('./_global');\nvar hide = _dereq_('./_hide');\nvar has = _dereq_('./_has');\nvar SRC = _dereq_('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\n_dereq_('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n\n},{\"./_core\":180,\"./_global\":191,\"./_has\":192,\"./_hide\":193,\"./_uid\":246}],228:[function(_dereq_,module,exports){\n'use strict';\nvar global = _dereq_('./_global');\nvar dP = _dereq_('./_object-dp');\nvar DESCRIPTORS = _dereq_('./_descriptors');\nvar SPECIES = _dereq_('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n\n},{\"./_descriptors\":184,\"./_global\":191,\"./_object-dp\":213,\"./_wks\":249}],229:[function(_dereq_,module,exports){\narguments[4][130][0].apply(exports,arguments)\n},{\"./_has\":192,\"./_object-dp\":213,\"./_wks\":249,\"dup\":130}],230:[function(_dereq_,module,exports){\narguments[4][131][0].apply(exports,arguments)\n},{\"./_shared\":231,\"./_uid\":246,\"dup\":131}],231:[function(_dereq_,module,exports){\narguments[4][132][0].apply(exports,arguments)\n},{\"./_global\":191,\"dup\":132}],232:[function(_dereq_,module,exports){\narguments[4][133][0].apply(exports,arguments)\n},{\"./_a-function\":168,\"./_an-object\":171,\"./_wks\":249,\"dup\":133}],233:[function(_dereq_,module,exports){\narguments[4][134][0].apply(exports,arguments)\n},{\"./_defined\":183,\"./_to-integer\":238,\"dup\":134}],234:[function(_dereq_,module,exports){\n'use strict';\nvar toInteger = _dereq_('./_to-integer');\nvar defined = _dereq_('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n\n},{\"./_defined\":183,\"./_to-integer\":238}],235:[function(_dereq_,module,exports){\narguments[4][135][0].apply(exports,arguments)\n},{\"./_cof\":179,\"./_ctx\":182,\"./_dom-create\":185,\"./_global\":191,\"./_html\":194,\"./_invoke\":196,\"dup\":135}],236:[function(_dereq_,module,exports){\narguments[4][136][0].apply(exports,arguments)\n},{\"./_to-integer\":238,\"dup\":136}],237:[function(_dereq_,module,exports){\n// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = _dereq_('./_to-integer');\nvar toLength = _dereq_('./_to-length');\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n\n},{\"./_to-integer\":238,\"./_to-length\":240}],238:[function(_dereq_,module,exports){\narguments[4][137][0].apply(exports,arguments)\n},{\"dup\":137}],239:[function(_dereq_,module,exports){\narguments[4][138][0].apply(exports,arguments)\n},{\"./_defined\":183,\"./_iobject\":197,\"dup\":138}],240:[function(_dereq_,module,exports){\narguments[4][139][0].apply(exports,arguments)\n},{\"./_to-integer\":238,\"dup\":139}],241:[function(_dereq_,module,exports){\narguments[4][140][0].apply(exports,arguments)\n},{\"./_defined\":183,\"dup\":140}],242:[function(_dereq_,module,exports){\narguments[4][141][0].apply(exports,arguments)\n},{\"./_is-object\":200,\"dup\":141}],243:[function(_dereq_,module,exports){\n'use strict';\nif (_dereq_('./_descriptors')) {\n var LIBRARY = _dereq_('./_library');\n var global = _dereq_('./_global');\n var fails = _dereq_('./_fails');\n var $export = _dereq_('./_export');\n var $typed = _dereq_('./_typed');\n var $buffer = _dereq_('./_typed-buffer');\n var ctx = _dereq_('./_ctx');\n var anInstance = _dereq_('./_an-instance');\n var propertyDesc = _dereq_('./_property-desc');\n var hide = _dereq_('./_hide');\n var redefineAll = _dereq_('./_redefine-all');\n var toInteger = _dereq_('./_to-integer');\n var toLength = _dereq_('./_to-length');\n var toIndex = _dereq_('./_to-index');\n var toAbsoluteIndex = _dereq_('./_to-absolute-index');\n var toPrimitive = _dereq_('./_to-primitive');\n var has = _dereq_('./_has');\n var classof = _dereq_('./_classof');\n var isObject = _dereq_('./_is-object');\n var toObject = _dereq_('./_to-object');\n var isArrayIter = _dereq_('./_is-array-iter');\n var create = _dereq_('./_object-create');\n var getPrototypeOf = _dereq_('./_object-gpo');\n var gOPN = _dereq_('./_object-gopn').f;\n var getIterFn = _dereq_('./core.get-iterator-method');\n var uid = _dereq_('./_uid');\n var wks = _dereq_('./_wks');\n var createArrayMethod = _dereq_('./_array-methods');\n var createArrayIncludes = _dereq_('./_array-includes');\n var speciesConstructor = _dereq_('./_species-constructor');\n var ArrayIterators = _dereq_('./es6.array.iterator');\n var Iterators = _dereq_('./_iterators');\n var $iterDetect = _dereq_('./_iter-detect');\n var setSpecies = _dereq_('./_set-species');\n var arrayFill = _dereq_('./_array-fill');\n var arrayCopyWithin = _dereq_('./_array-copy-within');\n var $DP = _dereq_('./_object-dp');\n var $GOPD = _dereq_('./_object-gopd');\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n\n},{\"./_an-instance\":170,\"./_array-copy-within\":172,\"./_array-fill\":173,\"./_array-includes\":174,\"./_array-methods\":175,\"./_classof\":178,\"./_ctx\":182,\"./_descriptors\":184,\"./_export\":188,\"./_fails\":189,\"./_global\":191,\"./_has\":192,\"./_hide\":193,\"./_is-array-iter\":198,\"./_is-object\":200,\"./_iter-detect\":204,\"./_iterators\":206,\"./_library\":207,\"./_object-create\":212,\"./_object-dp\":213,\"./_object-gopd\":215,\"./_object-gopn\":217,\"./_object-gpo\":219,\"./_property-desc\":225,\"./_redefine-all\":226,\"./_set-species\":228,\"./_species-constructor\":232,\"./_to-absolute-index\":236,\"./_to-index\":237,\"./_to-integer\":238,\"./_to-length\":240,\"./_to-object\":241,\"./_to-primitive\":242,\"./_typed\":245,\"./_typed-buffer\":244,\"./_uid\":246,\"./_wks\":249,\"./core.get-iterator-method\":250,\"./es6.array.iterator\":254}],244:[function(_dereq_,module,exports){\n'use strict';\nvar global = _dereq_('./_global');\nvar DESCRIPTORS = _dereq_('./_descriptors');\nvar LIBRARY = _dereq_('./_library');\nvar $typed = _dereq_('./_typed');\nvar hide = _dereq_('./_hide');\nvar redefineAll = _dereq_('./_redefine-all');\nvar fails = _dereq_('./_fails');\nvar anInstance = _dereq_('./_an-instance');\nvar toInteger = _dereq_('./_to-integer');\nvar toLength = _dereq_('./_to-length');\nvar toIndex = _dereq_('./_to-index');\nvar gOPN = _dereq_('./_object-gopn').f;\nvar dP = _dereq_('./_object-dp').f;\nvar arrayFill = _dereq_('./_array-fill');\nvar setToStringTag = _dereq_('./_set-to-string-tag');\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n\n},{\"./_an-instance\":170,\"./_array-fill\":173,\"./_descriptors\":184,\"./_fails\":189,\"./_global\":191,\"./_hide\":193,\"./_library\":207,\"./_object-dp\":213,\"./_object-gopn\":217,\"./_redefine-all\":226,\"./_set-to-string-tag\":229,\"./_to-index\":237,\"./_to-integer\":238,\"./_to-length\":240,\"./_typed\":245}],245:[function(_dereq_,module,exports){\nvar global = _dereq_('./_global');\nvar hide = _dereq_('./_hide');\nvar uid = _dereq_('./_uid');\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n\n},{\"./_global\":191,\"./_hide\":193,\"./_uid\":246}],246:[function(_dereq_,module,exports){\narguments[4][142][0].apply(exports,arguments)\n},{\"dup\":142}],247:[function(_dereq_,module,exports){\narguments[4][143][0].apply(exports,arguments)\n},{\"./_core\":180,\"./_global\":191,\"./_library\":207,\"./_object-dp\":213,\"./_wks-ext\":248,\"dup\":143}],248:[function(_dereq_,module,exports){\narguments[4][144][0].apply(exports,arguments)\n},{\"./_wks\":249,\"dup\":144}],249:[function(_dereq_,module,exports){\narguments[4][145][0].apply(exports,arguments)\n},{\"./_global\":191,\"./_shared\":231,\"./_uid\":246,\"dup\":145}],250:[function(_dereq_,module,exports){\narguments[4][146][0].apply(exports,arguments)\n},{\"./_classof\":178,\"./_core\":180,\"./_iterators\":206,\"./_wks\":249,\"dup\":146}],251:[function(_dereq_,module,exports){\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = _dereq_('./_export');\n\n$export($export.P, 'Array', { fill: _dereq_('./_array-fill') });\n\n_dereq_('./_add-to-unscopables')('fill');\n\n},{\"./_add-to-unscopables\":169,\"./_array-fill\":173,\"./_export\":188}],252:[function(_dereq_,module,exports){\n'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = _dereq_('./_export');\nvar $find = _dereq_('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n_dereq_('./_add-to-unscopables')(KEY);\n\n},{\"./_add-to-unscopables\":169,\"./_array-methods\":175,\"./_export\":188}],253:[function(_dereq_,module,exports){\narguments[4][149][0].apply(exports,arguments)\n},{\"./_create-property\":181,\"./_ctx\":182,\"./_export\":188,\"./_is-array-iter\":198,\"./_iter-call\":201,\"./_iter-detect\":204,\"./_to-length\":240,\"./_to-object\":241,\"./core.get-iterator-method\":250,\"dup\":149}],254:[function(_dereq_,module,exports){\narguments[4][150][0].apply(exports,arguments)\n},{\"./_add-to-unscopables\":169,\"./_iter-define\":203,\"./_iter-step\":205,\"./_iterators\":206,\"./_to-iobject\":239,\"dup\":150}],255:[function(_dereq_,module,exports){\narguments[4][151][0].apply(exports,arguments)\n},{\"./_export\":188,\"./_object-assign\":211,\"dup\":151}],256:[function(_dereq_,module,exports){\n'use strict';\n// 19.1.3.6 Object.prototype.toString()\nvar classof = _dereq_('./_classof');\nvar test = {};\ntest[_dereq_('./_wks')('toStringTag')] = 'z';\nif (test + '' != '[object z]') {\n _dereq_('./_redefine')(Object.prototype, 'toString', function toString() {\n return '[object ' + classof(this) + ']';\n }, true);\n}\n\n},{\"./_classof\":178,\"./_redefine\":227,\"./_wks\":249}],257:[function(_dereq_,module,exports){\narguments[4][158][0].apply(exports,arguments)\n},{\"./_a-function\":168,\"./_an-instance\":170,\"./_classof\":178,\"./_core\":180,\"./_ctx\":182,\"./_export\":188,\"./_for-of\":190,\"./_global\":191,\"./_is-object\":200,\"./_iter-detect\":204,\"./_library\":207,\"./_microtask\":209,\"./_new-promise-capability\":210,\"./_perform\":223,\"./_promise-resolve\":224,\"./_redefine-all\":226,\"./_set-species\":228,\"./_set-to-string-tag\":229,\"./_species-constructor\":232,\"./_task\":235,\"./_wks\":249,\"dup\":158}],258:[function(_dereq_,module,exports){\narguments[4][159][0].apply(exports,arguments)\n},{\"./_iter-define\":203,\"./_string-at\":233,\"dup\":159}],259:[function(_dereq_,module,exports){\nvar $export = _dereq_('./_export');\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: _dereq_('./_string-repeat')\n});\n\n},{\"./_export\":188,\"./_string-repeat\":234}],260:[function(_dereq_,module,exports){\narguments[4][160][0].apply(exports,arguments)\n},{\"./_an-object\":171,\"./_descriptors\":184,\"./_enum-keys\":187,\"./_export\":188,\"./_fails\":189,\"./_global\":191,\"./_has\":192,\"./_hide\":193,\"./_is-array\":199,\"./_is-object\":200,\"./_library\":207,\"./_meta\":208,\"./_object-create\":212,\"./_object-dp\":213,\"./_object-gopd\":215,\"./_object-gopn\":217,\"./_object-gopn-ext\":216,\"./_object-gops\":218,\"./_object-keys\":221,\"./_object-pie\":222,\"./_property-desc\":225,\"./_redefine\":227,\"./_set-to-string-tag\":229,\"./_shared\":231,\"./_to-iobject\":239,\"./_to-primitive\":242,\"./_uid\":246,\"./_wks\":249,\"./_wks-define\":247,\"./_wks-ext\":248,\"dup\":160}],261:[function(_dereq_,module,exports){\n_dereq_('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n\n},{\"./_typed-array\":243}],262:[function(_dereq_,module,exports){\narguments[4][163][0].apply(exports,arguments)\n},{\"./_core\":180,\"./_export\":188,\"./_global\":191,\"./_promise-resolve\":224,\"./_species-constructor\":232,\"dup\":163}],263:[function(_dereq_,module,exports){\narguments[4][164][0].apply(exports,arguments)\n},{\"./_export\":188,\"./_new-promise-capability\":210,\"./_perform\":223,\"dup\":164}],264:[function(_dereq_,module,exports){\narguments[4][165][0].apply(exports,arguments)\n},{\"./_wks-define\":247,\"dup\":165}],265:[function(_dereq_,module,exports){\narguments[4][166][0].apply(exports,arguments)\n},{\"./_wks-define\":247,\"dup\":166}],266:[function(_dereq_,module,exports){\nvar $iterators = _dereq_('./es6.array.iterator');\nvar getKeys = _dereq_('./_object-keys');\nvar redefine = _dereq_('./_redefine');\nvar global = _dereq_('./_global');\nvar hide = _dereq_('./_hide');\nvar Iterators = _dereq_('./_iterators');\nvar wks = _dereq_('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n\n},{\"./_global\":191,\"./_hide\":193,\"./_iterators\":206,\"./_object-keys\":221,\"./_redefine\":227,\"./_wks\":249,\"./es6.array.iterator\":254}],267:[function(_dereq_,module,exports){\n'use strict';\n\nvar elliptic = exports;\n\nelliptic.version = _dereq_('../package.json').version;\nelliptic.utils = _dereq_('./elliptic/utils');\nelliptic.rand = _dereq_('brorand');\nelliptic.curve = _dereq_('./elliptic/curve');\nelliptic.curves = _dereq_('./elliptic/curves');\n\n// Protocols\nelliptic.ec = _dereq_('./elliptic/ec');\nelliptic.eddsa = _dereq_('./elliptic/eddsa');\n\n},{\"../package.json\":282,\"./elliptic/curve\":270,\"./elliptic/curves\":273,\"./elliptic/ec\":274,\"./elliptic/eddsa\":277,\"./elliptic/utils\":281,\"brorand\":45}],268:[function(_dereq_,module,exports){\n'use strict';\n\nvar BN = _dereq_('bn.js');\nvar elliptic = _dereq_('../../elliptic');\nvar utils = elliptic.utils;\nvar getNAF = utils.getNAF;\nvar getJSF = utils.getJSF;\nvar assert = utils.assert;\n\nfunction BaseCurve(type, conf) {\n this.type = type;\n this.p = new BN(conf.p, 16);\n\n // Use Montgomery, when there is no fast reduction for the prime\n this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);\n\n // Useful for many curves\n this.zero = new BN(0).toRed(this.red);\n this.one = new BN(1).toRed(this.red);\n this.two = new BN(2).toRed(this.red);\n\n // Curve configuration, optional\n this.n = conf.n && new BN(conf.n, 16);\n this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);\n\n // Temporary arrays\n this._wnafT1 = new Array(4);\n this._wnafT2 = new Array(4);\n this._wnafT3 = new Array(4);\n this._wnafT4 = new Array(4);\n\n // Generalized Greg Maxwell's trick\n var adjustCount = this.n && this.p.div(this.n);\n if (!adjustCount || adjustCount.cmpn(100) > 0) {\n this.redN = null;\n } else {\n this._maxwellTrick = true;\n this.redN = this.n.toRed(this.red);\n }\n}\nmodule.exports = BaseCurve;\n\nBaseCurve.prototype.point = function point() {\n throw new Error('Not implemented');\n};\n\nBaseCurve.prototype.validate = function validate() {\n throw new Error('Not implemented');\n};\n\nBaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {\n assert(p.precomputed);\n var doubles = p._getDoubles();\n\n var naf = getNAF(k, 1);\n var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1);\n I /= 3;\n\n // Translate into more windowed form\n var repr = [];\n for (var j = 0; j < naf.length; j += doubles.step) {\n var nafW = 0;\n for (var k = j + doubles.step - 1; k >= j; k--)\n nafW = (nafW << 1) + naf[k];\n repr.push(nafW);\n }\n\n var a = this.jpoint(null, null, null);\n var b = this.jpoint(null, null, null);\n for (var i = I; i > 0; i--) {\n for (var j = 0; j < repr.length; j++) {\n var nafW = repr[j];\n if (nafW === i)\n b = b.mixedAdd(doubles.points[j]);\n else if (nafW === -i)\n b = b.mixedAdd(doubles.points[j].neg());\n }\n a = a.add(b);\n }\n return a.toP();\n};\n\nBaseCurve.prototype._wnafMul = function _wnafMul(p, k) {\n var w = 4;\n\n // Precompute window\n var nafPoints = p._getNAFPoints(w);\n w = nafPoints.wnd;\n var wnd = nafPoints.points;\n\n // Get NAF form\n var naf = getNAF(k, w);\n\n // Add `this`*(N+1) for every w-NAF index\n var acc = this.jpoint(null, null, null);\n for (var i = naf.length - 1; i >= 0; i--) {\n // Count zeroes\n for (var k = 0; i >= 0 && naf[i] === 0; i--)\n k++;\n if (i >= 0)\n k++;\n acc = acc.dblp(k);\n\n if (i < 0)\n break;\n var z = naf[i];\n assert(z !== 0);\n if (p.type === 'affine') {\n // J +- P\n if (z > 0)\n acc = acc.mixedAdd(wnd[(z - 1) >> 1]);\n else\n acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg());\n } else {\n // J +- J\n if (z > 0)\n acc = acc.add(wnd[(z - 1) >> 1]);\n else\n acc = acc.add(wnd[(-z - 1) >> 1].neg());\n }\n }\n return p.type === 'affine' ? acc.toP() : acc;\n};\n\nBaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW,\n points,\n coeffs,\n len,\n jacobianResult) {\n var wndWidth = this._wnafT1;\n var wnd = this._wnafT2;\n var naf = this._wnafT3;\n\n // Fill all arrays\n var max = 0;\n for (var i = 0; i < len; i++) {\n var p = points[i];\n var nafPoints = p._getNAFPoints(defW);\n wndWidth[i] = nafPoints.wnd;\n wnd[i] = nafPoints.points;\n }\n\n // Comb small window NAFs\n for (var i = len - 1; i >= 1; i -= 2) {\n var a = i - 1;\n var b = i;\n if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {\n naf[a] = getNAF(coeffs[a], wndWidth[a]);\n naf[b] = getNAF(coeffs[b], wndWidth[b]);\n max = Math.max(naf[a].length, max);\n max = Math.max(naf[b].length, max);\n continue;\n }\n\n var comb = [\n points[a], /* 1 */\n null, /* 3 */\n null, /* 5 */\n points[b] /* 7 */\n ];\n\n // Try to avoid Projective points, if possible\n if (points[a].y.cmp(points[b].y) === 0) {\n comb[1] = points[a].add(points[b]);\n comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {\n comb[1] = points[a].toJ().mixedAdd(points[b]);\n comb[2] = points[a].add(points[b].neg());\n } else {\n comb[1] = points[a].toJ().mixedAdd(points[b]);\n comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n }\n\n var index = [\n -3, /* -1 -1 */\n -1, /* -1 0 */\n -5, /* -1 1 */\n -7, /* 0 -1 */\n 0, /* 0 0 */\n 7, /* 0 1 */\n 5, /* 1 -1 */\n 1, /* 1 0 */\n 3 /* 1 1 */\n ];\n\n var jsf = getJSF(coeffs[a], coeffs[b]);\n max = Math.max(jsf[0].length, max);\n naf[a] = new Array(max);\n naf[b] = new Array(max);\n for (var j = 0; j < max; j++) {\n var ja = jsf[0][j] | 0;\n var jb = jsf[1][j] | 0;\n\n naf[a][j] = index[(ja + 1) * 3 + (jb + 1)];\n naf[b][j] = 0;\n wnd[a] = comb;\n }\n }\n\n var acc = this.jpoint(null, null, null);\n var tmp = this._wnafT4;\n for (var i = max; i >= 0; i--) {\n var k = 0;\n\n while (i >= 0) {\n var zero = true;\n for (var j = 0; j < len; j++) {\n tmp[j] = naf[j][i] | 0;\n if (tmp[j] !== 0)\n zero = false;\n }\n if (!zero)\n break;\n k++;\n i--;\n }\n if (i >= 0)\n k++;\n acc = acc.dblp(k);\n if (i < 0)\n break;\n\n for (var j = 0; j < len; j++) {\n var z = tmp[j];\n var p;\n if (z === 0)\n continue;\n else if (z > 0)\n p = wnd[j][(z - 1) >> 1];\n else if (z < 0)\n p = wnd[j][(-z - 1) >> 1].neg();\n\n if (p.type === 'affine')\n acc = acc.mixedAdd(p);\n else\n acc = acc.add(p);\n }\n }\n // Zeroify references\n for (var i = 0; i < len; i++)\n wnd[i] = null;\n\n if (jacobianResult)\n return acc;\n else\n return acc.toP();\n};\n\nfunction BasePoint(curve, type) {\n this.curve = curve;\n this.type = type;\n this.precomputed = null;\n}\nBaseCurve.BasePoint = BasePoint;\n\nBasePoint.prototype.eq = function eq(/*other*/) {\n throw new Error('Not implemented');\n};\n\nBasePoint.prototype.validate = function validate() {\n return this.curve.validate(this);\n};\n\nBaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {\n bytes = utils.toArray(bytes, enc);\n\n var len = this.p.byteLength();\n\n // uncompressed, hybrid-odd, hybrid-even\n if ((bytes[0] === 0x04 || bytes[0] === 0x06 || bytes[0] === 0x07) &&\n bytes.length - 1 === 2 * len) {\n if (bytes[0] === 0x06)\n assert(bytes[bytes.length - 1] % 2 === 0);\n else if (bytes[0] === 0x07)\n assert(bytes[bytes.length - 1] % 2 === 1);\n\n var res = this.point(bytes.slice(1, 1 + len),\n bytes.slice(1 + len, 1 + 2 * len));\n\n return res;\n } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) &&\n bytes.length - 1 === len) {\n return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03);\n }\n throw new Error('Unknown point format');\n};\n\nBasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {\n return this.encode(enc, true);\n};\n\nBasePoint.prototype._encode = function _encode(compact) {\n var len = this.curve.p.byteLength();\n var x = this.getX().toArray('be', len);\n\n if (compact)\n return [ this.getY().isEven() ? 0x02 : 0x03 ].concat(x);\n\n return [ 0x04 ].concat(x, this.getY().toArray('be', len)) ;\n};\n\nBasePoint.prototype.encode = function encode(enc, compact) {\n return utils.encode(this._encode(compact), enc);\n};\n\nBasePoint.prototype.precompute = function precompute(power) {\n if (this.precomputed)\n return this;\n\n var precomputed = {\n doubles: null,\n naf: null,\n beta: null\n };\n precomputed.naf = this._getNAFPoints(8);\n precomputed.doubles = this._getDoubles(4, power);\n precomputed.beta = this._getBeta();\n this.precomputed = precomputed;\n\n return this;\n};\n\nBasePoint.prototype._hasDoubles = function _hasDoubles(k) {\n if (!this.precomputed)\n return false;\n\n var doubles = this.precomputed.doubles;\n if (!doubles)\n return false;\n\n return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);\n};\n\nBasePoint.prototype._getDoubles = function _getDoubles(step, power) {\n if (this.precomputed && this.precomputed.doubles)\n return this.precomputed.doubles;\n\n var doubles = [ this ];\n var acc = this;\n for (var i = 0; i < power; i += step) {\n for (var j = 0; j < step; j++)\n acc = acc.dbl();\n doubles.push(acc);\n }\n return {\n step: step,\n points: doubles\n };\n};\n\nBasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {\n if (this.precomputed && this.precomputed.naf)\n return this.precomputed.naf;\n\n var res = [ this ];\n var max = (1 << wnd) - 1;\n var dbl = max === 1 ? null : this.dbl();\n for (var i = 1; i < max; i++)\n res[i] = res[i - 1].add(dbl);\n return {\n wnd: wnd,\n points: res\n };\n};\n\nBasePoint.prototype._getBeta = function _getBeta() {\n return null;\n};\n\nBasePoint.prototype.dblp = function dblp(k) {\n var r = this;\n for (var i = 0; i < k; i++)\n r = r.dbl();\n return r;\n};\n\n},{\"../../elliptic\":267,\"bn.js\":44}],269:[function(_dereq_,module,exports){\n'use strict';\n\nvar curve = _dereq_('../curve');\nvar elliptic = _dereq_('../../elliptic');\nvar BN = _dereq_('bn.js');\nvar inherits = _dereq_('inherits');\nvar Base = curve.base;\n\nvar assert = elliptic.utils.assert;\n\nfunction EdwardsCurve(conf) {\n // NOTE: Important as we are creating point in Base.call()\n this.twisted = (conf.a | 0) !== 1;\n this.mOneA = this.twisted && (conf.a | 0) === -1;\n this.extended = this.mOneA;\n\n Base.call(this, 'edwards', conf);\n\n this.a = new BN(conf.a, 16).umod(this.red.m);\n this.a = this.a.toRed(this.red);\n this.c = new BN(conf.c, 16).toRed(this.red);\n this.c2 = this.c.redSqr();\n this.d = new BN(conf.d, 16).toRed(this.red);\n this.dd = this.d.redAdd(this.d);\n\n assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);\n this.oneC = (conf.c | 0) === 1;\n}\ninherits(EdwardsCurve, Base);\nmodule.exports = EdwardsCurve;\n\nEdwardsCurve.prototype._mulA = function _mulA(num) {\n if (this.mOneA)\n return num.redNeg();\n else\n return this.a.redMul(num);\n};\n\nEdwardsCurve.prototype._mulC = function _mulC(num) {\n if (this.oneC)\n return num;\n else\n return this.c.redMul(num);\n};\n\n// Just for compatibility with Short curve\nEdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {\n return this.point(x, y, z, t);\n};\n\nEdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {\n x = new BN(x, 16);\n if (!x.red)\n x = x.toRed(this.red);\n\n var x2 = x.redSqr();\n var rhs = this.c2.redSub(this.a.redMul(x2));\n var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));\n\n var y2 = rhs.redMul(lhs.redInvm());\n var y = y2.redSqrt();\n if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)\n throw new Error('invalid point');\n\n var isOdd = y.fromRed().isOdd();\n if (odd && !isOdd || !odd && isOdd)\n y = y.redNeg();\n\n return this.point(x, y);\n};\n\nEdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {\n y = new BN(y, 16);\n if (!y.red)\n y = y.toRed(this.red);\n\n // x^2 = (y^2 - c^2) / (c^2 d y^2 - a)\n var y2 = y.redSqr();\n var lhs = y2.redSub(this.c2);\n var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);\n var x2 = lhs.redMul(rhs.redInvm());\n\n if (x2.cmp(this.zero) === 0) {\n if (odd)\n throw new Error('invalid point');\n else\n return this.point(this.zero, y);\n }\n\n var x = x2.redSqrt();\n if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)\n throw new Error('invalid point');\n\n if (x.fromRed().isOdd() !== odd)\n x = x.redNeg();\n\n return this.point(x, y);\n};\n\nEdwardsCurve.prototype.validate = function validate(point) {\n if (point.isInfinity())\n return true;\n\n // Curve: A * X^2 + Y^2 = C^2 * (1 + D * X^2 * Y^2)\n point.normalize();\n\n var x2 = point.x.redSqr();\n var y2 = point.y.redSqr();\n var lhs = x2.redMul(this.a).redAdd(y2);\n var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));\n\n return lhs.cmp(rhs) === 0;\n};\n\nfunction Point(curve, x, y, z, t) {\n Base.BasePoint.call(this, curve, 'projective');\n if (x === null && y === null && z === null) {\n this.x = this.curve.zero;\n this.y = this.curve.one;\n this.z = this.curve.one;\n this.t = this.curve.zero;\n this.zOne = true;\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16);\n this.z = z ? new BN(z, 16) : this.curve.one;\n this.t = t && new BN(t, 16);\n if (!this.x.red)\n this.x = this.x.toRed(this.curve.red);\n if (!this.y.red)\n this.y = this.y.toRed(this.curve.red);\n if (!this.z.red)\n this.z = this.z.toRed(this.curve.red);\n if (this.t && !this.t.red)\n this.t = this.t.toRed(this.curve.red);\n this.zOne = this.z === this.curve.one;\n\n // Use extended coordinates\n if (this.curve.extended && !this.t) {\n this.t = this.x.redMul(this.y);\n if (!this.zOne)\n this.t = this.t.redMul(this.z.redInvm());\n }\n }\n}\ninherits(Point, Base.BasePoint);\n\nEdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {\n return Point.fromJSON(this, obj);\n};\n\nEdwardsCurve.prototype.point = function point(x, y, z, t) {\n return new Point(this, x, y, z, t);\n};\n\nPoint.fromJSON = function fromJSON(curve, obj) {\n return new Point(curve, obj[0], obj[1], obj[2]);\n};\n\nPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '<EC Point Infinity>';\n return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +\n ' y: ' + this.y.fromRed().toString(16, 2) +\n ' z: ' + this.z.fromRed().toString(16, 2) + '>';\n};\n\nPoint.prototype.isInfinity = function isInfinity() {\n // XXX This code assumes that zero is always zero in red\n return this.x.cmpn(0) === 0 &&\n (this.y.cmp(this.z) === 0 ||\n (this.zOne && this.y.cmp(this.curve.c) === 0));\n};\n\nPoint.prototype._extDbl = function _extDbl() {\n // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html\n // #doubling-dbl-2008-hwcd\n // 4M + 4S\n\n // A = X1^2\n var a = this.x.redSqr();\n // B = Y1^2\n var b = this.y.redSqr();\n // C = 2 * Z1^2\n var c = this.z.redSqr();\n c = c.redIAdd(c);\n // D = a * A\n var d = this.curve._mulA(a);\n // E = (X1 + Y1)^2 - A - B\n var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);\n // G = D + B\n var g = d.redAdd(b);\n // F = G - C\n var f = g.redSub(c);\n // H = D - B\n var h = d.redSub(b);\n // X3 = E * F\n var nx = e.redMul(f);\n // Y3 = G * H\n var ny = g.redMul(h);\n // T3 = E * H\n var nt = e.redMul(h);\n // Z3 = F * G\n var nz = f.redMul(g);\n return this.curve.point(nx, ny, nz, nt);\n};\n\nPoint.prototype._projDbl = function _projDbl() {\n // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html\n // #doubling-dbl-2008-bbjlp\n // #doubling-dbl-2007-bl\n // and others\n // Generally 3M + 4S or 2M + 4S\n\n // B = (X1 + Y1)^2\n var b = this.x.redAdd(this.y).redSqr();\n // C = X1^2\n var c = this.x.redSqr();\n // D = Y1^2\n var d = this.y.redSqr();\n\n var nx;\n var ny;\n var nz;\n if (this.curve.twisted) {\n // E = a * C\n var e = this.curve._mulA(c);\n // F = E + D\n var f = e.redAdd(d);\n if (this.zOne) {\n // X3 = (B - C - D) * (F - 2)\n nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));\n // Y3 = F * (E - D)\n ny = f.redMul(e.redSub(d));\n // Z3 = F^2 - 2 * F\n nz = f.redSqr().redSub(f).redSub(f);\n } else {\n // H = Z1^2\n var h = this.z.redSqr();\n // J = F - 2 * H\n var j = f.redSub(h).redISub(h);\n // X3 = (B-C-D)*J\n nx = b.redSub(c).redISub(d).redMul(j);\n // Y3 = F * (E - D)\n ny = f.redMul(e.redSub(d));\n // Z3 = F * J\n nz = f.redMul(j);\n }\n } else {\n // E = C + D\n var e = c.redAdd(d);\n // H = (c * Z1)^2\n var h = this.curve._mulC(this.z).redSqr();\n // J = E - 2 * H\n var j = e.redSub(h).redSub(h);\n // X3 = c * (B - E) * J\n nx = this.curve._mulC(b.redISub(e)).redMul(j);\n // Y3 = c * E * (C - D)\n ny = this.curve._mulC(e).redMul(c.redISub(d));\n // Z3 = E * J\n nz = e.redMul(j);\n }\n return this.curve.point(nx, ny, nz);\n};\n\nPoint.prototype.dbl = function dbl() {\n if (this.isInfinity())\n return this;\n\n // Double in extended coordinates\n if (this.curve.extended)\n return this._extDbl();\n else\n return this._projDbl();\n};\n\nPoint.prototype._extAdd = function _extAdd(p) {\n // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html\n // #addition-add-2008-hwcd-3\n // 8M\n\n // A = (Y1 - X1) * (Y2 - X2)\n var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));\n // B = (Y1 + X1) * (Y2 + X2)\n var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));\n // C = T1 * k * T2\n var c = this.t.redMul(this.curve.dd).redMul(p.t);\n // D = Z1 * 2 * Z2\n var d = this.z.redMul(p.z.redAdd(p.z));\n // E = B - A\n var e = b.redSub(a);\n // F = D - C\n var f = d.redSub(c);\n // G = D + C\n var g = d.redAdd(c);\n // H = B + A\n var h = b.redAdd(a);\n // X3 = E * F\n var nx = e.redMul(f);\n // Y3 = G * H\n var ny = g.redMul(h);\n // T3 = E * H\n var nt = e.redMul(h);\n // Z3 = F * G\n var nz = f.redMul(g);\n return this.curve.point(nx, ny, nz, nt);\n};\n\nPoint.prototype._projAdd = function _projAdd(p) {\n // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html\n // #addition-add-2008-bbjlp\n // #addition-add-2007-bl\n // 10M + 1S\n\n // A = Z1 * Z2\n var a = this.z.redMul(p.z);\n // B = A^2\n var b = a.redSqr();\n // C = X1 * X2\n var c = this.x.redMul(p.x);\n // D = Y1 * Y2\n var d = this.y.redMul(p.y);\n // E = d * C * D\n var e = this.curve.d.redMul(c).redMul(d);\n // F = B - E\n var f = b.redSub(e);\n // G = B + E\n var g = b.redAdd(e);\n // X3 = A * F * ((X1 + Y1) * (X2 + Y2) - C - D)\n var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);\n var nx = a.redMul(f).redMul(tmp);\n var ny;\n var nz;\n if (this.curve.twisted) {\n // Y3 = A * G * (D - a * C)\n ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));\n // Z3 = F * G\n nz = f.redMul(g);\n } else {\n // Y3 = A * G * (D - C)\n ny = a.redMul(g).redMul(d.redSub(c));\n // Z3 = c * F * G\n nz = this.curve._mulC(f).redMul(g);\n }\n return this.curve.point(nx, ny, nz);\n};\n\nPoint.prototype.add = function add(p) {\n if (this.isInfinity())\n return p;\n if (p.isInfinity())\n return this;\n\n if (this.curve.extended)\n return this._extAdd(p);\n else\n return this._projAdd(p);\n};\n\nPoint.prototype.mul = function mul(k) {\n if (this._hasDoubles(k))\n return this.curve._fixedNafMul(this, k);\n else\n return this.curve._wnafMul(this, k);\n};\n\nPoint.prototype.mulAdd = function mulAdd(k1, p, k2) {\n return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, false);\n};\n\nPoint.prototype.jmulAdd = function jmulAdd(k1, p, k2) {\n return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, true);\n};\n\nPoint.prototype.normalize = function normalize() {\n if (this.zOne)\n return this;\n\n // Normalize coordinates\n var zi = this.z.redInvm();\n this.x = this.x.redMul(zi);\n this.y = this.y.redMul(zi);\n if (this.t)\n this.t = this.t.redMul(zi);\n this.z = this.curve.one;\n this.zOne = true;\n return this;\n};\n\nPoint.prototype.neg = function neg() {\n return this.curve.point(this.x.redNeg(),\n this.y,\n this.z,\n this.t && this.t.redNeg());\n};\n\nPoint.prototype.getX = function getX() {\n this.normalize();\n return this.x.fromRed();\n};\n\nPoint.prototype.getY = function getY() {\n this.normalize();\n return this.y.fromRed();\n};\n\nPoint.prototype.eq = function eq(other) {\n return this === other ||\n this.getX().cmp(other.getX()) === 0 &&\n this.getY().cmp(other.getY()) === 0;\n};\n\nPoint.prototype.eqXToP = function eqXToP(x) {\n var rx = x.toRed(this.curve.red).redMul(this.z);\n if (this.x.cmp(rx) === 0)\n return true;\n\n var xc = x.clone();\n var t = this.curve.redN.redMul(this.z);\n for (;;) {\n xc.iadd(this.curve.n);\n if (xc.cmp(this.curve.p) >= 0)\n return false;\n\n rx.redIAdd(t);\n if (this.x.cmp(rx) === 0)\n return true;\n }\n};\n\n// Compatibility with BaseCurve\nPoint.prototype.toP = Point.prototype.normalize;\nPoint.prototype.mixedAdd = Point.prototype.add;\n\n},{\"../../elliptic\":267,\"../curve\":270,\"bn.js\":44,\"inherits\":298}],270:[function(_dereq_,module,exports){\n'use strict';\n\nvar curve = exports;\n\ncurve.base = _dereq_('./base');\ncurve.short = _dereq_('./short');\ncurve.mont = _dereq_('./mont');\ncurve.edwards = _dereq_('./edwards');\n\n},{\"./base\":268,\"./edwards\":269,\"./mont\":271,\"./short\":272}],271:[function(_dereq_,module,exports){\n'use strict';\n\nvar curve = _dereq_('../curve');\nvar BN = _dereq_('bn.js');\nvar inherits = _dereq_('inherits');\nvar Base = curve.base;\n\nvar elliptic = _dereq_('../../elliptic');\nvar utils = elliptic.utils;\n\nfunction MontCurve(conf) {\n Base.call(this, 'mont', conf);\n\n this.a = new BN(conf.a, 16).toRed(this.red);\n this.b = new BN(conf.b, 16).toRed(this.red);\n this.i4 = new BN(4).toRed(this.red).redInvm();\n this.two = new BN(2).toRed(this.red);\n // Note: this implementation is according to the original paper\n // by P. Montgomery, NOT the one by D. J. Bernstein.\n this.a24 = this.i4.redMul(this.a.redAdd(this.two));\n}\ninherits(MontCurve, Base);\nmodule.exports = MontCurve;\n\nMontCurve.prototype.validate = function validate(point) {\n var x = point.normalize().x;\n var x2 = x.redSqr();\n var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);\n var y = rhs.redSqrt();\n\n return y.redSqr().cmp(rhs) === 0;\n};\n\nfunction Point(curve, x, z) {\n Base.BasePoint.call(this, curve, 'projective');\n if (x === null && z === null) {\n this.x = this.curve.one;\n this.z = this.curve.zero;\n } else {\n this.x = new BN(x, 16);\n this.z = new BN(z, 16);\n if (!this.x.red)\n this.x = this.x.toRed(this.curve.red);\n if (!this.z.red)\n this.z = this.z.toRed(this.curve.red);\n }\n}\ninherits(Point, Base.BasePoint);\n\nMontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {\n var bytes = utils.toArray(bytes, enc);\n\n // TODO Curve448\n // Montgomery curve points must be represented in the compressed format\n // https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-02#appendix-B\n if (bytes.length === 33 && bytes[0] === 0x40)\n bytes = bytes.slice(1, 33).reverse(); // point must be little-endian\n if (bytes.length !== 32)\n throw new Error('Unknown point compression format');\n return this.point(bytes, 1);\n};\n\nMontCurve.prototype.point = function point(x, z) {\n return new Point(this, x, z);\n};\n\nMontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {\n return Point.fromJSON(this, obj);\n};\n\nPoint.prototype.precompute = function precompute() {\n // No-op\n};\n\nPoint.prototype._encode = function _encode(compact) {\n var len = this.curve.p.byteLength();\n\n // Note: the output should always be little-endian\n // https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-02#appendix-B\n if (compact) {\n return [ 0x40 ].concat(this.getX().toArray('le', len));\n } else {\n return this.getX().toArray('be', len);\n }\n};\n\nPoint.fromJSON = function fromJSON(curve, obj) {\n return new Point(curve, obj[0], obj[1] || curve.one);\n};\n\nPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '<EC Point Infinity>';\n return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +\n ' z: ' + this.z.fromRed().toString(16, 2) + '>';\n};\n\nPoint.prototype.isInfinity = function isInfinity() {\n // XXX This code assumes that zero is always zero in red\n return this.z.cmpn(0) === 0;\n};\n\nPoint.prototype.dbl = function dbl() {\n // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#doubling-dbl-1987-m-3\n // 2M + 2S + 4A\n\n // A = X1 + Z1\n var a = this.x.redAdd(this.z);\n // AA = A^2\n var aa = a.redSqr();\n // B = X1 - Z1\n var b = this.x.redSub(this.z);\n // BB = B^2\n var bb = b.redSqr();\n // C = AA - BB\n var c = aa.redSub(bb);\n // X3 = AA * BB\n var nx = aa.redMul(bb);\n // Z3 = C * (BB + A24 * C)\n var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));\n return this.curve.point(nx, nz);\n};\n\nPoint.prototype.add = function add() {\n throw new Error('Not supported on Montgomery curve');\n};\n\nPoint.prototype.diffAdd = function diffAdd(p, diff) {\n // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#diffadd-dadd-1987-m-3\n // 4M + 2S + 6A\n\n // A = X2 + Z2\n var a = this.x.redAdd(this.z);\n // B = X2 - Z2\n var b = this.x.redSub(this.z);\n // C = X3 + Z3\n var c = p.x.redAdd(p.z);\n // D = X3 - Z3\n var d = p.x.redSub(p.z);\n // DA = D * A\n var da = d.redMul(a);\n // CB = C * B\n var cb = c.redMul(b);\n // X5 = Z1 * (DA + CB)^2\n var nx = diff.z.redMul(da.redAdd(cb).redSqr());\n // Z5 = X1 * (DA - CB)^2\n var nz = diff.x.redMul(da.redISub(cb).redSqr());\n return this.curve.point(nx, nz);\n};\n\nPoint.prototype.mul = function mul(k) {\n k = new BN(k, 16);\n\n var t = k.clone();\n var a = this; // (N / 2) * Q + Q\n var b = this.curve.point(null, null); // (N / 2) * Q\n var c = this; // Q\n\n for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1))\n bits.push(t.andln(1));\n\n for (var i = bits.length - 1; i >= 0; i--) {\n if (bits[i] === 0) {\n // N * Q + Q = ((N / 2) * Q + Q)) + (N / 2) * Q\n a = a.diffAdd(b, c);\n // N * Q = 2 * ((N / 2) * Q + Q))\n b = b.dbl();\n } else {\n // N * Q = ((N / 2) * Q + Q) + ((N / 2) * Q)\n b = a.diffAdd(b, c);\n // N * Q + Q = 2 * ((N / 2) * Q + Q)\n a = a.dbl();\n }\n }\n return b;\n};\n\nPoint.prototype.mulAdd = function mulAdd() {\n throw new Error('Not supported on Montgomery curve');\n};\n\nPoint.prototype.jumlAdd = function jumlAdd() {\n throw new Error('Not supported on Montgomery curve');\n};\n\nPoint.prototype.eq = function eq(other) {\n return this.getX().cmp(other.getX()) === 0;\n};\n\nPoint.prototype.normalize = function normalize() {\n this.x = this.x.redMul(this.z.redInvm());\n this.z = this.curve.one;\n return this;\n};\n\nPoint.prototype.getX = function getX() {\n // Normalize coordinates\n this.normalize();\n\n return this.x.fromRed();\n};\n\n},{\"../../elliptic\":267,\"../curve\":270,\"bn.js\":44,\"inherits\":298}],272:[function(_dereq_,module,exports){\n'use strict';\n\nvar curve = _dereq_('../curve');\nvar elliptic = _dereq_('../../elliptic');\nvar BN = _dereq_('bn.js');\nvar inherits = _dereq_('inherits');\nvar Base = curve.base;\n\nvar assert = elliptic.utils.assert;\n\nfunction ShortCurve(conf) {\n Base.call(this, 'short', conf);\n\n this.a = new BN(conf.a, 16).toRed(this.red);\n this.b = new BN(conf.b, 16).toRed(this.red);\n this.tinv = this.two.redInvm();\n\n this.zeroA = this.a.fromRed().cmpn(0) === 0;\n this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;\n\n // If the curve is endomorphic, precalculate beta and lambda\n this.endo = this._getEndomorphism(conf);\n this._endoWnafT1 = new Array(4);\n this._endoWnafT2 = new Array(4);\n}\ninherits(ShortCurve, Base);\nmodule.exports = ShortCurve;\n\nShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {\n // No efficient endomorphism\n if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)\n return;\n\n // Compute beta and lambda, that lambda * P = (beta * Px; Py)\n var beta;\n var lambda;\n if (conf.beta) {\n beta = new BN(conf.beta, 16).toRed(this.red);\n } else {\n var betas = this._getEndoRoots(this.p);\n // Choose the smallest beta\n beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];\n beta = beta.toRed(this.red);\n }\n if (conf.lambda) {\n lambda = new BN(conf.lambda, 16);\n } else {\n // Choose the lambda that is matching selected beta\n var lambdas = this._getEndoRoots(this.n);\n if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {\n lambda = lambdas[0];\n } else {\n lambda = lambdas[1];\n assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);\n }\n }\n\n // Get basis vectors, used for balanced length-two representation\n var basis;\n if (conf.basis) {\n basis = conf.basis.map(function(vec) {\n return {\n a: new BN(vec.a, 16),\n b: new BN(vec.b, 16)\n };\n });\n } else {\n basis = this._getEndoBasis(lambda);\n }\n\n return {\n beta: beta,\n lambda: lambda,\n basis: basis\n };\n};\n\nShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {\n // Find roots of for x^2 + x + 1 in F\n // Root = (-1 +- Sqrt(-3)) / 2\n //\n var red = num === this.p ? this.red : BN.mont(num);\n var tinv = new BN(2).toRed(red).redInvm();\n var ntinv = tinv.redNeg();\n\n var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);\n\n var l1 = ntinv.redAdd(s).fromRed();\n var l2 = ntinv.redSub(s).fromRed();\n return [ l1, l2 ];\n};\n\nShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {\n // aprxSqrt >= sqrt(this.n)\n var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));\n\n // 3.74\n // Run EGCD, until r(L + 1) < aprxSqrt\n var u = lambda;\n var v = this.n.clone();\n var x1 = new BN(1);\n var y1 = new BN(0);\n var x2 = new BN(0);\n var y2 = new BN(1);\n\n // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n)\n var a0;\n var b0;\n // First vector\n var a1;\n var b1;\n // Second vector\n var a2;\n var b2;\n\n var prevR;\n var i = 0;\n var r;\n var x;\n while (u.cmpn(0) !== 0) {\n var q = v.div(u);\n r = v.sub(q.mul(u));\n x = x2.sub(q.mul(x1));\n var y = y2.sub(q.mul(y1));\n\n if (!a1 && r.cmp(aprxSqrt) < 0) {\n a0 = prevR.neg();\n b0 = x1;\n a1 = r.neg();\n b1 = x;\n } else if (a1 && ++i === 2) {\n break;\n }\n prevR = r;\n\n v = u;\n u = r;\n x2 = x1;\n x1 = x;\n y2 = y1;\n y1 = y;\n }\n a2 = r.neg();\n b2 = x;\n\n var len1 = a1.sqr().add(b1.sqr());\n var len2 = a2.sqr().add(b2.sqr());\n if (len2.cmp(len1) >= 0) {\n a2 = a0;\n b2 = b0;\n }\n\n // Normalize signs\n if (a1.negative) {\n a1 = a1.neg();\n b1 = b1.neg();\n }\n if (a2.negative) {\n a2 = a2.neg();\n b2 = b2.neg();\n }\n\n return [\n { a: a1, b: b1 },\n { a: a2, b: b2 }\n ];\n};\n\nShortCurve.prototype._endoSplit = function _endoSplit(k) {\n var basis = this.endo.basis;\n var v1 = basis[0];\n var v2 = basis[1];\n\n var c1 = v2.b.mul(k).divRound(this.n);\n var c2 = v1.b.neg().mul(k).divRound(this.n);\n\n var p1 = c1.mul(v1.a);\n var p2 = c2.mul(v2.a);\n var q1 = c1.mul(v1.b);\n var q2 = c2.mul(v2.b);\n\n // Calculate answer\n var k1 = k.sub(p1).sub(p2);\n var k2 = q1.add(q2).neg();\n return { k1: k1, k2: k2 };\n};\n\nShortCurve.prototype.pointFromX = function pointFromX(x, odd) {\n x = new BN(x, 16);\n if (!x.red)\n x = x.toRed(this.red);\n\n var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);\n var y = y2.redSqrt();\n if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)\n throw new Error('invalid point');\n\n // XXX Is there any way to tell if the number is odd without converting it\n // to non-red form?\n var isOdd = y.fromRed().isOdd();\n if (odd && !isOdd || !odd && isOdd)\n y = y.redNeg();\n\n return this.point(x, y);\n};\n\nShortCurve.prototype.validate = function validate(point) {\n if (point.inf)\n return true;\n\n var x = point.x;\n var y = point.y;\n\n var ax = this.a.redMul(x);\n var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);\n return y.redSqr().redISub(rhs).cmpn(0) === 0;\n};\n\nShortCurve.prototype._endoWnafMulAdd =\n function _endoWnafMulAdd(points, coeffs, jacobianResult) {\n var npoints = this._endoWnafT1;\n var ncoeffs = this._endoWnafT2;\n for (var i = 0; i < points.length; i++) {\n var split = this._endoSplit(coeffs[i]);\n var p = points[i];\n var beta = p._getBeta();\n\n if (split.k1.negative) {\n split.k1.ineg();\n p = p.neg(true);\n }\n if (split.k2.negative) {\n split.k2.ineg();\n beta = beta.neg(true);\n }\n\n npoints[i * 2] = p;\n npoints[i * 2 + 1] = beta;\n ncoeffs[i * 2] = split.k1;\n ncoeffs[i * 2 + 1] = split.k2;\n }\n var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);\n\n // Clean-up references to points and coefficients\n for (var j = 0; j < i * 2; j++) {\n npoints[j] = null;\n ncoeffs[j] = null;\n }\n return res;\n};\n\nfunction Point(curve, x, y, isRed) {\n Base.BasePoint.call(this, curve, 'affine');\n if (x === null && y === null) {\n this.x = null;\n this.y = null;\n this.inf = true;\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16);\n // Force redgomery representation when loading from JSON\n if (isRed) {\n this.x.forceRed(this.curve.red);\n this.y.forceRed(this.curve.red);\n }\n if (!this.x.red)\n this.x = this.x.toRed(this.curve.red);\n if (!this.y.red)\n this.y = this.y.toRed(this.curve.red);\n this.inf = false;\n }\n}\ninherits(Point, Base.BasePoint);\n\nShortCurve.prototype.point = function point(x, y, isRed) {\n return new Point(this, x, y, isRed);\n};\n\nShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {\n return Point.fromJSON(this, obj, red);\n};\n\nPoint.prototype._getBeta = function _getBeta() {\n if (!this.curve.endo)\n return;\n\n var pre = this.precomputed;\n if (pre && pre.beta)\n return pre.beta;\n\n var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);\n if (pre) {\n var curve = this.curve;\n var endoMul = function(p) {\n return curve.point(p.x.redMul(curve.endo.beta), p.y);\n };\n pre.beta = beta;\n beta.precomputed = {\n beta: null,\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: pre.naf.points.map(endoMul)\n },\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: pre.doubles.points.map(endoMul)\n }\n };\n }\n return beta;\n};\n\nPoint.prototype.toJSON = function toJSON() {\n if (!this.precomputed)\n return [ this.x, this.y ];\n\n return [ this.x, this.y, this.precomputed && {\n doubles: this.precomputed.doubles && {\n step: this.precomputed.doubles.step,\n points: this.precomputed.doubles.points.slice(1)\n },\n naf: this.precomputed.naf && {\n wnd: this.precomputed.naf.wnd,\n points: this.precomputed.naf.points.slice(1)\n }\n } ];\n};\n\nPoint.fromJSON = function fromJSON(curve, obj, red) {\n if (typeof obj === 'string')\n obj = JSON.parse(obj);\n var res = curve.point(obj[0], obj[1], red);\n if (!obj[2])\n return res;\n\n function obj2point(obj) {\n return curve.point(obj[0], obj[1], red);\n }\n\n var pre = obj[2];\n res.precomputed = {\n beta: null,\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: [ res ].concat(pre.doubles.points.map(obj2point))\n },\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: [ res ].concat(pre.naf.points.map(obj2point))\n }\n };\n return res;\n};\n\nPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '<EC Point Infinity>';\n return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +\n ' y: ' + this.y.fromRed().toString(16, 2) + '>';\n};\n\nPoint.prototype.isInfinity = function isInfinity() {\n return this.inf;\n};\n\nPoint.prototype.add = function add(p) {\n // O + P = P\n if (this.inf)\n return p;\n\n // P + O = P\n if (p.inf)\n return this;\n\n // P + P = 2P\n if (this.eq(p))\n return this.dbl();\n\n // P + (-P) = O\n if (this.neg().eq(p))\n return this.curve.point(null, null);\n\n // P + Q = O\n if (this.x.cmp(p.x) === 0)\n return this.curve.point(null, null);\n\n var c = this.y.redSub(p.y);\n if (c.cmpn(0) !== 0)\n c = c.redMul(this.x.redSub(p.x).redInvm());\n var nx = c.redSqr().redISub(this.x).redISub(p.x);\n var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n return this.curve.point(nx, ny);\n};\n\nPoint.prototype.dbl = function dbl() {\n if (this.inf)\n return this;\n\n // 2P = O\n var ys1 = this.y.redAdd(this.y);\n if (ys1.cmpn(0) === 0)\n return this.curve.point(null, null);\n\n var a = this.curve.a;\n\n var x2 = this.x.redSqr();\n var dyinv = ys1.redInvm();\n var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);\n\n var nx = c.redSqr().redISub(this.x.redAdd(this.x));\n var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n return this.curve.point(nx, ny);\n};\n\nPoint.prototype.getX = function getX() {\n return this.x.fromRed();\n};\n\nPoint.prototype.getY = function getY() {\n return this.y.fromRed();\n};\n\nPoint.prototype.mul = function mul(k) {\n k = new BN(k, 16);\n\n if (this._hasDoubles(k))\n return this.curve._fixedNafMul(this, k);\n else if (this.curve.endo)\n return this.curve._endoWnafMulAdd([ this ], [ k ]);\n else\n return this.curve._wnafMul(this, k);\n};\n\nPoint.prototype.mulAdd = function mulAdd(k1, p2, k2) {\n var points = [ this, p2 ];\n var coeffs = [ k1, k2 ];\n if (this.curve.endo)\n return this.curve._endoWnafMulAdd(points, coeffs);\n else\n return this.curve._wnafMulAdd(1, points, coeffs, 2);\n};\n\nPoint.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {\n var points = [ this, p2 ];\n var coeffs = [ k1, k2 ];\n if (this.curve.endo)\n return this.curve._endoWnafMulAdd(points, coeffs, true);\n else\n return this.curve._wnafMulAdd(1, points, coeffs, 2, true);\n};\n\nPoint.prototype.eq = function eq(p) {\n return this === p ||\n this.inf === p.inf &&\n (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);\n};\n\nPoint.prototype.neg = function neg(_precompute) {\n if (this.inf)\n return this;\n\n var res = this.curve.point(this.x, this.y.redNeg());\n if (_precompute && this.precomputed) {\n var pre = this.precomputed;\n var negate = function(p) {\n return p.neg();\n };\n res.precomputed = {\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: pre.naf.points.map(negate)\n },\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: pre.doubles.points.map(negate)\n }\n };\n }\n return res;\n};\n\nPoint.prototype.toJ = function toJ() {\n if (this.inf)\n return this.curve.jpoint(null, null, null);\n\n var res = this.curve.jpoint(this.x, this.y, this.curve.one);\n return res;\n};\n\nfunction JPoint(curve, x, y, z) {\n Base.BasePoint.call(this, curve, 'jacobian');\n if (x === null && y === null && z === null) {\n this.x = this.curve.one;\n this.y = this.curve.one;\n this.z = new BN(0);\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16);\n this.z = new BN(z, 16);\n }\n if (!this.x.red)\n this.x = this.x.toRed(this.curve.red);\n if (!this.y.red)\n this.y = this.y.toRed(this.curve.red);\n if (!this.z.red)\n this.z = this.z.toRed(this.curve.red);\n\n this.zOne = this.z === this.curve.one;\n}\ninherits(JPoint, Base.BasePoint);\n\nShortCurve.prototype.jpoint = function jpoint(x, y, z) {\n return new JPoint(this, x, y, z);\n};\n\nJPoint.prototype.toP = function toP() {\n if (this.isInfinity())\n return this.curve.point(null, null);\n\n var zinv = this.z.redInvm();\n var zinv2 = zinv.redSqr();\n var ax = this.x.redMul(zinv2);\n var ay = this.y.redMul(zinv2).redMul(zinv);\n\n return this.curve.point(ax, ay);\n};\n\nJPoint.prototype.neg = function neg() {\n return this.curve.jpoint(this.x, this.y.redNeg(), this.z);\n};\n\nJPoint.prototype.add = function add(p) {\n // O + P = P\n if (this.isInfinity())\n return p;\n\n // P + O = P\n if (p.isInfinity())\n return this;\n\n // 12M + 4S + 7A\n var pz2 = p.z.redSqr();\n var z2 = this.z.redSqr();\n var u1 = this.x.redMul(pz2);\n var u2 = p.x.redMul(z2);\n var s1 = this.y.redMul(pz2.redMul(p.z));\n var s2 = p.y.redMul(z2.redMul(this.z));\n\n var h = u1.redSub(u2);\n var r = s1.redSub(s2);\n if (h.cmpn(0) === 0) {\n if (r.cmpn(0) !== 0)\n return this.curve.jpoint(null, null, null);\n else\n return this.dbl();\n }\n\n var h2 = h.redSqr();\n var h3 = h2.redMul(h);\n var v = u1.redMul(h2);\n\n var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n var nz = this.z.redMul(p.z).redMul(h);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.mixedAdd = function mixedAdd(p) {\n // O + P = P\n if (this.isInfinity())\n return p.toJ();\n\n // P + O = P\n if (p.isInfinity())\n return this;\n\n // 8M + 3S + 7A\n var z2 = this.z.redSqr();\n var u1 = this.x;\n var u2 = p.x.redMul(z2);\n var s1 = this.y;\n var s2 = p.y.redMul(z2).redMul(this.z);\n\n var h = u1.redSub(u2);\n var r = s1.redSub(s2);\n if (h.cmpn(0) === 0) {\n if (r.cmpn(0) !== 0)\n return this.curve.jpoint(null, null, null);\n else\n return this.dbl();\n }\n\n var h2 = h.redSqr();\n var h3 = h2.redMul(h);\n var v = u1.redMul(h2);\n\n var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n var nz = this.z.redMul(h);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.dblp = function dblp(pow) {\n if (pow === 0)\n return this;\n if (this.isInfinity())\n return this;\n if (!pow)\n return this.dbl();\n\n if (this.curve.zeroA || this.curve.threeA) {\n var r = this;\n for (var i = 0; i < pow; i++)\n r = r.dbl();\n return r;\n }\n\n // 1M + 2S + 1A + N * (4S + 5M + 8A)\n // N = 1 => 6M + 6S + 9A\n var a = this.curve.a;\n var tinv = this.curve.tinv;\n\n var jx = this.x;\n var jy = this.y;\n var jz = this.z;\n var jz4 = jz.redSqr().redSqr();\n\n // Reuse results\n var jyd = jy.redAdd(jy);\n for (var i = 0; i < pow; i++) {\n var jx2 = jx.redSqr();\n var jyd2 = jyd.redSqr();\n var jyd4 = jyd2.redSqr();\n var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n\n var t1 = jx.redMul(jyd2);\n var nx = c.redSqr().redISub(t1.redAdd(t1));\n var t2 = t1.redISub(nx);\n var dny = c.redMul(t2);\n dny = dny.redIAdd(dny).redISub(jyd4);\n var nz = jyd.redMul(jz);\n if (i + 1 < pow)\n jz4 = jz4.redMul(jyd4);\n\n jx = nx;\n jz = nz;\n jyd = dny;\n }\n\n return this.curve.jpoint(jx, jyd.redMul(tinv), jz);\n};\n\nJPoint.prototype.dbl = function dbl() {\n if (this.isInfinity())\n return this;\n\n if (this.curve.zeroA)\n return this._zeroDbl();\n else if (this.curve.threeA)\n return this._threeDbl();\n else\n return this._dbl();\n};\n\nJPoint.prototype._zeroDbl = function _zeroDbl() {\n var nx;\n var ny;\n var nz;\n // Z = 1\n if (this.zOne) {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html\n // #doubling-mdbl-2007-bl\n // 1M + 5S + 14A\n\n // XX = X1^2\n var xx = this.x.redSqr();\n // YY = Y1^2\n var yy = this.y.redSqr();\n // YYYY = YY^2\n var yyyy = yy.redSqr();\n // S = 2 * ((X1 + YY)^2 - XX - YYYY)\n var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n s = s.redIAdd(s);\n // M = 3 * XX + a; a = 0\n var m = xx.redAdd(xx).redIAdd(xx);\n // T = M ^ 2 - 2*S\n var t = m.redSqr().redISub(s).redISub(s);\n\n // 8 * YYYY\n var yyyy8 = yyyy.redIAdd(yyyy);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n\n // X3 = T\n nx = t;\n // Y3 = M * (S - T) - 8 * YYYY\n ny = m.redMul(s.redISub(t)).redISub(yyyy8);\n // Z3 = 2*Y1\n nz = this.y.redAdd(this.y);\n } else {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html\n // #doubling-dbl-2009-l\n // 2M + 5S + 13A\n\n // A = X1^2\n var a = this.x.redSqr();\n // B = Y1^2\n var b = this.y.redSqr();\n // C = B^2\n var c = b.redSqr();\n // D = 2 * ((X1 + B)^2 - A - C)\n var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);\n d = d.redIAdd(d);\n // E = 3 * A\n var e = a.redAdd(a).redIAdd(a);\n // F = E^2\n var f = e.redSqr();\n\n // 8 * C\n var c8 = c.redIAdd(c);\n c8 = c8.redIAdd(c8);\n c8 = c8.redIAdd(c8);\n\n // X3 = F - 2 * D\n nx = f.redISub(d).redISub(d);\n // Y3 = E * (D - X3) - 8 * C\n ny = e.redMul(d.redISub(nx)).redISub(c8);\n // Z3 = 2 * Y1 * Z1\n nz = this.y.redMul(this.z);\n nz = nz.redIAdd(nz);\n }\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype._threeDbl = function _threeDbl() {\n var nx;\n var ny;\n var nz;\n // Z = 1\n if (this.zOne) {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html\n // #doubling-mdbl-2007-bl\n // 1M + 5S + 15A\n\n // XX = X1^2\n var xx = this.x.redSqr();\n // YY = Y1^2\n var yy = this.y.redSqr();\n // YYYY = YY^2\n var yyyy = yy.redSqr();\n // S = 2 * ((X1 + YY)^2 - XX - YYYY)\n var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n s = s.redIAdd(s);\n // M = 3 * XX + a\n var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);\n // T = M^2 - 2 * S\n var t = m.redSqr().redISub(s).redISub(s);\n // X3 = T\n nx = t;\n // Y3 = M * (S - T) - 8 * YYYY\n var yyyy8 = yyyy.redIAdd(yyyy);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n ny = m.redMul(s.redISub(t)).redISub(yyyy8);\n // Z3 = 2 * Y1\n nz = this.y.redAdd(this.y);\n } else {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b\n // 3M + 5S\n\n // delta = Z1^2\n var delta = this.z.redSqr();\n // gamma = Y1^2\n var gamma = this.y.redSqr();\n // beta = X1 * gamma\n var beta = this.x.redMul(gamma);\n // alpha = 3 * (X1 - delta) * (X1 + delta)\n var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));\n alpha = alpha.redAdd(alpha).redIAdd(alpha);\n // X3 = alpha^2 - 8 * beta\n var beta4 = beta.redIAdd(beta);\n beta4 = beta4.redIAdd(beta4);\n var beta8 = beta4.redAdd(beta4);\n nx = alpha.redSqr().redISub(beta8);\n // Z3 = (Y1 + Z1)^2 - gamma - delta\n nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);\n // Y3 = alpha * (4 * beta - X3) - 8 * gamma^2\n var ggamma8 = gamma.redSqr();\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);\n }\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype._dbl = function _dbl() {\n var a = this.curve.a;\n\n // 4M + 6S + 10A\n var jx = this.x;\n var jy = this.y;\n var jz = this.z;\n var jz4 = jz.redSqr().redSqr();\n\n var jx2 = jx.redSqr();\n var jy2 = jy.redSqr();\n\n var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n\n var jxd4 = jx.redAdd(jx);\n jxd4 = jxd4.redIAdd(jxd4);\n var t1 = jxd4.redMul(jy2);\n var nx = c.redSqr().redISub(t1.redAdd(t1));\n var t2 = t1.redISub(nx);\n\n var jyd8 = jy2.redSqr();\n jyd8 = jyd8.redIAdd(jyd8);\n jyd8 = jyd8.redIAdd(jyd8);\n jyd8 = jyd8.redIAdd(jyd8);\n var ny = c.redMul(t2).redISub(jyd8);\n var nz = jy.redAdd(jy).redMul(jz);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.trpl = function trpl() {\n if (!this.curve.zeroA)\n return this.dbl().add(this);\n\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#tripling-tpl-2007-bl\n // 5M + 10S + ...\n\n // XX = X1^2\n var xx = this.x.redSqr();\n // YY = Y1^2\n var yy = this.y.redSqr();\n // ZZ = Z1^2\n var zz = this.z.redSqr();\n // YYYY = YY^2\n var yyyy = yy.redSqr();\n // M = 3 * XX + a * ZZ2; a = 0\n var m = xx.redAdd(xx).redIAdd(xx);\n // MM = M^2\n var mm = m.redSqr();\n // E = 6 * ((X1 + YY)^2 - XX - YYYY) - MM\n var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n e = e.redIAdd(e);\n e = e.redAdd(e).redIAdd(e);\n e = e.redISub(mm);\n // EE = E^2\n var ee = e.redSqr();\n // T = 16*YYYY\n var t = yyyy.redIAdd(yyyy);\n t = t.redIAdd(t);\n t = t.redIAdd(t);\n t = t.redIAdd(t);\n // U = (M + E)^2 - MM - EE - T\n var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);\n // X3 = 4 * (X1 * EE - 4 * YY * U)\n var yyu4 = yy.redMul(u);\n yyu4 = yyu4.redIAdd(yyu4);\n yyu4 = yyu4.redIAdd(yyu4);\n var nx = this.x.redMul(ee).redISub(yyu4);\n nx = nx.redIAdd(nx);\n nx = nx.redIAdd(nx);\n // Y3 = 8 * Y1 * (U * (T - U) - E * EE)\n var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));\n ny = ny.redIAdd(ny);\n ny = ny.redIAdd(ny);\n ny = ny.redIAdd(ny);\n // Z3 = (Z1 + E)^2 - ZZ - EE\n var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.mul = function mul(k, kbase) {\n k = new BN(k, kbase);\n\n return this.curve._wnafMul(this, k);\n};\n\nJPoint.prototype.eq = function eq(p) {\n if (p.type === 'affine')\n return this.eq(p.toJ());\n\n if (this === p)\n return true;\n\n // x1 * z2^2 == x2 * z1^2\n var z2 = this.z.redSqr();\n var pz2 = p.z.redSqr();\n if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)\n return false;\n\n // y1 * z2^3 == y2 * z1^3\n var z3 = z2.redMul(this.z);\n var pz3 = pz2.redMul(p.z);\n return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;\n};\n\nJPoint.prototype.eqXToP = function eqXToP(x) {\n var zs = this.z.redSqr();\n var rx = x.toRed(this.curve.red).redMul(zs);\n if (this.x.cmp(rx) === 0)\n return true;\n\n var xc = x.clone();\n var t = this.curve.redN.redMul(zs);\n for (;;) {\n xc.iadd(this.curve.n);\n if (xc.cmp(this.curve.p) >= 0)\n return false;\n\n rx.redIAdd(t);\n if (this.x.cmp(rx) === 0)\n return true;\n }\n};\n\nJPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '<EC JPoint Infinity>';\n return '<EC JPoint x: ' + this.x.toString(16, 2) +\n ' y: ' + this.y.toString(16, 2) +\n ' z: ' + this.z.toString(16, 2) + '>';\n};\n\nJPoint.prototype.isInfinity = function isInfinity() {\n // XXX This code assumes that zero is always zero in red\n return this.z.cmpn(0) === 0;\n};\n\n},{\"../../elliptic\":267,\"../curve\":270,\"bn.js\":44,\"inherits\":298}],273:[function(_dereq_,module,exports){\n'use strict';\n\nvar curves = exports;\n\nvar hash = _dereq_('hash.js');\nvar elliptic = _dereq_('../elliptic');\n\nvar assert = elliptic.utils.assert;\n\nfunction PresetCurve(options) {\n if (options.type === 'short')\n this.curve = new elliptic.curve.short(options);\n else if (options.type === 'edwards')\n this.curve = new elliptic.curve.edwards(options);\n else if (options.type === 'mont')\n this.curve = new elliptic.curve.mont(options);\n else throw new Error('Unknown curve type.');\n this.g = this.curve.g;\n this.n = this.curve.n;\n this.hash = options.hash;\n\n assert(this.g.validate(), 'Invalid curve');\n assert(this.g.mul(this.n).isInfinity(), 'Invalid curve, n*G != O');\n}\ncurves.PresetCurve = PresetCurve;\n\nfunction defineCurve(name, options) {\n Object.defineProperty(curves, name, {\n configurable: true,\n enumerable: true,\n get: function() {\n var curve = new PresetCurve(options);\n Object.defineProperty(curves, name, {\n configurable: true,\n enumerable: true,\n value: curve\n });\n return curve;\n }\n });\n}\n\ndefineCurve('p192', {\n type: 'short',\n prime: 'p192',\n p: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff',\n a: 'ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc',\n b: '64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1',\n n: 'ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831',\n hash: hash.sha256,\n gRed: false,\n g: [\n '188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012',\n '07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811'\n ]\n});\n\ndefineCurve('p224', {\n type: 'short',\n prime: 'p224',\n p: 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001',\n a: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe',\n b: 'b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4',\n n: 'ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d',\n hash: hash.sha256,\n gRed: false,\n g: [\n 'b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21',\n 'bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34'\n ]\n});\n\ndefineCurve('p256', {\n type: 'short',\n prime: null,\n p: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff',\n a: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc',\n b: '5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b',\n n: 'ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551',\n hash: hash.sha256,\n gRed: false,\n g: [\n '6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296',\n '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5'\n ]\n});\n\ndefineCurve('p384', {\n type: 'short',\n prime: null,\n p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'fffffffe ffffffff 00000000 00000000 ffffffff',\n a: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'fffffffe ffffffff 00000000 00000000 fffffffc',\n b: 'b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f ' +\n '5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef',\n n: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 ' +\n 'f4372ddf 581a0db2 48b0a77a ecec196a ccc52973',\n hash: hash.sha384,\n gRed: false,\n g: [\n 'aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 ' +\n '5502f25d bf55296c 3a545e38 72760ab7',\n '3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 ' +\n '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f'\n ]\n});\n\ndefineCurve('p521', {\n type: 'short',\n prime: null,\n p: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff ffffffff ffffffff ffffffff',\n a: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff ffffffff ffffffff fffffffc',\n b: '00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b ' +\n '99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd ' +\n '3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00',\n n: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 ' +\n 'f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409',\n hash: hash.sha512,\n gRed: false,\n g: [\n '000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 ' +\n '053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 ' +\n 'a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66',\n '00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 ' +\n '579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 ' +\n '3fad0761 353c7086 a272c240 88be9476 9fd16650'\n ]\n});\n\n// https://tools.ietf.org/html/rfc7748#section-4.1\ndefineCurve('curve25519', {\n type: 'mont',\n prime: 'p25519',\n p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed',\n a: '76d06',\n b: '1',\n n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed',\n cofactor: '8',\n hash: hash.sha256,\n gRed: false,\n g: [\n '9'\n ]\n});\n\ndefineCurve('ed25519', {\n type: 'edwards',\n prime: 'p25519',\n p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed',\n a: '-1',\n c: '1',\n // -121665 * (121666^(-1)) (mod P)\n d: '52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3',\n n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed',\n cofactor: '8',\n hash: hash.sha256,\n gRed: false,\n g: [\n '216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a',\n // 4/5\n '6666666666666666666666666666666666666666666666666666666666666658'\n ]\n});\n\n// https://tools.ietf.org/html/rfc5639#section-3.4\ndefineCurve('brainpoolP256r1', {\n type: 'short',\n prime: null,\n p: 'A9FB57DB A1EEA9BC 3E660A90 9D838D72 6E3BF623 D5262028 2013481D 1F6E5377',\n a: '7D5A0975 FC2C3057 EEF67530 417AFFE7 FB8055C1 26DC5C6C E94A4B44 F330B5D9',\n b: '26DC5C6C E94A4B44 F330B5D9 BBD77CBF 95841629 5CF7E1CE 6BCCDC18 FF8C07B6',\n n: 'A9FB57DB A1EEA9BC 3E660A90 9D838D71 8C397AA3 B561A6F7 901E0E82 974856A7',\n hash: hash.sha256, // or 384, or 512\n gRed: false,\n g: [\n '8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262',\n '547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997'\n ]\n});\n\n// https://tools.ietf.org/html/rfc5639#section-3.6\ndefineCurve('brainpoolP384r1', {\n type: 'short',\n prime: null,\n p: '8CB91E82 A3386D28 0F5D6F7E 50E641DF 152F7109 ED5456B4 12B1DA19 7FB71123' +\n 'ACD3A729 901D1A71 87470013 3107EC53',\n a: '7BC382C6 3D8C150C 3C72080A CE05AFA0 C2BEA28E 4FB22787 139165EF BA91F90F' +\n '8AA5814A 503AD4EB 04A8C7DD 22CE2826',\n b: '04A8C7DD 22CE2826 8B39B554 16F0447C 2FB77DE1 07DCD2A6 2E880EA5 3EEB62D5' +\n '7CB43902 95DBC994 3AB78696 FA504C11',\n n: '8CB91E82 A3386D28 0F5D6F7E 50E641DF 152F7109 ED5456B3 1F166E6C AC0425A7' +\n 'CF3AB6AF 6B7FC310 3B883202 E9046565',\n hash: hash.sha384, // or 512\n gRed: false,\n g: [\n '1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10' +\n 'E8E826E03436D646AAEF87B2E247D4AF1E',\n '8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129' +\n '280E4646217791811142820341263C5315'\n ]\n});\n\n// https://tools.ietf.org/html/rfc5639#section-3.7\ndefineCurve('brainpoolP512r1', {\n type: 'short',\n prime: null,\n p: 'AADD9DB8 DBE9C48B 3FD4E6AE 33C9FC07 CB308DB3 B3C9D20E D6639CCA 70330871' +\n '7D4D9B00 9BC66842 AECDA12A E6A380E6 2881FF2F 2D82C685 28AA6056 583A48F3',\n a: '7830A331 8B603B89 E2327145 AC234CC5 94CBDD8D 3DF91610 A83441CA EA9863BC' +\n '2DED5D5A A8253AA1 0A2EF1C9 8B9AC8B5 7F1117A7 2BF2C7B9 E7C1AC4D 77FC94CA',\n b: '3DF91610 A83441CA EA9863BC 2DED5D5A A8253AA1 0A2EF1C9 8B9AC8B5 7F1117A7' +\n '2BF2C7B9 E7C1AC4D 77FC94CA DC083E67 984050B7 5EBAE5DD 2809BD63 8016F723',\n n: 'AADD9DB8 DBE9C48B 3FD4E6AE 33C9FC07 CB308DB3 B3C9D20E D6639CCA 70330870' +\n '553E5C41 4CA92619 41866119 7FAC1047 1DB1D381 085DDADD B5879682 9CA90069',\n hash: hash.sha512,\n gRed: false,\n g: [\n '81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D009' +\n '8EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822',\n '7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F81' +\n '11B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892'\n ]\n});\n\n// https://en.bitcoin.it/wiki/Secp256k1\nvar pre;\ntry {\n pre = _dereq_('./precomputed/secp256k1');\n} catch (e) {\n pre = undefined;\n}\n\ndefineCurve('secp256k1', {\n type: 'short',\n prime: 'k256',\n p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f',\n a: '0',\n b: '7',\n n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141',\n h: '1',\n hash: hash.sha256,\n\n // Precomputed endomorphism\n beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee',\n lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72',\n basis: [\n {\n a: '3086d221a7d46bcde86c90e49284eb15',\n b: '-e4437ed6010e88286f547fa90abfe4c3'\n },\n {\n a: '114ca50f7a8e2f3f657c1108d9d44cfd8',\n b: '3086d221a7d46bcde86c90e49284eb15'\n }\n ],\n\n gRed: false,\n g: [\n '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',\n '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8',\n pre\n ]\n});\n\n},{\"../elliptic\":267,\"./precomputed/secp256k1\":280,\"hash.js\":284}],274:[function(_dereq_,module,exports){\n'use strict';\n\nvar BN = _dereq_('bn.js');\nvar HmacDRBG = _dereq_('hmac-drbg');\nvar elliptic = _dereq_('../../elliptic');\nvar utils = elliptic.utils;\nvar assert = utils.assert;\n\nvar KeyPair = _dereq_('./key');\nvar Signature = _dereq_('./signature');\n\nfunction EC(options) {\n if (!(this instanceof EC))\n return new EC(options);\n\n // Shortcut `elliptic.ec(curve-name)`\n if (typeof options === 'string') {\n assert(elliptic.curves.hasOwnProperty(options), 'Unknown curve ' + options);\n\n options = elliptic.curves[options];\n }\n\n // Shortcut for `elliptic.ec(elliptic.curves.curveName)`\n if (options instanceof elliptic.curves.PresetCurve)\n options = { curve: options };\n\n this.curve = options.curve.curve;\n this.n = this.curve.n;\n this.nh = this.n.ushrn(1);\n this.g = this.curve.g;\n\n // Point on curve\n this.g = options.curve.g;\n this.g.precompute(options.curve.n.bitLength() + 1);\n\n // Hash function for DRBG\n this.hash = options.hash || options.curve.hash;\n}\nmodule.exports = EC;\n\nEC.prototype.keyPair = function keyPair(options) {\n return new KeyPair(this, options);\n};\n\nEC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {\n return KeyPair.fromPrivate(this, priv, enc);\n};\n\nEC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {\n return KeyPair.fromPublic(this, pub, enc);\n};\n\nEC.prototype.genKeyPair = function genKeyPair(options) {\n if (!options)\n options = {};\n\n // Instantiate Hmac_DRBG\n var drbg = new HmacDRBG({\n hash: this.hash,\n pers: options.pers,\n persEnc: options.persEnc || 'utf8',\n entropy: options.entropy || elliptic.rand(this.hash.hmacStrength),\n entropyEnc: options.entropy && options.entropyEnc || 'utf8',\n nonce: this.n.toArray()\n });\n\n // Key generation for curve25519 is simpler\n if (this.curve.type === 'mont') {\n var priv = new BN(drbg.generate(32));\n return this.keyFromPrivate(priv);\n }\n\n var bytes = this.n.byteLength();\n var ns2 = this.n.sub(new BN(2));\n do {\n var priv = new BN(drbg.generate(bytes));\n if (priv.cmp(ns2) > 0)\n continue;\n\n priv.iaddn(1);\n return this.keyFromPrivate(priv);\n } while (true);\n};\n\nEC.prototype._truncateToN = function truncateToN(msg, truncOnly) {\n var delta = msg.byteLength() * 8 - this.n.bitLength();\n if (delta > 0)\n msg = msg.ushrn(delta);\n if (!truncOnly && msg.cmp(this.n) >= 0)\n return msg.sub(this.n);\n else\n return msg;\n};\n\nEC.prototype.sign = function sign(msg, key, enc, options) {\n if (typeof enc === 'object') {\n options = enc;\n enc = null;\n }\n if (!options)\n options = {};\n\n key = this.keyFromPrivate(key, enc);\n msg = this._truncateToN(new BN(msg, 16));\n\n // Zero-extend key to provide enough entropy\n var bytes = this.n.byteLength();\n var bkey = key.getPrivate().toArray('be', bytes);\n\n // Zero-extend nonce to have the same byte size as N\n var nonce = msg.toArray('be', bytes);\n\n // Instantiate Hmac_DRBG\n var drbg = new HmacDRBG({\n hash: this.hash,\n entropy: bkey,\n nonce: nonce,\n pers: options.pers,\n persEnc: options.persEnc || 'utf8'\n });\n\n // Number of bytes to generate\n var ns1 = this.n.sub(new BN(1));\n\n for (var iter = 0; true; iter++) {\n var k = options.k ?\n options.k(iter) :\n new BN(drbg.generate(this.n.byteLength()));\n k = this._truncateToN(k, true);\n if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)\n continue;\n\n var kp = this.g.mul(k);\n if (kp.isInfinity())\n continue;\n\n var kpX = kp.getX();\n var r = kpX.umod(this.n);\n if (r.cmpn(0) === 0)\n continue;\n\n var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));\n s = s.umod(this.n);\n if (s.cmpn(0) === 0)\n continue;\n\n var recoveryParam = (kp.getY().isOdd() ? 1 : 0) |\n (kpX.cmp(r) !== 0 ? 2 : 0);\n\n // Use complement of `s`, if it is > `n / 2`\n if (options.canonical && s.cmp(this.nh) > 0) {\n s = this.n.sub(s);\n recoveryParam ^= 1;\n }\n\n return new Signature({ r: r, s: s, recoveryParam: recoveryParam });\n }\n};\n\nEC.prototype.verify = function verify(msg, signature, key, enc) {\n msg = this._truncateToN(new BN(msg, 16));\n key = this.keyFromPublic(key, enc);\n signature = new Signature(signature, 'hex');\n\n // Perform primitive values validation\n var r = signature.r;\n var s = signature.s;\n if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)\n return false;\n if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)\n return false;\n\n // Validate signature\n var sinv = s.invm(this.n);\n var u1 = sinv.mul(msg).umod(this.n);\n var u2 = sinv.mul(r).umod(this.n);\n\n if (!this.curve._maxwellTrick) {\n var p = this.g.mulAdd(u1, key.getPublic(), u2);\n if (p.isInfinity())\n return false;\n\n return p.getX().umod(this.n).cmp(r) === 0;\n }\n\n // NOTE: Greg Maxwell's trick, inspired by:\n // https://git.io/vad3K\n\n var p = this.g.jmulAdd(u1, key.getPublic(), u2);\n if (p.isInfinity())\n return false;\n\n // Compare `p.x` of Jacobian point with `r`,\n // this will do `p.x == r * p.z^2` instead of multiplying `p.x` by the\n // inverse of `p.z^2`\n return p.eqXToP(r);\n};\n\nEC.prototype.recoverPubKey = function(msg, signature, j, enc) {\n assert((3 & j) === j, 'The recovery param is more than two bits');\n signature = new Signature(signature, enc);\n\n var n = this.n;\n var e = new BN(msg);\n var r = signature.r;\n var s = signature.s;\n\n // A set LSB signifies that the y-coordinate is odd\n var isYOdd = j & 1;\n var isSecondKey = j >> 1;\n if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)\n throw new Error('Unable to find sencond key candinate');\n\n // 1.1. Let x = r + jn.\n if (isSecondKey)\n r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);\n else\n r = this.curve.pointFromX(r, isYOdd);\n\n var rInv = signature.r.invm(n);\n var s1 = n.sub(e).mul(rInv).umod(n);\n var s2 = s.mul(rInv).umod(n);\n\n // 1.6.1 Compute Q = r^-1 (sR - eG)\n // Q = r^-1 (sR + -eG)\n return this.g.mulAdd(s1, r, s2);\n};\n\nEC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {\n signature = new Signature(signature, enc);\n if (signature.recoveryParam !== null)\n return signature.recoveryParam;\n\n for (var i = 0; i < 4; i++) {\n var Qprime;\n try {\n Qprime = this.recoverPubKey(e, signature, i);\n } catch (e) {\n continue;\n }\n\n if (Qprime.eq(Q))\n return i;\n }\n throw new Error('Unable to find valid recovery factor');\n};\n\n},{\"../../elliptic\":267,\"./key\":275,\"./signature\":276,\"bn.js\":44,\"hmac-drbg\":296}],275:[function(_dereq_,module,exports){\n'use strict';\n\nvar BN = _dereq_('bn.js');\nvar elliptic = _dereq_('../../elliptic');\nvar utils = elliptic.utils;\nvar assert = utils.assert;\n\nfunction KeyPair(ec, options) {\n this.ec = ec;\n this.priv = null;\n this.pub = null;\n\n // KeyPair(ec, { priv: ..., pub: ... })\n if (options.priv)\n this._importPrivate(options.priv, options.privEnc);\n if (options.pub)\n this._importPublic(options.pub, options.pubEnc);\n}\nmodule.exports = KeyPair;\n\nKeyPair.fromPublic = function fromPublic(ec, pub, enc) {\n if (pub instanceof KeyPair)\n return pub;\n\n return new KeyPair(ec, {\n pub: pub,\n pubEnc: enc\n });\n};\n\nKeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {\n if (priv instanceof KeyPair)\n return priv;\n\n return new KeyPair(ec, {\n priv: priv,\n privEnc: enc\n });\n};\n\n// TODO: should not validate for X25519\nKeyPair.prototype.validate = function validate() {\n var pub = this.getPublic();\n\n if (pub.isInfinity())\n return { result: false, reason: 'Invalid public key' };\n if (!pub.validate())\n return { result: false, reason: 'Public key is not a point' };\n if (!pub.mul(this.ec.curve.n).isInfinity())\n return { result: false, reason: 'Public key * N != O' };\n\n return { result: true, reason: null };\n};\n\nKeyPair.prototype.getPublic = function getPublic(enc, compact) {\n if (!this.pub)\n this.pub = this.ec.g.mul(this.priv);\n\n if (!enc)\n return this.pub;\n\n return this.pub.encode(enc, compact);\n};\n\nKeyPair.prototype.getPrivate = function getPrivate(enc) {\n if (enc === 'hex')\n return this.priv.toString(16, 2);\n else\n return this.priv;\n};\n\nKeyPair.prototype._importPrivate = function _importPrivate(key, enc) {\n this.priv = new BN(key, enc || 16);\n\n // For Curve25519/Curve448 we have a specific procedure.\n // TODO Curve448\n if (this.ec.curve.type === 'mont') {\n var one = this.ec.curve.one;\n var mask = one.ushln(255 - 3).sub(one).ushln(3);\n this.priv = this.priv.or(one.ushln(255 - 1));\n this.priv = this.priv.and(mask);\n } else\n // Ensure that the priv won't be bigger than n, otherwise we may fail\n // in fixed multiplication method\n this.priv = this.priv.umod(this.ec.curve.n);\n};\n\nKeyPair.prototype._importPublic = function _importPublic(key, enc) {\n if (key.x || key.y) {\n // Montgomery points only have an `x` coordinate.\n // Weierstrass/Edwards points on the other hand have both `x` and\n // `y` coordinates.\n if (this.ec.curve.type === 'mont') {\n assert(key.x, 'Need x coordinate');\n } else if (this.ec.curve.type === 'short' ||\n this.ec.curve.type === 'edwards') {\n assert(key.x && key.y, 'Need both x and y coordinate');\n }\n this.pub = this.ec.curve.point(key.x, key.y);\n return;\n }\n this.pub = this.ec.curve.decodePoint(key, enc);\n};\n\n// ECDH\nKeyPair.prototype.derive = function derive(pub) {\n var x = pub.mul(this.priv).getX();\n var len = x.byteLength();\n\n // Note: this is not ideal, but the RFC's are unclear\n // https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-02#appendix-B\n if (this.ec.curve.type === 'mont') {\n return x.toArray('le', len);\n } else {\n return x.toArray('be', len);\n }\n};\n\n// ECDSA\nKeyPair.prototype.sign = function sign(msg, enc, options) {\n return this.ec.sign(msg, this, enc, options);\n};\n\nKeyPair.prototype.verify = function verify(msg, signature) {\n return this.ec.verify(msg, signature, this);\n};\n\nKeyPair.prototype.inspect = function inspect() {\n return '<Key priv: ' + (this.priv && this.priv.toString(16, 2)) +\n ' pub: ' + (this.pub && this.pub.inspect()) + ' >';\n};\n\n},{\"../../elliptic\":267,\"bn.js\":44}],276:[function(_dereq_,module,exports){\n'use strict';\n\nvar BN = _dereq_('bn.js');\n\nvar elliptic = _dereq_('../../elliptic');\nvar utils = elliptic.utils;\nvar assert = utils.assert;\n\nfunction Signature(options, enc) {\n if (options instanceof Signature)\n return options;\n\n if (this._importDER(options, enc))\n return;\n\n assert(options.r && options.s, 'Signature without r or s');\n this.r = new BN(options.r, 16);\n this.s = new BN(options.s, 16);\n if (options.recoveryParam === undefined)\n this.recoveryParam = null;\n else\n this.recoveryParam = options.recoveryParam;\n}\nmodule.exports = Signature;\n\nfunction Position() {\n this.place = 0;\n}\n\nfunction getLength(buf, p) {\n var initial = buf[p.place++];\n if (!(initial & 0x80)) {\n return initial;\n }\n var octetLen = initial & 0xf;\n var val = 0;\n for (var i = 0, off = p.place; i < octetLen; i++, off++) {\n val <<= 8;\n val |= buf[off];\n }\n p.place = off;\n return val;\n}\n\nfunction rmPadding(buf) {\n var i = 0;\n var len = buf.length - 1;\n while (!buf[i] && !(buf[i + 1] & 0x80) && i < len) {\n i++;\n }\n if (i === 0) {\n return buf;\n }\n return buf.slice(i);\n}\n\nSignature.prototype._importDER = function _importDER(data, enc) {\n data = utils.toArray(data, enc);\n var p = new Position();\n if (data[p.place++] !== 0x30) {\n return false;\n }\n var len = getLength(data, p);\n if ((len + p.place) !== data.length) {\n return false;\n }\n if (data[p.place++] !== 0x02) {\n return false;\n }\n var rlen = getLength(data, p);\n var r = data.slice(p.place, rlen + p.place);\n p.place += rlen;\n if (data[p.place++] !== 0x02) {\n return false;\n }\n var slen = getLength(data, p);\n if (data.length !== slen + p.place) {\n return false;\n }\n var s = data.slice(p.place, slen + p.place);\n if (r[0] === 0 && (r[1] & 0x80)) {\n r = r.slice(1);\n }\n if (s[0] === 0 && (s[1] & 0x80)) {\n s = s.slice(1);\n }\n\n this.r = new BN(r);\n this.s = new BN(s);\n this.recoveryParam = null;\n\n return true;\n};\n\nfunction constructLength(arr, len) {\n if (len < 0x80) {\n arr.push(len);\n return;\n }\n var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);\n arr.push(octets | 0x80);\n while (--octets) {\n arr.push((len >>> (octets << 3)) & 0xff);\n }\n arr.push(len);\n}\n\nSignature.prototype.toDER = function toDER(enc) {\n var r = this.r.toArray();\n var s = this.s.toArray();\n\n // Pad values\n if (r[0] & 0x80)\n r = [ 0 ].concat(r);\n // Pad values\n if (s[0] & 0x80)\n s = [ 0 ].concat(s);\n\n r = rmPadding(r);\n s = rmPadding(s);\n\n while (!s[0] && !(s[1] & 0x80)) {\n s = s.slice(1);\n }\n var arr = [ 0x02 ];\n constructLength(arr, r.length);\n arr = arr.concat(r);\n arr.push(0x02);\n constructLength(arr, s.length);\n var backHalf = arr.concat(s);\n var res = [ 0x30 ];\n constructLength(res, backHalf.length);\n res = res.concat(backHalf);\n return utils.encode(res, enc);\n};\n\n},{\"../../elliptic\":267,\"bn.js\":44}],277:[function(_dereq_,module,exports){\n'use strict';\n\nvar hash = _dereq_('hash.js');\nvar HmacDRBG = _dereq_('hmac-drbg');\nvar elliptic = _dereq_('../../elliptic');\nvar utils = elliptic.utils;\nvar assert = utils.assert;\nvar parseBytes = utils.parseBytes;\nvar KeyPair = _dereq_('./key');\nvar Signature = _dereq_('./signature');\n\nfunction EDDSA(curve) {\n assert(curve === 'ed25519', 'only tested with ed25519 so far');\n\n if (!(this instanceof EDDSA))\n return new EDDSA(curve);\n\n var curve = elliptic.curves[curve].curve;\n this.curve = curve;\n this.g = curve.g;\n this.g.precompute(curve.n.bitLength() + 1);\n\n this.pointClass = curve.point().constructor;\n this.encodingLength = Math.ceil(curve.n.bitLength() / 8);\n this.hash = hash.sha512;\n}\n\nmodule.exports = EDDSA;\n\n/**\n* @param {Array|String} message - message bytes\n* @param {Array|String|KeyPair} secret - secret bytes or a keypair\n* @returns {Signature} - signature\n*/\nEDDSA.prototype.sign = function sign(message, secret) {\n message = parseBytes(message);\n var key = this.keyFromSecret(secret);\n var r = this.hashInt(key.messagePrefix(), message);\n var R = this.g.mul(r);\n var Rencoded = this.encodePoint(R);\n var s_ = this.hashInt(Rencoded, key.pubBytes(), message)\n .mul(key.priv());\n var S = r.add(s_).umod(this.curve.n);\n return this.makeSignature({ R: R, S: S, Rencoded: Rencoded });\n};\n\n/**\n* @param {Array} message - message bytes\n* @param {Array|String|Signature} sig - sig bytes\n* @param {Array|String|Point|KeyPair} pub - public key\n* @returns {Boolean} - true if public key matches sig of message\n*/\nEDDSA.prototype.verify = function verify(message, sig, pub) {\n message = parseBytes(message);\n sig = this.makeSignature(sig);\n var key = this.keyFromPublic(pub);\n var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);\n var SG = this.g.mul(sig.S());\n var RplusAh = sig.R().add(key.pub().mul(h));\n return RplusAh.eq(SG);\n};\n\nEDDSA.prototype.hashInt = function hashInt() {\n var hash = this.hash();\n for (var i = 0; i < arguments.length; i++)\n hash.update(arguments[i]);\n return utils.intFromLE(hash.digest()).umod(this.curve.n);\n};\n\nEDDSA.prototype.keyPair = function keyPair(options) {\n return new KeyPair(this, options);\n};\n\nEDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {\n return KeyPair.fromPublic(this, pub);\n};\n\nEDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {\n return KeyPair.fromSecret(this, secret);\n};\n\nEDDSA.prototype.genKeyPair = function genKeyPair(options) {\n if (!options)\n options = {};\n\n // Instantiate Hmac_DRBG\n var drbg = new HmacDRBG({\n hash: this.hash,\n pers: options.pers,\n persEnc: options.persEnc || 'utf8',\n entropy: options.entropy || elliptic.rand(this.hash.hmacStrength),\n entropyEnc: options.entropy && options.entropyEnc || 'utf8',\n nonce: this.curve.n.toArray()\n });\n\n return this.keyFromSecret(drbg.generate(32));\n};\n\nEDDSA.prototype.makeSignature = function makeSignature(sig) {\n if (sig instanceof Signature)\n return sig;\n return new Signature(this, sig);\n};\n\n/**\n* * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03#section-5.2\n*\n* EDDSA defines methods for encoding and decoding points and integers. These are\n* helper convenience methods, that pass along to utility functions implied\n* parameters.\n*\n*/\nEDDSA.prototype.encodePoint = function encodePoint(point) {\n var enc = point.getY().toArray('le', this.encodingLength);\n enc[this.encodingLength - 1] |= point.getX().isOdd() ? 0x80 : 0;\n return enc;\n};\n\nEDDSA.prototype.decodePoint = function decodePoint(bytes) {\n bytes = utils.parseBytes(bytes);\n\n var lastIx = bytes.length - 1;\n var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~0x80);\n var xIsOdd = (bytes[lastIx] & 0x80) !== 0;\n\n var y = utils.intFromLE(normed);\n return this.curve.pointFromY(y, xIsOdd);\n};\n\nEDDSA.prototype.encodeInt = function encodeInt(num) {\n return num.toArray('le', this.encodingLength);\n};\n\nEDDSA.prototype.decodeInt = function decodeInt(bytes) {\n return utils.intFromLE(bytes);\n};\n\nEDDSA.prototype.isPoint = function isPoint(val) {\n return val instanceof this.pointClass;\n};\n\n},{\"../../elliptic\":267,\"./key\":278,\"./signature\":279,\"hash.js\":284,\"hmac-drbg\":296}],278:[function(_dereq_,module,exports){\n'use strict';\n\nvar elliptic = _dereq_('../../elliptic');\nvar utils = elliptic.utils;\nvar assert = utils.assert;\nvar parseBytes = utils.parseBytes;\nvar cachedProperty = utils.cachedProperty;\n\n/**\n* @param {EDDSA} eddsa - instance\n* @param {Object} params - public/private key parameters\n*\n* @param {Array<Byte>} [params.secret] - secret seed bytes\n* @param {Point} [params.pub] - public key point (aka `A` in eddsa terms)\n* @param {Array<Byte>} [params.pub] - public key point encoded as bytes\n*\n*/\nfunction KeyPair(eddsa, params) {\n this.eddsa = eddsa;\n if (params.hasOwnProperty('secret'))\n this._secret = parseBytes(params.secret);\n if (eddsa.isPoint(params.pub))\n this._pub = params.pub;\n else {\n this._pubBytes = parseBytes(params.pub);\n if (this._pubBytes && this._pubBytes.length === 33 &&\n this._pubBytes[0] === 0x40)\n this._pubBytes = this._pubBytes.slice(1, 33);\n if (this._pubBytes && this._pubBytes.length !== 32)\n throw new Error('Unknown point compression format');\n }\n}\n\nKeyPair.fromPublic = function fromPublic(eddsa, pub) {\n if (pub instanceof KeyPair)\n return pub;\n return new KeyPair(eddsa, { pub: pub });\n};\n\nKeyPair.fromSecret = function fromSecret(eddsa, secret) {\n if (secret instanceof KeyPair)\n return secret;\n return new KeyPair(eddsa, { secret: secret });\n};\n\nKeyPair.prototype.secret = function secret() {\n return this._secret;\n};\n\ncachedProperty(KeyPair, 'pubBytes', function pubBytes() {\n return this.eddsa.encodePoint(this.pub());\n});\n\ncachedProperty(KeyPair, 'pub', function pub() {\n if (this._pubBytes)\n return this.eddsa.decodePoint(this._pubBytes);\n return this.eddsa.g.mul(this.priv());\n});\n\ncachedProperty(KeyPair, 'privBytes', function privBytes() {\n var eddsa = this.eddsa;\n var hash = this.hash();\n var lastIx = eddsa.encodingLength - 1;\n\n // https://tools.ietf.org/html/rfc8032#section-5.1.5\n var a = hash.slice(0, eddsa.encodingLength);\n a[0] &= 248;\n a[lastIx] &= 127;\n a[lastIx] |= 64;\n\n return a;\n});\n\ncachedProperty(KeyPair, 'priv', function priv() {\n return this.eddsa.decodeInt(this.privBytes());\n});\n\ncachedProperty(KeyPair, 'hash', function hash() {\n return this.eddsa.hash().update(this.secret()).digest();\n});\n\ncachedProperty(KeyPair, 'messagePrefix', function messagePrefix() {\n return this.hash().slice(this.eddsa.encodingLength);\n});\n\nKeyPair.prototype.sign = function sign(message) {\n assert(this._secret, 'KeyPair can only verify');\n return this.eddsa.sign(message, this);\n};\n\nKeyPair.prototype.verify = function verify(message, sig) {\n return this.eddsa.verify(message, sig, this);\n};\n\nKeyPair.prototype.getSecret = function getSecret(enc) {\n assert(this._secret, 'KeyPair is public only');\n return utils.encode(this.secret(), enc);\n};\n\nKeyPair.prototype.getPublic = function getPublic(enc, compact) {\n return utils.encode((compact ? [ 0x40 ] : []).concat(this.pubBytes()), enc);\n};\n\nmodule.exports = KeyPair;\n\n},{\"../../elliptic\":267}],279:[function(_dereq_,module,exports){\n'use strict';\n\nvar BN = _dereq_('bn.js');\nvar elliptic = _dereq_('../../elliptic');\nvar utils = elliptic.utils;\nvar assert = utils.assert;\nvar cachedProperty = utils.cachedProperty;\nvar parseBytes = utils.parseBytes;\n\n/**\n* @param {EDDSA} eddsa - eddsa instance\n* @param {Array<Bytes>|Object} sig -\n* @param {Array<Bytes>|Point} [sig.R] - R point as Point or bytes\n* @param {Array<Bytes>|bn} [sig.S] - S scalar as bn or bytes\n* @param {Array<Bytes>} [sig.Rencoded] - R point encoded\n* @param {Array<Bytes>} [sig.Sencoded] - S scalar encoded\n*/\nfunction Signature(eddsa, sig) {\n this.eddsa = eddsa;\n\n if (typeof sig !== 'object')\n sig = parseBytes(sig);\n\n if (Array.isArray(sig)) {\n sig = {\n R: sig.slice(0, eddsa.encodingLength),\n S: sig.slice(eddsa.encodingLength)\n };\n }\n\n assert(sig.R && sig.S, 'Signature without R or S');\n\n if (eddsa.isPoint(sig.R))\n this._R = sig.R;\n if (sig.S instanceof BN)\n this._S = sig.S;\n\n this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;\n this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;\n}\n\ncachedProperty(Signature, 'S', function S() {\n return this.eddsa.decodeInt(this.Sencoded());\n});\n\ncachedProperty(Signature, 'R', function R() {\n return this.eddsa.decodePoint(this.Rencoded());\n});\n\ncachedProperty(Signature, 'Rencoded', function Rencoded() {\n return this.eddsa.encodePoint(this.R());\n});\n\ncachedProperty(Signature, 'Sencoded', function Sencoded() {\n return this.eddsa.encodeInt(this.S());\n});\n\nSignature.prototype.toBytes = function toBytes() {\n return this.Rencoded().concat(this.Sencoded());\n};\n\nSignature.prototype.toHex = function toHex() {\n return utils.encode(this.toBytes(), 'hex').toUpperCase();\n};\n\nmodule.exports = Signature;\n\n},{\"../../elliptic\":267,\"bn.js\":44}],280:[function(_dereq_,module,exports){\nmodule.exports = {\n doubles: {\n step: 4,\n points: [\n [\n 'e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a',\n 'f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821'\n ],\n [\n '8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508',\n '11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf'\n ],\n [\n '175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739',\n 'd3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695'\n ],\n [\n '363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640',\n '4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9'\n ],\n [\n '8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c',\n '4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36'\n ],\n [\n '723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda',\n '96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f'\n ],\n [\n 'eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa',\n '5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999'\n ],\n [\n '100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0',\n 'cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09'\n ],\n [\n 'e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d',\n '9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d'\n ],\n [\n 'feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d',\n 'e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088'\n ],\n [\n 'da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1',\n '9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d'\n ],\n [\n '53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0',\n '5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8'\n ],\n [\n '8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047',\n '10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a'\n ],\n [\n '385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862',\n '283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453'\n ],\n [\n '6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7',\n '7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160'\n ],\n [\n '3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd',\n '56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0'\n ],\n [\n '85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83',\n '7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6'\n ],\n [\n '948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a',\n '53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589'\n ],\n [\n '6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8',\n 'bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17'\n ],\n [\n 'e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d',\n '4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda'\n ],\n [\n 'e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725',\n '7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd'\n ],\n [\n '213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754',\n '4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2'\n ],\n [\n '4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c',\n '17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6'\n ],\n [\n 'fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6',\n '6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f'\n ],\n [\n '76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39',\n 'c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01'\n ],\n [\n 'c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891',\n '893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3'\n ],\n [\n 'd895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b',\n 'febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f'\n ],\n [\n 'b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03',\n '2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7'\n ],\n [\n 'e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d',\n 'eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78'\n ],\n [\n 'a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070',\n '7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1'\n ],\n [\n '90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4',\n 'e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150'\n ],\n [\n '8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da',\n '662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82'\n ],\n [\n 'e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11',\n '1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc'\n ],\n [\n '8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e',\n 'efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b'\n ],\n [\n 'e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41',\n '2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51'\n ],\n [\n 'b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef',\n '67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45'\n ],\n [\n 'd68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8',\n 'db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120'\n ],\n [\n '324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d',\n '648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84'\n ],\n [\n '4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96',\n '35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d'\n ],\n [\n '9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd',\n 'ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d'\n ],\n [\n '6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5',\n '9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8'\n ],\n [\n 'a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266',\n '40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8'\n ],\n [\n '7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71',\n '34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac'\n ],\n [\n '928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac',\n 'c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f'\n ],\n [\n '85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751',\n '1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962'\n ],\n [\n 'ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e',\n '493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907'\n ],\n [\n '827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241',\n 'c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec'\n ],\n [\n 'eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3',\n 'be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d'\n ],\n [\n 'e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f',\n '4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414'\n ],\n [\n '1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19',\n 'aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd'\n ],\n [\n '146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be',\n 'b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0'\n ],\n [\n 'fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9',\n '6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811'\n ],\n [\n 'da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2',\n '8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1'\n ],\n [\n 'a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13',\n '7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c'\n ],\n [\n '174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c',\n 'ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73'\n ],\n [\n '959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba',\n '2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd'\n ],\n [\n 'd2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151',\n 'e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405'\n ],\n [\n '64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073',\n 'd99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589'\n ],\n [\n '8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458',\n '38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e'\n ],\n [\n '13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b',\n '69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27'\n ],\n [\n 'bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366',\n 'd3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1'\n ],\n [\n '8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa',\n '40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482'\n ],\n [\n '8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0',\n '620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945'\n ],\n [\n 'dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787',\n '7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573'\n ],\n [\n 'f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e',\n 'ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82'\n ]\n ]\n },\n naf: {\n wnd: 7,\n points: [\n [\n 'f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9',\n '388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672'\n ],\n [\n '2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4',\n 'd8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6'\n ],\n [\n '5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc',\n '6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da'\n ],\n [\n 'acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe',\n 'cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37'\n ],\n [\n '774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb',\n 'd984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b'\n ],\n [\n 'f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8',\n 'ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81'\n ],\n [\n 'd7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e',\n '581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58'\n ],\n [\n 'defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34',\n '4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77'\n ],\n [\n '2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c',\n '85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a'\n ],\n [\n '352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5',\n '321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c'\n ],\n [\n '2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f',\n '2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67'\n ],\n [\n '9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714',\n '73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402'\n ],\n [\n 'daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729',\n 'a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55'\n ],\n [\n 'c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db',\n '2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482'\n ],\n [\n '6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4',\n 'e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82'\n ],\n [\n '1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5',\n 'b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396'\n ],\n [\n '605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479',\n '2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49'\n ],\n [\n '62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d',\n '80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf'\n ],\n [\n '80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f',\n '1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a'\n ],\n [\n '7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb',\n 'd0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7'\n ],\n [\n 'd528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9',\n 'eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933'\n ],\n [\n '49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963',\n '758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a'\n ],\n [\n '77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74',\n '958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6'\n ],\n [\n 'f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530',\n 'e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37'\n ],\n [\n '463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b',\n '5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e'\n ],\n [\n 'f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247',\n 'cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6'\n ],\n [\n 'caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1',\n 'cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476'\n ],\n [\n '2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120',\n '4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40'\n ],\n [\n '7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435',\n '91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61'\n ],\n [\n '754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18',\n '673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683'\n ],\n [\n 'e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8',\n '59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5'\n ],\n [\n '186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb',\n '3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b'\n ],\n [\n 'df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f',\n '55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417'\n ],\n [\n '5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143',\n 'efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868'\n ],\n [\n '290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba',\n 'e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a'\n ],\n [\n 'af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45',\n 'f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6'\n ],\n [\n '766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a',\n '744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996'\n ],\n [\n '59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e',\n 'c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e'\n ],\n [\n 'f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8',\n 'e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d'\n ],\n [\n '7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c',\n '30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2'\n ],\n [\n '948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519',\n 'e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e'\n ],\n [\n '7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab',\n '100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437'\n ],\n [\n '3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca',\n 'ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311'\n ],\n [\n 'd3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf',\n '8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4'\n ],\n [\n '1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610',\n '68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575'\n ],\n [\n '733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4',\n 'f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d'\n ],\n [\n '15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c',\n 'd56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d'\n ],\n [\n 'a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940',\n 'edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629'\n ],\n [\n 'e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980',\n 'a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06'\n ],\n [\n '311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3',\n '66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374'\n ],\n [\n '34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf',\n '9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee'\n ],\n [\n 'f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63',\n '4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1'\n ],\n [\n 'd7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448',\n 'fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b'\n ],\n [\n '32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf',\n '5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661'\n ],\n [\n '7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5',\n '8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6'\n ],\n [\n 'ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6',\n '8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e'\n ],\n [\n '16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5',\n '5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d'\n ],\n [\n 'eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99',\n 'f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc'\n ],\n [\n '78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51',\n 'f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4'\n ],\n [\n '494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5',\n '42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c'\n ],\n [\n 'a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5',\n '204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b'\n ],\n [\n 'c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997',\n '4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913'\n ],\n [\n '841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881',\n '73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154'\n ],\n [\n '5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5',\n '39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865'\n ],\n [\n '36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66',\n 'd2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc'\n ],\n [\n '336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726',\n 'ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224'\n ],\n [\n '8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede',\n '6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e'\n ],\n [\n '1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94',\n '60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6'\n ],\n [\n '85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31',\n '3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511'\n ],\n [\n '29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51',\n 'b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b'\n ],\n [\n 'a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252',\n 'ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2'\n ],\n [\n '4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5',\n 'cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c'\n ],\n [\n 'd24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b',\n '6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3'\n ],\n [\n 'ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4',\n '322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d'\n ],\n [\n 'af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f',\n '6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700'\n ],\n [\n 'e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889',\n '2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4'\n ],\n [\n '591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246',\n 'b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196'\n ],\n [\n '11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984',\n '998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4'\n ],\n [\n '3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a',\n 'b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257'\n ],\n [\n 'cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030',\n 'bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13'\n ],\n [\n 'c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197',\n '6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096'\n ],\n [\n 'c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593',\n 'c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38'\n ],\n [\n 'a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef',\n '21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f'\n ],\n [\n '347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38',\n '60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448'\n ],\n [\n 'da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a',\n '49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a'\n ],\n [\n 'c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111',\n '5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4'\n ],\n [\n '4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502',\n '7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437'\n ],\n [\n '3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea',\n 'be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7'\n ],\n [\n 'cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26',\n '8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d'\n ],\n [\n 'b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986',\n '39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a'\n ],\n [\n 'd4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e',\n '62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54'\n ],\n [\n '48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4',\n '25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77'\n ],\n [\n 'dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda',\n 'ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517'\n ],\n [\n '6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859',\n 'cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10'\n ],\n [\n 'e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f',\n 'f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125'\n ],\n [\n 'eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c',\n '6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e'\n ],\n [\n '13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942',\n 'fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1'\n ],\n [\n 'ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a',\n '1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2'\n ],\n [\n 'b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80',\n '5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423'\n ],\n [\n 'ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d',\n '438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8'\n ],\n [\n '8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1',\n 'cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758'\n ],\n [\n '52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63',\n 'c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375'\n ],\n [\n 'e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352',\n '6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d'\n ],\n [\n '7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193',\n 'ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec'\n ],\n [\n '5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00',\n '9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0'\n ],\n [\n '32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58',\n 'ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c'\n ],\n [\n 'e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7',\n 'd3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4'\n ],\n [\n '8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8',\n 'c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f'\n ],\n [\n '4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e',\n '67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649'\n ],\n [\n '3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d',\n 'cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826'\n ],\n [\n '674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b',\n '299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5'\n ],\n [\n 'd32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f',\n 'f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87'\n ],\n [\n '30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6',\n '462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b'\n ],\n [\n 'be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297',\n '62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc'\n ],\n [\n '93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a',\n '7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c'\n ],\n [\n 'b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c',\n 'ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f'\n ],\n [\n 'd5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52',\n '4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a'\n ],\n [\n 'd3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb',\n 'bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46'\n ],\n [\n '463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065',\n 'bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f'\n ],\n [\n '7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917',\n '603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03'\n ],\n [\n '74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9',\n 'cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08'\n ],\n [\n '30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3',\n '553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8'\n ],\n [\n '9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57',\n '712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373'\n ],\n [\n '176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66',\n 'ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3'\n ],\n [\n '75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8',\n '9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8'\n ],\n [\n '809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721',\n '9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1'\n ],\n [\n '1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180',\n '4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9'\n ]\n ]\n }\n};\n\n},{}],281:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = exports;\nvar BN = _dereq_('bn.js');\nvar minAssert = _dereq_('minimalistic-assert');\nvar minUtils = _dereq_('minimalistic-crypto-utils');\n\nutils.assert = minAssert;\nutils.toArray = minUtils.toArray;\nutils.zero2 = minUtils.zero2;\nutils.toHex = minUtils.toHex;\nutils.encode = minUtils.encode;\n\n// Represent num in a w-NAF form\nfunction getNAF(num, w) {\n var naf = [];\n var ws = 1 << (w + 1);\n var k = num.clone();\n while (k.cmpn(1) >= 0) {\n var z;\n if (k.isOdd()) {\n var mod = k.andln(ws - 1);\n if (mod > (ws >> 1) - 1)\n z = (ws >> 1) - mod;\n else\n z = mod;\n k.isubn(z);\n } else {\n z = 0;\n }\n naf.push(z);\n\n // Optimization, shift by word if possible\n var shift = (k.cmpn(0) !== 0 && k.andln(ws - 1) === 0) ? (w + 1) : 1;\n for (var i = 1; i < shift; i++)\n naf.push(0);\n k.iushrn(shift);\n }\n\n return naf;\n}\nutils.getNAF = getNAF;\n\n// Represent k1, k2 in a Joint Sparse Form\nfunction getJSF(k1, k2) {\n var jsf = [\n [],\n []\n ];\n\n k1 = k1.clone();\n k2 = k2.clone();\n var d1 = 0;\n var d2 = 0;\n while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {\n\n // First phase\n var m14 = (k1.andln(3) + d1) & 3;\n var m24 = (k2.andln(3) + d2) & 3;\n if (m14 === 3)\n m14 = -1;\n if (m24 === 3)\n m24 = -1;\n var u1;\n if ((m14 & 1) === 0) {\n u1 = 0;\n } else {\n var m8 = (k1.andln(7) + d1) & 7;\n if ((m8 === 3 || m8 === 5) && m24 === 2)\n u1 = -m14;\n else\n u1 = m14;\n }\n jsf[0].push(u1);\n\n var u2;\n if ((m24 & 1) === 0) {\n u2 = 0;\n } else {\n var m8 = (k2.andln(7) + d2) & 7;\n if ((m8 === 3 || m8 === 5) && m14 === 2)\n u2 = -m24;\n else\n u2 = m24;\n }\n jsf[1].push(u2);\n\n // Second phase\n if (2 * d1 === u1 + 1)\n d1 = 1 - d1;\n if (2 * d2 === u2 + 1)\n d2 = 1 - d2;\n k1.iushrn(1);\n k2.iushrn(1);\n }\n\n return jsf;\n}\nutils.getJSF = getJSF;\n\nfunction cachedProperty(obj, name, computer) {\n var key = '_' + name;\n obj.prototype[name] = function cachedProperty() {\n return this[key] !== undefined ? this[key] :\n this[key] = computer.call(this);\n };\n}\nutils.cachedProperty = cachedProperty;\n\nfunction parseBytes(bytes) {\n return typeof bytes === 'string' ? utils.toArray(bytes, 'hex') :\n bytes;\n}\nutils.parseBytes = parseBytes;\n\nfunction intFromLE(bytes) {\n return new BN(bytes, 'hex', 'le');\n}\nutils.intFromLE = intFromLE;\n\n\n},{\"bn.js\":44,\"minimalistic-assert\":299,\"minimalistic-crypto-utils\":300}],282:[function(_dereq_,module,exports){\nmodule.exports={\n \"_args\": [\n [\n \"github:openpgpjs/elliptic\",\n \"/Users/sunny/Desktop/Protonmail/openpgpjs\"\n ]\n ],\n \"_from\": \"github:openpgpjs/elliptic\",\n \"_id\": \"elliptic@github:openpgpjs/elliptic#e187e706e11fa51bcd20e46e5119054be4e2a4a6\",\n \"_inBundle\": false,\n \"_integrity\": \"\",\n \"_location\": \"/elliptic\",\n \"_phantomChildren\": {},\n \"_requested\": {\n \"type\": \"git\",\n \"raw\": \"github:openpgpjs/elliptic\",\n \"rawSpec\": \"github:openpgpjs/elliptic\",\n \"saveSpec\": \"github:openpgpjs/elliptic\",\n \"fetchSpec\": null,\n \"gitCommittish\": null\n },\n \"_requiredBy\": [\n \"/\"\n ],\n \"_resolved\": \"github:openpgpjs/elliptic#e187e706e11fa51bcd20e46e5119054be4e2a4a6\",\n \"_spec\": \"github:openpgpjs/elliptic\",\n \"_where\": \"/Users/sunny/Desktop/Protonmail/openpgpjs\",\n \"author\": {\n \"name\": \"Fedor Indutny\",\n \"email\": \"fedor@indutny.com\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/indutny/elliptic/issues\"\n },\n \"dependencies\": {\n \"bn.js\": \"^4.4.0\",\n \"brorand\": \"^1.0.1\",\n \"hash.js\": \"^1.0.0\",\n \"hmac-drbg\": \"^1.0.0\",\n \"inherits\": \"^2.0.1\",\n \"minimalistic-assert\": \"^1.0.0\",\n \"minimalistic-crypto-utils\": \"^1.0.0\"\n },\n \"description\": \"EC cryptography\",\n \"devDependencies\": {\n \"brfs\": \"^1.4.3\",\n \"coveralls\": \"^2.11.3\",\n \"grunt\": \"^0.4.5\",\n \"grunt-browserify\": \"^5.0.0\",\n \"grunt-cli\": \"^1.2.0\",\n \"grunt-contrib-connect\": \"^1.0.0\",\n \"grunt-contrib-copy\": \"^1.0.0\",\n \"grunt-contrib-uglify\": \"^1.0.1\",\n \"grunt-mocha-istanbul\": \"^3.0.1\",\n \"grunt-saucelabs\": \"^8.6.2\",\n \"istanbul\": \"^0.4.2\",\n \"jscs\": \"^2.9.0\",\n \"jshint\": \"^2.6.0\",\n \"mocha\": \"^2.1.0\"\n },\n \"files\": [\n \"lib\"\n ],\n \"homepage\": \"https://github.com/indutny/elliptic\",\n \"keywords\": [\n \"EC\",\n \"Elliptic\",\n \"curve\",\n \"Cryptography\"\n ],\n \"license\": \"MIT\",\n \"main\": \"lib/elliptic.js\",\n \"name\": \"elliptic\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+ssh://git@github.com/indutny/elliptic.git\"\n },\n \"scripts\": {\n \"jscs\": \"jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js\",\n \"jshint\": \"jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js\",\n \"lint\": \"npm run jscs && npm run jshint\",\n \"test\": \"npm run lint && npm run unit\",\n \"unit\": \"istanbul test _mocha --reporter=spec test/index.js\",\n \"version\": \"grunt dist && git add dist/\"\n },\n \"version\": \"6.4.0\"\n}\n\n},{}],283:[function(_dereq_,module,exports){\n\n// email-addresses.js - RFC 5322 email address parser\n// v 3.0.1\n//\n// http://tools.ietf.org/html/rfc5322\n//\n// This library does not validate email addresses.\n// emailAddresses attempts to parse addresses using the (fairly liberal)\n// grammar specified in RFC 5322.\n//\n// email-addresses returns {\n// ast: <an abstract syntax tree based on rfc5322>,\n// addresses: [{\n// node: <node in ast for this address>,\n// name: <display-name>,\n// address: <addr-spec>,\n// local: <local-part>,\n// domain: <domain>\n// }, ...]\n// }\n//\n// emailAddresses.parseOneAddress and emailAddresses.parseAddressList\n// work as you might expect. Try it out.\n//\n// Many thanks to Dominic Sayers and his documentation on the is_email function,\n// http://code.google.com/p/isemail/ , which helped greatly in writing this parser.\n\n(function (global) {\n\"use strict\";\n\nfunction parse5322(opts) {\n\n // tokenizing functions\n\n function inStr() { return pos < len; }\n function curTok() { return parseString[pos]; }\n function getPos() { return pos; }\n function setPos(i) { pos = i; }\n function nextTok() { pos += 1; }\n function initialize() {\n pos = 0;\n len = parseString.length;\n }\n\n // parser helper functions\n\n function o(name, value) {\n return {\n name: name,\n tokens: value || \"\",\n semantic: value || \"\",\n children: []\n };\n }\n\n function wrap(name, ast) {\n var n;\n if (ast === null) { return null; }\n n = o(name);\n n.tokens = ast.tokens;\n n.semantic = ast.semantic;\n n.children.push(ast);\n return n;\n }\n\n function add(parent, child) {\n if (child !== null) {\n parent.tokens += child.tokens;\n parent.semantic += child.semantic;\n }\n parent.children.push(child);\n return parent;\n }\n\n function compareToken(fxnCompare) {\n var tok;\n if (!inStr()) { return null; }\n tok = curTok();\n if (fxnCompare(tok)) {\n nextTok();\n return o('token', tok);\n }\n return null;\n }\n\n function literal(lit) {\n return function literalFunc() {\n return wrap('literal', compareToken(function (tok) {\n return tok === lit;\n }));\n };\n }\n\n function and() {\n var args = arguments;\n return function andFunc() {\n var i, s, result, start;\n start = getPos();\n s = o('and');\n for (i = 0; i < args.length; i += 1) {\n result = args[i]();\n if (result === null) {\n setPos(start);\n return null;\n }\n add(s, result);\n }\n return s;\n };\n }\n\n function or() {\n var args = arguments;\n return function orFunc() {\n var i, result, start;\n start = getPos();\n for (i = 0; i < args.length; i += 1) {\n result = args[i]();\n if (result !== null) {\n return result;\n }\n setPos(start);\n }\n return null;\n };\n }\n\n function opt(prod) {\n return function optFunc() {\n var result, start;\n start = getPos();\n result = prod();\n if (result !== null) {\n return result;\n }\n else {\n setPos(start);\n return o('opt');\n }\n };\n }\n\n function invis(prod) {\n return function invisFunc() {\n var result = prod();\n if (result !== null) {\n result.semantic = \"\";\n }\n return result;\n };\n }\n\n function colwsp(prod) {\n return function collapseSemanticWhitespace() {\n var result = prod();\n if (result !== null && result.semantic.length > 0) {\n result.semantic = \" \";\n }\n return result;\n };\n }\n\n function star(prod, minimum) {\n return function starFunc() {\n var s, result, count, start, min;\n start = getPos();\n s = o('star');\n count = 0;\n min = minimum === undefined ? 0 : minimum;\n while ((result = prod()) !== null) {\n count = count + 1;\n add(s, result);\n }\n if (count >= min) {\n return s;\n }\n else {\n setPos(start);\n return null;\n }\n };\n }\n\n // One expects names to get normalized like this:\n // \" First Last \" -> \"First Last\"\n // \"First Last\" -> \"First Last\"\n // \"First Last\" -> \"First Last\"\n function collapseWhitespace(s) {\n return s.replace(/([ \\t]|\\r\\n)+/g, ' ').replace(/^\\s*/, '').replace(/\\s*$/, '');\n }\n\n // UTF-8 pseudo-production (RFC 6532)\n // RFC 6532 extends RFC 5322 productions to include UTF-8\n // using the following productions:\n // UTF8-non-ascii = UTF8-2 / UTF8-3 / UTF8-4\n // UTF8-2 = <Defined in Section 4 of RFC3629>\n // UTF8-3 = <Defined in Section 4 of RFC3629>\n // UTF8-4 = <Defined in Section 4 of RFC3629>\n //\n // For reference, the extended RFC 5322 productions are:\n // VCHAR =/ UTF8-non-ascii\n // ctext =/ UTF8-non-ascii\n // atext =/ UTF8-non-ascii\n // qtext =/ UTF8-non-ascii\n // dtext =/ UTF8-non-ascii\n function isUTF8NonAscii(tok) {\n // In JavaScript, we just deal directly with Unicode code points,\n // so we aren't checking individual bytes for UTF-8 encoding.\n // Just check that the character is non-ascii.\n return tok.charCodeAt(0) >= 128;\n }\n\n\n // common productions (RFC 5234)\n // http://tools.ietf.org/html/rfc5234\n // B.1. Core Rules\n\n // CR = %x0D\n // ; carriage return\n function cr() { return wrap('cr', literal('\\r')()); }\n\n // CRLF = CR LF\n // ; Internet standard newline\n function crlf() { return wrap('crlf', and(cr, lf)()); }\n\n // DQUOTE = %x22\n // ; \" (Double Quote)\n function dquote() { return wrap('dquote', literal('\"')()); }\n\n // HTAB = %x09\n // ; horizontal tab\n function htab() { return wrap('htab', literal('\\t')()); }\n\n // LF = %x0A\n // ; linefeed\n function lf() { return wrap('lf', literal('\\n')()); }\n\n // SP = %x20\n function sp() { return wrap('sp', literal(' ')()); }\n\n // VCHAR = %x21-7E\n // ; visible (printing) characters\n function vchar() {\n return wrap('vchar', compareToken(function vcharFunc(tok) {\n var code = tok.charCodeAt(0);\n var accept = (0x21 <= code && code <= 0x7E);\n if (opts.rfc6532) {\n accept = accept || isUTF8NonAscii(tok);\n }\n return accept;\n }));\n }\n\n // WSP = SP / HTAB\n // ; white space\n function wsp() { return wrap('wsp', or(sp, htab)()); }\n\n\n // email productions (RFC 5322)\n // http://tools.ietf.org/html/rfc5322\n // 3.2.1. Quoted characters\n\n // quoted-pair = (\"\\\" (VCHAR / WSP)) / obs-qp\n function quotedPair() {\n var qp = wrap('quoted-pair',\n or(\n and(literal('\\\\'), or(vchar, wsp)),\n obsQP\n )());\n if (qp === null) { return null; }\n // a quoted pair will be two characters, and the \"\\\" character\n // should be semantically \"invisible\" (RFC 5322 3.2.1)\n qp.semantic = qp.semantic[1];\n return qp;\n }\n\n // 3.2.2. Folding White Space and Comments\n\n // FWS = ([*WSP CRLF] 1*WSP) / obs-FWS\n function fws() {\n return wrap('fws', or(\n obsFws,\n and(\n opt(and(\n star(wsp),\n invis(crlf)\n )),\n star(wsp, 1)\n )\n )());\n }\n\n // ctext = %d33-39 / ; Printable US-ASCII\n // %d42-91 / ; characters not including\n // %d93-126 / ; \"(\", \")\", or \"\\\"\n // obs-ctext\n function ctext() {\n return wrap('ctext', or(\n function ctextFunc1() {\n return compareToken(function ctextFunc2(tok) {\n var code = tok.charCodeAt(0);\n var accept =\n (33 <= code && code <= 39) ||\n (42 <= code && code <= 91) ||\n (93 <= code && code <= 126);\n if (opts.rfc6532) {\n accept = accept || isUTF8NonAscii(tok);\n }\n return accept;\n });\n },\n obsCtext\n )());\n }\n\n // ccontent = ctext / quoted-pair / comment\n function ccontent() {\n return wrap('ccontent', or(ctext, quotedPair, comment)());\n }\n\n // comment = \"(\" *([FWS] ccontent) [FWS] \")\"\n function comment() {\n return wrap('comment', and(\n literal('('),\n star(and(opt(fws), ccontent)),\n opt(fws),\n literal(')')\n )());\n }\n\n // CFWS = (1*([FWS] comment) [FWS]) / FWS\n function cfws() {\n return wrap('cfws', or(\n and(\n star(\n and(opt(fws), comment),\n 1\n ),\n opt(fws)\n ),\n fws\n )());\n }\n\n // 3.2.3. Atom\n\n //atext = ALPHA / DIGIT / ; Printable US-ASCII\n // \"!\" / \"#\" / ; characters not including\n // \"$\" / \"%\" / ; specials. Used for atoms.\n // \"&\" / \"'\" /\n // \"*\" / \"+\" /\n // \"-\" / \"/\" /\n // \"=\" / \"?\" /\n // \"^\" / \"_\" /\n // \"`\" / \"{\" /\n // \"|\" / \"}\" /\n // \"~\"\n function atext() {\n return wrap('atext', compareToken(function atextFunc(tok) {\n var accept =\n ('a' <= tok && tok <= 'z') ||\n ('A' <= tok && tok <= 'Z') ||\n ('0' <= tok && tok <= '9') ||\n (['!', '#', '$', '%', '&', '\\'', '*', '+', '-', '/',\n '=', '?', '^', '_', '`', '{', '|', '}', '~'].indexOf(tok) >= 0);\n if (opts.rfc6532) {\n accept = accept || isUTF8NonAscii(tok);\n }\n return accept;\n }));\n }\n\n // atom = [CFWS] 1*atext [CFWS]\n function atom() {\n return wrap('atom', and(colwsp(opt(cfws)), star(atext, 1), colwsp(opt(cfws)))());\n }\n\n // dot-atom-text = 1*atext *(\".\" 1*atext)\n function dotAtomText() {\n var s, maybeText;\n s = wrap('dot-atom-text', star(atext, 1)());\n if (s === null) { return s; }\n maybeText = star(and(literal('.'), star(atext, 1)))();\n if (maybeText !== null) {\n add(s, maybeText);\n }\n return s;\n }\n\n // dot-atom = [CFWS] dot-atom-text [CFWS]\n function dotAtom() {\n return wrap('dot-atom', and(invis(opt(cfws)), dotAtomText, invis(opt(cfws)))());\n }\n\n // 3.2.4. Quoted Strings\n\n // qtext = %d33 / ; Printable US-ASCII\n // %d35-91 / ; characters not including\n // %d93-126 / ; \"\\\" or the quote character\n // obs-qtext\n function qtext() {\n return wrap('qtext', or(\n function qtextFunc1() {\n return compareToken(function qtextFunc2(tok) {\n var code = tok.charCodeAt(0);\n var accept =\n (33 === code) ||\n (35 <= code && code <= 91) ||\n (93 <= code && code <= 126);\n if (opts.rfc6532) {\n accept = accept || isUTF8NonAscii(tok);\n }\n return accept;\n });\n },\n obsQtext\n )());\n }\n\n // qcontent = qtext / quoted-pair\n function qcontent() {\n return wrap('qcontent', or(qtext, quotedPair)());\n }\n\n // quoted-string = [CFWS]\n // DQUOTE *([FWS] qcontent) [FWS] DQUOTE\n // [CFWS]\n function quotedString() {\n return wrap('quoted-string', and(\n invis(opt(cfws)),\n invis(dquote), star(and(opt(colwsp(fws)), qcontent)), opt(invis(fws)), invis(dquote),\n invis(opt(cfws))\n )());\n }\n\n // 3.2.5 Miscellaneous Tokens\n\n // word = atom / quoted-string\n function word() {\n return wrap('word', or(atom, quotedString)());\n }\n\n // phrase = 1*word / obs-phrase\n function phrase() {\n return wrap('phrase', or(obsPhrase, star(word, 1))());\n }\n\n // 3.4. Address Specification\n // address = mailbox / group\n function address() {\n return wrap('address', or(mailbox, group)());\n }\n\n // mailbox = name-addr / addr-spec\n function mailbox() {\n return wrap('mailbox', or(nameAddr, addrSpec)());\n }\n\n // name-addr = [display-name] angle-addr\n function nameAddr() {\n return wrap('name-addr', and(opt(displayName), angleAddr)());\n }\n\n // angle-addr = [CFWS] \"<\" addr-spec \">\" [CFWS] /\n // obs-angle-addr\n function angleAddr() {\n return wrap('angle-addr', or(\n and(\n invis(opt(cfws)),\n literal('<'),\n addrSpec,\n literal('>'),\n invis(opt(cfws))\n ),\n obsAngleAddr\n )());\n }\n\n // group = display-name \":\" [group-list] \";\" [CFWS]\n function group() {\n return wrap('group', and(\n displayName,\n literal(':'),\n opt(groupList),\n literal(';'),\n invis(opt(cfws))\n )());\n }\n\n // display-name = phrase\n function displayName() {\n return wrap('display-name', function phraseFixedSemantic() {\n var result = phrase();\n if (result !== null) {\n result.semantic = collapseWhitespace(result.semantic);\n }\n return result;\n }());\n }\n\n // mailbox-list = (mailbox *(\",\" mailbox)) / obs-mbox-list\n function mailboxList() {\n return wrap('mailbox-list', or(\n and(\n mailbox,\n star(and(literal(','), mailbox))\n ),\n obsMboxList\n )());\n }\n\n // address-list = (address *(\",\" address)) / obs-addr-list\n function addressList() {\n return wrap('address-list', or(\n and(\n address,\n star(and(literal(','), address))\n ),\n obsAddrList\n )());\n }\n\n // group-list = mailbox-list / CFWS / obs-group-list\n function groupList() {\n return wrap('group-list', or(\n mailboxList,\n invis(cfws),\n obsGroupList\n )());\n }\n\n // 3.4.1 Addr-Spec Specification\n\n // local-part = dot-atom / quoted-string / obs-local-part\n function localPart() {\n // note: quoted-string, dotAtom are proper subsets of obs-local-part\n // so we really just have to look for obsLocalPart, if we don't care about the exact parse tree\n return wrap('local-part', or(obsLocalPart, dotAtom, quotedString)());\n }\n\n // dtext = %d33-90 / ; Printable US-ASCII\n // %d94-126 / ; characters not including\n // obs-dtext ; \"[\", \"]\", or \"\\\"\n function dtext() {\n return wrap('dtext', or(\n function dtextFunc1() {\n return compareToken(function dtextFunc2(tok) {\n var code = tok.charCodeAt(0);\n var accept =\n (33 <= code && code <= 90) ||\n (94 <= code && code <= 126);\n if (opts.rfc6532) {\n accept = accept || isUTF8NonAscii(tok);\n }\n return accept;\n });\n },\n obsDtext\n )()\n );\n }\n\n // domain-literal = [CFWS] \"[\" *([FWS] dtext) [FWS] \"]\" [CFWS]\n function domainLiteral() {\n return wrap('domain-literal', and(\n invis(opt(cfws)),\n literal('['),\n star(and(opt(fws), dtext)),\n opt(fws),\n literal(']'),\n invis(opt(cfws))\n )());\n }\n\n // domain = dot-atom / domain-literal / obs-domain\n function domain() {\n return wrap('domain', function domainCheckTLD() {\n var result = or(obsDomain, dotAtom, domainLiteral)();\n if (opts.rejectTLD) {\n if (result.semantic.indexOf('.') < 0) {\n return null;\n }\n }\n // strip all whitespace from domains\n if (result) {\n result.semantic = result.semantic.replace(/\\s+/g, '');\n }\n return result;\n }());\n }\n\n // addr-spec = local-part \"@\" domain\n function addrSpec() {\n return wrap('addr-spec', and(\n localPart, literal('@'), domain\n )());\n }\n\n // 3.6.2 Originator Fields\n // Below we only parse the field body, not the name of the field\n // like \"From:\", \"Sender:\", or \"Reply-To:\". Other libraries that\n // parse email headers can parse those and defer to these productions\n // for the \"RFC 5322\" part.\n\n // RFC 6854 2.1. Replacement of RFC 5322, Section 3.6.2. Originator Fields\n // from = \"From:\" (mailbox-list / address-list) CRLF\n function fromSpec() {\n return wrap('from', or(\n mailboxList,\n addressList\n )());\n }\n\n // RFC 6854 2.1. Replacement of RFC 5322, Section 3.6.2. Originator Fields\n // sender = \"Sender:\" (mailbox / address) CRLF\n function senderSpec() {\n return wrap('sender', or(\n mailbox,\n address\n )());\n }\n\n // RFC 6854 2.1. Replacement of RFC 5322, Section 3.6.2. Originator Fields\n // reply-to = \"Reply-To:\" address-list CRLF\n function replyToSpec() {\n return wrap('reply-to', addressList());\n }\n\n // 4.1. Miscellaneous Obsolete Tokens\n\n // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control\n // %d11 / ; characters that do not\n // %d12 / ; include the carriage\n // %d14-31 / ; return, line feed, and\n // %d127 ; white space characters\n function obsNoWsCtl() {\n return opts.strict ? null : wrap('obs-NO-WS-CTL', compareToken(function (tok) {\n var code = tok.charCodeAt(0);\n return ((1 <= code && code <= 8) ||\n (11 === code || 12 === code) ||\n (14 <= code && code <= 31) ||\n (127 === code));\n }));\n }\n\n // obs-ctext = obs-NO-WS-CTL\n function obsCtext() { return opts.strict ? null : wrap('obs-ctext', obsNoWsCtl()); }\n\n // obs-qtext = obs-NO-WS-CTL\n function obsQtext() { return opts.strict ? null : wrap('obs-qtext', obsNoWsCtl()); }\n\n // obs-qp = \"\\\" (%d0 / obs-NO-WS-CTL / LF / CR)\n function obsQP() {\n return opts.strict ? null : wrap('obs-qp', and(\n literal('\\\\'),\n or(literal('\\0'), obsNoWsCtl, lf, cr)\n )());\n }\n\n // obs-phrase = word *(word / \".\" / CFWS)\n function obsPhrase() {\n return opts.strict ? null : wrap('obs-phrase', and(\n word,\n star(or(word, literal('.'), colwsp(cfws)))\n )());\n }\n\n // 4.2. Obsolete Folding White Space\n\n // NOTE: read the errata http://www.rfc-editor.org/errata_search.php?rfc=5322&eid=1908\n // obs-FWS = 1*([CRLF] WSP)\n function obsFws() {\n return opts.strict ? null : wrap('obs-FWS', star(\n and(invis(opt(crlf)), wsp),\n 1\n )());\n }\n\n // 4.4. Obsolete Addressing\n\n // obs-angle-addr = [CFWS] \"<\" obs-route addr-spec \">\" [CFWS]\n function obsAngleAddr() {\n return opts.strict ? null : wrap('obs-angle-addr', and(\n invis(opt(cfws)),\n literal('<'),\n obsRoute,\n addrSpec,\n literal('>'),\n invis(opt(cfws))\n )());\n }\n\n // obs-route = obs-domain-list \":\"\n function obsRoute() {\n return opts.strict ? null : wrap('obs-route', and(\n obsDomainList,\n literal(':')\n )());\n }\n\n // obs-domain-list = *(CFWS / \",\") \"@\" domain\n // *(\",\" [CFWS] [\"@\" domain])\n function obsDomainList() {\n return opts.strict ? null : wrap('obs-domain-list', and(\n star(or(invis(cfws), literal(','))),\n literal('@'),\n domain,\n star(and(\n literal(','),\n invis(opt(cfws)),\n opt(and(literal('@'), domain))\n ))\n )());\n }\n\n // obs-mbox-list = *([CFWS] \",\") mailbox *(\",\" [mailbox / CFWS])\n function obsMboxList() {\n return opts.strict ? null : wrap('obs-mbox-list', and(\n star(and(\n invis(opt(cfws)),\n literal(',')\n )),\n mailbox,\n star(and(\n literal(','),\n opt(and(\n mailbox,\n invis(cfws)\n ))\n ))\n )());\n }\n\n // obs-addr-list = *([CFWS] \",\") address *(\",\" [address / CFWS])\n function obsAddrList() {\n return opts.strict ? null : wrap('obs-addr-list', and(\n star(and(\n invis(opt(cfws)),\n literal(',')\n )),\n address,\n star(and(\n literal(','),\n opt(and(\n address,\n invis(cfws)\n ))\n ))\n )());\n }\n\n // obs-group-list = 1*([CFWS] \",\") [CFWS]\n function obsGroupList() {\n return opts.strict ? null : wrap('obs-group-list', and(\n star(and(\n invis(opt(cfws)),\n literal(',')\n ), 1),\n invis(opt(cfws))\n )());\n }\n\n // obs-local-part = word *(\".\" word)\n function obsLocalPart() {\n return opts.strict ? null : wrap('obs-local-part', and(word, star(and(literal('.'), word)))());\n }\n\n // obs-domain = atom *(\".\" atom)\n function obsDomain() {\n return opts.strict ? null : wrap('obs-domain', and(atom, star(and(literal('.'), atom)))());\n }\n\n // obs-dtext = obs-NO-WS-CTL / quoted-pair\n function obsDtext() {\n return opts.strict ? null : wrap('obs-dtext', or(obsNoWsCtl, quotedPair)());\n }\n\n /////////////////////////////////////////////////////\n\n // ast analysis\n\n function findNode(name, root) {\n var i, stack, node;\n if (root === null || root === undefined) { return null; }\n stack = [root];\n while (stack.length > 0) {\n node = stack.pop();\n if (node.name === name) {\n return node;\n }\n for (i = node.children.length - 1; i >= 0; i -= 1) {\n stack.push(node.children[i]);\n }\n }\n return null;\n }\n\n function findAllNodes(name, root) {\n var i, stack, node, result;\n if (root === null || root === undefined) { return null; }\n stack = [root];\n result = [];\n while (stack.length > 0) {\n node = stack.pop();\n if (node.name === name) {\n result.push(node);\n }\n for (i = node.children.length - 1; i >= 0; i -= 1) {\n stack.push(node.children[i]);\n }\n }\n return result;\n }\n\n function findAllNodesNoChildren(names, root) {\n var i, stack, node, result, namesLookup;\n if (root === null || root === undefined) { return null; }\n stack = [root];\n result = [];\n namesLookup = {};\n for (i = 0; i < names.length; i += 1) {\n namesLookup[names[i]] = true;\n }\n\n while (stack.length > 0) {\n node = stack.pop();\n if (node.name in namesLookup) {\n result.push(node);\n // don't look at children (hence findAllNodesNoChildren)\n } else {\n for (i = node.children.length - 1; i >= 0; i -= 1) {\n stack.push(node.children[i]);\n }\n }\n }\n return result;\n }\n\n function giveResult(ast) {\n var addresses, groupsAndMailboxes, i, groupOrMailbox, result;\n if (ast === null) {\n return null;\n }\n addresses = [];\n\n // An address is a 'group' (i.e. a list of mailboxes) or a 'mailbox'.\n groupsAndMailboxes = findAllNodesNoChildren(['group', 'mailbox'], ast);\n for (i = 0; i < groupsAndMailboxes.length; i += 1) {\n groupOrMailbox = groupsAndMailboxes[i];\n if (groupOrMailbox.name === 'group') {\n addresses.push(giveResultGroup(groupOrMailbox));\n } else if (groupOrMailbox.name === 'mailbox') {\n addresses.push(giveResultMailbox(groupOrMailbox));\n }\n }\n\n result = {\n ast: ast,\n addresses: addresses,\n };\n if (opts.simple) {\n result = simplifyResult(result);\n }\n if (opts.oneResult) {\n return oneResult(result);\n }\n if (opts.simple) {\n return result && result.addresses;\n } else {\n return result;\n }\n }\n\n function giveResultGroup(group) {\n var i;\n var groupName = findNode('display-name', group);\n var groupResultMailboxes = [];\n var mailboxes = findAllNodesNoChildren(['mailbox'], group);\n for (i = 0; i < mailboxes.length; i += 1) {\n groupResultMailboxes.push(giveResultMailbox(mailboxes[i]));\n }\n return {\n node: group,\n parts: {\n name: groupName,\n },\n type: group.name, // 'group'\n name: grabSemantic(groupName),\n addresses: groupResultMailboxes,\n };\n }\n\n function giveResultMailbox(mailbox) {\n var name = findNode('display-name', mailbox);\n var aspec = findNode('addr-spec', mailbox);\n var comments = findAllNodes('cfws', mailbox);\n\n var local = findNode('local-part', aspec);\n var domain = findNode('domain', aspec);\n return {\n node: mailbox,\n parts: {\n name: name,\n address: aspec,\n local: local,\n domain: domain,\n comments: comments\n },\n type: mailbox.name, // 'mailbox'\n name: grabSemantic(name),\n address: grabSemantic(aspec),\n local: grabSemantic(local),\n domain: grabSemantic(domain),\n groupName: grabSemantic(mailbox.groupName),\n };\n }\n\n function grabSemantic(n) {\n return n !== null && n !== undefined ? n.semantic : null;\n }\n\n function simplifyResult(result) {\n var i;\n if (result && result.addresses) {\n for (i = 0; i < result.addresses.length; i += 1) {\n delete result.addresses[i].node;\n }\n }\n return result;\n }\n\n function oneResult(result) {\n if (!result) { return null; }\n if (!opts.partial && result.addresses.length > 1) { return null; }\n return result.addresses && result.addresses[0];\n }\n\n /////////////////////////////////////////////////////\n\n var parseString, pos, len, parsed, startProduction;\n\n opts = handleOpts(opts, {});\n if (opts === null) { return null; }\n\n parseString = opts.input;\n\n startProduction = {\n 'address': address,\n 'address-list': addressList,\n 'angle-addr': angleAddr,\n 'from': fromSpec,\n 'group': group,\n 'mailbox': mailbox,\n 'mailbox-list': mailboxList,\n 'reply-to': replyToSpec,\n 'sender': senderSpec,\n }[opts.startAt] || addressList;\n\n if (!opts.strict) {\n initialize();\n opts.strict = true;\n parsed = startProduction(parseString);\n if (opts.partial || !inStr()) {\n return giveResult(parsed);\n }\n opts.strict = false;\n }\n\n initialize();\n parsed = startProduction(parseString);\n if (!opts.partial && inStr()) { return null; }\n return giveResult(parsed);\n}\n\nfunction parseOneAddressSimple(opts) {\n return parse5322(handleOpts(opts, {\n oneResult: true,\n rfc6532: true,\n simple: true,\n startAt: 'address-list',\n }));\n}\n\nfunction parseAddressListSimple(opts) {\n return parse5322(handleOpts(opts, {\n rfc6532: true,\n simple: true,\n startAt: 'address-list',\n }));\n}\n\nfunction parseFromSimple(opts) {\n return parse5322(handleOpts(opts, {\n rfc6532: true,\n simple: true,\n startAt: 'from',\n }));\n}\n\nfunction parseSenderSimple(opts) {\n return parse5322(handleOpts(opts, {\n oneResult: true,\n rfc6532: true,\n simple: true,\n startAt: 'sender',\n }));\n}\n\nfunction parseReplyToSimple(opts) {\n return parse5322(handleOpts(opts, {\n rfc6532: true,\n simple: true,\n startAt: 'reply-to',\n }));\n}\n\nfunction handleOpts(opts, defs) {\n function isString(str) {\n return Object.prototype.toString.call(str) === '[object String]';\n }\n\n function isObject(o) {\n return o === Object(o);\n }\n\n function isNullUndef(o) {\n return o === null || o === undefined;\n }\n\n var defaults, o;\n\n if (isString(opts)) {\n opts = { input: opts };\n } else if (!isObject(opts)) {\n return null;\n }\n\n if (!isString(opts.input)) { return null; }\n if (!defs) { return null; }\n\n defaults = {\n oneResult: false,\n partial: false,\n rejectTLD: false,\n rfc6532: false,\n simple: false,\n startAt: 'address-list',\n strict: false,\n };\n\n for (o in defaults) {\n if (isNullUndef(opts[o])) {\n opts[o] = !isNullUndef(defs[o]) ? defs[o] : defaults[o];\n }\n }\n return opts;\n}\n\nparse5322.parseOneAddress = parseOneAddressSimple;\nparse5322.parseAddressList = parseAddressListSimple;\nparse5322.parseFrom = parseFromSimple;\nparse5322.parseSender = parseSenderSimple;\nparse5322.parseReplyTo = parseReplyToSimple;\n\nif (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n module.exports = parse5322;\n} else {\n global.emailAddresses = parse5322;\n}\n\n}(this));\n\n},{}],284:[function(_dereq_,module,exports){\nvar hash = exports;\n\nhash.utils = _dereq_('./hash/utils');\nhash.common = _dereq_('./hash/common');\nhash.sha = _dereq_('./hash/sha');\nhash.ripemd = _dereq_('./hash/ripemd');\nhash.hmac = _dereq_('./hash/hmac');\n\n// Proxy hash functions to the main object\nhash.sha1 = hash.sha.sha1;\nhash.sha256 = hash.sha.sha256;\nhash.sha224 = hash.sha.sha224;\nhash.sha384 = hash.sha.sha384;\nhash.sha512 = hash.sha.sha512;\nhash.ripemd160 = hash.ripemd.ripemd160;\n\n},{\"./hash/common\":285,\"./hash/hmac\":286,\"./hash/ripemd\":287,\"./hash/sha\":288,\"./hash/utils\":295}],285:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('./utils');\nvar assert = _dereq_('minimalistic-assert');\n\nfunction BlockHash() {\n this.pending = null;\n this.pendingTotal = 0;\n this.blockSize = this.constructor.blockSize;\n this.outSize = this.constructor.outSize;\n this.hmacStrength = this.constructor.hmacStrength;\n this.padLength = this.constructor.padLength / 8;\n this.endian = 'big';\n\n this._delta8 = this.blockSize / 8;\n this._delta32 = this.blockSize / 32;\n}\nexports.BlockHash = BlockHash;\n\nBlockHash.prototype.update = function update(msg, enc) {\n // Convert message to array, pad it, and join into 32bit blocks\n msg = utils.toArray(msg, enc);\n if (!this.pending)\n this.pending = msg;\n else\n this.pending = this.pending.concat(msg);\n this.pendingTotal += msg.length;\n\n // Enough data, try updating\n if (this.pending.length >= this._delta8) {\n msg = this.pending;\n\n // Process pending data in blocks\n var r = msg.length % this._delta8;\n this.pending = msg.slice(msg.length - r, msg.length);\n if (this.pending.length === 0)\n this.pending = null;\n\n msg = utils.join32(msg, 0, msg.length - r, this.endian);\n for (var i = 0; i < msg.length; i += this._delta32)\n this._update(msg, i, i + this._delta32);\n }\n\n return this;\n};\n\nBlockHash.prototype.digest = function digest(enc) {\n this.update(this._pad());\n assert(this.pending === null);\n\n return this._digest(enc);\n};\n\nBlockHash.prototype._pad = function pad() {\n var len = this.pendingTotal;\n var bytes = this._delta8;\n var k = bytes - ((len + this.padLength) % bytes);\n var res = new Array(k + this.padLength);\n res[0] = 0x80;\n for (var i = 1; i < k; i++)\n res[i] = 0;\n\n // Append length\n len <<= 3;\n if (this.endian === 'big') {\n for (var t = 8; t < this.padLength; t++)\n res[i++] = 0;\n\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = (len >>> 24) & 0xff;\n res[i++] = (len >>> 16) & 0xff;\n res[i++] = (len >>> 8) & 0xff;\n res[i++] = len & 0xff;\n } else {\n res[i++] = len & 0xff;\n res[i++] = (len >>> 8) & 0xff;\n res[i++] = (len >>> 16) & 0xff;\n res[i++] = (len >>> 24) & 0xff;\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = 0;\n\n for (t = 8; t < this.padLength; t++)\n res[i++] = 0;\n }\n\n return res;\n};\n\n},{\"./utils\":295,\"minimalistic-assert\":299}],286:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('./utils');\nvar assert = _dereq_('minimalistic-assert');\n\nfunction Hmac(hash, key, enc) {\n if (!(this instanceof Hmac))\n return new Hmac(hash, key, enc);\n this.Hash = hash;\n this.blockSize = hash.blockSize / 8;\n this.outSize = hash.outSize / 8;\n this.inner = null;\n this.outer = null;\n\n this._init(utils.toArray(key, enc));\n}\nmodule.exports = Hmac;\n\nHmac.prototype._init = function init(key) {\n // Shorten key, if needed\n if (key.length > this.blockSize)\n key = new this.Hash().update(key).digest();\n assert(key.length <= this.blockSize);\n\n // Add padding to key\n for (var i = key.length; i < this.blockSize; i++)\n key.push(0);\n\n for (i = 0; i < key.length; i++)\n key[i] ^= 0x36;\n this.inner = new this.Hash().update(key);\n\n // 0x36 ^ 0x5c = 0x6a\n for (i = 0; i < key.length; i++)\n key[i] ^= 0x6a;\n this.outer = new this.Hash().update(key);\n};\n\nHmac.prototype.update = function update(msg, enc) {\n this.inner.update(msg, enc);\n return this;\n};\n\nHmac.prototype.digest = function digest(enc) {\n this.outer.update(this.inner.digest());\n return this.outer.digest(enc);\n};\n\n},{\"./utils\":295,\"minimalistic-assert\":299}],287:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('./utils');\nvar common = _dereq_('./common');\n\nvar rotl32 = utils.rotl32;\nvar sum32 = utils.sum32;\nvar sum32_3 = utils.sum32_3;\nvar sum32_4 = utils.sum32_4;\nvar BlockHash = common.BlockHash;\n\nfunction RIPEMD160() {\n if (!(this instanceof RIPEMD160))\n return new RIPEMD160();\n\n BlockHash.call(this);\n\n this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ];\n this.endian = 'little';\n}\nutils.inherits(RIPEMD160, BlockHash);\nexports.ripemd160 = RIPEMD160;\n\nRIPEMD160.blockSize = 512;\nRIPEMD160.outSize = 160;\nRIPEMD160.hmacStrength = 192;\nRIPEMD160.padLength = 64;\n\nRIPEMD160.prototype._update = function update(msg, start) {\n var A = this.h[0];\n var B = this.h[1];\n var C = this.h[2];\n var D = this.h[3];\n var E = this.h[4];\n var Ah = A;\n var Bh = B;\n var Ch = C;\n var Dh = D;\n var Eh = E;\n for (var j = 0; j < 80; j++) {\n var T = sum32(\n rotl32(\n sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)),\n s[j]),\n E);\n A = E;\n E = D;\n D = rotl32(C, 10);\n C = B;\n B = T;\n T = sum32(\n rotl32(\n sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)),\n sh[j]),\n Eh);\n Ah = Eh;\n Eh = Dh;\n Dh = rotl32(Ch, 10);\n Ch = Bh;\n Bh = T;\n }\n T = sum32_3(this.h[1], C, Dh);\n this.h[1] = sum32_3(this.h[2], D, Eh);\n this.h[2] = sum32_3(this.h[3], E, Ah);\n this.h[3] = sum32_3(this.h[4], A, Bh);\n this.h[4] = sum32_3(this.h[0], B, Ch);\n this.h[0] = T;\n};\n\nRIPEMD160.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h, 'little');\n else\n return utils.split32(this.h, 'little');\n};\n\nfunction f(j, x, y, z) {\n if (j <= 15)\n return x ^ y ^ z;\n else if (j <= 31)\n return (x & y) | ((~x) & z);\n else if (j <= 47)\n return (x | (~y)) ^ z;\n else if (j <= 63)\n return (x & z) | (y & (~z));\n else\n return x ^ (y | (~z));\n}\n\nfunction K(j) {\n if (j <= 15)\n return 0x00000000;\n else if (j <= 31)\n return 0x5a827999;\n else if (j <= 47)\n return 0x6ed9eba1;\n else if (j <= 63)\n return 0x8f1bbcdc;\n else\n return 0xa953fd4e;\n}\n\nfunction Kh(j) {\n if (j <= 15)\n return 0x50a28be6;\n else if (j <= 31)\n return 0x5c4dd124;\n else if (j <= 47)\n return 0x6d703ef3;\n else if (j <= 63)\n return 0x7a6d76e9;\n else\n return 0x00000000;\n}\n\nvar r = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,\n 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,\n 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,\n 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13\n];\n\nvar rh = [\n 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,\n 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,\n 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,\n 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,\n 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11\n];\n\nvar s = [\n 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,\n 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,\n 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,\n 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,\n 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6\n];\n\nvar sh = [\n 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,\n 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,\n 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,\n 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,\n 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11\n];\n\n},{\"./common\":285,\"./utils\":295}],288:[function(_dereq_,module,exports){\n'use strict';\n\nexports.sha1 = _dereq_('./sha/1');\nexports.sha224 = _dereq_('./sha/224');\nexports.sha256 = _dereq_('./sha/256');\nexports.sha384 = _dereq_('./sha/384');\nexports.sha512 = _dereq_('./sha/512');\n\n},{\"./sha/1\":289,\"./sha/224\":290,\"./sha/256\":291,\"./sha/384\":292,\"./sha/512\":293}],289:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('../utils');\nvar common = _dereq_('../common');\nvar shaCommon = _dereq_('./common');\n\nvar rotl32 = utils.rotl32;\nvar sum32 = utils.sum32;\nvar sum32_5 = utils.sum32_5;\nvar ft_1 = shaCommon.ft_1;\nvar BlockHash = common.BlockHash;\n\nvar sha1_K = [\n 0x5A827999, 0x6ED9EBA1,\n 0x8F1BBCDC, 0xCA62C1D6\n];\n\nfunction SHA1() {\n if (!(this instanceof SHA1))\n return new SHA1();\n\n BlockHash.call(this);\n this.h = [\n 0x67452301, 0xefcdab89, 0x98badcfe,\n 0x10325476, 0xc3d2e1f0 ];\n this.W = new Array(80);\n}\n\nutils.inherits(SHA1, BlockHash);\nmodule.exports = SHA1;\n\nSHA1.blockSize = 512;\nSHA1.outSize = 160;\nSHA1.hmacStrength = 80;\nSHA1.padLength = 64;\n\nSHA1.prototype._update = function _update(msg, start) {\n var W = this.W;\n\n for (var i = 0; i < 16; i++)\n W[i] = msg[start + i];\n\n for(; i < W.length; i++)\n W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);\n\n var a = this.h[0];\n var b = this.h[1];\n var c = this.h[2];\n var d = this.h[3];\n var e = this.h[4];\n\n for (i = 0; i < W.length; i++) {\n var s = ~~(i / 20);\n var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);\n e = d;\n d = c;\n c = rotl32(b, 30);\n b = a;\n a = t;\n }\n\n this.h[0] = sum32(this.h[0], a);\n this.h[1] = sum32(this.h[1], b);\n this.h[2] = sum32(this.h[2], c);\n this.h[3] = sum32(this.h[3], d);\n this.h[4] = sum32(this.h[4], e);\n};\n\nSHA1.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h, 'big');\n else\n return utils.split32(this.h, 'big');\n};\n\n},{\"../common\":285,\"../utils\":295,\"./common\":294}],290:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('../utils');\nvar SHA256 = _dereq_('./256');\n\nfunction SHA224() {\n if (!(this instanceof SHA224))\n return new SHA224();\n\n SHA256.call(this);\n this.h = [\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,\n 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 ];\n}\nutils.inherits(SHA224, SHA256);\nmodule.exports = SHA224;\n\nSHA224.blockSize = 512;\nSHA224.outSize = 224;\nSHA224.hmacStrength = 192;\nSHA224.padLength = 64;\n\nSHA224.prototype._digest = function digest(enc) {\n // Just truncate output\n if (enc === 'hex')\n return utils.toHex32(this.h.slice(0, 7), 'big');\n else\n return utils.split32(this.h.slice(0, 7), 'big');\n};\n\n\n},{\"../utils\":295,\"./256\":291}],291:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('../utils');\nvar common = _dereq_('../common');\nvar shaCommon = _dereq_('./common');\nvar assert = _dereq_('minimalistic-assert');\n\nvar sum32 = utils.sum32;\nvar sum32_4 = utils.sum32_4;\nvar sum32_5 = utils.sum32_5;\nvar ch32 = shaCommon.ch32;\nvar maj32 = shaCommon.maj32;\nvar s0_256 = shaCommon.s0_256;\nvar s1_256 = shaCommon.s1_256;\nvar g0_256 = shaCommon.g0_256;\nvar g1_256 = shaCommon.g1_256;\n\nvar BlockHash = common.BlockHash;\n\nvar sha256_K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n];\n\nfunction SHA256() {\n if (!(this instanceof SHA256))\n return new SHA256();\n\n BlockHash.call(this);\n this.h = [\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\n ];\n this.k = sha256_K;\n this.W = new Array(64);\n}\nutils.inherits(SHA256, BlockHash);\nmodule.exports = SHA256;\n\nSHA256.blockSize = 512;\nSHA256.outSize = 256;\nSHA256.hmacStrength = 192;\nSHA256.padLength = 64;\n\nSHA256.prototype._update = function _update(msg, start) {\n var W = this.W;\n\n for (var i = 0; i < 16; i++)\n W[i] = msg[start + i];\n for (; i < W.length; i++)\n W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);\n\n var a = this.h[0];\n var b = this.h[1];\n var c = this.h[2];\n var d = this.h[3];\n var e = this.h[4];\n var f = this.h[5];\n var g = this.h[6];\n var h = this.h[7];\n\n assert(this.k.length === W.length);\n for (i = 0; i < W.length; i++) {\n var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);\n var T2 = sum32(s0_256(a), maj32(a, b, c));\n h = g;\n g = f;\n f = e;\n e = sum32(d, T1);\n d = c;\n c = b;\n b = a;\n a = sum32(T1, T2);\n }\n\n this.h[0] = sum32(this.h[0], a);\n this.h[1] = sum32(this.h[1], b);\n this.h[2] = sum32(this.h[2], c);\n this.h[3] = sum32(this.h[3], d);\n this.h[4] = sum32(this.h[4], e);\n this.h[5] = sum32(this.h[5], f);\n this.h[6] = sum32(this.h[6], g);\n this.h[7] = sum32(this.h[7], h);\n};\n\nSHA256.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h, 'big');\n else\n return utils.split32(this.h, 'big');\n};\n\n},{\"../common\":285,\"../utils\":295,\"./common\":294,\"minimalistic-assert\":299}],292:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('../utils');\n\nvar SHA512 = _dereq_('./512');\n\nfunction SHA384() {\n if (!(this instanceof SHA384))\n return new SHA384();\n\n SHA512.call(this);\n this.h = [\n 0xcbbb9d5d, 0xc1059ed8,\n 0x629a292a, 0x367cd507,\n 0x9159015a, 0x3070dd17,\n 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31,\n 0x8eb44a87, 0x68581511,\n 0xdb0c2e0d, 0x64f98fa7,\n 0x47b5481d, 0xbefa4fa4 ];\n}\nutils.inherits(SHA384, SHA512);\nmodule.exports = SHA384;\n\nSHA384.blockSize = 1024;\nSHA384.outSize = 384;\nSHA384.hmacStrength = 192;\nSHA384.padLength = 128;\n\nSHA384.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h.slice(0, 12), 'big');\n else\n return utils.split32(this.h.slice(0, 12), 'big');\n};\n\n},{\"../utils\":295,\"./512\":293}],293:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('../utils');\nvar common = _dereq_('../common');\nvar assert = _dereq_('minimalistic-assert');\n\nvar rotr64_hi = utils.rotr64_hi;\nvar rotr64_lo = utils.rotr64_lo;\nvar shr64_hi = utils.shr64_hi;\nvar shr64_lo = utils.shr64_lo;\nvar sum64 = utils.sum64;\nvar sum64_hi = utils.sum64_hi;\nvar sum64_lo = utils.sum64_lo;\nvar sum64_4_hi = utils.sum64_4_hi;\nvar sum64_4_lo = utils.sum64_4_lo;\nvar sum64_5_hi = utils.sum64_5_hi;\nvar sum64_5_lo = utils.sum64_5_lo;\n\nvar BlockHash = common.BlockHash;\n\nvar sha512_K = [\n 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,\n 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,\n 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,\n 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,\n 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,\n 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,\n 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,\n 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,\n 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,\n 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,\n 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,\n 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,\n 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,\n 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,\n 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,\n 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,\n 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,\n 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,\n 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,\n 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,\n 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,\n 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,\n 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,\n 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,\n 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,\n 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,\n 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,\n 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,\n 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,\n 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,\n 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,\n 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,\n 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,\n 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,\n 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,\n 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,\n 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,\n 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,\n 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,\n 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817\n];\n\nfunction SHA512() {\n if (!(this instanceof SHA512))\n return new SHA512();\n\n BlockHash.call(this);\n this.h = [\n 0x6a09e667, 0xf3bcc908,\n 0xbb67ae85, 0x84caa73b,\n 0x3c6ef372, 0xfe94f82b,\n 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1,\n 0x9b05688c, 0x2b3e6c1f,\n 0x1f83d9ab, 0xfb41bd6b,\n 0x5be0cd19, 0x137e2179 ];\n this.k = sha512_K;\n this.W = new Array(160);\n}\nutils.inherits(SHA512, BlockHash);\nmodule.exports = SHA512;\n\nSHA512.blockSize = 1024;\nSHA512.outSize = 512;\nSHA512.hmacStrength = 192;\nSHA512.padLength = 128;\n\nSHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {\n var W = this.W;\n\n // 32 x 32bit words\n for (var i = 0; i < 32; i++)\n W[i] = msg[start + i];\n for (; i < W.length; i += 2) {\n var c0_hi = g1_512_hi(W[i - 4], W[i - 3]); // i - 2\n var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);\n var c1_hi = W[i - 14]; // i - 7\n var c1_lo = W[i - 13];\n var c2_hi = g0_512_hi(W[i - 30], W[i - 29]); // i - 15\n var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);\n var c3_hi = W[i - 32]; // i - 16\n var c3_lo = W[i - 31];\n\n W[i] = sum64_4_hi(\n c0_hi, c0_lo,\n c1_hi, c1_lo,\n c2_hi, c2_lo,\n c3_hi, c3_lo);\n W[i + 1] = sum64_4_lo(\n c0_hi, c0_lo,\n c1_hi, c1_lo,\n c2_hi, c2_lo,\n c3_hi, c3_lo);\n }\n};\n\nSHA512.prototype._update = function _update(msg, start) {\n this._prepareBlock(msg, start);\n\n var W = this.W;\n\n var ah = this.h[0];\n var al = this.h[1];\n var bh = this.h[2];\n var bl = this.h[3];\n var ch = this.h[4];\n var cl = this.h[5];\n var dh = this.h[6];\n var dl = this.h[7];\n var eh = this.h[8];\n var el = this.h[9];\n var fh = this.h[10];\n var fl = this.h[11];\n var gh = this.h[12];\n var gl = this.h[13];\n var hh = this.h[14];\n var hl = this.h[15];\n\n assert(this.k.length === W.length);\n for (var i = 0; i < W.length; i += 2) {\n var c0_hi = hh;\n var c0_lo = hl;\n var c1_hi = s1_512_hi(eh, el);\n var c1_lo = s1_512_lo(eh, el);\n var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);\n var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);\n var c3_hi = this.k[i];\n var c3_lo = this.k[i + 1];\n var c4_hi = W[i];\n var c4_lo = W[i + 1];\n\n var T1_hi = sum64_5_hi(\n c0_hi, c0_lo,\n c1_hi, c1_lo,\n c2_hi, c2_lo,\n c3_hi, c3_lo,\n c4_hi, c4_lo);\n var T1_lo = sum64_5_lo(\n c0_hi, c0_lo,\n c1_hi, c1_lo,\n c2_hi, c2_lo,\n c3_hi, c3_lo,\n c4_hi, c4_lo);\n\n c0_hi = s0_512_hi(ah, al);\n c0_lo = s0_512_lo(ah, al);\n c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);\n c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);\n\n var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);\n var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);\n\n hh = gh;\n hl = gl;\n\n gh = fh;\n gl = fl;\n\n fh = eh;\n fl = el;\n\n eh = sum64_hi(dh, dl, T1_hi, T1_lo);\n el = sum64_lo(dl, dl, T1_hi, T1_lo);\n\n dh = ch;\n dl = cl;\n\n ch = bh;\n cl = bl;\n\n bh = ah;\n bl = al;\n\n ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);\n al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);\n }\n\n sum64(this.h, 0, ah, al);\n sum64(this.h, 2, bh, bl);\n sum64(this.h, 4, ch, cl);\n sum64(this.h, 6, dh, dl);\n sum64(this.h, 8, eh, el);\n sum64(this.h, 10, fh, fl);\n sum64(this.h, 12, gh, gl);\n sum64(this.h, 14, hh, hl);\n};\n\nSHA512.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h, 'big');\n else\n return utils.split32(this.h, 'big');\n};\n\nfunction ch64_hi(xh, xl, yh, yl, zh) {\n var r = (xh & yh) ^ ((~xh) & zh);\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction ch64_lo(xh, xl, yh, yl, zh, zl) {\n var r = (xl & yl) ^ ((~xl) & zl);\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction maj64_hi(xh, xl, yh, yl, zh) {\n var r = (xh & yh) ^ (xh & zh) ^ (yh & zh);\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction maj64_lo(xh, xl, yh, yl, zh, zl) {\n var r = (xl & yl) ^ (xl & zl) ^ (yl & zl);\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction s0_512_hi(xh, xl) {\n var c0_hi = rotr64_hi(xh, xl, 28);\n var c1_hi = rotr64_hi(xl, xh, 2); // 34\n var c2_hi = rotr64_hi(xl, xh, 7); // 39\n\n var r = c0_hi ^ c1_hi ^ c2_hi;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction s0_512_lo(xh, xl) {\n var c0_lo = rotr64_lo(xh, xl, 28);\n var c1_lo = rotr64_lo(xl, xh, 2); // 34\n var c2_lo = rotr64_lo(xl, xh, 7); // 39\n\n var r = c0_lo ^ c1_lo ^ c2_lo;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction s1_512_hi(xh, xl) {\n var c0_hi = rotr64_hi(xh, xl, 14);\n var c1_hi = rotr64_hi(xh, xl, 18);\n var c2_hi = rotr64_hi(xl, xh, 9); // 41\n\n var r = c0_hi ^ c1_hi ^ c2_hi;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction s1_512_lo(xh, xl) {\n var c0_lo = rotr64_lo(xh, xl, 14);\n var c1_lo = rotr64_lo(xh, xl, 18);\n var c2_lo = rotr64_lo(xl, xh, 9); // 41\n\n var r = c0_lo ^ c1_lo ^ c2_lo;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction g0_512_hi(xh, xl) {\n var c0_hi = rotr64_hi(xh, xl, 1);\n var c1_hi = rotr64_hi(xh, xl, 8);\n var c2_hi = shr64_hi(xh, xl, 7);\n\n var r = c0_hi ^ c1_hi ^ c2_hi;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction g0_512_lo(xh, xl) {\n var c0_lo = rotr64_lo(xh, xl, 1);\n var c1_lo = rotr64_lo(xh, xl, 8);\n var c2_lo = shr64_lo(xh, xl, 7);\n\n var r = c0_lo ^ c1_lo ^ c2_lo;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction g1_512_hi(xh, xl) {\n var c0_hi = rotr64_hi(xh, xl, 19);\n var c1_hi = rotr64_hi(xl, xh, 29); // 61\n var c2_hi = shr64_hi(xh, xl, 6);\n\n var r = c0_hi ^ c1_hi ^ c2_hi;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction g1_512_lo(xh, xl) {\n var c0_lo = rotr64_lo(xh, xl, 19);\n var c1_lo = rotr64_lo(xl, xh, 29); // 61\n var c2_lo = shr64_lo(xh, xl, 6);\n\n var r = c0_lo ^ c1_lo ^ c2_lo;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\n},{\"../common\":285,\"../utils\":295,\"minimalistic-assert\":299}],294:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('../utils');\nvar rotr32 = utils.rotr32;\n\nfunction ft_1(s, x, y, z) {\n if (s === 0)\n return ch32(x, y, z);\n if (s === 1 || s === 3)\n return p32(x, y, z);\n if (s === 2)\n return maj32(x, y, z);\n}\nexports.ft_1 = ft_1;\n\nfunction ch32(x, y, z) {\n return (x & y) ^ ((~x) & z);\n}\nexports.ch32 = ch32;\n\nfunction maj32(x, y, z) {\n return (x & y) ^ (x & z) ^ (y & z);\n}\nexports.maj32 = maj32;\n\nfunction p32(x, y, z) {\n return x ^ y ^ z;\n}\nexports.p32 = p32;\n\nfunction s0_256(x) {\n return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);\n}\nexports.s0_256 = s0_256;\n\nfunction s1_256(x) {\n return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);\n}\nexports.s1_256 = s1_256;\n\nfunction g0_256(x) {\n return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3);\n}\nexports.g0_256 = g0_256;\n\nfunction g1_256(x) {\n return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10);\n}\nexports.g1_256 = g1_256;\n\n},{\"../utils\":295}],295:[function(_dereq_,module,exports){\n'use strict';\n\nvar assert = _dereq_('minimalistic-assert');\nvar inherits = _dereq_('inherits');\n\nexports.inherits = inherits;\n\nfunction toArray(msg, enc) {\n if (Array.isArray(msg))\n return msg.slice();\n if (!msg)\n return [];\n var res = [];\n if (typeof msg === 'string') {\n if (!enc) {\n for (var i = 0; i < msg.length; i++) {\n var c = msg.charCodeAt(i);\n var hi = c >> 8;\n var lo = c & 0xff;\n if (hi)\n res.push(hi, lo);\n else\n res.push(lo);\n }\n } else if (enc === 'hex') {\n msg = msg.replace(/[^a-z0-9]+/ig, '');\n if (msg.length % 2 !== 0)\n msg = '0' + msg;\n for (i = 0; i < msg.length; i += 2)\n res.push(parseInt(msg[i] + msg[i + 1], 16));\n }\n } else {\n for (i = 0; i < msg.length; i++)\n res[i] = msg[i] | 0;\n }\n return res;\n}\nexports.toArray = toArray;\n\nfunction toHex(msg) {\n var res = '';\n for (var i = 0; i < msg.length; i++)\n res += zero2(msg[i].toString(16));\n return res;\n}\nexports.toHex = toHex;\n\nfunction htonl(w) {\n var res = (w >>> 24) |\n ((w >>> 8) & 0xff00) |\n ((w << 8) & 0xff0000) |\n ((w & 0xff) << 24);\n return res >>> 0;\n}\nexports.htonl = htonl;\n\nfunction toHex32(msg, endian) {\n var res = '';\n for (var i = 0; i < msg.length; i++) {\n var w = msg[i];\n if (endian === 'little')\n w = htonl(w);\n res += zero8(w.toString(16));\n }\n return res;\n}\nexports.toHex32 = toHex32;\n\nfunction zero2(word) {\n if (word.length === 1)\n return '0' + word;\n else\n return word;\n}\nexports.zero2 = zero2;\n\nfunction zero8(word) {\n if (word.length === 7)\n return '0' + word;\n else if (word.length === 6)\n return '00' + word;\n else if (word.length === 5)\n return '000' + word;\n else if (word.length === 4)\n return '0000' + word;\n else if (word.length === 3)\n return '00000' + word;\n else if (word.length === 2)\n return '000000' + word;\n else if (word.length === 1)\n return '0000000' + word;\n else\n return word;\n}\nexports.zero8 = zero8;\n\nfunction join32(msg, start, end, endian) {\n var len = end - start;\n assert(len % 4 === 0);\n var res = new Array(len / 4);\n for (var i = 0, k = start; i < res.length; i++, k += 4) {\n var w;\n if (endian === 'big')\n w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3];\n else\n w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k];\n res[i] = w >>> 0;\n }\n return res;\n}\nexports.join32 = join32;\n\nfunction split32(msg, endian) {\n var res = new Array(msg.length * 4);\n for (var i = 0, k = 0; i < msg.length; i++, k += 4) {\n var m = msg[i];\n if (endian === 'big') {\n res[k] = m >>> 24;\n res[k + 1] = (m >>> 16) & 0xff;\n res[k + 2] = (m >>> 8) & 0xff;\n res[k + 3] = m & 0xff;\n } else {\n res[k + 3] = m >>> 24;\n res[k + 2] = (m >>> 16) & 0xff;\n res[k + 1] = (m >>> 8) & 0xff;\n res[k] = m & 0xff;\n }\n }\n return res;\n}\nexports.split32 = split32;\n\nfunction rotr32(w, b) {\n return (w >>> b) | (w << (32 - b));\n}\nexports.rotr32 = rotr32;\n\nfunction rotl32(w, b) {\n return (w << b) | (w >>> (32 - b));\n}\nexports.rotl32 = rotl32;\n\nfunction sum32(a, b) {\n return (a + b) >>> 0;\n}\nexports.sum32 = sum32;\n\nfunction sum32_3(a, b, c) {\n return (a + b + c) >>> 0;\n}\nexports.sum32_3 = sum32_3;\n\nfunction sum32_4(a, b, c, d) {\n return (a + b + c + d) >>> 0;\n}\nexports.sum32_4 = sum32_4;\n\nfunction sum32_5(a, b, c, d, e) {\n return (a + b + c + d + e) >>> 0;\n}\nexports.sum32_5 = sum32_5;\n\nfunction sum64(buf, pos, ah, al) {\n var bh = buf[pos];\n var bl = buf[pos + 1];\n\n var lo = (al + bl) >>> 0;\n var hi = (lo < al ? 1 : 0) + ah + bh;\n buf[pos] = hi >>> 0;\n buf[pos + 1] = lo;\n}\nexports.sum64 = sum64;\n\nfunction sum64_hi(ah, al, bh, bl) {\n var lo = (al + bl) >>> 0;\n var hi = (lo < al ? 1 : 0) + ah + bh;\n return hi >>> 0;\n}\nexports.sum64_hi = sum64_hi;\n\nfunction sum64_lo(ah, al, bh, bl) {\n var lo = al + bl;\n return lo >>> 0;\n}\nexports.sum64_lo = sum64_lo;\n\nfunction sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {\n var carry = 0;\n var lo = al;\n lo = (lo + bl) >>> 0;\n carry += lo < al ? 1 : 0;\n lo = (lo + cl) >>> 0;\n carry += lo < cl ? 1 : 0;\n lo = (lo + dl) >>> 0;\n carry += lo < dl ? 1 : 0;\n\n var hi = ah + bh + ch + dh + carry;\n return hi >>> 0;\n}\nexports.sum64_4_hi = sum64_4_hi;\n\nfunction sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {\n var lo = al + bl + cl + dl;\n return lo >>> 0;\n}\nexports.sum64_4_lo = sum64_4_lo;\n\nfunction sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {\n var carry = 0;\n var lo = al;\n lo = (lo + bl) >>> 0;\n carry += lo < al ? 1 : 0;\n lo = (lo + cl) >>> 0;\n carry += lo < cl ? 1 : 0;\n lo = (lo + dl) >>> 0;\n carry += lo < dl ? 1 : 0;\n lo = (lo + el) >>> 0;\n carry += lo < el ? 1 : 0;\n\n var hi = ah + bh + ch + dh + eh + carry;\n return hi >>> 0;\n}\nexports.sum64_5_hi = sum64_5_hi;\n\nfunction sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {\n var lo = al + bl + cl + dl + el;\n\n return lo >>> 0;\n}\nexports.sum64_5_lo = sum64_5_lo;\n\nfunction rotr64_hi(ah, al, num) {\n var r = (al << (32 - num)) | (ah >>> num);\n return r >>> 0;\n}\nexports.rotr64_hi = rotr64_hi;\n\nfunction rotr64_lo(ah, al, num) {\n var r = (ah << (32 - num)) | (al >>> num);\n return r >>> 0;\n}\nexports.rotr64_lo = rotr64_lo;\n\nfunction shr64_hi(ah, al, num) {\n return ah >>> num;\n}\nexports.shr64_hi = shr64_hi;\n\nfunction shr64_lo(ah, al, num) {\n var r = (ah << (32 - num)) | (al >>> num);\n return r >>> 0;\n}\nexports.shr64_lo = shr64_lo;\n\n},{\"inherits\":298,\"minimalistic-assert\":299}],296:[function(_dereq_,module,exports){\n'use strict';\n\nvar hash = _dereq_('hash.js');\nvar utils = _dereq_('minimalistic-crypto-utils');\nvar assert = _dereq_('minimalistic-assert');\n\nfunction HmacDRBG(options) {\n if (!(this instanceof HmacDRBG))\n return new HmacDRBG(options);\n this.hash = options.hash;\n this.predResist = !!options.predResist;\n\n this.outLen = this.hash.outSize;\n this.minEntropy = options.minEntropy || this.hash.hmacStrength;\n\n this._reseed = null;\n this.reseedInterval = null;\n this.K = null;\n this.V = null;\n\n var entropy = utils.toArray(options.entropy, options.entropyEnc || 'hex');\n var nonce = utils.toArray(options.nonce, options.nonceEnc || 'hex');\n var pers = utils.toArray(options.pers, options.persEnc || 'hex');\n assert(entropy.length >= (this.minEntropy / 8),\n 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits');\n this._init(entropy, nonce, pers);\n}\nmodule.exports = HmacDRBG;\n\nHmacDRBG.prototype._init = function init(entropy, nonce, pers) {\n var seed = entropy.concat(nonce).concat(pers);\n\n this.K = new Array(this.outLen / 8);\n this.V = new Array(this.outLen / 8);\n for (var i = 0; i < this.V.length; i++) {\n this.K[i] = 0x00;\n this.V[i] = 0x01;\n }\n\n this._update(seed);\n this._reseed = 1;\n this.reseedInterval = 0x1000000000000; // 2^48\n};\n\nHmacDRBG.prototype._hmac = function hmac() {\n return new hash.hmac(this.hash, this.K);\n};\n\nHmacDRBG.prototype._update = function update(seed) {\n var kmac = this._hmac()\n .update(this.V)\n .update([ 0x00 ]);\n if (seed)\n kmac = kmac.update(seed);\n this.K = kmac.digest();\n this.V = this._hmac().update(this.V).digest();\n if (!seed)\n return;\n\n this.K = this._hmac()\n .update(this.V)\n .update([ 0x01 ])\n .update(seed)\n .digest();\n this.V = this._hmac().update(this.V).digest();\n};\n\nHmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {\n // Optional entropy enc\n if (typeof entropyEnc !== 'string') {\n addEnc = add;\n add = entropyEnc;\n entropyEnc = null;\n }\n\n entropy = utils.toArray(entropy, entropyEnc);\n add = utils.toArray(add, addEnc);\n\n assert(entropy.length >= (this.minEntropy / 8),\n 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits');\n\n this._update(entropy.concat(add || []));\n this._reseed = 1;\n};\n\nHmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {\n if (this._reseed > this.reseedInterval)\n throw new Error('Reseed is required');\n\n // Optional encoding\n if (typeof enc !== 'string') {\n addEnc = add;\n add = enc;\n enc = null;\n }\n\n // Optional additional data\n if (add) {\n add = utils.toArray(add, addEnc || 'hex');\n this._update(add);\n }\n\n var temp = [];\n while (temp.length < len) {\n this.V = this._hmac().update(this.V).digest();\n temp = temp.concat(this.V);\n }\n\n var res = temp.slice(0, len);\n this._update(add);\n this._reseed++;\n return utils.encode(res, enc);\n};\n\n},{\"hash.js\":284,\"minimalistic-assert\":299,\"minimalistic-crypto-utils\":300}],297:[function(_dereq_,module,exports){\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = nBytes * 8 - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = nBytes * 8 - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n\n},{}],298:[function(_dereq_,module,exports){\nif (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n\n},{}],299:[function(_dereq_,module,exports){\nmodule.exports = assert;\n\nfunction assert(val, msg) {\n if (!val)\n throw new Error(msg || 'Assertion failed');\n}\n\nassert.equal = function assertEqual(l, r, msg) {\n if (l != r)\n throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r));\n};\n\n},{}],300:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = exports;\n\nfunction toArray(msg, enc) {\n if (Array.isArray(msg))\n return msg.slice();\n if (!msg)\n return [];\n var res = [];\n if (typeof msg !== 'string') {\n for (var i = 0; i < msg.length; i++)\n res[i] = msg[i] | 0;\n return res;\n }\n if (enc === 'hex') {\n msg = msg.replace(/[^a-z0-9]+/ig, '');\n if (msg.length % 2 !== 0)\n msg = '0' + msg;\n for (var i = 0; i < msg.length; i += 2)\n res.push(parseInt(msg[i] + msg[i + 1], 16));\n } else {\n for (var i = 0; i < msg.length; i++) {\n var c = msg.charCodeAt(i);\n var hi = c >> 8;\n var lo = c & 0xff;\n if (hi)\n res.push(hi, lo);\n else\n res.push(lo);\n }\n }\n return res;\n}\nutils.toArray = toArray;\n\nfunction zero2(word) {\n if (word.length === 1)\n return '0' + word;\n else\n return word;\n}\nutils.zero2 = zero2;\n\nfunction toHex(msg) {\n var res = '';\n for (var i = 0; i < msg.length; i++)\n res += zero2(msg[i].toString(16));\n return res;\n}\nutils.toHex = toHex;\n\nutils.encode = function encode(arr, enc) {\n if (enc === 'hex')\n return toHex(arr);\n else\n return arr;\n};\n\n},{}],301:[function(_dereq_,module,exports){\n// Top level file is just a mixin of submodules & constants\n'use strict';\n\nvar assign = _dereq_('./lib/utils/common').assign;\n\nvar deflate = _dereq_('./lib/deflate');\nvar inflate = _dereq_('./lib/inflate');\nvar constants = _dereq_('./lib/zlib/constants');\n\nvar pako = {};\n\nassign(pako, deflate, inflate, constants);\n\nmodule.exports = pako;\n\n},{\"./lib/deflate\":302,\"./lib/inflate\":303,\"./lib/utils/common\":304,\"./lib/zlib/constants\":307}],302:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar zlib_deflate = _dereq_('./zlib/deflate');\nvar utils = _dereq_('./utils/common');\nvar strings = _dereq_('./utils/strings');\nvar msg = _dereq_('./zlib/messages');\nvar ZStream = _dereq_('./zlib/zstream');\n\nvar toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nvar Z_NO_FLUSH = 0;\nvar Z_FINISH = 4;\n\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\nvar Z_SYNC_FLUSH = 2;\n\nvar Z_DEFAULT_COMPRESSION = -1;\n\nvar Z_DEFAULT_STRATEGY = 0;\n\nvar Z_DEFLATED = 8;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array|Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Deflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n * (each char code [0..255])\n * - `header` (Object) - custom header for gzip\n * - `text` (Boolean) - true if compressed data believed to be text\n * - `time` (Number) - modification time, unix timestamp\n * - `os` (Number) - operation system code\n * - `extra` (Array) - array of bytes with extra data (max 65536)\n * - `name` (String) - file name (binary string)\n * - `comment` (String) - comment (binary string)\n * - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true); // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate(options) {\n if (!(this instanceof Deflate)) return new Deflate(options);\n\n this.options = utils.assign({\n level: Z_DEFAULT_COMPRESSION,\n method: Z_DEFLATED,\n chunkSize: 16384,\n windowBits: 15,\n memLevel: 8,\n strategy: Z_DEFAULT_STRATEGY,\n to: ''\n }, options || {});\n\n var opt = this.options;\n\n if (opt.raw && (opt.windowBits > 0)) {\n opt.windowBits = -opt.windowBits;\n }\n\n else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n opt.windowBits += 16;\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new ZStream();\n this.strm.avail_out = 0;\n\n var status = zlib_deflate.deflateInit2(\n this.strm,\n opt.level,\n opt.method,\n opt.windowBits,\n opt.memLevel,\n opt.strategy\n );\n\n if (status !== Z_OK) {\n throw new Error(msg[status]);\n }\n\n if (opt.header) {\n zlib_deflate.deflateSetHeader(this.strm, opt.header);\n }\n\n if (opt.dictionary) {\n var dict;\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n // If we need to compress text, change encoding to utf8.\n dict = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n dict = new Uint8Array(opt.dictionary);\n } else {\n dict = opt.dictionary;\n }\n\n status = zlib_deflate.deflateSetDictionary(this.strm, dict);\n\n if (status !== Z_OK) {\n throw new Error(msg[status]);\n }\n\n this._dict_set = true;\n }\n}\n\n/**\n * Deflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be\n * converted to utf8 byte sequence.\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the compression context.\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * array format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nDeflate.prototype.push = function (data, mode) {\n var strm = this.strm;\n var chunkSize = this.options.chunkSize;\n var status, _mode;\n\n if (this.ended) { return false; }\n\n _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);\n\n // Convert data if needed\n if (typeof data === 'string') {\n // If we need to compress text, change encoding to utf8.\n strm.input = strings.string2buf(data);\n } else if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n do {\n if (strm.avail_out === 0) {\n strm.output = new utils.Buf8(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n status = zlib_deflate.deflate(strm, _mode); /* no bad return value */\n\n if (status !== Z_STREAM_END && status !== Z_OK) {\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {\n if (this.options.to === 'string') {\n this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));\n } else {\n this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n }\n }\n } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);\n\n // Finalize on the last chunk.\n if (_mode === Z_FINISH) {\n status = zlib_deflate.deflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === Z_OK;\n }\n\n // callback interim results if Z_SYNC_FLUSH.\n if (_mode === Z_SYNC_FLUSH) {\n this.onEnd(Z_OK);\n strm.avail_out = 0;\n return true;\n }\n\n return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n * on js engine support. When string output requested, each chunk\n * will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = utils.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n * (each char code [0..255])\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , data = Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate(input, options) {\n var deflator = new Deflate(options);\n\n deflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (deflator.err) { throw deflator.msg || msg[deflator.err]; }\n\n return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return deflate(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n options = options || {};\n options.gzip = true;\n return deflate(input, options);\n}\n\n\nexports.Deflate = Deflate;\nexports.deflate = deflate;\nexports.deflateRaw = deflateRaw;\nexports.gzip = gzip;\n\n},{\"./utils/common\":304,\"./utils/strings\":305,\"./zlib/deflate\":309,\"./zlib/messages\":314,\"./zlib/zstream\":316}],303:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar zlib_inflate = _dereq_('./zlib/inflate');\nvar utils = _dereq_('./utils/common');\nvar strings = _dereq_('./utils/strings');\nvar c = _dereq_('./zlib/constants');\nvar msg = _dereq_('./zlib/messages');\nvar ZStream = _dereq_('./zlib/zstream');\nvar GZheader = _dereq_('./zlib/gzheader');\n\nvar toString = Object.prototype.toString;\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Inflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n if (!(this instanceof Inflate)) return new Inflate(options);\n\n this.options = utils.assign({\n chunkSize: 16384,\n windowBits: 0,\n to: ''\n }, options || {});\n\n var opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new ZStream();\n this.strm.avail_out = 0;\n\n var status = zlib_inflate.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== c.Z_OK) {\n throw new Error(msg[status]);\n }\n\n this.header = new GZheader();\n\n zlib_inflate.inflateGetHeader(this.strm, this.header);\n}\n\n/**\n * Inflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the decompression context.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, mode) {\n var strm = this.strm;\n var chunkSize = this.options.chunkSize;\n var dictionary = this.options.dictionary;\n var status, _mode;\n var next_out_utf8, tail, utf8str;\n var dict;\n\n // Flag to properly process Z_BUF_ERROR on testing inflate call\n // when we check that all output data was flushed.\n var allowBufError = false;\n\n if (this.ended) { return false; }\n _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);\n\n // Convert data if needed\n if (typeof data === 'string') {\n // Only binary strings can be decompressed on practice\n strm.input = strings.binstring2buf(data);\n } else if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n do {\n if (strm.avail_out === 0) {\n strm.output = new utils.Buf8(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */\n\n if (status === c.Z_NEED_DICT && dictionary) {\n // Convert data if needed\n if (typeof dictionary === 'string') {\n dict = strings.string2buf(dictionary);\n } else if (toString.call(dictionary) === '[object ArrayBuffer]') {\n dict = new Uint8Array(dictionary);\n } else {\n dict = dictionary;\n }\n\n status = zlib_inflate.inflateSetDictionary(this.strm, dict);\n\n }\n\n if (status === c.Z_BUF_ERROR && allowBufError === true) {\n status = c.Z_OK;\n allowBufError = false;\n }\n\n if (status !== c.Z_STREAM_END && status !== c.Z_OK) {\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {\n\n if (this.options.to === 'string') {\n\n next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n tail = strm.next_out - next_out_utf8;\n utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }\n\n this.onData(utf8str);\n\n } else {\n this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n }\n }\n }\n\n // When no more input data, we should check that internal inflate buffers\n // are flushed. The only way to do it when avail_out = 0 - run one more\n // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.\n // Here we set flag to process this error properly.\n //\n // NOTE. Deflate does not return error in this case and does not needs such\n // logic.\n if (strm.avail_in === 0 && strm.avail_out === 0) {\n allowBufError = true;\n }\n\n } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);\n\n if (status === c.Z_STREAM_END) {\n _mode = c.Z_FINISH;\n }\n\n // Finalize on the last chunk.\n if (_mode === c.Z_FINISH) {\n status = zlib_inflate.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === c.Z_OK;\n }\n\n // callback interim results if Z_SYNC_FLUSH.\n if (_mode === c.Z_SYNC_FLUSH) {\n this.onEnd(c.Z_OK);\n strm.avail_out = 0;\n return true;\n }\n\n return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n * on js engine support. When string output requested, each chunk\n * will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === c.Z_OK) {\n if (this.options.to === 'string') {\n // Glue & convert here, until we teach pako to send\n // utf8 aligned strings to onData\n this.result = this.chunks.join('');\n } else {\n this.result = utils.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , input = pako.deflate([1,2,3,4,5,6,7,8,9])\n * , output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err)\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate(input, options) {\n var inflator = new Inflate(options);\n\n inflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) { throw inflator.msg || msg[inflator.err]; }\n\n return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return inflate(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nexports.Inflate = Inflate;\nexports.inflate = inflate;\nexports.inflateRaw = inflateRaw;\nexports.ungzip = inflate;\n\n},{\"./utils/common\":304,\"./utils/strings\":305,\"./zlib/constants\":307,\"./zlib/gzheader\":310,\"./zlib/inflate\":312,\"./zlib/messages\":314,\"./zlib/zstream\":316}],304:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar TYPED_OK = (typeof Uint8Array !== 'undefined') &&\n (typeof Uint16Array !== 'undefined') &&\n (typeof Int32Array !== 'undefined');\n\nfunction _has(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexports.assign = function (obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n var source = sources.shift();\n if (!source) { continue; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (var p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n};\n\n\n// reduce buffer size, avoiding mem copy\nexports.shrinkBuf = function (buf, size) {\n if (buf.length === size) { return buf; }\n if (buf.subarray) { return buf.subarray(0, size); }\n buf.length = size;\n return buf;\n};\n\n\nvar fnTyped = {\n arraySet: function (dest, src, src_offs, len, dest_offs) {\n if (src.subarray && dest.subarray) {\n dest.set(src.subarray(src_offs, src_offs + len), dest_offs);\n return;\n }\n // Fallback to ordinary array\n for (var i = 0; i < len; i++) {\n dest[dest_offs + i] = src[src_offs + i];\n }\n },\n // Join array of chunks to single array.\n flattenChunks: function (chunks) {\n var i, l, len, pos, chunk, result;\n\n // calculate data length\n len = 0;\n for (i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n result = new Uint8Array(len);\n pos = 0;\n for (i = 0, l = chunks.length; i < l; i++) {\n chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result;\n }\n};\n\nvar fnUntyped = {\n arraySet: function (dest, src, src_offs, len, dest_offs) {\n for (var i = 0; i < len; i++) {\n dest[dest_offs + i] = src[src_offs + i];\n }\n },\n // Join array of chunks to single array.\n flattenChunks: function (chunks) {\n return [].concat.apply([], chunks);\n }\n};\n\n\n// Enable/Disable typed arrays use, for testing\n//\nexports.setTyped = function (on) {\n if (on) {\n exports.Buf8 = Uint8Array;\n exports.Buf16 = Uint16Array;\n exports.Buf32 = Int32Array;\n exports.assign(exports, fnTyped);\n } else {\n exports.Buf8 = Array;\n exports.Buf16 = Array;\n exports.Buf32 = Array;\n exports.assign(exports, fnUntyped);\n }\n};\n\nexports.setTyped(TYPED_OK);\n\n},{}],305:[function(_dereq_,module,exports){\n// String encode/decode helpers\n'use strict';\n\n\nvar utils = _dereq_('./common');\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nvar STR_APPLY_OK = true;\nvar STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new utils.Buf8(256);\nfor (var q = 0; q < 256; q++) {\n _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nexports.string2buf = function (str) {\n var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new utils.Buf8(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Helper (used in 2 places)\nfunction buf2binstring(buf, len) {\n // use fallback for big arrays to avoid stack overflow\n if (len < 65537) {\n if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {\n return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));\n }\n }\n\n var result = '';\n for (var i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n}\n\n\n// Convert byte array to binary string\nexports.buf2binstring = function (buf) {\n return buf2binstring(buf, buf.length);\n};\n\n\n// Convert binary string (typed, when possible)\nexports.binstring2buf = function (str) {\n var buf = new utils.Buf8(str.length);\n for (var i = 0, len = buf.length; i < len; i++) {\n buf[i] = str.charCodeAt(i);\n }\n return buf;\n};\n\n\n// convert array to string\nexports.buf2string = function (buf, max) {\n var i, out, c, c_len;\n var len = max || buf.length;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n var utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nexports.utf8border = function (buf, max) {\n var pos;\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\n},{\"./common\":304}],306:[function(_dereq_,module,exports){\n'use strict';\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction adler32(adler, buf, len, pos) {\n var s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n}\n\n\nmodule.exports = adler32;\n\n},{}],307:[function(_dereq_,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n //Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n\n},{}],308:[function(_dereq_,module,exports){\n'use strict';\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n var c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n var t = crcTable,\n end = pos + len;\n\n crc ^= -1;\n\n for (var i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n}\n\n\nmodule.exports = crc32;\n\n},{}],309:[function(_dereq_,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = _dereq_('../utils/common');\nvar trees = _dereq_('./trees');\nvar adler32 = _dereq_('./adler32');\nvar crc32 = _dereq_('./crc32');\nvar msg = _dereq_('./messages');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\nvar Z_NO_FLUSH = 0;\nvar Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH = 2;\nvar Z_FULL_FLUSH = 3;\nvar Z_FINISH = 4;\nvar Z_BLOCK = 5;\n//var Z_TREES = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\n//var Z_NEED_DICT = 2;\n//var Z_ERRNO = -1;\nvar Z_STREAM_ERROR = -2;\nvar Z_DATA_ERROR = -3;\n//var Z_MEM_ERROR = -4;\nvar Z_BUF_ERROR = -5;\n//var Z_VERSION_ERROR = -6;\n\n\n/* compression levels */\n//var Z_NO_COMPRESSION = 0;\n//var Z_BEST_SPEED = 1;\n//var Z_BEST_COMPRESSION = 9;\nvar Z_DEFAULT_COMPRESSION = -1;\n\n\nvar Z_FILTERED = 1;\nvar Z_HUFFMAN_ONLY = 2;\nvar Z_RLE = 3;\nvar Z_FIXED = 4;\nvar Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\n//var Z_BINARY = 0;\n//var Z_TEXT = 1;\n//var Z_ASCII = 1; // = Z_TEXT\nvar Z_UNKNOWN = 2;\n\n\n/* The deflate compression method */\nvar Z_DEFLATED = 8;\n\n/*============================================================================*/\n\n\nvar MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_MEM_LEVEL = 8;\n\n\nvar LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nvar LITERALS = 256;\n/* number of literal bytes 0..255 */\nvar L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nvar D_CODES = 30;\n/* number of distance codes */\nvar BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\nvar HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\nvar MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\nvar MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nvar PRESET_DICT = 0x20;\n\nvar INIT_STATE = 42;\nvar EXTRA_STATE = 69;\nvar NAME_STATE = 73;\nvar COMMENT_STATE = 91;\nvar HCRC_STATE = 103;\nvar BUSY_STATE = 113;\nvar FINISH_STATE = 666;\n\nvar BS_NEED_MORE = 1; /* block not completed, need more input or more output */\nvar BS_BLOCK_DONE = 2; /* block flush performed */\nvar BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nvar BS_FINISH_DONE = 4; /* finish done, accept no more input or output */\n\nvar OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nfunction err(strm, errorCode) {\n strm.msg = msg[errorCode];\n return errorCode;\n}\n\nfunction rank(f) {\n return ((f) << 1) - ((f) > 4 ? 9 : 0);\n}\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nfunction flush_pending(strm) {\n var s = strm.state;\n\n //_tr_flush_bits(s);\n var len = s.pending;\n if (len > strm.avail_out) {\n len = strm.avail_out;\n }\n if (len === 0) { return; }\n\n utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);\n strm.next_out += len;\n s.pending_out += len;\n strm.total_out += len;\n strm.avail_out -= len;\n s.pending -= len;\n if (s.pending === 0) {\n s.pending_out = 0;\n }\n}\n\n\nfunction flush_block_only(s, last) {\n trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n s.block_start = s.strstart;\n flush_pending(s.strm);\n}\n\n\nfunction put_byte(s, b) {\n s.pending_buf[s.pending++] = b;\n}\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nfunction putShortMSB(s, b) {\n// put_byte(s, (Byte)(b >> 8));\n// put_byte(s, (Byte)(b & 0xff));\n s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n s.pending_buf[s.pending++] = b & 0xff;\n}\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read. All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nfunction read_buf(strm, buf, start, size) {\n var len = strm.avail_in;\n\n if (len > size) { len = size; }\n if (len === 0) { return 0; }\n\n strm.avail_in -= len;\n\n // zmemcpy(buf, strm->next_in, len);\n utils.arraySet(buf, strm.input, strm.next_in, len, start);\n if (strm.state.wrap === 1) {\n strm.adler = adler32(strm.adler, buf, len, start);\n }\n\n else if (strm.state.wrap === 2) {\n strm.adler = crc32(strm.adler, buf, len, start);\n }\n\n strm.next_in += len;\n strm.total_in += len;\n\n return len;\n}\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nfunction longest_match(s, cur_match) {\n var chain_length = s.max_chain_length; /* max hash chain length */\n var scan = s.strstart; /* current string */\n var match; /* matched string */\n var len; /* length of current match */\n var best_len = s.prev_length; /* best match length so far */\n var nice_match = s.nice_match; /* stop if match long enough */\n var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n var _win = s.window; // shortcut\n\n var wmask = s.w_mask;\n var prev = s.prev;\n\n /* Stop when cur_match becomes <= limit. To simplify the code,\n * we prevent matches with the string of window index 0.\n */\n\n var strend = s.strstart + MAX_MATCH;\n var scan_end1 = _win[scan + best_len - 1];\n var scan_end = _win[scan + best_len];\n\n /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n * It is easy to get rid of this optimization if necessary.\n */\n // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n /* Do not waste too much time if we already have a good match: */\n if (s.prev_length >= s.good_match) {\n chain_length >>= 2;\n }\n /* Do not look for matches beyond the end of the input. This is necessary\n * to make deflate deterministic.\n */\n if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n do {\n // Assert(cur_match < s->strstart, \"no future\");\n match = cur_match;\n\n /* Skip to next match if the match length cannot increase\n * or if the match length is less than 2. Note that the checks below\n * for insufficient lookahead only occur occasionally for performance\n * reasons. Therefore uninitialized memory will be accessed, and\n * conditional jumps will be made that depend on those values.\n * However the length of the match is limited to the lookahead, so\n * the output of deflate is not affected by the uninitialized values.\n */\n\n if (_win[match + best_len] !== scan_end ||\n _win[match + best_len - 1] !== scan_end1 ||\n _win[match] !== _win[scan] ||\n _win[++match] !== _win[scan + 1]) {\n continue;\n }\n\n /* The check at best_len-1 can be removed because it will be made\n * again later. (This heuristic is not always a win.)\n * It is not necessary to compare scan[2] and match[2] since they\n * are always equal when the other bytes match, given that\n * the hash keys are equal and that HASH_BITS >= 8.\n */\n scan += 2;\n match++;\n // Assert(*scan == *match, \"match[2]?\");\n\n /* We check for insufficient lookahead only every 8th comparison;\n * the 256th check will be made at strstart+258.\n */\n do {\n /*jshint noempty:false*/\n } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n scan < strend);\n\n // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n len = MAX_MATCH - (strend - scan);\n scan = strend - MAX_MATCH;\n\n if (len > best_len) {\n s.match_start = cur_match;\n best_len = len;\n if (len >= nice_match) {\n break;\n }\n scan_end1 = _win[scan + best_len - 1];\n scan_end = _win[scan + best_len];\n }\n } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n if (best_len <= s.lookahead) {\n return best_len;\n }\n return s.lookahead;\n}\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n * At least one byte has been read, or avail_in == 0; reads are\n * performed for at least two bytes (required for the zip translate_eol\n * option -- not supported here).\n */\nfunction fill_window(s) {\n var _w_size = s.w_size;\n var p, n, m, more, str;\n\n //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n do {\n more = s.window_size - s.lookahead - s.strstart;\n\n // JS ints have 32 bit, block below not needed\n /* Deal with !@#$% 64K limit: */\n //if (sizeof(int) <= 2) {\n // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n // more = wsize;\n //\n // } else if (more == (unsigned)(-1)) {\n // /* Very unlikely, but possible on 16 bit machine if\n // * strstart == 0 && lookahead == 1 (input done a byte at time)\n // */\n // more--;\n // }\n //}\n\n\n /* If the window is almost full and there is insufficient lookahead,\n * move the upper half to the lower one to make room in the upper half.\n */\n if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n utils.arraySet(s.window, s.window, _w_size, _w_size, 0);\n s.match_start -= _w_size;\n s.strstart -= _w_size;\n /* we now have strstart >= MAX_DIST */\n s.block_start -= _w_size;\n\n /* Slide the hash table (could be avoided with 32 bit values\n at the expense of memory usage). We slide even when level == 0\n to keep the hash table consistent if we switch back to level > 0\n later. (Using level 0 permanently is not an optimal usage of\n zlib, so we don't care about this pathological case.)\n */\n\n n = s.hash_size;\n p = n;\n do {\n m = s.head[--p];\n s.head[p] = (m >= _w_size ? m - _w_size : 0);\n } while (--n);\n\n n = _w_size;\n p = n;\n do {\n m = s.prev[--p];\n s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n /* If n is not on any hash chain, prev[n] is garbage but\n * its value will never be used.\n */\n } while (--n);\n\n more += _w_size;\n }\n if (s.strm.avail_in === 0) {\n break;\n }\n\n /* If there was no sliding:\n * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n * more == window_size - lookahead - strstart\n * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n * => more >= window_size - 2*WSIZE + 2\n * In the BIG_MEM or MMAP case (not yet supported),\n * window_size == input_size + MIN_LOOKAHEAD &&\n * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n * Otherwise, window_size == 2*WSIZE so more >= 2.\n * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n */\n //Assert(more >= 2, \"more < 2\");\n n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n s.lookahead += n;\n\n /* Initialize the hash value now that we have some input: */\n if (s.lookahead + s.insert >= MIN_MATCH) {\n str = s.strstart - s.insert;\n s.ins_h = s.window[str];\n\n /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;\n//#if MIN_MATCH != 3\n// Call update_hash() MIN_MATCH-3 more times\n//#endif\n while (s.insert) {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = str;\n str++;\n s.insert--;\n if (s.lookahead + s.insert < MIN_MATCH) {\n break;\n }\n }\n }\n /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n * but this is not important since only literal bytes will be emitted.\n */\n\n } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n /* If the WIN_INIT bytes after the end of the current data have never been\n * written, then zero those bytes in order to avoid memory check reports of\n * the use of uninitialized (or uninitialised as Julian writes) bytes by\n * the longest match routines. Update the high water mark for the next\n * time through here. WIN_INIT is set to MAX_MATCH since the longest match\n * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n */\n// if (s.high_water < s.window_size) {\n// var curr = s.strstart + s.lookahead;\n// var init = 0;\n//\n// if (s.high_water < curr) {\n// /* Previous high water mark below current data -- zero WIN_INIT\n// * bytes or up to end of window, whichever is less.\n// */\n// init = s.window_size - curr;\n// if (init > WIN_INIT)\n// init = WIN_INIT;\n// zmemzero(s->window + curr, (unsigned)init);\n// s->high_water = curr + init;\n// }\n// else if (s->high_water < (ulg)curr + WIN_INIT) {\n// /* High water mark at or above current data, but below current data\n// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n// * to end of window, whichever is less.\n// */\n// init = (ulg)curr + WIN_INIT - s->high_water;\n// if (init > s->window_size - s->high_water)\n// init = s->window_size - s->high_water;\n// zmemzero(s->window + s->high_water, (unsigned)init);\n// s->high_water += init;\n// }\n// }\n//\n// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n// \"not enough room for search\");\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nfunction deflate_stored(s, flush) {\n /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n * to pending_buf_size, and each stored block has a 5 byte header:\n */\n var max_block_size = 0xffff;\n\n if (max_block_size > s.pending_buf_size - 5) {\n max_block_size = s.pending_buf_size - 5;\n }\n\n /* Copy as much as possible from input to output: */\n for (;;) {\n /* Fill the window as much as possible: */\n if (s.lookahead <= 1) {\n\n //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n // s->block_start >= (long)s->w_size, \"slide too late\");\n// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n// s.block_start >= s.w_size)) {\n// throw new Error(\"slide too late\");\n// }\n\n fill_window(s);\n if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n\n if (s.lookahead === 0) {\n break;\n }\n /* flush the current block */\n }\n //Assert(s->block_start >= 0L, \"block gone\");\n// if (s.block_start < 0) throw new Error(\"block gone\");\n\n s.strstart += s.lookahead;\n s.lookahead = 0;\n\n /* Emit a stored block if pending_buf will be full: */\n var max_start = s.block_start + max_block_size;\n\n if (s.strstart === 0 || s.strstart >= max_start) {\n /* strstart == 0 is possible when wraparound on 16-bit machine */\n s.lookahead = s.strstart - max_start;\n s.strstart = max_start;\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n\n\n }\n /* Flush if we may have to slide, otherwise block_start may become\n * negative and the data will be gone:\n */\n if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n\n s.insert = 0;\n\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n\n if (s.strstart > s.block_start) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_NEED_MORE;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nfunction deflate_fast(s, flush) {\n var hash_head; /* head of the hash chain */\n var bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break; /* flush the current block */\n }\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n * At this point we have always match_length < MIN_MATCH\n */\n if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n }\n if (s.match_length >= MIN_MATCH) {\n // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n /*** _tr_tally_dist(s, s.strstart - s.match_start,\n s.match_length - MIN_MATCH, bflush); ***/\n bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n\n /* Insert new strings in the hash table only if the match length\n * is not too large. This saves time but degrades compression.\n */\n if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n s.match_length--; /* string at strstart already in table */\n do {\n s.strstart++;\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n * always MIN_MATCH bytes ahead.\n */\n } while (--s.match_length !== 0);\n s.strstart++;\n } else\n {\n s.strstart += s.match_length;\n s.match_length = 0;\n s.ins_h = s.window[s.strstart];\n /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;\n\n//#if MIN_MATCH != 3\n// Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n * matter since it will be recomputed at next deflate call.\n */\n }\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nfunction deflate_slow(s, flush) {\n var hash_head; /* head of hash chain */\n var bflush; /* set if current block must be flushed */\n\n var max_insert;\n\n /* Process the input block. */\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n */\n s.prev_length = s.match_length;\n s.prev_match = s.match_start;\n s.match_length = MIN_MATCH - 1;\n\n if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n\n if (s.match_length <= 5 &&\n (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n /* If prev_match is also MIN_MATCH, match_start is garbage\n * but we will ignore the current match anyway.\n */\n s.match_length = MIN_MATCH - 1;\n }\n }\n /* If there was a match at the previous step and the current\n * match is not better, output the previous match:\n */\n if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n max_insert = s.strstart + s.lookahead - MIN_MATCH;\n /* Do not insert strings in hash table beyond this. */\n\n //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n s.prev_length - MIN_MATCH, bflush);***/\n bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n /* Insert in hash table all strings up to the end of the match.\n * strstart-1 and strstart are already inserted. If there is not\n * enough lookahead, the last two strings are not inserted in\n * the hash table.\n */\n s.lookahead -= s.prev_length - 1;\n s.prev_length -= 2;\n do {\n if (++s.strstart <= max_insert) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n } while (--s.prev_length !== 0);\n s.match_available = 0;\n s.match_length = MIN_MATCH - 1;\n s.strstart++;\n\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n } else if (s.match_available) {\n /* If there was no match at the previous position, output a\n * single literal. If there was a match but the current match\n * is longer, truncate the previous match to a single literal.\n */\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n if (bflush) {\n /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n flush_block_only(s, false);\n /***/\n }\n s.strstart++;\n s.lookahead--;\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n } else {\n /* There is no previous match to compare with, wait for\n * the next step to decide.\n */\n s.match_available = 1;\n s.strstart++;\n s.lookahead--;\n }\n }\n //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n if (s.match_available) {\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n s.match_available = 0;\n }\n s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_BLOCK_DONE;\n}\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one. Do not maintain a hash table. (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nfunction deflate_rle(s, flush) {\n var bflush; /* set if current block must be flushed */\n var prev; /* byte at distance one to match */\n var scan, strend; /* scan goes up to strend for length of run */\n\n var _win = s.window;\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the longest run, plus one for the unrolled loop.\n */\n if (s.lookahead <= MAX_MATCH) {\n fill_window(s);\n if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* See how many times the previous byte repeats */\n s.match_length = 0;\n if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n scan = s.strstart - 1;\n prev = _win[scan];\n if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n strend = s.strstart + MAX_MATCH;\n do {\n /*jshint noempty:false*/\n } while (prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n scan < strend);\n s.match_length = MAX_MATCH - (strend - scan);\n if (s.match_length > s.lookahead) {\n s.match_length = s.lookahead;\n }\n }\n //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n }\n\n /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n if (s.match_length >= MIN_MATCH) {\n //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n s.strstart += s.match_length;\n s.match_length = 0;\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nfunction deflate_huff(s, flush) {\n var bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we have a literal to write. */\n if (s.lookahead === 0) {\n fill_window(s);\n if (s.lookahead === 0) {\n if (flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n break; /* flush the current block */\n }\n }\n\n /* Output a literal byte */\n s.match_length = 0;\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n this.good_length = good_length;\n this.max_lazy = max_lazy;\n this.nice_length = nice_length;\n this.max_chain = max_chain;\n this.func = func;\n}\n\nvar configuration_table;\n\nconfiguration_table = [\n /* good lazy nice chain */\n new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */\n new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */\n new Config(4, 5, 16, 8, deflate_fast), /* 2 */\n new Config(4, 6, 32, 32, deflate_fast), /* 3 */\n\n new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */\n new Config(8, 16, 32, 32, deflate_slow), /* 5 */\n new Config(8, 16, 128, 128, deflate_slow), /* 6 */\n new Config(8, 32, 128, 256, deflate_slow), /* 7 */\n new Config(32, 128, 258, 1024, deflate_slow), /* 8 */\n new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nfunction lm_init(s) {\n s.window_size = 2 * s.w_size;\n\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n\n /* Set the default configuration parameters:\n */\n s.max_lazy_match = configuration_table[s.level].max_lazy;\n s.good_match = configuration_table[s.level].good_length;\n s.nice_match = configuration_table[s.level].nice_length;\n s.max_chain_length = configuration_table[s.level].max_chain;\n\n s.strstart = 0;\n s.block_start = 0;\n s.lookahead = 0;\n s.insert = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n s.ins_h = 0;\n}\n\n\nfunction DeflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.status = 0; /* as the name implies */\n this.pending_buf = null; /* output still pending */\n this.pending_buf_size = 0; /* size of pending_buf */\n this.pending_out = 0; /* next pending byte to output to the stream */\n this.pending = 0; /* nb of bytes in the pending buffer */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.gzhead = null; /* gzip header information to write */\n this.gzindex = 0; /* where in extra, name, or comment */\n this.method = Z_DEFLATED; /* can only be DEFLATED */\n this.last_flush = -1; /* value of flush param for previous deflate call */\n\n this.w_size = 0; /* LZ77 window size (32K by default) */\n this.w_bits = 0; /* log2(w_size) (8..16) */\n this.w_mask = 0; /* w_size - 1 */\n\n this.window = null;\n /* Sliding window. Input bytes are read into the second half of the window,\n * and move to the first half later to keep a dictionary of at least wSize\n * bytes. With this organization, matches are limited to a distance of\n * wSize-MAX_MATCH bytes, but this ensures that IO is always\n * performed with a length multiple of the block size.\n */\n\n this.window_size = 0;\n /* Actual size of window: 2*wSize, except when the user input buffer\n * is directly used as sliding window.\n */\n\n this.prev = null;\n /* Link to older string with same hash index. To limit the size of this\n * array to 64K, this link is maintained only for the last 32K strings.\n * An index in this array is thus a window index modulo 32K.\n */\n\n this.head = null; /* Heads of the hash chains or NIL. */\n\n this.ins_h = 0; /* hash index of string to be inserted */\n this.hash_size = 0; /* number of elements in hash table */\n this.hash_bits = 0; /* log2(hash_size) */\n this.hash_mask = 0; /* hash_size-1 */\n\n this.hash_shift = 0;\n /* Number of bits by which ins_h must be shifted at each input\n * step. It must be such that after MIN_MATCH steps, the oldest\n * byte no longer takes part in the hash key, that is:\n * hash_shift * MIN_MATCH >= hash_bits\n */\n\n this.block_start = 0;\n /* Window position at the beginning of the current output block. Gets\n * negative when the window is moved backwards.\n */\n\n this.match_length = 0; /* length of best match */\n this.prev_match = 0; /* previous match */\n this.match_available = 0; /* set if previous match exists */\n this.strstart = 0; /* start of string to insert */\n this.match_start = 0; /* start of matching string */\n this.lookahead = 0; /* number of valid bytes ahead in window */\n\n this.prev_length = 0;\n /* Length of the best match at previous step. Matches not greater than this\n * are discarded. This is used in the lazy match evaluation.\n */\n\n this.max_chain_length = 0;\n /* To speed up deflation, hash chains are never searched beyond this\n * length. A higher limit improves compression ratio but degrades the\n * speed.\n */\n\n this.max_lazy_match = 0;\n /* Attempt to find a better match only when the current match is strictly\n * smaller than this value. This mechanism is used only for compression\n * levels >= 4.\n */\n // That's alias to max_lazy_match, don't use directly\n //this.max_insert_length = 0;\n /* Insert new strings in the hash table only if the match length is not\n * greater than this length. This saves time but degrades compression.\n * max_insert_length is used only for compression levels <= 3.\n */\n\n this.level = 0; /* compression level (1..9) */\n this.strategy = 0; /* favor or force Huffman coding*/\n\n this.good_match = 0;\n /* Use a faster search when the previous match is longer than this */\n\n this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n /* used by trees.c: */\n\n /* Didn't use ct_data typedef below to suppress compiler warning */\n\n // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */\n // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */\n\n // Use flat array of DOUBLE size, with interleaved fata,\n // because JS does not support effective\n this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2);\n this.dyn_dtree = new utils.Buf16((2 * D_CODES + 1) * 2);\n this.bl_tree = new utils.Buf16((2 * BL_CODES + 1) * 2);\n zero(this.dyn_ltree);\n zero(this.dyn_dtree);\n zero(this.bl_tree);\n\n this.l_desc = null; /* desc. for literal tree */\n this.d_desc = null; /* desc. for distance tree */\n this.bl_desc = null; /* desc. for bit length tree */\n\n //ush bl_count[MAX_BITS+1];\n this.bl_count = new utils.Buf16(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */\n this.heap = new utils.Buf16(2 * L_CODES + 1); /* heap used to build the Huffman trees */\n zero(this.heap);\n\n this.heap_len = 0; /* number of elements in the heap */\n this.heap_max = 0; /* element of largest frequency */\n /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n * The same heap array is used to build all trees.\n */\n\n this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n zero(this.depth);\n /* Depth of each subtree used as tie breaker for trees of equal frequency\n */\n\n this.l_buf = 0; /* buffer index for literals or lengths */\n\n this.lit_bufsize = 0;\n /* Size of match buffer for literals/lengths. There are 4 reasons for\n * limiting lit_bufsize to 64K:\n * - frequencies can be kept in 16 bit counters\n * - if compression is not successful for the first block, all input\n * data is still in the window so we can still emit a stored block even\n * when input comes from standard input. (This can also be done for\n * all blocks if lit_bufsize is not greater than 32K.)\n * - if compression is not successful for a file smaller than 64K, we can\n * even emit a stored file instead of a stored block (saving 5 bytes).\n * This is applicable only for zip (not gzip or zlib).\n * - creating new Huffman trees less frequently may not provide fast\n * adaptation to changes in the input data statistics. (Take for\n * example a binary file with poorly compressible code followed by\n * a highly compressible string table.) Smaller buffer sizes give\n * fast adaptation but have of course the overhead of transmitting\n * trees more frequently.\n * - I can't count above 4\n */\n\n this.last_lit = 0; /* running index in l_buf */\n\n this.d_buf = 0;\n /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n * the same number of elements. To use different lengths, an extra flag\n * array would be necessary.\n */\n\n this.opt_len = 0; /* bit length of current block with optimal trees */\n this.static_len = 0; /* bit length of current block with static trees */\n this.matches = 0; /* number of string matches in current block */\n this.insert = 0; /* bytes at end of window left to insert */\n\n\n this.bi_buf = 0;\n /* Output buffer. bits are inserted starting at the bottom (least\n * significant bits).\n */\n this.bi_valid = 0;\n /* Number of valid bits in bi_buf. All bits above the last valid bit\n * are always zero.\n */\n\n // Used for window memory init. We safely ignore it for JS. That makes\n // sense only for pointers and memory check tools.\n //this.high_water = 0;\n /* High water mark offset in window for initialized bytes -- bytes above\n * this are set to zero in order to avoid memory check warnings when\n * longest match routines access bytes past the input. This is then\n * updated to the new high water mark.\n */\n}\n\n\nfunction deflateResetKeep(strm) {\n var s;\n\n if (!strm || !strm.state) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.total_in = strm.total_out = 0;\n strm.data_type = Z_UNKNOWN;\n\n s = strm.state;\n s.pending = 0;\n s.pending_out = 0;\n\n if (s.wrap < 0) {\n s.wrap = -s.wrap;\n /* was made negative by deflate(..., Z_FINISH); */\n }\n s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n strm.adler = (s.wrap === 2) ?\n 0 // crc32(0, Z_NULL, 0)\n :\n 1; // adler32(0, Z_NULL, 0)\n s.last_flush = Z_NO_FLUSH;\n trees._tr_init(s);\n return Z_OK;\n}\n\n\nfunction deflateReset(strm) {\n var ret = deflateResetKeep(strm);\n if (ret === Z_OK) {\n lm_init(strm.state);\n }\n return ret;\n}\n\n\nfunction deflateSetHeader(strm, head) {\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n strm.state.gzhead = head;\n return Z_OK;\n}\n\n\nfunction deflateInit2(strm, level, method, windowBits, memLevel, strategy) {\n if (!strm) { // === Z_NULL\n return Z_STREAM_ERROR;\n }\n var wrap = 1;\n\n if (level === Z_DEFAULT_COMPRESSION) {\n level = 6;\n }\n\n if (windowBits < 0) { /* suppress zlib wrapper */\n wrap = 0;\n windowBits = -windowBits;\n }\n\n else if (windowBits > 15) {\n wrap = 2; /* write gzip wrapper instead */\n windowBits -= 16;\n }\n\n\n if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n strategy < 0 || strategy > Z_FIXED) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n\n if (windowBits === 8) {\n windowBits = 9;\n }\n /* until 256-byte window bug fixed */\n\n var s = new DeflateState();\n\n strm.state = s;\n s.strm = strm;\n\n s.wrap = wrap;\n s.gzhead = null;\n s.w_bits = windowBits;\n s.w_size = 1 << s.w_bits;\n s.w_mask = s.w_size - 1;\n\n s.hash_bits = memLevel + 7;\n s.hash_size = 1 << s.hash_bits;\n s.hash_mask = s.hash_size - 1;\n s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n s.window = new utils.Buf8(s.w_size * 2);\n s.head = new utils.Buf16(s.hash_size);\n s.prev = new utils.Buf16(s.w_size);\n\n // Don't need mem init magic for JS.\n //s.high_water = 0; /* nothing written to s->window yet */\n\n s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n s.pending_buf_size = s.lit_bufsize * 4;\n\n //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n //s->pending_buf = (uchf *) overlay;\n s.pending_buf = new utils.Buf8(s.pending_buf_size);\n\n // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n s.d_buf = 1 * s.lit_bufsize;\n\n //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n s.l_buf = (1 + 2) * s.lit_bufsize;\n\n s.level = level;\n s.strategy = strategy;\n s.method = method;\n\n return deflateReset(strm);\n}\n\nfunction deflateInit(strm, level) {\n return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n}\n\n\nfunction deflate(strm, flush) {\n var old_flush, s;\n var beg, val; // for gzip header write only\n\n if (!strm || !strm.state ||\n flush > Z_BLOCK || flush < 0) {\n return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n }\n\n s = strm.state;\n\n if (!strm.output ||\n (!strm.input && strm.avail_in !== 0) ||\n (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n }\n\n s.strm = strm; /* just in case */\n old_flush = s.last_flush;\n s.last_flush = flush;\n\n /* Write the header */\n if (s.status === INIT_STATE) {\n\n if (s.wrap === 2) { // GZIP header\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n put_byte(s, 31);\n put_byte(s, 139);\n put_byte(s, 8);\n if (!s.gzhead) { // s->gzhead == Z_NULL\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, OS_CODE);\n s.status = BUSY_STATE;\n }\n else {\n put_byte(s, (s.gzhead.text ? 1 : 0) +\n (s.gzhead.hcrc ? 2 : 0) +\n (!s.gzhead.extra ? 0 : 4) +\n (!s.gzhead.name ? 0 : 8) +\n (!s.gzhead.comment ? 0 : 16)\n );\n put_byte(s, s.gzhead.time & 0xff);\n put_byte(s, (s.gzhead.time >> 8) & 0xff);\n put_byte(s, (s.gzhead.time >> 16) & 0xff);\n put_byte(s, (s.gzhead.time >> 24) & 0xff);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, s.gzhead.os & 0xff);\n if (s.gzhead.extra && s.gzhead.extra.length) {\n put_byte(s, s.gzhead.extra.length & 0xff);\n put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n }\n if (s.gzhead.hcrc) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);\n }\n s.gzindex = 0;\n s.status = EXTRA_STATE;\n }\n }\n else // DEFLATE header\n {\n var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n var level_flags = -1;\n\n if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n level_flags = 0;\n } else if (s.level < 6) {\n level_flags = 1;\n } else if (s.level === 6) {\n level_flags = 2;\n } else {\n level_flags = 3;\n }\n header |= (level_flags << 6);\n if (s.strstart !== 0) { header |= PRESET_DICT; }\n header += 31 - (header % 31);\n\n s.status = BUSY_STATE;\n putShortMSB(s, header);\n\n /* Save the adler32 of the preset dictionary: */\n if (s.strstart !== 0) {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n strm.adler = 1; // adler32(0L, Z_NULL, 0);\n }\n }\n\n//#ifdef GZIP\n if (s.status === EXTRA_STATE) {\n if (s.gzhead.extra/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n\n while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n break;\n }\n }\n put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n s.gzindex++;\n }\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (s.gzindex === s.gzhead.extra.length) {\n s.gzindex = 0;\n s.status = NAME_STATE;\n }\n }\n else {\n s.status = NAME_STATE;\n }\n }\n if (s.status === NAME_STATE) {\n if (s.gzhead.name/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.name.length) {\n val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.gzindex = 0;\n s.status = COMMENT_STATE;\n }\n }\n else {\n s.status = COMMENT_STATE;\n }\n }\n if (s.status === COMMENT_STATE) {\n if (s.gzhead.comment/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.comment.length) {\n val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.status = HCRC_STATE;\n }\n }\n else {\n s.status = HCRC_STATE;\n }\n }\n if (s.status === HCRC_STATE) {\n if (s.gzhead.hcrc) {\n if (s.pending + 2 > s.pending_buf_size) {\n flush_pending(strm);\n }\n if (s.pending + 2 <= s.pending_buf_size) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n s.status = BUSY_STATE;\n }\n }\n else {\n s.status = BUSY_STATE;\n }\n }\n//#endif\n\n /* Flush as much pending output as possible */\n if (s.pending !== 0) {\n flush_pending(strm);\n if (strm.avail_out === 0) {\n /* Since avail_out is 0, deflate will be called again with\n * more output space, but possibly with both pending and\n * avail_in equal to zero. There won't be anything to do,\n * but this is not an error situation so make sure we\n * return OK instead of BUF_ERROR at next call of deflate:\n */\n s.last_flush = -1;\n return Z_OK;\n }\n\n /* Make sure there is something to do and avoid duplicate consecutive\n * flushes. For repeated and useless calls with Z_FINISH, we keep\n * returning Z_STREAM_END instead of Z_BUF_ERROR.\n */\n } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n flush !== Z_FINISH) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* User must not provide more input after the first FINISH: */\n if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* Start a new block or continue the current one.\n */\n if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n configuration_table[s.level].func(s, flush));\n\n if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n s.status = FINISH_STATE;\n }\n if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n if (strm.avail_out === 0) {\n s.last_flush = -1;\n /* avoid BUF_ERROR next call, see above */\n }\n return Z_OK;\n /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n * of deflate should use the same flush parameter to make sure\n * that the flush is complete. So we don't have to output an\n * empty block here, this will be done at next call. This also\n * ensures that for a very small output buffer, we emit at most\n * one empty block.\n */\n }\n if (bstate === BS_BLOCK_DONE) {\n if (flush === Z_PARTIAL_FLUSH) {\n trees._tr_align(s);\n }\n else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n trees._tr_stored_block(s, 0, 0, false);\n /* For a full flush, this empty block will be recognized\n * as a special marker by inflate_sync().\n */\n if (flush === Z_FULL_FLUSH) {\n /*** CLEAR_HASH(s); ***/ /* forget history */\n zero(s.head); // Fill with NIL (= 0);\n\n if (s.lookahead === 0) {\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n }\n }\n flush_pending(strm);\n if (strm.avail_out === 0) {\n s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n return Z_OK;\n }\n }\n }\n //Assert(strm->avail_out > 0, \"bug2\");\n //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n if (flush !== Z_FINISH) { return Z_OK; }\n if (s.wrap <= 0) { return Z_STREAM_END; }\n\n /* Write the trailer */\n if (s.wrap === 2) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n put_byte(s, (strm.adler >> 16) & 0xff);\n put_byte(s, (strm.adler >> 24) & 0xff);\n put_byte(s, strm.total_in & 0xff);\n put_byte(s, (strm.total_in >> 8) & 0xff);\n put_byte(s, (strm.total_in >> 16) & 0xff);\n put_byte(s, (strm.total_in >> 24) & 0xff);\n }\n else\n {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n\n flush_pending(strm);\n /* If avail_out is zero, the application will call deflate again\n * to flush the rest.\n */\n if (s.wrap > 0) { s.wrap = -s.wrap; }\n /* write the trailer only once! */\n return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n}\n\nfunction deflateEnd(strm) {\n var status;\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR;\n }\n\n status = strm.state.status;\n if (status !== INIT_STATE &&\n status !== EXTRA_STATE &&\n status !== NAME_STATE &&\n status !== COMMENT_STATE &&\n status !== HCRC_STATE &&\n status !== BUSY_STATE &&\n status !== FINISH_STATE\n ) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.state = null;\n\n return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n}\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nfunction deflateSetDictionary(strm, dictionary) {\n var dictLength = dictionary.length;\n\n var s;\n var str, n;\n var wrap;\n var avail;\n var next;\n var input;\n var tmpDict;\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR;\n }\n\n s = strm.state;\n wrap = s.wrap;\n\n if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n return Z_STREAM_ERROR;\n }\n\n /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n if (wrap === 1) {\n /* adler32(strm->adler, dictionary, dictLength); */\n strm.adler = adler32(strm.adler, dictionary, dictLength, 0);\n }\n\n s.wrap = 0; /* avoid computing Adler-32 in read_buf */\n\n /* if dictionary would fill window, just replace the history */\n if (dictLength >= s.w_size) {\n if (wrap === 0) { /* already empty otherwise */\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n /* use the tail */\n // dictionary = dictionary.slice(dictLength - s.w_size);\n tmpDict = new utils.Buf8(s.w_size);\n utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);\n dictionary = tmpDict;\n dictLength = s.w_size;\n }\n /* insert dictionary into window and hash */\n avail = strm.avail_in;\n next = strm.next_in;\n input = strm.input;\n strm.avail_in = dictLength;\n strm.next_in = 0;\n strm.input = dictionary;\n fill_window(s);\n while (s.lookahead >= MIN_MATCH) {\n str = s.strstart;\n n = s.lookahead - (MIN_MATCH - 1);\n do {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n s.head[s.ins_h] = str;\n str++;\n } while (--n);\n s.strstart = str;\n s.lookahead = MIN_MATCH - 1;\n fill_window(s);\n }\n s.strstart += s.lookahead;\n s.block_start = s.strstart;\n s.insert = s.lookahead;\n s.lookahead = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n strm.next_in = next;\n strm.input = input;\n strm.avail_in = avail;\n s.wrap = wrap;\n return Z_OK;\n}\n\n\nexports.deflateInit = deflateInit;\nexports.deflateInit2 = deflateInit2;\nexports.deflateReset = deflateReset;\nexports.deflateResetKeep = deflateResetKeep;\nexports.deflateSetHeader = deflateSetHeader;\nexports.deflate = deflate;\nexports.deflateEnd = deflateEnd;\nexports.deflateSetDictionary = deflateSetDictionary;\nexports.deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nexports.deflateBound = deflateBound;\nexports.deflateCopy = deflateCopy;\nexports.deflateParams = deflateParams;\nexports.deflatePending = deflatePending;\nexports.deflatePrime = deflatePrime;\nexports.deflateTune = deflateTune;\n*/\n\n},{\"../utils/common\":304,\"./adler32\":306,\"./crc32\":308,\"./messages\":314,\"./trees\":315}],310:[function(_dereq_,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\n\nmodule.exports = GZheader;\n\n},{}],311:[function(_dereq_,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nvar BAD = 30; /* got a data error -- remain here until reset */\nvar TYPE = 12; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nmodule.exports = function inflate_fast(strm, start) {\n var state;\n var _in; /* local strm.input */\n var last; /* have enough input while in < last */\n var _out; /* local strm.output */\n var beg; /* inflate()'s initial strm.output */\n var end; /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n var dmax; /* maximum distance from zlib header */\n//#endif\n var wsize; /* window size or zero if not using window */\n var whave; /* valid bytes in the window */\n var wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n var s_window; /* allocated sliding window, if wsize != 0 */\n var hold; /* local strm.hold */\n var bits; /* local strm.bits */\n var lcode; /* local strm.lencode */\n var dcode; /* local strm.distcode */\n var lmask; /* mask for first level of length codes */\n var dmask; /* mask for first level of distance codes */\n var here; /* retrieved table entry */\n var op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n var len; /* match length, unused bytes */\n var dist; /* match distance */\n var from; /* where to copy match from */\n var from_source;\n\n\n var input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n dmax = state.dmax;\n//#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n//#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// if (len <= op - whave) {\n// do {\n// output[_out++] = 0;\n// } while (--len);\n// continue top;\n// }\n// len -= op - whave;\n// do {\n// output[_out++] = 0;\n// } while (--op > whave);\n// if (op === 0) {\n// from = _out - dist;\n// do {\n// output[_out++] = output[from++];\n// } while (--len);\n// continue top;\n// }\n//#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n};\n\n},{}],312:[function(_dereq_,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = _dereq_('../utils/common');\nvar adler32 = _dereq_('./adler32');\nvar crc32 = _dereq_('./crc32');\nvar inflate_fast = _dereq_('./inffast');\nvar inflate_table = _dereq_('./inftrees');\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\n//var Z_NO_FLUSH = 0;\n//var Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH = 2;\n//var Z_FULL_FLUSH = 3;\nvar Z_FINISH = 4;\nvar Z_BLOCK = 5;\nvar Z_TREES = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\nvar Z_NEED_DICT = 2;\n//var Z_ERRNO = -1;\nvar Z_STREAM_ERROR = -2;\nvar Z_DATA_ERROR = -3;\nvar Z_MEM_ERROR = -4;\nvar Z_BUF_ERROR = -5;\n//var Z_VERSION_ERROR = -6;\n\n/* The deflate compression method */\nvar Z_DEFLATED = 8;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nvar HEAD = 1; /* i: waiting for magic header */\nvar FLAGS = 2; /* i: waiting for method and flags (gzip) */\nvar TIME = 3; /* i: waiting for modification time (gzip) */\nvar OS = 4; /* i: waiting for extra flags and operating system (gzip) */\nvar EXLEN = 5; /* i: waiting for extra length (gzip) */\nvar EXTRA = 6; /* i: waiting for extra bytes (gzip) */\nvar NAME = 7; /* i: waiting for end of file name (gzip) */\nvar COMMENT = 8; /* i: waiting for end of comment (gzip) */\nvar HCRC = 9; /* i: waiting for header crc (gzip) */\nvar DICTID = 10; /* i: waiting for dictionary check value */\nvar DICT = 11; /* waiting for inflateSetDictionary() call */\nvar TYPE = 12; /* i: waiting for type bits, including last-flag bit */\nvar TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */\nvar STORED = 14; /* i: waiting for stored size (length and complement) */\nvar COPY_ = 15; /* i/o: same as COPY below, but only first time in */\nvar COPY = 16; /* i/o: waiting for input or output to copy stored block */\nvar TABLE = 17; /* i: waiting for dynamic block table lengths */\nvar LENLENS = 18; /* i: waiting for code length code lengths */\nvar CODELENS = 19; /* i: waiting for length/lit and distance code lengths */\nvar LEN_ = 20; /* i: same as LEN below, but only first time in */\nvar LEN = 21; /* i: waiting for length/lit/eob code */\nvar LENEXT = 22; /* i: waiting for length extra bits */\nvar DIST = 23; /* i: waiting for distance code */\nvar DISTEXT = 24; /* i: waiting for distance extra bits */\nvar MATCH = 25; /* o: waiting for output space to copy string */\nvar LIT = 26; /* o: waiting for output space to write literal */\nvar CHECK = 27; /* i: waiting for 32-bit check value */\nvar LENGTH = 28; /* i: waiting for 32-bit length (gzip) */\nvar DONE = 29; /* finished check, done -- remain here until reset */\nvar BAD = 30; /* got a data error -- remain here until reset */\nvar MEM = 31; /* got an inflate() memory error -- remain here until reset */\nvar SYNC = 32; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_WBITS = MAX_WBITS;\n\n\nfunction zswap32(q) {\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n}\n\n\nfunction InflateState() {\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib) */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new utils.Buf16(320); /* temporary storage for code lengths */\n this.work = new utils.Buf16(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\n\nfunction inflateResetKeep(strm) {\n var state;\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);\n state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK;\n}\n\nfunction inflateReset(strm) {\n var state;\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n}\n\nfunction inflateReset2(strm, windowBits) {\n var wrap;\n var state;\n\n /* get the state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 1;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n}\n\nfunction inflateInit2(strm, windowBits) {\n var ret;\n var state;\n\n if (!strm) { return Z_STREAM_ERROR; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.window = null/*Z_NULL*/;\n ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n}\n\nfunction inflateInit(strm) {\n return inflateInit2(strm, DEF_WBITS);\n}\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nvar virgin = true;\n\nvar lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nfunction fixedtables(state) {\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n var sym;\n\n lenfix = new utils.Buf32(512);\n distfix = new utils.Buf32(32);\n\n /* literal/length table */\n sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n}\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nfunction updatewindow(strm, src, end, copy) {\n var dist;\n var state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new utils.Buf8(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n utils.arraySet(state.window, src, end - copy, dist, state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n utils.arraySet(state.window, src, end - copy, copy, 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n}\n\nfunction inflate(strm, flush) {\n var state;\n var input, output; // input/output buffers\n var next; /* next input INDEX */\n var put; /* next output INDEX */\n var have, left; /* available input and output */\n var hold; /* bit buffer */\n var bits; /* bits in bit buffer */\n var _in, _out; /* save starting available input and output */\n var copy; /* number of stored or match bytes to copy */\n var from; /* where to copy match bytes from */\n var from_source;\n var here = 0; /* current decoding table entry */\n var here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //var last; /* parent table entry */\n var last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n var len; /* length to copy for repeats, bits to drop */\n var ret; /* return code */\n var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */\n var opts;\n\n var n; // temporary var for NEED_BITS\n\n var order = /* permutation of code lengths */\n [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n\n if (!strm || !strm.state || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR;\n }\n\n state = strm.state;\n if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n state.flags = 0; /* expect zlib header */\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n else if (len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n state.dmax = 1 << len;\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Array(state.head.extra_len);\n }\n utils.arraySet(\n state.head.extra,\n input,\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n copy,\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n utils.arraySet(output, input, next, copy, put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inflate_fast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n//#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// Trace((stderr, \"inflate.c too far\\n\"));\n// copy -= state.whave;\n// if (copy > state.length) { copy = state.length; }\n// if (copy > left) { copy = left; }\n// left -= copy;\n// state.length -= copy;\n// do {\n// output[put++] = 0;\n// } while (--copy);\n// if (state.length === 0) { state.mode = LEN; }\n// break;\n//#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (_out) {\n strm.adler = state.check =\n /*UPDATE(state.check, put - _out, _out);*/\n (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n (state.mode < CHECK || flush !== Z_FINISH))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {\n state.mode = MEM;\n return Z_MEM_ERROR;\n }\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap && _out) {\n strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {\n ret = Z_BUF_ERROR;\n }\n return ret;\n}\n\nfunction inflateEnd(strm) {\n\n if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n return Z_STREAM_ERROR;\n }\n\n var state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK;\n}\n\nfunction inflateGetHeader(strm, head) {\n var state;\n\n /* check state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK;\n}\n\nfunction inflateSetDictionary(strm, dictionary) {\n var dictLength = dictionary.length;\n\n var state;\n var dictid;\n var ret;\n\n /* check state */\n if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\\n\"));\n return Z_OK;\n}\n\nexports.inflateReset = inflateReset;\nexports.inflateReset2 = inflateReset2;\nexports.inflateResetKeep = inflateResetKeep;\nexports.inflateInit = inflateInit;\nexports.inflateInit2 = inflateInit2;\nexports.inflate = inflate;\nexports.inflateEnd = inflateEnd;\nexports.inflateGetHeader = inflateGetHeader;\nexports.inflateSetDictionary = inflateSetDictionary;\nexports.inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nexports.inflateCopy = inflateCopy;\nexports.inflateGetDictionary = inflateGetDictionary;\nexports.inflateMark = inflateMark;\nexports.inflatePrime = inflatePrime;\nexports.inflateSync = inflateSync;\nexports.inflateSyncPoint = inflateSyncPoint;\nexports.inflateUndermine = inflateUndermine;\n*/\n\n},{\"../utils/common\":304,\"./adler32\":306,\"./crc32\":308,\"./inffast\":311,\"./inftrees\":313}],313:[function(_dereq_,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = _dereq_('../utils/common');\n\nvar MAXBITS = 15;\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\nvar lbase = [ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n];\n\nvar lext = [ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n];\n\nvar dbase = [ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n];\n\nvar dext = [ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n];\n\nmodule.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)\n{\n var bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n var len = 0; /* a code's length in bits */\n var sym = 0; /* index of code symbols */\n var min = 0, max = 0; /* minimum and maximum code lengths */\n var root = 0; /* number of index bits for root table */\n var curr = 0; /* number of index bits for current table */\n var drop = 0; /* code bits to drop for sub-table */\n var left = 0; /* number of prefix codes available */\n var used = 0; /* code entries in table used */\n var huff = 0; /* Huffman code */\n var incr; /* for incrementing code, index */\n var fill; /* index for replicating entries */\n var low; /* low bits for current root entry */\n var mask; /* mask for low root bits */\n var next; /* next available space in table */\n var base = null; /* base value table to use */\n var base_index = 0;\n// var shoextra; /* extra bits table to use */\n var end; /* use base and extra for symbol > end */\n var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n var extra = null;\n var extra_index = 0;\n\n var here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES) {\n base = extra = work; /* dummy value--not used */\n end = 19;\n\n } else if (type === LENS) {\n base = lbase;\n base_index -= 257;\n extra = lext;\n extra_index -= 257;\n end = 256;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n end = -1;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] < end) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] > end) {\n here_op = extra[extra_index + work[sym]];\n here_val = base[base_index + work[sym]];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\n\n},{\"../utils/common\":304}],314:[function(_dereq_,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n},{}],315:[function(_dereq_,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = _dereq_('../utils/common');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//var Z_FILTERED = 1;\n//var Z_HUFFMAN_ONLY = 2;\n//var Z_RLE = 3;\nvar Z_FIXED = 4;\n//var Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nvar Z_BINARY = 0;\nvar Z_TEXT = 1;\n//var Z_ASCII = 1; // = Z_TEXT\nvar Z_UNKNOWN = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nvar STORED_BLOCK = 0;\nvar STATIC_TREES = 1;\nvar DYN_TREES = 2;\n/* The three kinds of block type */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nvar LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nvar LITERALS = 256;\n/* number of literal bytes 0..255 */\n\nvar L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nvar D_CODES = 30;\n/* number of distance codes */\n\nvar BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\n\nvar HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\n\nvar MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar Buf_size = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nvar MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nvar END_BLOCK = 256;\n/* end of block literal code */\n\nvar REP_3_6 = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nvar REPZ_3_10 = 17;\n/* repeat a zero length 3-10 times (3 bits of repeat count) */\n\nvar REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nvar extra_lbits = /* extra bits for each length code */\n [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];\n\nvar extra_dbits = /* extra bits for each distance code */\n [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];\n\nvar extra_blbits = /* extra bits for each bit length code */\n [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];\n\nvar bl_order =\n [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nvar DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nvar static_ltree = new Array((L_CODES + 2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nvar static_dtree = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nvar _dist_code = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nvar _length_code = new Array(MAX_MATCH - MIN_MATCH + 1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nvar base_length = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nvar base_dist = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n this.static_tree = static_tree; /* static tree or NULL */\n this.extra_bits = extra_bits; /* extra bits for each code or NULL */\n this.extra_base = extra_base; /* base index for extra_bits */\n this.elems = elems; /* max number of elements in the tree */\n this.max_length = max_length; /* max bit length for the codes */\n\n // show if `static_tree` has data or dummy - needed for monomorphic objects\n this.has_stree = static_tree && static_tree.length;\n}\n\n\nvar static_l_desc;\nvar static_d_desc;\nvar static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n this.dyn_tree = dyn_tree; /* the dynamic tree */\n this.max_code = 0; /* largest code with non zero frequency */\n this.stat_desc = stat_desc; /* the corresponding static tree */\n}\n\n\n\nfunction d_code(dist) {\n return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n}\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nfunction put_short(s, w) {\n// put_byte(s, (uch)((w) & 0xff));\n// put_byte(s, (uch)((ush)(w) >> 8));\n s.pending_buf[s.pending++] = (w) & 0xff;\n s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n}\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nfunction send_bits(s, value, length) {\n if (s.bi_valid > (Buf_size - length)) {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n put_short(s, s.bi_buf);\n s.bi_buf = value >> (Buf_size - s.bi_valid);\n s.bi_valid += length - Buf_size;\n } else {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n s.bi_valid += length;\n }\n}\n\n\nfunction send_code(s, c, tree) {\n send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n}\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nfunction bi_reverse(code, len) {\n var res = 0;\n do {\n res |= code & 1;\n code >>>= 1;\n res <<= 1;\n } while (--len > 0);\n return res >>> 1;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nfunction bi_flush(s) {\n if (s.bi_valid === 16) {\n put_short(s, s.bi_buf);\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n } else if (s.bi_valid >= 8) {\n s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n s.bi_buf >>= 8;\n s.bi_valid -= 8;\n }\n}\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n * above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n * array bl_count contains the frequencies for each bit length.\n * The length opt_len is updated; static_len is also updated if stree is\n * not null.\n */\nfunction gen_bitlen(s, desc)\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n var tree = desc.dyn_tree;\n var max_code = desc.max_code;\n var stree = desc.stat_desc.static_tree;\n var has_stree = desc.stat_desc.has_stree;\n var extra = desc.stat_desc.extra_bits;\n var base = desc.stat_desc.extra_base;\n var max_length = desc.stat_desc.max_length;\n var h; /* heap index */\n var n, m; /* iterate over the tree elements */\n var bits; /* bit length */\n var xbits; /* extra bits */\n var f; /* frequency */\n var overflow = 0; /* number of elements with bit length too large */\n\n for (bits = 0; bits <= MAX_BITS; bits++) {\n s.bl_count[bits] = 0;\n }\n\n /* In a first pass, compute the optimal bit lengths (which may\n * overflow in the case of the bit length tree).\n */\n tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {\n n = s.heap[h];\n bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n if (bits > max_length) {\n bits = max_length;\n overflow++;\n }\n tree[n * 2 + 1]/*.Len*/ = bits;\n /* We overwrite tree[n].Dad which is no longer needed */\n\n if (n > max_code) { continue; } /* not a leaf node */\n\n s.bl_count[bits]++;\n xbits = 0;\n if (n >= base) {\n xbits = extra[n - base];\n }\n f = tree[n * 2]/*.Freq*/;\n s.opt_len += f * (bits + xbits);\n if (has_stree) {\n s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n }\n }\n if (overflow === 0) { return; }\n\n // Trace((stderr,\"\\nbit length overflow\\n\"));\n /* This happens for example on obj2 and pic of the Calgary corpus */\n\n /* Find the first bit length which could increase: */\n do {\n bits = max_length - 1;\n while (s.bl_count[bits] === 0) { bits--; }\n s.bl_count[bits]--; /* move one leaf down the tree */\n s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n s.bl_count[max_length]--;\n /* The brother of the overflow item also moves one step up,\n * but this does not affect bl_count[max_length]\n */\n overflow -= 2;\n } while (overflow > 0);\n\n /* Now recompute all bit lengths, scanning in increasing frequency.\n * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n * lengths instead of fixing only the wrong ones. This idea is taken\n * from 'ar' written by Haruhiko Okumura.)\n */\n for (bits = max_length; bits !== 0; bits--) {\n n = s.bl_count[bits];\n while (n !== 0) {\n m = s.heap[--h];\n if (m > max_code) { continue; }\n if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n tree[m * 2 + 1]/*.Len*/ = bits;\n }\n n--;\n }\n }\n}\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n * zero code length.\n */\nfunction gen_codes(tree, max_code, bl_count)\n// ct_data *tree; /* the tree to decorate */\n// int max_code; /* largest code with non zero frequency */\n// ushf *bl_count; /* number of codes at each bit length */\n{\n var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */\n var code = 0; /* running code value */\n var bits; /* bit index */\n var n; /* code index */\n\n /* The distribution counts are first used to generate the code values\n * without bit reversal.\n */\n for (bits = 1; bits <= MAX_BITS; bits++) {\n next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n }\n /* Check that the bit counts in bl_count are consistent. The last code\n * must be all ones.\n */\n //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n // \"inconsistent bit counts\");\n //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n for (n = 0; n <= max_code; n++) {\n var len = tree[n * 2 + 1]/*.Len*/;\n if (len === 0) { continue; }\n /* Now reverse the bits */\n tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n // n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n }\n}\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nfunction tr_static_init() {\n var n; /* iterates over tree elements */\n var bits; /* bit counter */\n var length; /* length value */\n var code; /* code value */\n var dist; /* distance index */\n var bl_count = new Array(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n // do check in _tr_init()\n //if (static_init_done) return;\n\n /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n static_l_desc.static_tree = static_ltree;\n static_l_desc.extra_bits = extra_lbits;\n static_d_desc.static_tree = static_dtree;\n static_d_desc.extra_bits = extra_dbits;\n static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n /* Initialize the mapping length (0..255) -> length code (0..28) */\n length = 0;\n for (code = 0; code < LENGTH_CODES - 1; code++) {\n base_length[code] = length;\n for (n = 0; n < (1 << extra_lbits[code]); n++) {\n _length_code[length++] = code;\n }\n }\n //Assert (length == 256, \"tr_static_init: length != 256\");\n /* Note that the length 255 (match length 258) can be represented\n * in two different ways: code 284 + 5 bits or code 285, so we\n * overwrite length_code[255] to use the best encoding:\n */\n _length_code[length - 1] = code;\n\n /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n dist = 0;\n for (code = 0; code < 16; code++) {\n base_dist[code] = dist;\n for (n = 0; n < (1 << extra_dbits[code]); n++) {\n _dist_code[dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: dist != 256\");\n dist >>= 7; /* from now on, all distances are divided by 128 */\n for (; code < D_CODES; code++) {\n base_dist[code] = dist << 7;\n for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n _dist_code[256 + dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n /* Construct the codes of the static literal tree */\n for (bits = 0; bits <= MAX_BITS; bits++) {\n bl_count[bits] = 0;\n }\n\n n = 0;\n while (n <= 143) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n while (n <= 255) {\n static_ltree[n * 2 + 1]/*.Len*/ = 9;\n n++;\n bl_count[9]++;\n }\n while (n <= 279) {\n static_ltree[n * 2 + 1]/*.Len*/ = 7;\n n++;\n bl_count[7]++;\n }\n while (n <= 287) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n /* Codes 286 and 287 do not exist, but we must include them in the\n * tree construction to get a canonical Huffman tree (longest code\n * all ones)\n */\n gen_codes(static_ltree, L_CODES + 1, bl_count);\n\n /* The static distance tree is trivial: */\n for (n = 0; n < D_CODES; n++) {\n static_dtree[n * 2 + 1]/*.Len*/ = 5;\n static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n }\n\n // Now data ready and we can init static trees\n static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);\n static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS);\n static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS);\n\n //static_init_done = true;\n}\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nfunction init_block(s) {\n var n; /* iterates over tree elements */\n\n /* Initialize the trees. */\n for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n s.opt_len = s.static_len = 0;\n s.last_lit = s.matches = 0;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nfunction bi_windup(s)\n{\n if (s.bi_valid > 8) {\n put_short(s, s.bi_buf);\n } else if (s.bi_valid > 0) {\n //put_byte(s, (Byte)s->bi_buf);\n s.pending_buf[s.pending++] = s.bi_buf;\n }\n s.bi_buf = 0;\n s.bi_valid = 0;\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nfunction copy_block(s, buf, len, header)\n//DeflateState *s;\n//charf *buf; /* the input data */\n//unsigned len; /* its length */\n//int header; /* true if block header must be written */\n{\n bi_windup(s); /* align on byte boundary */\n\n if (header) {\n put_short(s, len);\n put_short(s, ~len);\n }\n// while (len--) {\n// put_byte(s, *buf++);\n// }\n utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);\n s.pending += len;\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nfunction smaller(tree, n, m, depth) {\n var _n2 = n * 2;\n var _m2 = m * 2;\n return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n}\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nfunction pqdownheap(s, tree, k)\n// deflate_state *s;\n// ct_data *tree; /* the tree to restore */\n// int k; /* node to move down */\n{\n var v = s.heap[k];\n var j = k << 1; /* left son of k */\n while (j <= s.heap_len) {\n /* Set j to the smallest of the two sons: */\n if (j < s.heap_len &&\n smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n j++;\n }\n /* Exit if v is smaller than both sons */\n if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n /* Exchange v with the smallest son */\n s.heap[k] = s.heap[j];\n k = j;\n\n /* And continue down the tree, setting j to the left son of k */\n j <<= 1;\n }\n s.heap[k] = v;\n}\n\n\n// inlined manually\n// var SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nfunction compress_block(s, ltree, dtree)\n// deflate_state *s;\n// const ct_data *ltree; /* literal tree */\n// const ct_data *dtree; /* distance tree */\n{\n var dist; /* distance of matched string */\n var lc; /* match length or unmatched char (if dist == 0) */\n var lx = 0; /* running index in l_buf */\n var code; /* the code to send */\n var extra; /* number of extra bits to send */\n\n if (s.last_lit !== 0) {\n do {\n dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n lc = s.pending_buf[s.l_buf + lx];\n lx++;\n\n if (dist === 0) {\n send_code(s, lc, ltree); /* send a literal byte */\n //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n } else {\n /* Here, lc is the match length - MIN_MATCH */\n code = _length_code[lc];\n send_code(s, code + LITERALS + 1, ltree); /* send the length code */\n extra = extra_lbits[code];\n if (extra !== 0) {\n lc -= base_length[code];\n send_bits(s, lc, extra); /* send the extra length bits */\n }\n dist--; /* dist is now the match distance - 1 */\n code = d_code(dist);\n //Assert (code < D_CODES, \"bad d_code\");\n\n send_code(s, code, dtree); /* send the distance code */\n extra = extra_dbits[code];\n if (extra !== 0) {\n dist -= base_dist[code];\n send_bits(s, dist, extra); /* send the extra distance bits */\n }\n } /* literal or match pair ? */\n\n /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n // \"pendingBuf overflow\");\n\n } while (lx < s.last_lit);\n }\n\n send_code(s, END_BLOCK, ltree);\n}\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n * and corresponding code. The length opt_len is updated; static_len is\n * also updated if stree is not null. The field max_code is set.\n */\nfunction build_tree(s, desc)\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n var tree = desc.dyn_tree;\n var stree = desc.stat_desc.static_tree;\n var has_stree = desc.stat_desc.has_stree;\n var elems = desc.stat_desc.elems;\n var n, m; /* iterate over heap elements */\n var max_code = -1; /* largest code with non zero frequency */\n var node; /* new node being created */\n\n /* Construct the initial heap, with least frequent element in\n * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n * heap[0] is not used.\n */\n s.heap_len = 0;\n s.heap_max = HEAP_SIZE;\n\n for (n = 0; n < elems; n++) {\n if (tree[n * 2]/*.Freq*/ !== 0) {\n s.heap[++s.heap_len] = max_code = n;\n s.depth[n] = 0;\n\n } else {\n tree[n * 2 + 1]/*.Len*/ = 0;\n }\n }\n\n /* The pkzip format requires that at least one distance code exists,\n * and that at least one bit should be sent even if there is only one\n * possible code. So to avoid special checks later on we force at least\n * two codes of non zero frequency.\n */\n while (s.heap_len < 2) {\n node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n tree[node * 2]/*.Freq*/ = 1;\n s.depth[node] = 0;\n s.opt_len--;\n\n if (has_stree) {\n s.static_len -= stree[node * 2 + 1]/*.Len*/;\n }\n /* node is 0 or 1 so it does not have extra bits */\n }\n desc.max_code = max_code;\n\n /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n * establish sub-heaps of increasing lengths:\n */\n for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n /* Construct the Huffman tree by repeatedly combining the least two\n * frequent nodes.\n */\n node = elems; /* next internal node of the tree */\n do {\n //pqremove(s, tree, n); /* n = node of least frequency */\n /*** pqremove ***/\n n = s.heap[1/*SMALLEST*/];\n s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n pqdownheap(s, tree, 1/*SMALLEST*/);\n /***/\n\n m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n s.heap[--s.heap_max] = m;\n\n /* Create a new node father of n and m */\n tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n /* and insert the new node in the heap */\n s.heap[1/*SMALLEST*/] = node++;\n pqdownheap(s, tree, 1/*SMALLEST*/);\n\n } while (s.heap_len >= 2);\n\n s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n /* At this point, the fields freq and dad are set. We can now\n * generate the bit lengths.\n */\n gen_bitlen(s, desc);\n\n /* The field len is now set, we can generate the bit codes */\n gen_codes(tree, max_code, s.bl_count);\n}\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nfunction scan_tree(s, tree, max_code)\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n var n; /* iterates over all tree elements */\n var prevlen = -1; /* last emitted length */\n var curlen; /* length of current code */\n\n var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n var count = 0; /* repeat count of the current code */\n var max_count = 7; /* max repeat count */\n var min_count = 4; /* min repeat count */\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n } else if (curlen !== 0) {\n\n if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n } else if (count <= 10) {\n s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n } else {\n s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n }\n\n count = 0;\n prevlen = curlen;\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n}\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nfunction send_tree(s, tree, max_code)\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n var n; /* iterates over all tree elements */\n var prevlen = -1; /* last emitted length */\n var curlen; /* length of current code */\n\n var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n var count = 0; /* repeat count of the current code */\n var max_count = 7; /* max repeat count */\n var min_count = 4; /* min repeat count */\n\n /* tree[max_code+1].Len = -1; */ /* guard already set */\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n send_code(s, curlen, s.bl_tree);\n count--;\n }\n //Assert(count >= 3 && count <= 6, \" 3_6?\");\n send_code(s, REP_3_6, s.bl_tree);\n send_bits(s, count - 3, 2);\n\n } else if (count <= 10) {\n send_code(s, REPZ_3_10, s.bl_tree);\n send_bits(s, count - 3, 3);\n\n } else {\n send_code(s, REPZ_11_138, s.bl_tree);\n send_bits(s, count - 11, 7);\n }\n\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n}\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nfunction build_bl_tree(s) {\n var max_blindex; /* index of last bit length code of non zero freq */\n\n /* Determine the bit length frequencies for literal and distance trees */\n scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n /* Build the bit length tree: */\n build_tree(s, s.bl_desc);\n /* opt_len now includes the length of the tree representations, except\n * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n */\n\n /* Determine the number of bit length codes to send. The pkzip format\n * requires that at least 4 bit length codes be sent. (appnote.txt says\n * 3 but the actual value used is 4.)\n */\n for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {\n if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n break;\n }\n }\n /* Update opt_len to include the bit length tree and counts */\n s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n // s->opt_len, s->static_len));\n\n return max_blindex;\n}\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nfunction send_all_trees(s, lcodes, dcodes, blcodes)\n// deflate_state *s;\n// int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n var rank; /* index in bl_order */\n\n //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n // \"too many codes\");\n //Tracev((stderr, \"\\nbl counts: \"));\n send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n send_bits(s, dcodes - 1, 5);\n send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */\n for (rank = 0; rank < blcodes; rank++) {\n //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n }\n //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n * a) There are no non-portable control characters belonging to the\n * \"black list\" (0..6, 14..25, 28..31).\n * b) There is at least one printable character belonging to the\n * \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n * \"gray list\" that is ignored in this detection algorithm:\n * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nfunction detect_data_type(s) {\n /* black_mask is the bit mask of black-listed bytes\n * set bits 0..6, 14..25, and 28..31\n * 0xf3ffc07f = binary 11110011111111111100000001111111\n */\n var black_mask = 0xf3ffc07f;\n var n;\n\n /* Check for non-textual (\"black-listed\") bytes. */\n for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n return Z_BINARY;\n }\n }\n\n /* Check for textual (\"white-listed\") bytes. */\n if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n for (n = 32; n < LITERALS; n++) {\n if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n }\n\n /* There are no \"black-listed\" or \"white-listed\" bytes:\n * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n */\n return Z_BINARY;\n}\n\n\nvar static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nfunction _tr_init(s)\n{\n\n if (!static_init_done) {\n tr_static_init();\n static_init_done = true;\n }\n\n s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);\n s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);\n s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n /* Initialize the first block of the first file: */\n init_block(s);\n}\n\n\n/* ===========================================================================\n * Send a stored block\n */\nfunction _tr_stored_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf; /* input block */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */\n copy_block(s, buf, stored_len, true); /* with header */\n}\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nfunction _tr_align(s) {\n send_bits(s, STATIC_TREES << 1, 3);\n send_code(s, END_BLOCK, static_ltree);\n bi_flush(s);\n}\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nfunction _tr_flush_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf; /* input block, or NULL if too old */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n var opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n var max_blindex = 0; /* index of last bit length code of non zero freq */\n\n /* Build the Huffman trees unless a stored block is forced */\n if (s.level > 0) {\n\n /* Check if the file is binary or text */\n if (s.strm.data_type === Z_UNKNOWN) {\n s.strm.data_type = detect_data_type(s);\n }\n\n /* Construct the literal and distance trees */\n build_tree(s, s.l_desc);\n // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n\n build_tree(s, s.d_desc);\n // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n /* At this point, opt_len and static_len are the total bit lengths of\n * the compressed block data, excluding the tree representations.\n */\n\n /* Build the bit length tree for the above two trees, and get the index\n * in bl_order of the last bit length code to send.\n */\n max_blindex = build_bl_tree(s);\n\n /* Determine the best encoding. Compute the block lengths in bytes. */\n opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n // s->last_lit));\n\n if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n } else {\n // Assert(buf != (char*)0, \"lost buf\");\n opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n }\n\n if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n /* 4: two words for the lengths */\n\n /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n * Otherwise we can't have processed more than WSIZE input bytes since\n * the last block flush, because compression would have been\n * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n * transform a block into a stored block.\n */\n _tr_stored_block(s, buf, stored_len, last);\n\n } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n compress_block(s, static_ltree, static_dtree);\n\n } else {\n send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n compress_block(s, s.dyn_ltree, s.dyn_dtree);\n }\n // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n /* The above check is made mod 2^32, for files larger than 512 MB\n * and uLong implemented on 32 bits.\n */\n init_block(s);\n\n if (last) {\n bi_windup(s);\n }\n // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n // s->compressed_len-7*last));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nfunction _tr_tally(s, dist, lc)\n// deflate_state *s;\n// unsigned dist; /* distance of matched string */\n// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n //var out_length, in_length, dcode;\n\n s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;\n s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n s.last_lit++;\n\n if (dist === 0) {\n /* lc is the unmatched char */\n s.dyn_ltree[lc * 2]/*.Freq*/++;\n } else {\n s.matches++;\n /* Here, lc is the match length - MIN_MATCH */\n dist--; /* dist = match distance - 1 */\n //Assert((ush)dist < (ush)MAX_DIST(s) &&\n // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n // (ush)d_code(dist) < (ush)D_CODES, \"_tr_tally: bad match\");\n\n s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;\n s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n// /* Try to guess if it is profitable to stop the current block here */\n// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n// /* Compute an upper bound for the compressed length */\n// out_length = s.last_lit*8;\n// in_length = s.strstart - s.block_start;\n//\n// for (dcode = 0; dcode < D_CODES; dcode++) {\n// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n// }\n// out_length >>>= 3;\n// //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n// // s->last_lit, in_length, out_length,\n// // 100L - out_length*100L/in_length));\n// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n// return true;\n// }\n// }\n//#endif\n\n return (s.last_lit === s.lit_bufsize - 1);\n /* We avoid equality with lit_bufsize because of wraparound at 64K\n * on 16 bit machines and because stored blocks are restricted to\n * 64K-1 bytes.\n */\n}\n\nexports._tr_init = _tr_init;\nexports._tr_stored_block = _tr_stored_block;\nexports._tr_flush_block = _tr_flush_block;\nexports._tr_tally = _tr_tally;\nexports._tr_align = _tr_align;\n\n},{\"../utils/common\":304}],316:[function(_dereq_,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\n\nmodule.exports = ZStream;\n\n},{}],317:[function(_dereq_,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],318:[function(_dereq_,module,exports){\n// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g = (function() { return this })() || Function(\"return this\")();\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = _dereq_(\"./runtime\");\n\nif (hadRuntime) {\n // Restore the original runtime.\n g.regeneratorRuntime = oldRuntime;\n} else {\n // Remove the global property added by runtime.js.\n try {\n delete g.regeneratorRuntime;\n } catch(e) {\n g.regeneratorRuntime = undefined;\n }\n}\n\n},{\"./runtime\":319}],319:[function(_dereq_,module,exports){\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // In sloppy mode, unbound `this` refers to the global object, fallback to\n // Function constructor if we're in global strict mode. That is sadly a form\n // of indirect eval which violates Content Security Policy.\n (function() { return this })() || Function(\"return this\")()\n);\n\n},{}],320:[function(_dereq_,module,exports){\n(function (global){\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.Rusha = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_==\"function\"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_==\"function\"&&_dereq_;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){\nvar bundleFn = arguments[3];\nvar sources = arguments[4];\nvar cache = arguments[5];\n\nvar stringify = JSON.stringify;\n\nmodule.exports = function (fn, options) {\n var wkey;\n var cacheKeys = Object.keys(cache);\n\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n var exp = cache[key].exports;\n // Using babel as a transpiler to use esmodule, the export will always\n // be an object with the default export as a property of it. To ensure\n // the existing api and babel esmodule exports are both supported we\n // check for both\n if (exp === fn || exp && exp.default === fn) {\n wkey = key;\n break;\n }\n }\n\n if (!wkey) {\n wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n var wcache = {};\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n wcache[key] = key;\n }\n sources[wkey] = [\n 'function(require,module,exports){' + fn + '(self); }',\n wcache\n ];\n }\n var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n\n var scache = {}; scache[wkey] = wkey;\n sources[skey] = [\n 'function(require,module,exports){' +\n // try to call default if defined to also support babel esmodule exports\n 'var f = require(' + stringify(wkey) + ');' +\n '(f.default ? f.default : f)(self);' +\n '}',\n scache\n ];\n\n var workerSources = {};\n resolveSources(skey);\n\n function resolveSources(key) {\n workerSources[key] = true;\n\n for (var depPath in sources[key][1]) {\n var depKey = sources[key][1][depPath];\n if (!workerSources[depKey]) {\n resolveSources(depKey);\n }\n }\n }\n\n var src = '(' + bundleFn + ')({'\n + Object.keys(workerSources).map(function (key) {\n return stringify(key) + ':['\n + sources[key][0]\n + ',' + stringify(sources[key][1]) + ']'\n ;\n }).join(',')\n + '},{},[' + stringify(skey) + '])'\n ;\n\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;\n\n var blob = new Blob([src], { type: 'text/javascript' });\n if (options && options.bare) { return blob; }\n var workerUrl = URL.createObjectURL(blob);\n var worker = new Worker(workerUrl);\n worker.objectURL = workerUrl;\n return worker;\n};\n\n},{}],2:[function(_dereq_,module,exports){\n(function (global){\n\"use strict\";\n/* eslint-env commonjs, browser */\n\nvar reader = void 0;\nif (typeof self !== 'undefined' && typeof self.FileReaderSync !== 'undefined') {\n reader = new self.FileReaderSync();\n}\n\n// Convert a binary string and write it to the heap.\n// A binary string is expected to only contain char codes < 256.\nvar convStr = function (str, H8, H32, start, len, off) {\n var i = void 0,\n om = off % 4,\n lm = (len + om) % 4,\n j = len - lm;\n switch (om) {\n case 0:\n H8[off] = str.charCodeAt(start + 3);\n case 1:\n H8[off + 1 - (om << 1) | 0] = str.charCodeAt(start + 2);\n case 2:\n H8[off + 2 - (om << 1) | 0] = str.charCodeAt(start + 1);\n case 3:\n H8[off + 3 - (om << 1) | 0] = str.charCodeAt(start);\n }\n if (len < lm + (4 - om)) {\n return;\n }\n for (i = 4 - om; i < j; i = i + 4 | 0) {\n H32[off + i >> 2] = str.charCodeAt(start + i) << 24 | str.charCodeAt(start + i + 1) << 16 | str.charCodeAt(start + i + 2) << 8 | str.charCodeAt(start + i + 3);\n }\n switch (lm) {\n case 3:\n H8[off + j + 1 | 0] = str.charCodeAt(start + j + 2);\n case 2:\n H8[off + j + 2 | 0] = str.charCodeAt(start + j + 1);\n case 1:\n H8[off + j + 3 | 0] = str.charCodeAt(start + j);\n }\n};\n\n// Convert a buffer or array and write it to the heap.\n// The buffer or array is expected to only contain elements < 256.\nvar convBuf = function (buf, H8, H32, start, len, off) {\n var i = void 0,\n om = off % 4,\n lm = (len + om) % 4,\n j = len - lm;\n switch (om) {\n case 0:\n H8[off] = buf[start + 3];\n case 1:\n H8[off + 1 - (om << 1) | 0] = buf[start + 2];\n case 2:\n H8[off + 2 - (om << 1) | 0] = buf[start + 1];\n case 3:\n H8[off + 3 - (om << 1) | 0] = buf[start];\n }\n if (len < lm + (4 - om)) {\n return;\n }\n for (i = 4 - om; i < j; i = i + 4 | 0) {\n H32[off + i >> 2 | 0] = buf[start + i] << 24 | buf[start + i + 1] << 16 | buf[start + i + 2] << 8 | buf[start + i + 3];\n }\n switch (lm) {\n case 3:\n H8[off + j + 1 | 0] = buf[start + j + 2];\n case 2:\n H8[off + j + 2 | 0] = buf[start + j + 1];\n case 1:\n H8[off + j + 3 | 0] = buf[start + j];\n }\n};\n\nvar convBlob = function (blob, H8, H32, start, len, off) {\n var i = void 0,\n om = off % 4,\n lm = (len + om) % 4,\n j = len - lm;\n var buf = new Uint8Array(reader.readAsArrayBuffer(blob.slice(start, start + len)));\n switch (om) {\n case 0:\n H8[off] = buf[3];\n case 1:\n H8[off + 1 - (om << 1) | 0] = buf[2];\n case 2:\n H8[off + 2 - (om << 1) | 0] = buf[1];\n case 3:\n H8[off + 3 - (om << 1) | 0] = buf[0];\n }\n if (len < lm + (4 - om)) {\n return;\n }\n for (i = 4 - om; i < j; i = i + 4 | 0) {\n H32[off + i >> 2 | 0] = buf[i] << 24 | buf[i + 1] << 16 | buf[i + 2] << 8 | buf[i + 3];\n }\n switch (lm) {\n case 3:\n H8[off + j + 1 | 0] = buf[j + 2];\n case 2:\n H8[off + j + 2 | 0] = buf[j + 1];\n case 1:\n H8[off + j + 3 | 0] = buf[j];\n }\n};\n\nmodule.exports = function (data, H8, H32, start, len, off) {\n if (typeof data === 'string') {\n return convStr(data, H8, H32, start, len, off);\n }\n if (data instanceof Array) {\n return convBuf(data, H8, H32, start, len, off);\n }\n if (global.Buffer && global.Buffer.isBuffer(data)) {\n return convBuf(data, H8, H32, start, len, off);\n }\n if (data instanceof ArrayBuffer) {\n return convBuf(new Uint8Array(data), H8, H32, start, len, off);\n }\n if (data.buffer instanceof ArrayBuffer) {\n return convBuf(new Uint8Array(data.buffer, data.byteOffset, data.byteLength), H8, H32, start, len, off);\n }\n if (data instanceof Blob) {\n return convBlob(data, H8, H32, start, len, off);\n }\n throw new Error('Unsupported data type.');\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],3:[function(_dereq_,module,exports){\n'use strict';\n// The low-level RushCore module provides the heart of Rusha,\n// a high-speed sha1 implementation working on an Int32Array heap.\n// At first glance, the implementation seems complicated, however\n// with the SHA1 spec at hand, it is obvious this almost a textbook\n// implementation that has a few functions hand-inlined and a few loops\n// hand-unrolled.\nmodule.exports = function RushaCore(stdlib$1186, foreign$1187, heap$1188) {\n 'use asm';\n var H$1189 = new stdlib$1186.Int32Array(heap$1188);\n function hash$1190(k$1191, x$1192) {\n // k in bytes\n k$1191 = k$1191 | 0;\n x$1192 = x$1192 | 0;\n var i$1193 = 0, j$1194 = 0, y0$1195 = 0, z0$1196 = 0, y1$1197 = 0, z1$1198 = 0, y2$1199 = 0, z2$1200 = 0, y3$1201 = 0, z3$1202 = 0, y4$1203 = 0, z4$1204 = 0, t0$1205 = 0, t1$1206 = 0;\n y0$1195 = H$1189[x$1192 + 320 >> 2] | 0;\n y1$1197 = H$1189[x$1192 + 324 >> 2] | 0;\n y2$1199 = H$1189[x$1192 + 328 >> 2] | 0;\n y3$1201 = H$1189[x$1192 + 332 >> 2] | 0;\n y4$1203 = H$1189[x$1192 + 336 >> 2] | 0;\n for (i$1193 = 0; (i$1193 | 0) < (k$1191 | 0); i$1193 = i$1193 + 64 | 0) {\n z0$1196 = y0$1195;\n z1$1198 = y1$1197;\n z2$1200 = y2$1199;\n z3$1202 = y3$1201;\n z4$1204 = y4$1203;\n for (j$1194 = 0; (j$1194 | 0) < 64; j$1194 = j$1194 + 4 | 0) {\n t1$1206 = H$1189[i$1193 + j$1194 >> 2] | 0;\n t0$1205 = ((y0$1195 << 5 | y0$1195 >>> 27) + (y1$1197 & y2$1199 | ~y1$1197 & y3$1201) | 0) + ((t1$1206 + y4$1203 | 0) + 1518500249 | 0) | 0;\n y4$1203 = y3$1201;\n y3$1201 = y2$1199;\n y2$1199 = y1$1197 << 30 | y1$1197 >>> 2;\n y1$1197 = y0$1195;\n y0$1195 = t0$1205;\n H$1189[k$1191 + j$1194 >> 2] = t1$1206;\n }\n for (j$1194 = k$1191 + 64 | 0; (j$1194 | 0) < (k$1191 + 80 | 0); j$1194 = j$1194 + 4 | 0) {\n t1$1206 = (H$1189[j$1194 - 12 >> 2] ^ H$1189[j$1194 - 32 >> 2] ^ H$1189[j$1194 - 56 >> 2] ^ H$1189[j$1194 - 64 >> 2]) << 1 | (H$1189[j$1194 - 12 >> 2] ^ H$1189[j$1194 - 32 >> 2] ^ H$1189[j$1194 - 56 >> 2] ^ H$1189[j$1194 - 64 >> 2]) >>> 31;\n t0$1205 = ((y0$1195 << 5 | y0$1195 >>> 27) + (y1$1197 & y2$1199 | ~y1$1197 & y3$1201) | 0) + ((t1$1206 + y4$1203 | 0) + 1518500249 | 0) | 0;\n y4$1203 = y3$1201;\n y3$1201 = y2$1199;\n y2$1199 = y1$1197 << 30 | y1$1197 >>> 2;\n y1$1197 = y0$1195;\n y0$1195 = t0$1205;\n H$1189[j$1194 >> 2] = t1$1206;\n }\n for (j$1194 = k$1191 + 80 | 0; (j$1194 | 0) < (k$1191 + 160 | 0); j$1194 = j$1194 + 4 | 0) {\n t1$1206 = (H$1189[j$1194 - 12 >> 2] ^ H$1189[j$1194 - 32 >> 2] ^ H$1189[j$1194 - 56 >> 2] ^ H$1189[j$1194 - 64 >> 2]) << 1 | (H$1189[j$1194 - 12 >> 2] ^ H$1189[j$1194 - 32 >> 2] ^ H$1189[j$1194 - 56 >> 2] ^ H$1189[j$1194 - 64 >> 2]) >>> 31;\n t0$1205 = ((y0$1195 << 5 | y0$1195 >>> 27) + (y1$1197 ^ y2$1199 ^ y3$1201) | 0) + ((t1$1206 + y4$1203 | 0) + 1859775393 | 0) | 0;\n y4$1203 = y3$1201;\n y3$1201 = y2$1199;\n y2$1199 = y1$1197 << 30 | y1$1197 >>> 2;\n y1$1197 = y0$1195;\n y0$1195 = t0$1205;\n H$1189[j$1194 >> 2] = t1$1206;\n }\n for (j$1194 = k$1191 + 160 | 0; (j$1194 | 0) < (k$1191 + 240 | 0); j$1194 = j$1194 + 4 | 0) {\n t1$1206 = (H$1189[j$1194 - 12 >> 2] ^ H$1189[j$1194 - 32 >> 2] ^ H$1189[j$1194 - 56 >> 2] ^ H$1189[j$1194 - 64 >> 2]) << 1 | (H$1189[j$1194 - 12 >> 2] ^ H$1189[j$1194 - 32 >> 2] ^ H$1189[j$1194 - 56 >> 2] ^ H$1189[j$1194 - 64 >> 2]) >>> 31;\n t0$1205 = ((y0$1195 << 5 | y0$1195 >>> 27) + (y1$1197 & y2$1199 | y1$1197 & y3$1201 | y2$1199 & y3$1201) | 0) + ((t1$1206 + y4$1203 | 0) - 1894007588 | 0) | 0;\n y4$1203 = y3$1201;\n y3$1201 = y2$1199;\n y2$1199 = y1$1197 << 30 | y1$1197 >>> 2;\n y1$1197 = y0$1195;\n y0$1195 = t0$1205;\n H$1189[j$1194 >> 2] = t1$1206;\n }\n for (j$1194 = k$1191 + 240 | 0; (j$1194 | 0) < (k$1191 + 320 | 0); j$1194 = j$1194 + 4 | 0) {\n t1$1206 = (H$1189[j$1194 - 12 >> 2] ^ H$1189[j$1194 - 32 >> 2] ^ H$1189[j$1194 - 56 >> 2] ^ H$1189[j$1194 - 64 >> 2]) << 1 | (H$1189[j$1194 - 12 >> 2] ^ H$1189[j$1194 - 32 >> 2] ^ H$1189[j$1194 - 56 >> 2] ^ H$1189[j$1194 - 64 >> 2]) >>> 31;\n t0$1205 = ((y0$1195 << 5 | y0$1195 >>> 27) + (y1$1197 ^ y2$1199 ^ y3$1201) | 0) + ((t1$1206 + y4$1203 | 0) - 899497514 | 0) | 0;\n y4$1203 = y3$1201;\n y3$1201 = y2$1199;\n y2$1199 = y1$1197 << 30 | y1$1197 >>> 2;\n y1$1197 = y0$1195;\n y0$1195 = t0$1205;\n H$1189[j$1194 >> 2] = t1$1206;\n }\n y0$1195 = y0$1195 + z0$1196 | 0;\n y1$1197 = y1$1197 + z1$1198 | 0;\n y2$1199 = y2$1199 + z2$1200 | 0;\n y3$1201 = y3$1201 + z3$1202 | 0;\n y4$1203 = y4$1203 + z4$1204 | 0;\n }\n H$1189[x$1192 + 320 >> 2] = y0$1195;\n H$1189[x$1192 + 324 >> 2] = y1$1197;\n H$1189[x$1192 + 328 >> 2] = y2$1199;\n H$1189[x$1192 + 332 >> 2] = y3$1201;\n H$1189[x$1192 + 336 >> 2] = y4$1203;\n }\n return { hash: hash$1190 };\n};\n\n},{}],4:[function(_dereq_,module,exports){\n\"use strict\";\n/* eslint-env commonjs, browser */\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Rusha = _dereq_('./rusha');\n\nvar _require = _dereq_('./utils'),\n toHex = _require.toHex;\n\nvar Hash = function () {\n function Hash() {\n _classCallCheck(this, Hash);\n\n this._rusha = new Rusha();\n this._rusha.resetState();\n }\n\n Hash.prototype.update = function update(data) {\n this._rusha.append(data);\n return this;\n };\n\n Hash.prototype.digest = function digest(encoding) {\n var digest = this._rusha.rawEnd().buffer;\n if (!encoding) {\n return digest;\n }\n if (encoding === 'hex') {\n return toHex(digest);\n }\n throw new Error('unsupported digest encoding');\n };\n\n return Hash;\n}();\n\nmodule.exports = function () {\n return new Hash();\n};\n\n},{\"./rusha\":6,\"./utils\":7}],5:[function(_dereq_,module,exports){\n\"use strict\";\n/* eslint-env commonjs, browser */\n\nvar webworkify = _dereq_('webworkify');\n\nvar Rusha = _dereq_('./rusha');\nvar createHash = _dereq_('./hash');\nvar runWorker = _dereq_('./worker');\n\nvar _require = _dereq_('./utils'),\n isDedicatedWorkerScope = _require.isDedicatedWorkerScope;\n\nvar isRunningInDedicatedWorker = typeof self !== 'undefined' && isDedicatedWorkerScope(self);\n\nRusha.disableWorkerBehaviour = isRunningInDedicatedWorker ? runWorker() : function () {};\n\nRusha.createWorker = function () {\n var worker = webworkify(_dereq_('./worker'));\n var terminate = worker.terminate;\n worker.terminate = function () {\n URL.revokeObjectURL(worker.objectURL);\n terminate.call(worker);\n };\n return worker;\n};\n\nRusha.createHash = createHash;\n\nmodule.exports = Rusha;\n\n},{\"./hash\":4,\"./rusha\":6,\"./utils\":7,\"./worker\":8,\"webworkify\":1}],6:[function(_dereq_,module,exports){\n\"use strict\";\n/* eslint-env commonjs, browser */\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar RushaCore = _dereq_('./core.sjs');\n\nvar _require = _dereq_('./utils'),\n toHex = _require.toHex,\n ceilHeapSize = _require.ceilHeapSize;\n\nvar conv = _dereq_('./conv');\n\n// Calculate the length of buffer that the sha1 routine uses\n// including the padding.\nvar padlen = function (len) {\n for (len += 9; len % 64 > 0; len += 1) {}\n return len;\n};\n\nvar padZeroes = function (bin, len) {\n var h8 = new Uint8Array(bin.buffer);\n var om = len % 4,\n align = len - om;\n switch (om) {\n case 0:\n h8[align + 3] = 0;\n case 1:\n h8[align + 2] = 0;\n case 2:\n h8[align + 1] = 0;\n case 3:\n h8[align + 0] = 0;\n }\n for (var i = (len >> 2) + 1; i < bin.length; i++) {\n bin[i] = 0;\n }\n};\n\nvar padData = function (bin, chunkLen, msgLen) {\n bin[chunkLen >> 2] |= 0x80 << 24 - (chunkLen % 4 << 3);\n // To support msgLen >= 2 GiB, use a float division when computing the\n // high 32-bits of the big-endian message length in bits.\n bin[((chunkLen >> 2) + 2 & ~0x0f) + 14] = msgLen / (1 << 29) | 0;\n bin[((chunkLen >> 2) + 2 & ~0x0f) + 15] = msgLen << 3;\n};\n\nvar getRawDigest = function (heap, padMaxChunkLen) {\n var io = new Int32Array(heap, padMaxChunkLen + 320, 5);\n var out = new Int32Array(5);\n var arr = new DataView(out.buffer);\n arr.setInt32(0, io[0], false);\n arr.setInt32(4, io[1], false);\n arr.setInt32(8, io[2], false);\n arr.setInt32(12, io[3], false);\n arr.setInt32(16, io[4], false);\n return out;\n};\n\nvar Rusha = function () {\n function Rusha(chunkSize) {\n _classCallCheck(this, Rusha);\n\n chunkSize = chunkSize || 64 * 1024;\n if (chunkSize % 64 > 0) {\n throw new Error('Chunk size must be a multiple of 128 bit');\n }\n this._offset = 0;\n this._maxChunkLen = chunkSize;\n this._padMaxChunkLen = padlen(chunkSize);\n // The size of the heap is the sum of:\n // 1. The padded input message size\n // 2. The extended space the algorithm needs (320 byte)\n // 3. The 160 bit state the algoritm uses\n this._heap = new ArrayBuffer(ceilHeapSize(this._padMaxChunkLen + 320 + 20));\n this._h32 = new Int32Array(this._heap);\n this._h8 = new Int8Array(this._heap);\n this._core = new RushaCore({ Int32Array: Int32Array }, {}, this._heap);\n }\n\n Rusha.prototype._initState = function _initState(heap, padMsgLen) {\n this._offset = 0;\n var io = new Int32Array(heap, padMsgLen + 320, 5);\n io[0] = 1732584193;\n io[1] = -271733879;\n io[2] = -1732584194;\n io[3] = 271733878;\n io[4] = -1009589776;\n };\n\n Rusha.prototype._padChunk = function _padChunk(chunkLen, msgLen) {\n var padChunkLen = padlen(chunkLen);\n var view = new Int32Array(this._heap, 0, padChunkLen >> 2);\n padZeroes(view, chunkLen);\n padData(view, chunkLen, msgLen);\n return padChunkLen;\n };\n\n Rusha.prototype._write = function _write(data, chunkOffset, chunkLen, off) {\n conv(data, this._h8, this._h32, chunkOffset, chunkLen, off || 0);\n };\n\n Rusha.prototype._coreCall = function _coreCall(data, chunkOffset, chunkLen, msgLen, finalize) {\n var padChunkLen = chunkLen;\n this._write(data, chunkOffset, chunkLen);\n if (finalize) {\n padChunkLen = this._padChunk(chunkLen, msgLen);\n }\n this._core.hash(padChunkLen, this._padMaxChunkLen);\n };\n\n Rusha.prototype.rawDigest = function rawDigest(str) {\n var msgLen = str.byteLength || str.length || str.size || 0;\n this._initState(this._heap, this._padMaxChunkLen);\n var chunkOffset = 0,\n chunkLen = this._maxChunkLen;\n for (chunkOffset = 0; msgLen > chunkOffset + chunkLen; chunkOffset += chunkLen) {\n this._coreCall(str, chunkOffset, chunkLen, msgLen, false);\n }\n this._coreCall(str, chunkOffset, msgLen - chunkOffset, msgLen, true);\n return getRawDigest(this._heap, this._padMaxChunkLen);\n };\n\n Rusha.prototype.digest = function digest(str) {\n return toHex(this.rawDigest(str).buffer);\n };\n\n Rusha.prototype.digestFromString = function digestFromString(str) {\n return this.digest(str);\n };\n\n Rusha.prototype.digestFromBuffer = function digestFromBuffer(str) {\n return this.digest(str);\n };\n\n Rusha.prototype.digestFromArrayBuffer = function digestFromArrayBuffer(str) {\n return this.digest(str);\n };\n\n Rusha.prototype.resetState = function resetState() {\n this._initState(this._heap, this._padMaxChunkLen);\n return this;\n };\n\n Rusha.prototype.append = function append(chunk) {\n var chunkOffset = 0;\n var chunkLen = chunk.byteLength || chunk.length || chunk.size || 0;\n var turnOffset = this._offset % this._maxChunkLen;\n var inputLen = void 0;\n\n this._offset += chunkLen;\n while (chunkOffset < chunkLen) {\n inputLen = Math.min(chunkLen - chunkOffset, this._maxChunkLen - turnOffset);\n this._write(chunk, chunkOffset, inputLen, turnOffset);\n turnOffset += inputLen;\n chunkOffset += inputLen;\n if (turnOffset === this._maxChunkLen) {\n this._core.hash(this._maxChunkLen, this._padMaxChunkLen);\n turnOffset = 0;\n }\n }\n return this;\n };\n\n Rusha.prototype.getState = function getState() {\n var turnOffset = this._offset % this._maxChunkLen;\n var heap = void 0;\n if (!turnOffset) {\n var io = new Int32Array(this._heap, this._padMaxChunkLen + 320, 5);\n heap = io.buffer.slice(io.byteOffset, io.byteOffset + io.byteLength);\n } else {\n heap = this._heap.slice(0);\n }\n return {\n offset: this._offset,\n heap: heap\n };\n };\n\n Rusha.prototype.setState = function setState(state) {\n this._offset = state.offset;\n if (state.heap.byteLength === 20) {\n var io = new Int32Array(this._heap, this._padMaxChunkLen + 320, 5);\n io.set(new Int32Array(state.heap));\n } else {\n this._h32.set(new Int32Array(state.heap));\n }\n return this;\n };\n\n Rusha.prototype.rawEnd = function rawEnd() {\n var msgLen = this._offset;\n var chunkLen = msgLen % this._maxChunkLen;\n var padChunkLen = this._padChunk(chunkLen, msgLen);\n this._core.hash(padChunkLen, this._padMaxChunkLen);\n var result = getRawDigest(this._heap, this._padMaxChunkLen);\n this._initState(this._heap, this._padMaxChunkLen);\n return result;\n };\n\n Rusha.prototype.end = function end() {\n return toHex(this.rawEnd().buffer);\n };\n\n return Rusha;\n}();\n\nmodule.exports = Rusha;\nmodule.exports._core = RushaCore;\n\n},{\"./conv\":2,\"./core.sjs\":3,\"./utils\":7}],7:[function(_dereq_,module,exports){\n\"use strict\";\n/* eslint-env commonjs, browser */\n\n//\n// toHex\n//\n\nvar precomputedHex = new Array(256);\nfor (var i = 0; i < 256; i++) {\n precomputedHex[i] = (i < 0x10 ? '0' : '') + i.toString(16);\n}\n\nmodule.exports.toHex = function (arrayBuffer) {\n var binarray = new Uint8Array(arrayBuffer);\n var res = new Array(arrayBuffer.byteLength);\n for (var _i = 0; _i < res.length; _i++) {\n res[_i] = precomputedHex[binarray[_i]];\n }\n return res.join('');\n};\n\n//\n// ceilHeapSize\n//\n\nmodule.exports.ceilHeapSize = function (v) {\n // The asm.js spec says:\n // The heap object's byteLength must be either\n // 2^n for n in [12, 24) or 2^24 * n for n ≥ 1.\n // Also, byteLengths smaller than 2^16 are deprecated.\n var p = 0;\n // If v is smaller than 2^16, the smallest possible solution\n // is 2^16.\n if (v <= 65536) return 65536;\n // If v < 2^24, we round up to 2^n,\n // otherwise we round up to 2^24 * n.\n if (v < 16777216) {\n for (p = 1; p < v; p = p << 1) {}\n } else {\n for (p = 16777216; p < v; p += 16777216) {}\n }\n return p;\n};\n\n//\n// isDedicatedWorkerScope\n//\n\nmodule.exports.isDedicatedWorkerScope = function (self) {\n var isRunningInWorker = 'WorkerGlobalScope' in self && self instanceof self.WorkerGlobalScope;\n var isRunningInSharedWorker = 'SharedWorkerGlobalScope' in self && self instanceof self.SharedWorkerGlobalScope;\n var isRunningInServiceWorker = 'ServiceWorkerGlobalScope' in self && self instanceof self.ServiceWorkerGlobalScope;\n\n // Detects whether we run inside a dedicated worker or not.\n //\n // We can't just check for `DedicatedWorkerGlobalScope`, since IE11\n // has a bug where it only supports `WorkerGlobalScope`.\n //\n // Therefore, we consider us as running inside a dedicated worker\n // when we are running inside a worker, but not in a shared or service worker.\n //\n // When new types of workers are introduced, we will need to adjust this code.\n return isRunningInWorker && !isRunningInSharedWorker && !isRunningInServiceWorker;\n};\n\n},{}],8:[function(_dereq_,module,exports){\n\"use strict\";\n/* eslint-env commonjs, worker */\n\nmodule.exports = function () {\n var Rusha = _dereq_('./rusha');\n\n var hashData = function (hasher, data, cb) {\n try {\n return cb(null, hasher.digest(data));\n } catch (e) {\n return cb(e);\n }\n };\n\n var hashFile = function (hasher, readTotal, blockSize, file, cb) {\n var reader = new self.FileReader();\n reader.onloadend = function onloadend() {\n if (reader.error) {\n return cb(reader.error);\n }\n var buffer = reader.result;\n readTotal += reader.result.byteLength;\n try {\n hasher.append(buffer);\n } catch (e) {\n cb(e);\n return;\n }\n if (readTotal < file.size) {\n hashFile(hasher, readTotal, blockSize, file, cb);\n } else {\n cb(null, hasher.end());\n }\n };\n reader.readAsArrayBuffer(file.slice(readTotal, readTotal + blockSize));\n };\n\n var workerBehaviourEnabled = true;\n\n self.onmessage = function (event) {\n if (!workerBehaviourEnabled) {\n return;\n }\n\n var data = event.data.data,\n file = event.data.file,\n id = event.data.id;\n if (typeof id === 'undefined') return;\n if (!file && !data) return;\n var blockSize = event.data.blockSize || 4 * 1024 * 1024;\n var hasher = new Rusha(blockSize);\n hasher.resetState();\n var done = function (err, hash) {\n if (!err) {\n self.postMessage({ id: id, hash: hash });\n } else {\n self.postMessage({ id: id, error: err.name });\n }\n };\n if (data) hashData(hasher, data, done);\n if (file) hashFile(hasher, 0, blockSize, file, done);\n };\n\n return function () {\n workerBehaviourEnabled = false;\n };\n};\n\n},{\"./rusha\":6}]},{},[5])(5)\n});\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],321:[function(_dereq_,module,exports){\n(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split(/\\r?\\n/).forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n},{}],322:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nexports.CleartextMessage = CleartextMessage;\nexports.readArmored = readArmored;\n\nvar _armor = _dereq_('./encoding/armor');\n\nvar _armor2 = _interopRequireDefault(_armor);\n\nvar _enums = _dereq_('./enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('./util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _packet = _dereq_('./packet');\n\nvar _packet2 = _interopRequireDefault(_packet);\n\nvar _signature = _dereq_('./signature');\n\nvar _message = _dereq_('./message');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @class\n * @classdesc Class that represents an OpenPGP cleartext signed message.\n * See {@link https://tools.ietf.org/html/rfc4880#section-7}\n * @param {String} text The cleartext of the signed message\n * @param {module:signature.Signature} signature The detached signature or an empty signature for unsigned messages\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires encoding/armor\n * @requires enums\n * @requires util\n * @requires packet\n * @requires signature\n * @module cleartext\n */\n\nfunction CleartextMessage(text, signature) {\n if (!(this instanceof CleartextMessage)) {\n return new CleartextMessage(text, signature);\n }\n // normalize EOL to canonical form <CR><LF>\n this.text = _util2.default.canonicalizeEOL(_util2.default.removeTrailingSpaces(text));\n if (signature && !(signature instanceof _signature.Signature)) {\n throw new Error('Invalid signature input');\n }\n this.signature = signature || new _signature.Signature(new _packet2.default.List());\n}\n\n/**\n * Returns the key IDs of the keys that signed the cleartext message\n * @returns {Array<module:type/keyid>} array of keyid objects\n */\nCleartextMessage.prototype.getSigningKeyIds = function () {\n var keyIds = [];\n var signatureList = this.signature.packets;\n signatureList.forEach(function (packet) {\n keyIds.push(packet.issuerKeyId);\n });\n return keyIds;\n};\n\n/**\n * Sign the cleartext message\n * @param {Array<module:key.Key>} privateKeys private keys with decrypted secret key data for signing\n * @param {Signature} signature (optional) any existing detached signature\n * @param {Date} date (optional) The creation time of the signature that should be created\n * @param {Object} userId (optional) user ID to sign with, e.g. { name:'Steve Sender', email:'steve@openpgp.org' }\n * @returns {Promise<module:cleartext.CleartextMessage>} new cleartext message with signed content\n * @async\n */\nCleartextMessage.prototype.sign = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(privateKeys) {\n var signature = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n var userId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.t0 = CleartextMessage;\n _context.t1 = this.text;\n _context.next = 4;\n return this.signDetached(privateKeys, signature, date, userId);\n\n case 4:\n _context.t2 = _context.sent;\n return _context.abrupt('return', new _context.t0(_context.t1, _context.t2));\n\n case 6:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Sign the cleartext message\n * @param {Array<module:key.Key>} privateKeys private keys with decrypted secret key data for signing\n * @param {Signature} signature (optional) any existing detached signature\n * @param {Date} date (optional) The creation time of the signature that should be created\n * @param {Object} userId (optional) user ID to sign with, e.g. { name:'Steve Sender', email:'steve@openpgp.org' }\n * @returns {Promise<module:signature.Signature>} new detached signature of message content\n * @async\n */\nCleartextMessage.prototype.signDetached = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(privateKeys) {\n var signature = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n var userId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var literalDataPacket;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n literalDataPacket = new _packet2.default.Literal();\n\n literalDataPacket.setText(this.text);\n\n _context2.t0 = _signature.Signature;\n _context2.next = 5;\n return (0, _message.createSignaturePackets)(literalDataPacket, privateKeys, signature, date, userId);\n\n case 5:\n _context2.t1 = _context2.sent;\n return _context2.abrupt('return', new _context2.t0(_context2.t1));\n\n case 7:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function (_x5) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n/**\n * Verify signatures of cleartext signed message\n * @param {Array<module:key.Key>} keys array of keys to verify signatures\n * @param {Date} date (optional) Verify the signature against the given date, i.e. check signature creation time < date < expiration time\n * @returns {Promise<Array<{keyid: module:type/keyid, valid: Boolean}>>} list of signer's keyid and validity of signature\n * @async\n */\nCleartextMessage.prototype.verify = function (keys) {\n var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date();\n\n return this.verifyDetached(this.signature, keys, date);\n};\n\n/**\n * Verify signatures of cleartext signed message\n * @param {Array<module:key.Key>} keys array of keys to verify signatures\n * @param {Date} date (optional) Verify the signature against the given date, i.e. check signature creation time < date < expiration time\n * @returns {Promise<Array<{keyid: module:type/keyid, valid: Boolean}>>} list of signer's keyid and validity of signature\n * @async\n */\nCleartextMessage.prototype.verifyDetached = function (signature, keys) {\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n\n var signatureList = signature.packets;\n var literalDataPacket = new _packet2.default.Literal();\n // we assume that cleartext signature is generated based on UTF8 cleartext\n literalDataPacket.setText(this.text);\n return (0, _message.createVerificationObjects)(signatureList, [literalDataPacket], keys, date);\n};\n\n/**\n * Get cleartext\n * @returns {String} cleartext of message\n */\nCleartextMessage.prototype.getText = function () {\n // normalize end of line to \\n\n return _util2.default.nativeEOL(this.text);\n};\n\n/**\n * Returns ASCII armored text of cleartext signed message\n * @returns {String} ASCII armor\n */\nCleartextMessage.prototype.armor = function () {\n var hashes = this.signature.packets.map(function (packet) {\n return _enums2.default.read(_enums2.default.hash, packet.hashAlgorithm).toUpperCase();\n });\n hashes = hashes.filter(function (item, i, ar) {\n return ar.indexOf(item) === i;\n });\n var body = {\n hash: hashes.join(),\n text: this.text,\n data: this.signature.packets.write()\n };\n return _armor2.default.encode(_enums2.default.armor.signed, body);\n};\n\n/**\n * reads an OpenPGP cleartext signed message and returns a CleartextMessage object\n * @param {String} armoredText text to be parsed\n * @returns {module:cleartext.CleartextMessage} new cleartext message object\n * @static\n */\nfunction readArmored(armoredText) {\n var input = _armor2.default.decode(armoredText);\n if (input.type !== _enums2.default.armor.signed) {\n throw new Error('No cleartext signed message.');\n }\n var packetlist = new _packet2.default.List();\n packetlist.read(input.data);\n verifyHeaders(input.headers, packetlist);\n var signature = new _signature.Signature(packetlist);\n return new CleartextMessage(input.text, signature);\n}\n\n/**\n * Compare hash algorithm specified in the armor header with signatures\n * @param {Array<String>} headers Armor headers\n * @param {module:packet.List} packetlist The packetlist with signature packets\n * @private\n */\nfunction verifyHeaders(headers, packetlist) {\n var checkHashAlgos = function checkHashAlgos(hashAlgos) {\n var check = function check(packet) {\n return function (algo) {\n return packet.hashAlgorithm === algo;\n };\n };\n\n for (var i = 0; i < packetlist.length; i++) {\n if (packetlist[i].tag === _enums2.default.packet.signature && !hashAlgos.some(check(packetlist[i]))) {\n return false;\n }\n }\n return true;\n };\n\n var oneHeader = null;\n var hashAlgos = [];\n headers.forEach(function (header) {\n oneHeader = header.match(/Hash: (.+)/); // get header value\n if (oneHeader) {\n oneHeader = oneHeader[1].replace(/\\s/g, ''); // remove whitespace\n oneHeader = oneHeader.split(',');\n oneHeader = oneHeader.map(function (hash) {\n hash = hash.toLowerCase();\n try {\n return _enums2.default.write(_enums2.default.hash, hash);\n } catch (e) {\n throw new Error('Unknown hash algorithm in armor header: ' + hash);\n }\n });\n hashAlgos = hashAlgos.concat(oneHeader);\n } else {\n throw new Error('Only \"Hash\" header allowed in cleartext signed message');\n }\n });\n\n if (!hashAlgos.length && !checkHashAlgos([_enums2.default.hash.md5])) {\n throw new Error('If no \"Hash\" header in cleartext signed message, then only MD5 signatures allowed');\n } else if (hashAlgos.length && !checkHashAlgos(hashAlgos)) {\n throw new Error('Hash algorithm mismatch in armor header and signature');\n }\n}\n\n},{\"./encoding/armor\":357,\"./enums\":359,\"./message\":366,\"./packet\":371,\"./signature\":391,\"./util\":398,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],323:[function(_dereq_,module,exports){\n(function (process,Buffer){\n\"use strict\";\n\nvar _typeof2 = _dereq_(\"babel-runtime/helpers/typeof\");\n\nvar _typeof3 = _interopRequireDefault(_typeof2);\n\nvar _create = _dereq_(\"babel-runtime/core-js/object/create\");\n\nvar _create2 = _interopRequireDefault(_create);\n\nvar _freeze = _dereq_(\"babel-runtime/core-js/object/freeze\");\n\nvar _freeze2 = _interopRequireDefault(_freeze);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar freeze, Stream, BitStream, Util, BWT, CRC32, HuffmanAllocator, Bzip2;freeze = function () {\n return _freeze2.default ? _freeze2.default : function (e) {\n return e;\n };\n}(), Stream = function (e) {\n var t = function t() {};return t.prototype.readByte = function () {\n var e = [0];return 0 === this.read(e, 0, 1) ? (this._eof = !0, -1) : e[0];\n }, t.prototype.read = function (e, t, r) {\n for (var n, i = 0; i < r;) {\n if (-1 === (n = this.readByte())) {\n this._eof = !0;break;\n }e[t + i++] = n;\n }return i;\n }, t.prototype.eof = function () {\n return !!this._eof;\n }, t.prototype.seek = function (e) {\n throw new Error(\"Stream is not seekable.\");\n }, t.prototype.tell = function () {\n throw new Error(\"Stream is not seekable.\");\n }, t.prototype.writeByte = function (e) {\n var t = [e];this.write(t, 0, 1);\n }, t.prototype.write = function (e, t, r) {\n var n;for (n = 0; n < r; n++) {\n this.writeByte(e[t + n]);\n }return r;\n }, t.prototype.flush = function () {}, t.EOF = -1, e(t);\n}(freeze), BitStream = function (e) {\n var t = function t(_t) {\n (function () {\n var r = 256;this.readBit = function () {\n if (0 == (255 & r)) {\n var n = _t.readByte();if (n === e.EOF) return this._eof = !0, n;r = n << 1 | 1;\n }var i = 256 & r ? 1 : 0;return r <<= 1, i;\n }, this.seekBit = function (e) {\n var t = e >>> 3,\n r = e - 8 * t;this.seek(t), this._eof = !1, this.readBits(r);\n }, this.tellBit = function () {\n for (var e = 8 * _t.tell(), n = r; 0 != (255 & n);) {\n e--, n <<= 1;\n }return e;\n }, this.readByte = function () {\n return 0 == (255 & r) ? _t.readByte() : this.readBits(8);\n }, this.seek = function (e) {\n _t.seek(e), r = 256;\n };\n }).call(this), function () {\n var e = 1;this.writeBit = function (r) {\n e <<= 1, r && (e |= 1), 256 & e && (_t.writeByte(255 & e), e = 1);\n }, this.writeByte = function (r) {\n 1 === e ? _t.writeByte(r) : _t.writeBits(8, r);\n }, this.flush = function () {\n for (; 1 !== e;) {\n this.writeBit(0);\n }_t.flush && _t.flush();\n };\n }.call(this);\n };return t.EOF = e.EOF, t.prototype = (0, _create2.default)(e.prototype), t.prototype.readBits = function (e) {\n var t,\n r = 0;if (e > 31) return (r = 65536 * this.readBits(e - 16)) + this.readBits(16);for (t = 0; t < e; t++) {\n r <<= 1, this.readBit() > 0 && r++;\n }return r;\n }, t.prototype.writeBits = function (e, t) {\n if (e > 32) {\n var r = 65535 & t,\n n = (t - r) / 65536;return this.writeBits(e - 16, n), void this.writeBits(16, r);\n }var i;for (i = e - 1; i >= 0; i--) {\n this.writeBit(t >>> i & 1);\n }\n }, t;\n}(Stream), Util = function (e, t) {\n var r = (0, _create2.default)(null),\n n = t.EOF;r.coerceInputStream = function (e, r) {\n if (\"readByte\" in e) {\n if (r && !(\"read\" in e)) {\n var i = e;e = new t(), e.readByte = function () {\n var e = i.readByte();return e === n && (this._eof = !0), e;\n }, \"size\" in i && (e.size = i.size), \"seek\" in i && (e.seek = function (e) {\n i.seek(e), this._eof = !1;\n }), \"tell\" in i && (e.tell = i.tell.bind(i));\n }\n } else {\n var o = e;e = new t(), e.size = o.length, e.pos = 0, e.readByte = function () {\n return this.pos >= this.size ? n : o[this.pos++];\n }, e.read = function (e, t, r) {\n for (var n = 0; n < r && this.pos < o.length;) {\n e[t++] = o[this.pos++], n++;\n }return n;\n }, e.seek = function (e) {\n this.pos = e;\n }, e.tell = function () {\n return this.pos;\n }, e.eof = function () {\n return this.pos >= o.length;\n };\n }return e;\n };var i = function i(e, t) {\n this.buffer = e, this.resizeOk = t, this.pos = 0;\n };i.prototype = (0, _create2.default)(t.prototype), i.prototype.writeByte = function (e) {\n if (this.resizeOk && this.pos >= this.buffer.length) {\n var t = r.makeU8Buffer(2 * this.buffer.length);t.set(this.buffer), this.buffer = t;\n }this.buffer[this.pos++] = e;\n }, i.prototype.getBuffer = function () {\n if (this.pos !== this.buffer.length) {\n if (!this.resizeOk) throw new TypeError(\"outputsize does not match decoded input\");var e = r.makeU8Buffer(this.pos);e.set(this.buffer.subarray(0, this.pos)), this.buffer = e;\n }return this.buffer;\n }, r.coerceOutputStream = function (e, t) {\n var n = { stream: e, retval: e };if (e) {\n if (\"object\" == (typeof e === \"undefined\" ? \"undefined\" : (0, _typeof3.default)(e)) && \"writeByte\" in e) return n;\"number\" == typeof t ? (console.assert(t >= 0), n.stream = new i(r.makeU8Buffer(t), !1)) : n.stream = new i(e, !1);\n } else n.stream = new i(r.makeU8Buffer(16384), !0);return Object.defineProperty(n, \"retval\", { get: n.stream.getBuffer.bind(n.stream) }), n;\n }, r.compressFileHelper = function (e, t, n) {\n return function (i, o, f) {\n i = r.coerceInputStream(i);var a = r.coerceOutputStream(o, o);o = a.stream;var u;for (u = 0; u < e.length; u++) {\n o.writeByte(e.charCodeAt(u));\n }var s;if (s = \"size\" in i && i.size >= 0 ? i.size : -1, n) {\n var c = r.coerceOutputStream([]);for (r.writeUnsignedNumber(c.stream, s + 1), c = c.retval, u = 0; u < c.length - 1; u++) {\n o.writeByte(c[u]);\n }n = c[c.length - 1];\n } else r.writeUnsignedNumber(o, s + 1);return t(i, o, s, f, n), a.retval;\n };\n }, r.decompressFileHelper = function (e, t) {\n return function (n, i) {\n n = r.coerceInputStream(n);var o;for (o = 0; o < e.length; o++) {\n if (e.charCodeAt(o) !== n.readByte()) throw new Error(\"Bad magic\");\n }var f = r.readUnsignedNumber(n) - 1,\n a = r.coerceOutputStream(i, f);return i = a.stream, t(n, i, f), a.retval;\n };\n }, r.compressWithModel = function (e, t, r) {\n for (var i = 0; i !== t;) {\n var o = e.readByte();if (o === n) {\n r.encode(256);break;\n }r.encode(o), i++;\n }\n }, r.decompressWithModel = function (e, t, r) {\n for (var n = 0; n !== t;) {\n var i = r.decode();if (256 === i) break;e.writeByte(i), n++;\n }\n }, r.writeUnsignedNumber = function (e, t) {\n console.assert(t >= 0);var r,\n n = [];do {\n n.push(127 & t), t = Math.floor(t / 128);\n } while (0 !== t);for (n[0] |= 128, r = n.length - 1; r >= 0; r--) {\n e.writeByte(n[r]);\n }return e;\n }, r.readUnsignedNumber = function (e) {\n for (var t, r = 0;;) {\n if (128 & (t = e.readByte())) {\n r += 127 & t;break;\n }r = 128 * (r + t);\n }return r;\n };var o = function o(e) {\n for (var t = 0, r = e.length; t < r; t++) {\n e[t] = 0;\n }return e;\n },\n f = function f(e) {\n return o(new Array(e));\n },\n a = function a(e) {\n return e;\n };\"undefined\" != typeof process && Array.prototype.some.call(new Uint32Array(128), function (e) {\n return 0 !== e;\n }) && (a = o), r.makeU8Buffer = \"undefined\" != typeof Uint8Array ? function (e) {\n return a(new Uint8Array(e));\n } : \"undefined\" != typeof Buffer ? function (e) {\n var t = new Buffer(e);return t.fill(0), t;\n } : f, r.makeU16Buffer = \"undefined\" != typeof Uint16Array ? function (e) {\n return a(new Uint16Array(e));\n } : f, r.makeU32Buffer = \"undefined\" != typeof Uint32Array ? function (e) {\n return a(new Uint32Array(e));\n } : f, r.makeS32Buffer = \"undefined\" != typeof Int32Array ? function (e) {\n return a(new Int32Array(e));\n } : f, r.arraycopy = function (e, t) {\n console.assert(e.length >= t.length);for (var r = 0, n = t.length; r < n; r++) {\n e[r] = t[r];\n }return e;\n };var u = [0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8];console.assert(256 === u.length);var s = r.fls = function (e) {\n return console.assert(e >= 0), e > 4294967295 ? 32 + s(Math.floor(e / 4294967296)) : 0 != (4294901760 & e) ? 0 != (4278190080 & e) ? 24 + u[e >>> 24 & 255] : 16 + u[e >>> 16] : 0 != (65280 & e) ? 8 + u[e >>> 8] : u[e];\n };return r.log2c = function (e) {\n return 0 === e ? -1 : s(e - 1);\n }, e(r);\n}(freeze, Stream), BWT = function (e, t) {\n var r = console.assert.bind(console),\n n = function n(e, t, r, _n) {\n var i;for (i = 0; i < _n; i++) {\n t[i] = 0;\n }for (i = 0; i < r; i++) {\n t[e[i]]++;\n }\n },\n i = function i(e, t, r, n) {\n var i,\n o = 0;if (n) for (i = 0; i < r; i++) {\n o += e[i], t[i] = o;\n } else for (i = 0; i < r; i++) {\n o += e[i], t[i] = o - e[i];\n }\n },\n o = function o(e, t, _o, f, a, u) {\n var s, c, h, l, d;for (_o === f && n(e, _o, a, u), i(_o, f, u, !1), h = a - 1, s = f[d = e[h]], h--, t[s++] = e[h] < d ? ~h : h, c = 0; c < a; c++) {\n (h = t[c]) > 0 ? (r(e[h] >= e[h + 1]), (l = e[h]) !== d && (f[d] = s, s = f[d = l]), r(c < s), h--, t[s++] = e[h] < d ? ~h : h, t[c] = 0) : h < 0 && (t[c] = ~h);\n }for (_o === f && n(e, _o, a, u), i(_o, f, u, 1), c = a - 1, s = f[d = 0]; c >= 0; c--) {\n (h = t[c]) > 0 && (r(e[h] <= e[h + 1]), (l = e[h]) !== d && (f[d] = s, s = f[d = l]), r(s <= c), h--, t[--s] = e[h] > d ? ~(h + 1) : h, t[c] = 0);\n }\n },\n f = function f(e, t, n, i) {\n var o, f, a, u, s, c, h, l, d, B;for (r(n > 0), o = 0; (a = t[o]) < 0; o++) {\n t[o] = ~a, r(o + 1 < n);\n }if (o < i) for (f = o, o++; r(o < n), !((a = t[o]) < 0 && (t[f++] = ~a, t[o] = 0, f === i)); o++) {}l = e[o = f = n - 1];do {\n d = l;\n } while (--o >= 0 && (l = e[o]) >= d);for (; o >= 0;) {\n do {\n d = l;\n } while (--o >= 0 && (l = e[o]) <= d);if (o >= 0) {\n t[i + (o + 1 >>> 1)] = f - o, f = o + 1;do {\n d = l;\n } while (--o >= 0 && (l = e[o]) >= d);\n }\n }for (o = 0, h = 0, u = n, c = 0; o < i; o++) {\n if (a = t[o], s = t[i + (a >>> 1)], B = !0, s === c && u + s < n) {\n for (f = 0; f < s && e[a + f] === e[u + f];) {\n f++;\n }f === s && (B = !1);\n }B && (h++, u = a, c = s), t[i + (a >>> 1)] = h;\n }return h;\n },\n a = function a(e, t, o, f, _a, u) {\n var s, c, h, l, d;for (o === f && n(e, o, _a, u), i(o, f, u, !1), h = _a - 1, s = f[d = e[h]], t[s++] = h > 0 && e[h - 1] < d ? ~h : h, c = 0; c < _a; c++) {\n h = t[c], t[c] = ~h, h > 0 && (h--, r(e[h] >= e[h + 1]), (l = e[h]) !== d && (f[d] = s, s = f[d = l]), r(c < s), t[s++] = h > 0 && e[h - 1] < d ? ~h : h);\n }for (o === f && n(e, o, _a, u), i(o, f, u, !0), c = _a - 1, s = f[d = 0]; c >= 0; c--) {\n (h = t[c]) > 0 ? (h--, r(e[h] <= e[h + 1]), (l = e[h]) !== d && (f[d] = s, s = f[d = l]), r(s <= c), t[--s] = 0 === h || e[h - 1] > d ? ~h : h) : t[c] = ~h;\n }\n },\n u = function u(e, t, o, f, a, _u) {\n var s,\n c,\n h,\n l,\n d,\n B = -1;for (o === f && n(e, o, a, _u), i(o, f, _u, !1), h = a - 1, s = f[d = e[h]], t[s++] = h > 0 && e[h - 1] < d ? ~h : h, c = 0; c < a; c++) {\n (h = t[c]) > 0 ? (h--, r(e[h] >= e[h + 1]), t[c] = ~(l = e[h]), l !== d && (f[d] = s, s = f[d = l]), r(c < s), t[s++] = h > 0 && e[h - 1] < d ? ~h : h) : 0 !== h && (t[c] = ~h);\n }for (o === f && n(e, o, a, _u), i(o, f, _u, !0), c = a - 1, s = f[d = 0]; c >= 0; c--) {\n (h = t[c]) > 0 ? (h--, r(e[h] <= e[h + 1]), t[c] = l = e[h], l !== d && (f[d] = s, s = f[d = l]), r(s <= c), t[--s] = h > 0 && e[h - 1] > d ? ~e[h - 1] : h) : 0 !== h ? t[c] = ~h : B = c;\n }return B;\n },\n s = function s(e, c, h, l, d, B) {\n var p,\n v,\n m,\n w,\n E,\n g,\n _,\n b,\n y,\n R,\n C,\n k,\n T,\n O = 0,\n S = 0;for (d <= 256 ? (p = t.makeS32Buffer(d), d <= h ? (v = c.subarray(l + h - d), S = 1) : (v = t.makeS32Buffer(d), S = 3)) : d <= h ? (p = c.subarray(l + h - d), d <= h - d ? (v = c.subarray(l + h - 2 * d), S = 0) : d <= 1024 ? (v = t.makeS32Buffer(d), S = 2) : (v = p, S = 8)) : (p = v = t.makeS32Buffer(d), S = 12), n(e, p, l, d), i(p, v, d, !0), w = 0; w < l; w++) {\n c[w] = 0;\n }g = -1, w = l - 1, E = l, _ = 0, k = e[l - 1];do {\n T = k;\n } while (--w >= 0 && (k = e[w]) >= T);for (; w >= 0;) {\n do {\n T = k;\n } while (--w >= 0 && (k = e[w]) <= T);if (w >= 0) {\n g >= 0 && (c[g] = E), g = --v[T], E = w, ++_;do {\n T = k;\n } while (--w >= 0 && (k = e[w]) >= T);\n }\n }if (_ > 1 ? (o(e, c, p, v, l, d), R = f(e, c, l, _)) : 1 === _ ? (c[g] = E + 1, R = 1) : R = 0, R < _) {\n for (0 != (4 & S) && (p = null, v = null), 0 != (2 & S) && (v = null), C = l + h - 2 * _, 0 == (13 & S) && (d + R <= C ? C -= d : S |= 8), r(l >>> 1 <= C + _), w = _ + (l >>> 1) - 1, E = 2 * _ + C - 1; _ <= w; w--) {\n 0 !== c[w] && (c[E--] = c[w] - 1);\n }m = c.subarray(_ + C), s(m, c, C, _, R, !1), m = null, w = l - 1, E = 2 * _ - 1, k = e[l - 1];do {\n T = k;\n } while (--w >= 0 && (k = e[w]) >= T);for (; w >= 0;) {\n do {\n T = k;\n } while (--w >= 0 && (k = e[w]) <= T);if (w >= 0) {\n c[E--] = w + 1;do {\n T = k;\n } while (--w >= 0 && (k = e[w]) >= T);\n }\n }for (w = 0; w < _; w++) {\n c[w] = c[_ + c[w]];\n }0 != (4 & S) && (p = v = t.makeS32Buffer(d)), 0 != (2 & S) && (v = t.makeS32Buffer(d));\n }if (0 != (8 & S) && n(e, p, l, d), _ > 1) {\n i(p, v, d, !0), w = _ - 1, E = l, b = c[_ - 1], T = e[b];do {\n for (y = v[k = T]; y < E;) {\n c[--E] = 0;\n }do {\n if (c[--E] = b, --w < 0) break;b = c[w];\n } while ((T = e[b]) === k);\n } while (w >= 0);for (; E > 0;) {\n c[--E] = 0;\n }\n }return B ? O = u(e, c, p, v, l, d) : a(e, c, p, v, l, d), p = null, v = null, O;\n },\n c = (0, _create2.default)(null);return c.suffixsort = function (e, t, n, i) {\n if (r(e && t && e.length >= n && t.length >= n), n <= 1) return 1 === n && (t[0] = 0), 0;if (!i) if (1 === e.BYTES_PER_ELEMENT) i = 256;else {\n if (2 !== e.BYTES_PER_ELEMENT) throw new Error(\"Need to specify alphabetSize\");i = 65536;\n }return r(i > 0), e.BYTES_PER_ELEMENT && r(i <= 1 << 8 * e.BYTES_PER_ELEMENT), s(e, t, 0, n, i, !1);\n }, c.bwtransform = function (e, t, n, i, o) {\n var f, a;if (r(e && t && n), r(e.length >= i && t.length >= i && n.length >= i), i <= 1) return 1 === i && (t[0] = e[0]), i;if (!o) if (1 === e.BYTES_PER_ELEMENT) o = 256;else {\n if (2 !== e.BYTES_PER_ELEMENT) throw new Error(\"Need to specify alphabetSize\");o = 65536;\n }for (r(o > 0), e.BYTES_PER_ELEMENT && r(o <= 1 << 8 * e.BYTES_PER_ELEMENT), a = s(e, n, 0, i, o, !0), t[0] = e[i - 1], f = 0; f < a; f++) {\n t[f + 1] = n[f];\n }for (f += 1; f < i; f++) {\n t[f] = n[f];\n }return a + 1;\n }, c.unbwtransform = function (e, r, n, i, o) {\n var f,\n a,\n u = t.makeU32Buffer(256);for (f = 0; f < 256; f++) {\n u[f] = 0;\n }for (f = 0; f < i; f++) {\n n[f] = u[e[f]]++;\n }for (f = 0, a = 0; f < 256; f++) {\n a += u[f], u[f] = a - u[f];\n }for (f = i - 1, a = 0; f >= 0; f--) {\n a = n[a] + u[r[f] = e[a]], a += a < o ? 1 : 0;\n }u = null;\n }, c.bwtransform2 = function (e, n, i, o) {\n var f,\n a,\n u = 0;if (r(e && n), r(e.length >= i && n.length >= i), i <= 1) return 1 === i && (n[0] = e[0]), 0;if (!o) if (1 === e.BYTES_PER_ELEMENT) o = 256;else {\n if (2 !== e.BYTES_PER_ELEMENT) throw new Error(\"Need to specify alphabetSize\");o = 65536;\n }r(o > 0), e.BYTES_PER_ELEMENT && r(o <= 1 << 8 * e.BYTES_PER_ELEMENT);var c;if ((c = e.length >= 2 * i ? e : o <= 256 ? t.makeU8Buffer(2 * i) : o <= 65536 ? t.makeU16Buffer(2 * i) : t.makeU32Buffer(2 * i)) !== e) for (f = 0; f < i; f++) {\n c[f] = e[f];\n }for (f = 0; f < i; f++) {\n c[i + f] = c[f];\n }var h = t.makeS32Buffer(2 * i);for (s(c, h, 0, 2 * i, o, !1), f = 0, a = 0; f < 2 * i; f++) {\n var l = h[f];l < i && (0 === l && (u = a), --l < 0 && (l = i - 1), n[a++] = e[l]);\n }return r(a === i), u;\n }, e(c);\n}(freeze, Util), CRC32 = function (e) {\n var t = e.arraycopy(e.makeU32Buffer(256), [0, 79764919, 159529838, 222504665, 319059676, 398814059, 445009330, 507990021, 638119352, 583659535, 797628118, 726387553, 890018660, 835552979, 1015980042, 944750013, 1276238704, 1221641927, 1167319070, 1095957929, 1595256236, 1540665371, 1452775106, 1381403509, 1780037320, 1859660671, 1671105958, 1733955601, 2031960084, 2111593891, 1889500026, 1952343757, 2552477408, 2632100695, 2443283854, 2506133561, 2334638140, 2414271883, 2191915858, 2254759653, 3190512472, 3135915759, 3081330742, 3009969537, 2905550212, 2850959411, 2762807018, 2691435357, 3560074640, 3505614887, 3719321342, 3648080713, 3342211916, 3287746299, 3467911202, 3396681109, 4063920168, 4143685023, 4223187782, 4286162673, 3779000052, 3858754371, 3904687514, 3967668269, 881225847, 809987520, 1023691545, 969234094, 662832811, 591600412, 771767749, 717299826, 311336399, 374308984, 453813921, 533576470, 25881363, 88864420, 134795389, 214552010, 2023205639, 2086057648, 1897238633, 1976864222, 1804852699, 1867694188, 1645340341, 1724971778, 1587496639, 1516133128, 1461550545, 1406951526, 1302016099, 1230646740, 1142491917, 1087903418, 2896545431, 2825181984, 2770861561, 2716262478, 3215044683, 3143675388, 3055782693, 3001194130, 2326604591, 2389456536, 2200899649, 2280525302, 2578013683, 2640855108, 2418763421, 2498394922, 3769900519, 3832873040, 3912640137, 3992402750, 4088425275, 4151408268, 4197601365, 4277358050, 3334271071, 3263032808, 3476998961, 3422541446, 3585640067, 3514407732, 3694837229, 3640369242, 1762451694, 1842216281, 1619975040, 1682949687, 2047383090, 2127137669, 1938468188, 2001449195, 1325665622, 1271206113, 1183200824, 1111960463, 1543535498, 1489069629, 1434599652, 1363369299, 622672798, 568075817, 748617968, 677256519, 907627842, 853037301, 1067152940, 995781531, 51762726, 131386257, 177728840, 240578815, 269590778, 349224269, 429104020, 491947555, 4046411278, 4126034873, 4172115296, 4234965207, 3794477266, 3874110821, 3953728444, 4016571915, 3609705398, 3555108353, 3735388376, 3664026991, 3290680682, 3236090077, 3449943556, 3378572211, 3174993278, 3120533705, 3032266256, 2961025959, 2923101090, 2868635157, 2813903052, 2742672763, 2604032198, 2683796849, 2461293480, 2524268063, 2284983834, 2364738477, 2175806836, 2238787779, 1569362073, 1498123566, 1409854455, 1355396672, 1317987909, 1246755826, 1192025387, 1137557660, 2072149281, 2135122070, 1912620623, 1992383480, 1753615357, 1816598090, 1627664531, 1707420964, 295390185, 358241886, 404320391, 483945776, 43990325, 106832002, 186451547, 266083308, 932423249, 861060070, 1041341759, 986742920, 613929101, 542559546, 756411363, 701822548, 3316196985, 3244833742, 3425377559, 3370778784, 3601682597, 3530312978, 3744426955, 3689838204, 3819031489, 3881883254, 3928223919, 4007849240, 4037393693, 4100235434, 4180117107, 4259748804, 2310601993, 2373574846, 2151335527, 2231098320, 2596047829, 2659030626, 2470359227, 2550115596, 2947551409, 2876312838, 2788305887, 2733848168, 3165939309, 3094707162, 3040238851, 2985771188]);return function () {\n var e = 4294967295;this.getCRC = function () {\n return ~e >>> 0;\n }, this.updateCRC = function (r) {\n e = e << 8 ^ t[255 & (e >>> 24 ^ r)];\n }, this.updateCRCRun = function (r, n) {\n for (; n-- > 0;) {\n e = e << 8 ^ t[255 & (e >>> 24 ^ r)];\n }\n };\n };\n}(Util), HuffmanAllocator = function (e, t) {\n var r = function r(e, t, _r) {\n for (var n = e.length, i = t, o = e.length - 2; t >= _r && e[t] % n > i;) {\n o = t, t -= i - t + 1;\n }for (t = Math.max(_r - 1, t); o > t + 1;) {\n var f = t + o >> 1;e[f] % n > i ? o = f : t = f;\n }return o;\n },\n n = function n(e) {\n var t = e.length;e[0] += e[1];var r, n, i, o;for (r = 0, n = 1, i = 2; n < t - 1; n++) {\n i >= t || e[r] < e[i] ? (o = e[r], e[r++] = n) : o = e[i++], i >= t || r < n && e[r] < e[i] ? (o += e[r], e[r++] = n + t) : o += e[i++], e[n] = o;\n }\n },\n i = function i(e, t) {\n var n,\n i = e.length - 2;for (n = 1; n < t - 1 && i > 1; n++) {\n i = r(e, i - 1, 0);\n }return i;\n },\n o = function o(e) {\n var t,\n n,\n i,\n o,\n f = e.length - 2,\n a = e.length - 1;for (t = 1, n = 2; n > 0; t++) {\n for (i = f, f = r(e, i - 1, 0), o = n - (i - f); o > 0; o--) {\n e[a--] = t;\n }n = i - f << 1;\n }\n },\n f = function f(e, t, n) {\n var i,\n o,\n f,\n a,\n u = e.length - 2,\n s = e.length - 1,\n c = 1 == n ? 2 : 1,\n h = 1 == n ? t - 2 : t;for (i = c << 1; i > 0; c++) {\n for (o = u, u = u <= t ? u : r(e, o - 1, t), f = 0, c >= n ? f = Math.min(h, 1 << c - n) : c == n - 1 && (f = 1, e[u] == o && u++), a = i - (o - u + f); a > 0; a--) {\n e[s--] = c;\n }h -= f, i = o - u + f << 1;\n }\n };return e({ allocateHuffmanCodeLengths: function allocateHuffmanCodeLengths(e, r) {\n switch (e.length) {case 2:\n e[1] = 1;case 1:\n return void (e[0] = 1);}n(e);var a = i(e, r);if (e[0] % e.length >= a) o(e);else {\n var u = r - t.fls(a - 1);f(e, a, u);\n }\n } });\n}(freeze, Util), Bzip2 = function (e, t, r, n, i, o, f) {\n var a = o.EOF,\n u = function u(e, t) {\n var r,\n n = e[t];for (r = t; r > 0; r--) {\n e[r] = e[r - 1];\n }return e[0] = n, n;\n },\n s = { OK: 0, LAST_BLOCK: -1, NOT_BZIP_DATA: -2, UNEXPECTED_INPUT_EOF: -3, UNEXPECTED_OUTPUT_EOF: -4, DATA_ERROR: -5, OUT_OF_MEMORY: -6, OBSOLETE_INPUT: -7, END_OF_BLOCK: -8 },\n c = {};c[s.LAST_BLOCK] = \"Bad file checksum\", c[s.NOT_BZIP_DATA] = \"Not bzip data\", c[s.UNEXPECTED_INPUT_EOF] = \"Unexpected input EOF\", c[s.UNEXPECTED_OUTPUT_EOF] = \"Unexpected output EOF\", c[s.DATA_ERROR] = \"Data error\", c[s.OUT_OF_MEMORY] = \"Out of memory\", c[s.OBSOLETE_INPUT] = \"Obsolete (pre 0.9.5) bzip format not supported.\";var h = function h(e, t) {\n var r = c[e] || \"unknown error\";t && (r += \": \" + t);var n = new TypeError(r);throw n.errorCode = e, n;\n },\n l = function l(e, t) {\n this.writePos = this.writeCurrent = this.writeCount = 0, this._start_bunzip(e, t);\n };l.prototype._init_block = function () {\n return this._get_next_block() ? (this.blockCRC = new n(), !0) : (this.writeCount = -1, !1);\n }, l.prototype._start_bunzip = function (e, r) {\n var n = f.makeU8Buffer(4);4 === e.read(n, 0, 4) && \"BZh\" === String.fromCharCode(n[0], n[1], n[2]) || h(s.NOT_BZIP_DATA, \"bad magic\");var i = n[3] - 48;(i < 1 || i > 9) && h(s.NOT_BZIP_DATA, \"level out of range\"), this.reader = new t(e), this.dbufSize = 1e5 * i, this.nextoutput = 0, this.outputStream = r, this.streamCRC = 0;\n }, l.prototype._get_next_block = function () {\n var e,\n t,\n r,\n n = this.reader,\n i = n.readBits(48);if (25779555029136 === i) return !1;54156738319193 !== i && h(s.NOT_BZIP_DATA), this.targetBlockCRC = n.readBits(32), this.streamCRC = (this.targetBlockCRC ^ (this.streamCRC << 1 | this.streamCRC >>> 31)) >>> 0, n.readBits(1) && h(s.OBSOLETE_INPUT);var o = n.readBits(24);o > this.dbufSize && h(s.DATA_ERROR, \"initial position out of bounds\");var a = n.readBits(16),\n c = f.makeU8Buffer(256),\n l = 0;for (e = 0; e < 16; e++) {\n if (a & 1 << 15 - e) {\n var d = 16 * e;for (r = n.readBits(16), t = 0; t < 16; t++) {\n r & 1 << 15 - t && (c[l++] = d + t);\n }\n }\n }var B = n.readBits(3);(B < 2 || B > 6) && h(s.DATA_ERROR);var p = n.readBits(15);0 === p && h(s.DATA_ERROR);var v = f.makeU8Buffer(256);for (e = 0; e < B; e++) {\n v[e] = e;\n }var m = f.makeU8Buffer(p);for (e = 0; e < p; e++) {\n for (t = 0; n.readBits(1); t++) {\n t >= B && h(s.DATA_ERROR);\n }m[e] = u(v, t);\n }var w,\n E = l + 2,\n g = [];for (t = 0; t < B; t++) {\n var _ = f.makeU8Buffer(E),\n b = f.makeU16Buffer(21);for (a = n.readBits(5), e = 0; e < E; e++) {\n for (; (a < 1 || a > 20) && h(s.DATA_ERROR), n.readBits(1);) {\n n.readBits(1) ? a-- : a++;\n }_[e] = a;\n }var y, R;for (y = R = _[0], e = 1; e < E; e++) {\n _[e] > R ? R = _[e] : _[e] < y && (y = _[e]);\n }w = {}, g.push(w), w.permute = f.makeU16Buffer(258), w.limit = f.makeU32Buffer(22), w.base = f.makeU32Buffer(21), w.minLen = y, w.maxLen = R;var C = 0;for (e = y; e <= R; e++) {\n for (b[e] = w.limit[e] = 0, a = 0; a < E; a++) {\n _[a] === e && (w.permute[C++] = a);\n }\n }for (e = 0; e < E; e++) {\n b[_[e]]++;\n }for (C = a = 0, e = y; e < R; e++) {\n C += b[e], w.limit[e] = C - 1, C <<= 1, a += b[e], w.base[e + 1] = C - a;\n }w.limit[R + 1] = Number.MAX_VALUE, w.limit[R] = C + b[R] - 1, w.base[y] = 0;\n }var k = f.makeU32Buffer(256);for (e = 0; e < 256; e++) {\n v[e] = e;\n }var T,\n O = 0,\n S = 0,\n U = 0,\n A = this.dbuf = f.makeU32Buffer(this.dbufSize);for (E = 0;;) {\n for (E-- || (E = 49, U >= p && h(s.DATA_ERROR), w = g[m[U++]]), e = w.minLen, t = n.readBits(e); e > w.maxLen && h(s.DATA_ERROR), !(t <= w.limit[e]); e++) {\n t = t << 1 | n.readBits(1);\n }t -= w.base[e], (t < 0 || t >= 258) && h(s.DATA_ERROR);var z = w.permute[t];if (0 !== z && 1 !== z) {\n if (O) for (O = 0, S + a > this.dbufSize && h(s.DATA_ERROR), T = c[v[0]], k[T] += a; a--;) {\n A[S++] = T;\n }if (z > l) break;S >= this.dbufSize && h(s.DATA_ERROR), e = z - 1, T = u(v, e), T = c[T], k[T]++, A[S++] = T;\n } else O || (O = 1, a = 0), a += 0 === z ? O : 2 * O, O <<= 1;\n }for ((o < 0 || o >= S) && h(s.DATA_ERROR), t = 0, e = 0; e < 256; e++) {\n r = t + k[e], k[e] = t, t = r;\n }for (e = 0; e < S; e++) {\n T = 255 & A[e], A[k[T]] |= e << 8, k[T]++;\n }var N = 0,\n L = 0,\n P = 0;return S && (N = A[o], L = 255 & N, N >>= 8, P = -1), this.writePos = N, this.writeCurrent = L, this.writeCount = S, this.writeRun = P, !0;\n }, l.prototype._read_bunzip = function (e, t) {\n var r, n, i;if (this.writeCount < 0) return 0;for (var o = this.dbuf, f = this.writePos, a = this.writeCurrent, u = this.writeCount, c = (this.outputsize, this.writeRun); u;) {\n for (u--, n = a, f = o[f], a = 255 & f, f >>= 8, 3 == c++ ? (r = a, i = n, a = -1) : (r = 1, i = a), this.blockCRC.updateCRCRun(i, r); r--;) {\n this.outputStream.writeByte(i), this.nextoutput++;\n }a != n && (c = 0);\n }return this.writeCount = u, this.blockCRC.getCRC() !== this.targetBlockCRC && h(s.DATA_ERROR, \"Bad block CRC (got \" + this.blockCRC.getCRC().toString(16) + \" expected \" + this.targetBlockCRC.toString(16) + \")\"), this.nextoutput;\n }, l.Err = s, l.decode = function (e, t, r) {\n for (var n = f.coerceInputStream(e), i = f.coerceOutputStream(t, t), o = i.stream, a = new l(n, o);;) {\n if (\"eof\" in n && n.eof()) break;if (a._init_block()) a._read_bunzip();else {\n var u = a.reader.readBits(32);if (u !== a.streamCRC && h(s.DATA_ERROR, \"Bad stream CRC (got \" + a.streamCRC.toString(16) + \" expected \" + u.toString(16) + \")\"), !(r && \"eof\" in n) || n.eof()) break;a._start_bunzip(n, o);\n }\n }return i.retval;\n }, l.decodeBlock = function (e, t, r) {\n var i = f.coerceInputStream(e),\n o = f.coerceOutputStream(r, r),\n a = o.stream,\n u = new l(i, a);return u.reader.seekBit(t), u._get_next_block() && (u.blockCRC = new n(), u.writeCopies = 0, u._read_bunzip()), o.retval;\n }, l.table = function (e, t, r) {\n var n = new o();n.delegate = f.coerceInputStream(e), n.pos = 0, n.readByte = function () {\n return this.pos++, this.delegate.readByte();\n }, n.tell = function () {\n return this.pos;\n }, n.delegate.eof && (n.eof = n.delegate.eof.bind(n.delegate));var i = new o();i.pos = 0, i.writeByte = function () {\n this.pos++;\n };for (var a = new l(n, i), u = a.dbufSize;;) {\n if (\"eof\" in n && n.eof()) break;var s = a.reader.tellBit();if (a._init_block()) {\n var c = i.pos;a._read_bunzip(), t(s, i.pos - c);\n } else {\n a.reader.readBits(32);if (!(r && \"eof\" in n) || n.eof()) break;a._start_bunzip(n, i), console.assert(a.dbufSize === u, \"shouldn't change block size within multistream file\");\n }\n }\n };var d = function d(e, t) {\n var r,\n n = [];for (r = 0; r < t; r++) {\n n[r] = e[r] << 9 | r;\n }n.sort(function (e, t) {\n return e - t;\n });var o = n.map(function (e) {\n return e >>> 9;\n });for (i.allocateHuffmanCodeLengths(o, 20), this.codeLengths = f.makeU8Buffer(t), r = 0; r < t; r++) {\n var a = 511 & n[r];this.codeLengths[a] = o[r];\n }\n };d.prototype.computeCanonical = function () {\n var e,\n t = this.codeLengths.length,\n r = [];for (e = 0; e < t; e++) {\n r[e] = this.codeLengths[e] << 9 | e;\n }r.sort(function (e, t) {\n return e - t;\n }), this.code = f.makeU32Buffer(t);var n = 0,\n i = 0;for (e = 0; e < t; e++) {\n var o = r[e] >>> 9,\n a = 511 & r[e];console.assert(i <= o), n <<= o - i, this.code[a] = n++, i = o;\n }\n }, d.prototype.cost = function (e, t, r) {\n var n,\n i = 0;for (n = 0; n < r; n++) {\n i += this.codeLengths[e[t + n]];\n }return i;\n }, d.prototype.emit = function (e) {\n var t,\n r = this.codeLengths[0];for (e.writeBits(5, r), t = 0; t < this.codeLengths.length; t++) {\n var n,\n i,\n o = this.codeLengths[t];for (console.assert(o > 0 && o <= 20), r < o ? (n = 2, i = o - r) : (n = 3, i = r - o); i-- > 0;) {\n e.writeBits(2, n);\n }e.writeBit(0), r = o;\n }\n }, d.prototype.encode = function (e, t) {\n e.writeBits(this.codeLengths[t], this.code[t]);\n };var B = function B(e, t, r, n) {\n for (var i = 0, o = -1, f = 0; i < r && !(4 === f && (t[i++] = 0, i >= r));) {\n var u = e.readByte();if (u === a) break;if (n.updateCRC(u), u !== o) o = u, f = 1;else if (++f > 4) {\n if (f < 256) {\n t[i - 1]++;continue;\n }f = 1;\n }t[i++] = u;\n }return i;\n },\n p = function p(e, t, r) {\n var n, i, o;for (n = 0, o = 0; n < r.length; n += 50) {\n var f = Math.min(50, r.length - n),\n a = 0,\n u = t[0].cost(r, n, f);for (i = 1; i < t.length; i++) {\n var s = t[i].cost(r, n, f);s < u && (a = i, u = s);\n }e[o++] = a;\n }\n },\n v = function v(e, t, r, n, i) {\n for (var o, f, a, u = []; e.length < t;) {\n for (p(n, e, r), o = 0; o < e.length; o++) {\n u[o] = 0;\n }for (o = 0; o < n.length; o++) {\n u[n[o]]++;\n }var s = u.indexOf(Math.max.apply(Math, u)),\n c = [];for (o = 0, f = 0; o < n.length; o++) {\n if (n[o] === s) {\n var h = 50 * o,\n l = Math.min(h + 50, r.length);c.push({ index: o, cost: e[s].cost(r, h, l - h) });\n }\n }for (c.sort(function (e, t) {\n return e.cost - t.cost;\n }), o = c.length >>> 1; o < c.length; o++) {\n n[c[o].index] = e.length;\n }e.push(null);var B,\n v = [];for (o = 0; o < e.length; o++) {\n for (B = v[o] = [], f = 0; f < i; f++) {\n B[f] = 0;\n }\n }for (o = 0, f = 0; o < r.length;) {\n for (B = v[n[f++]], a = 0; a < 50 && o < r.length; a++) {\n B[r[o++]]++;\n }\n }for (o = 0; o < e.length; o++) {\n e[o] = new d(v[o], i);\n }\n }\n },\n m = function m(e, t, n) {\n var i,\n o,\n a,\n s,\n c = f.makeU8Buffer(t),\n h = r.bwtransform2(e, c, t, 256);n.writeBit(0), n.writeBits(24, h);var l = [],\n B = [];for (o = 0; o < t; o++) {\n i = e[o], l[i] = !0, B[i >>> 4] = !0;\n }for (o = 0; o < 16; o++) {\n n.writeBit(!!B[o]);\n }for (o = 0; o < 16; o++) {\n if (B[o]) for (a = 0; a < 16; a++) {\n n.writeBit(!!l[o << 4 | a]);\n }\n }var m = 0;for (o = 0; o < 256; o++) {\n l[o] && m++;\n }var w = f.makeU16Buffer(t + 1),\n E = m + 1,\n g = [];for (o = 0; o <= E; o++) {\n g[o] = 0;\n }var _ = f.makeU8Buffer(m);for (o = 0, a = 0; o < 256; o++) {\n l[o] && (_[a++] = o);\n }l = null, B = null;var b = 0,\n y = 0,\n R = function R(e) {\n w[b++] = e, g[e]++;\n },\n C = function C() {\n for (; 0 !== y;) {\n 1 & y ? (R(0), y -= 1) : (R(1), y -= 2), y >>>= 1;\n }\n };for (o = 0; o < c.length; o++) {\n for (i = c[o], a = 0; a < m && _[a] !== i; a++) {}console.assert(a !== m), u(_, a), 0 === a ? y++ : (C(), R(a + 1), y = 0);\n }C(), R(E), w = w.subarray(0, b);var k,\n T = [];for (k = b >= 2400 ? 6 : b >= 1200 ? 5 : b >= 600 ? 4 : b >= 200 ? 3 : 2, T.push(new d(g, E + 1)), o = 0; o <= E; o++) {\n g[o] = 1;\n }T.push(new d(g, E + 1)), g = null;var O = f.makeU8Buffer(Math.ceil(b / 50));for (v(T, k, w, O, E + 1), p(O, T, w), console.assert(T.length >= 2 && T.length <= 6), n.writeBits(3, T.length), n.writeBits(15, O.length), o = 0; o < T.length; o++) {\n _[o] = o;\n }for (o = 0; o < O.length; o++) {\n var S = O[o];for (a = 0; a < T.length && _[a] !== S; a++) {}for (console.assert(a < T.length), u(_, a); a > 0; a--) {\n n.writeBit(1);\n }n.writeBit(0);\n }for (o = 0; o < T.length; o++) {\n T[o].emit(n), T[o].computeCanonical();\n }for (o = 0, s = 0; o < b;) {\n var U = T[O[s++]];for (a = 0; a < 50 && o < b; a++) {\n U.encode(n, w[o++]);\n }\n }\n },\n w = (0, _create2.default)(null);return w.compressFile = function (e, r, i) {\n e = f.coerceInputStream(e);var o = f.coerceOutputStream(r, r);r = new t(o.stream);var a = 9;if (\"number\" == typeof i && (a = i), a < 1 || a > 9) throw new Error(\"Invalid block size multiplier\");var u = 1e5 * a;u -= 19, r.writeByte(\"B\".charCodeAt(0)), r.writeByte(\"Z\".charCodeAt(0)), r.writeByte(\"h\".charCodeAt(0)), r.writeByte(\"0\".charCodeAt(0) + a);var s,\n c = f.makeU8Buffer(u),\n h = 0;do {\n var l = new n();s = B(e, c, u, l), s > 0 && (h = ((h << 1 | h >>> 31) ^ l.getCRC()) >>> 0, r.writeBits(48, 54156738319193), r.writeBits(32, l.getCRC()), m(c, s, r));\n } while (s === u);return r.writeBits(48, 25779555029136), r.writeBits(32, h), r.flush(), o.retval;\n }, w.decompressFile = l.decode, w.decompressBlock = l.decodeBlock, w.table = l.table, w;\n}(0, BitStream, BWT, CRC32, HuffmanAllocator, Stream, Util), module.exports = Bzip2;\n\n}).call(this,_dereq_('_process'),_dereq_(\"buffer\").Buffer)\n},{\"_process\":317,\"babel-runtime/core-js/object/create\":25,\"babel-runtime/core-js/object/freeze\":28,\"babel-runtime/helpers/typeof\":41,\"buffer\":47}],324:[function(_dereq_,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _enums = _dereq_(\"../enums\");\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n /**\n * @memberof module:config\n * @property {Integer} prefer_hash_algorithm Default hash algorithm {@link module:enums.hash}\n */\n prefer_hash_algorithm: _enums2.default.hash.sha256,\n /**\n * @memberof module:config\n * @property {Integer} encryption_cipher Default encryption cipher {@link module:enums.symmetric}\n */\n encryption_cipher: _enums2.default.symmetric.aes256,\n /**\n * @memberof module:config\n * @property {Integer} compression Default compression algorithm {@link module:enums.compression}\n */\n compression: _enums2.default.compression.uncompressed,\n /**\n * @memberof module:config\n * @property {Integer} deflate_level Default zip/zlib compression level, between 1 and 9\n */\n deflate_level: 6,\n\n /**\n * Use Authenticated Encryption with Additional Data (AEAD) protection for symmetric encryption.\n * **NOT INTEROPERABLE WITH OTHER OPENPGP IMPLEMENTATIONS**\n * **FUTURE OPENPGP.JS VERSIONS MAY BREAK COMPATIBILITY WHEN USING THIS OPTION**\n * @memberof module:config\n * @property {Boolean} aead_protect\n */\n aead_protect: false,\n /**\n * Use Authenticated Encryption with Additional Data (AEAD) protection for symmetric encryption.\n * 0 means we implement a variant of {@link https://tools.ietf.org/html/draft-ford-openpgp-format-00|this IETF draft}.\n * 4 means we implement {@link https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-04|RFC4880bis-04}.\n * Note that this determines how AEAD packets are parsed even when aead_protect is set to false\n * @memberof module:config\n * @property {Integer} aead_protect_version\n */\n aead_protect_version: 4,\n /**\n * Default Authenticated Encryption with Additional Data (AEAD) encryption mode\n * Only has an effect when aead_protect is set to true.\n * @memberof module:config\n * @property {Integer} aead_mode Default AEAD mode {@link module:enums.aead}\n */\n aead_mode: _enums2.default.aead.eax,\n /**\n * Chunk Size Byte for Authenticated Encryption with Additional Data (AEAD) mode\n * Only has an effect when aead_protect is set to true.\n * Must be an integer value from 0 to 56.\n * @memberof module:config\n * @property {Integer} aead_chunk_size_byte\n */\n aead_chunk_size_byte: 12,\n /**\n * {@link https://tools.ietf.org/html/rfc4880#section-3.7.1.3|RFC4880 3.7.1.3}:\n * Iteration Count Byte for S2K (String to Key)\n * @memberof module:config\n * @property {Integer} s2k_iteration_count_byte\n */\n s2k_iteration_count_byte: 96,\n /** Use integrity protection for symmetric encryption\n * @memberof module:config\n * @property {Boolean} integrity_protect\n */\n integrity_protect: true,\n /**\n * @memberof module:config\n * @property {Boolean} ignore_mdc_error Fail on decrypt if message is not integrity protected\n */\n ignore_mdc_error: false,\n /**\n * @memberof module:config\n * @property {Boolean} checksum_required Do not throw error when armor is missing a checksum\n */\n checksum_required: false,\n /**\n * @memberof module:config\n * @property {Boolean} rsa_blinding\n */\n rsa_blinding: true,\n /**\n * Work-around for rare GPG decryption bug when encrypting with multiple passwords.\n * **Slower and slightly less secure**\n * @memberof module:config\n * @property {Boolean} password_collision_check\n */\n password_collision_check: false,\n /**\n * @memberof module:config\n * @property {Boolean} revocations_expire If true, expired revocation signatures are ignored\n */\n revocations_expire: false,\n\n /**\n * @memberof module:config\n * @property {Boolean} use_native Use native Node.js crypto/zlib and WebCrypto APIs when available\n */\n use_native: true,\n /**\n * @memberof module:config\n * @property {Boolean} Use transferable objects between the Web Worker and main thread\n */\n zero_copy: false,\n /**\n * @memberof module:config\n * @property {Boolean} debug If enabled, debug messages will be printed\n */\n debug: false,\n /**\n * @memberof module:config\n * @property {Boolean} tolerant Ignore unsupported/unrecognizable packets instead of throwing an error\n */\n tolerant: true,\n\n /**\n * @memberof module:config\n * @property {Boolean} show_version Whether to include {@link module:config/config.versionstring} in armored messages\n */\n show_version: true,\n /**\n * @memberof module:config\n * @property {Boolean} show_comment Whether to include {@link module:config/config.commentstring} in armored messages\n */\n show_comment: true,\n /**\n * @memberof module:config\n * @property {String} versionstring A version string to be included in armored messages\n */\n versionstring: \"OpenPGP.js v3.0.13\",\n /**\n * @memberof module:config\n * @property {String} commentstring A comment string to be included in armored messages\n */\n commentstring: \"https://openpgpjs.org\",\n\n /**\n * @memberof module:config\n * @property {String} keyserver\n */\n keyserver: \"https://keyserver.ubuntu.com\",\n /**\n * @memberof module:config\n * @property {String} node_store\n */\n node_store: \"./openpgp.store\",\n /**\n * Max userid string length (used for parsing)\n * @memberof module:config\n * @property {Integer} max_userid_length\n */\n max_userid_length: 1024 * 5\n}; // GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * Global configuration values.\n * @requires enums\n */\n\n},{\"../enums\":359}],325:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _config = _dereq_('./config.js');\n\nObject.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_config).default;\n }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n},{\"./config.js\":324}],326:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _cipher = _dereq_('./cipher');\n\nvar _cipher2 = _interopRequireDefault(_cipher);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2015-2016 Decentral\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview Implementation of RFC 3394 AES Key Wrap & Key Unwrap funcions\n * @see module:crypto/public_key/elliptic/ecdh\n * @requires crypto/cipher\n * @requires util\n * @module crypto/aes_kw\n */\n\nfunction wrap(key, data) {\n var aes = new _cipher2.default[\"aes\" + key.length * 8](key);\n var IV = new Uint32Array([0xA6A6A6A6, 0xA6A6A6A6]);\n var P = unpack(data);\n var A = IV;\n var R = P;\n var n = P.length / 2;\n var t = new Uint32Array([0, 0]);\n var B = new Uint32Array(4);\n for (var j = 0; j <= 5; ++j) {\n for (var i = 0; i < n; ++i) {\n t[1] = n * j + (1 + i);\n // B = A\n B[0] = A[0];\n B[1] = A[1];\n // B = A || R[i]\n B[2] = R[2 * i];\n B[3] = R[2 * i + 1];\n // B = AES(K, B)\n B = unpack(aes.encrypt(pack(B)));\n // A = MSB(64, B) ^ t\n A = B.subarray(0, 2);\n A[0] ^= t[0];\n A[1] ^= t[1];\n // R[i] = LSB(64, B)\n R[2 * i] = B[2];\n R[2 * i + 1] = B[3];\n }\n }\n return pack(A, R);\n}\n\nfunction unwrap(key, data) {\n var aes = new _cipher2.default[\"aes\" + key.length * 8](key);\n var IV = new Uint32Array([0xA6A6A6A6, 0xA6A6A6A6]);\n var C = unpack(data);\n var A = C.subarray(0, 2);\n var R = C.subarray(2);\n var n = C.length / 2 - 1;\n var t = new Uint32Array([0, 0]);\n var B = new Uint32Array(4);\n for (var j = 5; j >= 0; --j) {\n for (var i = n - 1; i >= 0; --i) {\n t[1] = n * j + (i + 1);\n // B = A ^ t\n B[0] = A[0] ^ t[0];\n B[1] = A[1] ^ t[1];\n // B = (A ^ t) || R[i]\n B[2] = R[2 * i];\n B[3] = R[2 * i + 1];\n // B = AES-1(B)\n B = unpack(aes.decrypt(pack(B)));\n // A = MSB(64, B)\n A = B.subarray(0, 2);\n // R[i] = LSB(64, B)\n R[2 * i] = B[2];\n R[2 * i + 1] = B[3];\n }\n }\n if (A[0] === IV[0] && A[1] === IV[1]) {\n return pack(R);\n }\n throw new Error(\"Key Data Integrity failed\");\n}\n\nfunction createArrayBuffer(data) {\n if (_util2.default.isString(data)) {\n var length = data.length;\n\n var buffer = new ArrayBuffer(length);\n var view = new Uint8Array(buffer);\n for (var j = 0; j < length; ++j) {\n view[j] = data.charCodeAt(j);\n }\n return buffer;\n }\n return new Uint8Array(data).buffer;\n}\n\nfunction unpack(data) {\n var length = data.length;\n\n var buffer = createArrayBuffer(data);\n var view = new DataView(buffer);\n var arr = new Uint32Array(length / 4);\n for (var i = 0; i < length / 4; ++i) {\n arr[i] = view.getUint32(4 * i);\n }\n return arr;\n}\n\nfunction pack() {\n var length = 0;\n for (var k = 0; k < arguments.length; ++k) {\n length += 4 * arguments[k].length;\n }\n var buffer = new ArrayBuffer(length);\n var view = new DataView(buffer);\n var offset = 0;\n for (var i = 0; i < arguments.length; ++i) {\n for (var j = 0; j < arguments[i].length; ++j) {\n view.setUint32(offset + 4 * j, arguments[i][j]);\n }\n offset += 4 * arguments[i].length;\n }\n return new Uint8Array(buffer);\n}\n\nexports.default = {\n /**\n * AES key wrap\n * @function\n * @param {String} key\n * @param {String} data\n * @returns {Uint8Array}\n */\n wrap: wrap,\n /**\n * AES key unwrap\n * @function\n * @param {String} key\n * @param {String} data\n * @returns {Uint8Array}\n * @throws {Error}\n */\n unwrap: unwrap\n};\n\n},{\"../util\":398,\"./cipher\":332}],327:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _cipher = _dereq_('./cipher');\n\nvar _cipher2 = _interopRequireDefault(_cipher);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n\n /**\n * This function encrypts a given plaintext with the specified prefixrandom\n * using the specified blockcipher\n * @param {Uint8Array} prefixrandom random bytes of block_size length\n * to be used in prefixing the data\n * @param {String} cipherfn the algorithm cipher class to encrypt\n * data in one block_size encryption, {@link module:crypto/cipher}.\n * @param {Uint8Array} plaintext data to be encrypted\n * @param {Uint8Array} key key to be used to encrypt the plaintext.\n * This will be passed to the cipherfn\n * @param {Boolean} resync a boolean value specifying if a resync of the\n * IV should be used or not. The encrypteddatapacket uses the\n * \"old\" style with a resync. Encryption within an\n * encryptedintegrityprotecteddata packet is not resyncing the IV.\n * @returns {Uint8Array} encrypted data\n */\n encrypt: function encrypt(prefixrandom, cipherfn, plaintext, key, resync) {\n cipherfn = new _cipher2.default[cipherfn](key);\n var block_size = cipherfn.blockSize;\n\n var FR = new Uint8Array(block_size);\n var FRE = new Uint8Array(block_size);\n\n var new_prefix = new Uint8Array(prefixrandom.length + 2);\n new_prefix.set(prefixrandom);\n new_prefix[prefixrandom.length] = prefixrandom[block_size - 2];\n new_prefix[prefixrandom.length + 1] = prefixrandom[block_size - 1];\n prefixrandom = new_prefix;\n\n var ciphertext = new Uint8Array(plaintext.length + 2 + block_size * 2);\n var i = void 0;\n var n = void 0;\n var begin = void 0;\n var offset = resync ? 0 : 2;\n\n // 1. The feedback register (FR) is set to the IV, which is all zeros.\n for (i = 0; i < block_size; i++) {\n FR[i] = 0;\n }\n\n // 2. FR is encrypted to produce FRE (FR Encrypted). This is the\n // encryption of an all-zero value.\n FRE = cipherfn.encrypt(FR);\n // 3. FRE is xored with the first BS octets of random data prefixed to\n // the plaintext to produce C[1] through C[BS], the first BS octets\n // of ciphertext.\n for (i = 0; i < block_size; i++) {\n ciphertext[i] = FRE[i] ^ prefixrandom[i];\n }\n\n // 4. FR is loaded with C[1] through C[BS].\n FR.set(ciphertext.subarray(0, block_size));\n\n // 5. FR is encrypted to produce FRE, the encryption of the first BS\n // octets of ciphertext.\n FRE = cipherfn.encrypt(FR);\n\n // 6. The left two octets of FRE get xored with the next two octets of\n // data that were prefixed to the plaintext. This produces C[BS+1]\n // and C[BS+2], the next two octets of ciphertext.\n ciphertext[block_size] = FRE[0] ^ prefixrandom[block_size];\n ciphertext[block_size + 1] = FRE[1] ^ prefixrandom[block_size + 1];\n\n if (resync) {\n // 7. (The resync step) FR is loaded with C[3] through C[BS+2].\n FR.set(ciphertext.subarray(2, block_size + 2));\n } else {\n FR.set(ciphertext.subarray(0, block_size));\n }\n // 8. FR is encrypted to produce FRE.\n FRE = cipherfn.encrypt(FR);\n\n // 9. FRE is xored with the first BS octets of the given plaintext, now\n // that we have finished encrypting the BS+2 octets of prefixed\n // data. This produces C[BS+3] through C[BS+(BS+2)], the next BS\n // octets of ciphertext.\n for (i = 0; i < block_size; i++) {\n ciphertext[block_size + 2 + i] = FRE[i + offset] ^ plaintext[i];\n }\n for (n = block_size; n < plaintext.length + offset; n += block_size) {\n // 10. FR is loaded with C[BS+3] to C[BS + (BS+2)] (which is C11-C18 for\n // an 8-octet block).\n begin = n + 2 - offset;\n FR.set(ciphertext.subarray(begin, begin + block_size));\n\n // 11. FR is encrypted to produce FRE.\n FRE = cipherfn.encrypt(FR);\n\n // 12. FRE is xored with the next BS octets of plaintext, to produce\n // the next BS octets of ciphertext. These are loaded into FR, and\n // the process is repeated until the plaintext is used up.\n for (i = 0; i < block_size; i++) {\n ciphertext[block_size + begin + i] = FRE[i] ^ plaintext[n + i - offset];\n }\n }\n\n ciphertext = ciphertext.subarray(0, plaintext.length + 2 + block_size);\n return ciphertext;\n },\n\n /**\n * Decrypts the prefixed data for the Modification Detection Code (MDC) computation\n * @param {String} cipherfn.encrypt Cipher function to use,\n * @see module:crypto/cipher.\n * @param {Uint8Array} key Uint8Array representation of key to be used to check the mdc\n * This will be passed to the cipherfn\n * @param {Uint8Array} ciphertext The encrypted data\n * @returns {Uint8Array} plaintext Data of D(ciphertext) with blocksize length +2\n */\n mdc: function mdc(cipherfn, key, ciphertext) {\n cipherfn = new _cipher2.default[cipherfn](key);\n var block_size = cipherfn.blockSize;\n\n var iblock = new Uint8Array(block_size);\n var ablock = new Uint8Array(block_size);\n var i = void 0;\n\n // initialisation vector\n for (i = 0; i < block_size; i++) {\n iblock[i] = 0;\n }\n\n iblock = cipherfn.encrypt(iblock);\n for (i = 0; i < block_size; i++) {\n ablock[i] = ciphertext[i];\n iblock[i] ^= ablock[i];\n }\n\n ablock = cipherfn.encrypt(ablock);\n\n var result = new Uint8Array(iblock.length + 2);\n result.set(iblock);\n result[iblock.length] = ablock[0] ^ ciphertext[block_size];\n result[iblock.length + 1] = ablock[1] ^ ciphertext[block_size + 1];\n return result;\n },\n\n /**\n * This function decrypts a given ciphertext using the specified blockcipher\n * @param {String} cipherfn the algorithm cipher class to decrypt\n * data in one block_size encryption, {@link module:crypto/cipher}.\n * @param {Uint8Array} key Uint8Array representation of key to be used to decrypt the ciphertext.\n * This will be passed to the cipherfn\n * @param {Uint8Array} ciphertext to be decrypted\n * @param {Boolean} resync a boolean value specifying if a resync of the\n * IV should be used or not. The encrypteddatapacket uses the\n * \"old\" style with a resync. Decryption within an\n * encryptedintegrityprotecteddata packet is not resyncing the IV.\n * @returns {Uint8Array} the plaintext data\n */\n decrypt: function decrypt(cipherfn, key, ciphertext, resync) {\n cipherfn = new _cipher2.default[cipherfn](key);\n var block_size = cipherfn.blockSize;\n\n var iblock = new Uint8Array(block_size);\n var ablock = new Uint8Array(block_size);\n\n var i = void 0;\n var j = void 0;\n var n = void 0;\n var text = new Uint8Array(ciphertext.length - block_size);\n\n // initialisation vector\n for (i = 0; i < block_size; i++) {\n iblock[i] = 0;\n }\n\n iblock = cipherfn.encrypt(iblock);\n for (i = 0; i < block_size; i++) {\n ablock[i] = ciphertext[i];\n iblock[i] ^= ablock[i];\n }\n\n ablock = cipherfn.encrypt(ablock);\n\n // test check octets\n if (iblock[block_size - 2] !== (ablock[0] ^ ciphertext[block_size]) || iblock[block_size - 1] !== (ablock[1] ^ ciphertext[block_size + 1])) {\n throw new Error('CFB decrypt: invalid key');\n }\n\n /* RFC4880: Tag 18 and Resync:\n * [...] Unlike the Symmetrically Encrypted Data Packet, no\n * special CFB resynchronization is done after encrypting this prefix\n * data. See \"OpenPGP CFB Mode\" below for more details.\n */\n\n j = 0;\n if (resync) {\n for (i = 0; i < block_size; i++) {\n iblock[i] = ciphertext[i + 2];\n }\n for (n = block_size + 2; n < ciphertext.length; n += block_size) {\n ablock = cipherfn.encrypt(iblock);\n\n for (i = 0; i < block_size && i + n < ciphertext.length; i++) {\n iblock[i] = ciphertext[n + i];\n if (j < text.length) {\n text[j] = ablock[i] ^ iblock[i];\n j++;\n }\n }\n }\n } else {\n for (i = 0; i < block_size; i++) {\n iblock[i] = ciphertext[i];\n }\n for (n = block_size; n < ciphertext.length; n += block_size) {\n ablock = cipherfn.encrypt(iblock);\n for (i = 0; i < block_size && i + n < ciphertext.length; i++) {\n iblock[i] = ciphertext[n + i];\n if (j < text.length) {\n text[j] = ablock[i] ^ iblock[i];\n j++;\n }\n }\n }\n }\n\n n = resync ? 0 : 2;\n\n text = text.subarray(n, ciphertext.length - block_size - 2 + n);\n\n return text;\n },\n\n normalEncrypt: function normalEncrypt(cipherfn, key, plaintext, iv) {\n cipherfn = new _cipher2.default[cipherfn](key);\n var block_size = cipherfn.blockSize;\n\n var blocki = new Uint8Array(block_size);\n var blockc = new Uint8Array(block_size);\n var pos = 0;\n var cyphertext = new Uint8Array(plaintext.length);\n var i = void 0;\n var j = 0;\n\n if (iv === null) {\n for (i = 0; i < block_size; i++) {\n blockc[i] = 0;\n }\n } else {\n for (i = 0; i < block_size; i++) {\n blockc[i] = iv[i];\n }\n }\n while (plaintext.length > block_size * pos) {\n var encblock = cipherfn.encrypt(blockc);\n blocki = plaintext.subarray(pos * block_size, pos * block_size + block_size);\n for (i = 0; i < blocki.length; i++) {\n blockc[i] = blocki[i] ^ encblock[i];\n cyphertext[j++] = blockc[i];\n }\n pos++;\n }\n return cyphertext;\n },\n\n normalDecrypt: function normalDecrypt(cipherfn, key, ciphertext, iv) {\n cipherfn = new _cipher2.default[cipherfn](key);\n var block_size = cipherfn.blockSize;\n\n var blockp = void 0;\n var pos = 0;\n var plaintext = new Uint8Array(ciphertext.length);\n var offset = 0;\n var i = void 0;\n var j = 0;\n\n if (iv === null) {\n blockp = new Uint8Array(block_size);\n for (i = 0; i < block_size; i++) {\n blockp[i] = 0;\n }\n } else {\n blockp = iv.subarray(0, block_size);\n }\n while (ciphertext.length > block_size * pos) {\n var decblock = cipherfn.encrypt(blockp);\n blockp = ciphertext.subarray(pos * block_size + offset, pos * block_size + block_size + offset);\n for (i = 0; i < blockp.length; i++) {\n plaintext[j++] = blockp[i] ^ decblock[i];\n }\n pos++;\n }\n\n return plaintext;\n }\n}; // Modified by ProtonTech AG\n\n// Modified by Recurity Labs GmbH\n\n// modified version of https://www.hanewin.net/encrypt/PGdecode.js:\n\n/* OpenPGP encryption using RSA/AES\n * Copyright 2005-2006 Herbert Hanewinkel, www.haneWIN.de\n * version 2.0, check www.haneWIN.de for the latest version\n\n * This software is provided as-is, without express or implied warranty.\n * Permission to use, copy, modify, distribute or sell this software, with or\n * without fee, for any purpose and by any individual or organization, is hereby\n * granted, provided that the above copyright notice and this paragraph appear\n * in all copies. Distribution as a part of an application or binary must\n * include the above copyright notice in the documentation and/or other\n * materials provided with the application or distribution.\n */\n\n/**\n * @requires crypto/cipher\n * @module crypto/cfb\n */\n\n},{\"./cipher\":332}],328:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _exports = _dereq_('asmcrypto.js/src/aes/exports');\n\nvar _ecb = _dereq_('asmcrypto.js/src/aes/ecb/ecb');\n\n// TODO use webCrypto or nodeCrypto when possible.\n/**\n * @requires asmcrypto.js\n */\n\nfunction aes(length) {\n var C = function C(key) {\n var aes_ecb = new _ecb.AES_ECB(key, _exports._AES_heap_instance, _exports._AES_asm_instance);\n\n this.encrypt = function (block) {\n return aes_ecb.encrypt(block).result;\n };\n\n this.decrypt = function (block) {\n return aes_ecb.decrypt(block).result;\n };\n };\n\n C.blockSize = C.prototype.blockSize = 16;\n C.keySize = C.prototype.keySize = length / 8;\n\n return C;\n}\n\nexports.default = aes;\n\n},{\"asmcrypto.js/src/aes/ecb/ecb\":10,\"asmcrypto.js/src/aes/exports\":11}],329:[function(_dereq_,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n/* Modified by Recurity Labs GmbH\n *\n * Originally written by nklein software (nklein.com)\n */\n\n/*\n * Javascript implementation based on Bruce Schneier's reference implementation.\n *\n *\n * The constructor doesn't do much of anything. It's just here\n * so we can start defining properties and methods and such.\n */\nfunction Blowfish() {}\n\n/*\n * Declare the block size so that protocols know what size\n * Initialization Vector (IV) they will need.\n */\nBlowfish.prototype.BLOCKSIZE = 8;\n\n/*\n * These are the default SBOXES.\n */\nBlowfish.prototype.SBOXES = [[0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a], [0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7], [0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0], [0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6]];\n\n//*\n//* This is the default PARRAY\n//*\nBlowfish.prototype.PARRAY = [0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b];\n\n//*\n//* This is the number of rounds the cipher will go\n//*\nBlowfish.prototype.NN = 16;\n\n//*\n//* This function is needed to get rid of problems\n//* with the high-bit getting set. If we don't do\n//* this, then sometimes ( aa & 0x00FFFFFFFF ) is not\n//* equal to ( bb & 0x00FFFFFFFF ) even when they\n//* agree bit-for-bit for the first 32 bits.\n//*\nBlowfish.prototype._clean = function (xx) {\n if (xx < 0) {\n var yy = xx & 0x7FFFFFFF;\n xx = yy + 0x80000000;\n }\n return xx;\n};\n\n//*\n//* This is the mixing function that uses the sboxes\n//*\nBlowfish.prototype._F = function (xx) {\n var yy = void 0;\n\n var dd = xx & 0x00FF;\n xx >>>= 8;\n var cc = xx & 0x00FF;\n xx >>>= 8;\n var bb = xx & 0x00FF;\n xx >>>= 8;\n var aa = xx & 0x00FF;\n\n yy = this.sboxes[0][aa] + this.sboxes[1][bb];\n yy ^= this.sboxes[2][cc];\n yy += this.sboxes[3][dd];\n\n return yy;\n};\n\n//*\n//* This method takes an array with two values, left and right\n//* and does NN rounds of Blowfish on them.\n//*\nBlowfish.prototype._encrypt_block = function (vals) {\n var dataL = vals[0];\n var dataR = vals[1];\n\n var ii = void 0;\n\n for (ii = 0; ii < this.NN; ++ii) {\n dataL ^= this.parray[ii];\n dataR = this._F(dataL) ^ dataR;\n\n var tmp = dataL;\n dataL = dataR;\n dataR = tmp;\n }\n\n dataL ^= this.parray[this.NN + 0];\n dataR ^= this.parray[this.NN + 1];\n\n vals[0] = this._clean(dataR);\n vals[1] = this._clean(dataL);\n};\n\n//*\n//* This method takes a vector of numbers and turns them\n//* into long words so that they can be processed by the\n//* real algorithm.\n//*\n//* Maybe I should make the real algorithm above take a vector\n//* instead. That will involve more looping, but it won't require\n//* the F() method to deconstruct the vector.\n//*\nBlowfish.prototype.encrypt_block = function (vector) {\n var ii = void 0;\n var vals = [0, 0];\n var off = this.BLOCKSIZE / 2;\n for (ii = 0; ii < this.BLOCKSIZE / 2; ++ii) {\n vals[0] = vals[0] << 8 | vector[ii + 0] & 0x00FF;\n vals[1] = vals[1] << 8 | vector[ii + off] & 0x00FF;\n }\n\n this._encrypt_block(vals);\n\n var ret = [];\n for (ii = 0; ii < this.BLOCKSIZE / 2; ++ii) {\n ret[ii + 0] = vals[0] >>> 24 - 8 * ii & 0x00FF;\n ret[ii + off] = vals[1] >>> 24 - 8 * ii & 0x00FF;\n // vals[ 0 ] = ( vals[ 0 ] >>> 8 );\n // vals[ 1 ] = ( vals[ 1 ] >>> 8 );\n }\n\n return ret;\n};\n\n//*\n//* This method takes an array with two values, left and right\n//* and undoes NN rounds of Blowfish on them.\n//*\nBlowfish.prototype._decrypt_block = function (vals) {\n var dataL = vals[0];\n var dataR = vals[1];\n\n var ii = void 0;\n\n for (ii = this.NN + 1; ii > 1; --ii) {\n dataL ^= this.parray[ii];\n dataR = this._F(dataL) ^ dataR;\n\n var tmp = dataL;\n dataL = dataR;\n dataR = tmp;\n }\n\n dataL ^= this.parray[1];\n dataR ^= this.parray[0];\n\n vals[0] = this._clean(dataR);\n vals[1] = this._clean(dataL);\n};\n\n//*\n//* This method takes a key array and initializes the\n//* sboxes and parray for this encryption.\n//*\nBlowfish.prototype.init = function (key) {\n var ii = void 0;\n var jj = 0;\n\n this.parray = [];\n for (ii = 0; ii < this.NN + 2; ++ii) {\n var data = 0x00000000;\n for (var kk = 0; kk < 4; ++kk) {\n data = data << 8 | key[jj] & 0x00FF;\n if (++jj >= key.length) {\n jj = 0;\n }\n }\n this.parray[ii] = this.PARRAY[ii] ^ data;\n }\n\n this.sboxes = [];\n for (ii = 0; ii < 4; ++ii) {\n this.sboxes[ii] = [];\n for (jj = 0; jj < 256; ++jj) {\n this.sboxes[ii][jj] = this.SBOXES[ii][jj];\n }\n }\n\n var vals = [0x00000000, 0x00000000];\n\n for (ii = 0; ii < this.NN + 2; ii += 2) {\n this._encrypt_block(vals);\n this.parray[ii + 0] = vals[0];\n this.parray[ii + 1] = vals[1];\n }\n\n for (ii = 0; ii < 4; ++ii) {\n for (jj = 0; jj < 256; jj += 2) {\n this._encrypt_block(vals);\n this.sboxes[ii][jj + 0] = vals[0];\n this.sboxes[ii][jj + 1] = vals[1];\n }\n }\n};\n\n// added by Recurity Labs\nfunction BF(key) {\n this.bf = new Blowfish();\n this.bf.init(key);\n\n this.encrypt = function (block) {\n return this.bf.encrypt_block(block);\n };\n}\n\nBF.keySize = BF.prototype.keySize = 16;\nBF.blockSize = BF.prototype.blockSize = 16;\n\nexports.default = BF;\n\n},{}],330:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Copyright 2010 pjacobs@xeekr.com . All rights reserved.\n\n// Modified by Recurity Labs GmbH\n\n// fixed/modified by Herbert Hanewinkel, www.haneWIN.de\n// check www.haneWIN.de for the latest version\n\n// cast5.js is a Javascript implementation of CAST-128, as defined in RFC 2144.\n// CAST-128 is a common OpenPGP cipher.\n\n\n// CAST5 constructor\n\nfunction OpenpgpSymencCast5() {\n this.BlockSize = 8;\n this.KeySize = 16;\n\n this.setKey = function (key) {\n this.masking = new Array(16);\n this.rotate = new Array(16);\n\n this.reset();\n\n if (key.length === this.KeySize) {\n this.keySchedule(key);\n } else {\n throw new Error('CAST-128: keys must be 16 bytes');\n }\n return true;\n };\n\n this.reset = function () {\n for (var i = 0; i < 16; i++) {\n this.masking[i] = 0;\n this.rotate[i] = 0;\n }\n };\n\n this.getBlockSize = function () {\n return this.BlockSize;\n };\n\n this.encrypt = function (src) {\n var dst = new Array(src.length);\n\n for (var i = 0; i < src.length; i += 8) {\n var l = src[i] << 24 | src[i + 1] << 16 | src[i + 2] << 8 | src[i + 3];\n var r = src[i + 4] << 24 | src[i + 5] << 16 | src[i + 6] << 8 | src[i + 7];\n var t = void 0;\n\n t = r;\n r = l ^ f1(r, this.masking[0], this.rotate[0]);\n l = t;\n t = r;\n r = l ^ f2(r, this.masking[1], this.rotate[1]);\n l = t;\n t = r;\n r = l ^ f3(r, this.masking[2], this.rotate[2]);\n l = t;\n t = r;\n r = l ^ f1(r, this.masking[3], this.rotate[3]);\n l = t;\n\n t = r;\n r = l ^ f2(r, this.masking[4], this.rotate[4]);\n l = t;\n t = r;\n r = l ^ f3(r, this.masking[5], this.rotate[5]);\n l = t;\n t = r;\n r = l ^ f1(r, this.masking[6], this.rotate[6]);\n l = t;\n t = r;\n r = l ^ f2(r, this.masking[7], this.rotate[7]);\n l = t;\n\n t = r;\n r = l ^ f3(r, this.masking[8], this.rotate[8]);\n l = t;\n t = r;\n r = l ^ f1(r, this.masking[9], this.rotate[9]);\n l = t;\n t = r;\n r = l ^ f2(r, this.masking[10], this.rotate[10]);\n l = t;\n t = r;\n r = l ^ f3(r, this.masking[11], this.rotate[11]);\n l = t;\n\n t = r;\n r = l ^ f1(r, this.masking[12], this.rotate[12]);\n l = t;\n t = r;\n r = l ^ f2(r, this.masking[13], this.rotate[13]);\n l = t;\n t = r;\n r = l ^ f3(r, this.masking[14], this.rotate[14]);\n l = t;\n t = r;\n r = l ^ f1(r, this.masking[15], this.rotate[15]);\n l = t;\n\n dst[i] = r >>> 24 & 255;\n dst[i + 1] = r >>> 16 & 255;\n dst[i + 2] = r >>> 8 & 255;\n dst[i + 3] = r & 255;\n dst[i + 4] = l >>> 24 & 255;\n dst[i + 5] = l >>> 16 & 255;\n dst[i + 6] = l >>> 8 & 255;\n dst[i + 7] = l & 255;\n }\n\n return dst;\n };\n\n this.decrypt = function (src) {\n var dst = new Array(src.length);\n\n for (var i = 0; i < src.length; i += 8) {\n var l = src[i] << 24 | src[i + 1] << 16 | src[i + 2] << 8 | src[i + 3];\n var r = src[i + 4] << 24 | src[i + 5] << 16 | src[i + 6] << 8 | src[i + 7];\n var t = void 0;\n\n t = r;\n r = l ^ f1(r, this.masking[15], this.rotate[15]);\n l = t;\n t = r;\n r = l ^ f3(r, this.masking[14], this.rotate[14]);\n l = t;\n t = r;\n r = l ^ f2(r, this.masking[13], this.rotate[13]);\n l = t;\n t = r;\n r = l ^ f1(r, this.masking[12], this.rotate[12]);\n l = t;\n\n t = r;\n r = l ^ f3(r, this.masking[11], this.rotate[11]);\n l = t;\n t = r;\n r = l ^ f2(r, this.masking[10], this.rotate[10]);\n l = t;\n t = r;\n r = l ^ f1(r, this.masking[9], this.rotate[9]);\n l = t;\n t = r;\n r = l ^ f3(r, this.masking[8], this.rotate[8]);\n l = t;\n\n t = r;\n r = l ^ f2(r, this.masking[7], this.rotate[7]);\n l = t;\n t = r;\n r = l ^ f1(r, this.masking[6], this.rotate[6]);\n l = t;\n t = r;\n r = l ^ f3(r, this.masking[5], this.rotate[5]);\n l = t;\n t = r;\n r = l ^ f2(r, this.masking[4], this.rotate[4]);\n l = t;\n\n t = r;\n r = l ^ f1(r, this.masking[3], this.rotate[3]);\n l = t;\n t = r;\n r = l ^ f3(r, this.masking[2], this.rotate[2]);\n l = t;\n t = r;\n r = l ^ f2(r, this.masking[1], this.rotate[1]);\n l = t;\n t = r;\n r = l ^ f1(r, this.masking[0], this.rotate[0]);\n l = t;\n\n dst[i] = r >>> 24 & 255;\n dst[i + 1] = r >>> 16 & 255;\n dst[i + 2] = r >>> 8 & 255;\n dst[i + 3] = r & 255;\n dst[i + 4] = l >>> 24 & 255;\n dst[i + 5] = l >> 16 & 255;\n dst[i + 6] = l >> 8 & 255;\n dst[i + 7] = l & 255;\n }\n\n return dst;\n };\n var scheduleA = new Array(4);\n\n scheduleA[0] = new Array(4);\n scheduleA[0][0] = [4, 0, 0xd, 0xf, 0xc, 0xe, 0x8];\n scheduleA[0][1] = [5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa];\n scheduleA[0][2] = [6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9];\n scheduleA[0][3] = [7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb];\n\n scheduleA[1] = new Array(4);\n scheduleA[1][0] = [0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0];\n scheduleA[1][1] = [1, 4, 0, 2, 1, 3, 16 + 2];\n scheduleA[1][2] = [2, 5, 7, 6, 5, 4, 16 + 1];\n scheduleA[1][3] = [3, 7, 0xa, 9, 0xb, 8, 16 + 3];\n\n scheduleA[2] = new Array(4);\n scheduleA[2][0] = [4, 0, 0xd, 0xf, 0xc, 0xe, 8];\n scheduleA[2][1] = [5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa];\n scheduleA[2][2] = [6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9];\n scheduleA[2][3] = [7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb];\n\n scheduleA[3] = new Array(4);\n scheduleA[3][0] = [0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0];\n scheduleA[3][1] = [1, 4, 0, 2, 1, 3, 16 + 2];\n scheduleA[3][2] = [2, 5, 7, 6, 5, 4, 16 + 1];\n scheduleA[3][3] = [3, 7, 0xa, 9, 0xb, 8, 16 + 3];\n\n var scheduleB = new Array(4);\n\n scheduleB[0] = new Array(4);\n scheduleB[0][0] = [16 + 8, 16 + 9, 16 + 7, 16 + 6, 16 + 2];\n scheduleB[0][1] = [16 + 0xa, 16 + 0xb, 16 + 5, 16 + 4, 16 + 6];\n scheduleB[0][2] = [16 + 0xc, 16 + 0xd, 16 + 3, 16 + 2, 16 + 9];\n scheduleB[0][3] = [16 + 0xe, 16 + 0xf, 16 + 1, 16 + 0, 16 + 0xc];\n\n scheduleB[1] = new Array(4);\n scheduleB[1][0] = [3, 2, 0xc, 0xd, 8];\n scheduleB[1][1] = [1, 0, 0xe, 0xf, 0xd];\n scheduleB[1][2] = [7, 6, 8, 9, 3];\n scheduleB[1][3] = [5, 4, 0xa, 0xb, 7];\n\n scheduleB[2] = new Array(4);\n scheduleB[2][0] = [16 + 3, 16 + 2, 16 + 0xc, 16 + 0xd, 16 + 9];\n scheduleB[2][1] = [16 + 1, 16 + 0, 16 + 0xe, 16 + 0xf, 16 + 0xc];\n scheduleB[2][2] = [16 + 7, 16 + 6, 16 + 8, 16 + 9, 16 + 2];\n scheduleB[2][3] = [16 + 5, 16 + 4, 16 + 0xa, 16 + 0xb, 16 + 6];\n\n scheduleB[3] = new Array(4);\n scheduleB[3][0] = [8, 9, 7, 6, 3];\n scheduleB[3][1] = [0xa, 0xb, 5, 4, 7];\n scheduleB[3][2] = [0xc, 0xd, 3, 2, 8];\n scheduleB[3][3] = [0xe, 0xf, 1, 0, 0xd];\n\n // changed 'in' to 'inn' (in javascript 'in' is a reserved word)\n this.keySchedule = function (inn) {\n var t = new Array(8);\n var k = new Array(32);\n\n var j = void 0;\n\n for (var i = 0; i < 4; i++) {\n j = i * 4;\n t[i] = inn[j] << 24 | inn[j + 1] << 16 | inn[j + 2] << 8 | inn[j + 3];\n }\n\n var x = [6, 7, 4, 5];\n var ki = 0;\n var w = void 0;\n\n for (var half = 0; half < 2; half++) {\n for (var round = 0; round < 4; round++) {\n for (j = 0; j < 4; j++) {\n var a = scheduleA[round][j];\n w = t[a[1]];\n\n w ^= sBox[4][t[a[2] >>> 2] >>> 24 - 8 * (a[2] & 3) & 0xff];\n w ^= sBox[5][t[a[3] >>> 2] >>> 24 - 8 * (a[3] & 3) & 0xff];\n w ^= sBox[6][t[a[4] >>> 2] >>> 24 - 8 * (a[4] & 3) & 0xff];\n w ^= sBox[7][t[a[5] >>> 2] >>> 24 - 8 * (a[5] & 3) & 0xff];\n w ^= sBox[x[j]][t[a[6] >>> 2] >>> 24 - 8 * (a[6] & 3) & 0xff];\n t[a[0]] = w;\n }\n\n for (j = 0; j < 4; j++) {\n var b = scheduleB[round][j];\n w = sBox[4][t[b[0] >>> 2] >>> 24 - 8 * (b[0] & 3) & 0xff];\n\n w ^= sBox[5][t[b[1] >>> 2] >>> 24 - 8 * (b[1] & 3) & 0xff];\n w ^= sBox[6][t[b[2] >>> 2] >>> 24 - 8 * (b[2] & 3) & 0xff];\n w ^= sBox[7][t[b[3] >>> 2] >>> 24 - 8 * (b[3] & 3) & 0xff];\n w ^= sBox[4 + j][t[b[4] >>> 2] >>> 24 - 8 * (b[4] & 3) & 0xff];\n k[ki] = w;\n ki++;\n }\n }\n }\n\n for (var _i = 0; _i < 16; _i++) {\n this.masking[_i] = k[_i];\n this.rotate[_i] = k[16 + _i] & 0x1f;\n }\n };\n\n // These are the three 'f' functions. See RFC 2144, section 2.2.\n\n function f1(d, m, r) {\n var t = m + d;\n var I = t << r | t >>> 32 - r;\n return (sBox[0][I >>> 24] ^ sBox[1][I >>> 16 & 255]) - sBox[2][I >>> 8 & 255] + sBox[3][I & 255];\n }\n\n function f2(d, m, r) {\n var t = m ^ d;\n var I = t << r | t >>> 32 - r;\n return sBox[0][I >>> 24] - sBox[1][I >>> 16 & 255] + sBox[2][I >>> 8 & 255] ^ sBox[3][I & 255];\n }\n\n function f3(d, m, r) {\n var t = m - d;\n var I = t << r | t >>> 32 - r;\n return (sBox[0][I >>> 24] + sBox[1][I >>> 16 & 255] ^ sBox[2][I >>> 8 & 255]) - sBox[3][I & 255];\n }\n\n var sBox = new Array(8);\n sBox[0] = [0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949, 0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e, 0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d, 0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0, 0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7, 0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935, 0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d, 0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50, 0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe, 0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3, 0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167, 0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291, 0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779, 0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2, 0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511, 0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495, 0xaa573b04, 0x4a805d8d, 0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5, 0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324, 0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c, 0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc, 0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d, 0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96, 0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a, 0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d, 0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd, 0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6, 0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9, 0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872, 0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c, 0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e, 0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9, 0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf];\n\n sBox[1] = [0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651, 0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3, 0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb, 0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b, 0x25a1ff41, 0xe180f806, 0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b, 0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359, 0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084, 0xe4eb573b, 0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c, 0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34, 0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb, 0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd, 0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860, 0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b, 0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304, 0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b, 0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf, 0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c, 0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13, 0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741, 0x7cbad9a2, 0x2180036f, 0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6, 0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6, 0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc, 0xd152de58, 0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906, 0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d, 0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6, 0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4, 0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6, 0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f, 0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249, 0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa, 0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9, 0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1];\n\n sBox[2] = [0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90, 0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5, 0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e, 0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240, 0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5, 0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b, 0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e, 0xc5884a28, 0xccc36f71, 0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04, 0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82, 0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15, 0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2, 0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176, 0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148, 0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc, 0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341, 0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e, 0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51, 0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f, 0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a, 0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b, 0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b, 0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae, 0x12deca4d, 0x2c3f8cc5, 0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45, 0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536, 0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc, 0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0, 0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69, 0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2, 0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49, 0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d, 0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a, 0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783];\n\n sBox[3] = [0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1, 0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf, 0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15, 0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121, 0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25, 0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5, 0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb, 0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5, 0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d, 0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6, 0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23, 0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003, 0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6, 0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119, 0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24, 0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a, 0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79, 0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df, 0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26, 0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab, 0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7, 0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417, 0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2, 0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2, 0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a, 0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919, 0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef, 0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876, 0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab, 0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04, 0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282, 0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2];\n\n sBox[4] = [0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f, 0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a, 0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff, 0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02, 0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a, 0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7, 0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9, 0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981, 0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774, 0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655, 0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2, 0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910, 0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1, 0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da, 0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049, 0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f, 0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba, 0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be, 0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3, 0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840, 0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4, 0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2, 0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7, 0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5, 0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e, 0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e, 0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801, 0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad, 0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0, 0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20, 0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8, 0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4];\n\n sBox[5] = [0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac, 0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138, 0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367, 0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98, 0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072, 0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3, 0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd, 0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8, 0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9, 0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54, 0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387, 0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc, 0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf, 0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf, 0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f, 0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289, 0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063, 0x4576698d, 0xb6fad407, 0x592af950, 0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f, 0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b, 0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be, 0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13, 0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976, 0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0, 0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891, 0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da, 0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc, 0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084, 0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25, 0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121, 0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5, 0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd, 0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f];\n\n sBox[6] = [0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f, 0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de, 0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43, 0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19, 0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2, 0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516, 0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88, 0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816, 0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756, 0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a, 0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264, 0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688, 0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28, 0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3, 0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7, 0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06, 0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033, 0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a, 0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566, 0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509, 0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962, 0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e, 0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c, 0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c, 0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285, 0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301, 0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be, 0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767, 0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647, 0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914, 0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c, 0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3];\n\n sBox[7] = [0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5, 0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc, 0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd, 0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d, 0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2, 0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862, 0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc, 0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c, 0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e, 0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039, 0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8, 0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42, 0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5, 0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472, 0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225, 0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c, 0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb, 0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054, 0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70, 0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc, 0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c, 0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3, 0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4, 0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101, 0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f, 0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e, 0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a, 0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c, 0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384, 0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c, 0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82, 0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e];\n}\n\nfunction Cast5(key) {\n this.cast5 = new OpenpgpSymencCast5();\n this.cast5.setKey(key);\n\n this.encrypt = function (block) {\n return this.cast5.encrypt(block);\n };\n}\n\nCast5.blockSize = Cast5.prototype.blockSize = 8;\nCast5.keySize = Cast5.prototype.keySize = 16;\n\nexports.default = Cast5;\n\n},{}],331:[function(_dereq_,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n//Paul Tero, July 2001\n//http://www.tero.co.uk/des/\n//\n//Optimised for performance with large blocks by Michael Hayworth, November 2001\n//http://www.netdealing.com\n//\n// Modified by Recurity Labs GmbH\n\n//THIS SOFTWARE IS PROVIDED \"AS IS\" AND\n//ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n//IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n//ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n//FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n//DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n//OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n//HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n//OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n//SUCH DAMAGE.\n\n//des\n//this takes the key, the message, and whether to encrypt or decrypt\n\nfunction des(keys, message, encrypt, mode, iv, padding) {\n //declaring this locally speeds things up a bit\n var spfunction1 = [0x1010400, 0, 0x10000, 0x1010404, 0x1010004, 0x10404, 0x4, 0x10000, 0x400, 0x1010400, 0x1010404, 0x400, 0x1000404, 0x1010004, 0x1000000, 0x4, 0x404, 0x1000400, 0x1000400, 0x10400, 0x10400, 0x1010000, 0x1010000, 0x1000404, 0x10004, 0x1000004, 0x1000004, 0x10004, 0, 0x404, 0x10404, 0x1000000, 0x10000, 0x1010404, 0x4, 0x1010000, 0x1010400, 0x1000000, 0x1000000, 0x400, 0x1010004, 0x10000, 0x10400, 0x1000004, 0x400, 0x4, 0x1000404, 0x10404, 0x1010404, 0x10004, 0x1010000, 0x1000404, 0x1000004, 0x404, 0x10404, 0x1010400, 0x404, 0x1000400, 0x1000400, 0, 0x10004, 0x10400, 0, 0x1010004];\n var spfunction2 = [-0x7fef7fe0, -0x7fff8000, 0x8000, 0x108020, 0x100000, 0x20, -0x7fefffe0, -0x7fff7fe0, -0x7fffffe0, -0x7fef7fe0, -0x7fef8000, -0x80000000, -0x7fff8000, 0x100000, 0x20, -0x7fefffe0, 0x108000, 0x100020, -0x7fff7fe0, 0, -0x80000000, 0x8000, 0x108020, -0x7ff00000, 0x100020, -0x7fffffe0, 0, 0x108000, 0x8020, -0x7fef8000, -0x7ff00000, 0x8020, 0, 0x108020, -0x7fefffe0, 0x100000, -0x7fff7fe0, -0x7ff00000, -0x7fef8000, 0x8000, -0x7ff00000, -0x7fff8000, 0x20, -0x7fef7fe0, 0x108020, 0x20, 0x8000, -0x80000000, 0x8020, -0x7fef8000, 0x100000, -0x7fffffe0, 0x100020, -0x7fff7fe0, -0x7fffffe0, 0x100020, 0x108000, 0, -0x7fff8000, 0x8020, -0x80000000, -0x7fefffe0, -0x7fef7fe0, 0x108000];\n var spfunction3 = [0x208, 0x8020200, 0, 0x8020008, 0x8000200, 0, 0x20208, 0x8000200, 0x20008, 0x8000008, 0x8000008, 0x20000, 0x8020208, 0x20008, 0x8020000, 0x208, 0x8000000, 0x8, 0x8020200, 0x200, 0x20200, 0x8020000, 0x8020008, 0x20208, 0x8000208, 0x20200, 0x20000, 0x8000208, 0x8, 0x8020208, 0x200, 0x8000000, 0x8020200, 0x8000000, 0x20008, 0x208, 0x20000, 0x8020200, 0x8000200, 0, 0x200, 0x20008, 0x8020208, 0x8000200, 0x8000008, 0x200, 0, 0x8020008, 0x8000208, 0x20000, 0x8000000, 0x8020208, 0x8, 0x20208, 0x20200, 0x8000008, 0x8020000, 0x8000208, 0x208, 0x8020000, 0x20208, 0x8, 0x8020008, 0x20200];\n var spfunction4 = [0x802001, 0x2081, 0x2081, 0x80, 0x802080, 0x800081, 0x800001, 0x2001, 0, 0x802000, 0x802000, 0x802081, 0x81, 0, 0x800080, 0x800001, 0x1, 0x2000, 0x800000, 0x802001, 0x80, 0x800000, 0x2001, 0x2080, 0x800081, 0x1, 0x2080, 0x800080, 0x2000, 0x802080, 0x802081, 0x81, 0x800080, 0x800001, 0x802000, 0x802081, 0x81, 0, 0, 0x802000, 0x2080, 0x800080, 0x800081, 0x1, 0x802001, 0x2081, 0x2081, 0x80, 0x802081, 0x81, 0x1, 0x2000, 0x800001, 0x2001, 0x802080, 0x800081, 0x2001, 0x2080, 0x800000, 0x802001, 0x80, 0x800000, 0x2000, 0x802080];\n var spfunction5 = [0x100, 0x2080100, 0x2080000, 0x42000100, 0x80000, 0x100, 0x40000000, 0x2080000, 0x40080100, 0x80000, 0x2000100, 0x40080100, 0x42000100, 0x42080000, 0x80100, 0x40000000, 0x2000000, 0x40080000, 0x40080000, 0, 0x40000100, 0x42080100, 0x42080100, 0x2000100, 0x42080000, 0x40000100, 0, 0x42000000, 0x2080100, 0x2000000, 0x42000000, 0x80100, 0x80000, 0x42000100, 0x100, 0x2000000, 0x40000000, 0x2080000, 0x42000100, 0x40080100, 0x2000100, 0x40000000, 0x42080000, 0x2080100, 0x40080100, 0x100, 0x2000000, 0x42080000, 0x42080100, 0x80100, 0x42000000, 0x42080100, 0x2080000, 0, 0x40080000, 0x42000000, 0x80100, 0x2000100, 0x40000100, 0x80000, 0, 0x40080000, 0x2080100, 0x40000100];\n var spfunction6 = [0x20000010, 0x20400000, 0x4000, 0x20404010, 0x20400000, 0x10, 0x20404010, 0x400000, 0x20004000, 0x404010, 0x400000, 0x20000010, 0x400010, 0x20004000, 0x20000000, 0x4010, 0, 0x400010, 0x20004010, 0x4000, 0x404000, 0x20004010, 0x10, 0x20400010, 0x20400010, 0, 0x404010, 0x20404000, 0x4010, 0x404000, 0x20404000, 0x20000000, 0x20004000, 0x10, 0x20400010, 0x404000, 0x20404010, 0x400000, 0x4010, 0x20000010, 0x400000, 0x20004000, 0x20000000, 0x4010, 0x20000010, 0x20404010, 0x404000, 0x20400000, 0x404010, 0x20404000, 0, 0x20400010, 0x10, 0x4000, 0x20400000, 0x404010, 0x4000, 0x400010, 0x20004010, 0, 0x20404000, 0x20000000, 0x400010, 0x20004010];\n var spfunction7 = [0x200000, 0x4200002, 0x4000802, 0, 0x800, 0x4000802, 0x200802, 0x4200800, 0x4200802, 0x200000, 0, 0x4000002, 0x2, 0x4000000, 0x4200002, 0x802, 0x4000800, 0x200802, 0x200002, 0x4000800, 0x4000002, 0x4200000, 0x4200800, 0x200002, 0x4200000, 0x800, 0x802, 0x4200802, 0x200800, 0x2, 0x4000000, 0x200800, 0x4000000, 0x200800, 0x200000, 0x4000802, 0x4000802, 0x4200002, 0x4200002, 0x2, 0x200002, 0x4000000, 0x4000800, 0x200000, 0x4200800, 0x802, 0x200802, 0x4200800, 0x802, 0x4000002, 0x4200802, 0x4200000, 0x200800, 0, 0x2, 0x4200802, 0, 0x200802, 0x4200000, 0x800, 0x4000002, 0x4000800, 0x800, 0x200002];\n var spfunction8 = [0x10001040, 0x1000, 0x40000, 0x10041040, 0x10000000, 0x10001040, 0x40, 0x10000000, 0x40040, 0x10040000, 0x10041040, 0x41000, 0x10041000, 0x41040, 0x1000, 0x40, 0x10040000, 0x10000040, 0x10001000, 0x1040, 0x41000, 0x40040, 0x10040040, 0x10041000, 0x1040, 0, 0, 0x10040040, 0x10000040, 0x10001000, 0x41040, 0x40000, 0x41040, 0x40000, 0x10041000, 0x1000, 0x40, 0x10040040, 0x1000, 0x41040, 0x10001000, 0x40, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x40000, 0x10001040, 0, 0x10041040, 0x40040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0, 0x10041040, 0x41000, 0x41000, 0x1040, 0x1040, 0x40040, 0x10000000, 0x10041000];\n\n //create the 16 or 48 subkeys we will need\n var m = 0;\n var i = void 0;\n var j = void 0;\n var temp = void 0;\n var right1 = void 0;\n var right2 = void 0;\n var left = void 0;\n var right = void 0;\n var looping = void 0;\n var cbcleft = void 0;\n var cbcleft2 = void 0;\n var cbcright = void 0;\n var cbcright2 = void 0;\n var endloop = void 0;\n var loopinc = void 0;\n var len = message.length;\n\n //set up the loops for single and triple des\n var iterations = keys.length === 32 ? 3 : 9; //single or triple des\n if (iterations === 3) {\n looping = encrypt ? [0, 32, 2] : [30, -2, -2];\n } else {\n looping = encrypt ? [0, 32, 2, 62, 30, -2, 64, 96, 2] : [94, 62, -2, 32, 64, 2, 30, -2, -2];\n }\n\n //pad the message depending on the padding parameter\n //only add padding if encrypting - note that you need to use the same padding option for both encrypt and decrypt\n if (encrypt) {\n message = des_addPadding(message, padding);\n len = message.length;\n }\n\n //store the result here\n var result = new Uint8Array(len);\n var k = 0;\n\n if (mode === 1) {\n //CBC mode\n cbcleft = iv[m++] << 24 | iv[m++] << 16 | iv[m++] << 8 | iv[m++];\n cbcright = iv[m++] << 24 | iv[m++] << 16 | iv[m++] << 8 | iv[m++];\n m = 0;\n }\n\n //loop through each 64 bit chunk of the message\n while (m < len) {\n left = message[m++] << 24 | message[m++] << 16 | message[m++] << 8 | message[m++];\n right = message[m++] << 24 | message[m++] << 16 | message[m++] << 8 | message[m++];\n\n //for Cipher Block Chaining mode, xor the message with the previous result\n if (mode === 1) {\n if (encrypt) {\n left ^= cbcleft;\n right ^= cbcright;\n } else {\n cbcleft2 = cbcleft;\n cbcright2 = cbcright;\n cbcleft = left;\n cbcright = right;\n }\n }\n\n //first each 64 but chunk of the message must be permuted according to IP\n temp = (left >>> 4 ^ right) & 0x0f0f0f0f;\n right ^= temp;\n left ^= temp << 4;\n temp = (left >>> 16 ^ right) & 0x0000ffff;\n right ^= temp;\n left ^= temp << 16;\n temp = (right >>> 2 ^ left) & 0x33333333;\n left ^= temp;\n right ^= temp << 2;\n temp = (right >>> 8 ^ left) & 0x00ff00ff;\n left ^= temp;\n right ^= temp << 8;\n temp = (left >>> 1 ^ right) & 0x55555555;\n right ^= temp;\n left ^= temp << 1;\n\n left = left << 1 | left >>> 31;\n right = right << 1 | right >>> 31;\n\n //do this either 1 or 3 times for each chunk of the message\n for (j = 0; j < iterations; j += 3) {\n endloop = looping[j + 1];\n loopinc = looping[j + 2];\n //now go through and perform the encryption or decryption\n for (i = looping[j]; i !== endloop; i += loopinc) {\n //for efficiency\n right1 = right ^ keys[i];\n right2 = (right >>> 4 | right << 28) ^ keys[i + 1];\n //the result is attained by passing these bytes through the S selection functions\n temp = left;\n left = right;\n right = temp ^ (spfunction2[right1 >>> 24 & 0x3f] | spfunction4[right1 >>> 16 & 0x3f] | spfunction6[right1 >>> 8 & 0x3f] | spfunction8[right1 & 0x3f] | spfunction1[right2 >>> 24 & 0x3f] | spfunction3[right2 >>> 16 & 0x3f] | spfunction5[right2 >>> 8 & 0x3f] | spfunction7[right2 & 0x3f]);\n }\n temp = left;\n left = right;\n right = temp; //unreverse left and right\n } //for either 1 or 3 iterations\n\n //move then each one bit to the right\n left = left >>> 1 | left << 31;\n right = right >>> 1 | right << 31;\n\n //now perform IP-1, which is IP in the opposite direction\n temp = (left >>> 1 ^ right) & 0x55555555;\n right ^= temp;\n left ^= temp << 1;\n temp = (right >>> 8 ^ left) & 0x00ff00ff;\n left ^= temp;\n right ^= temp << 8;\n temp = (right >>> 2 ^ left) & 0x33333333;\n left ^= temp;\n right ^= temp << 2;\n temp = (left >>> 16 ^ right) & 0x0000ffff;\n right ^= temp;\n left ^= temp << 16;\n temp = (left >>> 4 ^ right) & 0x0f0f0f0f;\n right ^= temp;\n left ^= temp << 4;\n\n //for Cipher Block Chaining mode, xor the message with the previous result\n if (mode === 1) {\n if (encrypt) {\n cbcleft = left;\n cbcright = right;\n } else {\n left ^= cbcleft2;\n right ^= cbcright2;\n }\n }\n\n result[k++] = left >>> 24;\n result[k++] = left >>> 16 & 0xff;\n result[k++] = left >>> 8 & 0xff;\n result[k++] = left & 0xff;\n result[k++] = right >>> 24;\n result[k++] = right >>> 16 & 0xff;\n result[k++] = right >>> 8 & 0xff;\n result[k++] = right & 0xff;\n } //for every 8 characters, or 64 bits in the message\n\n //only remove padding if decrypting - note that you need to use the same padding option for both encrypt and decrypt\n if (!encrypt) {\n result = des_removePadding(result, padding);\n }\n\n return result;\n} //end of des\n\n\n//des_createKeys\n//this takes as input a 64 bit key (even though only 56 bits are used)\n//as an array of 2 integers, and returns 16 48 bit keys\n\nfunction des_createKeys(key) {\n //declaring this locally speeds things up a bit\n var pc2bytes0 = [0, 0x4, 0x20000000, 0x20000004, 0x10000, 0x10004, 0x20010000, 0x20010004, 0x200, 0x204, 0x20000200, 0x20000204, 0x10200, 0x10204, 0x20010200, 0x20010204];\n var pc2bytes1 = [0, 0x1, 0x100000, 0x100001, 0x4000000, 0x4000001, 0x4100000, 0x4100001, 0x100, 0x101, 0x100100, 0x100101, 0x4000100, 0x4000101, 0x4100100, 0x4100101];\n var pc2bytes2 = [0, 0x8, 0x800, 0x808, 0x1000000, 0x1000008, 0x1000800, 0x1000808, 0, 0x8, 0x800, 0x808, 0x1000000, 0x1000008, 0x1000800, 0x1000808];\n var pc2bytes3 = [0, 0x200000, 0x8000000, 0x8200000, 0x2000, 0x202000, 0x8002000, 0x8202000, 0x20000, 0x220000, 0x8020000, 0x8220000, 0x22000, 0x222000, 0x8022000, 0x8222000];\n var pc2bytes4 = [0, 0x40000, 0x10, 0x40010, 0, 0x40000, 0x10, 0x40010, 0x1000, 0x41000, 0x1010, 0x41010, 0x1000, 0x41000, 0x1010, 0x41010];\n var pc2bytes5 = [0, 0x400, 0x20, 0x420, 0, 0x400, 0x20, 0x420, 0x2000000, 0x2000400, 0x2000020, 0x2000420, 0x2000000, 0x2000400, 0x2000020, 0x2000420];\n var pc2bytes6 = [0, 0x10000000, 0x80000, 0x10080000, 0x2, 0x10000002, 0x80002, 0x10080002, 0, 0x10000000, 0x80000, 0x10080000, 0x2, 0x10000002, 0x80002, 0x10080002];\n var pc2bytes7 = [0, 0x10000, 0x800, 0x10800, 0x20000000, 0x20010000, 0x20000800, 0x20010800, 0x20000, 0x30000, 0x20800, 0x30800, 0x20020000, 0x20030000, 0x20020800, 0x20030800];\n var pc2bytes8 = [0, 0x40000, 0, 0x40000, 0x2, 0x40002, 0x2, 0x40002, 0x2000000, 0x2040000, 0x2000000, 0x2040000, 0x2000002, 0x2040002, 0x2000002, 0x2040002];\n var pc2bytes9 = [0, 0x10000000, 0x8, 0x10000008, 0, 0x10000000, 0x8, 0x10000008, 0x400, 0x10000400, 0x408, 0x10000408, 0x400, 0x10000400, 0x408, 0x10000408];\n var pc2bytes10 = [0, 0x20, 0, 0x20, 0x100000, 0x100020, 0x100000, 0x100020, 0x2000, 0x2020, 0x2000, 0x2020, 0x102000, 0x102020, 0x102000, 0x102020];\n var pc2bytes11 = [0, 0x1000000, 0x200, 0x1000200, 0x200000, 0x1200000, 0x200200, 0x1200200, 0x4000000, 0x5000000, 0x4000200, 0x5000200, 0x4200000, 0x5200000, 0x4200200, 0x5200200];\n var pc2bytes12 = [0, 0x1000, 0x8000000, 0x8001000, 0x80000, 0x81000, 0x8080000, 0x8081000, 0x10, 0x1010, 0x8000010, 0x8001010, 0x80010, 0x81010, 0x8080010, 0x8081010];\n var pc2bytes13 = [0, 0x4, 0x100, 0x104, 0, 0x4, 0x100, 0x104, 0x1, 0x5, 0x101, 0x105, 0x1, 0x5, 0x101, 0x105];\n\n //how many iterations (1 for des, 3 for triple des)\n var iterations = key.length > 8 ? 3 : 1; //changed by Paul 16/6/2007 to use Triple DES for 9+ byte keys\n //stores the return keys\n var keys = new Array(32 * iterations);\n //now define the left shifts which need to be done\n var shifts = [0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0];\n //other variables\n var lefttemp = void 0;\n var righttemp = void 0;\n var m = 0;\n var n = 0;\n var temp = void 0;\n\n for (var j = 0; j < iterations; j++) {\n //either 1 or 3 iterations\n var left = key[m++] << 24 | key[m++] << 16 | key[m++] << 8 | key[m++];\n var right = key[m++] << 24 | key[m++] << 16 | key[m++] << 8 | key[m++];\n\n temp = (left >>> 4 ^ right) & 0x0f0f0f0f;\n right ^= temp;\n left ^= temp << 4;\n temp = (right >>> -16 ^ left) & 0x0000ffff;\n left ^= temp;\n right ^= temp << -16;\n temp = (left >>> 2 ^ right) & 0x33333333;\n right ^= temp;\n left ^= temp << 2;\n temp = (right >>> -16 ^ left) & 0x0000ffff;\n left ^= temp;\n right ^= temp << -16;\n temp = (left >>> 1 ^ right) & 0x55555555;\n right ^= temp;\n left ^= temp << 1;\n temp = (right >>> 8 ^ left) & 0x00ff00ff;\n left ^= temp;\n right ^= temp << 8;\n temp = (left >>> 1 ^ right) & 0x55555555;\n right ^= temp;\n left ^= temp << 1;\n\n //the right side needs to be shifted and to get the last four bits of the left side\n temp = left << 8 | right >>> 20 & 0x000000f0;\n //left needs to be put upside down\n left = right << 24 | right << 8 & 0xff0000 | right >>> 8 & 0xff00 | right >>> 24 & 0xf0;\n right = temp;\n\n //now go through and perform these shifts on the left and right keys\n for (var i = 0; i < shifts.length; i++) {\n //shift the keys either one or two bits to the left\n if (shifts[i]) {\n left = left << 2 | left >>> 26;\n right = right << 2 | right >>> 26;\n } else {\n left = left << 1 | left >>> 27;\n right = right << 1 | right >>> 27;\n }\n left &= -0xf;\n right &= -0xf;\n\n //now apply PC-2, in such a way that E is easier when encrypting or decrypting\n //this conversion will look like PC-2 except only the last 6 bits of each byte are used\n //rather than 48 consecutive bits and the order of lines will be according to\n //how the S selection functions will be applied: S2, S4, S6, S8, S1, S3, S5, S7\n lefttemp = pc2bytes0[left >>> 28] | pc2bytes1[left >>> 24 & 0xf] | pc2bytes2[left >>> 20 & 0xf] | pc2bytes3[left >>> 16 & 0xf] | pc2bytes4[left >>> 12 & 0xf] | pc2bytes5[left >>> 8 & 0xf] | pc2bytes6[left >>> 4 & 0xf];\n righttemp = pc2bytes7[right >>> 28] | pc2bytes8[right >>> 24 & 0xf] | pc2bytes9[right >>> 20 & 0xf] | pc2bytes10[right >>> 16 & 0xf] | pc2bytes11[right >>> 12 & 0xf] | pc2bytes12[right >>> 8 & 0xf] | pc2bytes13[right >>> 4 & 0xf];\n temp = (righttemp >>> 16 ^ lefttemp) & 0x0000ffff;\n keys[n++] = lefttemp ^ temp;\n keys[n++] = righttemp ^ temp << 16;\n }\n } //for each iterations\n //return the keys we've created\n return keys;\n} //end of des_createKeys\n\n\nfunction des_addPadding(message, padding) {\n var padLength = 8 - message.length % 8;\n\n var pad = void 0;\n if (padding === 2 && padLength < 8) {\n //pad the message with spaces\n pad = \" \".charCodeAt(0);\n } else if (padding === 1) {\n //PKCS7 padding\n pad = padLength;\n } else if (!padding && padLength < 8) {\n //pad the message out with null bytes\n pad = 0;\n } else if (padLength === 8) {\n return message;\n } else {\n throw new Error('des: invalid padding');\n }\n\n var paddedMessage = new Uint8Array(message.length + padLength);\n for (var i = 0; i < message.length; i++) {\n paddedMessage[i] = message[i];\n }\n for (var j = 0; j < padLength; j++) {\n paddedMessage[message.length + j] = pad;\n }\n\n return paddedMessage;\n}\n\nfunction des_removePadding(message, padding) {\n var padLength = null;\n var pad = void 0;\n if (padding === 2) {\n // space padded\n pad = \" \".charCodeAt(0);\n } else if (padding === 1) {\n // PKCS7\n padLength = message[message.length - 1];\n } else if (!padding) {\n // null padding\n pad = 0;\n } else {\n throw new Error('des: invalid padding');\n }\n\n if (!padLength) {\n padLength = 1;\n while (message[message.length - padLength] === pad) {\n padLength++;\n }\n padLength--;\n }\n\n return message.subarray(0, message.length - padLength);\n}\n\n// added by Recurity Labs\n\nfunction TripleDES(key) {\n this.key = [];\n\n for (var i = 0; i < 3; i++) {\n this.key.push(new Uint8Array(key.subarray(i * 8, i * 8 + 8)));\n }\n\n this.encrypt = function (block) {\n return des(des_createKeys(this.key[2]), des(des_createKeys(this.key[1]), des(des_createKeys(this.key[0]), block, true, 0, null, null), false, 0, null, null), true, 0, null, null);\n };\n}\n\nTripleDES.keySize = TripleDES.prototype.keySize = 24;\nTripleDES.blockSize = TripleDES.prototype.blockSize = 8;\n\n// This is \"original\" DES\n\nfunction DES(key) {\n this.key = key;\n\n this.encrypt = function (block, padding) {\n var keys = des_createKeys(this.key);\n return des(keys, block, true, 0, null, padding);\n };\n\n this.decrypt = function (block, padding) {\n var keys = des_createKeys(this.key);\n return des(keys, block, false, 0, null, padding);\n };\n}\n\nexports.default = { DES: DES, TripleDES: TripleDES };\n\n},{}],332:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _aes = _dereq_('./aes');\n\nvar _aes2 = _interopRequireDefault(_aes);\n\nvar _des = _dereq_('./des.js');\n\nvar _des2 = _interopRequireDefault(_des);\n\nvar _cast = _dereq_('./cast5');\n\nvar _cast2 = _interopRequireDefault(_cast);\n\nvar _twofish = _dereq_('./twofish');\n\nvar _twofish2 = _interopRequireDefault(_twofish);\n\nvar _blowfish = _dereq_('./blowfish');\n\nvar _blowfish2 = _interopRequireDefault(_blowfish);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n /**\n * AES-128 encryption and decryption (ID 7)\n * @function\n * @param {String} key 128-bit key\n * @see {@link https://github.com/asmcrypto/asmcrypto.js|asmCrypto}\n * @see {@link https://csrc.nist.gov/publications/fips/fips197/fips-197.pdf|NIST FIPS-197}\n * @returns {Object}\n * @requires asmcrypto.js\n */\n aes128: (0, _aes2.default)(128),\n /**\n * AES-128 Block Cipher (ID 8)\n * @function\n * @param {String} key 192-bit key\n * @see {@link https://github.com/asmcrypto/asmcrypto.js|asmCrypto}\n * @see {@link https://csrc.nist.gov/publications/fips/fips197/fips-197.pdf|NIST FIPS-197}\n * @returns {Object}\n * @requires asmcrypto.js\n */\n aes192: (0, _aes2.default)(192),\n /**\n * AES-128 Block Cipher (ID 9)\n * @function\n * @param {String} key 256-bit key\n * @see {@link https://github.com/asmcrypto/asmcrypto.js|asmCrypto}\n * @see {@link https://csrc.nist.gov/publications/fips/fips197/fips-197.pdf|NIST FIPS-197}\n * @returns {Object}\n * @requires asmcrypto.js\n */\n aes256: (0, _aes2.default)(256),\n // Not in OpenPGP specifications\n des: _des2.default.DES,\n /**\n * Triple DES Block Cipher (ID 2)\n * @function\n * @param {String} key 192-bit key\n * @see {@link https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-67r2.pdf|NIST SP 800-67}\n * @returns {Object}\n */\n tripledes: _des2.default.TripleDES,\n /**\n * CAST-128 Block Cipher (ID 3)\n * @function\n * @param {String} key 128-bit key\n * @see {@link https://tools.ietf.org/html/rfc2144|The CAST-128 Encryption Algorithm}\n * @returns {Object}\n */\n cast5: _cast2.default,\n /**\n * Twofish Block Cipher (ID 10)\n * @function\n * @param {String} key 256-bit key\n * @see {@link https://tools.ietf.org/html/rfc4880#ref-TWOFISH|TWOFISH}\n * @returns {Object}\n */\n twofish: _twofish2.default,\n /**\n * Blowfish Block Cipher (ID 4)\n * @function\n * @param {String} key 128-bit key\n * @see {@link https://tools.ietf.org/html/rfc4880#ref-BLOWFISH|BLOWFISH}\n * @returns {Object}\n */\n blowfish: _blowfish2.default,\n /**\n * Not implemented\n * @function\n * @throws {Error}\n */\n idea: function idea() {\n throw new Error('IDEA symmetric-key algorithm not implemented');\n }\n}; /**\n * @fileoverview Symmetric cryptography functions\n * @requires crypto/cipher/aes\n * @requires crypto/cipher/des\n * @requires crypto/cipher/cast5\n * @requires crypto/cipher/twofish\n * @requires crypto/cipher/blowfish\n * @module crypto/cipher\n */\n\n},{\"./aes\":328,\"./blowfish\":329,\"./cast5\":330,\"./des.js\":331,\"./twofish\":333}],333:[function(_dereq_,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _from = _dereq_(\"babel-runtime/core-js/array/from\");\n\nvar _from2 = _interopRequireDefault(_from);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable no-mixed-operators, no-fallthrough */\n\n/* Modified by Recurity Labs GmbH\n *\n * Cipher.js\n * A block-cipher algorithm implementation on JavaScript\n * See Cipher.readme.txt for further information.\n *\n * Copyright(c) 2009 Atsushi Oka [ http://oka.nu/ ]\n * This script file is distributed under the LGPL\n *\n * ACKNOWLEDGMENT\n *\n * The main subroutines are written by Michiel van Everdingen.\n *\n * Michiel van Everdingen\n * http://home.versatel.nl/MAvanEverdingen/index.html\n *\n * All rights for these routines are reserved to Michiel van Everdingen.\n *\n */\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//Math\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nvar MAXINT = 0xFFFFFFFF;\n\nfunction rotw(w, n) {\n return (w << n | w >>> 32 - n) & MAXINT;\n}\n\nfunction getW(a, i) {\n return a[i] | a[i + 1] << 8 | a[i + 2] << 16 | a[i + 3] << 24;\n}\n\nfunction setW(a, i, w) {\n a.splice(i, 4, w & 0xFF, w >>> 8 & 0xFF, w >>> 16 & 0xFF, w >>> 24 & 0xFF);\n}\n\nfunction getB(x, n) {\n return x >>> n * 8 & 0xFF;\n}\n\n// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Twofish\n// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nfunction createTwofish() {\n //\n var keyBytes = null;\n var dataBytes = null;\n var dataOffset = -1;\n // var dataLength = -1;\n // var idx2 = -1;\n //\n\n var tfsKey = [];\n var tfsM = [[], [], [], []];\n\n function tfsInit(key) {\n keyBytes = key;\n var i = void 0;\n var a = void 0;\n var b = void 0;\n var c = void 0;\n var d = void 0;\n var meKey = [];\n var moKey = [];\n var inKey = [];\n var kLen = void 0;\n var sKey = [];\n var f01 = void 0;\n var f5b = void 0;\n var fef = void 0;\n\n var q0 = [[8, 1, 7, 13, 6, 15, 3, 2, 0, 11, 5, 9, 14, 12, 10, 4], [2, 8, 11, 13, 15, 7, 6, 14, 3, 1, 9, 4, 0, 10, 12, 5]];\n var q1 = [[14, 12, 11, 8, 1, 2, 3, 5, 15, 4, 10, 6, 7, 0, 9, 13], [1, 14, 2, 11, 4, 12, 3, 7, 6, 13, 10, 5, 15, 9, 0, 8]];\n var q2 = [[11, 10, 5, 14, 6, 13, 9, 0, 12, 8, 15, 3, 2, 4, 7, 1], [4, 12, 7, 5, 1, 6, 9, 10, 0, 14, 13, 8, 2, 11, 3, 15]];\n var q3 = [[13, 7, 15, 4, 1, 2, 6, 14, 9, 11, 3, 0, 8, 5, 12, 10], [11, 9, 5, 1, 12, 3, 13, 14, 6, 4, 7, 15, 2, 0, 8, 10]];\n var ror4 = [0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15];\n var ashx = [0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 5, 14, 7];\n var q = [[], []];\n var m = [[], [], [], []];\n\n function ffm5b(x) {\n return x ^ x >> 2 ^ [0, 90, 180, 238][x & 3];\n }\n\n function ffmEf(x) {\n return x ^ x >> 1 ^ x >> 2 ^ [0, 238, 180, 90][x & 3];\n }\n\n function mdsRem(p, q) {\n var i = void 0;\n var t = void 0;\n var u = void 0;\n for (i = 0; i < 8; i++) {\n t = q >>> 24;\n q = q << 8 & MAXINT | p >>> 24;\n p = p << 8 & MAXINT;\n u = t << 1;\n if (t & 128) {\n u ^= 333;\n }\n q ^= t ^ u << 16;\n u ^= t >>> 1;\n if (t & 1) {\n u ^= 166;\n }\n q ^= u << 24 | u << 8;\n }\n return q;\n }\n\n function qp(n, x) {\n var a = x >> 4;\n var b = x & 15;\n var c = q0[n][a ^ b];\n var d = q1[n][ror4[b] ^ ashx[a]];\n return q3[n][ror4[d] ^ ashx[c]] << 4 | q2[n][c ^ d];\n }\n\n function hFun(x, key) {\n var a = getB(x, 0);\n var b = getB(x, 1);\n var c = getB(x, 2);\n var d = getB(x, 3);\n switch (kLen) {\n case 4:\n a = q[1][a] ^ getB(key[3], 0);\n b = q[0][b] ^ getB(key[3], 1);\n c = q[0][c] ^ getB(key[3], 2);\n d = q[1][d] ^ getB(key[3], 3);\n case 3:\n a = q[1][a] ^ getB(key[2], 0);\n b = q[1][b] ^ getB(key[2], 1);\n c = q[0][c] ^ getB(key[2], 2);\n d = q[0][d] ^ getB(key[2], 3);\n case 2:\n a = q[0][q[0][a] ^ getB(key[1], 0)] ^ getB(key[0], 0);\n b = q[0][q[1][b] ^ getB(key[1], 1)] ^ getB(key[0], 1);\n c = q[1][q[0][c] ^ getB(key[1], 2)] ^ getB(key[0], 2);\n d = q[1][q[1][d] ^ getB(key[1], 3)] ^ getB(key[0], 3);\n }\n return m[0][a] ^ m[1][b] ^ m[2][c] ^ m[3][d];\n }\n\n keyBytes = keyBytes.slice(0, 32);\n i = keyBytes.length;\n while (i !== 16 && i !== 24 && i !== 32) {\n keyBytes[i++] = 0;\n }\n\n for (i = 0; i < keyBytes.length; i += 4) {\n inKey[i >> 2] = getW(keyBytes, i);\n }\n for (i = 0; i < 256; i++) {\n q[0][i] = qp(0, i);\n q[1][i] = qp(1, i);\n }\n for (i = 0; i < 256; i++) {\n f01 = q[1][i];\n f5b = ffm5b(f01);\n fef = ffmEf(f01);\n m[0][i] = f01 + (f5b << 8) + (fef << 16) + (fef << 24);\n m[2][i] = f5b + (fef << 8) + (f01 << 16) + (fef << 24);\n f01 = q[0][i];\n f5b = ffm5b(f01);\n fef = ffmEf(f01);\n m[1][i] = fef + (fef << 8) + (f5b << 16) + (f01 << 24);\n m[3][i] = f5b + (f01 << 8) + (fef << 16) + (f5b << 24);\n }\n\n kLen = inKey.length / 2;\n for (i = 0; i < kLen; i++) {\n a = inKey[i + i];\n meKey[i] = a;\n b = inKey[i + i + 1];\n moKey[i] = b;\n sKey[kLen - i - 1] = mdsRem(a, b);\n }\n for (i = 0; i < 40; i += 2) {\n a = 0x1010101 * i;\n b = a + 0x1010101;\n a = hFun(a, meKey);\n b = rotw(hFun(b, moKey), 8);\n tfsKey[i] = a + b & MAXINT;\n tfsKey[i + 1] = rotw(a + 2 * b, 9);\n }\n for (i = 0; i < 256; i++) {\n a = b = c = d = i;\n switch (kLen) {\n case 4:\n a = q[1][a] ^ getB(sKey[3], 0);\n b = q[0][b] ^ getB(sKey[3], 1);\n c = q[0][c] ^ getB(sKey[3], 2);\n d = q[1][d] ^ getB(sKey[3], 3);\n case 3:\n a = q[1][a] ^ getB(sKey[2], 0);\n b = q[1][b] ^ getB(sKey[2], 1);\n c = q[0][c] ^ getB(sKey[2], 2);\n d = q[0][d] ^ getB(sKey[2], 3);\n case 2:\n tfsM[0][i] = m[0][q[0][q[0][a] ^ getB(sKey[1], 0)] ^ getB(sKey[0], 0)];\n tfsM[1][i] = m[1][q[0][q[1][b] ^ getB(sKey[1], 1)] ^ getB(sKey[0], 1)];\n tfsM[2][i] = m[2][q[1][q[0][c] ^ getB(sKey[1], 2)] ^ getB(sKey[0], 2)];\n tfsM[3][i] = m[3][q[1][q[1][d] ^ getB(sKey[1], 3)] ^ getB(sKey[0], 3)];\n }\n }\n }\n\n function tfsG0(x) {\n return tfsM[0][getB(x, 0)] ^ tfsM[1][getB(x, 1)] ^ tfsM[2][getB(x, 2)] ^ tfsM[3][getB(x, 3)];\n }\n\n function tfsG1(x) {\n return tfsM[0][getB(x, 3)] ^ tfsM[1][getB(x, 0)] ^ tfsM[2][getB(x, 1)] ^ tfsM[3][getB(x, 2)];\n }\n\n function tfsFrnd(r, blk) {\n var a = tfsG0(blk[0]);\n var b = tfsG1(blk[1]);\n blk[2] = rotw(blk[2] ^ a + b + tfsKey[4 * r + 8] & MAXINT, 31);\n blk[3] = rotw(blk[3], 1) ^ a + 2 * b + tfsKey[4 * r + 9] & MAXINT;\n a = tfsG0(blk[2]);\n b = tfsG1(blk[3]);\n blk[0] = rotw(blk[0] ^ a + b + tfsKey[4 * r + 10] & MAXINT, 31);\n blk[1] = rotw(blk[1], 1) ^ a + 2 * b + tfsKey[4 * r + 11] & MAXINT;\n }\n\n function tfsIrnd(i, blk) {\n var a = tfsG0(blk[0]);\n var b = tfsG1(blk[1]);\n blk[2] = rotw(blk[2], 1) ^ a + b + tfsKey[4 * i + 10] & MAXINT;\n blk[3] = rotw(blk[3] ^ a + 2 * b + tfsKey[4 * i + 11] & MAXINT, 31);\n a = tfsG0(blk[2]);\n b = tfsG1(blk[3]);\n blk[0] = rotw(blk[0], 1) ^ a + b + tfsKey[4 * i + 8] & MAXINT;\n blk[1] = rotw(blk[1] ^ a + 2 * b + tfsKey[4 * i + 9] & MAXINT, 31);\n }\n\n function tfsClose() {\n tfsKey = [];\n tfsM = [[], [], [], []];\n }\n\n function tfsEncrypt(data, offset) {\n dataBytes = data;\n dataOffset = offset;\n var blk = [getW(dataBytes, dataOffset) ^ tfsKey[0], getW(dataBytes, dataOffset + 4) ^ tfsKey[1], getW(dataBytes, dataOffset + 8) ^ tfsKey[2], getW(dataBytes, dataOffset + 12) ^ tfsKey[3]];\n for (var j = 0; j < 8; j++) {\n tfsFrnd(j, blk);\n }\n setW(dataBytes, dataOffset, blk[2] ^ tfsKey[4]);\n setW(dataBytes, dataOffset + 4, blk[3] ^ tfsKey[5]);\n setW(dataBytes, dataOffset + 8, blk[0] ^ tfsKey[6]);\n setW(dataBytes, dataOffset + 12, blk[1] ^ tfsKey[7]);\n dataOffset += 16;\n return dataBytes;\n }\n\n function tfsDecrypt(data, offset) {\n dataBytes = data;\n dataOffset = offset;\n var blk = [getW(dataBytes, dataOffset) ^ tfsKey[4], getW(dataBytes, dataOffset + 4) ^ tfsKey[5], getW(dataBytes, dataOffset + 8) ^ tfsKey[6], getW(dataBytes, dataOffset + 12) ^ tfsKey[7]];\n for (var j = 7; j >= 0; j--) {\n tfsIrnd(j, blk);\n }\n setW(dataBytes, dataOffset, blk[2] ^ tfsKey[0]);\n setW(dataBytes, dataOffset + 4, blk[3] ^ tfsKey[1]);\n setW(dataBytes, dataOffset + 8, blk[0] ^ tfsKey[2]);\n setW(dataBytes, dataOffset + 12, blk[1] ^ tfsKey[3]);\n dataOffset += 16;\n }\n\n // added by Recurity Labs\n\n function tfsFinal() {\n return dataBytes;\n }\n\n return {\n name: \"twofish\",\n blocksize: 128 / 8,\n open: tfsInit,\n close: tfsClose,\n encrypt: tfsEncrypt,\n decrypt: tfsDecrypt,\n // added by Recurity Labs\n finalize: tfsFinal\n };\n}\n\n// added by Recurity Labs\n\nfunction TF(key) {\n this.tf = createTwofish();\n this.tf.open((0, _from2.default)(key), 0);\n\n this.encrypt = function (block) {\n return this.tf.encrypt((0, _from2.default)(block), 0);\n };\n}\n\nTF.keySize = TF.prototype.keySize = 32;\nTF.blockSize = TF.prototype.blockSize = 16;\n\nexports.default = TF;\n\n},{\"babel-runtime/core-js/array/from\":20}],334:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar CBC = function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(key) {\n return _regenerator2.default.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n if (!(_util2.default.getWebCrypto() && key.length !== 24)) {\n _context6.next = 5;\n break;\n }\n\n _context6.next = 3;\n return webCrypto.importKey('raw', key, { name: 'AES-CBC', length: key.length * 8 }, false, ['encrypt']);\n\n case 3:\n key = _context6.sent;\n return _context6.abrupt('return', function () {\n var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(pt) {\n var ct;\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return webCrypto.encrypt({ name: 'AES-CBC', iv: zeroBlock, length: blockLength * 8 }, key, pt);\n\n case 2:\n ct = _context3.sent;\n return _context3.abrupt('return', new Uint8Array(ct).subarray(0, ct.byteLength - blockLength));\n\n case 4:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n return function (_x4) {\n return _ref4.apply(this, arguments);\n };\n }());\n\n case 5:\n if (!_util2.default.getNodeCrypto()) {\n _context6.next = 8;\n break;\n }\n\n // Node crypto library\n key = new Buffer(key);\n return _context6.abrupt('return', function () {\n var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(pt) {\n var en, ct;\n return _regenerator2.default.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n pt = new Buffer(pt);\n en = new nodeCrypto.createCipheriv('aes-' + key.length * 8 + '-cbc', key, zeroBlock);\n ct = en.update(pt);\n return _context4.abrupt('return', new Uint8Array(ct));\n\n case 4:\n case 'end':\n return _context4.stop();\n }\n }\n }, _callee4, this);\n }));\n\n return function (_x5) {\n return _ref5.apply(this, arguments);\n };\n }());\n\n case 8:\n return _context6.abrupt('return', function () {\n var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(pt) {\n return _regenerator2.default.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n return _context5.abrupt('return', _exports.AES_CBC.encrypt(pt, key, false, zeroBlock));\n\n case 1:\n case 'end':\n return _context5.stop();\n }\n }\n }, _callee5, this);\n }));\n\n return function (_x6) {\n return _ref6.apply(this, arguments);\n };\n }());\n\n case 9:\n case 'end':\n return _context6.stop();\n }\n }\n }, _callee6, this);\n }));\n\n return function CBC(_x3) {\n return _ref3.apply(this, arguments);\n };\n}();\n\nvar _exports = _dereq_('asmcrypto.js/src/aes/cbc/exports');\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @fileoverview This module implements AES-CMAC on top of\n * native AES-CBC using either the WebCrypto API or Node.js' crypto API.\n * @requires asmcrypto.js\n * @requires util\n * @module crypto/cmac\n */\n\nvar webCrypto = _util2.default.getWebCrypto();\nvar nodeCrypto = _util2.default.getNodeCrypto();\nvar Buffer = _util2.default.getNodeBuffer();\n\n/**\n * This implementation of CMAC is based on the description of OMAC in\n * http://web.cs.ucdavis.edu/~rogaway/papers/eax.pdf. As per that\n * document:\n *\n * We have made a small modification to the OMAC algorithm as it was\n * originally presented, changing one of its two constants.\n * Specifically, the constant 4 at line 85 was the constant 1/2 (the\n * multiplicative inverse of 2) in the original definition of OMAC [14].\n * The OMAC authors indicate that they will promulgate this modification\n * [15], which slightly simplifies implementations.\n */\n\nvar blockLength = 16;\n\n/**\n * xor `padding` into the end of `data`. This function implements \"the\n * operation xor→ [which] xors the shorter string into the end of longer\n * one\". Since data is always as least as long as padding, we can\n * simplify the implementation.\n * @param {Uint8Array} data\n * @param {Uint8Array} padding\n */\nfunction rightXorMut(data, padding) {\n var offset = data.length - blockLength;\n for (var i = 0; i < blockLength; i++) {\n data[i + offset] ^= padding[i];\n }\n return data;\n}\n\nfunction pad(data, padding, padding2) {\n // if |M| in {n, 2n, 3n, ...}\n if (data.length % blockLength === 0) {\n // then return M xor→ B,\n return rightXorMut(data, padding);\n }\n // else return (M || 10^(n−1−(|M| mod n))) xor→ P\n var padded = new Uint8Array(data.length + (blockLength - data.length % blockLength));\n padded.set(data);\n padded[data.length] = 128;\n return rightXorMut(padded, padding2);\n}\n\nvar zeroBlock = new Uint8Array(blockLength);\n\nexports.default = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(key) {\n var cbc, padding, padding2;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return CBC(key);\n\n case 2:\n cbc = _context2.sent;\n _context2.t0 = _util2.default;\n _context2.next = 6;\n return cbc(zeroBlock);\n\n case 6:\n _context2.t1 = _context2.sent;\n padding = _context2.t0.double.call(_context2.t0, _context2.t1);\n padding2 = _util2.default.double(padding);\n return _context2.abrupt('return', function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(data) {\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return cbc(pad(data, padding, padding2));\n\n case 2:\n _context.t0 = -blockLength;\n return _context.abrupt('return', _context.sent.subarray(_context.t0));\n\n case 4:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function (_x2) {\n return _ref2.apply(this, arguments);\n };\n }());\n\n case 10:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function CMAC(_x) {\n return _ref.apply(this, arguments);\n }\n\n return CMAC;\n}();\n\n},{\"../util\":398,\"asmcrypto.js/src/aes/cbc/exports\":5,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],335:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _public_key = _dereq_('./public_key');\n\nvar _public_key2 = _interopRequireDefault(_public_key);\n\nvar _cipher = _dereq_('./cipher');\n\nvar _cipher2 = _interopRequireDefault(_cipher);\n\nvar _random = _dereq_('./random');\n\nvar _random2 = _interopRequireDefault(_random);\n\nvar _ecdh_symkey = _dereq_('../type/ecdh_symkey');\n\nvar _ecdh_symkey2 = _interopRequireDefault(_ecdh_symkey);\n\nvar _kdf_params = _dereq_('../type/kdf_params');\n\nvar _kdf_params2 = _interopRequireDefault(_kdf_params);\n\nvar _mpi = _dereq_('../type/mpi');\n\nvar _mpi2 = _interopRequireDefault(_mpi);\n\nvar _oid = _dereq_('../type/oid');\n\nvar _oid2 = _interopRequireDefault(_oid);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n// The GPG4Browsers crypto interface\n\n/**\n * @fileoverview Provides functions for asymmetric encryption and decryption as\n * well as key generation and parameter handling for all public-key cryptosystems.\n * @requires crypto/public_key\n * @requires crypto/cipher\n * @requires crypto/random\n * @requires type/ecdh_symkey\n * @requires type/kdf_params\n * @requires type/mpi\n * @requires type/oid\n * @requires enums\n * @module crypto/crypto\n */\n\nfunction constructParams(types, data) {\n return types.map(function (type, i) {\n if (data && data[i]) {\n return new type(data[i]);\n }\n return new type();\n });\n}\n\nexports.default = {\n /**\n * Encrypts data using specified algorithm and public key parameters.\n * See {@link https://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1} for public key algorithms.\n * @param {module:enums.publicKey} algo Public key algorithm\n * @param {Array<module:type/mpi|\n module:type/oid|\n module:type/kdf_params>} pub_params Algorithm-specific public key parameters\n * @param {module:type/mpi} data Data to be encrypted as MPI\n * @param {String} fingerprint Recipient fingerprint\n * @returns {Array<module:type/mpi|\n * module:type/ecdh_symkey>} encrypted session key parameters\n * @async\n */\n publicKeyEncrypt: function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(algo, pub_params, data, fingerprint) {\n var types;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n types = this.getEncSessionKeyParamTypes(algo);\n return _context2.abrupt('return', (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() {\n var m, n, e, res, _m, p, g, y, _res, oid, Q, kdf_params, _res2;\n\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.t0 = algo;\n _context.next = _context.t0 === _enums2.default.publicKey.rsa_encrypt ? 3 : _context.t0 === _enums2.default.publicKey.rsa_encrypt_sign ? 3 : _context.t0 === _enums2.default.publicKey.elgamal ? 10 : _context.t0 === _enums2.default.publicKey.ecdh ? 18 : 25;\n break;\n\n case 3:\n m = data.toBN();\n n = pub_params[0].toBN();\n e = pub_params[1].toBN();\n _context.next = 8;\n return _public_key2.default.rsa.encrypt(m, n, e);\n\n case 8:\n res = _context.sent;\n return _context.abrupt('return', constructParams(types, [res]));\n\n case 10:\n _m = data.toBN();\n p = pub_params[0].toBN();\n g = pub_params[1].toBN();\n y = pub_params[2].toBN();\n _context.next = 16;\n return _public_key2.default.elgamal.encrypt(_m, p, g, y);\n\n case 16:\n _res = _context.sent;\n return _context.abrupt('return', constructParams(types, [_res.c1, _res.c2]));\n\n case 18:\n oid = pub_params[0];\n Q = pub_params[1].toUint8Array();\n kdf_params = pub_params[2];\n _context.next = 23;\n return _public_key2.default.elliptic.ecdh.encrypt(oid, kdf_params.cipher, kdf_params.hash, data, Q, fingerprint);\n\n case 23:\n _res2 = _context.sent;\n return _context.abrupt('return', constructParams(types, [_res2.V, _res2.C]));\n\n case 25:\n return _context.abrupt('return', []);\n\n case 26:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }))());\n\n case 2:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function publicKeyEncrypt(_x, _x2, _x3, _x4) {\n return _ref.apply(this, arguments);\n }\n\n return publicKeyEncrypt;\n }(),\n\n /**\n * Decrypts data using specified algorithm and private key parameters.\n * See {@link https://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1} for public key algorithms.\n * @param {module:enums.publicKey} algo Public key algorithm\n * @param {Array<module:type/mpi|\n module:type/oid|\n module:type/kdf_params>} key_params Algorithm-specific public, private key parameters\n * @param {Array<module:type/mpi|\n module:type/ecdh_symkey>}\n data_params encrypted session key parameters\n * @param {String} fingerprint Recipient fingerprint\n * @returns {module:type/mpi} An MPI containing the decrypted data\n * @async\n */\n publicKeyDecrypt: function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(algo, key_params, data_params, fingerprint) {\n return _regenerator2.default.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n _context4.t0 = _mpi2.default;\n _context4.next = 3;\n return (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3() {\n var c, n, e, d, p, q, u, c1, c2, _p, x, oid, kdf_params, V, C, _d;\n\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _context3.t0 = algo;\n _context3.next = _context3.t0 === _enums2.default.publicKey.rsa_encrypt_sign ? 3 : _context3.t0 === _enums2.default.publicKey.rsa_encrypt ? 3 : _context3.t0 === _enums2.default.publicKey.elgamal ? 11 : _context3.t0 === _enums2.default.publicKey.ecdh ? 16 : 22;\n break;\n\n case 3:\n c = data_params[0].toBN();\n n = key_params[0].toBN(); // n = pq\n\n e = key_params[1].toBN();\n d = key_params[2].toBN(); // de = 1 mod (p-1)(q-1)\n\n p = key_params[3].toBN();\n q = key_params[4].toBN();\n u = key_params[5].toBN(); // q^-1 mod p\n\n return _context3.abrupt('return', _public_key2.default.rsa.decrypt(c, n, e, d, p, q, u));\n\n case 11:\n c1 = data_params[0].toBN();\n c2 = data_params[1].toBN();\n _p = key_params[0].toBN();\n x = key_params[3].toBN();\n return _context3.abrupt('return', _public_key2.default.elgamal.decrypt(c1, c2, _p, x));\n\n case 16:\n oid = key_params[0];\n kdf_params = key_params[2];\n V = data_params[0].toUint8Array();\n C = data_params[1].data;\n _d = key_params[3].toUint8Array();\n return _context3.abrupt('return', _public_key2.default.elliptic.ecdh.decrypt(oid, kdf_params.cipher, kdf_params.hash, V, C, _d, fingerprint));\n\n case 22:\n throw new Error('Invalid public key encryption algorithm.');\n\n case 23:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }))();\n\n case 3:\n _context4.t1 = _context4.sent;\n return _context4.abrupt('return', new _context4.t0(_context4.t1));\n\n case 5:\n case 'end':\n return _context4.stop();\n }\n }\n }, _callee4, this);\n }));\n\n function publicKeyDecrypt(_x5, _x6, _x7, _x8) {\n return _ref3.apply(this, arguments);\n }\n\n return publicKeyDecrypt;\n }(),\n\n /** Returns the types comprising the private key of an algorithm\n * @param {String} algo The public key algorithm\n * @returns {Array<String>} The array of types\n */\n getPrivKeyParamTypes: function getPrivKeyParamTypes(algo) {\n switch (algo) {\n // Algorithm-Specific Fields for RSA secret keys:\n // - multiprecision integer (MPI) of RSA secret exponent d.\n // - MPI of RSA secret prime value p.\n // - MPI of RSA secret prime value q (p < q).\n // - MPI of u, the multiplicative inverse of p, mod q.\n case _enums2.default.publicKey.rsa_encrypt:\n case _enums2.default.publicKey.rsa_encrypt_sign:\n case _enums2.default.publicKey.rsa_sign:\n return [_mpi2.default, _mpi2.default, _mpi2.default, _mpi2.default];\n // Algorithm-Specific Fields for Elgamal secret keys:\n // - MPI of Elgamal secret exponent x.\n case _enums2.default.publicKey.elgamal:\n return [_mpi2.default];\n // Algorithm-Specific Fields for DSA secret keys:\n // - MPI of DSA secret exponent x.\n case _enums2.default.publicKey.dsa:\n return [_mpi2.default];\n // Algorithm-Specific Fields for ECDSA or ECDH secret keys:\n // - MPI of an integer representing the secret key.\n case _enums2.default.publicKey.ecdh:\n case _enums2.default.publicKey.ecdsa:\n case _enums2.default.publicKey.eddsa:\n return [_mpi2.default];\n default:\n throw new Error('Invalid public key encryption algorithm.');\n }\n },\n\n /** Returns the types comprising the public key of an algorithm\n * @param {String} algo The public key algorithm\n * @returns {Array<String>} The array of types\n */\n getPubKeyParamTypes: function getPubKeyParamTypes(algo) {\n switch (algo) {\n // Algorithm-Specific Fields for RSA public keys:\n // - a multiprecision integer (MPI) of RSA public modulus n;\n // - an MPI of RSA public encryption exponent e.\n case _enums2.default.publicKey.rsa_encrypt:\n case _enums2.default.publicKey.rsa_encrypt_sign:\n case _enums2.default.publicKey.rsa_sign:\n return [_mpi2.default, _mpi2.default];\n // Algorithm-Specific Fields for Elgamal public keys:\n // - MPI of Elgamal prime p;\n // - MPI of Elgamal group generator g;\n // - MPI of Elgamal public key value y (= g**x mod p where x is secret).\n case _enums2.default.publicKey.elgamal:\n return [_mpi2.default, _mpi2.default, _mpi2.default];\n // Algorithm-Specific Fields for DSA public keys:\n // - MPI of DSA prime p;\n // - MPI of DSA group order q (q is a prime divisor of p-1);\n // - MPI of DSA group generator g;\n // - MPI of DSA public-key value y (= g**x mod p where x is secret).\n case _enums2.default.publicKey.dsa:\n return [_mpi2.default, _mpi2.default, _mpi2.default, _mpi2.default];\n // Algorithm-Specific Fields for ECDSA/EdDSA public keys:\n // - OID of curve;\n // - MPI of EC point representing public key.\n case _enums2.default.publicKey.ecdsa:\n case _enums2.default.publicKey.eddsa:\n return [_oid2.default, _mpi2.default];\n // Algorithm-Specific Fields for ECDH public keys:\n // - OID of curve;\n // - MPI of EC point representing public key.\n // - KDF: variable-length field containing KDF parameters.\n case _enums2.default.publicKey.ecdh:\n return [_oid2.default, _mpi2.default, _kdf_params2.default];\n default:\n throw new Error('Invalid public key encryption algorithm.');\n }\n },\n\n /** Returns the types comprising the encrypted session key of an algorithm\n * @param {String} algo The public key algorithm\n * @returns {Array<String>} The array of types\n */\n getEncSessionKeyParamTypes: function getEncSessionKeyParamTypes(algo) {\n switch (algo) {\n // Algorithm-Specific Fields for RSA encrypted session keys:\n // - MPI of RSA encrypted value m**e mod n.\n case _enums2.default.publicKey.rsa_encrypt:\n case _enums2.default.publicKey.rsa_encrypt_sign:\n return [_mpi2.default];\n\n // Algorithm-Specific Fields for Elgamal encrypted session keys:\n // - MPI of Elgamal value g**k mod p\n // - MPI of Elgamal value m * y**k mod p\n case _enums2.default.publicKey.elgamal:\n return [_mpi2.default, _mpi2.default];\n // Algorithm-Specific Fields for ECDH encrypted session keys:\n // - MPI containing the ephemeral key used to establish the shared secret\n // - ECDH Symmetric Key\n case _enums2.default.publicKey.ecdh:\n return [_mpi2.default, _ecdh_symkey2.default];\n default:\n throw new Error('Invalid public key encryption algorithm.');\n }\n },\n\n /** Generate algorithm-specific key parameters\n * @param {String} algo The public key algorithm\n * @param {Integer} bits Bit length for RSA keys\n * @param {module:type/oid} oid Object identifier for ECC keys\n * @returns {Array} The array of parameters\n * @async\n */\n generateParams: function generateParams(algo, bits, oid) {\n var types = [].concat(this.getPubKeyParamTypes(algo), this.getPrivKeyParamTypes(algo));\n switch (algo) {\n case _enums2.default.publicKey.rsa_encrypt:\n case _enums2.default.publicKey.rsa_encrypt_sign:\n case _enums2.default.publicKey.rsa_sign:\n {\n return _public_key2.default.rsa.generate(bits, \"10001\").then(function (keyObject) {\n return constructParams(types, [keyObject.n, keyObject.e, keyObject.d, keyObject.p, keyObject.q, keyObject.u]);\n });\n }\n case _enums2.default.publicKey.dsa:\n case _enums2.default.publicKey.elgamal:\n throw new Error('Unsupported algorithm for key generation.');\n case _enums2.default.publicKey.ecdsa:\n case _enums2.default.publicKey.eddsa:\n return _public_key2.default.elliptic.generate(oid).then(function (keyObject) {\n return constructParams(types, [keyObject.oid, keyObject.Q, keyObject.d]);\n });\n case _enums2.default.publicKey.ecdh:\n return _public_key2.default.elliptic.generate(oid).then(function (keyObject) {\n return constructParams(types, [keyObject.oid, keyObject.Q, [keyObject.hash, keyObject.cipher], keyObject.d]);\n });\n default:\n throw new Error('Invalid public key algorithm.');\n }\n },\n\n /**\n * Generates a random byte prefix for the specified algorithm\n * See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2} for algorithms.\n * @param {module:enums.symmetric} algo Symmetric encryption algorithm\n * @returns {Uint8Array} Random bytes with length equal to the block size of the cipher\n * @async\n */\n getPrefixRandom: function getPrefixRandom(algo) {\n return _random2.default.getRandomBytes(_cipher2.default[algo].blockSize);\n },\n\n /**\n * Generating a session key for the specified symmetric algorithm\n * See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2} for algorithms.\n * @param {module:enums.symmetric} algo Symmetric encryption algorithm\n * @returns {Uint8Array} Random bytes as a string to be used as a key\n * @async\n */\n generateSessionKey: function generateSessionKey(algo) {\n return _random2.default.getRandomBytes(_cipher2.default[algo].keySize);\n },\n\n constructParams: constructParams\n};\n\n},{\"../enums\":359,\"../type/ecdh_symkey\":392,\"../type/kdf_params\":393,\"../type/mpi\":395,\"../type/oid\":396,\"./cipher\":332,\"./public_key\":352,\"./random\":355,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],336:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _promise = _dereq_('babel-runtime/core-js/promise');\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _slicedToArray2 = _dereq_('babel-runtime/helpers/slicedToArray');\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar OMAC = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(key) {\n var cmac;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return (0, _cmac2.default)(key);\n\n case 2:\n cmac = _context.sent;\n return _context.abrupt('return', function (t, message) {\n return cmac(_util2.default.concatUint8Array([t, message]));\n });\n\n case 4:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function OMAC(_x) {\n return _ref.apply(this, arguments);\n };\n}();\n\nvar CTR = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(key) {\n return _regenerator2.default.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n if (!(_util2.default.getWebCrypto() && key.length !== 24)) {\n _context5.next = 5;\n break;\n }\n\n _context5.next = 3;\n return webCrypto.importKey('raw', key, { name: 'AES-CTR', length: key.length * 8 }, false, ['encrypt']);\n\n case 3:\n key = _context5.sent;\n return _context5.abrupt('return', function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(pt, iv) {\n var ct;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return webCrypto.encrypt({ name: 'AES-CTR', counter: iv, length: blockLength * 8 }, key, pt);\n\n case 2:\n ct = _context2.sent;\n return _context2.abrupt('return', new Uint8Array(ct));\n\n case 4:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function (_x3, _x4) {\n return _ref3.apply(this, arguments);\n };\n }());\n\n case 5:\n if (!_util2.default.getNodeCrypto()) {\n _context5.next = 8;\n break;\n }\n\n // Node crypto library\n key = new Buffer(key);\n return _context5.abrupt('return', function () {\n var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(pt, iv) {\n var en, ct;\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n pt = new Buffer(pt);\n iv = new Buffer(iv);\n en = new nodeCrypto.createCipheriv('aes-' + key.length * 8 + '-ctr', key, iv);\n ct = Buffer.concat([en.update(pt), en.final()]);\n return _context3.abrupt('return', new Uint8Array(ct));\n\n case 5:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n return function (_x5, _x6) {\n return _ref4.apply(this, arguments);\n };\n }());\n\n case 8:\n return _context5.abrupt('return', function () {\n var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(pt, iv) {\n return _regenerator2.default.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n return _context4.abrupt('return', _exports.AES_CTR.encrypt(pt, key, iv));\n\n case 1:\n case 'end':\n return _context4.stop();\n }\n }\n }, _callee4, this);\n }));\n\n return function (_x7, _x8) {\n return _ref5.apply(this, arguments);\n };\n }());\n\n case 9:\n case 'end':\n return _context5.stop();\n }\n }\n }, _callee5, this);\n }));\n\n return function CTR(_x2) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n/**\n * Class to en/decrypt using EAX mode.\n * @param {String} cipher The symmetric cipher algorithm to use e.g. 'aes128'\n * @param {Uint8Array} key The encryption key\n */\n\n\nvar EAX = function () {\n var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(cipher, key) {\n var _ref7, _ref8, omac, ctr;\n\n return _regenerator2.default.wrap(function _callee8$(_context8) {\n while (1) {\n switch (_context8.prev = _context8.next) {\n case 0:\n if (!(cipher.substr(0, 3) !== 'aes')) {\n _context8.next = 2;\n break;\n }\n\n throw new Error('EAX mode supports only AES cipher');\n\n case 2:\n _context8.next = 4;\n return _promise2.default.all([OMAC(key), CTR(key)]);\n\n case 4:\n _ref7 = _context8.sent;\n _ref8 = (0, _slicedToArray3.default)(_ref7, 2);\n omac = _ref8[0];\n ctr = _ref8[1];\n return _context8.abrupt('return', {\n /**\n * Encrypt plaintext input.\n * @param {Uint8Array} plaintext The cleartext input to be encrypted\n * @param {Uint8Array} nonce The nonce (16 bytes)\n * @param {Uint8Array} adata Associated data to sign\n * @returns {Promise<Uint8Array>} The ciphertext output\n */\n encrypt: function () {\n var _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(plaintext, nonce, adata) {\n var _ref10, _ref11, omacNonce, omacAdata, ciphered, omacCiphered, tag, i;\n\n return _regenerator2.default.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n _context6.next = 2;\n return _promise2.default.all([omac(zero, nonce), omac(one, adata)]);\n\n case 2:\n _ref10 = _context6.sent;\n _ref11 = (0, _slicedToArray3.default)(_ref10, 2);\n omacNonce = _ref11[0];\n omacAdata = _ref11[1];\n _context6.next = 8;\n return ctr(plaintext, omacNonce);\n\n case 8:\n ciphered = _context6.sent;\n _context6.next = 11;\n return omac(two, ciphered);\n\n case 11:\n omacCiphered = _context6.sent;\n tag = omacCiphered; // Assumes that omac(*).length === tagLength.\n\n for (i = 0; i < tagLength; i++) {\n tag[i] ^= omacAdata[i] ^ omacNonce[i];\n }\n return _context6.abrupt('return', _util2.default.concatUint8Array([ciphered, tag]));\n\n case 15:\n case 'end':\n return _context6.stop();\n }\n }\n }, _callee6, this);\n }));\n\n function encrypt(_x11, _x12, _x13) {\n return _ref9.apply(this, arguments);\n }\n\n return encrypt;\n }(),\n\n /**\n * Decrypt ciphertext input.\n * @param {Uint8Array} ciphertext The ciphertext input to be decrypted\n * @param {Uint8Array} nonce The nonce (16 bytes)\n * @param {Uint8Array} adata Associated data to verify\n * @returns {Promise<Uint8Array>} The plaintext output\n */\n decrypt: function () {\n var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(ciphertext, nonce, adata) {\n var ciphered, ctTag, _ref13, _ref14, omacNonce, omacAdata, omacCiphered, tag, i, plaintext;\n\n return _regenerator2.default.wrap(function _callee7$(_context7) {\n while (1) {\n switch (_context7.prev = _context7.next) {\n case 0:\n if (!(ciphertext.length < tagLength)) {\n _context7.next = 2;\n break;\n }\n\n throw new Error('Invalid EAX ciphertext');\n\n case 2:\n ciphered = ciphertext.subarray(0, -tagLength);\n ctTag = ciphertext.subarray(-tagLength);\n _context7.next = 6;\n return _promise2.default.all([omac(zero, nonce), omac(one, adata), omac(two, ciphered)]);\n\n case 6:\n _ref13 = _context7.sent;\n _ref14 = (0, _slicedToArray3.default)(_ref13, 3);\n omacNonce = _ref14[0];\n omacAdata = _ref14[1];\n omacCiphered = _ref14[2];\n tag = omacCiphered; // Assumes that omac(*).length === tagLength.\n\n for (i = 0; i < tagLength; i++) {\n tag[i] ^= omacAdata[i] ^ omacNonce[i];\n }\n\n if (_util2.default.equalsUint8Array(ctTag, tag)) {\n _context7.next = 15;\n break;\n }\n\n throw new Error('Authentication tag mismatch');\n\n case 15:\n _context7.next = 17;\n return ctr(ciphered, omacNonce);\n\n case 17:\n plaintext = _context7.sent;\n return _context7.abrupt('return', plaintext);\n\n case 19:\n case 'end':\n return _context7.stop();\n }\n }\n }, _callee7, this);\n }));\n\n function decrypt(_x14, _x15, _x16) {\n return _ref12.apply(this, arguments);\n }\n\n return decrypt;\n }()\n });\n\n case 9:\n case 'end':\n return _context8.stop();\n }\n }\n }, _callee8, this);\n }));\n\n return function EAX(_x9, _x10) {\n return _ref6.apply(this, arguments);\n };\n}();\n\n/**\n * Get EAX nonce as defined by {@link https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-04#section-5.16.1|RFC4880bis-04, section 5.16.1}.\n * @param {Uint8Array} iv The initialization vector (16 bytes)\n * @param {Uint8Array} chunkIndex The chunk index (8 bytes)\n */\n\n\nvar _exports = _dereq_('asmcrypto.js/src/aes/ctr/exports');\n\nvar _cmac = _dereq_('./cmac');\n\nvar _cmac2 = _interopRequireDefault(_cmac);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar webCrypto = _util2.default.getWebCrypto(); // OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2018 ProtonTech AG\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview This module implements AES-EAX en/decryption on top of\n * native AES-CTR using either the WebCrypto API or Node.js' crypto API.\n * @requires asmcrypto.js\n * @requires crypto/cmac\n * @requires util\n * @module crypto/eax\n */\n\nvar nodeCrypto = _util2.default.getNodeCrypto();\nvar Buffer = _util2.default.getNodeBuffer();\n\nvar blockLength = 16;\nvar ivLength = blockLength;\nvar tagLength = blockLength;\n\nvar zero = new Uint8Array(blockLength);\nvar one = new Uint8Array(blockLength);one[blockLength - 1] = 1;\nvar two = new Uint8Array(blockLength);two[blockLength - 1] = 2;\n\nEAX.getNonce = function (iv, chunkIndex) {\n var nonce = iv.slice();\n for (var i = 0; i < chunkIndex.length; i++) {\n nonce[8 + i] ^= chunkIndex[i];\n }\n return nonce;\n};\n\nEAX.blockLength = blockLength;\nEAX.ivLength = ivLength;\nEAX.tagLength = tagLength;\n\nexports.default = EAX;\n\n},{\"../util\":398,\"./cmac\":334,\"asmcrypto.js/src/aes/ctr/exports\":9,\"babel-runtime/core-js/promise\":32,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/helpers/slicedToArray\":40,\"babel-runtime/regenerator\":42}],337:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * Class to en/decrypt using GCM mode.\n * @param {String} cipher The symmetric cipher algorithm to use e.g. 'aes128'\n * @param {Uint8Array} key The encryption key\n */\nvar GCM = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(cipher, key) {\n var _key;\n\n return _regenerator2.default.wrap(function _callee7$(_context7) {\n while (1) {\n switch (_context7.prev = _context7.next) {\n case 0:\n if (!(cipher.substr(0, 3) !== 'aes')) {\n _context7.next = 2;\n break;\n }\n\n throw new Error('GCM mode supports only AES cipher');\n\n case 2:\n if (!(_util2.default.getWebCrypto() && key.length !== 24)) {\n _context7.next = 7;\n break;\n }\n\n _context7.next = 5;\n return webCrypto.importKey('raw', key, { name: ALGO }, false, ['encrypt', 'decrypt']);\n\n case 5:\n _key = _context7.sent;\n return _context7.abrupt('return', {\n encrypt: function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(pt, iv) {\n var adata = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Uint8Array();\n var ct;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (pt.length) {\n _context.next = 2;\n break;\n }\n\n return _context.abrupt('return', _exports.AES_GCM.encrypt(pt, key, iv, adata));\n\n case 2:\n _context.next = 4;\n return webCrypto.encrypt({ name: ALGO, iv: iv, additionalData: adata }, _key, pt);\n\n case 4:\n ct = _context.sent;\n return _context.abrupt('return', new Uint8Array(ct));\n\n case 6:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function encrypt(_x3, _x4) {\n return _ref2.apply(this, arguments);\n }\n\n return encrypt;\n }(),\n\n decrypt: function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(ct, iv) {\n var adata = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Uint8Array();\n var pt;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!(ct.length === tagLength)) {\n _context2.next = 2;\n break;\n }\n\n return _context2.abrupt('return', _exports.AES_GCM.decrypt(ct, key, iv, adata));\n\n case 2:\n _context2.next = 4;\n return webCrypto.decrypt({ name: ALGO, iv: iv, additionalData: adata }, _key, ct);\n\n case 4:\n pt = _context2.sent;\n return _context2.abrupt('return', new Uint8Array(pt));\n\n case 6:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function decrypt(_x6, _x7) {\n return _ref3.apply(this, arguments);\n }\n\n return decrypt;\n }()\n });\n\n case 7:\n if (!_util2.default.getNodeCrypto()) {\n _context7.next = 10;\n break;\n }\n\n // Node crypto library\n key = new Buffer(key);\n\n return _context7.abrupt('return', {\n encrypt: function () {\n var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(pt, iv) {\n var adata = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Uint8Array();\n var en, ct;\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n pt = new Buffer(pt);\n iv = new Buffer(iv);\n adata = new Buffer(adata);\n en = new nodeCrypto.createCipheriv('aes-' + key.length * 8 + '-gcm', key, iv);\n\n en.setAAD(adata);\n ct = Buffer.concat([en.update(pt), en.final(), en.getAuthTag()]); // append auth tag to ciphertext\n\n return _context3.abrupt('return', new Uint8Array(ct));\n\n case 7:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n function encrypt(_x9, _x10) {\n return _ref4.apply(this, arguments);\n }\n\n return encrypt;\n }(),\n\n decrypt: function () {\n var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(ct, iv) {\n var adata = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Uint8Array();\n var de, pt;\n return _regenerator2.default.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n ct = new Buffer(ct);\n iv = new Buffer(iv);\n adata = new Buffer(adata);\n de = new nodeCrypto.createDecipheriv('aes-' + key.length * 8 + '-gcm', key, iv);\n\n de.setAAD(adata);\n de.setAuthTag(ct.slice(ct.length - tagLength, ct.length)); // read auth tag at end of ciphertext\n pt = Buffer.concat([de.update(ct.slice(0, ct.length - tagLength)), de.final()]);\n return _context4.abrupt('return', new Uint8Array(pt));\n\n case 8:\n case 'end':\n return _context4.stop();\n }\n }\n }, _callee4, this);\n }));\n\n function decrypt(_x12, _x13) {\n return _ref5.apply(this, arguments);\n }\n\n return decrypt;\n }()\n });\n\n case 10:\n return _context7.abrupt('return', {\n encrypt: function () {\n var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(pt, iv, adata) {\n return _regenerator2.default.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n return _context5.abrupt('return', _exports.AES_GCM.encrypt(pt, key, iv, adata));\n\n case 1:\n case 'end':\n return _context5.stop();\n }\n }\n }, _callee5, this);\n }));\n\n function encrypt(_x15, _x16, _x17) {\n return _ref6.apply(this, arguments);\n }\n\n return encrypt;\n }(),\n\n decrypt: function () {\n var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(ct, iv, adata) {\n return _regenerator2.default.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n return _context6.abrupt('return', _exports.AES_GCM.decrypt(ct, key, iv, adata));\n\n case 1:\n case 'end':\n return _context6.stop();\n }\n }\n }, _callee6, this);\n }));\n\n function decrypt(_x18, _x19, _x20) {\n return _ref7.apply(this, arguments);\n }\n\n return decrypt;\n }()\n });\n\n case 11:\n case 'end':\n return _context7.stop();\n }\n }\n }, _callee7, this);\n }));\n\n return function GCM(_x, _x2) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Get GCM nonce. Note: this operation is not defined by the standard.\n * A future version of the standard may define GCM mode differently,\n * hopefully under a different ID (we use Private/Experimental algorithm\n * ID 100) so that we can maintain backwards compatibility.\n * @param {Uint8Array} iv The initialization vector (12 bytes)\n * @param {Uint8Array} chunkIndex The chunk index (8 bytes)\n */\n\n\nvar _exports = _dereq_('asmcrypto.js/src/aes/gcm/exports');\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2016 Tankred Hase\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview This module wraps native AES-GCM en/decryption for both\n * the WebCrypto api as well as node.js' crypto api.\n * @requires asmcrypto.js\n * @requires util\n * @module crypto/gcm\n */\n\nvar webCrypto = _util2.default.getWebCrypto(); // no GCM support in IE11, Safari 9\nvar nodeCrypto = _util2.default.getNodeCrypto();\nvar Buffer = _util2.default.getNodeBuffer();\n\nvar blockLength = 16;\nvar ivLength = 12; // size of the IV in bytes\nvar tagLength = 16; // size of the tag in bytes\nvar ALGO = 'AES-GCM';GCM.getNonce = function (iv, chunkIndex) {\n var nonce = iv.slice();\n for (var i = 0; i < chunkIndex.length; i++) {\n nonce[4 + i] ^= chunkIndex[i];\n }\n return nonce;\n};\n\nGCM.blockLength = blockLength;\nGCM.ivLength = ivLength;\nGCM.tagLength = tagLength;\n\nexports.default = GCM;\n\n},{\"../util\":398,\"asmcrypto.js/src/aes/gcm/exports\":12,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],338:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rusha = _dereq_('rusha');\n\nvar _rusha2 = _interopRequireDefault(_rusha);\n\nvar _exports = _dereq_('asmcrypto.js/src/hash/sha256/exports');\n\nvar _ = _dereq_('hash.js/lib/hash/sha/224');\n\nvar _2 = _interopRequireDefault(_);\n\nvar _3 = _dereq_('hash.js/lib/hash/sha/384');\n\nvar _4 = _interopRequireDefault(_3);\n\nvar _5 = _dereq_('hash.js/lib/hash/sha/512');\n\nvar _6 = _interopRequireDefault(_5);\n\nvar _ripemd = _dereq_('hash.js/lib/hash/ripemd');\n\nvar _md = _dereq_('./md5');\n\nvar _md2 = _interopRequireDefault(_md);\n\nvar _util = _dereq_('../../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @fileoverview Provides an interface to hashing functions available in Node.js or external libraries.\n * @see {@link https://github.com/srijs/rusha|Rusha}\n * @see {@link https://github.com/asmcrypto/asmcrypto.js|asmCrypto}\n * @see {@link https://github.com/indutny/hash.js|hash.js}\n * @requires rusha\n * @requires asmcrypto.js\n * @requires hash.js\n * @requires crypto/hash/md5\n * @requires util\n * @module crypto/hash\n */\n\nvar rusha = new _rusha2.default();\nvar nodeCrypto = _util2.default.getNodeCrypto();\nvar Buffer = _util2.default.getNodeBuffer();\n\nfunction node_hash(type) {\n return function (data) {\n var shasum = nodeCrypto.createHash(type);\n shasum.update(new Buffer(data));\n return new Uint8Array(shasum.digest());\n };\n}\n\nfunction hashjs_hash(hash) {\n return function (data) {\n return _util2.default.hex_to_Uint8Array(hash().update(data).digest('hex'));\n };\n}\n\nvar hash_fns = void 0;\nif (nodeCrypto) {\n // Use Node native crypto for all hash functions\n hash_fns = {\n md5: node_hash('md5'),\n sha1: node_hash('sha1'),\n sha224: node_hash('sha224'),\n sha256: node_hash('sha256'),\n sha384: node_hash('sha384'),\n sha512: node_hash('sha512'),\n ripemd: node_hash('ripemd160')\n };\n} else {\n // Use JS fallbacks\n hash_fns = {\n md5: _md2.default,\n sha1: function sha1(data) {\n return _util2.default.hex_to_Uint8Array(rusha.digest(data));\n },\n sha224: hashjs_hash(_2.default),\n sha256: _exports.SHA256.bytes,\n sha384: hashjs_hash(_4.default),\n // TODO, benchmark this vs asmCrypto's SHA512\n sha512: hashjs_hash(_6.default),\n ripemd: hashjs_hash(_ripemd.ripemd160)\n };\n}\n\nexports.default = {\n\n /** @see module:md5 */\n md5: hash_fns.md5,\n /** @see rusha */\n sha1: hash_fns.sha1,\n /** @see hash.js */\n sha224: hash_fns.sha224,\n /** @see asmCrypto */\n sha256: hash_fns.sha256,\n /** @see hash.js */\n sha384: hash_fns.sha384,\n /** @see hash.js */\n sha512: hash_fns.sha512,\n /** @see hash.js */\n ripemd: hash_fns.ripemd,\n\n /**\n * Create a hash on the specified data using the specified algorithm\n * @param {module:enums.hash} algo Hash algorithm type (see {@link https://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4})\n * @param {Uint8Array} data Data to be hashed\n * @returns {Uint8Array} hash value\n */\n digest: function digest(algo, data) {\n switch (algo) {\n case 1:\n // - MD5 [HAC]\n return this.md5(data);\n case 2:\n // - SHA-1 [FIPS180]\n return this.sha1(data);\n case 3:\n // - RIPE-MD/160 [HAC]\n return this.ripemd(data);\n case 8:\n // - SHA256 [FIPS180]\n return this.sha256(data);\n case 9:\n // - SHA384 [FIPS180]\n return this.sha384(data);\n case 10:\n // - SHA512 [FIPS180]\n return this.sha512(data);\n case 11:\n // - SHA224 [FIPS180]\n return this.sha224(data);\n default:\n throw new Error('Invalid hash function.');\n }\n },\n\n /**\n * Returns the hash size in bytes of the specified hash algorithm type\n * @param {module:enums.hash} algo Hash algorithm type (See {@link https://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4})\n * @returns {Integer} Size in bytes of the resulting hash\n */\n getHashByteLength: function getHashByteLength(algo) {\n switch (algo) {\n case 1:\n // - MD5 [HAC]\n return 16;\n case 2: // - SHA-1 [FIPS180]\n case 3:\n // - RIPE-MD/160 [HAC]\n return 20;\n case 8:\n // - SHA256 [FIPS180]\n return 32;\n case 9:\n // - SHA384 [FIPS180]\n return 48;\n case 10:\n // - SHA512 [FIPS180]\n return 64;\n case 11:\n // - SHA224 [FIPS180]\n return 28;\n default:\n throw new Error('Invalid hash algorithm.');\n }\n }\n};\n\n},{\"../../util\":398,\"./md5\":339,\"asmcrypto.js/src/hash/sha256/exports\":16,\"hash.js/lib/hash/ripemd\":287,\"hash.js/lib/hash/sha/224\":290,\"hash.js/lib/hash/sha/384\":292,\"hash.js/lib/hash/sha/512\":293,\"rusha\":320}],339:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _util = _dereq_('../../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// MD5 Digest\nfunction md5(entree) {\n var digest = md51(_util2.default.Uint8Array_to_str(entree));\n return _util2.default.hex_to_Uint8Array(hex(digest));\n} /**\n * A fast MD5 JavaScript implementation\n * Copyright (c) 2012 Joseph Myers\n * http://www.myersdaily.org/joseph/javascript/md5-text.html\n *\n * Permission to use, copy, modify, and distribute this software\n * and its documentation for any purposes and without\n * fee is hereby granted provided that this copyright notice\n * appears in all copies.\n *\n * Of course, this soft is provided \"as is\" without express or implied\n * warranty of any kind.\n */\n\n/**\n * @requires util\n */\n\nfunction md5cycle(x, k) {\n var a = x[0];\n var b = x[1];\n var c = x[2];\n var d = x[3];\n\n a = ff(a, b, c, d, k[0], 7, -680876936);\n d = ff(d, a, b, c, k[1], 12, -389564586);\n c = ff(c, d, a, b, k[2], 17, 606105819);\n b = ff(b, c, d, a, k[3], 22, -1044525330);\n a = ff(a, b, c, d, k[4], 7, -176418897);\n d = ff(d, a, b, c, k[5], 12, 1200080426);\n c = ff(c, d, a, b, k[6], 17, -1473231341);\n b = ff(b, c, d, a, k[7], 22, -45705983);\n a = ff(a, b, c, d, k[8], 7, 1770035416);\n d = ff(d, a, b, c, k[9], 12, -1958414417);\n c = ff(c, d, a, b, k[10], 17, -42063);\n b = ff(b, c, d, a, k[11], 22, -1990404162);\n a = ff(a, b, c, d, k[12], 7, 1804603682);\n d = ff(d, a, b, c, k[13], 12, -40341101);\n c = ff(c, d, a, b, k[14], 17, -1502002290);\n b = ff(b, c, d, a, k[15], 22, 1236535329);\n\n a = gg(a, b, c, d, k[1], 5, -165796510);\n d = gg(d, a, b, c, k[6], 9, -1069501632);\n c = gg(c, d, a, b, k[11], 14, 643717713);\n b = gg(b, c, d, a, k[0], 20, -373897302);\n a = gg(a, b, c, d, k[5], 5, -701558691);\n d = gg(d, a, b, c, k[10], 9, 38016083);\n c = gg(c, d, a, b, k[15], 14, -660478335);\n b = gg(b, c, d, a, k[4], 20, -405537848);\n a = gg(a, b, c, d, k[9], 5, 568446438);\n d = gg(d, a, b, c, k[14], 9, -1019803690);\n c = gg(c, d, a, b, k[3], 14, -187363961);\n b = gg(b, c, d, a, k[8], 20, 1163531501);\n a = gg(a, b, c, d, k[13], 5, -1444681467);\n d = gg(d, a, b, c, k[2], 9, -51403784);\n c = gg(c, d, a, b, k[7], 14, 1735328473);\n b = gg(b, c, d, a, k[12], 20, -1926607734);\n\n a = hh(a, b, c, d, k[5], 4, -378558);\n d = hh(d, a, b, c, k[8], 11, -2022574463);\n c = hh(c, d, a, b, k[11], 16, 1839030562);\n b = hh(b, c, d, a, k[14], 23, -35309556);\n a = hh(a, b, c, d, k[1], 4, -1530992060);\n d = hh(d, a, b, c, k[4], 11, 1272893353);\n c = hh(c, d, a, b, k[7], 16, -155497632);\n b = hh(b, c, d, a, k[10], 23, -1094730640);\n a = hh(a, b, c, d, k[13], 4, 681279174);\n d = hh(d, a, b, c, k[0], 11, -358537222);\n c = hh(c, d, a, b, k[3], 16, -722521979);\n b = hh(b, c, d, a, k[6], 23, 76029189);\n a = hh(a, b, c, d, k[9], 4, -640364487);\n d = hh(d, a, b, c, k[12], 11, -421815835);\n c = hh(c, d, a, b, k[15], 16, 530742520);\n b = hh(b, c, d, a, k[2], 23, -995338651);\n\n a = ii(a, b, c, d, k[0], 6, -198630844);\n d = ii(d, a, b, c, k[7], 10, 1126891415);\n c = ii(c, d, a, b, k[14], 15, -1416354905);\n b = ii(b, c, d, a, k[5], 21, -57434055);\n a = ii(a, b, c, d, k[12], 6, 1700485571);\n d = ii(d, a, b, c, k[3], 10, -1894986606);\n c = ii(c, d, a, b, k[10], 15, -1051523);\n b = ii(b, c, d, a, k[1], 21, -2054922799);\n a = ii(a, b, c, d, k[8], 6, 1873313359);\n d = ii(d, a, b, c, k[15], 10, -30611744);\n c = ii(c, d, a, b, k[6], 15, -1560198380);\n b = ii(b, c, d, a, k[13], 21, 1309151649);\n a = ii(a, b, c, d, k[4], 6, -145523070);\n d = ii(d, a, b, c, k[11], 10, -1120210379);\n c = ii(c, d, a, b, k[2], 15, 718787259);\n b = ii(b, c, d, a, k[9], 21, -343485551);\n\n x[0] = add32(a, x[0]);\n x[1] = add32(b, x[1]);\n x[2] = add32(c, x[2]);\n x[3] = add32(d, x[3]);\n}\n\nfunction cmn(q, a, b, x, s, t) {\n a = add32(add32(a, q), add32(x, t));\n return add32(a << s | a >>> 32 - s, b);\n}\n\nfunction ff(a, b, c, d, x, s, t) {\n return cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction gg(a, b, c, d, x, s, t) {\n return cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction hh(a, b, c, d, x, s, t) {\n return cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction ii(a, b, c, d, x, s, t) {\n return cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nfunction md51(s) {\n var n = s.length;\n var state = [1732584193, -271733879, -1732584194, 271733878];\n var i = void 0;\n for (i = 64; i <= s.length; i += 64) {\n md5cycle(state, md5blk(s.substring(i - 64, i)));\n }\n s = s.substring(i - 64);\n var tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n for (i = 0; i < s.length; i++) {\n tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3);\n }\n tail[i >> 2] |= 0x80 << (i % 4 << 3);\n if (i > 55) {\n md5cycle(state, tail);\n for (i = 0; i < 16; i++) {\n tail[i] = 0;\n }\n }\n tail[14] = n * 8;\n md5cycle(state, tail);\n return state;\n}\n\n/* there needs to be support for Unicode here,\n * unless we pretend that we can redefine the MD-5\n * algorithm for multi-byte characters (perhaps\n * by adding every four 16-bit characters and\n * shortening the sum to 32 bits). Otherwise\n * I suggest performing MD-5 as if every character\n * was two bytes--e.g., 0040 0025 = @%--but then\n * how will an ordinary MD-5 sum be matched?\n * There is no way to standardize text to something\n * like UTF-8 before transformation; speed cost is\n * utterly prohibitive. The JavaScript standard\n * itself needs to look at this: it should start\n * providing access to strings as preformed UTF-8\n * 8-bit unsigned value arrays.\n */\nfunction md5blk(s) {\n /* I figured global was faster. */\n var md5blks = [];\n var i = void 0; /* Andy King said do it this way. */\n for (i = 0; i < 64; i += 4) {\n md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);\n }\n return md5blks;\n}\n\nvar hex_chr = '0123456789abcdef'.split('');\n\nfunction rhex(n) {\n var s = '';\n var j = 0;\n for (; j < 4; j++) {\n s += hex_chr[n >> j * 8 + 4 & 0x0F] + hex_chr[n >> j * 8 & 0x0F];\n }\n return s;\n}\n\nfunction hex(x) {\n for (var i = 0; i < x.length; i++) {\n x[i] = rhex(x[i]);\n }\n return x.join('');\n}\n\n/* this function is much faster,\nso if possible we use it. Some IEs\nare the only ones I know of that\nneed the idiotic second function,\ngenerated by an if clause. */\n\nfunction add32(a, b) {\n return a + b & 0xFFFFFFFF;\n}\n\nexports.default = md5;\n\n},{\"../../util\":398}],340:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _assign = _dereq_('babel-runtime/core-js/object/assign');\n\nvar _assign2 = _interopRequireDefault(_assign);\n\nvar _cipher = _dereq_('./cipher');\n\nvar _cipher2 = _interopRequireDefault(_cipher);\n\nvar _hash = _dereq_('./hash');\n\nvar _hash2 = _interopRequireDefault(_hash);\n\nvar _cfb = _dereq_('./cfb');\n\nvar _cfb2 = _interopRequireDefault(_cfb);\n\nvar _gcm = _dereq_('./gcm');\n\nvar _gcm2 = _interopRequireDefault(_gcm);\n\nvar _eax = _dereq_('./eax');\n\nvar _eax2 = _interopRequireDefault(_eax);\n\nvar _ocb = _dereq_('./ocb');\n\nvar _ocb2 = _interopRequireDefault(_ocb);\n\nvar _public_key = _dereq_('./public_key');\n\nvar _public_key2 = _interopRequireDefault(_public_key);\n\nvar _signature = _dereq_('./signature');\n\nvar _signature2 = _interopRequireDefault(_signature);\n\nvar _random = _dereq_('./random');\n\nvar _random2 = _interopRequireDefault(_random);\n\nvar _pkcs = _dereq_('./pkcs1');\n\nvar _pkcs2 = _interopRequireDefault(_pkcs);\n\nvar _pkcs3 = _dereq_('./pkcs5');\n\nvar _pkcs4 = _interopRequireDefault(_pkcs3);\n\nvar _crypto = _dereq_('./crypto');\n\nvar _crypto2 = _interopRequireDefault(_crypto);\n\nvar _aes_kw = _dereq_('./aes_kw');\n\nvar _aes_kw2 = _interopRequireDefault(_aes_kw);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// TODO move cfb and gcm to cipher\nvar mod = {\n /** @see module:crypto/cipher */\n cipher: _cipher2.default,\n /** @see module:crypto/hash */\n hash: _hash2.default,\n /** @see module:crypto/cfb */\n cfb: _cfb2.default,\n /** @see module:crypto/gcm */\n gcm: _gcm2.default,\n experimental_gcm: _gcm2.default,\n /** @see module:crypto/eax */\n eax: _eax2.default,\n /** @see module:crypto/ocb */\n ocb: _ocb2.default,\n /** @see module:crypto/public_key */\n publicKey: _public_key2.default,\n /** @see module:crypto/signature */\n signature: _signature2.default,\n /** @see module:crypto/random */\n random: _random2.default,\n /** @see module:crypto/pkcs1 */\n pkcs1: _pkcs2.default,\n /** @see module:crypto/pkcs5 */\n pkcs5: _pkcs4.default,\n /** @see module:crypto/aes_kw */\n aes_kw: _aes_kw2.default\n}; /**\n * @fileoverview Provides access to all cryptographic primitives used in OpenPGP.js\n * @see module:crypto/crypto\n * @see module:crypto/signature\n * @see module:crypto/public_key\n * @see module:crypto/cipher\n * @see module:crypto/random\n * @see module:crypto/hash\n * @module crypto\n */\n\n(0, _assign2.default)(mod, _crypto2.default);\n\nexports.default = mod;\n\n},{\"./aes_kw\":326,\"./cfb\":327,\"./cipher\":332,\"./crypto\":335,\"./eax\":336,\"./gcm\":337,\"./hash\":338,\"./ocb\":341,\"./pkcs1\":342,\"./pkcs5\":343,\"./public_key\":352,\"./random\":355,\"./signature\":356,\"babel-runtime/core-js/object/assign\":24}],341:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * Class to en/decrypt using OCB mode.\n * @param {String} cipher The symmetric cipher algorithm to use e.g. 'aes128'\n * @param {Uint8Array} key The encryption key\n */\nvar OCB = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(cipher, key) {\n var maxNtz, encipher, decipher, mask, constructKeyVariables, extendKeyVariables, hash, crypt;\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n crypt = function crypt(fn, text, nonce, adata) {\n //\n // Consider P as a sequence of 128-bit blocks\n //\n var m = text.length / blockLength | 0;\n\n //\n // Key-dependent variables\n //\n extendKeyVariables(text, adata);\n\n //\n // Nonce-dependent and per-encryption variables\n //\n // Nonce = num2str(TAGLEN mod 128,7) || zeros(120-bitlen(N)) || 1 || N\n // Note: We assume here that tagLength mod 16 == 0.\n var paddedNonce = _util2.default.concatUint8Array([zeroBlock.subarray(0, ivLength - nonce.length), one, nonce]);\n // bottom = str2num(Nonce[123..128])\n var bottom = paddedNonce[blockLength - 1] & 63;\n // Ktop = ENCIPHER(K, Nonce[1..122] || zeros(6))\n paddedNonce[blockLength - 1] &= 192;\n var kTop = encipher(paddedNonce);\n // Stretch = Ktop || (Ktop[1..64] xor Ktop[9..72])\n var stretched = _util2.default.concatUint8Array([kTop, xor(kTop.subarray(0, 8), kTop.subarray(1, 9))]);\n // Offset_0 = Stretch[1+bottom..128+bottom]\n var offset = _util2.default.shiftRight(stretched.subarray(0 + (bottom >> 3), 17 + (bottom >> 3)), 8 - (bottom & 7)).subarray(1);\n // Checksum_0 = zeros(128)\n var checksum = new Uint8Array(blockLength);\n\n var ct = new Uint8Array(text.length + tagLength);\n\n //\n // Process any whole blocks\n //\n var i = void 0;\n var pos = 0;\n for (i = 0; i < m; i++) {\n // Offset_i = Offset_{i-1} xor L_{ntz(i)}\n xorMut(offset, mask[ntz(i + 1)]);\n // C_i = Offset_i xor ENCIPHER(K, P_i xor Offset_i)\n // P_i = Offset_i xor DECIPHER(K, C_i xor Offset_i)\n ct.set(xorMut(fn(xor(offset, text)), offset), pos);\n // Checksum_i = Checksum_{i-1} xor P_i\n xorMut(checksum, fn === encipher ? text : ct.subarray(pos));\n\n text = text.subarray(blockLength);\n pos += blockLength;\n }\n\n //\n // Process any final partial block and compute raw tag\n //\n if (text.length) {\n // Offset_* = Offset_m xor L_*\n xorMut(offset, mask.x);\n // Pad = ENCIPHER(K, Offset_*)\n var padding = encipher(offset);\n // C_* = P_* xor Pad[1..bitlen(P_*)]\n ct.set(xor(text, padding), pos);\n\n // Checksum_* = Checksum_m xor (P_* || 1 || new Uint8Array(127-bitlen(P_*)))\n var xorInput = new Uint8Array(blockLength);\n xorInput.set(fn === encipher ? text : ct.subarray(pos, -tagLength), 0);\n xorInput[text.length] = 128;\n xorMut(checksum, xorInput);\n pos += text.length;\n }\n // Tag = ENCIPHER(K, Checksum_* xor Offset_* xor L_$) xor HASH(K,A)\n var tag = xorMut(encipher(xorMut(xorMut(checksum, offset), mask.$)), hash(adata));\n\n //\n // Assemble ciphertext\n //\n // C = C_1 || C_2 || ... || C_m || C_* || Tag[1..TAGLEN]\n ct.set(tag, pos);\n return ct;\n };\n\n hash = function hash(adata) {\n if (!adata.length) {\n // Fast path\n return zeroBlock;\n }\n\n //\n // Consider A as a sequence of 128-bit blocks\n //\n var m = adata.length / blockLength | 0;\n\n var offset = new Uint8Array(blockLength);\n var sum = new Uint8Array(blockLength);\n for (var i = 0; i < m; i++) {\n xorMut(offset, mask[ntz(i + 1)]);\n xorMut(sum, encipher(xor(offset, adata)));\n adata = adata.subarray(blockLength);\n }\n\n //\n // Process any final partial block; compute final hash value\n //\n if (adata.length) {\n xorMut(offset, mask.x);\n\n var cipherInput = new Uint8Array(blockLength);\n cipherInput.set(adata, 0);\n cipherInput[adata.length] = 128;\n xorMut(cipherInput, offset);\n\n xorMut(sum, encipher(cipherInput));\n }\n\n return sum;\n };\n\n extendKeyVariables = function extendKeyVariables(text, adata) {\n var newMaxNtz = _util2.default.nbits(Math.max(text.length, adata.length) / blockLength | 0) - 1;\n for (var i = maxNtz + 1; i <= newMaxNtz; i++) {\n mask[i] = _util2.default.double(mask[i - 1]);\n }\n maxNtz = newMaxNtz;\n };\n\n constructKeyVariables = function constructKeyVariables(cipher, key) {\n var aes = new _cipher2.default[cipher](key);\n encipher = aes.encrypt.bind(aes);\n decipher = aes.decrypt.bind(aes);\n\n var mask_x = encipher(zeroBlock);\n var mask_$ = _util2.default.double(mask_x);\n mask = [];\n mask[0] = _util2.default.double(mask_$);\n\n mask.x = mask_x;\n mask.$ = mask_$;\n };\n\n maxNtz = 0;\n encipher = void 0;\n decipher = void 0;\n mask = void 0;\n\n\n constructKeyVariables(cipher, key);\n\n /**\n * Encrypt/decrypt data.\n * @param {encipher|decipher} fn Encryption/decryption block cipher function\n * @param {Uint8Array} text The cleartext or ciphertext (without tag) input\n * @param {Uint8Array} nonce The nonce (15 bytes)\n * @param {Uint8Array} adata Associated data to sign\n * @returns {Promise<Uint8Array>} The ciphertext or plaintext output, with tag appended in both cases\n */\n return _context3.abrupt('return', {\n /**\n * Encrypt plaintext input.\n * @param {Uint8Array} plaintext The cleartext input to be encrypted\n * @param {Uint8Array} nonce The nonce (15 bytes)\n * @param {Uint8Array} adata Associated data to sign\n * @returns {Promise<Uint8Array>} The ciphertext output\n */\n encrypt: function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(plaintext, nonce, adata) {\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n return _context.abrupt('return', crypt(encipher, plaintext, nonce, adata));\n\n case 1:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function encrypt(_x3, _x4, _x5) {\n return _ref2.apply(this, arguments);\n }\n\n return encrypt;\n }(),\n\n /**\n * Decrypt ciphertext input.\n * @param {Uint8Array} ciphertext The ciphertext input to be decrypted\n * @param {Uint8Array} nonce The nonce (15 bytes)\n * @param {Uint8Array} adata Associated data to sign\n * @returns {Promise<Uint8Array>} The ciphertext output\n */\n decrypt: function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(ciphertext, nonce, adata) {\n var tag, crypted;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!(ciphertext.length < tagLength)) {\n _context2.next = 2;\n break;\n }\n\n throw new Error('Invalid OCB ciphertext');\n\n case 2:\n tag = ciphertext.subarray(-tagLength);\n\n ciphertext = ciphertext.subarray(0, -tagLength);\n\n crypted = crypt(decipher, ciphertext, nonce, adata);\n // if (Tag[1..TAGLEN] == T)\n\n if (!_util2.default.equalsUint8Array(tag, crypted.subarray(-tagLength))) {\n _context2.next = 7;\n break;\n }\n\n return _context2.abrupt('return', crypted.subarray(0, -tagLength));\n\n case 7:\n throw new Error('Authentication tag mismatch');\n\n case 8:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function decrypt(_x6, _x7, _x8) {\n return _ref3.apply(this, arguments);\n }\n\n return decrypt;\n }()\n });\n\n case 10:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n return function OCB(_x, _x2) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Get OCB nonce as defined by {@link https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-04#section-5.16.2|RFC4880bis-04, section 5.16.2}.\n * @param {Uint8Array} iv The initialization vector (15 bytes)\n * @param {Uint8Array} chunkIndex The chunk index (8 bytes)\n */\n\n\nvar _cipher = _dereq_('./cipher');\n\nvar _cipher2 = _interopRequireDefault(_cipher);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2018 ProtonTech AG\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview This module implements AES-OCB en/decryption.\n * @requires crypto/cipher\n * @requires util\n * @module crypto/ocb\n */\n\nvar blockLength = 16;\nvar ivLength = 15;\n\n// https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-04#section-5.16.2:\n// While OCB [RFC7253] allows the authentication tag length to be of any\n// number up to 128 bits long, this document requires a fixed\n// authentication tag length of 128 bits (16 octets) for simplicity.\nvar tagLength = 16;\n\nfunction ntz(n) {\n var ntz = 0;\n for (var i = 1; (n & i) === 0; i <<= 1) {\n ntz++;\n }\n return ntz;\n}\n\nfunction xorMut(S, T) {\n for (var i = 0; i < S.length; i++) {\n S[i] ^= T[i];\n }\n return S;\n}\n\nfunction xor(S, T) {\n return xorMut(S.slice(), T);\n}\n\nvar zeroBlock = new Uint8Array(blockLength);\nvar one = new Uint8Array([1]);OCB.getNonce = function (iv, chunkIndex) {\n var nonce = iv.slice();\n for (var i = 0; i < chunkIndex.length; i++) {\n nonce[7 + i] ^= chunkIndex[i];\n }\n return nonce;\n};\n\nOCB.blockLength = blockLength;\nOCB.ivLength = ivLength;\nOCB.tagLength = tagLength;\n\nexports.default = OCB;\n\n},{\"../util\":398,\"./cipher\":332,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],342:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * Create padding with secure random data\n * @private\n * @param {Integer} length Length of the padding in bytes\n * @returns {String} Padding as string\n * @async\n */\nvar getPkcs1Padding = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(length) {\n var result, randomBytes, i;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n result = '';\n\n case 1:\n if (!(result.length < length)) {\n _context.next = 8;\n break;\n }\n\n _context.next = 4;\n return _random2.default.getRandomBytes(length - result.length);\n\n case 4:\n randomBytes = _context.sent;\n\n for (i = 0; i < randomBytes.length; i++) {\n if (randomBytes[i] !== 0) {\n result += String.fromCharCode(randomBytes[i]);\n }\n }\n _context.next = 1;\n break;\n\n case 8:\n return _context.abrupt('return', result);\n\n case 9:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function getPkcs1Padding(_x) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Create a EME-PKCS1-v1_5 padded message\n * @see {@link https://tools.ietf.org/html/rfc4880#section-13.1.1|RFC 4880 13.1.1}\n * @param {String} M message to be encoded\n * @param {Integer} k the length in octets of the key modulus\n * @returns {Promise<String>} EME-PKCS1 padded message\n * @async\n */\n\n\nvar _random = _dereq_('./random');\n\nvar _random2 = _interopRequireDefault(_random);\n\nvar _hash = _dereq_('./hash');\n\nvar _hash2 = _interopRequireDefault(_hash);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @namespace */\nvar eme = {};\n/** @namespace */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview Provides EME-PKCS1-v1_5 encoding and decoding and EMSA-PKCS1-v1_5 encoding function\n * @see module:crypto/public_key/rsa\n * @see module:crypto/public_key/elliptic/ecdh\n * @see module:packet.PublicKeyEncryptedSessionKey\n * @requires crypto/random\n * @requires crypto/hash\n * @requires util\n * @module crypto/pkcs1\n */\n\nvar emsa = {};\n\n/**\n * ASN1 object identifiers for hashes\n * @see {@link https://tools.ietf.org/html/rfc4880#section-5.2.2}\n */\nvar hash_headers = [];\nhash_headers[1] = [0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10];\nhash_headers[2] = [0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14];\nhash_headers[3] = [0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x24, 0x03, 0x02, 0x01, 0x05, 0x00, 0x04, 0x14];\nhash_headers[8] = [0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20];\nhash_headers[9] = [0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30];\nhash_headers[10] = [0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40];\nhash_headers[11] = [0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, 0x00, 0x04, 0x1C];eme.encode = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(M, k) {\n var mLen, PS;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n mLen = M.length;\n // length checking\n\n if (!(mLen > k - 11)) {\n _context2.next = 3;\n break;\n }\n\n throw new Error('Message too long');\n\n case 3:\n _context2.next = 5;\n return getPkcs1Padding(k - mLen - 3);\n\n case 5:\n PS = _context2.sent;\n return _context2.abrupt('return', String.fromCharCode(0) + String.fromCharCode(2) + PS + String.fromCharCode(0) + M);\n\n case 7:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function (_x2, _x3) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n/**\n * Decode a EME-PKCS1-v1_5 padded message\n * @see {@link https://tools.ietf.org/html/rfc4880#section-13.1.2|RFC 4880 13.1.2}\n * @param {String} EM encoded message, an octet string\n * @returns {String} message, an octet string\n */\neme.decode = function (EM) {\n // leading zeros truncated by bn.js\n if (EM.charCodeAt(0) !== 0) {\n EM = String.fromCharCode(0) + EM;\n }\n var firstOct = EM.charCodeAt(0);\n var secondOct = EM.charCodeAt(1);\n var i = 2;\n while (EM.charCodeAt(i) !== 0 && i < EM.length) {\n i++;\n }\n var psLen = i - 2;\n var separator = EM.charCodeAt(i++);\n if (firstOct === 0 && secondOct === 2 && psLen >= 8 && separator === 0) {\n return EM.substr(i);\n }\n throw new Error('Decryption error');\n};\n\n/**\n * Create a EMSA-PKCS1-v1_5 padded message\n * @see {@link https://tools.ietf.org/html/rfc4880#section-13.1.3|RFC 4880 13.1.3}\n * @param {Integer} algo Hash algorithm type used\n * @param {String} M message to be encoded\n * @param {Integer} emLen intended length in octets of the encoded message\n * @returns {String} encoded message\n */\nemsa.encode = function (algo, M, emLen) {\n var i = void 0;\n // Apply the hash function to the message M to produce a hash value H\n var H = _util2.default.Uint8Array_to_str(_hash2.default.digest(algo, _util2.default.str_to_Uint8Array(M)));\n if (H.length !== _hash2.default.getHashByteLength(algo)) {\n throw new Error('Invalid hash length');\n }\n // produce an ASN.1 DER value for the hash function used.\n // Let T be the full hash prefix\n var T = '';\n for (i = 0; i < hash_headers[algo].length; i++) {\n T += String.fromCharCode(hash_headers[algo][i]);\n }\n // add hash value to prefix\n T += H;\n // and let tLen be the length in octets of T\n var tLen = T.length;\n if (emLen < tLen + 11) {\n throw new Error('Intended encoded message length too short');\n }\n // an octet string PS consisting of emLen - tLen - 3 octets with hexadecimal value 0xFF\n // The length of PS will be at least 8 octets\n var PS = '';\n for (i = 0; i < emLen - tLen - 3; i++) {\n PS += String.fromCharCode(0xff);\n }\n // Concatenate PS, the hash prefix T, and other padding to form the\n // encoded message EM as EM = 0x00 || 0x01 || PS || 0x00 || T.\n var EM = String.fromCharCode(0x00) + String.fromCharCode(0x01) + PS + String.fromCharCode(0x00) + T;\n return _util2.default.str_to_hex(EM);\n};\n\nexports.default = { eme: eme, emsa: emsa };\n\n},{\"../util\":398,\"./hash\":338,\"./random\":355,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],343:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2015-2016 Decentral\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview Functions to add and remove PKCS5 padding\n * @see module:packet.PublicKeyEncryptedSessionKey\n * @module crypto/pkcs5\n */\n\n/**\n * Add pkcs5 padding to a text.\n * @param {String} msg Text to add padding\n * @returns {String} Text with padding added\n */\nfunction encode(msg) {\n var c = 8 - msg.length % 8;\n var padding = String.fromCharCode(c).repeat(c);\n return msg + padding;\n}\n\n/**\n * Remove pkcs5 padding from a string.\n * @param {String} msg Text to remove padding from\n * @returns {String} Text with padding removed\n */\nfunction decode(msg) {\n var len = msg.length;\n if (len > 0) {\n var c = msg.charCodeAt(len - 1);\n if (c >= 1 && c <= 8) {\n var provided = msg.substr(len - c);\n var computed = String.fromCharCode(c).repeat(c);\n if (provided === computed) {\n return msg.substr(0, len - c);\n }\n }\n }\n throw new Error('Invalid padding');\n}\n\nexports.default = { encode: encode, decode: decode };\n\n},{}],344:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _bn = _dereq_('bn.js');\n\nvar _bn2 = _interopRequireDefault(_bn);\n\nvar _hash = _dereq_('../hash');\n\nvar _hash2 = _interopRequireDefault(_hash);\n\nvar _random = _dereq_('../random');\n\nvar _random2 = _interopRequireDefault(_random);\n\nvar _util = _dereq_('../../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview A Digital signature algorithm implementation\n * @requires bn.js\n * @requires crypto/hash\n * @requires crypto/random\n * @requires util\n * @module crypto/public_key/dsa\n */\n\nvar one = new _bn2.default(1);\nvar zero = new _bn2.default(0);\n\n/*\n TODO regarding the hash function, read:\n https://tools.ietf.org/html/rfc4880#section-13.6\n https://tools.ietf.org/html/rfc4880#section-14\n*/\n\nexports.default = {\n /**\n * DSA Sign function\n * @param {Integer} hash_algo\n * @param {String} m\n * @param {BN} g\n * @param {BN} p\n * @param {BN} q\n * @param {BN} x\n * @returns {{ r: BN, s: BN }}\n * @async\n */\n sign: function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(hash_algo, m, g, p, q, x) {\n var k, r, s, t, redp, redq, gred, xred, h;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n k = void 0;\n r = void 0;\n s = void 0;\n t = void 0;\n redp = new _bn2.default.red(p);\n redq = new _bn2.default.red(q);\n gred = g.toRed(redp);\n xred = x.toRed(redq);\n // If the output size of the chosen hash is larger than the number of\n // bits of q, the hash result is truncated to fit by taking the number\n // of leftmost bits equal to the number of bits of q. This (possibly\n // truncated) hash function result is treated as a number and used\n // directly in the DSA signature algorithm.\n\n h = new _bn2.default(_util2.default.getLeftNBits(_hash2.default.digest(hash_algo, m), q.bitLength())).toRed(redq);\n // FIPS-186-4, section 4.6:\n // The values of r and s shall be checked to determine if r = 0 or s = 0.\n // If either r = 0 or s = 0, a new value of k shall be generated, and the\n // signature shall be recalculated. It is extremely unlikely that r = 0\n // or s = 0 if signatures are generated properly.\n\n case 9:\n if (false) {\n _context.next = 23;\n break;\n }\n\n _context.next = 12;\n return _random2.default.getRandomBN(one, q);\n\n case 12:\n k = _context.sent;\n // returns in [1, q-1]\n r = gred.redPow(k).fromRed().toRed(redq); // (g**k mod p) mod q\n\n if (!(zero.cmp(r) === 0)) {\n _context.next = 16;\n break;\n }\n\n return _context.abrupt('continue', 9);\n\n case 16:\n t = h.redAdd(xred.redMul(r)); // H(m) + x*r mod q\n s = k.toRed(redq).redInvm().redMul(t); // k**-1 * (H(m) + x*r) mod q\n\n if (!(zero.cmp(s) === 0)) {\n _context.next = 20;\n break;\n }\n\n return _context.abrupt('continue', 9);\n\n case 20:\n return _context.abrupt('break', 23);\n\n case 23:\n return _context.abrupt('return', { r: r.toArrayLike(Uint8Array),\n s: s.toArrayLike(Uint8Array) });\n\n case 24:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function sign(_x, _x2, _x3, _x4, _x5, _x6) {\n return _ref.apply(this, arguments);\n }\n\n return sign;\n }(),\n\n /**\n * DSA Verify function\n * @param {Integer} hash_algo\n * @param {BN} r\n * @param {BN} s\n * @param {String} m\n * @param {BN} g\n * @param {BN} p\n * @param {BN} q\n * @param {BN} y\n * @returns BN\n * @async\n */\n verify: function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(hash_algo, r, s, m, g, p, q, y) {\n var redp, redq, h, w, u1, u2, t1, t2, v;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!(zero.ucmp(r) >= 0 || r.ucmp(q) >= 0 || zero.ucmp(s) >= 0 || s.ucmp(q) >= 0)) {\n _context2.next = 3;\n break;\n }\n\n _util2.default.print_debug(\"invalid DSA Signature\");\n return _context2.abrupt('return', null);\n\n case 3:\n redp = new _bn2.default.red(p);\n redq = new _bn2.default.red(q);\n h = new _bn2.default(_util2.default.getLeftNBits(_hash2.default.digest(hash_algo, m), q.bitLength()));\n w = s.toRed(redq).redInvm(); // s**-1 mod q\n\n if (!(zero.cmp(w) === 0)) {\n _context2.next = 10;\n break;\n }\n\n _util2.default.print_debug(\"invalid DSA Signature\");\n return _context2.abrupt('return', null);\n\n case 10:\n u1 = h.toRed(redq).redMul(w); // H(m) * w mod q\n\n u2 = r.toRed(redq).redMul(w); // r * w mod q\n\n t1 = g.toRed(redp).redPow(u1.fromRed()); // g**u1 mod p\n\n t2 = y.toRed(redp).redPow(u2.fromRed()); // y**u2 mod p\n\n v = t1.redMul(t2).fromRed().mod(q); // (g**u1 * y**u2 mod p) mod q\n\n return _context2.abrupt('return', v.cmp(r) === 0);\n\n case 16:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function verify(_x7, _x8, _x9, _x10, _x11, _x12, _x13, _x14) {\n return _ref2.apply(this, arguments);\n }\n\n return verify;\n }()\n};\n\n},{\"../../util\":398,\"../hash\":338,\"../random\":355,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42,\"bn.js\":44}],345:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _bn = _dereq_('bn.js');\n\nvar _bn2 = _interopRequireDefault(_bn);\n\nvar _random = _dereq_('../random');\n\nvar _random2 = _interopRequireDefault(_random);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview ElGamal implementation\n * @requires bn.js\n * @requires crypto/random\n * @module crypto/public_key/elgamal\n */\n\nvar zero = new _bn2.default(0);\n\nexports.default = {\n /**\n * ElGamal Encryption function\n * @param {BN} m\n * @param {BN} p\n * @param {BN} g\n * @param {BN} y\n * @returns {{ c1: BN, c2: BN }}\n * @async\n */\n encrypt: function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(m, p, g, y) {\n var redp, mred, gred, yred, k;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n redp = new _bn2.default.red(p);\n mred = m.toRed(redp);\n gred = g.toRed(redp);\n yred = y.toRed(redp);\n // See Section 11.5 here: https://crypto.stanford.edu/~dabo/cryptobook/BonehShoup_0_4.pdf\n\n _context.next = 6;\n return _random2.default.getRandomBN(zero, p);\n\n case 6:\n k = _context.sent;\n return _context.abrupt('return', {\n c1: gred.redPow(k).fromRed(),\n c2: yred.redPow(k).redMul(mred).fromRed()\n });\n\n case 8:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function encrypt(_x, _x2, _x3, _x4) {\n return _ref.apply(this, arguments);\n }\n\n return encrypt;\n }(),\n\n /**\n * ElGamal Encryption function\n * @param {BN} c1\n * @param {BN} c2\n * @param {BN} p\n * @param {BN} x\n * @returns BN\n * @async\n */\n decrypt: function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(c1, c2, p, x) {\n var redp, c1red, c2red;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n redp = new _bn2.default.red(p);\n c1red = c1.toRed(redp);\n c2red = c2.toRed(redp);\n return _context2.abrupt('return', c1red.redPow(x).redInvm().redMul(c2red).fromRed());\n\n case 4:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function decrypt(_x5, _x6, _x7, _x8) {\n return _ref2.apply(this, arguments);\n }\n\n return decrypt;\n }()\n};\n\n},{\"../random\":355,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42,\"bn.js\":44}],346:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getPreferredHashAlgo = exports.generate = exports.nodeCurves = exports.webCurves = exports.curves = undefined;\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar generate = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(curve) {\n var keyPair;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n curve = new Curve(curve);\n _context2.next = 3;\n return curve.genKeyPair();\n\n case 3:\n keyPair = _context2.sent;\n return _context2.abrupt('return', {\n oid: curve.oid,\n Q: new _bn2.default(keyPair.getPublic()),\n d: new _bn2.default(keyPair.getPrivate()),\n hash: curve.hash,\n cipher: curve.cipher\n });\n\n case 5:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function generate(_x) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n//////////////////////////\n// //\n// Helper functions //\n// //\n//////////////////////////\n\n\nvar webGenKeyPair = function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(name) {\n var webCryptoKey, privateKey, publicKey;\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return webCrypto.generateKey({ name: \"ECDSA\", namedCurve: webCurves[name] }, true, [\"sign\", \"verify\"]);\n\n case 2:\n webCryptoKey = _context3.sent;\n _context3.next = 5;\n return webCrypto.exportKey(\"jwk\", webCryptoKey.privateKey);\n\n case 5:\n privateKey = _context3.sent;\n _context3.next = 8;\n return webCrypto.exportKey(\"jwk\", webCryptoKey.publicKey);\n\n case 8:\n publicKey = _context3.sent;\n return _context3.abrupt('return', {\n pub: {\n x: _util2.default.b64_to_Uint8Array(publicKey.x, true),\n y: _util2.default.b64_to_Uint8Array(publicKey.y, true)\n },\n priv: _util2.default.b64_to_Uint8Array(privateKey.d, true)\n });\n\n case 10:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n return function webGenKeyPair(_x2) {\n return _ref3.apply(this, arguments);\n };\n}();\n\nvar nodeGenKeyPair = function () {\n var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(name) {\n var ecdh;\n return _regenerator2.default.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n // Note: ECDSA and ECDH key generation is structurally equivalent\n ecdh = nodeCrypto.createECDH(nodeCurves[name]);\n _context4.next = 3;\n return ecdh.generateKeys();\n\n case 3:\n return _context4.abrupt('return', {\n pub: ecdh.getPublicKey().toJSON().data,\n priv: ecdh.getPrivateKey().toJSON().data\n });\n\n case 4:\n case 'end':\n return _context4.stop();\n }\n }\n }, _callee4, this);\n }));\n\n return function nodeGenKeyPair(_x3) {\n return _ref4.apply(this, arguments);\n };\n}();\n\nvar _bn = _dereq_('bn.js');\n\nvar _bn2 = _interopRequireDefault(_bn);\n\nvar _elliptic = _dereq_('elliptic');\n\nvar _key = _dereq_('./key');\n\nvar _key2 = _interopRequireDefault(_key);\n\nvar _random = _dereq_('../../random');\n\nvar _random2 = _interopRequireDefault(_random);\n\nvar _enums = _dereq_('../../../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../../../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _oid = _dereq_('../../../type/oid');\n\nvar _oid2 = _interopRequireDefault(_oid);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar webCrypto = _util2.default.getWebCrypto(); // OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2015-2016 Decentral\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview Wrapper of an instance of an Elliptic Curve\n * @requires bn.js\n * @requires elliptic\n * @requires crypto/public_key/elliptic/key\n * @requires crypto/random\n * @requires enums\n * @requires util\n * @requires type/oid\n * @module crypto/public_key/elliptic/curve\n */\n\nvar nodeCrypto = _util2.default.getNodeCrypto();\n\nvar webCurves = {\n 'p256': 'P-256',\n 'p384': 'P-384',\n 'p521': 'P-521'\n};\nvar knownCurves = nodeCrypto ? nodeCrypto.getCurves() : [];\nvar nodeCurves = nodeCrypto ? {\n secp256k1: knownCurves.includes('secp256k1') ? 'secp256k1' : undefined,\n p256: knownCurves.includes('prime256v1') ? 'prime256v1' : undefined,\n p384: knownCurves.includes('secp384r1') ? 'secp384r1' : undefined,\n p521: knownCurves.includes('secp521r1') ? 'secp521r1' : undefined,\n ed25519: knownCurves.includes('ED25519') ? 'ED25519' : undefined,\n curve25519: knownCurves.includes('X25519') ? 'X25519' : undefined,\n brainpoolP256r1: knownCurves.includes('brainpoolP256r1') ? 'brainpoolP256r1' : undefined,\n brainpoolP384r1: knownCurves.includes('brainpoolP384r1') ? 'brainpoolP384r1' : undefined,\n brainpoolP512r1: knownCurves.includes('brainpoolP512r1') ? 'brainpoolP512r1' : undefined\n} : {};\n\nvar curves = {\n p256: {\n oid: [0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07],\n keyType: _enums2.default.publicKey.ecdsa,\n hash: _enums2.default.hash.sha256,\n cipher: _enums2.default.symmetric.aes128,\n node: nodeCurves.p256,\n web: webCurves.p256,\n payloadSize: 32\n },\n p384: {\n oid: [0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22],\n keyType: _enums2.default.publicKey.ecdsa,\n hash: _enums2.default.hash.sha384,\n cipher: _enums2.default.symmetric.aes192,\n node: nodeCurves.p384,\n web: webCurves.p384,\n payloadSize: 48\n },\n p521: {\n oid: [0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x23],\n keyType: _enums2.default.publicKey.ecdsa,\n hash: _enums2.default.hash.sha512,\n cipher: _enums2.default.symmetric.aes256,\n node: nodeCurves.p521,\n web: webCurves.p521,\n payloadSize: 66\n },\n secp256k1: {\n oid: [0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x0A],\n keyType: _enums2.default.publicKey.ecdsa,\n hash: _enums2.default.hash.sha256,\n cipher: _enums2.default.symmetric.aes128,\n node: nodeCurves.secp256k1\n },\n ed25519: {\n oid: [0x06, 0x09, 0x2B, 0x06, 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0F, 0x01],\n keyType: _enums2.default.publicKey.eddsa,\n hash: _enums2.default.hash.sha512,\n node: false // nodeCurves.ed25519 TODO\n },\n curve25519: {\n oid: [0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x97, 0x55, 0x01, 0x05, 0x01],\n keyType: _enums2.default.publicKey.ecdsa,\n hash: _enums2.default.hash.sha256,\n cipher: _enums2.default.symmetric.aes128,\n node: false // nodeCurves.curve25519 TODO\n },\n brainpoolP256r1: {\n oid: [0x06, 0x09, 0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x07],\n keyType: _enums2.default.publicKey.ecdsa,\n hash: _enums2.default.hash.sha256,\n cipher: _enums2.default.symmetric.aes128,\n node: nodeCurves.brainpoolP256r1\n },\n brainpoolP384r1: {\n oid: [0x06, 0x09, 0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0B],\n keyType: _enums2.default.publicKey.ecdsa,\n hash: _enums2.default.hash.sha384,\n cipher: _enums2.default.symmetric.aes192,\n node: nodeCurves.brainpoolP384r1\n },\n brainpoolP512r1: {\n oid: [0x06, 0x09, 0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0D],\n keyType: _enums2.default.publicKey.ecdsa,\n hash: _enums2.default.hash.sha512,\n cipher: _enums2.default.symmetric.aes256,\n node: nodeCurves.brainpoolP512r1\n }\n};\n\n/**\n * @constructor\n */\nfunction Curve(oid_or_name, params) {\n try {\n if (_util2.default.isArray(oid_or_name) || _util2.default.isUint8Array(oid_or_name)) {\n // by oid byte array\n oid_or_name = new _oid2.default(oid_or_name);\n }\n if (oid_or_name instanceof _oid2.default) {\n // by curve OID\n oid_or_name = oid_or_name.getName();\n }\n // by curve name or oid string\n this.name = _enums2.default.write(_enums2.default.curve, oid_or_name);\n } catch (err) {\n throw new Error('Not valid curve');\n }\n params = params || curves[this.name];\n\n this.keyType = params.keyType;\n switch (this.keyType) {\n case _enums2.default.publicKey.ecdsa:\n this.curve = new _elliptic.ec(this.name);\n break;\n case _enums2.default.publicKey.eddsa:\n this.curve = new _elliptic.eddsa(this.name);\n break;\n default:\n throw new Error('Unknown elliptic key type;');\n }\n\n this.oid = params.oid;\n this.hash = params.hash;\n this.cipher = params.cipher;\n this.node = params.node && curves[this.name];\n this.web = params.web && curves[this.name];\n this.payloadSize = params.payloadSize;\n}\n\nCurve.prototype.keyFromPrivate = function (priv) {\n // Not for ed25519\n return new _key2.default(this, { priv: priv });\n};\n\nCurve.prototype.keyFromSecret = function (secret) {\n // Only for ed25519\n return new _key2.default(this, { secret: secret });\n};\n\nCurve.prototype.keyFromPublic = function (pub) {\n return new _key2.default(this, { pub: pub });\n};\n\nCurve.prototype.genKeyPair = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() {\n var keyPair, r, compact;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n keyPair = void 0;\n\n if (!(this.web && _util2.default.getWebCrypto())) {\n _context.next = 13;\n break;\n }\n\n _context.prev = 2;\n _context.next = 5;\n return webGenKeyPair(this.name);\n\n case 5:\n keyPair = _context.sent;\n _context.next = 11;\n break;\n\n case 8:\n _context.prev = 8;\n _context.t0 = _context['catch'](2);\n\n _util2.default.print_debug(\"Browser did not support signing: \" + _context.t0.message);\n\n case 11:\n _context.next = 17;\n break;\n\n case 13:\n if (!(this.node && _util2.default.getNodeCrypto())) {\n _context.next = 17;\n break;\n }\n\n _context.next = 16;\n return nodeGenKeyPair(this.name);\n\n case 16:\n keyPair = _context.sent;\n\n case 17:\n if (!(!keyPair || !keyPair.priv)) {\n _context.next = 30;\n break;\n }\n\n _context.t1 = this.curve;\n _context.t2 = _util2.default;\n _context.next = 22;\n return _random2.default.getRandomBytes(32);\n\n case 22:\n _context.t3 = _context.sent;\n _context.t4 = _context.t2.Uint8Array_to_str.call(_context.t2, _context.t3);\n _context.t5 = {\n entropy: _context.t4\n };\n _context.next = 27;\n return _context.t1.genKeyPair.call(_context.t1, _context.t5);\n\n case 27:\n r = _context.sent;\n compact = this.curve.curve.type === 'edwards' || this.curve.curve.type === 'mont';\n\n if (this.keyType === _enums2.default.publicKey.eddsa) {\n keyPair = { secret: r.getSecret() };\n } else {\n keyPair = { pub: r.getPublic('array', compact), priv: r.getPrivate().toArray() };\n }\n\n case 30:\n return _context.abrupt('return', new _key2.default(this, keyPair));\n\n case 31:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this, [[2, 8]]);\n}));\n\nfunction getPreferredHashAlgo(oid) {\n return curves[_enums2.default.write(_enums2.default.curve, oid.toHex())].hash;\n}\n\nexports.default = Curve;\nexports.curves = curves;\nexports.webCurves = webCurves;\nexports.nodeCurves = nodeCurves;\nexports.generate = generate;\nexports.getPreferredHashAlgo = getPreferredHashAlgo;\n\n},{\"../../../enums\":359,\"../../../type/oid\":396,\"../../../util\":398,\"../../random\":355,\"./key\":351,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42,\"bn.js\":44,\"elliptic\":267}],347:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * Encrypt and wrap a session key\n *\n * @param {module:type/oid} oid Elliptic curve object identifier\n * @param {module:enums.symmetric} cipher_algo Symmetric cipher to use\n * @param {module:enums.hash} hash_algo Hash algorithm to use\n * @param {module:type/mpi} m Value derived from session key (RFC 6637)\n * @param {Uint8Array} Q Recipient public key\n * @param {String} fingerprint Recipient fingerprint\n * @returns {{V: BN, C: BN}} Returns ephemeral key and encoded session key\n * @async\n */\nvar encrypt = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(oid, cipher_algo, hash_algo, m, Q, fingerprint) {\n var curve, param, v, S, Z, C;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n curve = new _curves2.default(oid);\n param = buildEcdhParam(_enums2.default.publicKey.ecdh, oid, cipher_algo, hash_algo, fingerprint);\n\n cipher_algo = _enums2.default.read(_enums2.default.symmetric, cipher_algo);\n _context.next = 5;\n return curve.genKeyPair();\n\n case 5:\n v = _context.sent;\n\n Q = curve.keyFromPublic(Q);\n S = v.derive(Q);\n Z = kdf(hash_algo, S, _cipher2.default[cipher_algo].keySize, param);\n C = _aes_kw2.default.wrap(Z, m.toString());\n return _context.abrupt('return', {\n V: new _bn2.default(v.getPublic()),\n C: C\n });\n\n case 11:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function encrypt(_x, _x2, _x3, _x4, _x5, _x6) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Decrypt and unwrap the value derived from session key\n *\n * @param {module:type/oid} oid Elliptic curve object identifier\n * @param {module:enums.symmetric} cipher_algo Symmetric cipher to use\n * @param {module:enums.hash} hash_algo Hash algorithm to use\n * @param {BN} V Public part of ephemeral key\n * @param {Uint8Array} C Encrypted and wrapped value derived from session key\n * @param {Uint8Array} d Recipient private key\n * @param {String} fingerprint Recipient fingerprint\n * @returns {Uint8Array} Value derived from session\n * @async\n */\n\n\nvar decrypt = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(oid, cipher_algo, hash_algo, V, C, d, fingerprint) {\n var curve, param, S, Z;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n curve = new _curves2.default(oid);\n param = buildEcdhParam(_enums2.default.publicKey.ecdh, oid, cipher_algo, hash_algo, fingerprint);\n\n cipher_algo = _enums2.default.read(_enums2.default.symmetric, cipher_algo);\n V = curve.keyFromPublic(V);\n d = curve.keyFromPrivate(d);\n S = d.derive(V);\n Z = kdf(hash_algo, S, _cipher2.default[cipher_algo].keySize, param);\n return _context2.abrupt('return', new _bn2.default(_aes_kw2.default.unwrap(Z, C)));\n\n case 8:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function decrypt(_x7, _x8, _x9, _x10, _x11, _x12, _x13) {\n return _ref2.apply(this, arguments);\n };\n}();\n\nvar _bn = _dereq_('bn.js');\n\nvar _bn2 = _interopRequireDefault(_bn);\n\nvar _curves = _dereq_('./curves');\n\nvar _curves2 = _interopRequireDefault(_curves);\n\nvar _aes_kw = _dereq_('../../aes_kw');\n\nvar _aes_kw2 = _interopRequireDefault(_aes_kw);\n\nvar _cipher = _dereq_('../../cipher');\n\nvar _cipher2 = _interopRequireDefault(_cipher);\n\nvar _hash = _dereq_('../../hash');\n\nvar _hash2 = _interopRequireDefault(_hash);\n\nvar _kdf_params = _dereq_('../../../type/kdf_params');\n\nvar _kdf_params2 = _interopRequireDefault(_kdf_params);\n\nvar _enums = _dereq_('../../../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../../../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Build Param for ECDH algorithm (RFC 6637)\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2015-2016 Decentral\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview Key encryption and decryption for RFC 6637 ECDH\n * @requires crypto/public_key/elliptic/curve\n * @requires crypto/aes_kw\n * @requires crypto/cipher\n * @requires crypto/hash\n * @requires type/kdf_params\n * @requires enums\n * @requires util\n * @module crypto/public_key/elliptic/ecdh\n */\n\nfunction buildEcdhParam(public_algo, oid, cipher_algo, hash_algo, fingerprint) {\n var kdf_params = new _kdf_params2.default([hash_algo, cipher_algo]);\n return _util2.default.concatUint8Array([oid.write(), new Uint8Array([public_algo]), kdf_params.write(), _util2.default.str_to_Uint8Array(\"Anonymous Sender \"), fingerprint.subarray(0, 20)]);\n}\n\n// Key Derivation Function (RFC 6637)\nfunction kdf(hash_algo, X, length, param) {\n return _hash2.default.digest(hash_algo, _util2.default.concatUint8Array([new Uint8Array([0, 0, 0, 1]), new Uint8Array(X), param])).subarray(0, length);\n}exports.default = { encrypt: encrypt, decrypt: decrypt };\n\n},{\"../../../enums\":359,\"../../../type/kdf_params\":393,\"../../../util\":398,\"../../aes_kw\":326,\"../../cipher\":332,\"../../hash\":338,\"./curves\":346,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42,\"bn.js\":44}],348:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * Sign a message using the provided key\n * @param {module:type/oid} oid Elliptic curve object identifier\n * @param {module:enums.hash} hash_algo Hash algorithm used to sign\n * @param {Uint8Array} m Message to sign\n * @param {Uint8Array} d Private key used to sign the message\n * @returns {{r: Uint8Array,\n * s: Uint8Array}} Signature of the message\n * @async\n */\nvar sign = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(oid, hash_algo, m, d) {\n var curve, key, signature;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n curve = new _curves2.default(oid);\n key = curve.keyFromPrivate(d);\n _context.next = 4;\n return key.sign(m, hash_algo);\n\n case 4:\n signature = _context.sent;\n return _context.abrupt('return', { r: signature.r.toArrayLike(Uint8Array),\n s: signature.s.toArrayLike(Uint8Array) });\n\n case 6:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function sign(_x, _x2, _x3, _x4) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Verifies if a signature is valid for a message\n * @param {module:type/oid} oid Elliptic curve object identifier\n * @param {module:enums.hash} hash_algo Hash algorithm used in the signature\n * @param {{r: Uint8Array,\n s: Uint8Array}} signature Signature to verify\n * @param {Uint8Array} m Message to verify\n * @param {Uint8Array} Q Public key used to verify the message\n * @returns {Boolean}\n * @async\n */\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2015-2016 Decentral\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview Implementation of ECDSA following RFC6637 for Openpgpjs\n * @requires crypto/public_key/elliptic/curve\n * @module crypto/public_key/elliptic/ecdsa\n */\n\nvar verify = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(oid, hash_algo, signature, m, Q) {\n var curve, key;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n curve = new _curves2.default(oid);\n key = curve.keyFromPublic(Q);\n return _context2.abrupt('return', key.verify(m, signature, hash_algo));\n\n case 3:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function verify(_x5, _x6, _x7, _x8, _x9) {\n return _ref2.apply(this, arguments);\n };\n}();\n\nvar _curves = _dereq_('./curves');\n\nvar _curves2 = _interopRequireDefault(_curves);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = { sign: sign, verify: verify };\n\n},{\"./curves\":346,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],349:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * Sign a message using the provided key\n * @param {module:type/oid} oid Elliptic curve object identifier\n * @param {module:enums.hash} hash_algo Hash algorithm used to sign\n * @param {Uint8Array} m Message to sign\n * @param {Uint8Array} d Private key used to sign\n * @returns {{R: Uint8Array,\n * S: Uint8Array}} Signature of the message\n * @async\n */\nvar sign = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(oid, hash_algo, m, d) {\n var curve, key, signature;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n curve = new _curves2.default(oid);\n key = curve.keyFromSecret(d);\n _context.next = 4;\n return key.sign(m, hash_algo);\n\n case 4:\n signature = _context.sent;\n return _context.abrupt('return', { R: new Uint8Array(signature.Rencoded()),\n S: new Uint8Array(signature.Sencoded()) });\n\n case 6:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function sign(_x, _x2, _x3, _x4) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Verifies if a signature is valid for a message\n * @param {module:type/oid} oid Elliptic curve object identifier\n * @param {module:enums.hash} hash_algo Hash algorithm used in the signature\n * @param {{R: Uint8Array,\n S: Uint8Array}} signature Signature to verify the message\n * @param {Uint8Array} m Message to verify\n * @param {Uint8Array} Q Public key used to verify the message\n * @returns {Boolean}\n * @async\n */\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2018 Proton Technologies AG\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview Implementation of EdDSA following RFC4880bis-03 for OpenPGP\n * @requires crypto/public_key/elliptic/curve\n * @module crypto/public_key/elliptic/eddsa\n */\n\nvar verify = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(oid, hash_algo, signature, m, Q) {\n var curve, key;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n curve = new _curves2.default(oid);\n key = curve.keyFromPublic(Q);\n return _context2.abrupt('return', key.verify(m, signature, hash_algo));\n\n case 3:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function verify(_x5, _x6, _x7, _x8, _x9) {\n return _ref2.apply(this, arguments);\n };\n}();\n\nvar _curves = _dereq_('./curves');\n\nvar _curves2 = _interopRequireDefault(_curves);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = { sign: sign, verify: verify };\n\n},{\"./curves\":346,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],350:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _curves = _dereq_('./curves');\n\nvar _curves2 = _interopRequireDefault(_curves);\n\nvar _ecdsa = _dereq_('./ecdsa');\n\nvar _ecdsa2 = _interopRequireDefault(_ecdsa);\n\nvar _eddsa = _dereq_('./eddsa');\n\nvar _eddsa2 = _interopRequireDefault(_eddsa);\n\nvar _ecdh = _dereq_('./ecdh');\n\nvar _ecdh2 = _interopRequireDefault(_ecdh);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2015-2016 Decentral\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview Functions to access Elliptic Curve Cryptography\n * @see module:crypto/public_key/elliptic/curve\n * @see module:crypto/public_key/elliptic/ecdh\n * @see module:crypto/public_key/elliptic/ecdsa\n * @see module:crypto/public_key/elliptic/eddsa\n * @module crypto/public_key/elliptic\n */\n\nexports.default = {\n Curve: _curves2.default, ecdh: _ecdh2.default, ecdsa: _ecdsa2.default, eddsa: _eddsa2.default, generate: _curves.generate, getPreferredHashAlgo: _curves.getPreferredHashAlgo\n};\n\n},{\"./curves\":346,\"./ecdh\":347,\"./ecdsa\":348,\"./eddsa\":349}],351:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n//////////////////////////\n// //\n// Helper functions //\n// //\n//////////////////////////\n\n\nvar webSign = function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(curve, hash_algo, message, keyPair) {\n var len, key, signature;\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n len = curve.payloadSize;\n _context3.next = 3;\n return webCrypto.importKey(\"jwk\", {\n \"kty\": \"EC\",\n \"crv\": _curves.webCurves[curve.name],\n \"x\": _util2.default.Uint8Array_to_b64(new Uint8Array(keyPair.getPublic().getX().toArray('be', len)), true),\n \"y\": _util2.default.Uint8Array_to_b64(new Uint8Array(keyPair.getPublic().getY().toArray('be', len)), true),\n \"d\": _util2.default.Uint8Array_to_b64(new Uint8Array(keyPair.getPrivate().toArray('be', len)), true),\n \"use\": \"sig\",\n \"kid\": \"ECDSA Private Key\"\n }, {\n \"name\": \"ECDSA\",\n \"namedCurve\": _curves.webCurves[curve.name],\n \"hash\": { name: _enums2.default.read(_enums2.default.webHash, curve.hash) }\n }, false, [\"sign\"]);\n\n case 3:\n key = _context3.sent;\n _context3.t0 = Uint8Array;\n _context3.next = 7;\n return webCrypto.sign({\n \"name\": 'ECDSA',\n \"namedCurve\": _curves.webCurves[curve.name],\n \"hash\": { name: _enums2.default.read(_enums2.default.webHash, hash_algo) }\n }, key, message);\n\n case 7:\n _context3.t1 = _context3.sent;\n signature = new _context3.t0(_context3.t1);\n return _context3.abrupt('return', {\n r: new _bn2.default(signature.slice(0, len)),\n s: new _bn2.default(signature.slice(len, len << 1))\n });\n\n case 10:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n return function webSign(_x6, _x7, _x8, _x9) {\n return _ref3.apply(this, arguments);\n };\n}();\n\nvar webVerify = function () {\n var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(curve, hash_algo, _ref5, message, publicKey) {\n var r = _ref5.r,\n s = _ref5.s;\n var len, key, signature;\n return _regenerator2.default.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n len = curve.payloadSize;\n _context4.next = 3;\n return webCrypto.importKey(\"jwk\", {\n \"kty\": \"EC\",\n \"crv\": _curves.webCurves[curve.name],\n \"x\": _util2.default.Uint8Array_to_b64(new Uint8Array(publicKey.getX().toArray('be', len)), true),\n \"y\": _util2.default.Uint8Array_to_b64(new Uint8Array(publicKey.getY().toArray('be', len)), true),\n \"use\": \"sig\",\n \"kid\": \"ECDSA Public Key\"\n }, {\n \"name\": \"ECDSA\",\n \"namedCurve\": _curves.webCurves[curve.name],\n \"hash\": { name: _enums2.default.read(_enums2.default.webHash, curve.hash) }\n }, false, [\"verify\"]);\n\n case 3:\n key = _context4.sent;\n signature = _util2.default.concatUint8Array([new Uint8Array(len - r.length), r, new Uint8Array(len - s.length), s]).buffer;\n return _context4.abrupt('return', webCrypto.verify({\n \"name\": 'ECDSA',\n \"namedCurve\": _curves.webCurves[curve.name],\n \"hash\": { name: _enums2.default.read(_enums2.default.webHash, hash_algo) }\n }, key, signature, message));\n\n case 6:\n case 'end':\n return _context4.stop();\n }\n }\n }, _callee4, this);\n }));\n\n return function webVerify(_x10, _x11, _x12, _x13, _x14) {\n return _ref4.apply(this, arguments);\n };\n}();\n\nvar nodeSign = function () {\n var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(curve, hash_algo, message, keyPair) {\n var sign, key;\n return _regenerator2.default.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n sign = nodeCrypto.createSign(_enums2.default.read(_enums2.default.hash, hash_algo));\n\n sign.write(message);\n sign.end();\n\n key = ECPrivateKey.encode({\n version: 1,\n parameters: curve.oid,\n privateKey: keyPair.getPrivate().toArray(),\n publicKey: { unused: 0, data: keyPair.getPublic().encode() }\n }, 'pem', {\n label: 'EC PRIVATE KEY'\n });\n return _context5.abrupt('return', ECDSASignature.decode(sign.sign(key), 'der'));\n\n case 5:\n case 'end':\n return _context5.stop();\n }\n }\n }, _callee5, this);\n }));\n\n return function nodeSign(_x15, _x16, _x17, _x18) {\n return _ref6.apply(this, arguments);\n };\n}();\n\nvar nodeVerify = function () {\n var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(curve, hash_algo, _ref8, message, publicKey) {\n var r = _ref8.r,\n s = _ref8.s;\n var verify, key, signature;\n return _regenerator2.default.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n verify = nodeCrypto.createVerify(_enums2.default.read(_enums2.default.hash, hash_algo));\n\n verify.write(message);\n verify.end();\n\n key = SubjectPublicKeyInfo.encode({\n algorithm: {\n algorithm: [1, 2, 840, 10045, 2, 1],\n parameters: curve.oid\n },\n subjectPublicKey: { unused: 0, data: publicKey.encode() }\n }, 'pem', {\n label: 'PUBLIC KEY'\n });\n signature = ECDSASignature.encode({\n r: new _bn2.default(r), s: new _bn2.default(s)\n }, 'der');\n _context6.prev = 5;\n return _context6.abrupt('return', verify.verify(key, signature));\n\n case 9:\n _context6.prev = 9;\n _context6.t0 = _context6['catch'](5);\n return _context6.abrupt('return', false);\n\n case 12:\n case 'end':\n return _context6.stop();\n }\n }\n }, _callee6, this, [[5, 9]]);\n }));\n\n return function nodeVerify(_x19, _x20, _x21, _x22, _x23) {\n return _ref7.apply(this, arguments);\n };\n}();\n\n// Originally written by Owen Smith https://github.com/omsmith\n// Adapted on Feb 2018 from https://github.com/Brightspace/node-jwk-to-pem/\n\n/* eslint-disable no-invalid-this */\n\nvar _bn = _dereq_('bn.js');\n\nvar _bn2 = _interopRequireDefault(_bn);\n\nvar _curves = _dereq_('./curves');\n\nvar _hash = _dereq_('../../hash');\n\nvar _hash2 = _interopRequireDefault(_hash);\n\nvar _util = _dereq_('../../../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _enums = _dereq_('../../../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar webCrypto = _util2.default.getWebCrypto(); // OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2015-2016 Decentral\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview Wrapper for a KeyPair of an Elliptic Curve\n * @requires bn.js\n * @requires crypto/public_key/elliptic/curves\n * @requires crypto/hash\n * @requires util\n * @requires enums\n * @requires asn1.js\n * @module crypto/public_key/elliptic/key\n */\n\nvar nodeCrypto = _util2.default.getNodeCrypto();\n\n/**\n * @constructor\n */\nfunction KeyPair(curve, options) {\n this.curve = curve;\n this.keyType = curve.curve.type === 'edwards' ? _enums2.default.publicKey.eddsa : _enums2.default.publicKey.ecdsa;\n this.keyPair = this.curve.curve.keyPair(options);\n}\n\nKeyPair.prototype.sign = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(message, hash_algo) {\n var signature, digest;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (!(this.curve.web && _util2.default.getWebCrypto())) {\n _context.next = 13;\n break;\n }\n\n _context.prev = 1;\n _context.next = 4;\n return webSign(this.curve, hash_algo, message, this.keyPair);\n\n case 4:\n signature = _context.sent;\n return _context.abrupt('return', signature);\n\n case 8:\n _context.prev = 8;\n _context.t0 = _context['catch'](1);\n\n _util2.default.print_debug(\"Browser did not support signing: \" + _context.t0.message);\n\n case 11:\n _context.next = 15;\n break;\n\n case 13:\n if (!(this.curve.node && _util2.default.getNodeCrypto())) {\n _context.next = 15;\n break;\n }\n\n return _context.abrupt('return', nodeSign(this.curve, hash_algo, message, this.keyPair));\n\n case 15:\n digest = typeof hash_algo === 'undefined' ? message : _hash2.default.digest(hash_algo, message);\n return _context.abrupt('return', this.keyPair.sign(digest));\n\n case 17:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this, [[1, 8]]);\n }));\n\n return function (_x, _x2) {\n return _ref.apply(this, arguments);\n };\n}();\n\nKeyPair.prototype.verify = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(message, signature, hash_algo) {\n var result, digest;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!(this.curve.web && _util2.default.getWebCrypto())) {\n _context2.next = 13;\n break;\n }\n\n _context2.prev = 1;\n _context2.next = 4;\n return webVerify(this.curve, hash_algo, signature, message, this.keyPair.getPublic());\n\n case 4:\n result = _context2.sent;\n return _context2.abrupt('return', result);\n\n case 8:\n _context2.prev = 8;\n _context2.t0 = _context2['catch'](1);\n\n _util2.default.print_debug(\"Browser did not support signing: \" + _context2.t0.message);\n\n case 11:\n _context2.next = 15;\n break;\n\n case 13:\n if (!(this.curve.node && _util2.default.getNodeCrypto())) {\n _context2.next = 15;\n break;\n }\n\n return _context2.abrupt('return', nodeVerify(this.curve, hash_algo, signature, message, this.keyPair.getPublic()));\n\n case 15:\n digest = typeof hash_algo === 'undefined' ? message : _hash2.default.digest(hash_algo, message);\n return _context2.abrupt('return', this.keyPair.verify(digest, signature));\n\n case 17:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this, [[1, 8]]);\n }));\n\n return function (_x3, _x4, _x5) {\n return _ref2.apply(this, arguments);\n };\n}();\n\nKeyPair.prototype.derive = function (pub) {\n if (this.keyType === _enums2.default.publicKey.eddsa) {\n throw new Error('Key can only be used for EdDSA');\n }\n return this.keyPair.derive(pub.keyPair.getPublic());\n};\n\nKeyPair.prototype.getPublic = function () {\n var compact = this.curve.curve.curve.type === 'edwards' || this.curve.curve.curve.type === 'mont';\n return this.keyPair.getPublic('array', compact);\n};\n\nKeyPair.prototype.getPrivate = function () {\n if (this.curve.keyType === _enums2.default.publicKey.eddsa) {\n return this.keyPair.getSecret();\n }\n return this.keyPair.getPrivate().toArray();\n};\n\nexports.default = KeyPair;\nvar asn1 = nodeCrypto ? _dereq_('asn1.js') : undefined;\n\nvar ECDSASignature = nodeCrypto ? asn1.define('ECDSASignature', function () {\n this.seq().obj(this.key('r').int(), this.key('s').int());\n}) : undefined;\n\nvar ECPrivateKey = nodeCrypto ? asn1.define('ECPrivateKey', function () {\n this.seq().obj(this.key('version').int(), this.key('privateKey').octstr(), this.key('parameters').explicit(0).optional().any(), this.key('publicKey').explicit(1).optional().bitstr());\n}) : undefined;\n\nvar AlgorithmIdentifier = nodeCrypto ? asn1.define('AlgorithmIdentifier', function () {\n this.seq().obj(this.key('algorithm').objid(), this.key('parameters').optional().any());\n}) : undefined;\n\nvar SubjectPublicKeyInfo = nodeCrypto ? asn1.define('SubjectPublicKeyInfo', function () {\n this.seq().obj(this.key('algorithm').use(AlgorithmIdentifier), this.key('subjectPublicKey').bitstr());\n}) : undefined;\n\n},{\"../../../enums\":359,\"../../../util\":398,\"../../hash\":338,\"./curves\":346,\"asn1.js\":\"asn1.js\",\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42,\"bn.js\":44}],352:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rsa = _dereq_('./rsa');\n\nvar _rsa2 = _interopRequireDefault(_rsa);\n\nvar _elgamal = _dereq_('./elgamal');\n\nvar _elgamal2 = _interopRequireDefault(_elgamal);\n\nvar _elliptic = _dereq_('./elliptic');\n\nvar _elliptic2 = _interopRequireDefault(_elliptic);\n\nvar _dsa = _dereq_('./dsa');\n\nvar _dsa2 = _interopRequireDefault(_dsa);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @fileoverview Asymmetric cryptography functions\n * @requires crypto/public_key/dsa\n * @requires crypto/public_key/elgamal\n * @requires crypto/public_key/elliptic\n * @requires crypto/public_key/rsa\n * @module crypto/public_key\n */\n\nexports.default = {\n /** @see module:crypto/public_key/rsa */\n rsa: _rsa2.default,\n /** @see module:crypto/public_key/elgamal */\n elgamal: _elgamal2.default,\n /** @see module:crypto/public_key/elliptic */\n elliptic: _elliptic2.default,\n /** @see module:crypto/public_key/dsa */\n dsa: _dsa2.default\n};\n\n},{\"./dsa\":344,\"./elgamal\":345,\"./elliptic\":350,\"./rsa\":354}],353:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * Probabilistic random number generator\n * @param {Integer} bits Bit length of the prime\n * @param {BN} e Optional RSA exponent to check against the prime\n * @param {Integer} k Optional number of iterations of Miller-Rabin test\n * @returns BN\n * @async\n */\nvar randomProbablePrime = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(bits, e, k) {\n var min, thirty, adds, n, i;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n min = new _bn2.default(1).shln(bits - 1);\n thirty = new _bn2.default(30);\n /*\n * We can avoid any multiples of 3 and 5 by looking at n mod 30\n * n mod 30 = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29\n * the next possible prime is mod 30:\n * 1 7 7 7 7 7 7 11 11 11 11 13 13 17 17 17 17 19 19 23 23 23 23 29 29 29 29 29 29 1\n */\n\n adds = [1, 6, 5, 4, 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, 3, 2, 1, 2];\n _context.next = 5;\n return _random2.default.getRandomBN(min, min.shln(1));\n\n case 5:\n n = _context.sent;\n i = n.mod(thirty).toNumber();\n\n case 7:\n n.iaddn(adds[i]);\n i = (i + adds[i]) % adds.length;\n // If reached the maximum, go back to the minimum.\n if (n.bitLength() > bits) {\n n = n.mod(min.shln(1)).iadd(min);\n i = n.mod(thirty).toNumber();\n }\n // eslint-disable-next-line no-await-in-loop\n\n case 10:\n _context.next = 12;\n return isProbablePrime(n, e, k);\n\n case 12:\n if (!_context.sent) {\n _context.next = 7;\n break;\n }\n\n case 13:\n return _context.abrupt('return', n);\n\n case 14:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function randomProbablePrime(_x, _x2, _x3) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Probabilistic primality testing\n * @param {BN} n Number to test\n * @param {BN} e Optional RSA exponent to check against the prime\n * @param {Integer} k Optional number of iterations of Miller-Rabin test\n * @returns {boolean}\n * @async\n */\n\n\nvar isProbablePrime = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(n, e, k) {\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!(e && !n.subn(1).gcd(e).eqn(1))) {\n _context2.next = 2;\n break;\n }\n\n return _context2.abrupt('return', false);\n\n case 2:\n if (divisionTest(n)) {\n _context2.next = 4;\n break;\n }\n\n return _context2.abrupt('return', false);\n\n case 4:\n if (fermat(n)) {\n _context2.next = 6;\n break;\n }\n\n return _context2.abrupt('return', false);\n\n case 6:\n _context2.next = 8;\n return millerRabin(n, k);\n\n case 8:\n if (_context2.sent) {\n _context2.next = 10;\n break;\n }\n\n return _context2.abrupt('return', false);\n\n case 10:\n return _context2.abrupt('return', true);\n\n case 11:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function isProbablePrime(_x4, _x5, _x6) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n/**\n * Tests whether n is probably prime or not using Fermat's test with b = 2.\n * Fails if b^(n-1) mod n === 1.\n * @param {BN} n Number to test\n * @param {Integer} b Optional Fermat test base\n * @returns {boolean}\n */\n\n\n// Miller-Rabin - Miller Rabin algorithm for primality test\n// Copyright Fedor Indutny, 2014.\n//\n// This software is licensed under the MIT License.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// Adapted on Jan 2018 from version 4.0.1 at https://github.com/indutny/miller-rabin\n\n// Sample syntax for Fixed-Base Miller-Rabin:\n// millerRabin(n, k, () => new BN(small_primes[Math.random() * small_primes.length | 0]))\n\n/**\n * Tests whether n is probably prime or not using the Miller-Rabin test.\n * See HAC Remark 4.28.\n * @param {BN} n Number to test\n * @param {Integer} k Optional number of iterations of Miller-Rabin test\n * @param {Function} rand Optional function to generate potential witnesses\n * @returns {boolean}\n * @async\n */\nvar millerRabin = function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(n, k, rand) {\n var len, red, rone, n1, rn1, s, d, a, x, i;\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n len = n.bitLength();\n red = _bn2.default.mont(n);\n rone = new _bn2.default(1).toRed(red);\n\n\n if (!k) {\n k = Math.max(1, len / 48 | 0);\n }\n\n n1 = n.subn(1);\n rn1 = n1.toRed(red);\n\n // Find d and s, (n - 1) = (2 ^ s) * d;\n\n s = 0;\n\n while (!n1.testn(s)) {\n s++;\n }\n d = n.shrn(s);\n\n case 9:\n if (!(k > 0)) {\n _context3.next = 37;\n break;\n }\n\n if (!rand) {\n _context3.next = 14;\n break;\n }\n\n _context3.t0 = rand();\n _context3.next = 17;\n break;\n\n case 14:\n _context3.next = 16;\n return _random2.default.getRandomBN(new _bn2.default(2), n1);\n\n case 16:\n _context3.t0 = _context3.sent;\n\n case 17:\n a = _context3.t0;\n x = a.toRed(red).redPow(d);\n\n if (!(x.eq(rone) || x.eq(rn1))) {\n _context3.next = 21;\n break;\n }\n\n return _context3.abrupt('continue', 34);\n\n case 21:\n i = void 0;\n i = 1;\n\n case 23:\n if (!(i < s)) {\n _context3.next = 32;\n break;\n }\n\n x = x.redSqr();\n\n if (!x.eq(rone)) {\n _context3.next = 27;\n break;\n }\n\n return _context3.abrupt('return', false);\n\n case 27:\n if (!x.eq(rn1)) {\n _context3.next = 29;\n break;\n }\n\n return _context3.abrupt('break', 32);\n\n case 29:\n i++;\n _context3.next = 23;\n break;\n\n case 32:\n if (!(i === s)) {\n _context3.next = 34;\n break;\n }\n\n return _context3.abrupt('return', false);\n\n case 34:\n k--;\n _context3.next = 9;\n break;\n\n case 37:\n return _context3.abrupt('return', true);\n\n case 38:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n return function millerRabin(_x7, _x8, _x9) {\n return _ref3.apply(this, arguments);\n };\n}();\n\nvar _bn = _dereq_('bn.js');\n\nvar _bn2 = _interopRequireDefault(_bn);\n\nvar _random = _dereq_('../random');\n\nvar _random2 = _interopRequireDefault(_random);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2018 Proton Technologies AG\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview Algorithms for probabilistic random prime generation\n * @requires bn.js\n * @requires crypto/random\n * @module crypto/public_key/prime\n */\n\nexports.default = {\n randomProbablePrime: randomProbablePrime, isProbablePrime: isProbablePrime, fermat: fermat, millerRabin: millerRabin, divisionTest: divisionTest\n};\nfunction fermat(n, b) {\n b = b || new _bn2.default(2);\n return b.toRed(_bn2.default.mont(n)).redPow(n.subn(1)).fromRed().cmpn(1) === 0;\n}\n\nfunction divisionTest(n) {\n return small_primes.every(function (m) {\n return n.modn(m) !== 0;\n });\n}\n\n// https://github.com/gpg/libgcrypt/blob/master/cipher/primegen.c\nvar small_primes = [7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999];\n\n},{\"../random\":355,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42,\"bn.js\":44}],354:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _promise = _dereq_('babel-runtime/core-js/promise');\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _bn = _dereq_('bn.js');\n\nvar _bn2 = _interopRequireDefault(_bn);\n\nvar _prime = _dereq_('./prime');\n\nvar _prime2 = _interopRequireDefault(_prime);\n\nvar _random = _dereq_('../random');\n\nvar _random2 = _interopRequireDefault(_random);\n\nvar _config = _dereq_('../../config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _util = _dereq_('../../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Helper for IE11 KeyOperation objects\nfunction promisifyIE11Op(keyObj, err) {\n if (typeof keyObj.then !== 'function') {\n // IE11 KeyOperation\n return new _promise2.default(function (resolve, reject) {\n keyObj.onerror = function () {\n reject(new Error(err));\n };\n keyObj.oncomplete = function (e) {\n resolve(e.target.result);\n };\n });\n }\n return keyObj;\n} // GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview RSA implementation\n * @requires bn.js\n * @requires crypto/public_key/prime\n * @requires crypto/random\n * @requires config\n * @requires util\n * @module crypto/public_key/rsa\n */\n\nexports.default = {\n /** Create signature\n * @param {BN} m message\n * @param {BN} n RSA public modulus\n * @param {BN} e RSA public exponent\n * @param {BN} d RSA private exponent\n * @returns {BN} RSA Signature\n * @async\n */\n sign: function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(m, n, e, d) {\n var nred;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (!(n.cmp(m) <= 0)) {\n _context.next = 2;\n break;\n }\n\n throw new Error('Message size cannot exceed modulus size');\n\n case 2:\n nred = new _bn2.default.red(n);\n return _context.abrupt('return', m.toRed(nred).redPow(d).toArrayLike(Uint8Array, 'be', n.byteLength()));\n\n case 4:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function sign(_x, _x2, _x3, _x4) {\n return _ref.apply(this, arguments);\n }\n\n return sign;\n }(),\n\n /**\n * Verify signature\n * @param {BN} s signature\n * @param {BN} n RSA public modulus\n * @param {BN} e RSA public exponent\n * @returns {BN}\n * @async\n */\n verify: function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(s, n, e) {\n var nred;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!(n.cmp(s) <= 0)) {\n _context2.next = 2;\n break;\n }\n\n throw new Error('Signature size cannot exceed modulus size');\n\n case 2:\n nred = new _bn2.default.red(n);\n return _context2.abrupt('return', s.toRed(nred).redPow(e).toArrayLike(Uint8Array, 'be', n.byteLength()));\n\n case 4:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function verify(_x5, _x6, _x7) {\n return _ref2.apply(this, arguments);\n }\n\n return verify;\n }(),\n\n /**\n * Encrypt message\n * @param {BN} m message\n * @param {BN} n RSA public modulus\n * @param {BN} e RSA public exponent\n * @returns {BN} RSA Ciphertext\n * @async\n */\n encrypt: function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(m, n, e) {\n var nred;\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n if (!(n.cmp(m) <= 0)) {\n _context3.next = 2;\n break;\n }\n\n throw new Error('Message size cannot exceed modulus size');\n\n case 2:\n nred = new _bn2.default.red(n);\n return _context3.abrupt('return', m.toRed(nred).redPow(e).toArrayLike(Uint8Array, 'be', n.byteLength()));\n\n case 4:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n function encrypt(_x8, _x9, _x10) {\n return _ref3.apply(this, arguments);\n }\n\n return encrypt;\n }(),\n\n /**\n * Decrypt RSA message\n * @param {BN} m message\n * @param {BN} n RSA public modulus\n * @param {BN} e RSA public exponent\n * @param {BN} d RSA private exponent\n * @param {BN} p RSA private prime p\n * @param {BN} q RSA private prime q\n * @param {BN} u RSA private inverse of prime q\n * @returns {BN} RSA Plaintext\n * @async\n */\n decrypt: function () {\n var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(m, n, e, d, p, q, u) {\n var dq, dp, pred, qred, nred, blinder, unblinder, mp, mq, t, h, result;\n return _regenerator2.default.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n if (!(n.cmp(m) <= 0)) {\n _context4.next = 2;\n break;\n }\n\n throw new Error('Data too large.');\n\n case 2:\n dq = d.mod(q.subn(1)); // d mod (q-1)\n\n dp = d.mod(p.subn(1)); // d mod (p-1)\n\n pred = new _bn2.default.red(p);\n qred = new _bn2.default.red(q);\n nred = new _bn2.default.red(n);\n blinder = void 0;\n unblinder = void 0;\n\n if (!_config2.default.rsa_blinding) {\n _context4.next = 16;\n break;\n }\n\n _context4.next = 12;\n return _random2.default.getRandomBN(new _bn2.default(2), n);\n\n case 12:\n _context4.t0 = nred;\n unblinder = _context4.sent.toRed(_context4.t0);\n\n blinder = unblinder.redInvm().redPow(e);\n m = m.toRed(nred).redMul(blinder).fromRed();\n\n case 16:\n mp = m.toRed(pred).redPow(dp);\n mq = m.toRed(qred).redPow(dq);\n t = mq.redSub(mp.fromRed().toRed(qred));\n h = u.toRed(qred).redMul(t).fromRed();\n result = h.mul(p).add(mp).toRed(nred);\n\n\n if (_config2.default.rsa_blinding) {\n result = result.redMul(unblinder);\n }\n\n return _context4.abrupt('return', result.toArrayLike(Uint8Array, 'be', n.byteLength()));\n\n case 23:\n case 'end':\n return _context4.stop();\n }\n }\n }, _callee4, this);\n }));\n\n function decrypt(_x11, _x12, _x13, _x14, _x15, _x16, _x17) {\n return _ref4.apply(this, arguments);\n }\n\n return decrypt;\n }(),\n\n /**\n * Generate a new random private key B bits long with public exponent E.\n *\n * When possible, webCrypto is used. Otherwise, primes are generated using\n * 40 rounds of the Miller-Rabin probabilistic random prime generation algorithm.\n * @see module:crypto/public_key/prime\n * @param {Integer} B RSA bit length\n * @param {String} E RSA public exponent in hex string\n * @returns {{n: BN, e: BN, d: BN,\n * p: BN, q: BN, u: BN}} RSA public modulus, RSA public exponent, RSA private exponent,\n * RSA private prime p, RSA private prime q, u = q ** -1 mod p\n * @async\n */\n generate: function () {\n var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(B, E) {\n var key, webCrypto, keyPair, keyGenOpt, jwk, p, q, _ref6, phi;\n\n return _regenerator2.default.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n key = void 0;\n\n E = new _bn2.default(E, 16);\n webCrypto = _util2.default.getWebCryptoAll();\n\n // Native RSA keygen using Web Crypto\n\n if (!webCrypto) {\n _context5.next = 35;\n break;\n }\n\n keyPair = void 0;\n keyGenOpt = void 0;\n\n if (!(window.crypto && window.crypto.subtle || window.msCrypto)) {\n _context5.next = 14;\n break;\n }\n\n // current standard spec\n keyGenOpt = {\n name: 'RSASSA-PKCS1-v1_5',\n modulusLength: B, // the specified keysize in bits\n publicExponent: E.toArrayLike(Uint8Array), // take three bytes (max 65537) for exponent\n hash: {\n name: 'SHA-1' // not required for actual RSA keys, but for crypto api 'sign' and 'verify'\n }\n };\n keyPair = webCrypto.generateKey(keyGenOpt, true, ['sign', 'verify']);\n _context5.next = 11;\n return promisifyIE11Op(keyPair, 'Error generating RSA key pair.');\n\n case 11:\n keyPair = _context5.sent;\n _context5.next = 22;\n break;\n\n case 14:\n if (!(window.crypto && window.crypto.webkitSubtle)) {\n _context5.next = 21;\n break;\n }\n\n // outdated spec implemented by old Webkit\n keyGenOpt = {\n name: 'RSA-OAEP',\n modulusLength: B, // the specified keysize in bits\n publicExponent: E.toArrayLike(Uint8Array), // take three bytes (max 65537) for exponent\n hash: {\n name: 'SHA-1' // not required for actual RSA keys, but for crypto api 'sign' and 'verify'\n }\n };\n _context5.next = 18;\n return webCrypto.generateKey(keyGenOpt, true, ['encrypt', 'decrypt']);\n\n case 18:\n keyPair = _context5.sent;\n _context5.next = 22;\n break;\n\n case 21:\n throw new Error('Unknown WebCrypto implementation');\n\n case 22:\n\n // export the generated keys as JsonWebKey (JWK)\n // https://tools.ietf.org/html/draft-ietf-jose-json-web-key-33\n jwk = webCrypto.exportKey('jwk', keyPair.privateKey);\n _context5.next = 25;\n return promisifyIE11Op(jwk, 'Error exporting RSA key pair.');\n\n case 25:\n jwk = _context5.sent;\n\n\n // parse raw ArrayBuffer bytes to jwk/json (WebKit/Safari/IE11 quirk)\n if (jwk instanceof ArrayBuffer) {\n jwk = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(jwk)));\n }\n\n // map JWK parameters to BN\n key = {};\n key.n = new _bn2.default(_util2.default.b64_to_Uint8Array(jwk.n));\n key.e = E;\n key.d = new _bn2.default(_util2.default.b64_to_Uint8Array(jwk.d));\n key.p = new _bn2.default(_util2.default.b64_to_Uint8Array(jwk.p));\n key.q = new _bn2.default(_util2.default.b64_to_Uint8Array(jwk.q));\n key.u = key.p.invm(key.q);\n return _context5.abrupt('return', key);\n\n case 35:\n _context5.next = 37;\n return _prime2.default.randomProbablePrime(B - (B >> 1), E, 40);\n\n case 37:\n p = _context5.sent;\n _context5.next = 40;\n return _prime2.default.randomProbablePrime(B >> 1, E, 40);\n\n case 40:\n q = _context5.sent;\n\n\n if (p.cmp(q) < 0) {\n _ref6 = [q, p];\n p = _ref6[0];\n q = _ref6[1];\n }\n\n phi = p.subn(1).mul(q.subn(1));\n return _context5.abrupt('return', {\n n: p.mul(q),\n e: E,\n d: E.invm(phi),\n p: p,\n q: q,\n // dp: d.mod(p.subn(1)),\n // dq: d.mod(q.subn(1)),\n u: p.invm(q)\n });\n\n case 44:\n case 'end':\n return _context5.stop();\n }\n }\n }, _callee5, this);\n }));\n\n function generate(_x18, _x19) {\n return _ref5.apply(this, arguments);\n }\n\n return generate;\n }(),\n\n prime: _prime2.default\n};\n\n},{\"../../config\":325,\"../../util\":398,\"../random\":355,\"./prime\":353,\"babel-runtime/core-js/promise\":32,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42,\"bn.js\":44}],355:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _typeof2 = _dereq_('babel-runtime/helpers/typeof');\n\nvar _typeof3 = _interopRequireDefault(_typeof2);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _bn = _dereq_('bn.js');\n\nvar _bn2 = _interopRequireDefault(_bn);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Do not use util.getNodeCrypto because we need this regardless of use_native setting\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n// The GPG4Browsers crypto interface\n\n/**\n * @fileoverview Provides tools for retrieving secure randomness from browsers or Node.js\n * @requires bn.js\n * @requires util\n * @module crypto/random\n */\n\nvar nodeCrypto = _util2.default.detectNode() && _dereq_('crypto');\n\nexports.default = {\n /**\n * Retrieve secure random byte array of the specified length\n * @param {Integer} length Length in bytes to generate\n * @returns {Uint8Array} Random byte array\n * @async\n */\n getRandomBytes: function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(length) {\n var buf, bytes;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n buf = new Uint8Array(length);\n\n if (!(typeof window !== 'undefined' && window.crypto && window.crypto.getRandomValues)) {\n _context.next = 5;\n break;\n }\n\n window.crypto.getRandomValues(buf);\n _context.next = 20;\n break;\n\n case 5:\n if (!(typeof window !== 'undefined' && (0, _typeof3.default)(window.msCrypto) === 'object' && typeof window.msCrypto.getRandomValues === 'function')) {\n _context.next = 9;\n break;\n }\n\n window.msCrypto.getRandomValues(buf);\n _context.next = 20;\n break;\n\n case 9:\n if (!nodeCrypto) {\n _context.next = 14;\n break;\n }\n\n bytes = nodeCrypto.randomBytes(buf.length);\n\n buf.set(bytes);\n _context.next = 20;\n break;\n\n case 14:\n if (!this.randomBuffer.buffer) {\n _context.next = 19;\n break;\n }\n\n _context.next = 17;\n return this.randomBuffer.get(buf);\n\n case 17:\n _context.next = 20;\n break;\n\n case 19:\n throw new Error('No secure random number generator available.');\n\n case 20:\n return _context.abrupt('return', buf);\n\n case 21:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function getRandomBytes(_x) {\n return _ref.apply(this, arguments);\n }\n\n return getRandomBytes;\n }(),\n\n /**\n * Create a secure random MPI that is greater than or equal to min and less than max.\n * @param {module:type/mpi} min Lower bound, included\n * @param {module:type/mpi} max Upper bound, excluded\n * @returns {module:BN} Random MPI\n * @async\n */\n getRandomBN: function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(min, max) {\n var modulus, bytes, r;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!(max.cmp(min) <= 0)) {\n _context2.next = 2;\n break;\n }\n\n throw new Error('Illegal parameter value: max <= min');\n\n case 2:\n modulus = max.sub(min);\n bytes = modulus.byteLength();\n\n // Using a while loop is necessary to avoid bias introduced by the mod operation.\n // However, we request 64 extra random bits so that the bias is negligible.\n // Section B.1.1 here: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf\n\n _context2.t0 = _bn2.default;\n _context2.next = 7;\n return this.getRandomBytes(bytes + 8);\n\n case 7:\n _context2.t1 = _context2.sent;\n r = new _context2.t0(_context2.t1);\n return _context2.abrupt('return', r.mod(modulus).add(min));\n\n case 10:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function getRandomBN(_x2, _x3) {\n return _ref2.apply(this, arguments);\n }\n\n return getRandomBN;\n }(),\n\n randomBuffer: new RandomBuffer()\n};\n\n/**\n * Buffer for secure random numbers\n */\n\nfunction RandomBuffer() {\n this.buffer = null;\n this.size = null;\n this.callback = null;\n}\n\n/**\n * Initialize buffer\n * @param {Integer} size size of buffer\n */\nRandomBuffer.prototype.init = function (size, callback) {\n this.buffer = new Uint8Array(size);\n this.size = 0;\n this.callback = callback;\n};\n\n/**\n * Concat array of secure random numbers to buffer\n * @param {Uint8Array} buf\n */\nRandomBuffer.prototype.set = function (buf) {\n if (!this.buffer) {\n throw new Error('RandomBuffer is not initialized');\n }\n if (!(buf instanceof Uint8Array)) {\n throw new Error('Invalid type: buf not an Uint8Array');\n }\n var freeSpace = this.buffer.length - this.size;\n if (buf.length > freeSpace) {\n buf = buf.subarray(0, freeSpace);\n }\n // set buf with offset old size of buffer\n this.buffer.set(buf, this.size);\n this.size += buf.length;\n};\n\n/**\n * Take numbers out of buffer and copy to array\n * @param {Uint8Array} buf the destination array\n */\nRandomBuffer.prototype.get = function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(buf) {\n var i;\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n if (this.buffer) {\n _context3.next = 2;\n break;\n }\n\n throw new Error('RandomBuffer is not initialized');\n\n case 2:\n if (buf instanceof Uint8Array) {\n _context3.next = 4;\n break;\n }\n\n throw new Error('Invalid type: buf not an Uint8Array');\n\n case 4:\n if (!(this.size < buf.length)) {\n _context3.next = 10;\n break;\n }\n\n if (this.callback) {\n _context3.next = 7;\n break;\n }\n\n throw new Error('Random number buffer depleted');\n\n case 7:\n _context3.next = 9;\n return this.callback();\n\n case 9:\n return _context3.abrupt('return', this.get(buf));\n\n case 10:\n for (i = 0; i < buf.length; i++) {\n buf[i] = this.buffer[--this.size];\n // clear buffer value\n this.buffer[this.size] = 0;\n }\n\n case 11:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n return function (_x4) {\n return _ref3.apply(this, arguments);\n };\n}();\n\n},{\"../util\":398,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/helpers/typeof\":41,\"babel-runtime/regenerator\":42,\"bn.js\":44,\"crypto\":\"crypto\"}],356:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _from = _dereq_('babel-runtime/core-js/array/from');\n\nvar _from2 = _interopRequireDefault(_from);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _bn = _dereq_('bn.js');\n\nvar _bn2 = _interopRequireDefault(_bn);\n\nvar _public_key = _dereq_('./public_key');\n\nvar _public_key2 = _interopRequireDefault(_public_key);\n\nvar _pkcs = _dereq_('./pkcs1');\n\nvar _pkcs2 = _interopRequireDefault(_pkcs);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n /**\n * Verifies the signature provided for data using specified algorithms and public key parameters.\n * See {@link https://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1}\n * and {@link https://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4}\n * for public key and hash algorithms.\n * @param {module:enums.publicKey} algo Public key algorithm\n * @param {module:enums.hash} hash_algo Hash algorithm\n * @param {Array<module:type/mpi>} msg_MPIs Algorithm-specific signature parameters\n * @param {Array<module:type/mpi>} pub_MPIs Algorithm-specific public key parameters\n * @param {Uint8Array} data Data for which the signature was created\n * @returns {Boolean} True if signature is valid\n * @async\n */\n verify: function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(algo, hash_algo, msg_MPIs, pub_MPIs, data) {\n var m, n, e, EM, EM2, r, s, p, q, g, y, oid, signature, Q, _oid, _signature, _Q;\n\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.t0 = algo;\n _context.next = _context.t0 === _enums2.default.publicKey.rsa_encrypt_sign ? 3 : _context.t0 === _enums2.default.publicKey.rsa_encrypt ? 3 : _context.t0 === _enums2.default.publicKey.rsa_sign ? 3 : _context.t0 === _enums2.default.publicKey.dsa ? 11 : _context.t0 === _enums2.default.publicKey.ecdsa ? 18 : _context.t0 === _enums2.default.publicKey.eddsa ? 22 : 26;\n break;\n\n case 3:\n m = msg_MPIs[0].toBN();\n n = pub_MPIs[0].toBN();\n e = pub_MPIs[1].toBN();\n _context.next = 8;\n return _public_key2.default.rsa.verify(m, n, e);\n\n case 8:\n EM = _context.sent;\n EM2 = _pkcs2.default.emsa.encode(hash_algo, _util2.default.Uint8Array_to_str(data), n.byteLength());\n return _context.abrupt('return', _util2.default.Uint8Array_to_hex(EM) === EM2);\n\n case 11:\n r = msg_MPIs[0].toBN();\n s = msg_MPIs[1].toBN();\n p = pub_MPIs[0].toBN();\n q = pub_MPIs[1].toBN();\n g = pub_MPIs[2].toBN();\n y = pub_MPIs[3].toBN();\n return _context.abrupt('return', _public_key2.default.dsa.verify(hash_algo, r, s, data, g, p, q, y));\n\n case 18:\n oid = pub_MPIs[0];\n signature = { r: msg_MPIs[0].toUint8Array(), s: msg_MPIs[1].toUint8Array() };\n Q = pub_MPIs[1].toUint8Array();\n return _context.abrupt('return', _public_key2.default.elliptic.ecdsa.verify(oid, hash_algo, signature, data, Q));\n\n case 22:\n _oid = pub_MPIs[0];\n // TODO refactor elliptic to accept Uint8Array\n // EdDSA signature params are expected in little-endian format\n\n _signature = { R: (0, _from2.default)(msg_MPIs[0].toUint8Array('le', 32)),\n S: (0, _from2.default)(msg_MPIs[1].toUint8Array('le', 32)) };\n _Q = (0, _from2.default)(pub_MPIs[1].toUint8Array('be', 33));\n return _context.abrupt('return', _public_key2.default.elliptic.eddsa.verify(_oid, hash_algo, _signature, data, _Q));\n\n case 26:\n throw new Error('Invalid signature algorithm.');\n\n case 27:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function verify(_x, _x2, _x3, _x4, _x5) {\n return _ref.apply(this, arguments);\n }\n\n return verify;\n }(),\n\n /**\n * Creates a signature on data using specified algorithms and private key parameters.\n * See {@link https://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1}\n * and {@link https://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4}\n * for public key and hash algorithms.\n * @param {module:enums.publicKey} algo Public key algorithm\n * @param {module:enums.hash} hash_algo Hash algorithm\n * @param {Array<module:type/mpi>} key_params Algorithm-specific public and private key parameters\n * @param {Uint8Array} data Data to be signed\n * @returns {Uint8Array} Signature\n * @async\n */\n sign: function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(algo, hash_algo, key_params, data) {\n var n, e, d, m, signature, p, q, g, x, _signature2, oid, _d, _signature3, _oid2, _d2, _signature4;\n\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.t0 = algo;\n _context2.next = _context2.t0 === _enums2.default.publicKey.rsa_encrypt_sign ? 3 : _context2.t0 === _enums2.default.publicKey.rsa_encrypt ? 3 : _context2.t0 === _enums2.default.publicKey.rsa_sign ? 3 : _context2.t0 === _enums2.default.publicKey.dsa ? 12 : _context2.t0 === _enums2.default.publicKey.elgamal ? 20 : _context2.t0 === _enums2.default.publicKey.ecdsa ? 21 : _context2.t0 === _enums2.default.publicKey.eddsa ? 27 : 33;\n break;\n\n case 3:\n n = key_params[0].toBN();\n e = key_params[1].toBN();\n d = key_params[2].toBN();\n\n data = _util2.default.Uint8Array_to_str(data);\n m = new _bn2.default(_pkcs2.default.emsa.encode(hash_algo, data, n.byteLength()), 16);\n _context2.next = 10;\n return _public_key2.default.rsa.sign(m, n, e, d);\n\n case 10:\n signature = _context2.sent;\n return _context2.abrupt('return', _util2.default.Uint8Array_to_MPI(signature));\n\n case 12:\n p = key_params[0].toBN();\n q = key_params[1].toBN();\n g = key_params[2].toBN();\n x = key_params[4].toBN();\n _context2.next = 18;\n return _public_key2.default.dsa.sign(hash_algo, data, g, p, q, x);\n\n case 18:\n _signature2 = _context2.sent;\n return _context2.abrupt('return', _util2.default.concatUint8Array([_util2.default.Uint8Array_to_MPI(_signature2.r), _util2.default.Uint8Array_to_MPI(_signature2.s)]));\n\n case 20:\n throw new Error('Signing with Elgamal is not defined in the OpenPGP standard.');\n\n case 21:\n oid = key_params[0];\n _d = key_params[2].toUint8Array();\n _context2.next = 25;\n return _public_key2.default.elliptic.ecdsa.sign(oid, hash_algo, data, _d);\n\n case 25:\n _signature3 = _context2.sent;\n return _context2.abrupt('return', _util2.default.concatUint8Array([_util2.default.Uint8Array_to_MPI(_signature3.r), _util2.default.Uint8Array_to_MPI(_signature3.s)]));\n\n case 27:\n _oid2 = key_params[0];\n _d2 = (0, _from2.default)(key_params[2].toUint8Array('be', 32));\n _context2.next = 31;\n return _public_key2.default.elliptic.eddsa.sign(_oid2, hash_algo, data, _d2);\n\n case 31:\n _signature4 = _context2.sent;\n return _context2.abrupt('return', _util2.default.concatUint8Array([_util2.default.Uint8Array_to_MPI(_signature4.R), _util2.default.Uint8Array_to_MPI(_signature4.S)]));\n\n case 33:\n throw new Error('Invalid signature algorithm.');\n\n case 34:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function sign(_x6, _x7, _x8, _x9) {\n return _ref2.apply(this, arguments);\n }\n\n return sign;\n }()\n}; /**\n * @fileoverview Provides functions for asymmetric signing and signature verification\n * @requires bn.js\n * @requires crypto/public_key\n * @requires crypto/pkcs1\n * @requires enums\n * @requires util\n * @module crypto/signature\n */\n\n},{\"../enums\":359,\"../util\":398,\"./pkcs1\":342,\"./public_key\":352,\"babel-runtime/core-js/array/from\":20,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42,\"bn.js\":44}],357:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _base = _dereq_('./base64.js');\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _enums = _dereq_('../enums.js');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _config = _dereq_('../config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Finds out which Ascii Armoring type is used. Throws error if unknown type.\n * @private\n * @param {String} text [String] ascii armored text\n * @returns {Integer} 0 = MESSAGE PART n of m\n * 1 = MESSAGE PART n\n * 2 = SIGNED MESSAGE\n * 3 = PGP MESSAGE\n * 4 = PUBLIC KEY BLOCK\n * 5 = PRIVATE KEY BLOCK\n * 6 = SIGNATURE\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires encoding/base64\n * @requires enums\n * @requires config\n * @requires util\n * @module encoding/armor\n */\n\nfunction getType(text) {\n var reHeader = /^-----BEGIN PGP (MESSAGE, PART \\d+\\/\\d+|MESSAGE, PART \\d+|SIGNED MESSAGE|MESSAGE|PUBLIC KEY BLOCK|PRIVATE KEY BLOCK|SIGNATURE)-----$\\n/m;\n\n var header = text.match(reHeader);\n\n if (!header) {\n throw new Error('Unknown ASCII armor type');\n }\n\n // BEGIN PGP MESSAGE, PART X/Y\n // Used for multi-part messages, where the armor is split amongst Y\n // parts, and this is the Xth part out of Y.\n if (/MESSAGE, PART \\d+\\/\\d+/.test(header[1])) {\n return _enums2.default.armor.multipart_section;\n } else\n // BEGIN PGP MESSAGE, PART X\n // Used for multi-part messages, where this is the Xth part of an\n // unspecified number of parts. Requires the MESSAGE-ID Armor\n // Header to be used.\n if (/MESSAGE, PART \\d+/.test(header[1])) {\n return _enums2.default.armor.multipart_last;\n } else\n // BEGIN PGP SIGNED MESSAGE\n if (/SIGNED MESSAGE/.test(header[1])) {\n return _enums2.default.armor.signed;\n } else\n // BEGIN PGP MESSAGE\n // Used for signed, encrypted, or compressed files.\n if (/MESSAGE/.test(header[1])) {\n return _enums2.default.armor.message;\n } else\n // BEGIN PGP PUBLIC KEY BLOCK\n // Used for armoring public keys.\n if (/PUBLIC KEY BLOCK/.test(header[1])) {\n return _enums2.default.armor.public_key;\n } else\n // BEGIN PGP PRIVATE KEY BLOCK\n // Used for armoring private keys.\n if (/PRIVATE KEY BLOCK/.test(header[1])) {\n return _enums2.default.armor.private_key;\n } else\n // BEGIN PGP SIGNATURE\n // Used for detached signatures, OpenPGP/MIME signatures, and\n // cleartext signatures. Note that PGP 2.x uses BEGIN PGP MESSAGE\n // for detached signatures.\n if (/SIGNATURE/.test(header[1])) {\n return _enums2.default.armor.signature;\n }\n}\n\n/**\n * Add additional information to the armor version of an OpenPGP binary\n * packet block.\n * @author Alex\n * @version 2011-12-16\n * @param {String} customComment (optional) additional comment to add to the armored string\n * @returns {String} The header information\n */\nfunction addheader(customComment) {\n var result = \"\";\n if (_config2.default.show_version) {\n result += \"Version: \" + _config2.default.versionstring + '\\r\\n';\n }\n if (_config2.default.show_comment) {\n result += \"Comment: \" + _config2.default.commentstring + '\\r\\n';\n }\n if (customComment) {\n result += \"Comment: \" + customComment + '\\r\\n';\n }\n result += '\\r\\n';\n return result;\n}\n\n/**\n * Calculates a checksum over the given data and returns it base64 encoded\n * @param {String} data Data to create a CRC-24 checksum for\n * @returns {String} Base64 encoded checksum\n */\nfunction getCheckSum(data) {\n var c = createcrc24(data);\n var bytes = new Uint8Array([c >> 16, c >> 8 & 0xFF, c & 0xFF]);\n return _base2.default.encode(bytes);\n}\n\n/**\n * Calculates the checksum over the given data and compares it with the\n * given base64 encoded checksum\n * @param {String} data Data to create a CRC-24 checksum for\n * @param {String} checksum Base64 encoded checksum\n * @returns {Boolean} True if the given checksum is correct; otherwise false\n */\nfunction verifyCheckSum(data, checksum) {\n var c = getCheckSum(data);\n var d = checksum;\n return c[0] === d[0] && c[1] === d[1] && c[2] === d[2] && c[3] === d[3];\n}\n/**\n * Internal function to calculate a CRC-24 checksum over a given string (data)\n * @param {String} data Data to create a CRC-24 checksum for\n * @returns {Integer} The CRC-24 checksum as number\n */\nvar crc_table = [0x00000000, 0x00864cfb, 0x018ad50d, 0x010c99f6, 0x0393e6e1, 0x0315aa1a, 0x021933ec, 0x029f7f17, 0x07a18139, 0x0727cdc2, 0x062b5434, 0x06ad18cf, 0x043267d8, 0x04b42b23, 0x05b8b2d5, 0x053efe2e, 0x0fc54e89, 0x0f430272, 0x0e4f9b84, 0x0ec9d77f, 0x0c56a868, 0x0cd0e493, 0x0ddc7d65, 0x0d5a319e, 0x0864cfb0, 0x08e2834b, 0x09ee1abd, 0x09685646, 0x0bf72951, 0x0b7165aa, 0x0a7dfc5c, 0x0afbb0a7, 0x1f0cd1e9, 0x1f8a9d12, 0x1e8604e4, 0x1e00481f, 0x1c9f3708, 0x1c197bf3, 0x1d15e205, 0x1d93aefe, 0x18ad50d0, 0x182b1c2b, 0x192785dd, 0x19a1c926, 0x1b3eb631, 0x1bb8faca, 0x1ab4633c, 0x1a322fc7, 0x10c99f60, 0x104fd39b, 0x11434a6d, 0x11c50696, 0x135a7981, 0x13dc357a, 0x12d0ac8c, 0x1256e077, 0x17681e59, 0x17ee52a2, 0x16e2cb54, 0x166487af, 0x14fbf8b8, 0x147db443, 0x15712db5, 0x15f7614e, 0x3e19a3d2, 0x3e9fef29, 0x3f9376df, 0x3f153a24, 0x3d8a4533, 0x3d0c09c8, 0x3c00903e, 0x3c86dcc5, 0x39b822eb, 0x393e6e10, 0x3832f7e6, 0x38b4bb1d, 0x3a2bc40a, 0x3aad88f1, 0x3ba11107, 0x3b275dfc, 0x31dced5b, 0x315aa1a0, 0x30563856, 0x30d074ad, 0x324f0bba, 0x32c94741, 0x33c5deb7, 0x3343924c, 0x367d6c62, 0x36fb2099, 0x37f7b96f, 0x3771f594, 0x35ee8a83, 0x3568c678, 0x34645f8e, 0x34e21375, 0x2115723b, 0x21933ec0, 0x209fa736, 0x2019ebcd, 0x228694da, 0x2200d821, 0x230c41d7, 0x238a0d2c, 0x26b4f302, 0x2632bff9, 0x273e260f, 0x27b86af4, 0x252715e3, 0x25a15918, 0x24adc0ee, 0x242b8c15, 0x2ed03cb2, 0x2e567049, 0x2f5ae9bf, 0x2fdca544, 0x2d43da53, 0x2dc596a8, 0x2cc90f5e, 0x2c4f43a5, 0x2971bd8b, 0x29f7f170, 0x28fb6886, 0x287d247d, 0x2ae25b6a, 0x2a641791, 0x2b688e67, 0x2beec29c, 0x7c3347a4, 0x7cb50b5f, 0x7db992a9, 0x7d3fde52, 0x7fa0a145, 0x7f26edbe, 0x7e2a7448, 0x7eac38b3, 0x7b92c69d, 0x7b148a66, 0x7a181390, 0x7a9e5f6b, 0x7801207c, 0x78876c87, 0x798bf571, 0x790db98a, 0x73f6092d, 0x737045d6, 0x727cdc20, 0x72fa90db, 0x7065efcc, 0x70e3a337, 0x71ef3ac1, 0x7169763a, 0x74578814, 0x74d1c4ef, 0x75dd5d19, 0x755b11e2, 0x77c46ef5, 0x7742220e, 0x764ebbf8, 0x76c8f703, 0x633f964d, 0x63b9dab6, 0x62b54340, 0x62330fbb, 0x60ac70ac, 0x602a3c57, 0x6126a5a1, 0x61a0e95a, 0x649e1774, 0x64185b8f, 0x6514c279, 0x65928e82, 0x670df195, 0x678bbd6e, 0x66872498, 0x66016863, 0x6cfad8c4, 0x6c7c943f, 0x6d700dc9, 0x6df64132, 0x6f693e25, 0x6fef72de, 0x6ee3eb28, 0x6e65a7d3, 0x6b5b59fd, 0x6bdd1506, 0x6ad18cf0, 0x6a57c00b, 0x68c8bf1c, 0x684ef3e7, 0x69426a11, 0x69c426ea, 0x422ae476, 0x42aca88d, 0x43a0317b, 0x43267d80, 0x41b90297, 0x413f4e6c, 0x4033d79a, 0x40b59b61, 0x458b654f, 0x450d29b4, 0x4401b042, 0x4487fcb9, 0x461883ae, 0x469ecf55, 0x479256a3, 0x47141a58, 0x4defaaff, 0x4d69e604, 0x4c657ff2, 0x4ce33309, 0x4e7c4c1e, 0x4efa00e5, 0x4ff69913, 0x4f70d5e8, 0x4a4e2bc6, 0x4ac8673d, 0x4bc4fecb, 0x4b42b230, 0x49ddcd27, 0x495b81dc, 0x4857182a, 0x48d154d1, 0x5d26359f, 0x5da07964, 0x5cace092, 0x5c2aac69, 0x5eb5d37e, 0x5e339f85, 0x5f3f0673, 0x5fb94a88, 0x5a87b4a6, 0x5a01f85d, 0x5b0d61ab, 0x5b8b2d50, 0x59145247, 0x59921ebc, 0x589e874a, 0x5818cbb1, 0x52e37b16, 0x526537ed, 0x5369ae1b, 0x53efe2e0, 0x51709df7, 0x51f6d10c, 0x50fa48fa, 0x507c0401, 0x5542fa2f, 0x55c4b6d4, 0x54c82f22, 0x544e63d9, 0x56d11cce, 0x56575035, 0x575bc9c3, 0x57dd8538];\n\nfunction createcrc24(input) {\n var crc = 0xB704CE;\n\n for (var index = 0; index < input.length; index++) {\n crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index]) & 0xff];\n }\n return crc & 0xffffff;\n}\n\n/**\n * Splits a message into two parts, the headers and the body. This is an internal function\n * @param {String} text OpenPGP armored message part\n * @returns {Object} An object with attribute \"headers\" containing the headers\n * and an attribute \"body\" containing the body.\n */\nfunction splitHeaders(text) {\n // empty line with whitespace characters\n var reEmptyLine = /^[ \\f\\r\\t\\u00a0\\u2000-\\u200a\\u202f\\u205f\\u3000]*\\n/m;\n var headers = '';\n var body = text;\n\n var matchResult = reEmptyLine.exec(text);\n\n if (matchResult !== null) {\n headers = text.slice(0, matchResult.index);\n body = text.slice(matchResult.index + matchResult[0].length);\n } else {\n throw new Error('Mandatory blank line missing between armor headers and armor data');\n }\n\n headers = headers.split('\\n');\n // remove empty entry\n headers.pop();\n\n return { headers: headers, body: body };\n}\n\n/**\n * Verify armored headers. RFC4880, section 6.3: \"OpenPGP should consider improperly formatted\n * Armor Headers to be corruption of the ASCII Armor.\"\n * @private\n * @param {Array<String>} headers Armor headers\n */\nfunction verifyHeaders(headers) {\n for (var i = 0; i < headers.length; i++) {\n if (!/^([^\\s:]|[^\\s:][^:]*[^\\s:]): .+$/.test(headers[i])) {\n throw new Error('Improperly formatted armor header: ' + headers[i]);\n }\n if (!/^(Version|Comment|MessageID|Hash|Charset): .+$/.test(headers[i])) {\n _util2.default.print_debug_error(new Error('Unknown header: ' + headers[i]));\n }\n }\n}\n\n/**\n * Splits a message into two parts, the body and the checksum. This is an internal function\n * @param {String} text OpenPGP armored message part\n * @returns {Object} An object with attribute \"body\" containing the body\n * and an attribute \"checksum\" containing the checksum.\n */\nfunction splitChecksum(text) {\n text = text.trim();\n var body = text;\n var checksum = \"\";\n\n var lastEquals = text.lastIndexOf(\"=\");\n\n if (lastEquals >= 0 && lastEquals !== text.length - 1) {\n // '=' as the last char means no checksum\n body = text.slice(0, lastEquals);\n checksum = text.slice(lastEquals + 1).substr(0, 4);\n }\n\n return { body: body, checksum: checksum };\n}\n\n/**\n * DeArmor an OpenPGP armored message; verify the checksum and return\n * the encoded bytes\n * @param {String} text OpenPGP armored message\n * @returns {Object} An object with attribute \"text\" containing the message text,\n * an attribute \"data\" containing the bytes and \"type\" for the ASCII armor type\n * @static\n */\nfunction dearmor(text) {\n var reSplit = /^-----[^-]+-----$\\n/m;\n\n // trim string and remove trailing whitespace at end of lines\n text = text.trim().replace(/[\\t\\r ]+\\n/g, '\\n');\n\n var type = getType(text);\n\n text = text + \"\\n\";\n var splittext = text.split(reSplit);\n\n // IE has a bug in split with a re. If the pattern matches the beginning of the\n // string it doesn't create an empty array element 0. So we need to detect this\n // so we know the index of the data we are interested in.\n var indexBase = 1;\n\n var result = void 0;\n var checksum = void 0;\n var msg = void 0;\n\n if (text.search(reSplit) !== splittext[0].length) {\n indexBase = 0;\n }\n\n if (type !== 2) {\n msg = splitHeaders(splittext[indexBase]);\n var msg_sum = splitChecksum(msg.body);\n\n result = {\n data: _base2.default.decode(msg_sum.body),\n headers: msg.headers,\n type: type\n };\n\n checksum = msg_sum.checksum;\n } else {\n // Reverse dash-escaping for msg\n msg = splitHeaders(splittext[indexBase].replace(/^- /mg, ''));\n var sig = splitHeaders(splittext[indexBase + 1].replace(/^- /mg, ''));\n verifyHeaders(sig.headers);\n var sig_sum = splitChecksum(sig.body);\n\n result = {\n text: msg.body.replace(/\\n$/, '').replace(/\\n/g, \"\\r\\n\"),\n data: _base2.default.decode(sig_sum.body),\n headers: msg.headers,\n type: type\n };\n\n checksum = sig_sum.checksum;\n }\n\n if (!verifyCheckSum(result.data, checksum) && (checksum || _config2.default.checksum_required)) {\n // will NOT throw error if checksum is empty AND checksum is not required (GPG compatibility)\n throw new Error(\"Ascii armor integrity check on message failed: '\" + checksum + \"' should be '\" + getCheckSum(result.data) + \"'\");\n }\n\n verifyHeaders(result.headers);\n\n return result;\n}\n\n/**\n * Armor an OpenPGP binary packet block\n * @param {Integer} messagetype type of the message\n * @param body\n * @param {Integer} partindex\n * @param {Integer} parttotal\n * @param {String} customComment (optional) additional comment to add to the armored string\n * @returns {String} Armored text\n * @static\n */\nfunction armor(messagetype, body, partindex, parttotal, customComment) {\n var result = [];\n switch (messagetype) {\n case _enums2.default.armor.multipart_section:\n result.push(\"-----BEGIN PGP MESSAGE, PART \" + partindex + \"/\" + parttotal + \"-----\\r\\n\");\n result.push(addheader(customComment));\n result.push(_base2.default.encode(body));\n result.push(\"\\r\\n=\" + getCheckSum(body) + \"\\r\\n\");\n result.push(\"-----END PGP MESSAGE, PART \" + partindex + \"/\" + parttotal + \"-----\\r\\n\");\n break;\n case _enums2.default.armor.multipart_last:\n result.push(\"-----BEGIN PGP MESSAGE, PART \" + partindex + \"-----\\r\\n\");\n result.push(addheader(customComment));\n result.push(_base2.default.encode(body));\n result.push(\"\\r\\n=\" + getCheckSum(body) + \"\\r\\n\");\n result.push(\"-----END PGP MESSAGE, PART \" + partindex + \"-----\\r\\n\");\n break;\n case _enums2.default.armor.signed:\n result.push(\"\\r\\n-----BEGIN PGP SIGNED MESSAGE-----\\r\\n\");\n result.push(\"Hash: \" + body.hash + \"\\r\\n\\r\\n\");\n result.push(body.text.replace(/^-/mg, \"- -\"));\n result.push(\"\\r\\n-----BEGIN PGP SIGNATURE-----\\r\\n\");\n result.push(addheader(customComment));\n result.push(_base2.default.encode(body.data));\n result.push(\"\\r\\n=\" + getCheckSum(body.data) + \"\\r\\n\");\n result.push(\"-----END PGP SIGNATURE-----\\r\\n\");\n break;\n case _enums2.default.armor.message:\n result.push(\"-----BEGIN PGP MESSAGE-----\\r\\n\");\n result.push(addheader(customComment));\n result.push(_base2.default.encode(body));\n result.push(\"\\r\\n=\" + getCheckSum(body) + \"\\r\\n\");\n result.push(\"-----END PGP MESSAGE-----\\r\\n\");\n break;\n case _enums2.default.armor.public_key:\n result.push(\"-----BEGIN PGP PUBLIC KEY BLOCK-----\\r\\n\");\n result.push(addheader(customComment));\n result.push(_base2.default.encode(body));\n result.push(\"\\r\\n=\" + getCheckSum(body) + \"\\r\\n\");\n result.push(\"-----END PGP PUBLIC KEY BLOCK-----\\r\\n\\r\\n\");\n break;\n case _enums2.default.armor.private_key:\n result.push(\"-----BEGIN PGP PRIVATE KEY BLOCK-----\\r\\n\");\n result.push(addheader(customComment));\n result.push(_base2.default.encode(body));\n result.push(\"\\r\\n=\" + getCheckSum(body) + \"\\r\\n\");\n result.push(\"-----END PGP PRIVATE KEY BLOCK-----\\r\\n\");\n break;\n case _enums2.default.armor.signature:\n result.push(\"-----BEGIN PGP SIGNATURE-----\\r\\n\");\n result.push(addheader(customComment));\n result.push(_base2.default.encode(body));\n result.push(\"\\r\\n=\" + getCheckSum(body) + \"\\r\\n\");\n result.push(\"-----END PGP SIGNATURE-----\\r\\n\");\n break;\n }\n\n return result.join('');\n}\n\nexports.default = {\n encode: armor,\n decode: dearmor\n};\n\n},{\"../config\":325,\"../enums.js\":359,\"../util\":398,\"./base64.js\":358}],358:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n/* OpenPGP radix-64/base64 string encoding/decoding\n * Copyright 2005 Herbert Hanewinkel, www.haneWIN.de\n * version 1.0, check www.haneWIN.de for the latest version\n *\n * This software is provided as-is, without express or implied warranty.\n * Permission to use, copy, modify, distribute or sell this software, with or\n * without fee, for any purpose and by any individual or organization, is hereby\n * granted, provided that the above copyright notice and this paragraph appear\n * in all copies. Distribution as a part of an application or binary must\n * include the above copyright notice in the documentation and/or other materials\n * provided with the application or distribution.\n */\n\n/**\n * @module encoding/base64\n */\n\nvar b64s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; // Standard radix-64\nvar b64u = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'; // URL-safe radix-64\n\n/**\n * Convert binary array to radix-64\n * @param {Uint8Array} t Uint8Array to convert\n * @param {bool} u if true, output is URL-safe\n * @returns {string} radix-64 version of input string\n * @static\n */\nfunction s2r(t) {\n var u = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n // TODO check btoa alternative\n var b64 = u ? b64u : b64s;\n var a = void 0;\n var c = void 0;\n var n = void 0;\n var r = [];\n var l = 0;\n var s = 0;\n var tl = t.length;\n\n for (n = 0; n < tl; n++) {\n c = t[n];\n if (s === 0) {\n r.push(b64.charAt(c >> 2 & 63));\n a = (c & 3) << 4;\n } else if (s === 1) {\n r.push(b64.charAt(a | c >> 4 & 15));\n a = (c & 15) << 2;\n } else if (s === 2) {\n r.push(b64.charAt(a | c >> 6 & 3));\n l += 1;\n if (l % 60 === 0 && !u) {\n r.push(\"\\n\");\n }\n r.push(b64.charAt(c & 63));\n }\n l += 1;\n if (l % 60 === 0 && !u) {\n r.push(\"\\n\");\n }\n\n s += 1;\n if (s === 3) {\n s = 0;\n }\n }\n if (s > 0) {\n r.push(b64.charAt(a));\n l += 1;\n if (l % 60 === 0 && !u) {\n r.push(\"\\n\");\n }\n if (!u) {\n r.push('=');\n l += 1;\n }\n }\n if (s === 1 && !u) {\n if (l % 60 === 0 && !u) {\n r.push(\"\\n\");\n }\n r.push('=');\n }\n return r.join('');\n}\n\n/**\n * Convert radix-64 to binary array\n * @param {String} t radix-64 string to convert\n * @param {bool} u if true, input is interpreted as URL-safe\n * @returns {Uint8Array} binary array version of input string\n * @static\n */\nfunction r2s(t, u) {\n // TODO check atob alternative\n var b64 = u ? b64u : b64s;\n var c = void 0;\n var n = void 0;\n var r = [];\n var s = 0;\n var a = 0;\n var tl = t.length;\n\n for (n = 0; n < tl; n++) {\n c = b64.indexOf(t.charAt(n));\n if (c >= 0) {\n if (s) {\n r.push(a | c >> 6 - s & 255);\n }\n s = s + 2 & 7;\n a = c << s & 255;\n }\n }\n return new Uint8Array(r);\n}\n\nexports.default = {\n encode: s2r,\n decode: r2s\n};\n\n},{}],359:[function(_dereq_,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _slicedToArray2 = _dereq_(\"babel-runtime/helpers/slicedToArray\");\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nvar _entries = _dereq_(\"babel-runtime/core-js/object/entries\");\n\nvar _entries2 = _interopRequireDefault(_entries);\n\nvar _symbol = _dereq_(\"babel-runtime/core-js/symbol\");\n\nvar _symbol2 = _interopRequireDefault(_symbol);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @module enums\n */\n\nvar byValue = (0, _symbol2.default)('byValue');\n\nexports.default = {\n\n /** Maps curve names under various standards to one\n * @see {@link https://wiki.gnupg.org/ECC|ECC - GnuPG wiki}\n * @enum {String}\n * @readonly\n */\n curve: {\n /** NIST P-256 Curve */\n \"p256\": \"p256\",\n \"P-256\": \"p256\",\n \"secp256r1\": \"p256\",\n \"prime256v1\": \"p256\",\n \"1.2.840.10045.3.1.7\": \"p256\",\n \"2a8648ce3d030107\": \"p256\",\n \"2A8648CE3D030107\": \"p256\",\n\n /** NIST P-384 Curve */\n \"p384\": \"p384\",\n \"P-384\": \"p384\",\n \"secp384r1\": \"p384\",\n \"1.3.132.0.34\": \"p384\",\n \"2b81040022\": \"p384\",\n \"2B81040022\": \"p384\",\n\n /** NIST P-521 Curve */\n \"p521\": \"p521\",\n \"P-521\": \"p521\",\n \"secp521r1\": \"p521\",\n \"1.3.132.0.35\": \"p521\",\n \"2b81040023\": \"p521\",\n \"2B81040023\": \"p521\",\n\n /** SECG SECP256k1 Curve */\n \"secp256k1\": \"secp256k1\",\n \"1.3.132.0.10\": \"secp256k1\",\n \"2b8104000a\": \"secp256k1\",\n \"2B8104000A\": \"secp256k1\",\n\n /** Ed25519 */\n \"ED25519\": \"ed25519\",\n \"ed25519\": \"ed25519\",\n \"Ed25519\": \"ed25519\",\n \"1.3.6.1.4.1.11591.15.1\": \"ed25519\",\n \"2b06010401da470f01\": \"ed25519\",\n \"2B06010401DA470F01\": \"ed25519\",\n\n /** Curve25519 */\n \"X25519\": \"curve25519\",\n \"cv25519\": \"curve25519\",\n \"curve25519\": \"curve25519\",\n \"Curve25519\": \"curve25519\",\n \"1.3.6.1.4.1.3029.1.5.1\": \"curve25519\",\n \"2b060104019755010501\": \"curve25519\",\n \"2B060104019755010501\": \"curve25519\",\n\n /** BrainpoolP256r1 Curve */\n \"brainpoolP256r1\": \"brainpoolP256r1\",\n \"1.3.36.3.3.2.8.1.1.7\": \"brainpoolP256r1\",\n \"2b2403030208010107\": \"brainpoolP256r1\",\n \"2B2403030208010107\": \"brainpoolP256r1\",\n\n /** BrainpoolP384r1 Curve */\n \"brainpoolP384r1\": \"brainpoolP384r1\",\n \"1.3.36.3.3.2.8.1.1.11\": \"brainpoolP384r1\",\n \"2b240303020801010b\": \"brainpoolP384r1\",\n \"2B240303020801010B\": \"brainpoolP384r1\",\n\n /** BrainpoolP512r1 Curve */\n \"brainpoolP512r1\": \"brainpoolP512r1\",\n \"1.3.36.3.3.2.8.1.1.13\": \"brainpoolP512r1\",\n \"2b240303020801010d\": \"brainpoolP512r1\",\n \"2B240303020801010D\": \"brainpoolP512r1\"\n },\n\n /** A string to key specifier type\n * @enum {Integer}\n * @readonly\n */\n s2k: {\n simple: 0,\n salted: 1,\n iterated: 3,\n gnu: 101\n },\n\n /** {@link https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-04#section-9.1|RFC4880bis-04, section 9.1}\n * @enum {Integer}\n * @readonly\n */\n publicKey: {\n /** RSA (Encrypt or Sign) [HAC] */\n rsa_encrypt_sign: 1,\n /** RSA (Encrypt only) [HAC] */\n rsa_encrypt: 2,\n /** RSA (Sign only) [HAC] */\n rsa_sign: 3,\n /** Elgamal (Encrypt only) [ELGAMAL] [HAC] */\n elgamal: 16,\n /** DSA (Sign only) [FIPS186] [HAC] */\n dsa: 17,\n /** ECDH (Encrypt only) [RFC6637] */\n ecdh: 18,\n /** ECDSA (Sign only) [RFC6637] */\n ecdsa: 19,\n /** EdDSA (Sign only)\n * [{@link https://tools.ietf.org/html/draft-koch-eddsa-for-openpgp-04|Draft RFC}] */\n eddsa: 22,\n /** Reserved for AEDH */\n aedh: 23,\n /** Reserved for AEDSA */\n aedsa: 24\n },\n\n /** {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC4880, section 9.2}\n * @enum {Integer}\n * @readonly\n */\n symmetric: {\n plaintext: 0,\n /** Not implemented! */\n idea: 1,\n tripledes: 2,\n cast5: 3,\n blowfish: 4,\n aes128: 7,\n aes192: 8,\n aes256: 9,\n twofish: 10\n },\n\n /** {@link https://tools.ietf.org/html/rfc4880#section-9.3|RFC4880, section 9.3}\n * @enum {Integer}\n * @readonly\n */\n compression: {\n uncompressed: 0,\n /** RFC1951 */\n zip: 1,\n /** RFC1950 */\n zlib: 2,\n bzip2: 3\n },\n\n /** {@link https://tools.ietf.org/html/rfc4880#section-9.4|RFC4880, section 9.4}\n * @enum {Integer}\n * @readonly\n */\n hash: {\n md5: 1,\n sha1: 2,\n ripemd: 3,\n sha256: 8,\n sha384: 9,\n sha512: 10,\n sha224: 11\n },\n\n /** A list of hash names as accepted by webCrypto functions.\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest|Parameters, algo}\n * @enum {String}\n */\n webHash: {\n 'SHA-1': 2,\n 'SHA-256': 8,\n 'SHA-384': 9,\n 'SHA-512': 10\n },\n\n /** {@link https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-04#section-9.6|RFC4880bis-04, section 9.6}\n * @enum {Integer}\n * @readonly\n */\n aead: {\n eax: 1,\n ocb: 2,\n experimental_gcm: 100 // Private algorithm\n },\n\n /** A list of packet types and numeric tags associated with them.\n * @enum {Integer}\n * @readonly\n */\n packet: {\n publicKeyEncryptedSessionKey: 1,\n signature: 2,\n symEncryptedSessionKey: 3,\n onePassSignature: 4,\n secretKey: 5,\n publicKey: 6,\n secretSubkey: 7,\n compressed: 8,\n symmetricallyEncrypted: 9,\n marker: 10,\n literal: 11,\n trust: 12,\n userid: 13,\n publicSubkey: 14,\n userAttribute: 17,\n symEncryptedIntegrityProtected: 18,\n modificationDetectionCode: 19,\n symEncryptedAEADProtected: 20 // see IETF draft: https://tools.ietf.org/html/draft-ford-openpgp-format-00#section-2.1\n },\n\n /** Data types in the literal packet\n * @enum {Integer}\n * @readonly\n */\n literal: {\n /** Binary data 'b' */\n binary: 'b'.charCodeAt(),\n /** Text data 't' */\n text: 't'.charCodeAt(),\n /** Utf8 data 'u' */\n utf8: 'u'.charCodeAt(),\n /** MIME message body part 'm' */\n mime: 'm'.charCodeAt()\n },\n\n /** One pass signature packet type\n * @enum {Integer}\n * @readonly\n */\n signature: {\n /** 0x00: Signature of a binary document. */\n binary: 0,\n /** 0x01: Signature of a canonical text document.\n *\n * Canonicalyzing the document by converting line endings. */\n text: 1,\n /** 0x02: Standalone signature.\n *\n * This signature is a signature of only its own subpacket contents.\n * It is calculated identically to a signature over a zero-lengh\n * binary document. Note that it doesn't make sense to have a V3\n * standalone signature. */\n standalone: 2,\n /** 0x10: Generic certification of a User ID and Public-Key packet.\n *\n * The issuer of this certification does not make any particular\n * assertion as to how well the certifier has checked that the owner\n * of the key is in fact the person described by the User ID. */\n cert_generic: 16,\n /** 0x11: Persona certification of a User ID and Public-Key packet.\n *\n * The issuer of this certification has not done any verification of\n * the claim that the owner of this key is the User ID specified. */\n cert_persona: 17,\n /** 0x12: Casual certification of a User ID and Public-Key packet.\n *\n * The issuer of this certification has done some casual\n * verification of the claim of identity. */\n cert_casual: 18,\n /** 0x13: Positive certification of a User ID and Public-Key packet.\n *\n * The issuer of this certification has done substantial\n * verification of the claim of identity.\n *\n * Most OpenPGP implementations make their \"key signatures\" as 0x10\n * certifications. Some implementations can issue 0x11-0x13\n * certifications, but few differentiate between the types. */\n cert_positive: 19,\n /** 0x30: Certification revocation signature\n *\n * This signature revokes an earlier User ID certification signature\n * (signature class 0x10 through 0x13) or direct-key signature\n * (0x1F). It should be issued by the same key that issued the\n * revoked signature or an authorized revocation key. The signature\n * is computed over the same data as the certificate that it\n * revokes, and should have a later creation date than that\n * certificate. */\n cert_revocation: 48,\n /** 0x18: Subkey Binding Signature\n *\n * This signature is a statement by the top-level signing key that\n * indicates that it owns the subkey. This signature is calculated\n * directly on the primary key and subkey, and not on any User ID or\n * other packets. A signature that binds a signing subkey MUST have\n * an Embedded Signature subpacket in this binding signature that\n * contains a 0x19 signature made by the signing subkey on the\n * primary key and subkey. */\n subkey_binding: 24,\n /** 0x19: Primary Key Binding Signature\n *\n * This signature is a statement by a signing subkey, indicating\n * that it is owned by the primary key and subkey. This signature\n * is calculated the same way as a 0x18 signature: directly on the\n * primary key and subkey, and not on any User ID or other packets.\n *\n * When a signature is made over a key, the hash data starts with the\n * octet 0x99, followed by a two-octet length of the key, and then body\n * of the key packet. (Note that this is an old-style packet header for\n * a key packet with two-octet length.) A subkey binding signature\n * (type 0x18) or primary key binding signature (type 0x19) then hashes\n * the subkey using the same format as the main key (also using 0x99 as\n * the first octet). */\n key_binding: 25,\n /** 0x1F: Signature directly on a key\n *\n * This signature is calculated directly on a key. It binds the\n * information in the Signature subpackets to the key, and is\n * appropriate to be used for subpackets that provide information\n * about the key, such as the Revocation Key subpacket. It is also\n * appropriate for statements that non-self certifiers want to make\n * about the key itself, rather than the binding between a key and a\n * name. */\n key: 31,\n /** 0x20: Key revocation signature\n *\n * The signature is calculated directly on the key being revoked. A\n * revoked key is not to be used. Only revocation signatures by the\n * key being revoked, or by an authorized revocation key, should be\n * considered valid revocation signatures.a */\n key_revocation: 32,\n /** 0x28: Subkey revocation signature\n *\n * The signature is calculated directly on the subkey being revoked.\n * A revoked subkey is not to be used. Only revocation signatures\n * by the top-level signature key that is bound to this subkey, or\n * by an authorized revocation key, should be considered valid\n * revocation signatures.\n *\n * Key revocation signatures (types 0x20 and 0x28)\n * hash only the key being revoked. */\n subkey_revocation: 40,\n /** 0x40: Timestamp signature.\n * This signature is only meaningful for the timestamp contained in\n * it. */\n timestamp: 64,\n /** 0x50: Third-Party Confirmation signature.\n *\n * This signature is a signature over some other OpenPGP Signature\n * packet(s). It is analogous to a notary seal on the signed data.\n * A third-party signature SHOULD include Signature Target\n * subpacket(s) to give easy identification. Note that we really do\n * mean SHOULD. There are plausible uses for this (such as a blind\n * party that only sees the signature, not the key or source\n * document) that cannot include a target subpacket. */\n third_party: 80\n },\n\n /** Signature subpacket type\n * @enum {Integer}\n * @readonly\n */\n signatureSubpacket: {\n signature_creation_time: 2,\n signature_expiration_time: 3,\n exportable_certification: 4,\n trust_signature: 5,\n regular_expression: 6,\n revocable: 7,\n key_expiration_time: 9,\n placeholder_backwards_compatibility: 10,\n preferred_symmetric_algorithms: 11,\n revocation_key: 12,\n issuer: 16,\n notation_data: 20,\n preferred_hash_algorithms: 21,\n preferred_compression_algorithms: 22,\n key_server_preferences: 23,\n preferred_key_server: 24,\n primary_user_id: 25,\n policy_uri: 26,\n key_flags: 27,\n signers_user_id: 28,\n reason_for_revocation: 29,\n features: 30,\n signature_target: 31,\n embedded_signature: 32,\n issuer_fingerprint: 33,\n preferred_aead_algorithms: 34\n },\n\n /** Key flags\n * @enum {Integer}\n * @readonly\n */\n keyFlags: {\n /** 0x01 - This key may be used to certify other keys. */\n certify_keys: 1,\n /** 0x02 - This key may be used to sign data. */\n sign_data: 2,\n /** 0x04 - This key may be used to encrypt communications. */\n encrypt_communication: 4,\n /** 0x08 - This key may be used to encrypt storage. */\n encrypt_storage: 8,\n /** 0x10 - The private component of this key may have been split\n * by a secret-sharing mechanism. */\n split_private_key: 16,\n /** 0x20 - This key may be used for authentication. */\n authentication: 32,\n /** 0x80 - The private component of this key may be in the\n * possession of more than one person. */\n shared_private_key: 128\n },\n\n /** Key status\n * @enum {Integer}\n * @readonly\n */\n keyStatus: {\n invalid: 0,\n expired: 1,\n revoked: 2,\n valid: 3,\n no_self_cert: 4\n },\n\n /** Armor type\n * @enum {Integer}\n * @readonly\n */\n armor: {\n multipart_section: 0,\n multipart_last: 1,\n signed: 2,\n message: 3,\n public_key: 4,\n private_key: 5,\n signature: 6\n },\n\n /** {@link https://tools.ietf.org/html/rfc4880#section-5.2.3.23|RFC4880, section 5.2.3.23}\n * @enum {Integer}\n * @readonly\n */\n reasonForRevocation: {\n /** No reason specified (key revocations or cert revocations) */\n no_reason: 0,\n /** Key is superseded (key revocations) */\n key_superseded: 1,\n /** Key material has been compromised (key revocations) */\n key_compromised: 2,\n /** Key is retired and no longer used (key revocations) */\n key_retired: 3,\n /** User ID information is no longer valid (cert revocations) */\n userid_invalid: 32\n },\n\n /** {@link https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-04#section-5.2.3.25|RFC4880bis-04, section 5.2.3.25}\n * @enum {Integer}\n * @readonly\n */\n features: {\n /** 0x01 - Modification Detection (packets 18 and 19) */\n modification_detection: 1,\n /** 0x02 - AEAD Encrypted Data Packet (packet 20) and version 5\n * Symmetric-Key Encrypted Session Key Packets (packet 3) */\n aead: 2,\n /** 0x04 - Version 5 Public-Key Packet format and corresponding new\n * fingerprint format */\n v5_keys: 4\n },\n\n /** Asserts validity and converts from string/integer to integer. */\n write: function write(type, e) {\n if (typeof e === 'number') {\n e = this.read(type, e);\n }\n\n if (type[e] !== undefined) {\n return type[e];\n }\n\n throw new Error('Invalid enum value.');\n },\n\n /** Converts from an integer to string. */\n read: function read(type, e) {\n if (!type[byValue]) {\n type[byValue] = [];\n (0, _entries2.default)(type).forEach(function (_ref) {\n var _ref2 = (0, _slicedToArray3.default)(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n type[byValue][value] = key;\n });\n }\n\n if (type[byValue][e] !== undefined) {\n return type[byValue][e];\n }\n\n throw new Error('Invalid enum value.');\n }\n\n};\n\n},{\"babel-runtime/core-js/object/entries\":27,\"babel-runtime/core-js/symbol\":33,\"babel-runtime/helpers/slicedToArray\":40}],360:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _config = _dereq_('./config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Initialize the HKP client and configure it with the key server url and fetch function.\n * @constructor\n * @param {String} keyServerBaseUrl (optional) The HKP key server base url including\n * the protocol to use e.g. https://pgp.mit.edu\n */\nfunction HKP(keyServerBaseUrl) {\n this._baseUrl = keyServerBaseUrl || _config2.default.keyserver;\n this._fetch = typeof window !== 'undefined' ? window.fetch : _dereq_('node-fetch');\n}\n\n/**\n * Search for a public key on the key server either by key ID or part of the user ID.\n * @param {String} options.keyID The long public key ID.\n * @param {String} options.query This can be any part of the key user ID such as name\n * or email address.\n * @returns {Promise<String>} The ascii armored public key.\n * @async\n */\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2015 Tankred Hase\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview This class implements a client for the OpenPGP HTTP Keyserver Protocol (HKP)\n * in order to lookup and upload keys on standard public key servers.\n * @module hkp\n */\n\nHKP.prototype.lookup = function (options) {\n var uri = this._baseUrl + '/pks/lookup?op=get&options=mr&search=';\n var fetch = this._fetch;\n\n if (options.keyId) {\n uri += '0x' + encodeURIComponent(options.keyId);\n } else if (options.query) {\n uri += encodeURIComponent(options.query);\n } else {\n throw new Error('You must provide a query parameter!');\n }\n\n return fetch(uri).then(function (response) {\n if (response.status === 200) {\n return response.text();\n }\n }).then(function (publicKeyArmored) {\n if (!publicKeyArmored || publicKeyArmored.indexOf('-----END PGP PUBLIC KEY BLOCK-----') < 0) {\n return;\n }\n return publicKeyArmored.trim();\n });\n};\n\n/**\n * Upload a public key to the server.\n * @param {String} publicKeyArmored An ascii armored public key to be uploaded.\n * @returns {Promise}\n * @async\n */\nHKP.prototype.upload = function (publicKeyArmored) {\n var uri = this._baseUrl + '/pks/add';\n var fetch = this._fetch;\n\n return fetch(uri, {\n method: 'post',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'\n },\n body: 'keytext=' + encodeURIComponent(publicKeyArmored)\n });\n};\n\nexports.default = HKP;\n\n},{\"./config\":325,\"node-fetch\":\"node-fetch\"}],361:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.WKD = exports.HKP = exports.AsyncProxy = exports.Keyring = exports.crypto = exports.config = exports.enums = exports.armor = exports.OID = exports.KDFParams = exports.ECDHSymmetricKey = exports.Keyid = exports.S2K = exports.MPI = exports.packet = exports.util = exports.cleartext = exports.message = exports.signature = exports.key = exports.destroyWorker = exports.getWorker = exports.initWorker = exports.decryptSessionKeys = exports.encryptSessionKey = exports.decryptKey = exports.revokeKey = exports.reformatKey = exports.generateKey = exports.verify = exports.sign = exports.decrypt = exports.encrypt = undefined;\n\nvar _openpgp = _dereq_('./openpgp');\n\nObject.defineProperty(exports, 'encrypt', {\n enumerable: true,\n get: function get() {\n return _openpgp.encrypt;\n }\n});\nObject.defineProperty(exports, 'decrypt', {\n enumerable: true,\n get: function get() {\n return _openpgp.decrypt;\n }\n});\nObject.defineProperty(exports, 'sign', {\n enumerable: true,\n get: function get() {\n return _openpgp.sign;\n }\n});\nObject.defineProperty(exports, 'verify', {\n enumerable: true,\n get: function get() {\n return _openpgp.verify;\n }\n});\nObject.defineProperty(exports, 'generateKey', {\n enumerable: true,\n get: function get() {\n return _openpgp.generateKey;\n }\n});\nObject.defineProperty(exports, 'reformatKey', {\n enumerable: true,\n get: function get() {\n return _openpgp.reformatKey;\n }\n});\nObject.defineProperty(exports, 'revokeKey', {\n enumerable: true,\n get: function get() {\n return _openpgp.revokeKey;\n }\n});\nObject.defineProperty(exports, 'decryptKey', {\n enumerable: true,\n get: function get() {\n return _openpgp.decryptKey;\n }\n});\nObject.defineProperty(exports, 'encryptSessionKey', {\n enumerable: true,\n get: function get() {\n return _openpgp.encryptSessionKey;\n }\n});\nObject.defineProperty(exports, 'decryptSessionKeys', {\n enumerable: true,\n get: function get() {\n return _openpgp.decryptSessionKeys;\n }\n});\nObject.defineProperty(exports, 'initWorker', {\n enumerable: true,\n get: function get() {\n return _openpgp.initWorker;\n }\n});\nObject.defineProperty(exports, 'getWorker', {\n enumerable: true,\n get: function get() {\n return _openpgp.getWorker;\n }\n});\nObject.defineProperty(exports, 'destroyWorker', {\n enumerable: true,\n get: function get() {\n return _openpgp.destroyWorker;\n }\n});\n\nvar _util = _dereq_('./util');\n\nObject.defineProperty(exports, 'util', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_util).default;\n }\n});\n\nvar _packet = _dereq_('./packet');\n\nObject.defineProperty(exports, 'packet', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_packet).default;\n }\n});\n\nvar _mpi = _dereq_('./type/mpi');\n\nObject.defineProperty(exports, 'MPI', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mpi).default;\n }\n});\n\nvar _s2k = _dereq_('./type/s2k');\n\nObject.defineProperty(exports, 'S2K', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_s2k).default;\n }\n});\n\nvar _keyid = _dereq_('./type/keyid');\n\nObject.defineProperty(exports, 'Keyid', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_keyid).default;\n }\n});\n\nvar _ecdh_symkey = _dereq_('./type/ecdh_symkey');\n\nObject.defineProperty(exports, 'ECDHSymmetricKey', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_ecdh_symkey).default;\n }\n});\n\nvar _kdf_params = _dereq_('./type/kdf_params');\n\nObject.defineProperty(exports, 'KDFParams', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_kdf_params).default;\n }\n});\n\nvar _oid = _dereq_('./type/oid');\n\nObject.defineProperty(exports, 'OID', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_oid).default;\n }\n});\n\nvar _armor = _dereq_('./encoding/armor');\n\nObject.defineProperty(exports, 'armor', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_armor).default;\n }\n});\n\nvar _enums = _dereq_('./enums');\n\nObject.defineProperty(exports, 'enums', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_enums).default;\n }\n});\n\nvar _config = _dereq_('./config/config');\n\nObject.defineProperty(exports, 'config', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_config).default;\n }\n});\n\nvar _crypto = _dereq_('./crypto');\n\nObject.defineProperty(exports, 'crypto', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_crypto).default;\n }\n});\n\nvar _keyring = _dereq_('./keyring');\n\nObject.defineProperty(exports, 'Keyring', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_keyring).default;\n }\n});\n\nvar _async_proxy = _dereq_('./worker/async_proxy');\n\nObject.defineProperty(exports, 'AsyncProxy', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_async_proxy).default;\n }\n});\n\nvar _hkp = _dereq_('./hkp');\n\nObject.defineProperty(exports, 'HKP', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_hkp).default;\n }\n});\n\nvar _wkd = _dereq_('./wkd');\n\nObject.defineProperty(exports, 'WKD', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_wkd).default;\n }\n});\n\nvar openpgp = _interopRequireWildcard(_openpgp);\n\nvar _key = _dereq_('./key');\n\nvar keyMod = _interopRequireWildcard(_key);\n\nvar _signature = _dereq_('./signature');\n\nvar signatureMod = _interopRequireWildcard(_signature);\n\nvar _message = _dereq_('./message');\n\nvar messageMod = _interopRequireWildcard(_message);\n\nvar _cleartext = _dereq_('./cleartext');\n\nvar cleartextMod = _interopRequireWildcard(_cleartext);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = openpgp;\n\n/**\n * Export each high level api function separately.\n * Usage:\n *\n * import { encryptMessage } from 'openpgp.js'\n * encryptMessage(keys, text)\n */\n/* eslint-disable import/newline-after-import, import/first */\n\n/**\n * Export high level api as default.\n * Usage:\n *\n * import openpgp from 'openpgp.js'\n * openpgp.encryptMessage(keys, text)\n */\n\n\n/**\n * @see module:key\n * @name module:openpgp.key\n */\n\nvar key = exports.key = keyMod;\n\n/**\n * @see module:signature\n * @name module:openpgp.signature\n */\nvar signature = exports.signature = signatureMod;\n\n/**\n * @see module:message\n * @name module:openpgp.message\n */\nvar message = exports.message = messageMod;\n\n/**\n * @see module:cleartext\n * @name module:openpgp.cleartext\n */\nvar cleartext = exports.cleartext = cleartextMod;\n\n/**\n * @see module:util\n * @name module:openpgp.util\n */\n\n},{\"./cleartext\":322,\"./config/config\":324,\"./crypto\":340,\"./encoding/armor\":357,\"./enums\":359,\"./hkp\":360,\"./key\":362,\"./keyring\":363,\"./message\":366,\"./openpgp\":367,\"./packet\":371,\"./signature\":391,\"./type/ecdh_symkey\":392,\"./type/kdf_params\":393,\"./type/keyid\":394,\"./type/mpi\":395,\"./type/oid\":396,\"./type/s2k\":397,\"./util\":398,\"./wkd\":399,\"./worker/async_proxy\":400}],362:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.isAeadSupported = exports.getPreferredAlgo = exports.getPreferredHashAlgo = exports.reformat = exports.generate = exports.createSignaturePacket = undefined;\n\nvar _values = _dereq_('babel-runtime/core-js/object/values');\n\nvar _values2 = _interopRequireDefault(_values);\n\nvar _getPrototypeOf = _dereq_('babel-runtime/core-js/object/get-prototype-of');\n\nvar _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);\n\nvar _slicedToArray2 = _dereq_('babel-runtime/helpers/slicedToArray');\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nvar _assign = _dereq_('babel-runtime/core-js/object/assign');\n\nvar _assign2 = _interopRequireDefault(_assign);\n\nvar _promise = _dereq_('babel-runtime/core-js/promise');\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * Merges signatures from source[attr] to dest[attr]\n * @private\n * @param {Object} source\n * @param {Object} dest\n * @param {String} attr\n * @param {Function} checkFn optional, signature only merged if true\n */\nvar mergeSignatures = function () {\n var _ref19 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee18(source, dest, attr, checkFn) {\n return _regenerator2.default.wrap(function _callee18$(_context18) {\n while (1) {\n switch (_context18.prev = _context18.next) {\n case 0:\n source = source[attr];\n\n if (!source) {\n _context18.next = 8;\n break;\n }\n\n if (dest[attr].length) {\n _context18.next = 6;\n break;\n }\n\n dest[attr] = source;\n _context18.next = 8;\n break;\n\n case 6:\n _context18.next = 8;\n return _promise2.default.all(source.map(function () {\n var _ref20 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee17(sourceSig) {\n return _regenerator2.default.wrap(function _callee17$(_context17) {\n while (1) {\n switch (_context17.prev = _context17.next) {\n case 0:\n _context17.t1 = !sourceSig.isExpired();\n\n if (!_context17.t1) {\n _context17.next = 8;\n break;\n }\n\n _context17.t2 = !checkFn;\n\n if (_context17.t2) {\n _context17.next = 7;\n break;\n }\n\n _context17.next = 6;\n return checkFn(sourceSig);\n\n case 6:\n _context17.t2 = _context17.sent;\n\n case 7:\n _context17.t1 = _context17.t2;\n\n case 8:\n _context17.t0 = _context17.t1;\n\n if (!_context17.t0) {\n _context17.next = 11;\n break;\n }\n\n _context17.t0 = !dest[attr].some(function (destSig) {\n return _util2.default.equalsUint8Array(destSig.signature, sourceSig.signature);\n });\n\n case 11:\n if (!_context17.t0) {\n _context17.next = 13;\n break;\n }\n\n dest[attr].push(sourceSig);\n\n case 13:\n case 'end':\n return _context17.stop();\n }\n }\n }, _callee17, this);\n }));\n\n return function (_x36) {\n return _ref20.apply(this, arguments);\n };\n }()));\n\n case 8:\n case 'end':\n return _context18.stop();\n }\n }\n }, _callee18, this);\n }));\n\n return function mergeSignatures(_x32, _x33, _x34, _x35) {\n return _ref19.apply(this, arguments);\n };\n}();\n\n/**\n * Revokes the key\n * @param {Object} reasonForRevocation optional, object indicating the reason for revocation\n * @param {module:enums.reasonForRevocation} reasonForRevocation.flag optional, flag indicating the reason for revocation\n * @param {String} reasonForRevocation.string optional, string explaining the reason for revocation\n * @param {Date} date optional, override the creationtime of the revocation signature\n * @return {module:key~Key} new key with revocation signature\n */\n\n\n/**\n * Create signature packet\n * @param {Object} dataToSign Contains packets to be signed\n * @param {module:packet.SecretKey|\n * module:packet.SecretSubkey} signingKeyPacket secret key packet for signing\n * @param {Object} signatureProperties (optional) properties to write on the signature packet before signing\n * @param {Date} date (optional) override the creationtime of the signature\n * @param {Object} userId (optional) user ID\n * @return {module:packet/signature} signature packet\n */\nvar createSignaturePacket = exports.createSignaturePacket = function () {\n var _ref34 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee29(dataToSign, privateKey, signingKeyPacket, signatureProperties, date, userId) {\n var signaturePacket;\n return _regenerator2.default.wrap(function _callee29$(_context29) {\n while (1) {\n switch (_context29.prev = _context29.next) {\n case 0:\n if (signingKeyPacket.isDecrypted) {\n _context29.next = 2;\n break;\n }\n\n throw new Error('Private key is not decrypted.');\n\n case 2:\n signaturePacket = new _packet2.default.Signature(date);\n\n (0, _assign2.default)(signaturePacket, signatureProperties);\n signaturePacket.publicKeyAlgorithm = signingKeyPacket.algorithm;\n _context29.next = 7;\n return getPreferredHashAlgo(privateKey, signingKeyPacket, date, userId);\n\n case 7:\n signaturePacket.hashAlgorithm = _context29.sent;\n _context29.next = 10;\n return signaturePacket.sign(signingKeyPacket, dataToSign);\n\n case 10:\n return _context29.abrupt('return', signaturePacket);\n\n case 11:\n case 'end':\n return _context29.stop();\n }\n }\n }, _callee29, this);\n }));\n\n return function createSignaturePacket(_x52, _x53, _x54, _x55, _x56, _x57) {\n return _ref34.apply(this, arguments);\n };\n}();\n\n/**\n * Verifies the user certificate\n * @param {module:packet.SecretKey|\n * module:packet.PublicKey} primaryKey The primary key packet\n * @param {module:packet.Signature} certificate A certificate of this user\n * @param {Array<module:key.Key>} keys Array of keys to verify certificate signatures\n * @param {Date} date Use the given date instead of the current time\n * @returns {Promise<module:enums.keyStatus>} status of the certificate\n * @async\n */\n\n\n/**\n * Generates a new OpenPGP key. Supports RSA and ECC keys.\n * Primary and subkey will be of same type.\n * @param {module:enums.publicKey} [options.keyType=module:enums.publicKey.rsa_encrypt_sign]\n * To indicate what type of key to make.\n * RSA is 1. See {@link https://tools.ietf.org/html/rfc4880#section-9.1}\n * @param {Integer} options.numBits number of bits for the key creation.\n * @param {String|Array<String>} options.userIds\n * Assumes already in form of \"User Name <username@email.com>\"\n * If array is used, the first userId is set as primary user Id\n * @param {String} options.passphrase The passphrase used to encrypt the resulting private key\n * @param {Number} [options.keyExpirationTime=0]\n * The number of seconds after the key creation time that the key expires\n * @param {String} curve (optional) elliptic curve for ECC keys\n * @param {Date} date Override the creation date of the key and the key signatures\n * @param {Array<Object>} subkeys (optional) options for each subkey, default to main key options. e.g. [{sign: true, passphrase: '123'}]\n * sign parameter defaults to false, and indicates whether the subkey should sign rather than encrypt\n * @returns {Promise<module:key.Key>}\n * @async\n * @static\n */\nvar generate = exports.generate = function () {\n var _ref49 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee45(options) {\n var generateSecretKey = function () {\n var _ref50 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee43(options) {\n var secretKeyPacket;\n return _regenerator2.default.wrap(function _callee43$(_context43) {\n while (1) {\n switch (_context43.prev = _context43.next) {\n case 0:\n secretKeyPacket = new _packet2.default.SecretKey(options.date);\n\n secretKeyPacket.packets = null;\n secretKeyPacket.algorithm = _enums2.default.read(_enums2.default.publicKey, options.algorithm);\n _context43.next = 5;\n return secretKeyPacket.generate(options.numBits, options.curve);\n\n case 5:\n return _context43.abrupt('return', secretKeyPacket);\n\n case 6:\n case 'end':\n return _context43.stop();\n }\n }\n }, _callee43, this);\n }));\n\n return function generateSecretKey(_x86) {\n return _ref50.apply(this, arguments);\n };\n }();\n\n var generateSecretSubkey = function () {\n var _ref51 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee44(options) {\n var secretSubkeyPacket;\n return _regenerator2.default.wrap(function _callee44$(_context44) {\n while (1) {\n switch (_context44.prev = _context44.next) {\n case 0:\n secretSubkeyPacket = new _packet2.default.SecretSubkey(options.date);\n\n secretSubkeyPacket.packets = null;\n secretSubkeyPacket.algorithm = _enums2.default.read(_enums2.default.publicKey, options.algorithm);\n _context44.next = 5;\n return secretSubkeyPacket.generate(options.numBits, options.curve);\n\n case 5:\n return _context44.abrupt('return', secretSubkeyPacket);\n\n case 6:\n case 'end':\n return _context44.stop();\n }\n }\n }, _callee44, this);\n }));\n\n return function generateSecretSubkey(_x87) {\n return _ref51.apply(this, arguments);\n };\n }();\n\n var promises, sanitizeKeyOptions;\n return _regenerator2.default.wrap(function _callee45$(_context45) {\n while (1) {\n switch (_context45.prev = _context45.next) {\n case 0:\n sanitizeKeyOptions = function sanitizeKeyOptions(options) {\n var subkeyDefaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n options.curve = options.curve || subkeyDefaults.curve;\n options.numBits = options.numBits || subkeyDefaults.numBits;\n options.keyExpirationTime = options.keyExpirationTime !== undefined ? options.keyExpirationTime : subkeyDefaults.keyExpirationTime;\n options.passphrase = _util2.default.isString(options.passphrase) ? options.passphrase : subkeyDefaults.passphrase;\n options.date = options.date || subkeyDefaults.date;\n\n options.sign = options.sign || false;\n\n if (options.curve) {\n try {\n options.curve = _enums2.default.write(_enums2.default.curve, options.curve);\n } catch (e) {\n throw new Error('Not valid curve.');\n }\n if (options.curve === _enums2.default.curve.ed25519 || options.curve === _enums2.default.curve.curve25519) {\n if (options.sign) {\n options.algorithm = _enums2.default.publicKey.eddsa;\n options.curve = _enums2.default.curve.ed25519;\n } else {\n options.algorithm = _enums2.default.publicKey.ecdh;\n options.curve = _enums2.default.curve.curve25519;\n }\n } else {\n if (options.sign) {\n options.algorithm = _enums2.default.publicKey.ecdsa;\n } else {\n options.algorithm = _enums2.default.publicKey.ecdh;\n }\n }\n } else if (options.numBits) {\n options.algorithm = _enums2.default.publicKey.rsa_encrypt_sign;\n } else {\n throw new Error('Unrecognized key type');\n }\n return options;\n };\n\n options.sign = true; // primary key is always a signing key\n options = sanitizeKeyOptions(options);\n options.subkeys = options.subkeys.map(function (subkey, index) {\n return sanitizeKeyOptions(options.subkeys[index], options);\n });\n\n promises = [generateSecretKey(options)];\n\n promises = promises.concat(options.subkeys.map(generateSecretSubkey));\n return _context45.abrupt('return', _promise2.default.all(promises).then(function (packets) {\n return wrapKeyObject(packets[0], packets.slice(1), options);\n }));\n\n case 7:\n case 'end':\n return _context45.stop();\n }\n }\n }, _callee45, this);\n }));\n\n return function generate(_x84) {\n return _ref49.apply(this, arguments);\n };\n}();\n\n/**\n * Reformats and signs an OpenPGP key with a given User ID. Currently only supports RSA keys.\n * @param {module:key.Key} options.privateKey The private key to reformat\n * @param {module:enums.publicKey} [options.keyType=module:enums.publicKey.rsa_encrypt_sign]\n * @param {String|Array<String>} options.userIds\n * Assumes already in form of \"User Name <username@email.com>\"\n * If array is used, the first userId is set as primary user Id\n * @param {String} options.passphrase The passphrase used to encrypt the resulting private key\n * @param {Number} [options.keyExpirationTime=0]\n * The number of seconds after the key creation time that the key expires\n * @param {Date} date Override the creation date of the key and the key signatures\n * @param {Array<Object>} subkeys (optional) options for each subkey, default to main key options. e.g. [{sign: true, passphrase: '123'}]\n *\n * @param {Boolean} [options.revoked=false] Whether the key should include a revocation signature\n * @returns {Promise<module:key.Key>}\n * @async\n * @static\n */\n\n\nvar reformat = exports.reformat = function () {\n var _ref52 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee46(options) {\n var isDecrypted, packetlist, secretKeyPacket, secretSubkeyPackets, i, sanitizeKeyOptions;\n return _regenerator2.default.wrap(function _callee46$(_context46) {\n while (1) {\n switch (_context46.prev = _context46.next) {\n case 0:\n sanitizeKeyOptions = function sanitizeKeyOptions(options) {\n var subkeyDefaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n options.keyExpirationTime = options.keyExpirationTime || subkeyDefaults.keyExpirationTime;\n options.passphrase = _util2.default.isString(options.passphrase) ? options.passphrase : subkeyDefaults.passphrase;\n options.date = options.date || subkeyDefaults.date;\n\n return options;\n };\n\n options = sanitizeKeyOptions(options);\n\n _context46.prev = 2;\n isDecrypted = options.privateKey.getKeyPackets().every(function (keyPacket) {\n return keyPacket.isDecrypted;\n });\n\n if (isDecrypted) {\n _context46.next = 7;\n break;\n }\n\n _context46.next = 7;\n return options.privateKey.decrypt();\n\n case 7:\n _context46.next = 12;\n break;\n\n case 9:\n _context46.prev = 9;\n _context46.t0 = _context46['catch'](2);\n throw new Error('Key not decrypted');\n\n case 12:\n packetlist = options.privateKey.toPacketlist();\n secretKeyPacket = void 0;\n secretSubkeyPackets = [];\n\n for (i = 0; i < packetlist.length; i++) {\n if (packetlist[i].tag === _enums2.default.packet.secretKey) {\n secretKeyPacket = packetlist[i];\n } else if (packetlist[i].tag === _enums2.default.packet.secretSubkey) {\n secretSubkeyPackets.push(packetlist[i]);\n }\n }\n\n if (secretKeyPacket) {\n _context46.next = 18;\n break;\n }\n\n throw new Error('Key does not contain a secret key packet');\n\n case 18:\n\n if (!options.subkeys) {\n options.subkeys = secretSubkeyPackets.map(function () {\n return {};\n });\n }\n\n if (!(options.subkeys.length !== secretSubkeyPackets.length)) {\n _context46.next = 21;\n break;\n }\n\n throw new Error('Number of subkey options does not match number of subkeys');\n\n case 21:\n\n options.subkeys = options.subkeys.map(function (subkey, index) {\n return sanitizeKeyOptions(options.subkeys[index], options);\n });\n\n return _context46.abrupt('return', wrapKeyObject(secretKeyPacket, secretSubkeyPackets, options));\n\n case 23:\n case 'end':\n return _context46.stop();\n }\n }\n }, _callee46, this, [[2, 9]]);\n }));\n\n return function reformat(_x88) {\n return _ref52.apply(this, arguments);\n };\n}();\n\nvar wrapKeyObject = function () {\n var _ref53 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee51(secretKeyPacket, secretSubkeyPackets, options) {\n var packetlist, dataToSign;\n return _regenerator2.default.wrap(function _callee51$(_context51) {\n while (1) {\n switch (_context51.prev = _context51.next) {\n case 0:\n if (!options.passphrase) {\n _context51.next = 3;\n break;\n }\n\n _context51.next = 3;\n return secretKeyPacket.encrypt(options.passphrase);\n\n case 3:\n _context51.next = 5;\n return _promise2.default.all(secretSubkeyPackets.map(function () {\n var _ref54 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee47(secretSubkeyPacket, index) {\n var subkeyPassphrase;\n return _regenerator2.default.wrap(function _callee47$(_context47) {\n while (1) {\n switch (_context47.prev = _context47.next) {\n case 0:\n subkeyPassphrase = options.subkeys[index].passphrase;\n\n if (!subkeyPassphrase) {\n _context47.next = 4;\n break;\n }\n\n _context47.next = 4;\n return secretSubkeyPacket.encrypt(subkeyPassphrase);\n\n case 4:\n case 'end':\n return _context47.stop();\n }\n }\n }, _callee47, this);\n }));\n\n return function (_x93, _x94) {\n return _ref54.apply(this, arguments);\n };\n }()));\n\n case 5:\n packetlist = new _packet2.default.List();\n\n\n packetlist.push(secretKeyPacket);\n\n _context51.next = 9;\n return _promise2.default.all(options.userIds.map(function () {\n var _ref55 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee48(userId, index) {\n var userIdPacket, dataToSign, signaturePacket;\n return _regenerator2.default.wrap(function _callee48$(_context48) {\n while (1) {\n switch (_context48.prev = _context48.next) {\n case 0:\n userIdPacket = new _packet2.default.Userid();\n\n userIdPacket.format(userId);\n\n dataToSign = {};\n\n dataToSign.userid = userIdPacket;\n dataToSign.key = secretKeyPacket;\n signaturePacket = new _packet2.default.Signature(options.date);\n\n signaturePacket.signatureType = _enums2.default.signature.cert_generic;\n signaturePacket.publicKeyAlgorithm = secretKeyPacket.algorithm;\n _context48.next = 10;\n return getPreferredHashAlgo(null, secretKeyPacket);\n\n case 10:\n signaturePacket.hashAlgorithm = _context48.sent;\n\n signaturePacket.keyFlags = [_enums2.default.keyFlags.certify_keys | _enums2.default.keyFlags.sign_data];\n signaturePacket.preferredSymmetricAlgorithms = [];\n // prefer aes256, aes128, then aes192 (no WebCrypto support: https://www.chromium.org/blink/webcrypto#TOC-AES-support)\n signaturePacket.preferredSymmetricAlgorithms.push(_enums2.default.symmetric.aes256);\n signaturePacket.preferredSymmetricAlgorithms.push(_enums2.default.symmetric.aes128);\n signaturePacket.preferredSymmetricAlgorithms.push(_enums2.default.symmetric.aes192);\n signaturePacket.preferredSymmetricAlgorithms.push(_enums2.default.symmetric.cast5);\n signaturePacket.preferredSymmetricAlgorithms.push(_enums2.default.symmetric.tripledes);\n if (_config2.default.aead_protect && _config2.default.aead_protect_version === 4) {\n signaturePacket.preferredAeadAlgorithms = [];\n signaturePacket.preferredAeadAlgorithms.push(_enums2.default.aead.eax);\n signaturePacket.preferredAeadAlgorithms.push(_enums2.default.aead.ocb);\n }\n signaturePacket.preferredHashAlgorithms = [];\n // prefer fast asm.js implementations (SHA-256). SHA-1 will not be secure much longer...move to bottom of list\n signaturePacket.preferredHashAlgorithms.push(_enums2.default.hash.sha256);\n signaturePacket.preferredHashAlgorithms.push(_enums2.default.hash.sha512);\n signaturePacket.preferredHashAlgorithms.push(_enums2.default.hash.sha1);\n signaturePacket.preferredCompressionAlgorithms = [];\n signaturePacket.preferredCompressionAlgorithms.push(_enums2.default.compression.zlib);\n signaturePacket.preferredCompressionAlgorithms.push(_enums2.default.compression.zip);\n if (index === 0) {\n signaturePacket.isPrimaryUserID = true;\n }\n if (_config2.default.integrity_protect) {\n signaturePacket.features = [0];\n signaturePacket.features[0] |= _enums2.default.features.modification_detection;\n }\n if (_config2.default.aead_protect && _config2.default.aead_protect_version === 4) {\n signaturePacket.features || (signaturePacket.features = [0]);\n signaturePacket.features[0] |= _enums2.default.features.aead;\n signaturePacket.features[0] |= _enums2.default.features.v5_keys;\n }\n if (options.keyExpirationTime > 0) {\n signaturePacket.keyExpirationTime = options.keyExpirationTime;\n signaturePacket.keyNeverExpires = false;\n }\n _context48.next = 32;\n return signaturePacket.sign(secretKeyPacket, dataToSign);\n\n case 32:\n return _context48.abrupt('return', { userIdPacket: userIdPacket, signaturePacket: signaturePacket });\n\n case 33:\n case 'end':\n return _context48.stop();\n }\n }\n }, _callee48, this);\n }));\n\n return function (_x95, _x96) {\n return _ref55.apply(this, arguments);\n };\n }())).then(function (list) {\n list.forEach(function (_ref56) {\n var userIdPacket = _ref56.userIdPacket,\n signaturePacket = _ref56.signaturePacket;\n\n packetlist.push(userIdPacket);\n packetlist.push(signaturePacket);\n });\n });\n\n case 9:\n _context51.next = 11;\n return _promise2.default.all(secretSubkeyPackets.map(function () {\n var _ref57 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee49(secretSubkeyPacket, index) {\n var subkeyOptions, dataToSign, subkeySignaturePacket;\n return _regenerator2.default.wrap(function _callee49$(_context49) {\n while (1) {\n switch (_context49.prev = _context49.next) {\n case 0:\n subkeyOptions = options.subkeys[index];\n dataToSign = {};\n\n dataToSign.key = secretKeyPacket;\n dataToSign.bind = secretSubkeyPacket;\n subkeySignaturePacket = new _packet2.default.Signature(subkeyOptions.date);\n\n subkeySignaturePacket.signatureType = _enums2.default.signature.subkey_binding;\n subkeySignaturePacket.publicKeyAlgorithm = secretKeyPacket.algorithm;\n _context49.next = 9;\n return getPreferredHashAlgo(null, secretSubkeyPacket);\n\n case 9:\n subkeySignaturePacket.hashAlgorithm = _context49.sent;\n\n subkeySignaturePacket.keyFlags = subkeyOptions.sign ? _enums2.default.keyFlags.sign_data : [_enums2.default.keyFlags.encrypt_communication | _enums2.default.keyFlags.encrypt_storage];\n if (subkeyOptions.keyExpirationTime > 0) {\n subkeySignaturePacket.keyExpirationTime = subkeyOptions.keyExpirationTime;\n subkeySignaturePacket.keyNeverExpires = false;\n }\n _context49.next = 14;\n return subkeySignaturePacket.sign(secretKeyPacket, dataToSign);\n\n case 14:\n return _context49.abrupt('return', { secretSubkeyPacket: secretSubkeyPacket, subkeySignaturePacket: subkeySignaturePacket });\n\n case 15:\n case 'end':\n return _context49.stop();\n }\n }\n }, _callee49, this);\n }));\n\n return function (_x97, _x98) {\n return _ref57.apply(this, arguments);\n };\n }())).then(function (packets) {\n packets.forEach(function (_ref58) {\n var secretSubkeyPacket = _ref58.secretSubkeyPacket,\n subkeySignaturePacket = _ref58.subkeySignaturePacket;\n\n packetlist.push(secretSubkeyPacket);\n packetlist.push(subkeySignaturePacket);\n });\n });\n\n case 11:\n\n // Add revocation signature packet for creating a revocation certificate.\n // This packet should be removed before returning the key.\n dataToSign = { key: secretKeyPacket };\n _context51.t0 = packetlist;\n _context51.next = 15;\n return createSignaturePacket(dataToSign, null, secretKeyPacket, {\n signatureType: _enums2.default.signature.key_revocation,\n reasonForRevocationFlag: _enums2.default.reasonForRevocation.no_reason,\n reasonForRevocationString: ''\n }, options.date);\n\n case 15:\n _context51.t1 = _context51.sent;\n\n _context51.t0.push.call(_context51.t0, _context51.t1);\n\n // set passphrase protection\n if (options.passphrase) {\n secretKeyPacket.clearPrivateParams();\n }\n\n _context51.next = 20;\n return _promise2.default.all(secretSubkeyPackets.map(function () {\n var _ref59 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee50(secretSubkeyPacket, index) {\n var subkeyPassphrase;\n return _regenerator2.default.wrap(function _callee50$(_context50) {\n while (1) {\n switch (_context50.prev = _context50.next) {\n case 0:\n subkeyPassphrase = options.subkeys[index].passphrase;\n\n if (subkeyPassphrase) {\n secretSubkeyPacket.clearPrivateParams();\n }\n\n case 2:\n case 'end':\n return _context50.stop();\n }\n }\n }, _callee50, this);\n }));\n\n return function (_x99, _x100) {\n return _ref59.apply(this, arguments);\n };\n }()));\n\n case 20:\n return _context51.abrupt('return', new Key(packetlist));\n\n case 21:\n case 'end':\n return _context51.stop();\n }\n }\n }, _callee51, this);\n }));\n\n return function wrapKeyObject(_x90, _x91, _x92) {\n return _ref53.apply(this, arguments);\n };\n}();\n\n/**\n * Checks if a given certificate or binding signature is revoked\n * @param {module:packet.SecretKey|\n * module:packet.PublicKey} primaryKey The primary key packet\n * @param {Object} dataToVerify The data to check\n * @param {Array<module:packet.Signature>} revocations The revocation signatures to check\n * @param {module:packet.Signature} signature The certificate or signature to check\n * @param {module:packet.PublicSubkey|\n * module:packet.SecretSubkey|\n * module:packet.PublicKey|\n * module:packet.SecretKey} key, optional The key packet to check the signature\n * @param {Date} date Use the given date instead of the current time\n * @returns {Promise<Boolean>} True if the signature revokes the data\n * @async\n */\n\n\nvar isDataRevoked = function () {\n var _ref60 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee53(primaryKey, dataToVerify, revocations, signature, key) {\n var date = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : new Date();\n var normDate, revocationKeyIds;\n return _regenerator2.default.wrap(function _callee53$(_context53) {\n while (1) {\n switch (_context53.prev = _context53.next) {\n case 0:\n key = key || primaryKey;\n normDate = _util2.default.normalizeDate(date);\n revocationKeyIds = [];\n _context53.next = 5;\n return _promise2.default.all(revocations.map(function () {\n var _ref61 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee52(revocationSignature) {\n return _regenerator2.default.wrap(function _callee52$(_context52) {\n while (1) {\n switch (_context52.prev = _context52.next) {\n case 0:\n _context52.t0 = !(_config2.default.revocations_expire && revocationSignature.isExpired(normDate));\n\n if (!_context52.t0) {\n _context52.next = 8;\n break;\n }\n\n _context52.t1 = revocationSignature.verified;\n\n if (_context52.t1) {\n _context52.next = 7;\n break;\n }\n\n _context52.next = 6;\n return revocationSignature.verify(key, dataToVerify);\n\n case 6:\n _context52.t1 = _context52.sent;\n\n case 7:\n _context52.t0 = _context52.t1;\n\n case 8:\n if (!_context52.t0) {\n _context52.next = 11;\n break;\n }\n\n // TODO get an identifier of the revoked object instead\n revocationKeyIds.push(revocationSignature.issuerKeyId);\n return _context52.abrupt('return', true);\n\n case 11:\n return _context52.abrupt('return', false);\n\n case 12:\n case 'end':\n return _context52.stop();\n }\n }\n }, _callee52, this);\n }));\n\n return function (_x107) {\n return _ref61.apply(this, arguments);\n };\n }()));\n\n case 5:\n if (!signature) {\n _context53.next = 8;\n break;\n }\n\n signature.revoked = revocationKeyIds.some(function (keyId) {\n return keyId.equals(signature.issuerKeyId);\n }) ? true : signature.revoked;\n return _context53.abrupt('return', signature.revoked);\n\n case 8:\n return _context53.abrupt('return', revocationKeyIds.length > 0);\n\n case 9:\n case 'end':\n return _context53.stop();\n }\n }\n }, _callee53, this);\n }));\n\n return function isDataRevoked(_x101, _x102, _x103, _x104, _x105) {\n return _ref60.apply(this, arguments);\n };\n}();\n\n/**\n * Returns the preferred signature hash algorithm of a key\n * @param {module:key.Key} key (optional) the key to get preferences from\n * @param {module:packet.SecretKey|module:packet.SecretSubkey} keyPacket key packet used for signing\n * @param {Date} date (optional) use the given date for verification instead of the current time\n * @param {Object} userId (optional) user ID\n * @returns {Promise<String>}\n * @async\n */\nvar getPreferredHashAlgo = exports.getPreferredHashAlgo = function () {\n var _ref62 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee54(key, keyPacket) {\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n var userId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n var hash_algo, pref_algo, primaryUser, _primaryUser$selfCert;\n\n return _regenerator2.default.wrap(function _callee54$(_context54) {\n while (1) {\n switch (_context54.prev = _context54.next) {\n case 0:\n hash_algo = _config2.default.prefer_hash_algorithm;\n pref_algo = hash_algo;\n\n if (!(key instanceof Key)) {\n _context54.next = 7;\n break;\n }\n\n _context54.next = 5;\n return key.getPrimaryUser(date, userId);\n\n case 5:\n primaryUser = _context54.sent;\n\n if (primaryUser && primaryUser.selfCertification.preferredHashAlgorithms) {\n _primaryUser$selfCert = (0, _slicedToArray3.default)(primaryUser.selfCertification.preferredHashAlgorithms, 1);\n pref_algo = _primaryUser$selfCert[0];\n\n hash_algo = _crypto2.default.hash.getHashByteLength(hash_algo) <= _crypto2.default.hash.getHashByteLength(pref_algo) ? pref_algo : hash_algo;\n }\n\n case 7:\n switch ((0, _getPrototypeOf2.default)(keyPacket)) {\n case _packet2.default.SecretKey.prototype:\n case _packet2.default.PublicKey.prototype:\n case _packet2.default.SecretSubkey.prototype:\n case _packet2.default.PublicSubkey.prototype:\n switch (keyPacket.algorithm) {\n case 'ecdh':\n case 'ecdsa':\n case 'eddsa':\n pref_algo = _crypto2.default.publicKey.elliptic.getPreferredHashAlgo(keyPacket.params[0]);\n }\n }\n return _context54.abrupt('return', _crypto2.default.hash.getHashByteLength(hash_algo) <= _crypto2.default.hash.getHashByteLength(pref_algo) ? pref_algo : hash_algo);\n\n case 9:\n case 'end':\n return _context54.stop();\n }\n }\n }, _callee54, this);\n }));\n\n return function getPreferredHashAlgo(_x109, _x110) {\n return _ref62.apply(this, arguments);\n };\n}();\n\n/**\n * Returns the preferred symmetric/aead algorithm for a set of keys\n * @param {symmetric|aead} type Type of preference to return\n * @param {Array<module:key.Key>} keys Set of keys\n * @param {Date} date (optional) use the given date for verification instead of the current time\n * @param {Object} userId (optional) user ID\n * @returns {Promise<module:enums.symmetric>} Preferred symmetric algorithm\n * @async\n */\n\n\nvar getPreferredAlgo = exports.getPreferredAlgo = function () {\n var _ref63 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee56(type, keys) {\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n var userId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var prefProperty, defaultAlgo, prioMap, prefAlgo;\n return _regenerator2.default.wrap(function _callee56$(_context56) {\n while (1) {\n switch (_context56.prev = _context56.next) {\n case 0:\n prefProperty = type === 'symmetric' ? 'preferredSymmetricAlgorithms' : 'preferredAeadAlgorithms';\n defaultAlgo = type === 'symmetric' ? _config2.default.encryption_cipher : _config2.default.aead_mode;\n prioMap = {};\n _context56.next = 5;\n return _promise2.default.all(keys.map(function () {\n var _ref64 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee55(key) {\n var primaryUser;\n return _regenerator2.default.wrap(function _callee55$(_context55) {\n while (1) {\n switch (_context55.prev = _context55.next) {\n case 0:\n _context55.next = 2;\n return key.getPrimaryUser(date, userId);\n\n case 2:\n primaryUser = _context55.sent;\n\n if (!(!primaryUser || !primaryUser.selfCertification[prefProperty])) {\n _context55.next = 5;\n break;\n }\n\n return _context55.abrupt('return', defaultAlgo);\n\n case 5:\n primaryUser.selfCertification[prefProperty].forEach(function (algo, index) {\n var entry = prioMap[algo] || (prioMap[algo] = { prio: 0, count: 0, algo: algo });\n entry.prio += 64 >> index;\n entry.count++;\n });\n\n case 6:\n case 'end':\n return _context55.stop();\n }\n }\n }, _callee55, this);\n }));\n\n return function (_x117) {\n return _ref64.apply(this, arguments);\n };\n }()));\n\n case 5:\n prefAlgo = { prio: 0, algo: defaultAlgo };\n\n (0, _values2.default)(prioMap).forEach(function (_ref65) {\n var prio = _ref65.prio,\n count = _ref65.count,\n algo = _ref65.algo;\n\n try {\n if (algo !== _enums2.default[type].plaintext && algo !== _enums2.default[type].idea && // not implemented\n _enums2.default.read(_enums2.default[type], algo) && // known algorithm\n count === keys.length && // available for all keys\n prio > prefAlgo.prio) {\n prefAlgo = prioMap[algo];\n }\n } catch (e) {}\n });\n return _context56.abrupt('return', prefAlgo.algo);\n\n case 8:\n case 'end':\n return _context56.stop();\n }\n }\n }, _callee56, this);\n }));\n\n return function getPreferredAlgo(_x113, _x114) {\n return _ref63.apply(this, arguments);\n };\n}();\n\n/**\n * Returns whether aead is supported by all keys in the set\n * @param {Array<module:key.Key>} keys Set of keys\n * @param {Date} date (optional) use the given date for verification instead of the current time\n * @returns {Promise<Boolean>}\n * @async\n */\n\n\nvar isAeadSupported = exports.isAeadSupported = function () {\n var _ref66 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee58(keys) {\n var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date();\n var userId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var supported;\n return _regenerator2.default.wrap(function _callee58$(_context58) {\n while (1) {\n switch (_context58.prev = _context58.next) {\n case 0:\n supported = true;\n // TODO replace when Promise.some or Promise.any are implemented\n\n _context58.next = 3;\n return _promise2.default.all(keys.map(function () {\n var _ref67 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee57(key) {\n var primaryUser;\n return _regenerator2.default.wrap(function _callee57$(_context57) {\n while (1) {\n switch (_context57.prev = _context57.next) {\n case 0:\n _context57.next = 2;\n return key.getPrimaryUser(date, userId);\n\n case 2:\n primaryUser = _context57.sent;\n\n if (!primaryUser || !primaryUser.selfCertification.features || !(primaryUser.selfCertification.features[0] & _enums2.default.features.aead)) {\n supported = false;\n }\n\n case 4:\n case 'end':\n return _context57.stop();\n }\n }\n }, _callee57, this);\n }));\n\n return function (_x121) {\n return _ref67.apply(this, arguments);\n };\n }()));\n\n case 3:\n return _context58.abrupt('return', supported);\n\n case 4:\n case 'end':\n return _context58.stop();\n }\n }\n }, _callee58, this);\n }));\n\n return function isAeadSupported(_x118) {\n return _ref66.apply(this, arguments);\n };\n}();\n\nexports.Key = Key;\nexports.read = read;\nexports.readArmored = readArmored;\n\nvar _armor = _dereq_('./encoding/armor');\n\nvar _armor2 = _interopRequireDefault(_armor);\n\nvar _crypto = _dereq_('./crypto');\n\nvar _crypto2 = _interopRequireDefault(_crypto);\n\nvar _packet = _dereq_('./packet');\n\nvar _packet2 = _interopRequireDefault(_packet);\n\nvar _config = _dereq_('./config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _enums = _dereq_('./enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('./util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @class\n * @classdesc Class that represents an OpenPGP key. Must contain a primary key.\n * Can contain additional subkeys, signatures, user ids, user attributes.\n * @param {module:packet.List} packetlist The packets that form this key\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires encoding/armor\n * @requires crypto\n * @requires packet\n * @requires config\n * @requires enums\n * @requires util\n * @module key\n */\n\nfunction Key(packetlist) {\n if (!(this instanceof Key)) {\n return new Key(packetlist);\n }\n // same data as in packetlist but in structured form\n this.primaryKey = null;\n this.revocationSignatures = [];\n this.directSignatures = [];\n this.users = [];\n this.subKeys = [];\n this.packetlist2structure(packetlist);\n if (!this.primaryKey || !this.users.length) {\n throw new Error('Invalid key: need at least key and user ID packet');\n }\n}\n\n/**\n * Transforms packetlist to structured key data\n * @param {module:packet.List} packetlist The packets that form a key\n */\nKey.prototype.packetlist2structure = function (packetlist) {\n var user = void 0;\n var primaryKeyId = void 0;\n var subKey = void 0;\n for (var i = 0; i < packetlist.length; i++) {\n switch (packetlist[i].tag) {\n case _enums2.default.packet.publicKey:\n case _enums2.default.packet.secretKey:\n this.primaryKey = packetlist[i];\n primaryKeyId = this.primaryKey.getKeyId();\n break;\n case _enums2.default.packet.userid:\n case _enums2.default.packet.userAttribute:\n user = new User(packetlist[i]);\n this.users.push(user);\n break;\n case _enums2.default.packet.publicSubkey:\n case _enums2.default.packet.secretSubkey:\n user = null;\n subKey = new SubKey(packetlist[i]);\n this.subKeys.push(subKey);\n break;\n case _enums2.default.packet.signature:\n switch (packetlist[i].signatureType) {\n case _enums2.default.signature.cert_generic:\n case _enums2.default.signature.cert_persona:\n case _enums2.default.signature.cert_casual:\n case _enums2.default.signature.cert_positive:\n if (!user) {\n _util2.default.print_debug('Dropping certification signatures without preceding user packet');\n continue;\n }\n if (packetlist[i].issuerKeyId.equals(primaryKeyId)) {\n user.selfCertifications.push(packetlist[i]);\n } else {\n user.otherCertifications.push(packetlist[i]);\n }\n break;\n case _enums2.default.signature.cert_revocation:\n if (user) {\n user.revocationSignatures.push(packetlist[i]);\n } else {\n this.directSignatures.push(packetlist[i]);\n }\n break;\n case _enums2.default.signature.key:\n this.directSignatures.push(packetlist[i]);\n break;\n case _enums2.default.signature.subkey_binding:\n if (!subKey) {\n _util2.default.print_debug('Dropping subkey binding signature without preceding subkey packet');\n continue;\n }\n subKey.bindingSignatures.push(packetlist[i]);\n break;\n case _enums2.default.signature.key_revocation:\n this.revocationSignatures.push(packetlist[i]);\n break;\n case _enums2.default.signature.subkey_revocation:\n if (!subKey) {\n _util2.default.print_debug('Dropping subkey revocation signature without preceding subkey packet');\n continue;\n }\n subKey.revocationSignatures.push(packetlist[i]);\n break;\n }\n break;\n }\n }\n};\n\n/**\n * Transforms structured key data to packetlist\n * @returns {module:packet.List} The packets that form a key\n */\nKey.prototype.toPacketlist = function () {\n var packetlist = new _packet2.default.List();\n packetlist.push(this.primaryKey);\n packetlist.concat(this.revocationSignatures);\n packetlist.concat(this.directSignatures);\n this.users.map(function (user) {\n return packetlist.concat(user.toPacketlist());\n });\n this.subKeys.map(function (subKey) {\n return packetlist.concat(subKey.toPacketlist());\n });\n return packetlist;\n};\n\n/**\n * Returns packetlist containing all public or private subkey packets matching keyId;\n * If keyId is not present, returns all subkey packets.\n * @param {type/keyid} keyId\n * @returns {module:packet.List}\n */\nKey.prototype.getSubkeyPackets = function () {\n var keyId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n var packets = new _packet2.default.List();\n this.subKeys.forEach(function (subKey) {\n if (!keyId || subKey.subKey.getKeyId().equals(keyId, true)) {\n packets.push(subKey.subKey);\n }\n });\n return packets;\n};\n\n/**\n * Returns a packetlist containing all public or private key packets matching keyId.\n * If keyId is not present, returns all key packets starting with the primary key.\n * @param {type/keyid} keyId\n * @returns {module:packet.List}\n */\nKey.prototype.getKeyPackets = function () {\n var keyId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n var packets = new _packet2.default.List();\n if (!keyId || this.primaryKey.getKeyId().equals(keyId, true)) {\n packets.push(this.primaryKey);\n }\n packets.concat(this.getSubkeyPackets(keyId));\n return packets;\n};\n\n/**\n * Returns key IDs of all key packets\n * @returns {Array<module:type/keyid>}\n */\nKey.prototype.getKeyIds = function () {\n return this.getKeyPackets().map(function (keyPacket) {\n return keyPacket.getKeyId();\n });\n};\n\n/**\n * Returns userids\n * @returns {Array<string>} array of userids\n */\nKey.prototype.getUserIds = function () {\n return this.users.map(function (user) {\n return user.userId ? _util2.default.encode_utf8(user.userId.userid) : null;\n }).filter(function (userid) {\n return userid !== null;\n });\n};\n\n/**\n * Returns true if this is a public key\n * @returns {Boolean}\n */\nKey.prototype.isPublic = function () {\n return this.primaryKey.tag === _enums2.default.packet.publicKey;\n};\n\n/**\n * Returns true if this is a private key\n * @returns {Boolean}\n */\nKey.prototype.isPrivate = function () {\n return this.primaryKey.tag === _enums2.default.packet.secretKey;\n};\n\n/**\n * Returns key as public key (shallow copy)\n * @returns {module:key.Key} new public Key\n */\nKey.prototype.toPublic = function () {\n var packetlist = new _packet2.default.List();\n var keyPackets = this.toPacketlist();\n var bytes = void 0;\n var pubKeyPacket = void 0;\n var pubSubkeyPacket = void 0;\n for (var i = 0; i < keyPackets.length; i++) {\n switch (keyPackets[i].tag) {\n case _enums2.default.packet.secretKey:\n bytes = keyPackets[i].writePublicKey();\n pubKeyPacket = new _packet2.default.PublicKey();\n pubKeyPacket.read(bytes);\n packetlist.push(pubKeyPacket);\n break;\n case _enums2.default.packet.secretSubkey:\n bytes = keyPackets[i].writePublicKey();\n pubSubkeyPacket = new _packet2.default.PublicSubkey();\n pubSubkeyPacket.read(bytes);\n packetlist.push(pubSubkeyPacket);\n break;\n default:\n packetlist.push(keyPackets[i]);\n }\n }\n return new Key(packetlist);\n};\n\n/**\n * Returns ASCII armored text of key\n * @returns {String} ASCII armor\n */\nKey.prototype.armor = function () {\n var type = this.isPublic() ? _enums2.default.armor.public_key : _enums2.default.armor.private_key;\n return _armor2.default.encode(type, this.toPacketlist().write());\n};\n\n/**\n * Returns the signature that has the latest creation date, while ignoring signatures created in the future.\n * @param {Array<module:packet.Signature>} signatures List of signatures\n * @param {Date} date Use the given date instead of the current time\n * @returns {module:packet.Signature} The latest signature\n */\nfunction getLatestSignature(signatures) {\n var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date();\n\n var signature = signatures[0];\n for (var i = 1; i < signatures.length; i++) {\n if (signatures[i].created >= signature.created && (signatures[i].created <= date || date === null)) {\n signature = signatures[i];\n }\n }\n return signature;\n}\n\nfunction isValidSigningKeyPacket(keyPacket, signature) {\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n\n return keyPacket.algorithm !== _enums2.default.read(_enums2.default.publicKey, _enums2.default.publicKey.rsa_encrypt) && keyPacket.algorithm !== _enums2.default.read(_enums2.default.publicKey, _enums2.default.publicKey.elgamal) && keyPacket.algorithm !== _enums2.default.read(_enums2.default.publicKey, _enums2.default.publicKey.ecdh) && (!signature.keyFlags || (signature.keyFlags[0] & _enums2.default.keyFlags.sign_data) !== 0) && signature.verified && !signature.revoked && !signature.isExpired(date) && !isDataExpired(keyPacket, signature, date);\n}\n\n/**\n * Returns first key packet or key packet by given keyId that is available for signing and verification\n * @param {module:type/keyid} keyId, optional\n * @param {Date} date use the given date for verification instead of the current time\n * @param {Object} userId, optional user ID\n * @returns {Promise<module:packet.SecretSubkey|\n * module:packet.SecretKey|null>} key packet or null if no signing key has been found\n * @async\n */\nKey.prototype.getSigningKeyPacket = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() {\n var keyId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date();\n var userId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var primaryKey, i, bindingSignature, primaryUser;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n primaryKey = this.primaryKey;\n _context.next = 3;\n return this.verifyPrimaryKey(date, userId);\n\n case 3:\n _context.t0 = _context.sent;\n _context.t1 = _enums2.default.keyStatus.valid;\n\n if (!(_context.t0 === _context.t1)) {\n _context.next = 25;\n break;\n }\n\n i = 0;\n\n case 7:\n if (!(i < this.subKeys.length)) {\n _context.next = 20;\n break;\n }\n\n if (!(!keyId || this.subKeys[i].subKey.getKeyId().equals(keyId))) {\n _context.next = 17;\n break;\n }\n\n _context.next = 11;\n return this.subKeys[i].verify(primaryKey, date);\n\n case 11:\n _context.t2 = _context.sent;\n _context.t3 = _enums2.default.keyStatus.valid;\n\n if (!(_context.t2 === _context.t3)) {\n _context.next = 17;\n break;\n }\n\n bindingSignature = getLatestSignature(this.subKeys[i].bindingSignatures, date);\n\n if (!isValidSigningKeyPacket(this.subKeys[i].subKey, bindingSignature, date)) {\n _context.next = 17;\n break;\n }\n\n return _context.abrupt('return', this.subKeys[i].subKey);\n\n case 17:\n i++;\n _context.next = 7;\n break;\n\n case 20:\n _context.next = 22;\n return this.getPrimaryUser(date, userId);\n\n case 22:\n primaryUser = _context.sent;\n\n if (!(primaryUser && (!keyId || primaryKey.getKeyId().equals(keyId)) && isValidSigningKeyPacket(primaryKey, primaryUser.selfCertification, date))) {\n _context.next = 25;\n break;\n }\n\n return _context.abrupt('return', primaryKey);\n\n case 25:\n return _context.abrupt('return', null);\n\n case 26:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function () {\n return _ref.apply(this, arguments);\n };\n}();\n\nfunction isValidEncryptionKeyPacket(keyPacket, signature) {\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n\n return keyPacket.algorithm !== _enums2.default.read(_enums2.default.publicKey, _enums2.default.publicKey.dsa) && keyPacket.algorithm !== _enums2.default.read(_enums2.default.publicKey, _enums2.default.publicKey.rsa_sign) && keyPacket.algorithm !== _enums2.default.read(_enums2.default.publicKey, _enums2.default.publicKey.ecdsa) && keyPacket.algorithm !== _enums2.default.read(_enums2.default.publicKey, _enums2.default.publicKey.eddsa) && (!signature.keyFlags || (signature.keyFlags[0] & _enums2.default.keyFlags.encrypt_communication) !== 0 || (signature.keyFlags[0] & _enums2.default.keyFlags.encrypt_storage) !== 0) && signature.verified && !signature.revoked && !signature.isExpired(date) && !isDataExpired(keyPacket, signature, date);\n}\n\n/**\n * Returns first key packet or key packet by given keyId that is available for encryption or decryption\n * @param {module:type/keyid} keyId, optional\n * @param {Date} date, optional\n * @param {String} userId, optional\n * @returns {Promise<module:packet.PublicSubkey|\n * module:packet.SecretSubkey|\n * module:packet.SecretKey|\n * module:packet.PublicKey|null>} key packet or null if no encryption key has been found\n * @async\n */\nKey.prototype.getEncryptionKeyPacket = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(keyId) {\n var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date();\n var userId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var primaryKey, i, bindingSignature, primaryUser;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n primaryKey = this.primaryKey;\n _context2.next = 3;\n return this.verifyPrimaryKey(date, userId);\n\n case 3:\n _context2.t0 = _context2.sent;\n _context2.t1 = _enums2.default.keyStatus.valid;\n\n if (!(_context2.t0 === _context2.t1)) {\n _context2.next = 25;\n break;\n }\n\n i = 0;\n\n case 7:\n if (!(i < this.subKeys.length)) {\n _context2.next = 20;\n break;\n }\n\n if (!(!keyId || this.subKeys[i].subKey.getKeyId().equals(keyId))) {\n _context2.next = 17;\n break;\n }\n\n _context2.next = 11;\n return this.subKeys[i].verify(primaryKey, date);\n\n case 11:\n _context2.t2 = _context2.sent;\n _context2.t3 = _enums2.default.keyStatus.valid;\n\n if (!(_context2.t2 === _context2.t3)) {\n _context2.next = 17;\n break;\n }\n\n bindingSignature = getLatestSignature(this.subKeys[i].bindingSignatures, date);\n\n if (!isValidEncryptionKeyPacket(this.subKeys[i].subKey, bindingSignature, date)) {\n _context2.next = 17;\n break;\n }\n\n return _context2.abrupt('return', this.subKeys[i].subKey);\n\n case 17:\n i++;\n _context2.next = 7;\n break;\n\n case 20:\n _context2.next = 22;\n return this.getPrimaryUser(date, userId);\n\n case 22:\n primaryUser = _context2.sent;\n\n if (!(primaryUser && (!keyId || primaryKey.getKeyId().equals(keyId)) && isValidEncryptionKeyPacket(primaryKey, primaryUser.selfCertification, date))) {\n _context2.next = 25;\n break;\n }\n\n return _context2.abrupt('return', primaryKey);\n\n case 25:\n return _context2.abrupt('return', null);\n\n case 26:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function (_x9) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n/**\n * Encrypts all secret key and subkey packets matching keyId\n * @param {String|Array<String>} passphrases - if multiple passphrases, then should be in same order as packets each should encrypt\n * @param {module:type/keyid} keyId\n * @returns {Promise<Array<module:packet.SecretKey|module:packet.SecretSubkey>>}\n * @async\n */\nKey.prototype.encrypt = function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(passphrases) {\n var keyId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var keyPackets;\n return _regenerator2.default.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n if (this.isPrivate()) {\n _context4.next = 2;\n break;\n }\n\n throw new Error(\"Nothing to encrypt in a public key\");\n\n case 2:\n keyPackets = this.getKeyPackets(keyId);\n\n passphrases = _util2.default.isArray(passphrases) ? passphrases : new Array(keyPackets.length).fill(passphrases);\n\n if (!(passphrases.length !== keyPackets.length)) {\n _context4.next = 6;\n break;\n }\n\n throw new Error(\"Invalid number of passphrases for key\");\n\n case 6:\n return _context4.abrupt('return', _promise2.default.all(keyPackets.map(function () {\n var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(keyPacket, i) {\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return keyPacket.encrypt(passphrases[i]);\n\n case 2:\n _context3.next = 4;\n return keyPacket.clearPrivateParams();\n\n case 4:\n return _context3.abrupt('return', keyPacket);\n\n case 5:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n return function (_x14, _x15) {\n return _ref4.apply(this, arguments);\n };\n }())));\n\n case 7:\n case 'end':\n return _context4.stop();\n }\n }\n }, _callee4, this);\n }));\n\n return function (_x12) {\n return _ref3.apply(this, arguments);\n };\n}();\n\n/**\n * Decrypts all secret key and subkey packets matching keyId\n * @param {String|Array<String>} passphrases\n * @param {module:type/keyid} keyId\n * @returns {Promise<Boolean>} true if all matching key and subkey packets decrypted successfully\n * @async\n */\nKey.prototype.decrypt = function () {\n var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(passphrases) {\n var keyId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var results;\n return _regenerator2.default.wrap(function _callee7$(_context7) {\n while (1) {\n switch (_context7.prev = _context7.next) {\n case 0:\n if (this.isPrivate()) {\n _context7.next = 2;\n break;\n }\n\n throw new Error(\"Nothing to decrypt in a public key\");\n\n case 2:\n passphrases = _util2.default.isArray(passphrases) ? passphrases : [passphrases];\n\n _context7.next = 5;\n return _promise2.default.all(this.getKeyPackets(keyId).map(function () {\n var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(keyPacket) {\n var decrypted, error;\n return _regenerator2.default.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n decrypted = false;\n error = null;\n _context6.next = 4;\n return _promise2.default.all(passphrases.map(function () {\n var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(passphrase) {\n return _regenerator2.default.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n _context5.prev = 0;\n _context5.next = 3;\n return keyPacket.decrypt(passphrase);\n\n case 3:\n decrypted = true;\n _context5.next = 9;\n break;\n\n case 6:\n _context5.prev = 6;\n _context5.t0 = _context5['catch'](0);\n\n error = _context5.t0;\n\n case 9:\n case 'end':\n return _context5.stop();\n }\n }\n }, _callee5, this, [[0, 6]]);\n }));\n\n return function (_x19) {\n return _ref7.apply(this, arguments);\n };\n }()));\n\n case 4:\n if (decrypted) {\n _context6.next = 6;\n break;\n }\n\n throw error;\n\n case 6:\n return _context6.abrupt('return', decrypted);\n\n case 7:\n case 'end':\n return _context6.stop();\n }\n }\n }, _callee6, this);\n }));\n\n return function (_x18) {\n return _ref6.apply(this, arguments);\n };\n }()));\n\n case 5:\n results = _context7.sent;\n return _context7.abrupt('return', results.every(function (result) {\n return result === true;\n }));\n\n case 7:\n case 'end':\n return _context7.stop();\n }\n }\n }, _callee7, this);\n }));\n\n return function (_x16) {\n return _ref5.apply(this, arguments);\n };\n}();\n\n/**\n * Checks if a signature on a key is revoked\n * @param {module:packet.SecretKey|\n * @param {module:packet.Signature} signature The signature to verify\n * @param {module:packet.PublicSubkey|\n * module:packet.SecretSubkey|\n * module:packet.PublicKey|\n * module:packet.SecretKey} key, optional The key to verify the signature\n * @param {Date} date Use the given date instead of the current time\n * @returns {Promise<Boolean>} True if the certificate is revoked\n * @async\n */\nKey.prototype.isRevoked = function () {\n var _ref8 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(signature, key) {\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n return _regenerator2.default.wrap(function _callee8$(_context8) {\n while (1) {\n switch (_context8.prev = _context8.next) {\n case 0:\n return _context8.abrupt('return', isDataRevoked(this.primaryKey, { key: this.primaryKey }, this.revocationSignatures, signature, key, date));\n\n case 1:\n case 'end':\n return _context8.stop();\n }\n }\n }, _callee8, this);\n }));\n\n return function (_x20, _x21) {\n return _ref8.apply(this, arguments);\n };\n}();\n\n/**\n * Verify primary key. Checks for revocation signatures, expiration time\n * and valid self signature\n * @param {Date} date (optional) use the given date for verification instead of the current time\n * @param {Object} userId (optional) user ID\n * @returns {Promise<module:enums.keyStatus>} The status of the primary key\n * @async\n */\nKey.prototype.verifyPrimaryKey = function () {\n var _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9() {\n var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Date();\n var userId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var primaryKey, _ref10, user, selfCertification;\n\n return _regenerator2.default.wrap(function _callee9$(_context9) {\n while (1) {\n switch (_context9.prev = _context9.next) {\n case 0:\n primaryKey = this.primaryKey;\n // check for key revocation signatures\n\n _context9.next = 3;\n return this.isRevoked(null, null, date);\n\n case 3:\n if (!_context9.sent) {\n _context9.next = 5;\n break;\n }\n\n return _context9.abrupt('return', _enums2.default.keyStatus.revoked);\n\n case 5:\n if (this.users.some(function (user) {\n return user.userId && user.selfCertifications.length;\n })) {\n _context9.next = 7;\n break;\n }\n\n return _context9.abrupt('return', _enums2.default.keyStatus.no_self_cert);\n\n case 7:\n _context9.next = 9;\n return this.getPrimaryUser(date, userId);\n\n case 9:\n _context9.t0 = _context9.sent;\n\n if (_context9.t0) {\n _context9.next = 12;\n break;\n }\n\n _context9.t0 = {};\n\n case 12:\n _ref10 = _context9.t0;\n user = _ref10.user;\n selfCertification = _ref10.selfCertification;\n\n if (user) {\n _context9.next = 17;\n break;\n }\n\n return _context9.abrupt('return', _enums2.default.keyStatus.invalid);\n\n case 17:\n if (!isDataExpired(primaryKey, selfCertification, date)) {\n _context9.next = 19;\n break;\n }\n\n return _context9.abrupt('return', _enums2.default.keyStatus.expired);\n\n case 19:\n return _context9.abrupt('return', _enums2.default.keyStatus.valid);\n\n case 20:\n case 'end':\n return _context9.stop();\n }\n }\n }, _callee9, this);\n }));\n\n return function () {\n return _ref9.apply(this, arguments);\n };\n}();\n\n/**\n * Returns the expiration time of the primary key or Infinity if key does not expire\n * @returns {Promise<Date>}\n * @async\n */\nKey.prototype.getExpirationTime = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10() {\n var primaryUser, selfCert, keyExpiry, sigExpiry;\n return _regenerator2.default.wrap(function _callee10$(_context10) {\n while (1) {\n switch (_context10.prev = _context10.next) {\n case 0:\n if (!(this.primaryKey.version === 3)) {\n _context10.next = 2;\n break;\n }\n\n return _context10.abrupt('return', getExpirationTime(this.primaryKey));\n\n case 2:\n if (!(this.primaryKey.version >= 4)) {\n _context10.next = 10;\n break;\n }\n\n _context10.next = 5;\n return this.getPrimaryUser(null);\n\n case 5:\n primaryUser = _context10.sent;\n selfCert = primaryUser.selfCertification;\n keyExpiry = getExpirationTime(this.primaryKey, selfCert);\n sigExpiry = selfCert.getExpirationTime();\n return _context10.abrupt('return', keyExpiry < sigExpiry ? keyExpiry : sigExpiry);\n\n case 10:\n case 'end':\n return _context10.stop();\n }\n }\n }, _callee10, this);\n}));\n\n/**\n * Returns primary user and most significant (latest valid) self signature\n * - if multiple primary users exist, returns the one with the latest self signature\n * - otherwise, returns the user with the latest self signature\n * @param {Date} date use the given date for verification instead of the current time\n * @param {Object} userId (optional) user ID to get instead of the primary user, if it exists\n * @returns {Promise<{user: module:key.User,\n * selfCertification: module:packet.Signature}>} The primary user and the self signature\n * @async\n */\nKey.prototype.getPrimaryUser = function () {\n var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11() {\n var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Date();\n var userId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var users, primaryUser, user, cert, primaryKey, dataToVerify;\n return _regenerator2.default.wrap(function _callee11$(_context11) {\n while (1) {\n switch (_context11.prev = _context11.next) {\n case 0:\n users = this.users.map(function (user, index) {\n var selfCertification = getLatestSignature(user.selfCertifications, date);\n return { index: index, user: user, selfCertification: selfCertification };\n }).filter(function (_ref13) {\n var user = _ref13.user,\n selfCertification = _ref13.selfCertification;\n\n return user.userId && selfCertification && (userId.name === undefined || user.userId.name === userId.name) && (userId.email === undefined || user.userId.email === userId.email) && (userId.comment === undefined || user.userId.comment === userId.comment);\n });\n\n if (users.length) {\n _context11.next = 5;\n break;\n }\n\n if (!(userId.name !== undefined || userId.email !== undefined || userId.comment !== undefined)) {\n _context11.next = 4;\n break;\n }\n\n throw new Error('Could not find user that matches that user ID');\n\n case 4:\n return _context11.abrupt('return', null);\n\n case 5:\n // sort by primary user flag and signature creation time\n primaryUser = users.sort(function (a, b) {\n var A = a.selfCertification;\n var B = b.selfCertification;\n return A.isPrimaryUserID - B.isPrimaryUserID || A.created - B.created;\n }).pop();\n user = primaryUser.user, cert = primaryUser.selfCertification;\n primaryKey = this.primaryKey;\n dataToVerify = { userid: user.userId, key: primaryKey };\n // skip if certificates is invalid, revoked, or expired\n // eslint-disable-next-line no-await-in-loop\n\n _context11.t0 = cert.verified;\n\n if (_context11.t0) {\n _context11.next = 14;\n break;\n }\n\n _context11.next = 13;\n return cert.verify(primaryKey, dataToVerify);\n\n case 13:\n _context11.t0 = _context11.sent;\n\n case 14:\n if (_context11.t0) {\n _context11.next = 16;\n break;\n }\n\n return _context11.abrupt('return', null);\n\n case 16:\n _context11.t1 = cert.revoked;\n\n if (_context11.t1) {\n _context11.next = 21;\n break;\n }\n\n _context11.next = 20;\n return user.isRevoked(primaryKey, cert, null, date);\n\n case 20:\n _context11.t1 = _context11.sent;\n\n case 21:\n if (!_context11.t1) {\n _context11.next = 23;\n break;\n }\n\n return _context11.abrupt('return', null);\n\n case 23:\n if (!cert.isExpired(date)) {\n _context11.next = 25;\n break;\n }\n\n return _context11.abrupt('return', null);\n\n case 25:\n return _context11.abrupt('return', primaryUser);\n\n case 26:\n case 'end':\n return _context11.stop();\n }\n }\n }, _callee11, this);\n }));\n\n return function () {\n return _ref12.apply(this, arguments);\n };\n}();\n\n/**\n * Update key with new components from specified key with same key ID:\n * users, subkeys, certificates are merged into the destination key,\n * duplicates and expired signatures are ignored.\n *\n * If the specified key is a private key and the destination key is public,\n * the destination key is transformed to a private key.\n * @param {module:key.Key} key Source key to merge\n */\nKey.prototype.update = function () {\n var _ref14 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee16(key) {\n var _this = this;\n\n var equal;\n return _regenerator2.default.wrap(function _callee16$(_context16) {\n while (1) {\n switch (_context16.prev = _context16.next) {\n case 0:\n _context16.next = 2;\n return key.verifyPrimaryKey();\n\n case 2:\n _context16.t0 = _context16.sent;\n _context16.t1 = _enums2.default.keyStatus.invalid;\n\n if (!(_context16.t0 === _context16.t1)) {\n _context16.next = 6;\n break;\n }\n\n return _context16.abrupt('return');\n\n case 6:\n if (!(this.primaryKey.getFingerprint() !== key.primaryKey.getFingerprint())) {\n _context16.next = 8;\n break;\n }\n\n throw new Error('Key update method: fingerprints of keys not equal');\n\n case 8:\n if (!(this.isPublic() && key.isPrivate())) {\n _context16.next = 13;\n break;\n }\n\n // check for equal subkey packets\n equal = this.subKeys.length === key.subKeys.length && this.subKeys.every(function (destSubKey) {\n return key.subKeys.some(function (srcSubKey) {\n return destSubKey.subKey.getFingerprint() === srcSubKey.subKey.getFingerprint();\n });\n });\n\n if (equal) {\n _context16.next = 12;\n break;\n }\n\n throw new Error('Cannot update public key with private key if subkey mismatch');\n\n case 12:\n this.primaryKey = key.primaryKey;\n\n case 13:\n _context16.next = 15;\n return mergeSignatures(key, this, 'revocationSignatures', function (srcRevSig) {\n return isDataRevoked(_this.primaryKey, _this, [srcRevSig], null, key.primaryKey);\n });\n\n case 15:\n _context16.next = 17;\n return mergeSignatures(key, this, 'directSignatures');\n\n case 17:\n _context16.next = 19;\n return _promise2.default.all(key.users.map(function () {\n var _ref15 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee13(srcUser) {\n var found;\n return _regenerator2.default.wrap(function _callee13$(_context13) {\n while (1) {\n switch (_context13.prev = _context13.next) {\n case 0:\n found = false;\n _context13.next = 3;\n return _promise2.default.all(_this.users.map(function () {\n var _ref16 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee12(dstUser) {\n return _regenerator2.default.wrap(function _callee12$(_context12) {\n while (1) {\n switch (_context12.prev = _context12.next) {\n case 0:\n if (!(srcUser.userId && dstUser.userId && srcUser.userId.userid === dstUser.userId.userid || srcUser.userAttribute && srcUser.userAttribute.equals(dstUser.userAttribute))) {\n _context12.next = 4;\n break;\n }\n\n _context12.next = 3;\n return dstUser.update(srcUser, _this.primaryKey);\n\n case 3:\n found = true;\n\n case 4:\n case 'end':\n return _context12.stop();\n }\n }\n }, _callee12, _this);\n }));\n\n return function (_x29) {\n return _ref16.apply(this, arguments);\n };\n }()));\n\n case 3:\n if (!found) {\n _this.users.push(srcUser);\n }\n\n case 4:\n case 'end':\n return _context13.stop();\n }\n }\n }, _callee13, _this);\n }));\n\n return function (_x28) {\n return _ref15.apply(this, arguments);\n };\n }()));\n\n case 19:\n _context16.next = 21;\n return _promise2.default.all(key.subKeys.map(function () {\n var _ref17 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee15(srcSubKey) {\n var found;\n return _regenerator2.default.wrap(function _callee15$(_context15) {\n while (1) {\n switch (_context15.prev = _context15.next) {\n case 0:\n found = false;\n _context15.next = 3;\n return _promise2.default.all(_this.subKeys.map(function () {\n var _ref18 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee14(dstSubKey) {\n return _regenerator2.default.wrap(function _callee14$(_context14) {\n while (1) {\n switch (_context14.prev = _context14.next) {\n case 0:\n if (!(srcSubKey.subKey.getFingerprint() === dstSubKey.subKey.getFingerprint())) {\n _context14.next = 4;\n break;\n }\n\n _context14.next = 3;\n return dstSubKey.update(srcSubKey, _this.primaryKey);\n\n case 3:\n found = true;\n\n case 4:\n case 'end':\n return _context14.stop();\n }\n }\n }, _callee14, _this);\n }));\n\n return function (_x31) {\n return _ref18.apply(this, arguments);\n };\n }()));\n\n case 3:\n if (!found) {\n _this.subKeys.push(srcSubKey);\n }\n\n case 4:\n case 'end':\n return _context15.stop();\n }\n }\n }, _callee15, _this);\n }));\n\n return function (_x30) {\n return _ref17.apply(this, arguments);\n };\n }()));\n\n case 21:\n case 'end':\n return _context16.stop();\n }\n }\n }, _callee16, this);\n }));\n\n return function (_x27) {\n return _ref14.apply(this, arguments);\n };\n}();Key.prototype.revoke = function () {\n var _ref21 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee19() {\n var _ref22 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref22$flag = _ref22.flag,\n reasonForRevocationFlag = _ref22$flag === undefined ? _enums2.default.reasonForRevocation.no_reason : _ref22$flag,\n _ref22$string = _ref22.string,\n reasonForRevocationString = _ref22$string === undefined ? '' : _ref22$string;\n\n var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date();\n var dataToSign, key;\n return _regenerator2.default.wrap(function _callee19$(_context19) {\n while (1) {\n switch (_context19.prev = _context19.next) {\n case 0:\n if (!this.isPublic()) {\n _context19.next = 2;\n break;\n }\n\n throw new Error('Need private key for revoking');\n\n case 2:\n dataToSign = { key: this.primaryKey };\n key = new Key(this.toPacketlist());\n _context19.t0 = key.revocationSignatures;\n _context19.next = 7;\n return createSignaturePacket(dataToSign, null, this.primaryKey, {\n signatureType: _enums2.default.signature.key_revocation,\n reasonForRevocationFlag: _enums2.default.write(_enums2.default.reasonForRevocation, reasonForRevocationFlag),\n reasonForRevocationString: reasonForRevocationString\n }, date);\n\n case 7:\n _context19.t1 = _context19.sent;\n\n _context19.t0.push.call(_context19.t0, _context19.t1);\n\n return _context19.abrupt('return', key);\n\n case 10:\n case 'end':\n return _context19.stop();\n }\n }\n }, _callee19, this);\n }));\n\n return function () {\n return _ref21.apply(this, arguments);\n };\n}();\n\n/**\n * Get revocation certificate from a revoked key.\n * (To get a revocation certificate for an unrevoked key, call revoke() first.)\n * @return {String} armored revocation certificate\n */\nKey.prototype.getRevocationCertificate = function () {\n if (this.revocationSignatures.length) {\n var packetlist = new _packet2.default.List();\n packetlist.push(getLatestSignature(this.revocationSignatures));\n return _armor2.default.encode(_enums2.default.armor.public_key, packetlist.write(), null, null, 'This is a revocation certificate');\n }\n};\n\n/**\n * Applies a revocation certificate to a key\n * This adds the first signature packet in the armored text to the key,\n * if it is a valid revocation signature.\n * @param {String} revocationCertificate armored revocation certificate\n * @return {module:key~Key} new revoked key\n */\nKey.prototype.applyRevocationCertificate = function () {\n var _ref23 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee20(revocationCertificate) {\n var input, packetlist, revocationSignature, key;\n return _regenerator2.default.wrap(function _callee20$(_context20) {\n while (1) {\n switch (_context20.prev = _context20.next) {\n case 0:\n input = _armor2.default.decode(revocationCertificate);\n packetlist = new _packet2.default.List();\n\n packetlist.read(input.data);\n revocationSignature = packetlist.findPacket(_enums2.default.packet.signature);\n\n if (!(!revocationSignature || revocationSignature.signatureType !== _enums2.default.signature.key_revocation)) {\n _context20.next = 6;\n break;\n }\n\n throw new Error('Could not find revocation signature packet');\n\n case 6:\n if (revocationSignature.issuerKeyId.equals(this.primaryKey.getKeyId())) {\n _context20.next = 8;\n break;\n }\n\n throw new Error('Revocation signature does not match key');\n\n case 8:\n if (!revocationSignature.isExpired()) {\n _context20.next = 10;\n break;\n }\n\n throw new Error('Revocation signature is expired');\n\n case 10:\n _context20.next = 12;\n return revocationSignature.verify(this.primaryKey, { key: this.primaryKey });\n\n case 12:\n if (_context20.sent) {\n _context20.next = 14;\n break;\n }\n\n throw new Error('Could not verify revocation signature');\n\n case 14:\n key = new Key(this.toPacketlist());\n\n key.revocationSignatures.push(revocationSignature);\n return _context20.abrupt('return', key);\n\n case 17:\n case 'end':\n return _context20.stop();\n }\n }\n }, _callee20, this);\n }));\n\n return function (_x39) {\n return _ref23.apply(this, arguments);\n };\n}();\n\n/**\n * Signs primary user of key\n * @param {Array<module:key.Key>} privateKey decrypted private keys for signing\n * @returns {Promise<module:key.Key>} new public key with new certificate signature\n * @async\n */\nKey.prototype.signPrimaryUser = function () {\n var _ref24 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee21(privateKeys) {\n var _ref25, index, user, userSign, key;\n\n return _regenerator2.default.wrap(function _callee21$(_context21) {\n while (1) {\n switch (_context21.prev = _context21.next) {\n case 0:\n _context21.next = 2;\n return this.getPrimaryUser();\n\n case 2:\n _context21.t0 = _context21.sent;\n\n if (_context21.t0) {\n _context21.next = 5;\n break;\n }\n\n _context21.t0 = {};\n\n case 5:\n _ref25 = _context21.t0;\n index = _ref25.index;\n user = _ref25.user;\n\n if (user) {\n _context21.next = 10;\n break;\n }\n\n throw new Error('Could not find primary user');\n\n case 10:\n _context21.next = 12;\n return user.sign(this.primaryKey, privateKeys);\n\n case 12:\n userSign = _context21.sent;\n key = new Key(this.toPacketlist());\n\n key.users[index] = userSign;\n return _context21.abrupt('return', key);\n\n case 16:\n case 'end':\n return _context21.stop();\n }\n }\n }, _callee21, this);\n }));\n\n return function (_x40) {\n return _ref24.apply(this, arguments);\n };\n}();\n\n/**\n * Signs all users of key\n * @param {Array<module:key.Key>} privateKeys decrypted private keys for signing\n * @returns {Promise<module:key.Key>} new public key with new certificate signature\n * @async\n */\nKey.prototype.signAllUsers = function () {\n var _ref26 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee22(privateKeys) {\n var that, key;\n return _regenerator2.default.wrap(function _callee22$(_context22) {\n while (1) {\n switch (_context22.prev = _context22.next) {\n case 0:\n that = this;\n key = new Key(this.toPacketlist());\n _context22.next = 4;\n return _promise2.default.all(this.users.map(function (user) {\n return user.sign(that.primaryKey, privateKeys);\n }));\n\n case 4:\n key.users = _context22.sent;\n return _context22.abrupt('return', key);\n\n case 6:\n case 'end':\n return _context22.stop();\n }\n }\n }, _callee22, this);\n }));\n\n return function (_x41) {\n return _ref26.apply(this, arguments);\n };\n}();\n\n/**\n * Verifies primary user of key\n * - if no arguments are given, verifies the self certificates;\n * - otherwise, verifies all certificates signed with given keys.\n * @param {Array<module:key.Key>} keys array of keys to verify certificate signatures\n * @returns {Promise<Array<{keyid: module:type/keyid,\n * valid: Boolean}>>} List of signer's keyid and validity of signature\n * @async\n */\nKey.prototype.verifyPrimaryUser = function () {\n var _ref27 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee23(keys) {\n var primaryKey, _ref28, user, results;\n\n return _regenerator2.default.wrap(function _callee23$(_context23) {\n while (1) {\n switch (_context23.prev = _context23.next) {\n case 0:\n primaryKey = this.primaryKey;\n _context23.next = 3;\n return this.getPrimaryUser();\n\n case 3:\n _context23.t0 = _context23.sent;\n\n if (_context23.t0) {\n _context23.next = 6;\n break;\n }\n\n _context23.t0 = {};\n\n case 6:\n _ref28 = _context23.t0;\n user = _ref28.user;\n\n if (user) {\n _context23.next = 10;\n break;\n }\n\n throw new Error('Could not find primary user');\n\n case 10:\n if (!keys) {\n _context23.next = 16;\n break;\n }\n\n _context23.next = 13;\n return user.verifyAllCertifications(primaryKey, keys);\n\n case 13:\n _context23.t1 = _context23.sent;\n _context23.next = 24;\n break;\n\n case 16:\n _context23.t2 = primaryKey.keyid;\n _context23.next = 19;\n return user.verify(primaryKey);\n\n case 19:\n _context23.t3 = _context23.sent;\n _context23.t4 = _enums2.default.keyStatus.valid;\n _context23.t5 = _context23.t3 === _context23.t4;\n _context23.t6 = {\n keyid: _context23.t2,\n valid: _context23.t5\n };\n _context23.t1 = [_context23.t6];\n\n case 24:\n results = _context23.t1;\n return _context23.abrupt('return', results);\n\n case 26:\n case 'end':\n return _context23.stop();\n }\n }\n }, _callee23, this);\n }));\n\n return function (_x42) {\n return _ref27.apply(this, arguments);\n };\n}();\n\n/**\n * Verifies all users of key\n * - if no arguments are given, verifies the self certificates;\n * - otherwise, verifies all certificates signed with given keys.\n * @param {Array<module:key.Key>} keys array of keys to verify certificate signatures\n * @returns {Promise<Array<{userid: String,\n * keyid: module:type/keyid,\n * valid: Boolean}>>} list of userid, signer's keyid and validity of signature\n * @async\n */\nKey.prototype.verifyAllUsers = function () {\n var _ref29 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee25(keys) {\n var results, primaryKey;\n return _regenerator2.default.wrap(function _callee25$(_context25) {\n while (1) {\n switch (_context25.prev = _context25.next) {\n case 0:\n results = [];\n primaryKey = this.primaryKey;\n _context25.next = 4;\n return _promise2.default.all(this.users.map(function () {\n var _ref30 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee24(user) {\n var signatures;\n return _regenerator2.default.wrap(function _callee24$(_context24) {\n while (1) {\n switch (_context24.prev = _context24.next) {\n case 0:\n if (!keys) {\n _context24.next = 6;\n break;\n }\n\n _context24.next = 3;\n return user.verifyAllCertifications(primaryKey, keys);\n\n case 3:\n _context24.t0 = _context24.sent;\n _context24.next = 14;\n break;\n\n case 6:\n _context24.t1 = primaryKey.keyid;\n _context24.next = 9;\n return user.verify(primaryKey);\n\n case 9:\n _context24.t2 = _context24.sent;\n _context24.t3 = _enums2.default.keyStatus.valid;\n _context24.t4 = _context24.t2 === _context24.t3;\n _context24.t5 = {\n keyid: _context24.t1,\n valid: _context24.t4\n };\n _context24.t0 = [_context24.t5];\n\n case 14:\n signatures = _context24.t0;\n\n signatures.forEach(function (signature) {\n results.push({\n userid: user.userId.userid,\n keyid: signature.keyid,\n valid: signature.valid\n });\n });\n\n case 16:\n case 'end':\n return _context24.stop();\n }\n }\n }, _callee24, this);\n }));\n\n return function (_x44) {\n return _ref30.apply(this, arguments);\n };\n }()));\n\n case 4:\n return _context25.abrupt('return', results);\n\n case 5:\n case 'end':\n return _context25.stop();\n }\n }\n }, _callee25, this);\n }));\n\n return function (_x43) {\n return _ref29.apply(this, arguments);\n };\n}();\n\n/**\n * @class\n * @classdesc Class that represents an user ID or attribute packet and the relevant signatures.\n */\nfunction User(userPacket) {\n if (!(this instanceof User)) {\n return new User(userPacket);\n }\n this.userId = userPacket.tag === _enums2.default.packet.userid ? userPacket : null;\n this.userAttribute = userPacket.tag === _enums2.default.packet.userAttribute ? userPacket : null;\n this.selfCertifications = [];\n this.otherCertifications = [];\n this.revocationSignatures = [];\n}\n\n/**\n * Transforms structured user data to packetlist\n * @returns {module:packet.List}\n */\nUser.prototype.toPacketlist = function () {\n var packetlist = new _packet2.default.List();\n packetlist.push(this.userId || this.userAttribute);\n packetlist.concat(this.revocationSignatures);\n packetlist.concat(this.selfCertifications);\n packetlist.concat(this.otherCertifications);\n return packetlist;\n};\n\n/**\n * Signs user\n * @param {module:packet.SecretKey|\n * module:packet.PublicKey} primaryKey The primary key packet\n * @param {Array<module:key.Key>} privateKeys Decrypted private keys for signing\n * @returns {Promise<module:key.Key>} New user with new certificate signatures\n * @async\n */\nUser.prototype.sign = function () {\n var _ref31 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee27(primaryKey, privateKeys) {\n var dataToSign, user;\n return _regenerator2.default.wrap(function _callee27$(_context27) {\n while (1) {\n switch (_context27.prev = _context27.next) {\n case 0:\n dataToSign = { userid: this.userId || this.userAttribute, key: primaryKey };\n user = new User(dataToSign.userid);\n _context27.next = 4;\n return _promise2.default.all(privateKeys.map(function () {\n var _ref32 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee26(privateKey) {\n var signingKeyPacket;\n return _regenerator2.default.wrap(function _callee26$(_context26) {\n while (1) {\n switch (_context26.prev = _context26.next) {\n case 0:\n if (!privateKey.isPublic()) {\n _context26.next = 2;\n break;\n }\n\n throw new Error('Need private key for signing');\n\n case 2:\n if (!(privateKey.primaryKey.getFingerprint() === primaryKey.getFingerprint())) {\n _context26.next = 4;\n break;\n }\n\n throw new Error('Not implemented for self signing');\n\n case 4:\n _context26.next = 6;\n return privateKey.getSigningKeyPacket();\n\n case 6:\n signingKeyPacket = _context26.sent;\n\n if (signingKeyPacket) {\n _context26.next = 9;\n break;\n }\n\n throw new Error('Could not find valid signing key packet in key ' + privateKey.primaryKey.getKeyId().toHex());\n\n case 9:\n if (signingKeyPacket.isDecrypted) {\n _context26.next = 11;\n break;\n }\n\n throw new Error('Private key is not decrypted.');\n\n case 11:\n return _context26.abrupt('return', createSignaturePacket(dataToSign, privateKey, signingKeyPacket, {\n // Most OpenPGP implementations use generic certification (0x10)\n signatureType: _enums2.default.signature.cert_generic,\n keyFlags: [_enums2.default.keyFlags.certify_keys | _enums2.default.keyFlags.sign_data]\n }));\n\n case 12:\n case 'end':\n return _context26.stop();\n }\n }\n }, _callee26, this);\n }));\n\n return function (_x47) {\n return _ref32.apply(this, arguments);\n };\n }()));\n\n case 4:\n user.otherCertifications = _context27.sent;\n _context27.next = 7;\n return user.update(this, primaryKey);\n\n case 7:\n return _context27.abrupt('return', user);\n\n case 8:\n case 'end':\n return _context27.stop();\n }\n }\n }, _callee27, this);\n }));\n\n return function (_x45, _x46) {\n return _ref31.apply(this, arguments);\n };\n}();\n\n/**\n * Checks if a given certificate of the user is revoked\n * @param {module:packet.SecretKey|\n * module:packet.PublicKey} primaryKey The primary key packet\n * @param {module:packet.Signature} certificate The certificate to verify\n * @param {module:packet.PublicSubkey|\n * module:packet.SecretSubkey|\n * module:packet.PublicKey|\n * module:packet.SecretKey} key, optional The key to verify the signature\n * @param {Date} date Use the given date instead of the current time\n * @returns {Promise<Boolean>} True if the certificate is revoked\n * @async\n */\nUser.prototype.isRevoked = function () {\n var _ref33 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee28(primaryKey, certificate, key) {\n var date = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new Date();\n return _regenerator2.default.wrap(function _callee28$(_context28) {\n while (1) {\n switch (_context28.prev = _context28.next) {\n case 0:\n return _context28.abrupt('return', isDataRevoked(primaryKey, {\n key: primaryKey,\n userid: this.userId || this.userAttribute\n }, this.revocationSignatures, certificate, key, date));\n\n case 1:\n case 'end':\n return _context28.stop();\n }\n }\n }, _callee28, this);\n }));\n\n return function (_x48, _x49, _x50) {\n return _ref33.apply(this, arguments);\n };\n}();User.prototype.verifyCertificate = function () {\n var _ref35 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee31(primaryKey, certificate, keys) {\n var date = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new Date();\n var that, keyid, dataToVerify, results;\n return _regenerator2.default.wrap(function _callee31$(_context31) {\n while (1) {\n switch (_context31.prev = _context31.next) {\n case 0:\n that = this;\n keyid = certificate.issuerKeyId;\n dataToVerify = { userid: this.userId || this.userAttribute, key: primaryKey };\n _context31.next = 5;\n return _promise2.default.all(keys.map(function () {\n var _ref36 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee30(key) {\n var keyPacket;\n return _regenerator2.default.wrap(function _callee30$(_context30) {\n while (1) {\n switch (_context30.prev = _context30.next) {\n case 0:\n if (key.getKeyIds().some(function (id) {\n return id.equals(keyid);\n })) {\n _context30.next = 2;\n break;\n }\n\n return _context30.abrupt('return');\n\n case 2:\n _context30.next = 4;\n return key.getSigningKeyPacket(keyid, date);\n\n case 4:\n keyPacket = _context30.sent;\n _context30.t0 = certificate.revoked;\n\n if (_context30.t0) {\n _context30.next = 10;\n break;\n }\n\n _context30.next = 9;\n return that.isRevoked(primaryKey, certificate, keyPacket);\n\n case 9:\n _context30.t0 = _context30.sent;\n\n case 10:\n if (!_context30.t0) {\n _context30.next = 12;\n break;\n }\n\n return _context30.abrupt('return', _enums2.default.keyStatus.revoked);\n\n case 12:\n _context30.t1 = certificate.verified;\n\n if (_context30.t1) {\n _context30.next = 17;\n break;\n }\n\n _context30.next = 16;\n return certificate.verify(keyPacket, dataToVerify);\n\n case 16:\n _context30.t1 = _context30.sent;\n\n case 17:\n if (_context30.t1) {\n _context30.next = 19;\n break;\n }\n\n return _context30.abrupt('return', _enums2.default.keyStatus.invalid);\n\n case 19:\n if (!certificate.isExpired()) {\n _context30.next = 21;\n break;\n }\n\n return _context30.abrupt('return', _enums2.default.keyStatus.expired);\n\n case 21:\n return _context30.abrupt('return', _enums2.default.keyStatus.valid);\n\n case 22:\n case 'end':\n return _context30.stop();\n }\n }\n }, _callee30, this);\n }));\n\n return function (_x62) {\n return _ref36.apply(this, arguments);\n };\n }()));\n\n case 5:\n results = _context31.sent;\n return _context31.abrupt('return', results.find(function (result) {\n return result !== undefined;\n }));\n\n case 7:\n case 'end':\n return _context31.stop();\n }\n }\n }, _callee31, this);\n }));\n\n return function (_x58, _x59, _x60) {\n return _ref35.apply(this, arguments);\n };\n}();\n\n/**\n * Verifies all user certificates\n * @param {module:packet.SecretKey|\n * module:packet.PublicKey} primaryKey The primary key packet\n * @param {Array<module:key.Key>} keys Array of keys to verify certificate signatures\n * @returns {Promise<Array<{keyid: module:type/keyid,\n * valid: Boolean}>>} List of signer's keyid and validity of signature\n * @async\n */\nUser.prototype.verifyAllCertifications = function () {\n var _ref37 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee33(primaryKey, keys) {\n var that, certifications;\n return _regenerator2.default.wrap(function _callee33$(_context33) {\n while (1) {\n switch (_context33.prev = _context33.next) {\n case 0:\n that = this;\n certifications = this.selfCertifications.concat(this.otherCertifications);\n return _context33.abrupt('return', _promise2.default.all(certifications.map(function () {\n var _ref38 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee32(certification) {\n var status;\n return _regenerator2.default.wrap(function _callee32$(_context32) {\n while (1) {\n switch (_context32.prev = _context32.next) {\n case 0:\n _context32.next = 2;\n return that.verifyCertificate(primaryKey, certification, keys);\n\n case 2:\n status = _context32.sent;\n return _context32.abrupt('return', {\n keyid: certification.issuerKeyId,\n valid: status === undefined ? null : status === _enums2.default.keyStatus.valid\n });\n\n case 4:\n case 'end':\n return _context32.stop();\n }\n }\n }, _callee32, this);\n }));\n\n return function (_x65) {\n return _ref38.apply(this, arguments);\n };\n }())));\n\n case 3:\n case 'end':\n return _context33.stop();\n }\n }\n }, _callee33, this);\n }));\n\n return function (_x63, _x64) {\n return _ref37.apply(this, arguments);\n };\n}();\n\n/**\n * Verify User. Checks for existence of self signatures, revocation signatures\n * and validity of self signature\n * @param {module:packet.SecretKey|\n * module:packet.PublicKey} primaryKey The primary key packet\n * @returns {Promise<module:enums.keyStatus>} Status of user\n * @async\n */\nUser.prototype.verify = function () {\n var _ref39 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee35(primaryKey) {\n var that, dataToVerify, results;\n return _regenerator2.default.wrap(function _callee35$(_context35) {\n while (1) {\n switch (_context35.prev = _context35.next) {\n case 0:\n if (this.selfCertifications.length) {\n _context35.next = 2;\n break;\n }\n\n return _context35.abrupt('return', _enums2.default.keyStatus.no_self_cert);\n\n case 2:\n that = this;\n dataToVerify = { userid: this.userId || this.userAttribute, key: primaryKey };\n // TODO replace when Promise.some or Promise.any are implemented\n\n _context35.t0 = [_enums2.default.keyStatus.invalid];\n _context35.next = 7;\n return _promise2.default.all(this.selfCertifications.map(function () {\n var _ref40 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee34(selfCertification) {\n return _regenerator2.default.wrap(function _callee34$(_context34) {\n while (1) {\n switch (_context34.prev = _context34.next) {\n case 0:\n _context34.t0 = selfCertification.revoked;\n\n if (_context34.t0) {\n _context34.next = 5;\n break;\n }\n\n _context34.next = 4;\n return that.isRevoked(primaryKey, selfCertification);\n\n case 4:\n _context34.t0 = _context34.sent;\n\n case 5:\n if (!_context34.t0) {\n _context34.next = 7;\n break;\n }\n\n return _context34.abrupt('return', _enums2.default.keyStatus.revoked);\n\n case 7:\n _context34.t1 = selfCertification.verified;\n\n if (_context34.t1) {\n _context34.next = 12;\n break;\n }\n\n _context34.next = 11;\n return selfCertification.verify(primaryKey, dataToVerify);\n\n case 11:\n _context34.t1 = _context34.sent;\n\n case 12:\n if (_context34.t1) {\n _context34.next = 14;\n break;\n }\n\n return _context34.abrupt('return', _enums2.default.keyStatus.invalid);\n\n case 14:\n if (!selfCertification.isExpired()) {\n _context34.next = 16;\n break;\n }\n\n return _context34.abrupt('return', _enums2.default.keyStatus.expired);\n\n case 16:\n return _context34.abrupt('return', _enums2.default.keyStatus.valid);\n\n case 17:\n case 'end':\n return _context34.stop();\n }\n }\n }, _callee34, this);\n }));\n\n return function (_x67) {\n return _ref40.apply(this, arguments);\n };\n }()));\n\n case 7:\n _context35.t1 = _context35.sent;\n results = _context35.t0.concat.call(_context35.t0, _context35.t1);\n return _context35.abrupt('return', results.some(function (status) {\n return status === _enums2.default.keyStatus.valid;\n }) ? _enums2.default.keyStatus.valid : results.pop());\n\n case 10:\n case 'end':\n return _context35.stop();\n }\n }\n }, _callee35, this);\n }));\n\n return function (_x66) {\n return _ref39.apply(this, arguments);\n };\n}();\n\n/**\n * Update user with new components from specified user\n * @param {module:key.User} user Source user to merge\n * @param {module:packet.SecretKey|\n * module:packet.SecretSubkey} primaryKey primary key used for validation\n */\nUser.prototype.update = function () {\n var _ref41 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee37(user, primaryKey) {\n var dataToVerify;\n return _regenerator2.default.wrap(function _callee37$(_context37) {\n while (1) {\n switch (_context37.prev = _context37.next) {\n case 0:\n dataToVerify = { userid: this.userId || this.userAttribute, key: primaryKey };\n // self signatures\n\n _context37.next = 3;\n return mergeSignatures(user, this, 'selfCertifications', function () {\n var _ref42 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee36(srcSelfSig) {\n return _regenerator2.default.wrap(function _callee36$(_context36) {\n while (1) {\n switch (_context36.prev = _context36.next) {\n case 0:\n return _context36.abrupt('return', srcSelfSig.verified || srcSelfSig.verify(primaryKey, dataToVerify));\n\n case 1:\n case 'end':\n return _context36.stop();\n }\n }\n }, _callee36, this);\n }));\n\n return function (_x70) {\n return _ref42.apply(this, arguments);\n };\n }());\n\n case 3:\n _context37.next = 5;\n return mergeSignatures(user, this, 'otherCertifications');\n\n case 5:\n _context37.next = 7;\n return mergeSignatures(user, this, 'revocationSignatures', function (srcRevSig) {\n return isDataRevoked(primaryKey, dataToVerify, [srcRevSig]);\n });\n\n case 7:\n case 'end':\n return _context37.stop();\n }\n }\n }, _callee37, this);\n }));\n\n return function (_x68, _x69) {\n return _ref41.apply(this, arguments);\n };\n}();\n\n/**\n * @class\n * @classdesc Class that represents a subkey packet and the relevant signatures.\n */\nfunction SubKey(subKeyPacket) {\n if (!(this instanceof SubKey)) {\n return new SubKey(subKeyPacket);\n }\n this.subKey = subKeyPacket;\n this.bindingSignatures = [];\n this.revocationSignatures = [];\n}\n\n/**\n * Transforms structured subkey data to packetlist\n * @returns {module:packet.List}\n */\nSubKey.prototype.toPacketlist = function () {\n var packetlist = new _packet2.default.List();\n packetlist.push(this.subKey);\n packetlist.concat(this.revocationSignatures);\n packetlist.concat(this.bindingSignatures);\n return packetlist;\n};\n\n/**\n * Checks if a binding signature of a subkey is revoked\n * @param {module:packet.SecretKey|\n * module:packet.PublicKey} primaryKey The primary key packet\n * @param {module:packet.Signature} signature The binding signature to verify\n * @param {module:packet.PublicSubkey|\n * module:packet.SecretSubkey|\n * module:packet.PublicKey|\n * module:packet.SecretKey} key, optional The key to verify the signature\n * @param {Date} date Use the given date instead of the current time\n * @returns {Promise<Boolean>} True if the binding signature is revoked\n * @async\n */\nSubKey.prototype.isRevoked = function () {\n var _ref43 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee38(primaryKey, signature, key) {\n var date = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new Date();\n return _regenerator2.default.wrap(function _callee38$(_context38) {\n while (1) {\n switch (_context38.prev = _context38.next) {\n case 0:\n return _context38.abrupt('return', isDataRevoked(primaryKey, {\n key: primaryKey,\n bind: this.subKey\n }, this.revocationSignatures, signature, key, date));\n\n case 1:\n case 'end':\n return _context38.stop();\n }\n }\n }, _callee38, this);\n }));\n\n return function (_x71, _x72, _x73) {\n return _ref43.apply(this, arguments);\n };\n}();\n\n/**\n * Verify subkey. Checks for revocation signatures, expiration time\n * and valid binding signature\n * @param {module:packet.SecretKey|\n * module:packet.PublicKey} primaryKey The primary key packet\n * @param {Date} date Use the given date instead of the current time\n * @returns {Promise<module:enums.keyStatus>} The status of the subkey\n * @async\n */\nSubKey.prototype.verify = function () {\n var _ref44 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee39(primaryKey) {\n var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date();\n var that, dataToVerify, bindingSignature;\n return _regenerator2.default.wrap(function _callee39$(_context39) {\n while (1) {\n switch (_context39.prev = _context39.next) {\n case 0:\n that = this;\n dataToVerify = { key: primaryKey, bind: this.subKey };\n // check for V3 expiration time\n\n if (!(this.subKey.version === 3 && isDataExpired(this.subKey, null, date))) {\n _context39.next = 4;\n break;\n }\n\n return _context39.abrupt('return', _enums2.default.keyStatus.expired);\n\n case 4:\n // check subkey binding signatures\n bindingSignature = getLatestSignature(this.bindingSignatures, date);\n // check binding signature is verified\n\n _context39.t0 = bindingSignature.verified;\n\n if (_context39.t0) {\n _context39.next = 10;\n break;\n }\n\n _context39.next = 9;\n return bindingSignature.verify(primaryKey, dataToVerify);\n\n case 9:\n _context39.t0 = _context39.sent;\n\n case 10:\n if (_context39.t0) {\n _context39.next = 12;\n break;\n }\n\n return _context39.abrupt('return', _enums2.default.keyStatus.invalid);\n\n case 12:\n _context39.t1 = bindingSignature.revoked;\n\n if (_context39.t1) {\n _context39.next = 17;\n break;\n }\n\n _context39.next = 16;\n return that.isRevoked(primaryKey, bindingSignature, null, date);\n\n case 16:\n _context39.t1 = _context39.sent;\n\n case 17:\n if (!_context39.t1) {\n _context39.next = 19;\n break;\n }\n\n return _context39.abrupt('return', _enums2.default.keyStatus.revoked);\n\n case 19:\n if (!bindingSignature.isExpired(date)) {\n _context39.next = 21;\n break;\n }\n\n return _context39.abrupt('return', _enums2.default.keyStatus.expired);\n\n case 21:\n return _context39.abrupt('return', _enums2.default.keyStatus.valid);\n\n case 22:\n case 'end':\n return _context39.stop();\n }\n }\n }, _callee39, this);\n }));\n\n return function (_x75) {\n return _ref44.apply(this, arguments);\n };\n}();\n\n/**\n * Returns the expiration time of the subkey or Infinity if key does not expire\n * @param {Date} date Use the given date instead of the current time\n * @returns {Date}\n */\nSubKey.prototype.getExpirationTime = function () {\n var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Date();\n\n var bindingSignature = getLatestSignature(this.bindingSignatures, date);\n var keyExpiry = getExpirationTime(this.subKey, bindingSignature);\n var sigExpiry = bindingSignature.getExpirationTime();\n return keyExpiry < sigExpiry ? keyExpiry : sigExpiry;\n};\n\n/**\n * Update subkey with new components from specified subkey\n * @param {module:key.SubKey} subKey Source subkey to merge\n * @param {module:packet.SecretKey|\n module:packet.SecretSubkey} primaryKey primary key used for validation\n */\nSubKey.prototype.update = function () {\n var _ref45 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee41(subKey, primaryKey) {\n var that, dataToVerify;\n return _regenerator2.default.wrap(function _callee41$(_context41) {\n while (1) {\n switch (_context41.prev = _context41.next) {\n case 0:\n _context41.next = 2;\n return subKey.verify(primaryKey);\n\n case 2:\n _context41.t0 = _context41.sent;\n _context41.t1 = _enums2.default.keyStatus.invalid;\n\n if (!(_context41.t0 === _context41.t1)) {\n _context41.next = 6;\n break;\n }\n\n return _context41.abrupt('return');\n\n case 6:\n if (!(this.subKey.getFingerprint() !== subKey.subKey.getFingerprint())) {\n _context41.next = 8;\n break;\n }\n\n throw new Error('SubKey update method: fingerprints of subkeys not equal');\n\n case 8:\n // key packet\n if (this.subKey.tag === _enums2.default.packet.publicSubkey && subKey.subKey.tag === _enums2.default.packet.secretSubkey) {\n this.subKey = subKey.subKey;\n }\n // update missing binding signatures\n that = this;\n dataToVerify = { key: primaryKey, bind: that.subKey };\n _context41.next = 13;\n return mergeSignatures(subKey, this, 'bindingSignatures', function () {\n var _ref46 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee40(srcBindSig) {\n var i;\n return _regenerator2.default.wrap(function _callee40$(_context40) {\n while (1) {\n switch (_context40.prev = _context40.next) {\n case 0:\n _context40.t0 = srcBindSig.verified;\n\n if (_context40.t0) {\n _context40.next = 5;\n break;\n }\n\n _context40.next = 4;\n return srcBindSig.verify(primaryKey, dataToVerify);\n\n case 4:\n _context40.t0 = _context40.sent;\n\n case 5:\n if (_context40.t0) {\n _context40.next = 7;\n break;\n }\n\n return _context40.abrupt('return', false);\n\n case 7:\n i = 0;\n\n case 8:\n if (!(i < that.bindingSignatures.length)) {\n _context40.next = 16;\n break;\n }\n\n if (!that.bindingSignatures[i].issuerKeyId.equals(srcBindSig.issuerKeyId)) {\n _context40.next = 13;\n break;\n }\n\n if (!(srcBindSig.created < that.bindingSignatures[i].created)) {\n _context40.next = 13;\n break;\n }\n\n that.bindingSignatures[i] = srcBindSig;\n return _context40.abrupt('return', false);\n\n case 13:\n i++;\n _context40.next = 8;\n break;\n\n case 16:\n return _context40.abrupt('return', true);\n\n case 17:\n case 'end':\n return _context40.stop();\n }\n }\n }, _callee40, this);\n }));\n\n return function (_x80) {\n return _ref46.apply(this, arguments);\n };\n }());\n\n case 13:\n _context41.next = 15;\n return mergeSignatures(subKey, this, 'revocationSignatures', function (srcRevSig) {\n return isDataRevoked(primaryKey, dataToVerify, [srcRevSig]);\n });\n\n case 15:\n case 'end':\n return _context41.stop();\n }\n }\n }, _callee41, this);\n }));\n\n return function (_x78, _x79) {\n return _ref45.apply(this, arguments);\n };\n}();\n\n/**\n * Revokes the subkey\n * @param {module:packet.SecretKey} primaryKey decrypted private primary key for revocation\n * @param {Object} reasonForRevocation optional, object indicating the reason for revocation\n * @param {module:enums.reasonForRevocation} reasonForRevocation.flag optional, flag indicating the reason for revocation\n * @param {String} reasonForRevocation.string optional, string explaining the reason for revocation\n * @param {Date} date optional, override the creationtime of the revocation signature\n * @return {module:key~SubKey} new subkey with revocation signature\n */\nSubKey.prototype.revoke = function () {\n var _ref47 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee42(primaryKey) {\n var _ref48 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref48$flag = _ref48.flag,\n reasonForRevocationFlag = _ref48$flag === undefined ? _enums2.default.reasonForRevocation.no_reason : _ref48$flag,\n _ref48$string = _ref48.string,\n reasonForRevocationString = _ref48$string === undefined ? '' : _ref48$string;\n\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n var dataToSign, subKey;\n return _regenerator2.default.wrap(function _callee42$(_context42) {\n while (1) {\n switch (_context42.prev = _context42.next) {\n case 0:\n dataToSign = { key: primaryKey, bind: this.subKey };\n subKey = new SubKey(this.subKey);\n _context42.t0 = subKey.revocationSignatures;\n _context42.next = 5;\n return createSignaturePacket(dataToSign, null, primaryKey, {\n signatureType: _enums2.default.signature.subkey_revocation,\n reasonForRevocationFlag: _enums2.default.write(_enums2.default.reasonForRevocation, reasonForRevocationFlag),\n reasonForRevocationString: reasonForRevocationString\n }, date);\n\n case 5:\n _context42.t1 = _context42.sent;\n\n _context42.t0.push.call(_context42.t0, _context42.t1);\n\n _context42.next = 9;\n return subKey.update(this, primaryKey);\n\n case 9:\n return _context42.abrupt('return', subKey);\n\n case 10:\n case 'end':\n return _context42.stop();\n }\n }\n }, _callee42, this);\n }));\n\n return function (_x81) {\n return _ref47.apply(this, arguments);\n };\n}();\n\n/**\n * Reads an unarmored OpenPGP key list and returns one or multiple key objects\n * @param {Uint8Array} data to be parsed\n * @returns {{keys: Array<module:key.Key>,\n * err: (Array<Error>|null)}} result object with key and error arrays\n * @static\n */\nfunction read(data) {\n var result = {};\n result.keys = [];\n try {\n var packetlist = new _packet2.default.List();\n packetlist.read(data);\n var keyIndex = packetlist.indexOfTag(_enums2.default.packet.publicKey, _enums2.default.packet.secretKey);\n if (keyIndex.length === 0) {\n throw new Error('No key packet found');\n }\n for (var i = 0; i < keyIndex.length; i++) {\n var oneKeyList = packetlist.slice(keyIndex[i], keyIndex[i + 1]);\n try {\n var newKey = new Key(oneKeyList);\n result.keys.push(newKey);\n } catch (e) {\n result.err = result.err || [];\n result.err.push(e);\n }\n }\n } catch (e) {\n result.err = result.err || [];\n result.err.push(e);\n }\n return result;\n}\n\n/**\n * Reads an OpenPGP armored text and returns one or multiple key objects\n * @param {String} armoredText text to be parsed\n * @returns {{keys: Array<module:key.Key>,\n * err: (Array<Error>|null)}} result object with key and error arrays\n * @static\n */\nfunction readArmored(armoredText) {\n try {\n var input = _armor2.default.decode(armoredText);\n if (!(input.type === _enums2.default.armor.public_key || input.type === _enums2.default.armor.private_key)) {\n throw new Error('Armored text not of type key');\n }\n return read(input.data);\n } catch (e) {\n var result = { keys: [], err: [] };\n result.err.push(e);\n return result;\n }\n}\n\nfunction isDataExpired(keyPacket, signature) {\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n\n var normDate = _util2.default.normalizeDate(date);\n if (normDate !== null) {\n var expirationTime = getExpirationTime(keyPacket, signature);\n return !(keyPacket.created <= normDate && normDate < expirationTime) || signature && signature.isExpired(date);\n }\n return false;\n}\n\nfunction getExpirationTime(keyPacket, signature) {\n var expirationTime = void 0;\n // check V3 expiration time\n if (keyPacket.version === 3 && keyPacket.expirationTimeV3 !== 0) {\n expirationTime = keyPacket.created.getTime() + keyPacket.expirationTimeV3 * 24 * 3600 * 1000;\n }\n // check V4 expiration time\n if (keyPacket.version >= 4 && signature.keyNeverExpires === false) {\n expirationTime = keyPacket.created.getTime() + signature.keyExpirationTime * 1000;\n }\n return expirationTime ? new Date(expirationTime) : Infinity;\n}\n\n},{\"./config\":325,\"./crypto\":340,\"./encoding/armor\":357,\"./enums\":359,\"./packet\":371,\"./util\":398,\"babel-runtime/core-js/object/assign\":24,\"babel-runtime/core-js/object/get-prototype-of\":29,\"babel-runtime/core-js/object/values\":31,\"babel-runtime/core-js/promise\":32,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/helpers/slicedToArray\":40,\"babel-runtime/regenerator\":42}],363:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _keyring = _dereq_('./keyring.js');\n\nvar _keyring2 = _interopRequireDefault(_keyring);\n\nvar _localstore = _dereq_('./localstore.js');\n\nvar _localstore2 = _interopRequireDefault(_localstore);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @fileoverview Functions dealing with storage of the keyring.\n * @see module:keyring/keyring\n * @see module:keyring/localstore\n * @module keyring\n */\n_keyring2.default.localstore = _localstore2.default;\n\nexports.default = _keyring2.default;\n\n},{\"./keyring.js\":364,\"./localstore.js\":365}],364:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _key = _dereq_('../key');\n\nvar _localstore = _dereq_('./localstore');\n\nvar _localstore2 = _interopRequireDefault(_localstore);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Initialization routine for the keyring.\n * This method reads the keyring from HTML5 local storage and initializes this instance.\n * @constructor\n * @param {keyring/localstore} [storeHandler] class implementing loadPublic(), loadPrivate(), storePublic(), and storePrivate() methods\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview Provides the Keyring class\n * @requires key\n * @requires keyring/localstore\n * @module keyring/keyring\n */\n\nfunction Keyring(storeHandler) {\n this.storeHandler = storeHandler || new _localstore2.default();\n this.publicKeys = new KeyArray(this.storeHandler.loadPublic());\n this.privateKeys = new KeyArray(this.storeHandler.loadPrivate());\n}\n\n/**\n * Calls the storeHandler to save the keys\n */\nKeyring.prototype.store = function () {\n this.storeHandler.storePublic(this.publicKeys.keys);\n this.storeHandler.storePrivate(this.privateKeys.keys);\n};\n\n/**\n * Clear the keyring - erase all the keys\n */\nKeyring.prototype.clear = function () {\n this.publicKeys.keys = [];\n this.privateKeys.keys = [];\n};\n\n/**\n * Searches the keyring for keys having the specified key id\n * @param {String} keyId provided as string of lowercase hex number\n * withouth 0x prefix (can be 16-character key ID or fingerprint)\n * @param {Boolean} deep if true search also in subkeys\n * @returns {Array<module:key.Key>|null} keys found or null\n */\nKeyring.prototype.getKeysForId = function (keyId, deep) {\n var result = [];\n result = result.concat(this.publicKeys.getForId(keyId, deep) || []);\n result = result.concat(this.privateKeys.getForId(keyId, deep) || []);\n return result.length ? result : null;\n};\n\n/**\n * Removes keys having the specified key id from the keyring\n * @param {String} keyId provided as string of lowercase hex number\n * withouth 0x prefix (can be 16-character key ID or fingerprint)\n * @returns {Array<module:key.Key>|null} keys found or null\n */\nKeyring.prototype.removeKeysForId = function (keyId) {\n var result = [];\n result = result.concat(this.publicKeys.removeForId(keyId) || []);\n result = result.concat(this.privateKeys.removeForId(keyId) || []);\n return result.length ? result : null;\n};\n\n/**\n * Get all public and private keys\n * @returns {Array<module:key.Key>} all keys\n */\nKeyring.prototype.getAllKeys = function () {\n return this.publicKeys.keys.concat(this.privateKeys.keys);\n};\n\n/**\n * Array of keys\n * @param {Array<module:key.Key>} keys The keys to store in this array\n */\nfunction KeyArray(keys) {\n this.keys = keys;\n}\n\n/**\n * Searches all keys in the KeyArray matching the address or address part of the user ids\n * @param {String} email email address to search for\n * @returns {Array<module:key.Key>} The public keys associated with provided email address.\n */\nKeyArray.prototype.getForAddress = function (email) {\n var results = [];\n for (var i = 0; i < this.keys.length; i++) {\n if (emailCheck(email, this.keys[i])) {\n results.push(this.keys[i]);\n }\n }\n return results;\n};\n\n/**\n * Checks a key to see if it matches the specified email address\n * @private\n * @param {String} email email address to search for\n * @param {module:key.Key} key The key to be checked.\n * @returns {Boolean} True if the email address is defined in the specified key\n */\nfunction emailCheck(email, key) {\n email = email.toLowerCase();\n // escape email before using in regular expression\n var emailEsc = email.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n var emailRegex = new RegExp('<' + emailEsc + '>');\n var userIds = key.getUserIds();\n for (var i = 0; i < userIds.length; i++) {\n var userId = userIds[i].toLowerCase();\n if (email === userId || emailRegex.test(userId)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Checks a key to see if it matches the specified keyid\n * @private\n * @param {String} keyId provided as string of lowercase hex number\n * withouth 0x prefix (can be 16-character key ID or fingerprint)\n * @param {module:packet.SecretKey|public_key|public_subkey|secret_subkey} keypacket The keypacket to be checked\n * @returns {Boolean} True if keypacket has the specified keyid\n */\nfunction keyIdCheck(keyId, keypacket) {\n if (keyId.length === 16) {\n return keyId === keypacket.getKeyId().toHex();\n }\n return keyId === keypacket.getFingerprint();\n}\n\n/**\n * Searches the KeyArray for a key having the specified key id\n * @param {String} keyId provided as string of lowercase hex number\n * withouth 0x prefix (can be 16-character key ID or fingerprint)\n * @param {Boolean} deep if true search also in subkeys\n * @returns {module:key.Key|null} key found or null\n */\nKeyArray.prototype.getForId = function (keyId, deep) {\n for (var i = 0; i < this.keys.length; i++) {\n if (keyIdCheck(keyId, this.keys[i].primaryKey)) {\n return this.keys[i];\n }\n if (deep && this.keys[i].subKeys.length) {\n for (var j = 0; j < this.keys[i].subKeys.length; j++) {\n if (keyIdCheck(keyId, this.keys[i].subKeys[j].subKey)) {\n return this.keys[i];\n }\n }\n }\n }\n return null;\n};\n\n/**\n * Imports a key from an ascii armored message\n * @param {String} armored message to read the keys/key from\n * @returns {Promise<Array<Error>|null>} array of error objects or null\n * @async\n */\nKeyArray.prototype.importKey = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(armored) {\n var imported, i, key, keyidHex, keyFound;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n imported = (0, _key.readArmored)(armored);\n i = 0;\n\n case 2:\n if (!(i < imported.keys.length)) {\n _context.next = 15;\n break;\n }\n\n key = imported.keys[i];\n // check if key already in key array\n\n keyidHex = key.primaryKey.getKeyId().toHex();\n keyFound = this.getForId(keyidHex);\n\n if (!keyFound) {\n _context.next = 11;\n break;\n }\n\n _context.next = 9;\n return keyFound.update(key);\n\n case 9:\n _context.next = 12;\n break;\n\n case 11:\n this.push(key);\n\n case 12:\n i++;\n _context.next = 2;\n break;\n\n case 15:\n return _context.abrupt('return', imported.err ? imported.err : null);\n\n case 16:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Add key to KeyArray\n * @param {module:key.Key} key The key that will be added to the keyring\n * @returns {Number} The new length of the KeyArray\n */\nKeyArray.prototype.push = function (key) {\n return this.keys.push(key);\n};\n\n/**\n * Removes a key with the specified keyid from the keyring\n * @param {String} keyId provided as string of lowercase hex number\n * withouth 0x prefix (can be 16-character key ID or fingerprint)\n * @returns {module:key.Key|null} The key object which has been removed or null\n */\nKeyArray.prototype.removeForId = function (keyId) {\n for (var i = 0; i < this.keys.length; i++) {\n if (keyIdCheck(keyId, this.keys[i].primaryKey)) {\n return this.keys.splice(i, 1)[0];\n }\n }\n return null;\n};\n\nexports.default = Keyring;\n\n},{\"../key\":362,\"./localstore\":365,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],365:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _stringify = _dereq_('babel-runtime/core-js/json/stringify');\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _config = _dereq_('../config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _key = _dereq_('../key');\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The class that deals with storage of the keyring.\n * Currently the only option is to use HTML5 local storage.\n * @constructor\n * @param {String} prefix prefix for itemnames in localstore\n */\nfunction LocalStore(prefix) {\n prefix = prefix || 'openpgp-';\n this.publicKeysItem = prefix + this.publicKeysItem;\n this.privateKeysItem = prefix + this.privateKeysItem;\n if (typeof window !== 'undefined' && window.localStorage) {\n this.storage = window.localStorage;\n } else {\n this.storage = new (_dereq_('node-localstorage').LocalStorage)(_config2.default.node_store);\n }\n}\n\n/*\n * Declare the localstore itemnames\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview Provides the LocalStore class\n * @requires config\n * @requires key\n * @requires util\n * @module keyring/localstore\n */\n\nLocalStore.prototype.publicKeysItem = 'public-keys';\nLocalStore.prototype.privateKeysItem = 'private-keys';\n\n/**\n * Load the public keys from HTML5 local storage.\n * @returns {Array<module:key.Key>} array of keys retrieved from localstore\n */\nLocalStore.prototype.loadPublic = function () {\n return loadKeys(this.storage, this.publicKeysItem);\n};\n\n/**\n * Load the private keys from HTML5 local storage.\n * @returns {Array<module:key.Key>} array of keys retrieved from localstore\n */\nLocalStore.prototype.loadPrivate = function () {\n return loadKeys(this.storage, this.privateKeysItem);\n};\n\nfunction loadKeys(storage, itemname) {\n var armoredKeys = JSON.parse(storage.getItem(itemname));\n var keys = [];\n if (armoredKeys !== null && armoredKeys.length !== 0) {\n var key = void 0;\n for (var i = 0; i < armoredKeys.length; i++) {\n key = (0, _key.readArmored)(armoredKeys[i]);\n if (!key.err) {\n keys.push(key.keys[0]);\n } else {\n _util2.default.print_debug(\"Error reading armored key from keyring index: \" + i);\n }\n }\n }\n return keys;\n}\n\n/**\n * Saves the current state of the public keys to HTML5 local storage.\n * The key array gets stringified using JSON\n * @param {Array<module:key.Key>} keys array of keys to save in localstore\n */\nLocalStore.prototype.storePublic = function (keys) {\n storeKeys(this.storage, this.publicKeysItem, keys);\n};\n\n/**\n * Saves the current state of the private keys to HTML5 local storage.\n * The key array gets stringified using JSON\n * @param {Array<module:key.Key>} keys array of keys to save in localstore\n */\nLocalStore.prototype.storePrivate = function (keys) {\n storeKeys(this.storage, this.privateKeysItem, keys);\n};\n\nfunction storeKeys(storage, itemname, keys) {\n var armoredKeys = [];\n if (keys.length) {\n for (var i = 0; i < keys.length; i++) {\n armoredKeys.push(keys[i].armor());\n }\n storage.setItem(itemname, (0, _stringify2.default)(armoredKeys));\n } else {\n storage.removeItem(itemname);\n }\n}\n\nexports.default = LocalStore;\n\n},{\"../config\":325,\"../key\":362,\"../util\":398,\"babel-runtime/core-js/json/stringify\":23,\"node-localstorage\":\"node-localstorage\"}],366:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.createVerificationObjects = exports.createSignaturePackets = exports.encryptSessionKey = undefined;\n\nvar _from = _dereq_('babel-runtime/core-js/array/from');\n\nvar _from2 = _interopRequireDefault(_from);\n\nvar _promise = _dereq_('babel-runtime/core-js/promise');\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * Encrypt a session key either with public keys, passwords, or both at once.\n * @param {Uint8Array} sessionKey session key for encryption\n * @param {String} symAlgo session key algorithm\n * @param {String} aeadAlgo (optional) aead algorithm, e.g. 'eax' or 'ocb'\n * @param {Array<Key>} publicKeys (optional) public key(s) for message encryption\n * @param {Array<String>} passwords (optional) for message encryption\n * @param {Boolean} wildcard (optional) use a key ID of 0 instead of the public key IDs\n * @param {Date} date (optional) override the date\n * @param {Object} userId (optional) user ID to encrypt for, e.g. { name:'Robert Receiver', email:'robert@openpgp.org' }\n * @returns {Promise<Message>} new message with encrypted content\n * @async\n */\nvar encryptSessionKey = exports.encryptSessionKey = function () {\n var _ref8 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(sessionKey, symAlgo, aeadAlgo, publicKeys, passwords) {\n var wildcard = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n var date = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : new Date();\n var userId = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : {};\n\n var packetlist, results, testDecrypt, sum, encryptPassword, _results;\n\n return _regenerator2.default.wrap(function _callee11$(_context11) {\n while (1) {\n switch (_context11.prev = _context11.next) {\n case 0:\n packetlist = new _packet2.default.List();\n\n if (!publicKeys) {\n _context11.next = 6;\n break;\n }\n\n _context11.next = 4;\n return _promise2.default.all(publicKeys.map(function () {\n var _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(publicKey) {\n var encryptionKeyPacket, pkESKeyPacket;\n return _regenerator2.default.wrap(function _callee8$(_context8) {\n while (1) {\n switch (_context8.prev = _context8.next) {\n case 0:\n _context8.next = 2;\n return publicKey.getEncryptionKeyPacket(undefined, date, userId);\n\n case 2:\n encryptionKeyPacket = _context8.sent;\n\n if (encryptionKeyPacket) {\n _context8.next = 5;\n break;\n }\n\n throw new Error('Could not find valid key packet for encryption in key ' + publicKey.primaryKey.getKeyId().toHex());\n\n case 5:\n pkESKeyPacket = new _packet2.default.PublicKeyEncryptedSessionKey();\n\n pkESKeyPacket.publicKeyId = wildcard ? _keyid2.default.wildcard() : encryptionKeyPacket.getKeyId();\n pkESKeyPacket.publicKeyAlgorithm = encryptionKeyPacket.algorithm;\n pkESKeyPacket.sessionKey = sessionKey;\n pkESKeyPacket.sessionKeyAlgorithm = symAlgo;\n _context8.next = 12;\n return pkESKeyPacket.encrypt(encryptionKeyPacket);\n\n case 12:\n delete pkESKeyPacket.sessionKey; // delete plaintext session key after encryption\n return _context8.abrupt('return', pkESKeyPacket);\n\n case 14:\n case 'end':\n return _context8.stop();\n }\n }\n }, _callee8, this);\n }));\n\n return function (_x24) {\n return _ref9.apply(this, arguments);\n };\n }()));\n\n case 4:\n results = _context11.sent;\n\n packetlist.concat(results);\n\n case 6:\n if (!passwords) {\n _context11.next = 14;\n break;\n }\n\n testDecrypt = function () {\n var _ref10 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9(keyPacket, password) {\n return _regenerator2.default.wrap(function _callee9$(_context9) {\n while (1) {\n switch (_context9.prev = _context9.next) {\n case 0:\n _context9.prev = 0;\n _context9.next = 3;\n return keyPacket.decrypt(password);\n\n case 3:\n return _context9.abrupt('return', 1);\n\n case 6:\n _context9.prev = 6;\n _context9.t0 = _context9['catch'](0);\n return _context9.abrupt('return', 0);\n\n case 9:\n case 'end':\n return _context9.stop();\n }\n }\n }, _callee9, this, [[0, 6]]);\n }));\n\n return function testDecrypt(_x25, _x26) {\n return _ref10.apply(this, arguments);\n };\n }();\n\n sum = function sum(accumulator, currentValue) {\n return accumulator + currentValue;\n };\n\n encryptPassword = function () {\n var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10(sessionKey, symAlgo, aeadAlgo, password) {\n var symEncryptedSessionKeyPacket, _results2;\n\n return _regenerator2.default.wrap(function _callee10$(_context10) {\n while (1) {\n switch (_context10.prev = _context10.next) {\n case 0:\n symEncryptedSessionKeyPacket = new _packet2.default.SymEncryptedSessionKey();\n\n symEncryptedSessionKeyPacket.sessionKey = sessionKey;\n symEncryptedSessionKeyPacket.sessionKeyAlgorithm = symAlgo;\n if (aeadAlgo) {\n symEncryptedSessionKeyPacket.aeadAlgorithm = aeadAlgo;\n }\n _context10.next = 6;\n return symEncryptedSessionKeyPacket.encrypt(password);\n\n case 6:\n if (!_config2.default.password_collision_check) {\n _context10.next = 12;\n break;\n }\n\n _context10.next = 9;\n return _promise2.default.all(passwords.map(function (pwd) {\n return testDecrypt(symEncryptedSessionKeyPacket, pwd);\n }));\n\n case 9:\n _results2 = _context10.sent;\n\n if (!(_results2.reduce(sum) !== 1)) {\n _context10.next = 12;\n break;\n }\n\n return _context10.abrupt('return', encryptPassword(sessionKey, symAlgo, password));\n\n case 12:\n\n delete symEncryptedSessionKeyPacket.sessionKey; // delete plaintext session key after encryption\n return _context10.abrupt('return', symEncryptedSessionKeyPacket);\n\n case 14:\n case 'end':\n return _context10.stop();\n }\n }\n }, _callee10, this);\n }));\n\n return function encryptPassword(_x27, _x28, _x29, _x30) {\n return _ref11.apply(this, arguments);\n };\n }();\n\n _context11.next = 12;\n return _promise2.default.all(passwords.map(function (pwd) {\n return encryptPassword(sessionKey, symAlgo, aeadAlgo, pwd);\n }));\n\n case 12:\n _results = _context11.sent;\n\n packetlist.concat(_results);\n\n case 14:\n return _context11.abrupt('return', new Message(packetlist));\n\n case 15:\n case 'end':\n return _context11.stop();\n }\n }\n }, _callee11, this);\n }));\n\n return function encryptSessionKey(_x16, _x17, _x18, _x19, _x20) {\n return _ref8.apply(this, arguments);\n };\n}();\n\n/**\n * Sign the message (the literal data packet of the message)\n * @param {Array<module:key.Key>} privateKeys private keys with decrypted secret key data for signing\n * @param {Signature} signature (optional) any existing detached signature to add to the message\n * @param {Date} date (optional) override the creation time of the signature\n * @param {Object} userId (optional) user ID to sign with, e.g. { name:'Steve Sender', email:'steve@openpgp.org' }\n * @returns {Promise<Message>} new message with signed content\n * @async\n */\n\n\n/**\n * Create signature packets for the message\n * @param {module:packet.Literal} literalDataPacket the literal data packet to sign\n * @param {Array<module:key.Key>} privateKeys private keys with decrypted secret key data for signing\n * @param {Signature} signature (optional) any existing detached signature to append\n * @param {Date} date (optional) override the creationtime of the signature\n * @param {Object} userId (optional) user ID to sign with, e.g. { name:'Steve Sender', email:'steve@openpgp.org' }\n * @returns {Promise<module:packet.List>} list of signature packets\n * @async\n */\nvar createSignaturePackets = exports.createSignaturePackets = function () {\n var _ref15 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee16(literalDataPacket, privateKeys) {\n var signature = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n var _this = this;\n\n var date = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new Date();\n var userId = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};\n var packetlist, signatureType, existingSigPacketlist;\n return _regenerator2.default.wrap(function _callee16$(_context16) {\n while (1) {\n switch (_context16.prev = _context16.next) {\n case 0:\n packetlist = new _packet2.default.List();\n\n // If data packet was created from Uint8Array, use binary, otherwise use text\n\n signatureType = literalDataPacket.text === null ? _enums2.default.signature.binary : _enums2.default.signature.text;\n _context16.next = 4;\n return _promise2.default.all(privateKeys.map(function () {\n var _ref16 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee15(privateKey) {\n var signingKeyPacket;\n return _regenerator2.default.wrap(function _callee15$(_context15) {\n while (1) {\n switch (_context15.prev = _context15.next) {\n case 0:\n if (!privateKey.isPublic()) {\n _context15.next = 2;\n break;\n }\n\n throw new Error('Need private key for signing');\n\n case 2:\n _context15.next = 4;\n return privateKey.getSigningKeyPacket(undefined, date, userId);\n\n case 4:\n signingKeyPacket = _context15.sent;\n\n if (signingKeyPacket) {\n _context15.next = 7;\n break;\n }\n\n throw new Error('Could not find valid signing key packet in key ' + privateKey.primaryKey.getKeyId().toHex());\n\n case 7:\n return _context15.abrupt('return', (0, _key.createSignaturePacket)(literalDataPacket, privateKey, signingKeyPacket, { signatureType: signatureType }, date, userId));\n\n case 8:\n case 'end':\n return _context15.stop();\n }\n }\n }, _callee15, _this);\n }));\n\n return function (_x46) {\n return _ref16.apply(this, arguments);\n };\n }())).then(function (signatureList) {\n signatureList.forEach(function (signaturePacket) {\n return packetlist.push(signaturePacket);\n });\n });\n\n case 4:\n\n if (signature) {\n existingSigPacketlist = signature.packets.filterByTag(_enums2.default.packet.signature);\n\n packetlist.concat(existingSigPacketlist);\n }\n return _context16.abrupt('return', packetlist);\n\n case 6:\n case 'end':\n return _context16.stop();\n }\n }\n }, _callee16, this);\n }));\n\n return function createSignaturePackets(_x41, _x42) {\n return _ref15.apply(this, arguments);\n };\n}();\n\n/**\n * Verify message signatures\n * @param {Array<module:key.Key>} keys array of keys to verify signatures\n * @param {Date} date (optional) Verify the signature against the given date, i.e. check signature creation time < date < expiration time\n * @returns {Promise<Array<({keyid: module:type/keyid, valid: Boolean})>>} list of signer's keyid and validity of signature\n * @async\n */\n\n\n/**\n * Create list of objects containing signer's keyid and validity of signature\n * @param {Array<module:packet.Signature>} signatureList array of signature packets\n * @param {Array<module:packet.Literal>} literalDataList array of literal data packets\n * @param {Array<module:key.Key>} keys array of keys to verify signatures\n * @param {Date} date Verify the signature against the given date,\n * i.e. check signature creation time < date < expiration time\n * @returns {Promise<Array<{keyid: module:type/keyid,\n * valid: Boolean}>>} list of signer's keyid and validity of signature\n * @async\n */\nvar createVerificationObjects = exports.createVerificationObjects = function () {\n var _ref17 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee19(signatureList, literalDataList, keys) {\n var date = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new Date();\n return _regenerator2.default.wrap(function _callee19$(_context19) {\n while (1) {\n switch (_context19.prev = _context19.next) {\n case 0:\n return _context19.abrupt('return', _promise2.default.all(signatureList.map(function () {\n var _ref18 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee18(signature) {\n var keyPacket, verifiedSig, packetlist;\n return _regenerator2.default.wrap(function _callee18$(_context18) {\n while (1) {\n switch (_context18.prev = _context18.next) {\n case 0:\n keyPacket = null;\n _context18.next = 3;\n return _promise2.default.all(keys.map(function () {\n var _ref19 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee17(key) {\n var result;\n return _regenerator2.default.wrap(function _callee17$(_context17) {\n while (1) {\n switch (_context17.prev = _context17.next) {\n case 0:\n _context17.next = 2;\n return key.getSigningKeyPacket(signature.issuerKeyId, date);\n\n case 2:\n result = _context17.sent;\n\n if (result) {\n keyPacket = result;\n }\n\n case 4:\n case 'end':\n return _context17.stop();\n }\n }\n }, _callee17, this);\n }));\n\n return function (_x54) {\n return _ref19.apply(this, arguments);\n };\n }()));\n\n case 3:\n _context18.t0 = signature.issuerKeyId;\n\n if (!keyPacket) {\n _context18.next = 10;\n break;\n }\n\n _context18.next = 7;\n return signature.verify(keyPacket, literalDataList[0]);\n\n case 7:\n _context18.t1 = _context18.sent;\n _context18.next = 11;\n break;\n\n case 10:\n _context18.t1 = null;\n\n case 11:\n _context18.t2 = _context18.t1;\n verifiedSig = {\n keyid: _context18.t0,\n valid: _context18.t2\n };\n packetlist = new _packet2.default.List();\n\n packetlist.push(signature);\n verifiedSig.signature = new _signature.Signature(packetlist);\n\n return _context18.abrupt('return', verifiedSig);\n\n case 17:\n case 'end':\n return _context18.stop();\n }\n }\n }, _callee18, this);\n }));\n\n return function (_x53) {\n return _ref18.apply(this, arguments);\n };\n }())));\n\n case 1:\n case 'end':\n return _context19.stop();\n }\n }\n }, _callee19, this);\n }));\n\n return function createVerificationObjects(_x49, _x50, _x51) {\n return _ref17.apply(this, arguments);\n };\n}();\n\n/**\n * Unwrap compressed message\n * @returns {module:message.Message} message Content of compressed message\n */\n\n\nexports.Message = Message;\nexports.readArmored = readArmored;\nexports.read = read;\nexports.fromText = fromText;\nexports.fromBinary = fromBinary;\n\nvar _armor = _dereq_('./encoding/armor');\n\nvar _armor2 = _interopRequireDefault(_armor);\n\nvar _keyid = _dereq_('./type/keyid');\n\nvar _keyid2 = _interopRequireDefault(_keyid);\n\nvar _config = _dereq_('./config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _crypto = _dereq_('./crypto');\n\nvar _crypto2 = _interopRequireDefault(_crypto);\n\nvar _enums = _dereq_('./enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('./util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _packet = _dereq_('./packet');\n\nvar _packet2 = _interopRequireDefault(_packet);\n\nvar _signature = _dereq_('./signature');\n\nvar _key = _dereq_('./key');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @class\n * @classdesc Class that represents an OpenPGP message.\n * Can be an encrypted message, signed message, compressed message or literal message\n * @param {module:packet.List} packetlist The packets that form this message\n * See {@link https://tools.ietf.org/html/rfc4880#section-11.3}\n */\n\nfunction Message(packetlist) {\n if (!(this instanceof Message)) {\n return new Message(packetlist);\n }\n this.packets = packetlist || new _packet2.default.List();\n}\n\n/**\n * Returns the key IDs of the keys to which the session key is encrypted\n * @returns {Array<module:type/keyid>} array of keyid objects\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires encoding/armor\n * @requires type/keyid\n * @requires config\n * @requires crypto\n * @requires enums\n * @requires util\n * @requires packet\n * @requires signature\n * @requires key\n * @module message\n */\n\nMessage.prototype.getEncryptionKeyIds = function () {\n var keyIds = [];\n var pkESKeyPacketlist = this.packets.filterByTag(_enums2.default.packet.publicKeyEncryptedSessionKey);\n pkESKeyPacketlist.forEach(function (packet) {\n keyIds.push(packet.publicKeyId);\n });\n return keyIds;\n};\n\n/**\n * Returns the key IDs of the keys that signed the message\n * @returns {Array<module:type/keyid>} array of keyid objects\n */\nMessage.prototype.getSigningKeyIds = function () {\n var keyIds = [];\n var msg = this.unwrapCompressed();\n // search for one pass signatures\n var onePassSigList = msg.packets.filterByTag(_enums2.default.packet.onePassSignature);\n onePassSigList.forEach(function (packet) {\n keyIds.push(packet.signingKeyId);\n });\n // if nothing found look for signature packets\n if (!keyIds.length) {\n var signatureList = msg.packets.filterByTag(_enums2.default.packet.signature);\n signatureList.forEach(function (packet) {\n keyIds.push(packet.issuerKeyId);\n });\n }\n return keyIds;\n};\n\n/**\n * Decrypt the message. Either a private key, a session key, or a password must be specified.\n * @param {Array<Key>} privateKeys (optional) private keys with decrypted secret data\n * @param {Array<String>} passwords (optional) passwords used to decrypt\n * @param {Array<Object>} sessionKeys (optional) session keys in the form: { data:Uint8Array, algorithm:String, [aeadAlgorithm:String] }\n * @returns {Promise<Message>} new message with decrypted content\n * @async\n */\nMessage.prototype.decrypt = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(privateKeys, passwords, sessionKeys) {\n var keyObjs, symEncryptedPacketlist, symEncryptedPacket, exception, i, resultMsg;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.t0 = sessionKeys;\n\n if (_context.t0) {\n _context.next = 5;\n break;\n }\n\n _context.next = 4;\n return this.decryptSessionKeys(privateKeys, passwords);\n\n case 4:\n _context.t0 = _context.sent;\n\n case 5:\n keyObjs = _context.t0;\n symEncryptedPacketlist = this.packets.filterByTag(_enums2.default.packet.symmetricallyEncrypted, _enums2.default.packet.symEncryptedIntegrityProtected, _enums2.default.packet.symEncryptedAEADProtected);\n\n if (!(symEncryptedPacketlist.length === 0)) {\n _context.next = 9;\n break;\n }\n\n return _context.abrupt('return', this);\n\n case 9:\n symEncryptedPacket = symEncryptedPacketlist[0];\n exception = null;\n i = 0;\n\n case 12:\n if (!(i < keyObjs.length)) {\n _context.next = 27;\n break;\n }\n\n if (!(!keyObjs[i] || !_util2.default.isUint8Array(keyObjs[i].data) || !_util2.default.isString(keyObjs[i].algorithm))) {\n _context.next = 15;\n break;\n }\n\n throw new Error('Invalid session key for decryption.');\n\n case 15:\n _context.prev = 15;\n _context.next = 18;\n return symEncryptedPacket.decrypt(keyObjs[i].algorithm, keyObjs[i].data);\n\n case 18:\n return _context.abrupt('break', 27);\n\n case 21:\n _context.prev = 21;\n _context.t1 = _context['catch'](15);\n\n exception = _context.t1;\n\n case 24:\n i++;\n _context.next = 12;\n break;\n\n case 27:\n if (!(!symEncryptedPacket.packets || !symEncryptedPacket.packets.length)) {\n _context.next = 29;\n break;\n }\n\n throw exception || new Error('Decryption failed.');\n\n case 29:\n resultMsg = new Message(symEncryptedPacket.packets);\n\n symEncryptedPacket.packets = new _packet2.default.List(); // remove packets after decryption\n\n return _context.abrupt('return', resultMsg);\n\n case 32:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this, [[15, 21]]);\n }));\n\n return function (_x, _x2, _x3) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Decrypt encrypted session keys either with private keys or passwords.\n * @param {Array<Key>} privateKeys (optional) private keys with decrypted secret data\n * @param {Array<String>} passwords (optional) passwords used to decrypt\n * @returns {Promise<Array<{ data: Uint8Array,\n algorithm: String }>>} array of object with potential sessionKey, algorithm pairs\n * @async\n */\nMessage.prototype.decryptSessionKeys = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(privateKeys, passwords) {\n var keyPackets, symESKeyPacketlist, pkESKeyPacketlist, seen;\n return _regenerator2.default.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n keyPackets = [];\n\n if (!passwords) {\n _context6.next = 9;\n break;\n }\n\n symESKeyPacketlist = this.packets.filterByTag(_enums2.default.packet.symEncryptedSessionKey);\n\n if (symESKeyPacketlist) {\n _context6.next = 5;\n break;\n }\n\n throw new Error('No symmetrically encrypted session key packet found.');\n\n case 5:\n _context6.next = 7;\n return _promise2.default.all(symESKeyPacketlist.map(function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(keyPacket) {\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return _promise2.default.all(passwords.map(function () {\n var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(password) {\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.prev = 0;\n _context2.next = 3;\n return keyPacket.decrypt(password);\n\n case 3:\n keyPackets.push(keyPacket);\n _context2.next = 9;\n break;\n\n case 6:\n _context2.prev = 6;\n _context2.t0 = _context2['catch'](0);\n\n _util2.default.print_debug_error(_context2.t0);\n\n case 9:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this, [[0, 6]]);\n }));\n\n return function (_x7) {\n return _ref4.apply(this, arguments);\n };\n }()));\n\n case 2:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n return function (_x6) {\n return _ref3.apply(this, arguments);\n };\n }()));\n\n case 7:\n _context6.next = 18;\n break;\n\n case 9:\n if (!privateKeys) {\n _context6.next = 17;\n break;\n }\n\n pkESKeyPacketlist = this.packets.filterByTag(_enums2.default.packet.publicKeyEncryptedSessionKey);\n\n if (pkESKeyPacketlist) {\n _context6.next = 13;\n break;\n }\n\n throw new Error('No public key encrypted session key packet found.');\n\n case 13:\n _context6.next = 15;\n return _promise2.default.all(pkESKeyPacketlist.map(function () {\n var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(keyPacket) {\n var privateKeyPackets;\n return _regenerator2.default.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n // TODO improve this\n privateKeyPackets = privateKeys.reduce(function (acc, privateKey) {\n return acc.concat(privateKey.getKeyPackets(keyPacket.publicKeyId));\n }, new _packet2.default.List());\n _context5.next = 3;\n return _promise2.default.all(privateKeyPackets.map(function () {\n var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(privateKeyPacket) {\n return _regenerator2.default.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n if (privateKeyPacket) {\n _context4.next = 2;\n break;\n }\n\n return _context4.abrupt('return');\n\n case 2:\n if (privateKeyPacket.isDecrypted) {\n _context4.next = 4;\n break;\n }\n\n throw new Error('Private key is not decrypted.');\n\n case 4:\n _context4.prev = 4;\n _context4.next = 7;\n return keyPacket.decrypt(privateKeyPacket);\n\n case 7:\n keyPackets.push(keyPacket);\n _context4.next = 13;\n break;\n\n case 10:\n _context4.prev = 10;\n _context4.t0 = _context4['catch'](4);\n\n _util2.default.print_debug_error(_context4.t0);\n\n case 13:\n case 'end':\n return _context4.stop();\n }\n }\n }, _callee4, this, [[4, 10]]);\n }));\n\n return function (_x9) {\n return _ref6.apply(this, arguments);\n };\n }()));\n\n case 3:\n case 'end':\n return _context5.stop();\n }\n }\n }, _callee5, this);\n }));\n\n return function (_x8) {\n return _ref5.apply(this, arguments);\n };\n }()));\n\n case 15:\n _context6.next = 18;\n break;\n\n case 17:\n throw new Error('No key or password specified.');\n\n case 18:\n if (!keyPackets.length) {\n _context6.next = 21;\n break;\n }\n\n // Return only unique session keys\n if (keyPackets.length > 1) {\n seen = {};\n\n keyPackets = keyPackets.filter(function (item) {\n var k = item.sessionKeyAlgorithm + _util2.default.Uint8Array_to_str(item.sessionKey);\n if (seen.hasOwnProperty(k)) {\n return false;\n }\n seen[k] = true;\n return true;\n });\n }\n\n return _context6.abrupt('return', keyPackets.map(function (packet) {\n return { data: packet.sessionKey, algorithm: packet.sessionKeyAlgorithm };\n }));\n\n case 21:\n throw new Error('Session key decryption failed.');\n\n case 22:\n case 'end':\n return _context6.stop();\n }\n }\n }, _callee6, this);\n }));\n\n return function (_x4, _x5) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n/**\n * Get literal data that is the body of the message\n * @returns {(Uint8Array|null)} literal body of the message as Uint8Array\n */\nMessage.prototype.getLiteralData = function () {\n var literal = this.packets.findPacket(_enums2.default.packet.literal);\n return literal && literal.getBytes() || null;\n};\n\n/**\n * Get filename from literal data packet\n * @returns {(String|null)} filename of literal data packet as string\n */\nMessage.prototype.getFilename = function () {\n var literal = this.packets.findPacket(_enums2.default.packet.literal);\n return literal && literal.getFilename() || null;\n};\n\n/**\n * Get literal data as text\n * @returns {(String|null)} literal body of the message interpreted as text\n */\nMessage.prototype.getText = function () {\n var literal = this.packets.findPacket(_enums2.default.packet.literal);\n if (literal) {\n return literal.getText();\n }\n return null;\n};\n\n/**\n * Encrypt the message either with public keys, passwords, or both at once.\n * @param {Array<Key>} keys (optional) public key(s) for message encryption\n * @param {Array<String>} passwords (optional) password(s) for message encryption\n * @param {Object} sessionKey (optional) session key in the form: { data:Uint8Array, algorithm:String, [aeadAlgorithm:String] }\n * @param {Boolean} wildcard (optional) use a key ID of 0 instead of the public key IDs\n * @param {Date} date (optional) override the creation date of the literal package\n * @param {Object} userId (optional) user ID to encrypt for, e.g. { name:'Robert Receiver', email:'robert@openpgp.org' }\n * @returns {Promise<Message>} new message with encrypted content\n * @async\n */\nMessage.prototype.encrypt = function () {\n var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(keys, passwords, sessionKey) {\n var wildcard = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var date = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : new Date();\n var userId = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n var symAlgo, aeadAlgo, symEncryptedPacket, msg;\n return _regenerator2.default.wrap(function _callee7$(_context7) {\n while (1) {\n switch (_context7.prev = _context7.next) {\n case 0:\n symAlgo = void 0;\n aeadAlgo = void 0;\n symEncryptedPacket = void 0;\n\n if (!sessionKey) {\n _context7.next = 11;\n break;\n }\n\n if (!(!_util2.default.isUint8Array(sessionKey.data) || !_util2.default.isString(sessionKey.algorithm))) {\n _context7.next = 6;\n break;\n }\n\n throw new Error('Invalid session key for encryption.');\n\n case 6:\n symAlgo = sessionKey.algorithm;\n aeadAlgo = sessionKey.aeadAlgorithm;\n sessionKey = sessionKey.data;\n _context7.next = 38;\n break;\n\n case 11:\n if (!(keys && keys.length)) {\n _context7.next = 32;\n break;\n }\n\n _context7.t0 = _enums2.default;\n _context7.t1 = _enums2.default.symmetric;\n _context7.next = 16;\n return (0, _key.getPreferredAlgo)('symmetric', keys, date, userId);\n\n case 16:\n _context7.t2 = _context7.sent;\n symAlgo = _context7.t0.read.call(_context7.t0, _context7.t1, _context7.t2);\n _context7.t3 = _config2.default.aead_protect && _config2.default.aead_protect_version === 4;\n\n if (!_context7.t3) {\n _context7.next = 23;\n break;\n }\n\n _context7.next = 22;\n return (0, _key.isAeadSupported)(keys, date, userId);\n\n case 22:\n _context7.t3 = _context7.sent;\n\n case 23:\n if (!_context7.t3) {\n _context7.next = 30;\n break;\n }\n\n _context7.t4 = _enums2.default;\n _context7.t5 = _enums2.default.aead;\n _context7.next = 28;\n return (0, _key.getPreferredAlgo)('aead', keys, date, userId);\n\n case 28:\n _context7.t6 = _context7.sent;\n aeadAlgo = _context7.t4.read.call(_context7.t4, _context7.t5, _context7.t6);\n\n case 30:\n _context7.next = 38;\n break;\n\n case 32:\n if (!(passwords && passwords.length)) {\n _context7.next = 37;\n break;\n }\n\n symAlgo = _enums2.default.read(_enums2.default.symmetric, _config2.default.encryption_cipher);\n aeadAlgo = _enums2.default.read(_enums2.default.aead, _config2.default.aead_mode);\n _context7.next = 38;\n break;\n\n case 37:\n throw new Error('No keys, passwords, or session key provided.');\n\n case 38:\n if (sessionKey) {\n _context7.next = 42;\n break;\n }\n\n _context7.next = 41;\n return _crypto2.default.generateSessionKey(symAlgo);\n\n case 41:\n sessionKey = _context7.sent;\n\n case 42:\n _context7.next = 44;\n return encryptSessionKey(sessionKey, symAlgo, aeadAlgo, keys, passwords, wildcard, date, userId);\n\n case 44:\n msg = _context7.sent;\n\n\n if (_config2.default.aead_protect && (_config2.default.aead_protect_version !== 4 || aeadAlgo)) {\n symEncryptedPacket = new _packet2.default.SymEncryptedAEADProtected();\n symEncryptedPacket.aeadAlgorithm = aeadAlgo;\n } else if (_config2.default.integrity_protect) {\n symEncryptedPacket = new _packet2.default.SymEncryptedIntegrityProtected();\n } else {\n symEncryptedPacket = new _packet2.default.SymmetricallyEncrypted();\n }\n symEncryptedPacket.packets = this.packets;\n\n _context7.next = 49;\n return symEncryptedPacket.encrypt(symAlgo, sessionKey);\n\n case 49:\n\n msg.packets.push(symEncryptedPacket);\n symEncryptedPacket.packets = new _packet2.default.List(); // remove packets after encryption\n return _context7.abrupt('return', {\n message: msg,\n sessionKey: {\n data: sessionKey,\n algorithm: symAlgo,\n aeadAlgorithm: aeadAlgo\n }\n });\n\n case 52:\n case 'end':\n return _context7.stop();\n }\n }\n }, _callee7, this);\n }));\n\n return function (_x10, _x11, _x12) {\n return _ref7.apply(this, arguments);\n };\n}();Message.prototype.sign = function () {\n var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee13() {\n var privateKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var signature = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n var userId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var packetlist, literalDataPacket, i, existingSigPacketlist, signatureType, signaturePacket, onePassSig;\n return _regenerator2.default.wrap(function _callee13$(_context13) {\n while (1) {\n switch (_context13.prev = _context13.next) {\n case 0:\n packetlist = new _packet2.default.List();\n literalDataPacket = this.packets.findPacket(_enums2.default.packet.literal);\n\n if (literalDataPacket) {\n _context13.next = 4;\n break;\n }\n\n throw new Error('No literal data packet to sign.');\n\n case 4:\n i = void 0;\n existingSigPacketlist = void 0;\n // If data packet was created from Uint8Array, use binary, otherwise use text\n\n signatureType = literalDataPacket.text === null ? _enums2.default.signature.binary : _enums2.default.signature.text;\n\n\n if (signature) {\n existingSigPacketlist = signature.packets.filterByTag(_enums2.default.packet.signature);\n for (i = existingSigPacketlist.length - 1; i >= 0; i--) {\n signaturePacket = existingSigPacketlist[i];\n onePassSig = new _packet2.default.OnePassSignature();\n\n onePassSig.type = signatureType;\n onePassSig.hashAlgorithm = signaturePacket.hashAlgorithm;\n onePassSig.publicKeyAlgorithm = signaturePacket.publicKeyAlgorithm;\n onePassSig.signingKeyId = signaturePacket.issuerKeyId;\n if (!privateKeys.length && i === 0) {\n onePassSig.flags = 1;\n }\n packetlist.push(onePassSig);\n }\n }\n\n _context13.next = 10;\n return _promise2.default.all((0, _from2.default)(privateKeys).reverse().map(function () {\n var _ref13 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee12(privateKey, i) {\n var signingKeyPacket, onePassSig;\n return _regenerator2.default.wrap(function _callee12$(_context12) {\n while (1) {\n switch (_context12.prev = _context12.next) {\n case 0:\n if (!privateKey.isPublic()) {\n _context12.next = 2;\n break;\n }\n\n throw new Error('Need private key for signing');\n\n case 2:\n _context12.next = 4;\n return privateKey.getSigningKeyPacket(undefined, date, userId);\n\n case 4:\n signingKeyPacket = _context12.sent;\n\n if (signingKeyPacket) {\n _context12.next = 7;\n break;\n }\n\n throw new Error('Could not find valid key packet for signing in key ' + privateKey.primaryKey.getKeyId().toHex());\n\n case 7:\n onePassSig = new _packet2.default.OnePassSignature();\n\n onePassSig.type = signatureType;\n _context12.next = 11;\n return (0, _key.getPreferredHashAlgo)(privateKey, signingKeyPacket, date, userId);\n\n case 11:\n onePassSig.hashAlgorithm = _context12.sent;\n\n onePassSig.publicKeyAlgorithm = signingKeyPacket.algorithm;\n onePassSig.signingKeyId = signingKeyPacket.getKeyId();\n if (i === privateKeys.length - 1) {\n onePassSig.flags = 1;\n }\n return _context12.abrupt('return', onePassSig);\n\n case 16:\n case 'end':\n return _context12.stop();\n }\n }\n }, _callee12, this);\n }));\n\n return function (_x35, _x36) {\n return _ref13.apply(this, arguments);\n };\n }())).then(function (onePassSignatureList) {\n onePassSignatureList.forEach(function (onePassSig) {\n return packetlist.push(onePassSig);\n });\n });\n\n case 10:\n\n packetlist.push(literalDataPacket);\n _context13.t0 = packetlist;\n _context13.next = 14;\n return createSignaturePackets(literalDataPacket, privateKeys, signature, date);\n\n case 14:\n _context13.t1 = _context13.sent;\n\n _context13.t0.concat.call(_context13.t0, _context13.t1);\n\n return _context13.abrupt('return', new Message(packetlist));\n\n case 17:\n case 'end':\n return _context13.stop();\n }\n }\n }, _callee13, this);\n }));\n\n return function () {\n return _ref12.apply(this, arguments);\n };\n}();\n\n/**\n * Compresses the message (the literal and -if signed- signature data packets of the message)\n * @param {module:enums.compression} compression compression algorithm to be used\n * @returns {module:message.Message} new message with compressed content\n */\nMessage.prototype.compress = function (compression) {\n if (compression === _enums2.default.compression.uncompressed) {\n return this;\n }\n\n var compressed = new _packet2.default.Compressed();\n compressed.packets = this.packets;\n compressed.algorithm = _enums2.default.read(_enums2.default.compression, compression);\n\n var packetList = new _packet2.default.List();\n packetList.push(compressed);\n\n return new Message(packetList);\n};\n\n/**\n * Create a detached signature for the message (the literal data packet of the message)\n * @param {Array<module:key.Key>} privateKeys private keys with decrypted secret key data for signing\n * @param {Signature} signature (optional) any existing detached signature\n * @param {Date} date (optional) override the creation time of the signature\n * @param {Object} userId (optional) user ID to sign with, e.g. { name:'Steve Sender', email:'steve@openpgp.org' }\n * @returns {Promise<module:signature.Signature>} new detached signature of message content\n * @async\n */\nMessage.prototype.signDetached = function () {\n var _ref14 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee14() {\n var privateKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var signature = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n var userId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var literalDataPacket;\n return _regenerator2.default.wrap(function _callee14$(_context14) {\n while (1) {\n switch (_context14.prev = _context14.next) {\n case 0:\n literalDataPacket = this.packets.findPacket(_enums2.default.packet.literal);\n\n if (literalDataPacket) {\n _context14.next = 3;\n break;\n }\n\n throw new Error('No literal data packet to sign.');\n\n case 3:\n _context14.t0 = _signature.Signature;\n _context14.next = 6;\n return createSignaturePackets(literalDataPacket, privateKeys, signature, date, userId);\n\n case 6:\n _context14.t1 = _context14.sent;\n return _context14.abrupt('return', new _context14.t0(_context14.t1));\n\n case 8:\n case 'end':\n return _context14.stop();\n }\n }\n }, _callee14, this);\n }));\n\n return function () {\n return _ref14.apply(this, arguments);\n };\n}();Message.prototype.verify = function (keys) {\n var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date();\n\n var msg = this.unwrapCompressed();\n var literalDataList = msg.packets.filterByTag(_enums2.default.packet.literal);\n if (literalDataList.length !== 1) {\n throw new Error('Can only verify message with one literal data packet.');\n }\n var signatureList = msg.packets.filterByTag(_enums2.default.packet.signature);\n return createVerificationObjects(signatureList, literalDataList, keys, date);\n};\n\n/**\n * Verify detached message signature\n * @param {Array<module:key.Key>} keys array of keys to verify signatures\n * @param {Signature} signature\n * @param {Date} date Verify the signature against the given date, i.e. check signature creation time < date < expiration time\n * @returns {Promise<Array<({keyid: module:type/keyid, valid: Boolean})>>} list of signer's keyid and validity of signature\n * @async\n */\nMessage.prototype.verifyDetached = function (signature, keys) {\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n\n var msg = this.unwrapCompressed();\n var literalDataList = msg.packets.filterByTag(_enums2.default.packet.literal);\n if (literalDataList.length !== 1) {\n throw new Error('Can only verify message with one literal data packet.');\n }\n var signatureList = signature.packets;\n return createVerificationObjects(signatureList, literalDataList, keys, date);\n};Message.prototype.unwrapCompressed = function () {\n var compressed = this.packets.filterByTag(_enums2.default.packet.compressed);\n if (compressed.length) {\n return new Message(compressed[0].packets);\n }\n return this;\n};\n\n/**\n * Append signature to unencrypted message object\n * @param {String|Uint8Array} detachedSignature The detached ASCII-armored or Uint8Array PGP signature\n */\nMessage.prototype.appendSignature = function (detachedSignature) {\n this.packets.read(_util2.default.isUint8Array(detachedSignature) ? detachedSignature : _armor2.default.decode(detachedSignature).data);\n};\n\n/**\n * Returns ASCII armored text of message\n * @returns {String} ASCII armor\n */\nMessage.prototype.armor = function () {\n return _armor2.default.encode(_enums2.default.armor.message, this.packets.write());\n};\n\n/**\n * reads an OpenPGP armored message and returns a message object\n * @param {String} armoredText text to be parsed\n * @returns {module:message.Message} new message object\n * @static\n */\nfunction readArmored(armoredText) {\n //TODO how do we want to handle bad text? Exception throwing\n //TODO don't accept non-message armored texts\n var input = _armor2.default.decode(armoredText).data;\n return read(input);\n}\n\n/**\n * reads an OpenPGP message as byte array and returns a message object\n * @param {Uint8Array} input binary message\n * @returns {Message} new message object\n * @static\n */\nfunction read(input) {\n var packetlist = new _packet2.default.List();\n packetlist.read(input);\n return new Message(packetlist);\n}\n\n/**\n * creates new message object from text\n * @param {String} text\n * @param {String} filename (optional)\n * @param {Date} date (optional)\n * @param {utf8|binary|text|mime} type (optional) data packet type\n * @returns {module:message.Message} new message object\n * @static\n */\nfunction fromText(text, filename) {\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'utf8';\n\n var literalDataPacket = new _packet2.default.Literal(date);\n // text will be converted to UTF8\n literalDataPacket.setText(text, type);\n if (filename !== undefined) {\n literalDataPacket.setFilename(filename);\n }\n var literalDataPacketlist = new _packet2.default.List();\n literalDataPacketlist.push(literalDataPacket);\n return new Message(literalDataPacketlist);\n}\n\n/**\n * creates new message object from binary data\n * @param {Uint8Array} bytes\n * @param {String} filename (optional)\n * @param {Date} date (optional)\n * @param {utf8|binary|text|mime} type (optional) data packet type\n * @returns {module:message.Message} new message object\n * @static\n */\nfunction fromBinary(bytes, filename) {\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'binary';\n\n if (!_util2.default.isUint8Array(bytes)) {\n throw new Error('Data must be in the form of a Uint8Array');\n }\n\n var literalDataPacket = new _packet2.default.Literal(date);\n literalDataPacket.setBytes(bytes, type);\n if (filename !== undefined) {\n literalDataPacket.setFilename(filename);\n }\n var literalDataPacketlist = new _packet2.default.List();\n literalDataPacketlist.push(literalDataPacket);\n return new Message(literalDataPacketlist);\n}\n\n},{\"./config\":325,\"./crypto\":340,\"./encoding/armor\":357,\"./enums\":359,\"./key\":362,\"./packet\":371,\"./signature\":391,\"./type/keyid\":394,\"./util\":398,\"babel-runtime/core-js/array/from\":20,\"babel-runtime/core-js/promise\":32,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],367:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _promise = _dereq_('babel-runtime/core-js/promise');\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nexports.initWorker = initWorker;\nexports.getWorker = getWorker;\nexports.destroyWorker = destroyWorker;\nexports.generateKey = generateKey;\nexports.reformatKey = reformatKey;\nexports.revokeKey = revokeKey;\nexports.decryptKey = decryptKey;\nexports.encryptKey = encryptKey;\nexports.encrypt = encrypt;\nexports.decrypt = decrypt;\nexports.sign = sign;\nexports.verify = verify;\nexports.encryptSessionKey = encryptSessionKey;\nexports.decryptSessionKeys = decryptSessionKeys;\n\nvar _message = _dereq_('./message');\n\nvar messageLib = _interopRequireWildcard(_message);\n\nvar _cleartext = _dereq_('./cleartext');\n\nvar _key = _dereq_('./key');\n\nvar _config = _dereq_('./config/config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _enums = _dereq_('./enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('./util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _async_proxy = _dereq_('./worker/async_proxy');\n\nvar _async_proxy2 = _interopRequireDefault(_async_proxy);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Old browser polyfills\nif (typeof window !== 'undefined') {\n _dereq_('./polyfills');\n}\n\n//////////////////////////\n// //\n// Web Worker setup //\n// //\n//////////////////////////\n\n\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2016 Tankred Hase\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview The openpgp base module should provide all of the functionality\n * to consume the openpgp.js library. All additional classes are documented\n * for extending and developing on top of the base library.\n * @requires message\n * @requires cleartext\n * @requires key\n * @requires config\n * @requires enums\n * @requires util\n * @requires polyfills\n * @requires worker/async_proxy\n * @module openpgp\n */\n\n// This file intentionally has two separate file overviews so that\n// a reference to this module appears at the end of doc/index.html.\n\n/**\n * @fileoverview To view the full API documentation, start from\n * {@link module:openpgp}\n */\n\nvar asyncProxy = void 0; // instance of the asyncproxy\n\n/**\n * Set the path for the web worker script and create an instance of the async proxy\n * @param {String} path relative path to the worker scripts, default: 'openpgp.worker.js'\n * @param {Number} n number of workers to initialize\n * @param {Array<Object>} workers alternative to path parameter: web workers initialized with 'openpgp.worker.js'\n */\nfunction initWorker() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$path = _ref.path,\n path = _ref$path === undefined ? 'openpgp.worker.js' : _ref$path,\n _ref$n = _ref.n,\n n = _ref$n === undefined ? 1 : _ref$n,\n _ref$workers = _ref.workers,\n workers = _ref$workers === undefined ? [] : _ref$workers;\n\n if (workers.length || typeof window !== 'undefined' && window.Worker) {\n asyncProxy = new _async_proxy2.default({ path: path, n: n, workers: workers, config: _config2.default });\n return true;\n }\n}\n\n/**\n * Returns a reference to the async proxy if the worker was initialized with openpgp.initWorker()\n * @returns {module:worker/async_proxy.AsyncProxy|null} the async proxy or null if not initialized\n */\nfunction getWorker() {\n return asyncProxy;\n}\n\n/**\n * Cleanup the current instance of the web worker.\n */\nfunction destroyWorker() {\n asyncProxy = undefined;\n}\n\n//////////////////////\n// //\n// Key handling //\n// //\n//////////////////////\n\n\n/**\n * Generates a new OpenPGP key pair. Supports RSA and ECC keys. Primary and subkey will be of same type.\n * @param {Array<Object>} userIds array of user IDs e.g. [{ name:'Phil Zimmermann', email:'phil@openpgp.org' }]\n * @param {String} passphrase (optional) The passphrase used to encrypt the resulting private key\n * @param {Number} numBits (optional) number of bits for RSA keys: 2048 or 4096.\n * @param {Number} keyExpirationTime (optional) The number of seconds after the key creation time that the key expires\n * @param {String} curve (optional) elliptic curve for ECC keys:\n * curve25519, p256, p384, p521, secp256k1,\n * brainpoolP256r1, brainpoolP384r1, or brainpoolP512r1.\n * @param {Date} date (optional) override the creation date of the key and the key signatures\n * @param {Array<Object>} subkeys (optional) options for each subkey, default to main key options. e.g. [{sign: true, passphrase: '123'}]\n * sign parameter defaults to false, and indicates whether the subkey should sign rather than encrypt\n * @returns {Promise<Object>} The generated key object in the form:\n * { key:Key, privateKeyArmored:String, publicKeyArmored:String, revocationCertificate:String }\n * @async\n * @static\n */\n\nfunction generateKey(_ref2) {\n var _ref2$userIds = _ref2.userIds,\n userIds = _ref2$userIds === undefined ? [] : _ref2$userIds,\n _ref2$passphrase = _ref2.passphrase,\n passphrase = _ref2$passphrase === undefined ? \"\" : _ref2$passphrase,\n _ref2$numBits = _ref2.numBits,\n numBits = _ref2$numBits === undefined ? 2048 : _ref2$numBits,\n _ref2$keyExpirationTi = _ref2.keyExpirationTime,\n keyExpirationTime = _ref2$keyExpirationTi === undefined ? 0 : _ref2$keyExpirationTi,\n _ref2$curve = _ref2.curve,\n curve = _ref2$curve === undefined ? \"\" : _ref2$curve,\n _ref2$date = _ref2.date,\n date = _ref2$date === undefined ? new Date() : _ref2$date,\n _ref2$subkeys = _ref2.subkeys,\n subkeys = _ref2$subkeys === undefined ? [{}] : _ref2$subkeys;\n\n userIds = toArray(userIds);\n var options = { userIds: userIds, passphrase: passphrase, numBits: numBits, keyExpirationTime: keyExpirationTime, curve: curve, date: date, subkeys: subkeys };\n if (_util2.default.getWebCryptoAll() && numBits < 2048) {\n throw new Error('numBits should be 2048 or 4096, found: ' + numBits);\n }\n\n if (!_util2.default.getWebCryptoAll() && asyncProxy) {\n // use web worker if web crypto apis are not supported\n return asyncProxy.delegate('generateKey', options);\n }\n\n return (0, _key.generate)(options).then(function (key) {\n var revocationCertificate = key.getRevocationCertificate();\n key.revocationSignatures = [];\n\n return {\n\n key: key,\n privateKeyArmored: key.armor(),\n publicKeyArmored: key.toPublic().armor(),\n revocationCertificate: revocationCertificate\n\n };\n }).catch(onError.bind(null, 'Error generating keypair'));\n}\n\n/**\n * Reformats signature packets for a key and rewraps key object.\n * @param {Key} privateKey private key to reformat\n * @param {Array<Object>} userIds array of user IDs e.g. [{ name:'Phil Zimmermann', email:'phil@openpgp.org' }]\n * @param {String} passphrase (optional) The passphrase used to encrypt the resulting private key\n * @param {Number} keyExpirationTime (optional) The number of seconds after the key creation time that the key expires\n * @param {Boolean} revocationCertificate (optional) Whether the returned object should include a revocation certificate to revoke the public key\n * @returns {Promise<Object>} The generated key object in the form:\n * { key:Key, privateKeyArmored:String, publicKeyArmored:String, revocationCertificate:String }\n * @async\n * @static\n */\nfunction reformatKey(_ref3) {\n var privateKey = _ref3.privateKey,\n _ref3$userIds = _ref3.userIds,\n userIds = _ref3$userIds === undefined ? [] : _ref3$userIds,\n _ref3$passphrase = _ref3.passphrase,\n passphrase = _ref3$passphrase === undefined ? \"\" : _ref3$passphrase,\n _ref3$keyExpirationTi = _ref3.keyExpirationTime,\n keyExpirationTime = _ref3$keyExpirationTi === undefined ? 0 : _ref3$keyExpirationTi,\n date = _ref3.date,\n _ref3$revocationCerti = _ref3.revocationCertificate,\n revocationCertificate = _ref3$revocationCerti === undefined ? true : _ref3$revocationCerti;\n\n userIds = toArray(userIds);\n var options = { privateKey: privateKey, userIds: userIds, passphrase: passphrase, keyExpirationTime: keyExpirationTime, date: date, revocationCertificate: revocationCertificate };\n if (asyncProxy) {\n return asyncProxy.delegate('reformatKey', options);\n }\n\n options.revoked = options.revocationCertificate;\n\n return (0, _key.reformat)(options).then(function (key) {\n var revocationCertificate = key.getRevocationCertificate();\n key.revocationSignatures = [];\n\n return {\n\n key: key,\n privateKeyArmored: key.armor(),\n publicKeyArmored: key.toPublic().armor(),\n revocationCertificate: revocationCertificate\n\n };\n }).catch(onError.bind(null, 'Error reformatting keypair'));\n}\n\n/**\n * Revokes a key. Requires either a private key or a revocation certificate.\n * If a revocation certificate is passed, the reasonForRevocation parameters will be ignored.\n * @param {Key} key (optional) public or private key to revoke\n * @param {String} revocationCertificate (optional) revocation certificate to revoke the key with\n * @param {Object} reasonForRevocation (optional) object indicating the reason for revocation\n * @param {module:enums.reasonForRevocation} reasonForRevocation.flag (optional) flag indicating the reason for revocation\n * @param {String} reasonForRevocation.string (optional) string explaining the reason for revocation\n * @return {Promise<Object>} The revoked key object in the form:\n * { privateKey:Key, privateKeyArmored:String, publicKey:Key, publicKeyArmored:String }\n * (if private key is passed) or { publicKey:Key, publicKeyArmored:String } (otherwise)\n * @static\n */\nfunction revokeKey() {\n var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n key = _ref4.key,\n revocationCertificate = _ref4.revocationCertificate,\n reasonForRevocation = _ref4.reasonForRevocation;\n\n var options = {\n key: key, revocationCertificate: revocationCertificate, reasonForRevocation: reasonForRevocation\n };\n\n if (!_util2.default.getWebCryptoAll() && asyncProxy) {\n // use web worker if web crypto apis are not supported\n return asyncProxy.delegate('revokeKey', options);\n }\n\n return _promise2.default.resolve().then(function () {\n if (revocationCertificate) {\n return key.applyRevocationCertificate(revocationCertificate);\n } else {\n return key.revoke(reasonForRevocation);\n }\n }).then(function (key) {\n if (key.isPrivate()) {\n var publicKey = key.toPublic();\n return {\n privateKey: key,\n privateKeyArmored: key.armor(),\n publicKey: publicKey,\n publicKeyArmored: publicKey.armor()\n };\n }\n return {\n publicKey: key,\n publicKeyArmored: key.armor()\n };\n }).catch(onError.bind(null, 'Error revoking key'));\n}\n\n/**\n * Unlock a private key with your passphrase.\n * @param {Key} privateKey the private key that is to be decrypted\n * @param {String|Array<String>} passphrase the user's passphrase(s) chosen during key generation\n * @returns {Promise<Object>} the unlocked key object in the form: { key:Key }\n * @async\n */\nfunction decryptKey(_ref5) {\n var privateKey = _ref5.privateKey,\n passphrase = _ref5.passphrase;\n\n if (asyncProxy) {\n // use web worker if available\n return asyncProxy.delegate('decryptKey', { privateKey: privateKey, passphrase: passphrase });\n }\n\n return _promise2.default.resolve().then((0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() {\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return privateKey.decrypt(passphrase);\n\n case 2:\n return _context.abrupt('return', {\n key: privateKey\n });\n\n case 3:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }))).catch(onError.bind(null, 'Error decrypting private key'));\n}\n\n/**\n * Lock a private key with your passphrase.\n * @param {Key} privateKey the private key that is to be decrypted\n * @param {String|Array<String>} passphrase the user's passphrase(s) chosen during key generation\n * @returns {Promise<Object>} the locked key object in the form: { key:Key }\n * @async\n */\nfunction encryptKey(_ref7) {\n var privateKey = _ref7.privateKey,\n passphrase = _ref7.passphrase;\n\n if (asyncProxy) {\n // use web worker if available\n return asyncProxy.delegate('encryptKey', { privateKey: privateKey, passphrase: passphrase });\n }\n\n return _promise2.default.resolve().then((0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return privateKey.encrypt(passphrase);\n\n case 2:\n return _context2.abrupt('return', {\n key: privateKey\n });\n\n case 3:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }))).catch(onError.bind(null, 'Error decrypting private key'));\n}\n\n///////////////////////////////////////////\n// //\n// Message encryption and decryption //\n// //\n///////////////////////////////////////////\n\n\n/**\n * Encrypts message text/data with public keys, passwords or both at once. At least either public keys or passwords\n * must be specified. If private keys are specified, those will be used to sign the message.\n * @param {String|Uint8Array} data text/data to be encrypted as JavaScript binary string or Uint8Array\n * @param {utf8|binary|text|mime} dataType (optional) data packet type\n * @param {Key|Array<Key>} publicKeys (optional) array of keys or single key, used to encrypt the message\n * @param {Key|Array<Key>} privateKeys (optional) private keys for signing. If omitted message will not be signed\n * @param {String|Array<String>} passwords (optional) array of passwords or a single password to encrypt the message\n * @param {Object} sessionKey (optional) session key in the form: { data:Uint8Array, algorithm:String }\n * @param {String} filename (optional) a filename for the literal data packet\n * @param {module:enums.compression} compression (optional) which compression algorithm to compress the message with, defaults to what is specified in config\n * @param {Boolean} armor (optional) if the return values should be ascii armored or the message/signature objects\n * @param {Boolean} detached (optional) if the signature should be detached (if true, signature will be added to returned object)\n * @param {Signature} signature (optional) a detached signature to add to the encrypted message\n * @param {Boolean} returnSessionKey (optional) if the unencrypted session key should be added to returned object\n * @param {Boolean} wildcard (optional) use a key ID of 0 instead of the public key IDs\n * @param {Date} date (optional) override the creation date of the message and the message signature\n * @param {Object} fromUserId (optional) user ID to sign with, e.g. { name:'Steve Sender', email:'steve@openpgp.org' }\n * @param {Object} toUserId (optional) user ID to encrypt for, e.g. { name:'Robert Receiver', email:'robert@openpgp.org' }\n * @returns {Promise<Object>} encrypted (and optionally signed message) in the form:\n * {data: ASCII armored message if 'armor' is true,\n * message: full Message object if 'armor' is false, signature: detached signature if 'detached' is true}\n * @async\n * @static\n */\nfunction encrypt(_ref9) {\n var data = _ref9.data,\n dataType = _ref9.dataType,\n publicKeys = _ref9.publicKeys,\n privateKeys = _ref9.privateKeys,\n passwords = _ref9.passwords,\n sessionKey = _ref9.sessionKey,\n filename = _ref9.filename,\n _ref9$compression = _ref9.compression,\n compression = _ref9$compression === undefined ? _config2.default.compression : _ref9$compression,\n _ref9$armor = _ref9.armor,\n armor = _ref9$armor === undefined ? true : _ref9$armor,\n _ref9$detached = _ref9.detached,\n detached = _ref9$detached === undefined ? false : _ref9$detached,\n _ref9$signature = _ref9.signature,\n signature = _ref9$signature === undefined ? null : _ref9$signature,\n _ref9$returnSessionKe = _ref9.returnSessionKey,\n returnSessionKey = _ref9$returnSessionKe === undefined ? false : _ref9$returnSessionKe,\n _ref9$wildcard = _ref9.wildcard,\n wildcard = _ref9$wildcard === undefined ? false : _ref9$wildcard,\n _ref9$date = _ref9.date,\n date = _ref9$date === undefined ? new Date() : _ref9$date,\n _ref9$fromUserId = _ref9.fromUserId,\n fromUserId = _ref9$fromUserId === undefined ? {} : _ref9$fromUserId,\n _ref9$toUserId = _ref9.toUserId,\n toUserId = _ref9$toUserId === undefined ? {} : _ref9$toUserId;\n\n checkData(data);publicKeys = toArray(publicKeys);privateKeys = toArray(privateKeys);passwords = toArray(passwords);\n\n if (!nativeAEAD() && asyncProxy) {\n // use web worker if web crypto apis are not supported\n return asyncProxy.delegate('encrypt', { data: data, dataType: dataType, publicKeys: publicKeys, privateKeys: privateKeys, passwords: passwords, sessionKey: sessionKey, filename: filename, compression: compression, armor: armor, detached: detached, signature: signature, returnSessionKey: returnSessionKey, wildcard: wildcard, date: date, fromUserId: fromUserId, toUserId: toUserId });\n }\n var result = {};\n return _promise2.default.resolve().then((0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3() {\n var message, detachedSignature;\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n message = createMessage(data, filename, date, dataType);\n\n if (!privateKeys) {\n privateKeys = [];\n }\n\n if (!(privateKeys.length || signature)) {\n _context3.next = 13;\n break;\n }\n\n if (!detached) {\n _context3.next = 10;\n break;\n }\n\n _context3.next = 6;\n return message.signDetached(privateKeys, signature, date, fromUserId);\n\n case 6:\n detachedSignature = _context3.sent;\n\n result.signature = armor ? detachedSignature.armor() : detachedSignature;\n _context3.next = 13;\n break;\n\n case 10:\n _context3.next = 12;\n return message.sign(privateKeys, signature, date, fromUserId);\n\n case 12:\n message = _context3.sent;\n\n case 13:\n message = message.compress(compression);\n return _context3.abrupt('return', message.encrypt(publicKeys, passwords, sessionKey, wildcard, date, toUserId));\n\n case 15:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }))).then(function (encrypted) {\n if (armor) {\n result.data = encrypted.message.armor();\n } else {\n result.message = encrypted.message;\n }\n if (returnSessionKey) {\n result.sessionKey = encrypted.sessionKey;\n }\n return result;\n }).catch(onError.bind(null, 'Error encrypting message'));\n}\n\n/**\n * Decrypts a message with the user's private key, a session key or a password. Either a private key,\n * a session key or a password must be specified.\n * @param {Message} message the message object with the encrypted data\n * @param {Key|Array<Key>} privateKeys (optional) private keys with decrypted secret key data or session key\n * @param {String|Array<String>} passwords (optional) passwords to decrypt the message\n * @param {Object|Array<Object>} sessionKeys (optional) session keys in the form: { data:Uint8Array, algorithm:String }\n * @param {Key|Array<Key>} publicKeys (optional) array of public keys or single key, to verify signatures\n * @param {String} format (optional) return data format either as 'utf8' or 'binary'\n * @param {Signature} signature (optional) detached signature for verification\n * @param {Date} date (optional) use the given date for verification instead of the current time\n * @returns {Promise<Object>} decrypted and verified message in the form:\n * { data:Uint8Array|String, filename:String, signatures:[{ keyid:String, valid:Boolean }] }\n * @async\n * @static\n */\nfunction decrypt(_ref11) {\n var message = _ref11.message,\n privateKeys = _ref11.privateKeys,\n passwords = _ref11.passwords,\n sessionKeys = _ref11.sessionKeys,\n publicKeys = _ref11.publicKeys,\n _ref11$format = _ref11.format,\n format = _ref11$format === undefined ? 'utf8' : _ref11$format,\n _ref11$signature = _ref11.signature,\n signature = _ref11$signature === undefined ? null : _ref11$signature,\n _ref11$date = _ref11.date,\n date = _ref11$date === undefined ? new Date() : _ref11$date;\n\n checkMessage(message);publicKeys = toArray(publicKeys);privateKeys = toArray(privateKeys);passwords = toArray(passwords);sessionKeys = toArray(sessionKeys);\n\n if (!nativeAEAD() && asyncProxy) {\n // use web worker if web crypto apis are not supported\n return asyncProxy.delegate('decrypt', { message: message, privateKeys: privateKeys, passwords: passwords, sessionKeys: sessionKeys, publicKeys: publicKeys, format: format, signature: signature, date: date });\n }\n\n return message.decrypt(privateKeys, passwords, sessionKeys).then(function () {\n var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(message) {\n var result;\n return _regenerator2.default.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n result = parseMessage(message, format);\n\n\n if (!publicKeys) {\n publicKeys = [];\n }\n\n if (!signature) {\n _context4.next = 8;\n break;\n }\n\n _context4.next = 5;\n return message.verifyDetached(signature, publicKeys, date);\n\n case 5:\n _context4.t0 = _context4.sent;\n _context4.next = 11;\n break;\n\n case 8:\n _context4.next = 10;\n return message.verify(publicKeys, date);\n\n case 10:\n _context4.t0 = _context4.sent;\n\n case 11:\n result.signatures = _context4.t0;\n return _context4.abrupt('return', result);\n\n case 13:\n case 'end':\n return _context4.stop();\n }\n }\n }, _callee4, this);\n }));\n\n return function (_x3) {\n return _ref12.apply(this, arguments);\n };\n }()).catch(onError.bind(null, 'Error decrypting message'));\n}\n\n//////////////////////////////////////////\n// //\n// Message signing and verification //\n// //\n//////////////////////////////////////////\n\n\n/**\n * Signs a cleartext message.\n * @param {String | Uint8Array} data cleartext input to be signed\n * @param {utf8|binary|text|mime} dataType (optional) data packet type\n * @param {Key|Array<Key>} privateKeys array of keys or single key with decrypted secret key data to sign cleartext\n * @param {Boolean} armor (optional) if the return value should be ascii armored or the message object\n * @param {Boolean} detached (optional) if the return value should contain a detached signature\n * @param {Date} date (optional) override the creation date signature\n * @param {Object} fromUserId (optional) user ID to sign with, e.g. { name:'Steve Sender', email:'steve@openpgp.org' }\n * @returns {Promise<Object>} signed cleartext in the form:\n * {data: ASCII armored message if 'armor' is true,\n * message: full Message object if 'armor' is false, signature: detached signature if 'detached' is true}\n * @async\n * @static\n */\nfunction sign(_ref13) {\n var data = _ref13.data,\n dataType = _ref13.dataType,\n privateKeys = _ref13.privateKeys,\n _ref13$armor = _ref13.armor,\n armor = _ref13$armor === undefined ? true : _ref13$armor,\n _ref13$detached = _ref13.detached,\n detached = _ref13$detached === undefined ? false : _ref13$detached,\n _ref13$date = _ref13.date,\n date = _ref13$date === undefined ? new Date() : _ref13$date,\n _ref13$fromUserId = _ref13.fromUserId,\n fromUserId = _ref13$fromUserId === undefined ? {} : _ref13$fromUserId;\n\n checkData(data);\n privateKeys = toArray(privateKeys);\n\n if (asyncProxy) {\n // use web worker if available\n return asyncProxy.delegate('sign', {\n data: data, dataType: dataType, privateKeys: privateKeys, armor: armor, detached: detached, date: date, fromUserId: fromUserId\n });\n }\n\n var result = {};\n return _promise2.default.resolve().then((0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5() {\n var message, signature;\n return _regenerator2.default.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n message = _util2.default.isString(data) ? new _cleartext.CleartextMessage(data) : messageLib.fromBinary(data, dataType);\n\n if (!detached) {\n _context5.next = 8;\n break;\n }\n\n _context5.next = 4;\n return message.signDetached(privateKeys, undefined, date, fromUserId);\n\n case 4:\n signature = _context5.sent;\n\n result.signature = armor ? signature.armor() : signature;\n _context5.next = 12;\n break;\n\n case 8:\n _context5.next = 10;\n return message.sign(privateKeys, undefined, date, fromUserId);\n\n case 10:\n message = _context5.sent;\n\n if (armor) {\n result.data = message.armor();\n } else {\n result.message = message;\n }\n\n case 12:\n return _context5.abrupt('return', result);\n\n case 13:\n case 'end':\n return _context5.stop();\n }\n }\n }, _callee5, this);\n }))).catch(onError.bind(null, 'Error signing cleartext message'));\n}\n\n/**\n * Verifies signatures of cleartext signed message\n * @param {Key|Array<Key>} publicKeys array of publicKeys or single key, to verify signatures\n * @param {CleartextMessage} message cleartext message object with signatures\n * @param {Signature} signature (optional) detached signature for verification\n * @param {Date} date (optional) use the given date for verification instead of the current time\n * @returns {Promise<Object>} cleartext with status of verified signatures in the form of:\n * { data:String, signatures: [{ keyid:String, valid:Boolean }] }\n * @async\n * @static\n */\nfunction verify(_ref15) {\n var message = _ref15.message,\n publicKeys = _ref15.publicKeys,\n _ref15$signature = _ref15.signature,\n signature = _ref15$signature === undefined ? null : _ref15$signature,\n _ref15$date = _ref15.date,\n date = _ref15$date === undefined ? new Date() : _ref15$date;\n\n checkCleartextOrMessage(message);\n publicKeys = toArray(publicKeys);\n\n if (asyncProxy) {\n // use web worker if available\n return asyncProxy.delegate('verify', { message: message, publicKeys: publicKeys, signature: signature, date: date });\n }\n\n return _promise2.default.resolve().then((0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6() {\n var result;\n return _regenerator2.default.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n result = {};\n\n result.data = message instanceof _cleartext.CleartextMessage ? message.getText() : message.getLiteralData();\n\n if (!signature) {\n _context6.next = 8;\n break;\n }\n\n _context6.next = 5;\n return message.verifyDetached(signature, publicKeys, date);\n\n case 5:\n _context6.t0 = _context6.sent;\n _context6.next = 11;\n break;\n\n case 8:\n _context6.next = 10;\n return message.verify(publicKeys, date);\n\n case 10:\n _context6.t0 = _context6.sent;\n\n case 11:\n result.signatures = _context6.t0;\n return _context6.abrupt('return', result);\n\n case 13:\n case 'end':\n return _context6.stop();\n }\n }\n }, _callee6, this);\n }))).catch(onError.bind(null, 'Error verifying cleartext signed message'));\n}\n\n///////////////////////////////////////////////\n// //\n// Session key encryption and decryption //\n// //\n///////////////////////////////////////////////\n\n\n/**\n * Encrypt a symmetric session key with public keys, passwords, or both at once. At least either public keys\n * or passwords must be specified.\n * @param {Uint8Array} data the session key to be encrypted e.g. 16 random bytes (for aes128)\n * @param {String} algorithm algorithm of the symmetric session key e.g. 'aes128' or 'aes256'\n * @param {String} aeadAlgorithm (optional) aead algorithm, e.g. 'eax' or 'ocb'\n * @param {Key|Array<Key>} publicKeys (optional) array of public keys or single key, used to encrypt the key\n * @param {String|Array<String>} passwords (optional) passwords for the message\n * @param {Boolean} wildcard (optional) use a key ID of 0 instead of the public key IDs\n * @param {Date} date (optional) override the date\n * @param {Object} toUserId (optional) user ID to encrypt for, e.g. { name:'Phil Zimmermann', email:'phil@openpgp.org' }\n * @returns {Promise<Message>} the encrypted session key packets contained in a message object\n * @async\n * @static\n */\nfunction encryptSessionKey(_ref17) {\n var data = _ref17.data,\n algorithm = _ref17.algorithm,\n aeadAlgorithm = _ref17.aeadAlgorithm,\n publicKeys = _ref17.publicKeys,\n passwords = _ref17.passwords,\n _ref17$wildcard = _ref17.wildcard,\n wildcard = _ref17$wildcard === undefined ? false : _ref17$wildcard,\n _ref17$date = _ref17.date,\n date = _ref17$date === undefined ? new Date() : _ref17$date,\n _ref17$toUserId = _ref17.toUserId,\n toUserId = _ref17$toUserId === undefined ? {} : _ref17$toUserId;\n\n checkBinary(data);checkString(algorithm, 'algorithm');publicKeys = toArray(publicKeys);passwords = toArray(passwords);\n\n if (asyncProxy) {\n // use web worker if available\n return asyncProxy.delegate('encryptSessionKey', { data: data, algorithm: algorithm, aeadAlgorithm: aeadAlgorithm, publicKeys: publicKeys, passwords: passwords, wildcard: wildcard, date: date, toUserId: toUserId });\n }\n\n return _promise2.default.resolve().then((0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7() {\n return _regenerator2.default.wrap(function _callee7$(_context7) {\n while (1) {\n switch (_context7.prev = _context7.next) {\n case 0:\n _context7.next = 2;\n return messageLib.encryptSessionKey(data, algorithm, aeadAlgorithm, publicKeys, passwords, wildcard, date, toUserId);\n\n case 2:\n _context7.t0 = _context7.sent;\n return _context7.abrupt('return', {\n message: _context7.t0\n });\n\n case 4:\n case 'end':\n return _context7.stop();\n }\n }\n }, _callee7, this);\n }))).catch(onError.bind(null, 'Error encrypting session key'));\n}\n\n/**\n * Decrypt symmetric session keys with a private key or password. Either a private key or\n * a password must be specified.\n * @param {Message} message a message object containing the encrypted session key packets\n * @param {Key|Array<Key>} privateKeys (optional) private keys with decrypted secret key data\n * @param {String|Array<String>} passwords (optional) passwords to decrypt the session key\n * @returns {Promise<Object|undefined>} Array of decrypted session key, algorithm pairs in form:\n * { data:Uint8Array, algorithm:String }\n * or 'undefined' if no key packets found\n * @async\n * @static\n */\nfunction decryptSessionKeys(_ref19) {\n var message = _ref19.message,\n privateKeys = _ref19.privateKeys,\n passwords = _ref19.passwords;\n\n checkMessage(message);privateKeys = toArray(privateKeys);passwords = toArray(passwords);\n\n if (asyncProxy) {\n // use web worker if available\n return asyncProxy.delegate('decryptSessionKeys', { message: message, privateKeys: privateKeys, passwords: passwords });\n }\n\n return _promise2.default.resolve().then((0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8() {\n return _regenerator2.default.wrap(function _callee8$(_context8) {\n while (1) {\n switch (_context8.prev = _context8.next) {\n case 0:\n return _context8.abrupt('return', message.decryptSessionKeys(privateKeys, passwords));\n\n case 1:\n case 'end':\n return _context8.stop();\n }\n }\n }, _callee8, this);\n }))).catch(onError.bind(null, 'Error decrypting session keys'));\n}\n\n//////////////////////////\n// //\n// Helper functions //\n// //\n//////////////////////////\n\n\n/**\n * Input validation\n */\nfunction checkString(data, name) {\n if (!_util2.default.isString(data)) {\n throw new Error('Parameter [' + (name || 'data') + '] must be of type String');\n }\n}\nfunction checkBinary(data, name) {\n if (!_util2.default.isUint8Array(data)) {\n throw new Error('Parameter [' + (name || 'data') + '] must be of type Uint8Array');\n }\n}\nfunction checkData(data, name) {\n if (!_util2.default.isUint8Array(data) && !_util2.default.isString(data)) {\n throw new Error('Parameter [' + (name || 'data') + '] must be of type String or Uint8Array');\n }\n}\nfunction checkMessage(message) {\n if (!(message instanceof messageLib.Message)) {\n throw new Error('Parameter [message] needs to be of type Message');\n }\n}\nfunction checkCleartextOrMessage(message) {\n if (!(message instanceof _cleartext.CleartextMessage) && !(message instanceof messageLib.Message)) {\n throw new Error('Parameter [message] needs to be of type Message or CleartextMessage');\n }\n}\n\n/**\n * Normalize parameter to an array if it is not undefined.\n * @param {Object} param the parameter to be normalized\n * @returns {Array<Object>|undefined} the resulting array or undefined\n */\nfunction toArray(param) {\n if (param && !_util2.default.isArray(param)) {\n param = [param];\n }\n return param;\n}\n\n/**\n * Creates a message obejct either from a Uint8Array or a string.\n * @param {String|Uint8Array} data the payload for the message\n * @param {String} filename the literal data packet's filename\n * @param {Date} date the creation date of the package\n * @param {utf8|binary|text|mime} type (optional) data packet type\n * @returns {Message} a message object\n */\nfunction createMessage(data, filename) {\n var date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date();\n var type = arguments[3];\n\n var msg = void 0;\n if (_util2.default.isUint8Array(data)) {\n msg = messageLib.fromBinary(data, filename, date, type);\n } else if (_util2.default.isString(data)) {\n msg = messageLib.fromText(data, filename, date, type);\n } else {\n throw new Error('Data must be of type String or Uint8Array');\n }\n return msg;\n}\n\n/**\n * Parse the message given a certain format.\n * @param {Message} message the message object to be parse\n * @param {String} format the output format e.g. 'utf8' or 'binary'\n * @returns {Object} the parse data in the respective format\n */\nfunction parseMessage(message, format) {\n if (format === 'binary') {\n return {\n data: message.getLiteralData(),\n filename: message.getFilename()\n };\n } else if (format === 'utf8') {\n return {\n data: message.getText(),\n filename: message.getFilename()\n };\n }\n throw new Error('Invalid format');\n}\n\n/**\n * Global error handler that logs the stack trace and rethrows a high lvl error message.\n * @param {String} message A human readable high level error Message\n * @param {Error} error The internal error that caused the failure\n */\nfunction onError(message, error) {\n // log the stack trace\n _util2.default.print_debug_error(error);\n\n // update error message\n try {\n error.message = message + ': ' + error.message;\n } catch (e) {}\n\n throw error;\n}\n\n/**\n * Check for native AEAD support and configuration by the user. Only\n * browsers that implement the current WebCrypto specification support\n * native GCM. Native EAX is built on CTR and CBC, which current\n * browsers support. OCB and CFB are not natively supported.\n * @returns {Boolean} If authenticated encryption should be used\n */\nfunction nativeAEAD() {\n return _config2.default.aead_protect && ((_config2.default.aead_protect_version !== 4 || _config2.default.aead_mode === _enums2.default.aead.experimental_gcm) && _util2.default.getWebCrypto() || _config2.default.aead_protect_version === 4 && _config2.default.aead_mode === _enums2.default.aead.eax && _util2.default.getWebCrypto());\n}\n\n},{\"./cleartext\":322,\"./config/config\":324,\"./enums\":359,\"./key\":362,\"./message\":366,\"./polyfills\":390,\"./util\":398,\"./worker/async_proxy\":400,\"babel-runtime/core-js/promise\":32,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],368:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Trust = exports.Signature = exports.SecretSubkey = exports.Userid = exports.SecretKey = exports.OnePassSignature = exports.UserAttribute = exports.PublicSubkey = exports.Marker = exports.SymmetricallyEncrypted = exports.PublicKey = exports.Literal = exports.SymEncryptedSessionKey = exports.PublicKeyEncryptedSessionKey = exports.SymEncryptedAEADProtected = exports.SymEncryptedIntegrityProtected = exports.Compressed = undefined;\n\nvar _assign = _dereq_('babel-runtime/core-js/object/assign');\n\nvar _assign2 = _interopRequireDefault(_assign);\n\nvar _compressed = _dereq_('./compressed.js');\n\nObject.defineProperty(exports, 'Compressed', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_compressed).default;\n }\n});\n\nvar _sym_encrypted_integrity_protected = _dereq_('./sym_encrypted_integrity_protected.js');\n\nObject.defineProperty(exports, 'SymEncryptedIntegrityProtected', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_sym_encrypted_integrity_protected).default;\n }\n});\n\nvar _sym_encrypted_aead_protected = _dereq_('./sym_encrypted_aead_protected.js');\n\nObject.defineProperty(exports, 'SymEncryptedAEADProtected', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_sym_encrypted_aead_protected).default;\n }\n});\n\nvar _public_key_encrypted_session_key = _dereq_('./public_key_encrypted_session_key.js');\n\nObject.defineProperty(exports, 'PublicKeyEncryptedSessionKey', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_public_key_encrypted_session_key).default;\n }\n});\n\nvar _sym_encrypted_session_key = _dereq_('./sym_encrypted_session_key.js');\n\nObject.defineProperty(exports, 'SymEncryptedSessionKey', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_sym_encrypted_session_key).default;\n }\n});\n\nvar _literal = _dereq_('./literal.js');\n\nObject.defineProperty(exports, 'Literal', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_literal).default;\n }\n});\n\nvar _public_key = _dereq_('./public_key.js');\n\nObject.defineProperty(exports, 'PublicKey', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_public_key).default;\n }\n});\n\nvar _symmetrically_encrypted = _dereq_('./symmetrically_encrypted.js');\n\nObject.defineProperty(exports, 'SymmetricallyEncrypted', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_symmetrically_encrypted).default;\n }\n});\n\nvar _marker = _dereq_('./marker.js');\n\nObject.defineProperty(exports, 'Marker', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_marker).default;\n }\n});\n\nvar _public_subkey = _dereq_('./public_subkey.js');\n\nObject.defineProperty(exports, 'PublicSubkey', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_public_subkey).default;\n }\n});\n\nvar _user_attribute = _dereq_('./user_attribute.js');\n\nObject.defineProperty(exports, 'UserAttribute', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_user_attribute).default;\n }\n});\n\nvar _one_pass_signature = _dereq_('./one_pass_signature.js');\n\nObject.defineProperty(exports, 'OnePassSignature', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_one_pass_signature).default;\n }\n});\n\nvar _secret_key = _dereq_('./secret_key.js');\n\nObject.defineProperty(exports, 'SecretKey', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_secret_key).default;\n }\n});\n\nvar _userid = _dereq_('./userid.js');\n\nObject.defineProperty(exports, 'Userid', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_userid).default;\n }\n});\n\nvar _secret_subkey = _dereq_('./secret_subkey.js');\n\nObject.defineProperty(exports, 'SecretSubkey', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_secret_subkey).default;\n }\n});\n\nvar _signature = _dereq_('./signature.js');\n\nObject.defineProperty(exports, 'Signature', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_signature).default;\n }\n});\n\nvar _trust = _dereq_('./trust.js');\n\nObject.defineProperty(exports, 'Trust', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_trust).default;\n }\n});\nexports.newPacketFromTag = newPacketFromTag;\nexports.fromStructuredClone = fromStructuredClone;\n\nvar _enums = _dereq_('../enums.js');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _all_packets = _dereq_('./all_packets.js');\n\nvar packets = _interopRequireWildcard(_all_packets);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Allocate a new packet\n * @function newPacketFromTag\n * @memberof module:packet\n * @param {String} tag property name from {@link module:enums.packet}\n * @returns {Object} new packet object with type based on tag\n */\nfunction newPacketFromTag(tag) {\n return new packets[packetClassFromTagName(tag)]();\n}\n\n/**\n * Allocate a new packet from structured packet clone\n * @see {@link https://w3c.github.io/html/infrastructure.html#safe-passing-of-structured-data}\n * @function fromStructuredClone\n * @memberof module:packet\n * @param {Object} packetClone packet clone\n * @returns {Object} new packet object with data from packet clone\n */\nfunction fromStructuredClone(packetClone) {\n var tagName = _enums2.default.read(_enums2.default.packet, packetClone.tag);\n var packet = newPacketFromTag(tagName);\n (0, _assign2.default)(packet, packetClone);\n if (packet.postCloneTypeFix) {\n packet.postCloneTypeFix();\n }\n return packet;\n}\n\n/**\n * Convert tag name to class name\n * @param {String} tag property name from {@link module:enums.packet}\n * @returns {String}\n * @private\n */\nfunction packetClassFromTagName(tag) {\n return tag.substr(0, 1).toUpperCase() + tag.substr(1);\n}\n\n},{\"../enums.js\":359,\"./all_packets.js\":368,\"./compressed.js\":370,\"./literal.js\":372,\"./marker.js\":373,\"./one_pass_signature.js\":374,\"./public_key.js\":377,\"./public_key_encrypted_session_key.js\":378,\"./public_subkey.js\":379,\"./secret_key.js\":380,\"./secret_subkey.js\":381,\"./signature.js\":382,\"./sym_encrypted_aead_protected.js\":383,\"./sym_encrypted_integrity_protected.js\":384,\"./sym_encrypted_session_key.js\":385,\"./symmetrically_encrypted.js\":386,\"./trust.js\":387,\"./user_attribute.js\":388,\"./userid.js\":389,\"babel-runtime/core-js/object/assign\":24}],369:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.clonePackets = clonePackets;\nexports.parseClonedPackets = parseClonedPackets;\n\nvar _key = _dereq_('../key');\n\nvar _message = _dereq_('../message');\n\nvar _cleartext = _dereq_('../cleartext');\n\nvar _signature = _dereq_('../signature');\n\nvar _packetlist = _dereq_('./packetlist');\n\nvar _packetlist2 = _interopRequireDefault(_packetlist);\n\nvar _keyid = _dereq_('../type/keyid');\n\nvar _keyid2 = _interopRequireDefault(_keyid);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//////////////////////////////\n// //\n// List --> Clone //\n// //\n//////////////////////////////\n\n\n/**\n * Create a packetlist from the correspoding object types.\n * @param {Object} options the object passed to and from the web worker\n * @returns {Object} a mutated version of the options optject\n */\nfunction clonePackets(options) {\n if (options.publicKeys) {\n options.publicKeys = options.publicKeys.map(function (key) {\n return key.toPacketlist();\n });\n }\n if (options.privateKeys) {\n options.privateKeys = options.privateKeys.map(function (key) {\n return key.toPacketlist();\n });\n }\n if (options.privateKey) {\n options.privateKey = options.privateKey.toPacketlist();\n }\n if (options.key) {\n options.key = options.key.toPacketlist();\n }\n if (options.message) {\n //could be either a Message or CleartextMessage object\n if (options.message instanceof _message.Message) {\n options.message = options.message.packets;\n } else if (options.message instanceof _cleartext.CleartextMessage) {\n options.message = { text: options.message.text, signature: options.message.signature.packets };\n }\n }\n if (options.signature && options.signature instanceof _signature.Signature) {\n options.signature = options.signature.packets;\n }\n if (options.signatures) {\n options.signatures = options.signatures.map(function (sig) {\n return verificationObjectToClone(sig);\n });\n }\n return options;\n} // OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2015 Tankred Hase\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview This module implements packet list cloning required to\n * pass certain object types between the web worker and main thread using\n * the structured cloning algorithm.\n * @module packet/clone\n */\n\nfunction verificationObjectToClone(verObject) {\n verObject.signature = verObject.signature.packets;\n return verObject;\n}\n\n//////////////////////////////\n// //\n// Clone --> List //\n// //\n//////////////////////////////\n\n\n/**\n * Creates an object with the correct prototype from a corresponding packetlist.\n * @param {Object} options the object passed to and from the web worker\n * @param {String} method the public api function name to be delegated to the worker\n * @returns {Object} a mutated version of the options optject\n */\nfunction parseClonedPackets(options) {\n if (options.publicKeys) {\n options.publicKeys = options.publicKeys.map(packetlistCloneToKey);\n }\n if (options.privateKeys) {\n options.privateKeys = options.privateKeys.map(packetlistCloneToKey);\n }\n if (options.privateKey) {\n options.privateKey = packetlistCloneToKey(options.privateKey);\n }\n if (options.key) {\n options.key = packetlistCloneToKey(options.key);\n }\n if (options.message && options.message.signature) {\n options.message = packetlistCloneToCleartextMessage(options.message);\n } else if (options.message) {\n options.message = packetlistCloneToMessage(options.message);\n }\n if (options.signatures) {\n options.signatures = options.signatures.map(packetlistCloneToSignatures);\n }\n if (options.signature) {\n options.signature = packetlistCloneToSignature(options.signature);\n }\n return options;\n}\n\nfunction packetlistCloneToKey(clone) {\n var packetlist = _packetlist2.default.fromStructuredClone(clone);\n return new _key.Key(packetlist);\n}\n\nfunction packetlistCloneToMessage(clone) {\n var packetlist = _packetlist2.default.fromStructuredClone(clone);\n return new _message.Message(packetlist);\n}\n\nfunction packetlistCloneToCleartextMessage(clone) {\n var packetlist = _packetlist2.default.fromStructuredClone(clone.signature);\n return new _cleartext.CleartextMessage(clone.text, new _signature.Signature(packetlist));\n}\n\n//verification objects\nfunction packetlistCloneToSignatures(clone) {\n clone.keyid = _keyid2.default.fromClone(clone.keyid);\n clone.signature = new _signature.Signature(clone.signature);\n return clone;\n}\n\nfunction packetlistCloneToSignature(clone) {\n if (_util2.default.isString(clone)) {\n //signature is armored\n return clone;\n }\n var packetlist = _packetlist2.default.fromStructuredClone(clone);\n return new _signature.Signature(packetlist);\n}\n\n},{\"../cleartext\":322,\"../key\":362,\"../message\":366,\"../signature\":391,\"../type/keyid\":394,\"../util\":398,\"./packetlist\":376}],370:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _pako = _dereq_('pako');\n\nvar _pako2 = _interopRequireDefault(_pako);\n\nvar _config = _dereq_('../config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _bzip2Build = _dereq_('../compression/bzip2.build.js');\n\nvar _bzip2Build2 = _interopRequireDefault(_bzip2Build);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Implementation of the Compressed Data Packet (Tag 8)\n *\n * {@link https://tools.ietf.org/html/rfc4880#section-5.6|RFC4880 5.6}:\n * The Compressed Data packet contains compressed data. Typically,\n * this packet is found as the contents of an encrypted packet, or following\n * a Signature or One-Pass Signature packet, and contains a literal data packet.\n * @memberof module:packet\n * @constructor\n */\nfunction Compressed() {\n /**\n * Packet type\n * @type {module:enums.packet}\n */\n this.tag = _enums2.default.packet.compressed;\n /**\n * List of packets\n * @type {module:packet.List}\n */\n this.packets = null;\n /**\n * Compression algorithm\n * @type {compression}\n */\n this.algorithm = 'zip';\n\n /**\n * Compressed packet data\n * @type {String}\n */\n this.compressed = null;\n}\n\n/**\n * Parsing function for the packet.\n * @param {String} bytes Payload of a tag 8 packet\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires pako\n * @requires config\n * @requires enums\n * @requires util\n * @requires compression/bzip2\n */\n\nCompressed.prototype.read = function (bytes) {\n // One octet that gives the algorithm used to compress the packet.\n this.algorithm = _enums2.default.read(_enums2.default.compression, bytes[0]);\n\n // Compressed data, which makes up the remainder of the packet.\n this.compressed = bytes.subarray(1, bytes.length);\n\n this.decompress();\n};\n\n/**\n * Return the compressed packet.\n * @returns {String} binary compressed packet\n */\nCompressed.prototype.write = function () {\n if (this.compressed === null) {\n this.compress();\n }\n\n return _util2.default.concatUint8Array([new Uint8Array([_enums2.default.write(_enums2.default.compression, this.algorithm)]), this.compressed]);\n};\n\n/**\n * Decompression method for decompressing the compressed data\n * read by read_packet\n */\nCompressed.prototype.decompress = function () {\n\n if (!decompress_fns[this.algorithm]) {\n throw new Error(\"Compression algorithm unknown :\" + this.algorithm);\n }\n\n this.packets.read(decompress_fns[this.algorithm](this.compressed));\n};\n\n/**\n * Compress the packet data (member decompressedData)\n */\nCompressed.prototype.compress = function () {\n\n if (!compress_fns[this.algorithm]) {\n throw new Error(\"Compression algorithm unknown :\" + this.algorithm);\n }\n\n this.compressed = compress_fns[this.algorithm](this.packets.write());\n};\n\nexports.default = Compressed;\n\n//////////////////////////\n// //\n// Helper functions //\n// //\n//////////////////////////\n\n\nvar nodeZlib = _util2.default.getNodeZlib();\n\nfunction node_zlib(func) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n return function (data) {\n return func(data, options);\n };\n}\n\nfunction pako_zlib(constructor) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n return function (data) {\n var obj = new constructor(options);\n obj.push(data, true);\n return obj.result;\n };\n}\n\nvar compress_fns = void 0;\nvar decompress_fns = void 0;\nif (nodeZlib) {\n // Use Node native zlib for DEFLATE compression/decompression\n compress_fns = {\n // eslint-disable-next-line no-sync\n zip: node_zlib(nodeZlib.deflateRawSync, { level: _config2.default.deflate_level }),\n // eslint-disable-next-line no-sync\n zlib: node_zlib(nodeZlib.deflateSync, { level: _config2.default.deflate_level }),\n bzip2: _bzip2Build2.default.compressFile\n };\n\n decompress_fns = {\n // eslint-disable-next-line no-sync\n zip: node_zlib(nodeZlib.inflateRawSync),\n // eslint-disable-next-line no-sync\n zlib: node_zlib(nodeZlib.inflateSync),\n bzip2: _bzip2Build2.default.decompressFile\n };\n} else {\n // Use JS fallbacks\n compress_fns = {\n zip: pako_zlib(_pako2.default.Deflate, { raw: true, level: _config2.default.deflate_level }),\n zlib: pako_zlib(_pako2.default.Deflate, { level: _config2.default.deflate_level }),\n bzip2: _bzip2Build2.default.compressFile\n };\n\n decompress_fns = {\n zip: pako_zlib(_pako2.default.Inflate, { raw: true }),\n zlib: pako_zlib(_pako2.default.Inflate),\n bzip2: _bzip2Build2.default.decompressFile\n };\n}\n\n},{\"../compression/bzip2.build.js\":323,\"../config\":325,\"../enums\":359,\"../util\":398,\"pako\":301}],371:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _assign = _dereq_('babel-runtime/core-js/object/assign');\n\nvar _assign2 = _interopRequireDefault(_assign);\n\nvar _all_packets = _dereq_('./all_packets');\n\nvar packets = _interopRequireWildcard(_all_packets);\n\nvar _clone = _dereq_('./clone');\n\nvar clone = _interopRequireWildcard(_clone);\n\nvar _packetlist = _dereq_('./packetlist');\n\nvar _packetlist2 = _interopRequireDefault(_packetlist);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mod = {\n List: _packetlist2.default,\n clone: clone\n}; /**\n * @fileoverview OpenPGP packet types\n * @see module:packet/all_packets\n * @see module:packet/clone\n * @see module:packet.List\n * @module packet\n */\n\n(0, _assign2.default)(mod, packets);\n\nexports.default = mod;\n\n},{\"./all_packets\":368,\"./clone\":369,\"./packetlist\":376,\"babel-runtime/core-js/object/assign\":24}],372:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Implementation of the Literal Data Packet (Tag 11)\n *\n * {@link https://tools.ietf.org/html/rfc4880#section-5.9|RFC4880 5.9}:\n * A Literal Data packet contains the body of a message; data that is not to be\n * further interpreted.\n * @param {Date} date the creation date of the literal package\n * @memberof module:packet\n * @constructor\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires enums\n * @requires util\n */\n\nfunction Literal() {\n var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Date();\n\n this.tag = _enums2.default.packet.literal;\n this.format = 'utf8'; // default format for literal data packets\n this.date = _util2.default.normalizeDate(date);\n this.text = null; // textual data representation\n this.data = null; // literal data representation\n this.filename = 'msg.txt';\n}\n\n/**\n * Set the packet data to a javascript native string, end of line\n * will be normalized to \\r\\n and by default text is converted to UTF8\n * @param {String} text Any native javascript string\n * @param {utf8|binary|text|mime} format (optional) The format of the string of bytes\n */\nLiteral.prototype.setText = function (text) {\n var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'utf8';\n\n this.format = format;\n this.text = text;\n this.data = null;\n};\n\n/**\n * Returns literal data packets as native JavaScript string\n * with normalized end of line to \\n\n * @returns {String} literal data as text\n */\nLiteral.prototype.getText = function () {\n if (this.text !== null) {\n return this.text;\n }\n // decode UTF8\n var text = _util2.default.decode_utf8(_util2.default.Uint8Array_to_str(this.data));\n // normalize EOL to \\n\n this.text = _util2.default.nativeEOL(text);\n return this.text;\n};\n\n/**\n * Set the packet data to value represented by the provided string of bytes.\n * @param {Uint8Array} bytes The string of bytes\n * @param {utf8|binary|text|mime} format The format of the string of bytes\n */\nLiteral.prototype.setBytes = function (bytes, format) {\n this.format = format;\n this.data = bytes;\n this.text = null;\n};\n\n/**\n * Get the byte sequence representing the literal packet data\n * @returns {Uint8Array} A sequence of bytes\n */\nLiteral.prototype.getBytes = function () {\n var textMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (this.data !== null) {\n return this.data;\n }\n\n if (textMode) {\n // normalize EOL to \\r\\n and UTF-8 encode\n this.data = _util2.default.str_to_Uint8Array(_util2.default.encode_utf8(_util2.default.canonicalizeEOL(this.text)));\n } else {\n this.data = _util2.default.str_to_Uint8Array(this.text);\n }\n return this.data;\n};\n\n/**\n * Sets the filename of the literal packet data\n * @param {String} filename Any native javascript string\n */\nLiteral.prototype.setFilename = function (filename) {\n this.filename = filename;\n};\n\n/**\n * Get the filename of the literal packet data\n * @returns {String} filename\n */\nLiteral.prototype.getFilename = function () {\n return this.filename;\n};\n\n/**\n * Parsing function for a literal data packet (tag 11).\n *\n * @param {Uint8Array} input Payload of a tag 11 packet\n * @returns {module:packet.Literal} object representation\n */\nLiteral.prototype.read = function (bytes) {\n // - A one-octet field that describes how the data is formatted.\n var format = _enums2.default.read(_enums2.default.literal, bytes[0]);\n\n var filename_len = bytes[1];\n this.filename = _util2.default.decode_utf8(_util2.default.Uint8Array_to_str(bytes.subarray(2, 2 + filename_len)));\n\n this.date = _util2.default.readDate(bytes.subarray(2 + filename_len, 2 + filename_len + 4));\n\n var data = bytes.subarray(6 + filename_len, bytes.length);\n\n this.setBytes(data, format);\n};\n\n/**\n * Creates a string representation of the packet\n *\n * @returns {Uint8Array} Uint8Array representation of the packet\n */\nLiteral.prototype.write = function () {\n var filename = _util2.default.str_to_Uint8Array(_util2.default.encode_utf8(this.filename));\n var filename_length = new Uint8Array([filename.length]);\n\n var format = new Uint8Array([_enums2.default.write(_enums2.default.literal, this.format)]);\n var date = _util2.default.writeDate(this.date);\n var data = this.getBytes(format !== 'binary');\n\n return _util2.default.concatUint8Array([format, filename_length, filename, date, data]);\n};\n\nexports.default = Literal;\n\n},{\"../enums\":359,\"../util\":398}],373:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Implementation of the strange \"Marker packet\" (Tag 10)\n *\n * {@link https://tools.ietf.org/html/rfc4880#section-5.8|RFC4880 5.8}:\n * An experimental version of PGP used this packet as the Literal\n * packet, but no released version of PGP generated Literal packets with this\n * tag. With PGP 5.x, this packet has been reassigned and is reserved for use as\n * the Marker packet.\n *\n * Such a packet MUST be ignored when received.\n * @memberof module:packet\n * @constructor\n */\nfunction Marker() {\n this.tag = _enums2.default.packet.marker;\n}\n\n/**\n * Parsing function for a literal data packet (tag 10).\n *\n * @param {String} input Payload of a tag 10 packet\n * @param {Integer} position\n * Position to start reading from the input string\n * @param {Integer} len\n * Length of the packet or the remaining length of\n * input at position\n * @returns {module:packet.Marker} Object representation\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires enums\n */\n\nMarker.prototype.read = function (bytes) {\n if (bytes[0] === 0x50 && // P\n bytes[1] === 0x47 && // G\n bytes[2] === 0x50) {\n // P\n return true;\n }\n // marker packet does not contain \"PGP\"\n return false;\n};\n\nexports.default = Marker;\n\n},{\"../enums\":359}],374:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _keyid = _dereq_('../type/keyid');\n\nvar _keyid2 = _interopRequireDefault(_keyid);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Implementation of the One-Pass Signature Packets (Tag 4)\n *\n * {@link https://tools.ietf.org/html/rfc4880#section-5.4|RFC4880 5.4}:\n * The One-Pass Signature packet precedes the signed data and contains\n * enough information to allow the receiver to begin calculating any\n * hashes needed to verify the signature. It allows the Signature\n * packet to be placed at the end of the message, so that the signer\n * can compute the entire signed message in one pass.\n * @memberof module:packet\n * @constructor\n */\nfunction OnePassSignature() {\n /**\n * Packet type\n * @type {module:enums.packet}\n */\n this.tag = _enums2.default.packet.onePassSignature;\n /** A one-octet version number. The current version is 3. */\n this.version = null;\n /**\n * A one-octet signature type.\n * Signature types are described in\n * {@link https://tools.ietf.org/html/rfc4880#section-5.2.1|RFC4880 Section 5.2.1}.\n */\n this.type = null;\n /**\n * A one-octet number describing the hash algorithm used.\n * @see {@link https://tools.ietf.org/html/rfc4880#section-9.4|RFC4880 9.4}\n */\n this.hashAlgorithm = null;\n /**\n * A one-octet number describing the public-key algorithm used.\n * @see {@link https://tools.ietf.org/html/rfc4880#section-9.1|RFC4880 9.1}\n */\n this.publicKeyAlgorithm = null;\n /** An eight-octet number holding the Key ID of the signing key. */\n this.signingKeyId = null;\n /**\n * A one-octet number holding a flag showing whether the signature is nested.\n * A zero value indicates that the next packet is another One-Pass Signature packet\n * that describes another signature to be applied to the same message data.\n */\n this.flags = null;\n}\n\n/**\n * parsing function for a one-pass signature packet (tag 4).\n * @param {Uint8Array} bytes payload of a tag 4 packet\n * @returns {module:packet.OnePassSignature} object representation\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires type/keyid\n * @requires enums\n * @requires util\n*/\n\nOnePassSignature.prototype.read = function (bytes) {\n var mypos = 0;\n // A one-octet version number. The current version is 3.\n this.version = bytes[mypos++];\n\n // A one-octet signature type. Signature types are described in\n // Section 5.2.1.\n this.type = _enums2.default.read(_enums2.default.signature, bytes[mypos++]);\n\n // A one-octet number describing the hash algorithm used.\n this.hashAlgorithm = _enums2.default.read(_enums2.default.hash, bytes[mypos++]);\n\n // A one-octet number describing the public-key algorithm used.\n this.publicKeyAlgorithm = _enums2.default.read(_enums2.default.publicKey, bytes[mypos++]);\n\n // An eight-octet number holding the Key ID of the signing key.\n this.signingKeyId = new _keyid2.default();\n this.signingKeyId.read(bytes.subarray(mypos, mypos + 8));\n mypos += 8;\n\n // A one-octet number holding a flag showing whether the signature\n // is nested. A zero value indicates that the next packet is\n // another One-Pass Signature packet that describes another\n // signature to be applied to the same message data.\n this.flags = bytes[mypos++];\n return this;\n};\n\n/**\n * creates a string representation of a one-pass signature packet\n * @returns {Uint8Array} a Uint8Array representation of a one-pass signature packet\n */\nOnePassSignature.prototype.write = function () {\n var start = new Uint8Array([3, _enums2.default.write(_enums2.default.signature, this.type), _enums2.default.write(_enums2.default.hash, this.hashAlgorithm), _enums2.default.write(_enums2.default.publicKey, this.publicKeyAlgorithm)]);\n\n var end = new Uint8Array([this.flags]);\n\n return _util2.default.concatUint8Array([start, this.signingKeyId.write(), end]);\n};\n\n/**\n * Fix custom types after cloning\n */\nOnePassSignature.prototype.postCloneTypeFix = function () {\n this.signingKeyId = _keyid2.default.fromClone(this.signingKeyId);\n};\n\nexports.default = OnePassSignature;\n\n},{\"../enums\":359,\"../type/keyid\":394,\"../util\":398}],375:[function(_dereq_,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _slicedToArray2 = _dereq_(\"babel-runtime/helpers/slicedToArray\");\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nvar _util = _dereq_(\"../util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n readSimpleLength: function readSimpleLength(bytes) {\n var len = 0;\n var offset = void 0;\n var type = bytes[0];\n\n if (type < 192) {\n var _bytes = (0, _slicedToArray3.default)(bytes, 1);\n\n len = _bytes[0];\n\n offset = 1;\n } else if (type < 255) {\n len = (bytes[0] - 192 << 8) + bytes[1] + 192;\n offset = 2;\n } else if (type === 255) {\n len = _util2.default.readNumber(bytes.subarray(1, 1 + 4));\n offset = 5;\n }\n\n return {\n len: len,\n offset: offset\n };\n },\n\n /**\n * Encodes a given integer of length to the openpgp length specifier to a\n * string\n *\n * @param {Integer} length The length to encode\n * @returns {Uint8Array} String with openpgp length representation\n */\n writeSimpleLength: function writeSimpleLength(length) {\n if (length < 192) {\n return new Uint8Array([length]);\n } else if (length > 191 && length < 8384) {\n /*\n * let a = (total data packet length) - 192 let bc = two octet\n * representation of a let d = b + 192\n */\n return new Uint8Array([(length - 192 >> 8) + 192, length - 192 & 0xFF]);\n }\n return _util2.default.concatUint8Array([new Uint8Array([255]), _util2.default.writeNumber(length, 4)]);\n },\n\n /**\n * Writes a packet header version 4 with the given tag_type and length to a\n * string\n *\n * @param {Integer} tag_type Tag type\n * @param {Integer} length Length of the payload\n * @returns {String} String of the header\n */\n writeHeader: function writeHeader(tag_type, length) {\n /* we're only generating v4 packet headers here */\n return _util2.default.concatUint8Array([new Uint8Array([0xC0 | tag_type]), this.writeSimpleLength(length)]);\n },\n\n /**\n * Writes a packet header Version 3 with the given tag_type and length to a\n * string\n *\n * @param {Integer} tag_type Tag type\n * @param {Integer} length Length of the payload\n * @returns {String} String of the header\n */\n writeOldHeader: function writeOldHeader(tag_type, length) {\n if (length < 256) {\n return new Uint8Array([0x80 | tag_type << 2, length]);\n } else if (length < 65536) {\n return _util2.default.concatUint8Array([new Uint8Array([0x80 | tag_type << 2 | 1]), _util2.default.writeNumber(length, 2)]);\n }\n return _util2.default.concatUint8Array([new Uint8Array([0x80 | tag_type << 2 | 2]), _util2.default.writeNumber(length, 4)]);\n },\n\n /**\n * Generic static Packet Parser function\n *\n * @param {String} input Input stream as string\n * @param {integer} position Position to start parsing\n * @param {integer} len Length of the input from position on\n * @returns {Object} Returns a parsed module:packet/packet\n */\n read: function read(input, position, len) {\n // some sanity checks\n if (input === null || input.length <= position || input.subarray(position, input.length).length < 2 || (input[position] & 0x80) === 0) {\n throw new Error(\"Error during parsing. This message / key probably does not conform to a valid OpenPGP format.\");\n }\n var mypos = position;\n var tag = -1;\n var format = -1;\n var packet_length = void 0;\n\n format = 0; // 0 = old format; 1 = new format\n if ((input[mypos] & 0x40) !== 0) {\n format = 1;\n }\n\n var packet_length_type = void 0;\n if (format) {\n // new format header\n tag = input[mypos] & 0x3F; // bit 5-0\n } else {\n // old format header\n tag = (input[mypos] & 0x3F) >> 2; // bit 5-2\n packet_length_type = input[mypos] & 0x03; // bit 1-0\n }\n\n // header octet parsing done\n mypos++;\n\n // parsed length from length field\n var bodydata = null;\n\n // used for partial body lengths\n var real_packet_length = -1;\n if (!format) {\n // 4.2.1. Old Format Packet Lengths\n switch (packet_length_type) {\n case 0:\n // The packet has a one-octet length. The header is 2 octets\n // long.\n packet_length = input[mypos++];\n break;\n case 1:\n // The packet has a two-octet length. The header is 3 octets\n // long.\n packet_length = input[mypos++] << 8 | input[mypos++];\n break;\n case 2:\n // The packet has a four-octet length. The header is 5\n // octets long.\n packet_length = input[mypos++] << 24 | input[mypos++] << 16 | input[mypos++] << 8 | input[mypos++];\n break;\n default:\n // 3 - The packet is of indeterminate length. The header is 1\n // octet long, and the implementation must determine how long\n // the packet is. If the packet is in a file, this means that\n // the packet extends until the end of the file. In general,\n // an implementation SHOULD NOT use indeterminate-length\n // packets except where the end of the data will be clear\n // from the context, and even then it is better to use a\n // definite length, or a new format header. The new format\n // headers described below have a mechanism for precisely\n // encoding data of indeterminate length.\n packet_length = len;\n break;\n }\n } else {\n // 4.2.2. New Format Packet Lengths\n // 4.2.2.1. One-Octet Lengths\n if (input[mypos] < 192) {\n packet_length = input[mypos++];\n // 4.2.2.2. Two-Octet Lengths\n } else if (input[mypos] >= 192 && input[mypos] < 224) {\n packet_length = (input[mypos++] - 192 << 8) + input[mypos++] + 192;\n // 4.2.2.4. Partial Body Lengths\n } else if (input[mypos] > 223 && input[mypos] < 255) {\n packet_length = 1 << (input[mypos++] & 0x1F);\n // EEEK, we're reading the full data here...\n var mypos2 = mypos + packet_length;\n bodydata = [input.subarray(mypos, mypos + packet_length)];\n var tmplen = void 0;\n while (true) {\n if (input[mypos2] < 192) {\n tmplen = input[mypos2++];\n packet_length += tmplen;\n bodydata.push(input.subarray(mypos2, mypos2 + tmplen));\n mypos2 += tmplen;\n break;\n } else if (input[mypos2] >= 192 && input[mypos2] < 224) {\n tmplen = (input[mypos2++] - 192 << 8) + input[mypos2++] + 192;\n packet_length += tmplen;\n bodydata.push(input.subarray(mypos2, mypos2 + tmplen));\n mypos2 += tmplen;\n break;\n } else if (input[mypos2] > 223 && input[mypos2] < 255) {\n tmplen = 1 << (input[mypos2++] & 0x1F);\n packet_length += tmplen;\n bodydata.push(input.subarray(mypos2, mypos2 + tmplen));\n mypos2 += tmplen;\n } else {\n mypos2++;\n tmplen = input[mypos2++] << 24 | input[mypos2++] << 16 | input[mypos2++] << 8 | input[mypos2++];\n bodydata.push(input.subarray(mypos2, mypos2 + tmplen));\n packet_length += tmplen;\n mypos2 += tmplen;\n break;\n }\n }\n real_packet_length = mypos2 - mypos;\n // 4.2.2.3. Five-Octet Lengths\n } else {\n mypos++;\n packet_length = input[mypos++] << 24 | input[mypos++] << 16 | input[mypos++] << 8 | input[mypos++];\n }\n }\n\n // if there was'nt a partial body length: use the specified\n // packet_length\n if (real_packet_length === -1) {\n real_packet_length = packet_length;\n }\n\n if (bodydata === null) {\n bodydata = input.subarray(mypos, mypos + real_packet_length);\n } else if (bodydata instanceof Array) {\n bodydata = _util2.default.concatUint8Array(bodydata);\n }\n\n return {\n tag: tag,\n packet: bodydata,\n offset: mypos + real_packet_length\n };\n }\n}; // GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview Functions for reading and writing packets\n * @requires enums\n * @requires util\n * @module packet/packet\n */\n\n},{\"../util\":398,\"babel-runtime/helpers/slicedToArray\":40}],376:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _all_packets = _dereq_('./all_packets');\n\nvar packets = _interopRequireWildcard(_all_packets);\n\nvar _packet = _dereq_('./packet');\n\nvar _packet2 = _interopRequireDefault(_packet);\n\nvar _config = _dereq_('../config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * This class represents a list of openpgp packets.\n * Take care when iterating over it - the packets themselves\n * are stored as numerical indices.\n * @memberof module:packet\n * @constructor\n */\nfunction List() {\n /**\n * The number of packets contained within the list.\n * @readonly\n * @type {Integer}\n */\n this.length = 0;\n}\n\n/**\n * Reads a stream of binary data and interprents it as a list of packets.\n * @param {Uint8Array} A Uint8Array of bytes.\n */\n/* eslint-disable callback-return */\n/**\n * @requires packet/all_packets\n * @requires packet/packet\n * @requires config\n * @requires enums\n * @requires util\n */\n\nList.prototype.read = function (bytes) {\n var i = 0;\n\n while (i < bytes.length) {\n var parsed = _packet2.default.read(bytes, i, bytes.length - i);\n i = parsed.offset;\n\n var pushed = false;\n try {\n var tag = _enums2.default.read(_enums2.default.packet, parsed.tag);\n var packet = packets.newPacketFromTag(tag);\n this.push(packet);\n pushed = true;\n packet.read(parsed.packet);\n } catch (e) {\n if (!_config2.default.tolerant || parsed.tag === _enums2.default.packet.symmetricallyEncrypted || parsed.tag === _enums2.default.packet.literal || parsed.tag === _enums2.default.packet.compressed) {\n throw e;\n }\n _util2.default.print_debug_error(e);\n if (pushed) {\n this.pop(); // drop unsupported packet\n }\n }\n }\n};\n\n/**\n * Creates a binary representation of openpgp objects contained within the\n * class instance.\n * @returns {Uint8Array} A Uint8Array containing valid openpgp packets.\n */\nList.prototype.write = function () {\n var arr = [];\n\n for (var i = 0; i < this.length; i++) {\n var packetbytes = this[i].write();\n arr.push(_packet2.default.writeHeader(this[i].tag, packetbytes.length));\n arr.push(packetbytes);\n }\n\n return _util2.default.concatUint8Array(arr);\n};\n\n/**\n * Adds a packet to the list. This is the only supported method of doing so;\n * writing to packetlist[i] directly will result in an error.\n * @param {Object} packet Packet to push\n */\nList.prototype.push = function (packet) {\n if (!packet) {\n return;\n }\n\n packet.packets = packet.packets || new List();\n\n this[this.length] = packet;\n this.length++;\n};\n\n/**\n * Remove a packet from the list and return it.\n * @returns {Object} The packet that was removed\n */\nList.prototype.pop = function () {\n if (this.length === 0) {\n return;\n }\n\n var packet = this[this.length - 1];\n delete this[this.length - 1];\n this.length--;\n\n return packet;\n};\n\n/**\n * Creates a new PacketList with all packets that pass the test implemented by the provided function.\n */\nList.prototype.filter = function (callback) {\n var filtered = new List();\n\n for (var i = 0; i < this.length; i++) {\n if (callback(this[i], i, this)) {\n filtered.push(this[i]);\n }\n }\n\n return filtered;\n};\n\n/**\n * Creates a new PacketList with all packets from the given types\n */\nList.prototype.filterByTag = function () {\n var filtered = new List();\n\n var handle = function handle(tag) {\n return function (packetType) {\n return tag === packetType;\n };\n };\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n for (var i = 0; i < this.length; i++) {\n if (args.some(handle(this[i].tag))) {\n filtered.push(this[i]);\n }\n }\n\n return filtered;\n};\n\n/**\n * Executes the provided callback once for each element\n */\nList.prototype.forEach = function (callback) {\n for (var i = 0; i < this.length; i++) {\n callback(this[i], i, this);\n }\n};\n\n/**\n * Returns an array containing return values of callback\n * on each element\n */\nList.prototype.map = function (callback) {\n var packetArray = [];\n\n for (var i = 0; i < this.length; i++) {\n packetArray.push(callback(this[i], i, this));\n }\n\n return packetArray;\n};\n\n/**\n * Executes the callback function once for each element\n * until it finds one where callback returns a truthy value\n * @param {Function} callback\n * @returns {Promise<Boolean>}\n * @async\n */\nList.prototype.some = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(callback) {\n var i;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n i = 0;\n\n case 1:\n if (!(i < this.length)) {\n _context.next = 9;\n break;\n }\n\n _context.next = 4;\n return callback(this[i], i, this);\n\n case 4:\n if (!_context.sent) {\n _context.next = 6;\n break;\n }\n\n return _context.abrupt('return', true);\n\n case 6:\n i++;\n _context.next = 1;\n break;\n\n case 9:\n return _context.abrupt('return', false);\n\n case 10:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Executes the callback function once for each element,\n * returns true if all callbacks returns a truthy value\n */\nList.prototype.every = function (callback) {\n for (var i = 0; i < this.length; i++) {\n if (!callback(this[i], i, this)) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * Traverses packet tree and returns first matching packet\n * @param {module:enums.packet} type The packet type\n * @returns {module:packet/packet|null}\n */\nList.prototype.findPacket = function (type) {\n var packetlist = this.filterByTag(type);\n if (packetlist.length) {\n return packetlist[0];\n }\n var found = null;\n for (var i = 0; i < this.length; i++) {\n if (this[i].packets.length) {\n found = this[i].packets.findPacket(type);\n if (found) {\n return found;\n }\n }\n }\n\n return null;\n};\n\n/**\n * Returns array of found indices by tag\n */\nList.prototype.indexOfTag = function () {\n var tagIndex = [];\n var that = this;\n\n var handle = function handle(tag) {\n return function (packetType) {\n return tag === packetType;\n };\n };\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n for (var i = 0; i < this.length; i++) {\n if (args.some(handle(that[i].tag))) {\n tagIndex.push(i);\n }\n }\n return tagIndex;\n};\n\n/**\n * Returns slice of packetlist\n */\nList.prototype.slice = function (begin, end) {\n if (!end) {\n end = this.length;\n }\n var part = new List();\n for (var i = begin; i < end; i++) {\n part.push(this[i]);\n }\n return part;\n};\n\n/**\n * Concatenates packetlist or array of packets\n */\nList.prototype.concat = function (packetlist) {\n if (packetlist) {\n for (var i = 0; i < packetlist.length; i++) {\n this.push(packetlist[i]);\n }\n }\n return this;\n};\n\n/**\n * Allocate a new packetlist from structured packetlist clone\n * See {@link https://w3c.github.io/html/infrastructure.html#safe-passing-of-structured-data}\n * @param {Object} packetClone packetlist clone\n * @returns {Object} new packetlist object with data from packetlist clone\n */\nList.fromStructuredClone = function (packetlistClone) {\n var packetlist = new List();\n for (var i = 0; i < packetlistClone.length; i++) {\n packetlist.push(packets.fromStructuredClone(packetlistClone[i]));\n if (packetlist[i].packets.length !== 0) {\n packetlist[i].packets = this.fromStructuredClone(packetlist[i].packets);\n } else {\n packetlist[i].packets = new List();\n }\n }\n return packetlist;\n};\n\nexports.default = List;\n\n},{\"../config\":325,\"../enums\":359,\"../util\":398,\"./all_packets\":368,\"./packet\":375,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],377:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _keyid = _dereq_('../type/keyid');\n\nvar _keyid2 = _interopRequireDefault(_keyid);\n\nvar _mpi = _dereq_('../type/mpi');\n\nvar _mpi2 = _interopRequireDefault(_mpi);\n\nvar _config = _dereq_('../config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _crypto = _dereq_('../crypto');\n\nvar _crypto2 = _interopRequireDefault(_crypto);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Implementation of the Key Material Packet (Tag 5,6,7,14)\n *\n * {@link https://tools.ietf.org/html/rfc4880#section-5.5|RFC4480 5.5}:\n * A key material packet contains all the information about a public or\n * private key. There are four variants of this packet type, and two\n * major versions.\n *\n * A Public-Key packet starts a series of packets that forms an OpenPGP\n * key (sometimes called an OpenPGP certificate).\n * @memberof module:packet\n * @constructor\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires type/keyid\n * @requires type/mpi\n * @requires config\n * @requires crypto\n * @requires enums\n * @requires util\n */\n\nfunction PublicKey() {\n var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Date();\n\n /**\n * Packet type\n * @type {module:enums.packet}\n */\n this.tag = _enums2.default.packet.publicKey;\n /**\n * Packet version\n * @type {Integer}\n */\n this.version = _config2.default.aead_protect && _config2.default.aead_protect_version === 4 ? 5 : 4;\n /**\n * Key creation date.\n * @type {Date}\n */\n this.created = _util2.default.normalizeDate(date);\n /**\n * Algorithm specific params\n * @type {Array<Object>}\n */\n this.params = [];\n /**\n * Time until expiration in days (V3 only)\n * @type {Integer}\n */\n this.expirationTimeV3 = 0;\n /**\n * Fingerprint in lowercase hex\n * @type {String}\n */\n this.fingerprint = null;\n /**\n * Keyid\n * @type {module:type/keyid}\n */\n this.keyid = null;\n}\n\n/**\n * Internal Parser for public keys as specified in {@link https://tools.ietf.org/html/rfc4880#section-5.5.2|RFC 4880 section 5.5.2 Public-Key Packet Formats}\n * called by read_tag&lt;num&gt;\n * @param {Uint8Array} bytes Input array to read the packet from\n * @returns {Object} This object with attributes set by the parser\n */\nPublicKey.prototype.read = function (bytes) {\n var pos = 0;\n // A one-octet version number (3, 4 or 5).\n this.version = bytes[pos++];\n\n if (this.version === 3 || this.version === 4 || this.version === 5) {\n // - A four-octet number denoting the time that the key was created.\n this.created = _util2.default.readDate(bytes.subarray(pos, pos + 4));\n pos += 4;\n\n if (this.version === 3) {\n // - A two-octet number denoting the time in days that this key is\n // valid. If this number is zero, then it does not expire.\n this.expirationTimeV3 = _util2.default.readNumber(bytes.subarray(pos, pos + 2));\n pos += 2;\n }\n\n // - A one-octet number denoting the public-key algorithm of this key.\n this.algorithm = _enums2.default.read(_enums2.default.publicKey, bytes[pos++]);\n var algo = _enums2.default.write(_enums2.default.publicKey, this.algorithm);\n\n if (this.version === 5) {\n // - A four-octet scalar octet count for the following key material.\n pos += 4;\n }\n\n // - A series of values comprising the key material. This is\n // algorithm-specific and described in section XXXX.\n var types = _crypto2.default.getPubKeyParamTypes(algo);\n this.params = _crypto2.default.constructParams(types);\n\n for (var i = 0; i < types.length && pos < bytes.length; i++) {\n pos += this.params[i].read(bytes.subarray(pos, bytes.length));\n if (pos > bytes.length) {\n throw new Error('Error reading MPI @:' + pos);\n }\n }\n\n return pos;\n }\n throw new Error('Version ' + this.version + ' of the key packet is unsupported.');\n};\n\n/**\n * Alias of read()\n * @see module:packet.PublicKey#read\n */\nPublicKey.prototype.readPublicKey = PublicKey.prototype.read;\n\n/**\n * Same as write_private_key, but has less information because of\n * public key.\n * @returns {Uint8Array} OpenPGP packet body contents,\n */\nPublicKey.prototype.write = function () {\n var arr = [];\n // Version\n arr.push(new Uint8Array([this.version]));\n arr.push(_util2.default.writeDate(this.created));\n if (this.version === 3) {\n arr.push(_util2.default.writeNumber(this.expirationTimeV3, 2));\n }\n // A one-octet number denoting the public-key algorithm of this key\n var algo = _enums2.default.write(_enums2.default.publicKey, this.algorithm);\n arr.push(new Uint8Array([algo]));\n\n var paramCount = _crypto2.default.getPubKeyParamTypes(algo).length;\n var params = _util2.default.concatUint8Array(this.params.slice(0, paramCount).map(function (param) {\n return param.write();\n }));\n if (this.version === 5) {\n // A four-octet scalar octet count for the following key material\n arr.push(_util2.default.writeNumber(params.length, 4));\n }\n // Algorithm-specific params\n arr.push(params);\n return _util2.default.concatUint8Array(arr);\n};\n\n/**\n * Alias of write()\n * @see module:packet.PublicKey#write\n */\nPublicKey.prototype.writePublicKey = PublicKey.prototype.write;\n\n/**\n * Write an old version packet - it's used by some of the internal routines.\n */\nPublicKey.prototype.writeOld = function () {\n var bytes = this.writePublicKey();\n\n return _util2.default.concatUint8Array([new Uint8Array([0x99]), _util2.default.writeNumber(bytes.length, 2), bytes]);\n};\n\n/**\n * Calculates the key id of the key\n * @returns {String} A 8 byte key id\n */\nPublicKey.prototype.getKeyId = function () {\n if (this.keyid) {\n return this.keyid;\n }\n this.keyid = new _keyid2.default();\n if (this.version === 5) {\n this.keyid.read(_util2.default.hex_to_Uint8Array(this.getFingerprint()).subarray(0, 8));\n } else if (this.version === 4) {\n this.keyid.read(_util2.default.hex_to_Uint8Array(this.getFingerprint()).subarray(12, 20));\n } else if (this.version === 3) {\n var arr = this.params[0].write();\n this.keyid.read(arr.subarray(arr.length - 8, arr.length));\n }\n return this.keyid;\n};\n\n/**\n * Calculates the fingerprint of the key\n * @returns {Uint8Array} A Uint8Array containing the fingerprint\n */\nPublicKey.prototype.getFingerprintBytes = function () {\n if (this.fingerprint) {\n return this.fingerprint;\n }\n var toHash = void 0;\n if (this.version === 5) {\n var bytes = this.writePublicKey();\n toHash = _util2.default.concatUint8Array([new Uint8Array([0x9A]), _util2.default.writeNumber(bytes.length, 4), bytes]);\n this.fingerprint = _crypto2.default.hash.sha256(toHash);\n } else if (this.version === 4) {\n toHash = this.writeOld();\n this.fingerprint = _crypto2.default.hash.sha1(toHash);\n } else if (this.version === 3) {\n var algo = _enums2.default.write(_enums2.default.publicKey, this.algorithm);\n var paramCount = _crypto2.default.getPubKeyParamTypes(algo).length;\n toHash = '';\n for (var i = 0; i < paramCount; i++) {\n toHash += this.params[i].toString();\n }\n this.fingerprint = _crypto2.default.hash.md5(_util2.default.str_to_Uint8Array(toHash));\n }\n return this.fingerprint;\n};\n\n/**\n * Calculates the fingerprint of the key\n * @returns {String} A string containing the fingerprint in lowercase hex\n */\nPublicKey.prototype.getFingerprint = function () {\n return _util2.default.Uint8Array_to_hex(this.getFingerprintBytes());\n};\n\n/**\n * Returns algorithm information\n * @returns {Promise<Object>} An object of the form {algorithm: String, bits:int, curve:String}\n */\nPublicKey.prototype.getAlgorithmInfo = function () {\n var result = {};\n result.algorithm = this.algorithm;\n if (this.params[0] instanceof _mpi2.default) {\n result.bits = this.params[0].byteLength() * 8;\n } else {\n result.curve = this.params[0].getName();\n }\n return result;\n};\n\n/**\n * Fix custom types after cloning\n */\nPublicKey.prototype.postCloneTypeFix = function () {\n var algo = _enums2.default.write(_enums2.default.publicKey, this.algorithm);\n var types = _crypto2.default.getPubKeyParamTypes(algo);\n for (var i = 0; i < types.length; i++) {\n var param = this.params[i];\n this.params[i] = types[i].fromClone(param);\n }\n if (this.keyid) {\n this.keyid = _keyid2.default.fromClone(this.keyid);\n }\n};\n\nexports.default = PublicKey;\n\n},{\"../config\":325,\"../crypto\":340,\"../enums\":359,\"../type/keyid\":394,\"../type/mpi\":395,\"../util\":398}],378:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _keyid = _dereq_('../type/keyid');\n\nvar _keyid2 = _interopRequireDefault(_keyid);\n\nvar _mpi = _dereq_('../type/mpi');\n\nvar _mpi2 = _interopRequireDefault(_mpi);\n\nvar _crypto = _dereq_('../crypto');\n\nvar _crypto2 = _interopRequireDefault(_crypto);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Public-Key Encrypted Session Key Packets (Tag 1)\n *\n * {@link https://tools.ietf.org/html/rfc4880#section-5.1|RFC4880 5.1}:\n * A Public-Key Encrypted Session Key packet holds the session key\n * used to encrypt a message. Zero or more Public-Key Encrypted Session Key\n * packets and/or Symmetric-Key Encrypted Session Key packets may precede a\n * Symmetrically Encrypted Data Packet, which holds an encrypted message. The\n * message is encrypted with the session key, and the session key is itself\n * encrypted and stored in the Encrypted Session Key packet(s). The\n * Symmetrically Encrypted Data Packet is preceded by one Public-Key Encrypted\n * Session Key packet for each OpenPGP key to which the message is encrypted.\n * The recipient of the message finds a session key that is encrypted to their\n * public key, decrypts the session key, and then uses the session key to\n * decrypt the message.\n * @memberof module:packet\n * @constructor\n */\nfunction PublicKeyEncryptedSessionKey() {\n this.tag = _enums2.default.packet.publicKeyEncryptedSessionKey;\n this.version = 3;\n\n this.publicKeyId = new _keyid2.default();\n this.sessionKey = null;\n\n /** @type {Array<module:type/mpi>} */\n this.encrypted = [];\n}\n\n/**\n * Parsing function for a publickey encrypted session key packet (tag 1).\n *\n * @param {Uint8Array} input Payload of a tag 1 packet\n * @param {Integer} position Position to start reading from the input string\n * @param {Integer} len Length of the packet or the remaining length of\n * input at position\n * @returns {module:packet.PublicKeyEncryptedSessionKey} Object representation\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires type/keyid\n * @requires type/mpi\n * @requires crypto\n * @requires enums\n * @requires util\n */\n\nPublicKeyEncryptedSessionKey.prototype.read = function (bytes) {\n this.version = bytes[0];\n this.publicKeyId.read(bytes.subarray(1, bytes.length));\n this.publicKeyAlgorithm = _enums2.default.read(_enums2.default.publicKey, bytes[9]);\n\n var i = 10;\n\n var algo = _enums2.default.write(_enums2.default.publicKey, this.publicKeyAlgorithm);\n var types = _crypto2.default.getEncSessionKeyParamTypes(algo);\n this.encrypted = _crypto2.default.constructParams(types);\n\n for (var j = 0; j < types.length; j++) {\n i += this.encrypted[j].read(bytes.subarray(i, bytes.length));\n }\n};\n\n/**\n * Create a string representation of a tag 1 packet\n *\n * @returns {Uint8Array} The Uint8Array representation\n */\nPublicKeyEncryptedSessionKey.prototype.write = function () {\n var arr = [new Uint8Array([this.version]), this.publicKeyId.write(), new Uint8Array([_enums2.default.write(_enums2.default.publicKey, this.publicKeyAlgorithm)])];\n\n for (var i = 0; i < this.encrypted.length; i++) {\n arr.push(this.encrypted[i].write());\n }\n\n return _util2.default.concatUint8Array(arr);\n};\n\n/**\n * Encrypt session key packet\n * @param {module:packet.PublicKey} key Public key\n * @returns {Promise<Boolean>}\n * @async\n */\nPublicKeyEncryptedSessionKey.prototype.encrypt = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(key) {\n var data, checksum, toEncrypt, algo;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n data = String.fromCharCode(_enums2.default.write(_enums2.default.symmetric, this.sessionKeyAlgorithm));\n\n\n data += _util2.default.Uint8Array_to_str(this.sessionKey);\n checksum = _util2.default.calc_checksum(this.sessionKey);\n\n data += _util2.default.Uint8Array_to_str(_util2.default.writeNumber(checksum, 2));\n\n toEncrypt = void 0;\n algo = _enums2.default.write(_enums2.default.publicKey, this.publicKeyAlgorithm);\n\n if (!(algo === _enums2.default.publicKey.ecdh)) {\n _context.next = 10;\n break;\n }\n\n toEncrypt = new _mpi2.default(_crypto2.default.pkcs5.encode(data));\n _context.next = 15;\n break;\n\n case 10:\n _context.t0 = _mpi2.default;\n _context.next = 13;\n return _crypto2.default.pkcs1.eme.encode(data, key.params[0].byteLength());\n\n case 13:\n _context.t1 = _context.sent;\n toEncrypt = new _context.t0(_context.t1);\n\n case 15:\n _context.next = 17;\n return _crypto2.default.publicKeyEncrypt(algo, key.params, toEncrypt, key.getFingerprintBytes());\n\n case 17:\n this.encrypted = _context.sent;\n return _context.abrupt('return', true);\n\n case 19:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Decrypts the session key (only for public key encrypted session key\n * packets (tag 1)\n *\n * @param {module:packet.SecretKey} key\n * Private key with secret params unlocked\n * @returns {Promise<Boolean>}\n * @async\n */\nPublicKeyEncryptedSessionKey.prototype.decrypt = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(key) {\n var algo, result, checksum, decoded;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n algo = _enums2.default.write(_enums2.default.publicKey, this.publicKeyAlgorithm);\n _context2.next = 3;\n return _crypto2.default.publicKeyDecrypt(algo, key.params, this.encrypted, key.getFingerprintBytes());\n\n case 3:\n result = _context2.sent;\n checksum = void 0;\n decoded = void 0;\n\n if (algo === _enums2.default.publicKey.ecdh) {\n decoded = _crypto2.default.pkcs5.decode(result.toString());\n checksum = _util2.default.readNumber(_util2.default.str_to_Uint8Array(decoded.substr(decoded.length - 2)));\n } else {\n decoded = _crypto2.default.pkcs1.eme.decode(result.toString());\n checksum = _util2.default.readNumber(result.toUint8Array().slice(result.byteLength() - 2));\n }\n\n key = _util2.default.str_to_Uint8Array(decoded.substring(1, decoded.length - 2));\n\n if (!(checksum !== _util2.default.calc_checksum(key))) {\n _context2.next = 12;\n break;\n }\n\n throw new Error('Checksum mismatch');\n\n case 12:\n this.sessionKey = key;\n this.sessionKeyAlgorithm = _enums2.default.read(_enums2.default.symmetric, decoded.charCodeAt(0));\n\n case 14:\n return _context2.abrupt('return', true);\n\n case 15:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function (_x2) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n/**\n * Fix custom types after cloning\n */\nPublicKeyEncryptedSessionKey.prototype.postCloneTypeFix = function () {\n this.publicKeyId = _keyid2.default.fromClone(this.publicKeyId);\n var algo = _enums2.default.write(_enums2.default.publicKey, this.publicKeyAlgorithm);\n var types = _crypto2.default.getEncSessionKeyParamTypes(algo);\n for (var i = 0; i < this.encrypted.length; i++) {\n this.encrypted[i] = types[i].fromClone(this.encrypted[i]);\n }\n};\n\nexports.default = PublicKeyEncryptedSessionKey;\n\n},{\"../crypto\":340,\"../enums\":359,\"../type/keyid\":394,\"../type/mpi\":395,\"../util\":398,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],379:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _public_key = _dereq_('./public_key');\n\nvar _public_key2 = _interopRequireDefault(_public_key);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * A Public-Subkey packet (tag 14) has exactly the same format as a\n * Public-Key packet, but denotes a subkey. One or more subkeys may be\n * associated with a top-level key. By convention, the top-level key\n * provides signature services, and the subkeys provide encryption\n * services.\n * @memberof module:packet\n * @constructor\n * @extends module:packet.PublicKey\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires packet/public_key\n * @requires enums\n */\n\nfunction PublicSubkey() {\n _public_key2.default.call(this);\n this.tag = _enums2.default.packet.publicSubkey;\n}\n\nPublicSubkey.prototype = new _public_key2.default();\nPublicSubkey.prototype.constructor = PublicSubkey;\n\nexports.default = PublicSubkey;\n\n},{\"../enums\":359,\"./public_key\":377}],380:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _public_key = _dereq_('./public_key');\n\nvar _public_key2 = _interopRequireDefault(_public_key);\n\nvar _keyid = _dereq_('../type/keyid.js');\n\nvar _keyid2 = _interopRequireDefault(_keyid);\n\nvar _s2k = _dereq_('../type/s2k');\n\nvar _s2k2 = _interopRequireDefault(_s2k);\n\nvar _crypto = _dereq_('../crypto');\n\nvar _crypto2 = _interopRequireDefault(_crypto);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * A Secret-Key packet contains all the information that is found in a\n * Public-Key packet, including the public-key material, but also\n * includes the secret-key material after all the public-key fields.\n * @memberof module:packet\n * @constructor\n * @extends module:packet.PublicKey\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires packet/public_key\n * @requires type/keyid\n * @requires type/s2k\n * @requires crypto\n * @requires enums\n * @requires util\n */\n\nfunction SecretKey() {\n var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Date();\n\n _public_key2.default.call(this, date);\n /**\n * Packet type\n * @type {module:enums.packet}\n */\n this.tag = _enums2.default.packet.secretKey;\n /**\n * Encrypted secret-key data\n */\n this.encrypted = null;\n /**\n * Indicator if secret-key data is available in decrypted form\n */\n this.isDecrypted = false;\n}\n\nSecretKey.prototype = new _public_key2.default();\nSecretKey.prototype.constructor = SecretKey;\n\nfunction get_hash_len(hash) {\n if (hash === 'sha1') {\n return 20;\n }\n return 2;\n}\n\nfunction get_hash_fn(hash) {\n if (hash === 'sha1') {\n return _crypto2.default.hash.sha1;\n }\n return function (c) {\n return _util2.default.writeNumber(_util2.default.calc_checksum(c), 2);\n };\n}\n\n// Helper function\n\nfunction parse_cleartext_params(hash_algorithm, cleartext, algorithm) {\n if (hash_algorithm) {\n var hashlen = get_hash_len(hash_algorithm);\n var hashfn = get_hash_fn(hash_algorithm);\n\n var hashtext = _util2.default.Uint8Array_to_str(cleartext.subarray(cleartext.length - hashlen, cleartext.length));\n cleartext = cleartext.subarray(0, cleartext.length - hashlen);\n var hash = _util2.default.Uint8Array_to_str(hashfn(cleartext));\n\n if (hash !== hashtext) {\n throw new Error(\"Incorrect key passphrase\");\n }\n }\n\n var algo = _enums2.default.write(_enums2.default.publicKey, algorithm);\n var types = _crypto2.default.getPrivKeyParamTypes(algo);\n var params = _crypto2.default.constructParams(types);\n var p = 0;\n\n for (var i = 0; i < types.length && p < cleartext.length; i++) {\n p += params[i].read(cleartext.subarray(p, cleartext.length));\n if (p > cleartext.length) {\n throw new Error('Error reading param @:' + p);\n }\n }\n\n return params;\n}\n\nfunction write_cleartext_params(hash_algorithm, algorithm, params) {\n var arr = [];\n var algo = _enums2.default.write(_enums2.default.publicKey, algorithm);\n var numPublicParams = _crypto2.default.getPubKeyParamTypes(algo).length;\n\n for (var i = numPublicParams; i < params.length; i++) {\n arr.push(params[i].write());\n }\n\n var bytes = _util2.default.concatUint8Array(arr);\n\n if (hash_algorithm) {\n var hash = get_hash_fn(hash_algorithm)(bytes);\n\n return _util2.default.concatUint8Array([bytes, hash]);\n }\n\n return bytes;\n}\n\n// 5.5.3. Secret-Key Packet Formats\n\n/**\n * Internal parser for private keys as specified in\n * {@link https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-04#section-5.5.3|RFC4880bis-04 section 5.5.3}\n * @param {String} bytes Input string to read the packet from\n */\nSecretKey.prototype.read = function (bytes) {\n // - A Public-Key or Public-Subkey packet, as described above.\n var len = this.readPublicKey(bytes);\n\n bytes = bytes.subarray(len, bytes.length);\n\n // - One octet indicating string-to-key usage conventions. Zero\n // indicates that the secret-key data is not encrypted. 255 or 254\n // indicates that a string-to-key specifier is being given. Any\n // other value is a symmetric-key encryption algorithm identifier.\n var isEncrypted = bytes[0];\n\n if (isEncrypted) {\n this.encrypted = bytes;\n } else {\n // - Plain or encrypted multiprecision integers comprising the secret\n // key data. These algorithm-specific fields are as described\n // below.\n var privParams = parse_cleartext_params('mod', bytes.subarray(1, bytes.length), this.algorithm);\n this.params = this.params.concat(privParams);\n this.isDecrypted = true;\n }\n};\n\n/**\n * Creates an OpenPGP key packet for the given key.\n * @returns {String} A string of bytes containing the secret key OpenPGP packet\n */\nSecretKey.prototype.write = function () {\n var arr = [this.writePublicKey()];\n\n if (!this.encrypted) {\n arr.push(new Uint8Array([0]));\n arr.push(write_cleartext_params('mod', this.algorithm, this.params));\n } else {\n arr.push(this.encrypted);\n }\n\n return _util2.default.concatUint8Array(arr);\n};\n\n/**\n * Encrypt the payload. By default, we use aes256 and iterated, salted string\n * to key specifier. If the key is in a decrypted state (isDecrypted === true)\n * and the passphrase is empty or undefined, the key will be set as not encrypted.\n * This can be used to remove passphrase protection after calling decrypt().\n * @param {String} passphrase\n * @returns {Promise<Boolean>}\n * @async\n */\nSecretKey.prototype.encrypt = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(passphrase) {\n var s2k, symmetric, hash, cleartext, key, blockLen, iv, arr, aead, optionalFields, mode, modeInstance, encrypted;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (!(this.isDecrypted && !passphrase)) {\n _context.next = 5;\n break;\n }\n\n this.encrypted = null;\n return _context.abrupt('return', false);\n\n case 5:\n if (passphrase) {\n _context.next = 7;\n break;\n }\n\n throw new Error('The key must be decrypted before removing passphrase protection.');\n\n case 7:\n s2k = new _s2k2.default();\n _context.next = 10;\n return _crypto2.default.random.getRandomBytes(8);\n\n case 10:\n s2k.salt = _context.sent;\n symmetric = 'aes256';\n hash = this.version === 5 ? null : 'sha1';\n cleartext = write_cleartext_params(hash, this.algorithm, this.params);\n key = produceEncryptionKey(s2k, passphrase, symmetric);\n blockLen = _crypto2.default.cipher[symmetric].blockSize;\n _context.next = 18;\n return _crypto2.default.random.getRandomBytes(blockLen);\n\n case 18:\n iv = _context.sent;\n arr = void 0;\n\n if (!(this.version === 5)) {\n _context.next = 36;\n break;\n }\n\n aead = 'eax';\n optionalFields = _util2.default.concatUint8Array([new Uint8Array([_enums2.default.write(_enums2.default.symmetric, symmetric), _enums2.default.write(_enums2.default.aead, aead)]), s2k.write(), iv]);\n\n arr = [new Uint8Array([253, optionalFields.length])];\n arr.push(optionalFields);\n mode = _crypto2.default[aead];\n _context.next = 28;\n return mode(symmetric, key);\n\n case 28:\n modeInstance = _context.sent;\n _context.next = 31;\n return modeInstance.encrypt(cleartext, iv.subarray(0, mode.ivLength), new Uint8Array());\n\n case 31:\n encrypted = _context.sent;\n\n arr.push(_util2.default.writeNumber(encrypted.length, 4));\n arr.push(encrypted);\n _context.next = 40;\n break;\n\n case 36:\n arr = [new Uint8Array([254, _enums2.default.write(_enums2.default.symmetric, symmetric)])];\n arr.push(s2k.write());\n arr.push(iv);\n arr.push(_crypto2.default.cfb.normalEncrypt(symmetric, key, cleartext, iv));\n\n case 40:\n\n this.encrypted = _util2.default.concatUint8Array(arr);\n return _context.abrupt('return', true);\n\n case 42:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function (_x2) {\n return _ref.apply(this, arguments);\n };\n}();\n\nfunction produceEncryptionKey(s2k, passphrase, algorithm) {\n return s2k.produce_key(passphrase, _crypto2.default.cipher[algorithm].keySize);\n}\n\n/**\n * Decrypts the private key params which are needed to use the key.\n * {@link module:packet.SecretKey.isDecrypted} should be false, as\n * otherwise calls to this function will throw an error.\n * @param {String} passphrase The passphrase for this private key as string\n * @returns {Promise<Boolean>}\n * @async\n */\nSecretKey.prototype.decrypt = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(passphrase) {\n var i, symmetric, aead, key, s2k_usage, s2k, iv, ciphertext, cleartext, mode, modeInstance, hash, privParams;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!this.isDecrypted) {\n _context2.next = 2;\n break;\n }\n\n throw new Error('Key packet is already decrypted.');\n\n case 2:\n i = 0;\n symmetric = void 0;\n aead = void 0;\n key = void 0;\n s2k_usage = this.encrypted[i++];\n\n // - Only for a version 5 packet, a one-octet scalar octet count of\n // the next 4 optional fields.\n\n if (this.version === 5) {\n i++;\n }\n\n // - [Optional] If string-to-key usage octet was 255, 254, or 253, a\n // one-octet symmetric encryption algorithm.\n if (s2k_usage === 255 || s2k_usage === 254 || s2k_usage === 253) {\n symmetric = this.encrypted[i++];\n symmetric = _enums2.default.read(_enums2.default.symmetric, symmetric);\n\n // - [Optional] If string-to-key usage octet was 253, a one-octet\n // AEAD algorithm.\n if (s2k_usage === 253) {\n aead = this.encrypted[i++];\n aead = _enums2.default.read(_enums2.default.aead, aead);\n }\n\n // - [Optional] If string-to-key usage octet was 255, 254, or 253, a\n // string-to-key specifier. The length of the string-to-key\n // specifier is implied by its type, as described above.\n s2k = new _s2k2.default();\n\n i += s2k.read(this.encrypted.subarray(i, this.encrypted.length));\n\n key = produceEncryptionKey(s2k, passphrase, symmetric);\n } else {\n symmetric = s2k_usage;\n symmetric = _enums2.default.read(_enums2.default.symmetric, symmetric);\n key = _crypto2.default.hash.md5(passphrase);\n }\n\n // - [Optional] If secret data is encrypted (string-to-key usage octet\n // not zero), an Initial Vector (IV) of the same length as the\n // cipher's block size.\n iv = this.encrypted.subarray(i, i + _crypto2.default.cipher[symmetric].blockSize);\n\n\n i += iv.length;\n\n // - Only for a version 5 packet, a four-octet scalar octet count for\n // the following key material.\n if (this.version === 5) {\n i += 4;\n }\n\n ciphertext = this.encrypted.subarray(i, this.encrypted.length);\n cleartext = void 0;\n\n if (!aead) {\n _context2.next = 31;\n break;\n }\n\n mode = _crypto2.default[aead];\n _context2.prev = 16;\n _context2.next = 19;\n return mode(symmetric, key);\n\n case 19:\n modeInstance = _context2.sent;\n _context2.next = 22;\n return modeInstance.decrypt(ciphertext, iv.subarray(0, mode.ivLength), new Uint8Array());\n\n case 22:\n cleartext = _context2.sent;\n _context2.next = 29;\n break;\n\n case 25:\n _context2.prev = 25;\n _context2.t0 = _context2['catch'](16);\n\n if (!(_context2.t0.message === 'Authentication tag mismatch')) {\n _context2.next = 29;\n break;\n }\n\n throw new Error('Incorrect key passphrase: ' + _context2.t0.message);\n\n case 29:\n _context2.next = 32;\n break;\n\n case 31:\n cleartext = _crypto2.default.cfb.normalDecrypt(symmetric, key, ciphertext, iv);\n\n case 32:\n hash = s2k_usage === 253 ? null : s2k_usage === 254 ? 'sha1' : 'mod';\n privParams = parse_cleartext_params(hash, cleartext, this.algorithm);\n\n this.params = this.params.concat(privParams);\n this.isDecrypted = true;\n this.encrypted = null;\n\n return _context2.abrupt('return', true);\n\n case 38:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this, [[16, 25]]);\n }));\n\n return function (_x3) {\n return _ref2.apply(this, arguments);\n };\n}();\n\nSecretKey.prototype.generate = function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(bits, curve) {\n var algo;\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n algo = _enums2.default.write(_enums2.default.publicKey, this.algorithm);\n _context3.next = 3;\n return _crypto2.default.generateParams(algo, bits, curve);\n\n case 3:\n this.params = _context3.sent;\n\n this.isDecrypted = true;\n\n case 5:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n return function (_x4, _x5) {\n return _ref3.apply(this, arguments);\n };\n}();\n\n/**\n * Clear private params, return to initial state\n */\nSecretKey.prototype.clearPrivateParams = function () {\n if (!this.encrypted) {\n throw new Error('If secret key is not encrypted, clearing private params is irreversible.');\n }\n var algo = _enums2.default.write(_enums2.default.publicKey, this.algorithm);\n this.params = this.params.slice(0, _crypto2.default.getPubKeyParamTypes(algo).length);\n this.isDecrypted = false;\n};\n\n/**\n * Fix custom types after cloning\n */\nSecretKey.prototype.postCloneTypeFix = function () {\n var algo = _enums2.default.write(_enums2.default.publicKey, this.algorithm);\n var types = [].concat(_crypto2.default.getPubKeyParamTypes(algo), _crypto2.default.getPrivKeyParamTypes(algo));\n for (var i = 0; i < this.params.length; i++) {\n var param = this.params[i];\n this.params[i] = types[i].fromClone(param);\n }\n if (this.keyid) {\n this.keyid = _keyid2.default.fromClone(this.keyid);\n }\n};\n\nexports.default = SecretKey;\n\n},{\"../crypto\":340,\"../enums\":359,\"../type/keyid.js\":394,\"../type/s2k\":397,\"../util\":398,\"./public_key\":377,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],381:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _secret_key = _dereq_('./secret_key');\n\nvar _secret_key2 = _interopRequireDefault(_secret_key);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * A Secret-Subkey packet (tag 7) is the subkey analog of the Secret\n * Key packet and has exactly the same format.\n * @memberof module:packet\n * @constructor\n * @extends module:packet.SecretKey\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires packet/secret_key\n * @requires enums\n */\n\nfunction SecretSubkey() {\n var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Date();\n\n _secret_key2.default.call(this, date);\n this.tag = _enums2.default.packet.secretSubkey;\n}\n\nSecretSubkey.prototype = new _secret_key2.default();\nSecretSubkey.prototype.constructor = SecretSubkey;\n\nexports.default = SecretSubkey;\n\n},{\"../enums\":359,\"./secret_key\":380}],382:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _slicedToArray2 = _dereq_('babel-runtime/helpers/slicedToArray');\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nvar _entries = _dereq_('babel-runtime/core-js/object/entries');\n\nvar _entries2 = _interopRequireDefault(_entries);\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _packet2 = _dereq_('./packet');\n\nvar _packet3 = _interopRequireDefault(_packet2);\n\nvar _keyid = _dereq_('../type/keyid.js');\n\nvar _keyid2 = _interopRequireDefault(_keyid);\n\nvar _mpi = _dereq_('../type/mpi.js');\n\nvar _mpi2 = _interopRequireDefault(_mpi);\n\nvar _crypto = _dereq_('../crypto');\n\nvar _crypto2 = _interopRequireDefault(_crypto);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Implementation of the Signature Packet (Tag 2)\n *\n * {@link https://tools.ietf.org/html/rfc4880#section-5.2|RFC4480 5.2}:\n * A Signature packet describes a binding between some public key and\n * some data. The most common signatures are a signature of a file or a\n * block of text, and a signature that is a certification of a User ID.\n * @memberof module:packet\n * @constructor\n * @param {Date} date the creation date of the signature\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires packet/packet\n * @requires type/keyid\n * @requires type/mpi\n * @requires crypto\n * @requires enums\n * @requires util\n */\n\nfunction Signature() {\n var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Date();\n\n this.tag = _enums2.default.packet.signature;\n this.version = 4;\n this.signatureType = null;\n this.hashAlgorithm = null;\n this.publicKeyAlgorithm = null;\n\n this.signatureData = null;\n this.unhashedSubpackets = null;\n this.signedHashValue = null;\n\n this.created = _util2.default.normalizeDate(date);\n this.signatureExpirationTime = null;\n this.signatureNeverExpires = true;\n this.exportable = null;\n this.trustLevel = null;\n this.trustAmount = null;\n this.regularExpression = null;\n this.revocable = null;\n this.keyExpirationTime = null;\n this.keyNeverExpires = null;\n this.preferredSymmetricAlgorithms = null;\n this.revocationKeyClass = null;\n this.revocationKeyAlgorithm = null;\n this.revocationKeyFingerprint = null;\n this.issuerKeyId = new _keyid2.default();\n this.notation = null;\n this.preferredHashAlgorithms = null;\n this.preferredCompressionAlgorithms = null;\n this.keyServerPreferences = null;\n this.preferredKeyServer = null;\n this.isPrimaryUserID = null;\n this.policyURI = null;\n this.keyFlags = null;\n this.signersUserId = null;\n this.reasonForRevocationFlag = null;\n this.reasonForRevocationString = null;\n this.features = null;\n this.signatureTargetPublicKeyAlgorithm = null;\n this.signatureTargetHashAlgorithm = null;\n this.signatureTargetHash = null;\n this.embeddedSignature = null;\n this.issuerKeyVersion = null;\n this.issuerFingerprint = null;\n this.preferredAeadAlgorithms = null;\n\n this.verified = null;\n this.revoked = null;\n}\n\n/**\n * parsing function for a signature packet (tag 2).\n * @param {String} bytes payload of a tag 2 packet\n * @param {Integer} position position to start reading from the bytes string\n * @param {Integer} len length of the packet or the remaining length of bytes at position\n * @returns {module:packet.Signature} object representation\n */\nSignature.prototype.read = function (bytes) {\n var _this = this;\n\n var i = 0;\n this.version = bytes[i++];\n\n var subpackets = function subpackets(bytes) {\n // Two-octet scalar octet count for following subpacket data.\n var subpacket_length = _util2.default.readNumber(bytes.subarray(0, 2));\n\n var i = 2;\n\n // subpacket data set (zero or more subpackets)\n while (i < 2 + subpacket_length) {\n var len = _packet3.default.readSimpleLength(bytes.subarray(i, bytes.length));\n i += len.offset;\n\n _this.read_sub_packet(bytes.subarray(i, i + len.len));\n\n i += len.len;\n }\n\n return i;\n };\n\n // switch on version (3 and 4)\n switch (this.version) {\n case 3:\n {\n // One-octet length of following hashed material. MUST be 5.\n if (bytes[i++] !== 5) {\n _util2.default.print_debug(\"packet/signature.js\\n\" + 'invalid One-octet length of following hashed material.' + 'MUST be 5. @:' + (i - 1));\n }\n\n var sigpos = i;\n // One-octet signature type.\n this.signatureType = bytes[i++];\n\n // Four-octet creation time.\n this.created = _util2.default.readDate(bytes.subarray(i, i + 4));\n i += 4;\n\n // storing data appended to data which gets verified\n this.signatureData = bytes.subarray(sigpos, i);\n\n // Eight-octet Key ID of signer.\n this.issuerKeyId.read(bytes.subarray(i, i + 8));\n i += 8;\n\n // One-octet public-key algorithm.\n this.publicKeyAlgorithm = bytes[i++];\n\n // One-octet hash algorithm.\n this.hashAlgorithm = bytes[i++];\n break;\n }\n case 4:\n {\n this.signatureType = bytes[i++];\n this.publicKeyAlgorithm = bytes[i++];\n this.hashAlgorithm = bytes[i++];\n\n // hashed subpackets\n i += subpackets(bytes.subarray(i, bytes.length), true);\n\n // A V4 signature hashes the packet body\n // starting from its first field, the version number, through the end\n // of the hashed subpacket data. Thus, the fields hashed are the\n // signature version, the signature type, the public-key algorithm, the\n // hash algorithm, the hashed subpacket length, and the hashed\n // subpacket body.\n this.signatureData = bytes.subarray(0, i);\n var sigDataLength = i;\n\n // unhashed subpackets\n i += subpackets(bytes.subarray(i, bytes.length), false);\n this.unhashedSubpackets = bytes.subarray(sigDataLength, i);\n\n break;\n }\n default:\n throw new Error('Version ' + this.version + ' of the signature is unsupported.');\n }\n\n // Two-octet field holding left 16 bits of signed hash value.\n this.signedHashValue = bytes.subarray(i, i + 2);\n i += 2;\n\n this.signature = bytes.subarray(i, bytes.length);\n};\n\nSignature.prototype.write = function () {\n var arr = [];\n switch (this.version) {\n case 3:\n arr.push(new Uint8Array([3, 5])); // version, One-octet length of following hashed material. MUST be 5\n arr.push(new Uint8Array([this.signatureType]));\n arr.push(_util2.default.writeDate(this.created));\n arr.push(this.issuerKeyId.write());\n arr.push(new Uint8Array([_enums2.default.write(_enums2.default.publicKey, this.publicKeyAlgorithm), _enums2.default.write(_enums2.default.hash, this.hashAlgorithm)]));\n break;\n case 4:\n arr.push(this.signatureData);\n arr.push(this.unhashedSubpackets ? this.unhashedSubpackets : _util2.default.writeNumber(0, 2));\n break;\n }\n arr.push(this.signedHashValue);\n arr.push(this.signature);\n return _util2.default.concatUint8Array(arr);\n};\n\n/**\n * Signs provided data. This needs to be done prior to serialization.\n * @param {module:packet.SecretKey} key private key used to sign the message.\n * @param {Object} data Contains packets to be signed.\n * @returns {Promise<Boolean>}\n * @async\n */\nSignature.prototype.sign = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(key, data) {\n var signatureType, publicKeyAlgorithm, hashAlgorithm, arr, trailer, toHash, hash;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n signatureType = _enums2.default.write(_enums2.default.signature, this.signatureType);\n publicKeyAlgorithm = _enums2.default.write(_enums2.default.publicKey, this.publicKeyAlgorithm);\n hashAlgorithm = _enums2.default.write(_enums2.default.hash, this.hashAlgorithm);\n arr = [new Uint8Array([4, signatureType, publicKeyAlgorithm, hashAlgorithm])];\n\n\n if (key.version === 5) {\n // We could also generate this subpacket for version 4 keys, but for\n // now we don't.\n this.issuerKeyVersion = key.version;\n this.issuerFingerprint = key.getFingerprintBytes();\n }\n\n this.issuerKeyId = key.getKeyId();\n\n // Add hashed subpackets\n arr.push(this.write_all_sub_packets());\n\n this.signatureData = _util2.default.concatUint8Array(arr);\n\n trailer = this.calculateTrailer();\n toHash = null;\n _context.t0 = this.version;\n _context.next = _context.t0 === 3 ? 13 : _context.t0 === 4 ? 15 : 17;\n break;\n\n case 13:\n toHash = _util2.default.concatUint8Array([this.toSign(signatureType, data), new Uint8Array([signatureType]), _util2.default.writeDate(this.created)]);\n return _context.abrupt('break', 18);\n\n case 15:\n toHash = _util2.default.concatUint8Array([this.toSign(signatureType, data), this.signatureData, trailer]);\n return _context.abrupt('break', 18);\n\n case 17:\n throw new Error('Version ' + this.version + ' of the signature is unsupported.');\n\n case 18:\n hash = _crypto2.default.hash.digest(hashAlgorithm, toHash);\n\n\n this.signedHashValue = hash.subarray(0, 2);\n\n _context.next = 22;\n return _crypto2.default.signature.sign(publicKeyAlgorithm, hashAlgorithm, key.params, toHash);\n\n case 22:\n this.signature = _context.sent;\n return _context.abrupt('return', true);\n\n case 24:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function (_x2, _x3) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Creates string of bytes with all subpacket data\n * @returns {String} a string-representation of a all subpacket data\n */\nSignature.prototype.write_all_sub_packets = function () {\n var sub = _enums2.default.signatureSubpacket;\n var arr = [];\n var bytes = void 0;\n if (this.created !== null) {\n arr.push(write_sub_packet(sub.signature_creation_time, _util2.default.writeDate(this.created)));\n }\n if (this.signatureExpirationTime !== null) {\n arr.push(write_sub_packet(sub.signature_expiration_time, _util2.default.writeNumber(this.signatureExpirationTime, 4)));\n }\n if (this.exportable !== null) {\n arr.push(write_sub_packet(sub.exportable_certification, new Uint8Array([this.exportable ? 1 : 0])));\n }\n if (this.trustLevel !== null) {\n bytes = new Uint8Array([this.trustLevel, this.trustAmount]);\n arr.push(write_sub_packet(sub.trust_signature, bytes));\n }\n if (this.regularExpression !== null) {\n arr.push(write_sub_packet(sub.regular_expression, this.regularExpression));\n }\n if (this.revocable !== null) {\n arr.push(write_sub_packet(sub.revocable, new Uint8Array([this.revocable ? 1 : 0])));\n }\n if (this.keyExpirationTime !== null) {\n arr.push(write_sub_packet(sub.key_expiration_time, _util2.default.writeNumber(this.keyExpirationTime, 4)));\n }\n if (this.preferredSymmetricAlgorithms !== null) {\n bytes = _util2.default.str_to_Uint8Array(_util2.default.Uint8Array_to_str(this.preferredSymmetricAlgorithms));\n arr.push(write_sub_packet(sub.preferred_symmetric_algorithms, bytes));\n }\n if (this.revocationKeyClass !== null) {\n bytes = new Uint8Array([this.revocationKeyClass, this.revocationKeyAlgorithm]);\n bytes = _util2.default.concatUint8Array([bytes, this.revocationKeyFingerprint]);\n arr.push(write_sub_packet(sub.revocation_key, bytes));\n }\n if (!this.issuerKeyId.isNull() && this.issuerKeyVersion !== 5) {\n // If the version of [the] key is greater than 4, this subpacket\n // MUST NOT be included in the signature.\n arr.push(write_sub_packet(sub.issuer, this.issuerKeyId.write()));\n }\n if (this.notation !== null) {\n (0, _entries2.default)(this.notation).forEach(function (_ref2) {\n var _ref3 = (0, _slicedToArray3.default)(_ref2, 2),\n name = _ref3[0],\n value = _ref3[1];\n\n bytes = [new Uint8Array([0x80, 0, 0, 0])];\n // 2 octets of name length\n bytes.push(_util2.default.writeNumber(name.length, 2));\n // 2 octets of value length\n bytes.push(_util2.default.writeNumber(value.length, 2));\n bytes.push(_util2.default.str_to_Uint8Array(name + value));\n bytes = _util2.default.concatUint8Array(bytes);\n arr.push(write_sub_packet(sub.notation_data, bytes));\n });\n }\n if (this.preferredHashAlgorithms !== null) {\n bytes = _util2.default.str_to_Uint8Array(_util2.default.Uint8Array_to_str(this.preferredHashAlgorithms));\n arr.push(write_sub_packet(sub.preferred_hash_algorithms, bytes));\n }\n if (this.preferredCompressionAlgorithms !== null) {\n bytes = _util2.default.str_to_Uint8Array(_util2.default.Uint8Array_to_str(this.preferredCompressionAlgorithms));\n arr.push(write_sub_packet(sub.preferred_compression_algorithms, bytes));\n }\n if (this.keyServerPreferences !== null) {\n bytes = _util2.default.str_to_Uint8Array(_util2.default.Uint8Array_to_str(this.keyServerPreferences));\n arr.push(write_sub_packet(sub.key_server_preferences, bytes));\n }\n if (this.preferredKeyServer !== null) {\n arr.push(write_sub_packet(sub.preferred_key_server, _util2.default.str_to_Uint8Array(this.preferredKeyServer)));\n }\n if (this.isPrimaryUserID !== null) {\n arr.push(write_sub_packet(sub.primary_user_id, new Uint8Array([this.isPrimaryUserID ? 1 : 0])));\n }\n if (this.policyURI !== null) {\n arr.push(write_sub_packet(sub.policy_uri, _util2.default.str_to_Uint8Array(this.policyURI)));\n }\n if (this.keyFlags !== null) {\n bytes = _util2.default.str_to_Uint8Array(_util2.default.Uint8Array_to_str(this.keyFlags));\n arr.push(write_sub_packet(sub.key_flags, bytes));\n }\n if (this.signersUserId !== null) {\n arr.push(write_sub_packet(sub.signers_user_id, _util2.default.str_to_Uint8Array(this.signersUserId)));\n }\n if (this.reasonForRevocationFlag !== null) {\n bytes = _util2.default.str_to_Uint8Array(String.fromCharCode(this.reasonForRevocationFlag) + this.reasonForRevocationString);\n arr.push(write_sub_packet(sub.reason_for_revocation, bytes));\n }\n if (this.features !== null) {\n bytes = _util2.default.str_to_Uint8Array(_util2.default.Uint8Array_to_str(this.features));\n arr.push(write_sub_packet(sub.features, bytes));\n }\n if (this.signatureTargetPublicKeyAlgorithm !== null) {\n bytes = [new Uint8Array([this.signatureTargetPublicKeyAlgorithm, this.signatureTargetHashAlgorithm])];\n bytes.push(_util2.default.str_to_Uint8Array(this.signatureTargetHash));\n bytes = _util2.default.concatUint8Array(bytes);\n arr.push(write_sub_packet(sub.signature_target, bytes));\n }\n if (this.embeddedSignature !== null) {\n arr.push(write_sub_packet(sub.embedded_signature, this.embeddedSignature.write()));\n }\n if (this.issuerFingerprint !== null) {\n bytes = [new Uint8Array([this.issuerKeyVersion]), this.issuerFingerprint];\n bytes = _util2.default.concatUint8Array(bytes);\n arr.push(write_sub_packet(sub.issuer_fingerprint, bytes));\n }\n if (this.preferredAeadAlgorithms !== null) {\n bytes = _util2.default.str_to_Uint8Array(_util2.default.Uint8Array_to_str(this.preferredAeadAlgorithms));\n arr.push(write_sub_packet(sub.preferred_aead_algorithms, bytes));\n }\n\n var result = _util2.default.concatUint8Array(arr);\n var length = _util2.default.writeNumber(result.length, 2);\n\n return _util2.default.concatUint8Array([length, result]);\n};\n\n/**\n * Creates a string representation of a sub signature packet\n * @see {@link https://tools.ietf.org/html/rfc4880#section-5.2.3.1|RFC4880 5.2.3.1}\n * @see {@link https://tools.ietf.org/html/rfc4880#section-5.2.3.2|RFC4880 5.2.3.2}\n * @param {Integer} type subpacket signature type.\n * @param {String} data data to be included\n * @returns {String} a string-representation of a sub signature packet\n * @private\n */\nfunction write_sub_packet(type, data) {\n var arr = [];\n arr.push(_packet3.default.writeSimpleLength(data.length + 1));\n arr.push(new Uint8Array([type]));\n arr.push(data);\n return _util2.default.concatUint8Array(arr);\n}\n\n// V4 signature sub packets\n\nSignature.prototype.read_sub_packet = function (bytes) {\n var _this2 = this;\n\n var mypos = 0;\n\n var read_array = function read_array(prop, bytes) {\n _this2[prop] = [];\n\n for (var i = 0; i < bytes.length; i++) {\n _this2[prop].push(bytes[i]);\n }\n };\n\n // The leftwost bit denotes a \"critical\" packet, but we ignore it.\n var type = bytes[mypos++] & 0x7F;\n var seconds = void 0;\n\n // subpacket type\n switch (type) {\n case 2:\n // Signature Creation Time\n this.created = _util2.default.readDate(bytes.subarray(mypos, bytes.length));\n break;\n case 3:\n // Signature Expiration Time in seconds\n seconds = _util2.default.readNumber(bytes.subarray(mypos, bytes.length));\n\n this.signatureNeverExpires = seconds === 0;\n this.signatureExpirationTime = seconds;\n\n break;\n case 4:\n // Exportable Certification\n this.exportable = bytes[mypos++] === 1;\n break;\n case 5:\n // Trust Signature\n this.trustLevel = bytes[mypos++];\n this.trustAmount = bytes[mypos++];\n break;\n case 6:\n // Regular Expression\n this.regularExpression = bytes[mypos];\n break;\n case 7:\n // Revocable\n this.revocable = bytes[mypos++] === 1;\n break;\n case 9:\n // Key Expiration Time in seconds\n seconds = _util2.default.readNumber(bytes.subarray(mypos, bytes.length));\n\n this.keyExpirationTime = seconds;\n this.keyNeverExpires = seconds === 0;\n\n break;\n case 11:\n // Preferred Symmetric Algorithms\n read_array('preferredSymmetricAlgorithms', bytes.subarray(mypos, bytes.length));\n break;\n case 12:\n // Revocation Key\n // (1 octet of class, 1 octet of public-key algorithm ID, 20\n // octets of\n // fingerprint)\n this.revocationKeyClass = bytes[mypos++];\n this.revocationKeyAlgorithm = bytes[mypos++];\n this.revocationKeyFingerprint = bytes.subarray(mypos, mypos + 20);\n break;\n\n case 16:\n // Issuer\n this.issuerKeyId.read(bytes.subarray(mypos, bytes.length));\n break;\n\n case 20:\n // Notation Data\n // We don't know how to handle anything but a text flagged data.\n if (bytes[mypos] === 0x80) {\n // We extract key/value tuple from the byte stream.\n mypos += 4;\n var m = _util2.default.readNumber(bytes.subarray(mypos, mypos + 2));\n mypos += 2;\n var n = _util2.default.readNumber(bytes.subarray(mypos, mypos + 2));\n mypos += 2;\n\n var name = _util2.default.Uint8Array_to_str(bytes.subarray(mypos, mypos + m));\n var value = _util2.default.Uint8Array_to_str(bytes.subarray(mypos + m, mypos + m + n));\n\n this.notation = this.notation || {};\n this.notation[name] = value;\n } else {\n _util2.default.print_debug(\"Unsupported notation flag \" + bytes[mypos]);\n }\n break;\n case 21:\n // Preferred Hash Algorithms\n read_array('preferredHashAlgorithms', bytes.subarray(mypos, bytes.length));\n break;\n case 22:\n // Preferred Compression Algorithms\n read_array('preferredCompressionAlgorithms', bytes.subarray(mypos, bytes.length));\n break;\n case 23:\n // Key Server Preferences\n read_array('keyServerPreferences', bytes.subarray(mypos, bytes.length));\n break;\n case 24:\n // Preferred Key Server\n this.preferredKeyServer = _util2.default.Uint8Array_to_str(bytes.subarray(mypos, bytes.length));\n break;\n case 25:\n // Primary User ID\n this.isPrimaryUserID = bytes[mypos++] !== 0;\n break;\n case 26:\n // Policy URI\n this.policyURI = _util2.default.Uint8Array_to_str(bytes.subarray(mypos, bytes.length));\n break;\n case 27:\n // Key Flags\n read_array('keyFlags', bytes.subarray(mypos, bytes.length));\n break;\n case 28:\n // Signer's User ID\n this.signersUserId = _util2.default.Uint8Array_to_str(bytes.subarray(mypos, bytes.length));\n break;\n case 29:\n // Reason for Revocation\n this.reasonForRevocationFlag = bytes[mypos++];\n this.reasonForRevocationString = _util2.default.Uint8Array_to_str(bytes.subarray(mypos, bytes.length));\n break;\n case 30:\n // Features\n read_array('features', bytes.subarray(mypos, bytes.length));\n break;\n case 31:\n {\n // Signature Target\n // (1 octet public-key algorithm, 1 octet hash algorithm, N octets hash)\n this.signatureTargetPublicKeyAlgorithm = bytes[mypos++];\n this.signatureTargetHashAlgorithm = bytes[mypos++];\n\n var len = _crypto2.default.getHashByteLength(this.signatureTargetHashAlgorithm);\n\n this.signatureTargetHash = _util2.default.Uint8Array_to_str(bytes.subarray(mypos, mypos + len));\n break;\n }\n case 32:\n // Embedded Signature\n this.embeddedSignature = new Signature();\n this.embeddedSignature.read(bytes.subarray(mypos, bytes.length));\n break;\n case 33:\n // Issuer Fingerprint\n this.issuerKeyVersion = bytes[mypos++];\n this.issuerFingerprint = bytes.subarray(mypos, bytes.length);\n if (this.issuerKeyVersion === 5) {\n this.issuerKeyId.read(this.issuerFingerprint);\n } else {\n this.issuerKeyId.read(this.issuerFingerprint.subarray(-8));\n }\n break;\n case 34:\n // Preferred AEAD Algorithms\n read_array.call(this, 'preferredAeadAlgorithms', bytes.subarray(mypos, bytes.length));\n break;\n default:\n _util2.default.print_debug(\"Unknown signature subpacket type \" + type + \" @:\" + mypos);\n }\n};\n\n// Produces data to produce signature on\nSignature.prototype.toSign = function (type, data) {\n var t = _enums2.default.signature;\n\n switch (type) {\n case t.binary:\n return data.getBytes();\n\n case t.text:\n {\n var text = data.getText();\n // normalize EOL to \\r\\n\n text = _util2.default.canonicalizeEOL(text);\n // encode UTF8\n return _util2.default.str_to_Uint8Array(_util2.default.encode_utf8(text));\n }\n case t.standalone:\n return new Uint8Array(0);\n\n case t.cert_generic:\n case t.cert_persona:\n case t.cert_casual:\n case t.cert_positive:\n case t.cert_revocation:\n {\n var _packet = void 0;\n var tag = void 0;\n\n if (data.userid !== undefined) {\n tag = 0xB4;\n _packet = data.userid;\n } else if (data.userattribute !== undefined) {\n tag = 0xD1;\n _packet = data.userattribute;\n } else {\n throw new Error('Either a userid or userattribute packet needs to be ' + 'supplied for certification.');\n }\n\n var bytes = _packet.write();\n\n if (this.version === 4) {\n return _util2.default.concatUint8Array([this.toSign(t.key, data), new Uint8Array([tag]), _util2.default.writeNumber(bytes.length, 4), bytes]);\n } else if (this.version === 3) {\n return _util2.default.concatUint8Array([this.toSign(t.key, data), bytes]);\n }\n break;\n }\n case t.subkey_binding:\n case t.subkey_revocation:\n case t.key_binding:\n return _util2.default.concatUint8Array([this.toSign(t.key, data), this.toSign(t.key, {\n key: data.bind\n })]);\n\n case t.key:\n if (data.key === undefined) {\n throw new Error('Key packet is required for this signature.');\n }\n return data.key.writeOld();\n\n case t.key_revocation:\n return this.toSign(t.key, data);\n case t.timestamp:\n return new Uint8Array(0);\n case t.third_party:\n throw new Error('Not implemented');\n default:\n throw new Error('Unknown signature type.');\n }\n};\n\nSignature.prototype.calculateTrailer = function () {\n // calculating the trailer\n // V3 signatures don't have a trailer\n if (this.version === 3) {\n return new Uint8Array(0);\n }\n var first = new Uint8Array([4, 0xFF]); //Version, ?\n return _util2.default.concatUint8Array([first, _util2.default.writeNumber(this.signatureData.length, 4)]);\n};\n\n/**\n * verifys the signature packet. Note: not signature types are implemented\n * @param {String|Object} data data which on the signature applies\n * @param {module:packet.PublicSubkey|module:packet.PublicKey|\n * module:packet.SecretSubkey|module:packet.SecretKey} key the public key to verify the signature\n * @returns {Promise<Boolean>} True if message is verified, else false.\n * @async\n */\nSignature.prototype.verify = function () {\n var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(key, data) {\n var signatureType, publicKeyAlgorithm, hashAlgorithm, bytes, trailer, mpicount, endian, mpi, i, j;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n signatureType = _enums2.default.write(_enums2.default.signature, this.signatureType);\n publicKeyAlgorithm = _enums2.default.write(_enums2.default.publicKey, this.publicKeyAlgorithm);\n hashAlgorithm = _enums2.default.write(_enums2.default.hash, this.hashAlgorithm);\n bytes = this.toSign(signatureType, data);\n trailer = this.calculateTrailer();\n mpicount = 0;\n // Algorithm-Specific Fields for RSA signatures:\n // - multiprecision number (MPI) of RSA signature value m**d mod n.\n\n if (publicKeyAlgorithm > 0 && publicKeyAlgorithm < 4) {\n mpicount = 1;\n\n // Algorithm-Specific Fields for DSA, ECDSA, and EdDSA signatures:\n // - MPI of DSA value r.\n // - MPI of DSA value s.\n } else if (publicKeyAlgorithm === _enums2.default.publicKey.dsa || publicKeyAlgorithm === _enums2.default.publicKey.ecdsa || publicKeyAlgorithm === _enums2.default.publicKey.eddsa) {\n mpicount = 2;\n }\n\n // EdDSA signature parameters are encoded in little-endian format\n // https://tools.ietf.org/html/rfc8032#section-5.1.2\n endian = publicKeyAlgorithm === _enums2.default.publicKey.eddsa ? 'le' : 'be';\n mpi = [];\n i = 0;\n\n for (j = 0; j < mpicount; j++) {\n mpi[j] = new _mpi2.default();\n i += mpi[j].read(this.signature.subarray(i, this.signature.length), endian);\n }\n\n _context2.next = 13;\n return _crypto2.default.signature.verify(publicKeyAlgorithm, hashAlgorithm, mpi, key.params, _util2.default.concatUint8Array([bytes, this.signatureData, trailer]));\n\n case 13:\n this.verified = _context2.sent;\n return _context2.abrupt('return', this.verified);\n\n case 15:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function (_x4, _x5) {\n return _ref4.apply(this, arguments);\n };\n}();\n\n/**\n * Verifies signature expiration date\n * @param {Date} date (optional) use the given date for verification instead of the current time\n * @returns {Boolean} true if expired\n */\nSignature.prototype.isExpired = function () {\n var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Date();\n\n var normDate = _util2.default.normalizeDate(date);\n if (normDate !== null) {\n var expirationTime = this.getExpirationTime();\n return !(this.created <= normDate && normDate < expirationTime);\n }\n return false;\n};\n\n/**\n * Returns the expiration time of the signature or Infinity if signature does not expire\n * @returns {Date} expiration time\n */\nSignature.prototype.getExpirationTime = function () {\n return !this.signatureNeverExpires ? new Date(this.created.getTime() + this.signatureExpirationTime * 1000) : Infinity;\n};\n\n/**\n * Fix custom types after cloning\n */\nSignature.prototype.postCloneTypeFix = function () {\n this.issuerKeyId = _keyid2.default.fromClone(this.issuerKeyId);\n};\n\nexports.default = Signature;\n\n},{\"../crypto\":340,\"../enums\":359,\"../type/keyid.js\":394,\"../type/mpi.js\":395,\"../util\":398,\"./packet\":375,\"babel-runtime/core-js/object/entries\":27,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/helpers/slicedToArray\":40,\"babel-runtime/regenerator\":42}],383:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _promise = _dereq_('babel-runtime/core-js/promise');\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _config = _dereq_('../config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _crypto = _dereq_('../crypto');\n\nvar _crypto2 = _interopRequireDefault(_crypto);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2016 Tankred Hase\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires config\n * @requires crypto\n * @requires enums\n * @requires util\n */\n\nvar VERSION = 1; // A one-octet version number of the data packet.\n\n/**\n * Implementation of the Symmetrically Encrypted Authenticated Encryption with\n * Additional Data (AEAD) Protected Data Packet\n *\n * {@link https://tools.ietf.org/html/draft-ford-openpgp-format-00#section-2.1}:\n * AEAD Protected Data Packet\n * @memberof module:packet\n * @constructor\n */\nfunction SymEncryptedAEADProtected() {\n this.tag = _enums2.default.packet.symEncryptedAEADProtected;\n this.version = VERSION;\n this.cipherAlgo = null;\n this.aeadAlgorithm = 'eax';\n this.aeadAlgo = null;\n this.chunkSizeByte = null;\n this.iv = null;\n this.encrypted = null;\n this.packets = null;\n}\n\nexports.default = SymEncryptedAEADProtected;\n\n/**\n * Parse an encrypted payload of bytes in the order: version, IV, ciphertext (see specification)\n */\n\nSymEncryptedAEADProtected.prototype.read = function (bytes) {\n var offset = 0;\n if (bytes[offset] !== VERSION) {\n // The only currently defined value is 1.\n throw new Error('Invalid packet version.');\n }\n offset++;\n if (_config2.default.aead_protect_version === 4) {\n this.cipherAlgo = bytes[offset++];\n this.aeadAlgo = bytes[offset++];\n this.chunkSizeByte = bytes[offset++];\n } else {\n this.aeadAlgo = _enums2.default.aead.experimental_gcm;\n }\n var mode = _crypto2.default[_enums2.default.read(_enums2.default.aead, this.aeadAlgo)];\n this.iv = bytes.subarray(offset, mode.ivLength + offset);\n offset += mode.ivLength;\n this.encrypted = bytes.subarray(offset, bytes.length);\n};\n\n/**\n * Write the encrypted payload of bytes in the order: version, IV, ciphertext (see specification)\n * @returns {Uint8Array} The encrypted payload\n */\nSymEncryptedAEADProtected.prototype.write = function () {\n if (_config2.default.aead_protect_version === 4) {\n return _util2.default.concatUint8Array([new Uint8Array([this.version, this.cipherAlgo, this.aeadAlgo, this.chunkSizeByte]), this.iv, this.encrypted]);\n }\n return _util2.default.concatUint8Array([new Uint8Array([this.version]), this.iv, this.encrypted]);\n};\n\n/**\n * Decrypt the encrypted payload.\n * @param {String} sessionKeyAlgorithm The session key's cipher algorithm e.g. 'aes128'\n * @param {Uint8Array} key The session key used to encrypt the payload\n * @returns {Promise<Boolean>}\n * @async\n */\nSymEncryptedAEADProtected.prototype.decrypt = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(sessionKeyAlgorithm, key) {\n var mode, data, authTag;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n mode = _crypto2.default[_enums2.default.read(_enums2.default.aead, this.aeadAlgo)];\n\n if (!(_config2.default.aead_protect_version === 4)) {\n _context.next = 11;\n break;\n }\n\n data = this.encrypted.subarray(0, -mode.tagLength);\n authTag = this.encrypted.subarray(-mode.tagLength);\n _context.t0 = this.packets;\n _context.next = 7;\n return this.crypt('decrypt', key, data, authTag);\n\n case 7:\n _context.t1 = _context.sent;\n\n _context.t0.read.call(_context.t0, _context.t1);\n\n _context.next = 17;\n break;\n\n case 11:\n this.cipherAlgo = _enums2.default.write(_enums2.default.symmetric, sessionKeyAlgorithm);\n _context.t2 = this.packets;\n _context.next = 15;\n return this.crypt('decrypt', key, this.encrypted);\n\n case 15:\n _context.t3 = _context.sent;\n\n _context.t2.read.call(_context.t2, _context.t3);\n\n case 17:\n return _context.abrupt('return', true);\n\n case 18:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function (_x, _x2) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Encrypt the packet list payload.\n * @param {String} sessionKeyAlgorithm The session key's cipher algorithm e.g. 'aes128'\n * @param {Uint8Array} key The session key used to encrypt the payload\n * @returns {Promise<Boolean>}\n * @async\n */\nSymEncryptedAEADProtected.prototype.encrypt = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(sessionKeyAlgorithm, key) {\n var mode, data;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n this.cipherAlgo = _enums2.default.write(_enums2.default.symmetric, sessionKeyAlgorithm);\n this.aeadAlgo = _config2.default.aead_protect_version === 4 ? _enums2.default.write(_enums2.default.aead, this.aeadAlgorithm) : _enums2.default.aead.experimental_gcm;\n mode = _crypto2.default[_enums2.default.read(_enums2.default.aead, this.aeadAlgo)];\n _context2.next = 5;\n return _crypto2.default.random.getRandomBytes(mode.ivLength);\n\n case 5:\n this.iv = _context2.sent;\n // generate new random IV\n this.chunkSizeByte = _config2.default.aead_chunk_size_byte;\n data = this.packets.write();\n _context2.next = 10;\n return this.crypt('encrypt', key, data, data.subarray(0, 0));\n\n case 10:\n this.encrypted = _context2.sent;\n\n case 11:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function (_x3, _x4) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n/**\n * En/decrypt the payload.\n * @param {encrypt|decrypt} fn Whether to encrypt or decrypt\n * @param {Uint8Array} key The session key used to en/decrypt the payload\n * @param {Uint8Array} data The data to en/decrypt\n * @param {Uint8Array} finalChunk For encryption: empty final chunk; for decryption: final authentication tag\n * @returns {Promise<Uint8Array>}\n * @async\n */\nSymEncryptedAEADProtected.prototype.crypt = function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(fn, key, data, finalChunk) {\n var cipher, mode, modeInstance, tagLengthIfDecrypting, chunkSize, adataBuffer, adataArray, adataTagArray, adataView, chunkIndexArray, cryptedPromises, chunkIndex;\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n cipher = _enums2.default.read(_enums2.default.symmetric, this.cipherAlgo);\n mode = _crypto2.default[_enums2.default.read(_enums2.default.aead, this.aeadAlgo)];\n _context3.next = 4;\n return mode(cipher, key);\n\n case 4:\n modeInstance = _context3.sent;\n\n if (!(_config2.default.aead_protect_version === 4)) {\n _context3.next = 25;\n break;\n }\n\n tagLengthIfDecrypting = fn === 'decrypt' ? mode.tagLength : 0;\n chunkSize = Math.pow(2, this.chunkSizeByte + 6) + tagLengthIfDecrypting; // ((uint64_t)1 << (c + 6))\n\n adataBuffer = new ArrayBuffer(21);\n adataArray = new Uint8Array(adataBuffer, 0, 13);\n adataTagArray = new Uint8Array(adataBuffer);\n adataView = new DataView(adataBuffer);\n chunkIndexArray = new Uint8Array(adataBuffer, 5, 8);\n\n adataArray.set([0xC0 | this.tag, this.version, this.cipherAlgo, this.aeadAlgo, this.chunkSizeByte], 0);\n adataView.setInt32(13 + 4, data.length - tagLengthIfDecrypting * Math.ceil(data.length / chunkSize)); // Should be setInt64(13, ...)\n cryptedPromises = [];\n\n for (chunkIndex = 0; chunkIndex === 0 || data.length;) {\n cryptedPromises.push(modeInstance[fn](data.subarray(0, chunkSize), mode.getNonce(this.iv, chunkIndexArray), adataArray));\n // We take a chunk of data, en/decrypt it, and shift `data` to the\n // next chunk.\n data = data.subarray(chunkSize);\n adataView.setInt32(5 + 4, ++chunkIndex); // Should be setInt64(5, ...)\n }\n // After the final chunk, we either encrypt a final, empty data\n // chunk to get the final authentication tag or validate that final\n // authentication tag.\n cryptedPromises.push(modeInstance[fn](finalChunk, mode.getNonce(this.iv, chunkIndexArray), adataTagArray));\n _context3.t0 = _util2.default;\n _context3.next = 21;\n return _promise2.default.all(cryptedPromises);\n\n case 21:\n _context3.t1 = _context3.sent;\n return _context3.abrupt('return', _context3.t0.concatUint8Array.call(_context3.t0, _context3.t1));\n\n case 25:\n return _context3.abrupt('return', modeInstance[fn](data, this.iv));\n\n case 26:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n return function (_x5, _x6, _x7, _x8) {\n return _ref3.apply(this, arguments);\n };\n}();\n\n},{\"../config\":325,\"../crypto\":340,\"../enums\":359,\"../util\":398,\"babel-runtime/core-js/promise\":32,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],384:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _exports = _dereq_('asmcrypto.js/src/aes/cfb/exports');\n\nvar _crypto = _dereq_('../crypto');\n\nvar _crypto2 = _interopRequireDefault(_crypto);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires asmcrypto.js\n * @requires crypto\n * @requires enums\n * @requires util\n */\n\nvar nodeCrypto = _util2.default.getNodeCrypto();\nvar Buffer = _util2.default.getNodeBuffer();\n\nvar VERSION = 1; // A one-octet version number of the data packet.\n\n/**\n * Implementation of the Sym. Encrypted Integrity Protected Data Packet (Tag 18)\n *\n * {@link https://tools.ietf.org/html/rfc4880#section-5.13|RFC4880 5.13}:\n * The Symmetrically Encrypted Integrity Protected Data packet is\n * a variant of the Symmetrically Encrypted Data packet. It is a new feature\n * created for OpenPGP that addresses the problem of detecting a modification to\n * encrypted data. It is used in combination with a Modification Detection Code\n * packet.\n * @memberof module:packet\n * @constructor\n */\nfunction SymEncryptedIntegrityProtected() {\n this.tag = _enums2.default.packet.symEncryptedIntegrityProtected;\n this.version = VERSION;\n /** The encrypted payload. */\n this.encrypted = null; // string\n /**\n * If after decrypting the packet this is set to true,\n * a modification has been detected and thus the contents\n * should be discarded.\n * @type {Boolean}\n */\n this.modification = false;\n this.packets = null;\n}\n\nSymEncryptedIntegrityProtected.prototype.read = function (bytes) {\n // - A one-octet version number. The only currently defined value is 1.\n if (bytes[0] !== VERSION) {\n throw new Error('Invalid packet version.');\n }\n\n // - Encrypted data, the output of the selected symmetric-key cipher\n // operating in Cipher Feedback mode with shift amount equal to the\n // block size of the cipher (CFB-n where n is the block size).\n this.encrypted = bytes.subarray(1, bytes.length);\n};\n\nSymEncryptedIntegrityProtected.prototype.write = function () {\n return _util2.default.concatUint8Array([new Uint8Array([VERSION]), this.encrypted]);\n};\n\n/**\n * Encrypt the payload in the packet.\n * @param {String} sessionKeyAlgorithm The selected symmetric encryption algorithm to be used e.g. 'aes128'\n * @param {Uint8Array} key The key of cipher blocksize length to be used\n * @returns {Promise<Boolean>}\n * @async\n */\nSymEncryptedIntegrityProtected.prototype.encrypt = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(sessionKeyAlgorithm, key) {\n var bytes, prefixrandom, repeat, prefix, mdc, tohash, hash;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n bytes = this.packets.write();\n _context.next = 3;\n return _crypto2.default.getPrefixRandom(sessionKeyAlgorithm);\n\n case 3:\n prefixrandom = _context.sent;\n repeat = new Uint8Array([prefixrandom[prefixrandom.length - 2], prefixrandom[prefixrandom.length - 1]]);\n prefix = _util2.default.concatUint8Array([prefixrandom, repeat]);\n mdc = new Uint8Array([0xD3, 0x14]); // modification detection code packet\n\n tohash = _util2.default.concatUint8Array([bytes, mdc]);\n hash = _crypto2.default.hash.sha1(_util2.default.concatUint8Array([prefix, tohash]));\n\n tohash = _util2.default.concatUint8Array([tohash, hash]);\n\n if (sessionKeyAlgorithm.substr(0, 3) === 'aes') {\n // AES optimizations. Native code for node, asmCrypto for browser.\n this.encrypted = aesEncrypt(sessionKeyAlgorithm, prefix, tohash, key);\n } else {\n this.encrypted = _crypto2.default.cfb.encrypt(prefixrandom, sessionKeyAlgorithm, tohash, key, false);\n this.encrypted = this.encrypted.subarray(0, prefix.length + tohash.length);\n }\n return _context.abrupt('return', true);\n\n case 12:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function (_x, _x2) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Decrypts the encrypted data contained in the packet.\n * @param {String} sessionKeyAlgorithm The selected symmetric encryption algorithm to be used e.g. 'aes128'\n * @param {Uint8Array} key The key of cipher blocksize length to be used\n * @returns {Promise<Boolean>}\n * @async\n */\nSymEncryptedIntegrityProtected.prototype.decrypt = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(sessionKeyAlgorithm, key) {\n var decrypted, prefix, bytes, tohash, mdc;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n decrypted = void 0;\n\n if (sessionKeyAlgorithm.substr(0, 3) === 'aes') {\n // AES optimizations. Native code for node, asmCrypto for browser.\n decrypted = aesDecrypt(sessionKeyAlgorithm, this.encrypted, key);\n } else {\n decrypted = _crypto2.default.cfb.decrypt(sessionKeyAlgorithm, key, this.encrypted, false);\n }\n\n // there must be a modification detection code packet as the\n // last packet and everything gets hashed except the hash itself\n prefix = _crypto2.default.cfb.mdc(sessionKeyAlgorithm, key, this.encrypted);\n bytes = decrypted.subarray(0, decrypted.length - 20);\n tohash = _util2.default.concatUint8Array([prefix, bytes]);\n\n this.hash = _util2.default.Uint8Array_to_str(_crypto2.default.hash.sha1(tohash));\n mdc = _util2.default.Uint8Array_to_str(decrypted.subarray(decrypted.length - 20, decrypted.length));\n\n if (!(this.hash !== mdc)) {\n _context2.next = 11;\n break;\n }\n\n throw new Error('Modification detected.');\n\n case 11:\n this.packets.read(decrypted.subarray(0, decrypted.length - 22));\n\n case 12:\n return _context2.abrupt('return', true);\n\n case 13:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function (_x3, _x4) {\n return _ref2.apply(this, arguments);\n };\n}();\n\nexports.default = SymEncryptedIntegrityProtected;\n\n//////////////////////////\n// //\n// Helper functions //\n// //\n//////////////////////////\n\n\nfunction aesEncrypt(algo, prefix, pt, key) {\n if (nodeCrypto) {\n // Node crypto library.\n return nodeEncrypt(algo, prefix, pt, key);\n } // asm.js fallback\n return _exports.AES_CFB.encrypt(_util2.default.concatUint8Array([prefix, pt]), key);\n}\n\nfunction aesDecrypt(algo, ct, key) {\n var pt = void 0;\n if (nodeCrypto) {\n // Node crypto library.\n pt = nodeDecrypt(algo, ct, key);\n } else {\n // asm.js fallback\n pt = _exports.AES_CFB.decrypt(ct, key);\n }\n return pt.subarray(_crypto2.default.cipher[algo].blockSize + 2, pt.length); // Remove random prefix\n}\n\nfunction nodeEncrypt(algo, prefix, pt, key) {\n key = new Buffer(key);\n var iv = new Buffer(new Uint8Array(_crypto2.default.cipher[algo].blockSize));\n var cipherObj = new nodeCrypto.createCipheriv('aes-' + algo.substr(3, 3) + '-cfb', key, iv);\n var ct = cipherObj.update(new Buffer(_util2.default.concatUint8Array([prefix, pt])));\n return new Uint8Array(ct);\n}\n\nfunction nodeDecrypt(algo, ct, key) {\n ct = new Buffer(ct);\n key = new Buffer(key);\n var iv = new Buffer(new Uint8Array(_crypto2.default.cipher[algo].blockSize));\n var decipherObj = new nodeCrypto.createDecipheriv('aes-' + algo.substr(3, 3) + '-cfb', key, iv);\n var pt = decipherObj.update(ct);\n return new Uint8Array(pt);\n}\n\n},{\"../crypto\":340,\"../enums\":359,\"../util\":398,\"asmcrypto.js/src/aes/cfb/exports\":7,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],385:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _s2k = _dereq_('../type/s2k');\n\nvar _s2k2 = _interopRequireDefault(_s2k);\n\nvar _config = _dereq_('../config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _crypto = _dereq_('../crypto');\n\nvar _crypto2 = _interopRequireDefault(_crypto);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Public-Key Encrypted Session Key Packets (Tag 1)\n *\n * {@link https://tools.ietf.org/html/rfc4880#section-5.1|RFC4880 5.1}:\n * A Public-Key Encrypted Session Key packet holds the session key\n * used to encrypt a message. Zero or more Public-Key Encrypted Session Key\n * packets and/or Symmetric-Key Encrypted Session Key packets may precede a\n * Symmetrically Encrypted Data Packet, which holds an encrypted message. The\n * message is encrypted with the session key, and the session key is itself\n * encrypted and stored in the Encrypted Session Key packet(s). The\n * Symmetrically Encrypted Data Packet is preceded by one Public-Key Encrypted\n * Session Key packet for each OpenPGP key to which the message is encrypted.\n * The recipient of the message finds a session key that is encrypted to their\n * public key, decrypts the session key, and then uses the session key to\n * decrypt the message.\n * @memberof module:packet\n * @constructor\n */\nfunction SymEncryptedSessionKey() {\n this.tag = _enums2.default.packet.symEncryptedSessionKey;\n this.version = _config2.default.aead_protect && _config2.default.aead_protect_version === 4 ? 5 : 4;\n this.sessionKey = null;\n this.sessionKeyEncryptionAlgorithm = null;\n this.sessionKeyAlgorithm = 'aes256';\n this.aeadAlgorithm = _enums2.default.read(_enums2.default.aead, _config2.default.aead_mode);\n this.encrypted = null;\n this.s2k = null;\n this.iv = null;\n}\n\n/**\n * Parsing function for a symmetric encrypted session key packet (tag 3).\n *\n * @param {Uint8Array} input Payload of a tag 1 packet\n * @param {Integer} position Position to start reading from the input string\n * @param {Integer} len\n * Length of the packet or the remaining length of\n * input at position\n * @returns {module:packet.SymEncryptedSessionKey} Object representation\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires type/s2k\n * @requires config\n * @requires crypto\n * @requires enums\n * @requires util\n */\n\nSymEncryptedSessionKey.prototype.read = function (bytes) {\n var offset = 0;\n\n // A one-octet version number. The only currently defined version is 4.\n this.version = bytes[offset++];\n\n // A one-octet number describing the symmetric algorithm used.\n var algo = _enums2.default.read(_enums2.default.symmetric, bytes[offset++]);\n\n if (this.version === 5) {\n // A one-octet AEAD algorithm.\n this.aeadAlgorithm = _enums2.default.read(_enums2.default.aead, bytes[offset++]);\n }\n\n // A string-to-key (S2K) specifier, length as defined above.\n this.s2k = new _s2k2.default();\n offset += this.s2k.read(bytes.subarray(offset, bytes.length));\n\n if (this.version === 5) {\n var mode = _crypto2.default[this.aeadAlgorithm];\n\n // A starting initialization vector of size specified by the AEAD\n // algorithm.\n this.iv = bytes.subarray(offset, offset += mode.ivLength);\n }\n\n // The encrypted session key itself, which is decrypted with the\n // string-to-key object. This is optional in version 4.\n if (this.version === 5 || offset < bytes.length) {\n this.encrypted = bytes.subarray(offset, bytes.length);\n this.sessionKeyEncryptionAlgorithm = algo;\n } else {\n this.sessionKeyAlgorithm = algo;\n }\n};\n\nSymEncryptedSessionKey.prototype.write = function () {\n var algo = this.encrypted === null ? this.sessionKeyAlgorithm : this.sessionKeyEncryptionAlgorithm;\n\n var bytes = void 0;\n\n if (this.version === 5) {\n bytes = _util2.default.concatUint8Array([new Uint8Array([this.version, _enums2.default.write(_enums2.default.symmetric, algo), _enums2.default.write(_enums2.default.aead, this.aeadAlgorithm)]), this.s2k.write(), this.iv, this.encrypted]);\n } else {\n bytes = _util2.default.concatUint8Array([new Uint8Array([this.version, _enums2.default.write(_enums2.default.symmetric, algo)]), this.s2k.write()]);\n\n if (this.encrypted !== null) {\n bytes = _util2.default.concatUint8Array([bytes, this.encrypted]);\n }\n }\n\n return bytes;\n};\n\n/**\n * Decrypts the session key\n * @param {String} passphrase The passphrase in string form\n * @returns {Promise<Boolean>}\n * @async\n */\nSymEncryptedSessionKey.prototype.decrypt = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(passphrase) {\n var algo, length, key, mode, adata, modeInstance, decrypted;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n algo = this.sessionKeyEncryptionAlgorithm !== null ? this.sessionKeyEncryptionAlgorithm : this.sessionKeyAlgorithm;\n length = _crypto2.default.cipher[algo].keySize;\n key = this.s2k.produce_key(passphrase, length);\n\n if (!(this.version === 5)) {\n _context.next = 14;\n break;\n }\n\n mode = _crypto2.default[this.aeadAlgorithm];\n adata = new Uint8Array([0xC0 | this.tag, this.version, _enums2.default.write(_enums2.default.symmetric, this.sessionKeyEncryptionAlgorithm), _enums2.default.write(_enums2.default.aead, this.aeadAlgorithm)]);\n _context.next = 8;\n return mode(algo, key);\n\n case 8:\n modeInstance = _context.sent;\n _context.next = 11;\n return modeInstance.decrypt(this.encrypted, this.iv, adata);\n\n case 11:\n this.sessionKey = _context.sent;\n _context.next = 15;\n break;\n\n case 14:\n if (this.encrypted !== null) {\n decrypted = _crypto2.default.cfb.normalDecrypt(algo, key, this.encrypted, null);\n\n\n this.sessionKeyAlgorithm = _enums2.default.read(_enums2.default.symmetric, decrypted[0]);\n this.sessionKey = decrypted.subarray(1, decrypted.length);\n } else {\n this.sessionKey = key;\n }\n\n case 15:\n return _context.abrupt('return', true);\n\n case 16:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Encrypts the session key\n * @param {String} passphrase The passphrase in string form\n * @returns {Promise<Boolean>}\n * @async\n */\nSymEncryptedSessionKey.prototype.encrypt = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(passphrase) {\n var algo, length, key, mode, adata, modeInstance, algo_enum, private_key;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n algo = this.sessionKeyEncryptionAlgorithm !== null ? this.sessionKeyEncryptionAlgorithm : this.sessionKeyAlgorithm;\n\n\n this.sessionKeyEncryptionAlgorithm = algo;\n\n this.s2k = new _s2k2.default();\n _context2.next = 5;\n return _crypto2.default.random.getRandomBytes(8);\n\n case 5:\n this.s2k.salt = _context2.sent;\n length = _crypto2.default.cipher[algo].keySize;\n key = this.s2k.produce_key(passphrase, length);\n\n if (!(this.sessionKey === null)) {\n _context2.next = 12;\n break;\n }\n\n _context2.next = 11;\n return _crypto2.default.generateSessionKey(this.sessionKeyAlgorithm);\n\n case 11:\n this.sessionKey = _context2.sent;\n\n case 12:\n if (!(this.version === 5)) {\n _context2.next = 26;\n break;\n }\n\n mode = _crypto2.default[this.aeadAlgorithm];\n _context2.next = 16;\n return _crypto2.default.random.getRandomBytes(mode.ivLength);\n\n case 16:\n this.iv = _context2.sent;\n // generate new random IV\n adata = new Uint8Array([0xC0 | this.tag, this.version, _enums2.default.write(_enums2.default.symmetric, this.sessionKeyEncryptionAlgorithm), _enums2.default.write(_enums2.default.aead, this.aeadAlgorithm)]);\n _context2.next = 20;\n return mode(algo, key);\n\n case 20:\n modeInstance = _context2.sent;\n _context2.next = 23;\n return modeInstance.encrypt(this.sessionKey, this.iv, adata);\n\n case 23:\n this.encrypted = _context2.sent;\n _context2.next = 29;\n break;\n\n case 26:\n algo_enum = new Uint8Array([_enums2.default.write(_enums2.default.symmetric, this.sessionKeyAlgorithm)]);\n private_key = _util2.default.concatUint8Array([algo_enum, this.sessionKey]);\n\n this.encrypted = _crypto2.default.cfb.normalEncrypt(algo, key, private_key, null);\n\n case 29:\n return _context2.abrupt('return', true);\n\n case 30:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function (_x2) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n/**\n * Fix custom types after cloning\n */\nSymEncryptedSessionKey.prototype.postCloneTypeFix = function () {\n this.s2k = _s2k2.default.fromClone(this.s2k);\n};\n\nexports.default = SymEncryptedSessionKey;\n\n},{\"../config\":325,\"../crypto\":340,\"../enums\":359,\"../type/s2k\":397,\"../util\":398,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],386:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _config = _dereq_('../config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _crypto = _dereq_('../crypto');\n\nvar _crypto2 = _interopRequireDefault(_crypto);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Implementation of the Symmetrically Encrypted Data Packet (Tag 9)\n *\n * {@link https://tools.ietf.org/html/rfc4880#section-5.7|RFC4880 5.7}:\n * The Symmetrically Encrypted Data packet contains data encrypted with a\n * symmetric-key algorithm. When it has been decrypted, it contains other\n * packets (usually a literal data packet or compressed data packet, but in\n * theory other Symmetrically Encrypted Data packets or sequences of packets\n * that form whole OpenPGP messages).\n * @memberof module:packet\n * @constructor\n */\nfunction SymmetricallyEncrypted() {\n /**\n * Packet type\n * @type {module:enums.packet}\n */\n this.tag = _enums2.default.packet.symmetricallyEncrypted;\n /**\n * Encrypted secret-key data\n */\n this.encrypted = null;\n /**\n * Decrypted packets contained within.\n * @type {module:packet.List}\n */\n this.packets = null;\n /**\n * When true, decrypt fails if message is not integrity protected\n * @see module:config.ignore_mdc_error\n */\n this.ignore_mdc_error = _config2.default.ignore_mdc_error;\n} // GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires config\n * @requires crypto\n * @requires enums\n */\n\nSymmetricallyEncrypted.prototype.read = function (bytes) {\n this.encrypted = bytes;\n};\n\nSymmetricallyEncrypted.prototype.write = function () {\n return this.encrypted;\n};\n\n/**\n * Decrypt the symmetrically-encrypted packet data\n * See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2} for algorithms.\n * @param {module:enums.symmetric} sessionKeyAlgorithm Symmetric key algorithm to use\n * @param {Uint8Array} key The key of cipher blocksize length to be used\n * @returns {Promise<Boolean>}\n * @async\n */\nSymmetricallyEncrypted.prototype.decrypt = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(sessionKeyAlgorithm, key) {\n var decrypted;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n decrypted = _crypto2.default.cfb.decrypt(sessionKeyAlgorithm, key, this.encrypted, true);\n // If MDC errors are not being ignored, all missing MDC packets in symmetrically encrypted data should throw an error\n\n if (this.ignore_mdc_error) {\n _context.next = 3;\n break;\n }\n\n throw new Error('Decryption failed due to missing MDC.');\n\n case 3:\n this.packets.read(decrypted);\n\n return _context.abrupt('return', true);\n\n case 5:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function (_x, _x2) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Encrypt the symmetrically-encrypted packet data\n * See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2} for algorithms.\n * @param {module:enums.symmetric} sessionKeyAlgorithm Symmetric key algorithm to use\n * @param {Uint8Array} key The key of cipher blocksize length to be used\n * @returns {Promise<Boolean>}\n * @async\n */\nSymmetricallyEncrypted.prototype.encrypt = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(algo, key) {\n var data;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n data = this.packets.write();\n _context2.t0 = _crypto2.default.cfb;\n _context2.next = 4;\n return _crypto2.default.getPrefixRandom(algo);\n\n case 4:\n _context2.t1 = _context2.sent;\n _context2.t2 = algo;\n _context2.t3 = data;\n _context2.t4 = key;\n this.encrypted = _context2.t0.encrypt.call(_context2.t0, _context2.t1, _context2.t2, _context2.t3, _context2.t4, true);\n return _context2.abrupt('return', true);\n\n case 10:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function (_x3, _x4) {\n return _ref2.apply(this, arguments);\n };\n}();\n\nexports.default = SymmetricallyEncrypted;\n\n},{\"../config\":325,\"../crypto\":340,\"../enums\":359,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}],387:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Implementation of the Trust Packet (Tag 12)\n *\n * {@link https://tools.ietf.org/html/rfc4880#section-5.10|RFC4880 5.10}:\n * The Trust packet is used only within keyrings and is not normally\n * exported. Trust packets contain data that record the user's\n * specifications of which key holders are trustworthy introducers,\n * along with other information that implementing software uses for\n * trust information. The format of Trust packets is defined by a given\n * implementation.\n *\n * Trust packets SHOULD NOT be emitted to output streams that are\n * transferred to other users, and they SHOULD be ignored on any input\n * other than local keyring files.\n * @memberof module:packet\n * @constructor\n */\nfunction Trust() {\n this.tag = _enums2.default.packet.trust;\n}\n\n/**\n * Parsing function for a trust packet (tag 12).\n * Currently not implemented as we ignore trust packets\n * @param {String} byptes payload of a tag 12 packet\n */\n/**\n * @requires enums\n */\n\nTrust.prototype.read = function () {}; // TODO\n\nexports.default = Trust;\n\n},{\"../enums\":359}],388:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _packet = _dereq_('./packet');\n\nvar _packet2 = _interopRequireDefault(_packet);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Implementation of the User Attribute Packet (Tag 17)\n *\n * The User Attribute packet is a variation of the User ID packet. It\n * is capable of storing more types of data than the User ID packet,\n * which is limited to text. Like the User ID packet, a User Attribute\n * packet may be certified by the key owner (\"self-signed\") or any other\n * key owner who cares to certify it. Except as noted, a User Attribute\n * packet may be used anywhere that a User ID packet may be used.\n *\n * While User Attribute packets are not a required part of the OpenPGP\n * standard, implementations SHOULD provide at least enough\n * compatibility to properly handle a certification signature on the\n * User Attribute packet. A simple way to do this is by treating the\n * User Attribute packet as a User ID packet with opaque contents, but\n * an implementation may use any method desired.\n * @memberof module:packet\n * @constructor\n */\nfunction UserAttribute() {\n this.tag = _enums2.default.packet.userAttribute;\n this.attributes = [];\n}\n\n/**\n * parsing function for a user attribute packet (tag 17).\n * @param {Uint8Array} input payload of a tag 17 packet\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires packet\n * @requires enums\n * @requires util\n */\n\nUserAttribute.prototype.read = function (bytes) {\n var i = 0;\n while (i < bytes.length) {\n var len = _packet2.default.readSimpleLength(bytes.subarray(i, bytes.length));\n i += len.offset;\n\n this.attributes.push(_util2.default.Uint8Array_to_str(bytes.subarray(i, i + len.len)));\n i += len.len;\n }\n};\n\n/**\n * Creates a binary representation of the user attribute packet\n * @returns {Uint8Array} string representation\n */\nUserAttribute.prototype.write = function () {\n var arr = [];\n for (var i = 0; i < this.attributes.length; i++) {\n arr.push(_packet2.default.writeSimpleLength(this.attributes[i].length));\n arr.push(_util2.default.str_to_Uint8Array(this.attributes[i]));\n }\n return _util2.default.concatUint8Array(arr);\n};\n\n/**\n * Compare for equality\n * @param {module:packet.UserAttribute} usrAttr\n * @returns {Boolean} true if equal\n */\nUserAttribute.prototype.equals = function (usrAttr) {\n if (!usrAttr || !(usrAttr instanceof UserAttribute)) {\n return false;\n }\n return this.attributes.every(function (attr, index) {\n return attr === usrAttr.attributes[index];\n });\n};\n\nexports.default = UserAttribute;\n\n},{\"../enums\":359,\"../util\":398,\"./packet\":375}],389:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _assign = _dereq_('babel-runtime/core-js/object/assign');\n\nvar _assign2 = _interopRequireDefault(_assign);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Implementation of the User ID Packet (Tag 13)\n *\n * A User ID packet consists of UTF-8 text that is intended to represent\n * the name and email address of the key holder. By convention, it\n * includes an RFC 2822 [RFC2822] mail name-addr, but there are no\n * restrictions on its content. The packet length in the header\n * specifies the length of the User ID.\n * @memberof module:packet\n * @constructor\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires enums\n * @requires util\n */\n\nfunction Userid() {\n this.tag = _enums2.default.packet.userid;\n /** A string containing the user id. Usually in the form\n * John Doe <john@example.com>\n * @type {String}\n */\n this.userid = '';\n\n this.name = '';\n this.email = '';\n this.comment = '';\n}\n\n/**\n * Parsing function for a user id packet (tag 13).\n * @param {Uint8Array} input payload of a tag 13 packet\n */\nUserid.prototype.read = function (bytes) {\n this.parse(_util2.default.decode_utf8(_util2.default.Uint8Array_to_str(bytes)));\n};\n\n/**\n * Parse userid string, e.g. 'John Doe <john@example.com>'\n */\nUserid.prototype.parse = function (userid) {\n try {\n (0, _assign2.default)(this, _util2.default.parseUserId(userid));\n } catch (e) {}\n this.userid = userid;\n};\n\n/**\n * Creates a binary representation of the user id packet\n * @returns {Uint8Array} binary representation\n */\nUserid.prototype.write = function () {\n return _util2.default.str_to_Uint8Array(_util2.default.encode_utf8(this.userid));\n};\n\n/**\n * Set userid string from object, e.g. { name:'Phil Zimmermann', email:'phil@openpgp.org' }\n */\nUserid.prototype.format = function (userid) {\n if (_util2.default.isString(userid)) {\n userid = _util2.default.parseUserId(userid);\n }\n (0, _assign2.default)(this, userid);\n this.userid = _util2.default.formatUserId(userid);\n};\n\nexports.default = Userid;\n\n},{\"../enums\":359,\"../util\":398,\"babel-runtime/core-js/object/assign\":24}],390:[function(_dereq_,module,exports){\n'use strict';\n\nvar _assign = _dereq_('babel-runtime/core-js/object/assign');\n\nvar _assign2 = _interopRequireDefault(_assign);\n\nvar _symbol = _dereq_('babel-runtime/core-js/symbol');\n\nvar _symbol2 = _interopRequireDefault(_symbol);\n\nvar _from = _dereq_('babel-runtime/core-js/array/from');\n\nvar _from2 = _interopRequireDefault(_from);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable import/no-extraneous-dependencies */\n// Old browser polyfills\n// All are listed as dev dependencies because Node does not need them\n// and for browser babel will take care of it\n\nif (typeof window.fetch === 'undefined') {\n _dereq_('whatwg-fetch');\n}\nif (typeof Array.prototype.fill === 'undefined') {\n _dereq_('core-js/fn/array/fill');\n}\nif (typeof Array.prototype.find === 'undefined') {\n _dereq_('core-js/fn/array/find');\n}\nif (typeof _from2.default === 'undefined') {\n _dereq_('core-js/fn/array/from');\n}\n\n// No if-statement on Promise because of IE11. Otherwise Promise is undefined in the service worker.\n_dereq_('core-js/fn/promise');\n\nif (typeof Uint8Array.from === 'undefined') {\n _dereq_('core-js/fn/typed/uint8-array');\n}\nif (typeof String.prototype.repeat === 'undefined') {\n _dereq_('core-js/fn/string/repeat');\n}\nif (typeof _symbol2.default === 'undefined') {\n _dereq_('core-js/fn/symbol');\n}\nif (typeof _assign2.default === 'undefined') {\n _dereq_('core-js/fn/object/assign');\n}\n\n},{\"babel-runtime/core-js/array/from\":20,\"babel-runtime/core-js/object/assign\":24,\"babel-runtime/core-js/symbol\":33,\"core-js/fn/array/fill\":48,\"core-js/fn/array/find\":49,\"core-js/fn/array/from\":50,\"core-js/fn/object/assign\":51,\"core-js/fn/promise\":52,\"core-js/fn/string/repeat\":53,\"core-js/fn/symbol\":54,\"core-js/fn/typed/uint8-array\":55,\"whatwg-fetch\":321}],391:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Signature = Signature;\nexports.readArmored = readArmored;\nexports.read = read;\n\nvar _armor = _dereq_('./encoding/armor');\n\nvar _armor2 = _interopRequireDefault(_armor);\n\nvar _packet = _dereq_('./packet');\n\nvar _packet2 = _interopRequireDefault(_packet);\n\nvar _enums = _dereq_('./enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @class\n * @classdesc Class that represents an OpenPGP signature.\n * @param {module:packet.List} packetlist The signature packets\n */\nfunction Signature(packetlist) {\n if (!(this instanceof Signature)) {\n return new Signature(packetlist);\n }\n this.packets = packetlist || new _packet2.default.List();\n}\n\n/**\n * Returns ASCII armored text of signature\n * @returns {String} ASCII armor\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @requires encoding/armor\n * @requires packet\n * @requires enums\n * @module signature\n */\n\nSignature.prototype.armor = function () {\n return _armor2.default.encode(_enums2.default.armor.signature, this.packets.write());\n};\n\n/**\n * reads an OpenPGP armored signature and returns a signature object\n * @param {String} armoredText text to be parsed\n * @returns {Signature} new signature object\n * @static\n */\nfunction readArmored(armoredText) {\n var input = _armor2.default.decode(armoredText).data;\n return read(input);\n}\n\n/**\n * reads an OpenPGP signature as byte array and returns a signature object\n * @param {Uint8Array} input binary signature\n * @returns {Signature} new signature object\n * @static\n */\nfunction read(input) {\n var packetlist = new _packet2.default.List();\n packetlist.read(input);\n return new Signature(packetlist);\n}\n\n},{\"./encoding/armor\":357,\"./enums\":359,\"./packet\":371}],392:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @constructor\n */\nfunction ECDHSymmetricKey(data) {\n if (typeof data === 'undefined') {\n data = new Uint8Array([]);\n } else if (_util2.default.isString(data)) {\n data = _util2.default.str_to_Uint8Array(data);\n } else {\n data = new Uint8Array(data);\n }\n this.data = data;\n}\n\n/**\n * Read an ECDHSymmetricKey from an Uint8Array\n * @param {Uint8Array} input Where to read the encoded symmetric key from\n * @returns {Number} Number of read bytes\n */\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2015-2016 Decentral\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * Encoded symmetric key for ECDH\n *\n * @requires util\n * @module type/ecdh_symkey\n */\n\nECDHSymmetricKey.prototype.read = function (input) {\n if (input.length >= 1) {\n var length = input[0];\n if (input.length >= 1 + length) {\n this.data = input.subarray(1, 1 + length);\n return 1 + this.data.length;\n }\n }\n throw new Error('Invalid symmetric key');\n};\n\n/**\n * Write an ECDHSymmetricKey as an Uint8Array\n * @returns {Uint8Array} An array containing the value\n */\nECDHSymmetricKey.prototype.write = function () {\n return _util2.default.concatUint8Array([new Uint8Array([this.data.length]), this.data]);\n};\n\nECDHSymmetricKey.fromClone = function (clone) {\n return new ECDHSymmetricKey(clone.data);\n};\n\nexports.default = ECDHSymmetricKey;\n\n},{\"../util\":398}],393:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _enums = _dereq_('../enums.js');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @constructor\n * @param {enums.hash} hash Hash algorithm\n * @param {enums.symmetric} cipher Symmetric algorithm\n */\nfunction KDFParams(data) {\n if (data && data.length === 2) {\n this.hash = data[0];\n this.cipher = data[1];\n } else {\n this.hash = _enums2.default.hash.sha1;\n this.cipher = _enums2.default.symmetric.aes128;\n }\n}\n\n/**\n * Read KDFParams from an Uint8Array\n * @param {Uint8Array} input Where to read the KDFParams from\n * @returns {Number} Number of read bytes\n */\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2015-2016 Decentral\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * Implementation of type KDF parameters\n *\n * {@link https://tools.ietf.org/html/rfc6637#section-7|RFC 6637 7}:\n * A key derivation function (KDF) is necessary to implement the EC\n * encryption. The Concatenation Key Derivation Function (Approved\n * Alternative 1) [NIST-SP800-56A] with the KDF hash function that is\n * SHA2-256 [FIPS-180-3] or stronger is REQUIRED.\n * @requires enums\n * @module type/kdf_params\n */\n\nKDFParams.prototype.read = function (input) {\n if (input.length < 4 || input[0] !== 3 || input[1] !== 1) {\n throw new Error('Cannot read KDFParams');\n }\n this.hash = input[2];\n this.cipher = input[3];\n return 4;\n};\n\n/**\n * Write KDFParams to an Uint8Array\n * @returns {Uint8Array} Array with the KDFParams value\n */\nKDFParams.prototype.write = function () {\n return new Uint8Array([3, 1, this.hash, this.cipher]);\n};\n\nKDFParams.fromClone = function (clone) {\n return new KDFParams([clone.hash, clone.cipher]);\n};\n\nexports.default = KDFParams;\n\n},{\"../enums.js\":359}],394:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _util = _dereq_('../util.js');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @constructor\n */\nfunction Keyid() {\n this.bytes = '';\n}\n\n/**\n * Parsing method for a key id\n * @param {Uint8Array} input Input to read the key id from\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * Implementation of type key id\n *\n * {@link https://tools.ietf.org/html/rfc4880#section-3.3|RFC4880 3.3}:\n * A Key ID is an eight-octet scalar that identifies a key.\n * Implementations SHOULD NOT assume that Key IDs are unique. The\n * section \"Enhanced Key Formats\" below describes how Key IDs are\n * formed.\n * @requires util\n * @module type/keyid\n */\n\nKeyid.prototype.read = function (bytes) {\n this.bytes = _util2.default.Uint8Array_to_str(bytes.subarray(0, 8));\n};\n\nKeyid.prototype.write = function () {\n return _util2.default.str_to_Uint8Array(this.bytes);\n};\n\nKeyid.prototype.toHex = function () {\n return _util2.default.str_to_hex(this.bytes);\n};\n\n/**\n * Checks equality of Key ID's\n * @param {Keyid} keyid\n * @param {Boolean} matchWildcard Indicates whether to check if either keyid is a wildcard\n */\nKeyid.prototype.equals = function (keyid) {\n var matchWildcard = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n return matchWildcard && (keyid.isWildcard() || this.isWildcard()) || this.bytes === keyid.bytes;\n};\n\nKeyid.prototype.isNull = function () {\n return this.bytes === '';\n};\n\nKeyid.prototype.isWildcard = function () {\n return (/^0+$/.test(this.toHex())\n );\n};\n\nKeyid.mapToHex = function (keyId) {\n return keyId.toHex();\n};\n\nKeyid.fromClone = function (clone) {\n var keyid = new Keyid();\n keyid.bytes = clone.bytes;\n return keyid;\n};\n\nKeyid.fromId = function (hex) {\n var keyid = new Keyid();\n keyid.read(_util2.default.hex_to_Uint8Array(hex));\n return keyid;\n};\n\nKeyid.wildcard = function () {\n var keyid = new Keyid();\n keyid.read(new Uint8Array(8));\n return keyid;\n};\n\nexports.default = Keyid;\n\n},{\"../util.js\":398}],395:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _bn = _dereq_('bn.js');\n\nvar _bn2 = _interopRequireDefault(_bn);\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @constructor\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n// Hint: We hold our MPIs as an array of octets in big endian format preceding a two\n// octet scalar: MPI: [a,b,c,d,e,f]\n// - MPI size: (a << 8) | b\n// - MPI = c | d << 8 | e << ((MPI.length -2)*8) | f ((MPI.length -2)*8)\n\n/**\n * Implementation of type MPI ({@link https://tools.ietf.org/html/rfc4880#section-3.2|RFC4880 3.2})\n * Multiprecision integers (also called MPIs) are unsigned integers used\n * to hold large integers such as the ones used in cryptographic\n * calculations.\n * An MPI consists of two pieces: a two-octet scalar that is the length\n * of the MPI in bits followed by a string of octets that contain the\n * actual integer.\n * @requires bn.js\n * @requires util\n * @module type/mpi\n */\n\nfunction MPI(data) {\n /** An implementation dependent integer */\n if (data instanceof MPI) {\n this.data = data.data;\n } else if (_bn2.default.isBN(data)) {\n this.fromBN(data);\n } else if (_util2.default.isUint8Array(data)) {\n this.fromUint8Array(data);\n } else if (_util2.default.isString(data)) {\n this.fromString(data);\n } else {\n this.data = null;\n }\n}\n\n/**\n * Parsing function for a MPI ({@link https://tools.ietf.org/html/rfc4880#section-3.2|RFC 4880 3.2}).\n * @param {Uint8Array} input Payload of MPI data\n * @param {String} endian Endianness of the data; 'be' for big-endian or 'le' for little-endian\n * @returns {Integer} Length of data read\n */\nMPI.prototype.read = function (bytes) {\n var endian = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'be';\n\n if (_util2.default.isString(bytes)) {\n bytes = _util2.default.str_to_Uint8Array(bytes);\n }\n\n var bits = bytes[0] << 8 | bytes[1];\n var bytelen = bits + 7 >>> 3;\n var payload = bytes.subarray(2, 2 + bytelen);\n\n this.fromUint8Array(payload, endian);\n\n return 2 + bytelen;\n};\n\n/**\n * Converts the mpi object to a bytes as specified in\n * {@link https://tools.ietf.org/html/rfc4880#section-3.2|RFC4880 3.2}\n * @param {String} endian Endianness of the payload; 'be' for big-endian or 'le' for little-endian\n * @param {Integer} length Length of the data part of the MPI\n * @returns {Uint8Aray} mpi Byte representation\n */\nMPI.prototype.write = function (endian, length) {\n return _util2.default.Uint8Array_to_MPI(this.toUint8Array(endian, length));\n};\n\nMPI.prototype.bitLength = function () {\n return (this.data.length - 1) * 8 + _util2.default.nbits(this.data[0]);\n};\n\nMPI.prototype.byteLength = function () {\n return this.data.length;\n};\n\nMPI.prototype.toUint8Array = function (endian, length) {\n endian = endian || 'be';\n length = length || this.data.length;\n\n var payload = new Uint8Array(length);\n var start = length - this.data.length;\n if (start < 0) {\n throw new Error('Payload is too large.');\n }\n\n payload.set(this.data, start);\n if (endian === 'le') {\n payload.reverse();\n }\n\n return payload;\n};\n\nMPI.prototype.fromUint8Array = function (bytes) {\n var endian = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'be';\n\n this.data = new Uint8Array(bytes.length);\n this.data.set(bytes);\n\n if (endian === 'le') {\n this.data.reverse();\n }\n};\n\nMPI.prototype.toString = function () {\n return _util2.default.Uint8Array_to_str(this.toUint8Array());\n};\n\nMPI.prototype.fromString = function (str) {\n var endian = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'be';\n\n this.fromUint8Array(_util2.default.str_to_Uint8Array(str), endian);\n};\n\nMPI.prototype.toBN = function () {\n return new _bn2.default(this.toUint8Array());\n};\n\nMPI.prototype.fromBN = function (bn) {\n this.data = bn.toArrayLike(Uint8Array);\n};\n\nMPI.fromClone = function (clone) {\n return new MPI(clone.data);\n};\n\nexports.default = MPI;\n\n},{\"../util\":398,\"bn.js\":44}],396:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _util = _dereq_('../util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _enums = _dereq_('../enums');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @constructor\n */\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2015-2016 Decentral\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * Wrapper to an OID value\n *\n * {@link https://tools.ietf.org/html/rfc6637#section-11|RFC6637, section 11}:\n * The sequence of octets in the third column is the result of applying\n * the Distinguished Encoding Rules (DER) to the ASN.1 Object Identifier\n * with subsequent truncation. The truncation removes the two fields of\n * encoded Object Identifier. The first omitted field is one octet\n * representing the Object Identifier tag, and the second omitted field\n * is the length of the Object Identifier body. For example, the\n * complete ASN.1 DER encoding for the NIST P-256 curve OID is \"06 08 2A\n * 86 48 CE 3D 03 01 07\", from which the first entry in the table above\n * is constructed by omitting the first two octets. Only the truncated\n * sequence of octets is the valid representation of a curve OID.\n * @requires util\n * @requires enums\n * @module type/oid\n */\n\nfunction OID(oid) {\n if (oid instanceof OID) {\n this.oid = oid.oid;\n } else if (_util2.default.isArray(oid) || _util2.default.isUint8Array(oid)) {\n oid = new Uint8Array(oid);\n if (oid[0] === 0x06) {\n // DER encoded oid byte array\n if (oid[1] !== oid.length - 2) {\n throw new Error('Length mismatch in DER encoded oid');\n }\n oid = oid.subarray(2);\n }\n this.oid = oid;\n } else {\n this.oid = '';\n }\n}\n\n/**\n * Method to read an OID object\n * @param {Uint8Array} input Where to read the OID from\n * @returns {Number} Number of read bytes\n */\nOID.prototype.read = function (input) {\n if (input.length >= 1) {\n var length = input[0];\n if (input.length >= 1 + length) {\n this.oid = input.subarray(1, 1 + length);\n return 1 + this.oid.length;\n }\n }\n throw new Error('Invalid oid');\n};\n\n/**\n * Serialize an OID object\n * @returns {Uint8Array} Array with the serialized value the OID\n */\nOID.prototype.write = function () {\n return _util2.default.concatUint8Array([new Uint8Array([this.oid.length]), this.oid]);\n};\n\n/**\n * Serialize an OID object as a hex string\n * @returns {string} String with the hex value of the OID\n */\nOID.prototype.toHex = function () {\n return _util2.default.Uint8Array_to_hex(this.oid);\n};\n\n/**\n * If a known curve object identifier, return the canonical name of the curve\n * @returns {string} String with the canonical name of the curve\n */\nOID.prototype.getName = function () {\n var hex = this.toHex();\n if (_enums2.default.curve[hex]) {\n return _enums2.default.write(_enums2.default.curve, hex);\n } else {\n throw new Error('Unknown curve object identifier.');\n }\n};\n\nOID.fromClone = function (clone) {\n return new OID(clone.oid);\n};\n\nexports.default = OID;\n\n},{\"../enums\":359,\"../util\":398}],397:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _config = _dereq_('../config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _crypto = _dereq_('../crypto');\n\nvar _crypto2 = _interopRequireDefault(_crypto);\n\nvar _enums = _dereq_('../enums.js');\n\nvar _enums2 = _interopRequireDefault(_enums);\n\nvar _util = _dereq_('../util.js');\n\nvar _util2 = _interopRequireDefault(_util);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @constructor\n */\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * Implementation of the String-to-key specifier\n *\n * {@link https://tools.ietf.org/html/rfc4880#section-3.7|RFC4880 3.7}:\n * String-to-key (S2K) specifiers are used to convert passphrase strings\n * into symmetric-key encryption/decryption keys. They are used in two\n * places, currently: to encrypt the secret part of private keys in the\n * private keyring, and to convert passphrases to encryption keys for\n * symmetrically encrypted messages.\n * @requires config\n * @requires crypto\n * @requires enums\n * @requires util\n * @module type/s2k\n */\n\nfunction S2K() {\n /** @type {module:enums.hash} */\n this.algorithm = 'sha256';\n /** @type {module:enums.s2k} */\n this.type = 'iterated';\n /** @type {Integer} */\n this.c = _config2.default.s2k_iteration_count_byte;\n /** Eight bytes of salt in a binary string.\n * @type {String}\n */\n this.salt = null;\n}\n\nS2K.prototype.get_count = function () {\n // Exponent bias, defined in RFC4880\n var expbias = 6;\n\n return 16 + (this.c & 15) << (this.c >> 4) + expbias;\n};\n\n/**\n * Parsing function for a string-to-key specifier ({@link https://tools.ietf.org/html/rfc4880#section-3.7|RFC 4880 3.7}).\n * @param {String} input Payload of string-to-key specifier\n * @returns {Integer} Actual length of the object\n */\nS2K.prototype.read = function (bytes) {\n var i = 0;\n this.type = _enums2.default.read(_enums2.default.s2k, bytes[i++]);\n this.algorithm = _enums2.default.read(_enums2.default.hash, bytes[i++]);\n\n switch (this.type) {\n case 'simple':\n break;\n\n case 'salted':\n this.salt = bytes.subarray(i, i + 8);\n i += 8;\n break;\n\n case 'iterated':\n this.salt = bytes.subarray(i, i + 8);\n i += 8;\n\n // Octet 10: count, a one-octet, coded value\n this.c = bytes[i++];\n break;\n\n case 'gnu':\n if (_util2.default.Uint8Array_to_str(bytes.subarray(i, 3)) === \"GNU\") {\n i += 3; // GNU\n var gnuExtType = 1000 + bytes[i++];\n if (gnuExtType === 1001) {\n this.type = gnuExtType;\n // GnuPG extension mode 1001 -- don't write secret key at all\n } else {\n throw new Error(\"Unknown s2k gnu protection mode.\");\n }\n } else {\n throw new Error(\"Unknown s2k type.\");\n }\n break;\n\n default:\n throw new Error(\"Unknown s2k type.\");\n }\n\n return i;\n};\n\n/**\n * Serializes s2k information\n * @returns {Uint8Array} binary representation of s2k\n */\nS2K.prototype.write = function () {\n var arr = [new Uint8Array([_enums2.default.write(_enums2.default.s2k, this.type), _enums2.default.write(_enums2.default.hash, this.algorithm)])];\n\n switch (this.type) {\n case 'simple':\n break;\n case 'salted':\n arr.push(this.salt);\n break;\n case 'iterated':\n arr.push(this.salt);\n arr.push(new Uint8Array([this.c]));\n break;\n case 'gnu':\n throw new Error(\"GNU s2k type not supported.\");\n default:\n throw new Error(\"Unknown s2k type.\");\n }\n\n return _util2.default.concatUint8Array(arr);\n};\n\n/**\n * Produces a key using the specified passphrase and the defined\n * hashAlgorithm\n * @param {String} passphrase Passphrase containing user input\n * @returns {Uint8Array} Produced key with a length corresponding to\n * hashAlgorithm hash length\n */\nS2K.prototype.produce_key = function (passphrase, numBytes) {\n passphrase = _util2.default.str_to_Uint8Array(_util2.default.encode_utf8(passphrase));\n\n function round(prefix, s2k) {\n var algorithm = _enums2.default.write(_enums2.default.hash, s2k.algorithm);\n\n switch (s2k.type) {\n case 'simple':\n return _crypto2.default.hash.digest(algorithm, _util2.default.concatUint8Array([prefix, passphrase]));\n\n case 'salted':\n return _crypto2.default.hash.digest(algorithm, _util2.default.concatUint8Array([prefix, s2k.salt, passphrase]));\n\n case 'iterated':\n {\n var count = s2k.get_count();\n var data = _util2.default.concatUint8Array([s2k.salt, passphrase]);\n var isp = new Array(Math.ceil(count / data.length));\n\n isp = _util2.default.concatUint8Array(isp.fill(data));\n\n if (isp.length > count) {\n isp = isp.subarray(0, count);\n }\n\n return _crypto2.default.hash.digest(algorithm, _util2.default.concatUint8Array([prefix, isp]));\n }\n case 'gnu':\n throw new Error(\"GNU s2k type not supported.\");\n\n default:\n throw new Error(\"Unknown s2k type.\");\n }\n }\n\n var arr = [];\n var rlength = 0;\n var prefix = new Uint8Array(numBytes);\n\n for (var _i = 0; _i < numBytes; _i++) {\n prefix[_i] = 0;\n }\n\n var i = 0;\n while (rlength < numBytes) {\n var result = round(prefix.subarray(0, i), this);\n arr.push(result);\n rlength += result.length;\n i++;\n }\n\n return _util2.default.concatUint8Array(arr).subarray(0, numBytes);\n};\n\nS2K.fromClone = function (clone) {\n var s2k = new S2K();\n s2k.algorithm = clone.algorithm;\n s2k.type = clone.type;\n s2k.c = clone.c;\n s2k.salt = clone.salt;\n return s2k;\n};\n\nexports.default = S2K;\n\n},{\"../config\":325,\"../crypto\":340,\"../enums.js\":359,\"../util.js\":398}],398:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _slicedToArray2 = _dereq_('babel-runtime/helpers/slicedToArray');\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nvar _values = _dereq_('babel-runtime/core-js/object/values');\n\nvar _values2 = _interopRequireDefault(_values);\n\nvar _addressRfc = _dereq_('address-rfc2822');\n\nvar _addressRfc2 = _interopRequireDefault(_addressRfc);\n\nvar _config = _dereq_('./config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _util = _dereq_('./util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _base = _dereq_('./encoding/base64');\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/* eslint-disable no-console */\n\n/**\n * This object contains utility functions\n * @requires address-rfc2822\n * @requires config\n * @requires encoding/base64\n * @module util\n */\n\nvar isIE11 = typeof navigator !== 'undefined' && !!navigator.userAgent.match(/Trident\\/7\\.0.*rv:([0-9.]+).*\\).*Gecko$/); // re-import module to access util functions\nexports.default = {\n isString: function isString(data) {\n return typeof data === 'string' || String.prototype.isPrototypeOf(data);\n },\n\n isArray: function isArray(data) {\n return Array.prototype.isPrototypeOf(data);\n },\n\n isUint8Array: function isUint8Array(data) {\n return Uint8Array.prototype.isPrototypeOf(data);\n },\n\n /**\n * Get transferable objects to pass buffers with zero copy (similar to \"pass by reference\" in C++)\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage\n * @param {Object} obj the options object to be passed to the web worker\n * @returns {Array<ArrayBuffer>} an array of binary data to be passed\n */\n getTransferables: function getTransferables(obj) {\n // Internet Explorer does not support Transferable objects.\n if (isIE11) {\n return undefined;\n }\n if (_config2.default.zero_copy && Object.prototype.isPrototypeOf(obj)) {\n var transferables = [];\n _util2.default.collectBuffers(obj, transferables);\n return transferables.length ? transferables : undefined;\n }\n },\n\n collectBuffers: function collectBuffers(obj, collection) {\n if (!obj) {\n return;\n }\n if (_util2.default.isUint8Array(obj) && collection.indexOf(obj.buffer) === -1) {\n collection.push(obj.buffer);\n return;\n }\n if (Object.prototype.isPrototypeOf(obj)) {\n (0, _values2.default)(obj).forEach(function (value) {\n // recursively search all children\n _util2.default.collectBuffers(value, collection);\n });\n }\n },\n\n readNumber: function readNumber(bytes) {\n var n = 0;\n for (var i = 0; i < bytes.length; i++) {\n n += Math.pow(256, i) * bytes[bytes.length - 1 - i];\n }\n return n;\n },\n\n writeNumber: function writeNumber(n, bytes) {\n var b = new Uint8Array(bytes);\n for (var i = 0; i < bytes; i++) {\n b[i] = n >> 8 * (bytes - i - 1) & 0xFF;\n }\n\n return b;\n },\n\n readDate: function readDate(bytes) {\n var n = _util2.default.readNumber(bytes);\n var d = new Date(n * 1000);\n return d;\n },\n\n writeDate: function writeDate(time) {\n var numeric = Math.floor(time.getTime() / 1000);\n\n return _util2.default.writeNumber(numeric, 4);\n },\n\n normalizeDate: function normalizeDate() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Date.now();\n\n return time === null ? time : new Date(Math.floor(+time / 1000) * 1000);\n },\n\n /**\n * Create hex string from a binary\n * @param {String} str String to convert\n * @returns {String} String containing the hexadecimal values\n */\n str_to_hex: function str_to_hex(str) {\n if (str === null) {\n return \"\";\n }\n var r = [];\n var e = str.length;\n var c = 0;\n var h = void 0;\n while (c < e) {\n h = str.charCodeAt(c++).toString(16);\n while (h.length < 2) {\n h = \"0\" + h;\n }\n r.push(\"\" + h);\n }\n return r.join('');\n },\n\n /**\n * Create binary string from a hex encoded string\n * @param {String} str Hex string to convert\n * @returns {String}\n */\n hex_to_str: function hex_to_str(hex) {\n var str = '';\n for (var i = 0; i < hex.length; i += 2) {\n str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));\n }\n return str;\n },\n\n /**\n * Convert a Uint8Array to an MPI-formatted Uint8Array.\n * Note: the output is **not** an MPI object.\n * @see {@link module:type/mpi/MPI.fromUint8Array}\n * @see {@link module:type/mpi/MPI.toUint8Array}\n * @param {Uint8Array} bin An array of 8-bit integers to convert\n * @returns {Uint8Array} MPI-formatted Uint8Array\n */\n Uint8Array_to_MPI: function Uint8Array_to_MPI(bin) {\n var size = (bin.length - 1) * 8 + _util2.default.nbits(bin[0]);\n var prefix = Uint8Array.from([(size & 0xFF00) >> 8, size & 0xFF]);\n return _util2.default.concatUint8Array([prefix, bin]);\n },\n\n /**\n * Convert a Base-64 encoded string an array of 8-bit integer\n *\n * Note: accepts both Radix-64 and URL-safe strings\n * @param {String} base64 Base-64 encoded string to convert\n * @returns {Uint8Array} An array of 8-bit integers\n */\n b64_to_Uint8Array: function b64_to_Uint8Array(base64) {\n return _base2.default.decode(base64.replace(/-/g, '+').replace(/_/g, '/'));\n },\n\n /**\n * Convert an array of 8-bit integer to a Base-64 encoded string\n * @param {Uint8Array} bytes An array of 8-bit integers to convert\n * @param {bool} url If true, output is URL-safe\n * @returns {String} Base-64 encoded string\n */\n Uint8Array_to_b64: function Uint8Array_to_b64(bytes, url) {\n return _base2.default.encode(bytes, url).replace(/(\\n)/g, '');\n },\n\n /**\n * Convert a hex string to an array of 8-bit integers\n * @param {String} hex A hex string to convert\n * @returns {Uint8Array} An array of 8-bit integers\n */\n hex_to_Uint8Array: function hex_to_Uint8Array(hex) {\n var result = new Uint8Array(hex.length >> 1);\n for (var k = 0; k < hex.length >> 1; k++) {\n result[k] = parseInt(hex.substr(k << 1, 2), 16);\n }\n return result;\n },\n\n /**\n * Convert an array of 8-bit integers to a hex string\n * @param {Uint8Array} bytes Array of 8-bit integers to convert\n * @returns {String} Hexadecimal representation of the array\n */\n Uint8Array_to_hex: function Uint8Array_to_hex(bytes) {\n var r = [];\n var e = bytes.length;\n var c = 0;\n var h = void 0;\n while (c < e) {\n h = bytes[c++].toString(16);\n while (h.length < 2) {\n h = \"0\" + h;\n }\n r.push(\"\" + h);\n }\n return r.join('');\n },\n\n /**\n * Convert a string to an array of 8-bit integers\n * @param {String} str String to convert\n * @returns {Uint8Array} An array of 8-bit integers\n */\n str_to_Uint8Array: function str_to_Uint8Array(str) {\n if (!_util2.default.isString(str)) {\n throw new Error('str_to_Uint8Array: Data must be in the form of a string');\n }\n\n var result = new Uint8Array(str.length);\n for (var i = 0; i < str.length; i++) {\n result[i] = str.charCodeAt(i);\n }\n return result;\n },\n\n /**\n * Convert an array of 8-bit integers to a string\n * @param {Uint8Array} bytes An array of 8-bit integers to convert\n * @returns {String} String representation of the array\n */\n Uint8Array_to_str: function Uint8Array_to_str(bytes) {\n bytes = new Uint8Array(bytes);\n var result = [];\n var bs = 1 << 14;\n var j = bytes.length;\n\n for (var i = 0; i < j; i += bs) {\n result.push(String.fromCharCode.apply(String, bytes.subarray(i, i + bs < j ? i + bs : j)));\n }\n return result.join('');\n },\n\n /**\n * Convert a native javascript string to a string of utf8 bytes\n * @param {String} str The string to convert\n * @returns {String} A valid squence of utf8 bytes\n */\n encode_utf8: function encode_utf8(str) {\n return unescape(encodeURIComponent(str));\n },\n\n /**\n * Convert a string of utf8 bytes to a native javascript string\n * @param {String} utf8 A valid squence of utf8 bytes\n * @returns {String} A native javascript string\n */\n decode_utf8: function decode_utf8(utf8) {\n if (typeof utf8 !== 'string') {\n throw new Error('Parameter \"utf8\" is not of type string');\n }\n try {\n return decodeURIComponent(escape(utf8));\n } catch (e) {\n return utf8;\n }\n },\n\n /**\n * Concat Uint8arrays\n * @param {Array<Uint8array>} Array of Uint8Arrays to concatenate\n * @returns {Uint8array} Concatenated array\n */\n concatUint8Array: function concatUint8Array(arrays) {\n var totalLength = 0;\n for (var i = 0; i < arrays.length; i++) {\n if (!_util2.default.isUint8Array(arrays[i])) {\n throw new Error('concatUint8Array: Data must be in the form of a Uint8Array');\n }\n\n totalLength += arrays[i].length;\n }\n\n var result = new Uint8Array(totalLength);\n var pos = 0;\n arrays.forEach(function (element) {\n result.set(element, pos);\n pos += element.length;\n });\n\n return result;\n },\n\n /**\n * Deep copy Uint8Array\n * @param {Uint8Array} Array to copy\n * @returns {Uint8Array} new Uint8Array\n */\n copyUint8Array: function copyUint8Array(array) {\n if (!_util2.default.isUint8Array(array)) {\n throw new Error('Data must be in the form of a Uint8Array');\n }\n\n var copy = new Uint8Array(array.length);\n copy.set(array);\n return copy;\n },\n\n /**\n * Check Uint8Array equality\n * @param {Uint8Array} first array\n * @param {Uint8Array} second array\n * @returns {Boolean} equality\n */\n equalsUint8Array: function equalsUint8Array(array1, array2) {\n if (!_util2.default.isUint8Array(array1) || !_util2.default.isUint8Array(array2)) {\n throw new Error('Data must be in the form of a Uint8Array');\n }\n\n if (array1.length !== array2.length) {\n return false;\n }\n\n for (var i = 0; i < array1.length; i++) {\n if (array1[i] !== array2[i]) {\n return false;\n }\n }\n return true;\n },\n\n /**\n * Calculates a 16bit sum of a Uint8Array by adding each character\n * codes modulus 65535\n * @param {Uint8Array} Uint8Array to create a sum of\n * @returns {Integer} An integer containing the sum of all character\n * codes % 65535\n */\n calc_checksum: function calc_checksum(text) {\n var checksum = {\n s: 0,\n add: function add(sadd) {\n this.s = (this.s + sadd) % 65536;\n }\n };\n for (var i = 0; i < text.length; i++) {\n checksum.add(text[i]);\n }\n return checksum.s;\n },\n\n /**\n * Helper function to print a debug message. Debug\n * messages are only printed if\n * @link module:config/config.debug is set to true.\n * @param {String} str String of the debug message\n */\n print_debug: function print_debug(str) {\n if (_config2.default.debug) {\n console.log(str);\n }\n },\n\n /**\n * Helper function to print a debug message. Debug\n * messages are only printed if\n * @link module:config/config.debug is set to true.\n * Different than print_debug because will call Uint8Array_to_hex iff necessary.\n * @param {String} str String of the debug message\n */\n print_debug_hexarray_dump: function print_debug_hexarray_dump(str, arrToHex) {\n if (_config2.default.debug) {\n str += ': ' + _util2.default.Uint8Array_to_hex(arrToHex);\n console.log(str);\n }\n },\n\n /**\n * Helper function to print a debug message. Debug\n * messages are only printed if\n * @link module:config/config.debug is set to true.\n * Different than print_debug because will call str_to_hex iff necessary.\n * @param {String} str String of the debug message\n */\n print_debug_hexstr_dump: function print_debug_hexstr_dump(str, strToHex) {\n if (_config2.default.debug) {\n str += _util2.default.str_to_hex(strToHex);\n console.log(str);\n }\n },\n\n /**\n * Helper function to print a debug error. Debug\n * messages are only printed if\n * @link module:config/config.debug is set to true.\n * @param {String} str String of the debug message\n */\n print_debug_error: function print_debug_error(error) {\n if (_config2.default.debug) {\n console.error(error);\n }\n },\n\n getLeftNBits: function getLeftNBits(array, bitcount) {\n var rest = bitcount % 8;\n if (rest === 0) {\n return array.subarray(0, bitcount / 8);\n }\n var bytes = (bitcount - rest) / 8 + 1;\n var result = array.subarray(0, bytes);\n return _util2.default.shiftRight(result, 8 - rest); // +String.fromCharCode(string.charCodeAt(bytes -1) << (8-rest) & 0xFF);\n },\n\n // returns bit length of the integer x\n nbits: function nbits(x) {\n var r = 1;\n var t = x >>> 16;\n if (t !== 0) {\n x = t;\n r += 16;\n }\n t = x >> 8;\n if (t !== 0) {\n x = t;\n r += 8;\n }\n t = x >> 4;\n if (t !== 0) {\n x = t;\n r += 4;\n }\n t = x >> 2;\n if (t !== 0) {\n x = t;\n r += 2;\n }\n t = x >> 1;\n if (t !== 0) {\n x = t;\n r += 1;\n }\n return r;\n },\n\n /**\n * If S[1] == 0, then double(S) == (S[2..128] || 0);\n * otherwise, double(S) == (S[2..128] || 0) xor\n * (zeros(120) || 10000111).\n *\n * Both OCB and EAX (through CMAC) require this function to be constant-time.\n *\n * @param {Uint8Array} data\n */\n double: function double(data) {\n var double = new Uint8Array(data.length);\n var last = data.length - 1;\n for (var i = 0; i < last; i++) {\n double[i] = data[i] << 1 ^ data[i + 1] >> 7;\n }\n double[last] = data[last] << 1 ^ (data[0] >> 7) * 0x87;\n return double;\n },\n\n /**\n * Shift a Uint8Array to the right by n bits\n * @param {Uint8Array} array The array to shift\n * @param {Integer} bits Amount of bits to shift (MUST be smaller\n * than 8)\n * @returns {String} Resulting array.\n */\n shiftRight: function shiftRight(array, bits) {\n if (bits) {\n for (var i = array.length - 1; i >= 0; i--) {\n array[i] >>= bits;\n if (i > 0) {\n array[i] |= array[i - 1] << 8 - bits;\n }\n }\n }\n return array;\n },\n\n /**\n * Get native Web Cryptography api, only the current version of the spec.\n * The default configuration is to use the api when available. But it can\n * be deactivated with config.use_native\n * @returns {Object} The SubtleCrypto api or 'undefined'\n */\n getWebCrypto: function getWebCrypto() {\n if (!_config2.default.use_native) {\n return;\n }\n\n return typeof window !== 'undefined' && window.crypto && window.crypto.subtle;\n },\n\n /**\n * Get native Web Cryptography api for all browsers, including legacy\n * implementations of the spec e.g IE11 and Safari 8/9. The default\n * configuration is to use the api when available. But it can be deactivated\n * with config.use_native\n * @returns {Object} The SubtleCrypto api or 'undefined'\n */\n getWebCryptoAll: function getWebCryptoAll() {\n if (!_config2.default.use_native) {\n return;\n }\n\n if (typeof window !== 'undefined') {\n if (window.crypto) {\n return window.crypto.subtle || window.crypto.webkitSubtle;\n }\n if (window.msCrypto) {\n return window.msCrypto.subtle;\n }\n }\n },\n\n /**\n * Detect Node.js runtime.\n */\n detectNode: function detectNode() {\n return typeof window === 'undefined';\n },\n\n /**\n * Get native Node.js crypto api. The default configuration is to use\n * the api when available. But it can also be deactivated with config.use_native\n * @returns {Object} The crypto module or 'undefined'\n */\n getNodeCrypto: function getNodeCrypto() {\n if (!_util2.default.detectNode() || !_config2.default.use_native) {\n return;\n }\n\n return _dereq_('crypto');\n },\n\n /**\n * Get native Node.js Buffer constructor. This should be used since\n * Buffer is not available under browserify.\n * @returns {Function} The Buffer constructor or 'undefined'\n */\n getNodeBuffer: function getNodeBuffer() {\n if (!_util2.default.detectNode()) {\n return;\n }\n\n // This \"hack\" allows us to access the native node buffer module.\n // otherwise, it gets replaced with the browserified version\n // eslint-disable-next-line no-useless-concat, import/no-dynamic-require\n return _dereq_('buf' + 'fer').Buffer;\n },\n\n getNodeZlib: function getNodeZlib() {\n if (!_util2.default.detectNode() || !_config2.default.use_native) {\n return;\n }\n\n return _dereq_('zlib');\n },\n\n isEmailAddress: function isEmailAddress(data) {\n if (!_util2.default.isString(data)) {\n return false;\n }\n var re = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+([a-zA-Z]{2,}|xn--[a-zA-Z\\-0-9]+)))$/;\n return re.test(data);\n },\n\n /**\n * Format user id for internal use.\n */\n formatUserId: function formatUserId(id) {\n // name and email address can be empty but must be of the correct type\n if (id.name && !_util2.default.isString(id.name) || id.email && !_util2.default.isEmailAddress(id.email)) {\n throw new Error('Invalid user id format');\n }\n return new _addressRfc2.default.Address(id.name, id.email, id.comment).format();\n },\n\n /**\n * Parse user id.\n */\n parseUserId: function parseUserId(userid) {\n if (userid.length > _config2.default.max_userid_length) {\n throw new Error('User id string is too long');\n }\n try {\n var _rfc2822$parse = _addressRfc2.default.parse(userid),\n _rfc2822$parse2 = (0, _slicedToArray3.default)(_rfc2822$parse, 1),\n _rfc2822$parse2$ = _rfc2822$parse2[0],\n name = _rfc2822$parse2$.phrase,\n email = _rfc2822$parse2$.address,\n comment = _rfc2822$parse2$.comment;\n\n return { name: name, email: email, comment: comment.replace(/^\\(|\\)$/g, '') };\n } catch (e) {\n throw new Error('Invalid user id format');\n }\n },\n\n /**\n * Normalize line endings to \\r\\n\n */\n canonicalizeEOL: function canonicalizeEOL(text) {\n return text.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\").replace(/\\n/g, \"\\r\\n\");\n },\n\n /**\n * Convert line endings from canonicalized \\r\\n to native \\n\n */\n nativeEOL: function nativeEOL(text) {\n return text.replace(/\\r\\n/g, \"\\n\");\n },\n\n /**\n * Remove trailing spaces and tabs from each line\n */\n removeTrailingSpaces: function removeTrailingSpaces(text) {\n return text.replace(/[ \\t]+$/mg, \"\");\n },\n\n /**\n * Encode input buffer using Z-Base32 encoding.\n * See: https://tools.ietf.org/html/rfc6189#section-5.1.6\n *\n * @param {Uint8Array} data The binary data to encode\n * @returns {String} Binary data encoded using Z-Base32\n */\n encodeZBase32: function encodeZBase32(data) {\n if (data.length === 0) {\n return \"\";\n }\n var ALPHABET = \"ybndrfg8ejkmcpqxot1uwisza345h769\";\n var SHIFT = 5;\n var MASK = 31;\n var buffer = data[0];\n var index = 1;\n var bitsLeft = 8;\n var result = '';\n while (bitsLeft > 0 || index < data.length) {\n if (bitsLeft < SHIFT) {\n if (index < data.length) {\n buffer <<= 8;\n buffer |= data[index++] & 0xff;\n bitsLeft += 8;\n } else {\n var pad = SHIFT - bitsLeft;\n buffer <<= pad;\n bitsLeft += pad;\n }\n }\n bitsLeft -= SHIFT;\n result += ALPHABET[MASK & buffer >> bitsLeft];\n }\n return result;\n }\n};\n\n},{\"./config\":325,\"./encoding/base64\":358,\"./util\":398,\"address-rfc2822\":1,\"babel-runtime/core-js/object/values\":31,\"babel-runtime/helpers/slicedToArray\":40,\"crypto\":\"crypto\",\"zlib\":\"zlib\"}],399:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _slicedToArray2 = _dereq_('babel-runtime/helpers/slicedToArray');\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nvar _util = _dereq_('./util');\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _crypto = _dereq_('./crypto');\n\nvar _crypto2 = _interopRequireDefault(_crypto);\n\nvar _key = _dereq_('./key');\n\nvar keyMod = _interopRequireWildcard(_key);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Initialize the WKD client\n * @constructor\n */\nfunction WKD() {\n this._fetch = typeof window !== 'undefined' ? window.fetch : _dereq_('node-fetch');\n}\n\n/**\n * Search for a public key using Web Key Directory protocol.\n * @param {String} options.email User's email.\n * @param {Boolean} options.rawBytes Returns Uint8Array instead of parsed key.\n * @returns {Promise<Uint8Array|\n * {keys: Array<module:key.Key>,\n * err: (Array<Error>|null)}>} The public key.\n * @async\n */\n// OpenPGP.js - An OpenPGP implementation in javascript\n// Copyright (C) 2018 Wiktor Kwapisiewicz\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview This class implements a client for the Web Key Directory (wkd) protocol\n * in order to lookup keys on designated servers.\n * See: https://datatracker.ietf.org/doc/draft-koch-openpgp-webkey-service/\n * @module wkd\n */\n\nWKD.prototype.lookup = function (options) {\n var fetch = this._fetch;\n\n if (!options.email) {\n throw new Error('You must provide an email parameter!');\n }\n\n if (!_util2.default.isEmailAddress(options.email)) {\n throw new Error('Invalid e-mail address.');\n }\n\n var _$exec = /(.*)@(.*)/.exec(options.email),\n _$exec2 = (0, _slicedToArray3.default)(_$exec, 3),\n localPart = _$exec2[1],\n domain = _$exec2[2];\n\n var localEncoded = _util2.default.encodeZBase32(_crypto2.default.hash.sha1(_util2.default.str_to_Uint8Array(localPart.toLowerCase())));\n\n var url = 'https://' + domain + '/.well-known/openpgpkey/hu/' + localEncoded;\n\n return fetch(url).then(function (response) {\n if (response.status === 200) {\n return response.arrayBuffer();\n }\n }).then(function (publicKey) {\n if (publicKey) {\n var rawBytes = new Uint8Array(publicKey);\n if (options.rawBytes) {\n return rawBytes;\n }\n return keyMod.read(rawBytes);\n }\n });\n};\n\nexports.default = WKD;\n\n},{\"./crypto\":340,\"./key\":362,\"./util\":398,\"babel-runtime/helpers/slicedToArray\":40,\"node-fetch\":\"node-fetch\"}],400:[function(_dereq_,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _promise = _dereq_('babel-runtime/core-js/promise');\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _regenerator = _dereq_('babel-runtime/regenerator');\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = _dereq_('babel-runtime/helpers/asyncToGenerator');\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _util = _dereq_('../util.js');\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _crypto = _dereq_('../crypto');\n\nvar _crypto2 = _interopRequireDefault(_crypto);\n\nvar _packet = _dereq_('../packet');\n\nvar _packet2 = _interopRequireDefault(_packet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Initializes a new proxy and loads the web worker\n * @param {String} path The path to the worker or 'openpgp.worker.js' by default\n * @param {Number} n number of workers to initialize if path given\n * @param {Object} config config The worker configuration\n * @param {Array<Object>} worker alternative to path parameter: web worker initialized with 'openpgp.worker.js'\n * @constructor\n */\nfunction AsyncProxy() {\n var _this = this;\n\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$path = _ref.path,\n path = _ref$path === undefined ? 'openpgp.worker.js' : _ref$path,\n _ref$n = _ref.n,\n n = _ref$n === undefined ? 1 : _ref$n,\n _ref$workers = _ref.workers,\n workers = _ref$workers === undefined ? [] : _ref$workers,\n config = _ref.config;\n\n /**\n * Message handling\n */\n var handleMessage = function handleMessage(workerId) {\n return function (event) {\n var msg = event.data;\n switch (msg.event) {\n case 'method-return':\n if (msg.err) {\n // fail\n var err = new Error(msg.err);\n // add worker stack\n err.workerStack = msg.stack;\n _this.tasks[msg.id].reject(err);\n } else {\n // success\n _this.tasks[msg.id].resolve(msg.data);\n }\n delete _this.tasks[msg.id];\n _this.workers[workerId].requests--;\n break;\n case 'request-seed':\n _this.seedRandom(workerId, msg.amount);\n break;\n default:\n throw new Error('Unknown Worker Event.');\n }\n };\n };\n\n if (workers.length) {\n this.workers = workers;\n } else {\n this.workers = [];\n while (this.workers.length < n) {\n this.workers.push(new Worker(path));\n }\n }\n\n var workerId = 0;\n this.workers.forEach(function (worker) {\n worker.requests = 0;\n worker.onmessage = handleMessage(workerId++);\n worker.onerror = function (e) {\n throw new Error('Unhandled error in openpgp worker: ' + e.message + ' (' + e.filename + ':' + e.lineno + ')');\n };\n\n if (config) {\n worker.postMessage({ event: 'configure', config: config });\n }\n });\n\n // Cannot rely on task order being maintained, use object keyed by request ID to track tasks\n this.tasks = {};\n this.currentID = 0;\n}\n\n/**\n * Get new request ID\n * @returns {integer} New unique request ID\n*/\n// GPG4Browsers - An OpenPGP implementation in javascript\n// Copyright (C) 2011 Recurity Labs GmbH\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3.0 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n/**\n * @fileoverview Provides functions for maintaining browser workers\n * @see module:openpgp.initWorker\n * @see module:openpgp.getWorker\n * @see module:openpgp.destroyWorker\n * @see module:worker/worker\n * @requires util\n * @requires crypto\n * @requires packet\n * @module worker/async_proxy\n */\n\nAsyncProxy.prototype.getID = function () {\n return this.currentID++;\n};\n\n/**\n * Send message to worker with random data\n * @param {Integer} size Number of bytes to send\n * @async\n */\nAsyncProxy.prototype.seedRandom = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(workerId, size) {\n var buf;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return _crypto2.default.random.getRandomBytes(size);\n\n case 2:\n buf = _context.sent;\n\n this.workers[workerId].postMessage({ event: 'seed-random', buf: buf }, _util2.default.getTransferables(buf));\n\n case 4:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function (_x2, _x3) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n/**\n * Terminates the workers\n */\nAsyncProxy.prototype.terminate = function () {\n this.workers.forEach(function (worker) {\n worker.terminate();\n });\n};\n\n/**\n * Generic proxy function that handles all commands from the public api.\n * @param {String} method the public api function to be delegated to the worker thread\n * @param {Object} options the api function's options\n * @returns {Promise} see the corresponding public api functions for their return types\n * @async\n */\nAsyncProxy.prototype.delegate = function (method, options) {\n var _this2 = this;\n\n var id = this.getID();\n var requests = this.workers.map(function (worker) {\n return worker.requests;\n });\n var minRequests = Math.min(requests);\n var workerId = 0;\n for (; workerId < this.workers.length; workerId++) {\n if (this.workers[workerId].requests === minRequests) {\n break;\n }\n }\n\n return new _promise2.default(function (_resolve, reject) {\n // clone packets (for web worker structured cloning algorithm)\n _this2.workers[workerId].postMessage({ id: id, event: method, options: _packet2.default.clone.clonePackets(options) }, _util2.default.getTransferables(options));\n _this2.workers[workerId].requests++;\n\n // remember to handle parsing cloned packets from worker\n _this2.tasks[id] = { resolve: function resolve(data) {\n return _resolve(_packet2.default.clone.parseClonedPackets(data, method));\n }, reject: reject };\n });\n};\n\nexports.default = AsyncProxy;\n\n},{\"../crypto\":340,\"../packet\":371,\"../util.js\":398,\"babel-runtime/core-js/promise\":32,\"babel-runtime/helpers/asyncToGenerator\":35,\"babel-runtime/regenerator\":42}]},{},[361])(361)\n});\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvb3BlbnBncC9kaXN0L29wZW5wZ3AuanM/NjhjNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiMERBQUEseUJBQWEsU0FBMkQsbUJBQW1CLGdEQUFnRCxhQUFhLEtBQUssTUFBTSxnQ0FBZ0MsU0FBUyxxQ0FBcUMsU0FBUyxtQ0FBbUMsT0FBTyxLQUFLLE9BQU8saUJBQWlCLGFBQWEsMEJBQTBCLG1CQUFtQixrQkFBa0IsZ0JBQWdCLFVBQVUsVUFBVSwwQ0FBMEMsOEJBQXdCLG9CQUFvQiw4Q0FBOEMsa0NBQWtDLFlBQVksWUFBWSxtQ0FBbUMsaUJBQWlCLGVBQWUsc0JBQXNCLG9CQUFvQixrREFBa0QsV0FBVyxZQUFZLFNBQVMsU0FBUyxLQUFLO0FBQzV6Qjs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQSxzQ0FBc0MsdUNBQXVDLGdCQUFnQjs7QUFFN0Y7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQSxpRUFBaUUsd0JBQXdCOztBQUV6RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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LGlCQUFpQixPQUFPO0FBQ3hCLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCLGlCQUFpQixPQUFPO0FBQ3hCLGlCQUFpQixPQUFPO0FBQ3hCLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCLGlCQUFpQixPQUFPO0FBQ3hCLGlCQUFpQixPQUFPO0FBQ3hCLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUEsY0FBYyxlQUFlO0FBQzdCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCLGlCQUFpQixPQUFPO0FBQ3hCLGlCQUFpQixPQUFPO0FBQ3hCLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLE9BQU87QUFDeEIsa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLE9BQU8sZ0NBQWdDLGNBQWM7QUFDdEUsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEIsa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixPQUFPLGdDQUFnQyxjQUFjO0FBQ3RFLGlCQUFpQixPQUFPO0FBQ3hCLGlCQUFpQixPQUFPO0FBQ3hCLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRCxDQUFDLEdBQUc7QUFDSjs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBLHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFdBQVc7QUFDeEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCLGVBQWUsT0FBTztBQUN0QixlQUFlLE9BQU87QUFDdEI7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2Qjs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCLGVBQWUsV0FBVztBQUMxQixlQUFlLFFBQVE7QUFDdkI7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFdBQVc7QUFDMUI7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFdBQVc7QUFDMUI7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlCQUF5QixVQUFVO0FBQ25DO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGVBQWUsV0FBVztBQUMxQjs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCLE9BQU87QUFDbEM7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRCxDQUFDLEVBQUUsNEhBQTRIO0FBQy9IOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFdBQVc7QUFDeEIsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFdBQVc7QUFDeEIsYUFBYSxXQUFXO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDLFdBQVc7QUFDWjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsV0FBVztBQUN4QixhQUFhLFFBQVE7QUFDckIsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsV0FBVztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxXQUFXO0FBQ3hCLGVBQWU7QUFDZjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsV0FBVztBQUMxQixpQkFBaUI7QUFDakI7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCLGlCQUFpQjtBQUNqQjs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFdBQVc7QUFDeEIsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFdBQVc7QUFDeEIsYUFBYSxXQUFXO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFdBQVc7QUFDeEIsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCLGlCQUFpQjtBQUNqQjs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFdBQVc7QUFDMUIsaUJBQWlCO0FBQ2pCOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQsQ0FBQyxFQUFFLHdPQUF3TztBQUMzTzs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsV0FBVztBQUN0QixXQUFXLFFBQVE7QUFDbkIsV0FBVyxXQUFXO0FBQ3RCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFdBQVc7QUFDdEIsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFdBQVc7QUFDdEIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEVBQUUsMEJBQTBCO0FBQzdCOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFdBQVc7QUFDeEIsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsV0FBVztBQUN4QixhQUFhLFdBQVc7QUFDeEI7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDLFdBQVc7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFdBQVc7QUFDeEIsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsV0FBVztBQUN4QixhQUFhLFdBQVc7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWEsV0FBVztBQUN4QixhQUFhLFdBQVc7QUFDeEIsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsV0FBVztBQUMxQixpQkFBaUI7QUFDakI7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCLGlCQUFpQjtBQUNqQjs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFdBQVc7QUFDeEIsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsV0FBVztBQUN4QixhQUFhLFdBQVc7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWEsV0FBVztBQUN4QixhQUFhLFdBQVc7QUFDeEIsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsV0FBVztBQUMxQixpQkFBaUI7QUFDakI7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCLGlCQUFpQjtBQUNqQjs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVELENBQUMsRUFBRSx3T0FBd087QUFDM087O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsV0FBVztBQUN0QixXQUFXLFdBQVc7QUFDdEIsV0FBVyxXQUFXO0FBQ3RCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsV0FBVztBQUN0QixXQUFXLFdBQVc7QUFDdEIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEVBQUUsMEJBQTBCO0FBQzdCOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFdBQVc7QUFDeEIsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsV0FBVztBQUN4QixhQUFhLFdBQVc7QUFDeEI7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFdBQVc7QUFDeEIsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCLGlCQUFpQjtBQUNqQjs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFdBQVc7QUFDMUIsaUJBQWlCO0FBQ2pCOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUMsV0FBVztBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGFBQWEsV0FBVztBQUN4QixhQUFhLFdBQVc7QUFDeEIsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsV0FBVztBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsV0FBVztBQUN4QixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGVBQWU7QUFDZjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGVBQWUsV0FBVztBQUMxQixpQkFBaUI7QUFDakI7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCLGlCQUFpQjtBQUNqQjs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVELENBQUMsRUFBRSx3T0FBd087QUFDM087O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsV0FBVztBQUN0QixXQUFXLFdBQVc7QUFDdEIsV0FBVyxXQUFXO0FBQ3RCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxDQUFDLEVBQUUsMEJBQTBCO0FBQzdCOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFdBQVc7QUFDeEIsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsV0FBVztBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBLGFBQWEsV0FBVztBQUN4QixhQUFhLFdBQVc7QUFDeEIsYUFBYSxXQUFXO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFdBQVc7QUFDeEIsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCLGlCQUFpQjtBQUNqQjs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFdBQVc7QUFDMUIsaUJBQWlCO0FBQ2pCOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBLGFBQWEsV0FBVztBQUN4QixhQUFhLFdBQVc7QUFDeEIsYUFBYSxXQUFXO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFdBQVc7QUFDeEIsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCLGlCQUFpQjtBQUNqQjs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFdBQVc7QUFDMUIsaUJBQWlCO0FBQ2pCOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQsQ0FBQyxFQUFFLHdPQUF3TztBQUMzTzs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBOztBQUVBLCtFQUErRTtBQUMvRTtBQUNBOztBQUVBLENBQUMsRUFBRSxjQUFjO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLFdBQVc7QUFDdEIsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsV0FBVztBQUN0QixXQUFXLFdBQVc7QUFDdEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFdBQVc7QUFDdEIsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsV0FBVztBQUN0QixXQUFXLFdBQVc7QUFDdEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEVBQUUsMkJBQTJCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7QUFDQTs7QUFFQSwwQ0FBMEM7O0FBRTFDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSx1QkFBdUIsUUFBUTtBQUMvQjtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixhQUFhO0FBQ2xDO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esb0NBQW9DLGNBQWM7QUFDbEQ7QUFDQSxhQUFhOztBQUViOztBQUVBO0FBQ0E7O0FBRUEsZ0NBQWdDLGNBQWM7QUFDOUM7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEdBQUc7QUFDSjs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxrREFBa0QseUJBQXlCOztBQUUzRTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsMEVBQTBFLHFCQUFxQjtBQUMvRjtBQUNBOztBQUVBLENBQUMsRUFBRSxnREFBZ0Q7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBLGtDQUFrQyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQyxVQUFVO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLENBQUMsR0FBRztBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDRCQUE0QjtBQUM3QztBQUNBOztBQUVBLGlCQUFpQixhQUFhO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxpQkFBaUIsYUFBYTtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsWUFBWSxlQUFlO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztB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QUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsV0FBVztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixvQkFBb0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELFdBQVc7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFD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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLCtDQUErQztBQUNsRTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxxQkFBcUIsc0NBQXNDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSx5QkFBeUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGNBQWM7QUFDbkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVCQUF1QixRQUFRO0FBQy9CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQyxRQUFRO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUMsUUFBUTtBQUN6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsbUNBQW1DO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUE2QixtQ0FBbUM7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw2QkFBNkIsbUNBQW1DO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCLG1DQUFtQztBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUIsMEJBQTBCO0FBQ2pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixnQ0FBZ0M7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQyxRQUFRO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixZQUFZO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixnQkFBZ0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZ0JBQWdCO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsb0JBQW9CO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZ0JBQWdCO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCLFFBQVE7QUFDcEM7QUFDQSw2QkFBNkIsUUFBUTtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxDQUFDLEVBQUUsWUFBWTtBQUNmOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQSxDQUFDLEVBQUUsa0JBQWtCOztBQUVyQixDQUFDLEdBQUc7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixtREFBbUQ7QUFDeEU7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLHVDQUF1QyxTQUFTO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaUJBQWlCO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxpQkFBaUI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELEVBQUU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixlQUFlO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHdCQUF3QixRQUFRO0FBQ2hDO0FBQ0EscUJBQXFCLGVBQWU7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLFFBQVE7QUFDN0I7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGlCQUFpQjtBQUNoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixZQUFZO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7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Q0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsV0FBVztBQUM1QixtQkFBbUIsVUFBVTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7O0FBRUEsQ0FBQyxFQUFFLGdDQUFnQztBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQyxFQUFFLDhEQUE4RDtBQUNqRTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEVBQUUsd0RBQXdEO0FBQzNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZUFBZTtBQUNmLHVDQUF1QztBQUN2QyxlQUFlOztBQUVmLHFCQUFxQixpQkFBaUI7QUFDdEM7O0FBRUEsK0JBQStCLFFBQVE7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsQ0FBQyxFQUFFLDhEQUE4RDtBQUNqRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkRBQTJEO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLLGVBQWU7QUFDcEIsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLG1CQUFtQjtBQUNwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsV0FBVztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEVBQUUsOERBQThEO0FBQ2pFOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELENBQUMsRUFBRSw4REFBOEQ7QUFDakU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZTs7QUFFZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUEsb0JBQW9CLE1BQU07QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCLDJDQUEyQztBQUNyRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsRUFBRSw4RUFBOEU7QUFDakY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLHNCQUFzQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7O0FBRVosVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsRUFBRSxnQ0FBZ0M7QUFDbkM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsY0FBYztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsRUFBRSxnQ0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQyxHQUFHO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLFdBQVc7QUFDOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxDQUFDLEVBQUUscUVBQXFFO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdEQUFnRDtBQUNoRCxnREFBZ0Q7QUFDaEQsZ0RBQWdEO0FBQ2hELGdEQUFnRDtBQUNoRCxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQSx5QkFBeUIsNkRBQTZEOztBQUV0RjtBQUNBLHlCQUF5Qiw2REFBNkQ7O0FBRXRGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQyxFQUFFLDhDQUE4QztBQUNqRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsQ0FBQyxFQUFFLDJCQUEyQjtBQUM5Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0EsUUFBUSxjQUFjO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLGNBQWM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsRUFBRSx3RUFBd0U7QUFDM0U7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEVBQUUsMkJBQTJCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLFFBQVEsY0FBYztBQUN0Qiw4Q0FBOEM7QUFDOUM7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsY0FBYztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQztBQUNwQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsRUFBRSx5REFBeUQ7QUFDNUQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQyxFQUFFLGVBQWU7QUFDbEI7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGdCQUFnQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBLEdBQUc7QUFDSCxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQyxFQUFFLHlDQUF5QztBQUM1Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLG1CQUFtQjtBQUNwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsRUFBRSx3RUFBd0U7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsV0FBVzs7QUFFbkI7QUFDQTtBQUNBO0FBQ0EsUUFBUSxXQUFXOztBQUVuQjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxXQUFXOztBQUVuQjtBQUNBO0FBQ0EsUUFBUSxVQUFVOztBQUVsQjtBQUNBOztBQUVBLENBQUMsR0FBRztBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsR0FBRztBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsR0FBRztBQUNKOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixnQkFBZ0I7QUFDbkM7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QUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EscUJBQXFCLHlDQUF5Qzs7QUFFOUQ7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEVBQUUsMkdBQTJHO0FBQzlHOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsVUFBVTtBQUM3QztBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0EscUJBQXFCLDhCQUE4QjtB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OztBQUV0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMEJBQTBCOztBQUUzRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsdUJBQXVCO0FBQ3BEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNCQUFzQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDOztBQUVyQztBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixVQUFVOztBQUV0QyxDQUFDLEdBQUc7QUFDSjtBQUNBO0FBQ0EscUJBQXFCLGNBQWM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEVBQUUsZ0JBQWdCO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkLEtBQUs7QUFDTCxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQyxjQUFjO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QzdCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEdBQUc7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIscUJBQXFCO0FBQy9DLE9BQU87QUFDUCwwQkFBMEIsMEJBQTBCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQyxFQUFFLFlBQVksRUFBRSxHQUFHO0FBQ3BCLENBQUM7QUFDRCxDQUFDLHFJQUFxSTtBQUN0SSxDQUFDLEdBQUc7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBOztBQUVBO0FBQ0E7QUFD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OztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsQ0FBQyxHQUFHO0FBQ0o7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7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Q0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLHFCQUFxQjtBQUNwQztBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsYUFBYSxrQkFBa0IsZ0NBQWdDLG1FQUFtRTtBQUNsSSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsRUFBRSw4TUFBOE07QUFDak47O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7O0FBRUEsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtB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QTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxDQUFDLEVBQUUsbUxBQW1MO0FBQ3RMOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBLHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsRUFBRSx5REFBeUQ7QUFDNUQ7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLEdBQUc7QUFDZCxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFdBQVcsR0FBRztBQUNkLFdBQVcsUUFBUTtBQUNuQixhQUFhO0FBQ2I7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFdBQVcsUUFBUTtBQUNuQixX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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsYUFBYSxnQkFBZ0I7QUFDN0IsYUFBYSxnQkFBZ0I7QUFDN0IsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsV0FBVztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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Q0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsT0FBTztBQUNQLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLDRFQUE0RTtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxPQUFPO0FBQ1AsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxPQUFPO0FBQ1AsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsT0FBTztBQUNQLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxNQUFNO0FBQ04sWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsT0FBTztBQUNQLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsT0FBTztBQUNQLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsT0FBTztBQUNQLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxDQUFDLEVBQUUscUhBQXFIO0FBQ3hIOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBOztBQUVBLHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3RjtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZLE9BQU87QUFDbkIsWUFBWSxPQUFPO0FBQ25CO0FBQ0EsYUFBYSxnQkFBZ0I7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxZQUFZLE9BQU87QUFDbkIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pELEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQSxDQUFDLEVBQUUseUNBQXlDO0FBQzVDOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FB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O0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxhQUFhOztBQUViOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsZUFBZTs7QUFFZjtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0REFBNEQsK0RBQStEOztBQUUzSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGVBQWU7O0FBRWY7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGVBQWU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQSx3REFBd0QsUUFBUTtBQUNoRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGVBQWU7O0FBRWY7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsYUFBYTs7QUFFYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUksMENBQTBDO0FBQzlDO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyx3QkFBd0I7QUFDbkMsV0FBVyxPQUFPO0FBQ2xCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNULFNBQVM7QUFDVCxXQUFXLFFBQVE7QUFDbkIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLG1CQUFtQixrQkFBa0I7QUFDckM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsZ0RBQWdELGlDQUFpQzs7QUFFakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxZQUFZLE9BQU87QUFDbkIsWUFBWSxPQUFPO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLFFBQVEsZ0NBQWdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQ0FBMEMsK0VBQStFO0FBQ3pIOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0EsT0FBTztBQUNQLEdBQUc7QUFDSDs7QUFFQTs7QUFFQSxDQUFDLEVBQUUsK0pBQStKLEVBQUUsR0FBRztBQUN2SyxDQUFDIiwiZmlsZSI6IjE1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBleHBvcnRzPT09XCJvYmplY3RcIiYmdHlwZW9mIG1vZHVsZSE9PVwidW5kZWZpbmVkXCIpe21vZHVsZS5leHBvcnRzPWYoKX1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT1cImZ1bmN0aW9uXCImJmRlZmluZS5hbWQpe2RlZmluZShbXSxmKX1lbHNle3ZhciBnO2lmKHR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiKXtnPXdpbmRvd31lbHNlIGlmKHR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiKXtnPWdsb2JhbH1lbHNlIGlmKHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIil7Zz1zZWxmfWVsc2V7Zz10aGlzfWcub3BlbnBncCA9IGYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIChmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkoezE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzJyk7XG5cbnZhciBfY3JlYXRlQ2xhc3MzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2xhc3MyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIGVhX2xpYiA9IF9kZXJlcV8oJ2VtYWlsLWFkZHJlc3NlcycpO1xuXG5leHBvcnRzLnBhcnNlID0gZnVuY3Rpb24gcGFyc2UobGluZSwgc3RhcnRBdCkge1xuICAgIGlmICghbGluZSkgdGhyb3cgJ05vdGhpbmcgdG8gcGFyc2UnO1xuXG4gICAgbGluZSA9IGxpbmUudHJpbSgpO1xuXG4gICAgdmFyIGFkZHIgPSBlYV9saWIoe1xuICAgICAgICBpbnB1dDogbGluZSxcbiAgICAgICAgcmZjNjUzMjogdHJ1ZSwgLy8gdW5pY29kZVxuICAgICAgICBwYXJ0aWFsOiBmYWxzZSwgLy8gcmV0dXJuIGZhaWxlZCBwYXJzZXNcbiAgICAgICAgc2ltcGxlOiBmYWxzZSwgLy8gc2ltcGxlIEFTVFxuICAgICAgICBzdHJpY3Q6IGZhbHNlLCAvLyB0dXJuIG9mZiBvYnMtIGZlYXR1cmVzIGluIHRoZSByZmNcbiAgICAgICAgcmVqZWN0VExEOiBmYWxzZSwgLy8gZG9tYWlucyByZXF1aXJlIGEgXCIuXCJcbiAgICAgICAgc3RhcnRBdDogc3RhcnRBdCB8fCBudWxsXG4gICAgfSk7XG5cbiAgICBpZiAoIWFkZHIpIHRocm93ICdObyByZXN1bHRzJztcblxuICAgIC8vIGNvbnNvbGUubG9nKFwiUGFyc2VkIHRvOiBcIiwgcmVxdWlyZSgndXRpbCcpLmluc3BlY3QoYWRkciwge2RlcHRoOiAxMCwgY29sb3JzOiB0cnVlfSkpO1xuXG4gICAgcmV0dXJuIGFkZHIuYWRkcmVzc2VzLm1hcChtYXBfYWRkcmVzc2VzKTtcbn07XG5cbmZ1bmN0aW9uIG1hcF9hZGRyZXNzZXMoYWRyKSB7XG4gICAgaWYgKGFkci50eXBlID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIHJldHVybiBuZXcgR3JvdXAoYWRyLm5hbWUsIGFkci5hZGRyZXNzZXMubWFwKG1hcF9hZGRyZXNzZXMpKTtcbiAgICB9XG4gICAgdmFyIGNvbW1lbnRzID0gdm9pZCAwO1xuICAgIGlmIChhZHIucGFydHMuY29tbWVudHMpIHtcbiAgICAgICAgY29tbWVudHMgPSBhZHIucGFydHMuY29tbWVudHMubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICByZXR1cm4gYy50b2tlbnMudHJpbSgpO1xuICAgICAgICB9KS5qb2luKCcgJykudHJpbSgpO1xuICAgICAgICAvLyBpZiAoY29tbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIC8vICAgICBjb21tZW50cyA9ICcoJyArIGNvbW1lbnRzICsgJyknO1xuICAgICAgICAvLyB9XG4gICAgfVxuICAgIHZhciBsID0gYWRyLmxvY2FsO1xuICAgIGlmICghYWRyLm5hbWUgJiYgLzovLnRlc3QobCkpIGwgPSAnXCInICsgbCArICdcIic7XG4gICAgcmV0dXJuIG5ldyBBZGRyZXNzKGFkci5uYW1lLCBsICsgJ0AnICsgYWRyLmRvbWFpbiwgY29tbWVudHMpO1xufVxuXG5leHBvcnRzLnBhcnNlRnJvbSA9IGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMucGFyc2UobGluZSwgJ2Zyb20nKTtcbn07XG5cbmV4cG9ydHMucGFyc2VTZW5kZXIgPSBmdW5jdGlvbiAobGluZSkge1xuICAgIHJldHVybiBleHBvcnRzLnBhcnNlKGxpbmUsICdzZW5kZXInKTtcbn07XG5cbmV4cG9ydHMucGFyc2VSZXBseVRvID0gZnVuY3Rpb24gKGxpbmUpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5wYXJzZShsaW5lLCAncmVwbHktdG8nKTtcbn07XG5cbnZhciBHcm91cCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBHcm91cChkaXNwbGF5X25hbWUsIGFkZHJlc3Nlcykge1xuICAgICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBHcm91cCk7XG5cbiAgICAgICAgdGhpcy5waHJhc2UgPSBkaXNwbGF5X25hbWU7XG4gICAgICAgIHRoaXMuYWRkcmVzc2VzID0gYWRkcmVzc2VzO1xuICAgIH1cblxuICAgICgwLCBfY3JlYXRlQ2xhc3MzLmRlZmF1bHQpKEdyb3VwLCBbe1xuICAgICAgICBrZXk6ICdmb3JtYXQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZm9ybWF0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGhyYXNlICsgXCI6XCIgKyB0aGlzLmFkZHJlc3Nlcy5tYXAoZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5mb3JtYXQoKTtcbiAgICAgICAgICAgIH0pLmpvaW4oJywnKTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnbmFtZScsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBuYW1lKCkge1xuICAgICAgICAgICAgdmFyIHBocmFzZSA9IHRoaXMucGhyYXNlO1xuXG4gICAgICAgICAgICBpZiAoIShwaHJhc2UgJiYgcGhyYXNlLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICBwaHJhc2UgPSB0aGlzLmNvbW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBuYW1lID0gX2V4dHJhY3RfbmFtZShwaHJhc2UpO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgIH1cbiAgICB9XSk7XG4gICAgcmV0dXJuIEdyb3VwO1xufSgpO1xuXG52YXIgQWRkcmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBZGRyZXNzKHBocmFzZSwgYWRkcmVzcywgY29tbWVudCkge1xuICAgICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBBZGRyZXNzKTtcblxuICAgICAgICB0aGlzLnBocmFzZSA9IHBocmFzZSB8fCAnJztcbiAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcyB8fCAnJztcbiAgICAgICAgdGhpcy5jb21tZW50ID0gY29tbWVudCB8fCAnJztcbiAgICB9XG5cbiAgICAoMCwgX2NyZWF0ZUNsYXNzMy5kZWZhdWx0KShBZGRyZXNzLCBbe1xuICAgICAgICBrZXk6ICdob3N0JyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhvc3QoKSB7XG4gICAgICAgICAgICB2YXIgbWF0Y2ggPSAvLipAKC4qKSQvLmV4ZWModGhpcy5hZGRyZXNzKTtcbiAgICAgICAgICAgIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICd1c2VyJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHVzZXIoKSB7XG4gICAgICAgICAgICB2YXIgbWF0Y2ggPSAvXiguKilALy5leGVjKHRoaXMuYWRkcmVzcyk7XG4gICAgICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnZm9ybWF0JyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm1hdCgpIHtcbiAgICAgICAgICAgIHZhciBwaHJhc2UgPSB0aGlzLnBocmFzZTtcbiAgICAgICAgICAgIHZhciBlbWFpbCA9IHRoaXMuYWRkcmVzcztcbiAgICAgICAgICAgIHZhciBjb21tZW50ID0gdGhpcy5jb21tZW50O1xuXG4gICAgICAgICAgICB2YXIgYWRkciA9IFtdO1xuICAgICAgICAgICAgdmFyIGF0ZXh0ID0gbmV3IFJlZ0V4cCgnXltcXFxcLVxcXFx3ICEjJCUmXFwnKisvPT9eYHt8fX5dKyQnKTtcblxuICAgICAgICAgICAgaWYgKHBocmFzZSAmJiBwaHJhc2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYWRkci5wdXNoKGF0ZXh0LnRlc3QocGhyYXNlLnRyaW0oKSkgPyBwaHJhc2UgOiBfcXVvdGVfbm9fZXNjKHBocmFzZSkgPyBwaHJhc2UgOiAnXCInICsgcGhyYXNlICsgJ1wiJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZW1haWwgJiYgZW1haWwubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHIucHVzaChcIjxcIiArIGVtYWlsICsgXCI+XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW1haWwgJiYgZW1haWwubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYWRkci5wdXNoKGVtYWlsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbW1lbnQgJiYgL1xcUy8udGVzdChjb21tZW50KSkge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnJlcGxhY2UoL15cXHMqXFwoPy8sICcoJykucmVwbGFjZSgvXFwpP1xccyokLywgJyknKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbW1lbnQgJiYgY29tbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhZGRyLnB1c2goY29tbWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBhZGRyLmpvaW4oJyAnKTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnbmFtZScsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBuYW1lKCkge1xuICAgICAgICAgICAgdmFyIHBocmFzZSA9IHRoaXMucGhyYXNlO1xuICAgICAgICAgICAgdmFyIGFkZHIgPSB0aGlzLmFkZHJlc3M7XG5cbiAgICAgICAgICAgIGlmICghKHBocmFzZSAmJiBwaHJhc2UubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIHBocmFzZSA9IHRoaXMuY29tbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5hbWUgPSBfZXh0cmFjdF9uYW1lKHBocmFzZSk7XG5cbiAgICAgICAgICAgIC8vIGZpcnN0Lmxhc3RAZG9tYWluIGFkZHJlc3NcbiAgICAgICAgICAgIGlmIChuYW1lID09PSAnJykge1xuICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IC8oW14lLkBfXSsoWy5fXVteJS5AX10rKSspW0AlXS8uZXhlYyhhZGRyKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG1hdGNoWzFdLnJlcGxhY2UoL1suX10rL2csICcgJyk7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBfZXh0cmFjdF9uYW1lKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICcnICYmIC9cXC9nPS9pLnRlc3QoYWRkcikpIHtcbiAgICAgICAgICAgICAgICAvLyBYNDAwIHN0eWxlIGFkZHJlc3NcbiAgICAgICAgICAgICAgICB2YXIgX21hdGNoID0gL1xcL2c9KFteL10qKS9pLmV4ZWMoYWRkcik7XG4gICAgICAgICAgICAgICAgdmFyIGYgPSBfbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgX21hdGNoID0gL1xcL3M9KFteL10qKS9pLmV4ZWMoYWRkcik7XG4gICAgICAgICAgICAgICAgdmFyIGwgPSBfbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgbmFtZSA9IF9leHRyYWN0X25hbWUoZiArIFwiIFwiICsgbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICB9XG4gICAgfV0pO1xuICAgIHJldHVybiBBZGRyZXNzO1xufSgpO1xuXG5leHBvcnRzLkFkZHJlc3MgPSBBZGRyZXNzO1xuXG4vLyBUaGlzIGlzIGJlY2F1c2UgSlMgcmVnZXhwcyBoYXZlIG5vIGVxdWl2YWxlbnQgb2Zcbi8vIHplcm8td2lkdGggbmVnYXRpdmUgbG9vay1iZWhpbmQgYXNzZXJ0aW9uIGZvcjogLyg/PCFcXFxcKVwiL1xuZnVuY3Rpb24gX3F1b3RlX25vX2VzYyhzdHIpIHtcbiAgICBpZiAoL15cIi8udGVzdChzdHIpKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgbWF0Y2ggPSB2b2lkIDA7XG4gICAgd2hpbGUgKG1hdGNoID0gL15bXFxzXFxTXSo/KFtcXHNcXFNdKVwiLy5leGVjKHN0cikpIHtcbiAgICAgICAgaWYgKG1hdGNoWzFdICE9PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIobWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnRzLmlzQWxsTG93ZXIgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZyA9PT0gc3RyaW5nLnRvTG93ZXJDYXNlKCk7XG59O1xuXG5leHBvcnRzLmlzQWxsVXBwZXIgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZyA9PT0gc3RyaW5nLnRvVXBwZXJDYXNlKCk7XG59O1xuXG5leHBvcnRzLm5hbWVDYXNlID0gZnVuY3Rpb24gKHN0cmluZykge1xuXG4gICAgcmV0dXJuIHN0cmluZy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xcYihcXHcrKS9nLCBmdW5jdGlvbiAoXywgZDEpIHtcbiAgICAgICAgLy8gU2V0IHRoZSBjYXNlIG9mIHRoZSBuYW1lIHRvIGZpcnN0IGNoYXIgdXBwZXIgcmVzdCBsb3dlclxuICAgICAgICByZXR1cm4gZDEuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBkMS5zbGljZSgxKTtcbiAgICB9KS5yZXBsYWNlKC9cXGJNYyhcXHcpL2dpLCBmdW5jdGlvbiAoXywgZDEpIHtcbiAgICAgICAgLy8gU2NvdHRpc2ggbmFtZXMgc3VjaCBhcyAnTWNMZW9kJ1xuICAgICAgICByZXR1cm4gJ01jJyArIGQxLnRvVXBwZXJDYXNlKCk7XG4gICAgfSkucmVwbGFjZSgvXFxibycoXFx3KS9naSwgZnVuY3Rpb24gKF8sIGQxKSB7XG4gICAgICAgIC8vIElyaXNoIG5hbWVzIHN1Y2ggYXMgJ08nTWFsbGV5LCBPJ1JlaWxseSdcbiAgICAgICAgcmV0dXJuICdPXFwnJyArIGQxLnRvVXBwZXJDYXNlKCk7XG4gICAgfSkucmVwbGFjZSgvXFxiKHgqKGl4KT92Kihpdik/aSopXFxiL2lnLCBmdW5jdGlvbiAoXywgZDEpIHtcbiAgICAgICAgLy8gUm9tYW4gbnVtZXJhbHMsIGVnICdMZXZlbCBJSUkgU3VwcG9ydCdcbiAgICAgICAgcmV0dXJuIGQxLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG59O1xuXG4vLyBnaXZlbiBhIGNvbW1lbnQsIGF0dGVtcHQgdG8gZXh0cmFjdCBhIHBlcnNvbidzIG5hbWVcbmZ1bmN0aW9uIF9leHRyYWN0X25hbWUobmFtZSkge1xuICAgIC8vIFVzaW5nIGVuY29kaW5ncywgdG9vIGhhcmQuIFNlZSBNYWlsOjpNZXNzYWdlOjpGaWVsZDo6RnVsbC5cbiAgICBpZiAoLz0/Lio/XFw/PS8udGVzdChuYW1lKSkgcmV0dXJuICcnO1xuXG4gICAgLy8gdHJpbSB3aGl0ZXNwYWNlXG4gICAgbmFtZSA9IG5hbWUudHJpbSgpO1xuICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1xccysvLCAnICcpO1xuXG4gICAgLy8gRGlzcmVnYXJkIG51bWVyaWMgbmFtZXMgKGUuZy4gMTIzNDU2LjEyMzRAY29tcHVzZXJ2ZS5jb20pXG4gICAgaWYgKC9eW1xcZCBdKyQvLnRlc3QobmFtZSkpIHJldHVybiAnJztcblxuICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL15cXCgoLiopXFwpJC8sICckMScpIC8vIHJlbW92ZSBvdXRlcm1vc3QgcGFyZW50aGVzaXNcbiAgICAucmVwbGFjZSgvXlwiKC4qKVwiJC8sICckMScpIC8vIHJlbW92ZSBvdXRlciBxdW90YXRpb24gbWFya3NcbiAgICAucmVwbGFjZSgvXFwoLio/XFwpL2csICcnKSAvLyByZW1vdmUgbWluaW1hbCBlbWJlZGRlZCBjb21tZW50c1xuICAgIC5yZXBsYWNlKC9cXFxcL2csICcnKSAvLyByZW1vdmUgYWxsIGVzY2FwZXNcbiAgICAucmVwbGFjZSgvXlwiKC4qKVwiJC8sICckMScpIC8vIHJlbW92ZSBpbnRlcm5hbCBxdW90YXRpb24gbWFya3NcbiAgICAucmVwbGFjZSgvXihbXlxcc10rKSA/LCA/KC4qKSQvLCAnJDIgJDEnKSAvLyByZXZlcnNlIFwiTGFzdCwgRmlyc3QgTS5cIiBpZiBhcHBsaWNhYmxlXG4gICAgLnJlcGxhY2UoLywuKi8sICcnKTtcblxuICAgIC8vIENoYW5nZSBjYXNpbmcgb25seSB3aGVuIHRoZSBuYW1lIGNvbnRhaW5zIG9ubHkgdXBwZXIgb3Igb25seVxuICAgIC8vIGxvd2VyIGNhc2VkIGNoYXJhY3RlcnMuXG4gICAgaWYgKGV4cG9ydHMuaXNBbGxVcHBlcihuYW1lKSB8fCBleHBvcnRzLmlzQWxsTG93ZXIobmFtZSkpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJDaGFuZ2luZyBjYXNlIG9mOiBcIiArIG5hbWUpO1xuICAgICAgICBuYW1lID0gZXhwb3J0cy5uYW1lQ2FzZShuYW1lKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJOb3c6IFwiICsgbmFtZSk7XG4gICAgfVxuXG4gICAgLy8gc29tZSBjbGVhbnVwXG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvXFxbW15cXF1dKlxcXS9nLCAnJykucmVwbGFjZSgvKF5bXFxzJ1wiXSt8W1xccydcIl0rJCkvZywgJycpLnJlcGxhY2UoL1xcc3syLH0vZywgJyAnKTtcblxuICAgIHJldHVybiBuYW1lO1xufVxuXG59LHtcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiOjM2LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI6MzcsXCJlbWFpbC1hZGRyZXNzZXNcIjoyODN9XSwyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuLyoqXG4gKiBAZmlsZSB7QGxpbmsgaHR0cDovL2FzbWpzLm9yZyBBc20uanN9IGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWR2YW5jZWRfRW5jcnlwdGlvbl9TdGFuZGFyZCBBZHZhbmNlZCBFbmNyeXB0aW9uIFN0YW5kYXJkfS5cbiAqIEBhdXRob3IgQXJ0ZW0gUyBWeWJvcm5vdiA8dnlib3Jub3ZAZ21haWwuY29tPlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbnZhciBBRVNfYXNtID0gZXhwb3J0cy5BRVNfYXNtID0gZnVuY3Rpb24gKCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICAvKipcbiAgICogR2Fsb2lzIEZpZWxkIHN0dWZmIGluaXQgZmxhZ1xuICAgKi9cblxuICB2YXIgZ2luaXRfZG9uZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBHYWxvaXMgRmllbGQgZXhwb25lbnRpYXRpb24gYW5kIGxvZ2FyaXRobSB0YWJsZXMgZm9yIDMgKHRoZSBnZW5lcmF0b3IpXG4gICAqL1xuICB2YXIgZ2V4cDMsIGdsb2czO1xuXG4gIC8qKlxuICAgKiBJbml0IEdhbG9pcyBGaWVsZCB0YWJsZXNcbiAgICovXG4gIGZ1bmN0aW9uIGdpbml0KCkge1xuICAgIGdleHAzID0gW10sIGdsb2czID0gW107XG5cbiAgICB2YXIgYSA9IDEsXG4gICAgICAgIGMsXG4gICAgICAgIGQ7XG4gICAgZm9yIChjID0gMDsgYyA8IDI1NTsgYysrKSB7XG4gICAgICBnZXhwM1tjXSA9IGE7XG5cbiAgICAgIC8vIE11bHRpcGx5IGJ5IHRocmVlXG4gICAgICBkID0gYSAmIDB4ODAsIGEgPDw9IDEsIGEgJj0gMjU1O1xuICAgICAgaWYgKGQgPT09IDB4ODApIGEgXj0gMHgxYjtcbiAgICAgIGEgXj0gZ2V4cDNbY107XG5cbiAgICAgIC8vIFNldCB0aGUgbG9nIHRhYmxlIHZhbHVlXG4gICAgICBnbG9nM1tnZXhwM1tjXV0gPSBjO1xuICAgIH1cbiAgICBnZXhwM1syNTVdID0gZ2V4cDNbMF07XG4gICAgZ2xvZzNbMF0gPSAwO1xuXG4gICAgZ2luaXRfZG9uZSA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2Fsb2lzIEZpZWxkIG11bHRpcGxpY2F0aW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBiXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGdtdWwoYSwgYikge1xuICAgIHZhciBjID0gZ2V4cDNbKGdsb2czW2FdICsgZ2xvZzNbYl0pICUgMjU1XTtcbiAgICBpZiAoYSA9PT0gMCB8fCBiID09PSAwKSBjID0gMDtcbiAgICByZXR1cm4gYztcbiAgfVxuXG4gIC8qKlxuICAgKiBHYWxvaXMgRmllbGQgcmVjaXByb2NhbFxuICAgKiBAcGFyYW0ge251bWJlcn0gYVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBnaW52KGEpIHtcbiAgICB2YXIgaSA9IGdleHAzWzI1NSAtIGdsb2czW2FdXTtcbiAgICBpZiAoYSA9PT0gMCkgaSA9IDA7XG4gICAgcmV0dXJuIGk7XG4gIH1cblxuICAvKipcbiAgICogQUVTIHN0dWZmIGluaXQgZmxhZ1xuICAgKi9cbiAgdmFyIGFlc19pbml0X2RvbmUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRW5jcnlwdGlvbiwgRGVjcnlwdGlvbiwgUy1Cb3ggYW5kIEtleVRyYW5zZm9ybSB0YWJsZXNcbiAgICpcbiAgICogQHR5cGUge251bWJlcltdfVxuICAgKi9cbiAgdmFyIGFlc19zYm94O1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyW119XG4gICAqL1xuICB2YXIgYWVzX3NpbnY7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtudW1iZXJbXVtdfVxuICAgKi9cbiAgdmFyIGFlc19lbmM7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtudW1iZXJbXVtdfVxuICAgKi9cbiAgdmFyIGFlc19kZWM7XG5cbiAgLyoqXG4gICAqIEluaXQgQUVTIHRhYmxlc1xuICAgKi9cbiAgZnVuY3Rpb24gYWVzX2luaXQoKSB7XG4gICAgaWYgKCFnaW5pdF9kb25lKSBnaW5pdCgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlcyBBRVMgUy1Cb3ggdmFsdWVcbiAgICBmdW5jdGlvbiBfcyhhKSB7XG4gICAgICB2YXIgYywgcywgeDtcbiAgICAgIHMgPSB4ID0gZ2ludihhKTtcbiAgICAgIGZvciAoYyA9IDA7IGMgPCA0OyBjKyspIHtcbiAgICAgICAgcyA9IChzIDw8IDEgfCBzID4+PiA3KSAmIDI1NTtcbiAgICAgICAgeCBePSBzO1xuICAgICAgfVxuICAgICAgeCBePSA5OTtcbiAgICAgIHJldHVybiB4O1xuICAgIH1cblxuICAgIC8vIFRhYmxlc1xuICAgIGFlc19zYm94ID0gW10sIGFlc19zaW52ID0gW10sIGFlc19lbmMgPSBbW10sIFtdLCBbXSwgW11dLCBhZXNfZGVjID0gW1tdLCBbXSwgW10sIFtdXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcbiAgICAgIHZhciBzID0gX3MoaSk7XG5cbiAgICAgIC8vIFMtQm94IGFuZCBpdHMgaW52ZXJzZVxuICAgICAgYWVzX3Nib3hbaV0gPSBzO1xuICAgICAgYWVzX3NpbnZbc10gPSBpO1xuXG4gICAgICAvLyBFY3J5cHRpb24gYW5kIERlY3J5cHRpb24gdGFibGVzXG4gICAgICBhZXNfZW5jWzBdW2ldID0gZ211bCgyLCBzKSA8PCAyNCB8IHMgPDwgMTYgfCBzIDw8IDggfCBnbXVsKDMsIHMpO1xuICAgICAgYWVzX2RlY1swXVtzXSA9IGdtdWwoMTQsIGkpIDw8IDI0IHwgZ211bCg5LCBpKSA8PCAxNiB8IGdtdWwoMTMsIGkpIDw8IDggfCBnbXVsKDExLCBpKTtcbiAgICAgIC8vIFJvdGF0ZSB0YWJsZXNcbiAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgNDsgdCsrKSB7XG4gICAgICAgIGFlc19lbmNbdF1baV0gPSBhZXNfZW5jW3QgLSAxXVtpXSA+Pj4gOCB8IGFlc19lbmNbdCAtIDFdW2ldIDw8IDI0O1xuICAgICAgICBhZXNfZGVjW3RdW3NdID0gYWVzX2RlY1t0IC0gMV1bc10gPj4+IDggfCBhZXNfZGVjW3QgLSAxXVtzXSA8PCAyNDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXNtLmpzIG1vZHVsZSBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogPHA+XG4gICAqIEhlYXAgYnVmZmVyIGxheW91dCBieSBvZmZzZXQ6XG4gICAqIDxwcmU+XG4gICAqIDB4MDAwMCAgIGVuY3J5cHRpb24ga2V5IHNjaGVkdWxlXG4gICAqIDB4MDQwMCAgIGRlY3J5cHRpb24ga2V5IHNjaGVkdWxlXG4gICAqIDB4MDgwMCAgIHNib3hcbiAgICogMHgwYzAwICAgaW52IHNib3hcbiAgICogMHgxMDAwICAgZW5jcnlwdGlvbiB0YWJsZXNcbiAgICogMHgyMDAwICAgZGVjcnlwdGlvbiB0YWJsZXNcbiAgICogMHgzMDAwICAgcmVzZXJ2ZWQgKGZ1dHVyZSBHQ00gbXVsdGlwbGljYXRpb24gbG9va3VwIHRhYmxlKVxuICAgKiAweDQwMDAgICBkYXRhXG4gICAqIDwvcHJlPlxuICAgKiBEb24ndCB0b3VjaCBhbnl0aGluZyBiZWZvcmUgPGNvZGU+MHg0MDA8L2NvZGU+LlxuICAgKiA8L3A+XG4gICAqXG4gICAqIEBhbGlhcyBBRVNfYXNtXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge09iamVjdH0gZm9yZWlnbiAtIDxpPmlnbm9yZWQ8L2k+XG4gICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGJ1ZmZlciAtIGhlYXAgYnVmZmVyIHRvIGxpbmsgd2l0aFxuICAgKi9cbiAgdmFyIHdyYXBwZXIgPSBmdW5jdGlvbiB3cmFwcGVyKGZvcmVpZ24sIGJ1ZmZlcikge1xuICAgIC8vIEluaXQgQUVTIHN0dWZmIGZvciB0aGUgZmlyc3QgdGltZVxuICAgIGlmICghYWVzX2luaXRfZG9uZSkgYWVzX2luaXQoKTtcblxuICAgIC8vIEZpbGwgdXAgQUVTIHRhYmxlc1xuICAgIHZhciBoZWFwID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlcik7XG4gICAgaGVhcC5zZXQoYWVzX3Nib3gsIDB4MDgwMCA+PiAyKTtcbiAgICBoZWFwLnNldChhZXNfc2ludiwgMHgwYzAwID4+IDIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICBoZWFwLnNldChhZXNfZW5jW2ldLCAweDEwMDAgKyAweDQwMCAqIGkgPj4gMik7XG4gICAgICBoZWFwLnNldChhZXNfZGVjW2ldLCAweDIwMDAgKyAweDQwMCAqIGkgPj4gMik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIEFFUyBrZXkgc2NoZWR1bGVzLlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBBRVNfYXNtXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtzIC0ga2V5IHNpemUsIDQvNi84IChmb3IgMTI4LzE5Mi8yNTYtYml0IGtleSBjb3JyZXNwb25kaW5nbHkpXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGswIC0ga2V5IHZlY3RvciBjb21wb25lbnRzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGsxIC0ga2V5IHZlY3RvciBjb21wb25lbnRzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGsyIC0ga2V5IHZlY3RvciBjb21wb25lbnRzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGszIC0ga2V5IHZlY3RvciBjb21wb25lbnRzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGs0IC0ga2V5IHZlY3RvciBjb21wb25lbnRzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGs1IC0ga2V5IHZlY3RvciBjb21wb25lbnRzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGs2IC0ga2V5IHZlY3RvciBjb21wb25lbnRzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGs3IC0ga2V5IHZlY3RvciBjb21wb25lbnRzXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0X2tleShrcywgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3KSB7XG4gICAgICB2YXIgZWtleXMgPSBoZWFwLnN1YmFycmF5KDB4MDAwLCA2MCksXG4gICAgICAgICAgZGtleXMgPSBoZWFwLnN1YmFycmF5KDB4MTAwLCAweDEwMCArIDYwKTtcblxuICAgICAgLy8gRW5jcnlwdGlvbiBrZXkgc2NoZWR1bGVcbiAgICAgIGVrZXlzLnNldChbazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3XSk7XG4gICAgICBmb3IgKHZhciBpID0ga3MsIHJjb24gPSAxOyBpIDwgNCAqIGtzICsgMjg7IGkrKykge1xuICAgICAgICB2YXIgayA9IGVrZXlzW2kgLSAxXTtcbiAgICAgICAgaWYgKGkgJSBrcyA9PT0gMCB8fCBrcyA9PT0gOCAmJiBpICUga3MgPT09IDQpIHtcbiAgICAgICAgICBrID0gYWVzX3Nib3hbayA+Pj4gMjRdIDw8IDI0IF4gYWVzX3Nib3hbayA+Pj4gMTYgJiAyNTVdIDw8IDE2IF4gYWVzX3Nib3hbayA+Pj4gOCAmIDI1NV0gPDwgOCBeIGFlc19zYm94W2sgJiAyNTVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpICUga3MgPT09IDApIHtcbiAgICAgICAgICBrID0gayA8PCA4IF4gayA+Pj4gMjQgXiByY29uIDw8IDI0O1xuICAgICAgICAgIHJjb24gPSByY29uIDw8IDEgXiAocmNvbiAmIDB4ODAgPyAweDFiIDogMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWtleXNbaV0gPSBla2V5c1tpIC0ga3NdIF4gaztcbiAgICAgIH1cblxuICAgICAgLy8gRGVjcnlwdGlvbiBrZXkgc2NoZWR1bGVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaTsgaiArPSA0KSB7XG4gICAgICAgIGZvciAodmFyIGpqID0gMDsgamogPCA0OyBqaisrKSB7XG4gICAgICAgICAgdmFyIGsgPSBla2V5c1tpIC0gKDQgKyBqKSArICg0IC0gamopICUgNF07XG4gICAgICAgICAgaWYgKGogPCA0IHx8IGogPj0gaSAtIDQpIHtcbiAgICAgICAgICAgIGRrZXlzW2ogKyBqal0gPSBrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBka2V5c1tqICsgampdID0gYWVzX2RlY1swXVthZXNfc2JveFtrID4+PiAyNF1dIF4gYWVzX2RlY1sxXVthZXNfc2JveFtrID4+PiAxNiAmIDI1NV1dIF4gYWVzX2RlY1syXVthZXNfc2JveFtrID4+PiA4ICYgMjU1XV0gXiBhZXNfZGVjWzNdW2Flc19zYm94W2sgJiAyNTVdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHJvdW5kcyBudW1iZXJcbiAgICAgIGFzbS5zZXRfcm91bmRzKGtzICsgNSk7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGxpYnJhcnkgb2JqZWN0IHdpdGggbmVjZXNzYXJ5IHByb3BlcnRpZXNcbiAgICB2YXIgc3RkbGliID0geyBVaW50OEFycmF5OiBVaW50OEFycmF5LCBVaW50MzJBcnJheTogVWludDMyQXJyYXkgfTtcblxuICAgIHZhciBhc20gPSBmdW5jdGlvbiAoc3RkbGliLCBmb3JlaWduLCBidWZmZXIpIHtcbiAgICAgIFwidXNlIGFzbVwiO1xuXG4gICAgICB2YXIgUzAgPSAwLFxuICAgICAgICAgIFMxID0gMCxcbiAgICAgICAgICBTMiA9IDAsXG4gICAgICAgICAgUzMgPSAwLFxuICAgICAgICAgIEkwID0gMCxcbiAgICAgICAgICBJMSA9IDAsXG4gICAgICAgICAgSTIgPSAwLFxuICAgICAgICAgIEkzID0gMCxcbiAgICAgICAgICBOMCA9IDAsXG4gICAgICAgICAgTjEgPSAwLFxuICAgICAgICAgIE4yID0gMCxcbiAgICAgICAgICBOMyA9IDAsXG4gICAgICAgICAgTTAgPSAwLFxuICAgICAgICAgIE0xID0gMCxcbiAgICAgICAgICBNMiA9IDAsXG4gICAgICAgICAgTTMgPSAwLFxuICAgICAgICAgIEgwID0gMCxcbiAgICAgICAgICBIMSA9IDAsXG4gICAgICAgICAgSDIgPSAwLFxuICAgICAgICAgIEgzID0gMCxcbiAgICAgICAgICBSID0gMDtcblxuICAgICAgdmFyIEhFQVAgPSBuZXcgc3RkbGliLlVpbnQzMkFycmF5KGJ1ZmZlciksXG4gICAgICAgICAgREFUQSA9IG5ldyBzdGRsaWIuVWludDhBcnJheShidWZmZXIpO1xuXG4gICAgICAvKipcbiAgICAgICAqIEFFUyBjb3JlXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gayAtIHByZWNvbXB1dGVkIGtleSBzY2hlZHVsZSBvZmZzZXRcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gcHJlY29tcHV0ZWQgc2JveCB0YWJsZSBvZmZzZXRcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gcHJlY29tcHV0ZWQgcm91bmQgdGFibGUgb2Zmc2V0XG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gciAtIG51bWJlciBvZiBpbm5lciByb3VuZHMgdG8gcGVyZm9ybVxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHgwIC0gMTI4LWJpdCBpbnB1dCBibG9jayB2ZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MSAtIDEyOC1iaXQgaW5wdXQgYmxvY2sgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0geDIgLSAxMjgtYml0IGlucHV0IGJsb2NrIHZlY3RvclxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHgzIC0gMTI4LWJpdCBpbnB1dCBibG9jayB2ZWN0b3JcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gX2NvcmUoaywgcywgdCwgciwgeDAsIHgxLCB4MiwgeDMpIHtcbiAgICAgICAgayA9IGsgfCAwO1xuICAgICAgICBzID0gcyB8IDA7XG4gICAgICAgIHQgPSB0IHwgMDtcbiAgICAgICAgciA9IHIgfCAwO1xuICAgICAgICB4MCA9IHgwIHwgMDtcbiAgICAgICAgeDEgPSB4MSB8IDA7XG4gICAgICAgIHgyID0geDIgfCAwO1xuICAgICAgICB4MyA9IHgzIHwgMDtcblxuICAgICAgICB2YXIgdDEgPSAwLFxuICAgICAgICAgICAgdDIgPSAwLFxuICAgICAgICAgICAgdDMgPSAwLFxuICAgICAgICAgICAgeTAgPSAwLFxuICAgICAgICAgICAgeTEgPSAwLFxuICAgICAgICAgICAgeTIgPSAwLFxuICAgICAgICAgICAgeTMgPSAwLFxuICAgICAgICAgICAgaSA9IDA7XG5cbiAgICAgICAgdDEgPSB0IHwgMHg0MDAsIHQyID0gdCB8IDB4ODAwLCB0MyA9IHQgfCAweGMwMDtcblxuICAgICAgICAvLyByb3VuZCAwXG4gICAgICAgIHgwID0geDAgXiBIRUFQWyhrIHwgMCkgPj4gMl0sIHgxID0geDEgXiBIRUFQWyhrIHwgNCkgPj4gMl0sIHgyID0geDIgXiBIRUFQWyhrIHwgOCkgPj4gMl0sIHgzID0geDMgXiBIRUFQWyhrIHwgMTIpID4+IDJdO1xuXG4gICAgICAgIC8vIHJvdW5kIDEuLnJcbiAgICAgICAgZm9yIChpID0gMTY7IChpIHwgMCkgPD0gciA8PCA0OyBpID0gaSArIDE2IHwgMCkge1xuICAgICAgICAgIHkwID0gSEVBUFsodCB8IHgwID4+IDIyICYgMTAyMCkgPj4gMl0gXiBIRUFQWyh0MSB8IHgxID4+IDE0ICYgMTAyMCkgPj4gMl0gXiBIRUFQWyh0MiB8IHgyID4+IDYgJiAxMDIwKSA+PiAyXSBeIEhFQVBbKHQzIHwgeDMgPDwgMiAmIDEwMjApID4+IDJdIF4gSEVBUFsoayB8IGkgfCAwKSA+PiAyXSwgeTEgPSBIRUFQWyh0IHwgeDEgPj4gMjIgJiAxMDIwKSA+PiAyXSBeIEhFQVBbKHQxIHwgeDIgPj4gMTQgJiAxMDIwKSA+PiAyXSBeIEhFQVBbKHQyIHwgeDMgPj4gNiAmIDEwMjApID4+IDJdIF4gSEVBUFsodDMgfCB4MCA8PCAyICYgMTAyMCkgPj4gMl0gXiBIRUFQWyhrIHwgaSB8IDQpID4+IDJdLCB5MiA9IEhFQVBbKHQgfCB4MiA+PiAyMiAmIDEwMjApID4+IDJdIF4gSEVBUFsodDEgfCB4MyA+PiAxNCAmIDEwMjApID4+IDJdIF4gSEVBUFsodDIgfCB4MCA+PiA2ICYgMTAyMCkgPj4gMl0gXiBIRUFQWyh0MyB8IHgxIDw8IDIgJiAxMDIwKSA+PiAyXSBeIEhFQVBbKGsgfCBpIHwgOCkgPj4gMl0sIHkzID0gSEVBUFsodCB8IHgzID4+IDIyICYgMTAyMCkgPj4gMl0gXiBIRUFQWyh0MSB8IHgwID4+IDE0ICYgMTAyMCkgPj4gMl0gXiBIRUFQWyh0MiB8IHgxID4+IDYgJiAxMDIwKSA+PiAyXSBeIEhFQVBbKHQzIHwgeDIgPDwgMiAmIDEwMjApID4+IDJdIF4gSEVBUFsoayB8IGkgfCAxMikgPj4gMl07XG4gICAgICAgICAgeDAgPSB5MCwgeDEgPSB5MSwgeDIgPSB5MiwgeDMgPSB5MztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpbmFsIHJvdW5kXG4gICAgICAgIFMwID0gSEVBUFsocyB8IHgwID4+IDIyICYgMTAyMCkgPj4gMl0gPDwgMjQgXiBIRUFQWyhzIHwgeDEgPj4gMTQgJiAxMDIwKSA+PiAyXSA8PCAxNiBeIEhFQVBbKHMgfCB4MiA+PiA2ICYgMTAyMCkgPj4gMl0gPDwgOCBeIEhFQVBbKHMgfCB4MyA8PCAyICYgMTAyMCkgPj4gMl0gXiBIRUFQWyhrIHwgaSB8IDApID4+IDJdLCBTMSA9IEhFQVBbKHMgfCB4MSA+PiAyMiAmIDEwMjApID4+IDJdIDw8IDI0IF4gSEVBUFsocyB8IHgyID4+IDE0ICYgMTAyMCkgPj4gMl0gPDwgMTYgXiBIRUFQWyhzIHwgeDMgPj4gNiAmIDEwMjApID4+IDJdIDw8IDggXiBIRUFQWyhzIHwgeDAgPDwgMiAmIDEwMjApID4+IDJdIF4gSEVBUFsoayB8IGkgfCA0KSA+PiAyXSwgUzIgPSBIRUFQWyhzIHwgeDIgPj4gMjIgJiAxMDIwKSA+PiAyXSA8PCAyNCBeIEhFQVBbKHMgfCB4MyA+PiAxNCAmIDEwMjApID4+IDJdIDw8IDE2IF4gSEVBUFsocyB8IHgwID4+IDYgJiAxMDIwKSA+PiAyXSA8PCA4IF4gSEVBUFsocyB8IHgxIDw8IDIgJiAxMDIwKSA+PiAyXSBeIEhFQVBbKGsgfCBpIHwgOCkgPj4gMl0sIFMzID0gSEVBUFsocyB8IHgzID4+IDIyICYgMTAyMCkgPj4gMl0gPDwgMjQgXiBIRUFQWyhzIHwgeDAgPj4gMTQgJiAxMDIwKSA+PiAyXSA8PCAxNiBeIEhFQVBbKHMgfCB4MSA+PiA2ICYgMTAyMCkgPj4gMl0gPDwgOCBeIEhFQVBbKHMgfCB4MiA8PCAyICYgMTAyMCkgPj4gMl0gXiBIRUFQWyhrIHwgaSB8IDEyKSA+PiAyXTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBFQ0IgbW9kZSBlbmNyeXB0aW9uXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0geDAgLSAxMjgtYml0IGlucHV0IGJsb2NrIHZlY3RvclxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHgxIC0gMTI4LWJpdCBpbnB1dCBibG9jayB2ZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MiAtIDEyOC1iaXQgaW5wdXQgYmxvY2sgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0geDMgLSAxMjgtYml0IGlucHV0IGJsb2NrIHZlY3RvclxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBfZWNiX2VuYyh4MCwgeDEsIHgyLCB4Mykge1xuICAgICAgICB4MCA9IHgwIHwgMDtcbiAgICAgICAgeDEgPSB4MSB8IDA7XG4gICAgICAgIHgyID0geDIgfCAwO1xuICAgICAgICB4MyA9IHgzIHwgMDtcblxuICAgICAgICBfY29yZSgweDAwMDAsIDB4MDgwMCwgMHgxMDAwLCBSLCB4MCwgeDEsIHgyLCB4Myk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogRUNCIG1vZGUgZGVjcnlwdGlvblxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHgwIC0gMTI4LWJpdCBpbnB1dCBibG9jayB2ZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MSAtIDEyOC1iaXQgaW5wdXQgYmxvY2sgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0geDIgLSAxMjgtYml0IGlucHV0IGJsb2NrIHZlY3RvclxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHgzIC0gMTI4LWJpdCBpbnB1dCBibG9jayB2ZWN0b3JcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gX2VjYl9kZWMoeDAsIHgxLCB4MiwgeDMpIHtcbiAgICAgICAgeDAgPSB4MCB8IDA7XG4gICAgICAgIHgxID0geDEgfCAwO1xuICAgICAgICB4MiA9IHgyIHwgMDtcbiAgICAgICAgeDMgPSB4MyB8IDA7XG5cbiAgICAgICAgdmFyIHQgPSAwO1xuXG4gICAgICAgIF9jb3JlKDB4MDQwMCwgMHgwYzAwLCAweDIwMDAsIFIsIHgwLCB4MywgeDIsIHgxKTtcblxuICAgICAgICB0ID0gUzEsIFMxID0gUzMsIFMzID0gdDtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBDQkMgbW9kZSBlbmNyeXB0aW9uXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0geDAgLSAxMjgtYml0IGlucHV0IGJsb2NrIHZlY3RvclxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHgxIC0gMTI4LWJpdCBpbnB1dCBibG9jayB2ZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MiAtIDEyOC1iaXQgaW5wdXQgYmxvY2sgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0geDMgLSAxMjgtYml0IGlucHV0IGJsb2NrIHZlY3RvclxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBfY2JjX2VuYyh4MCwgeDEsIHgyLCB4Mykge1xuICAgICAgICB4MCA9IHgwIHwgMDtcbiAgICAgICAgeDEgPSB4MSB8IDA7XG4gICAgICAgIHgyID0geDIgfCAwO1xuICAgICAgICB4MyA9IHgzIHwgMDtcblxuICAgICAgICBfY29yZSgweDAwMDAsIDB4MDgwMCwgMHgxMDAwLCBSLCBJMCBeIHgwLCBJMSBeIHgxLCBJMiBeIHgyLCBJMyBeIHgzKTtcblxuICAgICAgICBJMCA9IFMwLCBJMSA9IFMxLCBJMiA9IFMyLCBJMyA9IFMzO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIENCQyBtb2RlIGRlY3J5cHRpb25cbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MCAtIDEyOC1iaXQgaW5wdXQgYmxvY2sgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0geDEgLSAxMjgtYml0IGlucHV0IGJsb2NrIHZlY3RvclxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHgyIC0gMTI4LWJpdCBpbnB1dCBibG9jayB2ZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MyAtIDEyOC1iaXQgaW5wdXQgYmxvY2sgdmVjdG9yXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIF9jYmNfZGVjKHgwLCB4MSwgeDIsIHgzKSB7XG4gICAgICAgIHgwID0geDAgfCAwO1xuICAgICAgICB4MSA9IHgxIHwgMDtcbiAgICAgICAgeDIgPSB4MiB8IDA7XG4gICAgICAgIHgzID0geDMgfCAwO1xuXG4gICAgICAgIHZhciB0ID0gMDtcblxuICAgICAgICBfY29yZSgweDA0MDAsIDB4MGMwMCwgMHgyMDAwLCBSLCB4MCwgeDMsIHgyLCB4MSk7XG5cbiAgICAgICAgdCA9IFMxLCBTMSA9IFMzLCBTMyA9IHQ7XG5cbiAgICAgICAgUzAgPSBTMCBeIEkwLCBTMSA9IFMxIF4gSTEsIFMyID0gUzIgXiBJMiwgUzMgPSBTMyBeIEkzO1xuXG4gICAgICAgIEkwID0geDAsIEkxID0geDEsIEkyID0geDIsIEkzID0geDM7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogQ0ZCIG1vZGUgZW5jcnlwdGlvblxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHgwIC0gMTI4LWJpdCBpbnB1dCBibG9jayB2ZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MSAtIDEyOC1iaXQgaW5wdXQgYmxvY2sgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0geDIgLSAxMjgtYml0IGlucHV0IGJsb2NrIHZlY3RvclxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHgzIC0gMTI4LWJpdCBpbnB1dCBibG9jayB2ZWN0b3JcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gX2NmYl9lbmMoeDAsIHgxLCB4MiwgeDMpIHtcbiAgICAgICAgeDAgPSB4MCB8IDA7XG4gICAgICAgIHgxID0geDEgfCAwO1xuICAgICAgICB4MiA9IHgyIHwgMDtcbiAgICAgICAgeDMgPSB4MyB8IDA7XG5cbiAgICAgICAgX2NvcmUoMHgwMDAwLCAweDA4MDAsIDB4MTAwMCwgUiwgSTAsIEkxLCBJMiwgSTMpO1xuXG4gICAgICAgIEkwID0gUzAgPSBTMCBeIHgwLCBJMSA9IFMxID0gUzEgXiB4MSwgSTIgPSBTMiA9IFMyIF4geDIsIEkzID0gUzMgPSBTMyBeIHgzO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIENGQiBtb2RlIGRlY3J5cHRpb25cbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MCAtIDEyOC1iaXQgaW5wdXQgYmxvY2sgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0geDEgLSAxMjgtYml0IGlucHV0IGJsb2NrIHZlY3RvclxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHgyIC0gMTI4LWJpdCBpbnB1dCBibG9jayB2ZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MyAtIDEyOC1iaXQgaW5wdXQgYmxvY2sgdmVjdG9yXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIF9jZmJfZGVjKHgwLCB4MSwgeDIsIHgzKSB7XG4gICAgICAgIHgwID0geDAgfCAwO1xuICAgICAgICB4MSA9IHgxIHwgMDtcbiAgICAgICAgeDIgPSB4MiB8IDA7XG4gICAgICAgIHgzID0geDMgfCAwO1xuXG4gICAgICAgIF9jb3JlKDB4MDAwMCwgMHgwODAwLCAweDEwMDAsIFIsIEkwLCBJMSwgSTIsIEkzKTtcblxuICAgICAgICBTMCA9IFMwIF4geDAsIFMxID0gUzEgXiB4MSwgUzIgPSBTMiBeIHgyLCBTMyA9IFMzIF4geDM7XG5cbiAgICAgICAgSTAgPSB4MCwgSTEgPSB4MSwgSTIgPSB4MiwgSTMgPSB4MztcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBPRkIgbW9kZSBlbmNyeXB0aW9uIC8gZGVjcnlwdGlvblxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHgwIC0gMTI4LWJpdCBpbnB1dCBibG9jayB2ZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MSAtIDEyOC1iaXQgaW5wdXQgYmxvY2sgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0geDIgLSAxMjgtYml0IGlucHV0IGJsb2NrIHZlY3RvclxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHgzIC0gMTI4LWJpdCBpbnB1dCBibG9jayB2ZWN0b3JcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gX29mYih4MCwgeDEsIHgyLCB4Mykge1xuICAgICAgICB4MCA9IHgwIHwgMDtcbiAgICAgICAgeDEgPSB4MSB8IDA7XG4gICAgICAgIHgyID0geDIgfCAwO1xuICAgICAgICB4MyA9IHgzIHwgMDtcblxuICAgICAgICBfY29yZSgweDAwMDAsIDB4MDgwMCwgMHgxMDAwLCBSLCBJMCwgSTEsIEkyLCBJMyk7XG5cbiAgICAgICAgSTAgPSBTMCwgSTEgPSBTMSwgSTIgPSBTMiwgSTMgPSBTMztcblxuICAgICAgICBTMCA9IFMwIF4geDAsIFMxID0gUzEgXiB4MSwgUzIgPSBTMiBeIHgyLCBTMyA9IFMzIF4geDM7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogQ1RSIG1vZGUgZW5jcnlwdGlvbiAvIGRlY3J5cHRpb25cbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MCAtIDEyOC1iaXQgaW5wdXQgYmxvY2sgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0geDEgLSAxMjgtYml0IGlucHV0IGJsb2NrIHZlY3RvclxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHgyIC0gMTI4LWJpdCBpbnB1dCBibG9jayB2ZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MyAtIDEyOC1iaXQgaW5wdXQgYmxvY2sgdmVjdG9yXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIF9jdHIoeDAsIHgxLCB4MiwgeDMpIHtcbiAgICAgICAgeDAgPSB4MCB8IDA7XG4gICAgICAgIHgxID0geDEgfCAwO1xuICAgICAgICB4MiA9IHgyIHwgMDtcbiAgICAgICAgeDMgPSB4MyB8IDA7XG5cbiAgICAgICAgX2NvcmUoMHgwMDAwLCAweDA4MDAsIDB4MTAwMCwgUiwgTjAsIE4xLCBOMiwgTjMpO1xuXG4gICAgICAgIE4zID0gfk0zICYgTjMgfCBNMyAmIE4zICsgMTtcbiAgICAgICAgTjIgPSB+TTIgJiBOMiB8IE0yICYgTjIgKyAoKE4zIHwgMCkgPT0gMCk7XG4gICAgICAgIE4xID0gfk0xICYgTjEgfCBNMSAmIE4xICsgKChOMiB8IDApID09IDApO1xuICAgICAgICBOMCA9IH5NMCAmIE4wIHwgTTAgJiBOMCArICgoTjEgfCAwKSA9PSAwKTtcblxuICAgICAgICBTMCA9IFMwIF4geDA7XG4gICAgICAgIFMxID0gUzEgXiB4MTtcbiAgICAgICAgUzIgPSBTMiBeIHgyO1xuICAgICAgICBTMyA9IFMzIF4geDM7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogR0NNIG1vZGUgTUFDIGNhbGN1bGF0aW9uXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0geDAgLSAxMjgtYml0IGlucHV0IGJsb2NrIHZlY3RvclxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHgxIC0gMTI4LWJpdCBpbnB1dCBibG9jayB2ZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MiAtIDEyOC1iaXQgaW5wdXQgYmxvY2sgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0geDMgLSAxMjgtYml0IGlucHV0IGJsb2NrIHZlY3RvclxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBfZ2NtX21hYyh4MCwgeDEsIHgyLCB4Mykge1xuICAgICAgICB4MCA9IHgwIHwgMDtcbiAgICAgICAgeDEgPSB4MSB8IDA7XG4gICAgICAgIHgyID0geDIgfCAwO1xuICAgICAgICB4MyA9IHgzIHwgMDtcblxuICAgICAgICB2YXIgeTAgPSAwLFxuICAgICAgICAgICAgeTEgPSAwLFxuICAgICAgICAgICAgeTIgPSAwLFxuICAgICAgICAgICAgeTMgPSAwLFxuICAgICAgICAgICAgejAgPSAwLFxuICAgICAgICAgICAgejEgPSAwLFxuICAgICAgICAgICAgejIgPSAwLFxuICAgICAgICAgICAgejMgPSAwLFxuICAgICAgICAgICAgaSA9IDAsXG4gICAgICAgICAgICBjID0gMDtcblxuICAgICAgICB4MCA9IHgwIF4gSTAsIHgxID0geDEgXiBJMSwgeDIgPSB4MiBeIEkyLCB4MyA9IHgzIF4gSTM7XG5cbiAgICAgICAgeTAgPSBIMCB8IDAsIHkxID0gSDEgfCAwLCB5MiA9IEgyIHwgMCwgeTMgPSBIMyB8IDA7XG5cbiAgICAgICAgZm9yICg7IChpIHwgMCkgPCAxMjg7IGkgPSBpICsgMSB8IDApIHtcbiAgICAgICAgICBpZiAoeTAgPj4+IDMxKSB7XG4gICAgICAgICAgICB6MCA9IHowIF4geDAsIHoxID0gejEgXiB4MSwgejIgPSB6MiBeIHgyLCB6MyA9IHozIF4geDM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgeTAgPSB5MCA8PCAxIHwgeTEgPj4+IDMxLCB5MSA9IHkxIDw8IDEgfCB5MiA+Pj4gMzEsIHkyID0geTIgPDwgMSB8IHkzID4+PiAzMSwgeTMgPSB5MyA8PCAxO1xuXG4gICAgICAgICAgYyA9IHgzICYgMTtcblxuICAgICAgICAgIHgzID0geDMgPj4+IDEgfCB4MiA8PCAzMSwgeDIgPSB4MiA+Pj4gMSB8IHgxIDw8IDMxLCB4MSA9IHgxID4+PiAxIHwgeDAgPDwgMzEsIHgwID0geDAgPj4+IDE7XG5cbiAgICAgICAgICBpZiAoYykgeDAgPSB4MCBeIDB4ZTEwMDAwMDA7XG4gICAgICAgIH1cblxuICAgICAgICBJMCA9IHowLCBJMSA9IHoxLCBJMiA9IHoyLCBJMyA9IHozO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFNldCB0aGUgaW50ZXJuYWwgcm91bmRzIG51bWJlci5cbiAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICogQG1lbWJlcm9mIEFFU19hc21cbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSByIC0gbnVtYmVyIGlmIGlubmVyIEFFUyByb3VuZHNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gc2V0X3JvdW5kcyhyKSB7XG4gICAgICAgIHIgPSByIHwgMDtcbiAgICAgICAgUiA9IHI7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogUG9wdWxhdGUgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBtb2R1bGUuXG4gICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAqIEBtZW1iZXJvZiBBRVNfYXNtXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gczAgLSBzdGF0ZSB2ZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzMSAtIHN0YXRlIHZlY3RvclxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHMyIC0gc3RhdGUgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gczMgLSBzdGF0ZSB2ZWN0b3JcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gc2V0X3N0YXRlKHMwLCBzMSwgczIsIHMzKSB7XG4gICAgICAgIHMwID0gczAgfCAwO1xuICAgICAgICBzMSA9IHMxIHwgMDtcbiAgICAgICAgczIgPSBzMiB8IDA7XG4gICAgICAgIHMzID0gczMgfCAwO1xuXG4gICAgICAgIFMwID0gczAsIFMxID0gczEsIFMyID0gczIsIFMzID0gczM7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogUG9wdWxhdGUgdGhlIGludGVybmFsIGl2IG9mIHRoZSBtb2R1bGUuXG4gICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAqIEBtZW1iZXJvZiBBRVNfYXNtXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gaTAgLSBpdiB2ZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpMSAtIGl2IHZlY3RvclxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGkyIC0gaXYgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gaTMgLSBpdiB2ZWN0b3JcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gc2V0X2l2KGkwLCBpMSwgaTIsIGkzKSB7XG4gICAgICAgIGkwID0gaTAgfCAwO1xuICAgICAgICBpMSA9IGkxIHwgMDtcbiAgICAgICAgaTIgPSBpMiB8IDA7XG4gICAgICAgIGkzID0gaTMgfCAwO1xuXG4gICAgICAgIEkwID0gaTAsIEkxID0gaTEsIEkyID0gaTIsIEkzID0gaTM7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IG5vbmNlIGZvciBDVFItZmFtaWx5IG1vZGVzLlxuICAgICAgICogQGluc3RhbmNlXG4gICAgICAgKiBAbWVtYmVyb2YgQUVTX2FzbVxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG4wIC0gbm9uY2UgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gbjEgLSBub25jZSB2ZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuMiAtIG5vbmNlIHZlY3RvclxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG4zIC0gbm9uY2UgdmVjdG9yXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIHNldF9ub25jZShuMCwgbjEsIG4yLCBuMykge1xuICAgICAgICBuMCA9IG4wIHwgMDtcbiAgICAgICAgbjEgPSBuMSB8IDA7XG4gICAgICAgIG4yID0gbjIgfCAwO1xuICAgICAgICBuMyA9IG4zIHwgMDtcblxuICAgICAgICBOMCA9IG4wLCBOMSA9IG4xLCBOMiA9IG4yLCBOMyA9IG4zO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBjb3VudGVyIG1hc2sgZm9yIENUUi1mYW1pbHkgbW9kZXMuXG4gICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAqIEBtZW1iZXJvZiBBRVNfYXNtXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gbTAgLSBjb3VudGVyIG1hc2sgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gbTEgLSBjb3VudGVyIG1hc2sgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gbTIgLSBjb3VudGVyIG1hc2sgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gbTMgLSBjb3VudGVyIG1hc2sgdmVjdG9yXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIHNldF9tYXNrKG0wLCBtMSwgbTIsIG0zKSB7XG4gICAgICAgIG0wID0gbTAgfCAwO1xuICAgICAgICBtMSA9IG0xIHwgMDtcbiAgICAgICAgbTIgPSBtMiB8IDA7XG4gICAgICAgIG0zID0gbTMgfCAwO1xuXG4gICAgICAgIE0wID0gbTAsIE0xID0gbTEsIE0yID0gbTIsIE0zID0gbTM7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGNvdW50ZXIgZm9yIENUUi1mYW1pbHkgbW9kZXMuXG4gICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAqIEBtZW1iZXJvZiBBRVNfYXNtXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gYzAgLSBjb3VudGVyIHZlY3RvclxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGMxIC0gY291bnRlciB2ZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjMiAtIGNvdW50ZXIgdmVjdG9yXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gYzMgLSBjb3VudGVyIHZlY3RvclxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBzZXRfY291bnRlcihjMCwgYzEsIGMyLCBjMykge1xuICAgICAgICBjMCA9IGMwIHwgMDtcbiAgICAgICAgYzEgPSBjMSB8IDA7XG4gICAgICAgIGMyID0gYzIgfCAwO1xuICAgICAgICBjMyA9IGMzIHwgMDtcblxuICAgICAgICBOMyA9IH5NMyAmIE4zIHwgTTMgJiBjMywgTjIgPSB+TTIgJiBOMiB8IE0yICYgYzIsIE4xID0gfk0xICYgTjEgfCBNMSAmIGMxLCBOMCA9IH5NMCAmIE4wIHwgTTAgJiBjMDtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBTdG9yZSB0aGUgaW50ZXJuYWwgc3RhdGUgdmVjdG9yIGludG8gdGhlIGhlYXAuXG4gICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAqIEBtZW1iZXJvZiBBRVNfYXNtXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gcG9zIC0gb2Zmc2V0IHdoZXJlIHRvIHB1dCB0aGUgZGF0YVxuICAgICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGhhdmUgYmVlbiB3cml0dGVuIGludG8gdGhlIGhlYXAsIGFsd2F5cyAxNi5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gZ2V0X3N0YXRlKHBvcykge1xuICAgICAgICBwb3MgPSBwb3MgfCAwO1xuXG4gICAgICAgIGlmIChwb3MgJiAxNSkgcmV0dXJuIC0xO1xuXG4gICAgICAgIERBVEFbcG9zIHwgMF0gPSBTMCA+Pj4gMjQsIERBVEFbcG9zIHwgMV0gPSBTMCA+Pj4gMTYgJiAyNTUsIERBVEFbcG9zIHwgMl0gPSBTMCA+Pj4gOCAmIDI1NSwgREFUQVtwb3MgfCAzXSA9IFMwICYgMjU1LCBEQVRBW3BvcyB8IDRdID0gUzEgPj4+IDI0LCBEQVRBW3BvcyB8IDVdID0gUzEgPj4+IDE2ICYgMjU1LCBEQVRBW3BvcyB8IDZdID0gUzEgPj4+IDggJiAyNTUsIERBVEFbcG9zIHwgN10gPSBTMSAmIDI1NSwgREFUQVtwb3MgfCA4XSA9IFMyID4+PiAyNCwgREFUQVtwb3MgfCA5XSA9IFMyID4+PiAxNiAmIDI1NSwgREFUQVtwb3MgfCAxMF0gPSBTMiA+Pj4gOCAmIDI1NSwgREFUQVtwb3MgfCAxMV0gPSBTMiAmIDI1NSwgREFUQVtwb3MgfCAxMl0gPSBTMyA+Pj4gMjQsIERBVEFbcG9zIHwgMTNdID0gUzMgPj4+IDE2ICYgMjU1LCBEQVRBW3BvcyB8IDE0XSA9IFMzID4+PiA4ICYgMjU1LCBEQVRBW3BvcyB8IDE1XSA9IFMzICYgMjU1O1xuXG4gICAgICAgIHJldHVybiAxNjtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBTdG9yZSB0aGUgaW50ZXJuYWwgaXYgdmVjdG9yIGludG8gdGhlIGhlYXAuXG4gICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAqIEBtZW1iZXJvZiBBRVNfYXNtXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gcG9zIC0gb2Zmc2V0IHdoZXJlIHRvIHB1dCB0aGUgZGF0YVxuICAgICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGhhdmUgYmVlbiB3cml0dGVuIGludG8gdGhlIGhlYXAsIGFsd2F5cyAxNi5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gZ2V0X2l2KHBvcykge1xuICAgICAgICBwb3MgPSBwb3MgfCAwO1xuXG4gICAgICAgIGlmIChwb3MgJiAxNSkgcmV0dXJuIC0xO1xuXG4gICAgICAgIERBVEFbcG9zIHwgMF0gPSBJMCA+Pj4gMjQsIERBVEFbcG9zIHwgMV0gPSBJMCA+Pj4gMTYgJiAyNTUsIERBVEFbcG9zIHwgMl0gPSBJMCA+Pj4gOCAmIDI1NSwgREFUQVtwb3MgfCAzXSA9IEkwICYgMjU1LCBEQVRBW3BvcyB8IDRdID0gSTEgPj4+IDI0LCBEQVRBW3BvcyB8IDVdID0gSTEgPj4+IDE2ICYgMjU1LCBEQVRBW3BvcyB8IDZdID0gSTEgPj4+IDggJiAyNTUsIERBVEFbcG9zIHwgN10gPSBJMSAmIDI1NSwgREFUQVtwb3MgfCA4XSA9IEkyID4+PiAyNCwgREFUQVtwb3MgfCA5XSA9IEkyID4+PiAxNiAmIDI1NSwgREFUQVtwb3MgfCAxMF0gPSBJMiA+Pj4gOCAmIDI1NSwgREFUQVtwb3MgfCAxMV0gPSBJMiAmIDI1NSwgREFUQVtwb3MgfCAxMl0gPSBJMyA+Pj4gMjQsIERBVEFbcG9zIHwgMTNdID0gSTMgPj4+IDE2ICYgMjU1LCBEQVRBW3BvcyB8IDE0XSA9IEkzID4+PiA4ICYgMjU1LCBEQVRBW3BvcyB8IDE1XSA9IEkzICYgMjU1O1xuXG4gICAgICAgIHJldHVybiAxNjtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBHQ00gaW5pdGlhbGl6YXRpb24uXG4gICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAqIEBtZW1iZXJvZiBBRVNfYXNtXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIGdjbV9pbml0KCkge1xuICAgICAgICBfZWNiX2VuYygwLCAwLCAwLCAwKTtcbiAgICAgICAgSDAgPSBTMCwgSDEgPSBTMSwgSDIgPSBTMiwgSDMgPSBTMztcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBQZXJmb3JtIGNpcGhlcmluZyBvcGVyYXRpb24gb24gdGhlIHN1cHBsaWVkIGRhdGEuXG4gICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAqIEBtZW1iZXJvZiBBRVNfYXNtXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gbW9kZSAtIGJsb2NrIGNpcGhlciBtb2RlIChzZWUge0BsaW5rIEFFU19hc219IG1vZGUgY29uc3RhbnRzKVxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHBvcyAtIG9mZnNldCBvZiB0aGUgZGF0YSBiZWluZyBwcm9jZXNzZWRcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gLSBsZW5ndGggb2YgdGhlIGRhdGEgYmVpbmcgcHJvY2Vzc2VkXG4gICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEFjdHVhbCBhbW91bnQgb2YgZGF0YSBoYXZlIGJlZW4gcHJvY2Vzc2VkLlxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBjaXBoZXIobW9kZSwgcG9zLCBsZW4pIHtcbiAgICAgICAgbW9kZSA9IG1vZGUgfCAwO1xuICAgICAgICBwb3MgPSBwb3MgfCAwO1xuICAgICAgICBsZW4gPSBsZW4gfCAwO1xuXG4gICAgICAgIHZhciByZXQgPSAwO1xuXG4gICAgICAgIGlmIChwb3MgJiAxNSkgcmV0dXJuIC0xO1xuXG4gICAgICAgIHdoaWxlICgobGVuIHwgMCkgPj0gMTYpIHtcbiAgICAgICAgICBfY2lwaGVyX21vZGVzW21vZGUgJiA3XShEQVRBW3BvcyB8IDBdIDw8IDI0IHwgREFUQVtwb3MgfCAxXSA8PCAxNiB8IERBVEFbcG9zIHwgMl0gPDwgOCB8IERBVEFbcG9zIHwgM10sIERBVEFbcG9zIHwgNF0gPDwgMjQgfCBEQVRBW3BvcyB8IDVdIDw8IDE2IHwgREFUQVtwb3MgfCA2XSA8PCA4IHwgREFUQVtwb3MgfCA3XSwgREFUQVtwb3MgfCA4XSA8PCAyNCB8IERBVEFbcG9zIHwgOV0gPDwgMTYgfCBEQVRBW3BvcyB8IDEwXSA8PCA4IHwgREFUQVtwb3MgfCAxMV0sIERBVEFbcG9zIHwgMTJdIDw8IDI0IHwgREFUQVtwb3MgfCAxM10gPDwgMTYgfCBEQVRBW3BvcyB8IDE0XSA8PCA4IHwgREFUQVtwb3MgfCAxNV0pO1xuXG4gICAgICAgICAgREFUQVtwb3MgfCAwXSA9IFMwID4+PiAyNCwgREFUQVtwb3MgfCAxXSA9IFMwID4+PiAxNiAmIDI1NSwgREFUQVtwb3MgfCAyXSA9IFMwID4+PiA4ICYgMjU1LCBEQVRBW3BvcyB8IDNdID0gUzAgJiAyNTUsIERBVEFbcG9zIHwgNF0gPSBTMSA+Pj4gMjQsIERBVEFbcG9zIHwgNV0gPSBTMSA+Pj4gMTYgJiAyNTUsIERBVEFbcG9zIHwgNl0gPSBTMSA+Pj4gOCAmIDI1NSwgREFUQVtwb3MgfCA3XSA9IFMxICYgMjU1LCBEQVRBW3BvcyB8IDhdID0gUzIgPj4+IDI0LCBEQVRBW3BvcyB8IDldID0gUzIgPj4+IDE2ICYgMjU1LCBEQVRBW3BvcyB8IDEwXSA9IFMyID4+PiA4ICYgMjU1LCBEQVRBW3BvcyB8IDExXSA9IFMyICYgMjU1LCBEQVRBW3BvcyB8IDEyXSA9IFMzID4+PiAyNCwgREFUQVtwb3MgfCAxM10gPSBTMyA+Pj4gMTYgJiAyNTUsIERBVEFbcG9zIHwgMTRdID0gUzMgPj4+IDggJiAyNTUsIERBVEFbcG9zIHwgMTVdID0gUzMgJiAyNTU7XG5cbiAgICAgICAgICByZXQgPSByZXQgKyAxNiB8IDAsIHBvcyA9IHBvcyArIDE2IHwgMCwgbGVuID0gbGVuIC0gMTYgfCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldCB8IDA7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogQ2FsY3VsYXRlcyBNQUMgb2YgdGhlIHN1cHBsaWVkIGRhdGEuXG4gICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAqIEBtZW1iZXJvZiBBRVNfYXNtXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gbW9kZSAtIGJsb2NrIGNpcGhlciBtb2RlIChzZWUge0BsaW5rIEFFU19hc219IG1vZGUgY29uc3RhbnRzKVxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHBvcyAtIG9mZnNldCBvZiB0aGUgZGF0YSBiZWluZyBwcm9jZXNzZWRcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gLSBsZW5ndGggb2YgdGhlIGRhdGEgYmVpbmcgcHJvY2Vzc2VkXG4gICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEFjdHVhbCBhbW91bnQgb2YgZGF0YSBoYXZlIGJlZW4gcHJvY2Vzc2VkLlxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBtYWMobW9kZSwgcG9zLCBsZW4pIHtcbiAgICAgICAgbW9kZSA9IG1vZGUgfCAwO1xuICAgICAgICBwb3MgPSBwb3MgfCAwO1xuICAgICAgICBsZW4gPSBsZW4gfCAwO1xuXG4gICAgICAgIHZhciByZXQgPSAwO1xuXG4gICAgICAgIGlmIChwb3MgJiAxNSkgcmV0dXJuIC0xO1xuXG4gICAgICAgIHdoaWxlICgobGVuIHwgMCkgPj0gMTYpIHtcbiAgICAgICAgICBfbWFjX21vZGVzW21vZGUgJiAxXShEQVRBW3BvcyB8IDBdIDw8IDI0IHwgREFUQVtwb3MgfCAxXSA8PCAxNiB8IERBVEFbcG9zIHwgMl0gPDwgOCB8IERBVEFbcG9zIHwgM10sIERBVEFbcG9zIHwgNF0gPDwgMjQgfCBEQVRBW3BvcyB8IDVdIDw8IDE2IHwgREFUQVtwb3MgfCA2XSA8PCA4IHwgREFUQVtwb3MgfCA3XSwgREFUQVtwb3MgfCA4XSA8PCAyNCB8IERBVEFbcG9zIHwgOV0gPDwgMTYgfCBEQVRBW3BvcyB8IDEwXSA8PCA4IHwgREFUQVtwb3MgfCAxMV0sIERBVEFbcG9zIHwgMTJdIDw8IDI0IHwgREFUQVtwb3MgfCAxM10gPDwgMTYgfCBEQVRBW3BvcyB8IDE0XSA8PCA4IHwgREFUQVtwb3MgfCAxNV0pO1xuXG4gICAgICAgICAgcmV0ID0gcmV0ICsgMTYgfCAwLCBwb3MgPSBwb3MgKyAxNiB8IDAsIGxlbiA9IGxlbiAtIDE2IHwgMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQgfCAwO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIEFFUyBjaXBoZXIgbW9kZXMgdGFibGUgKHZpcnVhbCBtZXRob2RzKVxuICAgICAgICovXG4gICAgICB2YXIgX2NpcGhlcl9tb2RlcyA9IFtfZWNiX2VuYywgX2VjYl9kZWMsIF9jYmNfZW5jLCBfY2JjX2RlYywgX2NmYl9lbmMsIF9jZmJfZGVjLCBfb2ZiLCBfY3RyXTtcblxuICAgICAgLyoqXG4gICAgICAgKiBBRVMgTUFDIG1vZGVzIHRhYmxlICh2aXJ1YWwgbWV0aG9kcylcbiAgICAgICAqL1xuICAgICAgdmFyIF9tYWNfbW9kZXMgPSBbX2NiY19lbmMsIF9nY21fbWFjXTtcblxuICAgICAgLyoqXG4gICAgICAgKiBBc20uanMgbW9kdWxlIGV4cG9ydHNcbiAgICAgICAqL1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0X3JvdW5kczogc2V0X3JvdW5kcyxcbiAgICAgICAgc2V0X3N0YXRlOiBzZXRfc3RhdGUsXG4gICAgICAgIHNldF9pdjogc2V0X2l2LFxuICAgICAgICBzZXRfbm9uY2U6IHNldF9ub25jZSxcbiAgICAgICAgc2V0X21hc2s6IHNldF9tYXNrLFxuICAgICAgICBzZXRfY291bnRlcjogc2V0X2NvdW50ZXIsXG4gICAgICAgIGdldF9zdGF0ZTogZ2V0X3N0YXRlLFxuICAgICAgICBnZXRfaXY6IGdldF9pdixcbiAgICAgICAgZ2NtX2luaXQ6IGdjbV9pbml0LFxuICAgICAgICBjaXBoZXI6IGNpcGhlcixcbiAgICAgICAgbWFjOiBtYWNcbiAgICAgIH07XG4gICAgfShzdGRsaWIsIGZvcmVpZ24sIGJ1ZmZlcik7XG5cbiAgICBhc20uc2V0X2tleSA9IHNldF9rZXk7XG5cbiAgICByZXR1cm4gYXNtO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBRVMgZW5jaXBoZXJpbmcgbW9kZSBjb25zdGFudHNcbiAgICogQGVudW0ge251bWJlcn1cbiAgICogQGNvbnN0XG4gICAqL1xuICB3cmFwcGVyLkVOQyA9IHtcbiAgICBFQ0I6IDAsXG4gICAgQ0JDOiAyLFxuICAgIENGQjogNCxcbiAgICBPRkI6IDYsXG4gICAgQ1RSOiA3XG4gIH0sXG5cbiAgLyoqXG4gICAqIEFFUyBkZWNpcGhlcmluZyBtb2RlIGNvbnN0YW50c1xuICAgKiBAZW51bSB7bnVtYmVyfVxuICAgKiBAY29uc3RcbiAgICovXG4gIHdyYXBwZXIuREVDID0ge1xuICAgIEVDQjogMSxcbiAgICBDQkM6IDMsXG4gICAgQ0ZCOiA1LFxuICAgIE9GQjogNixcbiAgICBDVFI6IDdcbiAgfSxcblxuICAvKipcbiAgICogQUVTIE1BQyBtb2RlIGNvbnN0YW50c1xuICAgKiBAZW51bSB7bnVtYmVyfVxuICAgKiBAY29uc3RcbiAgICovXG4gIHdyYXBwZXIuTUFDID0ge1xuICAgIENCQzogMCxcbiAgICBHQ006IDFcbiAgfTtcblxuICAvKipcbiAgICogSGVhcCBkYXRhIG9mZnNldFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAY29uc3RcbiAgICovXG4gIHdyYXBwZXIuSEVBUF9EQVRBID0gMHg0MDAwO1xuXG4gIHJldHVybiB3cmFwcGVyO1xufSgpO1xuXG59LHt9XSwzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuQUVTID0gdW5kZWZpbmVkO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzJyk7XG5cbnZhciBfY3JlYXRlQ2xhc3MzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2xhc3MyKTtcblxudmFyIF9hZXMgPSBfZGVyZXFfKCcuL2Flcy5hc20nKTtcblxudmFyIF91dGlscyA9IF9kZXJlcV8oJy4uL3V0aWxzJyk7XG5cbnZhciBfZXJyb3JzID0gX2RlcmVxXygnLi4vZXJyb3JzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBBRVMgPSBleHBvcnRzLkFFUyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQUVTKGtleSwgaXYsIHBhZGRpbmcsIGhlYXAsIGFzbSkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szLmRlZmF1bHQpKHRoaXMsIEFFUyk7XG5cbiAgICB0aGlzLm5vbmNlID0gbnVsbDtcbiAgICB0aGlzLmNvdW50ZXIgPSAwO1xuICAgIHRoaXMuY291bnRlclNpemUgPSAwO1xuXG4gICAgdGhpcy5oZWFwID0gKDAsIF91dGlscy5faGVhcF9pbml0KShVaW50OEFycmF5LCBoZWFwKS5zdWJhcnJheShfYWVzLkFFU19hc20uSEVBUF9EQVRBKTtcbiAgICB0aGlzLmFzbSA9IGFzbSB8fCAoMCwgX2Flcy5BRVNfYXNtKShudWxsLCB0aGlzLmhlYXAuYnVmZmVyKTtcbiAgICB0aGlzLm1vZGUgPSBudWxsO1xuICAgIHRoaXMua2V5ID0gbnVsbDtcblxuICAgIHRoaXMuQUVTX3Jlc2V0KGtleSwgaXYsIHBhZGRpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5XG4gICAqL1xuXG5cbiAgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQUVTLCBbe1xuICAgIGtleTogJ0FFU19zZXRfa2V5JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gQUVTX3NldF9rZXkoa2V5KSB7XG4gICAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCEoMCwgX3V0aWxzLmlzX2J5dGVzKShrZXkpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW5leHBlY3RlZCBrZXkgdHlwZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGtleWxlbiA9IGtleS5sZW5ndGg7XG4gICAgICAgIGlmIChrZXlsZW4gIT09IDE2ICYmIGtleWxlbiAhPT0gMjQgJiYga2V5bGVuICE9PSAzMikgdGhyb3cgbmV3IF9lcnJvcnMuSWxsZWdhbEFyZ3VtZW50RXJyb3IoJ2lsbGVnYWwga2V5IHNpemUnKTtcblxuICAgICAgICB2YXIga2V5dmlldyA9IG5ldyBEYXRhVmlldyhrZXkuYnVmZmVyLCBrZXkuYnl0ZU9mZnNldCwga2V5LmJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLmFzbS5zZXRfa2V5KGtleWxlbiA+PiAyLCBrZXl2aWV3LmdldFVpbnQzMigwKSwga2V5dmlldy5nZXRVaW50MzIoNCksIGtleXZpZXcuZ2V0VWludDMyKDgpLCBrZXl2aWV3LmdldFVpbnQzMigxMiksIGtleWxlbiA+IDE2ID8ga2V5dmlldy5nZXRVaW50MzIoMTYpIDogMCwga2V5bGVuID4gMTYgPyBrZXl2aWV3LmdldFVpbnQzMigyMCkgOiAwLCBrZXlsZW4gPiAyNCA/IGtleXZpZXcuZ2V0VWludDMyKDI0KSA6IDAsIGtleWxlbiA+IDI0ID8ga2V5dmlldy5nZXRVaW50MzIoMjgpIDogMCk7XG5cbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmtleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleSBpcyByZXF1aXJlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIG1peGluIGluc3RlYWQgb2YgaW5oZXJpdGFuY2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gbm9uY2VcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2NvdW50ZXJdXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplXVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdBRVNfQ1RSX3NldF9vcHRpb25zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gQUVTX0NUUl9zZXRfb3B0aW9ucyhub25jZSwgY291bnRlciwgc2l6ZSkge1xuICAgICAgaWYgKHNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoc2l6ZSA8IDggfHwgc2l6ZSA+IDQ4KSB0aHJvdyBuZXcgX2Vycm9ycy5JbGxlZ2FsQXJndW1lbnRFcnJvcignaWxsZWdhbCBjb3VudGVyIHNpemUnKTtcblxuICAgICAgICB0aGlzLmNvdW50ZXJTaXplID0gc2l6ZTtcblxuICAgICAgICB2YXIgbWFzayA9IE1hdGgucG93KDIsIHNpemUpIC0gMTtcbiAgICAgICAgdGhpcy5hc20uc2V0X21hc2soMCwgMCwgbWFzayAvIDB4MTAwMDAwMDAwIHwgMCwgbWFzayB8IDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb3VudGVyU2l6ZSA9IHNpemUgPSA0ODtcbiAgICAgICAgdGhpcy5hc20uc2V0X21hc2soMCwgMCwgMHhmZmZmLCAweGZmZmZmZmZmKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCEoMCwgX3V0aWxzLmlzX2J5dGVzKShub25jZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1bmV4cGVjdGVkIG5vbmNlIHR5cGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsZW4gPSBub25jZS5sZW5ndGg7XG4gICAgICAgIGlmICghbGVuIHx8IGxlbiA+IDE2KSB0aHJvdyBuZXcgX2Vycm9ycy5JbGxlZ2FsQXJndW1lbnRFcnJvcignaWxsZWdhbCBub25jZSBzaXplJyk7XG5cbiAgICAgICAgdGhpcy5ub25jZSA9IG5vbmNlO1xuXG4gICAgICAgIHZhciB2aWV3ID0gbmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxNikpO1xuICAgICAgICBuZXcgVWludDhBcnJheSh2aWV3LmJ1ZmZlcikuc2V0KG5vbmNlKTtcblxuICAgICAgICB0aGlzLmFzbS5zZXRfbm9uY2Uodmlldy5nZXRVaW50MzIoMCksIHZpZXcuZ2V0VWludDMyKDQpLCB2aWV3LmdldFVpbnQzMig4KSwgdmlldy5nZXRVaW50MzIoMTIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbm9uY2UgaXMgcmVxdWlyZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvdW50ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoISgwLCBfdXRpbHMuaXNfbnVtYmVyKShjb3VudGVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigndW5leHBlY3RlZCBjb3VudGVyIHR5cGUnKTtcblxuICAgICAgICBpZiAoY291bnRlciA8IDAgfHwgY291bnRlciA+PSBNYXRoLnBvdygyLCBzaXplKSkgdGhyb3cgbmV3IF9lcnJvcnMuSWxsZWdhbEFyZ3VtZW50RXJyb3IoJ2lsbGVnYWwgY291bnRlciB2YWx1ZScpO1xuXG4gICAgICAgIHRoaXMuY291bnRlciA9IGNvdW50ZXI7XG5cbiAgICAgICAgdGhpcy5hc20uc2V0X2NvdW50ZXIoMCwgMCwgY291bnRlciAvIDB4MTAwMDAwMDAwIHwgMCwgY291bnRlciB8IDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb3VudGVyID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGl2XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0FFU19zZXRfaXYnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBBRVNfc2V0X2l2KGl2KSB7XG4gICAgICBpZiAoaXYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoISgwLCBfdXRpbHMuaXNfYnl0ZXMpKGl2KSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VuZXhwZWN0ZWQgaXYgdHlwZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl2Lmxlbmd0aCAhPT0gMTYpIHRocm93IG5ldyBfZXJyb3JzLklsbGVnYWxBcmd1bWVudEVycm9yKCdpbGxlZ2FsIGl2IHNpemUnKTtcblxuICAgICAgICB2YXIgaXZ2aWV3ID0gbmV3IERhdGFWaWV3KGl2LmJ1ZmZlciwgaXYuYnl0ZU9mZnNldCwgaXYuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgdGhpcy5pdiA9IGl2O1xuICAgICAgICB0aGlzLmFzbS5zZXRfaXYoaXZ2aWV3LmdldFVpbnQzMigwKSwgaXZ2aWV3LmdldFVpbnQzMig0KSwgaXZ2aWV3LmdldFVpbnQzMig4KSwgaXZ2aWV3LmdldFVpbnQzMigxMikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pdiA9IG51bGw7XG4gICAgICAgIHRoaXMuYXNtLnNldF9pdigwLCAwLCAwLCAwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhZGRpbmdcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnQUVTX3NldF9wYWRkaW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gQUVTX3NldF9wYWRkaW5nKHBhZGRpbmcpIHtcbiAgICAgIGlmIChwYWRkaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5wYWRkaW5nID0gISFwYWRkaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wYWRkaW5nID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGtleVxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gW2l2XVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhZGRpbmddXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0FFU19yZXNldCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIEFFU19yZXNldChrZXksIGl2LCBwYWRkaW5nKSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IG51bGw7XG4gICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICB0aGlzLmxlbiA9IDA7XG5cbiAgICAgIHRoaXMuQUVTX3NldF9rZXkoa2V5KTtcbiAgICAgIHRoaXMuQUVTX3NldF9pdihpdik7XG4gICAgICB0aGlzLkFFU19zZXRfcGFkZGluZyhwYWRkaW5nKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0FFU19FbmNyeXB0X3Byb2Nlc3MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBBRVNfRW5jcnlwdF9wcm9jZXNzKGRhdGEpIHtcbiAgICAgIGlmICghKDAsIF91dGlscy5pc19ieXRlcykoZGF0YSkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJkYXRhIGlzbid0IG9mIGV4cGVjdGVkIHR5cGVcIik7XG5cbiAgICAgIHZhciBhc20gPSB0aGlzLmFzbSxcbiAgICAgICAgICBoZWFwID0gdGhpcy5oZWFwLFxuICAgICAgICAgIGFtb2RlID0gX2Flcy5BRVNfYXNtLkVOQ1t0aGlzLm1vZGVdLFxuICAgICAgICAgIGhwb3MgPSBfYWVzLkFFU19hc20uSEVBUF9EQVRBLFxuICAgICAgICAgIHBvcyA9IHRoaXMucG9zLFxuICAgICAgICAgIGxlbiA9IHRoaXMubGVuLFxuICAgICAgICAgIGRwb3MgPSAwLFxuICAgICAgICAgIGRsZW4gPSBkYXRhLmxlbmd0aCB8fCAwLFxuICAgICAgICAgIHJwb3MgPSAwLFxuICAgICAgICAgIHJsZW4gPSBsZW4gKyBkbGVuICYgLTE2LFxuICAgICAgICAgIHdsZW4gPSAwO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkocmxlbik7XG5cbiAgICAgIHdoaWxlIChkbGVuID4gMCkge1xuICAgICAgICB3bGVuID0gKDAsIF91dGlscy5faGVhcF93cml0ZSkoaGVhcCwgcG9zICsgbGVuLCBkYXRhLCBkcG9zLCBkbGVuKTtcbiAgICAgICAgbGVuICs9IHdsZW47XG4gICAgICAgIGRwb3MgKz0gd2xlbjtcbiAgICAgICAgZGxlbiAtPSB3bGVuO1xuXG4gICAgICAgIHdsZW4gPSBhc20uY2lwaGVyKGFtb2RlLCBocG9zICsgcG9zLCBsZW4pO1xuXG4gICAgICAgIGlmICh3bGVuKSByZXN1bHQuc2V0KGhlYXAuc3ViYXJyYXkocG9zLCBwb3MgKyB3bGVuKSwgcnBvcyk7XG4gICAgICAgIHJwb3MgKz0gd2xlbjtcblxuICAgICAgICBpZiAod2xlbiA8IGxlbikge1xuICAgICAgICAgIHBvcyArPSB3bGVuO1xuICAgICAgICAgIGxlbiAtPSB3bGVuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBvcyA9IDA7XG4gICAgICAgICAgbGVuID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbiAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgdGhpcy5sZW4gPSBsZW47XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdBRVNfRW5jcnlwdF9maW5pc2gnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBBRVNfRW5jcnlwdF9maW5pc2goZGF0YSkge1xuICAgICAgdmFyIHByZXN1bHQgPSBudWxsLFxuICAgICAgICAgIHBybGVuID0gMDtcblxuICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcmVzdWx0ID0gdGhpcy5BRVNfRW5jcnlwdF9wcm9jZXNzKGRhdGEpLnJlc3VsdDtcbiAgICAgICAgcHJsZW4gPSBwcmVzdWx0Lmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgdmFyIGFzbSA9IHRoaXMuYXNtLFxuICAgICAgICAgIGhlYXAgPSB0aGlzLmhlYXAsXG4gICAgICAgICAgYW1vZGUgPSBfYWVzLkFFU19hc20uRU5DW3RoaXMubW9kZV0sXG4gICAgICAgICAgaHBvcyA9IF9hZXMuQUVTX2FzbS5IRUFQX0RBVEEsXG4gICAgICAgICAgcG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgbGVuID0gdGhpcy5sZW4sXG4gICAgICAgICAgcGxlbiA9IDE2IC0gbGVuICUgMTYsXG4gICAgICAgICAgcmxlbiA9IGxlbjtcblxuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ3BhZGRpbmcnKSkge1xuICAgICAgICBpZiAodGhpcy5wYWRkaW5nKSB7XG4gICAgICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBwbGVuOyArK3ApIHtcbiAgICAgICAgICAgIGhlYXBbcG9zICsgbGVuICsgcF0gPSBwbGVuO1xuICAgICAgICAgIH1sZW4gKz0gcGxlbjtcbiAgICAgICAgICBybGVuID0gbGVuO1xuICAgICAgICB9IGVsc2UgaWYgKGxlbiAlIDE2KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IF9lcnJvcnMuSWxsZWdhbEFyZ3VtZW50RXJyb3IoJ2RhdGEgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZScpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZW4gKz0gcGxlbjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KHBybGVuICsgcmxlbik7XG5cbiAgICAgIGlmIChwcmxlbikgcmVzdWx0LnNldChwcmVzdWx0KTtcblxuICAgICAgaWYgKGxlbikgYXNtLmNpcGhlcihhbW9kZSwgaHBvcyArIHBvcywgbGVuKTtcblxuICAgICAgaWYgKHJsZW4pIHJlc3VsdC5zZXQoaGVhcC5zdWJhcnJheShwb3MsIHBvcyArIHJsZW4pLCBwcmxlbik7XG5cbiAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgdGhpcy5sZW4gPSAwO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnQUVTX0RlY3J5cHRfcHJvY2VzcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIEFFU19EZWNyeXB0X3Byb2Nlc3MoZGF0YSkge1xuICAgICAgaWYgKCEoMCwgX3V0aWxzLmlzX2J5dGVzKShkYXRhKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcImRhdGEgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZVwiKTtcblxuICAgICAgdmFyIGFzbSA9IHRoaXMuYXNtLFxuICAgICAgICAgIGhlYXAgPSB0aGlzLmhlYXAsXG4gICAgICAgICAgYW1vZGUgPSBfYWVzLkFFU19hc20uREVDW3RoaXMubW9kZV0sXG4gICAgICAgICAgaHBvcyA9IF9hZXMuQUVTX2FzbS5IRUFQX0RBVEEsXG4gICAgICAgICAgcG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgbGVuID0gdGhpcy5sZW4sXG4gICAgICAgICAgZHBvcyA9IDAsXG4gICAgICAgICAgZGxlbiA9IGRhdGEubGVuZ3RoIHx8IDAsXG4gICAgICAgICAgcnBvcyA9IDAsXG4gICAgICAgICAgcmxlbiA9IGxlbiArIGRsZW4gJiAtMTYsXG4gICAgICAgICAgcGxlbiA9IDAsXG4gICAgICAgICAgd2xlbiA9IDA7XG5cbiAgICAgIGlmICh0aGlzLnBhZGRpbmcpIHtcbiAgICAgICAgcGxlbiA9IGxlbiArIGRsZW4gLSBybGVuIHx8IDE2O1xuICAgICAgICBybGVuIC09IHBsZW47XG4gICAgICB9XG5cbiAgICAgIHZhciByZXN1bHQgPSBuZXcgVWludDhBcnJheShybGVuKTtcblxuICAgICAgd2hpbGUgKGRsZW4gPiAwKSB7XG4gICAgICAgIHdsZW4gPSAoMCwgX3V0aWxzLl9oZWFwX3dyaXRlKShoZWFwLCBwb3MgKyBsZW4sIGRhdGEsIGRwb3MsIGRsZW4pO1xuICAgICAgICBsZW4gKz0gd2xlbjtcbiAgICAgICAgZHBvcyArPSB3bGVuO1xuICAgICAgICBkbGVuIC09IHdsZW47XG5cbiAgICAgICAgd2xlbiA9IGFzbS5jaXBoZXIoYW1vZGUsIGhwb3MgKyBwb3MsIGxlbiAtICghZGxlbiA/IHBsZW4gOiAwKSk7XG5cbiAgICAgICAgaWYgKHdsZW4pIHJlc3VsdC5zZXQoaGVhcC5zdWJhcnJheShwb3MsIHBvcyArIHdsZW4pLCBycG9zKTtcbiAgICAgICAgcnBvcyArPSB3bGVuO1xuXG4gICAgICAgIGlmICh3bGVuIDwgbGVuKSB7XG4gICAgICAgICAgcG9zICs9IHdsZW47XG4gICAgICAgICAgbGVuIC09IHdsZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcG9zID0gMDtcbiAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICB0aGlzLmxlbiA9IGxlbjtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0FFU19EZWNyeXB0X2ZpbmlzaCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIEFFU19EZWNyeXB0X2ZpbmlzaChkYXRhKSB7XG4gICAgICB2YXIgcHJlc3VsdCA9IG51bGwsXG4gICAgICAgICAgcHJsZW4gPSAwO1xuXG4gICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByZXN1bHQgPSB0aGlzLkFFU19EZWNyeXB0X3Byb2Nlc3MoZGF0YSkucmVzdWx0O1xuICAgICAgICBwcmxlbiA9IHByZXN1bHQubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICB2YXIgYXNtID0gdGhpcy5hc20sXG4gICAgICAgICAgaGVhcCA9IHRoaXMuaGVhcCxcbiAgICAgICAgICBhbW9kZSA9IF9hZXMuQUVTX2FzbS5ERUNbdGhpcy5tb2RlXSxcbiAgICAgICAgICBocG9zID0gX2Flcy5BRVNfYXNtLkhFQVBfREFUQSxcbiAgICAgICAgICBwb3MgPSB0aGlzLnBvcyxcbiAgICAgICAgICBsZW4gPSB0aGlzLmxlbixcbiAgICAgICAgICBybGVuID0gbGVuO1xuXG4gICAgICBpZiAobGVuID4gMCkge1xuICAgICAgICBpZiAobGVuICUgMTYpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eSgncGFkZGluZycpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgX2Vycm9ycy5JbGxlZ2FsQXJndW1lbnRFcnJvcignZGF0YSBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxlbiArPSAxNiAtIGxlbiAlIDE2O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFzbS5jaXBoZXIoYW1vZGUsIGhwb3MgKyBwb3MsIGxlbik7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ3BhZGRpbmcnKSAmJiB0aGlzLnBhZGRpbmcpIHtcbiAgICAgICAgICB2YXIgcGFkID0gaGVhcFtwb3MgKyBybGVuIC0gMV07XG4gICAgICAgICAgaWYgKHBhZCA8IDEgfHwgcGFkID4gMTYgfHwgcGFkID4gcmxlbikgdGhyb3cgbmV3IF9lcnJvcnMuU2VjdXJpdHlFcnJvcignYmFkIHBhZGRpbmcnKTtcblxuICAgICAgICAgIHZhciBwY2hlY2sgPSAwO1xuICAgICAgICAgIGZvciAodmFyIGkgPSBwYWQ7IGkgPiAxOyBpLS0pIHtcbiAgICAgICAgICAgIHBjaGVjayB8PSBwYWQgXiBoZWFwW3BvcyArIHJsZW4gLSBpXTtcbiAgICAgICAgICB9aWYgKHBjaGVjaykgdGhyb3cgbmV3IF9lcnJvcnMuU2VjdXJpdHlFcnJvcignYmFkIHBhZGRpbmcnKTtcblxuICAgICAgICAgIHJsZW4gLT0gcGFkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciByZXN1bHQgPSBuZXcgVWludDhBcnJheShwcmxlbiArIHJsZW4pO1xuXG4gICAgICBpZiAocHJsZW4gPiAwKSB7XG4gICAgICAgIHJlc3VsdC5zZXQocHJlc3VsdCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChybGVuID4gMCkge1xuICAgICAgICByZXN1bHQuc2V0KGhlYXAuc3ViYXJyYXkocG9zLCBwb3MgKyBybGVuKSwgcHJsZW4pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbiAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgIHRoaXMubGVuID0gMDtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBBRVM7XG59KCk7XG5cbn0se1wiLi4vZXJyb3JzXCI6MTQsXCIuLi91dGlsc1wiOjE5LFwiLi9hZXMuYXNtXCI6MixcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiOjM2LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI6Mzd9XSw0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuQUVTX0NCQ19EZWNyeXB0ID0gZXhwb3J0cy5BRVNfQ0JDX0VuY3J5cHQgPSBleHBvcnRzLkFFU19DQkMgPSB1bmRlZmluZWQ7XG5cbnZhciBfZ2V0UHJvdG90eXBlT2YgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2dldC1wcm90b3R5cGUtb2YnKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRQcm90b3R5cGVPZik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MnKTtcblxudmFyIF9jcmVhdGVDbGFzczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDbGFzczIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2FlcyA9IF9kZXJlcV8oJy4uL2FlcycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgQUVTX0NCQyA9IGV4cG9ydHMuQUVTX0NCQyA9IGZ1bmN0aW9uIChfQUVTKSB7XG4gICgwLCBfaW5oZXJpdHMzLmRlZmF1bHQpKEFFU19DQkMsIF9BRVMpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGtleVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IFtpdj1udWxsXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwYWRkaW5nPXRydWVdXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gW2hlYXBdXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gW2FzbV1cbiAgICovXG4gIGZ1bmN0aW9uIEFFU19DQkMoa2V5KSB7XG4gICAgdmFyIGl2ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgIHZhciBwYWRkaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuICAgIHZhciBoZWFwID0gYXJndW1lbnRzWzNdO1xuICAgIHZhciBhc20gPSBhcmd1bWVudHNbNF07XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgQUVTX0NCQyk7XG5cbiAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zLmRlZmF1bHQpKHRoaXMsIChBRVNfQ0JDLl9fcHJvdG9fXyB8fCAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KShBRVNfQ0JDKSkuY2FsbCh0aGlzLCBrZXksIGl2LCBwYWRkaW5nLCBoZWFwLCBhc20pKTtcblxuICAgIF90aGlzLm1vZGUgPSAnQ0JDJztcbiAgICBfdGhpcy5CTE9DS19TSVpFID0gMTY7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQUVTX0NCQywgW3tcbiAgICBrZXk6ICdlbmNyeXB0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5jcnlwdChkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfRW5jcnlwdF9maW5pc2goZGF0YSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVjcnlwdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlY3J5cHQoZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuQUVTX0RlY3J5cHRfZmluaXNoKGRhdGEpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQUVTX0NCQztcbn0oX2Flcy5BRVMpOyAvKipcbiAgICAgICAgICAgICAgKiBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgTW9kZSAoQ0JDKVxuICAgICAgICAgICAgICAqL1xuXG5cbnZhciBBRVNfQ0JDX0VuY3J5cHQgPSBleHBvcnRzLkFFU19DQkNfRW5jcnlwdCA9IGZ1bmN0aW9uIChfQUVTX0NCQykge1xuICAoMCwgX2luaGVyaXRzMy5kZWZhdWx0KShBRVNfQ0JDX0VuY3J5cHQsIF9BRVNfQ0JDKTtcblxuICAvKipcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBrZXlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBbaXY9bnVsbF1cbiAgICogQHBhcmFtIHtib29sZWFufSBbcGFkZGluZz10cnVlXVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IFtoZWFwXVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IFthc21dXG4gICAqL1xuICBmdW5jdGlvbiBBRVNfQ0JDX0VuY3J5cHQoa2V5LCBpdiwgcGFkZGluZywgaGVhcCwgYXNtKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgQUVTX0NCQ19FbmNyeXB0KTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMy5kZWZhdWx0KSh0aGlzLCAoQUVTX0NCQ19FbmNyeXB0Ll9fcHJvdG9fXyB8fCAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KShBRVNfQ0JDX0VuY3J5cHQpKS5jYWxsKHRoaXMsIGtleSwgaXYsIHBhZGRpbmcsIGhlYXAsIGFzbSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5XG4gICAqIEByZXR1cm5zIHtBRVNfQ0JDX0VuY3J5cHR9XG4gICAqL1xuXG5cbiAgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQUVTX0NCQ19FbmNyeXB0LCBbe1xuICAgIGtleTogJ3Jlc2V0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfcmVzZXQoa2V5LCBudWxsLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAgICAgKiBAcmV0dXJucyB7QUVTX0NCQ19FbmNyeXB0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdwcm9jZXNzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJvY2VzcyhkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfRW5jcnlwdF9wcm9jZXNzKGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICAgICAqIEByZXR1cm5zIHtBRVNfQ0JDX0VuY3J5cHR9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ZpbmlzaCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmlzaChkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfRW5jcnlwdF9maW5pc2goZGF0YSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBBRVNfQ0JDX0VuY3J5cHQ7XG59KEFFU19DQkMpO1xuXG52YXIgQUVTX0NCQ19EZWNyeXB0ID0gZXhwb3J0cy5BRVNfQ0JDX0RlY3J5cHQgPSBmdW5jdGlvbiAoX0FFU19DQkMyKSB7XG4gICgwLCBfaW5oZXJpdHMzLmRlZmF1bHQpKEFFU19DQkNfRGVjcnlwdCwgX0FFU19DQkMyKTtcblxuICAvKipcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBrZXlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBbaXY9bnVsbF1cbiAgICogQHBhcmFtIHtib29sZWFufSBbcGFkZGluZz10cnVlXVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IFtoZWFwXVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IFthc21dXG4gICAqL1xuICBmdW5jdGlvbiBBRVNfQ0JDX0RlY3J5cHQoa2V5LCBpdiwgcGFkZGluZywgaGVhcCwgYXNtKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgQUVTX0NCQ19EZWNyeXB0KTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMy5kZWZhdWx0KSh0aGlzLCAoQUVTX0NCQ19EZWNyeXB0Ll9fcHJvdG9fXyB8fCAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KShBRVNfQ0JDX0RlY3J5cHQpKS5jYWxsKHRoaXMsIGtleSwgaXYsIHBhZGRpbmcsIGhlYXAsIGFzbSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5XG4gICAqIEByZXR1cm5zIHtBRVNfQ0JDX0RlY3J5cHR9XG4gICAqL1xuXG5cbiAgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQUVTX0NCQ19EZWNyeXB0LCBbe1xuICAgIGtleTogJ3Jlc2V0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfcmVzZXQoa2V5LCBudWxsLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAgICAgKiBAcmV0dXJucyB7QUVTX0NCQ19EZWNyeXB0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdwcm9jZXNzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJvY2VzcyhkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfRGVjcnlwdF9wcm9jZXNzKGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICAgICAqIEByZXR1cm5zIHtBRVNfQ0JDX0RlY3J5cHR9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ZpbmlzaCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmlzaChkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfRGVjcnlwdF9maW5pc2goZGF0YSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBBRVNfQ0JDX0RlY3J5cHQ7XG59KEFFU19DQkMpO1xuXG59LHtcIi4uL2Flc1wiOjMsXCJiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2dldC1wcm90b3R5cGUtb2ZcIjoyOSxcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiOjM2LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI6MzcsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIjozOCxcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCI6Mzl9XSw1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuQUVTX0NCQ19EZWNyeXB0ID0gZXhwb3J0cy5BRVNfQ0JDX0VuY3J5cHQgPSBleHBvcnRzLkFFU19DQkMgPSB1bmRlZmluZWQ7XG5cbnZhciBfZXhwb3J0cyA9IF9kZXJlcV8oJy4uL2V4cG9ydHMnKTtcblxudmFyIF9jYmMgPSBfZGVyZXFfKCcuL2NiYycpO1xuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBrZXlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhZGRpbmddXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IFtpdl1cbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG5mdW5jdGlvbiBBRVNfQ0JDX2VuY3J5cHRfYnl0ZXMoZGF0YSwga2V5LCBwYWRkaW5nLCBpdikge1xuICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ2RhdGEgcmVxdWlyZWQnKTtcbiAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ2tleSByZXF1aXJlZCcpO1xuICByZXR1cm4gbmV3IF9jYmMuQUVTX0NCQyhrZXksIGl2LCBwYWRkaW5nLCBfZXhwb3J0cy5fQUVTX2hlYXBfaW5zdGFuY2UsIF9leHBvcnRzLl9BRVNfYXNtX2luc3RhbmNlKS5lbmNyeXB0KGRhdGEpLnJlc3VsdDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwYWRkaW5nXVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBbaXZdXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuZnVuY3Rpb24gQUVTX0NCQ19kZWNyeXB0X2J5dGVzKGRhdGEsIGtleSwgcGFkZGluZywgaXYpIHtcbiAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdkYXRhIHJlcXVpcmVkJyk7XG4gIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdrZXkgcmVxdWlyZWQnKTtcbiAgcmV0dXJuIG5ldyBfY2JjLkFFU19DQkMoa2V5LCBpdiwgcGFkZGluZywgX2V4cG9ydHMuX0FFU19oZWFwX2luc3RhbmNlLCBfZXhwb3J0cy5fQUVTX2FzbV9pbnN0YW5jZSkuZGVjcnlwdChkYXRhKS5yZXN1bHQ7XG59XG5cbl9jYmMuQUVTX0NCQy5lbmNyeXB0ID0gQUVTX0NCQ19lbmNyeXB0X2J5dGVzO1xuX2NiYy5BRVNfQ0JDLmRlY3J5cHQgPSBBRVNfQ0JDX2RlY3J5cHRfYnl0ZXM7XG5cbmV4cG9ydHMuQUVTX0NCQyA9IF9jYmMuQUVTX0NCQztcbmV4cG9ydHMuQUVTX0NCQ19FbmNyeXB0ID0gX2NiYy5BRVNfQ0JDX0VuY3J5cHQ7XG5leHBvcnRzLkFFU19DQkNfRGVjcnlwdCA9IF9jYmMuQUVTX0NCQ19EZWNyeXB0O1xuXG59LHtcIi4uL2V4cG9ydHNcIjoxMSxcIi4vY2JjXCI6NH1dLDY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5BRVNfQ0ZCX0RlY3J5cHQgPSBleHBvcnRzLkFFU19DRkJfRW5jcnlwdCA9IGV4cG9ydHMuQUVTX0NGQiA9IHVuZGVmaW5lZDtcblxudmFyIF9nZXRQcm90b3R5cGVPZiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZicpO1xuXG52YXIgX2dldFByb3RvdHlwZU9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldFByb3RvdHlwZU9mKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcycpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNsYXNzMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfYWVzID0gX2RlcmVxXygnLi4vYWVzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBBRVNfQ0ZCID0gZXhwb3J0cy5BRVNfQ0ZCID0gZnVuY3Rpb24gKF9BRVMpIHtcbiAgKDAsIF9pbmhlcml0czMuZGVmYXVsdCkoQUVTX0NGQiwgX0FFUyk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5XG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gW2l2XVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IFtoZWFwXVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IFthc21dXG4gICAqL1xuICBmdW5jdGlvbiBBRVNfQ0ZCKGtleSwgaXYsIGhlYXAsIGFzbSkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szLmRlZmF1bHQpKHRoaXMsIEFFU19DRkIpO1xuXG4gICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMy5kZWZhdWx0KSh0aGlzLCAoQUVTX0NGQi5fX3Byb3RvX18gfHwgKDAsIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoQUVTX0NGQikpLmNhbGwodGhpcywga2V5LCBpdiwgdHJ1ZSwgaGVhcCwgYXNtKSk7XG5cbiAgICBkZWxldGUgX3RoaXMucGFkZGluZztcblxuICAgIF90aGlzLm1vZGUgPSAnQ0ZCJztcbiAgICBfdGhpcy5CTE9DS19TSVpFID0gMTY7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQUVTX0NGQiwgW3tcbiAgICBrZXk6ICdlbmNyeXB0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5jcnlwdChkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfRW5jcnlwdF9maW5pc2goZGF0YSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVjcnlwdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlY3J5cHQoZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuQUVTX0RlY3J5cHRfZmluaXNoKGRhdGEpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQUVTX0NGQjtcbn0oX2Flcy5BRVMpOyAvKipcbiAgICAgICAgICAgICAgKiBDaXBoZXIgRmVlZGJhY2sgTW9kZSAoQ0ZCKVxuICAgICAgICAgICAgICAqL1xuXG52YXIgQUVTX0NGQl9FbmNyeXB0ID0gZXhwb3J0cy5BRVNfQ0ZCX0VuY3J5cHQgPSBmdW5jdGlvbiAoX0FFU19DRkIpIHtcbiAgKDAsIF9pbmhlcml0czMuZGVmYXVsdCkoQUVTX0NGQl9FbmNyeXB0LCBfQUVTX0NGQik7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5XG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gW2l2PW51bGxdXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gW2hlYXBdXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gW2FzbV1cbiAgICovXG4gIGZ1bmN0aW9uIEFFU19DRkJfRW5jcnlwdChrZXksIGl2LCBoZWFwLCBhc20pIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBBRVNfQ0ZCX0VuY3J5cHQpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zLmRlZmF1bHQpKHRoaXMsIChBRVNfQ0ZCX0VuY3J5cHQuX19wcm90b19fIHx8ICgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKEFFU19DRkJfRW5jcnlwdCkpLmNhbGwodGhpcywga2V5LCBpdiwgaGVhcCwgYXNtKSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBrZXlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBbaXZdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhZGRpbmddXG4gICAqIEByZXR1cm5zIHtBRVNfQ0ZCX0VuY3J5cHR9XG4gICAqL1xuXG5cbiAgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQUVTX0NGQl9FbmNyeXB0LCBbe1xuICAgIGtleTogJ3Jlc2V0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoa2V5LCBpdiwgcGFkZGluZykge1xuICAgICAgcmV0dXJuIHRoaXMuQUVTX3Jlc2V0KGtleSwgaXYsIHBhZGRpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICAgICAqIEByZXR1cm5zIHtBRVNfQ0ZCX0VuY3J5cHR9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3Byb2Nlc3MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcm9jZXNzKGRhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLkFFU19FbmNyeXB0X3Byb2Nlc3MoZGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhXG4gICAgICogQHJldHVybnMge0FFU19DRkJfRW5jcnlwdH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZmluaXNoJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluaXNoKGRhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLkFFU19FbmNyeXB0X2ZpbmlzaChkYXRhKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEFFU19DRkJfRW5jcnlwdDtcbn0oQUVTX0NGQik7XG5cbnZhciBBRVNfQ0ZCX0RlY3J5cHQgPSBleHBvcnRzLkFFU19DRkJfRGVjcnlwdCA9IGZ1bmN0aW9uIChfQUVTX0NGQjIpIHtcbiAgKDAsIF9pbmhlcml0czMuZGVmYXVsdCkoQUVTX0NGQl9EZWNyeXB0LCBfQUVTX0NGQjIpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGtleVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IFtpdj1udWxsXVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IFtoZWFwXVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IFthc21dXG4gICAqL1xuICBmdW5jdGlvbiBBRVNfQ0ZCX0RlY3J5cHQoa2V5LCBpdiwgaGVhcCwgYXNtKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgQUVTX0NGQl9EZWNyeXB0KTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMy5kZWZhdWx0KSh0aGlzLCAoQUVTX0NGQl9EZWNyeXB0Ll9fcHJvdG9fXyB8fCAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KShBRVNfQ0ZCX0RlY3J5cHQpKS5jYWxsKHRoaXMsIGtleSwgaXYsIGhlYXAsIGFzbSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5XG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gW2l2XVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwYWRkaW5nXVxuICAgKiBAcmV0dXJucyB7QUVTX0NGQl9EZWNyeXB0fVxuICAgKi9cblxuXG4gICgwLCBfY3JlYXRlQ2xhc3MzLmRlZmF1bHQpKEFFU19DRkJfRGVjcnlwdCwgW3tcbiAgICBrZXk6ICdyZXNldCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KGtleSwgaXYsIHBhZGRpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLkFFU19yZXNldChrZXksIGl2LCBwYWRkaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAgICAgKiBAcmV0dXJucyB7QUVTX0NGQl9EZWNyeXB0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdwcm9jZXNzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJvY2VzcyhkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfRGVjcnlwdF9wcm9jZXNzKGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICAgICAqIEByZXR1cm5zIHtBRVNfQ0ZCX0RlY3J5cHR9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ZpbmlzaCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmlzaChkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfRGVjcnlwdF9maW5pc2goZGF0YSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBBRVNfQ0ZCX0RlY3J5cHQ7XG59KEFFU19DRkIpO1xuXG59LHtcIi4uL2Flc1wiOjMsXCJiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2dldC1wcm90b3R5cGUtb2ZcIjoyOSxcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiOjM2LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI6MzcsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIjozOCxcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCI6Mzl9XSw3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuQUVTX0NGQl9EZWNyeXB0ID0gZXhwb3J0cy5BRVNfQ0ZCX0VuY3J5cHQgPSBleHBvcnRzLkFFU19DRkIgPSB1bmRlZmluZWQ7XG5cbnZhciBfZXhwb3J0cyA9IF9kZXJlcV8oJy4uL2V4cG9ydHMnKTtcblxudmFyIF9jZmIgPSBfZGVyZXFfKCcuL2NmYicpO1xuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBrZXlcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gW2l2XVxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbi8qKlxuICogQUVTLUNGQiBleHBvcnRzXG4gKi9cblxuZnVuY3Rpb24gQUVTX0NGQl9lbmNyeXB0X2J5dGVzKGRhdGEsIGtleSwgaXYpIHtcbiAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdkYXRhIHJlcXVpcmVkJyk7XG4gIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdrZXkgcmVxdWlyZWQnKTtcbiAgcmV0dXJuIG5ldyBfY2ZiLkFFU19DRkIoa2V5LCBpdiwgX2V4cG9ydHMuX0FFU19oZWFwX2luc3RhbmNlLCBfZXhwb3J0cy5fQUVTX2FzbV9pbnN0YW5jZSkuZW5jcnlwdChkYXRhKS5yZXN1bHQ7XG59XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGtleVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBbaXZdXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuZnVuY3Rpb24gQUVTX0NGQl9kZWNyeXB0X2J5dGVzKGRhdGEsIGtleSwgaXYpIHtcbiAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdkYXRhIHJlcXVpcmVkJyk7XG4gIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdrZXkgcmVxdWlyZWQnKTtcbiAgcmV0dXJuIG5ldyBfY2ZiLkFFU19DRkIoa2V5LCBpdiwgX2V4cG9ydHMuX0FFU19oZWFwX2luc3RhbmNlLCBfZXhwb3J0cy5fQUVTX2FzbV9pbnN0YW5jZSkuZGVjcnlwdChkYXRhKS5yZXN1bHQ7XG59XG5cbl9jZmIuQUVTX0NGQi5lbmNyeXB0ID0gQUVTX0NGQl9lbmNyeXB0X2J5dGVzO1xuX2NmYi5BRVNfQ0ZCLmRlY3J5cHQgPSBBRVNfQ0ZCX2RlY3J5cHRfYnl0ZXM7XG5cbmV4cG9ydHMuQUVTX0NGQiA9IF9jZmIuQUVTX0NGQjtcbmV4cG9ydHMuQUVTX0NGQl9FbmNyeXB0ID0gX2NmYi5BRVNfQ0ZCX0VuY3J5cHQ7XG5leHBvcnRzLkFFU19DRkJfRGVjcnlwdCA9IF9jZmIuQUVTX0NGQl9EZWNyeXB0O1xuXG59LHtcIi4uL2V4cG9ydHNcIjoxMSxcIi4vY2ZiXCI6Nn1dLDg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5BRVNfQ1RSX0NyeXB0ID0gZXhwb3J0cy5BRVNfQ1RSID0gdW5kZWZpbmVkO1xuXG52YXIgX2dldFByb3RvdHlwZU9mID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mJyk7XG5cbnZhciBfZ2V0UHJvdG90eXBlT2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0UHJvdG90eXBlT2YpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzJyk7XG5cbnZhciBfY3JlYXRlQ2xhc3MzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2xhc3MyKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9hZXMgPSBfZGVyZXFfKCcuLi9hZXMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIEFFU19DVFIgPSBleHBvcnRzLkFFU19DVFIgPSBmdW5jdGlvbiAoX0FFUykge1xuICAoMCwgX2luaGVyaXRzMy5kZWZhdWx0KShBRVNfQ1RSLCBfQUVTKTtcblxuICAvKipcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBrZXlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBub25jZVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IFtoZWFwXVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IFthc21dXG4gICAqL1xuICBmdW5jdGlvbiBBRVNfQ1RSKGtleSwgbm9uY2UsIGhlYXAsIGFzbSkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szLmRlZmF1bHQpKHRoaXMsIEFFU19DVFIpO1xuXG4gICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMy5kZWZhdWx0KSh0aGlzLCAoQUVTX0NUUi5fX3Byb3RvX18gfHwgKDAsIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoQUVTX0NUUikpLmNhbGwodGhpcywga2V5LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaGVhcCwgYXNtKSk7XG5cbiAgICBfdGhpcy5yZXNldChrZXksIG5vbmNlKTtcblxuICAgIF90aGlzLkFFU19DVFJfc2V0X29wdGlvbnMobm9uY2UpO1xuICAgIGRlbGV0ZSBfdGhpcy5wYWRkaW5nO1xuXG4gICAgX3RoaXMubW9kZSA9ICdDVFInO1xuICAgIF90aGlzLkJMT0NLX1NJWkUgPSAxNjtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBrZXlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBub25jZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2NvdW50ZXJdXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbY291bnRlclNpemVdXG4gICAqIEByZXR1cm5zIHtBRVNfQ1RSfVxuICAgKi9cblxuXG4gICgwLCBfY3JlYXRlQ2xhc3MzLmRlZmF1bHQpKEFFU19DVFIsIFt7XG4gICAga2V5OiAncmVzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldChrZXksIG5vbmNlLCBjb3VudGVyLCBjb3VudGVyU2l6ZSkge1xuICAgICAgdGhpcy5BRVNfcmVzZXQoa2V5LCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG5cbiAgICAgIHRoaXMuQUVTX0NUUl9zZXRfb3B0aW9ucyhub25jZSwgY291bnRlciwgY291bnRlclNpemUpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAgICAgKiBAcmV0dXJucyB7QUVTX0NUUn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZW5jcnlwdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuY3J5cHQoZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuQUVTX0VuY3J5cHRfZmluaXNoKGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICAgICAqIEByZXR1cm5zIHtBRVNfQ1RSfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdkZWNyeXB0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVjcnlwdChkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfRW5jcnlwdF9maW5pc2goZGF0YSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBBRVNfQ1RSO1xufShfYWVzLkFFUyk7IC8qKlxuICAgICAgICAgICAgICAqIENvdW50ZXIgTW9kZSAoQ1RSKVxuICAgICAgICAgICAgICAqL1xuXG52YXIgQUVTX0NUUl9DcnlwdCA9IGV4cG9ydHMuQUVTX0NUUl9DcnlwdCA9IGZ1bmN0aW9uIChfQUVTX0NUUikge1xuICAoMCwgX2luaGVyaXRzMy5kZWZhdWx0KShBRVNfQ1RSX0NyeXB0LCBfQUVTX0NUUik7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5XG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gbm9uY2VcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBbaGVhcF1cbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBbYXNtXVxuICAgKi9cbiAgZnVuY3Rpb24gQUVTX0NUUl9DcnlwdChrZXksIG5vbmNlLCBoZWFwLCBhc20pIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBBRVNfQ1RSX0NyeXB0KTtcblxuICAgIHZhciBfdGhpczIgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zLmRlZmF1bHQpKHRoaXMsIChBRVNfQ1RSX0NyeXB0Ll9fcHJvdG9fXyB8fCAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KShBRVNfQ1RSX0NyeXB0KSkuY2FsbCh0aGlzLCBrZXksIG5vbmNlLCBoZWFwLCBhc20pKTtcblxuICAgIF90aGlzMi5CTE9DS19TSVpFID0gMTY7XG4gICAgcmV0dXJuIF90aGlzMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGtleVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IG5vbmNlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbY291bnRlcl1cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtjb3VudGVyU2l6ZV1cbiAgICogQHJldHVybnMge0FFU19DVFJfQ3J5cHR9XG4gICAqL1xuXG5cbiAgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQUVTX0NUUl9DcnlwdCwgW3tcbiAgICBrZXk6ICdyZXNldCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KGtleSwgbm9uY2UsIGNvdW50ZXIsIGNvdW50ZXJTaXplKSB7XG4gICAgICB0aGlzLkFFU19yZXNldChrZXksIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcblxuICAgICAgdGhpcy5BRVNfQ1RSX3NldF9vcHRpb25zKG5vbmNlLCBjb3VudGVyLCBjb3VudGVyU2l6ZSk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICAgICAqIEByZXR1cm5zIHtBRVNfQ1RSX0NyeXB0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdwcm9jZXNzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJvY2VzcyhkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfRW5jcnlwdF9wcm9jZXNzKGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICAgICAqIEByZXR1cm5zIHtBRVNfQ1RSX0NyeXB0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdmaW5pc2gnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5pc2goZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuQUVTX0VuY3J5cHRfZmluaXNoKGRhdGEpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQUVTX0NUUl9DcnlwdDtcbn0oQUVTX0NUUik7XG5cbn0se1wiLi4vYWVzXCI6MyxcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZlwiOjI5LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI6MzYsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjozNyxcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiOjM4LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjozOX1dLDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5BRVNfQ1RSID0gdW5kZWZpbmVkO1xuXG52YXIgX2V4cG9ydHMgPSBfZGVyZXFfKCcuLi9leHBvcnRzJyk7XG5cbnZhciBfY3RyID0gX2RlcmVxXygnLi9jdHInKTtcblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5XG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IG5vbmNlXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuLyoqXG4gKiBBRVMtQ1RSIGV4cG9ydHNcbiAqL1xuXG5mdW5jdGlvbiBBRVNfQ1RSX2NyeXB0X2J5dGVzKGRhdGEsIGtleSwgbm9uY2UpIHtcbiAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdkYXRhIHJlcXVpcmVkJyk7XG4gIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdrZXkgcmVxdWlyZWQnKTtcbiAgaWYgKG5vbmNlID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBTeW50YXhFcnJvcignbm9uY2UgcmVxdWlyZWQnKTtcbiAgcmV0dXJuIG5ldyBfY3RyLkFFU19DVFIoa2V5LCBub25jZSwgX2V4cG9ydHMuX0FFU19oZWFwX2luc3RhbmNlLCBfZXhwb3J0cy5fQUVTX2FzbV9pbnN0YW5jZSkuZW5jcnlwdChkYXRhKS5yZXN1bHQ7XG59XG5cbl9jdHIuQUVTX0NUUi5lbmNyeXB0ID0gQUVTX0NUUl9jcnlwdF9ieXRlcztcbl9jdHIuQUVTX0NUUi5kZWNyeXB0ID0gQUVTX0NUUl9jcnlwdF9ieXRlcztcblxuZXhwb3J0cy5BRVNfQ1RSID0gX2N0ci5BRVNfQ1RSO1xuXG59LHtcIi4uL2V4cG9ydHNcIjoxMSxcIi4vY3RyXCI6OH1dLDEwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuQUVTX0VDQl9EZWNyeXB0ID0gZXhwb3J0cy5BRVNfRUNCX0VuY3J5cHQgPSBleHBvcnRzLkFFU19FQ0IgPSB1bmRlZmluZWQ7XG5cbnZhciBfZ2V0UHJvdG90eXBlT2YgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2dldC1wcm90b3R5cGUtb2YnKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRQcm90b3R5cGVPZik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MnKTtcblxudmFyIF9jcmVhdGVDbGFzczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDbGFzczIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2FlcyA9IF9kZXJlcV8oJy4uL2FlcycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEVsZWN0cm9uaWMgQ29kZSBCb29rIE1vZGUgKEVDQilcbiAqL1xudmFyIEFFU19FQ0IgPSBleHBvcnRzLkFFU19FQ0IgPSBmdW5jdGlvbiAoX0FFUykge1xuICAoMCwgX2luaGVyaXRzMy5kZWZhdWx0KShBRVNfRUNCLCBfQUVTKTtcblxuICAvKipcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBrZXlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBbaGVhcF1cbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBbYXNtXVxuICAgKi9cbiAgZnVuY3Rpb24gQUVTX0VDQihrZXksIGhlYXAsIGFzbSkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szLmRlZmF1bHQpKHRoaXMsIEFFU19FQ0IpO1xuXG4gICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMy5kZWZhdWx0KSh0aGlzLCAoQUVTX0VDQi5fX3Byb3RvX18gfHwgKDAsIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoQUVTX0VDQikpLmNhbGwodGhpcywga2V5LCB1bmRlZmluZWQsIGZhbHNlLCBoZWFwLCBhc20pKTtcblxuICAgIF90aGlzLm1vZGUgPSAnRUNCJztcbiAgICBfdGhpcy5CTE9DS19TSVpFID0gMTY7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQUVTX0VDQiwgW3tcbiAgICBrZXk6ICdlbmNyeXB0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5jcnlwdChkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfRW5jcnlwdF9maW5pc2goZGF0YSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVjcnlwdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlY3J5cHQoZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuQUVTX0RlY3J5cHRfZmluaXNoKGRhdGEpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQUVTX0VDQjtcbn0oX2Flcy5BRVMpO1xuXG52YXIgQUVTX0VDQl9FbmNyeXB0ID0gZXhwb3J0cy5BRVNfRUNCX0VuY3J5cHQgPSBmdW5jdGlvbiAoX0FFU19FQ0IpIHtcbiAgKDAsIF9pbmhlcml0czMuZGVmYXVsdCkoQUVTX0VDQl9FbmNyeXB0LCBfQUVTX0VDQik7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5XG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gW2hlYXBdXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gW2FzbV1cbiAgICovXG4gIGZ1bmN0aW9uIEFFU19FQ0JfRW5jcnlwdChrZXksIGhlYXAsIGFzbSkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szLmRlZmF1bHQpKHRoaXMsIEFFU19FQ0JfRW5jcnlwdCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMuZGVmYXVsdCkodGhpcywgKEFFU19FQ0JfRW5jcnlwdC5fX3Byb3RvX18gfHwgKDAsIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoQUVTX0VDQl9FbmNyeXB0KSkuY2FsbCh0aGlzLCBrZXksIGhlYXAsIGFzbSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5XG4gICAqIEByZXR1cm5zIHtBRVNfRUNCX0VuY3J5cHR9XG4gICAqL1xuXG5cbiAgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQUVTX0VDQl9FbmNyeXB0LCBbe1xuICAgIGtleTogJ3Jlc2V0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfcmVzZXQoa2V5LCBudWxsLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAgICAgKiBAcmV0dXJucyB7QUVTX0VDQl9FbmNyeXB0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdwcm9jZXNzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJvY2VzcyhkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfRW5jcnlwdF9wcm9jZXNzKGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICAgICAqIEByZXR1cm5zIHtBRVNfRUNCX0VuY3J5cHR9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ZpbmlzaCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmlzaChkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5BRVNfRW5jcnlwdF9maW5pc2goZGF0YSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBBRVNfRUNCX0VuY3J5cHQ7XG59KEFFU19FQ0IpO1xuXG52YXIgQUVTX0VDQl9EZWNyeXB0ID0gZXhwb3J0cy5BRVNfRUNCX0RlY3J5cHQgPSBmdW5jdGlvbiAoX0FFU19FQ0IyKSB7XG4gICgwLCBfaW5oZXJpdHMzLmRlZmF1bHQpKEFFU19FQ0JfRGVjcnlwdCwgX0FFU19FQ0IyKTtcblxuICAvKipcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBrZXlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBbaGVhcF1cbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBbYXNtXVxuICAgKi9cbiAgZnVuY3Rpb24gQUVTX0VDQl9EZWNyeXB0KGtleSwgaGVhcCwgYXNtKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgQUVTX0VDQl9EZWNyeXB0KTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMy5kZWZhdWx0KSh0aGlzLCAoQUVTX0VDQl9EZWNyeXB0Ll9fcHJvdG9fXyB8fCAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KShBRVNfRUNCX0RlY3J5cHQpKS5jYWxsKHRoaXMsIGtleSwgaGVhcCwgYXNtKSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBrZXlcbiAgICogQHJldHVybnMge0FFU19FQ0JfRGVjcnlwdH1cbiAgICovXG5cblxuICAoMCwgX2NyZWF0ZUNsYXNzMy5kZWZhdWx0KShBRVNfRUNCX0RlY3J5cHQsIFt7XG4gICAga2V5OiAncmVzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLkFFU19yZXNldChrZXksIG51bGwsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICAgICAqIEByZXR1cm5zIHtBRVNfRUNCX0RlY3J5cHR9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3Byb2Nlc3MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcm9jZXNzKGRhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLkFFU19EZWNyeXB0X3Byb2Nlc3MoZGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhXG4gICAgICogQHJldHVybnMge0FFU19FQ0JfRGVjcnlwdH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZmluaXNoJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluaXNoKGRhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLkFFU19EZWNyeXB0X2ZpbmlzaChkYXRhKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEFFU19FQ0JfRGVjcnlwdDtcbn0oQUVTX0VDQik7XG5cbn0se1wiLi4vYWVzXCI6MyxcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZlwiOjI5LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI6MzYsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjozNyxcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiOjM4LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjozOX1dLDExOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuX0FFU19hc21faW5zdGFuY2UgPSBleHBvcnRzLl9BRVNfaGVhcF9pbnN0YW5jZSA9IHVuZGVmaW5lZDtcblxudmFyIF9hZXMgPSBfZGVyZXFfKCcuL2Flcy5hc20nKTtcblxudmFyIF9BRVNfaGVhcF9pbnN0YW5jZSA9IGV4cG9ydHMuX0FFU19oZWFwX2luc3RhbmNlID0gbmV3IFVpbnQ4QXJyYXkoMHgxMDAwMDApOyAvLyAxTUJcbi8vIHNoYXJlZCBhc20uanMgbW9kdWxlIGFuZCBoZWFwXG52YXIgX0FFU19hc21faW5zdGFuY2UgPSBleHBvcnRzLl9BRVNfYXNtX2luc3RhbmNlID0gKDAsIF9hZXMuQUVTX2FzbSkobnVsbCwgX0FFU19oZWFwX2luc3RhbmNlLmJ1ZmZlcik7XG5cbn0se1wiLi9hZXMuYXNtXCI6Mn1dLDEyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuQUVTX0dDTV9EZWNyeXB0ID0gZXhwb3J0cy5BRVNfR0NNX0VuY3J5cHQgPSBleHBvcnRzLkFFU19HQ00gPSB1bmRlZmluZWQ7XG5cbnZhciBfZXhwb3J0cyA9IF9kZXJlcV8oJy4uL2V4cG9ydHMnKTtcblxudmFyIF9nY20gPSBfZGVyZXFfKCcuL2djbScpO1xuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBrZXlcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gbm9uY2VcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gW2FkYXRhXVxuICogQHBhcmFtIHtudW1iZXJ9IFt0YWdTaXplXVxuICogQHJldHVybiB7VWludDhBcnJheX1cbiAqL1xuLyoqXG4gKiBBRVMtR0NNIGV4cG9ydHNcbiAqL1xuXG5mdW5jdGlvbiBBRVNfR0NNX2VuY3J5cHRfYnl0ZXMoZGF0YSwga2V5LCBub25jZSwgYWRhdGEsIHRhZ1NpemUpIHtcbiAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdkYXRhIHJlcXVpcmVkJyk7XG4gIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdrZXkgcmVxdWlyZWQnKTtcbiAgaWYgKG5vbmNlID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBTeW50YXhFcnJvcignbm9uY2UgcmVxdWlyZWQnKTtcbiAgcmV0dXJuIG5ldyBfZ2NtLkFFU19HQ00oa2V5LCBub25jZSwgYWRhdGEsIHRhZ1NpemUsIF9leHBvcnRzLl9BRVNfaGVhcF9pbnN0YW5jZSwgX2V4cG9ydHMuX0FFU19hc21faW5zdGFuY2UpLmVuY3J5cHQoZGF0YSkucmVzdWx0O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBrZXlcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gbm9uY2VcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gW2FkYXRhXVxuICogQHBhcmFtIHtudW1iZXJ9IFt0YWdTaXplXVxuICogQHJldHVybiB7VWludDhBcnJheX1cbiAqL1xuZnVuY3Rpb24gQUVTX0dDTV9kZWNyeXB0X2J5dGVzKGRhdGEsIGtleSwgbm9uY2UsIGFkYXRhLCB0YWdTaXplKSB7XG4gIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBTeW50YXhFcnJvcignZGF0YSByZXF1aXJlZCcpO1xuICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBTeW50YXhFcnJvcigna2V5IHJlcXVpcmVkJyk7XG4gIGlmIChub25jZSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ25vbmNlIHJlcXVpcmVkJyk7XG4gIHJldHVybiBuZXcgX2djbS5BRVNfR0NNKGtleSwgbm9uY2UsIGFkYXRhLCB0YWdTaXplLCBfZXhwb3J0cy5fQUVTX2hlYXBfaW5zdGFuY2UsIF9leHBvcnRzLl9BRVNfYXNtX2luc3RhbmNlKS5kZWNyeXB0KGRhdGEpLnJlc3VsdDtcbn1cblxuX2djbS5BRVNfR0NNLmVuY3J5cHQgPSBBRVNfR0NNX2VuY3J5cHRfYnl0ZXM7XG5fZ2NtLkFFU19HQ00uZGVjcnlwdCA9IEFFU19HQ01fZGVjcnlwdF9ieXRlcztcblxuZXhwb3J0cy5BRVNfR0NNID0gX2djbS5BRVNfR0NNO1xuZXhwb3J0cy5BRVNfR0NNX0VuY3J5cHQgPSBfZ2NtLkFFU19HQ01fRW5jcnlwdDtcbmV4cG9ydHMuQUVTX0dDTV9EZWNyeXB0ID0gX2djbS5BRVNfR0NNX0RlY3J5cHQ7XG5cbn0se1wiLi4vZXhwb3J0c1wiOjExLFwiLi9nY21cIjoxM31dLDEzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuQUVTX0dDTV9EZWNyeXB0ID0gZXhwb3J0cy5BRVNfR0NNX0VuY3J5cHQgPSBleHBvcnRzLkFFU19HQ00gPSB1bmRlZmluZWQ7XG5cbnZhciBfZ2V0UHJvdG90eXBlT2YgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2dldC1wcm90b3R5cGUtb2YnKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRQcm90b3R5cGVPZik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MnKTtcblxudmFyIF9jcmVhdGVDbGFzczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDbGFzczIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2Vycm9ycyA9IF9kZXJlcV8oJy4uLy4uL2Vycm9ycycpO1xuXG52YXIgX3V0aWxzID0gX2RlcmVxXygnLi4vLi4vdXRpbHMnKTtcblxudmFyIF9hZXMgPSBfZGVyZXFfKCcuLi9hZXMnKTtcblxudmFyIF9hZXMyID0gX2RlcmVxXygnLi4vYWVzLmFzbScpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEdhbG9pcy9Db3VudGVyIG1vZGVcbiAqL1xuXG52YXIgX0FFU19HQ01fZGF0YV9tYXhMZW5ndGggPSA2ODcxOTQ3NjcwNDsgLy8gMl4zNiAtIDJeNVxuXG52YXIgQUVTX0dDTSA9IGV4cG9ydHMuQUVTX0dDTSA9IGZ1bmN0aW9uIChfQUVTKSB7XG4gICgwLCBfaW5oZXJpdHMzLmRlZmF1bHQpKEFFU19HQ00sIF9BRVMpO1xuXG4gIGZ1bmN0aW9uIEFFU19HQ00oa2V5LCBub25jZSwgYWRhdGEsIHRhZ1NpemUsIGhlYXAsIGFzbSkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szLmRlZmF1bHQpKHRoaXMsIEFFU19HQ00pO1xuXG4gICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMy5kZWZhdWx0KSh0aGlzLCAoQUVTX0dDTS5fX3Byb3RvX18gfHwgKDAsIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoQUVTX0dDTSkpLmNhbGwodGhpcywga2V5LCB1bmRlZmluZWQsIGZhbHNlLCBoZWFwLCBhc20pKTtcblxuICAgIF90aGlzLm5vbmNlID0gbnVsbDtcbiAgICBfdGhpcy5hZGF0YSA9IG51bGw7XG4gICAgX3RoaXMuaXYgPSBudWxsO1xuICAgIF90aGlzLmNvdW50ZXIgPSAxO1xuICAgIF90aGlzLnRhZ1NpemUgPSAxNjtcbiAgICBfdGhpcy5tb2RlID0gJ0dDTSc7XG4gICAgX3RoaXMuQkxPQ0tfU0laRSA9IDE2O1xuXG4gICAgX3RoaXMucmVzZXQoa2V5LCB0YWdTaXplLCBub25jZSwgYWRhdGEpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MzLmRlZmF1bHQpKEFFU19HQ00sIFt7XG4gICAga2V5OiAncmVzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldChrZXksIHRhZ1NpemUsIG5vbmNlLCBhZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuQUVTX0dDTV9yZXNldChrZXksIHRhZ1NpemUsIG5vbmNlLCBhZGF0YSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZW5jcnlwdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuY3J5cHQoZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuQUVTX0dDTV9lbmNyeXB0KGRhdGEpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2RlY3J5cHQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWNyeXB0KGRhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLkFFU19HQ01fZGVjcnlwdChkYXRhKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdBRVNfR0NNX0VuY3J5cHRfcHJvY2VzcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIEFFU19HQ01fRW5jcnlwdF9wcm9jZXNzKGRhdGEpIHtcbiAgICAgIGlmICghKDAsIF91dGlscy5pc19ieXRlcykoZGF0YSkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJkYXRhIGlzbid0IG9mIGV4cGVjdGVkIHR5cGVcIik7XG5cbiAgICAgIHZhciBkcG9zID0gMCxcbiAgICAgICAgICBkbGVuID0gZGF0YS5sZW5ndGggfHwgMCxcbiAgICAgICAgICBhc20gPSB0aGlzLmFzbSxcbiAgICAgICAgICBoZWFwID0gdGhpcy5oZWFwLFxuICAgICAgICAgIGNvdW50ZXIgPSB0aGlzLmNvdW50ZXIsXG4gICAgICAgICAgcG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgbGVuID0gdGhpcy5sZW4sXG4gICAgICAgICAgcnBvcyA9IDAsXG4gICAgICAgICAgcmxlbiA9IGxlbiArIGRsZW4gJiAtMTYsXG4gICAgICAgICAgd2xlbiA9IDA7XG5cbiAgICAgIGlmICgoY291bnRlciAtIDEgPDwgNCkgKyBsZW4gKyBkbGVuID4gX0FFU19HQ01fZGF0YV9tYXhMZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdjb3VudGVyIG92ZXJmbG93Jyk7XG5cbiAgICAgIHZhciByZXN1bHQgPSBuZXcgVWludDhBcnJheShybGVuKTtcblxuICAgICAgd2hpbGUgKGRsZW4gPiAwKSB7XG4gICAgICAgIHdsZW4gPSAoMCwgX3V0aWxzLl9oZWFwX3dyaXRlKShoZWFwLCBwb3MgKyBsZW4sIGRhdGEsIGRwb3MsIGRsZW4pO1xuICAgICAgICBsZW4gKz0gd2xlbjtcbiAgICAgICAgZHBvcyArPSB3bGVuO1xuICAgICAgICBkbGVuIC09IHdsZW47XG5cbiAgICAgICAgd2xlbiA9IGFzbS5jaXBoZXIoX2FlczIuQUVTX2FzbS5FTkMuQ1RSLCBfYWVzMi5BRVNfYXNtLkhFQVBfREFUQSArIHBvcywgbGVuKTtcbiAgICAgICAgd2xlbiA9IGFzbS5tYWMoX2FlczIuQUVTX2FzbS5NQUMuR0NNLCBfYWVzMi5BRVNfYXNtLkhFQVBfREFUQSArIHBvcywgd2xlbik7XG5cbiAgICAgICAgaWYgKHdsZW4pIHJlc3VsdC5zZXQoaGVhcC5zdWJhcnJheShwb3MsIHBvcyArIHdsZW4pLCBycG9zKTtcbiAgICAgICAgY291bnRlciArPSB3bGVuID4+PiA0O1xuICAgICAgICBycG9zICs9IHdsZW47XG5cbiAgICAgICAgaWYgKHdsZW4gPCBsZW4pIHtcbiAgICAgICAgICBwb3MgKz0gd2xlbjtcbiAgICAgICAgICBsZW4gLT0gd2xlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwb3MgPSAwO1xuICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBjb3VudGVyO1xuICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICB0aGlzLmxlbiA9IGxlbjtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnQUVTX0dDTV9FbmNyeXB0X2ZpbmlzaCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIEFFU19HQ01fRW5jcnlwdF9maW5pc2goKSB7XG4gICAgICB2YXIgYXNtID0gdGhpcy5hc20sXG4gICAgICAgICAgaGVhcCA9IHRoaXMuaGVhcCxcbiAgICAgICAgICBjb3VudGVyID0gdGhpcy5jb3VudGVyLFxuICAgICAgICAgIHRhZ1NpemUgPSB0aGlzLnRhZ1NpemUsXG4gICAgICAgICAgYWRhdGEgPSB0aGlzLmFkYXRhLFxuICAgICAgICAgIHBvcyA9IHRoaXMucG9zLFxuICAgICAgICAgIGxlbiA9IHRoaXMubGVuO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuICsgdGFnU2l6ZSk7XG5cbiAgICAgIGFzbS5jaXBoZXIoX2FlczIuQUVTX2FzbS5FTkMuQ1RSLCBfYWVzMi5BRVNfYXNtLkhFQVBfREFUQSArIHBvcywgbGVuICsgMTUgJiAtMTYpO1xuICAgICAgaWYgKGxlbikgcmVzdWx0LnNldChoZWFwLnN1YmFycmF5KHBvcywgcG9zICsgbGVuKSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSBsZW47IGkgJiAxNTsgaSsrKSB7XG4gICAgICAgIGhlYXBbcG9zICsgaV0gPSAwO1xuICAgICAgfWFzbS5tYWMoX2FlczIuQUVTX2FzbS5NQUMuR0NNLCBfYWVzMi5BRVNfYXNtLkhFQVBfREFUQSArIHBvcywgaSk7XG5cbiAgICAgIHZhciBhbGVuID0gYWRhdGEgIT09IG51bGwgPyBhZGF0YS5sZW5ndGggOiAwLFxuICAgICAgICAgIGNsZW4gPSAoY291bnRlciAtIDEgPDwgNCkgKyBsZW47XG4gICAgICBoZWFwWzBdID0gaGVhcFsxXSA9IGhlYXBbMl0gPSAwLCBoZWFwWzNdID0gYWxlbiA+Pj4gMjksIGhlYXBbNF0gPSBhbGVuID4+PiAyMSwgaGVhcFs1XSA9IGFsZW4gPj4+IDEzICYgMjU1LCBoZWFwWzZdID0gYWxlbiA+Pj4gNSAmIDI1NSwgaGVhcFs3XSA9IGFsZW4gPDwgMyAmIDI1NSwgaGVhcFs4XSA9IGhlYXBbOV0gPSBoZWFwWzEwXSA9IDAsIGhlYXBbMTFdID0gY2xlbiA+Pj4gMjksIGhlYXBbMTJdID0gY2xlbiA+Pj4gMjEgJiAyNTUsIGhlYXBbMTNdID0gY2xlbiA+Pj4gMTMgJiAyNTUsIGhlYXBbMTRdID0gY2xlbiA+Pj4gNSAmIDI1NSwgaGVhcFsxNV0gPSBjbGVuIDw8IDMgJiAyNTU7XG4gICAgICBhc20ubWFjKF9hZXMyLkFFU19hc20uTUFDLkdDTSwgX2FlczIuQUVTX2FzbS5IRUFQX0RBVEEsIDE2KTtcbiAgICAgIGFzbS5nZXRfaXYoX2FlczIuQUVTX2FzbS5IRUFQX0RBVEEpO1xuXG4gICAgICBhc20uc2V0X2NvdW50ZXIoMCwgMCwgMCwgdGhpcy5nYW1tYTApO1xuICAgICAgYXNtLmNpcGhlcihfYWVzMi5BRVNfYXNtLkVOQy5DVFIsIF9hZXMyLkFFU19hc20uSEVBUF9EQVRBLCAxNik7XG4gICAgICByZXN1bHQuc2V0KGhlYXAuc3ViYXJyYXkoMCwgdGFnU2l6ZSksIGxlbik7XG5cbiAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICAgICAgdGhpcy5jb3VudGVyID0gMTtcbiAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgIHRoaXMubGVuID0gMDtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnQUVTX0dDTV9EZWNyeXB0X3Byb2Nlc3MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBBRVNfR0NNX0RlY3J5cHRfcHJvY2VzcyhkYXRhKSB7XG4gICAgICBpZiAoISgwLCBfdXRpbHMuaXNfYnl0ZXMpKGRhdGEpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiZGF0YSBpc24ndCBvZiBleHBlY3RlZCB0eXBlXCIpO1xuXG4gICAgICB2YXIgZHBvcyA9IDAsXG4gICAgICAgICAgZGxlbiA9IGRhdGEubGVuZ3RoIHx8IDAsXG4gICAgICAgICAgYXNtID0gdGhpcy5hc20sXG4gICAgICAgICAgaGVhcCA9IHRoaXMuaGVhcCxcbiAgICAgICAgICBjb3VudGVyID0gdGhpcy5jb3VudGVyLFxuICAgICAgICAgIHRhZ1NpemUgPSB0aGlzLnRhZ1NpemUsXG4gICAgICAgICAgcG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgbGVuID0gdGhpcy5sZW4sXG4gICAgICAgICAgcnBvcyA9IDAsXG4gICAgICAgICAgcmxlbiA9IGxlbiArIGRsZW4gPiB0YWdTaXplID8gbGVuICsgZGxlbiAtIHRhZ1NpemUgJiAtMTYgOiAwLFxuICAgICAgICAgIHRsZW4gPSBsZW4gKyBkbGVuIC0gcmxlbixcbiAgICAgICAgICB3bGVuID0gMDtcblxuICAgICAgaWYgKChjb3VudGVyIC0gMSA8PCA0KSArIGxlbiArIGRsZW4gPiBfQUVTX0dDTV9kYXRhX21heExlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2NvdW50ZXIgb3ZlcmZsb3cnKTtcblxuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KHJsZW4pO1xuXG4gICAgICB3aGlsZSAoZGxlbiA+IHRsZW4pIHtcbiAgICAgICAgd2xlbiA9ICgwLCBfdXRpbHMuX2hlYXBfd3JpdGUpKGhlYXAsIHBvcyArIGxlbiwgZGF0YSwgZHBvcywgZGxlbiAtIHRsZW4pO1xuICAgICAgICBsZW4gKz0gd2xlbjtcbiAgICAgICAgZHBvcyArPSB3bGVuO1xuICAgICAgICBkbGVuIC09IHdsZW47XG5cbiAgICAgICAgd2xlbiA9IGFzbS5tYWMoX2FlczIuQUVTX2FzbS5NQUMuR0NNLCBfYWVzMi5BRVNfYXNtLkhFQVBfREFUQSArIHBvcywgd2xlbik7XG4gICAgICAgIHdsZW4gPSBhc20uY2lwaGVyKF9hZXMyLkFFU19hc20uREVDLkNUUiwgX2FlczIuQUVTX2FzbS5IRUFQX0RBVEEgKyBwb3MsIHdsZW4pO1xuXG4gICAgICAgIGlmICh3bGVuKSByZXN1bHQuc2V0KGhlYXAuc3ViYXJyYXkocG9zLCBwb3MgKyB3bGVuKSwgcnBvcyk7XG4gICAgICAgIGNvdW50ZXIgKz0gd2xlbiA+Pj4gNDtcbiAgICAgICAgcnBvcyArPSB3bGVuO1xuXG4gICAgICAgIHBvcyA9IDA7XG4gICAgICAgIGxlbiA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChkbGVuID4gMCkge1xuICAgICAgICBsZW4gKz0gKDAsIF91dGlscy5faGVhcF93cml0ZSkoaGVhcCwgMCwgZGF0YSwgZHBvcywgZGxlbik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICAgICAgdGhpcy5jb3VudGVyID0gY291bnRlcjtcbiAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgdGhpcy5sZW4gPSBsZW47XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ0FFU19HQ01fRGVjcnlwdF9maW5pc2gnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBBRVNfR0NNX0RlY3J5cHRfZmluaXNoKCkge1xuICAgICAgdmFyIGFzbSA9IHRoaXMuYXNtLFxuICAgICAgICAgIGhlYXAgPSB0aGlzLmhlYXAsXG4gICAgICAgICAgdGFnU2l6ZSA9IHRoaXMudGFnU2l6ZSxcbiAgICAgICAgICBhZGF0YSA9IHRoaXMuYWRhdGEsXG4gICAgICAgICAgY291bnRlciA9IHRoaXMuY291bnRlcixcbiAgICAgICAgICBwb3MgPSB0aGlzLnBvcyxcbiAgICAgICAgICBsZW4gPSB0aGlzLmxlbixcbiAgICAgICAgICBybGVuID0gbGVuIC0gdGFnU2l6ZSxcbiAgICAgICAgICB3bGVuID0gMDtcblxuICAgICAgaWYgKGxlbiA8IHRhZ1NpemUpIHRocm93IG5ldyBfZXJyb3JzLklsbGVnYWxTdGF0ZUVycm9yKCdhdXRoZW50aWNhdGlvbiB0YWcgbm90IGZvdW5kJyk7XG5cbiAgICAgIHZhciByZXN1bHQgPSBuZXcgVWludDhBcnJheShybGVuKSxcbiAgICAgICAgICBhdGFnID0gbmV3IFVpbnQ4QXJyYXkoaGVhcC5zdWJhcnJheShwb3MgKyBybGVuLCBwb3MgKyBsZW4pKTtcblxuICAgICAgZm9yICh2YXIgaSA9IHJsZW47IGkgJiAxNTsgaSsrKSB7XG4gICAgICAgIGhlYXBbcG9zICsgaV0gPSAwO1xuICAgICAgfXdsZW4gPSBhc20ubWFjKF9hZXMyLkFFU19hc20uTUFDLkdDTSwgX2FlczIuQUVTX2FzbS5IRUFQX0RBVEEgKyBwb3MsIGkpO1xuICAgICAgd2xlbiA9IGFzbS5jaXBoZXIoX2FlczIuQUVTX2FzbS5ERUMuQ1RSLCBfYWVzMi5BRVNfYXNtLkhFQVBfREFUQSArIHBvcywgaSk7XG4gICAgICBpZiAocmxlbikgcmVzdWx0LnNldChoZWFwLnN1YmFycmF5KHBvcywgcG9zICsgcmxlbikpO1xuXG4gICAgICB2YXIgYWxlbiA9IGFkYXRhICE9PSBudWxsID8gYWRhdGEubGVuZ3RoIDogMCxcbiAgICAgICAgICBjbGVuID0gKGNvdW50ZXIgLSAxIDw8IDQpICsgbGVuIC0gdGFnU2l6ZTtcbiAgICAgIGhlYXBbMF0gPSBoZWFwWzFdID0gaGVhcFsyXSA9IDAsIGhlYXBbM10gPSBhbGVuID4+PiAyOSwgaGVhcFs0XSA9IGFsZW4gPj4+IDIxLCBoZWFwWzVdID0gYWxlbiA+Pj4gMTMgJiAyNTUsIGhlYXBbNl0gPSBhbGVuID4+PiA1ICYgMjU1LCBoZWFwWzddID0gYWxlbiA8PCAzICYgMjU1LCBoZWFwWzhdID0gaGVhcFs5XSA9IGhlYXBbMTBdID0gMCwgaGVhcFsxMV0gPSBjbGVuID4+PiAyOSwgaGVhcFsxMl0gPSBjbGVuID4+PiAyMSAmIDI1NSwgaGVhcFsxM10gPSBjbGVuID4+PiAxMyAmIDI1NSwgaGVhcFsxNF0gPSBjbGVuID4+PiA1ICYgMjU1LCBoZWFwWzE1XSA9IGNsZW4gPDwgMyAmIDI1NTtcbiAgICAgIGFzbS5tYWMoX2FlczIuQUVTX2FzbS5NQUMuR0NNLCBfYWVzMi5BRVNfYXNtLkhFQVBfREFUQSwgMTYpO1xuICAgICAgYXNtLmdldF9pdihfYWVzMi5BRVNfYXNtLkhFQVBfREFUQSk7XG5cbiAgICAgIGFzbS5zZXRfY291bnRlcigwLCAwLCAwLCB0aGlzLmdhbW1hMCk7XG4gICAgICBhc20uY2lwaGVyKF9hZXMyLkFFU19hc20uRU5DLkNUUiwgX2FlczIuQUVTX2FzbS5IRUFQX0RBVEEsIDE2KTtcblxuICAgICAgdmFyIGFjaGVjayA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhZ1NpemU7ICsraSkge1xuICAgICAgICBhY2hlY2sgfD0gYXRhZ1tpXSBeIGhlYXBbaV07XG4gICAgICB9aWYgKGFjaGVjaykgdGhyb3cgbmV3IF9lcnJvcnMuU2VjdXJpdHlFcnJvcignZGF0YSBpbnRlZ3JpdHkgY2hlY2sgZmFpbGVkJyk7XG5cbiAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICAgICAgdGhpcy5jb3VudGVyID0gMTtcbiAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgIHRoaXMubGVuID0gMDtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnQUVTX0dDTV9kZWNyeXB0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gQUVTX0dDTV9kZWNyeXB0KGRhdGEpIHtcbiAgICAgIHZhciByZXN1bHQxID0gdGhpcy5BRVNfR0NNX0RlY3J5cHRfcHJvY2VzcyhkYXRhKS5yZXN1bHQ7XG4gICAgICB2YXIgcmVzdWx0MiA9IHRoaXMuQUVTX0dDTV9EZWNyeXB0X2ZpbmlzaCgpLnJlc3VsdDtcblxuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KHJlc3VsdDEubGVuZ3RoICsgcmVzdWx0Mi5sZW5ndGgpO1xuICAgICAgaWYgKHJlc3VsdDEubGVuZ3RoKSByZXN1bHQuc2V0KHJlc3VsdDEpO1xuICAgICAgaWYgKHJlc3VsdDIubGVuZ3RoKSByZXN1bHQuc2V0KHJlc3VsdDIsIHJlc3VsdDEubGVuZ3RoKTtcbiAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdBRVNfR0NNX2VuY3J5cHQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBBRVNfR0NNX2VuY3J5cHQoZGF0YSkge1xuICAgICAgdmFyIHJlc3VsdDEgPSB0aGlzLkFFU19HQ01fRW5jcnlwdF9wcm9jZXNzKGRhdGEpLnJlc3VsdDtcbiAgICAgIHZhciByZXN1bHQyID0gdGhpcy5BRVNfR0NNX0VuY3J5cHRfZmluaXNoKCkucmVzdWx0O1xuXG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkocmVzdWx0MS5sZW5ndGggKyByZXN1bHQyLmxlbmd0aCk7XG4gICAgICBpZiAocmVzdWx0MS5sZW5ndGgpIHJlc3VsdC5zZXQocmVzdWx0MSk7XG4gICAgICBpZiAocmVzdWx0Mi5sZW5ndGgpIHJlc3VsdC5zZXQocmVzdWx0MiwgcmVzdWx0MS5sZW5ndGgpO1xuICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ0FFU19HQ01fcmVzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBBRVNfR0NNX3Jlc2V0KGtleSwgdGFnU2l6ZSwgbm9uY2UsIGFkYXRhLCBjb3VudGVyLCBpdikge1xuICAgICAgdGhpcy5BRVNfcmVzZXQoa2V5LCB1bmRlZmluZWQsIGZhbHNlKTtcblxuICAgICAgdmFyIGFzbSA9IHRoaXMuYXNtO1xuICAgICAgdmFyIGhlYXAgPSB0aGlzLmhlYXA7XG5cbiAgICAgIGFzbS5nY21faW5pdCgpO1xuXG4gICAgICB2YXIgdGFnU2l6ZSA9IHRhZ1NpemU7XG4gICAgICBpZiAodGFnU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghKDAsIF91dGlscy5pc19udW1iZXIpKHRhZ1NpemUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCd0YWdTaXplIG11c3QgYmUgYSBudW1iZXInKTtcblxuICAgICAgICBpZiAodGFnU2l6ZSA8IDQgfHwgdGFnU2l6ZSA+IDE2KSB0aHJvdyBuZXcgX2Vycm9ycy5JbGxlZ2FsQXJndW1lbnRFcnJvcignaWxsZWdhbCB0YWdTaXplIHZhbHVlJyk7XG5cbiAgICAgICAgdGhpcy50YWdTaXplID0gdGFnU2l6ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGFnU2l6ZSA9IDE2O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9uY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoISgwLCBfdXRpbHMuaXNfYnl0ZXMpKG5vbmNlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VuZXhwZWN0ZWQgbm9uY2UgdHlwZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ub25jZSA9IG5vbmNlO1xuXG4gICAgICAgIHZhciBub25jZWxlbiA9IG5vbmNlLmxlbmd0aCB8fCAwLFxuICAgICAgICAgICAgbm9uY2VidWYgPSBuZXcgVWludDhBcnJheSgxNik7XG4gICAgICAgIGlmIChub25jZWxlbiAhPT0gMTIpIHtcbiAgICAgICAgICB0aGlzLl9nY21fbWFjX3Byb2Nlc3Mobm9uY2UpO1xuXG4gICAgICAgICAgaGVhcFswXSA9IGhlYXBbMV0gPSBoZWFwWzJdID0gaGVhcFszXSA9IGhlYXBbNF0gPSBoZWFwWzVdID0gaGVhcFs2XSA9IGhlYXBbN10gPSBoZWFwWzhdID0gaGVhcFs5XSA9IGhlYXBbMTBdID0gMCwgaGVhcFsxMV0gPSBub25jZWxlbiA+Pj4gMjksIGhlYXBbMTJdID0gbm9uY2VsZW4gPj4+IDIxICYgMjU1LCBoZWFwWzEzXSA9IG5vbmNlbGVuID4+PiAxMyAmIDI1NSwgaGVhcFsxNF0gPSBub25jZWxlbiA+Pj4gNSAmIDI1NSwgaGVhcFsxNV0gPSBub25jZWxlbiA8PCAzICYgMjU1O1xuICAgICAgICAgIGFzbS5tYWMoX2FlczIuQUVTX2FzbS5NQUMuR0NNLCBfYWVzMi5BRVNfYXNtLkhFQVBfREFUQSwgMTYpO1xuXG4gICAgICAgICAgYXNtLmdldF9pdihfYWVzMi5BRVNfYXNtLkhFQVBfREFUQSk7XG4gICAgICAgICAgYXNtLnNldF9pdigpO1xuXG4gICAgICAgICAgbm9uY2VidWYuc2V0KGhlYXAuc3ViYXJyYXkoMCwgMTYpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub25jZWJ1Zi5zZXQobm9uY2UpO1xuICAgICAgICAgIG5vbmNlYnVmWzE1XSA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm9uY2V2aWV3ID0gbmV3IERhdGFWaWV3KG5vbmNlYnVmLmJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZ2FtbWEwID0gbm9uY2V2aWV3LmdldFVpbnQzMigxMik7XG5cbiAgICAgICAgYXNtLnNldF9ub25jZShub25jZXZpZXcuZ2V0VWludDMyKDApLCBub25jZXZpZXcuZ2V0VWludDMyKDQpLCBub25jZXZpZXcuZ2V0VWludDMyKDgpLCAwKTtcbiAgICAgICAgYXNtLnNldF9tYXNrKDAsIDAsIDAsIDB4ZmZmZmZmZmYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub25jZSBpcyByZXF1aXJlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWRhdGEgIT09IHVuZGVmaW5lZCAmJiBhZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoISgwLCBfdXRpbHMuaXNfYnl0ZXMpKGFkYXRhKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VuZXhwZWN0ZWQgYWRhdGEgdHlwZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFkYXRhLmxlbmd0aCA+IF9BRVNfR0NNX2RhdGFfbWF4TGVuZ3RoKSB0aHJvdyBuZXcgX2Vycm9ycy5JbGxlZ2FsQXJndW1lbnRFcnJvcignaWxsZWdhbCBhZGF0YSBsZW5ndGgnKTtcblxuICAgICAgICBpZiAoYWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5hZGF0YSA9IGFkYXRhO1xuICAgICAgICAgIHRoaXMuX2djbV9tYWNfcHJvY2VzcyhhZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hZGF0YSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWRhdGEgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY291bnRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghKDAsIF91dGlscy5pc19udW1iZXIpKGNvdW50ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb3VudGVyIG11c3QgYmUgYSBudW1iZXInKTtcblxuICAgICAgICBpZiAoY291bnRlciA8IDEgfHwgY291bnRlciA+IDB4ZmZmZmZmZmYpIHRocm93IG5ldyBSYW5nZUVycm9yKCdjb3VudGVyIG11c3QgYmUgYSBwb3NpdGl2ZSAzMi1iaXQgaW50ZWdlcicpO1xuXG4gICAgICAgIHRoaXMuY291bnRlciA9IGNvdW50ZXI7XG4gICAgICAgIGFzbS5zZXRfY291bnRlcigwLCAwLCAwLCB0aGlzLmdhbW1hMCArIGNvdW50ZXIgfCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY291bnRlciA9IDE7XG4gICAgICAgIGFzbS5zZXRfY291bnRlcigwLCAwLCAwLCB0aGlzLmdhbW1hMCArIDEgfCAwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCEoMCwgX3V0aWxzLmlzX251bWJlcikoaXYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpdiBtdXN0IGJlIGEgbnVtYmVyJyk7XG5cbiAgICAgICAgdGhpcy5pdiA9IGl2O1xuXG4gICAgICAgIHRoaXMuQUVTX3NldF9pdihpdik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19nY21fbWFjX3Byb2Nlc3MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2NtX21hY19wcm9jZXNzKGRhdGEpIHtcbiAgICAgIHZhciBoZWFwID0gdGhpcy5oZWFwLFxuICAgICAgICAgIGFzbSA9IHRoaXMuYXNtLFxuICAgICAgICAgIGRwb3MgPSAwLFxuICAgICAgICAgIGRsZW4gPSBkYXRhLmxlbmd0aCB8fCAwLFxuICAgICAgICAgIHdsZW4gPSAwO1xuXG4gICAgICB3aGlsZSAoZGxlbiA+IDApIHtcbiAgICAgICAgd2xlbiA9ICgwLCBfdXRpbHMuX2hlYXBfd3JpdGUpKGhlYXAsIDAsIGRhdGEsIGRwb3MsIGRsZW4pO1xuICAgICAgICBkcG9zICs9IHdsZW47XG4gICAgICAgIGRsZW4gLT0gd2xlbjtcblxuICAgICAgICB3aGlsZSAod2xlbiAmIDE1KSB7XG4gICAgICAgICAgaGVhcFt3bGVuKytdID0gMDtcbiAgICAgICAgfWFzbS5tYWMoX2FlczIuQUVTX2FzbS5NQUMuR0NNLCBfYWVzMi5BRVNfYXNtLkhFQVBfREFUQSwgd2xlbik7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBBRVNfR0NNO1xufShfYWVzLkFFUyk7XG5cbnZhciBBRVNfR0NNX0VuY3J5cHQgPSBleHBvcnRzLkFFU19HQ01fRW5jcnlwdCA9IGZ1bmN0aW9uIChfQUVTX0dDTSkge1xuICAoMCwgX2luaGVyaXRzMy5kZWZhdWx0KShBRVNfR0NNX0VuY3J5cHQsIF9BRVNfR0NNKTtcblxuICBmdW5jdGlvbiBBRVNfR0NNX0VuY3J5cHQoa2V5LCBub25jZSwgYWRhdGEsIHRhZ1NpemUsIGhlYXAsIGFzbSkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szLmRlZmF1bHQpKHRoaXMsIEFFU19HQ01fRW5jcnlwdCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMuZGVmYXVsdCkodGhpcywgKEFFU19HQ01fRW5jcnlwdC5fX3Byb3RvX18gfHwgKDAsIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoQUVTX0dDTV9FbmNyeXB0KSkuY2FsbCh0aGlzLCBrZXksIG5vbmNlLCBhZGF0YSwgdGFnU2l6ZSwgaGVhcCwgYXNtKSk7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMy5kZWZhdWx0KShBRVNfR0NNX0VuY3J5cHQsIFt7XG4gICAga2V5OiAncHJvY2VzcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByb2Nlc3MoZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuQUVTX0dDTV9FbmNyeXB0X3Byb2Nlc3MoZGF0YSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZmluaXNoJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluaXNoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuQUVTX0dDTV9FbmNyeXB0X2ZpbmlzaCgpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQUVTX0dDTV9FbmNyeXB0O1xufShBRVNfR0NNKTtcblxudmFyIEFFU19HQ01fRGVjcnlwdCA9IGV4cG9ydHMuQUVTX0dDTV9EZWNyeXB0ID0gZnVuY3Rpb24gKF9BRVNfR0NNMikge1xuICAoMCwgX2luaGVyaXRzMy5kZWZhdWx0KShBRVNfR0NNX0RlY3J5cHQsIF9BRVNfR0NNMik7XG5cbiAgZnVuY3Rpb24gQUVTX0dDTV9EZWNyeXB0KGtleSwgbm9uY2UsIGFkYXRhLCB0YWdTaXplLCBoZWFwLCBhc20pIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBBRVNfR0NNX0RlY3J5cHQpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zLmRlZmF1bHQpKHRoaXMsIChBRVNfR0NNX0RlY3J5cHQuX19wcm90b19fIHx8ICgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKEFFU19HQ01fRGVjcnlwdCkpLmNhbGwodGhpcywga2V5LCBub25jZSwgYWRhdGEsIHRhZ1NpemUsIGhlYXAsIGFzbSkpO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQUVTX0dDTV9EZWNyeXB0LCBbe1xuICAgIGtleTogJ3Byb2Nlc3MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcm9jZXNzKGRhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLkFFU19HQ01fRGVjcnlwdF9wcm9jZXNzKGRhdGEpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2ZpbmlzaCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICAgIHJldHVybiB0aGlzLkFFU19HQ01fRGVjcnlwdF9maW5pc2goKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEFFU19HQ01fRGVjcnlwdDtcbn0oQUVTX0dDTSk7XG5cbn0se1wiLi4vLi4vZXJyb3JzXCI6MTQsXCIuLi8uLi91dGlsc1wiOjE5LFwiLi4vYWVzXCI6MyxcIi4uL2Flcy5hc21cIjoyLFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mXCI6MjksXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjozNixcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiOjM3LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCI6MzgsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiOjM5fV0sMTQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZSA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvY3JlYXRlJyk7XG5cbnZhciBfY3JlYXRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZSk7XG5cbmV4cG9ydHMuSWxsZWdhbFN0YXRlRXJyb3IgPSBJbGxlZ2FsU3RhdGVFcnJvcjtcbmV4cG9ydHMuSWxsZWdhbEFyZ3VtZW50RXJyb3IgPSBJbGxlZ2FsQXJndW1lbnRFcnJvcjtcbmV4cG9ydHMuU2VjdXJpdHlFcnJvciA9IFNlY3VyaXR5RXJyb3I7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIElsbGVnYWxTdGF0ZUVycm9yKCkge1xuICB2YXIgZXJyID0gRXJyb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgdGhpcy5tZXNzYWdlID0gZXJyLm1lc3NhZ2UsIHRoaXMuc3RhY2sgPSBlcnIuc3RhY2s7XG59XG5JbGxlZ2FsU3RhdGVFcnJvci5wcm90b3R5cGUgPSAoMCwgX2NyZWF0ZTIuZGVmYXVsdCkoRXJyb3IucHJvdG90eXBlLCB7IG5hbWU6IHsgdmFsdWU6ICdJbGxlZ2FsU3RhdGVFcnJvcicgfSB9KTtcblxuZnVuY3Rpb24gSWxsZWdhbEFyZ3VtZW50RXJyb3IoKSB7XG4gIHZhciBlcnIgPSBFcnJvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB0aGlzLm1lc3NhZ2UgPSBlcnIubWVzc2FnZSwgdGhpcy5zdGFjayA9IGVyci5zdGFjaztcbn1cbklsbGVnYWxBcmd1bWVudEVycm9yLnByb3RvdHlwZSA9ICgwLCBfY3JlYXRlMi5kZWZhdWx0KShFcnJvci5wcm90b3R5cGUsIHsgbmFtZTogeyB2YWx1ZTogJ0lsbGVnYWxBcmd1bWVudEVycm9yJyB9IH0pO1xuXG5mdW5jdGlvbiBTZWN1cml0eUVycm9yKCkge1xuICB2YXIgZXJyID0gRXJyb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgdGhpcy5tZXNzYWdlID0gZXJyLm1lc3NhZ2UsIHRoaXMuc3RhY2sgPSBlcnIuc3RhY2s7XG59XG5TZWN1cml0eUVycm9yLnByb3RvdHlwZSA9ICgwLCBfY3JlYXRlMi5kZWZhdWx0KShFcnJvci5wcm90b3R5cGUsIHsgbmFtZTogeyB2YWx1ZTogJ1NlY3VyaXR5RXJyb3InIH0gfSk7XG5cbn0se1wiYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9jcmVhdGVcIjoyNX1dLDE1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuaGFzaF9yZXNldCA9IGhhc2hfcmVzZXQ7XG5leHBvcnRzLmhhc2hfcHJvY2VzcyA9IGhhc2hfcHJvY2VzcztcbmV4cG9ydHMuaGFzaF9maW5pc2ggPSBoYXNoX2ZpbmlzaDtcblxudmFyIF91dGlscyA9IF9kZXJlcV8oJy4uL3V0aWxzJyk7XG5cbnZhciBfZXJyb3JzID0gX2RlcmVxXygnLi4vZXJyb3JzJyk7XG5cbmZ1bmN0aW9uIGhhc2hfcmVzZXQoKSB7XG4gIHRoaXMucmVzdWx0ID0gbnVsbDtcbiAgdGhpcy5wb3MgPSAwO1xuICB0aGlzLmxlbiA9IDA7XG5cbiAgdGhpcy5hc20ucmVzZXQoKTtcblxuICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24gaGFzaF9wcm9jZXNzKGRhdGEpIHtcbiAgaWYgKHRoaXMucmVzdWx0ICE9PSBudWxsKSB0aHJvdyBuZXcgX2Vycm9ycy5JbGxlZ2FsU3RhdGVFcnJvcignc3RhdGUgbXVzdCBiZSByZXNldCBiZWZvcmUgcHJvY2Vzc2luZyBuZXcgZGF0YScpO1xuXG4gIGlmICgoMCwgX3V0aWxzLmlzX3N0cmluZykoZGF0YSkpIGRhdGEgPSAoMCwgX3V0aWxzLnN0cmluZ190b19ieXRlcykoZGF0YSk7XG5cbiAgaWYgKCgwLCBfdXRpbHMuaXNfYnVmZmVyKShkYXRhKSkgZGF0YSA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuXG4gIGlmICghKDAsIF91dGlscy5pc19ieXRlcykoZGF0YSkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJkYXRhIGlzbid0IG9mIGV4cGVjdGVkIHR5cGVcIik7XG5cbiAgdmFyIGFzbSA9IHRoaXMuYXNtLFxuICAgICAgaGVhcCA9IHRoaXMuaGVhcCxcbiAgICAgIGhwb3MgPSB0aGlzLnBvcyxcbiAgICAgIGhsZW4gPSB0aGlzLmxlbixcbiAgICAgIGRwb3MgPSAwLFxuICAgICAgZGxlbiA9IGRhdGEubGVuZ3RoLFxuICAgICAgd2xlbiA9IDA7XG5cbiAgd2hpbGUgKGRsZW4gPiAwKSB7XG4gICAgd2xlbiA9ICgwLCBfdXRpbHMuX2hlYXBfd3JpdGUpKGhlYXAsIGhwb3MgKyBobGVuLCBkYXRhLCBkcG9zLCBkbGVuKTtcbiAgICBobGVuICs9IHdsZW47XG4gICAgZHBvcyArPSB3bGVuO1xuICAgIGRsZW4gLT0gd2xlbjtcblxuICAgIHdsZW4gPSBhc20ucHJvY2VzcyhocG9zLCBobGVuKTtcblxuICAgIGhwb3MgKz0gd2xlbjtcbiAgICBobGVuIC09IHdsZW47XG5cbiAgICBpZiAoIWhsZW4pIGhwb3MgPSAwO1xuICB9XG5cbiAgdGhpcy5wb3MgPSBocG9zO1xuICB0aGlzLmxlbiA9IGhsZW47XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmZ1bmN0aW9uIGhhc2hfZmluaXNoKCkge1xuICBpZiAodGhpcy5yZXN1bHQgIT09IG51bGwpIHRocm93IG5ldyBfZXJyb3JzLklsbGVnYWxTdGF0ZUVycm9yKCdzdGF0ZSBtdXN0IGJlIHJlc2V0IGJlZm9yZSBwcm9jZXNzaW5nIG5ldyBkYXRhJyk7XG5cbiAgdGhpcy5hc20uZmluaXNoKHRoaXMucG9zLCB0aGlzLmxlbiwgMCk7XG5cbiAgdGhpcy5yZXN1bHQgPSBuZXcgVWludDhBcnJheSh0aGlzLkhBU0hfU0laRSk7XG4gIHRoaXMucmVzdWx0LnNldCh0aGlzLmhlYXAuc3ViYXJyYXkoMCwgdGhpcy5IQVNIX1NJWkUpKTtcblxuICB0aGlzLnBvcyA9IDA7XG4gIHRoaXMubGVuID0gMDtcblxuICByZXR1cm4gdGhpcztcbn1cblxufSx7XCIuLi9lcnJvcnNcIjoxNCxcIi4uL3V0aWxzXCI6MTl9XSwxNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlNIQTI1NiA9IHVuZGVmaW5lZDtcblxudmFyIF9zaGEgPSBfZGVyZXFfKCcuL3NoYTI1NicpO1xuXG52YXIgX3V0aWxzID0gX2RlcmVxXygnLi4vLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBTSEEyNTYgZXhwb3J0c1xuICovXG5cbmZ1bmN0aW9uIHNoYTI1Nl9ieXRlcyhkYXRhKSB7XG4gIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBTeW50YXhFcnJvcignZGF0YSByZXF1aXJlZCcpO1xuICByZXR1cm4gKDAsIF9zaGEuZ2V0X3NoYTI1Nl9pbnN0YW5jZSkoKS5yZXNldCgpLnByb2Nlc3MoZGF0YSkuZmluaXNoKCkucmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzaGEyNTZfaGV4KGRhdGEpIHtcbiAgdmFyIHJlc3VsdCA9IHNoYTI1Nl9ieXRlcyhkYXRhKTtcbiAgcmV0dXJuICgwLCBfdXRpbHMuYnl0ZXNfdG9faGV4KShyZXN1bHQpO1xufVxuXG5mdW5jdGlvbiBzaGEyNTZfYmFzZTY0KGRhdGEpIHtcbiAgdmFyIHJlc3VsdCA9IHNoYTI1Nl9ieXRlcyhkYXRhKTtcbiAgcmV0dXJuICgwLCBfdXRpbHMuYnl0ZXNfdG9fYmFzZTY0KShyZXN1bHQpO1xufVxuXG52YXIgU0hBMjU2ID0gZXhwb3J0cy5TSEEyNTYgPSBfc2hhLnNoYTI1Nl9jb25zdHJ1Y3RvcjtcblNIQTI1Ni5ieXRlcyA9IHNoYTI1Nl9ieXRlcztcblNIQTI1Ni5oZXggPSBzaGEyNTZfaGV4O1xuU0hBMjU2LmJhc2U2NCA9IHNoYTI1Nl9iYXNlNjQ7XG5cbn0se1wiLi4vLi4vdXRpbHNcIjoxOSxcIi4vc2hhMjU2XCI6MTh9XSwxNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5zaGEyNTZfYXNtID0gc2hhMjU2X2FzbTtcbmZ1bmN0aW9uIHNoYTI1Nl9hc20oc3RkbGliLCBmb3JlaWduLCBidWZmZXIpIHtcbiAgICBcInVzZSBhc21cIjtcblxuICAgIC8vIFNIQTI1NiBzdGF0ZVxuXG4gICAgdmFyIEgwID0gMCxcbiAgICAgICAgSDEgPSAwLFxuICAgICAgICBIMiA9IDAsXG4gICAgICAgIEgzID0gMCxcbiAgICAgICAgSDQgPSAwLFxuICAgICAgICBINSA9IDAsXG4gICAgICAgIEg2ID0gMCxcbiAgICAgICAgSDcgPSAwLFxuICAgICAgICBUT1RBTDAgPSAwLFxuICAgICAgICBUT1RBTDEgPSAwO1xuXG4gICAgLy8gSE1BQyBzdGF0ZVxuICAgIHZhciBJMCA9IDAsXG4gICAgICAgIEkxID0gMCxcbiAgICAgICAgSTIgPSAwLFxuICAgICAgICBJMyA9IDAsXG4gICAgICAgIEk0ID0gMCxcbiAgICAgICAgSTUgPSAwLFxuICAgICAgICBJNiA9IDAsXG4gICAgICAgIEk3ID0gMCxcbiAgICAgICAgTzAgPSAwLFxuICAgICAgICBPMSA9IDAsXG4gICAgICAgIE8yID0gMCxcbiAgICAgICAgTzMgPSAwLFxuICAgICAgICBPNCA9IDAsXG4gICAgICAgIE81ID0gMCxcbiAgICAgICAgTzYgPSAwLFxuICAgICAgICBPNyA9IDA7XG5cbiAgICAvLyBJL08gYnVmZmVyXG4gICAgdmFyIEhFQVAgPSBuZXcgc3RkbGliLlVpbnQ4QXJyYXkoYnVmZmVyKTtcblxuICAgIGZ1bmN0aW9uIF9jb3JlKHcwLCB3MSwgdzIsIHczLCB3NCwgdzUsIHc2LCB3NywgdzgsIHc5LCB3MTAsIHcxMSwgdzEyLCB3MTMsIHcxNCwgdzE1KSB7XG4gICAgICAgIHcwID0gdzAgfCAwO1xuICAgICAgICB3MSA9IHcxIHwgMDtcbiAgICAgICAgdzIgPSB3MiB8IDA7XG4gICAgICAgIHczID0gdzMgfCAwO1xuICAgICAgICB3NCA9IHc0IHwgMDtcbiAgICAgICAgdzUgPSB3NSB8IDA7XG4gICAgICAgIHc2ID0gdzYgfCAwO1xuICAgICAgICB3NyA9IHc3IHwgMDtcbiAgICAgICAgdzggPSB3OCB8IDA7XG4gICAgICAgIHc5ID0gdzkgfCAwO1xuICAgICAgICB3MTAgPSB3MTAgfCAwO1xuICAgICAgICB3MTEgPSB3MTEgfCAwO1xuICAgICAgICB3MTIgPSB3MTIgfCAwO1xuICAgICAgICB3MTMgPSB3MTMgfCAwO1xuICAgICAgICB3MTQgPSB3MTQgfCAwO1xuICAgICAgICB3MTUgPSB3MTUgfCAwO1xuXG4gICAgICAgIHZhciBhID0gMCxcbiAgICAgICAgICAgIGIgPSAwLFxuICAgICAgICAgICAgYyA9IDAsXG4gICAgICAgICAgICBkID0gMCxcbiAgICAgICAgICAgIGUgPSAwLFxuICAgICAgICAgICAgZiA9IDAsXG4gICAgICAgICAgICBnID0gMCxcbiAgICAgICAgICAgIGggPSAwO1xuXG4gICAgICAgIGEgPSBIMDtcbiAgICAgICAgYiA9IEgxO1xuICAgICAgICBjID0gSDI7XG4gICAgICAgIGQgPSBIMztcbiAgICAgICAgZSA9IEg0O1xuICAgICAgICBmID0gSDU7XG4gICAgICAgIGcgPSBINjtcbiAgICAgICAgaCA9IEg3O1xuXG4gICAgICAgIC8vIDBcbiAgICAgICAgaCA9IHcwICsgaCArIChlID4+PiA2IF4gZSA+Pj4gMTEgXiBlID4+PiAyNSBeIGUgPDwgMjYgXiBlIDw8IDIxIF4gZSA8PCA3KSArIChnIF4gZSAmIChmIF4gZykpICsgMHg0MjhhMmY5OCB8IDA7XG4gICAgICAgIGQgPSBkICsgaCB8IDA7XG4gICAgICAgIGggPSBoICsgKGEgJiBiIF4gYyAmIChhIF4gYikpICsgKGEgPj4+IDIgXiBhID4+PiAxMyBeIGEgPj4+IDIyIF4gYSA8PCAzMCBeIGEgPDwgMTkgXiBhIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gMVxuICAgICAgICBnID0gdzEgKyBnICsgKGQgPj4+IDYgXiBkID4+PiAxMSBeIGQgPj4+IDI1IF4gZCA8PCAyNiBeIGQgPDwgMjEgXiBkIDw8IDcpICsgKGYgXiBkICYgKGUgXiBmKSkgKyAweDcxMzc0NDkxIHwgMDtcbiAgICAgICAgYyA9IGMgKyBnIHwgMDtcbiAgICAgICAgZyA9IGcgKyAoaCAmIGEgXiBiICYgKGggXiBhKSkgKyAoaCA+Pj4gMiBeIGggPj4+IDEzIF4gaCA+Pj4gMjIgXiBoIDw8IDMwIF4gaCA8PCAxOSBeIGggPDwgMTApIHwgMDtcblxuICAgICAgICAvLyAyXG4gICAgICAgIGYgPSB3MiArIGYgKyAoYyA+Pj4gNiBeIGMgPj4+IDExIF4gYyA+Pj4gMjUgXiBjIDw8IDI2IF4gYyA8PCAyMSBeIGMgPDwgNykgKyAoZSBeIGMgJiAoZCBeIGUpKSArIDB4YjVjMGZiY2YgfCAwO1xuICAgICAgICBiID0gYiArIGYgfCAwO1xuICAgICAgICBmID0gZiArIChnICYgaCBeIGEgJiAoZyBeIGgpKSArIChnID4+PiAyIF4gZyA+Pj4gMTMgXiBnID4+PiAyMiBeIGcgPDwgMzAgXiBnIDw8IDE5IF4gZyA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDNcbiAgICAgICAgZSA9IHczICsgZSArIChiID4+PiA2IF4gYiA+Pj4gMTEgXiBiID4+PiAyNSBeIGIgPDwgMjYgXiBiIDw8IDIxIF4gYiA8PCA3KSArIChkIF4gYiAmIChjIF4gZCkpICsgMHhlOWI1ZGJhNSB8IDA7XG4gICAgICAgIGEgPSBhICsgZSB8IDA7XG4gICAgICAgIGUgPSBlICsgKGYgJiBnIF4gaCAmIChmIF4gZykpICsgKGYgPj4+IDIgXiBmID4+PiAxMyBeIGYgPj4+IDIyIF4gZiA8PCAzMCBeIGYgPDwgMTkgXiBmIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gNFxuICAgICAgICBkID0gdzQgKyBkICsgKGEgPj4+IDYgXiBhID4+PiAxMSBeIGEgPj4+IDI1IF4gYSA8PCAyNiBeIGEgPDwgMjEgXiBhIDw8IDcpICsgKGMgXiBhICYgKGIgXiBjKSkgKyAweDM5NTZjMjViIHwgMDtcbiAgICAgICAgaCA9IGggKyBkIHwgMDtcbiAgICAgICAgZCA9IGQgKyAoZSAmIGYgXiBnICYgKGUgXiBmKSkgKyAoZSA+Pj4gMiBeIGUgPj4+IDEzIF4gZSA+Pj4gMjIgXiBlIDw8IDMwIF4gZSA8PCAxOSBeIGUgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyA1XG4gICAgICAgIGMgPSB3NSArIGMgKyAoaCA+Pj4gNiBeIGggPj4+IDExIF4gaCA+Pj4gMjUgXiBoIDw8IDI2IF4gaCA8PCAyMSBeIGggPDwgNykgKyAoYiBeIGggJiAoYSBeIGIpKSArIDB4NTlmMTExZjEgfCAwO1xuICAgICAgICBnID0gZyArIGMgfCAwO1xuICAgICAgICBjID0gYyArIChkICYgZSBeIGYgJiAoZCBeIGUpKSArIChkID4+PiAyIF4gZCA+Pj4gMTMgXiBkID4+PiAyMiBeIGQgPDwgMzAgXiBkIDw8IDE5IF4gZCA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDZcbiAgICAgICAgYiA9IHc2ICsgYiArIChnID4+PiA2IF4gZyA+Pj4gMTEgXiBnID4+PiAyNSBeIGcgPDwgMjYgXiBnIDw8IDIxIF4gZyA8PCA3KSArIChhIF4gZyAmIChoIF4gYSkpICsgMHg5MjNmODJhNCB8IDA7XG4gICAgICAgIGYgPSBmICsgYiB8IDA7XG4gICAgICAgIGIgPSBiICsgKGMgJiBkIF4gZSAmIChjIF4gZCkpICsgKGMgPj4+IDIgXiBjID4+PiAxMyBeIGMgPj4+IDIyIF4gYyA8PCAzMCBeIGMgPDwgMTkgXiBjIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gN1xuICAgICAgICBhID0gdzcgKyBhICsgKGYgPj4+IDYgXiBmID4+PiAxMSBeIGYgPj4+IDI1IF4gZiA8PCAyNiBeIGYgPDwgMjEgXiBmIDw8IDcpICsgKGggXiBmICYgKGcgXiBoKSkgKyAweGFiMWM1ZWQ1IHwgMDtcbiAgICAgICAgZSA9IGUgKyBhIHwgMDtcbiAgICAgICAgYSA9IGEgKyAoYiAmIGMgXiBkICYgKGIgXiBjKSkgKyAoYiA+Pj4gMiBeIGIgPj4+IDEzIF4gYiA+Pj4gMjIgXiBiIDw8IDMwIF4gYiA8PCAxOSBeIGIgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyA4XG4gICAgICAgIGggPSB3OCArIGggKyAoZSA+Pj4gNiBeIGUgPj4+IDExIF4gZSA+Pj4gMjUgXiBlIDw8IDI2IF4gZSA8PCAyMSBeIGUgPDwgNykgKyAoZyBeIGUgJiAoZiBeIGcpKSArIDB4ZDgwN2FhOTggfCAwO1xuICAgICAgICBkID0gZCArIGggfCAwO1xuICAgICAgICBoID0gaCArIChhICYgYiBeIGMgJiAoYSBeIGIpKSArIChhID4+PiAyIF4gYSA+Pj4gMTMgXiBhID4+PiAyMiBeIGEgPDwgMzAgXiBhIDw8IDE5IF4gYSA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDlcbiAgICAgICAgZyA9IHc5ICsgZyArIChkID4+PiA2IF4gZCA+Pj4gMTEgXiBkID4+PiAyNSBeIGQgPDwgMjYgXiBkIDw8IDIxIF4gZCA8PCA3KSArIChmIF4gZCAmIChlIF4gZikpICsgMHgxMjgzNWIwMSB8IDA7XG4gICAgICAgIGMgPSBjICsgZyB8IDA7XG4gICAgICAgIGcgPSBnICsgKGggJiBhIF4gYiAmIChoIF4gYSkpICsgKGggPj4+IDIgXiBoID4+PiAxMyBeIGggPj4+IDIyIF4gaCA8PCAzMCBeIGggPDwgMTkgXiBoIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gMTBcbiAgICAgICAgZiA9IHcxMCArIGYgKyAoYyA+Pj4gNiBeIGMgPj4+IDExIF4gYyA+Pj4gMjUgXiBjIDw8IDI2IF4gYyA8PCAyMSBeIGMgPDwgNykgKyAoZSBeIGMgJiAoZCBeIGUpKSArIDB4MjQzMTg1YmUgfCAwO1xuICAgICAgICBiID0gYiArIGYgfCAwO1xuICAgICAgICBmID0gZiArIChnICYgaCBeIGEgJiAoZyBeIGgpKSArIChnID4+PiAyIF4gZyA+Pj4gMTMgXiBnID4+PiAyMiBeIGcgPDwgMzAgXiBnIDw8IDE5IF4gZyA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDExXG4gICAgICAgIGUgPSB3MTEgKyBlICsgKGIgPj4+IDYgXiBiID4+PiAxMSBeIGIgPj4+IDI1IF4gYiA8PCAyNiBeIGIgPDwgMjEgXiBiIDw8IDcpICsgKGQgXiBiICYgKGMgXiBkKSkgKyAweDU1MGM3ZGMzIHwgMDtcbiAgICAgICAgYSA9IGEgKyBlIHwgMDtcbiAgICAgICAgZSA9IGUgKyAoZiAmIGcgXiBoICYgKGYgXiBnKSkgKyAoZiA+Pj4gMiBeIGYgPj4+IDEzIF4gZiA+Pj4gMjIgXiBmIDw8IDMwIF4gZiA8PCAxOSBeIGYgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyAxMlxuICAgICAgICBkID0gdzEyICsgZCArIChhID4+PiA2IF4gYSA+Pj4gMTEgXiBhID4+PiAyNSBeIGEgPDwgMjYgXiBhIDw8IDIxIF4gYSA8PCA3KSArIChjIF4gYSAmIChiIF4gYykpICsgMHg3MmJlNWQ3NCB8IDA7XG4gICAgICAgIGggPSBoICsgZCB8IDA7XG4gICAgICAgIGQgPSBkICsgKGUgJiBmIF4gZyAmIChlIF4gZikpICsgKGUgPj4+IDIgXiBlID4+PiAxMyBeIGUgPj4+IDIyIF4gZSA8PCAzMCBeIGUgPDwgMTkgXiBlIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gMTNcbiAgICAgICAgYyA9IHcxMyArIGMgKyAoaCA+Pj4gNiBeIGggPj4+IDExIF4gaCA+Pj4gMjUgXiBoIDw8IDI2IF4gaCA8PCAyMSBeIGggPDwgNykgKyAoYiBeIGggJiAoYSBeIGIpKSArIDB4ODBkZWIxZmUgfCAwO1xuICAgICAgICBnID0gZyArIGMgfCAwO1xuICAgICAgICBjID0gYyArIChkICYgZSBeIGYgJiAoZCBeIGUpKSArIChkID4+PiAyIF4gZCA+Pj4gMTMgXiBkID4+PiAyMiBeIGQgPDwgMzAgXiBkIDw8IDE5IF4gZCA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDE0XG4gICAgICAgIGIgPSB3MTQgKyBiICsgKGcgPj4+IDYgXiBnID4+PiAxMSBeIGcgPj4+IDI1IF4gZyA8PCAyNiBeIGcgPDwgMjEgXiBnIDw8IDcpICsgKGEgXiBnICYgKGggXiBhKSkgKyAweDliZGMwNmE3IHwgMDtcbiAgICAgICAgZiA9IGYgKyBiIHwgMDtcbiAgICAgICAgYiA9IGIgKyAoYyAmIGQgXiBlICYgKGMgXiBkKSkgKyAoYyA+Pj4gMiBeIGMgPj4+IDEzIF4gYyA+Pj4gMjIgXiBjIDw8IDMwIF4gYyA8PCAxOSBeIGMgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyAxNVxuICAgICAgICBhID0gdzE1ICsgYSArIChmID4+PiA2IF4gZiA+Pj4gMTEgXiBmID4+PiAyNSBeIGYgPDwgMjYgXiBmIDw8IDIxIF4gZiA8PCA3KSArIChoIF4gZiAmIChnIF4gaCkpICsgMHhjMTliZjE3NCB8IDA7XG4gICAgICAgIGUgPSBlICsgYSB8IDA7XG4gICAgICAgIGEgPSBhICsgKGIgJiBjIF4gZCAmIChiIF4gYykpICsgKGIgPj4+IDIgXiBiID4+PiAxMyBeIGIgPj4+IDIyIF4gYiA8PCAzMCBeIGIgPDwgMTkgXiBiIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gMTZcbiAgICAgICAgdzAgPSAodzEgPj4+IDcgXiB3MSA+Pj4gMTggXiB3MSA+Pj4gMyBeIHcxIDw8IDI1IF4gdzEgPDwgMTQpICsgKHcxNCA+Pj4gMTcgXiB3MTQgPj4+IDE5IF4gdzE0ID4+PiAxMCBeIHcxNCA8PCAxNSBeIHcxNCA8PCAxMykgKyB3MCArIHc5IHwgMDtcbiAgICAgICAgaCA9IHcwICsgaCArIChlID4+PiA2IF4gZSA+Pj4gMTEgXiBlID4+PiAyNSBeIGUgPDwgMjYgXiBlIDw8IDIxIF4gZSA8PCA3KSArIChnIF4gZSAmIChmIF4gZykpICsgMHhlNDliNjljMSB8IDA7XG4gICAgICAgIGQgPSBkICsgaCB8IDA7XG4gICAgICAgIGggPSBoICsgKGEgJiBiIF4gYyAmIChhIF4gYikpICsgKGEgPj4+IDIgXiBhID4+PiAxMyBeIGEgPj4+IDIyIF4gYSA8PCAzMCBeIGEgPDwgMTkgXiBhIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gMTdcbiAgICAgICAgdzEgPSAodzIgPj4+IDcgXiB3MiA+Pj4gMTggXiB3MiA+Pj4gMyBeIHcyIDw8IDI1IF4gdzIgPDwgMTQpICsgKHcxNSA+Pj4gMTcgXiB3MTUgPj4+IDE5IF4gdzE1ID4+PiAxMCBeIHcxNSA8PCAxNSBeIHcxNSA8PCAxMykgKyB3MSArIHcxMCB8IDA7XG4gICAgICAgIGcgPSB3MSArIGcgKyAoZCA+Pj4gNiBeIGQgPj4+IDExIF4gZCA+Pj4gMjUgXiBkIDw8IDI2IF4gZCA8PCAyMSBeIGQgPDwgNykgKyAoZiBeIGQgJiAoZSBeIGYpKSArIDB4ZWZiZTQ3ODYgfCAwO1xuICAgICAgICBjID0gYyArIGcgfCAwO1xuICAgICAgICBnID0gZyArIChoICYgYSBeIGIgJiAoaCBeIGEpKSArIChoID4+PiAyIF4gaCA+Pj4gMTMgXiBoID4+PiAyMiBeIGggPDwgMzAgXiBoIDw8IDE5IF4gaCA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDE4XG4gICAgICAgIHcyID0gKHczID4+PiA3IF4gdzMgPj4+IDE4IF4gdzMgPj4+IDMgXiB3MyA8PCAyNSBeIHczIDw8IDE0KSArICh3MCA+Pj4gMTcgXiB3MCA+Pj4gMTkgXiB3MCA+Pj4gMTAgXiB3MCA8PCAxNSBeIHcwIDw8IDEzKSArIHcyICsgdzExIHwgMDtcbiAgICAgICAgZiA9IHcyICsgZiArIChjID4+PiA2IF4gYyA+Pj4gMTEgXiBjID4+PiAyNSBeIGMgPDwgMjYgXiBjIDw8IDIxIF4gYyA8PCA3KSArIChlIF4gYyAmIChkIF4gZSkpICsgMHgwZmMxOWRjNiB8IDA7XG4gICAgICAgIGIgPSBiICsgZiB8IDA7XG4gICAgICAgIGYgPSBmICsgKGcgJiBoIF4gYSAmIChnIF4gaCkpICsgKGcgPj4+IDIgXiBnID4+PiAxMyBeIGcgPj4+IDIyIF4gZyA8PCAzMCBeIGcgPDwgMTkgXiBnIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gMTlcbiAgICAgICAgdzMgPSAodzQgPj4+IDcgXiB3NCA+Pj4gMTggXiB3NCA+Pj4gMyBeIHc0IDw8IDI1IF4gdzQgPDwgMTQpICsgKHcxID4+PiAxNyBeIHcxID4+PiAxOSBeIHcxID4+PiAxMCBeIHcxIDw8IDE1IF4gdzEgPDwgMTMpICsgdzMgKyB3MTIgfCAwO1xuICAgICAgICBlID0gdzMgKyBlICsgKGIgPj4+IDYgXiBiID4+PiAxMSBeIGIgPj4+IDI1IF4gYiA8PCAyNiBeIGIgPDwgMjEgXiBiIDw8IDcpICsgKGQgXiBiICYgKGMgXiBkKSkgKyAweDI0MGNhMWNjIHwgMDtcbiAgICAgICAgYSA9IGEgKyBlIHwgMDtcbiAgICAgICAgZSA9IGUgKyAoZiAmIGcgXiBoICYgKGYgXiBnKSkgKyAoZiA+Pj4gMiBeIGYgPj4+IDEzIF4gZiA+Pj4gMjIgXiBmIDw8IDMwIF4gZiA8PCAxOSBeIGYgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyAyMFxuICAgICAgICB3NCA9ICh3NSA+Pj4gNyBeIHc1ID4+PiAxOCBeIHc1ID4+PiAzIF4gdzUgPDwgMjUgXiB3NSA8PCAxNCkgKyAodzIgPj4+IDE3IF4gdzIgPj4+IDE5IF4gdzIgPj4+IDEwIF4gdzIgPDwgMTUgXiB3MiA8PCAxMykgKyB3NCArIHcxMyB8IDA7XG4gICAgICAgIGQgPSB3NCArIGQgKyAoYSA+Pj4gNiBeIGEgPj4+IDExIF4gYSA+Pj4gMjUgXiBhIDw8IDI2IF4gYSA8PCAyMSBeIGEgPDwgNykgKyAoYyBeIGEgJiAoYiBeIGMpKSArIDB4MmRlOTJjNmYgfCAwO1xuICAgICAgICBoID0gaCArIGQgfCAwO1xuICAgICAgICBkID0gZCArIChlICYgZiBeIGcgJiAoZSBeIGYpKSArIChlID4+PiAyIF4gZSA+Pj4gMTMgXiBlID4+PiAyMiBeIGUgPDwgMzAgXiBlIDw8IDE5IF4gZSA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDIxXG4gICAgICAgIHc1ID0gKHc2ID4+PiA3IF4gdzYgPj4+IDE4IF4gdzYgPj4+IDMgXiB3NiA8PCAyNSBeIHc2IDw8IDE0KSArICh3MyA+Pj4gMTcgXiB3MyA+Pj4gMTkgXiB3MyA+Pj4gMTAgXiB3MyA8PCAxNSBeIHczIDw8IDEzKSArIHc1ICsgdzE0IHwgMDtcbiAgICAgICAgYyA9IHc1ICsgYyArIChoID4+PiA2IF4gaCA+Pj4gMTEgXiBoID4+PiAyNSBeIGggPDwgMjYgXiBoIDw8IDIxIF4gaCA8PCA3KSArIChiIF4gaCAmIChhIF4gYikpICsgMHg0YTc0ODRhYSB8IDA7XG4gICAgICAgIGcgPSBnICsgYyB8IDA7XG4gICAgICAgIGMgPSBjICsgKGQgJiBlIF4gZiAmIChkIF4gZSkpICsgKGQgPj4+IDIgXiBkID4+PiAxMyBeIGQgPj4+IDIyIF4gZCA8PCAzMCBeIGQgPDwgMTkgXiBkIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gMjJcbiAgICAgICAgdzYgPSAodzcgPj4+IDcgXiB3NyA+Pj4gMTggXiB3NyA+Pj4gMyBeIHc3IDw8IDI1IF4gdzcgPDwgMTQpICsgKHc0ID4+PiAxNyBeIHc0ID4+PiAxOSBeIHc0ID4+PiAxMCBeIHc0IDw8IDE1IF4gdzQgPDwgMTMpICsgdzYgKyB3MTUgfCAwO1xuICAgICAgICBiID0gdzYgKyBiICsgKGcgPj4+IDYgXiBnID4+PiAxMSBeIGcgPj4+IDI1IF4gZyA8PCAyNiBeIGcgPDwgMjEgXiBnIDw8IDcpICsgKGEgXiBnICYgKGggXiBhKSkgKyAweDVjYjBhOWRjIHwgMDtcbiAgICAgICAgZiA9IGYgKyBiIHwgMDtcbiAgICAgICAgYiA9IGIgKyAoYyAmIGQgXiBlICYgKGMgXiBkKSkgKyAoYyA+Pj4gMiBeIGMgPj4+IDEzIF4gYyA+Pj4gMjIgXiBjIDw8IDMwIF4gYyA8PCAxOSBeIGMgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyAyM1xuICAgICAgICB3NyA9ICh3OCA+Pj4gNyBeIHc4ID4+PiAxOCBeIHc4ID4+PiAzIF4gdzggPDwgMjUgXiB3OCA8PCAxNCkgKyAodzUgPj4+IDE3IF4gdzUgPj4+IDE5IF4gdzUgPj4+IDEwIF4gdzUgPDwgMTUgXiB3NSA8PCAxMykgKyB3NyArIHcwIHwgMDtcbiAgICAgICAgYSA9IHc3ICsgYSArIChmID4+PiA2IF4gZiA+Pj4gMTEgXiBmID4+PiAyNSBeIGYgPDwgMjYgXiBmIDw8IDIxIF4gZiA8PCA3KSArIChoIF4gZiAmIChnIF4gaCkpICsgMHg3NmY5ODhkYSB8IDA7XG4gICAgICAgIGUgPSBlICsgYSB8IDA7XG4gICAgICAgIGEgPSBhICsgKGIgJiBjIF4gZCAmIChiIF4gYykpICsgKGIgPj4+IDIgXiBiID4+PiAxMyBeIGIgPj4+IDIyIF4gYiA8PCAzMCBeIGIgPDwgMTkgXiBiIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gMjRcbiAgICAgICAgdzggPSAodzkgPj4+IDcgXiB3OSA+Pj4gMTggXiB3OSA+Pj4gMyBeIHc5IDw8IDI1IF4gdzkgPDwgMTQpICsgKHc2ID4+PiAxNyBeIHc2ID4+PiAxOSBeIHc2ID4+PiAxMCBeIHc2IDw8IDE1IF4gdzYgPDwgMTMpICsgdzggKyB3MSB8IDA7XG4gICAgICAgIGggPSB3OCArIGggKyAoZSA+Pj4gNiBeIGUgPj4+IDExIF4gZSA+Pj4gMjUgXiBlIDw8IDI2IF4gZSA8PCAyMSBeIGUgPDwgNykgKyAoZyBeIGUgJiAoZiBeIGcpKSArIDB4OTgzZTUxNTIgfCAwO1xuICAgICAgICBkID0gZCArIGggfCAwO1xuICAgICAgICBoID0gaCArIChhICYgYiBeIGMgJiAoYSBeIGIpKSArIChhID4+PiAyIF4gYSA+Pj4gMTMgXiBhID4+PiAyMiBeIGEgPDwgMzAgXiBhIDw8IDE5IF4gYSA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDI1XG4gICAgICAgIHc5ID0gKHcxMCA+Pj4gNyBeIHcxMCA+Pj4gMTggXiB3MTAgPj4+IDMgXiB3MTAgPDwgMjUgXiB3MTAgPDwgMTQpICsgKHc3ID4+PiAxNyBeIHc3ID4+PiAxOSBeIHc3ID4+PiAxMCBeIHc3IDw8IDE1IF4gdzcgPDwgMTMpICsgdzkgKyB3MiB8IDA7XG4gICAgICAgIGcgPSB3OSArIGcgKyAoZCA+Pj4gNiBeIGQgPj4+IDExIF4gZCA+Pj4gMjUgXiBkIDw8IDI2IF4gZCA8PCAyMSBeIGQgPDwgNykgKyAoZiBeIGQgJiAoZSBeIGYpKSArIDB4YTgzMWM2NmQgfCAwO1xuICAgICAgICBjID0gYyArIGcgfCAwO1xuICAgICAgICBnID0gZyArIChoICYgYSBeIGIgJiAoaCBeIGEpKSArIChoID4+PiAyIF4gaCA+Pj4gMTMgXiBoID4+PiAyMiBeIGggPDwgMzAgXiBoIDw8IDE5IF4gaCA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDI2XG4gICAgICAgIHcxMCA9ICh3MTEgPj4+IDcgXiB3MTEgPj4+IDE4IF4gdzExID4+PiAzIF4gdzExIDw8IDI1IF4gdzExIDw8IDE0KSArICh3OCA+Pj4gMTcgXiB3OCA+Pj4gMTkgXiB3OCA+Pj4gMTAgXiB3OCA8PCAxNSBeIHc4IDw8IDEzKSArIHcxMCArIHczIHwgMDtcbiAgICAgICAgZiA9IHcxMCArIGYgKyAoYyA+Pj4gNiBeIGMgPj4+IDExIF4gYyA+Pj4gMjUgXiBjIDw8IDI2IF4gYyA8PCAyMSBeIGMgPDwgNykgKyAoZSBeIGMgJiAoZCBeIGUpKSArIDB4YjAwMzI3YzggfCAwO1xuICAgICAgICBiID0gYiArIGYgfCAwO1xuICAgICAgICBmID0gZiArIChnICYgaCBeIGEgJiAoZyBeIGgpKSArIChnID4+PiAyIF4gZyA+Pj4gMTMgXiBnID4+PiAyMiBeIGcgPDwgMzAgXiBnIDw8IDE5IF4gZyA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDI3XG4gICAgICAgIHcxMSA9ICh3MTIgPj4+IDcgXiB3MTIgPj4+IDE4IF4gdzEyID4+PiAzIF4gdzEyIDw8IDI1IF4gdzEyIDw8IDE0KSArICh3OSA+Pj4gMTcgXiB3OSA+Pj4gMTkgXiB3OSA+Pj4gMTAgXiB3OSA8PCAxNSBeIHc5IDw8IDEzKSArIHcxMSArIHc0IHwgMDtcbiAgICAgICAgZSA9IHcxMSArIGUgKyAoYiA+Pj4gNiBeIGIgPj4+IDExIF4gYiA+Pj4gMjUgXiBiIDw8IDI2IF4gYiA8PCAyMSBeIGIgPDwgNykgKyAoZCBeIGIgJiAoYyBeIGQpKSArIDB4YmY1OTdmYzcgfCAwO1xuICAgICAgICBhID0gYSArIGUgfCAwO1xuICAgICAgICBlID0gZSArIChmICYgZyBeIGggJiAoZiBeIGcpKSArIChmID4+PiAyIF4gZiA+Pj4gMTMgXiBmID4+PiAyMiBeIGYgPDwgMzAgXiBmIDw8IDE5IF4gZiA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDI4XG4gICAgICAgIHcxMiA9ICh3MTMgPj4+IDcgXiB3MTMgPj4+IDE4IF4gdzEzID4+PiAzIF4gdzEzIDw8IDI1IF4gdzEzIDw8IDE0KSArICh3MTAgPj4+IDE3IF4gdzEwID4+PiAxOSBeIHcxMCA+Pj4gMTAgXiB3MTAgPDwgMTUgXiB3MTAgPDwgMTMpICsgdzEyICsgdzUgfCAwO1xuICAgICAgICBkID0gdzEyICsgZCArIChhID4+PiA2IF4gYSA+Pj4gMTEgXiBhID4+PiAyNSBeIGEgPDwgMjYgXiBhIDw8IDIxIF4gYSA8PCA3KSArIChjIF4gYSAmIChiIF4gYykpICsgMHhjNmUwMGJmMyB8IDA7XG4gICAgICAgIGggPSBoICsgZCB8IDA7XG4gICAgICAgIGQgPSBkICsgKGUgJiBmIF4gZyAmIChlIF4gZikpICsgKGUgPj4+IDIgXiBlID4+PiAxMyBeIGUgPj4+IDIyIF4gZSA8PCAzMCBeIGUgPDwgMTkgXiBlIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gMjlcbiAgICAgICAgdzEzID0gKHcxNCA+Pj4gNyBeIHcxNCA+Pj4gMTggXiB3MTQgPj4+IDMgXiB3MTQgPDwgMjUgXiB3MTQgPDwgMTQpICsgKHcxMSA+Pj4gMTcgXiB3MTEgPj4+IDE5IF4gdzExID4+PiAxMCBeIHcxMSA8PCAxNSBeIHcxMSA8PCAxMykgKyB3MTMgKyB3NiB8IDA7XG4gICAgICAgIGMgPSB3MTMgKyBjICsgKGggPj4+IDYgXiBoID4+PiAxMSBeIGggPj4+IDI1IF4gaCA8PCAyNiBeIGggPDwgMjEgXiBoIDw8IDcpICsgKGIgXiBoICYgKGEgXiBiKSkgKyAweGQ1YTc5MTQ3IHwgMDtcbiAgICAgICAgZyA9IGcgKyBjIHwgMDtcbiAgICAgICAgYyA9IGMgKyAoZCAmIGUgXiBmICYgKGQgXiBlKSkgKyAoZCA+Pj4gMiBeIGQgPj4+IDEzIF4gZCA+Pj4gMjIgXiBkIDw8IDMwIF4gZCA8PCAxOSBeIGQgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyAzMFxuICAgICAgICB3MTQgPSAodzE1ID4+PiA3IF4gdzE1ID4+PiAxOCBeIHcxNSA+Pj4gMyBeIHcxNSA8PCAyNSBeIHcxNSA8PCAxNCkgKyAodzEyID4+PiAxNyBeIHcxMiA+Pj4gMTkgXiB3MTIgPj4+IDEwIF4gdzEyIDw8IDE1IF4gdzEyIDw8IDEzKSArIHcxNCArIHc3IHwgMDtcbiAgICAgICAgYiA9IHcxNCArIGIgKyAoZyA+Pj4gNiBeIGcgPj4+IDExIF4gZyA+Pj4gMjUgXiBnIDw8IDI2IF4gZyA8PCAyMSBeIGcgPDwgNykgKyAoYSBeIGcgJiAoaCBeIGEpKSArIDB4MDZjYTYzNTEgfCAwO1xuICAgICAgICBmID0gZiArIGIgfCAwO1xuICAgICAgICBiID0gYiArIChjICYgZCBeIGUgJiAoYyBeIGQpKSArIChjID4+PiAyIF4gYyA+Pj4gMTMgXiBjID4+PiAyMiBeIGMgPDwgMzAgXiBjIDw8IDE5IF4gYyA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDMxXG4gICAgICAgIHcxNSA9ICh3MCA+Pj4gNyBeIHcwID4+PiAxOCBeIHcwID4+PiAzIF4gdzAgPDwgMjUgXiB3MCA8PCAxNCkgKyAodzEzID4+PiAxNyBeIHcxMyA+Pj4gMTkgXiB3MTMgPj4+IDEwIF4gdzEzIDw8IDE1IF4gdzEzIDw8IDEzKSArIHcxNSArIHc4IHwgMDtcbiAgICAgICAgYSA9IHcxNSArIGEgKyAoZiA+Pj4gNiBeIGYgPj4+IDExIF4gZiA+Pj4gMjUgXiBmIDw8IDI2IF4gZiA8PCAyMSBeIGYgPDwgNykgKyAoaCBeIGYgJiAoZyBeIGgpKSArIDB4MTQyOTI5NjcgfCAwO1xuICAgICAgICBlID0gZSArIGEgfCAwO1xuICAgICAgICBhID0gYSArIChiICYgYyBeIGQgJiAoYiBeIGMpKSArIChiID4+PiAyIF4gYiA+Pj4gMTMgXiBiID4+PiAyMiBeIGIgPDwgMzAgXiBiIDw8IDE5IF4gYiA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDMyXG4gICAgICAgIHcwID0gKHcxID4+PiA3IF4gdzEgPj4+IDE4IF4gdzEgPj4+IDMgXiB3MSA8PCAyNSBeIHcxIDw8IDE0KSArICh3MTQgPj4+IDE3IF4gdzE0ID4+PiAxOSBeIHcxNCA+Pj4gMTAgXiB3MTQgPDwgMTUgXiB3MTQgPDwgMTMpICsgdzAgKyB3OSB8IDA7XG4gICAgICAgIGggPSB3MCArIGggKyAoZSA+Pj4gNiBeIGUgPj4+IDExIF4gZSA+Pj4gMjUgXiBlIDw8IDI2IF4gZSA8PCAyMSBeIGUgPDwgNykgKyAoZyBeIGUgJiAoZiBeIGcpKSArIDB4MjdiNzBhODUgfCAwO1xuICAgICAgICBkID0gZCArIGggfCAwO1xuICAgICAgICBoID0gaCArIChhICYgYiBeIGMgJiAoYSBeIGIpKSArIChhID4+PiAyIF4gYSA+Pj4gMTMgXiBhID4+PiAyMiBeIGEgPDwgMzAgXiBhIDw8IDE5IF4gYSA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDMzXG4gICAgICAgIHcxID0gKHcyID4+PiA3IF4gdzIgPj4+IDE4IF4gdzIgPj4+IDMgXiB3MiA8PCAyNSBeIHcyIDw8IDE0KSArICh3MTUgPj4+IDE3IF4gdzE1ID4+PiAxOSBeIHcxNSA+Pj4gMTAgXiB3MTUgPDwgMTUgXiB3MTUgPDwgMTMpICsgdzEgKyB3MTAgfCAwO1xuICAgICAgICBnID0gdzEgKyBnICsgKGQgPj4+IDYgXiBkID4+PiAxMSBeIGQgPj4+IDI1IF4gZCA8PCAyNiBeIGQgPDwgMjEgXiBkIDw8IDcpICsgKGYgXiBkICYgKGUgXiBmKSkgKyAweDJlMWIyMTM4IHwgMDtcbiAgICAgICAgYyA9IGMgKyBnIHwgMDtcbiAgICAgICAgZyA9IGcgKyAoaCAmIGEgXiBiICYgKGggXiBhKSkgKyAoaCA+Pj4gMiBeIGggPj4+IDEzIF4gaCA+Pj4gMjIgXiBoIDw8IDMwIF4gaCA8PCAxOSBeIGggPDwgMTApIHwgMDtcblxuICAgICAgICAvLyAzNFxuICAgICAgICB3MiA9ICh3MyA+Pj4gNyBeIHczID4+PiAxOCBeIHczID4+PiAzIF4gdzMgPDwgMjUgXiB3MyA8PCAxNCkgKyAodzAgPj4+IDE3IF4gdzAgPj4+IDE5IF4gdzAgPj4+IDEwIF4gdzAgPDwgMTUgXiB3MCA8PCAxMykgKyB3MiArIHcxMSB8IDA7XG4gICAgICAgIGYgPSB3MiArIGYgKyAoYyA+Pj4gNiBeIGMgPj4+IDExIF4gYyA+Pj4gMjUgXiBjIDw8IDI2IF4gYyA8PCAyMSBeIGMgPDwgNykgKyAoZSBeIGMgJiAoZCBeIGUpKSArIDB4NGQyYzZkZmMgfCAwO1xuICAgICAgICBiID0gYiArIGYgfCAwO1xuICAgICAgICBmID0gZiArIChnICYgaCBeIGEgJiAoZyBeIGgpKSArIChnID4+PiAyIF4gZyA+Pj4gMTMgXiBnID4+PiAyMiBeIGcgPDwgMzAgXiBnIDw8IDE5IF4gZyA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDM1XG4gICAgICAgIHczID0gKHc0ID4+PiA3IF4gdzQgPj4+IDE4IF4gdzQgPj4+IDMgXiB3NCA8PCAyNSBeIHc0IDw8IDE0KSArICh3MSA+Pj4gMTcgXiB3MSA+Pj4gMTkgXiB3MSA+Pj4gMTAgXiB3MSA8PCAxNSBeIHcxIDw8IDEzKSArIHczICsgdzEyIHwgMDtcbiAgICAgICAgZSA9IHczICsgZSArIChiID4+PiA2IF4gYiA+Pj4gMTEgXiBiID4+PiAyNSBeIGIgPDwgMjYgXiBiIDw8IDIxIF4gYiA8PCA3KSArIChkIF4gYiAmIChjIF4gZCkpICsgMHg1MzM4MGQxMyB8IDA7XG4gICAgICAgIGEgPSBhICsgZSB8IDA7XG4gICAgICAgIGUgPSBlICsgKGYgJiBnIF4gaCAmIChmIF4gZykpICsgKGYgPj4+IDIgXiBmID4+PiAxMyBeIGYgPj4+IDIyIF4gZiA8PCAzMCBeIGYgPDwgMTkgXiBmIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gMzZcbiAgICAgICAgdzQgPSAodzUgPj4+IDcgXiB3NSA+Pj4gMTggXiB3NSA+Pj4gMyBeIHc1IDw8IDI1IF4gdzUgPDwgMTQpICsgKHcyID4+PiAxNyBeIHcyID4+PiAxOSBeIHcyID4+PiAxMCBeIHcyIDw8IDE1IF4gdzIgPDwgMTMpICsgdzQgKyB3MTMgfCAwO1xuICAgICAgICBkID0gdzQgKyBkICsgKGEgPj4+IDYgXiBhID4+PiAxMSBeIGEgPj4+IDI1IF4gYSA8PCAyNiBeIGEgPDwgMjEgXiBhIDw8IDcpICsgKGMgXiBhICYgKGIgXiBjKSkgKyAweDY1MGE3MzU0IHwgMDtcbiAgICAgICAgaCA9IGggKyBkIHwgMDtcbiAgICAgICAgZCA9IGQgKyAoZSAmIGYgXiBnICYgKGUgXiBmKSkgKyAoZSA+Pj4gMiBeIGUgPj4+IDEzIF4gZSA+Pj4gMjIgXiBlIDw8IDMwIF4gZSA8PCAxOSBeIGUgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyAzN1xuICAgICAgICB3NSA9ICh3NiA+Pj4gNyBeIHc2ID4+PiAxOCBeIHc2ID4+PiAzIF4gdzYgPDwgMjUgXiB3NiA8PCAxNCkgKyAodzMgPj4+IDE3IF4gdzMgPj4+IDE5IF4gdzMgPj4+IDEwIF4gdzMgPDwgMTUgXiB3MyA8PCAxMykgKyB3NSArIHcxNCB8IDA7XG4gICAgICAgIGMgPSB3NSArIGMgKyAoaCA+Pj4gNiBeIGggPj4+IDExIF4gaCA+Pj4gMjUgXiBoIDw8IDI2IF4gaCA8PCAyMSBeIGggPDwgNykgKyAoYiBeIGggJiAoYSBeIGIpKSArIDB4NzY2YTBhYmIgfCAwO1xuICAgICAgICBnID0gZyArIGMgfCAwO1xuICAgICAgICBjID0gYyArIChkICYgZSBeIGYgJiAoZCBeIGUpKSArIChkID4+PiAyIF4gZCA+Pj4gMTMgXiBkID4+PiAyMiBeIGQgPDwgMzAgXiBkIDw8IDE5IF4gZCA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDM4XG4gICAgICAgIHc2ID0gKHc3ID4+PiA3IF4gdzcgPj4+IDE4IF4gdzcgPj4+IDMgXiB3NyA8PCAyNSBeIHc3IDw8IDE0KSArICh3NCA+Pj4gMTcgXiB3NCA+Pj4gMTkgXiB3NCA+Pj4gMTAgXiB3NCA8PCAxNSBeIHc0IDw8IDEzKSArIHc2ICsgdzE1IHwgMDtcbiAgICAgICAgYiA9IHc2ICsgYiArIChnID4+PiA2IF4gZyA+Pj4gMTEgXiBnID4+PiAyNSBeIGcgPDwgMjYgXiBnIDw8IDIxIF4gZyA8PCA3KSArIChhIF4gZyAmIChoIF4gYSkpICsgMHg4MWMyYzkyZSB8IDA7XG4gICAgICAgIGYgPSBmICsgYiB8IDA7XG4gICAgICAgIGIgPSBiICsgKGMgJiBkIF4gZSAmIChjIF4gZCkpICsgKGMgPj4+IDIgXiBjID4+PiAxMyBeIGMgPj4+IDIyIF4gYyA8PCAzMCBeIGMgPDwgMTkgXiBjIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gMzlcbiAgICAgICAgdzcgPSAodzggPj4+IDcgXiB3OCA+Pj4gMTggXiB3OCA+Pj4gMyBeIHc4IDw8IDI1IF4gdzggPDwgMTQpICsgKHc1ID4+PiAxNyBeIHc1ID4+PiAxOSBeIHc1ID4+PiAxMCBeIHc1IDw8IDE1IF4gdzUgPDwgMTMpICsgdzcgKyB3MCB8IDA7XG4gICAgICAgIGEgPSB3NyArIGEgKyAoZiA+Pj4gNiBeIGYgPj4+IDExIF4gZiA+Pj4gMjUgXiBmIDw8IDI2IF4gZiA8PCAyMSBeIGYgPDwgNykgKyAoaCBeIGYgJiAoZyBeIGgpKSArIDB4OTI3MjJjODUgfCAwO1xuICAgICAgICBlID0gZSArIGEgfCAwO1xuICAgICAgICBhID0gYSArIChiICYgYyBeIGQgJiAoYiBeIGMpKSArIChiID4+PiAyIF4gYiA+Pj4gMTMgXiBiID4+PiAyMiBeIGIgPDwgMzAgXiBiIDw8IDE5IF4gYiA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDQwXG4gICAgICAgIHc4ID0gKHc5ID4+PiA3IF4gdzkgPj4+IDE4IF4gdzkgPj4+IDMgXiB3OSA8PCAyNSBeIHc5IDw8IDE0KSArICh3NiA+Pj4gMTcgXiB3NiA+Pj4gMTkgXiB3NiA+Pj4gMTAgXiB3NiA8PCAxNSBeIHc2IDw8IDEzKSArIHc4ICsgdzEgfCAwO1xuICAgICAgICBoID0gdzggKyBoICsgKGUgPj4+IDYgXiBlID4+PiAxMSBeIGUgPj4+IDI1IF4gZSA8PCAyNiBeIGUgPDwgMjEgXiBlIDw8IDcpICsgKGcgXiBlICYgKGYgXiBnKSkgKyAweGEyYmZlOGExIHwgMDtcbiAgICAgICAgZCA9IGQgKyBoIHwgMDtcbiAgICAgICAgaCA9IGggKyAoYSAmIGIgXiBjICYgKGEgXiBiKSkgKyAoYSA+Pj4gMiBeIGEgPj4+IDEzIF4gYSA+Pj4gMjIgXiBhIDw8IDMwIF4gYSA8PCAxOSBeIGEgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyA0MVxuICAgICAgICB3OSA9ICh3MTAgPj4+IDcgXiB3MTAgPj4+IDE4IF4gdzEwID4+PiAzIF4gdzEwIDw8IDI1IF4gdzEwIDw8IDE0KSArICh3NyA+Pj4gMTcgXiB3NyA+Pj4gMTkgXiB3NyA+Pj4gMTAgXiB3NyA8PCAxNSBeIHc3IDw8IDEzKSArIHc5ICsgdzIgfCAwO1xuICAgICAgICBnID0gdzkgKyBnICsgKGQgPj4+IDYgXiBkID4+PiAxMSBeIGQgPj4+IDI1IF4gZCA8PCAyNiBeIGQgPDwgMjEgXiBkIDw8IDcpICsgKGYgXiBkICYgKGUgXiBmKSkgKyAweGE4MWE2NjRiIHwgMDtcbiAgICAgICAgYyA9IGMgKyBnIHwgMDtcbiAgICAgICAgZyA9IGcgKyAoaCAmIGEgXiBiICYgKGggXiBhKSkgKyAoaCA+Pj4gMiBeIGggPj4+IDEzIF4gaCA+Pj4gMjIgXiBoIDw8IDMwIF4gaCA8PCAxOSBeIGggPDwgMTApIHwgMDtcblxuICAgICAgICAvLyA0MlxuICAgICAgICB3MTAgPSAodzExID4+PiA3IF4gdzExID4+PiAxOCBeIHcxMSA+Pj4gMyBeIHcxMSA8PCAyNSBeIHcxMSA8PCAxNCkgKyAodzggPj4+IDE3IF4gdzggPj4+IDE5IF4gdzggPj4+IDEwIF4gdzggPDwgMTUgXiB3OCA8PCAxMykgKyB3MTAgKyB3MyB8IDA7XG4gICAgICAgIGYgPSB3MTAgKyBmICsgKGMgPj4+IDYgXiBjID4+PiAxMSBeIGMgPj4+IDI1IF4gYyA8PCAyNiBeIGMgPDwgMjEgXiBjIDw8IDcpICsgKGUgXiBjICYgKGQgXiBlKSkgKyAweGMyNGI4YjcwIHwgMDtcbiAgICAgICAgYiA9IGIgKyBmIHwgMDtcbiAgICAgICAgZiA9IGYgKyAoZyAmIGggXiBhICYgKGcgXiBoKSkgKyAoZyA+Pj4gMiBeIGcgPj4+IDEzIF4gZyA+Pj4gMjIgXiBnIDw8IDMwIF4gZyA8PCAxOSBeIGcgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyA0M1xuICAgICAgICB3MTEgPSAodzEyID4+PiA3IF4gdzEyID4+PiAxOCBeIHcxMiA+Pj4gMyBeIHcxMiA8PCAyNSBeIHcxMiA8PCAxNCkgKyAodzkgPj4+IDE3IF4gdzkgPj4+IDE5IF4gdzkgPj4+IDEwIF4gdzkgPDwgMTUgXiB3OSA8PCAxMykgKyB3MTEgKyB3NCB8IDA7XG4gICAgICAgIGUgPSB3MTEgKyBlICsgKGIgPj4+IDYgXiBiID4+PiAxMSBeIGIgPj4+IDI1IF4gYiA8PCAyNiBeIGIgPDwgMjEgXiBiIDw8IDcpICsgKGQgXiBiICYgKGMgXiBkKSkgKyAweGM3NmM1MWEzIHwgMDtcbiAgICAgICAgYSA9IGEgKyBlIHwgMDtcbiAgICAgICAgZSA9IGUgKyAoZiAmIGcgXiBoICYgKGYgXiBnKSkgKyAoZiA+Pj4gMiBeIGYgPj4+IDEzIF4gZiA+Pj4gMjIgXiBmIDw8IDMwIF4gZiA8PCAxOSBeIGYgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyA0NFxuICAgICAgICB3MTIgPSAodzEzID4+PiA3IF4gdzEzID4+PiAxOCBeIHcxMyA+Pj4gMyBeIHcxMyA8PCAyNSBeIHcxMyA8PCAxNCkgKyAodzEwID4+PiAxNyBeIHcxMCA+Pj4gMTkgXiB3MTAgPj4+IDEwIF4gdzEwIDw8IDE1IF4gdzEwIDw8IDEzKSArIHcxMiArIHc1IHwgMDtcbiAgICAgICAgZCA9IHcxMiArIGQgKyAoYSA+Pj4gNiBeIGEgPj4+IDExIF4gYSA+Pj4gMjUgXiBhIDw8IDI2IF4gYSA8PCAyMSBeIGEgPDwgNykgKyAoYyBeIGEgJiAoYiBeIGMpKSArIDB4ZDE5MmU4MTkgfCAwO1xuICAgICAgICBoID0gaCArIGQgfCAwO1xuICAgICAgICBkID0gZCArIChlICYgZiBeIGcgJiAoZSBeIGYpKSArIChlID4+PiAyIF4gZSA+Pj4gMTMgXiBlID4+PiAyMiBeIGUgPDwgMzAgXiBlIDw8IDE5IF4gZSA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDQ1XG4gICAgICAgIHcxMyA9ICh3MTQgPj4+IDcgXiB3MTQgPj4+IDE4IF4gdzE0ID4+PiAzIF4gdzE0IDw8IDI1IF4gdzE0IDw8IDE0KSArICh3MTEgPj4+IDE3IF4gdzExID4+PiAxOSBeIHcxMSA+Pj4gMTAgXiB3MTEgPDwgMTUgXiB3MTEgPDwgMTMpICsgdzEzICsgdzYgfCAwO1xuICAgICAgICBjID0gdzEzICsgYyArIChoID4+PiA2IF4gaCA+Pj4gMTEgXiBoID4+PiAyNSBeIGggPDwgMjYgXiBoIDw8IDIxIF4gaCA8PCA3KSArIChiIF4gaCAmIChhIF4gYikpICsgMHhkNjk5MDYyNCB8IDA7XG4gICAgICAgIGcgPSBnICsgYyB8IDA7XG4gICAgICAgIGMgPSBjICsgKGQgJiBlIF4gZiAmIChkIF4gZSkpICsgKGQgPj4+IDIgXiBkID4+PiAxMyBeIGQgPj4+IDIyIF4gZCA8PCAzMCBeIGQgPDwgMTkgXiBkIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gNDZcbiAgICAgICAgdzE0ID0gKHcxNSA+Pj4gNyBeIHcxNSA+Pj4gMTggXiB3MTUgPj4+IDMgXiB3MTUgPDwgMjUgXiB3MTUgPDwgMTQpICsgKHcxMiA+Pj4gMTcgXiB3MTIgPj4+IDE5IF4gdzEyID4+PiAxMCBeIHcxMiA8PCAxNSBeIHcxMiA8PCAxMykgKyB3MTQgKyB3NyB8IDA7XG4gICAgICAgIGIgPSB3MTQgKyBiICsgKGcgPj4+IDYgXiBnID4+PiAxMSBeIGcgPj4+IDI1IF4gZyA8PCAyNiBeIGcgPDwgMjEgXiBnIDw8IDcpICsgKGEgXiBnICYgKGggXiBhKSkgKyAweGY0MGUzNTg1IHwgMDtcbiAgICAgICAgZiA9IGYgKyBiIHwgMDtcbiAgICAgICAgYiA9IGIgKyAoYyAmIGQgXiBlICYgKGMgXiBkKSkgKyAoYyA+Pj4gMiBeIGMgPj4+IDEzIF4gYyA+Pj4gMjIgXiBjIDw8IDMwIF4gYyA8PCAxOSBeIGMgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyA0N1xuICAgICAgICB3MTUgPSAodzAgPj4+IDcgXiB3MCA+Pj4gMTggXiB3MCA+Pj4gMyBeIHcwIDw8IDI1IF4gdzAgPDwgMTQpICsgKHcxMyA+Pj4gMTcgXiB3MTMgPj4+IDE5IF4gdzEzID4+PiAxMCBeIHcxMyA8PCAxNSBeIHcxMyA8PCAxMykgKyB3MTUgKyB3OCB8IDA7XG4gICAgICAgIGEgPSB3MTUgKyBhICsgKGYgPj4+IDYgXiBmID4+PiAxMSBeIGYgPj4+IDI1IF4gZiA8PCAyNiBeIGYgPDwgMjEgXiBmIDw8IDcpICsgKGggXiBmICYgKGcgXiBoKSkgKyAweDEwNmFhMDcwIHwgMDtcbiAgICAgICAgZSA9IGUgKyBhIHwgMDtcbiAgICAgICAgYSA9IGEgKyAoYiAmIGMgXiBkICYgKGIgXiBjKSkgKyAoYiA+Pj4gMiBeIGIgPj4+IDEzIF4gYiA+Pj4gMjIgXiBiIDw8IDMwIF4gYiA8PCAxOSBeIGIgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyA0OFxuICAgICAgICB3MCA9ICh3MSA+Pj4gNyBeIHcxID4+PiAxOCBeIHcxID4+PiAzIF4gdzEgPDwgMjUgXiB3MSA8PCAxNCkgKyAodzE0ID4+PiAxNyBeIHcxNCA+Pj4gMTkgXiB3MTQgPj4+IDEwIF4gdzE0IDw8IDE1IF4gdzE0IDw8IDEzKSArIHcwICsgdzkgfCAwO1xuICAgICAgICBoID0gdzAgKyBoICsgKGUgPj4+IDYgXiBlID4+PiAxMSBeIGUgPj4+IDI1IF4gZSA8PCAyNiBeIGUgPDwgMjEgXiBlIDw8IDcpICsgKGcgXiBlICYgKGYgXiBnKSkgKyAweDE5YTRjMTE2IHwgMDtcbiAgICAgICAgZCA9IGQgKyBoIHwgMDtcbiAgICAgICAgaCA9IGggKyAoYSAmIGIgXiBjICYgKGEgXiBiKSkgKyAoYSA+Pj4gMiBeIGEgPj4+IDEzIF4gYSA+Pj4gMjIgXiBhIDw8IDMwIF4gYSA8PCAxOSBeIGEgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyA0OVxuICAgICAgICB3MSA9ICh3MiA+Pj4gNyBeIHcyID4+PiAxOCBeIHcyID4+PiAzIF4gdzIgPDwgMjUgXiB3MiA8PCAxNCkgKyAodzE1ID4+PiAxNyBeIHcxNSA+Pj4gMTkgXiB3MTUgPj4+IDEwIF4gdzE1IDw8IDE1IF4gdzE1IDw8IDEzKSArIHcxICsgdzEwIHwgMDtcbiAgICAgICAgZyA9IHcxICsgZyArIChkID4+PiA2IF4gZCA+Pj4gMTEgXiBkID4+PiAyNSBeIGQgPDwgMjYgXiBkIDw8IDIxIF4gZCA8PCA3KSArIChmIF4gZCAmIChlIF4gZikpICsgMHgxZTM3NmMwOCB8IDA7XG4gICAgICAgIGMgPSBjICsgZyB8IDA7XG4gICAgICAgIGcgPSBnICsgKGggJiBhIF4gYiAmIChoIF4gYSkpICsgKGggPj4+IDIgXiBoID4+PiAxMyBeIGggPj4+IDIyIF4gaCA8PCAzMCBeIGggPDwgMTkgXiBoIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gNTBcbiAgICAgICAgdzIgPSAodzMgPj4+IDcgXiB3MyA+Pj4gMTggXiB3MyA+Pj4gMyBeIHczIDw8IDI1IF4gdzMgPDwgMTQpICsgKHcwID4+PiAxNyBeIHcwID4+PiAxOSBeIHcwID4+PiAxMCBeIHcwIDw8IDE1IF4gdzAgPDwgMTMpICsgdzIgKyB3MTEgfCAwO1xuICAgICAgICBmID0gdzIgKyBmICsgKGMgPj4+IDYgXiBjID4+PiAxMSBeIGMgPj4+IDI1IF4gYyA8PCAyNiBeIGMgPDwgMjEgXiBjIDw8IDcpICsgKGUgXiBjICYgKGQgXiBlKSkgKyAweDI3NDg3NzRjIHwgMDtcbiAgICAgICAgYiA9IGIgKyBmIHwgMDtcbiAgICAgICAgZiA9IGYgKyAoZyAmIGggXiBhICYgKGcgXiBoKSkgKyAoZyA+Pj4gMiBeIGcgPj4+IDEzIF4gZyA+Pj4gMjIgXiBnIDw8IDMwIF4gZyA8PCAxOSBeIGcgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyA1MVxuICAgICAgICB3MyA9ICh3NCA+Pj4gNyBeIHc0ID4+PiAxOCBeIHc0ID4+PiAzIF4gdzQgPDwgMjUgXiB3NCA8PCAxNCkgKyAodzEgPj4+IDE3IF4gdzEgPj4+IDE5IF4gdzEgPj4+IDEwIF4gdzEgPDwgMTUgXiB3MSA8PCAxMykgKyB3MyArIHcxMiB8IDA7XG4gICAgICAgIGUgPSB3MyArIGUgKyAoYiA+Pj4gNiBeIGIgPj4+IDExIF4gYiA+Pj4gMjUgXiBiIDw8IDI2IF4gYiA8PCAyMSBeIGIgPDwgNykgKyAoZCBeIGIgJiAoYyBeIGQpKSArIDB4MzRiMGJjYjUgfCAwO1xuICAgICAgICBhID0gYSArIGUgfCAwO1xuICAgICAgICBlID0gZSArIChmICYgZyBeIGggJiAoZiBeIGcpKSArIChmID4+PiAyIF4gZiA+Pj4gMTMgXiBmID4+PiAyMiBeIGYgPDwgMzAgXiBmIDw8IDE5IF4gZiA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDUyXG4gICAgICAgIHc0ID0gKHc1ID4+PiA3IF4gdzUgPj4+IDE4IF4gdzUgPj4+IDMgXiB3NSA8PCAyNSBeIHc1IDw8IDE0KSArICh3MiA+Pj4gMTcgXiB3MiA+Pj4gMTkgXiB3MiA+Pj4gMTAgXiB3MiA8PCAxNSBeIHcyIDw8IDEzKSArIHc0ICsgdzEzIHwgMDtcbiAgICAgICAgZCA9IHc0ICsgZCArIChhID4+PiA2IF4gYSA+Pj4gMTEgXiBhID4+PiAyNSBeIGEgPDwgMjYgXiBhIDw8IDIxIF4gYSA8PCA3KSArIChjIF4gYSAmIChiIF4gYykpICsgMHgzOTFjMGNiMyB8IDA7XG4gICAgICAgIGggPSBoICsgZCB8IDA7XG4gICAgICAgIGQgPSBkICsgKGUgJiBmIF4gZyAmIChlIF4gZikpICsgKGUgPj4+IDIgXiBlID4+PiAxMyBeIGUgPj4+IDIyIF4gZSA8PCAzMCBeIGUgPDwgMTkgXiBlIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gNTNcbiAgICAgICAgdzUgPSAodzYgPj4+IDcgXiB3NiA+Pj4gMTggXiB3NiA+Pj4gMyBeIHc2IDw8IDI1IF4gdzYgPDwgMTQpICsgKHczID4+PiAxNyBeIHczID4+PiAxOSBeIHczID4+PiAxMCBeIHczIDw8IDE1IF4gdzMgPDwgMTMpICsgdzUgKyB3MTQgfCAwO1xuICAgICAgICBjID0gdzUgKyBjICsgKGggPj4+IDYgXiBoID4+PiAxMSBeIGggPj4+IDI1IF4gaCA8PCAyNiBeIGggPDwgMjEgXiBoIDw8IDcpICsgKGIgXiBoICYgKGEgXiBiKSkgKyAweDRlZDhhYTRhIHwgMDtcbiAgICAgICAgZyA9IGcgKyBjIHwgMDtcbiAgICAgICAgYyA9IGMgKyAoZCAmIGUgXiBmICYgKGQgXiBlKSkgKyAoZCA+Pj4gMiBeIGQgPj4+IDEzIF4gZCA+Pj4gMjIgXiBkIDw8IDMwIF4gZCA8PCAxOSBeIGQgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyA1NFxuICAgICAgICB3NiA9ICh3NyA+Pj4gNyBeIHc3ID4+PiAxOCBeIHc3ID4+PiAzIF4gdzcgPDwgMjUgXiB3NyA8PCAxNCkgKyAodzQgPj4+IDE3IF4gdzQgPj4+IDE5IF4gdzQgPj4+IDEwIF4gdzQgPDwgMTUgXiB3NCA8PCAxMykgKyB3NiArIHcxNSB8IDA7XG4gICAgICAgIGIgPSB3NiArIGIgKyAoZyA+Pj4gNiBeIGcgPj4+IDExIF4gZyA+Pj4gMjUgXiBnIDw8IDI2IF4gZyA8PCAyMSBeIGcgPDwgNykgKyAoYSBeIGcgJiAoaCBeIGEpKSArIDB4NWI5Y2NhNGYgfCAwO1xuICAgICAgICBmID0gZiArIGIgfCAwO1xuICAgICAgICBiID0gYiArIChjICYgZCBeIGUgJiAoYyBeIGQpKSArIChjID4+PiAyIF4gYyA+Pj4gMTMgXiBjID4+PiAyMiBeIGMgPDwgMzAgXiBjIDw8IDE5IF4gYyA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDU1XG4gICAgICAgIHc3ID0gKHc4ID4+PiA3IF4gdzggPj4+IDE4IF4gdzggPj4+IDMgXiB3OCA8PCAyNSBeIHc4IDw8IDE0KSArICh3NSA+Pj4gMTcgXiB3NSA+Pj4gMTkgXiB3NSA+Pj4gMTAgXiB3NSA8PCAxNSBeIHc1IDw8IDEzKSArIHc3ICsgdzAgfCAwO1xuICAgICAgICBhID0gdzcgKyBhICsgKGYgPj4+IDYgXiBmID4+PiAxMSBeIGYgPj4+IDI1IF4gZiA8PCAyNiBeIGYgPDwgMjEgXiBmIDw8IDcpICsgKGggXiBmICYgKGcgXiBoKSkgKyAweDY4MmU2ZmYzIHwgMDtcbiAgICAgICAgZSA9IGUgKyBhIHwgMDtcbiAgICAgICAgYSA9IGEgKyAoYiAmIGMgXiBkICYgKGIgXiBjKSkgKyAoYiA+Pj4gMiBeIGIgPj4+IDEzIF4gYiA+Pj4gMjIgXiBiIDw8IDMwIF4gYiA8PCAxOSBeIGIgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyA1NlxuICAgICAgICB3OCA9ICh3OSA+Pj4gNyBeIHc5ID4+PiAxOCBeIHc5ID4+PiAzIF4gdzkgPDwgMjUgXiB3OSA8PCAxNCkgKyAodzYgPj4+IDE3IF4gdzYgPj4+IDE5IF4gdzYgPj4+IDEwIF4gdzYgPDwgMTUgXiB3NiA8PCAxMykgKyB3OCArIHcxIHwgMDtcbiAgICAgICAgaCA9IHc4ICsgaCArIChlID4+PiA2IF4gZSA+Pj4gMTEgXiBlID4+PiAyNSBeIGUgPDwgMjYgXiBlIDw8IDIxIF4gZSA8PCA3KSArIChnIF4gZSAmIChmIF4gZykpICsgMHg3NDhmODJlZSB8IDA7XG4gICAgICAgIGQgPSBkICsgaCB8IDA7XG4gICAgICAgIGggPSBoICsgKGEgJiBiIF4gYyAmIChhIF4gYikpICsgKGEgPj4+IDIgXiBhID4+PiAxMyBeIGEgPj4+IDIyIF4gYSA8PCAzMCBeIGEgPDwgMTkgXiBhIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gNTdcbiAgICAgICAgdzkgPSAodzEwID4+PiA3IF4gdzEwID4+PiAxOCBeIHcxMCA+Pj4gMyBeIHcxMCA8PCAyNSBeIHcxMCA8PCAxNCkgKyAodzcgPj4+IDE3IF4gdzcgPj4+IDE5IF4gdzcgPj4+IDEwIF4gdzcgPDwgMTUgXiB3NyA8PCAxMykgKyB3OSArIHcyIHwgMDtcbiAgICAgICAgZyA9IHc5ICsgZyArIChkID4+PiA2IF4gZCA+Pj4gMTEgXiBkID4+PiAyNSBeIGQgPDwgMjYgXiBkIDw8IDIxIF4gZCA8PCA3KSArIChmIF4gZCAmIChlIF4gZikpICsgMHg3OGE1NjM2ZiB8IDA7XG4gICAgICAgIGMgPSBjICsgZyB8IDA7XG4gICAgICAgIGcgPSBnICsgKGggJiBhIF4gYiAmIChoIF4gYSkpICsgKGggPj4+IDIgXiBoID4+PiAxMyBeIGggPj4+IDIyIF4gaCA8PCAzMCBeIGggPDwgMTkgXiBoIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gNThcbiAgICAgICAgdzEwID0gKHcxMSA+Pj4gNyBeIHcxMSA+Pj4gMTggXiB3MTEgPj4+IDMgXiB3MTEgPDwgMjUgXiB3MTEgPDwgMTQpICsgKHc4ID4+PiAxNyBeIHc4ID4+PiAxOSBeIHc4ID4+PiAxMCBeIHc4IDw8IDE1IF4gdzggPDwgMTMpICsgdzEwICsgdzMgfCAwO1xuICAgICAgICBmID0gdzEwICsgZiArIChjID4+PiA2IF4gYyA+Pj4gMTEgXiBjID4+PiAyNSBeIGMgPDwgMjYgXiBjIDw8IDIxIF4gYyA8PCA3KSArIChlIF4gYyAmIChkIF4gZSkpICsgMHg4NGM4NzgxNCB8IDA7XG4gICAgICAgIGIgPSBiICsgZiB8IDA7XG4gICAgICAgIGYgPSBmICsgKGcgJiBoIF4gYSAmIChnIF4gaCkpICsgKGcgPj4+IDIgXiBnID4+PiAxMyBeIGcgPj4+IDIyIF4gZyA8PCAzMCBeIGcgPDwgMTkgXiBnIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gNTlcbiAgICAgICAgdzExID0gKHcxMiA+Pj4gNyBeIHcxMiA+Pj4gMTggXiB3MTIgPj4+IDMgXiB3MTIgPDwgMjUgXiB3MTIgPDwgMTQpICsgKHc5ID4+PiAxNyBeIHc5ID4+PiAxOSBeIHc5ID4+PiAxMCBeIHc5IDw8IDE1IF4gdzkgPDwgMTMpICsgdzExICsgdzQgfCAwO1xuICAgICAgICBlID0gdzExICsgZSArIChiID4+PiA2IF4gYiA+Pj4gMTEgXiBiID4+PiAyNSBeIGIgPDwgMjYgXiBiIDw8IDIxIF4gYiA8PCA3KSArIChkIF4gYiAmIChjIF4gZCkpICsgMHg4Y2M3MDIwOCB8IDA7XG4gICAgICAgIGEgPSBhICsgZSB8IDA7XG4gICAgICAgIGUgPSBlICsgKGYgJiBnIF4gaCAmIChmIF4gZykpICsgKGYgPj4+IDIgXiBmID4+PiAxMyBeIGYgPj4+IDIyIF4gZiA8PCAzMCBeIGYgPDwgMTkgXiBmIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gNjBcbiAgICAgICAgdzEyID0gKHcxMyA+Pj4gNyBeIHcxMyA+Pj4gMTggXiB3MTMgPj4+IDMgXiB3MTMgPDwgMjUgXiB3MTMgPDwgMTQpICsgKHcxMCA+Pj4gMTcgXiB3MTAgPj4+IDE5IF4gdzEwID4+PiAxMCBeIHcxMCA8PCAxNSBeIHcxMCA8PCAxMykgKyB3MTIgKyB3NSB8IDA7XG4gICAgICAgIGQgPSB3MTIgKyBkICsgKGEgPj4+IDYgXiBhID4+PiAxMSBeIGEgPj4+IDI1IF4gYSA8PCAyNiBeIGEgPDwgMjEgXiBhIDw8IDcpICsgKGMgXiBhICYgKGIgXiBjKSkgKyAweDkwYmVmZmZhIHwgMDtcbiAgICAgICAgaCA9IGggKyBkIHwgMDtcbiAgICAgICAgZCA9IGQgKyAoZSAmIGYgXiBnICYgKGUgXiBmKSkgKyAoZSA+Pj4gMiBeIGUgPj4+IDEzIF4gZSA+Pj4gMjIgXiBlIDw8IDMwIF4gZSA8PCAxOSBeIGUgPDwgMTApIHwgMDtcblxuICAgICAgICAvLyA2MVxuICAgICAgICB3MTMgPSAodzE0ID4+PiA3IF4gdzE0ID4+PiAxOCBeIHcxNCA+Pj4gMyBeIHcxNCA8PCAyNSBeIHcxNCA8PCAxNCkgKyAodzExID4+PiAxNyBeIHcxMSA+Pj4gMTkgXiB3MTEgPj4+IDEwIF4gdzExIDw8IDE1IF4gdzExIDw8IDEzKSArIHcxMyArIHc2IHwgMDtcbiAgICAgICAgYyA9IHcxMyArIGMgKyAoaCA+Pj4gNiBeIGggPj4+IDExIF4gaCA+Pj4gMjUgXiBoIDw8IDI2IF4gaCA8PCAyMSBeIGggPDwgNykgKyAoYiBeIGggJiAoYSBeIGIpKSArIDB4YTQ1MDZjZWIgfCAwO1xuICAgICAgICBnID0gZyArIGMgfCAwO1xuICAgICAgICBjID0gYyArIChkICYgZSBeIGYgJiAoZCBeIGUpKSArIChkID4+PiAyIF4gZCA+Pj4gMTMgXiBkID4+PiAyMiBeIGQgPDwgMzAgXiBkIDw8IDE5IF4gZCA8PCAxMCkgfCAwO1xuXG4gICAgICAgIC8vIDYyXG4gICAgICAgIHcxNCA9ICh3MTUgPj4+IDcgXiB3MTUgPj4+IDE4IF4gdzE1ID4+PiAzIF4gdzE1IDw8IDI1IF4gdzE1IDw8IDE0KSArICh3MTIgPj4+IDE3IF4gdzEyID4+PiAxOSBeIHcxMiA+Pj4gMTAgXiB3MTIgPDwgMTUgXiB3MTIgPDwgMTMpICsgdzE0ICsgdzcgfCAwO1xuICAgICAgICBiID0gdzE0ICsgYiArIChnID4+PiA2IF4gZyA+Pj4gMTEgXiBnID4+PiAyNSBeIGcgPDwgMjYgXiBnIDw8IDIxIF4gZyA8PCA3KSArIChhIF4gZyAmIChoIF4gYSkpICsgMHhiZWY5YTNmNyB8IDA7XG4gICAgICAgIGYgPSBmICsgYiB8IDA7XG4gICAgICAgIGIgPSBiICsgKGMgJiBkIF4gZSAmIChjIF4gZCkpICsgKGMgPj4+IDIgXiBjID4+PiAxMyBeIGMgPj4+IDIyIF4gYyA8PCAzMCBeIGMgPDwgMTkgXiBjIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgLy8gNjNcbiAgICAgICAgdzE1ID0gKHcwID4+PiA3IF4gdzAgPj4+IDE4IF4gdzAgPj4+IDMgXiB3MCA8PCAyNSBeIHcwIDw8IDE0KSArICh3MTMgPj4+IDE3IF4gdzEzID4+PiAxOSBeIHcxMyA+Pj4gMTAgXiB3MTMgPDwgMTUgXiB3MTMgPDwgMTMpICsgdzE1ICsgdzggfCAwO1xuICAgICAgICBhID0gdzE1ICsgYSArIChmID4+PiA2IF4gZiA+Pj4gMTEgXiBmID4+PiAyNSBeIGYgPDwgMjYgXiBmIDw8IDIxIF4gZiA8PCA3KSArIChoIF4gZiAmIChnIF4gaCkpICsgMHhjNjcxNzhmMiB8IDA7XG4gICAgICAgIGUgPSBlICsgYSB8IDA7XG4gICAgICAgIGEgPSBhICsgKGIgJiBjIF4gZCAmIChiIF4gYykpICsgKGIgPj4+IDIgXiBiID4+PiAxMyBeIGIgPj4+IDIyIF4gYiA8PCAzMCBeIGIgPDwgMTkgXiBiIDw8IDEwKSB8IDA7XG5cbiAgICAgICAgSDAgPSBIMCArIGEgfCAwO1xuICAgICAgICBIMSA9IEgxICsgYiB8IDA7XG4gICAgICAgIEgyID0gSDIgKyBjIHwgMDtcbiAgICAgICAgSDMgPSBIMyArIGQgfCAwO1xuICAgICAgICBINCA9IEg0ICsgZSB8IDA7XG4gICAgICAgIEg1ID0gSDUgKyBmIHwgMDtcbiAgICAgICAgSDYgPSBINiArIGcgfCAwO1xuICAgICAgICBINyA9IEg3ICsgaCB8IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2NvcmVfaGVhcChvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcblxuICAgICAgICBfY29yZShIRUFQW29mZnNldCB8IDBdIDw8IDI0IHwgSEVBUFtvZmZzZXQgfCAxXSA8PCAxNiB8IEhFQVBbb2Zmc2V0IHwgMl0gPDwgOCB8IEhFQVBbb2Zmc2V0IHwgM10sIEhFQVBbb2Zmc2V0IHwgNF0gPDwgMjQgfCBIRUFQW29mZnNldCB8IDVdIDw8IDE2IHwgSEVBUFtvZmZzZXQgfCA2XSA8PCA4IHwgSEVBUFtvZmZzZXQgfCA3XSwgSEVBUFtvZmZzZXQgfCA4XSA8PCAyNCB8IEhFQVBbb2Zmc2V0IHwgOV0gPDwgMTYgfCBIRUFQW29mZnNldCB8IDEwXSA8PCA4IHwgSEVBUFtvZmZzZXQgfCAxMV0sIEhFQVBbb2Zmc2V0IHwgMTJdIDw8IDI0IHwgSEVBUFtvZmZzZXQgfCAxM10gPDwgMTYgfCBIRUFQW29mZnNldCB8IDE0XSA8PCA4IHwgSEVBUFtvZmZzZXQgfCAxNV0sIEhFQVBbb2Zmc2V0IHwgMTZdIDw8IDI0IHwgSEVBUFtvZmZzZXQgfCAxN10gPDwgMTYgfCBIRUFQW29mZnNldCB8IDE4XSA8PCA4IHwgSEVBUFtvZmZzZXQgfCAxOV0sIEhFQVBbb2Zmc2V0IHwgMjBdIDw8IDI0IHwgSEVBUFtvZmZzZXQgfCAyMV0gPDwgMTYgfCBIRUFQW29mZnNldCB8IDIyXSA8PCA4IHwgSEVBUFtvZmZzZXQgfCAyM10sIEhFQVBbb2Zmc2V0IHwgMjRdIDw8IDI0IHwgSEVBUFtvZmZzZXQgfCAyNV0gPDwgMTYgfCBIRUFQW29mZnNldCB8IDI2XSA8PCA4IHwgSEVBUFtvZmZzZXQgfCAyN10sIEhFQVBbb2Zmc2V0IHwgMjhdIDw8IDI0IHwgSEVBUFtvZmZzZXQgfCAyOV0gPDwgMTYgfCBIRUFQW29mZnNldCB8IDMwXSA8PCA4IHwgSEVBUFtvZmZzZXQgfCAzMV0sIEhFQVBbb2Zmc2V0IHwgMzJdIDw8IDI0IHwgSEVBUFtvZmZzZXQgfCAzM10gPDwgMTYgfCBIRUFQW29mZnNldCB8IDM0XSA8PCA4IHwgSEVBUFtvZmZzZXQgfCAzNV0sIEhFQVBbb2Zmc2V0IHwgMzZdIDw8IDI0IHwgSEVBUFtvZmZzZXQgfCAzN10gPDwgMTYgfCBIRUFQW29mZnNldCB8IDM4XSA8PCA4IHwgSEVBUFtvZmZzZXQgfCAzOV0sIEhFQVBbb2Zmc2V0IHwgNDBdIDw8IDI0IHwgSEVBUFtvZmZzZXQgfCA0MV0gPDwgMTYgfCBIRUFQW29mZnNldCB8IDQyXSA8PCA4IHwgSEVBUFtvZmZzZXQgfCA0M10sIEhFQVBbb2Zmc2V0IHwgNDRdIDw8IDI0IHwgSEVBUFtvZmZzZXQgfCA0NV0gPDwgMTYgfCBIRUFQW29mZnNldCB8IDQ2XSA8PCA4IHwgSEVBUFtvZmZzZXQgfCA0N10sIEhFQVBbb2Zmc2V0IHwgNDhdIDw8IDI0IHwgSEVBUFtvZmZzZXQgfCA0OV0gPDwgMTYgfCBIRUFQW29mZnNldCB8IDUwXSA8PCA4IHwgSEVBUFtvZmZzZXQgfCA1MV0sIEhFQVBbb2Zmc2V0IHwgNTJdIDw8IDI0IHwgSEVBUFtvZmZzZXQgfCA1M10gPDwgMTYgfCBIRUFQW29mZnNldCB8IDU0XSA8PCA4IHwgSEVBUFtvZmZzZXQgfCA1NV0sIEhFQVBbb2Zmc2V0IHwgNTZdIDw8IDI0IHwgSEVBUFtvZmZzZXQgfCA1N10gPDwgMTYgfCBIRUFQW29mZnNldCB8IDU4XSA8PCA4IHwgSEVBUFtvZmZzZXQgfCA1OV0sIEhFQVBbb2Zmc2V0IHwgNjBdIDw8IDI0IHwgSEVBUFtvZmZzZXQgfCA2MV0gPDwgMTYgfCBIRUFQW29mZnNldCB8IDYyXSA8PCA4IHwgSEVBUFtvZmZzZXQgfCA2M10pO1xuICAgIH1cblxuICAgIC8vIG9mZnNldCDigJQgbXVsdGlwbGUgb2YgMzJcbiAgICBmdW5jdGlvbiBfc3RhdGVfdG9faGVhcChvdXRwdXQpIHtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0IHwgMDtcblxuICAgICAgICBIRUFQW291dHB1dCB8IDBdID0gSDAgPj4+IDI0O1xuICAgICAgICBIRUFQW291dHB1dCB8IDFdID0gSDAgPj4+IDE2ICYgMjU1O1xuICAgICAgICBIRUFQW291dHB1dCB8IDJdID0gSDAgPj4+IDggJiAyNTU7XG4gICAgICAgIEhFQVBbb3V0cHV0IHwgM10gPSBIMCAmIDI1NTtcbiAgICAgICAgSEVBUFtvdXRwdXQgfCA0XSA9IEgxID4+PiAyNDtcbiAgICAgICAgSEVBUFtvdXRwdXQgfCA1XSA9IEgxID4+PiAxNiAmIDI1NTtcbiAgICAgICAgSEVBUFtvdXRwdXQgfCA2XSA9IEgxID4+PiA4ICYgMjU1O1xuICAgICAgICBIRUFQW291dHB1dCB8IDddID0gSDEgJiAyNTU7XG4gICAgICAgIEhFQVBbb3V0cHV0IHwgOF0gPSBIMiA+Pj4gMjQ7XG4gICAgICAgIEhFQVBbb3V0cHV0IHwgOV0gPSBIMiA+Pj4gMTYgJiAyNTU7XG4gICAgICAgIEhFQVBbb3V0cHV0IHwgMTBdID0gSDIgPj4+IDggJiAyNTU7XG4gICAgICAgIEhFQVBbb3V0cHV0IHwgMTFdID0gSDIgJiAyNTU7XG4gICAgICAgIEhFQVBbb3V0cHV0IHwgMTJdID0gSDMgPj4+IDI0O1xuICAgICAgICBIRUFQW291dHB1dCB8IDEzXSA9IEgzID4+PiAxNiAmIDI1NTtcbiAgICAgICAgSEVBUFtvdXRwdXQgfCAxNF0gPSBIMyA+Pj4gOCAmIDI1NTtcbiAgICAgICAgSEVBUFtvdXRwdXQgfCAxNV0gPSBIMyAmIDI1NTtcbiAgICAgICAgSEVBUFtvdXRwdXQgfCAxNl0gPSBINCA+Pj4gMjQ7XG4gICAgICAgIEhFQVBbb3V0cHV0IHwgMTddID0gSDQgPj4+IDE2ICYgMjU1O1xuICAgICAgICBIRUFQW291dHB1dCB8IDE4XSA9IEg0ID4+PiA4ICYgMjU1O1xuICAgICAgICBIRUFQW291dHB1dCB8IDE5XSA9IEg0ICYgMjU1O1xuICAgICAgICBIRUFQW291dHB1dCB8IDIwXSA9IEg1ID4+PiAyNDtcbiAgICAgICAgSEVBUFtvdXRwdXQgfCAyMV0gPSBINSA+Pj4gMTYgJiAyNTU7XG4gICAgICAgIEhFQVBbb3V0cHV0IHwgMjJdID0gSDUgPj4+IDggJiAyNTU7XG4gICAgICAgIEhFQVBbb3V0cHV0IHwgMjNdID0gSDUgJiAyNTU7XG4gICAgICAgIEhFQVBbb3V0cHV0IHwgMjRdID0gSDYgPj4+IDI0O1xuICAgICAgICBIRUFQW291dHB1dCB8IDI1XSA9IEg2ID4+PiAxNiAmIDI1NTtcbiAgICAgICAgSEVBUFtvdXRwdXQgfCAyNl0gPSBINiA+Pj4gOCAmIDI1NTtcbiAgICAgICAgSEVBUFtvdXRwdXQgfCAyN10gPSBINiAmIDI1NTtcbiAgICAgICAgSEVBUFtvdXRwdXQgfCAyOF0gPSBINyA+Pj4gMjQ7XG4gICAgICAgIEhFQVBbb3V0cHV0IHwgMjldID0gSDcgPj4+IDE2ICYgMjU1O1xuICAgICAgICBIRUFQW291dHB1dCB8IDMwXSA9IEg3ID4+PiA4ICYgMjU1O1xuICAgICAgICBIRUFQW291dHB1dCB8IDMxXSA9IEg3ICYgMjU1O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgICBIMCA9IDB4NmEwOWU2Njc7XG4gICAgICAgIEgxID0gMHhiYjY3YWU4NTtcbiAgICAgICAgSDIgPSAweDNjNmVmMzcyO1xuICAgICAgICBIMyA9IDB4YTU0ZmY1M2E7XG4gICAgICAgIEg0ID0gMHg1MTBlNTI3ZjtcbiAgICAgICAgSDUgPSAweDliMDU2ODhjO1xuICAgICAgICBINiA9IDB4MWY4M2Q5YWI7XG4gICAgICAgIEg3ID0gMHg1YmUwY2QxOTtcbiAgICAgICAgVE9UQUwwID0gVE9UQUwxID0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbml0KGgwLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBoNywgdG90YWwwLCB0b3RhbDEpIHtcbiAgICAgICAgaDAgPSBoMCB8IDA7XG4gICAgICAgIGgxID0gaDEgfCAwO1xuICAgICAgICBoMiA9IGgyIHwgMDtcbiAgICAgICAgaDMgPSBoMyB8IDA7XG4gICAgICAgIGg0ID0gaDQgfCAwO1xuICAgICAgICBoNSA9IGg1IHwgMDtcbiAgICAgICAgaDYgPSBoNiB8IDA7XG4gICAgICAgIGg3ID0gaDcgfCAwO1xuICAgICAgICB0b3RhbDAgPSB0b3RhbDAgfCAwO1xuICAgICAgICB0b3RhbDEgPSB0b3RhbDEgfCAwO1xuXG4gICAgICAgIEgwID0gaDA7XG4gICAgICAgIEgxID0gaDE7XG4gICAgICAgIEgyID0gaDI7XG4gICAgICAgIEgzID0gaDM7XG4gICAgICAgIEg0ID0gaDQ7XG4gICAgICAgIEg1ID0gaDU7XG4gICAgICAgIEg2ID0gaDY7XG4gICAgICAgIEg3ID0gaDc7XG4gICAgICAgIFRPVEFMMCA9IHRvdGFsMDtcbiAgICAgICAgVE9UQUwxID0gdG90YWwxO1xuICAgIH1cblxuICAgIC8vIG9mZnNldCDigJQgbXVsdGlwbGUgb2YgNjRcbiAgICBmdW5jdGlvbiBwcm9jZXNzKG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgICAgIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gICAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDA7XG5cbiAgICAgICAgdmFyIGhhc2hlZCA9IDA7XG5cbiAgICAgICAgaWYgKG9mZnNldCAmIDYzKSByZXR1cm4gLTE7XG5cbiAgICAgICAgd2hpbGUgKChsZW5ndGggfCAwKSA+PSA2NCkge1xuICAgICAgICAgICAgX2NvcmVfaGVhcChvZmZzZXQpO1xuXG4gICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyA2NCB8IDA7XG4gICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggLSA2NCB8IDA7XG5cbiAgICAgICAgICAgIGhhc2hlZCA9IGhhc2hlZCArIDY0IHwgMDtcbiAgICAgICAgfVxuXG4gICAgICAgIFRPVEFMMCA9IFRPVEFMMCArIGhhc2hlZCB8IDA7XG4gICAgICAgIGlmIChUT1RBTDAgPj4+IDAgPCBoYXNoZWQgPj4+IDApIFRPVEFMMSA9IFRPVEFMMSArIDEgfCAwO1xuXG4gICAgICAgIHJldHVybiBoYXNoZWQgfCAwO1xuICAgIH1cblxuICAgIC8vIG9mZnNldCDigJQgbXVsdGlwbGUgb2YgNjRcbiAgICAvLyBvdXRwdXQg4oCUIG11bHRpcGxlIG9mIDMyXG4gICAgZnVuY3Rpb24gZmluaXNoKG9mZnNldCwgbGVuZ3RoLCBvdXRwdXQpIHtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMDtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0IHwgMDtcblxuICAgICAgICB2YXIgaGFzaGVkID0gMCxcbiAgICAgICAgICAgIGkgPSAwO1xuXG4gICAgICAgIGlmIChvZmZzZXQgJiA2MykgcmV0dXJuIC0xO1xuXG4gICAgICAgIGlmICh+b3V0cHV0KSBpZiAob3V0cHV0ICYgMzEpIHJldHVybiAtMTtcblxuICAgICAgICBpZiAoKGxlbmd0aCB8IDApID49IDY0KSB7XG4gICAgICAgICAgICBoYXNoZWQgPSBwcm9jZXNzKG9mZnNldCwgbGVuZ3RoKSB8IDA7XG4gICAgICAgICAgICBpZiAoKGhhc2hlZCB8IDApID09IC0xKSByZXR1cm4gLTE7XG5cbiAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIGhhc2hlZCB8IDA7XG4gICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggLSBoYXNoZWQgfCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFzaGVkID0gaGFzaGVkICsgbGVuZ3RoIHwgMDtcbiAgICAgICAgVE9UQUwwID0gVE9UQUwwICsgbGVuZ3RoIHwgMDtcbiAgICAgICAgaWYgKFRPVEFMMCA+Pj4gMCA8IGxlbmd0aCA+Pj4gMCkgVE9UQUwxID0gVE9UQUwxICsgMSB8IDA7XG5cbiAgICAgICAgSEVBUFtvZmZzZXQgfCBsZW5ndGhdID0gMHg4MDtcblxuICAgICAgICBpZiAoKGxlbmd0aCB8IDApID49IDU2KSB7XG4gICAgICAgICAgICBmb3IgKGkgPSBsZW5ndGggKyAxIHwgMDsgKGkgfCAwKSA8IDY0OyBpID0gaSArIDEgfCAwKSB7XG4gICAgICAgICAgICAgICAgSEVBUFtvZmZzZXQgfCBpXSA9IDB4MDA7XG4gICAgICAgICAgICB9X2NvcmVfaGVhcChvZmZzZXQpO1xuXG4gICAgICAgICAgICBsZW5ndGggPSAwO1xuXG4gICAgICAgICAgICBIRUFQW29mZnNldCB8IDBdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IGxlbmd0aCArIDEgfCAwOyAoaSB8IDApIDwgNTk7IGkgPSBpICsgMSB8IDApIHtcbiAgICAgICAgICAgIEhFQVBbb2Zmc2V0IHwgaV0gPSAwO1xuICAgICAgICB9SEVBUFtvZmZzZXQgfCA1Nl0gPSBUT1RBTDEgPj4+IDIxICYgMjU1O1xuICAgICAgICBIRUFQW29mZnNldCB8IDU3XSA9IFRPVEFMMSA+Pj4gMTMgJiAyNTU7XG4gICAgICAgIEhFQVBbb2Zmc2V0IHwgNThdID0gVE9UQUwxID4+PiA1ICYgMjU1O1xuICAgICAgICBIRUFQW29mZnNldCB8IDU5XSA9IFRPVEFMMSA8PCAzICYgMjU1IHwgVE9UQUwwID4+PiAyOTtcbiAgICAgICAgSEVBUFtvZmZzZXQgfCA2MF0gPSBUT1RBTDAgPj4+IDIxICYgMjU1O1xuICAgICAgICBIRUFQW29mZnNldCB8IDYxXSA9IFRPVEFMMCA+Pj4gMTMgJiAyNTU7XG4gICAgICAgIEhFQVBbb2Zmc2V0IHwgNjJdID0gVE9UQUwwID4+PiA1ICYgMjU1O1xuICAgICAgICBIRUFQW29mZnNldCB8IDYzXSA9IFRPVEFMMCA8PCAzICYgMjU1O1xuICAgICAgICBfY29yZV9oZWFwKG9mZnNldCk7XG5cbiAgICAgICAgaWYgKH5vdXRwdXQpIF9zdGF0ZV90b19oZWFwKG91dHB1dCk7XG5cbiAgICAgICAgcmV0dXJuIGhhc2hlZCB8IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaG1hY19yZXNldCgpIHtcbiAgICAgICAgSDAgPSBJMDtcbiAgICAgICAgSDEgPSBJMTtcbiAgICAgICAgSDIgPSBJMjtcbiAgICAgICAgSDMgPSBJMztcbiAgICAgICAgSDQgPSBJNDtcbiAgICAgICAgSDUgPSBJNTtcbiAgICAgICAgSDYgPSBJNjtcbiAgICAgICAgSDcgPSBJNztcbiAgICAgICAgVE9UQUwwID0gNjQ7XG4gICAgICAgIFRPVEFMMSA9IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2htYWNfb3BhZCgpIHtcbiAgICAgICAgSDAgPSBPMDtcbiAgICAgICAgSDEgPSBPMTtcbiAgICAgICAgSDIgPSBPMjtcbiAgICAgICAgSDMgPSBPMztcbiAgICAgICAgSDQgPSBPNDtcbiAgICAgICAgSDUgPSBPNTtcbiAgICAgICAgSDYgPSBPNjtcbiAgICAgICAgSDcgPSBPNztcbiAgICAgICAgVE9UQUwwID0gNjQ7XG4gICAgICAgIFRPVEFMMSA9IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaG1hY19pbml0KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5LCBwMTAsIHAxMSwgcDEyLCBwMTMsIHAxNCwgcDE1KSB7XG4gICAgICAgIHAwID0gcDAgfCAwO1xuICAgICAgICBwMSA9IHAxIHwgMDtcbiAgICAgICAgcDIgPSBwMiB8IDA7XG4gICAgICAgIHAzID0gcDMgfCAwO1xuICAgICAgICBwNCA9IHA0IHwgMDtcbiAgICAgICAgcDUgPSBwNSB8IDA7XG4gICAgICAgIHA2ID0gcDYgfCAwO1xuICAgICAgICBwNyA9IHA3IHwgMDtcbiAgICAgICAgcDggPSBwOCB8IDA7XG4gICAgICAgIHA5ID0gcDkgfCAwO1xuICAgICAgICBwMTAgPSBwMTAgfCAwO1xuICAgICAgICBwMTEgPSBwMTEgfCAwO1xuICAgICAgICBwMTIgPSBwMTIgfCAwO1xuICAgICAgICBwMTMgPSBwMTMgfCAwO1xuICAgICAgICBwMTQgPSBwMTQgfCAwO1xuICAgICAgICBwMTUgPSBwMTUgfCAwO1xuXG4gICAgICAgIC8vIG9wYWRcbiAgICAgICAgcmVzZXQoKTtcbiAgICAgICAgX2NvcmUocDAgXiAweDVjNWM1YzVjLCBwMSBeIDB4NWM1YzVjNWMsIHAyIF4gMHg1YzVjNWM1YywgcDMgXiAweDVjNWM1YzVjLCBwNCBeIDB4NWM1YzVjNWMsIHA1IF4gMHg1YzVjNWM1YywgcDYgXiAweDVjNWM1YzVjLCBwNyBeIDB4NWM1YzVjNWMsIHA4IF4gMHg1YzVjNWM1YywgcDkgXiAweDVjNWM1YzVjLCBwMTAgXiAweDVjNWM1YzVjLCBwMTEgXiAweDVjNWM1YzVjLCBwMTIgXiAweDVjNWM1YzVjLCBwMTMgXiAweDVjNWM1YzVjLCBwMTQgXiAweDVjNWM1YzVjLCBwMTUgXiAweDVjNWM1YzVjKTtcbiAgICAgICAgTzAgPSBIMDtcbiAgICAgICAgTzEgPSBIMTtcbiAgICAgICAgTzIgPSBIMjtcbiAgICAgICAgTzMgPSBIMztcbiAgICAgICAgTzQgPSBINDtcbiAgICAgICAgTzUgPSBINTtcbiAgICAgICAgTzYgPSBINjtcbiAgICAgICAgTzcgPSBINztcblxuICAgICAgICAvLyBpcGFkXG4gICAgICAgIHJlc2V0KCk7XG4gICAgICAgIF9jb3JlKHAwIF4gMHgzNjM2MzYzNiwgcDEgXiAweDM2MzYzNjM2LCBwMiBeIDB4MzYzNjM2MzYsIHAzIF4gMHgzNjM2MzYzNiwgcDQgXiAweDM2MzYzNjM2LCBwNSBeIDB4MzYzNjM2MzYsIHA2IF4gMHgzNjM2MzYzNiwgcDcgXiAweDM2MzYzNjM2LCBwOCBeIDB4MzYzNjM2MzYsIHA5IF4gMHgzNjM2MzYzNiwgcDEwIF4gMHgzNjM2MzYzNiwgcDExIF4gMHgzNjM2MzYzNiwgcDEyIF4gMHgzNjM2MzYzNiwgcDEzIF4gMHgzNjM2MzYzNiwgcDE0IF4gMHgzNjM2MzYzNiwgcDE1IF4gMHgzNjM2MzYzNik7XG4gICAgICAgIEkwID0gSDA7XG4gICAgICAgIEkxID0gSDE7XG4gICAgICAgIEkyID0gSDI7XG4gICAgICAgIEkzID0gSDM7XG4gICAgICAgIEk0ID0gSDQ7XG4gICAgICAgIEk1ID0gSDU7XG4gICAgICAgIEk2ID0gSDY7XG4gICAgICAgIEk3ID0gSDc7XG5cbiAgICAgICAgVE9UQUwwID0gNjQ7XG4gICAgICAgIFRPVEFMMSA9IDA7XG4gICAgfVxuXG4gICAgLy8gb2Zmc2V0IOKAlCBtdWx0aXBsZSBvZiA2NFxuICAgIC8vIG91dHB1dCDigJQgbXVsdGlwbGUgb2YgMzJcbiAgICBmdW5jdGlvbiBobWFjX2ZpbmlzaChvZmZzZXQsIGxlbmd0aCwgb3V0cHV0KSB7XG4gICAgICAgIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gICAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDA7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dCB8IDA7XG5cbiAgICAgICAgdmFyIHQwID0gMCxcbiAgICAgICAgICAgIHQxID0gMCxcbiAgICAgICAgICAgIHQyID0gMCxcbiAgICAgICAgICAgIHQzID0gMCxcbiAgICAgICAgICAgIHQ0ID0gMCxcbiAgICAgICAgICAgIHQ1ID0gMCxcbiAgICAgICAgICAgIHQ2ID0gMCxcbiAgICAgICAgICAgIHQ3ID0gMCxcbiAgICAgICAgICAgIGhhc2hlZCA9IDA7XG5cbiAgICAgICAgaWYgKG9mZnNldCAmIDYzKSByZXR1cm4gLTE7XG5cbiAgICAgICAgaWYgKH5vdXRwdXQpIGlmIChvdXRwdXQgJiAzMSkgcmV0dXJuIC0xO1xuXG4gICAgICAgIGhhc2hlZCA9IGZpbmlzaChvZmZzZXQsIGxlbmd0aCwgLTEpIHwgMDtcbiAgICAgICAgdDAgPSBIMCwgdDEgPSBIMSwgdDIgPSBIMiwgdDMgPSBIMywgdDQgPSBINCwgdDUgPSBINSwgdDYgPSBINiwgdDcgPSBINztcblxuICAgICAgICBfaG1hY19vcGFkKCk7XG4gICAgICAgIF9jb3JlKHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgMHg4MDAwMDAwMCwgMCwgMCwgMCwgMCwgMCwgMCwgNzY4KTtcblxuICAgICAgICBpZiAofm91dHB1dCkgX3N0YXRlX3RvX2hlYXAob3V0cHV0KTtcblxuICAgICAgICByZXR1cm4gaGFzaGVkIHwgMDtcbiAgICB9XG5cbiAgICAvLyBzYWx0IGlzIGFzc3VtZWQgdG8gYmUgYWxyZWFkeSBwcm9jZXNzZWRcbiAgICAvLyBvZmZzZXQg4oCUIG11bHRpcGxlIG9mIDY0XG4gICAgLy8gb3V0cHV0IOKAlCBtdWx0aXBsZSBvZiAzMlxuICAgIGZ1bmN0aW9uIHBia2RmMl9nZW5lcmF0ZV9ibG9jayhvZmZzZXQsIGxlbmd0aCwgYmxvY2ssIGNvdW50LCBvdXRwdXQpIHtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMDtcbiAgICAgICAgYmxvY2sgPSBibG9jayB8IDA7XG4gICAgICAgIGNvdW50ID0gY291bnQgfCAwO1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQgfCAwO1xuXG4gICAgICAgIHZhciBoMCA9IDAsXG4gICAgICAgICAgICBoMSA9IDAsXG4gICAgICAgICAgICBoMiA9IDAsXG4gICAgICAgICAgICBoMyA9IDAsXG4gICAgICAgICAgICBoNCA9IDAsXG4gICAgICAgICAgICBoNSA9IDAsXG4gICAgICAgICAgICBoNiA9IDAsXG4gICAgICAgICAgICBoNyA9IDAsXG4gICAgICAgICAgICB0MCA9IDAsXG4gICAgICAgICAgICB0MSA9IDAsXG4gICAgICAgICAgICB0MiA9IDAsXG4gICAgICAgICAgICB0MyA9IDAsXG4gICAgICAgICAgICB0NCA9IDAsXG4gICAgICAgICAgICB0NSA9IDAsXG4gICAgICAgICAgICB0NiA9IDAsXG4gICAgICAgICAgICB0NyA9IDA7XG5cbiAgICAgICAgaWYgKG9mZnNldCAmIDYzKSByZXR1cm4gLTE7XG5cbiAgICAgICAgaWYgKH5vdXRwdXQpIGlmIChvdXRwdXQgJiAzMSkgcmV0dXJuIC0xO1xuXG4gICAgICAgIC8vIHBhZCBibG9jayBudW1iZXIgaW50byBoZWFwXG4gICAgICAgIC8vIEZJWE1FIHByb2JhYmxlIE9PQiB3cml0ZVxuICAgICAgICBIRUFQW29mZnNldCArIGxlbmd0aCB8IDBdID0gYmxvY2sgPj4+IDI0O1xuICAgICAgICBIRUFQW29mZnNldCArIGxlbmd0aCArIDEgfCAwXSA9IGJsb2NrID4+PiAxNiAmIDI1NTtcbiAgICAgICAgSEVBUFtvZmZzZXQgKyBsZW5ndGggKyAyIHwgMF0gPSBibG9jayA+Pj4gOCAmIDI1NTtcbiAgICAgICAgSEVBUFtvZmZzZXQgKyBsZW5ndGggKyAzIHwgMF0gPSBibG9jayAmIDI1NTtcblxuICAgICAgICAvLyBmaW5pc2ggZmlyc3QgaXRlcmF0aW9uXG4gICAgICAgIGhtYWNfZmluaXNoKG9mZnNldCwgbGVuZ3RoICsgNCB8IDAsIC0xKSB8IDA7XG4gICAgICAgIGgwID0gdDAgPSBIMCwgaDEgPSB0MSA9IEgxLCBoMiA9IHQyID0gSDIsIGgzID0gdDMgPSBIMywgaDQgPSB0NCA9IEg0LCBoNSA9IHQ1ID0gSDUsIGg2ID0gdDYgPSBINiwgaDcgPSB0NyA9IEg3O1xuICAgICAgICBjb3VudCA9IGNvdW50IC0gMSB8IDA7XG5cbiAgICAgICAgLy8gcGVyZm9ybSB0aGUgcmVzdCBpdGVyYXRpb25zXG4gICAgICAgIHdoaWxlICgoY291bnQgfCAwKSA+IDApIHtcbiAgICAgICAgICAgIGhtYWNfcmVzZXQoKTtcbiAgICAgICAgICAgIF9jb3JlKHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgMHg4MDAwMDAwMCwgMCwgMCwgMCwgMCwgMCwgMCwgNzY4KTtcbiAgICAgICAgICAgIHQwID0gSDAsIHQxID0gSDEsIHQyID0gSDIsIHQzID0gSDMsIHQ0ID0gSDQsIHQ1ID0gSDUsIHQ2ID0gSDYsIHQ3ID0gSDc7XG5cbiAgICAgICAgICAgIF9obWFjX29wYWQoKTtcbiAgICAgICAgICAgIF9jb3JlKHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgMHg4MDAwMDAwMCwgMCwgMCwgMCwgMCwgMCwgMCwgNzY4KTtcbiAgICAgICAgICAgIHQwID0gSDAsIHQxID0gSDEsIHQyID0gSDIsIHQzID0gSDMsIHQ0ID0gSDQsIHQ1ID0gSDUsIHQ2ID0gSDYsIHQ3ID0gSDc7XG5cbiAgICAgICAgICAgIGgwID0gaDAgXiBIMDtcbiAgICAgICAgICAgIGgxID0gaDEgXiBIMTtcbiAgICAgICAgICAgIGgyID0gaDIgXiBIMjtcbiAgICAgICAgICAgIGgzID0gaDMgXiBIMztcbiAgICAgICAgICAgIGg0ID0gaDQgXiBINDtcbiAgICAgICAgICAgIGg1ID0gaDUgXiBINTtcbiAgICAgICAgICAgIGg2ID0gaDYgXiBINjtcbiAgICAgICAgICAgIGg3ID0gaDcgXiBINztcblxuICAgICAgICAgICAgY291bnQgPSBjb3VudCAtIDEgfCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgSDAgPSBoMDtcbiAgICAgICAgSDEgPSBoMTtcbiAgICAgICAgSDIgPSBoMjtcbiAgICAgICAgSDMgPSBoMztcbiAgICAgICAgSDQgPSBoNDtcbiAgICAgICAgSDUgPSBoNTtcbiAgICAgICAgSDYgPSBoNjtcbiAgICAgICAgSDcgPSBoNztcblxuICAgICAgICBpZiAofm91dHB1dCkgX3N0YXRlX3RvX2hlYXAob3V0cHV0KTtcblxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAvLyBTSEEyNTZcbiAgICAgICAgcmVzZXQ6IHJlc2V0LFxuICAgICAgICBpbml0OiBpbml0LFxuICAgICAgICBwcm9jZXNzOiBwcm9jZXNzLFxuICAgICAgICBmaW5pc2g6IGZpbmlzaCxcblxuICAgICAgICAvLyBITUFDLVNIQTI1NlxuICAgICAgICBobWFjX3Jlc2V0OiBobWFjX3Jlc2V0LFxuICAgICAgICBobWFjX2luaXQ6IGhtYWNfaW5pdCxcbiAgICAgICAgaG1hY19maW5pc2g6IGhtYWNfZmluaXNoLFxuXG4gICAgICAgIC8vIFBCS0RGMi1ITUFDLVNIQTI1NlxuICAgICAgICBwYmtkZjJfZ2VuZXJhdGVfYmxvY2s6IHBia2RmMl9nZW5lcmF0ZV9ibG9ja1xuICAgIH07XG59XG5cbn0se31dLDE4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuX3NoYTI1Nl9oYXNoX3NpemUgPSBleHBvcnRzLl9zaGEyNTZfYmxvY2tfc2l6ZSA9IHVuZGVmaW5lZDtcbmV4cG9ydHMuc2hhMjU2X2NvbnN0cnVjdG9yID0gc2hhMjU2X2NvbnN0cnVjdG9yO1xuZXhwb3J0cy5nZXRfc2hhMjU2X2luc3RhbmNlID0gZ2V0X3NoYTI1Nl9pbnN0YW5jZTtcblxudmFyIF9zaGEgPSBfZGVyZXFfKCcuL3NoYTI1Ni5hc20nKTtcblxudmFyIF9oYXNoID0gX2RlcmVxXygnLi4vaGFzaCcpO1xuXG52YXIgX3V0aWxzID0gX2RlcmVxXygnLi4vLi4vdXRpbHMnKTtcblxudmFyIF9zaGEyNTZfYmxvY2tfc2l6ZSA9IGV4cG9ydHMuX3NoYTI1Nl9ibG9ja19zaXplID0gNjQ7XG52YXIgX3NoYTI1Nl9oYXNoX3NpemUgPSBleHBvcnRzLl9zaGEyNTZfaGFzaF9zaXplID0gMzI7XG5cbmZ1bmN0aW9uIHNoYTI1Nl9jb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHRoaXMuaGVhcCA9ICgwLCBfdXRpbHMuX2hlYXBfaW5pdCkoVWludDhBcnJheSwgb3B0aW9ucy5oZWFwKTtcbiAgdGhpcy5hc20gPSBvcHRpb25zLmFzbSB8fCAoMCwgX3NoYS5zaGEyNTZfYXNtKSh7IFVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXkgfSwgbnVsbCwgdGhpcy5oZWFwLmJ1ZmZlcik7XG5cbiAgdGhpcy5CTE9DS19TSVpFID0gX3NoYTI1Nl9ibG9ja19zaXplO1xuICB0aGlzLkhBU0hfU0laRSA9IF9zaGEyNTZfaGFzaF9zaXplO1xuXG4gIHRoaXMucmVzZXQoKTtcbn1cblxuc2hhMjU2X2NvbnN0cnVjdG9yLkJMT0NLX1NJWkUgPSBfc2hhMjU2X2Jsb2NrX3NpemU7XG5zaGEyNTZfY29uc3RydWN0b3IuSEFTSF9TSVpFID0gX3NoYTI1Nl9oYXNoX3NpemU7XG5zaGEyNTZfY29uc3RydWN0b3IuTkFNRSA9ICdzaGEyNTYnO1xuXG52YXIgc2hhMjU2X3Byb3RvdHlwZSA9IHNoYTI1Nl9jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG5zaGEyNTZfcHJvdG90eXBlLnJlc2V0ID0gX2hhc2guaGFzaF9yZXNldDtcbnNoYTI1Nl9wcm90b3R5cGUucHJvY2VzcyA9IF9oYXNoLmhhc2hfcHJvY2VzcztcbnNoYTI1Nl9wcm90b3R5cGUuZmluaXNoID0gX2hhc2guaGFzaF9maW5pc2g7XG5cbnZhciBzaGEyNTZfaW5zdGFuY2UgPSBudWxsO1xuXG5mdW5jdGlvbiBnZXRfc2hhMjU2X2luc3RhbmNlKCkge1xuICBpZiAoc2hhMjU2X2luc3RhbmNlID09PSBudWxsKSBzaGEyNTZfaW5zdGFuY2UgPSBuZXcgc2hhMjU2X2NvbnN0cnVjdG9yKHsgaGVhcFNpemU6IDB4MTAwMDAwIH0pO1xuICByZXR1cm4gc2hhMjU2X2luc3RhbmNlO1xufVxuXG59LHtcIi4uLy4uL3V0aWxzXCI6MTksXCIuLi9oYXNoXCI6MTUsXCIuL3NoYTI1Ni5hc21cIjoxN31dLDE5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuc3RyaW5nX3RvX2J5dGVzID0gc3RyaW5nX3RvX2J5dGVzO1xuZXhwb3J0cy5oZXhfdG9fYnl0ZXMgPSBoZXhfdG9fYnl0ZXM7XG5leHBvcnRzLmJhc2U2NF90b19ieXRlcyA9IGJhc2U2NF90b19ieXRlcztcbmV4cG9ydHMuYnl0ZXNfdG9fc3RyaW5nID0gYnl0ZXNfdG9fc3RyaW5nO1xuZXhwb3J0cy5ieXRlc190b19oZXggPSBieXRlc190b19oZXg7XG5leHBvcnRzLmJ5dGVzX3RvX2Jhc2U2NCA9IGJ5dGVzX3RvX2Jhc2U2NDtcbmV4cG9ydHMucG93Ml9jZWlsID0gcG93Ml9jZWlsO1xuZXhwb3J0cy5pc19udW1iZXIgPSBpc19udW1iZXI7XG5leHBvcnRzLmlzX3N0cmluZyA9IGlzX3N0cmluZztcbmV4cG9ydHMuaXNfYnVmZmVyID0gaXNfYnVmZmVyO1xuZXhwb3J0cy5pc19ieXRlcyA9IGlzX2J5dGVzO1xuZXhwb3J0cy5pc190eXBlZF9hcnJheSA9IGlzX3R5cGVkX2FycmF5O1xuZXhwb3J0cy5faGVhcF9pbml0ID0gX2hlYXBfaW5pdDtcbmV4cG9ydHMuX2hlYXBfd3JpdGUgPSBfaGVhcF93cml0ZTtcbnZhciBGbG9hdEFycmF5ID0gZXhwb3J0cy5GbG9hdEFycmF5ID0gdHlwZW9mIEZsb2F0NjRBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBGbG9hdDY0QXJyYXkgOiBGbG9hdDMyQXJyYXk7IC8vIG1ha2UgUGhhbnRvbUpTIGhhcHB5XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtib29sZWFufSBbdXRmOF1cbiAqIEByZXR1cm4ge1VpbnQ4QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHN0cmluZ190b19ieXRlcyhzdHIsIHV0ZjgpIHtcbiAgdXRmOCA9ICEhdXRmODtcblxuICB2YXIgbGVuID0gc3RyLmxlbmd0aCxcbiAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkodXRmOCA/IDQgKiBsZW4gOiBsZW4pO1xuXG4gIGZvciAodmFyIGkgPSAwLCBqID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKTtcblxuICAgIGlmICh1dGY4ICYmIDB4ZDgwMCA8PSBjICYmIGMgPD0gMHhkYmZmKSB7XG4gICAgICBpZiAoKytpID49IGxlbikgdGhyb3cgbmV3IEVycm9yKCdNYWxmb3JtZWQgc3RyaW5nLCBsb3cgc3Vycm9nYXRlIGV4cGVjdGVkIGF0IHBvc2l0aW9uICcgKyBpKTtcbiAgICAgIGMgPSAoYyBeIDB4ZDgwMCkgPDwgMTAgfCAweDEwMDAwIHwgc3RyLmNoYXJDb2RlQXQoaSkgXiAweGRjMDA7XG4gICAgfSBlbHNlIGlmICghdXRmOCAmJiBjID4+PiA4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dpZGUgY2hhcmFjdGVycyBhcmUgbm90IGFsbG93ZWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKCF1dGY4IHx8IGMgPD0gMHg3Zikge1xuICAgICAgYnl0ZXNbaisrXSA9IGM7XG4gICAgfSBlbHNlIGlmIChjIDw9IDB4N2ZmKSB7XG4gICAgICBieXRlc1tqKytdID0gMHhjMCB8IGMgPj4gNjtcbiAgICAgIGJ5dGVzW2orK10gPSAweDgwIHwgYyAmIDB4M2Y7XG4gICAgfSBlbHNlIGlmIChjIDw9IDB4ZmZmZikge1xuICAgICAgYnl0ZXNbaisrXSA9IDB4ZTAgfCBjID4+IDEyO1xuICAgICAgYnl0ZXNbaisrXSA9IDB4ODAgfCBjID4+IDYgJiAweDNmO1xuICAgICAgYnl0ZXNbaisrXSA9IDB4ODAgfCBjICYgMHgzZjtcbiAgICB9IGVsc2Uge1xuICAgICAgYnl0ZXNbaisrXSA9IDB4ZjAgfCBjID4+IDE4O1xuICAgICAgYnl0ZXNbaisrXSA9IDB4ODAgfCBjID4+IDEyICYgMHgzZjtcbiAgICAgIGJ5dGVzW2orK10gPSAweDgwIHwgYyA+PiA2ICYgMHgzZjtcbiAgICAgIGJ5dGVzW2orK10gPSAweDgwIHwgYyAmIDB4M2Y7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzLnN1YmFycmF5KDAsIGopO1xufVxuXG5mdW5jdGlvbiBoZXhfdG9fYnl0ZXMoc3RyKSB7XG4gIHZhciBsZW4gPSBzdHIubGVuZ3RoO1xuICBpZiAobGVuICYgMSkge1xuICAgIHN0ciA9ICcwJyArIHN0cjtcbiAgICBsZW4rKztcbiAgfVxuICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW4gPj4gMSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBieXRlc1tpID4+IDFdID0gcGFyc2VJbnQoc3RyLnN1YnN0cihpLCAyKSwgMTYpO1xuICB9XG4gIHJldHVybiBieXRlcztcbn1cblxuZnVuY3Rpb24gYmFzZTY0X3RvX2J5dGVzKHN0cikge1xuICByZXR1cm4gc3RyaW5nX3RvX2J5dGVzKGF0b2Ioc3RyKSk7XG59XG5cbmZ1bmN0aW9uIGJ5dGVzX3RvX3N0cmluZyhieXRlcywgdXRmOCkge1xuICB1dGY4ID0gISF1dGY4O1xuXG4gIHZhciBsZW4gPSBieXRlcy5sZW5ndGgsXG4gICAgICBjaGFycyA9IG5ldyBBcnJheShsZW4pO1xuXG4gIGZvciAodmFyIGkgPSAwLCBqID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGIgPSBieXRlc1tpXTtcbiAgICBpZiAoIXV0ZjggfHwgYiA8IDEyOCkge1xuICAgICAgY2hhcnNbaisrXSA9IGI7XG4gICAgfSBlbHNlIGlmIChiID49IDE5MiAmJiBiIDwgMjI0ICYmIGkgKyAxIDwgbGVuKSB7XG4gICAgICBjaGFyc1tqKytdID0gKGIgJiAweDFmKSA8PCA2IHwgYnl0ZXNbKytpXSAmIDB4M2Y7XG4gICAgfSBlbHNlIGlmIChiID49IDIyNCAmJiBiIDwgMjQwICYmIGkgKyAyIDwgbGVuKSB7XG4gICAgICBjaGFyc1tqKytdID0gKGIgJiAweGYpIDw8IDEyIHwgKGJ5dGVzWysraV0gJiAweDNmKSA8PCA2IHwgYnl0ZXNbKytpXSAmIDB4M2Y7XG4gICAgfSBlbHNlIGlmIChiID49IDI0MCAmJiBiIDwgMjQ4ICYmIGkgKyAzIDwgbGVuKSB7XG4gICAgICB2YXIgYyA9IChiICYgNykgPDwgMTggfCAoYnl0ZXNbKytpXSAmIDB4M2YpIDw8IDEyIHwgKGJ5dGVzWysraV0gJiAweDNmKSA8PCA2IHwgYnl0ZXNbKytpXSAmIDB4M2Y7XG4gICAgICBpZiAoYyA8PSAweGZmZmYpIHtcbiAgICAgICAgY2hhcnNbaisrXSA9IGM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjIF49IDB4MTAwMDA7XG4gICAgICAgIGNoYXJzW2orK10gPSAweGQ4MDAgfCBjID4+IDEwO1xuICAgICAgICBjaGFyc1tqKytdID0gMHhkYzAwIHwgYyAmIDB4M2ZmO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hbGZvcm1lZCBVVEY4IGNoYXJhY3RlciBhdCBieXRlIG9mZnNldCAnICsgaSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0ciA9ICcnLFxuICAgICAgYnMgPSAxNjM4NDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBqOyBpICs9IGJzKSB7XG4gICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjaGFycy5zbGljZShpLCBpICsgYnMgPD0gaiA/IGkgKyBicyA6IGopKTtcbiAgfVxuXG4gIHJldHVybiBzdHI7XG59XG5cbmZ1bmN0aW9uIGJ5dGVzX3RvX2hleChhcnIpIHtcbiAgdmFyIHN0ciA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHZhciBoID0gKGFycltpXSAmIDB4ZmYpLnRvU3RyaW5nKDE2KTtcbiAgICBpZiAoaC5sZW5ndGggPCAyKSBzdHIgKz0gJzAnO1xuICAgIHN0ciArPSBoO1xuICB9XG4gIHJldHVybiBzdHI7XG59XG5cbmZ1bmN0aW9uIGJ5dGVzX3RvX2Jhc2U2NChhcnIpIHtcbiAgcmV0dXJuIGJ0b2EoYnl0ZXNfdG9fc3RyaW5nKGFycikpO1xufVxuXG5mdW5jdGlvbiBwb3cyX2NlaWwoYSkge1xuICBhIC09IDE7XG4gIGEgfD0gYSA+Pj4gMTtcbiAgYSB8PSBhID4+PiAyO1xuICBhIHw9IGEgPj4+IDQ7XG4gIGEgfD0gYSA+Pj4gODtcbiAgYSB8PSBhID4+PiAxNjtcbiAgYSArPSAxO1xuICByZXR1cm4gYTtcbn1cblxuZnVuY3Rpb24gaXNfbnVtYmVyKGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBhID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNfc3RyaW5nKGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBhID09PSAnc3RyaW5nJztcbn1cblxuZnVuY3Rpb24gaXNfYnVmZmVyKGEpIHtcbiAgcmV0dXJuIGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcjtcbn1cblxuZnVuY3Rpb24gaXNfYnl0ZXMoYSkge1xuICByZXR1cm4gYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG59XG5cbmZ1bmN0aW9uIGlzX3R5cGVkX2FycmF5KGEpIHtcbiAgcmV0dXJuIGEgaW5zdGFuY2VvZiBJbnQ4QXJyYXkgfHwgYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgYSBpbnN0YW5jZW9mIEludDE2QXJyYXkgfHwgYSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5IHx8IGEgaW5zdGFuY2VvZiBJbnQzMkFycmF5IHx8IGEgaW5zdGFuY2VvZiBVaW50MzJBcnJheSB8fCBhIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5IHx8IGEgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXk7XG59XG5cbmZ1bmN0aW9uIF9oZWFwX2luaXQoY29uc3RydWN0b3IsIGhlYXAsIGhlYXBTaXplKSB7XG4gIHZhciBzaXplID0gaGVhcCA/IGhlYXAuYnl0ZUxlbmd0aCA6IGhlYXBTaXplIHx8IDY1NTM2O1xuXG4gIGlmIChzaXplICYgMHhmZmYgfHwgc2l6ZSA8PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ2hlYXAgc2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBhbmQgYSBtdWx0aXBsZSBvZiA0MDk2Jyk7XG5cbiAgaGVhcCA9IGhlYXAgfHwgbmV3IGNvbnN0cnVjdG9yKG5ldyBBcnJheUJ1ZmZlcihzaXplKSk7XG5cbiAgcmV0dXJuIGhlYXA7XG59XG5cbmZ1bmN0aW9uIF9oZWFwX3dyaXRlKGhlYXAsIGhwb3MsIGRhdGEsIGRwb3MsIGRsZW4pIHtcbiAgdmFyIGhsZW4gPSBoZWFwLmxlbmd0aCAtIGhwb3MsXG4gICAgICB3bGVuID0gaGxlbiA8IGRsZW4gPyBobGVuIDogZGxlbjtcblxuICBoZWFwLnNldChkYXRhLnN1YmFycmF5KGRwb3MsIGRwb3MgKyB3bGVuKSwgaHBvcyk7XG5cbiAgcmV0dXJuIHdsZW47XG59XG5cbn0se31dLDIwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX2RlcmVxXyhcImNvcmUtanMvbGlicmFyeS9mbi9hcnJheS9mcm9tXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG59LHtcImNvcmUtanMvbGlicmFyeS9mbi9hcnJheS9mcm9tXCI6NTZ9XSwyMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9kZXJlcV8oXCJjb3JlLWpzL2xpYnJhcnkvZm4vZ2V0LWl0ZXJhdG9yXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG59LHtcImNvcmUtanMvbGlicmFyeS9mbi9nZXQtaXRlcmF0b3JcIjo1N31dLDIyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX2RlcmVxXyhcImNvcmUtanMvbGlicmFyeS9mbi9pcy1pdGVyYWJsZVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xufSx7XCJjb3JlLWpzL2xpYnJhcnkvZm4vaXMtaXRlcmFibGVcIjo1OH1dLDIzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX2RlcmVxXyhcImNvcmUtanMvbGlicmFyeS9mbi9qc29uL3N0cmluZ2lmeVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xufSx7XCJjb3JlLWpzL2xpYnJhcnkvZm4vanNvbi9zdHJpbmdpZnlcIjo1OX1dLDI0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX2RlcmVxXyhcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvYXNzaWduXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG59LHtcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvYXNzaWduXCI6NjB9XSwyNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9kZXJlcV8oXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2NyZWF0ZVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xufSx7XCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2NyZWF0ZVwiOjYxfV0sMjY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfZGVyZXFfKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIiksIF9fZXNNb2R1bGU6IHRydWUgfTtcbn0se1wiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIjo2Mn1dLDI3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX2RlcmVxXyhcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZW50cmllc1wiKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xufSx7XCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2VudHJpZXNcIjo2M31dLDI4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX2RlcmVxXyhcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZnJlZXplXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG59LHtcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZnJlZXplXCI6NjR9XSwyOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9kZXJlcV8oXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2dldC1wcm90b3R5cGUtb2ZcIiksIF9fZXNNb2R1bGU6IHRydWUgfTtcbn0se1wiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9nZXQtcHJvdG90eXBlLW9mXCI6NjV9XSwzMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9kZXJlcV8oXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L3NldC1wcm90b3R5cGUtb2ZcIiksIF9fZXNNb2R1bGU6IHRydWUgfTtcbn0se1wiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9zZXQtcHJvdG90eXBlLW9mXCI6NjZ9XSwzMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9kZXJlcV8oXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L3ZhbHVlc1wiKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xufSx7XCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L3ZhbHVlc1wiOjY3fV0sMzI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfZGVyZXFfKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3Byb21pc2VcIiksIF9fZXNNb2R1bGU6IHRydWUgfTtcbn0se1wiY29yZS1qcy9saWJyYXJ5L2ZuL3Byb21pc2VcIjo2OH1dLDMzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX2RlcmVxXyhcImNvcmUtanMvbGlicmFyeS9mbi9zeW1ib2xcIiksIF9fZXNNb2R1bGU6IHRydWUgfTtcbn0se1wiY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbFwiOjY5fV0sMzQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfZGVyZXFfKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pdGVyYXRvclwiKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xufSx7XCJjb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2l0ZXJhdG9yXCI6NzB9XSwzNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9wcm9taXNlID0gX2RlcmVxXyhcIi4uL2NvcmUtanMvcHJvbWlzZVwiKTtcblxudmFyIF9wcm9taXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb21pc2UpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZ2VuID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gbmV3IF9wcm9taXNlMi5kZWZhdWx0KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIHN0ZXAoa2V5LCBhcmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHN0ZXAoXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBzdGVwKFwidGhyb3dcIiwgZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RlcChcIm5leHRcIik7XG4gICAgfSk7XG4gIH07XG59O1xufSx7XCIuLi9jb3JlLWpzL3Byb21pc2VcIjozMn1dLDM2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcbn0se31dLDM3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2RlZmluZVByb3BlcnR5ID0gX2RlcmVxXyhcIi4uL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWZpbmVQcm9wZXJ0eSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xufSx7XCIuLi9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIjoyNn1dLDM4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3NldFByb3RvdHlwZU9mID0gX2RlcmVxXyhcIi4uL2NvcmUtanMvb2JqZWN0L3NldC1wcm90b3R5cGUtb2ZcIik7XG5cbnZhciBfc2V0UHJvdG90eXBlT2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2V0UHJvdG90eXBlT2YpO1xuXG52YXIgX2NyZWF0ZSA9IF9kZXJlcV8oXCIuLi9jb3JlLWpzL29iamVjdC9jcmVhdGVcIik7XG5cbnZhciBfY3JlYXRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZSk7XG5cbnZhciBfdHlwZW9mMiA9IF9kZXJlcV8oXCIuLi9oZWxwZXJzL3R5cGVvZlwiKTtcblxudmFyIF90eXBlb2YzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdHlwZW9mMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyAodHlwZW9mIHN1cGVyQ2xhc3MgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogKDAsIF90eXBlb2YzLmRlZmF1bHQpKHN1cGVyQ2xhc3MpKSk7XG4gIH1cblxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSAoMCwgX2NyZWF0ZTIuZGVmYXVsdCkoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZjIuZGVmYXVsdCA/ICgwLCBfc2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59O1xufSx7XCIuLi9jb3JlLWpzL29iamVjdC9jcmVhdGVcIjoyNSxcIi4uL2NvcmUtanMvb2JqZWN0L3NldC1wcm90b3R5cGUtb2ZcIjozMCxcIi4uL2hlbHBlcnMvdHlwZW9mXCI6NDF9XSwzOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF90eXBlb2YyID0gX2RlcmVxXyhcIi4uL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG52YXIgX3R5cGVvZjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90eXBlb2YyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHNlbGYsIGNhbGwpIHtcbiAgaWYgKCFzZWxmKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIGNhbGwgJiYgKCh0eXBlb2YgY2FsbCA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkoY2FsbCkpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7XG59O1xufSx7XCIuLi9oZWxwZXJzL3R5cGVvZlwiOjQxfV0sNDA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfaXNJdGVyYWJsZTIgPSBfZGVyZXFfKFwiLi4vY29yZS1qcy9pcy1pdGVyYWJsZVwiKTtcblxudmFyIF9pc0l0ZXJhYmxlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzSXRlcmFibGUyKTtcblxudmFyIF9nZXRJdGVyYXRvcjIgPSBfZGVyZXFfKFwiLi4vY29yZS1qcy9nZXQtaXRlcmF0b3JcIik7XG5cbnZhciBfZ2V0SXRlcmF0b3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0SXRlcmF0b3IyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBzbGljZUl0ZXJhdG9yKGFyciwgaSkge1xuICAgIHZhciBfYXJyID0gW107XG4gICAgdmFyIF9uID0gdHJ1ZTtcbiAgICB2YXIgX2QgPSBmYWxzZTtcbiAgICB2YXIgX2UgPSB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgX2kgPSAoMCwgX2dldEl0ZXJhdG9yMy5kZWZhdWx0KShhcnIpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgICBfYXJyLnB1c2goX3MudmFsdWUpO1xuXG4gICAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9kID0gdHJ1ZTtcbiAgICAgIF9lID0gZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdKSBfaVtcInJldHVyblwiXSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKF9kKSB0aHJvdyBfZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gX2FycjtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoYXJyLCBpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgICAgcmV0dXJuIGFycjtcbiAgICB9IGVsc2UgaWYgKCgwLCBfaXNJdGVyYWJsZTMuZGVmYXVsdCkoT2JqZWN0KGFycikpKSB7XG4gICAgICByZXR1cm4gc2xpY2VJdGVyYXRvcihhcnIsIGkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbiAgICB9XG4gIH07XG59KCk7XG59LHtcIi4uL2NvcmUtanMvZ2V0LWl0ZXJhdG9yXCI6MjEsXCIuLi9jb3JlLWpzL2lzLWl0ZXJhYmxlXCI6MjJ9XSw0MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9pdGVyYXRvciA9IF9kZXJlcV8oXCIuLi9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvclwiKTtcblxudmFyIF9pdGVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pdGVyYXRvcik7XG5cbnZhciBfc3ltYm9sID0gX2RlcmVxXyhcIi4uL2NvcmUtanMvc3ltYm9sXCIpO1xuXG52YXIgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIF9pdGVyYXRvcjIuZGVmYXVsdCA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9zeW1ib2wyLmRlZmF1bHQgJiYgb2JqICE9PSBfc3ltYm9sMi5kZWZhdWx0LnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YoX2l0ZXJhdG9yMi5kZWZhdWx0KSA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCAmJiBvYmogIT09IF9zeW1ib2wyLmRlZmF1bHQucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xufTtcbn0se1wiLi4vY29yZS1qcy9zeW1ib2xcIjozMyxcIi4uL2NvcmUtanMvc3ltYm9sL2l0ZXJhdG9yXCI6MzR9XSw0MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IF9kZXJlcV8oXCJyZWdlbmVyYXRvci1ydW50aW1lXCIpO1xuXG59LHtcInJlZ2VuZXJhdG9yLXJ1bnRpbWVcIjozMTh9XSw0MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBwbGFjZUhvbGRlcnNDb3VudCAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICByZXR1cm4gYjY0W2xlbiAtIDJdID09PSAnPScgPyAyIDogYjY0W2xlbiAtIDFdID09PSAnPScgPyAxIDogMFxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG4gIHJldHVybiAoYjY0Lmxlbmd0aCAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0NvdW50KGI2NClcbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgaSwgbCwgdG1wLCBwbGFjZUhvbGRlcnMsIGFyclxuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuICBwbGFjZUhvbGRlcnMgPSBwbGFjZUhvbGRlcnNDb3VudChiNjQpXG5cbiAgYXJyID0gbmV3IEFycigobGVuICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzKVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBsZW4gLSA0IDogbGVuXG5cbiAgdmFyIEwgPSAwXG5cbiAgZm9yIChpID0gMDsgaSA8IGw7IGkgKz0gNCkge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgb3V0cHV0ID0gJydcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz09J1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMTBdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPSdcbiAgfVxuXG4gIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuXG59LHt9XSw0NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4oZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gVXRpbHNcbiAgZnVuY3Rpb24gYXNzZXJ0ICh2YWwsIG1zZykge1xuICAgIGlmICghdmFsKSB0aHJvdyBuZXcgRXJyb3IobXNnIHx8ICdBc3NlcnRpb24gZmFpbGVkJyk7XG4gIH1cblxuICAvLyBDb3VsZCB1c2UgYGluaGVyaXRzYCBtb2R1bGUsIGJ1dCBkb24ndCB3YW50IHRvIG1vdmUgZnJvbSBzaW5nbGUgZmlsZVxuICAvLyBhcmNoaXRlY3R1cmUgeWV0LlxuICBmdW5jdGlvbiBpbmhlcml0cyAoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3I7XG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge307XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTtcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpO1xuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvcjtcbiAgfVxuXG4gIC8vIEJOXG5cbiAgZnVuY3Rpb24gQk4gKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgaWYgKEJOLmlzQk4obnVtYmVyKSkge1xuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG5cbiAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICB0aGlzLndvcmRzID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBSZWR1Y3Rpb24gY29udGV4dFxuICAgIHRoaXMucmVkID0gbnVsbDtcblxuICAgIGlmIChudW1iZXIgIT09IG51bGwpIHtcbiAgICAgIGlmIChiYXNlID09PSAnbGUnIHx8IGJhc2UgPT09ICdiZScpIHtcbiAgICAgICAgZW5kaWFuID0gYmFzZTtcbiAgICAgICAgYmFzZSA9IDEwO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pbml0KG51bWJlciB8fCAwLCBiYXNlIHx8IDEwLCBlbmRpYW4gfHwgJ2JlJyk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gQk47XG4gIH0gZWxzZSB7XG4gICAgZXhwb3J0cy5CTiA9IEJOO1xuICB9XG5cbiAgQk4uQk4gPSBCTjtcbiAgQk4ud29yZFNpemUgPSAyNjtcblxuICB2YXIgQnVmZmVyO1xuICB0cnkge1xuICAgIEJ1ZmZlciA9IF9kZXJlcV8oJ2J1ZmZlcicpLkJ1ZmZlcjtcbiAgfSBjYXRjaCAoZSkge1xuICB9XG5cbiAgQk4uaXNCTiA9IGZ1bmN0aW9uIGlzQk4gKG51bSkge1xuICAgIGlmIChudW0gaW5zdGFuY2VvZiBCTikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bSAhPT0gbnVsbCAmJiB0eXBlb2YgbnVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgbnVtLmNvbnN0cnVjdG9yLndvcmRTaXplID09PSBCTi53b3JkU2l6ZSAmJiBBcnJheS5pc0FycmF5KG51bS53b3Jkcyk7XG4gIH07XG5cbiAgQk4ubWF4ID0gZnVuY3Rpb24gbWF4IChsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0LmNtcChyaWdodCkgPiAwKSByZXR1cm4gbGVmdDtcbiAgICByZXR1cm4gcmlnaHQ7XG4gIH07XG5cbiAgQk4ubWluID0gZnVuY3Rpb24gbWluIChsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0LmNtcChyaWdodCkgPCAwKSByZXR1cm4gbGVmdDtcbiAgICByZXR1cm4gcmlnaHQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdCAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0TnVtYmVyKG51bWJlciwgYmFzZSwgZW5kaWFuKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0QXJyYXkobnVtYmVyLCBiYXNlLCBlbmRpYW4pO1xuICAgIH1cblxuICAgIGlmIChiYXNlID09PSAnaGV4Jykge1xuICAgICAgYmFzZSA9IDE2O1xuICAgIH1cbiAgICBhc3NlcnQoYmFzZSA9PT0gKGJhc2UgfCAwKSAmJiBiYXNlID49IDIgJiYgYmFzZSA8PSAzNik7XG5cbiAgICBudW1iZXIgPSBudW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHMrL2csICcnKTtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGlmIChudW1iZXJbMF0gPT09ICctJykge1xuICAgICAgc3RhcnQrKztcbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gMTYpIHtcbiAgICAgIHRoaXMuX3BhcnNlSGV4KG51bWJlciwgc3RhcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wYXJzZUJhc2UobnVtYmVyLCBiYXNlLCBzdGFydCk7XG4gICAgfVxuXG4gICAgaWYgKG51bWJlclswXSA9PT0gJy0nKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICB9XG5cbiAgICB0aGlzLnN0cmlwKCk7XG5cbiAgICBpZiAoZW5kaWFuICE9PSAnbGUnKSByZXR1cm47XG5cbiAgICB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGJhc2UsIGVuZGlhbik7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0TnVtYmVyID0gZnVuY3Rpb24gX2luaXROdW1iZXIgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgbnVtYmVyID0gLW51bWJlcjtcbiAgICB9XG4gICAgaWYgKG51bWJlciA8IDB4NDAwMDAwMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFsgbnVtYmVyICYgMHgzZmZmZmZmIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfSBlbHNlIGlmIChudW1iZXIgPCAweDEwMDAwMDAwMDAwMDAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gW1xuICAgICAgICBudW1iZXIgJiAweDNmZmZmZmYsXG4gICAgICAgIChudW1iZXIgLyAweDQwMDAwMDApICYgMHgzZmZmZmZmXG4gICAgICBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQobnVtYmVyIDwgMHgyMDAwMDAwMDAwMDAwMCk7IC8vIDIgXiA1MyAodW5zYWZlKVxuICAgICAgdGhpcy53b3JkcyA9IFtcbiAgICAgICAgbnVtYmVyICYgMHgzZmZmZmZmLFxuICAgICAgICAobnVtYmVyIC8gMHg0MDAwMDAwKSAmIDB4M2ZmZmZmZixcbiAgICAgICAgMVxuICAgICAgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMztcbiAgICB9XG5cbiAgICBpZiAoZW5kaWFuICE9PSAnbGUnKSByZXR1cm47XG5cbiAgICAvLyBSZXZlcnNlIHRoZSBieXRlc1xuICAgIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgYmFzZSwgZW5kaWFuKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2luaXRBcnJheSA9IGZ1bmN0aW9uIF9pbml0QXJyYXkgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgLy8gUGVyaGFwcyBhIFVpbnQ4QXJyYXlcbiAgICBhc3NlcnQodHlwZW9mIG51bWJlci5sZW5ndGggPT09ICdudW1iZXInKTtcbiAgICBpZiAobnVtYmVyLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gWyAwIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbChudW1iZXIubGVuZ3RoIC8gMyk7XG4gICAgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICB9XG5cbiAgICB2YXIgaiwgdztcbiAgICB2YXIgb2ZmID0gMDtcbiAgICBpZiAoZW5kaWFuID09PSAnYmUnKSB7XG4gICAgICBmb3IgKGkgPSBudW1iZXIubGVuZ3RoIC0gMSwgaiA9IDA7IGkgPj0gMDsgaSAtPSAzKSB7XG4gICAgICAgIHcgPSBudW1iZXJbaV0gfCAobnVtYmVyW2kgLSAxXSA8PCA4KSB8IChudW1iZXJbaSAtIDJdIDw8IDE2KTtcbiAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSAodyA8PCBvZmYpICYgMHgzZmZmZmZmO1xuICAgICAgICB0aGlzLndvcmRzW2ogKyAxXSA9ICh3ID4+PiAoMjYgLSBvZmYpKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgb2ZmICs9IDI0O1xuICAgICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgICAgb2ZmIC09IDI2O1xuICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5kaWFuID09PSAnbGUnKSB7XG4gICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG51bWJlci5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB3ID0gbnVtYmVyW2ldIHwgKG51bWJlcltpICsgMV0gPDwgOCkgfCAobnVtYmVyW2kgKyAyXSA8PCAxNik7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqICsgMV0gPSAodyA+Pj4gKDI2IC0gb2ZmKSkgJiAweDNmZmZmZmY7XG4gICAgICAgIG9mZiArPSAyNDtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBwYXJzZUhleCAoc3RyLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIHIgPSAwO1xuICAgIHZhciBsZW4gPSBNYXRoLm1pbihzdHIubGVuZ3RoLCBlbmQpO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgYyA9IHN0ci5jaGFyQ29kZUF0KGkpIC0gNDg7XG5cbiAgICAgIHIgPDw9IDQ7XG5cbiAgICAgIC8vICdhJyAtICdmJ1xuICAgICAgaWYgKGMgPj0gNDkgJiYgYyA8PSA1NCkge1xuICAgICAgICByIHw9IGMgLSA0OSArIDB4YTtcblxuICAgICAgLy8gJ0EnIC0gJ0YnXG4gICAgICB9IGVsc2UgaWYgKGMgPj0gMTcgJiYgYyA8PSAyMikge1xuICAgICAgICByIHw9IGMgLSAxNyArIDB4YTtcblxuICAgICAgLy8gJzAnIC0gJzknXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByIHw9IGMgJiAweGY7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9wYXJzZUhleCA9IGZ1bmN0aW9uIF9wYXJzZUhleCAobnVtYmVyLCBzdGFydCkge1xuICAgIC8vIENyZWF0ZSBwb3NzaWJseSBiaWdnZXIgYXJyYXkgdG8gZW5zdXJlIHRoYXQgaXQgZml0cyB0aGUgbnVtYmVyXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwoKG51bWJlci5sZW5ndGggLSBzdGFydCkgLyA2KTtcbiAgICB0aGlzLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAwO1xuICAgIH1cblxuICAgIHZhciBqLCB3O1xuICAgIC8vIFNjYW4gMjQtYml0IGNodW5rcyBhbmQgYWRkIHRoZW0gdG8gdGhlIG51bWJlclxuICAgIHZhciBvZmYgPSAwO1xuICAgIGZvciAoaSA9IG51bWJlci5sZW5ndGggLSA2LCBqID0gMDsgaSA+PSBzdGFydDsgaSAtPSA2KSB7XG4gICAgICB3ID0gcGFyc2VIZXgobnVtYmVyLCBpLCBpICsgNik7XG4gICAgICB0aGlzLndvcmRzW2pdIHw9ICh3IDw8IG9mZikgJiAweDNmZmZmZmY7XG4gICAgICAvLyBOT1RFOiBgMHgzZmZmZmZgIGlzIGludGVudGlvbmFsIGhlcmUsIDI2Yml0cyBtYXggc2hpZnQgKyAyNGJpdCBoZXggbGltYlxuICAgICAgdGhpcy53b3Jkc1tqICsgMV0gfD0gdyA+Pj4gKDI2IC0gb2ZmKSAmIDB4M2ZmZmZmO1xuICAgICAgb2ZmICs9IDI0O1xuICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICBvZmYgLT0gMjY7XG4gICAgICAgIGorKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgKyA2ICE9PSBzdGFydCkge1xuICAgICAgdyA9IHBhcnNlSGV4KG51bWJlciwgc3RhcnQsIGkgKyA2KTtcbiAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgIHRoaXMud29yZHNbaiArIDFdIHw9IHcgPj4+ICgyNiAtIG9mZikgJiAweDNmZmZmZjtcbiAgICB9XG4gICAgdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHBhcnNlQmFzZSAoc3RyLCBzdGFydCwgZW5kLCBtdWwpIHtcbiAgICB2YXIgciA9IDA7XG4gICAgdmFyIGxlbiA9IE1hdGgubWluKHN0ci5sZW5ndGgsIGVuZCk7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciBjID0gc3RyLmNoYXJDb2RlQXQoaSkgLSA0ODtcblxuICAgICAgciAqPSBtdWw7XG5cbiAgICAgIC8vICdhJ1xuICAgICAgaWYgKGMgPj0gNDkpIHtcbiAgICAgICAgciArPSBjIC0gNDkgKyAweGE7XG5cbiAgICAgIC8vICdBJ1xuICAgICAgfSBlbHNlIGlmIChjID49IDE3KSB7XG4gICAgICAgIHIgKz0gYyAtIDE3ICsgMHhhO1xuXG4gICAgICAvLyAnMCcgLSAnOSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHIgKz0gYztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICBCTi5wcm90b3R5cGUuX3BhcnNlQmFzZSA9IGZ1bmN0aW9uIF9wYXJzZUJhc2UgKG51bWJlciwgYmFzZSwgc3RhcnQpIHtcbiAgICAvLyBJbml0aWFsaXplIGFzIHplcm9cbiAgICB0aGlzLndvcmRzID0gWyAwIF07XG4gICAgdGhpcy5sZW5ndGggPSAxO1xuXG4gICAgLy8gRmluZCBsZW5ndGggb2YgbGltYiBpbiBiYXNlXG4gICAgZm9yICh2YXIgbGltYkxlbiA9IDAsIGxpbWJQb3cgPSAxOyBsaW1iUG93IDw9IDB4M2ZmZmZmZjsgbGltYlBvdyAqPSBiYXNlKSB7XG4gICAgICBsaW1iTGVuKys7XG4gICAgfVxuICAgIGxpbWJMZW4tLTtcbiAgICBsaW1iUG93ID0gKGxpbWJQb3cgLyBiYXNlKSB8IDA7XG5cbiAgICB2YXIgdG90YWwgPSBudW1iZXIubGVuZ3RoIC0gc3RhcnQ7XG4gICAgdmFyIG1vZCA9IHRvdGFsICUgbGltYkxlbjtcbiAgICB2YXIgZW5kID0gTWF0aC5taW4odG90YWwsIHRvdGFsIC0gbW9kKSArIHN0YXJ0O1xuXG4gICAgdmFyIHdvcmQgPSAwO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSBsaW1iTGVuKSB7XG4gICAgICB3b3JkID0gcGFyc2VCYXNlKG51bWJlciwgaSwgaSArIGxpbWJMZW4sIGJhc2UpO1xuXG4gICAgICB0aGlzLmltdWxuKGxpbWJQb3cpO1xuICAgICAgaWYgKHRoaXMud29yZHNbMF0gKyB3b3JkIDwgMHg0MDAwMDAwKSB7XG4gICAgICAgIHRoaXMud29yZHNbMF0gKz0gd29yZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2lhZGRuKHdvcmQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb2QgIT09IDApIHtcbiAgICAgIHZhciBwb3cgPSAxO1xuICAgICAgd29yZCA9IHBhcnNlQmFzZShudW1iZXIsIGksIG51bWJlci5sZW5ndGgsIGJhc2UpO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbW9kOyBpKyspIHtcbiAgICAgICAgcG93ICo9IGJhc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW11bG4ocG93KTtcbiAgICAgIGlmICh0aGlzLndvcmRzWzBdICsgd29yZCA8IDB4NDAwMDAwMCkge1xuICAgICAgICB0aGlzLndvcmRzWzBdICs9IHdvcmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pYWRkbih3b3JkKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5IChkZXN0KSB7XG4gICAgZGVzdC53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZXN0LndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXTtcbiAgICB9XG4gICAgZGVzdC5sZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICBkZXN0Lm5lZ2F0aXZlID0gdGhpcy5uZWdhdGl2ZTtcbiAgICBkZXN0LnJlZCA9IHRoaXMucmVkO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lICgpIHtcbiAgICB2YXIgciA9IG5ldyBCTihudWxsKTtcbiAgICB0aGlzLmNvcHkocik7XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9leHBhbmQgPSBmdW5jdGlvbiBfZXhwYW5kIChzaXplKSB7XG4gICAgd2hpbGUgKHRoaXMubGVuZ3RoIDwgc2l6ZSkge1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXSA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIFJlbW92ZSBsZWFkaW5nIGAwYCBmcm9tIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc3RyaXAgPSBmdW5jdGlvbiBzdHJpcCAoKSB7XG4gICAgd2hpbGUgKHRoaXMubGVuZ3RoID4gMSAmJiB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgIHRoaXMubGVuZ3RoLS07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fbm9ybVNpZ24gPSBmdW5jdGlvbiBfbm9ybVNpZ24gKCkge1xuICAgIC8vIC0wID0gMFxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdID09PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgICByZXR1cm4gKHRoaXMucmVkID8gJzxCTi1SOiAnIDogJzxCTjogJykgKyB0aGlzLnRvU3RyaW5nKDE2KSArICc+JztcbiAgfTtcblxuICAvKlxuXG4gIHZhciB6ZXJvcyA9IFtdO1xuICB2YXIgZ3JvdXBTaXplcyA9IFtdO1xuICB2YXIgZ3JvdXBCYXNlcyA9IFtdO1xuXG4gIHZhciBzID0gJyc7XG4gIHZhciBpID0gLTE7XG4gIHdoaWxlICgrK2kgPCBCTi53b3JkU2l6ZSkge1xuICAgIHplcm9zW2ldID0gcztcbiAgICBzICs9ICcwJztcbiAgfVxuICBncm91cFNpemVzWzBdID0gMDtcbiAgZ3JvdXBTaXplc1sxXSA9IDA7XG4gIGdyb3VwQmFzZXNbMF0gPSAwO1xuICBncm91cEJhc2VzWzFdID0gMDtcbiAgdmFyIGJhc2UgPSAyIC0gMTtcbiAgd2hpbGUgKCsrYmFzZSA8IDM2ICsgMSkge1xuICAgIHZhciBncm91cFNpemUgPSAwO1xuICAgIHZhciBncm91cEJhc2UgPSAxO1xuICAgIHdoaWxlIChncm91cEJhc2UgPCAoMSA8PCBCTi53b3JkU2l6ZSkgLyBiYXNlKSB7XG4gICAgICBncm91cEJhc2UgKj0gYmFzZTtcbiAgICAgIGdyb3VwU2l6ZSArPSAxO1xuICAgIH1cbiAgICBncm91cFNpemVzW2Jhc2VdID0gZ3JvdXBTaXplO1xuICAgIGdyb3VwQmFzZXNbYmFzZV0gPSBncm91cEJhc2U7XG4gIH1cblxuICAqL1xuXG4gIHZhciB6ZXJvcyA9IFtcbiAgICAnJyxcbiAgICAnMCcsXG4gICAgJzAwJyxcbiAgICAnMDAwJyxcbiAgICAnMDAwMCcsXG4gICAgJzAwMDAwJyxcbiAgICAnMDAwMDAwJyxcbiAgICAnMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCdcbiAgXTtcblxuICB2YXIgZ3JvdXBTaXplcyA9IFtcbiAgICAwLCAwLFxuICAgIDI1LCAxNiwgMTIsIDExLCAxMCwgOSwgOCxcbiAgICA4LCA3LCA3LCA3LCA3LCA2LCA2LFxuICAgIDYsIDYsIDYsIDYsIDYsIDUsIDUsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1XG4gIF07XG5cbiAgdmFyIGdyb3VwQmFzZXMgPSBbXG4gICAgMCwgMCxcbiAgICAzMzU1NDQzMiwgNDMwNDY3MjEsIDE2Nzc3MjE2LCA0ODgyODEyNSwgNjA0NjYxNzYsIDQwMzUzNjA3LCAxNjc3NzIxNixcbiAgICA0MzA0NjcyMSwgMTAwMDAwMDAsIDE5NDg3MTcxLCAzNTgzMTgwOCwgNjI3NDg1MTcsIDc1Mjk1MzYsIDExMzkwNjI1LFxuICAgIDE2Nzc3MjE2LCAyNDEzNzU2OSwgMzQwMTIyMjQsIDQ3MDQ1ODgxLCA2NDAwMDAwMCwgNDA4NDEwMSwgNTE1MzYzMixcbiAgICA2NDM2MzQzLCA3OTYyNjI0LCA5NzY1NjI1LCAxMTg4MTM3NiwgMTQzNDg5MDcsIDE3MjEwMzY4LCAyMDUxMTE0OSxcbiAgICAyNDMwMDAwMCwgMjg2MjkxNTEsIDMzNTU0NDMyLCAzOTEzNTM5MywgNDU0MzU0MjQsIDUyNTIxODc1LCA2MDQ2NjE3NlxuICBdO1xuXG4gIEJOLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nIChiYXNlLCBwYWRkaW5nKSB7XG4gICAgYmFzZSA9IGJhc2UgfHwgMTA7XG4gICAgcGFkZGluZyA9IHBhZGRpbmcgfCAwIHx8IDE7XG5cbiAgICB2YXIgb3V0O1xuICAgIGlmIChiYXNlID09PSAxNiB8fCBiYXNlID09PSAnaGV4Jykge1xuICAgICAgb3V0ID0gJyc7XG4gICAgICB2YXIgb2ZmID0gMDtcbiAgICAgIHZhciBjYXJyeSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHcgPSB0aGlzLndvcmRzW2ldO1xuICAgICAgICB2YXIgd29yZCA9ICgoKHcgPDwgb2ZmKSB8IGNhcnJ5KSAmIDB4ZmZmZmZmKS50b1N0cmluZygxNik7XG4gICAgICAgIGNhcnJ5ID0gKHcgPj4+ICgyNCAtIG9mZikpICYgMHhmZmZmZmY7XG4gICAgICAgIGlmIChjYXJyeSAhPT0gMCB8fCBpICE9PSB0aGlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBvdXQgPSB6ZXJvc1s2IC0gd29yZC5sZW5ndGhdICsgd29yZCArIG91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgPSB3b3JkICsgb3V0O1xuICAgICAgICB9XG4gICAgICAgIG9mZiArPSAyO1xuICAgICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgICAgb2ZmIC09IDI2O1xuICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICAgIG91dCA9IGNhcnJ5LnRvU3RyaW5nKDE2KSArIG91dDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChvdXQubGVuZ3RoICUgcGFkZGluZyAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnMCcgKyBvdXQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnLScgKyBvdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGlmIChiYXNlID09PSAoYmFzZSB8IDApICYmIGJhc2UgPj0gMiAmJiBiYXNlIDw9IDM2KSB7XG4gICAgICAvLyB2YXIgZ3JvdXBTaXplID0gTWF0aC5mbG9vcihCTi53b3JkU2l6ZSAqIE1hdGguTE4yIC8gTWF0aC5sb2coYmFzZSkpO1xuICAgICAgdmFyIGdyb3VwU2l6ZSA9IGdyb3VwU2l6ZXNbYmFzZV07XG4gICAgICAvLyB2YXIgZ3JvdXBCYXNlID0gTWF0aC5wb3coYmFzZSwgZ3JvdXBTaXplKTtcbiAgICAgIHZhciBncm91cEJhc2UgPSBncm91cEJhc2VzW2Jhc2VdO1xuICAgICAgb3V0ID0gJyc7XG4gICAgICB2YXIgYyA9IHRoaXMuY2xvbmUoKTtcbiAgICAgIGMubmVnYXRpdmUgPSAwO1xuICAgICAgd2hpbGUgKCFjLmlzWmVybygpKSB7XG4gICAgICAgIHZhciByID0gYy5tb2RuKGdyb3VwQmFzZSkudG9TdHJpbmcoYmFzZSk7XG4gICAgICAgIGMgPSBjLmlkaXZuKGdyb3VwQmFzZSk7XG5cbiAgICAgICAgaWYgKCFjLmlzWmVybygpKSB7XG4gICAgICAgICAgb3V0ID0gemVyb3NbZ3JvdXBTaXplIC0gci5sZW5ndGhdICsgciArIG91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgPSByICsgb3V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1plcm8oKSkge1xuICAgICAgICBvdXQgPSAnMCcgKyBvdXQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAob3V0Lmxlbmd0aCAlIHBhZGRpbmcgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJy0nICsgb3V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBhc3NlcnQoZmFsc2UsICdCYXNlIHNob3VsZCBiZSBiZXR3ZWVuIDIgYW5kIDM2Jyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvTnVtYmVyID0gZnVuY3Rpb24gdG9OdW1iZXIgKCkge1xuICAgIHZhciByZXQgPSB0aGlzLndvcmRzWzBdO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcmV0ICs9IHRoaXMud29yZHNbMV0gKiAweDQwMDAwMDA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxlbmd0aCA9PT0gMyAmJiB0aGlzLndvcmRzWzJdID09PSAweDAxKSB7XG4gICAgICAvLyBOT1RFOiBhdCB0aGlzIHN0YWdlIGl0IGlzIGtub3duIHRoYXQgdGhlIHRvcCBiaXQgaXMgc2V0XG4gICAgICByZXQgKz0gMHgxMDAwMDAwMDAwMDAwMCArICh0aGlzLndvcmRzWzFdICogMHg0MDAwMDAwKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGVuZ3RoID4gMikge1xuICAgICAgYXNzZXJ0KGZhbHNlLCAnTnVtYmVyIGNhbiBvbmx5IHNhZmVseSBzdG9yZSB1cCB0byA1MyBiaXRzJyk7XG4gICAgfVxuICAgIHJldHVybiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkgPyAtcmV0IDogcmV0O1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKDE2KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9CdWZmZXIgPSBmdW5jdGlvbiB0b0J1ZmZlciAoZW5kaWFuLCBsZW5ndGgpIHtcbiAgICBhc3NlcnQodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpO1xuICAgIHJldHVybiB0aGlzLnRvQXJyYXlMaWtlKEJ1ZmZlciwgZW5kaWFuLCBsZW5ndGgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gdG9BcnJheSAoZW5kaWFuLCBsZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShBcnJheSwgZW5kaWFuLCBsZW5ndGgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0FycmF5TGlrZSA9IGZ1bmN0aW9uIHRvQXJyYXlMaWtlIChBcnJheVR5cGUsIGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgdmFyIGJ5dGVMZW5ndGggPSB0aGlzLmJ5dGVMZW5ndGgoKTtcbiAgICB2YXIgcmVxTGVuZ3RoID0gbGVuZ3RoIHx8IE1hdGgubWF4KDEsIGJ5dGVMZW5ndGgpO1xuICAgIGFzc2VydChieXRlTGVuZ3RoIDw9IHJlcUxlbmd0aCwgJ2J5dGUgYXJyYXkgbG9uZ2VyIHRoYW4gZGVzaXJlZCBsZW5ndGgnKTtcbiAgICBhc3NlcnQocmVxTGVuZ3RoID4gMCwgJ1JlcXVlc3RlZCBhcnJheSBsZW5ndGggPD0gMCcpO1xuXG4gICAgdGhpcy5zdHJpcCgpO1xuICAgIHZhciBsaXR0bGVFbmRpYW4gPSBlbmRpYW4gPT09ICdsZSc7XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheVR5cGUocmVxTGVuZ3RoKTtcblxuICAgIHZhciBiLCBpO1xuICAgIHZhciBxID0gdGhpcy5jbG9uZSgpO1xuICAgIGlmICghbGl0dGxlRW5kaWFuKSB7XG4gICAgICAvLyBBc3N1bWUgYmlnLWVuZGlhblxuICAgICAgZm9yIChpID0gMDsgaSA8IHJlcUxlbmd0aCAtIGJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbaV0gPSAwO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAwOyAhcS5pc1plcm8oKTsgaSsrKSB7XG4gICAgICAgIGIgPSBxLmFuZGxuKDB4ZmYpO1xuICAgICAgICBxLml1c2hybig4KTtcblxuICAgICAgICByZXNbcmVxTGVuZ3RoIC0gaSAtIDFdID0gYjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChpID0gMDsgIXEuaXNaZXJvKCk7IGkrKykge1xuICAgICAgICBiID0gcS5hbmRsbigweGZmKTtcbiAgICAgICAgcS5pdXNocm4oOCk7XG5cbiAgICAgICAgcmVzW2ldID0gYjtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IGkgPCByZXFMZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbaV0gPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgaWYgKE1hdGguY2x6MzIpIHtcbiAgICBCTi5wcm90b3R5cGUuX2NvdW50Qml0cyA9IGZ1bmN0aW9uIF9jb3VudEJpdHMgKHcpIHtcbiAgICAgIHJldHVybiAzMiAtIE1hdGguY2x6MzIodyk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBCTi5wcm90b3R5cGUuX2NvdW50Qml0cyA9IGZ1bmN0aW9uIF9jb3VudEJpdHMgKHcpIHtcbiAgICAgIHZhciB0ID0gdztcbiAgICAgIHZhciByID0gMDtcbiAgICAgIGlmICh0ID49IDB4MTAwMCkge1xuICAgICAgICByICs9IDEzO1xuICAgICAgICB0ID4+Pj0gMTM7XG4gICAgICB9XG4gICAgICBpZiAodCA+PSAweDQwKSB7XG4gICAgICAgIHIgKz0gNztcbiAgICAgICAgdCA+Pj49IDc7XG4gICAgICB9XG4gICAgICBpZiAodCA+PSAweDgpIHtcbiAgICAgICAgciArPSA0O1xuICAgICAgICB0ID4+Pj0gNDtcbiAgICAgIH1cbiAgICAgIGlmICh0ID49IDB4MDIpIHtcbiAgICAgICAgciArPSAyO1xuICAgICAgICB0ID4+Pj0gMjtcbiAgICAgIH1cbiAgICAgIHJldHVybiByICsgdDtcbiAgICB9O1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl96ZXJvQml0cyA9IGZ1bmN0aW9uIF96ZXJvQml0cyAodykge1xuICAgIC8vIFNob3J0LWN1dFxuICAgIGlmICh3ID09PSAwKSByZXR1cm4gMjY7XG5cbiAgICB2YXIgdCA9IHc7XG4gICAgdmFyIHIgPSAwO1xuICAgIGlmICgodCAmIDB4MWZmZikgPT09IDApIHtcbiAgICAgIHIgKz0gMTM7XG4gICAgICB0ID4+Pj0gMTM7XG4gICAgfVxuICAgIGlmICgodCAmIDB4N2YpID09PSAwKSB7XG4gICAgICByICs9IDc7XG4gICAgICB0ID4+Pj0gNztcbiAgICB9XG4gICAgaWYgKCh0ICYgMHhmKSA9PT0gMCkge1xuICAgICAgciArPSA0O1xuICAgICAgdCA+Pj49IDQ7XG4gICAgfVxuICAgIGlmICgodCAmIDB4MykgPT09IDApIHtcbiAgICAgIHIgKz0gMjtcbiAgICAgIHQgPj4+PSAyO1xuICAgIH1cbiAgICBpZiAoKHQgJiAweDEpID09PSAwKSB7XG4gICAgICByKys7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIC8vIFJldHVybiBudW1iZXIgb2YgdXNlZCBiaXRzIGluIGEgQk5cbiAgQk4ucHJvdG90eXBlLmJpdExlbmd0aCA9IGZ1bmN0aW9uIGJpdExlbmd0aCAoKSB7XG4gICAgdmFyIHcgPSB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV07XG4gICAgdmFyIGhpID0gdGhpcy5fY291bnRCaXRzKHcpO1xuICAgIHJldHVybiAodGhpcy5sZW5ndGggLSAxKSAqIDI2ICsgaGk7XG4gIH07XG5cbiAgZnVuY3Rpb24gdG9CaXRBcnJheSAobnVtKSB7XG4gICAgdmFyIHcgPSBuZXcgQXJyYXkobnVtLmJpdExlbmd0aCgpKTtcblxuICAgIGZvciAodmFyIGJpdCA9IDA7IGJpdCA8IHcubGVuZ3RoOyBiaXQrKykge1xuICAgICAgdmFyIG9mZiA9IChiaXQgLyAyNikgfCAwO1xuICAgICAgdmFyIHdiaXQgPSBiaXQgJSAyNjtcblxuICAgICAgd1tiaXRdID0gKG51bS53b3Jkc1tvZmZdICYgKDEgPDwgd2JpdCkpID4+PiB3Yml0O1xuICAgIH1cblxuICAgIHJldHVybiB3O1xuICB9XG5cbiAgLy8gTnVtYmVyIG9mIHRyYWlsaW5nIHplcm8gYml0c1xuICBCTi5wcm90b3R5cGUuemVyb0JpdHMgPSBmdW5jdGlvbiB6ZXJvQml0cyAoKSB7XG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiAwO1xuXG4gICAgdmFyIHIgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGIgPSB0aGlzLl96ZXJvQml0cyh0aGlzLndvcmRzW2ldKTtcbiAgICAgIHIgKz0gYjtcbiAgICAgIGlmIChiICE9PSAyNikgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ieXRlTGVuZ3RoID0gZnVuY3Rpb24gYnl0ZUxlbmd0aCAoKSB7XG4gICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmJpdExlbmd0aCgpIC8gOCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvVHdvcyA9IGZ1bmN0aW9uIHRvVHdvcyAod2lkdGgpIHtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuYWJzKCkuaW5vdG4od2lkdGgpLmlhZGRuKDEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5mcm9tVHdvcyA9IGZ1bmN0aW9uIGZyb21Ud29zICh3aWR0aCkge1xuICAgIGlmICh0aGlzLnRlc3RuKHdpZHRoIC0gMSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vdG4od2lkdGgpLmlhZGRuKDEpLmluZWcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNOZWcgPSBmdW5jdGlvbiBpc05lZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDA7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG5lZ2F0aXZlIGNsb25lIG9mIGB0aGlzYFxuICBCTi5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnICgpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmluZWcoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW5lZyA9IGZ1bmN0aW9uIGluZWcgKCkge1xuICAgIGlmICghdGhpcy5pc1plcm8oKSkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSBePSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIE9yIGBudW1gIHdpdGggYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdW9yID0gZnVuY3Rpb24gaXVvciAobnVtKSB7XG4gICAgd2hpbGUgKHRoaXMubGVuZ3RoIDwgbnVtLmxlbmd0aCkge1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXSA9IDA7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldIHwgbnVtLndvcmRzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlvciA9IGZ1bmN0aW9uIGlvciAobnVtKSB7XG4gICAgYXNzZXJ0KCh0aGlzLm5lZ2F0aXZlIHwgbnVtLm5lZ2F0aXZlKSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVvcihudW0pO1xuICB9O1xuXG4gIC8vIE9yIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5vciA9IGZ1bmN0aW9uIG9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLmlvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pb3IodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVvciA9IGZ1bmN0aW9uIHVvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdW9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml1b3IodGhpcyk7XG4gIH07XG5cbiAgLy8gQW5kIGBudW1gIHdpdGggYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdWFuZCA9IGZ1bmN0aW9uIGl1YW5kIChudW0pIHtcbiAgICAvLyBiID0gbWluLWxlbmd0aChudW0sIHRoaXMpXG4gICAgdmFyIGI7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkge1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXSAmIG51bS53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IGIubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaWFuZCA9IGZ1bmN0aW9uIGlhbmQgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1YW5kKG51bSk7XG4gIH07XG5cbiAgLy8gQW5kIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiBhbmQgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaWFuZChudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pYW5kKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51YW5kID0gZnVuY3Rpb24gdWFuZCAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdWFuZChudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdWFuZCh0aGlzKTtcbiAgfTtcblxuICAvLyBYb3IgYG51bWAgd2l0aCBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1eG9yID0gZnVuY3Rpb24gaXV4b3IgKG51bSkge1xuICAgIC8vIGEubGVuZ3RoID4gYi5sZW5ndGhcbiAgICB2YXIgYTtcbiAgICB2YXIgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldIF4gYi53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcyAhPT0gYSkge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYS5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5peG9yID0gZnVuY3Rpb24gaXhvciAobnVtKSB7XG4gICAgYXNzZXJ0KCh0aGlzLm5lZ2F0aXZlIHwgbnVtLm5lZ2F0aXZlKSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXV4b3IobnVtKTtcbiAgfTtcblxuICAvLyBYb3IgYG51bWAgd2l0aCBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uIHhvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5peG9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml4b3IodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnV4b3IgPSBmdW5jdGlvbiB1eG9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml1eG9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml1eG9yKHRoaXMpO1xuICB9O1xuXG4gIC8vIE5vdCBgYHRoaXNgYCB3aXRoIGBgd2lkdGhgYCBiaXR3aWR0aFxuICBCTi5wcm90b3R5cGUuaW5vdG4gPSBmdW5jdGlvbiBpbm90biAod2lkdGgpIHtcbiAgICBhc3NlcnQodHlwZW9mIHdpZHRoID09PSAnbnVtYmVyJyAmJiB3aWR0aCA+PSAwKTtcblxuICAgIHZhciBieXRlc05lZWRlZCA9IE1hdGguY2VpbCh3aWR0aCAvIDI2KSB8IDA7XG4gICAgdmFyIGJpdHNMZWZ0ID0gd2lkdGggJSAyNjtcblxuICAgIC8vIEV4dGVuZCB0aGUgYnVmZmVyIHdpdGggbGVhZGluZyB6ZXJvZXNcbiAgICB0aGlzLl9leHBhbmQoYnl0ZXNOZWVkZWQpO1xuXG4gICAgaWYgKGJpdHNMZWZ0ID4gMCkge1xuICAgICAgYnl0ZXNOZWVkZWQtLTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgY29tcGxldGUgd29yZHNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzTmVlZGVkOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB+dGhpcy53b3Jkc1tpXSAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdGhlIHJlc2lkdWVcbiAgICBpZiAoYml0c0xlZnQgPiAwKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gfnRoaXMud29yZHNbaV0gJiAoMHgzZmZmZmZmID4+ICgyNiAtIGJpdHNMZWZ0KSk7XG4gICAgfVxuXG4gICAgLy8gQW5kIHJlbW92ZSBsZWFkaW5nIHplcm9lc1xuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLm5vdG4gPSBmdW5jdGlvbiBub3RuICh3aWR0aCkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW5vdG4od2lkdGgpO1xuICB9O1xuXG4gIC8vIFNldCBgYml0YCBvZiBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnNldG4gPSBmdW5jdGlvbiBzZXRuIChiaXQsIHZhbCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0ID09PSAnbnVtYmVyJyAmJiBiaXQgPj0gMCk7XG5cbiAgICB2YXIgb2ZmID0gKGJpdCAvIDI2KSB8IDA7XG4gICAgdmFyIHdiaXQgPSBiaXQgJSAyNjtcblxuICAgIHRoaXMuX2V4cGFuZChvZmYgKyAxKTtcblxuICAgIGlmICh2YWwpIHtcbiAgICAgIHRoaXMud29yZHNbb2ZmXSA9IHRoaXMud29yZHNbb2ZmXSB8ICgxIDw8IHdiaXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndvcmRzW29mZl0gPSB0aGlzLndvcmRzW29mZl0gJiB+KDEgPDwgd2JpdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBBZGQgYG51bWAgdG8gYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24gaWFkZCAobnVtKSB7XG4gICAgdmFyIHI7XG5cbiAgICAvLyBuZWdhdGl2ZSArIHBvc2l0aXZlXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHIgPSB0aGlzLmlzdWIobnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgXj0gMTtcbiAgICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpO1xuXG4gICAgLy8gcG9zaXRpdmUgKyBuZWdhdGl2ZVxuICAgIH0gZWxzZSBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDA7XG4gICAgICByID0gdGhpcy5pc3ViKG51bSk7XG4gICAgICBudW0ubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHIuX25vcm1TaWduKCk7XG4gICAgfVxuXG4gICAgLy8gYS5sZW5ndGggPiBiLmxlbmd0aFxuICAgIHZhciBhLCBiO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHtcbiAgICAgIGEgPSB0aGlzO1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IG51bTtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIChiLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSByID4+PiAyNjtcbiAgICB9XG4gICAgZm9yICg7IGNhcnJ5ICE9PSAwICYmIGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgICBjYXJyeSA9IHIgPj4+IDI2O1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICAvLyBDb3B5IHRoZSByZXN0IG9mIHRoZSB3b3Jkc1xuICAgIH0gZWxzZSBpZiAoYSAhPT0gdGhpcykge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIEFkZCBgbnVtYCB0byBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAobnVtKSB7XG4gICAgdmFyIHJlcztcbiAgICBpZiAobnVtLm5lZ2F0aXZlICE9PSAwICYmIHRoaXMubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXMgPSB0aGlzLnN1YihudW0pO1xuICAgICAgbnVtLm5lZ2F0aXZlIF49IDE7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSBpZiAobnVtLm5lZ2F0aXZlID09PSAwICYmIHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgcmVzID0gbnVtLnN1Yih0aGlzKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLmlhZGQobnVtKTtcblxuICAgIHJldHVybiBudW0uY2xvbmUoKS5pYWRkKHRoaXMpO1xuICB9O1xuXG4gIC8vIFN1YnRyYWN0IGBudW1gIGZyb20gYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24gaXN1YiAobnVtKSB7XG4gICAgLy8gdGhpcyAtICgtbnVtKSA9IHRoaXMgKyBudW1cbiAgICBpZiAobnVtLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgdmFyIHIgPSB0aGlzLmlhZGQobnVtKTtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gci5fbm9ybVNpZ24oKTtcblxuICAgIC8vIC10aGlzIC0gbnVtID0gLSh0aGlzICsgbnVtKVxuICAgIH0gZWxzZSBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlhZGQobnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7XG4gICAgfVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCBib3RoIG51bWJlcnMgYXJlIHBvc2l0aXZlXG4gICAgdmFyIGNtcCA9IHRoaXMuY21wKG51bSk7XG5cbiAgICAvLyBPcHRpbWl6YXRpb24gLSB6ZXJvaWZ5XG4gICAgaWYgKGNtcCA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgICB0aGlzLndvcmRzWzBdID0gMDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIGEgPiBiXG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGNtcCA+IDApIHtcbiAgICAgIGEgPSB0aGlzO1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IG51bTtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSAtIChiLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gciA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICBmb3IgKDsgY2FycnkgIT09IDAgJiYgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHIgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICAvLyBDb3B5IHJlc3Qgb2YgdGhlIHdvcmRzXG4gICAgaWYgKGNhcnJ5ID09PSAwICYmIGkgPCBhLmxlbmd0aCAmJiBhICE9PSB0aGlzKSB7XG4gICAgICBmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgaSk7XG5cbiAgICBpZiAoYSAhPT0gdGhpcykge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBTdWJ0cmFjdCBgbnVtYCBmcm9tIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24gc3ViIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWIobnVtKTtcbiAgfTtcblxuICBmdW5jdGlvbiBzbWFsbE11bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIG91dC5uZWdhdGl2ZSA9IG51bS5uZWdhdGl2ZSBeIHNlbGYubmVnYXRpdmU7XG4gICAgdmFyIGxlbiA9IChzZWxmLmxlbmd0aCArIG51bS5sZW5ndGgpIHwgMDtcbiAgICBvdXQubGVuZ3RoID0gbGVuO1xuICAgIGxlbiA9IChsZW4gLSAxKSB8IDA7XG5cbiAgICAvLyBQZWVsIG9uZSBpdGVyYXRpb24gKGNvbXBpbGVyIGNhbid0IGRvIGl0LCBiZWNhdXNlIG9mIGNvZGUgY29tcGxleGl0eSlcbiAgICB2YXIgYSA9IHNlbGYud29yZHNbMF0gfCAwO1xuICAgIHZhciBiID0gbnVtLndvcmRzWzBdIHwgMDtcbiAgICB2YXIgciA9IGEgKiBiO1xuXG4gICAgdmFyIGxvID0gciAmIDB4M2ZmZmZmZjtcbiAgICB2YXIgY2FycnkgPSAociAvIDB4NDAwMDAwMCkgfCAwO1xuICAgIG91dC53b3Jkc1swXSA9IGxvO1xuXG4gICAgZm9yICh2YXIgayA9IDE7IGsgPCBsZW47IGsrKykge1xuICAgICAgLy8gU3VtIGFsbCB3b3JkcyB3aXRoIHRoZSBzYW1lIGBpICsgaiA9IGtgIGFuZCBhY2N1bXVsYXRlIGBuY2FycnlgLFxuICAgICAgLy8gbm90ZSB0aGF0IG5jYXJyeSBjb3VsZCBiZSA+PSAweDNmZmZmZmZcbiAgICAgIHZhciBuY2FycnkgPSBjYXJyeSA+Pj4gMjY7XG4gICAgICB2YXIgcndvcmQgPSBjYXJyeSAmIDB4M2ZmZmZmZjtcbiAgICAgIHZhciBtYXhKID0gTWF0aC5taW4oaywgbnVtLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaiA9IE1hdGgubWF4KDAsIGsgLSBzZWxmLmxlbmd0aCArIDEpOyBqIDw9IG1heEo7IGorKykge1xuICAgICAgICB2YXIgaSA9IChrIC0gaikgfCAwO1xuICAgICAgICBhID0gc2VsZi53b3Jkc1tpXSB8IDA7XG4gICAgICAgIGIgPSBudW0ud29yZHNbal0gfCAwO1xuICAgICAgICByID0gYSAqIGIgKyByd29yZDtcbiAgICAgICAgbmNhcnJ5ICs9IChyIC8gMHg0MDAwMDAwKSB8IDA7XG4gICAgICAgIHJ3b3JkID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgIH1cbiAgICAgIG91dC53b3Jkc1trXSA9IHJ3b3JkIHwgMDtcbiAgICAgIGNhcnJ5ID0gbmNhcnJ5IHwgMDtcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICBvdXQud29yZHNba10gPSBjYXJyeSB8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5sZW5ndGgtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0LnN0cmlwKCk7XG4gIH1cblxuICAvLyBUT0RPKGluZHV0bnkpOiBpdCBtYXkgYmUgcmVhc29uYWJsZSB0byBvbWl0IGl0IGZvciB1c2VycyB3aG8gZG9uJ3QgbmVlZFxuICAvLyB0byB3b3JrIHdpdGggMjU2LWJpdCBudW1iZXJzLCBvdGhlcndpc2UgaXQgZ2l2ZXMgMjAlIGltcHJvdmVtZW50IGZvciAyNTYtYml0XG4gIC8vIG11bHRpcGxpY2F0aW9uIChsaWtlIGVsbGlwdGljIHNlY3AyNTZrMSkuXG4gIHZhciBjb21iMTBNdWxUbyA9IGZ1bmN0aW9uIGNvbWIxME11bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIHZhciBhID0gc2VsZi53b3JkcztcbiAgICB2YXIgYiA9IG51bS53b3JkcztcbiAgICB2YXIgbyA9IG91dC53b3JkcztcbiAgICB2YXIgYyA9IDA7XG4gICAgdmFyIGxvO1xuICAgIHZhciBtaWQ7XG4gICAgdmFyIGhpO1xuICAgIHZhciBhMCA9IGFbMF0gfCAwO1xuICAgIHZhciBhbDAgPSBhMCAmIDB4MWZmZjtcbiAgICB2YXIgYWgwID0gYTAgPj4+IDEzO1xuICAgIHZhciBhMSA9IGFbMV0gfCAwO1xuICAgIHZhciBhbDEgPSBhMSAmIDB4MWZmZjtcbiAgICB2YXIgYWgxID0gYTEgPj4+IDEzO1xuICAgIHZhciBhMiA9IGFbMl0gfCAwO1xuICAgIHZhciBhbDIgPSBhMiAmIDB4MWZmZjtcbiAgICB2YXIgYWgyID0gYTIgPj4+IDEzO1xuICAgIHZhciBhMyA9IGFbM10gfCAwO1xuICAgIHZhciBhbDMgPSBhMyAmIDB4MWZmZjtcbiAgICB2YXIgYWgzID0gYTMgPj4+IDEzO1xuICAgIHZhciBhNCA9IGFbNF0gfCAwO1xuICAgIHZhciBhbDQgPSBhNCAmIDB4MWZmZjtcbiAgICB2YXIgYWg0ID0gYTQgPj4+IDEzO1xuICAgIHZhciBhNSA9IGFbNV0gfCAwO1xuICAgIHZhciBhbDUgPSBhNSAmIDB4MWZmZjtcbiAgICB2YXIgYWg1ID0gYTUgPj4+IDEzO1xuICAgIHZhciBhNiA9IGFbNl0gfCAwO1xuICAgIHZhciBhbDYgPSBhNiAmIDB4MWZmZjtcbiAgICB2YXIgYWg2ID0gYTYgPj4+IDEzO1xuICAgIHZhciBhNyA9IGFbN10gfCAwO1xuICAgIHZhciBhbDcgPSBhNyAmIDB4MWZmZjtcbiAgICB2YXIgYWg3ID0gYTcgPj4+IDEzO1xuICAgIHZhciBhOCA9IGFbOF0gfCAwO1xuICAgIHZhciBhbDggPSBhOCAmIDB4MWZmZjtcbiAgICB2YXIgYWg4ID0gYTggPj4+IDEzO1xuICAgIHZhciBhOSA9IGFbOV0gfCAwO1xuICAgIHZhciBhbDkgPSBhOSAmIDB4MWZmZjtcbiAgICB2YXIgYWg5ID0gYTkgPj4+IDEzO1xuICAgIHZhciBiMCA9IGJbMF0gfCAwO1xuICAgIHZhciBibDAgPSBiMCAmIDB4MWZmZjtcbiAgICB2YXIgYmgwID0gYjAgPj4+IDEzO1xuICAgIHZhciBiMSA9IGJbMV0gfCAwO1xuICAgIHZhciBibDEgPSBiMSAmIDB4MWZmZjtcbiAgICB2YXIgYmgxID0gYjEgPj4+IDEzO1xuICAgIHZhciBiMiA9IGJbMl0gfCAwO1xuICAgIHZhciBibDIgPSBiMiAmIDB4MWZmZjtcbiAgICB2YXIgYmgyID0gYjIgPj4+IDEzO1xuICAgIHZhciBiMyA9IGJbM10gfCAwO1xuICAgIHZhciBibDMgPSBiMyAmIDB4MWZmZjtcbiAgICB2YXIgYmgzID0gYjMgPj4+IDEzO1xuICAgIHZhciBiNCA9IGJbNF0gfCAwO1xuICAgIHZhciBibDQgPSBiNCAmIDB4MWZmZjtcbiAgICB2YXIgYmg0ID0gYjQgPj4+IDEzO1xuICAgIHZhciBiNSA9IGJbNV0gfCAwO1xuICAgIHZhciBibDUgPSBiNSAmIDB4MWZmZjtcbiAgICB2YXIgYmg1ID0gYjUgPj4+IDEzO1xuICAgIHZhciBiNiA9IGJbNl0gfCAwO1xuICAgIHZhciBibDYgPSBiNiAmIDB4MWZmZjtcbiAgICB2YXIgYmg2ID0gYjYgPj4+IDEzO1xuICAgIHZhciBiNyA9IGJbN10gfCAwO1xuICAgIHZhciBibDcgPSBiNyAmIDB4MWZmZjtcbiAgICB2YXIgYmg3ID0gYjcgPj4+IDEzO1xuICAgIHZhciBiOCA9IGJbOF0gfCAwO1xuICAgIHZhciBibDggPSBiOCAmIDB4MWZmZjtcbiAgICB2YXIgYmg4ID0gYjggPj4+IDEzO1xuICAgIHZhciBiOSA9IGJbOV0gfCAwO1xuICAgIHZhciBibDkgPSBiOSAmIDB4MWZmZjtcbiAgICB2YXIgYmg5ID0gYjkgPj4+IDEzO1xuXG4gICAgb3V0Lm5lZ2F0aXZlID0gc2VsZi5uZWdhdGl2ZSBeIG51bS5uZWdhdGl2ZTtcbiAgICBvdXQubGVuZ3RoID0gMTk7XG4gICAgLyogayA9IDAgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDAsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMCwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMCwgYmgwKTtcbiAgICB2YXIgdzAgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcwID4+PiAyNikpIHwgMDtcbiAgICB3MCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDEsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMSwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMSwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDEpKSB8IDA7XG4gICAgdmFyIHcxID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MSA+Pj4gMjYpKSB8IDA7XG4gICAgdzEgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAyICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwyLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDIsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDIsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoMikpIHwgMDtcbiAgICB2YXIgdzIgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcyID4+PiAyNikpIHwgMDtcbiAgICB3MiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDMgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDMsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMywgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMywgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoMykpIHwgMDtcbiAgICB2YXIgdzMgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHczID4+PiAyNikpIHwgMDtcbiAgICB3MyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDQgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDQsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNCwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNCwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDQpKSB8IDA7XG4gICAgdmFyIHc0ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3NCA+Pj4gMjYpKSB8IDA7XG4gICAgdzQgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA1ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw1LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDUsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDUsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNSkpIHwgMDtcbiAgICB2YXIgdzUgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc1ID4+PiAyNikpIHwgMDtcbiAgICB3NSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDYgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDYsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNiwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNiwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNikpIHwgMDtcbiAgICB2YXIgdzYgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc2ID4+PiAyNikpIHwgMDtcbiAgICB3NiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDcgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDcsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNywgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNywgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDcpKSB8IDA7XG4gICAgdmFyIHc3ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3NyA+Pj4gMjYpKSB8IDA7XG4gICAgdzcgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA4ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw4LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDgsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDgsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoOCkpIHwgMDtcbiAgICB2YXIgdzggPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc4ID4+PiAyNikpIHwgMDtcbiAgICB3OCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDkgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzkgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc5ID4+PiAyNikpIHwgMDtcbiAgICB3OSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEwICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDEpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMSk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsMSkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMSk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzEwID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTAgPj4+IDI2KSkgfCAwO1xuICAgIHcxMCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDExICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDIpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMik7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsMikpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMik7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTEgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMSA+Pj4gMjYpKSB8IDA7XG4gICAgdzExICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTIgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMyk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgzKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwzKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgzKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzEyID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTIgPj4+IDI2KSkgfCAwO1xuICAgIHcxMiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEzICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDQpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsNCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoNCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzEzID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTMgPj4+IDI2KSkgfCAwO1xuICAgIHcxMyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE0ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDUpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNSk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsNSkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoNSk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTQgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNCA+Pj4gMjYpKSB8IDA7XG4gICAgdzE0ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTUgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNik7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg2KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw2KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg2KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzE1ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTUgPj4+IDI2KSkgfCAwO1xuICAgIHcxNSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE2ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDcpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNyk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsNykpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoNyk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzE2ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTYgPj4+IDI2KSkgfCAwO1xuICAgIHcxNiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE3ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDgpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoOCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsOCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoOCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTcgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNyA+Pj4gMjYpKSB8IDA7XG4gICAgdzE3ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTggKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsOSk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg5KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw5KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg5KTtcbiAgICB2YXIgdzE4ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTggPj4+IDI2KSkgfCAwO1xuICAgIHcxOCAmPSAweDNmZmZmZmY7XG4gICAgb1swXSA9IHcwO1xuICAgIG9bMV0gPSB3MTtcbiAgICBvWzJdID0gdzI7XG4gICAgb1szXSA9IHczO1xuICAgIG9bNF0gPSB3NDtcbiAgICBvWzVdID0gdzU7XG4gICAgb1s2XSA9IHc2O1xuICAgIG9bN10gPSB3NztcbiAgICBvWzhdID0gdzg7XG4gICAgb1s5XSA9IHc5O1xuICAgIG9bMTBdID0gdzEwO1xuICAgIG9bMTFdID0gdzExO1xuICAgIG9bMTJdID0gdzEyO1xuICAgIG9bMTNdID0gdzEzO1xuICAgIG9bMTRdID0gdzE0O1xuICAgIG9bMTVdID0gdzE1O1xuICAgIG9bMTZdID0gdzE2O1xuICAgIG9bMTddID0gdzE3O1xuICAgIG9bMThdID0gdzE4O1xuICAgIGlmIChjICE9PSAwKSB7XG4gICAgICBvWzE5XSA9IGM7XG4gICAgICBvdXQubGVuZ3RoKys7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH07XG5cbiAgLy8gUG9seWZpbGwgY29tYlxuICBpZiAoIU1hdGguaW11bCkge1xuICAgIGNvbWIxME11bFRvID0gc21hbGxNdWxUbztcbiAgfVxuXG4gIGZ1bmN0aW9uIGJpZ011bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIG91dC5uZWdhdGl2ZSA9IG51bS5uZWdhdGl2ZSBeIHNlbGYubmVnYXRpdmU7XG4gICAgb3V0Lmxlbmd0aCA9IHNlbGYubGVuZ3RoICsgbnVtLmxlbmd0aDtcblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgdmFyIGhuY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgb3V0Lmxlbmd0aCAtIDE7IGsrKykge1xuICAgICAgLy8gU3VtIGFsbCB3b3JkcyB3aXRoIHRoZSBzYW1lIGBpICsgaiA9IGtgIGFuZCBhY2N1bXVsYXRlIGBuY2FycnlgLFxuICAgICAgLy8gbm90ZSB0aGF0IG5jYXJyeSBjb3VsZCBiZSA+PSAweDNmZmZmZmZcbiAgICAgIHZhciBuY2FycnkgPSBobmNhcnJ5O1xuICAgICAgaG5jYXJyeSA9IDA7XG4gICAgICB2YXIgcndvcmQgPSBjYXJyeSAmIDB4M2ZmZmZmZjtcbiAgICAgIHZhciBtYXhKID0gTWF0aC5taW4oaywgbnVtLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaiA9IE1hdGgubWF4KDAsIGsgLSBzZWxmLmxlbmd0aCArIDEpOyBqIDw9IG1heEo7IGorKykge1xuICAgICAgICB2YXIgaSA9IGsgLSBqO1xuICAgICAgICB2YXIgYSA9IHNlbGYud29yZHNbaV0gfCAwO1xuICAgICAgICB2YXIgYiA9IG51bS53b3Jkc1tqXSB8IDA7XG4gICAgICAgIHZhciByID0gYSAqIGI7XG5cbiAgICAgICAgdmFyIGxvID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgICAgbmNhcnJ5ID0gKG5jYXJyeSArICgociAvIDB4NDAwMDAwMCkgfCAwKSkgfCAwO1xuICAgICAgICBsbyA9IChsbyArIHJ3b3JkKSB8IDA7XG4gICAgICAgIHJ3b3JkID0gbG8gJiAweDNmZmZmZmY7XG4gICAgICAgIG5jYXJyeSA9IChuY2FycnkgKyAobG8gPj4+IDI2KSkgfCAwO1xuXG4gICAgICAgIGhuY2FycnkgKz0gbmNhcnJ5ID4+PiAyNjtcbiAgICAgICAgbmNhcnJ5ICY9IDB4M2ZmZmZmZjtcbiAgICAgIH1cbiAgICAgIG91dC53b3Jkc1trXSA9IHJ3b3JkO1xuICAgICAgY2FycnkgPSBuY2Fycnk7XG4gICAgICBuY2FycnkgPSBobmNhcnJ5O1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIG91dC53b3Jkc1trXSA9IGNhcnJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubGVuZ3RoLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dC5zdHJpcCgpO1xuICB9XG5cbiAgZnVuY3Rpb24ganVtYm9NdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICB2YXIgZmZ0bSA9IG5ldyBGRlRNKCk7XG4gICAgcmV0dXJuIGZmdG0ubXVscChzZWxmLCBudW0sIG91dCk7XG4gIH1cblxuICBCTi5wcm90b3R5cGUubXVsVG8gPSBmdW5jdGlvbiBtdWxUbyAobnVtLCBvdXQpIHtcbiAgICB2YXIgcmVzO1xuICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aCArIG51bS5sZW5ndGg7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxMCAmJiBudW0ubGVuZ3RoID09PSAxMCkge1xuICAgICAgcmVzID0gY29tYjEwTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH0gZWxzZSBpZiAobGVuIDwgNjMpIHtcbiAgICAgIHJlcyA9IHNtYWxsTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH0gZWxzZSBpZiAobGVuIDwgMTAyNCkge1xuICAgICAgcmVzID0gYmlnTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSBqdW1ib011bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIENvb2xleS1UdWtleSBhbGdvcml0aG0gZm9yIEZGVFxuICAvLyBzbGlnaHRseSByZXZpc2l0ZWQgdG8gcmVseSBvbiBsb29waW5nIGluc3RlYWQgb2YgcmVjdXJzaW9uXG5cbiAgZnVuY3Rpb24gRkZUTSAoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgfVxuXG4gIEZGVE0ucHJvdG90eXBlLm1ha2VSQlQgPSBmdW5jdGlvbiBtYWtlUkJUIChOKSB7XG4gICAgdmFyIHQgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIGwgPSBCTi5wcm90b3R5cGUuX2NvdW50Qml0cyhOKSAtIDE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHRbaV0gPSB0aGlzLnJldkJpbihpLCBsLCBOKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGJpbmFyeS1yZXZlcnNlZCByZXByZXNlbnRhdGlvbiBvZiBgeGBcbiAgRkZUTS5wcm90b3R5cGUucmV2QmluID0gZnVuY3Rpb24gcmV2QmluICh4LCBsLCBOKSB7XG4gICAgaWYgKHggPT09IDAgfHwgeCA9PT0gTiAtIDEpIHJldHVybiB4O1xuXG4gICAgdmFyIHJiID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgcmIgfD0gKHggJiAxKSA8PCAobCAtIGkgLSAxKTtcbiAgICAgIHggPj49IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJiO1xuICB9O1xuXG4gIC8vIFBlcmZvcm1zIFwidHdlZWRsaW5nXCIgcGhhc2UsIHRoZXJlZm9yZSAnZW11bGF0aW5nJ1xuICAvLyBiZWhhdmlvdXIgb2YgdGhlIHJlY3Vyc2l2ZSBhbGdvcml0aG1cbiAgRkZUTS5wcm90b3R5cGUucGVybXV0ZSA9IGZ1bmN0aW9uIHBlcm11dGUgKHJidCwgcndzLCBpd3MsIHJ0d3MsIGl0d3MsIE4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgcnR3c1tpXSA9IHJ3c1tyYnRbaV1dO1xuICAgICAgaXR3c1tpXSA9IGl3c1tyYnRbaV1dO1xuICAgIH1cbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiB0cmFuc2Zvcm0gKHJ3cywgaXdzLCBydHdzLCBpdHdzLCBOLCByYnQpIHtcbiAgICB0aGlzLnBlcm11dGUocmJ0LCByd3MsIGl3cywgcnR3cywgaXR3cywgTik7XG5cbiAgICBmb3IgKHZhciBzID0gMTsgcyA8IE47IHMgPDw9IDEpIHtcbiAgICAgIHZhciBsID0gcyA8PCAxO1xuXG4gICAgICB2YXIgcnR3ZGYgPSBNYXRoLmNvcygyICogTWF0aC5QSSAvIGwpO1xuICAgICAgdmFyIGl0d2RmID0gTWF0aC5zaW4oMiAqIE1hdGguUEkgLyBsKTtcblxuICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBOOyBwICs9IGwpIHtcbiAgICAgICAgdmFyIHJ0d2RmXyA9IHJ0d2RmO1xuICAgICAgICB2YXIgaXR3ZGZfID0gaXR3ZGY7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzOyBqKyspIHtcbiAgICAgICAgICB2YXIgcmUgPSBydHdzW3AgKyBqXTtcbiAgICAgICAgICB2YXIgaWUgPSBpdHdzW3AgKyBqXTtcblxuICAgICAgICAgIHZhciBybyA9IHJ0d3NbcCArIGogKyBzXTtcbiAgICAgICAgICB2YXIgaW8gPSBpdHdzW3AgKyBqICsgc107XG5cbiAgICAgICAgICB2YXIgcnggPSBydHdkZl8gKiBybyAtIGl0d2RmXyAqIGlvO1xuXG4gICAgICAgICAgaW8gPSBydHdkZl8gKiBpbyArIGl0d2RmXyAqIHJvO1xuICAgICAgICAgIHJvID0gcng7XG5cbiAgICAgICAgICBydHdzW3AgKyBqXSA9IHJlICsgcm87XG4gICAgICAgICAgaXR3c1twICsgal0gPSBpZSArIGlvO1xuXG4gICAgICAgICAgcnR3c1twICsgaiArIHNdID0gcmUgLSBybztcbiAgICAgICAgICBpdHdzW3AgKyBqICsgc10gPSBpZSAtIGlvO1xuXG4gICAgICAgICAgLyoganNoaW50IG1heGRlcHRoIDogZmFsc2UgKi9cbiAgICAgICAgICBpZiAoaiAhPT0gbCkge1xuICAgICAgICAgICAgcnggPSBydHdkZiAqIHJ0d2RmXyAtIGl0d2RmICogaXR3ZGZfO1xuXG4gICAgICAgICAgICBpdHdkZl8gPSBydHdkZiAqIGl0d2RmXyArIGl0d2RmICogcnR3ZGZfO1xuICAgICAgICAgICAgcnR3ZGZfID0gcng7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLmd1ZXNzTGVuMTNiID0gZnVuY3Rpb24gZ3Vlc3NMZW4xM2IgKG4sIG0pIHtcbiAgICB2YXIgTiA9IE1hdGgubWF4KG0sIG4pIHwgMTtcbiAgICB2YXIgb2RkID0gTiAmIDE7XG4gICAgdmFyIGkgPSAwO1xuICAgIGZvciAoTiA9IE4gLyAyIHwgMDsgTjsgTiA9IE4gPj4+IDEpIHtcbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4gMSA8PCBpICsgMSArIG9kZDtcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5jb25qdWdhdGUgPSBmdW5jdGlvbiBjb25qdWdhdGUgKHJ3cywgaXdzLCBOKSB7XG4gICAgaWYgKE4gPD0gMSkgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOIC8gMjsgaSsrKSB7XG4gICAgICB2YXIgdCA9IHJ3c1tpXTtcblxuICAgICAgcndzW2ldID0gcndzW04gLSBpIC0gMV07XG4gICAgICByd3NbTiAtIGkgLSAxXSA9IHQ7XG5cbiAgICAgIHQgPSBpd3NbaV07XG5cbiAgICAgIGl3c1tpXSA9IC1pd3NbTiAtIGkgLSAxXTtcbiAgICAgIGl3c1tOIC0gaSAtIDFdID0gLXQ7XG4gICAgfVxuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLm5vcm1hbGl6ZTEzYiA9IGZ1bmN0aW9uIG5vcm1hbGl6ZTEzYiAod3MsIE4pIHtcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTiAvIDI7IGkrKykge1xuICAgICAgdmFyIHcgPSBNYXRoLnJvdW5kKHdzWzIgKiBpICsgMV0gLyBOKSAqIDB4MjAwMCArXG4gICAgICAgIE1hdGgucm91bmQod3NbMiAqIGldIC8gTikgK1xuICAgICAgICBjYXJyeTtcblxuICAgICAgd3NbaV0gPSB3ICYgMHgzZmZmZmZmO1xuXG4gICAgICBpZiAodyA8IDB4NDAwMDAwMCkge1xuICAgICAgICBjYXJyeSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYXJyeSA9IHcgLyAweDQwMDAwMDAgfCAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB3cztcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5jb252ZXJ0MTNiID0gZnVuY3Rpb24gY29udmVydDEzYiAod3MsIGxlbiwgcndzLCBOKSB7XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjYXJyeSA9IGNhcnJ5ICsgKHdzW2ldIHwgMCk7XG5cbiAgICAgIHJ3c1syICogaV0gPSBjYXJyeSAmIDB4MWZmZjsgY2FycnkgPSBjYXJyeSA+Pj4gMTM7XG4gICAgICByd3NbMiAqIGkgKyAxXSA9IGNhcnJ5ICYgMHgxZmZmOyBjYXJyeSA9IGNhcnJ5ID4+PiAxMztcbiAgICB9XG5cbiAgICAvLyBQYWQgd2l0aCB6ZXJvZXNcbiAgICBmb3IgKGkgPSAyICogbGVuOyBpIDwgTjsgKytpKSB7XG4gICAgICByd3NbaV0gPSAwO1xuICAgIH1cblxuICAgIGFzc2VydChjYXJyeSA9PT0gMCk7XG4gICAgYXNzZXJ0KChjYXJyeSAmIH4weDFmZmYpID09PSAwKTtcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5zdHViID0gZnVuY3Rpb24gc3R1YiAoTikge1xuICAgIHZhciBwaCA9IG5ldyBBcnJheShOKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgcGhbaV0gPSAwO1xuICAgIH1cblxuICAgIHJldHVybiBwaDtcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5tdWxwID0gZnVuY3Rpb24gbXVscCAoeCwgeSwgb3V0KSB7XG4gICAgdmFyIE4gPSAyICogdGhpcy5ndWVzc0xlbjEzYih4Lmxlbmd0aCwgeS5sZW5ndGgpO1xuXG4gICAgdmFyIHJidCA9IHRoaXMubWFrZVJCVChOKTtcblxuICAgIHZhciBfID0gdGhpcy5zdHViKE4pO1xuXG4gICAgdmFyIHJ3cyA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgcndzdCA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgaXdzdCA9IG5ldyBBcnJheShOKTtcblxuICAgIHZhciBucndzID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBucndzdCA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgbml3c3QgPSBuZXcgQXJyYXkoTik7XG5cbiAgICB2YXIgcm13cyA9IG91dC53b3JkcztcbiAgICBybXdzLmxlbmd0aCA9IE47XG5cbiAgICB0aGlzLmNvbnZlcnQxM2IoeC53b3JkcywgeC5sZW5ndGgsIHJ3cywgTik7XG4gICAgdGhpcy5jb252ZXJ0MTNiKHkud29yZHMsIHkubGVuZ3RoLCBucndzLCBOKTtcblxuICAgIHRoaXMudHJhbnNmb3JtKHJ3cywgXywgcndzdCwgaXdzdCwgTiwgcmJ0KTtcbiAgICB0aGlzLnRyYW5zZm9ybShucndzLCBfLCBucndzdCwgbml3c3QsIE4sIHJidCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgdmFyIHJ4ID0gcndzdFtpXSAqIG5yd3N0W2ldIC0gaXdzdFtpXSAqIG5pd3N0W2ldO1xuICAgICAgaXdzdFtpXSA9IHJ3c3RbaV0gKiBuaXdzdFtpXSArIGl3c3RbaV0gKiBucndzdFtpXTtcbiAgICAgIHJ3c3RbaV0gPSByeDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmp1Z2F0ZShyd3N0LCBpd3N0LCBOKTtcbiAgICB0aGlzLnRyYW5zZm9ybShyd3N0LCBpd3N0LCBybXdzLCBfLCBOLCByYnQpO1xuICAgIHRoaXMuY29uanVnYXRlKHJtd3MsIF8sIE4pO1xuICAgIHRoaXMubm9ybWFsaXplMTNiKHJtd3MsIE4pO1xuXG4gICAgb3V0Lm5lZ2F0aXZlID0geC5uZWdhdGl2ZSBeIHkubmVnYXRpdmU7XG4gICAgb3V0Lmxlbmd0aCA9IHgubGVuZ3RoICsgeS5sZW5ndGg7XG4gICAgcmV0dXJuIG91dC5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIE11bHRpcGx5IGB0aGlzYCBieSBgbnVtYFxuICBCTi5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsIChudW0pIHtcbiAgICB2YXIgb3V0ID0gbmV3IEJOKG51bGwpO1xuICAgIG91dC53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCArIG51bS5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzLm11bFRvKG51bSwgb3V0KTtcbiAgfTtcblxuICAvLyBNdWx0aXBseSBlbXBsb3lpbmcgRkZUXG4gIEJOLnByb3RvdHlwZS5tdWxmID0gZnVuY3Rpb24gbXVsZiAobnVtKSB7XG4gICAgdmFyIG91dCA9IG5ldyBCTihudWxsKTtcbiAgICBvdXQud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoKTtcbiAgICByZXR1cm4ganVtYm9NdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gIH07XG5cbiAgLy8gSW4tcGxhY2UgTXVsdGlwbGljYXRpb25cbiAgQk4ucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbiBpbXVsIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLm11bFRvKG51bSwgdGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmltdWxuID0gZnVuY3Rpb24gaW11bG4gKG51bSkge1xuICAgIGFzc2VydCh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyk7XG4gICAgYXNzZXJ0KG51bSA8IDB4NDAwMDAwMCk7XG5cbiAgICAvLyBDYXJyeVxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdyA9ICh0aGlzLndvcmRzW2ldIHwgMCkgKiBudW07XG4gICAgICB2YXIgbG8gPSAodyAmIDB4M2ZmZmZmZikgKyAoY2FycnkgJiAweDNmZmZmZmYpO1xuICAgICAgY2FycnkgPj49IDI2O1xuICAgICAgY2FycnkgKz0gKHcgLyAweDQwMDAwMDApIHwgMDtcbiAgICAgIC8vIE5PVEU6IGxvIGlzIDI3Yml0IG1heGltdW1cbiAgICAgIGNhcnJ5ICs9IGxvID4+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBsbyAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBjYXJyeTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLm11bG4gPSBmdW5jdGlvbiBtdWxuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmltdWxuKG51bSk7XG4gIH07XG5cbiAgLy8gYHRoaXNgICogYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zcXIgPSBmdW5jdGlvbiBzcXIgKCkge1xuICAgIHJldHVybiB0aGlzLm11bCh0aGlzKTtcbiAgfTtcblxuICAvLyBgdGhpc2AgKiBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbiBpc3FyICgpIHtcbiAgICByZXR1cm4gdGhpcy5pbXVsKHRoaXMuY2xvbmUoKSk7XG4gIH07XG5cbiAgLy8gTWF0aC5wb3coYHRoaXNgLCBgbnVtYClcbiAgQk4ucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uIHBvdyAobnVtKSB7XG4gICAgdmFyIHcgPSB0b0JpdEFycmF5KG51bSk7XG4gICAgaWYgKHcubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IEJOKDEpO1xuXG4gICAgLy8gU2tpcCBsZWFkaW5nIHplcm9lc1xuICAgIHZhciByZXMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdy5sZW5ndGg7IGkrKywgcmVzID0gcmVzLnNxcigpKSB7XG4gICAgICBpZiAod1tpXSAhPT0gMCkgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKCsraSA8IHcubGVuZ3RoKSB7XG4gICAgICBmb3IgKHZhciBxID0gcmVzLnNxcigpOyBpIDwgdy5sZW5ndGg7IGkrKywgcSA9IHEuc3FyKCkpIHtcbiAgICAgICAgaWYgKHdbaV0gPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIHJlcyA9IHJlcy5tdWwocSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBTaGlmdC1sZWZ0IGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdXNobG4gPSBmdW5jdGlvbiBpdXNobG4gKGJpdHMpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXRzICUgMjY7XG4gICAgdmFyIHMgPSAoYml0cyAtIHIpIC8gMjY7XG4gICAgdmFyIGNhcnJ5TWFzayA9ICgweDNmZmZmZmYgPj4+ICgyNiAtIHIpKSA8PCAoMjYgLSByKTtcbiAgICB2YXIgaTtcblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICB2YXIgY2FycnkgPSAwO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmV3Q2FycnkgPSB0aGlzLndvcmRzW2ldICYgY2FycnlNYXNrO1xuICAgICAgICB2YXIgYyA9ICgodGhpcy53b3Jkc1tpXSB8IDApIC0gbmV3Q2FycnkpIDw8IHI7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBjIHwgY2Fycnk7XG4gICAgICAgIGNhcnJ5ID0gbmV3Q2FycnkgPj4+ICgyNiAtIHIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FycnkpIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgICB0aGlzLmxlbmd0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzICE9PSAwKSB7XG4gICAgICBmb3IgKGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIHNdID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMDsgaSA8IHM7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sZW5ndGggKz0gcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc2hsbiA9IGZ1bmN0aW9uIGlzaGxuIChiaXRzKSB7XG4gICAgLy8gVE9ETyhpbmR1dG55KTogaW1wbGVtZW50IG1lXG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1c2hsbihiaXRzKTtcbiAgfTtcblxuICAvLyBTaGlmdC1yaWdodCBpbi1wbGFjZVxuICAvLyBOT1RFOiBgaGludGAgaXMgYSBsb3dlc3QgYml0IGJlZm9yZSB0cmFpbGluZyB6ZXJvZXNcbiAgLy8gTk9URTogaWYgYGV4dGVuZGVkYCBpcyBwcmVzZW50IC0gaXQgd2lsbCBiZSBmaWxsZWQgd2l0aCBkZXN0cm95ZWQgYml0c1xuICBCTi5wcm90b3R5cGUuaXVzaHJuID0gZnVuY3Rpb24gaXVzaHJuIChiaXRzLCBoaW50LCBleHRlbmRlZCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0cyA9PT0gJ251bWJlcicgJiYgYml0cyA+PSAwKTtcbiAgICB2YXIgaDtcbiAgICBpZiAoaGludCkge1xuICAgICAgaCA9IChoaW50IC0gKGhpbnQgJSAyNikpIC8gMjY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGggPSAwO1xuICAgIH1cblxuICAgIHZhciByID0gYml0cyAlIDI2O1xuICAgIHZhciBzID0gTWF0aC5taW4oKGJpdHMgLSByKSAvIDI2LCB0aGlzLmxlbmd0aCk7XG4gICAgdmFyIG1hc2sgPSAweDNmZmZmZmYgXiAoKDB4M2ZmZmZmZiA+Pj4gcikgPDwgcik7XG4gICAgdmFyIG1hc2tlZFdvcmRzID0gZXh0ZW5kZWQ7XG5cbiAgICBoIC09IHM7XG4gICAgaCA9IE1hdGgubWF4KDAsIGgpO1xuXG4gICAgLy8gRXh0ZW5kZWQgbW9kZSwgY29weSBtYXNrZWQgcGFydFxuICAgIGlmIChtYXNrZWRXb3Jkcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgICAgbWFza2VkV29yZHMud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldO1xuICAgICAgfVxuICAgICAgbWFza2VkV29yZHMubGVuZ3RoID0gcztcbiAgICB9XG5cbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgLy8gTm8tb3AsIHdlIHNob3VsZCBub3QgbW92ZSBhbnl0aGluZyBhdCBhbGxcbiAgICB9IGVsc2UgaWYgKHRoaXMubGVuZ3RoID4gcykge1xuICAgICAgdGhpcy5sZW5ndGggLT0gcztcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSB0aGlzLndvcmRzW2kgKyBzXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfVxuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiAoY2FycnkgIT09IDAgfHwgaSA+PSBoKTsgaS0tKSB7XG4gICAgICB2YXIgd29yZCA9IHRoaXMud29yZHNbaV0gfCAwO1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IChjYXJyeSA8PCAoMjYgLSByKSkgfCAod29yZCA+Pj4gcik7XG4gICAgICBjYXJyeSA9IHdvcmQgJiBtYXNrO1xuICAgIH1cblxuICAgIC8vIFB1c2ggY2FycmllZCBiaXRzIGFzIGEgbWFza1xuICAgIGlmIChtYXNrZWRXb3JkcyAmJiBjYXJyeSAhPT0gMCkge1xuICAgICAgbWFza2VkV29yZHMud29yZHNbbWFza2VkV29yZHMubGVuZ3RoKytdID0gY2Fycnk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLndvcmRzWzBdID0gMDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc2hybiA9IGZ1bmN0aW9uIGlzaHJuIChiaXRzLCBoaW50LCBleHRlbmRlZCkge1xuICAgIC8vIFRPRE8oaW5kdXRueSk6IGltcGxlbWVudCBtZVxuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdXNocm4oYml0cywgaGludCwgZXh0ZW5kZWQpO1xuICB9O1xuXG4gIC8vIFNoaWZ0LWxlZnRcbiAgQk4ucHJvdG90eXBlLnNobG4gPSBmdW5jdGlvbiBzaGxuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hsbihiaXRzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudXNobG4gPSBmdW5jdGlvbiB1c2hsbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaGxuKGJpdHMpO1xuICB9O1xuXG4gIC8vIFNoaWZ0LXJpZ2h0XG4gIEJOLnByb3RvdHlwZS5zaHJuID0gZnVuY3Rpb24gc2hybiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXNocm4oYml0cyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVzaHJuID0gZnVuY3Rpb24gdXNocm4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hybihiaXRzKTtcbiAgfTtcblxuICAvLyBUZXN0IGlmIG4gYml0IGlzIHNldFxuICBCTi5wcm90b3R5cGUudGVzdG4gPSBmdW5jdGlvbiB0ZXN0biAoYml0KSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXQgPT09ICdudW1iZXInICYmIGJpdCA+PSAwKTtcbiAgICB2YXIgciA9IGJpdCAlIDI2O1xuICAgIHZhciBzID0gKGJpdCAtIHIpIC8gMjY7XG4gICAgdmFyIHEgPSAxIDw8IHI7XG5cbiAgICAvLyBGYXN0IGNhc2U6IGJpdCBpcyBtdWNoIGhpZ2hlciB0aGFuIGFsbCBleGlzdGluZyB3b3Jkc1xuICAgIGlmICh0aGlzLmxlbmd0aCA8PSBzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBiaXQgYW5kIHJldHVyblxuICAgIHZhciB3ID0gdGhpcy53b3Jkc1tzXTtcblxuICAgIHJldHVybiAhISh3ICYgcSk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG9ubHkgbG93ZXJzIGJpdHMgb2YgbnVtYmVyIChpbi1wbGFjZSlcbiAgQk4ucHJvdG90eXBlLmltYXNrbiA9IGZ1bmN0aW9uIGltYXNrbiAoYml0cykge1xuICAgIGFzc2VydCh0eXBlb2YgYml0cyA9PT0gJ251bWJlcicgJiYgYml0cyA+PSAwKTtcbiAgICB2YXIgciA9IGJpdHMgJSAyNjtcbiAgICB2YXIgcyA9IChiaXRzIC0gcikgLyAyNjtcblxuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwLCAnaW1hc2tuIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZSBudW1iZXJzJyk7XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPD0gcykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHIgIT09IDApIHtcbiAgICAgIHMrKztcbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLm1pbihzLCB0aGlzLmxlbmd0aCk7XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgdmFyIG1hc2sgPSAweDNmZmZmZmYgXiAoKDB4M2ZmZmZmZiA+Pj4gcikgPDwgcik7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0gJj0gbWFzaztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIFJldHVybiBvbmx5IGxvd2VycyBiaXRzIG9mIG51bWJlclxuICBCTi5wcm90b3R5cGUubWFza24gPSBmdW5jdGlvbiBtYXNrbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW1hc2tuKGJpdHMpO1xuICB9O1xuXG4gIC8vIEFkZCBwbGFpbiBudW1iZXIgYG51bWAgdG8gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5pYWRkbiA9IGZ1bmN0aW9uIGlhZGRuIChudW0pIHtcbiAgICBhc3NlcnQodHlwZW9mIG51bSA9PT0gJ251bWJlcicpO1xuICAgIGFzc2VydChudW0gPCAweDQwMDAwMDApO1xuICAgIGlmIChudW0gPCAwKSByZXR1cm4gdGhpcy5pc3VibigtbnVtKTtcblxuICAgIC8vIFBvc3NpYmxlIHNpZ24gY2hhbmdlXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiAodGhpcy53b3Jkc1swXSB8IDApIDwgbnVtKSB7XG4gICAgICAgIHRoaXMud29yZHNbMF0gPSBudW0gLSAodGhpcy53b3Jkc1swXSB8IDApO1xuICAgICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5pc3VibihudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aG91dCBjaGVja3NcbiAgICByZXR1cm4gdGhpcy5faWFkZG4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2lhZGRuID0gZnVuY3Rpb24gX2lhZGRuIChudW0pIHtcbiAgICB0aGlzLndvcmRzWzBdICs9IG51bTtcblxuICAgIC8vIENhcnJ5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLndvcmRzW2ldID49IDB4NDAwMDAwMDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldIC09IDB4NDAwMDAwMDtcbiAgICAgIGlmIChpID09PSB0aGlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgMV0gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgMV0rKztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgaSArIDEpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gU3VidHJhY3QgcGxhaW4gbnVtYmVyIGBudW1gIGZyb20gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5pc3VibiA9IGZ1bmN0aW9uIGlzdWJuIChudW0pIHtcbiAgICBhc3NlcnQodHlwZW9mIG51bSA9PT0gJ251bWJlcicpO1xuICAgIGFzc2VydChudW0gPCAweDQwMDAwMDApO1xuICAgIGlmIChudW0gPCAwKSByZXR1cm4gdGhpcy5pYWRkbigtbnVtKTtcblxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMuaWFkZG4obnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy53b3Jkc1swXSAtPSBudW07XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA8IDApIHtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAtdGhpcy53b3Jkc1swXTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDYXJyeVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLndvcmRzW2ldIDwgMDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gKz0gMHg0MDAwMDAwO1xuICAgICAgICB0aGlzLndvcmRzW2kgKyAxXSAtPSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmFkZG4gPSBmdW5jdGlvbiBhZGRuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlhZGRuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnN1Ym4gPSBmdW5jdGlvbiBzdWJuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWJuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlhYnMgPSBmdW5jdGlvbiBpYWJzICgpIHtcbiAgICB0aGlzLm5lZ2F0aXZlID0gMDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5hYnMgPSBmdW5jdGlvbiBhYnMgKCkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFicygpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faXNobG5zdWJtdWwgPSBmdW5jdGlvbiBfaXNobG5zdWJtdWwgKG51bSwgbXVsLCBzaGlmdCkge1xuICAgIHZhciBsZW4gPSBudW0ubGVuZ3RoICsgc2hpZnQ7XG4gICAgdmFyIGk7XG5cbiAgICB0aGlzLl9leHBhbmQobGVuKTtcblxuICAgIHZhciB3O1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdyA9ICh0aGlzLndvcmRzW2kgKyBzaGlmdF0gfCAwKSArIGNhcnJ5O1xuICAgICAgdmFyIHJpZ2h0ID0gKG51bS53b3Jkc1tpXSB8IDApICogbXVsO1xuICAgICAgdyAtPSByaWdodCAmIDB4M2ZmZmZmZjtcbiAgICAgIGNhcnJ5ID0gKHcgPj4gMjYpIC0gKChyaWdodCAvIDB4NDAwMDAwMCkgfCAwKTtcbiAgICAgIHRoaXMud29yZHNbaSArIHNoaWZ0XSA9IHcgJiAweDNmZmZmZmY7XG4gICAgfVxuICAgIGZvciAoOyBpIDwgdGhpcy5sZW5ndGggLSBzaGlmdDsgaSsrKSB7XG4gICAgICB3ID0gKHRoaXMud29yZHNbaSArIHNoaWZ0XSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHcgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2kgKyBzaGlmdF0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIGlmIChjYXJyeSA9PT0gMCkgcmV0dXJuIHRoaXMuc3RyaXAoKTtcblxuICAgIC8vIFN1YnRyYWN0aW9uIG92ZXJmbG93XG4gICAgYXNzZXJ0KGNhcnJ5ID09PSAtMSk7XG4gICAgY2FycnkgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3ID0gLSh0aGlzLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICB0aGlzLm5lZ2F0aXZlID0gMTtcblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl93b3JkRGl2ID0gZnVuY3Rpb24gX3dvcmREaXYgKG51bSwgbW9kZSkge1xuICAgIHZhciBzaGlmdCA9IHRoaXMubGVuZ3RoIC0gbnVtLmxlbmd0aDtcblxuICAgIHZhciBhID0gdGhpcy5jbG9uZSgpO1xuICAgIHZhciBiID0gbnVtO1xuXG4gICAgLy8gTm9ybWFsaXplXG4gICAgdmFyIGJoaSA9IGIud29yZHNbYi5sZW5ndGggLSAxXSB8IDA7XG4gICAgdmFyIGJoaUJpdHMgPSB0aGlzLl9jb3VudEJpdHMoYmhpKTtcbiAgICBzaGlmdCA9IDI2IC0gYmhpQml0cztcbiAgICBpZiAoc2hpZnQgIT09IDApIHtcbiAgICAgIGIgPSBiLnVzaGxuKHNoaWZ0KTtcbiAgICAgIGEuaXVzaGxuKHNoaWZ0KTtcbiAgICAgIGJoaSA9IGIud29yZHNbYi5sZW5ndGggLSAxXSB8IDA7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBxdW90aWVudFxuICAgIHZhciBtID0gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAgICB2YXIgcTtcblxuICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgcSA9IG5ldyBCTihudWxsKTtcbiAgICAgIHEubGVuZ3RoID0gbSArIDE7XG4gICAgICBxLndvcmRzID0gbmV3IEFycmF5KHEubGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcS5sZW5ndGg7IGkrKykge1xuICAgICAgICBxLndvcmRzW2ldID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGlmZiA9IGEuY2xvbmUoKS5faXNobG5zdWJtdWwoYiwgMSwgbSk7XG4gICAgaWYgKGRpZmYubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIGEgPSBkaWZmO1xuICAgICAgaWYgKHEpIHtcbiAgICAgICAgcS53b3Jkc1ttXSA9IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IG0gLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgdmFyIHFqID0gKGEud29yZHNbYi5sZW5ndGggKyBqXSB8IDApICogMHg0MDAwMDAwICtcbiAgICAgICAgKGEud29yZHNbYi5sZW5ndGggKyBqIC0gMV0gfCAwKTtcblxuICAgICAgLy8gTk9URTogKHFqIC8gYmhpKSBpcyAoMHgzZmZmZmZmICogMHg0MDAwMDAwICsgMHgzZmZmZmZmKSAvIDB4MjAwMDAwMCBtYXhcbiAgICAgIC8vICgweDdmZmZmZmYpXG4gICAgICBxaiA9IE1hdGgubWluKChxaiAvIGJoaSkgfCAwLCAweDNmZmZmZmYpO1xuXG4gICAgICBhLl9pc2hsbnN1Ym11bChiLCBxaiwgaik7XG4gICAgICB3aGlsZSAoYS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICBxai0tO1xuICAgICAgICBhLm5lZ2F0aXZlID0gMDtcbiAgICAgICAgYS5faXNobG5zdWJtdWwoYiwgMSwgaik7XG4gICAgICAgIGlmICghYS5pc1plcm8oKSkge1xuICAgICAgICAgIGEubmVnYXRpdmUgXj0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHEpIHtcbiAgICAgICAgcS53b3Jkc1tqXSA9IHFqO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocSkge1xuICAgICAgcS5zdHJpcCgpO1xuICAgIH1cbiAgICBhLnN0cmlwKCk7XG5cbiAgICAvLyBEZW5vcm1hbGl6ZVxuICAgIGlmIChtb2RlICE9PSAnZGl2JyAmJiBzaGlmdCAhPT0gMCkge1xuICAgICAgYS5pdXNocm4oc2hpZnQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaXY6IHEgfHwgbnVsbCxcbiAgICAgIG1vZDogYVxuICAgIH07XG4gIH07XG5cbiAgLy8gTk9URTogMSkgYG1vZGVgIGNhbiBiZSBzZXQgdG8gYG1vZGAgdG8gcmVxdWVzdCBtb2Qgb25seSxcbiAgLy8gICAgICAgdG8gYGRpdmAgdG8gcmVxdWVzdCBkaXYgb25seSwgb3IgYmUgYWJzZW50IHRvXG4gIC8vICAgICAgIHJlcXVlc3QgYm90aCBkaXYgJiBtb2RcbiAgLy8gICAgICAgMikgYHBvc2l0aXZlYCBpcyB0cnVlIGlmIHVuc2lnbmVkIG1vZCBpcyByZXF1ZXN0ZWRcbiAgQk4ucHJvdG90eXBlLmRpdm1vZCA9IGZ1bmN0aW9uIGRpdm1vZCAobnVtLCBtb2RlLCBwb3NpdGl2ZSkge1xuICAgIGFzc2VydCghbnVtLmlzWmVybygpKTtcblxuICAgIGlmICh0aGlzLmlzWmVybygpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IG5ldyBCTigwKSxcbiAgICAgICAgbW9kOiBuZXcgQk4oMClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRpdiwgbW9kLCByZXM7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICByZXMgPSB0aGlzLm5lZygpLmRpdm1vZChudW0sIG1vZGUpO1xuXG4gICAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgICAgZGl2ID0gcmVzLmRpdi5uZWcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGUgIT09ICdkaXYnKSB7XG4gICAgICAgIG1vZCA9IHJlcy5tb2QubmVnKCk7XG4gICAgICAgIGlmIChwb3NpdGl2ZSAmJiBtb2QubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgICBtb2QuaWFkZChudW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogZGl2LFxuICAgICAgICBtb2Q6IG1vZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMuZGl2bW9kKG51bS5uZWcoKSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgICBkaXYgPSByZXMuZGl2Lm5lZygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IGRpdixcbiAgICAgICAgbW9kOiByZXMubW9kXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICgodGhpcy5uZWdhdGl2ZSAmIG51bS5uZWdhdGl2ZSkgIT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMubmVnKCkuZGl2bW9kKG51bS5uZWcoKSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnZGl2Jykge1xuICAgICAgICBtb2QgPSByZXMubW9kLm5lZygpO1xuICAgICAgICBpZiAocG9zaXRpdmUgJiYgbW9kLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgICAgbW9kLmlzdWIobnVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IHJlcy5kaXYsXG4gICAgICAgIG1vZDogbW9kXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJvdGggbnVtYmVycyBhcmUgcG9zaXRpdmUgYXQgdGhpcyBwb2ludFxuXG4gICAgLy8gU3RyaXAgYm90aCBudW1iZXJzIHRvIGFwcHJveGltYXRlIHNoaWZ0IHZhbHVlXG4gICAgaWYgKG51bS5sZW5ndGggPiB0aGlzLmxlbmd0aCB8fCB0aGlzLmNtcChudW0pIDwgMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBuZXcgQk4oMCksXG4gICAgICAgIG1vZDogdGhpc1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBWZXJ5IHNob3J0IHJlZHVjdGlvblxuICAgIGlmIChudW0ubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAobW9kZSA9PT0gJ2RpdicpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkaXY6IHRoaXMuZGl2bihudW0ud29yZHNbMF0pLFxuICAgICAgICAgIG1vZDogbnVsbFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kZSA9PT0gJ21vZCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkaXY6IG51bGwsXG4gICAgICAgICAgbW9kOiBuZXcgQk4odGhpcy5tb2RuKG51bS53b3Jkc1swXSkpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogdGhpcy5kaXZuKG51bS53b3Jkc1swXSksXG4gICAgICAgIG1vZDogbmV3IEJOKHRoaXMubW9kbihudW0ud29yZHNbMF0pKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fd29yZERpdihudW0sIG1vZGUpO1xuICB9O1xuXG4gIC8vIEZpbmQgYHRoaXNgIC8gYG51bWBcbiAgQk4ucHJvdG90eXBlLmRpdiA9IGZ1bmN0aW9uIGRpdiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2bW9kKG51bSwgJ2RpdicsIGZhbHNlKS5kaXY7XG4gIH07XG5cbiAgLy8gRmluZCBgdGhpc2AgJSBgbnVtYFxuICBCTi5wcm90b3R5cGUubW9kID0gZnVuY3Rpb24gbW9kIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXZtb2QobnVtLCAnbW9kJywgZmFsc2UpLm1vZDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudW1vZCA9IGZ1bmN0aW9uIHVtb2QgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmRpdm1vZChudW0sICdtb2QnLCB0cnVlKS5tb2Q7XG4gIH07XG5cbiAgLy8gRmluZCBSb3VuZChgdGhpc2AgLyBgbnVtYClcbiAgQk4ucHJvdG90eXBlLmRpdlJvdW5kID0gZnVuY3Rpb24gZGl2Um91bmQgKG51bSkge1xuICAgIHZhciBkbSA9IHRoaXMuZGl2bW9kKG51bSk7XG5cbiAgICAvLyBGYXN0IGNhc2UgLSBleGFjdCBkaXZpc2lvblxuICAgIGlmIChkbS5tb2QuaXNaZXJvKCkpIHJldHVybiBkbS5kaXY7XG5cbiAgICB2YXIgbW9kID0gZG0uZGl2Lm5lZ2F0aXZlICE9PSAwID8gZG0ubW9kLmlzdWIobnVtKSA6IGRtLm1vZDtcblxuICAgIHZhciBoYWxmID0gbnVtLnVzaHJuKDEpO1xuICAgIHZhciByMiA9IG51bS5hbmRsbigxKTtcbiAgICB2YXIgY21wID0gbW9kLmNtcChoYWxmKTtcblxuICAgIC8vIFJvdW5kIGRvd25cbiAgICBpZiAoY21wIDwgMCB8fCByMiA9PT0gMSAmJiBjbXAgPT09IDApIHJldHVybiBkbS5kaXY7XG5cbiAgICAvLyBSb3VuZCB1cFxuICAgIHJldHVybiBkbS5kaXYubmVnYXRpdmUgIT09IDAgPyBkbS5kaXYuaXN1Ym4oMSkgOiBkbS5kaXYuaWFkZG4oMSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLm1vZG4gPSBmdW5jdGlvbiBtb2RuIChudW0pIHtcbiAgICBhc3NlcnQobnVtIDw9IDB4M2ZmZmZmZik7XG4gICAgdmFyIHAgPSAoMSA8PCAyNikgJSBudW07XG5cbiAgICB2YXIgYWNjID0gMDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgYWNjID0gKHAgKiBhY2MgKyAodGhpcy53b3Jkc1tpXSB8IDApKSAlIG51bTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9O1xuXG4gIC8vIEluLXBsYWNlIGRpdmlzaW9uIGJ5IG51bWJlclxuICBCTi5wcm90b3R5cGUuaWRpdm4gPSBmdW5jdGlvbiBpZGl2biAobnVtKSB7XG4gICAgYXNzZXJ0KG51bSA8PSAweDNmZmZmZmYpO1xuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIHcgPSAodGhpcy53b3Jkc1tpXSB8IDApICsgY2FycnkgKiAweDQwMDAwMDA7XG4gICAgICB0aGlzLndvcmRzW2ldID0gKHcgLyBudW0pIHwgMDtcbiAgICAgIGNhcnJ5ID0gdyAlIG51bTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5kaXZuID0gZnVuY3Rpb24gZGl2biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pZGl2bihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5lZ2NkID0gZnVuY3Rpb24gZWdjZCAocCkge1xuICAgIGFzc2VydChwLm5lZ2F0aXZlID09PSAwKTtcbiAgICBhc3NlcnQoIXAuaXNaZXJvKCkpO1xuXG4gICAgdmFyIHggPSB0aGlzO1xuICAgIHZhciB5ID0gcC5jbG9uZSgpO1xuXG4gICAgaWYgKHgubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHggPSB4LnVtb2QocCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSB4LmNsb25lKCk7XG4gICAgfVxuXG4gICAgLy8gQSAqIHggKyBCICogeSA9IHhcbiAgICB2YXIgQSA9IG5ldyBCTigxKTtcbiAgICB2YXIgQiA9IG5ldyBCTigwKTtcblxuICAgIC8vIEMgKiB4ICsgRCAqIHkgPSB5XG4gICAgdmFyIEMgPSBuZXcgQk4oMCk7XG4gICAgdmFyIEQgPSBuZXcgQk4oMSk7XG5cbiAgICB2YXIgZyA9IDA7XG5cbiAgICB3aGlsZSAoeC5pc0V2ZW4oKSAmJiB5LmlzRXZlbigpKSB7XG4gICAgICB4Lml1c2hybigxKTtcbiAgICAgIHkuaXVzaHJuKDEpO1xuICAgICAgKytnO1xuICAgIH1cblxuICAgIHZhciB5cCA9IHkuY2xvbmUoKTtcbiAgICB2YXIgeHAgPSB4LmNsb25lKCk7XG5cbiAgICB3aGlsZSAoIXguaXNaZXJvKCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpbSA9IDE7ICh4LndvcmRzWzBdICYgaW0pID09PSAwICYmIGkgPCAyNjsgKytpLCBpbSA8PD0gMSk7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgeC5pdXNocm4oaSk7XG4gICAgICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKEEuaXNPZGQoKSB8fCBCLmlzT2RkKCkpIHtcbiAgICAgICAgICAgIEEuaWFkZCh5cCk7XG4gICAgICAgICAgICBCLmlzdWIoeHApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIEEuaXVzaHJuKDEpO1xuICAgICAgICAgIEIuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGogPSAwLCBqbSA9IDE7ICh5LndvcmRzWzBdICYgam0pID09PSAwICYmIGogPCAyNjsgKytqLCBqbSA8PD0gMSk7XG4gICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgeS5pdXNocm4oaik7XG4gICAgICAgIHdoaWxlIChqLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKEMuaXNPZGQoKSB8fCBELmlzT2RkKCkpIHtcbiAgICAgICAgICAgIEMuaWFkZCh5cCk7XG4gICAgICAgICAgICBELmlzdWIoeHApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIEMuaXVzaHJuKDEpO1xuICAgICAgICAgIEQuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh4LmNtcCh5KSA+PSAwKSB7XG4gICAgICAgIHguaXN1Yih5KTtcbiAgICAgICAgQS5pc3ViKEMpO1xuICAgICAgICBCLmlzdWIoRCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB5LmlzdWIoeCk7XG4gICAgICAgIEMuaXN1YihBKTtcbiAgICAgICAgRC5pc3ViKEIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhOiBDLFxuICAgICAgYjogRCxcbiAgICAgIGdjZDogeS5pdXNobG4oZylcbiAgICB9O1xuICB9O1xuXG4gIC8vIFRoaXMgaXMgcmVkdWNlZCBpbmNhcm5hdGlvbiBvZiB0aGUgYmluYXJ5IEVFQVxuICAvLyBhYm92ZSwgZGVzaWduYXRlZCB0byBpbnZlcnQgbWVtYmVycyBvZiB0aGVcbiAgLy8gX3ByaW1lXyBmaWVsZHMgRihwKSBhdCBhIG1heGltYWwgc3BlZWRcbiAgQk4ucHJvdG90eXBlLl9pbnZtcCA9IGZ1bmN0aW9uIF9pbnZtcCAocCkge1xuICAgIGFzc2VydChwLm5lZ2F0aXZlID09PSAwKTtcbiAgICBhc3NlcnQoIXAuaXNaZXJvKCkpO1xuXG4gICAgdmFyIGEgPSB0aGlzO1xuICAgIHZhciBiID0gcC5jbG9uZSgpO1xuXG4gICAgaWYgKGEubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGEgPSBhLnVtb2QocCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBhLmNsb25lKCk7XG4gICAgfVxuXG4gICAgdmFyIHgxID0gbmV3IEJOKDEpO1xuICAgIHZhciB4MiA9IG5ldyBCTigwKTtcblxuICAgIHZhciBkZWx0YSA9IGIuY2xvbmUoKTtcblxuICAgIHdoaWxlIChhLmNtcG4oMSkgPiAwICYmIGIuY21wbigxKSA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpbSA9IDE7IChhLndvcmRzWzBdICYgaW0pID09PSAwICYmIGkgPCAyNjsgKytpLCBpbSA8PD0gMSk7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgYS5pdXNocm4oaSk7XG4gICAgICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKHgxLmlzT2RkKCkpIHtcbiAgICAgICAgICAgIHgxLmlhZGQoZGVsdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHgxLml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBqID0gMCwgam0gPSAxOyAoYi53b3Jkc1swXSAmIGptKSA9PT0gMCAmJiBqIDwgMjY7ICsraiwgam0gPDw9IDEpO1xuICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgIGIuaXVzaHJuKGopO1xuICAgICAgICB3aGlsZSAoai0tID4gMCkge1xuICAgICAgICAgIGlmICh4Mi5pc09kZCgpKSB7XG4gICAgICAgICAgICB4Mi5pYWRkKGRlbHRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB4Mi5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGEuY21wKGIpID49IDApIHtcbiAgICAgICAgYS5pc3ViKGIpO1xuICAgICAgICB4MS5pc3ViKHgyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGIuaXN1YihhKTtcbiAgICAgICAgeDIuaXN1Yih4MSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlcztcbiAgICBpZiAoYS5jbXBuKDEpID09PSAwKSB7XG4gICAgICByZXMgPSB4MTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0geDI7XG4gICAgfVxuXG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQocCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ2NkID0gZnVuY3Rpb24gZ2NkIChudW0pIHtcbiAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIG51bS5hYnMoKTtcbiAgICBpZiAobnVtLmlzWmVybygpKSByZXR1cm4gdGhpcy5hYnMoKTtcblxuICAgIHZhciBhID0gdGhpcy5jbG9uZSgpO1xuICAgIHZhciBiID0gbnVtLmNsb25lKCk7XG4gICAgYS5uZWdhdGl2ZSA9IDA7XG4gICAgYi5uZWdhdGl2ZSA9IDA7XG5cbiAgICAvLyBSZW1vdmUgY29tbW9uIGZhY3RvciBvZiB0d29cbiAgICBmb3IgKHZhciBzaGlmdCA9IDA7IGEuaXNFdmVuKCkgJiYgYi5pc0V2ZW4oKTsgc2hpZnQrKykge1xuICAgICAgYS5pdXNocm4oMSk7XG4gICAgICBiLml1c2hybigxKTtcbiAgICB9XG5cbiAgICBkbyB7XG4gICAgICB3aGlsZSAoYS5pc0V2ZW4oKSkge1xuICAgICAgICBhLml1c2hybigxKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChiLmlzRXZlbigpKSB7XG4gICAgICAgIGIuaXVzaHJuKDEpO1xuICAgICAgfVxuXG4gICAgICB2YXIgciA9IGEuY21wKGIpO1xuICAgICAgaWYgKHIgPCAwKSB7XG4gICAgICAgIC8vIFN3YXAgYGFgIGFuZCBgYmAgdG8gbWFrZSBgYWAgYWx3YXlzIGJpZ2dlciB0aGFuIGBiYFxuICAgICAgICB2YXIgdCA9IGE7XG4gICAgICAgIGEgPSBiO1xuICAgICAgICBiID0gdDtcbiAgICAgIH0gZWxzZSBpZiAociA9PT0gMCB8fCBiLmNtcG4oMSkgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGEuaXN1YihiKTtcbiAgICB9IHdoaWxlICh0cnVlKTtcblxuICAgIHJldHVybiBiLml1c2hsbihzaGlmdCk7XG4gIH07XG5cbiAgLy8gSW52ZXJ0IG51bWJlciBpbiB0aGUgZmllbGQgRihudW0pXG4gIEJOLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZWdjZChudW0pLmEudW1vZChudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbiBpc0V2ZW4gKCkge1xuICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uIGlzT2RkICgpIHtcbiAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMTtcbiAgfTtcblxuICAvLyBBbmQgZmlyc3Qgd29yZCBhbmQgbnVtXG4gIEJOLnByb3RvdHlwZS5hbmRsbiA9IGZ1bmN0aW9uIGFuZGxuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy53b3Jkc1swXSAmIG51bTtcbiAgfTtcblxuICAvLyBJbmNyZW1lbnQgYXQgdGhlIGJpdCBwb3NpdGlvbiBpbi1saW5lXG4gIEJOLnByb3RvdHlwZS5iaW5jbiA9IGZ1bmN0aW9uIGJpbmNuIChiaXQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicpO1xuICAgIHZhciByID0gYml0ICUgMjY7XG4gICAgdmFyIHMgPSAoYml0IC0gcikgLyAyNjtcbiAgICB2YXIgcSA9IDEgPDwgcjtcblxuICAgIC8vIEZhc3QgY2FzZTogYml0IGlzIG11Y2ggaGlnaGVyIHRoYW4gYWxsIGV4aXN0aW5nIHdvcmRzXG4gICAgaWYgKHRoaXMubGVuZ3RoIDw9IHMpIHtcbiAgICAgIHRoaXMuX2V4cGFuZChzICsgMSk7XG4gICAgICB0aGlzLndvcmRzW3NdIHw9IHE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgYml0IGFuZCBwcm9wYWdhdGUsIGlmIG5lZWRlZFxuICAgIHZhciBjYXJyeSA9IHE7XG4gICAgZm9yICh2YXIgaSA9IHM7IGNhcnJ5ICE9PSAwICYmIGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdyA9IHRoaXMud29yZHNbaV0gfCAwO1xuICAgICAgdyArPSBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+Pj4gMjY7XG4gICAgICB3ICY9IDB4M2ZmZmZmZjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB3O1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBjYXJyeTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbiBpc1plcm8gKCkge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdID09PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5jbXBuID0gZnVuY3Rpb24gY21wbiAobnVtKSB7XG4gICAgdmFyIG5lZ2F0aXZlID0gbnVtIDwgMDtcblxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmICFuZWdhdGl2ZSkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG5lZ2F0aXZlKSByZXR1cm4gMTtcblxuICAgIHRoaXMuc3RyaXAoKTtcblxuICAgIHZhciByZXM7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMSkge1xuICAgICAgcmVzID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5lZ2F0aXZlKSB7XG4gICAgICAgIG51bSA9IC1udW07XG4gICAgICB9XG5cbiAgICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmLCAnTnVtYmVyIGlzIHRvbyBiaWcnKTtcblxuICAgICAgdmFyIHcgPSB0aGlzLndvcmRzWzBdIHwgMDtcbiAgICAgIHJlcyA9IHcgPT09IG51bSA/IDAgOiB3IDwgbnVtID8gLTEgOiAxO1xuICAgIH1cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIC1yZXMgfCAwO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gQ29tcGFyZSB0d28gbnVtYmVycyBhbmQgcmV0dXJuOlxuICAvLyAxIC0gaWYgYHRoaXNgID4gYG51bWBcbiAgLy8gMCAtIGlmIGB0aGlzYCA9PSBgbnVtYFxuICAvLyAtMSAtIGlmIGB0aGlzYCA8IGBudW1gXG4gIEJOLnByb3RvdHlwZS5jbXAgPSBmdW5jdGlvbiBjbXAgKG51bSkge1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIG51bS5uZWdhdGl2ZSA9PT0gMCkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG51bS5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIDE7XG5cbiAgICB2YXIgcmVzID0gdGhpcy51Y21wKG51bSk7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHJldHVybiAtcmVzIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIFVuc2lnbmVkIGNvbXBhcmlzb25cbiAgQk4ucHJvdG90eXBlLnVjbXAgPSBmdW5jdGlvbiB1Y21wIChudW0pIHtcbiAgICAvLyBBdCB0aGlzIHBvaW50IGJvdGggbnVtYmVycyBoYXZlIHRoZSBzYW1lIHNpZ25cbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gMTtcbiAgICBpZiAodGhpcy5sZW5ndGggPCBudW0ubGVuZ3RoKSByZXR1cm4gLTE7XG5cbiAgICB2YXIgcmVzID0gMDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGEgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHZhciBiID0gbnVtLndvcmRzW2ldIHwgMDtcblxuICAgICAgaWYgKGEgPT09IGIpIGNvbnRpbnVlO1xuICAgICAgaWYgKGEgPCBiKSB7XG4gICAgICAgIHJlcyA9IC0xO1xuICAgICAgfSBlbHNlIGlmIChhID4gYikge1xuICAgICAgICByZXMgPSAxO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0biA9IGZ1bmN0aW9uIGd0biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAxO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndCA9IGZ1bmN0aW9uIGd0IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA9PT0gMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3RlbiA9IGZ1bmN0aW9uIGd0ZW4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA+PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndGUgPSBmdW5jdGlvbiBndGUgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID49IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0biA9IGZ1bmN0aW9uIGx0biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAtMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHQgPSBmdW5jdGlvbiBsdCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPT09IC0xO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdGVuID0gZnVuY3Rpb24gbHRlbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pIDw9IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0ZSA9IGZ1bmN0aW9uIGx0ZSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPD0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZXFuID0gZnVuY3Rpb24gZXFuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID09PSAwO1xuICB9O1xuXG4gIC8vXG4gIC8vIEEgcmVkdWNlIGNvbnRleHQsIGNvdWxkIGJlIHVzaW5nIG1vbnRnb21lcnkgb3Igc29tZXRoaW5nIGJldHRlciwgZGVwZW5kaW5nXG4gIC8vIG9uIHRoZSBgbWAgaXRzZWxmLlxuICAvL1xuICBCTi5yZWQgPSBmdW5jdGlvbiByZWQgKG51bSkge1xuICAgIHJldHVybiBuZXcgUmVkKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvUmVkID0gZnVuY3Rpb24gdG9SZWQgKGN0eCkge1xuICAgIGFzc2VydCghdGhpcy5yZWQsICdBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0Jyk7XG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIHJldHVybiBjdHguY29udmVydFRvKHRoaXMpLl9mb3JjZVJlZChjdHgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5mcm9tUmVkID0gZnVuY3Rpb24gZnJvbVJlZCAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAnZnJvbVJlZCB3b3JrcyBvbmx5IHdpdGggbnVtYmVycyBpbiByZWR1Y3Rpb24gY29udGV4dCcpO1xuICAgIHJldHVybiB0aGlzLnJlZC5jb252ZXJ0RnJvbSh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2ZvcmNlUmVkID0gZnVuY3Rpb24gX2ZvcmNlUmVkIChjdHgpIHtcbiAgICB0aGlzLnJlZCA9IGN0eDtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZm9yY2VSZWQgPSBmdW5jdGlvbiBmb3JjZVJlZCAoY3R4KSB7XG4gICAgYXNzZXJ0KCF0aGlzLnJlZCwgJ0FscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQnKTtcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VSZWQoY3R4KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkQWRkID0gZnVuY3Rpb24gcmVkQWRkIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmFkZCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJQWRkID0gZnVuY3Rpb24gcmVkSUFkZCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSUFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaWFkZCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTdWIgPSBmdW5jdGlvbiByZWRTdWIgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3ViKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElTdWIgPSBmdW5jdGlvbiByZWRJU3ViIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pc3ViKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFNobCA9IGZ1bmN0aW9uIHJlZFNobCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zaGwodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkTXVsID0gZnVuY3Rpb24gcmVkTXVsIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgbnVtKTtcbiAgICByZXR1cm4gdGhpcy5yZWQubXVsKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElNdWwgPSBmdW5jdGlvbiByZWRJTXVsIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgbnVtKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaW11bCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTcXIgPSBmdW5jdGlvbiByZWRTcXIgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3FyKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJU3FyID0gZnVuY3Rpb24gcmVkSVNxciAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSVNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaXNxcih0aGlzKTtcbiAgfTtcblxuICAvLyBTcXVhcmUgcm9vdCBvdmVyIHBcbiAgQk4ucHJvdG90eXBlLnJlZFNxcnQgPSBmdW5jdGlvbiByZWRTcXJ0ICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTcXJ0IHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zcXJ0KHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJbnZtID0gZnVuY3Rpb24gcmVkSW52bSAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaW52bSh0aGlzKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gbmVnYXRpdmUgY2xvbmUgb2YgYHRoaXNgICUgYHJlZCBtb2R1bG9gXG4gIEJOLnByb3RvdHlwZS5yZWROZWcgPSBmdW5jdGlvbiByZWROZWcgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZE5lZyB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQubmVnKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRQb3cgPSBmdW5jdGlvbiByZWRQb3cgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCAmJiAhbnVtLnJlZCwgJ3JlZFBvdyhub3JtYWxOdW0pJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnBvdyh0aGlzLCBudW0pO1xuICB9O1xuXG4gIC8vIFByaW1lIG51bWJlcnMgd2l0aCBlZmZpY2llbnQgcmVkdWN0aW9uXG4gIHZhciBwcmltZXMgPSB7XG4gICAgazI1NjogbnVsbCxcbiAgICBwMjI0OiBudWxsLFxuICAgIHAxOTI6IG51bGwsXG4gICAgcDI1NTE5OiBudWxsXG4gIH07XG5cbiAgLy8gUHNldWRvLU1lcnNlbm5lIHByaW1lXG4gIGZ1bmN0aW9uIE1QcmltZSAobmFtZSwgcCkge1xuICAgIC8vIFAgPSAyIF4gTiAtIEtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMucCA9IG5ldyBCTihwLCAxNik7XG4gICAgdGhpcy5uID0gdGhpcy5wLmJpdExlbmd0aCgpO1xuICAgIHRoaXMuayA9IG5ldyBCTigxKS5pdXNobG4odGhpcy5uKS5pc3ViKHRoaXMucCk7XG5cbiAgICB0aGlzLnRtcCA9IHRoaXMuX3RtcCgpO1xuICB9XG5cbiAgTVByaW1lLnByb3RvdHlwZS5fdG1wID0gZnVuY3Rpb24gX3RtcCAoKSB7XG4gICAgdmFyIHRtcCA9IG5ldyBCTihudWxsKTtcbiAgICB0bXAud29yZHMgPSBuZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMubiAvIDEzKSk7XG4gICAgcmV0dXJuIHRtcDtcbiAgfTtcblxuICBNUHJpbWUucHJvdG90eXBlLmlyZWR1Y2UgPSBmdW5jdGlvbiBpcmVkdWNlIChudW0pIHtcbiAgICAvLyBBc3N1bWVzIHRoYXQgYG51bWAgaXMgbGVzcyB0aGFuIGBQXjJgXG4gICAgLy8gbnVtID0gSEkgKiAoMiBeIE4gLSBLKSArIEhJICogSyArIExPID0gSEkgKiBLICsgTE8gKG1vZCBQKVxuICAgIHZhciByID0gbnVtO1xuICAgIHZhciBybGVuO1xuXG4gICAgZG8ge1xuICAgICAgdGhpcy5zcGxpdChyLCB0aGlzLnRtcCk7XG4gICAgICByID0gdGhpcy5pbXVsSyhyKTtcbiAgICAgIHIgPSByLmlhZGQodGhpcy50bXApO1xuICAgICAgcmxlbiA9IHIuYml0TGVuZ3RoKCk7XG4gICAgfSB3aGlsZSAocmxlbiA+IHRoaXMubik7XG5cbiAgICB2YXIgY21wID0gcmxlbiA8IHRoaXMubiA/IC0xIDogci51Y21wKHRoaXMucCk7XG4gICAgaWYgKGNtcCA9PT0gMCkge1xuICAgICAgci53b3Jkc1swXSA9IDA7XG4gICAgICByLmxlbmd0aCA9IDE7XG4gICAgfSBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgICByLmlzdWIodGhpcy5wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgci5zdHJpcCgpO1xuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIE1QcmltZS5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiBzcGxpdCAoaW5wdXQsIG91dCkge1xuICAgIGlucHV0Lml1c2hybih0aGlzLm4sIDAsIG91dCk7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICByZXR1cm4gbnVtLmltdWwodGhpcy5rKTtcbiAgfTtcblxuICBmdW5jdGlvbiBLMjU2ICgpIHtcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAnazI1NicsXG4gICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYnKTtcbiAgfVxuICBpbmhlcml0cyhLMjU2LCBNUHJpbWUpO1xuXG4gIEsyNTYucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24gc3BsaXQgKGlucHV0LCBvdXRwdXQpIHtcbiAgICAvLyAyNTYgPSA5ICogMjYgKyAyMlxuICAgIHZhciBtYXNrID0gMHgzZmZmZmY7XG5cbiAgICB2YXIgb3V0TGVuID0gTWF0aC5taW4oaW5wdXQubGVuZ3RoLCA5KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG91dExlbjsgaSsrKSB7XG4gICAgICBvdXRwdXQud29yZHNbaV0gPSBpbnB1dC53b3Jkc1tpXTtcbiAgICB9XG4gICAgb3V0cHV0Lmxlbmd0aCA9IG91dExlbjtcblxuICAgIGlmIChpbnB1dC5sZW5ndGggPD0gOSkge1xuICAgICAgaW5wdXQud29yZHNbMF0gPSAwO1xuICAgICAgaW5wdXQubGVuZ3RoID0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTaGlmdCBieSA5IGxpbWJzXG4gICAgdmFyIHByZXYgPSBpbnB1dC53b3Jkc1s5XTtcbiAgICBvdXRwdXQud29yZHNbb3V0cHV0Lmxlbmd0aCsrXSA9IHByZXYgJiBtYXNrO1xuXG4gICAgZm9yIChpID0gMTA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5leHQgPSBpbnB1dC53b3Jkc1tpXSB8IDA7XG4gICAgICBpbnB1dC53b3Jkc1tpIC0gMTBdID0gKChuZXh0ICYgbWFzaykgPDwgNCkgfCAocHJldiA+Pj4gMjIpO1xuICAgICAgcHJldiA9IG5leHQ7XG4gICAgfVxuICAgIHByZXYgPj4+PSAyMjtcbiAgICBpbnB1dC53b3Jkc1tpIC0gMTBdID0gcHJldjtcbiAgICBpZiAocHJldiA9PT0gMCAmJiBpbnB1dC5sZW5ndGggPiAxMCkge1xuICAgICAgaW5wdXQubGVuZ3RoIC09IDEwO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnB1dC5sZW5ndGggLT0gOTtcbiAgICB9XG4gIH07XG5cbiAgSzI1Ni5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbiBpbXVsSyAobnVtKSB7XG4gICAgLy8gSyA9IDB4MTAwMDAwM2QxID0gWyAweDQwLCAweDNkMSBdXG4gICAgbnVtLndvcmRzW251bS5sZW5ndGhdID0gMDtcbiAgICBudW0ud29yZHNbbnVtLmxlbmd0aCArIDFdID0gMDtcbiAgICBudW0ubGVuZ3RoICs9IDI7XG5cbiAgICAvLyBib3VuZGVkIGF0OiAweDQwICogMHgzZmZmZmZmICsgMHgzZDAgPSAweDEwMDAwMDM5MFxuICAgIHZhciBsbyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gbnVtLndvcmRzW2ldIHwgMDtcbiAgICAgIGxvICs9IHcgKiAweDNkMTtcbiAgICAgIG51bS53b3Jkc1tpXSA9IGxvICYgMHgzZmZmZmZmO1xuICAgICAgbG8gPSB3ICogMHg0MCArICgobG8gLyAweDQwMDAwMDApIHwgMCk7XG4gICAgfVxuXG4gICAgLy8gRmFzdCBsZW5ndGggcmVkdWN0aW9uXG4gICAgaWYgKG51bS53b3Jkc1tudW0ubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgIG51bS5sZW5ndGgtLTtcbiAgICAgIGlmIChudW0ud29yZHNbbnVtLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICAgIG51bS5sZW5ndGgtLTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbiAgfTtcblxuICBmdW5jdGlvbiBQMjI0ICgpIHtcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAncDIyNCcsXG4gICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEnKTtcbiAgfVxuICBpbmhlcml0cyhQMjI0LCBNUHJpbWUpO1xuXG4gIGZ1bmN0aW9uIFAxOTIgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdwMTkyJyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZicpO1xuICB9XG4gIGluaGVyaXRzKFAxOTIsIE1QcmltZSk7XG5cbiAgZnVuY3Rpb24gUDI1NTE5ICgpIHtcbiAgICAvLyAyIF4gMjU1IC0gMTlcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAnMjU1MTknLFxuICAgICAgJzdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQnKTtcbiAgfVxuICBpbmhlcml0cyhQMjU1MTksIE1QcmltZSk7XG5cbiAgUDI1NTE5LnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICAvLyBLID0gMHgxM1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoaSA9IChudW0ud29yZHNbaV0gfCAwKSAqIDB4MTMgKyBjYXJyeTtcbiAgICAgIHZhciBsbyA9IGhpICYgMHgzZmZmZmZmO1xuICAgICAgaGkgPj4+PSAyNjtcblxuICAgICAgbnVtLndvcmRzW2ldID0gbG87XG4gICAgICBjYXJyeSA9IGhpO1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIG51bS53b3Jkc1tudW0ubGVuZ3RoKytdID0gY2Fycnk7XG4gICAgfVxuICAgIHJldHVybiBudW07XG4gIH07XG5cbiAgLy8gRXhwb3J0ZWQgbW9zdGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB1c2UgcGxhaW4gbmFtZSBpbnN0ZWFkXG4gIEJOLl9wcmltZSA9IGZ1bmN0aW9uIHByaW1lIChuYW1lKSB7XG4gICAgLy8gQ2FjaGVkIHZlcnNpb24gb2YgcHJpbWVcbiAgICBpZiAocHJpbWVzW25hbWVdKSByZXR1cm4gcHJpbWVzW25hbWVdO1xuXG4gICAgdmFyIHByaW1lO1xuICAgIGlmIChuYW1lID09PSAnazI1NicpIHtcbiAgICAgIHByaW1lID0gbmV3IEsyNTYoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwMjI0Jykge1xuICAgICAgcHJpbWUgPSBuZXcgUDIyNCgpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3AxOTInKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMTkyKCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAncDI1NTE5Jykge1xuICAgICAgcHJpbWUgPSBuZXcgUDI1NTE5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBwcmltZSAnICsgbmFtZSk7XG4gICAgfVxuICAgIHByaW1lc1tuYW1lXSA9IHByaW1lO1xuXG4gICAgcmV0dXJuIHByaW1lO1xuICB9O1xuXG4gIC8vXG4gIC8vIEJhc2UgcmVkdWN0aW9uIGVuZ2luZVxuICAvL1xuICBmdW5jdGlvbiBSZWQgKG0pIHtcbiAgICBpZiAodHlwZW9mIG0gPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgcHJpbWUgPSBCTi5fcHJpbWUobSk7XG4gICAgICB0aGlzLm0gPSBwcmltZS5wO1xuICAgICAgdGhpcy5wcmltZSA9IHByaW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQobS5ndG4oMSksICdtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEnKTtcbiAgICAgIHRoaXMubSA9IG07XG4gICAgICB0aGlzLnByaW1lID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBSZWQucHJvdG90eXBlLl92ZXJpZnkxID0gZnVuY3Rpb24gX3ZlcmlmeTEgKGEpIHtcbiAgICBhc3NlcnQoYS5uZWdhdGl2ZSA9PT0gMCwgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzJyk7XG4gICAgYXNzZXJ0KGEucmVkLCAncmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuX3ZlcmlmeTIgPSBmdW5jdGlvbiBfdmVyaWZ5MiAoYSwgYikge1xuICAgIGFzc2VydCgoYS5uZWdhdGl2ZSB8IGIubmVnYXRpdmUpID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICBhc3NlcnQoYS5yZWQgJiYgYS5yZWQgPT09IGIucmVkLFxuICAgICAgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmltb2QgPSBmdW5jdGlvbiBpbW9kIChhKSB7XG4gICAgaWYgKHRoaXMucHJpbWUpIHJldHVybiB0aGlzLnByaW1lLmlyZWR1Y2UoYSkuX2ZvcmNlUmVkKHRoaXMpO1xuICAgIHJldHVybiBhLnVtb2QodGhpcy5tKS5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcgKGEpIHtcbiAgICBpZiAoYS5pc1plcm8oKSkge1xuICAgICAgcmV0dXJuIGEuY2xvbmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tLnN1YihhKS5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuXG4gICAgdmFyIHJlcyA9IGEuYWRkKGIpO1xuICAgIGlmIChyZXMuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzLmlzdWIodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24gaWFkZCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5pYWRkKGIpO1xuICAgIGlmIChyZXMuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzLmlzdWIodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uIHN1YiAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5zdWIoYik7XG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24gaXN1YiAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5pc3ViKGIpO1xuICAgIGlmIChyZXMuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcy5pYWRkKHRoaXMubSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5zaGwgPSBmdW5jdGlvbiBzaGwgKGEsIG51bSkge1xuICAgIHRoaXMuX3ZlcmlmeTEoYSk7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLnVzaGxuKG51bSkpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuICAgIHJldHVybiB0aGlzLmltb2QoYS5pbXVsKGIpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLm11bChiKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24gaXNxciAoYSkge1xuICAgIHJldHVybiB0aGlzLmltdWwoYSwgYS5jbG9uZSgpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uIHNxciAoYSkge1xuICAgIHJldHVybiB0aGlzLm11bChhLCBhKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNxcnQgPSBmdW5jdGlvbiBzcXJ0IChhKSB7XG4gICAgaWYgKGEuaXNaZXJvKCkpIHJldHVybiBhLmNsb25lKCk7XG5cbiAgICB2YXIgbW9kMyA9IHRoaXMubS5hbmRsbigzKTtcbiAgICBhc3NlcnQobW9kMyAlIDIgPT09IDEpO1xuXG4gICAgLy8gRmFzdCBjYXNlXG4gICAgaWYgKG1vZDMgPT09IDMpIHtcbiAgICAgIHZhciBwb3cgPSB0aGlzLm0uYWRkKG5ldyBCTigxKSkuaXVzaHJuKDIpO1xuICAgICAgcmV0dXJuIHRoaXMucG93KGEsIHBvdyk7XG4gICAgfVxuXG4gICAgLy8gVG9uZWxsaS1TaGFua3MgYWxnb3JpdGhtIChUb3RhbGx5IHVub3B0aW1pemVkIGFuZCBzbG93KVxuICAgIC8vXG4gICAgLy8gRmluZCBRIGFuZCBTLCB0aGF0IFEgKiAyIF4gUyA9IChQIC0gMSlcbiAgICB2YXIgcSA9IHRoaXMubS5zdWJuKDEpO1xuICAgIHZhciBzID0gMDtcbiAgICB3aGlsZSAoIXEuaXNaZXJvKCkgJiYgcS5hbmRsbigxKSA9PT0gMCkge1xuICAgICAgcysrO1xuICAgICAgcS5pdXNocm4oMSk7XG4gICAgfVxuICAgIGFzc2VydCghcS5pc1plcm8oKSk7XG5cbiAgICB2YXIgb25lID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIHZhciBuT25lID0gb25lLnJlZE5lZygpO1xuXG4gICAgLy8gRmluZCBxdWFkcmF0aWMgbm9uLXJlc2lkdWVcbiAgICAvLyBOT1RFOiBNYXggaXMgc3VjaCBiZWNhdXNlIG9mIGdlbmVyYWxpemVkIFJpZW1hbm4gaHlwb3RoZXNpcy5cbiAgICB2YXIgbHBvdyA9IHRoaXMubS5zdWJuKDEpLml1c2hybigxKTtcbiAgICB2YXIgeiA9IHRoaXMubS5iaXRMZW5ndGgoKTtcbiAgICB6ID0gbmV3IEJOKDIgKiB6ICogeikudG9SZWQodGhpcyk7XG5cbiAgICB3aGlsZSAodGhpcy5wb3coeiwgbHBvdykuY21wKG5PbmUpICE9PSAwKSB7XG4gICAgICB6LnJlZElBZGQobk9uZSk7XG4gICAgfVxuXG4gICAgdmFyIGMgPSB0aGlzLnBvdyh6LCBxKTtcbiAgICB2YXIgciA9IHRoaXMucG93KGEsIHEuYWRkbigxKS5pdXNocm4oMSkpO1xuICAgIHZhciB0ID0gdGhpcy5wb3coYSwgcSk7XG4gICAgdmFyIG0gPSBzO1xuICAgIHdoaWxlICh0LmNtcChvbmUpICE9PSAwKSB7XG4gICAgICB2YXIgdG1wID0gdDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyB0bXAuY21wKG9uZSkgIT09IDA7IGkrKykge1xuICAgICAgICB0bXAgPSB0bXAucmVkU3FyKCk7XG4gICAgICB9XG4gICAgICBhc3NlcnQoaSA8IG0pO1xuICAgICAgdmFyIGIgPSB0aGlzLnBvdyhjLCBuZXcgQk4oMSkuaXVzaGxuKG0gLSBpIC0gMSkpO1xuXG4gICAgICByID0gci5yZWRNdWwoYik7XG4gICAgICBjID0gYi5yZWRTcXIoKTtcbiAgICAgIHQgPSB0LnJlZE11bChjKTtcbiAgICAgIG0gPSBpO1xuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uIGludm0gKGEpIHtcbiAgICB2YXIgaW52ID0gYS5faW52bXAodGhpcy5tKTtcbiAgICBpZiAoaW52Lm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBpbnYubmVnYXRpdmUgPSAwO1xuICAgICAgcmV0dXJuIHRoaXMuaW1vZChpbnYpLnJlZE5lZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5pbW9kKGludik7XG4gICAgfVxuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24gcG93IChhLCBudW0pIHtcbiAgICBpZiAobnVtLmlzWmVybygpKSByZXR1cm4gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIGlmIChudW0uY21wbigxKSA9PT0gMCkgcmV0dXJuIGEuY2xvbmUoKTtcblxuICAgIHZhciB3aW5kb3dTaXplID0gNDtcbiAgICB2YXIgd25kID0gbmV3IEFycmF5KDEgPDwgd2luZG93U2l6ZSk7XG4gICAgd25kWzBdID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIHduZFsxXSA9IGE7XG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCB3bmQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHduZFtpXSA9IHRoaXMubXVsKHduZFtpIC0gMV0sIGEpO1xuICAgIH1cblxuICAgIHZhciByZXMgPSB3bmRbMF07XG4gICAgdmFyIGN1cnJlbnQgPSAwO1xuICAgIHZhciBjdXJyZW50TGVuID0gMDtcbiAgICB2YXIgc3RhcnQgPSBudW0uYml0TGVuZ3RoKCkgJSAyNjtcbiAgICBpZiAoc3RhcnQgPT09IDApIHtcbiAgICAgIHN0YXJ0ID0gMjY7XG4gICAgfVxuXG4gICAgZm9yIChpID0gbnVtLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgd29yZCA9IG51bS53b3Jkc1tpXTtcbiAgICAgIGZvciAodmFyIGogPSBzdGFydCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHZhciBiaXQgPSAod29yZCA+PiBqKSAmIDE7XG4gICAgICAgIGlmIChyZXMgIT09IHduZFswXSkge1xuICAgICAgICAgIHJlcyA9IHRoaXMuc3FyKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYml0ID09PSAwICYmIGN1cnJlbnQgPT09IDApIHtcbiAgICAgICAgICBjdXJyZW50TGVuID0gMDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnQgPDw9IDE7XG4gICAgICAgIGN1cnJlbnQgfD0gYml0O1xuICAgICAgICBjdXJyZW50TGVuKys7XG4gICAgICAgIGlmIChjdXJyZW50TGVuICE9PSB3aW5kb3dTaXplICYmIChpICE9PSAwIHx8IGogIT09IDApKSBjb250aW51ZTtcblxuICAgICAgICByZXMgPSB0aGlzLm11bChyZXMsIHduZFtjdXJyZW50XSk7XG4gICAgICAgIGN1cnJlbnRMZW4gPSAwO1xuICAgICAgICBjdXJyZW50ID0gMDtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gMjY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uIGNvbnZlcnRUbyAobnVtKSB7XG4gICAgdmFyIHIgPSBudW0udW1vZCh0aGlzLm0pO1xuXG4gICAgcmV0dXJuIHIgPT09IG51bSA/IHIuY2xvbmUoKSA6IHI7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uIGNvbnZlcnRGcm9tIChudW0pIHtcbiAgICB2YXIgcmVzID0gbnVtLmNsb25lKCk7XG4gICAgcmVzLnJlZCA9IG51bGw7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvL1xuICAvLyBNb250Z29tZXJ5IG1ldGhvZCBlbmdpbmVcbiAgLy9cblxuICBCTi5tb250ID0gZnVuY3Rpb24gbW9udCAobnVtKSB7XG4gICAgcmV0dXJuIG5ldyBNb250KG51bSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gTW9udCAobSkge1xuICAgIFJlZC5jYWxsKHRoaXMsIG0pO1xuXG4gICAgdGhpcy5zaGlmdCA9IHRoaXMubS5iaXRMZW5ndGgoKTtcbiAgICBpZiAodGhpcy5zaGlmdCAlIDI2ICE9PSAwKSB7XG4gICAgICB0aGlzLnNoaWZ0ICs9IDI2IC0gKHRoaXMuc2hpZnQgJSAyNik7XG4gICAgfVxuXG4gICAgdGhpcy5yID0gbmV3IEJOKDEpLml1c2hsbih0aGlzLnNoaWZ0KTtcbiAgICB0aGlzLnIyID0gdGhpcy5pbW9kKHRoaXMuci5zcXIoKSk7XG4gICAgdGhpcy5yaW52ID0gdGhpcy5yLl9pbnZtcCh0aGlzLm0pO1xuXG4gICAgdGhpcy5taW52ID0gdGhpcy5yaW52Lm11bCh0aGlzLnIpLmlzdWJuKDEpLmRpdih0aGlzLm0pO1xuICAgIHRoaXMubWludiA9IHRoaXMubWludi51bW9kKHRoaXMucik7XG4gICAgdGhpcy5taW52ID0gdGhpcy5yLnN1Yih0aGlzLm1pbnYpO1xuICB9XG4gIGluaGVyaXRzKE1vbnQsIFJlZCk7XG5cbiAgTW9udC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24gY29udmVydFRvIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5pbW9kKG51bS51c2hsbih0aGlzLnNoaWZ0KSk7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUuY29udmVydEZyb20gPSBmdW5jdGlvbiBjb252ZXJ0RnJvbSAobnVtKSB7XG4gICAgdmFyIHIgPSB0aGlzLmltb2QobnVtLm11bCh0aGlzLnJpbnYpKTtcbiAgICByLnJlZCA9IG51bGw7XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKGEsIGIpIHtcbiAgICBpZiAoYS5pc1plcm8oKSB8fCBiLmlzWmVybygpKSB7XG4gICAgICBhLndvcmRzWzBdID0gMDtcbiAgICAgIGEubGVuZ3RoID0gMTtcbiAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIHZhciB0ID0gYS5pbXVsKGIpO1xuICAgIHZhciBjID0gdC5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSk7XG4gICAgdmFyIHUgPSB0LmlzdWIoYykuaXVzaHJuKHRoaXMuc2hpZnQpO1xuICAgIHZhciByZXMgPSB1O1xuXG4gICAgaWYgKHUuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzID0gdS5pc3ViKHRoaXMubSk7XG4gICAgfSBlbHNlIGlmICh1LmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMgPSB1LmlhZGQodGhpcy5tKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwgKGEsIGIpIHtcbiAgICBpZiAoYS5pc1plcm8oKSB8fCBiLmlzWmVybygpKSByZXR1cm4gbmV3IEJOKDApLl9mb3JjZVJlZCh0aGlzKTtcblxuICAgIHZhciB0ID0gYS5tdWwoYik7XG4gICAgdmFyIGMgPSB0Lm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKTtcbiAgICB2YXIgdSA9IHQuaXN1YihjKS5pdXNocm4odGhpcy5zaGlmdCk7XG4gICAgdmFyIHJlcyA9IHU7XG4gICAgaWYgKHUuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzID0gdS5pc3ViKHRoaXMubSk7XG4gICAgfSBlbHNlIGlmICh1LmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMgPSB1LmlhZGQodGhpcy5tKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAoYSkge1xuICAgIC8vIChBUileLTEgKiBSXjIgPSAoQV4tMSAqIFJeLTEpICogUl4yID0gQV4tMSAqIFJcbiAgICB2YXIgcmVzID0gdGhpcy5pbW9kKGEuX2ludm1wKHRoaXMubSkubXVsKHRoaXMucjIpKTtcbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcbn0pKHR5cGVvZiBtb2R1bGUgPT09ICd1bmRlZmluZWQnIHx8IG1vZHVsZSwgdGhpcyk7XG5cbn0se1wiYnVmZmVyXCI6NDZ9XSw0NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByYW5kKGxlbikge1xuICBpZiAoIXIpXG4gICAgciA9IG5ldyBSYW5kKG51bGwpO1xuXG4gIHJldHVybiByLmdlbmVyYXRlKGxlbik7XG59O1xuXG5mdW5jdGlvbiBSYW5kKHJhbmQpIHtcbiAgdGhpcy5yYW5kID0gcmFuZDtcbn1cbm1vZHVsZS5leHBvcnRzLlJhbmQgPSBSYW5kO1xuXG5SYW5kLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uIGdlbmVyYXRlKGxlbikge1xuICByZXR1cm4gdGhpcy5fcmFuZChsZW4pO1xufTtcblxuLy8gRW11bGF0ZSBjcnlwdG8gQVBJIHVzaW5nIHJhbmR5XG5SYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgaWYgKHRoaXMucmFuZC5nZXRCeXRlcylcbiAgICByZXR1cm4gdGhpcy5yYW5kLmdldEJ5dGVzKG4pO1xuXG4gIHZhciByZXMgPSBuZXcgVWludDhBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspXG4gICAgcmVzW2ldID0gdGhpcy5yYW5kLmdldEJ5dGUoKTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbmlmICh0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcpIHtcbiAgaWYgKHNlbGYuY3J5cHRvICYmIHNlbGYuY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIE1vZGVybiBicm93c2Vyc1xuICAgIFJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICAgICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xuICAgICAgc2VsZi5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH07XG4gIH0gZWxzZSBpZiAoc2VsZi5tc0NyeXB0byAmJiBzZWxmLm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIElFXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbiBfcmFuZChuKSB7XG4gICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICBzZWxmLm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnIpO1xuICAgICAgcmV0dXJuIGFycjtcbiAgICB9O1xuXG4gIC8vIFNhZmFyaSdzIFdlYldvcmtlcnMgZG8gbm90IGhhdmUgYGNyeXB0b2BcbiAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0Jykge1xuICAgIC8vIE9sZCBqdW5rXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkIHlldCcpO1xuICAgIH07XG4gIH1cbn0gZWxzZSB7XG4gIC8vIE5vZGUuanMgb3IgV2ViIHdvcmtlciB3aXRoIG5vIGNyeXB0byBzdXBwb3J0XG4gIHRyeSB7XG4gICAgdmFyIGNyeXB0byA9IF9kZXJlcV8oJ2NyeXB0bycpO1xuICAgIGlmICh0eXBlb2YgY3J5cHRvLnJhbmRvbUJ5dGVzICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkJyk7XG5cbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tQnl0ZXMobik7XG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICB9XG59XG5cbn0se1wiY3J5cHRvXCI6XCJjcnlwdG9cIn1dLDQ2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxufSx7fV0sNDc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IF9kZXJlcV8oJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IF9kZXJlcV8oJ2llZWU3NTQnKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbnZhciBLX01BWF9MRU5HVEggPSAweDdmZmZmZmZmXG5leHBvcnRzLmtNYXhMZW5ndGggPSBLX01BWF9MRU5HVEhcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgUHJpbnQgd2FybmluZyBhbmQgcmVjb21tZW5kIHVzaW5nIGBidWZmZXJgIHY0Lnggd2hpY2ggaGFzIGFuIE9iamVjdFxuICogICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogV2UgcmVwb3J0IHRoYXQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0eXBlZCBhcnJheXMgaWYgdGhlIGFyZSBub3Qgc3ViY2xhc3NhYmxlXG4gKiB1c2luZyBfX3Byb3RvX18uIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgXG4gKiAoU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzgpLiBJRSAxMCBsYWNrcyBzdXBwb3J0XG4gKiBmb3IgX19wcm90b19fIGFuZCBoYXMgYSBidWdneSB0eXBlZCBhcnJheSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICAnVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5ICcgK1xuICAgICdgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LidcbiAgKVxufVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIC8vIENhbiB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZD9cbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0ge19fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfX1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MlxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKGxlbmd0aCA+IEtfTUFYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgYnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGJ1ZlxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUoYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgdmFsdWU6IG51bGwsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuZnVuY3Rpb24gZnJvbSAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cblxuICBpZiAoaXNBcnJheUJ1ZmZlcih2YWx1ZSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gTm90ZTogQ2hhbmdlIHByb3RvdHlwZSAqYWZ0ZXIqIEJ1ZmZlci5mcm9tIGlzIGRlZmluZWQgdG8gd29ya2Fyb3VuZCBDaHJvbWUgYnVnOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC8xNDhcbkJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbkJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlIChzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gYnVmLndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICBidWYgPSBidWYuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlIChhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgYnVmW2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICB2YXIgYnVmXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBidWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbilcblxuICAgIGlmIChidWYubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYnVmXG4gICAgfVxuXG4gICAgb2JqLmNvcHkoYnVmLCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIGJ1ZlxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmIChpc0FycmF5QnVmZmVyVmlldyhvYmopIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBudW1iZXJJc05hTihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBLX01BWF9MRU5HVEhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIEtfTUFYX0xFTkdUSC50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuIGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlciA9PT0gdHJ1ZVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAoaXNBcnJheUJ1ZmZlclZpZXcoc3RyaW5nKSB8fCBpc0FycmF5QnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgKGFuZCB0aGUgYGlzLWJ1ZmZlcmAgbnBtIHBhY2thZ2UpXG4vLyB0byBkZXRlY3QgYSBCdWZmZXIgaW5zdGFuY2UuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBgaW5zdGFuY2VvZiBCdWZmZXJgXG4vLyByZWxpYWJseSBpbiBhIGJyb3dzZXJpZnkgY29udGV4dCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGRpZmZlcmVudFxuLy8gY29waWVzIG9mIHRoZSAnYnVmZmVyJyBwYWNrYWdlIGluIHVzZS4gVGhpcyBtZXRob2Qgd29ya3MgZXZlbiBmb3IgQnVmZmVyXG4vLyBpbnN0YW5jZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZnJvbSBhbm90aGVyIGNvcHkgb2YgdGhlIGBidWZmZXJgIHBhY2thZ2UuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNTRcbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0ICAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAobnVtYmVySXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmICh0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKG51bWJlcklzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgKGJ5dGVzW2kgKyAxXSAqIDI1NikpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDApIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teKy8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuLy8gQXJyYXlCdWZmZXJzIGZyb20gYW5vdGhlciBjb250ZXh0IChpLmUuIGFuIGlmcmFtZSkgZG8gbm90IHBhc3MgdGhlIGBpbnN0YW5jZW9mYCBjaGVja1xuLy8gYnV0IHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdmFsaWQuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzE2NlxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlciAob2JqKSB7XG4gIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fFxuICAgIChvYmogIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IgIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IubmFtZSA9PT0gJ0FycmF5QnVmZmVyJyAmJlxuICAgICAgdHlwZW9mIG9iai5ieXRlTGVuZ3RoID09PSAnbnVtYmVyJylcbn1cblxuLy8gTm9kZSAwLjEwIHN1cHBvcnRzIGBBcnJheUJ1ZmZlcmAgYnV0IGxhY2tzIGBBcnJheUJ1ZmZlci5pc1ZpZXdgXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyVmlldyAob2JqKSB7XG4gIHJldHVybiAodHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJykgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KG9iailcbn1cblxuZnVuY3Rpb24gbnVtYmVySXNOYU4gKG9iaikge1xuICByZXR1cm4gb2JqICE9PSBvYmogLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cblxufSx7XCJiYXNlNjQtanNcIjo0MyxcImllZWU3NTRcIjoyOTd9XSw0ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5fZGVyZXFfKCcuLi8uLi9tb2R1bGVzL2VzNi5hcnJheS5maWxsJyk7XG5tb2R1bGUuZXhwb3J0cyA9IF9kZXJlcV8oJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5BcnJheS5maWxsO1xuXG59LHtcIi4uLy4uL21vZHVsZXMvX2NvcmVcIjoxODAsXCIuLi8uLi9tb2R1bGVzL2VzNi5hcnJheS5maWxsXCI6MjUxfV0sNDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuX2RlcmVxXygnLi4vLi4vbW9kdWxlcy9lczYuYXJyYXkuZmluZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBfZGVyZXFfKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuQXJyYXkuZmluZDtcblxufSx7XCIuLi8uLi9tb2R1bGVzL19jb3JlXCI6MTgwLFwiLi4vLi4vbW9kdWxlcy9lczYuYXJyYXkuZmluZFwiOjI1Mn1dLDUwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbl9kZXJlcV8oJy4uLy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xuX2RlcmVxXygnLi4vLi4vbW9kdWxlcy9lczYuYXJyYXkuZnJvbScpO1xubW9kdWxlLmV4cG9ydHMgPSBfZGVyZXFfKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuQXJyYXkuZnJvbTtcblxufSx7XCIuLi8uLi9tb2R1bGVzL19jb3JlXCI6MTgwLFwiLi4vLi4vbW9kdWxlcy9lczYuYXJyYXkuZnJvbVwiOjI1MyxcIi4uLy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvclwiOjI1OH1dLDUxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbl9kZXJlcV8oJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24nKTtcbm1vZHVsZS5leHBvcnRzID0gX2RlcmVxXygnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5hc3NpZ247XG5cbn0se1wiLi4vLi4vbW9kdWxlcy9fY29yZVwiOjE4MCxcIi4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ25cIjoyNTV9XSw1MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5fZGVyZXFfKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5fZGVyZXFfKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbl9kZXJlcV8oJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xuX2RlcmVxXygnLi4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xuX2RlcmVxXygnLi4vbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5Jyk7XG5fZGVyZXFfKCcuLi9tb2R1bGVzL2VzNy5wcm9taXNlLnRyeScpO1xubW9kdWxlLmV4cG9ydHMgPSBfZGVyZXFfKCcuLi9tb2R1bGVzL19jb3JlJykuUHJvbWlzZTtcblxufSx7XCIuLi9tb2R1bGVzL19jb3JlXCI6MTgwLFwiLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZ1wiOjI1NixcIi4uL21vZHVsZXMvZXM2LnByb21pc2VcIjoyNTcsXCIuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3JcIjoyNTgsXCIuLi9tb2R1bGVzL2VzNy5wcm9taXNlLmZpbmFsbHlcIjoyNjIsXCIuLi9tb2R1bGVzL2VzNy5wcm9taXNlLnRyeVwiOjI2MyxcIi4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZVwiOjI2Nn1dLDUzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbl9kZXJlcV8oJy4uLy4uL21vZHVsZXMvZXM2LnN0cmluZy5yZXBlYXQnKTtcbm1vZHVsZS5leHBvcnRzID0gX2RlcmVxXygnLi4vLi4vbW9kdWxlcy9fY29yZScpLlN0cmluZy5yZXBlYXQ7XG5cbn0se1wiLi4vLi4vbW9kdWxlcy9fY29yZVwiOjE4MCxcIi4uLy4uL21vZHVsZXMvZXM2LnN0cmluZy5yZXBlYXRcIjoyNTl9XSw1NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5fZGVyZXFfKCcuLi8uLi9tb2R1bGVzL2VzNi5zeW1ib2wnKTtcbl9kZXJlcV8oJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbl9kZXJlcV8oJy4uLy4uL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvcicpO1xuX2RlcmVxXygnLi4vLi4vbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gX2RlcmVxXygnLi4vLi4vbW9kdWxlcy9fY29yZScpLlN5bWJvbDtcblxufSx7XCIuLi8uLi9tb2R1bGVzL19jb3JlXCI6MTgwLFwiLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZ1wiOjI1NixcIi4uLy4uL21vZHVsZXMvZXM2LnN5bWJvbFwiOjI2MCxcIi4uLy4uL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvclwiOjI2NCxcIi4uLy4uL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlXCI6MjY1fV0sNTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuX2RlcmVxXygnLi4vLi4vbW9kdWxlcy9lczYudHlwZWQudWludDgtYXJyYXknKTtcbm1vZHVsZS5leHBvcnRzID0gX2RlcmVxXygnLi4vLi4vbW9kdWxlcy9fY29yZScpLlVpbnQ4QXJyYXk7XG5cbn0se1wiLi4vLi4vbW9kdWxlcy9fY29yZVwiOjE4MCxcIi4uLy4uL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWFycmF5XCI6MjYxfV0sNTY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzUwXVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi4vLi4vbW9kdWxlcy9fY29yZVwiOjc4LFwiLi4vLi4vbW9kdWxlcy9lczYuYXJyYXkuZnJvbVwiOjE0OSxcIi4uLy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvclwiOjE1OSxcImR1cFwiOjUwfV0sNTc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuX2RlcmVxXygnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5fZGVyZXFfKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbm1vZHVsZS5leHBvcnRzID0gX2RlcmVxXygnLi4vbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvcicpO1xuXG59LHtcIi4uL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3JcIjoxNDcsXCIuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3JcIjoxNTksXCIuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGVcIjoxNjd9XSw1ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5fZGVyZXFfKCcuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbl9kZXJlcV8oJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xubW9kdWxlLmV4cG9ydHMgPSBfZGVyZXFfKCcuLi9tb2R1bGVzL2NvcmUuaXMtaXRlcmFibGUnKTtcblxufSx7XCIuLi9tb2R1bGVzL2NvcmUuaXMtaXRlcmFibGVcIjoxNDgsXCIuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3JcIjoxNTksXCIuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGVcIjoxNjd9XSw1OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgY29yZSA9IF9kZXJlcV8oJy4uLy4uL21vZHVsZXMvX2NvcmUnKTtcbnZhciAkSlNPTiA9IGNvcmUuSlNPTiB8fCAoY29yZS5KU09OID0geyBzdHJpbmdpZnk6IEpTT04uc3RyaW5naWZ5IH0pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICByZXR1cm4gJEpTT04uc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmd1bWVudHMpO1xufTtcblxufSx7XCIuLi8uLi9tb2R1bGVzL19jb3JlXCI6Nzh9XSw2MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bNTFdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuLi8uLi9tb2R1bGVzL19jb3JlXCI6NzgsXCIuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduXCI6MTUxLFwiZHVwXCI6NTF9XSw2MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5fZGVyZXFfKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG52YXIgJE9iamVjdCA9IF9kZXJlcV8oJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZShQLCBEKSB7XG4gIHJldHVybiAkT2JqZWN0LmNyZWF0ZShQLCBEKTtcbn07XG5cbn0se1wiLi4vLi4vbW9kdWxlcy9fY29yZVwiOjc4LFwiLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZVwiOjE1Mn1dLDYyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbl9kZXJlcV8oJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnZhciAkT2JqZWN0ID0gX2RlcmVxXygnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYykge1xuICByZXR1cm4gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcbn07XG5cbn0se1wiLi4vLi4vbW9kdWxlcy9fY29yZVwiOjc4LFwiLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eVwiOjE1M31dLDYzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbl9kZXJlcV8oJy4uLy4uL21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IF9kZXJlcV8oJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3QuZW50cmllcztcblxufSx7XCIuLi8uLi9tb2R1bGVzL19jb3JlXCI6NzgsXCIuLi8uLi9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllc1wiOjE2MX1dLDY0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbl9kZXJlcV8oJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUnKTtcbm1vZHVsZS5leHBvcnRzID0gX2RlcmVxXygnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5mcmVlemU7XG5cbn0se1wiLi4vLi4vbW9kdWxlcy9fY29yZVwiOjc4LFwiLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZVwiOjE1NH1dLDY1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbl9kZXJlcV8oJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IF9kZXJlcV8oJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cbn0se1wiLi4vLi4vbW9kdWxlcy9fY29yZVwiOjc4LFwiLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2ZcIjoxNTV9XSw2NjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5fZGVyZXFfKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xubW9kdWxlLmV4cG9ydHMgPSBfZGVyZXFfKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LnNldFByb3RvdHlwZU9mO1xuXG59LHtcIi4uLy4uL21vZHVsZXMvX2NvcmVcIjo3OCxcIi4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mXCI6MTU2fV0sNjc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuX2RlcmVxXygnLi4vLi4vbW9kdWxlcy9lczcub2JqZWN0LnZhbHVlcycpO1xubW9kdWxlLmV4cG9ydHMgPSBfZGVyZXFfKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LnZhbHVlcztcblxufSx7XCIuLi8uLi9tb2R1bGVzL19jb3JlXCI6NzgsXCIuLi8uLi9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzXCI6MTYyfV0sNjg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzUyXVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi4vbW9kdWxlcy9fY29yZVwiOjc4LFwiLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZ1wiOjE1NyxcIi4uL21vZHVsZXMvZXM2LnByb21pc2VcIjoxNTgsXCIuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3JcIjoxNTksXCIuLi9tb2R1bGVzL2VzNy5wcm9taXNlLmZpbmFsbHlcIjoxNjMsXCIuLi9tb2R1bGVzL2VzNy5wcm9taXNlLnRyeVwiOjE2NCxcIi4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZVwiOjE2NyxcImR1cFwiOjUyfV0sNjk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzU0XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi4vLi4vbW9kdWxlcy9fY29yZVwiOjc4LFwiLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZ1wiOjE1NyxcIi4uLy4uL21vZHVsZXMvZXM2LnN5bWJvbFwiOjE2MCxcIi4uLy4uL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvclwiOjE2NSxcIi4uLy4uL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlXCI6MTY2LFwiZHVwXCI6NTR9XSw3MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5fZGVyZXFfKCcuLi8uLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbl9kZXJlcV8oJy4uLy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSBfZGVyZXFfKCcuLi8uLi9tb2R1bGVzL193a3MtZXh0JykuZignaXRlcmF0b3InKTtcblxufSx7XCIuLi8uLi9tb2R1bGVzL193a3MtZXh0XCI6MTQ0LFwiLi4vLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yXCI6MTU5LFwiLi4vLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlXCI6MTY3fV0sNzE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuXG59LHt9XSw3MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxufSx7fV0sNzM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIENvbnN0cnVjdG9yLCBuYW1lLCBmb3JiaWRkZW5GaWVsZCkge1xuICBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSB8fCAoZm9yYmlkZGVuRmllbGQgIT09IHVuZGVmaW5lZCAmJiBmb3JiaWRkZW5GaWVsZCBpbiBpdCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IobmFtZSArICc6IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICB9IHJldHVybiBpdDtcbn07XG5cbn0se31dLDc0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBpc09iamVjdCA9IF9kZXJlcV8oJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcblxufSx7XCIuL19pcy1vYmplY3RcIjo5OH1dLDc1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gX2RlcmVxXygnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gX2RlcmVxXygnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gX2RlcmVxXygnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuXG59LHtcIi4vX3RvLWFic29sdXRlLWluZGV4XCI6MTM2LFwiLi9fdG8taW9iamVjdFwiOjEzOCxcIi4vX3RvLWxlbmd0aFwiOjEzOX1dLDc2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gX2RlcmVxXygnLi9fY29mJyk7XG52YXIgVEFHID0gX2RlcmVxXygnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIEFSRyA9IGNvZihmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTtcblxufSx7XCIuL19jb2ZcIjo3NyxcIi4vX3drc1wiOjE0NX1dLDc3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcblxufSx7fV0sNzg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xudmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNS4zJyB9O1xuaWYgKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpIF9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxufSx7fV0sNzk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IF9kZXJlcV8oJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSBfZGVyZXFfKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgaW5kZXgsIHZhbHVlKSB7XG4gIGlmIChpbmRleCBpbiBvYmplY3QpICRkZWZpbmVQcm9wZXJ0eS5mKG9iamVjdCwgaW5kZXgsIGNyZWF0ZURlc2MoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbaW5kZXhdID0gdmFsdWU7XG59O1xuXG59LHtcIi4vX29iamVjdC1kcFwiOjExMSxcIi4vX3Byb3BlcnR5LWRlc2NcIjoxMjV9XSw4MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSBfZGVyZXFfKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG5cbn0se1wiLi9fYS1mdW5jdGlvblwiOjcxfV0sODE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcblxufSx7fV0sODI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhX2RlcmVxXygnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG5cbn0se1wiLi9fZmFpbHNcIjo4N31dLDgzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBpc09iamVjdCA9IF9kZXJlcV8oJy4vX2lzLW9iamVjdCcpO1xudmFyIGRvY3VtZW50ID0gX2RlcmVxXygnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuXG59LHtcIi4vX2dsb2JhbFwiOjg5LFwiLi9faXMtb2JqZWN0XCI6OTh9XSw4NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTtcblxufSx7fV0sODU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gYWxsIGVudW1lcmFibGUgb2JqZWN0IGtleXMsIGluY2x1ZGVzIHN5bWJvbHNcbnZhciBnZXRLZXlzID0gX2RlcmVxXygnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BTID0gX2RlcmVxXygnLi9fb2JqZWN0LWdvcHMnKTtcbnZhciBwSUUgPSBfZGVyZXFfKCcuL19vYmplY3QtcGllJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgcmVzdWx0ID0gZ2V0S2V5cyhpdCk7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICBpZiAoZ2V0U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdCk7XG4gICAgdmFyIGlzRW51bSA9IHBJRS5mO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChzeW1ib2xzLmxlbmd0aCA+IGkpIGlmIChpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcblxufSx7XCIuL19vYmplY3QtZ29wc1wiOjExNixcIi4vX29iamVjdC1rZXlzXCI6MTE5LFwiLi9fb2JqZWN0LXBpZVwiOjEyMH1dLDg2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBnbG9iYWwgPSBfZGVyZXFfKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gX2RlcmVxXygnLi9fY29yZScpO1xudmFyIGN0eCA9IF9kZXJlcV8oJy4vX2N0eCcpO1xudmFyIGhpZGUgPSBfZGVyZXFfKCcuL19oaWRlJyk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIHNvdXJjZSkge1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRjtcbiAgdmFyIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0Lkc7XG4gIHZhciBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TO1xuICB2YXIgSVNfUFJPVE8gPSB0eXBlICYgJGV4cG9ydC5QO1xuICB2YXIgSVNfQklORCA9IHR5cGUgJiAkZXhwb3J0LkI7XG4gIHZhciBJU19XUkFQID0gdHlwZSAmICRleHBvcnQuVztcbiAgdmFyIGV4cG9ydHMgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KTtcbiAgdmFyIGV4cFByb3RvID0gZXhwb3J0c1tQUk9UT1RZUEVdO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXTtcbiAgdmFyIGtleSwgb3duLCBvdXQ7XG4gIGlmIChJU19HTE9CQUwpIHNvdXJjZSA9IG5hbWU7XG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKG93biAmJiBrZXkgaW4gZXhwb3J0cykgY29udGludWU7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSBvd24gPyB0YXJnZXRba2V5XSA6IHNvdXJjZVtrZXldO1xuICAgIC8vIHByZXZlbnQgZ2xvYmFsIHBvbGx1dGlvbiBmb3IgbmFtZXNwYWNlc1xuICAgIGV4cG9ydHNba2V5XSA9IElTX0dMT0JBTCAmJiB0eXBlb2YgdGFyZ2V0W2tleV0gIT0gJ2Z1bmN0aW9uJyA/IHNvdXJjZVtrZXldXG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICA6IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKVxuICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2UgdGhlbSBpbiBsaWJyYXJ5XG4gICAgOiBJU19XUkFQICYmIHRhcmdldFtrZXldID09IG91dCA/IChmdW5jdGlvbiAoQykge1xuICAgICAgdmFyIEYgPSBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEMpIHtcbiAgICAgICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDKCk7XG4gICAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQyhhKTtcbiAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDKGEsIGIpO1xuICAgICAgICAgIH0gcmV0dXJuIG5ldyBDKGEsIGIsIGMpO1xuICAgICAgICB9IHJldHVybiBDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuICAgICAgcmV0dXJuIEY7XG4gICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG4gICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5tZXRob2RzLiVOQU1FJVxuICAgIGlmIChJU19QUk9UTykge1xuICAgICAgKGV4cG9ydHMudmlydHVhbCB8fCAoZXhwb3J0cy52aXJ0dWFsID0ge30pKVtrZXldID0gb3V0O1xuICAgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLnByb3RvdHlwZS4lTkFNRSVcbiAgICAgIGlmICh0eXBlICYgJGV4cG9ydC5SICYmIGV4cFByb3RvICYmICFleHBQcm90b1trZXldKSBoaWRlKGV4cFByb3RvLCBrZXksIG91dCk7XG4gICAgfVxuICB9XG59O1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuXG59LHtcIi4vX2NvcmVcIjo3OCxcIi4vX2N0eFwiOjgwLFwiLi9fZ2xvYmFsXCI6ODksXCIuL19oaWRlXCI6OTF9XSw4NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbn0se31dLDg4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBjdHggPSBfZGVyZXFfKCcuL19jdHgnKTtcbnZhciBjYWxsID0gX2RlcmVxXygnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSBfZGVyZXFfKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgYW5PYmplY3QgPSBfZGVyZXFfKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IF9kZXJlcV8oJy4vX3RvLWxlbmd0aCcpO1xudmFyIGdldEl0ZXJGbiA9IF9kZXJlcV8oJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgQlJFQUsgPSB7fTtcbnZhciBSRVRVUk4gPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUikge1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSk7XG4gIHZhciBmID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmIChpc0FycmF5SXRlcihpdGVyRm4pKSBmb3IgKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOykge1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47XG5cbn0se1wiLi9fYW4tb2JqZWN0XCI6NzQsXCIuL19jdHhcIjo4MCxcIi4vX2lzLWFycmF5LWl0ZXJcIjo5NixcIi4vX2l0ZXItY2FsbFwiOjk5LFwiLi9fdG8tbGVuZ3RoXCI6MTM5LFwiLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2RcIjoxNDZ9XSw4OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZiAodHlwZW9mIF9fZyA9PSAnbnVtYmVyJykgX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbn0se31dLDkwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG5cbn0se31dLDkxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBkUCA9IF9kZXJlcV8oJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSBfZGVyZXFfKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IF9kZXJlcV8oJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcblxufSx7XCIuL19kZXNjcmlwdG9yc1wiOjgyLFwiLi9fb2JqZWN0LWRwXCI6MTExLFwiLi9fcHJvcGVydHktZGVzY1wiOjEyNX1dLDkyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBkb2N1bWVudCA9IF9kZXJlcV8oJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbn0se1wiLi9fZ2xvYmFsXCI6ODl9XSw5MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9ICFfZGVyZXFfKCcuL19kZXNjcmlwdG9ycycpICYmICFfZGVyZXFfKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZGVyZXFfKCcuL19kb20tY3JlYXRlJykoJ2RpdicpLCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuXG59LHtcIi4vX2Rlc2NyaXB0b3JzXCI6ODIsXCIuL19kb20tY3JlYXRlXCI6ODMsXCIuL19mYWlsc1wiOjg3fV0sOTQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gZmFzdCBhcHBseSwgaHR0cDovL2pzcGVyZi5sbmtpdC5jb20vZmFzdC1hcHBseS81XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgYXJncywgdGhhdCkge1xuICB2YXIgdW4gPSB0aGF0ID09PSB1bmRlZmluZWQ7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiB1biA/IGZuKClcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCk7XG4gICAgY2FzZSAxOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgY2FzZSA0OiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgfSByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJncyk7XG59O1xuXG59LHt9XSw5NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IF9kZXJlcV8oJy4vX2NvZicpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuXG59LHtcIi4vX2NvZlwiOjc3fV0sOTY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyA9IF9kZXJlcV8oJy4vX2l0ZXJhdG9ycycpO1xudmFyIElURVJBVE9SID0gX2RlcmVxXygnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07XG5cbn0se1wiLi9faXRlcmF0b3JzXCI6MTA0LFwiLi9fd2tzXCI6MTQ1fV0sOTc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbnZhciBjb2YgPSBfZGVyZXFfKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICByZXR1cm4gY29mKGFyZykgPT0gJ0FycmF5Jztcbn07XG5cbn0se1wiLi9fY29mXCI6Nzd9XSw5ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcblxufSx7fV0sOTk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gX2RlcmVxXygnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG5cbn0se1wiLi9fYW4tb2JqZWN0XCI6NzR9XSwxMDA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSA9IF9kZXJlcV8oJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBkZXNjcmlwdG9yID0gX2RlcmVxXygnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gX2RlcmVxXygnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxuX2RlcmVxXygnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCBfZGVyZXFfKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG5cbn0se1wiLi9faGlkZVwiOjkxLFwiLi9fb2JqZWN0LWNyZWF0ZVwiOjExMCxcIi4vX3Byb3BlcnR5LWRlc2NcIjoxMjUsXCIuL19zZXQtdG8tc3RyaW5nLXRhZ1wiOjEzMCxcIi4vX3drc1wiOjE0NX1dLDEwMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSA9IF9kZXJlcV8oJy4vX2xpYnJhcnknKTtcbnZhciAkZXhwb3J0ID0gX2RlcmVxXygnLi9fZXhwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSBfZGVyZXFfKCcuL19yZWRlZmluZScpO1xudmFyIGhpZGUgPSBfZGVyZXFfKCcuL19oaWRlJyk7XG52YXIgaGFzID0gX2RlcmVxXygnLi9faGFzJyk7XG52YXIgSXRlcmF0b3JzID0gX2RlcmVxXygnLi9faXRlcmF0b3JzJyk7XG52YXIgJGl0ZXJDcmVhdGUgPSBfZGVyZXFfKCcuL19pdGVyLWNyZWF0ZScpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gX2RlcmVxXygnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IF9kZXJlcV8oJy4vX29iamVjdC1ncG8nKTtcbnZhciBJVEVSQVRPUiA9IF9kZXJlcV8oJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpOyAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG52YXIgRkZfSVRFUkFUT1IgPSAnQEBpdGVyYXRvcic7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgJGl0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24gKGtpbmQpIHtcbiAgICBpZiAoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pIHJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTO1xuICB2YXIgVkFMVUVTX0JVRyA9IGZhbHNlO1xuICB2YXIgcHJvdG8gPSBCYXNlLnByb3RvdHlwZTtcbiAgdmFyICRuYXRpdmUgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF07XG4gIHZhciAkZGVmYXVsdCA9ICghQlVHR1kgJiYgJG5hdGl2ZSkgfHwgZ2V0TWV0aG9kKERFRkFVTFQpO1xuICB2YXIgJGVudHJpZXMgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkO1xuICB2YXIgJGFueU5hdGl2ZSA9IE5BTUUgPT0gJ0FycmF5JyA/IHByb3RvLmVudHJpZXMgfHwgJG5hdGl2ZSA6ICRuYXRpdmU7XG4gIHZhciBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmICgkYW55TmF0aXZlKSB7XG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuICAgICAgaWYgKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSkgaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghTElCUkFSWSB8fCBGT1JDRUQpICYmIChCVUdHWSB8fCBWQUxVRVNfQlVHIHx8ICFwcm90b1tJVEVSQVRPUl0pKSB7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSA9IHJldHVyblRoaXM7XG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKGtleSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoIShrZXkgaW4gcHJvdG8pKSByZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuXG59LHtcIi4vX2V4cG9ydFwiOjg2LFwiLi9faGFzXCI6OTAsXCIuL19oaWRlXCI6OTEsXCIuL19pdGVyLWNyZWF0ZVwiOjEwMCxcIi4vX2l0ZXJhdG9yc1wiOjEwNCxcIi4vX2xpYnJhcnlcIjoxMDUsXCIuL19vYmplY3QtZ3BvXCI6MTE3LFwiLi9fcmVkZWZpbmVcIjoxMjcsXCIuL19zZXQtdG8tc3RyaW5nLXRhZ1wiOjEzMCxcIi4vX3drc1wiOjE0NX1dLDEwMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgSVRFUkFUT1IgPSBfZGVyZXFfKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbiAoKSB7IFNBRkVfQ0xPU0lORyA9IHRydWU7IH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gIEFycmF5LmZyb20ocml0ZXIsIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgc2tpcENsb3NpbmcpIHtcbiAgaWYgKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IFs3XTtcbiAgICB2YXIgaXRlciA9IGFycltJVEVSQVRPUl0oKTtcbiAgICBpdGVyLm5leHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB7IGRvbmU6IHNhZmUgPSB0cnVlIH07IH07XG4gICAgYXJyW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXI7IH07XG4gICAgZXhlYyhhcnIpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59O1xuXG59LHtcIi4vX3drc1wiOjE0NX1dLDEwMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkb25lLCB2YWx1ZSkge1xuICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZSB9O1xufTtcblxufSx7fV0sMTA0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzID0ge307XG5cbn0se31dLDEwNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IHRydWU7XG5cbn0se31dLDEwNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgTUVUQSA9IF9kZXJlcV8oJy4vX3VpZCcpKCdtZXRhJyk7XG52YXIgaXNPYmplY3QgPSBfZGVyZXFfKCcuL19pcy1vYmplY3QnKTtcbnZhciBoYXMgPSBfZGVyZXFfKCcuL19oYXMnKTtcbnZhciBzZXREZXNjID0gX2RlcmVxXygnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBpZCA9IDA7XG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBGUkVFWkUgPSAhX2RlcmVxXygnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7XG59KTtcbnZhciBzZXRNZXRhID0gZnVuY3Rpb24gKGl0KSB7XG4gIHNldERlc2MoaXQsIE1FVEEsIHsgdmFsdWU6IHtcbiAgICBpOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSURcbiAgICB3OiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IH0pO1xufTtcbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgLy8gcmV0dXJuIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFoYXMoaXQsIE1FVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiAnRic7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gb2JqZWN0IElEXG4gIH0gcmV0dXJuIGl0W01FVEFdLmk7XG59O1xudmFyIGdldFdlYWsgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICBpZiAoIWhhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuIHRydWU7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBoYXNoIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gcmV0dXJuIGl0W01FVEFdLnc7XG59O1xuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaRSAmJiBtZXRhLk5FRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBKSkgc2V0TWV0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBLRVk6IE1FVEEsXG4gIE5FRUQ6IGZhbHNlLFxuICBmYXN0S2V5OiBmYXN0S2V5LFxuICBnZXRXZWFrOiBnZXRXZWFrLFxuICBvbkZyZWV6ZTogb25GcmVlemVcbn07XG5cbn0se1wiLi9fZmFpbHNcIjo4NyxcIi4vX2hhc1wiOjkwLFwiLi9faXMtb2JqZWN0XCI6OTgsXCIuL19vYmplY3QtZHBcIjoxMTEsXCIuL191aWRcIjoxNDJ9XSwxMDc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsb2JhbCA9IF9kZXJlcV8oJy4vX2dsb2JhbCcpO1xudmFyIG1hY3JvdGFzayA9IF9kZXJlcV8oJy4vX3Rhc2snKS5zZXQ7XG52YXIgT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xudmFyIGlzTm9kZSA9IF9kZXJlcV8oJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoaGVhZCkge1xuICAgICAgZm4gPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBOb2RlLmpzXG4gIGlmIChpc05vZGUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgU2FmYXJpIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICB9IGVsc2UgaWYgKE9ic2VydmVyICYmICEoZ2xvYmFsLm5hdmlnYXRvciAmJiBnbG9iYWwubmF2aWdhdG9yLnN0YW5kYWxvbmUpKSB7XG4gICAgdmFyIHRvZ2dsZSA9IHRydWU7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb21pc2UudGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gICAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYgKCFoZWFkKSB7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59O1xuXG59LHtcIi4vX2NvZlwiOjc3LFwiLi9fZ2xvYmFsXCI6ODksXCIuL190YXNrXCI6MTM1fV0sMTA4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0Jztcbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG52YXIgYUZ1bmN0aW9uID0gX2RlcmVxXygnLi9fYS1mdW5jdGlvbicpO1xuXG5mdW5jdGlvbiBQcm9taXNlQ2FwYWJpbGl0eShDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcblxufSx7XCIuL19hLWZ1bmN0aW9uXCI6NzF9XSwxMDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyIGdldEtleXMgPSBfZGVyZXFfKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSBfZGVyZXFfKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IF9kZXJlcV8oJy4vX29iamVjdC1waWUnKTtcbnZhciB0b09iamVjdCA9IF9kZXJlcV8oJy4vX3RvLW9iamVjdCcpO1xudmFyIElPYmplY3QgPSBfZGVyZXFfKCcuL19pb2JqZWN0Jyk7XG52YXIgJGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCBfZGVyZXFfKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBTID0gU3ltYm9sKCk7XG4gIHZhciBLID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtTXSA9IDc7XG4gIEsuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGspIHsgQltrXSA9IGs7IH0pO1xuICByZXR1cm4gJGFzc2lnbih7fSwgQSlbU10gIT0gNyB8fCBPYmplY3Qua2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gSztcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICB2YXIgaXNFbnVtID0gcElFLmY7XG4gIHdoaWxlIChhTGVuID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IElPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldFN5bWJvbHMgPyBnZXRLZXlzKFMpLmNvbmNhdChnZXRTeW1ib2xzKFMpKSA6IGdldEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSBpZiAoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSkgVFtrZXldID0gU1trZXldO1xuICB9IHJldHVybiBUO1xufSA6ICRhc3NpZ247XG5cbn0se1wiLi9fZmFpbHNcIjo4NyxcIi4vX2lvYmplY3RcIjo5NSxcIi4vX29iamVjdC1nb3BzXCI6MTE2LFwiLi9fb2JqZWN0LWtleXNcIjoxMTksXCIuL19vYmplY3QtcGllXCI6MTIwLFwiLi9fdG8tb2JqZWN0XCI6MTQwfV0sMTEwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ID0gX2RlcmVxXygnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZFBzID0gX2RlcmVxXygnLi9fb2JqZWN0LWRwcycpO1xudmFyIGVudW1CdWdLZXlzID0gX2RlcmVxXygnLi9fZW51bS1idWcta2V5cycpO1xudmFyIElFX1BST1RPID0gX2RlcmVxXygnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIEVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IF9kZXJlcV8oJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJyk7XG4gIHZhciBpID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgX2RlcmVxXygnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChpLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcblxufSx7XCIuL19hbi1vYmplY3RcIjo3NCxcIi4vX2RvbS1jcmVhdGVcIjo4MyxcIi4vX2VudW0tYnVnLWtleXNcIjo4NCxcIi4vX2h0bWxcIjo5MixcIi4vX29iamVjdC1kcHNcIjoxMTIsXCIuL19zaGFyZWQta2V5XCI6MTMxfV0sMTExOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBhbk9iamVjdCA9IF9kZXJlcV8oJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gX2RlcmVxXygnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IF9kZXJlcV8oJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSBfZGVyZXFfKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG5cbn0se1wiLi9fYW4tb2JqZWN0XCI6NzQsXCIuL19kZXNjcmlwdG9yc1wiOjgyLFwiLi9faWU4LWRvbS1kZWZpbmVcIjo5MyxcIi4vX3RvLXByaW1pdGl2ZVwiOjE0MX1dLDExMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgZFAgPSBfZGVyZXFfKCcuL19vYmplY3QtZHAnKTtcbnZhciBhbk9iamVjdCA9IF9kZXJlcV8oJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldEtleXMgPSBfZGVyZXFfKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IF9kZXJlcV8oJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBnZXRLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpID0gMDtcbiAgdmFyIFA7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07XG5cbn0se1wiLi9fYW4tb2JqZWN0XCI6NzQsXCIuL19kZXNjcmlwdG9yc1wiOjgyLFwiLi9fb2JqZWN0LWRwXCI6MTExLFwiLi9fb2JqZWN0LWtleXNcIjoxMTl9XSwxMTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xudmFyIHBJRSA9IF9kZXJlcV8oJy4vX29iamVjdC1waWUnKTtcbnZhciBjcmVhdGVEZXNjID0gX2RlcmVxXygnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHRvSU9iamVjdCA9IF9kZXJlcV8oJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IF9kZXJlcV8oJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IF9kZXJlcV8oJy4vX2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gX2RlcmVxXygnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gX2RlcmVxXygnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZ09QRChPLCBQKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVEZXNjKCFwSUUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG5cbn0se1wiLi9fZGVzY3JpcHRvcnNcIjo4MixcIi4vX2hhc1wiOjkwLFwiLi9faWU4LWRvbS1kZWZpbmVcIjo5MyxcIi4vX29iamVjdC1waWVcIjoxMjAsXCIuL19wcm9wZXJ0eS1kZXNjXCI6MTI1LFwiLi9fdG8taW9iamVjdFwiOjEzOCxcIi4vX3RvLXByaW1pdGl2ZVwiOjE0MX1dLDExNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG52YXIgdG9JT2JqZWN0ID0gX2RlcmVxXygnLi9fdG8taW9iamVjdCcpO1xudmFyIGdPUE4gPSBfZGVyZXFfKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiBnT1BOKGl0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xufTtcblxufSx7XCIuL19vYmplY3QtZ29wblwiOjExNSxcIi4vX3RvLWlvYmplY3RcIjoxMzh9XSwxMTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxudmFyICRrZXlzID0gX2RlcmVxXygnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBoaWRkZW5LZXlzID0gX2RlcmVxXygnLi9fZW51bS1idWcta2V5cycpLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGhpZGRlbktleXMpO1xufTtcblxufSx7XCIuL19lbnVtLWJ1Zy1rZXlzXCI6ODQsXCIuL19vYmplY3Qta2V5cy1pbnRlcm5hbFwiOjExOH1dLDExNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG59LHt9XSwxMTc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgPSBfZGVyZXFfKCcuL19oYXMnKTtcbnZhciB0b09iamVjdCA9IF9kZXJlcV8oJy4vX3RvLW9iamVjdCcpO1xudmFyIElFX1BST1RPID0gX2RlcmVxXygnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKE8pIHtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07XG5cbn0se1wiLi9faGFzXCI6OTAsXCIuL19zaGFyZWQta2V5XCI6MTMxLFwiLi9fdG8tb2JqZWN0XCI6MTQwfV0sMTE4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBoYXMgPSBfZGVyZXFfKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSBfZGVyZXFfKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gX2RlcmVxXygnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSBfZGVyZXFfKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG59LHtcIi4vX2FycmF5LWluY2x1ZGVzXCI6NzUsXCIuL19oYXNcIjo5MCxcIi4vX3NoYXJlZC1rZXlcIjoxMzEsXCIuL190by1pb2JqZWN0XCI6MTM4fV0sMTE5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzID0gX2RlcmVxXygnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IF9kZXJlcV8oJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG5cbn0se1wiLi9fZW51bS1idWcta2V5c1wiOjg0LFwiLi9fb2JqZWN0LWtleXMtaW50ZXJuYWxcIjoxMTh9XSwxMjA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbn0se31dLDEyMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcbnZhciAkZXhwb3J0ID0gX2RlcmVxXygnLi9fZXhwb3J0Jyk7XG52YXIgY29yZSA9IF9kZXJlcV8oJy4vX2NvcmUnKTtcbnZhciBmYWlscyA9IF9kZXJlcV8oJy4vX2ZhaWxzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGV4ZWMpIHtcbiAgdmFyIGZuID0gKGNvcmUuT2JqZWN0IHx8IHt9KVtLRVldIHx8IE9iamVjdFtLRVldO1xuICB2YXIgZXhwID0ge307XG4gIGV4cFtLRVldID0gZXhlYyhmbik7XG4gICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkgeyBmbigxKTsgfSksICdPYmplY3QnLCBleHApO1xufTtcblxufSx7XCIuL19jb3JlXCI6NzgsXCIuL19leHBvcnRcIjo4NixcIi4vX2ZhaWxzXCI6ODd9XSwxMjI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdldEtleXMgPSBfZGVyZXFfKCcuL19vYmplY3Qta2V5cycpO1xudmFyIHRvSU9iamVjdCA9IF9kZXJlcV8oJy4vX3RvLWlvYmplY3QnKTtcbnZhciBpc0VudW0gPSBfZGVyZXFfKCcuL19vYmplY3QtcGllJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlzRW50cmllcykge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QoaXQpO1xuICAgIHZhciBrZXlzID0gZ2V0S2V5cyhPKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSBpZiAoaXNFbnVtLmNhbGwoTywga2V5ID0ga2V5c1tpKytdKSkge1xuICAgICAgcmVzdWx0LnB1c2goaXNFbnRyaWVzID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcblxufSx7XCIuL19vYmplY3Qta2V5c1wiOjExOSxcIi4vX29iamVjdC1waWVcIjoxMjAsXCIuL190by1pb2JqZWN0XCI6MTM4fV0sMTIzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG5cbn0se31dLDEyNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgYW5PYmplY3QgPSBfZGVyZXFfKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IF9kZXJlcV8oJy4vX2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gX2RlcmVxXygnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuXG59LHtcIi4vX2FuLW9iamVjdFwiOjc0LFwiLi9faXMtb2JqZWN0XCI6OTgsXCIuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5XCI6MTA4fV0sMTI1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG5cbn0se31dLDEyNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgaGlkZSA9IF9kZXJlcV8oJy4vX2hpZGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBzYWZlKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBpZiAoc2FmZSAmJiB0YXJnZXRba2V5XSkgdGFyZ2V0W2tleV0gPSBzcmNba2V5XTtcbiAgICBlbHNlIGhpZGUodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgfSByZXR1cm4gdGFyZ2V0O1xufTtcblxufSx7XCIuL19oaWRlXCI6OTF9XSwxMjc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHMgPSBfZGVyZXFfKCcuL19oaWRlJyk7XG5cbn0se1wiLi9faGlkZVwiOjkxfV0sMTI4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbnZhciBpc09iamVjdCA9IF9kZXJlcV8oJy4vX2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gX2RlcmVxXygnLi9fYW4tb2JqZWN0Jyk7XG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoTywgcHJvdG8pIHtcbiAgYW5PYmplY3QoTyk7XG4gIGlmICghaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKSB0aHJvdyBUeXBlRXJyb3IocHJvdG8gKyBcIjogY2FuJ3Qgc2V0IGFzIHByb3RvdHlwZSFcIik7XG59O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmdW5jdGlvbiAodGVzdCwgYnVnZ3ksIHNldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0ID0gX2RlcmVxXygnLi9fY3R4JykoRnVuY3Rpb24uY2FsbCwgX2RlcmVxXygnLi9fb2JqZWN0LWdvcGQnKS5mKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgYnVnZ3kgPSB0cnVlOyB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZiAoYnVnZ3kpIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgICAgIGVsc2Ugc2V0KE8sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIE87XG4gICAgICB9O1xuICAgIH0oe30sIGZhbHNlKSA6IHVuZGVmaW5lZCksXG4gIGNoZWNrOiBjaGVja1xufTtcblxufSx7XCIuL19hbi1vYmplY3RcIjo3NCxcIi4vX2N0eFwiOjgwLFwiLi9faXMtb2JqZWN0XCI6OTgsXCIuL19vYmplY3QtZ29wZFwiOjExM31dLDEyOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gX2RlcmVxXygnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IF9kZXJlcV8oJy4vX2NvcmUnKTtcbnZhciBkUCA9IF9kZXJlcV8oJy4vX29iamVjdC1kcCcpO1xudmFyIERFU0NSSVBUT1JTID0gX2RlcmVxXygnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBTUEVDSUVTID0gX2RlcmVxXygnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciBDID0gdHlwZW9mIGNvcmVbS0VZXSA9PSAnZnVuY3Rpb24nID8gY29yZVtLRVldIDogZ2xvYmFsW0tFWV07XG4gIGlmIChERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKSBkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcblxufSx7XCIuL19jb3JlXCI6NzgsXCIuL19kZXNjcmlwdG9yc1wiOjgyLFwiLi9fZ2xvYmFsXCI6ODksXCIuL19vYmplY3QtZHBcIjoxMTEsXCIuL193a3NcIjoxNDV9XSwxMzA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xudmFyIGRlZiA9IF9kZXJlcV8oJy4vX29iamVjdC1kcCcpLmY7XG52YXIgaGFzID0gX2RlcmVxXygnLi9faGFzJyk7XG52YXIgVEFHID0gX2RlcmVxXygnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCB0YWcsIHN0YXQpIHtcbiAgaWYgKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpIGRlZihpdCwgVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZyB9KTtcbn07XG5cbn0se1wiLi9faGFzXCI6OTAsXCIuL19vYmplY3QtZHBcIjoxMTEsXCIuL193a3NcIjoxNDV9XSwxMzE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xudmFyIHNoYXJlZCA9IF9kZXJlcV8oJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gX2RlcmVxXygnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG5cbn0se1wiLi9fc2hhcmVkXCI6MTMyLFwiLi9fdWlkXCI6MTQyfV0sMTMyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBnbG9iYWwgPSBfZGVyZXFfKCcuL19nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcbn07XG5cbn0se1wiLi9fZ2xvYmFsXCI6ODl9XSwxMzM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgPSBfZGVyZXFfKCcuL19hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSBfZGVyZXFfKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgU1BFQ0lFUyA9IF9kZXJlcV8oJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBEKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59O1xuXG59LHtcIi4vX2EtZnVuY3Rpb25cIjo3MSxcIi4vX2FuLW9iamVjdFwiOjc0LFwiLi9fd2tzXCI6MTQ1fV0sMTM0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciB0b0ludGVnZXIgPSBfZGVyZXFfKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IF9kZXJlcV8oJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBwb3MpIHtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgICB2YXIgaSA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBsID0gcy5sZW5ndGg7XG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gbCkgcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG5cbn0se1wiLi9fZGVmaW5lZFwiOjgxLFwiLi9fdG8taW50ZWdlclwiOjEzN31dLDEzNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgY3R4ID0gX2RlcmVxXygnLi9fY3R4Jyk7XG52YXIgaW52b2tlID0gX2RlcmVxXygnLi9faW52b2tlJyk7XG52YXIgaHRtbCA9IF9kZXJlcV8oJy4vX2h0bWwnKTtcbnZhciBjZWwgPSBfZGVyZXFfKCcuL19kb20tY3JlYXRlJyk7XG52YXIgZ2xvYmFsID0gX2RlcmVxXygnLi9fZ2xvYmFsJyk7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHNldFRhc2sgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyVGFzayA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spIHtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKF9kZXJlcV8oJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07XG5cbn0se1wiLi9fY29mXCI6NzcsXCIuL19jdHhcIjo4MCxcIi4vX2RvbS1jcmVhdGVcIjo4MyxcIi4vX2dsb2JhbFwiOjg5LFwiLi9faHRtbFwiOjkyLFwiLi9faW52b2tlXCI6OTR9XSwxMzY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xudmFyIHRvSW50ZWdlciA9IF9kZXJlcV8oJy4vX3RvLWludGVnZXInKTtcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcbn07XG5cbn0se1wiLi9fdG8taW50ZWdlclwiOjEzN31dLDEzNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTtcblxufSx7fV0sMTM4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSBfZGVyZXFfKCcuL19pb2JqZWN0Jyk7XG52YXIgZGVmaW5lZCA9IF9kZXJlcV8oJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG5cbn0se1wiLi9fZGVmaW5lZFwiOjgxLFwiLi9faW9iamVjdFwiOjk1fV0sMTM5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IF9kZXJlcV8oJy4vX3RvLWludGVnZXInKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuXG59LHtcIi4vX3RvLWludGVnZXJcIjoxMzd9XSwxNDA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSBfZGVyZXFfKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG5cbn0se1wiLi9fZGVmaW5lZFwiOjgxfV0sMTQxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gX2RlcmVxXygnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcblxufSx7XCIuL19pcy1vYmplY3RcIjo5OH1dLDE0MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcblxufSx7fV0sMTQzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBnbG9iYWwgPSBfZGVyZXFfKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gX2RlcmVxXygnLi9fY29yZScpO1xudmFyIExJQlJBUlkgPSBfZGVyZXFfKCcuL19saWJyYXJ5Jyk7XG52YXIgd2tzRXh0ID0gX2RlcmVxXygnLi9fd2tzLWV4dCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gX2RlcmVxXygnLi9fb2JqZWN0LWRwJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyICRTeW1ib2wgPSBjb3JlLlN5bWJvbCB8fCAoY29yZS5TeW1ib2wgPSBMSUJSQVJZID8ge30gOiBnbG9iYWwuU3ltYm9sIHx8IHt9KTtcbiAgaWYgKG5hbWUuY2hhckF0KDApICE9ICdfJyAmJiAhKG5hbWUgaW4gJFN5bWJvbCkpIGRlZmluZVByb3BlcnR5KCRTeW1ib2wsIG5hbWUsIHsgdmFsdWU6IHdrc0V4dC5mKG5hbWUpIH0pO1xufTtcblxufSx7XCIuL19jb3JlXCI6NzgsXCIuL19nbG9iYWxcIjo4OSxcIi4vX2xpYnJhcnlcIjoxMDUsXCIuL19vYmplY3QtZHBcIjoxMTEsXCIuL193a3MtZXh0XCI6MTQ0fV0sMTQ0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmV4cG9ydHMuZiA9IF9kZXJlcV8oJy4vX3drcycpO1xuXG59LHtcIi4vX3drc1wiOjE0NX1dLDE0NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgc3RvcmUgPSBfZGVyZXFfKCcuL19zaGFyZWQnKSgnd2tzJyk7XG52YXIgdWlkID0gX2RlcmVxXygnLi9fdWlkJyk7XG52YXIgU3ltYm9sID0gX2RlcmVxXygnLi9fZ2xvYmFsJykuU3ltYm9sO1xudmFyIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG5cbn0se1wiLi9fZ2xvYmFsXCI6ODksXCIuL19zaGFyZWRcIjoxMzIsXCIuL191aWRcIjoxNDJ9XSwxNDY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xudmFyIGNsYXNzb2YgPSBfZGVyZXFfKCcuL19jbGFzc29mJyk7XG52YXIgSVRFUkFUT1IgPSBfZGVyZXFfKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBJdGVyYXRvcnMgPSBfZGVyZXFfKCcuL19pdGVyYXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzID0gX2RlcmVxXygnLi9fY29yZScpLmdldEl0ZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG5cbn0se1wiLi9fY2xhc3NvZlwiOjc2LFwiLi9fY29yZVwiOjc4LFwiLi9faXRlcmF0b3JzXCI6MTA0LFwiLi9fd2tzXCI6MTQ1fV0sMTQ3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBhbk9iamVjdCA9IF9kZXJlcV8oJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldCA9IF9kZXJlcV8oJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5tb2R1bGUuZXhwb3J0cyA9IF9kZXJlcV8oJy4vX2NvcmUnKS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXRlckZuID0gZ2V0KGl0KTtcbiAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIHJldHVybiBhbk9iamVjdChpdGVyRm4uY2FsbChpdCkpO1xufTtcblxufSx7XCIuL19hbi1vYmplY3RcIjo3NCxcIi4vX2NvcmVcIjo3OCxcIi4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kXCI6MTQ2fV0sMTQ4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBjbGFzc29mID0gX2RlcmVxXygnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gX2RlcmVxXygnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gX2RlcmVxXygnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IF9kZXJlcV8oJy4vX2NvcmUnKS5pc0l0ZXJhYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPID0gT2JqZWN0KGl0KTtcbiAgcmV0dXJuIE9bSVRFUkFUT1JdICE9PSB1bmRlZmluZWRcbiAgICB8fCAnQEBpdGVyYXRvcicgaW4gT1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICB8fCBJdGVyYXRvcnMuaGFzT3duUHJvcGVydHkoY2xhc3NvZihPKSk7XG59O1xuXG59LHtcIi4vX2NsYXNzb2ZcIjo3NixcIi4vX2NvcmVcIjo3OCxcIi4vX2l0ZXJhdG9yc1wiOjEwNCxcIi4vX3drc1wiOjE0NX1dLDE0OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG52YXIgY3R4ID0gX2RlcmVxXygnLi9fY3R4Jyk7XG52YXIgJGV4cG9ydCA9IF9kZXJlcV8oJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gX2RlcmVxXygnLi9fdG8tb2JqZWN0Jyk7XG52YXIgY2FsbCA9IF9kZXJlcV8oJy4vX2l0ZXItY2FsbCcpO1xudmFyIGlzQXJyYXlJdGVyID0gX2RlcmVxXygnLi9faXMtYXJyYXktaXRlcicpO1xudmFyIHRvTGVuZ3RoID0gX2RlcmVxXygnLi9fdG8tbGVuZ3RoJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSBfZGVyZXFfKCcuL19jcmVhdGUtcHJvcGVydHknKTtcbnZhciBnZXRJdGVyRm4gPSBfZGVyZXFfKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFfZGVyZXFfKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uIChpdGVyKSB7IEFycmF5LmZyb20oaXRlcik7IH0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4xIEFycmF5LmZyb20oYXJyYXlMaWtlLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgZnJvbTogZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3QoYXJyYXlMaWtlKTtcbiAgICB2YXIgQyA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXk7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBtYXBmbiA9IGFMZW4gPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBpdGVyRm4gPSBnZXRJdGVyRm4oTyk7XG4gICAgdmFyIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvcjtcbiAgICBpZiAobWFwcGluZykgbWFwZm4gPSBjdHgobWFwZm4sIGFMZW4gPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgICAvLyBpZiBvYmplY3QgaXNuJ3QgaXRlcmFibGUgb3IgaXQncyBhcnJheSB3aXRoIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2Ugc2ltcGxlIGNhc2VcbiAgICBpZiAoaXRlckZuICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXIoaXRlckZuKSkpIHtcbiAgICAgIGZvciAoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChPKSwgcmVzdWx0ID0gbmV3IEMoKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyBpbmRleCsrKSB7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBjYWxsKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSkgOiBzdGVwLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgICAgZm9yIChyZXN1bHQgPSBuZXcgQyhsZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0Lmxlbmd0aCA9IGluZGV4O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuXG59LHtcIi4vX2NyZWF0ZS1wcm9wZXJ0eVwiOjc5LFwiLi9fY3R4XCI6ODAsXCIuL19leHBvcnRcIjo4NixcIi4vX2lzLWFycmF5LWl0ZXJcIjo5NixcIi4vX2l0ZXItY2FsbFwiOjk5LFwiLi9faXRlci1kZXRlY3RcIjoxMDIsXCIuL190by1sZW5ndGhcIjoxMzksXCIuL190by1vYmplY3RcIjoxNDAsXCIuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZFwiOjE0Nn1dLDE1MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9kZXJlcV8oJy4vX2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIHN0ZXAgPSBfZGVyZXFfKCcuL19pdGVyLXN0ZXAnKTtcbnZhciBJdGVyYXRvcnMgPSBfZGVyZXFfKCcuL19pdGVyYXRvcnMnKTtcbnZhciB0b0lPYmplY3QgPSBfZGVyZXFfKCcuL190by1pb2JqZWN0Jyk7XG5cbi8vIDIyLjEuMy40IEFycmF5LnByb3RvdHlwZS5lbnRyaWVzKClcbi8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpXG4vLyAyMi4xLjMuMjkgQXJyYXkucHJvdG90eXBlLnZhbHVlcygpXG4vLyAyMi4xLjMuMzAgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbm1vZHVsZS5leHBvcnRzID0gX2RlcmVxXygnLi9faXRlci1kZWZpbmUnKShBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBraW5kID0gdGhpcy5faztcbiAgdmFyIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZiAoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpIHtcbiAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBzdGVwKDEpO1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuXG59LHtcIi4vX2FkZC10by11bnNjb3BhYmxlc1wiOjcyLFwiLi9faXRlci1kZWZpbmVcIjoxMDEsXCIuL19pdGVyLXN0ZXBcIjoxMDMsXCIuL19pdGVyYXRvcnNcIjoxMDQsXCIuL190by1pb2JqZWN0XCI6MTM4fV0sMTUxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIDE5LjEuMy4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpXG52YXIgJGV4cG9ydCA9IF9kZXJlcV8oJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiwgJ09iamVjdCcsIHsgYXNzaWduOiBfZGVyZXFfKCcuL19vYmplY3QtYXNzaWduJykgfSk7XG5cbn0se1wiLi9fZXhwb3J0XCI6ODYsXCIuL19vYmplY3QtYXNzaWduXCI6MTA5fV0sMTUyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciAkZXhwb3J0ID0gX2RlcmVxXygnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBjcmVhdGU6IF9kZXJlcV8oJy4vX29iamVjdC1jcmVhdGUnKSB9KTtcblxufSx7XCIuL19leHBvcnRcIjo4NixcIi4vX29iamVjdC1jcmVhdGVcIjoxMTB9XSwxNTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xudmFyICRleHBvcnQgPSBfZGVyZXFfKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFfZGVyZXFfKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0eTogX2RlcmVxXygnLi9fb2JqZWN0LWRwJykuZiB9KTtcblxufSx7XCIuL19kZXNjcmlwdG9yc1wiOjgyLFwiLi9fZXhwb3J0XCI6ODYsXCIuL19vYmplY3QtZHBcIjoxMTF9XSwxNTQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gMTkuMS4yLjUgT2JqZWN0LmZyZWV6ZShPKVxudmFyIGlzT2JqZWN0ID0gX2RlcmVxXygnLi9faXMtb2JqZWN0Jyk7XG52YXIgbWV0YSA9IF9kZXJlcV8oJy4vX21ldGEnKS5vbkZyZWV6ZTtcblxuX2RlcmVxXygnLi9fb2JqZWN0LXNhcCcpKCdmcmVlemUnLCBmdW5jdGlvbiAoJGZyZWV6ZSkge1xuICByZXR1cm4gZnVuY3Rpb24gZnJlZXplKGl0KSB7XG4gICAgcmV0dXJuICRmcmVlemUgJiYgaXNPYmplY3QoaXQpID8gJGZyZWV6ZShtZXRhKGl0KSkgOiBpdDtcbiAgfTtcbn0pO1xuXG59LHtcIi4vX2lzLW9iamVjdFwiOjk4LFwiLi9fbWV0YVwiOjEwNixcIi4vX29iamVjdC1zYXBcIjoxMjF9XSwxNTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gMTkuMS4yLjkgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgdG9PYmplY3QgPSBfZGVyZXFfKCcuL190by1vYmplY3QnKTtcbnZhciAkZ2V0UHJvdG90eXBlT2YgPSBfZGVyZXFfKCcuL19vYmplY3QtZ3BvJyk7XG5cbl9kZXJlcV8oJy4vX29iamVjdC1zYXAnKSgnZ2V0UHJvdG90eXBlT2YnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkge1xuICAgIHJldHVybiAkZ2V0UHJvdG90eXBlT2YodG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuXG59LHtcIi4vX29iamVjdC1ncG9cIjoxMTcsXCIuL19vYmplY3Qtc2FwXCI6MTIxLFwiLi9fdG8tb2JqZWN0XCI6MTQwfV0sMTU2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIDE5LjEuMy4xOSBPYmplY3Quc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pXG52YXIgJGV4cG9ydCA9IF9kZXJlcV8oJy4vX2V4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7IHNldFByb3RvdHlwZU9mOiBfZGVyZXFfKCcuL19zZXQtcHJvdG8nKS5zZXQgfSk7XG5cbn0se1wiLi9fZXhwb3J0XCI6ODYsXCIuL19zZXQtcHJvdG9cIjoxMjh9XSwxNTc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzQ2XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiZHVwXCI6NDZ9XSwxNTg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgPSBfZGVyZXFfKCcuL19saWJyYXJ5Jyk7XG52YXIgZ2xvYmFsID0gX2RlcmVxXygnLi9fZ2xvYmFsJyk7XG52YXIgY3R4ID0gX2RlcmVxXygnLi9fY3R4Jyk7XG52YXIgY2xhc3NvZiA9IF9kZXJlcV8oJy4vX2NsYXNzb2YnKTtcbnZhciAkZXhwb3J0ID0gX2RlcmVxXygnLi9fZXhwb3J0Jyk7XG52YXIgaXNPYmplY3QgPSBfZGVyZXFfKCcuL19pcy1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSBfZGVyZXFfKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5JbnN0YW5jZSA9IF9kZXJlcV8oJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgZm9yT2YgPSBfZGVyZXFfKCcuL19mb3Itb2YnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfZGVyZXFfKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IF9kZXJlcV8oJy4vX3Rhc2snKS5zZXQ7XG52YXIgbWljcm90YXNrID0gX2RlcmVxXygnLi9fbWljcm90YXNrJykoKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IF9kZXJlcV8oJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gX2RlcmVxXygnLi9fcGVyZm9ybScpO1xudmFyIHByb21pc2VSZXNvbHZlID0gX2RlcmVxXygnLi9fcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgUFJPTUlTRSA9ICdQcm9taXNlJztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciAkUHJvbWlzZSA9IGdsb2JhbFtQUk9NSVNFXTtcbnZhciBpc05vZGUgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJztcbnZhciBlbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBJbnRlcm5hbCwgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5LCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgV3JhcHBlcjtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG5cbnZhciBVU0VfTkFUSVZFID0gISFmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLy8gY29ycmVjdCBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgPSAkUHJvbWlzZS5yZXNvbHZlKDEpO1xuICAgIHZhciBGYWtlUHJvbWlzZSA9IChwcm9taXNlLmNvbnN0cnVjdG9yID0ge30pW19kZXJlcV8oJy4vX3drcycpKCdzcGVjaWVzJyldID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICAgIGV4ZWMoZW1wdHksIGVtcHR5KTtcbiAgICB9O1xuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICByZXR1cm4gKGlzTm9kZSB8fCB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbicpICYmIHByb21pc2UudGhlbihlbXB0eSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBpc1JlamVjdCkge1xuICBpZiAocHJvbWlzZS5fbikgcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciBvayA9IHByb21pc2UuX3MgPT0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgaWYgKCFvaykge1xuICAgICAgICAgICAgaWYgKHByb21pc2UuX2ggPT0gMikgb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgICAgICAgICBwcm9taXNlLl9oID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaSkgcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYgKGlzUmVqZWN0ICYmICFwcm9taXNlLl9oKSBvblVuaGFuZGxlZChwcm9taXNlKTtcbiAgfSk7XG59O1xudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIHVuaGFuZGxlZCA9IGlzVW5oYW5kbGVkKHByb21pc2UpO1xuICAgIHZhciByZXN1bHQsIGhhbmRsZXIsIGNvbnNvbGU7XG4gICAgaWYgKHVuaGFuZGxlZCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uKSB7XG4gICAgICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoKGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZSkgJiYgY29uc29sZS5lcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodW5oYW5kbGVkICYmIHJlc3VsdC5lKSB0aHJvdyByZXN1bHQudjtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgcmV0dXJuIHByb21pc2UuX2ggIT09IDEgJiYgKHByb21pc2UuX2EgfHwgcHJvbWlzZS5fYykubGVuZ3RoID09PSAwO1xufTtcbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaGFuZGxlcjtcbiAgICBpZiAoaXNOb2RlKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPSBnbG9iYWwub25yZWplY3Rpb25oYW5kbGVkKSB7XG4gICAgICBoYW5kbGVyKHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiBwcm9taXNlLl92IH0pO1xuICAgIH1cbiAgfSk7XG59O1xudmFyICRyZWplY3QgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICBpZiAocHJvbWlzZS5fZCkgcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgcHJvbWlzZS5fcyA9IDI7XG4gIGlmICghcHJvbWlzZS5fYSkgcHJvbWlzZS5fYSA9IHByb21pc2UuX2Muc2xpY2UoKTtcbiAgbm90aWZ5KHByb21pc2UsIHRydWUpO1xufTtcbnZhciAkcmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIHZhciB0aGVuO1xuICBpZiAocHJvbWlzZS5fZCkgcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICBpZiAodGhlbiA9IGlzVGhlbmFibGUodmFsdWUpKSB7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd3JhcHBlciA9IHsgX3c6IHByb21pc2UsIF9kOiBmYWxzZSB9OyAvLyB3cmFwXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBjdHgoJHJlc29sdmUsIHdyYXBwZXIsIDEpLCBjdHgoJHJlamVjdCwgd3JhcHBlciwgMSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgJHJlamVjdC5jYWxsKHdyYXBwZXIsIGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fcyA9IDE7XG4gICAgICBub3RpZnkocHJvbWlzZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgICRyZWplY3QuY2FsbCh7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfSwgZSk7IC8vIHdyYXBcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmICghVVNFX05BVElWRSkge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICAkUHJvbWlzZSA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRQcm9taXNlLCBQUk9NSVNFLCAnX2gnKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGN0eCgkcmVzb2x2ZSwgdGhpcywgMSksIGN0eCgkcmVqZWN0LCB0aGlzLCAxKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAkcmVqZWN0LmNhbGwodGhpcywgZXJyKTtcbiAgICB9XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICB0aGlzLl9jID0gW107ICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgIHRoaXMuX2EgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gY2hlY2tlZCBpbiBpc1VuaGFuZGxlZCByZWFjdGlvbnNcbiAgICB0aGlzLl9zID0gMDsgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgdGhpcy5fZCA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBkb25lXG4gICAgdGhpcy5fdiA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSB2YWx1ZVxuICAgIHRoaXMuX2ggPSAwOyAgICAgICAgICAgICAgLy8gPC0gcmVqZWN0aW9uIHN0YXRlLCAwIC0gZGVmYXVsdCwgMSAtIGhhbmRsZWQsIDIgLSB1bmhhbmRsZWRcbiAgICB0aGlzLl9uID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSBfZGVyZXFfKCcuL19yZWRlZmluZS1hbGwnKSgkUHJvbWlzZS5wcm90b3R5cGUsIHtcbiAgICAvLyAyNS40LjUuMyBQcm9taXNlLnByb3RvdHlwZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCAkUHJvbWlzZSkpO1xuICAgICAgcmVhY3Rpb24ub2sgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBpc05vZGUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2MucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fYSkgdGhpcy5fYS5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmICh0aGlzLl9zKSBub3RpZnkodGhpcywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gICAgfSxcbiAgICAvLyAyNS40LjUuMSBQcm9taXNlLnByb3RvdHlwZS5jYXRjaChvblJlamVjdGVkKVxuICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGN0eCgkcmVzb2x2ZSwgcHJvbWlzZSwgMSk7XG4gICAgdGhpcy5yZWplY3QgPSBjdHgoJHJlamVjdCwgcHJvbWlzZSwgMSk7XG4gIH07XG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09ICRQcm9taXNlIHx8IEMgPT09IFdyYXBwZXJcbiAgICAgID8gbmV3IE93blByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICA6IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBQcm9taXNlOiAkUHJvbWlzZSB9KTtcbl9kZXJlcV8oJy4vX3NldC10by1zdHJpbmctdGFnJykoJFByb21pc2UsIFBST01JU0UpO1xuX2RlcmVxXygnLi9fc2V0LXNwZWNpZXMnKShQUk9NSVNFKTtcbldyYXBwZXIgPSBfZGVyZXFfKCcuL19jb3JlJylbUFJPTUlTRV07XG5cbi8vIHN0YXRpY3NcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjUgUHJvbWlzZS5yZWplY3QocilcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocikge1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcyk7XG4gICAgdmFyICQkcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgJCRyZWplY3Qocik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChMSUJSQVJZIHx8ICFVU0VfTkFUSVZFKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNiBQcm9taXNlLnJlc29sdmUoeClcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKExJQlJBUlkgJiYgdGhpcyA9PT0gV3JhcHBlciA/ICRQcm9taXNlIDogdGhpcywgeCk7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKFVTRV9OQVRJVkUgJiYgX2RlcmVxXygnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbiAoaXRlcikge1xuICAkUHJvbWlzZS5hbGwoaXRlcilbJ2NhdGNoJ10oZW1wdHkpO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciAkaW5kZXggPSBpbmRleCsrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbJGluZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZSkgcmVqZWN0KHJlc3VsdC52KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyAyNS40LjQuNCBQcm9taXNlLnJhY2UoaXRlcmFibGUpXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cbn0se1wiLi9fYS1mdW5jdGlvblwiOjcxLFwiLi9fYW4taW5zdGFuY2VcIjo3MyxcIi4vX2NsYXNzb2ZcIjo3NixcIi4vX2NvcmVcIjo3OCxcIi4vX2N0eFwiOjgwLFwiLi9fZXhwb3J0XCI6ODYsXCIuL19mb3Itb2ZcIjo4OCxcIi4vX2dsb2JhbFwiOjg5LFwiLi9faXMtb2JqZWN0XCI6OTgsXCIuL19pdGVyLWRldGVjdFwiOjEwMixcIi4vX2xpYnJhcnlcIjoxMDUsXCIuL19taWNyb3Rhc2tcIjoxMDcsXCIuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5XCI6MTA4LFwiLi9fcGVyZm9ybVwiOjEyMyxcIi4vX3Byb21pc2UtcmVzb2x2ZVwiOjEyNCxcIi4vX3JlZGVmaW5lLWFsbFwiOjEyNixcIi4vX3NldC1zcGVjaWVzXCI6MTI5LFwiLi9fc2V0LXRvLXN0cmluZy10YWdcIjoxMzAsXCIuL19zcGVjaWVzLWNvbnN0cnVjdG9yXCI6MTMzLFwiLi9fdGFza1wiOjEzNSxcIi4vX3drc1wiOjE0NX1dLDE1OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG52YXIgJGF0ID0gX2RlcmVxXygnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbl9kZXJlcV8oJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIgaW5kZXggPSB0aGlzLl9pO1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBPLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcblxufSx7XCIuL19pdGVyLWRlZmluZVwiOjEwMSxcIi4vX3N0cmluZy1hdFwiOjEzNH1dLDE2MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG4vLyBFQ01BU2NyaXB0IDYgc3ltYm9scyBzaGltXG52YXIgZ2xvYmFsID0gX2RlcmVxXygnLi9fZ2xvYmFsJyk7XG52YXIgaGFzID0gX2RlcmVxXygnLi9faGFzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSBfZGVyZXFfKCcuL19kZXNjcmlwdG9ycycpO1xudmFyICRleHBvcnQgPSBfZGVyZXFfKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IF9kZXJlcV8oJy4vX3JlZGVmaW5lJyk7XG52YXIgTUVUQSA9IF9kZXJlcV8oJy4vX21ldGEnKS5LRVk7XG52YXIgJGZhaWxzID0gX2RlcmVxXygnLi9fZmFpbHMnKTtcbnZhciBzaGFyZWQgPSBfZGVyZXFfKCcuL19zaGFyZWQnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9kZXJlcV8oJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgdWlkID0gX2RlcmVxXygnLi9fdWlkJyk7XG52YXIgd2tzID0gX2RlcmVxXygnLi9fd2tzJyk7XG52YXIgd2tzRXh0ID0gX2RlcmVxXygnLi9fd2tzLWV4dCcpO1xudmFyIHdrc0RlZmluZSA9IF9kZXJlcV8oJy4vX3drcy1kZWZpbmUnKTtcbnZhciBlbnVtS2V5cyA9IF9kZXJlcV8oJy4vX2VudW0ta2V5cycpO1xudmFyIGlzQXJyYXkgPSBfZGVyZXFfKCcuL19pcy1hcnJheScpO1xudmFyIGFuT2JqZWN0ID0gX2RlcmVxXygnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSBfZGVyZXFfKCcuL19pcy1vYmplY3QnKTtcbnZhciB0b0lPYmplY3QgPSBfZGVyZXFfKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSBfZGVyZXFfKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBjcmVhdGVEZXNjID0gX2RlcmVxXygnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIF9jcmVhdGUgPSBfZGVyZXFfKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZ09QTkV4dCA9IF9kZXJlcV8oJy4vX29iamVjdC1nb3BuLWV4dCcpO1xudmFyICRHT1BEID0gX2RlcmVxXygnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciAkRFAgPSBfZGVyZXFfKCcuL19vYmplY3QtZHAnKTtcbnZhciAka2V5cyA9IF9kZXJlcV8oJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QRCA9ICRHT1BELmY7XG52YXIgZFAgPSAkRFAuZjtcbnZhciBnT1BOID0gZ09QTkV4dC5mO1xudmFyICRTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyICRKU09OID0gZ2xvYmFsLkpTT047XG52YXIgX3N0cmluZ2lmeSA9ICRKU09OICYmICRKU09OLnN0cmluZ2lmeTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBISURERU4gPSB3a3MoJ19oaWRkZW4nKTtcbnZhciBUT19QUklNSVRJVkUgPSB3a3MoJ3RvUHJpbWl0aXZlJyk7XG52YXIgaXNFbnVtID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpO1xudmFyIEFsbFN5bWJvbHMgPSBzaGFyZWQoJ3N5bWJvbHMnKTtcbnZhciBPUFN5bWJvbHMgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKTtcbnZhciBPYmplY3RQcm90byA9IE9iamVjdFtQUk9UT1RZUEVdO1xudmFyIFVTRV9OQVRJVkUgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xudmFyIFFPYmplY3QgPSBnbG9iYWwuUU9iamVjdDtcbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cbi8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xudmFyIHNldFN5bWJvbERlc2MgPSBERVNDUklQVE9SUyAmJiAkZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX2NyZWF0ZShkUCh7fSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkUCh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsgfVxuICB9KSkuYSAhPSA3O1xufSkgPyBmdW5jdGlvbiAoaXQsIGtleSwgRCkge1xuICB2YXIgcHJvdG9EZXNjID0gZ09QRChPYmplY3RQcm90bywga2V5KTtcbiAgaWYgKHByb3RvRGVzYykgZGVsZXRlIE9iamVjdFByb3RvW2tleV07XG4gIGRQKGl0LCBrZXksIEQpO1xuICBpZiAocHJvdG9EZXNjICYmIGl0ICE9PSBPYmplY3RQcm90bykgZFAoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcbn0gOiBkUDtcblxudmFyIHdyYXAgPSBmdW5jdGlvbiAodGFnKSB7XG4gIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG4gIHN5bS5fayA9IHRhZztcbiAgcmV0dXJuIHN5bTtcbn07XG5cbnZhciBpc1N5bWJvbCA9IFVTRV9OQVRJVkUgJiYgdHlwZW9mICRTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCcgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKSB7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG8pICRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG4gIGFuT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgYW5PYmplY3QoRCk7XG4gIGlmIChoYXMoQWxsU3ltYm9scywga2V5KSkge1xuICAgIGlmICghRC5lbnVtZXJhYmxlKSB7XG4gICAgICBpZiAoIWhhcyhpdCwgSElEREVOKSkgZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuICAgICAgaXRbSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pIGl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgRCA9IF9jcmVhdGUoRCwgeyBlbnVtZXJhYmxlOiBjcmVhdGVEZXNjKDAsIGZhbHNlKSB9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuICB9IHJldHVybiBkUChpdCwga2V5LCBEKTtcbn07XG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKSB7XG4gIGFuT2JqZWN0KGl0KTtcbiAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JT2JqZWN0KFApKTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICB2YXIga2V5O1xuICB3aGlsZSAobCA+IGkpICRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApIHtcbiAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9jcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX2NyZWF0ZShpdCksIFApO1xufTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShrZXkpIHtcbiAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBFIHx8ICFoYXModGhpcywga2V5KSB8fCAhaGFzKEFsbFN5bWJvbHMsIGtleSkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW2tleV0gPyBFIDogdHJ1ZTtcbn07XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gIGl0ID0gdG9JT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSkgcmV0dXJuO1xuICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG4gIGlmIChEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpIEQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgdmFyIG5hbWVzID0gZ09QTih0b0lPYmplY3QoaXQpKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSB7XG4gICAgaWYgKCFoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYga2V5ICE9IEhJRERFTiAmJiBrZXkgIT0gTUVUQSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gIHZhciBJU19PUCA9IGl0ID09PSBPYmplY3RQcm90bztcbiAgdmFyIG5hbWVzID0gZ09QTihJU19PUCA/IE9QU3ltYm9scyA6IHRvSU9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIChJU19PUCA/IGhhcyhPYmplY3RQcm90bywga2V5KSA6IHRydWUpKSByZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcbmlmICghVVNFX05BVElWRSkge1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgJFN5bWJvbCkgdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG4gICAgdmFyIHRhZyA9IHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gICAgdmFyICRzZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzID09PSBPYmplY3RQcm90bykgJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYgKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpIHRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICBzZXRTeW1ib2xEZXNjKHRoaXMsIHRhZywgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuICAgIH07XG4gICAgaWYgKERFU0NSSVBUT1JTICYmIHNldHRlcikgc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0IH0pO1xuICAgIHJldHVybiB3cmFwKHRhZyk7XG4gIH07XG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2s7XG4gIH0pO1xuXG4gICRHT1BELmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAkRFAuZiA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgX2RlcmVxXygnLi9fb2JqZWN0LWdvcG4nKS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIF9kZXJlcV8oJy4vX29iamVjdC1waWUnKS5mID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICBfZGVyZXFfKCcuL19vYmplY3QtZ29wcycpLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIGlmIChERVNDUklQVE9SUyAmJiAhX2RlcmVxXygnLi9fbGlicmFyeScpKSB7XG4gICAgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cblxuICB3a3NFeHQuZiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHdyYXAod2tzKG5hbWUpKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBTeW1ib2w6ICRTeW1ib2wgfSk7XG5cbmZvciAodmFyIGVzNlN5bWJvbHMgPSAoXG4gIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcydcbikuc3BsaXQoJywnKSwgaiA9IDA7IGVzNlN5bWJvbHMubGVuZ3RoID4gajspd2tzKGVzNlN5bWJvbHNbaisrXSk7XG5cbmZvciAodmFyIHdlbGxLbm93blN5bWJvbHMgPSAka2V5cyh3a3Muc3RvcmUpLCBrID0gMDsgd2VsbEtub3duU3ltYm9scy5sZW5ndGggPiBrOykgd2tzRGVmaW5lKHdlbGxLbm93blN5bWJvbHNbaysrXSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG4gICAgZm9yICh2YXIga2V5IGluIFN5bWJvbFJlZ2lzdHJ5KSBpZiAoU3ltYm9sUmVnaXN0cnlba2V5XSA9PT0gc3ltKSByZXR1cm4ga2V5O1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IGZhbHNlOyB9XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcbiAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuICBjcmVhdGU6ICRjcmVhdGUsXG4gIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuICAvLyAxOS4xLjIuMyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKVxuICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcbiAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG4gIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICAvLyAxOS4xLjIuOCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pXG4gIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xufSk7XG5cbi8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuJEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoeyBhOiBTIH0pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG59KSksICdKU09OJywge1xuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCkge1xuICAgIHZhciBhcmdzID0gW2l0XTtcbiAgICB2YXIgaSA9IDE7XG4gICAgdmFyIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgICRyZXBsYWNlciA9IHJlcGxhY2VyID0gYXJnc1sxXTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlcGxhY2VyKSAmJiBpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkgcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gICAgaWYgKCFpc0FycmF5KHJlcGxhY2VyKSkgcmVwbGFjZXIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiAkcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykgdmFsdWUgPSAkcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpO1xuICB9XG59KTtcblxuLy8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgX2RlcmVxXygnLi9faGlkZScpKCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG4vLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuLy8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuXG59LHtcIi4vX2FuLW9iamVjdFwiOjc0LFwiLi9fZGVzY3JpcHRvcnNcIjo4MixcIi4vX2VudW0ta2V5c1wiOjg1LFwiLi9fZXhwb3J0XCI6ODYsXCIuL19mYWlsc1wiOjg3LFwiLi9fZ2xvYmFsXCI6ODksXCIuL19oYXNcIjo5MCxcIi4vX2hpZGVcIjo5MSxcIi4vX2lzLWFycmF5XCI6OTcsXCIuL19pcy1vYmplY3RcIjo5OCxcIi4vX2xpYnJhcnlcIjoxMDUsXCIuL19tZXRhXCI6MTA2LFwiLi9fb2JqZWN0LWNyZWF0ZVwiOjExMCxcIi4vX29iamVjdC1kcFwiOjExMSxcIi4vX29iamVjdC1nb3BkXCI6MTEzLFwiLi9fb2JqZWN0LWdvcG5cIjoxMTUsXCIuL19vYmplY3QtZ29wbi1leHRcIjoxMTQsXCIuL19vYmplY3QtZ29wc1wiOjExNixcIi4vX29iamVjdC1rZXlzXCI6MTE5LFwiLi9fb2JqZWN0LXBpZVwiOjEyMCxcIi4vX3Byb3BlcnR5LWRlc2NcIjoxMjUsXCIuL19yZWRlZmluZVwiOjEyNyxcIi4vX3NldC10by1zdHJpbmctdGFnXCI6MTMwLFwiLi9fc2hhcmVkXCI6MTMyLFwiLi9fdG8taW9iamVjdFwiOjEzOCxcIi4vX3RvLXByaW1pdGl2ZVwiOjE0MSxcIi4vX3VpZFwiOjE0MixcIi4vX3drc1wiOjE0NSxcIi4vX3drcy1kZWZpbmVcIjoxNDMsXCIuL193a3MtZXh0XCI6MTQ0fV0sMTYxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgPSBfZGVyZXFfKCcuL19leHBvcnQnKTtcbnZhciAkZW50cmllcyA9IF9kZXJlcV8oJy4vX29iamVjdC10by1hcnJheScpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcyhpdCkge1xuICAgIHJldHVybiAkZW50cmllcyhpdCk7XG4gIH1cbn0pO1xuXG59LHtcIi4vX2V4cG9ydFwiOjg2LFwiLi9fb2JqZWN0LXRvLWFycmF5XCI6MTIyfV0sMTYyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgPSBfZGVyZXFfKCcuL19leHBvcnQnKTtcbnZhciAkdmFsdWVzID0gX2RlcmVxXygnLi9fb2JqZWN0LXRvLWFycmF5JykoZmFsc2UpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoaXQpIHtcbiAgICByZXR1cm4gJHZhbHVlcyhpdCk7XG4gIH1cbn0pO1xuXG59LHtcIi4vX2V4cG9ydFwiOjg2LFwiLi9fb2JqZWN0LXRvLWFycmF5XCI6MTIyfV0sMTYzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2UtZmluYWxseVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSBfZGVyZXFfKCcuL19leHBvcnQnKTtcbnZhciBjb3JlID0gX2RlcmVxXygnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IF9kZXJlcV8oJy4vX2dsb2JhbCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9kZXJlcV8oJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IF9kZXJlcV8oJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ1Byb21pc2UnLCB7ICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBjb3JlLlByb21pc2UgfHwgZ2xvYmFsLlByb21pc2UpO1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBvbkZpbmFsbHkgPT0gJ2Z1bmN0aW9uJztcbiAgcmV0dXJuIHRoaXMudGhlbihcbiAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICB9IDogb25GaW5hbGx5LFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgfSA6IG9uRmluYWxseVxuICApO1xufSB9KTtcblxufSx7XCIuL19jb3JlXCI6NzgsXCIuL19leHBvcnRcIjo4NixcIi4vX2dsb2JhbFwiOjg5LFwiLi9fcHJvbWlzZS1yZXNvbHZlXCI6MTI0LFwiLi9fc3BlY2llcy1jb25zdHJ1Y3RvclwiOjEzM31dLDE2NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLXRyeVxudmFyICRleHBvcnQgPSBfZGVyZXFfKCcuL19leHBvcnQnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IF9kZXJlcV8oJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gX2RlcmVxXygnLi9fcGVyZm9ybScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1Byb21pc2UnLCB7ICd0cnknOiBmdW5jdGlvbiAoY2FsbGJhY2tmbikge1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gcGVyZm9ybShjYWxsYmFja2ZuKTtcbiAgKHJlc3VsdC5lID8gcHJvbWlzZUNhcGFiaWxpdHkucmVqZWN0IDogcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZSkocmVzdWx0LnYpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn0gfSk7XG5cbn0se1wiLi9fZXhwb3J0XCI6ODYsXCIuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5XCI6MTA4LFwiLi9fcGVyZm9ybVwiOjEyM31dLDE2NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5fZGVyZXFfKCcuL193a3MtZGVmaW5lJykoJ2FzeW5jSXRlcmF0b3InKTtcblxufSx7XCIuL193a3MtZGVmaW5lXCI6MTQzfV0sMTY2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbl9kZXJlcV8oJy4vX3drcy1kZWZpbmUnKSgnb2JzZXJ2YWJsZScpO1xuXG59LHtcIi4vX3drcy1kZWZpbmVcIjoxNDN9XSwxNjc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuX2RlcmVxXygnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBnbG9iYWwgPSBfZGVyZXFfKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gX2RlcmVxXygnLi9faGlkZScpO1xudmFyIEl0ZXJhdG9ycyA9IF9kZXJlcV8oJy4vX2l0ZXJhdG9ycycpO1xudmFyIFRPX1NUUklOR19UQUcgPSBfZGVyZXFfKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxudmFyIERPTUl0ZXJhYmxlcyA9ICgnQ1NTUnVsZUxpc3QsQ1NTU3R5bGVEZWNsYXJhdGlvbixDU1NWYWx1ZUxpc3QsQ2xpZW50UmVjdExpc3QsRE9NUmVjdExpc3QsRE9NU3RyaW5nTGlzdCwnICtcbiAgJ0RPTVRva2VuTGlzdCxEYXRhVHJhbnNmZXJJdGVtTGlzdCxGaWxlTGlzdCxIVE1MQWxsQ29sbGVjdGlvbixIVE1MQ29sbGVjdGlvbixIVE1MRm9ybUVsZW1lbnQsSFRNTFNlbGVjdEVsZW1lbnQsJyArXG4gICdNZWRpYUxpc3QsTWltZVR5cGVBcnJheSxOYW1lZE5vZGVNYXAsTm9kZUxpc3QsUGFpbnRSZXF1ZXN0TGlzdCxQbHVnaW4sUGx1Z2luQXJyYXksU1ZHTGVuZ3RoTGlzdCxTVkdOdW1iZXJMaXN0LCcgK1xuICAnU1ZHUGF0aFNlZ0xpc3QsU1ZHUG9pbnRMaXN0LFNWR1N0cmluZ0xpc3QsU1ZHVHJhbnNmb3JtTGlzdCxTb3VyY2VCdWZmZXJMaXN0LFN0eWxlU2hlZXRMaXN0LFRleHRUcmFja0N1ZUxpc3QsJyArXG4gICdUZXh0VHJhY2tMaXN0LFRvdWNoTGlzdCcpLnNwbGl0KCcsJyk7XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgRE9NSXRlcmFibGVzLmxlbmd0aDsgaSsrKSB7XG4gIHZhciBOQU1FID0gRE9NSXRlcmFibGVzW2ldO1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgaWYgKHByb3RvICYmICFwcm90b1tUT19TVFJJTkdfVEFHXSkgaGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IEl0ZXJhdG9ycy5BcnJheTtcbn1cblxufSx7XCIuL19nbG9iYWxcIjo4OSxcIi4vX2hpZGVcIjo5MSxcIi4vX2l0ZXJhdG9yc1wiOjEwNCxcIi4vX3drc1wiOjE0NSxcIi4vZXM2LmFycmF5Lml0ZXJhdG9yXCI6MTUwfV0sMTY4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVs3MV1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcImR1cFwiOjcxfV0sMTY5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IF9kZXJlcV8oJy4vX3drcycpKCd1bnNjb3BhYmxlcycpO1xudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5pZiAoQXJyYXlQcm90b1tVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSBfZGVyZXFfKCcuL19oaWRlJykoQXJyYXlQcm90bywgVU5TQ09QQUJMRVMsIHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG5cbn0se1wiLi9faGlkZVwiOjE5MyxcIi4vX3drc1wiOjI0OX1dLDE3MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bNzNdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCJkdXBcIjo3M31dLDE3MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bNzRdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL19pcy1vYmplY3RcIjoyMDAsXCJkdXBcIjo3NH1dLDE3MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbid1c2Ugc3RyaWN0JztcbnZhciB0b09iamVjdCA9IF9kZXJlcV8oJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IF9kZXJlcV8oJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgdG9MZW5ndGggPSBfZGVyZXFfKCcuL190by1sZW5ndGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBbXS5jb3B5V2l0aGluIHx8IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0IC8qID0gMCAqLywgc3RhcnQgLyogPSAwLCBlbmQgPSBAbGVuZ3RoICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gIHZhciBsZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciB0byA9IHRvQWJzb2x1dGVJbmRleCh0YXJnZXQsIGxlbik7XG4gIHZhciBmcm9tID0gdG9BYnNvbHV0ZUluZGV4KHN0YXJ0LCBsZW4pO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBjb3VudCA9IE1hdGgubWluKChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbikpIC0gZnJvbSwgbGVuIC0gdG8pO1xuICB2YXIgaW5jID0gMTtcbiAgaWYgKGZyb20gPCB0byAmJiB0byA8IGZyb20gKyBjb3VudCkge1xuICAgIGluYyA9IC0xO1xuICAgIGZyb20gKz0gY291bnQgLSAxO1xuICAgIHRvICs9IGNvdW50IC0gMTtcbiAgfVxuICB3aGlsZSAoY291bnQtLSA+IDApIHtcbiAgICBpZiAoZnJvbSBpbiBPKSBPW3RvXSA9IE9bZnJvbV07XG4gICAgZWxzZSBkZWxldGUgT1t0b107XG4gICAgdG8gKz0gaW5jO1xuICAgIGZyb20gKz0gaW5jO1xuICB9IHJldHVybiBPO1xufTtcblxufSx7XCIuL190by1hYnNvbHV0ZS1pbmRleFwiOjIzNixcIi4vX3RvLWxlbmd0aFwiOjI0MCxcIi4vX3RvLW9iamVjdFwiOjI0MX1dLDE3MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyAyMi4xLjMuNiBBcnJheS5wcm90b3R5cGUuZmlsbCh2YWx1ZSwgc3RhcnQgPSAwLCBlbmQgPSB0aGlzLmxlbmd0aClcbid1c2Ugc3RyaWN0JztcbnZhciB0b09iamVjdCA9IF9kZXJlcV8oJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IF9kZXJlcV8oJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgdG9MZW5ndGggPSBfZGVyZXFfKCcuL190by1sZW5ndGgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZmlsbCh2YWx1ZSAvKiAsIHN0YXJ0ID0gMCwgZW5kID0gQGxlbmd0aCAqLykge1xuICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IGFMZW4gPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkO1xuICB2YXIgZW5kUG9zID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW5ndGgpO1xuICB3aGlsZSAoZW5kUG9zID4gaW5kZXgpIE9baW5kZXgrK10gPSB2YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuXG59LHtcIi4vX3RvLWFic29sdXRlLWluZGV4XCI6MjM2LFwiLi9fdG8tbGVuZ3RoXCI6MjQwLFwiLi9fdG8tb2JqZWN0XCI6MjQxfV0sMTc0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVs3NV1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX3RvLWFic29sdXRlLWluZGV4XCI6MjM2LFwiLi9fdG8taW9iamVjdFwiOjIzOSxcIi4vX3RvLWxlbmd0aFwiOjI0MCxcImR1cFwiOjc1fV0sMTc1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIDAgLT4gQXJyYXkjZm9yRWFjaFxuLy8gMSAtPiBBcnJheSNtYXBcbi8vIDIgLT4gQXJyYXkjZmlsdGVyXG4vLyAzIC0+IEFycmF5I3NvbWVcbi8vIDQgLT4gQXJyYXkjZXZlcnlcbi8vIDUgLT4gQXJyYXkjZmluZFxuLy8gNiAtPiBBcnJheSNmaW5kSW5kZXhcbnZhciBjdHggPSBfZGVyZXFfKCcuL19jdHgnKTtcbnZhciBJT2JqZWN0ID0gX2RlcmVxXygnLi9faW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gX2RlcmVxXygnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSBfZGVyZXFfKCcuL190by1sZW5ndGgnKTtcbnZhciBhc2MgPSBfZGVyZXFfKCcuL19hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVFlQRSwgJGNyZWF0ZSkge1xuICB2YXIgSVNfTUFQID0gVFlQRSA9PSAxO1xuICB2YXIgSVNfRklMVEVSID0gVFlQRSA9PSAyO1xuICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMztcbiAgdmFyIElTX0VWRVJZID0gVFlQRSA9PSA0O1xuICB2YXIgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNjtcbiAgdmFyIE5PX0hPTEVTID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHZhciBjcmVhdGUgPSAkY3JlYXRlIHx8IGFzYztcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCkge1xuICAgIHZhciBPID0gdG9PYmplY3QoJHRoaXMpO1xuICAgIHZhciBzZWxmID0gSU9iamVjdChPKTtcbiAgICB2YXIgZiA9IGN0eChjYWxsYmFja2ZuLCB0aGF0LCAzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoc2VsZi5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIHJlc3VsdCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHZhbCwgcmVzO1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZikge1xuICAgICAgdmFsID0gc2VsZltpbmRleF07XG4gICAgICByZXMgPSBmKHZhbCwgaW5kZXgsIE8pO1xuICAgICAgaWYgKFRZUEUpIHtcbiAgICAgICAgaWYgKElTX01BUCkgcmVzdWx0W2luZGV4XSA9IHJlczsgICAvLyBtYXBcbiAgICAgICAgZWxzZSBpZiAocmVzKSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAvLyBzb21lXG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gdmFsOyAgICAgICAgICAgICAgLy8gZmluZFxuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIGluZGV4OyAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcmVzdWx0LnB1c2godmFsKTsgICAgICAgIC8vIGZpbHRlclxuICAgICAgICB9IGVsc2UgaWYgKElTX0VWRVJZKSByZXR1cm4gZmFsc2U7IC8vIGV2ZXJ5XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiByZXN1bHQ7XG4gIH07XG59O1xuXG59LHtcIi4vX2FycmF5LXNwZWNpZXMtY3JlYXRlXCI6MTc3LFwiLi9fY3R4XCI6MTgyLFwiLi9faW9iamVjdFwiOjE5NyxcIi4vX3RvLWxlbmd0aFwiOjI0MCxcIi4vX3RvLW9iamVjdFwiOjI0MX1dLDE3NjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgaXNPYmplY3QgPSBfZGVyZXFfKCcuL19pcy1vYmplY3QnKTtcbnZhciBpc0FycmF5ID0gX2RlcmVxXygnLi9faXMtYXJyYXknKTtcbnZhciBTUEVDSUVTID0gX2RlcmVxXygnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgdmFyIEM7XG4gIGlmIChpc0FycmF5KG9yaWdpbmFsKSkge1xuICAgIEMgPSBvcmlnaW5hbC5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmICh0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGlzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDO1xufTtcblxufSx7XCIuL19pcy1hcnJheVwiOjE5OSxcIi4vX2lzLW9iamVjdFwiOjIwMCxcIi4vX3drc1wiOjI0OX1dLDE3NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyA5LjQuMi4zIEFycmF5U3BlY2llc0NyZWF0ZShvcmlnaW5hbEFycmF5LCBsZW5ndGgpXG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gX2RlcmVxXygnLi9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbCwgbGVuZ3RoKSB7XG4gIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbCkpKGxlbmd0aCk7XG59O1xuXG59LHtcIi4vX2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3JcIjoxNzZ9XSwxNzg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzc2XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fY29mXCI6MTc5LFwiLi9fd2tzXCI6MjQ5LFwiZHVwXCI6NzZ9XSwxNzk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzc3XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiZHVwXCI6Nzd9XSwxODA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzc4XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiZHVwXCI6Nzh9XSwxODE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzc5XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fb2JqZWN0LWRwXCI6MjEzLFwiLi9fcHJvcGVydHktZGVzY1wiOjIyNSxcImR1cFwiOjc5fV0sMTgyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVs4MF1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2EtZnVuY3Rpb25cIjoxNjgsXCJkdXBcIjo4MH1dLDE4MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bODFdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCJkdXBcIjo4MX1dLDE4NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bODJdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL19mYWlsc1wiOjE4OSxcImR1cFwiOjgyfV0sMTg1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVs4M11bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2dsb2JhbFwiOjE5MSxcIi4vX2lzLW9iamVjdFwiOjIwMCxcImR1cFwiOjgzfV0sMTg2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVs4NF1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcImR1cFwiOjg0fV0sMTg3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVs4NV1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX29iamVjdC1nb3BzXCI6MjE4LFwiLi9fb2JqZWN0LWtleXNcIjoyMjEsXCIuL19vYmplY3QtcGllXCI6MjIyLFwiZHVwXCI6ODV9XSwxODg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsb2JhbCA9IF9kZXJlcV8oJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSBfZGVyZXFfKCcuL19jb3JlJyk7XG52YXIgaGlkZSA9IF9kZXJlcV8oJy4vX2hpZGUnKTtcbnZhciByZWRlZmluZSA9IF9kZXJlcV8oJy4vX3JlZGVmaW5lJyk7XG52YXIgY3R4ID0gX2RlcmVxXygnLi9fY3R4Jyk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIHNvdXJjZSkge1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRjtcbiAgdmFyIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0Lkc7XG4gIHZhciBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TO1xuICB2YXIgSVNfUFJPVE8gPSB0eXBlICYgJGV4cG9ydC5QO1xuICB2YXIgSVNfQklORCA9IHR5cGUgJiAkZXhwb3J0LkI7XG4gIHZhciB0YXJnZXQgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gfHwgKGdsb2JhbFtuYW1lXSA9IHt9KSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV07XG4gIHZhciBleHBvcnRzID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSk7XG4gIHZhciBleHBQcm90byA9IGV4cG9ydHNbUFJPVE9UWVBFXSB8fCAoZXhwb3J0c1tQUk9UT1RZUEVdID0ge30pO1xuICB2YXIga2V5LCBvd24sIG91dCwgZXhwO1xuICBpZiAoSVNfR0xPQkFMKSBzb3VyY2UgPSBuYW1lO1xuICBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gKG93biA/IHRhcmdldCA6IHNvdXJjZSlba2V5XTtcbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIGV4cCA9IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICBpZiAodGFyZ2V0KSByZWRlZmluZSh0YXJnZXQsIGtleSwgb3V0LCB0eXBlICYgJGV4cG9ydC5VKTtcbiAgICAvLyBleHBvcnRcbiAgICBpZiAoZXhwb3J0c1trZXldICE9IG91dCkgaGlkZShleHBvcnRzLCBrZXksIGV4cCk7XG4gICAgaWYgKElTX1BST1RPICYmIGV4cFByb3RvW2tleV0gIT0gb3V0KSBleHBQcm90b1trZXldID0gb3V0O1xuICB9XG59O1xuZ2xvYmFsLmNvcmUgPSBjb3JlO1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuXG59LHtcIi4vX2NvcmVcIjoxODAsXCIuL19jdHhcIjoxODIsXCIuL19nbG9iYWxcIjoxOTEsXCIuL19oaWRlXCI6MTkzLFwiLi9fcmVkZWZpbmVcIjoyMjd9XSwxODk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzg3XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiZHVwXCI6ODd9XSwxOTA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzg4XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fYW4tb2JqZWN0XCI6MTcxLFwiLi9fY3R4XCI6MTgyLFwiLi9faXMtYXJyYXktaXRlclwiOjE5OCxcIi4vX2l0ZXItY2FsbFwiOjIwMSxcIi4vX3RvLWxlbmd0aFwiOjI0MCxcIi4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kXCI6MjUwLFwiZHVwXCI6ODh9XSwxOTE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzg5XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiZHVwXCI6ODl9XSwxOTI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzkwXVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiZHVwXCI6OTB9XSwxOTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzkxXVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fZGVzY3JpcHRvcnNcIjoxODQsXCIuL19vYmplY3QtZHBcIjoyMTMsXCIuL19wcm9wZXJ0eS1kZXNjXCI6MjI1LFwiZHVwXCI6OTF9XSwxOTQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzkyXVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fZ2xvYmFsXCI6MTkxLFwiZHVwXCI6OTJ9XSwxOTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzkzXVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fZGVzY3JpcHRvcnNcIjoxODQsXCIuL19kb20tY3JlYXRlXCI6MTg1LFwiLi9fZmFpbHNcIjoxODksXCJkdXBcIjo5M31dLDE5NjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bOTRdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCJkdXBcIjo5NH1dLDE5NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bOTVdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL19jb2ZcIjoxNzksXCJkdXBcIjo5NX1dLDE5ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bOTZdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL19pdGVyYXRvcnNcIjoyMDYsXCIuL193a3NcIjoyNDksXCJkdXBcIjo5Nn1dLDE5OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bOTddWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL19jb2ZcIjoxNzksXCJkdXBcIjo5N31dLDIwMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bOThdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCJkdXBcIjo5OH1dLDIwMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bOTldWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL19hbi1vYmplY3RcIjoxNzEsXCJkdXBcIjo5OX1dLDIwMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bMTAwXVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9faGlkZVwiOjE5MyxcIi4vX29iamVjdC1jcmVhdGVcIjoyMTIsXCIuL19wcm9wZXJ0eS1kZXNjXCI6MjI1LFwiLi9fc2V0LXRvLXN0cmluZy10YWdcIjoyMjksXCIuL193a3NcIjoyNDksXCJkdXBcIjoxMDB9XSwyMDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzEwMV1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2V4cG9ydFwiOjE4OCxcIi4vX2hhc1wiOjE5MixcIi4vX2hpZGVcIjoxOTMsXCIuL19pdGVyLWNyZWF0ZVwiOjIwMixcIi4vX2l0ZXJhdG9yc1wiOjIwNixcIi4vX2xpYnJhcnlcIjoyMDcsXCIuL19vYmplY3QtZ3BvXCI6MjE5LFwiLi9fcmVkZWZpbmVcIjoyMjcsXCIuL19zZXQtdG8tc3RyaW5nLXRhZ1wiOjIyOSxcIi4vX3drc1wiOjI0OSxcImR1cFwiOjEwMX1dLDIwNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bMTAyXVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fd2tzXCI6MjQ5LFwiZHVwXCI6MTAyfV0sMjA1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVsxMDNdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCJkdXBcIjoxMDN9XSwyMDY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzEwNF1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcImR1cFwiOjEwNH1dLDIwNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuXG59LHt9XSwyMDg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzEwNl1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2ZhaWxzXCI6MTg5LFwiLi9faGFzXCI6MTkyLFwiLi9faXMtb2JqZWN0XCI6MjAwLFwiLi9fb2JqZWN0LWRwXCI6MjEzLFwiLi9fdWlkXCI6MjQ2LFwiZHVwXCI6MTA2fV0sMjA5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVsxMDddWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL19jb2ZcIjoxNzksXCIuL19nbG9iYWxcIjoxOTEsXCIuL190YXNrXCI6MjM1LFwiZHVwXCI6MTA3fV0sMjEwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVsxMDhdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL19hLWZ1bmN0aW9uXCI6MTY4LFwiZHVwXCI6MTA4fV0sMjExOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVsxMDldWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL19mYWlsc1wiOjE4OSxcIi4vX2lvYmplY3RcIjoxOTcsXCIuL19vYmplY3QtZ29wc1wiOjIxOCxcIi4vX29iamVjdC1rZXlzXCI6MjIxLFwiLi9fb2JqZWN0LXBpZVwiOjIyMixcIi4vX3RvLW9iamVjdFwiOjI0MSxcImR1cFwiOjEwOX1dLDIxMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bMTEwXVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fYW4tb2JqZWN0XCI6MTcxLFwiLi9fZG9tLWNyZWF0ZVwiOjE4NSxcIi4vX2VudW0tYnVnLWtleXNcIjoxODYsXCIuL19odG1sXCI6MTk0LFwiLi9fb2JqZWN0LWRwc1wiOjIxNCxcIi4vX3NoYXJlZC1rZXlcIjoyMzAsXCJkdXBcIjoxMTB9XSwyMTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzExMV1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2FuLW9iamVjdFwiOjE3MSxcIi4vX2Rlc2NyaXB0b3JzXCI6MTg0LFwiLi9faWU4LWRvbS1kZWZpbmVcIjoxOTUsXCIuL190by1wcmltaXRpdmVcIjoyNDIsXCJkdXBcIjoxMTF9XSwyMTQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzExMl1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2FuLW9iamVjdFwiOjE3MSxcIi4vX2Rlc2NyaXB0b3JzXCI6MTg0LFwiLi9fb2JqZWN0LWRwXCI6MjEzLFwiLi9fb2JqZWN0LWtleXNcIjoyMjEsXCJkdXBcIjoxMTJ9XSwyMTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzExM11bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2Rlc2NyaXB0b3JzXCI6MTg0LFwiLi9faGFzXCI6MTkyLFwiLi9faWU4LWRvbS1kZWZpbmVcIjoxOTUsXCIuL19vYmplY3QtcGllXCI6MjIyLFwiLi9fcHJvcGVydHktZGVzY1wiOjIyNSxcIi4vX3RvLWlvYmplY3RcIjoyMzksXCIuL190by1wcmltaXRpdmVcIjoyNDIsXCJkdXBcIjoxMTN9XSwyMTY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzExNF1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX29iamVjdC1nb3BuXCI6MjE3LFwiLi9fdG8taW9iamVjdFwiOjIzOSxcImR1cFwiOjExNH1dLDIxNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bMTE1XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fZW51bS1idWcta2V5c1wiOjE4NixcIi4vX29iamVjdC1rZXlzLWludGVybmFsXCI6MjIwLFwiZHVwXCI6MTE1fV0sMjE4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVsxMTZdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCJkdXBcIjoxMTZ9XSwyMTk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzExN11bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2hhc1wiOjE5MixcIi4vX3NoYXJlZC1rZXlcIjoyMzAsXCIuL190by1vYmplY3RcIjoyNDEsXCJkdXBcIjoxMTd9XSwyMjA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzExOF1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2FycmF5LWluY2x1ZGVzXCI6MTc0LFwiLi9faGFzXCI6MTkyLFwiLi9fc2hhcmVkLWtleVwiOjIzMCxcIi4vX3RvLWlvYmplY3RcIjoyMzksXCJkdXBcIjoxMTh9XSwyMjE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzExOV1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2VudW0tYnVnLWtleXNcIjoxODYsXCIuL19vYmplY3Qta2V5cy1pbnRlcm5hbFwiOjIyMCxcImR1cFwiOjExOX1dLDIyMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bMTIwXVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiZHVwXCI6MTIwfV0sMjIzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVsxMjNdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCJkdXBcIjoxMjN9XSwyMjQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzEyNF1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2FuLW9iamVjdFwiOjE3MSxcIi4vX2lzLW9iamVjdFwiOjIwMCxcIi4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHlcIjoyMTAsXCJkdXBcIjoxMjR9XSwyMjU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzEyNV1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcImR1cFwiOjEyNX1dLDIyNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgcmVkZWZpbmUgPSBfZGVyZXFfKCcuL19yZWRlZmluZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIHNhZmUpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBzYWZlKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbn0se1wiLi9fcmVkZWZpbmVcIjoyMjd9XSwyMjc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsb2JhbCA9IF9kZXJlcV8oJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSBfZGVyZXFfKCcuL19oaWRlJyk7XG52YXIgaGFzID0gX2RlcmVxXygnLi9faGFzJyk7XG52YXIgU1JDID0gX2RlcmVxXygnLi9fdWlkJykoJ3NyYycpO1xudmFyIFRPX1NUUklORyA9ICd0b1N0cmluZyc7XG52YXIgJHRvU3RyaW5nID0gRnVuY3Rpb25bVE9fU1RSSU5HXTtcbnZhciBUUEwgPSAoJycgKyAkdG9TdHJpbmcpLnNwbGl0KFRPX1NUUklORyk7XG5cbl9kZXJlcV8oJy4vX2NvcmUnKS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiAkdG9TdHJpbmcuY2FsbChpdCk7XG59O1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWwsIHNhZmUpIHtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgdmFsID09ICdmdW5jdGlvbic7XG4gIGlmIChpc0Z1bmN0aW9uKSBoYXModmFsLCAnbmFtZScpIHx8IGhpZGUodmFsLCAnbmFtZScsIGtleSk7XG4gIGlmIChPW2tleV0gPT09IHZhbCkgcmV0dXJuO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgU1JDKSB8fCBoaWRlKHZhbCwgU1JDLCBPW2tleV0gPyAnJyArIE9ba2V5XSA6IFRQTC5qb2luKFN0cmluZyhrZXkpKSk7XG4gIGlmIChPID09PSBnbG9iYWwpIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSBpZiAoIXNhZmUpIHtcbiAgICBkZWxldGUgT1trZXldO1xuICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICB9IGVsc2UgaWYgKE9ba2V5XSkge1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIHtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfVxuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIHRoaXNbU1JDXSB8fCAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbn0pO1xuXG59LHtcIi4vX2NvcmVcIjoxODAsXCIuL19nbG9iYWxcIjoxOTEsXCIuL19oYXNcIjoxOTIsXCIuL19oaWRlXCI6MTkzLFwiLi9fdWlkXCI6MjQ2fV0sMjI4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSBfZGVyZXFfKCcuL19nbG9iYWwnKTtcbnZhciBkUCA9IF9kZXJlcV8oJy4vX29iamVjdC1kcCcpO1xudmFyIERFU0NSSVBUT1JTID0gX2RlcmVxXygnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBTUEVDSUVTID0gX2RlcmVxXygnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciBDID0gZ2xvYmFsW0tFWV07XG4gIGlmIChERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKSBkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcblxufSx7XCIuL19kZXNjcmlwdG9yc1wiOjE4NCxcIi4vX2dsb2JhbFwiOjE5MSxcIi4vX29iamVjdC1kcFwiOjIxMyxcIi4vX3drc1wiOjI0OX1dLDIyOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bMTMwXVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9faGFzXCI6MTkyLFwiLi9fb2JqZWN0LWRwXCI6MjEzLFwiLi9fd2tzXCI6MjQ5LFwiZHVwXCI6MTMwfV0sMjMwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVsxMzFdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL19zaGFyZWRcIjoyMzEsXCIuL191aWRcIjoyNDYsXCJkdXBcIjoxMzF9XSwyMzE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzEzMl1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2dsb2JhbFwiOjE5MSxcImR1cFwiOjEzMn1dLDIzMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bMTMzXVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fYS1mdW5jdGlvblwiOjE2OCxcIi4vX2FuLW9iamVjdFwiOjE3MSxcIi4vX3drc1wiOjI0OSxcImR1cFwiOjEzM31dLDIzMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bMTM0XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fZGVmaW5lZFwiOjE4MyxcIi4vX3RvLWludGVnZXJcIjoyMzgsXCJkdXBcIjoxMzR9XSwyMzQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW50ZWdlciA9IF9kZXJlcV8oJy4vX3RvLWludGVnZXInKTtcbnZhciBkZWZpbmVkID0gX2RlcmVxXygnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlcGVhdChjb3VudCkge1xuICB2YXIgc3RyID0gU3RyaW5nKGRlZmluZWQodGhpcykpO1xuICB2YXIgcmVzID0gJyc7XG4gIHZhciBuID0gdG9JbnRlZ2VyKGNvdW50KTtcbiAgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpIHRocm93IFJhbmdlRXJyb3IoXCJDb3VudCBjYW4ndCBiZSBuZWdhdGl2ZVwiKTtcbiAgZm9yICg7biA+IDA7IChuID4+Pj0gMSkgJiYgKHN0ciArPSBzdHIpKSBpZiAobiAmIDEpIHJlcyArPSBzdHI7XG4gIHJldHVybiByZXM7XG59O1xuXG59LHtcIi4vX2RlZmluZWRcIjoxODMsXCIuL190by1pbnRlZ2VyXCI6MjM4fV0sMjM1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVsxMzVdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL19jb2ZcIjoxNzksXCIuL19jdHhcIjoxODIsXCIuL19kb20tY3JlYXRlXCI6MTg1LFwiLi9fZ2xvYmFsXCI6MTkxLFwiLi9faHRtbFwiOjE5NCxcIi4vX2ludm9rZVwiOjE5NixcImR1cFwiOjEzNX1dLDIzNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bMTM2XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fdG8taW50ZWdlclwiOjIzOCxcImR1cFwiOjEzNn1dLDIzNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2luZGV4XG52YXIgdG9JbnRlZ2VyID0gX2RlcmVxXygnLi9fdG8taW50ZWdlcicpO1xudmFyIHRvTGVuZ3RoID0gX2RlcmVxXygnLi9fdG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIHZhciBudW1iZXIgPSB0b0ludGVnZXIoaXQpO1xuICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgobnVtYmVyKTtcbiAgaWYgKG51bWJlciAhPT0gbGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBsZW5ndGghJyk7XG4gIHJldHVybiBsZW5ndGg7XG59O1xuXG59LHtcIi4vX3RvLWludGVnZXJcIjoyMzgsXCIuL190by1sZW5ndGhcIjoyNDB9XSwyMzg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzEzN11bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcImR1cFwiOjEzN31dLDIzOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bMTM4XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fZGVmaW5lZFwiOjE4MyxcIi4vX2lvYmplY3RcIjoxOTcsXCJkdXBcIjoxMzh9XSwyNDA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzEzOV1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX3RvLWludGVnZXJcIjoyMzgsXCJkdXBcIjoxMzl9XSwyNDE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzE0MF1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2RlZmluZWRcIjoxODMsXCJkdXBcIjoxNDB9XSwyNDI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzE0MV1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2lzLW9iamVjdFwiOjIwMCxcImR1cFwiOjE0MX1dLDI0MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5pZiAoX2RlcmVxXygnLi9fZGVzY3JpcHRvcnMnKSkge1xuICB2YXIgTElCUkFSWSA9IF9kZXJlcV8oJy4vX2xpYnJhcnknKTtcbiAgdmFyIGdsb2JhbCA9IF9kZXJlcV8oJy4vX2dsb2JhbCcpO1xuICB2YXIgZmFpbHMgPSBfZGVyZXFfKCcuL19mYWlscycpO1xuICB2YXIgJGV4cG9ydCA9IF9kZXJlcV8oJy4vX2V4cG9ydCcpO1xuICB2YXIgJHR5cGVkID0gX2RlcmVxXygnLi9fdHlwZWQnKTtcbiAgdmFyICRidWZmZXIgPSBfZGVyZXFfKCcuL190eXBlZC1idWZmZXInKTtcbiAgdmFyIGN0eCA9IF9kZXJlcV8oJy4vX2N0eCcpO1xuICB2YXIgYW5JbnN0YW5jZSA9IF9kZXJlcV8oJy4vX2FuLWluc3RhbmNlJyk7XG4gIHZhciBwcm9wZXJ0eURlc2MgPSBfZGVyZXFfKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG4gIHZhciBoaWRlID0gX2RlcmVxXygnLi9faGlkZScpO1xuICB2YXIgcmVkZWZpbmVBbGwgPSBfZGVyZXFfKCcuL19yZWRlZmluZS1hbGwnKTtcbiAgdmFyIHRvSW50ZWdlciA9IF9kZXJlcV8oJy4vX3RvLWludGVnZXInKTtcbiAgdmFyIHRvTGVuZ3RoID0gX2RlcmVxXygnLi9fdG8tbGVuZ3RoJyk7XG4gIHZhciB0b0luZGV4ID0gX2RlcmVxXygnLi9fdG8taW5kZXgnKTtcbiAgdmFyIHRvQWJzb2x1dGVJbmRleCA9IF9kZXJlcV8oJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG4gIHZhciB0b1ByaW1pdGl2ZSA9IF9kZXJlcV8oJy4vX3RvLXByaW1pdGl2ZScpO1xuICB2YXIgaGFzID0gX2RlcmVxXygnLi9faGFzJyk7XG4gIHZhciBjbGFzc29mID0gX2RlcmVxXygnLi9fY2xhc3NvZicpO1xuICB2YXIgaXNPYmplY3QgPSBfZGVyZXFfKCcuL19pcy1vYmplY3QnKTtcbiAgdmFyIHRvT2JqZWN0ID0gX2RlcmVxXygnLi9fdG8tb2JqZWN0Jyk7XG4gIHZhciBpc0FycmF5SXRlciA9IF9kZXJlcV8oJy4vX2lzLWFycmF5LWl0ZXInKTtcbiAgdmFyIGNyZWF0ZSA9IF9kZXJlcV8oJy4vX29iamVjdC1jcmVhdGUnKTtcbiAgdmFyIGdldFByb3RvdHlwZU9mID0gX2RlcmVxXygnLi9fb2JqZWN0LWdwbycpO1xuICB2YXIgZ09QTiA9IF9kZXJlcV8oJy4vX29iamVjdC1nb3BuJykuZjtcbiAgdmFyIGdldEl0ZXJGbiA9IF9kZXJlcV8oJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG4gIHZhciB1aWQgPSBfZGVyZXFfKCcuL191aWQnKTtcbiAgdmFyIHdrcyA9IF9kZXJlcV8oJy4vX3drcycpO1xuICB2YXIgY3JlYXRlQXJyYXlNZXRob2QgPSBfZGVyZXFfKCcuL19hcnJheS1tZXRob2RzJyk7XG4gIHZhciBjcmVhdGVBcnJheUluY2x1ZGVzID0gX2RlcmVxXygnLi9fYXJyYXktaW5jbHVkZXMnKTtcbiAgdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9kZXJlcV8oJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbiAgdmFyIEFycmF5SXRlcmF0b3JzID0gX2RlcmVxXygnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbiAgdmFyIEl0ZXJhdG9ycyA9IF9kZXJlcV8oJy4vX2l0ZXJhdG9ycycpO1xuICB2YXIgJGl0ZXJEZXRlY3QgPSBfZGVyZXFfKCcuL19pdGVyLWRldGVjdCcpO1xuICB2YXIgc2V0U3BlY2llcyA9IF9kZXJlcV8oJy4vX3NldC1zcGVjaWVzJyk7XG4gIHZhciBhcnJheUZpbGwgPSBfZGVyZXFfKCcuL19hcnJheS1maWxsJyk7XG4gIHZhciBhcnJheUNvcHlXaXRoaW4gPSBfZGVyZXFfKCcuL19hcnJheS1jb3B5LXdpdGhpbicpO1xuICB2YXIgJERQID0gX2RlcmVxXygnLi9fb2JqZWN0LWRwJyk7XG4gIHZhciAkR09QRCA9IF9kZXJlcV8oJy4vX29iamVjdC1nb3BkJyk7XG4gIHZhciBkUCA9ICREUC5mO1xuICB2YXIgZ09QRCA9ICRHT1BELmY7XG4gIHZhciBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7XG4gIHZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuICB2YXIgVWludDhBcnJheSA9IGdsb2JhbC5VaW50OEFycmF5O1xuICB2YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcbiAgdmFyIFNIQVJFRF9CVUZGRVIgPSAnU2hhcmVkJyArIEFSUkFZX0JVRkZFUjtcbiAgdmFyIEJZVEVTX1BFUl9FTEVNRU5UID0gJ0JZVEVTX1BFUl9FTEVNRU5UJztcbiAgdmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuICB2YXIgQXJyYXlQcm90byA9IEFycmF5W1BST1RPVFlQRV07XG4gIHZhciAkQXJyYXlCdWZmZXIgPSAkYnVmZmVyLkFycmF5QnVmZmVyO1xuICB2YXIgJERhdGFWaWV3ID0gJGJ1ZmZlci5EYXRhVmlldztcbiAgdmFyIGFycmF5Rm9yRWFjaCA9IGNyZWF0ZUFycmF5TWV0aG9kKDApO1xuICB2YXIgYXJyYXlGaWx0ZXIgPSBjcmVhdGVBcnJheU1ldGhvZCgyKTtcbiAgdmFyIGFycmF5U29tZSA9IGNyZWF0ZUFycmF5TWV0aG9kKDMpO1xuICB2YXIgYXJyYXlFdmVyeSA9IGNyZWF0ZUFycmF5TWV0aG9kKDQpO1xuICB2YXIgYXJyYXlGaW5kID0gY3JlYXRlQXJyYXlNZXRob2QoNSk7XG4gIHZhciBhcnJheUZpbmRJbmRleCA9IGNyZWF0ZUFycmF5TWV0aG9kKDYpO1xuICB2YXIgYXJyYXlJbmNsdWRlcyA9IGNyZWF0ZUFycmF5SW5jbHVkZXModHJ1ZSk7XG4gIHZhciBhcnJheUluZGV4T2YgPSBjcmVhdGVBcnJheUluY2x1ZGVzKGZhbHNlKTtcbiAgdmFyIGFycmF5VmFsdWVzID0gQXJyYXlJdGVyYXRvcnMudmFsdWVzO1xuICB2YXIgYXJyYXlLZXlzID0gQXJyYXlJdGVyYXRvcnMua2V5cztcbiAgdmFyIGFycmF5RW50cmllcyA9IEFycmF5SXRlcmF0b3JzLmVudHJpZXM7XG4gIHZhciBhcnJheUxhc3RJbmRleE9mID0gQXJyYXlQcm90by5sYXN0SW5kZXhPZjtcbiAgdmFyIGFycmF5UmVkdWNlID0gQXJyYXlQcm90by5yZWR1Y2U7XG4gIHZhciBhcnJheVJlZHVjZVJpZ2h0ID0gQXJyYXlQcm90by5yZWR1Y2VSaWdodDtcbiAgdmFyIGFycmF5Sm9pbiA9IEFycmF5UHJvdG8uam9pbjtcbiAgdmFyIGFycmF5U29ydCA9IEFycmF5UHJvdG8uc29ydDtcbiAgdmFyIGFycmF5U2xpY2UgPSBBcnJheVByb3RvLnNsaWNlO1xuICB2YXIgYXJyYXlUb1N0cmluZyA9IEFycmF5UHJvdG8udG9TdHJpbmc7XG4gIHZhciBhcnJheVRvTG9jYWxlU3RyaW5nID0gQXJyYXlQcm90by50b0xvY2FsZVN0cmluZztcbiAgdmFyIElURVJBVE9SID0gd2tzKCdpdGVyYXRvcicpO1xuICB2YXIgVEFHID0gd2tzKCd0b1N0cmluZ1RhZycpO1xuICB2YXIgVFlQRURfQ09OU1RSVUNUT1IgPSB1aWQoJ3R5cGVkX2NvbnN0cnVjdG9yJyk7XG4gIHZhciBERUZfQ09OU1RSVUNUT1IgPSB1aWQoJ2RlZl9jb25zdHJ1Y3RvcicpO1xuICB2YXIgQUxMX0NPTlNUUlVDVE9SUyA9ICR0eXBlZC5DT05TVFI7XG4gIHZhciBUWVBFRF9BUlJBWSA9ICR0eXBlZC5UWVBFRDtcbiAgdmFyIFZJRVcgPSAkdHlwZWQuVklFVztcbiAgdmFyIFdST05HX0xFTkdUSCA9ICdXcm9uZyBsZW5ndGghJztcblxuICB2YXIgJG1hcCA9IGNyZWF0ZUFycmF5TWV0aG9kKDEsIGZ1bmN0aW9uIChPLCBsZW5ndGgpIHtcbiAgICByZXR1cm4gYWxsb2NhdGUoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE9bREVGX0NPTlNUUlVDVE9SXSksIGxlbmd0aCk7XG4gIH0pO1xuXG4gIHZhciBMSVRUTEVfRU5ESUFOID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShuZXcgVWludDE2QXJyYXkoWzFdKS5idWZmZXIpWzBdID09PSAxO1xuICB9KTtcblxuICB2YXIgRk9SQ0VEX1NFVCA9ICEhVWludDhBcnJheSAmJiAhIVVpbnQ4QXJyYXlbUFJPVE9UWVBFXS5zZXQgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBVaW50OEFycmF5KDEpLnNldCh7fSk7XG4gIH0pO1xuXG4gIHZhciB0b09mZnNldCA9IGZ1bmN0aW9uIChpdCwgQllURVMpIHtcbiAgICB2YXIgb2Zmc2V0ID0gdG9JbnRlZ2VyKGl0KTtcbiAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgJSBCWVRFUykgdGhyb3cgUmFuZ2VFcnJvcignV3Jvbmcgb2Zmc2V0IScpO1xuICAgIHJldHVybiBvZmZzZXQ7XG4gIH07XG5cbiAgdmFyIHZhbGlkYXRlID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgaWYgKGlzT2JqZWN0KGl0KSAmJiBUWVBFRF9BUlJBWSBpbiBpdCkgcmV0dXJuIGl0O1xuICAgIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgdHlwZWQgYXJyYXkhJyk7XG4gIH07XG5cbiAgdmFyIGFsbG9jYXRlID0gZnVuY3Rpb24gKEMsIGxlbmd0aCkge1xuICAgIGlmICghKGlzT2JqZWN0KEMpICYmIFRZUEVEX0NPTlNUUlVDVE9SIGluIEMpKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0l0IGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yIScpO1xuICAgIH0gcmV0dXJuIG5ldyBDKGxlbmd0aCk7XG4gIH07XG5cbiAgdmFyIHNwZWNpZXNGcm9tTGlzdCA9IGZ1bmN0aW9uIChPLCBsaXN0KSB7XG4gICAgcmV0dXJuIGZyb21MaXN0KHNwZWNpZXNDb25zdHJ1Y3RvcihPLCBPW0RFRl9DT05TVFJVQ1RPUl0pLCBsaXN0KTtcbiAgfTtcblxuICB2YXIgZnJvbUxpc3QgPSBmdW5jdGlvbiAoQywgbGlzdCkge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSBhbGxvY2F0ZShDLCBsZW5ndGgpO1xuICAgIHdoaWxlIChsZW5ndGggPiBpbmRleCkgcmVzdWx0W2luZGV4XSA9IGxpc3RbaW5kZXgrK107XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgYWRkR2V0dGVyID0gZnVuY3Rpb24gKGl0LCBrZXksIGludGVybmFsKSB7XG4gICAgZFAoaXQsIGtleSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RbaW50ZXJuYWxdOyB9IH0pO1xuICB9O1xuXG4gIHZhciAkZnJvbSA9IGZ1bmN0aW9uIGZyb20oc291cmNlIC8qICwgbWFwZm4sIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHNvdXJjZSk7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBtYXBmbiA9IGFMZW4gPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgICB2YXIgaXRlckZuID0gZ2V0SXRlckZuKE8pO1xuICAgIHZhciBpLCBsZW5ndGgsIHZhbHVlcywgcmVzdWx0LCBzdGVwLCBpdGVyYXRvcjtcbiAgICBpZiAoaXRlckZuICE9IHVuZGVmaW5lZCAmJiAhaXNBcnJheUl0ZXIoaXRlckZuKSkge1xuICAgICAgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCB2YWx1ZXMgPSBbXSwgaSA9IDA7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaSsrKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHN0ZXAudmFsdWUpO1xuICAgICAgfSBPID0gdmFsdWVzO1xuICAgIH1cbiAgICBpZiAobWFwcGluZyAmJiBhTGVuID4gMikgbWFwZm4gPSBjdHgobWFwZm4sIGFyZ3VtZW50c1syXSwgMik7XG4gICAgZm9yIChpID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpLCByZXN1bHQgPSBhbGxvY2F0ZSh0aGlzLCBsZW5ndGgpOyBsZW5ndGggPiBpOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXSA9IG1hcHBpbmcgPyBtYXBmbihPW2ldLCBpKSA6IE9baV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyICRvZiA9IGZ1bmN0aW9uIG9mKC8qIC4uLml0ZW1zICovKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0ID0gYWxsb2NhdGUodGhpcywgbGVuZ3RoKTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBhcmd1bWVudHNbaW5kZXgrK107XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBpT1MgU2FmYXJpIDYueCBmYWlscyBoZXJlXG4gIHZhciBUT19MT0NBTEVfQlVHID0gISFVaW50OEFycmF5ICYmIGZhaWxzKGZ1bmN0aW9uICgpIHsgYXJyYXlUb0xvY2FsZVN0cmluZy5jYWxsKG5ldyBVaW50OEFycmF5KDEpKTsgfSk7XG5cbiAgdmFyICR0b0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uIHRvTG9jYWxlU3RyaW5nKCkge1xuICAgIHJldHVybiBhcnJheVRvTG9jYWxlU3RyaW5nLmFwcGx5KFRPX0xPQ0FMRV9CVUcgPyBhcnJheVNsaWNlLmNhbGwodmFsaWRhdGUodGhpcykpIDogdmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgdmFyIHByb3RvID0ge1xuICAgIGNvcHlXaXRoaW46IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0LCBzdGFydCAvKiAsIGVuZCAqLykge1xuICAgICAgcmV0dXJuIGFycmF5Q29weVdpdGhpbi5jYWxsKHZhbGlkYXRlKHRoaXMpLCB0YXJnZXQsIHN0YXJ0LCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBldmVyeTogZnVuY3Rpb24gZXZlcnkoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUV2ZXJ5KHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBmaWxsOiBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qICwgc3RhcnQsIGVuZCAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlGaWxsLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBzcGVjaWVzRnJvbUxpc3QodGhpcywgYXJyYXlGaWx0ZXIodmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sXG4gICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKSk7XG4gICAgfSxcbiAgICBmaW5kOiBmdW5jdGlvbiBmaW5kKHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUZpbmQodmFsaWRhdGUodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgocHJlZGljYXRlIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIGFycmF5RmluZEluZGV4KHZhbGlkYXRlKHRoaXMpLCBwcmVkaWNhdGUsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIGFycmF5Rm9yRWFjaCh2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgaW5kZXhPZjogZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlJbmRleE9mKHZhbGlkYXRlKHRoaXMpLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykge1xuICAgICAgcmV0dXJuIGFycmF5SW5jbHVkZXModmFsaWRhdGUodGhpcyksIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGpvaW46IGZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheUpvaW4uYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBsYXN0SW5kZXhPZjogZnVuY3Rpb24gbGFzdEluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlMYXN0SW5kZXhPZi5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIG1hcDogZnVuY3Rpb24gbWFwKG1hcGZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuICRtYXAodmFsaWRhdGUodGhpcyksIG1hcGZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZShjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheVJlZHVjZS5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheVJlZHVjZVJpZ2h0LmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgcmV2ZXJzZTogZnVuY3Rpb24gcmV2ZXJzZSgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciBsZW5ndGggPSB2YWxpZGF0ZSh0aGF0KS5sZW5ndGg7XG4gICAgICB2YXIgbWlkZGxlID0gTWF0aC5mbG9vcihsZW5ndGggLyAyKTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICB3aGlsZSAoaW5kZXggPCBtaWRkbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0aGF0W2luZGV4XTtcbiAgICAgICAgdGhhdFtpbmRleCsrXSA9IHRoYXRbLS1sZW5ndGhdO1xuICAgICAgICB0aGF0W2xlbmd0aF0gPSB2YWx1ZTtcbiAgICAgIH0gcmV0dXJuIHRoYXQ7XG4gICAgfSxcbiAgICBzb21lOiBmdW5jdGlvbiBzb21lKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlTb21lKHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbikge1xuICAgICAgcmV0dXJuIGFycmF5U29ydC5jYWxsKHZhbGlkYXRlKHRoaXMpLCBjb21wYXJlZm4pO1xuICAgIH0sXG4gICAgc3ViYXJyYXk6IGZ1bmN0aW9uIHN1YmFycmF5KGJlZ2luLCBlbmQpIHtcbiAgICAgIHZhciBPID0gdmFsaWRhdGUodGhpcyk7XG4gICAgICB2YXIgbGVuZ3RoID0gTy5sZW5ndGg7XG4gICAgICB2YXIgJGJlZ2luID0gdG9BYnNvbHV0ZUluZGV4KGJlZ2luLCBsZW5ndGgpO1xuICAgICAgcmV0dXJuIG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE9bREVGX0NPTlNUUlVDVE9SXSkpKFxuICAgICAgICBPLmJ1ZmZlcixcbiAgICAgICAgTy5ieXRlT2Zmc2V0ICsgJGJlZ2luICogTy5CWVRFU19QRVJfRUxFTUVOVCxcbiAgICAgICAgdG9MZW5ndGgoKGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuZ3RoKSkgLSAkYmVnaW4pXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICB2YXIgJHNsaWNlID0gZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBzcGVjaWVzRnJvbUxpc3QodGhpcywgYXJyYXlTbGljZS5jYWxsKHZhbGlkYXRlKHRoaXMpLCBzdGFydCwgZW5kKSk7XG4gIH07XG5cbiAgdmFyICRzZXQgPSBmdW5jdGlvbiBzZXQoYXJyYXlMaWtlIC8qICwgb2Zmc2V0ICovKSB7XG4gICAgdmFsaWRhdGUodGhpcyk7XG4gICAgdmFyIG9mZnNldCA9IHRvT2Zmc2V0KGFyZ3VtZW50c1sxXSwgMSk7XG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIHZhciBzcmMgPSB0b09iamVjdChhcnJheUxpa2UpO1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aChzcmMubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGlmIChsZW4gKyBvZmZzZXQgPiBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICB3aGlsZSAoaW5kZXggPCBsZW4pIHRoaXNbb2Zmc2V0ICsgaW5kZXhdID0gc3JjW2luZGV4KytdO1xuICB9O1xuXG4gIHZhciAkaXRlcmF0b3JzID0ge1xuICAgIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7XG4gICAgICByZXR1cm4gYXJyYXlFbnRyaWVzLmNhbGwodmFsaWRhdGUodGhpcykpO1xuICAgIH0sXG4gICAga2V5czogZnVuY3Rpb24ga2V5cygpIHtcbiAgICAgIHJldHVybiBhcnJheUtleXMuY2FsbCh2YWxpZGF0ZSh0aGlzKSk7XG4gICAgfSxcbiAgICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcygpIHtcbiAgICAgIHJldHVybiBhcnJheVZhbHVlcy5jYWxsKHZhbGlkYXRlKHRoaXMpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGlzVEFJbmRleCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgIHJldHVybiBpc09iamVjdCh0YXJnZXQpXG4gICAgICAmJiB0YXJnZXRbVFlQRURfQVJSQVldXG4gICAgICAmJiB0eXBlb2Yga2V5ICE9ICdzeW1ib2wnXG4gICAgICAmJiBrZXkgaW4gdGFyZ2V0XG4gICAgICAmJiBTdHJpbmcoK2tleSkgPT0gU3RyaW5nKGtleSk7XG4gIH07XG4gIHZhciAkZ2V0RGVzYyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkge1xuICAgIHJldHVybiBpc1RBSW5kZXgodGFyZ2V0LCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKVxuICAgICAgPyBwcm9wZXJ0eURlc2MoMiwgdGFyZ2V0W2tleV0pXG4gICAgICA6IGdPUEQodGFyZ2V0LCBrZXkpO1xuICB9O1xuICB2YXIgJHNldERlc2MgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzYykge1xuICAgIGlmIChpc1RBSW5kZXgodGFyZ2V0LCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKVxuICAgICAgJiYgaXNPYmplY3QoZGVzYylcbiAgICAgICYmIGhhcyhkZXNjLCAndmFsdWUnKVxuICAgICAgJiYgIWhhcyhkZXNjLCAnZ2V0JylcbiAgICAgICYmICFoYXMoZGVzYywgJ3NldCcpXG4gICAgICAvLyBUT0RPOiBhZGQgdmFsaWRhdGlvbiBkZXNjcmlwdG9yIHcvbyBjYWxsaW5nIGFjY2Vzc29yc1xuICAgICAgJiYgIWRlc2MuY29uZmlndXJhYmxlXG4gICAgICAmJiAoIWhhcyhkZXNjLCAnd3JpdGFibGUnKSB8fCBkZXNjLndyaXRhYmxlKVxuICAgICAgJiYgKCFoYXMoZGVzYywgJ2VudW1lcmFibGUnKSB8fCBkZXNjLmVudW1lcmFibGUpXG4gICAgKSB7XG4gICAgICB0YXJnZXRba2V5XSA9IGRlc2MudmFsdWU7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0gcmV0dXJuIGRQKHRhcmdldCwga2V5LCBkZXNjKTtcbiAgfTtcblxuICBpZiAoIUFMTF9DT05TVFJVQ1RPUlMpIHtcbiAgICAkR09QRC5mID0gJGdldERlc2M7XG4gICAgJERQLmYgPSAkc2V0RGVzYztcbiAgfVxuXG4gICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIUFMTF9DT05TVFJVQ1RPUlMsICdPYmplY3QnLCB7XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0RGVzYyxcbiAgICBkZWZpbmVQcm9wZXJ0eTogJHNldERlc2NcbiAgfSk7XG5cbiAgaWYgKGZhaWxzKGZ1bmN0aW9uICgpIHsgYXJyYXlUb1N0cmluZy5jYWxsKHt9KTsgfSkpIHtcbiAgICBhcnJheVRvU3RyaW5nID0gYXJyYXlUb0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIGFycmF5Sm9pbi5jYWxsKHRoaXMpO1xuICAgIH07XG4gIH1cblxuICB2YXIgJFR5cGVkQXJyYXlQcm90b3R5cGUkID0gcmVkZWZpbmVBbGwoe30sIHByb3RvKTtcbiAgcmVkZWZpbmVBbGwoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAkaXRlcmF0b3JzKTtcbiAgaGlkZSgkVHlwZWRBcnJheVByb3RvdHlwZSQsIElURVJBVE9SLCAkaXRlcmF0b3JzLnZhbHVlcyk7XG4gIHJlZGVmaW5lQWxsKCRUeXBlZEFycmF5UHJvdG90eXBlJCwge1xuICAgIHNsaWNlOiAkc2xpY2UsXG4gICAgc2V0OiAkc2V0LFxuICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7IC8qIG5vb3AgKi8gfSxcbiAgICB0b1N0cmluZzogYXJyYXlUb1N0cmluZyxcbiAgICB0b0xvY2FsZVN0cmluZzogJHRvTG9jYWxlU3RyaW5nXG4gIH0pO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnYnVmZmVyJywgJ2InKTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2J5dGVPZmZzZXQnLCAnbycpO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnYnl0ZUxlbmd0aCcsICdsJyk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdsZW5ndGgnLCAnZScpO1xuICBkUCgkVHlwZWRBcnJheVByb3RvdHlwZSQsIFRBRywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpc1tUWVBFRF9BUlJBWV07IH1cbiAgfSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgQllURVMsIHdyYXBwZXIsIENMQU1QRUQpIHtcbiAgICBDTEFNUEVEID0gISFDTEFNUEVEO1xuICAgIHZhciBOQU1FID0gS0VZICsgKENMQU1QRUQgPyAnQ2xhbXBlZCcgOiAnJykgKyAnQXJyYXknO1xuICAgIHZhciBHRVRURVIgPSAnZ2V0JyArIEtFWTtcbiAgICB2YXIgU0VUVEVSID0gJ3NldCcgKyBLRVk7XG4gICAgdmFyIFR5cGVkQXJyYXkgPSBnbG9iYWxbTkFNRV07XG4gICAgdmFyIEJhc2UgPSBUeXBlZEFycmF5IHx8IHt9O1xuICAgIHZhciBUQUMgPSBUeXBlZEFycmF5ICYmIGdldFByb3RvdHlwZU9mKFR5cGVkQXJyYXkpO1xuICAgIHZhciBGT1JDRUQgPSAhVHlwZWRBcnJheSB8fCAhJHR5cGVkLkFCVjtcbiAgICB2YXIgTyA9IHt9O1xuICAgIHZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gVHlwZWRBcnJheSAmJiBUeXBlZEFycmF5W1BST1RPVFlQRV07XG4gICAgdmFyIGdldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCkge1xuICAgICAgdmFyIGRhdGEgPSB0aGF0Ll9kO1xuICAgICAgcmV0dXJuIGRhdGEudltHRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLm8sIExJVFRMRV9FTkRJQU4pO1xuICAgIH07XG4gICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhhdC5fZDtcbiAgICAgIGlmIChDTEFNUEVEKSB2YWx1ZSA9ICh2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUpKSA8IDAgPyAwIDogdmFsdWUgPiAweGZmID8gMHhmZiA6IHZhbHVlICYgMHhmZjtcbiAgICAgIGRhdGEudltTRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLm8sIHZhbHVlLCBMSVRUTEVfRU5ESUFOKTtcbiAgICB9O1xuICAgIHZhciBhZGRFbGVtZW50ID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4KSB7XG4gICAgICBkUCh0aGF0LCBpbmRleCwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0dGVyKHRoaXMsIGluZGV4KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gc2V0dGVyKHRoaXMsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG4gICAgaWYgKEZPUkNFRCkge1xuICAgICAgVHlwZWRBcnJheSA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGRhdGEsICRvZmZzZXQsICRsZW5ndGgpIHtcbiAgICAgICAgYW5JbnN0YW5jZSh0aGF0LCBUeXBlZEFycmF5LCBOQU1FLCAnX2QnKTtcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIHZhciBidWZmZXIsIGJ5dGVMZW5ndGgsIGxlbmd0aCwga2xhc3M7XG4gICAgICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgICBsZW5ndGggPSB0b0luZGV4KGRhdGEpO1xuICAgICAgICAgIGJ5dGVMZW5ndGggPSBsZW5ndGggKiBCWVRFUztcbiAgICAgICAgICBidWZmZXIgPSBuZXcgJEFycmF5QnVmZmVyKGJ5dGVMZW5ndGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiAkQXJyYXlCdWZmZXIgfHwgKGtsYXNzID0gY2xhc3NvZihkYXRhKSkgPT0gQVJSQVlfQlVGRkVSIHx8IGtsYXNzID09IFNIQVJFRF9CVUZGRVIpIHtcbiAgICAgICAgICBidWZmZXIgPSBkYXRhO1xuICAgICAgICAgIG9mZnNldCA9IHRvT2Zmc2V0KCRvZmZzZXQsIEJZVEVTKTtcbiAgICAgICAgICB2YXIgJGxlbiA9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICBpZiAoJGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoJGxlbiAlIEJZVEVTKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gJGxlbiAtIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChieXRlTGVuZ3RoIDwgMCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gdG9MZW5ndGgoJGxlbmd0aCkgKiBCWVRFUztcbiAgICAgICAgICAgIGlmIChieXRlTGVuZ3RoICsgb2Zmc2V0ID4gJGxlbikgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW5ndGggPSBieXRlTGVuZ3RoIC8gQllURVM7XG4gICAgICAgIH0gZWxzZSBpZiAoVFlQRURfQVJSQVkgaW4gZGF0YSkge1xuICAgICAgICAgIHJldHVybiBmcm9tTGlzdChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gJGZyb20uY2FsbChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBoaWRlKHRoYXQsICdfZCcsIHtcbiAgICAgICAgICBiOiBidWZmZXIsXG4gICAgICAgICAgbzogb2Zmc2V0LFxuICAgICAgICAgIGw6IGJ5dGVMZW5ndGgsXG4gICAgICAgICAgZTogbGVuZ3RoLFxuICAgICAgICAgIHY6IG5ldyAkRGF0YVZpZXcoYnVmZmVyKVxuICAgICAgICB9KTtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSBhZGRFbGVtZW50KHRoYXQsIGluZGV4KyspO1xuICAgICAgfSk7XG4gICAgICBUeXBlZEFycmF5UHJvdG90eXBlID0gVHlwZWRBcnJheVtQUk9UT1RZUEVdID0gY3JlYXRlKCRUeXBlZEFycmF5UHJvdG90eXBlJCk7XG4gICAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIFR5cGVkQXJyYXkpO1xuICAgIH0gZWxzZSBpZiAoIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIFR5cGVkQXJyYXkoMSk7XG4gICAgfSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5ldyBUeXBlZEFycmF5KC0xKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICB9KSB8fCAhJGl0ZXJEZXRlY3QoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgICAgIG5ldyBUeXBlZEFycmF5KCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICBuZXcgVHlwZWRBcnJheShudWxsKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIG5ldyBUeXBlZEFycmF5KDEuNSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICBuZXcgVHlwZWRBcnJheShpdGVyKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICB9LCB0cnVlKSkge1xuICAgICAgVHlwZWRBcnJheSA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGRhdGEsICRvZmZzZXQsICRsZW5ndGgpIHtcbiAgICAgICAgYW5JbnN0YW5jZSh0aGF0LCBUeXBlZEFycmF5LCBOQU1FKTtcbiAgICAgICAgdmFyIGtsYXNzO1xuICAgICAgICAvLyBgd3NgIG1vZHVsZSBidWcsIHRlbXBvcmFyaWx5IHJlbW92ZSB2YWxpZGF0aW9uIGxlbmd0aCBmb3IgVWludDhBcnJheVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2Vic29ja2V0cy93cy9wdWxsLzY0NVxuICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSByZXR1cm4gbmV3IEJhc2UodG9JbmRleChkYXRhKSk7XG4gICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgJEFycmF5QnVmZmVyIHx8IChrbGFzcyA9IGNsYXNzb2YoZGF0YSkpID09IEFSUkFZX0JVRkZFUiB8fCBrbGFzcyA9PSBTSEFSRURfQlVGRkVSKSB7XG4gICAgICAgICAgcmV0dXJuICRsZW5ndGggIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBuZXcgQmFzZShkYXRhLCB0b09mZnNldCgkb2Zmc2V0LCBCWVRFUyksICRsZW5ndGgpXG4gICAgICAgICAgICA6ICRvZmZzZXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IG5ldyBCYXNlKGRhdGEsIHRvT2Zmc2V0KCRvZmZzZXQsIEJZVEVTKSlcbiAgICAgICAgICAgICAgOiBuZXcgQmFzZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoVFlQRURfQVJSQVkgaW4gZGF0YSkgcmV0dXJuIGZyb21MaXN0KFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgICByZXR1cm4gJGZyb20uY2FsbChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgIH0pO1xuICAgICAgYXJyYXlGb3JFYWNoKFRBQyAhPT0gRnVuY3Rpb24ucHJvdG90eXBlID8gZ09QTihCYXNlKS5jb25jYXQoZ09QTihUQUMpKSA6IGdPUE4oQmFzZSksIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIFR5cGVkQXJyYXkpKSBoaWRlKFR5cGVkQXJyYXksIGtleSwgQmFzZVtrZXldKTtcbiAgICAgIH0pO1xuICAgICAgVHlwZWRBcnJheVtQUk9UT1RZUEVdID0gVHlwZWRBcnJheVByb3RvdHlwZTtcbiAgICAgIGlmICghTElCUkFSWSkgVHlwZWRBcnJheVByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR5cGVkQXJyYXk7XG4gICAgfVxuICAgIHZhciAkbmF0aXZlSXRlcmF0b3IgPSBUeXBlZEFycmF5UHJvdG90eXBlW0lURVJBVE9SXTtcbiAgICB2YXIgQ09SUkVDVF9JVEVSX05BTUUgPSAhISRuYXRpdmVJdGVyYXRvclxuICAgICAgJiYgKCRuYXRpdmVJdGVyYXRvci5uYW1lID09ICd2YWx1ZXMnIHx8ICRuYXRpdmVJdGVyYXRvci5uYW1lID09IHVuZGVmaW5lZCk7XG4gICAgdmFyICRpdGVyYXRvciA9ICRpdGVyYXRvcnMudmFsdWVzO1xuICAgIGhpZGUoVHlwZWRBcnJheSwgVFlQRURfQ09OU1RSVUNUT1IsIHRydWUpO1xuICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgVFlQRURfQVJSQVksIE5BTUUpO1xuICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgVklFVywgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBERUZfQ09OU1RSVUNUT1IsIFR5cGVkQXJyYXkpO1xuXG4gICAgaWYgKENMQU1QRUQgPyBuZXcgVHlwZWRBcnJheSgxKVtUQUddICE9IE5BTUUgOiAhKFRBRyBpbiBUeXBlZEFycmF5UHJvdG90eXBlKSkge1xuICAgICAgZFAoVHlwZWRBcnJheVByb3RvdHlwZSwgVEFHLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gTkFNRTsgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgT1tOQU1FXSA9IFR5cGVkQXJyYXk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChUeXBlZEFycmF5ICE9IEJhc2UpLCBPKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5TLCBOQU1FLCB7XG4gICAgICBCWVRFU19QRVJfRUxFTUVOVDogQllURVNcbiAgICB9KTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkgeyBCYXNlLm9mLmNhbGwoVHlwZWRBcnJheSwgMSk7IH0pLCBOQU1FLCB7XG4gICAgICBmcm9tOiAkZnJvbSxcbiAgICAgIG9mOiAkb2ZcbiAgICB9KTtcblxuICAgIGlmICghKEJZVEVTX1BFUl9FTEVNRU5UIGluIFR5cGVkQXJyYXlQcm90b3R5cGUpKSBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIEJZVEVTX1BFUl9FTEVNRU5ULCBCWVRFUyk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCwgTkFNRSwgcHJvdG8pO1xuXG4gICAgc2V0U3BlY2llcyhOQU1FKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogRk9SQ0VEX1NFVCwgTkFNRSwgeyBzZXQ6ICRzZXQgfSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFDT1JSRUNUX0lURVJfTkFNRSwgTkFNRSwgJGl0ZXJhdG9ycyk7XG5cbiAgICBpZiAoIUxJQlJBUlkgJiYgVHlwZWRBcnJheVByb3RvdHlwZS50b1N0cmluZyAhPSBhcnJheVRvU3RyaW5nKSBUeXBlZEFycmF5UHJvdG90eXBlLnRvU3RyaW5nID0gYXJyYXlUb1N0cmluZztcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgbmV3IFR5cGVkQXJyYXkoMSkuc2xpY2UoKTtcbiAgICB9KSwgTkFNRSwgeyBzbGljZTogJHNsaWNlIH0pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFsxLCAyXS50b0xvY2FsZVN0cmluZygpICE9IG5ldyBUeXBlZEFycmF5KFsxLCAyXSkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgVHlwZWRBcnJheVByb3RvdHlwZS50b0xvY2FsZVN0cmluZy5jYWxsKFsxLCAyXSk7XG4gICAgfSkpLCBOQU1FLCB7IHRvTG9jYWxlU3RyaW5nOiAkdG9Mb2NhbGVTdHJpbmcgfSk7XG5cbiAgICBJdGVyYXRvcnNbTkFNRV0gPSBDT1JSRUNUX0lURVJfTkFNRSA/ICRuYXRpdmVJdGVyYXRvciA6ICRpdGVyYXRvcjtcbiAgICBpZiAoIUxJQlJBUlkgJiYgIUNPUlJFQ1RfSVRFUl9OQU1FKSBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIElURVJBVE9SLCAkaXRlcmF0b3IpO1xuICB9O1xufSBlbHNlIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuXG59LHtcIi4vX2FuLWluc3RhbmNlXCI6MTcwLFwiLi9fYXJyYXktY29weS13aXRoaW5cIjoxNzIsXCIuL19hcnJheS1maWxsXCI6MTczLFwiLi9fYXJyYXktaW5jbHVkZXNcIjoxNzQsXCIuL19hcnJheS1tZXRob2RzXCI6MTc1LFwiLi9fY2xhc3NvZlwiOjE3OCxcIi4vX2N0eFwiOjE4MixcIi4vX2Rlc2NyaXB0b3JzXCI6MTg0LFwiLi9fZXhwb3J0XCI6MTg4LFwiLi9fZmFpbHNcIjoxODksXCIuL19nbG9iYWxcIjoxOTEsXCIuL19oYXNcIjoxOTIsXCIuL19oaWRlXCI6MTkzLFwiLi9faXMtYXJyYXktaXRlclwiOjE5OCxcIi4vX2lzLW9iamVjdFwiOjIwMCxcIi4vX2l0ZXItZGV0ZWN0XCI6MjA0LFwiLi9faXRlcmF0b3JzXCI6MjA2LFwiLi9fbGlicmFyeVwiOjIwNyxcIi4vX29iamVjdC1jcmVhdGVcIjoyMTIsXCIuL19vYmplY3QtZHBcIjoyMTMsXCIuL19vYmplY3QtZ29wZFwiOjIxNSxcIi4vX29iamVjdC1nb3BuXCI6MjE3LFwiLi9fb2JqZWN0LWdwb1wiOjIxOSxcIi4vX3Byb3BlcnR5LWRlc2NcIjoyMjUsXCIuL19yZWRlZmluZS1hbGxcIjoyMjYsXCIuL19zZXQtc3BlY2llc1wiOjIyOCxcIi4vX3NwZWNpZXMtY29uc3RydWN0b3JcIjoyMzIsXCIuL190by1hYnNvbHV0ZS1pbmRleFwiOjIzNixcIi4vX3RvLWluZGV4XCI6MjM3LFwiLi9fdG8taW50ZWdlclwiOjIzOCxcIi4vX3RvLWxlbmd0aFwiOjI0MCxcIi4vX3RvLW9iamVjdFwiOjI0MSxcIi4vX3RvLXByaW1pdGl2ZVwiOjI0MixcIi4vX3R5cGVkXCI6MjQ1LFwiLi9fdHlwZWQtYnVmZmVyXCI6MjQ0LFwiLi9fdWlkXCI6MjQ2LFwiLi9fd2tzXCI6MjQ5LFwiLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2RcIjoyNTAsXCIuL2VzNi5hcnJheS5pdGVyYXRvclwiOjI1NH1dLDI0NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gX2RlcmVxXygnLi9fZ2xvYmFsJyk7XG52YXIgREVTQ1JJUFRPUlMgPSBfZGVyZXFfKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIExJQlJBUlkgPSBfZGVyZXFfKCcuL19saWJyYXJ5Jyk7XG52YXIgJHR5cGVkID0gX2RlcmVxXygnLi9fdHlwZWQnKTtcbnZhciBoaWRlID0gX2RlcmVxXygnLi9faGlkZScpO1xudmFyIHJlZGVmaW5lQWxsID0gX2RlcmVxXygnLi9fcmVkZWZpbmUtYWxsJyk7XG52YXIgZmFpbHMgPSBfZGVyZXFfKCcuL19mYWlscycpO1xudmFyIGFuSW5zdGFuY2UgPSBfZGVyZXFfKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIHRvSW50ZWdlciA9IF9kZXJlcV8oJy4vX3RvLWludGVnZXInKTtcbnZhciB0b0xlbmd0aCA9IF9kZXJlcV8oJy4vX3RvLWxlbmd0aCcpO1xudmFyIHRvSW5kZXggPSBfZGVyZXFfKCcuL190by1pbmRleCcpO1xudmFyIGdPUE4gPSBfZGVyZXFfKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgZFAgPSBfZGVyZXFfKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGFycmF5RmlsbCA9IF9kZXJlcV8oJy4vX2FycmF5LWZpbGwnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9kZXJlcV8oJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcbnZhciBEQVRBX1ZJRVcgPSAnRGF0YVZpZXcnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFdST05HX0xFTkdUSCA9ICdXcm9uZyBsZW5ndGghJztcbnZhciBXUk9OR19JTkRFWCA9ICdXcm9uZyBpbmRleCEnO1xudmFyICRBcnJheUJ1ZmZlciA9IGdsb2JhbFtBUlJBWV9CVUZGRVJdO1xudmFyICREYXRhVmlldyA9IGdsb2JhbFtEQVRBX1ZJRVddO1xudmFyIE1hdGggPSBnbG9iYWwuTWF0aDtcbnZhciBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93LXJlc3RyaWN0ZWQtbmFtZXNcbnZhciBJbmZpbml0eSA9IGdsb2JhbC5JbmZpbml0eTtcbnZhciBCYXNlQnVmZmVyID0gJEFycmF5QnVmZmVyO1xudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIHBvdyA9IE1hdGgucG93O1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBsb2cgPSBNYXRoLmxvZztcbnZhciBMTjIgPSBNYXRoLkxOMjtcbnZhciBCVUZGRVIgPSAnYnVmZmVyJztcbnZhciBCWVRFX0xFTkdUSCA9ICdieXRlTGVuZ3RoJztcbnZhciBCWVRFX09GRlNFVCA9ICdieXRlT2Zmc2V0JztcbnZhciAkQlVGRkVSID0gREVTQ1JJUFRPUlMgPyAnX2InIDogQlVGRkVSO1xudmFyICRMRU5HVEggPSBERVNDUklQVE9SUyA/ICdfbCcgOiBCWVRFX0xFTkdUSDtcbnZhciAkT0ZGU0VUID0gREVTQ1JJUFRPUlMgPyAnX28nIDogQllURV9PRkZTRVQ7XG5cbi8vIElFRUU3NTQgY29udmVyc2lvbnMgYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9pZWVlNzU0XG5mdW5jdGlvbiBwYWNrSUVFRTc1NCh2YWx1ZSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobkJ5dGVzKTtcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDE7XG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBydCA9IG1MZW4gPT09IDIzID8gcG93KDIsIC0yNCkgLSBwb3coMiwgLTc3KSA6IDA7XG4gIHZhciBpID0gMDtcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgdmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCA/IDEgOiAwO1xuICB2YXIgZSwgbSwgYztcbiAgdmFsdWUgPSBhYnModmFsdWUpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIGlmICh2YWx1ZSAhPSB2YWx1ZSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgbSA9IHZhbHVlICE9IHZhbHVlID8gMSA6IDA7XG4gICAgZSA9IGVNYXg7XG4gIH0gZWxzZSB7XG4gICAgZSA9IGZsb29yKGxvZyh2YWx1ZSkgLyBMTjIpO1xuICAgIGlmICh2YWx1ZSAqIChjID0gcG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS07XG4gICAgICBjICo9IDI7XG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIHBvdygyLCAxIC0gZUJpYXMpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrKztcbiAgICAgIGMgLz0gMjtcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMDtcbiAgICAgIGUgPSBlTWF4O1xuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBwb3coMiwgbUxlbik7XG4gICAgICBlID0gZSArIGVCaWFzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBwb3coMiwgZUJpYXMgLSAxKSAqIHBvdygyLCBtTGVuKTtcbiAgICAgIGUgPSAwO1xuICAgIH1cbiAgfVxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbaSsrXSA9IG0gJiAyNTUsIG0gLz0gMjU2LCBtTGVuIC09IDgpO1xuICBlID0gZSA8PCBtTGVuIHwgbTtcbiAgZUxlbiArPSBtTGVuO1xuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltpKytdID0gZSAmIDI1NSwgZSAvPSAyNTYsIGVMZW4gLT0gOCk7XG4gIGJ1ZmZlclstLWldIHw9IHMgKiAxMjg7XG4gIHJldHVybiBidWZmZXI7XG59XG5mdW5jdGlvbiB1bnBhY2tJRUVFNzU0KGJ1ZmZlciwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxO1xuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMTtcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxO1xuICB2YXIgbkJpdHMgPSBlTGVuIC0gNztcbiAgdmFyIGkgPSBuQnl0ZXMgLSAxO1xuICB2YXIgcyA9IGJ1ZmZlcltpLS1dO1xuICB2YXIgZSA9IHMgJiAxMjc7XG4gIHZhciBtO1xuICBzID4+PSA3O1xuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltpXSwgaS0tLCBuQml0cyAtPSA4KTtcbiAgbSA9IGUgJiAoMSA8PCAtbkJpdHMpIC0gMTtcbiAgZSA+Pj0gLW5CaXRzO1xuICBuQml0cyArPSBtTGVuO1xuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltpXSwgaS0tLCBuQml0cyAtPSA4KTtcbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzO1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6IHMgPyAtSW5maW5pdHkgOiBJbmZpbml0eTtcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIHBvdygyLCBtTGVuKTtcbiAgICBlID0gZSAtIGVCaWFzO1xuICB9IHJldHVybiAocyA/IC0xIDogMSkgKiBtICogcG93KDIsIGUgLSBtTGVuKTtcbn1cblxuZnVuY3Rpb24gdW5wYWNrSTMyKGJ5dGVzKSB7XG4gIHJldHVybiBieXRlc1szXSA8PCAyNCB8IGJ5dGVzWzJdIDw8IDE2IHwgYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdO1xufVxuZnVuY3Rpb24gcGFja0k4KGl0KSB7XG4gIHJldHVybiBbaXQgJiAweGZmXTtcbn1cbmZ1bmN0aW9uIHBhY2tJMTYoaXQpIHtcbiAgcmV0dXJuIFtpdCAmIDB4ZmYsIGl0ID4+IDggJiAweGZmXTtcbn1cbmZ1bmN0aW9uIHBhY2tJMzIoaXQpIHtcbiAgcmV0dXJuIFtpdCAmIDB4ZmYsIGl0ID4+IDggJiAweGZmLCBpdCA+PiAxNiAmIDB4ZmYsIGl0ID4+IDI0ICYgMHhmZl07XG59XG5mdW5jdGlvbiBwYWNrRjY0KGl0KSB7XG4gIHJldHVybiBwYWNrSUVFRTc1NChpdCwgNTIsIDgpO1xufVxuZnVuY3Rpb24gcGFja0YzMihpdCkge1xuICByZXR1cm4gcGFja0lFRUU3NTQoaXQsIDIzLCA0KTtcbn1cblxuZnVuY3Rpb24gYWRkR2V0dGVyKEMsIGtleSwgaW50ZXJuYWwpIHtcbiAgZFAoQ1tQUk9UT1RZUEVdLCBrZXksIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzW2ludGVybmFsXTsgfSB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0KHZpZXcsIGJ5dGVzLCBpbmRleCwgaXNMaXR0bGVFbmRpYW4pIHtcbiAgdmFyIG51bUluZGV4ID0gK2luZGV4O1xuICB2YXIgaW50SW5kZXggPSB0b0luZGV4KG51bUluZGV4KTtcbiAgaWYgKGludEluZGV4ICsgYnl0ZXMgPiB2aWV3WyRMRU5HVEhdKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTtcbiAgdmFyIHN0b3JlID0gdmlld1skQlVGRkVSXS5fYjtcbiAgdmFyIHN0YXJ0ID0gaW50SW5kZXggKyB2aWV3WyRPRkZTRVRdO1xuICB2YXIgcGFjayA9IHN0b3JlLnNsaWNlKHN0YXJ0LCBzdGFydCArIGJ5dGVzKTtcbiAgcmV0dXJuIGlzTGl0dGxlRW5kaWFuID8gcGFjayA6IHBhY2sucmV2ZXJzZSgpO1xufVxuZnVuY3Rpb24gc2V0KHZpZXcsIGJ5dGVzLCBpbmRleCwgY29udmVyc2lvbiwgdmFsdWUsIGlzTGl0dGxlRW5kaWFuKSB7XG4gIHZhciBudW1JbmRleCA9ICtpbmRleDtcbiAgdmFyIGludEluZGV4ID0gdG9JbmRleChudW1JbmRleCk7XG4gIGlmIChpbnRJbmRleCArIGJ5dGVzID4gdmlld1skTEVOR1RIXSkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19JTkRFWCk7XG4gIHZhciBzdG9yZSA9IHZpZXdbJEJVRkZFUl0uX2I7XG4gIHZhciBzdGFydCA9IGludEluZGV4ICsgdmlld1skT0ZGU0VUXTtcbiAgdmFyIHBhY2sgPSBjb252ZXJzaW9uKCt2YWx1ZSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXM7IGkrKykgc3RvcmVbc3RhcnQgKyBpXSA9IHBhY2tbaXNMaXR0bGVFbmRpYW4gPyBpIDogYnl0ZXMgLSBpIC0gMV07XG59XG5cbmlmICghJHR5cGVkLkFCVikge1xuICAkQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBBcnJheUJ1ZmZlcihsZW5ndGgpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRBcnJheUJ1ZmZlciwgQVJSQVlfQlVGRkVSKTtcbiAgICB2YXIgYnl0ZUxlbmd0aCA9IHRvSW5kZXgobGVuZ3RoKTtcbiAgICB0aGlzLl9iID0gYXJyYXlGaWxsLmNhbGwobmV3IEFycmF5KGJ5dGVMZW5ndGgpLCAwKTtcbiAgICB0aGlzWyRMRU5HVEhdID0gYnl0ZUxlbmd0aDtcbiAgfTtcblxuICAkRGF0YVZpZXcgPSBmdW5jdGlvbiBEYXRhVmlldyhidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsICREYXRhVmlldywgREFUQV9WSUVXKTtcbiAgICBhbkluc3RhbmNlKGJ1ZmZlciwgJEFycmF5QnVmZmVyLCBEQVRBX1ZJRVcpO1xuICAgIHZhciBidWZmZXJMZW5ndGggPSBidWZmZXJbJExFTkdUSF07XG4gICAgdmFyIG9mZnNldCA9IHRvSW50ZWdlcihieXRlT2Zmc2V0KTtcbiAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXJMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCEnKTtcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA9PT0gdW5kZWZpbmVkID8gYnVmZmVyTGVuZ3RoIC0gb2Zmc2V0IDogdG9MZW5ndGgoYnl0ZUxlbmd0aCk7XG4gICAgaWYgKG9mZnNldCArIGJ5dGVMZW5ndGggPiBidWZmZXJMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICB0aGlzWyRCVUZGRVJdID0gYnVmZmVyO1xuICAgIHRoaXNbJE9GRlNFVF0gPSBvZmZzZXQ7XG4gICAgdGhpc1skTEVOR1RIXSA9IGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgaWYgKERFU0NSSVBUT1JTKSB7XG4gICAgYWRkR2V0dGVyKCRBcnJheUJ1ZmZlciwgQllURV9MRU5HVEgsICdfbCcpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsIEJVRkZFUiwgJ19iJyk7XG4gICAgYWRkR2V0dGVyKCREYXRhVmlldywgQllURV9MRU5HVEgsICdfbCcpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsIEJZVEVfT0ZGU0VULCAnX28nKTtcbiAgfVxuXG4gIHJlZGVmaW5lQWxsKCREYXRhVmlld1tQUk9UT1RZUEVdLCB7XG4gICAgZ2V0SW50ODogZnVuY3Rpb24gZ2V0SW50OChieXRlT2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdIDw8IDI0ID4+IDI0O1xuICAgIH0sXG4gICAgZ2V0VWludDg6IGZ1bmN0aW9uIGdldFVpbnQ4KGJ5dGVPZmZzZXQpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywgMSwgYnl0ZU9mZnNldClbMF07XG4gICAgfSxcbiAgICBnZXRJbnQxNjogZnVuY3Rpb24gZ2V0SW50MTYoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgdmFyIGJ5dGVzID0gZ2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSk7XG4gICAgICByZXR1cm4gKGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXSkgPDwgMTYgPj4gMTY7XG4gICAgfSxcbiAgICBnZXRVaW50MTY6IGZ1bmN0aW9uIGdldFVpbnQxNihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICB2YXIgYnl0ZXMgPSBnZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKTtcbiAgICAgIHJldHVybiBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07XG4gICAgfSxcbiAgICBnZXRJbnQzMjogZnVuY3Rpb24gZ2V0SW50MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0kzMihnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSk7XG4gICAgfSxcbiAgICBnZXRVaW50MzI6IGZ1bmN0aW9uIGdldFVpbnQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSTMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pKSA+Pj4gMDtcbiAgICB9LFxuICAgIGdldEZsb2F0MzI6IGZ1bmN0aW9uIGdldEZsb2F0MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSksIDIzLCA0KTtcbiAgICB9LFxuICAgIGdldEZsb2F0NjQ6IGZ1bmN0aW9uIGdldEZsb2F0NjQoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsIDgsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSksIDUyLCA4KTtcbiAgICB9LFxuICAgIHNldEludDg6IGZ1bmN0aW9uIHNldEludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSTgsIHZhbHVlKTtcbiAgICB9LFxuICAgIHNldFVpbnQ4OiBmdW5jdGlvbiBzZXRVaW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgc2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQsIHBhY2tJOCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0SW50MTY6IGZ1bmN0aW9uIHNldEludDE2KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0kxNiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRVaW50MTY6IGZ1bmN0aW9uIHNldFVpbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJMTYsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0SW50MzI6IGZ1bmN0aW9uIHNldEludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0kzMiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRVaW50MzI6IGZ1bmN0aW9uIHNldFVpbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tJMzIsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0RmxvYXQzMjogZnVuY3Rpb24gc2V0RmxvYXQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tGMzIsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0RmxvYXQ2NDogZnVuY3Rpb24gc2V0RmxvYXQ2NChieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDgsIGJ5dGVPZmZzZXQsIHBhY2tGNjQsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH1cbiAgfSk7XG59IGVsc2Uge1xuICBpZiAoIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAkQXJyYXlCdWZmZXIoMSk7XG4gIH0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3ICRBcnJheUJ1ZmZlcigtMSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gIH0pIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgJEFycmF5QnVmZmVyKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbmV3ICRBcnJheUJ1ZmZlcigxLjUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5ldyAkQXJyYXlCdWZmZXIoTmFOKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICByZXR1cm4gJEFycmF5QnVmZmVyLm5hbWUgIT0gQVJSQVlfQlVGRkVSO1xuICB9KSkge1xuICAgICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCkge1xuICAgICAgYW5JbnN0YW5jZSh0aGlzLCAkQXJyYXlCdWZmZXIpO1xuICAgICAgcmV0dXJuIG5ldyBCYXNlQnVmZmVyKHRvSW5kZXgobGVuZ3RoKSk7XG4gICAgfTtcbiAgICB2YXIgQXJyYXlCdWZmZXJQcm90byA9ICRBcnJheUJ1ZmZlcltQUk9UT1RZUEVdID0gQmFzZUJ1ZmZlcltQUk9UT1RZUEVdO1xuICAgIGZvciAodmFyIGtleXMgPSBnT1BOKEJhc2VCdWZmZXIpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7KSB7XG4gICAgICBpZiAoISgoa2V5ID0ga2V5c1tqKytdKSBpbiAkQXJyYXlCdWZmZXIpKSBoaWRlKCRBcnJheUJ1ZmZlciwga2V5LCBCYXNlQnVmZmVyW2tleV0pO1xuICAgIH1cbiAgICBpZiAoIUxJQlJBUlkpIEFycmF5QnVmZmVyUHJvdG8uY29uc3RydWN0b3IgPSAkQXJyYXlCdWZmZXI7XG4gIH1cbiAgLy8gaU9TIFNhZmFyaSA3LnggYnVnXG4gIHZhciB2aWV3ID0gbmV3ICREYXRhVmlldyhuZXcgJEFycmF5QnVmZmVyKDIpKTtcbiAgdmFyICRzZXRJbnQ4ID0gJERhdGFWaWV3W1BST1RPVFlQRV0uc2V0SW50ODtcbiAgdmlldy5zZXRJbnQ4KDAsIDIxNDc0ODM2NDgpO1xuICB2aWV3LnNldEludDgoMSwgMjE0NzQ4MzY0OSk7XG4gIGlmICh2aWV3LmdldEludDgoMCkgfHwgIXZpZXcuZ2V0SW50OCgxKSkgcmVkZWZpbmVBbGwoJERhdGFWaWV3W1BST1RPVFlQRV0sIHtcbiAgICBzZXRJbnQ4OiBmdW5jdGlvbiBzZXRJbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICAkc2V0SW50OC5jYWxsKHRoaXMsIGJ5dGVPZmZzZXQsIHZhbHVlIDw8IDI0ID4+IDI0KTtcbiAgICB9LFxuICAgIHNldFVpbnQ4OiBmdW5jdGlvbiBzZXRVaW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgJHNldEludDguY2FsbCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7XG4gICAgfVxuICB9LCB0cnVlKTtcbn1cbnNldFRvU3RyaW5nVGFnKCRBcnJheUJ1ZmZlciwgQVJSQVlfQlVGRkVSKTtcbnNldFRvU3RyaW5nVGFnKCREYXRhVmlldywgREFUQV9WSUVXKTtcbmhpZGUoJERhdGFWaWV3W1BST1RPVFlQRV0sICR0eXBlZC5WSUVXLCB0cnVlKTtcbmV4cG9ydHNbQVJSQVlfQlVGRkVSXSA9ICRBcnJheUJ1ZmZlcjtcbmV4cG9ydHNbREFUQV9WSUVXXSA9ICREYXRhVmlldztcblxufSx7XCIuL19hbi1pbnN0YW5jZVwiOjE3MCxcIi4vX2FycmF5LWZpbGxcIjoxNzMsXCIuL19kZXNjcmlwdG9yc1wiOjE4NCxcIi4vX2ZhaWxzXCI6MTg5LFwiLi9fZ2xvYmFsXCI6MTkxLFwiLi9faGlkZVwiOjE5MyxcIi4vX2xpYnJhcnlcIjoyMDcsXCIuL19vYmplY3QtZHBcIjoyMTMsXCIuL19vYmplY3QtZ29wblwiOjIxNyxcIi4vX3JlZGVmaW5lLWFsbFwiOjIyNixcIi4vX3NldC10by1zdHJpbmctdGFnXCI6MjI5LFwiLi9fdG8taW5kZXhcIjoyMzcsXCIuL190by1pbnRlZ2VyXCI6MjM4LFwiLi9fdG8tbGVuZ3RoXCI6MjQwLFwiLi9fdHlwZWRcIjoyNDV9XSwyNDU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsb2JhbCA9IF9kZXJlcV8oJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSBfZGVyZXFfKCcuL19oaWRlJyk7XG52YXIgdWlkID0gX2RlcmVxXygnLi9fdWlkJyk7XG52YXIgVFlQRUQgPSB1aWQoJ3R5cGVkX2FycmF5Jyk7XG52YXIgVklFVyA9IHVpZCgndmlldycpO1xudmFyIEFCViA9ICEhKGdsb2JhbC5BcnJheUJ1ZmZlciAmJiBnbG9iYWwuRGF0YVZpZXcpO1xudmFyIENPTlNUUiA9IEFCVjtcbnZhciBpID0gMDtcbnZhciBsID0gOTtcbnZhciBUeXBlZDtcblxudmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnMgPSAoXG4gICdJbnQ4QXJyYXksVWludDhBcnJheSxVaW50OENsYW1wZWRBcnJheSxJbnQxNkFycmF5LFVpbnQxNkFycmF5LEludDMyQXJyYXksVWludDMyQXJyYXksRmxvYXQzMkFycmF5LEZsb2F0NjRBcnJheSdcbikuc3BsaXQoJywnKTtcblxud2hpbGUgKGkgPCBsKSB7XG4gIGlmIChUeXBlZCA9IGdsb2JhbFtUeXBlZEFycmF5Q29uc3RydWN0b3JzW2krK11dKSB7XG4gICAgaGlkZShUeXBlZC5wcm90b3R5cGUsIFRZUEVELCB0cnVlKTtcbiAgICBoaWRlKFR5cGVkLnByb3RvdHlwZSwgVklFVywgdHJ1ZSk7XG4gIH0gZWxzZSBDT05TVFIgPSBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEFCVjogQUJWLFxuICBDT05TVFI6IENPTlNUUixcbiAgVFlQRUQ6IFRZUEVELFxuICBWSUVXOiBWSUVXXG59O1xuXG59LHtcIi4vX2dsb2JhbFwiOjE5MSxcIi4vX2hpZGVcIjoxOTMsXCIuL191aWRcIjoyNDZ9XSwyNDY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzE0Ml1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcImR1cFwiOjE0Mn1dLDI0NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bMTQzXVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fY29yZVwiOjE4MCxcIi4vX2dsb2JhbFwiOjE5MSxcIi4vX2xpYnJhcnlcIjoyMDcsXCIuL19vYmplY3QtZHBcIjoyMTMsXCIuL193a3MtZXh0XCI6MjQ4LFwiZHVwXCI6MTQzfV0sMjQ4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVsxNDRdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL193a3NcIjoyNDksXCJkdXBcIjoxNDR9XSwyNDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzE0NV1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2dsb2JhbFwiOjE5MSxcIi4vX3NoYXJlZFwiOjIzMSxcIi4vX3VpZFwiOjI0NixcImR1cFwiOjE0NX1dLDI1MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bMTQ2XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fY2xhc3NvZlwiOjE3OCxcIi4vX2NvcmVcIjoxODAsXCIuL19pdGVyYXRvcnNcIjoyMDYsXCIuL193a3NcIjoyNDksXCJkdXBcIjoxNDZ9XSwyNTE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gMjIuMS4zLjYgQXJyYXkucHJvdG90eXBlLmZpbGwodmFsdWUsIHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5sZW5ndGgpXG52YXIgJGV4cG9ydCA9IF9kZXJlcV8oJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5JywgeyBmaWxsOiBfZGVyZXFfKCcuL19hcnJheS1maWxsJykgfSk7XG5cbl9kZXJlcV8oJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdmaWxsJyk7XG5cbn0se1wiLi9fYWRkLXRvLXVuc2NvcGFibGVzXCI6MTY5LFwiLi9fYXJyYXktZmlsbFwiOjE3MyxcIi4vX2V4cG9ydFwiOjE4OH1dLDI1MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOCBBcnJheS5wcm90b3R5cGUuZmluZChwcmVkaWNhdGUsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG52YXIgJGV4cG9ydCA9IF9kZXJlcV8oJy4vX2V4cG9ydCcpO1xudmFyICRmaW5kID0gX2RlcmVxXygnLi9fYXJyYXktbWV0aG9kcycpKDUpO1xudmFyIEtFWSA9ICdmaW5kJztcbnZhciBmb3JjZWQgPSB0cnVlO1xuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChLRVkgaW4gW10pIEFycmF5KDEpW0tFWV0oZnVuY3Rpb24gKCkgeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5fZGVyZXFfKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKShLRVkpO1xuXG59LHtcIi4vX2FkZC10by11bnNjb3BhYmxlc1wiOjE2OSxcIi4vX2FycmF5LW1ldGhvZHNcIjoxNzUsXCIuL19leHBvcnRcIjoxODh9XSwyNTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzE0OV1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2NyZWF0ZS1wcm9wZXJ0eVwiOjE4MSxcIi4vX2N0eFwiOjE4MixcIi4vX2V4cG9ydFwiOjE4OCxcIi4vX2lzLWFycmF5LWl0ZXJcIjoxOTgsXCIuL19pdGVyLWNhbGxcIjoyMDEsXCIuL19pdGVyLWRldGVjdFwiOjIwNCxcIi4vX3RvLWxlbmd0aFwiOjI0MCxcIi4vX3RvLW9iamVjdFwiOjI0MSxcIi4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kXCI6MjUwLFwiZHVwXCI6MTQ5fV0sMjU0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVsxNTBdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL19hZGQtdG8tdW5zY29wYWJsZXNcIjoxNjksXCIuL19pdGVyLWRlZmluZVwiOjIwMyxcIi4vX2l0ZXItc3RlcFwiOjIwNSxcIi4vX2l0ZXJhdG9yc1wiOjIwNixcIi4vX3RvLWlvYmplY3RcIjoyMzksXCJkdXBcIjoxNTB9XSwyNTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzE1MV1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2V4cG9ydFwiOjE4OCxcIi4vX29iamVjdC1hc3NpZ25cIjoyMTEsXCJkdXBcIjoxNTF9XSwyNTY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY2xhc3NvZiA9IF9kZXJlcV8oJy4vX2NsYXNzb2YnKTtcbnZhciB0ZXN0ID0ge307XG50ZXN0W19kZXJlcV8oJy4vX3drcycpKCd0b1N0cmluZ1RhZycpXSA9ICd6JztcbmlmICh0ZXN0ICsgJycgIT0gJ1tvYmplY3Qgel0nKSB7XG4gIF9kZXJlcV8oJy4vX3JlZGVmaW5lJykoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuICdbb2JqZWN0ICcgKyBjbGFzc29mKHRoaXMpICsgJ10nO1xuICB9LCB0cnVlKTtcbn1cblxufSx7XCIuL19jbGFzc29mXCI6MTc4LFwiLi9fcmVkZWZpbmVcIjoyMjcsXCIuL193a3NcIjoyNDl9XSwyNTc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzE1OF1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2EtZnVuY3Rpb25cIjoxNjgsXCIuL19hbi1pbnN0YW5jZVwiOjE3MCxcIi4vX2NsYXNzb2ZcIjoxNzgsXCIuL19jb3JlXCI6MTgwLFwiLi9fY3R4XCI6MTgyLFwiLi9fZXhwb3J0XCI6MTg4LFwiLi9fZm9yLW9mXCI6MTkwLFwiLi9fZ2xvYmFsXCI6MTkxLFwiLi9faXMtb2JqZWN0XCI6MjAwLFwiLi9faXRlci1kZXRlY3RcIjoyMDQsXCIuL19saWJyYXJ5XCI6MjA3LFwiLi9fbWljcm90YXNrXCI6MjA5LFwiLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eVwiOjIxMCxcIi4vX3BlcmZvcm1cIjoyMjMsXCIuL19wcm9taXNlLXJlc29sdmVcIjoyMjQsXCIuL19yZWRlZmluZS1hbGxcIjoyMjYsXCIuL19zZXQtc3BlY2llc1wiOjIyOCxcIi4vX3NldC10by1zdHJpbmctdGFnXCI6MjI5LFwiLi9fc3BlY2llcy1jb25zdHJ1Y3RvclwiOjIzMixcIi4vX3Rhc2tcIjoyMzUsXCIuL193a3NcIjoyNDksXCJkdXBcIjoxNTh9XSwyNTg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzE1OV1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2l0ZXItZGVmaW5lXCI6MjAzLFwiLi9fc3RyaW5nLWF0XCI6MjMzLFwiZHVwXCI6MTU5fV0sMjU5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciAkZXhwb3J0ID0gX2RlcmVxXygnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjMuMTMgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXQoY291bnQpXG4gIHJlcGVhdDogX2RlcmVxXygnLi9fc3RyaW5nLXJlcGVhdCcpXG59KTtcblxufSx7XCIuL19leHBvcnRcIjoxODgsXCIuL19zdHJpbmctcmVwZWF0XCI6MjM0fV0sMjYwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVsxNjBdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL19hbi1vYmplY3RcIjoxNzEsXCIuL19kZXNjcmlwdG9yc1wiOjE4NCxcIi4vX2VudW0ta2V5c1wiOjE4NyxcIi4vX2V4cG9ydFwiOjE4OCxcIi4vX2ZhaWxzXCI6MTg5LFwiLi9fZ2xvYmFsXCI6MTkxLFwiLi9faGFzXCI6MTkyLFwiLi9faGlkZVwiOjE5MyxcIi4vX2lzLWFycmF5XCI6MTk5LFwiLi9faXMtb2JqZWN0XCI6MjAwLFwiLi9fbGlicmFyeVwiOjIwNyxcIi4vX21ldGFcIjoyMDgsXCIuL19vYmplY3QtY3JlYXRlXCI6MjEyLFwiLi9fb2JqZWN0LWRwXCI6MjEzLFwiLi9fb2JqZWN0LWdvcGRcIjoyMTUsXCIuL19vYmplY3QtZ29wblwiOjIxNyxcIi4vX29iamVjdC1nb3BuLWV4dFwiOjIxNixcIi4vX29iamVjdC1nb3BzXCI6MjE4LFwiLi9fb2JqZWN0LWtleXNcIjoyMjEsXCIuL19vYmplY3QtcGllXCI6MjIyLFwiLi9fcHJvcGVydHktZGVzY1wiOjIyNSxcIi4vX3JlZGVmaW5lXCI6MjI3LFwiLi9fc2V0LXRvLXN0cmluZy10YWdcIjoyMjksXCIuL19zaGFyZWRcIjoyMzEsXCIuL190by1pb2JqZWN0XCI6MjM5LFwiLi9fdG8tcHJpbWl0aXZlXCI6MjQyLFwiLi9fdWlkXCI6MjQ2LFwiLi9fd2tzXCI6MjQ5LFwiLi9fd2tzLWRlZmluZVwiOjI0NyxcIi4vX3drcy1leHRcIjoyNDgsXCJkdXBcIjoxNjB9XSwyNjE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuX2RlcmVxXygnLi9fdHlwZWQtYXJyYXknKSgnVWludDgnLCAxLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVWludDhBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cbn0se1wiLi9fdHlwZWQtYXJyYXlcIjoyNDN9XSwyNjI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuYXJndW1lbnRzWzRdWzE2M11bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpXG59LHtcIi4vX2NvcmVcIjoxODAsXCIuL19leHBvcnRcIjoxODgsXCIuL19nbG9iYWxcIjoxOTEsXCIuL19wcm9taXNlLXJlc29sdmVcIjoyMjQsXCIuL19zcGVjaWVzLWNvbnN0cnVjdG9yXCI6MjMyLFwiZHVwXCI6MTYzfV0sMjYzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmFyZ3VtZW50c1s0XVsxNjRdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKVxufSx7XCIuL19leHBvcnRcIjoxODgsXCIuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5XCI6MjEwLFwiLi9fcGVyZm9ybVwiOjIyMyxcImR1cFwiOjE2NH1dLDI2NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bMTY1XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fd2tzLWRlZmluZVwiOjI0NyxcImR1cFwiOjE2NX1dLDI2NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5hcmd1bWVudHNbNF1bMTY2XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cylcbn0se1wiLi9fd2tzLWRlZmluZVwiOjI0NyxcImR1cFwiOjE2Nn1dLDI2NjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgJGl0ZXJhdG9ycyA9IF9kZXJlcV8oJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2V0S2V5cyA9IF9kZXJlcV8oJy4vX29iamVjdC1rZXlzJyk7XG52YXIgcmVkZWZpbmUgPSBfZGVyZXFfKCcuL19yZWRlZmluZScpO1xudmFyIGdsb2JhbCA9IF9kZXJlcV8oJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSBfZGVyZXFfKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gX2RlcmVxXygnLi9faXRlcmF0b3JzJyk7XG52YXIgd2tzID0gX2RlcmVxXygnLi9fd2tzJyk7XG52YXIgSVRFUkFUT1IgPSB3a3MoJ2l0ZXJhdG9yJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHdrcygndG9TdHJpbmdUYWcnKTtcbnZhciBBcnJheVZhbHVlcyA9IEl0ZXJhdG9ycy5BcnJheTtcblxudmFyIERPTUl0ZXJhYmxlcyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBDU1NTdHlsZURlY2xhcmF0aW9uOiBmYWxzZSxcbiAgQ1NTVmFsdWVMaXN0OiBmYWxzZSxcbiAgQ2xpZW50UmVjdExpc3Q6IGZhbHNlLFxuICBET01SZWN0TGlzdDogZmFsc2UsXG4gIERPTVN0cmluZ0xpc3Q6IGZhbHNlLFxuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiBmYWxzZSxcbiAgRmlsZUxpc3Q6IGZhbHNlLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxDb2xsZWN0aW9uOiBmYWxzZSxcbiAgSFRNTEZvcm1FbGVtZW50OiBmYWxzZSxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IGZhbHNlLFxuICBNZWRpYUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBNaW1lVHlwZUFycmF5OiBmYWxzZSxcbiAgTmFtZWROb2RlTWFwOiBmYWxzZSxcbiAgTm9kZUxpc3Q6IHRydWUsXG4gIFBhaW50UmVxdWVzdExpc3Q6IGZhbHNlLFxuICBQbHVnaW46IGZhbHNlLFxuICBQbHVnaW5BcnJheTogZmFsc2UsXG4gIFNWR0xlbmd0aExpc3Q6IGZhbHNlLFxuICBTVkdOdW1iZXJMaXN0OiBmYWxzZSxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IGZhbHNlLFxuICBTVkdQb2ludExpc3Q6IGZhbHNlLFxuICBTVkdTdHJpbmdMaXN0OiBmYWxzZSxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogZmFsc2UsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IGZhbHNlLFxuICBTdHlsZVNoZWV0TGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIFRleHRUcmFja0N1ZUxpc3Q6IGZhbHNlLFxuICBUZXh0VHJhY2tMaXN0OiBmYWxzZSxcbiAgVG91Y2hMaXN0OiBmYWxzZVxufTtcblxuZm9yICh2YXIgY29sbGVjdGlvbnMgPSBnZXRLZXlzKERPTUl0ZXJhYmxlcyksIGkgPSAwOyBpIDwgY29sbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIE5BTUUgPSBjb2xsZWN0aW9uc1tpXTtcbiAgdmFyIGV4cGxpY2l0ID0gRE9NSXRlcmFibGVzW05BTUVdO1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGtleTtcbiAgaWYgKHByb3RvKSB7XG4gICAgaWYgKCFwcm90b1tJVEVSQVRPUl0pIGhpZGUocHJvdG8sIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgaWYgKCFwcm90b1tUT19TVFJJTkdfVEFHXSkgaGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgaWYgKGV4cGxpY2l0KSBmb3IgKGtleSBpbiAkaXRlcmF0b3JzKSBpZiAoIXByb3RvW2tleV0pIHJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn1cblxufSx7XCIuL19nbG9iYWxcIjoxOTEsXCIuL19oaWRlXCI6MTkzLFwiLi9faXRlcmF0b3JzXCI6MjA2LFwiLi9fb2JqZWN0LWtleXNcIjoyMjEsXCIuL19yZWRlZmluZVwiOjIyNyxcIi4vX3drc1wiOjI0OSxcIi4vZXM2LmFycmF5Lml0ZXJhdG9yXCI6MjU0fV0sMjY3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGVsbGlwdGljID0gZXhwb3J0cztcblxuZWxsaXB0aWMudmVyc2lvbiA9IF9kZXJlcV8oJy4uL3BhY2thZ2UuanNvbicpLnZlcnNpb247XG5lbGxpcHRpYy51dGlscyA9IF9kZXJlcV8oJy4vZWxsaXB0aWMvdXRpbHMnKTtcbmVsbGlwdGljLnJhbmQgPSBfZGVyZXFfKCdicm9yYW5kJyk7XG5lbGxpcHRpYy5jdXJ2ZSA9IF9kZXJlcV8oJy4vZWxsaXB0aWMvY3VydmUnKTtcbmVsbGlwdGljLmN1cnZlcyA9IF9kZXJlcV8oJy4vZWxsaXB0aWMvY3VydmVzJyk7XG5cbi8vIFByb3RvY29sc1xuZWxsaXB0aWMuZWMgPSBfZGVyZXFfKCcuL2VsbGlwdGljL2VjJyk7XG5lbGxpcHRpYy5lZGRzYSA9IF9kZXJlcV8oJy4vZWxsaXB0aWMvZWRkc2EnKTtcblxufSx7XCIuLi9wYWNrYWdlLmpzb25cIjoyODIsXCIuL2VsbGlwdGljL2N1cnZlXCI6MjcwLFwiLi9lbGxpcHRpYy9jdXJ2ZXNcIjoyNzMsXCIuL2VsbGlwdGljL2VjXCI6Mjc0LFwiLi9lbGxpcHRpYy9lZGRzYVwiOjI3NyxcIi4vZWxsaXB0aWMvdXRpbHNcIjoyODEsXCJicm9yYW5kXCI6NDV9XSwyNjg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSBfZGVyZXFfKCdibi5qcycpO1xudmFyIGVsbGlwdGljID0gX2RlcmVxXygnLi4vLi4vZWxsaXB0aWMnKTtcbnZhciB1dGlscyA9IGVsbGlwdGljLnV0aWxzO1xudmFyIGdldE5BRiA9IHV0aWxzLmdldE5BRjtcbnZhciBnZXRKU0YgPSB1dGlscy5nZXRKU0Y7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBCYXNlQ3VydmUodHlwZSwgY29uZikge1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnAgPSBuZXcgQk4oY29uZi5wLCAxNik7XG5cbiAgLy8gVXNlIE1vbnRnb21lcnksIHdoZW4gdGhlcmUgaXMgbm8gZmFzdCByZWR1Y3Rpb24gZm9yIHRoZSBwcmltZVxuICB0aGlzLnJlZCA9IGNvbmYucHJpbWUgPyBCTi5yZWQoY29uZi5wcmltZSkgOiBCTi5tb250KHRoaXMucCk7XG5cbiAgLy8gVXNlZnVsIGZvciBtYW55IGN1cnZlc1xuICB0aGlzLnplcm8gPSBuZXcgQk4oMCkudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLm9uZSA9IG5ldyBCTigxKS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMudHdvID0gbmV3IEJOKDIpLnRvUmVkKHRoaXMucmVkKTtcblxuICAvLyBDdXJ2ZSBjb25maWd1cmF0aW9uLCBvcHRpb25hbFxuICB0aGlzLm4gPSBjb25mLm4gJiYgbmV3IEJOKGNvbmYubiwgMTYpO1xuICB0aGlzLmcgPSBjb25mLmcgJiYgdGhpcy5wb2ludEZyb21KU09OKGNvbmYuZywgY29uZi5nUmVkKTtcblxuICAvLyBUZW1wb3JhcnkgYXJyYXlzXG4gIHRoaXMuX3duYWZUMSA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fd25hZlQyID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl93bmFmVDMgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX3duYWZUNCA9IG5ldyBBcnJheSg0KTtcblxuICAvLyBHZW5lcmFsaXplZCBHcmVnIE1heHdlbGwncyB0cmlja1xuICB2YXIgYWRqdXN0Q291bnQgPSB0aGlzLm4gJiYgdGhpcy5wLmRpdih0aGlzLm4pO1xuICBpZiAoIWFkanVzdENvdW50IHx8IGFkanVzdENvdW50LmNtcG4oMTAwKSA+IDApIHtcbiAgICB0aGlzLnJlZE4gPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX21heHdlbGxUcmljayA9IHRydWU7XG4gICAgdGhpcy5yZWROID0gdGhpcy5uLnRvUmVkKHRoaXMucmVkKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBCYXNlQ3VydmU7XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuX2ZpeGVkTmFmTXVsID0gZnVuY3Rpb24gX2ZpeGVkTmFmTXVsKHAsIGspIHtcbiAgYXNzZXJ0KHAucHJlY29tcHV0ZWQpO1xuICB2YXIgZG91YmxlcyA9IHAuX2dldERvdWJsZXMoKTtcblxuICB2YXIgbmFmID0gZ2V0TkFGKGssIDEpO1xuICB2YXIgSSA9ICgxIDw8IChkb3VibGVzLnN0ZXAgKyAxKSkgLSAoZG91Ymxlcy5zdGVwICUgMiA9PT0gMCA/IDIgOiAxKTtcbiAgSSAvPSAzO1xuXG4gIC8vIFRyYW5zbGF0ZSBpbnRvIG1vcmUgd2luZG93ZWQgZm9ybVxuICB2YXIgcmVwciA9IFtdO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IG5hZi5sZW5ndGg7IGogKz0gZG91Ymxlcy5zdGVwKSB7XG4gICAgdmFyIG5hZlcgPSAwO1xuICAgIGZvciAodmFyIGsgPSBqICsgZG91Ymxlcy5zdGVwIC0gMTsgayA+PSBqOyBrLS0pXG4gICAgICBuYWZXID0gKG5hZlcgPDwgMSkgKyBuYWZba107XG4gICAgcmVwci5wdXNoKG5hZlcpO1xuICB9XG5cbiAgdmFyIGEgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgdmFyIGIgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgZm9yICh2YXIgaSA9IEk7IGkgPiAwOyBpLS0pIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJlcHIubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBuYWZXID0gcmVwcltqXTtcbiAgICAgIGlmIChuYWZXID09PSBpKVxuICAgICAgICBiID0gYi5taXhlZEFkZChkb3VibGVzLnBvaW50c1tqXSk7XG4gICAgICBlbHNlIGlmIChuYWZXID09PSAtaSlcbiAgICAgICAgYiA9IGIubWl4ZWRBZGQoZG91Ymxlcy5wb2ludHNbal0ubmVnKCkpO1xuICAgIH1cbiAgICBhID0gYS5hZGQoYik7XG4gIH1cbiAgcmV0dXJuIGEudG9QKCk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl93bmFmTXVsID0gZnVuY3Rpb24gX3duYWZNdWwocCwgaykge1xuICB2YXIgdyA9IDQ7XG5cbiAgLy8gUHJlY29tcHV0ZSB3aW5kb3dcbiAgdmFyIG5hZlBvaW50cyA9IHAuX2dldE5BRlBvaW50cyh3KTtcbiAgdyA9IG5hZlBvaW50cy53bmQ7XG4gIHZhciB3bmQgPSBuYWZQb2ludHMucG9pbnRzO1xuXG4gIC8vIEdldCBOQUYgZm9ybVxuICB2YXIgbmFmID0gZ2V0TkFGKGssIHcpO1xuXG4gIC8vIEFkZCBgdGhpc2AqKE4rMSkgZm9yIGV2ZXJ5IHctTkFGIGluZGV4XG4gIHZhciBhY2MgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgZm9yICh2YXIgaSA9IG5hZi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIC8vIENvdW50IHplcm9lc1xuICAgIGZvciAodmFyIGsgPSAwOyBpID49IDAgJiYgbmFmW2ldID09PSAwOyBpLS0pXG4gICAgICBrKys7XG4gICAgaWYgKGkgPj0gMClcbiAgICAgIGsrKztcbiAgICBhY2MgPSBhY2MuZGJscChrKTtcblxuICAgIGlmIChpIDwgMClcbiAgICAgIGJyZWFrO1xuICAgIHZhciB6ID0gbmFmW2ldO1xuICAgIGFzc2VydCh6ICE9PSAwKTtcbiAgICBpZiAocC50eXBlID09PSAnYWZmaW5lJykge1xuICAgICAgLy8gSiArLSBQXG4gICAgICBpZiAoeiA+IDApXG4gICAgICAgIGFjYyA9IGFjYy5taXhlZEFkZCh3bmRbKHogLSAxKSA+PiAxXSk7XG4gICAgICBlbHNlXG4gICAgICAgIGFjYyA9IGFjYy5taXhlZEFkZCh3bmRbKC16IC0gMSkgPj4gMV0ubmVnKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBKICstIEpcbiAgICAgIGlmICh6ID4gMClcbiAgICAgICAgYWNjID0gYWNjLmFkZCh3bmRbKHogLSAxKSA+PiAxXSk7XG4gICAgICBlbHNlXG4gICAgICAgIGFjYyA9IGFjYy5hZGQod25kWygteiAtIDEpID4+IDFdLm5lZygpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHAudHlwZSA9PT0gJ2FmZmluZScgPyBhY2MudG9QKCkgOiBhY2M7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl93bmFmTXVsQWRkID0gZnVuY3Rpb24gX3duYWZNdWxBZGQoZGVmVyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYWNvYmlhblJlc3VsdCkge1xuICB2YXIgd25kV2lkdGggPSB0aGlzLl93bmFmVDE7XG4gIHZhciB3bmQgPSB0aGlzLl93bmFmVDI7XG4gIHZhciBuYWYgPSB0aGlzLl93bmFmVDM7XG5cbiAgLy8gRmlsbCBhbGwgYXJyYXlzXG4gIHZhciBtYXggPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIHAgPSBwb2ludHNbaV07XG4gICAgdmFyIG5hZlBvaW50cyA9IHAuX2dldE5BRlBvaW50cyhkZWZXKTtcbiAgICB3bmRXaWR0aFtpXSA9IG5hZlBvaW50cy53bmQ7XG4gICAgd25kW2ldID0gbmFmUG9pbnRzLnBvaW50cztcbiAgfVxuXG4gIC8vIENvbWIgc21hbGwgd2luZG93IE5BRnNcbiAgZm9yICh2YXIgaSA9IGxlbiAtIDE7IGkgPj0gMTsgaSAtPSAyKSB7XG4gICAgdmFyIGEgPSBpIC0gMTtcbiAgICB2YXIgYiA9IGk7XG4gICAgaWYgKHduZFdpZHRoW2FdICE9PSAxIHx8IHduZFdpZHRoW2JdICE9PSAxKSB7XG4gICAgICBuYWZbYV0gPSBnZXROQUYoY29lZmZzW2FdLCB3bmRXaWR0aFthXSk7XG4gICAgICBuYWZbYl0gPSBnZXROQUYoY29lZmZzW2JdLCB3bmRXaWR0aFtiXSk7XG4gICAgICBtYXggPSBNYXRoLm1heChuYWZbYV0ubGVuZ3RoLCBtYXgpO1xuICAgICAgbWF4ID0gTWF0aC5tYXgobmFmW2JdLmxlbmd0aCwgbWF4KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBjb21iID0gW1xuICAgICAgcG9pbnRzW2FdLCAvKiAxICovXG4gICAgICBudWxsLCAvKiAzICovXG4gICAgICBudWxsLCAvKiA1ICovXG4gICAgICBwb2ludHNbYl0gLyogNyAqL1xuICAgIF07XG5cbiAgICAvLyBUcnkgdG8gYXZvaWQgUHJvamVjdGl2ZSBwb2ludHMsIGlmIHBvc3NpYmxlXG4gICAgaWYgKHBvaW50c1thXS55LmNtcChwb2ludHNbYl0ueSkgPT09IDApIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0uYWRkKHBvaW50c1tiXSk7XG4gICAgICBjb21iWzJdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXS5uZWcoKSk7XG4gICAgfSBlbHNlIGlmIChwb2ludHNbYV0ueS5jbXAocG9pbnRzW2JdLnkucmVkTmVnKCkpID09PSAwKSB7XG4gICAgICBjb21iWzFdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXSk7XG4gICAgICBjb21iWzJdID0gcG9pbnRzW2FdLmFkZChwb2ludHNbYl0ubmVnKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21iWzFdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXSk7XG4gICAgICBjb21iWzJdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXS5uZWcoKSk7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gW1xuICAgICAgLTMsIC8qIC0xIC0xICovXG4gICAgICAtMSwgLyogLTEgMCAqL1xuICAgICAgLTUsIC8qIC0xIDEgKi9cbiAgICAgIC03LCAvKiAwIC0xICovXG4gICAgICAwLCAvKiAwIDAgKi9cbiAgICAgIDcsIC8qIDAgMSAqL1xuICAgICAgNSwgLyogMSAtMSAqL1xuICAgICAgMSwgLyogMSAwICovXG4gICAgICAzICAvKiAxIDEgKi9cbiAgICBdO1xuXG4gICAgdmFyIGpzZiA9IGdldEpTRihjb2VmZnNbYV0sIGNvZWZmc1tiXSk7XG4gICAgbWF4ID0gTWF0aC5tYXgoanNmWzBdLmxlbmd0aCwgbWF4KTtcbiAgICBuYWZbYV0gPSBuZXcgQXJyYXkobWF4KTtcbiAgICBuYWZbYl0gPSBuZXcgQXJyYXkobWF4KTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1heDsgaisrKSB7XG4gICAgICB2YXIgamEgPSBqc2ZbMF1bal0gfCAwO1xuICAgICAgdmFyIGpiID0ganNmWzFdW2pdIHwgMDtcblxuICAgICAgbmFmW2FdW2pdID0gaW5kZXhbKGphICsgMSkgKiAzICsgKGpiICsgMSldO1xuICAgICAgbmFmW2JdW2pdID0gMDtcbiAgICAgIHduZFthXSA9IGNvbWI7XG4gICAgfVxuICB9XG5cbiAgdmFyIGFjYyA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICB2YXIgdG1wID0gdGhpcy5fd25hZlQ0O1xuICBmb3IgKHZhciBpID0gbWF4OyBpID49IDA7IGktLSkge1xuICAgIHZhciBrID0gMDtcblxuICAgIHdoaWxlIChpID49IDApIHtcbiAgICAgIHZhciB6ZXJvID0gdHJ1ZTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgdG1wW2pdID0gbmFmW2pdW2ldIHwgMDtcbiAgICAgICAgaWYgKHRtcFtqXSAhPT0gMClcbiAgICAgICAgICB6ZXJvID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXplcm8pXG4gICAgICAgIGJyZWFrO1xuICAgICAgaysrO1xuICAgICAgaS0tO1xuICAgIH1cbiAgICBpZiAoaSA+PSAwKVxuICAgICAgaysrO1xuICAgIGFjYyA9IGFjYy5kYmxwKGspO1xuICAgIGlmIChpIDwgMClcbiAgICAgIGJyZWFrO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykge1xuICAgICAgdmFyIHogPSB0bXBbal07XG4gICAgICB2YXIgcDtcbiAgICAgIGlmICh6ID09PSAwKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGVsc2UgaWYgKHogPiAwKVxuICAgICAgICBwID0gd25kW2pdWyh6IC0gMSkgPj4gMV07XG4gICAgICBlbHNlIGlmICh6IDwgMClcbiAgICAgICAgcCA9IHduZFtqXVsoLXogLSAxKSA+PiAxXS5uZWcoKTtcblxuICAgICAgaWYgKHAudHlwZSA9PT0gJ2FmZmluZScpXG4gICAgICAgIGFjYyA9IGFjYy5taXhlZEFkZChwKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLmFkZChwKTtcbiAgICB9XG4gIH1cbiAgLy8gWmVyb2lmeSByZWZlcmVuY2VzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgd25kW2ldID0gbnVsbDtcblxuICBpZiAoamFjb2JpYW5SZXN1bHQpXG4gICAgcmV0dXJuIGFjYztcbiAgZWxzZVxuICAgIHJldHVybiBhY2MudG9QKCk7XG59O1xuXG5mdW5jdGlvbiBCYXNlUG9pbnQoY3VydmUsIHR5cGUpIHtcbiAgdGhpcy5jdXJ2ZSA9IGN1cnZlO1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnByZWNvbXB1dGVkID0gbnVsbDtcbn1cbkJhc2VDdXJ2ZS5CYXNlUG9pbnQgPSBCYXNlUG9pbnQ7XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcSgvKm90aGVyKi8pIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUudmFsaWRhdGUodGhpcyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24gZGVjb2RlUG9pbnQoYnl0ZXMsIGVuYykge1xuICBieXRlcyA9IHV0aWxzLnRvQXJyYXkoYnl0ZXMsIGVuYyk7XG5cbiAgdmFyIGxlbiA9IHRoaXMucC5ieXRlTGVuZ3RoKCk7XG5cbiAgLy8gdW5jb21wcmVzc2VkLCBoeWJyaWQtb2RkLCBoeWJyaWQtZXZlblxuICBpZiAoKGJ5dGVzWzBdID09PSAweDA0IHx8IGJ5dGVzWzBdID09PSAweDA2IHx8IGJ5dGVzWzBdID09PSAweDA3KSAmJlxuICAgICAgYnl0ZXMubGVuZ3RoIC0gMSA9PT0gMiAqIGxlbikge1xuICAgIGlmIChieXRlc1swXSA9PT0gMHgwNilcbiAgICAgIGFzc2VydChieXRlc1tieXRlcy5sZW5ndGggLSAxXSAlIDIgPT09IDApO1xuICAgIGVsc2UgaWYgKGJ5dGVzWzBdID09PSAweDA3KVxuICAgICAgYXNzZXJ0KGJ5dGVzW2J5dGVzLmxlbmd0aCAtIDFdICUgMiA9PT0gMSk7XG5cbiAgICB2YXIgcmVzID0gIHRoaXMucG9pbnQoYnl0ZXMuc2xpY2UoMSwgMSArIGxlbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzLnNsaWNlKDEgKyBsZW4sIDEgKyAyICogbGVuKSk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9IGVsc2UgaWYgKChieXRlc1swXSA9PT0gMHgwMiB8fCBieXRlc1swXSA9PT0gMHgwMykgJiZcbiAgICAgICAgICAgICAgYnl0ZXMubGVuZ3RoIC0gMSA9PT0gbGVuKSB7XG4gICAgcmV0dXJuIHRoaXMucG9pbnRGcm9tWChieXRlcy5zbGljZSgxLCAxICsgbGVuKSwgYnl0ZXNbMF0gPT09IDB4MDMpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignVW5rbm93biBwb2ludCBmb3JtYXQnKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZW5jb2RlQ29tcHJlc3NlZCA9IGZ1bmN0aW9uIGVuY29kZUNvbXByZXNzZWQoZW5jKSB7XG4gIHJldHVybiB0aGlzLmVuY29kZShlbmMsIHRydWUpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5fZW5jb2RlID0gZnVuY3Rpb24gX2VuY29kZShjb21wYWN0KSB7XG4gIHZhciBsZW4gPSB0aGlzLmN1cnZlLnAuYnl0ZUxlbmd0aCgpO1xuICB2YXIgeCA9IHRoaXMuZ2V0WCgpLnRvQXJyYXkoJ2JlJywgbGVuKTtcblxuICBpZiAoY29tcGFjdClcbiAgICByZXR1cm4gWyB0aGlzLmdldFkoKS5pc0V2ZW4oKSA/IDB4MDIgOiAweDAzIF0uY29uY2F0KHgpO1xuXG4gIHJldHVybiBbIDB4MDQgXS5jb25jYXQoeCwgdGhpcy5nZXRZKCkudG9BcnJheSgnYmUnLCBsZW4pKSA7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShlbmMsIGNvbXBhY3QpIHtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLl9lbmNvZGUoY29tcGFjdCksIGVuYyk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLnByZWNvbXB1dGUgPSBmdW5jdGlvbiBwcmVjb21wdXRlKHBvd2VyKSB7XG4gIGlmICh0aGlzLnByZWNvbXB1dGVkKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIHZhciBwcmVjb21wdXRlZCA9IHtcbiAgICBkb3VibGVzOiBudWxsLFxuICAgIG5hZjogbnVsbCxcbiAgICBiZXRhOiBudWxsXG4gIH07XG4gIHByZWNvbXB1dGVkLm5hZiA9IHRoaXMuX2dldE5BRlBvaW50cyg4KTtcbiAgcHJlY29tcHV0ZWQuZG91YmxlcyA9IHRoaXMuX2dldERvdWJsZXMoNCwgcG93ZXIpO1xuICBwcmVjb21wdXRlZC5iZXRhID0gdGhpcy5fZ2V0QmV0YSgpO1xuICB0aGlzLnByZWNvbXB1dGVkID0gcHJlY29tcHV0ZWQ7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9oYXNEb3VibGVzID0gZnVuY3Rpb24gX2hhc0RvdWJsZXMoaykge1xuICBpZiAoIXRoaXMucHJlY29tcHV0ZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBkb3VibGVzID0gdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzO1xuICBpZiAoIWRvdWJsZXMpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkb3VibGVzLnBvaW50cy5sZW5ndGggPj0gTWF0aC5jZWlsKChrLmJpdExlbmd0aCgpICsgMSkgLyBkb3VibGVzLnN0ZXApO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5fZ2V0RG91YmxlcyA9IGZ1bmN0aW9uIF9nZXREb3VibGVzKHN0ZXAsIHBvd2VyKSB7XG4gIGlmICh0aGlzLnByZWNvbXB1dGVkICYmIHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcylcbiAgICByZXR1cm4gdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzO1xuXG4gIHZhciBkb3VibGVzID0gWyB0aGlzIF07XG4gIHZhciBhY2MgPSB0aGlzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvd2VyOyBpICs9IHN0ZXApIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN0ZXA7IGorKylcbiAgICAgIGFjYyA9IGFjYy5kYmwoKTtcbiAgICBkb3VibGVzLnB1c2goYWNjKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHN0ZXA6IHN0ZXAsXG4gICAgcG9pbnRzOiBkb3VibGVzXG4gIH07XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9nZXROQUZQb2ludHMgPSBmdW5jdGlvbiBfZ2V0TkFGUG9pbnRzKHduZCkge1xuICBpZiAodGhpcy5wcmVjb21wdXRlZCAmJiB0aGlzLnByZWNvbXB1dGVkLm5hZilcbiAgICByZXR1cm4gdGhpcy5wcmVjb21wdXRlZC5uYWY7XG5cbiAgdmFyIHJlcyA9IFsgdGhpcyBdO1xuICB2YXIgbWF4ID0gKDEgPDwgd25kKSAtIDE7XG4gIHZhciBkYmwgPSBtYXggPT09IDEgPyBudWxsIDogdGhpcy5kYmwoKTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBtYXg7IGkrKylcbiAgICByZXNbaV0gPSByZXNbaSAtIDFdLmFkZChkYmwpO1xuICByZXR1cm4ge1xuICAgIHduZDogd25kLFxuICAgIHBvaW50czogcmVzXG4gIH07XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9nZXRCZXRhID0gZnVuY3Rpb24gX2dldEJldGEoKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5kYmxwID0gZnVuY3Rpb24gZGJscChrKSB7XG4gIHZhciByID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrOyBpKyspXG4gICAgciA9IHIuZGJsKCk7XG4gIHJldHVybiByO1xufTtcblxufSx7XCIuLi8uLi9lbGxpcHRpY1wiOjI2NyxcImJuLmpzXCI6NDR9XSwyNjk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmUgPSBfZGVyZXFfKCcuLi9jdXJ2ZScpO1xudmFyIGVsbGlwdGljID0gX2RlcmVxXygnLi4vLi4vZWxsaXB0aWMnKTtcbnZhciBCTiA9IF9kZXJlcV8oJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSBfZGVyZXFfKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSBjdXJ2ZS5iYXNlO1xuXG52YXIgYXNzZXJ0ID0gZWxsaXB0aWMudXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBFZHdhcmRzQ3VydmUoY29uZikge1xuICAvLyBOT1RFOiBJbXBvcnRhbnQgYXMgd2UgYXJlIGNyZWF0aW5nIHBvaW50IGluIEJhc2UuY2FsbCgpXG4gIHRoaXMudHdpc3RlZCA9IChjb25mLmEgfCAwKSAhPT0gMTtcbiAgdGhpcy5tT25lQSA9IHRoaXMudHdpc3RlZCAmJiAoY29uZi5hIHwgMCkgPT09IC0xO1xuICB0aGlzLmV4dGVuZGVkID0gdGhpcy5tT25lQTtcblxuICBCYXNlLmNhbGwodGhpcywgJ2Vkd2FyZHMnLCBjb25mKTtcblxuICB0aGlzLmEgPSBuZXcgQk4oY29uZi5hLCAxNikudW1vZCh0aGlzLnJlZC5tKTtcbiAgdGhpcy5hID0gdGhpcy5hLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5jID0gbmV3IEJOKGNvbmYuYywgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5jMiA9IHRoaXMuYy5yZWRTcXIoKTtcbiAgdGhpcy5kID0gbmV3IEJOKGNvbmYuZCwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5kZCA9IHRoaXMuZC5yZWRBZGQodGhpcy5kKTtcblxuICBhc3NlcnQoIXRoaXMudHdpc3RlZCB8fCB0aGlzLmMuZnJvbVJlZCgpLmNtcG4oMSkgPT09IDApO1xuICB0aGlzLm9uZUMgPSAoY29uZi5jIHwgMCkgPT09IDE7XG59XG5pbmhlcml0cyhFZHdhcmRzQ3VydmUsIEJhc2UpO1xubW9kdWxlLmV4cG9ydHMgPSBFZHdhcmRzQ3VydmU7XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuX211bEEgPSBmdW5jdGlvbiBfbXVsQShudW0pIHtcbiAgaWYgKHRoaXMubU9uZUEpXG4gICAgcmV0dXJuIG51bS5yZWROZWcoKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmEucmVkTXVsKG51bSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLl9tdWxDID0gZnVuY3Rpb24gX211bEMobnVtKSB7XG4gIGlmICh0aGlzLm9uZUMpXG4gICAgcmV0dXJuIG51bTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmMucmVkTXVsKG51bSk7XG59O1xuXG4vLyBKdXN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggU2hvcnQgY3VydmVcbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuanBvaW50ID0gZnVuY3Rpb24ganBvaW50KHgsIHksIHosIHQpIHtcbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSwgeiwgdCk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbVggPSBmdW5jdGlvbiBwb2ludEZyb21YKHgsIG9kZCkge1xuICB4ID0gbmV3IEJOKHgsIDE2KTtcbiAgaWYgKCF4LnJlZClcbiAgICB4ID0geC50b1JlZCh0aGlzLnJlZCk7XG5cbiAgdmFyIHgyID0geC5yZWRTcXIoKTtcbiAgdmFyIHJocyA9IHRoaXMuYzIucmVkU3ViKHRoaXMuYS5yZWRNdWwoeDIpKTtcbiAgdmFyIGxocyA9IHRoaXMub25lLnJlZFN1Yih0aGlzLmMyLnJlZE11bCh0aGlzLmQpLnJlZE11bCh4MikpO1xuXG4gIHZhciB5MiA9IHJocy5yZWRNdWwobGhzLnJlZEludm0oKSk7XG4gIHZhciB5ID0geTIucmVkU3FydCgpO1xuICBpZiAoeS5yZWRTcXIoKS5yZWRTdWIoeTIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIHZhciBpc09kZCA9IHkuZnJvbVJlZCgpLmlzT2RkKCk7XG4gIGlmIChvZGQgJiYgIWlzT2RkIHx8ICFvZGQgJiYgaXNPZGQpXG4gICAgeSA9IHkucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbVkgPSBmdW5jdGlvbiBwb2ludEZyb21ZKHksIG9kZCkge1xuICB5ID0gbmV3IEJOKHksIDE2KTtcbiAgaWYgKCF5LnJlZClcbiAgICB5ID0geS50b1JlZCh0aGlzLnJlZCk7XG5cbiAgLy8geF4yID0gKHleMiAtIGNeMikgLyAoY14yIGQgeV4yIC0gYSlcbiAgdmFyIHkyID0geS5yZWRTcXIoKTtcbiAgdmFyIGxocyA9IHkyLnJlZFN1Yih0aGlzLmMyKTtcbiAgdmFyIHJocyA9IHkyLnJlZE11bCh0aGlzLmQpLnJlZE11bCh0aGlzLmMyKS5yZWRTdWIodGhpcy5hKTtcbiAgdmFyIHgyID0gbGhzLnJlZE11bChyaHMucmVkSW52bSgpKTtcblxuICBpZiAoeDIuY21wKHRoaXMuemVybykgPT09IDApIHtcbiAgICBpZiAob2RkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMucG9pbnQodGhpcy56ZXJvLCB5KTtcbiAgfVxuXG4gIHZhciB4ID0geDIucmVkU3FydCgpO1xuICBpZiAoeC5yZWRTcXIoKS5yZWRTdWIoeDIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIGlmICh4LmZyb21SZWQoKS5pc09kZCgpICE9PSBvZGQpXG4gICAgeCA9IHgucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgaWYgKHBvaW50LmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdHJ1ZTtcblxuICAvLyBDdXJ2ZTogQSAqIFheMiArIFleMiA9IENeMiAqICgxICsgRCAqIFheMiAqIFleMilcbiAgcG9pbnQubm9ybWFsaXplKCk7XG5cbiAgdmFyIHgyID0gcG9pbnQueC5yZWRTcXIoKTtcbiAgdmFyIHkyID0gcG9pbnQueS5yZWRTcXIoKTtcbiAgdmFyIGxocyA9IHgyLnJlZE11bCh0aGlzLmEpLnJlZEFkZCh5Mik7XG4gIHZhciByaHMgPSB0aGlzLmMyLnJlZE11bCh0aGlzLm9uZS5yZWRBZGQodGhpcy5kLnJlZE11bCh4MikucmVkTXVsKHkyKSkpO1xuXG4gIHJldHVybiBsaHMuY21wKHJocykgPT09IDA7XG59O1xuXG5mdW5jdGlvbiBQb2ludChjdXJ2ZSwgeCwgeSwgeiwgdCkge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAncHJvamVjdGl2ZScpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB5ID09PSBudWxsICYmIHogPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSB0aGlzLmN1cnZlLnplcm87XG4gICAgdGhpcy55ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy50ID0gdGhpcy5jdXJ2ZS56ZXJvO1xuICAgIHRoaXMuek9uZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIHRoaXMueiA9IHogPyBuZXcgQk4oeiwgMTYpIDogdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy50ID0gdCAmJiBuZXcgQk4odCwgMTYpO1xuICAgIGlmICghdGhpcy54LnJlZClcbiAgICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnkucmVkKVxuICAgICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMuei5yZWQpXG4gICAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICh0aGlzLnQgJiYgIXRoaXMudC5yZWQpXG4gICAgICB0aGlzLnQgPSB0aGlzLnQudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIHRoaXMuek9uZSA9IHRoaXMueiA9PT0gdGhpcy5jdXJ2ZS5vbmU7XG5cbiAgICAvLyBVc2UgZXh0ZW5kZWQgY29vcmRpbmF0ZXNcbiAgICBpZiAodGhpcy5jdXJ2ZS5leHRlbmRlZCAmJiAhdGhpcy50KSB7XG4gICAgICB0aGlzLnQgPSB0aGlzLngucmVkTXVsKHRoaXMueSk7XG4gICAgICBpZiAoIXRoaXMuek9uZSlcbiAgICAgICAgdGhpcy50ID0gdGhpcy50LnJlZE11bCh0aGlzLnoucmVkSW52bSgpKTtcbiAgICB9XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqKSB7XG4gIHJldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLCBvYmopO1xufTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHksIHosIHQpIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB5LCB6LCB0KTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaikge1xuICByZXR1cm4gbmV3IFBvaW50KGN1cnZlLCBvYmpbMF0sIG9ialsxXSwgb2JqWzJdKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMueC5jbXBuKDApID09PSAwICYmXG4gICAgKHRoaXMueS5jbXAodGhpcy56KSA9PT0gMCB8fFxuICAgICh0aGlzLnpPbmUgJiYgdGhpcy55LmNtcCh0aGlzLmN1cnZlLmMpID09PSAwKSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX2V4dERibCA9IGZ1bmN0aW9uIF9leHREYmwoKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA4LWh3Y2RcbiAgLy8gNE0gKyA0U1xuXG4gIC8vIEEgPSBYMV4yXG4gIHZhciBhID0gdGhpcy54LnJlZFNxcigpO1xuICAvLyBCID0gWTFeMlxuICB2YXIgYiA9IHRoaXMueS5yZWRTcXIoKTtcbiAgLy8gQyA9IDIgKiBaMV4yXG4gIHZhciBjID0gdGhpcy56LnJlZFNxcigpO1xuICBjID0gYy5yZWRJQWRkKGMpO1xuICAvLyBEID0gYSAqIEFcbiAgdmFyIGQgPSB0aGlzLmN1cnZlLl9tdWxBKGEpO1xuICAvLyBFID0gKFgxICsgWTEpXjIgLSBBIC0gQlxuICB2YXIgZSA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKS5yZWRJU3ViKGEpLnJlZElTdWIoYik7XG4gIC8vIEcgPSBEICsgQlxuICB2YXIgZyA9IGQucmVkQWRkKGIpO1xuICAvLyBGID0gRyAtIENcbiAgdmFyIGYgPSBnLnJlZFN1YihjKTtcbiAgLy8gSCA9IEQgLSBCXG4gIHZhciBoID0gZC5yZWRTdWIoYik7XG4gIC8vIFgzID0gRSAqIEZcbiAgdmFyIG54ID0gZS5yZWRNdWwoZik7XG4gIC8vIFkzID0gRyAqIEhcbiAgdmFyIG55ID0gZy5yZWRNdWwoaCk7XG4gIC8vIFQzID0gRSAqIEhcbiAgdmFyIG50ID0gZS5yZWRNdWwoaCk7XG4gIC8vIFozID0gRiAqIEdcbiAgdmFyIG56ID0gZi5yZWRNdWwoZyk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnosIG50KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fcHJvakRibCA9IGZ1bmN0aW9uIF9wcm9qRGJsKCkge1xuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1wcm9qZWN0aXZlLmh0bWxcbiAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOC1iYmpscFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA3LWJsXG4gIC8vIGFuZCBvdGhlcnNcbiAgLy8gR2VuZXJhbGx5IDNNICsgNFMgb3IgMk0gKyA0U1xuXG4gIC8vIEIgPSAoWDEgKyBZMSleMlxuICB2YXIgYiA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKTtcbiAgLy8gQyA9IFgxXjJcbiAgdmFyIGMgPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIEQgPSBZMV4yXG4gIHZhciBkID0gdGhpcy55LnJlZFNxcigpO1xuXG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIGlmICh0aGlzLmN1cnZlLnR3aXN0ZWQpIHtcbiAgICAvLyBFID0gYSAqIENcbiAgICB2YXIgZSA9IHRoaXMuY3VydmUuX211bEEoYyk7XG4gICAgLy8gRiA9IEUgKyBEXG4gICAgdmFyIGYgPSBlLnJlZEFkZChkKTtcbiAgICBpZiAodGhpcy56T25lKSB7XG4gICAgICAvLyBYMyA9IChCIC0gQyAtIEQpICogKEYgLSAyKVxuICAgICAgbnggPSBiLnJlZFN1YihjKS5yZWRTdWIoZCkucmVkTXVsKGYucmVkU3ViKHRoaXMuY3VydmUudHdvKSk7XG4gICAgICAvLyBZMyA9IEYgKiAoRSAtIEQpXG4gICAgICBueSA9IGYucmVkTXVsKGUucmVkU3ViKGQpKTtcbiAgICAgIC8vIFozID0gRl4yIC0gMiAqIEZcbiAgICAgIG56ID0gZi5yZWRTcXIoKS5yZWRTdWIoZikucmVkU3ViKGYpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIID0gWjFeMlxuICAgICAgdmFyIGggPSB0aGlzLnoucmVkU3FyKCk7XG4gICAgICAvLyBKID0gRiAtIDIgKiBIXG4gICAgICB2YXIgaiA9IGYucmVkU3ViKGgpLnJlZElTdWIoaCk7XG4gICAgICAvLyBYMyA9IChCLUMtRCkqSlxuICAgICAgbnggPSBiLnJlZFN1YihjKS5yZWRJU3ViKGQpLnJlZE11bChqKTtcbiAgICAgIC8vIFkzID0gRiAqIChFIC0gRClcbiAgICAgIG55ID0gZi5yZWRNdWwoZS5yZWRTdWIoZCkpO1xuICAgICAgLy8gWjMgPSBGICogSlxuICAgICAgbnogPSBmLnJlZE11bChqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRSA9IEMgKyBEXG4gICAgdmFyIGUgPSBjLnJlZEFkZChkKTtcbiAgICAvLyBIID0gKGMgKiBaMSleMlxuICAgIHZhciBoID0gdGhpcy5jdXJ2ZS5fbXVsQyh0aGlzLnopLnJlZFNxcigpO1xuICAgIC8vIEogPSBFIC0gMiAqIEhcbiAgICB2YXIgaiA9IGUucmVkU3ViKGgpLnJlZFN1YihoKTtcbiAgICAvLyBYMyA9IGMgKiAoQiAtIEUpICogSlxuICAgIG54ID0gdGhpcy5jdXJ2ZS5fbXVsQyhiLnJlZElTdWIoZSkpLnJlZE11bChqKTtcbiAgICAvLyBZMyA9IGMgKiBFICogKEMgLSBEKVxuICAgIG55ID0gdGhpcy5jdXJ2ZS5fbXVsQyhlKS5yZWRNdWwoYy5yZWRJU3ViKGQpKTtcbiAgICAvLyBaMyA9IEUgKiBKXG4gICAgbnogPSBlLnJlZE11bChqKTtcbiAgfVxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnksIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBEb3VibGUgaW4gZXh0ZW5kZWQgY29vcmRpbmF0ZXNcbiAgaWYgKHRoaXMuY3VydmUuZXh0ZW5kZWQpXG4gICAgcmV0dXJuIHRoaXMuX2V4dERibCgpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX3Byb2pEYmwoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZXh0QWRkID0gZnVuY3Rpb24gX2V4dEFkZChwKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbFxuICAvLyAgICAgI2FkZGl0aW9uLWFkZC0yMDA4LWh3Y2QtM1xuICAvLyA4TVxuXG4gIC8vIEEgPSAoWTEgLSBYMSkgKiAoWTIgLSBYMilcbiAgdmFyIGEgPSB0aGlzLnkucmVkU3ViKHRoaXMueCkucmVkTXVsKHAueS5yZWRTdWIocC54KSk7XG4gIC8vIEIgPSAoWTEgKyBYMSkgKiAoWTIgKyBYMilcbiAgdmFyIGIgPSB0aGlzLnkucmVkQWRkKHRoaXMueCkucmVkTXVsKHAueS5yZWRBZGQocC54KSk7XG4gIC8vIEMgPSBUMSAqIGsgKiBUMlxuICB2YXIgYyA9IHRoaXMudC5yZWRNdWwodGhpcy5jdXJ2ZS5kZCkucmVkTXVsKHAudCk7XG4gIC8vIEQgPSBaMSAqIDIgKiBaMlxuICB2YXIgZCA9IHRoaXMuei5yZWRNdWwocC56LnJlZEFkZChwLnopKTtcbiAgLy8gRSA9IEIgLSBBXG4gIHZhciBlID0gYi5yZWRTdWIoYSk7XG4gIC8vIEYgPSBEIC0gQ1xuICB2YXIgZiA9IGQucmVkU3ViKGMpO1xuICAvLyBHID0gRCArIENcbiAgdmFyIGcgPSBkLnJlZEFkZChjKTtcbiAgLy8gSCA9IEIgKyBBXG4gIHZhciBoID0gYi5yZWRBZGQoYSk7XG4gIC8vIFgzID0gRSAqIEZcbiAgdmFyIG54ID0gZS5yZWRNdWwoZik7XG4gIC8vIFkzID0gRyAqIEhcbiAgdmFyIG55ID0gZy5yZWRNdWwoaCk7XG4gIC8vIFQzID0gRSAqIEhcbiAgdmFyIG50ID0gZS5yZWRNdWwoaCk7XG4gIC8vIFozID0gRiAqIEdcbiAgdmFyIG56ID0gZi5yZWRNdWwoZyk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnosIG50KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fcHJvakFkZCA9IGZ1bmN0aW9uIF9wcm9qQWRkKHApIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtcHJvamVjdGl2ZS5odG1sXG4gIC8vICAgICAjYWRkaXRpb24tYWRkLTIwMDgtYmJqbHBcbiAgLy8gICAgICNhZGRpdGlvbi1hZGQtMjAwNy1ibFxuICAvLyAxME0gKyAxU1xuXG4gIC8vIEEgPSBaMSAqIFoyXG4gIHZhciBhID0gdGhpcy56LnJlZE11bChwLnopO1xuICAvLyBCID0gQV4yXG4gIHZhciBiID0gYS5yZWRTcXIoKTtcbiAgLy8gQyA9IFgxICogWDJcbiAgdmFyIGMgPSB0aGlzLngucmVkTXVsKHAueCk7XG4gIC8vIEQgPSBZMSAqIFkyXG4gIHZhciBkID0gdGhpcy55LnJlZE11bChwLnkpO1xuICAvLyBFID0gZCAqIEMgKiBEXG4gIHZhciBlID0gdGhpcy5jdXJ2ZS5kLnJlZE11bChjKS5yZWRNdWwoZCk7XG4gIC8vIEYgPSBCIC0gRVxuICB2YXIgZiA9IGIucmVkU3ViKGUpO1xuICAvLyBHID0gQiArIEVcbiAgdmFyIGcgPSBiLnJlZEFkZChlKTtcbiAgLy8gWDMgPSBBICogRiAqICgoWDEgKyBZMSkgKiAoWDIgKyBZMikgLSBDIC0gRClcbiAgdmFyIHRtcCA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRNdWwocC54LnJlZEFkZChwLnkpKS5yZWRJU3ViKGMpLnJlZElTdWIoZCk7XG4gIHZhciBueCA9IGEucmVkTXVsKGYpLnJlZE11bCh0bXApO1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgaWYgKHRoaXMuY3VydmUudHdpc3RlZCkge1xuICAgIC8vIFkzID0gQSAqIEcgKiAoRCAtIGEgKiBDKVxuICAgIG55ID0gYS5yZWRNdWwoZykucmVkTXVsKGQucmVkU3ViKHRoaXMuY3VydmUuX211bEEoYykpKTtcbiAgICAvLyBaMyA9IEYgKiBHXG4gICAgbnogPSBmLnJlZE11bChnKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBZMyA9IEEgKiBHICogKEQgLSBDKVxuICAgIG55ID0gYS5yZWRNdWwoZykucmVkTXVsKGQucmVkU3ViKGMpKTtcbiAgICAvLyBaMyA9IGMgKiBGICogR1xuICAgIG56ID0gdGhpcy5jdXJ2ZS5fbXVsQyhmKS5yZWRNdWwoZyk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBwO1xuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKHRoaXMuY3VydmUuZXh0ZW5kZWQpXG4gICAgcmV0dXJuIHRoaXMuX2V4dEFkZChwKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLl9wcm9qQWRkKHApO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIGlmICh0aGlzLl9oYXNEb3VibGVzKGspKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9maXhlZE5hZk11bCh0aGlzLCBrKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZChrMSwgcCwgazIpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgWyB0aGlzLCBwIF0sIFsgazEsIGsyIF0sIDIsIGZhbHNlKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5qbXVsQWRkID0gZnVuY3Rpb24gam11bEFkZChrMSwgcCwgazIpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgWyB0aGlzLCBwIF0sIFsgazEsIGsyIF0sIDIsIHRydWUpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZSgpIHtcbiAgaWYgKHRoaXMuek9uZSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBOb3JtYWxpemUgY29vcmRpbmF0ZXNcbiAgdmFyIHppID0gdGhpcy56LnJlZEludm0oKTtcbiAgdGhpcy54ID0gdGhpcy54LnJlZE11bCh6aSk7XG4gIHRoaXMueSA9IHRoaXMueS5yZWRNdWwoemkpO1xuICBpZiAodGhpcy50KVxuICAgIHRoaXMudCA9IHRoaXMudC5yZWRNdWwoemkpO1xuICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgdGhpcy56T25lID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKCkge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTmVnKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnQgJiYgdGhpcy50LnJlZE5lZygpKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgdGhpcy5ub3JtYWxpemUoKTtcbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uIGdldFkoKSB7XG4gIHRoaXMubm9ybWFsaXplKCk7XG4gIHJldHVybiB0aGlzLnkuZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXMgPT09IG90aGVyIHx8XG4gICAgICAgICB0aGlzLmdldFgoKS5jbXAob3RoZXIuZ2V0WCgpKSA9PT0gMCAmJlxuICAgICAgICAgdGhpcy5nZXRZKCkuY21wKG90aGVyLmdldFkoKSkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXFYVG9QID0gZnVuY3Rpb24gZXFYVG9QKHgpIHtcbiAgdmFyIHJ4ID0geC50b1JlZCh0aGlzLmN1cnZlLnJlZCkucmVkTXVsKHRoaXMueik7XG4gIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeGMgPSB4LmNsb25lKCk7XG4gIHZhciB0ID0gdGhpcy5jdXJ2ZS5yZWROLnJlZE11bCh0aGlzLnopO1xuICBmb3IgKDs7KSB7XG4gICAgeGMuaWFkZCh0aGlzLmN1cnZlLm4pO1xuICAgIGlmICh4Yy5jbXAodGhpcy5jdXJ2ZS5wKSA+PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcngucmVkSUFkZCh0KTtcbiAgICBpZiAodGhpcy54LmNtcChyeCkgPT09IDApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuLy8gQ29tcGF0aWJpbGl0eSB3aXRoIEJhc2VDdXJ2ZVxuUG9pbnQucHJvdG90eXBlLnRvUCA9IFBvaW50LnByb3RvdHlwZS5ub3JtYWxpemU7XG5Qb2ludC5wcm90b3R5cGUubWl4ZWRBZGQgPSBQb2ludC5wcm90b3R5cGUuYWRkO1xuXG59LHtcIi4uLy4uL2VsbGlwdGljXCI6MjY3LFwiLi4vY3VydmVcIjoyNzAsXCJibi5qc1wiOjQ0LFwiaW5oZXJpdHNcIjoyOTh9XSwyNzA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmUgPSBleHBvcnRzO1xuXG5jdXJ2ZS5iYXNlID0gX2RlcmVxXygnLi9iYXNlJyk7XG5jdXJ2ZS5zaG9ydCA9IF9kZXJlcV8oJy4vc2hvcnQnKTtcbmN1cnZlLm1vbnQgPSBfZGVyZXFfKCcuL21vbnQnKTtcbmN1cnZlLmVkd2FyZHMgPSBfZGVyZXFfKCcuL2Vkd2FyZHMnKTtcblxufSx7XCIuL2Jhc2VcIjoyNjgsXCIuL2Vkd2FyZHNcIjoyNjksXCIuL21vbnRcIjoyNzEsXCIuL3Nob3J0XCI6MjcyfV0sMjcxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGN1cnZlID0gX2RlcmVxXygnLi4vY3VydmUnKTtcbnZhciBCTiA9IF9kZXJlcV8oJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSBfZGVyZXFfKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSBjdXJ2ZS5iYXNlO1xuXG52YXIgZWxsaXB0aWMgPSBfZGVyZXFfKCcuLi8uLi9lbGxpcHRpYycpO1xudmFyIHV0aWxzID0gZWxsaXB0aWMudXRpbHM7XG5cbmZ1bmN0aW9uIE1vbnRDdXJ2ZShjb25mKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnbW9udCcsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYiA9IG5ldyBCTihjb25mLmIsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuaTQgPSBuZXcgQk4oNCkudG9SZWQodGhpcy5yZWQpLnJlZEludm0oKTtcbiAgdGhpcy50d28gPSBuZXcgQk4oMikudG9SZWQodGhpcy5yZWQpO1xuICAvLyBOb3RlOiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIGFjY29yZGluZyB0byB0aGUgb3JpZ2luYWwgcGFwZXJcbiAgLy8gYnkgUC4gTW9udGdvbWVyeSwgTk9UIHRoZSBvbmUgYnkgRC4gSi4gQmVybnN0ZWluLlxuICB0aGlzLmEyNCA9IHRoaXMuaTQucmVkTXVsKHRoaXMuYS5yZWRBZGQodGhpcy50d28pKTtcbn1cbmluaGVyaXRzKE1vbnRDdXJ2ZSwgQmFzZSk7XG5tb2R1bGUuZXhwb3J0cyA9IE1vbnRDdXJ2ZTtcblxuTW9udEN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHBvaW50KSB7XG4gIHZhciB4ID0gcG9pbnQubm9ybWFsaXplKCkueDtcbiAgdmFyIHgyID0geC5yZWRTcXIoKTtcbiAgdmFyIHJocyA9IHgyLnJlZE11bCh4KS5yZWRBZGQoeDIucmVkTXVsKHRoaXMuYSkpLnJlZEFkZCh4KTtcbiAgdmFyIHkgPSByaHMucmVkU3FydCgpO1xuXG4gIHJldHVybiB5LnJlZFNxcigpLmNtcChyaHMpID09PSAwO1xufTtcblxuZnVuY3Rpb24gUG9pbnQoY3VydmUsIHgsIHopIHtcbiAgQmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLCBjdXJ2ZSwgJ3Byb2plY3RpdmUnKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeiA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueiA9IHRoaXMuY3VydmUuemVybztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueiA9IG5ldyBCTih6LCAxNik7XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMuei5yZWQpXG4gICAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICB9XG59XG5pbmhlcml0cyhQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5Nb250Q3VydmUucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24gZGVjb2RlUG9pbnQoYnl0ZXMsIGVuYykge1xuICB2YXIgYnl0ZXMgPSB1dGlscy50b0FycmF5KGJ5dGVzLCBlbmMpO1xuXG4gIC8vIFRPRE8gQ3VydmU0NDhcbiAgLy8gTW9udGdvbWVyeSBjdXJ2ZSBwb2ludHMgbXVzdCBiZSByZXByZXNlbnRlZCBpbiB0aGUgY29tcHJlc3NlZCBmb3JtYXRcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtb3BlbnBncC1yZmM0ODgwYmlzLTAyI2FwcGVuZGl4LUJcbiAgaWYgKGJ5dGVzLmxlbmd0aCA9PT0gMzMgJiYgYnl0ZXNbMF0gPT09IDB4NDApXG4gICAgYnl0ZXMgPSBieXRlcy5zbGljZSgxLCAzMykucmV2ZXJzZSgpOyAvLyBwb2ludCBtdXN0IGJlIGxpdHRsZS1lbmRpYW5cbiAgaWYgKGJ5dGVzLmxlbmd0aCAhPT0gMzIpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHBvaW50IGNvbXByZXNzaW9uIGZvcm1hdCcpO1xuICByZXR1cm4gdGhpcy5wb2ludChieXRlcywgMSk7XG59O1xuXG5Nb250Q3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoeCwgeikge1xuICByZXR1cm4gbmV3IFBvaW50KHRoaXMsIHgsIHopO1xufTtcblxuTW9udEN1cnZlLnByb3RvdHlwZS5wb2ludEZyb21KU09OID0gZnVuY3Rpb24gcG9pbnRGcm9tSlNPTihvYmopIHtcbiAgcmV0dXJuIFBvaW50LmZyb21KU09OKHRoaXMsIG9iaik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUucHJlY29tcHV0ZSA9IGZ1bmN0aW9uIHByZWNvbXB1dGUoKSB7XG4gIC8vIE5vLW9wXG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX2VuY29kZSA9IGZ1bmN0aW9uIF9lbmNvZGUoY29tcGFjdCkge1xuICB2YXIgbGVuID0gdGhpcy5jdXJ2ZS5wLmJ5dGVMZW5ndGgoKTtcblxuICAvLyBOb3RlOiB0aGUgb3V0cHV0IHNob3VsZCBhbHdheXMgYmUgbGl0dGxlLWVuZGlhblxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1vcGVucGdwLXJmYzQ4ODBiaXMtMDIjYXBwZW5kaXgtQlxuICBpZiAoY29tcGFjdCkge1xuICAgIHJldHVybiBbIDB4NDAgXS5jb25jYXQodGhpcy5nZXRYKCkudG9BcnJheSgnbGUnLCBsZW4pKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRYKCkudG9BcnJheSgnYmUnLCBsZW4pO1xuICB9XG59O1xuXG5Qb2ludC5mcm9tSlNPTiA9IGZ1bmN0aW9uIGZyb21KU09OKGN1cnZlLCBvYmopIHtcbiAgcmV0dXJuIG5ldyBQb2ludChjdXJ2ZSwgb2JqWzBdLCBvYmpbMV0gfHwgY3VydmUub25lKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMuei5jbXBuKDApID09PSAwO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgLy8gaHR0cDovL2h5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1tb250Z29tLXh6Lmh0bWwjZG91YmxpbmctZGJsLTE5ODctbS0zXG4gIC8vIDJNICsgMlMgKyA0QVxuXG4gIC8vIEEgPSBYMSArIFoxXG4gIHZhciBhID0gdGhpcy54LnJlZEFkZCh0aGlzLnopO1xuICAvLyBBQSA9IEFeMlxuICB2YXIgYWEgPSBhLnJlZFNxcigpO1xuICAvLyBCID0gWDEgLSBaMVxuICB2YXIgYiA9IHRoaXMueC5yZWRTdWIodGhpcy56KTtcbiAgLy8gQkIgPSBCXjJcbiAgdmFyIGJiID0gYi5yZWRTcXIoKTtcbiAgLy8gQyA9IEFBIC0gQkJcbiAgdmFyIGMgPSBhYS5yZWRTdWIoYmIpO1xuICAvLyBYMyA9IEFBICogQkJcbiAgdmFyIG54ID0gYWEucmVkTXVsKGJiKTtcbiAgLy8gWjMgPSBDICogKEJCICsgQTI0ICogQylcbiAgdmFyIG56ID0gYy5yZWRNdWwoYmIucmVkQWRkKHRoaXMuY3VydmUuYTI0LnJlZE11bChjKSkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kaWZmQWRkID0gZnVuY3Rpb24gZGlmZkFkZChwLCBkaWZmKSB7XG4gIC8vIGh0dHA6Ly9oeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tbW9udGdvbS14ei5odG1sI2RpZmZhZGQtZGFkZC0xOTg3LW0tM1xuICAvLyA0TSArIDJTICsgNkFcblxuICAvLyBBID0gWDIgKyBaMlxuICB2YXIgYSA9IHRoaXMueC5yZWRBZGQodGhpcy56KTtcbiAgLy8gQiA9IFgyIC0gWjJcbiAgdmFyIGIgPSB0aGlzLngucmVkU3ViKHRoaXMueik7XG4gIC8vIEMgPSBYMyArIFozXG4gIHZhciBjID0gcC54LnJlZEFkZChwLnopO1xuICAvLyBEID0gWDMgLSBaM1xuICB2YXIgZCA9IHAueC5yZWRTdWIocC56KTtcbiAgLy8gREEgPSBEICogQVxuICB2YXIgZGEgPSBkLnJlZE11bChhKTtcbiAgLy8gQ0IgPSBDICogQlxuICB2YXIgY2IgPSBjLnJlZE11bChiKTtcbiAgLy8gWDUgPSBaMSAqIChEQSArIENCKV4yXG4gIHZhciBueCA9IGRpZmYuei5yZWRNdWwoZGEucmVkQWRkKGNiKS5yZWRTcXIoKSk7XG4gIC8vIFo1ID0gWDEgKiAoREEgLSBDQileMlxuICB2YXIgbnogPSBkaWZmLngucmVkTXVsKGRhLnJlZElTdWIoY2IpLnJlZFNxcigpKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwoaykge1xuICBrID0gbmV3IEJOKGssIDE2KTtcblxuICB2YXIgdCA9IGsuY2xvbmUoKTtcbiAgdmFyIGEgPSB0aGlzOyAvLyAoTiAvIDIpICogUSArIFFcbiAgdmFyIGIgPSB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpOyAvLyAoTiAvIDIpICogUVxuICB2YXIgYyA9IHRoaXM7IC8vIFFcblxuICBmb3IgKHZhciBiaXRzID0gW107IHQuY21wbigwKSAhPT0gMDsgdC5pdXNocm4oMSkpXG4gICAgYml0cy5wdXNoKHQuYW5kbG4oMSkpO1xuXG4gIGZvciAodmFyIGkgPSBiaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGJpdHNbaV0gPT09IDApIHtcbiAgICAgIC8vIE4gKiBRICsgUSA9ICgoTiAvIDIpICogUSArIFEpKSArIChOIC8gMikgKiBRXG4gICAgICBhID0gYS5kaWZmQWRkKGIsIGMpO1xuICAgICAgLy8gTiAqIFEgPSAyICogKChOIC8gMikgKiBRICsgUSkpXG4gICAgICBiID0gYi5kYmwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTiAqIFEgPSAoKE4gLyAyKSAqIFEgKyBRKSArICgoTiAvIDIpICogUSlcbiAgICAgIGIgPSBhLmRpZmZBZGQoYiwgYyk7XG4gICAgICAvLyBOICogUSArIFEgPSAyICogKChOIC8gMikgKiBRICsgUSlcbiAgICAgIGEgPSBhLmRibCgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYjtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWxBZGQgPSBmdW5jdGlvbiBtdWxBZGQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlJyk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuanVtbEFkZCA9IGZ1bmN0aW9uIGp1bWxBZGQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlJyk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShvdGhlcikge1xuICByZXR1cm4gdGhpcy5nZXRYKCkuY21wKG90aGVyLmdldFgoKSkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICB0aGlzLnggPSB0aGlzLngucmVkTXVsKHRoaXMuei5yZWRJbnZtKCkpO1xuICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uIGdldFgoKSB7XG4gIC8vIE5vcm1hbGl6ZSBjb29yZGluYXRlc1xuICB0aGlzLm5vcm1hbGl6ZSgpO1xuXG4gIHJldHVybiB0aGlzLnguZnJvbVJlZCgpO1xufTtcblxufSx7XCIuLi8uLi9lbGxpcHRpY1wiOjI2NyxcIi4uL2N1cnZlXCI6MjcwLFwiYm4uanNcIjo0NCxcImluaGVyaXRzXCI6Mjk4fV0sMjcyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGN1cnZlID0gX2RlcmVxXygnLi4vY3VydmUnKTtcbnZhciBlbGxpcHRpYyA9IF9kZXJlcV8oJy4uLy4uL2VsbGlwdGljJyk7XG52YXIgQk4gPSBfZGVyZXFfKCdibi5qcycpO1xudmFyIGluaGVyaXRzID0gX2RlcmVxXygnaW5oZXJpdHMnKTtcbnZhciBCYXNlID0gY3VydmUuYmFzZTtcblxudmFyIGFzc2VydCA9IGVsbGlwdGljLnV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gU2hvcnRDdXJ2ZShjb25mKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnc2hvcnQnLCBjb25mKTtcblxuICB0aGlzLmEgPSBuZXcgQk4oY29uZi5hLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmIgPSBuZXcgQk4oY29uZi5iLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLnRpbnYgPSB0aGlzLnR3by5yZWRJbnZtKCk7XG5cbiAgdGhpcy56ZXJvQSA9IHRoaXMuYS5mcm9tUmVkKCkuY21wbigwKSA9PT0gMDtcbiAgdGhpcy50aHJlZUEgPSB0aGlzLmEuZnJvbVJlZCgpLnN1Yih0aGlzLnApLmNtcG4oLTMpID09PSAwO1xuXG4gIC8vIElmIHRoZSBjdXJ2ZSBpcyBlbmRvbW9ycGhpYywgcHJlY2FsY3VsYXRlIGJldGEgYW5kIGxhbWJkYVxuICB0aGlzLmVuZG8gPSB0aGlzLl9nZXRFbmRvbW9ycGhpc20oY29uZik7XG4gIHRoaXMuX2VuZG9XbmFmVDEgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX2VuZG9XbmFmVDIgPSBuZXcgQXJyYXkoNCk7XG59XG5pbmhlcml0cyhTaG9ydEN1cnZlLCBCYXNlKTtcbm1vZHVsZS5leHBvcnRzID0gU2hvcnRDdXJ2ZTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9tb3JwaGlzbSA9IGZ1bmN0aW9uIF9nZXRFbmRvbW9ycGhpc20oY29uZikge1xuICAvLyBObyBlZmZpY2llbnQgZW5kb21vcnBoaXNtXG4gIGlmICghdGhpcy56ZXJvQSB8fCAhdGhpcy5nIHx8ICF0aGlzLm4gfHwgdGhpcy5wLm1vZG4oMykgIT09IDEpXG4gICAgcmV0dXJuO1xuXG4gIC8vIENvbXB1dGUgYmV0YSBhbmQgbGFtYmRhLCB0aGF0IGxhbWJkYSAqIFAgPSAoYmV0YSAqIFB4OyBQeSlcbiAgdmFyIGJldGE7XG4gIHZhciBsYW1iZGE7XG4gIGlmIChjb25mLmJldGEpIHtcbiAgICBiZXRhID0gbmV3IEJOKGNvbmYuYmV0YSwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYmV0YXMgPSB0aGlzLl9nZXRFbmRvUm9vdHModGhpcy5wKTtcbiAgICAvLyBDaG9vc2UgdGhlIHNtYWxsZXN0IGJldGFcbiAgICBiZXRhID0gYmV0YXNbMF0uY21wKGJldGFzWzFdKSA8IDAgPyBiZXRhc1swXSA6IGJldGFzWzFdO1xuICAgIGJldGEgPSBiZXRhLnRvUmVkKHRoaXMucmVkKTtcbiAgfVxuICBpZiAoY29uZi5sYW1iZGEpIHtcbiAgICBsYW1iZGEgPSBuZXcgQk4oY29uZi5sYW1iZGEsIDE2KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDaG9vc2UgdGhlIGxhbWJkYSB0aGF0IGlzIG1hdGNoaW5nIHNlbGVjdGVkIGJldGFcbiAgICB2YXIgbGFtYmRhcyA9IHRoaXMuX2dldEVuZG9Sb290cyh0aGlzLm4pO1xuICAgIGlmICh0aGlzLmcubXVsKGxhbWJkYXNbMF0pLnguY21wKHRoaXMuZy54LnJlZE11bChiZXRhKSkgPT09IDApIHtcbiAgICAgIGxhbWJkYSA9IGxhbWJkYXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhbWJkYSA9IGxhbWJkYXNbMV07XG4gICAgICBhc3NlcnQodGhpcy5nLm11bChsYW1iZGEpLnguY21wKHRoaXMuZy54LnJlZE11bChiZXRhKSkgPT09IDApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBiYXNpcyB2ZWN0b3JzLCB1c2VkIGZvciBiYWxhbmNlZCBsZW5ndGgtdHdvIHJlcHJlc2VudGF0aW9uXG4gIHZhciBiYXNpcztcbiAgaWYgKGNvbmYuYmFzaXMpIHtcbiAgICBiYXNpcyA9IGNvbmYuYmFzaXMubWFwKGZ1bmN0aW9uKHZlYykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYTogbmV3IEJOKHZlYy5hLCAxNiksXG4gICAgICAgIGI6IG5ldyBCTih2ZWMuYiwgMTYpXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGJhc2lzID0gdGhpcy5fZ2V0RW5kb0Jhc2lzKGxhbWJkYSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJldGE6IGJldGEsXG4gICAgbGFtYmRhOiBsYW1iZGEsXG4gICAgYmFzaXM6IGJhc2lzXG4gIH07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb1Jvb3RzID0gZnVuY3Rpb24gX2dldEVuZG9Sb290cyhudW0pIHtcbiAgLy8gRmluZCByb290cyBvZiBmb3IgeF4yICsgeCArIDEgaW4gRlxuICAvLyBSb290ID0gKC0xICstIFNxcnQoLTMpKSAvIDJcbiAgLy9cbiAgdmFyIHJlZCA9IG51bSA9PT0gdGhpcy5wID8gdGhpcy5yZWQgOiBCTi5tb250KG51bSk7XG4gIHZhciB0aW52ID0gbmV3IEJOKDIpLnRvUmVkKHJlZCkucmVkSW52bSgpO1xuICB2YXIgbnRpbnYgPSB0aW52LnJlZE5lZygpO1xuXG4gIHZhciBzID0gbmV3IEJOKDMpLnRvUmVkKHJlZCkucmVkTmVnKCkucmVkU3FydCgpLnJlZE11bCh0aW52KTtcblxuICB2YXIgbDEgPSBudGludi5yZWRBZGQocykuZnJvbVJlZCgpO1xuICB2YXIgbDIgPSBudGludi5yZWRTdWIocykuZnJvbVJlZCgpO1xuICByZXR1cm4gWyBsMSwgbDIgXTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9nZXRFbmRvQmFzaXMgPSBmdW5jdGlvbiBfZ2V0RW5kb0Jhc2lzKGxhbWJkYSkge1xuICAvLyBhcHJ4U3FydCA+PSBzcXJ0KHRoaXMubilcbiAgdmFyIGFwcnhTcXJ0ID0gdGhpcy5uLnVzaHJuKE1hdGguZmxvb3IodGhpcy5uLmJpdExlbmd0aCgpIC8gMikpO1xuXG4gIC8vIDMuNzRcbiAgLy8gUnVuIEVHQ0QsIHVudGlsIHIoTCArIDEpIDwgYXByeFNxcnRcbiAgdmFyIHUgPSBsYW1iZGE7XG4gIHZhciB2ID0gdGhpcy5uLmNsb25lKCk7XG4gIHZhciB4MSA9IG5ldyBCTigxKTtcbiAgdmFyIHkxID0gbmV3IEJOKDApO1xuICB2YXIgeDIgPSBuZXcgQk4oMCk7XG4gIHZhciB5MiA9IG5ldyBCTigxKTtcblxuICAvLyBOT1RFOiBhbGwgdmVjdG9ycyBhcmUgcm9vdHMgb2Y6IGEgKyBiICogbGFtYmRhID0gMCAobW9kIG4pXG4gIHZhciBhMDtcbiAgdmFyIGIwO1xuICAvLyBGaXJzdCB2ZWN0b3JcbiAgdmFyIGExO1xuICB2YXIgYjE7XG4gIC8vIFNlY29uZCB2ZWN0b3JcbiAgdmFyIGEyO1xuICB2YXIgYjI7XG5cbiAgdmFyIHByZXZSO1xuICB2YXIgaSA9IDA7XG4gIHZhciByO1xuICB2YXIgeDtcbiAgd2hpbGUgKHUuY21wbigwKSAhPT0gMCkge1xuICAgIHZhciBxID0gdi5kaXYodSk7XG4gICAgciA9IHYuc3ViKHEubXVsKHUpKTtcbiAgICB4ID0geDIuc3ViKHEubXVsKHgxKSk7XG4gICAgdmFyIHkgPSB5Mi5zdWIocS5tdWwoeTEpKTtcblxuICAgIGlmICghYTEgJiYgci5jbXAoYXByeFNxcnQpIDwgMCkge1xuICAgICAgYTAgPSBwcmV2Ui5uZWcoKTtcbiAgICAgIGIwID0geDE7XG4gICAgICBhMSA9IHIubmVnKCk7XG4gICAgICBiMSA9IHg7XG4gICAgfSBlbHNlIGlmIChhMSAmJiArK2kgPT09IDIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBwcmV2UiA9IHI7XG5cbiAgICB2ID0gdTtcbiAgICB1ID0gcjtcbiAgICB4MiA9IHgxO1xuICAgIHgxID0geDtcbiAgICB5MiA9IHkxO1xuICAgIHkxID0geTtcbiAgfVxuICBhMiA9IHIubmVnKCk7XG4gIGIyID0geDtcblxuICB2YXIgbGVuMSA9IGExLnNxcigpLmFkZChiMS5zcXIoKSk7XG4gIHZhciBsZW4yID0gYTIuc3FyKCkuYWRkKGIyLnNxcigpKTtcbiAgaWYgKGxlbjIuY21wKGxlbjEpID49IDApIHtcbiAgICBhMiA9IGEwO1xuICAgIGIyID0gYjA7XG4gIH1cblxuICAvLyBOb3JtYWxpemUgc2lnbnNcbiAgaWYgKGExLm5lZ2F0aXZlKSB7XG4gICAgYTEgPSBhMS5uZWcoKTtcbiAgICBiMSA9IGIxLm5lZygpO1xuICB9XG4gIGlmIChhMi5uZWdhdGl2ZSkge1xuICAgIGEyID0gYTIubmVnKCk7XG4gICAgYjIgPSBiMi5uZWcoKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgeyBhOiBhMSwgYjogYjEgfSxcbiAgICB7IGE6IGEyLCBiOiBiMiB9XG4gIF07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZW5kb1NwbGl0ID0gZnVuY3Rpb24gX2VuZG9TcGxpdChrKSB7XG4gIHZhciBiYXNpcyA9IHRoaXMuZW5kby5iYXNpcztcbiAgdmFyIHYxID0gYmFzaXNbMF07XG4gIHZhciB2MiA9IGJhc2lzWzFdO1xuXG4gIHZhciBjMSA9IHYyLmIubXVsKGspLmRpdlJvdW5kKHRoaXMubik7XG4gIHZhciBjMiA9IHYxLmIubmVnKCkubXVsKGspLmRpdlJvdW5kKHRoaXMubik7XG5cbiAgdmFyIHAxID0gYzEubXVsKHYxLmEpO1xuICB2YXIgcDIgPSBjMi5tdWwodjIuYSk7XG4gIHZhciBxMSA9IGMxLm11bCh2MS5iKTtcbiAgdmFyIHEyID0gYzIubXVsKHYyLmIpO1xuXG4gIC8vIENhbGN1bGF0ZSBhbnN3ZXJcbiAgdmFyIGsxID0gay5zdWIocDEpLnN1YihwMik7XG4gIHZhciBrMiA9IHExLmFkZChxMikubmVnKCk7XG4gIHJldHVybiB7IGsxOiBrMSwgazI6IGsyIH07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludEZyb21YID0gZnVuY3Rpb24gcG9pbnRGcm9tWCh4LCBvZGQpIHtcbiAgeCA9IG5ldyBCTih4LCAxNik7XG4gIGlmICgheC5yZWQpXG4gICAgeCA9IHgudG9SZWQodGhpcy5yZWQpO1xuXG4gIHZhciB5MiA9IHgucmVkU3FyKCkucmVkTXVsKHgpLnJlZElBZGQoeC5yZWRNdWwodGhpcy5hKSkucmVkSUFkZCh0aGlzLmIpO1xuICB2YXIgeSA9IHkyLnJlZFNxcnQoKTtcbiAgaWYgKHkucmVkU3FyKCkucmVkU3ViKHkyKS5jbXAodGhpcy56ZXJvKSAhPT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcG9pbnQnKTtcblxuICAvLyBYWFggSXMgdGhlcmUgYW55IHdheSB0byB0ZWxsIGlmIHRoZSBudW1iZXIgaXMgb2RkIHdpdGhvdXQgY29udmVydGluZyBpdFxuICAvLyB0byBub24tcmVkIGZvcm0/XG4gIHZhciBpc09kZCA9IHkuZnJvbVJlZCgpLmlzT2RkKCk7XG4gIGlmIChvZGQgJiYgIWlzT2RkIHx8ICFvZGQgJiYgaXNPZGQpXG4gICAgeSA9IHkucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHBvaW50KSB7XG4gIGlmIChwb2ludC5pbmYpXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgdmFyIHggPSBwb2ludC54O1xuICB2YXIgeSA9IHBvaW50Lnk7XG5cbiAgdmFyIGF4ID0gdGhpcy5hLnJlZE11bCh4KTtcbiAgdmFyIHJocyA9IHgucmVkU3FyKCkucmVkTXVsKHgpLnJlZElBZGQoYXgpLnJlZElBZGQodGhpcy5iKTtcbiAgcmV0dXJuIHkucmVkU3FyKCkucmVkSVN1YihyaHMpLmNtcG4oMCkgPT09IDA7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZW5kb1duYWZNdWxBZGQgPVxuICAgIGZ1bmN0aW9uIF9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcywgamFjb2JpYW5SZXN1bHQpIHtcbiAgdmFyIG5wb2ludHMgPSB0aGlzLl9lbmRvV25hZlQxO1xuICB2YXIgbmNvZWZmcyA9IHRoaXMuX2VuZG9XbmFmVDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNwbGl0ID0gdGhpcy5fZW5kb1NwbGl0KGNvZWZmc1tpXSk7XG4gICAgdmFyIHAgPSBwb2ludHNbaV07XG4gICAgdmFyIGJldGEgPSBwLl9nZXRCZXRhKCk7XG5cbiAgICBpZiAoc3BsaXQuazEubmVnYXRpdmUpIHtcbiAgICAgIHNwbGl0LmsxLmluZWcoKTtcbiAgICAgIHAgPSBwLm5lZyh0cnVlKTtcbiAgICB9XG4gICAgaWYgKHNwbGl0LmsyLm5lZ2F0aXZlKSB7XG4gICAgICBzcGxpdC5rMi5pbmVnKCk7XG4gICAgICBiZXRhID0gYmV0YS5uZWcodHJ1ZSk7XG4gICAgfVxuXG4gICAgbnBvaW50c1tpICogMl0gPSBwO1xuICAgIG5wb2ludHNbaSAqIDIgKyAxXSA9IGJldGE7XG4gICAgbmNvZWZmc1tpICogMl0gPSBzcGxpdC5rMTtcbiAgICBuY29lZmZzW2kgKiAyICsgMV0gPSBzcGxpdC5rMjtcbiAgfVxuICB2YXIgcmVzID0gdGhpcy5fd25hZk11bEFkZCgxLCBucG9pbnRzLCBuY29lZmZzLCBpICogMiwgamFjb2JpYW5SZXN1bHQpO1xuXG4gIC8vIENsZWFuLXVwIHJlZmVyZW5jZXMgdG8gcG9pbnRzIGFuZCBjb2VmZmljaWVudHNcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBpICogMjsgaisrKSB7XG4gICAgbnBvaW50c1tqXSA9IG51bGw7XG4gICAgbmNvZWZmc1tqXSA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIFBvaW50KGN1cnZlLCB4LCB5LCBpc1JlZCkge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAnYWZmaW5lJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHkgPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSBudWxsO1xuICAgIHRoaXMueSA9IG51bGw7XG4gICAgdGhpcy5pbmYgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy55ID0gbmV3IEJOKHksIDE2KTtcbiAgICAvLyBGb3JjZSByZWRnb21lcnkgcmVwcmVzZW50YXRpb24gd2hlbiBsb2FkaW5nIGZyb20gSlNPTlxuICAgIGlmIChpc1JlZCkge1xuICAgICAgdGhpcy54LmZvcmNlUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICAgIHRoaXMueS5mb3JjZVJlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgfVxuICAgIGlmICghdGhpcy54LnJlZClcbiAgICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnkucmVkKVxuICAgICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICB0aGlzLmluZiA9IGZhbHNlO1xuICB9XG59XG5pbmhlcml0cyhQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHksIGlzUmVkKSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcywgeCwgeSwgaXNSZWQpO1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqLCByZWQpIHtcbiAgcmV0dXJuIFBvaW50LmZyb21KU09OKHRoaXMsIG9iaiwgcmVkKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZ2V0QmV0YSA9IGZ1bmN0aW9uIF9nZXRCZXRhKCkge1xuICBpZiAoIXRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm47XG5cbiAgdmFyIHByZSA9IHRoaXMucHJlY29tcHV0ZWQ7XG4gIGlmIChwcmUgJiYgcHJlLmJldGEpXG4gICAgcmV0dXJuIHByZS5iZXRhO1xuXG4gIHZhciBiZXRhID0gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTXVsKHRoaXMuY3VydmUuZW5kby5iZXRhKSwgdGhpcy55KTtcbiAgaWYgKHByZSkge1xuICAgIHZhciBjdXJ2ZSA9IHRoaXMuY3VydmU7XG4gICAgdmFyIGVuZG9NdWwgPSBmdW5jdGlvbihwKSB7XG4gICAgICByZXR1cm4gY3VydmUucG9pbnQocC54LnJlZE11bChjdXJ2ZS5lbmRvLmJldGEpLCBwLnkpO1xuICAgIH07XG4gICAgcHJlLmJldGEgPSBiZXRhO1xuICAgIGJldGEucHJlY29tcHV0ZWQgPSB7XG4gICAgICBiZXRhOiBudWxsLFxuICAgICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgICAgd25kOiBwcmUubmFmLnduZCxcbiAgICAgICAgcG9pbnRzOiBwcmUubmFmLnBvaW50cy5tYXAoZW5kb011bClcbiAgICAgIH0sXG4gICAgICBkb3VibGVzOiBwcmUuZG91YmxlcyAmJiB7XG4gICAgICAgIHN0ZXA6IHByZS5kb3VibGVzLnN0ZXAsXG4gICAgICAgIHBvaW50czogcHJlLmRvdWJsZXMucG9pbnRzLm1hcChlbmRvTXVsKVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGJldGE7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICBpZiAoIXRoaXMucHJlY29tcHV0ZWQpXG4gICAgcmV0dXJuIFsgdGhpcy54LCB0aGlzLnkgXTtcblxuICByZXR1cm4gWyB0aGlzLngsIHRoaXMueSwgdGhpcy5wcmVjb21wdXRlZCAmJiB7XG4gICAgZG91YmxlczogdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzICYmIHtcbiAgICAgIHN0ZXA6IHRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5zdGVwLFxuICAgICAgcG9pbnRzOiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMucG9pbnRzLnNsaWNlKDEpXG4gICAgfSxcbiAgICBuYWY6IHRoaXMucHJlY29tcHV0ZWQubmFmICYmIHtcbiAgICAgIHduZDogdGhpcy5wcmVjb21wdXRlZC5uYWYud25kLFxuICAgICAgcG9pbnRzOiB0aGlzLnByZWNvbXB1dGVkLm5hZi5wb2ludHMuc2xpY2UoMSlcbiAgICB9XG4gIH0gXTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaiwgcmVkKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJylcbiAgICBvYmogPSBKU09OLnBhcnNlKG9iaik7XG4gIHZhciByZXMgPSBjdXJ2ZS5wb2ludChvYmpbMF0sIG9ialsxXSwgcmVkKTtcbiAgaWYgKCFvYmpbMl0pXG4gICAgcmV0dXJuIHJlcztcblxuICBmdW5jdGlvbiBvYmoycG9pbnQob2JqKSB7XG4gICAgcmV0dXJuIGN1cnZlLnBvaW50KG9ialswXSwgb2JqWzFdLCByZWQpO1xuICB9XG5cbiAgdmFyIHByZSA9IG9ialsyXTtcbiAgcmVzLnByZWNvbXB1dGVkID0ge1xuICAgIGJldGE6IG51bGwsXG4gICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgc3RlcDogcHJlLmRvdWJsZXMuc3RlcCxcbiAgICAgIHBvaW50czogWyByZXMgXS5jb25jYXQocHJlLmRvdWJsZXMucG9pbnRzLm1hcChvYmoycG9pbnQpKVxuICAgIH0sXG4gICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgIHduZDogcHJlLm5hZi53bmQsXG4gICAgICBwb2ludHM6IFsgcmVzIF0uY29uY2F0KHByZS5uYWYucG9pbnRzLm1hcChvYmoycG9pbnQpKVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJlcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgcmV0dXJuIHRoaXMuaW5mO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHA7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBQICsgUCA9IDJQXG4gIGlmICh0aGlzLmVxKHApKVxuICAgIHJldHVybiB0aGlzLmRibCgpO1xuXG4gIC8vIFAgKyAoLVApID0gT1xuICBpZiAodGhpcy5uZWcoKS5lcShwKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICAvLyBQICsgUSA9IE9cbiAgaWYgKHRoaXMueC5jbXAocC54KSA9PT0gMClcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICB2YXIgYyA9IHRoaXMueS5yZWRTdWIocC55KTtcbiAgaWYgKGMuY21wbigwKSAhPT0gMClcbiAgICBjID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihwLngpLnJlZEludm0oKSk7XG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0aGlzLngpLnJlZElTdWIocC54KTtcbiAgdmFyIG55ID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihueCkpLnJlZElTdWIodGhpcy55KTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyAyUCA9IE9cbiAgdmFyIHlzMSA9IHRoaXMueS5yZWRBZGQodGhpcy55KTtcbiAgaWYgKHlzMS5jbXBuKDApID09PSAwKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciBhID0gdGhpcy5jdXJ2ZS5hO1xuXG4gIHZhciB4MiA9IHRoaXMueC5yZWRTcXIoKTtcbiAgdmFyIGR5aW52ID0geXMxLnJlZEludm0oKTtcbiAgdmFyIGMgPSB4Mi5yZWRBZGQoeDIpLnJlZElBZGQoeDIpLnJlZElBZGQoYSkucmVkTXVsKGR5aW52KTtcblxuICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodGhpcy54LnJlZEFkZCh0aGlzLngpKTtcbiAgdmFyIG55ID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihueCkpLnJlZElTdWIodGhpcy55KTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uIGdldFkoKSB7XG4gIHJldHVybiB0aGlzLnkuZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIGsgPSBuZXcgQk4oaywgMTYpO1xuXG4gIGlmICh0aGlzLl9oYXNEb3VibGVzKGspKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9maXhlZE5hZk11bCh0aGlzLCBrKTtcbiAgZWxzZSBpZiAodGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChbIHRoaXMgXSwgWyBrIF0pO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWwodGhpcywgayk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsQWRkID0gZnVuY3Rpb24gbXVsQWRkKGsxLCBwMiwgazIpIHtcbiAgdmFyIHBvaW50cyA9IFsgdGhpcywgcDIgXTtcbiAgdmFyIGNvZWZmcyA9IFsgazEsIGsyIF07XG4gIGlmICh0aGlzLmN1cnZlLmVuZG8pXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKHBvaW50cywgY29lZmZzKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsIHBvaW50cywgY29lZmZzLCAyKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5qbXVsQWRkID0gZnVuY3Rpb24gam11bEFkZChrMSwgcDIsIGsyKSB7XG4gIHZhciBwb2ludHMgPSBbIHRoaXMsIHAyIF07XG4gIHZhciBjb2VmZnMgPSBbIGsxLCBrMiBdO1xuICBpZiAodGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcywgdHJ1ZSk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBwb2ludHMsIGNvZWZmcywgMiwgdHJ1ZSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShwKSB7XG4gIHJldHVybiB0aGlzID09PSBwIHx8XG4gICAgICAgICB0aGlzLmluZiA9PT0gcC5pbmYgJiZcbiAgICAgICAgICAgICAodGhpcy5pbmYgfHwgdGhpcy54LmNtcChwLngpID09PSAwICYmIHRoaXMueS5jbXAocC55KSA9PT0gMCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKF9wcmVjb21wdXRlKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICB2YXIgcmVzID0gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngsIHRoaXMueS5yZWROZWcoKSk7XG4gIGlmIChfcHJlY29tcHV0ZSAmJiB0aGlzLnByZWNvbXB1dGVkKSB7XG4gICAgdmFyIHByZSA9IHRoaXMucHJlY29tcHV0ZWQ7XG4gICAgdmFyIG5lZ2F0ZSA9IGZ1bmN0aW9uKHApIHtcbiAgICAgIHJldHVybiBwLm5lZygpO1xuICAgIH07XG4gICAgcmVzLnByZWNvbXB1dGVkID0ge1xuICAgICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgICAgd25kOiBwcmUubmFmLnduZCxcbiAgICAgICAgcG9pbnRzOiBwcmUubmFmLnBvaW50cy5tYXAobmVnYXRlKVxuICAgICAgfSxcbiAgICAgIGRvdWJsZXM6IHByZS5kb3VibGVzICYmIHtcbiAgICAgICAgc3RlcDogcHJlLmRvdWJsZXMuc3RlcCxcbiAgICAgICAgcG9pbnRzOiBwcmUuZG91Ymxlcy5wb2ludHMubWFwKG5lZ2F0ZSlcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9KID0gZnVuY3Rpb24gdG9KKCkge1xuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuXG4gIHZhciByZXMgPSB0aGlzLmN1cnZlLmpwb2ludCh0aGlzLngsIHRoaXMueSwgdGhpcy5jdXJ2ZS5vbmUpO1xuICByZXR1cm4gcmVzO1xufTtcblxuZnVuY3Rpb24gSlBvaW50KGN1cnZlLCB4LCB5LCB6KSB7XG4gIEJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdqYWNvYmlhbicpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB5ID09PSBudWxsICYmIHogPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnkgPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnogPSBuZXcgQk4oMCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIHRoaXMueiA9IG5ldyBCTih6LCAxNik7XG4gIH1cbiAgaWYgKCF0aGlzLngucmVkKVxuICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gIGlmICghdGhpcy55LnJlZClcbiAgICB0aGlzLnkgPSB0aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICBpZiAoIXRoaXMuei5yZWQpXG4gICAgdGhpcy56ID0gdGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcblxuICB0aGlzLnpPbmUgPSB0aGlzLnogPT09IHRoaXMuY3VydmUub25lO1xufVxuaW5oZXJpdHMoSlBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cblNob3J0Q3VydmUucHJvdG90eXBlLmpwb2ludCA9IGZ1bmN0aW9uIGpwb2ludCh4LCB5LCB6KSB7XG4gIHJldHVybiBuZXcgSlBvaW50KHRoaXMsIHgsIHksIHopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS50b1AgPSBmdW5jdGlvbiB0b1AoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICB2YXIgemludiA9IHRoaXMuei5yZWRJbnZtKCk7XG4gIHZhciB6aW52MiA9IHppbnYucmVkU3FyKCk7XG4gIHZhciBheCA9IHRoaXMueC5yZWRNdWwoemludjIpO1xuICB2YXIgYXkgPSB0aGlzLnkucmVkTXVsKHppbnYyKS5yZWRNdWwoemludik7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQoYXgsIGF5KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKCkge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQodGhpcy54LCB0aGlzLnkucmVkTmVnKCksIHRoaXMueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHA7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyAxMk0gKyA0UyArIDdBXG4gIHZhciBwejIgPSBwLnoucmVkU3FyKCk7XG4gIHZhciB6MiA9IHRoaXMuei5yZWRTcXIoKTtcbiAgdmFyIHUxID0gdGhpcy54LnJlZE11bChwejIpO1xuICB2YXIgdTIgPSBwLngucmVkTXVsKHoyKTtcbiAgdmFyIHMxID0gdGhpcy55LnJlZE11bChwejIucmVkTXVsKHAueikpO1xuICB2YXIgczIgPSBwLnkucmVkTXVsKHoyLnJlZE11bCh0aGlzLnopKTtcblxuICB2YXIgaCA9IHUxLnJlZFN1Yih1Mik7XG4gIHZhciByID0gczEucmVkU3ViKHMyKTtcbiAgaWYgKGguY21wbigwKSA9PT0gMCkge1xuICAgIGlmIChyLmNtcG4oMCkgIT09IDApXG4gICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMuZGJsKCk7XG4gIH1cblxuICB2YXIgaDIgPSBoLnJlZFNxcigpO1xuICB2YXIgaDMgPSBoMi5yZWRNdWwoaCk7XG4gIHZhciB2ID0gdTEucmVkTXVsKGgyKTtcblxuICB2YXIgbnggPSByLnJlZFNxcigpLnJlZElBZGQoaDMpLnJlZElTdWIodikucmVkSVN1Yih2KTtcbiAgdmFyIG55ID0gci5yZWRNdWwodi5yZWRJU3ViKG54KSkucmVkSVN1YihzMS5yZWRNdWwoaDMpKTtcbiAgdmFyIG56ID0gdGhpcy56LnJlZE11bChwLnopLnJlZE11bChoKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLm1peGVkQWRkID0gZnVuY3Rpb24gbWl4ZWRBZGQocCkge1xuICAvLyBPICsgUCA9IFBcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBwLnRvSigpO1xuXG4gIC8vIFAgKyBPID0gUFxuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gOE0gKyAzUyArIDdBXG4gIHZhciB6MiA9IHRoaXMuei5yZWRTcXIoKTtcbiAgdmFyIHUxID0gdGhpcy54O1xuICB2YXIgdTIgPSBwLngucmVkTXVsKHoyKTtcbiAgdmFyIHMxID0gdGhpcy55O1xuICB2YXIgczIgPSBwLnkucmVkTXVsKHoyKS5yZWRNdWwodGhpcy56KTtcblxuICB2YXIgaCA9IHUxLnJlZFN1Yih1Mik7XG4gIHZhciByID0gczEucmVkU3ViKHMyKTtcbiAgaWYgKGguY21wbigwKSA9PT0gMCkge1xuICAgIGlmIChyLmNtcG4oMCkgIT09IDApXG4gICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMuZGJsKCk7XG4gIH1cblxuICB2YXIgaDIgPSBoLnJlZFNxcigpO1xuICB2YXIgaDMgPSBoMi5yZWRNdWwoaCk7XG4gIHZhciB2ID0gdTEucmVkTXVsKGgyKTtcblxuICB2YXIgbnggPSByLnJlZFNxcigpLnJlZElBZGQoaDMpLnJlZElTdWIodikucmVkSVN1Yih2KTtcbiAgdmFyIG55ID0gci5yZWRNdWwodi5yZWRJU3ViKG54KSkucmVkSVN1YihzMS5yZWRNdWwoaDMpKTtcbiAgdmFyIG56ID0gdGhpcy56LnJlZE11bChoKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmRibHAgPSBmdW5jdGlvbiBkYmxwKHBvdykge1xuICBpZiAocG93ID09PSAwKVxuICAgIHJldHVybiB0aGlzO1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG4gIGlmICghcG93KVxuICAgIHJldHVybiB0aGlzLmRibCgpO1xuXG4gIGlmICh0aGlzLmN1cnZlLnplcm9BIHx8IHRoaXMuY3VydmUudGhyZWVBKSB7XG4gICAgdmFyIHIgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG93OyBpKyspXG4gICAgICByID0gci5kYmwoKTtcbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIC8vIDFNICsgMlMgKyAxQSArIE4gKiAoNFMgKyA1TSArIDhBKVxuICAvLyBOID0gMSA9PiA2TSArIDZTICsgOUFcbiAgdmFyIGEgPSB0aGlzLmN1cnZlLmE7XG4gIHZhciB0aW52ID0gdGhpcy5jdXJ2ZS50aW52O1xuXG4gIHZhciBqeCA9IHRoaXMueDtcbiAgdmFyIGp5ID0gdGhpcy55O1xuICB2YXIganogPSB0aGlzLno7XG4gIHZhciBqejQgPSBqei5yZWRTcXIoKS5yZWRTcXIoKTtcblxuICAvLyBSZXVzZSByZXN1bHRzXG4gIHZhciBqeWQgPSBqeS5yZWRBZGQoankpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvdzsgaSsrKSB7XG4gICAgdmFyIGp4MiA9IGp4LnJlZFNxcigpO1xuICAgIHZhciBqeWQyID0ganlkLnJlZFNxcigpO1xuICAgIHZhciBqeWQ0ID0ganlkMi5yZWRTcXIoKTtcbiAgICB2YXIgYyA9IGp4Mi5yZWRBZGQoangyKS5yZWRJQWRkKGp4MikucmVkSUFkZChhLnJlZE11bChqejQpKTtcblxuICAgIHZhciB0MSA9IGp4LnJlZE11bChqeWQyKTtcbiAgICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodDEucmVkQWRkKHQxKSk7XG4gICAgdmFyIHQyID0gdDEucmVkSVN1YihueCk7XG4gICAgdmFyIGRueSA9IGMucmVkTXVsKHQyKTtcbiAgICBkbnkgPSBkbnkucmVkSUFkZChkbnkpLnJlZElTdWIoanlkNCk7XG4gICAgdmFyIG56ID0ganlkLnJlZE11bChqeik7XG4gICAgaWYgKGkgKyAxIDwgcG93KVxuICAgICAgano0ID0gano0LnJlZE11bChqeWQ0KTtcblxuICAgIGp4ID0gbng7XG4gICAganogPSBuejtcbiAgICBqeWQgPSBkbnk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQoangsIGp5ZC5yZWRNdWwodGludiksIGp6KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKHRoaXMuY3VydmUuemVyb0EpXG4gICAgcmV0dXJuIHRoaXMuX3plcm9EYmwoKTtcbiAgZWxzZSBpZiAodGhpcy5jdXJ2ZS50aHJlZUEpXG4gICAgcmV0dXJuIHRoaXMuX3RocmVlRGJsKCk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5fZGJsKCk7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl96ZXJvRGJsID0gZnVuY3Rpb24gX3plcm9EYmwoKSB7XG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIC8vIFogPSAxXG4gIGlmICh0aGlzLnpPbmUpIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbFxuICAgIC8vICAgICAjZG91YmxpbmctbWRibC0yMDA3LWJsXG4gICAgLy8gMU0gKyA1UyArIDE0QVxuXG4gICAgLy8gWFggPSBYMV4yXG4gICAgdmFyIHh4ID0gdGhpcy54LnJlZFNxcigpO1xuICAgIC8vIFlZID0gWTFeMlxuICAgIHZhciB5eSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBZWVlZID0gWVleMlxuICAgIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gICAgLy8gUyA9IDIgKiAoKFgxICsgWVkpXjIgLSBYWCAtIFlZWVkpXG4gICAgdmFyIHMgPSB0aGlzLngucmVkQWRkKHl5KS5yZWRTcXIoKS5yZWRJU3ViKHh4KS5yZWRJU3ViKHl5eXkpO1xuICAgIHMgPSBzLnJlZElBZGQocyk7XG4gICAgLy8gTSA9IDMgKiBYWCArIGE7IGEgPSAwXG4gICAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpO1xuICAgIC8vIFQgPSBNIF4gMiAtIDIqU1xuICAgIHZhciB0ID0gbS5yZWRTcXIoKS5yZWRJU3ViKHMpLnJlZElTdWIocyk7XG5cbiAgICAvLyA4ICogWVlZWVxuICAgIHZhciB5eXl5OCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG5cbiAgICAvLyBYMyA9IFRcbiAgICBueCA9IHQ7XG4gICAgLy8gWTMgPSBNICogKFMgLSBUKSAtIDggKiBZWVlZXG4gICAgbnkgPSBtLnJlZE11bChzLnJlZElTdWIodCkpLnJlZElTdWIoeXl5eTgpO1xuICAgIC8vIFozID0gMipZMVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMC5odG1sXG4gICAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOS1sXG4gICAgLy8gMk0gKyA1UyArIDEzQVxuXG4gICAgLy8gQSA9IFgxXjJcbiAgICB2YXIgYSA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBCID0gWTFeMlxuICAgIHZhciBiID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIEMgPSBCXjJcbiAgICB2YXIgYyA9IGIucmVkU3FyKCk7XG4gICAgLy8gRCA9IDIgKiAoKFgxICsgQileMiAtIEEgLSBDKVxuICAgIHZhciBkID0gdGhpcy54LnJlZEFkZChiKS5yZWRTcXIoKS5yZWRJU3ViKGEpLnJlZElTdWIoYyk7XG4gICAgZCA9IGQucmVkSUFkZChkKTtcbiAgICAvLyBFID0gMyAqIEFcbiAgICB2YXIgZSA9IGEucmVkQWRkKGEpLnJlZElBZGQoYSk7XG4gICAgLy8gRiA9IEVeMlxuICAgIHZhciBmID0gZS5yZWRTcXIoKTtcblxuICAgIC8vIDggKiBDXG4gICAgdmFyIGM4ID0gYy5yZWRJQWRkKGMpO1xuICAgIGM4ID0gYzgucmVkSUFkZChjOCk7XG4gICAgYzggPSBjOC5yZWRJQWRkKGM4KTtcblxuICAgIC8vIFgzID0gRiAtIDIgKiBEXG4gICAgbnggPSBmLnJlZElTdWIoZCkucmVkSVN1YihkKTtcbiAgICAvLyBZMyA9IEUgKiAoRCAtIFgzKSAtIDggKiBDXG4gICAgbnkgPSBlLnJlZE11bChkLnJlZElTdWIobngpKS5yZWRJU3ViKGM4KTtcbiAgICAvLyBaMyA9IDIgKiBZMSAqIFoxXG4gICAgbnogPSB0aGlzLnkucmVkTXVsKHRoaXMueik7XG4gICAgbnogPSBuei5yZWRJQWRkKG56KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuX3RocmVlRGJsID0gZnVuY3Rpb24gX3RocmVlRGJsKCkge1xuICB2YXIgbng7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICAvLyBaID0gMVxuICBpZiAodGhpcy56T25lKSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0zLmh0bWxcbiAgICAvLyAgICAgI2RvdWJsaW5nLW1kYmwtMjAwNy1ibFxuICAgIC8vIDFNICsgNVMgKyAxNUFcblxuICAgIC8vIFhYID0gWDFeMlxuICAgIHZhciB4eCA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBZWSA9IFkxXjJcbiAgICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gWVlZWSA9IFlZXjJcbiAgICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAgIC8vIFMgPSAyICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKVxuICAgIHZhciBzID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgICBzID0gcy5yZWRJQWRkKHMpO1xuICAgIC8vIE0gPSAzICogWFggKyBhXG4gICAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpLnJlZElBZGQodGhpcy5jdXJ2ZS5hKTtcbiAgICAvLyBUID0gTV4yIC0gMiAqIFNcbiAgICB2YXIgdCA9IG0ucmVkU3FyKCkucmVkSVN1YihzKS5yZWRJU3ViKHMpO1xuICAgIC8vIFgzID0gVFxuICAgIG54ID0gdDtcbiAgICAvLyBZMyA9IE0gKiAoUyAtIFQpIC0gOCAqIFlZWVlcbiAgICB2YXIgeXl5eTggPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIG55ID0gbS5yZWRNdWwocy5yZWRJU3ViKHQpKS5yZWRJU3ViKHl5eXk4KTtcbiAgICAvLyBaMyA9IDIgKiBZMVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMy5odG1sI2RvdWJsaW5nLWRibC0yMDAxLWJcbiAgICAvLyAzTSArIDVTXG5cbiAgICAvLyBkZWx0YSA9IFoxXjJcbiAgICB2YXIgZGVsdGEgPSB0aGlzLnoucmVkU3FyKCk7XG4gICAgLy8gZ2FtbWEgPSBZMV4yXG4gICAgdmFyIGdhbW1hID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIGJldGEgPSBYMSAqIGdhbW1hXG4gICAgdmFyIGJldGEgPSB0aGlzLngucmVkTXVsKGdhbW1hKTtcbiAgICAvLyBhbHBoYSA9IDMgKiAoWDEgLSBkZWx0YSkgKiAoWDEgKyBkZWx0YSlcbiAgICB2YXIgYWxwaGEgPSB0aGlzLngucmVkU3ViKGRlbHRhKS5yZWRNdWwodGhpcy54LnJlZEFkZChkZWx0YSkpO1xuICAgIGFscGhhID0gYWxwaGEucmVkQWRkKGFscGhhKS5yZWRJQWRkKGFscGhhKTtcbiAgICAvLyBYMyA9IGFscGhhXjIgLSA4ICogYmV0YVxuICAgIHZhciBiZXRhNCA9IGJldGEucmVkSUFkZChiZXRhKTtcbiAgICBiZXRhNCA9IGJldGE0LnJlZElBZGQoYmV0YTQpO1xuICAgIHZhciBiZXRhOCA9IGJldGE0LnJlZEFkZChiZXRhNCk7XG4gICAgbnggPSBhbHBoYS5yZWRTcXIoKS5yZWRJU3ViKGJldGE4KTtcbiAgICAvLyBaMyA9IChZMSArIFoxKV4yIC0gZ2FtbWEgLSBkZWx0YVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnopLnJlZFNxcigpLnJlZElTdWIoZ2FtbWEpLnJlZElTdWIoZGVsdGEpO1xuICAgIC8vIFkzID0gYWxwaGEgKiAoNCAqIGJldGEgLSBYMykgLSA4ICogZ2FtbWFeMlxuICAgIHZhciBnZ2FtbWE4ID0gZ2FtbWEucmVkU3FyKCk7XG4gICAgZ2dhbW1hOCA9IGdnYW1tYTgucmVkSUFkZChnZ2FtbWE4KTtcbiAgICBnZ2FtbWE4ID0gZ2dhbW1hOC5yZWRJQWRkKGdnYW1tYTgpO1xuICAgIGdnYW1tYTggPSBnZ2FtbWE4LnJlZElBZGQoZ2dhbW1hOCk7XG4gICAgbnkgPSBhbHBoYS5yZWRNdWwoYmV0YTQucmVkSVN1YihueCkpLnJlZElTdWIoZ2dhbW1hOCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl9kYmwgPSBmdW5jdGlvbiBfZGJsKCkge1xuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcblxuICAvLyA0TSArIDZTICsgMTBBXG4gIHZhciBqeCA9IHRoaXMueDtcbiAgdmFyIGp5ID0gdGhpcy55O1xuICB2YXIganogPSB0aGlzLno7XG4gIHZhciBqejQgPSBqei5yZWRTcXIoKS5yZWRTcXIoKTtcblxuICB2YXIgangyID0gangucmVkU3FyKCk7XG4gIHZhciBqeTIgPSBqeS5yZWRTcXIoKTtcblxuICB2YXIgYyA9IGp4Mi5yZWRBZGQoangyKS5yZWRJQWRkKGp4MikucmVkSUFkZChhLnJlZE11bChqejQpKTtcblxuICB2YXIganhkNCA9IGp4LnJlZEFkZChqeCk7XG4gIGp4ZDQgPSBqeGQ0LnJlZElBZGQoanhkNCk7XG4gIHZhciB0MSA9IGp4ZDQucmVkTXVsKGp5Mik7XG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0MS5yZWRBZGQodDEpKTtcbiAgdmFyIHQyID0gdDEucmVkSVN1YihueCk7XG5cbiAgdmFyIGp5ZDggPSBqeTIucmVkU3FyKCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIHZhciBueSA9IGMucmVkTXVsKHQyKS5yZWRJU3ViKGp5ZDgpO1xuICB2YXIgbnogPSBqeS5yZWRBZGQoankpLnJlZE11bChqeik7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS50cnBsID0gZnVuY3Rpb24gdHJwbCgpIHtcbiAgaWYgKCF0aGlzLmN1cnZlLnplcm9BKVxuICAgIHJldHVybiB0aGlzLmRibCgpLmFkZCh0aGlzKTtcblxuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbCN0cmlwbGluZy10cGwtMjAwNy1ibFxuICAvLyA1TSArIDEwUyArIC4uLlxuXG4gIC8vIFhYID0gWDFeMlxuICB2YXIgeHggPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIFlZID0gWTFeMlxuICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gIC8vIFpaID0gWjFeMlxuICB2YXIgenogPSB0aGlzLnoucmVkU3FyKCk7XG4gIC8vIFlZWVkgPSBZWV4yXG4gIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gIC8vIE0gPSAzICogWFggKyBhICogWloyOyBhID0gMFxuICB2YXIgbSA9IHh4LnJlZEFkZCh4eCkucmVkSUFkZCh4eCk7XG4gIC8vIE1NID0gTV4yXG4gIHZhciBtbSA9IG0ucmVkU3FyKCk7XG4gIC8vIEUgPSA2ICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKSAtIE1NXG4gIHZhciBlID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgZSA9IGUucmVkSUFkZChlKTtcbiAgZSA9IGUucmVkQWRkKGUpLnJlZElBZGQoZSk7XG4gIGUgPSBlLnJlZElTdWIobW0pO1xuICAvLyBFRSA9IEVeMlxuICB2YXIgZWUgPSBlLnJlZFNxcigpO1xuICAvLyBUID0gMTYqWVlZWVxuICB2YXIgdCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgLy8gVSA9IChNICsgRSleMiAtIE1NIC0gRUUgLSBUXG4gIHZhciB1ID0gbS5yZWRJQWRkKGUpLnJlZFNxcigpLnJlZElTdWIobW0pLnJlZElTdWIoZWUpLnJlZElTdWIodCk7XG4gIC8vIFgzID0gNCAqIChYMSAqIEVFIC0gNCAqIFlZICogVSlcbiAgdmFyIHl5dTQgPSB5eS5yZWRNdWwodSk7XG4gIHl5dTQgPSB5eXU0LnJlZElBZGQoeXl1NCk7XG4gIHl5dTQgPSB5eXU0LnJlZElBZGQoeXl1NCk7XG4gIHZhciBueCA9IHRoaXMueC5yZWRNdWwoZWUpLnJlZElTdWIoeXl1NCk7XG4gIG54ID0gbngucmVkSUFkZChueCk7XG4gIG54ID0gbngucmVkSUFkZChueCk7XG4gIC8vIFkzID0gOCAqIFkxICogKFUgKiAoVCAtIFUpIC0gRSAqIEVFKVxuICB2YXIgbnkgPSB0aGlzLnkucmVkTXVsKHUucmVkTXVsKHQucmVkSVN1Yih1KSkucmVkSVN1YihlLnJlZE11bChlZSkpKTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgLy8gWjMgPSAoWjEgKyBFKV4yIC0gWlogLSBFRVxuICB2YXIgbnogPSB0aGlzLnoucmVkQWRkKGUpLnJlZFNxcigpLnJlZElTdWIoenopLnJlZElTdWIoZWUpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGssIGtiYXNlKSB7XG4gIGsgPSBuZXcgQk4oaywga2Jhc2UpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKHApIHtcbiAgaWYgKHAudHlwZSA9PT0gJ2FmZmluZScpXG4gICAgcmV0dXJuIHRoaXMuZXEocC50b0ooKSk7XG5cbiAgaWYgKHRoaXMgPT09IHApXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgLy8geDEgKiB6Ml4yID09IHgyICogejFeMlxuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciBwejIgPSBwLnoucmVkU3FyKCk7XG4gIGlmICh0aGlzLngucmVkTXVsKHB6MikucmVkSVN1YihwLngucmVkTXVsKHoyKSkuY21wbigwKSAhPT0gMClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8geTEgKiB6Ml4zID09IHkyICogejFeM1xuICB2YXIgejMgPSB6Mi5yZWRNdWwodGhpcy56KTtcbiAgdmFyIHB6MyA9IHB6Mi5yZWRNdWwocC56KTtcbiAgcmV0dXJuIHRoaXMueS5yZWRNdWwocHozKS5yZWRJU3ViKHAueS5yZWRNdWwoejMpKS5jbXBuKDApID09PSAwO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5lcVhUb1AgPSBmdW5jdGlvbiBlcVhUb1AoeCkge1xuICB2YXIgenMgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciByeCA9IHgudG9SZWQodGhpcy5jdXJ2ZS5yZWQpLnJlZE11bCh6cyk7XG4gIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeGMgPSB4LmNsb25lKCk7XG4gIHZhciB0ID0gdGhpcy5jdXJ2ZS5yZWROLnJlZE11bCh6cyk7XG4gIGZvciAoOzspIHtcbiAgICB4Yy5pYWRkKHRoaXMuY3VydmUubik7XG4gICAgaWYgKHhjLmNtcCh0aGlzLmN1cnZlLnApID49IDApXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICByeC5yZWRJQWRkKHQpO1xuICAgIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgSlBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIEpQb2ludCB4OiAnICsgdGhpcy54LnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei50b1N0cmluZygxNiwgMikgKyAnPic7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy56LmNtcG4oMCkgPT09IDA7XG59O1xuXG59LHtcIi4uLy4uL2VsbGlwdGljXCI6MjY3LFwiLi4vY3VydmVcIjoyNzAsXCJibi5qc1wiOjQ0LFwiaW5oZXJpdHNcIjoyOTh9XSwyNzM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmVzID0gZXhwb3J0cztcblxudmFyIGhhc2ggPSBfZGVyZXFfKCdoYXNoLmpzJyk7XG52YXIgZWxsaXB0aWMgPSBfZGVyZXFfKCcuLi9lbGxpcHRpYycpO1xuXG52YXIgYXNzZXJ0ID0gZWxsaXB0aWMudXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBQcmVzZXRDdXJ2ZShvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdzaG9ydCcpXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBlbGxpcHRpYy5jdXJ2ZS5zaG9ydChvcHRpb25zKTtcbiAgZWxzZSBpZiAob3B0aW9ucy50eXBlID09PSAnZWR3YXJkcycpXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBlbGxpcHRpYy5jdXJ2ZS5lZHdhcmRzKG9wdGlvbnMpO1xuICBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdtb250JylcbiAgICB0aGlzLmN1cnZlID0gbmV3IGVsbGlwdGljLmN1cnZlLm1vbnQob3B0aW9ucyk7XG4gIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGN1cnZlIHR5cGUuJyk7XG4gIHRoaXMuZyA9IHRoaXMuY3VydmUuZztcbiAgdGhpcy5uID0gdGhpcy5jdXJ2ZS5uO1xuICB0aGlzLmhhc2ggPSBvcHRpb25zLmhhc2g7XG5cbiAgYXNzZXJ0KHRoaXMuZy52YWxpZGF0ZSgpLCAnSW52YWxpZCBjdXJ2ZScpO1xuICBhc3NlcnQodGhpcy5nLm11bCh0aGlzLm4pLmlzSW5maW5pdHkoKSwgJ0ludmFsaWQgY3VydmUsIG4qRyAhPSBPJyk7XG59XG5jdXJ2ZXMuUHJlc2V0Q3VydmUgPSBQcmVzZXRDdXJ2ZTtcblxuZnVuY3Rpb24gZGVmaW5lQ3VydmUobmFtZSwgb3B0aW9ucykge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VydmVzLCBuYW1lLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjdXJ2ZSA9IG5ldyBQcmVzZXRDdXJ2ZShvcHRpb25zKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdXJ2ZXMsIG5hbWUsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogY3VydmVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGN1cnZlO1xuICAgIH1cbiAgfSk7XG59XG5cbmRlZmluZUN1cnZlKCdwMTkyJywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogJ3AxOTInLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYnLFxuICBhOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmMnLFxuICBiOiAnNjQyMTA1MTkgZTU5YzgwZTcgMGZhN2U5YWIgNzIyNDMwNDkgZmViOGRlZWMgYzE0NmI5YjEnLFxuICBuOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgOTlkZWY4MzYgMTQ2YmM5YjEgYjRkMjI4MzEnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnMTg4ZGE4MGUgYjAzMDkwZjYgN2NiZjIwZWIgNDNhMTg4MDAgZjRmZjBhZmQgODJmZjEwMTInLFxuICAgICcwNzE5MmI5NSBmZmM4ZGE3OCA2MzEwMTFlZCA2YjI0Y2RkNSA3M2Y5NzdhMSAxZTc5NDgxMSdcbiAgXVxufSk7XG5cbmRlZmluZUN1cnZlKCdwMjI0Jywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogJ3AyMjQnLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEnLFxuICBhOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUnLFxuICBiOiAnYjQwNTBhODUgMGMwNGIzYWIgZjU0MTMyNTYgNTA0NGIwYjcgZDdiZmQ4YmEgMjcwYjM5NDMgMjM1NWZmYjQnLFxuICBuOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZjE2YTIgZTBiOGYwM2UgMTNkZDI5NDUgNWM1YzJhM2QnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnYjcwZTBjYmQgNmJiNGJmN2YgMzIxMzkwYjkgNGEwM2MxZDMgNTZjMjExMjIgMzQzMjgwZDYgMTE1YzFkMjEnLFxuICAgICdiZDM3NjM4OCBiNWY3MjNmYiA0YzIyZGZlNiBjZDQzNzVhMCA1YTA3NDc2NCA0NGQ1ODE5OSA4NTAwN2UzNCdcbiAgXVxufSk7XG5cbmRlZmluZUN1cnZlKCdwMjU2Jywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogbnVsbCxcbiAgcDogJ2ZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmJyxcbiAgYTogJ2ZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzVhYzYzNWQ4IGFhM2E5M2U3IGIzZWJiZDU1IDc2OTg4NmJjIDY1MWQwNmIwIGNjNTNiMGY2IDNiY2UzYzNlIDI3ZDI2MDRiJyxcbiAgbjogJ2ZmZmZmZmZmIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGJjZTZmYWFkIGE3MTc5ZTg0IGYzYjljYWMyIGZjNjMyNTUxJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzZiMTdkMWYyIGUxMmM0MjQ3IGY4YmNlNmU1IDYzYTQ0MGYyIDc3MDM3ZDgxIDJkZWIzM2EwIGY0YTEzOTQ1IGQ4OThjMjk2JyxcbiAgICAnNGZlMzQyZTIgZmUxYTdmOWIgOGVlN2ViNGEgN2MwZjllMTYgMmJjZTMzNTcgNmIzMTVlY2UgY2JiNjQwNjggMzdiZjUxZjUnXG4gIF1cbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDM4NCcsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZlIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmJyxcbiAgYTogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmUgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmMnLFxuICBiOiAnYjMzMTJmYTcgZTIzZWU3ZTQgOTg4ZTA1NmIgZTNmODJkMTkgMTgxZDljNmUgZmU4MTQxMTIgMDMxNDA4OGYgJyArXG4gICAgICc1MDEzODc1YSBjNjU2Mzk4ZCA4YTJlZDE5ZCAyYTg1YzhlZCBkM2VjMmFlZicsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBjNzYzNGQ4MSAnICtcbiAgICAgJ2Y0MzcyZGRmIDU4MWEwZGIyIDQ4YjBhNzdhIGVjZWMxOTZhIGNjYzUyOTczJyxcbiAgaGFzaDogaGFzaC5zaGEzODQsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJ2FhODdjYTIyIGJlOGIwNTM3IDhlYjFjNzFlIGYzMjBhZDc0IDZlMWQzYjYyIDhiYTc5Yjk4IDU5Zjc0MWUwIDgyNTQyYTM4ICcgK1xuICAgICc1NTAyZjI1ZCBiZjU1Mjk2YyAzYTU0NWUzOCA3Mjc2MGFiNycsXG4gICAgJzM2MTdkZTRhIDk2MjYyYzZmIDVkOWU5OGJmIDkyOTJkYzI5IGY4ZjQxZGJkIDI4OWExNDdjIGU5ZGEzMTEzIGI1ZjBiOGMwICcgK1xuICAgICcwYTYwYjFjZSAxZDdlODE5ZCA3YTQzMWQ3YyA5MGVhMGU1ZidcbiAgXVxufSk7XG5cbmRlZmluZUN1cnZlKCdwNTIxJywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogbnVsbCxcbiAgcDogJzAwMDAwMWZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZicsXG4gIGE6ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmMnLFxuICBiOiAnMDAwMDAwNTEgOTUzZWI5NjEgOGUxYzlhMWYgOTI5YTIxYTAgYjY4NTQwZWUgYTJkYTcyNWIgJyArXG4gICAgICc5OWIzMTVmMyBiOGI0ODk5MSA4ZWYxMDllMSA1NjE5Mzk1MSBlYzdlOTM3YiAxNjUyYzBiZCAnICtcbiAgICAgJzNiYjFiZjA3IDM1NzNkZjg4IDNkMmMzNGYxIGVmNDUxZmQ0IDZiNTAzZjAwJyxcbiAgbjogJzAwMDAwMWZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmEgNTE4Njg3ODMgYmYyZjk2NmIgN2ZjYzAxNDggJyArXG4gICAgICdmNzA5YTVkMCAzYmI1YzliOCA4OTljNDdhZSBiYjZmYjcxZSA5MTM4NjQwOScsXG4gIGhhc2g6IGhhc2guc2hhNTEyLFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICcwMDAwMDBjNiA4NThlMDZiNyAwNDA0ZTljZCA5ZTNlY2I2NiAyMzk1YjQ0MiA5YzY0ODEzOSAnICtcbiAgICAnMDUzZmI1MjEgZjgyOGFmNjAgNmI0ZDNkYmEgYTE0YjVlNzcgZWZlNzU5MjggZmUxZGMxMjcgJyArXG4gICAgJ2EyZmZhOGRlIDMzNDhiM2MxIDg1NmE0MjliIGY5N2U3ZTMxIGMyZTViZDY2JyxcbiAgICAnMDAwMDAxMTggMzkyOTZhNzggOWEzYmMwMDQgNWM4YTVmYjQgMmM3ZDFiZDkgOThmNTQ0NDkgJyArXG4gICAgJzU3OWI0NDY4IDE3YWZiZDE3IDI3M2U2NjJjIDk3ZWU3Mjk5IDVlZjQyNjQwIGM1NTBiOTAxICcgK1xuICAgICczZmFkMDc2MSAzNTNjNzA4NiBhMjcyYzI0MCA4OGJlOTQ3NiA5ZmQxNjY1MCdcbiAgXVxufSk7XG5cbi8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NzQ4I3NlY3Rpb24tNC4xXG5kZWZpbmVDdXJ2ZSgnY3VydmUyNTUxOScsIHtcbiAgdHlwZTogJ21vbnQnLFxuICBwcmltZTogJ3AyNTUxOScsXG4gIHA6ICc3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkJyxcbiAgYTogJzc2ZDA2JyxcbiAgYjogJzEnLFxuICBuOiAnMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDE0ZGVmOWRlYTJmNzljZDYgNTgxMjYzMWE1Y2Y1ZDNlZCcsXG4gIGNvZmFjdG9yOiAnOCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc5J1xuICBdXG59KTtcblxuZGVmaW5lQ3VydmUoJ2VkMjU1MTknLCB7XG4gIHR5cGU6ICdlZHdhcmRzJyxcbiAgcHJpbWU6ICdwMjU1MTknLFxuICBwOiAnN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCcsXG4gIGE6ICctMScsXG4gIGM6ICcxJyxcbiAgLy8gLTEyMTY2NSAqICgxMjE2NjZeKC0xKSkgKG1vZCBQKVxuICBkOiAnNTIwMzZjZWUyYjZmZmU3MyA4Y2M3NDA3OTc3NzllODk4IDAwNzAwYTRkNDE0MWQ4YWIgNzVlYjRkY2ExMzU5NzhhMycsXG4gIG46ICcxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkJyxcbiAgY29mYWN0b3I6ICc4JyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzIxNjkzNmQzY2Q2ZTUzZmVjMGE0ZTIzMWZkZDZkYzVjNjkyY2M3NjA5NTI1YTdiMmM5NTYyZDYwOGYyNWQ1MWEnLFxuICAgIC8vIDQvNVxuICAgICc2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjU4J1xuICBdXG59KTtcblxuLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU2Mzkjc2VjdGlvbi0zLjRcbmRlZmluZUN1cnZlKCdicmFpbnBvb2xQMjU2cjEnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiBudWxsLFxuICBwOiAnQTlGQjU3REIgQTFFRUE5QkMgM0U2NjBBOTAgOUQ4MzhENzIgNkUzQkY2MjMgRDUyNjIwMjggMjAxMzQ4MUQgMUY2RTUzNzcnLFxuICBhOiAnN0Q1QTA5NzUgRkMyQzMwNTcgRUVGNjc1MzAgNDE3QUZGRTcgRkI4MDU1QzEgMjZEQzVDNkMgRTk0QTRCNDQgRjMzMEI1RDknLFxuICBiOiAnMjZEQzVDNkMgRTk0QTRCNDQgRjMzMEI1RDkgQkJENzdDQkYgOTU4NDE2MjkgNUNGN0UxQ0UgNkJDQ0RDMTggRkY4QzA3QjYnLFxuICBuOiAnQTlGQjU3REIgQTFFRUE5QkMgM0U2NjBBOTAgOUQ4MzhENzEgOEMzOTdBQTMgQjU2MUE2RjcgOTAxRTBFODIgOTc0ODU2QTcnLFxuICBoYXNoOiBoYXNoLnNoYTI1NiwgLy8gb3IgMzg0LCBvciA1MTJcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnOEJEMkFFQjlDQjdFNTdDQjJDNEI0ODJGRkM4MUI3QUZCOURFMjdFMUUzQkQyM0MyM0E0NDUzQkQ5QUNFMzI2MicsXG4gICAgJzU0N0VGODM1QzNEQUM0RkQ5N0Y4NDYxQTE0NjExREM5QzI3NzQ1MTMyREVEOEU1NDVDMUQ1NEM3MkYwNDY5OTcnXG4gIF1cbn0pO1xuXG4vLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTYzOSNzZWN0aW9uLTMuNlxuZGVmaW5lQ3VydmUoJ2JyYWlucG9vbFAzODRyMScsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICc4Q0I5MUU4MiBBMzM4NkQyOCAwRjVENkY3RSA1MEU2NDFERiAxNTJGNzEwOSBFRDU0NTZCNCAxMkIxREExOSA3RkI3MTEyMycgK1xuICAgICdBQ0QzQTcyOSA5MDFEMUE3MSA4NzQ3MDAxMyAzMTA3RUM1MycsXG4gIGE6ICc3QkMzODJDNiAzRDhDMTUwQyAzQzcyMDgwQSBDRTA1QUZBMCBDMkJFQTI4RSA0RkIyMjc4NyAxMzkxNjVFRiBCQTkxRjkwRicgK1xuICAgICc4QUE1ODE0QSA1MDNBRDRFQiAwNEE4QzdERCAyMkNFMjgyNicsXG4gIGI6ICcwNEE4QzdERCAyMkNFMjgyNiA4QjM5QjU1NCAxNkYwNDQ3QyAyRkI3N0RFMSAwN0RDRDJBNiAyRTg4MEVBNSAzRUVCNjJENScgK1xuICAgICc3Q0I0MzkwMiA5NURCQzk5NCAzQUI3ODY5NiBGQTUwNEMxMScsXG4gIG46ICc4Q0I5MUU4MiBBMzM4NkQyOCAwRjVENkY3RSA1MEU2NDFERiAxNTJGNzEwOSBFRDU0NTZCMyAxRjE2NkU2QyBBQzA0MjVBNycgK1xuICAgICdDRjNBQjZBRiA2QjdGQzMxMCAzQjg4MzIwMiBFOTA0NjU2NScsXG4gIGhhc2g6IGhhc2guc2hhMzg0LCAvLyBvciA1MTJcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnMUQxQzY0RjA2OENGNDVGRkEyQTYzQTgxQjdDMTNGNkI4ODQ3QTNFNzdFRjE0RkUzREI3RkNBRkUwQ0JEMTAnICtcbiAgICAgICdFOEU4MjZFMDM0MzZENjQ2QUFFRjg3QjJFMjQ3RDRBRjFFJyxcbiAgICAnOEFCRTFENzUyMEY5QzJBNDVDQjFFQjhFOTVDRkQ1NTI2MkI3MEIyOUZFRUM1ODY0RTE5QzA1NEZGOTkxMjknICtcbiAgICAgICcyODBFNDY0NjIxNzc5MTgxMTE0MjgyMDM0MTI2M0M1MzE1J1xuICBdXG59KTtcblxuLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU2Mzkjc2VjdGlvbi0zLjdcbmRlZmluZUN1cnZlKCdicmFpbnBvb2xQNTEycjEnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiBudWxsLFxuICBwOiAnQUFERDlEQjggREJFOUM0OEIgM0ZENEU2QUUgMzNDOUZDMDcgQ0IzMDhEQjMgQjNDOUQyMEUgRDY2MzlDQ0EgNzAzMzA4NzEnICtcbiAgICAnN0Q0RDlCMDAgOUJDNjY4NDIgQUVDREExMkEgRTZBMzgwRTYgMjg4MUZGMkYgMkQ4MkM2ODUgMjhBQTYwNTYgNTgzQTQ4RjMnLFxuICBhOiAnNzgzMEEzMzEgOEI2MDNCODkgRTIzMjcxNDUgQUMyMzRDQzUgOTRDQkREOEQgM0RGOTE2MTAgQTgzNDQxQ0EgRUE5ODYzQkMnICtcbiAgICAnMkRFRDVENUEgQTgyNTNBQTEgMEEyRUYxQzkgOEI5QUM4QjUgN0YxMTE3QTcgMkJGMkM3QjkgRTdDMUFDNEQgNzdGQzk0Q0EnLFxuICBiOiAnM0RGOTE2MTAgQTgzNDQxQ0EgRUE5ODYzQkMgMkRFRDVENUEgQTgyNTNBQTEgMEEyRUYxQzkgOEI5QUM4QjUgN0YxMTE3QTcnICtcbiAgICAnMkJGMkM3QjkgRTdDMUFDNEQgNzdGQzk0Q0EgREMwODNFNjcgOTg0MDUwQjcgNUVCQUU1REQgMjgwOUJENjMgODAxNkY3MjMnLFxuICBuOiAnQUFERDlEQjggREJFOUM0OEIgM0ZENEU2QUUgMzNDOUZDMDcgQ0IzMDhEQjMgQjNDOUQyMEUgRDY2MzlDQ0EgNzAzMzA4NzAnICtcbiAgICAnNTUzRTVDNDEgNENBOTI2MTkgNDE4NjYxMTkgN0ZBQzEwNDcgMURCMUQzODEgMDg1RERBREQgQjU4Nzk2ODIgOUNBOTAwNjknLFxuICBoYXNoOiBoYXNoLnNoYTUxMixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnODFBRUU0QkREODJFRDk2NDVBMjEzMjJFOUM0QzZBOTM4NUVEOUY3MEI1RDkxNkMxQjQzQjYyRUVGNEQwMDknICtcbiAgICAgICc4RUZGM0IxRjc4RTJEMEQ0OEQ1MEQxNjg3QjkzQjk3RDVGN0M2RDUwNDc0MDZBNUU2ODhCMzUyMjA5QkNCOUY4MjInLFxuICAgICc3RERFMzg1RDU2NjMzMkVDQzBFQUJGQTlDRjc4MjJGREYyMDlGNzAwMjRBNTdCMUFBMDAwQzU1Qjg4MUY4MScgK1xuICAgICAgJzExQjJEQ0RFNDk0QTVGNDg1RTVCQ0E0QkQ4OEEyNzYzQUVEMUNBMkIyRkE4RjA1NDA2NzhDRDFFMEYzQUQ4MDg5MidcbiAgXVxufSk7XG5cbi8vIGh0dHBzOi8vZW4uYml0Y29pbi5pdC93aWtpL1NlY3AyNTZrMVxudmFyIHByZTtcbnRyeSB7XG4gIHByZSA9IF9kZXJlcV8oJy4vcHJlY29tcHV0ZWQvc2VjcDI1NmsxJyk7XG59IGNhdGNoIChlKSB7XG4gIHByZSA9IHVuZGVmaW5lZDtcbn1cblxuZGVmaW5lQ3VydmUoJ3NlY3AyNTZrMScsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdrMjU2JyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmJyxcbiAgYTogJzAnLFxuICBiOiAnNycsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBiYWFlZGNlNiBhZjQ4YTAzYiBiZmQyNWU4YyBkMDM2NDE0MScsXG4gIGg6ICcxJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG5cbiAgLy8gUHJlY29tcHV0ZWQgZW5kb21vcnBoaXNtXG4gIGJldGE6ICc3YWU5NmEyYjY1N2MwNzEwNmU2NDQ3OWVhYzM0MzRlOTljZjA0OTc1MTJmNTg5OTVjMTM5NmMyODcxOTUwMWVlJyxcbiAgbGFtYmRhOiAnNTM2M2FkNGNjMDVjMzBlMGE1MjYxYzAyODgxMjY0NWExMjJlMjJlYTIwODE2Njc4ZGYwMjk2N2MxYjIzYmQ3MicsXG4gIGJhc2lzOiBbXG4gICAge1xuICAgICAgYTogJzMwODZkMjIxYTdkNDZiY2RlODZjOTBlNDkyODRlYjE1JyxcbiAgICAgIGI6ICctZTQ0MzdlZDYwMTBlODgyODZmNTQ3ZmE5MGFiZmU0YzMnXG4gICAgfSxcbiAgICB7XG4gICAgICBhOiAnMTE0Y2E1MGY3YThlMmYzZjY1N2MxMTA4ZDlkNDRjZmQ4JyxcbiAgICAgIGI6ICczMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNSdcbiAgICB9XG4gIF0sXG5cbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnNzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OCcsXG4gICAgJzQ4M2FkYTc3MjZhM2M0NjU1ZGE0ZmJmYzBlMTEwOGE4ZmQxN2I0NDhhNjg1NTQxOTljNDdkMDhmZmIxMGQ0YjgnLFxuICAgIHByZVxuICBdXG59KTtcblxufSx7XCIuLi9lbGxpcHRpY1wiOjI2NyxcIi4vcHJlY29tcHV0ZWQvc2VjcDI1NmsxXCI6MjgwLFwiaGFzaC5qc1wiOjI4NH1dLDI3NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IF9kZXJlcV8oJ2JuLmpzJyk7XG52YXIgSG1hY0RSQkcgPSBfZGVyZXFfKCdobWFjLWRyYmcnKTtcbnZhciBlbGxpcHRpYyA9IF9kZXJlcV8oJy4uLy4uL2VsbGlwdGljJyk7XG52YXIgdXRpbHMgPSBlbGxpcHRpYy51dGlscztcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbnZhciBLZXlQYWlyID0gX2RlcmVxXygnLi9rZXknKTtcbnZhciBTaWduYXR1cmUgPSBfZGVyZXFfKCcuL3NpZ25hdHVyZScpO1xuXG5mdW5jdGlvbiBFQyhvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBFQykpXG4gICAgcmV0dXJuIG5ldyBFQyhvcHRpb25zKTtcblxuICAvLyBTaG9ydGN1dCBgZWxsaXB0aWMuZWMoY3VydmUtbmFtZSlgXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICBhc3NlcnQoZWxsaXB0aWMuY3VydmVzLmhhc093blByb3BlcnR5KG9wdGlvbnMpLCAnVW5rbm93biBjdXJ2ZSAnICsgb3B0aW9ucyk7XG5cbiAgICBvcHRpb25zID0gZWxsaXB0aWMuY3VydmVzW29wdGlvbnNdO1xuICB9XG5cbiAgLy8gU2hvcnRjdXQgZm9yIGBlbGxpcHRpYy5lYyhlbGxpcHRpYy5jdXJ2ZXMuY3VydmVOYW1lKWBcbiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBlbGxpcHRpYy5jdXJ2ZXMuUHJlc2V0Q3VydmUpXG4gICAgb3B0aW9ucyA9IHsgY3VydmU6IG9wdGlvbnMgfTtcblxuICB0aGlzLmN1cnZlID0gb3B0aW9ucy5jdXJ2ZS5jdXJ2ZTtcbiAgdGhpcy5uID0gdGhpcy5jdXJ2ZS5uO1xuICB0aGlzLm5oID0gdGhpcy5uLnVzaHJuKDEpO1xuICB0aGlzLmcgPSB0aGlzLmN1cnZlLmc7XG5cbiAgLy8gUG9pbnQgb24gY3VydmVcbiAgdGhpcy5nID0gb3B0aW9ucy5jdXJ2ZS5nO1xuICB0aGlzLmcucHJlY29tcHV0ZShvcHRpb25zLmN1cnZlLm4uYml0TGVuZ3RoKCkgKyAxKTtcblxuICAvLyBIYXNoIGZ1bmN0aW9uIGZvciBEUkJHXG4gIHRoaXMuaGFzaCA9IG9wdGlvbnMuaGFzaCB8fCBvcHRpb25zLmN1cnZlLmhhc2g7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEVDO1xuXG5FQy5wcm90b3R5cGUua2V5UGFpciA9IGZ1bmN0aW9uIGtleVBhaXIob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEtleVBhaXIodGhpcywgb3B0aW9ucyk7XG59O1xuXG5FQy5wcm90b3R5cGUua2V5RnJvbVByaXZhdGUgPSBmdW5jdGlvbiBrZXlGcm9tUHJpdmF0ZShwcml2LCBlbmMpIHtcbiAgcmV0dXJuIEtleVBhaXIuZnJvbVByaXZhdGUodGhpcywgcHJpdiwgZW5jKTtcbn07XG5cbkVDLnByb3RvdHlwZS5rZXlGcm9tUHVibGljID0gZnVuY3Rpb24ga2V5RnJvbVB1YmxpYyhwdWIsIGVuYykge1xuICByZXR1cm4gS2V5UGFpci5mcm9tUHVibGljKHRoaXMsIHB1YiwgZW5jKTtcbn07XG5cbkVDLnByb3RvdHlwZS5nZW5LZXlQYWlyID0gZnVuY3Rpb24gZ2VuS2V5UGFpcihvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucylcbiAgICBvcHRpb25zID0ge307XG5cbiAgLy8gSW5zdGFudGlhdGUgSG1hY19EUkJHXG4gIHZhciBkcmJnID0gbmV3IEhtYWNEUkJHKHtcbiAgICBoYXNoOiB0aGlzLmhhc2gsXG4gICAgcGVyczogb3B0aW9ucy5wZXJzLFxuICAgIHBlcnNFbmM6IG9wdGlvbnMucGVyc0VuYyB8fCAndXRmOCcsXG4gICAgZW50cm9weTogb3B0aW9ucy5lbnRyb3B5IHx8IGVsbGlwdGljLnJhbmQodGhpcy5oYXNoLmhtYWNTdHJlbmd0aCksXG4gICAgZW50cm9weUVuYzogb3B0aW9ucy5lbnRyb3B5ICYmIG9wdGlvbnMuZW50cm9weUVuYyB8fCAndXRmOCcsXG4gICAgbm9uY2U6IHRoaXMubi50b0FycmF5KClcbiAgfSk7XG5cbiAgLy8gS2V5IGdlbmVyYXRpb24gZm9yIGN1cnZlMjU1MTkgaXMgc2ltcGxlclxuICBpZiAodGhpcy5jdXJ2ZS50eXBlID09PSAnbW9udCcpIHtcbiAgICB2YXIgcHJpdiA9IG5ldyBCTihkcmJnLmdlbmVyYXRlKDMyKSk7XG4gICAgcmV0dXJuIHRoaXMua2V5RnJvbVByaXZhdGUocHJpdik7XG4gIH1cblxuICB2YXIgYnl0ZXMgPSB0aGlzLm4uYnl0ZUxlbmd0aCgpO1xuICB2YXIgbnMyID0gdGhpcy5uLnN1YihuZXcgQk4oMikpO1xuICBkbyB7XG4gICAgdmFyIHByaXYgPSBuZXcgQk4oZHJiZy5nZW5lcmF0ZShieXRlcykpO1xuICAgIGlmIChwcml2LmNtcChuczIpID4gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgcHJpdi5pYWRkbigxKTtcbiAgICByZXR1cm4gdGhpcy5rZXlGcm9tUHJpdmF0ZShwcml2KTtcbiAgfSB3aGlsZSAodHJ1ZSk7XG59O1xuXG5FQy5wcm90b3R5cGUuX3RydW5jYXRlVG9OID0gZnVuY3Rpb24gdHJ1bmNhdGVUb04obXNnLCB0cnVuY09ubHkpIHtcbiAgdmFyIGRlbHRhID0gbXNnLmJ5dGVMZW5ndGgoKSAqIDggLSB0aGlzLm4uYml0TGVuZ3RoKCk7XG4gIGlmIChkZWx0YSA+IDApXG4gICAgbXNnID0gbXNnLnVzaHJuKGRlbHRhKTtcbiAgaWYgKCF0cnVuY09ubHkgJiYgbXNnLmNtcCh0aGlzLm4pID49IDApXG4gICAgcmV0dXJuIG1zZy5zdWIodGhpcy5uKTtcbiAgZWxzZVxuICAgIHJldHVybiBtc2c7XG59O1xuXG5FQy5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obXNnLCBrZXksIGVuYywgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGVuYyA9PT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zID0gZW5jO1xuICAgIGVuYyA9IG51bGw7XG4gIH1cbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICBrZXkgPSB0aGlzLmtleUZyb21Qcml2YXRlKGtleSwgZW5jKTtcbiAgbXNnID0gdGhpcy5fdHJ1bmNhdGVUb04obmV3IEJOKG1zZywgMTYpKTtcblxuICAvLyBaZXJvLWV4dGVuZCBrZXkgdG8gcHJvdmlkZSBlbm91Z2ggZW50cm9weVxuICB2YXIgYnl0ZXMgPSB0aGlzLm4uYnl0ZUxlbmd0aCgpO1xuICB2YXIgYmtleSA9IGtleS5nZXRQcml2YXRlKCkudG9BcnJheSgnYmUnLCBieXRlcyk7XG5cbiAgLy8gWmVyby1leHRlbmQgbm9uY2UgdG8gaGF2ZSB0aGUgc2FtZSBieXRlIHNpemUgYXMgTlxuICB2YXIgbm9uY2UgPSBtc2cudG9BcnJheSgnYmUnLCBieXRlcyk7XG5cbiAgLy8gSW5zdGFudGlhdGUgSG1hY19EUkJHXG4gIHZhciBkcmJnID0gbmV3IEhtYWNEUkJHKHtcbiAgICBoYXNoOiB0aGlzLmhhc2gsXG4gICAgZW50cm9weTogYmtleSxcbiAgICBub25jZTogbm9uY2UsXG4gICAgcGVyczogb3B0aW9ucy5wZXJzLFxuICAgIHBlcnNFbmM6IG9wdGlvbnMucGVyc0VuYyB8fCAndXRmOCdcbiAgfSk7XG5cbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRvIGdlbmVyYXRlXG4gIHZhciBuczEgPSB0aGlzLm4uc3ViKG5ldyBCTigxKSk7XG5cbiAgZm9yICh2YXIgaXRlciA9IDA7IHRydWU7IGl0ZXIrKykge1xuICAgIHZhciBrID0gb3B0aW9ucy5rID9cbiAgICAgICAgb3B0aW9ucy5rKGl0ZXIpIDpcbiAgICAgICAgbmV3IEJOKGRyYmcuZ2VuZXJhdGUodGhpcy5uLmJ5dGVMZW5ndGgoKSkpO1xuICAgIGsgPSB0aGlzLl90cnVuY2F0ZVRvTihrLCB0cnVlKTtcbiAgICBpZiAoay5jbXBuKDEpIDw9IDAgfHwgay5jbXAobnMxKSA+PSAwKVxuICAgICAgY29udGludWU7XG5cbiAgICB2YXIga3AgPSB0aGlzLmcubXVsKGspO1xuICAgIGlmIChrcC5pc0luZmluaXR5KCkpXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBrcFggPSBrcC5nZXRYKCk7XG4gICAgdmFyIHIgPSBrcFgudW1vZCh0aGlzLm4pO1xuICAgIGlmIChyLmNtcG4oMCkgPT09IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBzID0gay5pbnZtKHRoaXMubikubXVsKHIubXVsKGtleS5nZXRQcml2YXRlKCkpLmlhZGQobXNnKSk7XG4gICAgcyA9IHMudW1vZCh0aGlzLm4pO1xuICAgIGlmIChzLmNtcG4oMCkgPT09IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciByZWNvdmVyeVBhcmFtID0gKGtwLmdldFkoKS5pc09kZCgpID8gMSA6IDApIHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChrcFguY21wKHIpICE9PSAwID8gMiA6IDApO1xuXG4gICAgLy8gVXNlIGNvbXBsZW1lbnQgb2YgYHNgLCBpZiBpdCBpcyA+IGBuIC8gMmBcbiAgICBpZiAob3B0aW9ucy5jYW5vbmljYWwgJiYgcy5jbXAodGhpcy5uaCkgPiAwKSB7XG4gICAgICBzID0gdGhpcy5uLnN1YihzKTtcbiAgICAgIHJlY292ZXJ5UGFyYW0gXj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFNpZ25hdHVyZSh7IHI6IHIsIHM6IHMsIHJlY292ZXJ5UGFyYW06IHJlY292ZXJ5UGFyYW0gfSk7XG4gIH1cbn07XG5cbkVDLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobXNnLCBzaWduYXR1cmUsIGtleSwgZW5jKSB7XG4gIG1zZyA9IHRoaXMuX3RydW5jYXRlVG9OKG5ldyBCTihtc2csIDE2KSk7XG4gIGtleSA9IHRoaXMua2V5RnJvbVB1YmxpYyhrZXksIGVuYyk7XG4gIHNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoc2lnbmF0dXJlLCAnaGV4Jyk7XG5cbiAgLy8gUGVyZm9ybSBwcmltaXRpdmUgdmFsdWVzIHZhbGlkYXRpb25cbiAgdmFyIHIgPSBzaWduYXR1cmUucjtcbiAgdmFyIHMgPSBzaWduYXR1cmUucztcbiAgaWYgKHIuY21wbigxKSA8IDAgfHwgci5jbXAodGhpcy5uKSA+PSAwKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKHMuY21wbigxKSA8IDAgfHwgcy5jbXAodGhpcy5uKSA+PSAwKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBWYWxpZGF0ZSBzaWduYXR1cmVcbiAgdmFyIHNpbnYgPSBzLmludm0odGhpcy5uKTtcbiAgdmFyIHUxID0gc2ludi5tdWwobXNnKS51bW9kKHRoaXMubik7XG4gIHZhciB1MiA9IHNpbnYubXVsKHIpLnVtb2QodGhpcy5uKTtcblxuICBpZiAoIXRoaXMuY3VydmUuX21heHdlbGxUcmljaykge1xuICAgIHZhciBwID0gdGhpcy5nLm11bEFkZCh1MSwga2V5LmdldFB1YmxpYygpLCB1Mik7XG4gICAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIHAuZ2V0WCgpLnVtb2QodGhpcy5uKS5jbXAocikgPT09IDA7XG4gIH1cblxuICAvLyBOT1RFOiBHcmVnIE1heHdlbGwncyB0cmljaywgaW5zcGlyZWQgYnk6XG4gIC8vIGh0dHBzOi8vZ2l0LmlvL3ZhZDNLXG5cbiAgdmFyIHAgPSB0aGlzLmcuam11bEFkZCh1MSwga2V5LmdldFB1YmxpYygpLCB1Mik7XG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gQ29tcGFyZSBgcC54YCBvZiBKYWNvYmlhbiBwb2ludCB3aXRoIGByYCxcbiAgLy8gdGhpcyB3aWxsIGRvIGBwLnggPT0gciAqIHAuel4yYCBpbnN0ZWFkIG9mIG11bHRpcGx5aW5nIGBwLnhgIGJ5IHRoZVxuICAvLyBpbnZlcnNlIG9mIGBwLnpeMmBcbiAgcmV0dXJuIHAuZXFYVG9QKHIpO1xufTtcblxuRUMucHJvdG90eXBlLnJlY292ZXJQdWJLZXkgPSBmdW5jdGlvbihtc2csIHNpZ25hdHVyZSwgaiwgZW5jKSB7XG4gIGFzc2VydCgoMyAmIGopID09PSBqLCAnVGhlIHJlY292ZXJ5IHBhcmFtIGlzIG1vcmUgdGhhbiB0d28gYml0cycpO1xuICBzaWduYXR1cmUgPSBuZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwgZW5jKTtcblxuICB2YXIgbiA9IHRoaXMubjtcbiAgdmFyIGUgPSBuZXcgQk4obXNnKTtcbiAgdmFyIHIgPSBzaWduYXR1cmUucjtcbiAgdmFyIHMgPSBzaWduYXR1cmUucztcblxuICAvLyBBIHNldCBMU0Igc2lnbmlmaWVzIHRoYXQgdGhlIHktY29vcmRpbmF0ZSBpcyBvZGRcbiAgdmFyIGlzWU9kZCA9IGogJiAxO1xuICB2YXIgaXNTZWNvbmRLZXkgPSBqID4+IDE7XG4gIGlmIChyLmNtcCh0aGlzLmN1cnZlLnAudW1vZCh0aGlzLmN1cnZlLm4pKSA+PSAwICYmIGlzU2Vjb25kS2V5KVxuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgc2VuY29uZCBrZXkgY2FuZGluYXRlJyk7XG5cbiAgLy8gMS4xLiBMZXQgeCA9IHIgKyBqbi5cbiAgaWYgKGlzU2Vjb25kS2V5KVxuICAgIHIgPSB0aGlzLmN1cnZlLnBvaW50RnJvbVgoci5hZGQodGhpcy5jdXJ2ZS5uKSwgaXNZT2RkKTtcbiAgZWxzZVxuICAgIHIgPSB0aGlzLmN1cnZlLnBvaW50RnJvbVgociwgaXNZT2RkKTtcblxuICB2YXIgckludiA9IHNpZ25hdHVyZS5yLmludm0obik7XG4gIHZhciBzMSA9IG4uc3ViKGUpLm11bChySW52KS51bW9kKG4pO1xuICB2YXIgczIgPSBzLm11bChySW52KS51bW9kKG4pO1xuXG4gIC8vIDEuNi4xIENvbXB1dGUgUSA9IHJeLTEgKHNSIC0gIGVHKVxuICAvLyAgICAgICAgICAgICAgIFEgPSByXi0xIChzUiArIC1lRylcbiAgcmV0dXJuIHRoaXMuZy5tdWxBZGQoczEsIHIsIHMyKTtcbn07XG5cbkVDLnByb3RvdHlwZS5nZXRLZXlSZWNvdmVyeVBhcmFtID0gZnVuY3Rpb24oZSwgc2lnbmF0dXJlLCBRLCBlbmMpIHtcbiAgc2lnbmF0dXJlID0gbmV3IFNpZ25hdHVyZShzaWduYXR1cmUsIGVuYyk7XG4gIGlmIChzaWduYXR1cmUucmVjb3ZlcnlQYXJhbSAhPT0gbnVsbClcbiAgICByZXR1cm4gc2lnbmF0dXJlLnJlY292ZXJ5UGFyYW07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICB2YXIgUXByaW1lO1xuICAgIHRyeSB7XG4gICAgICBRcHJpbWUgPSB0aGlzLnJlY292ZXJQdWJLZXkoZSwgc2lnbmF0dXJlLCBpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoUXByaW1lLmVxKFEpKVxuICAgICAgcmV0dXJuIGk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCB2YWxpZCByZWNvdmVyeSBmYWN0b3InKTtcbn07XG5cbn0se1wiLi4vLi4vZWxsaXB0aWNcIjoyNjcsXCIuL2tleVwiOjI3NSxcIi4vc2lnbmF0dXJlXCI6Mjc2LFwiYm4uanNcIjo0NCxcImhtYWMtZHJiZ1wiOjI5Nn1dLDI3NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IF9kZXJlcV8oJ2JuLmpzJyk7XG52YXIgZWxsaXB0aWMgPSBfZGVyZXFfKCcuLi8uLi9lbGxpcHRpYycpO1xudmFyIHV0aWxzID0gZWxsaXB0aWMudXRpbHM7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBLZXlQYWlyKGVjLCBvcHRpb25zKSB7XG4gIHRoaXMuZWMgPSBlYztcbiAgdGhpcy5wcml2ID0gbnVsbDtcbiAgdGhpcy5wdWIgPSBudWxsO1xuXG4gIC8vIEtleVBhaXIoZWMsIHsgcHJpdjogLi4uLCBwdWI6IC4uLiB9KVxuICBpZiAob3B0aW9ucy5wcml2KVxuICAgIHRoaXMuX2ltcG9ydFByaXZhdGUob3B0aW9ucy5wcml2LCBvcHRpb25zLnByaXZFbmMpO1xuICBpZiAob3B0aW9ucy5wdWIpXG4gICAgdGhpcy5faW1wb3J0UHVibGljKG9wdGlvbnMucHViLCBvcHRpb25zLnB1YkVuYyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEtleVBhaXI7XG5cbktleVBhaXIuZnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGZyb21QdWJsaWMoZWMsIHB1YiwgZW5jKSB7XG4gIGlmIChwdWIgaW5zdGFuY2VvZiBLZXlQYWlyKVxuICAgIHJldHVybiBwdWI7XG5cbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVjLCB7XG4gICAgcHViOiBwdWIsXG4gICAgcHViRW5jOiBlbmNcbiAgfSk7XG59O1xuXG5LZXlQYWlyLmZyb21Qcml2YXRlID0gZnVuY3Rpb24gZnJvbVByaXZhdGUoZWMsIHByaXYsIGVuYykge1xuICBpZiAocHJpdiBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHByaXY7XG5cbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVjLCB7XG4gICAgcHJpdjogcHJpdixcbiAgICBwcml2RW5jOiBlbmNcbiAgfSk7XG59O1xuXG4vLyBUT0RPOiBzaG91bGQgbm90IHZhbGlkYXRlIGZvciBYMjU1MTlcbktleVBhaXIucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gIHZhciBwdWIgPSB0aGlzLmdldFB1YmxpYygpO1xuXG4gIGlmIChwdWIuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIHJlYXNvbjogJ0ludmFsaWQgcHVibGljIGtleScgfTtcbiAgaWYgKCFwdWIudmFsaWRhdGUoKSlcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCByZWFzb246ICdQdWJsaWMga2V5IGlzIG5vdCBhIHBvaW50JyB9O1xuICBpZiAoIXB1Yi5tdWwodGhpcy5lYy5jdXJ2ZS5uKS5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAnUHVibGljIGtleSAqIE4gIT0gTycgfTtcblxuICByZXR1cm4geyByZXN1bHQ6IHRydWUsIHJlYXNvbjogbnVsbCB9O1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuZ2V0UHVibGljID0gZnVuY3Rpb24gZ2V0UHVibGljKGVuYywgY29tcGFjdCkge1xuICBpZiAoIXRoaXMucHViKVxuICAgIHRoaXMucHViID0gdGhpcy5lYy5nLm11bCh0aGlzLnByaXYpO1xuXG4gIGlmICghZW5jKVxuICAgIHJldHVybiB0aGlzLnB1YjtcblxuICByZXR1cm4gdGhpcy5wdWIuZW5jb2RlKGVuYywgY29tcGFjdCk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRQcml2YXRlID0gZnVuY3Rpb24gZ2V0UHJpdmF0ZShlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHRoaXMucHJpdi50b1N0cmluZygxNiwgMik7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5wcml2O1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuX2ltcG9ydFByaXZhdGUgPSBmdW5jdGlvbiBfaW1wb3J0UHJpdmF0ZShrZXksIGVuYykge1xuICB0aGlzLnByaXYgPSBuZXcgQk4oa2V5LCBlbmMgfHwgMTYpO1xuXG4gIC8vIEZvciBDdXJ2ZTI1NTE5L0N1cnZlNDQ4IHdlIGhhdmUgYSBzcGVjaWZpYyBwcm9jZWR1cmUuXG4gIC8vIFRPRE8gQ3VydmU0NDhcbiAgaWYgKHRoaXMuZWMuY3VydmUudHlwZSA9PT0gJ21vbnQnKSB7XG4gICAgdmFyIG9uZSA9IHRoaXMuZWMuY3VydmUub25lO1xuICAgIHZhciBtYXNrID0gb25lLnVzaGxuKDI1NSAtIDMpLnN1YihvbmUpLnVzaGxuKDMpO1xuICAgIHRoaXMucHJpdiA9IHRoaXMucHJpdi5vcihvbmUudXNobG4oMjU1IC0gMSkpO1xuICAgIHRoaXMucHJpdiA9IHRoaXMucHJpdi5hbmQobWFzayk7XG4gIH0gZWxzZVxuICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBwcml2IHdvbid0IGJlIGJpZ2dlciB0aGFuIG4sIG90aGVyd2lzZSB3ZSBtYXkgZmFpbFxuICAgIC8vIGluIGZpeGVkIG11bHRpcGxpY2F0aW9uIG1ldGhvZFxuICAgIHRoaXMucHJpdiA9IHRoaXMucHJpdi51bW9kKHRoaXMuZWMuY3VydmUubik7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5faW1wb3J0UHVibGljID0gZnVuY3Rpb24gX2ltcG9ydFB1YmxpYyhrZXksIGVuYykge1xuICBpZiAoa2V5LnggfHwga2V5LnkpIHtcbiAgICAvLyBNb250Z29tZXJ5IHBvaW50cyBvbmx5IGhhdmUgYW4gYHhgIGNvb3JkaW5hdGUuXG4gICAgLy8gV2VpZXJzdHJhc3MvRWR3YXJkcyBwb2ludHMgb24gdGhlIG90aGVyIGhhbmQgaGF2ZSBib3RoIGB4YCBhbmRcbiAgICAvLyBgeWAgY29vcmRpbmF0ZXMuXG4gICAgaWYgKHRoaXMuZWMuY3VydmUudHlwZSA9PT0gJ21vbnQnKSB7XG4gICAgICBhc3NlcnQoa2V5LngsICdOZWVkIHggY29vcmRpbmF0ZScpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5lYy5jdXJ2ZS50eXBlID09PSAnc2hvcnQnIHx8XG4gICAgICAgICAgICAgICB0aGlzLmVjLmN1cnZlLnR5cGUgPT09ICdlZHdhcmRzJykge1xuICAgICAgYXNzZXJ0KGtleS54ICYmIGtleS55LCAnTmVlZCBib3RoIHggYW5kIHkgY29vcmRpbmF0ZScpO1xuICAgIH1cbiAgICB0aGlzLnB1YiA9IHRoaXMuZWMuY3VydmUucG9pbnQoa2V5LngsIGtleS55KTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5wdWIgPSB0aGlzLmVjLmN1cnZlLmRlY29kZVBvaW50KGtleSwgZW5jKTtcbn07XG5cbi8vIEVDREhcbktleVBhaXIucHJvdG90eXBlLmRlcml2ZSA9IGZ1bmN0aW9uIGRlcml2ZShwdWIpIHtcbiAgdmFyIHggPSBwdWIubXVsKHRoaXMucHJpdikuZ2V0WCgpO1xuICB2YXIgbGVuID0geC5ieXRlTGVuZ3RoKCk7XG5cbiAgLy8gTm90ZTogdGhpcyBpcyBub3QgaWRlYWwsIGJ1dCB0aGUgUkZDJ3MgYXJlIHVuY2xlYXJcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtb3BlbnBncC1yZmM0ODgwYmlzLTAyI2FwcGVuZGl4LUJcbiAgaWYgKHRoaXMuZWMuY3VydmUudHlwZSA9PT0gJ21vbnQnKSB7XG4gICAgcmV0dXJuIHgudG9BcnJheSgnbGUnLCBsZW4pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB4LnRvQXJyYXkoJ2JlJywgbGVuKTtcbiAgfVxufTtcblxuLy8gRUNEU0FcbktleVBhaXIucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1zZywgZW5jLCBvcHRpb25zKSB7XG4gIHJldHVybiB0aGlzLmVjLnNpZ24obXNnLCB0aGlzLCBlbmMsIG9wdGlvbnMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1zZywgc2lnbmF0dXJlKSB7XG4gIHJldHVybiB0aGlzLmVjLnZlcmlmeShtc2csIHNpZ25hdHVyZSwgdGhpcyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgcmV0dXJuICc8S2V5IHByaXY6ICcgKyAodGhpcy5wcml2ICYmIHRoaXMucHJpdi50b1N0cmluZygxNiwgMikpICtcbiAgICAgICAgICcgcHViOiAnICsgKHRoaXMucHViICYmIHRoaXMucHViLmluc3BlY3QoKSkgKyAnID4nO1xufTtcblxufSx7XCIuLi8uLi9lbGxpcHRpY1wiOjI2NyxcImJuLmpzXCI6NDR9XSwyNzY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSBfZGVyZXFfKCdibi5qcycpO1xuXG52YXIgZWxsaXB0aWMgPSBfZGVyZXFfKCcuLi8uLi9lbGxpcHRpYycpO1xudmFyIHV0aWxzID0gZWxsaXB0aWMudXRpbHM7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBTaWduYXR1cmUob3B0aW9ucywgZW5jKSB7XG4gIGlmIChvcHRpb25zIGluc3RhbmNlb2YgU2lnbmF0dXJlKVxuICAgIHJldHVybiBvcHRpb25zO1xuXG4gIGlmICh0aGlzLl9pbXBvcnRERVIob3B0aW9ucywgZW5jKSlcbiAgICByZXR1cm47XG5cbiAgYXNzZXJ0KG9wdGlvbnMuciAmJiBvcHRpb25zLnMsICdTaWduYXR1cmUgd2l0aG91dCByIG9yIHMnKTtcbiAgdGhpcy5yID0gbmV3IEJOKG9wdGlvbnMuciwgMTYpO1xuICB0aGlzLnMgPSBuZXcgQk4ob3B0aW9ucy5zLCAxNik7XG4gIGlmIChvcHRpb25zLnJlY292ZXJ5UGFyYW0gPT09IHVuZGVmaW5lZClcbiAgICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBudWxsO1xuICBlbHNlXG4gICAgdGhpcy5yZWNvdmVyeVBhcmFtID0gb3B0aW9ucy5yZWNvdmVyeVBhcmFtO1xufVxubW9kdWxlLmV4cG9ydHMgPSBTaWduYXR1cmU7XG5cbmZ1bmN0aW9uIFBvc2l0aW9uKCkge1xuICB0aGlzLnBsYWNlID0gMDtcbn1cblxuZnVuY3Rpb24gZ2V0TGVuZ3RoKGJ1ZiwgcCkge1xuICB2YXIgaW5pdGlhbCA9IGJ1ZltwLnBsYWNlKytdO1xuICBpZiAoIShpbml0aWFsICYgMHg4MCkpIHtcbiAgICByZXR1cm4gaW5pdGlhbDtcbiAgfVxuICB2YXIgb2N0ZXRMZW4gPSBpbml0aWFsICYgMHhmO1xuICB2YXIgdmFsID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIG9mZiA9IHAucGxhY2U7IGkgPCBvY3RldExlbjsgaSsrLCBvZmYrKykge1xuICAgIHZhbCA8PD0gODtcbiAgICB2YWwgfD0gYnVmW29mZl07XG4gIH1cbiAgcC5wbGFjZSA9IG9mZjtcbiAgcmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gcm1QYWRkaW5nKGJ1Zikge1xuICB2YXIgaSA9IDA7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKCFidWZbaV0gJiYgIShidWZbaSArIDFdICYgMHg4MCkgJiYgaSA8IGxlbikge1xuICAgIGkrKztcbiAgfVxuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBidWY7XG4gIH1cbiAgcmV0dXJuIGJ1Zi5zbGljZShpKTtcbn1cblxuU2lnbmF0dXJlLnByb3RvdHlwZS5faW1wb3J0REVSID0gZnVuY3Rpb24gX2ltcG9ydERFUihkYXRhLCBlbmMpIHtcbiAgZGF0YSA9IHV0aWxzLnRvQXJyYXkoZGF0YSwgZW5jKTtcbiAgdmFyIHAgPSBuZXcgUG9zaXRpb24oKTtcbiAgaWYgKGRhdGFbcC5wbGFjZSsrXSAhPT0gMHgzMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICBpZiAoKGxlbiArIHAucGxhY2UpICE9PSBkYXRhLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZGF0YVtwLnBsYWNlKytdICE9PSAweDAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBybGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICB2YXIgciA9IGRhdGEuc2xpY2UocC5wbGFjZSwgcmxlbiArIHAucGxhY2UpO1xuICBwLnBsYWNlICs9IHJsZW47XG4gIGlmIChkYXRhW3AucGxhY2UrK10gIT09IDB4MDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHNsZW4gPSBnZXRMZW5ndGgoZGF0YSwgcCk7XG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gc2xlbiArIHAucGxhY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHMgPSBkYXRhLnNsaWNlKHAucGxhY2UsIHNsZW4gKyBwLnBsYWNlKTtcbiAgaWYgKHJbMF0gPT09IDAgJiYgKHJbMV0gJiAweDgwKSkge1xuICAgIHIgPSByLnNsaWNlKDEpO1xuICB9XG4gIGlmIChzWzBdID09PSAwICYmIChzWzFdICYgMHg4MCkpIHtcbiAgICBzID0gcy5zbGljZSgxKTtcbiAgfVxuXG4gIHRoaXMuciA9IG5ldyBCTihyKTtcbiAgdGhpcy5zID0gbmV3IEJOKHMpO1xuICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBudWxsO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gY29uc3RydWN0TGVuZ3RoKGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPCAweDgwKSB7XG4gICAgYXJyLnB1c2gobGVuKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG9jdGV0cyA9IDEgKyAoTWF0aC5sb2cobGVuKSAvIE1hdGguTE4yID4+PiAzKTtcbiAgYXJyLnB1c2gob2N0ZXRzIHwgMHg4MCk7XG4gIHdoaWxlICgtLW9jdGV0cykge1xuICAgIGFyci5wdXNoKChsZW4gPj4+IChvY3RldHMgPDwgMykpICYgMHhmZik7XG4gIH1cbiAgYXJyLnB1c2gobGVuKTtcbn1cblxuU2lnbmF0dXJlLnByb3RvdHlwZS50b0RFUiA9IGZ1bmN0aW9uIHRvREVSKGVuYykge1xuICB2YXIgciA9IHRoaXMuci50b0FycmF5KCk7XG4gIHZhciBzID0gdGhpcy5zLnRvQXJyYXkoKTtcblxuICAvLyBQYWQgdmFsdWVzXG4gIGlmIChyWzBdICYgMHg4MClcbiAgICByID0gWyAwIF0uY29uY2F0KHIpO1xuICAvLyBQYWQgdmFsdWVzXG4gIGlmIChzWzBdICYgMHg4MClcbiAgICBzID0gWyAwIF0uY29uY2F0KHMpO1xuXG4gIHIgPSBybVBhZGRpbmcocik7XG4gIHMgPSBybVBhZGRpbmcocyk7XG5cbiAgd2hpbGUgKCFzWzBdICYmICEoc1sxXSAmIDB4ODApKSB7XG4gICAgcyA9IHMuc2xpY2UoMSk7XG4gIH1cbiAgdmFyIGFyciA9IFsgMHgwMiBdO1xuICBjb25zdHJ1Y3RMZW5ndGgoYXJyLCByLmxlbmd0aCk7XG4gIGFyciA9IGFyci5jb25jYXQocik7XG4gIGFyci5wdXNoKDB4MDIpO1xuICBjb25zdHJ1Y3RMZW5ndGgoYXJyLCBzLmxlbmd0aCk7XG4gIHZhciBiYWNrSGFsZiA9IGFyci5jb25jYXQocyk7XG4gIHZhciByZXMgPSBbIDB4MzAgXTtcbiAgY29uc3RydWN0TGVuZ3RoKHJlcywgYmFja0hhbGYubGVuZ3RoKTtcbiAgcmVzID0gcmVzLmNvbmNhdChiYWNrSGFsZik7XG4gIHJldHVybiB1dGlscy5lbmNvZGUocmVzLCBlbmMpO1xufTtcblxufSx7XCIuLi8uLi9lbGxpcHRpY1wiOjI2NyxcImJuLmpzXCI6NDR9XSwyNzc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzaCA9IF9kZXJlcV8oJ2hhc2guanMnKTtcbnZhciBIbWFjRFJCRyA9IF9kZXJlcV8oJ2htYWMtZHJiZycpO1xudmFyIGVsbGlwdGljID0gX2RlcmVxXygnLi4vLi4vZWxsaXB0aWMnKTtcbnZhciB1dGlscyA9IGVsbGlwdGljLnV0aWxzO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcbnZhciBwYXJzZUJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcztcbnZhciBLZXlQYWlyID0gX2RlcmVxXygnLi9rZXknKTtcbnZhciBTaWduYXR1cmUgPSBfZGVyZXFfKCcuL3NpZ25hdHVyZScpO1xuXG5mdW5jdGlvbiBFRERTQShjdXJ2ZSkge1xuICBhc3NlcnQoY3VydmUgPT09ICdlZDI1NTE5JywgJ29ubHkgdGVzdGVkIHdpdGggZWQyNTUxOSBzbyBmYXInKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRUREU0EpKVxuICAgIHJldHVybiBuZXcgRUREU0EoY3VydmUpO1xuXG4gIHZhciBjdXJ2ZSA9IGVsbGlwdGljLmN1cnZlc1tjdXJ2ZV0uY3VydmU7XG4gIHRoaXMuY3VydmUgPSBjdXJ2ZTtcbiAgdGhpcy5nID0gY3VydmUuZztcbiAgdGhpcy5nLnByZWNvbXB1dGUoY3VydmUubi5iaXRMZW5ndGgoKSArIDEpO1xuXG4gIHRoaXMucG9pbnRDbGFzcyA9IGN1cnZlLnBvaW50KCkuY29uc3RydWN0b3I7XG4gIHRoaXMuZW5jb2RpbmdMZW5ndGggPSBNYXRoLmNlaWwoY3VydmUubi5iaXRMZW5ndGgoKSAvIDgpO1xuICB0aGlzLmhhc2ggPSBoYXNoLnNoYTUxMjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFRERTQTtcblxuLyoqXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBtZXNzYWdlIC0gbWVzc2FnZSBieXRlc1xuKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xLZXlQYWlyfSBzZWNyZXQgLSBzZWNyZXQgYnl0ZXMgb3IgYSBrZXlwYWlyXG4qIEByZXR1cm5zIHtTaWduYXR1cmV9IC0gc2lnbmF0dXJlXG4qL1xuRUREU0EucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1lc3NhZ2UsIHNlY3JldCkge1xuICBtZXNzYWdlID0gcGFyc2VCeXRlcyhtZXNzYWdlKTtcbiAgdmFyIGtleSA9IHRoaXMua2V5RnJvbVNlY3JldChzZWNyZXQpO1xuICB2YXIgciA9IHRoaXMuaGFzaEludChrZXkubWVzc2FnZVByZWZpeCgpLCBtZXNzYWdlKTtcbiAgdmFyIFIgPSB0aGlzLmcubXVsKHIpO1xuICB2YXIgUmVuY29kZWQgPSB0aGlzLmVuY29kZVBvaW50KFIpO1xuICB2YXIgc18gPSB0aGlzLmhhc2hJbnQoUmVuY29kZWQsIGtleS5wdWJCeXRlcygpLCBtZXNzYWdlKVxuICAgICAgICAgICAgICAgLm11bChrZXkucHJpdigpKTtcbiAgdmFyIFMgPSByLmFkZChzXykudW1vZCh0aGlzLmN1cnZlLm4pO1xuICByZXR1cm4gdGhpcy5tYWtlU2lnbmF0dXJlKHsgUjogUiwgUzogUywgUmVuY29kZWQ6IFJlbmNvZGVkIH0pO1xufTtcblxuLyoqXG4qIEBwYXJhbSB7QXJyYXl9IG1lc3NhZ2UgLSBtZXNzYWdlIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfFNpZ25hdHVyZX0gc2lnIC0gc2lnIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfFBvaW50fEtleVBhaXJ9IHB1YiAtIHB1YmxpYyBrZXlcbiogQHJldHVybnMge0Jvb2xlYW59IC0gdHJ1ZSBpZiBwdWJsaWMga2V5IG1hdGNoZXMgc2lnIG9mIG1lc3NhZ2VcbiovXG5FRERTQS5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1lc3NhZ2UsIHNpZywgcHViKSB7XG4gIG1lc3NhZ2UgPSBwYXJzZUJ5dGVzKG1lc3NhZ2UpO1xuICBzaWcgPSB0aGlzLm1ha2VTaWduYXR1cmUoc2lnKTtcbiAgdmFyIGtleSA9IHRoaXMua2V5RnJvbVB1YmxpYyhwdWIpO1xuICB2YXIgaCA9IHRoaXMuaGFzaEludChzaWcuUmVuY29kZWQoKSwga2V5LnB1YkJ5dGVzKCksIG1lc3NhZ2UpO1xuICB2YXIgU0cgPSB0aGlzLmcubXVsKHNpZy5TKCkpO1xuICB2YXIgUnBsdXNBaCA9IHNpZy5SKCkuYWRkKGtleS5wdWIoKS5tdWwoaCkpO1xuICByZXR1cm4gUnBsdXNBaC5lcShTRyk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuaGFzaEludCA9IGZ1bmN0aW9uIGhhc2hJbnQoKSB7XG4gIHZhciBoYXNoID0gdGhpcy5oYXNoKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgIGhhc2gudXBkYXRlKGFyZ3VtZW50c1tpXSk7XG4gIHJldHVybiB1dGlscy5pbnRGcm9tTEUoaGFzaC5kaWdlc3QoKSkudW1vZCh0aGlzLmN1cnZlLm4pO1xufTtcblxuRUREU0EucHJvdG90eXBlLmtleVBhaXIgPSBmdW5jdGlvbiBrZXlQYWlyKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKHRoaXMsIG9wdGlvbnMpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmtleUZyb21QdWJsaWMgPSBmdW5jdGlvbiBrZXlGcm9tUHVibGljKHB1Yikge1xuICByZXR1cm4gS2V5UGFpci5mcm9tUHVibGljKHRoaXMsIHB1Yik7XG59O1xuXG5FRERTQS5wcm90b3R5cGUua2V5RnJvbVNlY3JldCA9IGZ1bmN0aW9uIGtleUZyb21TZWNyZXQoc2VjcmV0KSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21TZWNyZXQodGhpcywgc2VjcmV0KTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5nZW5LZXlQYWlyID0gZnVuY3Rpb24gZ2VuS2V5UGFpcihvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucylcbiAgICBvcHRpb25zID0ge307XG5cbiAgLy8gSW5zdGFudGlhdGUgSG1hY19EUkJHXG4gIHZhciBkcmJnID0gbmV3IEhtYWNEUkJHKHtcbiAgICBoYXNoOiB0aGlzLmhhc2gsXG4gICAgcGVyczogb3B0aW9ucy5wZXJzLFxuICAgIHBlcnNFbmM6IG9wdGlvbnMucGVyc0VuYyB8fCAndXRmOCcsXG4gICAgZW50cm9weTogb3B0aW9ucy5lbnRyb3B5IHx8IGVsbGlwdGljLnJhbmQodGhpcy5oYXNoLmhtYWNTdHJlbmd0aCksXG4gICAgZW50cm9weUVuYzogb3B0aW9ucy5lbnRyb3B5ICYmIG9wdGlvbnMuZW50cm9weUVuYyB8fCAndXRmOCcsXG4gICAgbm9uY2U6IHRoaXMuY3VydmUubi50b0FycmF5KClcbiAgfSk7XG5cbiAgcmV0dXJuIHRoaXMua2V5RnJvbVNlY3JldChkcmJnLmdlbmVyYXRlKDMyKSk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUubWFrZVNpZ25hdHVyZSA9IGZ1bmN0aW9uIG1ha2VTaWduYXR1cmUoc2lnKSB7XG4gIGlmIChzaWcgaW5zdGFuY2VvZiBTaWduYXR1cmUpXG4gICAgcmV0dXJuIHNpZztcbiAgcmV0dXJuIG5ldyBTaWduYXR1cmUodGhpcywgc2lnKTtcbn07XG5cbi8qKlxuKiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1qb3NlZnNzb24tZWRkc2EtZWQyNTUxOS0wMyNzZWN0aW9uLTUuMlxuKlxuKiBFRERTQSBkZWZpbmVzIG1ldGhvZHMgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZyBwb2ludHMgYW5kIGludGVnZXJzLiBUaGVzZSBhcmVcbiogaGVscGVyIGNvbnZlbmllbmNlIG1ldGhvZHMsIHRoYXQgcGFzcyBhbG9uZyB0byB1dGlsaXR5IGZ1bmN0aW9ucyBpbXBsaWVkXG4qIHBhcmFtZXRlcnMuXG4qXG4qL1xuRUREU0EucHJvdG90eXBlLmVuY29kZVBvaW50ID0gZnVuY3Rpb24gZW5jb2RlUG9pbnQocG9pbnQpIHtcbiAgdmFyIGVuYyA9IHBvaW50LmdldFkoKS50b0FycmF5KCdsZScsIHRoaXMuZW5jb2RpbmdMZW5ndGgpO1xuICBlbmNbdGhpcy5lbmNvZGluZ0xlbmd0aCAtIDFdIHw9IHBvaW50LmdldFgoKS5pc09kZCgpID8gMHg4MCA6IDA7XG4gIHJldHVybiBlbmM7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZGVjb2RlUG9pbnQgPSBmdW5jdGlvbiBkZWNvZGVQb2ludChieXRlcykge1xuICBieXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXMoYnl0ZXMpO1xuXG4gIHZhciBsYXN0SXggPSBieXRlcy5sZW5ndGggLSAxO1xuICB2YXIgbm9ybWVkID0gYnl0ZXMuc2xpY2UoMCwgbGFzdEl4KS5jb25jYXQoYnl0ZXNbbGFzdEl4XSAmIH4weDgwKTtcbiAgdmFyIHhJc09kZCA9IChieXRlc1tsYXN0SXhdICYgMHg4MCkgIT09IDA7XG5cbiAgdmFyIHkgPSB1dGlscy5pbnRGcm9tTEUobm9ybWVkKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnRGcm9tWSh5LCB4SXNPZGQpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmVuY29kZUludCA9IGZ1bmN0aW9uIGVuY29kZUludChudW0pIHtcbiAgcmV0dXJuIG51bS50b0FycmF5KCdsZScsIHRoaXMuZW5jb2RpbmdMZW5ndGgpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmRlY29kZUludCA9IGZ1bmN0aW9uIGRlY29kZUludChieXRlcykge1xuICByZXR1cm4gdXRpbHMuaW50RnJvbUxFKGJ5dGVzKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5pc1BvaW50ID0gZnVuY3Rpb24gaXNQb2ludCh2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIHRoaXMucG9pbnRDbGFzcztcbn07XG5cbn0se1wiLi4vLi4vZWxsaXB0aWNcIjoyNjcsXCIuL2tleVwiOjI3OCxcIi4vc2lnbmF0dXJlXCI6Mjc5LFwiaGFzaC5qc1wiOjI4NCxcImhtYWMtZHJiZ1wiOjI5Nn1dLDI3ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbGxpcHRpYyA9IF9kZXJlcV8oJy4uLy4uL2VsbGlwdGljJyk7XG52YXIgdXRpbHMgPSBlbGxpcHRpYy51dGlscztcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG52YXIgY2FjaGVkUHJvcGVydHkgPSB1dGlscy5jYWNoZWRQcm9wZXJ0eTtcblxuLyoqXG4qIEBwYXJhbSB7RUREU0F9IGVkZHNhIC0gaW5zdGFuY2VcbiogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHB1YmxpYy9wcml2YXRlIGtleSBwYXJhbWV0ZXJzXG4qXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZT59IFtwYXJhbXMuc2VjcmV0XSAtIHNlY3JldCBzZWVkIGJ5dGVzXG4qIEBwYXJhbSB7UG9pbnR9IFtwYXJhbXMucHViXSAtIHB1YmxpYyBrZXkgcG9pbnQgKGFrYSBgQWAgaW4gZWRkc2EgdGVybXMpXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZT59IFtwYXJhbXMucHViXSAtIHB1YmxpYyBrZXkgcG9pbnQgZW5jb2RlZCBhcyBieXRlc1xuKlxuKi9cbmZ1bmN0aW9uIEtleVBhaXIoZWRkc2EsIHBhcmFtcykge1xuICB0aGlzLmVkZHNhID0gZWRkc2E7XG4gIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoJ3NlY3JldCcpKVxuICAgIHRoaXMuX3NlY3JldCA9IHBhcnNlQnl0ZXMocGFyYW1zLnNlY3JldCk7XG4gIGlmIChlZGRzYS5pc1BvaW50KHBhcmFtcy5wdWIpKVxuICAgIHRoaXMuX3B1YiA9IHBhcmFtcy5wdWI7XG4gIGVsc2Uge1xuICAgIHRoaXMuX3B1YkJ5dGVzID0gcGFyc2VCeXRlcyhwYXJhbXMucHViKTtcbiAgICBpZiAodGhpcy5fcHViQnl0ZXMgJiYgdGhpcy5fcHViQnl0ZXMubGVuZ3RoID09PSAzMyAmJlxuICAgICAgICB0aGlzLl9wdWJCeXRlc1swXSA9PT0gMHg0MClcbiAgICAgIHRoaXMuX3B1YkJ5dGVzID0gdGhpcy5fcHViQnl0ZXMuc2xpY2UoMSwgMzMpO1xuICAgIGlmICh0aGlzLl9wdWJCeXRlcyAmJiB0aGlzLl9wdWJCeXRlcy5sZW5ndGggIT09IDMyKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHBvaW50IGNvbXByZXNzaW9uIGZvcm1hdCcpO1xuICB9XG59XG5cbktleVBhaXIuZnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGZyb21QdWJsaWMoZWRkc2EsIHB1Yikge1xuICBpZiAocHViIGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHViO1xuICByZXR1cm4gbmV3IEtleVBhaXIoZWRkc2EsIHsgcHViOiBwdWIgfSk7XG59O1xuXG5LZXlQYWlyLmZyb21TZWNyZXQgPSBmdW5jdGlvbiBmcm9tU2VjcmV0KGVkZHNhLCBzZWNyZXQpIHtcbiAgaWYgKHNlY3JldCBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHNlY3JldDtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVkZHNhLCB7IHNlY3JldDogc2VjcmV0IH0pO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuc2VjcmV0ID0gZnVuY3Rpb24gc2VjcmV0KCkge1xuICByZXR1cm4gdGhpcy5fc2VjcmV0O1xufTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ3B1YkJ5dGVzJywgZnVuY3Rpb24gcHViQnl0ZXMoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmVuY29kZVBvaW50KHRoaXMucHViKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdwdWInLCBmdW5jdGlvbiBwdWIoKSB7XG4gIGlmICh0aGlzLl9wdWJCeXRlcylcbiAgICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLl9wdWJCeXRlcyk7XG4gIHJldHVybiB0aGlzLmVkZHNhLmcubXVsKHRoaXMucHJpdigpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHJpdkJ5dGVzJywgZnVuY3Rpb24gcHJpdkJ5dGVzKCkge1xuICB2YXIgZWRkc2EgPSB0aGlzLmVkZHNhO1xuICB2YXIgaGFzaCA9IHRoaXMuaGFzaCgpO1xuICB2YXIgbGFzdEl4ID0gZWRkc2EuZW5jb2RpbmdMZW5ndGggLSAxO1xuXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM4MDMyI3NlY3Rpb24tNS4xLjVcbiAgdmFyIGEgPSBoYXNoLnNsaWNlKDAsIGVkZHNhLmVuY29kaW5nTGVuZ3RoKTtcbiAgYVswXSAmPSAyNDg7XG4gIGFbbGFzdEl4XSAmPSAxMjc7XG4gIGFbbGFzdEl4XSB8PSA2NDtcblxuICByZXR1cm4gYTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHJpdicsIGZ1bmN0aW9uIHByaXYoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLnByaXZCeXRlcygpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAnaGFzaCcsIGZ1bmN0aW9uIGhhc2goKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmhhc2goKS51cGRhdGUodGhpcy5zZWNyZXQoKSkuZGlnZXN0KCk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ21lc3NhZ2VQcmVmaXgnLCBmdW5jdGlvbiBtZXNzYWdlUHJlZml4KCkge1xuICByZXR1cm4gdGhpcy5oYXNoKCkuc2xpY2UodGhpcy5lZGRzYS5lbmNvZGluZ0xlbmd0aCk7XG59KTtcblxuS2V5UGFpci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obWVzc2FnZSkge1xuICBhc3NlcnQodGhpcy5fc2VjcmV0LCAnS2V5UGFpciBjYW4gb25seSB2ZXJpZnknKTtcbiAgcmV0dXJuIHRoaXMuZWRkc2Euc2lnbihtZXNzYWdlLCB0aGlzKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtZXNzYWdlLCBzaWcpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EudmVyaWZ5KG1lc3NhZ2UsIHNpZywgdGhpcyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRTZWNyZXQgPSBmdW5jdGlvbiBnZXRTZWNyZXQoZW5jKSB7XG4gIGFzc2VydCh0aGlzLl9zZWNyZXQsICdLZXlQYWlyIGlzIHB1YmxpYyBvbmx5Jyk7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy5zZWNyZXQoKSwgZW5jKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFB1YmxpYyA9IGZ1bmN0aW9uIGdldFB1YmxpYyhlbmMsIGNvbXBhY3QpIHtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSgoY29tcGFjdCA/IFsgMHg0MCBdIDogW10pLmNvbmNhdCh0aGlzLnB1YkJ5dGVzKCkpLCBlbmMpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBLZXlQYWlyO1xuXG59LHtcIi4uLy4uL2VsbGlwdGljXCI6MjY3fV0sMjc5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gX2RlcmVxXygnYm4uanMnKTtcbnZhciBlbGxpcHRpYyA9IF9kZXJlcV8oJy4uLy4uL2VsbGlwdGljJyk7XG52YXIgdXRpbHMgPSBlbGxpcHRpYy51dGlscztcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG52YXIgY2FjaGVkUHJvcGVydHkgPSB1dGlscy5jYWNoZWRQcm9wZXJ0eTtcbnZhciBwYXJzZUJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcztcblxuLyoqXG4qIEBwYXJhbSB7RUREU0F9IGVkZHNhIC0gZWRkc2EgaW5zdGFuY2VcbiogQHBhcmFtIHtBcnJheTxCeXRlcz58T2JqZWN0fSBzaWcgLVxuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPnxQb2ludH0gW3NpZy5SXSAtIFIgcG9pbnQgYXMgUG9pbnQgb3IgYnl0ZXNcbiogQHBhcmFtIHtBcnJheTxCeXRlcz58Ym59IFtzaWcuU10gLSBTIHNjYWxhciBhcyBibiBvciBieXRlc1xuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPn0gW3NpZy5SZW5jb2RlZF0gLSBSIHBvaW50IGVuY29kZWRcbiogQHBhcmFtIHtBcnJheTxCeXRlcz59IFtzaWcuU2VuY29kZWRdIC0gUyBzY2FsYXIgZW5jb2RlZFxuKi9cbmZ1bmN0aW9uIFNpZ25hdHVyZShlZGRzYSwgc2lnKSB7XG4gIHRoaXMuZWRkc2EgPSBlZGRzYTtcblxuICBpZiAodHlwZW9mIHNpZyAhPT0gJ29iamVjdCcpXG4gICAgc2lnID0gcGFyc2VCeXRlcyhzaWcpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHNpZykpIHtcbiAgICBzaWcgPSB7XG4gICAgICBSOiBzaWcuc2xpY2UoMCwgZWRkc2EuZW5jb2RpbmdMZW5ndGgpLFxuICAgICAgUzogc2lnLnNsaWNlKGVkZHNhLmVuY29kaW5nTGVuZ3RoKVxuICAgIH07XG4gIH1cblxuICBhc3NlcnQoc2lnLlIgJiYgc2lnLlMsICdTaWduYXR1cmUgd2l0aG91dCBSIG9yIFMnKTtcblxuICBpZiAoZWRkc2EuaXNQb2ludChzaWcuUikpXG4gICAgdGhpcy5fUiA9IHNpZy5SO1xuICBpZiAoc2lnLlMgaW5zdGFuY2VvZiBCTilcbiAgICB0aGlzLl9TID0gc2lnLlM7XG5cbiAgdGhpcy5fUmVuY29kZWQgPSBBcnJheS5pc0FycmF5KHNpZy5SKSA/IHNpZy5SIDogc2lnLlJlbmNvZGVkO1xuICB0aGlzLl9TZW5jb2RlZCA9IEFycmF5LmlzQXJyYXkoc2lnLlMpID8gc2lnLlMgOiBzaWcuU2VuY29kZWQ7XG59XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgJ1MnLCBmdW5jdGlvbiBTKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVJbnQodGhpcy5TZW5jb2RlZCgpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsICdSJywgZnVuY3Rpb24gUigpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlUG9pbnQodGhpcy5SZW5jb2RlZCgpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsICdSZW5jb2RlZCcsIGZ1bmN0aW9uIFJlbmNvZGVkKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVQb2ludCh0aGlzLlIoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCAnU2VuY29kZWQnLCBmdW5jdGlvbiBTZW5jb2RlZCgpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlSW50KHRoaXMuUygpKTtcbn0pO1xuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvQnl0ZXMgPSBmdW5jdGlvbiB0b0J5dGVzKCkge1xuICByZXR1cm4gdGhpcy5SZW5jb2RlZCgpLmNvbmNhdCh0aGlzLlNlbmNvZGVkKCkpO1xufTtcblxuU2lnbmF0dXJlLnByb3RvdHlwZS50b0hleCA9IGZ1bmN0aW9uIHRvSGV4KCkge1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHRoaXMudG9CeXRlcygpLCAnaGV4JykudG9VcHBlckNhc2UoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gU2lnbmF0dXJlO1xuXG59LHtcIi4uLy4uL2VsbGlwdGljXCI6MjY3LFwiYm4uanNcIjo0NH1dLDI4MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZG91Ymxlczoge1xuICAgIHN0ZXA6IDQsXG4gICAgcG9pbnRzOiBbXG4gICAgICBbXG4gICAgICAgICdlNjBmY2U5M2I1OWU5ZWM1MzAxMWFhYmMyMWMyM2U5N2IyYTMxMzY5Yjg3YTVhZTljNDRlZTg5ZTJhNmRlYzBhJyxcbiAgICAgICAgJ2Y3ZTM1MDczOTllNTk1OTI5ZGI5OWYzNGY1NzkzNzEwMTI5Njg5MWU0NGQyM2YwYmUxZjMyY2NlNjk2MTY4MjEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODI4MjI2MzIxMmM2MDlkOWVhMmE2ZTNlMTcyZGUyMzhkOGMzOWNhYmQ1YWMxY2ExMDY0NmUyM2ZkNWY1MTUwOCcsXG4gICAgICAgICcxMWY4YTgwOTg1NTdkZmU0NWU4MjU2ZTgzMGI2MGFjZTYyZDYxM2FjMmY3YjE3YmVkMzFiNmVhZmY2ZTI2Y2FmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE3NWUxNTlmNzI4Yjg2NWE3MmY5OWNjNmM2ZmM4NDZkZTBiOTM4MzNmZDIyMjJlZDczZmNlNWI1NTFlNWI3MzknLFxuICAgICAgICAnZDM1MDZlMGQ5ZTNjNzllYmE0ZWY5N2E1MWZmNzFmNWVhY2I1OTU1YWRkMjQzNDVjNmVmYTZmZmVlOWZlZDY5NSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNjNkOTBkNDQ3YjAwYzljOTljZWFjMDViNjI2MmVlMDUzNDQxYzdlNTU1NTJmZmU1MjZiYWQ4ZjgzZmY0NjQwJyxcbiAgICAgICAgJzRlMjczYWRmYzczMjIyMTk1M2I0NDUzOTdmMzM2MzE0NWI5YTg5MDA4MTk5ZWNiNjIwMDNjN2YzYmVlOWRlOSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4YjRiNWYxNjVkZjNjMmJlOGM2MjQ0YjViNzQ1NjM4ODQzZTRhNzgxYTE1YmNkMWI2OWY3OWE1NWRmZmRmODBjJyxcbiAgICAgICAgJzRhYWQwYTZmNjhkMzA4YjRiM2ZiZDc4MTNhYjBkYTA0ZjllMzM2NTQ2MTYyZWU1NmIzZWZmMGM2NWZkNGZkMzYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzIzY2JhYTZlNWRiOTk2ZDZiZjc3MWMwMGJkNTQ4YzdiNzAwZGJmZmE2YzBlNzdiY2I2MTE1OTI1MjMyZmNkYScsXG4gICAgICAgICc5NmU4NjdiNTU5NWNjNDk4YTkyMTEzNzQ4ODgyNGQ2ZTI2NjBhMDY1Mzc3OTQ5NDgwMWRjMDY5ZDllYjM5ZjVmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VlYmZhNGQ0OTNiZWJmOThiYTVmZWVjODEyYzJkM2I1MDk0Nzk2MTIzN2E5MTk4MzlhNTMzZWNhMGU3ZGQ3ZmEnLFxuICAgICAgICAnNWQ5YThjYTM5NzBlZjBmMjY5ZWU3ZWRhZjE3ODA4OWQ5YWU0Y2RjM2E3MTFmNzEyZGRmZDRmZGFlMWRlODk5OSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxMDBmNDRkYTY5NmU3MTY3Mjc5MWQwYTA5YjdiZGU0NTlmMTIxNWEyOWIzYzAzYmZlZmQ3ODM1YjM5YTQ4ZGIwJyxcbiAgICAgICAgJ2NkZDllMTMxOTJhMDBiNzcyZWM4ZjMzMDBjMDkwNjY2YjdmZjRhMThmZjUxOTVhYzBmYmQ1Y2Q2MmJjNjVhMDknXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTEwMzFiZTI2MmM3ZWQxYjFkYzkyMjdhNGEwNGMwMTdhNzdmOGQ0NDY0ZjNiMzg1MmM4YWNkZTZlNTM0ZmQyZCcsXG4gICAgICAgICc5ZDcwNjE5Mjg5NDA0MDVlNmJiNmE0MTc2NTk3NTM1YWYyOTJkZDQxOWUxY2VkNzlhNDRmMThmMjk0NTZhMDBkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ZlZWE2Y2FlNDZkNTViNTMwYWMyODM5ZjE0M2JkN2VjNWNmOGIyNjZhNDFkNmFmNTJkNWU2ODhkOTA5NDY5NmQnLFxuICAgICAgICAnZTU3YzZiNmM5N2RjZTFiYWIwNmU0ZTEyYmYzZWNkNWM5ODFjODk1N2NjNDE0NDJkMzE1NWRlYmYxODA5MDA4OCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYTY3YTkxZDkxMDQ5Y2RjYjM2N2JlNGJlNmZmY2EzY2ZlZWQ2NTdkODA4NTgzZGUzM2ZhOTc4YmMxZWM2Y2IxJyxcbiAgICAgICAgJzliYWNhYTM1NDgxNjQyYmM0MWY0NjNmN2VjOTc4MGU1ZGVjN2FkYzUwOGY3NDBhMTdlOWVhOGUyN2E2OGJlMWQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTM5MDRmYWEwYjMzNGNkZGE2ZTAwMDkzNWVmMjIxNTFlYzA4ZDBmN2JiMTEwNjlmNTc1NDVjY2MxYTM3YjdjMCcsXG4gICAgICAgICc1YmMwODdkMGJjODAxMDZkODhjOWVjY2FjMjBkM2MxYzEzOTk5OTgxZTE0NDM0Njk5ZGNiMDk2YjAyMjc3MWM4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhlN2JjZDBiZDM1OTgzYTc3MTljY2E3NzY0Y2E5MDY3NzliNTNhMDQzYTliOGJjYWVmZjk1OWY0M2FkODYwNDcnLFxuICAgICAgICAnMTBiNzc3MGIyYTNkYTRiMzk0MDMxMDQyMGNhOTUxNDU3OWU4OGUyZTQ3ZmQ2OGIzZWExMDA0N2U4NDYwMzcyYSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczODVlZWQzNGMxY2RmZjIxZTZkMDgxODY4OWI4MWJkZTcxYTdmNGYxODM5N2U2NjkwYTg0MWUxNTk5YzQzODYyJyxcbiAgICAgICAgJzI4M2JlYmMzZThlYTIzZjU2NzAxZGUxOWU5ZWJmNDU3NmIzMDRlZWMyMDg2ZGM4Y2MwNDU4ZmU1NTQyZTU0NTMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNmY5ZDliODAzZWNmMTkxNjM3YzczYTQ0MTNkZmExODBmZGRmODRhNTk0N2ZiYzljNjA2ZWQ4NmMzZmFjM2E3JyxcbiAgICAgICAgJzdjODBjNjhlNjAzMDU5YmE2OWI4ZTJhMzBlNDVjNGQ0N2VhNGRkMmY1YzI4MTAwMmQ4Njg5MDYwM2E4NDIxNjAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzMyMmQ0MDEyNDNjNGUyNTgyYTIxNDdjMTA0ZDZlY2JmNzc0ZDE2M2RiMGY1ZTUzMTNiN2UwZTc0MmQwZTZiZCcsXG4gICAgICAgICc1NmU3MDc5N2U5NjY0ZWY1YmZiMDE5YmM0ZGRhZjliNzI4MDVmNjNlYTI4NzNhZjYyNGYzYTJlOTZjMjhiMmEwJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1NjcyYzdkMmRlMGI3ZGEyYmQxNzcwZDg5NjY1ODY4NzQxYjNmOWFmNzY0MzM5NzcyMWQ3NGQyODEzNGFiODMnLFxuICAgICAgICAnN2M0ODFiOWI1YjQzYjJlYjYzNzQwNDliZmE2MmMyZTVlNzdmMTdmY2M1Mjk4ZjQ0YzhlMzA5NGY3OTAzMTNhNidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5NDhiZjgwOWIxOTg4YTQ2YjA2YzlmMTkxOTQxM2IxMGY5MjI2YzYwZjY2ODgzMmZmZDk1OWFmNjBjODJhMGEnLFxuICAgICAgICAnNTNhNTYyODU2ZGNiNjY0NmRjNmI3NGM1ZDFjMzQxOGM2ZDRkZmYwOGM5N2NkMmJlZDRjYjdmODhkOGM4ZTU4OSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MjYwY2U3ZjQ2MTgwMWMzNGYwNjdjZTBmMDI4NzNhOGYxYjBlNDRkZmM2OTc1MmFjY2VjZDgxOWYzOGZkOGU4JyxcbiAgICAgICAgJ2JjMmRhODJiNmZhNWI1NzFhN2YwOTA0OTc3NmExZWY3ZWNkMjkyMjM4MDUxYzE5OGMxYTg0ZTk1YjJiNGFlMTcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTUwMzdkZTBhZmMxZDhkNDNkODM0ODQxNGJiZjQxMDMwNDNlYzhmNTc1YmZkYzQzMjk1M2NjOGQyMDM3ZmEyZCcsXG4gICAgICAgICc0NTcxNTM0YmFhOTRkM2I1ZjlmOThkMDlmYjk5MGJkZGJkNWY1YjAzZWM0ODFmMTBlMGU1ZGM4NDFkNzU1YmRhJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UwNjM3MmIwZjRhMjA3YWRmNWVhOTA1ZThmMTc3MWI0ZTdlOGRiZDFjNmE2YzViNzI1ODY2YTBhZTRmY2U3MjUnLFxuICAgICAgICAnN2E5MDg5NzRiY2UxOGNmZTEyYTI3YmIyYWQ1YTQ4OGNkNzQ4NGE3Nzg3MTA0ODcwYjI3MDM0Zjk0ZWVlMzFkZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyMTNjN2E3MTVjZDVkNDUzNThkMGJiZjlkYzBjZTAyMjA0YjEwYmRkZTJhM2Y1ODU0MGFkNjkwOGQwNTU5NzU0JyxcbiAgICAgICAgJzRiNmRhZDBiNWFlNDYyNTA3MDEzYWQwNjI0NWJhMTkwYmI0ODUwZjVmMzZhN2VlZGRmZjJjMjc1MzRiNDU4ZjInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGU3YzI3MmE3YWY0YjM0ZThkYmI5MzUyYTU0MTlhODdlMjgzOGM3MGFkYzYyY2RkZjBjYzNhM2IwOGZiZDUzYycsXG4gICAgICAgICcxNzc0OWM3NjZjOWQwYjE4ZTE2ZmQwOWY2ZGVmNjgxYjUzMGI5NjE0YmZmN2RkMzNlMGIzOTQxODE3ZGNhYWU2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ZlYTc0ZTNkYmU3NzhiMWIxMGYyMzhhZDYxNjg2YWE1Yzc2ZTNkYjJiZTQzMDU3NjMyNDI3ZTI4NDBmYjI3YjYnLFxuICAgICAgICAnNmUwNTY4ZGI5YjBiMTMyOTdjZjY3NGRlY2NiNmFmOTMxMjZiNTk2Yjk3M2Y3Yjc3NzAxZDNkYjdmMjNjYjk2ZidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NmU2NDExM2Y2NzdjZjBlMTBhMjU3MGQ1OTk5NjhkMzE1NDRlMTc5Yjc2MDQzMjk1MmMwMmE0NDE3YmRkZTM5JyxcbiAgICAgICAgJ2M5MGRkZjhkZWU0ZTk1Y2Y1NzcwNjZkNzA2ODFmMGQzNWUyYTMzZDJiNTZkMjAzMmI0YjE3NTJkMTkwMWFjMDEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzczOGM1NmIwM2IyYWJlMWU4MjgxYmFhNzQzZjhmOWE4ZjdjYzY0M2RmMjZjYmVlM2FiMTUwMjQyYmNiYjg5MScsXG4gICAgICAgICc4OTNmYjU3ODk1MWFkMjUzN2Y3MThmMmVhY2JmYmJiYjgyMzE0ZWVmNzg4MGNmZTkxN2U3MzVkOTY5OWE4NGMzJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q4OTU2MjY1NDhiNjViODFlMjY0Yzc2MzdjOTcyODc3ZDFkNzJlNWYzYTkyNTAxNDM3MmU5ZjY1ODhmNmMxNGInLFxuICAgICAgICAnZmViZmFhMzhmMmJjN2VhZTcyOGVjNjA4MThjMzQwZWIwMzQyOGQ2MzJiYjA2N2UxNzkzNjNlZDc1ZDdkOTkxZidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiOGRhOTQwMzJhOTU3NTE4ZWIwZjY0MzM1NzFlODc2MWNlZmZjNzM2OTNlODRlZGQ0OTE1MGE1NjRmNjc2ZTAzJyxcbiAgICAgICAgJzI4MDRkZmE0NDgwNWExZTRkN2M5OWNjOTc2MjgwOGIwOTJjYzU4NGQ5NWZmM2I1MTE0ODhlNGU3NGVmZGY2ZTcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTgwZmVhMTQ0NDFmYjMzYTdkOGFkYWI5NDc1ZDdmYWIyMDE5ZWZmYjUxNTZhNzkyZjFhMTE3NzhlM2MwZGY1ZCcsXG4gICAgICAgICdlZWQxZGU3ZjYzOGUwMDc3MWU4OTc2OGNhM2NhOTQ0NzJkMTU1ZTgwYWYzMjJlYTlmY2I0MjkxYjZhYzllYzc4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2EzMDE2OTdiZGZjZDcwNDMxM2JhNDhlNTFkNTY3NTQzZjJhMTgyMDMxZWZkNjkxNWRkYzA3YmJjYzRlMTYwNzAnLFxuICAgICAgICAnNzM3MGY5MWNmYjY3ZTRmNTA4MTgwOWZhMjVkNDBmOWIxNzM1ZGJmN2MwYTExYTEzMGMwZDFhMDQxZTE3N2VhMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5MGFkODViMzg5ZDZiOTM2NDYzZjlkMDUxMjY3OGRlMjA4Y2MzMzBiMTEzMDdmZmZhYjdhYzYzZTNmYjA0ZWQ0JyxcbiAgICAgICAgJ2U1MDdhMzYyMGEzODI2MWFmZmRjYmQ5NDI3MjIyYjgzOWFlZmFiZTE1ODI4OTRkOTkxZDRkNDhjYjZlZjE1MCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZjY4YjlkMmY2M2I1ZjMzOTIzOWMxYWQ5ODFmMTYyZWU4OGM1Njc4NzIzZWEzMzUxYjdiNDQ0YzllYzRjMGRhJyxcbiAgICAgICAgJzY2MmE5ZjJkYmEwNjM5ODZkZTFkOTBjMmI2YmUyMTVkYmJlYTJjZmU5NTUxMGJmZGYyM2NiZjc5NTAxZmZmODInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTRmM2ZiMDE3NmFmODVkNjVmZjk5ZmY5MTk4YzM2MDkxZjQ4ZTg2NTAzNjgxZTNlNjY4NmZkNTA1MzIzMWUxMScsXG4gICAgICAgICcxZTYzNjMzYWQwZWY0ZjFjMTY2MWE2ZDBlYTAyYjcyODZjYzdlNzRlYzk1MWQxYzk4MjJjMzg1NzZmZWI3M2JjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhjMDBmYTliMThlYmYzMzFlYjk2MTUzN2E0NWE0MjY2YzcwMzRmMmYwZDRlMWQwNzE2ZmI2ZWFlMjBlYWUyOWUnLFxuICAgICAgICAnZWZhNDcyNjdmZWE1MjFhMWE5ZGMzNDNhMzczNmM5NzRjMmZhZGFmYTgxZTM2YzU0ZTdkMmE0YzY2NzAyNDE0YidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlN2EyNmNlNjlkZDQ4MjlmM2UxMGNlYzBhOWU5OGVkMzE0M2QwODRmMzA4YjkyYzA5OTdmZGRmYzYwY2IzZTQxJyxcbiAgICAgICAgJzJhNzU4ZTMwMGZhNzk4NGI0NzFiMDA2YTFhYWZiYjE4ZDBhNmIyYzA0MjBlODNlMjBlOGE5NDIxY2YyY2ZkNTEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYjY0NTllMGVlMzY2MmVjOGQyMzU0MGMyMjNiY2JkYzU3MWNiY2I5NjdkNzk0MjRmM2NmMjllYjNkZTZiODBlZicsXG4gICAgICAgICc2N2M4NzZkMDZmM2UwNmRlMWRhZGYxNmU1NjYxZGIzYzRiM2FlNmQ0OGUzNWIyZmYzMGJmMGI2MWE3MWJhNDUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDY4YTgwYzgyODBiYjg0MDc5MzIzNGFhMTE4ZjA2MjMxZDZmMWZjNjdlNzNjNWE1ZGVkYTBmNWI0OTY5NDNlOCcsXG4gICAgICAgICdkYjhiYTlmZmY0YjU4NmQwMGM0YjFmOTE3N2IwZTI4YjViMGU3YjhmNzg0NTI5NWEyOTRjODQyNjZiMTMzMTIwJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyNGFlZDdkZjY1YzgwNDI1MmRjMDI3MDkwN2EzMGIwOTYxMmFlYjk3MzQ0OWNlYTQwOTU5ODBmYzI4ZDNkNWQnLFxuICAgICAgICAnNjQ4YTM2NTc3NGI2MWYyZmYxMzBjMGMzNWFlYzFmNGYxOTIxM2IwYzdlMzMyODQzOTY3MjI0YWY5NmFiN2M4NCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ZGY5YzE0OTE5Y2RlNjFmNmQ1MWRmZGJlNWZlZTVkY2VlYzQxNDNiYThkMWNhODg4ZThiZDM3M2ZkMDU0Yzk2JyxcbiAgICAgICAgJzM1ZWM1MTA5MmQ4NzI4MDUwOTc0YzIzYTFkODVkNGI1ZDUwNmNkYzI4ODQ5MDE5MmViYWMwNmNhZDEwZDVkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzljMzkxOWE4NGE0NzQ4NzBmYWVkOGE5YzFjYzY2MDIxNTIzNDg5MDU0ZDdmMDMwOGNiZmM5OWM4YWMxZjk4Y2QnLFxuICAgICAgICAnZGRiODRmMGY0YTRkZGQ1NzU4NGYwNDRiZjI2MGU2NDE5MDUzMjZmNzZjNjRjOGU2YmU3ZTVlMDNkNGZjNTk5ZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MDU3MTcwYjFkZDEyZmRmOGRlMDVmMjgxZDhlMDZiYjkxZTE0OTNhOGI5MWQ0Y2M1YTIxMzgyMTIwYTk1OWU1JyxcbiAgICAgICAgJzlhMWFmMGIyNmE2YTQ4MDdhZGQ5YTJkYWY3MWRmMjYyNDY1MTUyYmMzZWUyNGM2NWU4OTliZTkzMjM4NWEyYTgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTU3NmRmOGUyM2EwODQxMTQyMTQzOWE0NTE4ZGEzMTg4MGNlZjBmYmE3ZDRkZjEyYjFhNjk3M2VlY2I5NDI2NicsXG4gICAgICAgICc0MGE2YmYyMGU3NjY0MGIyYzkyYjk3YWZlNThjZDgyYzQzMmUxMGE3ZjUxNGQ5ZjNlZThiZTExYWUxYjI4ZWM4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NzhhNzhjMjhkZWMzZTMwYTA1ZmU5NjI5ZGU4YzM4YmIzMGQxZjVjZjlhM2EyMDhmNzYzODg5YmU1OGFkNzEnLFxuICAgICAgICAnMzQ2MjZkOWFiNWE1YjIyZmY3MDk4ZTEyZjJmZjU4MDA4N2IzODQxMWZmMjRhYzU2M2I1MTNmYzFmZDlmNDNhYydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5Mjg5NTVlZTYzN2E4NDQ2MzcyOWZkMzBlN2FmZDJlZDVmOTYyNzRlNWFkN2U1Y2IwOWVkYTljMDZkOTAzYWMnLFxuICAgICAgICAnYzI1NjIxMDAzZDNmNDJhODI3Yjc4YTEzMDkzYTk1ZWVhYzNkMjZlZmE4YThkODNmYzUxODBlOTM1YmNkMDkxZidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NWQwZmVmM2VjNmRiMTA5Mzk5MDY0ZjNhMGUzYjI4NTU2NDViNGE5MDdhZDM1NDUyN2FhZTc1MTYzZDgyNzUxJyxcbiAgICAgICAgJzFmMDM2NDg0MTNhMzhjMGJlMjlkNDk2ZTU4MmNmNTY2M2U4NzUxZTk2ODc3MzMxNTgyYzIzN2EyNGViMWY5NjInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmYyYjBkY2U5N2VlY2U5N2MxYzliNjA0MTc5OGI4NWRmZGZiNmQ4ODgyZGEyMDMwOGY1NDA0ODI0NTI2MDg3ZScsXG4gICAgICAgICc0OTNkMTNmZWY1MjRiYTE4OGFmNGM0ZGM1NGQwNzkzNmM3YjdlZDZmYjkwZTJjZWIyYzk1MWUwMWYwYzI5OTA3J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgyN2ZiYmU0YjFlODgwZWE5ZWQyYjJlNjMwMWIyMTJiNTdmMWVlMTQ4Y2Q2ZGQyODc4MGU1ZTJjZjg1NmUyNDEnLFxuICAgICAgICAnYzYwZjljOTIzYzcyN2IwYjcxYmVmMmM2N2QxZDEyNjg3ZmY3YTYzMTg2OTAzMTY2ZDYwNWI2OGJhZWMyOTNlYydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYWE2NDlmMjFmNTFiZGJhZTdiZTRhZTM0Y2U2ZTUyMTdhNThmZGNlN2Y0N2Y5YWE3ZjNiNThmYTIxMjBlMmIzJyxcbiAgICAgICAgJ2JlMzI3OWVkNWJiYmIwM2FjNjlhODBmODk4NzlhYTVhMDFhNmI5NjVmMTNmN2U1OWQ0N2E1MzA1YmE1YWQ5M2QnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTRhNDJkNDNjNWNmMTY5ZDkzOTFkZjZkZWNmNDJlZTU0MWI2ZDhmMGM5YTEzNzQwMWUyMzYzMmRkYTM0ZDI0ZicsXG4gICAgICAgICc0ZDlmOTJlNzE2ZDFjNzM1MjZmYzk5Y2NmYjhhZDM0Y2U4ODZlZWRmYThkOGU0ZjEzYTdmNzEzMWRlYmE5NDE0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzFlYzgwZmVmMzYwY2JkZDk1NDE2MGZhZGFiMzUyYjZiOTJiNTM1NzZhODhmZWE0OTQ3MTczYjlkNDMwMGJmMTknLFxuICAgICAgICAnYWVlZmU5Mzc1NmI1MzQwZDJmM2E0OTU4YTdhYmJmNWUwMTQ2ZTc3ZjYyOTVhMDdiNjcxY2RjMWNjMTA3Y2VmZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNDZhNzc4YzA0NjcwYzJmOTFiMDBhZjQ2ODBkZmE4YmNlMzQ5MDcxN2Q1OGJhODg5ZGRiNTkyODM2NjY0MmJlJyxcbiAgICAgICAgJ2IzMThlMGVjMzM1NDAyOGFkZDY2OTgyN2Y5ZDRiMjg3MGFhYTk3MWQyZjdlNWVkMWQwYjI5NzQ4M2Q4M2VmZDAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmE1MGMwZjYxZDIyZTVmMDdlM2FjZWJiMWFhMDdiMTI4ZDAwMTIyMDlhMjhiOTc3NmQ3NmE4NzkzMTgwZWVmOScsXG4gICAgICAgICc2Yjg0YzY5MjIzOTdlYmE5YjcyY2QyODcyMjgxYTY4YTVlNjgzMjkzYTU3YTIxM2IzOGNkOGQ3ZDNmNGYyODExJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhMWQ2MWQwY2E3MjFhMTFiMWE1YmY2YjdkODhlODQyMWEyODhhYjVkNWJiYTUyMjBlNTNkMzJiNWYwNjdlYzInLFxuICAgICAgICAnODE1N2Y1NWE3Yzk5MzA2Yzc5YzA3NjYxNjFjOTFlMjk2NmE3Mzg5OWQyNzliNDhhNjU1ZmJhMGYxYWQ4MzZmMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhOGUyODJmZjBjOTcwNjkwNzIxNWZmOThlOGZkNDE2NjE1MzExZGUwNDQ2ZjFlMDYyYTczYjA2MTBkMDY0ZTEzJyxcbiAgICAgICAgJzdmOTczNTViOGRiODFjMDlhYmZiN2YzYzViMjUxNTg4OGI2NzlhM2U1MGRkNmJkNmNlZjdjNzMxMTFmNGNjMGMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTc0YTUzYjljOWEyODU4NzJkMzllNTZlNjkxM2NhYjE1ZDU5YjFmYTUxMjUwOGMwMjJmMzgyZGU4MzE5NDk3YycsXG4gICAgICAgICdjY2M5ZGMzN2FiZmM5YzE2NTdiNDE1NWYyYzQ3ZjllNjY0NmIzYTFkOGNiOTg1NDM4M2RhMTNhYzA3OWFmYTczJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk1OTM5Njk4MTk0Mzc4NWMzZDNlNTdlZGY1MDE4Y2RiZTAzOWU3MzBlNDkxOGIzZDg4NGZkZmYwOTQ3NWI3YmEnLFxuICAgICAgICAnMmU3ZTU1Mjg4OGMzMzFkZDhiYTAzODZhNGI5Y2Q2ODQ5YzY1M2Y2NGM4NzA5Mzg1ZTliOGFiZjg3NTI0ZjJmZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkMmE2M2E1MGFlNDAxZTU2ZDY0NWExMTUzYjEwOWE4ZmNjYTBhNDNkNTYxZmJhMmRiYjUxMzQwYzlkODJiMTUxJyxcbiAgICAgICAgJ2U4MmQ4NmZiNjQ0M2ZjYjc1NjVhZWU1OGIyOTQ4MjIwYTcwZjc1MGFmNDg0Y2E1MmQ0MTQyMTc0ZGNmODk0MDUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjQ1ODdlMjMzNTQ3MWViODkwZWU3ODk2ZDdjZmRjODY2YmFjYmRiZDM4MzkzMTdiMzQzNmY5YjQ1NjE3ZTA3MycsXG4gICAgICAgICdkOTlmY2RkNWJmNjkwMmUyYWU5NmRkNjQ0N2MyOTlhMTg1YjkwYTM5MTMzYWVhYjM1ODI5OWU1ZTlmYWY2NTg5J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg0ODFiZGUwZTRlNGQ4ODViM2E1NDZkM2U1NDlkZTA0MmYwYWE2Y2VhMjUwZTdmZDM1OGQ2Yzg2ZGQ0NWU0NTgnLFxuICAgICAgICAnMzhlZTdiOGNiYTU0MDRkZDg0YTI1YmYzOWNlY2IyY2E5MDBhNzljNDJiMjYyZTU1NmQ2NGIxYjU5Nzc5MDU3ZSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxMzQ2NGE1N2E3ODEwMmFhNjJiNjk3OWFlODE3ZjQ2MzdmZmNmZWQzYzRiMWNlMzBiY2Q2MzAzZjZjYWY2NjZiJyxcbiAgICAgICAgJzY5YmUxNTkwMDQ2MTQ1ODBlZjdlNDMzNDUzY2NiMGNhNDhmMzAwYTgxZDA5NDJlMTNmNDk1YTkwN2Y2ZWNjMjcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYmM0YTlkZjViNzEzZmUyZTlhZWY0MzBiY2MxZGM5N2EwY2Q5Y2NlZGUyZjI4NTg4Y2FkYTNhMGQyZDgzZjM2NicsXG4gICAgICAgICdkM2E4MWNhNmU3ODVjMDYzODM5MzdhZGY0Yjc5OGNhYTZlOGE5ZmJmYTU0N2IxNmQ3NThkNjY2NTgxZjMzYzEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGMyOGE5N2JmODI5OGJjMGQyM2Q4Yzc0OTQ1MmEzMmU2OTRiNjVlMzBhOTQ3MmEzOTU0YWIzMGZlNTMyNGNhYScsXG4gICAgICAgICc0MGEzMDQ2M2EzMzA1MTkzMzc4ZmVkZjMxZjdjYzBlYjdhZTc4NGYwNDUxY2I5NDU5ZTcxZGM3M2NiZWY5NDgyJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhlYTk2NjYxMzk1MjdhOGMxZGQ5NGNlNGYwNzFmZDIzYzhiMzUwYzVhNGJiMzM3NDhjNGJhMTExZmFjY2FlMCcsXG4gICAgICAgICc2MjBlZmFiYmM4ZWUyNzgyZTI0ZTdjMGNmYjk1YzVkNzM1Yjc4M2JlOWNmMGY4ZTk1NWFmMzRhMzBlNjJiOTQ1J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RkMzYyNWZhZWY1YmEwNjA3NDY2OTcxNmJiZDM3ODhkODliZGRlODE1OTU5OTY4MDkyZjc2Y2M0ZWI5YTk3ODcnLFxuICAgICAgICAnN2ExODhmYTM1MjBlMzBkNDYxZGEyNTAxMDQ1NzMxY2E5NDE0NjE5ODI4ODMzOTU5MzdmNjhkMDBjNjQ0YTU3MydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmNzEwZDc5ZDllYjk2MjI5N2U0ZjYyMzJiNDBlOGY3ZmViMmJjNjM4MTQ2MTRkNjkyYzEyZGU3NTI0MDgyMjFlJyxcbiAgICAgICAgJ2VhOThlNjcyMzJkM2IzMjk1ZDNiNTM1NTMyMTE1Y2NhYzg2MTJjNzIxODUxNjE3NTI2YWU0N2E5Yzc3YmZjODInXG4gICAgICBdXG4gICAgXVxuICB9LFxuICBuYWY6IHtcbiAgICB3bmQ6IDcsXG4gICAgcG9pbnRzOiBbXG4gICAgICBbXG4gICAgICAgICdmOTMwOGEwMTkyNThjMzEwNDkzNDRmODVmODlkNTIyOWI1MzFjODQ1ODM2Zjk5YjA4NjAxZjExM2JjZTAzNmY5JyxcbiAgICAgICAgJzM4OGY3YjBmNjMyZGU4MTQwZmUzMzdlNjJhMzdmMzU2NjUwMGE5OTkzNGMyMjMxYjZjYjlmZDc1ODRiOGU2NzInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMmY4YmRlNGQxYTA3MjA5MzU1YjRhNzI1MGE1YzUxMjhlODhiODRiZGRjNjE5YWI3Y2JhOGQ1NjliMjQwZWZlNCcsXG4gICAgICAgICdkOGFjMjIyNjM2ZTVlM2Q2ZDRkYmE5ZGRhNmM5YzQyNmY3ODgyNzFiYWIwZDY4NDBkY2E4N2QzYWE2YWM2MmQ2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzVjYmRmMDY0NmU1ZGI0ZWFhMzk4ZjM2NWYyZWE3YTBlM2Q0MTliN2UwMzMwZTM5Y2U5MmJkZGVkY2FjNGY5YmMnLFxuICAgICAgICAnNmFlYmNhNDBiYTI1NTk2MGEzMTc4ZDZkODYxYTU0ZGJhODEzZDBiODEzZmRlN2I1YTUwODI2MjgwODcyNjRkYSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhY2Q0ODRlMmYwYzdmNjUzMDlhZDE3OGE5ZjU1OWFiZGUwOTc5Njk3NGM1N2U3MTRjMzVmMTEwZGZjMjdjY2JlJyxcbiAgICAgICAgJ2NjMzM4OTIxYjBhN2Q5ZmQ2NDM4MDk3MTc2M2I2MWU5YWRkODg4YTQzNzVmOGUwZjA1Y2MyNjJhYzY0ZjljMzcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzc0YWU3Zjg1OGE5NDExZTVlZjQyNDZiNzBjNjVhYWM1NjQ5OTgwYmU1YzE3ODkxYmJlYzE3ODk1ZGEwMDhjYicsXG4gICAgICAgICdkOTg0YTAzMmViNmI1ZTE5MDI0M2RkNTZkN2I3YjM2NTM3MmRiMWUyZGZmOWQ2YTgzMDFkNzRjOWM5NTNjNjFiJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YyODc3M2MyZDk3NTI4OGJjN2QxZDIwNWMzNzQ4NjUxYjA3NWZiYzY2MTBlNThjZGRlZWRkZjhmMTk0MDVhYTgnLFxuICAgICAgICAnYWIwOTAyZThkODgwYTg5NzU4MjEyZWI2NWNkYWY0NzNhMWEwNmRhNTIxZmE5MWYyOWI1Y2I1MmRiMDNlZDgxJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q3OTI0ZDRmN2Q0M2VhOTY1YTQ2NWFlMzA5NWZmNDExMzFlNTk0NmYzYzg1Zjc5ZTQ0YWRiY2Y4ZTI3ZTA4MGUnLFxuICAgICAgICAnNTgxZTI4NzJhODZjNzJhNjgzODQyZWMyMjhjYzZkZWZlYTQwYWYyYmQ4OTZkM2E1YzUwNGRjOWZmNmEyNmI1OCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZWZkZWE0Y2RiNjc3NzUwYTQyMGZlZTgwN2VhY2YyMWViOTg5OGFlNzliOTc2ODc2NmU0ZmFhMDRhMmQ0YTM0JyxcbiAgICAgICAgJzQyMTFhYjA2OTQ2MzUxNjhlOTk3YjBlYWQyYTkzZGFlY2VkMWY0YTA0YTk1YzBmNmNmYjE5OWY2OWU1NmViNzcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMmI0ZWEwYTc5N2E0NDNkMjkzZWY1Y2ZmNDQ0ZjQ5NzlmMDZhY2ZlYmQ3ZTg2ZDI3NzQ3NTY1NjEzODM4NWI2YycsXG4gICAgICAgICc4NWU4OWJjMDM3OTQ1ZDkzYjM0MzA4M2I1YTFjODYxMzFhMDFmNjBjNTAyNjk3NjNiNTcwYzg1NGU1YzA5YjdhJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM1MmJiZjRhNGNkZDEyNTY0ZjkzZmEzMzJjZTMzMzMwMWQ5YWQ0MDI3MWY4MTA3MTgxMzQwYWVmMjViZTU5ZDUnLFxuICAgICAgICAnMzIxZWI0MDc1MzQ4ZjUzNGQ1OWMxODI1OWRkYTNlMWY0YTFiM2IyZTcxYjEwMzljNjdiZDNkOGJjZjgxOTk4YydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyZmEyMTA0ZDZiMzhkMTFiMDIzMDAxMDU1OTg3OTEyNGU0MmFiOGRmZWZmNWZmMjlkYzljZGFkZDRlY2FjYzNmJyxcbiAgICAgICAgJzJkZTEwNjgyOTVkZDg2NWI2NDU2OTMzNWJkNWRkODAxODFkNzBlY2ZjODgyNjQ4NDIzYmE3NmI1MzJiN2Q2NydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5MjQ4Mjc5YjA5YjRkNjhkYWIyMWE5YjA2NmVkZGE4MzI2M2MzZDg0ZTA5NTcyZTI2OWNhMGNkN2Y1NDUzNzE0JyxcbiAgICAgICAgJzczMDE2ZjdiZjIzNGFhZGU1ZDFhYTcxYmRlYTJiMWZmM2ZjMGRlMmE4ODc5MTJmZmU1NGEzMmNlOTdjYjM0MDInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGFlZDRmMmJlM2E4YmYyNzhlNzAxMzJmYjBiZWI3NTIyZjU3MGUxNDRiZjYxNWMwN2U5OTZkNDQzZGVlODcyOScsXG4gICAgICAgICdhNjlkY2U0YTdkNmM5OGU4ZDRhMWFjYTg3ZWY4ZDcwMDNmODNjMjMwZjNhZmE3MjZhYjQwZTUyMjkwYmUxYzU1J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M0NGQxMmM3MDY1ZDgxMmU4YWNmMjhkN2NiYjE5ZjkwMTFlY2Q5ZTlmZGYyODFiMGU2YTNiNWU4N2QyMmU3ZGInLFxuICAgICAgICAnMjExOWE0NjBjZTMyNmNkYzc2YzQ1OTI2Yzk4MmZkYWMwZTEwNmU4NjFlZGY2MWM1YTAzOTA2M2YwZTBlNjQ4MidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2YTI0NWJmNmRjNjk4NTA0Yzg5YTIwY2ZkZWQ2MDg1MzE1MmI2OTUzMzZjMjgwNjNiNjFjNjVjYmQyNjllNmI0JyxcbiAgICAgICAgJ2UwMjJjZjQyYzJiZDRhNzA4YjNmNTEyNmYxNmEyNGFkOGIzM2JhNDhkMDQyM2I2ZWZkNWU2MzQ4MTAwZDhhODInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTY5N2ZmYTZmZDlkZTYyN2MwNzdlM2QyZmU1NDEwODRjZTEzMzAwYjBiZWMxMTQ2Zjk1YWU1N2YwZDBiZDZhNScsXG4gICAgICAgICdiOWMzOThmMTg2ODA2ZjVkMjc1NjE1MDZlNDU1NzQzM2EyY2YxNTAwOWU0OThhZTdhZGVlOWQ2M2QwMWIyMzk2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYwNWJkYjAxOTk4MTcxOGI5ODZkMGYwN2U4MzRjYjBkOWRlYjgzNjBmZmI3ZjYxZGY5ODIzNDVlZjI3YTc0NzknLFxuICAgICAgICAnMjk3MmQyZGU0ZjhkMjA2ODFhNzhkOTNlYzk2ZmUyM2MyNmJmYWU4NGZiMTRkYjQzYjAxZTFlOTA1NmI4YzQ5J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYyZDE0ZGFiNDE1MGJmNDk3NDAyZmRjNDVhMjE1ZTEwZGNiMDFjMzU0OTU5YjEwY2ZlMzFjN2U5ZDg3ZmYzM2QnLFxuICAgICAgICAnODBmYzA2YmQ4Y2M1YjAxMDk4MDg4YTE5NTBlZWQwZGIwMWFhMTMyOTY3YWI0NzIyMzVmNTY0MjQ4M2IyNWVhZidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4MGM2MGFkMDA0MGYyN2RhZGU1YjRiMDZjNDA4ZTU2YjJjNTBlOWY1NmI5YjhiNDI1ZTU1NWMyZjg2MzA4YjZmJyxcbiAgICAgICAgJzFjMzgzMDNmMWNjNWMzMGYyNmU2NmJhZDdmZTcyZjcwYTY1ZWVkNGNiZTcwMjRlYjFhYTAxZjU2NDMwYmQ1N2EnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnN2E5Mzc1YWQ2MTY3YWQ1NGFhNzRjNjM0OGNjNTRkMzQ0Y2M1ZGM5NDg3ZDg0NzA0OWQ1ZWFiYjBmYTAzYzhmYicsXG4gICAgICAgICdkMGUzZmE5ZWNhODcyNjkwOTU1OWUwZDc5MjY5MDQ2YmRjNTllYTEwYzcwY2UyYjAyZDQ5OWVjMjI0ZGM3ZjcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDUyOGVjZDliNjk2YjU0YzkwN2E5ZWQwNDU0NDdhNzliYjQwOGVjMzliNjhkZjUwNGJiNTFmNDU5YmMzZmZjOScsXG4gICAgICAgICdlZWNmNDEyNTMxMzZlNWY5OTk2NmYyMTg4MWZkNjU2ZWJjNDM0NTQwNWM1MjBkYmMwNjM0NjViNTIxNDA5OTMzJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ5MzcwYTRiNWY0MzQxMmVhMjVmNTE0ZThlY2RhZDA1MjY2MTE1ZTRhN2VjYjEzODcyMzE4MDhmOGI0NTk2MycsXG4gICAgICAgICc3NThmM2Y0MWFmZDZlZDQyOGIzMDgxYjA1MTJmZDYyYTU0YzNmM2FmYmI1YjY3NjRiNjUzMDUyYTEyOTQ5YzlhJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3ZjIzMDkzNmVlODhjYmJkNzNkZjkzMGQ2NDcwMmVmODgxZDgxMWUwZTE0OThlMmYxYzEzZWIxZmMzNDVkNzQnLFxuICAgICAgICAnOTU4ZWY0MmE3ODg2YjY0MDBhMDgyNjZlOWJhMWIzNzg5NmM5NTMzMGQ5NzA3N2NiYmU4ZWIzYzc2NzFjNjBkNidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMmRhYzk5MWNjNGNlNGI5ZWE0NDg4N2U1YzdjMGJjZTU4YzgwMDc0YWI5ZDRkYmFlYjI4NTMxYjc3MzlmNTMwJyxcbiAgICAgICAgJ2UwZGVkYzliM2IyZjhkYWQ0ZGExZjMyZGVjMjUzMWRmOWViNWZiZWIwNTk4ZTRmZDFhMTE3ZGJhNzAzYTNjMzcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDYzYjNkOWY2NjI2MjFmYjFiNGJlOGZiYmUyNTIwMTI1YTIxNmNkZmM5ZGFlM2RlYmNiYTQ4NTBjNjkwZDQ1YicsXG4gICAgICAgICc1ZWQ0MzBkNzhjMjk2YzM1NDMxMTQzMDZkZDg2MjJkN2M2MjJlMjdjOTcwYTFkZTMxY2IzNzdiMDFhZjczMDdlJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YxNmY4MDQyNDRlNDZlMmEwOTIzMmQ0YWZmM2I1OTk3NmI5OGZhYzE0MzI4YTJkMWEzMjQ5NmI0OTk5OGYyNDcnLFxuICAgICAgICAnY2VkYWJkOWI4MjIwM2Y3ZTEzZDIwNmZjZGY0ZTMzZDkyYTZjNTNjMjZlNWNjZTI2ZDY1Nzk5NjJjNGUzMWRmNidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjYWY3NTQyNzJkYzg0NTYzYjAzNTJiN2ExNDMxMWFmNTVkMjQ1MzE1YWNlMjdjNjUzNjllMTVmNzE1MWQ0MWQxJyxcbiAgICAgICAgJ2NiNDc0NjYwZWYzNWY1ZjJhNDFiNjQzZmE1ZTQ2MDU3NWY0ZmE5Yjc5NjIyMzJhNWMzMmY5MDgzMThhMDQ0NzYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjYwMGNhNGIyODJjYjk4NmY4NWQwZjE3MDk5NzlkOGI0NGEwOWMwN2NiODZkN2MxMjQ0OTdiYzg2ZjA4MjEyMCcsXG4gICAgICAgICc0MTE5Yjg4NzUzYzE1YmQ2YTY5M2IwM2ZjZGRiYjQ1ZDVhYzZiZTc0YWI1ZjBlZjQ0YjBiZTk0NzVhN2U0YjQwJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2MzVjYTcyZDdlODQzMmMzMzhlYzUzY2QxMjIyMGJjMDFjNDg2ODVlMjRmN2RjOGM2MDJhNzc0Njk5OGU0MzUnLFxuICAgICAgICAnOTFiNjQ5NjA5NDg5ZDYxM2QxZDVlNTkwZjc4ZTZkNzRlY2ZjMDYxZDU3MDQ4YmFkOWU3NmYzMDJjNWI5YzYxJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc1NGUzMjM5ZjMyNTU3MGNkYmJmNGE4N2RlZWU4YTY2YjdmMmIzMzQ3OWQ0NjhmYmMxYTUwNzQzYmY1NmNjMTgnLFxuICAgICAgICAnNjczZmI4NmU1YmRhMzBmYjNjZDBlZDMwNGVhNDlhMDIzZWUzM2QwMTk3YTY5NWQwYzVkOTgwOTNjNTM2NjgzJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UzZTZiZDEwNzFhMWU5NmFmZjU3ODU5YzgyZDU3MGYwMzMwODAwNjYxZDFjOTUyZjlmZTI2OTQ2OTFkOWI5ZTgnLFxuICAgICAgICAnNTljOWUwYmJhMzk0ZTc2ZjQwYzBhYTU4Mzc5YTNjYjZhNWEyMjgzOTkzZTkwYzQxNjcwMDJhZjQ5MjBlMzdmNSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxODZiNDgzZDA1NmEwMzM4MjZhZTczZDg4ZjczMjk4NWM0Y2NiMWYzMmJhMzVmNGI0Y2M0N2ZkY2YwNGFhNmViJyxcbiAgICAgICAgJzNiOTUyZDMyYzY3Y2Y3N2UyZTE3NDQ2ZTIwNDE4MGFiMjFmYjgwOTA4OTUxMzhiNGE0YTc5N2Y4NmU4MDg4OGInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGY5ZDcwYTZiOTg3NmNlNTQ0Yzk4NTYxZjRiZTRmNzI1NDQyZTZkMmI3MzdkOWM5MWE4MzIxNzI0Y2UwOTYzZicsXG4gICAgICAgICc1NWViMmRhZmQ4NGQ2Y2NkNWY4NjJiNzg1ZGMzOWQ0YWIxNTcyMjI3MjBlZjlkYTIxN2I4YzQ1Y2YyYmEyNDE3J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzVlZGQ1Y2MyM2M1MWU4N2E0OTdjYTgxNWQ1ZGNlMGY4YWI1MjU1NGY4NDllZDg5OTVkZTY0YzVmMzRjZTcxNDMnLFxuICAgICAgICAnZWZhZTljOGRiYzE0MTMwNjYxZThjZWMwMzBjODlhZDBjMTNjNjZjMGQxN2EyOTA1Y2RjNzA2YWI3Mzk5YTg2OCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyOTA3OThjMmI2NDc2ODMwZGExMmZlMDIyODdlOWU3NzdhYTNmYmExYzM1NWIxN2E3MjJkMzYyZjg0NjE0ZmJhJyxcbiAgICAgICAgJ2UzOGRhNzZkY2Q0NDA2MjE5ODhkMDBiY2Y3OWFmMjVkNWIyOWMwOTRkYjJhMjMxNDZkMDAzYWZkNDE5NDNlN2EnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYWYzYzQyM2E5NWQ5ZjViMzA1NDc1NGVmYTE1MGFjMzljZDI5NTUyZmUzNjAyNTczNjJkZmRlY2VmNDA1M2I0NScsXG4gICAgICAgICdmOThhM2ZkODMxZWIyYjc0OWE5M2IwZTZmMzVjZmI0MGM4Y2Q1YWE2NjdhMTU1ODFiYzJmZWRlZDQ5OGZkOWM2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2NmRiYjI0ZDEzNGU3NDVjY2NhYTI4Yzk5YmYyNzQ5MDZiYjY2YjI2ZGNmOThkZjhkMmZlZDUwZDg4NDI0OWEnLFxuICAgICAgICAnNzQ0YjExNTJlYWNiZTVlMzhkY2M4ODc5ODBkYTM4Yjg5NzU4NGE2NWZhMDZjZWRkMmM5MjRmOTdjYmFjNTk5NidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1OWRiZjQ2ZjhjOTQ3NTliYTIxMjc3YzMzNzg0ZjQxNjQ1ZjdiNDRmNmM1OTZhNThjZTkyZTY2NjE5MWFiZTNlJyxcbiAgICAgICAgJ2M1MzRhZDQ0MTc1ZmJjMzAwZjRlYTZjZTY0ODMwOWEwNDJjZTczOWE3OTE5Nzk4Y2Q4NWUyMTZjNGEzMDdmNmUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjEzYWRhOTUxMDNjNDUzNzMwNWU2OTFlNzRlOWE0YThkZDY0N2U3MTFhOTVlNzNjYjYyZGM2MDE4Y2ZkODdiOCcsXG4gICAgICAgICdlMTM4MTdiNDRlZTE0ZGU2NjNiZjRiYzgwODM0MWYzMjY5NDllMjFhNmE3NWMyNTcwNzc4NDE5YmRhZjU3MzNkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NTRiNGZhMGU4YWNlZDA2ZDQxNjdhMmM1OWNjYTRjZGExODY5YzA2ZWJhZGZiNjQ4ODU1MDAxNWE4ODUyMmMnLFxuICAgICAgICAnMzBlOTNlODY0ZTY2OWQ4MjIyNGI5NjdjMzAyMGI4ZmE4ZDFlNGUzNTBiNmNiY2M1MzdhNDhiNTc4NDExNjNhMidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5NDhkY2FkZjU5OTBlMDQ4YWEzODc0ZDQ2YWJlZjlkNzAxODU4Zjk1ZGU4MDQxZDJhNjgyOGM5OWUyMjYyNTE5JyxcbiAgICAgICAgJ2U0OTFhNDI1MzdmNmU1OTdkNWQyOGEzMjI0YjFiYzI1ZGY5MTU0ZWZiZDJlZjFkMmNiYmEyY2FlNTM0N2Q1N2UnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzk2MjQxNDQ1MGM3NmMxNjg5YzdiNDhmODIwMmVjMzdmYjIyNGNmNWFjMGJmYTE1NzAzMjhhOGEzZDdjNzdhYicsXG4gICAgICAgICcxMDBiNjEwZWM0ZmZiNDc2MGQ1YzFmYzEzM2VmNmY2YjEyNTA3YTA1MWYwNGFjNTc2MGFmYTViMjlkYjgzNDM3J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM1MTQwODc4MzQ5NjRiNTRiMTViMTYwNjQ0ZDkxNTQ4NWExNjk3NzIyNWI4ODQ3YmIwZGQwODUxMzdlYzQ3Y2EnLFxuICAgICAgICAnZWYwYWZiYjIwNTYyMDU0NDhlMTY1MmM0OGU4MTI3ZmM2MDM5ZTc3YzE1YzIzNzhiN2U3ZDE1YTBkZTI5MzMxMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkM2NjMzBhZDZiNDgzZTRiYzc5Y2UyYzlkZDhiYzU0OTkzZTk0N2ViOGRmNzg3YjQ0Mjk0M2QzZjdiNTI3ZWFmJyxcbiAgICAgICAgJzhiMzc4YTIyZDgyNzI3OGQ4OWM1ZTliZThmOTUwOGFlM2MyYWQ0NjI5MDM1ODYzMGFmYjM0ZGIwNGVlZGUwYTQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTYyNGQ4NDc4MDczMjg2MGNlMWM3OGZjYmZlZmUwOGIyYjI5ODIzZGI5MTNmNjQ5Mzk3NWJhMGZmNDg0NzYxMCcsXG4gICAgICAgICc2ODY1MWNmOWI2ZGE5MDNlMDkxNDQ0OGM2Y2Q5ZDRjYTg5Njg3OGY1MjgyYmU0YzhjYzA2ZTJhNDA0MDc4NTc1J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzczM2NlODBkYTk1NWE4YTI2OTAyYzk1NjMzZTYyYTk4NTE5MjQ3NGI1YWYyMDdkYTZkZjdiNGZkNWZjNjFjZDQnLFxuICAgICAgICAnZjU0MzVhMmJkMmJhZGY3ZDQ4NWE0ZDhiOGRiOWZjY2UzZTFlZjhlMDIwMWU0NTc4YzU0NjczYmMxZGM1ZWExZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNWQ5NDQxMjU0OTQ1MDY0Y2YxYTFjMzNiYmQzYjQ5Zjg5NjZjNTA5MjE3MWU2OTllZjI1OGRmYWI4MWMwNDVjJyxcbiAgICAgICAgJ2Q1NmViMzBiNjk0NjNlNzIzNGY1MTM3YjczYjg0MTc3NDM0ODAwYmFjZWJmYzY4NWZjMzdiYmU5ZWZlNDA3MGQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTFkMGZjZjJlYzlkZTY3NWI2MTIxMzZlNWNlNzBkMjcxYzIxNDE3YzlkMmI4YWFhYWMxMzg1OTlkMDcxNzk0MCcsXG4gICAgICAgICdlZGQ3N2Y1MGJjYjVhM2NhYjJlOTA3MzczMDk2NjdmMjY0MTQ2MmE1NDA3MGYzZDUxOTIxMmQzOWMxOTdhNjI5J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UyMmZiZTE1YzBhZjhjY2M1NzgwYzA3MzVmODRkYmU5YTc5MGJhZGVlODI0NWMwNmM3Y2EzNzMzMWNiMzY5ODAnLFxuICAgICAgICAnYTg1NWJhYmFkNWNkNjBjODhiNDMwYTY5ZjUzYTFhN2EzODI4OTE1NDk2NDc5OWJlNDNkMDZkNzdkMzFkYTA2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMxMTA5MWRkOTg2MGU4ZTIwZWUxMzQ3M2MxMTU1ZjVmNjk2MzVlMzk0NzA0ZWFhNzQwMDk0NTIyNDZjZmE5YjMnLFxuICAgICAgICAnNjZkYjY1NmY4N2QxZjA0ZmZmZDFmMDQ3ODhjMDY4MzA4NzFlYzVhNjRmZWVlNjg1YmQ4MGYwYjEyODZkODM3NCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNGMxZmQwNGQzMDFiZTg5YjMxYzA0NDJkM2U2YWMyNDg4MzkyOGI0NWE5MzQwNzgxODY3ZDQyMzJlYzJkYmRmJyxcbiAgICAgICAgJzk0MTQ2ODVlOTdiMWI1OTU0YmQ0NmY3MzAxNzQxMzZkNTdmMWNlZWI0ODc0NDNkYzUzMjE4NTdiYTczYWJlZSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMjE5ZWE1ZDZiNTQ3MDFjMWMxNGRlNWI1NTdlYjQyYThkMTNmM2FiYmNkMDhhZmZjYzJhNWU2YjA0OWI4ZDYzJyxcbiAgICAgICAgJzRjYjk1OTU3ZTgzZDQwYjBmNzNhZjQ1NDRjY2NmNmIxZjRiMDhkM2MwN2IyN2ZiOGQ4YzI5NjJhNDAwNzY2ZDEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDdiODc0MGY3NGE4ZmJhYWIxZjY4M2RiOGY0NWRlMjY1NDNhNTQ5MGJjYTYyNzA4NzIzNjkxMjQ2OWEwYjQ0OCcsXG4gICAgICAgICdmYTc3OTY4MTI4ZDljOTJlZTEwMTBmMzM3YWQ0NzE3ZWZmMTVkYjVlZDNjMDQ5YjM0MTFlMDMxNWVhYTQ1OTNiJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyZDMxYzIyMmY4ZjZmMGVmODZmN2M5OGQzYTMzMzVlYWQ1YmNkMzJhYmRkOTQyODlmZTRkMzA5MWFhODI0YmYnLFxuICAgICAgICAnNWYzMDMyZjU4OTIxNTZlMzljY2QzZDc5MTViOWUxZGEyZTZkYWM5ZTZmMjZlOTYxMTE4ZDE0Yjg0NjJlMTY2MSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NDYxZjM3MTkxNGFiMzI2NzEwNDVhMTU1ZDk4MzFlYTg3OTNkNzdjZDU5NTkyYzQzNDBmODZjYmMxODM0N2I1JyxcbiAgICAgICAgJzhlYzBiYTIzOGI5NmJlYzBjYmRkZGNhZTBhYTQ0MjU0MmVlZTFmZjUwYzk4NmVhNmIzOTg0N2IzY2MwOTJmZjYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWUwNzlhZGIxZGYxODYwMDc0MzU2YTI1YWEzODIwNmE2ZDcxNmIyYzNlNjc0NTNkMjg3Njk4YmFkN2IyYjJkNicsXG4gICAgICAgICc4ZGMyNDEyYWFmZTNiZTVjNGM1ZjM3ZTBlY2M1ZjlmNmE0NDY5ODlhZjA0YzRlMjVlYmFhYzQ3OWVjMWM4YzFlJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE2ZWM5M2U0NDdlYzgzZjA0NjdiMTgzMDJlZTYyMGY3ZTY1ZGUzMzE4NzRjOWRjNzJiZmQ4NjE2YmE5ZGE2YjUnLFxuICAgICAgICAnNWU0NjMxMTUwZTYyZmI0MGQwZThjMmE3Y2E1ODA0YTM5ZDU4MTg2YTUwZTQ5NzEzOTYyNjc3OGUyNWIwNjc0ZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYWE1Zjk4MGMyNDVmNmYwMzg5NzgyOTBhZmE3MGI2YmQ4ODU1ODk3Zjk4YjZhYTQ4NWI5NjA2NWQ1MzdiZDk5JyxcbiAgICAgICAgJ2Y2NWY1ZDNlMjkyYzJlMDgxOWE1MjgzOTFjOTk0NjI0ZDc4NDg2OWQ3ZTZlYTY3ZmIxODA0MTAyNGVkYzA3ZGMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzhjOTQwNzU0NGFjMTMyNjkyZWUxOTEwYTAyNDM5OTU4YWUwNDg3NzE1MTM0MmVhOTZjNGI2YjM1YTQ5ZjUxJyxcbiAgICAgICAgJ2YzZTAzMTkxNjllYjliODVkNTQwNDc5NTUzOWE1ZTY4ZmExZmJkNTgzYzA2NGQyNDYyYjY3NWYxOTRhM2RkYjQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDk0ZjRiZTIxOWExYTc3MDE2ZGNkODM4NDMxYWVhMDAwMWNkYzhhZTdhNmZjNjg4NzI2NTc4ZDk3MDI4NTdhNScsXG4gICAgICAgICc0MjI0MmE5NjkyODNhNWYzMzliYTdmMDc1ZTM2YmEyYWY5MjVjZTMwZDc2N2VkNmU1NWY0YjAzMTg4MGQ1NjJjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E1OThhODAzMGRhNmQ4NmM2YmM3ZjJmNTE0NGVhNTQ5ZDI4MjExZWE1OGZhYTcwZWJmNGMxZTY2NWMxZmU5YjUnLFxuICAgICAgICAnMjA0YjVkNmY4NDgyMmMzMDdlNGI0YTcxNDA3MzdhZWMyM2ZjNjNiNjViMzVmODZhMTAwMjZkYmQyZDg2NGU2YidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNDE5MTYzNjVhYmIyYjVkMDkxOTJmNWYyZGJlYWZlYzIwOGYwMjBmMTI1NzBhMTg0ZGJhZGMzZTU4NTk1OTk3JyxcbiAgICAgICAgJzRmMTQzNTFkMDA4N2VmYTQ5ZDI0NWIzMjg5ODQ5ODlkNWNhZjk0NTBmMzRiZmMwZWQxNmU5NmI1OGZhOTkxMydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NDFkNjA2M2E1ODZmYTQ3NWE3MjQ2MDRkYTAzYmM1YjkyYTJlMGQyZTBhMzZhY2ZlNGM3M2E1NTE0NzQyODgxJyxcbiAgICAgICAgJzczODY3ZjU5YzA2NTllODE5MDRmOWExYzc1NDM2OThlNjI1NjJkNjc0NGMxNjljZTdhMzZkZTAxYThkNjE1NCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1ZTk1YmIzOTlhNjk3MWQzNzYwMjY5NDdmODliZGUyZjI4MmIzMzgxMDkyOGJlNGRlZDExMmFjNGQ3MGUyMGQ1JyxcbiAgICAgICAgJzM5ZjIzZjM2NjgwOTA4NWJlZWJmYzcxMTgxMzEzNzc1YTk5YzlhZWQ3ZDhiYTM4YjE2MTM4NGM3NDYwMTI4NjUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzZlNDY0MWE1Mzk0OGZkNDc2YzM5ZjhhOTlmZDk3NGU1ZWMwNzU2NGI1MzE1ZDhiZjk5NDcxYmNhMGVmMmY2NicsXG4gICAgICAgICdkMjQyNGIxYjFhYmU0ZWI4MTY0MjI3YjA4NWM5YWE5NDU2ZWExMzQ5M2ZkNTYzZTA2ZmQ1MWNmNTY5NGM3OGZjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMzNjU4MWVhN2JmYmJiMjkwYzE5MWEyZjUwN2E0MWNmNTY0Mzg0MjE3MGU5MTRmYWVhYjI3YzJjNTc5ZjcyNicsXG4gICAgICAgICdlYWQxMjE2ODU5NWZlMWJlOTkyNTIxMjliNmU1NmIzMzkxZjdhYjE0MTBjZDFlMGVmM2RjZGNhYmQyZmRhMjI0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhhYjg5ODE2ZGFkZmQ2YjZhMWYyNjM0ZmNmMDBlYzg0MDM3ODEwMjVlZDY4OTBjNDg0OTc0MjcwNmJkNDNlZGUnLFxuICAgICAgICAnNmZkY2VmMDlmMmY2ZDBhMDQ0ZTY1NGFlZjYyNDEzNmY1MDNkNDU5YzNlODk4NDU4NThhNDdhOTEyOWNkZDI0ZSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxZTMzZjFhNzQ2YzljNTc3ODEzMzM0NGQ5Mjk5ZmNhYTIwYjA5MzhlOGFjZmYyNTQ0YmI0MDI4NGI4YzVmYjk0JyxcbiAgICAgICAgJzYwNjYwMjU3ZGQxMWIzYWE5YzhlZDYxOGQyNGVkZmYyMzA2ZDMyMGYxZDAzMDEwZTMzYTdkMjA1N2YzYjNiNidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NWI3YzFkY2IzY2VjMWI3ZWU3ZjMwZGVkNzlkZDIwYTBlZDFmNGNjMThjYmNmY2ZhNDEwMzYxZmQ4ZjA4ZjMxJyxcbiAgICAgICAgJzNkOThhOWNkZDAyNmRkNDNmMzkwNDhmMjVhODg0N2Y0ZmNhZmFkMTg5NWQ3YTYzM2M2ZmVkM2MzNWU5OTk1MTEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjlkZjlmYmQ4ZDllNDY1MDkyNzVmNGIxMjVkNmQ0NWQ3ZmJlOWEzYjg3OGE3YWY4NzJhMjgwMDY2MWFjNWY1MScsXG4gICAgICAgICdiNGM0ZmU5OWM3NzVhNjA2ZTJkODg2MjE3OTEzOWZmZGE2MWRjODYxYzAxOWU1NWNkMjg3NmViMmEyN2Q4NGInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTBiMWNhZTA2YjBhODQ3YTNmZWE2ZTY3MWFhZjhhZGZkZmU1OGNhMmY3NjgxMDVjODA4MmIyZTQ0OWZjZTI1MicsXG4gICAgICAgICdhZTQzNDEwMmVkZGUwOTU4ZWM0YjE5ZDkxN2E2YTI4ZTZiNzJkYTE4MzRhZmYwZTY1MGYwNDk1MDNhMjk2Y2YyJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRlOGNlYWZiOWIzZTlhMTM2ZGM3ZmY2N2U4NDAyOTViNDk5ZGZiM2IyMTMzZTRiYTExM2YyZTRjMGUxMjFlNScsXG4gICAgICAgICdjZjIxNzQxMThjOGI2ZDdhNGI0OGY2ZDUzNGNlNWM3OTQyMmMwODZhNjM0NjA1MDJiODI3Y2U2MmEzMjY2ODNjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QyNGE0NGUwNDdlMTliNmY1YWZiODFjN2NhMmY2OTA4MGE1MDc2Njg5YTAxMDkxOWY0MjcyNWMyYjc4OWEzM2InLFxuICAgICAgICAnNmZiOGQ1NTkxYjQ2NmY4ZmM2M2RiNTBmMWMwZjFjNjkwMTNmOTk2ODg3YjgyNDRkMmNkZWM0MTdhZmVhOGZhMydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYTAxNjA2YTdhNmM5Y2RkMjQ5ZmRmY2ZhY2I5OTU4NDAwMWVkZDI4YWJiYWI3N2I1MTA0ZTk4ZThlM2IzNWQ0JyxcbiAgICAgICAgJzMyMmFmNDkwOGM3MzEyYjBjZmJmZTM2OWY3YTdiM2NkYjdkNDQ5NGJjMjgyMzcwMGNmZDY1MjE4OGEzZWE5OGQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYWY4YWRkYmYyYjY2MWM4YTZjNjMyODY1NWViOTY2NTEyNTIwMDdkOGM1ZWEzMWJlNGFkMTk2ZGU4Y2UyMTMxZicsXG4gICAgICAgICc2NzQ5ZTY3YzAyOWI4NWY1MmEwMzRlYWZkMDk2ODM2YjI1MjA4MTg2ODBlMjZhYzhmM2RmYmNkYjcxNzQ5NzAwJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UzYWUxOTc0NTY2Y2EwNmNjNTE2ZDQ3ZTBmYjE2NWE2NzRhM2RhYmNmY2ExNWU3MjJmMGUzNDUwZjQ1ODg5JyxcbiAgICAgICAgJzJhZWFiZTdlNDUzMTUxMDExNjIxN2YwN2JmNGQwNzMwMGRlOTdlNDg3NGY4MWY1MzM0MjBhNzJlZWIwYmQ2YTQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTkxZWUzNTUzMTNkOTk3MjFjZjY5OTNmZmVkMWUzZTMwMTk5M2ZmM2VkMjU4ODAyMDc1ZWE4Y2VkMzk3ZTI0NicsXG4gICAgICAgICdiMGVhNTU4YTExM2MzMGJlYTYwZmM0Nzc1NDYwYzc5MDFmZjBiMDUzZDI1Y2EyYmRlZWU5OGYxYTRiZTVkMTk2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzExMzk2ZDU1ZmRhNTRjNDlmMTlhYTk3MzE4ZDhkYTYxZmE4NTg0ZTQ3YjA4NDk0NTA3N2NmMDMyNTViNTI5ODQnLFxuICAgICAgICAnOTk4Yzc0YThjZDQ1YWMwMTI4OWQ1ODMzYTdiZWI0NzQ0ZmY1MzZiMDFiMjU3YmU0YzU3NjdiZWE5M2VhNTdhNCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczYzVkMmExYmEzOWM1YTE3OTAwMDA3MzhjOWUwYzQwYjhkY2RmZDU0Njg3NTRiNjQwNTU0MDE1N2UwMTdhYTdhJyxcbiAgICAgICAgJ2IyMjg0Mjc5OTk1YTM0ZTJmOWQ0ZGU3Mzk2ZmMxOGI4MGY5YjhiOWZkZDI3MGY2NjYxZjc5Y2E0YzgxYmQyNTcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnY2M4NzA0YjhhNjBhMGRlZmEzYTk5YTcyOTlmMmU5YzNmYmMzOTVhZmIwNGFjMDc4NDI1ZWY4YTE3OTNjYzAzMCcsXG4gICAgICAgICdiZGQ0NjAzOWZlZWQxNzg4MWQxZTA4NjJkYjM0N2Y4Y2YzOTViNzRmYzRiY2RjNGU5NDBiNzRlM2FjMWYxYjEzJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M1MzNlNGY3ZWE4NTU1YWFjZDk3NzdhYzVjYWQyOWI5N2RkNGRlZmNjYzUzZWU3ZWEyMDQxMTliMjg4OWIxOTcnLFxuICAgICAgICAnNmYwYTI1NmJjNWVmZGY0MjlhMmZiNjI0MmYxYTQzYTJkOWI5MjViYjRhNGIzYTI2YmI4ZTBmNDVlYjU5NjA5NidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjMTRmOGYyY2NiMjdkNmYxMDlmNmQwOGQwM2NjOTZhNjliYThjMzRlZWMwN2JiY2Y1NjZkNDhlMzNkYTY1OTMnLFxuICAgICAgICAnYzM1OWQ2OTIzYmIzOThmN2ZkNDQ3M2UxNmZlMWMyODQ3NWI3NDBkZDA5ODA3NWU2YzBlODY0OTExM2RjM2EzOCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhNmNiYzMwNDZiYzZhNDUwYmFjMjQ3ODlmYTE3MTE1YTRjOTczOWVkNzVmOGYyMWNlNDQxZjcyZTBiOTBlNmVmJyxcbiAgICAgICAgJzIxYWU3ZjQ2ODBlODg5YmIxMzA2MTllMmMwZjk1YTM2MGNlYjU3M2M3MDYwMzEzOTg2MmFmZDYxN2ZhOWI5ZidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNDdkNmQ5YTAyYzQ4OTI3ZWJmYjg2YzEzNTliMWNhZjEzMGEzYzAyNjdkMTFjZTYzNDRiMzlmOTlkNDNjYzM4JyxcbiAgICAgICAgJzYwZWE3ZjYxYTM1MzUyNGQxYzk4N2Y2ZWNlYzkyZjA4NmQ1NjVhYjY4Nzg3MGNiMTI2ODlmZjFlMzFjNzQ0NDgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGE2NTQ1ZDIxODFkYjhkOTgzZjdkY2IzNzVlZjU4NjZkNDdjNjdiMWJmMzFjOGNmODU1ZWY3NDM3YjcyNjU2YScsXG4gICAgICAgICc0OWI5NjcxNWFiNjg3OGE3OWU3OGYwN2NlNTY4MGM1ZDY2NzMwNTFiNDkzNWJkODk3ZmVhODI0Yjc3ZGMyMDhhJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M0MDc0N2NjOWQwMTJjYjFhMTNiODE0ODMwOWM2ZGU3ZWMyNWQ2OTQ1ZDY1NzE0NmI5ZDU5OTRiOGZlYjExMTEnLFxuICAgICAgICAnNWNhNTYwNzUzYmUyYTEyZmM2ZGU2Y2FmMmNiNDg5NTY1ZGI5MzYxNTZiOTUxNGUxYmI1ZTgzMDM3ZTBmYTJkNCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ZTQyYzhlYzgyYzk5Nzk4Y2NmM2E2MTBiZTg3MGU3ODMzOGM3ZjcxMzM0OGJkMzRjODIwM2VmNDAzN2YzNTAyJyxcbiAgICAgICAgJzc1NzFkNzRlZTVlMGZiOTJhN2E4YjMzYTA3NzgzMzQxYTU0OTIxNDRjYzU0YmNjNDBhOTQ0NzM2OTM2MDY0MzcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzc3NWFiNzA4OWJjNmFmODIzYWJhMmUxYWY3MGIyMzZkMjUxY2FkYjBjODY3NDMyODc1MjJhMWIzYjBkZWRlYScsXG4gICAgICAgICdiZTUyZDEwN2JjZmEwOWQ4YmNiOTczNmE4MjhjZmE3ZmFjOGRiMTdiZjdhNzZhMmM0MmFkOTYxNDA5MDE4Y2Y3J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2NlZTMxY2JmN2UzNGVjMzc5ZDk0ZmI4MTRkM2Q3NzVhZDk1NDU5NWQxMzE0YmE4ODQ2OTU5ZTNlODJmNzRlMjYnLFxuICAgICAgICAnOGZkNjRhMTRjMDZiNTg5YzI2Yjk0N2FlMmJjZjZiZmEwMTQ5ZWYwYmUxNGVkNGQ4MGY0NDhhMDFjNDNiMWM2ZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiNGY5ZWFlYTA5YjY5MTc2MTlmNmVhNmE0ZWI1NDY0ZWZkZGI1OGZkNDViMWViZWZjZGMxYTAxZDA4YjQ3OTg2JyxcbiAgICAgICAgJzM5ZTVjOTkyNWI1YTU0YjA3NDMzYTRmMThjNjE3MjZmOGJiMTMxYzAxMmNhNTQyZWIyNGE4YWMwNzIwMDY4MmEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDQyNjNkZmMzZDJkZjkyM2EwMTc5YTQ4OTY2ZDMwY2U4NGUyNTE1YWZjM2RjY2MxYjc3OTA3NzkyZWJjYzYwZScsXG4gICAgICAgICc2MmRmYWYwN2EwZjc4ZmViMzBlMzBkNjI5NTg1M2NlMTg5ZTEyNzc2MGFkNmNmN2ZhZTE2NGUxMjJhMjA4ZDU0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ4NDU3NTI0ODIwZmE2NWE0ZjhkMzVlYjY5MzA4NTdjMDAzMmFjYzBhNGEyZGU0MjIyMzNlZWRhODk3NjEyYzQnLFxuICAgICAgICAnMjVhNzQ4YWIzNjc5NzlkOTg3MzNjMzhhMWZhMWMyZTdkYzZjYzA3ZGIyZDYwYTlhZTdhNzZhYWE0OWJkMGY3NydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZmVlZWYxODgxMTAxZjJjYjExNjQ0ZjNhMmFmZGZjMjA0NWUxOTkxOTE1MjkyM2YzNjdhMTc2N2MxMWNjZWRhJyxcbiAgICAgICAgJ2VjZmI3MDU2Y2YxZGUwNDJmOTQyMGJhYjM5Njc5M2MwYzM5MGJkZTc0YjRiYmRmZjE2YTgzYWUwOWE5YTc1MTcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNmQ3ZWY2YjE3NTQzZjgzNzNjNTczZjQ0ZTFmMzg5ODM1ZDg5YmNiYzYwNjJjZWQzNmM4MmRmODNiOGZhZTg1OScsXG4gICAgICAgICdjZDQ1MGVjMzM1NDM4OTg2ZGZlZmExMGM1N2ZlYTliY2M1MjFhMDk1OWIyZDgwYmJmNzRiMTkwZGNhNzEyZDEwJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U3NTYwNWQ1OTEwMmE1YTI2ODQ1MDBkM2I5OTFmMmUzZjNjODhiOTMyMjU1NDcwMzVhZjI1YWY2NmUwNDU0MWYnLFxuICAgICAgICAnZjVjNTQ3NTRhOGY3MWVlNTQwYjliNDg3Mjg0NzNlMzE0ZjcyOWFjNTMwOGIwNjkzODM2MDk5MGUyYmZhZDEyNSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYjk4NjYwZjRjNGRmYWEwNmEyYmU0NTNkNTAyMGJjOTlhMGMyZTYwYWJlMzg4NDU3ZGQ0M2ZlZmIxZWQ2MjBjJyxcbiAgICAgICAgJzZjYjlhODg3NmQ5Y2I4NTIwNjA5YWYzYWRkMjZjZDIwYTBhN2NkOGE5NDExMTMxY2U4NWY0NDEwMDA5OTIyM2UnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTNlODdiMDI3ZDg1MTRkMzU5MzlmMmU2ODkyYjE5OTIyMTU0NTk2OTQxODg4MzM2ZGMzNTYzZTNiOGRiYTk0MicsXG4gICAgICAgICdmZWY1YTNjNjgwNTlhNmRlYzVkNjI0MTE0YmYxZTkxYWFjMmI5ZGE1NjhkNmFiZWIyNTcwZDU1NjQ2YjhhZGYxJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VlMTYzMDI2ZTlmZDZmZTAxN2MzOGYwNmE1YmU2ZmMxMjU0MjRiMzcxY2UyNzA4ZTdiZjQ0OTE2OTFlNTc2NGEnLFxuICAgICAgICAnMWFjYjI1MGYyNTVkZDYxYzQzZDk0Y2NjNjcwZDBmNThmNDlhZTNmYTE1Yjk2NjIzZTU0MzBkYTBhZDZjNjJiMidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiMjY4ZjVlZjlhZDUxZTRkNzhkZTNhNzUwYzJkYzg5YjFlNjI2ZDQzNTA1ODY3OTk5OTMyZTVkYjMzYWYzZDgwJyxcbiAgICAgICAgJzVmMzEwZDRiM2M5OWI5ZWJiMTlmNzdkNDFjMWRlZTAxOGNmMGQzNGZkNDE5MTYxNDAwM2U5NDVhMTIxNmU0MjMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmYwN2YzMTE4YTlkZjAzNWU5ZmFkODVlYjZjN2JmZTQyYjAyZjAxY2E5OWNlZWEzYmY3ZmZkYmE5M2M0NzUwZCcsXG4gICAgICAgICc0MzgxMzZkNjAzZTg1OGEzYTVjNDQwYzM4ZWNjYmFkZGMxZDI5NDIxMTRlMmVkZGQ0NzQwZDA5OGNlZDFmMGQ4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhkOGI5ODU1YzdjMDUyYTM0MTQ2ZmQyMGZmYjY1OGJlYTRiOWY2OWUwZDgyNWViZWMxNmU4YzNjZTJiNTI2YTEnLFxuICAgICAgICAnY2RiNTU5ZWVkYzJkNzlmOTI2YmFmNDRmYjg0ZWE0ZDQ0YmNmNTBmZWU1MWQ3Y2ViMzBlMmU3ZjQ2MzAzNjc1OCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1MmRiMGI1Mzg0ZGZiZjA1YmZhOWQ0NzJkN2FlMjZkZmU0Yjg1MWNlY2E5MWIxZWJhNTQyNjMxODBkYTMyYjYzJyxcbiAgICAgICAgJ2MzYjk5N2QwNTBlZTVkNDIzZWJhZjY2YTZkYjlmNTdiMzE4MGM5MDI4NzU2NzlkZTkyNGI2OWQ4NGE3YjM3NSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNjJmOTQ5MGQzZDUxZGE2Mzk1ZWZkMjRlODA5MTljYzdkMGYyOWMzZjNmYTQ4YzZmZmY1NDNiZWNiZDQzMzUyJyxcbiAgICAgICAgJzZkODlhZDdiYTQ4NzZiMGIyMmMyY2EyODBjNjgyODYyZjM0MmM4NTkxZjFkYWY1MTcwZTA3YmZkOWNjYWZhN2QnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnN2YzMGVhMjQ3NmIzOTliNDk1NzUwOWM4OGY3N2QwMTkxYWZhMmZmNWNiN2IxNGZkNmQ4ZTdkNjVhYWFiMTE5MycsXG4gICAgICAgICdjYTVlZjdkNGIyMzFjOTRjM2IxNTM4OWE1ZjYzMTFlOWRhZmY3YmI2N2IxMDNlOTg4MGVmNGJmZjYzN2FjYWVjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUwOThmZjFlMWQ5ZjE0ZmI0NmEyMTBmYWRhNmM5MDNmZWYwZmI3YjRhMWRkMWQ5YWM2MGEwMzYxODAwYjdhMDAnLFxuICAgICAgICAnOTczMTE0MWQ4MWZjOGY4MDg0ZDM3YzZlNzU0MjAwNmIzZWUxYjQwZDYwZGZlNTM2MmE1YjEzMmZkMTdkZGMwJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyYjc4YzdkZTllZTUxMmE3Mjg5NWJlNmI5Y2JlZmE2ZTJmM2M0Y2NjZTQ0NWM5NmI5ZjJjODFlMjc3OGFkNTgnLFxuICAgICAgICAnZWUxODQ5ZjUxM2RmNzFlMzJlZmMzODk2ZWUyODI2MGM3M2JiODA1NDdhZTIyNzViYTQ5NzIzNzc5NGM4NzUzYydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMmNiNzRmZGRjOGU5ZmJjZDA3NmVlZjJhN2M3MmIwY2UzN2Q1MGYwODI2OWRmYzA3NGI1ODE1NTA1NDdhNGY3JyxcbiAgICAgICAgJ2QzYWEyZWQ3MWM5ZGQyMjQ3YTYyZGYwNjI3MzZlYjBiYWRkZWE5ZTM2MTIyZDJiZTg2NDFhYmNiMDA1Y2M0YTQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODQzODQ0NzU2NmQ0ZDdiZWRhZGMyOTk0OTZhYjM1NzQyNjAwOWEzNWYyMzVjYjE0MWJlMGQ5OWNkMTBhZTNhOCcsXG4gICAgICAgICdjNGUxMDIwOTE2OTgwYTRkYTVkMDFhYzVlNmFkMzMwNzM0ZWYwZDc5MDY2MzFjNGYyMzkwNDI2YjJlZGQ3OTFmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQxNjJkNDg4Yjg5NDAyMDM5YjU4NGM2ZmM2YzMwODg3MDU4N2Q5YzQ2ZjY2MGI4NzhhYjY1YzgyYzcxMWQ2N2UnLFxuICAgICAgICAnNjcxNjNlOTAzMjM2Mjg5Zjc3NmYyMmMyNWZiOGEzYWZjMTczMmYyYjg0YjRlOTVkYmRhNDdhZTVhMDg1MjY0OSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczZmFkM2ZhODRjYWYwZjM0ZjBmODliZmQyZGNmNTRmYzE3NWQ3NjdhZWMzZTUwNjg0ZjNiYTRhNGJmNWY2ODNkJyxcbiAgICAgICAgJ2NkMWJjN2NiNmNjNDA3YmIyZjBjYTY0N2M3MThhNzMwY2Y3MTg3MmU3ZDBkMmE1M2ZhMjBlZmNkZmU2MTgyNidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2NzRmMjYwMGEzMDA3YTAwNTY4YzFhN2NlMDVkMDgxNmMxZmI4NGJmMTM3MDc5OGYxYzY5NTMyZmFlYjFhODZiJyxcbiAgICAgICAgJzI5OWQyMWY5NDEzZjMzYjNlZGY0M2IyNTcwMDQ1ODBiNzBkYjU3ZGEwYjE4MjI1OWUwOWVlY2M2OWUwZDM4YTUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDMyZjRkYTU0YWRlNzRhYmI4MWI4MTVhZDFmYjNiMjYzZDgyZDZjNjkyNzE0YmNmZjg3ZDI5YmQ1ZWU5ZjA4ZicsXG4gICAgICAgICdmOTQyOWU3MzhiOGU1M2I5NjhlOTkwMTZjMDU5NzA3NzgyZTE0ZjQ1MzUzNTlkNTgyZmM0MTY5MTBiM2VlYTg3J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMwZTRlNjcwNDM1Mzg1NTU2ZTU5MzY1NzEzNTg0NWQzNmZiYjY5MzFmNzJiMDhjYjFlZDk1NGYxZTNjZTNmZjYnLFxuICAgICAgICAnNDYyZjliY2U2MTk4OTg2Mzg0OTkzNTAxMTNiYmM5YjEwYTg3OGQzNWRhNzA3NDBkYzY5NWE1NTllYjg4ZGI3YidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiZTIwNjIwMDNjNTFjYzMwMDQ2ODI5MDQzMzBlNGRlZTdmM2RjZDEwYjAxZTU4MGJmMTk3MWIwNGQ0Y2FkMjk3JyxcbiAgICAgICAgJzYyMTg4YmM0OWQ2MWU1NDI4NTczZDQ4YTc0ZTFjNjU1YjFjNjEwOTA5MDU2ODJhMGQ1NTU4ZWQ3MmRjY2I5YmMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTMxNDQ0MjNhY2UzNDUxZWQyOWUwZmI5YWMyYWYyMTFjYjZlODRhNjAxZGY1OTkzYzQxOTg1OWZmZjVkZjA0YScsXG4gICAgICAgICc3YzEwZGZiMTY0YzM0MjVmNWM3MWEzZjlkNzk5MjAzOGYxMDY1MjI0ZjcyYmI5ZDFkOTAyYTZkMTMwMzdiNDdjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2IwMTVmODA0NGY1ZmNiZGNmMjFjYTI2ZDZjMzRmYjgxOTc4MjkyMDVjN2I3ZDJhN2NiNjY0MThjMTU3YjExMmMnLFxuICAgICAgICAnYWI4YzFlMDg2ZDA0ZTgxMzc0NGE2NTViMmRmOGQ1ZjgzYjNjZGM2ZmFhMzA4OGMxZDNhZWExNDU0ZTNhMWQ1ZidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNWU5ZTFkYTY0OWQ5N2Q4OWU0ODY4MTE3YTQ2NWEzYTRmOGExOGRlNTdhMTQwZDM2YjNmMmFmMzQxYTIxYjUyJyxcbiAgICAgICAgJzRjYjA0NDM3ZjM5MWVkNzMxMTFhMTNjYzFkNGRkMGRiMTY5MzQ2NWMyMjQwNDgwZDg5NTVlODU5MmYyNzQ0N2EnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDNhZTQxMDQ3ZGQ3Y2EwNjVkYmY4ZWQ3N2I5OTI0Mzk5ODMwMDVjZDcyZTE2ZDZmOTk2YTUzMTZkMzY5NjZiYicsXG4gICAgICAgICdiZDFhZWIyMWFkMjJlYmIyMmExMGYwMzAzNDE3YzZkOTY0ZjhjZGQ3ZGYwYWNhNjE0YjEwZGMxNGQxMjVhYzQ2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ2M2UyNzYzZDg4NWY5NThmYzY2Y2RkMjI4MDBmMGE0ODcxOTdkMGE4MmUzNzdiNDlmODBhZjg3Yzg5N2IwNjUnLFxuICAgICAgICAnYmZlZmFjZGIwZTVkMGZkN2RmM2EzMTFhOTRkZTA2MmIyNmI4MGM2MWZiYzk3NTA4Yjc5OTkyNjcxZWY3Y2E3ZidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OTg1ZmRmZDEyN2MwNTY3YzZmNTNlYzFiYjYzZWMzMTU4ZTU5N2M0MGJmZTc0N2M4M2NkZGZjOTEwNjQxOTE3JyxcbiAgICAgICAgJzYwM2MxMmRhZjNkOTg2MmVmMmIyNWZlMWRlMjg5YWVkMjRlZDI5MWUwZWM2NzA4NzAzYTViZDU2N2YzMmVkMDMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzRhMWFkNmI1Zjc2ZTM5ZGIyZGQyNDk0MTBlYWM3Zjk5ZTc0YzU5Y2I4M2QyZDBlZDVmZjE1NDNkYTc3MDNlOScsXG4gICAgICAgICdjYzYxNTdlZjE4YzljNjNjZDYxOTNkODM2MzFiYmVhMDA5M2UwOTY4OTQyZThjMzNkNTczN2ZkNzkwZTBkYjA4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMwNjgyYTUwNzAzMzc1ZjYwMmQ0MTY2NjRiYTE5YjdmYzliYWI0MmM3Mjc0NzQ2M2E3MWQwODk2YjIyZjZkYTMnLFxuICAgICAgICAnNTUzZTA0ZjZiMDE4YjRmYTZjOGYzOWU3ZjMxMWQzMTc2MjkwZDBlMGYxOWNhNzNmMTc3MTRkOTk3N2EyMmZmOCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5ZTIxNThmMGQ3YzBkNWYyNmMzNzkxZWZlZmE3OTU5NzY1NGU3YTJiMjQ2NGY1MmIxZWU2YzEzNDc3NjllZjU3JyxcbiAgICAgICAgJzcxMmZjZGQxYjkwNTNmMDkwMDNhMzQ4MWZhNzc2MmU5ZmZkN2M4ZWYzNWEzODUwOWUyZmJmMjYyOTAwODM3MydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzZlMjY5ODlhNDNjOWNmZWJhNDAyOWMyMDI1MzhjMjgxNzJlNTY2ZTNjNGZjZTczMjI4NTdmM2JlMzI3ZDY2JyxcbiAgICAgICAgJ2VkOGNjOWQwNGIyOWViODc3ZDI3MGI0ODc4ZGM0M2MxOWFlZmQzMWY0ZWVlMDllZTdiNDc4MzRjMWZhNGIxYzMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzVkNDZlZmVhMzc3MWU2ZTY4YWJiODlhMTNhZDc0N2VjZjE4OTIzOTNkZmM0ZjFiNzAwNDc4OGM1MDM3NGRhOCcsXG4gICAgICAgICc5ODUyMzkwYTk5NTA3Njc5ZmQwYjg2ZmQyYjM5YTg2OGQ3ZWZjMjIxNTEzNDZlMWEzY2E0NzI2NTg2YTZiZWQ4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgwOWEyMGM2N2Q2NDkwMGZmYjY5OGM0YzgyNWY2ZDVmMjMxMGZiMDQ1MWM4NjkzNDViNzMxOWY2NDU2MDU3MjEnLFxuICAgICAgICAnOWU5OTQ5ODBkOTkxN2UyMmI3NmIwNjE5MjdmYTA0MTQzZDA5NmNjYzU0OTYzZTZhNWViZmE1ZjNmOGUyODZjMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxYjM4OTAzYTQzZjdmMTE0ZWQ0NTAwYjRlYWM3MDgzZmRlZmVjZTFjZjI5YzYzNTI4ZDU2MzQ0NmY5NzJjMTgwJyxcbiAgICAgICAgJzQwMzZlZGM5MzFhNjBhZTg4OTM1M2Y3N2ZkNTNkZTRhMjcwOGIyNmI2ZjVkYTcyYWQzMzk0MTE5ZGFmNDA4ZjknXG4gICAgICBdXG4gICAgXVxuICB9XG59O1xuXG59LHt9XSwyODE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSBleHBvcnRzO1xudmFyIEJOID0gX2RlcmVxXygnYm4uanMnKTtcbnZhciBtaW5Bc3NlcnQgPSBfZGVyZXFfKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG52YXIgbWluVXRpbHMgPSBfZGVyZXFfKCdtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzJyk7XG5cbnV0aWxzLmFzc2VydCA9IG1pbkFzc2VydDtcbnV0aWxzLnRvQXJyYXkgPSBtaW5VdGlscy50b0FycmF5O1xudXRpbHMuemVybzIgPSBtaW5VdGlscy56ZXJvMjtcbnV0aWxzLnRvSGV4ID0gbWluVXRpbHMudG9IZXg7XG51dGlscy5lbmNvZGUgPSBtaW5VdGlscy5lbmNvZGU7XG5cbi8vIFJlcHJlc2VudCBudW0gaW4gYSB3LU5BRiBmb3JtXG5mdW5jdGlvbiBnZXROQUYobnVtLCB3KSB7XG4gIHZhciBuYWYgPSBbXTtcbiAgdmFyIHdzID0gMSA8PCAodyArIDEpO1xuICB2YXIgayA9IG51bS5jbG9uZSgpO1xuICB3aGlsZSAoay5jbXBuKDEpID49IDApIHtcbiAgICB2YXIgejtcbiAgICBpZiAoay5pc09kZCgpKSB7XG4gICAgICB2YXIgbW9kID0gay5hbmRsbih3cyAtIDEpO1xuICAgICAgaWYgKG1vZCA+ICh3cyA+PiAxKSAtIDEpXG4gICAgICAgIHogPSAod3MgPj4gMSkgLSBtb2Q7XG4gICAgICBlbHNlXG4gICAgICAgIHogPSBtb2Q7XG4gICAgICBrLmlzdWJuKHopO1xuICAgIH0gZWxzZSB7XG4gICAgICB6ID0gMDtcbiAgICB9XG4gICAgbmFmLnB1c2goeik7XG5cbiAgICAvLyBPcHRpbWl6YXRpb24sIHNoaWZ0IGJ5IHdvcmQgaWYgcG9zc2libGVcbiAgICB2YXIgc2hpZnQgPSAoay5jbXBuKDApICE9PSAwICYmIGsuYW5kbG4od3MgLSAxKSA9PT0gMCkgPyAodyArIDEpIDogMTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHNoaWZ0OyBpKyspXG4gICAgICBuYWYucHVzaCgwKTtcbiAgICBrLml1c2hybihzaGlmdCk7XG4gIH1cblxuICByZXR1cm4gbmFmO1xufVxudXRpbHMuZ2V0TkFGID0gZ2V0TkFGO1xuXG4vLyBSZXByZXNlbnQgazEsIGsyIGluIGEgSm9pbnQgU3BhcnNlIEZvcm1cbmZ1bmN0aW9uIGdldEpTRihrMSwgazIpIHtcbiAgdmFyIGpzZiA9IFtcbiAgICBbXSxcbiAgICBbXVxuICBdO1xuXG4gIGsxID0gazEuY2xvbmUoKTtcbiAgazIgPSBrMi5jbG9uZSgpO1xuICB2YXIgZDEgPSAwO1xuICB2YXIgZDIgPSAwO1xuICB3aGlsZSAoazEuY21wbigtZDEpID4gMCB8fCBrMi5jbXBuKC1kMikgPiAwKSB7XG5cbiAgICAvLyBGaXJzdCBwaGFzZVxuICAgIHZhciBtMTQgPSAoazEuYW5kbG4oMykgKyBkMSkgJiAzO1xuICAgIHZhciBtMjQgPSAoazIuYW5kbG4oMykgKyBkMikgJiAzO1xuICAgIGlmIChtMTQgPT09IDMpXG4gICAgICBtMTQgPSAtMTtcbiAgICBpZiAobTI0ID09PSAzKVxuICAgICAgbTI0ID0gLTE7XG4gICAgdmFyIHUxO1xuICAgIGlmICgobTE0ICYgMSkgPT09IDApIHtcbiAgICAgIHUxID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG04ID0gKGsxLmFuZGxuKDcpICsgZDEpICYgNztcbiAgICAgIGlmICgobTggPT09IDMgfHwgbTggPT09IDUpICYmIG0yNCA9PT0gMilcbiAgICAgICAgdTEgPSAtbTE0O1xuICAgICAgZWxzZVxuICAgICAgICB1MSA9IG0xNDtcbiAgICB9XG4gICAganNmWzBdLnB1c2godTEpO1xuXG4gICAgdmFyIHUyO1xuICAgIGlmICgobTI0ICYgMSkgPT09IDApIHtcbiAgICAgIHUyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG04ID0gKGsyLmFuZGxuKDcpICsgZDIpICYgNztcbiAgICAgIGlmICgobTggPT09IDMgfHwgbTggPT09IDUpICYmIG0xNCA9PT0gMilcbiAgICAgICAgdTIgPSAtbTI0O1xuICAgICAgZWxzZVxuICAgICAgICB1MiA9IG0yNDtcbiAgICB9XG4gICAganNmWzFdLnB1c2godTIpO1xuXG4gICAgLy8gU2Vjb25kIHBoYXNlXG4gICAgaWYgKDIgKiBkMSA9PT0gdTEgKyAxKVxuICAgICAgZDEgPSAxIC0gZDE7XG4gICAgaWYgKDIgKiBkMiA9PT0gdTIgKyAxKVxuICAgICAgZDIgPSAxIC0gZDI7XG4gICAgazEuaXVzaHJuKDEpO1xuICAgIGsyLml1c2hybigxKTtcbiAgfVxuXG4gIHJldHVybiBqc2Y7XG59XG51dGlscy5nZXRKU0YgPSBnZXRKU0Y7XG5cbmZ1bmN0aW9uIGNhY2hlZFByb3BlcnR5KG9iaiwgbmFtZSwgY29tcHV0ZXIpIHtcbiAgdmFyIGtleSA9ICdfJyArIG5hbWU7XG4gIG9iai5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiBjYWNoZWRQcm9wZXJ0eSgpIHtcbiAgICByZXR1cm4gdGhpc1trZXldICE9PSB1bmRlZmluZWQgPyB0aGlzW2tleV0gOlxuICAgICAgICAgICB0aGlzW2tleV0gPSBjb21wdXRlci5jYWxsKHRoaXMpO1xuICB9O1xufVxudXRpbHMuY2FjaGVkUHJvcGVydHkgPSBjYWNoZWRQcm9wZXJ0eTtcblxuZnVuY3Rpb24gcGFyc2VCeXRlcyhieXRlcykge1xuICByZXR1cm4gdHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJyA/IHV0aWxzLnRvQXJyYXkoYnl0ZXMsICdoZXgnKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXM7XG59XG51dGlscy5wYXJzZUJ5dGVzID0gcGFyc2VCeXRlcztcblxuZnVuY3Rpb24gaW50RnJvbUxFKGJ5dGVzKSB7XG4gIHJldHVybiBuZXcgQk4oYnl0ZXMsICdoZXgnLCAnbGUnKTtcbn1cbnV0aWxzLmludEZyb21MRSA9IGludEZyb21MRTtcblxuXG59LHtcImJuLmpzXCI6NDQsXCJtaW5pbWFsaXN0aWMtYXNzZXJ0XCI6Mjk5LFwibWluaW1hbGlzdGljLWNyeXB0by11dGlsc1wiOjMwMH1dLDI4MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cz17XG4gIFwiX2FyZ3NcIjogW1xuICAgIFtcbiAgICAgIFwiZ2l0aHViOm9wZW5wZ3Bqcy9lbGxpcHRpY1wiLFxuICAgICAgXCIvVXNlcnMvc3VubnkvRGVza3RvcC9Qcm90b25tYWlsL29wZW5wZ3Bqc1wiXG4gICAgXVxuICBdLFxuICBcIl9mcm9tXCI6IFwiZ2l0aHViOm9wZW5wZ3Bqcy9lbGxpcHRpY1wiLFxuICBcIl9pZFwiOiBcImVsbGlwdGljQGdpdGh1YjpvcGVucGdwanMvZWxsaXB0aWMjZTE4N2U3MDZlMTFmYTUxYmNkMjBlNDZlNTExOTA1NGJlNGUyYTRhNlwiLFxuICBcIl9pbkJ1bmRsZVwiOiBmYWxzZSxcbiAgXCJfaW50ZWdyaXR5XCI6IFwiXCIsXG4gIFwiX2xvY2F0aW9uXCI6IFwiL2VsbGlwdGljXCIsXG4gIFwiX3BoYW50b21DaGlsZHJlblwiOiB7fSxcbiAgXCJfcmVxdWVzdGVkXCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInJhd1wiOiBcImdpdGh1YjpvcGVucGdwanMvZWxsaXB0aWNcIixcbiAgICBcInJhd1NwZWNcIjogXCJnaXRodWI6b3BlbnBncGpzL2VsbGlwdGljXCIsXG4gICAgXCJzYXZlU3BlY1wiOiBcImdpdGh1YjpvcGVucGdwanMvZWxsaXB0aWNcIixcbiAgICBcImZldGNoU3BlY1wiOiBudWxsLFxuICAgIFwiZ2l0Q29tbWl0dGlzaFwiOiBudWxsXG4gIH0sXG4gIFwiX3JlcXVpcmVkQnlcIjogW1xuICAgIFwiL1wiXG4gIF0sXG4gIFwiX3Jlc29sdmVkXCI6IFwiZ2l0aHViOm9wZW5wZ3Bqcy9lbGxpcHRpYyNlMTg3ZTcwNmUxMWZhNTFiY2QyMGU0NmU1MTE5MDU0YmU0ZTJhNGE2XCIsXG4gIFwiX3NwZWNcIjogXCJnaXRodWI6b3BlbnBncGpzL2VsbGlwdGljXCIsXG4gIFwiX3doZXJlXCI6IFwiL1VzZXJzL3N1bm55L0Rlc2t0b3AvUHJvdG9ubWFpbC9vcGVucGdwanNcIixcbiAgXCJhdXRob3JcIjoge1xuICAgIFwibmFtZVwiOiBcIkZlZG9yIEluZHV0bnlcIixcbiAgICBcImVtYWlsXCI6IFwiZmVkb3JAaW5kdXRueS5jb21cIlxuICB9LFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvZWxsaXB0aWMvaXNzdWVzXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYm4uanNcIjogXCJeNC40LjBcIixcbiAgICBcImJyb3JhbmRcIjogXCJeMS4wLjFcIixcbiAgICBcImhhc2guanNcIjogXCJeMS4wLjBcIixcbiAgICBcImhtYWMtZHJiZ1wiOiBcIl4xLjAuMFwiLFxuICAgIFwiaW5oZXJpdHNcIjogXCJeMi4wLjFcIixcbiAgICBcIm1pbmltYWxpc3RpYy1hc3NlcnRcIjogXCJeMS4wLjBcIixcbiAgICBcIm1pbmltYWxpc3RpYy1jcnlwdG8tdXRpbHNcIjogXCJeMS4wLjBcIlxuICB9LFxuICBcImRlc2NyaXB0aW9uXCI6IFwiRUMgY3J5cHRvZ3JhcGh5XCIsXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImJyZnNcIjogXCJeMS40LjNcIixcbiAgICBcImNvdmVyYWxsc1wiOiBcIl4yLjExLjNcIixcbiAgICBcImdydW50XCI6IFwiXjAuNC41XCIsXG4gICAgXCJncnVudC1icm93c2VyaWZ5XCI6IFwiXjUuMC4wXCIsXG4gICAgXCJncnVudC1jbGlcIjogXCJeMS4yLjBcIixcbiAgICBcImdydW50LWNvbnRyaWItY29ubmVjdFwiOiBcIl4xLjAuMFwiLFxuICAgIFwiZ3J1bnQtY29udHJpYi1jb3B5XCI6IFwiXjEuMC4wXCIsXG4gICAgXCJncnVudC1jb250cmliLXVnbGlmeVwiOiBcIl4xLjAuMVwiLFxuICAgIFwiZ3J1bnQtbW9jaGEtaXN0YW5idWxcIjogXCJeMy4wLjFcIixcbiAgICBcImdydW50LXNhdWNlbGFic1wiOiBcIl44LjYuMlwiLFxuICAgIFwiaXN0YW5idWxcIjogXCJeMC40LjJcIixcbiAgICBcImpzY3NcIjogXCJeMi45LjBcIixcbiAgICBcImpzaGludFwiOiBcIl4yLjYuMFwiLFxuICAgIFwibW9jaGFcIjogXCJeMi4xLjBcIlxuICB9LFxuICBcImZpbGVzXCI6IFtcbiAgICBcImxpYlwiXG4gIF0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vaW5kdXRueS9lbGxpcHRpY1wiLFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcIkVDXCIsXG4gICAgXCJFbGxpcHRpY1wiLFxuICAgIFwiY3VydmVcIixcbiAgICBcIkNyeXB0b2dyYXBoeVwiXG4gIF0sXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcIm1haW5cIjogXCJsaWIvZWxsaXB0aWMuanNcIixcbiAgXCJuYW1lXCI6IFwiZWxsaXB0aWNcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdCtzc2g6Ly9naXRAZ2l0aHViLmNvbS9pbmR1dG55L2VsbGlwdGljLmdpdFwiXG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJqc2NzXCI6IFwianNjcyBiZW5jaG1hcmtzLyouanMgbGliLyouanMgbGliLyoqLyouanMgbGliLyoqLyoqLyouanMgdGVzdC9pbmRleC5qc1wiLFxuICAgIFwianNoaW50XCI6IFwianNjcyBiZW5jaG1hcmtzLyouanMgbGliLyouanMgbGliLyoqLyouanMgbGliLyoqLyoqLyouanMgdGVzdC9pbmRleC5qc1wiLFxuICAgIFwibGludFwiOiBcIm5wbSBydW4ganNjcyAmJiBucG0gcnVuIGpzaGludFwiLFxuICAgIFwidGVzdFwiOiBcIm5wbSBydW4gbGludCAmJiBucG0gcnVuIHVuaXRcIixcbiAgICBcInVuaXRcIjogXCJpc3RhbmJ1bCB0ZXN0IF9tb2NoYSAtLXJlcG9ydGVyPXNwZWMgdGVzdC9pbmRleC5qc1wiLFxuICAgIFwidmVyc2lvblwiOiBcImdydW50IGRpc3QgJiYgZ2l0IGFkZCBkaXN0L1wiXG4gIH0sXG4gIFwidmVyc2lvblwiOiBcIjYuNC4wXCJcbn1cblxufSx7fV0sMjgzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxuLy8gZW1haWwtYWRkcmVzc2VzLmpzIC0gUkZDIDUzMjIgZW1haWwgYWRkcmVzcyBwYXJzZXJcbi8vIHYgMy4wLjFcbi8vXG4vLyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIyXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGRvZXMgbm90IHZhbGlkYXRlIGVtYWlsIGFkZHJlc3Nlcy5cbi8vIGVtYWlsQWRkcmVzc2VzIGF0dGVtcHRzIHRvIHBhcnNlIGFkZHJlc3NlcyB1c2luZyB0aGUgKGZhaXJseSBsaWJlcmFsKVxuLy8gZ3JhbW1hciBzcGVjaWZpZWQgaW4gUkZDIDUzMjIuXG4vL1xuLy8gZW1haWwtYWRkcmVzc2VzIHJldHVybnMge1xuLy8gICAgIGFzdDogPGFuIGFic3RyYWN0IHN5bnRheCB0cmVlIGJhc2VkIG9uIHJmYzUzMjI+LFxuLy8gICAgIGFkZHJlc3NlczogW3tcbi8vICAgICAgICAgICAgbm9kZTogPG5vZGUgaW4gYXN0IGZvciB0aGlzIGFkZHJlc3M+LFxuLy8gICAgICAgICAgICBuYW1lOiA8ZGlzcGxheS1uYW1lPixcbi8vICAgICAgICAgICAgYWRkcmVzczogPGFkZHItc3BlYz4sXG4vLyAgICAgICAgICAgIGxvY2FsOiA8bG9jYWwtcGFydD4sXG4vLyAgICAgICAgICAgIGRvbWFpbjogPGRvbWFpbj5cbi8vICAgICAgICAgfSwgLi4uXVxuLy8gfVxuLy9cbi8vIGVtYWlsQWRkcmVzc2VzLnBhcnNlT25lQWRkcmVzcyBhbmQgZW1haWxBZGRyZXNzZXMucGFyc2VBZGRyZXNzTGlzdFxuLy8gd29yayBhcyB5b3UgbWlnaHQgZXhwZWN0LiBUcnkgaXQgb3V0LlxuLy9cbi8vIE1hbnkgdGhhbmtzIHRvIERvbWluaWMgU2F5ZXJzIGFuZCBoaXMgZG9jdW1lbnRhdGlvbiBvbiB0aGUgaXNfZW1haWwgZnVuY3Rpb24sXG4vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvaXNlbWFpbC8gLCB3aGljaCBoZWxwZWQgZ3JlYXRseSBpbiB3cml0aW5nIHRoaXMgcGFyc2VyLlxuXG4oZnVuY3Rpb24gKGdsb2JhbCkge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIHBhcnNlNTMyMihvcHRzKSB7XG5cbiAgICAvLyB0b2tlbml6aW5nIGZ1bmN0aW9uc1xuXG4gICAgZnVuY3Rpb24gaW5TdHIoKSB7IHJldHVybiBwb3MgPCBsZW47IH1cbiAgICBmdW5jdGlvbiBjdXJUb2soKSB7IHJldHVybiBwYXJzZVN0cmluZ1twb3NdOyB9XG4gICAgZnVuY3Rpb24gZ2V0UG9zKCkgeyByZXR1cm4gcG9zOyB9XG4gICAgZnVuY3Rpb24gc2V0UG9zKGkpIHsgcG9zID0gaTsgfVxuICAgIGZ1bmN0aW9uIG5leHRUb2soKSB7IHBvcyArPSAxOyB9XG4gICAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgcG9zID0gMDtcbiAgICAgICAgbGVuID0gcGFyc2VTdHJpbmcubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIHBhcnNlciBoZWxwZXIgZnVuY3Rpb25zXG5cbiAgICBmdW5jdGlvbiBvKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgdG9rZW5zOiB2YWx1ZSB8fCBcIlwiLFxuICAgICAgICAgICAgc2VtYW50aWM6IHZhbHVlIHx8IFwiXCIsXG4gICAgICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3cmFwKG5hbWUsIGFzdCkge1xuICAgICAgICB2YXIgbjtcbiAgICAgICAgaWYgKGFzdCA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxuICAgICAgICBuID0gbyhuYW1lKTtcbiAgICAgICAgbi50b2tlbnMgPSBhc3QudG9rZW5zO1xuICAgICAgICBuLnNlbWFudGljID0gYXN0LnNlbWFudGljO1xuICAgICAgICBuLmNoaWxkcmVuLnB1c2goYXN0KTtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkKHBhcmVudCwgY2hpbGQpIHtcbiAgICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwYXJlbnQudG9rZW5zICs9IGNoaWxkLnRva2VucztcbiAgICAgICAgICAgIHBhcmVudC5zZW1hbnRpYyArPSBjaGlsZC5zZW1hbnRpYztcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcGFyZVRva2VuKGZ4bkNvbXBhcmUpIHtcbiAgICAgICAgdmFyIHRvaztcbiAgICAgICAgaWYgKCFpblN0cigpKSB7IHJldHVybiBudWxsOyB9XG4gICAgICAgIHRvayA9IGN1clRvaygpO1xuICAgICAgICBpZiAoZnhuQ29tcGFyZSh0b2spKSB7XG4gICAgICAgICAgICBuZXh0VG9rKCk7XG4gICAgICAgICAgICByZXR1cm4gbygndG9rZW4nLCB0b2spO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpdGVyYWwobGl0KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBsaXRlcmFsRnVuYygpIHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwKCdsaXRlcmFsJywgY29tcGFyZVRva2VuKGZ1bmN0aW9uICh0b2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rID09PSBsaXQ7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYW5kKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGFuZEZ1bmMoKSB7XG4gICAgICAgICAgICB2YXIgaSwgcywgcmVzdWx0LCBzdGFydDtcbiAgICAgICAgICAgIHN0YXJ0ID0gZ2V0UG9zKCk7XG4gICAgICAgICAgICBzID0gbygnYW5kJyk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFyZ3NbaV0oKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFBvcyhzdGFydCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZGQocywgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9yKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG9yRnVuYygpIHtcbiAgICAgICAgICAgIHZhciBpLCByZXN1bHQsIHN0YXJ0O1xuICAgICAgICAgICAgc3RhcnQgPSBnZXRQb3MoKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYXJnc1tpXSgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2V0UG9zKHN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9wdChwcm9kKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBvcHRGdW5jKCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgc3RhcnQ7XG4gICAgICAgICAgICBzdGFydCA9IGdldFBvcygpO1xuICAgICAgICAgICAgcmVzdWx0ID0gcHJvZCgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRQb3Moc3RhcnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvKCdvcHQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnZpcyhwcm9kKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBpbnZpc0Z1bmMoKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gcHJvZCgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZW1hbnRpYyA9IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbHdzcChwcm9kKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBjb2xsYXBzZVNlbWFudGljV2hpdGVzcGFjZSgpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBwcm9kKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHJlc3VsdC5zZW1hbnRpYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnNlbWFudGljID0gXCIgXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0YXIocHJvZCwgbWluaW11bSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gc3RhckZ1bmMoKSB7XG4gICAgICAgICAgICB2YXIgcywgcmVzdWx0LCBjb3VudCwgc3RhcnQsIG1pbjtcbiAgICAgICAgICAgIHN0YXJ0ID0gZ2V0UG9zKCk7XG4gICAgICAgICAgICBzID0gbygnc3RhcicpO1xuICAgICAgICAgICAgY291bnQgPSAwO1xuICAgICAgICAgICAgbWluID0gbWluaW11bSA9PT0gdW5kZWZpbmVkID8gMCA6IG1pbmltdW07XG4gICAgICAgICAgICB3aGlsZSAoKHJlc3VsdCA9IHByb2QoKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMTtcbiAgICAgICAgICAgICAgICBhZGQocywgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb3VudCA+PSBtaW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFBvcyhzdGFydCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gT25lIGV4cGVjdHMgbmFtZXMgdG8gZ2V0IG5vcm1hbGl6ZWQgbGlrZSB0aGlzOlxuICAgIC8vIFwiICBGaXJzdCAgTGFzdCBcIiAtPiBcIkZpcnN0IExhc3RcIlxuICAgIC8vIFwiRmlyc3QgTGFzdFwiIC0+IFwiRmlyc3QgTGFzdFwiXG4gICAgLy8gXCJGaXJzdCAgIExhc3RcIiAtPiBcIkZpcnN0IExhc3RcIlxuICAgIGZ1bmN0aW9uIGNvbGxhcHNlV2hpdGVzcGFjZShzKSB7XG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoLyhbIFxcdF18XFxyXFxuKSsvZywgJyAnKS5yZXBsYWNlKC9eXFxzKi8sICcnKS5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbiAgICB9XG5cbiAgICAvLyBVVEYtOCBwc2V1ZG8tcHJvZHVjdGlvbiAoUkZDIDY1MzIpXG4gICAgLy8gUkZDIDY1MzIgZXh0ZW5kcyBSRkMgNTMyMiBwcm9kdWN0aW9ucyB0byBpbmNsdWRlIFVURi04XG4gICAgLy8gdXNpbmcgdGhlIGZvbGxvd2luZyBwcm9kdWN0aW9uczpcbiAgICAvLyBVVEY4LW5vbi1hc2NpaSAgPSAgIFVURjgtMiAvIFVURjgtMyAvIFVURjgtNFxuICAgIC8vIFVURjgtMiAgICAgICAgICA9ICAgPERlZmluZWQgaW4gU2VjdGlvbiA0IG9mIFJGQzM2Mjk+XG4gICAgLy8gVVRGOC0zICAgICAgICAgID0gICA8RGVmaW5lZCBpbiBTZWN0aW9uIDQgb2YgUkZDMzYyOT5cbiAgICAvLyBVVEY4LTQgICAgICAgICAgPSAgIDxEZWZpbmVkIGluIFNlY3Rpb24gNCBvZiBSRkMzNjI5PlxuICAgIC8vXG4gICAgLy8gRm9yIHJlZmVyZW5jZSwgdGhlIGV4dGVuZGVkIFJGQyA1MzIyIHByb2R1Y3Rpb25zIGFyZTpcbiAgICAvLyBWQ0hBUiAgID0vICBVVEY4LW5vbi1hc2NpaVxuICAgIC8vIGN0ZXh0ICAgPS8gIFVURjgtbm9uLWFzY2lpXG4gICAgLy8gYXRleHQgICA9LyAgVVRGOC1ub24tYXNjaWlcbiAgICAvLyBxdGV4dCAgID0vICBVVEY4LW5vbi1hc2NpaVxuICAgIC8vIGR0ZXh0ICAgPS8gIFVURjgtbm9uLWFzY2lpXG4gICAgZnVuY3Rpb24gaXNVVEY4Tm9uQXNjaWkodG9rKSB7XG4gICAgICAgIC8vIEluIEphdmFTY3JpcHQsIHdlIGp1c3QgZGVhbCBkaXJlY3RseSB3aXRoIFVuaWNvZGUgY29kZSBwb2ludHMsXG4gICAgICAgIC8vIHNvIHdlIGFyZW4ndCBjaGVja2luZyBpbmRpdmlkdWFsIGJ5dGVzIGZvciBVVEYtOCBlbmNvZGluZy5cbiAgICAgICAgLy8gSnVzdCBjaGVjayB0aGF0IHRoZSBjaGFyYWN0ZXIgaXMgbm9uLWFzY2lpLlxuICAgICAgICByZXR1cm4gdG9rLmNoYXJDb2RlQXQoMCkgPj0gMTI4O1xuICAgIH1cblxuXG4gICAgLy8gY29tbW9uIHByb2R1Y3Rpb25zIChSRkMgNTIzNClcbiAgICAvLyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MjM0XG4gICAgLy8gQi4xLiBDb3JlIFJ1bGVzXG5cbiAgICAvLyBDUiAgICAgICAgICAgICA9ICAleDBEXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgOyBjYXJyaWFnZSByZXR1cm5cbiAgICBmdW5jdGlvbiBjcigpIHsgcmV0dXJuIHdyYXAoJ2NyJywgbGl0ZXJhbCgnXFxyJykoKSk7IH1cblxuICAgIC8vIENSTEYgICAgICAgICAgID0gIENSIExGXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgOyBJbnRlcm5ldCBzdGFuZGFyZCBuZXdsaW5lXG4gICAgZnVuY3Rpb24gY3JsZigpIHsgcmV0dXJuIHdyYXAoJ2NybGYnLCBhbmQoY3IsIGxmKSgpKTsgfVxuXG4gICAgLy8gRFFVT1RFICAgICAgICAgPSAgJXgyMlxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIDsgXCIgKERvdWJsZSBRdW90ZSlcbiAgICBmdW5jdGlvbiBkcXVvdGUoKSB7IHJldHVybiB3cmFwKCdkcXVvdGUnLCBsaXRlcmFsKCdcIicpKCkpOyB9XG5cbiAgICAvLyBIVEFCICAgICAgICAgICA9ICAleDA5XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgOyBob3Jpem9udGFsIHRhYlxuICAgIGZ1bmN0aW9uIGh0YWIoKSB7IHJldHVybiB3cmFwKCdodGFiJywgbGl0ZXJhbCgnXFx0JykoKSk7IH1cblxuICAgIC8vIExGICAgICAgICAgICAgID0gICV4MEFcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICA7IGxpbmVmZWVkXG4gICAgZnVuY3Rpb24gbGYoKSB7IHJldHVybiB3cmFwKCdsZicsIGxpdGVyYWwoJ1xcbicpKCkpOyB9XG5cbiAgICAvLyBTUCAgICAgICAgICAgICA9ICAleDIwXG4gICAgZnVuY3Rpb24gc3AoKSB7IHJldHVybiB3cmFwKCdzcCcsIGxpdGVyYWwoJyAnKSgpKTsgfVxuXG4gICAgLy8gVkNIQVIgICAgICAgICAgPSAgJXgyMS03RVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIDsgdmlzaWJsZSAocHJpbnRpbmcpIGNoYXJhY3RlcnNcbiAgICBmdW5jdGlvbiB2Y2hhcigpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoJ3ZjaGFyJywgY29tcGFyZVRva2VuKGZ1bmN0aW9uIHZjaGFyRnVuYyh0b2spIHtcbiAgICAgICAgICAgIHZhciBjb2RlID0gdG9rLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICB2YXIgYWNjZXB0ID0gKDB4MjEgPD0gY29kZSAmJiBjb2RlIDw9IDB4N0UpO1xuICAgICAgICAgICAgaWYgKG9wdHMucmZjNjUzMikge1xuICAgICAgICAgICAgICAgIGFjY2VwdCA9IGFjY2VwdCB8fCBpc1VURjhOb25Bc2NpaSh0b2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjY2VwdDtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIFdTUCAgICAgICAgICAgID0gIFNQIC8gSFRBQlxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIDsgd2hpdGUgc3BhY2VcbiAgICBmdW5jdGlvbiB3c3AoKSB7IHJldHVybiB3cmFwKCd3c3AnLCBvcihzcCwgaHRhYikoKSk7IH1cblxuXG4gICAgLy8gZW1haWwgcHJvZHVjdGlvbnMgKFJGQyA1MzIyKVxuICAgIC8vIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzUzMjJcbiAgICAvLyAzLjIuMS4gUXVvdGVkIGNoYXJhY3RlcnNcblxuICAgIC8vIHF1b3RlZC1wYWlyICAgICA9ICAgKFwiXFxcIiAoVkNIQVIgLyBXU1ApKSAvIG9icy1xcFxuICAgIGZ1bmN0aW9uIHF1b3RlZFBhaXIoKSB7XG4gICAgICAgIHZhciBxcCA9IHdyYXAoJ3F1b3RlZC1wYWlyJyxcbiAgICAgICAgb3IoXG4gICAgICAgICAgICBhbmQobGl0ZXJhbCgnXFxcXCcpLCBvcih2Y2hhciwgd3NwKSksXG4gICAgICAgICAgICBvYnNRUFxuICAgICAgICApKCkpO1xuICAgICAgICBpZiAocXAgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgLy8gYSBxdW90ZWQgcGFpciB3aWxsIGJlIHR3byBjaGFyYWN0ZXJzLCBhbmQgdGhlIFwiXFxcIiBjaGFyYWN0ZXJcbiAgICAgICAgLy8gc2hvdWxkIGJlIHNlbWFudGljYWxseSBcImludmlzaWJsZVwiIChSRkMgNTMyMiAzLjIuMSlcbiAgICAgICAgcXAuc2VtYW50aWMgPSBxcC5zZW1hbnRpY1sxXTtcbiAgICAgICAgcmV0dXJuIHFwO1xuICAgIH1cblxuICAgIC8vIDMuMi4yLiBGb2xkaW5nIFdoaXRlIFNwYWNlIGFuZCBDb21tZW50c1xuXG4gICAgLy8gRldTICAgICAgICAgICAgID0gICAoWypXU1AgQ1JMRl0gMSpXU1ApIC8gIG9icy1GV1NcbiAgICBmdW5jdGlvbiBmd3MoKSB7XG4gICAgICAgIHJldHVybiB3cmFwKCdmd3MnLCBvcihcbiAgICAgICAgICAgIG9ic0Z3cyxcbiAgICAgICAgICAgIGFuZChcbiAgICAgICAgICAgICAgICBvcHQoYW5kKFxuICAgICAgICAgICAgICAgICAgICBzdGFyKHdzcCksXG4gICAgICAgICAgICAgICAgICAgIGludmlzKGNybGYpXG4gICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgc3Rhcih3c3AsIDEpXG4gICAgICAgICAgICApXG4gICAgICAgICkoKSk7XG4gICAgfVxuXG4gICAgLy8gY3RleHQgICAgICAgICAgID0gICAlZDMzLTM5IC8gICAgICAgICAgOyBQcmludGFibGUgVVMtQVNDSUlcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICVkNDItOTEgLyAgICAgICAgICA7ICBjaGFyYWN0ZXJzIG5vdCBpbmNsdWRpbmdcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICVkOTMtMTI2IC8gICAgICAgICA7ICBcIihcIiwgXCIpXCIsIG9yIFwiXFxcIlxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgb2JzLWN0ZXh0XG4gICAgZnVuY3Rpb24gY3RleHQoKSB7XG4gICAgICAgIHJldHVybiB3cmFwKCdjdGV4dCcsIG9yKFxuICAgICAgICAgICAgZnVuY3Rpb24gY3RleHRGdW5jMSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZVRva2VuKGZ1bmN0aW9uIGN0ZXh0RnVuYzIodG9rKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2RlID0gdG9rLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhY2NlcHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgKDMzIDw9IGNvZGUgJiYgY29kZSA8PSAzOSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICg0MiA8PSBjb2RlICYmIGNvZGUgPD0gOTEpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoOTMgPD0gY29kZSAmJiBjb2RlIDw9IDEyNik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLnJmYzY1MzIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdCA9IGFjY2VwdCB8fCBpc1VURjhOb25Bc2NpaSh0b2spO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2NlcHQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb2JzQ3RleHRcbiAgICAgICAgKSgpKTtcbiAgICB9XG5cbiAgICAvLyBjY29udGVudCAgICAgICAgPSAgIGN0ZXh0IC8gcXVvdGVkLXBhaXIgLyBjb21tZW50XG4gICAgZnVuY3Rpb24gY2NvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB3cmFwKCdjY29udGVudCcsIG9yKGN0ZXh0LCBxdW90ZWRQYWlyLCBjb21tZW50KSgpKTtcbiAgICB9XG5cbiAgICAvLyBjb21tZW50ICAgICAgICAgPSAgIFwiKFwiICooW0ZXU10gY2NvbnRlbnQpIFtGV1NdIFwiKVwiXG4gICAgZnVuY3Rpb24gY29tbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoJ2NvbW1lbnQnLCBhbmQoXG4gICAgICAgICAgICBsaXRlcmFsKCcoJyksXG4gICAgICAgICAgICBzdGFyKGFuZChvcHQoZndzKSwgY2NvbnRlbnQpKSxcbiAgICAgICAgICAgIG9wdChmd3MpLFxuICAgICAgICAgICAgbGl0ZXJhbCgnKScpXG4gICAgICAgICkoKSk7XG4gICAgfVxuXG4gICAgLy8gQ0ZXUyAgICAgICAgICAgID0gICAoMSooW0ZXU10gY29tbWVudCkgW0ZXU10pIC8gRldTXG4gICAgZnVuY3Rpb24gY2Z3cygpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoJ2Nmd3MnLCBvcihcbiAgICAgICAgICAgIGFuZChcbiAgICAgICAgICAgICAgICBzdGFyKFxuICAgICAgICAgICAgICAgICAgICBhbmQob3B0KGZ3cyksIGNvbW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBvcHQoZndzKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZ3c1xuICAgICAgICApKCkpO1xuICAgIH1cblxuICAgIC8vIDMuMi4zLiBBdG9tXG5cbiAgICAvL2F0ZXh0ICAgICAgICAgICA9ICAgQUxQSEEgLyBESUdJVCAvICAgIDsgUHJpbnRhYmxlIFVTLUFTQ0lJXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgIFwiIVwiIC8gXCIjXCIgLyAgICAgICAgOyAgY2hhcmFjdGVycyBub3QgaW5jbHVkaW5nXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgIFwiJFwiIC8gXCIlXCIgLyAgICAgICAgOyAgc3BlY2lhbHMuICBVc2VkIGZvciBhdG9tcy5cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgXCImXCIgLyBcIidcIiAvXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgIFwiKlwiIC8gXCIrXCIgL1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBcIi1cIiAvIFwiL1wiIC9cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgXCI9XCIgLyBcIj9cIiAvXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgIFwiXlwiIC8gXCJfXCIgL1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBcImBcIiAvIFwie1wiIC9cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgXCJ8XCIgLyBcIn1cIiAvXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgIFwiflwiXG4gICAgZnVuY3Rpb24gYXRleHQoKSB7XG4gICAgICAgIHJldHVybiB3cmFwKCdhdGV4dCcsIGNvbXBhcmVUb2tlbihmdW5jdGlvbiBhdGV4dEZ1bmModG9rKSB7XG4gICAgICAgICAgICB2YXIgYWNjZXB0ID1cbiAgICAgICAgICAgICAgICAoJ2EnIDw9IHRvayAmJiB0b2sgPD0gJ3onKSB8fFxuICAgICAgICAgICAgICAgICgnQScgPD0gdG9rICYmIHRvayA8PSAnWicpIHx8XG4gICAgICAgICAgICAgICAgKCcwJyA8PSB0b2sgJiYgdG9rIDw9ICc5JykgfHxcbiAgICAgICAgICAgICAgICAoWychJywgJyMnLCAnJCcsICclJywgJyYnLCAnXFwnJywgJyonLCAnKycsICctJywgJy8nLFxuICAgICAgICAgICAgICAgICAgJz0nLCAnPycsICdeJywgJ18nLCAnYCcsICd7JywgJ3wnLCAnfScsICd+J10uaW5kZXhPZih0b2spID49IDApO1xuICAgICAgICAgICAgaWYgKG9wdHMucmZjNjUzMikge1xuICAgICAgICAgICAgICAgIGFjY2VwdCA9IGFjY2VwdCB8fCBpc1VURjhOb25Bc2NpaSh0b2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjY2VwdDtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIGF0b20gICAgICAgICAgICA9ICAgW0NGV1NdIDEqYXRleHQgW0NGV1NdXG4gICAgZnVuY3Rpb24gYXRvbSgpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoJ2F0b20nLCBhbmQoY29sd3NwKG9wdChjZndzKSksIHN0YXIoYXRleHQsIDEpLCBjb2x3c3Aob3B0KGNmd3MpKSkoKSk7XG4gICAgfVxuXG4gICAgLy8gZG90LWF0b20tdGV4dCAgID0gICAxKmF0ZXh0ICooXCIuXCIgMSphdGV4dClcbiAgICBmdW5jdGlvbiBkb3RBdG9tVGV4dCgpIHtcbiAgICAgICAgdmFyIHMsIG1heWJlVGV4dDtcbiAgICAgICAgcyA9IHdyYXAoJ2RvdC1hdG9tLXRleHQnLCBzdGFyKGF0ZXh0LCAxKSgpKTtcbiAgICAgICAgaWYgKHMgPT09IG51bGwpIHsgcmV0dXJuIHM7IH1cbiAgICAgICAgbWF5YmVUZXh0ID0gc3RhcihhbmQobGl0ZXJhbCgnLicpLCBzdGFyKGF0ZXh0LCAxKSkpKCk7XG4gICAgICAgIGlmIChtYXliZVRleHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGFkZChzLCBtYXliZVRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cblxuICAgIC8vIGRvdC1hdG9tICAgICAgICA9ICAgW0NGV1NdIGRvdC1hdG9tLXRleHQgW0NGV1NdXG4gICAgZnVuY3Rpb24gZG90QXRvbSgpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoJ2RvdC1hdG9tJywgYW5kKGludmlzKG9wdChjZndzKSksIGRvdEF0b21UZXh0LCBpbnZpcyhvcHQoY2Z3cykpKSgpKTtcbiAgICB9XG5cbiAgICAvLyAzLjIuNC4gUXVvdGVkIFN0cmluZ3NcblxuICAgIC8vICBxdGV4dCAgICAgICAgICAgPSAgICVkMzMgLyAgICAgICAgICAgICA7IFByaW50YWJsZSBVUy1BU0NJSVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICVkMzUtOTEgLyAgICAgICAgICA7ICBjaGFyYWN0ZXJzIG5vdCBpbmNsdWRpbmdcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAlZDkzLTEyNiAvICAgICAgICAgOyAgXCJcXFwiIG9yIHRoZSBxdW90ZSBjaGFyYWN0ZXJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBvYnMtcXRleHRcbiAgICBmdW5jdGlvbiBxdGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoJ3F0ZXh0Jywgb3IoXG4gICAgICAgICAgICBmdW5jdGlvbiBxdGV4dEZ1bmMxKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlVG9rZW4oZnVuY3Rpb24gcXRleHRGdW5jMih0b2spIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvZGUgPSB0b2suY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFjY2VwdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAoMzMgPT09IGNvZGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoMzUgPD0gY29kZSAmJiBjb2RlIDw9IDkxKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKDkzIDw9IGNvZGUgJiYgY29kZSA8PSAxMjYpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5yZmM2NTMyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQgPSBhY2NlcHQgfHwgaXNVVEY4Tm9uQXNjaWkodG9rKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXB0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9ic1F0ZXh0XG4gICAgICAgICkoKSk7XG4gICAgfVxuXG4gICAgLy8gcWNvbnRlbnQgICAgICAgID0gICBxdGV4dCAvIHF1b3RlZC1wYWlyXG4gICAgZnVuY3Rpb24gcWNvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB3cmFwKCdxY29udGVudCcsIG9yKHF0ZXh0LCBxdW90ZWRQYWlyKSgpKTtcbiAgICB9XG5cbiAgICAvLyAgcXVvdGVkLXN0cmluZyAgID0gICBbQ0ZXU11cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBEUVVPVEUgKihbRldTXSBxY29udGVudCkgW0ZXU10gRFFVT1RFXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgW0NGV1NdXG4gICAgZnVuY3Rpb24gcXVvdGVkU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gd3JhcCgncXVvdGVkLXN0cmluZycsIGFuZChcbiAgICAgICAgICAgIGludmlzKG9wdChjZndzKSksXG4gICAgICAgICAgICBpbnZpcyhkcXVvdGUpLCBzdGFyKGFuZChvcHQoY29sd3NwKGZ3cykpLCBxY29udGVudCkpLCBvcHQoaW52aXMoZndzKSksIGludmlzKGRxdW90ZSksXG4gICAgICAgICAgICBpbnZpcyhvcHQoY2Z3cykpXG4gICAgICAgICkoKSk7XG4gICAgfVxuXG4gICAgLy8gMy4yLjUgTWlzY2VsbGFuZW91cyBUb2tlbnNcblxuICAgIC8vIHdvcmQgICAgICAgICAgICA9ICAgYXRvbSAvIHF1b3RlZC1zdHJpbmdcbiAgICBmdW5jdGlvbiB3b3JkKCkge1xuICAgICAgICByZXR1cm4gd3JhcCgnd29yZCcsIG9yKGF0b20sIHF1b3RlZFN0cmluZykoKSk7XG4gICAgfVxuXG4gICAgLy8gcGhyYXNlICAgICAgICAgID0gICAxKndvcmQgLyBvYnMtcGhyYXNlXG4gICAgZnVuY3Rpb24gcGhyYXNlKCkge1xuICAgICAgICByZXR1cm4gd3JhcCgncGhyYXNlJywgb3Iob2JzUGhyYXNlLCBzdGFyKHdvcmQsIDEpKSgpKTtcbiAgICB9XG5cbiAgICAvLyAzLjQuIEFkZHJlc3MgU3BlY2lmaWNhdGlvblxuICAgIC8vICAgYWRkcmVzcyAgICAgICAgID0gICBtYWlsYm94IC8gZ3JvdXBcbiAgICBmdW5jdGlvbiBhZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gd3JhcCgnYWRkcmVzcycsIG9yKG1haWxib3gsIGdyb3VwKSgpKTtcbiAgICB9XG5cbiAgICAvLyAgIG1haWxib3ggICAgICAgICA9ICAgbmFtZS1hZGRyIC8gYWRkci1zcGVjXG4gICAgZnVuY3Rpb24gbWFpbGJveCgpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoJ21haWxib3gnLCBvcihuYW1lQWRkciwgYWRkclNwZWMpKCkpO1xuICAgIH1cblxuICAgIC8vICAgbmFtZS1hZGRyICAgICAgID0gICBbZGlzcGxheS1uYW1lXSBhbmdsZS1hZGRyXG4gICAgZnVuY3Rpb24gbmFtZUFkZHIoKSB7XG4gICAgICAgIHJldHVybiB3cmFwKCduYW1lLWFkZHInLCBhbmQob3B0KGRpc3BsYXlOYW1lKSwgYW5nbGVBZGRyKSgpKTtcbiAgICB9XG5cbiAgICAvLyAgIGFuZ2xlLWFkZHIgICAgICA9ICAgW0NGV1NdIFwiPFwiIGFkZHItc3BlYyBcIj5cIiBbQ0ZXU10gL1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBvYnMtYW5nbGUtYWRkclxuICAgIGZ1bmN0aW9uIGFuZ2xlQWRkcigpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoJ2FuZ2xlLWFkZHInLCBvcihcbiAgICAgICAgICAgIGFuZChcbiAgICAgICAgICAgICAgICBpbnZpcyhvcHQoY2Z3cykpLFxuICAgICAgICAgICAgICAgIGxpdGVyYWwoJzwnKSxcbiAgICAgICAgICAgICAgICBhZGRyU3BlYyxcbiAgICAgICAgICAgICAgICBsaXRlcmFsKCc+JyksXG4gICAgICAgICAgICAgICAgaW52aXMob3B0KGNmd3MpKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG9ic0FuZ2xlQWRkclxuICAgICAgICApKCkpO1xuICAgIH1cblxuICAgIC8vICAgZ3JvdXAgICAgICAgICAgID0gICBkaXNwbGF5LW5hbWUgXCI6XCIgW2dyb3VwLWxpc3RdIFwiO1wiIFtDRldTXVxuICAgIGZ1bmN0aW9uIGdyb3VwKCkge1xuICAgICAgICByZXR1cm4gd3JhcCgnZ3JvdXAnLCBhbmQoXG4gICAgICAgICAgICBkaXNwbGF5TmFtZSxcbiAgICAgICAgICAgIGxpdGVyYWwoJzonKSxcbiAgICAgICAgICAgIG9wdChncm91cExpc3QpLFxuICAgICAgICAgICAgbGl0ZXJhbCgnOycpLFxuICAgICAgICAgICAgaW52aXMob3B0KGNmd3MpKVxuICAgICAgICApKCkpO1xuICAgIH1cblxuICAgIC8vICAgZGlzcGxheS1uYW1lICAgID0gICBwaHJhc2VcbiAgICBmdW5jdGlvbiBkaXNwbGF5TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoJ2Rpc3BsYXktbmFtZScsIGZ1bmN0aW9uIHBocmFzZUZpeGVkU2VtYW50aWMoKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGhyYXNlKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnNlbWFudGljID0gY29sbGFwc2VXaGl0ZXNwYWNlKHJlc3VsdC5zZW1hbnRpYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KCkpO1xuICAgIH1cblxuICAgIC8vICAgbWFpbGJveC1saXN0ICAgID0gICAobWFpbGJveCAqKFwiLFwiIG1haWxib3gpKSAvIG9icy1tYm94LWxpc3RcbiAgICBmdW5jdGlvbiBtYWlsYm94TGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoJ21haWxib3gtbGlzdCcsIG9yKFxuICAgICAgICAgICAgYW5kKFxuICAgICAgICAgICAgICAgIG1haWxib3gsXG4gICAgICAgICAgICAgICAgc3RhcihhbmQobGl0ZXJhbCgnLCcpLCBtYWlsYm94KSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBvYnNNYm94TGlzdFxuICAgICAgICApKCkpO1xuICAgIH1cblxuICAgIC8vICAgYWRkcmVzcy1saXN0ICAgID0gICAoYWRkcmVzcyAqKFwiLFwiIGFkZHJlc3MpKSAvIG9icy1hZGRyLWxpc3RcbiAgICBmdW5jdGlvbiBhZGRyZXNzTGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoJ2FkZHJlc3MtbGlzdCcsIG9yKFxuICAgICAgICAgICAgYW5kKFxuICAgICAgICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgICAgICAgc3RhcihhbmQobGl0ZXJhbCgnLCcpLCBhZGRyZXNzKSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBvYnNBZGRyTGlzdFxuICAgICAgICApKCkpO1xuICAgIH1cblxuICAgIC8vICAgZ3JvdXAtbGlzdCAgICAgID0gICBtYWlsYm94LWxpc3QgLyBDRldTIC8gb2JzLWdyb3VwLWxpc3RcbiAgICBmdW5jdGlvbiBncm91cExpc3QoKSB7XG4gICAgICAgIHJldHVybiB3cmFwKCdncm91cC1saXN0Jywgb3IoXG4gICAgICAgICAgICBtYWlsYm94TGlzdCxcbiAgICAgICAgICAgIGludmlzKGNmd3MpLFxuICAgICAgICAgICAgb2JzR3JvdXBMaXN0XG4gICAgICAgICkoKSk7XG4gICAgfVxuXG4gICAgLy8gMy40LjEgQWRkci1TcGVjIFNwZWNpZmljYXRpb25cblxuICAgIC8vIGxvY2FsLXBhcnQgICAgICA9ICAgZG90LWF0b20gLyBxdW90ZWQtc3RyaW5nIC8gb2JzLWxvY2FsLXBhcnRcbiAgICBmdW5jdGlvbiBsb2NhbFBhcnQoKSB7XG4gICAgICAgIC8vIG5vdGU6IHF1b3RlZC1zdHJpbmcsIGRvdEF0b20gYXJlIHByb3BlciBzdWJzZXRzIG9mIG9icy1sb2NhbC1wYXJ0XG4gICAgICAgIC8vIHNvIHdlIHJlYWxseSBqdXN0IGhhdmUgdG8gbG9vayBmb3Igb2JzTG9jYWxQYXJ0LCBpZiB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBleGFjdCBwYXJzZSB0cmVlXG4gICAgICAgIHJldHVybiB3cmFwKCdsb2NhbC1wYXJ0Jywgb3Iob2JzTG9jYWxQYXJ0LCBkb3RBdG9tLCBxdW90ZWRTdHJpbmcpKCkpO1xuICAgIH1cblxuICAgIC8vICBkdGV4dCAgICAgICAgICAgPSAgICVkMzMtOTAgLyAgICAgICAgICA7IFByaW50YWJsZSBVUy1BU0NJSVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICVkOTQtMTI2IC8gICAgICAgICA7ICBjaGFyYWN0ZXJzIG5vdCBpbmNsdWRpbmdcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBvYnMtZHRleHQgICAgICAgICAgOyAgXCJbXCIsIFwiXVwiLCBvciBcIlxcXCJcbiAgICBmdW5jdGlvbiBkdGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoJ2R0ZXh0Jywgb3IoXG4gICAgICAgICAgICBmdW5jdGlvbiBkdGV4dEZ1bmMxKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlVG9rZW4oZnVuY3Rpb24gZHRleHRGdW5jMih0b2spIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvZGUgPSB0b2suY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFjY2VwdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAoMzMgPD0gY29kZSAmJiBjb2RlIDw9IDkwKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKDk0IDw9IGNvZGUgJiYgY29kZSA8PSAxMjYpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5yZmM2NTMyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQgPSBhY2NlcHQgfHwgaXNVVEY4Tm9uQXNjaWkodG9rKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXB0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9ic0R0ZXh0XG4gICAgICAgICAgICApKClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBkb21haW4tbGl0ZXJhbCAgPSAgIFtDRldTXSBcIltcIiAqKFtGV1NdIGR0ZXh0KSBbRldTXSBcIl1cIiBbQ0ZXU11cbiAgICBmdW5jdGlvbiBkb21haW5MaXRlcmFsKCkge1xuICAgICAgICByZXR1cm4gd3JhcCgnZG9tYWluLWxpdGVyYWwnLCBhbmQoXG4gICAgICAgICAgICBpbnZpcyhvcHQoY2Z3cykpLFxuICAgICAgICAgICAgbGl0ZXJhbCgnWycpLFxuICAgICAgICAgICAgc3RhcihhbmQob3B0KGZ3cyksIGR0ZXh0KSksXG4gICAgICAgICAgICBvcHQoZndzKSxcbiAgICAgICAgICAgIGxpdGVyYWwoJ10nKSxcbiAgICAgICAgICAgIGludmlzKG9wdChjZndzKSlcbiAgICAgICAgKSgpKTtcbiAgICB9XG5cbiAgICAvLyBkb21haW4gICAgICAgICAgPSAgIGRvdC1hdG9tIC8gZG9tYWluLWxpdGVyYWwgLyBvYnMtZG9tYWluXG4gICAgZnVuY3Rpb24gZG9tYWluKCkge1xuICAgICAgICByZXR1cm4gd3JhcCgnZG9tYWluJywgZnVuY3Rpb24gZG9tYWluQ2hlY2tUTEQoKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gb3Iob2JzRG9tYWluLCBkb3RBdG9tLCBkb21haW5MaXRlcmFsKSgpO1xuICAgICAgICAgICAgaWYgKG9wdHMucmVqZWN0VExEKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zZW1hbnRpYy5pbmRleE9mKCcuJykgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHN0cmlwIGFsbCB3aGl0ZXNwYWNlIGZyb20gZG9tYWluc1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZW1hbnRpYyA9IHJlc3VsdC5zZW1hbnRpYy5yZXBsYWNlKC9cXHMrL2csICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0oKSk7XG4gICAgfVxuXG4gICAgLy8gYWRkci1zcGVjICAgICAgID0gICBsb2NhbC1wYXJ0IFwiQFwiIGRvbWFpblxuICAgIGZ1bmN0aW9uIGFkZHJTcGVjKCkge1xuICAgICAgICByZXR1cm4gd3JhcCgnYWRkci1zcGVjJywgYW5kKFxuICAgICAgICAgICAgbG9jYWxQYXJ0LCBsaXRlcmFsKCdAJyksIGRvbWFpblxuICAgICAgICApKCkpO1xuICAgIH1cblxuICAgIC8vIDMuNi4yIE9yaWdpbmF0b3IgRmllbGRzXG4gICAgLy8gQmVsb3cgd2Ugb25seSBwYXJzZSB0aGUgZmllbGQgYm9keSwgbm90IHRoZSBuYW1lIG9mIHRoZSBmaWVsZFxuICAgIC8vIGxpa2UgXCJGcm9tOlwiLCBcIlNlbmRlcjpcIiwgb3IgXCJSZXBseS1UbzpcIi4gT3RoZXIgbGlicmFyaWVzIHRoYXRcbiAgICAvLyBwYXJzZSBlbWFpbCBoZWFkZXJzIGNhbiBwYXJzZSB0aG9zZSBhbmQgZGVmZXIgdG8gdGhlc2UgcHJvZHVjdGlvbnNcbiAgICAvLyBmb3IgdGhlIFwiUkZDIDUzMjJcIiBwYXJ0LlxuXG4gICAgLy8gUkZDIDY4NTQgMi4xLiBSZXBsYWNlbWVudCBvZiBSRkMgNTMyMiwgU2VjdGlvbiAzLjYuMi4gT3JpZ2luYXRvciBGaWVsZHNcbiAgICAvLyBmcm9tID0gXCJGcm9tOlwiIChtYWlsYm94LWxpc3QgLyBhZGRyZXNzLWxpc3QpIENSTEZcbiAgICBmdW5jdGlvbiBmcm9tU3BlYygpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoJ2Zyb20nLCBvcihcbiAgICAgICAgICAgIG1haWxib3hMaXN0LFxuICAgICAgICAgICAgYWRkcmVzc0xpc3RcbiAgICAgICAgKSgpKTtcbiAgICB9XG5cbiAgICAvLyBSRkMgNjg1NCAyLjEuIFJlcGxhY2VtZW50IG9mIFJGQyA1MzIyLCBTZWN0aW9uIDMuNi4yLiBPcmlnaW5hdG9yIEZpZWxkc1xuICAgIC8vIHNlbmRlciA9IFwiU2VuZGVyOlwiIChtYWlsYm94IC8gYWRkcmVzcykgQ1JMRlxuICAgIGZ1bmN0aW9uIHNlbmRlclNwZWMoKSB7XG4gICAgICAgIHJldHVybiB3cmFwKCdzZW5kZXInLCBvcihcbiAgICAgICAgICAgIG1haWxib3gsXG4gICAgICAgICAgICBhZGRyZXNzXG4gICAgICAgICkoKSk7XG4gICAgfVxuXG4gICAgLy8gUkZDIDY4NTQgMi4xLiBSZXBsYWNlbWVudCBvZiBSRkMgNTMyMiwgU2VjdGlvbiAzLjYuMi4gT3JpZ2luYXRvciBGaWVsZHNcbiAgICAvLyByZXBseS10byA9IFwiUmVwbHktVG86XCIgYWRkcmVzcy1saXN0IENSTEZcbiAgICBmdW5jdGlvbiByZXBseVRvU3BlYygpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoJ3JlcGx5LXRvJywgYWRkcmVzc0xpc3QoKSk7XG4gICAgfVxuXG4gICAgLy8gNC4xLiBNaXNjZWxsYW5lb3VzIE9ic29sZXRlIFRva2Vuc1xuXG4gICAgLy8gIG9icy1OTy1XUy1DVEwgICA9ICAgJWQxLTggLyAgICAgICAgICAgIDsgVVMtQVNDSUkgY29udHJvbFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICVkMTEgLyAgICAgICAgICAgICA7ICBjaGFyYWN0ZXJzIHRoYXQgZG8gbm90XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgJWQxMiAvICAgICAgICAgICAgIDsgIGluY2x1ZGUgdGhlIGNhcnJpYWdlXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgJWQxNC0zMSAvICAgICAgICAgIDsgIHJldHVybiwgbGluZSBmZWVkLCBhbmRcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAlZDEyNyAgICAgICAgICAgICAgOyAgd2hpdGUgc3BhY2UgY2hhcmFjdGVyc1xuICAgIGZ1bmN0aW9uIG9ic05vV3NDdGwoKSB7XG4gICAgICAgIHJldHVybiBvcHRzLnN0cmljdCA/IG51bGwgOiB3cmFwKCdvYnMtTk8tV1MtQ1RMJywgY29tcGFyZVRva2VuKGZ1bmN0aW9uICh0b2spIHtcbiAgICAgICAgICAgIHZhciBjb2RlID0gdG9rLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICByZXR1cm4gKCgxIDw9IGNvZGUgJiYgY29kZSA8PSA4KSB8fFxuICAgICAgICAgICAgICAgICAgICAoMTEgPT09IGNvZGUgfHwgMTIgPT09IGNvZGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICgxNCA8PSBjb2RlICYmIGNvZGUgPD0gMzEpIHx8XG4gICAgICAgICAgICAgICAgICAgICgxMjcgPT09IGNvZGUpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIG9icy1jdGV4dCAgICAgICA9ICAgb2JzLU5PLVdTLUNUTFxuICAgIGZ1bmN0aW9uIG9ic0N0ZXh0KCkgeyByZXR1cm4gb3B0cy5zdHJpY3QgPyBudWxsIDogd3JhcCgnb2JzLWN0ZXh0Jywgb2JzTm9Xc0N0bCgpKTsgfVxuXG4gICAgLy8gb2JzLXF0ZXh0ICAgICAgID0gICBvYnMtTk8tV1MtQ1RMXG4gICAgZnVuY3Rpb24gb2JzUXRleHQoKSB7IHJldHVybiBvcHRzLnN0cmljdCA/IG51bGwgOiB3cmFwKCdvYnMtcXRleHQnLCBvYnNOb1dzQ3RsKCkpOyB9XG5cbiAgICAvLyBvYnMtcXAgICAgICAgICAgPSAgIFwiXFxcIiAoJWQwIC8gb2JzLU5PLVdTLUNUTCAvIExGIC8gQ1IpXG4gICAgZnVuY3Rpb24gb2JzUVAoKSB7XG4gICAgICAgIHJldHVybiBvcHRzLnN0cmljdCA/IG51bGwgOiB3cmFwKCdvYnMtcXAnLCBhbmQoXG4gICAgICAgICAgICBsaXRlcmFsKCdcXFxcJyksXG4gICAgICAgICAgICBvcihsaXRlcmFsKCdcXDAnKSwgb2JzTm9Xc0N0bCwgbGYsIGNyKVxuICAgICAgICApKCkpO1xuICAgIH1cblxuICAgIC8vIG9icy1waHJhc2UgICAgICA9ICAgd29yZCAqKHdvcmQgLyBcIi5cIiAvIENGV1MpXG4gICAgZnVuY3Rpb24gb2JzUGhyYXNlKCkge1xuICAgICAgICByZXR1cm4gb3B0cy5zdHJpY3QgPyBudWxsIDogd3JhcCgnb2JzLXBocmFzZScsIGFuZChcbiAgICAgICAgICAgIHdvcmQsXG4gICAgICAgICAgICBzdGFyKG9yKHdvcmQsIGxpdGVyYWwoJy4nKSwgY29sd3NwKGNmd3MpKSlcbiAgICAgICAgKSgpKTtcbiAgICB9XG5cbiAgICAvLyA0LjIuIE9ic29sZXRlIEZvbGRpbmcgV2hpdGUgU3BhY2VcblxuICAgIC8vIE5PVEU6IHJlYWQgdGhlIGVycmF0YSBodHRwOi8vd3d3LnJmYy1lZGl0b3Iub3JnL2VycmF0YV9zZWFyY2gucGhwP3JmYz01MzIyJmVpZD0xOTA4XG4gICAgLy8gb2JzLUZXUyAgICAgICAgID0gICAxKihbQ1JMRl0gV1NQKVxuICAgIGZ1bmN0aW9uIG9ic0Z3cygpIHtcbiAgICAgICAgcmV0dXJuIG9wdHMuc3RyaWN0ID8gbnVsbCA6IHdyYXAoJ29icy1GV1MnLCBzdGFyKFxuICAgICAgICAgICAgYW5kKGludmlzKG9wdChjcmxmKSksIHdzcCksXG4gICAgICAgICAgICAxXG4gICAgICAgICkoKSk7XG4gICAgfVxuXG4gICAgLy8gNC40LiBPYnNvbGV0ZSBBZGRyZXNzaW5nXG5cbiAgICAvLyBvYnMtYW5nbGUtYWRkciAgPSAgIFtDRldTXSBcIjxcIiBvYnMtcm91dGUgYWRkci1zcGVjIFwiPlwiIFtDRldTXVxuICAgIGZ1bmN0aW9uIG9ic0FuZ2xlQWRkcigpIHtcbiAgICAgICAgcmV0dXJuIG9wdHMuc3RyaWN0ID8gbnVsbCA6IHdyYXAoJ29icy1hbmdsZS1hZGRyJywgYW5kKFxuICAgICAgICAgICAgaW52aXMob3B0KGNmd3MpKSxcbiAgICAgICAgICAgIGxpdGVyYWwoJzwnKSxcbiAgICAgICAgICAgIG9ic1JvdXRlLFxuICAgICAgICAgICAgYWRkclNwZWMsXG4gICAgICAgICAgICBsaXRlcmFsKCc+JyksXG4gICAgICAgICAgICBpbnZpcyhvcHQoY2Z3cykpXG4gICAgICAgICkoKSk7XG4gICAgfVxuXG4gICAgLy8gb2JzLXJvdXRlICAgICAgID0gICBvYnMtZG9tYWluLWxpc3QgXCI6XCJcbiAgICBmdW5jdGlvbiBvYnNSb3V0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG9wdHMuc3RyaWN0ID8gbnVsbCA6IHdyYXAoJ29icy1yb3V0ZScsIGFuZChcbiAgICAgICAgICAgIG9ic0RvbWFpbkxpc3QsXG4gICAgICAgICAgICBsaXRlcmFsKCc6JylcbiAgICAgICAgKSgpKTtcbiAgICB9XG5cbiAgICAvLyAgIG9icy1kb21haW4tbGlzdCA9ICAgKihDRldTIC8gXCIsXCIpIFwiQFwiIGRvbWFpblxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAqKFwiLFwiIFtDRldTXSBbXCJAXCIgZG9tYWluXSlcbiAgICBmdW5jdGlvbiBvYnNEb21haW5MaXN0KCkge1xuICAgICAgICByZXR1cm4gb3B0cy5zdHJpY3QgPyBudWxsIDogd3JhcCgnb2JzLWRvbWFpbi1saXN0JywgYW5kKFxuICAgICAgICAgICAgc3RhcihvcihpbnZpcyhjZndzKSwgbGl0ZXJhbCgnLCcpKSksXG4gICAgICAgICAgICBsaXRlcmFsKCdAJyksXG4gICAgICAgICAgICBkb21haW4sXG4gICAgICAgICAgICBzdGFyKGFuZChcbiAgICAgICAgICAgICAgICBsaXRlcmFsKCcsJyksXG4gICAgICAgICAgICAgICAgaW52aXMob3B0KGNmd3MpKSxcbiAgICAgICAgICAgICAgICBvcHQoYW5kKGxpdGVyYWwoJ0AnKSwgZG9tYWluKSlcbiAgICAgICAgICAgICkpXG4gICAgICAgICkoKSk7XG4gICAgfVxuXG4gICAgLy8gb2JzLW1ib3gtbGlzdCAgID0gICAqKFtDRldTXSBcIixcIikgbWFpbGJveCAqKFwiLFwiIFttYWlsYm94IC8gQ0ZXU10pXG4gICAgZnVuY3Rpb24gb2JzTWJveExpc3QoKSB7XG4gICAgICAgIHJldHVybiBvcHRzLnN0cmljdCA/IG51bGwgOiB3cmFwKCdvYnMtbWJveC1saXN0JywgYW5kKFxuICAgICAgICAgICAgc3RhcihhbmQoXG4gICAgICAgICAgICAgICAgaW52aXMob3B0KGNmd3MpKSxcbiAgICAgICAgICAgICAgICBsaXRlcmFsKCcsJylcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgbWFpbGJveCxcbiAgICAgICAgICAgIHN0YXIoYW5kKFxuICAgICAgICAgICAgICAgIGxpdGVyYWwoJywnKSxcbiAgICAgICAgICAgICAgICBvcHQoYW5kKFxuICAgICAgICAgICAgICAgICAgICBtYWlsYm94LFxuICAgICAgICAgICAgICAgICAgICBpbnZpcyhjZndzKVxuICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICApKVxuICAgICAgICApKCkpO1xuICAgIH1cblxuICAgIC8vIG9icy1hZGRyLWxpc3QgICA9ICAgKihbQ0ZXU10gXCIsXCIpIGFkZHJlc3MgKihcIixcIiBbYWRkcmVzcyAvIENGV1NdKVxuICAgIGZ1bmN0aW9uIG9ic0FkZHJMaXN0KCkge1xuICAgICAgICByZXR1cm4gb3B0cy5zdHJpY3QgPyBudWxsIDogd3JhcCgnb2JzLWFkZHItbGlzdCcsIGFuZChcbiAgICAgICAgICAgIHN0YXIoYW5kKFxuICAgICAgICAgICAgICAgIGludmlzKG9wdChjZndzKSksXG4gICAgICAgICAgICAgICAgbGl0ZXJhbCgnLCcpXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgICBzdGFyKGFuZChcbiAgICAgICAgICAgICAgICBsaXRlcmFsKCcsJyksXG4gICAgICAgICAgICAgICAgb3B0KGFuZChcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgICAgICAgICAgICAgaW52aXMoY2Z3cylcbiAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgKSlcbiAgICAgICAgKSgpKTtcbiAgICB9XG5cbiAgICAvLyBvYnMtZ3JvdXAtbGlzdCAgPSAgIDEqKFtDRldTXSBcIixcIikgW0NGV1NdXG4gICAgZnVuY3Rpb24gb2JzR3JvdXBMaXN0KCkge1xuICAgICAgICByZXR1cm4gb3B0cy5zdHJpY3QgPyBudWxsIDogd3JhcCgnb2JzLWdyb3VwLWxpc3QnLCBhbmQoXG4gICAgICAgICAgICBzdGFyKGFuZChcbiAgICAgICAgICAgICAgICBpbnZpcyhvcHQoY2Z3cykpLFxuICAgICAgICAgICAgICAgIGxpdGVyYWwoJywnKVxuICAgICAgICAgICAgKSwgMSksXG4gICAgICAgICAgICBpbnZpcyhvcHQoY2Z3cykpXG4gICAgICAgICkoKSk7XG4gICAgfVxuXG4gICAgLy8gb2JzLWxvY2FsLXBhcnQgPSB3b3JkICooXCIuXCIgd29yZClcbiAgICBmdW5jdGlvbiBvYnNMb2NhbFBhcnQoKSB7XG4gICAgICAgIHJldHVybiBvcHRzLnN0cmljdCA/IG51bGwgOiB3cmFwKCdvYnMtbG9jYWwtcGFydCcsIGFuZCh3b3JkLCBzdGFyKGFuZChsaXRlcmFsKCcuJyksIHdvcmQpKSkoKSk7XG4gICAgfVxuXG4gICAgLy8gb2JzLWRvbWFpbiAgICAgICA9IGF0b20gKihcIi5cIiBhdG9tKVxuICAgIGZ1bmN0aW9uIG9ic0RvbWFpbigpIHtcbiAgICAgICAgcmV0dXJuIG9wdHMuc3RyaWN0ID8gbnVsbCA6IHdyYXAoJ29icy1kb21haW4nLCBhbmQoYXRvbSwgc3RhcihhbmQobGl0ZXJhbCgnLicpLCBhdG9tKSkpKCkpO1xuICAgIH1cblxuICAgIC8vIG9icy1kdGV4dCAgICAgICA9ICAgb2JzLU5PLVdTLUNUTCAvIHF1b3RlZC1wYWlyXG4gICAgZnVuY3Rpb24gb2JzRHRleHQoKSB7XG4gICAgICAgIHJldHVybiBvcHRzLnN0cmljdCA/IG51bGwgOiB3cmFwKCdvYnMtZHRleHQnLCBvcihvYnNOb1dzQ3RsLCBxdW90ZWRQYWlyKSgpKTtcbiAgICB9XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgLy8gYXN0IGFuYWx5c2lzXG5cbiAgICBmdW5jdGlvbiBmaW5kTm9kZShuYW1lLCByb290KSB7XG4gICAgICAgIHZhciBpLCBzdGFjaywgbm9kZTtcbiAgICAgICAgaWYgKHJvb3QgPT09IG51bGwgfHwgcm9vdCA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBudWxsOyB9XG4gICAgICAgIHN0YWNrID0gW3Jvb3RdO1xuICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbm9kZSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgaWYgKG5vZGUubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpID0gbm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2gobm9kZS5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmluZEFsbE5vZGVzKG5hbWUsIHJvb3QpIHtcbiAgICAgICAgdmFyIGksIHN0YWNrLCBub2RlLCByZXN1bHQ7XG4gICAgICAgIGlmIChyb290ID09PSBudWxsIHx8IHJvb3QgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gbnVsbDsgfVxuICAgICAgICBzdGFjayA9IFtyb290XTtcbiAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBub2RlID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBpZiAobm9kZS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGkgPSBub2RlLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICAgICAgICAgICAgc3RhY2sucHVzaChub2RlLmNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpbmRBbGxOb2Rlc05vQ2hpbGRyZW4obmFtZXMsIHJvb3QpIHtcbiAgICAgICAgdmFyIGksIHN0YWNrLCBub2RlLCByZXN1bHQsIG5hbWVzTG9va3VwO1xuICAgICAgICBpZiAocm9vdCA9PT0gbnVsbCB8fCByb290ID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgc3RhY2sgPSBbcm9vdF07XG4gICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICBuYW1lc0xvb2t1cCA9IHt9O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIG5hbWVzTG9va3VwW25hbWVzW2ldXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbm9kZSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgaWYgKG5vZGUubmFtZSBpbiBuYW1lc0xvb2t1cCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIC8vIGRvbid0IGxvb2sgYXQgY2hpbGRyZW4gKGhlbmNlIGZpbmRBbGxOb2Rlc05vQ2hpbGRyZW4pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChub2RlLmNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnaXZlUmVzdWx0KGFzdCkge1xuICAgICAgICB2YXIgYWRkcmVzc2VzLCBncm91cHNBbmRNYWlsYm94ZXMsIGksIGdyb3VwT3JNYWlsYm94LCByZXN1bHQ7XG4gICAgICAgIGlmIChhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGFkZHJlc3NlcyA9IFtdO1xuXG4gICAgICAgIC8vIEFuIGFkZHJlc3MgaXMgYSAnZ3JvdXAnIChpLmUuIGEgbGlzdCBvZiBtYWlsYm94ZXMpIG9yIGEgJ21haWxib3gnLlxuICAgICAgICBncm91cHNBbmRNYWlsYm94ZXMgPSBmaW5kQWxsTm9kZXNOb0NoaWxkcmVuKFsnZ3JvdXAnLCAnbWFpbGJveCddLCBhc3QpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgIGdyb3Vwc0FuZE1haWxib3hlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgZ3JvdXBPck1haWxib3ggPSBncm91cHNBbmRNYWlsYm94ZXNbaV07XG4gICAgICAgICAgICBpZiAoZ3JvdXBPck1haWxib3gubmFtZSA9PT0gJ2dyb3VwJykge1xuICAgICAgICAgICAgICAgIGFkZHJlc3Nlcy5wdXNoKGdpdmVSZXN1bHRHcm91cChncm91cE9yTWFpbGJveCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChncm91cE9yTWFpbGJveC5uYW1lID09PSAnbWFpbGJveCcpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzZXMucHVzaChnaXZlUmVzdWx0TWFpbGJveChncm91cE9yTWFpbGJveCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgYXN0OiBhc3QsXG4gICAgICAgICAgICBhZGRyZXNzZXM6IGFkZHJlc3NlcyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdHMuc2ltcGxlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzaW1wbGlmeVJlc3VsdChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLm9uZVJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIG9uZVJlc3VsdChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLnNpbXBsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuYWRkcmVzc2VzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdpdmVSZXN1bHRHcm91cChncm91cCkge1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgdmFyIGdyb3VwTmFtZSA9IGZpbmROb2RlKCdkaXNwbGF5LW5hbWUnLCBncm91cCk7XG4gICAgICAgIHZhciBncm91cFJlc3VsdE1haWxib3hlcyA9IFtdO1xuICAgICAgICB2YXIgbWFpbGJveGVzID0gZmluZEFsbE5vZGVzTm9DaGlsZHJlbihbJ21haWxib3gnXSwgZ3JvdXApO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWFpbGJveGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBncm91cFJlc3VsdE1haWxib3hlcy5wdXNoKGdpdmVSZXN1bHRNYWlsYm94KG1haWxib3hlc1tpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlOiBncm91cCxcbiAgICAgICAgICAgIHBhcnRzOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogZ3JvdXBOYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGU6IGdyb3VwLm5hbWUsIC8vICdncm91cCdcbiAgICAgICAgICAgIG5hbWU6IGdyYWJTZW1hbnRpYyhncm91cE5hbWUpLFxuICAgICAgICAgICAgYWRkcmVzc2VzOiBncm91cFJlc3VsdE1haWxib3hlcyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnaXZlUmVzdWx0TWFpbGJveChtYWlsYm94KSB7XG4gICAgICAgIHZhciBuYW1lID0gZmluZE5vZGUoJ2Rpc3BsYXktbmFtZScsIG1haWxib3gpO1xuICAgICAgICB2YXIgYXNwZWMgPSBmaW5kTm9kZSgnYWRkci1zcGVjJywgbWFpbGJveCk7XG4gICAgICAgIHZhciBjb21tZW50cyA9IGZpbmRBbGxOb2RlcygnY2Z3cycsIG1haWxib3gpO1xuXG4gICAgICAgIHZhciBsb2NhbCA9IGZpbmROb2RlKCdsb2NhbC1wYXJ0JywgYXNwZWMpO1xuICAgICAgICB2YXIgZG9tYWluID0gZmluZE5vZGUoJ2RvbWFpbicsIGFzcGVjKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGU6IG1haWxib3gsXG4gICAgICAgICAgICBwYXJ0czoge1xuICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgYWRkcmVzczogYXNwZWMsXG4gICAgICAgICAgICAgICAgbG9jYWw6IGxvY2FsLFxuICAgICAgICAgICAgICAgIGRvbWFpbjogZG9tYWluLFxuICAgICAgICAgICAgICAgIGNvbW1lbnRzOiBjb21tZW50c1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGU6IG1haWxib3gubmFtZSwgLy8gJ21haWxib3gnXG4gICAgICAgICAgICBuYW1lOiBncmFiU2VtYW50aWMobmFtZSksXG4gICAgICAgICAgICBhZGRyZXNzOiBncmFiU2VtYW50aWMoYXNwZWMpLFxuICAgICAgICAgICAgbG9jYWw6IGdyYWJTZW1hbnRpYyhsb2NhbCksXG4gICAgICAgICAgICBkb21haW46IGdyYWJTZW1hbnRpYyhkb21haW4pLFxuICAgICAgICAgICAgZ3JvdXBOYW1lOiBncmFiU2VtYW50aWMobWFpbGJveC5ncm91cE5hbWUpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdyYWJTZW1hbnRpYyhuKSB7XG4gICAgICAgIHJldHVybiBuICE9PSBudWxsICYmIG4gIT09IHVuZGVmaW5lZCA/IG4uc2VtYW50aWMgOiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNpbXBsaWZ5UmVzdWx0KHJlc3VsdCkge1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuYWRkcmVzc2VzKSB7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVzdWx0LmFkZHJlc3Nlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQuYWRkcmVzc2VzW2ldLm5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmVSZXN1bHQocmVzdWx0KSB7XG4gICAgICAgIGlmICghcmVzdWx0KSB7IHJldHVybiBudWxsOyB9XG4gICAgICAgIGlmICghb3B0cy5wYXJ0aWFsICYmIHJlc3VsdC5hZGRyZXNzZXMubGVuZ3RoID4gMSkgeyByZXR1cm4gbnVsbDsgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LmFkZHJlc3NlcyAmJiByZXN1bHQuYWRkcmVzc2VzWzBdO1xuICAgIH1cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICB2YXIgcGFyc2VTdHJpbmcsIHBvcywgbGVuLCBwYXJzZWQsIHN0YXJ0UHJvZHVjdGlvbjtcblxuICAgIG9wdHMgPSBoYW5kbGVPcHRzKG9wdHMsIHt9KTtcbiAgICBpZiAob3B0cyA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxuXG4gICAgcGFyc2VTdHJpbmcgPSBvcHRzLmlucHV0O1xuXG4gICAgc3RhcnRQcm9kdWN0aW9uID0ge1xuICAgICAgICAnYWRkcmVzcyc6IGFkZHJlc3MsXG4gICAgICAgICdhZGRyZXNzLWxpc3QnOiBhZGRyZXNzTGlzdCxcbiAgICAgICAgJ2FuZ2xlLWFkZHInOiBhbmdsZUFkZHIsXG4gICAgICAgICdmcm9tJzogZnJvbVNwZWMsXG4gICAgICAgICdncm91cCc6IGdyb3VwLFxuICAgICAgICAnbWFpbGJveCc6IG1haWxib3gsXG4gICAgICAgICdtYWlsYm94LWxpc3QnOiBtYWlsYm94TGlzdCxcbiAgICAgICAgJ3JlcGx5LXRvJzogcmVwbHlUb1NwZWMsXG4gICAgICAgICdzZW5kZXInOiBzZW5kZXJTcGVjLFxuICAgIH1bb3B0cy5zdGFydEF0XSB8fCBhZGRyZXNzTGlzdDtcblxuICAgIGlmICghb3B0cy5zdHJpY3QpIHtcbiAgICAgICAgaW5pdGlhbGl6ZSgpO1xuICAgICAgICBvcHRzLnN0cmljdCA9IHRydWU7XG4gICAgICAgIHBhcnNlZCA9IHN0YXJ0UHJvZHVjdGlvbihwYXJzZVN0cmluZyk7XG4gICAgICAgIGlmIChvcHRzLnBhcnRpYWwgfHwgIWluU3RyKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBnaXZlUmVzdWx0KHBhcnNlZCk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0cy5zdHJpY3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplKCk7XG4gICAgcGFyc2VkID0gc3RhcnRQcm9kdWN0aW9uKHBhcnNlU3RyaW5nKTtcbiAgICBpZiAoIW9wdHMucGFydGlhbCAmJiBpblN0cigpKSB7IHJldHVybiBudWxsOyB9XG4gICAgcmV0dXJuIGdpdmVSZXN1bHQocGFyc2VkKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPbmVBZGRyZXNzU2ltcGxlKG9wdHMpIHtcbiAgICByZXR1cm4gcGFyc2U1MzIyKGhhbmRsZU9wdHMob3B0cywge1xuICAgICAgICBvbmVSZXN1bHQ6IHRydWUsXG4gICAgICAgIHJmYzY1MzI6IHRydWUsXG4gICAgICAgIHNpbXBsZTogdHJ1ZSxcbiAgICAgICAgc3RhcnRBdDogJ2FkZHJlc3MtbGlzdCcsXG4gICAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUFkZHJlc3NMaXN0U2ltcGxlKG9wdHMpIHtcbiAgICByZXR1cm4gcGFyc2U1MzIyKGhhbmRsZU9wdHMob3B0cywge1xuICAgICAgICByZmM2NTMyOiB0cnVlLFxuICAgICAgICBzaW1wbGU6IHRydWUsXG4gICAgICAgIHN0YXJ0QXQ6ICdhZGRyZXNzLWxpc3QnLFxuICAgIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGcm9tU2ltcGxlKG9wdHMpIHtcbiAgICByZXR1cm4gcGFyc2U1MzIyKGhhbmRsZU9wdHMob3B0cywge1xuICAgICAgICByZmM2NTMyOiB0cnVlLFxuICAgICAgICBzaW1wbGU6IHRydWUsXG4gICAgICAgIHN0YXJ0QXQ6ICdmcm9tJyxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU2VuZGVyU2ltcGxlKG9wdHMpIHtcbiAgICByZXR1cm4gcGFyc2U1MzIyKGhhbmRsZU9wdHMob3B0cywge1xuICAgICAgICBvbmVSZXN1bHQ6IHRydWUsXG4gICAgICAgIHJmYzY1MzI6IHRydWUsXG4gICAgICAgIHNpbXBsZTogdHJ1ZSxcbiAgICAgICAgc3RhcnRBdDogJ3NlbmRlcicsXG4gICAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVJlcGx5VG9TaW1wbGUob3B0cykge1xuICAgIHJldHVybiBwYXJzZTUzMjIoaGFuZGxlT3B0cyhvcHRzLCB7XG4gICAgICAgIHJmYzY1MzI6IHRydWUsXG4gICAgICAgIHNpbXBsZTogdHJ1ZSxcbiAgICAgICAgc3RhcnRBdDogJ3JlcGx5LXRvJyxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU9wdHMob3B0cywgZGVmcykge1xuICAgIGZ1bmN0aW9uIGlzU3RyaW5nKHN0cikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN0cikgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzT2JqZWN0KG8pIHtcbiAgICAgICAgcmV0dXJuIG8gPT09IE9iamVjdChvKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc051bGxVbmRlZihvKSB7XG4gICAgICAgIHJldHVybiBvID09PSBudWxsIHx8IG8gPT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdHMsIG87XG5cbiAgICBpZiAoaXNTdHJpbmcob3B0cykpIHtcbiAgICAgICAgb3B0cyA9IHsgaW5wdXQ6IG9wdHMgfTtcbiAgICB9IGVsc2UgaWYgKCFpc09iamVjdChvcHRzKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIWlzU3RyaW5nKG9wdHMuaW5wdXQpKSB7IHJldHVybiBudWxsOyB9XG4gICAgaWYgKCFkZWZzKSB7IHJldHVybiBudWxsOyB9XG5cbiAgICBkZWZhdWx0cyA9IHtcbiAgICAgICAgb25lUmVzdWx0OiBmYWxzZSxcbiAgICAgICAgcGFydGlhbDogZmFsc2UsXG4gICAgICAgIHJlamVjdFRMRDogZmFsc2UsXG4gICAgICAgIHJmYzY1MzI6IGZhbHNlLFxuICAgICAgICBzaW1wbGU6IGZhbHNlLFxuICAgICAgICBzdGFydEF0OiAnYWRkcmVzcy1saXN0JyxcbiAgICAgICAgc3RyaWN0OiBmYWxzZSxcbiAgICB9O1xuXG4gICAgZm9yIChvIGluIGRlZmF1bHRzKSB7XG4gICAgICAgIGlmIChpc051bGxVbmRlZihvcHRzW29dKSkge1xuICAgICAgICAgICAgb3B0c1tvXSA9ICFpc051bGxVbmRlZihkZWZzW29dKSA/IGRlZnNbb10gOiBkZWZhdWx0c1tvXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3B0cztcbn1cblxucGFyc2U1MzIyLnBhcnNlT25lQWRkcmVzcyA9IHBhcnNlT25lQWRkcmVzc1NpbXBsZTtcbnBhcnNlNTMyMi5wYXJzZUFkZHJlc3NMaXN0ID0gcGFyc2VBZGRyZXNzTGlzdFNpbXBsZTtcbnBhcnNlNTMyMi5wYXJzZUZyb20gPSBwYXJzZUZyb21TaW1wbGU7XG5wYXJzZTUzMjIucGFyc2VTZW5kZXIgPSBwYXJzZVNlbmRlclNpbXBsZTtcbnBhcnNlNTMyMi5wYXJzZVJlcGx5VG8gPSBwYXJzZVJlcGx5VG9TaW1wbGU7XG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBwYXJzZTUzMjI7XG59IGVsc2Uge1xuICAgIGdsb2JhbC5lbWFpbEFkZHJlc3NlcyA9IHBhcnNlNTMyMjtcbn1cblxufSh0aGlzKSk7XG5cbn0se31dLDI4NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgaGFzaCA9IGV4cG9ydHM7XG5cbmhhc2gudXRpbHMgPSBfZGVyZXFfKCcuL2hhc2gvdXRpbHMnKTtcbmhhc2guY29tbW9uID0gX2RlcmVxXygnLi9oYXNoL2NvbW1vbicpO1xuaGFzaC5zaGEgPSBfZGVyZXFfKCcuL2hhc2gvc2hhJyk7XG5oYXNoLnJpcGVtZCA9IF9kZXJlcV8oJy4vaGFzaC9yaXBlbWQnKTtcbmhhc2guaG1hYyA9IF9kZXJlcV8oJy4vaGFzaC9obWFjJyk7XG5cbi8vIFByb3h5IGhhc2ggZnVuY3Rpb25zIHRvIHRoZSBtYWluIG9iamVjdFxuaGFzaC5zaGExID0gaGFzaC5zaGEuc2hhMTtcbmhhc2guc2hhMjU2ID0gaGFzaC5zaGEuc2hhMjU2O1xuaGFzaC5zaGEyMjQgPSBoYXNoLnNoYS5zaGEyMjQ7XG5oYXNoLnNoYTM4NCA9IGhhc2guc2hhLnNoYTM4NDtcbmhhc2guc2hhNTEyID0gaGFzaC5zaGEuc2hhNTEyO1xuaGFzaC5yaXBlbWQxNjAgPSBoYXNoLnJpcGVtZC5yaXBlbWQxNjA7XG5cbn0se1wiLi9oYXNoL2NvbW1vblwiOjI4NSxcIi4vaGFzaC9obWFjXCI6Mjg2LFwiLi9oYXNoL3JpcGVtZFwiOjI4NyxcIi4vaGFzaC9zaGFcIjoyODgsXCIuL2hhc2gvdXRpbHNcIjoyOTV9XSwyODU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSBfZGVyZXFfKCcuL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gX2RlcmVxXygnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG5mdW5jdGlvbiBCbG9ja0hhc2goKSB7XG4gIHRoaXMucGVuZGluZyA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1RvdGFsID0gMDtcbiAgdGhpcy5ibG9ja1NpemUgPSB0aGlzLmNvbnN0cnVjdG9yLmJsb2NrU2l6ZTtcbiAgdGhpcy5vdXRTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5vdXRTaXplO1xuICB0aGlzLmhtYWNTdHJlbmd0aCA9IHRoaXMuY29uc3RydWN0b3IuaG1hY1N0cmVuZ3RoO1xuICB0aGlzLnBhZExlbmd0aCA9IHRoaXMuY29uc3RydWN0b3IucGFkTGVuZ3RoIC8gODtcbiAgdGhpcy5lbmRpYW4gPSAnYmlnJztcblxuICB0aGlzLl9kZWx0YTggPSB0aGlzLmJsb2NrU2l6ZSAvIDg7XG4gIHRoaXMuX2RlbHRhMzIgPSB0aGlzLmJsb2NrU2l6ZSAvIDMyO1xufVxuZXhwb3J0cy5CbG9ja0hhc2ggPSBCbG9ja0hhc2g7XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKG1zZywgZW5jKSB7XG4gIC8vIENvbnZlcnQgbWVzc2FnZSB0byBhcnJheSwgcGFkIGl0LCBhbmQgam9pbiBpbnRvIDMyYml0IGJsb2Nrc1xuICBtc2cgPSB1dGlscy50b0FycmF5KG1zZywgZW5jKTtcbiAgaWYgKCF0aGlzLnBlbmRpbmcpXG4gICAgdGhpcy5wZW5kaW5nID0gbXNnO1xuICBlbHNlXG4gICAgdGhpcy5wZW5kaW5nID0gdGhpcy5wZW5kaW5nLmNvbmNhdChtc2cpO1xuICB0aGlzLnBlbmRpbmdUb3RhbCArPSBtc2cubGVuZ3RoO1xuXG4gIC8vIEVub3VnaCBkYXRhLCB0cnkgdXBkYXRpbmdcbiAgaWYgKHRoaXMucGVuZGluZy5sZW5ndGggPj0gdGhpcy5fZGVsdGE4KSB7XG4gICAgbXNnID0gdGhpcy5wZW5kaW5nO1xuXG4gICAgLy8gUHJvY2VzcyBwZW5kaW5nIGRhdGEgaW4gYmxvY2tzXG4gICAgdmFyIHIgPSBtc2cubGVuZ3RoICUgdGhpcy5fZGVsdGE4O1xuICAgIHRoaXMucGVuZGluZyA9IG1zZy5zbGljZShtc2cubGVuZ3RoIC0gciwgbXNnLmxlbmd0aCk7XG4gICAgaWYgKHRoaXMucGVuZGluZy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuXG4gICAgbXNnID0gdXRpbHMuam9pbjMyKG1zZywgMCwgbXNnLmxlbmd0aCAtIHIsIHRoaXMuZW5kaWFuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkgKz0gdGhpcy5fZGVsdGEzMilcbiAgICAgIHRoaXMuX3VwZGF0ZShtc2csIGksIGkgKyB0aGlzLl9kZWx0YTMyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuQmxvY2tIYXNoLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIHRoaXMudXBkYXRlKHRoaXMuX3BhZCgpKTtcbiAgYXNzZXJ0KHRoaXMucGVuZGluZyA9PT0gbnVsbCk7XG5cbiAgcmV0dXJuIHRoaXMuX2RpZ2VzdChlbmMpO1xufTtcblxuQmxvY2tIYXNoLnByb3RvdHlwZS5fcGFkID0gZnVuY3Rpb24gcGFkKCkge1xuICB2YXIgbGVuID0gdGhpcy5wZW5kaW5nVG90YWw7XG4gIHZhciBieXRlcyA9IHRoaXMuX2RlbHRhODtcbiAgdmFyIGsgPSBieXRlcyAtICgobGVuICsgdGhpcy5wYWRMZW5ndGgpICUgYnl0ZXMpO1xuICB2YXIgcmVzID0gbmV3IEFycmF5KGsgKyB0aGlzLnBhZExlbmd0aCk7XG4gIHJlc1swXSA9IDB4ODA7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgazsgaSsrKVxuICAgIHJlc1tpXSA9IDA7XG5cbiAgLy8gQXBwZW5kIGxlbmd0aFxuICBsZW4gPDw9IDM7XG4gIGlmICh0aGlzLmVuZGlhbiA9PT0gJ2JpZycpIHtcbiAgICBmb3IgKHZhciB0ID0gODsgdCA8IHRoaXMucGFkTGVuZ3RoOyB0KyspXG4gICAgICByZXNbaSsrXSA9IDA7XG5cbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAyNCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMTYpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDgpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IGxlbiAmIDB4ZmY7XG4gIH0gZWxzZSB7XG4gICAgcmVzW2krK10gPSBsZW4gJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gOCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMTYpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDI0KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuXG4gICAgZm9yICh0ID0gODsgdCA8IHRoaXMucGFkTGVuZ3RoOyB0KyspXG4gICAgICByZXNbaSsrXSA9IDA7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblxufSx7XCIuL3V0aWxzXCI6Mjk1LFwibWluaW1hbGlzdGljLWFzc2VydFwiOjI5OX1dLDI4NjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IF9kZXJlcV8oJy4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSBfZGVyZXFfKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbmZ1bmN0aW9uIEhtYWMoaGFzaCwga2V5LCBlbmMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEhtYWMpKVxuICAgIHJldHVybiBuZXcgSG1hYyhoYXNoLCBrZXksIGVuYyk7XG4gIHRoaXMuSGFzaCA9IGhhc2g7XG4gIHRoaXMuYmxvY2tTaXplID0gaGFzaC5ibG9ja1NpemUgLyA4O1xuICB0aGlzLm91dFNpemUgPSBoYXNoLm91dFNpemUgLyA4O1xuICB0aGlzLmlubmVyID0gbnVsbDtcbiAgdGhpcy5vdXRlciA9IG51bGw7XG5cbiAgdGhpcy5faW5pdCh1dGlscy50b0FycmF5KGtleSwgZW5jKSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEhtYWM7XG5cbkhtYWMucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdChrZXkpIHtcbiAgLy8gU2hvcnRlbiBrZXksIGlmIG5lZWRlZFxuICBpZiAoa2V5Lmxlbmd0aCA+IHRoaXMuYmxvY2tTaXplKVxuICAgIGtleSA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KS5kaWdlc3QoKTtcbiAgYXNzZXJ0KGtleS5sZW5ndGggPD0gdGhpcy5ibG9ja1NpemUpO1xuXG4gIC8vIEFkZCBwYWRkaW5nIHRvIGtleVxuICBmb3IgKHZhciBpID0ga2V5Lmxlbmd0aDsgaSA8IHRoaXMuYmxvY2tTaXplOyBpKyspXG4gICAga2V5LnB1c2goMCk7XG5cbiAgZm9yIChpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcbiAgICBrZXlbaV0gXj0gMHgzNjtcbiAgdGhpcy5pbm5lciA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KTtcblxuICAvLyAweDM2IF4gMHg1YyA9IDB4NmFcbiAgZm9yIChpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcbiAgICBrZXlbaV0gXj0gMHg2YTtcbiAgdGhpcy5vdXRlciA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KTtcbn07XG5cbkhtYWMucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIGVuYykge1xuICB0aGlzLmlubmVyLnVwZGF0ZShtc2csIGVuYyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuSG1hYy5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICB0aGlzLm91dGVyLnVwZGF0ZSh0aGlzLmlubmVyLmRpZ2VzdCgpKTtcbiAgcmV0dXJuIHRoaXMub3V0ZXIuZGlnZXN0KGVuYyk7XG59O1xuXG59LHtcIi4vdXRpbHNcIjoyOTUsXCJtaW5pbWFsaXN0aWMtYXNzZXJ0XCI6Mjk5fV0sMjg3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gX2RlcmVxXygnLi91dGlscycpO1xudmFyIGNvbW1vbiA9IF9kZXJlcV8oJy4vY29tbW9uJyk7XG5cbnZhciByb3RsMzIgPSB1dGlscy5yb3RsMzI7XG52YXIgc3VtMzIgPSB1dGlscy5zdW0zMjtcbnZhciBzdW0zMl8zID0gdXRpbHMuc3VtMzJfMztcbnZhciBzdW0zMl80ID0gdXRpbHMuc3VtMzJfNDtcbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG5mdW5jdGlvbiBSSVBFTUQxNjAoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSSVBFTUQxNjApKVxuICAgIHJldHVybiBuZXcgUklQRU1EMTYwKCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG5cbiAgdGhpcy5oID0gWyAweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLCAweDEwMzI1NDc2LCAweGMzZDJlMWYwIF07XG4gIHRoaXMuZW5kaWFuID0gJ2xpdHRsZSc7XG59XG51dGlscy5pbmhlcml0cyhSSVBFTUQxNjAsIEJsb2NrSGFzaCk7XG5leHBvcnRzLnJpcGVtZDE2MCA9IFJJUEVNRDE2MDtcblxuUklQRU1EMTYwLmJsb2NrU2l6ZSA9IDUxMjtcblJJUEVNRDE2MC5vdXRTaXplID0gMTYwO1xuUklQRU1EMTYwLmhtYWNTdHJlbmd0aCA9IDE5MjtcblJJUEVNRDE2MC5wYWRMZW5ndGggPSA2NDtcblxuUklQRU1EMTYwLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIEEgPSB0aGlzLmhbMF07XG4gIHZhciBCID0gdGhpcy5oWzFdO1xuICB2YXIgQyA9IHRoaXMuaFsyXTtcbiAgdmFyIEQgPSB0aGlzLmhbM107XG4gIHZhciBFID0gdGhpcy5oWzRdO1xuICB2YXIgQWggPSBBO1xuICB2YXIgQmggPSBCO1xuICB2YXIgQ2ggPSBDO1xuICB2YXIgRGggPSBEO1xuICB2YXIgRWggPSBFO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IDgwOyBqKyspIHtcbiAgICB2YXIgVCA9IHN1bTMyKFxuICAgICAgcm90bDMyKFxuICAgICAgICBzdW0zMl80KEEsIGYoaiwgQiwgQywgRCksIG1zZ1tyW2pdICsgc3RhcnRdLCBLKGopKSxcbiAgICAgICAgc1tqXSksXG4gICAgICBFKTtcbiAgICBBID0gRTtcbiAgICBFID0gRDtcbiAgICBEID0gcm90bDMyKEMsIDEwKTtcbiAgICBDID0gQjtcbiAgICBCID0gVDtcbiAgICBUID0gc3VtMzIoXG4gICAgICByb3RsMzIoXG4gICAgICAgIHN1bTMyXzQoQWgsIGYoNzkgLSBqLCBCaCwgQ2gsIERoKSwgbXNnW3JoW2pdICsgc3RhcnRdLCBLaChqKSksXG4gICAgICAgIHNoW2pdKSxcbiAgICAgIEVoKTtcbiAgICBBaCA9IEVoO1xuICAgIEVoID0gRGg7XG4gICAgRGggPSByb3RsMzIoQ2gsIDEwKTtcbiAgICBDaCA9IEJoO1xuICAgIEJoID0gVDtcbiAgfVxuICBUID0gc3VtMzJfMyh0aGlzLmhbMV0sIEMsIERoKTtcbiAgdGhpcy5oWzFdID0gc3VtMzJfMyh0aGlzLmhbMl0sIEQsIEVoKTtcbiAgdGhpcy5oWzJdID0gc3VtMzJfMyh0aGlzLmhbM10sIEUsIEFoKTtcbiAgdGhpcy5oWzNdID0gc3VtMzJfMyh0aGlzLmhbNF0sIEEsIEJoKTtcbiAgdGhpcy5oWzRdID0gc3VtMzJfMyh0aGlzLmhbMF0sIEIsIENoKTtcbiAgdGhpcy5oWzBdID0gVDtcbn07XG5cblJJUEVNRDE2MC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnbGl0dGxlJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdsaXR0bGUnKTtcbn07XG5cbmZ1bmN0aW9uIGYoaiwgeCwgeSwgeikge1xuICBpZiAoaiA8PSAxNSlcbiAgICByZXR1cm4geCBeIHkgXiB6O1xuICBlbHNlIGlmIChqIDw9IDMxKVxuICAgIHJldHVybiAoeCAmIHkpIHwgKCh+eCkgJiB6KTtcbiAgZWxzZSBpZiAoaiA8PSA0NylcbiAgICByZXR1cm4gKHggfCAofnkpKSBeIHo7XG4gIGVsc2UgaWYgKGogPD0gNjMpXG4gICAgcmV0dXJuICh4ICYgeikgfCAoeSAmICh+eikpO1xuICBlbHNlXG4gICAgcmV0dXJuIHggXiAoeSB8ICh+eikpO1xufVxuXG5mdW5jdGlvbiBLKGopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIDB4MDAwMDAwMDA7XG4gIGVsc2UgaWYgKGogPD0gMzEpXG4gICAgcmV0dXJuIDB4NWE4Mjc5OTk7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuIDB4NmVkOWViYTE7XG4gIGVsc2UgaWYgKGogPD0gNjMpXG4gICAgcmV0dXJuIDB4OGYxYmJjZGM7XG4gIGVsc2VcbiAgICByZXR1cm4gMHhhOTUzZmQ0ZTtcbn1cblxuZnVuY3Rpb24gS2goaikge1xuICBpZiAoaiA8PSAxNSlcbiAgICByZXR1cm4gMHg1MGEyOGJlNjtcbiAgZWxzZSBpZiAoaiA8PSAzMSlcbiAgICByZXR1cm4gMHg1YzRkZDEyNDtcbiAgZWxzZSBpZiAoaiA8PSA0NylcbiAgICByZXR1cm4gMHg2ZDcwM2VmMztcbiAgZWxzZSBpZiAoaiA8PSA2MylcbiAgICByZXR1cm4gMHg3YTZkNzZlOTtcbiAgZWxzZVxuICAgIHJldHVybiAweDAwMDAwMDAwO1xufVxuXG52YXIgciA9IFtcbiAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSxcbiAgNywgNCwgMTMsIDEsIDEwLCA2LCAxNSwgMywgMTIsIDAsIDksIDUsIDIsIDE0LCAxMSwgOCxcbiAgMywgMTAsIDE0LCA0LCA5LCAxNSwgOCwgMSwgMiwgNywgMCwgNiwgMTMsIDExLCA1LCAxMixcbiAgMSwgOSwgMTEsIDEwLCAwLCA4LCAxMiwgNCwgMTMsIDMsIDcsIDE1LCAxNCwgNSwgNiwgMixcbiAgNCwgMCwgNSwgOSwgNywgMTIsIDIsIDEwLCAxNCwgMSwgMywgOCwgMTEsIDYsIDE1LCAxM1xuXTtcblxudmFyIHJoID0gW1xuICA1LCAxNCwgNywgMCwgOSwgMiwgMTEsIDQsIDEzLCA2LCAxNSwgOCwgMSwgMTAsIDMsIDEyLFxuICA2LCAxMSwgMywgNywgMCwgMTMsIDUsIDEwLCAxNCwgMTUsIDgsIDEyLCA0LCA5LCAxLCAyLFxuICAxNSwgNSwgMSwgMywgNywgMTQsIDYsIDksIDExLCA4LCAxMiwgMiwgMTAsIDAsIDQsIDEzLFxuICA4LCA2LCA0LCAxLCAzLCAxMSwgMTUsIDAsIDUsIDEyLCAyLCAxMywgOSwgNywgMTAsIDE0LFxuICAxMiwgMTUsIDEwLCA0LCAxLCA1LCA4LCA3LCA2LCAyLCAxMywgMTQsIDAsIDMsIDksIDExXG5dO1xuXG52YXIgcyA9IFtcbiAgMTEsIDE0LCAxNSwgMTIsIDUsIDgsIDcsIDksIDExLCAxMywgMTQsIDE1LCA2LCA3LCA5LCA4LFxuICA3LCA2LCA4LCAxMywgMTEsIDksIDcsIDE1LCA3LCAxMiwgMTUsIDksIDExLCA3LCAxMywgMTIsXG4gIDExLCAxMywgNiwgNywgMTQsIDksIDEzLCAxNSwgMTQsIDgsIDEzLCA2LCA1LCAxMiwgNywgNSxcbiAgMTEsIDEyLCAxNCwgMTUsIDE0LCAxNSwgOSwgOCwgOSwgMTQsIDUsIDYsIDgsIDYsIDUsIDEyLFxuICA5LCAxNSwgNSwgMTEsIDYsIDgsIDEzLCAxMiwgNSwgMTIsIDEzLCAxNCwgMTEsIDgsIDUsIDZcbl07XG5cbnZhciBzaCA9IFtcbiAgOCwgOSwgOSwgMTEsIDEzLCAxNSwgMTUsIDUsIDcsIDcsIDgsIDExLCAxNCwgMTQsIDEyLCA2LFxuICA5LCAxMywgMTUsIDcsIDEyLCA4LCA5LCAxMSwgNywgNywgMTIsIDcsIDYsIDE1LCAxMywgMTEsXG4gIDksIDcsIDE1LCAxMSwgOCwgNiwgNiwgMTQsIDEyLCAxMywgNSwgMTQsIDEzLCAxMywgNywgNSxcbiAgMTUsIDUsIDgsIDExLCAxNCwgMTQsIDYsIDE0LCA2LCA5LCAxMiwgOSwgMTIsIDUsIDE1LCA4LFxuICA4LCA1LCAxMiwgOSwgMTIsIDUsIDE0LCA2LCA4LCAxMywgNiwgNSwgMTUsIDEzLCAxMSwgMTFcbl07XG5cbn0se1wiLi9jb21tb25cIjoyODUsXCIuL3V0aWxzXCI6Mjk1fV0sMjg4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5zaGExID0gX2RlcmVxXygnLi9zaGEvMScpO1xuZXhwb3J0cy5zaGEyMjQgPSBfZGVyZXFfKCcuL3NoYS8yMjQnKTtcbmV4cG9ydHMuc2hhMjU2ID0gX2RlcmVxXygnLi9zaGEvMjU2Jyk7XG5leHBvcnRzLnNoYTM4NCA9IF9kZXJlcV8oJy4vc2hhLzM4NCcpO1xuZXhwb3J0cy5zaGE1MTIgPSBfZGVyZXFfKCcuL3NoYS81MTInKTtcblxufSx7XCIuL3NoYS8xXCI6Mjg5LFwiLi9zaGEvMjI0XCI6MjkwLFwiLi9zaGEvMjU2XCI6MjkxLFwiLi9zaGEvMzg0XCI6MjkyLFwiLi9zaGEvNTEyXCI6MjkzfV0sMjg5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gX2RlcmVxXygnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSBfZGVyZXFfKCcuLi9jb21tb24nKTtcbnZhciBzaGFDb21tb24gPSBfZGVyZXFfKCcuL2NvbW1vbicpO1xuXG52YXIgcm90bDMyID0gdXRpbHMucm90bDMyO1xudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfNSA9IHV0aWxzLnN1bTMyXzU7XG52YXIgZnRfMSA9IHNoYUNvbW1vbi5mdF8xO1xudmFyIEJsb2NrSGFzaCA9IGNvbW1vbi5CbG9ja0hhc2g7XG5cbnZhciBzaGExX0sgPSBbXG4gIDB4NUE4Mjc5OTksIDB4NkVEOUVCQTEsXG4gIDB4OEYxQkJDREMsIDB4Q0E2MkMxRDZcbl07XG5cbmZ1bmN0aW9uIFNIQTEoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEExKSlcbiAgICByZXR1cm4gbmV3IFNIQTEoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsXG4gICAgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMCBdO1xuICB0aGlzLlcgPSBuZXcgQXJyYXkoODApO1xufVxuXG51dGlscy5pbmhlcml0cyhTSEExLCBCbG9ja0hhc2gpO1xubW9kdWxlLmV4cG9ydHMgPSBTSEExO1xuXG5TSEExLmJsb2NrU2l6ZSA9IDUxMjtcblNIQTEub3V0U2l6ZSA9IDE2MDtcblNIQTEuaG1hY1N0cmVuZ3RoID0gODA7XG5TSEExLnBhZExlbmd0aCA9IDY0O1xuXG5TSEExLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBXID0gdGhpcy5XO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG5cbiAgZm9yKDsgaSA8IFcubGVuZ3RoOyBpKyspXG4gICAgV1tpXSA9IHJvdGwzMihXW2kgLSAzXSBeIFdbaSAtIDhdIF4gV1tpIC0gMTRdIF4gV1tpIC0gMTZdLCAxKTtcblxuICB2YXIgYSA9IHRoaXMuaFswXTtcbiAgdmFyIGIgPSB0aGlzLmhbMV07XG4gIHZhciBjID0gdGhpcy5oWzJdO1xuICB2YXIgZCA9IHRoaXMuaFszXTtcbiAgdmFyIGUgPSB0aGlzLmhbNF07XG5cbiAgZm9yIChpID0gMDsgaSA8IFcubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcyA9IH5+KGkgLyAyMCk7XG4gICAgdmFyIHQgPSBzdW0zMl81KHJvdGwzMihhLCA1KSwgZnRfMShzLCBiLCBjLCBkKSwgZSwgV1tpXSwgc2hhMV9LW3NdKTtcbiAgICBlID0gZDtcbiAgICBkID0gYztcbiAgICBjID0gcm90bDMyKGIsIDMwKTtcbiAgICBiID0gYTtcbiAgICBhID0gdDtcbiAgfVxuXG4gIHRoaXMuaFswXSA9IHN1bTMyKHRoaXMuaFswXSwgYSk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyKHRoaXMuaFsxXSwgYik7XG4gIHRoaXMuaFsyXSA9IHN1bTMyKHRoaXMuaFsyXSwgYyk7XG4gIHRoaXMuaFszXSA9IHN1bTMyKHRoaXMuaFszXSwgZCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyKHRoaXMuaFs0XSwgZSk7XG59O1xuXG5TSEExLnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2JpZycpO1xufTtcblxufSx7XCIuLi9jb21tb25cIjoyODUsXCIuLi91dGlsc1wiOjI5NSxcIi4vY29tbW9uXCI6Mjk0fV0sMjkwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gX2RlcmVxXygnLi4vdXRpbHMnKTtcbnZhciBTSEEyNTYgPSBfZGVyZXFfKCcuLzI1NicpO1xuXG5mdW5jdGlvbiBTSEEyMjQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEyMjQpKVxuICAgIHJldHVybiBuZXcgU0hBMjI0KCk7XG5cbiAgU0hBMjU2LmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweGMxMDU5ZWQ4LCAweDM2N2NkNTA3LCAweDMwNzBkZDE3LCAweGY3MGU1OTM5LFxuICAgIDB4ZmZjMDBiMzEsIDB4Njg1ODE1MTEsIDB4NjRmOThmYTcsIDB4YmVmYTRmYTQgXTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTIyNCwgU0hBMjU2KTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMjI0O1xuXG5TSEEyMjQuYmxvY2tTaXplID0gNTEyO1xuU0hBMjI0Lm91dFNpemUgPSAyMjQ7XG5TSEEyMjQuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMjI0LnBhZExlbmd0aCA9IDY0O1xuXG5TSEEyMjQucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIC8vIEp1c3QgdHJ1bmNhdGUgb3V0cHV0XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaC5zbGljZSgwLCA3KSwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDcpLCAnYmlnJyk7XG59O1xuXG5cbn0se1wiLi4vdXRpbHNcIjoyOTUsXCIuLzI1NlwiOjI5MX1dLDI5MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IF9kZXJlcV8oJy4uL3V0aWxzJyk7XG52YXIgY29tbW9uID0gX2RlcmVxXygnLi4vY29tbW9uJyk7XG52YXIgc2hhQ29tbW9uID0gX2RlcmVxXygnLi9jb21tb24nKTtcbnZhciBhc3NlcnQgPSBfZGVyZXFfKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbnZhciBzdW0zMiA9IHV0aWxzLnN1bTMyO1xudmFyIHN1bTMyXzQgPSB1dGlscy5zdW0zMl80O1xudmFyIHN1bTMyXzUgPSB1dGlscy5zdW0zMl81O1xudmFyIGNoMzIgPSBzaGFDb21tb24uY2gzMjtcbnZhciBtYWozMiA9IHNoYUNvbW1vbi5tYWozMjtcbnZhciBzMF8yNTYgPSBzaGFDb21tb24uczBfMjU2O1xudmFyIHMxXzI1NiA9IHNoYUNvbW1vbi5zMV8yNTY7XG52YXIgZzBfMjU2ID0gc2hhQ29tbW9uLmcwXzI1NjtcbnZhciBnMV8yNTYgPSBzaGFDb21tb24uZzFfMjU2O1xuXG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxudmFyIHNoYTI1Nl9LID0gW1xuICAweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1LFxuICAweDM5NTZjMjViLCAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LFxuICAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLFxuICAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0LFxuICAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LCAweDBmYzE5ZGM2LCAweDI0MGNhMWNjLFxuICAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAweDc2Zjk4OGRhLFxuICAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LFxuICAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LCAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LFxuICAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLFxuICAweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1LFxuICAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLFxuICAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLFxuICAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LFxuICAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLFxuICAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0Yzg3ODE0LCAweDhjYzcwMjA4LFxuICAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyXG5dO1xuXG5mdW5jdGlvbiBTSEEyNTYoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEyNTYpKVxuICAgIHJldHVybiBuZXcgU0hBMjU2KCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweDZhMDllNjY3LCAweGJiNjdhZTg1LCAweDNjNmVmMzcyLCAweGE1NGZmNTNhLFxuICAgIDB4NTEwZTUyN2YsIDB4OWIwNTY4OGMsIDB4MWY4M2Q5YWIsIDB4NWJlMGNkMTlcbiAgXTtcbiAgdGhpcy5rID0gc2hhMjU2X0s7XG4gIHRoaXMuVyA9IG5ldyBBcnJheSg2NCk7XG59XG51dGlscy5pbmhlcml0cyhTSEEyNTYsIEJsb2NrSGFzaCk7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTI1NjtcblxuU0hBMjU2LmJsb2NrU2l6ZSA9IDUxMjtcblNIQTI1Ni5vdXRTaXplID0gMjU2O1xuU0hBMjU2LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTI1Ni5wYWRMZW5ndGggPSA2NDtcblxuU0hBMjU2LnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBXID0gdGhpcy5XO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG4gIGZvciAoOyBpIDwgVy5sZW5ndGg7IGkrKylcbiAgICBXW2ldID0gc3VtMzJfNChnMV8yNTYoV1tpIC0gMl0pLCBXW2kgLSA3XSwgZzBfMjU2KFdbaSAtIDE1XSksIFdbaSAtIDE2XSk7XG5cbiAgdmFyIGEgPSB0aGlzLmhbMF07XG4gIHZhciBiID0gdGhpcy5oWzFdO1xuICB2YXIgYyA9IHRoaXMuaFsyXTtcbiAgdmFyIGQgPSB0aGlzLmhbM107XG4gIHZhciBlID0gdGhpcy5oWzRdO1xuICB2YXIgZiA9IHRoaXMuaFs1XTtcbiAgdmFyIGcgPSB0aGlzLmhbNl07XG4gIHZhciBoID0gdGhpcy5oWzddO1xuXG4gIGFzc2VydCh0aGlzLmsubGVuZ3RoID09PSBXLmxlbmd0aCk7XG4gIGZvciAoaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIFQxID0gc3VtMzJfNShoLCBzMV8yNTYoZSksIGNoMzIoZSwgZiwgZyksIHRoaXMua1tpXSwgV1tpXSk7XG4gICAgdmFyIFQyID0gc3VtMzIoczBfMjU2KGEpLCBtYWozMihhLCBiLCBjKSk7XG4gICAgaCA9IGc7XG4gICAgZyA9IGY7XG4gICAgZiA9IGU7XG4gICAgZSA9IHN1bTMyKGQsIFQxKTtcbiAgICBkID0gYztcbiAgICBjID0gYjtcbiAgICBiID0gYTtcbiAgICBhID0gc3VtMzIoVDEsIFQyKTtcbiAgfVxuXG4gIHRoaXMuaFswXSA9IHN1bTMyKHRoaXMuaFswXSwgYSk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyKHRoaXMuaFsxXSwgYik7XG4gIHRoaXMuaFsyXSA9IHN1bTMyKHRoaXMuaFsyXSwgYyk7XG4gIHRoaXMuaFszXSA9IHN1bTMyKHRoaXMuaFszXSwgZCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyKHRoaXMuaFs0XSwgZSk7XG4gIHRoaXMuaFs1XSA9IHN1bTMyKHRoaXMuaFs1XSwgZik7XG4gIHRoaXMuaFs2XSA9IHN1bTMyKHRoaXMuaFs2XSwgZyk7XG4gIHRoaXMuaFs3XSA9IHN1bTMyKHRoaXMuaFs3XSwgaCk7XG59O1xuXG5TSEEyNTYucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuXG59LHtcIi4uL2NvbW1vblwiOjI4NSxcIi4uL3V0aWxzXCI6Mjk1LFwiLi9jb21tb25cIjoyOTQsXCJtaW5pbWFsaXN0aWMtYXNzZXJ0XCI6Mjk5fV0sMjkyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gX2RlcmVxXygnLi4vdXRpbHMnKTtcblxudmFyIFNIQTUxMiA9IF9kZXJlcV8oJy4vNTEyJyk7XG5cbmZ1bmN0aW9uIFNIQTM4NCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTM4NCkpXG4gICAgcmV0dXJuIG5ldyBTSEEzODQoKTtcblxuICBTSEE1MTIuY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4Y2JiYjlkNWQsIDB4YzEwNTllZDgsXG4gICAgMHg2MjlhMjkyYSwgMHgzNjdjZDUwNyxcbiAgICAweDkxNTkwMTVhLCAweDMwNzBkZDE3LFxuICAgIDB4MTUyZmVjZDgsIDB4ZjcwZTU5MzksXG4gICAgMHg2NzMzMjY2NywgMHhmZmMwMGIzMSxcbiAgICAweDhlYjQ0YTg3LCAweDY4NTgxNTExLFxuICAgIDB4ZGIwYzJlMGQsIDB4NjRmOThmYTcsXG4gICAgMHg0N2I1NDgxZCwgMHhiZWZhNGZhNCBdO1xufVxudXRpbHMuaW5oZXJpdHMoU0hBMzg0LCBTSEE1MTIpO1xubW9kdWxlLmV4cG9ydHMgPSBTSEEzODQ7XG5cblNIQTM4NC5ibG9ja1NpemUgPSAxMDI0O1xuU0hBMzg0Lm91dFNpemUgPSAzODQ7XG5TSEEzODQuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMzg0LnBhZExlbmd0aCA9IDEyODtcblxuU0hBMzg0LnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmguc2xpY2UoMCwgMTIpLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmguc2xpY2UoMCwgMTIpLCAnYmlnJyk7XG59O1xuXG59LHtcIi4uL3V0aWxzXCI6Mjk1LFwiLi81MTJcIjoyOTN9XSwyOTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSBfZGVyZXFfKCcuLi91dGlscycpO1xudmFyIGNvbW1vbiA9IF9kZXJlcV8oJy4uL2NvbW1vbicpO1xudmFyIGFzc2VydCA9IF9kZXJlcV8oJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxudmFyIHJvdHI2NF9oaSA9IHV0aWxzLnJvdHI2NF9oaTtcbnZhciByb3RyNjRfbG8gPSB1dGlscy5yb3RyNjRfbG87XG52YXIgc2hyNjRfaGkgPSB1dGlscy5zaHI2NF9oaTtcbnZhciBzaHI2NF9sbyA9IHV0aWxzLnNocjY0X2xvO1xudmFyIHN1bTY0ID0gdXRpbHMuc3VtNjQ7XG52YXIgc3VtNjRfaGkgPSB1dGlscy5zdW02NF9oaTtcbnZhciBzdW02NF9sbyA9IHV0aWxzLnN1bTY0X2xvO1xudmFyIHN1bTY0XzRfaGkgPSB1dGlscy5zdW02NF80X2hpO1xudmFyIHN1bTY0XzRfbG8gPSB1dGlscy5zdW02NF80X2xvO1xudmFyIHN1bTY0XzVfaGkgPSB1dGlscy5zdW02NF81X2hpO1xudmFyIHN1bTY0XzVfbG8gPSB1dGlscy5zdW02NF81X2xvO1xuXG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxudmFyIHNoYTUxMl9LID0gW1xuICAweDQyOGEyZjk4LCAweGQ3MjhhZTIyLCAweDcxMzc0NDkxLCAweDIzZWY2NWNkLFxuICAweGI1YzBmYmNmLCAweGVjNGQzYjJmLCAweGU5YjVkYmE1LCAweDgxODlkYmJjLFxuICAweDM5NTZjMjViLCAweGYzNDhiNTM4LCAweDU5ZjExMWYxLCAweGI2MDVkMDE5LFxuICAweDkyM2Y4MmE0LCAweGFmMTk0ZjliLCAweGFiMWM1ZWQ1LCAweGRhNmQ4MTE4LFxuICAweGQ4MDdhYTk4LCAweGEzMDMwMjQyLCAweDEyODM1YjAxLCAweDQ1NzA2ZmJlLFxuICAweDI0MzE4NWJlLCAweDRlZTRiMjhjLCAweDU1MGM3ZGMzLCAweGQ1ZmZiNGUyLFxuICAweDcyYmU1ZDc0LCAweGYyN2I4OTZmLCAweDgwZGViMWZlLCAweDNiMTY5NmIxLFxuICAweDliZGMwNmE3LCAweDI1YzcxMjM1LCAweGMxOWJmMTc0LCAweGNmNjkyNjk0LFxuICAweGU0OWI2OWMxLCAweDllZjE0YWQyLCAweGVmYmU0Nzg2LCAweDM4NGYyNWUzLFxuICAweDBmYzE5ZGM2LCAweDhiOGNkNWI1LCAweDI0MGNhMWNjLCAweDc3YWM5YzY1LFxuICAweDJkZTkyYzZmLCAweDU5MmIwMjc1LCAweDRhNzQ4NGFhLCAweDZlYTZlNDgzLFxuICAweDVjYjBhOWRjLCAweGJkNDFmYmQ0LCAweDc2Zjk4OGRhLCAweDgzMTE1M2I1LFxuICAweDk4M2U1MTUyLCAweGVlNjZkZmFiLCAweGE4MzFjNjZkLCAweDJkYjQzMjEwLFxuICAweGIwMDMyN2M4LCAweDk4ZmIyMTNmLCAweGJmNTk3ZmM3LCAweGJlZWYwZWU0LFxuICAweGM2ZTAwYmYzLCAweDNkYTg4ZmMyLCAweGQ1YTc5MTQ3LCAweDkzMGFhNzI1LFxuICAweDA2Y2E2MzUxLCAweGUwMDM4MjZmLCAweDE0MjkyOTY3LCAweDBhMGU2ZTcwLFxuICAweDI3YjcwYTg1LCAweDQ2ZDIyZmZjLCAweDJlMWIyMTM4LCAweDVjMjZjOTI2LFxuICAweDRkMmM2ZGZjLCAweDVhYzQyYWVkLCAweDUzMzgwZDEzLCAweDlkOTViM2RmLFxuICAweDY1MGE3MzU0LCAweDhiYWY2M2RlLCAweDc2NmEwYWJiLCAweDNjNzdiMmE4LFxuICAweDgxYzJjOTJlLCAweDQ3ZWRhZWU2LCAweDkyNzIyYzg1LCAweDE0ODIzNTNiLFxuICAweGEyYmZlOGExLCAweDRjZjEwMzY0LCAweGE4MWE2NjRiLCAweGJjNDIzMDAxLFxuICAweGMyNGI4YjcwLCAweGQwZjg5NzkxLCAweGM3NmM1MWEzLCAweDA2NTRiZTMwLFxuICAweGQxOTJlODE5LCAweGQ2ZWY1MjE4LCAweGQ2OTkwNjI0LCAweDU1NjVhOTEwLFxuICAweGY0MGUzNTg1LCAweDU3NzEyMDJhLCAweDEwNmFhMDcwLCAweDMyYmJkMWI4LFxuICAweDE5YTRjMTE2LCAweGI4ZDJkMGM4LCAweDFlMzc2YzA4LCAweDUxNDFhYjUzLFxuICAweDI3NDg3NzRjLCAweGRmOGVlYjk5LCAweDM0YjBiY2I1LCAweGUxOWI0OGE4LFxuICAweDM5MWMwY2IzLCAweGM1Yzk1YTYzLCAweDRlZDhhYTRhLCAweGUzNDE4YWNiLFxuICAweDViOWNjYTRmLCAweDc3NjNlMzczLCAweDY4MmU2ZmYzLCAweGQ2YjJiOGEzLFxuICAweDc0OGY4MmVlLCAweDVkZWZiMmZjLCAweDc4YTU2MzZmLCAweDQzMTcyZjYwLFxuICAweDg0Yzg3ODE0LCAweGExZjBhYjcyLCAweDhjYzcwMjA4LCAweDFhNjQzOWVjLFxuICAweDkwYmVmZmZhLCAweDIzNjMxZTI4LCAweGE0NTA2Y2ViLCAweGRlODJiZGU5LFxuICAweGJlZjlhM2Y3LCAweGIyYzY3OTE1LCAweGM2NzE3OGYyLCAweGUzNzI1MzJiLFxuICAweGNhMjczZWNlLCAweGVhMjY2MTljLCAweGQxODZiOGM3LCAweDIxYzBjMjA3LFxuICAweGVhZGE3ZGQ2LCAweGNkZTBlYjFlLCAweGY1N2Q0ZjdmLCAweGVlNmVkMTc4LFxuICAweDA2ZjA2N2FhLCAweDcyMTc2ZmJhLCAweDBhNjM3ZGM1LCAweGEyYzg5OGE2LFxuICAweDExM2Y5ODA0LCAweGJlZjkwZGFlLCAweDFiNzEwYjM1LCAweDEzMWM0NzFiLFxuICAweDI4ZGI3N2Y1LCAweDIzMDQ3ZDg0LCAweDMyY2FhYjdiLCAweDQwYzcyNDkzLFxuICAweDNjOWViZTBhLCAweDE1YzliZWJjLCAweDQzMWQ2N2M0LCAweDljMTAwZDRjLFxuICAweDRjYzVkNGJlLCAweGNiM2U0MmI2LCAweDU5N2YyOTljLCAweGZjNjU3ZTJhLFxuICAweDVmY2I2ZmFiLCAweDNhZDZmYWVjLCAweDZjNDQxOThjLCAweDRhNDc1ODE3XG5dO1xuXG5mdW5jdGlvbiBTSEE1MTIoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEE1MTIpKVxuICAgIHJldHVybiBuZXcgU0hBNTEyKCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweDZhMDllNjY3LCAweGYzYmNjOTA4LFxuICAgIDB4YmI2N2FlODUsIDB4ODRjYWE3M2IsXG4gICAgMHgzYzZlZjM3MiwgMHhmZTk0ZjgyYixcbiAgICAweGE1NGZmNTNhLCAweDVmMWQzNmYxLFxuICAgIDB4NTEwZTUyN2YsIDB4YWRlNjgyZDEsXG4gICAgMHg5YjA1Njg4YywgMHgyYjNlNmMxZixcbiAgICAweDFmODNkOWFiLCAweGZiNDFiZDZiLFxuICAgIDB4NWJlMGNkMTksIDB4MTM3ZTIxNzkgXTtcbiAgdGhpcy5rID0gc2hhNTEyX0s7XG4gIHRoaXMuVyA9IG5ldyBBcnJheSgxNjApO1xufVxudXRpbHMuaW5oZXJpdHMoU0hBNTEyLCBCbG9ja0hhc2gpO1xubW9kdWxlLmV4cG9ydHMgPSBTSEE1MTI7XG5cblNIQTUxMi5ibG9ja1NpemUgPSAxMDI0O1xuU0hBNTEyLm91dFNpemUgPSA1MTI7XG5TSEE1MTIuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBNTEyLnBhZExlbmd0aCA9IDEyODtcblxuU0hBNTEyLnByb3RvdHlwZS5fcHJlcGFyZUJsb2NrID0gZnVuY3Rpb24gX3ByZXBhcmVCbG9jayhtc2csIHN0YXJ0KSB7XG4gIHZhciBXID0gdGhpcy5XO1xuXG4gIC8vIDMyIHggMzJiaXQgd29yZHNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcbiAgZm9yICg7IGkgPCBXLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGMwX2hpID0gZzFfNTEyX2hpKFdbaSAtIDRdLCBXW2kgLSAzXSk7ICAvLyBpIC0gMlxuICAgIHZhciBjMF9sbyA9IGcxXzUxMl9sbyhXW2kgLSA0XSwgV1tpIC0gM10pO1xuICAgIHZhciBjMV9oaSA9IFdbaSAtIDE0XTsgIC8vIGkgLSA3XG4gICAgdmFyIGMxX2xvID0gV1tpIC0gMTNdO1xuICAgIHZhciBjMl9oaSA9IGcwXzUxMl9oaShXW2kgLSAzMF0sIFdbaSAtIDI5XSk7ICAvLyBpIC0gMTVcbiAgICB2YXIgYzJfbG8gPSBnMF81MTJfbG8oV1tpIC0gMzBdLCBXW2kgLSAyOV0pO1xuICAgIHZhciBjM19oaSA9IFdbaSAtIDMyXTsgIC8vIGkgLSAxNlxuICAgIHZhciBjM19sbyA9IFdbaSAtIDMxXTtcblxuICAgIFdbaV0gPSBzdW02NF80X2hpKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvKTtcbiAgICBXW2kgKyAxXSA9IHN1bTY0XzRfbG8oXG4gICAgICBjMF9oaSwgYzBfbG8sXG4gICAgICBjMV9oaSwgYzFfbG8sXG4gICAgICBjMl9oaSwgYzJfbG8sXG4gICAgICBjM19oaSwgYzNfbG8pO1xuICB9XG59O1xuXG5TSEE1MTIucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdGhpcy5fcHJlcGFyZUJsb2NrKG1zZywgc3RhcnQpO1xuXG4gIHZhciBXID0gdGhpcy5XO1xuXG4gIHZhciBhaCA9IHRoaXMuaFswXTtcbiAgdmFyIGFsID0gdGhpcy5oWzFdO1xuICB2YXIgYmggPSB0aGlzLmhbMl07XG4gIHZhciBibCA9IHRoaXMuaFszXTtcbiAgdmFyIGNoID0gdGhpcy5oWzRdO1xuICB2YXIgY2wgPSB0aGlzLmhbNV07XG4gIHZhciBkaCA9IHRoaXMuaFs2XTtcbiAgdmFyIGRsID0gdGhpcy5oWzddO1xuICB2YXIgZWggPSB0aGlzLmhbOF07XG4gIHZhciBlbCA9IHRoaXMuaFs5XTtcbiAgdmFyIGZoID0gdGhpcy5oWzEwXTtcbiAgdmFyIGZsID0gdGhpcy5oWzExXTtcbiAgdmFyIGdoID0gdGhpcy5oWzEyXTtcbiAgdmFyIGdsID0gdGhpcy5oWzEzXTtcbiAgdmFyIGhoID0gdGhpcy5oWzE0XTtcbiAgdmFyIGhsID0gdGhpcy5oWzE1XTtcblxuICBhc3NlcnQodGhpcy5rLmxlbmd0aCA9PT0gVy5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IFcubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgYzBfaGkgPSBoaDtcbiAgICB2YXIgYzBfbG8gPSBobDtcbiAgICB2YXIgYzFfaGkgPSBzMV81MTJfaGkoZWgsIGVsKTtcbiAgICB2YXIgYzFfbG8gPSBzMV81MTJfbG8oZWgsIGVsKTtcbiAgICB2YXIgYzJfaGkgPSBjaDY0X2hpKGVoLCBlbCwgZmgsIGZsLCBnaCwgZ2wpO1xuICAgIHZhciBjMl9sbyA9IGNoNjRfbG8oZWgsIGVsLCBmaCwgZmwsIGdoLCBnbCk7XG4gICAgdmFyIGMzX2hpID0gdGhpcy5rW2ldO1xuICAgIHZhciBjM19sbyA9IHRoaXMua1tpICsgMV07XG4gICAgdmFyIGM0X2hpID0gV1tpXTtcbiAgICB2YXIgYzRfbG8gPSBXW2kgKyAxXTtcblxuICAgIHZhciBUMV9oaSA9IHN1bTY0XzVfaGkoXG4gICAgICBjMF9oaSwgYzBfbG8sXG4gICAgICBjMV9oaSwgYzFfbG8sXG4gICAgICBjMl9oaSwgYzJfbG8sXG4gICAgICBjM19oaSwgYzNfbG8sXG4gICAgICBjNF9oaSwgYzRfbG8pO1xuICAgIHZhciBUMV9sbyA9IHN1bTY0XzVfbG8oXG4gICAgICBjMF9oaSwgYzBfbG8sXG4gICAgICBjMV9oaSwgYzFfbG8sXG4gICAgICBjMl9oaSwgYzJfbG8sXG4gICAgICBjM19oaSwgYzNfbG8sXG4gICAgICBjNF9oaSwgYzRfbG8pO1xuXG4gICAgYzBfaGkgPSBzMF81MTJfaGkoYWgsIGFsKTtcbiAgICBjMF9sbyA9IHMwXzUxMl9sbyhhaCwgYWwpO1xuICAgIGMxX2hpID0gbWFqNjRfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCk7XG4gICAgYzFfbG8gPSBtYWo2NF9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsKTtcblxuICAgIHZhciBUMl9oaSA9IHN1bTY0X2hpKGMwX2hpLCBjMF9sbywgYzFfaGksIGMxX2xvKTtcbiAgICB2YXIgVDJfbG8gPSBzdW02NF9sbyhjMF9oaSwgYzBfbG8sIGMxX2hpLCBjMV9sbyk7XG5cbiAgICBoaCA9IGdoO1xuICAgIGhsID0gZ2w7XG5cbiAgICBnaCA9IGZoO1xuICAgIGdsID0gZmw7XG5cbiAgICBmaCA9IGVoO1xuICAgIGZsID0gZWw7XG5cbiAgICBlaCA9IHN1bTY0X2hpKGRoLCBkbCwgVDFfaGksIFQxX2xvKTtcbiAgICBlbCA9IHN1bTY0X2xvKGRsLCBkbCwgVDFfaGksIFQxX2xvKTtcblxuICAgIGRoID0gY2g7XG4gICAgZGwgPSBjbDtcblxuICAgIGNoID0gYmg7XG4gICAgY2wgPSBibDtcblxuICAgIGJoID0gYWg7XG4gICAgYmwgPSBhbDtcblxuICAgIGFoID0gc3VtNjRfaGkoVDFfaGksIFQxX2xvLCBUMl9oaSwgVDJfbG8pO1xuICAgIGFsID0gc3VtNjRfbG8oVDFfaGksIFQxX2xvLCBUMl9oaSwgVDJfbG8pO1xuICB9XG5cbiAgc3VtNjQodGhpcy5oLCAwLCBhaCwgYWwpO1xuICBzdW02NCh0aGlzLmgsIDIsIGJoLCBibCk7XG4gIHN1bTY0KHRoaXMuaCwgNCwgY2gsIGNsKTtcbiAgc3VtNjQodGhpcy5oLCA2LCBkaCwgZGwpO1xuICBzdW02NCh0aGlzLmgsIDgsIGVoLCBlbCk7XG4gIHN1bTY0KHRoaXMuaCwgMTAsIGZoLCBmbCk7XG4gIHN1bTY0KHRoaXMuaCwgMTIsIGdoLCBnbCk7XG4gIHN1bTY0KHRoaXMuaCwgMTQsIGhoLCBobCk7XG59O1xuXG5TSEE1MTIucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuXG5mdW5jdGlvbiBjaDY0X2hpKHhoLCB4bCwgeWgsIHlsLCB6aCkge1xuICB2YXIgciA9ICh4aCAmIHloKSBeICgofnhoKSAmIHpoKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBjaDY0X2xvKHhoLCB4bCwgeWgsIHlsLCB6aCwgemwpIHtcbiAgdmFyIHIgPSAoeGwgJiB5bCkgXiAoKH54bCkgJiB6bCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gbWFqNjRfaGkoeGgsIHhsLCB5aCwgeWwsIHpoKSB7XG4gIHZhciByID0gKHhoICYgeWgpIF4gKHhoICYgemgpIF4gKHloICYgemgpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIG1hajY0X2xvKHhoLCB4bCwgeWgsIHlsLCB6aCwgemwpIHtcbiAgdmFyIHIgPSAoeGwgJiB5bCkgXiAoeGwgJiB6bCkgXiAoeWwgJiB6bCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczBfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAyOCk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDIpOyAgLy8gMzRcbiAgdmFyIGMyX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgNyk7ICAvLyAzOVxuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMwXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMjgpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCAyKTsgIC8vIDM0XG4gIHZhciBjMl9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDcpOyAgLy8gMzlcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMV81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE0KTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMTgpO1xuICB2YXIgYzJfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCA5KTsgIC8vIDQxXG5cbiAgdmFyIHIgPSBjMF9oaSBeIGMxX2hpIF4gYzJfaGk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczFfNTEyX2xvKHhoLCB4bCkge1xuICB2YXIgYzBfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxNCk7XG4gIHZhciBjMV9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDE4KTtcbiAgdmFyIGMyX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgOSk7ICAvLyA0MVxuXG4gIHZhciByID0gYzBfbG8gXiBjMV9sbyBeIGMyX2xvO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGcwXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMSk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDgpO1xuICB2YXIgYzJfaGkgPSBzaHI2NF9oaSh4aCwgeGwsIDcpO1xuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGcwXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMSk7XG4gIHZhciBjMV9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDgpO1xuICB2YXIgYzJfbG8gPSBzaHI2NF9sbyh4aCwgeGwsIDcpO1xuXG4gIHZhciByID0gYzBfbG8gXiBjMV9sbyBeIGMyX2xvO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGcxXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMTkpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCAyOSk7ICAvLyA2MVxuICB2YXIgYzJfaGkgPSBzaHI2NF9oaSh4aCwgeGwsIDYpO1xuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGcxXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMTkpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCAyOSk7ICAvLyA2MVxuICB2YXIgYzJfbG8gPSBzaHI2NF9sbyh4aCwgeGwsIDYpO1xuXG4gIHZhciByID0gYzBfbG8gXiBjMV9sbyBeIGMyX2xvO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbn0se1wiLi4vY29tbW9uXCI6Mjg1LFwiLi4vdXRpbHNcIjoyOTUsXCJtaW5pbWFsaXN0aWMtYXNzZXJ0XCI6Mjk5fV0sMjk0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gX2RlcmVxXygnLi4vdXRpbHMnKTtcbnZhciByb3RyMzIgPSB1dGlscy5yb3RyMzI7XG5cbmZ1bmN0aW9uIGZ0XzEocywgeCwgeSwgeikge1xuICBpZiAocyA9PT0gMClcbiAgICByZXR1cm4gY2gzMih4LCB5LCB6KTtcbiAgaWYgKHMgPT09IDEgfHwgcyA9PT0gMylcbiAgICByZXR1cm4gcDMyKHgsIHksIHopO1xuICBpZiAocyA9PT0gMilcbiAgICByZXR1cm4gbWFqMzIoeCwgeSwgeik7XG59XG5leHBvcnRzLmZ0XzEgPSBmdF8xO1xuXG5mdW5jdGlvbiBjaDMyKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgXiAoKH54KSAmIHopO1xufVxuZXhwb3J0cy5jaDMyID0gY2gzMjtcblxuZnVuY3Rpb24gbWFqMzIoeCwgeSwgeikge1xuICByZXR1cm4gKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopO1xufVxuZXhwb3J0cy5tYWozMiA9IG1hajMyO1xuXG5mdW5jdGlvbiBwMzIoeCwgeSwgeikge1xuICByZXR1cm4geCBeIHkgXiB6O1xufVxuZXhwb3J0cy5wMzIgPSBwMzI7XG5cbmZ1bmN0aW9uIHMwXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgMikgXiByb3RyMzIoeCwgMTMpIF4gcm90cjMyKHgsIDIyKTtcbn1cbmV4cG9ydHMuczBfMjU2ID0gczBfMjU2O1xuXG5mdW5jdGlvbiBzMV8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDYpIF4gcm90cjMyKHgsIDExKSBeIHJvdHIzMih4LCAyNSk7XG59XG5leHBvcnRzLnMxXzI1NiA9IHMxXzI1NjtcblxuZnVuY3Rpb24gZzBfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCA3KSBeIHJvdHIzMih4LCAxOCkgXiAoeCA+Pj4gMyk7XG59XG5leHBvcnRzLmcwXzI1NiA9IGcwXzI1NjtcblxuZnVuY3Rpb24gZzFfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCAxNykgXiByb3RyMzIoeCwgMTkpIF4gKHggPj4+IDEwKTtcbn1cbmV4cG9ydHMuZzFfMjU2ID0gZzFfMjU2O1xuXG59LHtcIi4uL3V0aWxzXCI6Mjk1fV0sMjk1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2VydCA9IF9kZXJlcV8oJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcbnZhciBpbmhlcml0cyA9IF9kZXJlcV8oJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuaW5oZXJpdHMgPSBpbmhlcml0cztcblxuZnVuY3Rpb24gdG9BcnJheShtc2csIGVuYykge1xuICBpZiAoQXJyYXkuaXNBcnJheShtc2cpKVxuICAgIHJldHVybiBtc2cuc2xpY2UoKTtcbiAgaWYgKCFtc2cpXG4gICAgcmV0dXJuIFtdO1xuICB2YXIgcmVzID0gW107XG4gIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJykge1xuICAgIGlmICghZW5jKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYyA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICB2YXIgaGkgPSBjID4+IDg7XG4gICAgICAgIHZhciBsbyA9IGMgJiAweGZmO1xuICAgICAgICBpZiAoaGkpXG4gICAgICAgICAgcmVzLnB1c2goaGksIGxvKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJlcy5wdXNoKGxvKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVuYyA9PT0gJ2hleCcpIHtcbiAgICAgIG1zZyA9IG1zZy5yZXBsYWNlKC9bXmEtejAtOV0rL2lnLCAnJyk7XG4gICAgICBpZiAobXNnLmxlbmd0aCAlIDIgIT09IDApXG4gICAgICAgIG1zZyA9ICcwJyArIG1zZztcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgIHJlcy5wdXNoKHBhcnNlSW50KG1zZ1tpXSArIG1zZ1tpICsgMV0sIDE2KSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgICByZXNbaV0gPSBtc2dbaV0gfCAwO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5leHBvcnRzLnRvQXJyYXkgPSB0b0FycmF5O1xuXG5mdW5jdGlvbiB0b0hleChtc2cpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICByZXMgKz0gemVybzIobXNnW2ldLnRvU3RyaW5nKDE2KSk7XG4gIHJldHVybiByZXM7XG59XG5leHBvcnRzLnRvSGV4ID0gdG9IZXg7XG5cbmZ1bmN0aW9uIGh0b25sKHcpIHtcbiAgdmFyIHJlcyA9ICh3ID4+PiAyNCkgfFxuICAgICAgICAgICAgKCh3ID4+PiA4KSAmIDB4ZmYwMCkgfFxuICAgICAgICAgICAgKCh3IDw8IDgpICYgMHhmZjAwMDApIHxcbiAgICAgICAgICAgICgodyAmIDB4ZmYpIDw8IDI0KTtcbiAgcmV0dXJuIHJlcyA+Pj4gMDtcbn1cbmV4cG9ydHMuaHRvbmwgPSBodG9ubDtcblxuZnVuY3Rpb24gdG9IZXgzMihtc2csIGVuZGlhbikge1xuICB2YXIgcmVzID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHcgPSBtc2dbaV07XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2xpdHRsZScpXG4gICAgICB3ID0gaHRvbmwodyk7XG4gICAgcmVzICs9IHplcm84KHcudG9TdHJpbmcoMTYpKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0hleDMyID0gdG9IZXgzMjtcblxuZnVuY3Rpb24gemVybzIod29yZCkge1xuICBpZiAod29yZC5sZW5ndGggPT09IDEpXG4gICAgcmV0dXJuICcwJyArIHdvcmQ7XG4gIGVsc2VcbiAgICByZXR1cm4gd29yZDtcbn1cbmV4cG9ydHMuemVybzIgPSB6ZXJvMjtcblxuZnVuY3Rpb24gemVybzgod29yZCkge1xuICBpZiAod29yZC5sZW5ndGggPT09IDcpXG4gICAgcmV0dXJuICcwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA2KVxuICAgIHJldHVybiAnMDAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDUpXG4gICAgcmV0dXJuICcwMDAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDQpXG4gICAgcmV0dXJuICcwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAzKVxuICAgIHJldHVybiAnMDAwMDAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDIpXG4gICAgcmV0dXJuICcwMDAwMDAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDEpXG4gICAgcmV0dXJuICcwMDAwMDAwJyArIHdvcmQ7XG4gIGVsc2VcbiAgICByZXR1cm4gd29yZDtcbn1cbmV4cG9ydHMuemVybzggPSB6ZXJvODtcblxuZnVuY3Rpb24gam9pbjMyKG1zZywgc3RhcnQsIGVuZCwgZW5kaWFuKSB7XG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydDtcbiAgYXNzZXJ0KGxlbiAlIDQgPT09IDApO1xuICB2YXIgcmVzID0gbmV3IEFycmF5KGxlbiAvIDQpO1xuICBmb3IgKHZhciBpID0gMCwgayA9IHN0YXJ0OyBpIDwgcmVzLmxlbmd0aDsgaSsrLCBrICs9IDQpIHtcbiAgICB2YXIgdztcbiAgICBpZiAoZW5kaWFuID09PSAnYmlnJylcbiAgICAgIHcgPSAobXNnW2tdIDw8IDI0KSB8IChtc2dbayArIDFdIDw8IDE2KSB8IChtc2dbayArIDJdIDw8IDgpIHwgbXNnW2sgKyAzXTtcbiAgICBlbHNlXG4gICAgICB3ID0gKG1zZ1trICsgM10gPDwgMjQpIHwgKG1zZ1trICsgMl0gPDwgMTYpIHwgKG1zZ1trICsgMV0gPDwgOCkgfCBtc2dba107XG4gICAgcmVzW2ldID0gdyA+Pj4gMDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5qb2luMzIgPSBqb2luMzI7XG5cbmZ1bmN0aW9uIHNwbGl0MzIobXNnLCBlbmRpYW4pIHtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShtc2cubGVuZ3RoICogNCk7XG4gIGZvciAodmFyIGkgPSAwLCBrID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKywgayArPSA0KSB7XG4gICAgdmFyIG0gPSBtc2dbaV07XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JpZycpIHtcbiAgICAgIHJlc1trXSA9IG0gPj4+IDI0O1xuICAgICAgcmVzW2sgKyAxXSA9IChtID4+PiAxNikgJiAweGZmO1xuICAgICAgcmVzW2sgKyAyXSA9IChtID4+PiA4KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDNdID0gbSAmIDB4ZmY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc1trICsgM10gPSBtID4+PiAyNDtcbiAgICAgIHJlc1trICsgMl0gPSAobSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgIHJlc1trICsgMV0gPSAobSA+Pj4gOCkgJiAweGZmO1xuICAgICAgcmVzW2tdID0gbSAmIDB4ZmY7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5leHBvcnRzLnNwbGl0MzIgPSBzcGxpdDMyO1xuXG5mdW5jdGlvbiByb3RyMzIodywgYikge1xuICByZXR1cm4gKHcgPj4+IGIpIHwgKHcgPDwgKDMyIC0gYikpO1xufVxuZXhwb3J0cy5yb3RyMzIgPSByb3RyMzI7XG5cbmZ1bmN0aW9uIHJvdGwzMih3LCBiKSB7XG4gIHJldHVybiAodyA8PCBiKSB8ICh3ID4+PiAoMzIgLSBiKSk7XG59XG5leHBvcnRzLnJvdGwzMiA9IHJvdGwzMjtcblxuZnVuY3Rpb24gc3VtMzIoYSwgYikge1xuICByZXR1cm4gKGEgKyBiKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzIgPSBzdW0zMjtcblxuZnVuY3Rpb24gc3VtMzJfMyhhLCBiLCBjKSB7XG4gIHJldHVybiAoYSArIGIgKyBjKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfMyA9IHN1bTMyXzM7XG5cbmZ1bmN0aW9uIHN1bTMyXzQoYSwgYiwgYywgZCkge1xuICByZXR1cm4gKGEgKyBiICsgYyArIGQpID4+PiAwO1xufVxuZXhwb3J0cy5zdW0zMl80ID0gc3VtMzJfNDtcblxuZnVuY3Rpb24gc3VtMzJfNShhLCBiLCBjLCBkLCBlKSB7XG4gIHJldHVybiAoYSArIGIgKyBjICsgZCArIGUpID4+PiAwO1xufVxuZXhwb3J0cy5zdW0zMl81ID0gc3VtMzJfNTtcblxuZnVuY3Rpb24gc3VtNjQoYnVmLCBwb3MsIGFoLCBhbCkge1xuICB2YXIgYmggPSBidWZbcG9zXTtcbiAgdmFyIGJsID0gYnVmW3BvcyArIDFdO1xuXG4gIHZhciBsbyA9IChhbCArIGJsKSA+Pj4gMDtcbiAgdmFyIGhpID0gKGxvIDwgYWwgPyAxIDogMCkgKyBhaCArIGJoO1xuICBidWZbcG9zXSA9IGhpID4+PiAwO1xuICBidWZbcG9zICsgMV0gPSBsbztcbn1cbmV4cG9ydHMuc3VtNjQgPSBzdW02NDtcblxuZnVuY3Rpb24gc3VtNjRfaGkoYWgsIGFsLCBiaCwgYmwpIHtcbiAgdmFyIGxvID0gKGFsICsgYmwpID4+PiAwO1xuICB2YXIgaGkgPSAobG8gPCBhbCA/IDEgOiAwKSArIGFoICsgYmg7XG4gIHJldHVybiBoaSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfaGkgPSBzdW02NF9oaTtcblxuZnVuY3Rpb24gc3VtNjRfbG8oYWgsIGFsLCBiaCwgYmwpIHtcbiAgdmFyIGxvID0gYWwgKyBibDtcbiAgcmV0dXJuIGxvID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF9sbyA9IHN1bTY0X2xvO1xuXG5mdW5jdGlvbiBzdW02NF80X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCkge1xuICB2YXIgY2FycnkgPSAwO1xuICB2YXIgbG8gPSBhbDtcbiAgbG8gPSAobG8gKyBibCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgYWwgPyAxIDogMDtcbiAgbG8gPSAobG8gKyBjbCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgY2wgPyAxIDogMDtcbiAgbG8gPSAobG8gKyBkbCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgZGwgPyAxIDogMDtcblxuICB2YXIgaGkgPSBhaCArIGJoICsgY2ggKyBkaCArIGNhcnJ5O1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzRfaGkgPSBzdW02NF80X2hpO1xuXG5mdW5jdGlvbiBzdW02NF80X2xvKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCkge1xuICB2YXIgbG8gPSBhbCArIGJsICsgY2wgKyBkbDtcbiAgcmV0dXJuIGxvID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF80X2xvID0gc3VtNjRfNF9sbztcblxuZnVuY3Rpb24gc3VtNjRfNV9oaShhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwsIGVoLCBlbCkge1xuICB2YXIgY2FycnkgPSAwO1xuICB2YXIgbG8gPSBhbDtcbiAgbG8gPSAobG8gKyBibCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgYWwgPyAxIDogMDtcbiAgbG8gPSAobG8gKyBjbCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgY2wgPyAxIDogMDtcbiAgbG8gPSAobG8gKyBkbCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgZGwgPyAxIDogMDtcbiAgbG8gPSAobG8gKyBlbCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgZWwgPyAxIDogMDtcblxuICB2YXIgaGkgPSBhaCArIGJoICsgY2ggKyBkaCArIGVoICsgY2Fycnk7XG4gIHJldHVybiBoaSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNV9oaSA9IHN1bTY0XzVfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0XzVfbG8oYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsLCBlaCwgZWwpIHtcbiAgdmFyIGxvID0gYWwgKyBibCArIGNsICsgZGwgKyBlbDtcblxuICByZXR1cm4gbG8gPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzVfbG8gPSBzdW02NF81X2xvO1xuXG5mdW5jdGlvbiByb3RyNjRfaGkoYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWwgPDwgKDMyIC0gbnVtKSkgfCAoYWggPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufVxuZXhwb3J0cy5yb3RyNjRfaGkgPSByb3RyNjRfaGk7XG5cbmZ1bmN0aW9uIHJvdHI2NF9sbyhhaCwgYWwsIG51bSkge1xuICB2YXIgciA9IChhaCA8PCAoMzIgLSBudW0pKSB8IChhbCA+Pj4gbnVtKTtcbiAgcmV0dXJuIHIgPj4+IDA7XG59XG5leHBvcnRzLnJvdHI2NF9sbyA9IHJvdHI2NF9sbztcblxuZnVuY3Rpb24gc2hyNjRfaGkoYWgsIGFsLCBudW0pIHtcbiAgcmV0dXJuIGFoID4+PiBudW07XG59XG5leHBvcnRzLnNocjY0X2hpID0gc2hyNjRfaGk7XG5cbmZ1bmN0aW9uIHNocjY0X2xvKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFoIDw8ICgzMiAtIG51bSkpIHwgKGFsID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn1cbmV4cG9ydHMuc2hyNjRfbG8gPSBzaHI2NF9sbztcblxufSx7XCJpbmhlcml0c1wiOjI5OCxcIm1pbmltYWxpc3RpYy1hc3NlcnRcIjoyOTl9XSwyOTY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzaCA9IF9kZXJlcV8oJ2hhc2guanMnKTtcbnZhciB1dGlscyA9IF9kZXJlcV8oJ21pbmltYWxpc3RpYy1jcnlwdG8tdXRpbHMnKTtcbnZhciBhc3NlcnQgPSBfZGVyZXFfKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbmZ1bmN0aW9uIEhtYWNEUkJHKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEhtYWNEUkJHKSlcbiAgICByZXR1cm4gbmV3IEhtYWNEUkJHKG9wdGlvbnMpO1xuICB0aGlzLmhhc2ggPSBvcHRpb25zLmhhc2g7XG4gIHRoaXMucHJlZFJlc2lzdCA9ICEhb3B0aW9ucy5wcmVkUmVzaXN0O1xuXG4gIHRoaXMub3V0TGVuID0gdGhpcy5oYXNoLm91dFNpemU7XG4gIHRoaXMubWluRW50cm9weSA9IG9wdGlvbnMubWluRW50cm9weSB8fCB0aGlzLmhhc2guaG1hY1N0cmVuZ3RoO1xuXG4gIHRoaXMuX3Jlc2VlZCA9IG51bGw7XG4gIHRoaXMucmVzZWVkSW50ZXJ2YWwgPSBudWxsO1xuICB0aGlzLksgPSBudWxsO1xuICB0aGlzLlYgPSBudWxsO1xuXG4gIHZhciBlbnRyb3B5ID0gdXRpbHMudG9BcnJheShvcHRpb25zLmVudHJvcHksIG9wdGlvbnMuZW50cm9weUVuYyB8fCAnaGV4Jyk7XG4gIHZhciBub25jZSA9IHV0aWxzLnRvQXJyYXkob3B0aW9ucy5ub25jZSwgb3B0aW9ucy5ub25jZUVuYyB8fCAnaGV4Jyk7XG4gIHZhciBwZXJzID0gdXRpbHMudG9BcnJheShvcHRpb25zLnBlcnMsIG9wdGlvbnMucGVyc0VuYyB8fCAnaGV4Jyk7XG4gIGFzc2VydChlbnRyb3B5Lmxlbmd0aCA+PSAodGhpcy5taW5FbnRyb3B5IC8gOCksXG4gICAgICAgICAnTm90IGVub3VnaCBlbnRyb3B5LiBNaW5pbXVtIGlzOiAnICsgdGhpcy5taW5FbnRyb3B5ICsgJyBiaXRzJyk7XG4gIHRoaXMuX2luaXQoZW50cm9weSwgbm9uY2UsIHBlcnMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBIbWFjRFJCRztcblxuSG1hY0RSQkcucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdChlbnRyb3B5LCBub25jZSwgcGVycykge1xuICB2YXIgc2VlZCA9IGVudHJvcHkuY29uY2F0KG5vbmNlKS5jb25jYXQocGVycyk7XG5cbiAgdGhpcy5LID0gbmV3IEFycmF5KHRoaXMub3V0TGVuIC8gOCk7XG4gIHRoaXMuViA9IG5ldyBBcnJheSh0aGlzLm91dExlbiAvIDgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuVi5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuS1tpXSA9IDB4MDA7XG4gICAgdGhpcy5WW2ldID0gMHgwMTtcbiAgfVxuXG4gIHRoaXMuX3VwZGF0ZShzZWVkKTtcbiAgdGhpcy5fcmVzZWVkID0gMTtcbiAgdGhpcy5yZXNlZWRJbnRlcnZhbCA9IDB4MTAwMDAwMDAwMDAwMDsgIC8vIDJeNDhcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5faG1hYyA9IGZ1bmN0aW9uIGhtYWMoKSB7XG4gIHJldHVybiBuZXcgaGFzaC5obWFjKHRoaXMuaGFzaCwgdGhpcy5LKTtcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKHNlZWQpIHtcbiAgdmFyIGttYWMgPSB0aGlzLl9obWFjKClcbiAgICAgICAgICAgICAgICAgLnVwZGF0ZSh0aGlzLlYpXG4gICAgICAgICAgICAgICAgIC51cGRhdGUoWyAweDAwIF0pO1xuICBpZiAoc2VlZClcbiAgICBrbWFjID0ga21hYy51cGRhdGUoc2VlZCk7XG4gIHRoaXMuSyA9IGttYWMuZGlnZXN0KCk7XG4gIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKTtcbiAgaWYgKCFzZWVkKVxuICAgIHJldHVybjtcblxuICB0aGlzLksgPSB0aGlzLl9obWFjKClcbiAgICAgICAgICAgICAgIC51cGRhdGUodGhpcy5WKVxuICAgICAgICAgICAgICAgLnVwZGF0ZShbIDB4MDEgXSlcbiAgICAgICAgICAgICAgIC51cGRhdGUoc2VlZClcbiAgICAgICAgICAgICAgIC5kaWdlc3QoKTtcbiAgdGhpcy5WID0gdGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpO1xufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLnJlc2VlZCA9IGZ1bmN0aW9uIHJlc2VlZChlbnRyb3B5LCBlbnRyb3B5RW5jLCBhZGQsIGFkZEVuYykge1xuICAvLyBPcHRpb25hbCBlbnRyb3B5IGVuY1xuICBpZiAodHlwZW9mIGVudHJvcHlFbmMgIT09ICdzdHJpbmcnKSB7XG4gICAgYWRkRW5jID0gYWRkO1xuICAgIGFkZCA9IGVudHJvcHlFbmM7XG4gICAgZW50cm9weUVuYyA9IG51bGw7XG4gIH1cblxuICBlbnRyb3B5ID0gdXRpbHMudG9BcnJheShlbnRyb3B5LCBlbnRyb3B5RW5jKTtcbiAgYWRkID0gdXRpbHMudG9BcnJheShhZGQsIGFkZEVuYyk7XG5cbiAgYXNzZXJ0KGVudHJvcHkubGVuZ3RoID49ICh0aGlzLm1pbkVudHJvcHkgLyA4KSxcbiAgICAgICAgICdOb3QgZW5vdWdoIGVudHJvcHkuIE1pbmltdW0gaXM6ICcgKyB0aGlzLm1pbkVudHJvcHkgKyAnIGJpdHMnKTtcblxuICB0aGlzLl91cGRhdGUoZW50cm9weS5jb25jYXQoYWRkIHx8IFtdKSk7XG4gIHRoaXMuX3Jlc2VlZCA9IDE7XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuZ2VuZXJhdGUgPSBmdW5jdGlvbiBnZW5lcmF0ZShsZW4sIGVuYywgYWRkLCBhZGRFbmMpIHtcbiAgaWYgKHRoaXMuX3Jlc2VlZCA+IHRoaXMucmVzZWVkSW50ZXJ2YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZXNlZWQgaXMgcmVxdWlyZWQnKTtcblxuICAvLyBPcHRpb25hbCBlbmNvZGluZ1xuICBpZiAodHlwZW9mIGVuYyAhPT0gJ3N0cmluZycpIHtcbiAgICBhZGRFbmMgPSBhZGQ7XG4gICAgYWRkID0gZW5jO1xuICAgIGVuYyA9IG51bGw7XG4gIH1cblxuICAvLyBPcHRpb25hbCBhZGRpdGlvbmFsIGRhdGFcbiAgaWYgKGFkZCkge1xuICAgIGFkZCA9IHV0aWxzLnRvQXJyYXkoYWRkLCBhZGRFbmMgfHwgJ2hleCcpO1xuICAgIHRoaXMuX3VwZGF0ZShhZGQpO1xuICB9XG5cbiAgdmFyIHRlbXAgPSBbXTtcbiAgd2hpbGUgKHRlbXAubGVuZ3RoIDwgbGVuKSB7XG4gICAgdGhpcy5WID0gdGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpO1xuICAgIHRlbXAgPSB0ZW1wLmNvbmNhdCh0aGlzLlYpO1xuICB9XG5cbiAgdmFyIHJlcyA9IHRlbXAuc2xpY2UoMCwgbGVuKTtcbiAgdGhpcy5fdXBkYXRlKGFkZCk7XG4gIHRoaXMuX3Jlc2VlZCsrO1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHJlcywgZW5jKTtcbn07XG5cbn0se1wiaGFzaC5qc1wiOjI4NCxcIm1pbmltYWxpc3RpYy1hc3NlcnRcIjoyOTksXCJtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzXCI6MzAwfV0sMjk3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuXG59LHt9XSwyOTg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG5cbn0se31dLDI5OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IGFzc2VydDtcblxuZnVuY3Rpb24gYXNzZXJ0KHZhbCwgbXNnKSB7XG4gIGlmICghdmFsKVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnKTtcbn1cblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gYXNzZXJ0RXF1YWwobCwgciwgbXNnKSB7XG4gIGlmIChsICE9IHIpXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAoJ0Fzc2VydGlvbiBmYWlsZWQ6ICcgKyBsICsgJyAhPSAnICsgcikpO1xufTtcblxufSx7fV0sMzAwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gZXhwb3J0cztcblxuZnVuY3Rpb24gdG9BcnJheShtc2csIGVuYykge1xuICBpZiAoQXJyYXkuaXNBcnJheShtc2cpKVxuICAgIHJldHVybiBtc2cuc2xpY2UoKTtcbiAgaWYgKCFtc2cpXG4gICAgcmV0dXJuIFtdO1xuICB2YXIgcmVzID0gW107XG4gIGlmICh0eXBlb2YgbXNnICE9PSAnc3RyaW5nJykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgICAgcmVzW2ldID0gbXNnW2ldIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIGlmIChlbmMgPT09ICdoZXgnKSB7XG4gICAgbXNnID0gbXNnLnJlcGxhY2UoL1teYS16MC05XSsvaWcsICcnKTtcbiAgICBpZiAobXNnLmxlbmd0aCAlIDIgIT09IDApXG4gICAgICBtc2cgPSAnMCcgKyBtc2c7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpICs9IDIpXG4gICAgICByZXMucHVzaChwYXJzZUludChtc2dbaV0gKyBtc2dbaSArIDFdLCAxNikpO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgdmFyIGhpID0gYyA+PiA4O1xuICAgICAgdmFyIGxvID0gYyAmIDB4ZmY7XG4gICAgICBpZiAoaGkpXG4gICAgICAgIHJlcy5wdXNoKGhpLCBsbyk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlcy5wdXNoKGxvKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbnV0aWxzLnRvQXJyYXkgPSB0b0FycmF5O1xuXG5mdW5jdGlvbiB6ZXJvMih3b3JkKSB7XG4gIGlmICh3b3JkLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gJzAnICsgd29yZDtcbiAgZWxzZVxuICAgIHJldHVybiB3b3JkO1xufVxudXRpbHMuemVybzIgPSB6ZXJvMjtcblxuZnVuY3Rpb24gdG9IZXgobXNnKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgcmVzICs9IHplcm8yKG1zZ1tpXS50b1N0cmluZygxNikpO1xuICByZXR1cm4gcmVzO1xufVxudXRpbHMudG9IZXggPSB0b0hleDtcblxudXRpbHMuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGFyciwgZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB0b0hleChhcnIpO1xuICBlbHNlXG4gICAgcmV0dXJuIGFycjtcbn07XG5cbn0se31dLDMwMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyBUb3AgbGV2ZWwgZmlsZSBpcyBqdXN0IGEgbWl4aW4gb2Ygc3VibW9kdWxlcyAmIGNvbnN0YW50c1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzaWduICAgID0gX2RlcmVxXygnLi9saWIvdXRpbHMvY29tbW9uJykuYXNzaWduO1xuXG52YXIgZGVmbGF0ZSAgID0gX2RlcmVxXygnLi9saWIvZGVmbGF0ZScpO1xudmFyIGluZmxhdGUgICA9IF9kZXJlcV8oJy4vbGliL2luZmxhdGUnKTtcbnZhciBjb25zdGFudHMgPSBfZGVyZXFfKCcuL2xpYi96bGliL2NvbnN0YW50cycpO1xuXG52YXIgcGFrbyA9IHt9O1xuXG5hc3NpZ24ocGFrbywgZGVmbGF0ZSwgaW5mbGF0ZSwgY29uc3RhbnRzKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYWtvO1xuXG59LHtcIi4vbGliL2RlZmxhdGVcIjozMDIsXCIuL2xpYi9pbmZsYXRlXCI6MzAzLFwiLi9saWIvdXRpbHMvY29tbW9uXCI6MzA0LFwiLi9saWIvemxpYi9jb25zdGFudHNcIjozMDd9XSwzMDI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB6bGliX2RlZmxhdGUgPSBfZGVyZXFfKCcuL3psaWIvZGVmbGF0ZScpO1xudmFyIHV0aWxzICAgICAgICA9IF9kZXJlcV8oJy4vdXRpbHMvY29tbW9uJyk7XG52YXIgc3RyaW5ncyAgICAgID0gX2RlcmVxXygnLi91dGlscy9zdHJpbmdzJyk7XG52YXIgbXNnICAgICAgICAgID0gX2RlcmVxXygnLi96bGliL21lc3NhZ2VzJyk7XG52YXIgWlN0cmVhbSAgICAgID0gX2RlcmVxXygnLi96bGliL3pzdHJlYW0nKTtcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbnZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xudmFyIFpfRklOSVNIICAgICAgICA9IDQ7XG5cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcblxudmFyIFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IC0xO1xuXG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxudmFyIFpfREVGTEFURUQgID0gODtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG4vKipcbiAqIGNsYXNzIERlZmxhdGVcbiAqXG4gKiBHZW5lcmljIEpTLXN0eWxlIHdyYXBwZXIgZm9yIHpsaWIgY2FsbHMuIElmIHlvdSBkb24ndCBuZWVkXG4gKiBzdHJlYW1pbmcgYmVoYXZpb3VyIC0gdXNlIG1vcmUgc2ltcGxlIGZ1bmN0aW9uczogW1tkZWZsYXRlXV0sXG4gKiBbW2RlZmxhdGVSYXddXSBhbmQgW1tnemlwXV0uXG4gKiovXG5cbi8qIGludGVybmFsXG4gKiBEZWZsYXRlLmNodW5rcyAtPiBBcnJheVxuICpcbiAqIENodW5rcyBvZiBvdXRwdXQgZGF0YSwgaWYgW1tEZWZsYXRlI29uRGF0YV1dIG5vdCBvdmVycmlkZGVuLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXlcbiAqXG4gKiBDb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tEZWZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tEZWZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0RlZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBkZWZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogWW91IHdpbGwgbm90IG5lZWQgaXQgaW4gcmVhbCBsaWZlLCBiZWNhdXNlIGRlZmxhdGUgZXJyb3JzXG4gKiBhcmUgcG9zc2libGUgb25seSBvbiB3cm9uZyBvcHRpb25zIG9yIGJhZCBgb25EYXRhYCAvIGBvbkVuZGBcbiAqIGN1c3RvbSBoYW5kbGVycy5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0RlZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IERlZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgZGVmbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGBsZXZlbGBcbiAqIC0gYHdpbmRvd0JpdHNgXG4gKiAtIGBtZW1MZXZlbGBcbiAqIC0gYHN0cmF0ZWd5YFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgZGVmbGF0ZVxuICogLSBgZ3ppcGAgKEJvb2xlYW4pIC0gY3JlYXRlIGd6aXAgd3JhcHBlclxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqIC0gYGhlYWRlcmAgKE9iamVjdCkgLSBjdXN0b20gaGVhZGVyIGZvciBnemlwXG4gKiAgIC0gYHRleHRgIChCb29sZWFuKSAtIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHRcbiAqICAgLSBgdGltZWAgKE51bWJlcikgLSBtb2RpZmljYXRpb24gdGltZSwgdW5peCB0aW1lc3RhbXBcbiAqICAgLSBgb3NgIChOdW1iZXIpIC0gb3BlcmF0aW9uIHN5c3RlbSBjb2RlXG4gKiAgIC0gYGV4dHJhYCAoQXJyYXkpIC0gYXJyYXkgb2YgYnl0ZXMgd2l0aCBleHRyYSBkYXRhIChtYXggNjU1MzYpXG4gKiAgIC0gYG5hbWVgIChTdHJpbmcpIC0gZmlsZSBuYW1lIChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBjb21tZW50YCAoU3RyaW5nKSAtIGNvbW1lbnQgKGJpbmFyeSBzdHJpbmcpXG4gKiAgIC0gYGhjcmNgIChCb29sZWFuKSAtIHRydWUgaWYgaGVhZGVyIGNyYyBzaG91bGQgYmUgYWRkZWRcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGRlZmxhdGUgPSBuZXcgcGFrby5EZWZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBkZWZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBkZWZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChkZWZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoZGVmbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coZGVmbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBEZWZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERlZmxhdGUpKSByZXR1cm4gbmV3IERlZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBsZXZlbDogWl9ERUZBVUxUX0NPTVBSRVNTSU9OLFxuICAgIG1ldGhvZDogWl9ERUZMQVRFRCxcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDE1LFxuICAgIG1lbUxldmVsOiA4LFxuICAgIHN0cmF0ZWd5OiBaX0RFRkFVTFRfU1RSQVRFR1ksXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgfVxuXG4gIGVsc2UgaWYgKG9wdC5nemlwICYmIChvcHQud2luZG93Qml0cyA+IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzICs9IDE2O1xuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtID0gbmV3IFpTdHJlYW0oKTtcbiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7XG5cbiAgdmFyIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC5sZXZlbCxcbiAgICBvcHQubWV0aG9kLFxuICAgIG9wdC53aW5kb3dCaXRzLFxuICAgIG9wdC5tZW1MZXZlbCxcbiAgICBvcHQuc3RyYXRlZ3lcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIGlmIChvcHQuaGVhZGVyKSB7XG4gICAgemxpYl9kZWZsYXRlLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLCBvcHQuaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChvcHQuZGljdGlvbmFyeSkge1xuICAgIHZhciBkaWN0O1xuICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIG9wdC5kaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpY3QgPSBvcHQuZGljdGlvbmFyeTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGljdF9zZXQgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogRGVmbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGEuIFN0cmluZ3Mgd2lsbCBiZVxuICogICBjb252ZXJ0ZWQgdG8gdXRmOCBieXRlIHNlcXVlbmNlLlxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zIFpfRklOSVNILlxuICpcbiAqIFNlbmRzIGlucHV0IGRhdGEgdG8gZGVmbGF0ZSBwaXBlLCBnZW5lcmF0aW5nIFtbRGVmbGF0ZSNvbkRhdGFdXSBjYWxscyB3aXRoXG4gKiBuZXcgY29tcHJlc3NlZCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBoYXZlXG4gKiBtb2RlIFpfRklOSVNIIChvciBgdHJ1ZWApLiBUaGF0IHdpbGwgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsXG4gKiBbW0RlZmxhdGUjb25FbmRdXS4gRm9yIGludGVyaW0gZXhwbGljaXQgZmx1c2hlcyAod2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSkgeW91XG4gKiBjYW4gdXNlIG1vZGUgWl9TWU5DX0ZMVVNILCBrZWVwaW5nIHRoZSBjb21wcmVzc2lvbiBjb250ZXh0LlxuICpcbiAqIE9uIGZhaWwgY2FsbCBbW0RlZmxhdGUjb25FbmRdXSB3aXRoIGVycm9yIGNvZGUgYW5kIHJldHVybiBmYWxzZS5cbiAqXG4gKiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIGBVaW50OEFycmF5YCBvbiBpbnB1dCBmb3IgYmVzdCBzcGVlZCAob3V0cHV0XG4gKiBhcnJheSBmb3JtYXQgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSkuIEFsc28sIGRvbid0IHNraXAgbGFzdCBwYXJhbSBhbmQgYWx3YXlzXG4gKiB1c2UgdGhlIHNhbWUgdHlwZSBpbiB5b3VyIGNvZGUgKGJvb2xlYW4gb3IgbnVtYmVyKS4gVGhhdCB3aWxsIGltcHJvdmUgSlMgc3BlZWQuXG4gKlxuICogRm9yIHJlZ3VsYXIgYEFycmF5YC1zIG1ha2Ugc3VyZSBhbGwgZWxlbWVudHMgYXJlIFswLi4yNTVdLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBwdXNoKGNodW5rLCBmYWxzZSk7IC8vIHB1c2ggb25lIG9mIGRhdGEgY2h1bmtzXG4gKiAuLi5cbiAqIHB1c2goY2h1bmssIHRydWUpOyAgLy8gcHVzaCBsYXN0IGNodW5rXG4gKiBgYGBcbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgbW9kZSkge1xuICB2YXIgc3RybSA9IHRoaXMuc3RybTtcbiAgdmFyIGNodW5rU2l6ZSA9IHRoaXMub3B0aW9ucy5jaHVua1NpemU7XG4gIHZhciBzdGF0dXMsIF9tb2RlO1xuXG4gIGlmICh0aGlzLmVuZGVkKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IFpfRklOSVNIIDogWl9OT19GTFVTSCk7XG5cbiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICBzdHJtLmlucHV0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKGRhdGEpO1xuICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGF0YSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICBzdHJtLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgc3RybS5pbnB1dCA9IGRhdGE7XG4gIH1cblxuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmF2YWlsX2luID0gc3RybS5pbnB1dC5sZW5ndGg7XG5cbiAgZG8ge1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgc3RybS5vdXRwdXQgPSBuZXcgdXRpbHMuQnVmOChjaHVua1NpemUpO1xuICAgICAgc3RybS5uZXh0X291dCA9IDA7XG4gICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZTtcbiAgICB9XG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGUoc3RybSwgX21vZGUpOyAgICAvKiBubyBiYWQgcmV0dXJuIHZhbHVlICovXG5cbiAgICBpZiAoc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBaX09LKSB7XG4gICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IChzdHJtLmF2YWlsX2luID09PSAwICYmIChfbW9kZSA9PT0gWl9GSU5JU0ggfHwgX21vZGUgPT09IFpfU1lOQ19GTFVTSCkpKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLm9uRGF0YShzdHJpbmdzLmJ1ZjJiaW5zdHJpbmcodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EKTtcblxuICAvLyBGaW5hbGl6ZSBvbiB0aGUgbGFzdCBjaHVuay5cbiAgaWYgKF9tb2RlID09PSBaX0ZJTklTSCkge1xuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXMgPT09IFpfT0s7XG4gIH1cblxuICAvLyBjYWxsYmFjayBpbnRlcmltIHJlc3VsdHMgaWYgWl9TWU5DX0ZMVVNILlxuICBpZiAoX21vZGUgPT09IFpfU1lOQ19GTFVTSCkge1xuICAgIHRoaXMub25FbmQoWl9PSyk7XG4gICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKlxuICogRGVmbGF0ZSNvbkRhdGEoY2h1bmspIC0+IFZvaWRcbiAqIC0gY2h1bmsgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogb3V0cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGRlZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIG9uY2UgYWZ0ZXIgeW91IHRlbGwgZGVmbGF0ZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXNcbiAqIGNvbXBsZXRlIChaX0ZJTklTSCkgb3Igc2hvdWxkIGJlIGZsdXNoZWQgKFpfU1lOQ19GTFVTSClcbiAqIG9yIGlmIGFuIGVycm9yIGhhcHBlbmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAvLyBPbiBzdWNjZXNzIC0gam9pblxuICBpZiAoc3RhdHVzID09PSBaX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogZGVmbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ29tcHJlc3MgYGRhdGFgIHdpdGggZGVmbGF0ZSBhbGdvcml0aG0gYW5kIGBvcHRpb25zYC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSBsZXZlbFxuICogLSB3aW5kb3dCaXRzXG4gKiAtIG1lbUxldmVsXG4gKiAtIHN0cmF0ZWd5XG4gKiAtIGRpY3Rpb25hcnlcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBTdWdhciAob3B0aW9ucyk6XG4gKlxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeVxuICogICBuZWdhdGl2ZSB3aW5kb3dCaXRzIGltcGxpY2l0bHkuXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBcImJpbmFyeSBzdHJpbmdcIlxuICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKVxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBkYXRhID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwYWtvLmRlZmxhdGUoZGF0YSkpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBkZWZsYXRvciA9IG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChkZWZsYXRvci5lcnIpIHsgdGhyb3cgZGVmbGF0b3IubXNnIHx8IG1zZ1tkZWZsYXRvci5lcnJdOyB9XG5cbiAgcmV0dXJuIGRlZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGRlZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyXG4gKiAoaGVhZGVyIGFuZCBhZGxlcjMyIGNyYykuXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIGd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkIG9mXG4gKiBkZWZsYXRlIG9uZS5cbiAqKi9cbmZ1bmN0aW9uIGd6aXAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZ3ppcCA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG5leHBvcnRzLkRlZmxhdGUgPSBEZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZVJhdyA9IGRlZmxhdGVSYXc7XG5leHBvcnRzLmd6aXAgPSBnemlwO1xuXG59LHtcIi4vdXRpbHMvY29tbW9uXCI6MzA0LFwiLi91dGlscy9zdHJpbmdzXCI6MzA1LFwiLi96bGliL2RlZmxhdGVcIjozMDksXCIuL3psaWIvbWVzc2FnZXNcIjozMTQsXCIuL3psaWIvenN0cmVhbVwiOjMxNn1dLDMwMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cblxudmFyIHpsaWJfaW5mbGF0ZSA9IF9kZXJlcV8oJy4vemxpYi9pbmZsYXRlJyk7XG52YXIgdXRpbHMgICAgICAgID0gX2RlcmVxXygnLi91dGlscy9jb21tb24nKTtcbnZhciBzdHJpbmdzICAgICAgPSBfZGVyZXFfKCcuL3V0aWxzL3N0cmluZ3MnKTtcbnZhciBjICAgICAgICAgICAgPSBfZGVyZXFfKCcuL3psaWIvY29uc3RhbnRzJyk7XG52YXIgbXNnICAgICAgICAgID0gX2RlcmVxXygnLi96bGliL21lc3NhZ2VzJyk7XG52YXIgWlN0cmVhbSAgICAgID0gX2RlcmVxXygnLi96bGliL3pzdHJlYW0nKTtcbnZhciBHWmhlYWRlciAgICAgPSBfZGVyZXFfKCcuL3psaWIvZ3poZWFkZXInKTtcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBjbGFzcyBJbmZsYXRlXG4gKlxuICogR2VuZXJpYyBKUy1zdHlsZSB3cmFwcGVyIGZvciB6bGliIGNhbGxzLiBJZiB5b3UgZG9uJ3QgbmVlZFxuICogc3RyZWFtaW5nIGJlaGF2aW91ciAtIHVzZSBtb3JlIHNpbXBsZSBmdW5jdGlvbnM6IFtbaW5mbGF0ZV1dXG4gKiBhbmQgW1tpbmZsYXRlUmF3XV0uXG4gKiovXG5cbi8qIGludGVybmFsXG4gKiBpbmZsYXRlLmNodW5rcyAtPiBBcnJheVxuICpcbiAqIENodW5rcyBvZiBvdXRwdXQgZGF0YSwgaWYgW1tJbmZsYXRlI29uRGF0YV1dIG5vdCBvdmVycmlkZGVuLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKlxuICogVW5jb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tJbmZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tJbmZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgb3IgaWYgeW91XG4gKiBwdXNoIGEgY2h1bmsgd2l0aCBleHBsaWNpdCBmbHVzaCAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGhcbiAqIGBaX1NZTkNfRkxVU0hgIHBhcmFtKS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLmVyciAtPiBOdW1iZXJcbiAqXG4gKiBFcnJvciBjb2RlIGFmdGVyIGluZmxhdGUgZmluaXNoZWQuIDAgKFpfT0spIG9uIHN1Y2Nlc3MuXG4gKiBTaG91bGQgYmUgY2hlY2tlZCBpZiBicm9rZW4gZGF0YSBwb3NzaWJsZS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0luZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IEluZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgaW5mbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgaW5mbGF0ZVxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKiBCeSBkZWZhdWx0LCB3aGVuIG5vIG9wdGlvbnMgc2V0LCBhdXRvZGV0ZWN0IGRlZmxhdGUvZ3ppcCBkYXRhIGZvcm1hdCB2aWFcbiAqIHdyYXBwZXIgaGVhZGVyLlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBjaHVuazEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgY2h1bmsyID0gVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiB2YXIgaW5mbGF0ZSA9IG5ldyBwYWtvLkluZmxhdGUoeyBsZXZlbDogM30pO1xuICpcbiAqIGluZmxhdGUucHVzaChjaHVuazEsIGZhbHNlKTtcbiAqIGluZmxhdGUucHVzaChjaHVuazIsIHRydWUpOyAgLy8gdHJ1ZSAtPiBsYXN0IGNodW5rXG4gKlxuICogaWYgKGluZmxhdGUuZXJyKSB7IHRocm93IG5ldyBFcnJvcihpbmZsYXRlLmVycik7IH1cbiAqXG4gKiBjb25zb2xlLmxvZyhpbmZsYXRlLnJlc3VsdCk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIEluZmxhdGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSW5mbGF0ZSkpIHJldHVybiBuZXcgSW5mbGF0ZShvcHRpb25zKTtcblxuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oe1xuICAgIGNodW5rU2l6ZTogMTYzODQsXG4gICAgd2luZG93Qml0czogMCxcbiAgICB0bzogJydcbiAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIG9wdCA9IHRoaXMub3B0aW9ucztcblxuICAvLyBGb3JjZSB3aW5kb3cgc2l6ZSBmb3IgYHJhd2AgZGF0YSwgaWYgbm90IHNldCBkaXJlY3RseSxcbiAgLy8gYmVjYXVzZSB3ZSBoYXZlIG5vIGhlYWRlciBmb3IgYXV0b2RldGVjdC5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICAgIGlmIChvcHQud2luZG93Qml0cyA9PT0gMCkgeyBvcHQud2luZG93Qml0cyA9IC0xNTsgfVxuICB9XG5cbiAgLy8gSWYgYHdpbmRvd0JpdHNgIG5vdCBkZWZpbmVkIChhbmQgbW9kZSBub3QgcmF3KSAtIHNldCBhdXRvZGV0ZWN0IGZsYWcgZm9yIGd6aXAvZGVmbGF0ZVxuICBpZiAoKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSAmJlxuICAgICAgIShvcHRpb25zICYmIG9wdGlvbnMud2luZG93Qml0cykpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAzMjtcbiAgfVxuXG4gIC8vIEd6aXAgaGVhZGVyIGhhcyBubyBpbmZvIGFib3V0IHdpbmRvd3Mgc2l6ZSwgd2UgY2FuIGRvIGF1dG9kZXRlY3Qgb25seVxuICAvLyBmb3IgZGVmbGF0ZS4gU28sIGlmIHdpbmRvdyBzaXplIG5vdCBzZXQsIGZvcmNlIGl0IHRvIG1heCB3aGVuIGd6aXAgcG9zc2libGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+IDE1KSAmJiAob3B0LndpbmRvd0JpdHMgPCA0OCkpIHtcbiAgICAvLyBiaXQgMyAoMTYpIC0+IGd6aXBwZWQgZGF0YVxuICAgIC8vIGJpdCA0ICgzMikgLT4gYXV0b2RldGVjdCBnemlwL2RlZmxhdGVcbiAgICBpZiAoKG9wdC53aW5kb3dCaXRzICYgMTUpID09PSAwKSB7XG4gICAgICBvcHQud2luZG93Qml0cyB8PSAxNTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gICA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgID0gemxpYl9pbmZsYXRlLmluZmxhdGVJbml0MihcbiAgICB0aGlzLnN0cm0sXG4gICAgb3B0LndpbmRvd0JpdHNcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICB9XG5cbiAgdGhpcy5oZWFkZXIgPSBuZXcgR1poZWFkZXIoKTtcblxuICB6bGliX2luZmxhdGUuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sIHRoaXMuaGVhZGVyKTtcbn1cblxuLyoqXG4gKiBJbmZsYXRlI3B1c2goZGF0YVssIG1vZGVdKSAtPiBCb29sZWFuXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8QXJyYXlCdWZmZXJ8U3RyaW5nKTogaW5wdXQgZGF0YVxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zIFpfRklOSVNILlxuICpcbiAqIFNlbmRzIGlucHV0IGRhdGEgdG8gaW5mbGF0ZSBwaXBlLCBnZW5lcmF0aW5nIFtbSW5mbGF0ZSNvbkRhdGFdXSBjYWxscyB3aXRoXG4gKiBuZXcgb3V0cHV0IGNodW5rcy4gUmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4gVGhlIGxhc3QgZGF0YSBibG9jayBtdXN0IGhhdmVcbiAqIG1vZGUgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgd2lsbCBmbHVzaCBpbnRlcm5hbCBwZW5kaW5nIGJ1ZmZlcnMgYW5kIGNhbGxcbiAqIFtbSW5mbGF0ZSNvbkVuZF1dLiBGb3IgaW50ZXJpbSBleHBsaWNpdCBmbHVzaGVzICh3aXRob3V0IGVuZGluZyB0aGUgc3RyZWFtKSB5b3VcbiAqIGNhbiB1c2UgbW9kZSBaX1NZTkNfRkxVU0gsIGtlZXBpbmcgdGhlIGRlY29tcHJlc3Npb24gY29udGV4dC5cbiAqXG4gKiBPbiBmYWlsIGNhbGwgW1tJbmZsYXRlI29uRW5kXV0gd2l0aCBlcnJvciBjb2RlIGFuZCByZXR1cm4gZmFsc2UuXG4gKlxuICogV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRvIHVzZSBgVWludDhBcnJheWAgb24gaW5wdXQgZm9yIGJlc3Qgc3BlZWQgKG91dHB1dFxuICogZm9ybWF0IGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkpLiBBbHNvLCBkb24ndCBza2lwIGxhc3QgcGFyYW0gYW5kIGFsd2F5c1xuICogdXNlIHRoZSBzYW1lIHR5cGUgaW4geW91ciBjb2RlIChib29sZWFuIG9yIG51bWJlcikuIFRoYXQgd2lsbCBpbXByb3ZlIEpTIHNwZWVkLlxuICpcbiAqIEZvciByZWd1bGFyIGBBcnJheWAtcyBtYWtlIHN1cmUgYWxsIGVsZW1lbnRzIGFyZSBbMC4uMjU1XS5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcHVzaChjaHVuaywgZmFsc2UpOyAvLyBwdXNoIG9uZSBvZiBkYXRhIGNodW5rc1xuICogLi4uXG4gKiBwdXNoKGNodW5rLCB0cnVlKTsgIC8vIHB1c2ggbGFzdCBjaHVua1xuICogYGBgXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGRhdGEsIG1vZGUpIHtcbiAgdmFyIHN0cm0gPSB0aGlzLnN0cm07XG4gIHZhciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplO1xuICB2YXIgZGljdGlvbmFyeSA9IHRoaXMub3B0aW9ucy5kaWN0aW9uYXJ5O1xuICB2YXIgc3RhdHVzLCBfbW9kZTtcbiAgdmFyIG5leHRfb3V0X3V0ZjgsIHRhaWwsIHV0ZjhzdHI7XG4gIHZhciBkaWN0O1xuXG4gIC8vIEZsYWcgdG8gcHJvcGVybHkgcHJvY2VzcyBaX0JVRl9FUlJPUiBvbiB0ZXN0aW5nIGluZmxhdGUgY2FsbFxuICAvLyB3aGVuIHdlIGNoZWNrIHRoYXQgYWxsIG91dHB1dCBkYXRhIHdhcyBmbHVzaGVkLlxuICB2YXIgYWxsb3dCdWZFcnJvciA9IGZhbHNlO1xuXG4gIGlmICh0aGlzLmVuZGVkKSB7IHJldHVybiBmYWxzZTsgfVxuICBfbW9kZSA9IChtb2RlID09PSB+fm1vZGUpID8gbW9kZSA6ICgobW9kZSA9PT0gdHJ1ZSkgPyBjLlpfRklOSVNIIDogYy5aX05PX0ZMVVNIKTtcblxuICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBPbmx5IGJpbmFyeSBzdHJpbmdzIGNhbiBiZSBkZWNvbXByZXNzZWQgb24gcHJhY3RpY2VcbiAgICBzdHJtLmlucHV0ID0gc3RyaW5ncy5iaW5zdHJpbmcyYnVmKGRhdGEpO1xuICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGF0YSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICBzdHJtLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgc3RybS5pbnB1dCA9IGRhdGE7XG4gIH1cblxuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmF2YWlsX2luID0gc3RybS5pbnB1dC5sZW5ndGg7XG5cbiAgZG8ge1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgc3RybS5vdXRwdXQgPSBuZXcgdXRpbHMuQnVmOChjaHVua1NpemUpO1xuICAgICAgc3RybS5uZXh0X291dCA9IDA7XG4gICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZShzdHJtLCBjLlpfTk9fRkxVU0gpOyAgICAvKiBubyBiYWQgcmV0dXJuIHZhbHVlICovXG5cbiAgICBpZiAoc3RhdHVzID09PSBjLlpfTkVFRF9ESUNUICYmIGRpY3Rpb25hcnkpIHtcbiAgICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgICAgIGlmICh0eXBlb2YgZGljdGlvbmFyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGljdCA9IHN0cmluZ3Muc3RyaW5nMmJ1ZihkaWN0aW9uYXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkaWN0aW9uYXJ5KSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgICAgICBkaWN0ID0gbmV3IFVpbnQ4QXJyYXkoZGljdGlvbmFyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaWN0ID0gZGljdGlvbmFyeTtcbiAgICAgIH1cblxuICAgICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgZGljdCk7XG5cbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSBjLlpfQlVGX0VSUk9SICYmIGFsbG93QnVmRXJyb3IgPT09IHRydWUpIHtcbiAgICAgIHN0YXR1cyA9IGMuWl9PSztcbiAgICAgIGFsbG93QnVmRXJyb3IgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzICE9PSBjLlpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IGMuWl9PSykge1xuICAgICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0cm0ubmV4dF9vdXQpIHtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCB8fCBzdGF0dXMgPT09IGMuWl9TVFJFQU1fRU5EIHx8IChzdHJtLmF2YWlsX2luID09PSAwICYmIChfbW9kZSA9PT0gYy5aX0ZJTklTSCB8fCBfbW9kZSA9PT0gYy5aX1NZTkNfRkxVU0gpKSkge1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG5cbiAgICAgICAgICBuZXh0X291dF91dGY4ID0gc3RyaW5ncy51dGY4Ym9yZGVyKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KTtcblxuICAgICAgICAgIHRhaWwgPSBzdHJtLm5leHRfb3V0IC0gbmV4dF9vdXRfdXRmODtcbiAgICAgICAgICB1dGY4c3RyID0gc3RyaW5ncy5idWYyc3RyaW5nKHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4KTtcblxuICAgICAgICAgIC8vIG1vdmUgdGFpbFxuICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSB0YWlsO1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplIC0gdGFpbDtcbiAgICAgICAgICBpZiAodGFpbCkgeyB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgc3RybS5vdXRwdXQsIG5leHRfb3V0X3V0ZjgsIHRhaWwsIDApOyB9XG5cbiAgICAgICAgICB0aGlzLm9uRGF0YSh1dGY4c3RyKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub25EYXRhKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2hlbiBubyBtb3JlIGlucHV0IGRhdGEsIHdlIHNob3VsZCBjaGVjayB0aGF0IGludGVybmFsIGluZmxhdGUgYnVmZmVyc1xuICAgIC8vIGFyZSBmbHVzaGVkLiBUaGUgb25seSB3YXkgdG8gZG8gaXQgd2hlbiBhdmFpbF9vdXQgPSAwIC0gcnVuIG9uZSBtb3JlXG4gICAgLy8gaW5mbGF0ZSBwYXNzLiBCdXQgaWYgb3V0cHV0IGRhdGEgbm90IGV4aXN0cywgaW5mbGF0ZSByZXR1cm4gWl9CVUZfRVJST1IuXG4gICAgLy8gSGVyZSB3ZSBzZXQgZmxhZyB0byBwcm9jZXNzIHRoaXMgZXJyb3IgcHJvcGVybHkuXG4gICAgLy9cbiAgICAvLyBOT1RFLiBEZWZsYXRlIGRvZXMgbm90IHJldHVybiBlcnJvciBpbiB0aGlzIGNhc2UgYW5kIGRvZXMgbm90IG5lZWRzIHN1Y2hcbiAgICAvLyBsb2dpYy5cbiAgICBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiBzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgYWxsb3dCdWZFcnJvciA9IHRydWU7XG4gICAgfVxuXG4gIH0gd2hpbGUgKChzdHJtLmF2YWlsX2luID4gMCB8fCBzdHJtLmF2YWlsX291dCA9PT0gMCkgJiYgc3RhdHVzICE9PSBjLlpfU1RSRUFNX0VORCk7XG5cbiAgaWYgKHN0YXR1cyA9PT0gYy5aX1NUUkVBTV9FTkQpIHtcbiAgICBfbW9kZSA9IGMuWl9GSU5JU0g7XG4gIH1cblxuICAvLyBGaW5hbGl6ZSBvbiB0aGUgbGFzdCBjaHVuay5cbiAgaWYgKF9tb2RlID09PSBjLlpfRklOSVNIKSB7XG4gICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gYy5aX09LO1xuICB9XG5cbiAgLy8gY2FsbGJhY2sgaW50ZXJpbSByZXN1bHRzIGlmIFpfU1lOQ19GTFVTSC5cbiAgaWYgKF9tb2RlID09PSBjLlpfU1lOQ19GTFVTSCkge1xuICAgIHRoaXMub25FbmQoYy5aX09LKTtcbiAgICBzdHJtLmF2YWlsX291dCA9IDA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBJbmZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBvdXRwdXQgZGF0YS4gVHlwZSBvZiBhcnJheSBkZXBlbmRzXG4gKiAgIG9uIGpzIGVuZ2luZSBzdXBwb3J0LiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLCBlYWNoIGNodW5rXG4gKiAgIHdpbGwgYmUgc3RyaW5nLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHN0b3JlcyBkYXRhIGJsb2NrcyBpbiBgY2h1bmtzW11gIHByb3BlcnR5IGFuZCBnbHVlXG4gKiB0aG9zZSBpbiBgb25FbmRgLiBPdmVycmlkZSB0aGlzIGhhbmRsZXIsIGlmIHlvdSBuZWVkIGFub3RoZXIgYmVoYXZpb3VyLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25FbmQoc3RhdHVzKSAtPiBWb2lkXG4gKiAtIHN0YXR1cyAoTnVtYmVyKTogaW5mbGF0ZSBzdGF0dXMuIDAgKFpfT0spIG9uIHN1Y2Nlc3MsXG4gKiAgIG90aGVyIGlmIG5vdC5cbiAqXG4gKiBDYWxsZWQgZWl0aGVyIGFmdGVyIHlvdSB0ZWxsIGluZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpIG9yIHNob3VsZCBiZSBmbHVzaGVkIChaX1NZTkNfRkxVU0gpXG4gKiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcyxcbiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgLy8gT24gc3VjY2VzcyAtIGpvaW5cbiAgaWYgKHN0YXR1cyA9PT0gYy5aX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIEdsdWUgJiBjb252ZXJ0IGhlcmUsIHVudGlsIHdlIHRlYWNoIHBha28gdG8gc2VuZFxuICAgICAgLy8gdXRmOCBhbGlnbmVkIHN0cmluZ3MgdG8gb25EYXRhXG4gICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY2h1bmtzLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHV0aWxzLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpO1xuICAgIH1cbiAgfVxuICB0aGlzLmNodW5rcyA9IFtdO1xuICB0aGlzLmVyciA9IHN0YXR1cztcbiAgdGhpcy5tc2cgPSB0aGlzLnN0cm0ubXNnO1xufTtcblxuXG4vKipcbiAqIGluZmxhdGUoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogRGVjb21wcmVzcyBgZGF0YWAgd2l0aCBpbmZsYXRlL3VuZ3ppcCBhbmQgYG9wdGlvbnNgLiBBdXRvZGV0ZWN0XG4gKiBmb3JtYXQgdmlhIHdyYXBwZXIgaGVhZGVyIGJ5IGRlZmF1bHQuIFRoYXQncyB3aHkgd2UgZG9uJ3QgcHJvdmlkZVxuICogc2VwYXJhdGUgYHVuZ3ppcGAgbWV0aG9kLlxuICpcbiAqIFN1cHBvcnRlZCBvcHRpb25zIGFyZTpcbiAqXG4gKiAtIHdpbmRvd0JpdHNcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBTdWdhciAob3B0aW9ucyk6XG4gKlxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeVxuICogICBuZWdhdGl2ZSB3aW5kb3dCaXRzIGltcGxpY2l0bHkuXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBjb252ZXJ0ZWRcbiAqICAgZnJvbSB1dGY4IHRvIHV0ZjE2IChqYXZhc2NyaXB0KSBzdHJpbmcuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsXG4gKiAgIGNodW5rIGxlbmd0aCBjYW4gZGlmZmVyIGZyb20gYGNodW5rU2l6ZWAsIGRlcGVuZGluZyBvbiBjb250ZW50LlxuICpcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgaW5wdXQgPSBwYWtvLmRlZmxhdGUoWzEsMiwzLDQsNSw2LDcsOCw5XSlcbiAqICAgLCBvdXRwdXQ7XG4gKlxuICogdHJ5IHtcbiAqICAgb3V0cHV0ID0gcGFrby5pbmZsYXRlKGlucHV0KTtcbiAqIH0gY2F0Y2ggKGVycilcbiAqICAgY29uc29sZS5sb2coZXJyKTtcbiAqIH1cbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gaW5mbGF0ZShpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgaW5mbGF0b3IgPSBuZXcgSW5mbGF0ZShvcHRpb25zKTtcblxuICBpbmZsYXRvci5wdXNoKGlucHV0LCB0cnVlKTtcblxuICAvLyBUaGF0IHdpbGwgbmV2ZXIgaGFwcGVucywgaWYgeW91IGRvbid0IGNoZWF0IHdpdGggb3B0aW9ucyA6KVxuICBpZiAoaW5mbGF0b3IuZXJyKSB7IHRocm93IGluZmxhdG9yLm1zZyB8fCBtc2dbaW5mbGF0b3IuZXJyXTsgfVxuXG4gIHJldHVybiBpbmZsYXRvci5yZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBpbmZsYXRlUmF3KGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbaW5mbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyXG4gKiAoaGVhZGVyIGFuZCBhZGxlcjMyIGNyYykuXG4gKiovXG5mdW5jdGlvbiBpbmZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIHVuZ3ppcChkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBKdXN0IHNob3J0Y3V0IHRvIFtbaW5mbGF0ZV1dLCBiZWNhdXNlIGl0IGF1dG9kZXRlY3RzIGZvcm1hdFxuICogYnkgaGVhZGVyLmNvbnRlbnQuIERvbmUgZm9yIGNvbnZlbmllbmNlLlxuICoqL1xuXG5cbmV4cG9ydHMuSW5mbGF0ZSA9IEluZmxhdGU7XG5leHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlUmF3ID0gaW5mbGF0ZVJhdztcbmV4cG9ydHMudW5nemlwICA9IGluZmxhdGU7XG5cbn0se1wiLi91dGlscy9jb21tb25cIjozMDQsXCIuL3V0aWxzL3N0cmluZ3NcIjozMDUsXCIuL3psaWIvY29uc3RhbnRzXCI6MzA3LFwiLi96bGliL2d6aGVhZGVyXCI6MzEwLFwiLi96bGliL2luZmxhdGVcIjozMTIsXCIuL3psaWIvbWVzc2FnZXNcIjozMTQsXCIuL3psaWIvenN0cmVhbVwiOjMxNn1dLDMwNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFRZUEVEX09LID0gICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBVaW50MTZBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyk7XG5cbmZ1bmN0aW9uIF9oYXMob2JqLCBrZXkpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG59XG5cbmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24gKG9iaiAvKmZyb20xLCBmcm9tMiwgZnJvbTMsIC4uLiovKSB7XG4gIHZhciBzb3VyY2VzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgd2hpbGUgKHNvdXJjZXMubGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTtcbiAgICBpZiAoIXNvdXJjZSkgeyBjb250aW51ZTsgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICdtdXN0IGJlIG5vbi1vYmplY3QnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwIGluIHNvdXJjZSkge1xuICAgICAgaWYgKF9oYXMoc291cmNlLCBwKSkge1xuICAgICAgICBvYmpbcF0gPSBzb3VyY2VbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cblxuLy8gcmVkdWNlIGJ1ZmZlciBzaXplLCBhdm9pZGluZyBtZW0gY29weVxuZXhwb3J0cy5zaHJpbmtCdWYgPSBmdW5jdGlvbiAoYnVmLCBzaXplKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBzaXplKSB7IHJldHVybiBidWY7IH1cbiAgaWYgKGJ1Zi5zdWJhcnJheSkgeyByZXR1cm4gYnVmLnN1YmFycmF5KDAsIHNpemUpOyB9XG4gIGJ1Zi5sZW5ndGggPSBzaXplO1xuICByZXR1cm4gYnVmO1xufTtcblxuXG52YXIgZm5UeXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGlmIChzcmMuc3ViYXJyYXkgJiYgZGVzdC5zdWJhcnJheSkge1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY19vZmZzLCBzcmNfb2ZmcyArIGxlbiksIGRlc3Rfb2Zmcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG9yZGluYXJ5IGFycmF5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgdmFyIGksIGwsIGxlbiwgcG9zLCBjaHVuaywgcmVzdWx0O1xuXG4gICAgLy8gY2FsY3VsYXRlIGRhdGEgbGVuZ3RoXG4gICAgbGVuID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbGVuICs9IGNodW5rc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gam9pbiBjaHVua3NcbiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIHBvcyA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgcmVzdWx0LnNldChjaHVuaywgcG9zKTtcbiAgICAgIHBvcyArPSBjaHVuay5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGZuVW50eXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGNodW5rcyk7XG4gIH1cbn07XG5cblxuLy8gRW5hYmxlL0Rpc2FibGUgdHlwZWQgYXJyYXlzIHVzZSwgZm9yIHRlc3Rpbmdcbi8vXG5leHBvcnRzLnNldFR5cGVkID0gZnVuY3Rpb24gKG9uKSB7XG4gIGlmIChvbikge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBVaW50OEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBVaW50MTZBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gSW50MzJBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblR5cGVkKTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblVudHlwZWQpO1xuICB9XG59O1xuXG5leHBvcnRzLnNldFR5cGVkKFRZUEVEX09LKTtcblxufSx7fV0sMzA1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIFN0cmluZyBlbmNvZGUvZGVjb2RlIGhlbHBlcnNcbid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgPSBfZGVyZXFfKCcuL2NvbW1vbicpO1xuXG5cbi8vIFF1aWNrIGNoZWNrIGlmIHdlIGNhbiB1c2UgZmFzdCBhcnJheSB0byBiaW4gc3RyaW5nIGNvbnZlcnNpb25cbi8vXG4vLyAtIGFwcGx5KEFycmF5KSBjYW4gZmFpbCBvbiBBbmRyb2lkIDIuMlxuLy8gLSBhcHBseShVaW50OEFycmF5KSBjYW4gZmFpbCBvbiBpT1MgNS4xIFNhZmFyaVxuLy9cbnZhciBTVFJfQVBQTFlfT0sgPSB0cnVlO1xudmFyIFNUUl9BUFBMWV9VSUFfT0sgPSB0cnVlO1xuXG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFsgMCBdKTsgfSBjYXRjaCAoX18pIHsgU1RSX0FQUExZX09LID0gZmFsc2U7IH1cbnRyeSB7IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoMSkpOyB9IGNhdGNoIChfXykgeyBTVFJfQVBQTFlfVUlBX09LID0gZmFsc2U7IH1cblxuXG4vLyBUYWJsZSB3aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKVxuLy8gTm90ZSwgdGhhdCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsXG4vLyBiZWNhdXNlIG1heCBwb3NzaWJsZSBjb2RlcG9pbnQgaXMgMHgxMGZmZmZcbnZhciBfdXRmOGxlbiA9IG5ldyB1dGlscy5CdWY4KDI1Nik7XG5mb3IgKHZhciBxID0gMDsgcSA8IDI1NjsgcSsrKSB7XG4gIF91dGY4bGVuW3FdID0gKHEgPj0gMjUyID8gNiA6IHEgPj0gMjQ4ID8gNSA6IHEgPj0gMjQwID8gNCA6IHEgPj0gMjI0ID8gMyA6IHEgPj0gMTkyID8gMiA6IDEpO1xufVxuX3V0ZjhsZW5bMjU0XSA9IF91dGY4bGVuWzI1NF0gPSAxOyAvLyBJbnZhbGlkIHNlcXVlbmNlIHN0YXJ0XG5cblxuLy8gY29udmVydCBzdHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmLCBjLCBjMiwgbV9wb3MsIGksIHN0cl9sZW4gPSBzdHIubGVuZ3RoLCBidWZfbGVuID0gMDtcblxuICAvLyBjb3VudCBiaW5hcnkgc2l6ZVxuICBmb3IgKG1fcG9zID0gMDsgbV9wb3MgPCBzdHJfbGVuOyBtX3BvcysrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zICsgMSA8IHN0cl9sZW4pKSB7XG4gICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zICsgMSk7XG4gICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICBtX3BvcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBidWZfbGVuICs9IGMgPCAweDgwID8gMSA6IGMgPCAweDgwMCA/IDIgOiBjIDwgMHgxMDAwMCA/IDMgOiA0O1xuICB9XG5cbiAgLy8gYWxsb2NhdGUgYnVmZmVyXG4gIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KGJ1Zl9sZW4pO1xuXG4gIC8vIGNvbnZlcnRcbiAgZm9yIChpID0gMCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAvKiBvbmUgYnl0ZSAqL1xuICAgICAgYnVmW2krK10gPSBjO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAvKiB0d28gYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhDMCB8IChjID4+PiA2KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogZm91ciBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweGYwIHwgKGMgPj4+IDE4KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiAxMiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIEhlbHBlciAodXNlZCBpbiAyIHBsYWNlcylcbmZ1bmN0aW9uIGJ1ZjJiaW5zdHJpbmcoYnVmLCBsZW4pIHtcbiAgLy8gdXNlIGZhbGxiYWNrIGZvciBiaWcgYXJyYXlzIHRvIGF2b2lkIHN0YWNrIG92ZXJmbG93XG4gIGlmIChsZW4gPCA2NTUzNykge1xuICAgIGlmICgoYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9VSUFfT0spIHx8ICghYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9PSykpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHV0aWxzLnNocmlua0J1ZihidWYsIGxlbikpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vLyBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gYmluYXJ5IHN0cmluZ1xuZXhwb3J0cy5idWYyYmluc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICByZXR1cm4gYnVmMmJpbnN0cmluZyhidWYsIGJ1Zi5sZW5ndGgpO1xufTtcblxuXG4vLyBDb252ZXJ0IGJpbmFyeSBzdHJpbmcgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5iaW5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmID0gbmV3IHV0aWxzLkJ1Zjgoc3RyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBidWZbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnVmO1xufTtcblxuXG4vLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZ1xuZXhwb3J0cy5idWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1ZiwgbWF4KSB7XG4gIHZhciBpLCBvdXQsIGMsIGNfbGVuO1xuICB2YXIgbGVuID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG5cbiAgLy8gUmVzZXJ2ZSBtYXggcG9zc2libGUgbGVuZ3RoICgyIHdvcmRzIHBlciBjaGFyKVxuICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3JcbiAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgdmFyIHV0ZjE2YnVmID0gbmV3IEFycmF5KGxlbiAqIDIpO1xuXG4gIGZvciAob3V0ID0gMCwgaSA9IDA7IGkgPCBsZW47KSB7XG4gICAgYyA9IGJ1ZltpKytdO1xuICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0KytdID0gYzsgY29udGludWU7IH1cblxuICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4gLSAxOyBjb250aW51ZTsgfVxuXG4gICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgYyAmPSBjX2xlbiA9PT0gMiA/IDB4MWYgOiBjX2xlbiA9PT0gMyA/IDB4MGYgOiAweDA3O1xuICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgY19sZW4tLTtcbiAgICB9XG5cbiAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTtcbn07XG5cblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbmV4cG9ydHMudXRmOGJvcmRlciA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgcG9zO1xuXG4gIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICBpZiAobWF4ID4gYnVmLmxlbmd0aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9XG5cbiAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gIHBvcyA9IG1heCAtIDE7XG4gIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gIC8vIFZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSxcbiAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAtIHRoYXQgbWVhbnMgYnVmZmVyIGlzIHRvbyBzbWFsbCxcbiAgLy8gcmV0dXJuIG1heCB0b28uXG4gIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gIHJldHVybiAocG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4KSA/IHBvcyA6IG1heDtcbn07XG5cbn0se1wiLi9jb21tb25cIjozMDR9XSwzMDY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiBhZGxlcjMyIHRha2VzIDEyJSBmb3IgbGV2ZWwgMCBhbmQgMiUgZm9yIGxldmVsIDYuXG4vLyBJdCBpc24ndCB3b3J0aCBpdCB0byBtYWtlIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBhcyBpbiBvcmlnaW5hbC5cbi8vIFNtYWxsIHNpemUgaXMgcHJlZmVyYWJsZS5cblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5mdW5jdGlvbiBhZGxlcjMyKGFkbGVyLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciBzMSA9IChhZGxlciAmIDB4ZmZmZikgfDAsXG4gICAgICBzMiA9ICgoYWRsZXIgPj4+IDE2KSAmIDB4ZmZmZikgfDAsXG4gICAgICBuID0gMDtcblxuICB3aGlsZSAobGVuICE9PSAwKSB7XG4gICAgLy8gU2V0IGxpbWl0IH4gdHdpY2UgbGVzcyB0aGFuIDU1NTIsIHRvIGtlZXBcbiAgICAvLyBzMiBpbiAzMS1iaXRzLCBiZWNhdXNlIHdlIGZvcmNlIHNpZ25lZCBpbnRzLlxuICAgIC8vIGluIG90aGVyIGNhc2UgJT0gd2lsbCBmYWlsLlxuICAgIG4gPSBsZW4gPiAyMDAwID8gMjAwMCA6IGxlbjtcbiAgICBsZW4gLT0gbjtcblxuICAgIGRvIHtcbiAgICAgIHMxID0gKHMxICsgYnVmW3BvcysrXSkgfDA7XG4gICAgICBzMiA9IChzMiArIHMxKSB8MDtcbiAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgczEgJT0gNjU1MjE7XG4gICAgczIgJT0gNjU1MjE7XG4gIH1cblxuICByZXR1cm4gKHMxIHwgKHMyIDw8IDE2KSkgfDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBhZGxlcjMyO1xuXG59LHt9XSwzMDc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbiAgWl9OT19GTFVTSDogICAgICAgICAwLFxuICBaX1BBUlRJQUxfRkxVU0g6ICAgIDEsXG4gIFpfU1lOQ19GTFVTSDogICAgICAgMixcbiAgWl9GVUxMX0ZMVVNIOiAgICAgICAzLFxuICBaX0ZJTklTSDogICAgICAgICAgIDQsXG4gIFpfQkxPQ0s6ICAgICAgICAgICAgNSxcbiAgWl9UUkVFUzogICAgICAgICAgICA2LFxuXG4gIC8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAgKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gICovXG4gIFpfT0s6ICAgICAgICAgICAgICAgMCxcbiAgWl9TVFJFQU1fRU5EOiAgICAgICAxLFxuICBaX05FRURfRElDVDogICAgICAgIDIsXG4gIFpfRVJSTk86ICAgICAgICAgICAtMSxcbiAgWl9TVFJFQU1fRVJST1I6ICAgIC0yLFxuICBaX0RBVEFfRVJST1I6ICAgICAgLTMsXG4gIC8vWl9NRU1fRVJST1I6ICAgICAtNCxcbiAgWl9CVUZfRVJST1I6ICAgICAgIC01LFxuICAvL1pfVkVSU0lPTl9FUlJPUjogLTYsXG5cbiAgLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4gIFpfTk9fQ09NUFJFU1NJT046ICAgICAgICAgMCxcbiAgWl9CRVNUX1NQRUVEOiAgICAgICAgICAgICAxLFxuICBaX0JFU1RfQ09NUFJFU1NJT046ICAgICAgIDksXG4gIFpfREVGQVVMVF9DT01QUkVTU0lPTjogICAtMSxcblxuXG4gIFpfRklMVEVSRUQ6ICAgICAgICAgICAgICAgMSxcbiAgWl9IVUZGTUFOX09OTFk6ICAgICAgICAgICAyLFxuICBaX1JMRTogICAgICAgICAgICAgICAgICAgIDMsXG4gIFpfRklYRUQ6ICAgICAgICAgICAgICAgICAgNCxcbiAgWl9ERUZBVUxUX1NUUkFURUdZOiAgICAgICAwLFxuXG4gIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbiAgWl9CSU5BUlk6ICAgICAgICAgICAgICAgICAwLFxuICBaX1RFWFQ6ICAgICAgICAgICAgICAgICAgIDEsXG4gIC8vWl9BU0NJSTogICAgICAgICAgICAgICAgMSwgLy8gPSBaX1RFWFQgKGRlcHJlY2F0ZWQpXG4gIFpfVU5LTk9XTjogICAgICAgICAgICAgICAgMixcblxuICAvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbiAgWl9ERUZMQVRFRDogICAgICAgICAgICAgICA4XG4gIC8vWl9OVUxMOiAgICAgICAgICAgICAgICAgbnVsbCAvLyBVc2UgLTEgb3IgbnVsbCBpbmxpbmUsIGRlcGVuZGluZyBvbiB2YXIgdHlwZVxufTtcblxufSx7fV0sMzA4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogd2UgY2FuJ3QgZ2V0IHNpZ25pZmljYW50IHNwZWVkIGJvb3N0IGhlcmUuXG4vLyBTbyB3cml0ZSBjb2RlIHRvIG1pbmltaXplIHNpemUgLSBubyBwcmVnZW5lcmF0ZWQgdGFibGVzXG4vLyBhbmQgYXJyYXkgdG9vbHMgZGVwZW5kZW5jaWVzLlxuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgMjU2OyBuKyspIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IDg7IGsrKykge1xuICAgICAgYyA9ICgoYyAmIDEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciB0ID0gY3JjVGFibGUsXG4gICAgICBlbmQgPSBwb3MgKyBsZW47XG5cbiAgY3JjIF49IC0xO1xuXG4gIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKykge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjcmMzMjtcblxufSx7fV0sMzA5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgdXRpbHMgICA9IF9kZXJlcV8oJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIHRyZWVzICAgPSBfZGVyZXFfKCcuL3RyZWVzJyk7XG52YXIgYWRsZXIzMiA9IF9kZXJlcV8oJy4vYWRsZXIzMicpO1xudmFyIGNyYzMyICAgPSBfZGVyZXFfKCcuL2NyYzMyJyk7XG52YXIgbXNnICAgICA9IF9kZXJlcV8oJy4vbWVzc2FnZXMnKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9QQVJUSUFMX0ZMVVNIID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG52YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG4vL3ZhciBaX1RSRUVTICAgICAgICAgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbi8vdmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbi8vdmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cblxuLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4vL3ZhciBaX05PX0NPTVBSRVNTSU9OICAgICAgPSAwO1xuLy92YXIgWl9CRVNUX1NQRUVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfQkVTVF9DT01QUkVTU0lPTiAgICA9IDk7XG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cblxudmFyIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7XG52YXIgWl9IVUZGTUFOX09OTFkgICAgICAgID0gMjtcbnZhciBaX1JMRSAgICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuLy92YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDtcbi8vdmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbnZhciBNQVhfTUVNX0xFVkVMID0gOTtcbi8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqL1xudmFyIE1BWF9XQklUUyA9IDE1O1xuLyogMzJLIExaNzcgd2luZG93ICovXG52YXIgREVGX01FTV9MRVZFTCA9IDg7XG5cblxudmFyIExFTkdUSF9DT0RFUyAgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG52YXIgRF9DT0RFUyAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG52YXIgTUFYX0JJVFMgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIE1JTl9NQVRDSCA9IDM7XG52YXIgTUFYX01BVENIID0gMjU4O1xudmFyIE1JTl9MT09LQUhFQUQgPSAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSk7XG5cbnZhciBQUkVTRVRfRElDVCA9IDB4MjA7XG5cbnZhciBJTklUX1NUQVRFID0gNDI7XG52YXIgRVhUUkFfU1RBVEUgPSA2OTtcbnZhciBOQU1FX1NUQVRFID0gNzM7XG52YXIgQ09NTUVOVF9TVEFURSA9IDkxO1xudmFyIEhDUkNfU1RBVEUgPSAxMDM7XG52YXIgQlVTWV9TVEFURSA9IDExMztcbnZhciBGSU5JU0hfU1RBVEUgPSA2NjY7XG5cbnZhciBCU19ORUVEX01PUkUgICAgICA9IDE7IC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqL1xudmFyIEJTX0JMT0NLX0RPTkUgICAgID0gMjsgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovXG52YXIgQlNfRklOSVNIX1NUQVJURUQgPSAzOyAvKiBmaW5pc2ggc3RhcnRlZCwgbmVlZCBvbmx5IG1vcmUgb3V0cHV0IGF0IG5leHQgZGVmbGF0ZSAqL1xudmFyIEJTX0ZJTklTSF9ET05FICAgID0gNDsgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqL1xuXG52YXIgT1NfQ09ERSA9IDB4MDM7IC8vIFVuaXggOikgLiBEb24ndCBkZXRlY3QsIHVzZSB0aGlzIGRlZmF1bHQuXG5cbmZ1bmN0aW9uIGVycihzdHJtLCBlcnJvckNvZGUpIHtcbiAgc3RybS5tc2cgPSBtc2dbZXJyb3JDb2RlXTtcbiAgcmV0dXJuIGVycm9yQ29kZTtcbn1cblxuZnVuY3Rpb24gcmFuayhmKSB7XG4gIHJldHVybiAoKGYpIDw8IDEpIC0gKChmKSA+IDQgPyA5IDogMCk7XG59XG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXNcbiAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXRcbiAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5vdXRwdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuXG4gKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSkge1xuICB2YXIgcyA9IHN0cm0uc3RhdGU7XG5cbiAgLy9fdHJfZmx1c2hfYml0cyhzKTtcbiAgdmFyIGxlbiA9IHMucGVuZGluZztcbiAgaWYgKGxlbiA+IHN0cm0uYXZhaWxfb3V0KSB7XG4gICAgbGVuID0gc3RybS5hdmFpbF9vdXQ7XG4gIH1cbiAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm47IH1cblxuICB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nX291dCwgbGVuLCBzdHJtLm5leHRfb3V0KTtcbiAgc3RybS5uZXh0X291dCArPSBsZW47XG4gIHMucGVuZGluZ19vdXQgKz0gbGVuO1xuICBzdHJtLnRvdGFsX291dCArPSBsZW47XG4gIHN0cm0uYXZhaWxfb3V0IC09IGxlbjtcbiAgcy5wZW5kaW5nIC09IGxlbjtcbiAgaWYgKHMucGVuZGluZyA9PT0gMCkge1xuICAgIHMucGVuZGluZ19vdXQgPSAwO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZmx1c2hfYmxvY2tfb25seShzLCBsYXN0KSB7XG4gIHRyZWVzLl90cl9mbHVzaF9ibG9jayhzLCAocy5ibG9ja19zdGFydCA+PSAwID8gcy5ibG9ja19zdGFydCA6IC0xKSwgcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQsIGxhc3QpO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgZmx1c2hfcGVuZGluZyhzLnN0cm0pO1xufVxuXG5cbmZ1bmN0aW9uIHB1dF9ieXRlKHMsIGIpIHtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluXG4gKiBwZW5kaW5nX2J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0U2hvcnRNU0IocywgYikge1xuLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiID4+IDgpKTtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiAmIDB4ZmYpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAoYiA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGIgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMlxuICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2hcbiAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkXG4gKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+aW5wdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGZyb20gaXQuXG4gKiAoU2VlIGFsc28gZmx1c2hfcGVuZGluZygpKS5cbiAqL1xuZnVuY3Rpb24gcmVhZF9idWYoc3RybSwgYnVmLCBzdGFydCwgc2l6ZSkge1xuICB2YXIgbGVuID0gc3RybS5hdmFpbF9pbjtcblxuICBpZiAobGVuID4gc2l6ZSkgeyBsZW4gPSBzaXplOyB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuIDA7IH1cblxuICBzdHJtLmF2YWlsX2luIC09IGxlbjtcblxuICAvLyB6bWVtY3B5KGJ1Ziwgc3RybS0+bmV4dF9pbiwgbGVuKTtcbiAgdXRpbHMuYXJyYXlTZXQoYnVmLCBzdHJtLmlucHV0LCBzdHJtLm5leHRfaW4sIGxlbiwgc3RhcnQpO1xuICBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAxKSB7XG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIGVsc2UgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMikge1xuICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBidWYsIGxlbiwgc3RhcnQpO1xuICB9XG5cbiAgc3RybS5uZXh0X2luICs9IGxlbjtcbiAgc3RybS50b3RhbF9pbiArPSBsZW47XG5cbiAgcmV0dXJuIGxlbjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZFxuICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLFxuICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpc1xuICogZ2FyYmFnZS5cbiAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnRcbiAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDFcbiAqIE9VVCBhc3NlcnRpb246IHRoZSBtYXRjaCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBzLT5sb29rYWhlYWQuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RfbWF0Y2gocywgY3VyX21hdGNoKSB7XG4gIHZhciBjaGFpbl9sZW5ndGggPSBzLm1heF9jaGFpbl9sZW5ndGg7ICAgICAgLyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovXG4gIHZhciBzY2FuID0gcy5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi9cbiAgdmFyIG1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqL1xuICB2YXIgYmVzdF9sZW4gPSBzLnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgLyogYmVzdCBtYXRjaCBsZW5ndGggc28gZmFyICovXG4gIHZhciBuaWNlX21hdGNoID0gcy5uaWNlX21hdGNoOyAgICAgICAgICAgICAvKiBzdG9wIGlmIG1hdGNoIGxvbmcgZW5vdWdoICovXG4gIHZhciBsaW1pdCA9IChzLnN0cnN0YXJ0ID4gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpID9cbiAgICAgIHMuc3Ryc3RhcnQgLSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSA6IDAvKk5JTCovO1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7IC8vIHNob3J0Y3V0XG5cbiAgdmFyIHdtYXNrID0gcy53X21hc2s7XG4gIHZhciBwcmV2ICA9IHMucHJldjtcblxuICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLFxuICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLlxuICAgKi9cblxuICB2YXIgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgdmFyIHNjYW5fZW5kMSAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdO1xuICB2YXIgc2Nhbl9lbmQgICA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcblxuICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi5cbiAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIC8vIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCBcIkNvZGUgdG9vIGNsZXZlclwiKTtcblxuICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqL1xuICBpZiAocy5wcmV2X2xlbmd0aCA+PSBzLmdvb2RfbWF0Y2gpIHtcbiAgICBjaGFpbl9sZW5ndGggPj49IDI7XG4gIH1cbiAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeVxuICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIGlmIChuaWNlX21hdGNoID4gcy5sb29rYWhlYWQpIHsgbmljZV9tYXRjaCA9IHMubG9va2FoZWFkOyB9XG5cbiAgLy8gQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgXCJuZWVkIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgLy8gQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCBcIm5vIGZ1dHVyZVwiKTtcbiAgICBtYXRjaCA9IGN1cl9tYXRjaDtcblxuICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZVxuICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDIuICBOb3RlIHRoYXQgdGhlIGNoZWNrcyBiZWxvd1xuICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZVxuICAgICAqIHJlYXNvbnMuICBUaGVyZWZvcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2lsbCBiZSBhY2Nlc3NlZCwgYW5kXG4gICAgICogY29uZGl0aW9uYWwganVtcHMgd2lsbCBiZSBtYWRlIHRoYXQgZGVwZW5kIG9uIHRob3NlIHZhbHVlcy5cbiAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc29cbiAgICAgKiB0aGUgb3V0cHV0IG9mIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlcy5cbiAgICAgKi9cblxuICAgIGlmIChfd2luW21hdGNoICsgYmVzdF9sZW5dICAgICAhPT0gc2Nhbl9lbmQgIHx8XG4gICAgICAgIF93aW5bbWF0Y2ggKyBiZXN0X2xlbiAtIDFdICE9PSBzY2FuX2VuZDEgfHxcbiAgICAgICAgX3dpblttYXRjaF0gICAgICAgICAgICAgICAgIT09IF93aW5bc2Nhbl0gfHxcbiAgICAgICAgX3dpblsrK21hdGNoXSAgICAgICAgICAgICAgIT09IF93aW5bc2NhbiArIDFdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZVxuICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pXG4gICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXlcbiAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0XG4gICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguXG4gICAgICovXG4gICAgc2NhbiArPSAyO1xuICAgIG1hdGNoKys7XG4gICAgLy8gQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgXCJtYXRjaFsyXT9cIik7XG5cbiAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uO1xuICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LlxuICAgICAqL1xuICAgIGRvIHtcbiAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgIH0gd2hpbGUgKF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcblxuICAgIC8vIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcblxuICAgIGxlbiA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIO1xuXG4gICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7XG4gICAgICBzLm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoO1xuICAgICAgYmVzdF9sZW4gPSBsZW47XG4gICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgICAgIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG4gICAgfVxuICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQgJiYgLS1jaGFpbl9sZW5ndGggIT09IDApO1xuXG4gIGlmIChiZXN0X2xlbiA8PSBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBiZXN0X2xlbjtcbiAgfVxuICByZXR1cm4gcy5sb29rYWhlYWQ7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LlxuICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLlxuICpcbiAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRFxuICogT1VUIGFzc2VydGlvbnM6IHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQURcbiAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7IHJlYWRzIGFyZVxuICogICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2xcbiAqICAgIG9wdGlvbiAtLSBub3Qgc3VwcG9ydGVkIGhlcmUpLlxuICovXG5mdW5jdGlvbiBmaWxsX3dpbmRvdyhzKSB7XG4gIHZhciBfd19zaXplID0gcy53X3NpemU7XG4gIHZhciBwLCBuLCBtLCBtb3JlLCBzdHI7XG5cbiAgLy9Bc3NlcnQocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCwgXCJhbHJlYWR5IGVub3VnaCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIG1vcmUgPSBzLndpbmRvd19zaXplIC0gcy5sb29rYWhlYWQgLSBzLnN0cnN0YXJ0O1xuXG4gICAgLy8gSlMgaW50cyBoYXZlIDMyIGJpdCwgYmxvY2sgYmVsb3cgbm90IG5lZWRlZFxuICAgIC8qIERlYWwgd2l0aCAhQCMkJSA2NEsgbGltaXQ6ICovXG4gICAgLy9pZiAoc2l6ZW9mKGludCkgPD0gMikge1xuICAgIC8vICAgIGlmIChtb3JlID09IDAgJiYgcy0+c3Ryc3RhcnQgPT0gMCAmJiBzLT5sb29rYWhlYWQgPT0gMCkge1xuICAgIC8vICAgICAgICBtb3JlID0gd3NpemU7XG4gICAgLy9cbiAgICAvLyAgfSBlbHNlIGlmIChtb3JlID09ICh1bnNpZ25lZCkoLTEpKSB7XG4gICAgLy8gICAgICAgIC8qIFZlcnkgdW5saWtlbHksIGJ1dCBwb3NzaWJsZSBvbiAxNiBiaXQgbWFjaGluZSBpZlxuICAgIC8vICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKVxuICAgIC8vICAgICAgICAgKi9cbiAgICAvLyAgICAgICAgbW9yZS0tO1xuICAgIC8vICAgIH1cbiAgICAvL31cblxuXG4gICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCxcbiAgICAgKiBtb3ZlIHRoZSB1cHBlciBoYWxmIHRvIHRoZSBsb3dlciBvbmUgdG8gbWFrZSByb29tIGluIHRoZSB1cHBlciBoYWxmLlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0ID49IF93X3NpemUgKyAoX3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG5cbiAgICAgIHV0aWxzLmFycmF5U2V0KHMud2luZG93LCBzLndpbmRvdywgX3dfc2l6ZSwgX3dfc2l6ZSwgMCk7XG4gICAgICBzLm1hdGNoX3N0YXJ0IC09IF93X3NpemU7XG4gICAgICBzLnN0cnN0YXJ0IC09IF93X3NpemU7XG4gICAgICAvKiB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVCAqL1xuICAgICAgcy5ibG9ja19zdGFydCAtPSBfd19zaXplO1xuXG4gICAgICAvKiBTbGlkZSB0aGUgaGFzaCB0YWJsZSAoY291bGQgYmUgYXZvaWRlZCB3aXRoIDMyIGJpdCB2YWx1ZXNcbiAgICAgICBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMFxuICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDBcbiAgICAgICBsYXRlci4gKFVzaW5nIGxldmVsIDAgcGVybWFuZW50bHkgaXMgbm90IGFuIG9wdGltYWwgdXNhZ2Ugb2ZcbiAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2FsIGNhc2UuKVxuICAgICAgICovXG5cbiAgICAgIG4gPSBzLmhhc2hfc2l6ZTtcbiAgICAgIHAgPSBuO1xuICAgICAgZG8ge1xuICAgICAgICBtID0gcy5oZWFkWy0tcF07XG4gICAgICAgIHMuaGVhZFtwXSA9IChtID49IF93X3NpemUgPyBtIC0gX3dfc2l6ZSA6IDApO1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbiA9IF93X3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMucHJldlstLXBdO1xuICAgICAgICBzLnByZXZbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXRcbiAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICovXG4gICAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgICBtb3JlICs9IF93X3NpemU7XG4gICAgfVxuICAgIGlmIChzLnN0cm0uYXZhaWxfaW4gPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOlxuICAgICAqICAgIHN0cnN0YXJ0IDw9IFdTSVpFK01BWF9ESVNULTEgJiYgbG9va2FoZWFkIDw9IE1JTl9MT09LQUhFQUQgLSAxICYmXG4gICAgICogICAgbW9yZSA9PSB3aW5kb3dfc2l6ZSAtIGxvb2thaGVhZCAtIHN0cnN0YXJ0XG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpXG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIDIqV1NJWkUgKyAyXG4gICAgICogSW4gdGhlIEJJR19NRU0gb3IgTU1BUCBjYXNlIChub3QgeWV0IHN1cHBvcnRlZCksXG4gICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiZcbiAgICAgKiAgIHN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIDw9IGlucHV0X3NpemUgPT4gbW9yZSA+PSBNSU5fTE9PS0FIRUFELlxuICAgICAqIE90aGVyd2lzZSwgd2luZG93X3NpemUgPT0gMipXU0laRSBzbyBtb3JlID49IDIuXG4gICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLlxuICAgICAqL1xuICAgIC8vQXNzZXJ0KG1vcmUgPj0gMiwgXCJtb3JlIDwgMlwiKTtcbiAgICBuID0gcmVhZF9idWYocy5zdHJtLCBzLndpbmRvdywgcy5zdHJzdGFydCArIHMubG9va2FoZWFkLCBtb3JlKTtcbiAgICBzLmxvb2thaGVhZCArPSBuO1xuXG4gICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovXG4gICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPj0gTUlOX01BVENIKSB7XG4gICAgICBzdHIgPSBzLnN0cnN0YXJ0IC0gcy5pbnNlcnQ7XG4gICAgICBzLmluc19oID0gcy53aW5kb3dbc3RyXTtcblxuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyAxXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyAxXSkgJiBzLmhhc2hfbWFzaztcbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgQ2FsbCB1cGRhdGVfaGFzaCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICB3aGlsZSAocy5pbnNlcnQpIHtcbiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7XG4gICAgICAgIHN0cisrO1xuICAgICAgICBzLmluc2VydC0tO1xuICAgICAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA8IE1JTl9NQVRDSCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSxcbiAgICAgKiBidXQgdGhpcyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIG9ubHkgbGl0ZXJhbCBieXRlcyB3aWxsIGJlIGVtaXR0ZWQuXG4gICAgICovXG5cbiAgfSB3aGlsZSAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHMuc3RybS5hdmFpbF9pbiAhPT0gMCk7XG5cbiAgLyogSWYgdGhlIFdJTl9JTklUIGJ5dGVzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZGF0YSBoYXZlIG5ldmVyIGJlZW5cbiAgICogd3JpdHRlbiwgdGhlbiB6ZXJvIHRob3NlIGJ5dGVzIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayByZXBvcnRzIG9mXG4gICAqIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCAob3IgdW5pbml0aWFsaXNlZCBhcyBKdWxpYW4gd3JpdGVzKSBieXRlcyBieVxuICAgKiB0aGUgbG9uZ2VzdCBtYXRjaCByb3V0aW5lcy4gIFVwZGF0ZSB0aGUgaGlnaCB3YXRlciBtYXJrIGZvciB0aGUgbmV4dFxuICAgKiB0aW1lIHRocm91Z2ggaGVyZS4gIFdJTl9JTklUIGlzIHNldCB0byBNQVhfTUFUQ0ggc2luY2UgdGhlIGxvbmdlc3QgbWF0Y2hcbiAgICogcm91dGluZXMgYWxsb3cgc2Nhbm5pbmcgdG8gc3Ryc3RhcnQgKyBNQVhfTUFUQ0gsIGlnbm9yaW5nIGxvb2thaGVhZC5cbiAgICovXG4vLyAgaWYgKHMuaGlnaF93YXRlciA8IHMud2luZG93X3NpemUpIHtcbi8vICAgIHZhciBjdXJyID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkO1xuLy8gICAgdmFyIGluaXQgPSAwO1xuLy9cbi8vICAgIGlmIChzLmhpZ2hfd2F0ZXIgPCBjdXJyKSB7XG4vLyAgICAgIC8qIFByZXZpb3VzIGhpZ2ggd2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVFxuLy8gICAgICAgKiBieXRlcyBvciB1cCB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbi8vICAgICAgICovXG4vLyAgICAgIGluaXQgPSBzLndpbmRvd19zaXplIC0gY3Vycjtcbi8vICAgICAgaWYgKGluaXQgPiBXSU5fSU5JVClcbi8vICAgICAgICBpbml0ID0gV0lOX0lOSVQ7XG4vLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIGN1cnIsICh1bnNpZ25lZClpbml0KTtcbi8vICAgICAgcy0+aGlnaF93YXRlciA9IGN1cnIgKyBpbml0O1xuLy8gICAgfVxuLy8gICAgZWxzZSBpZiAocy0+aGlnaF93YXRlciA8ICh1bGcpY3VyciArIFdJTl9JTklUKSB7XG4vLyAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGFcbi8vICAgICAgICogcGx1cyBXSU5fSU5JVCAtLSB6ZXJvIG91dCB0byBjdXJyZW50IGRhdGEgcGx1cyBXSU5fSU5JVCwgb3IgdXBcbi8vICAgICAgICogdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gKHVsZyljdXJyICsgV0lOX0lOSVQgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICBpZiAoaW5pdCA+IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcilcbi8vICAgICAgICBpbml0ID0gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgKz0gaW5pdDtcbi8vICAgIH1cbi8vICB9XG4vL1xuLy8gIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplIC0gTUlOX0xPT0tBSEVBRCxcbi8vICAgIFwibm90IGVub3VnaCByb29tIGZvciBzZWFyY2hcIik7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm5cbiAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2VcbiAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkXG4gKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uXG4gKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tXG4gKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKSB7XG4gIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkXG4gICAqIHRvIHBlbmRpbmdfYnVmX3NpemUsIGFuZCBlYWNoIHN0b3JlZCBibG9jayBoYXMgYSA1IGJ5dGUgaGVhZGVyOlxuICAgKi9cbiAgdmFyIG1heF9ibG9ja19zaXplID0gMHhmZmZmO1xuXG4gIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMucGVuZGluZ19idWZfc2l6ZSAtIDUpIHtcbiAgICBtYXhfYmxvY2tfc2l6ZSA9IHMucGVuZGluZ19idWZfc2l6ZSAtIDU7XG4gIH1cblxuICAvKiBDb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSBpbnB1dCB0byBvdXRwdXQ6ICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBGaWxsIHRoZSB3aW5kb3cgYXMgbXVjaCBhcyBwb3NzaWJsZTogKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPD0gMSkge1xuXG4gICAgICAvL0Fzc2VydChzLT5zdHJzdGFydCA8IHMtPndfc2l6ZStNQVhfRElTVChzKSB8fFxuICAgICAgLy8gIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgaWYgKCEocy5zdHJzdGFydCA8IHMud19zaXplICsgKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgfHxcbi8vICAgICAgICBzLmJsb2NrX3N0YXJ0ID49IHMud19zaXplKSkge1xuLy8gICAgICAgIHRocm93ICBuZXcgRXJyb3IoXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgfVxuXG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuXG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cbiAgICAvL0Fzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgXCJibG9jayBnb25lXCIpO1xuLy8gICAgaWYgKHMuYmxvY2tfc3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJibG9jayBnb25lXCIpO1xuXG4gICAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgICBzLmxvb2thaGVhZCA9IDA7XG5cbiAgICAvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIHBlbmRpbmdfYnVmIHdpbGwgYmUgZnVsbDogKi9cbiAgICB2YXIgbWF4X3N0YXJ0ID0gcy5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplO1xuXG4gICAgaWYgKHMuc3Ryc3RhcnQgPT09IDAgfHwgcy5zdHJzdGFydCA+PSBtYXhfc3RhcnQpIHtcbiAgICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICovXG4gICAgICBzLmxvb2thaGVhZCA9IHMuc3Ryc3RhcnQgLSBtYXhfc3RhcnQ7XG4gICAgICBzLnN0cnN0YXJ0ID0gbWF4X3N0YXJ0O1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cblxuXG4gICAgfVxuICAgIC8qIEZsdXNoIGlmIHdlIG1heSBoYXZlIHRvIHNsaWRlLCBvdGhlcndpc2UgYmxvY2tfc3RhcnQgbWF5IGJlY29tZVxuICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6XG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0ID49IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuXG4gIHMuaW5zZXJ0ID0gMDtcblxuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cblxuICBpZiAocy5zdHJzdGFydCA+IHMuYmxvY2tfc3RhcnQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfTkVFRF9NT1JFO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnRcbiAqIGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzXG4gKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnRcbiAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovXG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjpcbiAgICAgKi9cbiAgICBoYXNoX2hlYWQgPSAwLypOSUwqLztcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgLyoqKi9cbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENIXG4gICAgICovXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgKChzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkKSA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkpIHtcbiAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nXG4gICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2hcbiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7XG4gICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqL1xuICAgIH1cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvLyBjaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCk7IC8vIGZvciBkZWJ1ZyBvbmx5XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuXG4gICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgICAgICovXG4gICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gcy5tYXhfbGF6eV9tYXRjaC8qbWF4X2luc2VydF9sZW5ndGgqLyAmJiBzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gdGFibGUgKi9cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZVxuICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuXG4gICAgICAgICAgICovXG4gICAgICAgIH0gd2hpbGUgKC0tcy5tYXRjaF9sZW5ndGggIT09IDApO1xuICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICB9IGVsc2VcbiAgICAgIHtcbiAgICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgICAgICBzLmluc19oID0gcy53aW5kb3dbcy5zdHJzdGFydF07XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3Muc3Ryc3RhcnQrMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgMV0pICYgcy5oYXNoX21hc2s7XG5cbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lc1xuLy8jZW5kaWZcbiAgICAgICAgLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgaXQgZG9lcyBub3RcbiAgICAgICAgICogbWF0dGVyIHNpbmNlIGl0IHdpbGwgYmUgcmVjb21wdXRlZCBhdCBuZXh0IGRlZmxhdGUgY2FsbC5cbiAgICAgICAgICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy53aW5kb3dbcy5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAoKHMuc3Ryc3RhcnQgPCAoTUlOX01BVENIIC0gMSkpID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDEpO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eVxuICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpc1xuICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgdmFyIG1heF9pbnNlcnQ7XG5cbiAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKi9cbiAgICBzLnByZXZfbGVuZ3RoID0gcy5tYXRjaF9sZW5ndGg7XG4gICAgcy5wcmV2X21hdGNoID0gcy5tYXRjaF9zdGFydDtcbiAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG5cbiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiBzLnByZXZfbGVuZ3RoIDwgcy5tYXhfbGF6eV9tYXRjaCAmJlxuICAgICAgICBzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpLypNQVhfRElTVChzKSovKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cblxuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IDUgJiZcbiAgICAgICAgIChzLnN0cmF0ZWd5ID09PSBaX0ZJTFRFUkVEIHx8IChzLm1hdGNoX2xlbmd0aCA9PT0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0ID4gNDA5Ni8qVE9PX0ZBUiovKSkpIHtcblxuICAgICAgICAvKiBJZiBwcmV2X21hdGNoIGlzIGFsc28gTUlOX01BVENILCBtYXRjaF9zdGFydCBpcyBnYXJiYWdlXG4gICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuXG4gICAgICAgICAqL1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudFxuICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6XG4gICAgICovXG4gICAgaWYgKHMucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMubWF0Y2hfbGVuZ3RoIDw9IHMucHJldl9sZW5ndGgpIHtcbiAgICAgIG1heF9pbnNlcnQgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7XG4gICAgICAvKiBEbyBub3QgaW5zZXJ0IHN0cmluZ3MgaW4gaGFzaCB0YWJsZSBiZXlvbmQgdGhpcy4gKi9cblxuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LTEsIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCk7XG5cbiAgICAgIC8qKipfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgIHMucHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7KioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTtcbiAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLlxuICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdFxuICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpblxuICAgICAgICogdGhlIGhhc2ggdGFibGUuXG4gICAgICAgKi9cbiAgICAgIHMubG9va2FoZWFkIC09IHMucHJldl9sZW5ndGggLSAxO1xuICAgICAgcy5wcmV2X2xlbmd0aCAtPSAyO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoKytzLnN0cnN0YXJ0IDw9IG1heF9pbnNlcnQpIHtcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKC0tcy5wcmV2X2xlbmd0aCAhPT0gMCk7XG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIC8qKiovXG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYVxuICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaFxuICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC5cbiAgICAgICAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLX09OTFkocywgMCkgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgLyoqKi9cbiAgICAgIH1cbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yXG4gICAgICAgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGZsdXNoICE9IFpfTk9fRkxVU0gsIFwibm8gZmx1c2g/XCIpO1xuICBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIH1cbiAgcy5pbnNlcnQgPSBzLnN0cnN0YXJ0IDwgTUlOX01BVENIIC0gMSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZVxuICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mXG4gKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfcmxlKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG4gIHZhciBwcmV2OyAgICAgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi9cbiAgdmFyIHNjYW4sIHN0cmVuZDsgICAgICAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZvciBsZW5ndGggb2YgcnVuICovXG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdztcblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqL1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgPiAwKSB7XG4gICAgICBzY2FuID0gcy5zdHJzdGFydCAtIDE7XG4gICAgICBwcmV2ID0gX3dpbltzY2FuXTtcbiAgICAgIGlmIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSkge1xuICAgICAgICBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgICAgIH0gd2hpbGUgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pO1xuICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPiBzLmxvb2thaGVhZCkge1xuICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gcy5sb29rYWhlYWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1SW50KShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG4gICAgfVxuXG4gICAgLyogRW1pdCBtYXRjaCBpZiBoYXZlIHJ1biBvZiBNSU5fTUFUQ0ggb3IgbG9uZ2VyLCBlbHNlIGVtaXQgbGl0ZXJhbCAqL1xuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5zdHJzdGFydCAtIDEsIHMubWF0Y2hfbGVuZ3RoKTtcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuXG4gKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcbiAgICBzLmxvb2thaGVhZC0tO1xuICAgIHMuc3Ryc3RhcnQrKztcbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uXG4gKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG9cbiAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZVxuICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLlxuICovXG5mdW5jdGlvbiBDb25maWcoZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluLCBmdW5jKSB7XG4gIHRoaXMuZ29vZF9sZW5ndGggPSBnb29kX2xlbmd0aDtcbiAgdGhpcy5tYXhfbGF6eSA9IG1heF9sYXp5O1xuICB0aGlzLm5pY2VfbGVuZ3RoID0gbmljZV9sZW5ndGg7XG4gIHRoaXMubWF4X2NoYWluID0gbWF4X2NoYWluO1xuICB0aGlzLmZ1bmMgPSBmdW5jO1xufVxuXG52YXIgY29uZmlndXJhdGlvbl90YWJsZTtcblxuY29uZmlndXJhdGlvbl90YWJsZSA9IFtcbiAgLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqL1xuICBuZXcgQ29uZmlnKDAsIDAsIDAsIDAsIGRlZmxhdGVfc3RvcmVkKSwgICAgICAgICAgLyogMCBzdG9yZSBvbmx5ICovXG4gIG5ldyBDb25maWcoNCwgNCwgOCwgNCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgICAvKiAxIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoNCwgNSwgMTYsIDgsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAvKiAyICovXG4gIG5ldyBDb25maWcoNCwgNiwgMzIsIDMyLCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAvKiAzICovXG5cbiAgbmV3IENvbmZpZyg0LCA0LCAxNiwgMTYsIGRlZmxhdGVfc2xvdyksICAgICAgICAgIC8qIDQgbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDMyLCAzMiwgZGVmbGF0ZV9zbG93KSwgICAgICAgICAvKiA1ICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA2ICovXG4gIG5ldyBDb25maWcoOCwgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA3ICovXG4gIG5ldyBDb25maWcoMzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3cpLCAgICAvKiA4ICovXG4gIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpICAgICAvKiA5IG1heCBjb21wcmVzc2lvbiAqL1xuXTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIFwibG9uZ2VzdCBtYXRjaFwiIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbVxuICovXG5mdW5jdGlvbiBsbV9pbml0KHMpIHtcbiAgcy53aW5kb3dfc2l6ZSA9IDIgKiBzLndfc2l6ZTtcblxuICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6XG4gICAqL1xuICBzLm1heF9sYXp5X21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eTtcbiAgcy5nb29kX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aDtcbiAgcy5uaWNlX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5uaWNlX2xlbmd0aDtcbiAgcy5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW47XG5cbiAgcy5zdHJzdGFydCA9IDA7XG4gIHMuYmxvY2tfc3RhcnQgPSAwO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMuaW5zZXJ0ID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzLmluc19oID0gMDtcbn1cblxuXG5mdW5jdGlvbiBEZWZsYXRlU3RhdGUoKSB7XG4gIHRoaXMuc3RybSA9IG51bGw7ICAgICAgICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi9cbiAgdGhpcy5zdGF0dXMgPSAwOyAgICAgICAgICAgIC8qIGFzIHRoZSBuYW1lIGltcGxpZXMgKi9cbiAgdGhpcy5wZW5kaW5nX2J1ZiA9IG51bGw7ICAgICAgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi9cbiAgdGhpcy5wZW5kaW5nX2J1Zl9zaXplID0gMDsgIC8qIHNpemUgb2YgcGVuZGluZ19idWYgKi9cbiAgdGhpcy5wZW5kaW5nX291dCA9IDA7ICAgICAgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovXG4gIHRoaXMucGVuZGluZyA9IDA7ICAgICAgICAgICAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5nemhlYWQgPSBudWxsOyAgICAgICAgIC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovXG4gIHRoaXMuZ3ppbmRleCA9IDA7ICAgICAgICAgICAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqL1xuICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQ7IC8qIGNhbiBvbmx5IGJlIERFRkxBVEVEICovXG4gIHRoaXMubGFzdF9mbHVzaCA9IC0xOyAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi9cblxuICB0aGlzLndfc2l6ZSA9IDA7ICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkgKi9cbiAgdGhpcy53X2JpdHMgPSAwOyAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovXG4gIHRoaXMud19tYXNrID0gMDsgIC8qIHdfc2l6ZSAtIDEgKi9cblxuICB0aGlzLndpbmRvdyA9IG51bGw7XG4gIC8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LFxuICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZVxuICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mXG4gICAqIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5c1xuICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS5cbiAgICovXG5cbiAgdGhpcy53aW5kb3dfc2l6ZSA9IDA7XG4gIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyXG4gICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuXG4gICAqL1xuXG4gIHRoaXMucHJldiA9IG51bGw7XG4gIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzXG4gICAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuXG4gICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLlxuICAgKi9cblxuICB0aGlzLmhlYWQgPSBudWxsOyAgIC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovXG5cbiAgdGhpcy5pbnNfaCA9IDA7ICAgICAgIC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovXG4gIHRoaXMuaGFzaF9zaXplID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqL1xuICB0aGlzLmhhc2hfYml0cyA9IDA7ICAgLyogbG9nMihoYXNoX3NpemUpICovXG4gIHRoaXMuaGFzaF9tYXNrID0gMDsgICAvKiBoYXNoX3NpemUtMSAqL1xuXG4gIHRoaXMuaGFzaF9zaGlmdCA9IDA7XG4gIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0XG4gICAqIHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdFxuICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczpcbiAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0c1xuICAgKi9cblxuICB0aGlzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgLyogV2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzXG4gICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuXG4gICAqL1xuXG4gIHRoaXMubWF0Y2hfbGVuZ3RoID0gMDsgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqL1xuICB0aGlzLnByZXZfbWF0Y2ggPSAwOyAgICAgICAgLyogcHJldmlvdXMgbWF0Y2ggKi9cbiAgdGhpcy5tYXRjaF9hdmFpbGFibGUgPSAwOyAgIC8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi9cbiAgdGhpcy5zdHJzdGFydCA9IDA7ICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi9cbiAgdGhpcy5tYXRjaF9zdGFydCA9IDA7ICAgICAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqL1xuICB0aGlzLmxvb2thaGVhZCA9IDA7ICAgICAgICAgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqL1xuXG4gIHRoaXMucHJldl9sZW5ndGggPSAwO1xuICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXNcbiAgICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uXG4gICAqL1xuXG4gIHRoaXMubWF4X2NoYWluX2xlbmd0aCA9IDA7XG4gIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzXG4gICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGVcbiAgICogc3BlZWQuXG4gICAqL1xuXG4gIHRoaXMubWF4X2xhenlfbWF0Y2ggPSAwO1xuICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5XG4gICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uXG4gICAqIGxldmVscyA+PSA0LlxuICAgKi9cbiAgLy8gVGhhdCdzIGFsaWFzIHRvIG1heF9sYXp5X21hdGNoLCBkb24ndCB1c2UgZGlyZWN0bHlcbiAgLy90aGlzLm1heF9pbnNlcnRfbGVuZ3RoID0gMDtcbiAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3RcbiAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLlxuICAgKi9cblxuICB0aGlzLmxldmVsID0gMDsgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqL1xuICB0aGlzLnN0cmF0ZWd5ID0gMDsgIC8qIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nKi9cblxuICB0aGlzLmdvb2RfbWF0Y2ggPSAwO1xuICAvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi9cblxuICB0aGlzLm5pY2VfbWF0Y2ggPSAwOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovXG5cbiAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqL1xuXG4gIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi9cblxuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2R0cmVlWzIqRF9DT0RFUysxXTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi9cblxuICAvLyBVc2UgZmxhdCBhcnJheSBvZiBET1VCTEUgc2l6ZSwgd2l0aCBpbnRlcmxlYXZlZCBmYXRhLFxuICAvLyBiZWNhdXNlIEpTIGRvZXMgbm90IHN1cHBvcnQgZWZmZWN0aXZlXG4gIHRoaXMuZHluX2x0cmVlICA9IG5ldyB1dGlscy5CdWYxNihIRUFQX1NJWkUgKiAyKTtcbiAgdGhpcy5keW5fZHRyZWUgID0gbmV3IHV0aWxzLkJ1ZjE2KCgyICogRF9DT0RFUyArIDEpICogMik7XG4gIHRoaXMuYmxfdHJlZSAgICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIEJMX0NPREVTICsgMSkgKiAyKTtcbiAgemVybyh0aGlzLmR5bl9sdHJlZSk7XG4gIHplcm8odGhpcy5keW5fZHRyZWUpO1xuICB6ZXJvKHRoaXMuYmxfdHJlZSk7XG5cbiAgdGhpcy5sX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqL1xuICB0aGlzLmRfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgZGlzdGFuY2UgdHJlZSAqL1xuICB0aGlzLmJsX2Rlc2MgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovXG5cbiAgLy91c2ggYmxfY291bnRbTUFYX0JJVFMrMV07XG4gIHRoaXMuYmxfY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy9pbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHRoaXMuaGVhcCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHplcm8odGhpcy5oZWFwKTtcblxuICB0aGlzLmhlYXBfbGVuID0gMDsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi9cbiAgdGhpcy5oZWFwX21heCA9IDA7ICAgICAgICAgICAgICAgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqL1xuICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLlxuICAgKi9cblxuICB0aGlzLmRlcHRoID0gbmV3IHV0aWxzLkJ1ZjE2KDIgKiBMX0NPREVTICsgMSk7IC8vdWNoIGRlcHRoWzIqTF9DT0RFUysxXTtcbiAgemVybyh0aGlzLmRlcHRoKTtcbiAgLyogRGVwdGggb2YgZWFjaCBzdWJ0cmVlIHVzZWQgYXMgdGllIGJyZWFrZXIgZm9yIHRyZWVzIG9mIGVxdWFsIGZyZXF1ZW5jeVxuICAgKi9cblxuICB0aGlzLmxfYnVmID0gMDsgICAgICAgICAgLyogYnVmZmVyIGluZGV4IGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovXG5cbiAgdGhpcy5saXRfYnVmc2l6ZSA9IDA7XG4gIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3JcbiAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOlxuICAgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXRcbiAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuXG4gICAqICAgICB3aGVuIGlucHV0IGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvclxuICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhblxuICAgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLlxuICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuXG4gICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3RcbiAgICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3JcbiAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieVxuICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmVcbiAgICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZ1xuICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LlxuICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0XG4gICAqL1xuXG4gIHRoaXMubGFzdF9saXQgPSAwOyAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cblxuICB0aGlzLmRfYnVmID0gMDtcbiAgLyogQnVmZmVyIGluZGV4IGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZVxuICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZ1xuICAgKiBhcnJheSB3b3VsZCBiZSBuZWNlc3NhcnkuXG4gICAqL1xuXG4gIHRoaXMub3B0X2xlbiA9IDA7ICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi9cbiAgdGhpcy5zdGF0aWNfbGVuID0gMDsgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovXG4gIHRoaXMubWF0Y2hlcyA9IDA7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovXG4gIHRoaXMuaW5zZXJ0ID0gMDsgICAgICAgIC8qIGJ5dGVzIGF0IGVuZCBvZiB3aW5kb3cgbGVmdCB0byBpbnNlcnQgKi9cblxuXG4gIHRoaXMuYmlfYnVmID0gMDtcbiAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3RcbiAgICogc2lnbmlmaWNhbnQgYml0cykuXG4gICAqL1xuICB0aGlzLmJpX3ZhbGlkID0gMDtcbiAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0XG4gICAqIGFyZSBhbHdheXMgemVyby5cbiAgICovXG5cbiAgLy8gVXNlZCBmb3Igd2luZG93IG1lbW9yeSBpbml0LiBXZSBzYWZlbHkgaWdub3JlIGl0IGZvciBKUy4gVGhhdCBtYWtlc1xuICAvLyBzZW5zZSBvbmx5IGZvciBwb2ludGVycyBhbmQgbWVtb3J5IGNoZWNrIHRvb2xzLlxuICAvL3RoaXMuaGlnaF93YXRlciA9IDA7XG4gIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZVxuICAgKiB0aGlzIGFyZSBzZXQgdG8gemVybyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgd2FybmluZ3Mgd2hlblxuICAgKiBsb25nZXN0IG1hdGNoIHJvdXRpbmVzIGFjY2VzcyBieXRlcyBwYXN0IHRoZSBpbnB1dC4gIFRoaXMgaXMgdGhlblxuICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLlxuICAgKi9cbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHM7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSAwO1xuICBzdHJtLmRhdGFfdHlwZSA9IFpfVU5LTk9XTjtcblxuICBzID0gc3RybS5zdGF0ZTtcbiAgcy5wZW5kaW5nID0gMDtcbiAgcy5wZW5kaW5nX291dCA9IDA7XG5cbiAgaWYgKHMud3JhcCA8IDApIHtcbiAgICBzLndyYXAgPSAtcy53cmFwO1xuICAgIC8qIHdhcyBtYWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovXG4gIH1cbiAgcy5zdGF0dXMgPSAocy53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEUpO1xuICBzdHJtLmFkbGVyID0gKHMud3JhcCA9PT0gMikgP1xuICAgIDAgIC8vIGNyYzMyKDAsIFpfTlVMTCwgMClcbiAgOlxuICAgIDE7IC8vIGFkbGVyMzIoMCwgWl9OVUxMLCAwKVxuICBzLmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIO1xuICB0cmVlcy5fdHJfaW5pdChzKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHN0cm0pIHtcbiAgdmFyIHJldCA9IGRlZmxhdGVSZXNldEtlZXAoc3RybSk7XG4gIGlmIChyZXQgPT09IFpfT0spIHtcbiAgICBsbV9pbml0KHN0cm0uc3RhdGUpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVNldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgaWYgKHN0cm0uc3RhdGUud3JhcCAhPT0gMikgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RybS5zdGF0ZS5nemhlYWQgPSBoZWFkO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSB7XG4gIGlmICghc3RybSkgeyAvLyA9PT0gWl9OVUxMXG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIHZhciB3cmFwID0gMTtcblxuICBpZiAobGV2ZWwgPT09IFpfREVGQVVMVF9DT01QUkVTU0lPTikge1xuICAgIGxldmVsID0gNjtcbiAgfVxuXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiBzdXBwcmVzcyB6bGliIHdyYXBwZXIgKi9cbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHtcbiAgICB3cmFwID0gMjsgICAgICAgICAgIC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovXG4gICAgd2luZG93Qml0cyAtPSAxNjtcbiAgfVxuXG5cbiAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9PSBaX0RFRkxBVEVEIHx8XG4gICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHxcbiAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuXG4gIGlmICh3aW5kb3dCaXRzID09PSA4KSB7XG4gICAgd2luZG93Qml0cyA9IDk7XG4gIH1cbiAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqL1xuXG4gIHZhciBzID0gbmV3IERlZmxhdGVTdGF0ZSgpO1xuXG4gIHN0cm0uc3RhdGUgPSBzO1xuICBzLnN0cm0gPSBzdHJtO1xuXG4gIHMud3JhcCA9IHdyYXA7XG4gIHMuZ3poZWFkID0gbnVsbDtcbiAgcy53X2JpdHMgPSB3aW5kb3dCaXRzO1xuICBzLndfc2l6ZSA9IDEgPDwgcy53X2JpdHM7XG4gIHMud19tYXNrID0gcy53X3NpemUgLSAxO1xuXG4gIHMuaGFzaF9iaXRzID0gbWVtTGV2ZWwgKyA3O1xuICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7XG4gIHMuaGFzaF9tYXNrID0gcy5oYXNoX3NpemUgLSAxO1xuICBzLmhhc2hfc2hpZnQgPSB+figocy5oYXNoX2JpdHMgKyBNSU5fTUFUQ0ggLSAxKSAvIE1JTl9NQVRDSCk7XG5cbiAgcy53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSAqIDIpO1xuICBzLmhlYWQgPSBuZXcgdXRpbHMuQnVmMTYocy5oYXNoX3NpemUpO1xuICBzLnByZXYgPSBuZXcgdXRpbHMuQnVmMTYocy53X3NpemUpO1xuXG4gIC8vIERvbid0IG5lZWQgbWVtIGluaXQgbWFnaWMgZm9yIEpTLlxuICAvL3MuaGlnaF93YXRlciA9IDA7ICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqL1xuXG4gIHMubGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqL1xuXG4gIHMucGVuZGluZ19idWZfc2l6ZSA9IHMubGl0X2J1ZnNpemUgKiA0O1xuXG4gIC8vb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7XG4gIC8vcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5O1xuICBzLnBlbmRpbmdfYnVmID0gbmV3IHV0aWxzLkJ1Zjgocy5wZW5kaW5nX2J1Zl9zaXplKTtcblxuICAvLyBJdCBpcyBvZmZzZXQgZnJvbSBgcy5wZW5kaW5nX2J1ZmAgKHNpemUgaXMgYHMubGl0X2J1ZnNpemUgKiAyYClcbiAgLy9zLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTtcbiAgcy5kX2J1ZiA9IDEgKiBzLmxpdF9idWZzaXplO1xuXG4gIC8vcy0+bF9idWYgPSBzLT5wZW5kaW5nX2J1ZiArICgxK3NpemVvZih1c2gpKSpzLT5saXRfYnVmc2l6ZTtcbiAgcy5sX2J1ZiA9ICgxICsgMikgKiBzLmxpdF9idWZzaXplO1xuXG4gIHMubGV2ZWwgPSBsZXZlbDtcbiAgcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICBzLm1ldGhvZCA9IG1ldGhvZDtcblxuICByZXR1cm4gZGVmbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkge1xuICByZXR1cm4gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSk7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZShzdHJtLCBmbHVzaCkge1xuICB2YXIgb2xkX2ZsdXNoLCBzO1xuICB2YXIgYmVnLCB2YWw7IC8vIGZvciBnemlwIGhlYWRlciB3cml0ZSBvbmx5XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8XG4gICAgZmx1c2ggPiBaX0JMT0NLIHx8IGZsdXNoIDwgMCkge1xuICAgIHJldHVybiBzdHJtID8gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKSA6IFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKCFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHx8XG4gICAgICAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPT0gWl9GSU5JU0gpKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCAoc3RybS5hdmFpbF9vdXQgPT09IDApID8gWl9CVUZfRVJST1IgOiBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzLnN0cm0gPSBzdHJtOyAvKiBqdXN0IGluIGNhc2UgKi9cbiAgb2xkX2ZsdXNoID0gcy5sYXN0X2ZsdXNoO1xuICBzLmxhc3RfZmx1c2ggPSBmbHVzaDtcblxuICAvKiBXcml0ZSB0aGUgaGVhZGVyICovXG4gIGlmIChzLnN0YXR1cyA9PT0gSU5JVF9TVEFURSkge1xuXG4gICAgaWYgKHMud3JhcCA9PT0gMikgeyAvLyBHWklQIGhlYWRlclxuICAgICAgc3RybS5hZGxlciA9IDA7ICAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgcHV0X2J5dGUocywgMzEpO1xuICAgICAgcHV0X2J5dGUocywgMTM5KTtcbiAgICAgIHB1dF9ieXRlKHMsIDgpO1xuICAgICAgaWYgKCFzLmd6aGVhZCkgeyAvLyBzLT5nemhlYWQgPT0gWl9OVUxMXG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBPU19DT0RFKTtcbiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50ZXh0ID8gMSA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLmV4dHJhID8gMCA6IDQpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5uYW1lID8gMCA6IDgpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gMTYpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDI0KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6XG4gICAgICAgICAgICAgICAgICAgIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyID9cbiAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLm9zICYgMHhmZik7XG4gICAgICAgIGlmIChzLmd6aGVhZC5leHRyYSAmJiBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmKTtcbiAgICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQuZXh0cmEubGVuZ3RoID4+IDgpICYgMHhmZik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMpIHtcbiAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IEVYVFJBX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIC8vIERFRkxBVEUgaGVhZGVyXG4gICAge1xuICAgICAgdmFyIGhlYWRlciA9IChaX0RFRkxBVEVEICsgKChzLndfYml0cyAtIDgpIDw8IDQpKSA8PCA4O1xuICAgICAgdmFyIGxldmVsX2ZsYWdzID0gLTE7XG5cbiAgICAgIGlmIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyKSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA8IDYpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzLmxldmVsID09PSA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMztcbiAgICAgIH1cbiAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7XG4gICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgeyBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7IH1cbiAgICAgIGhlYWRlciArPSAzMSAtIChoZWFkZXIgJSAzMSk7XG5cbiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIHB1dFNob3J0TVNCKHMsIGhlYWRlcik7XG5cbiAgICAgIC8qIFNhdmUgdGhlIGFkbGVyMzIgb2YgdGhlIHByZXNldCBkaWN0aW9uYXJ5OiAqL1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpO1xuICAgICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgICAgIH1cbiAgICAgIHN0cm0uYWRsZXIgPSAxOyAvLyBhZGxlcjMyKDBMLCBaX05VTEwsIDApO1xuICAgIH1cbiAgfVxuXG4vLyNpZmRlZiBHWklQXG4gIGlmIChzLnN0YXR1cyA9PT0gRVhUUkFfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuZXh0cmEvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuXG4gICAgICB3aGlsZSAocy5nemluZGV4IDwgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDB4ZmZmZikpIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYVtzLmd6aW5kZXhdICYgMHhmZik7XG4gICAgICAgIHMuZ3ppbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAocy5nemluZGV4ID09PSBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBOQU1FX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLm5hbWUvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5uYW1lLmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLm5hbWUuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IENPTU1FTlRfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuY29tbWVudC8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICAvL2ludCB2YWw7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIHZhbCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLmNvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcblxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSAwKSB7XG4gICAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gSENSQ19TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICBpZiAocy5wZW5kaW5nICsgMiA+IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgfVxuICAgICAgaWYgKHMucGVuZGluZyArIDIgPD0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgc3RybS5hZGxlciA9IDA7IC8vY3JjMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgfVxuICB9XG4vLyNlbmRpZlxuXG4gIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi9cbiAgaWYgKHMucGVuZGluZyAhPT0gMCkge1xuICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAvKiBTaW5jZSBhdmFpbF9vdXQgaXMgMCwgZGVmbGF0ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoXG4gICAgICAgKiBtb3JlIG91dHB1dCBzcGFjZSwgYnV0IHBvc3NpYmx5IHdpdGggYm90aCBwZW5kaW5nIGFuZFxuICAgICAgICogYXZhaWxfaW4gZXF1YWwgdG8gemVyby4gVGhlcmUgd29uJ3QgYmUgYW55dGhpbmcgdG8gZG8sXG4gICAgICAgKiBidXQgdGhpcyBpcyBub3QgYW4gZXJyb3Igc2l0dWF0aW9uIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICogcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCBvZiBkZWZsYXRlOlxuICAgICAgICovXG4gICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgIHJldHVybiBaX09LO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZVxuICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwXG4gICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLlxuICAgICAqL1xuICB9IGVsc2UgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgcmFuayhmbHVzaCkgPD0gcmFuayhvbGRfZmx1c2gpICYmXG4gICAgZmx1c2ggIT09IFpfRklOSVNIKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqL1xuICBpZiAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuXG4gICAqL1xuICBpZiAoc3RybS5hdmFpbF9pbiAhPT0gMCB8fCBzLmxvb2thaGVhZCAhPT0gMCB8fFxuICAgIChmbHVzaCAhPT0gWl9OT19GTFVTSCAmJiBzLnN0YXR1cyAhPT0gRklOSVNIX1NUQVRFKSkge1xuICAgIHZhciBic3RhdGUgPSAocy5zdHJhdGVneSA9PT0gWl9IVUZGTUFOX09OTFkpID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6XG4gICAgICAocy5zdHJhdGVneSA9PT0gWl9STEUgPyBkZWZsYXRlX3JsZShzLCBmbHVzaCkgOlxuICAgICAgICBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmZ1bmMocywgZmx1c2gpKTtcblxuICAgIGlmIChic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX0RPTkUpIHtcbiAgICAgIHMuc3RhdHVzID0gRklOSVNIX1NUQVRFO1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19ORUVEX01PUkUgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgICAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiBaX09LO1xuICAgICAgLyogSWYgZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBhdmFpbF9vdXQgPT0gMCwgdGhlIG5leHQgY2FsbFxuICAgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmVcbiAgICAgICAqIHRoYXQgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLiBTbyB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dCBhblxuICAgICAgICogZW1wdHkgYmxvY2sgaGVyZSwgdGhpcyB3aWxsIGJlIGRvbmUgYXQgbmV4dCBjYWxsLiBUaGlzIGFsc29cbiAgICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdFxuICAgICAgICogb25lIGVtcHR5IGJsb2NrLlxuICAgICAgICovXG4gICAgfVxuICAgIGlmIChic3RhdGUgPT09IEJTX0JMT0NLX0RPTkUpIHtcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9QQVJUSUFMX0ZMVVNIKSB7XG4gICAgICAgIHRyZWVzLl90cl9hbGlnbihzKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGZsdXNoICE9PSBaX0JMT0NLKSB7IC8qIEZVTExfRkxVU0ggb3IgU1lOQ19GTFVTSCAqL1xuXG4gICAgICAgIHRyZWVzLl90cl9zdG9yZWRfYmxvY2socywgMCwgMCwgZmFsc2UpO1xuICAgICAgICAvKiBGb3IgYSBmdWxsIGZsdXNoLCB0aGlzIGVtcHR5IGJsb2NrIHdpbGwgYmUgcmVjb2duaXplZFxuICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0ZVTExfRkxVU0gpIHtcbiAgICAgICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi8gICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi9cbiAgICAgICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICAgICAgICBzLmluc2VydCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgICAgcmV0dXJuIFpfT0s7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0KHN0cm0tPmF2YWlsX291dCA+IDAsIFwiYnVnMlwiKTtcbiAgLy9pZiAoc3RybS5hdmFpbF9vdXQgPD0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJidWcyXCIpO31cblxuICBpZiAoZmx1c2ggIT09IFpfRklOSVNIKSB7IHJldHVybiBaX09LOyB9XG4gIGlmIChzLndyYXAgPD0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRU5EOyB9XG5cbiAgLyogV3JpdGUgdGhlIHRyYWlsZXIgKi9cbiAgaWYgKHMud3JhcCA9PT0gMikge1xuICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDI0KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIHN0cm0udG90YWxfaW4gJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDI0KSAmIDB4ZmYpO1xuICB9XG4gIGVsc2VcbiAge1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgfVxuXG4gIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gIC8qIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW5cbiAgICogdG8gZmx1c2ggdGhlIHJlc3QuXG4gICAqL1xuICBpZiAocy53cmFwID4gMCkgeyBzLndyYXAgPSAtcy53cmFwOyB9XG4gIC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi9cbiAgcmV0dXJuIHMucGVuZGluZyAhPT0gMCA/IFpfT0sgOiBaX1NUUkVBTV9FTkQ7XG59XG5cbmZ1bmN0aW9uIGRlZmxhdGVFbmQoc3RybSkge1xuICB2YXIgc3RhdHVzO1xuXG4gIGlmICghc3RybS8qPT0gWl9OVUxMKi8gfHwgIXN0cm0uc3RhdGUvKj09IFpfTlVMTCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdHVzID0gc3RybS5zdGF0ZS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IElOSVRfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEVYVFJBX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBOQU1FX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBDT01NRU5UX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBIQ1JDX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBCVVNZX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBGSU5JU0hfU1RBVEVcbiAgKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnN0YXRlID0gbnVsbDtcblxuICByZXR1cm4gc3RhdHVzID09PSBCVVNZX1NUQVRFID8gZXJyKHN0cm0sIFpfREFUQV9FUlJPUikgOiBaX09LO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGVcbiAqIHNlcXVlbmNlIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkge1xuICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoO1xuXG4gIHZhciBzO1xuICB2YXIgc3RyLCBuO1xuICB2YXIgd3JhcDtcbiAgdmFyIGF2YWlsO1xuICB2YXIgbmV4dDtcbiAgdmFyIGlucHV0O1xuICB2YXIgdG1wRGljdDtcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuICB3cmFwID0gcy53cmFwO1xuXG4gIGlmICh3cmFwID09PSAyIHx8ICh3cmFwID09PSAxICYmIHMuc3RhdHVzICE9PSBJTklUX1NUQVRFKSB8fCBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIHdoZW4gdXNpbmcgemxpYiB3cmFwcGVycywgY29tcHV0ZSBBZGxlci0zMiBmb3IgcHJvdmlkZWQgZGljdGlvbmFyeSAqL1xuICBpZiAod3JhcCA9PT0gMSkge1xuICAgIC8qIGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApO1xuICB9XG5cbiAgcy53cmFwID0gMDsgICAvKiBhdm9pZCBjb21wdXRpbmcgQWRsZXItMzIgaW4gcmVhZF9idWYgKi9cblxuICAvKiBpZiBkaWN0aW9uYXJ5IHdvdWxkIGZpbGwgd2luZG93LCBqdXN0IHJlcGxhY2UgdGhlIGhpc3RvcnkgKi9cbiAgaWYgKGRpY3RMZW5ndGggPj0gcy53X3NpemUpIHtcbiAgICBpZiAod3JhcCA9PT0gMCkgeyAgICAgICAgICAgIC8qIGFscmVhZHkgZW1wdHkgb3RoZXJ3aXNlICovXG4gICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgICAgIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcbiAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICBzLmluc2VydCA9IDA7XG4gICAgfVxuICAgIC8qIHVzZSB0aGUgdGFpbCAqL1xuICAgIC8vIGRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5LnNsaWNlKGRpY3RMZW5ndGggLSBzLndfc2l6ZSk7XG4gICAgdG1wRGljdCA9IG5ldyB1dGlscy5CdWY4KHMud19zaXplKTtcbiAgICB1dGlscy5hcnJheVNldCh0bXBEaWN0LCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoIC0gcy53X3NpemUsIHMud19zaXplLCAwKTtcbiAgICBkaWN0aW9uYXJ5ID0gdG1wRGljdDtcbiAgICBkaWN0TGVuZ3RoID0gcy53X3NpemU7XG4gIH1cbiAgLyogaW5zZXJ0IGRpY3Rpb25hcnkgaW50byB3aW5kb3cgYW5kIGhhc2ggKi9cbiAgYXZhaWwgPSBzdHJtLmF2YWlsX2luO1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBkaWN0TGVuZ3RoO1xuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmlucHV0ID0gZGljdGlvbmFyeTtcbiAgZmlsbF93aW5kb3cocyk7XG4gIHdoaWxlIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICBzdHIgPSBzLnN0cnN0YXJ0O1xuICAgIG4gPSBzLmxvb2thaGVhZCAtIChNSU5fTUFUQ0ggLSAxKTtcbiAgICBkbyB7XG4gICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIE1JTl9NQVRDSC0xXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcblxuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgc3RyKys7XG4gICAgfSB3aGlsZSAoLS1uKTtcbiAgICBzLnN0cnN0YXJ0ID0gc3RyO1xuICAgIHMubG9va2FoZWFkID0gTUlOX01BVENIIC0gMTtcbiAgICBmaWxsX3dpbmRvdyhzKTtcbiAgfVxuICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgcy5pbnNlcnQgPSBzLmxvb2thaGVhZDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLm1hdGNoX2xlbmd0aCA9IHMucHJldl9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uaW5wdXQgPSBpbnB1dDtcbiAgc3RybS5hdmFpbF9pbiA9IGF2YWlsO1xuICBzLndyYXAgPSB3cmFwO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5leHBvcnRzLmRlZmxhdGVJbml0ID0gZGVmbGF0ZUluaXQ7XG5leHBvcnRzLmRlZmxhdGVJbml0MiA9IGRlZmxhdGVJbml0MjtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0ID0gZGVmbGF0ZVJlc2V0O1xuZXhwb3J0cy5kZWZsYXRlUmVzZXRLZWVwID0gZGVmbGF0ZVJlc2V0S2VlcDtcbmV4cG9ydHMuZGVmbGF0ZVNldEhlYWRlciA9IGRlZmxhdGVTZXRIZWFkZXI7XG5leHBvcnRzLmRlZmxhdGUgPSBkZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlRW5kID0gZGVmbGF0ZUVuZDtcbmV4cG9ydHMuZGVmbGF0ZVNldERpY3Rpb25hcnkgPSBkZWZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuZGVmbGF0ZUluZm8gPSAncGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5kZWZsYXRlQm91bmQgPSBkZWZsYXRlQm91bmQ7XG5leHBvcnRzLmRlZmxhdGVDb3B5ID0gZGVmbGF0ZUNvcHk7XG5leHBvcnRzLmRlZmxhdGVQYXJhbXMgPSBkZWZsYXRlUGFyYW1zO1xuZXhwb3J0cy5kZWZsYXRlUGVuZGluZyA9IGRlZmxhdGVQZW5kaW5nO1xuZXhwb3J0cy5kZWZsYXRlUHJpbWUgPSBkZWZsYXRlUHJpbWU7XG5leHBvcnRzLmRlZmxhdGVUdW5lID0gZGVmbGF0ZVR1bmU7XG4qL1xuXG59LHtcIi4uL3V0aWxzL2NvbW1vblwiOjMwNCxcIi4vYWRsZXIzMlwiOjMwNixcIi4vY3JjMzJcIjozMDgsXCIuL21lc3NhZ2VzXCI6MzE0LFwiLi90cmVlc1wiOjMxNX1dLDMxMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuZnVuY3Rpb24gR1poZWFkZXIoKSB7XG4gIC8qIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHQgKi9cbiAgdGhpcy50ZXh0ICAgICAgID0gMDtcbiAgLyogbW9kaWZpY2F0aW9uIHRpbWUgKi9cbiAgdGhpcy50aW1lICAgICAgID0gMDtcbiAgLyogZXh0cmEgZmxhZ3MgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi9cbiAgdGhpcy54ZmxhZ3MgICAgID0gMDtcbiAgLyogb3BlcmF0aW5nIHN5c3RlbSAqL1xuICB0aGlzLm9zICAgICAgICAgPSAwO1xuICAvKiBwb2ludGVyIHRvIGV4dHJhIGZpZWxkIG9yIFpfTlVMTCBpZiBub25lICovXG4gIHRoaXMuZXh0cmEgICAgICA9IG51bGw7XG4gIC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAodmFsaWQgaWYgZXh0cmEgIT0gWl9OVUxMKSAqL1xuICB0aGlzLmV4dHJhX2xlbiAgPSAwOyAvLyBBY3R1YWxseSwgd2UgZG9uJ3QgbmVlZCBpdCBpbiBKUyxcbiAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGxlYXZlIGZvciBmZXcgY29kZSBtb2RpZmljYXRpb25zXG5cbiAgLy9cbiAgLy8gU2V0dXAgbGltaXRzIGlzIG5vdCBuZWNlc3NhcnkgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeVxuICAvLyBmb3IgaW5mbGF0ZSB1c2UgY29uc3RhbnQgbGltaXQgaW4gNjU1MzYgYnl0ZXNcbiAgLy9cblxuICAvKiBzcGFjZSBhdCBleHRyYSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLmV4dHJhX21heCAgPSAwO1xuICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBmaWxlIG5hbWUgb3IgWl9OVUxMICovXG4gIHRoaXMubmFtZSAgICAgICA9ICcnO1xuICAvKiBzcGFjZSBhdCBuYW1lIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMubmFtZV9tYXggICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGNvbW1lbnQgb3IgWl9OVUxMICovXG4gIHRoaXMuY29tbWVudCAgICA9ICcnO1xuICAvKiBzcGFjZSBhdCBjb21tZW50IChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMuY29tbV9tYXggICA9IDA7XG4gIC8qIHRydWUgaWYgdGhlcmUgd2FzIG9yIHdpbGwgYmUgYSBoZWFkZXIgY3JjICovXG4gIHRoaXMuaGNyYyAgICAgICA9IDA7XG4gIC8qIHRydWUgd2hlbiBkb25lIHJlYWRpbmcgZ3ppcCBoZWFkZXIgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi9cbiAgdGhpcy5kb25lICAgICAgID0gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gR1poZWFkZXI7XG5cbn0se31dLDMxMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuLy8gU2VlIHN0YXRlIGRlZnMgZnJvbSBpbmZsYXRlLmpzXG52YXIgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xuXG4vKlxuICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZ1xuICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzXG4gICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLlxuICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvclxuICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZVxuICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuXG5cbiAgIEVudHJ5IGFzc3VtcHRpb25zOlxuXG4gICAgICAgIHN0YXRlLm1vZGUgPT09IExFTlxuICAgICAgICBzdHJtLmF2YWlsX2luID49IDZcbiAgICAgICAgc3RybS5hdmFpbF9vdXQgPj0gMjU4XG4gICAgICAgIHN0YXJ0ID49IHN0cm0uYXZhaWxfb3V0XG4gICAgICAgIHN0YXRlLmJpdHMgPCA4XG5cbiAgIE9uIHJldHVybiwgc3RhdGUubW9kZSBpcyBvbmUgb2Y6XG5cbiAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0XG4gICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrXG4gICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhXG5cbiAgIE5vdGVzOlxuXG4gICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGVcbiAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLFxuICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy5cbiAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkXG4gICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLlxuXG4gICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4XG4gICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KClcbiAgICAgIHJlcXVpcmVzIHN0cm0uYXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvclxuICAgICAgb3V0cHV0IHNwYWNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkge1xuICB2YXIgc3RhdGU7XG4gIHZhciBfaW47ICAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmlucHV0ICovXG4gIHZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBoYXZlIGVub3VnaCBpbnB1dCB3aGlsZSBpbiA8IGxhc3QgKi9cbiAgdmFyIF9vdXQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBiZWc7ICAgICAgICAgICAgICAgICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBvdXQgPCBlbmQsIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgKi9cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIHZhciBkbWF4OyAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20gemxpYiBoZWFkZXIgKi9cbi8vI2VuZGlmXG4gIHZhciB3c2l6ZTsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdmFyIHdoYXZlOyAgICAgICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdmFyIHduZXh0OyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICAvLyBVc2UgYHNfd2luZG93YCBpbnN0ZWFkIGB3aW5kb3dgLCBhdm9pZCBjb25mbGljdCB3aXRoIGluc3RydW1lbnRhdGlvbiB0b29sc1xuICB2YXIgc193aW5kb3c7ICAgICAgICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3c2l6ZSAhPSAwICovXG4gIHZhciBob2xkOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmhvbGQgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uYml0cyAqL1xuICB2YXIgbGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5sZW5jb2RlICovXG4gIHZhciBkY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmRpc3Rjb2RlICovXG4gIHZhciBsbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi9cbiAgdmFyIGRtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovXG4gIHZhciBoZXJlOyAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZWQgdGFibGUgZW50cnkgKi9cbiAgdmFyIG9wOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCwgdW51c2VkIGJ5dGVzICovXG4gIHZhciBkaXN0OyAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqL1xuICB2YXIgZnJvbTsgICAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovXG4gIHZhciBmcm9tX3NvdXJjZTtcblxuXG4gIHZhciBpbnB1dCwgb3V0cHV0OyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG5cbiAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi9cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICAvL2hlcmUgPSBzdGF0ZS5oZXJlO1xuICBfaW4gPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7XG4gIF9vdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTtcbiAgZW5kID0gX291dCArIChzdHJtLmF2YWlsX291dCAtIDI1Nyk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICBkbWF4ID0gc3RhdGUuZG1heDtcbi8vI2VuZGlmXG4gIHdzaXplID0gc3RhdGUud3NpemU7XG4gIHdoYXZlID0gc3RhdGUud2hhdmU7XG4gIHduZXh0ID0gc3RhdGUud25leHQ7XG4gIHNfd2luZG93ID0gc3RhdGUud2luZG93O1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIGxjb2RlID0gc3RhdGUubGVuY29kZTtcbiAgZGNvZGUgPSBzdGF0ZS5kaXN0Y29kZTtcbiAgbG1hc2sgPSAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDE7XG4gIGRtYXNrID0gKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMTtcblxuXG4gIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaFxuICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqL1xuXG4gIHRvcDpcbiAgZG8ge1xuICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgIH1cblxuICAgIGhlcmUgPSBsY29kZVtob2xkICYgbG1hc2tdO1xuXG4gICAgZG9sZW46XG4gICAgZm9yICg7OykgeyAvLyBHb3RvIGVtdWxhdGlvblxuICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICBob2xkID4+Pj0gb3A7XG4gICAgICBiaXRzIC09IG9wO1xuICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuICAgICAgaWYgKG9wID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIG91dHB1dFtfb3V0KytdID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqL1xuICAgICAgICBsZW4gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICBpZiAob3ApIHtcbiAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW4gKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBsZW4pKTtcbiAgICAgICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGhlcmUgPSBkY29kZVtob2xkICYgZG1hc2tdO1xuXG4gICAgICAgIGRvZGlzdDpcbiAgICAgICAgZm9yICg7OykgeyAvLyBnb3RvIGVtdWxhdGlvblxuICAgICAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcblxuICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi9cbiAgICAgICAgICAgIGRpc3QgPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgICAgIGlmIChkaXN0ID4gZG1heCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBkaXN0KSk7XG4gICAgICAgICAgICBvcCA9IF9vdXQgLSBiZWc7ICAgICAgICAgICAgICAgIC8qIG1heCBkaXN0YW5jZSBpbiBvdXRwdXQgKi9cbiAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgICAgICB9XG5cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYXVsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gb3AgLSB3aGF2ZSkge1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgIGxlbiAtPSBvcCAtIHdoYXZlO1xuLy8gICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpO1xuLy8gICAgICAgICAgICAgICAgaWYgKG9wID09PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmcm9tID0gMDsgLy8gd2luZG93IGluZGV4XG4gICAgICAgICAgICAgIGZyb21fc291cmNlID0gc193aW5kb3c7XG4gICAgICAgICAgICAgIGlmICh3bmV4dCA9PT0gMCkgeyAgICAgICAgICAgLyogdmVyeSBjb21tb24gY2FzZSAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHduZXh0IDwgb3ApIHsgICAgICAvKiB3cmFwIGFyb3VuZCB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBvcCAtPSB3bmV4dDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gZW5kIG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSAwO1xuICAgICAgICAgICAgICAgICAgaWYgKHduZXh0IDwgbGVuKSB7ICAvKiBzb21lIGZyb20gc3RhcnQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICAgIG9wID0gd25leHQ7XG4gICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogY29udGlndW91cyBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgICAgIC8qIGNvcHkgZGlyZWN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGxlbmd0aCBpcyB0aHJlZSAqL1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gPiAyKTtcbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAvKiAybmQgbGV2ZWwgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICAgICAgaGVyZSA9IGRjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgICAgICBjb250aW51ZSBkb2Rpc3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgaGVyZSA9IGxjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgIGNvbnRpbnVlIGRvbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuXG4gICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgIH1cbiAgfSB3aGlsZSAoX2luIDwgbGFzdCAmJiBfb3V0IDwgZW5kKTtcblxuICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi9cbiAgbGVuID0gYml0cyA+PiAzO1xuICBfaW4gLT0gbGVuO1xuICBiaXRzIC09IGxlbiA8PCAzO1xuICBob2xkICY9ICgxIDw8IGJpdHMpIC0gMTtcblxuICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJldHVybiAqL1xuICBzdHJtLm5leHRfaW4gPSBfaW47XG4gIHN0cm0ubmV4dF9vdXQgPSBfb3V0O1xuICBzdHJtLmF2YWlsX2luID0gKF9pbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBfaW4pIDogNSAtIChfaW4gLSBsYXN0KSk7XG4gIHN0cm0uYXZhaWxfb3V0ID0gKF9vdXQgPCBlbmQgPyAyNTcgKyAoZW5kIC0gX291dCkgOiAyNTcgLSAoX291dCAtIGVuZCkpO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIHJldHVybjtcbn07XG5cbn0se31dLDMxMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzICAgICAgICAgPSBfZGVyZXFfKCcuLi91dGlscy9jb21tb24nKTtcbnZhciBhZGxlcjMyICAgICAgID0gX2RlcmVxXygnLi9hZGxlcjMyJyk7XG52YXIgY3JjMzIgICAgICAgICA9IF9kZXJlcV8oJy4vY3JjMzInKTtcbnZhciBpbmZsYXRlX2Zhc3QgID0gX2RlcmVxXygnLi9pbmZmYXN0Jyk7XG52YXIgaW5mbGF0ZV90YWJsZSA9IF9kZXJlcV8oJy4vaW5mdHJlZXMnKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbi8vdmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG4vL3ZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbi8vdmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xudmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbnZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG4vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cblxuLyogU1RBVEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyICAgIEhFQUQgPSAxOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi9cbnZhciAgICBGTEFHUyA9IDI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi9cbnZhciAgICBUSU1FID0gMzsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovXG52YXIgICAgT1MgPSA0OyAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqL1xudmFyICAgIEVYTEVOID0gNTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovXG52YXIgICAgRVhUUkEgPSA2OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqL1xudmFyICAgIE5BTUUgPSA3OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqL1xudmFyICAgIENPTU1FTlQgPSA4OyAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi9cbnZhciAgICBIQ1JDID0gOTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi9cbnZhciAgICBESUNUSUQgPSAxMDsgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqL1xudmFyICAgIERJQ1QgPSAxMTsgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi9cbnZhciAgICAgICAgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cbnZhciAgICAgICAgVFlQRURPID0gMTM7ICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi9cbnZhciAgICAgICAgU1RPUkVEID0gMTQ7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovXG52YXIgICAgICAgIENPUFlfID0gMTU7ICAgICAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICBDT1BZID0gMTY7ICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi9cbnZhciAgICAgICAgVEFCTEUgPSAxNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqL1xudmFyICAgICAgICBMRU5MRU5TID0gMTg7ICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG52YXIgICAgICAgIENPREVMRU5TID0gMTk7ICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgICAgIExFTl8gPSAyMDsgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICAgICAgTEVOID0gMjE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi9cbnZhciAgICAgICAgICAgIExFTkVYVCA9IDIyOyAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqL1xudmFyICAgICAgICAgICAgRElTVCA9IDIzOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi9cbnZhciAgICAgICAgICAgIERJU1RFWFQgPSAyNDsgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBNQVRDSCA9IDI1OyAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovXG52YXIgICAgICAgICAgICBMSVQgPSAyNjsgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi9cbnZhciAgICBDSEVDSyA9IDI3OyAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGNoZWNrIHZhbHVlICovXG52YXIgICAgTEVOR1RIID0gMjg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovXG52YXIgICAgRE9ORSA9IDI5OyAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBNRU0gPSAzMTsgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBTWU5DID0gMzI7ICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuXG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gIChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgTUFYX1dCSVRTID0gMTU7XG4vKiAzMksgTFo3NyB3aW5kb3cgKi9cbnZhciBERUZfV0JJVFMgPSBNQVhfV0JJVFM7XG5cblxuZnVuY3Rpb24genN3YXAzMihxKSB7XG4gIHJldHVybiAgKCgocSA+Pj4gMjQpICYgMHhmZikgK1xuICAgICAgICAgICgocSA+Pj4gOCkgJiAweGZmMDApICtcbiAgICAgICAgICAoKHEgJiAweGZmMDApIDw8IDgpICtcbiAgICAgICAgICAoKHEgJiAweGZmKSA8PCAyNCkpO1xufVxuXG5cbmZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5tb2RlID0gMDsgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi9cbiAgdGhpcy5sYXN0ID0gZmFsc2U7ICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi9cbiAgdGhpcy5mbGFncyA9IDA7ICAgICAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi9cbiAgdGhpcy5kbWF4ID0gMDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovXG4gIHRoaXMuY2hlY2sgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLnRvdGFsID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovXG4gIC8vIFRPRE86IG1heSBiZSB7fVxuICB0aGlzLmhlYWQgPSBudWxsOyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqL1xuXG4gIC8qIHNsaWRpbmcgd2luZG93ICovXG4gIHRoaXMud2JpdHMgPSAwOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqL1xuICB0aGlzLndzaXplID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHRoaXMud2hhdmUgPSAwOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHRoaXMud25leHQgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgdGhpcy53aW5kb3cgPSBudWxsOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovXG5cbiAgLyogYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuaG9sZCA9IDA7ICAgICAgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5iaXRzID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIFwiaW5cIiAqL1xuXG4gIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovXG4gIHRoaXMubGVuZ3RoID0gMDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi9cbiAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqL1xuXG4gIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqL1xuICB0aGlzLmV4dHJhID0gMDsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi9cblxuICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmNvZGUgPSBudWxsOyAgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi9cbiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovXG4gIHRoaXMubGVuYml0cyA9IDA7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovXG4gIHRoaXMuZGlzdGJpdHMgPSAwOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqL1xuXG4gIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi9cbiAgdGhpcy5uY29kZSA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5ubGVuID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmRpc3QgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG4gIHRoaXMuaGF2ZSA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqL1xuICB0aGlzLm5leHQgPSBudWxsOyAgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqL1xuXG4gIHRoaXMubGVucyA9IG5ldyB1dGlscy5CdWYxNigzMjApOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovXG4gIHRoaXMud29yayA9IG5ldyB1dGlscy5CdWYxNigyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi9cblxuICAvKlxuICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBhbmQgZGlzdGNvZGUgZGlyZWN0bHlcbiAgIGFzIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbmVlZCBjb2Rlc1xuICAqL1xuICAvL3RoaXMuY29kZXMgPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIKTsgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuZHluID0gbnVsbDsgICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5kaXN0ZHluID0gbnVsbDsgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLnNhbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBpZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovXG4gIHRoaXMuYmFjayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgYmFjayBvZiBsYXN0IHVucHJvY2Vzc2VkIGxlbmd0aC9saXQgKi9cbiAgdGhpcy53YXMgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi9cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gc3RhdGUudG90YWwgPSAwO1xuICBzdHJtLm1zZyA9ICcnOyAvKlpfTlVMTCovXG4gIGlmIChzdGF0ZS53cmFwKSB7ICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi9cbiAgICBzdHJtLmFkbGVyID0gc3RhdGUud3JhcCAmIDE7XG4gIH1cbiAgc3RhdGUubW9kZSA9IEhFQUQ7XG4gIHN0YXRlLmxhc3QgPSAwO1xuICBzdGF0ZS5oYXZlZGljdCA9IDA7XG4gIHN0YXRlLmRtYXggPSAzMjc2ODtcbiAgc3RhdGUuaGVhZCA9IG51bGwvKlpfTlVMTCovO1xuICBzdGF0ZS5ob2xkID0gMDtcbiAgc3RhdGUuYml0cyA9IDA7XG4gIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9MRU5TKTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9ESVNUUyk7XG5cbiAgc3RhdGUuc2FuZSA9IDE7XG4gIHN0YXRlLmJhY2sgPSAtMTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiByZXNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0YXRlLndzaXplID0gMDtcbiAgc3RhdGUud2hhdmUgPSAwO1xuICBzdGF0ZS53bmV4dCA9IDA7XG4gIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgd3JhcDtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGdldCB0aGUgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogZXh0cmFjdCB3cmFwIHJlcXVlc3QgZnJvbSB3aW5kb3dCaXRzIHBhcmFtZXRlciAqL1xuICBpZiAod2luZG93Qml0cyA8IDApIHtcbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgd3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTtcbiAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7XG4gICAgICB3aW5kb3dCaXRzICY9IDE1O1xuICAgIH1cbiAgfVxuXG4gIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqL1xuICBpZiAod2luZG93Qml0cyAmJiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICBpZiAoc3RhdGUud2luZG93ICE9PSBudWxsICYmIHN0YXRlLndiaXRzICE9PSB3aW5kb3dCaXRzKSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi9cbiAgc3RhdGUud3JhcCA9IHdyYXA7XG4gIHN0YXRlLndiaXRzID0gd2luZG93Qml0cztcbiAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHJldDtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgLy9zdHJtLm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovXG5cbiAgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7XG5cbiAgLy9pZiAoc3RhdGUgPT09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IGFsbG9jYXRlZFxcblwiKSk7XG4gIHN0cm0uc3RhdGUgPSBzdGF0ZTtcbiAgc3RhdGUud2luZG93ID0gbnVsbC8qWl9OVUxMKi87XG4gIHJldCA9IGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cyk7XG4gIGlmIChyZXQgIT09IFpfT0spIHtcbiAgICBzdHJtLnN0YXRlID0gbnVsbC8qWl9OVUxMKi87XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQoc3RybSkge1xuICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7XG59XG5cblxuLypcbiBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvXG4gZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLlxuIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGVcbiBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kXG4gdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW5cbiBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmVcbiB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luXG4gbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS5cbiAqL1xudmFyIHZpcmdpbiA9IHRydWU7XG5cbnZhciBsZW5maXgsIGRpc3RmaXg7IC8vIFdlIGhhdmUgbm8gcG9pbnRlcnMgaW4gSlMsIHNvIGtlZXAgdGFibGVzIHNlcGFyYXRlXG5cbmZ1bmN0aW9uIGZpeGVkdGFibGVzKHN0YXRlKSB7XG4gIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovXG4gIGlmICh2aXJnaW4pIHtcbiAgICB2YXIgc3ltO1xuXG4gICAgbGVuZml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDUxMik7XG4gICAgZGlzdGZpeCA9IG5ldyB1dGlscy5CdWYzMigzMik7XG5cbiAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDE0NCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjU2KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gOTsgfVxuICAgIHdoaWxlIChzeW0gPCAyODApIHsgc3RhdGUubGVuc1tzeW0rK10gPSA3OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4OCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cblxuICAgIGluZmxhdGVfdGFibGUoTEVOUywgIHN0YXRlLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAgIDAsIHN0YXRlLndvcmssIHsgYml0czogOSB9KTtcblxuICAgIC8qIGRpc3RhbmNlIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMzIpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA1OyB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCAwLCAzMiwgICBkaXN0Zml4LCAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDUgfSk7XG5cbiAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqL1xuICAgIHZpcmdpbiA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGUubGVuY29kZSA9IGxlbmZpeDtcbiAgc3RhdGUubGVuYml0cyA9IDk7XG4gIHN0YXRlLmRpc3Rjb2RlID0gZGlzdGZpeDtcbiAgc3RhdGUuZGlzdGJpdHMgPSA1O1xufVxuXG5cbi8qXG4gVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZVxuIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWRcbiB3aGVuIGEgd2luZG93IGlzIGFscmVhZHkgaW4gdXNlLCBvciB3aGVuIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzXG4gaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LlxuIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5XG4gaXMgbG9hZGVkLlxuXG4gUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZFxuIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3dcbiB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZlxuIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci5cbiBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLlxuICovXG5mdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSwgc3JjLCBlbmQsIGNvcHkpIHtcbiAgdmFyIGRpc3Q7XG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqL1xuICBpZiAoc3RhdGUud2luZG93ID09PSBudWxsKSB7XG4gICAgc3RhdGUud3NpemUgPSAxIDw8IHN0YXRlLndiaXRzO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IDA7XG5cbiAgICBzdGF0ZS53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzdGF0ZS53c2l6ZSk7XG4gIH1cblxuICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi9cbiAgaWYgKGNvcHkgPj0gc3RhdGUud3NpemUpIHtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gc3RhdGUud3NpemUsIHN0YXRlLndzaXplLCAwKTtcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBkaXN0ID0gc3RhdGUud3NpemUgLSBzdGF0ZS53bmV4dDtcbiAgICBpZiAoZGlzdCA+IGNvcHkpIHtcbiAgICAgIGRpc3QgPSBjb3B5O1xuICAgIH1cbiAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwgZW5kIC0gY29weSwgZGlzdCk7XG4gICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGRpc3QsIHN0YXRlLnduZXh0KTtcbiAgICBjb3B5IC09IGRpc3Q7XG4gICAgaWYgKGNvcHkpIHtcbiAgICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93LCBlbmQgLSBjb3B5LCBjb3B5KTtcbiAgICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBjb3B5LCAwKTtcbiAgICAgIHN0YXRlLnduZXh0ID0gY29weTtcbiAgICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3RhdGUud25leHQgKz0gZGlzdDtcbiAgICAgIGlmIChzdGF0ZS53bmV4dCA9PT0gc3RhdGUud3NpemUpIHsgc3RhdGUud25leHQgPSAwOyB9XG4gICAgICBpZiAoc3RhdGUud2hhdmUgPCBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53aGF2ZSArPSBkaXN0OyB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlKHN0cm0sIGZsdXNoKSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIGlucHV0LCBvdXRwdXQ7ICAgICAgICAgIC8vIGlucHV0L291dHB1dCBidWZmZXJzXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGlucHV0IElOREVYICovXG4gIHZhciBwdXQ7ICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IG91dHB1dCBJTkRFWCAqL1xuICB2YXIgaGF2ZSwgbGVmdDsgICAgICAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqL1xuICB2YXIgX2luLCBfb3V0OyAgICAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgY29weTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuICB2YXIgaGVyZSA9IDA7ICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqL1xuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsgLy8gcGFrZWQgXCJoZXJlXCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgLy92YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovXG4gIHZhciBsYXN0X2JpdHMsIGxhc3Rfb3AsIGxhc3RfdmFsOyAvLyBwYWtlZCBcImxhc3RcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqL1xuICB2YXIgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi9cbiAgdmFyIGhidWYgPSBuZXcgdXRpbHMuQnVmOCg0KTsgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi9cbiAgdmFyIG9wdHM7XG5cbiAgdmFyIG47IC8vIHRlbXBvcmFyeSB2YXIgZm9yIE5FRURfQklUU1xuXG4gIHZhciBvcmRlciA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqL1xuICAgIFsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSBdO1xuXG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8ICFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgeyBzdGF0ZS5tb2RlID0gVFlQRURPOyB9ICAgIC8qIHNraXAgY2hlY2sgKi9cblxuXG4gIC8vLS0tIExPQUQoKSAtLS1cbiAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAvLy0tLVxuXG4gIF9pbiA9IGhhdmU7XG4gIF9vdXQgPSBsZWZ0O1xuICByZXQgPSBaX09LO1xuXG4gIGluZl9sZWF2ZTogLy8gZ290byBlbXVsYXRpb25cbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoc3RhdGUubW9kZSkge1xuICAgICAgY2FzZSBIRUFEOlxuICAgICAgICBpZiAoc3RhdGUud3JhcCA9PT0gMCkge1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmICgoc3RhdGUud3JhcCAmIDIpICYmIGhvbGQgPT09IDB4OGIxZikgeyAgLyogZ3ppcCBoZWFkZXIgKi9cbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IDAvKmNyYzMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cblxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBGTEFHUztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5mbGFncyA9IDA7ICAgICAgICAgICAvKiBleHBlY3QgemxpYiBoZWFkZXIgKi9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShzdGF0ZS53cmFwICYgMSkgfHwgICAvKiBjaGVjayBpZiB6bGliIGhlYWRlciBhbGxvd2VkICovXG4gICAgICAgICAgKCgoaG9sZCAmIDB4ZmYpLypCSVRTKDgpKi8gPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBoZWFkZXIgY2hlY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChob2xkICYgMHgwZikvKkJJVFMoNCkqLyAhPT0gWl9ERUZMQVRFRCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA0O1xuICAgICAgICBiaXRzIC09IDQ7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgbGVuID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgODtcbiAgICAgICAgaWYgKHN0YXRlLndiaXRzID09PSAwKSB7XG4gICAgICAgICAgc3RhdGUud2JpdHMgPSBsZW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUud2JpdHMpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHdpbmRvdyBzaXplJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmRtYXggPSAxIDw8IGxlbjtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXFxuXCIpKTtcbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgICBzdGF0ZS5tb2RlID0gaG9sZCAmIDB4MjAwID8gRElDVElEIDogVFlQRTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGTEFHUzpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmZsYWdzID0gaG9sZDtcbiAgICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4ZmYpICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHhlMDAwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC50ZXh0ID0gKChob2xkID4+IDgpICYgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IFRJTUU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVElNRTpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkM0KHN0YXRlLmNoZWNrLCBob2xkKVxuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzJdID0gKGhvbGQgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlszXSA9IChob2xkID4+PiAyNCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDQsIDApO1xuICAgICAgICAgIC8vPT09XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBPUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBPUzpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSAoaG9sZCAmIDB4ZmYpO1xuICAgICAgICAgIHN0YXRlLmhlYWQub3MgPSAoaG9sZCA+PiA4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRVhMRU47XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRVhMRU46XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZDtcbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBudWxsLypaX05VTEwqLztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRVhUUkE6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7IGNvcHkgPSBoYXZlOyB9XG4gICAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICAgIGxlbiA9IHN0YXRlLmhlYWQuZXh0cmFfbGVuIC0gc3RhdGUubGVuZ3RoO1xuICAgICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdW50eXBlZCBhcnJheSBmb3IgbW9yZSBjb252ZW5pZW50IHByb2Nlc3NpbmcgbGF0ZXJcbiAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbmV3IEFycmF5KHN0YXRlLmhlYWQuZXh0cmFfbGVuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB1dGlscy5hcnJheVNldChcbiAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgICAgLy8gZXh0cmEgZmllbGQgaXMgbGltaXRlZCB0byA2NTUzNiBieXRlc1xuICAgICAgICAgICAgICAgIC8vIC0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBzaXplIGNoZWNrXG4gICAgICAgICAgICAgICAgY29weSxcbiAgICAgICAgICAgICAgICAvKmxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA/IHN0YXRlLmhlYWQuZXh0cmFfbWF4IDogY29weSwqL1xuICAgICAgICAgICAgICAgIGxlblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvL3ptZW1jcHkoc3RhdGUuaGVhZC5leHRyYSArIGxlbiwgbmV4dCxcbiAgICAgICAgICAgICAgLy8gICAgICAgIGxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCA/XG4gICAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA6IGNvcHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBOQU1FO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIE5BTUU6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDgwMCkge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGNvcHkgPSAwO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIFRPRE86IDIgb3IgMSBieXRlcz9cbiAgICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQubmFtZV9tYXgqLykpIHtcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5uYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5uYW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sZW5ndGggPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQ09NTUVOVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT01NRU5UOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDEwMDApIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBjb3B5ID0gMDtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBsZW4gPSBpbnB1dFtuZXh0ICsgY29weSsrXTtcbiAgICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLmNvbW1fbWF4Ki8pKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuY29tbWVudCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIEhDUkM6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDB4ZmZmZikpIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2hlYWRlciBjcmMgbWlzbWF0Y2gnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuaGNyYyA9ICgoc3RhdGUuZmxhZ3MgPj4gOSkgJiAxKTtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElDVElEOlxuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0genN3YXAzMihob2xkKTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBESUNUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJQ1Q6XG4gICAgICAgIGlmIChzdGF0ZS5oYXZlZGljdCA9PT0gMCkge1xuICAgICAgICAgIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAgICAgICAgIC8vLS0tXG4gICAgICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUO1xuICAgICAgICB9XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVFlQRTpcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0JMT0NLIHx8IGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIFRZUEVETzpcbiAgICAgICAgaWYgKHN0YXRlLmxhc3QpIHtcbiAgICAgICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBDSEVDSztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBORUVEQklUUygzKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxhc3QgPSAoaG9sZCAmIDB4MDEpLypCSVRTKDEpKi87XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDEpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAxO1xuICAgICAgICBiaXRzIC09IDE7XG4gICAgICAgIC8vLS0tLy9cblxuICAgICAgICBzd2l0Y2ggKChob2xkICYgMHgwMykvKkJJVFMoMikqLykge1xuICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqL1xuICAgICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gU1RPUkVEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi9cbiAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTtcbiAgICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGZpeGVkIGNvZGVzIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXzsgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovXG4gICAgICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovXG4gICAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gVEFCTEU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJsb2NrIHR5cGUnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTVE9SRUQ6XG4gICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy8gLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqL1xuICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT09ICgoaG9sZCA+Pj4gMTYpIF4gMHhmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZCAmIDB4ZmZmZjtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT1BZXztcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPUFlfOlxuICAgICAgICBzdGF0ZS5tb2RlID0gQ09QWTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT1BZOlxuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgICAgIGlmIChjb3B5ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIC8vLS0tIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsgLS0tXG4gICAgICAgICAgdXRpbHMuYXJyYXlTZXQob3V0cHV0LCBpbnB1dCwgbmV4dCwgY29weSwgcHV0KTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgICAgcHV0ICs9IGNvcHk7XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUQUJMRTpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTQpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE0KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm5sZW4gPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAyNTc7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgICBiaXRzIC09IDU7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAxO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyg1KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNTtcbiAgICAgICAgYml0cyAtPSA1O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm5jb2RlID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgNDtcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICAgIGJpdHMgLT0gNDtcbiAgICAgICAgLy8tLS0vL1xuLy8jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5EXG4gICAgICAgIGlmIChzdGF0ZS5ubGVuID4gMjg2IHx8IHN0YXRlLm5kaXN0ID4gMzApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmhhdmUgPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOTEVOUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5MRU5TOlxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IDM7XG4gICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7XG4gICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy9zdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gICAgICAgIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG4gICAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluO1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gNztcblxuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLmxlbnMsIDAsIDE5LCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgY29kZSBsZW5ndGhzIG9rXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT0RFTEVOUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT0RFTEVOUzpcbiAgICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7XG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK10gPSBoZXJlX3ZhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaGVyZV92YWwgPT09IDE2KSB7XG4gICAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDIpO1xuICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjtcbiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxlbiA9IHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSAtIDFdO1xuICAgICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwMyk7Ly9CSVRTKDIpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcpIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMyk7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAzO1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgNyk7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3O1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDB4N2YpOy8vQklUUyg3KTtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoNykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDc7XG4gICAgICAgICAgICAgIGJpdHMgLT0gNztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pIHtcbiAgICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi9cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IEJBRCkgeyBicmVhazsgfVxuXG4gICAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqL1xuICAgICAgICBpZiAoc3RhdGUubGVuc1syNTZdID09PSAwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0c1xuICAgICAgICAgICB2YWx1ZXMgaGVyZSAoOSBhbmQgNikgd2l0aG91dCByZWFkaW5nIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oXG4gICAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi9cbiAgICAgICAgc3RhdGUubGVuYml0cyA9IDk7XG5cbiAgICAgICAgb3B0cyA9IHsgYml0czogc3RhdGUubGVuYml0cyB9O1xuICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLmxlbnMsIDAsIHN0YXRlLm5sZW4sIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcbiAgICAgICAgLy8gc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLmRpc3RiaXRzID0gNjtcbiAgICAgICAgLy9zdGF0ZS5kaXN0Y29kZS5jb3B5KHN0YXRlLmNvZGVzKTtcbiAgICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICAgIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5bjtcbiAgICAgICAgb3B0cyA9IHsgYml0czogc3RhdGUuZGlzdGJpdHMgfTtcbiAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgICAvLyBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2VzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCAnaW5mbGF0ZTogICAgICAgY29kZXMgb2tcXG4nKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fO1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOXzpcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU46XG4gICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHtcbiAgICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgICAvLy0tLVxuICAgICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBfb3V0KTtcbiAgICAgICAgICAvLy0tLSBMT0FEKCkgLS0tXG4gICAgICAgICAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgICAgICAgICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgICAgICAgICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7XG4gICAgICAgICAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgICAgICAgICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gICAgICAgICAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47XG4gICAgICAgICAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gICAgICAgICAgYml0cyA9IHN0YXRlLmJpdHM7XG4gICAgICAgICAgLy8tLS1cblxuICAgICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7XG4gICAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmJhY2sgPSAwO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsgIC8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmJiAoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKS8qQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSovID4+IGxhc3RfYml0cyldO1xuICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgICAgc3RhdGUubGVuZ3RoID0gaGVyZV92YWw7XG4gICAgICAgIGlmIChoZXJlX29wID09PSAwKSB7XG4gICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xcblwiIDpcbiAgICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IExJVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmIDMyKSB7XG4gICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcXG5cIikpO1xuICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmV4dHJhID0gaGVyZV9vcCAmIDE1O1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVORVhUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkVYVDpcbiAgICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gaG9sZCAmICgoMSA8PCBzdGF0ZS5leHRyYSkgLSAxKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgICAgc3RhdGUud2FzID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBzdGF0ZS5tb2RlID0gRElTVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBESVNUOlxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5kaXN0Yml0cykqL1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICBpZiAoKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5kaXN0Y29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm9mZnNldCA9IGhlcmVfdmFsO1xuICAgICAgICBzdGF0ZS5leHRyYSA9IChoZXJlX29wKSAmIDE1O1xuICAgICAgICBzdGF0ZS5tb2RlID0gRElTVEVYVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBESVNURVhUOlxuICAgICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLm9mZnNldCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgICB9XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gc3RhdGUuZG1heCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIHN0YXRlLm9mZnNldCkpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTUFUQ0g7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTUFUQ0g6XG4gICAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBjb3B5ID0gX291dCAtIGxlZnQ7XG4gICAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5vZmZzZXQgLSBjb3B5O1xuICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4vLyAgICAgICAgICBUcmFjZSgoc3RkZXJyLCBcImluZmxhdGUuYyB0b28gZmFyXFxuXCIpKTtcbi8vICAgICAgICAgIGNvcHkgLT0gc3RhdGUud2hhdmU7XG4vLyAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4vLyAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbi8vICAgICAgICAgIGxlZnQgLT0gY29weTtcbi8vICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuLy8gICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICBvdXRwdXRbcHV0KytdID0gMDtcbi8vICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7XG4vLyAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7IHN0YXRlLm1vZGUgPSBMRU47IH1cbi8vICAgICAgICAgIGJyZWFrO1xuLy8jZW5kaWZcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53bmV4dCkge1xuICAgICAgICAgICAgY29weSAtPSBzdGF0ZS53bmV4dDtcbiAgICAgICAgICAgIGZyb20gPSBzdGF0ZS53c2l6ZSAtIGNvcHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZnJvbSA9IHN0YXRlLnduZXh0IC0gY29weTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuICAgICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUub2Zmc2V0O1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBvdXRwdXRbcHV0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbiAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMSVQ6XG4gICAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBvdXRwdXRbcHV0KytdID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBsZWZ0LS07XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDSEVDSzpcbiAgICAgICAgaWYgKHN0YXRlLndyYXApIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAvLyBVc2UgJ3wnIGluc3RlYWQgb2YgJysnIHRvIG1ha2Ugc3VyZSB0aGF0IHJlc3VsdCBpcyBzaWduZWRcbiAgICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgX291dCAtPSBsZWZ0O1xuICAgICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gICAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgICAgICAgICBpZiAoX291dCkge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID1cbiAgICAgICAgICAgICAgICAvKlVQREFURShzdGF0ZS5jaGVjaywgcHV0IC0gX291dCwgX291dCk7Ki9cbiAgICAgICAgICAgICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkpO1xuXG4gICAgICAgICAgfVxuICAgICAgICAgIF9vdXQgPSBsZWZ0O1xuICAgICAgICAgIC8vIE5COiBjcmMzMiBzdG9yZWQgYXMgc2lnbmVkIDMyLWJpdCBpbnQsIHpzd2FwMzIgcmV0dXJucyBzaWduZWQgdG9vXG4gICAgICAgICAgaWYgKChzdGF0ZS5mbGFncyA/IGhvbGQgOiB6c3dhcDMyKGhvbGQpKSAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBkYXRhIGNoZWNrJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGNoZWNrIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IExFTkdUSDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5HVEg6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwICYmIHN0YXRlLmZsYWdzKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLnRvdGFsICYgMHhmZmZmZmZmZikpIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBsZW5ndGggY2hlY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgbGVuZ3RoIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IERPTkU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRE9ORTpcbiAgICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EO1xuICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICBjYXNlIEJBRDpcbiAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SO1xuICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICBjYXNlIE1FTTpcbiAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgICAgY2FzZSBTWU5DOlxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5mX2xlYXZlIDwtIGhlcmUgaXMgcmVhbCBwbGFjZSBmb3IgXCJnb3RvIGluZl9sZWF2ZVwiLCBlbXVsYXRlZCB2aWEgXCJicmVhayBpbmZfbGVhdmVcIlxuXG4gIC8qXG4gICAgIFJldHVybiBmcm9tIGluZmxhdGUoKSwgdXBkYXRpbmcgdGhlIHRvdGFsIGNvdW50cyBhbmQgdGhlIGNoZWNrIHZhbHVlLlxuICAgICBJZiB0aGVyZSB3YXMgbm8gcHJvZ3Jlc3MgZHVyaW5nIHRoZSBpbmZsYXRlKCkgY2FsbCwgcmV0dXJuIGEgYnVmZmVyXG4gICAgIGVycm9yLiAgQ2FsbCB1cGRhdGV3aW5kb3coKSB0byBjcmVhdGUgYW5kL29yIHVwZGF0ZSB0aGUgd2luZG93IHN0YXRlLlxuICAgICBOb3RlOiBhIG1lbW9yeSBlcnJvciBmcm9tIGluZmxhdGUoKSBpcyBub24tcmVjb3ZlcmFibGUuXG4gICAqL1xuXG4gIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAvLy0tLVxuXG4gIGlmIChzdGF0ZS53c2l6ZSB8fCAoX291dCAhPT0gc3RybS5hdmFpbF9vdXQgJiYgc3RhdGUubW9kZSA8IEJBRCAmJlxuICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlIDwgQ0hFQ0sgfHwgZmx1c2ggIT09IFpfRklOSVNIKSkpIHtcbiAgICBpZiAodXBkYXRld2luZG93KHN0cm0sIHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0LCBfb3V0IC0gc3RybS5hdmFpbF9vdXQpKSB7XG4gICAgICBzdGF0ZS5tb2RlID0gTUVNO1xuICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgIH1cbiAgfVxuICBfaW4gLT0gc3RybS5hdmFpbF9pbjtcbiAgX291dCAtPSBzdHJtLmF2YWlsX291dDtcbiAgc3RybS50b3RhbF9pbiArPSBfaW47XG4gIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gIGlmIChzdGF0ZS53cmFwICYmIF9vdXQpIHtcbiAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAvKlVQREFURShzdGF0ZS5jaGVjaywgc3RybS5uZXh0X291dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSk7XG4gIH1cbiAgc3RybS5kYXRhX3R5cGUgPSBzdGF0ZS5iaXRzICsgKHN0YXRlLmxhc3QgPyA2NCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IFRZUEUgPyAxMjggOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBMRU5fIHx8IHN0YXRlLm1vZGUgPT09IENPUFlfID8gMjU2IDogMCk7XG4gIGlmICgoKF9pbiA9PT0gMCAmJiBfb3V0ID09PSAwKSB8fCBmbHVzaCA9PT0gWl9GSU5JU0gpICYmIHJldCA9PT0gWl9PSykge1xuICAgIHJldCA9IFpfQlVGX0VSUk9SO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVFbmQoc3RybSkge1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSAvKnx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKHN0YXRlLndpbmRvdykge1xuICAgIHN0YXRlLndpbmRvdyA9IG51bGw7XG4gIH1cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlR2V0SGVhZGVyKHN0cm0sIGhlYWQpIHtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoKHN0YXRlLndyYXAgJiAyKSA9PT0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cblxuICAvKiBzYXZlIGhlYWRlciBzdHJ1Y3R1cmUgKi9cbiAgc3RhdGUuaGVhZCA9IGhlYWQ7XG4gIGhlYWQuZG9uZSA9IGZhbHNlO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkge1xuICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoO1xuXG4gIHZhciBzdGF0ZTtcbiAgdmFyIGRpY3RpZDtcbiAgdmFyIHJldDtcblxuICAvKiBjaGVjayBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gLyogPT0gWl9OVUxMICovIHx8ICFzdHJtLnN0YXRlIC8qID09IFpfTlVMTCAqLykgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuXG4gIGlmIChzdGF0ZS53cmFwICE9PSAwICYmIHN0YXRlLm1vZGUgIT09IERJQ1QpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICAvKiBjaGVjayBmb3IgY29ycmVjdCBkaWN0aW9uYXJ5IGlkZW50aWZpZXIgKi9cbiAgaWYgKHN0YXRlLm1vZGUgPT09IERJQ1QpIHtcbiAgICBkaWN0aWQgPSAxOyAvKiBhZGxlcjMyKDAsIG51bGwsIDApKi9cbiAgICAvKiBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7ICovXG4gICAgZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApO1xuICAgIGlmIChkaWN0aWQgIT09IHN0YXRlLmNoZWNrKSB7XG4gICAgICByZXR1cm4gWl9EQVRBX0VSUk9SO1xuICAgIH1cbiAgfVxuICAvKiBjb3B5IGRpY3Rpb25hcnkgdG8gd2luZG93IHVzaW5nIHVwZGF0ZXdpbmRvdygpLCB3aGljaCB3aWxsIGFtZW5kIHRoZVxuICAgZXhpc3RpbmcgZGljdGlvbmFyeSBpZiBhcHByb3ByaWF0ZSAqL1xuICByZXQgPSB1cGRhdGV3aW5kb3coc3RybSwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgZGljdExlbmd0aCk7XG4gIGlmIChyZXQpIHtcbiAgICBzdGF0ZS5tb2RlID0gTUVNO1xuICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgfVxuICBzdGF0ZS5oYXZlZGljdCA9IDE7XG4gIC8vIFRyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgZGljdGlvbmFyeSBzZXRcXG5cIikpO1xuICByZXR1cm4gWl9PSztcbn1cblxuZXhwb3J0cy5pbmZsYXRlUmVzZXQgPSBpbmZsYXRlUmVzZXQ7XG5leHBvcnRzLmluZmxhdGVSZXNldDIgPSBpbmZsYXRlUmVzZXQyO1xuZXhwb3J0cy5pbmZsYXRlUmVzZXRLZWVwID0gaW5mbGF0ZVJlc2V0S2VlcDtcbmV4cG9ydHMuaW5mbGF0ZUluaXQgPSBpbmZsYXRlSW5pdDtcbmV4cG9ydHMuaW5mbGF0ZUluaXQyID0gaW5mbGF0ZUluaXQyO1xuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZUVuZCA9IGluZmxhdGVFbmQ7XG5leHBvcnRzLmluZmxhdGVHZXRIZWFkZXIgPSBpbmZsYXRlR2V0SGVhZGVyO1xuZXhwb3J0cy5pbmZsYXRlU2V0RGljdGlvbmFyeSA9IGluZmxhdGVTZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlSW5mbyA9ICdwYWtvIGluZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpJztcblxuLyogTm90IGltcGxlbWVudGVkXG5leHBvcnRzLmluZmxhdGVDb3B5ID0gaW5mbGF0ZUNvcHk7XG5leHBvcnRzLmluZmxhdGVHZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZUdldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVNYXJrID0gaW5mbGF0ZU1hcms7XG5leHBvcnRzLmluZmxhdGVQcmltZSA9IGluZmxhdGVQcmltZTtcbmV4cG9ydHMuaW5mbGF0ZVN5bmMgPSBpbmZsYXRlU3luYztcbmV4cG9ydHMuaW5mbGF0ZVN5bmNQb2ludCA9IGluZmxhdGVTeW5jUG9pbnQ7XG5leHBvcnRzLmluZmxhdGVVbmRlcm1pbmUgPSBpbmZsYXRlVW5kZXJtaW5lO1xuKi9cblxufSx7XCIuLi91dGlscy9jb21tb25cIjozMDQsXCIuL2FkbGVyMzJcIjozMDYsXCIuL2NyYzMyXCI6MzA4LFwiLi9pbmZmYXN0XCI6MzExLFwiLi9pbmZ0cmVlc1wiOjMxM31dLDMxMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzID0gX2RlcmVxXygnLi4vdXRpbHMvY29tbW9uJyk7XG5cbnZhciBNQVhCSVRTID0gMTU7XG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBDT0RFUyA9IDA7XG52YXIgTEVOUyA9IDE7XG52YXIgRElTVFMgPSAyO1xuXG52YXIgbGJhc2UgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovXG4gIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsXG4gIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwXG5dO1xuXG52YXIgbGV4dCA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LFxuICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgNzIsIDc4XG5dO1xuXG52YXIgZGJhc2UgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi9cbiAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLFxuICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsXG4gIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDBcbl07XG5cbnZhciBkZXh0ID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIyLCAyMixcbiAgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsXG4gIDI4LCAyOCwgMjksIDI5LCA2NCwgNjRcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlcywgdGFibGUsIHRhYmxlX2luZGV4LCB3b3JrLCBvcHRzKVxue1xuICB2YXIgYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vaGVyZSA9IG9wdHMuaGVyZTsgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovXG5cbiAgdmFyIGxlbiA9IDA7ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi9cbiAgdmFyIHN5bSA9IDA7ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovXG4gIHZhciBtaW4gPSAwLCBtYXggPSAwOyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqL1xuICB2YXIgcm9vdCA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqL1xuICB2YXIgY3VyciA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqL1xuICB2YXIgZHJvcCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovXG4gIHZhciBsZWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi9cbiAgdmFyIHVzZWQgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi9cbiAgdmFyIGh1ZmYgPSAwOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovXG4gIHZhciBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqL1xuICB2YXIgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovXG4gIHZhciBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqL1xuICB2YXIgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi9cbiAgdmFyIG5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovXG4gIHZhciBiYXNlID0gbnVsbDsgICAgIC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovXG4gIHZhciBiYXNlX2luZGV4ID0gMDtcbi8vICB2YXIgc2hvZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqL1xuICB2YXIgY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi9cbiAgdmFyIG9mZnMgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi9cbiAgdmFyIGV4dHJhID0gbnVsbDtcbiAgdmFyIGV4dHJhX2luZGV4ID0gMDtcblxuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDtcblxuICAvKlxuICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZVxuICAgY29kZSBsZW5ndGhzIGFyZSBsZW5zWzAuLmNvZGVzLTFdLiAgRWFjaCBsZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlXG4gICBzeW1ib2xzIDAuLmNvZGVzLTEuICBUaGUgSHVmZm1hbiBjb2RlIGlzIGdlbmVyYXRlZCBieSBmaXJzdCBzb3J0aW5nIHRoZVxuICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXJcbiAgIGZvciBjb2RlcyB3aXRoIGVxdWFsIGxlbmd0aHMuICBUaGVuIHRoZSBjb2RlIHN0YXJ0cyB3aXRoIGFsbCB6ZXJvIGJpdHNcbiAgIGZvciB0aGUgZmlyc3QgY29kZSBvZiB0aGUgc2hvcnRlc3QgbGVuZ3RoLCBhbmQgdGhlIGNvZGVzIGFyZSBpbnRlZ2VyXG4gICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aFxuICAgaW5jcmVhc2VzLiAgRm9yIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlc2UgYml0cyBhcmUgc3RvcmVkIGJhY2t3YXJkc1xuICAgZnJvbSB0aGVpciBtb3JlIG5hdHVyYWwgaW50ZWdlciBpbmNyZW1lbnQgb3JkZXJpbmcsIGFuZCBzbyB3aGVuIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXNcbiAgIGFyZSBpbmNyZW1lbnRlZCBiYWNrd2FyZHMuXG5cbiAgIFRoaXMgcm91dGluZSBhc3N1bWVzLCBidXQgZG9lcyBub3QgY2hlY2ssIHRoYXQgYWxsIG9mIHRoZSBlbnRyaWVzIGluXG4gICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLlxuICAgMS4uTUFYQklUUyBpcyBpbnRlcnByZXRlZCBhcyB0aGF0IGNvZGUgbGVuZ3RoLiAgemVybyBtZWFucyB0aGF0IHRoYXRcbiAgIHN5bWJvbCBkb2VzIG5vdCBvY2N1ciBpbiB0aGlzIGNvZGUuXG5cbiAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCxcbiAgIGNyZWF0aW5nIGZyb20gdGhhdCBhIHRhYmxlIG9mIHN0YXJ0aW5nIGluZGljZXMgZm9yIGVhY2ggbGVuZ3RoIGluIHRoZVxuICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBpbiBvcmRlciBpbiB0aGUgc29ydGVkXG4gICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnlcbiAgIHRoZSBjYWxsZXIuXG5cbiAgIFRoZSBsZW5ndGggY291bnRzIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcyBhcyB3ZWxsLCBpLmUuIGZpbmRpbmdcbiAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueVxuICAgY29kZXMgYXQgYWxsLCBjaGVja2luZyBmb3IgYSB2YWxpZCBzZXQgb2YgbGVuZ3RocywgYW5kIGxvb2tpbmcgYWhlYWRcbiAgIGF0IGxlbmd0aCBjb3VudHMgdG8gZGV0ZXJtaW5lIHN1Yi10YWJsZSBzaXplcyB3aGVuIGJ1aWxkaW5nIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzLlxuICAgKi9cblxuICAvKiBhY2N1bXVsYXRlIGxlbmd0aHMgZm9yIGNvZGVzIChhc3N1bWVzIGxlbnNbXSBhbGwgaW4gMC4uTUFYQklUUykgKi9cbiAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBjb3VudFtsZW5dID0gMDtcbiAgfVxuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGNvdW50W2xlbnNbbGVuc19pbmRleCArIHN5bV1dKys7XG4gIH1cblxuICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqL1xuICByb290ID0gYml0cztcbiAgZm9yIChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pIHtcbiAgICBpZiAoY291bnRbbWF4XSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290ID4gbWF4KSB7XG4gICAgcm9vdCA9IG1heDtcbiAgfVxuICBpZiAobWF4ID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqL1xuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDsgIC8vaGVyZS5vcCA9ICh2YXIgY2hhcik2NDsgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7ICAgLy9oZXJlLmJpdHMgPSAodmFyIGNoYXIpMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDsgICAvL2hlcmUudmFsID0gKHZhciBzaG9ydCkwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cblxuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDtcbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cbiAgICBvcHRzLmJpdHMgPSAxO1xuICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqL1xuICB9XG4gIGZvciAobWluID0gMTsgbWluIDwgbWF4OyBtaW4rKykge1xuICAgIGlmIChjb3VudFttaW5dICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPCBtaW4pIHtcbiAgICByb290ID0gbWluO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovXG4gIGxlZnQgPSAxO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGxlZnQgPDw9IDE7XG4gICAgbGVmdCAtPSBjb3VudFtsZW5dO1xuICAgIGlmIChsZWZ0IDwgMCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqL1xuICB9XG4gIGlmIChsZWZ0ID4gMCAmJiAodHlwZSA9PT0gQ09ERVMgfHwgbWF4ICE9PSAxKSkge1xuICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgLyogaW5jb21wbGV0ZSBzZXQgKi9cbiAgfVxuXG4gIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovXG4gIG9mZnNbMV0gPSAwO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGNvdW50W2xlbl07XG4gIH1cblxuICAvKiBzb3J0IHN5bWJvbHMgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoICovXG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgaWYgKGxlbnNbbGVuc19pbmRleCArIHN5bV0gIT09IDApIHtcbiAgICAgIHdvcmtbb2Zmc1tsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrXSA9IHN5bTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nXG4gICBmaWxsZWQgaXMgYXQgbmV4dCBhbmQgaGFzIGN1cnIgaW5kZXggYml0cy4gIFRoZSBjb2RlIGJlaW5nIHVzZWQgaXMgaHVmZlxuICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBpbmRleCBieSBkcm9wcGluZyBkcm9wXG4gICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsXG4gICB0aG9zZSB0b3AgZHJvcCArIGN1cnIgLSBsZW4gYml0cyBhcmUgaW5jcmVtZW50ZWQgdGhyb3VnaCBhbGwgdmFsdWVzIHRvXG4gICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy5cblxuICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkc1xuICAgcm9vdCwgc3ViLXRhYmxlcyBhcmUgY3JlYXRlZCBwb2ludGVkIHRvIGJ5IHRoZSByb290IGVudHJ5IHdpdGggYW4gaW5kZXhcbiAgIG9mIHRoZSBsb3cgcm9vdCBiaXRzIG9mIGh1ZmYuICBUaGlzIGlzIHNhdmVkIGluIGxvdyB0byBjaGVjayBmb3Igd2hlbiBhXG4gICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXNcbiAgIGJlaW5nIGZpbGxlZCwgYW5kIGRyb3AgaXMgcm9vdCB3aGVuIHN1Yi10YWJsZXMgYXJlIGJlaW5nIGZpbGxlZC5cblxuICAgV2hlbiBhIG5ldyBzdWItdGFibGUgaXMgbmVlZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9vayBhaGVhZCBpbiB0aGVcbiAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoXG4gICBjb3VudHMgYXJlIHVzZWQgZm9yIHRoaXMsIGFuZCBzbyBjb3VudFtdIGlzIGRlY3JlbWVudGVkIGFzIGNvZGVzIGFyZVxuICAgZW50ZXJlZCBpbiB0aGUgdGFibGVzLlxuXG4gICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZVxuICAgcHJvdmlkZWQgKnRhYmxlIHNwYWNlLiAgSXQgaXMgY2hlY2tlZCBmb3IgTEVOUyBhbmQgRElTVCB0YWJsZXMgYWdhaW5zdFxuICAgdGhlIGNvbnN0YW50cyBFTk9VR0hfTEVOUyBhbmQgRU5PVUdIX0RJU1RTIHRvIGd1YXJkIGFnYWluc3QgY2hhbmdlcyBpblxuICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbiAgIHN5bSBpbmNyZW1lbnRzIHRocm91Z2ggYWxsIHN5bWJvbHMsIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW5cbiAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXNcbiAgIHJvdXRpbmUgcGVybWl0cyBpbmNvbXBsZXRlIGNvZGVzLCBzbyBhbm90aGVyIGxvb3AgYWZ0ZXIgdGhpcyBvbmUgZmlsbHNcbiAgIGluIHRoZSByZXN0IG9mIHRoZSBkZWNvZGluZyB0YWJsZXMgd2l0aCBpbnZhbGlkIGNvZGUgbWFya2Vycy5cbiAgICovXG5cbiAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi9cbiAgLy8gcG9vciBtYW4gb3B0aW1pemF0aW9uIC0gdXNlIGlmLWVsc2UgaW5zdGVhZCBvZiBzd2l0Y2gsXG4gIC8vIHRvIGF2b2lkIGRlb3B0cyBpbiBvbGQgdjhcbiAgaWYgKHR5cGUgPT09IENPREVTKSB7XG4gICAgYmFzZSA9IGV4dHJhID0gd29yazsgICAgLyogZHVtbXkgdmFsdWUtLW5vdCB1c2VkICovXG4gICAgZW5kID0gMTk7XG5cbiAgfSBlbHNlIGlmICh0eXBlID09PSBMRU5TKSB7XG4gICAgYmFzZSA9IGxiYXNlO1xuICAgIGJhc2VfaW5kZXggLT0gMjU3O1xuICAgIGV4dHJhID0gbGV4dDtcbiAgICBleHRyYV9pbmRleCAtPSAyNTc7XG4gICAgZW5kID0gMjU2O1xuXG4gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBESVNUUyAqL1xuICAgIGJhc2UgPSBkYmFzZTtcbiAgICBleHRyYSA9IGRleHQ7XG4gICAgZW5kID0gLTE7XG4gIH1cblxuICAvKiBpbml0aWFsaXplIG9wdHMgZm9yIGxvb3AgKi9cbiAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi9cbiAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovXG4gIGxlbiA9IG1pbjsgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIGxlbmd0aCAqL1xuICBuZXh0ID0gdGFibGVfaW5kZXg7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIHRvIGZpbGwgaW4gKi9cbiAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqL1xuICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqL1xuICBsb3cgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogdHJpZ2dlciBuZXcgc3ViLXRhYmxlIHdoZW4gbGVuID4gcm9vdCAqL1xuICB1c2VkID0gMSA8PCByb290OyAgICAgICAgICAvKiB1c2Ugcm9vdCB0YWJsZSBlbnRyaWVzICovXG4gIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovXG5cbiAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovXG4gIGlmICgodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8XG4gICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi9cbiAgICBoZXJlX2JpdHMgPSBsZW4gLSBkcm9wO1xuICAgIGlmICh3b3JrW3N5bV0gPCBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSAwO1xuICAgICAgaGVyZV92YWwgPSB3b3JrW3N5bV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHdvcmtbc3ltXSA+IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IGV4dHJhW2V4dHJhX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICAgIGhlcmVfdmFsID0gYmFzZVtiYXNlX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBoZXJlX29wID0gMzIgKyA2NDsgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi9cbiAgICAgIGhlcmVfdmFsID0gMDtcbiAgICB9XG5cbiAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSBkcm9wKTtcbiAgICBmaWxsID0gMSA8PCBjdXJyO1xuICAgIG1pbiA9IGZpbGw7ICAgICAgICAgICAgICAgICAvKiBzYXZlIG9mZnNldCB0byBuZXh0IHRhYmxlICovXG4gICAgZG8ge1xuICAgICAgZmlsbCAtPSBpbmNyO1xuICAgICAgdGFibGVbbmV4dCArIChodWZmID4+IGRyb3ApICsgZmlsbF0gPSAoaGVyZV9iaXRzIDw8IDI0KSB8IChoZXJlX29wIDw8IDE2KSB8IGhlcmVfdmFsIHwwO1xuICAgIH0gd2hpbGUgKGZpbGwgIT09IDApO1xuXG4gICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gMSk7XG4gICAgd2hpbGUgKGh1ZmYgJiBpbmNyKSB7XG4gICAgICBpbmNyID4+PSAxO1xuICAgIH1cbiAgICBpZiAoaW5jciAhPT0gMCkge1xuICAgICAgaHVmZiAmPSBpbmNyIC0gMTtcbiAgICAgIGh1ZmYgKz0gaW5jcjtcbiAgICB9IGVsc2Uge1xuICAgICAgaHVmZiA9IDA7XG4gICAgfVxuXG4gICAgLyogZ28gdG8gbmV4dCBzeW1ib2wsIHVwZGF0ZSBjb3VudCwgbGVuICovXG4gICAgc3ltKys7XG4gICAgaWYgKC0tY291bnRbbGVuXSA9PT0gMCkge1xuICAgICAgaWYgKGxlbiA9PT0gbWF4KSB7IGJyZWFrOyB9XG4gICAgICBsZW4gPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cblxuICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqL1xuICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT09IGxvdykge1xuICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovXG4gICAgICBpZiAoZHJvcCA9PT0gMCkge1xuICAgICAgICBkcm9wID0gcm9vdDtcbiAgICAgIH1cblxuICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqL1xuICAgICAgbmV4dCArPSBtaW47ICAgICAgICAgICAgLyogaGVyZSBtaW4gaXMgMSA8PCBjdXJyICovXG5cbiAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqL1xuICAgICAgY3VyciA9IGxlbiAtIGRyb3A7XG4gICAgICBsZWZ0ID0gMSA8PCBjdXJyO1xuICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7XG4gICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdO1xuICAgICAgICBpZiAobGVmdCA8PSAwKSB7IGJyZWFrOyB9XG4gICAgICAgIGN1cnIrKztcbiAgICAgICAgbGVmdCA8PD0gMTtcbiAgICAgIH1cblxuICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqL1xuICAgICAgdXNlZCArPSAxIDw8IGN1cnI7XG4gICAgICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICAgICAodHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovXG4gICAgICBsb3cgPSBodWZmICYgbWFzaztcbiAgICAgIC8qdGFibGUub3BbbG93XSA9IGN1cnI7XG4gICAgICB0YWJsZS5iaXRzW2xvd10gPSByb290O1xuICAgICAgdGFibGUudmFsW2xvd10gPSBuZXh0IC0gb3B0cy50YWJsZV9pbmRleDsqL1xuICAgICAgdGFibGVbbG93XSA9IChyb290IDw8IDI0KSB8IChjdXJyIDw8IDE2KSB8IChuZXh0IC0gdGFibGVfaW5kZXgpIHwwO1xuICAgIH1cbiAgfVxuXG4gIC8qIGZpbGwgaW4gcmVtYWluaW5nIHRhYmxlIGVudHJ5IGlmIGNvZGUgaXMgaW5jb21wbGV0ZSAoZ3VhcmFudGVlZCB0byBoYXZlXG4gICBhdCBtb3N0IG9uZSByZW1haW5pbmcgZW50cnksIHNpbmNlIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUsIHRoZVxuICAgbWF4aW11bSBjb2RlIGxlbmd0aCB0aGF0IHdhcyBhbGxvd2VkIHRvIGdldCB0aGlzIGZhciBpcyBvbmUgYml0KSAqL1xuICBpZiAoaHVmZiAhPT0gMCkge1xuICAgIC8vdGFibGUub3BbbmV4dCArIGh1ZmZdID0gNjQ7ICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tuZXh0ICsgaHVmZl0gPSBsZW4gLSBkcm9wO1xuICAgIC8vdGFibGUudmFsW25leHQgKyBodWZmXSA9IDA7XG4gICAgdGFibGVbbmV4dCArIGh1ZmZdID0gKChsZW4gLSBkcm9wKSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwwO1xuICB9XG5cbiAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovXG4gIC8vb3B0cy50YWJsZV9pbmRleCArPSB1c2VkO1xuICBvcHRzLmJpdHMgPSByb290O1xuICByZXR1cm4gMDtcbn07XG5cbn0se1wiLi4vdXRpbHMvY29tbW9uXCI6MzA0fV0sMzE0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgMjogICAgICAnbmVlZCBkaWN0aW9uYXJ5JywgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovXG4gIDE6ICAgICAgJ3N0cmVhbSBlbmQnLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqL1xuICAwOiAgICAgICcnLCAgICAgICAgICAgICAgICAgICAgLyogWl9PSyAgICAgICAgICAgICAgMCAgKi9cbiAgJy0xJzogICAnZmlsZSBlcnJvcicsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovXG4gICctMic6ICAgJ3N0cmVhbSBlcnJvcicsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqL1xuICAnLTMnOiAgICdkYXRhIGVycm9yJywgICAgICAgICAgLyogWl9EQVRBX0VSUk9SICAgICgtMykgKi9cbiAgJy00JzogICAnaW5zdWZmaWNpZW50IG1lbW9yeScsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovXG4gICctNSc6ICAgJ2J1ZmZlciBlcnJvcicsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqL1xuICAnLTYnOiAgICdpbmNvbXBhdGlibGUgdmVyc2lvbicgLyogWl9WRVJTSU9OX0VSUk9SICgtNikgKi9cbn07XG5cbn0se31dLDMxNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzID0gX2RlcmVxXygnLi4vdXRpbHMvY29tbW9uJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8vdmFyIFpfRklMVEVSRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9IVUZGTUFOX09OTFkgICAgICA9IDI7XG4vL3ZhciBaX1JMRSAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xuLy92YXIgWl9ERUZBVUxUX1NUUkFURUdZICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbnZhciBaX0JJTkFSWSAgICAgICAgICAgICAgPSAwO1xudmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG4vLyBGcm9tIHp1dGlsLmhcblxudmFyIFNUT1JFRF9CTE9DSyA9IDA7XG52YXIgU1RBVElDX1RSRUVTID0gMTtcbnZhciBEWU5fVFJFRVMgICAgPSAyO1xuLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi9cblxudmFyIE1JTl9NQVRDSCAgICA9IDM7XG52YXIgTUFYX01BVENIICAgID0gMjU4O1xuLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqL1xuXG4vLyBGcm9tIGRlZmxhdGUuaFxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS5cbiAqL1xuXG52YXIgTEVOR1RIX0NPREVTICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG5cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBEX0NPREVTICAgICAgID0gMzA7XG4vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi9cblxudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xuXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG5cbnZhciBNQVhfQklUUyAgICAgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIEJ1Zl9zaXplICAgICAgPSAxNjtcbi8qIHNpemUgb2YgYml0IGJ1ZmZlciBpbiBiaV9idWYgKi9cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0YW50c1xuICovXG5cbnZhciBNQVhfQkxfQklUUyA9IDc7XG4vKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovXG5cbnZhciBFTkRfQkxPQ0sgICA9IDI1Njtcbi8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi9cblxudmFyIFJFUF8zXzYgICAgID0gMTY7XG4vKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzNfMTAgICA9IDE3O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzExXzEzOCA9IDE4O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxuLyogZXNsaW50LWRpc2FibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cbnZhciBleHRyYV9sYml0cyA9ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqL1xuICBbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXTtcblxudmFyIGV4dHJhX2RiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi9cbiAgWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdO1xuXG52YXIgZXh0cmFfYmxiaXRzID0gIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XTtcblxudmFyIGJsX29yZGVyID1cbiAgWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO1xuLyogZXNsaW50LWVuYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xuXG4vKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nXG4gKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy5cbiAqL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuXG4gKi9cblxuLy8gV2UgcHJlLWZpbGwgYXJyYXlzIHdpdGggMCB0byBhdm9pZCB1bmluaXRpYWxpemVkIGdhcHNcblxudmFyIERJU1RfQ09ERV9MRU4gPSA1MTI7IC8qIHNlZSBkZWZpbml0aW9uIG9mIGFycmF5IGRpc3RfY29kZSBiZWxvdyAqL1xuXG4vLyAhISEhIFVzZSBmbGF0IGFycmF5IGluc3RlYWQgb2Ygc3RydWN0dXJlLCBGcmVxID0gaSoyLCBMZW4gPSBpKjIrMVxudmFyIHN0YXRpY19sdHJlZSAgPSBuZXcgQXJyYXkoKExfQ09ERVMgKyAyKSAqIDIpO1xuemVybyhzdGF0aWNfbHRyZWUpO1xuLyogVGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUuIFNpbmNlIHRoZSBiaXQgbGVuZ3RocyBhcmUgaW1wb3NlZCwgdGhlcmUgaXMgbm9cbiAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAgY29uc3RydWN0aW9uLiBIb3dldmVyXG4gKiBUaGUgY29kZXMgMjg2IGFuZCAyODcgYXJlIG5lZWRlZCB0byBidWlsZCBhIGNhbm9uaWNhbCB0cmVlIChzZWUgX3RyX2luaXRcbiAqIGJlbG93KS5cbiAqL1xuXG52YXIgc3RhdGljX2R0cmVlICA9IG5ldyBBcnJheShEX0NPREVTICogMik7XG56ZXJvKHN0YXRpY19kdHJlZSk7XG4vKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlXG4gKiA1IGJpdHMuKVxuICovXG5cbnZhciBfZGlzdF9jb2RlICAgID0gbmV3IEFycmF5KERJU1RfQ09ERV9MRU4pO1xuemVybyhfZGlzdF9jb2RlKTtcbi8qIERpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXNcbiAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2ZcbiAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLlxuICovXG5cbnZhciBfbGVuZ3RoX2NvZGUgID0gbmV3IEFycmF5KE1BWF9NQVRDSCAtIE1JTl9NQVRDSCArIDEpO1xuemVybyhfbGVuZ3RoX2NvZGUpO1xuLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9sZW5ndGggICA9IG5ldyBBcnJheShMRU5HVEhfQ09ERVMpO1xuemVybyhiYXNlX2xlbmd0aCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9kaXN0ICAgICA9IG5ldyBBcnJheShEX0NPREVTKTtcbnplcm8oYmFzZV9kaXN0KTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgZGlzdGFuY2UgZm9yIGVhY2ggY29kZSAoMCA9IGRpc3RhbmNlIG9mIDEpICovXG5cblxuZnVuY3Rpb24gU3RhdGljVHJlZURlc2Moc3RhdGljX3RyZWUsIGV4dHJhX2JpdHMsIGV4dHJhX2Jhc2UsIGVsZW1zLCBtYXhfbGVuZ3RoKSB7XG5cbiAgdGhpcy5zdGF0aWNfdHJlZSAgPSBzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iaXRzICAgPSBleHRyYV9iaXRzOyAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovXG4gIHRoaXMuZXh0cmFfYmFzZSAgID0gZXh0cmFfYmFzZTsgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovXG4gIHRoaXMuZWxlbXMgICAgICAgID0gZWxlbXM7ICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovXG4gIHRoaXMubWF4X2xlbmd0aCAgID0gbWF4X2xlbmd0aDsgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovXG5cbiAgLy8gc2hvdyBpZiBgc3RhdGljX3RyZWVgIGhhcyBkYXRhIG9yIGR1bW15IC0gbmVlZGVkIGZvciBtb25vbW9ycGhpYyBvYmplY3RzXG4gIHRoaXMuaGFzX3N0cmVlICAgID0gc3RhdGljX3RyZWUgJiYgc3RhdGljX3RyZWUubGVuZ3RoO1xufVxuXG5cbnZhciBzdGF0aWNfbF9kZXNjO1xudmFyIHN0YXRpY19kX2Rlc2M7XG52YXIgc3RhdGljX2JsX2Rlc2M7XG5cblxuZnVuY3Rpb24gVHJlZURlc2MoZHluX3RyZWUsIHN0YXRfZGVzYykge1xuICB0aGlzLmR5bl90cmVlID0gZHluX3RyZWU7ICAgICAvKiB0aGUgZHluYW1pYyB0cmVlICovXG4gIHRoaXMubWF4X2NvZGUgPSAwOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB0aGlzLnN0YXRfZGVzYyA9IHN0YXRfZGVzYzsgICAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqL1xufVxuXG5cblxuZnVuY3Rpb24gZF9jb2RlKGRpc3QpIHtcbiAgcmV0dXJuIGRpc3QgPCAyNTYgPyBfZGlzdF9jb2RlW2Rpc3RdIDogX2Rpc3RfY29kZVsyNTYgKyAoZGlzdCA+Pj4gNyldO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogT3V0cHV0IGEgc2hvcnQgTFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uXG4gKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdCdWYuXG4gKi9cbmZ1bmN0aW9uIHB1dF9zaG9ydChzLCB3KSB7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodykgJiAweGZmKSk7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodXNoKSh3KSA+PiA4KSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodyA+Pj4gOCkgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuXG4gKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy5cbiAqL1xuZnVuY3Rpb24gc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPiAoQnVmX3NpemUgLSBsZW5ndGgpKSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSB2YWx1ZSA+PiAoQnVmX3NpemUgLSBzLmJpX3ZhbGlkKTtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJ1Zl9zaXplO1xuICB9IGVsc2Uge1xuICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHNlbmRfY29kZShzLCBjLCB0cmVlKSB7XG4gIHNlbmRfYml0cyhzLCB0cmVlW2MgKiAyXS8qLkNvZGUqLywgdHJlZVtjICogMiArIDFdLyouTGVuKi8pO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXJcbiAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSlcbiAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTVcbiAqL1xuZnVuY3Rpb24gYmlfcmV2ZXJzZShjb2RlLCBsZW4pIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGRvIHtcbiAgICByZXMgfD0gY29kZSAmIDE7XG4gICAgY29kZSA+Pj49IDE7XG4gICAgcmVzIDw8PSAxO1xuICB9IHdoaWxlICgtLWxlbiA+IDApO1xuICByZXR1cm4gcmVzID4+PiAxO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIsIGtlZXBpbmcgYXQgbW9zdCA3IGJpdHMgaW4gaXQuXG4gKi9cbmZ1bmN0aW9uIGJpX2ZsdXNoKHMpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPT09IDE2KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IDA7XG4gICAgcy5iaV92YWxpZCA9IDA7XG5cbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID49IDgpIHtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmICYgMHhmZjtcbiAgICBzLmJpX2J1ZiA+Pj0gODtcbiAgICBzLmJpX3ZhbGlkIC09IDg7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoXG4gKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZFxuICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGVcbiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC5cbiAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXNcbiAqICAgICBub3QgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2JpdGxlbihzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgICAgICAgID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIG1heF9jb2RlICAgICAgICA9IGRlc2MubWF4X2NvZGU7XG4gIHZhciBzdHJlZSAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGV4dHJhICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2JpdHM7XG4gIHZhciBiYXNlICAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iYXNlO1xuICB2YXIgbWF4X2xlbmd0aCAgICAgID0gZGVzYy5zdGF0X2Rlc2MubWF4X2xlbmd0aDtcbiAgdmFyIGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovXG4gIHZhciBuLCBtOyAgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqL1xuICB2YXIgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi9cbiAgdmFyIGY7ICAgICAgICAgICAgICAvKiBmcmVxdWVuY3kgKi9cbiAgdmFyIG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqL1xuXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIHMuYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXlcbiAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJlZSkuXG4gICAqL1xuICB0cmVlW3MuaGVhcFtzLmhlYXBfbWF4XSAqIDIgKyAxXS8qLkxlbiovID0gMDsgLyogcm9vdCBvZiB0aGUgaGVhcCAqL1xuXG4gIGZvciAoaCA9IHMuaGVhcF9tYXggKyAxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHtcbiAgICBuID0gcy5oZWFwW2hdO1xuICAgIGJpdHMgPSB0cmVlW3RyZWVbbiAqIDIgKyAxXS8qLkRhZCovICogMiArIDFdLyouTGVuKi8gKyAxO1xuICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkge1xuICAgICAgYml0cyA9IG1heF9sZW5ndGg7XG4gICAgICBvdmVyZmxvdysrO1xuICAgIH1cbiAgICB0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi9cblxuICAgIGlmIChuID4gbWF4X2NvZGUpIHsgY29udGludWU7IH0gLyogbm90IGEgbGVhZiBub2RlICovXG5cbiAgICBzLmJsX2NvdW50W2JpdHNdKys7XG4gICAgeGJpdHMgPSAwO1xuICAgIGlmIChuID49IGJhc2UpIHtcbiAgICAgIHhiaXRzID0gZXh0cmFbbiAtIGJhc2VdO1xuICAgIH1cbiAgICBmID0gdHJlZVtuICogMl0vKi5GcmVxKi87XG4gICAgcy5vcHRfbGVuICs9IGYgKiAoYml0cyArIHhiaXRzKTtcbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gKz0gZiAqIChzdHJlZVtuICogMiArIDFdLyouTGVuKi8gKyB4Yml0cyk7XG4gICAgfVxuICB9XG4gIGlmIChvdmVyZmxvdyA9PT0gMCkgeyByZXR1cm47IH1cblxuICAvLyBUcmFjZSgoc3RkZXJyLFwiXFxuYml0IGxlbmd0aCBvdmVyZmxvd1xcblwiKSk7XG4gIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovXG5cbiAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi9cbiAgZG8ge1xuICAgIGJpdHMgPSBtYXhfbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAocy5ibF9jb3VudFtiaXRzXSA9PT0gMCkgeyBiaXRzLS07IH1cbiAgICBzLmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovXG4gICAgcy5ibF9jb3VudFtiaXRzICsgMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqL1xuICAgIHMuYmxfY291bnRbbWF4X2xlbmd0aF0tLTtcbiAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLFxuICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVuZ3RoXVxuICAgICAqL1xuICAgIG92ZXJmbG93IC09IDI7XG4gIH0gd2hpbGUgKG92ZXJmbG93ID4gMCk7XG5cbiAgLyogTm93IHJlY29tcHV0ZSBhbGwgYml0IGxlbmd0aHMsIHNjYW5uaW5nIGluIGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsXG4gICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuXG4gICAqIGZyb20gJ2FyJyB3cml0dGVuIGJ5IEhhcnVoaWtvIE9rdW11cmEuKVxuICAgKi9cbiAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPT0gMDsgYml0cy0tKSB7XG4gICAgbiA9IHMuYmxfY291bnRbYml0c107XG4gICAgd2hpbGUgKG4gIT09IDApIHtcbiAgICAgIG0gPSBzLmhlYXBbLS1oXTtcbiAgICAgIGlmIChtID4gbWF4X2NvZGUpIHsgY29udGludWU7IH1cbiAgICAgIGlmICh0cmVlW20gKiAyICsgMV0vKi5MZW4qLyAhPT0gYml0cykge1xuICAgICAgICAvLyBUcmFjZSgoc3RkZXJyLFwiY29kZSAlZCBiaXRzICVkLT4lZFxcblwiLCBtLCB0cmVlW21dLkxlbiwgYml0cykpO1xuICAgICAgICBzLm9wdF9sZW4gKz0gKGJpdHMgLSB0cmVlW20gKiAyICsgMV0vKi5MZW4qLykgKiB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICAgICAgdHJlZVttICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgICAgfVxuICAgICAgbi0tO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlXG4gKiBvcHRpbWFsKS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yXG4gKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub25cbiAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KVxuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuLy8gICAgdXNoZiAqYmxfY291bnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCAqL1xue1xuICB2YXIgbmV4dF9jb2RlID0gbmV3IEFycmF5KE1BWF9CSVRTICsgMSk7IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovXG4gIHZhciBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi9cbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBpbmRleCAqL1xuXG4gIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlc1xuICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC5cbiAgICovXG4gIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMgLSAxXSkgPDwgMTtcbiAgfVxuICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlXG4gICAqIG11c3QgYmUgYWxsIG9uZXMuXG4gICAqL1xuICAvL0Fzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSxcbiAgLy8gICAgICAgIFwiaW5jb25zaXN0ZW50IGJpdCBjb3VudHNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5nZW5fY29kZXM6IG1heF9jb2RlICVkIFwiLCBtYXhfY29kZSkpO1xuXG4gIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICB2YXIgbGVuID0gdHJlZVtuICogMiArIDFdLyouTGVuKi87XG4gICAgaWYgKGxlbiA9PT0gMCkgeyBjb250aW51ZTsgfVxuICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovXG4gICAgdHJlZVtuICogMl0vKi5Db2RlKi8gPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssIGxlbik7XG5cbiAgICAvL1RyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsXCJcXG5uICUzZCAlYyBsICUyZCBjICU0eCAoJXgpIFwiLFxuICAgIC8vICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpO1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzICdjb25zdGFudCcgdGFibGVzLlxuICovXG5mdW5jdGlvbiB0cl9zdGF0aWNfaW5pdCgpIHtcbiAgdmFyIG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqL1xuICB2YXIgbGVuZ3RoOyAgIC8qIGxlbmd0aCB2YWx1ZSAqL1xuICB2YXIgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqL1xuICB2YXIgYmxfY291bnQgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy8gZG8gY2hlY2sgaW4gX3RyX2luaXQoKVxuICAvL2lmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47XG5cbiAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqL1xuLyojaWZkZWYgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlNcbiAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTtcbiAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7XG4gIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7XG4gIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzO1xuICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzO1xuI2VuZGlmKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovXG4gIGxlbmd0aCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMgLSAxOyBjb2RlKyspIHtcbiAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfbGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGgrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAobGVuZ3RoID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogbGVuZ3RoICE9IDI1NlwiKTtcbiAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWRcbiAgICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2VcbiAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOlxuICAgKi9cbiAgX2xlbmd0aF9jb2RlW2xlbmd0aCAtIDFdID0gY29kZTtcblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi9cbiAgZGlzdCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCAxNjsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogZGlzdCAhPSAyNTZcIik7XG4gIGRpc3QgPj49IDc7IC8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqL1xuICBmb3IgKDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNztcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgKGV4dHJhX2RiaXRzW2NvZGVdIC0gNykpOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyXCIpO1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi9cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgbiA9IDA7XG4gIHdoaWxlIChuIDw9IDE0Mykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI1NSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA5O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs5XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI3OSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA3O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs3XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI4Nykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZVxuICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGVcbiAgICogYWxsIG9uZXMpXG4gICAqL1xuICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTICsgMSwgYmxfY291bnQpO1xuXG4gIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDU7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobiwgNSk7XG4gIH1cblxuICAvLyBOb3cgZGF0YSByZWFkeSBhbmQgd2UgY2FuIGluaXQgc3RhdGljIHRyZWVzXG4gIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMgKyAxLCBMX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19kX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFMpO1xuICBzdGF0aWNfYmxfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksIGV4dHJhX2JsYml0cywgMCwgICAgICAgICBCTF9DT0RFUywgTUFYX0JMX0JJVFMpO1xuXG4gIC8vc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIGEgbmV3IGJsb2NrLlxuICovXG5mdW5jdGlvbiBpbml0X2Jsb2NrKHMpIHtcbiAgdmFyIG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgIG4rKykgeyBzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyAgbisrKSB7IHMuZHluX2R0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIHsgcy5ibF90cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cblxuICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXS8qLkZyZXEqLyA9IDE7XG4gIHMub3B0X2xlbiA9IHMuc3RhdGljX2xlbiA9IDA7XG4gIHMubGFzdF9saXQgPSBzLm1hdGNoZXMgPSAwO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5XG4gKi9cbmZ1bmN0aW9uIGJpX3dpbmR1cChzKVxue1xuICBpZiAocy5iaV92YWxpZCA+IDgpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPiAwKSB7XG4gICAgLy9wdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpO1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWY7XG4gIH1cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0c1xuICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcilcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAgICAqYnVmOyAgICAvKiB0aGUgaW5wdXQgZGF0YSAqL1xuLy91bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovXG4vL2ludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqL1xue1xuICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovXG5cbiAgaWYgKGhlYWRlcikge1xuICAgIHB1dF9zaG9ydChzLCBsZW4pO1xuICAgIHB1dF9zaG9ydChzLCB+bGVuKTtcbiAgfVxuLy8gIHdoaWxlIChsZW4tLSkge1xuLy8gICAgcHV0X2J5dGUocywgKmJ1ZisrKTtcbi8vICB9XG4gIHV0aWxzLmFycmF5U2V0KHMucGVuZGluZ19idWYsIHMud2luZG93LCBidWYsIGxlbiwgcy5wZW5kaW5nKTtcbiAgcy5wZW5kaW5nICs9IGxlbjtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlblxuICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIHtcbiAgdmFyIF9uMiA9IG4gKiAyO1xuICB2YXIgX20yID0gbSAqIDI7XG4gIHJldHVybiAodHJlZVtfbjJdLyouRnJlcSovIDwgdHJlZVtfbTJdLyouRnJlcSovIHx8XG4gICAgICAgICAodHJlZVtfbjJdLyouRnJlcSovID09PSB0cmVlW19tMl0vKi5GcmVxKi8gJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgayxcbiAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nXG4gKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzXG4gKiB0d28gc29ucykuXG4gKi9cbmZ1bmN0aW9uIHBxZG93bmhlYXAocywgdHJlZSwgaylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqL1xuLy8gICAgaW50IGs7ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi9cbntcbiAgdmFyIHYgPSBzLmhlYXBba107XG4gIHZhciBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqL1xuICB3aGlsZSAoaiA8PSBzLmhlYXBfbGVuKSB7XG4gICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi9cbiAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiZcbiAgICAgIHNtYWxsZXIodHJlZSwgcy5oZWFwW2ogKyAxXSwgcy5oZWFwW2pdLCBzLmRlcHRoKSkge1xuICAgICAgaisrO1xuICAgIH1cbiAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqL1xuICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHsgYnJlYWs7IH1cblxuICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovXG4gICAgcy5oZWFwW2tdID0gcy5oZWFwW2pdO1xuICAgIGsgPSBqO1xuXG4gICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqL1xuICAgIGogPDw9IDE7XG4gIH1cbiAgcy5oZWFwW2tdID0gdjtcbn1cblxuXG4vLyBpbmxpbmVkIG1hbnVhbGx5XG4vLyB2YXIgU01BTExFU1QgPSAxO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlc1xuICovXG5mdW5jdGlvbiBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY29uc3QgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqL1xuLy8gICAgY29uc3QgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbntcbiAgdmFyIGRpc3Q7ICAgICAgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuICB2YXIgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqL1xuICB2YXIgbHggPSAwOyAgICAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cbiAgdmFyIGNvZGU7ICAgICAgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovXG4gIHZhciBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqL1xuXG4gIGlmIChzLmxhc3RfbGl0ICE9PSAwKSB7XG4gICAgZG8ge1xuICAgICAgZGlzdCA9IChzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBseCAqIDJdIDw8IDgpIHwgKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMiArIDFdKTtcbiAgICAgIGxjID0gcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgbHhdO1xuICAgICAgbHgrKztcblxuICAgICAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgICAgLy9UcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLFwiICclYycgXCIsIGxjKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdO1xuICAgICAgICBzZW5kX2NvZGUocywgY29kZSArIExJVEVSQUxTICsgMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgbGMsIGV4dHJhKTsgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTtcbiAgICAgICAgLy9Bc3NlcnQgKGNvZGUgPCBEX0NPREVTLCBcImJhZCBkX2NvZGVcIik7XG5cbiAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUsIGR0cmVlKTsgICAgICAgLyogc2VuZCB0aGUgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqL1xuXG4gICAgICAvKiBDaGVjayB0aGF0IHRoZSBvdmVybGF5IGJldHdlZW4gcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmIGlzIG9rOiAqL1xuICAgICAgLy9Bc3NlcnQoKHVJbnQpKHMtPnBlbmRpbmcpIDwgcy0+bGl0X2J1ZnNpemUgKyAyKmx4LFxuICAgICAgLy8gICAgICAgXCJwZW5kaW5nQnVmIG92ZXJmbG93XCIpO1xuXG4gICAgfSB3aGlsZSAobHggPCBzLmxhc3RfbGl0KTtcbiAgfVxuXG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLlxuICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhcbiAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpc1xuICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfdHJlZShzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgc3RyZWUgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGVsZW1zICAgID0gZGVzYy5zdGF0X2Rlc2MuZWxlbXM7XG4gIHZhciBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqL1xuICB2YXIgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHZhciBub2RlOyAgICAgICAgICAvKiBuZXcgbm9kZSBiZWluZyBjcmVhdGVkICovXG5cbiAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpblxuICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS5cbiAgICogaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICovXG4gIHMuaGVhcF9sZW4gPSAwO1xuICBzLmhlYXBfbWF4ID0gSEVBUF9TSVpFO1xuXG4gIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7XG4gICAgaWYgKHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IG1heF9jb2RlID0gbjtcbiAgICAgIHMuZGVwdGhbbl0gPSAwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gMDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLFxuICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmVcbiAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3RcbiAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS5cbiAgICovXG4gIHdoaWxlIChzLmhlYXBfbGVuIDwgMikge1xuICAgIG5vZGUgPSBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7XG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSAxO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAwO1xuICAgIHMub3B0X2xlbi0tO1xuXG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGUgKiAyICsgMV0vKi5MZW4qLztcbiAgICB9XG4gICAgLyogbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovXG4gIH1cbiAgZGVzYy5tYXhfY29kZSA9IG1heF9jb2RlO1xuXG4gIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSxcbiAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6XG4gICAqL1xuICBmb3IgKG4gPSAocy5oZWFwX2xlbiA+PiAxLyppbnQgLzIqLyk7IG4gPj0gMTsgbi0tKSB7IHBxZG93bmhlYXAocywgdHJlZSwgbik7IH1cblxuICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvXG4gICAqIGZyZXF1ZW50IG5vZGVzLlxuICAgKi9cbiAgbm9kZSA9IGVsZW1zOyAgICAgICAgICAgICAgLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovXG4gIGRvIHtcbiAgICAvL3BxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovXG4gICAgLyoqKiBwcXJlbW92ZSAqKiovXG4gICAgbiA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTtcbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBzLmhlYXBbcy5oZWFwX2xlbi0tXTtcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuICAgIC8qKiovXG5cbiAgICBtID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqL1xuXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBtO1xuXG4gICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi9cbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IHRyZWVbbiAqIDJdLyouRnJlcSovICsgdHJlZVttICogMl0vKi5GcmVxKi87XG4gICAgcy5kZXB0aFtub2RlXSA9IChzLmRlcHRoW25dID49IHMuZGVwdGhbbV0gPyBzLmRlcHRoW25dIDogcy5kZXB0aFttXSkgKyAxO1xuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkRhZCovID0gdHJlZVttICogMiArIDFdLyouRGFkKi8gPSBub2RlO1xuXG4gICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi9cbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBub2RlKys7XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcblxuICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpO1xuXG4gIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuXG4gIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3dcbiAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLlxuICAgKi9cbiAgZ2VuX2JpdGxlbihzLCBkZXNjKTtcblxuICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovXG4gIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgcy5ibF9jb3VudCk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzXG4gKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLlxuICovXG5mdW5jdGlvbiBzY2FuX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG4gIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0vKi5MZW4qLyA9IDB4ZmZmZjsgLyogZ3VhcmQgKi9cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0vKi5GcmVxKi8gKz0gY291bnQ7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuXG4gICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7IHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLysrOyB9XG4gICAgICBzLmJsX3RyZWVbUkVQXzNfNiAqIDJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8zXzEwICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8xMV8xMzggKiAyXS8qLkZyZXEqLysrO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuXG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluXG4gKiBibF90cmVlLlxuICovXG5mdW5jdGlvbiBzZW5kX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cbntcbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovXG4gIHZhciBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi9cblxuICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBkbyB7IHNlbmRfY29kZShzLCBjdXJsZW4sIHMuYmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT09IDApO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTtcbiAgICAgICAgY291bnQtLTtcbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgXCIgM182P1wiKTtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMik7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMTEsIDcpO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpblxuICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkX2JsX3RyZWUocykge1xuICB2YXIgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICBzY2FuX3RyZWUocywgcy5keW5fbHRyZWUsIHMubF9kZXNjLm1heF9jb2RlKTtcbiAgc2Nhbl90cmVlKHMsIHMuZHluX2R0cmVlLCBzLmRfZGVzYy5tYXhfY29kZSk7XG5cbiAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi9cbiAgYnVpbGRfdHJlZShzLCBzLmJsX2Rlc2MpO1xuICAvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0XG4gICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuXG4gICAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdFxuICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5c1xuICAgKiAzIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaXMgNC4pXG4gICAqL1xuICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7XG4gICAgaWYgKHMuYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF0gKiAyICsgMV0vKi5MZW4qLyAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzICovXG4gIHMub3B0X2xlbiArPSAzICogKG1heF9ibGluZGV4ICsgMSkgKyA1ICsgNSArIDQ7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZFwiLFxuICAvLyAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpO1xuXG4gIHJldHVybiBtYXhfYmxpbmRleDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZVxuICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuXG4gKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfYWxsX3RyZWVzKHMsIGxjb2RlcywgZGNvZGVzLCBibGNvZGVzKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxjb2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi9cbntcbiAgdmFyIHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqL1xuXG4gIC8vQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgXCJub3QgZW5vdWdoIGNvZGVzXCIpO1xuICAvL0Fzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUyxcbiAgLy8gICAgICAgIFwidG9vIG1hbnkgY29kZXNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY291bnRzOiBcIikpO1xuICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCAgIDUpO1xuICBzZW5kX2JpdHMocywgYmxjb2RlcyAtIDQsICA0KTsgLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7XG4gICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb2RlICUyZCBcIiwgYmxfb3JkZXJbcmFua10pKTtcbiAgICBzZW5kX2JpdHMocywgcy5ibF90cmVlW2JsX29yZGVyW3JhbmtdICogMiArIDFdLyouTGVuKi8sIDMpO1xuICB9XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsgLyogbGl0ZXJhbCB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlwZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06XG4gKiAtIFRFWFQgaWYgdGhlIHR3byBjb25kaXRpb25zIGJlbG93IGFyZSBzYXRpc2ZpZWQ6XG4gKiAgICBhKSBUaGVyZSBhcmUgbm8gbm9uLXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcImJsYWNrIGxpc3RcIiAoMC4uNiwgMTQuLjI1LCAyOC4uMzEpLlxuICogICAgYikgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJ3aGl0ZSBsaXN0XCIgKDkge1RBQn0sIDEwIHtMRn0sIDEzIHtDUn0sIDMyLi4yNTUpLlxuICogLSBCSU5BUlkgb3RoZXJ3aXNlLlxuICogLSBUaGUgZm9sbG93aW5nIHBhcnRpYWxseS1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgZm9ybSBhXG4gKiAgIFwiZ3JheSBsaXN0XCIgdGhhdCBpcyBpZ25vcmVkIGluIHRoaXMgZGV0ZWN0aW9uIGFsZ29yaXRobTpcbiAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LlxuICovXG5mdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpIHtcbiAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzXG4gICAqIHNldCBiaXRzIDAuLjYsIDE0Li4yNSwgYW5kIDI4Li4zMVxuICAgKiAweGYzZmZjMDdmID0gYmluYXJ5IDExMTEwMDExMTExMTExMTExMTAwMDAwMDAxMTExMTExXG4gICAqL1xuICB2YXIgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2Y7XG4gIHZhciBuO1xuXG4gIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoXCJibGFjay1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj49IDEpIHtcbiAgICBpZiAoKGJsYWNrX21hc2sgJiAxKSAmJiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSkge1xuICAgICAgcmV0dXJuIFpfQklOQVJZO1xuICAgIH1cbiAgfVxuXG4gIC8qIENoZWNrIGZvciB0ZXh0dWFsIChcIndoaXRlLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgaWYgKHMuZHluX2x0cmVlWzkgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fCBzLmR5bl9sdHJlZVsxMCAqIDJdLyouRnJlcSovICE9PSAwIHx8XG4gICAgICBzLmR5bl9sdHJlZVsxMyAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgcmV0dXJuIFpfVEVYVDtcbiAgfVxuICBmb3IgKG4gPSAzMjsgbiA8IExJVEVSQUxTOyBuKyspIHtcbiAgICBpZiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICByZXR1cm4gWl9URVhUO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZXJlIGFyZSBubyBcImJsYWNrLWxpc3RlZFwiIG9yIFwid2hpdGUtbGlzdGVkXCIgYnl0ZXM6XG4gICAqIHRoaXMgc3RyZWFtIGVpdGhlciBpcyBlbXB0eSBvciBoYXMgdG9sZXJhdGVkIChcImdyYXktbGlzdGVkXCIpIGJ5dGVzIG9ubHkuXG4gICAqL1xuICByZXR1cm4gWl9CSU5BUlk7XG59XG5cblxudmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIF90cl9pbml0KHMpXG57XG5cbiAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7XG4gICAgdHJfc3RhdGljX2luaXQoKTtcbiAgICBzdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbiAgfVxuXG4gIHMubF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9sdHJlZSwgc3RhdGljX2xfZGVzYyk7XG4gIHMuZF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7XG4gIHMuYmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmJsX3RyZWUsIHN0YXRpY19ibF9kZXNjKTtcblxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqL1xuICBpbml0X2Jsb2NrKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHN0b3JlZCBibG9ja1xuICovXG5mdW5jdGlvbiBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jayAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTsgICAgLyogc2VuZCBibG9jayB0eXBlICovXG4gIGNvcHlfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsgLyogd2l0aCBoZWFkZXIgKi9cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuXG4gKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gX3RyX2FsaWduKHMpIHtcbiAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUyA8PCAxLCAzKTtcbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTtcbiAgYmlfZmx1c2gocyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWNcbiAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS5cbiAqL1xuZnVuY3Rpb24gX3RyX2ZsdXNoX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHZhciBvcHRfbGVuYiwgc3RhdGljX2xlbmI7ICAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovXG4gIHZhciBtYXhfYmxpbmRleCA9IDA7ICAgICAgICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqL1xuICBpZiAocy5sZXZlbCA+IDApIHtcblxuICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIGlzIGJpbmFyeSBvciB0ZXh0ICovXG4gICAgaWYgKHMuc3RybS5kYXRhX3R5cGUgPT09IFpfVU5LTk9XTikge1xuICAgICAgcy5zdHJtLmRhdGFfdHlwZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7XG4gICAgfVxuXG4gICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICAgIGJ1aWxkX3RyZWUocywgcy5sX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgICBidWlsZF90cmVlKHMsIHMuZF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcbiAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2ZcbiAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLlxuICAgICAqL1xuXG4gICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXhcbiAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7XG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgdGhlIGJsb2NrIGxlbmd0aHMgaW4gYnl0ZXMuICovXG4gICAgb3B0X2xlbmIgPSAocy5vcHRfbGVuICsgMyArIDcpID4+PiAzO1xuICAgIHN0YXRpY19sZW5iID0gKHMuc3RhdGljX2xlbiArIDMgKyA3KSA+Pj4gMztcblxuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbm9wdCAlbHUoJWx1KSBzdGF0ICVsdSglbHUpIHN0b3JlZCAlbHUgbGl0ICV1IFwiLFxuICAgIC8vICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sXG4gICAgLy8gICAgICAgIHMtPmxhc3RfbGl0KSk7XG5cbiAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIHsgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYjsgfVxuXG4gIH0gZWxzZSB7XG4gICAgLy8gQXNzZXJ0KGJ1ZiAhPSAoY2hhciopMCwgXCJsb3N0IGJ1ZlwiKTtcbiAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovXG4gIH1cblxuICBpZiAoKHN0b3JlZF9sZW4gKyA0IDw9IG9wdF9sZW5iKSAmJiAoYnVmICE9PSAtMSkpIHtcbiAgICAvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovXG5cbiAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLlxuICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2VcbiAgICAgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW5cbiAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG9cbiAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLlxuICAgICAqL1xuICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTtcblxuICB9IGVsc2UgaWYgKHMuc3RyYXRlZ3kgPT09IFpfRklYRUQgfHwgc3RhdGljX2xlbmIgPT09IG9wdF9sZW5iKSB7XG5cbiAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzdGF0aWNfbHRyZWUsIHN0YXRpY19kdHJlZSk7XG5cbiAgfSBlbHNlIHtcbiAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzLmR5bl9sdHJlZSwgcy5keW5fZHRyZWUpO1xuICB9XG4gIC8vIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCBcImJhZCBjb21wcmVzc2VkIHNpemVcIik7XG4gIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CXG4gICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLlxuICAgKi9cbiAgaW5pdF9ibG9jayhzKTtcblxuICBpZiAobGFzdCkge1xuICAgIGJpX3dpbmR1cChzKTtcbiAgfVxuICAvLyBUcmFjZXYoKHN0ZGVycixcIlxcbmNvbXBybGVuICVsdSglbHUpIFwiLCBzLT5jb21wcmVzc2VkX2xlbj4+MyxcbiAgLy8gICAgICAgcy0+Y29tcHJlc3NlZF9sZW4tNypsYXN0KSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFJldHVybiB0cnVlIGlmXG4gKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIF90cl90YWxseShzLCBkaXN0LCBsYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB1bnNpZ25lZCBkaXN0OyAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbi8vICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqL1xue1xuICAvL3ZhciBvdXRfbGVuZ3RoLCBpbl9sZW5ndGgsIGRjb2RlO1xuXG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyXSAgICAgPSAoZGlzdCA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMiArIDFdID0gZGlzdCAmIDB4ZmY7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgcy5sYXN0X2xpdF0gPSBsYyAmIDB4ZmY7XG4gIHMubGFzdF9saXQrKztcblxuICBpZiAoZGlzdCA9PT0gMCkge1xuICAgIC8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqL1xuICAgIHMuZHluX2x0cmVlW2xjICogMl0vKi5GcmVxKi8rKztcbiAgfSBlbHNlIHtcbiAgICBzLm1hdGNoZXMrKztcbiAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgLy9Bc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJlxuICAgIC8vICAgICAgICh1c2gpbGMgPD0gKHVzaCkoTUFYX01BVENILU1JTl9NQVRDSCkgJiZcbiAgICAvLyAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgIFwiX3RyX3RhbGx5OiBiYWQgbWF0Y2hcIik7XG5cbiAgICBzLmR5bl9sdHJlZVsoX2xlbmd0aF9jb2RlW2xjXSArIExJVEVSQUxTICsgMSkgKiAyXS8qLkZyZXEqLysrO1xuICAgIHMuZHluX2R0cmVlW2RfY29kZShkaXN0KSAqIDJdLyouRnJlcSovKys7XG4gIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhdWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcblxuLy8jaWZkZWYgVFJVTkNBVEVfQkxPQ0tcbi8vICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi9cbi8vICBpZiAoKHMubGFzdF9saXQgJiAweDFmZmYpID09PSAwICYmIHMubGV2ZWwgPiAyKSB7XG4vLyAgICAvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBsZW5ndGggKi9cbi8vICAgIG91dF9sZW5ndGggPSBzLmxhc3RfbGl0Kjg7XG4vLyAgICBpbl9sZW5ndGggPSBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydDtcbi8vXG4vLyAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7XG4vLyAgICAgIG91dF9sZW5ndGggKz0gcy5keW5fZHRyZWVbZGNvZGUqMl0vKi5GcmVxKi8gKiAoNSArIGV4dHJhX2RiaXRzW2Rjb2RlXSk7XG4vLyAgICB9XG4vLyAgICBvdXRfbGVuZ3RoID4+Pj0gMztcbi8vICAgIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgXCIsXG4vLyAgICAvLyAgICAgICBzLT5sYXN0X2xpdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLFxuLy8gICAgLy8gICAgICAgMTAwTCAtIG91dF9sZW5ndGgqMTAwTC9pbl9sZW5ndGgpKTtcbi8vICAgIGlmIChzLm1hdGNoZXMgPCAocy5sYXN0X2xpdD4+MSkvKmludCAvMiovICYmIG91dF9sZW5ndGggPCAoaW5fbGVuZ3RoPj4xKS8qaW50IC8yKi8pIHtcbi8vICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICB9XG4vLyAgfVxuLy8jZW5kaWZcblxuICByZXR1cm4gKHMubGFzdF9saXQgPT09IHMubGl0X2J1ZnNpemUgLSAxKTtcbiAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLXG4gICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvXG4gICAqIDY0Sy0xIGJ5dGVzLlxuICAgKi9cbn1cblxuZXhwb3J0cy5fdHJfaW5pdCAgPSBfdHJfaW5pdDtcbmV4cG9ydHMuX3RyX3N0b3JlZF9ibG9jayA9IF90cl9zdG9yZWRfYmxvY2s7XG5leHBvcnRzLl90cl9mbHVzaF9ibG9jayAgPSBfdHJfZmx1c2hfYmxvY2s7XG5leHBvcnRzLl90cl90YWxseSA9IF90cl90YWxseTtcbmV4cG9ydHMuX3RyX2FsaWduID0gX3RyX2FsaWduO1xuXG59LHtcIi4uL3V0aWxzL2NvbW1vblwiOjMwNH1dLDMxNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuZnVuY3Rpb24gWlN0cmVhbSgpIHtcbiAgLyogbmV4dCBpbnB1dCBieXRlICovXG4gIHRoaXMuaW5wdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG4gIHRoaXMubmV4dF9pbiA9IDA7XG4gIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgaW5wdXQgKi9cbiAgdGhpcy5hdmFpbF9pbiA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqL1xuICB0aGlzLnRvdGFsX2luID0gMDtcbiAgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovXG4gIHRoaXMub3V0cHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfb3V0ID0gMDtcbiAgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgb3V0cHV0ICovXG4gIHRoaXMuYXZhaWxfb3V0ID0gMDtcbiAgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9vdXQgPSAwO1xuICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi9cbiAgdGhpcy5tc2cgPSAnJy8qWl9OVUxMKi87XG4gIC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqL1xuICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqL1xuICB0aGlzLmRhdGFfdHlwZSA9IDIvKlpfVU5LTk9XTiovO1xuICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqL1xuICB0aGlzLmFkbGVyID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBaU3RyZWFtO1xuXG59LHt9XSwzMTc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxufSx7fV0sMzE4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIFRoaXMgbWV0aG9kIG9mIG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdCBuZWVkcyB0byBiZVxuLy8ga2VwdCBpZGVudGljYWwgdG8gdGhlIHdheSBpdCBpcyBvYnRhaW5lZCBpbiBydW50aW1lLmpzXG52YXIgZyA9IChmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMgfSkoKSB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG5cbi8vIFVzZSBgZ2V0T3duUHJvcGVydHlOYW1lc2AgYmVjYXVzZSBub3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgY2FsbGluZ1xuLy8gYGhhc093blByb3BlcnR5YCBvbiB0aGUgZ2xvYmFsIGBzZWxmYCBvYmplY3QgaW4gYSB3b3JrZXIuIFNlZSAjMTgzLlxudmFyIGhhZFJ1bnRpbWUgPSBnLnJlZ2VuZXJhdG9yUnVudGltZSAmJlxuICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhnKS5pbmRleE9mKFwicmVnZW5lcmF0b3JSdW50aW1lXCIpID49IDA7XG5cbi8vIFNhdmUgdGhlIG9sZCByZWdlbmVyYXRvclJ1bnRpbWUgaW4gY2FzZSBpdCBuZWVkcyB0byBiZSByZXN0b3JlZCBsYXRlci5cbnZhciBvbGRSdW50aW1lID0gaGFkUnVudGltZSAmJiBnLnJlZ2VuZXJhdG9yUnVudGltZTtcblxuLy8gRm9yY2UgcmVldmFsdXRhdGlvbiBvZiBydW50aW1lLmpzLlxuZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1bmRlZmluZWQ7XG5cbm1vZHVsZS5leHBvcnRzID0gX2RlcmVxXyhcIi4vcnVudGltZVwiKTtcblxuaWYgKGhhZFJ1bnRpbWUpIHtcbiAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcnVudGltZS5cbiAgZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBvbGRSdW50aW1lO1xufSBlbHNlIHtcbiAgLy8gUmVtb3ZlIHRoZSBnbG9iYWwgcHJvcGVydHkgYWRkZWQgYnkgcnVudGltZS5qcy5cbiAgdHJ5IHtcbiAgICBkZWxldGUgZy5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIH0gY2F0Y2goZSkge1xuICAgIGcucmVnZW5lcmF0b3JSdW50aW1lID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbn0se1wiLi9ydW50aW1lXCI6MzE5fV0sMzE5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIGh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvbWFzdGVyL0xJQ0VOU0UgZmlsZS4gQW5cbiAqIGFkZGl0aW9uYWwgZ3JhbnQgb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpblxuICogdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbiEoZnVuY3Rpb24oZ2xvYmFsKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgdmFyIGluTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIjtcbiAgdmFyIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lO1xuICBpZiAocnVudGltZSkge1xuICAgIGlmIChpbk1vZHVsZSkge1xuICAgICAgLy8gSWYgcmVnZW5lcmF0b3JSdW50aW1lIGlzIGRlZmluZWQgZ2xvYmFsbHkgYW5kIHdlJ3JlIGluIGEgbW9kdWxlLFxuICAgICAgLy8gbWFrZSB0aGUgZXhwb3J0cyBvYmplY3QgaWRlbnRpY2FsIHRvIHJlZ2VuZXJhdG9yUnVudGltZS5cbiAgICAgIG1vZHVsZS5leHBvcnRzID0gcnVudGltZTtcbiAgICB9XG4gICAgLy8gRG9uJ3QgYm90aGVyIGV2YWx1YXRpbmcgdGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGlmIHRoZSBydW50aW1lIHdhc1xuICAgIC8vIGFscmVhZHkgZGVmaW5lZCBnbG9iYWxseS5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZWZpbmUgdGhlIHJ1bnRpbWUgZ2xvYmFsbHkgKGFzIGV4cGVjdGVkIGJ5IGdlbmVyYXRlZCBjb2RlKSBhcyBlaXRoZXJcbiAgLy8gbW9kdWxlLmV4cG9ydHMgKGlmIHdlJ3JlIGluIGEgbW9kdWxlKSBvciBhIG5ldywgZW1wdHkgb2JqZWN0LlxuICBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZSA9IGluTW9kdWxlID8gbW9kdWxlLmV4cG9ydHMgOiB7fTtcblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBydW50aW1lLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZVt0b1N0cmluZ1RhZ1N5bWJvbF0gPVxuICAgIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIHByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIHJ1bnRpbWUubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgaWYgKCEodG9TdHJpbmdUYWdTeW1ib2wgaW4gZ2VuRnVuKSkge1xuICAgICAgICBnZW5GdW5bdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBydW50aW1lLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi4gSWYgdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQsIGhvd2V2ZXIsIHRoZVxuICAgICAgICAgIC8vIHJlc3VsdCBmb3IgdGhpcyBpdGVyYXRpb24gd2lsbCBiZSByZWplY3RlZCB3aXRoIHRoZSBzYW1lXG4gICAgICAgICAgLy8gcmVhc29uLiBOb3RlIHRoYXQgcmVqZWN0aW9ucyBvZiB5aWVsZGVkIFByb21pc2VzIGFyZSBub3RcbiAgICAgICAgICAvLyB0aHJvd24gYmFjayBpbnRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIGFzIGlzIHRoZSBjYXNlXG4gICAgICAgICAgLy8gd2hlbiBhbiBhd2FpdGVkIFByb21pc2UgaXMgcmVqZWN0ZWQuIFRoaXMgZGlmZmVyZW5jZSBpblxuICAgICAgICAgIC8vIGJlaGF2aW9yIGJldHdlZW4geWllbGQgYW5kIGF3YWl0IGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdFxuICAgICAgICAgIC8vIGFsbG93cyB0aGUgY29uc3VtZXIgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgeWllbGRlZFxuICAgICAgICAgIC8vIHJlamVjdGlvbiAoc3dhbGxvdyBpdCBhbmQgY29udGludWUsIG1hbnVhbGx5IC50aHJvdyBpdCBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgZ2VuZXJhdG9yLCBhYmFuZG9uIGl0ZXJhdGlvbiwgd2hhdGV2ZXIpLiBXaXRoXG4gICAgICAgICAgLy8gYXdhaXQsIGJ5IGNvbnRyYXN0LCB0aGVyZSBpcyBubyBvcHBvcnR1bml0eSB0byBleGFtaW5lIHRoZVxuICAgICAgICAgIC8vIHJlamVjdGlvbiByZWFzb24gb3V0c2lkZSB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBzbyB0aGVcbiAgICAgICAgICAvLyBvbmx5IG9wdGlvbiBpcyB0byB0aHJvdyBpdCBmcm9tIHRoZSBhd2FpdCBleHByZXNzaW9uLCBhbmRcbiAgICAgICAgICAvLyBsZXQgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBoYW5kbGUgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIHJ1bnRpbWUuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIHJ1bnRpbWUuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KVxuICAgICk7XG5cbiAgICByZXR1cm4gcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIEdwW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yXCI7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgcnVudGltZS5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIHJ1bnRpbWUudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG59KShcbiAgLy8gSW4gc2xvcHB5IG1vZGUsIHVuYm91bmQgYHRoaXNgIHJlZmVycyB0byB0aGUgZ2xvYmFsIG9iamVjdCwgZmFsbGJhY2sgdG9cbiAgLy8gRnVuY3Rpb24gY29uc3RydWN0b3IgaWYgd2UncmUgaW4gZ2xvYmFsIHN0cmljdCBtb2RlLiBUaGF0IGlzIHNhZGx5IGEgZm9ybVxuICAvLyBvZiBpbmRpcmVjdCBldmFsIHdoaWNoIHZpb2xhdGVzIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5LlxuICAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzIH0pKCkgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpXG4pO1xuXG59LHt9XSwzMjA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuKGZ1bmN0aW9uIChnbG9iYWwpe1xuKGZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBleHBvcnRzPT09XCJvYmplY3RcIiYmdHlwZW9mIG1vZHVsZSE9PVwidW5kZWZpbmVkXCIpe21vZHVsZS5leHBvcnRzPWYoKX1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT1cImZ1bmN0aW9uXCImJmRlZmluZS5hbWQpe2RlZmluZShbXSxmKX1lbHNle3ZhciBnO2lmKHR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiKXtnPXdpbmRvd31lbHNlIGlmKHR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiKXtnPWdsb2JhbH1lbHNlIGlmKHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIil7Zz1zZWxmfWVsc2V7Zz10aGlzfWcuUnVzaGEgPSBmKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiAoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIF9kZXJlcV89PVwiZnVuY3Rpb25cIiYmX2RlcmVxXztpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgX2RlcmVxXz09XCJmdW5jdGlvblwiJiZfZGVyZXFfO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSh7MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgYnVuZGxlRm4gPSBhcmd1bWVudHNbM107XG52YXIgc291cmNlcyA9IGFyZ3VtZW50c1s0XTtcbnZhciBjYWNoZSA9IGFyZ3VtZW50c1s1XTtcblxudmFyIHN0cmluZ2lmeSA9IEpTT04uc3RyaW5naWZ5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgb3B0aW9ucykge1xuICAgIHZhciB3a2V5O1xuICAgIHZhciBjYWNoZUtleXMgPSBPYmplY3Qua2V5cyhjYWNoZSk7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNhY2hlS2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIGtleSA9IGNhY2hlS2V5c1tpXTtcbiAgICAgICAgdmFyIGV4cCA9IGNhY2hlW2tleV0uZXhwb3J0cztcbiAgICAgICAgLy8gVXNpbmcgYmFiZWwgYXMgYSB0cmFuc3BpbGVyIHRvIHVzZSBlc21vZHVsZSwgdGhlIGV4cG9ydCB3aWxsIGFsd2F5c1xuICAgICAgICAvLyBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdCBleHBvcnQgYXMgYSBwcm9wZXJ0eSBvZiBpdC4gVG8gZW5zdXJlXG4gICAgICAgIC8vIHRoZSBleGlzdGluZyBhcGkgYW5kIGJhYmVsIGVzbW9kdWxlIGV4cG9ydHMgYXJlIGJvdGggc3VwcG9ydGVkIHdlXG4gICAgICAgIC8vIGNoZWNrIGZvciBib3RoXG4gICAgICAgIGlmIChleHAgPT09IGZuIHx8IGV4cCAmJiBleHAuZGVmYXVsdCA9PT0gZm4pIHtcbiAgICAgICAgICAgIHdrZXkgPSBrZXk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghd2tleSkge1xuICAgICAgICB3a2V5ID0gTWF0aC5mbG9vcihNYXRoLnBvdygxNiwgOCkgKiBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygxNik7XG4gICAgICAgIHZhciB3Y2FjaGUgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjYWNoZUtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gY2FjaGVLZXlzW2ldO1xuICAgICAgICAgICAgd2NhY2hlW2tleV0gPSBrZXk7XG4gICAgICAgIH1cbiAgICAgICAgc291cmNlc1t3a2V5XSA9IFtcbiAgICAgICAgICAgICdmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsnICsgZm4gKyAnKHNlbGYpOyB9JyxcbiAgICAgICAgICAgIHdjYWNoZVxuICAgICAgICBdO1xuICAgIH1cbiAgICB2YXIgc2tleSA9IE1hdGguZmxvb3IoTWF0aC5wb3coMTYsIDgpICogTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoMTYpO1xuXG4gICAgdmFyIHNjYWNoZSA9IHt9OyBzY2FjaGVbd2tleV0gPSB3a2V5O1xuICAgIHNvdXJjZXNbc2tleV0gPSBbXG4gICAgICAgICdmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsnICtcbiAgICAgICAgICAgIC8vIHRyeSB0byBjYWxsIGRlZmF1bHQgaWYgZGVmaW5lZCB0byBhbHNvIHN1cHBvcnQgYmFiZWwgZXNtb2R1bGUgZXhwb3J0c1xuICAgICAgICAgICAgJ3ZhciBmID0gcmVxdWlyZSgnICsgc3RyaW5naWZ5KHdrZXkpICsgJyk7JyArXG4gICAgICAgICAgICAnKGYuZGVmYXVsdCA/IGYuZGVmYXVsdCA6IGYpKHNlbGYpOycgK1xuICAgICAgICAnfScsXG4gICAgICAgIHNjYWNoZVxuICAgIF07XG5cbiAgICB2YXIgd29ya2VyU291cmNlcyA9IHt9O1xuICAgIHJlc29sdmVTb3VyY2VzKHNrZXkpO1xuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVNvdXJjZXMoa2V5KSB7XG4gICAgICAgIHdvcmtlclNvdXJjZXNba2V5XSA9IHRydWU7XG5cbiAgICAgICAgZm9yICh2YXIgZGVwUGF0aCBpbiBzb3VyY2VzW2tleV1bMV0pIHtcbiAgICAgICAgICAgIHZhciBkZXBLZXkgPSBzb3VyY2VzW2tleV1bMV1bZGVwUGF0aF07XG4gICAgICAgICAgICBpZiAoIXdvcmtlclNvdXJjZXNbZGVwS2V5XSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmVTb3VyY2VzKGRlcEtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3JjID0gJygnICsgYnVuZGxlRm4gKyAnKSh7J1xuICAgICAgICArIE9iamVjdC5rZXlzKHdvcmtlclNvdXJjZXMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5naWZ5KGtleSkgKyAnOlsnXG4gICAgICAgICAgICAgICAgKyBzb3VyY2VzW2tleV1bMF1cbiAgICAgICAgICAgICAgICArICcsJyArIHN0cmluZ2lmeShzb3VyY2VzW2tleV1bMV0pICsgJ10nXG4gICAgICAgICAgICA7XG4gICAgICAgIH0pLmpvaW4oJywnKVxuICAgICAgICArICd9LHt9LFsnICsgc3RyaW5naWZ5KHNrZXkpICsgJ10pJ1xuICAgIDtcblxuICAgIHZhciBVUkwgPSB3aW5kb3cuVVJMIHx8IHdpbmRvdy53ZWJraXRVUkwgfHwgd2luZG93Lm1velVSTCB8fCB3aW5kb3cubXNVUkw7XG5cbiAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtzcmNdLCB7IHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnIH0pO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYmFyZSkgeyByZXR1cm4gYmxvYjsgfVxuICAgIHZhciB3b3JrZXJVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVybCk7XG4gICAgd29ya2VyLm9iamVjdFVSTCA9IHdvcmtlclVybDtcbiAgICByZXR1cm4gd29ya2VyO1xufTtcblxufSx7fV0sMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4oZnVuY3Rpb24gKGdsb2JhbCl7XG5cInVzZSBzdHJpY3RcIjtcbi8qIGVzbGludC1lbnYgY29tbW9uanMsIGJyb3dzZXIgKi9cblxudmFyIHJlYWRlciA9IHZvaWQgMDtcbmlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHNlbGYuRmlsZVJlYWRlclN5bmMgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJlYWRlciA9IG5ldyBzZWxmLkZpbGVSZWFkZXJTeW5jKCk7XG59XG5cbi8vIENvbnZlcnQgYSBiaW5hcnkgc3RyaW5nIGFuZCB3cml0ZSBpdCB0byB0aGUgaGVhcC5cbi8vIEEgYmluYXJ5IHN0cmluZyBpcyBleHBlY3RlZCB0byBvbmx5IGNvbnRhaW4gY2hhciBjb2RlcyA8IDI1Ni5cbnZhciBjb252U3RyID0gZnVuY3Rpb24gKHN0ciwgSDgsIEgzMiwgc3RhcnQsIGxlbiwgb2ZmKSB7XG4gIHZhciBpID0gdm9pZCAwLFxuICAgICAgb20gPSBvZmYgJSA0LFxuICAgICAgbG0gPSAobGVuICsgb20pICUgNCxcbiAgICAgIGogPSBsZW4gLSBsbTtcbiAgc3dpdGNoIChvbSkge1xuICAgIGNhc2UgMDpcbiAgICAgIEg4W29mZl0gPSBzdHIuY2hhckNvZGVBdChzdGFydCArIDMpO1xuICAgIGNhc2UgMTpcbiAgICAgIEg4W29mZiArIDEgLSAob20gPDwgMSkgfCAwXSA9IHN0ci5jaGFyQ29kZUF0KHN0YXJ0ICsgMik7XG4gICAgY2FzZSAyOlxuICAgICAgSDhbb2ZmICsgMiAtIChvbSA8PCAxKSB8IDBdID0gc3RyLmNoYXJDb2RlQXQoc3RhcnQgKyAxKTtcbiAgICBjYXNlIDM6XG4gICAgICBIOFtvZmYgKyAzIC0gKG9tIDw8IDEpIHwgMF0gPSBzdHIuY2hhckNvZGVBdChzdGFydCk7XG4gIH1cbiAgaWYgKGxlbiA8IGxtICsgKDQgLSBvbSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChpID0gNCAtIG9tOyBpIDwgajsgaSA9IGkgKyA0IHwgMCkge1xuICAgIEgzMltvZmYgKyBpID4+IDJdID0gc3RyLmNoYXJDb2RlQXQoc3RhcnQgKyBpKSA8PCAyNCB8IHN0ci5jaGFyQ29kZUF0KHN0YXJ0ICsgaSArIDEpIDw8IDE2IHwgc3RyLmNoYXJDb2RlQXQoc3RhcnQgKyBpICsgMikgPDwgOCB8IHN0ci5jaGFyQ29kZUF0KHN0YXJ0ICsgaSArIDMpO1xuICB9XG4gIHN3aXRjaCAobG0pIHtcbiAgICBjYXNlIDM6XG4gICAgICBIOFtvZmYgKyBqICsgMSB8IDBdID0gc3RyLmNoYXJDb2RlQXQoc3RhcnQgKyBqICsgMik7XG4gICAgY2FzZSAyOlxuICAgICAgSDhbb2ZmICsgaiArIDIgfCAwXSA9IHN0ci5jaGFyQ29kZUF0KHN0YXJ0ICsgaiArIDEpO1xuICAgIGNhc2UgMTpcbiAgICAgIEg4W29mZiArIGogKyAzIHwgMF0gPSBzdHIuY2hhckNvZGVBdChzdGFydCArIGopO1xuICB9XG59O1xuXG4vLyBDb252ZXJ0IGEgYnVmZmVyIG9yIGFycmF5IGFuZCB3cml0ZSBpdCB0byB0aGUgaGVhcC5cbi8vIFRoZSBidWZmZXIgb3IgYXJyYXkgaXMgZXhwZWN0ZWQgdG8gb25seSBjb250YWluIGVsZW1lbnRzIDwgMjU2LlxudmFyIGNvbnZCdWYgPSBmdW5jdGlvbiAoYnVmLCBIOCwgSDMyLCBzdGFydCwgbGVuLCBvZmYpIHtcbiAgdmFyIGkgPSB2b2lkIDAsXG4gICAgICBvbSA9IG9mZiAlIDQsXG4gICAgICBsbSA9IChsZW4gKyBvbSkgJSA0LFxuICAgICAgaiA9IGxlbiAtIGxtO1xuICBzd2l0Y2ggKG9tKSB7XG4gICAgY2FzZSAwOlxuICAgICAgSDhbb2ZmXSA9IGJ1ZltzdGFydCArIDNdO1xuICAgIGNhc2UgMTpcbiAgICAgIEg4W29mZiArIDEgLSAob20gPDwgMSkgfCAwXSA9IGJ1ZltzdGFydCArIDJdO1xuICAgIGNhc2UgMjpcbiAgICAgIEg4W29mZiArIDIgLSAob20gPDwgMSkgfCAwXSA9IGJ1ZltzdGFydCArIDFdO1xuICAgIGNhc2UgMzpcbiAgICAgIEg4W29mZiArIDMgLSAob20gPDwgMSkgfCAwXSA9IGJ1ZltzdGFydF07XG4gIH1cbiAgaWYgKGxlbiA8IGxtICsgKDQgLSBvbSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChpID0gNCAtIG9tOyBpIDwgajsgaSA9IGkgKyA0IHwgMCkge1xuICAgIEgzMltvZmYgKyBpID4+IDIgfCAwXSA9IGJ1ZltzdGFydCArIGldIDw8IDI0IHwgYnVmW3N0YXJ0ICsgaSArIDFdIDw8IDE2IHwgYnVmW3N0YXJ0ICsgaSArIDJdIDw8IDggfCBidWZbc3RhcnQgKyBpICsgM107XG4gIH1cbiAgc3dpdGNoIChsbSkge1xuICAgIGNhc2UgMzpcbiAgICAgIEg4W29mZiArIGogKyAxIHwgMF0gPSBidWZbc3RhcnQgKyBqICsgMl07XG4gICAgY2FzZSAyOlxuICAgICAgSDhbb2ZmICsgaiArIDIgfCAwXSA9IGJ1ZltzdGFydCArIGogKyAxXTtcbiAgICBjYXNlIDE6XG4gICAgICBIOFtvZmYgKyBqICsgMyB8IDBdID0gYnVmW3N0YXJ0ICsgal07XG4gIH1cbn07XG5cbnZhciBjb252QmxvYiA9IGZ1bmN0aW9uIChibG9iLCBIOCwgSDMyLCBzdGFydCwgbGVuLCBvZmYpIHtcbiAgdmFyIGkgPSB2b2lkIDAsXG4gICAgICBvbSA9IG9mZiAlIDQsXG4gICAgICBsbSA9IChsZW4gKyBvbSkgJSA0LFxuICAgICAgaiA9IGxlbiAtIGxtO1xuICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkocmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2Iuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgbGVuKSkpO1xuICBzd2l0Y2ggKG9tKSB7XG4gICAgY2FzZSAwOlxuICAgICAgSDhbb2ZmXSA9IGJ1ZlszXTtcbiAgICBjYXNlIDE6XG4gICAgICBIOFtvZmYgKyAxIC0gKG9tIDw8IDEpIHwgMF0gPSBidWZbMl07XG4gICAgY2FzZSAyOlxuICAgICAgSDhbb2ZmICsgMiAtIChvbSA8PCAxKSB8IDBdID0gYnVmWzFdO1xuICAgIGNhc2UgMzpcbiAgICAgIEg4W29mZiArIDMgLSAob20gPDwgMSkgfCAwXSA9IGJ1ZlswXTtcbiAgfVxuICBpZiAobGVuIDwgbG0gKyAoNCAtIG9tKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGkgPSA0IC0gb207IGkgPCBqOyBpID0gaSArIDQgfCAwKSB7XG4gICAgSDMyW29mZiArIGkgPj4gMiB8IDBdID0gYnVmW2ldIDw8IDI0IHwgYnVmW2kgKyAxXSA8PCAxNiB8IGJ1ZltpICsgMl0gPDwgOCB8IGJ1ZltpICsgM107XG4gIH1cbiAgc3dpdGNoIChsbSkge1xuICAgIGNhc2UgMzpcbiAgICAgIEg4W29mZiArIGogKyAxIHwgMF0gPSBidWZbaiArIDJdO1xuICAgIGNhc2UgMjpcbiAgICAgIEg4W29mZiArIGogKyAyIHwgMF0gPSBidWZbaiArIDFdO1xuICAgIGNhc2UgMTpcbiAgICAgIEg4W29mZiArIGogKyAzIHwgMF0gPSBidWZbal07XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRhdGEsIEg4LCBIMzIsIHN0YXJ0LCBsZW4sIG9mZikge1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGNvbnZTdHIoZGF0YSwgSDgsIEgzMiwgc3RhcnQsIGxlbiwgb2ZmKTtcbiAgfVxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgcmV0dXJuIGNvbnZCdWYoZGF0YSwgSDgsIEgzMiwgc3RhcnQsIGxlbiwgb2ZmKTtcbiAgfVxuICBpZiAoZ2xvYmFsLkJ1ZmZlciAmJiBnbG9iYWwuQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSB7XG4gICAgcmV0dXJuIGNvbnZCdWYoZGF0YSwgSDgsIEgzMiwgc3RhcnQsIGxlbiwgb2ZmKTtcbiAgfVxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGNvbnZCdWYobmV3IFVpbnQ4QXJyYXkoZGF0YSksIEg4LCBIMzIsIHN0YXJ0LCBsZW4sIG9mZik7XG4gIH1cbiAgaWYgKGRhdGEuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gY29udkJ1ZihuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBkYXRhLmJ5dGVMZW5ndGgpLCBIOCwgSDMyLCBzdGFydCwgbGVuLCBvZmYpO1xuICB9XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgIHJldHVybiBjb252QmxvYihkYXRhLCBIOCwgSDMyLCBzdGFydCwgbGVuLCBvZmYpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZGF0YSB0eXBlLicpO1xufTtcblxufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG59LHt9XSwzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0Jztcbi8vIFRoZSBsb3ctbGV2ZWwgUnVzaENvcmUgbW9kdWxlIHByb3ZpZGVzIHRoZSBoZWFydCBvZiBSdXNoYSxcbi8vIGEgaGlnaC1zcGVlZCBzaGExIGltcGxlbWVudGF0aW9uIHdvcmtpbmcgb24gYW4gSW50MzJBcnJheSBoZWFwLlxuLy8gQXQgZmlyc3QgZ2xhbmNlLCB0aGUgaW1wbGVtZW50YXRpb24gc2VlbXMgY29tcGxpY2F0ZWQsIGhvd2V2ZXJcbi8vIHdpdGggdGhlIFNIQTEgc3BlYyBhdCBoYW5kLCBpdCBpcyBvYnZpb3VzIHRoaXMgYWxtb3N0IGEgdGV4dGJvb2tcbi8vIGltcGxlbWVudGF0aW9uIHRoYXQgaGFzIGEgZmV3IGZ1bmN0aW9ucyBoYW5kLWlubGluZWQgYW5kIGEgZmV3IGxvb3BzXG4vLyBoYW5kLXVucm9sbGVkLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBSdXNoYUNvcmUoc3RkbGliJDExODYsIGZvcmVpZ24kMTE4NywgaGVhcCQxMTg4KSB7XG4gICAgJ3VzZSBhc20nO1xuICAgIHZhciBIJDExODkgPSBuZXcgc3RkbGliJDExODYuSW50MzJBcnJheShoZWFwJDExODgpO1xuICAgIGZ1bmN0aW9uIGhhc2gkMTE5MChrJDExOTEsIHgkMTE5Mikge1xuICAgICAgICAvLyBrIGluIGJ5dGVzXG4gICAgICAgIGskMTE5MSA9IGskMTE5MSB8IDA7XG4gICAgICAgIHgkMTE5MiA9IHgkMTE5MiB8IDA7XG4gICAgICAgIHZhciBpJDExOTMgPSAwLCBqJDExOTQgPSAwLCB5MCQxMTk1ID0gMCwgejAkMTE5NiA9IDAsIHkxJDExOTcgPSAwLCB6MSQxMTk4ID0gMCwgeTIkMTE5OSA9IDAsIHoyJDEyMDAgPSAwLCB5MyQxMjAxID0gMCwgejMkMTIwMiA9IDAsIHk0JDEyMDMgPSAwLCB6NCQxMjA0ID0gMCwgdDAkMTIwNSA9IDAsIHQxJDEyMDYgPSAwO1xuICAgICAgICB5MCQxMTk1ID0gSCQxMTg5W3gkMTE5MiArIDMyMCA+PiAyXSB8IDA7XG4gICAgICAgIHkxJDExOTcgPSBIJDExODlbeCQxMTkyICsgMzI0ID4+IDJdIHwgMDtcbiAgICAgICAgeTIkMTE5OSA9IEgkMTE4OVt4JDExOTIgKyAzMjggPj4gMl0gfCAwO1xuICAgICAgICB5MyQxMjAxID0gSCQxMTg5W3gkMTE5MiArIDMzMiA+PiAyXSB8IDA7XG4gICAgICAgIHk0JDEyMDMgPSBIJDExODlbeCQxMTkyICsgMzM2ID4+IDJdIHwgMDtcbiAgICAgICAgZm9yIChpJDExOTMgPSAwOyAoaSQxMTkzIHwgMCkgPCAoayQxMTkxIHwgMCk7IGkkMTE5MyA9IGkkMTE5MyArIDY0IHwgMCkge1xuICAgICAgICAgICAgejAkMTE5NiA9IHkwJDExOTU7XG4gICAgICAgICAgICB6MSQxMTk4ID0geTEkMTE5NztcbiAgICAgICAgICAgIHoyJDEyMDAgPSB5MiQxMTk5O1xuICAgICAgICAgICAgejMkMTIwMiA9IHkzJDEyMDE7XG4gICAgICAgICAgICB6NCQxMjA0ID0geTQkMTIwMztcbiAgICAgICAgICAgIGZvciAoaiQxMTk0ID0gMDsgKGokMTE5NCB8IDApIDwgNjQ7IGokMTE5NCA9IGokMTE5NCArIDQgfCAwKSB7XG4gICAgICAgICAgICAgICAgdDEkMTIwNiA9IEgkMTE4OVtpJDExOTMgKyBqJDExOTQgPj4gMl0gfCAwO1xuICAgICAgICAgICAgICAgIHQwJDEyMDUgPSAoKHkwJDExOTUgPDwgNSB8IHkwJDExOTUgPj4+IDI3KSArICh5MSQxMTk3ICYgeTIkMTE5OSB8IH55MSQxMTk3ICYgeTMkMTIwMSkgfCAwKSArICgodDEkMTIwNiArIHk0JDEyMDMgfCAwKSArIDE1MTg1MDAyNDkgfCAwKSB8IDA7XG4gICAgICAgICAgICAgICAgeTQkMTIwMyA9IHkzJDEyMDE7XG4gICAgICAgICAgICAgICAgeTMkMTIwMSA9IHkyJDExOTk7XG4gICAgICAgICAgICAgICAgeTIkMTE5OSA9IHkxJDExOTcgPDwgMzAgfCB5MSQxMTk3ID4+PiAyO1xuICAgICAgICAgICAgICAgIHkxJDExOTcgPSB5MCQxMTk1O1xuICAgICAgICAgICAgICAgIHkwJDExOTUgPSB0MCQxMjA1O1xuICAgICAgICAgICAgICAgIEgkMTE4OVtrJDExOTEgKyBqJDExOTQgPj4gMl0gPSB0MSQxMjA2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChqJDExOTQgPSBrJDExOTEgKyA2NCB8IDA7IChqJDExOTQgfCAwKSA8IChrJDExOTEgKyA4MCB8IDApOyBqJDExOTQgPSBqJDExOTQgKyA0IHwgMCkge1xuICAgICAgICAgICAgICAgIHQxJDEyMDYgPSAoSCQxMTg5W2okMTE5NCAtIDEyID4+IDJdIF4gSCQxMTg5W2okMTE5NCAtIDMyID4+IDJdIF4gSCQxMTg5W2okMTE5NCAtIDU2ID4+IDJdIF4gSCQxMTg5W2okMTE5NCAtIDY0ID4+IDJdKSA8PCAxIHwgKEgkMTE4OVtqJDExOTQgLSAxMiA+PiAyXSBeIEgkMTE4OVtqJDExOTQgLSAzMiA+PiAyXSBeIEgkMTE4OVtqJDExOTQgLSA1NiA+PiAyXSBeIEgkMTE4OVtqJDExOTQgLSA2NCA+PiAyXSkgPj4+IDMxO1xuICAgICAgICAgICAgICAgIHQwJDEyMDUgPSAoKHkwJDExOTUgPDwgNSB8IHkwJDExOTUgPj4+IDI3KSArICh5MSQxMTk3ICYgeTIkMTE5OSB8IH55MSQxMTk3ICYgeTMkMTIwMSkgfCAwKSArICgodDEkMTIwNiArIHk0JDEyMDMgfCAwKSArIDE1MTg1MDAyNDkgfCAwKSB8IDA7XG4gICAgICAgICAgICAgICAgeTQkMTIwMyA9IHkzJDEyMDE7XG4gICAgICAgICAgICAgICAgeTMkMTIwMSA9IHkyJDExOTk7XG4gICAgICAgICAgICAgICAgeTIkMTE5OSA9IHkxJDExOTcgPDwgMzAgfCB5MSQxMTk3ID4+PiAyO1xuICAgICAgICAgICAgICAgIHkxJDExOTcgPSB5MCQxMTk1O1xuICAgICAgICAgICAgICAgIHkwJDExOTUgPSB0MCQxMjA1O1xuICAgICAgICAgICAgICAgIEgkMTE4OVtqJDExOTQgPj4gMl0gPSB0MSQxMjA2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChqJDExOTQgPSBrJDExOTEgKyA4MCB8IDA7IChqJDExOTQgfCAwKSA8IChrJDExOTEgKyAxNjAgfCAwKTsgaiQxMTk0ID0gaiQxMTk0ICsgNCB8IDApIHtcbiAgICAgICAgICAgICAgICB0MSQxMjA2ID0gKEgkMTE4OVtqJDExOTQgLSAxMiA+PiAyXSBeIEgkMTE4OVtqJDExOTQgLSAzMiA+PiAyXSBeIEgkMTE4OVtqJDExOTQgLSA1NiA+PiAyXSBeIEgkMTE4OVtqJDExOTQgLSA2NCA+PiAyXSkgPDwgMSB8IChIJDExODlbaiQxMTk0IC0gMTIgPj4gMl0gXiBIJDExODlbaiQxMTk0IC0gMzIgPj4gMl0gXiBIJDExODlbaiQxMTk0IC0gNTYgPj4gMl0gXiBIJDExODlbaiQxMTk0IC0gNjQgPj4gMl0pID4+PiAzMTtcbiAgICAgICAgICAgICAgICB0MCQxMjA1ID0gKCh5MCQxMTk1IDw8IDUgfCB5MCQxMTk1ID4+PiAyNykgKyAoeTEkMTE5NyBeIHkyJDExOTkgXiB5MyQxMjAxKSB8IDApICsgKCh0MSQxMjA2ICsgeTQkMTIwMyB8IDApICsgMTg1OTc3NTM5MyB8IDApIHwgMDtcbiAgICAgICAgICAgICAgICB5NCQxMjAzID0geTMkMTIwMTtcbiAgICAgICAgICAgICAgICB5MyQxMjAxID0geTIkMTE5OTtcbiAgICAgICAgICAgICAgICB5MiQxMTk5ID0geTEkMTE5NyA8PCAzMCB8IHkxJDExOTcgPj4+IDI7XG4gICAgICAgICAgICAgICAgeTEkMTE5NyA9IHkwJDExOTU7XG4gICAgICAgICAgICAgICAgeTAkMTE5NSA9IHQwJDEyMDU7XG4gICAgICAgICAgICAgICAgSCQxMTg5W2okMTE5NCA+PiAyXSA9IHQxJDEyMDY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGokMTE5NCA9IGskMTE5MSArIDE2MCB8IDA7IChqJDExOTQgfCAwKSA8IChrJDExOTEgKyAyNDAgfCAwKTsgaiQxMTk0ID0gaiQxMTk0ICsgNCB8IDApIHtcbiAgICAgICAgICAgICAgICB0MSQxMjA2ID0gKEgkMTE4OVtqJDExOTQgLSAxMiA+PiAyXSBeIEgkMTE4OVtqJDExOTQgLSAzMiA+PiAyXSBeIEgkMTE4OVtqJDExOTQgLSA1NiA+PiAyXSBeIEgkMTE4OVtqJDExOTQgLSA2NCA+PiAyXSkgPDwgMSB8IChIJDExODlbaiQxMTk0IC0gMTIgPj4gMl0gXiBIJDExODlbaiQxMTk0IC0gMzIgPj4gMl0gXiBIJDExODlbaiQxMTk0IC0gNTYgPj4gMl0gXiBIJDExODlbaiQxMTk0IC0gNjQgPj4gMl0pID4+PiAzMTtcbiAgICAgICAgICAgICAgICB0MCQxMjA1ID0gKCh5MCQxMTk1IDw8IDUgfCB5MCQxMTk1ID4+PiAyNykgKyAoeTEkMTE5NyAmIHkyJDExOTkgfCB5MSQxMTk3ICYgeTMkMTIwMSB8IHkyJDExOTkgJiB5MyQxMjAxKSB8IDApICsgKCh0MSQxMjA2ICsgeTQkMTIwMyB8IDApIC0gMTg5NDAwNzU4OCB8IDApIHwgMDtcbiAgICAgICAgICAgICAgICB5NCQxMjAzID0geTMkMTIwMTtcbiAgICAgICAgICAgICAgICB5MyQxMjAxID0geTIkMTE5OTtcbiAgICAgICAgICAgICAgICB5MiQxMTk5ID0geTEkMTE5NyA8PCAzMCB8IHkxJDExOTcgPj4+IDI7XG4gICAgICAgICAgICAgICAgeTEkMTE5NyA9IHkwJDExOTU7XG4gICAgICAgICAgICAgICAgeTAkMTE5NSA9IHQwJDEyMDU7XG4gICAgICAgICAgICAgICAgSCQxMTg5W2okMTE5NCA+PiAyXSA9IHQxJDEyMDY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGokMTE5NCA9IGskMTE5MSArIDI0MCB8IDA7IChqJDExOTQgfCAwKSA8IChrJDExOTEgKyAzMjAgfCAwKTsgaiQxMTk0ID0gaiQxMTk0ICsgNCB8IDApIHtcbiAgICAgICAgICAgICAgICB0MSQxMjA2ID0gKEgkMTE4OVtqJDExOTQgLSAxMiA+PiAyXSBeIEgkMTE4OVtqJDExOTQgLSAzMiA+PiAyXSBeIEgkMTE4OVtqJDExOTQgLSA1NiA+PiAyXSBeIEgkMTE4OVtqJDExOTQgLSA2NCA+PiAyXSkgPDwgMSB8IChIJDExODlbaiQxMTk0IC0gMTIgPj4gMl0gXiBIJDExODlbaiQxMTk0IC0gMzIgPj4gMl0gXiBIJDExODlbaiQxMTk0IC0gNTYgPj4gMl0gXiBIJDExODlbaiQxMTk0IC0gNjQgPj4gMl0pID4+PiAzMTtcbiAgICAgICAgICAgICAgICB0MCQxMjA1ID0gKCh5MCQxMTk1IDw8IDUgfCB5MCQxMTk1ID4+PiAyNykgKyAoeTEkMTE5NyBeIHkyJDExOTkgXiB5MyQxMjAxKSB8IDApICsgKCh0MSQxMjA2ICsgeTQkMTIwMyB8IDApIC0gODk5NDk3NTE0IHwgMCkgfCAwO1xuICAgICAgICAgICAgICAgIHk0JDEyMDMgPSB5MyQxMjAxO1xuICAgICAgICAgICAgICAgIHkzJDEyMDEgPSB5MiQxMTk5O1xuICAgICAgICAgICAgICAgIHkyJDExOTkgPSB5MSQxMTk3IDw8IDMwIHwgeTEkMTE5NyA+Pj4gMjtcbiAgICAgICAgICAgICAgICB5MSQxMTk3ID0geTAkMTE5NTtcbiAgICAgICAgICAgICAgICB5MCQxMTk1ID0gdDAkMTIwNTtcbiAgICAgICAgICAgICAgICBIJDExODlbaiQxMTk0ID4+IDJdID0gdDEkMTIwNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHkwJDExOTUgPSB5MCQxMTk1ICsgejAkMTE5NiB8IDA7XG4gICAgICAgICAgICB5MSQxMTk3ID0geTEkMTE5NyArIHoxJDExOTggfCAwO1xuICAgICAgICAgICAgeTIkMTE5OSA9IHkyJDExOTkgKyB6MiQxMjAwIHwgMDtcbiAgICAgICAgICAgIHkzJDEyMDEgPSB5MyQxMjAxICsgejMkMTIwMiB8IDA7XG4gICAgICAgICAgICB5NCQxMjAzID0geTQkMTIwMyArIHo0JDEyMDQgfCAwO1xuICAgICAgICB9XG4gICAgICAgIEgkMTE4OVt4JDExOTIgKyAzMjAgPj4gMl0gPSB5MCQxMTk1O1xuICAgICAgICBIJDExODlbeCQxMTkyICsgMzI0ID4+IDJdID0geTEkMTE5NztcbiAgICAgICAgSCQxMTg5W3gkMTE5MiArIDMyOCA+PiAyXSA9IHkyJDExOTk7XG4gICAgICAgIEgkMTE4OVt4JDExOTIgKyAzMzIgPj4gMl0gPSB5MyQxMjAxO1xuICAgICAgICBIJDExODlbeCQxMTkyICsgMzM2ID4+IDJdID0geTQkMTIwMztcbiAgICB9XG4gICAgcmV0dXJuIHsgaGFzaDogaGFzaCQxMTkwIH07XG59O1xuXG59LHt9XSw0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO1xuLyogZXNsaW50LWVudiBjb21tb25qcywgYnJvd3NlciAqL1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgUnVzaGEgPSBfZGVyZXFfKCcuL3J1c2hhJyk7XG5cbnZhciBfcmVxdWlyZSA9IF9kZXJlcV8oJy4vdXRpbHMnKSxcbiAgICB0b0hleCA9IF9yZXF1aXJlLnRvSGV4O1xuXG52YXIgSGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSGFzaCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSGFzaCk7XG5cbiAgICB0aGlzLl9ydXNoYSA9IG5ldyBSdXNoYSgpO1xuICAgIHRoaXMuX3J1c2hhLnJlc2V0U3RhdGUoKTtcbiAgfVxuXG4gIEhhc2gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShkYXRhKSB7XG4gICAgdGhpcy5fcnVzaGEuYXBwZW5kKGRhdGEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEhhc2gucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmNvZGluZykge1xuICAgIHZhciBkaWdlc3QgPSB0aGlzLl9ydXNoYS5yYXdFbmQoKS5idWZmZXI7XG4gICAgaWYgKCFlbmNvZGluZykge1xuICAgICAgcmV0dXJuIGRpZ2VzdDtcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nID09PSAnaGV4Jykge1xuICAgICAgcmV0dXJuIHRvSGV4KGRpZ2VzdCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgZGlnZXN0IGVuY29kaW5nJyk7XG4gIH07XG5cbiAgcmV0dXJuIEhhc2g7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IEhhc2goKTtcbn07XG5cbn0se1wiLi9ydXNoYVwiOjYsXCIuL3V0aWxzXCI6N31dLDU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBlc2xpbnQtZW52IGNvbW1vbmpzLCBicm93c2VyICovXG5cbnZhciB3ZWJ3b3JraWZ5ID0gX2RlcmVxXygnd2Vid29ya2lmeScpO1xuXG52YXIgUnVzaGEgPSBfZGVyZXFfKCcuL3J1c2hhJyk7XG52YXIgY3JlYXRlSGFzaCA9IF9kZXJlcV8oJy4vaGFzaCcpO1xudmFyIHJ1bldvcmtlciA9IF9kZXJlcV8oJy4vd29ya2VyJyk7XG5cbnZhciBfcmVxdWlyZSA9IF9kZXJlcV8oJy4vdXRpbHMnKSxcbiAgICBpc0RlZGljYXRlZFdvcmtlclNjb3BlID0gX3JlcXVpcmUuaXNEZWRpY2F0ZWRXb3JrZXJTY29wZTtcblxudmFyIGlzUnVubmluZ0luRGVkaWNhdGVkV29ya2VyID0gdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIGlzRGVkaWNhdGVkV29ya2VyU2NvcGUoc2VsZik7XG5cblJ1c2hhLmRpc2FibGVXb3JrZXJCZWhhdmlvdXIgPSBpc1J1bm5pbmdJbkRlZGljYXRlZFdvcmtlciA/IHJ1bldvcmtlcigpIDogZnVuY3Rpb24gKCkge307XG5cblJ1c2hhLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHdvcmtlciA9IHdlYndvcmtpZnkoX2RlcmVxXygnLi93b3JrZXInKSk7XG4gIHZhciB0ZXJtaW5hdGUgPSB3b3JrZXIudGVybWluYXRlO1xuICB3b3JrZXIudGVybWluYXRlID0gZnVuY3Rpb24gKCkge1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwod29ya2VyLm9iamVjdFVSTCk7XG4gICAgdGVybWluYXRlLmNhbGwod29ya2VyKTtcbiAgfTtcbiAgcmV0dXJuIHdvcmtlcjtcbn07XG5cblJ1c2hhLmNyZWF0ZUhhc2ggPSBjcmVhdGVIYXNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJ1c2hhO1xuXG59LHtcIi4vaGFzaFwiOjQsXCIuL3J1c2hhXCI6NixcIi4vdXRpbHNcIjo3LFwiLi93b3JrZXJcIjo4LFwid2Vid29ya2lmeVwiOjF9XSw2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO1xuLyogZXNsaW50LWVudiBjb21tb25qcywgYnJvd3NlciAqL1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgUnVzaGFDb3JlID0gX2RlcmVxXygnLi9jb3JlLnNqcycpO1xuXG52YXIgX3JlcXVpcmUgPSBfZGVyZXFfKCcuL3V0aWxzJyksXG4gICAgdG9IZXggPSBfcmVxdWlyZS50b0hleCxcbiAgICBjZWlsSGVhcFNpemUgPSBfcmVxdWlyZS5jZWlsSGVhcFNpemU7XG5cbnZhciBjb252ID0gX2RlcmVxXygnLi9jb252Jyk7XG5cbi8vIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIGJ1ZmZlciB0aGF0IHRoZSBzaGExIHJvdXRpbmUgdXNlc1xuLy8gaW5jbHVkaW5nIHRoZSBwYWRkaW5nLlxudmFyIHBhZGxlbiA9IGZ1bmN0aW9uIChsZW4pIHtcbiAgZm9yIChsZW4gKz0gOTsgbGVuICUgNjQgPiAwOyBsZW4gKz0gMSkge31cbiAgcmV0dXJuIGxlbjtcbn07XG5cbnZhciBwYWRaZXJvZXMgPSBmdW5jdGlvbiAoYmluLCBsZW4pIHtcbiAgdmFyIGg4ID0gbmV3IFVpbnQ4QXJyYXkoYmluLmJ1ZmZlcik7XG4gIHZhciBvbSA9IGxlbiAlIDQsXG4gICAgICBhbGlnbiA9IGxlbiAtIG9tO1xuICBzd2l0Y2ggKG9tKSB7XG4gICAgY2FzZSAwOlxuICAgICAgaDhbYWxpZ24gKyAzXSA9IDA7XG4gICAgY2FzZSAxOlxuICAgICAgaDhbYWxpZ24gKyAyXSA9IDA7XG4gICAgY2FzZSAyOlxuICAgICAgaDhbYWxpZ24gKyAxXSA9IDA7XG4gICAgY2FzZSAzOlxuICAgICAgaDhbYWxpZ24gKyAwXSA9IDA7XG4gIH1cbiAgZm9yICh2YXIgaSA9IChsZW4gPj4gMikgKyAxOyBpIDwgYmluLmxlbmd0aDsgaSsrKSB7XG4gICAgYmluW2ldID0gMDtcbiAgfVxufTtcblxudmFyIHBhZERhdGEgPSBmdW5jdGlvbiAoYmluLCBjaHVua0xlbiwgbXNnTGVuKSB7XG4gIGJpbltjaHVua0xlbiA+PiAyXSB8PSAweDgwIDw8IDI0IC0gKGNodW5rTGVuICUgNCA8PCAzKTtcbiAgLy8gVG8gc3VwcG9ydCBtc2dMZW4gPj0gMiBHaUIsIHVzZSBhIGZsb2F0IGRpdmlzaW9uIHdoZW4gY29tcHV0aW5nIHRoZVxuICAvLyBoaWdoIDMyLWJpdHMgb2YgdGhlIGJpZy1lbmRpYW4gbWVzc2FnZSBsZW5ndGggaW4gYml0cy5cbiAgYmluWygoY2h1bmtMZW4gPj4gMikgKyAyICYgfjB4MGYpICsgMTRdID0gbXNnTGVuIC8gKDEgPDwgMjkpIHwgMDtcbiAgYmluWygoY2h1bmtMZW4gPj4gMikgKyAyICYgfjB4MGYpICsgMTVdID0gbXNnTGVuIDw8IDM7XG59O1xuXG52YXIgZ2V0UmF3RGlnZXN0ID0gZnVuY3Rpb24gKGhlYXAsIHBhZE1heENodW5rTGVuKSB7XG4gIHZhciBpbyA9IG5ldyBJbnQzMkFycmF5KGhlYXAsIHBhZE1heENodW5rTGVuICsgMzIwLCA1KTtcbiAgdmFyIG91dCA9IG5ldyBJbnQzMkFycmF5KDUpO1xuICB2YXIgYXJyID0gbmV3IERhdGFWaWV3KG91dC5idWZmZXIpO1xuICBhcnIuc2V0SW50MzIoMCwgaW9bMF0sIGZhbHNlKTtcbiAgYXJyLnNldEludDMyKDQsIGlvWzFdLCBmYWxzZSk7XG4gIGFyci5zZXRJbnQzMig4LCBpb1syXSwgZmFsc2UpO1xuICBhcnIuc2V0SW50MzIoMTIsIGlvWzNdLCBmYWxzZSk7XG4gIGFyci5zZXRJbnQzMigxNiwgaW9bNF0sIGZhbHNlKTtcbiAgcmV0dXJuIG91dDtcbn07XG5cbnZhciBSdXNoYSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUnVzaGEoY2h1bmtTaXplKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJ1c2hhKTtcblxuICAgIGNodW5rU2l6ZSA9IGNodW5rU2l6ZSB8fCA2NCAqIDEwMjQ7XG4gICAgaWYgKGNodW5rU2l6ZSAlIDY0ID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaHVuayBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxMjggYml0Jyk7XG4gICAgfVxuICAgIHRoaXMuX29mZnNldCA9IDA7XG4gICAgdGhpcy5fbWF4Q2h1bmtMZW4gPSBjaHVua1NpemU7XG4gICAgdGhpcy5fcGFkTWF4Q2h1bmtMZW4gPSBwYWRsZW4oY2h1bmtTaXplKTtcbiAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgaGVhcCBpcyB0aGUgc3VtIG9mOlxuICAgIC8vIDEuIFRoZSBwYWRkZWQgaW5wdXQgbWVzc2FnZSBzaXplXG4gICAgLy8gMi4gVGhlIGV4dGVuZGVkIHNwYWNlIHRoZSBhbGdvcml0aG0gbmVlZHMgKDMyMCBieXRlKVxuICAgIC8vIDMuIFRoZSAxNjAgYml0IHN0YXRlIHRoZSBhbGdvcml0bSB1c2VzXG4gICAgdGhpcy5faGVhcCA9IG5ldyBBcnJheUJ1ZmZlcihjZWlsSGVhcFNpemUodGhpcy5fcGFkTWF4Q2h1bmtMZW4gKyAzMjAgKyAyMCkpO1xuICAgIHRoaXMuX2gzMiA9IG5ldyBJbnQzMkFycmF5KHRoaXMuX2hlYXApO1xuICAgIHRoaXMuX2g4ID0gbmV3IEludDhBcnJheSh0aGlzLl9oZWFwKTtcbiAgICB0aGlzLl9jb3JlID0gbmV3IFJ1c2hhQ29yZSh7IEludDMyQXJyYXk6IEludDMyQXJyYXkgfSwge30sIHRoaXMuX2hlYXApO1xuICB9XG5cbiAgUnVzaGEucHJvdG90eXBlLl9pbml0U3RhdGUgPSBmdW5jdGlvbiBfaW5pdFN0YXRlKGhlYXAsIHBhZE1zZ0xlbikge1xuICAgIHRoaXMuX29mZnNldCA9IDA7XG4gICAgdmFyIGlvID0gbmV3IEludDMyQXJyYXkoaGVhcCwgcGFkTXNnTGVuICsgMzIwLCA1KTtcbiAgICBpb1swXSA9IDE3MzI1ODQxOTM7XG4gICAgaW9bMV0gPSAtMjcxNzMzODc5O1xuICAgIGlvWzJdID0gLTE3MzI1ODQxOTQ7XG4gICAgaW9bM10gPSAyNzE3MzM4Nzg7XG4gICAgaW9bNF0gPSAtMTAwOTU4OTc3NjtcbiAgfTtcblxuICBSdXNoYS5wcm90b3R5cGUuX3BhZENodW5rID0gZnVuY3Rpb24gX3BhZENodW5rKGNodW5rTGVuLCBtc2dMZW4pIHtcbiAgICB2YXIgcGFkQ2h1bmtMZW4gPSBwYWRsZW4oY2h1bmtMZW4pO1xuICAgIHZhciB2aWV3ID0gbmV3IEludDMyQXJyYXkodGhpcy5faGVhcCwgMCwgcGFkQ2h1bmtMZW4gPj4gMik7XG4gICAgcGFkWmVyb2VzKHZpZXcsIGNodW5rTGVuKTtcbiAgICBwYWREYXRhKHZpZXcsIGNodW5rTGVuLCBtc2dMZW4pO1xuICAgIHJldHVybiBwYWRDaHVua0xlbjtcbiAgfTtcblxuICBSdXNoYS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gX3dyaXRlKGRhdGEsIGNodW5rT2Zmc2V0LCBjaHVua0xlbiwgb2ZmKSB7XG4gICAgY29udihkYXRhLCB0aGlzLl9oOCwgdGhpcy5faDMyLCBjaHVua09mZnNldCwgY2h1bmtMZW4sIG9mZiB8fCAwKTtcbiAgfTtcblxuICBSdXNoYS5wcm90b3R5cGUuX2NvcmVDYWxsID0gZnVuY3Rpb24gX2NvcmVDYWxsKGRhdGEsIGNodW5rT2Zmc2V0LCBjaHVua0xlbiwgbXNnTGVuLCBmaW5hbGl6ZSkge1xuICAgIHZhciBwYWRDaHVua0xlbiA9IGNodW5rTGVuO1xuICAgIHRoaXMuX3dyaXRlKGRhdGEsIGNodW5rT2Zmc2V0LCBjaHVua0xlbik7XG4gICAgaWYgKGZpbmFsaXplKSB7XG4gICAgICBwYWRDaHVua0xlbiA9IHRoaXMuX3BhZENodW5rKGNodW5rTGVuLCBtc2dMZW4pO1xuICAgIH1cbiAgICB0aGlzLl9jb3JlLmhhc2gocGFkQ2h1bmtMZW4sIHRoaXMuX3BhZE1heENodW5rTGVuKTtcbiAgfTtcblxuICBSdXNoYS5wcm90b3R5cGUucmF3RGlnZXN0ID0gZnVuY3Rpb24gcmF3RGlnZXN0KHN0cikge1xuICAgIHZhciBtc2dMZW4gPSBzdHIuYnl0ZUxlbmd0aCB8fCBzdHIubGVuZ3RoIHx8IHN0ci5zaXplIHx8IDA7XG4gICAgdGhpcy5faW5pdFN0YXRlKHRoaXMuX2hlYXAsIHRoaXMuX3BhZE1heENodW5rTGVuKTtcbiAgICB2YXIgY2h1bmtPZmZzZXQgPSAwLFxuICAgICAgICBjaHVua0xlbiA9IHRoaXMuX21heENodW5rTGVuO1xuICAgIGZvciAoY2h1bmtPZmZzZXQgPSAwOyBtc2dMZW4gPiBjaHVua09mZnNldCArIGNodW5rTGVuOyBjaHVua09mZnNldCArPSBjaHVua0xlbikge1xuICAgICAgdGhpcy5fY29yZUNhbGwoc3RyLCBjaHVua09mZnNldCwgY2h1bmtMZW4sIG1zZ0xlbiwgZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLl9jb3JlQ2FsbChzdHIsIGNodW5rT2Zmc2V0LCBtc2dMZW4gLSBjaHVua09mZnNldCwgbXNnTGVuLCB0cnVlKTtcbiAgICByZXR1cm4gZ2V0UmF3RGlnZXN0KHRoaXMuX2hlYXAsIHRoaXMuX3BhZE1heENodW5rTGVuKTtcbiAgfTtcblxuICBSdXNoYS5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KHN0cikge1xuICAgIHJldHVybiB0b0hleCh0aGlzLnJhd0RpZ2VzdChzdHIpLmJ1ZmZlcik7XG4gIH07XG5cbiAgUnVzaGEucHJvdG90eXBlLmRpZ2VzdEZyb21TdHJpbmcgPSBmdW5jdGlvbiBkaWdlc3RGcm9tU3RyaW5nKHN0cikge1xuICAgIHJldHVybiB0aGlzLmRpZ2VzdChzdHIpO1xuICB9O1xuXG4gIFJ1c2hhLnByb3RvdHlwZS5kaWdlc3RGcm9tQnVmZmVyID0gZnVuY3Rpb24gZGlnZXN0RnJvbUJ1ZmZlcihzdHIpIHtcbiAgICByZXR1cm4gdGhpcy5kaWdlc3Qoc3RyKTtcbiAgfTtcblxuICBSdXNoYS5wcm90b3R5cGUuZGlnZXN0RnJvbUFycmF5QnVmZmVyID0gZnVuY3Rpb24gZGlnZXN0RnJvbUFycmF5QnVmZmVyKHN0cikge1xuICAgIHJldHVybiB0aGlzLmRpZ2VzdChzdHIpO1xuICB9O1xuXG4gIFJ1c2hhLnByb3RvdHlwZS5yZXNldFN0YXRlID0gZnVuY3Rpb24gcmVzZXRTdGF0ZSgpIHtcbiAgICB0aGlzLl9pbml0U3RhdGUodGhpcy5faGVhcCwgdGhpcy5fcGFkTWF4Q2h1bmtMZW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIFJ1c2hhLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiBhcHBlbmQoY2h1bmspIHtcbiAgICB2YXIgY2h1bmtPZmZzZXQgPSAwO1xuICAgIHZhciBjaHVua0xlbiA9IGNodW5rLmJ5dGVMZW5ndGggfHwgY2h1bmsubGVuZ3RoIHx8IGNodW5rLnNpemUgfHwgMDtcbiAgICB2YXIgdHVybk9mZnNldCA9IHRoaXMuX29mZnNldCAlIHRoaXMuX21heENodW5rTGVuO1xuICAgIHZhciBpbnB1dExlbiA9IHZvaWQgMDtcblxuICAgIHRoaXMuX29mZnNldCArPSBjaHVua0xlbjtcbiAgICB3aGlsZSAoY2h1bmtPZmZzZXQgPCBjaHVua0xlbikge1xuICAgICAgaW5wdXRMZW4gPSBNYXRoLm1pbihjaHVua0xlbiAtIGNodW5rT2Zmc2V0LCB0aGlzLl9tYXhDaHVua0xlbiAtIHR1cm5PZmZzZXQpO1xuICAgICAgdGhpcy5fd3JpdGUoY2h1bmssIGNodW5rT2Zmc2V0LCBpbnB1dExlbiwgdHVybk9mZnNldCk7XG4gICAgICB0dXJuT2Zmc2V0ICs9IGlucHV0TGVuO1xuICAgICAgY2h1bmtPZmZzZXQgKz0gaW5wdXRMZW47XG4gICAgICBpZiAodHVybk9mZnNldCA9PT0gdGhpcy5fbWF4Q2h1bmtMZW4pIHtcbiAgICAgICAgdGhpcy5fY29yZS5oYXNoKHRoaXMuX21heENodW5rTGVuLCB0aGlzLl9wYWRNYXhDaHVua0xlbik7XG4gICAgICAgIHR1cm5PZmZzZXQgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBSdXNoYS5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICB2YXIgdHVybk9mZnNldCA9IHRoaXMuX29mZnNldCAlIHRoaXMuX21heENodW5rTGVuO1xuICAgIHZhciBoZWFwID0gdm9pZCAwO1xuICAgIGlmICghdHVybk9mZnNldCkge1xuICAgICAgdmFyIGlvID0gbmV3IEludDMyQXJyYXkodGhpcy5faGVhcCwgdGhpcy5fcGFkTWF4Q2h1bmtMZW4gKyAzMjAsIDUpO1xuICAgICAgaGVhcCA9IGlvLmJ1ZmZlci5zbGljZShpby5ieXRlT2Zmc2V0LCBpby5ieXRlT2Zmc2V0ICsgaW8uYnl0ZUxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYXAgPSB0aGlzLl9oZWFwLnNsaWNlKDApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgb2Zmc2V0OiB0aGlzLl9vZmZzZXQsXG4gICAgICBoZWFwOiBoZWFwXG4gICAgfTtcbiAgfTtcblxuICBSdXNoYS5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiBzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHRoaXMuX29mZnNldCA9IHN0YXRlLm9mZnNldDtcbiAgICBpZiAoc3RhdGUuaGVhcC5ieXRlTGVuZ3RoID09PSAyMCkge1xuICAgICAgdmFyIGlvID0gbmV3IEludDMyQXJyYXkodGhpcy5faGVhcCwgdGhpcy5fcGFkTWF4Q2h1bmtMZW4gKyAzMjAsIDUpO1xuICAgICAgaW8uc2V0KG5ldyBJbnQzMkFycmF5KHN0YXRlLmhlYXApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faDMyLnNldChuZXcgSW50MzJBcnJheShzdGF0ZS5oZWFwKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIFJ1c2hhLnByb3RvdHlwZS5yYXdFbmQgPSBmdW5jdGlvbiByYXdFbmQoKSB7XG4gICAgdmFyIG1zZ0xlbiA9IHRoaXMuX29mZnNldDtcbiAgICB2YXIgY2h1bmtMZW4gPSBtc2dMZW4gJSB0aGlzLl9tYXhDaHVua0xlbjtcbiAgICB2YXIgcGFkQ2h1bmtMZW4gPSB0aGlzLl9wYWRDaHVuayhjaHVua0xlbiwgbXNnTGVuKTtcbiAgICB0aGlzLl9jb3JlLmhhc2gocGFkQ2h1bmtMZW4sIHRoaXMuX3BhZE1heENodW5rTGVuKTtcbiAgICB2YXIgcmVzdWx0ID0gZ2V0UmF3RGlnZXN0KHRoaXMuX2hlYXAsIHRoaXMuX3BhZE1heENodW5rTGVuKTtcbiAgICB0aGlzLl9pbml0U3RhdGUodGhpcy5faGVhcCwgdGhpcy5fcGFkTWF4Q2h1bmtMZW4pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgUnVzaGEucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIGVuZCgpIHtcbiAgICByZXR1cm4gdG9IZXgodGhpcy5yYXdFbmQoKS5idWZmZXIpO1xuICB9O1xuXG4gIHJldHVybiBSdXNoYTtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBSdXNoYTtcbm1vZHVsZS5leHBvcnRzLl9jb3JlID0gUnVzaGFDb3JlO1xuXG59LHtcIi4vY29udlwiOjIsXCIuL2NvcmUuc2pzXCI6MyxcIi4vdXRpbHNcIjo3fV0sNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtcbi8qIGVzbGludC1lbnYgY29tbW9uanMsIGJyb3dzZXIgKi9cblxuLy9cbi8vIHRvSGV4XG4vL1xuXG52YXIgcHJlY29tcHV0ZWRIZXggPSBuZXcgQXJyYXkoMjU2KTtcbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcbiAgcHJlY29tcHV0ZWRIZXhbaV0gPSAoaSA8IDB4MTAgPyAnMCcgOiAnJykgKyBpLnRvU3RyaW5nKDE2KTtcbn1cblxubW9kdWxlLmV4cG9ydHMudG9IZXggPSBmdW5jdGlvbiAoYXJyYXlCdWZmZXIpIHtcbiAgdmFyIGJpbmFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICB2YXIgcmVzID0gbmV3IEFycmF5KGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcmVzLmxlbmd0aDsgX2krKykge1xuICAgIHJlc1tfaV0gPSBwcmVjb21wdXRlZEhleFtiaW5hcnJheVtfaV1dO1xuICB9XG4gIHJldHVybiByZXMuam9pbignJyk7XG59O1xuXG4vL1xuLy8gY2VpbEhlYXBTaXplXG4vL1xuXG5tb2R1bGUuZXhwb3J0cy5jZWlsSGVhcFNpemUgPSBmdW5jdGlvbiAodikge1xuICAvLyBUaGUgYXNtLmpzIHNwZWMgc2F5czpcbiAgLy8gVGhlIGhlYXAgb2JqZWN0J3MgYnl0ZUxlbmd0aCBtdXN0IGJlIGVpdGhlclxuICAvLyAyXm4gZm9yIG4gaW4gWzEyLCAyNCkgb3IgMl4yNCAqIG4gZm9yIG4g4omlIDEuXG4gIC8vIEFsc28sIGJ5dGVMZW5ndGhzIHNtYWxsZXIgdGhhbiAyXjE2IGFyZSBkZXByZWNhdGVkLlxuICB2YXIgcCA9IDA7XG4gIC8vIElmIHYgaXMgc21hbGxlciB0aGFuIDJeMTYsIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBzb2x1dGlvblxuICAvLyBpcyAyXjE2LlxuICBpZiAodiA8PSA2NTUzNikgcmV0dXJuIDY1NTM2O1xuICAvLyBJZiB2IDwgMl4yNCwgd2Ugcm91bmQgdXAgdG8gMl5uLFxuICAvLyBvdGhlcndpc2Ugd2Ugcm91bmQgdXAgdG8gMl4yNCAqIG4uXG4gIGlmICh2IDwgMTY3NzcyMTYpIHtcbiAgICBmb3IgKHAgPSAxOyBwIDwgdjsgcCA9IHAgPDwgMSkge31cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHAgPSAxNjc3NzIxNjsgcCA8IHY7IHAgKz0gMTY3NzcyMTYpIHt9XG4gIH1cbiAgcmV0dXJuIHA7XG59O1xuXG4vL1xuLy8gaXNEZWRpY2F0ZWRXb3JrZXJTY29wZVxuLy9cblxubW9kdWxlLmV4cG9ydHMuaXNEZWRpY2F0ZWRXb3JrZXJTY29wZSA9IGZ1bmN0aW9uIChzZWxmKSB7XG4gIHZhciBpc1J1bm5pbmdJbldvcmtlciA9ICdXb3JrZXJHbG9iYWxTY29wZScgaW4gc2VsZiAmJiBzZWxmIGluc3RhbmNlb2Ygc2VsZi5Xb3JrZXJHbG9iYWxTY29wZTtcbiAgdmFyIGlzUnVubmluZ0luU2hhcmVkV29ya2VyID0gJ1NoYXJlZFdvcmtlckdsb2JhbFNjb3BlJyBpbiBzZWxmICYmIHNlbGYgaW5zdGFuY2VvZiBzZWxmLlNoYXJlZFdvcmtlckdsb2JhbFNjb3BlO1xuICB2YXIgaXNSdW5uaW5nSW5TZXJ2aWNlV29ya2VyID0gJ1NlcnZpY2VXb3JrZXJHbG9iYWxTY29wZScgaW4gc2VsZiAmJiBzZWxmIGluc3RhbmNlb2Ygc2VsZi5TZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGU7XG5cbiAgLy8gRGV0ZWN0cyB3aGV0aGVyIHdlIHJ1biBpbnNpZGUgYSBkZWRpY2F0ZWQgd29ya2VyIG9yIG5vdC5cbiAgLy9cbiAgLy8gV2UgY2FuJ3QganVzdCBjaGVjayBmb3IgYERlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlYCwgc2luY2UgSUUxMVxuICAvLyBoYXMgYSBidWcgd2hlcmUgaXQgb25seSBzdXBwb3J0cyBgV29ya2VyR2xvYmFsU2NvcGVgLlxuICAvL1xuICAvLyBUaGVyZWZvcmUsIHdlIGNvbnNpZGVyIHVzIGFzIHJ1bm5pbmcgaW5zaWRlIGEgZGVkaWNhdGVkIHdvcmtlclxuICAvLyB3aGVuIHdlIGFyZSBydW5uaW5nIGluc2lkZSBhIHdvcmtlciwgYnV0IG5vdCBpbiBhIHNoYXJlZCBvciBzZXJ2aWNlIHdvcmtlci5cbiAgLy9cbiAgLy8gV2hlbiBuZXcgdHlwZXMgb2Ygd29ya2VycyBhcmUgaW50cm9kdWNlZCwgd2Ugd2lsbCBuZWVkIHRvIGFkanVzdCB0aGlzIGNvZGUuXG4gIHJldHVybiBpc1J1bm5pbmdJbldvcmtlciAmJiAhaXNSdW5uaW5nSW5TaGFyZWRXb3JrZXIgJiYgIWlzUnVubmluZ0luU2VydmljZVdvcmtlcjtcbn07XG5cbn0se31dLDg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBlc2xpbnQtZW52IGNvbW1vbmpzLCB3b3JrZXIgKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBSdXNoYSA9IF9kZXJlcV8oJy4vcnVzaGEnKTtcblxuICB2YXIgaGFzaERhdGEgPSBmdW5jdGlvbiAoaGFzaGVyLCBkYXRhLCBjYikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY2IobnVsbCwgaGFzaGVyLmRpZ2VzdChkYXRhKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGNiKGUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaGFzaEZpbGUgPSBmdW5jdGlvbiAoaGFzaGVyLCByZWFkVG90YWwsIGJsb2NrU2l6ZSwgZmlsZSwgY2IpIHtcbiAgICB2YXIgcmVhZGVyID0gbmV3IHNlbGYuRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiBvbmxvYWRlbmQoKSB7XG4gICAgICBpZiAocmVhZGVyLmVycm9yKSB7XG4gICAgICAgIHJldHVybiBjYihyZWFkZXIuZXJyb3IpO1xuICAgICAgfVxuICAgICAgdmFyIGJ1ZmZlciA9IHJlYWRlci5yZXN1bHQ7XG4gICAgICByZWFkVG90YWwgKz0gcmVhZGVyLnJlc3VsdC5ieXRlTGVuZ3RoO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFzaGVyLmFwcGVuZChidWZmZXIpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYihlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJlYWRUb3RhbCA8IGZpbGUuc2l6ZSkge1xuICAgICAgICBoYXNoRmlsZShoYXNoZXIsIHJlYWRUb3RhbCwgYmxvY2tTaXplLCBmaWxlLCBjYik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYihudWxsLCBoYXNoZXIuZW5kKCkpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUuc2xpY2UocmVhZFRvdGFsLCByZWFkVG90YWwgKyBibG9ja1NpemUpKTtcbiAgfTtcblxuICB2YXIgd29ya2VyQmVoYXZpb3VyRW5hYmxlZCA9IHRydWU7XG5cbiAgc2VsZi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoIXdvcmtlckJlaGF2aW91ckVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZGF0YSA9IGV2ZW50LmRhdGEuZGF0YSxcbiAgICAgICAgZmlsZSA9IGV2ZW50LmRhdGEuZmlsZSxcbiAgICAgICAgaWQgPSBldmVudC5kYXRhLmlkO1xuICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgaWYgKCFmaWxlICYmICFkYXRhKSByZXR1cm47XG4gICAgdmFyIGJsb2NrU2l6ZSA9IGV2ZW50LmRhdGEuYmxvY2tTaXplIHx8IDQgKiAxMDI0ICogMTAyNDtcbiAgICB2YXIgaGFzaGVyID0gbmV3IFJ1c2hhKGJsb2NrU2l6ZSk7XG4gICAgaGFzaGVyLnJlc2V0U3RhdGUoKTtcbiAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uIChlcnIsIGhhc2gpIHtcbiAgICAgIGlmICghZXJyKSB7XG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoeyBpZDogaWQsIGhhc2g6IGhhc2ggfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsgaWQ6IGlkLCBlcnJvcjogZXJyLm5hbWUgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoZGF0YSkgaGFzaERhdGEoaGFzaGVyLCBkYXRhLCBkb25lKTtcbiAgICBpZiAoZmlsZSkgaGFzaEZpbGUoaGFzaGVyLCAwLCBibG9ja1NpemUsIGZpbGUsIGRvbmUpO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgd29ya2VyQmVoYXZpb3VyRW5hYmxlZCA9IGZhbHNlO1xuICB9O1xufTtcblxufSx7XCIuL3J1c2hhXCI6Nn1dfSx7fSxbNV0pKDUpXG59KTtcbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxufSx7fV0sMzIxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbihmdW5jdGlvbihzZWxmKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBpZiAoc2VsZi5mZXRjaCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIHN1cHBvcnQgPSB7XG4gICAgc2VhcmNoUGFyYW1zOiAnVVJMU2VhcmNoUGFyYW1zJyBpbiBzZWxmLFxuICAgIGl0ZXJhYmxlOiAnU3ltYm9sJyBpbiBzZWxmICYmICdpdGVyYXRvcicgaW4gU3ltYm9sLFxuICAgIGJsb2I6ICdGaWxlUmVhZGVyJyBpbiBzZWxmICYmICdCbG9iJyBpbiBzZWxmICYmIChmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBCbG9iKClcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9KSgpLFxuICAgIGZvcm1EYXRhOiAnRm9ybURhdGEnIGluIHNlbGYsXG4gICAgYXJyYXlCdWZmZXI6ICdBcnJheUJ1ZmZlcicgaW4gc2VsZlxuICB9XG5cbiAgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIpIHtcbiAgICB2YXIgdmlld0NsYXNzZXMgPSBbXG4gICAgICAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAgICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICAgICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgICAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgICAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgVWludDMyQXJyYXldJyxcbiAgICAgICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgRmxvYXQ2NEFycmF5XSdcbiAgICBdXG5cbiAgICB2YXIgaXNEYXRhVmlldyA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiBEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvYmopXG4gICAgfVxuXG4gICAgdmFyIGlzQXJyYXlCdWZmZXJWaWV3ID0gQXJyYXlCdWZmZXIuaXNWaWV3IHx8IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB2aWV3Q2xhc3Nlcy5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopKSA+IC0xXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplTmFtZShuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKVxuICAgIH1cbiAgICBpZiAoL1teYS16MC05XFwtIyQlJicqKy5cXF5fYHx+XS9pLnRlc3QobmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyIGluIGhlYWRlciBmaWVsZCBuYW1lJylcbiAgICB9XG4gICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLy8gQnVpbGQgYSBkZXN0cnVjdGl2ZSBpdGVyYXRvciBmb3IgdGhlIHZhbHVlIGxpc3RcbiAgZnVuY3Rpb24gaXRlcmF0b3JGb3IoaXRlbXMpIHtcbiAgICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgICBuZXh0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKVxuICAgICAgICByZXR1cm4ge2RvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZX1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICAgICAgaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaXRlcmF0b3JcbiAgfVxuXG4gIGZ1bmN0aW9uIEhlYWRlcnMoaGVhZGVycykge1xuICAgIHRoaXMubWFwID0ge31cblxuICAgIGlmIChoZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfSwgdGhpcylcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoaGVhZGVyWzBdLCBoZWFkZXJbMV0pXG4gICAgICB9LCB0aGlzKVxuICAgIH0gZWxzZSBpZiAoaGVhZGVycykge1xuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIGhlYWRlcnNbbmFtZV0pXG4gICAgICB9LCB0aGlzKVxuICAgIH1cbiAgfVxuXG4gIEhlYWRlcnMucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgICB2YWx1ZSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKVxuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMubWFwW25hbWVdXG4gICAgdGhpcy5tYXBbbmFtZV0gPSBvbGRWYWx1ZSA/IG9sZFZhbHVlKycsJyt2YWx1ZSA6IHZhbHVlXG4gIH1cblxuICBIZWFkZXJzLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldXG4gIH1cblxuICBIZWFkZXJzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgICByZXR1cm4gdGhpcy5oYXMobmFtZSkgPyB0aGlzLm1hcFtuYW1lXSA6IG51bGxcbiAgfVxuXG4gIEhlYWRlcnMucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzT3duUHJvcGVydHkobm9ybWFsaXplTmFtZShuYW1lKSlcbiAgfVxuXG4gIEhlYWRlcnMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSlcbiAgfVxuXG4gIEhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcy5tYXApIHtcbiAgICAgIGlmICh0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXMubWFwW25hbWVdLCBuYW1lLCB0aGlzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEhlYWRlcnMucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbXMgPSBbXVxuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkgeyBpdGVtcy5wdXNoKG5hbWUpIH0pXG4gICAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW1zID0gW11cbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHsgaXRlbXMucHVzaCh2YWx1ZSkgfSlcbiAgICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG4gIH1cblxuICBIZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW1zID0gW11cbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHsgaXRlbXMucHVzaChbbmFtZSwgdmFsdWVdKSB9KVxuICAgIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbiAgfVxuXG4gIGlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gICAgSGVhZGVycy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXNcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnN1bWVkKGJvZHkpIHtcbiAgICBpZiAoYm9keS5ib2R5VXNlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpKVxuICAgIH1cbiAgICBib2R5LmJvZHlVc2VkID0gdHJ1ZVxuICB9XG5cbiAgZnVuY3Rpb24gZmlsZVJlYWRlclJlYWR5KHJlYWRlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmVzb2x2ZShyZWFkZXIucmVzdWx0KVxuICAgICAgfVxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KHJlYWRlci5lcnJvcilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2IpIHtcbiAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgIHZhciBwcm9taXNlID0gZmlsZVJlYWRlclJlYWR5KHJlYWRlcilcbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYilcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEJsb2JBc1RleHQoYmxvYikge1xuICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gICAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICAgIHJlYWRlci5yZWFkQXNUZXh0KGJsb2IpXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRBcnJheUJ1ZmZlckFzVGV4dChidWYpIHtcbiAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZilcbiAgICB2YXIgY2hhcnMgPSBuZXcgQXJyYXkodmlldy5sZW5ndGgpXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKVxuICAgIH1cbiAgICByZXR1cm4gY2hhcnMuam9pbignJylcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1ZmZlckNsb25lKGJ1Zikge1xuICAgIGlmIChidWYuc2xpY2UpIHtcbiAgICAgIHJldHVybiBidWYuc2xpY2UoMClcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShidWYuYnl0ZUxlbmd0aClcbiAgICAgIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZikpXG4gICAgICByZXR1cm4gdmlldy5idWZmZXJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBCb2R5KCkge1xuICAgIHRoaXMuYm9keVVzZWQgPSBmYWxzZVxuXG4gICAgdGhpcy5faW5pdEJvZHkgPSBmdW5jdGlvbihib2R5KSB7XG4gICAgICB0aGlzLl9ib2R5SW5pdCA9IGJvZHlcbiAgICAgIGlmICghYm9keSkge1xuICAgICAgICB0aGlzLl9ib2R5VGV4dCA9ICcnXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHlcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5ibG9iICYmIEJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgICAgdGhpcy5fYm9keUJsb2IgPSBib2R5XG4gICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuZm9ybURhdGEgJiYgRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgICAgdGhpcy5fYm9keUZvcm1EYXRhID0gYm9keVxuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5LnRvU3RyaW5nKClcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiBzdXBwb3J0LmJsb2IgJiYgaXNEYXRhVmlldyhib2R5KSkge1xuICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIgPSBidWZmZXJDbG9uZShib2R5LmJ1ZmZlcilcbiAgICAgICAgLy8gSUUgMTAtMTEgY2FuJ3QgaGFuZGxlIGEgRGF0YVZpZXcgYm9keS5cbiAgICAgICAgdGhpcy5fYm9keUluaXQgPSBuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSlcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiAoQXJyYXlCdWZmZXIucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkgfHwgaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkpKSB7XG4gICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIEJvZHlJbml0IHR5cGUnKVxuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04JylcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QmxvYiAmJiB0aGlzLl9ib2R5QmxvYi50eXBlKSB7XG4gICAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgdGhpcy5fYm9keUJsb2IudHlwZSlcbiAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgICAgdGhpcy5ibG9iID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpXG4gICAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICAgIHJldHVybiByZWplY3RlZFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QmxvYilcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSlcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5Rm9ybURhdGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgYmxvYicpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keVRleHRdKSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmFycmF5QnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICByZXR1cm4gY29uc3VtZWQodGhpcykgfHwgUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ibG9iKCkudGhlbihyZWFkQmxvYkFzQXJyYXlCdWZmZXIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpXG4gICAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdGVkXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgICByZXR1cm4gcmVhZEJsb2JBc1RleHQodGhpcy5fYm9keUJsb2IpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlYWRBcnJheUJ1ZmZlckFzVGV4dCh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5Rm9ybURhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIHRleHQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5VGV4dClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3VwcG9ydC5mb3JtRGF0YSkge1xuICAgICAgdGhpcy5mb3JtRGF0YSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihkZWNvZGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5qc29uID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvLyBIVFRQIG1ldGhvZHMgd2hvc2UgY2FwaXRhbGl6YXRpb24gc2hvdWxkIGJlIG5vcm1hbGl6ZWRcbiAgdmFyIG1ldGhvZHMgPSBbJ0RFTEVURScsICdHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BPU1QnLCAnUFVUJ11cblxuICBmdW5jdGlvbiBub3JtYWxpemVNZXRob2QobWV0aG9kKSB7XG4gICAgdmFyIHVwY2FzZWQgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICAgIHJldHVybiAobWV0aG9kcy5pbmRleE9mKHVwY2FzZWQpID4gLTEpID8gdXBjYXNlZCA6IG1ldGhvZFxuICB9XG5cbiAgZnVuY3Rpb24gUmVxdWVzdChpbnB1dCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gICAgdmFyIGJvZHkgPSBvcHRpb25zLmJvZHlcblxuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIGlmIChpbnB1dC5ib2R5VXNlZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKVxuICAgICAgfVxuICAgICAgdGhpcy51cmwgPSBpbnB1dC51cmxcbiAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBpbnB1dC5jcmVkZW50aWFsc1xuICAgICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5wdXQuaGVhZGVycylcbiAgICAgIH1cbiAgICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kXG4gICAgICB0aGlzLm1vZGUgPSBpbnB1dC5tb2RlXG4gICAgICBpZiAoIWJvZHkgJiYgaW5wdXQuX2JvZHlJbml0ICE9IG51bGwpIHtcbiAgICAgICAgYm9keSA9IGlucHV0Ll9ib2R5SW5pdFxuICAgICAgICBpbnB1dC5ib2R5VXNlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cmwgPSBTdHJpbmcoaW5wdXQpXG4gICAgfVxuXG4gICAgdGhpcy5jcmVkZW50aWFscyA9IG9wdGlvbnMuY3JlZGVudGlhbHMgfHwgdGhpcy5jcmVkZW50aWFscyB8fCAnb21pdCdcbiAgICBpZiAob3B0aW9ucy5oZWFkZXJzIHx8ICF0aGlzLmhlYWRlcnMpIHtcbiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycylcbiAgICB9XG4gICAgdGhpcy5tZXRob2QgPSBub3JtYWxpemVNZXRob2Qob3B0aW9ucy5tZXRob2QgfHwgdGhpcy5tZXRob2QgfHwgJ0dFVCcpXG4gICAgdGhpcy5tb2RlID0gb3B0aW9ucy5tb2RlIHx8IHRoaXMubW9kZSB8fCBudWxsXG4gICAgdGhpcy5yZWZlcnJlciA9IG51bGxcblxuICAgIGlmICgodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpICYmIGJvZHkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJylcbiAgICB9XG4gICAgdGhpcy5faW5pdEJvZHkoYm9keSlcbiAgfVxuXG4gIFJlcXVlc3QucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMsIHsgYm9keTogdGhpcy5fYm9keUluaXQgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZShib2R5KSB7XG4gICAgdmFyIGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICAgIGJvZHkudHJpbSgpLnNwbGl0KCcmJykuZm9yRWFjaChmdW5jdGlvbihieXRlcykge1xuICAgICAgaWYgKGJ5dGVzKSB7XG4gICAgICAgIHZhciBzcGxpdCA9IGJ5dGVzLnNwbGl0KCc9JylcbiAgICAgICAgdmFyIG5hbWUgPSBzcGxpdC5zaGlmdCgpLnJlcGxhY2UoL1xcKy9nLCAnICcpXG4gICAgICAgIHZhciB2YWx1ZSA9IHNwbGl0LmpvaW4oJz0nKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICBmb3JtLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQobmFtZSksIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZm9ybVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpIHtcbiAgICB2YXIgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgICByYXdIZWFkZXJzLnNwbGl0KC9cXHI/XFxuLykuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKVxuICAgICAgaWYgKGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5qb2luKCc6JykudHJpbSgpXG4gICAgICAgIGhlYWRlcnMuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKVxuXG4gIGZ1bmN0aW9uIFJlc3BvbnNlKGJvZHlJbml0LCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0aGlzLnR5cGUgPSAnZGVmYXVsdCdcbiAgICB0aGlzLnN0YXR1cyA9ICdzdGF0dXMnIGluIG9wdGlvbnMgPyBvcHRpb25zLnN0YXR1cyA6IDIwMFxuICAgIHRoaXMub2sgPSB0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCAzMDBcbiAgICB0aGlzLnN0YXR1c1RleHQgPSAnc3RhdHVzVGV4dCcgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc3RhdHVzVGV4dCA6ICdPSydcbiAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gICAgdGhpcy51cmwgPSBvcHRpb25zLnVybCB8fCAnJ1xuICAgIHRoaXMuX2luaXRCb2R5KGJvZHlJbml0KVxuICB9XG5cbiAgQm9keS5jYWxsKFJlc3BvbnNlLnByb3RvdHlwZSlcblxuICBSZXNwb25zZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuX2JvZHlJbml0LCB7XG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgICAgc3RhdHVzVGV4dDogdGhpcy5zdGF0dXNUZXh0LFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKSxcbiAgICAgIHVybDogdGhpcy51cmxcbiAgICB9KVxuICB9XG5cbiAgUmVzcG9uc2UuZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogMCwgc3RhdHVzVGV4dDogJyd9KVxuICAgIHJlc3BvbnNlLnR5cGUgPSAnZXJyb3InXG4gICAgcmV0dXJuIHJlc3BvbnNlXG4gIH1cblxuICB2YXIgcmVkaXJlY3RTdGF0dXNlcyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cblxuICBSZXNwb25zZS5yZWRpcmVjdCA9IGZ1bmN0aW9uKHVybCwgc3RhdHVzKSB7XG4gICAgaWYgKHJlZGlyZWN0U3RhdHVzZXMuaW5kZXhPZihzdGF0dXMpID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RhdHVzIGNvZGUnKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogc3RhdHVzLCBoZWFkZXJzOiB7bG9jYXRpb246IHVybH19KVxuICB9XG5cbiAgc2VsZi5IZWFkZXJzID0gSGVhZGVyc1xuICBzZWxmLlJlcXVlc3QgPSBSZXF1ZXN0XG4gIHNlbGYuUmVzcG9uc2UgPSBSZXNwb25zZVxuXG4gIHNlbGYuZmV0Y2ggPSBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpXG4gICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcblxuICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICBzdGF0dXM6IHhoci5zdGF0dXMsXG4gICAgICAgICAgc3RhdHVzVGV4dDogeGhyLnN0YXR1c1RleHQsXG4gICAgICAgICAgaGVhZGVyczogcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB8fCAnJylcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLnVybCA9ICdyZXNwb25zZVVSTCcgaW4geGhyID8geGhyLnJlc3BvbnNlVVJMIDogb3B0aW9ucy5oZWFkZXJzLmdldCgnWC1SZXF1ZXN0LVVSTCcpXG4gICAgICAgIHZhciBib2R5ID0gJ3Jlc3BvbnNlJyBpbiB4aHIgPyB4aHIucmVzcG9uc2UgOiB4aHIucmVzcG9uc2VUZXh0XG4gICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKGJvZHksIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcignTmV0d29yayByZXF1ZXN0IGZhaWxlZCcpKVxuICAgICAgfVxuXG4gICAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJykpXG4gICAgICB9XG5cbiAgICAgIHhoci5vcGVuKHJlcXVlc3QubWV0aG9kLCByZXF1ZXN0LnVybCwgdHJ1ZSlcblxuICAgICAgaWYgKHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdpbmNsdWRlJykge1xuICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBpZiAoJ3Jlc3BvbnNlVHlwZScgaW4geGhyICYmIHN1cHBvcnQuYmxvYikge1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2Jsb2InXG4gICAgICB9XG5cbiAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuICAgICAgfSlcblxuICAgICAgeGhyLnNlbmQodHlwZW9mIHJlcXVlc3QuX2JvZHlJbml0ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiByZXF1ZXN0Ll9ib2R5SW5pdClcbiAgICB9KVxuICB9XG4gIHNlbGYuZmV0Y2gucG9seWZpbGwgPSB0cnVlXG59KSh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogdGhpcyk7XG5cbn0se31dLDMyMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcmVnZW5lcmF0b3IgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yJyk7XG5cbnZhciBfcmVnZW5lcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVnZW5lcmF0b3IpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IyID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3InKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FzeW5jVG9HZW5lcmF0b3IyKTtcblxuZXhwb3J0cy5DbGVhcnRleHRNZXNzYWdlID0gQ2xlYXJ0ZXh0TWVzc2FnZTtcbmV4cG9ydHMucmVhZEFybW9yZWQgPSByZWFkQXJtb3JlZDtcblxudmFyIF9hcm1vciA9IF9kZXJlcV8oJy4vZW5jb2RpbmcvYXJtb3InKTtcblxudmFyIF9hcm1vcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hcm1vcik7XG5cbnZhciBfZW51bXMgPSBfZGVyZXFfKCcuL2VudW1zJyk7XG5cbnZhciBfZW51bXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW51bXMpO1xuXG52YXIgX3V0aWwgPSBfZGVyZXFfKCcuL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG52YXIgX3BhY2tldCA9IF9kZXJlcV8oJy4vcGFja2V0Jyk7XG5cbnZhciBfcGFja2V0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BhY2tldCk7XG5cbnZhciBfc2lnbmF0dXJlID0gX2RlcmVxXygnLi9zaWduYXR1cmUnKTtcblxudmFyIF9tZXNzYWdlID0gX2RlcmVxXygnLi9tZXNzYWdlJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjIENsYXNzIHRoYXQgcmVwcmVzZW50cyBhbiBPcGVuUEdQIGNsZWFydGV4dCBzaWduZWQgbWVzc2FnZS5cbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi03fVxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgdGV4dCAgICAgICBUaGUgY2xlYXJ0ZXh0IG9mIHRoZSBzaWduZWQgbWVzc2FnZVxuICogQHBhcmFtICB7bW9kdWxlOnNpZ25hdHVyZS5TaWduYXR1cmV9IHNpZ25hdHVyZSAgVGhlIGRldGFjaGVkIHNpZ25hdHVyZSBvciBhbiBlbXB0eSBzaWduYXR1cmUgZm9yIHVuc2lnbmVkIG1lc3NhZ2VzXG4gKi9cbi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQHJlcXVpcmVzIGVuY29kaW5nL2FybW9yXG4gKiBAcmVxdWlyZXMgZW51bXNcbiAqIEByZXF1aXJlcyB1dGlsXG4gKiBAcmVxdWlyZXMgcGFja2V0XG4gKiBAcmVxdWlyZXMgc2lnbmF0dXJlXG4gKiBAbW9kdWxlIGNsZWFydGV4dFxuICovXG5cbmZ1bmN0aW9uIENsZWFydGV4dE1lc3NhZ2UodGV4dCwgc2lnbmF0dXJlKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDbGVhcnRleHRNZXNzYWdlKSkge1xuICAgIHJldHVybiBuZXcgQ2xlYXJ0ZXh0TWVzc2FnZSh0ZXh0LCBzaWduYXR1cmUpO1xuICB9XG4gIC8vIG5vcm1hbGl6ZSBFT0wgdG8gY2Fub25pY2FsIGZvcm0gPENSPjxMRj5cbiAgdGhpcy50ZXh0ID0gX3V0aWwyLmRlZmF1bHQuY2Fub25pY2FsaXplRU9MKF91dGlsMi5kZWZhdWx0LnJlbW92ZVRyYWlsaW5nU3BhY2VzKHRleHQpKTtcbiAgaWYgKHNpZ25hdHVyZSAmJiAhKHNpZ25hdHVyZSBpbnN0YW5jZW9mIF9zaWduYXR1cmUuU2lnbmF0dXJlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaWduYXR1cmUgaW5wdXQnKTtcbiAgfVxuICB0aGlzLnNpZ25hdHVyZSA9IHNpZ25hdHVyZSB8fCBuZXcgX3NpZ25hdHVyZS5TaWduYXR1cmUobmV3IF9wYWNrZXQyLmRlZmF1bHQuTGlzdCgpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXkgSURzIG9mIHRoZSBrZXlzIHRoYXQgc2lnbmVkIHRoZSBjbGVhcnRleHQgbWVzc2FnZVxuICogQHJldHVybnMge0FycmF5PG1vZHVsZTp0eXBlL2tleWlkPn0gYXJyYXkgb2Yga2V5aWQgb2JqZWN0c1xuICovXG5DbGVhcnRleHRNZXNzYWdlLnByb3RvdHlwZS5nZXRTaWduaW5nS2V5SWRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIga2V5SWRzID0gW107XG4gIHZhciBzaWduYXR1cmVMaXN0ID0gdGhpcy5zaWduYXR1cmUucGFja2V0cztcbiAgc2lnbmF0dXJlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChwYWNrZXQpIHtcbiAgICBrZXlJZHMucHVzaChwYWNrZXQuaXNzdWVyS2V5SWQpO1xuICB9KTtcbiAgcmV0dXJuIGtleUlkcztcbn07XG5cbi8qKlxuICogU2lnbiB0aGUgY2xlYXJ0ZXh0IG1lc3NhZ2VcbiAqIEBwYXJhbSAge0FycmF5PG1vZHVsZTprZXkuS2V5Pn0gcHJpdmF0ZUtleXMgcHJpdmF0ZSBrZXlzIHdpdGggZGVjcnlwdGVkIHNlY3JldCBrZXkgZGF0YSBmb3Igc2lnbmluZ1xuICogQHBhcmFtICB7U2lnbmF0dXJlfSBzaWduYXR1cmUgICAgICAgICAgICAgKG9wdGlvbmFsKSBhbnkgZXhpc3RpbmcgZGV0YWNoZWQgc2lnbmF0dXJlXG4gKiBAcGFyYW0gIHtEYXRlfSBkYXRlICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uYWwpIFRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZSBzaWduYXR1cmUgdGhhdCBzaG91bGQgYmUgY3JlYXRlZFxuICogQHBhcmFtICB7T2JqZWN0fSB1c2VySWQgICAgICAgICAgICAgICAgICAgKG9wdGlvbmFsKSB1c2VyIElEIHRvIHNpZ24gd2l0aCwgZS5nLiB7IG5hbWU6J1N0ZXZlIFNlbmRlcicsIGVtYWlsOidzdGV2ZUBvcGVucGdwLm9yZycgfVxuICogQHJldHVybnMge1Byb21pc2U8bW9kdWxlOmNsZWFydGV4dC5DbGVhcnRleHRNZXNzYWdlPn0gbmV3IGNsZWFydGV4dCBtZXNzYWdlIHdpdGggc2lnbmVkIGNvbnRlbnRcbiAqIEBhc3luY1xuICovXG5DbGVhcnRleHRNZXNzYWdlLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlKHByaXZhdGVLZXlzKSB7XG4gICAgdmFyIHNpZ25hdHVyZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbmV3IERhdGUoKTtcbiAgICB2YXIgdXNlcklkID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IENsZWFydGV4dE1lc3NhZ2U7XG4gICAgICAgICAgICBfY29udGV4dC50MSA9IHRoaXMudGV4dDtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2lnbkRldGFjaGVkKHByaXZhdGVLZXlzLCBzaWduYXR1cmUsIGRhdGUsIHVzZXJJZCk7XG5cbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBfY29udGV4dC50MiA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCBuZXcgX2NvbnRleHQudDAoX2NvbnRleHQudDEsIF9jb250ZXh0LnQyKSk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3gpIHtcbiAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIFNpZ24gdGhlIGNsZWFydGV4dCBtZXNzYWdlXG4gKiBAcGFyYW0gIHtBcnJheTxtb2R1bGU6a2V5LktleT59IHByaXZhdGVLZXlzIHByaXZhdGUga2V5cyB3aXRoIGRlY3J5cHRlZCBzZWNyZXQga2V5IGRhdGEgZm9yIHNpZ25pbmdcbiAqIEBwYXJhbSAge1NpZ25hdHVyZX0gc2lnbmF0dXJlICAgICAgICAgICAgIChvcHRpb25hbCkgYW55IGV4aXN0aW5nIGRldGFjaGVkIHNpZ25hdHVyZVxuICogQHBhcmFtICB7RGF0ZX0gZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbmFsKSBUaGUgY3JlYXRpb24gdGltZSBvZiB0aGUgc2lnbmF0dXJlIHRoYXQgc2hvdWxkIGJlIGNyZWF0ZWRcbiAqIEBwYXJhbSAge09iamVjdH0gdXNlcklkICAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgdXNlciBJRCB0byBzaWduIHdpdGgsIGUuZy4geyBuYW1lOidTdGV2ZSBTZW5kZXInLCBlbWFpbDonc3RldmVAb3BlbnBncC5vcmcnIH1cbiAqIEByZXR1cm5zIHtQcm9taXNlPG1vZHVsZTpzaWduYXR1cmUuU2lnbmF0dXJlPn0gICAgICBuZXcgZGV0YWNoZWQgc2lnbmF0dXJlIG9mIG1lc3NhZ2UgY29udGVudFxuICogQGFzeW5jXG4gKi9cbkNsZWFydGV4dE1lc3NhZ2UucHJvdG90eXBlLnNpZ25EZXRhY2hlZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYyID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKHByaXZhdGVLZXlzKSB7XG4gICAgdmFyIHNpZ25hdHVyZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbmV3IERhdGUoKTtcbiAgICB2YXIgdXNlcklkID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgICB2YXIgbGl0ZXJhbERhdGFQYWNrZXQ7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGxpdGVyYWxEYXRhUGFja2V0ID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuTGl0ZXJhbCgpO1xuXG4gICAgICAgICAgICBsaXRlcmFsRGF0YVBhY2tldC5zZXRUZXh0KHRoaXMudGV4dCk7XG5cbiAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IF9zaWduYXR1cmUuU2lnbmF0dXJlO1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA1O1xuICAgICAgICAgICAgcmV0dXJuICgwLCBfbWVzc2FnZS5jcmVhdGVTaWduYXR1cmVQYWNrZXRzKShsaXRlcmFsRGF0YVBhY2tldCwgcHJpdmF0ZUtleXMsIHNpZ25hdHVyZSwgZGF0ZSwgdXNlcklkKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9jb250ZXh0Mi50MSA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoJ3JldHVybicsIG5ldyBfY29udGV4dDIudDAoX2NvbnRleHQyLnQxKSk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTIsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChfeDUpIHtcbiAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBWZXJpZnkgc2lnbmF0dXJlcyBvZiBjbGVhcnRleHQgc2lnbmVkIG1lc3NhZ2VcbiAqIEBwYXJhbSB7QXJyYXk8bW9kdWxlOmtleS5LZXk+fSBrZXlzIGFycmF5IG9mIGtleXMgdG8gdmVyaWZ5IHNpZ25hdHVyZXNcbiAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSAob3B0aW9uYWwpIFZlcmlmeSB0aGUgc2lnbmF0dXJlIGFnYWluc3QgdGhlIGdpdmVuIGRhdGUsIGkuZS4gY2hlY2sgc2lnbmF0dXJlIGNyZWF0aW9uIHRpbWUgPCBkYXRlIDwgZXhwaXJhdGlvbiB0aW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTx7a2V5aWQ6IG1vZHVsZTp0eXBlL2tleWlkLCB2YWxpZDogQm9vbGVhbn0+Pn0gbGlzdCBvZiBzaWduZXIncyBrZXlpZCBhbmQgdmFsaWRpdHkgb2Ygc2lnbmF0dXJlXG4gKiBAYXN5bmNcbiAqL1xuQ2xlYXJ0ZXh0TWVzc2FnZS5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gKGtleXMpIHtcbiAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG5ldyBEYXRlKCk7XG5cbiAgcmV0dXJuIHRoaXMudmVyaWZ5RGV0YWNoZWQodGhpcy5zaWduYXR1cmUsIGtleXMsIGRhdGUpO1xufTtcblxuLyoqXG4gKiBWZXJpZnkgc2lnbmF0dXJlcyBvZiBjbGVhcnRleHQgc2lnbmVkIG1lc3NhZ2VcbiAqIEBwYXJhbSB7QXJyYXk8bW9kdWxlOmtleS5LZXk+fSBrZXlzIGFycmF5IG9mIGtleXMgdG8gdmVyaWZ5IHNpZ25hdHVyZXNcbiAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSAob3B0aW9uYWwpIFZlcmlmeSB0aGUgc2lnbmF0dXJlIGFnYWluc3QgdGhlIGdpdmVuIGRhdGUsIGkuZS4gY2hlY2sgc2lnbmF0dXJlIGNyZWF0aW9uIHRpbWUgPCBkYXRlIDwgZXhwaXJhdGlvbiB0aW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTx7a2V5aWQ6IG1vZHVsZTp0eXBlL2tleWlkLCB2YWxpZDogQm9vbGVhbn0+Pn0gbGlzdCBvZiBzaWduZXIncyBrZXlpZCBhbmQgdmFsaWRpdHkgb2Ygc2lnbmF0dXJlXG4gKiBAYXN5bmNcbiAqL1xuQ2xlYXJ0ZXh0TWVzc2FnZS5wcm90b3R5cGUudmVyaWZ5RGV0YWNoZWQgPSBmdW5jdGlvbiAoc2lnbmF0dXJlLCBrZXlzKSB7XG4gIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBuZXcgRGF0ZSgpO1xuXG4gIHZhciBzaWduYXR1cmVMaXN0ID0gc2lnbmF0dXJlLnBhY2tldHM7XG4gIHZhciBsaXRlcmFsRGF0YVBhY2tldCA9IG5ldyBfcGFja2V0Mi5kZWZhdWx0LkxpdGVyYWwoKTtcbiAgLy8gd2UgYXNzdW1lIHRoYXQgY2xlYXJ0ZXh0IHNpZ25hdHVyZSBpcyBnZW5lcmF0ZWQgYmFzZWQgb24gVVRGOCBjbGVhcnRleHRcbiAgbGl0ZXJhbERhdGFQYWNrZXQuc2V0VGV4dCh0aGlzLnRleHQpO1xuICByZXR1cm4gKDAsIF9tZXNzYWdlLmNyZWF0ZVZlcmlmaWNhdGlvbk9iamVjdHMpKHNpZ25hdHVyZUxpc3QsIFtsaXRlcmFsRGF0YVBhY2tldF0sIGtleXMsIGRhdGUpO1xufTtcblxuLyoqXG4gKiBHZXQgY2xlYXJ0ZXh0XG4gKiBAcmV0dXJucyB7U3RyaW5nfSBjbGVhcnRleHQgb2YgbWVzc2FnZVxuICovXG5DbGVhcnRleHRNZXNzYWdlLnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBub3JtYWxpemUgZW5kIG9mIGxpbmUgdG8gXFxuXG4gIHJldHVybiBfdXRpbDIuZGVmYXVsdC5uYXRpdmVFT0wodGhpcy50ZXh0KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBBU0NJSSBhcm1vcmVkIHRleHQgb2YgY2xlYXJ0ZXh0IHNpZ25lZCBtZXNzYWdlXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBBU0NJSSBhcm1vclxuICovXG5DbGVhcnRleHRNZXNzYWdlLnByb3RvdHlwZS5hcm1vciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhhc2hlcyA9IHRoaXMuc2lnbmF0dXJlLnBhY2tldHMubWFwKGZ1bmN0aW9uIChwYWNrZXQpIHtcbiAgICByZXR1cm4gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0Lmhhc2gsIHBhY2tldC5oYXNoQWxnb3JpdGhtKS50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbiAgaGFzaGVzID0gaGFzaGVzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSwgaSwgYXIpIHtcbiAgICByZXR1cm4gYXIuaW5kZXhPZihpdGVtKSA9PT0gaTtcbiAgfSk7XG4gIHZhciBib2R5ID0ge1xuICAgIGhhc2g6IGhhc2hlcy5qb2luKCksXG4gICAgdGV4dDogdGhpcy50ZXh0LFxuICAgIGRhdGE6IHRoaXMuc2lnbmF0dXJlLnBhY2tldHMud3JpdGUoKVxuICB9O1xuICByZXR1cm4gX2FybW9yMi5kZWZhdWx0LmVuY29kZShfZW51bXMyLmRlZmF1bHQuYXJtb3Iuc2lnbmVkLCBib2R5KTtcbn07XG5cbi8qKlxuICogcmVhZHMgYW4gT3BlblBHUCBjbGVhcnRleHQgc2lnbmVkIG1lc3NhZ2UgYW5kIHJldHVybnMgYSBDbGVhcnRleHRNZXNzYWdlIG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IGFybW9yZWRUZXh0IHRleHQgdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7bW9kdWxlOmNsZWFydGV4dC5DbGVhcnRleHRNZXNzYWdlfSBuZXcgY2xlYXJ0ZXh0IG1lc3NhZ2Ugb2JqZWN0XG4gKiBAc3RhdGljXG4gKi9cbmZ1bmN0aW9uIHJlYWRBcm1vcmVkKGFybW9yZWRUZXh0KSB7XG4gIHZhciBpbnB1dCA9IF9hcm1vcjIuZGVmYXVsdC5kZWNvZGUoYXJtb3JlZFRleHQpO1xuICBpZiAoaW5wdXQudHlwZSAhPT0gX2VudW1zMi5kZWZhdWx0LmFybW9yLnNpZ25lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gY2xlYXJ0ZXh0IHNpZ25lZCBtZXNzYWdlLicpO1xuICB9XG4gIHZhciBwYWNrZXRsaXN0ID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuTGlzdCgpO1xuICBwYWNrZXRsaXN0LnJlYWQoaW5wdXQuZGF0YSk7XG4gIHZlcmlmeUhlYWRlcnMoaW5wdXQuaGVhZGVycywgcGFja2V0bGlzdCk7XG4gIHZhciBzaWduYXR1cmUgPSBuZXcgX3NpZ25hdHVyZS5TaWduYXR1cmUocGFja2V0bGlzdCk7XG4gIHJldHVybiBuZXcgQ2xlYXJ0ZXh0TWVzc2FnZShpbnB1dC50ZXh0LCBzaWduYXR1cmUpO1xufVxuXG4vKipcbiAqIENvbXBhcmUgaGFzaCBhbGdvcml0aG0gc3BlY2lmaWVkIGluIHRoZSBhcm1vciBoZWFkZXIgd2l0aCBzaWduYXR1cmVzXG4gKiBAcGFyYW0gIHtBcnJheTxTdHJpbmc+fSBoZWFkZXJzICAgIEFybW9yIGhlYWRlcnNcbiAqIEBwYXJhbSAge21vZHVsZTpwYWNrZXQuTGlzdH0gcGFja2V0bGlzdCBUaGUgcGFja2V0bGlzdCB3aXRoIHNpZ25hdHVyZSBwYWNrZXRzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB2ZXJpZnlIZWFkZXJzKGhlYWRlcnMsIHBhY2tldGxpc3QpIHtcbiAgdmFyIGNoZWNrSGFzaEFsZ29zID0gZnVuY3Rpb24gY2hlY2tIYXNoQWxnb3MoaGFzaEFsZ29zKSB7XG4gICAgdmFyIGNoZWNrID0gZnVuY3Rpb24gY2hlY2socGFja2V0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGFsZ28pIHtcbiAgICAgICAgcmV0dXJuIHBhY2tldC5oYXNoQWxnb3JpdGhtID09PSBhbGdvO1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWNrZXRsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGFja2V0bGlzdFtpXS50YWcgPT09IF9lbnVtczIuZGVmYXVsdC5wYWNrZXQuc2lnbmF0dXJlICYmICFoYXNoQWxnb3Muc29tZShjaGVjayhwYWNrZXRsaXN0W2ldKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICB2YXIgb25lSGVhZGVyID0gbnVsbDtcbiAgdmFyIGhhc2hBbGdvcyA9IFtdO1xuICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuICAgIG9uZUhlYWRlciA9IGhlYWRlci5tYXRjaCgvSGFzaDogKC4rKS8pOyAvLyBnZXQgaGVhZGVyIHZhbHVlXG4gICAgaWYgKG9uZUhlYWRlcikge1xuICAgICAgb25lSGVhZGVyID0gb25lSGVhZGVyWzFdLnJlcGxhY2UoL1xccy9nLCAnJyk7IC8vIHJlbW92ZSB3aGl0ZXNwYWNlXG4gICAgICBvbmVIZWFkZXIgPSBvbmVIZWFkZXIuc3BsaXQoJywnKTtcbiAgICAgIG9uZUhlYWRlciA9IG9uZUhlYWRlci5tYXAoZnVuY3Rpb24gKGhhc2gpIHtcbiAgICAgICAgaGFzaCA9IGhhc2gudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5oYXNoLCBoYXNoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBoYXNoIGFsZ29yaXRobSBpbiBhcm1vciBoZWFkZXI6ICcgKyBoYXNoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBoYXNoQWxnb3MgPSBoYXNoQWxnb3MuY29uY2F0KG9uZUhlYWRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT25seSBcIkhhc2hcIiBoZWFkZXIgYWxsb3dlZCBpbiBjbGVhcnRleHQgc2lnbmVkIG1lc3NhZ2UnKTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmICghaGFzaEFsZ29zLmxlbmd0aCAmJiAhY2hlY2tIYXNoQWxnb3MoW19lbnVtczIuZGVmYXVsdC5oYXNoLm1kNV0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJZiBubyBcIkhhc2hcIiBoZWFkZXIgaW4gY2xlYXJ0ZXh0IHNpZ25lZCBtZXNzYWdlLCB0aGVuIG9ubHkgTUQ1IHNpZ25hdHVyZXMgYWxsb3dlZCcpO1xuICB9IGVsc2UgaWYgKGhhc2hBbGdvcy5sZW5ndGggJiYgIWNoZWNrSGFzaEFsZ29zKGhhc2hBbGdvcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0hhc2ggYWxnb3JpdGhtIG1pc21hdGNoIGluIGFybW9yIGhlYWRlciBhbmQgc2lnbmF0dXJlJyk7XG4gIH1cbn1cblxufSx7XCIuL2VuY29kaW5nL2FybW9yXCI6MzU3LFwiLi9lbnVtc1wiOjM1OSxcIi4vbWVzc2FnZVwiOjM2NixcIi4vcGFja2V0XCI6MzcxLFwiLi9zaWduYXR1cmVcIjozOTEsXCIuL3V0aWxcIjozOTgsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiOjM1LFwiYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvclwiOjQyfV0sMzIzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbihmdW5jdGlvbiAocHJvY2VzcyxCdWZmZXIpe1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfdHlwZW9mMiA9IF9kZXJlcV8oXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG52YXIgX3R5cGVvZjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90eXBlb2YyKTtcblxudmFyIF9jcmVhdGUgPSBfZGVyZXFfKFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9jcmVhdGVcIik7XG5cbnZhciBfY3JlYXRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZSk7XG5cbnZhciBfZnJlZXplID0gX2RlcmVxXyhcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZnJlZXplXCIpO1xuXG52YXIgX2ZyZWV6ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mcmVlemUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgZnJlZXplLCBTdHJlYW0sIEJpdFN0cmVhbSwgVXRpbCwgQldULCBDUkMzMiwgSHVmZm1hbkFsbG9jYXRvciwgQnppcDI7ZnJlZXplID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX2ZyZWV6ZTIuZGVmYXVsdCA/IF9mcmVlemUyLmRlZmF1bHQgOiBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBlO1xuICB9O1xufSgpLCBTdHJlYW0gPSBmdW5jdGlvbiAoZSkge1xuICB2YXIgdCA9IGZ1bmN0aW9uIHQoKSB7fTtyZXR1cm4gdC5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGUgPSBbMF07cmV0dXJuIDAgPT09IHRoaXMucmVhZChlLCAwLCAxKSA/ICh0aGlzLl9lb2YgPSAhMCwgLTEpIDogZVswXTtcbiAgfSwgdC5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgZm9yICh2YXIgbiwgaSA9IDA7IGkgPCByOykge1xuICAgICAgaWYgKC0xID09PSAobiA9IHRoaXMucmVhZEJ5dGUoKSkpIHtcbiAgICAgICAgdGhpcy5fZW9mID0gITA7YnJlYWs7XG4gICAgICB9ZVt0ICsgaSsrXSA9IG47XG4gICAgfXJldHVybiBpO1xuICB9LCB0LnByb3RvdHlwZS5lb2YgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZW9mO1xuICB9LCB0LnByb3RvdHlwZS5zZWVrID0gZnVuY3Rpb24gKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdHJlYW0gaXMgbm90IHNlZWthYmxlLlwiKTtcbiAgfSwgdC5wcm90b3R5cGUudGVsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdHJlYW0gaXMgbm90IHNlZWthYmxlLlwiKTtcbiAgfSwgdC5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgdCA9IFtlXTt0aGlzLndyaXRlKHQsIDAsIDEpO1xuICB9LCB0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgdmFyIG47Zm9yIChuID0gMDsgbiA8IHI7IG4rKykge1xuICAgICAgdGhpcy53cml0ZUJ5dGUoZVt0ICsgbl0pO1xuICAgIH1yZXR1cm4gcjtcbiAgfSwgdC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7fSwgdC5FT0YgPSAtMSwgZSh0KTtcbn0oZnJlZXplKSwgQml0U3RyZWFtID0gZnVuY3Rpb24gKGUpIHtcbiAgdmFyIHQgPSBmdW5jdGlvbiB0KF90KSB7XG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByID0gMjU2O3RoaXMucmVhZEJpdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKDAgPT0gKDI1NSAmIHIpKSB7XG4gICAgICAgICAgdmFyIG4gPSBfdC5yZWFkQnl0ZSgpO2lmIChuID09PSBlLkVPRikgcmV0dXJuIHRoaXMuX2VvZiA9ICEwLCBuO3IgPSBuIDw8IDEgfCAxO1xuICAgICAgICB9dmFyIGkgPSAyNTYgJiByID8gMSA6IDA7cmV0dXJuIHIgPDw9IDEsIGk7XG4gICAgICB9LCB0aGlzLnNlZWtCaXQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgdCA9IGUgPj4+IDMsXG4gICAgICAgICAgICByID0gZSAtIDggKiB0O3RoaXMuc2Vlayh0KSwgdGhpcy5fZW9mID0gITEsIHRoaXMucmVhZEJpdHMocik7XG4gICAgICB9LCB0aGlzLnRlbGxCaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIGUgPSA4ICogX3QudGVsbCgpLCBuID0gcjsgMCAhPSAoMjU1ICYgbik7KSB7XG4gICAgICAgICAgZS0tLCBuIDw8PSAxO1xuICAgICAgICB9cmV0dXJuIGU7XG4gICAgICB9LCB0aGlzLnJlYWRCeXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gMCA9PSAoMjU1ICYgcikgPyBfdC5yZWFkQnl0ZSgpIDogdGhpcy5yZWFkQml0cyg4KTtcbiAgICAgIH0sIHRoaXMuc2VlayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90LnNlZWsoZSksIHIgPSAyNTY7XG4gICAgICB9O1xuICAgIH0pLmNhbGwodGhpcyksIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlID0gMTt0aGlzLndyaXRlQml0ID0gZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgZSA8PD0gMSwgciAmJiAoZSB8PSAxKSwgMjU2ICYgZSAmJiAoX3Qud3JpdGVCeXRlKDI1NSAmIGUpLCBlID0gMSk7XG4gICAgICB9LCB0aGlzLndyaXRlQnl0ZSA9IGZ1bmN0aW9uIChyKSB7XG4gICAgICAgIDEgPT09IGUgPyBfdC53cml0ZUJ5dGUocikgOiBfdC53cml0ZUJpdHMoOCwgcik7XG4gICAgICB9LCB0aGlzLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKDsgMSAhPT0gZTspIHtcbiAgICAgICAgICB0aGlzLndyaXRlQml0KDApO1xuICAgICAgICB9X3QuZmx1c2ggJiYgX3QuZmx1c2goKTtcbiAgICAgIH07XG4gICAgfS5jYWxsKHRoaXMpO1xuICB9O3JldHVybiB0LkVPRiA9IGUuRU9GLCB0LnByb3RvdHlwZSA9ICgwLCBfY3JlYXRlMi5kZWZhdWx0KShlLnByb3RvdHlwZSksIHQucHJvdG90eXBlLnJlYWRCaXRzID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgdCxcbiAgICAgICAgciA9IDA7aWYgKGUgPiAzMSkgcmV0dXJuIChyID0gNjU1MzYgKiB0aGlzLnJlYWRCaXRzKGUgLSAxNikpICsgdGhpcy5yZWFkQml0cygxNik7Zm9yICh0ID0gMDsgdCA8IGU7IHQrKykge1xuICAgICAgciA8PD0gMSwgdGhpcy5yZWFkQml0KCkgPiAwICYmIHIrKztcbiAgICB9cmV0dXJuIHI7XG4gIH0sIHQucHJvdG90eXBlLndyaXRlQml0cyA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgaWYgKGUgPiAzMikge1xuICAgICAgdmFyIHIgPSA2NTUzNSAmIHQsXG4gICAgICAgICAgbiA9ICh0IC0gcikgLyA2NTUzNjtyZXR1cm4gdGhpcy53cml0ZUJpdHMoZSAtIDE2LCBuKSwgdm9pZCB0aGlzLndyaXRlQml0cygxNiwgcik7XG4gICAgfXZhciBpO2ZvciAoaSA9IGUgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdGhpcy53cml0ZUJpdCh0ID4+PiBpICYgMSk7XG4gICAgfVxuICB9LCB0O1xufShTdHJlYW0pLCBVdGlsID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgdmFyIHIgPSAoMCwgX2NyZWF0ZTIuZGVmYXVsdCkobnVsbCksXG4gICAgICBuID0gdC5FT0Y7ci5jb2VyY2VJbnB1dFN0cmVhbSA9IGZ1bmN0aW9uIChlLCByKSB7XG4gICAgaWYgKFwicmVhZEJ5dGVcIiBpbiBlKSB7XG4gICAgICBpZiAociAmJiAhKFwicmVhZFwiIGluIGUpKSB7XG4gICAgICAgIHZhciBpID0gZTtlID0gbmV3IHQoKSwgZS5yZWFkQnl0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgZSA9IGkucmVhZEJ5dGUoKTtyZXR1cm4gZSA9PT0gbiAmJiAodGhpcy5fZW9mID0gITApLCBlO1xuICAgICAgICB9LCBcInNpemVcIiBpbiBpICYmIChlLnNpemUgPSBpLnNpemUpLCBcInNlZWtcIiBpbiBpICYmIChlLnNlZWsgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGkuc2VlayhlKSwgdGhpcy5fZW9mID0gITE7XG4gICAgICAgIH0pLCBcInRlbGxcIiBpbiBpICYmIChlLnRlbGwgPSBpLnRlbGwuYmluZChpKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvID0gZTtlID0gbmV3IHQoKSwgZS5zaXplID0gby5sZW5ndGgsIGUucG9zID0gMCwgZS5yZWFkQnl0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zID49IHRoaXMuc2l6ZSA/IG4gOiBvW3RoaXMucG9zKytdO1xuICAgICAgfSwgZS5yZWFkID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCByICYmIHRoaXMucG9zIDwgby5sZW5ndGg7KSB7XG4gICAgICAgICAgZVt0KytdID0gb1t0aGlzLnBvcysrXSwgbisrO1xuICAgICAgICB9cmV0dXJuIG47XG4gICAgICB9LCBlLnNlZWsgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0aGlzLnBvcyA9IGU7XG4gICAgICB9LCBlLnRlbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcztcbiAgICAgIH0sIGUuZW9mID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgPj0gby5sZW5ndGg7XG4gICAgICB9O1xuICAgIH1yZXR1cm4gZTtcbiAgfTt2YXIgaSA9IGZ1bmN0aW9uIGkoZSwgdCkge1xuICAgIHRoaXMuYnVmZmVyID0gZSwgdGhpcy5yZXNpemVPayA9IHQsIHRoaXMucG9zID0gMDtcbiAgfTtpLnByb3RvdHlwZSA9ICgwLCBfY3JlYXRlMi5kZWZhdWx0KSh0LnByb3RvdHlwZSksIGkucHJvdG90eXBlLndyaXRlQnl0ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKHRoaXMucmVzaXplT2sgJiYgdGhpcy5wb3MgPj0gdGhpcy5idWZmZXIubGVuZ3RoKSB7XG4gICAgICB2YXIgdCA9IHIubWFrZVU4QnVmZmVyKDIgKiB0aGlzLmJ1ZmZlci5sZW5ndGgpO3Quc2V0KHRoaXMuYnVmZmVyKSwgdGhpcy5idWZmZXIgPSB0O1xuICAgIH10aGlzLmJ1ZmZlclt0aGlzLnBvcysrXSA9IGU7XG4gIH0sIGkucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5wb3MgIT09IHRoaXMuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLnJlc2l6ZU9rKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwib3V0cHV0c2l6ZSBkb2VzIG5vdCBtYXRjaCBkZWNvZGVkIGlucHV0XCIpO3ZhciBlID0gci5tYWtlVThCdWZmZXIodGhpcy5wb3MpO2Uuc2V0KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsIHRoaXMucG9zKSksIHRoaXMuYnVmZmVyID0gZTtcbiAgICB9cmV0dXJuIHRoaXMuYnVmZmVyO1xuICB9LCByLmNvZXJjZU91dHB1dFN0cmVhbSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgdmFyIG4gPSB7IHN0cmVhbTogZSwgcmV0dmFsOiBlIH07aWYgKGUpIHtcbiAgICAgIGlmIChcIm9iamVjdFwiID09ICh0eXBlb2YgZSA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkoZSkpICYmIFwid3JpdGVCeXRlXCIgaW4gZSkgcmV0dXJuIG47XCJudW1iZXJcIiA9PSB0eXBlb2YgdCA/IChjb25zb2xlLmFzc2VydCh0ID49IDApLCBuLnN0cmVhbSA9IG5ldyBpKHIubWFrZVU4QnVmZmVyKHQpLCAhMSkpIDogbi5zdHJlYW0gPSBuZXcgaShlLCAhMSk7XG4gICAgfSBlbHNlIG4uc3RyZWFtID0gbmV3IGkoci5tYWtlVThCdWZmZXIoMTYzODQpLCAhMCk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCBcInJldHZhbFwiLCB7IGdldDogbi5zdHJlYW0uZ2V0QnVmZmVyLmJpbmQobi5zdHJlYW0pIH0pLCBuO1xuICB9LCByLmNvbXByZXNzRmlsZUhlbHBlciA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpLCBvLCBmKSB7XG4gICAgICBpID0gci5jb2VyY2VJbnB1dFN0cmVhbShpKTt2YXIgYSA9IHIuY29lcmNlT3V0cHV0U3RyZWFtKG8sIG8pO28gPSBhLnN0cmVhbTt2YXIgdTtmb3IgKHUgPSAwOyB1IDwgZS5sZW5ndGg7IHUrKykge1xuICAgICAgICBvLndyaXRlQnl0ZShlLmNoYXJDb2RlQXQodSkpO1xuICAgICAgfXZhciBzO2lmIChzID0gXCJzaXplXCIgaW4gaSAmJiBpLnNpemUgPj0gMCA/IGkuc2l6ZSA6IC0xLCBuKSB7XG4gICAgICAgIHZhciBjID0gci5jb2VyY2VPdXRwdXRTdHJlYW0oW10pO2ZvciAoci53cml0ZVVuc2lnbmVkTnVtYmVyKGMuc3RyZWFtLCBzICsgMSksIGMgPSBjLnJldHZhbCwgdSA9IDA7IHUgPCBjLmxlbmd0aCAtIDE7IHUrKykge1xuICAgICAgICAgIG8ud3JpdGVCeXRlKGNbdV0pO1xuICAgICAgICB9biA9IGNbYy5sZW5ndGggLSAxXTtcbiAgICAgIH0gZWxzZSByLndyaXRlVW5zaWduZWROdW1iZXIobywgcyArIDEpO3JldHVybiB0KGksIG8sIHMsIGYsIG4pLCBhLnJldHZhbDtcbiAgICB9O1xuICB9LCByLmRlY29tcHJlc3NGaWxlSGVscGVyID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG4sIGkpIHtcbiAgICAgIG4gPSByLmNvZXJjZUlucHV0U3RyZWFtKG4pO3ZhciBvO2ZvciAobyA9IDA7IG8gPCBlLmxlbmd0aDsgbysrKSB7XG4gICAgICAgIGlmIChlLmNoYXJDb2RlQXQobykgIT09IG4ucmVhZEJ5dGUoKSkgdGhyb3cgbmV3IEVycm9yKFwiQmFkIG1hZ2ljXCIpO1xuICAgICAgfXZhciBmID0gci5yZWFkVW5zaWduZWROdW1iZXIobikgLSAxLFxuICAgICAgICAgIGEgPSByLmNvZXJjZU91dHB1dFN0cmVhbShpLCBmKTtyZXR1cm4gaSA9IGEuc3RyZWFtLCB0KG4sIGksIGYpLCBhLnJldHZhbDtcbiAgICB9O1xuICB9LCByLmNvbXByZXNzV2l0aE1vZGVsID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSAhPT0gdDspIHtcbiAgICAgIHZhciBvID0gZS5yZWFkQnl0ZSgpO2lmIChvID09PSBuKSB7XG4gICAgICAgIHIuZW5jb2RlKDI1Nik7YnJlYWs7XG4gICAgICB9ci5lbmNvZGUobyksIGkrKztcbiAgICB9XG4gIH0sIHIuZGVjb21wcmVzc1dpdGhNb2RlbCA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgZm9yICh2YXIgbiA9IDA7IG4gIT09IHQ7KSB7XG4gICAgICB2YXIgaSA9IHIuZGVjb2RlKCk7aWYgKDI1NiA9PT0gaSkgYnJlYWs7ZS53cml0ZUJ5dGUoaSksIG4rKztcbiAgICB9XG4gIH0sIHIud3JpdGVVbnNpZ25lZE51bWJlciA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgY29uc29sZS5hc3NlcnQodCA+PSAwKTt2YXIgcixcbiAgICAgICAgbiA9IFtdO2RvIHtcbiAgICAgIG4ucHVzaCgxMjcgJiB0KSwgdCA9IE1hdGguZmxvb3IodCAvIDEyOCk7XG4gICAgfSB3aGlsZSAoMCAhPT0gdCk7Zm9yIChuWzBdIHw9IDEyOCwgciA9IG4ubGVuZ3RoIC0gMTsgciA+PSAwOyByLS0pIHtcbiAgICAgIGUud3JpdGVCeXRlKG5bcl0pO1xuICAgIH1yZXR1cm4gZTtcbiAgfSwgci5yZWFkVW5zaWduZWROdW1iZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgIGZvciAodmFyIHQsIHIgPSAwOzspIHtcbiAgICAgIGlmICgxMjggJiAodCA9IGUucmVhZEJ5dGUoKSkpIHtcbiAgICAgICAgciArPSAxMjcgJiB0O2JyZWFrO1xuICAgICAgfXIgPSAxMjggKiAociArIHQpO1xuICAgIH1yZXR1cm4gcjtcbiAgfTt2YXIgbyA9IGZ1bmN0aW9uIG8oZSkge1xuICAgIGZvciAodmFyIHQgPSAwLCByID0gZS5sZW5ndGg7IHQgPCByOyB0KyspIHtcbiAgICAgIGVbdF0gPSAwO1xuICAgIH1yZXR1cm4gZTtcbiAgfSxcbiAgICAgIGYgPSBmdW5jdGlvbiBmKGUpIHtcbiAgICByZXR1cm4gbyhuZXcgQXJyYXkoZSkpO1xuICB9LFxuICAgICAgYSA9IGZ1bmN0aW9uIGEoZSkge1xuICAgIHJldHVybiBlO1xuICB9O1widW5kZWZpbmVkXCIgIT0gdHlwZW9mIHByb2Nlc3MgJiYgQXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbChuZXcgVWludDMyQXJyYXkoMTI4KSwgZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gMCAhPT0gZTtcbiAgfSkgJiYgKGEgPSBvKSwgci5tYWtlVThCdWZmZXIgPSBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBVaW50OEFycmF5ID8gZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gYShuZXcgVWludDhBcnJheShlKSk7XG4gIH0gOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBCdWZmZXIgPyBmdW5jdGlvbiAoZSkge1xuICAgIHZhciB0ID0gbmV3IEJ1ZmZlcihlKTtyZXR1cm4gdC5maWxsKDApLCB0O1xuICB9IDogZiwgci5tYWtlVTE2QnVmZmVyID0gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgVWludDE2QXJyYXkgPyBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBhKG5ldyBVaW50MTZBcnJheShlKSk7XG4gIH0gOiBmLCByLm1ha2VVMzJCdWZmZXIgPSBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBVaW50MzJBcnJheSA/IGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGEobmV3IFVpbnQzMkFycmF5KGUpKTtcbiAgfSA6IGYsIHIubWFrZVMzMkJ1ZmZlciA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIEludDMyQXJyYXkgPyBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBhKG5ldyBJbnQzMkFycmF5KGUpKTtcbiAgfSA6IGYsIHIuYXJyYXljb3B5ID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICBjb25zb2xlLmFzc2VydChlLmxlbmd0aCA+PSB0Lmxlbmd0aCk7Zm9yICh2YXIgciA9IDAsIG4gPSB0Lmxlbmd0aDsgciA8IG47IHIrKykge1xuICAgICAgZVtyXSA9IHRbcl07XG4gICAgfXJldHVybiBlO1xuICB9O3ZhciB1ID0gWzAsIDEsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDhdO2NvbnNvbGUuYXNzZXJ0KDI1NiA9PT0gdS5sZW5ndGgpO3ZhciBzID0gci5mbHMgPSBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBjb25zb2xlLmFzc2VydChlID49IDApLCBlID4gNDI5NDk2NzI5NSA/IDMyICsgcyhNYXRoLmZsb29yKGUgLyA0Mjk0OTY3Mjk2KSkgOiAwICE9ICg0Mjk0OTAxNzYwICYgZSkgPyAwICE9ICg0Mjc4MTkwMDgwICYgZSkgPyAyNCArIHVbZSA+Pj4gMjQgJiAyNTVdIDogMTYgKyB1W2UgPj4+IDE2XSA6IDAgIT0gKDY1MjgwICYgZSkgPyA4ICsgdVtlID4+PiA4XSA6IHVbZV07XG4gIH07cmV0dXJuIHIubG9nMmMgPSBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiAwID09PSBlID8gLTEgOiBzKGUgLSAxKTtcbiAgfSwgZShyKTtcbn0oZnJlZXplLCBTdHJlYW0pLCBCV1QgPSBmdW5jdGlvbiAoZSwgdCkge1xuICB2YXIgciA9IGNvbnNvbGUuYXNzZXJ0LmJpbmQoY29uc29sZSksXG4gICAgICBuID0gZnVuY3Rpb24gbihlLCB0LCByLCBfbikge1xuICAgIHZhciBpO2ZvciAoaSA9IDA7IGkgPCBfbjsgaSsrKSB7XG4gICAgICB0W2ldID0gMDtcbiAgICB9Zm9yIChpID0gMDsgaSA8IHI7IGkrKykge1xuICAgICAgdFtlW2ldXSsrO1xuICAgIH1cbiAgfSxcbiAgICAgIGkgPSBmdW5jdGlvbiBpKGUsIHQsIHIsIG4pIHtcbiAgICB2YXIgaSxcbiAgICAgICAgbyA9IDA7aWYgKG4pIGZvciAoaSA9IDA7IGkgPCByOyBpKyspIHtcbiAgICAgIG8gKz0gZVtpXSwgdFtpXSA9IG87XG4gICAgfSBlbHNlIGZvciAoaSA9IDA7IGkgPCByOyBpKyspIHtcbiAgICAgIG8gKz0gZVtpXSwgdFtpXSA9IG8gLSBlW2ldO1xuICAgIH1cbiAgfSxcbiAgICAgIG8gPSBmdW5jdGlvbiBvKGUsIHQsIF9vLCBmLCBhLCB1KSB7XG4gICAgdmFyIHMsIGMsIGgsIGwsIGQ7Zm9yIChfbyA9PT0gZiAmJiBuKGUsIF9vLCBhLCB1KSwgaShfbywgZiwgdSwgITEpLCBoID0gYSAtIDEsIHMgPSBmW2QgPSBlW2hdXSwgaC0tLCB0W3MrK10gPSBlW2hdIDwgZCA/IH5oIDogaCwgYyA9IDA7IGMgPCBhOyBjKyspIHtcbiAgICAgIChoID0gdFtjXSkgPiAwID8gKHIoZVtoXSA+PSBlW2ggKyAxXSksIChsID0gZVtoXSkgIT09IGQgJiYgKGZbZF0gPSBzLCBzID0gZltkID0gbF0pLCByKGMgPCBzKSwgaC0tLCB0W3MrK10gPSBlW2hdIDwgZCA/IH5oIDogaCwgdFtjXSA9IDApIDogaCA8IDAgJiYgKHRbY10gPSB+aCk7XG4gICAgfWZvciAoX28gPT09IGYgJiYgbihlLCBfbywgYSwgdSksIGkoX28sIGYsIHUsIDEpLCBjID0gYSAtIDEsIHMgPSBmW2QgPSAwXTsgYyA+PSAwOyBjLS0pIHtcbiAgICAgIChoID0gdFtjXSkgPiAwICYmIChyKGVbaF0gPD0gZVtoICsgMV0pLCAobCA9IGVbaF0pICE9PSBkICYmIChmW2RdID0gcywgcyA9IGZbZCA9IGxdKSwgcihzIDw9IGMpLCBoLS0sIHRbLS1zXSA9IGVbaF0gPiBkID8gfihoICsgMSkgOiBoLCB0W2NdID0gMCk7XG4gICAgfVxuICB9LFxuICAgICAgZiA9IGZ1bmN0aW9uIGYoZSwgdCwgbiwgaSkge1xuICAgIHZhciBvLCBmLCBhLCB1LCBzLCBjLCBoLCBsLCBkLCBCO2ZvciAocihuID4gMCksIG8gPSAwOyAoYSA9IHRbb10pIDwgMDsgbysrKSB7XG4gICAgICB0W29dID0gfmEsIHIobyArIDEgPCBuKTtcbiAgICB9aWYgKG8gPCBpKSBmb3IgKGYgPSBvLCBvKys7IHIobyA8IG4pLCAhKChhID0gdFtvXSkgPCAwICYmICh0W2YrK10gPSB+YSwgdFtvXSA9IDAsIGYgPT09IGkpKTsgbysrKSB7fWwgPSBlW28gPSBmID0gbiAtIDFdO2RvIHtcbiAgICAgIGQgPSBsO1xuICAgIH0gd2hpbGUgKC0tbyA+PSAwICYmIChsID0gZVtvXSkgPj0gZCk7Zm9yICg7IG8gPj0gMDspIHtcbiAgICAgIGRvIHtcbiAgICAgICAgZCA9IGw7XG4gICAgICB9IHdoaWxlICgtLW8gPj0gMCAmJiAobCA9IGVbb10pIDw9IGQpO2lmIChvID49IDApIHtcbiAgICAgICAgdFtpICsgKG8gKyAxID4+PiAxKV0gPSBmIC0gbywgZiA9IG8gKyAxO2RvIHtcbiAgICAgICAgICBkID0gbDtcbiAgICAgICAgfSB3aGlsZSAoLS1vID49IDAgJiYgKGwgPSBlW29dKSA+PSBkKTtcbiAgICAgIH1cbiAgICB9Zm9yIChvID0gMCwgaCA9IDAsIHUgPSBuLCBjID0gMDsgbyA8IGk7IG8rKykge1xuICAgICAgaWYgKGEgPSB0W29dLCBzID0gdFtpICsgKGEgPj4+IDEpXSwgQiA9ICEwLCBzID09PSBjICYmIHUgKyBzIDwgbikge1xuICAgICAgICBmb3IgKGYgPSAwOyBmIDwgcyAmJiBlW2EgKyBmXSA9PT0gZVt1ICsgZl07KSB7XG4gICAgICAgICAgZisrO1xuICAgICAgICB9ZiA9PT0gcyAmJiAoQiA9ICExKTtcbiAgICAgIH1CICYmIChoKyssIHUgPSBhLCBjID0gcyksIHRbaSArIChhID4+PiAxKV0gPSBoO1xuICAgIH1yZXR1cm4gaDtcbiAgfSxcbiAgICAgIGEgPSBmdW5jdGlvbiBhKGUsIHQsIG8sIGYsIF9hLCB1KSB7XG4gICAgdmFyIHMsIGMsIGgsIGwsIGQ7Zm9yIChvID09PSBmICYmIG4oZSwgbywgX2EsIHUpLCBpKG8sIGYsIHUsICExKSwgaCA9IF9hIC0gMSwgcyA9IGZbZCA9IGVbaF1dLCB0W3MrK10gPSBoID4gMCAmJiBlW2ggLSAxXSA8IGQgPyB+aCA6IGgsIGMgPSAwOyBjIDwgX2E7IGMrKykge1xuICAgICAgaCA9IHRbY10sIHRbY10gPSB+aCwgaCA+IDAgJiYgKGgtLSwgcihlW2hdID49IGVbaCArIDFdKSwgKGwgPSBlW2hdKSAhPT0gZCAmJiAoZltkXSA9IHMsIHMgPSBmW2QgPSBsXSksIHIoYyA8IHMpLCB0W3MrK10gPSBoID4gMCAmJiBlW2ggLSAxXSA8IGQgPyB+aCA6IGgpO1xuICAgIH1mb3IgKG8gPT09IGYgJiYgbihlLCBvLCBfYSwgdSksIGkobywgZiwgdSwgITApLCBjID0gX2EgLSAxLCBzID0gZltkID0gMF07IGMgPj0gMDsgYy0tKSB7XG4gICAgICAoaCA9IHRbY10pID4gMCA/IChoLS0sIHIoZVtoXSA8PSBlW2ggKyAxXSksIChsID0gZVtoXSkgIT09IGQgJiYgKGZbZF0gPSBzLCBzID0gZltkID0gbF0pLCByKHMgPD0gYyksIHRbLS1zXSA9IDAgPT09IGggfHwgZVtoIC0gMV0gPiBkID8gfmggOiBoKSA6IHRbY10gPSB+aDtcbiAgICB9XG4gIH0sXG4gICAgICB1ID0gZnVuY3Rpb24gdShlLCB0LCBvLCBmLCBhLCBfdSkge1xuICAgIHZhciBzLFxuICAgICAgICBjLFxuICAgICAgICBoLFxuICAgICAgICBsLFxuICAgICAgICBkLFxuICAgICAgICBCID0gLTE7Zm9yIChvID09PSBmICYmIG4oZSwgbywgYSwgX3UpLCBpKG8sIGYsIF91LCAhMSksIGggPSBhIC0gMSwgcyA9IGZbZCA9IGVbaF1dLCB0W3MrK10gPSBoID4gMCAmJiBlW2ggLSAxXSA8IGQgPyB+aCA6IGgsIGMgPSAwOyBjIDwgYTsgYysrKSB7XG4gICAgICAoaCA9IHRbY10pID4gMCA/IChoLS0sIHIoZVtoXSA+PSBlW2ggKyAxXSksIHRbY10gPSB+KGwgPSBlW2hdKSwgbCAhPT0gZCAmJiAoZltkXSA9IHMsIHMgPSBmW2QgPSBsXSksIHIoYyA8IHMpLCB0W3MrK10gPSBoID4gMCAmJiBlW2ggLSAxXSA8IGQgPyB+aCA6IGgpIDogMCAhPT0gaCAmJiAodFtjXSA9IH5oKTtcbiAgICB9Zm9yIChvID09PSBmICYmIG4oZSwgbywgYSwgX3UpLCBpKG8sIGYsIF91LCAhMCksIGMgPSBhIC0gMSwgcyA9IGZbZCA9IDBdOyBjID49IDA7IGMtLSkge1xuICAgICAgKGggPSB0W2NdKSA+IDAgPyAoaC0tLCByKGVbaF0gPD0gZVtoICsgMV0pLCB0W2NdID0gbCA9IGVbaF0sIGwgIT09IGQgJiYgKGZbZF0gPSBzLCBzID0gZltkID0gbF0pLCByKHMgPD0gYyksIHRbLS1zXSA9IGggPiAwICYmIGVbaCAtIDFdID4gZCA/IH5lW2ggLSAxXSA6IGgpIDogMCAhPT0gaCA/IHRbY10gPSB+aCA6IEIgPSBjO1xuICAgIH1yZXR1cm4gQjtcbiAgfSxcbiAgICAgIHMgPSBmdW5jdGlvbiBzKGUsIGMsIGgsIGwsIGQsIEIpIHtcbiAgICB2YXIgcCxcbiAgICAgICAgdixcbiAgICAgICAgbSxcbiAgICAgICAgdyxcbiAgICAgICAgRSxcbiAgICAgICAgZyxcbiAgICAgICAgXyxcbiAgICAgICAgYixcbiAgICAgICAgeSxcbiAgICAgICAgUixcbiAgICAgICAgQyxcbiAgICAgICAgayxcbiAgICAgICAgVCxcbiAgICAgICAgTyA9IDAsXG4gICAgICAgIFMgPSAwO2ZvciAoZCA8PSAyNTYgPyAocCA9IHQubWFrZVMzMkJ1ZmZlcihkKSwgZCA8PSBoID8gKHYgPSBjLnN1YmFycmF5KGwgKyBoIC0gZCksIFMgPSAxKSA6ICh2ID0gdC5tYWtlUzMyQnVmZmVyKGQpLCBTID0gMykpIDogZCA8PSBoID8gKHAgPSBjLnN1YmFycmF5KGwgKyBoIC0gZCksIGQgPD0gaCAtIGQgPyAodiA9IGMuc3ViYXJyYXkobCArIGggLSAyICogZCksIFMgPSAwKSA6IGQgPD0gMTAyNCA/ICh2ID0gdC5tYWtlUzMyQnVmZmVyKGQpLCBTID0gMikgOiAodiA9IHAsIFMgPSA4KSkgOiAocCA9IHYgPSB0Lm1ha2VTMzJCdWZmZXIoZCksIFMgPSAxMiksIG4oZSwgcCwgbCwgZCksIGkocCwgdiwgZCwgITApLCB3ID0gMDsgdyA8IGw7IHcrKykge1xuICAgICAgY1t3XSA9IDA7XG4gICAgfWcgPSAtMSwgdyA9IGwgLSAxLCBFID0gbCwgXyA9IDAsIGsgPSBlW2wgLSAxXTtkbyB7XG4gICAgICBUID0gaztcbiAgICB9IHdoaWxlICgtLXcgPj0gMCAmJiAoayA9IGVbd10pID49IFQpO2ZvciAoOyB3ID49IDA7KSB7XG4gICAgICBkbyB7XG4gICAgICAgIFQgPSBrO1xuICAgICAgfSB3aGlsZSAoLS13ID49IDAgJiYgKGsgPSBlW3ddKSA8PSBUKTtpZiAodyA+PSAwKSB7XG4gICAgICAgIGcgPj0gMCAmJiAoY1tnXSA9IEUpLCBnID0gLS12W1RdLCBFID0gdywgKytfO2RvIHtcbiAgICAgICAgICBUID0gaztcbiAgICAgICAgfSB3aGlsZSAoLS13ID49IDAgJiYgKGsgPSBlW3ddKSA+PSBUKTtcbiAgICAgIH1cbiAgICB9aWYgKF8gPiAxID8gKG8oZSwgYywgcCwgdiwgbCwgZCksIFIgPSBmKGUsIGMsIGwsIF8pKSA6IDEgPT09IF8gPyAoY1tnXSA9IEUgKyAxLCBSID0gMSkgOiBSID0gMCwgUiA8IF8pIHtcbiAgICAgIGZvciAoMCAhPSAoNCAmIFMpICYmIChwID0gbnVsbCwgdiA9IG51bGwpLCAwICE9ICgyICYgUykgJiYgKHYgPSBudWxsKSwgQyA9IGwgKyBoIC0gMiAqIF8sIDAgPT0gKDEzICYgUykgJiYgKGQgKyBSIDw9IEMgPyBDIC09IGQgOiBTIHw9IDgpLCByKGwgPj4+IDEgPD0gQyArIF8pLCB3ID0gXyArIChsID4+PiAxKSAtIDEsIEUgPSAyICogXyArIEMgLSAxOyBfIDw9IHc7IHctLSkge1xuICAgICAgICAwICE9PSBjW3ddICYmIChjW0UtLV0gPSBjW3ddIC0gMSk7XG4gICAgICB9bSA9IGMuc3ViYXJyYXkoXyArIEMpLCBzKG0sIGMsIEMsIF8sIFIsICExKSwgbSA9IG51bGwsIHcgPSBsIC0gMSwgRSA9IDIgKiBfIC0gMSwgayA9IGVbbCAtIDFdO2RvIHtcbiAgICAgICAgVCA9IGs7XG4gICAgICB9IHdoaWxlICgtLXcgPj0gMCAmJiAoayA9IGVbd10pID49IFQpO2ZvciAoOyB3ID49IDA7KSB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBUID0gaztcbiAgICAgICAgfSB3aGlsZSAoLS13ID49IDAgJiYgKGsgPSBlW3ddKSA8PSBUKTtpZiAodyA+PSAwKSB7XG4gICAgICAgICAgY1tFLS1dID0gdyArIDE7ZG8ge1xuICAgICAgICAgICAgVCA9IGs7XG4gICAgICAgICAgfSB3aGlsZSAoLS13ID49IDAgJiYgKGsgPSBlW3ddKSA+PSBUKTtcbiAgICAgICAgfVxuICAgICAgfWZvciAodyA9IDA7IHcgPCBfOyB3KyspIHtcbiAgICAgICAgY1t3XSA9IGNbXyArIGNbd11dO1xuICAgICAgfTAgIT0gKDQgJiBTKSAmJiAocCA9IHYgPSB0Lm1ha2VTMzJCdWZmZXIoZCkpLCAwICE9ICgyICYgUykgJiYgKHYgPSB0Lm1ha2VTMzJCdWZmZXIoZCkpO1xuICAgIH1pZiAoMCAhPSAoOCAmIFMpICYmIG4oZSwgcCwgbCwgZCksIF8gPiAxKSB7XG4gICAgICBpKHAsIHYsIGQsICEwKSwgdyA9IF8gLSAxLCBFID0gbCwgYiA9IGNbXyAtIDFdLCBUID0gZVtiXTtkbyB7XG4gICAgICAgIGZvciAoeSA9IHZbayA9IFRdOyB5IDwgRTspIHtcbiAgICAgICAgICBjWy0tRV0gPSAwO1xuICAgICAgICB9ZG8ge1xuICAgICAgICAgIGlmIChjWy0tRV0gPSBiLCAtLXcgPCAwKSBicmVhaztiID0gY1t3XTtcbiAgICAgICAgfSB3aGlsZSAoKFQgPSBlW2JdKSA9PT0gayk7XG4gICAgICB9IHdoaWxlICh3ID49IDApO2ZvciAoOyBFID4gMDspIHtcbiAgICAgICAgY1stLUVdID0gMDtcbiAgICAgIH1cbiAgICB9cmV0dXJuIEIgPyBPID0gdShlLCBjLCBwLCB2LCBsLCBkKSA6IGEoZSwgYywgcCwgdiwgbCwgZCksIHAgPSBudWxsLCB2ID0gbnVsbCwgTztcbiAgfSxcbiAgICAgIGMgPSAoMCwgX2NyZWF0ZTIuZGVmYXVsdCkobnVsbCk7cmV0dXJuIGMuc3VmZml4c29ydCA9IGZ1bmN0aW9uIChlLCB0LCBuLCBpKSB7XG4gICAgaWYgKHIoZSAmJiB0ICYmIGUubGVuZ3RoID49IG4gJiYgdC5sZW5ndGggPj0gbiksIG4gPD0gMSkgcmV0dXJuIDEgPT09IG4gJiYgKHRbMF0gPSAwKSwgMDtpZiAoIWkpIGlmICgxID09PSBlLkJZVEVTX1BFUl9FTEVNRU5UKSBpID0gMjU2O2Vsc2Uge1xuICAgICAgaWYgKDIgIT09IGUuQllURVNfUEVSX0VMRU1FTlQpIHRocm93IG5ldyBFcnJvcihcIk5lZWQgdG8gc3BlY2lmeSBhbHBoYWJldFNpemVcIik7aSA9IDY1NTM2O1xuICAgIH1yZXR1cm4gcihpID4gMCksIGUuQllURVNfUEVSX0VMRU1FTlQgJiYgcihpIDw9IDEgPDwgOCAqIGUuQllURVNfUEVSX0VMRU1FTlQpLCBzKGUsIHQsIDAsIG4sIGksICExKTtcbiAgfSwgYy5id3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChlLCB0LCBuLCBpLCBvKSB7XG4gICAgdmFyIGYsIGE7aWYgKHIoZSAmJiB0ICYmIG4pLCByKGUubGVuZ3RoID49IGkgJiYgdC5sZW5ndGggPj0gaSAmJiBuLmxlbmd0aCA+PSBpKSwgaSA8PSAxKSByZXR1cm4gMSA9PT0gaSAmJiAodFswXSA9IGVbMF0pLCBpO2lmICghbykgaWYgKDEgPT09IGUuQllURVNfUEVSX0VMRU1FTlQpIG8gPSAyNTY7ZWxzZSB7XG4gICAgICBpZiAoMiAhPT0gZS5CWVRFU19QRVJfRUxFTUVOVCkgdGhyb3cgbmV3IEVycm9yKFwiTmVlZCB0byBzcGVjaWZ5IGFscGhhYmV0U2l6ZVwiKTtvID0gNjU1MzY7XG4gICAgfWZvciAocihvID4gMCksIGUuQllURVNfUEVSX0VMRU1FTlQgJiYgcihvIDw9IDEgPDwgOCAqIGUuQllURVNfUEVSX0VMRU1FTlQpLCBhID0gcyhlLCBuLCAwLCBpLCBvLCAhMCksIHRbMF0gPSBlW2kgLSAxXSwgZiA9IDA7IGYgPCBhOyBmKyspIHtcbiAgICAgIHRbZiArIDFdID0gbltmXTtcbiAgICB9Zm9yIChmICs9IDE7IGYgPCBpOyBmKyspIHtcbiAgICAgIHRbZl0gPSBuW2ZdO1xuICAgIH1yZXR1cm4gYSArIDE7XG4gIH0sIGMudW5id3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChlLCByLCBuLCBpLCBvKSB7XG4gICAgdmFyIGYsXG4gICAgICAgIGEsXG4gICAgICAgIHUgPSB0Lm1ha2VVMzJCdWZmZXIoMjU2KTtmb3IgKGYgPSAwOyBmIDwgMjU2OyBmKyspIHtcbiAgICAgIHVbZl0gPSAwO1xuICAgIH1mb3IgKGYgPSAwOyBmIDwgaTsgZisrKSB7XG4gICAgICBuW2ZdID0gdVtlW2ZdXSsrO1xuICAgIH1mb3IgKGYgPSAwLCBhID0gMDsgZiA8IDI1NjsgZisrKSB7XG4gICAgICBhICs9IHVbZl0sIHVbZl0gPSBhIC0gdVtmXTtcbiAgICB9Zm9yIChmID0gaSAtIDEsIGEgPSAwOyBmID49IDA7IGYtLSkge1xuICAgICAgYSA9IG5bYV0gKyB1W3JbZl0gPSBlW2FdXSwgYSArPSBhIDwgbyA/IDEgOiAwO1xuICAgIH11ID0gbnVsbDtcbiAgfSwgYy5id3RyYW5zZm9ybTIgPSBmdW5jdGlvbiAoZSwgbiwgaSwgbykge1xuICAgIHZhciBmLFxuICAgICAgICBhLFxuICAgICAgICB1ID0gMDtpZiAocihlICYmIG4pLCByKGUubGVuZ3RoID49IGkgJiYgbi5sZW5ndGggPj0gaSksIGkgPD0gMSkgcmV0dXJuIDEgPT09IGkgJiYgKG5bMF0gPSBlWzBdKSwgMDtpZiAoIW8pIGlmICgxID09PSBlLkJZVEVTX1BFUl9FTEVNRU5UKSBvID0gMjU2O2Vsc2Uge1xuICAgICAgaWYgKDIgIT09IGUuQllURVNfUEVSX0VMRU1FTlQpIHRocm93IG5ldyBFcnJvcihcIk5lZWQgdG8gc3BlY2lmeSBhbHBoYWJldFNpemVcIik7byA9IDY1NTM2O1xuICAgIH1yKG8gPiAwKSwgZS5CWVRFU19QRVJfRUxFTUVOVCAmJiByKG8gPD0gMSA8PCA4ICogZS5CWVRFU19QRVJfRUxFTUVOVCk7dmFyIGM7aWYgKChjID0gZS5sZW5ndGggPj0gMiAqIGkgPyBlIDogbyA8PSAyNTYgPyB0Lm1ha2VVOEJ1ZmZlcigyICogaSkgOiBvIDw9IDY1NTM2ID8gdC5tYWtlVTE2QnVmZmVyKDIgKiBpKSA6IHQubWFrZVUzMkJ1ZmZlcigyICogaSkpICE9PSBlKSBmb3IgKGYgPSAwOyBmIDwgaTsgZisrKSB7XG4gICAgICBjW2ZdID0gZVtmXTtcbiAgICB9Zm9yIChmID0gMDsgZiA8IGk7IGYrKykge1xuICAgICAgY1tpICsgZl0gPSBjW2ZdO1xuICAgIH12YXIgaCA9IHQubWFrZVMzMkJ1ZmZlcigyICogaSk7Zm9yIChzKGMsIGgsIDAsIDIgKiBpLCBvLCAhMSksIGYgPSAwLCBhID0gMDsgZiA8IDIgKiBpOyBmKyspIHtcbiAgICAgIHZhciBsID0gaFtmXTtsIDwgaSAmJiAoMCA9PT0gbCAmJiAodSA9IGEpLCAtLWwgPCAwICYmIChsID0gaSAtIDEpLCBuW2ErK10gPSBlW2xdKTtcbiAgICB9cmV0dXJuIHIoYSA9PT0gaSksIHU7XG4gIH0sIGUoYyk7XG59KGZyZWV6ZSwgVXRpbCksIENSQzMyID0gZnVuY3Rpb24gKGUpIHtcbiAgdmFyIHQgPSBlLmFycmF5Y29weShlLm1ha2VVMzJCdWZmZXIoMjU2KSwgWzAsIDc5NzY0OTE5LCAxNTk1Mjk4MzgsIDIyMjUwNDY2NSwgMzE5MDU5Njc2LCAzOTg4MTQwNTksIDQ0NTAwOTMzMCwgNTA3OTkwMDIxLCA2MzgxMTkzNTIsIDU4MzY1OTUzNSwgNzk3NjI4MTE4LCA3MjYzODc1NTMsIDg5MDAxODY2MCwgODM1NTUyOTc5LCAxMDE1OTgwMDQyLCA5NDQ3NTAwMTMsIDEyNzYyMzg3MDQsIDEyMjE2NDE5MjcsIDExNjczMTkwNzAsIDEwOTU5NTc5MjksIDE1OTUyNTYyMzYsIDE1NDA2NjUzNzEsIDE0NTI3NzUxMDYsIDEzODE0MDM1MDksIDE3ODAwMzczMjAsIDE4NTk2NjA2NzEsIDE2NzExMDU5NTgsIDE3MzM5NTU2MDEsIDIwMzE5NjAwODQsIDIxMTE1OTM4OTEsIDE4ODk1MDAwMjYsIDE5NTIzNDM3NTcsIDI1NTI0Nzc0MDgsIDI2MzIxMDA2OTUsIDI0NDMyODM4NTQsIDI1MDYxMzM1NjEsIDIzMzQ2MzgxNDAsIDI0MTQyNzE4ODMsIDIxOTE5MTU4NTgsIDIyNTQ3NTk2NTMsIDMxOTA1MTI0NzIsIDMxMzU5MTU3NTksIDMwODEzMzA3NDIsIDMwMDk5Njk1MzcsIDI5MDU1NTAyMTIsIDI4NTA5NTk0MTEsIDI3NjI4MDcwMTgsIDI2OTE0MzUzNTcsIDM1NjAwNzQ2NDAsIDM1MDU2MTQ4ODcsIDM3MTkzMjEzNDIsIDM2NDgwODA3MTMsIDMzNDIyMTE5MTYsIDMyODc3NDYyOTksIDM0Njc5MTEyMDIsIDMzOTY2ODExMDksIDQwNjM5MjAxNjgsIDQxNDM2ODUwMjMsIDQyMjMxODc3ODIsIDQyODYxNjI2NzMsIDM3NzkwMDAwNTIsIDM4NTg3NTQzNzEsIDM5MDQ2ODc1MTQsIDM5Njc2NjgyNjksIDg4MTIyNTg0NywgODA5OTg3NTIwLCAxMDIzNjkxNTQ1LCA5NjkyMzQwOTQsIDY2MjgzMjgxMSwgNTkxNjAwNDEyLCA3NzE3Njc3NDksIDcxNzI5OTgyNiwgMzExMzM2Mzk5LCAzNzQzMDg5ODQsIDQ1MzgxMzkyMSwgNTMzNTc2NDcwLCAyNTg4MTM2MywgODg4NjQ0MjAsIDEzNDc5NTM4OSwgMjE0NTUyMDEwLCAyMDIzMjA1NjM5LCAyMDg2MDU3NjQ4LCAxODk3MjM4NjMzLCAxOTc2ODY0MjIyLCAxODA0ODUyNjk5LCAxODY3Njk0MTg4LCAxNjQ1MzQwMzQxLCAxNzI0OTcxNzc4LCAxNTg3NDk2NjM5LCAxNTE2MTMzMTI4LCAxNDYxNTUwNTQ1LCAxNDA2OTUxNTI2LCAxMzAyMDE2MDk5LCAxMjMwNjQ2NzQwLCAxMTQyNDkxOTE3LCAxMDg3OTAzNDE4LCAyODk2NTQ1NDMxLCAyODI1MTgxOTg0LCAyNzcwODYxNTYxLCAyNzE2MjYyNDc4LCAzMjE1MDQ0NjgzLCAzMTQzNjc1Mzg4LCAzMDU1NzgyNjkzLCAzMDAxMTk0MTMwLCAyMzI2NjA0NTkxLCAyMzg5NDU2NTM2LCAyMjAwODk5NjQ5LCAyMjgwNTI1MzAyLCAyNTc4MDEzNjgzLCAyNjQwODU1MTA4LCAyNDE4NzYzNDIxLCAyNDk4Mzk0OTIyLCAzNzY5OTAwNTE5LCAzODMyODczMDQwLCAzOTEyNjQwMTM3LCAzOTkyNDAyNzUwLCA0MDg4NDI1Mjc1LCA0MTUxNDA4MjY4LCA0MTk3NjAxMzY1LCA0Mjc3MzU4MDUwLCAzMzM0MjcxMDcxLCAzMjYzMDMyODA4LCAzNDc2OTk4OTYxLCAzNDIyNTQxNDQ2LCAzNTg1NjQwMDY3LCAzNTE0NDA3NzMyLCAzNjk0ODM3MjI5LCAzNjQwMzY5MjQyLCAxNzYyNDUxNjk0LCAxODQyMjE2MjgxLCAxNjE5OTc1MDQwLCAxNjgyOTQ5Njg3LCAyMDQ3MzgzMDkwLCAyMTI3MTM3NjY5LCAxOTM4NDY4MTg4LCAyMDAxNDQ5MTk1LCAxMzI1NjY1NjIyLCAxMjcxMjA2MTEzLCAxMTgzMjAwODI0LCAxMTExOTYwNDYzLCAxNTQzNTM1NDk4LCAxNDg5MDY5NjI5LCAxNDM0NTk5NjUyLCAxMzYzMzY5Mjk5LCA2MjI2NzI3OTgsIDU2ODA3NTgxNywgNzQ4NjE3OTY4LCA2NzcyNTY1MTksIDkwNzYyNzg0MiwgODUzMDM3MzAxLCAxMDY3MTUyOTQwLCA5OTU3ODE1MzEsIDUxNzYyNzI2LCAxMzEzODYyNTcsIDE3NzcyODg0MCwgMjQwNTc4ODE1LCAyNjk1OTA3NzgsIDM0OTIyNDI2OSwgNDI5MTA0MDIwLCA0OTE5NDc1NTUsIDQwNDY0MTEyNzgsIDQxMjYwMzQ4NzMsIDQxNzIxMTUyOTYsIDQyMzQ5NjUyMDcsIDM3OTQ0NzcyNjYsIDM4NzQxMTA4MjEsIDM5NTM3Mjg0NDQsIDQwMTY1NzE5MTUsIDM2MDk3MDUzOTgsIDM1NTUxMDgzNTMsIDM3MzUzODgzNzYsIDM2NjQwMjY5OTEsIDMyOTA2ODA2ODIsIDMyMzYwOTAwNzcsIDM0NDk5NDM1NTYsIDMzNzg1NzIyMTEsIDMxNzQ5OTMyNzgsIDMxMjA1MzM3MDUsIDMwMzIyNjYyNTYsIDI5NjEwMjU5NTksIDI5MjMxMDEwOTAsIDI4Njg2MzUxNTcsIDI4MTM5MDMwNTIsIDI3NDI2NzI3NjMsIDI2MDQwMzIxOTgsIDI2ODM3OTY4NDksIDI0NjEyOTM0ODAsIDI1MjQyNjgwNjMsIDIyODQ5ODM4MzQsIDIzNjQ3Mzg0NzcsIDIxNzU4MDY4MzYsIDIyMzg3ODc3NzksIDE1NjkzNjIwNzMsIDE0OTgxMjM1NjYsIDE0MDk4NTQ0NTUsIDEzNTUzOTY2NzIsIDEzMTc5ODc5MDksIDEyNDY3NTU4MjYsIDExOTIwMjUzODcsIDExMzc1NTc2NjAsIDIwNzIxNDkyODEsIDIxMzUxMjIwNzAsIDE5MTI2MjA2MjMsIDE5OTIzODM0ODAsIDE3NTM2MTUzNTcsIDE4MTY1OTgwOTAsIDE2Mjc2NjQ1MzEsIDE3MDc0MjA5NjQsIDI5NTM5MDE4NSwgMzU4MjQxODg2LCA0MDQzMjAzOTEsIDQ4Mzk0NTc3NiwgNDM5OTAzMjUsIDEwNjgzMjAwMiwgMTg2NDUxNTQ3LCAyNjYwODMzMDgsIDkzMjQyMzI0OSwgODYxMDYwMDcwLCAxMDQxMzQxNzU5LCA5ODY3NDI5MjAsIDYxMzkyOTEwMSwgNTQyNTU5NTQ2LCA3NTY0MTEzNjMsIDcwMTgyMjU0OCwgMzMxNjE5Njk4NSwgMzI0NDgzMzc0MiwgMzQyNTM3NzU1OSwgMzM3MDc3ODc4NCwgMzYwMTY4MjU5NywgMzUzMDMxMjk3OCwgMzc0NDQyNjk1NSwgMzY4OTgzODIwNCwgMzgxOTAzMTQ4OSwgMzg4MTg4MzI1NCwgMzkyODIyMzkxOSwgNDAwNzg0OTI0MCwgNDAzNzM5MzY5MywgNDEwMDIzNTQzNCwgNDE4MDExNzEwNywgNDI1OTc0ODgwNCwgMjMxMDYwMTk5MywgMjM3MzU3NDg0NiwgMjE1MTMzNTUyNywgMjIzMTA5ODMyMCwgMjU5NjA0NzgyOSwgMjY1OTAzMDYyNiwgMjQ3MDM1OTIyNywgMjU1MDExNTU5NiwgMjk0NzU1MTQwOSwgMjg3NjMxMjgzOCwgMjc4ODMwNTg4NywgMjczMzg0ODE2OCwgMzE2NTkzOTMwOSwgMzA5NDcwNzE2MiwgMzA0MDIzODg1MSwgMjk4NTc3MTE4OF0pO3JldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGUgPSA0Mjk0OTY3Mjk1O3RoaXMuZ2V0Q1JDID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIH5lID4+PiAwO1xuICAgIH0sIHRoaXMudXBkYXRlQ1JDID0gZnVuY3Rpb24gKHIpIHtcbiAgICAgIGUgPSBlIDw8IDggXiB0WzI1NSAmIChlID4+PiAyNCBeIHIpXTtcbiAgICB9LCB0aGlzLnVwZGF0ZUNSQ1J1biA9IGZ1bmN0aW9uIChyLCBuKSB7XG4gICAgICBmb3IgKDsgbi0tID4gMDspIHtcbiAgICAgICAgZSA9IGUgPDwgOCBeIHRbMjU1ICYgKGUgPj4+IDI0IF4gcildO1xuICAgICAgfVxuICAgIH07XG4gIH07XG59KFV0aWwpLCBIdWZmbWFuQWxsb2NhdG9yID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgdmFyIHIgPSBmdW5jdGlvbiByKGUsIHQsIF9yKSB7XG4gICAgZm9yICh2YXIgbiA9IGUubGVuZ3RoLCBpID0gdCwgbyA9IGUubGVuZ3RoIC0gMjsgdCA+PSBfciAmJiBlW3RdICUgbiA+IGk7KSB7XG4gICAgICBvID0gdCwgdCAtPSBpIC0gdCArIDE7XG4gICAgfWZvciAodCA9IE1hdGgubWF4KF9yIC0gMSwgdCk7IG8gPiB0ICsgMTspIHtcbiAgICAgIHZhciBmID0gdCArIG8gPj4gMTtlW2ZdICUgbiA+IGkgPyBvID0gZiA6IHQgPSBmO1xuICAgIH1yZXR1cm4gbztcbiAgfSxcbiAgICAgIG4gPSBmdW5jdGlvbiBuKGUpIHtcbiAgICB2YXIgdCA9IGUubGVuZ3RoO2VbMF0gKz0gZVsxXTt2YXIgciwgbiwgaSwgbztmb3IgKHIgPSAwLCBuID0gMSwgaSA9IDI7IG4gPCB0IC0gMTsgbisrKSB7XG4gICAgICBpID49IHQgfHwgZVtyXSA8IGVbaV0gPyAobyA9IGVbcl0sIGVbcisrXSA9IG4pIDogbyA9IGVbaSsrXSwgaSA+PSB0IHx8IHIgPCBuICYmIGVbcl0gPCBlW2ldID8gKG8gKz0gZVtyXSwgZVtyKytdID0gbiArIHQpIDogbyArPSBlW2krK10sIGVbbl0gPSBvO1xuICAgIH1cbiAgfSxcbiAgICAgIGkgPSBmdW5jdGlvbiBpKGUsIHQpIHtcbiAgICB2YXIgbixcbiAgICAgICAgaSA9IGUubGVuZ3RoIC0gMjtmb3IgKG4gPSAxOyBuIDwgdCAtIDEgJiYgaSA+IDE7IG4rKykge1xuICAgICAgaSA9IHIoZSwgaSAtIDEsIDApO1xuICAgIH1yZXR1cm4gaTtcbiAgfSxcbiAgICAgIG8gPSBmdW5jdGlvbiBvKGUpIHtcbiAgICB2YXIgdCxcbiAgICAgICAgbixcbiAgICAgICAgaSxcbiAgICAgICAgbyxcbiAgICAgICAgZiA9IGUubGVuZ3RoIC0gMixcbiAgICAgICAgYSA9IGUubGVuZ3RoIC0gMTtmb3IgKHQgPSAxLCBuID0gMjsgbiA+IDA7IHQrKykge1xuICAgICAgZm9yIChpID0gZiwgZiA9IHIoZSwgaSAtIDEsIDApLCBvID0gbiAtIChpIC0gZik7IG8gPiAwOyBvLS0pIHtcbiAgICAgICAgZVthLS1dID0gdDtcbiAgICAgIH1uID0gaSAtIGYgPDwgMTtcbiAgICB9XG4gIH0sXG4gICAgICBmID0gZnVuY3Rpb24gZihlLCB0LCBuKSB7XG4gICAgdmFyIGksXG4gICAgICAgIG8sXG4gICAgICAgIGYsXG4gICAgICAgIGEsXG4gICAgICAgIHUgPSBlLmxlbmd0aCAtIDIsXG4gICAgICAgIHMgPSBlLmxlbmd0aCAtIDEsXG4gICAgICAgIGMgPSAxID09IG4gPyAyIDogMSxcbiAgICAgICAgaCA9IDEgPT0gbiA/IHQgLSAyIDogdDtmb3IgKGkgPSBjIDw8IDE7IGkgPiAwOyBjKyspIHtcbiAgICAgIGZvciAobyA9IHUsIHUgPSB1IDw9IHQgPyB1IDogcihlLCBvIC0gMSwgdCksIGYgPSAwLCBjID49IG4gPyBmID0gTWF0aC5taW4oaCwgMSA8PCBjIC0gbikgOiBjID09IG4gLSAxICYmIChmID0gMSwgZVt1XSA9PSBvICYmIHUrKyksIGEgPSBpIC0gKG8gLSB1ICsgZik7IGEgPiAwOyBhLS0pIHtcbiAgICAgICAgZVtzLS1dID0gYztcbiAgICAgIH1oIC09IGYsIGkgPSBvIC0gdSArIGYgPDwgMTtcbiAgICB9XG4gIH07cmV0dXJuIGUoeyBhbGxvY2F0ZUh1ZmZtYW5Db2RlTGVuZ3RoczogZnVuY3Rpb24gYWxsb2NhdGVIdWZmbWFuQ29kZUxlbmd0aHMoZSwgcikge1xuICAgICAgc3dpdGNoIChlLmxlbmd0aCkge2Nhc2UgMjpcbiAgICAgICAgICBlWzFdID0gMTtjYXNlIDE6XG4gICAgICAgICAgcmV0dXJuIHZvaWQgKGVbMF0gPSAxKTt9bihlKTt2YXIgYSA9IGkoZSwgcik7aWYgKGVbMF0gJSBlLmxlbmd0aCA+PSBhKSBvKGUpO2Vsc2Uge1xuICAgICAgICB2YXIgdSA9IHIgLSB0LmZscyhhIC0gMSk7ZihlLCBhLCB1KTtcbiAgICAgIH1cbiAgICB9IH0pO1xufShmcmVlemUsIFV0aWwpLCBCemlwMiA9IGZ1bmN0aW9uIChlLCB0LCByLCBuLCBpLCBvLCBmKSB7XG4gIHZhciBhID0gby5FT0YsXG4gICAgICB1ID0gZnVuY3Rpb24gdShlLCB0KSB7XG4gICAgdmFyIHIsXG4gICAgICAgIG4gPSBlW3RdO2ZvciAociA9IHQ7IHIgPiAwOyByLS0pIHtcbiAgICAgIGVbcl0gPSBlW3IgLSAxXTtcbiAgICB9cmV0dXJuIGVbMF0gPSBuLCBuO1xuICB9LFxuICAgICAgcyA9IHsgT0s6IDAsIExBU1RfQkxPQ0s6IC0xLCBOT1RfQlpJUF9EQVRBOiAtMiwgVU5FWFBFQ1RFRF9JTlBVVF9FT0Y6IC0zLCBVTkVYUEVDVEVEX09VVFBVVF9FT0Y6IC00LCBEQVRBX0VSUk9SOiAtNSwgT1VUX09GX01FTU9SWTogLTYsIE9CU09MRVRFX0lOUFVUOiAtNywgRU5EX09GX0JMT0NLOiAtOCB9LFxuICAgICAgYyA9IHt9O2Nbcy5MQVNUX0JMT0NLXSA9IFwiQmFkIGZpbGUgY2hlY2tzdW1cIiwgY1tzLk5PVF9CWklQX0RBVEFdID0gXCJOb3QgYnppcCBkYXRhXCIsIGNbcy5VTkVYUEVDVEVEX0lOUFVUX0VPRl0gPSBcIlVuZXhwZWN0ZWQgaW5wdXQgRU9GXCIsIGNbcy5VTkVYUEVDVEVEX09VVFBVVF9FT0ZdID0gXCJVbmV4cGVjdGVkIG91dHB1dCBFT0ZcIiwgY1tzLkRBVEFfRVJST1JdID0gXCJEYXRhIGVycm9yXCIsIGNbcy5PVVRfT0ZfTUVNT1JZXSA9IFwiT3V0IG9mIG1lbW9yeVwiLCBjW3MuT0JTT0xFVEVfSU5QVVRdID0gXCJPYnNvbGV0ZSAocHJlIDAuOS41KSBiemlwIGZvcm1hdCBub3Qgc3VwcG9ydGVkLlwiO3ZhciBoID0gZnVuY3Rpb24gaChlLCB0KSB7XG4gICAgdmFyIHIgPSBjW2VdIHx8IFwidW5rbm93biBlcnJvclwiO3QgJiYgKHIgKz0gXCI6IFwiICsgdCk7dmFyIG4gPSBuZXcgVHlwZUVycm9yKHIpO3Rocm93IG4uZXJyb3JDb2RlID0gZSwgbjtcbiAgfSxcbiAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICB0aGlzLndyaXRlUG9zID0gdGhpcy53cml0ZUN1cnJlbnQgPSB0aGlzLndyaXRlQ291bnQgPSAwLCB0aGlzLl9zdGFydF9idW56aXAoZSwgdCk7XG4gIH07bC5wcm90b3R5cGUuX2luaXRfYmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldF9uZXh0X2Jsb2NrKCkgPyAodGhpcy5ibG9ja0NSQyA9IG5ldyBuKCksICEwKSA6ICh0aGlzLndyaXRlQ291bnQgPSAtMSwgITEpO1xuICB9LCBsLnByb3RvdHlwZS5fc3RhcnRfYnVuemlwID0gZnVuY3Rpb24gKGUsIHIpIHtcbiAgICB2YXIgbiA9IGYubWFrZVU4QnVmZmVyKDQpOzQgPT09IGUucmVhZChuLCAwLCA0KSAmJiBcIkJaaFwiID09PSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5bMF0sIG5bMV0sIG5bMl0pIHx8IGgocy5OT1RfQlpJUF9EQVRBLCBcImJhZCBtYWdpY1wiKTt2YXIgaSA9IG5bM10gLSA0ODsoaSA8IDEgfHwgaSA+IDkpICYmIGgocy5OT1RfQlpJUF9EQVRBLCBcImxldmVsIG91dCBvZiByYW5nZVwiKSwgdGhpcy5yZWFkZXIgPSBuZXcgdChlKSwgdGhpcy5kYnVmU2l6ZSA9IDFlNSAqIGksIHRoaXMubmV4dG91dHB1dCA9IDAsIHRoaXMub3V0cHV0U3RyZWFtID0gciwgdGhpcy5zdHJlYW1DUkMgPSAwO1xuICB9LCBsLnByb3RvdHlwZS5fZ2V0X25leHRfYmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGUsXG4gICAgICAgIHQsXG4gICAgICAgIHIsXG4gICAgICAgIG4gPSB0aGlzLnJlYWRlcixcbiAgICAgICAgaSA9IG4ucmVhZEJpdHMoNDgpO2lmICgyNTc3OTU1NTAyOTEzNiA9PT0gaSkgcmV0dXJuICExOzU0MTU2NzM4MzE5MTkzICE9PSBpICYmIGgocy5OT1RfQlpJUF9EQVRBKSwgdGhpcy50YXJnZXRCbG9ja0NSQyA9IG4ucmVhZEJpdHMoMzIpLCB0aGlzLnN0cmVhbUNSQyA9ICh0aGlzLnRhcmdldEJsb2NrQ1JDIF4gKHRoaXMuc3RyZWFtQ1JDIDw8IDEgfCB0aGlzLnN0cmVhbUNSQyA+Pj4gMzEpKSA+Pj4gMCwgbi5yZWFkQml0cygxKSAmJiBoKHMuT0JTT0xFVEVfSU5QVVQpO3ZhciBvID0gbi5yZWFkQml0cygyNCk7byA+IHRoaXMuZGJ1ZlNpemUgJiYgaChzLkRBVEFfRVJST1IsIFwiaW5pdGlhbCBwb3NpdGlvbiBvdXQgb2YgYm91bmRzXCIpO3ZhciBhID0gbi5yZWFkQml0cygxNiksXG4gICAgICAgIGMgPSBmLm1ha2VVOEJ1ZmZlcigyNTYpLFxuICAgICAgICBsID0gMDtmb3IgKGUgPSAwOyBlIDwgMTY7IGUrKykge1xuICAgICAgaWYgKGEgJiAxIDw8IDE1IC0gZSkge1xuICAgICAgICB2YXIgZCA9IDE2ICogZTtmb3IgKHIgPSBuLnJlYWRCaXRzKDE2KSwgdCA9IDA7IHQgPCAxNjsgdCsrKSB7XG4gICAgICAgICAgciAmIDEgPDwgMTUgLSB0ICYmIChjW2wrK10gPSBkICsgdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9dmFyIEIgPSBuLnJlYWRCaXRzKDMpOyhCIDwgMiB8fCBCID4gNikgJiYgaChzLkRBVEFfRVJST1IpO3ZhciBwID0gbi5yZWFkQml0cygxNSk7MCA9PT0gcCAmJiBoKHMuREFUQV9FUlJPUik7dmFyIHYgPSBmLm1ha2VVOEJ1ZmZlcigyNTYpO2ZvciAoZSA9IDA7IGUgPCBCOyBlKyspIHtcbiAgICAgIHZbZV0gPSBlO1xuICAgIH12YXIgbSA9IGYubWFrZVU4QnVmZmVyKHApO2ZvciAoZSA9IDA7IGUgPCBwOyBlKyspIHtcbiAgICAgIGZvciAodCA9IDA7IG4ucmVhZEJpdHMoMSk7IHQrKykge1xuICAgICAgICB0ID49IEIgJiYgaChzLkRBVEFfRVJST1IpO1xuICAgICAgfW1bZV0gPSB1KHYsIHQpO1xuICAgIH12YXIgdyxcbiAgICAgICAgRSA9IGwgKyAyLFxuICAgICAgICBnID0gW107Zm9yICh0ID0gMDsgdCA8IEI7IHQrKykge1xuICAgICAgdmFyIF8gPSBmLm1ha2VVOEJ1ZmZlcihFKSxcbiAgICAgICAgICBiID0gZi5tYWtlVTE2QnVmZmVyKDIxKTtmb3IgKGEgPSBuLnJlYWRCaXRzKDUpLCBlID0gMDsgZSA8IEU7IGUrKykge1xuICAgICAgICBmb3IgKDsgKGEgPCAxIHx8IGEgPiAyMCkgJiYgaChzLkRBVEFfRVJST1IpLCBuLnJlYWRCaXRzKDEpOykge1xuICAgICAgICAgIG4ucmVhZEJpdHMoMSkgPyBhLS0gOiBhKys7XG4gICAgICAgIH1fW2VdID0gYTtcbiAgICAgIH12YXIgeSwgUjtmb3IgKHkgPSBSID0gX1swXSwgZSA9IDE7IGUgPCBFOyBlKyspIHtcbiAgICAgICAgX1tlXSA+IFIgPyBSID0gX1tlXSA6IF9bZV0gPCB5ICYmICh5ID0gX1tlXSk7XG4gICAgICB9dyA9IHt9LCBnLnB1c2godyksIHcucGVybXV0ZSA9IGYubWFrZVUxNkJ1ZmZlcigyNTgpLCB3LmxpbWl0ID0gZi5tYWtlVTMyQnVmZmVyKDIyKSwgdy5iYXNlID0gZi5tYWtlVTMyQnVmZmVyKDIxKSwgdy5taW5MZW4gPSB5LCB3Lm1heExlbiA9IFI7dmFyIEMgPSAwO2ZvciAoZSA9IHk7IGUgPD0gUjsgZSsrKSB7XG4gICAgICAgIGZvciAoYltlXSA9IHcubGltaXRbZV0gPSAwLCBhID0gMDsgYSA8IEU7IGErKykge1xuICAgICAgICAgIF9bYV0gPT09IGUgJiYgKHcucGVybXV0ZVtDKytdID0gYSk7XG4gICAgICAgIH1cbiAgICAgIH1mb3IgKGUgPSAwOyBlIDwgRTsgZSsrKSB7XG4gICAgICAgIGJbX1tlXV0rKztcbiAgICAgIH1mb3IgKEMgPSBhID0gMCwgZSA9IHk7IGUgPCBSOyBlKyspIHtcbiAgICAgICAgQyArPSBiW2VdLCB3LmxpbWl0W2VdID0gQyAtIDEsIEMgPDw9IDEsIGEgKz0gYltlXSwgdy5iYXNlW2UgKyAxXSA9IEMgLSBhO1xuICAgICAgfXcubGltaXRbUiArIDFdID0gTnVtYmVyLk1BWF9WQUxVRSwgdy5saW1pdFtSXSA9IEMgKyBiW1JdIC0gMSwgdy5iYXNlW3ldID0gMDtcbiAgICB9dmFyIGsgPSBmLm1ha2VVMzJCdWZmZXIoMjU2KTtmb3IgKGUgPSAwOyBlIDwgMjU2OyBlKyspIHtcbiAgICAgIHZbZV0gPSBlO1xuICAgIH12YXIgVCxcbiAgICAgICAgTyA9IDAsXG4gICAgICAgIFMgPSAwLFxuICAgICAgICBVID0gMCxcbiAgICAgICAgQSA9IHRoaXMuZGJ1ZiA9IGYubWFrZVUzMkJ1ZmZlcih0aGlzLmRidWZTaXplKTtmb3IgKEUgPSAwOzspIHtcbiAgICAgIGZvciAoRS0tIHx8IChFID0gNDksIFUgPj0gcCAmJiBoKHMuREFUQV9FUlJPUiksIHcgPSBnW21bVSsrXV0pLCBlID0gdy5taW5MZW4sIHQgPSBuLnJlYWRCaXRzKGUpOyBlID4gdy5tYXhMZW4gJiYgaChzLkRBVEFfRVJST1IpLCAhKHQgPD0gdy5saW1pdFtlXSk7IGUrKykge1xuICAgICAgICB0ID0gdCA8PCAxIHwgbi5yZWFkQml0cygxKTtcbiAgICAgIH10IC09IHcuYmFzZVtlXSwgKHQgPCAwIHx8IHQgPj0gMjU4KSAmJiBoKHMuREFUQV9FUlJPUik7dmFyIHogPSB3LnBlcm11dGVbdF07aWYgKDAgIT09IHogJiYgMSAhPT0geikge1xuICAgICAgICBpZiAoTykgZm9yIChPID0gMCwgUyArIGEgPiB0aGlzLmRidWZTaXplICYmIGgocy5EQVRBX0VSUk9SKSwgVCA9IGNbdlswXV0sIGtbVF0gKz0gYTsgYS0tOykge1xuICAgICAgICAgIEFbUysrXSA9IFQ7XG4gICAgICAgIH1pZiAoeiA+IGwpIGJyZWFrO1MgPj0gdGhpcy5kYnVmU2l6ZSAmJiBoKHMuREFUQV9FUlJPUiksIGUgPSB6IC0gMSwgVCA9IHUodiwgZSksIFQgPSBjW1RdLCBrW1RdKyssIEFbUysrXSA9IFQ7XG4gICAgICB9IGVsc2UgTyB8fCAoTyA9IDEsIGEgPSAwKSwgYSArPSAwID09PSB6ID8gTyA6IDIgKiBPLCBPIDw8PSAxO1xuICAgIH1mb3IgKChvIDwgMCB8fCBvID49IFMpICYmIGgocy5EQVRBX0VSUk9SKSwgdCA9IDAsIGUgPSAwOyBlIDwgMjU2OyBlKyspIHtcbiAgICAgIHIgPSB0ICsga1tlXSwga1tlXSA9IHQsIHQgPSByO1xuICAgIH1mb3IgKGUgPSAwOyBlIDwgUzsgZSsrKSB7XG4gICAgICBUID0gMjU1ICYgQVtlXSwgQVtrW1RdXSB8PSBlIDw8IDgsIGtbVF0rKztcbiAgICB9dmFyIE4gPSAwLFxuICAgICAgICBMID0gMCxcbiAgICAgICAgUCA9IDA7cmV0dXJuIFMgJiYgKE4gPSBBW29dLCBMID0gMjU1ICYgTiwgTiA+Pj0gOCwgUCA9IC0xKSwgdGhpcy53cml0ZVBvcyA9IE4sIHRoaXMud3JpdGVDdXJyZW50ID0gTCwgdGhpcy53cml0ZUNvdW50ID0gUywgdGhpcy53cml0ZVJ1biA9IFAsICEwO1xuICB9LCBsLnByb3RvdHlwZS5fcmVhZF9idW56aXAgPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgIHZhciByLCBuLCBpO2lmICh0aGlzLndyaXRlQ291bnQgPCAwKSByZXR1cm4gMDtmb3IgKHZhciBvID0gdGhpcy5kYnVmLCBmID0gdGhpcy53cml0ZVBvcywgYSA9IHRoaXMud3JpdGVDdXJyZW50LCB1ID0gdGhpcy53cml0ZUNvdW50LCBjID0gKHRoaXMub3V0cHV0c2l6ZSwgdGhpcy53cml0ZVJ1bik7IHU7KSB7XG4gICAgICBmb3IgKHUtLSwgbiA9IGEsIGYgPSBvW2ZdLCBhID0gMjU1ICYgZiwgZiA+Pj0gOCwgMyA9PSBjKysgPyAociA9IGEsIGkgPSBuLCBhID0gLTEpIDogKHIgPSAxLCBpID0gYSksIHRoaXMuYmxvY2tDUkMudXBkYXRlQ1JDUnVuKGksIHIpOyByLS07KSB7XG4gICAgICAgIHRoaXMub3V0cHV0U3RyZWFtLndyaXRlQnl0ZShpKSwgdGhpcy5uZXh0b3V0cHV0Kys7XG4gICAgICB9YSAhPSBuICYmIChjID0gMCk7XG4gICAgfXJldHVybiB0aGlzLndyaXRlQ291bnQgPSB1LCB0aGlzLmJsb2NrQ1JDLmdldENSQygpICE9PSB0aGlzLnRhcmdldEJsb2NrQ1JDICYmIGgocy5EQVRBX0VSUk9SLCBcIkJhZCBibG9jayBDUkMgKGdvdCBcIiArIHRoaXMuYmxvY2tDUkMuZ2V0Q1JDKCkudG9TdHJpbmcoMTYpICsgXCIgZXhwZWN0ZWQgXCIgKyB0aGlzLnRhcmdldEJsb2NrQ1JDLnRvU3RyaW5nKDE2KSArIFwiKVwiKSwgdGhpcy5uZXh0b3V0cHV0O1xuICB9LCBsLkVyciA9IHMsIGwuZGVjb2RlID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBmb3IgKHZhciBuID0gZi5jb2VyY2VJbnB1dFN0cmVhbShlKSwgaSA9IGYuY29lcmNlT3V0cHV0U3RyZWFtKHQsIHQpLCBvID0gaS5zdHJlYW0sIGEgPSBuZXcgbChuLCBvKTs7KSB7XG4gICAgICBpZiAoXCJlb2ZcIiBpbiBuICYmIG4uZW9mKCkpIGJyZWFrO2lmIChhLl9pbml0X2Jsb2NrKCkpIGEuX3JlYWRfYnVuemlwKCk7ZWxzZSB7XG4gICAgICAgIHZhciB1ID0gYS5yZWFkZXIucmVhZEJpdHMoMzIpO2lmICh1ICE9PSBhLnN0cmVhbUNSQyAmJiBoKHMuREFUQV9FUlJPUiwgXCJCYWQgc3RyZWFtIENSQyAoZ290IFwiICsgYS5zdHJlYW1DUkMudG9TdHJpbmcoMTYpICsgXCIgZXhwZWN0ZWQgXCIgKyB1LnRvU3RyaW5nKDE2KSArIFwiKVwiKSwgIShyICYmIFwiZW9mXCIgaW4gbikgfHwgbi5lb2YoKSkgYnJlYWs7YS5fc3RhcnRfYnVuemlwKG4sIG8pO1xuICAgICAgfVxuICAgIH1yZXR1cm4gaS5yZXR2YWw7XG4gIH0sIGwuZGVjb2RlQmxvY2sgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIHZhciBpID0gZi5jb2VyY2VJbnB1dFN0cmVhbShlKSxcbiAgICAgICAgbyA9IGYuY29lcmNlT3V0cHV0U3RyZWFtKHIsIHIpLFxuICAgICAgICBhID0gby5zdHJlYW0sXG4gICAgICAgIHUgPSBuZXcgbChpLCBhKTtyZXR1cm4gdS5yZWFkZXIuc2Vla0JpdCh0KSwgdS5fZ2V0X25leHRfYmxvY2soKSAmJiAodS5ibG9ja0NSQyA9IG5ldyBuKCksIHUud3JpdGVDb3BpZXMgPSAwLCB1Ll9yZWFkX2J1bnppcCgpKSwgby5yZXR2YWw7XG4gIH0sIGwudGFibGUgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIHZhciBuID0gbmV3IG8oKTtuLmRlbGVnYXRlID0gZi5jb2VyY2VJbnB1dFN0cmVhbShlKSwgbi5wb3MgPSAwLCBuLnJlYWRCeXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zKyssIHRoaXMuZGVsZWdhdGUucmVhZEJ5dGUoKTtcbiAgICB9LCBuLnRlbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3M7XG4gICAgfSwgbi5kZWxlZ2F0ZS5lb2YgJiYgKG4uZW9mID0gbi5kZWxlZ2F0ZS5lb2YuYmluZChuLmRlbGVnYXRlKSk7dmFyIGkgPSBuZXcgbygpO2kucG9zID0gMCwgaS53cml0ZUJ5dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnBvcysrO1xuICAgIH07Zm9yICh2YXIgYSA9IG5ldyBsKG4sIGkpLCB1ID0gYS5kYnVmU2l6ZTs7KSB7XG4gICAgICBpZiAoXCJlb2ZcIiBpbiBuICYmIG4uZW9mKCkpIGJyZWFrO3ZhciBzID0gYS5yZWFkZXIudGVsbEJpdCgpO2lmIChhLl9pbml0X2Jsb2NrKCkpIHtcbiAgICAgICAgdmFyIGMgPSBpLnBvczthLl9yZWFkX2J1bnppcCgpLCB0KHMsIGkucG9zIC0gYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhLnJlYWRlci5yZWFkQml0cygzMik7aWYgKCEociAmJiBcImVvZlwiIGluIG4pIHx8IG4uZW9mKCkpIGJyZWFrO2EuX3N0YXJ0X2J1bnppcChuLCBpKSwgY29uc29sZS5hc3NlcnQoYS5kYnVmU2l6ZSA9PT0gdSwgXCJzaG91bGRuJ3QgY2hhbmdlIGJsb2NrIHNpemUgd2l0aGluIG11bHRpc3RyZWFtIGZpbGVcIik7XG4gICAgICB9XG4gICAgfVxuICB9O3ZhciBkID0gZnVuY3Rpb24gZChlLCB0KSB7XG4gICAgdmFyIHIsXG4gICAgICAgIG4gPSBbXTtmb3IgKHIgPSAwOyByIDwgdDsgcisrKSB7XG4gICAgICBuW3JdID0gZVtyXSA8PCA5IHwgcjtcbiAgICB9bi5zb3J0KGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICByZXR1cm4gZSAtIHQ7XG4gICAgfSk7dmFyIG8gPSBuLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIGUgPj4+IDk7XG4gICAgfSk7Zm9yIChpLmFsbG9jYXRlSHVmZm1hbkNvZGVMZW5ndGhzKG8sIDIwKSwgdGhpcy5jb2RlTGVuZ3RocyA9IGYubWFrZVU4QnVmZmVyKHQpLCByID0gMDsgciA8IHQ7IHIrKykge1xuICAgICAgdmFyIGEgPSA1MTEgJiBuW3JdO3RoaXMuY29kZUxlbmd0aHNbYV0gPSBvW3JdO1xuICAgIH1cbiAgfTtkLnByb3RvdHlwZS5jb21wdXRlQ2Fub25pY2FsID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBlLFxuICAgICAgICB0ID0gdGhpcy5jb2RlTGVuZ3Rocy5sZW5ndGgsXG4gICAgICAgIHIgPSBbXTtmb3IgKGUgPSAwOyBlIDwgdDsgZSsrKSB7XG4gICAgICByW2VdID0gdGhpcy5jb2RlTGVuZ3Roc1tlXSA8PCA5IHwgZTtcbiAgICB9ci5zb3J0KGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICByZXR1cm4gZSAtIHQ7XG4gICAgfSksIHRoaXMuY29kZSA9IGYubWFrZVUzMkJ1ZmZlcih0KTt2YXIgbiA9IDAsXG4gICAgICAgIGkgPSAwO2ZvciAoZSA9IDA7IGUgPCB0OyBlKyspIHtcbiAgICAgIHZhciBvID0gcltlXSA+Pj4gOSxcbiAgICAgICAgICBhID0gNTExICYgcltlXTtjb25zb2xlLmFzc2VydChpIDw9IG8pLCBuIDw8PSBvIC0gaSwgdGhpcy5jb2RlW2FdID0gbisrLCBpID0gbztcbiAgICB9XG4gIH0sIGQucHJvdG90eXBlLmNvc3QgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIHZhciBuLFxuICAgICAgICBpID0gMDtmb3IgKG4gPSAwOyBuIDwgcjsgbisrKSB7XG4gICAgICBpICs9IHRoaXMuY29kZUxlbmd0aHNbZVt0ICsgbl1dO1xuICAgIH1yZXR1cm4gaTtcbiAgfSwgZC5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIHQsXG4gICAgICAgIHIgPSB0aGlzLmNvZGVMZW5ndGhzWzBdO2ZvciAoZS53cml0ZUJpdHMoNSwgciksIHQgPSAwOyB0IDwgdGhpcy5jb2RlTGVuZ3Rocy5sZW5ndGg7IHQrKykge1xuICAgICAgdmFyIG4sXG4gICAgICAgICAgaSxcbiAgICAgICAgICBvID0gdGhpcy5jb2RlTGVuZ3Roc1t0XTtmb3IgKGNvbnNvbGUuYXNzZXJ0KG8gPiAwICYmIG8gPD0gMjApLCByIDwgbyA/IChuID0gMiwgaSA9IG8gLSByKSA6IChuID0gMywgaSA9IHIgLSBvKTsgaS0tID4gMDspIHtcbiAgICAgICAgZS53cml0ZUJpdHMoMiwgbik7XG4gICAgICB9ZS53cml0ZUJpdCgwKSwgciA9IG87XG4gICAgfVxuICB9LCBkLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgIGUud3JpdGVCaXRzKHRoaXMuY29kZUxlbmd0aHNbdF0sIHRoaXMuY29kZVt0XSk7XG4gIH07dmFyIEIgPSBmdW5jdGlvbiBCKGUsIHQsIHIsIG4pIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbyA9IC0xLCBmID0gMDsgaSA8IHIgJiYgISg0ID09PSBmICYmICh0W2krK10gPSAwLCBpID49IHIpKTspIHtcbiAgICAgIHZhciB1ID0gZS5yZWFkQnl0ZSgpO2lmICh1ID09PSBhKSBicmVhaztpZiAobi51cGRhdGVDUkModSksIHUgIT09IG8pIG8gPSB1LCBmID0gMTtlbHNlIGlmICgrK2YgPiA0KSB7XG4gICAgICAgIGlmIChmIDwgMjU2KSB7XG4gICAgICAgICAgdFtpIC0gMV0rKztjb250aW51ZTtcbiAgICAgICAgfWYgPSAxO1xuICAgICAgfXRbaSsrXSA9IHU7XG4gICAgfXJldHVybiBpO1xuICB9LFxuICAgICAgcCA9IGZ1bmN0aW9uIHAoZSwgdCwgcikge1xuICAgIHZhciBuLCBpLCBvO2ZvciAobiA9IDAsIG8gPSAwOyBuIDwgci5sZW5ndGg7IG4gKz0gNTApIHtcbiAgICAgIHZhciBmID0gTWF0aC5taW4oNTAsIHIubGVuZ3RoIC0gbiksXG4gICAgICAgICAgYSA9IDAsXG4gICAgICAgICAgdSA9IHRbMF0uY29zdChyLCBuLCBmKTtmb3IgKGkgPSAxOyBpIDwgdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcyA9IHRbaV0uY29zdChyLCBuLCBmKTtzIDwgdSAmJiAoYSA9IGksIHUgPSBzKTtcbiAgICAgIH1lW28rK10gPSBhO1xuICAgIH1cbiAgfSxcbiAgICAgIHYgPSBmdW5jdGlvbiB2KGUsIHQsIHIsIG4sIGkpIHtcbiAgICBmb3IgKHZhciBvLCBmLCBhLCB1ID0gW107IGUubGVuZ3RoIDwgdDspIHtcbiAgICAgIGZvciAocChuLCBlLCByKSwgbyA9IDA7IG8gPCBlLmxlbmd0aDsgbysrKSB7XG4gICAgICAgIHVbb10gPSAwO1xuICAgICAgfWZvciAobyA9IDA7IG8gPCBuLmxlbmd0aDsgbysrKSB7XG4gICAgICAgIHVbbltvXV0rKztcbiAgICAgIH12YXIgcyA9IHUuaW5kZXhPZihNYXRoLm1heC5hcHBseShNYXRoLCB1KSksXG4gICAgICAgICAgYyA9IFtdO2ZvciAobyA9IDAsIGYgPSAwOyBvIDwgbi5sZW5ndGg7IG8rKykge1xuICAgICAgICBpZiAobltvXSA9PT0gcykge1xuICAgICAgICAgIHZhciBoID0gNTAgKiBvLFxuICAgICAgICAgICAgICBsID0gTWF0aC5taW4oaCArIDUwLCByLmxlbmd0aCk7Yy5wdXNoKHsgaW5kZXg6IG8sIGNvc3Q6IGVbc10uY29zdChyLCBoLCBsIC0gaCkgfSk7XG4gICAgICAgIH1cbiAgICAgIH1mb3IgKGMuc29ydChmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICByZXR1cm4gZS5jb3N0IC0gdC5jb3N0O1xuICAgICAgfSksIG8gPSBjLmxlbmd0aCA+Pj4gMTsgbyA8IGMubGVuZ3RoOyBvKyspIHtcbiAgICAgICAgbltjW29dLmluZGV4XSA9IGUubGVuZ3RoO1xuICAgICAgfWUucHVzaChudWxsKTt2YXIgQixcbiAgICAgICAgICB2ID0gW107Zm9yIChvID0gMDsgbyA8IGUubGVuZ3RoOyBvKyspIHtcbiAgICAgICAgZm9yIChCID0gdltvXSA9IFtdLCBmID0gMDsgZiA8IGk7IGYrKykge1xuICAgICAgICAgIEJbZl0gPSAwO1xuICAgICAgICB9XG4gICAgICB9Zm9yIChvID0gMCwgZiA9IDA7IG8gPCByLmxlbmd0aDspIHtcbiAgICAgICAgZm9yIChCID0gdltuW2YrK11dLCBhID0gMDsgYSA8IDUwICYmIG8gPCByLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgQltyW28rK11dKys7XG4gICAgICAgIH1cbiAgICAgIH1mb3IgKG8gPSAwOyBvIDwgZS5sZW5ndGg7IG8rKykge1xuICAgICAgICBlW29dID0gbmV3IGQodltvXSwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAgICAgbSA9IGZ1bmN0aW9uIG0oZSwgdCwgbikge1xuICAgIHZhciBpLFxuICAgICAgICBvLFxuICAgICAgICBhLFxuICAgICAgICBzLFxuICAgICAgICBjID0gZi5tYWtlVThCdWZmZXIodCksXG4gICAgICAgIGggPSByLmJ3dHJhbnNmb3JtMihlLCBjLCB0LCAyNTYpO24ud3JpdGVCaXQoMCksIG4ud3JpdGVCaXRzKDI0LCBoKTt2YXIgbCA9IFtdLFxuICAgICAgICBCID0gW107Zm9yIChvID0gMDsgbyA8IHQ7IG8rKykge1xuICAgICAgaSA9IGVbb10sIGxbaV0gPSAhMCwgQltpID4+PiA0XSA9ICEwO1xuICAgIH1mb3IgKG8gPSAwOyBvIDwgMTY7IG8rKykge1xuICAgICAgbi53cml0ZUJpdCghIUJbb10pO1xuICAgIH1mb3IgKG8gPSAwOyBvIDwgMTY7IG8rKykge1xuICAgICAgaWYgKEJbb10pIGZvciAoYSA9IDA7IGEgPCAxNjsgYSsrKSB7XG4gICAgICAgIG4ud3JpdGVCaXQoISFsW28gPDwgNCB8IGFdKTtcbiAgICAgIH1cbiAgICB9dmFyIG0gPSAwO2ZvciAobyA9IDA7IG8gPCAyNTY7IG8rKykge1xuICAgICAgbFtvXSAmJiBtKys7XG4gICAgfXZhciB3ID0gZi5tYWtlVTE2QnVmZmVyKHQgKyAxKSxcbiAgICAgICAgRSA9IG0gKyAxLFxuICAgICAgICBnID0gW107Zm9yIChvID0gMDsgbyA8PSBFOyBvKyspIHtcbiAgICAgIGdbb10gPSAwO1xuICAgIH12YXIgXyA9IGYubWFrZVU4QnVmZmVyKG0pO2ZvciAobyA9IDAsIGEgPSAwOyBvIDwgMjU2OyBvKyspIHtcbiAgICAgIGxbb10gJiYgKF9bYSsrXSA9IG8pO1xuICAgIH1sID0gbnVsbCwgQiA9IG51bGw7dmFyIGIgPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgUiA9IGZ1bmN0aW9uIFIoZSkge1xuICAgICAgd1tiKytdID0gZSwgZ1tlXSsrO1xuICAgIH0sXG4gICAgICAgIEMgPSBmdW5jdGlvbiBDKCkge1xuICAgICAgZm9yICg7IDAgIT09IHk7KSB7XG4gICAgICAgIDEgJiB5ID8gKFIoMCksIHkgLT0gMSkgOiAoUigxKSwgeSAtPSAyKSwgeSA+Pj49IDE7XG4gICAgICB9XG4gICAgfTtmb3IgKG8gPSAwOyBvIDwgYy5sZW5ndGg7IG8rKykge1xuICAgICAgZm9yIChpID0gY1tvXSwgYSA9IDA7IGEgPCBtICYmIF9bYV0gIT09IGk7IGErKykge31jb25zb2xlLmFzc2VydChhICE9PSBtKSwgdShfLCBhKSwgMCA9PT0gYSA/IHkrKyA6IChDKCksIFIoYSArIDEpLCB5ID0gMCk7XG4gICAgfUMoKSwgUihFKSwgdyA9IHcuc3ViYXJyYXkoMCwgYik7dmFyIGssXG4gICAgICAgIFQgPSBbXTtmb3IgKGsgPSBiID49IDI0MDAgPyA2IDogYiA+PSAxMjAwID8gNSA6IGIgPj0gNjAwID8gNCA6IGIgPj0gMjAwID8gMyA6IDIsIFQucHVzaChuZXcgZChnLCBFICsgMSkpLCBvID0gMDsgbyA8PSBFOyBvKyspIHtcbiAgICAgIGdbb10gPSAxO1xuICAgIH1ULnB1c2gobmV3IGQoZywgRSArIDEpKSwgZyA9IG51bGw7dmFyIE8gPSBmLm1ha2VVOEJ1ZmZlcihNYXRoLmNlaWwoYiAvIDUwKSk7Zm9yICh2KFQsIGssIHcsIE8sIEUgKyAxKSwgcChPLCBULCB3KSwgY29uc29sZS5hc3NlcnQoVC5sZW5ndGggPj0gMiAmJiBULmxlbmd0aCA8PSA2KSwgbi53cml0ZUJpdHMoMywgVC5sZW5ndGgpLCBuLndyaXRlQml0cygxNSwgTy5sZW5ndGgpLCBvID0gMDsgbyA8IFQubGVuZ3RoOyBvKyspIHtcbiAgICAgIF9bb10gPSBvO1xuICAgIH1mb3IgKG8gPSAwOyBvIDwgTy5sZW5ndGg7IG8rKykge1xuICAgICAgdmFyIFMgPSBPW29dO2ZvciAoYSA9IDA7IGEgPCBULmxlbmd0aCAmJiBfW2FdICE9PSBTOyBhKyspIHt9Zm9yIChjb25zb2xlLmFzc2VydChhIDwgVC5sZW5ndGgpLCB1KF8sIGEpOyBhID4gMDsgYS0tKSB7XG4gICAgICAgIG4ud3JpdGVCaXQoMSk7XG4gICAgICB9bi53cml0ZUJpdCgwKTtcbiAgICB9Zm9yIChvID0gMDsgbyA8IFQubGVuZ3RoOyBvKyspIHtcbiAgICAgIFRbb10uZW1pdChuKSwgVFtvXS5jb21wdXRlQ2Fub25pY2FsKCk7XG4gICAgfWZvciAobyA9IDAsIHMgPSAwOyBvIDwgYjspIHtcbiAgICAgIHZhciBVID0gVFtPW3MrK11dO2ZvciAoYSA9IDA7IGEgPCA1MCAmJiBvIDwgYjsgYSsrKSB7XG4gICAgICAgIFUuZW5jb2RlKG4sIHdbbysrXSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAgICAgdyA9ICgwLCBfY3JlYXRlMi5kZWZhdWx0KShudWxsKTtyZXR1cm4gdy5jb21wcmVzc0ZpbGUgPSBmdW5jdGlvbiAoZSwgciwgaSkge1xuICAgIGUgPSBmLmNvZXJjZUlucHV0U3RyZWFtKGUpO3ZhciBvID0gZi5jb2VyY2VPdXRwdXRTdHJlYW0ociwgcik7ciA9IG5ldyB0KG8uc3RyZWFtKTt2YXIgYSA9IDk7aWYgKFwibnVtYmVyXCIgPT0gdHlwZW9mIGkgJiYgKGEgPSBpKSwgYSA8IDEgfHwgYSA+IDkpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYmxvY2sgc2l6ZSBtdWx0aXBsaWVyXCIpO3ZhciB1ID0gMWU1ICogYTt1IC09IDE5LCByLndyaXRlQnl0ZShcIkJcIi5jaGFyQ29kZUF0KDApKSwgci53cml0ZUJ5dGUoXCJaXCIuY2hhckNvZGVBdCgwKSksIHIud3JpdGVCeXRlKFwiaFwiLmNoYXJDb2RlQXQoMCkpLCByLndyaXRlQnl0ZShcIjBcIi5jaGFyQ29kZUF0KDApICsgYSk7dmFyIHMsXG4gICAgICAgIGMgPSBmLm1ha2VVOEJ1ZmZlcih1KSxcbiAgICAgICAgaCA9IDA7ZG8ge1xuICAgICAgdmFyIGwgPSBuZXcgbigpO3MgPSBCKGUsIGMsIHUsIGwpLCBzID4gMCAmJiAoaCA9ICgoaCA8PCAxIHwgaCA+Pj4gMzEpIF4gbC5nZXRDUkMoKSkgPj4+IDAsIHIud3JpdGVCaXRzKDQ4LCA1NDE1NjczODMxOTE5MyksIHIud3JpdGVCaXRzKDMyLCBsLmdldENSQygpKSwgbShjLCBzLCByKSk7XG4gICAgfSB3aGlsZSAocyA9PT0gdSk7cmV0dXJuIHIud3JpdGVCaXRzKDQ4LCAyNTc3OTU1NTAyOTEzNiksIHIud3JpdGVCaXRzKDMyLCBoKSwgci5mbHVzaCgpLCBvLnJldHZhbDtcbiAgfSwgdy5kZWNvbXByZXNzRmlsZSA9IGwuZGVjb2RlLCB3LmRlY29tcHJlc3NCbG9jayA9IGwuZGVjb2RlQmxvY2ssIHcudGFibGUgPSBsLnRhYmxlLCB3O1xufSgwLCBCaXRTdHJlYW0sIEJXVCwgQ1JDMzIsIEh1ZmZtYW5BbGxvY2F0b3IsIFN0cmVhbSwgVXRpbCksIG1vZHVsZS5leHBvcnRzID0gQnppcDI7XG5cbn0pLmNhbGwodGhpcyxfZGVyZXFfKCdfcHJvY2VzcycpLF9kZXJlcV8oXCJidWZmZXJcIikuQnVmZmVyKVxufSx7XCJfcHJvY2Vzc1wiOjMxNyxcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvY3JlYXRlXCI6MjUsXCJiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2ZyZWV6ZVwiOjI4LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiOjQxLFwiYnVmZmVyXCI6NDd9XSwzMjQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZW51bXMgPSBfZGVyZXFfKFwiLi4vZW51bXNcIik7XG5cbnZhciBfZW51bXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW51bXMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbmZpZ1xuICAgKiBAcHJvcGVydHkge0ludGVnZXJ9IHByZWZlcl9oYXNoX2FsZ29yaXRobSBEZWZhdWx0IGhhc2ggYWxnb3JpdGhtIHtAbGluayBtb2R1bGU6ZW51bXMuaGFzaH1cbiAgICovXG4gIHByZWZlcl9oYXNoX2FsZ29yaXRobTogX2VudW1zMi5kZWZhdWx0Lmhhc2guc2hhMjU2LFxuICAvKipcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb25maWdcbiAgICogQHByb3BlcnR5IHtJbnRlZ2VyfSBlbmNyeXB0aW9uX2NpcGhlciBEZWZhdWx0IGVuY3J5cHRpb24gY2lwaGVyIHtAbGluayBtb2R1bGU6ZW51bXMuc3ltbWV0cmljfVxuICAgKi9cbiAgZW5jcnlwdGlvbl9jaXBoZXI6IF9lbnVtczIuZGVmYXVsdC5zeW1tZXRyaWMuYWVzMjU2LFxuICAvKipcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb25maWdcbiAgICogQHByb3BlcnR5IHtJbnRlZ2VyfSBjb21wcmVzc2lvbiBEZWZhdWx0IGNvbXByZXNzaW9uIGFsZ29yaXRobSB7QGxpbmsgbW9kdWxlOmVudW1zLmNvbXByZXNzaW9ufVxuICAgKi9cbiAgY29tcHJlc3Npb246IF9lbnVtczIuZGVmYXVsdC5jb21wcmVzc2lvbi51bmNvbXByZXNzZWQsXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbmZpZ1xuICAgKiBAcHJvcGVydHkge0ludGVnZXJ9IGRlZmxhdGVfbGV2ZWwgRGVmYXVsdCB6aXAvemxpYiBjb21wcmVzc2lvbiBsZXZlbCwgYmV0d2VlbiAxIGFuZCA5XG4gICAqL1xuICBkZWZsYXRlX2xldmVsOiA2LFxuXG4gIC8qKlxuICAgKiBVc2UgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQWRkaXRpb25hbCBEYXRhIChBRUFEKSBwcm90ZWN0aW9uIGZvciBzeW1tZXRyaWMgZW5jcnlwdGlvbi5cbiAgICogKipOT1QgSU5URVJPUEVSQUJMRSBXSVRIIE9USEVSIE9QRU5QR1AgSU1QTEVNRU5UQVRJT05TKipcbiAgICogKipGVVRVUkUgT1BFTlBHUC5KUyBWRVJTSU9OUyBNQVkgQlJFQUsgQ09NUEFUSUJJTElUWSBXSEVOIFVTSU5HIFRISVMgT1BUSU9OKipcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb25maWdcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBhZWFkX3Byb3RlY3RcbiAgICovXG4gIGFlYWRfcHJvdGVjdDogZmFsc2UsXG4gIC8qKlxuICAgKiBVc2UgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQWRkaXRpb25hbCBEYXRhIChBRUFEKSBwcm90ZWN0aW9uIGZvciBzeW1tZXRyaWMgZW5jcnlwdGlvbi5cbiAgICogMCBtZWFucyB3ZSBpbXBsZW1lbnQgYSB2YXJpYW50IG9mIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtZm9yZC1vcGVucGdwLWZvcm1hdC0wMHx0aGlzIElFVEYgZHJhZnR9LlxuICAgKiA0IG1lYW5zIHdlIGltcGxlbWVudCB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtb3BlbnBncC1yZmM0ODgwYmlzLTA0fFJGQzQ4ODBiaXMtMDR9LlxuICAgKiBOb3RlIHRoYXQgdGhpcyBkZXRlcm1pbmVzIGhvdyBBRUFEIHBhY2tldHMgYXJlIHBhcnNlZCBldmVuIHdoZW4gYWVhZF9wcm90ZWN0IGlzIHNldCB0byBmYWxzZVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbmZpZ1xuICAgKiBAcHJvcGVydHkge0ludGVnZXJ9IGFlYWRfcHJvdGVjdF92ZXJzaW9uXG4gICAqL1xuICBhZWFkX3Byb3RlY3RfdmVyc2lvbjogNCxcbiAgLyoqXG4gICAqIERlZmF1bHQgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQWRkaXRpb25hbCBEYXRhIChBRUFEKSBlbmNyeXB0aW9uIG1vZGVcbiAgICogT25seSBoYXMgYW4gZWZmZWN0IHdoZW4gYWVhZF9wcm90ZWN0IGlzIHNldCB0byB0cnVlLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbmZpZ1xuICAgKiBAcHJvcGVydHkge0ludGVnZXJ9IGFlYWRfbW9kZSBEZWZhdWx0IEFFQUQgbW9kZSB7QGxpbmsgbW9kdWxlOmVudW1zLmFlYWR9XG4gICAqL1xuICBhZWFkX21vZGU6IF9lbnVtczIuZGVmYXVsdC5hZWFkLmVheCxcbiAgLyoqXG4gICAqIENodW5rIFNpemUgQnl0ZSBmb3IgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQWRkaXRpb25hbCBEYXRhIChBRUFEKSBtb2RlXG4gICAqIE9ubHkgaGFzIGFuIGVmZmVjdCB3aGVuIGFlYWRfcHJvdGVjdCBpcyBzZXQgdG8gdHJ1ZS5cbiAgICogTXVzdCBiZSBhbiBpbnRlZ2VyIHZhbHVlIGZyb20gMCB0byA1Ni5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb25maWdcbiAgICogQHByb3BlcnR5IHtJbnRlZ2VyfSBhZWFkX2NodW5rX3NpemVfYnl0ZVxuICAgKi9cbiAgYWVhZF9jaHVua19zaXplX2J5dGU6IDEyLFxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tMy43LjEuM3xSRkM0ODgwIDMuNy4xLjN9OlxuICAgKiBJdGVyYXRpb24gQ291bnQgQnl0ZSBmb3IgUzJLIChTdHJpbmcgdG8gS2V5KVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbmZpZ1xuICAgKiBAcHJvcGVydHkge0ludGVnZXJ9IHMya19pdGVyYXRpb25fY291bnRfYnl0ZVxuICAgKi9cbiAgczJrX2l0ZXJhdGlvbl9jb3VudF9ieXRlOiA5NixcbiAgLyoqIFVzZSBpbnRlZ3JpdHkgcHJvdGVjdGlvbiBmb3Igc3ltbWV0cmljIGVuY3J5cHRpb25cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb25maWdcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBpbnRlZ3JpdHlfcHJvdGVjdFxuICAgKi9cbiAgaW50ZWdyaXR5X3Byb3RlY3Q6IHRydWUsXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbmZpZ1xuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGlnbm9yZV9tZGNfZXJyb3IgRmFpbCBvbiBkZWNyeXB0IGlmIG1lc3NhZ2UgaXMgbm90IGludGVncml0eSBwcm90ZWN0ZWRcbiAgICovXG4gIGlnbm9yZV9tZGNfZXJyb3I6IGZhbHNlLFxuICAvKipcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb25maWdcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjaGVja3N1bV9yZXF1aXJlZCBEbyBub3QgdGhyb3cgZXJyb3Igd2hlbiBhcm1vciBpcyBtaXNzaW5nIGEgY2hlY2tzdW1cbiAgICovXG4gIGNoZWNrc3VtX3JlcXVpcmVkOiBmYWxzZSxcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29uZmlnXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcnNhX2JsaW5kaW5nXG4gICAqL1xuICByc2FfYmxpbmRpbmc6IHRydWUsXG4gIC8qKlxuICAgKiBXb3JrLWFyb3VuZCBmb3IgcmFyZSBHUEcgZGVjcnlwdGlvbiBidWcgd2hlbiBlbmNyeXB0aW5nIHdpdGggbXVsdGlwbGUgcGFzc3dvcmRzLlxuICAgKiAqKlNsb3dlciBhbmQgc2xpZ2h0bHkgbGVzcyBzZWN1cmUqKlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbmZpZ1xuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IHBhc3N3b3JkX2NvbGxpc2lvbl9jaGVja1xuICAgKi9cbiAgcGFzc3dvcmRfY29sbGlzaW9uX2NoZWNrOiBmYWxzZSxcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29uZmlnXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcmV2b2NhdGlvbnNfZXhwaXJlIElmIHRydWUsIGV4cGlyZWQgcmV2b2NhdGlvbiBzaWduYXR1cmVzIGFyZSBpZ25vcmVkXG4gICAqL1xuICByZXZvY2F0aW9uc19leHBpcmU6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbmZpZ1xuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IHVzZV9uYXRpdmUgVXNlIG5hdGl2ZSBOb2RlLmpzIGNyeXB0by96bGliIGFuZCBXZWJDcnlwdG8gQVBJcyB3aGVuIGF2YWlsYWJsZVxuICAgKi9cbiAgdXNlX25hdGl2ZTogdHJ1ZSxcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29uZmlnXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gVXNlIHRyYW5zZmVyYWJsZSBvYmplY3RzIGJldHdlZW4gdGhlIFdlYiBXb3JrZXIgYW5kIG1haW4gdGhyZWFkXG4gICAqL1xuICB6ZXJvX2NvcHk6IGZhbHNlLFxuICAvKipcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb25maWdcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBkZWJ1ZyBJZiBlbmFibGVkLCBkZWJ1ZyBtZXNzYWdlcyB3aWxsIGJlIHByaW50ZWRcbiAgICovXG4gIGRlYnVnOiBmYWxzZSxcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29uZmlnXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gdG9sZXJhbnQgSWdub3JlIHVuc3VwcG9ydGVkL3VucmVjb2duaXphYmxlIHBhY2tldHMgaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvclxuICAgKi9cbiAgdG9sZXJhbnQ6IHRydWUsXG5cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29uZmlnXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gc2hvd192ZXJzaW9uIFdoZXRoZXIgdG8gaW5jbHVkZSB7QGxpbmsgbW9kdWxlOmNvbmZpZy9jb25maWcudmVyc2lvbnN0cmluZ30gaW4gYXJtb3JlZCBtZXNzYWdlc1xuICAgKi9cbiAgc2hvd192ZXJzaW9uOiB0cnVlLFxuICAvKipcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb25maWdcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBzaG93X2NvbW1lbnQgV2hldGhlciB0byBpbmNsdWRlIHtAbGluayBtb2R1bGU6Y29uZmlnL2NvbmZpZy5jb21tZW50c3RyaW5nfSBpbiBhcm1vcmVkIG1lc3NhZ2VzXG4gICAqL1xuICBzaG93X2NvbW1lbnQ6IHRydWUsXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbmZpZ1xuICAgKiBAcHJvcGVydHkge1N0cmluZ30gdmVyc2lvbnN0cmluZyBBIHZlcnNpb24gc3RyaW5nIHRvIGJlIGluY2x1ZGVkIGluIGFybW9yZWQgbWVzc2FnZXNcbiAgICovXG4gIHZlcnNpb25zdHJpbmc6IFwiT3BlblBHUC5qcyB2My4wLjEzXCIsXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbmZpZ1xuICAgKiBAcHJvcGVydHkge1N0cmluZ30gY29tbWVudHN0cmluZyBBIGNvbW1lbnQgc3RyaW5nIHRvIGJlIGluY2x1ZGVkIGluIGFybW9yZWQgbWVzc2FnZXNcbiAgICovXG4gIGNvbW1lbnRzdHJpbmc6IFwiaHR0cHM6Ly9vcGVucGdwanMub3JnXCIsXG5cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29uZmlnXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBrZXlzZXJ2ZXJcbiAgICovXG4gIGtleXNlcnZlcjogXCJodHRwczovL2tleXNlcnZlci51YnVudHUuY29tXCIsXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbmZpZ1xuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbm9kZV9zdG9yZVxuICAgKi9cbiAgbm9kZV9zdG9yZTogXCIuL29wZW5wZ3Auc3RvcmVcIixcbiAgLyoqXG4gICAqIE1heCB1c2VyaWQgc3RyaW5nIGxlbmd0aCAodXNlZCBmb3IgcGFyc2luZylcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb25maWdcbiAgICogQHByb3BlcnR5IHtJbnRlZ2VyfSBtYXhfdXNlcmlkX2xlbmd0aFxuICAgKi9cbiAgbWF4X3VzZXJpZF9sZW5ndGg6IDEwMjQgKiA1XG59OyAvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEdsb2JhbCBjb25maWd1cmF0aW9uIHZhbHVlcy5cbiAqIEByZXF1aXJlcyBlbnVtc1xuICovXG5cbn0se1wiLi4vZW51bXNcIjozNTl9XSwzMjU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NvbmZpZyA9IF9kZXJlcV8oJy4vY29uZmlnLmpzJyk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnZGVmYXVsdCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbmZpZykuZGVmYXVsdDtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbn0se1wiLi9jb25maWcuanNcIjozMjR9XSwzMjY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NpcGhlciA9IF9kZXJlcV8oJy4vY2lwaGVyJyk7XG5cbnZhciBfY2lwaGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NpcGhlcik7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vLyBPcGVuUEdQLmpzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBEZWNlbnRyYWxcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgSW1wbGVtZW50YXRpb24gb2YgUkZDIDMzOTQgQUVTIEtleSBXcmFwICYgS2V5IFVud3JhcCBmdW5jaW9uc1xuICogQHNlZSBtb2R1bGU6Y3J5cHRvL3B1YmxpY19rZXkvZWxsaXB0aWMvZWNkaFxuICogQHJlcXVpcmVzIGNyeXB0by9jaXBoZXJcbiAqIEByZXF1aXJlcyB1dGlsXG4gKiBAbW9kdWxlIGNyeXB0by9hZXNfa3dcbiAqL1xuXG5mdW5jdGlvbiB3cmFwKGtleSwgZGF0YSkge1xuICB2YXIgYWVzID0gbmV3IF9jaXBoZXIyLmRlZmF1bHRbXCJhZXNcIiArIGtleS5sZW5ndGggKiA4XShrZXkpO1xuICB2YXIgSVYgPSBuZXcgVWludDMyQXJyYXkoWzB4QTZBNkE2QTYsIDB4QTZBNkE2QTZdKTtcbiAgdmFyIFAgPSB1bnBhY2soZGF0YSk7XG4gIHZhciBBID0gSVY7XG4gIHZhciBSID0gUDtcbiAgdmFyIG4gPSBQLmxlbmd0aCAvIDI7XG4gIHZhciB0ID0gbmV3IFVpbnQzMkFycmF5KFswLCAwXSk7XG4gIHZhciBCID0gbmV3IFVpbnQzMkFycmF5KDQpO1xuICBmb3IgKHZhciBqID0gMDsgaiA8PSA1OyArK2opIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdFsxXSA9IG4gKiBqICsgKDEgKyBpKTtcbiAgICAgIC8vIEIgPSBBXG4gICAgICBCWzBdID0gQVswXTtcbiAgICAgIEJbMV0gPSBBWzFdO1xuICAgICAgLy8gQiA9IEEgfHwgUltpXVxuICAgICAgQlsyXSA9IFJbMiAqIGldO1xuICAgICAgQlszXSA9IFJbMiAqIGkgKyAxXTtcbiAgICAgIC8vIEIgPSBBRVMoSywgQilcbiAgICAgIEIgPSB1bnBhY2soYWVzLmVuY3J5cHQocGFjayhCKSkpO1xuICAgICAgLy8gQSA9IE1TQig2NCwgQikgXiB0XG4gICAgICBBID0gQi5zdWJhcnJheSgwLCAyKTtcbiAgICAgIEFbMF0gXj0gdFswXTtcbiAgICAgIEFbMV0gXj0gdFsxXTtcbiAgICAgIC8vIFJbaV0gPSBMU0IoNjQsIEIpXG4gICAgICBSWzIgKiBpXSA9IEJbMl07XG4gICAgICBSWzIgKiBpICsgMV0gPSBCWzNdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFjayhBLCBSKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwKGtleSwgZGF0YSkge1xuICB2YXIgYWVzID0gbmV3IF9jaXBoZXIyLmRlZmF1bHRbXCJhZXNcIiArIGtleS5sZW5ndGggKiA4XShrZXkpO1xuICB2YXIgSVYgPSBuZXcgVWludDMyQXJyYXkoWzB4QTZBNkE2QTYsIDB4QTZBNkE2QTZdKTtcbiAgdmFyIEMgPSB1bnBhY2soZGF0YSk7XG4gIHZhciBBID0gQy5zdWJhcnJheSgwLCAyKTtcbiAgdmFyIFIgPSBDLnN1YmFycmF5KDIpO1xuICB2YXIgbiA9IEMubGVuZ3RoIC8gMiAtIDE7XG4gIHZhciB0ID0gbmV3IFVpbnQzMkFycmF5KFswLCAwXSk7XG4gIHZhciBCID0gbmV3IFVpbnQzMkFycmF5KDQpO1xuICBmb3IgKHZhciBqID0gNTsgaiA+PSAwOyAtLWopIHtcbiAgICBmb3IgKHZhciBpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB0WzFdID0gbiAqIGogKyAoaSArIDEpO1xuICAgICAgLy8gQiA9IEEgXiB0XG4gICAgICBCWzBdID0gQVswXSBeIHRbMF07XG4gICAgICBCWzFdID0gQVsxXSBeIHRbMV07XG4gICAgICAvLyBCID0gKEEgXiB0KSB8fCBSW2ldXG4gICAgICBCWzJdID0gUlsyICogaV07XG4gICAgICBCWzNdID0gUlsyICogaSArIDFdO1xuICAgICAgLy8gQiA9IEFFUy0xKEIpXG4gICAgICBCID0gdW5wYWNrKGFlcy5kZWNyeXB0KHBhY2soQikpKTtcbiAgICAgIC8vIEEgPSBNU0IoNjQsIEIpXG4gICAgICBBID0gQi5zdWJhcnJheSgwLCAyKTtcbiAgICAgIC8vIFJbaV0gPSBMU0IoNjQsIEIpXG4gICAgICBSWzIgKiBpXSA9IEJbMl07XG4gICAgICBSWzIgKiBpICsgMV0gPSBCWzNdO1xuICAgIH1cbiAgfVxuICBpZiAoQVswXSA9PT0gSVZbMF0gJiYgQVsxXSA9PT0gSVZbMV0pIHtcbiAgICByZXR1cm4gcGFjayhSKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJLZXkgRGF0YSBJbnRlZ3JpdHkgZmFpbGVkXCIpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBcnJheUJ1ZmZlcihkYXRhKSB7XG4gIGlmIChfdXRpbDIuZGVmYXVsdC5pc1N0cmluZyhkYXRhKSkge1xuICAgIHZhciBsZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIobGVuZ3RoKTtcbiAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgdmlld1tqXSA9IGRhdGEuY2hhckNvZGVBdChqKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfVxuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSkuYnVmZmVyO1xufVxuXG5mdW5jdGlvbiB1bnBhY2soZGF0YSkge1xuICB2YXIgbGVuZ3RoID0gZGF0YS5sZW5ndGg7XG5cbiAgdmFyIGJ1ZmZlciA9IGNyZWF0ZUFycmF5QnVmZmVyKGRhdGEpO1xuICB2YXIgdmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpO1xuICB2YXIgYXJyID0gbmV3IFVpbnQzMkFycmF5KGxlbmd0aCAvIDQpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aCAvIDQ7ICsraSkge1xuICAgIGFycltpXSA9IHZpZXcuZ2V0VWludDMyKDQgKiBpKTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBwYWNrKCkge1xuICB2YXIgbGVuZ3RoID0gMDtcbiAgZm9yICh2YXIgayA9IDA7IGsgPCBhcmd1bWVudHMubGVuZ3RoOyArK2spIHtcbiAgICBsZW5ndGggKz0gNCAqIGFyZ3VtZW50c1trXS5sZW5ndGg7XG4gIH1cbiAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihsZW5ndGgpO1xuICB2YXIgdmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpO1xuICB2YXIgb2Zmc2V0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFyZ3VtZW50c1tpXS5sZW5ndGg7ICsraikge1xuICAgICAgdmlldy5zZXRVaW50MzIob2Zmc2V0ICsgNCAqIGosIGFyZ3VtZW50c1tpXVtqXSk7XG4gICAgfVxuICAgIG9mZnNldCArPSA0ICogYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICAvKipcbiAgICogQUVTIGtleSB3cmFwXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICAgKi9cbiAgd3JhcDogd3JhcCxcbiAgLyoqXG4gICAqIEFFUyBrZXkgdW53cmFwXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICAgKiBAdGhyb3dzIHtFcnJvcn1cbiAgICovXG4gIHVud3JhcDogdW53cmFwXG59O1xuXG59LHtcIi4uL3V0aWxcIjozOTgsXCIuL2NpcGhlclwiOjMzMn1dLDMyNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY2lwaGVyID0gX2RlcmVxXygnLi9jaXBoZXInKTtcblxudmFyIF9jaXBoZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2lwaGVyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGVuY3J5cHRzIGEgZ2l2ZW4gcGxhaW50ZXh0IHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXhyYW5kb21cbiAgICogdXNpbmcgdGhlIHNwZWNpZmllZCBibG9ja2NpcGhlclxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHByZWZpeHJhbmRvbSByYW5kb20gYnl0ZXMgb2YgYmxvY2tfc2l6ZSBsZW5ndGhcbiAgICogIHRvIGJlIHVzZWQgaW4gcHJlZml4aW5nIHRoZSBkYXRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaXBoZXJmbiB0aGUgYWxnb3JpdGhtIGNpcGhlciBjbGFzcyB0byBlbmNyeXB0XG4gICAqICBkYXRhIGluIG9uZSBibG9ja19zaXplIGVuY3J5cHRpb24sIHtAbGluayBtb2R1bGU6Y3J5cHRvL2NpcGhlcn0uXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gcGxhaW50ZXh0IGRhdGEgdG8gYmUgZW5jcnlwdGVkXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5IGtleSB0byBiZSB1c2VkIHRvIGVuY3J5cHQgdGhlIHBsYWludGV4dC5cbiAgICogVGhpcyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY2lwaGVyZm5cbiAgICogQHBhcmFtIHtCb29sZWFufSByZXN5bmMgYSBib29sZWFuIHZhbHVlIHNwZWNpZnlpbmcgaWYgYSByZXN5bmMgb2YgdGhlXG4gICAqICBJViBzaG91bGQgYmUgdXNlZCBvciBub3QuIFRoZSBlbmNyeXB0ZWRkYXRhcGFja2V0IHVzZXMgdGhlXG4gICAqICBcIm9sZFwiIHN0eWxlIHdpdGggYSByZXN5bmMuIEVuY3J5cHRpb24gd2l0aGluIGFuXG4gICAqICBlbmNyeXB0ZWRpbnRlZ3JpdHlwcm90ZWN0ZWRkYXRhIHBhY2tldCBpcyBub3QgcmVzeW5jaW5nIHRoZSBJVi5cbiAgICogQHJldHVybnMge1VpbnQ4QXJyYXl9IGVuY3J5cHRlZCBkYXRhXG4gICAqL1xuICBlbmNyeXB0OiBmdW5jdGlvbiBlbmNyeXB0KHByZWZpeHJhbmRvbSwgY2lwaGVyZm4sIHBsYWludGV4dCwga2V5LCByZXN5bmMpIHtcbiAgICBjaXBoZXJmbiA9IG5ldyBfY2lwaGVyMi5kZWZhdWx0W2NpcGhlcmZuXShrZXkpO1xuICAgIHZhciBibG9ja19zaXplID0gY2lwaGVyZm4uYmxvY2tTaXplO1xuXG4gICAgdmFyIEZSID0gbmV3IFVpbnQ4QXJyYXkoYmxvY2tfc2l6ZSk7XG4gICAgdmFyIEZSRSA9IG5ldyBVaW50OEFycmF5KGJsb2NrX3NpemUpO1xuXG4gICAgdmFyIG5ld19wcmVmaXggPSBuZXcgVWludDhBcnJheShwcmVmaXhyYW5kb20ubGVuZ3RoICsgMik7XG4gICAgbmV3X3ByZWZpeC5zZXQocHJlZml4cmFuZG9tKTtcbiAgICBuZXdfcHJlZml4W3ByZWZpeHJhbmRvbS5sZW5ndGhdID0gcHJlZml4cmFuZG9tW2Jsb2NrX3NpemUgLSAyXTtcbiAgICBuZXdfcHJlZml4W3ByZWZpeHJhbmRvbS5sZW5ndGggKyAxXSA9IHByZWZpeHJhbmRvbVtibG9ja19zaXplIC0gMV07XG4gICAgcHJlZml4cmFuZG9tID0gbmV3X3ByZWZpeDtcblxuICAgIHZhciBjaXBoZXJ0ZXh0ID0gbmV3IFVpbnQ4QXJyYXkocGxhaW50ZXh0Lmxlbmd0aCArIDIgKyBibG9ja19zaXplICogMik7XG4gICAgdmFyIGkgPSB2b2lkIDA7XG4gICAgdmFyIG4gPSB2b2lkIDA7XG4gICAgdmFyIGJlZ2luID0gdm9pZCAwO1xuICAgIHZhciBvZmZzZXQgPSByZXN5bmMgPyAwIDogMjtcblxuICAgIC8vIDEuICBUaGUgZmVlZGJhY2sgcmVnaXN0ZXIgKEZSKSBpcyBzZXQgdG8gdGhlIElWLCB3aGljaCBpcyBhbGwgemVyb3MuXG4gICAgZm9yIChpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykge1xuICAgICAgRlJbaV0gPSAwO1xuICAgIH1cblxuICAgIC8vIDIuICBGUiBpcyBlbmNyeXB0ZWQgdG8gcHJvZHVjZSBGUkUgKEZSIEVuY3J5cHRlZCkuICBUaGlzIGlzIHRoZVxuICAgIC8vICAgICBlbmNyeXB0aW9uIG9mIGFuIGFsbC16ZXJvIHZhbHVlLlxuICAgIEZSRSA9IGNpcGhlcmZuLmVuY3J5cHQoRlIpO1xuICAgIC8vIDMuICBGUkUgaXMgeG9yZWQgd2l0aCB0aGUgZmlyc3QgQlMgb2N0ZXRzIG9mIHJhbmRvbSBkYXRhIHByZWZpeGVkIHRvXG4gICAgLy8gICAgIHRoZSBwbGFpbnRleHQgdG8gcHJvZHVjZSBDWzFdIHRocm91Z2ggQ1tCU10sIHRoZSBmaXJzdCBCUyBvY3RldHNcbiAgICAvLyAgICAgb2YgY2lwaGVydGV4dC5cbiAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSB7XG4gICAgICBjaXBoZXJ0ZXh0W2ldID0gRlJFW2ldIF4gcHJlZml4cmFuZG9tW2ldO1xuICAgIH1cblxuICAgIC8vIDQuICBGUiBpcyBsb2FkZWQgd2l0aCBDWzFdIHRocm91Z2ggQ1tCU10uXG4gICAgRlIuc2V0KGNpcGhlcnRleHQuc3ViYXJyYXkoMCwgYmxvY2tfc2l6ZSkpO1xuXG4gICAgLy8gNS4gIEZSIGlzIGVuY3J5cHRlZCB0byBwcm9kdWNlIEZSRSwgdGhlIGVuY3J5cHRpb24gb2YgdGhlIGZpcnN0IEJTXG4gICAgLy8gICAgIG9jdGV0cyBvZiBjaXBoZXJ0ZXh0LlxuICAgIEZSRSA9IGNpcGhlcmZuLmVuY3J5cHQoRlIpO1xuXG4gICAgLy8gNi4gIFRoZSBsZWZ0IHR3byBvY3RldHMgb2YgRlJFIGdldCB4b3JlZCB3aXRoIHRoZSBuZXh0IHR3byBvY3RldHMgb2ZcbiAgICAvLyAgICAgZGF0YSB0aGF0IHdlcmUgcHJlZml4ZWQgdG8gdGhlIHBsYWludGV4dC4gIFRoaXMgcHJvZHVjZXMgQ1tCUysxXVxuICAgIC8vICAgICBhbmQgQ1tCUysyXSwgdGhlIG5leHQgdHdvIG9jdGV0cyBvZiBjaXBoZXJ0ZXh0LlxuICAgIGNpcGhlcnRleHRbYmxvY2tfc2l6ZV0gPSBGUkVbMF0gXiBwcmVmaXhyYW5kb21bYmxvY2tfc2l6ZV07XG4gICAgY2lwaGVydGV4dFtibG9ja19zaXplICsgMV0gPSBGUkVbMV0gXiBwcmVmaXhyYW5kb21bYmxvY2tfc2l6ZSArIDFdO1xuXG4gICAgaWYgKHJlc3luYykge1xuICAgICAgLy8gNy4gIChUaGUgcmVzeW5jIHN0ZXApIEZSIGlzIGxvYWRlZCB3aXRoIENbM10gdGhyb3VnaCBDW0JTKzJdLlxuICAgICAgRlIuc2V0KGNpcGhlcnRleHQuc3ViYXJyYXkoMiwgYmxvY2tfc2l6ZSArIDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgRlIuc2V0KGNpcGhlcnRleHQuc3ViYXJyYXkoMCwgYmxvY2tfc2l6ZSkpO1xuICAgIH1cbiAgICAvLyA4LiAgRlIgaXMgZW5jcnlwdGVkIHRvIHByb2R1Y2UgRlJFLlxuICAgIEZSRSA9IGNpcGhlcmZuLmVuY3J5cHQoRlIpO1xuXG4gICAgLy8gOS4gIEZSRSBpcyB4b3JlZCB3aXRoIHRoZSBmaXJzdCBCUyBvY3RldHMgb2YgdGhlIGdpdmVuIHBsYWludGV4dCwgbm93XG4gICAgLy8gICAgIHRoYXQgd2UgaGF2ZSBmaW5pc2hlZCBlbmNyeXB0aW5nIHRoZSBCUysyIG9jdGV0cyBvZiBwcmVmaXhlZFxuICAgIC8vICAgICBkYXRhLiAgVGhpcyBwcm9kdWNlcyBDW0JTKzNdIHRocm91Z2ggQ1tCUysoQlMrMildLCB0aGUgbmV4dCBCU1xuICAgIC8vICAgICBvY3RldHMgb2YgY2lwaGVydGV4dC5cbiAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSB7XG4gICAgICBjaXBoZXJ0ZXh0W2Jsb2NrX3NpemUgKyAyICsgaV0gPSBGUkVbaSArIG9mZnNldF0gXiBwbGFpbnRleHRbaV07XG4gICAgfVxuICAgIGZvciAobiA9IGJsb2NrX3NpemU7IG4gPCBwbGFpbnRleHQubGVuZ3RoICsgb2Zmc2V0OyBuICs9IGJsb2NrX3NpemUpIHtcbiAgICAgIC8vIDEwLiBGUiBpcyBsb2FkZWQgd2l0aCBDW0JTKzNdIHRvIENbQlMgKyAoQlMrMildICh3aGljaCBpcyBDMTEtQzE4IGZvclxuICAgICAgLy8gYW4gOC1vY3RldCBibG9jaykuXG4gICAgICBiZWdpbiA9IG4gKyAyIC0gb2Zmc2V0O1xuICAgICAgRlIuc2V0KGNpcGhlcnRleHQuc3ViYXJyYXkoYmVnaW4sIGJlZ2luICsgYmxvY2tfc2l6ZSkpO1xuXG4gICAgICAvLyAxMS4gRlIgaXMgZW5jcnlwdGVkIHRvIHByb2R1Y2UgRlJFLlxuICAgICAgRlJFID0gY2lwaGVyZm4uZW5jcnlwdChGUik7XG5cbiAgICAgIC8vIDEyLiBGUkUgaXMgeG9yZWQgd2l0aCB0aGUgbmV4dCBCUyBvY3RldHMgb2YgcGxhaW50ZXh0LCB0byBwcm9kdWNlXG4gICAgICAvLyB0aGUgbmV4dCBCUyBvY3RldHMgb2YgY2lwaGVydGV4dC4gIFRoZXNlIGFyZSBsb2FkZWQgaW50byBGUiwgYW5kXG4gICAgICAvLyB0aGUgcHJvY2VzcyBpcyByZXBlYXRlZCB1bnRpbCB0aGUgcGxhaW50ZXh0IGlzIHVzZWQgdXAuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSB7XG4gICAgICAgIGNpcGhlcnRleHRbYmxvY2tfc2l6ZSArIGJlZ2luICsgaV0gPSBGUkVbaV0gXiBwbGFpbnRleHRbbiArIGkgLSBvZmZzZXRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNpcGhlcnRleHQgPSBjaXBoZXJ0ZXh0LnN1YmFycmF5KDAsIHBsYWludGV4dC5sZW5ndGggKyAyICsgYmxvY2tfc2l6ZSk7XG4gICAgcmV0dXJuIGNpcGhlcnRleHQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlY3J5cHRzIHRoZSBwcmVmaXhlZCBkYXRhIGZvciB0aGUgTW9kaWZpY2F0aW9uIERldGVjdGlvbiBDb2RlIChNREMpIGNvbXB1dGF0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaXBoZXJmbi5lbmNyeXB0IENpcGhlciBmdW5jdGlvbiB0byB1c2UsXG4gICAqICBAc2VlIG1vZHVsZTpjcnlwdG8vY2lwaGVyLlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGtleSBVaW50OEFycmF5IHJlcHJlc2VudGF0aW9uIG9mIGtleSB0byBiZSB1c2VkIHRvIGNoZWNrIHRoZSBtZGNcbiAgICogVGhpcyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY2lwaGVyZm5cbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBjaXBoZXJ0ZXh0IFRoZSBlbmNyeXB0ZWQgZGF0YVxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gcGxhaW50ZXh0IERhdGEgb2YgRChjaXBoZXJ0ZXh0KSB3aXRoIGJsb2Nrc2l6ZSBsZW5ndGggKzJcbiAgICovXG4gIG1kYzogZnVuY3Rpb24gbWRjKGNpcGhlcmZuLCBrZXksIGNpcGhlcnRleHQpIHtcbiAgICBjaXBoZXJmbiA9IG5ldyBfY2lwaGVyMi5kZWZhdWx0W2NpcGhlcmZuXShrZXkpO1xuICAgIHZhciBibG9ja19zaXplID0gY2lwaGVyZm4uYmxvY2tTaXplO1xuXG4gICAgdmFyIGlibG9jayA9IG5ldyBVaW50OEFycmF5KGJsb2NrX3NpemUpO1xuICAgIHZhciBhYmxvY2sgPSBuZXcgVWludDhBcnJheShibG9ja19zaXplKTtcbiAgICB2YXIgaSA9IHZvaWQgMDtcblxuICAgIC8vIGluaXRpYWxpc2F0aW9uIHZlY3RvclxuICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIHtcbiAgICAgIGlibG9ja1tpXSA9IDA7XG4gICAgfVxuXG4gICAgaWJsb2NrID0gY2lwaGVyZm4uZW5jcnlwdChpYmxvY2spO1xuICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIHtcbiAgICAgIGFibG9ja1tpXSA9IGNpcGhlcnRleHRbaV07XG4gICAgICBpYmxvY2tbaV0gXj0gYWJsb2NrW2ldO1xuICAgIH1cblxuICAgIGFibG9jayA9IGNpcGhlcmZuLmVuY3J5cHQoYWJsb2NrKTtcblxuICAgIHZhciByZXN1bHQgPSBuZXcgVWludDhBcnJheShpYmxvY2subGVuZ3RoICsgMik7XG4gICAgcmVzdWx0LnNldChpYmxvY2spO1xuICAgIHJlc3VsdFtpYmxvY2subGVuZ3RoXSA9IGFibG9ja1swXSBeIGNpcGhlcnRleHRbYmxvY2tfc2l6ZV07XG4gICAgcmVzdWx0W2libG9jay5sZW5ndGggKyAxXSA9IGFibG9ja1sxXSBeIGNpcGhlcnRleHRbYmxvY2tfc2l6ZSArIDFdO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gZGVjcnlwdHMgYSBnaXZlbiBjaXBoZXJ0ZXh0IHVzaW5nIHRoZSBzcGVjaWZpZWQgYmxvY2tjaXBoZXJcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNpcGhlcmZuIHRoZSBhbGdvcml0aG0gY2lwaGVyIGNsYXNzIHRvIGRlY3J5cHRcbiAgICogIGRhdGEgaW4gb25lIGJsb2NrX3NpemUgZW5jcnlwdGlvbiwge0BsaW5rIG1vZHVsZTpjcnlwdG8vY2lwaGVyfS5cbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBrZXkgVWludDhBcnJheSByZXByZXNlbnRhdGlvbiBvZiBrZXkgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSBjaXBoZXJ0ZXh0LlxuICAgKiBUaGlzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjaXBoZXJmblxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGNpcGhlcnRleHQgdG8gYmUgZGVjcnlwdGVkXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVzeW5jIGEgYm9vbGVhbiB2YWx1ZSBzcGVjaWZ5aW5nIGlmIGEgcmVzeW5jIG9mIHRoZVxuICAgKiAgSVYgc2hvdWxkIGJlIHVzZWQgb3Igbm90LiBUaGUgZW5jcnlwdGVkZGF0YXBhY2tldCB1c2VzIHRoZVxuICAgKiAgXCJvbGRcIiBzdHlsZSB3aXRoIGEgcmVzeW5jLiBEZWNyeXB0aW9uIHdpdGhpbiBhblxuICAgKiAgZW5jcnlwdGVkaW50ZWdyaXR5cHJvdGVjdGVkZGF0YSBwYWNrZXQgaXMgbm90IHJlc3luY2luZyB0aGUgSVYuXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSB0aGUgcGxhaW50ZXh0IGRhdGFcbiAgICovXG4gIGRlY3J5cHQ6IGZ1bmN0aW9uIGRlY3J5cHQoY2lwaGVyZm4sIGtleSwgY2lwaGVydGV4dCwgcmVzeW5jKSB7XG4gICAgY2lwaGVyZm4gPSBuZXcgX2NpcGhlcjIuZGVmYXVsdFtjaXBoZXJmbl0oa2V5KTtcbiAgICB2YXIgYmxvY2tfc2l6ZSA9IGNpcGhlcmZuLmJsb2NrU2l6ZTtcblxuICAgIHZhciBpYmxvY2sgPSBuZXcgVWludDhBcnJheShibG9ja19zaXplKTtcbiAgICB2YXIgYWJsb2NrID0gbmV3IFVpbnQ4QXJyYXkoYmxvY2tfc2l6ZSk7XG5cbiAgICB2YXIgaSA9IHZvaWQgMDtcbiAgICB2YXIgaiA9IHZvaWQgMDtcbiAgICB2YXIgbiA9IHZvaWQgMDtcbiAgICB2YXIgdGV4dCA9IG5ldyBVaW50OEFycmF5KGNpcGhlcnRleHQubGVuZ3RoIC0gYmxvY2tfc2l6ZSk7XG5cbiAgICAvLyBpbml0aWFsaXNhdGlvbiB2ZWN0b3JcbiAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSB7XG4gICAgICBpYmxvY2tbaV0gPSAwO1xuICAgIH1cblxuICAgIGlibG9jayA9IGNpcGhlcmZuLmVuY3J5cHQoaWJsb2NrKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSB7XG4gICAgICBhYmxvY2tbaV0gPSBjaXBoZXJ0ZXh0W2ldO1xuICAgICAgaWJsb2NrW2ldIF49IGFibG9ja1tpXTtcbiAgICB9XG5cbiAgICBhYmxvY2sgPSBjaXBoZXJmbi5lbmNyeXB0KGFibG9jayk7XG5cbiAgICAvLyB0ZXN0IGNoZWNrIG9jdGV0c1xuICAgIGlmIChpYmxvY2tbYmxvY2tfc2l6ZSAtIDJdICE9PSAoYWJsb2NrWzBdIF4gY2lwaGVydGV4dFtibG9ja19zaXplXSkgfHwgaWJsb2NrW2Jsb2NrX3NpemUgLSAxXSAhPT0gKGFibG9ja1sxXSBeIGNpcGhlcnRleHRbYmxvY2tfc2l6ZSArIDFdKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDRkIgZGVjcnlwdDogaW52YWxpZCBrZXknKTtcbiAgICB9XG5cbiAgICAvKiAgUkZDNDg4MDogVGFnIDE4IGFuZCBSZXN5bmM6XG4gICAgICogIFsuLi5dIFVubGlrZSB0aGUgU3ltbWV0cmljYWxseSBFbmNyeXB0ZWQgRGF0YSBQYWNrZXQsIG5vXG4gICAgICogIHNwZWNpYWwgQ0ZCIHJlc3luY2hyb25pemF0aW9uIGlzIGRvbmUgYWZ0ZXIgZW5jcnlwdGluZyB0aGlzIHByZWZpeFxuICAgICAqICBkYXRhLiAgU2VlIFwiT3BlblBHUCBDRkIgTW9kZVwiIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAqL1xuXG4gICAgaiA9IDA7XG4gICAgaWYgKHJlc3luYykge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykge1xuICAgICAgICBpYmxvY2tbaV0gPSBjaXBoZXJ0ZXh0W2kgKyAyXTtcbiAgICAgIH1cbiAgICAgIGZvciAobiA9IGJsb2NrX3NpemUgKyAyOyBuIDwgY2lwaGVydGV4dC5sZW5ndGg7IG4gKz0gYmxvY2tfc2l6ZSkge1xuICAgICAgICBhYmxvY2sgPSBjaXBoZXJmbi5lbmNyeXB0KGlibG9jayk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrX3NpemUgJiYgaSArIG4gPCBjaXBoZXJ0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWJsb2NrW2ldID0gY2lwaGVydGV4dFtuICsgaV07XG4gICAgICAgICAgaWYgKGogPCB0ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGV4dFtqXSA9IGFibG9ja1tpXSBeIGlibG9ja1tpXTtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykge1xuICAgICAgICBpYmxvY2tbaV0gPSBjaXBoZXJ0ZXh0W2ldO1xuICAgICAgfVxuICAgICAgZm9yIChuID0gYmxvY2tfc2l6ZTsgbiA8IGNpcGhlcnRleHQubGVuZ3RoOyBuICs9IGJsb2NrX3NpemUpIHtcbiAgICAgICAgYWJsb2NrID0gY2lwaGVyZm4uZW5jcnlwdChpYmxvY2spO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tfc2l6ZSAmJiBpICsgbiA8IGNpcGhlcnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpYmxvY2tbaV0gPSBjaXBoZXJ0ZXh0W24gKyBpXTtcbiAgICAgICAgICBpZiAoaiA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICB0ZXh0W2pdID0gYWJsb2NrW2ldIF4gaWJsb2NrW2ldO1xuICAgICAgICAgICAgaisrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG4gPSByZXN5bmMgPyAwIDogMjtcblxuICAgIHRleHQgPSB0ZXh0LnN1YmFycmF5KG4sIGNpcGhlcnRleHQubGVuZ3RoIC0gYmxvY2tfc2l6ZSAtIDIgKyBuKTtcblxuICAgIHJldHVybiB0ZXh0O1xuICB9LFxuXG4gIG5vcm1hbEVuY3J5cHQ6IGZ1bmN0aW9uIG5vcm1hbEVuY3J5cHQoY2lwaGVyZm4sIGtleSwgcGxhaW50ZXh0LCBpdikge1xuICAgIGNpcGhlcmZuID0gbmV3IF9jaXBoZXIyLmRlZmF1bHRbY2lwaGVyZm5dKGtleSk7XG4gICAgdmFyIGJsb2NrX3NpemUgPSBjaXBoZXJmbi5ibG9ja1NpemU7XG5cbiAgICB2YXIgYmxvY2tpID0gbmV3IFVpbnQ4QXJyYXkoYmxvY2tfc2l6ZSk7XG4gICAgdmFyIGJsb2NrYyA9IG5ldyBVaW50OEFycmF5KGJsb2NrX3NpemUpO1xuICAgIHZhciBwb3MgPSAwO1xuICAgIHZhciBjeXBoZXJ0ZXh0ID0gbmV3IFVpbnQ4QXJyYXkocGxhaW50ZXh0Lmxlbmd0aCk7XG4gICAgdmFyIGkgPSB2b2lkIDA7XG4gICAgdmFyIGogPSAwO1xuXG4gICAgaWYgKGl2ID09PSBudWxsKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSB7XG4gICAgICAgIGJsb2NrY1tpXSA9IDA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIHtcbiAgICAgICAgYmxvY2tjW2ldID0gaXZbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHdoaWxlIChwbGFpbnRleHQubGVuZ3RoID4gYmxvY2tfc2l6ZSAqIHBvcykge1xuICAgICAgdmFyIGVuY2Jsb2NrID0gY2lwaGVyZm4uZW5jcnlwdChibG9ja2MpO1xuICAgICAgYmxvY2tpID0gcGxhaW50ZXh0LnN1YmFycmF5KHBvcyAqIGJsb2NrX3NpemUsIHBvcyAqIGJsb2NrX3NpemUgKyBibG9ja19zaXplKTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja2kubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYmxvY2tjW2ldID0gYmxvY2tpW2ldIF4gZW5jYmxvY2tbaV07XG4gICAgICAgIGN5cGhlcnRleHRbaisrXSA9IGJsb2NrY1tpXTtcbiAgICAgIH1cbiAgICAgIHBvcysrO1xuICAgIH1cbiAgICByZXR1cm4gY3lwaGVydGV4dDtcbiAgfSxcblxuICBub3JtYWxEZWNyeXB0OiBmdW5jdGlvbiBub3JtYWxEZWNyeXB0KGNpcGhlcmZuLCBrZXksIGNpcGhlcnRleHQsIGl2KSB7XG4gICAgY2lwaGVyZm4gPSBuZXcgX2NpcGhlcjIuZGVmYXVsdFtjaXBoZXJmbl0oa2V5KTtcbiAgICB2YXIgYmxvY2tfc2l6ZSA9IGNpcGhlcmZuLmJsb2NrU2l6ZTtcblxuICAgIHZhciBibG9ja3AgPSB2b2lkIDA7XG4gICAgdmFyIHBvcyA9IDA7XG4gICAgdmFyIHBsYWludGV4dCA9IG5ldyBVaW50OEFycmF5KGNpcGhlcnRleHQubGVuZ3RoKTtcbiAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICB2YXIgaSA9IHZvaWQgMDtcbiAgICB2YXIgaiA9IDA7XG5cbiAgICBpZiAoaXYgPT09IG51bGwpIHtcbiAgICAgIGJsb2NrcCA9IG5ldyBVaW50OEFycmF5KGJsb2NrX3NpemUpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykge1xuICAgICAgICBibG9ja3BbaV0gPSAwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBibG9ja3AgPSBpdi5zdWJhcnJheSgwLCBibG9ja19zaXplKTtcbiAgICB9XG4gICAgd2hpbGUgKGNpcGhlcnRleHQubGVuZ3RoID4gYmxvY2tfc2l6ZSAqIHBvcykge1xuICAgICAgdmFyIGRlY2Jsb2NrID0gY2lwaGVyZm4uZW5jcnlwdChibG9ja3ApO1xuICAgICAgYmxvY2twID0gY2lwaGVydGV4dC5zdWJhcnJheShwb3MgKiBibG9ja19zaXplICsgb2Zmc2V0LCBwb3MgKiBibG9ja19zaXplICsgYmxvY2tfc2l6ZSArIG9mZnNldCk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2twLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBsYWludGV4dFtqKytdID0gYmxvY2twW2ldIF4gZGVjYmxvY2tbaV07XG4gICAgICB9XG4gICAgICBwb3MrKztcbiAgICB9XG5cbiAgICByZXR1cm4gcGxhaW50ZXh0O1xuICB9XG59OyAvLyBNb2RpZmllZCBieSBQcm90b25UZWNoIEFHXG5cbi8vIE1vZGlmaWVkIGJ5IFJlY3VyaXR5IExhYnMgR21iSFxuXG4vLyBtb2RpZmllZCB2ZXJzaW9uIG9mIGh0dHBzOi8vd3d3LmhhbmV3aW4ubmV0L2VuY3J5cHQvUEdkZWNvZGUuanM6XG5cbi8qIE9wZW5QR1AgZW5jcnlwdGlvbiB1c2luZyBSU0EvQUVTXG4gKiBDb3B5cmlnaHQgMjAwNS0yMDA2IEhlcmJlcnQgSGFuZXdpbmtlbCwgd3d3LmhhbmVXSU4uZGVcbiAqIHZlcnNpb24gMi4wLCBjaGVjayB3d3cuaGFuZVdJTi5kZSBmb3IgdGhlIGxhdGVzdCB2ZXJzaW9uXG5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMsIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LlxuICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBvciBzZWxsIHRoaXMgc29mdHdhcmUsIHdpdGggb3JcbiAqIHdpdGhvdXQgZmVlLCBmb3IgYW55IHB1cnBvc2UgYW5kIGJ5IGFueSBpbmRpdmlkdWFsIG9yIG9yZ2FuaXphdGlvbiwgaXMgaGVyZWJ5XG4gKiBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcHBlYXJcbiAqIGluIGFsbCBjb3BpZXMuIERpc3RyaWJ1dGlvbiBhcyBhIHBhcnQgb2YgYW4gYXBwbGljYXRpb24gb3IgYmluYXJ5IG11c3RcbiAqIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyXG4gKiBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gb3IgZGlzdHJpYnV0aW9uLlxuICovXG5cbi8qKlxuICogQHJlcXVpcmVzIGNyeXB0by9jaXBoZXJcbiAqIEBtb2R1bGUgY3J5cHRvL2NmYlxuICovXG5cbn0se1wiLi9jaXBoZXJcIjozMzJ9XSwzMjg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4cG9ydHMgPSBfZGVyZXFfKCdhc21jcnlwdG8uanMvc3JjL2Flcy9leHBvcnRzJyk7XG5cbnZhciBfZWNiID0gX2RlcmVxXygnYXNtY3J5cHRvLmpzL3NyYy9hZXMvZWNiL2VjYicpO1xuXG4vLyBUT0RPIHVzZSB3ZWJDcnlwdG8gb3Igbm9kZUNyeXB0byB3aGVuIHBvc3NpYmxlLlxuLyoqXG4gKiBAcmVxdWlyZXMgYXNtY3J5cHRvLmpzXG4gKi9cblxuZnVuY3Rpb24gYWVzKGxlbmd0aCkge1xuICB2YXIgQyA9IGZ1bmN0aW9uIEMoa2V5KSB7XG4gICAgdmFyIGFlc19lY2IgPSBuZXcgX2VjYi5BRVNfRUNCKGtleSwgX2V4cG9ydHMuX0FFU19oZWFwX2luc3RhbmNlLCBfZXhwb3J0cy5fQUVTX2FzbV9pbnN0YW5jZSk7XG5cbiAgICB0aGlzLmVuY3J5cHQgPSBmdW5jdGlvbiAoYmxvY2spIHtcbiAgICAgIHJldHVybiBhZXNfZWNiLmVuY3J5cHQoYmxvY2spLnJlc3VsdDtcbiAgICB9O1xuXG4gICAgdGhpcy5kZWNyeXB0ID0gZnVuY3Rpb24gKGJsb2NrKSB7XG4gICAgICByZXR1cm4gYWVzX2VjYi5kZWNyeXB0KGJsb2NrKS5yZXN1bHQ7XG4gICAgfTtcbiAgfTtcblxuICBDLmJsb2NrU2l6ZSA9IEMucHJvdG90eXBlLmJsb2NrU2l6ZSA9IDE2O1xuICBDLmtleVNpemUgPSBDLnByb3RvdHlwZS5rZXlTaXplID0gbGVuZ3RoIC8gODtcblxuICByZXR1cm4gQztcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gYWVzO1xuXG59LHtcImFzbWNyeXB0by5qcy9zcmMvYWVzL2VjYi9lY2JcIjoxMCxcImFzbWNyeXB0by5qcy9zcmMvYWVzL2V4cG9ydHNcIjoxMX1dLDMyOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbi8qIE1vZGlmaWVkIGJ5IFJlY3VyaXR5IExhYnMgR21iSFxuICpcbiAqIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBua2xlaW4gc29mdHdhcmUgKG5rbGVpbi5jb20pXG4gKi9cblxuLypcbiAqIEphdmFzY3JpcHQgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gQnJ1Y2UgU2NobmVpZXIncyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uXG4gKlxuICpcbiAqIFRoZSBjb25zdHJ1Y3RvciBkb2Vzbid0IGRvIG11Y2ggb2YgYW55dGhpbmcuICBJdCdzIGp1c3QgaGVyZVxuICogc28gd2UgY2FuIHN0YXJ0IGRlZmluaW5nIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgYW5kIHN1Y2guXG4gKi9cbmZ1bmN0aW9uIEJsb3dmaXNoKCkge31cblxuLypcbiAqIERlY2xhcmUgdGhlIGJsb2NrIHNpemUgc28gdGhhdCBwcm90b2NvbHMga25vdyB3aGF0IHNpemVcbiAqIEluaXRpYWxpemF0aW9uIFZlY3RvciAoSVYpIHRoZXkgd2lsbCBuZWVkLlxuICovXG5CbG93ZmlzaC5wcm90b3R5cGUuQkxPQ0tTSVpFID0gODtcblxuLypcbiAqIFRoZXNlIGFyZSB0aGUgZGVmYXVsdCBTQk9YRVMuXG4gKi9cbkJsb3dmaXNoLnByb3RvdHlwZS5TQk9YRVMgPSBbWzB4ZDEzMTBiYTYsIDB4OThkZmI1YWMsIDB4MmZmZDcyZGIsIDB4ZDAxYWRmYjcsIDB4YjhlMWFmZWQsIDB4NmEyNjdlOTYsIDB4YmE3YzkwNDUsIDB4ZjEyYzdmOTksIDB4MjRhMTk5NDcsIDB4YjM5MTZjZjcsIDB4MDgwMWYyZTIsIDB4ODU4ZWZjMTYsIDB4NjM2OTIwZDgsIDB4NzE1NzRlNjksIDB4YTQ1OGZlYTMsIDB4ZjQ5MzNkN2UsIDB4MGQ5NTc0OGYsIDB4NzI4ZWI2NTgsIDB4NzE4YmNkNTgsIDB4ODIxNTRhZWUsIDB4N2I1NGE0MWQsIDB4YzI1YTU5YjUsIDB4OWMzMGQ1MzksIDB4MmFmMjYwMTMsIDB4YzVkMWIwMjMsIDB4Mjg2MDg1ZjAsIDB4Y2E0MTc5MTgsIDB4YjhkYjM4ZWYsIDB4OGU3OWRjYjAsIDB4NjAzYTE4MGUsIDB4NmM5ZTBlOGIsIDB4YjAxZThhM2UsIDB4ZDcxNTc3YzEsIDB4YmQzMTRiMjcsIDB4NzhhZjJmZGEsIDB4NTU2MDVjNjAsIDB4ZTY1NTI1ZjMsIDB4YWE1NWFiOTQsIDB4NTc0ODk4NjIsIDB4NjNlODE0NDAsIDB4NTVjYTM5NmEsIDB4MmFhYjEwYjYsIDB4YjRjYzVjMzQsIDB4MTE0MWU4Y2UsIDB4YTE1NDg2YWYsIDB4N2M3MmU5OTMsIDB4YjNlZTE0MTEsIDB4NjM2ZmJjMmEsIDB4MmJhOWM1NWQsIDB4NzQxODMxZjYsIDB4Y2U1YzNlMTYsIDB4OWI4NzkzMWUsIDB4YWZkNmJhMzMsIDB4NmMyNGNmNWMsIDB4N2EzMjUzODEsIDB4Mjg5NTg2NzcsIDB4M2I4ZjQ4OTgsIDB4NmI0YmI5YWYsIDB4YzRiZmU4MWIsIDB4NjYyODIxOTMsIDB4NjFkODA5Y2MsIDB4ZmIyMWE5OTEsIDB4NDg3Y2FjNjAsIDB4NWRlYzgwMzIsIDB4ZWY4NDVkNWQsIDB4ZTk4NTc1YjEsIDB4ZGMyNjIzMDIsIDB4ZWI2NTFiODgsIDB4MjM4OTNlODEsIDB4ZDM5NmFjYzUsIDB4MGY2ZDZmZjMsIDB4ODNmNDQyMzksIDB4MmUwYjQ0ODIsIDB4YTQ4NDIwMDQsIDB4NjljOGYwNGEsIDB4OWUxZjliNWUsIDB4MjFjNjY4NDIsIDB4ZjZlOTZjOWEsIDB4NjcwYzljNjEsIDB4YWJkMzg4ZjAsIDB4NmE1MWEwZDIsIDB4ZDg1NDJmNjgsIDB4OTYwZmE3MjgsIDB4YWI1MTMzYTMsIDB4NmVlZjBiNmMsIDB4MTM3YTNiZTQsIDB4YmEzYmYwNTAsIDB4N2VmYjJhOTgsIDB4YTFmMTY1MWQsIDB4MzlhZjAxNzYsIDB4NjZjYTU5M2UsIDB4ODI0MzBlODgsIDB4OGNlZTg2MTksIDB4NDU2ZjlmYjQsIDB4N2Q4NGE1YzMsIDB4M2I4YjVlYmUsIDB4ZTA2Zjc1ZDgsIDB4ODVjMTIwNzMsIDB4NDAxYTQ0OWYsIDB4NTZjMTZhYTYsIDB4NGVkM2FhNjIsIDB4MzYzZjc3MDYsIDB4MWJmZWRmNzIsIDB4NDI5YjAyM2QsIDB4MzdkMGQ3MjQsIDB4ZDAwYTEyNDgsIDB4ZGIwZmVhZDMsIDB4NDlmMWMwOWIsIDB4MDc1MzcyYzksIDB4ODA5OTFiN2IsIDB4MjVkNDc5ZDgsIDB4ZjZlOGRlZjcsIDB4ZTNmZTUwMWEsIDB4YjY3OTRjM2IsIDB4OTc2Y2UwYmQsIDB4MDRjMDA2YmEsIDB4YzFhOTRmYjYsIDB4NDA5ZjYwYzQsIDB4NWU1YzllYzIsIDB4MTk2YTI0NjMsIDB4NjhmYjZmYWYsIDB4M2U2YzUzYjUsIDB4MTMzOWIyZWIsIDB4M2I1MmVjNmYsIDB4NmRmYzUxMWYsIDB4OWIzMDk1MmMsIDB4Y2M4MTQ1NDQsIDB4YWY1ZWJkMDksIDB4YmVlM2QwMDQsIDB4ZGUzMzRhZmQsIDB4NjYwZjI4MDcsIDB4MTkyZTRiYjMsIDB4YzBjYmE4NTcsIDB4NDVjODc0MGYsIDB4ZDIwYjVmMzksIDB4YjlkM2ZiZGIsIDB4NTU3OWMwYmQsIDB4MWE2MDMyMGEsIDB4ZDZhMTAwYzYsIDB4NDAyYzcyNzksIDB4Njc5ZjI1ZmUsIDB4ZmIxZmEzY2MsIDB4OGVhNWU5ZjgsIDB4ZGIzMjIyZjgsIDB4M2M3NTE2ZGYsIDB4ZmQ2MTZiMTUsIDB4MmY1MDFlYzgsIDB4YWQwNTUyYWIsIDB4MzIzZGI1ZmEsIDB4ZmQyMzg3NjAsIDB4NTMzMTdiNDgsIDB4M2UwMGRmODIsIDB4OWU1YzU3YmIsIDB4Y2E2ZjhjYTAsIDB4MWE4NzU2MmUsIDB4ZGYxNzY5ZGIsIDB4ZDU0MmE4ZjYsIDB4Mjg3ZWZmYzMsIDB4YWM2NzMyYzYsIDB4OGM0ZjU1NzMsIDB4Njk1YjI3YjAsIDB4YmJjYTU4YzgsIDB4ZTFmZmEzNWQsIDB4YjhmMDExYTAsIDB4MTBmYTNkOTgsIDB4ZmQyMTgzYjgsIDB4NGFmY2I1NmMsIDB4MmRkMWQzNWIsIDB4OWE1M2U0NzksIDB4YjZmODQ1NjUsIDB4ZDI4ZTQ5YmMsIDB4NGJmYjk3OTAsIDB4ZTFkZGYyZGEsIDB4YTRjYjdlMzMsIDB4NjJmYjEzNDEsIDB4Y2VlNGM2ZTgsIDB4ZWYyMGNhZGEsIDB4MzY3NzRjMDEsIDB4ZDA3ZTllZmUsIDB4MmJmMTFmYjQsIDB4OTVkYmRhNGQsIDB4YWU5MDkxOTgsIDB4ZWFhZDhlNzEsIDB4NmI5M2Q1YTAsIDB4ZDA4ZWQxZDAsIDB4YWZjNzI1ZTAsIDB4OGUzYzViMmYsIDB4OGU3NTk0YjcsIDB4OGZmNmUyZmIsIDB4ZjIxMjJiNjQsIDB4ODg4OGI4MTIsIDB4OTAwZGYwMWMsIDB4NGZhZDVlYTAsIDB4Njg4ZmMzMWMsIDB4ZDFjZmYxOTEsIDB4YjNhOGMxYWQsIDB4MmYyZjIyMTgsIDB4YmUwZTE3NzcsIDB4ZWE3NTJkZmUsIDB4OGIwMjFmYTEsIDB4ZTVhMGNjMGYsIDB4YjU2Zjc0ZTgsIDB4MThhY2YzZDYsIDB4Y2U4OWUyOTksIDB4YjRhODRmZTAsIDB4ZmQxM2UwYjcsIDB4N2NjNDNiODEsIDB4ZDJhZGE4ZDksIDB4MTY1ZmEyNjYsIDB4ODA5NTc3MDUsIDB4OTNjYzczMTQsIDB4MjExYTE0NzcsIDB4ZTZhZDIwNjUsIDB4NzdiNWZhODYsIDB4Yzc1NDQyZjUsIDB4ZmI5ZDM1Y2YsIDB4ZWJjZGFmMGMsIDB4N2IzZTg5YTAsIDB4ZDY0MTFiZDMsIDB4YWUxZTdlNDksIDB4MDAyNTBlMmQsIDB4MjA3MWIzNWUsIDB4MjI2ODAwYmIsIDB4NTdiOGUwYWYsIDB4MjQ2NDM2OWIsIDB4ZjAwOWI5MWUsIDB4NTU2MzkxMWQsIDB4NTlkZmE2YWEsIDB4NzhjMTQzODksIDB4ZDk1YTUzN2YsIDB4MjA3ZDViYTIsIDB4MDJlNWI5YzUsIDB4ODMyNjAzNzYsIDB4NjI5NWNmYTksIDB4MTFjODE5NjgsIDB4NGU3MzRhNDEsIDB4YjM0NzJkY2EsIDB4N2IxNGE5NGEsIDB4MWI1MTAwNTIsIDB4OWE1MzI5MTUsIDB4ZDYwZjU3M2YsIDB4YmM5YmM2ZTQsIDB4MmI2MGE0NzYsIDB4ODFlNjc0MDAsIDB4MDhiYTZmYjUsIDB4NTcxYmU5MWYsIDB4ZjI5NmVjNmIsIDB4MmEwZGQ5MTUsIDB4YjY2MzY1MjEsIDB4ZTdiOWY5YjYsIDB4ZmYzNDA1MmUsIDB4YzU4NTU2NjQsIDB4NTNiMDJkNWQsIDB4YTk5ZjhmYTEsIDB4MDhiYTQ3OTksIDB4NmU4NTA3NmFdLCBbMHg0YjdhNzBlOSwgMHhiNWIzMjk0NCwgMHhkYjc1MDkyZSwgMHhjNDE5MjYyMywgMHhhZDZlYTZiMCwgMHg0OWE3ZGY3ZCwgMHg5Y2VlNjBiOCwgMHg4ZmVkYjI2NiwgMHhlY2FhOGM3MSwgMHg2OTlhMTdmZiwgMHg1NjY0NTI2YywgMHhjMmIxOWVlMSwgMHgxOTM2MDJhNSwgMHg3NTA5NGMyOSwgMHhhMDU5MTM0MCwgMHhlNDE4M2EzZSwgMHgzZjU0OTg5YSwgMHg1YjQyOWQ2NSwgMHg2YjhmZTRkNiwgMHg5OWY3M2ZkNiwgMHhhMWQyOWMwNywgMHhlZmU4MzBmNSwgMHg0ZDJkMzhlNiwgMHhmMDI1NWRjMSwgMHg0Y2RkMjA4NiwgMHg4NDcwZWIyNiwgMHg2MzgyZTljNiwgMHgwMjFlY2M1ZSwgMHgwOTY4NmIzZiwgMHgzZWJhZWZjOSwgMHgzYzk3MTgxNCwgMHg2YjZhNzBhMSwgMHg2ODdmMzU4NCwgMHg1MmEwZTI4NiwgMHhiNzljNTMwNSwgMHhhYTUwMDczNywgMHgzZTA3ODQxYywgMHg3ZmRlYWU1YywgMHg4ZTdkNDRlYywgMHg1NzE2ZjJiOCwgMHhiMDNhZGEzNywgMHhmMDUwMGMwZCwgMHhmMDFjMWYwNCwgMHgwMjAwYjNmZiwgMHhhZTBjZjUxYSwgMHgzY2I1NzRiMiwgMHgyNTgzN2E1OCwgMHhkYzA5MjFiZCwgMHhkMTkxMTNmOSwgMHg3Y2E5MmZmNiwgMHg5NDMyNDc3MywgMHgyMmY1NDcwMSwgMHgzYWU1ZTU4MSwgMHgzN2MyZGFkYywgMHhjOGI1NzYzNCwgMHg5YWYzZGRhNywgMHhhOTQ0NjE0NiwgMHgwZmQwMDMwZSwgMHhlY2M4YzczZSwgMHhhNDc1MWU0MSwgMHhlMjM4Y2Q5OSwgMHgzYmVhMGUyZiwgMHgzMjgwYmJhMSwgMHgxODNlYjMzMSwgMHg0ZTU0OGIzOCwgMHg0ZjZkYjkwOCwgMHg2ZjQyMGQwMywgMHhmNjBhMDRiZiwgMHgyY2I4MTI5MCwgMHgyNDk3N2M3OSwgMHg1Njc5YjA3MiwgMHhiY2FmODlhZiwgMHhkZTlhNzcxZiwgMHhkOTkzMDgxMCwgMHhiMzhiYWUxMiwgMHhkY2NmM2YyZSwgMHg1NTEyNzIxZiwgMHgyZTZiNzEyNCwgMHg1MDFhZGRlNiwgMHg5Zjg0Y2Q4NywgMHg3YTU4NDcxOCwgMHg3NDA4ZGExNywgMHhiYzlmOWFiYywgMHhlOTRiN2Q4YywgMHhlYzdhZWMzYSwgMHhkYjg1MWRmYSwgMHg2MzA5NDM2NiwgMHhjNDY0YzNkMiwgMHhlZjFjMTg0NywgMHgzMjE1ZDkwOCwgMHhkZDQzM2IzNywgMHgyNGMyYmExNiwgMHgxMmExNGQ0MywgMHgyYTY1YzQ1MSwgMHg1MDk0MDAwMiwgMHgxMzNhZTRkZCwgMHg3MWRmZjg5ZSwgMHgxMDMxNGU1NSwgMHg4MWFjNzdkNiwgMHg1ZjExMTk5YiwgMHgwNDM1NTZmMSwgMHhkN2EzYzc2YiwgMHgzYzExMTgzYiwgMHg1OTI0YTUwOSwgMHhmMjhmZTZlZCwgMHg5N2YxZmJmYSwgMHg5ZWJhYmYyYywgMHgxZTE1M2M2ZSwgMHg4NmUzNDU3MCwgMHhlYWU5NmZiMSwgMHg4NjBlNWUwYSwgMHg1YTNlMmFiMywgMHg3NzFmZTcxYywgMHg0ZTNkMDZmYSwgMHgyOTY1ZGNiOSwgMHg5OWU3MWQwZiwgMHg4MDNlODlkNiwgMHg1MjY2YzgyNSwgMHgyZTRjYzk3OCwgMHg5YzEwYjM2YSwgMHhjNjE1MGViYSwgMHg5NGUyZWE3OCwgMHhhNWZjM2M1MywgMHgxZTBhMmRmNCwgMHhmMmY3NGVhNywgMHgzNjFkMmIzZCwgMHgxOTM5MjYwZiwgMHgxOWMyNzk2MCwgMHg1MjIzYTcwOCwgMHhmNzEzMTJiNiwgMHhlYmFkZmU2ZSwgMHhlYWMzMWY2NiwgMHhlM2JjNDU5NSwgMHhhNjdiYzg4MywgMHhiMTdmMzdkMSwgMHgwMThjZmYyOCwgMHhjMzMyZGRlZiwgMHhiZTZjNWFhNSwgMHg2NTU4MjE4NSwgMHg2OGFiOTgwMiwgMHhlZWNlYTUwZiwgMHhkYjJmOTUzYiwgMHgyYWVmN2RhZCwgMHg1YjZlMmY4NCwgMHgxNTIxYjYyOCwgMHgyOTA3NjE3MCwgMHhlY2RkNDc3NSwgMHg2MTlmMTUxMCwgMHgxM2NjYTgzMCwgMHhlYjYxYmQ5NiwgMHgwMzM0ZmUxZSwgMHhhYTAzNjNjZiwgMHhiNTczNWM5MCwgMHg0YzcwYTIzOSwgMHhkNTllOWUwYiwgMHhjYmFhZGUxNCwgMHhlZWNjODZiYywgMHg2MDYyMmNhNywgMHg5Y2FiNWNhYiwgMHhiMmYzODQ2ZSwgMHg2NDhiMWVhZiwgMHgxOWJkZjBjYSwgMHhhMDIzNjliOSwgMHg2NTVhYmI1MCwgMHg0MDY4NWEzMiwgMHgzYzJhYjRiMywgMHgzMTllZTlkNSwgMHhjMDIxYjhmNywgMHg5YjU0MGIxOSwgMHg4NzVmYTA5OSwgMHg5NWY3OTk3ZSwgMHg2MjNkN2RhOCwgMHhmODM3ODg5YSwgMHg5N2UzMmQ3NywgMHgxMWVkOTM1ZiwgMHgxNjY4MTI4MSwgMHgwZTM1ODgyOSwgMHhjN2U2MWZkNiwgMHg5NmRlZGZhMSwgMHg3ODU4YmE5OSwgMHg1N2Y1ODRhNSwgMHgxYjIyNzI2MywgMHg5YjgzYzNmZiwgMHgxYWMyNDY5NiwgMHhjZGIzMGFlYiwgMHg1MzJlMzA1NCwgMHg4ZmQ5NDhlNCwgMHg2ZGJjMzEyOCwgMHg1OGViZjJlZiwgMHgzNGM2ZmZlYSwgMHhmZTI4ZWQ2MSwgMHhlZTdjM2M3MywgMHg1ZDRhMTRkOSwgMHhlODY0YjdlMywgMHg0MjEwNWQxNCwgMHgyMDNlMTNlMCwgMHg0NWVlZTJiNiwgMHhhM2FhYWJlYSwgMHhkYjZjNGYxNSwgMHhmYWNiNGZkMCwgMHhjNzQyZjQ0MiwgMHhlZjZhYmJiNSwgMHg2NTRmM2IxZCwgMHg0MWNkMjEwNSwgMHhkODFlNzk5ZSwgMHg4Njg1NGRjNywgMHhlNDRiNDc2YSwgMHgzZDgxNjI1MCwgMHhjZjYyYTFmMiwgMHg1YjhkMjY0NiwgMHhmYzg4ODNhMCwgMHhjMWM3YjZhMywgMHg3ZjE1MjRjMywgMHg2OWNiNzQ5MiwgMHg0Nzg0OGEwYiwgMHg1NjkyYjI4NSwgMHgwOTViYmYwMCwgMHhhZDE5NDg5ZCwgMHgxNDYyYjE3NCwgMHgyMzgyMGUwMCwgMHg1ODQyOGQyYSwgMHgwYzU1ZjVlYSwgMHgxZGFkZjQzZSwgMHgyMzNmNzA2MSwgMHgzMzcyZjA5MiwgMHg4ZDkzN2U0MSwgMHhkNjVmZWNmMSwgMHg2YzIyM2JkYiwgMHg3Y2RlMzc1OSwgMHhjYmVlNzQ2MCwgMHg0MDg1ZjJhNywgMHhjZTc3MzI2ZSwgMHhhNjA3ODA4NCwgMHgxOWY4NTA5ZSwgMHhlOGVmZDg1NSwgMHg2MWQ5OTczNSwgMHhhOTY5YTdhYSwgMHhjNTBjMDZjMiwgMHg1YTA0YWJmYywgMHg4MDBiY2FkYywgMHg5ZTQ0N2EyZSwgMHhjMzQ1MzQ4NCwgMHhmZGQ1NjcwNSwgMHgwZTFlOWVjOSwgMHhkYjczZGJkMywgMHgxMDU1ODhjZCwgMHg2NzVmZGE3OSwgMHhlMzY3NDM0MCwgMHhjNWM0MzQ2NSwgMHg3MTNlMzhkOCwgMHgzZDI4Zjg5ZSwgMHhmMTZkZmYyMCwgMHgxNTNlMjFlNywgMHg4ZmIwM2Q0YSwgMHhlNmUzOWYyYiwgMHhkYjgzYWRmN10sIFsweGU5M2Q1YTY4LCAweDk0ODE0MGY3LCAweGY2NGMyNjFjLCAweDk0NjkyOTM0LCAweDQxMTUyMGY3LCAweDc2MDJkNGY3LCAweGJjZjQ2YjJlLCAweGQ0YTIwMDY4LCAweGQ0MDgyNDcxLCAweDMzMjBmNDZhLCAweDQzYjdkNGI3LCAweDUwMDA2MWFmLCAweDFlMzlmNjJlLCAweDk3MjQ0NTQ2LCAweDE0MjE0Zjc0LCAweGJmOGI4ODQwLCAweDRkOTVmYzFkLCAweDk2YjU5MWFmLCAweDcwZjRkZGQzLCAweDY2YTAyZjQ1LCAweGJmYmMwOWVjLCAweDAzYmQ5Nzg1LCAweDdmYWM2ZGQwLCAweDMxY2I4NTA0LCAweDk2ZWIyN2IzLCAweDU1ZmQzOTQxLCAweGRhMjU0N2U2LCAweGFiY2EwYTlhLCAweDI4NTA3ODI1LCAweDUzMDQyOWY0LCAweDBhMmM4NmRhLCAweGU5YjY2ZGZiLCAweDY4ZGMxNDYyLCAweGQ3NDg2OTAwLCAweDY4MGVjMGE0LCAweDI3YTE4ZGVlLCAweDRmM2ZmZWEyLCAweGU4ODdhZDhjLCAweGI1OGNlMDA2LCAweDdhZjRkNmI2LCAweGFhY2UxZTdjLCAweGQzMzc1ZmVjLCAweGNlNzhhMzk5LCAweDQwNmIyYTQyLCAweDIwZmU5ZTM1LCAweGQ5ZjM4NWI5LCAweGVlMzlkN2FiLCAweDNiMTI0ZThiLCAweDFkYzlmYWY3LCAweDRiNmQxODU2LCAweDI2YTM2NjMxLCAweGVhZTM5N2IyLCAweDNhNmVmYTc0LCAweGRkNWI0MzMyLCAweDY4NDFlN2Y3LCAweGNhNzgyMGZiLCAweGZiMGFmNTRlLCAweGQ4ZmViMzk3LCAweDQ1NDA1NmFjLCAweGJhNDg5NTI3LCAweDU1NTMzYTNhLCAweDIwODM4ZDg3LCAweGZlNmJhOWI3LCAweGQwOTY5NTRiLCAweDU1YTg2N2JjLCAweGExMTU5YTU4LCAweGNjYTkyOTYzLCAweDk5ZTFkYjMzLCAweGE2MmE0YTU2LCAweDNmMzEyNWY5LCAweDVlZjQ3ZTFjLCAweDkwMjkzMTdjLCAweGZkZjhlODAyLCAweDA0MjcyZjcwLCAweDgwYmIxNTVjLCAweDA1MjgyY2UzLCAweDk1YzExNTQ4LCAweGU0YzY2ZDIyLCAweDQ4YzExMzNmLCAweGM3MGY4NmRjLCAweDA3ZjljOWVlLCAweDQxMDQxZjBmLCAweDQwNDc3OWE0LCAweDVkODg2ZTE3LCAweDMyNWY1MWViLCAweGQ1OWJjMGQxLCAweGYyYmNjMThmLCAweDQxMTEzNTY0LCAweDI1N2I3ODM0LCAweDYwMmE5YzYwLCAweGRmZjhlOGEzLCAweDFmNjM2YzFiLCAweDBlMTJiNGMyLCAweDAyZTEzMjllLCAweGFmNjY0ZmQxLCAweGNhZDE4MTE1LCAweDZiMjM5NWUwLCAweDMzM2U5MmUxLCAweDNiMjQwYjYyLCAweGVlYmViOTIyLCAweDg1YjJhMjBlLCAweGU2YmEwZDk5LCAweGRlNzIwYzhjLCAweDJkYTJmNzI4LCAweGQwMTI3ODQ1LCAweDk1Yjc5NGZkLCAweDY0N2QwODYyLCAweGU3Y2NmNWYwLCAweDU0NDlhMzZmLCAweDg3N2Q0OGZhLCAweGMzOWRmZDI3LCAweGYzM2U4ZDFlLCAweDBhNDc2MzQxLCAweDk5MmVmZjc0LCAweDNhNmY2ZWFiLCAweGY0ZjhmZDM3LCAweGE4MTJkYzYwLCAweGExZWJkZGY4LCAweDk5MWJlMTRjLCAweGRiNmU2YjBkLCAweGM2N2I1NTEwLCAweDZkNjcyYzM3LCAweDI3NjVkNDNiLCAweGRjZDBlODA0LCAweGYxMjkwZGM3LCAweGNjMDBmZmEzLCAweGI1MzkwZjkyLCAweDY5MGZlZDBiLCAweDY2N2I5ZmZiLCAweGNlZGI3ZDljLCAweGEwOTFjZjBiLCAweGQ5MTU1ZWEzLCAweGJiMTMyZjg4LCAweDUxNWJhZDI0LCAweDdiOTQ3OWJmLCAweDc2M2JkNmViLCAweDM3MzkyZWIzLCAweGNjMTE1OTc5LCAweDgwMjZlMjk3LCAweGY0MmUzMTJkLCAweDY4NDJhZGE3LCAweGM2NmEyYjNiLCAweDEyNzU0Y2NjLCAweDc4MmVmMTFjLCAweDZhMTI0MjM3LCAweGI3OTI1MWU3LCAweDA2YTFiYmU2LCAweDRiZmI2MzUwLCAweDFhNmIxMDE4LCAweDExY2FlZGZhLCAweDNkMjViZGQ4LCAweGUyZTFjM2M5LCAweDQ0NDIxNjU5LCAweDBhMTIxMzg2LCAweGQ5MGNlYzZlLCAweGQ1YWJlYTJhLCAweDY0YWY2NzRlLCAweGRhODZhODVmLCAweGJlYmZlOTg4LCAweDY0ZTRjM2ZlLCAweDlkYmM4MDU3LCAweGYwZjdjMDg2LCAweDYwNzg3YmY4LCAweDYwMDM2MDRkLCAweGQxZmQ4MzQ2LCAweGY2MzgxZmIwLCAweDc3NDVhZTA0LCAweGQ3MzZmY2NjLCAweDgzNDI2YjMzLCAweGYwMWVhYjcxLCAweGIwODA0MTg3LCAweDNjMDA1ZTVmLCAweDc3YTA1N2JlLCAweGJkZThhZTI0LCAweDU1NDY0Mjk5LCAweGJmNTgyZTYxLCAweDRlNThmNDhmLCAweGYyZGRmZGEyLCAweGY0NzRlZjM4LCAweDg3ODliZGMyLCAweDUzNjZmOWMzLCAweGM4YjM4ZTc0LCAweGI0NzVmMjU1LCAweDQ2ZmNkOWI5LCAweDdhZWIyNjYxLCAweDhiMWRkZjg0LCAweDg0NmEwZTc5LCAweDkxNWY5NWUyLCAweDQ2NmU1OThlLCAweDIwYjQ1NzcwLCAweDhjZDU1NTkxLCAweGM5MDJkZTRjLCAweGI5MGJhY2UxLCAweGJiODIwNWQwLCAweDExYTg2MjQ4LCAweDc1NzRhOTllLCAweGI3N2YxOWI2LCAweGUwYTlkYzA5LCAweDY2MmQwOWExLCAweGM0MzI0NjMzLCAweGU4NWExZjAyLCAweDA5ZjBiZThjLCAweDRhOTlhMDI1LCAweDFkNmVmZTEwLCAweDFhYjkzZDFkLCAweDBiYTVhNGRmLCAweGExODZmMjBmLCAweDI4NjhmMTY5LCAweGRjYjdkYTgzLCAweDU3MzkwNmZlLCAweGExZTJjZTliLCAweDRmY2Q3ZjUyLCAweDUwMTE1ZTAxLCAweGE3MDY4M2ZhLCAweGEwMDJiNWM0LCAweDBkZTZkMDI3LCAweDlhZjg4YzI3LCAweDc3M2Y4NjQxLCAweGMzNjA0YzA2LCAweDYxYTgwNmI1LCAweGYwMTc3YTI4LCAweGMwZjU4NmUwLCAweDAwNjA1OGFhLCAweDMwZGM3ZDYyLCAweDExZTY5ZWQ3LCAweDIzMzhlYTYzLCAweDUzYzJkZDk0LCAweGMyYzIxNjM0LCAweGJiY2JlZTU2LCAweDkwYmNiNmRlLCAweGViZmM3ZGExLCAweGNlNTkxZDc2LCAweDZmMDVlNDA5LCAweDRiN2MwMTg4LCAweDM5NzIwYTNkLCAweDdjOTI3YzI0LCAweDg2ZTM3MjVmLCAweDcyNGQ5ZGI5LCAweDFhYzE1YmI0LCAweGQzOWViOGZjLCAweGVkNTQ1NTc4LCAweDA4ZmNhNWI1LCAweGQ4M2Q3Y2QzLCAweDRkYWQwZmM0LCAweDFlNTBlZjVlLCAweGIxNjFlNmY4LCAweGEyODUxNGQ5LCAweDZjNTExMzNjLCAweDZmZDVjN2U3LCAweDU2ZTE0ZWM0LCAweDM2MmFiZmNlLCAweGRkYzZjODM3LCAweGQ3OWEzMjM0LCAweDkyNjM4MjEyLCAweDY3MGVmYThlLCAweDQwNjAwMGUwXSwgWzB4M2EzOWNlMzcsIDB4ZDNmYWY1Y2YsIDB4YWJjMjc3MzcsIDB4NWFjNTJkMWIsIDB4NWNiMDY3OWUsIDB4NGZhMzM3NDIsIDB4ZDM4MjI3NDAsIDB4OTliYzliYmUsIDB4ZDUxMThlOWQsIDB4YmYwZjczMTUsIDB4ZDYyZDFjN2UsIDB4YzcwMGM0N2IsIDB4Yjc4YzFiNmIsIDB4MjFhMTkwNDUsIDB4YjI2ZWIxYmUsIDB4NmEzNjZlYjQsIDB4NTc0OGFiMmYsIDB4YmM5NDZlNzksIDB4YzZhMzc2ZDIsIDB4NjU0OWMyYzgsIDB4NTMwZmY4ZWUsIDB4NDY4ZGRlN2QsIDB4ZDU3MzBhMWQsIDB4NGNkMDRkYzYsIDB4MjkzOWJiZGIsIDB4YTliYTQ2NTAsIDB4YWM5NTI2ZTgsIDB4YmU1ZWUzMDQsIDB4YTFmYWQ1ZjAsIDB4NmEyZDUxOWEsIDB4NjNlZjhjZTIsIDB4OWE4NmVlMjIsIDB4YzA4OWMyYjgsIDB4NDMyNDJlZjYsIDB4YTUxZTAzYWEsIDB4OWNmMmQwYTQsIDB4ODNjMDYxYmEsIDB4OWJlOTZhNGQsIDB4OGZlNTE1NTAsIDB4YmE2NDViZDYsIDB4MjgyNmEyZjksIDB4YTczYTNhZTEsIDB4NGJhOTk1ODYsIDB4ZWY1NTYyZTksIDB4YzcyZmVmZDMsIDB4Zjc1MmY3ZGEsIDB4M2YwNDZmNjksIDB4NzdmYTBhNTksIDB4ODBlNGE5MTUsIDB4ODdiMDg2MDEsIDB4OWIwOWU2YWQsIDB4M2IzZWU1OTMsIDB4ZTk5MGZkNWEsIDB4OWUzNGQ3OTcsIDB4MmNmMGI3ZDksIDB4MDIyYjhiNTEsIDB4OTZkNWFjM2EsIDB4MDE3ZGE2N2QsIDB4ZDFjZjNlZDYsIDB4N2M3ZDJkMjgsIDB4MWY5ZjI1Y2YsIDB4YWRmMmI4OWIsIDB4NWFkNmI0NzIsIDB4NWE4OGY1NGMsIDB4ZTAyOWFjNzEsIDB4ZTAxOWE1ZTYsIDB4NDdiMGFjZmQsIDB4ZWQ5M2ZhOWIsIDB4ZThkM2M0OGQsIDB4MjgzYjU3Y2MsIDB4ZjhkNTY2MjksIDB4NzkxMzJlMjgsIDB4Nzg1ZjAxOTEsIDB4ZWQ3NTYwNTUsIDB4Zjc5NjBlNDQsIDB4ZTNkMzVlOGMsIDB4MTUwNTZkZDQsIDB4ODhmNDZkYmEsIDB4MDNhMTYxMjUsIDB4MDU2NGYwYmQsIDB4YzNlYjllMTUsIDB4M2M5MDU3YTIsIDB4OTcyNzFhZWMsIDB4YTkzYTA3MmEsIDB4MWIzZjZkOWIsIDB4MWU2MzIxZjUsIDB4ZjU5YzY2ZmIsIDB4MjZkY2YzMTksIDB4NzUzM2Q5MjgsIDB4YjE1NWZkZjUsIDB4MDM1NjM0ODIsIDB4OGFiYTNjYmIsIDB4Mjg1MTc3MTEsIDB4YzIwYWQ5ZjgsIDB4YWJjYzUxNjcsIDB4Y2NhZDkyNWYsIDB4NGRlODE3NTEsIDB4MzgzMGRjOGUsIDB4Mzc5ZDU4NjIsIDB4OTMyMGY5OTEsIDB4ZWE3YTkwYzIsIDB4ZmIzZTdiY2UsIDB4NTEyMWNlNjQsIDB4Nzc0ZmJlMzIsIDB4YThiNmUzN2UsIDB4YzMyOTNkNDYsIDB4NDhkZTUzNjksIDB4NjQxM2U2ODAsIDB4YTJhZTA4MTAsIDB4ZGQ2ZGIyMjQsIDB4Njk4NTJkZmQsIDB4MDkwNzIxNjYsIDB4YjM5YTQ2MGEsIDB4NjQ0NWMwZGQsIDB4NTg2Y2RlY2YsIDB4MWMyMGM4YWUsIDB4NWJiZWY3ZGQsIDB4MWI1ODhkNDAsIDB4Y2NkMjAxN2YsIDB4NmJiNGUzYmIsIDB4ZGRhMjZhN2UsIDB4M2E1OWZmNDUsIDB4M2UzNTBhNDQsIDB4YmNiNGNkZDUsIDB4NzJlYWNlYTgsIDB4ZmE2NDg0YmIsIDB4OGQ2NjEyYWUsIDB4YmYzYzZmNDcsIDB4ZDI5YmU0NjMsIDB4NTQyZjVkOWUsIDB4YWVjMjc3MWIsIDB4ZjY0ZTYzNzAsIDB4NzQwZTBkOGQsIDB4ZTc1YjEzNTcsIDB4Zjg3MjE2NzEsIDB4YWY1MzdkNWQsIDB4NDA0MGNiMDgsIDB4NGViNGUyY2MsIDB4MzRkMjQ2NmEsIDB4MDExNWFmODQsIDB4ZTFiMDA0MjgsIDB4OTU5ODNhMWQsIDB4MDZiODlmYjQsIDB4Y2U2ZWEwNDgsIDB4NmYzZjNiODIsIDB4MzUyMGFiODIsIDB4MDExYTFkNGIsIDB4Mjc3MjI3ZjgsIDB4NjExNTYwYjEsIDB4ZTc5MzNmZGMsIDB4YmIzYTc5MmIsIDB4MzQ0NTI1YmQsIDB4YTA4ODM5ZTEsIDB4NTFjZTc5NGIsIDB4MmYzMmM5YjcsIDB4YTAxZmJhYzksIDB4ZTAxY2M4N2UsIDB4YmNjN2QxZjYsIDB4Y2YwMTExYzMsIDB4YTFlOGFhYzcsIDB4MWE5MDg3NDksIDB4ZDQ0ZmJkOWEsIDB4ZDBkYWRlY2IsIDB4ZDUwYWRhMzgsIDB4MDMzOWMzMmEsIDB4YzY5MTM2NjcsIDB4OGRmOTMxN2MsIDB4ZTBiMTJiNGYsIDB4Zjc5ZTU5YjcsIDB4NDNmNWJiM2EsIDB4ZjJkNTE5ZmYsIDB4MjdkOTQ1OWMsIDB4YmY5NzIyMmMsIDB4MTVlNmZjMmEsIDB4MGY5MWZjNzEsIDB4OWI5NDE1MjUsIDB4ZmFlNTkzNjEsIDB4Y2ViNjljZWIsIDB4YzJhODY0NTksIDB4MTJiYWE4ZDEsIDB4YjZjMTA3NWUsIDB4ZTMwNTZhMGMsIDB4MTBkMjUwNjUsIDB4Y2IwM2E0NDIsIDB4ZTBlYzZlMGUsIDB4MTY5OGRiM2IsIDB4NGM5OGEwYmUsIDB4MzI3OGU5NjQsIDB4OWYxZjk1MzIsIDB4ZTBkMzkyZGYsIDB4ZDNhMDM0MmIsIDB4ODk3MWYyMWUsIDB4MWIwYTc0NDEsIDB4NGJhMzM0OGMsIDB4YzViZTcxMjAsIDB4YzM3NjMyZDgsIDB4ZGYzNTlmOGQsIDB4OWI5OTJmMmUsIDB4ZTYwYjZmNDcsIDB4MGZlM2YxMWQsIDB4ZTU0Y2RhNTQsIDB4MWVkYWQ4OTEsIDB4Y2U2Mjc5Y2YsIDB4Y2QzZTdlNmYsIDB4MTYxOGIxNjYsIDB4ZmQyYzFkMDUsIDB4ODQ4ZmQyYzUsIDB4ZjZmYjIyOTksIDB4ZjUyM2YzNTcsIDB4YTYzMjc2MjMsIDB4OTNhODM1MzEsIDB4NTZjY2NkMDIsIDB4YWNmMDgxNjIsIDB4NWE3NWViYjUsIDB4NmUxNjM2OTcsIDB4ODhkMjczY2MsIDB4ZGU5NjYyOTIsIDB4ODFiOTQ5ZDAsIDB4NGM1MDkwMWIsIDB4NzFjNjU2MTQsIDB4ZTZjNmM3YmQsIDB4MzI3YTE0MGEsIDB4NDVlMWQwMDYsIDB4YzNmMjdiOWEsIDB4YzlhYTUzZmQsIDB4NjJhODBmMDAsIDB4YmIyNWJmZTIsIDB4MzViZGQyZjYsIDB4NzExMjY5MDUsIDB4YjIwNDAyMjIsIDB4YjZjYmNmN2MsIDB4Y2Q3NjljMmIsIDB4NTMxMTNlYzAsIDB4MTY0MGUzZDMsIDB4MzhhYmJkNjAsIDB4MjU0N2FkZjAsIDB4YmEzODIwOWMsIDB4Zjc0NmNlNzYsIDB4NzdhZmExYzUsIDB4MjA3NTYwNjAsIDB4ODVjYmZlNGUsIDB4OGFlODhkZDgsIDB4N2FhYWY5YjAsIDB4NGNmOWFhN2UsIDB4MTk0OGMyNWMsIDB4MDJmYjhhOGMsIDB4MDFjMzZhZTQsIDB4ZDZlYmUxZjksIDB4OTBkNGY4NjksIDB4YTY1Y2RlYTAsIDB4M2YwOTI1MmQsIDB4YzIwOGU2OWYsIDB4Yjc0ZTYxMzIsIDB4Y2U3N2UyNWIsIDB4NTc4ZmRmZTMsIDB4M2FjMzcyZTZdXTtcblxuLy8qXG4vLyogVGhpcyBpcyB0aGUgZGVmYXVsdCBQQVJSQVlcbi8vKlxuQmxvd2Zpc2gucHJvdG90eXBlLlBBUlJBWSA9IFsweDI0M2Y2YTg4LCAweDg1YTMwOGQzLCAweDEzMTk4YTJlLCAweDAzNzA3MzQ0LCAweGE0MDkzODIyLCAweDI5OWYzMWQwLCAweDA4MmVmYTk4LCAweGVjNGU2Yzg5LCAweDQ1MjgyMWU2LCAweDM4ZDAxMzc3LCAweGJlNTQ2NmNmLCAweDM0ZTkwYzZjLCAweGMwYWMyOWI3LCAweGM5N2M1MGRkLCAweDNmODRkNWI1LCAweGI1NDcwOTE3LCAweDkyMTZkNWQ5LCAweDg5NzlmYjFiXTtcblxuLy8qXG4vLyogVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHJvdW5kcyB0aGUgY2lwaGVyIHdpbGwgZ29cbi8vKlxuQmxvd2Zpc2gucHJvdG90eXBlLk5OID0gMTY7XG5cbi8vKlxuLy8qIFRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkIHRvIGdldCByaWQgb2YgcHJvYmxlbXNcbi8vKiB3aXRoIHRoZSBoaWdoLWJpdCBnZXR0aW5nIHNldC4gIElmIHdlIGRvbid0IGRvXG4vLyogdGhpcywgdGhlbiBzb21ldGltZXMgKCBhYSAmIDB4MDBGRkZGRkZGRiApIGlzIG5vdFxuLy8qIGVxdWFsIHRvICggYmIgJiAweDAwRkZGRkZGRkYgKSBldmVuIHdoZW4gdGhleVxuLy8qIGFncmVlIGJpdC1mb3ItYml0IGZvciB0aGUgZmlyc3QgMzIgYml0cy5cbi8vKlxuQmxvd2Zpc2gucHJvdG90eXBlLl9jbGVhbiA9IGZ1bmN0aW9uICh4eCkge1xuICBpZiAoeHggPCAwKSB7XG4gICAgdmFyIHl5ID0geHggJiAweDdGRkZGRkZGO1xuICAgIHh4ID0geXkgKyAweDgwMDAwMDAwO1xuICB9XG4gIHJldHVybiB4eDtcbn07XG5cbi8vKlxuLy8qIFRoaXMgaXMgdGhlIG1peGluZyBmdW5jdGlvbiB0aGF0IHVzZXMgdGhlIHNib3hlc1xuLy8qXG5CbG93ZmlzaC5wcm90b3R5cGUuX0YgPSBmdW5jdGlvbiAoeHgpIHtcbiAgdmFyIHl5ID0gdm9pZCAwO1xuXG4gIHZhciBkZCA9IHh4ICYgMHgwMEZGO1xuICB4eCA+Pj49IDg7XG4gIHZhciBjYyA9IHh4ICYgMHgwMEZGO1xuICB4eCA+Pj49IDg7XG4gIHZhciBiYiA9IHh4ICYgMHgwMEZGO1xuICB4eCA+Pj49IDg7XG4gIHZhciBhYSA9IHh4ICYgMHgwMEZGO1xuXG4gIHl5ID0gdGhpcy5zYm94ZXNbMF1bYWFdICsgdGhpcy5zYm94ZXNbMV1bYmJdO1xuICB5eSBePSB0aGlzLnNib3hlc1syXVtjY107XG4gIHl5ICs9IHRoaXMuc2JveGVzWzNdW2RkXTtcblxuICByZXR1cm4geXk7XG59O1xuXG4vLypcbi8vKiBUaGlzIG1ldGhvZCB0YWtlcyBhbiBhcnJheSB3aXRoIHR3byB2YWx1ZXMsIGxlZnQgYW5kIHJpZ2h0XG4vLyogYW5kIGRvZXMgTk4gcm91bmRzIG9mIEJsb3dmaXNoIG9uIHRoZW0uXG4vLypcbkJsb3dmaXNoLnByb3RvdHlwZS5fZW5jcnlwdF9ibG9jayA9IGZ1bmN0aW9uICh2YWxzKSB7XG4gIHZhciBkYXRhTCA9IHZhbHNbMF07XG4gIHZhciBkYXRhUiA9IHZhbHNbMV07XG5cbiAgdmFyIGlpID0gdm9pZCAwO1xuXG4gIGZvciAoaWkgPSAwOyBpaSA8IHRoaXMuTk47ICsraWkpIHtcbiAgICBkYXRhTCBePSB0aGlzLnBhcnJheVtpaV07XG4gICAgZGF0YVIgPSB0aGlzLl9GKGRhdGFMKSBeIGRhdGFSO1xuXG4gICAgdmFyIHRtcCA9IGRhdGFMO1xuICAgIGRhdGFMID0gZGF0YVI7XG4gICAgZGF0YVIgPSB0bXA7XG4gIH1cblxuICBkYXRhTCBePSB0aGlzLnBhcnJheVt0aGlzLk5OICsgMF07XG4gIGRhdGFSIF49IHRoaXMucGFycmF5W3RoaXMuTk4gKyAxXTtcblxuICB2YWxzWzBdID0gdGhpcy5fY2xlYW4oZGF0YVIpO1xuICB2YWxzWzFdID0gdGhpcy5fY2xlYW4oZGF0YUwpO1xufTtcblxuLy8qXG4vLyogVGhpcyBtZXRob2QgdGFrZXMgYSB2ZWN0b3Igb2YgbnVtYmVycyBhbmQgdHVybnMgdGhlbVxuLy8qIGludG8gbG9uZyB3b3JkcyBzbyB0aGF0IHRoZXkgY2FuIGJlIHByb2Nlc3NlZCBieSB0aGVcbi8vKiByZWFsIGFsZ29yaXRobS5cbi8vKlxuLy8qIE1heWJlIEkgc2hvdWxkIG1ha2UgdGhlIHJlYWwgYWxnb3JpdGhtIGFib3ZlIHRha2UgYSB2ZWN0b3Jcbi8vKiBpbnN0ZWFkLiAgVGhhdCB3aWxsIGludm9sdmUgbW9yZSBsb29waW5nLCBidXQgaXQgd29uJ3QgcmVxdWlyZVxuLy8qIHRoZSBGKCkgbWV0aG9kIHRvIGRlY29uc3RydWN0IHRoZSB2ZWN0b3IuXG4vLypcbkJsb3dmaXNoLnByb3RvdHlwZS5lbmNyeXB0X2Jsb2NrID0gZnVuY3Rpb24gKHZlY3Rvcikge1xuICB2YXIgaWkgPSB2b2lkIDA7XG4gIHZhciB2YWxzID0gWzAsIDBdO1xuICB2YXIgb2ZmID0gdGhpcy5CTE9DS1NJWkUgLyAyO1xuICBmb3IgKGlpID0gMDsgaWkgPCB0aGlzLkJMT0NLU0laRSAvIDI7ICsraWkpIHtcbiAgICB2YWxzWzBdID0gdmFsc1swXSA8PCA4IHwgdmVjdG9yW2lpICsgMF0gJiAweDAwRkY7XG4gICAgdmFsc1sxXSA9IHZhbHNbMV0gPDwgOCB8IHZlY3RvcltpaSArIG9mZl0gJiAweDAwRkY7XG4gIH1cblxuICB0aGlzLl9lbmNyeXB0X2Jsb2NrKHZhbHMpO1xuXG4gIHZhciByZXQgPSBbXTtcbiAgZm9yIChpaSA9IDA7IGlpIDwgdGhpcy5CTE9DS1NJWkUgLyAyOyArK2lpKSB7XG4gICAgcmV0W2lpICsgMF0gPSB2YWxzWzBdID4+PiAyNCAtIDggKiBpaSAmIDB4MDBGRjtcbiAgICByZXRbaWkgKyBvZmZdID0gdmFsc1sxXSA+Pj4gMjQgLSA4ICogaWkgJiAweDAwRkY7XG4gICAgLy8gdmFsc1sgMCBdID0gKCB2YWxzWyAwIF0gPj4+IDggKTtcbiAgICAvLyB2YWxzWyAxIF0gPSAoIHZhbHNbIDEgXSA+Pj4gOCApO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vKlxuLy8qIFRoaXMgbWV0aG9kIHRha2VzIGFuIGFycmF5IHdpdGggdHdvIHZhbHVlcywgbGVmdCBhbmQgcmlnaHRcbi8vKiBhbmQgdW5kb2VzIE5OIHJvdW5kcyBvZiBCbG93ZmlzaCBvbiB0aGVtLlxuLy8qXG5CbG93ZmlzaC5wcm90b3R5cGUuX2RlY3J5cHRfYmxvY2sgPSBmdW5jdGlvbiAodmFscykge1xuICB2YXIgZGF0YUwgPSB2YWxzWzBdO1xuICB2YXIgZGF0YVIgPSB2YWxzWzFdO1xuXG4gIHZhciBpaSA9IHZvaWQgMDtcblxuICBmb3IgKGlpID0gdGhpcy5OTiArIDE7IGlpID4gMTsgLS1paSkge1xuICAgIGRhdGFMIF49IHRoaXMucGFycmF5W2lpXTtcbiAgICBkYXRhUiA9IHRoaXMuX0YoZGF0YUwpIF4gZGF0YVI7XG5cbiAgICB2YXIgdG1wID0gZGF0YUw7XG4gICAgZGF0YUwgPSBkYXRhUjtcbiAgICBkYXRhUiA9IHRtcDtcbiAgfVxuXG4gIGRhdGFMIF49IHRoaXMucGFycmF5WzFdO1xuICBkYXRhUiBePSB0aGlzLnBhcnJheVswXTtcblxuICB2YWxzWzBdID0gdGhpcy5fY2xlYW4oZGF0YVIpO1xuICB2YWxzWzFdID0gdGhpcy5fY2xlYW4oZGF0YUwpO1xufTtcblxuLy8qXG4vLyogVGhpcyBtZXRob2QgdGFrZXMgYSBrZXkgYXJyYXkgYW5kIGluaXRpYWxpemVzIHRoZVxuLy8qIHNib3hlcyBhbmQgcGFycmF5IGZvciB0aGlzIGVuY3J5cHRpb24uXG4vLypcbkJsb3dmaXNoLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgaWkgPSB2b2lkIDA7XG4gIHZhciBqaiA9IDA7XG5cbiAgdGhpcy5wYXJyYXkgPSBbXTtcbiAgZm9yIChpaSA9IDA7IGlpIDwgdGhpcy5OTiArIDI7ICsraWkpIHtcbiAgICB2YXIgZGF0YSA9IDB4MDAwMDAwMDA7XG4gICAgZm9yICh2YXIga2sgPSAwOyBrayA8IDQ7ICsra2spIHtcbiAgICAgIGRhdGEgPSBkYXRhIDw8IDggfCBrZXlbampdICYgMHgwMEZGO1xuICAgICAgaWYgKCsramogPj0ga2V5Lmxlbmd0aCkge1xuICAgICAgICBqaiA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucGFycmF5W2lpXSA9IHRoaXMuUEFSUkFZW2lpXSBeIGRhdGE7XG4gIH1cblxuICB0aGlzLnNib3hlcyA9IFtdO1xuICBmb3IgKGlpID0gMDsgaWkgPCA0OyArK2lpKSB7XG4gICAgdGhpcy5zYm94ZXNbaWldID0gW107XG4gICAgZm9yIChqaiA9IDA7IGpqIDwgMjU2OyArK2pqKSB7XG4gICAgICB0aGlzLnNib3hlc1tpaV1bampdID0gdGhpcy5TQk9YRVNbaWldW2pqXTtcbiAgICB9XG4gIH1cblxuICB2YXIgdmFscyA9IFsweDAwMDAwMDAwLCAweDAwMDAwMDAwXTtcblxuICBmb3IgKGlpID0gMDsgaWkgPCB0aGlzLk5OICsgMjsgaWkgKz0gMikge1xuICAgIHRoaXMuX2VuY3J5cHRfYmxvY2sodmFscyk7XG4gICAgdGhpcy5wYXJyYXlbaWkgKyAwXSA9IHZhbHNbMF07XG4gICAgdGhpcy5wYXJyYXlbaWkgKyAxXSA9IHZhbHNbMV07XG4gIH1cblxuICBmb3IgKGlpID0gMDsgaWkgPCA0OyArK2lpKSB7XG4gICAgZm9yIChqaiA9IDA7IGpqIDwgMjU2OyBqaiArPSAyKSB7XG4gICAgICB0aGlzLl9lbmNyeXB0X2Jsb2NrKHZhbHMpO1xuICAgICAgdGhpcy5zYm94ZXNbaWldW2pqICsgMF0gPSB2YWxzWzBdO1xuICAgICAgdGhpcy5zYm94ZXNbaWldW2pqICsgMV0gPSB2YWxzWzFdO1xuICAgIH1cbiAgfVxufTtcblxuLy8gYWRkZWQgYnkgUmVjdXJpdHkgTGFic1xuZnVuY3Rpb24gQkYoa2V5KSB7XG4gIHRoaXMuYmYgPSBuZXcgQmxvd2Zpc2goKTtcbiAgdGhpcy5iZi5pbml0KGtleSk7XG5cbiAgdGhpcy5lbmNyeXB0ID0gZnVuY3Rpb24gKGJsb2NrKSB7XG4gICAgcmV0dXJuIHRoaXMuYmYuZW5jcnlwdF9ibG9jayhibG9jayk7XG4gIH07XG59XG5cbkJGLmtleVNpemUgPSBCRi5wcm90b3R5cGUua2V5U2l6ZSA9IDE2O1xuQkYuYmxvY2tTaXplID0gQkYucHJvdG90eXBlLmJsb2NrU2l6ZSA9IDE2O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBCRjtcblxufSx7fV0sMzMwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlXG4vLyBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG5cbi8vIENvcHlyaWdodCAyMDEwIHBqYWNvYnNAeGVla3IuY29tIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuLy8gTW9kaWZpZWQgYnkgUmVjdXJpdHkgTGFicyBHbWJIXG5cbi8vIGZpeGVkL21vZGlmaWVkIGJ5IEhlcmJlcnQgSGFuZXdpbmtlbCwgd3d3LmhhbmVXSU4uZGVcbi8vIGNoZWNrIHd3dy5oYW5lV0lOLmRlIGZvciB0aGUgbGF0ZXN0IHZlcnNpb25cblxuLy8gY2FzdDUuanMgaXMgYSBKYXZhc2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIENBU1QtMTI4LCBhcyBkZWZpbmVkIGluIFJGQyAyMTQ0LlxuLy8gQ0FTVC0xMjggaXMgYSBjb21tb24gT3BlblBHUCBjaXBoZXIuXG5cblxuLy8gQ0FTVDUgY29uc3RydWN0b3JcblxuZnVuY3Rpb24gT3BlbnBncFN5bWVuY0Nhc3Q1KCkge1xuICB0aGlzLkJsb2NrU2l6ZSA9IDg7XG4gIHRoaXMuS2V5U2l6ZSA9IDE2O1xuXG4gIHRoaXMuc2V0S2V5ID0gZnVuY3Rpb24gKGtleSkge1xuICAgIHRoaXMubWFza2luZyA9IG5ldyBBcnJheSgxNik7XG4gICAgdGhpcy5yb3RhdGUgPSBuZXcgQXJyYXkoMTYpO1xuXG4gICAgdGhpcy5yZXNldCgpO1xuXG4gICAgaWYgKGtleS5sZW5ndGggPT09IHRoaXMuS2V5U2l6ZSkge1xuICAgICAgdGhpcy5rZXlTY2hlZHVsZShrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NBU1QtMTI4OiBrZXlzIG11c3QgYmUgMTYgYnl0ZXMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgdGhpcy5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgIHRoaXMubWFza2luZ1tpXSA9IDA7XG4gICAgICB0aGlzLnJvdGF0ZVtpXSA9IDA7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuZ2V0QmxvY2tTaXplID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLkJsb2NrU2l6ZTtcbiAgfTtcblxuICB0aGlzLmVuY3J5cHQgPSBmdW5jdGlvbiAoc3JjKSB7XG4gICAgdmFyIGRzdCA9IG5ldyBBcnJheShzcmMubGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSArPSA4KSB7XG4gICAgICB2YXIgbCA9IHNyY1tpXSA8PCAyNCB8IHNyY1tpICsgMV0gPDwgMTYgfCBzcmNbaSArIDJdIDw8IDggfCBzcmNbaSArIDNdO1xuICAgICAgdmFyIHIgPSBzcmNbaSArIDRdIDw8IDI0IHwgc3JjW2kgKyA1XSA8PCAxNiB8IHNyY1tpICsgNl0gPDwgOCB8IHNyY1tpICsgN107XG4gICAgICB2YXIgdCA9IHZvaWQgMDtcblxuICAgICAgdCA9IHI7XG4gICAgICByID0gbCBeIGYxKHIsIHRoaXMubWFza2luZ1swXSwgdGhpcy5yb3RhdGVbMF0pO1xuICAgICAgbCA9IHQ7XG4gICAgICB0ID0gcjtcbiAgICAgIHIgPSBsIF4gZjIociwgdGhpcy5tYXNraW5nWzFdLCB0aGlzLnJvdGF0ZVsxXSk7XG4gICAgICBsID0gdDtcbiAgICAgIHQgPSByO1xuICAgICAgciA9IGwgXiBmMyhyLCB0aGlzLm1hc2tpbmdbMl0sIHRoaXMucm90YXRlWzJdKTtcbiAgICAgIGwgPSB0O1xuICAgICAgdCA9IHI7XG4gICAgICByID0gbCBeIGYxKHIsIHRoaXMubWFza2luZ1szXSwgdGhpcy5yb3RhdGVbM10pO1xuICAgICAgbCA9IHQ7XG5cbiAgICAgIHQgPSByO1xuICAgICAgciA9IGwgXiBmMihyLCB0aGlzLm1hc2tpbmdbNF0sIHRoaXMucm90YXRlWzRdKTtcbiAgICAgIGwgPSB0O1xuICAgICAgdCA9IHI7XG4gICAgICByID0gbCBeIGYzKHIsIHRoaXMubWFza2luZ1s1XSwgdGhpcy5yb3RhdGVbNV0pO1xuICAgICAgbCA9IHQ7XG4gICAgICB0ID0gcjtcbiAgICAgIHIgPSBsIF4gZjEociwgdGhpcy5tYXNraW5nWzZdLCB0aGlzLnJvdGF0ZVs2XSk7XG4gICAgICBsID0gdDtcbiAgICAgIHQgPSByO1xuICAgICAgciA9IGwgXiBmMihyLCB0aGlzLm1hc2tpbmdbN10sIHRoaXMucm90YXRlWzddKTtcbiAgICAgIGwgPSB0O1xuXG4gICAgICB0ID0gcjtcbiAgICAgIHIgPSBsIF4gZjMociwgdGhpcy5tYXNraW5nWzhdLCB0aGlzLnJvdGF0ZVs4XSk7XG4gICAgICBsID0gdDtcbiAgICAgIHQgPSByO1xuICAgICAgciA9IGwgXiBmMShyLCB0aGlzLm1hc2tpbmdbOV0sIHRoaXMucm90YXRlWzldKTtcbiAgICAgIGwgPSB0O1xuICAgICAgdCA9IHI7XG4gICAgICByID0gbCBeIGYyKHIsIHRoaXMubWFza2luZ1sxMF0sIHRoaXMucm90YXRlWzEwXSk7XG4gICAgICBsID0gdDtcbiAgICAgIHQgPSByO1xuICAgICAgciA9IGwgXiBmMyhyLCB0aGlzLm1hc2tpbmdbMTFdLCB0aGlzLnJvdGF0ZVsxMV0pO1xuICAgICAgbCA9IHQ7XG5cbiAgICAgIHQgPSByO1xuICAgICAgciA9IGwgXiBmMShyLCB0aGlzLm1hc2tpbmdbMTJdLCB0aGlzLnJvdGF0ZVsxMl0pO1xuICAgICAgbCA9IHQ7XG4gICAgICB0ID0gcjtcbiAgICAgIHIgPSBsIF4gZjIociwgdGhpcy5tYXNraW5nWzEzXSwgdGhpcy5yb3RhdGVbMTNdKTtcbiAgICAgIGwgPSB0O1xuICAgICAgdCA9IHI7XG4gICAgICByID0gbCBeIGYzKHIsIHRoaXMubWFza2luZ1sxNF0sIHRoaXMucm90YXRlWzE0XSk7XG4gICAgICBsID0gdDtcbiAgICAgIHQgPSByO1xuICAgICAgciA9IGwgXiBmMShyLCB0aGlzLm1hc2tpbmdbMTVdLCB0aGlzLnJvdGF0ZVsxNV0pO1xuICAgICAgbCA9IHQ7XG5cbiAgICAgIGRzdFtpXSA9IHIgPj4+IDI0ICYgMjU1O1xuICAgICAgZHN0W2kgKyAxXSA9IHIgPj4+IDE2ICYgMjU1O1xuICAgICAgZHN0W2kgKyAyXSA9IHIgPj4+IDggJiAyNTU7XG4gICAgICBkc3RbaSArIDNdID0gciAmIDI1NTtcbiAgICAgIGRzdFtpICsgNF0gPSBsID4+PiAyNCAmIDI1NTtcbiAgICAgIGRzdFtpICsgNV0gPSBsID4+PiAxNiAmIDI1NTtcbiAgICAgIGRzdFtpICsgNl0gPSBsID4+PiA4ICYgMjU1O1xuICAgICAgZHN0W2kgKyA3XSA9IGwgJiAyNTU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRzdDtcbiAgfTtcblxuICB0aGlzLmRlY3J5cHQgPSBmdW5jdGlvbiAoc3JjKSB7XG4gICAgdmFyIGRzdCA9IG5ldyBBcnJheShzcmMubGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSArPSA4KSB7XG4gICAgICB2YXIgbCA9IHNyY1tpXSA8PCAyNCB8IHNyY1tpICsgMV0gPDwgMTYgfCBzcmNbaSArIDJdIDw8IDggfCBzcmNbaSArIDNdO1xuICAgICAgdmFyIHIgPSBzcmNbaSArIDRdIDw8IDI0IHwgc3JjW2kgKyA1XSA8PCAxNiB8IHNyY1tpICsgNl0gPDwgOCB8IHNyY1tpICsgN107XG4gICAgICB2YXIgdCA9IHZvaWQgMDtcblxuICAgICAgdCA9IHI7XG4gICAgICByID0gbCBeIGYxKHIsIHRoaXMubWFza2luZ1sxNV0sIHRoaXMucm90YXRlWzE1XSk7XG4gICAgICBsID0gdDtcbiAgICAgIHQgPSByO1xuICAgICAgciA9IGwgXiBmMyhyLCB0aGlzLm1hc2tpbmdbMTRdLCB0aGlzLnJvdGF0ZVsxNF0pO1xuICAgICAgbCA9IHQ7XG4gICAgICB0ID0gcjtcbiAgICAgIHIgPSBsIF4gZjIociwgdGhpcy5tYXNraW5nWzEzXSwgdGhpcy5yb3RhdGVbMTNdKTtcbiAgICAgIGwgPSB0O1xuICAgICAgdCA9IHI7XG4gICAgICByID0gbCBeIGYxKHIsIHRoaXMubWFza2luZ1sxMl0sIHRoaXMucm90YXRlWzEyXSk7XG4gICAgICBsID0gdDtcblxuICAgICAgdCA9IHI7XG4gICAgICByID0gbCBeIGYzKHIsIHRoaXMubWFza2luZ1sxMV0sIHRoaXMucm90YXRlWzExXSk7XG4gICAgICBsID0gdDtcbiAgICAgIHQgPSByO1xuICAgICAgciA9IGwgXiBmMihyLCB0aGlzLm1hc2tpbmdbMTBdLCB0aGlzLnJvdGF0ZVsxMF0pO1xuICAgICAgbCA9IHQ7XG4gICAgICB0ID0gcjtcbiAgICAgIHIgPSBsIF4gZjEociwgdGhpcy5tYXNraW5nWzldLCB0aGlzLnJvdGF0ZVs5XSk7XG4gICAgICBsID0gdDtcbiAgICAgIHQgPSByO1xuICAgICAgciA9IGwgXiBmMyhyLCB0aGlzLm1hc2tpbmdbOF0sIHRoaXMucm90YXRlWzhdKTtcbiAgICAgIGwgPSB0O1xuXG4gICAgICB0ID0gcjtcbiAgICAgIHIgPSBsIF4gZjIociwgdGhpcy5tYXNraW5nWzddLCB0aGlzLnJvdGF0ZVs3XSk7XG4gICAgICBsID0gdDtcbiAgICAgIHQgPSByO1xuICAgICAgciA9IGwgXiBmMShyLCB0aGlzLm1hc2tpbmdbNl0sIHRoaXMucm90YXRlWzZdKTtcbiAgICAgIGwgPSB0O1xuICAgICAgdCA9IHI7XG4gICAgICByID0gbCBeIGYzKHIsIHRoaXMubWFza2luZ1s1XSwgdGhpcy5yb3RhdGVbNV0pO1xuICAgICAgbCA9IHQ7XG4gICAgICB0ID0gcjtcbiAgICAgIHIgPSBsIF4gZjIociwgdGhpcy5tYXNraW5nWzRdLCB0aGlzLnJvdGF0ZVs0XSk7XG4gICAgICBsID0gdDtcblxuICAgICAgdCA9IHI7XG4gICAgICByID0gbCBeIGYxKHIsIHRoaXMubWFza2luZ1szXSwgdGhpcy5yb3RhdGVbM10pO1xuICAgICAgbCA9IHQ7XG4gICAgICB0ID0gcjtcbiAgICAgIHIgPSBsIF4gZjMociwgdGhpcy5tYXNraW5nWzJdLCB0aGlzLnJvdGF0ZVsyXSk7XG4gICAgICBsID0gdDtcbiAgICAgIHQgPSByO1xuICAgICAgciA9IGwgXiBmMihyLCB0aGlzLm1hc2tpbmdbMV0sIHRoaXMucm90YXRlWzFdKTtcbiAgICAgIGwgPSB0O1xuICAgICAgdCA9IHI7XG4gICAgICByID0gbCBeIGYxKHIsIHRoaXMubWFza2luZ1swXSwgdGhpcy5yb3RhdGVbMF0pO1xuICAgICAgbCA9IHQ7XG5cbiAgICAgIGRzdFtpXSA9IHIgPj4+IDI0ICYgMjU1O1xuICAgICAgZHN0W2kgKyAxXSA9IHIgPj4+IDE2ICYgMjU1O1xuICAgICAgZHN0W2kgKyAyXSA9IHIgPj4+IDggJiAyNTU7XG4gICAgICBkc3RbaSArIDNdID0gciAmIDI1NTtcbiAgICAgIGRzdFtpICsgNF0gPSBsID4+PiAyNCAmIDI1NTtcbiAgICAgIGRzdFtpICsgNV0gPSBsID4+IDE2ICYgMjU1O1xuICAgICAgZHN0W2kgKyA2XSA9IGwgPj4gOCAmIDI1NTtcbiAgICAgIGRzdFtpICsgN10gPSBsICYgMjU1O1xuICAgIH1cblxuICAgIHJldHVybiBkc3Q7XG4gIH07XG4gIHZhciBzY2hlZHVsZUEgPSBuZXcgQXJyYXkoNCk7XG5cbiAgc2NoZWR1bGVBWzBdID0gbmV3IEFycmF5KDQpO1xuICBzY2hlZHVsZUFbMF1bMF0gPSBbNCwgMCwgMHhkLCAweGYsIDB4YywgMHhlLCAweDhdO1xuICBzY2hlZHVsZUFbMF1bMV0gPSBbNSwgMiwgMTYgKyAwLCAxNiArIDIsIDE2ICsgMSwgMTYgKyAzLCAweGFdO1xuICBzY2hlZHVsZUFbMF1bMl0gPSBbNiwgMywgMTYgKyA3LCAxNiArIDYsIDE2ICsgNSwgMTYgKyA0LCA5XTtcbiAgc2NoZWR1bGVBWzBdWzNdID0gWzcsIDEsIDE2ICsgMHhhLCAxNiArIDksIDE2ICsgMHhiLCAxNiArIDgsIDB4Yl07XG5cbiAgc2NoZWR1bGVBWzFdID0gbmV3IEFycmF5KDQpO1xuICBzY2hlZHVsZUFbMV1bMF0gPSBbMCwgNiwgMTYgKyA1LCAxNiArIDcsIDE2ICsgNCwgMTYgKyA2LCAxNiArIDBdO1xuICBzY2hlZHVsZUFbMV1bMV0gPSBbMSwgNCwgMCwgMiwgMSwgMywgMTYgKyAyXTtcbiAgc2NoZWR1bGVBWzFdWzJdID0gWzIsIDUsIDcsIDYsIDUsIDQsIDE2ICsgMV07XG4gIHNjaGVkdWxlQVsxXVszXSA9IFszLCA3LCAweGEsIDksIDB4YiwgOCwgMTYgKyAzXTtcblxuICBzY2hlZHVsZUFbMl0gPSBuZXcgQXJyYXkoNCk7XG4gIHNjaGVkdWxlQVsyXVswXSA9IFs0LCAwLCAweGQsIDB4ZiwgMHhjLCAweGUsIDhdO1xuICBzY2hlZHVsZUFbMl1bMV0gPSBbNSwgMiwgMTYgKyAwLCAxNiArIDIsIDE2ICsgMSwgMTYgKyAzLCAweGFdO1xuICBzY2hlZHVsZUFbMl1bMl0gPSBbNiwgMywgMTYgKyA3LCAxNiArIDYsIDE2ICsgNSwgMTYgKyA0LCA5XTtcbiAgc2NoZWR1bGVBWzJdWzNdID0gWzcsIDEsIDE2ICsgMHhhLCAxNiArIDksIDE2ICsgMHhiLCAxNiArIDgsIDB4Yl07XG5cbiAgc2NoZWR1bGVBWzNdID0gbmV3IEFycmF5KDQpO1xuICBzY2hlZHVsZUFbM11bMF0gPSBbMCwgNiwgMTYgKyA1LCAxNiArIDcsIDE2ICsgNCwgMTYgKyA2LCAxNiArIDBdO1xuICBzY2hlZHVsZUFbM11bMV0gPSBbMSwgNCwgMCwgMiwgMSwgMywgMTYgKyAyXTtcbiAgc2NoZWR1bGVBWzNdWzJdID0gWzIsIDUsIDcsIDYsIDUsIDQsIDE2ICsgMV07XG4gIHNjaGVkdWxlQVszXVszXSA9IFszLCA3LCAweGEsIDksIDB4YiwgOCwgMTYgKyAzXTtcblxuICB2YXIgc2NoZWR1bGVCID0gbmV3IEFycmF5KDQpO1xuXG4gIHNjaGVkdWxlQlswXSA9IG5ldyBBcnJheSg0KTtcbiAgc2NoZWR1bGVCWzBdWzBdID0gWzE2ICsgOCwgMTYgKyA5LCAxNiArIDcsIDE2ICsgNiwgMTYgKyAyXTtcbiAgc2NoZWR1bGVCWzBdWzFdID0gWzE2ICsgMHhhLCAxNiArIDB4YiwgMTYgKyA1LCAxNiArIDQsIDE2ICsgNl07XG4gIHNjaGVkdWxlQlswXVsyXSA9IFsxNiArIDB4YywgMTYgKyAweGQsIDE2ICsgMywgMTYgKyAyLCAxNiArIDldO1xuICBzY2hlZHVsZUJbMF1bM10gPSBbMTYgKyAweGUsIDE2ICsgMHhmLCAxNiArIDEsIDE2ICsgMCwgMTYgKyAweGNdO1xuXG4gIHNjaGVkdWxlQlsxXSA9IG5ldyBBcnJheSg0KTtcbiAgc2NoZWR1bGVCWzFdWzBdID0gWzMsIDIsIDB4YywgMHhkLCA4XTtcbiAgc2NoZWR1bGVCWzFdWzFdID0gWzEsIDAsIDB4ZSwgMHhmLCAweGRdO1xuICBzY2hlZHVsZUJbMV1bMl0gPSBbNywgNiwgOCwgOSwgM107XG4gIHNjaGVkdWxlQlsxXVszXSA9IFs1LCA0LCAweGEsIDB4YiwgN107XG5cbiAgc2NoZWR1bGVCWzJdID0gbmV3IEFycmF5KDQpO1xuICBzY2hlZHVsZUJbMl1bMF0gPSBbMTYgKyAzLCAxNiArIDIsIDE2ICsgMHhjLCAxNiArIDB4ZCwgMTYgKyA5XTtcbiAgc2NoZWR1bGVCWzJdWzFdID0gWzE2ICsgMSwgMTYgKyAwLCAxNiArIDB4ZSwgMTYgKyAweGYsIDE2ICsgMHhjXTtcbiAgc2NoZWR1bGVCWzJdWzJdID0gWzE2ICsgNywgMTYgKyA2LCAxNiArIDgsIDE2ICsgOSwgMTYgKyAyXTtcbiAgc2NoZWR1bGVCWzJdWzNdID0gWzE2ICsgNSwgMTYgKyA0LCAxNiArIDB4YSwgMTYgKyAweGIsIDE2ICsgNl07XG5cbiAgc2NoZWR1bGVCWzNdID0gbmV3IEFycmF5KDQpO1xuICBzY2hlZHVsZUJbM11bMF0gPSBbOCwgOSwgNywgNiwgM107XG4gIHNjaGVkdWxlQlszXVsxXSA9IFsweGEsIDB4YiwgNSwgNCwgN107XG4gIHNjaGVkdWxlQlszXVsyXSA9IFsweGMsIDB4ZCwgMywgMiwgOF07XG4gIHNjaGVkdWxlQlszXVszXSA9IFsweGUsIDB4ZiwgMSwgMCwgMHhkXTtcblxuICAvLyBjaGFuZ2VkICdpbicgdG8gJ2lubicgKGluIGphdmFzY3JpcHQgJ2luJyBpcyBhIHJlc2VydmVkIHdvcmQpXG4gIHRoaXMua2V5U2NoZWR1bGUgPSBmdW5jdGlvbiAoaW5uKSB7XG4gICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgdmFyIGsgPSBuZXcgQXJyYXkoMzIpO1xuXG4gICAgdmFyIGogPSB2b2lkIDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgaiA9IGkgKiA0O1xuICAgICAgdFtpXSA9IGlubltqXSA8PCAyNCB8IGlubltqICsgMV0gPDwgMTYgfCBpbm5baiArIDJdIDw8IDggfCBpbm5baiArIDNdO1xuICAgIH1cblxuICAgIHZhciB4ID0gWzYsIDcsIDQsIDVdO1xuICAgIHZhciBraSA9IDA7XG4gICAgdmFyIHcgPSB2b2lkIDA7XG5cbiAgICBmb3IgKHZhciBoYWxmID0gMDsgaGFsZiA8IDI7IGhhbGYrKykge1xuICAgICAgZm9yICh2YXIgcm91bmQgPSAwOyByb3VuZCA8IDQ7IHJvdW5kKyspIHtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgIHZhciBhID0gc2NoZWR1bGVBW3JvdW5kXVtqXTtcbiAgICAgICAgICB3ID0gdFthWzFdXTtcblxuICAgICAgICAgIHcgXj0gc0JveFs0XVt0W2FbMl0gPj4+IDJdID4+PiAyNCAtIDggKiAoYVsyXSAmIDMpICYgMHhmZl07XG4gICAgICAgICAgdyBePSBzQm94WzVdW3RbYVszXSA+Pj4gMl0gPj4+IDI0IC0gOCAqIChhWzNdICYgMykgJiAweGZmXTtcbiAgICAgICAgICB3IF49IHNCb3hbNl1bdFthWzRdID4+PiAyXSA+Pj4gMjQgLSA4ICogKGFbNF0gJiAzKSAmIDB4ZmZdO1xuICAgICAgICAgIHcgXj0gc0JveFs3XVt0W2FbNV0gPj4+IDJdID4+PiAyNCAtIDggKiAoYVs1XSAmIDMpICYgMHhmZl07XG4gICAgICAgICAgdyBePSBzQm94W3hbal1dW3RbYVs2XSA+Pj4gMl0gPj4+IDI0IC0gOCAqIChhWzZdICYgMykgJiAweGZmXTtcbiAgICAgICAgICB0W2FbMF1dID0gdztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICB2YXIgYiA9IHNjaGVkdWxlQltyb3VuZF1bal07XG4gICAgICAgICAgdyA9IHNCb3hbNF1bdFtiWzBdID4+PiAyXSA+Pj4gMjQgLSA4ICogKGJbMF0gJiAzKSAmIDB4ZmZdO1xuXG4gICAgICAgICAgdyBePSBzQm94WzVdW3RbYlsxXSA+Pj4gMl0gPj4+IDI0IC0gOCAqIChiWzFdICYgMykgJiAweGZmXTtcbiAgICAgICAgICB3IF49IHNCb3hbNl1bdFtiWzJdID4+PiAyXSA+Pj4gMjQgLSA4ICogKGJbMl0gJiAzKSAmIDB4ZmZdO1xuICAgICAgICAgIHcgXj0gc0JveFs3XVt0W2JbM10gPj4+IDJdID4+PiAyNCAtIDggKiAoYlszXSAmIDMpICYgMHhmZl07XG4gICAgICAgICAgdyBePSBzQm94WzQgKyBqXVt0W2JbNF0gPj4+IDJdID4+PiAyNCAtIDggKiAoYls0XSAmIDMpICYgMHhmZl07XG4gICAgICAgICAga1traV0gPSB3O1xuICAgICAgICAgIGtpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgMTY7IF9pKyspIHtcbiAgICAgIHRoaXMubWFza2luZ1tfaV0gPSBrW19pXTtcbiAgICAgIHRoaXMucm90YXRlW19pXSA9IGtbMTYgKyBfaV0gJiAweDFmO1xuICAgIH1cbiAgfTtcblxuICAvLyBUaGVzZSBhcmUgdGhlIHRocmVlICdmJyBmdW5jdGlvbnMuIFNlZSBSRkMgMjE0NCwgc2VjdGlvbiAyLjIuXG5cbiAgZnVuY3Rpb24gZjEoZCwgbSwgcikge1xuICAgIHZhciB0ID0gbSArIGQ7XG4gICAgdmFyIEkgPSB0IDw8IHIgfCB0ID4+PiAzMiAtIHI7XG4gICAgcmV0dXJuIChzQm94WzBdW0kgPj4+IDI0XSBeIHNCb3hbMV1bSSA+Pj4gMTYgJiAyNTVdKSAtIHNCb3hbMl1bSSA+Pj4gOCAmIDI1NV0gKyBzQm94WzNdW0kgJiAyNTVdO1xuICB9XG5cbiAgZnVuY3Rpb24gZjIoZCwgbSwgcikge1xuICAgIHZhciB0ID0gbSBeIGQ7XG4gICAgdmFyIEkgPSB0IDw8IHIgfCB0ID4+PiAzMiAtIHI7XG4gICAgcmV0dXJuIHNCb3hbMF1bSSA+Pj4gMjRdIC0gc0JveFsxXVtJID4+PiAxNiAmIDI1NV0gKyBzQm94WzJdW0kgPj4+IDggJiAyNTVdIF4gc0JveFszXVtJICYgMjU1XTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGYzKGQsIG0sIHIpIHtcbiAgICB2YXIgdCA9IG0gLSBkO1xuICAgIHZhciBJID0gdCA8PCByIHwgdCA+Pj4gMzIgLSByO1xuICAgIHJldHVybiAoc0JveFswXVtJID4+PiAyNF0gKyBzQm94WzFdW0kgPj4+IDE2ICYgMjU1XSBeIHNCb3hbMl1bSSA+Pj4gOCAmIDI1NV0pIC0gc0JveFszXVtJICYgMjU1XTtcbiAgfVxuXG4gIHZhciBzQm94ID0gbmV3IEFycmF5KDgpO1xuICBzQm94WzBdID0gWzB4MzBmYjQwZDQsIDB4OWZhMGZmMGIsIDB4NmJlY2NkMmYsIDB4M2YyNThjN2EsIDB4MWUyMTNmMmYsIDB4OWMwMDRkZDMsIDB4NjAwM2U1NDAsIDB4Y2Y5ZmM5NDksIDB4YmZkNGFmMjcsIDB4ODhiYmJkYjUsIDB4ZTIwMzQwOTAsIDB4OThkMDk2NzUsIDB4NmU2M2EwZTAsIDB4MTVjMzYxZDIsIDB4YzJlNzY2MWQsIDB4MjJkNGZmOGUsIDB4Mjg2ODNiNmYsIDB4YzA3ZmQwNTksIDB4ZmYyMzc5YzgsIDB4Nzc1ZjUwZTIsIDB4NDNjMzQwZDMsIDB4ZGYyZjg2NTYsIDB4ODg3Y2E0MWEsIDB4YTJkMmJkMmQsIDB4YTFjOWUwZDYsIDB4MzQ2YzQ4MTksIDB4NjFiNzZkODcsIDB4MjI1NDBmMmYsIDB4MmFiZTMyZTEsIDB4YWE1NDE2NmIsIDB4MjI1NjhlM2EsIDB4YTJkMzQxZDAsIDB4NjZkYjQwYzgsIDB4YTc4NDM5MmYsIDB4MDA0ZGZmMmYsIDB4MmRiOWQyZGUsIDB4OTc5NDNmYWMsIDB4NGE5N2MxZDgsIDB4NTI3NjQ0YjcsIDB4YjVmNDM3YTcsIDB4YjgyY2JhZWYsIDB4ZDc1MWQxNTksIDB4NmZmN2YwZWQsIDB4NWEwOTdhMWYsIDB4ODI3YjY4ZDAsIDB4OTBlY2Y1MmUsIDB4MjJiMGMwNTQsIDB4YmM4ZTU5MzUsIDB4NGI2ZDJmN2YsIDB4NTBiYjY0YTIsIDB4ZDI2NjQ5MTAsIDB4YmVlNTgxMmQsIDB4YjczMzIyOTAsIDB4ZTkzYjE1OWYsIDB4YjQ4ZWU0MTEsIDB4NGJmZjM0NWQsIDB4ZmQ0NWMyNDAsIDB4YWQzMTk3M2YsIDB4YzRmNmQwMmUsIDB4NTVmYzgxNjUsIDB4ZDViMWNhYWQsIDB4YTFhYzJkYWUsIDB4YTJkNGI3NmQsIDB4YzE5YjBjNTAsIDB4ODgyMjQwZjIsIDB4MGM2ZTRmMzgsIDB4YTRlNGJmZDcsIDB4NGY1YmEyNzIsIDB4NTY0YzFkMmYsIDB4YzU5YzUzMTksIDB4Yjk0OWUzNTQsIDB4YjA0NjY5ZmUsIDB4YjFiNmFiOGEsIDB4YzcxMzU4ZGQsIDB4NjM4NWM1NDUsIDB4MTEwZjkzNWQsIDB4NTc1MzhhZDUsIDB4NmEzOTA0OTMsIDB4ZTYzZDM3ZTAsIDB4MmE1NGY2YjMsIDB4M2E3ODdkNWYsIDB4NjI3NmEwYjUsIDB4MTlhNmZjZGYsIDB4N2E0MjIwNmEsIDB4MjlmOWQ0ZDUsIDB4ZjYxYjE4OTEsIDB4YmI3MjI3NWUsIDB4YWE1MDgxNjcsIDB4Mzg5MDEwOTEsIDB4YzZiNTA1ZWIsIDB4ODRjN2NiOGMsIDB4MmFkNzVhMGYsIDB4ODc0YTE0MjcsIDB4YTJkMTkzNmIsIDB4MmFkMjg2YWYsIDB4YWE1NmQyOTEsIDB4ZDc4OTQzNjAsIDB4NDI1Yzc1MGQsIDB4OTNiMzllMjYsIDB4MTg3MTg0YzksIDB4NmMwMGIzMmQsIDB4NzNlMmJiMTQsIDB4YTBiZWJjM2MsIDB4NTQ2MjM3NzksIDB4NjQ0NTllYWIsIDB4M2YzMjhiODIsIDB4NzcxOGNmODIsIDB4NTlhMmNlYTYsIDB4MDRlZTAwMmUsIDB4ODlmZTc4ZTYsIDB4M2ZhYjA5NTAsIDB4MzI1ZmY2YzIsIDB4ODEzODNmMDUsIDB4Njk2M2M1YzgsIDB4NzZjYjVhZDYsIDB4ZDQ5OTc0YzksIDB4Y2ExODBkY2YsIDB4MzgwNzgyZDUsIDB4YzdmYTVjZjYsIDB4OGFjMzE1MTEsIDB4MzVlNzllMTMsIDB4NDdkYTkxZDAsIDB4ZjQwZjkwODYsIDB4YTdlMjQxOWUsIDB4MzEzNjYyNDEsIDB4MDUxZWY0OTUsIDB4YWE1NzNiMDQsIDB4NGE4MDVkOGQsIDB4NTQ4MzAwZDAsIDB4MDAzMjJhM2MsIDB4YmY2NGNkZGYsIDB4YmE1N2E2OGUsIDB4NzVjNjM3MmIsIDB4NTBhZmQzNDEsIDB4YTdjMTMyNzUsIDB4OTE1YTBiZjUsIDB4NmI1NGJmYWIsIDB4MmIwYjE0MjYsIDB4YWI0Y2M5ZDcsIDB4NDQ5Y2NkODIsIDB4ZjdmYmYyNjUsIDB4YWI4NWM1ZjMsIDB4MWI1NWRiOTQsIDB4YWFkNGUzMjQsIDB4Y2ZhNGJkM2YsIDB4MmRlYWEzZTIsIDB4OWUyMDRkMDIsIDB4YzhiZDI1YWMsIDB4ZWFkZjU1YjMsIDB4ZDViZDllOTgsIDB4ZTMxMjMxYjIsIDB4MmFkNWFkNmMsIDB4OTU0MzI5ZGUsIDB4YWRiZTQ1MjgsIDB4ZDg3MTBmNjksIDB4YWE1MWM5MGYsIDB4YWE3ODZiZjYsIDB4MjI1MTNmMWUsIDB4YWE1MWE3OWIsIDB4MmFkMzQ0Y2MsIDB4N2I1YTQxZjAsIDB4ZDM3Y2ZiYWQsIDB4MWIwNjk1MDUsIDB4NDFlY2U0OTEsIDB4YjRjMzMyZTYsIDB4MDMyMjY4ZDQsIDB4Yzk2MDBhY2MsIDB4Y2UzODdlNmQsIDB4YmY2YmIxNmMsIDB4NmE3MGZiNzgsIDB4MGQwM2Q5YzksIDB4ZDRkZjM5ZGUsIDB4ZTAxMDYzZGEsIDB4NDczNmY0NjQsIDB4NWFkMzI4ZDgsIDB4YjM0N2NjOTYsIDB4NzViYjBmYzMsIDB4OTg1MTFiZmIsIDB4NGZmYmNjMzUsIDB4YjU4YmNmNmEsIDB4ZTExZjBhYmMsIDB4YmZjNWZlNGEsIDB4YTcwYWVjMTAsIDB4YWMzOTU3MGEsIDB4M2YwNDQ0MmYsIDB4NjE4OGIxNTMsIDB4ZTAzOTdhMmUsIDB4NTcyN2NiNzksIDB4OWNlYjQxOGYsIDB4MWNhY2Q2OGQsIDB4MmFkMzdjOTYsIDB4MDE3NWNiOWQsIDB4YzY5ZGZmMDksIDB4Yzc1YjY1ZjAsIDB4ZDlkYjQwZDgsIDB4ZWMwZTc3NzksIDB4NDc0NGVhZDQsIDB4YjExYzMyNzQsIDB4ZGQyNGNiOWUsIDB4N2UxYzU0YmQsIDB4ZjAxMTQ0ZjksIDB4ZDIyNDBlYjEsIDB4OTY3NWIzZmQsIDB4YTNhYzM3NTUsIDB4ZDQ3YzI3YWYsIDB4NTFjODVmNGQsIDB4NTY5MDc1OTYsIDB4YTViYjE1ZTYsIDB4NTgwMzA0ZjAsIDB4Y2EwNDJjZjEsIDB4MDExYTM3ZWEsIDB4OGRiZmFhZGIsIDB4MzViYTNlNGEsIDB4MzUyNmZmYTAsIDB4YzM3YjRkMDksIDB4YmMzMDZlZDksIDB4OThhNTI2NjYsIDB4NTY0OGY3MjUsIDB4ZmY1ZTU2OWQsIDB4MGNlZDYzZDAsIDB4N2M2M2IyY2YsIDB4NzAwYjQ1ZTEsIDB4ZDVlYTUwZjEsIDB4ODVhOTI4NzIsIDB4YWYxZmJkYTcsIDB4ZDQyMzQ4NzAsIDB4YTc4NzBiZjMsIDB4MmQzYjRkNzksIDB4NDJlMDQxOTgsIDB4MGNkMGVkZTcsIDB4MjY0NzBkYjgsIDB4Zjg4MTgxNGMsIDB4NDc0ZDZhZDcsIDB4N2MwYzVlNWMsIDB4ZDEyMzE5NTksIDB4MzgxYjcyOTgsIDB4ZjVkMmY0ZGIsIDB4YWI4Mzg2NTMsIDB4NmUyZjFlMjMsIDB4ODM3MTljOWUsIDB4YmQ5MWUwNDYsIDB4OWE1NjQ1NmUsIDB4ZGMzOTIwMGMsIDB4MjBjOGM1NzEsIDB4OTYyYmRhMWMsIDB4ZTFlNjk2ZmYsIDB4YjE0MWFiMDgsIDB4N2NjYTg5YjksIDB4MWE2OWU3ODMsIDB4MDJjYzQ4NDMsIDB4YTJmN2M1NzksIDB4NDI5ZWY0N2QsIDB4NDI3YjE2OWMsIDB4NWFjOWYwNDksIDB4ZGQ4ZjBmMDAsIDB4NWM4MTY1YmZdO1xuXG4gIHNCb3hbMV0gPSBbMHgxZjIwMTA5NCwgMHhlZjBiYTc1YiwgMHg2OWUzY2Y3ZSwgMHgzOTNmNDM4MCwgMHhmZTYxY2Y3YSwgMHhlZWM1MjA3YSwgMHg1NTg4OWM5NCwgMHg3MmZjMDY1MSwgMHhhZGE3ZWY3OSwgMHg0ZTFkNzIzNSwgMHhkNTVhNjNjZSwgMHhkZTA0MzZiYSwgMHg5OWM0MzBlZiwgMHg1ZjBjMDc5NCwgMHgxOGRjZGI3ZCwgMHhhMWQ2ZWZmMywgMHhhMGI1MmY3YiwgMHg1OWU4MzYwNSwgMHhlZTE1YjA5NCwgMHhlOWZmZDkwOSwgMHhkYzQ0MDA4NiwgMHhlZjk0NDQ1OSwgMHhiYTgzY2NiMywgMHhlMGMzY2RmYiwgMHhkMWRhNDE4MSwgMHgzYjA5MmFiMSwgMHhmOTk3ZjFjMSwgMHhhNWU2Y2Y3YiwgMHgwMTQyMGRkYiwgMHhlNGU3ZWY1YiwgMHgyNWExZmY0MSwgMHhlMTgwZjgwNiwgMHgxZmM0MTA4MCwgMHgxNzliZWU3YSwgMHhkMzdhYzZhOSwgMHhmZTU4MzBhNCwgMHg5OGRlOGI3ZiwgMHg3N2U4M2Y0ZSwgMHg3OTkyOTI2OSwgMHgyNGZhOWY3YiwgMHhlMTEzYzg1YiwgMHhhY2M0MDA4MywgMHhkNzUwMzUyNSwgMHhmN2VhNjE1ZiwgMHg2MjE0MzE1NCwgMHgwZDU1NGI2MywgMHg1ZDY4MTEyMSwgMHhjODY2YzM1OSwgMHgzZDYzY2Y3MywgMHhjZWUyMzRjMCwgMHhkNGQ4N2U4NywgMHg1YzY3MmIyMSwgMHgwNzFmNjE4MSwgMHgzOWY3NjI3ZiwgMHgzNjFlMzA4NCwgMHhlNGViNTczYiwgMHg2MDJmNjRhNCwgMHhkNjNhY2Q5YywgMHgxYmJjNDYzNSwgMHg5ZTgxMDMyZCwgMHgyNzAxZjUwYywgMHg5OTg0N2FiNCwgMHhhMGUzZGY3OSwgMHhiYTZjZjM4YywgMHgxMDg0MzA5NCwgMHgyNTM3YTk1ZSwgMHhmNDZmNmZmZSwgMHhhMWZmM2IxZiwgMHgyMDhjZmI2YSwgMHg4ZjQ1OGM3NCwgMHhkOWUwYTIyNywgMHg0ZWM3M2EzNCwgMHhmYzg4NGY2OSwgMHgzZTRkZThkZiwgMHhlZjBlMDA4OCwgMHgzNTU5NjQ4ZCwgMHg4YTQ1Mzg4YywgMHgxZDgwNDM2NiwgMHg3MjFkOWJmZCwgMHhhNTg2ODRiYiwgMHhlODI1NjMzMywgMHg4NDRlODIxMiwgMHgxMjhkODA5OCwgMHhmZWQzM2ZiNCwgMHhjZTI4MGFlMSwgMHgyN2UxOWJhNSwgMHhkNWE2YzI1MiwgMHhlNDk3NTRiZCwgMHhjNWQ2NTVkZCwgMHhlYjY2NzA2NCwgMHg3Nzg0MGI0ZCwgMHhhMWI2YTgwMSwgMHg4NGRiMjZhOSwgMHhlMGI1NjcxNCwgMHgyMWYwNDNiNywgMHhlNWQwNTg2MCwgMHg1NGYwMzA4NCwgMHgwNjZmZjQ3MiwgMHhhMzFhYTE1MywgMHhkYWRjNDc1NSwgMHhiNTYyNWRiZiwgMHg2ODU2MWJlNiwgMHg4M2NhNmI5NCwgMHgyZDZlZDIzYiwgMHhlY2NmMDFkYiwgMHhhNmQzZDBiYSwgMHhiNjgwM2Q1YywgMHhhZjc3YTcwOSwgMHgzM2I0YTM0YywgMHgzOTdiYzhkNiwgMHg1ZWUyMmI5NSwgMHg1ZjBlNTMwNCwgMHg4MWVkNmY2MSwgMHgyMGU3NDM2NCwgMHhiNDVlMTM3OCwgMHhkZTE4NjM5YiwgMHg4ODFjYTEyMiwgMHhiOTY3MjZkMSwgMHg4MDQ5YTdlOCwgMHgyMmI3ZGE3YiwgMHg1ZTU1MmQyNSwgMHg1MjcyZDIzNywgMHg3OWQyOTUxYywgMHhjNjBkODk0YywgMHg0ODhjYjQwMiwgMHgxYmE0ZmU1YiwgMHhhNGIwOWY2YiwgMHgxY2E4MTVjZiwgMHhhMjBjMzAwNSwgMHg4ODcxZGY2MywgMHhiOWRlMmZjYiwgMHgwY2M2YzllOSwgMHgwYmVlZmY1MywgMHhlMzIxNDUxNywgMHhiNDU0MjgzNSwgMHg5ZjYzMjkzYywgMHhlZTQxZTcyOSwgMHg2ZTFkMmQ3YywgMHg1MDA0NTI4NiwgMHgxZTY2ODVmMywgMHhmMzM0MDFjNiwgMHgzMGEyMmM5NSwgMHgzMWE3MDg1MCwgMHg2MDkzMGYxMywgMHg3M2Y5ODQxNywgMHhhMTI2OTg1OSwgMHhlYzY0NWM0NCwgMHg1MmM4NzdhOSwgMHhjZGZmMzNhNiwgMHhhMDJiMTc0MSwgMHg3Y2JhZDlhMiwgMHgyMTgwMDM2ZiwgMHg1MGQ5OWMwOCwgMHhjYjNmNDg2MSwgMHhjMjZiZDc2NSwgMHg2NGEzZjZhYiwgMHg4MDM0MjY3NiwgMHgyNWE3NWU3YiwgMHhlNGU2ZDFmYywgMHgyMGM3MTBlNiwgMHhjZGYwYjY4MCwgMHgxNzg0NGQzYiwgMHgzMWVlZjg0ZCwgMHg3ZTA4MjRlNCwgMHgyY2NiNDllYiwgMHg4NDZhM2JhZSwgMHg4ZmY3Nzg4OCwgMHhlZTVkNjBmNiwgMHg3YWY3NTY3MywgMHgyZmRkNWNkYiwgMHhhMTE2MzFjMSwgMHgzMGY2NmY0MywgMHhiM2ZhZWM1NCwgMHgxNTdmZDdmYSwgMHhlZjg1NzljYywgMHhkMTUyZGU1OCwgMHhkYjJmZmQ1ZSwgMHg4ZjMyY2UxOSwgMHgzMDZhZjk3YSwgMHgwMmYwM2VmOCwgMHg5OTMxOWFkNSwgMHhjMjQyZmEwZiwgMHhhN2UzZWJiMCwgMHhjNjhlNDkwNiwgMHhiOGRhMjMwYywgMHg4MDgyMzAyOCwgMHhkY2RlZjNjOCwgMHhkMzVmYjE3MSwgMHgwODhhMWJjOCwgMHhiZWMwYzU2MCwgMHg2MWEzYzllOCwgMHhiY2E4ZjU0ZCwgMHhjNzJmZWZmYSwgMHgyMjgyMmU5OSwgMHg4MmM1NzBiNCwgMHhkOGQ5NGU4OSwgMHg4YjFjMzRiYywgMHgzMDFlMTZlNiwgMHgyNzNiZTk3OSwgMHhiMGZmZWFhNiwgMHg2MWQ5YjhjNiwgMHgwMGIyNDg2OSwgMHhiN2ZmY2UzZiwgMHgwOGRjMjgzYiwgMHg0M2RhZjY1YSwgMHhmN2UxOTc5OCwgMHg3NjE5YjcyZiwgMHg4ZjFjOWJhNCwgMHhkYzg2MzdhMCwgMHgxNmE3ZDNiMSwgMHg5ZmMzOTNiNywgMHhhNzEzNmVlYiwgMHhjNmJjYzYzZSwgMHgxYTUxMzc0MiwgMHhlZjY4MjhiYywgMHg1MjAzNjVkNiwgMHgyZDZhNzdhYiwgMHgzNTI3ZWQ0YiwgMHg4MjFmZDIxNiwgMHgwOTVjNmUyZSwgMHhkYjkyZjJmYiwgMHg1ZWVhMjljYiwgMHgxNDU4OTJmNSwgMHg5MTU4NGY3ZiwgMHg1NDgzNjk3YiwgMHgyNjY3YThjYywgMHg4NTE5NjA0OCwgMHg4YzRiYWNlYSwgMHg4MzM4NjBkNCwgMHgwZDIzZTBmOSwgMHg2YzM4N2U4YSwgMHgwYWU2ZDI0OSwgMHhiMjg0NjAwYywgMHhkODM1NzMxZCwgMHhkY2IxYzY0NywgMHhhYzRjNTZlYSwgMHgzZWJkODFiMywgMHgyMzBlYWJiMCwgMHg2NDM4YmM4NywgMHhmMGI1YjFmYSwgMHg4ZjVlYTJiMywgMHhmYzE4NDY0MiwgMHgwYTAzNmI3YSwgMHg0ZmIwODliZCwgMHg2NDlkYTU4OSwgMHhhMzQ1NDE1ZSwgMHg1YzAzODMyMywgMHgzZTVkM2JiOSwgMHg0M2Q3OTU3MiwgMHg3ZTZkZDA3YywgMHgwNmRmZGYxZSwgMHg2YzZjYzRlZiwgMHg3MTYwYTUzOSwgMHg3M2JmYmU3MCwgMHg4Mzg3NzYwNSwgMHg0NTIzZWNmMV07XG5cbiAgc0JveFsyXSA9IFsweDhkZWZjMjQwLCAweDI1ZmE1ZDlmLCAweGViOTAzZGJmLCAweGU4MTBjOTA3LCAweDQ3NjA3ZmZmLCAweDM2OWZlNDRiLCAweDhjMWZjNjQ0LCAweGFlY2VjYTkwLCAweGJlYjFmOWJmLCAweGVlZmJjYWVhLCAweGU4Y2YxOTUwLCAweDUxZGYwN2FlLCAweDkyMGU4ODA2LCAweGYwYWQwNTQ4LCAweGUxM2M4ZDgzLCAweDkyNzAxMGQ1LCAweDExMTA3ZDlmLCAweDA3NjQ3ZGI5LCAweGIyZTNlNGQ0LCAweDNkNGYyODVlLCAweGI5YWZhODIwLCAweGZhZGU4MmUwLCAweGEwNjcyNjhiLCAweDgyNzI3OTJlLCAweDU1M2ZiMmMwLCAweDQ4OWFlMjJiLCAweGQ0ZWY5Nzk0LCAweDEyNWUzZmJjLCAweDIxZmZmY2VlLCAweDgyNWIxYmZkLCAweDkyNTVjNWVkLCAweDEyNTdhMjQwLCAweDRlMWE4MzAyLCAweGJhZTA3ZmZmLCAweDUyODI0NmU3LCAweDhlNTcxNDBlLCAweDMzNzNmN2JmLCAweDhjOWY4MTg4LCAweGE2ZmM0ZWU4LCAweGM5ODJiNWE1LCAweGE4YzAxZGI3LCAweDU3OWZjMjY0LCAweDY3MDk0ZjMxLCAweGYyYmQzZjVmLCAweDQwZmZmN2MxLCAweDFmYjc4ZGZjLCAweDhlNmJkMmMxLCAweDQzN2JlNTliLCAweDk5YjAzZGJmLCAweGI1ZGJjNjRiLCAweDYzOGRjMGU2LCAweDU1ODE5ZDk5LCAweGExOTdjODFjLCAweDRhMDEyZDZlLCAweGM1ODg0YTI4LCAweGNjYzM2ZjcxLCAweGI4NDNjMjEzLCAweDZjMDc0M2YxLCAweDgzMDk4OTNjLCAweDBmZWRkZDVmLCAweDJmN2ZlODUwLCAweGQ3YzA3ZjdlLCAweDAyNTA3ZmJmLCAweDVhZmI5YTA0LCAweGE3NDdkMmQwLCAweDE2NTExOTJlLCAweGFmNzBiZjNlLCAweDU4YzMxMzgwLCAweDVmOTgzMDJlLCAweDcyN2NjM2M0LCAweDBhMGZiNDAyLCAweDBmN2ZlZjgyLCAweDhjOTZmZGFkLCAweDVkMmMyYWFlLCAweDhlZTk5YTQ5LCAweDUwZGE4OGI4LCAweDg0MjdmNGEwLCAweDFlYWM1NzkwLCAweDc5NmZiNDQ5LCAweDgyNTJkYzE1LCAweGVmYmQ3ZDliLCAweGE2NzI1OTdkLCAweGFkYTg0MGQ4LCAweDQ1ZjU0NTA0LCAweGZhNWQ3NDAzLCAweGU4M2VjMzA1LCAweDRmOTE3NTFhLCAweDkyNTY2OWMyLCAweDIzZWZlOTQxLCAweGE5MDNmMTJlLCAweDYwMjcwZGYyLCAweDAyNzZlNGI2LCAweDk0ZmQ2NTc0LCAweDkyNzk4NWIyLCAweDgyNzZkYmNiLCAweDAyNzc4MTc2LCAweGY4YWY5MThkLCAweDRlNDhmNzllLCAweDhmNjE2ZGRmLCAweGUyOWQ4NDBlLCAweDg0MmY3ZDgzLCAweDM0MGNlNWM4LCAweDk2YmJiNjgyLCAweDkzYjRiMTQ4LCAweGVmMzAzY2FiLCAweDk4NGZhZjI4LCAweDc3OWZhZjliLCAweDkyZGM1NjBkLCAweDIyNGQxZTIwLCAweDg0MzdhYTg4LCAweDdkMjlkYzk2LCAweDI3NTZkM2RjLCAweDhiOTA3Y2VlLCAweGI1MWZkMjQwLCAweGU3YzA3Y2UzLCAweGU1NjZiNGExLCAweGMzZTk2MTVlLCAweDNjZjgyMDlkLCAweDYwOTRkMWUzLCAweGNkOWNhMzQxLCAweDVjNzY0NjBlLCAweDAwZWE5ODNiLCAweGQ0ZDY3ODgxLCAweGZkNDc1NzJjLCAweGY3NmNlZGQ5LCAweGJkYTgyMjljLCAweDEyN2RhZGFhLCAweDQzOGEwNzRlLCAweDFmOTdjMDkwLCAweDA4MWJkYjhhLCAweDkzYTA3ZWJlLCAweGI5MzhjYTE1LCAweDk3YjAzY2ZmLCAweDNkYzJjMGY4LCAweDhkMWFiMmVjLCAweDY0MzgwZTUxLCAweDY4Y2M3YmZiLCAweGQ5MGYyNzg4LCAweDEyNDkwMTgxLCAweDVkZTVmZmQ0LCAweGRkN2VmODZhLCAweDc2YTJlMjE0LCAweGI5YTQwMzY4LCAweDkyNWQ5NThmLCAweDRiMzlmZmZhLCAweGJhMzlhZWU5LCAweGE0ZmZkMzBiLCAweGZhZjc5MzNiLCAweDZkNDk4NjIzLCAweDE5M2NiY2ZhLCAweDI3NjI3NTQ1LCAweDgyNWNmNDdhLCAweDYxYmQ4YmEwLCAweGQxMWU0MmQxLCAweGNlYWQwNGY0LCAweDEyN2VhMzkyLCAweDEwNDI4ZGI3LCAweDgyNzJhOTcyLCAweDkyNzBjNGE4LCAweDEyN2RlNTBiLCAweDI4NWJhMWM4LCAweDNjNjJmNDRmLCAweDM1YzBlYWE1LCAweGU4MDVkMjMxLCAweDQyODkyOWZiLCAweGI0ZmNkZjgyLCAweDRmYjY2YTUzLCAweDBlN2RjMTViLCAweDFmMDgxZmFiLCAweDEwODYxOGFlLCAweGZjZmQwODZkLCAweGY5ZmYyODg5LCAweDY5NGJjYzExLCAweDIzNmE1Y2FlLCAweDEyZGVjYTRkLCAweDJjM2Y4Y2M1LCAweGQyZDAyZGZlLCAweGY4ZWY1ODk2LCAweGU0Y2Y1MmRhLCAweDk1MTU1YjY3LCAweDQ5NGE0ODhjLCAweGI5YjZhODBjLCAweDVjOGY4MmJjLCAweDg5ZDM2YjQ1LCAweDNhNjA5NDM3LCAweGVjMDBjOWE5LCAweDQ0NzE1MjUzLCAweDBhODc0YjQ5LCAweGQ3NzNiYzQwLCAweDdjMzQ2NzFjLCAweDAyNzE3ZWY2LCAweDRmZWI1NTM2LCAweGEyZDAyZmZmLCAweGQyYmY2MGM0LCAweGQ0M2YwM2MwLCAweDUwYjRlZjZkLCAweDA3NDc4Y2QxLCAweDAwNmUxODg4LCAweGEyZTUzZjU1LCAweGI5ZTZkNGJjLCAweGEyMDQ4MDE2LCAweDk3NTczODMzLCAweGQ3MjA3ZDY3LCAweGRlMGY4ZjNkLCAweDcyZjg3YjMzLCAweGFiY2M0ZjMzLCAweDc2ODhjNTVkLCAweDdiMDBhNmIwLCAweDk0N2IwMDAxLCAweDU3MDA3NWQyLCAweGY5YmI4OGY4LCAweDg5NDIwMTllLCAweDQyNjRhNWZmLCAweDg1NjMwMmUwLCAweDcyZGJkOTJiLCAweGVlOTcxYjY5LCAweDZlYTIyZmRlLCAweDVmMDhhZTJiLCAweGFmN2E2MTZkLCAweGU1Yzk4NzY3LCAweGNmMWZlYmQyLCAweDYxZWZjOGMyLCAweGYxYWMyNTcxLCAweGNjODIzOWMyLCAweDY3MjE0Y2I4LCAweGIxZTU4M2QxLCAweGI3ZGMzZTYyLCAweDdmMTBiZGNlLCAweGY5MGE1YzM4LCAweDBmZjA0NDNkLCAweDYwNmU2ZGM2LCAweDYwNTQzYTQ5LCAweDU3MjdjMTQ4LCAweDJiZTk4YTFkLCAweDhhYjQxNzM4LCAweDIwZTFiZTI0LCAweGFmOTZkYTBmLCAweDY4NDU4NDI1LCAweDk5ODMzYmU1LCAweDYwMGQ0NTdkLCAweDI4MmY5MzUwLCAweDgzMzRiMzYyLCAweGQ5MWQxMTIwLCAweDJiNmQ4ZGEwLCAweDY0MmIxZTMxLCAweDljMzA1YTAwLCAweDUyYmNlNjg4LCAweDFiMDM1ODhhLCAweGY3YmFlZmQ1LCAweDQxNDJlZDljLCAweGE0MzE1YzExLCAweDgzMzIzZWM1LCAweGRmZWY0NjM2LCAweGExMzNjNTAxLCAweGU5ZDM1MzFjLCAweGVlMzUzNzgzXTtcblxuICBzQm94WzNdID0gWzB4OWRiMzA0MjAsIDB4MWZiNmU5ZGUsIDB4YTdiZTdiZWYsIDB4ZDI3M2EyOTgsIDB4NGE0ZjdiZGIsIDB4NjRhZDhjNTcsIDB4ODU1MTA0NDMsIDB4ZmEwMjBlZDEsIDB4N2UyODdhZmYsIDB4ZTYwZmI2NjMsIDB4MDk1ZjM1YTEsIDB4NzllYmYxMjAsIDB4ZmQwNTlkNDMsIDB4NjQ5N2I3YjEsIDB4ZjM2NDFmNjMsIDB4MjQxZTRhZGYsIDB4MjgxNDdmNWYsIDB4NGZhMmI4Y2QsIDB4Yzk0MzAwNDAsIDB4MGNjMzIyMjAsIDB4ZmRkMzBiMzAsIDB4YzBhNTM3NGYsIDB4MWQyZDAwZDksIDB4MjQxNDdiMTUsIDB4ZWU0ZDExMWEsIDB4MGZjYTUxNjcsIDB4NzFmZjkwNGMsIDB4MmQxOTVmZmUsIDB4MWEwNTY0NWYsIDB4MGMxM2ZlZmUsIDB4MDgxYjA4Y2EsIDB4MDUxNzAxMjEsIDB4ODA1MzAxMDAsIDB4ZTgzZTVlZmUsIDB4YWM5YWY0ZjgsIDB4N2ZlNzI3MDEsIDB4ZDJiOGVlNWYsIDB4MDZkZjQyNjEsIDB4YmI5ZTliOGEsIDB4NzI5M2VhMjUsIDB4Y2U4NGZmZGYsIDB4ZjU3MTg4MDEsIDB4M2RkNjRiMDQsIDB4YTI2ZjI2M2IsIDB4N2VkNDg0MDAsIDB4NTQ3ZWViZTYsIDB4NDQ2ZDRjYTAsIDB4NmNmM2Q2ZjUsIDB4MjY0OWFiZGYsIDB4YWVhMGM3ZjUsIDB4MzYzMzhjYzEsIDB4NTAzZjdlOTMsIDB4ZDM3NzIwNjEsIDB4MTFiNjM4ZTEsIDB4NzI1MDBlMDMsIDB4ZjgwZWIyYmIsIDB4YWJlMDUwMmUsIDB4ZWM4ZDc3ZGUsIDB4NTc5NzFlODEsIDB4ZTE0ZjY3NDYsIDB4YzkzMzU0MDAsIDB4NjkyMDMxOGYsIDB4MDgxZGJiOTksIDB4ZmZjMzA0YTUsIDB4NGQzNTE4MDUsIDB4N2YzZDVjZTMsIDB4YTZjODY2YzYsIDB4NWQ1YmNjYTksIDB4ZGFlYzZmZWEsIDB4OWY5MjZmOTEsIDB4OWY0NjIyMmYsIDB4Mzk5MTQ2N2QsIDB4YTViZjZkOGUsIDB4MTE0M2M0NGYsIDB4NDM5NTgzMDIsIDB4ZDAyMTRlZWIsIDB4MDIyMDgzYjgsIDB4M2ZiNjE4MGMsIDB4MThmODkzMWUsIDB4MjgxNjU4ZTYsIDB4MjY0ODZlM2UsIDB4OGJkNzhhNzAsIDB4NzQ3N2U0YzEsIDB4YjUwNmUwN2MsIDB4ZjMyZDBhMjUsIDB4NzkwOThiMDIsIDB4ZTRlYWJiODEsIDB4MjgxMjNiMjMsIDB4NjlkZWFkMzgsIDB4MTU3NGNhMTYsIDB4ZGY4NzFiNjIsIDB4MjExYzQwYjcsIDB4YTUxYTllZjksIDB4MDAxNDM3N2IsIDB4MDQxZThhYzgsIDB4MDkxMTQwMDMsIDB4YmQ1OWU0ZDIsIDB4ZTNkMTU2ZDUsIDB4NGZlODc2ZDUsIDB4MmY5MWEzNDAsIDB4NTU3YmU4ZGUsIDB4MDBlYWU0YTcsIDB4MGNlNWMyZWMsIDB4NGRiNGJiYTYsIDB4ZTc1NmJkZmYsIDB4ZGQzMzY5YWMsIDB4ZWMxN2IwMzUsIDB4MDY1NzIzMjcsIDB4OTlhZmM4YjAsIDB4NTZjOGMzOTEsIDB4NmI2NTgxMWMsIDB4NWUxNDYxMTksIDB4NmU4NWNiNzUsIDB4YmUwN2MwMDIsIDB4YzIzMjU1NzcsIDB4ODkzZmY0ZWMsIDB4NWJiZmM5MmQsIDB4ZDBlYzNiMjUsIDB4Yjc4MDFhYjcsIDB4OGQ2ZDNiMjQsIDB4MjBjNzYzZWYsIDB4YzM2NmE1ZmMsIDB4OWMzODI4ODAsIDB4MGFjZTMyMDUsIDB4YWFjOTU0OGEsIDB4ZWNhMWQ3YzcsIDB4MDQxYWZhMzIsIDB4MWQxNjYyNWEsIDB4NjcwMTkwMmMsIDB4OWI3NTdhNTQsIDB4MzFkNDc3ZjcsIDB4OTEyNmIwMzEsIDB4MzZjYzZmZGIsIDB4YzcwYjhiNDYsIDB4ZDllNjZhNDgsIDB4NTZlNTVhNzksIDB4MDI2YTRjZWIsIDB4NTI0MzdlZmYsIDB4MmY4Zjc2YjQsIDB4MGRmOTgwYTUsIDB4ODY3NGNkZTMsIDB4ZWRkYTA0ZWIsIDB4MTdhOWJlMDQsIDB4MmMxOGY0ZGYsIDB4Yjc3NDdmOWQsIDB4YWIyYWY3YjQsIDB4ZWZjMzRkMjAsIDB4MmUwOTZiN2MsIDB4MTc0MWEyNTQsIDB4ZTViNmEwMzUsIDB4MjEzZDQyZjYsIDB4MmMxYzdjMjYsIDB4NjFjMmY1MGYsIDB4NjU1MmRhZjksIDB4ZDJjMjMxZjgsIDB4MjUxMzBmNjksIDB4ZDgxNjdmYTIsIDB4MDQxOGYyYzgsIDB4MDAxYTk2YTYsIDB4MGQxNTI2YWIsIDB4NjMzMTVjMjEsIDB4NWUwYTcyZWMsIDB4NDliYWZlZmQsIDB4MTg3OTA4ZDksIDB4OGQwZGJkODYsIDB4MzExMTcwYTcsIDB4M2U5YjY0MGMsIDB4Y2MzZTEwZDcsIDB4ZDVjYWQzYjYsIDB4MGNhZWMzODgsIDB4ZjczMDAxZTEsIDB4NmM3MjhhZmYsIDB4NzFlYWUyYTEsIDB4MWY5YWYzNmUsIDB4Y2ZjYmQxMmYsIDB4YzFkZTg0MTcsIDB4YWMwN2JlNmIsIDB4Y2I0NGExZDgsIDB4OGI5YjBmNTYsIDB4MDEzOTg4YzMsIDB4YjFjNTJmY2EsIDB4YjRiZTMxY2QsIDB4ZDg3ODI4MDYsIDB4MTJhM2E0ZTIsIDB4NmY3ZGU1MzIsIDB4NThmZDdlYjYsIDB4ZDAxZWU5MDAsIDB4MjRhZGZmYzIsIDB4ZjQ5OTBmYzUsIDB4OTcxMWFhYzUsIDB4MDAxZDdiOTUsIDB4ODJlNWU3ZDIsIDB4MTA5ODczZjYsIDB4MDA2MTMwOTYsIDB4YzMyZDk1MjEsIDB4YWRhMTIxZmYsIDB4Mjk5MDg0MTUsIDB4N2ZiYjk3N2YsIDB4YWY5ZWIzZGIsIDB4MjljOWVkMmEsIDB4NWNlMmE0NjUsIDB4YTczMGYzMmMsIDB4ZDBhYTNmZTgsIDB4OGE1Y2MwOTEsIDB4ZDQ5ZTJjZTcsIDB4MGNlNDU0YTksIDB4ZDYwYWNkODYsIDB4MDE1ZjE5MTksIDB4NzcwNzkxMDMsIDB4ZGVhMDNhZjYsIDB4NzhhODU2NWUsIDB4ZGVlMzU2ZGYsIDB4MjFmMDVjYmUsIDB4OGI3NWUzODcsIDB4YjNjNTA2NTEsIDB4YjhhNWMzZWYsIDB4ZDhlZWI2ZDIsIDB4ZTUyM2JlNzcsIDB4YzIxNTQ1MjksIDB4MmY2OWVmZGYsIDB4YWZlNjdhZmIsIDB4ZjQ3MGM0YjIsIDB4ZjNlMGViNWIsIDB4ZDZjYzk4NzYsIDB4MzllNDQ2MGMsIDB4MWZkYTg1MzgsIDB4MTk4NzgzMmYsIDB4Y2EwMDczNjcsIDB4YTk5MTQ0ZjgsIDB4Mjk2YjI5OWUsIDB4NDkyZmMyOTUsIDB4OTI2NmJlYWIsIDB4YjU2NzZlNjksIDB4OWJkM2RkZGEsIDB4ZGY3ZTA1MmYsIDB4ZGIyNTcwMWMsIDB4MWI1ZTUxZWUsIDB4ZjY1MzI0ZTYsIDB4NmFmY2UzNmMsIDB4MDMxNmNjMDQsIDB4ODY0NDIxM2UsIDB4YjdkYzU5ZDAsIDB4Nzk2NTI5MWYsIDB4Y2NkNmZkNDMsIDB4NDE4MjM5NzksIDB4OTMyYmNkZjYsIDB4YjY1N2MzNGQsIDB4NGVkZmQyODIsIDB4N2FlNTI5MGMsIDB4M2NiOTUzNmIsIDB4ODUxZTIwZmUsIDB4OTgzMzU1N2UsIDB4MTNlY2YwYjAsIDB4ZDNmZmIzNzIsIDB4M2Y4NWM1YzEsIDB4MGFlZjdlZDJdO1xuXG4gIHNCb3hbNF0gPSBbMHg3ZWM5MGMwNCwgMHgyYzZlNzRiOSwgMHg5YjBlNjZkZiwgMHhhNjMzNzkxMSwgMHhiODZhN2ZmZiwgMHgxZGQzNThmNSwgMHg0NGRkOWQ0NCwgMHgxNzMxMTY3ZiwgMHgwOGZiZjFmYSwgMHhlN2Y1MTFjYywgMHhkMjA1MWIwMCwgMHg3MzVhYmEwMCwgMHgyYWI3MjJkOCwgMHgzODYzODFjYiwgMHhhY2Y2MjQzYSwgMHg2OWJlZmQ3YSwgMHhlNmEyZTc3ZiwgMHhmMGM3MjBjZCwgMHhjNDQ5NDgxNiwgMHhjY2Y1YzE4MCwgMHgzODg1MTY0MCwgMHgxNWIwYTg0OCwgMHhlNjhiMThjYiwgMHg0Y2FhZGVmZiwgMHg1ZjQ4MGEwMSwgMHgwNDEyYjJhYSwgMHgyNTk4MTRmYywgMHg0MWQwZWZlMiwgMHg0ZTQwYjQ4ZCwgMHgyNDhlYjZmYiwgMHg4ZGJhMWNmZSwgMHg0MWE5OWIwMiwgMHgxYTU1MGEwNCwgMHhiYThmNjVjYiwgMHg3MjUxZjRlNywgMHg5NWE1MTcyNSwgMHhjMTA2ZWNkNywgMHg5N2E1OTgwYSwgMHhjNTM5YjlhYSwgMHg0ZDc5ZmU2YSwgMHhmMmYzZjc2MywgMHg2OGFmODA0MCwgMHhlZDBjOWU1NiwgMHgxMWI0OTU4YiwgMHhlMWViNWE4OCwgMHg4NzA5ZTZiMCwgMHhkN2UwNzE1NiwgMHg0ZTI5ZmVhNywgMHg2MzY2ZTUyZCwgMHgwMmQxYzAwMCwgMHhjNGFjOGUwNSwgMHg5Mzc3ZjU3MSwgMHgwYzA1MzcyYSwgMHg1Nzg1MzVmMiwgMHgyMjYxYmUwMiwgMHhkNjQyYTBjOSwgMHhkZjEzYTI4MCwgMHg3NGI1NWJkMiwgMHg2ODIxOTljMCwgMHhkNDIxZTVlYywgMHg1M2ZiM2NlOCwgMHhjOGFkZWRiMywgMHgyOGE4N2ZjOSwgMHgzZDk1OTk4MSwgMHg1YzFmZjkwMCwgMHhmZTM4ZDM5OSwgMHgwYzRlZmYwYiwgMHgwNjI0MDdlYSwgMHhhYTJmNGZiMSwgMHg0ZmI5Njk3NiwgMHg5MGM3OTUwNSwgMHhiMGE4YTc3NCwgMHhlZjU1YTFmZiwgMHhlNTljYTJjMiwgMHhhNmI2MmQyNywgMHhlNjZhNDI2MywgMHhkZjY1MDAxZiwgMHgwZWM1MDk2NiwgMHhkZmRkNTViYywgMHgyOWRlMDY1NSwgMHg5MTFlNzM5YSwgMHgxN2FmODk3NSwgMHgzMmM3OTExYywgMHg4OWY4OTQ2OCwgMHgwZDAxZTk4MCwgMHg1MjQ3NTVmNCwgMHgwM2I2M2NjOSwgMHgwY2M4NDRiMiwgMHhiY2YzZjBhYSwgMHg4N2FjMzZlOSwgMHhlNTNhNzQyNiwgMHgwMWIzZDgyYiwgMHgxYTllNzQ0OSwgMHg2NGVlMmQ3ZSwgMHhjZGRiYjFkYSwgMHgwMWM5NDkxMCwgMHhiODY4YmY4MCwgMHgwZDI2ZjNmZCwgMHg5MzQyZWRlNywgMHgwNGE1YzI4NCwgMHg2MzY3MzdiNiwgMHg1MGY1YjYxNiwgMHhmMjQ3NjZlMywgMHg4ZWNhMzZjMSwgMHgxMzZlMDVkYiwgMHhmZWYxODM5MSwgMHhmYjg4N2EzNywgMHhkNmU3ZjdkNCwgMHhjN2ZiN2RjOSwgMHgzMDYzZmNkZiwgMHhiNmY1ODlkZSwgMHhlYzI5NDFkYSwgMHgyNmU0NjY5NSwgMHhiNzU2NjQxOSwgMHhmNjU0ZWZjNSwgMHhkMDhkNThiNywgMHg0ODkyNTQwMSwgMHhjMWJhY2I3ZiwgMHhlNWZmNTUwZiwgMHhiNjA4MzA0OSwgMHg1YmI1ZDBlOCwgMHg4N2Q3MmU1YSwgMHhhYjZhNmVlMSwgMHgyMjNhNjZjZSwgMHhjNjJiZjNjZCwgMHg5ZTA4ODVmOSwgMHg2OGNiM2U0NywgMHgwODZjMDEwZiwgMHhhMjFkZTgyMCwgMHhkMThiNjlkZSwgMHhmM2Y2NTc3NywgMHhmYTAyYzNmNiwgMHg0MDdlZGFjMywgMHhjYmIzZDU1MCwgMHgxNzkzMDg0ZCwgMHhiMGQ3MGViYSwgMHgwYWIzNzhkNSwgMHhkOTUxZmIwYywgMHhkZWQ3ZGE1NiwgMHg0MTI0YmJlNCwgMHg5NGNhMGI1NiwgMHgwZjU3NTVkMSwgMHhlMGUxZTU2ZSwgMHg2MTg0YjViZSwgMHg1ODBhMjQ5ZiwgMHg5NGY3NGJjMCwgMHhlMzI3ODg4ZSwgMHg5ZjdiNTU2MSwgMHhjM2RjMDI4MCwgMHgwNTY4NzcxNSwgMHg2NDZjNmJkNywgMHg0NDkwNGRiMywgMHg2NmI0ZjBhMywgMHhjMGYxNjQ4YSwgMHg2OTdlZDVhZiwgMHg0OWU5MmZmNiwgMHgzMDllMzc0ZiwgMHgyY2I2MzU2YSwgMHg4NTgwODU3MywgMHg0OTkxZjg0MCwgMHg3NmYwYWUwMiwgMHgwODNiZTg0ZCwgMHgyODQyMWM5YSwgMHg0NDQ4OTQwNiwgMHg3MzZlNGNiOCwgMHhjMTA5MjkxMCwgMHg4YmM5NWZjNiwgMHg3ZDg2OWNmNCwgMHgxMzRmNjE2ZiwgMHgyZTc3MTE4ZCwgMHhiMzFiMmJlMSwgMHhhYTkwYjQ3MiwgMHgzY2E1ZDcxNywgMHg3ZDE2MWJiYSwgMHg5Y2FkOTAxMCwgMHhhZjQ2MmJhMiwgMHg5ZmU0NTlkMiwgMHg0NWQzNDU1OSwgMHhkOWYyZGExMywgMHhkYmM2NTQ4NywgMHhmM2U0Zjk0ZSwgMHgxNzZkNDg2ZiwgMHgwOTdjMTNlYSwgMHg2MzFkYTVjNywgMHg0NDVmNzM4MiwgMHgxNzU2ODNmNCwgMHhjZGM2NmE5NywgMHg3MGJlMDI4OCwgMHhiM2NkY2Y3MiwgMHg2ZTVkZDJmMywgMHgyMDkzNjA3OSwgMHg0NTliODBhNSwgMHhiZTYwZTJkYiwgMHhhOWMyMzEwMSwgMHhlYmE1MzE1YywgMHgyMjRlNDJmMiwgMHgxYzVjMTU3MiwgMHhmNjcyMWIyYywgMHgxYWQyZmZmMywgMHg4YzI1NDA0ZSwgMHgzMjRlZDcyZiwgMHg0MDY3YjdmZCwgMHgwNTIzMTM4ZSwgMHg1Y2EzYmM3OCwgMHhkYzBmZDY2ZSwgMHg3NTkyMjI4MywgMHg3ODRkNmIxNywgMHg1OGViYjE2ZSwgMHg0NDA5NGY4NSwgMHgzZjQ4MWQ4NywgMHhmY2ZlYWU3YiwgMHg3N2I1ZmY3NiwgMHg4YzIzMDJiZiwgMHhhYWY0NzU1NiwgMHg1ZjQ2YjAyYSwgMHgyYjA5MjgwMSwgMHgzZDM4ZjVmNywgMHgwY2E4MWYzNiwgMHg1MmFmNGE4YSwgMHg2NmQ1ZTdjMCwgMHhkZjNiMDg3NCwgMHg5NTA1NTExMCwgMHgxYjVhZDdhOCwgMHhmNjFlZDVhZCwgMHg2Y2Y2ZTQ3OSwgMHgyMDc1ODE4NCwgMHhkMGNlZmE2NSwgMHg4OGY3YmU1OCwgMHg0YTA0NjgyNiwgMHgwZmY2ZjhmMywgMHhhMDljN2Y3MCwgMHg1MzQ2YWJhMCwgMHg1Y2U5NmMyOCwgMHhlMTc2ZWRhMywgMHg2YmFjMzA3ZiwgMHgzNzY4MjlkMiwgMHg4NTM2MGZhOSwgMHgxN2UzZmUyYSwgMHgyNGI3OTc2NywgMHhmNWE5NmIyMCwgMHhkNmNkMjU5NSwgMHg2OGZmMWViZiwgMHg3NTU1NDQyYywgMHhmMTlmMDZiZSwgMHhmOWUwNjU5YSwgMHhlZWI5NDkxZCwgMHgzNDAxMDcxOCwgMHhiYjMwY2FiOCwgMHhlODIyZmUxNSwgMHg4ODU3MDk4MywgMHg3NTBlNjI0OSwgMHhkYTYyN2U1NSwgMHg1ZTc2ZmZhOCwgMHhiMTUzNDU0NiwgMHg2ZDQ3ZGUwOCwgMHhlZmU5ZTdkNF07XG5cbiAgc0JveFs1XSA9IFsweGY2ZmE4ZjlkLCAweDJjYWM2Y2UxLCAweDRjYTM0ODY3LCAweGUyMzM3ZjdjLCAweDk1ZGIwOGU3LCAweDAxNjg0M2I0LCAweGVjZWQ1Y2JjLCAweDMyNTU1M2FjLCAweGJmOWYwOTYwLCAweGRmYTFlMmVkLCAweDgzZjA1NzlkLCAweDYzZWQ4NmI5LCAweDFhYjZhNmI4LCAweGRlNWViZTM5LCAweGYzOGZmNzMyLCAweDg5ODliMTM4LCAweDMzZjE0OTYxLCAweGMwMTkzN2JkLCAweGY1MDZjNmRhLCAweGU0NjI1ZTdlLCAweGEzMDhlYTk5LCAweDRlMjNlMzNjLCAweDc5Y2JkN2NjLCAweDQ4YTE0MzY3LCAweGEzMTQ5NjE5LCAweGZlYzk0YmQ1LCAweGExMTQxNzRhLCAweGVhYTAxODY2LCAweGEwODRkYjJkLCAweDA5YTg0ODZmLCAweGE4ODg2MTRhLCAweDI5MDBhZjk4LCAweDAxNjY1OTkxLCAweGUxOTkyODYzLCAweGM4ZjMwYzYwLCAweDJlNzhlZjNjLCAweGQwZDUxOTMyLCAweGNmMGZlYzE0LCAweGY3Y2EwN2QyLCAweGQwYTgyMDcyLCAweGZkNDExOTdlLCAweDkzMDVhNmIwLCAweGU4NmJlM2RhLCAweDc0YmVkM2NkLCAweDM3MmRhNTNjLCAweDRjN2Y0NDQ4LCAweGRhYjVkNDQwLCAweDZkYmEwZWMzLCAweDA4MzkxOWE3LCAweDlmYmFlZWQ5LCAweDQ5ZGJjZmIwLCAweDRlNjcwYzUzLCAweDVjM2Q5YzAxLCAweDY0YmRiOTQxLCAweDJjMGU2MzZhLCAweGJhN2RkOWNkLCAweGVhNmY3Mzg4LCAweGU3MGJjNzYyLCAweDM1ZjI5YWRiLCAweDVjNGNkZDhkLCAweGYwZDQ4ZDhjLCAweGI4ODE1M2UyLCAweDA4YTE5ODY2LCAweDFhZTJlYWM4LCAweDI4NGNhZjg5LCAweGFhOTI4MjIzLCAweDkzMzRiZTUzLCAweDNiM2EyMWJmLCAweDE2NDM0YmUzLCAweDlhZWEzOTA2LCAweGVmZThjMzZlLCAweGY4OTBjZGQ5LCAweDgwMjI2ZGFlLCAweGMzNDBhNGEzLCAweGRmN2U5YzA5LCAweGE2OTRhODA3LCAweDViN2M1ZWNjLCAweDIyMWRiM2E2LCAweDlhNjlhMDJmLCAweDY4ODE4YTU0LCAweGNlYjIyOTZmLCAweDUzYzA4NDNhLCAweGZlODkzNjU1LCAweDI1YmZlNjhhLCAweGI0NjI4YWJjLCAweGNmMjIyZWJmLCAweDI1YWM2ZjQ4LCAweGE5YTk5Mzg3LCAweDUzYmRkYjY1LCAweGU3NmZmYmU3LCAweGU5NjdmZDc4LCAweDBiYTkzNTYzLCAweDhlMzQyYmMxLCAweGU4YTExYmU5LCAweDQ5ODA3NDBkLCAweGM4MDg3ZGZjLCAweDhkZTRiZjk5LCAweGExMTEwMWEwLCAweDdmZDM3OTc1LCAweGRhNWEyNmMwLCAweGU4MWY5OTRmLCAweDk1MjhjZDg5LCAweGZkMzM5ZmVkLCAweGI4NzgzNGJmLCAweDVmMDQ0NTZkLCAweDIyMjU4Njk4LCAweGM5YzRjODNiLCAweDJkYzE1NmJlLCAweDRmNjI4ZGFhLCAweDU3ZjU1ZWM1LCAweGUyMjIwYWJlLCAweGQyOTE2ZWJmLCAweDRlYzc1Yjk1LCAweDI0ZjJjM2MwLCAweDQyZDE1ZDk5LCAweGNkMGQ3ZmEwLCAweDdiNmUyN2ZmLCAweGE4ZGM4YWYwLCAweDczNDVjMTA2LCAweGY0MWUyMzJmLCAweDM1MTYyMzg2LCAweGU2ZWE4OTI2LCAweDMzMzNiMDk0LCAweDE1N2VjNmYyLCAweDM3MmI3NGFmLCAweDY5MjU3M2U0LCAweGU5YTlkODQ4LCAweGYzMTYwMjg5LCAweDNhNjJlZjFkLCAweGE3ODdlMjM4LCAweGYzYTVmNjc2LCAweDc0MzY0ODUzLCAweDIwOTUxMDYzLCAweDQ1NzY2OThkLCAweGI2ZmFkNDA3LCAweDU5MmFmOTUwLCAweDM2ZjczNTIzLCAweDRjZmI2ZTg3LCAweDdkYTRjZWMwLCAweDZjMTUyZGFhLCAweGNiMDM5NmE4LCAweGM1MGRmZTVkLCAweGZjZDcwN2FiLCAweDA5MjFjNDJmLCAweDg5ZGZmMGJiLCAweDVmZTJiZTc4LCAweDQ0OGY0ZjMzLCAweDc1NDYxM2M5LCAweDJiMDVkMDhkLCAweDQ4YjlkNTg1LCAweGRjMDQ5NDQxLCAweGM4MDk4ZjliLCAweDdkZWRlNzg2LCAweGMzOWEzMzczLCAweDQyNDEwMDA1LCAweDZhMDkxNzUxLCAweDBlZjNjOGE2LCAweDg5MDA3MmQ2LCAweDI4MjA3NjgyLCAweGE5YTlmN2JlLCAweGJmMzI2NzlkLCAweGQ0NWI1Yjc1LCAweGIzNTNmZDAwLCAweGNiYjBlMzU4LCAweDgzMGYyMjBhLCAweDFmOGZiMjE0LCAweGQzNzJjZjA4LCAweGNjM2M0YTEzLCAweDhjZjYzMTY2LCAweDA2MWM4N2JlLCAweDg4Yzk4Zjg4LCAweDYwNjJlMzk3LCAweDQ3Y2Y4ZTdhLCAweGI2Yzg1MjgzLCAweDNjYzJhY2ZiLCAweDNmYzA2OTc2LCAweDRlOGYwMjUyLCAweDY0ZDgzMTRkLCAweGRhMzg3MGUzLCAweDFlNjY1NDU5LCAweGMxMDkwOGYwLCAweDUxMzAyMWE1LCAweDZjNWI2OGI3LCAweDgyMmY4YWEwLCAweDMwMDdjZDNlLCAweDc0NzE5ZWVmLCAweGRjODcyNjgxLCAweDA3MzM0MGQ0LCAweDdlNDMyZmQ5LCAweDBjNWVjMjQxLCAweDg4MDkyODZjLCAweGY1OTJkODkxLCAweDA4YTkzMGY2LCAweDk1N2VmMzA1LCAweGI3ZmJmZmJkLCAweGMyNjZlOTZmLCAweDZmZTRhYzk4LCAweGIxNzNlY2MwLCAweGJjNjBiNDJhLCAweDk1MzQ5OGRhLCAweGZiYTFhZTEyLCAweDJkNGJkNzM2LCAweDBmMjVmYWFiLCAweGE0ZjNmY2ViLCAweGUyOTY5MTIzLCAweDI1N2YwYzNkLCAweDkzNDhhZjQ5LCAweDM2MTQwMGJjLCAweGU4ODE2ZjRhLCAweDM4MTRmMjAwLCAweGEzZjk0MDQzLCAweDljN2E1NGMyLCAweGJjNzA0ZjU3LCAweGRhNDFlN2Y5LCAweGMyNWFkMzNhLCAweDU0ZjRhMDg0LCAweGIxN2Y1NTA1LCAweDU5MzU3Y2JlLCAweGVkYmQxNWM4LCAweDdmOTdjNWFiLCAweGJhNWFjN2I1LCAweGI2ZjZkZWFmLCAweDNhNDc5YzNhLCAweDUzMDJkYTI1LCAweDY1M2Q3ZTZhLCAweDU0MjY4ZDQ5LCAweDUxYTQ3N2VhLCAweDUwMTdkNTViLCAweGQ3ZDI1ZDg4LCAweDQ0MTM2Yzc2LCAweDA0MDRhOGM4LCAweGI4ZTVhMTIxLCAweGI4MWE5MjhhLCAweDYwZWQ1ODY5LCAweDk3YzU1Yjk2LCAweGVhZWM5OTFiLCAweDI5OTM1OTEzLCAweDAxZmRiN2YxLCAweDA4OGU4ZGZhLCAweDlhYjZmNmY1LCAweDNiNGNiZjlmLCAweDRhNWRlM2FiLCAweGU2MDUxZDM1LCAweGEwZTFkODU1LCAweGQzNmI0Y2YxLCAweGY1NDRlZGViLCAweGIwZTkzNTI0LCAweGJlYmI4ZmJkLCAweGEyZDc2MmNmLCAweDQ5YzkyZjU0LCAweDM4YjVmMzMxLCAweDcxMjhhNDU0LCAweDQ4MzkyOTA1LCAweGE2NWIxZGI4LCAweDg1MWM5N2JkLCAweGQ2NzVjZjJmXTtcblxuICBzQm94WzZdID0gWzB4ODVlMDQwMTksIDB4MzMyYmY1NjcsIDB4NjYyZGJmZmYsIDB4Y2ZjNjU2OTMsIDB4MmE4ZDdmNmYsIDB4YWI5YmM5MTIsIDB4ZGU2MDA4YTEsIDB4MjAyOGRhMWYsIDB4MDIyN2JjZTcsIDB4NGQ2NDI5MTYsIDB4MThmYWMzMDAsIDB4NTBmMThiODIsIDB4MmNiMmNiMTEsIDB4YjIzMmU3NWMsIDB4NGIzNjk1ZjIsIDB4YjI4NzA3ZGUsIDB4YTA1ZmJjZjYsIDB4Y2Q0MTgxZTksIDB4ZTE1MDIxMGMsIDB4ZTI0ZWYxYmQsIDB4YjE2OGMzODEsIDB4ZmRlNGU3ODksIDB4NWM3OWIwZDgsIDB4MWU4YmZkNDMsIDB4NGQ0OTUwMDEsIDB4MzhiZTQzNDEsIDB4OTEzY2VlMWQsIDB4OTJhNzljM2YsIDB4MDg5NzY2YmUsIDB4YmFlZWFkZjQsIDB4MTI4NmJlY2YsIDB4YjZlYWNiMTksIDB4MjY2MGMyMDAsIDB4NzU2NWJkZTQsIDB4NjQyNDFmN2EsIDB4ODI0OGRjYTksIDB4YzNiM2FkNjYsIDB4MjgxMzYwODYsIDB4MGJkOGRmYTgsIDB4MzU2ZDFjZjIsIDB4MTA3Nzg5YmUsIDB4YjNiMmU5Y2UsIDB4MDUwMmFhOGYsIDB4MGJjMDM1MWUsIDB4MTY2YmY1MmEsIDB4ZWIxMmZmODIsIDB4ZTM0ODY5MTEsIDB4ZDM0ZDc1MTYsIDB4NGU3YjNhZmYsIDB4NWY0MzY3MWIsIDB4OWNmNmUwMzcsIDB4NDk4MWFjODMsIDB4MzM0MjY2Y2UsIDB4OGM5MzQxYjcsIDB4ZDBkODU0YzAsIDB4Y2IzYTZjODgsIDB4NDdiYzI4MjksIDB4NDcyNWJhMzcsIDB4YTY2YWQyMmIsIDB4N2FkNjFmMWUsIDB4MGM1Y2JhZmEsIDB4NDQzN2YxMDcsIDB4YjZlNzk5NjIsIDB4NDJkMmQ4MTYsIDB4MGE5NjEyODgsIDB4ZTFhNWMwNmUsIDB4MTM3NDllNjcsIDB4NzJmYzA4MWEsIDB4YjFkMTM5ZjcsIDB4Zjk1ODM3NDUsIDB4Y2YxOWRmNTgsIDB4YmVjM2Y3NTYsIDB4YzA2ZWJhMzAsIDB4MDcyMTFiMjQsIDB4NDVjMjg4MjksIDB4Yzk1ZTMxN2YsIDB4YmM4ZWM1MTEsIDB4MzhiYzQ2ZTksIDB4YzZlNmZhMTQsIDB4YmFlODU4NGEsIDB4YWQ0ZWJjNDYsIDB4NDY4ZjUwOGIsIDB4NzgyOTQzNWYsIDB4ZjEyNDE4M2IsIDB4ODIxZGJhOWYsIDB4YWZmNjBmZjQsIDB4ZWEyYzRlNmQsIDB4MTZlMzkyNjQsIDB4OTI1NDRhOGIsIDB4MDA5YjRmYzMsIDB4YWJhNjhjZWQsIDB4OWFjOTZmNzgsIDB4MDZhNWI3OWEsIDB4YjI4NTZlNmUsIDB4MWFlYzNjYTksIDB4YmU4Mzg2ODgsIDB4MGUwODA0ZTksIDB4NTVmMWJlNTYsIDB4ZTdlNTM2M2IsIDB4YjNhMWYyNWQsIDB4ZjdkZWJiODUsIDB4NjFmZTAzM2MsIDB4MTY3NDYyMzMsIDB4M2MwMzRjMjgsIDB4ZGE2ZDBjNzQsIDB4NzlhYWM1NmMsIDB4M2NlNGUxYWQsIDB4NTFmMGM4MDIsIDB4OThmOGYzNWEsIDB4MTYyNmE0OWYsIDB4ZWVkODJiMjksIDB4MWQzODJmZTMsIDB4MGM0ZmI5OWEsIDB4YmIzMjU3NzgsIDB4M2VjNmQ5N2IsIDB4NmU3N2E2YTksIDB4Y2I2NThiNWMsIDB4ZDQ1MjMwYzcsIDB4MmJkMTQwOGIsIDB4NjBjMDNlYjcsIDB4YjkwNjhkNzgsIDB4YTMzNzU0ZjQsIDB4ZjQzMGM4N2QsIDB4YzhhNzEzMDIsIDB4Yjk2ZDhjMzIsIDB4ZWJkNGU3YmUsIDB4YmU4YjlkMmQsIDB4Nzk3OWZiMDYsIDB4ZTcyMjUzMDgsIDB4OGI3NWNmNzcsIDB4MTFlZjhkYTQsIDB4ZTA4M2M4NTgsIDB4OGQ2Yjc4NmYsIDB4NWE2MzE3YTYsIDB4ZmE1Y2Y3YTAsIDB4NWRkYTAwMzMsIDB4ZjI4ZWJmYjAsIDB4ZjViOWMzMTAsIDB4YTBlYWMyODAsIDB4MDhiOTc2N2EsIDB4YTNkOWQyYjAsIDB4NzlkMzQyMTcsIDB4MDIxYTcxOGQsIDB4OWFjNjMzNmEsIDB4MjcxMWZkNjAsIDB4NDM4MDUwZTMsIDB4MDY5OTA4YTgsIDB4M2Q3ZmVkYzQsIDB4ODI2ZDJiZWYsIDB4NGVlYjg0NzYsIDB4NDg4ZGNmMjUsIDB4MzZjOWQ1NjYsIDB4MjhlNzRlNDEsIDB4YzI2MTBhY2EsIDB4M2Q0OWE5Y2YsIDB4YmFlM2I5ZGYsIDB4YjY1ZjhkZTYsIDB4OTJhZWFmNjQsIDB4M2FjN2Q1ZTYsIDB4OWVhODA1MDksIDB4ZjIyYjAxN2QsIDB4YTQxNzNmNzAsIDB4ZGQxZTE2YzMsIDB4MTVlMGQ3ZjksIDB4NTBiMWI4ODcsIDB4MmI5ZjRmZDUsIDB4NjI1YWJhODIsIDB4NmEwMTc5NjIsIDB4MmVjMDFiOWMsIDB4MTU0ODhhYTksIDB4ZDcxNmU3NDAsIDB4NDAwNTVhMmMsIDB4OTNkMjlhMjIsIDB4ZTMyZGJmOWEsIDB4MDU4NzQ1YjksIDB4MzQ1M2RjMWUsIDB4ZDY5OTI5NmUsIDB4NDk2Y2ZmNmYsIDB4MWM5ZjQ5ODYsIDB4ZGZlMmVkMDcsIDB4Yjg3MjQyZDEsIDB4MTlkZTdlYWUsIDB4MDUzZTU2MWEsIDB4MTVhZDZmOGMsIDB4NjY2MjZjMWMsIDB4NzE1NGMyNGMsIDB4ZWEwODJiMmEsIDB4OTNlYjI5MzksIDB4MTdkY2IwZjAsIDB4NThkNGYyYWUsIDB4OWVhMjk0ZmIsIDB4NTJjZjU2NGMsIDB4OTg4M2ZlNjYsIDB4MmVjNDA1ODEsIDB4NzYzOTUzYzMsIDB4MDFkNjY5MmUsIDB4ZDNhMGMxMDgsIDB4YTFlNzE2MGUsIDB4ZTRmMmRmYTYsIDB4NjkzZWQyODUsIDB4NzQ5MDQ2OTgsIDB4NGMyYjBlZGQsIDB4NGY3NTc2NTYsIDB4NWQzOTMzNzgsIDB4YTEzMjIzNGYsIDB4M2QzMjFjNWQsIDB4YzNmNWUxOTQsIDB4NGIyNjkzMDEsIDB4Yzc5ZjAyMmYsIDB4M2M5OTdlN2UsIDB4NWU0Zjk1MDQsIDB4M2ZmYWZiYmQsIDB4NzZmN2FkMGUsIDB4Mjk2NjkzZjQsIDB4M2QxZmNlNmYsIDB4YzYxZTQ1YmUsIDB4ZDNiNWFiMzQsIDB4ZjcyYmY5YjcsIDB4MWIwNDM0YzAsIDB4NGU3MmI1NjcsIDB4NTU5MmEzM2QsIDB4YjUyMjkzMDEsIDB4Y2ZkMmE4N2YsIDB4NjBhZWI3NjcsIDB4MTgxNDM4NmIsIDB4MzBiY2MzM2QsIDB4MzhhMGMwN2QsIDB4ZmQxNjA2ZjIsIDB4YzM2MzUxOWIsIDB4NTg5ZGQzOTAsIDB4NTQ3OWY4ZTYsIDB4MWNiOGQ2NDcsIDB4OTdmZDYxYTksIDB4ZWE3NzU5ZjQsIDB4MmQ1NzUzOWQsIDB4NTY5YTU4Y2YsIDB4ZTg0ZTYzYWQsIDB4NDYyZTFiNzgsIDB4NjU4MGY4N2UsIDB4ZjM4MTc5MTQsIDB4OTFkYTU1ZjQsIDB4NDBhMjMwZjMsIDB4ZDE5ODhmMzUsIDB4YjZlMzE4ZDIsIDB4M2ZmYTUwYmMsIDB4M2Q0MGYwMjEsIDB4YzNjMGJkYWUsIDB4NDk1OGMyNGMsIDB4NTE4ZjM2YjIsIDB4ODRiMWQzNzAsIDB4MGZlZGNlODMsIDB4ODc4ZGRhZGEsIDB4ZjJhMjc5YzcsIDB4OTRlMDFiZTgsIDB4OTA3MTZmNGIsIDB4OTU0YjhhYTNdO1xuXG4gIHNCb3hbN10gPSBbMHhlMjE2MzAwZCwgMHhiYmRkZmZmYywgMHhhN2ViZGFiZCwgMHgzNTY0ODA5NSwgMHg3Nzg5ZjhiNywgMHhlNmMxMTIxYiwgMHgwZTI0MTYwMCwgMHgwNTJjZThiNSwgMHgxMWE5Y2ZiMCwgMHhlNTk1MmYxMSwgMHhlY2U3OTkwYSwgMHg5Mzg2ZDE3NCwgMHgyYTQyOTMxYywgMHg3NmUzODExMSwgMHhiMTJkZWYzYSwgMHgzN2RkZGRmYywgMHhkZTlhZGViMSwgMHgwYTBjYzMyYywgMHhiZTE5NzAyOSwgMHg4NGEwMDk0MCwgMHhiYjI0M2EwZiwgMHhiNGQxMzdjZiwgMHhiNDRlNzlmMCwgMHgwNDllZWRmZCwgMHgwYjE1YTE1ZCwgMHg0ODBkMzE2OCwgMHg4YmJiZGU1YSwgMHg2NjlkZWQ0MiwgMHhjN2VjZTgzMSwgMHgzZjhmOTVlNywgMHg3MmRmMTkxYiwgMHg3NTgwMzMwZCwgMHg5NDA3NDI1MSwgMHg1YzdkY2RmYSwgMHhhYmJlNmQ2MywgMHhhYTQwMjE2NCwgMHhiMzAxZDQwYSwgMHgwMmU3ZDFjYSwgMHg1MzU3MWRhZSwgMHg3YTMxODJhMiwgMHgxMmE4ZGRlYywgMHhmZGFhMzM1ZCwgMHgxNzZmNDNlOCwgMHg3MWZiNDZkNCwgMHgzODEyOTAyMiwgMHhjZTk0OWFkNCwgMHhiODQ3NjlhZCwgMHg5NjViZDg2MiwgMHg4MmYzZDA1NSwgMHg2NmZiOTc2NywgMHgxNWI4MGI0ZSwgMHgxZDViNDdhMCwgMHg0Y2ZkZTA2ZiwgMHhjMjhlYzRiOCwgMHg1N2U4NzI2ZSwgMHg2NDdhNzhmYywgMHg5OTg2NWQ0NCwgMHg2MDhiZDU5MywgMHg2YzIwMGUwMywgMHgzOWRjNWZmNiwgMHg1ZDBiMDBhMywgMHhhZTYzYWZmMiwgMHg3ZThiZDYzMiwgMHg3MDEwOGMwYywgMHhiYmQzNTA0OSwgMHgyOTk4ZGYwNCwgMHg5ODBjZjQyYSwgMHg5YjZkZjQ5MSwgMHg5ZTdlZGQ1MywgMHgwNjkxODU0OCwgMHg1OGNiN2UwNywgMHgzYjc0ZWYyZSwgMHg1MjJmZmZiMSwgMHhkMjQ3MDhjYywgMHgxYzdlMjdjZCwgMHhhNGViMjE1YiwgMHgzY2YxZDJlMiwgMHgxOWI0N2EzOCwgMHg0MjRmNzYxOCwgMHgzNTg1NjAzOSwgMHg5ZDE3ZGVlNywgMHgyN2ViMzVlNiwgMHhjOWFmZjY3YiwgMHgzNmJhZjViOCwgMHgwOWM0NjdjZCwgMHhjMTg5MTBiMSwgMHhlMTFkYmY3YiwgMHgwNmNkMWFmOCwgMHg3MTcwYzYwOCwgMHgyZDVlMzM1NCwgMHhkNGRlNDk1YSwgMHg2NGM2ZDAwNiwgMHhiY2MwYzYyYywgMHgzZGQwMGRiMywgMHg3MDhmOGYzNCwgMHg3N2Q1MWI0MiwgMHgyNjRmNjIwZiwgMHgyNGI4ZDJiZiwgMHgxNWMxYjc5ZSwgMHg0NmE1MjU2NCwgMHhmOGQ3ZTU0ZSwgMHgzZTM3ODE2MCwgMHg3ODk1Y2RhNSwgMHg4NTljMTVhNSwgMHhlNjQ1OTc4OCwgMHhjMzdiYzc1ZiwgMHhkYjA3YmEwYywgMHgwNjc2YTNhYiwgMHg3ZjIyOWIxZSwgMHgzMTg0MmU3YiwgMHgyNDI1OWZkNywgMHhmOGJlZjQ3MiwgMHg4MzVmZmNiOCwgMHg2ZGY0YzFmMiwgMHg5NmY1YjE5NSwgMHhmZDBhZjBmYywgMHhiMGZlMTM0YywgMHhlMjUwNmQzZCwgMHg0ZjliMTJlYSwgMHhmMjE1ZjIyNSwgMHhhMjIzNzM2ZiwgMHg5ZmI0YzQyOCwgMHgyNWQwNDk3OSwgMHgzNGM3MTNmOCwgMHhjNDYxODE4NywgMHhlYTdhNmU5OCwgMHg3Y2QxNmVmYywgMHgxNDM2ODc2YywgMHhmMTU0NDEwNywgMHhiZWRlZWUxNCwgMHg1NmU5YWYyNywgMHhhMDRhYTQ0MSwgMHgzY2Y3Yzg5OSwgMHg5MmVjYmFlNiwgMHhkZDY3MDE2ZCwgMHgxNTE2ODJlYiwgMHhhODQyZWVkZiwgMHhmZGJhNjBiNCwgMHhmMTkwN2I3NSwgMHgyMGUzMDMwZiwgMHgyNGQ4YzI5ZSwgMHhlMTM5NjczYiwgMHhlZmE2M2ZiOCwgMHg3MTg3MzA1NCwgMHhiNmYyY2YzYiwgMHg5ZjMyNjQ0MiwgMHhjYjE1YTRjYywgMHhiMDFhNDUwNCwgMHhmMWU0N2Q4ZCwgMHg4NDRhMWJlNSwgMHhiYWU3ZGZkYywgMHg0MmNiZGE3MCwgMHhjZDdkYWUwYSwgMHg1N2U4NWI3YSwgMHhkNTNmNWFmNiwgMHgyMGNmNGQ4YywgMHhjZWE0ZDQyOCwgMHg3OWQxMzBhNCwgMHgzNDg2ZWJmYiwgMHgzM2QzY2RkYywgMHg3Nzg1M2I1MywgMHgzN2VmZmNiNSwgMHhjNTA2ODc3OCwgMHhlNTgwYjNlNiwgMHg0ZTY4YjhmNCwgMHhjNWM4YjM3ZSwgMHgwZDgwOWVhMiwgMHgzOThmZWI3YywgMHgxMzJhNGY5NCwgMHg0M2I3OTUwZSwgMHgyZmVlN2QxYywgMHgyMjM2MTNiZCwgMHhkZDA2Y2FhMiwgMHgzN2RmOTMyYiwgMHhjNDI0ODI4OSwgMHhhY2YzZWJjMywgMHg1NzE1ZjZiNywgMHhlZjM0NzhkZCwgMHhmMjY3NjE2ZiwgMHhjMTQ4Y2JlNCwgMHg5MDUyODE1ZSwgMHg1ZTQxMGZhYiwgMHhiNDhhMjQ2NSwgMHgyZWRhN2ZhNCwgMHhlODdiNDBlNCwgMHhlOThlYTA4NCwgMHg1ODg5ZTllMSwgMHhlZmQzOTBmYywgMHhkZDA3ZDM1YiwgMHhkYjQ4NTY5NCwgMHgzOGQ3ZTViMiwgMHg1NzcyMDEwMSwgMHg3MzBlZGViYywgMHg1YjY0MzExMywgMHg5NDkxN2U0ZiwgMHg1MDNjMmZiYSwgMHg2NDZmMTI4MiwgMHg3NTIzZDI0YSwgMHhlMDc3OTY5NSwgMHhmOWMxN2E4ZiwgMHg3YTViMjEyMSwgMHhkMTg3Yjg5NiwgMHgyOTI2M2E0ZCwgMHhiYTUxMGNkZiwgMHg4MWY0N2M5ZiwgMHhhZDExNjNlZCwgMHhlYTdiNTk2NSwgMHgxYTAwNzI2ZSwgMHgxMTQwMzA5MiwgMHgwMGRhNmQ3NywgMHg0YTBjZGQ2MSwgMHhhZDFmNDYwMywgMHg2MDViZGZiMCwgMHg5ZWVkYzM2NCwgMHgyMmViZTZhOCwgMHhjZWU3ZDI4YSwgMHhhMGU3MzZhMCwgMHg1NTY0YTZiOSwgMHgxMDg1MzIwOSwgMHhjN2ViOGYzNywgMHgyZGU3MDVjYSwgMHg4OTUxNTcwZiwgMHhkZjA5ODIyYiwgMHhiZDY5MWE2YywgMHhhYTEyZTRmMiwgMHg4NzQ1MWMwZiwgMHhlMGY2YTI3YSwgMHgzYWRhNDgxOSwgMHg0Y2YxNzY0ZiwgMHgwZDc3MWMyYiwgMHg2N2NkYjE1NiwgMHgzNTBkODM4NCwgMHg1OTM4ZmEwZiwgMHg0MjM5OWVmMywgMHgzNjk5N2IwNywgMHgwZTg0MDkzZCwgMHg0YWE5M2U2MSwgMHg4MzYwZDg3YiwgMHgxZmE5OGIwYywgMHgxMTQ5MzgyYywgMHhlOTc2MjVhNSwgMHgwNjE0ZDFiNywgMHgwZTI1MjQ0YiwgMHgwYzc2ODM0NywgMHg1ODllOGQ4MiwgMHgwZDIwNTlkMSwgMHhhNDY2YmIxZSwgMHhmOGRhMGE4MiwgMHgwNGYxOTEzMCwgMHhiYTZlNGVjMCwgMHg5OTI2NTE2NCwgMHgxZWU3MjMwZCwgMHg1MGIyYWQ4MCwgMHhlYWVlNjgwMSwgMHg4ZGIyYTI4MywgMHhlYThiZjU5ZV07XG59XG5cbmZ1bmN0aW9uIENhc3Q1KGtleSkge1xuICB0aGlzLmNhc3Q1ID0gbmV3IE9wZW5wZ3BTeW1lbmNDYXN0NSgpO1xuICB0aGlzLmNhc3Q1LnNldEtleShrZXkpO1xuXG4gIHRoaXMuZW5jcnlwdCA9IGZ1bmN0aW9uIChibG9jaykge1xuICAgIHJldHVybiB0aGlzLmNhc3Q1LmVuY3J5cHQoYmxvY2spO1xuICB9O1xufVxuXG5DYXN0NS5ibG9ja1NpemUgPSBDYXN0NS5wcm90b3R5cGUuYmxvY2tTaXplID0gODtcbkNhc3Q1LmtleVNpemUgPSBDYXN0NS5wcm90b3R5cGUua2V5U2l6ZSA9IDE2O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBDYXN0NTtcblxufSx7fV0sMzMxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuLy9QYXVsIFRlcm8sIEp1bHkgMjAwMVxuLy9odHRwOi8vd3d3LnRlcm8uY28udWsvZGVzL1xuLy9cbi8vT3B0aW1pc2VkIGZvciBwZXJmb3JtYW5jZSB3aXRoIGxhcmdlIGJsb2NrcyBieSBNaWNoYWVsIEhheXdvcnRoLCBOb3ZlbWJlciAyMDAxXG4vL2h0dHA6Ly93d3cubmV0ZGVhbGluZy5jb21cbi8vXG4vLyBNb2RpZmllZCBieSBSZWN1cml0eSBMYWJzIEdtYkhcblxuLy9USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkRcbi8vQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4vL0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4vL0FSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFXG4vL0ZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4vL0RBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTXG4vL09SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKVxuLy9IT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVFxuLy9MSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZXG4vL09VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Zcbi8vU1VDSCBEQU1BR0UuXG5cbi8vZGVzXG4vL3RoaXMgdGFrZXMgdGhlIGtleSwgdGhlIG1lc3NhZ2UsIGFuZCB3aGV0aGVyIHRvIGVuY3J5cHQgb3IgZGVjcnlwdFxuXG5mdW5jdGlvbiBkZXMoa2V5cywgbWVzc2FnZSwgZW5jcnlwdCwgbW9kZSwgaXYsIHBhZGRpbmcpIHtcbiAgLy9kZWNsYXJpbmcgdGhpcyBsb2NhbGx5IHNwZWVkcyB0aGluZ3MgdXAgYSBiaXRcbiAgdmFyIHNwZnVuY3Rpb24xID0gWzB4MTAxMDQwMCwgMCwgMHgxMDAwMCwgMHgxMDEwNDA0LCAweDEwMTAwMDQsIDB4MTA0MDQsIDB4NCwgMHgxMDAwMCwgMHg0MDAsIDB4MTAxMDQwMCwgMHgxMDEwNDA0LCAweDQwMCwgMHgxMDAwNDA0LCAweDEwMTAwMDQsIDB4MTAwMDAwMCwgMHg0LCAweDQwNCwgMHgxMDAwNDAwLCAweDEwMDA0MDAsIDB4MTA0MDAsIDB4MTA0MDAsIDB4MTAxMDAwMCwgMHgxMDEwMDAwLCAweDEwMDA0MDQsIDB4MTAwMDQsIDB4MTAwMDAwNCwgMHgxMDAwMDA0LCAweDEwMDA0LCAwLCAweDQwNCwgMHgxMDQwNCwgMHgxMDAwMDAwLCAweDEwMDAwLCAweDEwMTA0MDQsIDB4NCwgMHgxMDEwMDAwLCAweDEwMTA0MDAsIDB4MTAwMDAwMCwgMHgxMDAwMDAwLCAweDQwMCwgMHgxMDEwMDA0LCAweDEwMDAwLCAweDEwNDAwLCAweDEwMDAwMDQsIDB4NDAwLCAweDQsIDB4MTAwMDQwNCwgMHgxMDQwNCwgMHgxMDEwNDA0LCAweDEwMDA0LCAweDEwMTAwMDAsIDB4MTAwMDQwNCwgMHgxMDAwMDA0LCAweDQwNCwgMHgxMDQwNCwgMHgxMDEwNDAwLCAweDQwNCwgMHgxMDAwNDAwLCAweDEwMDA0MDAsIDAsIDB4MTAwMDQsIDB4MTA0MDAsIDAsIDB4MTAxMDAwNF07XG4gIHZhciBzcGZ1bmN0aW9uMiA9IFstMHg3ZmVmN2ZlMCwgLTB4N2ZmZjgwMDAsIDB4ODAwMCwgMHgxMDgwMjAsIDB4MTAwMDAwLCAweDIwLCAtMHg3ZmVmZmZlMCwgLTB4N2ZmZjdmZTAsIC0weDdmZmZmZmUwLCAtMHg3ZmVmN2ZlMCwgLTB4N2ZlZjgwMDAsIC0weDgwMDAwMDAwLCAtMHg3ZmZmODAwMCwgMHgxMDAwMDAsIDB4MjAsIC0weDdmZWZmZmUwLCAweDEwODAwMCwgMHgxMDAwMjAsIC0weDdmZmY3ZmUwLCAwLCAtMHg4MDAwMDAwMCwgMHg4MDAwLCAweDEwODAyMCwgLTB4N2ZmMDAwMDAsIDB4MTAwMDIwLCAtMHg3ZmZmZmZlMCwgMCwgMHgxMDgwMDAsIDB4ODAyMCwgLTB4N2ZlZjgwMDAsIC0weDdmZjAwMDAwLCAweDgwMjAsIDAsIDB4MTA4MDIwLCAtMHg3ZmVmZmZlMCwgMHgxMDAwMDAsIC0weDdmZmY3ZmUwLCAtMHg3ZmYwMDAwMCwgLTB4N2ZlZjgwMDAsIDB4ODAwMCwgLTB4N2ZmMDAwMDAsIC0weDdmZmY4MDAwLCAweDIwLCAtMHg3ZmVmN2ZlMCwgMHgxMDgwMjAsIDB4MjAsIDB4ODAwMCwgLTB4ODAwMDAwMDAsIDB4ODAyMCwgLTB4N2ZlZjgwMDAsIDB4MTAwMDAwLCAtMHg3ZmZmZmZlMCwgMHgxMDAwMjAsIC0weDdmZmY3ZmUwLCAtMHg3ZmZmZmZlMCwgMHgxMDAwMjAsIDB4MTA4MDAwLCAwLCAtMHg3ZmZmODAwMCwgMHg4MDIwLCAtMHg4MDAwMDAwMCwgLTB4N2ZlZmZmZTAsIC0weDdmZWY3ZmUwLCAweDEwODAwMF07XG4gIHZhciBzcGZ1bmN0aW9uMyA9IFsweDIwOCwgMHg4MDIwMjAwLCAwLCAweDgwMjAwMDgsIDB4ODAwMDIwMCwgMCwgMHgyMDIwOCwgMHg4MDAwMjAwLCAweDIwMDA4LCAweDgwMDAwMDgsIDB4ODAwMDAwOCwgMHgyMDAwMCwgMHg4MDIwMjA4LCAweDIwMDA4LCAweDgwMjAwMDAsIDB4MjA4LCAweDgwMDAwMDAsIDB4OCwgMHg4MDIwMjAwLCAweDIwMCwgMHgyMDIwMCwgMHg4MDIwMDAwLCAweDgwMjAwMDgsIDB4MjAyMDgsIDB4ODAwMDIwOCwgMHgyMDIwMCwgMHgyMDAwMCwgMHg4MDAwMjA4LCAweDgsIDB4ODAyMDIwOCwgMHgyMDAsIDB4ODAwMDAwMCwgMHg4MDIwMjAwLCAweDgwMDAwMDAsIDB4MjAwMDgsIDB4MjA4LCAweDIwMDAwLCAweDgwMjAyMDAsIDB4ODAwMDIwMCwgMCwgMHgyMDAsIDB4MjAwMDgsIDB4ODAyMDIwOCwgMHg4MDAwMjAwLCAweDgwMDAwMDgsIDB4MjAwLCAwLCAweDgwMjAwMDgsIDB4ODAwMDIwOCwgMHgyMDAwMCwgMHg4MDAwMDAwLCAweDgwMjAyMDgsIDB4OCwgMHgyMDIwOCwgMHgyMDIwMCwgMHg4MDAwMDA4LCAweDgwMjAwMDAsIDB4ODAwMDIwOCwgMHgyMDgsIDB4ODAyMDAwMCwgMHgyMDIwOCwgMHg4LCAweDgwMjAwMDgsIDB4MjAyMDBdO1xuICB2YXIgc3BmdW5jdGlvbjQgPSBbMHg4MDIwMDEsIDB4MjA4MSwgMHgyMDgxLCAweDgwLCAweDgwMjA4MCwgMHg4MDAwODEsIDB4ODAwMDAxLCAweDIwMDEsIDAsIDB4ODAyMDAwLCAweDgwMjAwMCwgMHg4MDIwODEsIDB4ODEsIDAsIDB4ODAwMDgwLCAweDgwMDAwMSwgMHgxLCAweDIwMDAsIDB4ODAwMDAwLCAweDgwMjAwMSwgMHg4MCwgMHg4MDAwMDAsIDB4MjAwMSwgMHgyMDgwLCAweDgwMDA4MSwgMHgxLCAweDIwODAsIDB4ODAwMDgwLCAweDIwMDAsIDB4ODAyMDgwLCAweDgwMjA4MSwgMHg4MSwgMHg4MDAwODAsIDB4ODAwMDAxLCAweDgwMjAwMCwgMHg4MDIwODEsIDB4ODEsIDAsIDAsIDB4ODAyMDAwLCAweDIwODAsIDB4ODAwMDgwLCAweDgwMDA4MSwgMHgxLCAweDgwMjAwMSwgMHgyMDgxLCAweDIwODEsIDB4ODAsIDB4ODAyMDgxLCAweDgxLCAweDEsIDB4MjAwMCwgMHg4MDAwMDEsIDB4MjAwMSwgMHg4MDIwODAsIDB4ODAwMDgxLCAweDIwMDEsIDB4MjA4MCwgMHg4MDAwMDAsIDB4ODAyMDAxLCAweDgwLCAweDgwMDAwMCwgMHgyMDAwLCAweDgwMjA4MF07XG4gIHZhciBzcGZ1bmN0aW9uNSA9IFsweDEwMCwgMHgyMDgwMTAwLCAweDIwODAwMDAsIDB4NDIwMDAxMDAsIDB4ODAwMDAsIDB4MTAwLCAweDQwMDAwMDAwLCAweDIwODAwMDAsIDB4NDAwODAxMDAsIDB4ODAwMDAsIDB4MjAwMDEwMCwgMHg0MDA4MDEwMCwgMHg0MjAwMDEwMCwgMHg0MjA4MDAwMCwgMHg4MDEwMCwgMHg0MDAwMDAwMCwgMHgyMDAwMDAwLCAweDQwMDgwMDAwLCAweDQwMDgwMDAwLCAwLCAweDQwMDAwMTAwLCAweDQyMDgwMTAwLCAweDQyMDgwMTAwLCAweDIwMDAxMDAsIDB4NDIwODAwMDAsIDB4NDAwMDAxMDAsIDAsIDB4NDIwMDAwMDAsIDB4MjA4MDEwMCwgMHgyMDAwMDAwLCAweDQyMDAwMDAwLCAweDgwMTAwLCAweDgwMDAwLCAweDQyMDAwMTAwLCAweDEwMCwgMHgyMDAwMDAwLCAweDQwMDAwMDAwLCAweDIwODAwMDAsIDB4NDIwMDAxMDAsIDB4NDAwODAxMDAsIDB4MjAwMDEwMCwgMHg0MDAwMDAwMCwgMHg0MjA4MDAwMCwgMHgyMDgwMTAwLCAweDQwMDgwMTAwLCAweDEwMCwgMHgyMDAwMDAwLCAweDQyMDgwMDAwLCAweDQyMDgwMTAwLCAweDgwMTAwLCAweDQyMDAwMDAwLCAweDQyMDgwMTAwLCAweDIwODAwMDAsIDAsIDB4NDAwODAwMDAsIDB4NDIwMDAwMDAsIDB4ODAxMDAsIDB4MjAwMDEwMCwgMHg0MDAwMDEwMCwgMHg4MDAwMCwgMCwgMHg0MDA4MDAwMCwgMHgyMDgwMTAwLCAweDQwMDAwMTAwXTtcbiAgdmFyIHNwZnVuY3Rpb242ID0gWzB4MjAwMDAwMTAsIDB4MjA0MDAwMDAsIDB4NDAwMCwgMHgyMDQwNDAxMCwgMHgyMDQwMDAwMCwgMHgxMCwgMHgyMDQwNDAxMCwgMHg0MDAwMDAsIDB4MjAwMDQwMDAsIDB4NDA0MDEwLCAweDQwMDAwMCwgMHgyMDAwMDAxMCwgMHg0MDAwMTAsIDB4MjAwMDQwMDAsIDB4MjAwMDAwMDAsIDB4NDAxMCwgMCwgMHg0MDAwMTAsIDB4MjAwMDQwMTAsIDB4NDAwMCwgMHg0MDQwMDAsIDB4MjAwMDQwMTAsIDB4MTAsIDB4MjA0MDAwMTAsIDB4MjA0MDAwMTAsIDAsIDB4NDA0MDEwLCAweDIwNDA0MDAwLCAweDQwMTAsIDB4NDA0MDAwLCAweDIwNDA0MDAwLCAweDIwMDAwMDAwLCAweDIwMDA0MDAwLCAweDEwLCAweDIwNDAwMDEwLCAweDQwNDAwMCwgMHgyMDQwNDAxMCwgMHg0MDAwMDAsIDB4NDAxMCwgMHgyMDAwMDAxMCwgMHg0MDAwMDAsIDB4MjAwMDQwMDAsIDB4MjAwMDAwMDAsIDB4NDAxMCwgMHgyMDAwMDAxMCwgMHgyMDQwNDAxMCwgMHg0MDQwMDAsIDB4MjA0MDAwMDAsIDB4NDA0MDEwLCAweDIwNDA0MDAwLCAwLCAweDIwNDAwMDEwLCAweDEwLCAweDQwMDAsIDB4MjA0MDAwMDAsIDB4NDA0MDEwLCAweDQwMDAsIDB4NDAwMDEwLCAweDIwMDA0MDEwLCAwLCAweDIwNDA0MDAwLCAweDIwMDAwMDAwLCAweDQwMDAxMCwgMHgyMDAwNDAxMF07XG4gIHZhciBzcGZ1bmN0aW9uNyA9IFsweDIwMDAwMCwgMHg0MjAwMDAyLCAweDQwMDA4MDIsIDAsIDB4ODAwLCAweDQwMDA4MDIsIDB4MjAwODAyLCAweDQyMDA4MDAsIDB4NDIwMDgwMiwgMHgyMDAwMDAsIDAsIDB4NDAwMDAwMiwgMHgyLCAweDQwMDAwMDAsIDB4NDIwMDAwMiwgMHg4MDIsIDB4NDAwMDgwMCwgMHgyMDA4MDIsIDB4MjAwMDAyLCAweDQwMDA4MDAsIDB4NDAwMDAwMiwgMHg0MjAwMDAwLCAweDQyMDA4MDAsIDB4MjAwMDAyLCAweDQyMDAwMDAsIDB4ODAwLCAweDgwMiwgMHg0MjAwODAyLCAweDIwMDgwMCwgMHgyLCAweDQwMDAwMDAsIDB4MjAwODAwLCAweDQwMDAwMDAsIDB4MjAwODAwLCAweDIwMDAwMCwgMHg0MDAwODAyLCAweDQwMDA4MDIsIDB4NDIwMDAwMiwgMHg0MjAwMDAyLCAweDIsIDB4MjAwMDAyLCAweDQwMDAwMDAsIDB4NDAwMDgwMCwgMHgyMDAwMDAsIDB4NDIwMDgwMCwgMHg4MDIsIDB4MjAwODAyLCAweDQyMDA4MDAsIDB4ODAyLCAweDQwMDAwMDIsIDB4NDIwMDgwMiwgMHg0MjAwMDAwLCAweDIwMDgwMCwgMCwgMHgyLCAweDQyMDA4MDIsIDAsIDB4MjAwODAyLCAweDQyMDAwMDAsIDB4ODAwLCAweDQwMDAwMDIsIDB4NDAwMDgwMCwgMHg4MDAsIDB4MjAwMDAyXTtcbiAgdmFyIHNwZnVuY3Rpb244ID0gWzB4MTAwMDEwNDAsIDB4MTAwMCwgMHg0MDAwMCwgMHgxMDA0MTA0MCwgMHgxMDAwMDAwMCwgMHgxMDAwMTA0MCwgMHg0MCwgMHgxMDAwMDAwMCwgMHg0MDA0MCwgMHgxMDA0MDAwMCwgMHgxMDA0MTA0MCwgMHg0MTAwMCwgMHgxMDA0MTAwMCwgMHg0MTA0MCwgMHgxMDAwLCAweDQwLCAweDEwMDQwMDAwLCAweDEwMDAwMDQwLCAweDEwMDAxMDAwLCAweDEwNDAsIDB4NDEwMDAsIDB4NDAwNDAsIDB4MTAwNDAwNDAsIDB4MTAwNDEwMDAsIDB4MTA0MCwgMCwgMCwgMHgxMDA0MDA0MCwgMHgxMDAwMDA0MCwgMHgxMDAwMTAwMCwgMHg0MTA0MCwgMHg0MDAwMCwgMHg0MTA0MCwgMHg0MDAwMCwgMHgxMDA0MTAwMCwgMHgxMDAwLCAweDQwLCAweDEwMDQwMDQwLCAweDEwMDAsIDB4NDEwNDAsIDB4MTAwMDEwMDAsIDB4NDAsIDB4MTAwMDAwNDAsIDB4MTAwNDAwMDAsIDB4MTAwNDAwNDAsIDB4MTAwMDAwMDAsIDB4NDAwMDAsIDB4MTAwMDEwNDAsIDAsIDB4MTAwNDEwNDAsIDB4NDAwNDAsIDB4MTAwMDAwNDAsIDB4MTAwNDAwMDAsIDB4MTAwMDEwMDAsIDB4MTAwMDEwNDAsIDAsIDB4MTAwNDEwNDAsIDB4NDEwMDAsIDB4NDEwMDAsIDB4MTA0MCwgMHgxMDQwLCAweDQwMDQwLCAweDEwMDAwMDAwLCAweDEwMDQxMDAwXTtcblxuICAvL2NyZWF0ZSB0aGUgMTYgb3IgNDggc3Via2V5cyB3ZSB3aWxsIG5lZWRcbiAgdmFyIG0gPSAwO1xuICB2YXIgaSA9IHZvaWQgMDtcbiAgdmFyIGogPSB2b2lkIDA7XG4gIHZhciB0ZW1wID0gdm9pZCAwO1xuICB2YXIgcmlnaHQxID0gdm9pZCAwO1xuICB2YXIgcmlnaHQyID0gdm9pZCAwO1xuICB2YXIgbGVmdCA9IHZvaWQgMDtcbiAgdmFyIHJpZ2h0ID0gdm9pZCAwO1xuICB2YXIgbG9vcGluZyA9IHZvaWQgMDtcbiAgdmFyIGNiY2xlZnQgPSB2b2lkIDA7XG4gIHZhciBjYmNsZWZ0MiA9IHZvaWQgMDtcbiAgdmFyIGNiY3JpZ2h0ID0gdm9pZCAwO1xuICB2YXIgY2JjcmlnaHQyID0gdm9pZCAwO1xuICB2YXIgZW5kbG9vcCA9IHZvaWQgMDtcbiAgdmFyIGxvb3BpbmMgPSB2b2lkIDA7XG4gIHZhciBsZW4gPSBtZXNzYWdlLmxlbmd0aDtcblxuICAvL3NldCB1cCB0aGUgbG9vcHMgZm9yIHNpbmdsZSBhbmQgdHJpcGxlIGRlc1xuICB2YXIgaXRlcmF0aW9ucyA9IGtleXMubGVuZ3RoID09PSAzMiA/IDMgOiA5OyAvL3NpbmdsZSBvciB0cmlwbGUgZGVzXG4gIGlmIChpdGVyYXRpb25zID09PSAzKSB7XG4gICAgbG9vcGluZyA9IGVuY3J5cHQgPyBbMCwgMzIsIDJdIDogWzMwLCAtMiwgLTJdO1xuICB9IGVsc2Uge1xuICAgIGxvb3BpbmcgPSBlbmNyeXB0ID8gWzAsIDMyLCAyLCA2MiwgMzAsIC0yLCA2NCwgOTYsIDJdIDogWzk0LCA2MiwgLTIsIDMyLCA2NCwgMiwgMzAsIC0yLCAtMl07XG4gIH1cblxuICAvL3BhZCB0aGUgbWVzc2FnZSBkZXBlbmRpbmcgb24gdGhlIHBhZGRpbmcgcGFyYW1ldGVyXG4gIC8vb25seSBhZGQgcGFkZGluZyBpZiBlbmNyeXB0aW5nIC0gbm90ZSB0aGF0IHlvdSBuZWVkIHRvIHVzZSB0aGUgc2FtZSBwYWRkaW5nIG9wdGlvbiBmb3IgYm90aCBlbmNyeXB0IGFuZCBkZWNyeXB0XG4gIGlmIChlbmNyeXB0KSB7XG4gICAgbWVzc2FnZSA9IGRlc19hZGRQYWRkaW5nKG1lc3NhZ2UsIHBhZGRpbmcpO1xuICAgIGxlbiA9IG1lc3NhZ2UubGVuZ3RoO1xuICB9XG5cbiAgLy9zdG9yZSB0aGUgcmVzdWx0IGhlcmVcbiAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gIHZhciBrID0gMDtcblxuICBpZiAobW9kZSA9PT0gMSkge1xuICAgIC8vQ0JDIG1vZGVcbiAgICBjYmNsZWZ0ID0gaXZbbSsrXSA8PCAyNCB8IGl2W20rK10gPDwgMTYgfCBpdlttKytdIDw8IDggfCBpdlttKytdO1xuICAgIGNiY3JpZ2h0ID0gaXZbbSsrXSA8PCAyNCB8IGl2W20rK10gPDwgMTYgfCBpdlttKytdIDw8IDggfCBpdlttKytdO1xuICAgIG0gPSAwO1xuICB9XG5cbiAgLy9sb29wIHRocm91Z2ggZWFjaCA2NCBiaXQgY2h1bmsgb2YgdGhlIG1lc3NhZ2VcbiAgd2hpbGUgKG0gPCBsZW4pIHtcbiAgICBsZWZ0ID0gbWVzc2FnZVttKytdIDw8IDI0IHwgbWVzc2FnZVttKytdIDw8IDE2IHwgbWVzc2FnZVttKytdIDw8IDggfCBtZXNzYWdlW20rK107XG4gICAgcmlnaHQgPSBtZXNzYWdlW20rK10gPDwgMjQgfCBtZXNzYWdlW20rK10gPDwgMTYgfCBtZXNzYWdlW20rK10gPDwgOCB8IG1lc3NhZ2VbbSsrXTtcblxuICAgIC8vZm9yIENpcGhlciBCbG9jayBDaGFpbmluZyBtb2RlLCB4b3IgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcHJldmlvdXMgcmVzdWx0XG4gICAgaWYgKG1vZGUgPT09IDEpIHtcbiAgICAgIGlmIChlbmNyeXB0KSB7XG4gICAgICAgIGxlZnQgXj0gY2JjbGVmdDtcbiAgICAgICAgcmlnaHQgXj0gY2JjcmlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYmNsZWZ0MiA9IGNiY2xlZnQ7XG4gICAgICAgIGNiY3JpZ2h0MiA9IGNiY3JpZ2h0O1xuICAgICAgICBjYmNsZWZ0ID0gbGVmdDtcbiAgICAgICAgY2JjcmlnaHQgPSByaWdodDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL2ZpcnN0IGVhY2ggNjQgYnV0IGNodW5rIG9mIHRoZSBtZXNzYWdlIG11c3QgYmUgcGVybXV0ZWQgYWNjb3JkaW5nIHRvIElQXG4gICAgdGVtcCA9IChsZWZ0ID4+PiA0IF4gcmlnaHQpICYgMHgwZjBmMGYwZjtcbiAgICByaWdodCBePSB0ZW1wO1xuICAgIGxlZnQgXj0gdGVtcCA8PCA0O1xuICAgIHRlbXAgPSAobGVmdCA+Pj4gMTYgXiByaWdodCkgJiAweDAwMDBmZmZmO1xuICAgIHJpZ2h0IF49IHRlbXA7XG4gICAgbGVmdCBePSB0ZW1wIDw8IDE2O1xuICAgIHRlbXAgPSAocmlnaHQgPj4+IDIgXiBsZWZ0KSAmIDB4MzMzMzMzMzM7XG4gICAgbGVmdCBePSB0ZW1wO1xuICAgIHJpZ2h0IF49IHRlbXAgPDwgMjtcbiAgICB0ZW1wID0gKHJpZ2h0ID4+PiA4IF4gbGVmdCkgJiAweDAwZmYwMGZmO1xuICAgIGxlZnQgXj0gdGVtcDtcbiAgICByaWdodCBePSB0ZW1wIDw8IDg7XG4gICAgdGVtcCA9IChsZWZ0ID4+PiAxIF4gcmlnaHQpICYgMHg1NTU1NTU1NTtcbiAgICByaWdodCBePSB0ZW1wO1xuICAgIGxlZnQgXj0gdGVtcCA8PCAxO1xuXG4gICAgbGVmdCA9IGxlZnQgPDwgMSB8IGxlZnQgPj4+IDMxO1xuICAgIHJpZ2h0ID0gcmlnaHQgPDwgMSB8IHJpZ2h0ID4+PiAzMTtcblxuICAgIC8vZG8gdGhpcyBlaXRoZXIgMSBvciAzIHRpbWVzIGZvciBlYWNoIGNodW5rIG9mIHRoZSBtZXNzYWdlXG4gICAgZm9yIChqID0gMDsgaiA8IGl0ZXJhdGlvbnM7IGogKz0gMykge1xuICAgICAgZW5kbG9vcCA9IGxvb3BpbmdbaiArIDFdO1xuICAgICAgbG9vcGluYyA9IGxvb3BpbmdbaiArIDJdO1xuICAgICAgLy9ub3cgZ28gdGhyb3VnaCBhbmQgcGVyZm9ybSB0aGUgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uXG4gICAgICBmb3IgKGkgPSBsb29waW5nW2pdOyBpICE9PSBlbmRsb29wOyBpICs9IGxvb3BpbmMpIHtcbiAgICAgICAgLy9mb3IgZWZmaWNpZW5jeVxuICAgICAgICByaWdodDEgPSByaWdodCBeIGtleXNbaV07XG4gICAgICAgIHJpZ2h0MiA9IChyaWdodCA+Pj4gNCB8IHJpZ2h0IDw8IDI4KSBeIGtleXNbaSArIDFdO1xuICAgICAgICAvL3RoZSByZXN1bHQgaXMgYXR0YWluZWQgYnkgcGFzc2luZyB0aGVzZSBieXRlcyB0aHJvdWdoIHRoZSBTIHNlbGVjdGlvbiBmdW5jdGlvbnNcbiAgICAgICAgdGVtcCA9IGxlZnQ7XG4gICAgICAgIGxlZnQgPSByaWdodDtcbiAgICAgICAgcmlnaHQgPSB0ZW1wIF4gKHNwZnVuY3Rpb24yW3JpZ2h0MSA+Pj4gMjQgJiAweDNmXSB8IHNwZnVuY3Rpb240W3JpZ2h0MSA+Pj4gMTYgJiAweDNmXSB8IHNwZnVuY3Rpb242W3JpZ2h0MSA+Pj4gOCAmIDB4M2ZdIHwgc3BmdW5jdGlvbjhbcmlnaHQxICYgMHgzZl0gfCBzcGZ1bmN0aW9uMVtyaWdodDIgPj4+IDI0ICYgMHgzZl0gfCBzcGZ1bmN0aW9uM1tyaWdodDIgPj4+IDE2ICYgMHgzZl0gfCBzcGZ1bmN0aW9uNVtyaWdodDIgPj4+IDggJiAweDNmXSB8IHNwZnVuY3Rpb243W3JpZ2h0MiAmIDB4M2ZdKTtcbiAgICAgIH1cbiAgICAgIHRlbXAgPSBsZWZ0O1xuICAgICAgbGVmdCA9IHJpZ2h0O1xuICAgICAgcmlnaHQgPSB0ZW1wOyAvL3VucmV2ZXJzZSBsZWZ0IGFuZCByaWdodFxuICAgIH0gLy9mb3IgZWl0aGVyIDEgb3IgMyBpdGVyYXRpb25zXG5cbiAgICAvL21vdmUgdGhlbiBlYWNoIG9uZSBiaXQgdG8gdGhlIHJpZ2h0XG4gICAgbGVmdCA9IGxlZnQgPj4+IDEgfCBsZWZ0IDw8IDMxO1xuICAgIHJpZ2h0ID0gcmlnaHQgPj4+IDEgfCByaWdodCA8PCAzMTtcblxuICAgIC8vbm93IHBlcmZvcm0gSVAtMSwgd2hpY2ggaXMgSVAgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvblxuICAgIHRlbXAgPSAobGVmdCA+Pj4gMSBeIHJpZ2h0KSAmIDB4NTU1NTU1NTU7XG4gICAgcmlnaHQgXj0gdGVtcDtcbiAgICBsZWZ0IF49IHRlbXAgPDwgMTtcbiAgICB0ZW1wID0gKHJpZ2h0ID4+PiA4IF4gbGVmdCkgJiAweDAwZmYwMGZmO1xuICAgIGxlZnQgXj0gdGVtcDtcbiAgICByaWdodCBePSB0ZW1wIDw8IDg7XG4gICAgdGVtcCA9IChyaWdodCA+Pj4gMiBeIGxlZnQpICYgMHgzMzMzMzMzMztcbiAgICBsZWZ0IF49IHRlbXA7XG4gICAgcmlnaHQgXj0gdGVtcCA8PCAyO1xuICAgIHRlbXAgPSAobGVmdCA+Pj4gMTYgXiByaWdodCkgJiAweDAwMDBmZmZmO1xuICAgIHJpZ2h0IF49IHRlbXA7XG4gICAgbGVmdCBePSB0ZW1wIDw8IDE2O1xuICAgIHRlbXAgPSAobGVmdCA+Pj4gNCBeIHJpZ2h0KSAmIDB4MGYwZjBmMGY7XG4gICAgcmlnaHQgXj0gdGVtcDtcbiAgICBsZWZ0IF49IHRlbXAgPDwgNDtcblxuICAgIC8vZm9yIENpcGhlciBCbG9jayBDaGFpbmluZyBtb2RlLCB4b3IgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcHJldmlvdXMgcmVzdWx0XG4gICAgaWYgKG1vZGUgPT09IDEpIHtcbiAgICAgIGlmIChlbmNyeXB0KSB7XG4gICAgICAgIGNiY2xlZnQgPSBsZWZ0O1xuICAgICAgICBjYmNyaWdodCA9IHJpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVmdCBePSBjYmNsZWZ0MjtcbiAgICAgICAgcmlnaHQgXj0gY2JjcmlnaHQyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdFtrKytdID0gbGVmdCA+Pj4gMjQ7XG4gICAgcmVzdWx0W2srK10gPSBsZWZ0ID4+PiAxNiAmIDB4ZmY7XG4gICAgcmVzdWx0W2srK10gPSBsZWZ0ID4+PiA4ICYgMHhmZjtcbiAgICByZXN1bHRbaysrXSA9IGxlZnQgJiAweGZmO1xuICAgIHJlc3VsdFtrKytdID0gcmlnaHQgPj4+IDI0O1xuICAgIHJlc3VsdFtrKytdID0gcmlnaHQgPj4+IDE2ICYgMHhmZjtcbiAgICByZXN1bHRbaysrXSA9IHJpZ2h0ID4+PiA4ICYgMHhmZjtcbiAgICByZXN1bHRbaysrXSA9IHJpZ2h0ICYgMHhmZjtcbiAgfSAvL2ZvciBldmVyeSA4IGNoYXJhY3RlcnMsIG9yIDY0IGJpdHMgaW4gdGhlIG1lc3NhZ2VcblxuICAvL29ubHkgcmVtb3ZlIHBhZGRpbmcgaWYgZGVjcnlwdGluZyAtIG5vdGUgdGhhdCB5b3UgbmVlZCB0byB1c2UgdGhlIHNhbWUgcGFkZGluZyBvcHRpb24gZm9yIGJvdGggZW5jcnlwdCBhbmQgZGVjcnlwdFxuICBpZiAoIWVuY3J5cHQpIHtcbiAgICByZXN1bHQgPSBkZXNfcmVtb3ZlUGFkZGluZyhyZXN1bHQsIHBhZGRpbmcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn0gLy9lbmQgb2YgZGVzXG5cblxuLy9kZXNfY3JlYXRlS2V5c1xuLy90aGlzIHRha2VzIGFzIGlucHV0IGEgNjQgYml0IGtleSAoZXZlbiB0aG91Z2ggb25seSA1NiBiaXRzIGFyZSB1c2VkKVxuLy9hcyBhbiBhcnJheSBvZiAyIGludGVnZXJzLCBhbmQgcmV0dXJucyAxNiA0OCBiaXQga2V5c1xuXG5mdW5jdGlvbiBkZXNfY3JlYXRlS2V5cyhrZXkpIHtcbiAgLy9kZWNsYXJpbmcgdGhpcyBsb2NhbGx5IHNwZWVkcyB0aGluZ3MgdXAgYSBiaXRcbiAgdmFyIHBjMmJ5dGVzMCA9IFswLCAweDQsIDB4MjAwMDAwMDAsIDB4MjAwMDAwMDQsIDB4MTAwMDAsIDB4MTAwMDQsIDB4MjAwMTAwMDAsIDB4MjAwMTAwMDQsIDB4MjAwLCAweDIwNCwgMHgyMDAwMDIwMCwgMHgyMDAwMDIwNCwgMHgxMDIwMCwgMHgxMDIwNCwgMHgyMDAxMDIwMCwgMHgyMDAxMDIwNF07XG4gIHZhciBwYzJieXRlczEgPSBbMCwgMHgxLCAweDEwMDAwMCwgMHgxMDAwMDEsIDB4NDAwMDAwMCwgMHg0MDAwMDAxLCAweDQxMDAwMDAsIDB4NDEwMDAwMSwgMHgxMDAsIDB4MTAxLCAweDEwMDEwMCwgMHgxMDAxMDEsIDB4NDAwMDEwMCwgMHg0MDAwMTAxLCAweDQxMDAxMDAsIDB4NDEwMDEwMV07XG4gIHZhciBwYzJieXRlczIgPSBbMCwgMHg4LCAweDgwMCwgMHg4MDgsIDB4MTAwMDAwMCwgMHgxMDAwMDA4LCAweDEwMDA4MDAsIDB4MTAwMDgwOCwgMCwgMHg4LCAweDgwMCwgMHg4MDgsIDB4MTAwMDAwMCwgMHgxMDAwMDA4LCAweDEwMDA4MDAsIDB4MTAwMDgwOF07XG4gIHZhciBwYzJieXRlczMgPSBbMCwgMHgyMDAwMDAsIDB4ODAwMDAwMCwgMHg4MjAwMDAwLCAweDIwMDAsIDB4MjAyMDAwLCAweDgwMDIwMDAsIDB4ODIwMjAwMCwgMHgyMDAwMCwgMHgyMjAwMDAsIDB4ODAyMDAwMCwgMHg4MjIwMDAwLCAweDIyMDAwLCAweDIyMjAwMCwgMHg4MDIyMDAwLCAweDgyMjIwMDBdO1xuICB2YXIgcGMyYnl0ZXM0ID0gWzAsIDB4NDAwMDAsIDB4MTAsIDB4NDAwMTAsIDAsIDB4NDAwMDAsIDB4MTAsIDB4NDAwMTAsIDB4MTAwMCwgMHg0MTAwMCwgMHgxMDEwLCAweDQxMDEwLCAweDEwMDAsIDB4NDEwMDAsIDB4MTAxMCwgMHg0MTAxMF07XG4gIHZhciBwYzJieXRlczUgPSBbMCwgMHg0MDAsIDB4MjAsIDB4NDIwLCAwLCAweDQwMCwgMHgyMCwgMHg0MjAsIDB4MjAwMDAwMCwgMHgyMDAwNDAwLCAweDIwMDAwMjAsIDB4MjAwMDQyMCwgMHgyMDAwMDAwLCAweDIwMDA0MDAsIDB4MjAwMDAyMCwgMHgyMDAwNDIwXTtcbiAgdmFyIHBjMmJ5dGVzNiA9IFswLCAweDEwMDAwMDAwLCAweDgwMDAwLCAweDEwMDgwMDAwLCAweDIsIDB4MTAwMDAwMDIsIDB4ODAwMDIsIDB4MTAwODAwMDIsIDAsIDB4MTAwMDAwMDAsIDB4ODAwMDAsIDB4MTAwODAwMDAsIDB4MiwgMHgxMDAwMDAwMiwgMHg4MDAwMiwgMHgxMDA4MDAwMl07XG4gIHZhciBwYzJieXRlczcgPSBbMCwgMHgxMDAwMCwgMHg4MDAsIDB4MTA4MDAsIDB4MjAwMDAwMDAsIDB4MjAwMTAwMDAsIDB4MjAwMDA4MDAsIDB4MjAwMTA4MDAsIDB4MjAwMDAsIDB4MzAwMDAsIDB4MjA4MDAsIDB4MzA4MDAsIDB4MjAwMjAwMDAsIDB4MjAwMzAwMDAsIDB4MjAwMjA4MDAsIDB4MjAwMzA4MDBdO1xuICB2YXIgcGMyYnl0ZXM4ID0gWzAsIDB4NDAwMDAsIDAsIDB4NDAwMDAsIDB4MiwgMHg0MDAwMiwgMHgyLCAweDQwMDAyLCAweDIwMDAwMDAsIDB4MjA0MDAwMCwgMHgyMDAwMDAwLCAweDIwNDAwMDAsIDB4MjAwMDAwMiwgMHgyMDQwMDAyLCAweDIwMDAwMDIsIDB4MjA0MDAwMl07XG4gIHZhciBwYzJieXRlczkgPSBbMCwgMHgxMDAwMDAwMCwgMHg4LCAweDEwMDAwMDA4LCAwLCAweDEwMDAwMDAwLCAweDgsIDB4MTAwMDAwMDgsIDB4NDAwLCAweDEwMDAwNDAwLCAweDQwOCwgMHgxMDAwMDQwOCwgMHg0MDAsIDB4MTAwMDA0MDAsIDB4NDA4LCAweDEwMDAwNDA4XTtcbiAgdmFyIHBjMmJ5dGVzMTAgPSBbMCwgMHgyMCwgMCwgMHgyMCwgMHgxMDAwMDAsIDB4MTAwMDIwLCAweDEwMDAwMCwgMHgxMDAwMjAsIDB4MjAwMCwgMHgyMDIwLCAweDIwMDAsIDB4MjAyMCwgMHgxMDIwMDAsIDB4MTAyMDIwLCAweDEwMjAwMCwgMHgxMDIwMjBdO1xuICB2YXIgcGMyYnl0ZXMxMSA9IFswLCAweDEwMDAwMDAsIDB4MjAwLCAweDEwMDAyMDAsIDB4MjAwMDAwLCAweDEyMDAwMDAsIDB4MjAwMjAwLCAweDEyMDAyMDAsIDB4NDAwMDAwMCwgMHg1MDAwMDAwLCAweDQwMDAyMDAsIDB4NTAwMDIwMCwgMHg0MjAwMDAwLCAweDUyMDAwMDAsIDB4NDIwMDIwMCwgMHg1MjAwMjAwXTtcbiAgdmFyIHBjMmJ5dGVzMTIgPSBbMCwgMHgxMDAwLCAweDgwMDAwMDAsIDB4ODAwMTAwMCwgMHg4MDAwMCwgMHg4MTAwMCwgMHg4MDgwMDAwLCAweDgwODEwMDAsIDB4MTAsIDB4MTAxMCwgMHg4MDAwMDEwLCAweDgwMDEwMTAsIDB4ODAwMTAsIDB4ODEwMTAsIDB4ODA4MDAxMCwgMHg4MDgxMDEwXTtcbiAgdmFyIHBjMmJ5dGVzMTMgPSBbMCwgMHg0LCAweDEwMCwgMHgxMDQsIDAsIDB4NCwgMHgxMDAsIDB4MTA0LCAweDEsIDB4NSwgMHgxMDEsIDB4MTA1LCAweDEsIDB4NSwgMHgxMDEsIDB4MTA1XTtcblxuICAvL2hvdyBtYW55IGl0ZXJhdGlvbnMgKDEgZm9yIGRlcywgMyBmb3IgdHJpcGxlIGRlcylcbiAgdmFyIGl0ZXJhdGlvbnMgPSBrZXkubGVuZ3RoID4gOCA/IDMgOiAxOyAvL2NoYW5nZWQgYnkgUGF1bCAxNi82LzIwMDcgdG8gdXNlIFRyaXBsZSBERVMgZm9yIDkrIGJ5dGUga2V5c1xuICAvL3N0b3JlcyB0aGUgcmV0dXJuIGtleXNcbiAgdmFyIGtleXMgPSBuZXcgQXJyYXkoMzIgKiBpdGVyYXRpb25zKTtcbiAgLy9ub3cgZGVmaW5lIHRoZSBsZWZ0IHNoaWZ0cyB3aGljaCBuZWVkIHRvIGJlIGRvbmVcbiAgdmFyIHNoaWZ0cyA9IFswLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwXTtcbiAgLy9vdGhlciB2YXJpYWJsZXNcbiAgdmFyIGxlZnR0ZW1wID0gdm9pZCAwO1xuICB2YXIgcmlnaHR0ZW1wID0gdm9pZCAwO1xuICB2YXIgbSA9IDA7XG4gIHZhciBuID0gMDtcbiAgdmFyIHRlbXAgPSB2b2lkIDA7XG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCBpdGVyYXRpb25zOyBqKyspIHtcbiAgICAvL2VpdGhlciAxIG9yIDMgaXRlcmF0aW9uc1xuICAgIHZhciBsZWZ0ID0ga2V5W20rK10gPDwgMjQgfCBrZXlbbSsrXSA8PCAxNiB8IGtleVttKytdIDw8IDggfCBrZXlbbSsrXTtcbiAgICB2YXIgcmlnaHQgPSBrZXlbbSsrXSA8PCAyNCB8IGtleVttKytdIDw8IDE2IHwga2V5W20rK10gPDwgOCB8IGtleVttKytdO1xuXG4gICAgdGVtcCA9IChsZWZ0ID4+PiA0IF4gcmlnaHQpICYgMHgwZjBmMGYwZjtcbiAgICByaWdodCBePSB0ZW1wO1xuICAgIGxlZnQgXj0gdGVtcCA8PCA0O1xuICAgIHRlbXAgPSAocmlnaHQgPj4+IC0xNiBeIGxlZnQpICYgMHgwMDAwZmZmZjtcbiAgICBsZWZ0IF49IHRlbXA7XG4gICAgcmlnaHQgXj0gdGVtcCA8PCAtMTY7XG4gICAgdGVtcCA9IChsZWZ0ID4+PiAyIF4gcmlnaHQpICYgMHgzMzMzMzMzMztcbiAgICByaWdodCBePSB0ZW1wO1xuICAgIGxlZnQgXj0gdGVtcCA8PCAyO1xuICAgIHRlbXAgPSAocmlnaHQgPj4+IC0xNiBeIGxlZnQpICYgMHgwMDAwZmZmZjtcbiAgICBsZWZ0IF49IHRlbXA7XG4gICAgcmlnaHQgXj0gdGVtcCA8PCAtMTY7XG4gICAgdGVtcCA9IChsZWZ0ID4+PiAxIF4gcmlnaHQpICYgMHg1NTU1NTU1NTtcbiAgICByaWdodCBePSB0ZW1wO1xuICAgIGxlZnQgXj0gdGVtcCA8PCAxO1xuICAgIHRlbXAgPSAocmlnaHQgPj4+IDggXiBsZWZ0KSAmIDB4MDBmZjAwZmY7XG4gICAgbGVmdCBePSB0ZW1wO1xuICAgIHJpZ2h0IF49IHRlbXAgPDwgODtcbiAgICB0ZW1wID0gKGxlZnQgPj4+IDEgXiByaWdodCkgJiAweDU1NTU1NTU1O1xuICAgIHJpZ2h0IF49IHRlbXA7XG4gICAgbGVmdCBePSB0ZW1wIDw8IDE7XG5cbiAgICAvL3RoZSByaWdodCBzaWRlIG5lZWRzIHRvIGJlIHNoaWZ0ZWQgYW5kIHRvIGdldCB0aGUgbGFzdCBmb3VyIGJpdHMgb2YgdGhlIGxlZnQgc2lkZVxuICAgIHRlbXAgPSBsZWZ0IDw8IDggfCByaWdodCA+Pj4gMjAgJiAweDAwMDAwMGYwO1xuICAgIC8vbGVmdCBuZWVkcyB0byBiZSBwdXQgdXBzaWRlIGRvd25cbiAgICBsZWZ0ID0gcmlnaHQgPDwgMjQgfCByaWdodCA8PCA4ICYgMHhmZjAwMDAgfCByaWdodCA+Pj4gOCAmIDB4ZmYwMCB8IHJpZ2h0ID4+PiAyNCAmIDB4ZjA7XG4gICAgcmlnaHQgPSB0ZW1wO1xuXG4gICAgLy9ub3cgZ28gdGhyb3VnaCBhbmQgcGVyZm9ybSB0aGVzZSBzaGlmdHMgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IGtleXNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNoaWZ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgLy9zaGlmdCB0aGUga2V5cyBlaXRoZXIgb25lIG9yIHR3byBiaXRzIHRvIHRoZSBsZWZ0XG4gICAgICBpZiAoc2hpZnRzW2ldKSB7XG4gICAgICAgIGxlZnQgPSBsZWZ0IDw8IDIgfCBsZWZ0ID4+PiAyNjtcbiAgICAgICAgcmlnaHQgPSByaWdodCA8PCAyIHwgcmlnaHQgPj4+IDI2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVmdCA9IGxlZnQgPDwgMSB8IGxlZnQgPj4+IDI3O1xuICAgICAgICByaWdodCA9IHJpZ2h0IDw8IDEgfCByaWdodCA+Pj4gMjc7XG4gICAgICB9XG4gICAgICBsZWZ0ICY9IC0weGY7XG4gICAgICByaWdodCAmPSAtMHhmO1xuXG4gICAgICAvL25vdyBhcHBseSBQQy0yLCBpbiBzdWNoIGEgd2F5IHRoYXQgRSBpcyBlYXNpZXIgd2hlbiBlbmNyeXB0aW5nIG9yIGRlY3J5cHRpbmdcbiAgICAgIC8vdGhpcyBjb252ZXJzaW9uIHdpbGwgbG9vayBsaWtlIFBDLTIgZXhjZXB0IG9ubHkgdGhlIGxhc3QgNiBiaXRzIG9mIGVhY2ggYnl0ZSBhcmUgdXNlZFxuICAgICAgLy9yYXRoZXIgdGhhbiA0OCBjb25zZWN1dGl2ZSBiaXRzIGFuZCB0aGUgb3JkZXIgb2YgbGluZXMgd2lsbCBiZSBhY2NvcmRpbmcgdG9cbiAgICAgIC8vaG93IHRoZSBTIHNlbGVjdGlvbiBmdW5jdGlvbnMgd2lsbCBiZSBhcHBsaWVkOiBTMiwgUzQsIFM2LCBTOCwgUzEsIFMzLCBTNSwgUzdcbiAgICAgIGxlZnR0ZW1wID0gcGMyYnl0ZXMwW2xlZnQgPj4+IDI4XSB8IHBjMmJ5dGVzMVtsZWZ0ID4+PiAyNCAmIDB4Zl0gfCBwYzJieXRlczJbbGVmdCA+Pj4gMjAgJiAweGZdIHwgcGMyYnl0ZXMzW2xlZnQgPj4+IDE2ICYgMHhmXSB8IHBjMmJ5dGVzNFtsZWZ0ID4+PiAxMiAmIDB4Zl0gfCBwYzJieXRlczVbbGVmdCA+Pj4gOCAmIDB4Zl0gfCBwYzJieXRlczZbbGVmdCA+Pj4gNCAmIDB4Zl07XG4gICAgICByaWdodHRlbXAgPSBwYzJieXRlczdbcmlnaHQgPj4+IDI4XSB8IHBjMmJ5dGVzOFtyaWdodCA+Pj4gMjQgJiAweGZdIHwgcGMyYnl0ZXM5W3JpZ2h0ID4+PiAyMCAmIDB4Zl0gfCBwYzJieXRlczEwW3JpZ2h0ID4+PiAxNiAmIDB4Zl0gfCBwYzJieXRlczExW3JpZ2h0ID4+PiAxMiAmIDB4Zl0gfCBwYzJieXRlczEyW3JpZ2h0ID4+PiA4ICYgMHhmXSB8IHBjMmJ5dGVzMTNbcmlnaHQgPj4+IDQgJiAweGZdO1xuICAgICAgdGVtcCA9IChyaWdodHRlbXAgPj4+IDE2IF4gbGVmdHRlbXApICYgMHgwMDAwZmZmZjtcbiAgICAgIGtleXNbbisrXSA9IGxlZnR0ZW1wIF4gdGVtcDtcbiAgICAgIGtleXNbbisrXSA9IHJpZ2h0dGVtcCBeIHRlbXAgPDwgMTY7XG4gICAgfVxuICB9IC8vZm9yIGVhY2ggaXRlcmF0aW9uc1xuICAvL3JldHVybiB0aGUga2V5cyB3ZSd2ZSBjcmVhdGVkXG4gIHJldHVybiBrZXlzO1xufSAvL2VuZCBvZiBkZXNfY3JlYXRlS2V5c1xuXG5cbmZ1bmN0aW9uIGRlc19hZGRQYWRkaW5nKG1lc3NhZ2UsIHBhZGRpbmcpIHtcbiAgdmFyIHBhZExlbmd0aCA9IDggLSBtZXNzYWdlLmxlbmd0aCAlIDg7XG5cbiAgdmFyIHBhZCA9IHZvaWQgMDtcbiAgaWYgKHBhZGRpbmcgPT09IDIgJiYgcGFkTGVuZ3RoIDwgOCkge1xuICAgIC8vcGFkIHRoZSBtZXNzYWdlIHdpdGggc3BhY2VzXG4gICAgcGFkID0gXCIgXCIuY2hhckNvZGVBdCgwKTtcbiAgfSBlbHNlIGlmIChwYWRkaW5nID09PSAxKSB7XG4gICAgLy9QS0NTNyBwYWRkaW5nXG4gICAgcGFkID0gcGFkTGVuZ3RoO1xuICB9IGVsc2UgaWYgKCFwYWRkaW5nICYmIHBhZExlbmd0aCA8IDgpIHtcbiAgICAvL3BhZCB0aGUgbWVzc2FnZSBvdXQgd2l0aCBudWxsIGJ5dGVzXG4gICAgcGFkID0gMDtcbiAgfSBlbHNlIGlmIChwYWRMZW5ndGggPT09IDgpIHtcbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlczogaW52YWxpZCBwYWRkaW5nJyk7XG4gIH1cblxuICB2YXIgcGFkZGVkTWVzc2FnZSA9IG5ldyBVaW50OEFycmF5KG1lc3NhZ2UubGVuZ3RoICsgcGFkTGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXNzYWdlLmxlbmd0aDsgaSsrKSB7XG4gICAgcGFkZGVkTWVzc2FnZVtpXSA9IG1lc3NhZ2VbaV07XG4gIH1cbiAgZm9yICh2YXIgaiA9IDA7IGogPCBwYWRMZW5ndGg7IGorKykge1xuICAgIHBhZGRlZE1lc3NhZ2VbbWVzc2FnZS5sZW5ndGggKyBqXSA9IHBhZDtcbiAgfVxuXG4gIHJldHVybiBwYWRkZWRNZXNzYWdlO1xufVxuXG5mdW5jdGlvbiBkZXNfcmVtb3ZlUGFkZGluZyhtZXNzYWdlLCBwYWRkaW5nKSB7XG4gIHZhciBwYWRMZW5ndGggPSBudWxsO1xuICB2YXIgcGFkID0gdm9pZCAwO1xuICBpZiAocGFkZGluZyA9PT0gMikge1xuICAgIC8vIHNwYWNlIHBhZGRlZFxuICAgIHBhZCA9IFwiIFwiLmNoYXJDb2RlQXQoMCk7XG4gIH0gZWxzZSBpZiAocGFkZGluZyA9PT0gMSkge1xuICAgIC8vIFBLQ1M3XG4gICAgcGFkTGVuZ3RoID0gbWVzc2FnZVttZXNzYWdlLmxlbmd0aCAtIDFdO1xuICB9IGVsc2UgaWYgKCFwYWRkaW5nKSB7XG4gICAgLy8gbnVsbCBwYWRkaW5nXG4gICAgcGFkID0gMDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlczogaW52YWxpZCBwYWRkaW5nJyk7XG4gIH1cblxuICBpZiAoIXBhZExlbmd0aCkge1xuICAgIHBhZExlbmd0aCA9IDE7XG4gICAgd2hpbGUgKG1lc3NhZ2VbbWVzc2FnZS5sZW5ndGggLSBwYWRMZW5ndGhdID09PSBwYWQpIHtcbiAgICAgIHBhZExlbmd0aCsrO1xuICAgIH1cbiAgICBwYWRMZW5ndGgtLTtcbiAgfVxuXG4gIHJldHVybiBtZXNzYWdlLnN1YmFycmF5KDAsIG1lc3NhZ2UubGVuZ3RoIC0gcGFkTGVuZ3RoKTtcbn1cblxuLy8gYWRkZWQgYnkgUmVjdXJpdHkgTGFic1xuXG5mdW5jdGlvbiBUcmlwbGVERVMoa2V5KSB7XG4gIHRoaXMua2V5ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICB0aGlzLmtleS5wdXNoKG5ldyBVaW50OEFycmF5KGtleS5zdWJhcnJheShpICogOCwgaSAqIDggKyA4KSkpO1xuICB9XG5cbiAgdGhpcy5lbmNyeXB0ID0gZnVuY3Rpb24gKGJsb2NrKSB7XG4gICAgcmV0dXJuIGRlcyhkZXNfY3JlYXRlS2V5cyh0aGlzLmtleVsyXSksIGRlcyhkZXNfY3JlYXRlS2V5cyh0aGlzLmtleVsxXSksIGRlcyhkZXNfY3JlYXRlS2V5cyh0aGlzLmtleVswXSksIGJsb2NrLCB0cnVlLCAwLCBudWxsLCBudWxsKSwgZmFsc2UsIDAsIG51bGwsIG51bGwpLCB0cnVlLCAwLCBudWxsLCBudWxsKTtcbiAgfTtcbn1cblxuVHJpcGxlREVTLmtleVNpemUgPSBUcmlwbGVERVMucHJvdG90eXBlLmtleVNpemUgPSAyNDtcblRyaXBsZURFUy5ibG9ja1NpemUgPSBUcmlwbGVERVMucHJvdG90eXBlLmJsb2NrU2l6ZSA9IDg7XG5cbi8vIFRoaXMgaXMgXCJvcmlnaW5hbFwiIERFU1xuXG5mdW5jdGlvbiBERVMoa2V5KSB7XG4gIHRoaXMua2V5ID0ga2V5O1xuXG4gIHRoaXMuZW5jcnlwdCA9IGZ1bmN0aW9uIChibG9jaywgcGFkZGluZykge1xuICAgIHZhciBrZXlzID0gZGVzX2NyZWF0ZUtleXModGhpcy5rZXkpO1xuICAgIHJldHVybiBkZXMoa2V5cywgYmxvY2ssIHRydWUsIDAsIG51bGwsIHBhZGRpbmcpO1xuICB9O1xuXG4gIHRoaXMuZGVjcnlwdCA9IGZ1bmN0aW9uIChibG9jaywgcGFkZGluZykge1xuICAgIHZhciBrZXlzID0gZGVzX2NyZWF0ZUtleXModGhpcy5rZXkpO1xuICAgIHJldHVybiBkZXMoa2V5cywgYmxvY2ssIGZhbHNlLCAwLCBudWxsLCBwYWRkaW5nKTtcbiAgfTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0geyBERVM6IERFUywgVHJpcGxlREVTOiBUcmlwbGVERVMgfTtcblxufSx7fV0sMzMyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9hZXMgPSBfZGVyZXFfKCcuL2FlcycpO1xuXG52YXIgX2FlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hZXMpO1xuXG52YXIgX2RlcyA9IF9kZXJlcV8oJy4vZGVzLmpzJyk7XG5cbnZhciBfZGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Rlcyk7XG5cbnZhciBfY2FzdCA9IF9kZXJlcV8oJy4vY2FzdDUnKTtcblxudmFyIF9jYXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Nhc3QpO1xuXG52YXIgX3R3b2Zpc2ggPSBfZGVyZXFfKCcuL3R3b2Zpc2gnKTtcblxudmFyIF90d29maXNoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3R3b2Zpc2gpO1xuXG52YXIgX2Jsb3dmaXNoID0gX2RlcmVxXygnLi9ibG93ZmlzaCcpO1xuXG52YXIgX2Jsb3dmaXNoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jsb3dmaXNoKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICAvKipcbiAgICogQUVTLTEyOCBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIChJRCA3KVxuICAgKiBAZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAxMjgtYml0IGtleVxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNtY3J5cHRvL2FzbWNyeXB0by5qc3xhc21DcnlwdG99XG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vY3NyYy5uaXN0Lmdvdi9wdWJsaWNhdGlvbnMvZmlwcy9maXBzMTk3L2ZpcHMtMTk3LnBkZnxOSVNUIEZJUFMtMTk3fVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKiBAcmVxdWlyZXMgYXNtY3J5cHRvLmpzXG4gICAqL1xuICBhZXMxMjg6ICgwLCBfYWVzMi5kZWZhdWx0KSgxMjgpLFxuICAvKipcbiAgICogQUVTLTEyOCBCbG9jayBDaXBoZXIgKElEIDgpXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IDE5Mi1iaXQga2V5XG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc21jcnlwdG8vYXNtY3J5cHRvLmpzfGFzbUNyeXB0b31cbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9jc3JjLm5pc3QuZ292L3B1YmxpY2F0aW9ucy9maXBzL2ZpcHMxOTcvZmlwcy0xOTcucGRmfE5JU1QgRklQUy0xOTd9XG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqIEByZXF1aXJlcyBhc21jcnlwdG8uanNcbiAgICovXG4gIGFlczE5MjogKDAsIF9hZXMyLmRlZmF1bHQpKDE5MiksXG4gIC8qKlxuICAgKiBBRVMtMTI4IEJsb2NrIENpcGhlciAoSUQgOSlcbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgMjU2LWJpdCBrZXlcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzbWNyeXB0by9hc21jcnlwdG8uanN8YXNtQ3J5cHRvfVxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL2ZpcHMvZmlwczE5Ny9maXBzLTE5Ny5wZGZ8TklTVCBGSVBTLTE5N31cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICogQHJlcXVpcmVzIGFzbWNyeXB0by5qc1xuICAgKi9cbiAgYWVzMjU2OiAoMCwgX2FlczIuZGVmYXVsdCkoMjU2KSxcbiAgLy8gTm90IGluIE9wZW5QR1Agc3BlY2lmaWNhdGlvbnNcbiAgZGVzOiBfZGVzMi5kZWZhdWx0LkRFUyxcbiAgLyoqXG4gICAqIFRyaXBsZSBERVMgQmxvY2sgQ2lwaGVyIChJRCAyKVxuICAgKiBAZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAxOTItYml0IGtleVxuICAgKiBAc2VlIHtAbGluayBodHRwczovL252bHB1YnMubmlzdC5nb3YvbmlzdHB1YnMvU3BlY2lhbFB1YmxpY2F0aW9ucy9OSVNULlNQLjgwMC02N3IyLnBkZnxOSVNUIFNQIDgwMC02N31cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIHRyaXBsZWRlczogX2RlczIuZGVmYXVsdC5UcmlwbGVERVMsXG4gIC8qKlxuICAgKiBDQVNULTEyOCBCbG9jayBDaXBoZXIgKElEIDMpXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IDEyOC1iaXQga2V5XG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMTQ0fFRoZSBDQVNULTEyOCBFbmNyeXB0aW9uIEFsZ29yaXRobX1cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGNhc3Q1OiBfY2FzdDIuZGVmYXVsdCxcbiAgLyoqXG4gICAqIFR3b2Zpc2ggQmxvY2sgQ2lwaGVyIChJRCAxMClcbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgMjU2LWJpdCBrZXlcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjcmVmLVRXT0ZJU0h8VFdPRklTSH1cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIHR3b2Zpc2g6IF90d29maXNoMi5kZWZhdWx0LFxuICAvKipcbiAgICogQmxvd2Zpc2ggQmxvY2sgQ2lwaGVyIChJRCA0KVxuICAgKiBAZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAxMjgtYml0IGtleVxuICAgKiBAc2VlIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNyZWYtQkxPV0ZJU0h8QkxPV0ZJU0h9XG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBibG93ZmlzaDogX2Jsb3dmaXNoMi5kZWZhdWx0LFxuICAvKipcbiAgICogTm90IGltcGxlbWVudGVkXG4gICAqIEBmdW5jdGlvblxuICAgKiBAdGhyb3dzIHtFcnJvcn1cbiAgICovXG4gIGlkZWE6IGZ1bmN0aW9uIGlkZWEoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJREVBIHN5bW1ldHJpYy1rZXkgYWxnb3JpdGhtIG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59OyAvKipcbiAgICAqIEBmaWxlb3ZlcnZpZXcgU3ltbWV0cmljIGNyeXB0b2dyYXBoeSBmdW5jdGlvbnNcbiAgICAqIEByZXF1aXJlcyBjcnlwdG8vY2lwaGVyL2Flc1xuICAgICogQHJlcXVpcmVzIGNyeXB0by9jaXBoZXIvZGVzXG4gICAgKiBAcmVxdWlyZXMgY3J5cHRvL2NpcGhlci9jYXN0NVxuICAgICogQHJlcXVpcmVzIGNyeXB0by9jaXBoZXIvdHdvZmlzaFxuICAgICogQHJlcXVpcmVzIGNyeXB0by9jaXBoZXIvYmxvd2Zpc2hcbiAgICAqIEBtb2R1bGUgY3J5cHRvL2NpcGhlclxuICAgICovXG5cbn0se1wiLi9hZXNcIjozMjgsXCIuL2Jsb3dmaXNoXCI6MzI5LFwiLi9jYXN0NVwiOjMzMCxcIi4vZGVzLmpzXCI6MzMxLFwiLi90d29maXNoXCI6MzMzfV0sMzMzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2Zyb20gPSBfZGVyZXFfKFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL2FycmF5L2Zyb21cIik7XG5cbnZhciBfZnJvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mcm9tKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tbWl4ZWQtb3BlcmF0b3JzLCBuby1mYWxsdGhyb3VnaCAqL1xuXG4vKiBNb2RpZmllZCBieSBSZWN1cml0eSBMYWJzIEdtYkhcbiAqXG4gKiBDaXBoZXIuanNcbiAqIEEgYmxvY2stY2lwaGVyIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbiBvbiBKYXZhU2NyaXB0XG4gKiBTZWUgQ2lwaGVyLnJlYWRtZS50eHQgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uXG4gKlxuICogQ29weXJpZ2h0KGMpIDIwMDkgQXRzdXNoaSBPa2EgWyBodHRwOi8vb2thLm51LyBdXG4gKiBUaGlzIHNjcmlwdCBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMR1BMXG4gKlxuICogQUNLTk9XTEVER01FTlRcbiAqXG4gKiAgICAgVGhlIG1haW4gc3Vicm91dGluZXMgYXJlIHdyaXR0ZW4gYnkgTWljaGllbCB2YW4gRXZlcmRpbmdlbi5cbiAqXG4gKiAgICAgTWljaGllbCB2YW4gRXZlcmRpbmdlblxuICogICAgIGh0dHA6Ly9ob21lLnZlcnNhdGVsLm5sL01BdmFuRXZlcmRpbmdlbi9pbmRleC5odG1sXG4gKlxuICogICAgIEFsbCByaWdodHMgZm9yIHRoZXNlIHJvdXRpbmVzIGFyZSByZXNlcnZlZCB0byBNaWNoaWVsIHZhbiBFdmVyZGluZ2VuLlxuICpcbiAqL1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vTWF0aFxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbnZhciBNQVhJTlQgPSAweEZGRkZGRkZGO1xuXG5mdW5jdGlvbiByb3R3KHcsIG4pIHtcbiAgcmV0dXJuICh3IDw8IG4gfCB3ID4+PiAzMiAtIG4pICYgTUFYSU5UO1xufVxuXG5mdW5jdGlvbiBnZXRXKGEsIGkpIHtcbiAgcmV0dXJuIGFbaV0gfCBhW2kgKyAxXSA8PCA4IHwgYVtpICsgMl0gPDwgMTYgfCBhW2kgKyAzXSA8PCAyNDtcbn1cblxuZnVuY3Rpb24gc2V0VyhhLCBpLCB3KSB7XG4gIGEuc3BsaWNlKGksIDQsIHcgJiAweEZGLCB3ID4+PiA4ICYgMHhGRiwgdyA+Pj4gMTYgJiAweEZGLCB3ID4+PiAyNCAmIDB4RkYpO1xufVxuXG5mdW5jdGlvbiBnZXRCKHgsIG4pIHtcbiAgcmV0dXJuIHggPj4+IG4gKiA4ICYgMHhGRjtcbn1cblxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gVHdvZmlzaFxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5mdW5jdGlvbiBjcmVhdGVUd29maXNoKCkge1xuICAvL1xuICB2YXIga2V5Qnl0ZXMgPSBudWxsO1xuICB2YXIgZGF0YUJ5dGVzID0gbnVsbDtcbiAgdmFyIGRhdGFPZmZzZXQgPSAtMTtcbiAgLy8gdmFyIGRhdGFMZW5ndGggPSAtMTtcbiAgLy8gdmFyIGlkeDIgPSAtMTtcbiAgLy9cblxuICB2YXIgdGZzS2V5ID0gW107XG4gIHZhciB0ZnNNID0gW1tdLCBbXSwgW10sIFtdXTtcblxuICBmdW5jdGlvbiB0ZnNJbml0KGtleSkge1xuICAgIGtleUJ5dGVzID0ga2V5O1xuICAgIHZhciBpID0gdm9pZCAwO1xuICAgIHZhciBhID0gdm9pZCAwO1xuICAgIHZhciBiID0gdm9pZCAwO1xuICAgIHZhciBjID0gdm9pZCAwO1xuICAgIHZhciBkID0gdm9pZCAwO1xuICAgIHZhciBtZUtleSA9IFtdO1xuICAgIHZhciBtb0tleSA9IFtdO1xuICAgIHZhciBpbktleSA9IFtdO1xuICAgIHZhciBrTGVuID0gdm9pZCAwO1xuICAgIHZhciBzS2V5ID0gW107XG4gICAgdmFyIGYwMSA9IHZvaWQgMDtcbiAgICB2YXIgZjViID0gdm9pZCAwO1xuICAgIHZhciBmZWYgPSB2b2lkIDA7XG5cbiAgICB2YXIgcTAgPSBbWzgsIDEsIDcsIDEzLCA2LCAxNSwgMywgMiwgMCwgMTEsIDUsIDksIDE0LCAxMiwgMTAsIDRdLCBbMiwgOCwgMTEsIDEzLCAxNSwgNywgNiwgMTQsIDMsIDEsIDksIDQsIDAsIDEwLCAxMiwgNV1dO1xuICAgIHZhciBxMSA9IFtbMTQsIDEyLCAxMSwgOCwgMSwgMiwgMywgNSwgMTUsIDQsIDEwLCA2LCA3LCAwLCA5LCAxM10sIFsxLCAxNCwgMiwgMTEsIDQsIDEyLCAzLCA3LCA2LCAxMywgMTAsIDUsIDE1LCA5LCAwLCA4XV07XG4gICAgdmFyIHEyID0gW1sxMSwgMTAsIDUsIDE0LCA2LCAxMywgOSwgMCwgMTIsIDgsIDE1LCAzLCAyLCA0LCA3LCAxXSwgWzQsIDEyLCA3LCA1LCAxLCA2LCA5LCAxMCwgMCwgMTQsIDEzLCA4LCAyLCAxMSwgMywgMTVdXTtcbiAgICB2YXIgcTMgPSBbWzEzLCA3LCAxNSwgNCwgMSwgMiwgNiwgMTQsIDksIDExLCAzLCAwLCA4LCA1LCAxMiwgMTBdLCBbMTEsIDksIDUsIDEsIDEyLCAzLCAxMywgMTQsIDYsIDQsIDcsIDE1LCAyLCAwLCA4LCAxMF1dO1xuICAgIHZhciByb3I0ID0gWzAsIDgsIDEsIDksIDIsIDEwLCAzLCAxMSwgNCwgMTIsIDUsIDEzLCA2LCAxNCwgNywgMTVdO1xuICAgIHZhciBhc2h4ID0gWzAsIDksIDIsIDExLCA0LCAxMywgNiwgMTUsIDgsIDEsIDEwLCAzLCAxMiwgNSwgMTQsIDddO1xuICAgIHZhciBxID0gW1tdLCBbXV07XG4gICAgdmFyIG0gPSBbW10sIFtdLCBbXSwgW11dO1xuXG4gICAgZnVuY3Rpb24gZmZtNWIoeCkge1xuICAgICAgcmV0dXJuIHggXiB4ID4+IDIgXiBbMCwgOTAsIDE4MCwgMjM4XVt4ICYgM107XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmZtRWYoeCkge1xuICAgICAgcmV0dXJuIHggXiB4ID4+IDEgXiB4ID4+IDIgXiBbMCwgMjM4LCAxODAsIDkwXVt4ICYgM107XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWRzUmVtKHAsIHEpIHtcbiAgICAgIHZhciBpID0gdm9pZCAwO1xuICAgICAgdmFyIHQgPSB2b2lkIDA7XG4gICAgICB2YXIgdSA9IHZvaWQgMDtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICAgICAgdCA9IHEgPj4+IDI0O1xuICAgICAgICBxID0gcSA8PCA4ICYgTUFYSU5UIHwgcCA+Pj4gMjQ7XG4gICAgICAgIHAgPSBwIDw8IDggJiBNQVhJTlQ7XG4gICAgICAgIHUgPSB0IDw8IDE7XG4gICAgICAgIGlmICh0ICYgMTI4KSB7XG4gICAgICAgICAgdSBePSAzMzM7XG4gICAgICAgIH1cbiAgICAgICAgcSBePSB0IF4gdSA8PCAxNjtcbiAgICAgICAgdSBePSB0ID4+PiAxO1xuICAgICAgICBpZiAodCAmIDEpIHtcbiAgICAgICAgICB1IF49IDE2NjtcbiAgICAgICAgfVxuICAgICAgICBxIF49IHUgPDwgMjQgfCB1IDw8IDg7XG4gICAgICB9XG4gICAgICByZXR1cm4gcTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBxcChuLCB4KSB7XG4gICAgICB2YXIgYSA9IHggPj4gNDtcbiAgICAgIHZhciBiID0geCAmIDE1O1xuICAgICAgdmFyIGMgPSBxMFtuXVthIF4gYl07XG4gICAgICB2YXIgZCA9IHExW25dW3JvcjRbYl0gXiBhc2h4W2FdXTtcbiAgICAgIHJldHVybiBxM1tuXVtyb3I0W2RdIF4gYXNoeFtjXV0gPDwgNCB8IHEyW25dW2MgXiBkXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoRnVuKHgsIGtleSkge1xuICAgICAgdmFyIGEgPSBnZXRCKHgsIDApO1xuICAgICAgdmFyIGIgPSBnZXRCKHgsIDEpO1xuICAgICAgdmFyIGMgPSBnZXRCKHgsIDIpO1xuICAgICAgdmFyIGQgPSBnZXRCKHgsIDMpO1xuICAgICAgc3dpdGNoIChrTGVuKSB7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBhID0gcVsxXVthXSBeIGdldEIoa2V5WzNdLCAwKTtcbiAgICAgICAgICBiID0gcVswXVtiXSBeIGdldEIoa2V5WzNdLCAxKTtcbiAgICAgICAgICBjID0gcVswXVtjXSBeIGdldEIoa2V5WzNdLCAyKTtcbiAgICAgICAgICBkID0gcVsxXVtkXSBeIGdldEIoa2V5WzNdLCAzKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGEgPSBxWzFdW2FdIF4gZ2V0QihrZXlbMl0sIDApO1xuICAgICAgICAgIGIgPSBxWzFdW2JdIF4gZ2V0QihrZXlbMl0sIDEpO1xuICAgICAgICAgIGMgPSBxWzBdW2NdIF4gZ2V0QihrZXlbMl0sIDIpO1xuICAgICAgICAgIGQgPSBxWzBdW2RdIF4gZ2V0QihrZXlbMl0sIDMpO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgYSA9IHFbMF1bcVswXVthXSBeIGdldEIoa2V5WzFdLCAwKV0gXiBnZXRCKGtleVswXSwgMCk7XG4gICAgICAgICAgYiA9IHFbMF1bcVsxXVtiXSBeIGdldEIoa2V5WzFdLCAxKV0gXiBnZXRCKGtleVswXSwgMSk7XG4gICAgICAgICAgYyA9IHFbMV1bcVswXVtjXSBeIGdldEIoa2V5WzFdLCAyKV0gXiBnZXRCKGtleVswXSwgMik7XG4gICAgICAgICAgZCA9IHFbMV1bcVsxXVtkXSBeIGdldEIoa2V5WzFdLCAzKV0gXiBnZXRCKGtleVswXSwgMyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbVswXVthXSBeIG1bMV1bYl0gXiBtWzJdW2NdIF4gbVszXVtkXTtcbiAgICB9XG5cbiAgICBrZXlCeXRlcyA9IGtleUJ5dGVzLnNsaWNlKDAsIDMyKTtcbiAgICBpID0ga2V5Qnl0ZXMubGVuZ3RoO1xuICAgIHdoaWxlIChpICE9PSAxNiAmJiBpICE9PSAyNCAmJiBpICE9PSAzMikge1xuICAgICAga2V5Qnl0ZXNbaSsrXSA9IDA7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IGtleUJ5dGVzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICBpbktleVtpID4+IDJdID0gZ2V0VyhrZXlCeXRlcywgaSk7XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuICAgICAgcVswXVtpXSA9IHFwKDAsIGkpO1xuICAgICAgcVsxXVtpXSA9IHFwKDEsIGkpO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcbiAgICAgIGYwMSA9IHFbMV1baV07XG4gICAgICBmNWIgPSBmZm01YihmMDEpO1xuICAgICAgZmVmID0gZmZtRWYoZjAxKTtcbiAgICAgIG1bMF1baV0gPSBmMDEgKyAoZjViIDw8IDgpICsgKGZlZiA8PCAxNikgKyAoZmVmIDw8IDI0KTtcbiAgICAgIG1bMl1baV0gPSBmNWIgKyAoZmVmIDw8IDgpICsgKGYwMSA8PCAxNikgKyAoZmVmIDw8IDI0KTtcbiAgICAgIGYwMSA9IHFbMF1baV07XG4gICAgICBmNWIgPSBmZm01YihmMDEpO1xuICAgICAgZmVmID0gZmZtRWYoZjAxKTtcbiAgICAgIG1bMV1baV0gPSBmZWYgKyAoZmVmIDw8IDgpICsgKGY1YiA8PCAxNikgKyAoZjAxIDw8IDI0KTtcbiAgICAgIG1bM11baV0gPSBmNWIgKyAoZjAxIDw8IDgpICsgKGZlZiA8PCAxNikgKyAoZjViIDw8IDI0KTtcbiAgICB9XG5cbiAgICBrTGVuID0gaW5LZXkubGVuZ3RoIC8gMjtcbiAgICBmb3IgKGkgPSAwOyBpIDwga0xlbjsgaSsrKSB7XG4gICAgICBhID0gaW5LZXlbaSArIGldO1xuICAgICAgbWVLZXlbaV0gPSBhO1xuICAgICAgYiA9IGluS2V5W2kgKyBpICsgMV07XG4gICAgICBtb0tleVtpXSA9IGI7XG4gICAgICBzS2V5W2tMZW4gLSBpIC0gMV0gPSBtZHNSZW0oYSwgYik7XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCA0MDsgaSArPSAyKSB7XG4gICAgICBhID0gMHgxMDEwMTAxICogaTtcbiAgICAgIGIgPSBhICsgMHgxMDEwMTAxO1xuICAgICAgYSA9IGhGdW4oYSwgbWVLZXkpO1xuICAgICAgYiA9IHJvdHcoaEZ1bihiLCBtb0tleSksIDgpO1xuICAgICAgdGZzS2V5W2ldID0gYSArIGIgJiBNQVhJTlQ7XG4gICAgICB0ZnNLZXlbaSArIDFdID0gcm90dyhhICsgMiAqIGIsIDkpO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcbiAgICAgIGEgPSBiID0gYyA9IGQgPSBpO1xuICAgICAgc3dpdGNoIChrTGVuKSB7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBhID0gcVsxXVthXSBeIGdldEIoc0tleVszXSwgMCk7XG4gICAgICAgICAgYiA9IHFbMF1bYl0gXiBnZXRCKHNLZXlbM10sIDEpO1xuICAgICAgICAgIGMgPSBxWzBdW2NdIF4gZ2V0QihzS2V5WzNdLCAyKTtcbiAgICAgICAgICBkID0gcVsxXVtkXSBeIGdldEIoc0tleVszXSwgMyk7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBhID0gcVsxXVthXSBeIGdldEIoc0tleVsyXSwgMCk7XG4gICAgICAgICAgYiA9IHFbMV1bYl0gXiBnZXRCKHNLZXlbMl0sIDEpO1xuICAgICAgICAgIGMgPSBxWzBdW2NdIF4gZ2V0QihzS2V5WzJdLCAyKTtcbiAgICAgICAgICBkID0gcVswXVtkXSBeIGdldEIoc0tleVsyXSwgMyk7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICB0ZnNNWzBdW2ldID0gbVswXVtxWzBdW3FbMF1bYV0gXiBnZXRCKHNLZXlbMV0sIDApXSBeIGdldEIoc0tleVswXSwgMCldO1xuICAgICAgICAgIHRmc01bMV1baV0gPSBtWzFdW3FbMF1bcVsxXVtiXSBeIGdldEIoc0tleVsxXSwgMSldIF4gZ2V0QihzS2V5WzBdLCAxKV07XG4gICAgICAgICAgdGZzTVsyXVtpXSA9IG1bMl1bcVsxXVtxWzBdW2NdIF4gZ2V0QihzS2V5WzFdLCAyKV0gXiBnZXRCKHNLZXlbMF0sIDIpXTtcbiAgICAgICAgICB0ZnNNWzNdW2ldID0gbVszXVtxWzFdW3FbMV1bZF0gXiBnZXRCKHNLZXlbMV0sIDMpXSBeIGdldEIoc0tleVswXSwgMyldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRmc0cwKHgpIHtcbiAgICByZXR1cm4gdGZzTVswXVtnZXRCKHgsIDApXSBeIHRmc01bMV1bZ2V0Qih4LCAxKV0gXiB0ZnNNWzJdW2dldEIoeCwgMildIF4gdGZzTVszXVtnZXRCKHgsIDMpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRmc0cxKHgpIHtcbiAgICByZXR1cm4gdGZzTVswXVtnZXRCKHgsIDMpXSBeIHRmc01bMV1bZ2V0Qih4LCAwKV0gXiB0ZnNNWzJdW2dldEIoeCwgMSldIF4gdGZzTVszXVtnZXRCKHgsIDIpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRmc0ZybmQociwgYmxrKSB7XG4gICAgdmFyIGEgPSB0ZnNHMChibGtbMF0pO1xuICAgIHZhciBiID0gdGZzRzEoYmxrWzFdKTtcbiAgICBibGtbMl0gPSByb3R3KGJsa1syXSBeIGEgKyBiICsgdGZzS2V5WzQgKiByICsgOF0gJiBNQVhJTlQsIDMxKTtcbiAgICBibGtbM10gPSByb3R3KGJsa1szXSwgMSkgXiBhICsgMiAqIGIgKyB0ZnNLZXlbNCAqIHIgKyA5XSAmIE1BWElOVDtcbiAgICBhID0gdGZzRzAoYmxrWzJdKTtcbiAgICBiID0gdGZzRzEoYmxrWzNdKTtcbiAgICBibGtbMF0gPSByb3R3KGJsa1swXSBeIGEgKyBiICsgdGZzS2V5WzQgKiByICsgMTBdICYgTUFYSU5ULCAzMSk7XG4gICAgYmxrWzFdID0gcm90dyhibGtbMV0sIDEpIF4gYSArIDIgKiBiICsgdGZzS2V5WzQgKiByICsgMTFdICYgTUFYSU5UO1xuICB9XG5cbiAgZnVuY3Rpb24gdGZzSXJuZChpLCBibGspIHtcbiAgICB2YXIgYSA9IHRmc0cwKGJsa1swXSk7XG4gICAgdmFyIGIgPSB0ZnNHMShibGtbMV0pO1xuICAgIGJsa1syXSA9IHJvdHcoYmxrWzJdLCAxKSBeIGEgKyBiICsgdGZzS2V5WzQgKiBpICsgMTBdICYgTUFYSU5UO1xuICAgIGJsa1szXSA9IHJvdHcoYmxrWzNdIF4gYSArIDIgKiBiICsgdGZzS2V5WzQgKiBpICsgMTFdICYgTUFYSU5ULCAzMSk7XG4gICAgYSA9IHRmc0cwKGJsa1syXSk7XG4gICAgYiA9IHRmc0cxKGJsa1szXSk7XG4gICAgYmxrWzBdID0gcm90dyhibGtbMF0sIDEpIF4gYSArIGIgKyB0ZnNLZXlbNCAqIGkgKyA4XSAmIE1BWElOVDtcbiAgICBibGtbMV0gPSByb3R3KGJsa1sxXSBeIGEgKyAyICogYiArIHRmc0tleVs0ICogaSArIDldICYgTUFYSU5ULCAzMSk7XG4gIH1cblxuICBmdW5jdGlvbiB0ZnNDbG9zZSgpIHtcbiAgICB0ZnNLZXkgPSBbXTtcbiAgICB0ZnNNID0gW1tdLCBbXSwgW10sIFtdXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRmc0VuY3J5cHQoZGF0YSwgb2Zmc2V0KSB7XG4gICAgZGF0YUJ5dGVzID0gZGF0YTtcbiAgICBkYXRhT2Zmc2V0ID0gb2Zmc2V0O1xuICAgIHZhciBibGsgPSBbZ2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQpIF4gdGZzS2V5WzBdLCBnZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCArIDQpIF4gdGZzS2V5WzFdLCBnZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCArIDgpIF4gdGZzS2V5WzJdLCBnZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCArIDEyKSBeIHRmc0tleVszXV07XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHtcbiAgICAgIHRmc0ZybmQoaiwgYmxrKTtcbiAgICB9XG4gICAgc2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQsIGJsa1syXSBeIHRmc0tleVs0XSk7XG4gICAgc2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQgKyA0LCBibGtbM10gXiB0ZnNLZXlbNV0pO1xuICAgIHNldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0ICsgOCwgYmxrWzBdIF4gdGZzS2V5WzZdKTtcbiAgICBzZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCArIDEyLCBibGtbMV0gXiB0ZnNLZXlbN10pO1xuICAgIGRhdGFPZmZzZXQgKz0gMTY7XG4gICAgcmV0dXJuIGRhdGFCeXRlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHRmc0RlY3J5cHQoZGF0YSwgb2Zmc2V0KSB7XG4gICAgZGF0YUJ5dGVzID0gZGF0YTtcbiAgICBkYXRhT2Zmc2V0ID0gb2Zmc2V0O1xuICAgIHZhciBibGsgPSBbZ2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQpIF4gdGZzS2V5WzRdLCBnZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCArIDQpIF4gdGZzS2V5WzVdLCBnZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCArIDgpIF4gdGZzS2V5WzZdLCBnZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCArIDEyKSBeIHRmc0tleVs3XV07XG4gICAgZm9yICh2YXIgaiA9IDc7IGogPj0gMDsgai0tKSB7XG4gICAgICB0ZnNJcm5kKGosIGJsayk7XG4gICAgfVxuICAgIHNldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0LCBibGtbMl0gXiB0ZnNLZXlbMF0pO1xuICAgIHNldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0ICsgNCwgYmxrWzNdIF4gdGZzS2V5WzFdKTtcbiAgICBzZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCArIDgsIGJsa1swXSBeIHRmc0tleVsyXSk7XG4gICAgc2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQgKyAxMiwgYmxrWzFdIF4gdGZzS2V5WzNdKTtcbiAgICBkYXRhT2Zmc2V0ICs9IDE2O1xuICB9XG5cbiAgLy8gYWRkZWQgYnkgUmVjdXJpdHkgTGFic1xuXG4gIGZ1bmN0aW9uIHRmc0ZpbmFsKCkge1xuICAgIHJldHVybiBkYXRhQnl0ZXM7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hbWU6IFwidHdvZmlzaFwiLFxuICAgIGJsb2Nrc2l6ZTogMTI4IC8gOCxcbiAgICBvcGVuOiB0ZnNJbml0LFxuICAgIGNsb3NlOiB0ZnNDbG9zZSxcbiAgICBlbmNyeXB0OiB0ZnNFbmNyeXB0LFxuICAgIGRlY3J5cHQ6IHRmc0RlY3J5cHQsXG4gICAgLy8gYWRkZWQgYnkgUmVjdXJpdHkgTGFic1xuICAgIGZpbmFsaXplOiB0ZnNGaW5hbFxuICB9O1xufVxuXG4vLyBhZGRlZCBieSBSZWN1cml0eSBMYWJzXG5cbmZ1bmN0aW9uIFRGKGtleSkge1xuICB0aGlzLnRmID0gY3JlYXRlVHdvZmlzaCgpO1xuICB0aGlzLnRmLm9wZW4oKDAsIF9mcm9tMi5kZWZhdWx0KShrZXkpLCAwKTtcblxuICB0aGlzLmVuY3J5cHQgPSBmdW5jdGlvbiAoYmxvY2spIHtcbiAgICByZXR1cm4gdGhpcy50Zi5lbmNyeXB0KCgwLCBfZnJvbTIuZGVmYXVsdCkoYmxvY2spLCAwKTtcbiAgfTtcbn1cblxuVEYua2V5U2l6ZSA9IFRGLnByb3RvdHlwZS5rZXlTaXplID0gMzI7XG5URi5ibG9ja1NpemUgPSBURi5wcm90b3R5cGUuYmxvY2tTaXplID0gMTY7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFRGO1xuXG59LHtcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9hcnJheS9mcm9tXCI6MjB9XSwzMzQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvcicpO1xuXG52YXIgX3JlZ2VuZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZ2VuZXJhdG9yKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJyk7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3luY1RvR2VuZXJhdG9yMik7XG5cbnZhciBDQkMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMyA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlNihrZXkpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTYkKF9jb250ZXh0Nikge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDYucHJldiA9IF9jb250ZXh0Ni5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgaWYgKCEoX3V0aWwyLmRlZmF1bHQuZ2V0V2ViQ3J5cHRvKCkgJiYga2V5Lmxlbmd0aCAhPT0gMjQpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMztcbiAgICAgICAgICAgIHJldHVybiB3ZWJDcnlwdG8uaW1wb3J0S2V5KCdyYXcnLCBrZXksIHsgbmFtZTogJ0FFUy1DQkMnLCBsZW5ndGg6IGtleS5sZW5ndGggKiA4IH0sIGZhbHNlLCBbJ2VuY3J5cHQnXSk7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBrZXkgPSBfY29udGV4dDYuc2VudDtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuYWJydXB0KCdyZXR1cm4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBfcmVmNCA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhwdCkge1xuICAgICAgICAgICAgICAgIHZhciBjdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0Mykge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlYkNyeXB0by5lbmNyeXB0KHsgbmFtZTogJ0FFUy1DQkMnLCBpdjogemVyb0Jsb2NrLCBsZW5ndGg6IGJsb2NrTGVuZ3RoICogOCB9LCBrZXksIHB0KTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0ID0gX2NvbnRleHQzLnNlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgncmV0dXJuJywgbmV3IFVpbnQ4QXJyYXkoY3QpLnN1YmFycmF5KDAsIGN0LmJ5dGVMZW5ndGggLSBibG9ja0xlbmd0aCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUzLCB0aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWY0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KCkpO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgaWYgKCFfdXRpbDIuZGVmYXVsdC5nZXROb2RlQ3J5cHRvKCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSA4O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTm9kZSBjcnlwdG8gbGlicmFyeVxuICAgICAgICAgICAga2V5ID0gbmV3IEJ1ZmZlcihrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5hYnJ1cHQoJ3JldHVybicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIF9yZWY1ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KHB0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGVuLCBjdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHQgPSBuZXcgQnVmZmVyKHB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuID0gbmV3IG5vZGVDcnlwdG8uY3JlYXRlQ2lwaGVyaXYoJ2Flcy0nICsga2V5Lmxlbmd0aCAqIDggKyAnLWNiYycsIGtleSwgemVyb0Jsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0ID0gZW4udXBkYXRlKHB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuYWJydXB0KCdyZXR1cm4nLCBuZXcgVWludDhBcnJheShjdCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU0LCB0aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWY1LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KCkpO1xuXG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5hYnJ1cHQoJ3JldHVybicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIF9yZWY2ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KHB0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHtcbiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ1LnByZXYgPSBfY29udGV4dDUubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuYWJydXB0KCdyZXR1cm4nLCBfZXhwb3J0cy5BRVNfQ0JDLmVuY3J5cHQocHQsIGtleSwgZmFsc2UsIHplcm9CbG9jaykpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU1LCB0aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWY2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KCkpO1xuXG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWU2LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBDQkMoX3gzKSB7XG4gICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbnZhciBfZXhwb3J0cyA9IF9kZXJlcV8oJ2FzbWNyeXB0by5qcy9zcmMvYWVzL2NiYy9leHBvcnRzJyk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBBRVMtQ01BQyBvbiB0b3Agb2ZcbiAqIG5hdGl2ZSBBRVMtQ0JDIHVzaW5nIGVpdGhlciB0aGUgV2ViQ3J5cHRvIEFQSSBvciBOb2RlLmpzJyBjcnlwdG8gQVBJLlxuICogQHJlcXVpcmVzIGFzbWNyeXB0by5qc1xuICogQHJlcXVpcmVzIHV0aWxcbiAqIEBtb2R1bGUgY3J5cHRvL2NtYWNcbiAqL1xuXG52YXIgd2ViQ3J5cHRvID0gX3V0aWwyLmRlZmF1bHQuZ2V0V2ViQ3J5cHRvKCk7XG52YXIgbm9kZUNyeXB0byA9IF91dGlsMi5kZWZhdWx0LmdldE5vZGVDcnlwdG8oKTtcbnZhciBCdWZmZXIgPSBfdXRpbDIuZGVmYXVsdC5nZXROb2RlQnVmZmVyKCk7XG5cbi8qKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBDTUFDIGlzIGJhc2VkIG9uIHRoZSBkZXNjcmlwdGlvbiBvZiBPTUFDIGluXG4gKiBodHRwOi8vd2ViLmNzLnVjZGF2aXMuZWR1L35yb2dhd2F5L3BhcGVycy9lYXgucGRmLiBBcyBwZXIgdGhhdFxuICogZG9jdW1lbnQ6XG4gKlxuICogV2UgaGF2ZSBtYWRlIGEgc21hbGwgbW9kaWZpY2F0aW9uIHRvIHRoZSBPTUFDIGFsZ29yaXRobSBhcyBpdCB3YXNcbiAqIG9yaWdpbmFsbHkgcHJlc2VudGVkLCBjaGFuZ2luZyBvbmUgb2YgaXRzIHR3byBjb25zdGFudHMuXG4gKiBTcGVjaWZpY2FsbHksIHRoZSBjb25zdGFudCA0IGF0IGxpbmUgODUgd2FzIHRoZSBjb25zdGFudCAxLzIgKHRoZVxuICogbXVsdGlwbGljYXRpdmUgaW52ZXJzZSBvZiAyKSBpbiB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiBvZiBPTUFDIFsxNF0uXG4gKiBUaGUgT01BQyBhdXRob3JzIGluZGljYXRlIHRoYXQgdGhleSB3aWxsIHByb211bGdhdGUgdGhpcyBtb2RpZmljYXRpb25cbiAqIFsxNV0sIHdoaWNoIHNsaWdodGx5IHNpbXBsaWZpZXMgaW1wbGVtZW50YXRpb25zLlxuICovXG5cbnZhciBibG9ja0xlbmd0aCA9IDE2O1xuXG4vKipcbiAqIHhvciBgcGFkZGluZ2AgaW50byB0aGUgZW5kIG9mIGBkYXRhYC4gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIFwidGhlXG4gKiBvcGVyYXRpb24geG9y4oaSIFt3aGljaF0geG9ycyB0aGUgc2hvcnRlciBzdHJpbmcgaW50byB0aGUgZW5kIG9mIGxvbmdlclxuICogb25lXCIuIFNpbmNlIGRhdGEgaXMgYWx3YXlzIGFzIGxlYXN0IGFzIGxvbmcgYXMgcGFkZGluZywgd2UgY2FuXG4gKiBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24uXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gcGFkZGluZ1xuICovXG5mdW5jdGlvbiByaWdodFhvck11dChkYXRhLCBwYWRkaW5nKSB7XG4gIHZhciBvZmZzZXQgPSBkYXRhLmxlbmd0aCAtIGJsb2NrTGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrTGVuZ3RoOyBpKyspIHtcbiAgICBkYXRhW2kgKyBvZmZzZXRdIF49IHBhZGRpbmdbaV07XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIHBhZChkYXRhLCBwYWRkaW5nLCBwYWRkaW5nMikge1xuICAvLyBpZiB8TXwgaW4ge24sIDJuLCAzbiwgLi4ufVxuICBpZiAoZGF0YS5sZW5ndGggJSBibG9ja0xlbmd0aCA9PT0gMCkge1xuICAgIC8vIHRoZW4gcmV0dXJuIE0geG9y4oaSIEIsXG4gICAgcmV0dXJuIHJpZ2h0WG9yTXV0KGRhdGEsIHBhZGRpbmcpO1xuICB9XG4gIC8vIGVsc2UgcmV0dXJuIChNIHx8IDEwXihu4oiSMeKIkih8TXwgbW9kIG4pKSkgeG9y4oaSIFBcbiAgdmFyIHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KGRhdGEubGVuZ3RoICsgKGJsb2NrTGVuZ3RoIC0gZGF0YS5sZW5ndGggJSBibG9ja0xlbmd0aCkpO1xuICBwYWRkZWQuc2V0KGRhdGEpO1xuICBwYWRkZWRbZGF0YS5sZW5ndGhdID0gMTI4O1xuICByZXR1cm4gcmlnaHRYb3JNdXQocGFkZGVkLCBwYWRkaW5nMik7XG59XG5cbnZhciB6ZXJvQmxvY2sgPSBuZXcgVWludDhBcnJheShibG9ja0xlbmd0aCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoa2V5KSB7XG4gICAgdmFyIGNiYywgcGFkZGluZywgcGFkZGluZzI7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjtcbiAgICAgICAgICAgIHJldHVybiBDQkMoa2V5KTtcblxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNiYyA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgICAgX2NvbnRleHQyLnQwID0gX3V0aWwyLmRlZmF1bHQ7XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDY7XG4gICAgICAgICAgICByZXR1cm4gY2JjKHplcm9CbG9jayk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBfY29udGV4dDIudDEgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgIHBhZGRpbmcgPSBfY29udGV4dDIudDAuZG91YmxlLmNhbGwoX2NvbnRleHQyLnQwLCBfY29udGV4dDIudDEpO1xuICAgICAgICAgICAgcGFkZGluZzIgPSBfdXRpbDIuZGVmYXVsdC5kb3VibGUocGFkZGluZyk7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX3JlZjIgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZShkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2JjKHBhZChkYXRhLCBwYWRkaW5nLCBwYWRkaW5nMikpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQudDAgPSAtYmxvY2tMZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCBfY29udGV4dC5zZW50LnN1YmFycmF5KF9jb250ZXh0LnQwKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KCkpO1xuXG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gIH0pKTtcblxuICBmdW5jdGlvbiBDTUFDKF94KSB7XG4gICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBDTUFDO1xufSgpO1xuXG59LHtcIi4uL3V0aWxcIjozOTgsXCJhc21jcnlwdG8uanMvc3JjL2Flcy9jYmMvZXhwb3J0c1wiOjUsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiOjM1LFwiYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvclwiOjQyfV0sMzM1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3InKTtcblxudmFyIF9yZWdlbmVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWdlbmVyYXRvcik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvcicpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXN5bmNUb0dlbmVyYXRvcjIpO1xuXG52YXIgX3B1YmxpY19rZXkgPSBfZGVyZXFfKCcuL3B1YmxpY19rZXknKTtcblxudmFyIF9wdWJsaWNfa2V5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3B1YmxpY19rZXkpO1xuXG52YXIgX2NpcGhlciA9IF9kZXJlcV8oJy4vY2lwaGVyJyk7XG5cbnZhciBfY2lwaGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NpcGhlcik7XG5cbnZhciBfcmFuZG9tID0gX2RlcmVxXygnLi9yYW5kb20nKTtcblxudmFyIF9yYW5kb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmFuZG9tKTtcblxudmFyIF9lY2RoX3N5bWtleSA9IF9kZXJlcV8oJy4uL3R5cGUvZWNkaF9zeW1rZXknKTtcblxudmFyIF9lY2RoX3N5bWtleTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lY2RoX3N5bWtleSk7XG5cbnZhciBfa2RmX3BhcmFtcyA9IF9kZXJlcV8oJy4uL3R5cGUva2RmX3BhcmFtcycpO1xuXG52YXIgX2tkZl9wYXJhbXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfa2RmX3BhcmFtcyk7XG5cbnZhciBfbXBpID0gX2RlcmVxXygnLi4vdHlwZS9tcGknKTtcblxudmFyIF9tcGkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbXBpKTtcblxudmFyIF9vaWQgPSBfZGVyZXFfKCcuLi90eXBlL29pZCcpO1xuXG52YXIgX29pZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vaWQpO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vZW51bXMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8vIFRoZSBHUEc0QnJvd3NlcnMgY3J5cHRvIGludGVyZmFjZVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgUHJvdmlkZXMgZnVuY3Rpb25zIGZvciBhc3ltbWV0cmljIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gYXNcbiAqIHdlbGwgYXMga2V5IGdlbmVyYXRpb24gYW5kIHBhcmFtZXRlciBoYW5kbGluZyBmb3IgYWxsIHB1YmxpYy1rZXkgY3J5cHRvc3lzdGVtcy5cbiAqIEByZXF1aXJlcyBjcnlwdG8vcHVibGljX2tleVxuICogQHJlcXVpcmVzIGNyeXB0by9jaXBoZXJcbiAqIEByZXF1aXJlcyBjcnlwdG8vcmFuZG9tXG4gKiBAcmVxdWlyZXMgdHlwZS9lY2RoX3N5bWtleVxuICogQHJlcXVpcmVzIHR5cGUva2RmX3BhcmFtc1xuICogQHJlcXVpcmVzIHR5cGUvbXBpXG4gKiBAcmVxdWlyZXMgdHlwZS9vaWRcbiAqIEByZXF1aXJlcyBlbnVtc1xuICogQG1vZHVsZSBjcnlwdG8vY3J5cHRvXG4gKi9cblxuZnVuY3Rpb24gY29uc3RydWN0UGFyYW1zKHR5cGVzLCBkYXRhKSB7XG4gIHJldHVybiB0eXBlcy5tYXAoZnVuY3Rpb24gKHR5cGUsIGkpIHtcbiAgICBpZiAoZGF0YSAmJiBkYXRhW2ldKSB7XG4gICAgICByZXR1cm4gbmV3IHR5cGUoZGF0YVtpXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgdHlwZSgpO1xuICB9KTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICAvKipcbiAgICogRW5jcnlwdHMgZGF0YSB1c2luZyBzcGVjaWZpZWQgYWxnb3JpdGhtIGFuZCBwdWJsaWMga2V5IHBhcmFtZXRlcnMuXG4gICAqIFNlZSB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi05LjF8UkZDIDQ4ODAgOS4xfSBmb3IgcHVibGljIGtleSBhbGdvcml0aG1zLlxuICAgKiBAcGFyYW0ge21vZHVsZTplbnVtcy5wdWJsaWNLZXl9ICAgICAgICBhbGdvICAgICAgICBQdWJsaWMga2V5IGFsZ29yaXRobVxuICAgKiBAcGFyYW0ge0FycmF5PG1vZHVsZTp0eXBlL21waXxcbiAgICAgICAgICAgICAgICAgICBtb2R1bGU6dHlwZS9vaWR8XG4gICAgICAgICAgICAgICAgICAgbW9kdWxlOnR5cGUva2RmX3BhcmFtcz59IHB1Yl9wYXJhbXMgIEFsZ29yaXRobS1zcGVjaWZpYyBwdWJsaWMga2V5IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHttb2R1bGU6dHlwZS9tcGl9ICAgICAgICAgICAgICAgZGF0YSAgICAgICAgRGF0YSB0byBiZSBlbmNyeXB0ZWQgYXMgTVBJXG4gICAqIEBwYXJhbSB7U3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmdlcnByaW50IFJlY2lwaWVudCBmaW5nZXJwcmludFxuICAgKiBAcmV0dXJucyB7QXJyYXk8bW9kdWxlOnR5cGUvbXBpfFxuICAgKiAgICAgICAgICAgICAgICAgbW9kdWxlOnR5cGUvZWNkaF9zeW1rZXk+fSAgICAgICAgICBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXkgcGFyYW1ldGVyc1xuICAgKiBAYXN5bmNcbiAgICovXG4gIHB1YmxpY0tleUVuY3J5cHQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMihhbGdvLCBwdWJfcGFyYW1zLCBkYXRhLCBmaW5nZXJwcmludCkge1xuICAgICAgdmFyIHR5cGVzO1xuICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgdHlwZXMgPSB0aGlzLmdldEVuY1Nlc3Npb25LZXlQYXJhbVR5cGVzKGFsZ28pO1xuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywgKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG0sIG4sIGUsIHJlcywgX20sIHAsIGcsIHksIF9yZXMsIG9pZCwgUSwga2RmX3BhcmFtcywgX3JlczI7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC50MCA9IGFsZ287XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gX2NvbnRleHQudDAgPT09IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkucnNhX2VuY3J5cHQgPyAzIDogX2NvbnRleHQudDAgPT09IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkucnNhX2VuY3J5cHRfc2lnbiA/IDMgOiBfY29udGV4dC50MCA9PT0gX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lbGdhbWFsID8gMTAgOiBfY29udGV4dC50MCA9PT0gX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lY2RoID8gMTggOiAyNTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgbSA9IGRhdGEudG9CTigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHB1Yl9wYXJhbXNbMF0udG9CTigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHB1Yl9wYXJhbXNbMV0udG9CTigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3B1YmxpY19rZXkyLmRlZmF1bHQucnNhLmVuY3J5cHQobSwgbiwgZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgncmV0dXJuJywgY29uc3RydWN0UGFyYW1zKHR5cGVzLCBbcmVzXSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9tID0gZGF0YS50b0JOKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwID0gcHViX3BhcmFtc1swXS50b0JOKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBnID0gcHViX3BhcmFtc1sxXS50b0JOKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gcHViX3BhcmFtc1syXS50b0JOKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTY7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3B1YmxpY19rZXkyLmRlZmF1bHQuZWxnYW1hbC5lbmNyeXB0KF9tLCBwLCBnLCB5KTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmVzID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIGNvbnN0cnVjdFBhcmFtcyh0eXBlcywgW19yZXMuYzEsIF9yZXMuYzJdKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICAgICAgICAgICAgb2lkID0gcHViX3BhcmFtc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFEgPSBwdWJfcGFyYW1zWzFdLnRvVWludDhBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAga2RmX3BhcmFtcyA9IHB1Yl9wYXJhbXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3B1YmxpY19rZXkyLmRlZmF1bHQuZWxsaXB0aWMuZWNkaC5lbmNyeXB0KG9pZCwga2RmX3BhcmFtcy5jaXBoZXIsIGtkZl9wYXJhbXMuaGFzaCwgZGF0YSwgUSwgZmluZ2VycHJpbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXMyID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIGNvbnN0cnVjdFBhcmFtcyh0eXBlcywgW19yZXMyLlYsIF9yZXMyLkNdKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgncmV0dXJuJywgW10pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgICAgICAgICAgICB9KSkoKSk7XG5cbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpO1xuICAgIH0pKTtcblxuICAgIGZ1bmN0aW9uIHB1YmxpY0tleUVuY3J5cHQoX3gsIF94MiwgX3gzLCBfeDQpIHtcbiAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHB1YmxpY0tleUVuY3J5cHQ7XG4gIH0oKSxcblxuICAvKipcbiAgICogRGVjcnlwdHMgZGF0YSB1c2luZyBzcGVjaWZpZWQgYWxnb3JpdGhtIGFuZCBwcml2YXRlIGtleSBwYXJhbWV0ZXJzLlxuICAgKiBTZWUge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tOS4xfFJGQyA0ODgwIDkuMX0gZm9yIHB1YmxpYyBrZXkgYWxnb3JpdGhtcy5cbiAgICogQHBhcmFtIHttb2R1bGU6ZW51bXMucHVibGljS2V5fSAgICAgICAgYWxnbyAgICAgICAgUHVibGljIGtleSBhbGdvcml0aG1cbiAgICogQHBhcmFtIHtBcnJheTxtb2R1bGU6dHlwZS9tcGl8XG4gICAgICAgICAgICAgICAgICAgbW9kdWxlOnR5cGUvb2lkfFxuICAgICAgICAgICAgICAgICAgIG1vZHVsZTp0eXBlL2tkZl9wYXJhbXM+fSBrZXlfcGFyYW1zICBBbGdvcml0aG0tc3BlY2lmaWMgcHVibGljLCBwcml2YXRlIGtleSBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7QXJyYXk8bW9kdWxlOnR5cGUvbXBpfFxuICAgICAgICAgICAgICAgICAgIG1vZHVsZTp0eXBlL2VjZGhfc3lta2V5Pn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9wYXJhbXMgZW5jcnlwdGVkIHNlc3Npb24ga2V5IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtTdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICAgZmluZ2VycHJpbnQgUmVjaXBpZW50IGZpbmdlcnByaW50XG4gICAqIEByZXR1cm5zIHttb2R1bGU6dHlwZS9tcGl9ICAgICAgICAgICAgICAgICAgICAgICAgIEFuIE1QSSBjb250YWluaW5nIHRoZSBkZWNyeXB0ZWQgZGF0YVxuICAgKiBAYXN5bmNcbiAgICovXG4gIHB1YmxpY0tleURlY3J5cHQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjMgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoYWxnbywga2V5X3BhcmFtcywgZGF0YV9wYXJhbXMsIGZpbmdlcnByaW50KSB7XG4gICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkge1xuICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBfY29udGV4dDQudDAgPSBfbXBpMi5kZWZhdWx0O1xuICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDM7XG4gICAgICAgICAgICAgIHJldHVybiAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMsIG4sIGUsIGQsIHAsIHEsIHUsIGMxLCBjMiwgX3AsIHgsIG9pZCwga2RmX3BhcmFtcywgViwgQywgX2Q7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0Mykge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLnQwID0gYWxnbztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gX2NvbnRleHQzLnQwID09PSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LnJzYV9lbmNyeXB0X3NpZ24gPyAzIDogX2NvbnRleHQzLnQwID09PSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LnJzYV9lbmNyeXB0ID8gMyA6IF9jb250ZXh0My50MCA9PT0gX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lbGdhbWFsID8gMTEgOiBfY29udGV4dDMudDAgPT09IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkaCA/IDE2IDogMjI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBkYXRhX3BhcmFtc1swXS50b0JOKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuID0ga2V5X3BhcmFtc1swXS50b0JOKCk7IC8vIG4gPSBwcVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0ga2V5X3BhcmFtc1sxXS50b0JOKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkID0ga2V5X3BhcmFtc1syXS50b0JOKCk7IC8vIGRlID0gMSBtb2QgKHAtMSkocS0xKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBwID0ga2V5X3BhcmFtc1szXS50b0JOKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBxID0ga2V5X3BhcmFtc1s0XS50b0JOKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1ID0ga2V5X3BhcmFtc1s1XS50b0JOKCk7IC8vIHFeLTEgbW9kIHBcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoJ3JldHVybicsIF9wdWJsaWNfa2V5Mi5kZWZhdWx0LnJzYS5kZWNyeXB0KGMsIG4sIGUsIGQsIHAsIHEsIHUpKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICBjMSA9IGRhdGFfcGFyYW1zWzBdLnRvQk4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gZGF0YV9wYXJhbXNbMV0udG9CTigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3AgPSBrZXlfcGFyYW1zWzBdLnRvQk4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBrZXlfcGFyYW1zWzNdLnRvQk4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCdyZXR1cm4nLCBfcHVibGljX2tleTIuZGVmYXVsdC5lbGdhbWFsLmRlY3J5cHQoYzEsIGMyLCBfcCwgeCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9pZCA9IGtleV9wYXJhbXNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBrZGZfcGFyYW1zID0ga2V5X3BhcmFtc1syXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFYgPSBkYXRhX3BhcmFtc1swXS50b1VpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEMgPSBkYXRhX3BhcmFtc1sxXS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QgPSBrZXlfcGFyYW1zWzNdLnRvVWludDhBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoJ3JldHVybicsIF9wdWJsaWNfa2V5Mi5kZWZhdWx0LmVsbGlwdGljLmVjZGguZGVjcnlwdChvaWQsIGtkZl9wYXJhbXMuY2lwaGVyLCBrZGZfcGFyYW1zLmhhc2gsIFYsIEMsIF9kLCBmaW5nZXJwcmludCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwdWJsaWMga2V5IGVuY3J5cHRpb24gYWxnb3JpdGhtLicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMywgdGhpcyk7XG4gICAgICAgICAgICAgIH0pKSgpO1xuXG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIF9jb250ZXh0NC50MSA9IF9jb250ZXh0NC5zZW50O1xuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdCgncmV0dXJuJywgbmV3IF9jb250ZXh0NC50MChfY29udGV4dDQudDEpKTtcblxuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBfY2FsbGVlNCwgdGhpcyk7XG4gICAgfSkpO1xuXG4gICAgZnVuY3Rpb24gcHVibGljS2V5RGVjcnlwdChfeDUsIF94NiwgX3g3LCBfeDgpIHtcbiAgICAgIHJldHVybiBfcmVmMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiBwdWJsaWNLZXlEZWNyeXB0O1xuICB9KCksXG5cbiAgLyoqIFJldHVybnMgdGhlIHR5cGVzIGNvbXByaXNpbmcgdGhlIHByaXZhdGUga2V5IG9mIGFuIGFsZ29yaXRobVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWxnbyBUaGUgcHVibGljIGtleSBhbGdvcml0aG1cbiAgICogQHJldHVybnMge0FycmF5PFN0cmluZz59IFRoZSBhcnJheSBvZiB0eXBlc1xuICAgKi9cbiAgZ2V0UHJpdktleVBhcmFtVHlwZXM6IGZ1bmN0aW9uIGdldFByaXZLZXlQYXJhbVR5cGVzKGFsZ28pIHtcbiAgICBzd2l0Y2ggKGFsZ28pIHtcbiAgICAgIC8vICAgQWxnb3JpdGhtLVNwZWNpZmljIEZpZWxkcyBmb3IgUlNBIHNlY3JldCBrZXlzOlxuICAgICAgLy8gICAgICAgLSBtdWx0aXByZWNpc2lvbiBpbnRlZ2VyIChNUEkpIG9mIFJTQSBzZWNyZXQgZXhwb25lbnQgZC5cbiAgICAgIC8vICAgICAgIC0gTVBJIG9mIFJTQSBzZWNyZXQgcHJpbWUgdmFsdWUgcC5cbiAgICAgIC8vICAgICAgIC0gTVBJIG9mIFJTQSBzZWNyZXQgcHJpbWUgdmFsdWUgcSAocCA8IHEpLlxuICAgICAgLy8gICAgICAgLSBNUEkgb2YgdSwgdGhlIG11bHRpcGxpY2F0aXZlIGludmVyc2Ugb2YgcCwgbW9kIHEuXG4gICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkucnNhX2VuY3J5cHQ6XG4gICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkucnNhX2VuY3J5cHRfc2lnbjpcbiAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5yc2Ffc2lnbjpcbiAgICAgICAgcmV0dXJuIFtfbXBpMi5kZWZhdWx0LCBfbXBpMi5kZWZhdWx0LCBfbXBpMi5kZWZhdWx0LCBfbXBpMi5kZWZhdWx0XTtcbiAgICAgIC8vICAgQWxnb3JpdGhtLVNwZWNpZmljIEZpZWxkcyBmb3IgRWxnYW1hbCBzZWNyZXQga2V5czpcbiAgICAgIC8vICAgICAgICAtIE1QSSBvZiBFbGdhbWFsIHNlY3JldCBleHBvbmVudCB4LlxuICAgICAgY2FzZSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmVsZ2FtYWw6XG4gICAgICAgIHJldHVybiBbX21waTIuZGVmYXVsdF07XG4gICAgICAvLyAgIEFsZ29yaXRobS1TcGVjaWZpYyBGaWVsZHMgZm9yIERTQSBzZWNyZXQga2V5czpcbiAgICAgIC8vICAgICAgLSBNUEkgb2YgRFNBIHNlY3JldCBleHBvbmVudCB4LlxuICAgICAgY2FzZSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmRzYTpcbiAgICAgICAgcmV0dXJuIFtfbXBpMi5kZWZhdWx0XTtcbiAgICAgIC8vICAgQWxnb3JpdGhtLVNwZWNpZmljIEZpZWxkcyBmb3IgRUNEU0Egb3IgRUNESCBzZWNyZXQga2V5czpcbiAgICAgIC8vICAgICAgIC0gTVBJIG9mIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBzZWNyZXQga2V5LlxuICAgICAgY2FzZSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmVjZGg6XG4gICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkc2E6XG4gICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWRkc2E6XG4gICAgICAgIHJldHVybiBbX21waTIuZGVmYXVsdF07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcHVibGljIGtleSBlbmNyeXB0aW9uIGFsZ29yaXRobS4nKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqIFJldHVybnMgdGhlIHR5cGVzIGNvbXByaXNpbmcgdGhlIHB1YmxpYyBrZXkgb2YgYW4gYWxnb3JpdGhtXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhbGdvIFRoZSBwdWJsaWMga2V5IGFsZ29yaXRobVxuICAgKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nPn0gVGhlIGFycmF5IG9mIHR5cGVzXG4gICAqL1xuICBnZXRQdWJLZXlQYXJhbVR5cGVzOiBmdW5jdGlvbiBnZXRQdWJLZXlQYXJhbVR5cGVzKGFsZ28pIHtcbiAgICBzd2l0Y2ggKGFsZ28pIHtcbiAgICAgIC8vICAgQWxnb3JpdGhtLVNwZWNpZmljIEZpZWxkcyBmb3IgUlNBIHB1YmxpYyBrZXlzOlxuICAgICAgLy8gICAgICAgLSBhIG11bHRpcHJlY2lzaW9uIGludGVnZXIgKE1QSSkgb2YgUlNBIHB1YmxpYyBtb2R1bHVzIG47XG4gICAgICAvLyAgICAgICAtIGFuIE1QSSBvZiBSU0EgcHVibGljIGVuY3J5cHRpb24gZXhwb25lbnQgZS5cbiAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5yc2FfZW5jcnlwdDpcbiAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5yc2FfZW5jcnlwdF9zaWduOlxuICAgICAgY2FzZSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LnJzYV9zaWduOlxuICAgICAgICByZXR1cm4gW19tcGkyLmRlZmF1bHQsIF9tcGkyLmRlZmF1bHRdO1xuICAgICAgLy8gICBBbGdvcml0aG0tU3BlY2lmaWMgRmllbGRzIGZvciBFbGdhbWFsIHB1YmxpYyBrZXlzOlxuICAgICAgLy8gICAgICAgLSBNUEkgb2YgRWxnYW1hbCBwcmltZSBwO1xuICAgICAgLy8gICAgICAgLSBNUEkgb2YgRWxnYW1hbCBncm91cCBnZW5lcmF0b3IgZztcbiAgICAgIC8vICAgICAgIC0gTVBJIG9mIEVsZ2FtYWwgcHVibGljIGtleSB2YWx1ZSB5ICg9IGcqKnggbW9kIHAgd2hlcmUgeCAgaXMgc2VjcmV0KS5cbiAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lbGdhbWFsOlxuICAgICAgICByZXR1cm4gW19tcGkyLmRlZmF1bHQsIF9tcGkyLmRlZmF1bHQsIF9tcGkyLmRlZmF1bHRdO1xuICAgICAgLy8gICBBbGdvcml0aG0tU3BlY2lmaWMgRmllbGRzIGZvciBEU0EgcHVibGljIGtleXM6XG4gICAgICAvLyAgICAgICAtIE1QSSBvZiBEU0EgcHJpbWUgcDtcbiAgICAgIC8vICAgICAgIC0gTVBJIG9mIERTQSBncm91cCBvcmRlciBxIChxIGlzIGEgcHJpbWUgZGl2aXNvciBvZiBwLTEpO1xuICAgICAgLy8gICAgICAgLSBNUEkgb2YgRFNBIGdyb3VwIGdlbmVyYXRvciBnO1xuICAgICAgLy8gICAgICAgLSBNUEkgb2YgRFNBIHB1YmxpYy1rZXkgdmFsdWUgeSAoPSBnKip4IG1vZCBwIHdoZXJlIHggIGlzIHNlY3JldCkuXG4gICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZHNhOlxuICAgICAgICByZXR1cm4gW19tcGkyLmRlZmF1bHQsIF9tcGkyLmRlZmF1bHQsIF9tcGkyLmRlZmF1bHQsIF9tcGkyLmRlZmF1bHRdO1xuICAgICAgLy8gICBBbGdvcml0aG0tU3BlY2lmaWMgRmllbGRzIGZvciBFQ0RTQS9FZERTQSBwdWJsaWMga2V5czpcbiAgICAgIC8vICAgICAgIC0gT0lEIG9mIGN1cnZlO1xuICAgICAgLy8gICAgICAgLSBNUEkgb2YgRUMgcG9pbnQgcmVwcmVzZW50aW5nIHB1YmxpYyBrZXkuXG4gICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkc2E6XG4gICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWRkc2E6XG4gICAgICAgIHJldHVybiBbX29pZDIuZGVmYXVsdCwgX21waTIuZGVmYXVsdF07XG4gICAgICAvLyAgIEFsZ29yaXRobS1TcGVjaWZpYyBGaWVsZHMgZm9yIEVDREggcHVibGljIGtleXM6XG4gICAgICAvLyAgICAgICAtIE9JRCBvZiBjdXJ2ZTtcbiAgICAgIC8vICAgICAgIC0gTVBJIG9mIEVDIHBvaW50IHJlcHJlc2VudGluZyBwdWJsaWMga2V5LlxuICAgICAgLy8gICAgICAgLSBLREY6IHZhcmlhYmxlLWxlbmd0aCBmaWVsZCBjb250YWluaW5nIEtERiBwYXJhbWV0ZXJzLlxuICAgICAgY2FzZSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmVjZGg6XG4gICAgICAgIHJldHVybiBbX29pZDIuZGVmYXVsdCwgX21waTIuZGVmYXVsdCwgX2tkZl9wYXJhbXMyLmRlZmF1bHRdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHB1YmxpYyBrZXkgZW5jcnlwdGlvbiBhbGdvcml0aG0uJyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKiBSZXR1cm5zIHRoZSB0eXBlcyBjb21wcmlzaW5nIHRoZSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXkgb2YgYW4gYWxnb3JpdGhtXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhbGdvIFRoZSBwdWJsaWMga2V5IGFsZ29yaXRobVxuICAgKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nPn0gVGhlIGFycmF5IG9mIHR5cGVzXG4gICAqL1xuICBnZXRFbmNTZXNzaW9uS2V5UGFyYW1UeXBlczogZnVuY3Rpb24gZ2V0RW5jU2Vzc2lvbktleVBhcmFtVHlwZXMoYWxnbykge1xuICAgIHN3aXRjaCAoYWxnbykge1xuICAgICAgLy8gICBBbGdvcml0aG0tU3BlY2lmaWMgRmllbGRzIGZvciBSU0EgZW5jcnlwdGVkIHNlc3Npb24ga2V5czpcbiAgICAgIC8vICAgICAgIC0gTVBJIG9mIFJTQSBlbmNyeXB0ZWQgdmFsdWUgbSoqZSBtb2Qgbi5cbiAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5yc2FfZW5jcnlwdDpcbiAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5yc2FfZW5jcnlwdF9zaWduOlxuICAgICAgICByZXR1cm4gW19tcGkyLmRlZmF1bHRdO1xuXG4gICAgICAvLyAgIEFsZ29yaXRobS1TcGVjaWZpYyBGaWVsZHMgZm9yIEVsZ2FtYWwgZW5jcnlwdGVkIHNlc3Npb24ga2V5czpcbiAgICAgIC8vICAgICAgIC0gTVBJIG9mIEVsZ2FtYWwgdmFsdWUgZyoqayBtb2QgcFxuICAgICAgLy8gICAgICAgLSBNUEkgb2YgRWxnYW1hbCB2YWx1ZSBtICogeSoqayBtb2QgcFxuICAgICAgY2FzZSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmVsZ2FtYWw6XG4gICAgICAgIHJldHVybiBbX21waTIuZGVmYXVsdCwgX21waTIuZGVmYXVsdF07XG4gICAgICAvLyAgIEFsZ29yaXRobS1TcGVjaWZpYyBGaWVsZHMgZm9yIEVDREggZW5jcnlwdGVkIHNlc3Npb24ga2V5czpcbiAgICAgIC8vICAgICAgIC0gTVBJIGNvbnRhaW5pbmcgdGhlIGVwaGVtZXJhbCBrZXkgdXNlZCB0byBlc3RhYmxpc2ggdGhlIHNoYXJlZCBzZWNyZXRcbiAgICAgIC8vICAgICAgIC0gRUNESCBTeW1tZXRyaWMgS2V5XG4gICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkaDpcbiAgICAgICAgcmV0dXJuIFtfbXBpMi5kZWZhdWx0LCBfZWNkaF9zeW1rZXkyLmRlZmF1bHRdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHB1YmxpYyBrZXkgZW5jcnlwdGlvbiBhbGdvcml0aG0uJyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKiBHZW5lcmF0ZSBhbGdvcml0aG0tc3BlY2lmaWMga2V5IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtTdHJpbmd9ICAgICAgICAgIGFsZ28gVGhlIHB1YmxpYyBrZXkgYWxnb3JpdGhtXG4gICAqIEBwYXJhbSB7SW50ZWdlcn0gICAgICAgICBiaXRzIEJpdCBsZW5ndGggZm9yIFJTQSBrZXlzXG4gICAqIEBwYXJhbSB7bW9kdWxlOnR5cGUvb2lkfSBvaWQgIE9iamVjdCBpZGVudGlmaWVyIGZvciBFQ0Mga2V5c1xuICAgKiBAcmV0dXJucyB7QXJyYXl9ICAgICAgICAgICAgICBUaGUgYXJyYXkgb2YgcGFyYW1ldGVyc1xuICAgKiBAYXN5bmNcbiAgICovXG4gIGdlbmVyYXRlUGFyYW1zOiBmdW5jdGlvbiBnZW5lcmF0ZVBhcmFtcyhhbGdvLCBiaXRzLCBvaWQpIHtcbiAgICB2YXIgdHlwZXMgPSBbXS5jb25jYXQodGhpcy5nZXRQdWJLZXlQYXJhbVR5cGVzKGFsZ28pLCB0aGlzLmdldFByaXZLZXlQYXJhbVR5cGVzKGFsZ28pKTtcbiAgICBzd2l0Y2ggKGFsZ28pIHtcbiAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5yc2FfZW5jcnlwdDpcbiAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5yc2FfZW5jcnlwdF9zaWduOlxuICAgICAgY2FzZSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LnJzYV9zaWduOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIF9wdWJsaWNfa2V5Mi5kZWZhdWx0LnJzYS5nZW5lcmF0ZShiaXRzLCBcIjEwMDAxXCIpLnRoZW4oZnVuY3Rpb24gKGtleU9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdFBhcmFtcyh0eXBlcywgW2tleU9iamVjdC5uLCBrZXlPYmplY3QuZSwga2V5T2JqZWN0LmQsIGtleU9iamVjdC5wLCBrZXlPYmplY3QucSwga2V5T2JqZWN0LnVdKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmRzYTpcbiAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lbGdhbWFsOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGFsZ29yaXRobSBmb3Iga2V5IGdlbmVyYXRpb24uJyk7XG4gICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkc2E6XG4gICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWRkc2E6XG4gICAgICAgIHJldHVybiBfcHVibGljX2tleTIuZGVmYXVsdC5lbGxpcHRpYy5nZW5lcmF0ZShvaWQpLnRoZW4oZnVuY3Rpb24gKGtleU9iamVjdCkge1xuICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3RQYXJhbXModHlwZXMsIFtrZXlPYmplY3Qub2lkLCBrZXlPYmplY3QuUSwga2V5T2JqZWN0LmRdKTtcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkaDpcbiAgICAgICAgcmV0dXJuIF9wdWJsaWNfa2V5Mi5kZWZhdWx0LmVsbGlwdGljLmdlbmVyYXRlKG9pZCkudGhlbihmdW5jdGlvbiAoa2V5T2JqZWN0KSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdFBhcmFtcyh0eXBlcywgW2tleU9iamVjdC5vaWQsIGtleU9iamVjdC5RLCBba2V5T2JqZWN0Lmhhc2gsIGtleU9iamVjdC5jaXBoZXJdLCBrZXlPYmplY3QuZF0pO1xuICAgICAgICB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwdWJsaWMga2V5IGFsZ29yaXRobS4nKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJhbmRvbSBieXRlIHByZWZpeCBmb3IgdGhlIHNwZWNpZmllZCBhbGdvcml0aG1cbiAgICogU2VlIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTkuMnxSRkMgNDg4MCA5LjJ9IGZvciBhbGdvcml0aG1zLlxuICAgKiBAcGFyYW0ge21vZHVsZTplbnVtcy5zeW1tZXRyaWN9IGFsZ28gU3ltbWV0cmljIGVuY3J5cHRpb24gYWxnb3JpdGhtXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSAgICAgICAgICAgICAgICBSYW5kb20gYnl0ZXMgd2l0aCBsZW5ndGggZXF1YWwgdG8gdGhlIGJsb2NrIHNpemUgb2YgdGhlIGNpcGhlclxuICAgKiBAYXN5bmNcbiAgICovXG4gIGdldFByZWZpeFJhbmRvbTogZnVuY3Rpb24gZ2V0UHJlZml4UmFuZG9tKGFsZ28pIHtcbiAgICByZXR1cm4gX3JhbmRvbTIuZGVmYXVsdC5nZXRSYW5kb21CeXRlcyhfY2lwaGVyMi5kZWZhdWx0W2FsZ29dLmJsb2NrU2l6ZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdlbmVyYXRpbmcgYSBzZXNzaW9uIGtleSBmb3IgdGhlIHNwZWNpZmllZCBzeW1tZXRyaWMgYWxnb3JpdGhtXG4gICAqIFNlZSB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi05LjJ8UkZDIDQ4ODAgOS4yfSBmb3IgYWxnb3JpdGhtcy5cbiAgICogQHBhcmFtIHttb2R1bGU6ZW51bXMuc3ltbWV0cmljfSBhbGdvIFN5bW1ldHJpYyBlbmNyeXB0aW9uIGFsZ29yaXRobVxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gICAgICAgICAgICAgICAgUmFuZG9tIGJ5dGVzIGFzIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgYSBrZXlcbiAgICogQGFzeW5jXG4gICAqL1xuICBnZW5lcmF0ZVNlc3Npb25LZXk6IGZ1bmN0aW9uIGdlbmVyYXRlU2Vzc2lvbktleShhbGdvKSB7XG4gICAgcmV0dXJuIF9yYW5kb20yLmRlZmF1bHQuZ2V0UmFuZG9tQnl0ZXMoX2NpcGhlcjIuZGVmYXVsdFthbGdvXS5rZXlTaXplKTtcbiAgfSxcblxuICBjb25zdHJ1Y3RQYXJhbXM6IGNvbnN0cnVjdFBhcmFtc1xufTtcblxufSx7XCIuLi9lbnVtc1wiOjM1OSxcIi4uL3R5cGUvZWNkaF9zeW1rZXlcIjozOTIsXCIuLi90eXBlL2tkZl9wYXJhbXNcIjozOTMsXCIuLi90eXBlL21waVwiOjM5NSxcIi4uL3R5cGUvb2lkXCI6Mzk2LFwiLi9jaXBoZXJcIjozMzIsXCIuL3B1YmxpY19rZXlcIjozNTIsXCIuL3JhbmRvbVwiOjM1NSxcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI6MzUsXCJiYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yXCI6NDJ9XSwzMzY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3Byb21pc2UgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvcHJvbWlzZScpO1xuXG52YXIgX3Byb21pc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvbWlzZSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheScpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2xpY2VkVG9BcnJheTIpO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvcicpO1xuXG52YXIgX3JlZ2VuZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZ2VuZXJhdG9yKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJyk7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3luY1RvR2VuZXJhdG9yMik7XG5cbnZhciBPTUFDID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlKGtleSkge1xuICAgIHZhciBjbWFjO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyO1xuICAgICAgICAgICAgcmV0dXJuICgwLCBfY21hYzIuZGVmYXVsdCkoa2V5KTtcblxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNtYWMgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgncmV0dXJuJywgZnVuY3Rpb24gKHQsIG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNtYWMoX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbdCwgbWVzc2FnZV0pKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gT01BQyhfeCkge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbnZhciBDVFIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlNShrZXkpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTUkKF9jb250ZXh0NSkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDUucHJldiA9IF9jb250ZXh0NS5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgaWYgKCEoX3V0aWwyLmRlZmF1bHQuZ2V0V2ViQ3J5cHRvKCkgJiYga2V5Lmxlbmd0aCAhPT0gMjQpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMztcbiAgICAgICAgICAgIHJldHVybiB3ZWJDcnlwdG8uaW1wb3J0S2V5KCdyYXcnLCBrZXksIHsgbmFtZTogJ0FFUy1DVFInLCBsZW5ndGg6IGtleS5sZW5ndGggKiA4IH0sIGZhbHNlLCBbJ2VuY3J5cHQnXSk7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBrZXkgPSBfY29udGV4dDUuc2VudDtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuYWJydXB0KCdyZXR1cm4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBfcmVmMyA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMihwdCwgaXYpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3Q7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZWJDcnlwdG8uZW5jcnlwdCh7IG5hbWU6ICdBRVMtQ1RSJywgY291bnRlcjogaXYsIGxlbmd0aDogYmxvY2tMZW5ndGggKiA4IH0sIGtleSwgcHQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgY3QgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCdyZXR1cm4nLCBuZXcgVWludDhBcnJheShjdCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUyLCB0aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gzLCBfeDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0oKSk7XG5cbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBpZiAoIV91dGlsMi5kZWZhdWx0LmdldE5vZGVDcnlwdG8oKSkge1xuICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDg7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBOb2RlIGNyeXB0byBsaWJyYXJ5XG4gICAgICAgICAgICBrZXkgPSBuZXcgQnVmZmVyKGtleSk7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LmFicnVwdCgncmV0dXJuJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX3JlZjQgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMocHQsIGl2KSB7XG4gICAgICAgICAgICAgICAgdmFyIGVuLCBjdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0Mykge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHQgPSBuZXcgQnVmZmVyKHB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl2ID0gbmV3IEJ1ZmZlcihpdik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbiA9IG5ldyBub2RlQ3J5cHRvLmNyZWF0ZUNpcGhlcml2KCdhZXMtJyArIGtleS5sZW5ndGggKiA4ICsgJy1jdHInLCBrZXksIGl2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0ID0gQnVmZmVyLmNvbmNhdChbZW4udXBkYXRlKHB0KSwgZW4uZmluYWwoKV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoJ3JldHVybicsIG5ldyBVaW50OEFycmF5KGN0KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgX2NhbGxlZTMsIHRoaXMpO1xuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDUsIF94Nikge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSgpKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuYWJydXB0KCdyZXR1cm4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBfcmVmNSA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlNChwdCwgaXYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoJ3JldHVybicsIF9leHBvcnRzLkFFU19DVFIuZW5jcnlwdChwdCwga2V5LCBpdikpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU0LCB0aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g3LCBfeDgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0oKSk7XG5cbiAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTUsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIENUUihfeDIpIHtcbiAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBDbGFzcyB0byBlbi9kZWNyeXB0IHVzaW5nIEVBWCBtb2RlLlxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgY2lwaGVyICAgICAgVGhlIHN5bW1ldHJpYyBjaXBoZXIgYWxnb3JpdGhtIHRvIHVzZSBlLmcuICdhZXMxMjgnXG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSBrZXkgICAgICAgICBUaGUgZW5jcnlwdGlvbiBrZXlcbiAqL1xuXG5cbnZhciBFQVggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmNiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlOChjaXBoZXIsIGtleSkge1xuICAgIHZhciBfcmVmNywgX3JlZjgsIG9tYWMsIGN0cjtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlOCQoX2NvbnRleHQ4KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0OC5wcmV2ID0gX2NvbnRleHQ4Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBpZiAoIShjaXBoZXIuc3Vic3RyKDAsIDMpICE9PSAnYWVzJykpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQ4Lm5leHQgPSAyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFQVggbW9kZSBzdXBwb3J0cyBvbmx5IEFFUyBjaXBoZXInKTtcblxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIF9jb250ZXh0OC5uZXh0ID0gNDtcbiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwoW09NQUMoa2V5KSwgQ1RSKGtleSldKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIF9yZWY3ID0gX2NvbnRleHQ4LnNlbnQ7XG4gICAgICAgICAgICBfcmVmOCA9ICgwLCBfc2xpY2VkVG9BcnJheTMuZGVmYXVsdCkoX3JlZjcsIDIpO1xuICAgICAgICAgICAgb21hYyA9IF9yZWY4WzBdO1xuICAgICAgICAgICAgY3RyID0gX3JlZjhbMV07XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ4LmFicnVwdCgncmV0dXJuJywge1xuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogRW5jcnlwdCBwbGFpbnRleHQgaW5wdXQuXG4gICAgICAgICAgICAgICAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IHBsYWludGV4dCAgIFRoZSBjbGVhcnRleHQgaW5wdXQgdG8gYmUgZW5jcnlwdGVkXG4gICAgICAgICAgICAgICAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IG5vbmNlICAgICAgIFRoZSBub25jZSAoMTYgYnl0ZXMpXG4gICAgICAgICAgICAgICAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IGFkYXRhICAgICAgIEFzc29jaWF0ZWQgZGF0YSB0byBzaWduXG4gICAgICAgICAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSAgICBUaGUgY2lwaGVydGV4dCBvdXRwdXRcbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIGVuY3J5cHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3JlZjkgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTYocGxhaW50ZXh0LCBub25jZSwgYWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBfcmVmMTAsIF9yZWYxMSwgb21hY05vbmNlLCBvbWFjQWRhdGEsIGNpcGhlcmVkLCBvbWFjQ2lwaGVyZWQsIHRhZywgaTtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWU2JChfY29udGV4dDYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Ni5wcmV2ID0gX2NvbnRleHQ2Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQuYWxsKFtvbWFjKHplcm8sIG5vbmNlKSwgb21hYyhvbmUsIGFkYXRhKV0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9yZWYxMCA9IF9jb250ZXh0Ni5zZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVmMTEgPSAoMCwgX3NsaWNlZFRvQXJyYXkzLmRlZmF1bHQpKF9yZWYxMCwgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9tYWNOb25jZSA9IF9yZWYxMVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb21hY0FkYXRhID0gX3JlZjExWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdHIocGxhaW50ZXh0LCBvbWFjTm9uY2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlcmVkID0gX2NvbnRleHQ2LnNlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbWFjKHR3bywgY2lwaGVyZWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbWFjQ2lwaGVyZWQgPSBfY29udGV4dDYuc2VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnID0gb21hY0NpcGhlcmVkOyAvLyBBc3N1bWVzIHRoYXQgb21hYygqKS5sZW5ndGggPT09IHRhZ0xlbmd0aC5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGFnTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdbaV0gXj0gb21hY0FkYXRhW2ldIF4gb21hY05vbmNlW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuYWJydXB0KCdyZXR1cm4nLCBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFtjaXBoZXJlZCwgdGFnXSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNiwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZW5jcnlwdChfeDExLCBfeDEyLCBfeDEzKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZW5jcnlwdDtcbiAgICAgICAgICAgICAgfSgpLFxuXG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBEZWNyeXB0IGNpcGhlcnRleHQgaW5wdXQuXG4gICAgICAgICAgICAgICAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IGNpcGhlcnRleHQgICBUaGUgY2lwaGVydGV4dCBpbnB1dCB0byBiZSBkZWNyeXB0ZWRcbiAgICAgICAgICAgICAgICogQHBhcmFtICB7VWludDhBcnJheX0gbm9uY2UgICAgICAgIFRoZSBub25jZSAoMTYgYnl0ZXMpXG4gICAgICAgICAgICAgICAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IGFkYXRhICAgICAgICBBc3NvY2lhdGVkIGRhdGEgdG8gdmVyaWZ5XG4gICAgICAgICAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSAgICAgVGhlIHBsYWludGV4dCBvdXRwdXRcbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIGRlY3J5cHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3JlZjEyID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU3KGNpcGhlcnRleHQsIG5vbmNlLCBhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgdmFyIGNpcGhlcmVkLCBjdFRhZywgX3JlZjEzLCBfcmVmMTQsIG9tYWNOb25jZSwgb21hY0FkYXRhLCBvbWFjQ2lwaGVyZWQsIHRhZywgaSwgcGxhaW50ZXh0O1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTckKF9jb250ZXh0Nykge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ3LnByZXYgPSBfY29udGV4dDcubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShjaXBoZXJ0ZXh0Lmxlbmd0aCA8IHRhZ0xlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgRUFYIGNpcGhlcnRleHQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJlZCA9IGNpcGhlcnRleHQuc3ViYXJyYXkoMCwgLXRhZ0xlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN0VGFnID0gY2lwaGVydGV4dC5zdWJhcnJheSgtdGFnTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSA2O1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQuYWxsKFtvbWFjKHplcm8sIG5vbmNlKSwgb21hYyhvbmUsIGFkYXRhKSwgb21hYyh0d28sIGNpcGhlcmVkKV0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9yZWYxMyA9IF9jb250ZXh0Ny5zZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVmMTQgPSAoMCwgX3NsaWNlZFRvQXJyYXkzLmRlZmF1bHQpKF9yZWYxMywgMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9tYWNOb25jZSA9IF9yZWYxNFswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb21hY0FkYXRhID0gX3JlZjE0WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBvbWFjQ2lwaGVyZWQgPSBfcmVmMTRbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRhZyA9IG9tYWNDaXBoZXJlZDsgLy8gQXNzdW1lcyB0aGF0IG9tYWMoKikubGVuZ3RoID09PSB0YWdMZW5ndGguXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhZ0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnW2ldIF49IG9tYWNBZGF0YVtpXSBeIG9tYWNOb25jZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdXRpbDIuZGVmYXVsdC5lcXVhbHNVaW50OEFycmF5KGN0VGFnLCB0YWcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSAxNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gdGFnIG1pc21hdGNoJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMTc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdHIoY2lwaGVyZWQsIG9tYWNOb25jZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWludGV4dCA9IF9jb250ZXh0Ny5zZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LmFicnVwdCgncmV0dXJuJywgcGxhaW50ZXh0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDcuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTcsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRlY3J5cHQoX3gxNCwgX3gxNSwgX3gxNikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWYxMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBkZWNyeXB0O1xuICAgICAgICAgICAgICB9KClcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ4LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWU4LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBFQVgoX3g5LCBfeDEwKSB7XG4gICAgcmV0dXJuIF9yZWY2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogR2V0IEVBWCBub25jZSBhcyBkZWZpbmVkIGJ5IHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1vcGVucGdwLXJmYzQ4ODBiaXMtMDQjc2VjdGlvbi01LjE2LjF8UkZDNDg4MGJpcy0wNCwgc2VjdGlvbiA1LjE2LjF9LlxuICogQHBhcmFtICB7VWludDhBcnJheX0gaXYgICAgICAgICAgIFRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKDE2IGJ5dGVzKVxuICogQHBhcmFtICB7VWludDhBcnJheX0gY2h1bmtJbmRleCAgIFRoZSBjaHVuayBpbmRleCAoOCBieXRlcylcbiAqL1xuXG5cbnZhciBfZXhwb3J0cyA9IF9kZXJlcV8oJ2FzbWNyeXB0by5qcy9zcmMvYWVzL2N0ci9leHBvcnRzJyk7XG5cbnZhciBfY21hYyA9IF9kZXJlcV8oJy4vY21hYycpO1xuXG52YXIgX2NtYWMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY21hYyk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgd2ViQ3J5cHRvID0gX3V0aWwyLmRlZmF1bHQuZ2V0V2ViQ3J5cHRvKCk7IC8vIE9wZW5QR1AuanMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxOCBQcm90b25UZWNoIEFHXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFRoaXMgbW9kdWxlIGltcGxlbWVudHMgQUVTLUVBWCBlbi9kZWNyeXB0aW9uIG9uIHRvcCBvZlxuICogbmF0aXZlIEFFUy1DVFIgdXNpbmcgZWl0aGVyIHRoZSBXZWJDcnlwdG8gQVBJIG9yIE5vZGUuanMnIGNyeXB0byBBUEkuXG4gKiBAcmVxdWlyZXMgYXNtY3J5cHRvLmpzXG4gKiBAcmVxdWlyZXMgY3J5cHRvL2NtYWNcbiAqIEByZXF1aXJlcyB1dGlsXG4gKiBAbW9kdWxlIGNyeXB0by9lYXhcbiAqL1xuXG52YXIgbm9kZUNyeXB0byA9IF91dGlsMi5kZWZhdWx0LmdldE5vZGVDcnlwdG8oKTtcbnZhciBCdWZmZXIgPSBfdXRpbDIuZGVmYXVsdC5nZXROb2RlQnVmZmVyKCk7XG5cbnZhciBibG9ja0xlbmd0aCA9IDE2O1xudmFyIGl2TGVuZ3RoID0gYmxvY2tMZW5ndGg7XG52YXIgdGFnTGVuZ3RoID0gYmxvY2tMZW5ndGg7XG5cbnZhciB6ZXJvID0gbmV3IFVpbnQ4QXJyYXkoYmxvY2tMZW5ndGgpO1xudmFyIG9uZSA9IG5ldyBVaW50OEFycmF5KGJsb2NrTGVuZ3RoKTtvbmVbYmxvY2tMZW5ndGggLSAxXSA9IDE7XG52YXIgdHdvID0gbmV3IFVpbnQ4QXJyYXkoYmxvY2tMZW5ndGgpO3R3b1tibG9ja0xlbmd0aCAtIDFdID0gMjtcblxuRUFYLmdldE5vbmNlID0gZnVuY3Rpb24gKGl2LCBjaHVua0luZGV4KSB7XG4gIHZhciBub25jZSA9IGl2LnNsaWNlKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2h1bmtJbmRleC5sZW5ndGg7IGkrKykge1xuICAgIG5vbmNlWzggKyBpXSBePSBjaHVua0luZGV4W2ldO1xuICB9XG4gIHJldHVybiBub25jZTtcbn07XG5cbkVBWC5ibG9ja0xlbmd0aCA9IGJsb2NrTGVuZ3RoO1xuRUFYLml2TGVuZ3RoID0gaXZMZW5ndGg7XG5FQVgudGFnTGVuZ3RoID0gdGFnTGVuZ3RoO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBFQVg7XG5cbn0se1wiLi4vdXRpbFwiOjM5OCxcIi4vY21hY1wiOjMzNCxcImFzbWNyeXB0by5qcy9zcmMvYWVzL2N0ci9leHBvcnRzXCI6OSxcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9wcm9taXNlXCI6MzIsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiOjM1LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIjo0MCxcImJhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3JcIjo0Mn1dLDMzNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcmVnZW5lcmF0b3IgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yJyk7XG5cbnZhciBfcmVnZW5lcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVnZW5lcmF0b3IpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IyID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3InKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FzeW5jVG9HZW5lcmF0b3IyKTtcblxuLyoqXG4gKiBDbGFzcyB0byBlbi9kZWNyeXB0IHVzaW5nIEdDTSBtb2RlLlxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgY2lwaGVyICAgICAgVGhlIHN5bW1ldHJpYyBjaXBoZXIgYWxnb3JpdGhtIHRvIHVzZSBlLmcuICdhZXMxMjgnXG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSBrZXkgICAgICAgICBUaGUgZW5jcnlwdGlvbiBrZXlcbiAqL1xudmFyIEdDTSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTcoY2lwaGVyLCBrZXkpIHtcbiAgICB2YXIgX2tleTtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNyQoX2NvbnRleHQ3KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Ny5wcmV2ID0gX2NvbnRleHQ3Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBpZiAoIShjaXBoZXIuc3Vic3RyKDAsIDMpICE9PSAnYWVzJykpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSAyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHQ00gbW9kZSBzdXBwb3J0cyBvbmx5IEFFUyBjaXBoZXInKTtcblxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGlmICghKF91dGlsMi5kZWZhdWx0LmdldFdlYkNyeXB0bygpICYmIGtleS5sZW5ndGggIT09IDI0KSkge1xuICAgICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDU7XG4gICAgICAgICAgICByZXR1cm4gd2ViQ3J5cHRvLmltcG9ydEtleSgncmF3Jywga2V5LCB7IG5hbWU6IEFMR08gfSwgZmFsc2UsIFsnZW5jcnlwdCcsICdkZWNyeXB0J10pO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgX2tleSA9IF9jb250ZXh0Ny5zZW50O1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ny5hYnJ1cHQoJ3JldHVybicsIHtcbiAgICAgICAgICAgICAgZW5jcnlwdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBfcmVmMiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlKHB0LCBpdikge1xuICAgICAgICAgICAgICAgICAgdmFyIGFkYXRhID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBuZXcgVWludDhBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgdmFyIGN0O1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCBfZXhwb3J0cy5BRVNfR0NNLmVuY3J5cHQocHQsIGtleSwgaXYsIGFkYXRhKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZWJDcnlwdG8uZW5jcnlwdCh7IG5hbWU6IEFMR08sIGl2OiBpdiwgYWRkaXRpb25hbERhdGE6IGFkYXRhIH0sIF9rZXksIHB0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIG5ldyBVaW50OEFycmF5KGN0KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBlbmNyeXB0KF94MywgX3g0KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZW5jcnlwdDtcbiAgICAgICAgICAgICAgfSgpLFxuXG4gICAgICAgICAgICAgIGRlY3J5cHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3JlZjMgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoY3QsIGl2KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgYWRhdGEgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICB2YXIgcHQ7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShjdC5sZW5ndGggPT09IHRhZ0xlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywgX2V4cG9ydHMuQUVTX0dDTS5kZWNyeXB0KGN0LCBrZXksIGl2LCBhZGF0YSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlYkNyeXB0by5kZWNyeXB0KHsgbmFtZTogQUxHTywgaXY6IGl2LCBhZGRpdGlvbmFsRGF0YTogYWRhdGEgfSwgX2tleSwgY3QpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHB0ID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCdyZXR1cm4nLCBuZXcgVWludDhBcnJheShwdCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUyLCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkZWNyeXB0KF94NiwgX3g3KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVjcnlwdDtcbiAgICAgICAgICAgICAgfSgpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIGlmICghX3V0aWwyLmRlZmF1bHQuZ2V0Tm9kZUNyeXB0bygpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMTA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBOb2RlIGNyeXB0byBsaWJyYXJ5XG4gICAgICAgICAgICBrZXkgPSBuZXcgQnVmZmVyKGtleSk7XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDcuYWJydXB0KCdyZXR1cm4nLCB7XG4gICAgICAgICAgICAgIGVuY3J5cHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3JlZjQgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMocHQsIGl2KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgYWRhdGEgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICB2YXIgZW4sIGN0O1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHQgPSBuZXcgQnVmZmVyKHB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXYgPSBuZXcgQnVmZmVyKGl2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhdGEgPSBuZXcgQnVmZmVyKGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW4gPSBuZXcgbm9kZUNyeXB0by5jcmVhdGVDaXBoZXJpdignYWVzLScgKyBrZXkubGVuZ3RoICogOCArICctZ2NtJywga2V5LCBpdik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW4uc2V0QUFEKGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3QgPSBCdWZmZXIuY29uY2F0KFtlbi51cGRhdGUocHQpLCBlbi5maW5hbCgpLCBlbi5nZXRBdXRoVGFnKCldKTsgLy8gYXBwZW5kIGF1dGggdGFnIHRvIGNpcGhlcnRleHRcblxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgncmV0dXJuJywgbmV3IFVpbnQ4QXJyYXkoY3QpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMywgdGhpcyk7XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZW5jcnlwdChfeDksIF94MTApIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBlbmNyeXB0O1xuICAgICAgICAgICAgICB9KCksXG5cbiAgICAgICAgICAgICAgZGVjcnlwdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBfcmVmNSA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlNChjdCwgaXYpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBhZGF0YSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgIHZhciBkZSwgcHQ7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdCA9IG5ldyBCdWZmZXIoY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpdiA9IG5ldyBCdWZmZXIoaXYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhZGF0YSA9IG5ldyBCdWZmZXIoYWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZSA9IG5ldyBub2RlQ3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoJ2Flcy0nICsga2V5Lmxlbmd0aCAqIDggKyAnLWdjbScsIGtleSwgaXYpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlLnNldEFBRChhZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlLnNldEF1dGhUYWcoY3Quc2xpY2UoY3QubGVuZ3RoIC0gdGFnTGVuZ3RoLCBjdC5sZW5ndGgpKTsgLy8gcmVhZCBhdXRoIHRhZyBhdCBlbmQgb2YgY2lwaGVydGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwdCA9IEJ1ZmZlci5jb25jYXQoW2RlLnVwZGF0ZShjdC5zbGljZSgwLCBjdC5sZW5ndGggLSB0YWdMZW5ndGgpKSwgZGUuZmluYWwoKV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdCgncmV0dXJuJywgbmV3IFVpbnQ4QXJyYXkocHQpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZGVjcnlwdChfeDEyLCBfeDEzKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVjcnlwdDtcbiAgICAgICAgICAgICAgfSgpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LmFicnVwdCgncmV0dXJuJywge1xuICAgICAgICAgICAgICBlbmNyeXB0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9yZWY2ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KHB0LCBpdiwgYWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNSQoX2NvbnRleHQ1KSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDUucHJldiA9IF9jb250ZXh0NS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuYWJydXB0KCdyZXR1cm4nLCBfZXhwb3J0cy5BRVNfR0NNLmVuY3J5cHQocHQsIGtleSwgaXYsIGFkYXRhKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTUsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVuY3J5cHQoX3gxNSwgX3gxNiwgX3gxNykge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWY2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3J5cHQ7XG4gICAgICAgICAgICAgIH0oKSxcblxuICAgICAgICAgICAgICBkZWNyeXB0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9yZWY3ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU2KGN0LCBpdiwgYWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNiQoX2NvbnRleHQ2KSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDYucHJldiA9IF9jb250ZXh0Ni5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuYWJydXB0KCdyZXR1cm4nLCBfZXhwb3J0cy5BRVNfR0NNLmRlY3J5cHQoY3QsIGtleSwgaXYsIGFkYXRhKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTYsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRlY3J5cHQoX3gxOCwgX3gxOSwgX3gyMCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWY3LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlY3J5cHQ7XG4gICAgICAgICAgICAgIH0oKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWU3LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBHQ00oX3gsIF94Mikge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogR2V0IEdDTSBub25jZS4gTm90ZTogdGhpcyBvcGVyYXRpb24gaXMgbm90IGRlZmluZWQgYnkgdGhlIHN0YW5kYXJkLlxuICogQSBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgc3RhbmRhcmQgbWF5IGRlZmluZSBHQ00gbW9kZSBkaWZmZXJlbnRseSxcbiAqIGhvcGVmdWxseSB1bmRlciBhIGRpZmZlcmVudCBJRCAod2UgdXNlIFByaXZhdGUvRXhwZXJpbWVudGFsIGFsZ29yaXRobVxuICogSUQgMTAwKSBzbyB0aGF0IHdlIGNhbiBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IGl2ICAgICAgICAgICBUaGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yICgxMiBieXRlcylcbiAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IGNodW5rSW5kZXggICBUaGUgY2h1bmsgaW5kZXggKDggYnl0ZXMpXG4gKi9cblxuXG52YXIgX2V4cG9ydHMgPSBfZGVyZXFfKCdhc21jcnlwdG8uanMvc3JjL2Flcy9nY20vZXhwb3J0cycpO1xuXG52YXIgX3V0aWwgPSBfZGVyZXFfKCcuLi91dGlsJyk7XG5cbnZhciBfdXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLy8gT3BlblBHUC5qcyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRhbmtyZWQgSGFzZVxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBUaGlzIG1vZHVsZSB3cmFwcyBuYXRpdmUgQUVTLUdDTSBlbi9kZWNyeXB0aW9uIGZvciBib3RoXG4gKiB0aGUgV2ViQ3J5cHRvIGFwaSBhcyB3ZWxsIGFzIG5vZGUuanMnIGNyeXB0byBhcGkuXG4gKiBAcmVxdWlyZXMgYXNtY3J5cHRvLmpzXG4gKiBAcmVxdWlyZXMgdXRpbFxuICogQG1vZHVsZSBjcnlwdG8vZ2NtXG4gKi9cblxudmFyIHdlYkNyeXB0byA9IF91dGlsMi5kZWZhdWx0LmdldFdlYkNyeXB0bygpOyAvLyBubyBHQ00gc3VwcG9ydCBpbiBJRTExLCBTYWZhcmkgOVxudmFyIG5vZGVDcnlwdG8gPSBfdXRpbDIuZGVmYXVsdC5nZXROb2RlQ3J5cHRvKCk7XG52YXIgQnVmZmVyID0gX3V0aWwyLmRlZmF1bHQuZ2V0Tm9kZUJ1ZmZlcigpO1xuXG52YXIgYmxvY2tMZW5ndGggPSAxNjtcbnZhciBpdkxlbmd0aCA9IDEyOyAvLyBzaXplIG9mIHRoZSBJViBpbiBieXRlc1xudmFyIHRhZ0xlbmd0aCA9IDE2OyAvLyBzaXplIG9mIHRoZSB0YWcgaW4gYnl0ZXNcbnZhciBBTEdPID0gJ0FFUy1HQ00nO0dDTS5nZXROb25jZSA9IGZ1bmN0aW9uIChpdiwgY2h1bmtJbmRleCkge1xuICB2YXIgbm9uY2UgPSBpdi5zbGljZSgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNodW5rSW5kZXgubGVuZ3RoOyBpKyspIHtcbiAgICBub25jZVs0ICsgaV0gXj0gY2h1bmtJbmRleFtpXTtcbiAgfVxuICByZXR1cm4gbm9uY2U7XG59O1xuXG5HQ00uYmxvY2tMZW5ndGggPSBibG9ja0xlbmd0aDtcbkdDTS5pdkxlbmd0aCA9IGl2TGVuZ3RoO1xuR0NNLnRhZ0xlbmd0aCA9IHRhZ0xlbmd0aDtcblxuZXhwb3J0cy5kZWZhdWx0ID0gR0NNO1xuXG59LHtcIi4uL3V0aWxcIjozOTgsXCJhc21jcnlwdG8uanMvc3JjL2Flcy9nY20vZXhwb3J0c1wiOjEyLFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjozNSxcImJhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3JcIjo0Mn1dLDMzODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcnVzaGEgPSBfZGVyZXFfKCdydXNoYScpO1xuXG52YXIgX3J1c2hhMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3J1c2hhKTtcblxudmFyIF9leHBvcnRzID0gX2RlcmVxXygnYXNtY3J5cHRvLmpzL3NyYy9oYXNoL3NoYTI1Ni9leHBvcnRzJyk7XG5cbnZhciBfID0gX2RlcmVxXygnaGFzaC5qcy9saWIvaGFzaC9zaGEvMjI0Jyk7XG5cbnZhciBfMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoXyk7XG5cbnZhciBfMyA9IF9kZXJlcV8oJ2hhc2guanMvbGliL2hhc2gvc2hhLzM4NCcpO1xuXG52YXIgXzQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF8zKTtcblxudmFyIF81ID0gX2RlcmVxXygnaGFzaC5qcy9saWIvaGFzaC9zaGEvNTEyJyk7XG5cbnZhciBfNiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoXzUpO1xuXG52YXIgX3JpcGVtZCA9IF9kZXJlcV8oJ2hhc2guanMvbGliL2hhc2gvcmlwZW1kJyk7XG5cbnZhciBfbWQgPSBfZGVyZXFfKCcuL21kNScpO1xuXG52YXIgX21kMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX21kKTtcblxudmFyIF91dGlsID0gX2RlcmVxXygnLi4vLi4vdXRpbCcpO1xuXG52YXIgX3V0aWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBQcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gaGFzaGluZyBmdW5jdGlvbnMgYXZhaWxhYmxlIGluIE5vZGUuanMgb3IgZXh0ZXJuYWwgbGlicmFyaWVzLlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3NyaWpzL3J1c2hhfFJ1c2hhfVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzbWNyeXB0by9hc21jcnlwdG8uanN8YXNtQ3J5cHRvfVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvaGFzaC5qc3xoYXNoLmpzfVxuICogQHJlcXVpcmVzIHJ1c2hhXG4gKiBAcmVxdWlyZXMgYXNtY3J5cHRvLmpzXG4gKiBAcmVxdWlyZXMgaGFzaC5qc1xuICogQHJlcXVpcmVzIGNyeXB0by9oYXNoL21kNVxuICogQHJlcXVpcmVzIHV0aWxcbiAqIEBtb2R1bGUgY3J5cHRvL2hhc2hcbiAqL1xuXG52YXIgcnVzaGEgPSBuZXcgX3J1c2hhMi5kZWZhdWx0KCk7XG52YXIgbm9kZUNyeXB0byA9IF91dGlsMi5kZWZhdWx0LmdldE5vZGVDcnlwdG8oKTtcbnZhciBCdWZmZXIgPSBfdXRpbDIuZGVmYXVsdC5nZXROb2RlQnVmZmVyKCk7XG5cbmZ1bmN0aW9uIG5vZGVfaGFzaCh0eXBlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBzaGFzdW0gPSBub2RlQ3J5cHRvLmNyZWF0ZUhhc2godHlwZSk7XG4gICAgc2hhc3VtLnVwZGF0ZShuZXcgQnVmZmVyKGRhdGEpKTtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoc2hhc3VtLmRpZ2VzdCgpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaGFzaGpzX2hhc2goaGFzaCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuaGV4X3RvX1VpbnQ4QXJyYXkoaGFzaCgpLnVwZGF0ZShkYXRhKS5kaWdlc3QoJ2hleCcpKTtcbiAgfTtcbn1cblxudmFyIGhhc2hfZm5zID0gdm9pZCAwO1xuaWYgKG5vZGVDcnlwdG8pIHtcbiAgLy8gVXNlIE5vZGUgbmF0aXZlIGNyeXB0byBmb3IgYWxsIGhhc2ggZnVuY3Rpb25zXG4gIGhhc2hfZm5zID0ge1xuICAgIG1kNTogbm9kZV9oYXNoKCdtZDUnKSxcbiAgICBzaGExOiBub2RlX2hhc2goJ3NoYTEnKSxcbiAgICBzaGEyMjQ6IG5vZGVfaGFzaCgnc2hhMjI0JyksXG4gICAgc2hhMjU2OiBub2RlX2hhc2goJ3NoYTI1NicpLFxuICAgIHNoYTM4NDogbm9kZV9oYXNoKCdzaGEzODQnKSxcbiAgICBzaGE1MTI6IG5vZGVfaGFzaCgnc2hhNTEyJyksXG4gICAgcmlwZW1kOiBub2RlX2hhc2goJ3JpcGVtZDE2MCcpXG4gIH07XG59IGVsc2Uge1xuICAvLyBVc2UgSlMgZmFsbGJhY2tzXG4gIGhhc2hfZm5zID0ge1xuICAgIG1kNTogX21kMi5kZWZhdWx0LFxuICAgIHNoYTE6IGZ1bmN0aW9uIHNoYTEoZGF0YSkge1xuICAgICAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LmhleF90b19VaW50OEFycmF5KHJ1c2hhLmRpZ2VzdChkYXRhKSk7XG4gICAgfSxcbiAgICBzaGEyMjQ6IGhhc2hqc19oYXNoKF8yLmRlZmF1bHQpLFxuICAgIHNoYTI1NjogX2V4cG9ydHMuU0hBMjU2LmJ5dGVzLFxuICAgIHNoYTM4NDogaGFzaGpzX2hhc2goXzQuZGVmYXVsdCksXG4gICAgLy8gVE9ETywgYmVuY2htYXJrIHRoaXMgdnMgYXNtQ3J5cHRvJ3MgU0hBNTEyXG4gICAgc2hhNTEyOiBoYXNoanNfaGFzaChfNi5kZWZhdWx0KSxcbiAgICByaXBlbWQ6IGhhc2hqc19oYXNoKF9yaXBlbWQucmlwZW1kMTYwKVxuICB9O1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG5cbiAgLyoqIEBzZWUgbW9kdWxlOm1kNSAqL1xuICBtZDU6IGhhc2hfZm5zLm1kNSxcbiAgLyoqIEBzZWUgcnVzaGEgKi9cbiAgc2hhMTogaGFzaF9mbnMuc2hhMSxcbiAgLyoqIEBzZWUgaGFzaC5qcyAqL1xuICBzaGEyMjQ6IGhhc2hfZm5zLnNoYTIyNCxcbiAgLyoqIEBzZWUgYXNtQ3J5cHRvICovXG4gIHNoYTI1NjogaGFzaF9mbnMuc2hhMjU2LFxuICAvKiogQHNlZSBoYXNoLmpzICovXG4gIHNoYTM4NDogaGFzaF9mbnMuc2hhMzg0LFxuICAvKiogQHNlZSBoYXNoLmpzICovXG4gIHNoYTUxMjogaGFzaF9mbnMuc2hhNTEyLFxuICAvKiogQHNlZSBoYXNoLmpzICovXG4gIHJpcGVtZDogaGFzaF9mbnMucmlwZW1kLFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBoYXNoIG9uIHRoZSBzcGVjaWZpZWQgZGF0YSB1c2luZyB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobVxuICAgKiBAcGFyYW0ge21vZHVsZTplbnVtcy5oYXNofSBhbGdvIEhhc2ggYWxnb3JpdGhtIHR5cGUgKHNlZSB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi05LjR8UkZDIDQ4ODAgOS40fSlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhIERhdGEgdG8gYmUgaGFzaGVkXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBoYXNoIHZhbHVlXG4gICAqL1xuICBkaWdlc3Q6IGZ1bmN0aW9uIGRpZ2VzdChhbGdvLCBkYXRhKSB7XG4gICAgc3dpdGNoIChhbGdvKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIC8vIC0gTUQ1IFtIQUNdXG4gICAgICAgIHJldHVybiB0aGlzLm1kNShkYXRhKTtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgLy8gLSBTSEEtMSBbRklQUzE4MF1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2hhMShkYXRhKTtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgLy8gLSBSSVBFLU1ELzE2MCBbSEFDXVxuICAgICAgICByZXR1cm4gdGhpcy5yaXBlbWQoZGF0YSk7XG4gICAgICBjYXNlIDg6XG4gICAgICAgIC8vIC0gU0hBMjU2IFtGSVBTMTgwXVxuICAgICAgICByZXR1cm4gdGhpcy5zaGEyNTYoZGF0YSk7XG4gICAgICBjYXNlIDk6XG4gICAgICAgIC8vIC0gU0hBMzg0IFtGSVBTMTgwXVxuICAgICAgICByZXR1cm4gdGhpcy5zaGEzODQoZGF0YSk7XG4gICAgICBjYXNlIDEwOlxuICAgICAgICAvLyAtIFNIQTUxMiBbRklQUzE4MF1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2hhNTEyKGRhdGEpO1xuICAgICAgY2FzZSAxMTpcbiAgICAgICAgLy8gLSBTSEEyMjQgW0ZJUFMxODBdXG4gICAgICAgIHJldHVybiB0aGlzLnNoYTIyNChkYXRhKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoYXNoIGZ1bmN0aW9uLicpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaGFzaCBzaXplIGluIGJ5dGVzIG9mIHRoZSBzcGVjaWZpZWQgaGFzaCBhbGdvcml0aG0gdHlwZVxuICAgKiBAcGFyYW0ge21vZHVsZTplbnVtcy5oYXNofSBhbGdvIEhhc2ggYWxnb3JpdGhtIHR5cGUgKFNlZSB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi05LjR8UkZDIDQ4ODAgOS40fSlcbiAgICogQHJldHVybnMge0ludGVnZXJ9IFNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlc3VsdGluZyBoYXNoXG4gICAqL1xuICBnZXRIYXNoQnl0ZUxlbmd0aDogZnVuY3Rpb24gZ2V0SGFzaEJ5dGVMZW5ndGgoYWxnbykge1xuICAgIHN3aXRjaCAoYWxnbykge1xuICAgICAgY2FzZSAxOlxuICAgICAgICAvLyAtIE1ENSBbSEFDXVxuICAgICAgICByZXR1cm4gMTY7XG4gICAgICBjYXNlIDI6IC8vIC0gU0hBLTEgW0ZJUFMxODBdXG4gICAgICBjYXNlIDM6XG4gICAgICAgIC8vIC0gUklQRS1NRC8xNjAgW0hBQ11cbiAgICAgICAgcmV0dXJuIDIwO1xuICAgICAgY2FzZSA4OlxuICAgICAgICAvLyAtIFNIQTI1NiBbRklQUzE4MF1cbiAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgY2FzZSA5OlxuICAgICAgICAvLyAtIFNIQTM4NCBbRklQUzE4MF1cbiAgICAgICAgcmV0dXJuIDQ4O1xuICAgICAgY2FzZSAxMDpcbiAgICAgICAgLy8gLSBTSEE1MTIgW0ZJUFMxODBdXG4gICAgICAgIHJldHVybiA2NDtcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIC8vIC0gU0hBMjI0IFtGSVBTMTgwXVxuICAgICAgICByZXR1cm4gMjg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGFzaCBhbGdvcml0aG0uJyk7XG4gICAgfVxuICB9XG59O1xuXG59LHtcIi4uLy4uL3V0aWxcIjozOTgsXCIuL21kNVwiOjMzOSxcImFzbWNyeXB0by5qcy9zcmMvaGFzaC9zaGEyNTYvZXhwb3J0c1wiOjE2LFwiaGFzaC5qcy9saWIvaGFzaC9yaXBlbWRcIjoyODcsXCJoYXNoLmpzL2xpYi9oYXNoL3NoYS8yMjRcIjoyOTAsXCJoYXNoLmpzL2xpYi9oYXNoL3NoYS8zODRcIjoyOTIsXCJoYXNoLmpzL2xpYi9oYXNoL3NoYS81MTJcIjoyOTMsXCJydXNoYVwiOjMyMH1dLDMzOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uLy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vLyBNRDUgRGlnZXN0XG5mdW5jdGlvbiBtZDUoZW50cmVlKSB7XG4gIHZhciBkaWdlc3QgPSBtZDUxKF91dGlsMi5kZWZhdWx0LlVpbnQ4QXJyYXlfdG9fc3RyKGVudHJlZSkpO1xuICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuaGV4X3RvX1VpbnQ4QXJyYXkoaGV4KGRpZ2VzdCkpO1xufSAvKipcbiAgICogQSBmYXN0IE1ENSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uXG4gICAqIENvcHlyaWdodCAoYykgMjAxMiBKb3NlcGggTXllcnNcbiAgICogaHR0cDovL3d3dy5teWVyc2RhaWx5Lm9yZy9qb3NlcGgvamF2YXNjcmlwdC9tZDUtdGV4dC5odG1sXG4gICAqXG4gICAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmVcbiAgICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZXMgYW5kIHdpdGhvdXRcbiAgICogZmVlIGlzIGhlcmVieSBncmFudGVkIHByb3ZpZGVkIHRoYXQgdGhpcyBjb3B5cmlnaHQgbm90aWNlXG4gICAqIGFwcGVhcnMgaW4gYWxsIGNvcGllcy5cbiAgICpcbiAgICogT2YgY291cnNlLCB0aGlzIHNvZnQgaXMgcHJvdmlkZWQgXCJhcyBpc1wiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkXG4gICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLlxuICAgKi9cblxuLyoqXG4gKiBAcmVxdWlyZXMgdXRpbFxuICovXG5cbmZ1bmN0aW9uIG1kNWN5Y2xlKHgsIGspIHtcbiAgdmFyIGEgPSB4WzBdO1xuICB2YXIgYiA9IHhbMV07XG4gIHZhciBjID0geFsyXTtcbiAgdmFyIGQgPSB4WzNdO1xuXG4gIGEgPSBmZihhLCBiLCBjLCBkLCBrWzBdLCA3LCAtNjgwODc2OTM2KTtcbiAgZCA9IGZmKGQsIGEsIGIsIGMsIGtbMV0sIDEyLCAtMzg5NTY0NTg2KTtcbiAgYyA9IGZmKGMsIGQsIGEsIGIsIGtbMl0sIDE3LCA2MDYxMDU4MTkpO1xuICBiID0gZmYoYiwgYywgZCwgYSwga1szXSwgMjIsIC0xMDQ0NTI1MzMwKTtcbiAgYSA9IGZmKGEsIGIsIGMsIGQsIGtbNF0sIDcsIC0xNzY0MTg4OTcpO1xuICBkID0gZmYoZCwgYSwgYiwgYywga1s1XSwgMTIsIDEyMDAwODA0MjYpO1xuICBjID0gZmYoYywgZCwgYSwgYiwga1s2XSwgMTcsIC0xNDczMjMxMzQxKTtcbiAgYiA9IGZmKGIsIGMsIGQsIGEsIGtbN10sIDIyLCAtNDU3MDU5ODMpO1xuICBhID0gZmYoYSwgYiwgYywgZCwga1s4XSwgNywgMTc3MDAzNTQxNik7XG4gIGQgPSBmZihkLCBhLCBiLCBjLCBrWzldLCAxMiwgLTE5NTg0MTQ0MTcpO1xuICBjID0gZmYoYywgZCwgYSwgYiwga1sxMF0sIDE3LCAtNDIwNjMpO1xuICBiID0gZmYoYiwgYywgZCwgYSwga1sxMV0sIDIyLCAtMTk5MDQwNDE2Mik7XG4gIGEgPSBmZihhLCBiLCBjLCBkLCBrWzEyXSwgNywgMTgwNDYwMzY4Mik7XG4gIGQgPSBmZihkLCBhLCBiLCBjLCBrWzEzXSwgMTIsIC00MDM0MTEwMSk7XG4gIGMgPSBmZihjLCBkLCBhLCBiLCBrWzE0XSwgMTcsIC0xNTAyMDAyMjkwKTtcbiAgYiA9IGZmKGIsIGMsIGQsIGEsIGtbMTVdLCAyMiwgMTIzNjUzNTMyOSk7XG5cbiAgYSA9IGdnKGEsIGIsIGMsIGQsIGtbMV0sIDUsIC0xNjU3OTY1MTApO1xuICBkID0gZ2coZCwgYSwgYiwgYywga1s2XSwgOSwgLTEwNjk1MDE2MzIpO1xuICBjID0gZ2coYywgZCwgYSwgYiwga1sxMV0sIDE0LCA2NDM3MTc3MTMpO1xuICBiID0gZ2coYiwgYywgZCwgYSwga1swXSwgMjAsIC0zNzM4OTczMDIpO1xuICBhID0gZ2coYSwgYiwgYywgZCwga1s1XSwgNSwgLTcwMTU1ODY5MSk7XG4gIGQgPSBnZyhkLCBhLCBiLCBjLCBrWzEwXSwgOSwgMzgwMTYwODMpO1xuICBjID0gZ2coYywgZCwgYSwgYiwga1sxNV0sIDE0LCAtNjYwNDc4MzM1KTtcbiAgYiA9IGdnKGIsIGMsIGQsIGEsIGtbNF0sIDIwLCAtNDA1NTM3ODQ4KTtcbiAgYSA9IGdnKGEsIGIsIGMsIGQsIGtbOV0sIDUsIDU2ODQ0NjQzOCk7XG4gIGQgPSBnZyhkLCBhLCBiLCBjLCBrWzE0XSwgOSwgLTEwMTk4MDM2OTApO1xuICBjID0gZ2coYywgZCwgYSwgYiwga1szXSwgMTQsIC0xODczNjM5NjEpO1xuICBiID0gZ2coYiwgYywgZCwgYSwga1s4XSwgMjAsIDExNjM1MzE1MDEpO1xuICBhID0gZ2coYSwgYiwgYywgZCwga1sxM10sIDUsIC0xNDQ0NjgxNDY3KTtcbiAgZCA9IGdnKGQsIGEsIGIsIGMsIGtbMl0sIDksIC01MTQwMzc4NCk7XG4gIGMgPSBnZyhjLCBkLCBhLCBiLCBrWzddLCAxNCwgMTczNTMyODQ3Myk7XG4gIGIgPSBnZyhiLCBjLCBkLCBhLCBrWzEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcblxuICBhID0gaGgoYSwgYiwgYywgZCwga1s1XSwgNCwgLTM3ODU1OCk7XG4gIGQgPSBoaChkLCBhLCBiLCBjLCBrWzhdLCAxMSwgLTIwMjI1NzQ0NjMpO1xuICBjID0gaGgoYywgZCwgYSwgYiwga1sxMV0sIDE2LCAxODM5MDMwNTYyKTtcbiAgYiA9IGhoKGIsIGMsIGQsIGEsIGtbMTRdLCAyMywgLTM1MzA5NTU2KTtcbiAgYSA9IGhoKGEsIGIsIGMsIGQsIGtbMV0sIDQsIC0xNTMwOTkyMDYwKTtcbiAgZCA9IGhoKGQsIGEsIGIsIGMsIGtbNF0sIDExLCAxMjcyODkzMzUzKTtcbiAgYyA9IGhoKGMsIGQsIGEsIGIsIGtbN10sIDE2LCAtMTU1NDk3NjMyKTtcbiAgYiA9IGhoKGIsIGMsIGQsIGEsIGtbMTBdLCAyMywgLTEwOTQ3MzA2NDApO1xuICBhID0gaGgoYSwgYiwgYywgZCwga1sxM10sIDQsIDY4MTI3OTE3NCk7XG4gIGQgPSBoaChkLCBhLCBiLCBjLCBrWzBdLCAxMSwgLTM1ODUzNzIyMik7XG4gIGMgPSBoaChjLCBkLCBhLCBiLCBrWzNdLCAxNiwgLTcyMjUyMTk3OSk7XG4gIGIgPSBoaChiLCBjLCBkLCBhLCBrWzZdLCAyMywgNzYwMjkxODkpO1xuICBhID0gaGgoYSwgYiwgYywgZCwga1s5XSwgNCwgLTY0MDM2NDQ4Nyk7XG4gIGQgPSBoaChkLCBhLCBiLCBjLCBrWzEyXSwgMTEsIC00MjE4MTU4MzUpO1xuICBjID0gaGgoYywgZCwgYSwgYiwga1sxNV0sIDE2LCA1MzA3NDI1MjApO1xuICBiID0gaGgoYiwgYywgZCwgYSwga1syXSwgMjMsIC05OTUzMzg2NTEpO1xuXG4gIGEgPSBpaShhLCBiLCBjLCBkLCBrWzBdLCA2LCAtMTk4NjMwODQ0KTtcbiAgZCA9IGlpKGQsIGEsIGIsIGMsIGtbN10sIDEwLCAxMTI2ODkxNDE1KTtcbiAgYyA9IGlpKGMsIGQsIGEsIGIsIGtbMTRdLCAxNSwgLTE0MTYzNTQ5MDUpO1xuICBiID0gaWkoYiwgYywgZCwgYSwga1s1XSwgMjEsIC01NzQzNDA1NSk7XG4gIGEgPSBpaShhLCBiLCBjLCBkLCBrWzEyXSwgNiwgMTcwMDQ4NTU3MSk7XG4gIGQgPSBpaShkLCBhLCBiLCBjLCBrWzNdLCAxMCwgLTE4OTQ5ODY2MDYpO1xuICBjID0gaWkoYywgZCwgYSwgYiwga1sxMF0sIDE1LCAtMTA1MTUyMyk7XG4gIGIgPSBpaShiLCBjLCBkLCBhLCBrWzFdLCAyMSwgLTIwNTQ5MjI3OTkpO1xuICBhID0gaWkoYSwgYiwgYywgZCwga1s4XSwgNiwgMTg3MzMxMzM1OSk7XG4gIGQgPSBpaShkLCBhLCBiLCBjLCBrWzE1XSwgMTAsIC0zMDYxMTc0NCk7XG4gIGMgPSBpaShjLCBkLCBhLCBiLCBrWzZdLCAxNSwgLTE1NjAxOTgzODApO1xuICBiID0gaWkoYiwgYywgZCwgYSwga1sxM10sIDIxLCAxMzA5MTUxNjQ5KTtcbiAgYSA9IGlpKGEsIGIsIGMsIGQsIGtbNF0sIDYsIC0xNDU1MjMwNzApO1xuICBkID0gaWkoZCwgYSwgYiwgYywga1sxMV0sIDEwLCAtMTEyMDIxMDM3OSk7XG4gIGMgPSBpaShjLCBkLCBhLCBiLCBrWzJdLCAxNSwgNzE4Nzg3MjU5KTtcbiAgYiA9IGlpKGIsIGMsIGQsIGEsIGtbOV0sIDIxLCAtMzQzNDg1NTUxKTtcblxuICB4WzBdID0gYWRkMzIoYSwgeFswXSk7XG4gIHhbMV0gPSBhZGQzMihiLCB4WzFdKTtcbiAgeFsyXSA9IGFkZDMyKGMsIHhbMl0pO1xuICB4WzNdID0gYWRkMzIoZCwgeFszXSk7XG59XG5cbmZ1bmN0aW9uIGNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG4gIGEgPSBhZGQzMihhZGQzMihhLCBxKSwgYWRkMzIoeCwgdCkpO1xuICByZXR1cm4gYWRkMzIoYSA8PCBzIHwgYSA+Pj4gMzIgLSBzLCBiKTtcbn1cblxuZnVuY3Rpb24gZmYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gY21uKGIgJiBjIHwgfmIgJiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gZ2coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gY21uKGIgJiBkIHwgYyAmIH5kLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gaGgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gY21uKGIgXiBjIF4gZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIGlpKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIGNtbihjIF4gKGIgfCB+ZCksIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDUxKHMpIHtcbiAgdmFyIG4gPSBzLmxlbmd0aDtcbiAgdmFyIHN0YXRlID0gWzE3MzI1ODQxOTMsIC0yNzE3MzM4NzksIC0xNzMyNTg0MTk0LCAyNzE3MzM4NzhdO1xuICB2YXIgaSA9IHZvaWQgMDtcbiAgZm9yIChpID0gNjQ7IGkgPD0gcy5sZW5ndGg7IGkgKz0gNjQpIHtcbiAgICBtZDVjeWNsZShzdGF0ZSwgbWQ1YmxrKHMuc3Vic3RyaW5nKGkgLSA2NCwgaSkpKTtcbiAgfVxuICBzID0gcy5zdWJzdHJpbmcoaSAtIDY0KTtcbiAgdmFyIHRhaWwgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG4gIGZvciAoaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGFpbFtpID4+IDJdIHw9IHMuY2hhckNvZGVBdChpKSA8PCAoaSAlIDQgPDwgMyk7XG4gIH1cbiAgdGFpbFtpID4+IDJdIHw9IDB4ODAgPDwgKGkgJSA0IDw8IDMpO1xuICBpZiAoaSA+IDU1KSB7XG4gICAgbWQ1Y3ljbGUoc3RhdGUsIHRhaWwpO1xuICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICB0YWlsW2ldID0gMDtcbiAgICB9XG4gIH1cbiAgdGFpbFsxNF0gPSBuICogODtcbiAgbWQ1Y3ljbGUoc3RhdGUsIHRhaWwpO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qIHRoZXJlIG5lZWRzIHRvIGJlIHN1cHBvcnQgZm9yIFVuaWNvZGUgaGVyZSxcbiAqIHVubGVzcyB3ZSBwcmV0ZW5kIHRoYXQgd2UgY2FuIHJlZGVmaW5lIHRoZSBNRC01XG4gKiBhbGdvcml0aG0gZm9yIG11bHRpLWJ5dGUgY2hhcmFjdGVycyAocGVyaGFwc1xuICogYnkgYWRkaW5nIGV2ZXJ5IGZvdXIgMTYtYml0IGNoYXJhY3RlcnMgYW5kXG4gKiBzaG9ydGVuaW5nIHRoZSBzdW0gdG8gMzIgYml0cykuIE90aGVyd2lzZVxuICogSSBzdWdnZXN0IHBlcmZvcm1pbmcgTUQtNSBhcyBpZiBldmVyeSBjaGFyYWN0ZXJcbiAqIHdhcyB0d28gYnl0ZXMtLWUuZy4sIDAwNDAgMDAyNSA9IEAlLS1idXQgdGhlblxuICogaG93IHdpbGwgYW4gb3JkaW5hcnkgTUQtNSBzdW0gYmUgbWF0Y2hlZD9cbiAqIFRoZXJlIGlzIG5vIHdheSB0byBzdGFuZGFyZGl6ZSB0ZXh0IHRvIHNvbWV0aGluZ1xuICogbGlrZSBVVEYtOCBiZWZvcmUgdHJhbnNmb3JtYXRpb247IHNwZWVkIGNvc3QgaXNcbiAqIHV0dGVybHkgcHJvaGliaXRpdmUuIFRoZSBKYXZhU2NyaXB0IHN0YW5kYXJkXG4gKiBpdHNlbGYgbmVlZHMgdG8gbG9vayBhdCB0aGlzOiBpdCBzaG91bGQgc3RhcnRcbiAqIHByb3ZpZGluZyBhY2Nlc3MgdG8gc3RyaW5ncyBhcyBwcmVmb3JtZWQgVVRGLThcbiAqIDgtYml0IHVuc2lnbmVkIHZhbHVlIGFycmF5cy5cbiAqL1xuZnVuY3Rpb24gbWQ1YmxrKHMpIHtcbiAgLyogSSBmaWd1cmVkIGdsb2JhbCB3YXMgZmFzdGVyLiAgICovXG4gIHZhciBtZDVibGtzID0gW107XG4gIHZhciBpID0gdm9pZCAwOyAvKiBBbmR5IEtpbmcgc2FpZCBkbyBpdCB0aGlzIHdheS4gKi9cbiAgZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDQpIHtcbiAgICBtZDVibGtzW2kgPj4gMl0gPSBzLmNoYXJDb2RlQXQoaSkgKyAocy5jaGFyQ29kZUF0KGkgKyAxKSA8PCA4KSArIChzLmNoYXJDb2RlQXQoaSArIDIpIDw8IDE2KSArIChzLmNoYXJDb2RlQXQoaSArIDMpIDw8IDI0KTtcbiAgfVxuICByZXR1cm4gbWQ1Ymxrcztcbn1cblxudmFyIGhleF9jaHIgPSAnMDEyMzQ1Njc4OWFiY2RlZicuc3BsaXQoJycpO1xuXG5mdW5jdGlvbiByaGV4KG4pIHtcbiAgdmFyIHMgPSAnJztcbiAgdmFyIGogPSAwO1xuICBmb3IgKDsgaiA8IDQ7IGorKykge1xuICAgIHMgKz0gaGV4X2NocltuID4+IGogKiA4ICsgNCAmIDB4MEZdICsgaGV4X2NocltuID4+IGogKiA4ICYgMHgwRl07XG4gIH1cbiAgcmV0dXJuIHM7XG59XG5cbmZ1bmN0aW9uIGhleCh4KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgIHhbaV0gPSByaGV4KHhbaV0pO1xuICB9XG4gIHJldHVybiB4LmpvaW4oJycpO1xufVxuXG4vKiB0aGlzIGZ1bmN0aW9uIGlzIG11Y2ggZmFzdGVyLFxuc28gaWYgcG9zc2libGUgd2UgdXNlIGl0LiBTb21lIElFc1xuYXJlIHRoZSBvbmx5IG9uZXMgSSBrbm93IG9mIHRoYXRcbm5lZWQgdGhlIGlkaW90aWMgc2Vjb25kIGZ1bmN0aW9uLFxuZ2VuZXJhdGVkIGJ5IGFuIGlmIGNsYXVzZS4gICovXG5cbmZ1bmN0aW9uIGFkZDMyKGEsIGIpIHtcbiAgcmV0dXJuIGEgKyBiICYgMHhGRkZGRkZGRjtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gbWQ1O1xuXG59LHtcIi4uLy4uL3V0aWxcIjozOTh9XSwzNDA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2Fzc2lnbiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduJyk7XG5cbnZhciBfYXNzaWduMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Fzc2lnbik7XG5cbnZhciBfY2lwaGVyID0gX2RlcmVxXygnLi9jaXBoZXInKTtcblxudmFyIF9jaXBoZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2lwaGVyKTtcblxudmFyIF9oYXNoID0gX2RlcmVxXygnLi9oYXNoJyk7XG5cbnZhciBfaGFzaDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYXNoKTtcblxudmFyIF9jZmIgPSBfZGVyZXFfKCcuL2NmYicpO1xuXG52YXIgX2NmYjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jZmIpO1xuXG52YXIgX2djbSA9IF9kZXJlcV8oJy4vZ2NtJyk7XG5cbnZhciBfZ2NtMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2djbSk7XG5cbnZhciBfZWF4ID0gX2RlcmVxXygnLi9lYXgnKTtcblxudmFyIF9lYXgyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWF4KTtcblxudmFyIF9vY2IgPSBfZGVyZXFfKCcuL29jYicpO1xuXG52YXIgX29jYjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vY2IpO1xuXG52YXIgX3B1YmxpY19rZXkgPSBfZGVyZXFfKCcuL3B1YmxpY19rZXknKTtcblxudmFyIF9wdWJsaWNfa2V5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3B1YmxpY19rZXkpO1xuXG52YXIgX3NpZ25hdHVyZSA9IF9kZXJlcV8oJy4vc2lnbmF0dXJlJyk7XG5cbnZhciBfc2lnbmF0dXJlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NpZ25hdHVyZSk7XG5cbnZhciBfcmFuZG9tID0gX2RlcmVxXygnLi9yYW5kb20nKTtcblxudmFyIF9yYW5kb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmFuZG9tKTtcblxudmFyIF9wa2NzID0gX2RlcmVxXygnLi9wa2NzMScpO1xuXG52YXIgX3BrY3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGtjcyk7XG5cbnZhciBfcGtjczMgPSBfZGVyZXFfKCcuL3BrY3M1Jyk7XG5cbnZhciBfcGtjczQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wa2NzMyk7XG5cbnZhciBfY3J5cHRvID0gX2RlcmVxXygnLi9jcnlwdG8nKTtcblxudmFyIF9jcnlwdG8yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3J5cHRvKTtcblxudmFyIF9hZXNfa3cgPSBfZGVyZXFfKCcuL2Flc19rdycpO1xuXG52YXIgX2Flc19rdzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hZXNfa3cpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vLyBUT0RPIG1vdmUgY2ZiIGFuZCBnY20gdG8gY2lwaGVyXG52YXIgbW9kID0ge1xuICAvKiogQHNlZSBtb2R1bGU6Y3J5cHRvL2NpcGhlciAqL1xuICBjaXBoZXI6IF9jaXBoZXIyLmRlZmF1bHQsXG4gIC8qKiBAc2VlIG1vZHVsZTpjcnlwdG8vaGFzaCAqL1xuICBoYXNoOiBfaGFzaDIuZGVmYXVsdCxcbiAgLyoqIEBzZWUgbW9kdWxlOmNyeXB0by9jZmIgKi9cbiAgY2ZiOiBfY2ZiMi5kZWZhdWx0LFxuICAvKiogQHNlZSBtb2R1bGU6Y3J5cHRvL2djbSAqL1xuICBnY206IF9nY20yLmRlZmF1bHQsXG4gIGV4cGVyaW1lbnRhbF9nY206IF9nY20yLmRlZmF1bHQsXG4gIC8qKiBAc2VlIG1vZHVsZTpjcnlwdG8vZWF4ICovXG4gIGVheDogX2VheDIuZGVmYXVsdCxcbiAgLyoqIEBzZWUgbW9kdWxlOmNyeXB0by9vY2IgKi9cbiAgb2NiOiBfb2NiMi5kZWZhdWx0LFxuICAvKiogQHNlZSBtb2R1bGU6Y3J5cHRvL3B1YmxpY19rZXkgKi9cbiAgcHVibGljS2V5OiBfcHVibGljX2tleTIuZGVmYXVsdCxcbiAgLyoqIEBzZWUgbW9kdWxlOmNyeXB0by9zaWduYXR1cmUgKi9cbiAgc2lnbmF0dXJlOiBfc2lnbmF0dXJlMi5kZWZhdWx0LFxuICAvKiogQHNlZSBtb2R1bGU6Y3J5cHRvL3JhbmRvbSAqL1xuICByYW5kb206IF9yYW5kb20yLmRlZmF1bHQsXG4gIC8qKiBAc2VlIG1vZHVsZTpjcnlwdG8vcGtjczEgKi9cbiAgcGtjczE6IF9wa2NzMi5kZWZhdWx0LFxuICAvKiogQHNlZSBtb2R1bGU6Y3J5cHRvL3BrY3M1ICovXG4gIHBrY3M1OiBfcGtjczQuZGVmYXVsdCxcbiAgLyoqIEBzZWUgbW9kdWxlOmNyeXB0by9hZXNfa3cgKi9cbiAgYWVzX2t3OiBfYWVzX2t3Mi5kZWZhdWx0XG59OyAvKipcbiAgICAqIEBmaWxlb3ZlcnZpZXcgUHJvdmlkZXMgYWNjZXNzIHRvIGFsbCBjcnlwdG9ncmFwaGljIHByaW1pdGl2ZXMgdXNlZCBpbiBPcGVuUEdQLmpzXG4gICAgKiBAc2VlIG1vZHVsZTpjcnlwdG8vY3J5cHRvXG4gICAgKiBAc2VlIG1vZHVsZTpjcnlwdG8vc2lnbmF0dXJlXG4gICAgKiBAc2VlIG1vZHVsZTpjcnlwdG8vcHVibGljX2tleVxuICAgICogQHNlZSBtb2R1bGU6Y3J5cHRvL2NpcGhlclxuICAgICogQHNlZSBtb2R1bGU6Y3J5cHRvL3JhbmRvbVxuICAgICogQHNlZSBtb2R1bGU6Y3J5cHRvL2hhc2hcbiAgICAqIEBtb2R1bGUgY3J5cHRvXG4gICAgKi9cblxuKDAsIF9hc3NpZ24yLmRlZmF1bHQpKG1vZCwgX2NyeXB0bzIuZGVmYXVsdCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IG1vZDtcblxufSx7XCIuL2Flc19rd1wiOjMyNixcIi4vY2ZiXCI6MzI3LFwiLi9jaXBoZXJcIjozMzIsXCIuL2NyeXB0b1wiOjMzNSxcIi4vZWF4XCI6MzM2LFwiLi9nY21cIjozMzcsXCIuL2hhc2hcIjozMzgsXCIuL29jYlwiOjM0MSxcIi4vcGtjczFcIjozNDIsXCIuL3BrY3M1XCI6MzQzLFwiLi9wdWJsaWNfa2V5XCI6MzUyLFwiLi9yYW5kb21cIjozNTUsXCIuL3NpZ25hdHVyZVwiOjM1NixcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduXCI6MjR9XSwzNDE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvcicpO1xuXG52YXIgX3JlZ2VuZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZ2VuZXJhdG9yKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJyk7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3luY1RvR2VuZXJhdG9yMik7XG5cbi8qKlxuICogQ2xhc3MgdG8gZW4vZGVjcnlwdCB1c2luZyBPQ0IgbW9kZS5cbiAqIEBwYXJhbSAge1N0cmluZ30gICAgIGNpcGhlciAgICAgIFRoZSBzeW1tZXRyaWMgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UgZS5nLiAnYWVzMTI4J1xuICogQHBhcmFtICB7VWludDhBcnJheX0ga2V5ICAgICAgICAgVGhlIGVuY3J5cHRpb24ga2V5XG4gKi9cbnZhciBPQ0IgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKGNpcGhlciwga2V5KSB7XG4gICAgdmFyIG1heE50eiwgZW5jaXBoZXIsIGRlY2lwaGVyLCBtYXNrLCBjb25zdHJ1Y3RLZXlWYXJpYWJsZXMsIGV4dGVuZEtleVZhcmlhYmxlcywgaGFzaCwgY3J5cHQ7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGNyeXB0ID0gZnVuY3Rpb24gY3J5cHQoZm4sIHRleHQsIG5vbmNlLCBhZGF0YSkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBDb25zaWRlciBQIGFzIGEgc2VxdWVuY2Ugb2YgMTI4LWJpdCBibG9ja3NcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgdmFyIG0gPSB0ZXh0Lmxlbmd0aCAvIGJsb2NrTGVuZ3RoIHwgMDtcblxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBLZXktZGVwZW5kZW50IHZhcmlhYmxlc1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBleHRlbmRLZXlWYXJpYWJsZXModGV4dCwgYWRhdGEpO1xuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIE5vbmNlLWRlcGVuZGVudCBhbmQgcGVyLWVuY3J5cHRpb24gdmFyaWFibGVzXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vICAgIE5vbmNlID0gbnVtMnN0cihUQUdMRU4gbW9kIDEyOCw3KSB8fCB6ZXJvcygxMjAtYml0bGVuKE4pKSB8fCAxIHx8IE5cbiAgICAgICAgICAgICAgLy8gTm90ZTogV2UgYXNzdW1lIGhlcmUgdGhhdCB0YWdMZW5ndGggbW9kIDE2ID09IDAuXG4gICAgICAgICAgICAgIHZhciBwYWRkZWROb25jZSA9IF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW3plcm9CbG9jay5zdWJhcnJheSgwLCBpdkxlbmd0aCAtIG5vbmNlLmxlbmd0aCksIG9uZSwgbm9uY2VdKTtcbiAgICAgICAgICAgICAgLy8gICAgYm90dG9tID0gc3RyMm51bShOb25jZVsxMjMuLjEyOF0pXG4gICAgICAgICAgICAgIHZhciBib3R0b20gPSBwYWRkZWROb25jZVtibG9ja0xlbmd0aCAtIDFdICYgNjM7XG4gICAgICAgICAgICAgIC8vICAgIEt0b3AgPSBFTkNJUEhFUihLLCBOb25jZVsxLi4xMjJdIHx8IHplcm9zKDYpKVxuICAgICAgICAgICAgICBwYWRkZWROb25jZVtibG9ja0xlbmd0aCAtIDFdICY9IDE5MjtcbiAgICAgICAgICAgICAgdmFyIGtUb3AgPSBlbmNpcGhlcihwYWRkZWROb25jZSk7XG4gICAgICAgICAgICAgIC8vICAgIFN0cmV0Y2ggPSBLdG9wIHx8IChLdG9wWzEuLjY0XSB4b3IgS3RvcFs5Li43Ml0pXG4gICAgICAgICAgICAgIHZhciBzdHJldGNoZWQgPSBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFtrVG9wLCB4b3Ioa1RvcC5zdWJhcnJheSgwLCA4KSwga1RvcC5zdWJhcnJheSgxLCA5KSldKTtcbiAgICAgICAgICAgICAgLy8gICAgT2Zmc2V0XzAgPSBTdHJldGNoWzErYm90dG9tLi4xMjgrYm90dG9tXVxuICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gX3V0aWwyLmRlZmF1bHQuc2hpZnRSaWdodChzdHJldGNoZWQuc3ViYXJyYXkoMCArIChib3R0b20gPj4gMyksIDE3ICsgKGJvdHRvbSA+PiAzKSksIDggLSAoYm90dG9tICYgNykpLnN1YmFycmF5KDEpO1xuICAgICAgICAgICAgICAvLyAgICBDaGVja3N1bV8wID0gemVyb3MoMTI4KVxuICAgICAgICAgICAgICB2YXIgY2hlY2tzdW0gPSBuZXcgVWludDhBcnJheShibG9ja0xlbmd0aCk7XG5cbiAgICAgICAgICAgICAgdmFyIGN0ID0gbmV3IFVpbnQ4QXJyYXkodGV4dC5sZW5ndGggKyB0YWdMZW5ndGgpO1xuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFByb2Nlc3MgYW55IHdob2xlIGJsb2Nrc1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICB2YXIgaSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgdmFyIHBvcyA9IDA7XG4gICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBPZmZzZXRfaSA9IE9mZnNldF97aS0xfSB4b3IgTF97bnR6KGkpfVxuICAgICAgICAgICAgICAgIHhvck11dChvZmZzZXQsIG1hc2tbbnR6KGkgKyAxKV0pO1xuICAgICAgICAgICAgICAgIC8vIENfaSA9IE9mZnNldF9pIHhvciBFTkNJUEhFUihLLCBQX2kgeG9yIE9mZnNldF9pKVxuICAgICAgICAgICAgICAgIC8vIFBfaSA9IE9mZnNldF9pIHhvciBERUNJUEhFUihLLCBDX2kgeG9yIE9mZnNldF9pKVxuICAgICAgICAgICAgICAgIGN0LnNldCh4b3JNdXQoZm4oeG9yKG9mZnNldCwgdGV4dCkpLCBvZmZzZXQpLCBwb3MpO1xuICAgICAgICAgICAgICAgIC8vIENoZWNrc3VtX2kgPSBDaGVja3N1bV97aS0xfSB4b3IgUF9pXG4gICAgICAgICAgICAgICAgeG9yTXV0KGNoZWNrc3VtLCBmbiA9PT0gZW5jaXBoZXIgPyB0ZXh0IDogY3Quc3ViYXJyYXkocG9zKSk7XG5cbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJhcnJheShibG9ja0xlbmd0aCk7XG4gICAgICAgICAgICAgICAgcG9zICs9IGJsb2NrTGVuZ3RoO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gUHJvY2VzcyBhbnkgZmluYWwgcGFydGlhbCBibG9jayBhbmQgY29tcHV0ZSByYXcgdGFnXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIE9mZnNldF8qID0gT2Zmc2V0X20geG9yIExfKlxuICAgICAgICAgICAgICAgIHhvck11dChvZmZzZXQsIG1hc2sueCk7XG4gICAgICAgICAgICAgICAgLy8gUGFkID0gRU5DSVBIRVIoSywgT2Zmc2V0XyopXG4gICAgICAgICAgICAgICAgdmFyIHBhZGRpbmcgPSBlbmNpcGhlcihvZmZzZXQpO1xuICAgICAgICAgICAgICAgIC8vIENfKiA9IFBfKiB4b3IgUGFkWzEuLmJpdGxlbihQXyopXVxuICAgICAgICAgICAgICAgIGN0LnNldCh4b3IodGV4dCwgcGFkZGluZyksIHBvcyk7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVja3N1bV8qID0gQ2hlY2tzdW1fbSB4b3IgKFBfKiB8fCAxIHx8IG5ldyBVaW50OEFycmF5KDEyNy1iaXRsZW4oUF8qKSkpXG4gICAgICAgICAgICAgICAgdmFyIHhvcklucHV0ID0gbmV3IFVpbnQ4QXJyYXkoYmxvY2tMZW5ndGgpO1xuICAgICAgICAgICAgICAgIHhvcklucHV0LnNldChmbiA9PT0gZW5jaXBoZXIgPyB0ZXh0IDogY3Quc3ViYXJyYXkocG9zLCAtdGFnTGVuZ3RoKSwgMCk7XG4gICAgICAgICAgICAgICAgeG9ySW5wdXRbdGV4dC5sZW5ndGhdID0gMTI4O1xuICAgICAgICAgICAgICAgIHhvck11dChjaGVja3N1bSwgeG9ySW5wdXQpO1xuICAgICAgICAgICAgICAgIHBvcyArPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBUYWcgPSBFTkNJUEhFUihLLCBDaGVja3N1bV8qIHhvciBPZmZzZXRfKiB4b3IgTF8kKSB4b3IgSEFTSChLLEEpXG4gICAgICAgICAgICAgIHZhciB0YWcgPSB4b3JNdXQoZW5jaXBoZXIoeG9yTXV0KHhvck11dChjaGVja3N1bSwgb2Zmc2V0KSwgbWFzay4kKSksIGhhc2goYWRhdGEpKTtcblxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBBc3NlbWJsZSBjaXBoZXJ0ZXh0XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIEMgPSBDXzEgfHwgQ18yIHx8IC4uLiB8fCBDX20gfHwgQ18qIHx8IFRhZ1sxLi5UQUdMRU5dXG4gICAgICAgICAgICAgIGN0LnNldCh0YWcsIHBvcyk7XG4gICAgICAgICAgICAgIHJldHVybiBjdDtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGhhc2ggPSBmdW5jdGlvbiBoYXNoKGFkYXRhKSB7XG4gICAgICAgICAgICAgIGlmICghYWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gRmFzdCBwYXRoXG4gICAgICAgICAgICAgICAgcmV0dXJuIHplcm9CbG9jaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIENvbnNpZGVyIEEgYXMgYSBzZXF1ZW5jZSBvZiAxMjgtYml0IGJsb2Nrc1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICB2YXIgbSA9IGFkYXRhLmxlbmd0aCAvIGJsb2NrTGVuZ3RoIHwgMDtcblxuICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gbmV3IFVpbnQ4QXJyYXkoYmxvY2tMZW5ndGgpO1xuICAgICAgICAgICAgICB2YXIgc3VtID0gbmV3IFVpbnQ4QXJyYXkoYmxvY2tMZW5ndGgpO1xuICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG07IGkrKykge1xuICAgICAgICAgICAgICAgIHhvck11dChvZmZzZXQsIG1hc2tbbnR6KGkgKyAxKV0pO1xuICAgICAgICAgICAgICAgIHhvck11dChzdW0sIGVuY2lwaGVyKHhvcihvZmZzZXQsIGFkYXRhKSkpO1xuICAgICAgICAgICAgICAgIGFkYXRhID0gYWRhdGEuc3ViYXJyYXkoYmxvY2tMZW5ndGgpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gUHJvY2VzcyBhbnkgZmluYWwgcGFydGlhbCBibG9jazsgY29tcHV0ZSBmaW5hbCBoYXNoIHZhbHVlXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGlmIChhZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB4b3JNdXQob2Zmc2V0LCBtYXNrLngpO1xuXG4gICAgICAgICAgICAgICAgdmFyIGNpcGhlcklucHV0ID0gbmV3IFVpbnQ4QXJyYXkoYmxvY2tMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGNpcGhlcklucHV0LnNldChhZGF0YSwgMCk7XG4gICAgICAgICAgICAgICAgY2lwaGVySW5wdXRbYWRhdGEubGVuZ3RoXSA9IDEyODtcbiAgICAgICAgICAgICAgICB4b3JNdXQoY2lwaGVySW5wdXQsIG9mZnNldCk7XG5cbiAgICAgICAgICAgICAgICB4b3JNdXQoc3VtLCBlbmNpcGhlcihjaXBoZXJJbnB1dCkpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHN1bTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGV4dGVuZEtleVZhcmlhYmxlcyA9IGZ1bmN0aW9uIGV4dGVuZEtleVZhcmlhYmxlcyh0ZXh0LCBhZGF0YSkge1xuICAgICAgICAgICAgICB2YXIgbmV3TWF4TnR6ID0gX3V0aWwyLmRlZmF1bHQubmJpdHMoTWF0aC5tYXgodGV4dC5sZW5ndGgsIGFkYXRhLmxlbmd0aCkgLyBibG9ja0xlbmd0aCB8IDApIC0gMTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IG1heE50eiArIDE7IGkgPD0gbmV3TWF4TnR6OyBpKyspIHtcbiAgICAgICAgICAgICAgICBtYXNrW2ldID0gX3V0aWwyLmRlZmF1bHQuZG91YmxlKG1hc2tbaSAtIDFdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXhOdHogPSBuZXdNYXhOdHo7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdHJ1Y3RLZXlWYXJpYWJsZXMgPSBmdW5jdGlvbiBjb25zdHJ1Y3RLZXlWYXJpYWJsZXMoY2lwaGVyLCBrZXkpIHtcbiAgICAgICAgICAgICAgdmFyIGFlcyA9IG5ldyBfY2lwaGVyMi5kZWZhdWx0W2NpcGhlcl0oa2V5KTtcbiAgICAgICAgICAgICAgZW5jaXBoZXIgPSBhZXMuZW5jcnlwdC5iaW5kKGFlcyk7XG4gICAgICAgICAgICAgIGRlY2lwaGVyID0gYWVzLmRlY3J5cHQuYmluZChhZXMpO1xuXG4gICAgICAgICAgICAgIHZhciBtYXNrX3ggPSBlbmNpcGhlcih6ZXJvQmxvY2spO1xuICAgICAgICAgICAgICB2YXIgbWFza18kID0gX3V0aWwyLmRlZmF1bHQuZG91YmxlKG1hc2tfeCk7XG4gICAgICAgICAgICAgIG1hc2sgPSBbXTtcbiAgICAgICAgICAgICAgbWFza1swXSA9IF91dGlsMi5kZWZhdWx0LmRvdWJsZShtYXNrXyQpO1xuXG4gICAgICAgICAgICAgIG1hc2sueCA9IG1hc2tfeDtcbiAgICAgICAgICAgICAgbWFzay4kID0gbWFza18kO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbWF4TnR6ID0gMDtcbiAgICAgICAgICAgIGVuY2lwaGVyID0gdm9pZCAwO1xuICAgICAgICAgICAgZGVjaXBoZXIgPSB2b2lkIDA7XG4gICAgICAgICAgICBtYXNrID0gdm9pZCAwO1xuXG5cbiAgICAgICAgICAgIGNvbnN0cnVjdEtleVZhcmlhYmxlcyhjaXBoZXIsIGtleSk7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRW5jcnlwdC9kZWNyeXB0IGRhdGEuXG4gICAgICAgICAgICAgKiBAcGFyYW0gIHtlbmNpcGhlcnxkZWNpcGhlcn0gZm4gICBFbmNyeXB0aW9uL2RlY3J5cHRpb24gYmxvY2sgY2lwaGVyIGZ1bmN0aW9uXG4gICAgICAgICAgICAgKiBAcGFyYW0gIHtVaW50OEFycmF5fSB0ZXh0ICAgICAgICBUaGUgY2xlYXJ0ZXh0IG9yIGNpcGhlcnRleHQgKHdpdGhvdXQgdGFnKSBpbnB1dFxuICAgICAgICAgICAgICogQHBhcmFtICB7VWludDhBcnJheX0gbm9uY2UgICAgICAgVGhlIG5vbmNlICgxNSBieXRlcylcbiAgICAgICAgICAgICAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IGFkYXRhICAgICAgIEFzc29jaWF0ZWQgZGF0YSB0byBzaWduXG4gICAgICAgICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxVaW50OEFycmF5Pn0gICAgVGhlIGNpcGhlcnRleHQgb3IgcGxhaW50ZXh0IG91dHB1dCwgd2l0aCB0YWcgYXBwZW5kZWQgaW4gYm90aCBjYXNlc1xuICAgICAgICAgICAgICovXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgncmV0dXJuJywge1xuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogRW5jcnlwdCBwbGFpbnRleHQgaW5wdXQuXG4gICAgICAgICAgICAgICAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IHBsYWludGV4dCAgIFRoZSBjbGVhcnRleHQgaW5wdXQgdG8gYmUgZW5jcnlwdGVkXG4gICAgICAgICAgICAgICAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IG5vbmNlICAgICAgIFRoZSBub25jZSAoMTUgYnl0ZXMpXG4gICAgICAgICAgICAgICAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IGFkYXRhICAgICAgIEFzc29jaWF0ZWQgZGF0YSB0byBzaWduXG4gICAgICAgICAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSAgICBUaGUgY2lwaGVydGV4dCBvdXRwdXRcbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIGVuY3J5cHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3JlZjIgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZShwbGFpbnRleHQsIG5vbmNlLCBhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCBjcnlwdChlbmNpcGhlciwgcGxhaW50ZXh0LCBub25jZSwgYWRhdGEpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVuY3J5cHQoX3gzLCBfeDQsIF94NSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3J5cHQ7XG4gICAgICAgICAgICAgIH0oKSxcblxuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogRGVjcnlwdCBjaXBoZXJ0ZXh0IGlucHV0LlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gIHtVaW50OEFycmF5fSBjaXBoZXJ0ZXh0ICBUaGUgY2lwaGVydGV4dCBpbnB1dCB0byBiZSBkZWNyeXB0ZWRcbiAgICAgICAgICAgICAgICogQHBhcmFtICB7VWludDhBcnJheX0gbm9uY2UgICAgICAgVGhlIG5vbmNlICgxNSBieXRlcylcbiAgICAgICAgICAgICAgICogQHBhcmFtICB7VWludDhBcnJheX0gYWRhdGEgICAgICAgQXNzb2NpYXRlZCBkYXRhIHRvIHNpZ25cbiAgICAgICAgICAgICAgICogQHJldHVybnMge1Byb21pc2U8VWludDhBcnJheT59ICAgIFRoZSBjaXBoZXJ0ZXh0IG91dHB1dFxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgZGVjcnlwdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBfcmVmMyA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMihjaXBoZXJ0ZXh0LCBub25jZSwgYWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgIHZhciB0YWcsIGNyeXB0ZWQ7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShjaXBoZXJ0ZXh0Lmxlbmd0aCA8IHRhZ0xlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgT0NCIGNpcGhlcnRleHQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcgPSBjaXBoZXJ0ZXh0LnN1YmFycmF5KC10YWdMZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlcnRleHQgPSBjaXBoZXJ0ZXh0LnN1YmFycmF5KDAsIC10YWdMZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0ZWQgPSBjcnlwdChkZWNpcGhlciwgY2lwaGVydGV4dCwgbm9uY2UsIGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKFRhZ1sxLi5UQUdMRU5dID09IFQpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfdXRpbDIuZGVmYXVsdC5lcXVhbHNVaW50OEFycmF5KHRhZywgY3J5cHRlZC5zdWJhcnJheSgtdGFnTGVuZ3RoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywgY3J5cHRlZC5zdWJhcnJheSgwLCAtdGFnTGVuZ3RoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoZW50aWNhdGlvbiB0YWcgbWlzbWF0Y2gnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZGVjcnlwdChfeDYsIF94NywgX3g4KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVjcnlwdDtcbiAgICAgICAgICAgICAgfSgpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTMsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIE9DQihfeCwgX3gyKSB7XG4gICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBHZXQgT0NCIG5vbmNlIGFzIGRlZmluZWQgYnkge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1pZXRmLW9wZW5wZ3AtcmZjNDg4MGJpcy0wNCNzZWN0aW9uLTUuMTYuMnxSRkM0ODgwYmlzLTA0LCBzZWN0aW9uIDUuMTYuMn0uXG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSBpdiAgICAgICAgICAgVGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciAoMTUgYnl0ZXMpXG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSBjaHVua0luZGV4ICAgVGhlIGNodW5rIGluZGV4ICg4IGJ5dGVzKVxuICovXG5cblxudmFyIF9jaXBoZXIgPSBfZGVyZXFfKCcuL2NpcGhlcicpO1xuXG52YXIgX2NpcGhlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jaXBoZXIpO1xuXG52YXIgX3V0aWwgPSBfZGVyZXFfKCcuLi91dGlsJyk7XG5cbnZhciBfdXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLy8gT3BlblBHUC5qcyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDE4IFByb3RvblRlY2ggQUdcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBBRVMtT0NCIGVuL2RlY3J5cHRpb24uXG4gKiBAcmVxdWlyZXMgY3J5cHRvL2NpcGhlclxuICogQHJlcXVpcmVzIHV0aWxcbiAqIEBtb2R1bGUgY3J5cHRvL29jYlxuICovXG5cbnZhciBibG9ja0xlbmd0aCA9IDE2O1xudmFyIGl2TGVuZ3RoID0gMTU7XG5cbi8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1pZXRmLW9wZW5wZ3AtcmZjNDg4MGJpcy0wNCNzZWN0aW9uLTUuMTYuMjpcbi8vIFdoaWxlIE9DQiBbUkZDNzI1M10gYWxsb3dzIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcgbGVuZ3RoIHRvIGJlIG9mIGFueVxuLy8gbnVtYmVyIHVwIHRvIDEyOCBiaXRzIGxvbmcsIHRoaXMgZG9jdW1lbnQgcmVxdWlyZXMgYSBmaXhlZFxuLy8gYXV0aGVudGljYXRpb24gdGFnIGxlbmd0aCBvZiAxMjggYml0cyAoMTYgb2N0ZXRzKSBmb3Igc2ltcGxpY2l0eS5cbnZhciB0YWdMZW5ndGggPSAxNjtcblxuZnVuY3Rpb24gbnR6KG4pIHtcbiAgdmFyIG50eiA9IDA7XG4gIGZvciAodmFyIGkgPSAxOyAobiAmIGkpID09PSAwOyBpIDw8PSAxKSB7XG4gICAgbnR6Kys7XG4gIH1cbiAgcmV0dXJuIG50ejtcbn1cblxuZnVuY3Rpb24geG9yTXV0KFMsIFQpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBTLmxlbmd0aDsgaSsrKSB7XG4gICAgU1tpXSBePSBUW2ldO1xuICB9XG4gIHJldHVybiBTO1xufVxuXG5mdW5jdGlvbiB4b3IoUywgVCkge1xuICByZXR1cm4geG9yTXV0KFMuc2xpY2UoKSwgVCk7XG59XG5cbnZhciB6ZXJvQmxvY2sgPSBuZXcgVWludDhBcnJheShibG9ja0xlbmd0aCk7XG52YXIgb25lID0gbmV3IFVpbnQ4QXJyYXkoWzFdKTtPQ0IuZ2V0Tm9uY2UgPSBmdW5jdGlvbiAoaXYsIGNodW5rSW5kZXgpIHtcbiAgdmFyIG5vbmNlID0gaXYuc2xpY2UoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaHVua0luZGV4Lmxlbmd0aDsgaSsrKSB7XG4gICAgbm9uY2VbNyArIGldIF49IGNodW5rSW5kZXhbaV07XG4gIH1cbiAgcmV0dXJuIG5vbmNlO1xufTtcblxuT0NCLmJsb2NrTGVuZ3RoID0gYmxvY2tMZW5ndGg7XG5PQ0IuaXZMZW5ndGggPSBpdkxlbmd0aDtcbk9DQi50YWdMZW5ndGggPSB0YWdMZW5ndGg7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IE9DQjtcblxufSx7XCIuLi91dGlsXCI6Mzk4LFwiLi9jaXBoZXJcIjozMzIsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiOjM1LFwiYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvclwiOjQyfV0sMzQyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3InKTtcblxudmFyIF9yZWdlbmVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWdlbmVyYXRvcik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvcicpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXN5bmNUb0dlbmVyYXRvcjIpO1xuXG4vKipcbiAqIENyZWF0ZSBwYWRkaW5nIHdpdGggc2VjdXJlIHJhbmRvbSBkYXRhXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7SW50ZWdlcn0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgcGFkZGluZyBpbiBieXRlc1xuICogQHJldHVybnMge1N0cmluZ30gICAgICAgIFBhZGRpbmcgYXMgc3RyaW5nXG4gKiBAYXN5bmNcbiAqL1xudmFyIGdldFBrY3MxUGFkZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZShsZW5ndGgpIHtcbiAgICB2YXIgcmVzdWx0LCByYW5kb21CeXRlcywgaTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXN1bHQgPSAnJztcblxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGlmICghKHJlc3VsdC5sZW5ndGggPCBsZW5ndGgpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7XG4gICAgICAgICAgICByZXR1cm4gX3JhbmRvbTIuZGVmYXVsdC5nZXRSYW5kb21CeXRlcyhsZW5ndGggLSByZXN1bHQubGVuZ3RoKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHJhbmRvbUJ5dGVzID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhbmRvbUJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGlmIChyYW5kb21CeXRlc1tpXSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHJhbmRvbUJ5dGVzW2ldKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIHJlc3VsdCk7XG5cbiAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBnZXRQa2NzMVBhZGRpbmcoX3gpIHtcbiAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIENyZWF0ZSBhIEVNRS1QS0NTMS12MV81IHBhZGRlZCBtZXNzYWdlXG4gKiBAc2VlIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTEzLjEuMXxSRkMgNDg4MCAxMy4xLjF9XG4gKiBAcGFyYW0ge1N0cmluZ30gTSBtZXNzYWdlIHRvIGJlIGVuY29kZWRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gayB0aGUgbGVuZ3RoIGluIG9jdGV0cyBvZiB0aGUga2V5IG1vZHVsdXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmluZz59IEVNRS1QS0NTMSBwYWRkZWQgbWVzc2FnZVxuICogQGFzeW5jXG4gKi9cblxuXG52YXIgX3JhbmRvbSA9IF9kZXJlcV8oJy4vcmFuZG9tJyk7XG5cbnZhciBfcmFuZG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JhbmRvbSk7XG5cbnZhciBfaGFzaCA9IF9kZXJlcV8oJy4vaGFzaCcpO1xuXG52YXIgX2hhc2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFzaCk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKiogQG5hbWVzcGFjZSAqL1xudmFyIGVtZSA9IHt9O1xuLyoqIEBuYW1lc3BhY2UgKi9cbi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBQcm92aWRlcyBFTUUtUEtDUzEtdjFfNSBlbmNvZGluZyBhbmQgZGVjb2RpbmcgYW5kIEVNU0EtUEtDUzEtdjFfNSBlbmNvZGluZyBmdW5jdGlvblxuICogQHNlZSBtb2R1bGU6Y3J5cHRvL3B1YmxpY19rZXkvcnNhXG4gKiBAc2VlIG1vZHVsZTpjcnlwdG8vcHVibGljX2tleS9lbGxpcHRpYy9lY2RoXG4gKiBAc2VlIG1vZHVsZTpwYWNrZXQuUHVibGljS2V5RW5jcnlwdGVkU2Vzc2lvbktleVxuICogQHJlcXVpcmVzIGNyeXB0by9yYW5kb21cbiAqIEByZXF1aXJlcyBjcnlwdG8vaGFzaFxuICogQHJlcXVpcmVzIHV0aWxcbiAqIEBtb2R1bGUgY3J5cHRvL3BrY3MxXG4gKi9cblxudmFyIGVtc2EgPSB7fTtcblxuLyoqXG4gKiBBU04xIG9iamVjdCBpZGVudGlmaWVycyBmb3IgaGFzaGVzXG4gKiBAc2VlIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTUuMi4yfVxuICovXG52YXIgaGFzaF9oZWFkZXJzID0gW107XG5oYXNoX2hlYWRlcnNbMV0gPSBbMHgzMCwgMHgyMCwgMHgzMCwgMHgwYywgMHgwNiwgMHgwOCwgMHgyYSwgMHg4NiwgMHg0OCwgMHg4NiwgMHhmNywgMHgwZCwgMHgwMiwgMHgwNSwgMHgwNSwgMHgwMCwgMHgwNCwgMHgxMF07XG5oYXNoX2hlYWRlcnNbMl0gPSBbMHgzMCwgMHgyMSwgMHgzMCwgMHgwOSwgMHgwNiwgMHgwNSwgMHgyYiwgMHgwZSwgMHgwMywgMHgwMiwgMHgxYSwgMHgwNSwgMHgwMCwgMHgwNCwgMHgxNF07XG5oYXNoX2hlYWRlcnNbM10gPSBbMHgzMCwgMHgyMSwgMHgzMCwgMHgwOSwgMHgwNiwgMHgwNSwgMHgyQiwgMHgyNCwgMHgwMywgMHgwMiwgMHgwMSwgMHgwNSwgMHgwMCwgMHgwNCwgMHgxNF07XG5oYXNoX2hlYWRlcnNbOF0gPSBbMHgzMCwgMHgzMSwgMHgzMCwgMHgwZCwgMHgwNiwgMHgwOSwgMHg2MCwgMHg4NiwgMHg0OCwgMHgwMSwgMHg2NSwgMHgwMywgMHgwNCwgMHgwMiwgMHgwMSwgMHgwNSwgMHgwMCwgMHgwNCwgMHgyMF07XG5oYXNoX2hlYWRlcnNbOV0gPSBbMHgzMCwgMHg0MSwgMHgzMCwgMHgwZCwgMHgwNiwgMHgwOSwgMHg2MCwgMHg4NiwgMHg0OCwgMHgwMSwgMHg2NSwgMHgwMywgMHgwNCwgMHgwMiwgMHgwMiwgMHgwNSwgMHgwMCwgMHgwNCwgMHgzMF07XG5oYXNoX2hlYWRlcnNbMTBdID0gWzB4MzAsIDB4NTEsIDB4MzAsIDB4MGQsIDB4MDYsIDB4MDksIDB4NjAsIDB4ODYsIDB4NDgsIDB4MDEsIDB4NjUsIDB4MDMsIDB4MDQsIDB4MDIsIDB4MDMsIDB4MDUsIDB4MDAsIDB4MDQsIDB4NDBdO1xuaGFzaF9oZWFkZXJzWzExXSA9IFsweDMwLCAweDJkLCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDYwLCAweDg2LCAweDQ4LCAweDAxLCAweDY1LCAweDAzLCAweDA0LCAweDAyLCAweDA0LCAweDA1LCAweDAwLCAweDA0LCAweDFDXTtlbWUuZW5jb2RlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjIgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoTSwgaykge1xuICAgIHZhciBtTGVuLCBQUztcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgbUxlbiA9IE0ubGVuZ3RoO1xuICAgICAgICAgICAgLy8gbGVuZ3RoIGNoZWNraW5nXG5cbiAgICAgICAgICAgIGlmICghKG1MZW4gPiBrIC0gMTEpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSB0b28gbG9uZycpO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA1O1xuICAgICAgICAgICAgcmV0dXJuIGdldFBrY3MxUGFkZGluZyhrIC0gbUxlbiAtIDMpO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgUFMgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCdyZXR1cm4nLCBTdHJpbmcuZnJvbUNoYXJDb2RlKDApICsgU3RyaW5nLmZyb21DaGFyQ29kZSgyKSArIFBTICsgU3RyaW5nLmZyb21DaGFyQ29kZSgwKSArIE0pO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3gyLCBfeDMpIHtcbiAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBEZWNvZGUgYSBFTUUtUEtDUzEtdjFfNSBwYWRkZWQgbWVzc2FnZVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi0xMy4xLjJ8UkZDIDQ4ODAgMTMuMS4yfVxuICogQHBhcmFtIHtTdHJpbmd9IEVNIGVuY29kZWQgbWVzc2FnZSwgYW4gb2N0ZXQgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBtZXNzYWdlLCBhbiBvY3RldCBzdHJpbmdcbiAqL1xuZW1lLmRlY29kZSA9IGZ1bmN0aW9uIChFTSkge1xuICAvLyBsZWFkaW5nIHplcm9zIHRydW5jYXRlZCBieSBibi5qc1xuICBpZiAoRU0uY2hhckNvZGVBdCgwKSAhPT0gMCkge1xuICAgIEVNID0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKSArIEVNO1xuICB9XG4gIHZhciBmaXJzdE9jdCA9IEVNLmNoYXJDb2RlQXQoMCk7XG4gIHZhciBzZWNvbmRPY3QgPSBFTS5jaGFyQ29kZUF0KDEpO1xuICB2YXIgaSA9IDI7XG4gIHdoaWxlIChFTS5jaGFyQ29kZUF0KGkpICE9PSAwICYmIGkgPCBFTS5sZW5ndGgpIHtcbiAgICBpKys7XG4gIH1cbiAgdmFyIHBzTGVuID0gaSAtIDI7XG4gIHZhciBzZXBhcmF0b3IgPSBFTS5jaGFyQ29kZUF0KGkrKyk7XG4gIGlmIChmaXJzdE9jdCA9PT0gMCAmJiBzZWNvbmRPY3QgPT09IDIgJiYgcHNMZW4gPj0gOCAmJiBzZXBhcmF0b3IgPT09IDApIHtcbiAgICByZXR1cm4gRU0uc3Vic3RyKGkpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignRGVjcnlwdGlvbiBlcnJvcicpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBFTVNBLVBLQ1MxLXYxXzUgcGFkZGVkIG1lc3NhZ2VcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tMTMuMS4zfFJGQyA0ODgwIDEzLjEuM31cbiAqIEBwYXJhbSB7SW50ZWdlcn0gYWxnbyBIYXNoIGFsZ29yaXRobSB0eXBlIHVzZWRcbiAqIEBwYXJhbSB7U3RyaW5nfSBNIG1lc3NhZ2UgdG8gYmUgZW5jb2RlZFxuICogQHBhcmFtIHtJbnRlZ2VyfSBlbUxlbiBpbnRlbmRlZCBsZW5ndGggaW4gb2N0ZXRzIG9mIHRoZSBlbmNvZGVkIG1lc3NhZ2VcbiAqIEByZXR1cm5zIHtTdHJpbmd9IGVuY29kZWQgbWVzc2FnZVxuICovXG5lbXNhLmVuY29kZSA9IGZ1bmN0aW9uIChhbGdvLCBNLCBlbUxlbikge1xuICB2YXIgaSA9IHZvaWQgMDtcbiAgLy8gQXBwbHkgdGhlIGhhc2ggZnVuY3Rpb24gdG8gdGhlIG1lc3NhZ2UgTSB0byBwcm9kdWNlIGEgaGFzaCB2YWx1ZSBIXG4gIHZhciBIID0gX3V0aWwyLmRlZmF1bHQuVWludDhBcnJheV90b19zdHIoX2hhc2gyLmRlZmF1bHQuZGlnZXN0KGFsZ28sIF91dGlsMi5kZWZhdWx0LnN0cl90b19VaW50OEFycmF5KE0pKSk7XG4gIGlmIChILmxlbmd0aCAhPT0gX2hhc2gyLmRlZmF1bHQuZ2V0SGFzaEJ5dGVMZW5ndGgoYWxnbykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGFzaCBsZW5ndGgnKTtcbiAgfVxuICAvLyBwcm9kdWNlIGFuIEFTTi4xIERFUiB2YWx1ZSBmb3IgdGhlIGhhc2ggZnVuY3Rpb24gdXNlZC5cbiAgLy8gTGV0IFQgYmUgdGhlIGZ1bGwgaGFzaCBwcmVmaXhcbiAgdmFyIFQgPSAnJztcbiAgZm9yIChpID0gMDsgaSA8IGhhc2hfaGVhZGVyc1thbGdvXS5sZW5ndGg7IGkrKykge1xuICAgIFQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShoYXNoX2hlYWRlcnNbYWxnb11baV0pO1xuICB9XG4gIC8vIGFkZCBoYXNoIHZhbHVlIHRvIHByZWZpeFxuICBUICs9IEg7XG4gIC8vIGFuZCBsZXQgdExlbiBiZSB0aGUgbGVuZ3RoIGluIG9jdGV0cyBvZiBUXG4gIHZhciB0TGVuID0gVC5sZW5ndGg7XG4gIGlmIChlbUxlbiA8IHRMZW4gKyAxMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW50ZW5kZWQgZW5jb2RlZCBtZXNzYWdlIGxlbmd0aCB0b28gc2hvcnQnKTtcbiAgfVxuICAvLyBhbiBvY3RldCBzdHJpbmcgUFMgY29uc2lzdGluZyBvZiBlbUxlbiAtIHRMZW4gLSAzIG9jdGV0cyB3aXRoIGhleGFkZWNpbWFsIHZhbHVlIDB4RkZcbiAgLy8gVGhlIGxlbmd0aCBvZiBQUyB3aWxsIGJlIGF0IGxlYXN0IDggb2N0ZXRzXG4gIHZhciBQUyA9ICcnO1xuICBmb3IgKGkgPSAwOyBpIDwgZW1MZW4gLSB0TGVuIC0gMzsgaSsrKSB7XG4gICAgUFMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGZmKTtcbiAgfVxuICAvLyBDb25jYXRlbmF0ZSBQUywgdGhlIGhhc2ggcHJlZml4IFQsIGFuZCBvdGhlciBwYWRkaW5nIHRvIGZvcm0gdGhlXG4gIC8vIGVuY29kZWQgbWVzc2FnZSBFTSBhcyBFTSA9IDB4MDAgfHwgMHgwMSB8fCBQUyB8fCAweDAwIHx8IFQuXG4gIHZhciBFTSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHgwMCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MDEpICsgUFMgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MDApICsgVDtcbiAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LnN0cl90b19oZXgoRU0pO1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0geyBlbWU6IGVtZSwgZW1zYTogZW1zYSB9O1xuXG59LHtcIi4uL3V0aWxcIjozOTgsXCIuL2hhc2hcIjozMzgsXCIuL3JhbmRvbVwiOjM1NSxcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI6MzUsXCJiYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yXCI6NDJ9XSwzNDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuLy8gT3BlblBHUC5qcyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgRGVjZW50cmFsXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEZ1bmN0aW9ucyB0byBhZGQgYW5kIHJlbW92ZSBQS0NTNSBwYWRkaW5nXG4gKiBAc2VlIG1vZHVsZTpwYWNrZXQuUHVibGljS2V5RW5jcnlwdGVkU2Vzc2lvbktleVxuICogQG1vZHVsZSBjcnlwdG8vcGtjczVcbiAqL1xuXG4vKipcbiAqIEFkZCBwa2NzNSBwYWRkaW5nIHRvIGEgdGV4dC5cbiAqIEBwYXJhbSAge1N0cmluZ30gIG1zZyAgVGV4dCB0byBhZGQgcGFkZGluZ1xuICogQHJldHVybnMge1N0cmluZ30gICAgICAgVGV4dCB3aXRoIHBhZGRpbmcgYWRkZWRcbiAqL1xuZnVuY3Rpb24gZW5jb2RlKG1zZykge1xuICB2YXIgYyA9IDggLSBtc2cubGVuZ3RoICUgODtcbiAgdmFyIHBhZGRpbmcgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpLnJlcGVhdChjKTtcbiAgcmV0dXJuIG1zZyArIHBhZGRpbmc7XG59XG5cbi8qKlxuICogUmVtb3ZlIHBrY3M1IHBhZGRpbmcgZnJvbSBhIHN0cmluZy5cbiAqIEBwYXJhbSAge1N0cmluZ30gIG1zZyAgVGV4dCB0byByZW1vdmUgcGFkZGluZyBmcm9tXG4gKiBAcmV0dXJucyB7U3RyaW5nfSAgICAgICBUZXh0IHdpdGggcGFkZGluZyByZW1vdmVkXG4gKi9cbmZ1bmN0aW9uIGRlY29kZShtc2cpIHtcbiAgdmFyIGxlbiA9IG1zZy5sZW5ndGg7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgdmFyIGMgPSBtc2cuY2hhckNvZGVBdChsZW4gLSAxKTtcbiAgICBpZiAoYyA+PSAxICYmIGMgPD0gOCkge1xuICAgICAgdmFyIHByb3ZpZGVkID0gbXNnLnN1YnN0cihsZW4gLSBjKTtcbiAgICAgIHZhciBjb21wdXRlZCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYykucmVwZWF0KGMpO1xuICAgICAgaWYgKHByb3ZpZGVkID09PSBjb21wdXRlZCkge1xuICAgICAgICByZXR1cm4gbXNnLnN1YnN0cigwLCBsZW4gLSBjKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhZGRpbmcnKTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0geyBlbmNvZGU6IGVuY29kZSwgZGVjb2RlOiBkZWNvZGUgfTtcblxufSx7fV0sMzQ0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3InKTtcblxudmFyIF9yZWdlbmVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWdlbmVyYXRvcik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvcicpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXN5bmNUb0dlbmVyYXRvcjIpO1xuXG52YXIgX2JuID0gX2RlcmVxXygnYm4uanMnKTtcblxudmFyIF9ibjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ibik7XG5cbnZhciBfaGFzaCA9IF9kZXJlcV8oJy4uL2hhc2gnKTtcblxudmFyIF9oYXNoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhc2gpO1xuXG52YXIgX3JhbmRvbSA9IF9kZXJlcV8oJy4uL3JhbmRvbScpO1xuXG52YXIgX3JhbmRvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yYW5kb20pO1xuXG52YXIgX3V0aWwgPSBfZGVyZXFfKCcuLi8uLi91dGlsJyk7XG5cbnZhciBfdXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEEgRGlnaXRhbCBzaWduYXR1cmUgYWxnb3JpdGhtIGltcGxlbWVudGF0aW9uXG4gKiBAcmVxdWlyZXMgYm4uanNcbiAqIEByZXF1aXJlcyBjcnlwdG8vaGFzaFxuICogQHJlcXVpcmVzIGNyeXB0by9yYW5kb21cbiAqIEByZXF1aXJlcyB1dGlsXG4gKiBAbW9kdWxlIGNyeXB0by9wdWJsaWNfa2V5L2RzYVxuICovXG5cbnZhciBvbmUgPSBuZXcgX2JuMi5kZWZhdWx0KDEpO1xudmFyIHplcm8gPSBuZXcgX2JuMi5kZWZhdWx0KDApO1xuXG4vKlxuICBUT0RPIHJlZ2FyZGluZyB0aGUgaGFzaCBmdW5jdGlvbiwgcmVhZDpcbiAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tMTMuNlxuICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi0xNFxuKi9cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICAvKipcbiAgICogRFNBIFNpZ24gZnVuY3Rpb25cbiAgICogQHBhcmFtIHtJbnRlZ2VyfSBoYXNoX2FsZ29cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1cbiAgICogQHBhcmFtIHtCTn0gZ1xuICAgKiBAcGFyYW0ge0JOfSBwXG4gICAqIEBwYXJhbSB7Qk59IHFcbiAgICogQHBhcmFtIHtCTn0geFxuICAgKiBAcmV0dXJucyB7eyByOiBCTiwgczogQk4gfX1cbiAgICogQGFzeW5jXG4gICAqL1xuICBzaWduOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZShoYXNoX2FsZ28sIG0sIGcsIHAsIHEsIHgpIHtcbiAgICAgIHZhciBrLCByLCBzLCB0LCByZWRwLCByZWRxLCBncmVkLCB4cmVkLCBoO1xuICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBrID0gdm9pZCAwO1xuICAgICAgICAgICAgICByID0gdm9pZCAwO1xuICAgICAgICAgICAgICBzID0gdm9pZCAwO1xuICAgICAgICAgICAgICB0ID0gdm9pZCAwO1xuICAgICAgICAgICAgICByZWRwID0gbmV3IF9ibjIuZGVmYXVsdC5yZWQocCk7XG4gICAgICAgICAgICAgIHJlZHEgPSBuZXcgX2JuMi5kZWZhdWx0LnJlZChxKTtcbiAgICAgICAgICAgICAgZ3JlZCA9IGcudG9SZWQocmVkcCk7XG4gICAgICAgICAgICAgIHhyZWQgPSB4LnRvUmVkKHJlZHEpO1xuICAgICAgICAgICAgICAvLyBJZiB0aGUgb3V0cHV0IHNpemUgb2YgdGhlIGNob3NlbiBoYXNoIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2ZcbiAgICAgICAgICAgICAgLy8gYml0cyBvZiBxLCB0aGUgaGFzaCByZXN1bHQgaXMgdHJ1bmNhdGVkIHRvIGZpdCBieSB0YWtpbmcgdGhlIG51bWJlclxuICAgICAgICAgICAgICAvLyBvZiBsZWZ0bW9zdCBiaXRzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYml0cyBvZiBxLiAgVGhpcyAocG9zc2libHlcbiAgICAgICAgICAgICAgLy8gdHJ1bmNhdGVkKSBoYXNoIGZ1bmN0aW9uIHJlc3VsdCBpcyB0cmVhdGVkIGFzIGEgbnVtYmVyIGFuZCB1c2VkXG4gICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGluIHRoZSBEU0Egc2lnbmF0dXJlIGFsZ29yaXRobS5cblxuICAgICAgICAgICAgICBoID0gbmV3IF9ibjIuZGVmYXVsdChfdXRpbDIuZGVmYXVsdC5nZXRMZWZ0TkJpdHMoX2hhc2gyLmRlZmF1bHQuZGlnZXN0KGhhc2hfYWxnbywgbSksIHEuYml0TGVuZ3RoKCkpKS50b1JlZChyZWRxKTtcbiAgICAgICAgICAgICAgLy8gRklQUy0xODYtNCwgc2VjdGlvbiA0LjY6XG4gICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZXMgb2YgciBhbmQgcyBzaGFsbCBiZSBjaGVja2VkIHRvIGRldGVybWluZSBpZiByID0gMCBvciBzID0gMC5cbiAgICAgICAgICAgICAgLy8gSWYgZWl0aGVyIHIgPSAwIG9yIHMgPSAwLCBhIG5ldyB2YWx1ZSBvZiBrIHNoYWxsIGJlIGdlbmVyYXRlZCwgYW5kIHRoZVxuICAgICAgICAgICAgICAvLyBzaWduYXR1cmUgc2hhbGwgYmUgcmVjYWxjdWxhdGVkLiBJdCBpcyBleHRyZW1lbHkgdW5saWtlbHkgdGhhdCByID0gMFxuICAgICAgICAgICAgICAvLyBvciBzID0gMCBpZiBzaWduYXR1cmVzIGFyZSBnZW5lcmF0ZWQgcHJvcGVybHkuXG5cbiAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgaWYgKCF0cnVlKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIzO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyO1xuICAgICAgICAgICAgICByZXR1cm4gX3JhbmRvbTIuZGVmYXVsdC5nZXRSYW5kb21CTihvbmUsIHEpO1xuXG4gICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICBrID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgICAgLy8gcmV0dXJucyBpbiBbMSwgcS0xXVxuICAgICAgICAgICAgICByID0gZ3JlZC5yZWRQb3coaykuZnJvbVJlZCgpLnRvUmVkKHJlZHEpOyAvLyAoZyoqayBtb2QgcCkgbW9kIHFcblxuICAgICAgICAgICAgICBpZiAoISh6ZXJvLmNtcChyKSA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdjb250aW51ZScsIDkpO1xuXG4gICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICB0ID0gaC5yZWRBZGQoeHJlZC5yZWRNdWwocikpOyAvLyBIKG0pICsgeCpyIG1vZCBxXG4gICAgICAgICAgICAgIHMgPSBrLnRvUmVkKHJlZHEpLnJlZEludm0oKS5yZWRNdWwodCk7IC8vIGsqKi0xICogKEgobSkgKyB4KnIpIG1vZCBxXG5cbiAgICAgICAgICAgICAgaWYgKCEoemVyby5jbXAocykgPT09IDApKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgnY29udGludWUnLCA5KTtcblxuICAgICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgnYnJlYWsnLCAyMyk7XG5cbiAgICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIHsgcjogci50b0FycmF5TGlrZShVaW50OEFycmF5KSxcbiAgICAgICAgICAgICAgICBzOiBzLnRvQXJyYXlMaWtlKFVpbnQ4QXJyYXkpIH0pO1xuXG4gICAgICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgIH0pKTtcblxuICAgIGZ1bmN0aW9uIHNpZ24oX3gsIF94MiwgX3gzLCBfeDQsIF94NSwgX3g2KSB7XG4gICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiBzaWduO1xuICB9KCksXG5cbiAgLyoqXG4gICAqIERTQSBWZXJpZnkgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtJbnRlZ2VyfSBoYXNoX2FsZ29cbiAgICogQHBhcmFtIHtCTn0gclxuICAgKiBAcGFyYW0ge0JOfSBzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtXG4gICAqIEBwYXJhbSB7Qk59IGdcbiAgICogQHBhcmFtIHtCTn0gcFxuICAgKiBAcGFyYW0ge0JOfSBxXG4gICAqIEBwYXJhbSB7Qk59IHlcbiAgICogQHJldHVybnMgQk5cbiAgICogQGFzeW5jXG4gICAqL1xuICB2ZXJpZnk6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjIgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoaGFzaF9hbGdvLCByLCBzLCBtLCBnLCBwLCBxLCB5KSB7XG4gICAgICB2YXIgcmVkcCwgcmVkcSwgaCwgdywgdTEsIHUyLCB0MSwgdDIsIHY7XG4gICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBpZiAoISh6ZXJvLnVjbXAocikgPj0gMCB8fCByLnVjbXAocSkgPj0gMCB8fCB6ZXJvLnVjbXAocykgPj0gMCB8fCBzLnVjbXAocSkgPj0gMCkpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfdXRpbDIuZGVmYXVsdC5wcmludF9kZWJ1ZyhcImludmFsaWQgRFNBIFNpZ25hdHVyZVwiKTtcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoJ3JldHVybicsIG51bGwpO1xuXG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIHJlZHAgPSBuZXcgX2JuMi5kZWZhdWx0LnJlZChwKTtcbiAgICAgICAgICAgICAgcmVkcSA9IG5ldyBfYm4yLmRlZmF1bHQucmVkKHEpO1xuICAgICAgICAgICAgICBoID0gbmV3IF9ibjIuZGVmYXVsdChfdXRpbDIuZGVmYXVsdC5nZXRMZWZ0TkJpdHMoX2hhc2gyLmRlZmF1bHQuZGlnZXN0KGhhc2hfYWxnbywgbSksIHEuYml0TGVuZ3RoKCkpKTtcbiAgICAgICAgICAgICAgdyA9IHMudG9SZWQocmVkcSkucmVkSW52bSgpOyAvLyBzKiotMSBtb2QgcVxuXG4gICAgICAgICAgICAgIGlmICghKHplcm8uY21wKHcpID09PSAwKSkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfdXRpbDIuZGVmYXVsdC5wcmludF9kZWJ1ZyhcImludmFsaWQgRFNBIFNpZ25hdHVyZVwiKTtcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoJ3JldHVybicsIG51bGwpO1xuXG4gICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICB1MSA9IGgudG9SZWQocmVkcSkucmVkTXVsKHcpOyAvLyBIKG0pICogdyBtb2QgcVxuXG4gICAgICAgICAgICAgIHUyID0gci50b1JlZChyZWRxKS5yZWRNdWwodyk7IC8vIHIgKiB3IG1vZCBxXG5cbiAgICAgICAgICAgICAgdDEgPSBnLnRvUmVkKHJlZHApLnJlZFBvdyh1MS5mcm9tUmVkKCkpOyAvLyBnKip1MSBtb2QgcFxuXG4gICAgICAgICAgICAgIHQyID0geS50b1JlZChyZWRwKS5yZWRQb3codTIuZnJvbVJlZCgpKTsgLy8geSoqdTIgbW9kIHBcblxuICAgICAgICAgICAgICB2ID0gdDEucmVkTXVsKHQyKS5mcm9tUmVkKCkubW9kKHEpOyAvLyAoZyoqdTEgKiB5Kip1MiBtb2QgcCkgbW9kIHFcblxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywgdi5jbXAocikgPT09IDApO1xuXG4gICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gICAgfSkpO1xuXG4gICAgZnVuY3Rpb24gdmVyaWZ5KF94NywgX3g4LCBfeDksIF94MTAsIF94MTEsIF94MTIsIF94MTMsIF94MTQpIHtcbiAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiB2ZXJpZnk7XG4gIH0oKVxufTtcblxufSx7XCIuLi8uLi91dGlsXCI6Mzk4LFwiLi4vaGFzaFwiOjMzOCxcIi4uL3JhbmRvbVwiOjM1NSxcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI6MzUsXCJiYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yXCI6NDIsXCJibi5qc1wiOjQ0fV0sMzQ1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3InKTtcblxudmFyIF9yZWdlbmVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWdlbmVyYXRvcik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvcicpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXN5bmNUb0dlbmVyYXRvcjIpO1xuXG52YXIgX2JuID0gX2RlcmVxXygnYm4uanMnKTtcblxudmFyIF9ibjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ibik7XG5cbnZhciBfcmFuZG9tID0gX2RlcmVxXygnLi4vcmFuZG9tJyk7XG5cbnZhciBfcmFuZG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JhbmRvbSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBFbEdhbWFsIGltcGxlbWVudGF0aW9uXG4gKiBAcmVxdWlyZXMgYm4uanNcbiAqIEByZXF1aXJlcyBjcnlwdG8vcmFuZG9tXG4gKiBAbW9kdWxlIGNyeXB0by9wdWJsaWNfa2V5L2VsZ2FtYWxcbiAqL1xuXG52YXIgemVybyA9IG5ldyBfYm4yLmRlZmF1bHQoMCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgLyoqXG4gICAqIEVsR2FtYWwgRW5jcnlwdGlvbiBmdW5jdGlvblxuICAgKiBAcGFyYW0ge0JOfSBtXG4gICAqIEBwYXJhbSB7Qk59IHBcbiAgICogQHBhcmFtIHtCTn0gZ1xuICAgKiBAcGFyYW0ge0JOfSB5XG4gICAqIEByZXR1cm5zIHt7IGMxOiBCTiwgYzI6IEJOIH19XG4gICAqIEBhc3luY1xuICAgKi9cbiAgZW5jcnlwdDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUobSwgcCwgZywgeSkge1xuICAgICAgdmFyIHJlZHAsIG1yZWQsIGdyZWQsIHlyZWQsIGs7XG4gICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJlZHAgPSBuZXcgX2JuMi5kZWZhdWx0LnJlZChwKTtcbiAgICAgICAgICAgICAgbXJlZCA9IG0udG9SZWQocmVkcCk7XG4gICAgICAgICAgICAgIGdyZWQgPSBnLnRvUmVkKHJlZHApO1xuICAgICAgICAgICAgICB5cmVkID0geS50b1JlZChyZWRwKTtcbiAgICAgICAgICAgICAgLy8gU2VlIFNlY3Rpb24gMTEuNSBoZXJlOiBodHRwczovL2NyeXB0by5zdGFuZm9yZC5lZHUvfmRhYm8vY3J5cHRvYm9vay9Cb25laFNob3VwXzBfNC5wZGZcblxuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgcmV0dXJuIF9yYW5kb20yLmRlZmF1bHQuZ2V0UmFuZG9tQk4oemVybywgcCk7XG5cbiAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgayA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIHtcbiAgICAgICAgICAgICAgICBjMTogZ3JlZC5yZWRQb3coaykuZnJvbVJlZCgpLFxuICAgICAgICAgICAgICAgIGMyOiB5cmVkLnJlZFBvdyhrKS5yZWRNdWwobXJlZCkuZnJvbVJlZCgpXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gICAgfSkpO1xuXG4gICAgZnVuY3Rpb24gZW5jcnlwdChfeCwgX3gyLCBfeDMsIF94NCkge1xuICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW5jcnlwdDtcbiAgfSgpLFxuXG4gIC8qKlxuICAgKiBFbEdhbWFsIEVuY3J5cHRpb24gZnVuY3Rpb25cbiAgICogQHBhcmFtIHtCTn0gYzFcbiAgICogQHBhcmFtIHtCTn0gYzJcbiAgICogQHBhcmFtIHtCTn0gcFxuICAgKiBAcGFyYW0ge0JOfSB4XG4gICAqIEByZXR1cm5zIEJOXG4gICAqIEBhc3luY1xuICAgKi9cbiAgZGVjcnlwdDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMihjMSwgYzIsIHAsIHgpIHtcbiAgICAgIHZhciByZWRwLCBjMXJlZCwgYzJyZWQ7XG4gICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZWRwID0gbmV3IF9ibjIuZGVmYXVsdC5yZWQocCk7XG4gICAgICAgICAgICAgIGMxcmVkID0gYzEudG9SZWQocmVkcCk7XG4gICAgICAgICAgICAgIGMycmVkID0gYzIudG9SZWQocmVkcCk7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCdyZXR1cm4nLCBjMXJlZC5yZWRQb3coeCkucmVkSW52bSgpLnJlZE11bChjMnJlZCkuZnJvbVJlZCgpKTtcblxuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gICAgfSkpO1xuXG4gICAgZnVuY3Rpb24gZGVjcnlwdChfeDUsIF94NiwgX3g3LCBfeDgpIHtcbiAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWNyeXB0O1xuICB9KClcbn07XG5cbn0se1wiLi4vcmFuZG9tXCI6MzU1LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjozNSxcImJhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3JcIjo0MixcImJuLmpzXCI6NDR9XSwzNDY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRQcmVmZXJyZWRIYXNoQWxnbyA9IGV4cG9ydHMuZ2VuZXJhdGUgPSBleHBvcnRzLm5vZGVDdXJ2ZXMgPSBleHBvcnRzLndlYkN1cnZlcyA9IGV4cG9ydHMuY3VydmVzID0gdW5kZWZpbmVkO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvcicpO1xuXG52YXIgX3JlZ2VuZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZ2VuZXJhdG9yKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJyk7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3luY1RvR2VuZXJhdG9yMik7XG5cbnZhciBnZW5lcmF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYyID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKGN1cnZlKSB7XG4gICAgdmFyIGtleVBhaXI7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGN1cnZlID0gbmV3IEN1cnZlKGN1cnZlKTtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMztcbiAgICAgICAgICAgIHJldHVybiBjdXJ2ZS5nZW5LZXlQYWlyKCk7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBrZXlQYWlyID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywge1xuICAgICAgICAgICAgICBvaWQ6IGN1cnZlLm9pZCxcbiAgICAgICAgICAgICAgUTogbmV3IF9ibjIuZGVmYXVsdChrZXlQYWlyLmdldFB1YmxpYygpKSxcbiAgICAgICAgICAgICAgZDogbmV3IF9ibjIuZGVmYXVsdChrZXlQYWlyLmdldFByaXZhdGUoKSksXG4gICAgICAgICAgICAgIGhhc2g6IGN1cnZlLmhhc2gsXG4gICAgICAgICAgICAgIGNpcGhlcjogY3VydmUuY2lwaGVyXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gZ2VuZXJhdGUoX3gpIHtcbiAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vICAgICAgICAgICAgICAgICAgICAgIC8vXG4vLyAgIEhlbHBlciBmdW5jdGlvbnMgICAvL1xuLy8gICAgICAgICAgICAgICAgICAgICAgLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblxudmFyIHdlYkdlbktleVBhaXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMyA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhuYW1lKSB7XG4gICAgdmFyIHdlYkNyeXB0b0tleSwgcHJpdmF0ZUtleSwgcHVibGljS2V5O1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDI7XG4gICAgICAgICAgICByZXR1cm4gd2ViQ3J5cHRvLmdlbmVyYXRlS2V5KHsgbmFtZTogXCJFQ0RTQVwiLCBuYW1lZEN1cnZlOiB3ZWJDdXJ2ZXNbbmFtZV0gfSwgdHJ1ZSwgW1wic2lnblwiLCBcInZlcmlmeVwiXSk7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICB3ZWJDcnlwdG9LZXkgPSBfY29udGV4dDMuc2VudDtcbiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNTtcbiAgICAgICAgICAgIHJldHVybiB3ZWJDcnlwdG8uZXhwb3J0S2V5KFwiandrXCIsIHdlYkNyeXB0b0tleS5wcml2YXRlS2V5KTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHByaXZhdGVLZXkgPSBfY29udGV4dDMuc2VudDtcbiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gODtcbiAgICAgICAgICAgIHJldHVybiB3ZWJDcnlwdG8uZXhwb3J0S2V5KFwiandrXCIsIHdlYkNyeXB0b0tleS5wdWJsaWNLZXkpO1xuXG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgcHVibGljS2V5ID0gX2NvbnRleHQzLnNlbnQ7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgncmV0dXJuJywge1xuICAgICAgICAgICAgICBwdWI6IHtcbiAgICAgICAgICAgICAgICB4OiBfdXRpbDIuZGVmYXVsdC5iNjRfdG9fVWludDhBcnJheShwdWJsaWNLZXkueCwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgeTogX3V0aWwyLmRlZmF1bHQuYjY0X3RvX1VpbnQ4QXJyYXkocHVibGljS2V5LnksIHRydWUpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHByaXY6IF91dGlsMi5kZWZhdWx0LmI2NF90b19VaW50OEFycmF5KHByaXZhdGVLZXkuZCwgdHJ1ZSlcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMywgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gd2ViR2VuS2V5UGFpcihfeDIpIHtcbiAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxudmFyIG5vZGVHZW5LZXlQYWlyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjQgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQobmFtZSkge1xuICAgIHZhciBlY2RoO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAvLyBOb3RlOiBFQ0RTQSBhbmQgRUNESCBrZXkgZ2VuZXJhdGlvbiBpcyBzdHJ1Y3R1cmFsbHkgZXF1aXZhbGVudFxuICAgICAgICAgICAgZWNkaCA9IG5vZGVDcnlwdG8uY3JlYXRlRUNESChub2RlQ3VydmVzW25hbWVdKTtcbiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMztcbiAgICAgICAgICAgIHJldHVybiBlY2RoLmdlbmVyYXRlS2V5cygpO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoJ3JldHVybicsIHtcbiAgICAgICAgICAgICAgcHViOiBlY2RoLmdldFB1YmxpY0tleSgpLnRvSlNPTigpLmRhdGEsXG4gICAgICAgICAgICAgIHByaXY6IGVjZGguZ2V0UHJpdmF0ZUtleSgpLnRvSlNPTigpLmRhdGFcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWU0LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBub2RlR2VuS2V5UGFpcihfeDMpIHtcbiAgICByZXR1cm4gX3JlZjQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxudmFyIF9ibiA9IF9kZXJlcV8oJ2JuLmpzJyk7XG5cbnZhciBfYm4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYm4pO1xuXG52YXIgX2VsbGlwdGljID0gX2RlcmVxXygnZWxsaXB0aWMnKTtcblxudmFyIF9rZXkgPSBfZGVyZXFfKCcuL2tleScpO1xuXG52YXIgX2tleTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9rZXkpO1xuXG52YXIgX3JhbmRvbSA9IF9kZXJlcV8oJy4uLy4uL3JhbmRvbScpO1xuXG52YXIgX3JhbmRvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yYW5kb20pO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vLi4vLi4vZW51bXMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uLy4uLy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG52YXIgX29pZCA9IF9kZXJlcV8oJy4uLy4uLy4uL3R5cGUvb2lkJyk7XG5cbnZhciBfb2lkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29pZCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciB3ZWJDcnlwdG8gPSBfdXRpbDIuZGVmYXVsdC5nZXRXZWJDcnlwdG8oKTsgLy8gT3BlblBHUC5qcyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgRGVjZW50cmFsXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFdyYXBwZXIgb2YgYW4gaW5zdGFuY2Ugb2YgYW4gRWxsaXB0aWMgQ3VydmVcbiAqIEByZXF1aXJlcyBibi5qc1xuICogQHJlcXVpcmVzIGVsbGlwdGljXG4gKiBAcmVxdWlyZXMgY3J5cHRvL3B1YmxpY19rZXkvZWxsaXB0aWMva2V5XG4gKiBAcmVxdWlyZXMgY3J5cHRvL3JhbmRvbVxuICogQHJlcXVpcmVzIGVudW1zXG4gKiBAcmVxdWlyZXMgdXRpbFxuICogQHJlcXVpcmVzIHR5cGUvb2lkXG4gKiBAbW9kdWxlIGNyeXB0by9wdWJsaWNfa2V5L2VsbGlwdGljL2N1cnZlXG4gKi9cblxudmFyIG5vZGVDcnlwdG8gPSBfdXRpbDIuZGVmYXVsdC5nZXROb2RlQ3J5cHRvKCk7XG5cbnZhciB3ZWJDdXJ2ZXMgPSB7XG4gICdwMjU2JzogJ1AtMjU2JyxcbiAgJ3AzODQnOiAnUC0zODQnLFxuICAncDUyMSc6ICdQLTUyMSdcbn07XG52YXIga25vd25DdXJ2ZXMgPSBub2RlQ3J5cHRvID8gbm9kZUNyeXB0by5nZXRDdXJ2ZXMoKSA6IFtdO1xudmFyIG5vZGVDdXJ2ZXMgPSBub2RlQ3J5cHRvID8ge1xuICBzZWNwMjU2azE6IGtub3duQ3VydmVzLmluY2x1ZGVzKCdzZWNwMjU2azEnKSA/ICdzZWNwMjU2azEnIDogdW5kZWZpbmVkLFxuICBwMjU2OiBrbm93bkN1cnZlcy5pbmNsdWRlcygncHJpbWUyNTZ2MScpID8gJ3ByaW1lMjU2djEnIDogdW5kZWZpbmVkLFxuICBwMzg0OiBrbm93bkN1cnZlcy5pbmNsdWRlcygnc2VjcDM4NHIxJykgPyAnc2VjcDM4NHIxJyA6IHVuZGVmaW5lZCxcbiAgcDUyMToga25vd25DdXJ2ZXMuaW5jbHVkZXMoJ3NlY3A1MjFyMScpID8gJ3NlY3A1MjFyMScgOiB1bmRlZmluZWQsXG4gIGVkMjU1MTk6IGtub3duQ3VydmVzLmluY2x1ZGVzKCdFRDI1NTE5JykgPyAnRUQyNTUxOScgOiB1bmRlZmluZWQsXG4gIGN1cnZlMjU1MTk6IGtub3duQ3VydmVzLmluY2x1ZGVzKCdYMjU1MTknKSA/ICdYMjU1MTknIDogdW5kZWZpbmVkLFxuICBicmFpbnBvb2xQMjU2cjE6IGtub3duQ3VydmVzLmluY2x1ZGVzKCdicmFpbnBvb2xQMjU2cjEnKSA/ICdicmFpbnBvb2xQMjU2cjEnIDogdW5kZWZpbmVkLFxuICBicmFpbnBvb2xQMzg0cjE6IGtub3duQ3VydmVzLmluY2x1ZGVzKCdicmFpbnBvb2xQMzg0cjEnKSA/ICdicmFpbnBvb2xQMzg0cjEnIDogdW5kZWZpbmVkLFxuICBicmFpbnBvb2xQNTEycjE6IGtub3duQ3VydmVzLmluY2x1ZGVzKCdicmFpbnBvb2xQNTEycjEnKSA/ICdicmFpbnBvb2xQNTEycjEnIDogdW5kZWZpbmVkXG59IDoge307XG5cbnZhciBjdXJ2ZXMgPSB7XG4gIHAyNTY6IHtcbiAgICBvaWQ6IFsweDA2LCAweDA4LCAweDJBLCAweDg2LCAweDQ4LCAweENFLCAweDNELCAweDAzLCAweDAxLCAweDA3XSxcbiAgICBrZXlUeXBlOiBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmVjZHNhLFxuICAgIGhhc2g6IF9lbnVtczIuZGVmYXVsdC5oYXNoLnNoYTI1NixcbiAgICBjaXBoZXI6IF9lbnVtczIuZGVmYXVsdC5zeW1tZXRyaWMuYWVzMTI4LFxuICAgIG5vZGU6IG5vZGVDdXJ2ZXMucDI1NixcbiAgICB3ZWI6IHdlYkN1cnZlcy5wMjU2LFxuICAgIHBheWxvYWRTaXplOiAzMlxuICB9LFxuICBwMzg0OiB7XG4gICAgb2lkOiBbMHgwNiwgMHgwNSwgMHgyQiwgMHg4MSwgMHgwNCwgMHgwMCwgMHgyMl0sXG4gICAga2V5VHlwZTogX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lY2RzYSxcbiAgICBoYXNoOiBfZW51bXMyLmRlZmF1bHQuaGFzaC5zaGEzODQsXG4gICAgY2lwaGVyOiBfZW51bXMyLmRlZmF1bHQuc3ltbWV0cmljLmFlczE5MixcbiAgICBub2RlOiBub2RlQ3VydmVzLnAzODQsXG4gICAgd2ViOiB3ZWJDdXJ2ZXMucDM4NCxcbiAgICBwYXlsb2FkU2l6ZTogNDhcbiAgfSxcbiAgcDUyMToge1xuICAgIG9pZDogWzB4MDYsIDB4MDUsIDB4MkIsIDB4ODEsIDB4MDQsIDB4MDAsIDB4MjNdLFxuICAgIGtleVR5cGU6IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkc2EsXG4gICAgaGFzaDogX2VudW1zMi5kZWZhdWx0Lmhhc2guc2hhNTEyLFxuICAgIGNpcGhlcjogX2VudW1zMi5kZWZhdWx0LnN5bW1ldHJpYy5hZXMyNTYsXG4gICAgbm9kZTogbm9kZUN1cnZlcy5wNTIxLFxuICAgIHdlYjogd2ViQ3VydmVzLnA1MjEsXG4gICAgcGF5bG9hZFNpemU6IDY2XG4gIH0sXG4gIHNlY3AyNTZrMToge1xuICAgIG9pZDogWzB4MDYsIDB4MDUsIDB4MkIsIDB4ODEsIDB4MDQsIDB4MDAsIDB4MEFdLFxuICAgIGtleVR5cGU6IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkc2EsXG4gICAgaGFzaDogX2VudW1zMi5kZWZhdWx0Lmhhc2guc2hhMjU2LFxuICAgIGNpcGhlcjogX2VudW1zMi5kZWZhdWx0LnN5bW1ldHJpYy5hZXMxMjgsXG4gICAgbm9kZTogbm9kZUN1cnZlcy5zZWNwMjU2azFcbiAgfSxcbiAgZWQyNTUxOToge1xuICAgIG9pZDogWzB4MDYsIDB4MDksIDB4MkIsIDB4MDYsIDB4MDEsIDB4MDQsIDB4MDEsIDB4REEsIDB4NDcsIDB4MEYsIDB4MDFdLFxuICAgIGtleVR5cGU6IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWRkc2EsXG4gICAgaGFzaDogX2VudW1zMi5kZWZhdWx0Lmhhc2guc2hhNTEyLFxuICAgIG5vZGU6IGZhbHNlIC8vIG5vZGVDdXJ2ZXMuZWQyNTUxOSBUT0RPXG4gIH0sXG4gIGN1cnZlMjU1MTk6IHtcbiAgICBvaWQ6IFsweDA2LCAweDBBLCAweDJCLCAweDA2LCAweDAxLCAweDA0LCAweDAxLCAweDk3LCAweDU1LCAweDAxLCAweDA1LCAweDAxXSxcbiAgICBrZXlUeXBlOiBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmVjZHNhLFxuICAgIGhhc2g6IF9lbnVtczIuZGVmYXVsdC5oYXNoLnNoYTI1NixcbiAgICBjaXBoZXI6IF9lbnVtczIuZGVmYXVsdC5zeW1tZXRyaWMuYWVzMTI4LFxuICAgIG5vZGU6IGZhbHNlIC8vIG5vZGVDdXJ2ZXMuY3VydmUyNTUxOSBUT0RPXG4gIH0sXG4gIGJyYWlucG9vbFAyNTZyMToge1xuICAgIG9pZDogWzB4MDYsIDB4MDksIDB4MkIsIDB4MjQsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDgsIDB4MDEsIDB4MDEsIDB4MDddLFxuICAgIGtleVR5cGU6IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkc2EsXG4gICAgaGFzaDogX2VudW1zMi5kZWZhdWx0Lmhhc2guc2hhMjU2LFxuICAgIGNpcGhlcjogX2VudW1zMi5kZWZhdWx0LnN5bW1ldHJpYy5hZXMxMjgsXG4gICAgbm9kZTogbm9kZUN1cnZlcy5icmFpbnBvb2xQMjU2cjFcbiAgfSxcbiAgYnJhaW5wb29sUDM4NHIxOiB7XG4gICAgb2lkOiBbMHgwNiwgMHgwOSwgMHgyQiwgMHgyNCwgMHgwMywgMHgwMywgMHgwMiwgMHgwOCwgMHgwMSwgMHgwMSwgMHgwQl0sXG4gICAga2V5VHlwZTogX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lY2RzYSxcbiAgICBoYXNoOiBfZW51bXMyLmRlZmF1bHQuaGFzaC5zaGEzODQsXG4gICAgY2lwaGVyOiBfZW51bXMyLmRlZmF1bHQuc3ltbWV0cmljLmFlczE5MixcbiAgICBub2RlOiBub2RlQ3VydmVzLmJyYWlucG9vbFAzODRyMVxuICB9LFxuICBicmFpbnBvb2xQNTEycjE6IHtcbiAgICBvaWQ6IFsweDA2LCAweDA5LCAweDJCLCAweDI0LCAweDAzLCAweDAzLCAweDAyLCAweDA4LCAweDAxLCAweDAxLCAweDBEXSxcbiAgICBrZXlUeXBlOiBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmVjZHNhLFxuICAgIGhhc2g6IF9lbnVtczIuZGVmYXVsdC5oYXNoLnNoYTUxMixcbiAgICBjaXBoZXI6IF9lbnVtczIuZGVmYXVsdC5zeW1tZXRyaWMuYWVzMjU2LFxuICAgIG5vZGU6IG5vZGVDdXJ2ZXMuYnJhaW5wb29sUDUxMnIxXG4gIH1cbn07XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEN1cnZlKG9pZF9vcl9uYW1lLCBwYXJhbXMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoX3V0aWwyLmRlZmF1bHQuaXNBcnJheShvaWRfb3JfbmFtZSkgfHwgX3V0aWwyLmRlZmF1bHQuaXNVaW50OEFycmF5KG9pZF9vcl9uYW1lKSkge1xuICAgICAgLy8gYnkgb2lkIGJ5dGUgYXJyYXlcbiAgICAgIG9pZF9vcl9uYW1lID0gbmV3IF9vaWQyLmRlZmF1bHQob2lkX29yX25hbWUpO1xuICAgIH1cbiAgICBpZiAob2lkX29yX25hbWUgaW5zdGFuY2VvZiBfb2lkMi5kZWZhdWx0KSB7XG4gICAgICAvLyBieSBjdXJ2ZSBPSURcbiAgICAgIG9pZF9vcl9uYW1lID0gb2lkX29yX25hbWUuZ2V0TmFtZSgpO1xuICAgIH1cbiAgICAvLyBieSBjdXJ2ZSBuYW1lIG9yIG9pZCBzdHJpbmdcbiAgICB0aGlzLm5hbWUgPSBfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LmN1cnZlLCBvaWRfb3JfbmFtZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IHZhbGlkIGN1cnZlJyk7XG4gIH1cbiAgcGFyYW1zID0gcGFyYW1zIHx8IGN1cnZlc1t0aGlzLm5hbWVdO1xuXG4gIHRoaXMua2V5VHlwZSA9IHBhcmFtcy5rZXlUeXBlO1xuICBzd2l0Y2ggKHRoaXMua2V5VHlwZSkge1xuICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lY2RzYTpcbiAgICAgIHRoaXMuY3VydmUgPSBuZXcgX2VsbGlwdGljLmVjKHRoaXMubmFtZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWRkc2E6XG4gICAgICB0aGlzLmN1cnZlID0gbmV3IF9lbGxpcHRpYy5lZGRzYSh0aGlzLm5hbWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbGxpcHRpYyBrZXkgdHlwZTsnKTtcbiAgfVxuXG4gIHRoaXMub2lkID0gcGFyYW1zLm9pZDtcbiAgdGhpcy5oYXNoID0gcGFyYW1zLmhhc2g7XG4gIHRoaXMuY2lwaGVyID0gcGFyYW1zLmNpcGhlcjtcbiAgdGhpcy5ub2RlID0gcGFyYW1zLm5vZGUgJiYgY3VydmVzW3RoaXMubmFtZV07XG4gIHRoaXMud2ViID0gcGFyYW1zLndlYiAmJiBjdXJ2ZXNbdGhpcy5uYW1lXTtcbiAgdGhpcy5wYXlsb2FkU2l6ZSA9IHBhcmFtcy5wYXlsb2FkU2l6ZTtcbn1cblxuQ3VydmUucHJvdG90eXBlLmtleUZyb21Qcml2YXRlID0gZnVuY3Rpb24gKHByaXYpIHtcbiAgLy8gTm90IGZvciBlZDI1NTE5XG4gIHJldHVybiBuZXcgX2tleTIuZGVmYXVsdCh0aGlzLCB7IHByaXY6IHByaXYgfSk7XG59O1xuXG5DdXJ2ZS5wcm90b3R5cGUua2V5RnJvbVNlY3JldCA9IGZ1bmN0aW9uIChzZWNyZXQpIHtcbiAgLy8gT25seSBmb3IgZWQyNTUxOVxuICByZXR1cm4gbmV3IF9rZXkyLmRlZmF1bHQodGhpcywgeyBzZWNyZXQ6IHNlY3JldCB9KTtcbn07XG5cbkN1cnZlLnByb3RvdHlwZS5rZXlGcm9tUHVibGljID0gZnVuY3Rpb24gKHB1Yikge1xuICByZXR1cm4gbmV3IF9rZXkyLmRlZmF1bHQodGhpcywgeyBwdWI6IHB1YiB9KTtcbn07XG5cbkN1cnZlLnByb3RvdHlwZS5nZW5LZXlQYWlyID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gIHZhciBrZXlQYWlyLCByLCBjb21wYWN0O1xuICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAga2V5UGFpciA9IHZvaWQgMDtcblxuICAgICAgICAgIGlmICghKHRoaXMud2ViICYmIF91dGlsMi5kZWZhdWx0LmdldFdlYkNyeXB0bygpKSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDI7XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgcmV0dXJuIHdlYkdlbktleVBhaXIodGhpcy5uYW1lKTtcblxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAga2V5UGFpciA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gODtcbiAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0WydjYXRjaCddKDIpO1xuXG4gICAgICAgICAgX3V0aWwyLmRlZmF1bHQucHJpbnRfZGVidWcoXCJCcm93c2VyIGRpZCBub3Qgc3VwcG9ydCBzaWduaW5nOiBcIiArIF9jb250ZXh0LnQwLm1lc3NhZ2UpO1xuXG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE3O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgaWYgKCEodGhpcy5ub2RlICYmIF91dGlsMi5kZWZhdWx0LmdldE5vZGVDcnlwdG8oKSkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNjtcbiAgICAgICAgICByZXR1cm4gbm9kZUdlbktleVBhaXIodGhpcy5uYW1lKTtcblxuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgIGtleVBhaXIgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgaWYgKCEoIWtleVBhaXIgfHwgIWtleVBhaXIucHJpdikpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jb250ZXh0LnQxID0gdGhpcy5jdXJ2ZTtcbiAgICAgICAgICBfY29udGV4dC50MiA9IF91dGlsMi5kZWZhdWx0O1xuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMjtcbiAgICAgICAgICByZXR1cm4gX3JhbmRvbTIuZGVmYXVsdC5nZXRSYW5kb21CeXRlcygzMik7XG5cbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICBfY29udGV4dC50MyA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgX2NvbnRleHQudDQgPSBfY29udGV4dC50Mi5VaW50OEFycmF5X3RvX3N0ci5jYWxsKF9jb250ZXh0LnQyLCBfY29udGV4dC50Myk7XG4gICAgICAgICAgX2NvbnRleHQudDUgPSB7XG4gICAgICAgICAgICBlbnRyb3B5OiBfY29udGV4dC50NFxuICAgICAgICAgIH07XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI3O1xuICAgICAgICAgIHJldHVybiBfY29udGV4dC50MS5nZW5LZXlQYWlyLmNhbGwoX2NvbnRleHQudDEsIF9jb250ZXh0LnQ1KTtcblxuICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIHIgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgIGNvbXBhY3QgPSB0aGlzLmN1cnZlLmN1cnZlLnR5cGUgPT09ICdlZHdhcmRzJyB8fCB0aGlzLmN1cnZlLmN1cnZlLnR5cGUgPT09ICdtb250JztcblxuICAgICAgICAgIGlmICh0aGlzLmtleVR5cGUgPT09IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWRkc2EpIHtcbiAgICAgICAgICAgIGtleVBhaXIgPSB7IHNlY3JldDogci5nZXRTZWNyZXQoKSB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBrZXlQYWlyID0geyBwdWI6IHIuZ2V0UHVibGljKCdhcnJheScsIGNvbXBhY3QpLCBwcml2OiByLmdldFByaXZhdGUoKS50b0FycmF5KCkgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCBuZXcgX2tleTIuZGVmYXVsdCh0aGlzLCBrZXlQYWlyKSk7XG5cbiAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX2NhbGxlZSwgdGhpcywgW1syLCA4XV0pO1xufSkpO1xuXG5mdW5jdGlvbiBnZXRQcmVmZXJyZWRIYXNoQWxnbyhvaWQpIHtcbiAgcmV0dXJuIGN1cnZlc1tfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LmN1cnZlLCBvaWQudG9IZXgoKSldLmhhc2g7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IEN1cnZlO1xuZXhwb3J0cy5jdXJ2ZXMgPSBjdXJ2ZXM7XG5leHBvcnRzLndlYkN1cnZlcyA9IHdlYkN1cnZlcztcbmV4cG9ydHMubm9kZUN1cnZlcyA9IG5vZGVDdXJ2ZXM7XG5leHBvcnRzLmdlbmVyYXRlID0gZ2VuZXJhdGU7XG5leHBvcnRzLmdldFByZWZlcnJlZEhhc2hBbGdvID0gZ2V0UHJlZmVycmVkSGFzaEFsZ287XG5cbn0se1wiLi4vLi4vLi4vZW51bXNcIjozNTksXCIuLi8uLi8uLi90eXBlL29pZFwiOjM5NixcIi4uLy4uLy4uL3V0aWxcIjozOTgsXCIuLi8uLi9yYW5kb21cIjozNTUsXCIuL2tleVwiOjM1MSxcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI6MzUsXCJiYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yXCI6NDIsXCJibi5qc1wiOjQ0LFwiZWxsaXB0aWNcIjoyNjd9XSwzNDc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvcicpO1xuXG52YXIgX3JlZ2VuZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZ2VuZXJhdG9yKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJyk7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3luY1RvR2VuZXJhdG9yMik7XG5cbi8qKlxuICogRW5jcnlwdCBhbmQgd3JhcCBhIHNlc3Npb24ga2V5XG4gKlxuICogQHBhcmFtICB7bW9kdWxlOnR5cGUvb2lkfSAgICAgICAgb2lkICAgICAgICAgIEVsbGlwdGljIGN1cnZlIG9iamVjdCBpZGVudGlmaWVyXG4gKiBAcGFyYW0gIHttb2R1bGU6ZW51bXMuc3ltbWV0cmljfSBjaXBoZXJfYWxnbyAgU3ltbWV0cmljIGNpcGhlciB0byB1c2VcbiAqIEBwYXJhbSAge21vZHVsZTplbnVtcy5oYXNofSAgICAgIGhhc2hfYWxnbyAgICBIYXNoIGFsZ29yaXRobSB0byB1c2VcbiAqIEBwYXJhbSAge21vZHVsZTp0eXBlL21waX0gICAgICAgIG0gICAgICAgICAgICBWYWx1ZSBkZXJpdmVkIGZyb20gc2Vzc2lvbiBrZXkgKFJGQyA2NjM3KVxuICogQHBhcmFtICB7VWludDhBcnJheX0gICAgICAgICAgICAgUSAgICAgICAgICAgIFJlY2lwaWVudCBwdWJsaWMga2V5XG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICAgICBmaW5nZXJwcmludCAgUmVjaXBpZW50IGZpbmdlcnByaW50XG4gKiBAcmV0dXJucyB7e1Y6IEJOLCBDOiBCTn19ICAgICAgICAgICAgICAgICAgICAgUmV0dXJucyBlcGhlbWVyYWwga2V5IGFuZCBlbmNvZGVkIHNlc3Npb24ga2V5XG4gKiBAYXN5bmNcbiAqL1xudmFyIGVuY3J5cHQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUob2lkLCBjaXBoZXJfYWxnbywgaGFzaF9hbGdvLCBtLCBRLCBmaW5nZXJwcmludCkge1xuICAgIHZhciBjdXJ2ZSwgcGFyYW0sIHYsIFMsIFosIEM7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY3VydmUgPSBuZXcgX2N1cnZlczIuZGVmYXVsdChvaWQpO1xuICAgICAgICAgICAgcGFyYW0gPSBidWlsZEVjZGhQYXJhbShfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmVjZGgsIG9pZCwgY2lwaGVyX2FsZ28sIGhhc2hfYWxnbywgZmluZ2VycHJpbnQpO1xuXG4gICAgICAgICAgICBjaXBoZXJfYWxnbyA9IF9lbnVtczIuZGVmYXVsdC5yZWFkKF9lbnVtczIuZGVmYXVsdC5zeW1tZXRyaWMsIGNpcGhlcl9hbGdvKTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgcmV0dXJuIGN1cnZlLmdlbktleVBhaXIoKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHYgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBRID0gY3VydmUua2V5RnJvbVB1YmxpYyhRKTtcbiAgICAgICAgICAgIFMgPSB2LmRlcml2ZShRKTtcbiAgICAgICAgICAgIFogPSBrZGYoaGFzaF9hbGdvLCBTLCBfY2lwaGVyMi5kZWZhdWx0W2NpcGhlcl9hbGdvXS5rZXlTaXplLCBwYXJhbSk7XG4gICAgICAgICAgICBDID0gX2Flc19rdzIuZGVmYXVsdC53cmFwKFosIG0udG9TdHJpbmcoKSk7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCB7XG4gICAgICAgICAgICAgIFY6IG5ldyBfYm4yLmRlZmF1bHQodi5nZXRQdWJsaWMoKSksXG4gICAgICAgICAgICAgIEM6IENcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGVuY3J5cHQoX3gsIF94MiwgX3gzLCBfeDQsIF94NSwgX3g2KSB7XG4gICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBEZWNyeXB0IGFuZCB1bndyYXAgdGhlIHZhbHVlIGRlcml2ZWQgZnJvbSBzZXNzaW9uIGtleVxuICpcbiAqIEBwYXJhbSAge21vZHVsZTp0eXBlL29pZH0gICAgICAgIG9pZCAgICAgICAgICBFbGxpcHRpYyBjdXJ2ZSBvYmplY3QgaWRlbnRpZmllclxuICogQHBhcmFtICB7bW9kdWxlOmVudW1zLnN5bW1ldHJpY30gY2lwaGVyX2FsZ28gIFN5bW1ldHJpYyBjaXBoZXIgdG8gdXNlXG4gKiBAcGFyYW0gIHttb2R1bGU6ZW51bXMuaGFzaH0gICAgICBoYXNoX2FsZ28gICAgSGFzaCBhbGdvcml0aG0gdG8gdXNlXG4gKiBAcGFyYW0gIHtCTn0gICAgICAgICAgICAgICAgICAgICBWICAgICAgICAgICAgUHVibGljIHBhcnQgb2YgZXBoZW1lcmFsIGtleVxuICogQHBhcmFtICB7VWludDhBcnJheX0gICAgICAgICAgICAgQyAgICAgICAgICAgIEVuY3J5cHRlZCBhbmQgd3JhcHBlZCB2YWx1ZSBkZXJpdmVkIGZyb20gc2Vzc2lvbiBrZXlcbiAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9ICAgICAgICAgICAgIGQgICAgICAgICAgICBSZWNpcGllbnQgcHJpdmF0ZSBrZXlcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICAgICAgIGZpbmdlcnByaW50ICBSZWNpcGllbnQgZmluZ2VycHJpbnRcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBkZXJpdmVkIGZyb20gc2Vzc2lvblxuICogQGFzeW5jXG4gKi9cblxuXG52YXIgZGVjcnlwdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYyID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKG9pZCwgY2lwaGVyX2FsZ28sIGhhc2hfYWxnbywgViwgQywgZCwgZmluZ2VycHJpbnQpIHtcbiAgICB2YXIgY3VydmUsIHBhcmFtLCBTLCBaO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjdXJ2ZSA9IG5ldyBfY3VydmVzMi5kZWZhdWx0KG9pZCk7XG4gICAgICAgICAgICBwYXJhbSA9IGJ1aWxkRWNkaFBhcmFtKF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkaCwgb2lkLCBjaXBoZXJfYWxnbywgaGFzaF9hbGdvLCBmaW5nZXJwcmludCk7XG5cbiAgICAgICAgICAgIGNpcGhlcl9hbGdvID0gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LnN5bW1ldHJpYywgY2lwaGVyX2FsZ28pO1xuICAgICAgICAgICAgViA9IGN1cnZlLmtleUZyb21QdWJsaWMoVik7XG4gICAgICAgICAgICBkID0gY3VydmUua2V5RnJvbVByaXZhdGUoZCk7XG4gICAgICAgICAgICBTID0gZC5kZXJpdmUoVik7XG4gICAgICAgICAgICBaID0ga2RmKGhhc2hfYWxnbywgUywgX2NpcGhlcjIuZGVmYXVsdFtjaXBoZXJfYWxnb10ua2V5U2l6ZSwgcGFyYW0pO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoJ3JldHVybicsIG5ldyBfYm4yLmRlZmF1bHQoX2Flc19rdzIuZGVmYXVsdC51bndyYXAoWiwgQykpKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gZGVjcnlwdChfeDcsIF94OCwgX3g5LCBfeDEwLCBfeDExLCBfeDEyLCBfeDEzKSB7XG4gICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbnZhciBfYm4gPSBfZGVyZXFfKCdibi5qcycpO1xuXG52YXIgX2JuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2JuKTtcblxudmFyIF9jdXJ2ZXMgPSBfZGVyZXFfKCcuL2N1cnZlcycpO1xuXG52YXIgX2N1cnZlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jdXJ2ZXMpO1xuXG52YXIgX2Flc19rdyA9IF9kZXJlcV8oJy4uLy4uL2Flc19rdycpO1xuXG52YXIgX2Flc19rdzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hZXNfa3cpO1xuXG52YXIgX2NpcGhlciA9IF9kZXJlcV8oJy4uLy4uL2NpcGhlcicpO1xuXG52YXIgX2NpcGhlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jaXBoZXIpO1xuXG52YXIgX2hhc2ggPSBfZGVyZXFfKCcuLi8uLi9oYXNoJyk7XG5cbnZhciBfaGFzaDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYXNoKTtcblxudmFyIF9rZGZfcGFyYW1zID0gX2RlcmVxXygnLi4vLi4vLi4vdHlwZS9rZGZfcGFyYW1zJyk7XG5cbnZhciBfa2RmX3BhcmFtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9rZGZfcGFyYW1zKTtcblxudmFyIF9lbnVtcyA9IF9kZXJlcV8oJy4uLy4uLy4uL2VudW1zJyk7XG5cbnZhciBfZW51bXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW51bXMpO1xuXG52YXIgX3V0aWwgPSBfZGVyZXFfKCcuLi8uLi8uLi91dGlsJyk7XG5cbnZhciBfdXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLy8gQnVpbGQgUGFyYW0gZm9yIEVDREggYWxnb3JpdGhtIChSRkMgNjYzNylcbi8vIE9wZW5QR1AuanMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IERlY2VudHJhbFxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBLZXkgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBmb3IgUkZDIDY2MzcgRUNESFxuICogQHJlcXVpcmVzIGNyeXB0by9wdWJsaWNfa2V5L2VsbGlwdGljL2N1cnZlXG4gKiBAcmVxdWlyZXMgY3J5cHRvL2Flc19rd1xuICogQHJlcXVpcmVzIGNyeXB0by9jaXBoZXJcbiAqIEByZXF1aXJlcyBjcnlwdG8vaGFzaFxuICogQHJlcXVpcmVzIHR5cGUva2RmX3BhcmFtc1xuICogQHJlcXVpcmVzIGVudW1zXG4gKiBAcmVxdWlyZXMgdXRpbFxuICogQG1vZHVsZSBjcnlwdG8vcHVibGljX2tleS9lbGxpcHRpYy9lY2RoXG4gKi9cblxuZnVuY3Rpb24gYnVpbGRFY2RoUGFyYW0ocHVibGljX2FsZ28sIG9pZCwgY2lwaGVyX2FsZ28sIGhhc2hfYWxnbywgZmluZ2VycHJpbnQpIHtcbiAgdmFyIGtkZl9wYXJhbXMgPSBuZXcgX2tkZl9wYXJhbXMyLmRlZmF1bHQoW2hhc2hfYWxnbywgY2lwaGVyX2FsZ29dKTtcbiAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW29pZC53cml0ZSgpLCBuZXcgVWludDhBcnJheShbcHVibGljX2FsZ29dKSwga2RmX3BhcmFtcy53cml0ZSgpLCBfdXRpbDIuZGVmYXVsdC5zdHJfdG9fVWludDhBcnJheShcIkFub255bW91cyBTZW5kZXIgICAgXCIpLCBmaW5nZXJwcmludC5zdWJhcnJheSgwLCAyMCldKTtcbn1cblxuLy8gS2V5IERlcml2YXRpb24gRnVuY3Rpb24gKFJGQyA2NjM3KVxuZnVuY3Rpb24ga2RmKGhhc2hfYWxnbywgWCwgbGVuZ3RoLCBwYXJhbSkge1xuICByZXR1cm4gX2hhc2gyLmRlZmF1bHQuZGlnZXN0KGhhc2hfYWxnbywgX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbbmV3IFVpbnQ4QXJyYXkoWzAsIDAsIDAsIDFdKSwgbmV3IFVpbnQ4QXJyYXkoWCksIHBhcmFtXSkpLnN1YmFycmF5KDAsIGxlbmd0aCk7XG59ZXhwb3J0cy5kZWZhdWx0ID0geyBlbmNyeXB0OiBlbmNyeXB0LCBkZWNyeXB0OiBkZWNyeXB0IH07XG5cbn0se1wiLi4vLi4vLi4vZW51bXNcIjozNTksXCIuLi8uLi8uLi90eXBlL2tkZl9wYXJhbXNcIjozOTMsXCIuLi8uLi8uLi91dGlsXCI6Mzk4LFwiLi4vLi4vYWVzX2t3XCI6MzI2LFwiLi4vLi4vY2lwaGVyXCI6MzMyLFwiLi4vLi4vaGFzaFwiOjMzOCxcIi4vY3VydmVzXCI6MzQ2LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjozNSxcImJhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3JcIjo0MixcImJuLmpzXCI6NDR9XSwzNDg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvcicpO1xuXG52YXIgX3JlZ2VuZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZ2VuZXJhdG9yKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJyk7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3luY1RvR2VuZXJhdG9yMik7XG5cbi8qKlxuICogU2lnbiBhIG1lc3NhZ2UgdXNpbmcgdGhlIHByb3ZpZGVkIGtleVxuICogQHBhcmFtICB7bW9kdWxlOnR5cGUvb2lkfSAgIG9pZCAgICAgICBFbGxpcHRpYyBjdXJ2ZSBvYmplY3QgaWRlbnRpZmllclxuICogQHBhcmFtICB7bW9kdWxlOmVudW1zLmhhc2h9IGhhc2hfYWxnbyBIYXNoIGFsZ29yaXRobSB1c2VkIHRvIHNpZ25cbiAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9ICAgICAgICBtICAgICAgICAgTWVzc2FnZSB0byBzaWduXG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSAgICAgICAgZCAgICAgICAgIFByaXZhdGUga2V5IHVzZWQgdG8gc2lnbiB0aGUgbWVzc2FnZVxuICogQHJldHVybnMge3tyOiBVaW50OEFycmF5LFxuICogICAgICAgICAgICBzOiBVaW50OEFycmF5fX0gICAgICAgICAgICBTaWduYXR1cmUgb2YgdGhlIG1lc3NhZ2VcbiAqIEBhc3luY1xuICovXG52YXIgc2lnbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZShvaWQsIGhhc2hfYWxnbywgbSwgZCkge1xuICAgIHZhciBjdXJ2ZSwga2V5LCBzaWduYXR1cmU7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY3VydmUgPSBuZXcgX2N1cnZlczIuZGVmYXVsdChvaWQpO1xuICAgICAgICAgICAga2V5ID0gY3VydmUua2V5RnJvbVByaXZhdGUoZCk7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICAgIHJldHVybiBrZXkuc2lnbihtLCBoYXNoX2FsZ28pO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgc2lnbmF0dXJlID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIHsgcjogc2lnbmF0dXJlLnIudG9BcnJheUxpa2UoVWludDhBcnJheSksXG4gICAgICAgICAgICAgIHM6IHNpZ25hdHVyZS5zLnRvQXJyYXlMaWtlKFVpbnQ4QXJyYXkpIH0pO1xuXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gc2lnbihfeCwgX3gyLCBfeDMsIF94NCkge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogVmVyaWZpZXMgaWYgYSBzaWduYXR1cmUgaXMgdmFsaWQgZm9yIGEgbWVzc2FnZVxuICogQHBhcmFtICB7bW9kdWxlOnR5cGUvb2lkfSAgIG9pZCAgICAgICBFbGxpcHRpYyBjdXJ2ZSBvYmplY3QgaWRlbnRpZmllclxuICogQHBhcmFtICB7bW9kdWxlOmVudW1zLmhhc2h9IGhhc2hfYWxnbyBIYXNoIGFsZ29yaXRobSB1c2VkIGluIHRoZSBzaWduYXR1cmVcbiAqIEBwYXJhbSAge3tyOiBVaW50OEFycmF5LFxuICAgICAgICAgICAgIHM6IFVpbnQ4QXJyYXl9fSAgIHNpZ25hdHVyZSBTaWduYXR1cmUgdG8gdmVyaWZ5XG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSAgICAgICAgbSAgICAgICAgIE1lc3NhZ2UgdG8gdmVyaWZ5XG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSAgICAgICAgUSAgICAgICAgIFB1YmxpYyBrZXkgdXNlZCB0byB2ZXJpZnkgdGhlIG1lc3NhZ2VcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGFzeW5jXG4gKi9cbi8vIE9wZW5QR1AuanMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IERlY2VudHJhbFxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBJbXBsZW1lbnRhdGlvbiBvZiBFQ0RTQSBmb2xsb3dpbmcgUkZDNjYzNyBmb3IgT3BlbnBncGpzXG4gKiBAcmVxdWlyZXMgY3J5cHRvL3B1YmxpY19rZXkvZWxsaXB0aWMvY3VydmVcbiAqIEBtb2R1bGUgY3J5cHRvL3B1YmxpY19rZXkvZWxsaXB0aWMvZWNkc2FcbiAqL1xuXG52YXIgdmVyaWZ5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjIgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIob2lkLCBoYXNoX2FsZ28sIHNpZ25hdHVyZSwgbSwgUSkge1xuICAgIHZhciBjdXJ2ZSwga2V5O1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjdXJ2ZSA9IG5ldyBfY3VydmVzMi5kZWZhdWx0KG9pZCk7XG4gICAgICAgICAgICBrZXkgPSBjdXJ2ZS5rZXlGcm9tUHVibGljKFEpO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoJ3JldHVybicsIGtleS52ZXJpZnkobSwgc2lnbmF0dXJlLCBoYXNoX2FsZ28pKTtcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KF94NSwgX3g2LCBfeDcsIF94OCwgX3g5KSB7XG4gICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbnZhciBfY3VydmVzID0gX2RlcmVxXygnLi9jdXJ2ZXMnKTtcblxudmFyIF9jdXJ2ZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3VydmVzKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0geyBzaWduOiBzaWduLCB2ZXJpZnk6IHZlcmlmeSB9O1xuXG59LHtcIi4vY3VydmVzXCI6MzQ2LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjozNSxcImJhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3JcIjo0Mn1dLDM0OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcmVnZW5lcmF0b3IgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yJyk7XG5cbnZhciBfcmVnZW5lcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVnZW5lcmF0b3IpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IyID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3InKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FzeW5jVG9HZW5lcmF0b3IyKTtcblxuLyoqXG4gKiBTaWduIGEgbWVzc2FnZSB1c2luZyB0aGUgcHJvdmlkZWQga2V5XG4gKiBAcGFyYW0gIHttb2R1bGU6dHlwZS9vaWR9ICAgb2lkICAgICAgIEVsbGlwdGljIGN1cnZlIG9iamVjdCBpZGVudGlmaWVyXG4gKiBAcGFyYW0gIHttb2R1bGU6ZW51bXMuaGFzaH0gaGFzaF9hbGdvIEhhc2ggYWxnb3JpdGhtIHVzZWQgdG8gc2lnblxuICogQHBhcmFtICB7VWludDhBcnJheX0gICAgICAgIG0gICAgICAgICBNZXNzYWdlIHRvIHNpZ25cbiAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9ICAgICAgICBkICAgICAgICAgUHJpdmF0ZSBrZXkgdXNlZCB0byBzaWduXG4gKiBAcmV0dXJucyB7e1I6IFVpbnQ4QXJyYXksXG4gKiAgICAgICAgICAgIFM6IFVpbnQ4QXJyYXl9fSAgICAgICAgICAgIFNpZ25hdHVyZSBvZiB0aGUgbWVzc2FnZVxuICogQGFzeW5jXG4gKi9cbnZhciBzaWduID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlKG9pZCwgaGFzaF9hbGdvLCBtLCBkKSB7XG4gICAgdmFyIGN1cnZlLCBrZXksIHNpZ25hdHVyZTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjdXJ2ZSA9IG5ldyBfY3VydmVzMi5kZWZhdWx0KG9pZCk7XG4gICAgICAgICAgICBrZXkgPSBjdXJ2ZS5rZXlGcm9tU2VjcmV0KGQpO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7XG4gICAgICAgICAgICByZXR1cm4ga2V5LnNpZ24obSwgaGFzaF9hbGdvKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHNpZ25hdHVyZSA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCB7IFI6IG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZS5SZW5jb2RlZCgpKSxcbiAgICAgICAgICAgICAgUzogbmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlLlNlbmNvZGVkKCkpIH0pO1xuXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gc2lnbihfeCwgX3gyLCBfeDMsIF94NCkge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogVmVyaWZpZXMgaWYgYSBzaWduYXR1cmUgaXMgdmFsaWQgZm9yIGEgbWVzc2FnZVxuICogQHBhcmFtICB7bW9kdWxlOnR5cGUvb2lkfSAgIG9pZCAgICAgICBFbGxpcHRpYyBjdXJ2ZSBvYmplY3QgaWRlbnRpZmllclxuICogQHBhcmFtICB7bW9kdWxlOmVudW1zLmhhc2h9IGhhc2hfYWxnbyBIYXNoIGFsZ29yaXRobSB1c2VkIGluIHRoZSBzaWduYXR1cmVcbiAqIEBwYXJhbSAge3tSOiBVaW50OEFycmF5LFxuICAgICAgICAgICAgIFM6IFVpbnQ4QXJyYXl9fSAgIHNpZ25hdHVyZSBTaWduYXR1cmUgdG8gdmVyaWZ5IHRoZSBtZXNzYWdlXG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSAgICAgICAgbSAgICAgICAgIE1lc3NhZ2UgdG8gdmVyaWZ5XG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSAgICAgICAgUSAgICAgICAgIFB1YmxpYyBrZXkgdXNlZCB0byB2ZXJpZnkgdGhlIG1lc3NhZ2VcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGFzeW5jXG4gKi9cbi8vIE9wZW5QR1AuanMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxOCBQcm90b24gVGVjaG5vbG9naWVzIEFHXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudGF0aW9uIG9mIEVkRFNBIGZvbGxvd2luZyBSRkM0ODgwYmlzLTAzIGZvciBPcGVuUEdQXG4gKiBAcmVxdWlyZXMgY3J5cHRvL3B1YmxpY19rZXkvZWxsaXB0aWMvY3VydmVcbiAqIEBtb2R1bGUgY3J5cHRvL3B1YmxpY19rZXkvZWxsaXB0aWMvZWRkc2FcbiAqL1xuXG52YXIgdmVyaWZ5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjIgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIob2lkLCBoYXNoX2FsZ28sIHNpZ25hdHVyZSwgbSwgUSkge1xuICAgIHZhciBjdXJ2ZSwga2V5O1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjdXJ2ZSA9IG5ldyBfY3VydmVzMi5kZWZhdWx0KG9pZCk7XG4gICAgICAgICAgICBrZXkgPSBjdXJ2ZS5rZXlGcm9tUHVibGljKFEpO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoJ3JldHVybicsIGtleS52ZXJpZnkobSwgc2lnbmF0dXJlLCBoYXNoX2FsZ28pKTtcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KF94NSwgX3g2LCBfeDcsIF94OCwgX3g5KSB7XG4gICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbnZhciBfY3VydmVzID0gX2RlcmVxXygnLi9jdXJ2ZXMnKTtcblxudmFyIF9jdXJ2ZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3VydmVzKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0geyBzaWduOiBzaWduLCB2ZXJpZnk6IHZlcmlmeSB9O1xuXG59LHtcIi4vY3VydmVzXCI6MzQ2LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjozNSxcImJhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3JcIjo0Mn1dLDM1MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3VydmVzID0gX2RlcmVxXygnLi9jdXJ2ZXMnKTtcblxudmFyIF9jdXJ2ZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3VydmVzKTtcblxudmFyIF9lY2RzYSA9IF9kZXJlcV8oJy4vZWNkc2EnKTtcblxudmFyIF9lY2RzYTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lY2RzYSk7XG5cbnZhciBfZWRkc2EgPSBfZGVyZXFfKCcuL2VkZHNhJyk7XG5cbnZhciBfZWRkc2EyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWRkc2EpO1xuXG52YXIgX2VjZGggPSBfZGVyZXFfKCcuL2VjZGgnKTtcblxudmFyIF9lY2RoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VjZGgpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vLyBPcGVuUEdQLmpzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBEZWNlbnRyYWxcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgRnVuY3Rpb25zIHRvIGFjY2VzcyBFbGxpcHRpYyBDdXJ2ZSBDcnlwdG9ncmFwaHlcbiAqIEBzZWUgbW9kdWxlOmNyeXB0by9wdWJsaWNfa2V5L2VsbGlwdGljL2N1cnZlXG4gKiBAc2VlIG1vZHVsZTpjcnlwdG8vcHVibGljX2tleS9lbGxpcHRpYy9lY2RoXG4gKiBAc2VlIG1vZHVsZTpjcnlwdG8vcHVibGljX2tleS9lbGxpcHRpYy9lY2RzYVxuICogQHNlZSBtb2R1bGU6Y3J5cHRvL3B1YmxpY19rZXkvZWxsaXB0aWMvZWRkc2FcbiAqIEBtb2R1bGUgY3J5cHRvL3B1YmxpY19rZXkvZWxsaXB0aWNcbiAqL1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIEN1cnZlOiBfY3VydmVzMi5kZWZhdWx0LCBlY2RoOiBfZWNkaDIuZGVmYXVsdCwgZWNkc2E6IF9lY2RzYTIuZGVmYXVsdCwgZWRkc2E6IF9lZGRzYTIuZGVmYXVsdCwgZ2VuZXJhdGU6IF9jdXJ2ZXMuZ2VuZXJhdGUsIGdldFByZWZlcnJlZEhhc2hBbGdvOiBfY3VydmVzLmdldFByZWZlcnJlZEhhc2hBbGdvXG59O1xuXG59LHtcIi4vY3VydmVzXCI6MzQ2LFwiLi9lY2RoXCI6MzQ3LFwiLi9lY2RzYVwiOjM0OCxcIi4vZWRkc2FcIjozNDl9XSwzNTE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvcicpO1xuXG52YXIgX3JlZ2VuZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZ2VuZXJhdG9yKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJyk7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3luY1RvR2VuZXJhdG9yMik7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgICAgICAgICAgICAgICAgICAgICAvL1xuLy8gICBIZWxwZXIgZnVuY3Rpb25zICAgLy9cbi8vICAgICAgICAgICAgICAgICAgICAgIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cbnZhciB3ZWJTaWduID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjMgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMoY3VydmUsIGhhc2hfYWxnbywgbWVzc2FnZSwga2V5UGFpcikge1xuICAgIHZhciBsZW4sIGtleSwgc2lnbmF0dXJlO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBsZW4gPSBjdXJ2ZS5wYXlsb2FkU2l6ZTtcbiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMztcbiAgICAgICAgICAgIHJldHVybiB3ZWJDcnlwdG8uaW1wb3J0S2V5KFwiandrXCIsIHtcbiAgICAgICAgICAgICAgXCJrdHlcIjogXCJFQ1wiLFxuICAgICAgICAgICAgICBcImNydlwiOiBfY3VydmVzLndlYkN1cnZlc1tjdXJ2ZS5uYW1lXSxcbiAgICAgICAgICAgICAgXCJ4XCI6IF91dGlsMi5kZWZhdWx0LlVpbnQ4QXJyYXlfdG9fYjY0KG5ldyBVaW50OEFycmF5KGtleVBhaXIuZ2V0UHVibGljKCkuZ2V0WCgpLnRvQXJyYXkoJ2JlJywgbGVuKSksIHRydWUpLFxuICAgICAgICAgICAgICBcInlcIjogX3V0aWwyLmRlZmF1bHQuVWludDhBcnJheV90b19iNjQobmV3IFVpbnQ4QXJyYXkoa2V5UGFpci5nZXRQdWJsaWMoKS5nZXRZKCkudG9BcnJheSgnYmUnLCBsZW4pKSwgdHJ1ZSksXG4gICAgICAgICAgICAgIFwiZFwiOiBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX2I2NChuZXcgVWludDhBcnJheShrZXlQYWlyLmdldFByaXZhdGUoKS50b0FycmF5KCdiZScsIGxlbikpLCB0cnVlKSxcbiAgICAgICAgICAgICAgXCJ1c2VcIjogXCJzaWdcIixcbiAgICAgICAgICAgICAgXCJraWRcIjogXCJFQ0RTQSBQcml2YXRlIEtleVwiXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIFwibmFtZVwiOiBcIkVDRFNBXCIsXG4gICAgICAgICAgICAgIFwibmFtZWRDdXJ2ZVwiOiBfY3VydmVzLndlYkN1cnZlc1tjdXJ2ZS5uYW1lXSxcbiAgICAgICAgICAgICAgXCJoYXNoXCI6IHsgbmFtZTogX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LndlYkhhc2gsIGN1cnZlLmhhc2gpIH1cbiAgICAgICAgICAgIH0sIGZhbHNlLCBbXCJzaWduXCJdKTtcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGtleSA9IF9jb250ZXh0My5zZW50O1xuICAgICAgICAgICAgX2NvbnRleHQzLnQwID0gVWludDhBcnJheTtcbiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNztcbiAgICAgICAgICAgIHJldHVybiB3ZWJDcnlwdG8uc2lnbih7XG4gICAgICAgICAgICAgIFwibmFtZVwiOiAnRUNEU0EnLFxuICAgICAgICAgICAgICBcIm5hbWVkQ3VydmVcIjogX2N1cnZlcy53ZWJDdXJ2ZXNbY3VydmUubmFtZV0sXG4gICAgICAgICAgICAgIFwiaGFzaFwiOiB7IG5hbWU6IF9lbnVtczIuZGVmYXVsdC5yZWFkKF9lbnVtczIuZGVmYXVsdC53ZWJIYXNoLCBoYXNoX2FsZ28pIH1cbiAgICAgICAgICAgIH0sIGtleSwgbWVzc2FnZSk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBfY29udGV4dDMudDEgPSBfY29udGV4dDMuc2VudDtcbiAgICAgICAgICAgIHNpZ25hdHVyZSA9IG5ldyBfY29udGV4dDMudDAoX2NvbnRleHQzLnQxKTtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCdyZXR1cm4nLCB7XG4gICAgICAgICAgICAgIHI6IG5ldyBfYm4yLmRlZmF1bHQoc2lnbmF0dXJlLnNsaWNlKDAsIGxlbikpLFxuICAgICAgICAgICAgICBzOiBuZXcgX2JuMi5kZWZhdWx0KHNpZ25hdHVyZS5zbGljZShsZW4sIGxlbiA8PCAxKSlcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMywgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gd2ViU2lnbihfeDYsIF94NywgX3g4LCBfeDkpIHtcbiAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxudmFyIHdlYlZlcmlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWY0ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KGN1cnZlLCBoYXNoX2FsZ28sIF9yZWY1LCBtZXNzYWdlLCBwdWJsaWNLZXkpIHtcbiAgICB2YXIgciA9IF9yZWY1LnIsXG4gICAgICAgIHMgPSBfcmVmNS5zO1xuICAgIHZhciBsZW4sIGtleSwgc2lnbmF0dXJlO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBsZW4gPSBjdXJ2ZS5wYXlsb2FkU2l6ZTtcbiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMztcbiAgICAgICAgICAgIHJldHVybiB3ZWJDcnlwdG8uaW1wb3J0S2V5KFwiandrXCIsIHtcbiAgICAgICAgICAgICAgXCJrdHlcIjogXCJFQ1wiLFxuICAgICAgICAgICAgICBcImNydlwiOiBfY3VydmVzLndlYkN1cnZlc1tjdXJ2ZS5uYW1lXSxcbiAgICAgICAgICAgICAgXCJ4XCI6IF91dGlsMi5kZWZhdWx0LlVpbnQ4QXJyYXlfdG9fYjY0KG5ldyBVaW50OEFycmF5KHB1YmxpY0tleS5nZXRYKCkudG9BcnJheSgnYmUnLCBsZW4pKSwgdHJ1ZSksXG4gICAgICAgICAgICAgIFwieVwiOiBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX2I2NChuZXcgVWludDhBcnJheShwdWJsaWNLZXkuZ2V0WSgpLnRvQXJyYXkoJ2JlJywgbGVuKSksIHRydWUpLFxuICAgICAgICAgICAgICBcInVzZVwiOiBcInNpZ1wiLFxuICAgICAgICAgICAgICBcImtpZFwiOiBcIkVDRFNBIFB1YmxpYyBLZXlcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBcIm5hbWVcIjogXCJFQ0RTQVwiLFxuICAgICAgICAgICAgICBcIm5hbWVkQ3VydmVcIjogX2N1cnZlcy53ZWJDdXJ2ZXNbY3VydmUubmFtZV0sXG4gICAgICAgICAgICAgIFwiaGFzaFwiOiB7IG5hbWU6IF9lbnVtczIuZGVmYXVsdC5yZWFkKF9lbnVtczIuZGVmYXVsdC53ZWJIYXNoLCBjdXJ2ZS5oYXNoKSB9XG4gICAgICAgICAgICB9LCBmYWxzZSwgW1widmVyaWZ5XCJdKTtcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGtleSA9IF9jb250ZXh0NC5zZW50O1xuICAgICAgICAgICAgc2lnbmF0dXJlID0gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbbmV3IFVpbnQ4QXJyYXkobGVuIC0gci5sZW5ndGgpLCByLCBuZXcgVWludDhBcnJheShsZW4gLSBzLmxlbmd0aCksIHNdKS5idWZmZXI7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdCgncmV0dXJuJywgd2ViQ3J5cHRvLnZlcmlmeSh7XG4gICAgICAgICAgICAgIFwibmFtZVwiOiAnRUNEU0EnLFxuICAgICAgICAgICAgICBcIm5hbWVkQ3VydmVcIjogX2N1cnZlcy53ZWJDdXJ2ZXNbY3VydmUubmFtZV0sXG4gICAgICAgICAgICAgIFwiaGFzaFwiOiB7IG5hbWU6IF9lbnVtczIuZGVmYXVsdC5yZWFkKF9lbnVtczIuZGVmYXVsdC53ZWJIYXNoLCBoYXNoX2FsZ28pIH1cbiAgICAgICAgICAgIH0sIGtleSwgc2lnbmF0dXJlLCBtZXNzYWdlKSk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTQsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHdlYlZlcmlmeShfeDEwLCBfeDExLCBfeDEyLCBfeDEzLCBfeDE0KSB7XG4gICAgcmV0dXJuIF9yZWY0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbnZhciBub2RlU2lnbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWY2ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KGN1cnZlLCBoYXNoX2FsZ28sIG1lc3NhZ2UsIGtleVBhaXIpIHtcbiAgICB2YXIgc2lnbiwga2V5O1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNSQoX2NvbnRleHQ1KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NS5wcmV2ID0gX2NvbnRleHQ1Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBzaWduID0gbm9kZUNyeXB0by5jcmVhdGVTaWduKF9lbnVtczIuZGVmYXVsdC5yZWFkKF9lbnVtczIuZGVmYXVsdC5oYXNoLCBoYXNoX2FsZ28pKTtcblxuICAgICAgICAgICAgc2lnbi53cml0ZShtZXNzYWdlKTtcbiAgICAgICAgICAgIHNpZ24uZW5kKCk7XG5cbiAgICAgICAgICAgIGtleSA9IEVDUHJpdmF0ZUtleS5lbmNvZGUoe1xuICAgICAgICAgICAgICB2ZXJzaW9uOiAxLFxuICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBjdXJ2ZS5vaWQsXG4gICAgICAgICAgICAgIHByaXZhdGVLZXk6IGtleVBhaXIuZ2V0UHJpdmF0ZSgpLnRvQXJyYXkoKSxcbiAgICAgICAgICAgICAgcHVibGljS2V5OiB7IHVudXNlZDogMCwgZGF0YToga2V5UGFpci5nZXRQdWJsaWMoKS5lbmNvZGUoKSB9XG4gICAgICAgICAgICB9LCAncGVtJywge1xuICAgICAgICAgICAgICBsYWJlbDogJ0VDIFBSSVZBVEUgS0VZJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LmFicnVwdCgncmV0dXJuJywgRUNEU0FTaWduYXR1cmUuZGVjb2RlKHNpZ24uc2lnbihrZXkpLCAnZGVyJykpO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWU1LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBub2RlU2lnbihfeDE1LCBfeDE2LCBfeDE3LCBfeDE4KSB7XG4gICAgcmV0dXJuIF9yZWY2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbnZhciBub2RlVmVyaWZ5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjcgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTYoY3VydmUsIGhhc2hfYWxnbywgX3JlZjgsIG1lc3NhZ2UsIHB1YmxpY0tleSkge1xuICAgIHZhciByID0gX3JlZjgucixcbiAgICAgICAgcyA9IF9yZWY4LnM7XG4gICAgdmFyIHZlcmlmeSwga2V5LCBzaWduYXR1cmU7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWU2JChfY29udGV4dDYpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQ2LnByZXYgPSBfY29udGV4dDYubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHZlcmlmeSA9IG5vZGVDcnlwdG8uY3JlYXRlVmVyaWZ5KF9lbnVtczIuZGVmYXVsdC5yZWFkKF9lbnVtczIuZGVmYXVsdC5oYXNoLCBoYXNoX2FsZ28pKTtcblxuICAgICAgICAgICAgdmVyaWZ5LndyaXRlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgdmVyaWZ5LmVuZCgpO1xuXG4gICAgICAgICAgICBrZXkgPSBTdWJqZWN0UHVibGljS2V5SW5mby5lbmNvZGUoe1xuICAgICAgICAgICAgICBhbGdvcml0aG06IHtcbiAgICAgICAgICAgICAgICBhbGdvcml0aG06IFsxLCAyLCA4NDAsIDEwMDQ1LCAyLCAxXSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBjdXJ2ZS5vaWRcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgc3ViamVjdFB1YmxpY0tleTogeyB1bnVzZWQ6IDAsIGRhdGE6IHB1YmxpY0tleS5lbmNvZGUoKSB9XG4gICAgICAgICAgICB9LCAncGVtJywge1xuICAgICAgICAgICAgICBsYWJlbDogJ1BVQkxJQyBLRVknXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNpZ25hdHVyZSA9IEVDRFNBU2lnbmF0dXJlLmVuY29kZSh7XG4gICAgICAgICAgICAgIHI6IG5ldyBfYm4yLmRlZmF1bHQociksIHM6IG5ldyBfYm4yLmRlZmF1bHQocylcbiAgICAgICAgICAgIH0sICdkZXInKTtcbiAgICAgICAgICAgIF9jb250ZXh0Ni5wcmV2ID0gNTtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuYWJydXB0KCdyZXR1cm4nLCB2ZXJpZnkudmVyaWZ5KGtleSwgc2lnbmF0dXJlKSk7XG5cbiAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICBfY29udGV4dDYucHJldiA9IDk7XG4gICAgICAgICAgICBfY29udGV4dDYudDAgPSBfY29udGV4dDZbJ2NhdGNoJ10oNSk7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgncmV0dXJuJywgZmFsc2UpO1xuXG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlNiwgdGhpcywgW1s1LCA5XV0pO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIG5vZGVWZXJpZnkoX3gxOSwgX3gyMCwgX3gyMSwgX3gyMiwgX3gyMykge1xuICAgIHJldHVybiBfcmVmNy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vLyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgT3dlbiBTbWl0aCBodHRwczovL2dpdGh1Yi5jb20vb21zbWl0aFxuLy8gQWRhcHRlZCBvbiBGZWIgMjAxOCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9CcmlnaHRzcGFjZS9ub2RlLWp3ay10by1wZW0vXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXG52YXIgX2JuID0gX2RlcmVxXygnYm4uanMnKTtcblxudmFyIF9ibjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ibik7XG5cbnZhciBfY3VydmVzID0gX2RlcmVxXygnLi9jdXJ2ZXMnKTtcblxudmFyIF9oYXNoID0gX2RlcmVxXygnLi4vLi4vaGFzaCcpO1xuXG52YXIgX2hhc2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFzaCk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uLy4uLy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vLi4vLi4vZW51bXMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciB3ZWJDcnlwdG8gPSBfdXRpbDIuZGVmYXVsdC5nZXRXZWJDcnlwdG8oKTsgLy8gT3BlblBHUC5qcyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgRGVjZW50cmFsXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFdyYXBwZXIgZm9yIGEgS2V5UGFpciBvZiBhbiBFbGxpcHRpYyBDdXJ2ZVxuICogQHJlcXVpcmVzIGJuLmpzXG4gKiBAcmVxdWlyZXMgY3J5cHRvL3B1YmxpY19rZXkvZWxsaXB0aWMvY3VydmVzXG4gKiBAcmVxdWlyZXMgY3J5cHRvL2hhc2hcbiAqIEByZXF1aXJlcyB1dGlsXG4gKiBAcmVxdWlyZXMgZW51bXNcbiAqIEByZXF1aXJlcyBhc24xLmpzXG4gKiBAbW9kdWxlIGNyeXB0by9wdWJsaWNfa2V5L2VsbGlwdGljL2tleVxuICovXG5cbnZhciBub2RlQ3J5cHRvID0gX3V0aWwyLmRlZmF1bHQuZ2V0Tm9kZUNyeXB0bygpO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBLZXlQYWlyKGN1cnZlLCBvcHRpb25zKSB7XG4gIHRoaXMuY3VydmUgPSBjdXJ2ZTtcbiAgdGhpcy5rZXlUeXBlID0gY3VydmUuY3VydmUudHlwZSA9PT0gJ2Vkd2FyZHMnID8gX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lZGRzYSA6IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkc2E7XG4gIHRoaXMua2V5UGFpciA9IHRoaXMuY3VydmUuY3VydmUua2V5UGFpcihvcHRpb25zKTtcbn1cblxuS2V5UGFpci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZShtZXNzYWdlLCBoYXNoX2FsZ28pIHtcbiAgICB2YXIgc2lnbmF0dXJlLCBkaWdlc3Q7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgaWYgKCEodGhpcy5jdXJ2ZS53ZWIgJiYgX3V0aWwyLmRlZmF1bHQuZ2V0V2ViQ3J5cHRvKCkpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7XG4gICAgICAgICAgICByZXR1cm4gd2ViU2lnbih0aGlzLmN1cnZlLCBoYXNoX2FsZ28sIG1lc3NhZ2UsIHRoaXMua2V5UGFpcik7XG5cbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBzaWduYXR1cmUgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgncmV0dXJuJywgc2lnbmF0dXJlKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA4O1xuICAgICAgICAgICAgX2NvbnRleHQudDAgPSBfY29udGV4dFsnY2F0Y2gnXSgxKTtcblxuICAgICAgICAgICAgX3V0aWwyLmRlZmF1bHQucHJpbnRfZGVidWcoXCJCcm93c2VyIGRpZCBub3Qgc3VwcG9ydCBzaWduaW5nOiBcIiArIF9jb250ZXh0LnQwLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIGlmICghKHRoaXMuY3VydmUubm9kZSAmJiBfdXRpbDIuZGVmYXVsdC5nZXROb2RlQ3J5cHRvKCkpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIG5vZGVTaWduKHRoaXMuY3VydmUsIGhhc2hfYWxnbywgbWVzc2FnZSwgdGhpcy5rZXlQYWlyKSk7XG5cbiAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgZGlnZXN0ID0gdHlwZW9mIGhhc2hfYWxnbyA9PT0gJ3VuZGVmaW5lZCcgPyBtZXNzYWdlIDogX2hhc2gyLmRlZmF1bHQuZGlnZXN0KGhhc2hfYWxnbywgbWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCB0aGlzLmtleVBhaXIuc2lnbihkaWdlc3QpKTtcblxuICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCB0aGlzLCBbWzEsIDhdXSk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94LCBfeDIpIHtcbiAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG5LZXlQYWlyLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMihtZXNzYWdlLCBzaWduYXR1cmUsIGhhc2hfYWxnbykge1xuICAgIHZhciByZXN1bHQsIGRpZ2VzdDtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgaWYgKCEodGhpcy5jdXJ2ZS53ZWIgJiYgX3V0aWwyLmRlZmF1bHQuZ2V0V2ViQ3J5cHRvKCkpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDE7XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDQ7XG4gICAgICAgICAgICByZXR1cm4gd2ViVmVyaWZ5KHRoaXMuY3VydmUsIGhhc2hfYWxnbywgc2lnbmF0dXJlLCBtZXNzYWdlLCB0aGlzLmtleVBhaXIuZ2V0UHVibGljKCkpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgcmVzdWx0ID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywgcmVzdWx0KTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gODtcbiAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IF9jb250ZXh0MlsnY2F0Y2gnXSgxKTtcblxuICAgICAgICAgICAgX3V0aWwyLmRlZmF1bHQucHJpbnRfZGVidWcoXCJCcm93c2VyIGRpZCBub3Qgc3VwcG9ydCBzaWduaW5nOiBcIiArIF9jb250ZXh0Mi50MC5tZXNzYWdlKTtcblxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDE1O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgaWYgKCEodGhpcy5jdXJ2ZS5ub2RlICYmIF91dGlsMi5kZWZhdWx0LmdldE5vZGVDcnlwdG8oKSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCdyZXR1cm4nLCBub2RlVmVyaWZ5KHRoaXMuY3VydmUsIGhhc2hfYWxnbywgc2lnbmF0dXJlLCBtZXNzYWdlLCB0aGlzLmtleVBhaXIuZ2V0UHVibGljKCkpKTtcblxuICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICBkaWdlc3QgPSB0eXBlb2YgaGFzaF9hbGdvID09PSAndW5kZWZpbmVkJyA/IG1lc3NhZ2UgOiBfaGFzaDIuZGVmYXVsdC5kaWdlc3QoaGFzaF9hbGdvLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCdyZXR1cm4nLCB0aGlzLmtleVBhaXIudmVyaWZ5KGRpZ2VzdCwgc2lnbmF0dXJlKSk7XG5cbiAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyLCB0aGlzLCBbWzEsIDhdXSk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94MywgX3g0LCBfeDUpIHtcbiAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuS2V5UGFpci5wcm90b3R5cGUuZGVyaXZlID0gZnVuY3Rpb24gKHB1Yikge1xuICBpZiAodGhpcy5rZXlUeXBlID09PSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmVkZHNhKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdLZXkgY2FuIG9ubHkgYmUgdXNlZCBmb3IgRWREU0EnKTtcbiAgfVxuICByZXR1cm4gdGhpcy5rZXlQYWlyLmRlcml2ZShwdWIua2V5UGFpci5nZXRQdWJsaWMoKSk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRQdWJsaWMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjb21wYWN0ID0gdGhpcy5jdXJ2ZS5jdXJ2ZS5jdXJ2ZS50eXBlID09PSAnZWR3YXJkcycgfHwgdGhpcy5jdXJ2ZS5jdXJ2ZS5jdXJ2ZS50eXBlID09PSAnbW9udCc7XG4gIHJldHVybiB0aGlzLmtleVBhaXIuZ2V0UHVibGljKCdhcnJheScsIGNvbXBhY3QpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuZ2V0UHJpdmF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY3VydmUua2V5VHlwZSA9PT0gX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lZGRzYSkge1xuICAgIHJldHVybiB0aGlzLmtleVBhaXIuZ2V0U2VjcmV0KCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMua2V5UGFpci5nZXRQcml2YXRlKCkudG9BcnJheSgpO1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gS2V5UGFpcjtcbnZhciBhc24xID0gbm9kZUNyeXB0byA/IF9kZXJlcV8oJ2FzbjEuanMnKSA6IHVuZGVmaW5lZDtcblxudmFyIEVDRFNBU2lnbmF0dXJlID0gbm9kZUNyeXB0byA/IGFzbjEuZGVmaW5lKCdFQ0RTQVNpZ25hdHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoJ3InKS5pbnQoKSwgdGhpcy5rZXkoJ3MnKS5pbnQoKSk7XG59KSA6IHVuZGVmaW5lZDtcblxudmFyIEVDUHJpdmF0ZUtleSA9IG5vZGVDcnlwdG8gPyBhc24xLmRlZmluZSgnRUNQcml2YXRlS2V5JywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgndmVyc2lvbicpLmludCgpLCB0aGlzLmtleSgncHJpdmF0ZUtleScpLm9jdHN0cigpLCB0aGlzLmtleSgncGFyYW1ldGVycycpLmV4cGxpY2l0KDApLm9wdGlvbmFsKCkuYW55KCksIHRoaXMua2V5KCdwdWJsaWNLZXknKS5leHBsaWNpdCgxKS5vcHRpb25hbCgpLmJpdHN0cigpKTtcbn0pIDogdW5kZWZpbmVkO1xuXG52YXIgQWxnb3JpdGhtSWRlbnRpZmllciA9IG5vZGVDcnlwdG8gPyBhc24xLmRlZmluZSgnQWxnb3JpdGhtSWRlbnRpZmllcicsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoJ2FsZ29yaXRobScpLm9iamlkKCksIHRoaXMua2V5KCdwYXJhbWV0ZXJzJykub3B0aW9uYWwoKS5hbnkoKSk7XG59KSA6IHVuZGVmaW5lZDtcblxudmFyIFN1YmplY3RQdWJsaWNLZXlJbmZvID0gbm9kZUNyeXB0byA/IGFzbjEuZGVmaW5lKCdTdWJqZWN0UHVibGljS2V5SW5mbycsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoJ2FsZ29yaXRobScpLnVzZShBbGdvcml0aG1JZGVudGlmaWVyKSwgdGhpcy5rZXkoJ3N1YmplY3RQdWJsaWNLZXknKS5iaXRzdHIoKSk7XG59KSA6IHVuZGVmaW5lZDtcblxufSx7XCIuLi8uLi8uLi9lbnVtc1wiOjM1OSxcIi4uLy4uLy4uL3V0aWxcIjozOTgsXCIuLi8uLi9oYXNoXCI6MzM4LFwiLi9jdXJ2ZXNcIjozNDYsXCJhc24xLmpzXCI6XCJhc24xLmpzXCIsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiOjM1LFwiYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvclwiOjQyLFwiYm4uanNcIjo0NH1dLDM1MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcnNhID0gX2RlcmVxXygnLi9yc2EnKTtcblxudmFyIF9yc2EyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcnNhKTtcblxudmFyIF9lbGdhbWFsID0gX2RlcmVxXygnLi9lbGdhbWFsJyk7XG5cbnZhciBfZWxnYW1hbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGdhbWFsKTtcblxudmFyIF9lbGxpcHRpYyA9IF9kZXJlcV8oJy4vZWxsaXB0aWMnKTtcblxudmFyIF9lbGxpcHRpYzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGxpcHRpYyk7XG5cbnZhciBfZHNhID0gX2RlcmVxXygnLi9kc2EnKTtcblxudmFyIF9kc2EyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZHNhKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEFzeW1tZXRyaWMgY3J5cHRvZ3JhcGh5IGZ1bmN0aW9uc1xuICogQHJlcXVpcmVzIGNyeXB0by9wdWJsaWNfa2V5L2RzYVxuICogQHJlcXVpcmVzIGNyeXB0by9wdWJsaWNfa2V5L2VsZ2FtYWxcbiAqIEByZXF1aXJlcyBjcnlwdG8vcHVibGljX2tleS9lbGxpcHRpY1xuICogQHJlcXVpcmVzIGNyeXB0by9wdWJsaWNfa2V5L3JzYVxuICogQG1vZHVsZSBjcnlwdG8vcHVibGljX2tleVxuICovXG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgLyoqIEBzZWUgbW9kdWxlOmNyeXB0by9wdWJsaWNfa2V5L3JzYSAqL1xuICByc2E6IF9yc2EyLmRlZmF1bHQsXG4gIC8qKiBAc2VlIG1vZHVsZTpjcnlwdG8vcHVibGljX2tleS9lbGdhbWFsICovXG4gIGVsZ2FtYWw6IF9lbGdhbWFsMi5kZWZhdWx0LFxuICAvKiogQHNlZSBtb2R1bGU6Y3J5cHRvL3B1YmxpY19rZXkvZWxsaXB0aWMgKi9cbiAgZWxsaXB0aWM6IF9lbGxpcHRpYzIuZGVmYXVsdCxcbiAgLyoqIEBzZWUgbW9kdWxlOmNyeXB0by9wdWJsaWNfa2V5L2RzYSAqL1xuICBkc2E6IF9kc2EyLmRlZmF1bHRcbn07XG5cbn0se1wiLi9kc2FcIjozNDQsXCIuL2VsZ2FtYWxcIjozNDUsXCIuL2VsbGlwdGljXCI6MzUwLFwiLi9yc2FcIjozNTR9XSwzNTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvcicpO1xuXG52YXIgX3JlZ2VuZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZ2VuZXJhdG9yKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJyk7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3luY1RvR2VuZXJhdG9yMik7XG5cbi8qKlxuICogUHJvYmFiaWxpc3RpYyByYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuICogQHBhcmFtIHtJbnRlZ2VyfSBiaXRzIEJpdCBsZW5ndGggb2YgdGhlIHByaW1lXG4gKiBAcGFyYW0ge0JOfSAgICAgIGUgICAgT3B0aW9uYWwgUlNBIGV4cG9uZW50IHRvIGNoZWNrIGFnYWluc3QgdGhlIHByaW1lXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGsgICAgT3B0aW9uYWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgb2YgTWlsbGVyLVJhYmluIHRlc3RcbiAqIEByZXR1cm5zIEJOXG4gKiBAYXN5bmNcbiAqL1xudmFyIHJhbmRvbVByb2JhYmxlUHJpbWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoYml0cywgZSwgaykge1xuICAgIHZhciBtaW4sIHRoaXJ0eSwgYWRkcywgbiwgaTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBtaW4gPSBuZXcgX2JuMi5kZWZhdWx0KDEpLnNobG4oYml0cyAtIDEpO1xuICAgICAgICAgICAgdGhpcnR5ID0gbmV3IF9ibjIuZGVmYXVsdCgzMCk7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogV2UgY2FuIGF2b2lkIGFueSBtdWx0aXBsZXMgb2YgMyBhbmQgNSBieSBsb29raW5nIGF0IG4gbW9kIDMwXG4gICAgICAgICAgICAgKiBuIG1vZCAzMCA9IDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjlcbiAgICAgICAgICAgICAqIHRoZSBuZXh0IHBvc3NpYmxlIHByaW1lIGlzIG1vZCAzMDpcbiAgICAgICAgICAgICAqICAgICAgICAgICAgMSAgNyAgNyAgNyAgNyAgNyAgNyAxMSAxMSAxMSAxMSAxMyAxMyAxNyAxNyAxNyAxNyAxOSAxOSAyMyAyMyAyMyAyMyAyOSAyOSAyOSAyOSAyOSAyOSAxXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgYWRkcyA9IFsxLCA2LCA1LCA0LCAzLCAyLCAxLCA0LCAzLCAyLCAxLCAyLCAxLCA0LCAzLCAyLCAxLCAyLCAxLCA0LCAzLCAyLCAxLCA2LCA1LCA0LCAzLCAyLCAxLCAyXTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgcmV0dXJuIF9yYW5kb20yLmRlZmF1bHQuZ2V0UmFuZG9tQk4obWluLCBtaW4uc2hsbigxKSk7XG5cbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBuID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIGkgPSBuLm1vZCh0aGlydHkpLnRvTnVtYmVyKCk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBuLmlhZGRuKGFkZHNbaV0pO1xuICAgICAgICAgICAgaSA9IChpICsgYWRkc1tpXSkgJSBhZGRzLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIElmIHJlYWNoZWQgdGhlIG1heGltdW0sIGdvIGJhY2sgdG8gdGhlIG1pbmltdW0uXG4gICAgICAgICAgICBpZiAobi5iaXRMZW5ndGgoKSA+IGJpdHMpIHtcbiAgICAgICAgICAgICAgbiA9IG4ubW9kKG1pbi5zaGxuKDEpKS5pYWRkKG1pbik7XG4gICAgICAgICAgICAgIGkgPSBuLm1vZCh0aGlydHkpLnRvTnVtYmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuXG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjtcbiAgICAgICAgICAgIHJldHVybiBpc1Byb2JhYmxlUHJpbWUobiwgZSwgayk7XG5cbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgaWYgKCFfY29udGV4dC5zZW50KSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCBuKTtcblxuICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiByYW5kb21Qcm9iYWJsZVByaW1lKF94LCBfeDIsIF94Mykge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogUHJvYmFiaWxpc3RpYyBwcmltYWxpdHkgdGVzdGluZ1xuICogQHBhcmFtIHtCTn0gICAgICBuIE51bWJlciB0byB0ZXN0XG4gKiBAcGFyYW0ge0JOfSAgICAgIGUgT3B0aW9uYWwgUlNBIGV4cG9uZW50IHRvIGNoZWNrIGFnYWluc3QgdGhlIHByaW1lXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGsgT3B0aW9uYWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgb2YgTWlsbGVyLVJhYmluIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGFzeW5jXG4gKi9cblxuXG52YXIgaXNQcm9iYWJsZVByaW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjIgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIobiwgZSwgaykge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBpZiAoIShlICYmICFuLnN1Ym4oMSkuZ2NkKGUpLmVxbigxKSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoJ3JldHVybicsIGZhbHNlKTtcblxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGlmIChkaXZpc2lvblRlc3QobikpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoJ3JldHVybicsIGZhbHNlKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGlmIChmZXJtYXQobikpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA2O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoJ3JldHVybicsIGZhbHNlKTtcblxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gODtcbiAgICAgICAgICAgIHJldHVybiBtaWxsZXJSYWJpbihuLCBrKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIGlmIChfY29udGV4dDIuc2VudCkge1xuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoJ3JldHVybicsIGZhbHNlKTtcblxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywgdHJ1ZSk7XG5cbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBpc1Byb2JhYmxlUHJpbWUoX3g0LCBfeDUsIF94Nikge1xuICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgbiBpcyBwcm9iYWJseSBwcmltZSBvciBub3QgdXNpbmcgRmVybWF0J3MgdGVzdCB3aXRoIGIgPSAyLlxuICogRmFpbHMgaWYgYl4obi0xKSBtb2QgbiA9PT0gMS5cbiAqIEBwYXJhbSB7Qk59ICAgICAgbiBOdW1iZXIgdG8gdGVzdFxuICogQHBhcmFtIHtJbnRlZ2VyfSBiIE9wdGlvbmFsIEZlcm1hdCB0ZXN0IGJhc2VcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5cblxuLy8gTWlsbGVyLVJhYmluIC0gTWlsbGVyIFJhYmluIGFsZ29yaXRobSBmb3IgcHJpbWFsaXR5IHRlc3Rcbi8vIENvcHlyaWdodCBGZWRvciBJbmR1dG55LCAyMDE0LlxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBBZGFwdGVkIG9uIEphbiAyMDE4IGZyb20gdmVyc2lvbiA0LjAuMSBhdCBodHRwczovL2dpdGh1Yi5jb20vaW5kdXRueS9taWxsZXItcmFiaW5cblxuLy8gU2FtcGxlIHN5bnRheCBmb3IgRml4ZWQtQmFzZSBNaWxsZXItUmFiaW46XG4vLyBtaWxsZXJSYWJpbihuLCBrLCAoKSA9PiBuZXcgQk4oc21hbGxfcHJpbWVzW01hdGgucmFuZG9tKCkgKiBzbWFsbF9wcmltZXMubGVuZ3RoIHwgMF0pKVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgbiBpcyBwcm9iYWJseSBwcmltZSBvciBub3QgdXNpbmcgdGhlIE1pbGxlci1SYWJpbiB0ZXN0LlxuICogU2VlIEhBQyBSZW1hcmsgNC4yOC5cbiAqIEBwYXJhbSB7Qk59ICAgICAgIG4gICAgTnVtYmVyIHRvIHRlc3RcbiAqIEBwYXJhbSB7SW50ZWdlcn0gIGsgICAgT3B0aW9uYWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgb2YgTWlsbGVyLVJhYmluIHRlc3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJhbmQgT3B0aW9uYWwgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgcG90ZW50aWFsIHdpdG5lc3Nlc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAYXN5bmNcbiAqL1xudmFyIG1pbGxlclJhYmluID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjMgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMobiwgaywgcmFuZCkge1xuICAgIHZhciBsZW4sIHJlZCwgcm9uZSwgbjEsIHJuMSwgcywgZCwgYSwgeCwgaTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0Mykge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgbGVuID0gbi5iaXRMZW5ndGgoKTtcbiAgICAgICAgICAgIHJlZCA9IF9ibjIuZGVmYXVsdC5tb250KG4pO1xuICAgICAgICAgICAgcm9uZSA9IG5ldyBfYm4yLmRlZmF1bHQoMSkudG9SZWQocmVkKTtcblxuXG4gICAgICAgICAgICBpZiAoIWspIHtcbiAgICAgICAgICAgICAgayA9IE1hdGgubWF4KDEsIGxlbiAvIDQ4IHwgMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG4xID0gbi5zdWJuKDEpO1xuICAgICAgICAgICAgcm4xID0gbjEudG9SZWQocmVkKTtcblxuICAgICAgICAgICAgLy8gRmluZCBkIGFuZCBzLCAobiAtIDEpID0gKDIgXiBzKSAqIGQ7XG5cbiAgICAgICAgICAgIHMgPSAwO1xuXG4gICAgICAgICAgICB3aGlsZSAoIW4xLnRlc3RuKHMpKSB7XG4gICAgICAgICAgICAgIHMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGQgPSBuLnNocm4ocyk7XG5cbiAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICBpZiAoIShrID4gMCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAzNztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghcmFuZCkge1xuICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDE0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQzLnQwID0gcmFuZCgpO1xuICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxNztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMTY7XG4gICAgICAgICAgICByZXR1cm4gX3JhbmRvbTIuZGVmYXVsdC5nZXRSYW5kb21CTihuZXcgX2JuMi5kZWZhdWx0KDIpLCBuMSk7XG5cbiAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgX2NvbnRleHQzLnQwID0gX2NvbnRleHQzLnNlbnQ7XG5cbiAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgYSA9IF9jb250ZXh0My50MDtcbiAgICAgICAgICAgIHggPSBhLnRvUmVkKHJlZCkucmVkUG93KGQpO1xuXG4gICAgICAgICAgICBpZiAoISh4LmVxKHJvbmUpIHx8IHguZXEocm4xKSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAyMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCdjb250aW51ZScsIDM0KTtcblxuICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICBpID0gdm9pZCAwO1xuICAgICAgICAgICAgaSA9IDE7XG5cbiAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgaWYgKCEoaSA8IHMpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMzI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB4ID0geC5yZWRTcXIoKTtcblxuICAgICAgICAgICAgaWYgKCF4LmVxKHJvbmUpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgncmV0dXJuJywgZmFsc2UpO1xuXG4gICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgIGlmICgheC5lcShybjEpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgnYnJlYWsnLCAzMik7XG5cbiAgICAgICAgICBjYXNlIDI5OlxuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAyMztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgIGlmICghKGkgPT09IHMpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMzQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgncmV0dXJuJywgZmFsc2UpO1xuXG4gICAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICAgIGstLTtcbiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gOTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCdyZXR1cm4nLCB0cnVlKTtcblxuICAgICAgICAgIGNhc2UgMzg6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTMsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIG1pbGxlclJhYmluKF94NywgX3g4LCBfeDkpIHtcbiAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxudmFyIF9ibiA9IF9kZXJlcV8oJ2JuLmpzJyk7XG5cbnZhciBfYm4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYm4pO1xuXG52YXIgX3JhbmRvbSA9IF9kZXJlcV8oJy4uL3JhbmRvbScpO1xuXG52YXIgX3JhbmRvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yYW5kb20pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vLyBPcGVuUEdQLmpzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTggUHJvdG9uIFRlY2hub2xvZ2llcyBBR1xuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBBbGdvcml0aG1zIGZvciBwcm9iYWJpbGlzdGljIHJhbmRvbSBwcmltZSBnZW5lcmF0aW9uXG4gKiBAcmVxdWlyZXMgYm4uanNcbiAqIEByZXF1aXJlcyBjcnlwdG8vcmFuZG9tXG4gKiBAbW9kdWxlIGNyeXB0by9wdWJsaWNfa2V5L3ByaW1lXG4gKi9cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICByYW5kb21Qcm9iYWJsZVByaW1lOiByYW5kb21Qcm9iYWJsZVByaW1lLCBpc1Byb2JhYmxlUHJpbWU6IGlzUHJvYmFibGVQcmltZSwgZmVybWF0OiBmZXJtYXQsIG1pbGxlclJhYmluOiBtaWxsZXJSYWJpbiwgZGl2aXNpb25UZXN0OiBkaXZpc2lvblRlc3Rcbn07XG5mdW5jdGlvbiBmZXJtYXQobiwgYikge1xuICBiID0gYiB8fCBuZXcgX2JuMi5kZWZhdWx0KDIpO1xuICByZXR1cm4gYi50b1JlZChfYm4yLmRlZmF1bHQubW9udChuKSkucmVkUG93KG4uc3VibigxKSkuZnJvbVJlZCgpLmNtcG4oMSkgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGRpdmlzaW9uVGVzdChuKSB7XG4gIHJldHVybiBzbWFsbF9wcmltZXMuZXZlcnkoZnVuY3Rpb24gKG0pIHtcbiAgICByZXR1cm4gbi5tb2RuKG0pICE9PSAwO1xuICB9KTtcbn1cblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dwZy9saWJnY3J5cHQvYmxvYi9tYXN0ZXIvY2lwaGVyL3ByaW1lZ2VuLmNcbnZhciBzbWFsbF9wcmltZXMgPSBbNywgMTEsIDEzLCAxNywgMTksIDIzLCAyOSwgMzEsIDM3LCA0MSwgNDMsIDQ3LCA1MywgNTksIDYxLCA2NywgNzEsIDczLCA3OSwgODMsIDg5LCA5NywgMTAxLCAxMDMsIDEwNywgMTA5LCAxMTMsIDEyNywgMTMxLCAxMzcsIDEzOSwgMTQ5LCAxNTEsIDE1NywgMTYzLCAxNjcsIDE3MywgMTc5LCAxODEsIDE5MSwgMTkzLCAxOTcsIDE5OSwgMjExLCAyMjMsIDIyNywgMjI5LCAyMzMsIDIzOSwgMjQxLCAyNTEsIDI1NywgMjYzLCAyNjksIDI3MSwgMjc3LCAyODEsIDI4MywgMjkzLCAzMDcsIDMxMSwgMzEzLCAzMTcsIDMzMSwgMzM3LCAzNDcsIDM0OSwgMzUzLCAzNTksIDM2NywgMzczLCAzNzksIDM4MywgMzg5LCAzOTcsIDQwMSwgNDA5LCA0MTksIDQyMSwgNDMxLCA0MzMsIDQzOSwgNDQzLCA0NDksIDQ1NywgNDYxLCA0NjMsIDQ2NywgNDc5LCA0ODcsIDQ5MSwgNDk5LCA1MDMsIDUwOSwgNTIxLCA1MjMsIDU0MSwgNTQ3LCA1NTcsIDU2MywgNTY5LCA1NzEsIDU3NywgNTg3LCA1OTMsIDU5OSwgNjAxLCA2MDcsIDYxMywgNjE3LCA2MTksIDYzMSwgNjQxLCA2NDMsIDY0NywgNjUzLCA2NTksIDY2MSwgNjczLCA2NzcsIDY4MywgNjkxLCA3MDEsIDcwOSwgNzE5LCA3MjcsIDczMywgNzM5LCA3NDMsIDc1MSwgNzU3LCA3NjEsIDc2OSwgNzczLCA3ODcsIDc5NywgODA5LCA4MTEsIDgyMSwgODIzLCA4MjcsIDgyOSwgODM5LCA4NTMsIDg1NywgODU5LCA4NjMsIDg3NywgODgxLCA4ODMsIDg4NywgOTA3LCA5MTEsIDkxOSwgOTI5LCA5MzcsIDk0MSwgOTQ3LCA5NTMsIDk2NywgOTcxLCA5NzcsIDk4MywgOTkxLCA5OTcsIDEwMDksIDEwMTMsIDEwMTksIDEwMjEsIDEwMzEsIDEwMzMsIDEwMzksIDEwNDksIDEwNTEsIDEwNjEsIDEwNjMsIDEwNjksIDEwODcsIDEwOTEsIDEwOTMsIDEwOTcsIDExMDMsIDExMDksIDExMTcsIDExMjMsIDExMjksIDExNTEsIDExNTMsIDExNjMsIDExNzEsIDExODEsIDExODcsIDExOTMsIDEyMDEsIDEyMTMsIDEyMTcsIDEyMjMsIDEyMjksIDEyMzEsIDEyMzcsIDEyNDksIDEyNTksIDEyNzcsIDEyNzksIDEyODMsIDEyODksIDEyOTEsIDEyOTcsIDEzMDEsIDEzMDMsIDEzMDcsIDEzMTksIDEzMjEsIDEzMjcsIDEzNjEsIDEzNjcsIDEzNzMsIDEzODEsIDEzOTksIDE0MDksIDE0MjMsIDE0MjcsIDE0MjksIDE0MzMsIDE0MzksIDE0NDcsIDE0NTEsIDE0NTMsIDE0NTksIDE0NzEsIDE0ODEsIDE0ODMsIDE0ODcsIDE0ODksIDE0OTMsIDE0OTksIDE1MTEsIDE1MjMsIDE1MzEsIDE1NDMsIDE1NDksIDE1NTMsIDE1NTksIDE1NjcsIDE1NzEsIDE1NzksIDE1ODMsIDE1OTcsIDE2MDEsIDE2MDcsIDE2MDksIDE2MTMsIDE2MTksIDE2MjEsIDE2MjcsIDE2MzcsIDE2NTcsIDE2NjMsIDE2NjcsIDE2NjksIDE2OTMsIDE2OTcsIDE2OTksIDE3MDksIDE3MjEsIDE3MjMsIDE3MzMsIDE3NDEsIDE3NDcsIDE3NTMsIDE3NTksIDE3NzcsIDE3ODMsIDE3ODcsIDE3ODksIDE4MDEsIDE4MTEsIDE4MjMsIDE4MzEsIDE4NDcsIDE4NjEsIDE4NjcsIDE4NzEsIDE4NzMsIDE4NzcsIDE4NzksIDE4ODksIDE5MDEsIDE5MDcsIDE5MTMsIDE5MzEsIDE5MzMsIDE5NDksIDE5NTEsIDE5NzMsIDE5NzksIDE5ODcsIDE5OTMsIDE5OTcsIDE5OTksIDIwMDMsIDIwMTEsIDIwMTcsIDIwMjcsIDIwMjksIDIwMzksIDIwNTMsIDIwNjMsIDIwNjksIDIwODEsIDIwODMsIDIwODcsIDIwODksIDIwOTksIDIxMTEsIDIxMTMsIDIxMjksIDIxMzEsIDIxMzcsIDIxNDEsIDIxNDMsIDIxNTMsIDIxNjEsIDIxNzksIDIyMDMsIDIyMDcsIDIyMTMsIDIyMjEsIDIyMzcsIDIyMzksIDIyNDMsIDIyNTEsIDIyNjcsIDIyNjksIDIyNzMsIDIyODEsIDIyODcsIDIyOTMsIDIyOTcsIDIzMDksIDIzMTEsIDIzMzMsIDIzMzksIDIzNDEsIDIzNDcsIDIzNTEsIDIzNTcsIDIzNzEsIDIzNzcsIDIzODEsIDIzODMsIDIzODksIDIzOTMsIDIzOTksIDI0MTEsIDI0MTcsIDI0MjMsIDI0MzcsIDI0NDEsIDI0NDcsIDI0NTksIDI0NjcsIDI0NzMsIDI0NzcsIDI1MDMsIDI1MjEsIDI1MzEsIDI1MzksIDI1NDMsIDI1NDksIDI1NTEsIDI1NTcsIDI1NzksIDI1OTEsIDI1OTMsIDI2MDksIDI2MTcsIDI2MjEsIDI2MzMsIDI2NDcsIDI2NTcsIDI2NTksIDI2NjMsIDI2NzEsIDI2NzcsIDI2ODMsIDI2ODcsIDI2ODksIDI2OTMsIDI2OTksIDI3MDcsIDI3MTEsIDI3MTMsIDI3MTksIDI3MjksIDI3MzEsIDI3NDEsIDI3NDksIDI3NTMsIDI3NjcsIDI3NzcsIDI3ODksIDI3OTEsIDI3OTcsIDI4MDEsIDI4MDMsIDI4MTksIDI4MzMsIDI4MzcsIDI4NDMsIDI4NTEsIDI4NTcsIDI4NjEsIDI4NzksIDI4ODcsIDI4OTcsIDI5MDMsIDI5MDksIDI5MTcsIDI5MjcsIDI5MzksIDI5NTMsIDI5NTcsIDI5NjMsIDI5NjksIDI5NzEsIDI5OTksIDMwMDEsIDMwMTEsIDMwMTksIDMwMjMsIDMwMzcsIDMwNDEsIDMwNDksIDMwNjEsIDMwNjcsIDMwNzksIDMwODMsIDMwODksIDMxMDksIDMxMTksIDMxMjEsIDMxMzcsIDMxNjMsIDMxNjcsIDMxNjksIDMxODEsIDMxODcsIDMxOTEsIDMyMDMsIDMyMDksIDMyMTcsIDMyMjEsIDMyMjksIDMyNTEsIDMyNTMsIDMyNTcsIDMyNTksIDMyNzEsIDMyOTksIDMzMDEsIDMzMDcsIDMzMTMsIDMzMTksIDMzMjMsIDMzMjksIDMzMzEsIDMzNDMsIDMzNDcsIDMzNTksIDMzNjEsIDMzNzEsIDMzNzMsIDMzODksIDMzOTEsIDM0MDcsIDM0MTMsIDM0MzMsIDM0NDksIDM0NTcsIDM0NjEsIDM0NjMsIDM0NjcsIDM0NjksIDM0OTEsIDM0OTksIDM1MTEsIDM1MTcsIDM1MjcsIDM1MjksIDM1MzMsIDM1MzksIDM1NDEsIDM1NDcsIDM1NTcsIDM1NTksIDM1NzEsIDM1ODEsIDM1ODMsIDM1OTMsIDM2MDcsIDM2MTMsIDM2MTcsIDM2MjMsIDM2MzEsIDM2MzcsIDM2NDMsIDM2NTksIDM2NzEsIDM2NzMsIDM2NzcsIDM2OTEsIDM2OTcsIDM3MDEsIDM3MDksIDM3MTksIDM3MjcsIDM3MzMsIDM3MzksIDM3NjEsIDM3NjcsIDM3NjksIDM3NzksIDM3OTMsIDM3OTcsIDM4MDMsIDM4MjEsIDM4MjMsIDM4MzMsIDM4NDcsIDM4NTEsIDM4NTMsIDM4NjMsIDM4NzcsIDM4ODEsIDM4ODksIDM5MDcsIDM5MTEsIDM5MTcsIDM5MTksIDM5MjMsIDM5MjksIDM5MzEsIDM5NDMsIDM5NDcsIDM5NjcsIDM5ODksIDQwMDEsIDQwMDMsIDQwMDcsIDQwMTMsIDQwMTksIDQwMjEsIDQwMjcsIDQwNDksIDQwNTEsIDQwNTcsIDQwNzMsIDQwNzksIDQwOTEsIDQwOTMsIDQwOTksIDQxMTEsIDQxMjcsIDQxMjksIDQxMzMsIDQxMzksIDQxNTMsIDQxNTcsIDQxNTksIDQxNzcsIDQyMDEsIDQyMTEsIDQyMTcsIDQyMTksIDQyMjksIDQyMzEsIDQyNDEsIDQyNDMsIDQyNTMsIDQyNTksIDQyNjEsIDQyNzEsIDQyNzMsIDQyODMsIDQyODksIDQyOTcsIDQzMjcsIDQzMzcsIDQzMzksIDQzNDksIDQzNTcsIDQzNjMsIDQzNzMsIDQzOTEsIDQzOTcsIDQ0MDksIDQ0MjEsIDQ0MjMsIDQ0NDEsIDQ0NDcsIDQ0NTEsIDQ0NTcsIDQ0NjMsIDQ0ODEsIDQ0ODMsIDQ0OTMsIDQ1MDcsIDQ1MTMsIDQ1MTcsIDQ1MTksIDQ1MjMsIDQ1NDcsIDQ1NDksIDQ1NjEsIDQ1NjcsIDQ1ODMsIDQ1OTEsIDQ1OTcsIDQ2MDMsIDQ2MjEsIDQ2MzcsIDQ2MzksIDQ2NDMsIDQ2NDksIDQ2NTEsIDQ2NTcsIDQ2NjMsIDQ2NzMsIDQ2NzksIDQ2OTEsIDQ3MDMsIDQ3MjEsIDQ3MjMsIDQ3MjksIDQ3MzMsIDQ3NTEsIDQ3NTksIDQ3ODMsIDQ3ODcsIDQ3ODksIDQ3OTMsIDQ3OTksIDQ4MDEsIDQ4MTMsIDQ4MTcsIDQ4MzEsIDQ4NjEsIDQ4NzEsIDQ4NzcsIDQ4ODksIDQ5MDMsIDQ5MDksIDQ5MTksIDQ5MzEsIDQ5MzMsIDQ5MzcsIDQ5NDMsIDQ5NTEsIDQ5NTcsIDQ5NjcsIDQ5NjksIDQ5NzMsIDQ5ODcsIDQ5OTMsIDQ5OTldO1xuXG59LHtcIi4uL3JhbmRvbVwiOjM1NSxcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI6MzUsXCJiYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yXCI6NDIsXCJibi5qc1wiOjQ0fV0sMzU0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3InKTtcblxudmFyIF9yZWdlbmVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWdlbmVyYXRvcik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvcicpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXN5bmNUb0dlbmVyYXRvcjIpO1xuXG52YXIgX3Byb21pc2UgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvcHJvbWlzZScpO1xuXG52YXIgX3Byb21pc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvbWlzZSk7XG5cbnZhciBfYm4gPSBfZGVyZXFfKCdibi5qcycpO1xuXG52YXIgX2JuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2JuKTtcblxudmFyIF9wcmltZSA9IF9kZXJlcV8oJy4vcHJpbWUnKTtcblxudmFyIF9wcmltZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcmltZSk7XG5cbnZhciBfcmFuZG9tID0gX2RlcmVxXygnLi4vcmFuZG9tJyk7XG5cbnZhciBfcmFuZG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JhbmRvbSk7XG5cbnZhciBfY29uZmlnID0gX2RlcmVxXygnLi4vLi4vY29uZmlnJyk7XG5cbnZhciBfY29uZmlnMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbmZpZyk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uLy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vLyBIZWxwZXIgZm9yIElFMTEgS2V5T3BlcmF0aW9uIG9iamVjdHNcbmZ1bmN0aW9uIHByb21pc2lmeUlFMTFPcChrZXlPYmosIGVycikge1xuICBpZiAodHlwZW9mIGtleU9iai50aGVuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSUUxMSBLZXlPcGVyYXRpb25cbiAgICByZXR1cm4gbmV3IF9wcm9taXNlMi5kZWZhdWx0KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGtleU9iai5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGVycikpO1xuICAgICAgfTtcbiAgICAgIGtleU9iai5vbmNvbXBsZXRlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4ga2V5T2JqO1xufSAvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgUlNBIGltcGxlbWVudGF0aW9uXG4gKiBAcmVxdWlyZXMgYm4uanNcbiAqIEByZXF1aXJlcyBjcnlwdG8vcHVibGljX2tleS9wcmltZVxuICogQHJlcXVpcmVzIGNyeXB0by9yYW5kb21cbiAqIEByZXF1aXJlcyBjb25maWdcbiAqIEByZXF1aXJlcyB1dGlsXG4gKiBAbW9kdWxlIGNyeXB0by9wdWJsaWNfa2V5L3JzYVxuICovXG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgLyoqIENyZWF0ZSBzaWduYXR1cmVcbiAgICogQHBhcmFtIHtCTn0gbSBtZXNzYWdlXG4gICAqIEBwYXJhbSB7Qk59IG4gUlNBIHB1YmxpYyBtb2R1bHVzXG4gICAqIEBwYXJhbSB7Qk59IGUgUlNBIHB1YmxpYyBleHBvbmVudFxuICAgKiBAcGFyYW0ge0JOfSBkIFJTQSBwcml2YXRlIGV4cG9uZW50XG4gICAqIEByZXR1cm5zIHtCTn0gUlNBIFNpZ25hdHVyZVxuICAgKiBAYXN5bmNcbiAgICovXG4gIHNpZ246IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlKG0sIG4sIGUsIGQpIHtcbiAgICAgIHZhciBucmVkO1xuICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBpZiAoIShuLmNtcChtKSA8PSAwKSkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIHNpemUgY2Fubm90IGV4Y2VlZCBtb2R1bHVzIHNpemUnKTtcblxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBucmVkID0gbmV3IF9ibjIuZGVmYXVsdC5yZWQobik7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIG0udG9SZWQobnJlZCkucmVkUG93KGQpLnRvQXJyYXlMaWtlKFVpbnQ4QXJyYXksICdiZScsIG4uYnl0ZUxlbmd0aCgpKSk7XG5cbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgICB9KSk7XG5cbiAgICBmdW5jdGlvbiBzaWduKF94LCBfeDIsIF94MywgX3g0KSB7XG4gICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiBzaWduO1xuICB9KCksXG5cbiAgLyoqXG4gICAqIFZlcmlmeSBzaWduYXR1cmVcbiAgICogQHBhcmFtIHtCTn0gcyBzaWduYXR1cmVcbiAgICogQHBhcmFtIHtCTn0gbiBSU0EgcHVibGljIG1vZHVsdXNcbiAgICogQHBhcmFtIHtCTn0gZSBSU0EgcHVibGljIGV4cG9uZW50XG4gICAqIEByZXR1cm5zIHtCTn1cbiAgICogQGFzeW5jXG4gICAqL1xuICB2ZXJpZnk6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjIgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIocywgbiwgZSkge1xuICAgICAgdmFyIG5yZWQ7XG4gICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBpZiAoIShuLmNtcChzKSA8PSAwKSkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2lnbmF0dXJlIHNpemUgY2Fubm90IGV4Y2VlZCBtb2R1bHVzIHNpemUnKTtcblxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBucmVkID0gbmV3IF9ibjIuZGVmYXVsdC5yZWQobik7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCdyZXR1cm4nLCBzLnRvUmVkKG5yZWQpLnJlZFBvdyhlKS50b0FycmF5TGlrZShVaW50OEFycmF5LCAnYmUnLCBuLmJ5dGVMZW5ndGgoKSkpO1xuXG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIF9jYWxsZWUyLCB0aGlzKTtcbiAgICB9KSk7XG5cbiAgICBmdW5jdGlvbiB2ZXJpZnkoX3g1LCBfeDYsIF94Nykge1xuICAgICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlcmlmeTtcbiAgfSgpLFxuXG4gIC8qKlxuICAgKiBFbmNyeXB0IG1lc3NhZ2VcbiAgICogQHBhcmFtIHtCTn0gbSBtZXNzYWdlXG4gICAqIEBwYXJhbSB7Qk59IG4gUlNBIHB1YmxpYyBtb2R1bHVzXG4gICAqIEBwYXJhbSB7Qk59IGUgUlNBIHB1YmxpYyBleHBvbmVudFxuICAgKiBAcmV0dXJucyB7Qk59IFJTQSBDaXBoZXJ0ZXh0XG4gICAqIEBhc3luY1xuICAgKi9cbiAgZW5jcnlwdDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMyA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhtLCBuLCBlKSB7XG4gICAgICB2YXIgbnJlZDtcbiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIGlmICghKG4uY21wKG0pIDw9IDApKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIHNpemUgY2Fubm90IGV4Y2VlZCBtb2R1bHVzIHNpemUnKTtcblxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBucmVkID0gbmV3IF9ibjIuZGVmYXVsdC5yZWQobik7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCdyZXR1cm4nLCBtLnRvUmVkKG5yZWQpLnJlZFBvdyhlKS50b0FycmF5TGlrZShVaW50OEFycmF5LCAnYmUnLCBuLmJ5dGVMZW5ndGgoKSkpO1xuXG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIF9jYWxsZWUzLCB0aGlzKTtcbiAgICB9KSk7XG5cbiAgICBmdW5jdGlvbiBlbmNyeXB0KF94OCwgX3g5LCBfeDEwKSB7XG4gICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW5jcnlwdDtcbiAgfSgpLFxuXG4gIC8qKlxuICAgKiBEZWNyeXB0IFJTQSBtZXNzYWdlXG4gICAqIEBwYXJhbSB7Qk59IG0gbWVzc2FnZVxuICAgKiBAcGFyYW0ge0JOfSBuIFJTQSBwdWJsaWMgbW9kdWx1c1xuICAgKiBAcGFyYW0ge0JOfSBlIFJTQSBwdWJsaWMgZXhwb25lbnRcbiAgICogQHBhcmFtIHtCTn0gZCBSU0EgcHJpdmF0ZSBleHBvbmVudFxuICAgKiBAcGFyYW0ge0JOfSBwIFJTQSBwcml2YXRlIHByaW1lIHBcbiAgICogQHBhcmFtIHtCTn0gcSBSU0EgcHJpdmF0ZSBwcmltZSBxXG4gICAqIEBwYXJhbSB7Qk59IHUgUlNBIHByaXZhdGUgaW52ZXJzZSBvZiBwcmltZSBxXG4gICAqIEByZXR1cm5zIHtCTn0gUlNBIFBsYWludGV4dFxuICAgKiBAYXN5bmNcbiAgICovXG4gIGRlY3J5cHQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjQgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQobSwgbiwgZSwgZCwgcCwgcSwgdSkge1xuICAgICAgdmFyIGRxLCBkcCwgcHJlZCwgcXJlZCwgbnJlZCwgYmxpbmRlciwgdW5ibGluZGVyLCBtcCwgbXEsIHQsIGgsIHJlc3VsdDtcbiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7XG4gICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIGlmICghKG4uY21wKG0pIDw9IDApKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIHRvbyBsYXJnZS4nKTtcblxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBkcSA9IGQubW9kKHEuc3VibigxKSk7IC8vIGQgbW9kIChxLTEpXG5cbiAgICAgICAgICAgICAgZHAgPSBkLm1vZChwLnN1Ym4oMSkpOyAvLyBkIG1vZCAocC0xKVxuXG4gICAgICAgICAgICAgIHByZWQgPSBuZXcgX2JuMi5kZWZhdWx0LnJlZChwKTtcbiAgICAgICAgICAgICAgcXJlZCA9IG5ldyBfYm4yLmRlZmF1bHQucmVkKHEpO1xuICAgICAgICAgICAgICBucmVkID0gbmV3IF9ibjIuZGVmYXVsdC5yZWQobik7XG4gICAgICAgICAgICAgIGJsaW5kZXIgPSB2b2lkIDA7XG4gICAgICAgICAgICAgIHVuYmxpbmRlciA9IHZvaWQgMDtcblxuICAgICAgICAgICAgICBpZiAoIV9jb25maWcyLmRlZmF1bHQucnNhX2JsaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAxNjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgIHJldHVybiBfcmFuZG9tMi5kZWZhdWx0LmdldFJhbmRvbUJOKG5ldyBfYm4yLmRlZmF1bHQoMiksIG4pO1xuXG4gICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICBfY29udGV4dDQudDAgPSBucmVkO1xuICAgICAgICAgICAgICB1bmJsaW5kZXIgPSBfY29udGV4dDQuc2VudC50b1JlZChfY29udGV4dDQudDApO1xuXG4gICAgICAgICAgICAgIGJsaW5kZXIgPSB1bmJsaW5kZXIucmVkSW52bSgpLnJlZFBvdyhlKTtcbiAgICAgICAgICAgICAgbSA9IG0udG9SZWQobnJlZCkucmVkTXVsKGJsaW5kZXIpLmZyb21SZWQoKTtcblxuICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgbXAgPSBtLnRvUmVkKHByZWQpLnJlZFBvdyhkcCk7XG4gICAgICAgICAgICAgIG1xID0gbS50b1JlZChxcmVkKS5yZWRQb3coZHEpO1xuICAgICAgICAgICAgICB0ID0gbXEucmVkU3ViKG1wLmZyb21SZWQoKS50b1JlZChxcmVkKSk7XG4gICAgICAgICAgICAgIGggPSB1LnRvUmVkKHFyZWQpLnJlZE11bCh0KS5mcm9tUmVkKCk7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IGgubXVsKHApLmFkZChtcCkudG9SZWQobnJlZCk7XG5cblxuICAgICAgICAgICAgICBpZiAoX2NvbmZpZzIuZGVmYXVsdC5yc2FfYmxpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVkTXVsKHVuYmxpbmRlcik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdCgncmV0dXJuJywgcmVzdWx0LnRvQXJyYXlMaWtlKFVpbnQ4QXJyYXksICdiZScsIG4uYnl0ZUxlbmd0aCgpKSk7XG5cbiAgICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIF9jYWxsZWU0LCB0aGlzKTtcbiAgICB9KSk7XG5cbiAgICBmdW5jdGlvbiBkZWNyeXB0KF94MTEsIF94MTIsIF94MTMsIF94MTQsIF94MTUsIF94MTYsIF94MTcpIHtcbiAgICAgIHJldHVybiBfcmVmNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWNyeXB0O1xuICB9KCksXG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgbmV3IHJhbmRvbSBwcml2YXRlIGtleSBCIGJpdHMgbG9uZyB3aXRoIHB1YmxpYyBleHBvbmVudCBFLlxuICAgKlxuICAgKiBXaGVuIHBvc3NpYmxlLCB3ZWJDcnlwdG8gaXMgdXNlZC4gT3RoZXJ3aXNlLCBwcmltZXMgYXJlIGdlbmVyYXRlZCB1c2luZ1xuICAgKiA0MCByb3VuZHMgb2YgdGhlIE1pbGxlci1SYWJpbiBwcm9iYWJpbGlzdGljIHJhbmRvbSBwcmltZSBnZW5lcmF0aW9uIGFsZ29yaXRobS5cbiAgICogQHNlZSBtb2R1bGU6Y3J5cHRvL3B1YmxpY19rZXkvcHJpbWVcbiAgICogQHBhcmFtIHtJbnRlZ2VyfSBCIFJTQSBiaXQgbGVuZ3RoXG4gICAqIEBwYXJhbSB7U3RyaW5nfSAgRSBSU0EgcHVibGljIGV4cG9uZW50IGluIGhleCBzdHJpbmdcbiAgICogQHJldHVybnMge3tuOiBCTiwgZTogQk4sIGQ6IEJOLFxuICAgKiAgICAgICAgICAgIHA6IEJOLCBxOiBCTiwgdTogQk59fSBSU0EgcHVibGljIG1vZHVsdXMsIFJTQSBwdWJsaWMgZXhwb25lbnQsIFJTQSBwcml2YXRlIGV4cG9uZW50LFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0EgcHJpdmF0ZSBwcmltZSBwLCBSU0EgcHJpdmF0ZSBwcmltZSBxLCB1ID0gcSAqKiAtMSBtb2QgcFxuICAgKiBAYXN5bmNcbiAgICovXG4gIGdlbmVyYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWY1ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KEIsIEUpIHtcbiAgICAgIHZhciBrZXksIHdlYkNyeXB0bywga2V5UGFpciwga2V5R2VuT3B0LCBqd2ssIHAsIHEsIF9yZWY2LCBwaGk7XG5cbiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNSQoX2NvbnRleHQ1KSB7XG4gICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgc3dpdGNoIChfY29udGV4dDUucHJldiA9IF9jb250ZXh0NS5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIGtleSA9IHZvaWQgMDtcblxuICAgICAgICAgICAgICBFID0gbmV3IF9ibjIuZGVmYXVsdChFLCAxNik7XG4gICAgICAgICAgICAgIHdlYkNyeXB0byA9IF91dGlsMi5kZWZhdWx0LmdldFdlYkNyeXB0b0FsbCgpO1xuXG4gICAgICAgICAgICAgIC8vIE5hdGl2ZSBSU0Ega2V5Z2VuIHVzaW5nIFdlYiBDcnlwdG9cblxuICAgICAgICAgICAgICBpZiAoIXdlYkNyeXB0bykge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMzU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBrZXlQYWlyID0gdm9pZCAwO1xuICAgICAgICAgICAgICBrZXlHZW5PcHQgPSB2b2lkIDA7XG5cbiAgICAgICAgICAgICAgaWYgKCEod2luZG93LmNyeXB0byAmJiB3aW5kb3cuY3J5cHRvLnN1YnRsZSB8fCB3aW5kb3cubXNDcnlwdG8pKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIGN1cnJlbnQgc3RhbmRhcmQgc3BlY1xuICAgICAgICAgICAgICBrZXlHZW5PcHQgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JTQVNTQS1QS0NTMS12MV81JyxcbiAgICAgICAgICAgICAgICBtb2R1bHVzTGVuZ3RoOiBCLCAvLyB0aGUgc3BlY2lmaWVkIGtleXNpemUgaW4gYml0c1xuICAgICAgICAgICAgICAgIHB1YmxpY0V4cG9uZW50OiBFLnRvQXJyYXlMaWtlKFVpbnQ4QXJyYXkpLCAvLyB0YWtlIHRocmVlIGJ5dGVzIChtYXggNjU1MzcpIGZvciBleHBvbmVudFxuICAgICAgICAgICAgICAgIGhhc2g6IHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdTSEEtMScgLy8gbm90IHJlcXVpcmVkIGZvciBhY3R1YWwgUlNBIGtleXMsIGJ1dCBmb3IgY3J5cHRvIGFwaSAnc2lnbicgYW5kICd2ZXJpZnknXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBrZXlQYWlyID0gd2ViQ3J5cHRvLmdlbmVyYXRlS2V5KGtleUdlbk9wdCwgdHJ1ZSwgWydzaWduJywgJ3ZlcmlmeSddKTtcbiAgICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxMTtcbiAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2lmeUlFMTFPcChrZXlQYWlyLCAnRXJyb3IgZ2VuZXJhdGluZyBSU0Ega2V5IHBhaXIuJyk7XG5cbiAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgIGtleVBhaXIgPSBfY29udGV4dDUuc2VudDtcbiAgICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAyMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgIGlmICghKHdpbmRvdy5jcnlwdG8gJiYgd2luZG93LmNyeXB0by53ZWJraXRTdWJ0bGUpKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAyMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIG91dGRhdGVkIHNwZWMgaW1wbGVtZW50ZWQgYnkgb2xkIFdlYmtpdFxuICAgICAgICAgICAgICBrZXlHZW5PcHQgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcbiAgICAgICAgICAgICAgICBtb2R1bHVzTGVuZ3RoOiBCLCAvLyB0aGUgc3BlY2lmaWVkIGtleXNpemUgaW4gYml0c1xuICAgICAgICAgICAgICAgIHB1YmxpY0V4cG9uZW50OiBFLnRvQXJyYXlMaWtlKFVpbnQ4QXJyYXkpLCAvLyB0YWtlIHRocmVlIGJ5dGVzIChtYXggNjU1MzcpIGZvciBleHBvbmVudFxuICAgICAgICAgICAgICAgIGhhc2g6IHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdTSEEtMScgLy8gbm90IHJlcXVpcmVkIGZvciBhY3R1YWwgUlNBIGtleXMsIGJ1dCBmb3IgY3J5cHRvIGFwaSAnc2lnbicgYW5kICd2ZXJpZnknXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDE4O1xuICAgICAgICAgICAgICByZXR1cm4gd2ViQ3J5cHRvLmdlbmVyYXRlS2V5KGtleUdlbk9wdCwgdHJ1ZSwgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSk7XG5cbiAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgIGtleVBhaXIgPSBfY29udGV4dDUuc2VudDtcbiAgICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAyMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBXZWJDcnlwdG8gaW1wbGVtZW50YXRpb24nKTtcblxuICAgICAgICAgICAgY2FzZSAyMjpcblxuICAgICAgICAgICAgICAvLyBleHBvcnQgdGhlIGdlbmVyYXRlZCBrZXlzIGFzIEpzb25XZWJLZXkgKEpXSylcbiAgICAgICAgICAgICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtam9zZS1qc29uLXdlYi1rZXktMzNcbiAgICAgICAgICAgICAgandrID0gd2ViQ3J5cHRvLmV4cG9ydEtleSgnandrJywga2V5UGFpci5wcml2YXRlS2V5KTtcbiAgICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAyNTtcbiAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2lmeUlFMTFPcChqd2ssICdFcnJvciBleHBvcnRpbmcgUlNBIGtleSBwYWlyLicpO1xuXG4gICAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgICBqd2sgPSBfY29udGV4dDUuc2VudDtcblxuXG4gICAgICAgICAgICAgIC8vIHBhcnNlIHJhdyBBcnJheUJ1ZmZlciBieXRlcyB0byBqd2svanNvbiAoV2ViS2l0L1NhZmFyaS9JRTExIHF1aXJrKVxuICAgICAgICAgICAgICBpZiAoandrIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICBqd2sgPSBKU09OLnBhcnNlKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoandrKSkpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gbWFwIEpXSyBwYXJhbWV0ZXJzIHRvIEJOXG4gICAgICAgICAgICAgIGtleSA9IHt9O1xuICAgICAgICAgICAgICBrZXkubiA9IG5ldyBfYm4yLmRlZmF1bHQoX3V0aWwyLmRlZmF1bHQuYjY0X3RvX1VpbnQ4QXJyYXkoandrLm4pKTtcbiAgICAgICAgICAgICAga2V5LmUgPSBFO1xuICAgICAgICAgICAgICBrZXkuZCA9IG5ldyBfYm4yLmRlZmF1bHQoX3V0aWwyLmRlZmF1bHQuYjY0X3RvX1VpbnQ4QXJyYXkoandrLmQpKTtcbiAgICAgICAgICAgICAga2V5LnAgPSBuZXcgX2JuMi5kZWZhdWx0KF91dGlsMi5kZWZhdWx0LmI2NF90b19VaW50OEFycmF5KGp3ay5wKSk7XG4gICAgICAgICAgICAgIGtleS5xID0gbmV3IF9ibjIuZGVmYXVsdChfdXRpbDIuZGVmYXVsdC5iNjRfdG9fVWludDhBcnJheShqd2sucSkpO1xuICAgICAgICAgICAgICBrZXkudSA9IGtleS5wLmludm0oa2V5LnEpO1xuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LmFicnVwdCgncmV0dXJuJywga2V5KTtcblxuICAgICAgICAgICAgY2FzZSAzNTpcbiAgICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAzNztcbiAgICAgICAgICAgICAgcmV0dXJuIF9wcmltZTIuZGVmYXVsdC5yYW5kb21Qcm9iYWJsZVByaW1lKEIgLSAoQiA+PiAxKSwgRSwgNDApO1xuXG4gICAgICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgICAgICBwID0gX2NvbnRleHQ1LnNlbnQ7XG4gICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gNDA7XG4gICAgICAgICAgICAgIHJldHVybiBfcHJpbWUyLmRlZmF1bHQucmFuZG9tUHJvYmFibGVQcmltZShCID4+IDEsIEUsIDQwKTtcblxuICAgICAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICAgICAgcSA9IF9jb250ZXh0NS5zZW50O1xuXG5cbiAgICAgICAgICAgICAgaWYgKHAuY21wKHEpIDwgMCkge1xuICAgICAgICAgICAgICAgIF9yZWY2ID0gW3EsIHBdO1xuICAgICAgICAgICAgICAgIHAgPSBfcmVmNlswXTtcbiAgICAgICAgICAgICAgICBxID0gX3JlZjZbMV07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBwaGkgPSBwLnN1Ym4oMSkubXVsKHEuc3VibigxKSk7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuYWJydXB0KCdyZXR1cm4nLCB7XG4gICAgICAgICAgICAgICAgbjogcC5tdWwocSksXG4gICAgICAgICAgICAgICAgZTogRSxcbiAgICAgICAgICAgICAgICBkOiBFLmludm0ocGhpKSxcbiAgICAgICAgICAgICAgICBwOiBwLFxuICAgICAgICAgICAgICAgIHE6IHEsXG4gICAgICAgICAgICAgICAgLy8gZHA6IGQubW9kKHAuc3VibigxKSksXG4gICAgICAgICAgICAgICAgLy8gZHE6IGQubW9kKHEuc3VibigxKSksXG4gICAgICAgICAgICAgICAgdTogcC5pbnZtKHEpXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjYXNlIDQ0OlxuICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBfY2FsbGVlNSwgdGhpcyk7XG4gICAgfSkpO1xuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGUoX3gxOCwgX3gxOSkge1xuICAgICAgcmV0dXJuIF9yZWY1LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdlbmVyYXRlO1xuICB9KCksXG5cbiAgcHJpbWU6IF9wcmltZTIuZGVmYXVsdFxufTtcblxufSx7XCIuLi8uLi9jb25maWdcIjozMjUsXCIuLi8uLi91dGlsXCI6Mzk4LFwiLi4vcmFuZG9tXCI6MzU1LFwiLi9wcmltZVwiOjM1MyxcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9wcm9taXNlXCI6MzIsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiOjM1LFwiYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvclwiOjQyLFwiYm4uanNcIjo0NH1dLDM1NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcmVnZW5lcmF0b3IgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yJyk7XG5cbnZhciBfcmVnZW5lcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVnZW5lcmF0b3IpO1xuXG52YXIgX3R5cGVvZjIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvdHlwZW9mJyk7XG5cbnZhciBfdHlwZW9mMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3R5cGVvZjIpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IyID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3InKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FzeW5jVG9HZW5lcmF0b3IyKTtcblxudmFyIF9ibiA9IF9kZXJlcV8oJ2JuLmpzJyk7XG5cbnZhciBfYm4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYm4pO1xuXG52YXIgX3V0aWwgPSBfZGVyZXFfKCcuLi91dGlsJyk7XG5cbnZhciBfdXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLy8gRG8gbm90IHVzZSB1dGlsLmdldE5vZGVDcnlwdG8gYmVjYXVzZSB3ZSBuZWVkIHRoaXMgcmVnYXJkbGVzcyBvZiB1c2VfbmF0aXZlIHNldHRpbmdcbi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8vIFRoZSBHUEc0QnJvd3NlcnMgY3J5cHRvIGludGVyZmFjZVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgUHJvdmlkZXMgdG9vbHMgZm9yIHJldHJpZXZpbmcgc2VjdXJlIHJhbmRvbW5lc3MgZnJvbSBicm93c2VycyBvciBOb2RlLmpzXG4gKiBAcmVxdWlyZXMgYm4uanNcbiAqIEByZXF1aXJlcyB1dGlsXG4gKiBAbW9kdWxlIGNyeXB0by9yYW5kb21cbiAqL1xuXG52YXIgbm9kZUNyeXB0byA9IF91dGlsMi5kZWZhdWx0LmRldGVjdE5vZGUoKSAmJiBfZGVyZXFfKCdjcnlwdG8nKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICAvKipcbiAgICogUmV0cmlldmUgc2VjdXJlIHJhbmRvbSBieXRlIGFycmF5IG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoXG4gICAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuZ3RoIExlbmd0aCBpbiBieXRlcyB0byBnZW5lcmF0ZVxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gUmFuZG9tIGJ5dGUgYXJyYXlcbiAgICogQGFzeW5jXG4gICAqL1xuICBnZXRSYW5kb21CeXRlczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUobGVuZ3RoKSB7XG4gICAgICB2YXIgYnVmLCBieXRlcztcbiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcblxuICAgICAgICAgICAgICBpZiAoISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY3J5cHRvICYmIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYnVmKTtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIwO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICBpZiAoISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkod2luZG93Lm1zQ3J5cHRvKSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHdpbmRvdy5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB3aW5kb3cubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ1Zik7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgaWYgKCFub2RlQ3J5cHRvKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnl0ZXMgPSBub2RlQ3J5cHRvLnJhbmRvbUJ5dGVzKGJ1Zi5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgIGJ1Zi5zZXQoYnl0ZXMpO1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICBpZiAoIXRoaXMucmFuZG9tQnVmZmVyLmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxOTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNztcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmFuZG9tQnVmZmVyLmdldChidWYpO1xuXG4gICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBhdmFpbGFibGUuJyk7XG5cbiAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIGJ1Zik7XG5cbiAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gICAgfSkpO1xuXG4gICAgZnVuY3Rpb24gZ2V0UmFuZG9tQnl0ZXMoX3gpIHtcbiAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldFJhbmRvbUJ5dGVzO1xuICB9KCksXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNlY3VyZSByYW5kb20gTVBJIHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG1pbiBhbmQgbGVzcyB0aGFuIG1heC5cbiAgICogQHBhcmFtIHttb2R1bGU6dHlwZS9tcGl9IG1pbiBMb3dlciBib3VuZCwgaW5jbHVkZWRcbiAgICogQHBhcmFtIHttb2R1bGU6dHlwZS9tcGl9IG1heCBVcHBlciBib3VuZCwgZXhjbHVkZWRcbiAgICogQHJldHVybnMge21vZHVsZTpCTn0gUmFuZG9tIE1QSVxuICAgKiBAYXN5bmNcbiAgICovXG4gIGdldFJhbmRvbUJOOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYyID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKG1pbiwgbWF4KSB7XG4gICAgICB2YXIgbW9kdWx1cywgYnl0ZXMsIHI7XG4gICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBpZiAoIShtYXguY21wKG1pbikgPD0gMCkpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgcGFyYW1ldGVyIHZhbHVlOiBtYXggPD0gbWluJyk7XG5cbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgbW9kdWx1cyA9IG1heC5zdWIobWluKTtcbiAgICAgICAgICAgICAgYnl0ZXMgPSBtb2R1bHVzLmJ5dGVMZW5ndGgoKTtcblxuICAgICAgICAgICAgICAvLyBVc2luZyBhIHdoaWxlIGxvb3AgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGJpYXMgaW50cm9kdWNlZCBieSB0aGUgbW9kIG9wZXJhdGlvbi5cbiAgICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgcmVxdWVzdCA2NCBleHRyYSByYW5kb20gYml0cyBzbyB0aGF0IHRoZSBiaWFzIGlzIG5lZ2xpZ2libGUuXG4gICAgICAgICAgICAgIC8vIFNlY3Rpb24gQi4xLjEgaGVyZTogaHR0cHM6Ly9udmxwdWJzLm5pc3QuZ292L25pc3RwdWJzL0ZJUFMvTklTVC5GSVBTLjE4Ni00LnBkZlxuXG4gICAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IF9ibjIuZGVmYXVsdDtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA3O1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRSYW5kb21CeXRlcyhieXRlcyArIDgpO1xuXG4gICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi50MSA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgICAgICByID0gbmV3IF9jb250ZXh0Mi50MChfY29udGV4dDIudDEpO1xuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywgci5tb2QobW9kdWx1cykuYWRkKG1pbikpO1xuXG4gICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gICAgfSkpO1xuXG4gICAgZnVuY3Rpb24gZ2V0UmFuZG9tQk4oX3gyLCBfeDMpIHtcbiAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRSYW5kb21CTjtcbiAgfSgpLFxuXG4gIHJhbmRvbUJ1ZmZlcjogbmV3IFJhbmRvbUJ1ZmZlcigpXG59O1xuXG4vKipcbiAqIEJ1ZmZlciBmb3Igc2VjdXJlIHJhbmRvbSBudW1iZXJzXG4gKi9cblxuZnVuY3Rpb24gUmFuZG9tQnVmZmVyKCkge1xuICB0aGlzLmJ1ZmZlciA9IG51bGw7XG4gIHRoaXMuc2l6ZSA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2sgPSBudWxsO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgYnVmZmVyXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBzaXplIHNpemUgb2YgYnVmZmVyXG4gKi9cblJhbmRvbUJ1ZmZlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uIChzaXplLCBjYWxsYmFjaykge1xuICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICB0aGlzLnNpemUgPSAwO1xuICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG59O1xuXG4vKipcbiAqIENvbmNhdCBhcnJheSBvZiBzZWN1cmUgcmFuZG9tIG51bWJlcnMgdG8gYnVmZmVyXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ1ZlxuICovXG5SYW5kb21CdWZmZXIucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChidWYpIHtcbiAgaWYgKCF0aGlzLmJ1ZmZlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignUmFuZG9tQnVmZmVyIGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICB9XG4gIGlmICghKGJ1ZiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHR5cGU6IGJ1ZiBub3QgYW4gVWludDhBcnJheScpO1xuICB9XG4gIHZhciBmcmVlU3BhY2UgPSB0aGlzLmJ1ZmZlci5sZW5ndGggLSB0aGlzLnNpemU7XG4gIGlmIChidWYubGVuZ3RoID4gZnJlZVNwYWNlKSB7XG4gICAgYnVmID0gYnVmLnN1YmFycmF5KDAsIGZyZWVTcGFjZSk7XG4gIH1cbiAgLy8gc2V0IGJ1ZiB3aXRoIG9mZnNldCBvbGQgc2l6ZSBvZiBidWZmZXJcbiAgdGhpcy5idWZmZXIuc2V0KGJ1ZiwgdGhpcy5zaXplKTtcbiAgdGhpcy5zaXplICs9IGJ1Zi5sZW5ndGg7XG59O1xuXG4vKipcbiAqIFRha2UgbnVtYmVycyBvdXQgb2YgYnVmZmVyIGFuZCBjb3B5IHRvIGFycmF5XG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ1ZiB0aGUgZGVzdGluYXRpb24gYXJyYXlcbiAqL1xuUmFuZG9tQnVmZmVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMyA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhidWYpIHtcbiAgICB2YXIgaTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0Mykge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmFuZG9tQnVmZmVyIGlzIG5vdCBpbml0aWFsaXplZCcpO1xuXG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgaWYgKGJ1ZiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHR5cGU6IGJ1ZiBub3QgYW4gVWludDhBcnJheScpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgaWYgKCEodGhpcy5zaXplIDwgYnVmLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmFuZG9tIG51bWJlciBidWZmZXIgZGVwbGV0ZWQnKTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gOTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhbGxiYWNrKCk7XG5cbiAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgncmV0dXJuJywgdGhpcy5nZXQoYnVmKSk7XG5cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBidWZbaV0gPSB0aGlzLmJ1ZmZlclstLXRoaXMuc2l6ZV07XG4gICAgICAgICAgICAgIC8vIGNsZWFyIGJ1ZmZlciB2YWx1ZVxuICAgICAgICAgICAgICB0aGlzLmJ1ZmZlclt0aGlzLnNpemVdID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTMsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChfeDQpIHtcbiAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxufSx7XCIuLi91dGlsXCI6Mzk4LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjozNSxcImJhYmVsLXJ1bnRpbWUvaGVscGVycy90eXBlb2ZcIjo0MSxcImJhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3JcIjo0MixcImJuLmpzXCI6NDQsXCJjcnlwdG9cIjpcImNyeXB0b1wifV0sMzU2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3InKTtcblxudmFyIF9yZWdlbmVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWdlbmVyYXRvcik7XG5cbnZhciBfZnJvbSA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9hcnJheS9mcm9tJyk7XG5cbnZhciBfZnJvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mcm9tKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJyk7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3luY1RvR2VuZXJhdG9yMik7XG5cbnZhciBfYm4gPSBfZGVyZXFfKCdibi5qcycpO1xuXG52YXIgX2JuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2JuKTtcblxudmFyIF9wdWJsaWNfa2V5ID0gX2RlcmVxXygnLi9wdWJsaWNfa2V5Jyk7XG5cbnZhciBfcHVibGljX2tleTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wdWJsaWNfa2V5KTtcblxudmFyIF9wa2NzID0gX2RlcmVxXygnLi9wa2NzMScpO1xuXG52YXIgX3BrY3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGtjcyk7XG5cbnZhciBfZW51bXMgPSBfZGVyZXFfKCcuLi9lbnVtcycpO1xuXG52YXIgX2VudW1zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VudW1zKTtcblxudmFyIF91dGlsID0gX2RlcmVxXygnLi4vdXRpbCcpO1xuXG52YXIgX3V0aWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBzaWduYXR1cmUgcHJvdmlkZWQgZm9yIGRhdGEgdXNpbmcgc3BlY2lmaWVkIGFsZ29yaXRobXMgYW5kIHB1YmxpYyBrZXkgcGFyYW1ldGVycy5cbiAgICogU2VlIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTkuMXxSRkMgNDg4MCA5LjF9XG4gICAqIGFuZCB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi05LjR8UkZDIDQ4ODAgOS40fVxuICAgKiBmb3IgcHVibGljIGtleSBhbmQgaGFzaCBhbGdvcml0aG1zLlxuICAgKiBAcGFyYW0ge21vZHVsZTplbnVtcy5wdWJsaWNLZXl9IGFsZ28gICAgICBQdWJsaWMga2V5IGFsZ29yaXRobVxuICAgKiBAcGFyYW0ge21vZHVsZTplbnVtcy5oYXNofSAgICAgIGhhc2hfYWxnbyBIYXNoIGFsZ29yaXRobVxuICAgKiBAcGFyYW0ge0FycmF5PG1vZHVsZTp0eXBlL21waT59IG1zZ19NUElzICBBbGdvcml0aG0tc3BlY2lmaWMgc2lnbmF0dXJlIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtBcnJheTxtb2R1bGU6dHlwZS9tcGk+fSBwdWJfTVBJcyAgQWxnb3JpdGhtLXNwZWNpZmljIHB1YmxpYyBrZXkgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9ICAgICAgICAgICAgIGRhdGEgICAgICBEYXRhIGZvciB3aGljaCB0aGUgc2lnbmF0dXJlIHdhcyBjcmVhdGVkXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSAgICAgICAgICAgICAgICAgICAgICAgIFRydWUgaWYgc2lnbmF0dXJlIGlzIHZhbGlkXG4gICAqIEBhc3luY1xuICAgKi9cbiAgdmVyaWZ5OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZShhbGdvLCBoYXNoX2FsZ28sIG1zZ19NUElzLCBwdWJfTVBJcywgZGF0YSkge1xuICAgICAgdmFyIG0sIG4sIGUsIEVNLCBFTTIsIHIsIHMsIHAsIHEsIGcsIHksIG9pZCwgc2lnbmF0dXJlLCBRLCBfb2lkLCBfc2lnbmF0dXJlLCBfUTtcblxuICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBfY29udGV4dC50MCA9IGFsZ287XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSBfY29udGV4dC50MCA9PT0gX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5yc2FfZW5jcnlwdF9zaWduID8gMyA6IF9jb250ZXh0LnQwID09PSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LnJzYV9lbmNyeXB0ID8gMyA6IF9jb250ZXh0LnQwID09PSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LnJzYV9zaWduID8gMyA6IF9jb250ZXh0LnQwID09PSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmRzYSA/IDExIDogX2NvbnRleHQudDAgPT09IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkc2EgPyAxOCA6IF9jb250ZXh0LnQwID09PSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmVkZHNhID8gMjIgOiAyNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgbSA9IG1zZ19NUElzWzBdLnRvQk4oKTtcbiAgICAgICAgICAgICAgbiA9IHB1Yl9NUElzWzBdLnRvQk4oKTtcbiAgICAgICAgICAgICAgZSA9IHB1Yl9NUElzWzFdLnRvQk4oKTtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgICAgIHJldHVybiBfcHVibGljX2tleTIuZGVmYXVsdC5yc2EudmVyaWZ5KG0sIG4sIGUpO1xuXG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgIEVNID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgICAgRU0yID0gX3BrY3MyLmRlZmF1bHQuZW1zYS5lbmNvZGUoaGFzaF9hbGdvLCBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cihkYXRhKSwgbi5ieXRlTGVuZ3RoKCkpO1xuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX2hleChFTSkgPT09IEVNMik7XG5cbiAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgIHIgPSBtc2dfTVBJc1swXS50b0JOKCk7XG4gICAgICAgICAgICAgIHMgPSBtc2dfTVBJc1sxXS50b0JOKCk7XG4gICAgICAgICAgICAgIHAgPSBwdWJfTVBJc1swXS50b0JOKCk7XG4gICAgICAgICAgICAgIHEgPSBwdWJfTVBJc1sxXS50b0JOKCk7XG4gICAgICAgICAgICAgIGcgPSBwdWJfTVBJc1syXS50b0JOKCk7XG4gICAgICAgICAgICAgIHkgPSBwdWJfTVBJc1szXS50b0JOKCk7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIF9wdWJsaWNfa2V5Mi5kZWZhdWx0LmRzYS52ZXJpZnkoaGFzaF9hbGdvLCByLCBzLCBkYXRhLCBnLCBwLCBxLCB5KSk7XG5cbiAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgIG9pZCA9IHB1Yl9NUElzWzBdO1xuICAgICAgICAgICAgICBzaWduYXR1cmUgPSB7IHI6IG1zZ19NUElzWzBdLnRvVWludDhBcnJheSgpLCBzOiBtc2dfTVBJc1sxXS50b1VpbnQ4QXJyYXkoKSB9O1xuICAgICAgICAgICAgICBRID0gcHViX01QSXNbMV0udG9VaW50OEFycmF5KCk7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIF9wdWJsaWNfa2V5Mi5kZWZhdWx0LmVsbGlwdGljLmVjZHNhLnZlcmlmeShvaWQsIGhhc2hfYWxnbywgc2lnbmF0dXJlLCBkYXRhLCBRKSk7XG5cbiAgICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICAgIF9vaWQgPSBwdWJfTVBJc1swXTtcbiAgICAgICAgICAgICAgLy8gVE9ETyByZWZhY3RvciBlbGxpcHRpYyB0byBhY2NlcHQgVWludDhBcnJheVxuICAgICAgICAgICAgICAvLyBFZERTQSBzaWduYXR1cmUgcGFyYW1zIGFyZSBleHBlY3RlZCBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdFxuXG4gICAgICAgICAgICAgIF9zaWduYXR1cmUgPSB7IFI6ICgwLCBfZnJvbTIuZGVmYXVsdCkobXNnX01QSXNbMF0udG9VaW50OEFycmF5KCdsZScsIDMyKSksXG4gICAgICAgICAgICAgICAgUzogKDAsIF9mcm9tMi5kZWZhdWx0KShtc2dfTVBJc1sxXS50b1VpbnQ4QXJyYXkoJ2xlJywgMzIpKSB9O1xuICAgICAgICAgICAgICBfUSA9ICgwLCBfZnJvbTIuZGVmYXVsdCkocHViX01QSXNbMV0udG9VaW50OEFycmF5KCdiZScsIDMzKSk7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIF9wdWJsaWNfa2V5Mi5kZWZhdWx0LmVsbGlwdGljLmVkZHNhLnZlcmlmeShfb2lkLCBoYXNoX2FsZ28sIF9zaWduYXR1cmUsIGRhdGEsIF9RKSk7XG5cbiAgICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaWduYXR1cmUgYWxnb3JpdGhtLicpO1xuXG4gICAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgIH0pKTtcblxuICAgIGZ1bmN0aW9uIHZlcmlmeShfeCwgX3gyLCBfeDMsIF94NCwgX3g1KSB7XG4gICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiB2ZXJpZnk7XG4gIH0oKSxcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHNpZ25hdHVyZSBvbiBkYXRhIHVzaW5nIHNwZWNpZmllZCBhbGdvcml0aG1zIGFuZCBwcml2YXRlIGtleSBwYXJhbWV0ZXJzLlxuICAgKiBTZWUge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tOS4xfFJGQyA0ODgwIDkuMX1cbiAgICogYW5kIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTkuNHxSRkMgNDg4MCA5LjR9XG4gICAqIGZvciBwdWJsaWMga2V5IGFuZCBoYXNoIGFsZ29yaXRobXMuXG4gICAqIEBwYXJhbSB7bW9kdWxlOmVudW1zLnB1YmxpY0tleX0gYWxnbyAgICAgICBQdWJsaWMga2V5IGFsZ29yaXRobVxuICAgKiBAcGFyYW0ge21vZHVsZTplbnVtcy5oYXNofSAgICAgIGhhc2hfYWxnbyAgSGFzaCBhbGdvcml0aG1cbiAgICogQHBhcmFtIHtBcnJheTxtb2R1bGU6dHlwZS9tcGk+fSBrZXlfcGFyYW1zIEFsZ29yaXRobS1zcGVjaWZpYyBwdWJsaWMgYW5kIHByaXZhdGUga2V5IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSAgICAgICAgICAgICBkYXRhICAgICAgIERhdGEgdG8gYmUgc2lnbmVkXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSAgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmVcbiAgICogQGFzeW5jXG4gICAqL1xuICBzaWduOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYyID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKGFsZ28sIGhhc2hfYWxnbywga2V5X3BhcmFtcywgZGF0YSkge1xuICAgICAgdmFyIG4sIGUsIGQsIG0sIHNpZ25hdHVyZSwgcCwgcSwgZywgeCwgX3NpZ25hdHVyZTIsIG9pZCwgX2QsIF9zaWduYXR1cmUzLCBfb2lkMiwgX2QyLCBfc2lnbmF0dXJlNDtcblxuICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgX2NvbnRleHQyLnQwID0gYWxnbztcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSBfY29udGV4dDIudDAgPT09IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkucnNhX2VuY3J5cHRfc2lnbiA/IDMgOiBfY29udGV4dDIudDAgPT09IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkucnNhX2VuY3J5cHQgPyAzIDogX2NvbnRleHQyLnQwID09PSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LnJzYV9zaWduID8gMyA6IF9jb250ZXh0Mi50MCA9PT0gX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5kc2EgPyAxMiA6IF9jb250ZXh0Mi50MCA9PT0gX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lbGdhbWFsID8gMjAgOiBfY29udGV4dDIudDAgPT09IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkc2EgPyAyMSA6IF9jb250ZXh0Mi50MCA9PT0gX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lZGRzYSA/IDI3IDogMzM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIG4gPSBrZXlfcGFyYW1zWzBdLnRvQk4oKTtcbiAgICAgICAgICAgICAgZSA9IGtleV9wYXJhbXNbMV0udG9CTigpO1xuICAgICAgICAgICAgICBkID0ga2V5X3BhcmFtc1syXS50b0JOKCk7XG5cbiAgICAgICAgICAgICAgZGF0YSA9IF91dGlsMi5kZWZhdWx0LlVpbnQ4QXJyYXlfdG9fc3RyKGRhdGEpO1xuICAgICAgICAgICAgICBtID0gbmV3IF9ibjIuZGVmYXVsdChfcGtjczIuZGVmYXVsdC5lbXNhLmVuY29kZShoYXNoX2FsZ28sIGRhdGEsIG4uYnl0ZUxlbmd0aCgpKSwgMTYpO1xuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEwO1xuICAgICAgICAgICAgICByZXR1cm4gX3B1YmxpY19rZXkyLmRlZmF1bHQucnNhLnNpZ24obSwgbiwgZSwgZCk7XG5cbiAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgIHNpZ25hdHVyZSA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywgX3V0aWwyLmRlZmF1bHQuVWludDhBcnJheV90b19NUEkoc2lnbmF0dXJlKSk7XG5cbiAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgIHAgPSBrZXlfcGFyYW1zWzBdLnRvQk4oKTtcbiAgICAgICAgICAgICAgcSA9IGtleV9wYXJhbXNbMV0udG9CTigpO1xuICAgICAgICAgICAgICBnID0ga2V5X3BhcmFtc1syXS50b0JOKCk7XG4gICAgICAgICAgICAgIHggPSBrZXlfcGFyYW1zWzRdLnRvQk4oKTtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxODtcbiAgICAgICAgICAgICAgcmV0dXJuIF9wdWJsaWNfa2V5Mi5kZWZhdWx0LmRzYS5zaWduKGhhc2hfYWxnbywgZGF0YSwgZywgcCwgcSwgeCk7XG5cbiAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgIF9zaWduYXR1cmUyID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCdyZXR1cm4nLCBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFtfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX01QSShfc2lnbmF0dXJlMi5yKSwgX3V0aWwyLmRlZmF1bHQuVWludDhBcnJheV90b19NUEkoX3NpZ25hdHVyZTIucyldKSk7XG5cbiAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2lnbmluZyB3aXRoIEVsZ2FtYWwgaXMgbm90IGRlZmluZWQgaW4gdGhlIE9wZW5QR1Agc3RhbmRhcmQuJyk7XG5cbiAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICAgIG9pZCA9IGtleV9wYXJhbXNbMF07XG4gICAgICAgICAgICAgIF9kID0ga2V5X3BhcmFtc1syXS50b1VpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyNTtcbiAgICAgICAgICAgICAgcmV0dXJuIF9wdWJsaWNfa2V5Mi5kZWZhdWx0LmVsbGlwdGljLmVjZHNhLnNpZ24ob2lkLCBoYXNoX2FsZ28sIGRhdGEsIF9kKTtcblxuICAgICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgICAgX3NpZ25hdHVyZTMgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoJ3JldHVybicsIF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW191dGlsMi5kZWZhdWx0LlVpbnQ4QXJyYXlfdG9fTVBJKF9zaWduYXR1cmUzLnIpLCBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX01QSShfc2lnbmF0dXJlMy5zKV0pKTtcblxuICAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgICAgX29pZDIgPSBrZXlfcGFyYW1zWzBdO1xuICAgICAgICAgICAgICBfZDIgPSAoMCwgX2Zyb20yLmRlZmF1bHQpKGtleV9wYXJhbXNbMl0udG9VaW50OEFycmF5KCdiZScsIDMyKSk7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMzE7XG4gICAgICAgICAgICAgIHJldHVybiBfcHVibGljX2tleTIuZGVmYXVsdC5lbGxpcHRpYy5lZGRzYS5zaWduKF9vaWQyLCBoYXNoX2FsZ28sIGRhdGEsIF9kMik7XG5cbiAgICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICAgIF9zaWduYXR1cmU0ID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCdyZXR1cm4nLCBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFtfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX01QSShfc2lnbmF0dXJlNC5SKSwgX3V0aWwyLmRlZmF1bHQuVWludDhBcnJheV90b19NUEkoX3NpZ25hdHVyZTQuUyldKSk7XG5cbiAgICAgICAgICAgIGNhc2UgMzM6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaWduYXR1cmUgYWxnb3JpdGhtLicpO1xuXG4gICAgICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gICAgfSkpO1xuXG4gICAgZnVuY3Rpb24gc2lnbihfeDYsIF94NywgX3g4LCBfeDkpIHtcbiAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiBzaWduO1xuICB9KClcbn07IC8qKlxuICAgICogQGZpbGVvdmVydmlldyBQcm92aWRlcyBmdW5jdGlvbnMgZm9yIGFzeW1tZXRyaWMgc2lnbmluZyBhbmQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvblxuICAgICogQHJlcXVpcmVzIGJuLmpzXG4gICAgKiBAcmVxdWlyZXMgY3J5cHRvL3B1YmxpY19rZXlcbiAgICAqIEByZXF1aXJlcyBjcnlwdG8vcGtjczFcbiAgICAqIEByZXF1aXJlcyBlbnVtc1xuICAgICogQHJlcXVpcmVzIHV0aWxcbiAgICAqIEBtb2R1bGUgY3J5cHRvL3NpZ25hdHVyZVxuICAgKi9cblxufSx7XCIuLi9lbnVtc1wiOjM1OSxcIi4uL3V0aWxcIjozOTgsXCIuL3BrY3MxXCI6MzQyLFwiLi9wdWJsaWNfa2V5XCI6MzUyLFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL2FycmF5L2Zyb21cIjoyMCxcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI6MzUsXCJiYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yXCI6NDIsXCJibi5qc1wiOjQ0fV0sMzU3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9iYXNlID0gX2RlcmVxXygnLi9iYXNlNjQuanMnKTtcblxudmFyIF9iYXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jhc2UpO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vZW51bXMuanMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbnZhciBfY29uZmlnID0gX2RlcmVxXygnLi4vY29uZmlnJyk7XG5cbnZhciBfY29uZmlnMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbmZpZyk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEZpbmRzIG91dCB3aGljaCBBc2NpaSBBcm1vcmluZyB0eXBlIGlzIHVzZWQuIFRocm93cyBlcnJvciBpZiB1bmtub3duIHR5cGUuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IHRleHQgW1N0cmluZ10gYXNjaWkgYXJtb3JlZCB0ZXh0XG4gKiBAcmV0dXJucyB7SW50ZWdlcn0gMCA9IE1FU1NBR0UgUEFSVCBuIG9mIG1cbiAqICAgICAgICAgMSA9IE1FU1NBR0UgUEFSVCBuXG4gKiAgICAgICAgIDIgPSBTSUdORUQgTUVTU0FHRVxuICogICAgICAgICAzID0gUEdQIE1FU1NBR0VcbiAqICAgICAgICAgNCA9IFBVQkxJQyBLRVkgQkxPQ0tcbiAqICAgICAgICAgNSA9IFBSSVZBVEUgS0VZIEJMT0NLXG4gKiAgICAgICAgIDYgPSBTSUdOQVRVUkVcbiAqL1xuLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAcmVxdWlyZXMgZW5jb2RpbmcvYmFzZTY0XG4gKiBAcmVxdWlyZXMgZW51bXNcbiAqIEByZXF1aXJlcyBjb25maWdcbiAqIEByZXF1aXJlcyB1dGlsXG4gKiBAbW9kdWxlIGVuY29kaW5nL2FybW9yXG4gKi9cblxuZnVuY3Rpb24gZ2V0VHlwZSh0ZXh0KSB7XG4gIHZhciByZUhlYWRlciA9IC9eLS0tLS1CRUdJTiBQR1AgKE1FU1NBR0UsIFBBUlQgXFxkK1xcL1xcZCt8TUVTU0FHRSwgUEFSVCBcXGQrfFNJR05FRCBNRVNTQUdFfE1FU1NBR0V8UFVCTElDIEtFWSBCTE9DS3xQUklWQVRFIEtFWSBCTE9DS3xTSUdOQVRVUkUpLS0tLS0kXFxuL207XG5cbiAgdmFyIGhlYWRlciA9IHRleHQubWF0Y2gocmVIZWFkZXIpO1xuXG4gIGlmICghaGVhZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIEFTQ0lJIGFybW9yIHR5cGUnKTtcbiAgfVxuXG4gIC8vIEJFR0lOIFBHUCBNRVNTQUdFLCBQQVJUIFgvWVxuICAvLyBVc2VkIGZvciBtdWx0aS1wYXJ0IG1lc3NhZ2VzLCB3aGVyZSB0aGUgYXJtb3IgaXMgc3BsaXQgYW1vbmdzdCBZXG4gIC8vIHBhcnRzLCBhbmQgdGhpcyBpcyB0aGUgWHRoIHBhcnQgb3V0IG9mIFkuXG4gIGlmICgvTUVTU0FHRSwgUEFSVCBcXGQrXFwvXFxkKy8udGVzdChoZWFkZXJbMV0pKSB7XG4gICAgcmV0dXJuIF9lbnVtczIuZGVmYXVsdC5hcm1vci5tdWx0aXBhcnRfc2VjdGlvbjtcbiAgfSBlbHNlXG4gICAgLy8gQkVHSU4gUEdQIE1FU1NBR0UsIFBBUlQgWFxuICAgIC8vIFVzZWQgZm9yIG11bHRpLXBhcnQgbWVzc2FnZXMsIHdoZXJlIHRoaXMgaXMgdGhlIFh0aCBwYXJ0IG9mIGFuXG4gICAgLy8gdW5zcGVjaWZpZWQgbnVtYmVyIG9mIHBhcnRzLiBSZXF1aXJlcyB0aGUgTUVTU0FHRS1JRCBBcm1vclxuICAgIC8vIEhlYWRlciB0byBiZSB1c2VkLlxuICAgIGlmICgvTUVTU0FHRSwgUEFSVCBcXGQrLy50ZXN0KGhlYWRlclsxXSkpIHtcbiAgICAgIHJldHVybiBfZW51bXMyLmRlZmF1bHQuYXJtb3IubXVsdGlwYXJ0X2xhc3Q7XG4gICAgfSBlbHNlXG4gICAgICAvLyBCRUdJTiBQR1AgU0lHTkVEIE1FU1NBR0VcbiAgICAgIGlmICgvU0lHTkVEIE1FU1NBR0UvLnRlc3QoaGVhZGVyWzFdKSkge1xuICAgICAgICByZXR1cm4gX2VudW1zMi5kZWZhdWx0LmFybW9yLnNpZ25lZDtcbiAgICAgIH0gZWxzZVxuICAgICAgICAvLyBCRUdJTiBQR1AgTUVTU0FHRVxuICAgICAgICAvLyBVc2VkIGZvciBzaWduZWQsIGVuY3J5cHRlZCwgb3IgY29tcHJlc3NlZCBmaWxlcy5cbiAgICAgICAgaWYgKC9NRVNTQUdFLy50ZXN0KGhlYWRlclsxXSkpIHtcbiAgICAgICAgICByZXR1cm4gX2VudW1zMi5kZWZhdWx0LmFybW9yLm1lc3NhZ2U7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIC8vIEJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLXG4gICAgICAgICAgLy8gVXNlZCBmb3IgYXJtb3JpbmcgcHVibGljIGtleXMuXG4gICAgICAgICAgaWYgKC9QVUJMSUMgS0VZIEJMT0NLLy50ZXN0KGhlYWRlclsxXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBfZW51bXMyLmRlZmF1bHQuYXJtb3IucHVibGljX2tleTtcbiAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIC8vIEJFR0lOIFBHUCBQUklWQVRFIEtFWSBCTE9DS1xuICAgICAgICAgICAgLy8gVXNlZCBmb3IgYXJtb3JpbmcgcHJpdmF0ZSBrZXlzLlxuICAgICAgICAgICAgaWYgKC9QUklWQVRFIEtFWSBCTE9DSy8udGVzdChoZWFkZXJbMV0pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfZW51bXMyLmRlZmF1bHQuYXJtb3IucHJpdmF0ZV9rZXk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgLy8gQkVHSU4gUEdQIFNJR05BVFVSRVxuICAgICAgICAgICAgICAvLyBVc2VkIGZvciBkZXRhY2hlZCBzaWduYXR1cmVzLCBPcGVuUEdQL01JTUUgc2lnbmF0dXJlcywgYW5kXG4gICAgICAgICAgICAgIC8vIGNsZWFydGV4dCBzaWduYXR1cmVzLiBOb3RlIHRoYXQgUEdQIDIueCB1c2VzIEJFR0lOIFBHUCBNRVNTQUdFXG4gICAgICAgICAgICAgIC8vIGZvciBkZXRhY2hlZCBzaWduYXR1cmVzLlxuICAgICAgICAgICAgICBpZiAoL1NJR05BVFVSRS8udGVzdChoZWFkZXJbMV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9lbnVtczIuZGVmYXVsdC5hcm1vci5zaWduYXR1cmU7XG4gICAgICAgICAgICAgIH1cbn1cblxuLyoqXG4gKiBBZGQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGUgYXJtb3IgdmVyc2lvbiBvZiBhbiBPcGVuUEdQIGJpbmFyeVxuICogcGFja2V0IGJsb2NrLlxuICogQGF1dGhvciAgQWxleFxuICogQHZlcnNpb24gMjAxMS0xMi0xNlxuICogQHBhcmFtIHtTdHJpbmd9IGN1c3RvbUNvbW1lbnQgKG9wdGlvbmFsKSBhZGRpdGlvbmFsIGNvbW1lbnQgdG8gYWRkIHRvIHRoZSBhcm1vcmVkIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gVGhlIGhlYWRlciBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBhZGRoZWFkZXIoY3VzdG9tQ29tbWVudCkge1xuICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgaWYgKF9jb25maWcyLmRlZmF1bHQuc2hvd192ZXJzaW9uKSB7XG4gICAgcmVzdWx0ICs9IFwiVmVyc2lvbjogXCIgKyBfY29uZmlnMi5kZWZhdWx0LnZlcnNpb25zdHJpbmcgKyAnXFxyXFxuJztcbiAgfVxuICBpZiAoX2NvbmZpZzIuZGVmYXVsdC5zaG93X2NvbW1lbnQpIHtcbiAgICByZXN1bHQgKz0gXCJDb21tZW50OiBcIiArIF9jb25maWcyLmRlZmF1bHQuY29tbWVudHN0cmluZyArICdcXHJcXG4nO1xuICB9XG4gIGlmIChjdXN0b21Db21tZW50KSB7XG4gICAgcmVzdWx0ICs9IFwiQ29tbWVudDogXCIgKyBjdXN0b21Db21tZW50ICsgJ1xcclxcbic7XG4gIH1cbiAgcmVzdWx0ICs9ICdcXHJcXG4nO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgYSBjaGVja3N1bSBvdmVyIHRoZSBnaXZlbiBkYXRhIGFuZCByZXR1cm5zIGl0IGJhc2U2NCBlbmNvZGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YSBEYXRhIHRvIGNyZWF0ZSBhIENSQy0yNCBjaGVja3N1bSBmb3JcbiAqIEByZXR1cm5zIHtTdHJpbmd9IEJhc2U2NCBlbmNvZGVkIGNoZWNrc3VtXG4gKi9cbmZ1bmN0aW9uIGdldENoZWNrU3VtKGRhdGEpIHtcbiAgdmFyIGMgPSBjcmVhdGVjcmMyNChkYXRhKTtcbiAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoW2MgPj4gMTYsIGMgPj4gOCAmIDB4RkYsIGMgJiAweEZGXSk7XG4gIHJldHVybiBfYmFzZTIuZGVmYXVsdC5lbmNvZGUoYnl0ZXMpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGNoZWNrc3VtIG92ZXIgdGhlIGdpdmVuIGRhdGEgYW5kIGNvbXBhcmVzIGl0IHdpdGggdGhlXG4gKiBnaXZlbiBiYXNlNjQgZW5jb2RlZCBjaGVja3N1bVxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgRGF0YSB0byBjcmVhdGUgYSBDUkMtMjQgY2hlY2tzdW0gZm9yXG4gKiBAcGFyYW0ge1N0cmluZ30gY2hlY2tzdW0gQmFzZTY0IGVuY29kZWQgY2hlY2tzdW1cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBnaXZlbiBjaGVja3N1bSBpcyBjb3JyZWN0OyBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gdmVyaWZ5Q2hlY2tTdW0oZGF0YSwgY2hlY2tzdW0pIHtcbiAgdmFyIGMgPSBnZXRDaGVja1N1bShkYXRhKTtcbiAgdmFyIGQgPSBjaGVja3N1bTtcbiAgcmV0dXJuIGNbMF0gPT09IGRbMF0gJiYgY1sxXSA9PT0gZFsxXSAmJiBjWzJdID09PSBkWzJdICYmIGNbM10gPT09IGRbM107XG59XG4vKipcbiAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBhIENSQy0yNCBjaGVja3N1bSBvdmVyIGEgZ2l2ZW4gc3RyaW5nIChkYXRhKVxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgRGF0YSB0byBjcmVhdGUgYSBDUkMtMjQgY2hlY2tzdW0gZm9yXG4gKiBAcmV0dXJucyB7SW50ZWdlcn0gVGhlIENSQy0yNCBjaGVja3N1bSBhcyBudW1iZXJcbiAqL1xudmFyIGNyY190YWJsZSA9IFsweDAwMDAwMDAwLCAweDAwODY0Y2ZiLCAweDAxOGFkNTBkLCAweDAxMGM5OWY2LCAweDAzOTNlNmUxLCAweDAzMTVhYTFhLCAweDAyMTkzM2VjLCAweDAyOWY3ZjE3LCAweDA3YTE4MTM5LCAweDA3MjdjZGMyLCAweDA2MmI1NDM0LCAweDA2YWQxOGNmLCAweDA0MzI2N2Q4LCAweDA0YjQyYjIzLCAweDA1YjhiMmQ1LCAweDA1M2VmZTJlLCAweDBmYzU0ZTg5LCAweDBmNDMwMjcyLCAweDBlNGY5Yjg0LCAweDBlYzlkNzdmLCAweDBjNTZhODY4LCAweDBjZDBlNDkzLCAweDBkZGM3ZDY1LCAweDBkNWEzMTllLCAweDA4NjRjZmIwLCAweDA4ZTI4MzRiLCAweDA5ZWUxYWJkLCAweDA5Njg1NjQ2LCAweDBiZjcyOTUxLCAweDBiNzE2NWFhLCAweDBhN2RmYzVjLCAweDBhZmJiMGE3LCAweDFmMGNkMWU5LCAweDFmOGE5ZDEyLCAweDFlODYwNGU0LCAweDFlMDA0ODFmLCAweDFjOWYzNzA4LCAweDFjMTk3YmYzLCAweDFkMTVlMjA1LCAweDFkOTNhZWZlLCAweDE4YWQ1MGQwLCAweDE4MmIxYzJiLCAweDE5Mjc4NWRkLCAweDE5YTFjOTI2LCAweDFiM2ViNjMxLCAweDFiYjhmYWNhLCAweDFhYjQ2MzNjLCAweDFhMzIyZmM3LCAweDEwYzk5ZjYwLCAweDEwNGZkMzliLCAweDExNDM0YTZkLCAweDExYzUwNjk2LCAweDEzNWE3OTgxLCAweDEzZGMzNTdhLCAweDEyZDBhYzhjLCAweDEyNTZlMDc3LCAweDE3NjgxZTU5LCAweDE3ZWU1MmEyLCAweDE2ZTJjYjU0LCAweDE2NjQ4N2FmLCAweDE0ZmJmOGI4LCAweDE0N2RiNDQzLCAweDE1NzEyZGI1LCAweDE1Zjc2MTRlLCAweDNlMTlhM2QyLCAweDNlOWZlZjI5LCAweDNmOTM3NmRmLCAweDNmMTUzYTI0LCAweDNkOGE0NTMzLCAweDNkMGMwOWM4LCAweDNjMDA5MDNlLCAweDNjODZkY2M1LCAweDM5YjgyMmViLCAweDM5M2U2ZTEwLCAweDM4MzJmN2U2LCAweDM4YjRiYjFkLCAweDNhMmJjNDBhLCAweDNhYWQ4OGYxLCAweDNiYTExMTA3LCAweDNiMjc1ZGZjLCAweDMxZGNlZDViLCAweDMxNWFhMWEwLCAweDMwNTYzODU2LCAweDMwZDA3NGFkLCAweDMyNGYwYmJhLCAweDMyYzk0NzQxLCAweDMzYzVkZWI3LCAweDMzNDM5MjRjLCAweDM2N2Q2YzYyLCAweDM2ZmIyMDk5LCAweDM3ZjdiOTZmLCAweDM3NzFmNTk0LCAweDM1ZWU4YTgzLCAweDM1NjhjNjc4LCAweDM0NjQ1ZjhlLCAweDM0ZTIxMzc1LCAweDIxMTU3MjNiLCAweDIxOTMzZWMwLCAweDIwOWZhNzM2LCAweDIwMTllYmNkLCAweDIyODY5NGRhLCAweDIyMDBkODIxLCAweDIzMGM0MWQ3LCAweDIzOGEwZDJjLCAweDI2YjRmMzAyLCAweDI2MzJiZmY5LCAweDI3M2UyNjBmLCAweDI3Yjg2YWY0LCAweDI1MjcxNWUzLCAweDI1YTE1OTE4LCAweDI0YWRjMGVlLCAweDI0MmI4YzE1LCAweDJlZDAzY2IyLCAweDJlNTY3MDQ5LCAweDJmNWFlOWJmLCAweDJmZGNhNTQ0LCAweDJkNDNkYTUzLCAweDJkYzU5NmE4LCAweDJjYzkwZjVlLCAweDJjNGY0M2E1LCAweDI5NzFiZDhiLCAweDI5ZjdmMTcwLCAweDI4ZmI2ODg2LCAweDI4N2QyNDdkLCAweDJhZTI1YjZhLCAweDJhNjQxNzkxLCAweDJiNjg4ZTY3LCAweDJiZWVjMjljLCAweDdjMzM0N2E0LCAweDdjYjUwYjVmLCAweDdkYjk5MmE5LCAweDdkM2ZkZTUyLCAweDdmYTBhMTQ1LCAweDdmMjZlZGJlLCAweDdlMmE3NDQ4LCAweDdlYWMzOGIzLCAweDdiOTJjNjlkLCAweDdiMTQ4YTY2LCAweDdhMTgxMzkwLCAweDdhOWU1ZjZiLCAweDc4MDEyMDdjLCAweDc4ODc2Yzg3LCAweDc5OGJmNTcxLCAweDc5MGRiOThhLCAweDczZjYwOTJkLCAweDczNzA0NWQ2LCAweDcyN2NkYzIwLCAweDcyZmE5MGRiLCAweDcwNjVlZmNjLCAweDcwZTNhMzM3LCAweDcxZWYzYWMxLCAweDcxNjk3NjNhLCAweDc0NTc4ODE0LCAweDc0ZDFjNGVmLCAweDc1ZGQ1ZDE5LCAweDc1NWIxMWUyLCAweDc3YzQ2ZWY1LCAweDc3NDIyMjBlLCAweDc2NGViYmY4LCAweDc2YzhmNzAzLCAweDYzM2Y5NjRkLCAweDYzYjlkYWI2LCAweDYyYjU0MzQwLCAweDYyMzMwZmJiLCAweDYwYWM3MGFjLCAweDYwMmEzYzU3LCAweDYxMjZhNWExLCAweDYxYTBlOTVhLCAweDY0OWUxNzc0LCAweDY0MTg1YjhmLCAweDY1MTRjMjc5LCAweDY1OTI4ZTgyLCAweDY3MGRmMTk1LCAweDY3OGJiZDZlLCAweDY2ODcyNDk4LCAweDY2MDE2ODYzLCAweDZjZmFkOGM0LCAweDZjN2M5NDNmLCAweDZkNzAwZGM5LCAweDZkZjY0MTMyLCAweDZmNjkzZTI1LCAweDZmZWY3MmRlLCAweDZlZTNlYjI4LCAweDZlNjVhN2QzLCAweDZiNWI1OWZkLCAweDZiZGQxNTA2LCAweDZhZDE4Y2YwLCAweDZhNTdjMDBiLCAweDY4YzhiZjFjLCAweDY4NGVmM2U3LCAweDY5NDI2YTExLCAweDY5YzQyNmVhLCAweDQyMmFlNDc2LCAweDQyYWNhODhkLCAweDQzYTAzMTdiLCAweDQzMjY3ZDgwLCAweDQxYjkwMjk3LCAweDQxM2Y0ZTZjLCAweDQwMzNkNzlhLCAweDQwYjU5YjYxLCAweDQ1OGI2NTRmLCAweDQ1MGQyOWI0LCAweDQ0MDFiMDQyLCAweDQ0ODdmY2I5LCAweDQ2MTg4M2FlLCAweDQ2OWVjZjU1LCAweDQ3OTI1NmEzLCAweDQ3MTQxYTU4LCAweDRkZWZhYWZmLCAweDRkNjllNjA0LCAweDRjNjU3ZmYyLCAweDRjZTMzMzA5LCAweDRlN2M0YzFlLCAweDRlZmEwMGU1LCAweDRmZjY5OTEzLCAweDRmNzBkNWU4LCAweDRhNGUyYmM2LCAweDRhYzg2NzNkLCAweDRiYzRmZWNiLCAweDRiNDJiMjMwLCAweDQ5ZGRjZDI3LCAweDQ5NWI4MWRjLCAweDQ4NTcxODJhLCAweDQ4ZDE1NGQxLCAweDVkMjYzNTlmLCAweDVkYTA3OTY0LCAweDVjYWNlMDkyLCAweDVjMmFhYzY5LCAweDVlYjVkMzdlLCAweDVlMzM5Zjg1LCAweDVmM2YwNjczLCAweDVmYjk0YTg4LCAweDVhODdiNGE2LCAweDVhMDFmODVkLCAweDViMGQ2MWFiLCAweDViOGIyZDUwLCAweDU5MTQ1MjQ3LCAweDU5OTIxZWJjLCAweDU4OWU4NzRhLCAweDU4MThjYmIxLCAweDUyZTM3YjE2LCAweDUyNjUzN2VkLCAweDUzNjlhZTFiLCAweDUzZWZlMmUwLCAweDUxNzA5ZGY3LCAweDUxZjZkMTBjLCAweDUwZmE0OGZhLCAweDUwN2MwNDAxLCAweDU1NDJmYTJmLCAweDU1YzRiNmQ0LCAweDU0YzgyZjIyLCAweDU0NGU2M2Q5LCAweDU2ZDExY2NlLCAweDU2NTc1MDM1LCAweDU3NWJjOWMzLCAweDU3ZGQ4NTM4XTtcblxuZnVuY3Rpb24gY3JlYXRlY3JjMjQoaW5wdXQpIHtcbiAgdmFyIGNyYyA9IDB4QjcwNENFO1xuXG4gIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBpbnB1dC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjcmMgPSBjcmMgPDwgOCBeIGNyY190YWJsZVsoY3JjID4+IDE2IF4gaW5wdXRbaW5kZXhdKSAmIDB4ZmZdO1xuICB9XG4gIHJldHVybiBjcmMgJiAweGZmZmZmZjtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBtZXNzYWdlIGludG8gdHdvIHBhcnRzLCB0aGUgaGVhZGVycyBhbmQgdGhlIGJvZHkuIFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IE9wZW5QR1AgYXJtb3JlZCBtZXNzYWdlIHBhcnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIGF0dHJpYnV0ZSBcImhlYWRlcnNcIiBjb250YWluaW5nIHRoZSBoZWFkZXJzXG4gKiBhbmQgYW4gYXR0cmlidXRlIFwiYm9keVwiIGNvbnRhaW5pbmcgdGhlIGJvZHkuXG4gKi9cbmZ1bmN0aW9uIHNwbGl0SGVhZGVycyh0ZXh0KSB7XG4gIC8vIGVtcHR5IGxpbmUgd2l0aCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnNcbiAgdmFyIHJlRW1wdHlMaW5lID0gL15bIFxcZlxcclxcdFxcdTAwYTBcXHUyMDAwLVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDBdKlxcbi9tO1xuICB2YXIgaGVhZGVycyA9ICcnO1xuICB2YXIgYm9keSA9IHRleHQ7XG5cbiAgdmFyIG1hdGNoUmVzdWx0ID0gcmVFbXB0eUxpbmUuZXhlYyh0ZXh0KTtcblxuICBpZiAobWF0Y2hSZXN1bHQgIT09IG51bGwpIHtcbiAgICBoZWFkZXJzID0gdGV4dC5zbGljZSgwLCBtYXRjaFJlc3VsdC5pbmRleCk7XG4gICAgYm9keSA9IHRleHQuc2xpY2UobWF0Y2hSZXN1bHQuaW5kZXggKyBtYXRjaFJlc3VsdFswXS5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignTWFuZGF0b3J5IGJsYW5rIGxpbmUgbWlzc2luZyBiZXR3ZWVuIGFybW9yIGhlYWRlcnMgYW5kIGFybW9yIGRhdGEnKTtcbiAgfVxuXG4gIGhlYWRlcnMgPSBoZWFkZXJzLnNwbGl0KCdcXG4nKTtcbiAgLy8gcmVtb3ZlIGVtcHR5IGVudHJ5XG4gIGhlYWRlcnMucG9wKCk7XG5cbiAgcmV0dXJuIHsgaGVhZGVyczogaGVhZGVycywgYm9keTogYm9keSB9O1xufVxuXG4vKipcbiAqIFZlcmlmeSBhcm1vcmVkIGhlYWRlcnMuIFJGQzQ4ODAsIHNlY3Rpb24gNi4zOiBcIk9wZW5QR1Agc2hvdWxkIGNvbnNpZGVyIGltcHJvcGVybHkgZm9ybWF0dGVkXG4gKiBBcm1vciBIZWFkZXJzIHRvIGJlIGNvcnJ1cHRpb24gb2YgdGhlIEFTQ0lJIEFybW9yLlwiXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7QXJyYXk8U3RyaW5nPn0gaGVhZGVycyBBcm1vciBoZWFkZXJzXG4gKi9cbmZ1bmN0aW9uIHZlcmlmeUhlYWRlcnMoaGVhZGVycykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIS9eKFteXFxzOl18W15cXHM6XVteOl0qW15cXHM6XSk6IC4rJC8udGVzdChoZWFkZXJzW2ldKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXByb3Blcmx5IGZvcm1hdHRlZCBhcm1vciBoZWFkZXI6ICcgKyBoZWFkZXJzW2ldKTtcbiAgICB9XG4gICAgaWYgKCEvXihWZXJzaW9ufENvbW1lbnR8TWVzc2FnZUlEfEhhc2h8Q2hhcnNldCk6IC4rJC8udGVzdChoZWFkZXJzW2ldKSkge1xuICAgICAgX3V0aWwyLmRlZmF1bHQucHJpbnRfZGVidWdfZXJyb3IobmV3IEVycm9yKCdVbmtub3duIGhlYWRlcjogJyArIGhlYWRlcnNbaV0pKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBtZXNzYWdlIGludG8gdHdvIHBhcnRzLCB0aGUgYm9keSBhbmQgdGhlIGNoZWNrc3VtLiBUaGlzIGlzIGFuIGludGVybmFsIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBPcGVuUEdQIGFybW9yZWQgbWVzc2FnZSBwYXJ0XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBhdHRyaWJ1dGUgXCJib2R5XCIgY29udGFpbmluZyB0aGUgYm9keVxuICogYW5kIGFuIGF0dHJpYnV0ZSBcImNoZWNrc3VtXCIgY29udGFpbmluZyB0aGUgY2hlY2tzdW0uXG4gKi9cbmZ1bmN0aW9uIHNwbGl0Q2hlY2tzdW0odGV4dCkge1xuICB0ZXh0ID0gdGV4dC50cmltKCk7XG4gIHZhciBib2R5ID0gdGV4dDtcbiAgdmFyIGNoZWNrc3VtID0gXCJcIjtcblxuICB2YXIgbGFzdEVxdWFscyA9IHRleHQubGFzdEluZGV4T2YoXCI9XCIpO1xuXG4gIGlmIChsYXN0RXF1YWxzID49IDAgJiYgbGFzdEVxdWFscyAhPT0gdGV4dC5sZW5ndGggLSAxKSB7XG4gICAgLy8gJz0nIGFzIHRoZSBsYXN0IGNoYXIgbWVhbnMgbm8gY2hlY2tzdW1cbiAgICBib2R5ID0gdGV4dC5zbGljZSgwLCBsYXN0RXF1YWxzKTtcbiAgICBjaGVja3N1bSA9IHRleHQuc2xpY2UobGFzdEVxdWFscyArIDEpLnN1YnN0cigwLCA0KTtcbiAgfVxuXG4gIHJldHVybiB7IGJvZHk6IGJvZHksIGNoZWNrc3VtOiBjaGVja3N1bSB9O1xufVxuXG4vKipcbiAqIERlQXJtb3IgYW4gT3BlblBHUCBhcm1vcmVkIG1lc3NhZ2U7IHZlcmlmeSB0aGUgY2hlY2tzdW0gYW5kIHJldHVyblxuICogdGhlIGVuY29kZWQgYnl0ZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IE9wZW5QR1AgYXJtb3JlZCBtZXNzYWdlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBhdHRyaWJ1dGUgXCJ0ZXh0XCIgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0ZXh0LFxuICogYW4gYXR0cmlidXRlIFwiZGF0YVwiIGNvbnRhaW5pbmcgdGhlIGJ5dGVzIGFuZCBcInR5cGVcIiBmb3IgdGhlIEFTQ0lJIGFybW9yIHR5cGVcbiAqIEBzdGF0aWNcbiAqL1xuZnVuY3Rpb24gZGVhcm1vcih0ZXh0KSB7XG4gIHZhciByZVNwbGl0ID0gL14tLS0tLVteLV0rLS0tLS0kXFxuL207XG5cbiAgLy8gdHJpbSBzdHJpbmcgYW5kIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGF0IGVuZCBvZiBsaW5lc1xuICB0ZXh0ID0gdGV4dC50cmltKCkucmVwbGFjZSgvW1xcdFxcciBdK1xcbi9nLCAnXFxuJyk7XG5cbiAgdmFyIHR5cGUgPSBnZXRUeXBlKHRleHQpO1xuXG4gIHRleHQgPSB0ZXh0ICsgXCJcXG5cIjtcbiAgdmFyIHNwbGl0dGV4dCA9IHRleHQuc3BsaXQocmVTcGxpdCk7XG5cbiAgLy8gSUUgaGFzIGEgYnVnIGluIHNwbGl0IHdpdGggYSByZS4gSWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuICAvLyBzdHJpbmcgaXQgZG9lc24ndCBjcmVhdGUgYW4gZW1wdHkgYXJyYXkgZWxlbWVudCAwLiBTbyB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzXG4gIC8vIHNvIHdlIGtub3cgdGhlIGluZGV4IG9mIHRoZSBkYXRhIHdlIGFyZSBpbnRlcmVzdGVkIGluLlxuICB2YXIgaW5kZXhCYXNlID0gMTtcblxuICB2YXIgcmVzdWx0ID0gdm9pZCAwO1xuICB2YXIgY2hlY2tzdW0gPSB2b2lkIDA7XG4gIHZhciBtc2cgPSB2b2lkIDA7XG5cbiAgaWYgKHRleHQuc2VhcmNoKHJlU3BsaXQpICE9PSBzcGxpdHRleHRbMF0ubGVuZ3RoKSB7XG4gICAgaW5kZXhCYXNlID0gMDtcbiAgfVxuXG4gIGlmICh0eXBlICE9PSAyKSB7XG4gICAgbXNnID0gc3BsaXRIZWFkZXJzKHNwbGl0dGV4dFtpbmRleEJhc2VdKTtcbiAgICB2YXIgbXNnX3N1bSA9IHNwbGl0Q2hlY2tzdW0obXNnLmJvZHkpO1xuXG4gICAgcmVzdWx0ID0ge1xuICAgICAgZGF0YTogX2Jhc2UyLmRlZmF1bHQuZGVjb2RlKG1zZ19zdW0uYm9keSksXG4gICAgICBoZWFkZXJzOiBtc2cuaGVhZGVycyxcbiAgICAgIHR5cGU6IHR5cGVcbiAgICB9O1xuXG4gICAgY2hlY2tzdW0gPSBtc2dfc3VtLmNoZWNrc3VtO1xuICB9IGVsc2Uge1xuICAgIC8vIFJldmVyc2UgZGFzaC1lc2NhcGluZyBmb3IgbXNnXG4gICAgbXNnID0gc3BsaXRIZWFkZXJzKHNwbGl0dGV4dFtpbmRleEJhc2VdLnJlcGxhY2UoL14tIC9tZywgJycpKTtcbiAgICB2YXIgc2lnID0gc3BsaXRIZWFkZXJzKHNwbGl0dGV4dFtpbmRleEJhc2UgKyAxXS5yZXBsYWNlKC9eLSAvbWcsICcnKSk7XG4gICAgdmVyaWZ5SGVhZGVycyhzaWcuaGVhZGVycyk7XG4gICAgdmFyIHNpZ19zdW0gPSBzcGxpdENoZWNrc3VtKHNpZy5ib2R5KTtcblxuICAgIHJlc3VsdCA9IHtcbiAgICAgIHRleHQ6IG1zZy5ib2R5LnJlcGxhY2UoL1xcbiQvLCAnJykucmVwbGFjZSgvXFxuL2csIFwiXFxyXFxuXCIpLFxuICAgICAgZGF0YTogX2Jhc2UyLmRlZmF1bHQuZGVjb2RlKHNpZ19zdW0uYm9keSksXG4gICAgICBoZWFkZXJzOiBtc2cuaGVhZGVycyxcbiAgICAgIHR5cGU6IHR5cGVcbiAgICB9O1xuXG4gICAgY2hlY2tzdW0gPSBzaWdfc3VtLmNoZWNrc3VtO1xuICB9XG5cbiAgaWYgKCF2ZXJpZnlDaGVja1N1bShyZXN1bHQuZGF0YSwgY2hlY2tzdW0pICYmIChjaGVja3N1bSB8fCBfY29uZmlnMi5kZWZhdWx0LmNoZWNrc3VtX3JlcXVpcmVkKSkge1xuICAgIC8vIHdpbGwgTk9UIHRocm93IGVycm9yIGlmIGNoZWNrc3VtIGlzIGVtcHR5IEFORCBjaGVja3N1bSBpcyBub3QgcmVxdWlyZWQgKEdQRyBjb21wYXRpYmlsaXR5KVxuICAgIHRocm93IG5ldyBFcnJvcihcIkFzY2lpIGFybW9yIGludGVncml0eSBjaGVjayBvbiBtZXNzYWdlIGZhaWxlZDogJ1wiICsgY2hlY2tzdW0gKyBcIicgc2hvdWxkIGJlICdcIiArIGdldENoZWNrU3VtKHJlc3VsdC5kYXRhKSArIFwiJ1wiKTtcbiAgfVxuXG4gIHZlcmlmeUhlYWRlcnMocmVzdWx0LmhlYWRlcnMpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQXJtb3IgYW4gT3BlblBHUCBiaW5hcnkgcGFja2V0IGJsb2NrXG4gKiBAcGFyYW0ge0ludGVnZXJ9IG1lc3NhZ2V0eXBlIHR5cGUgb2YgdGhlIG1lc3NhZ2VcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0ge0ludGVnZXJ9IHBhcnRpbmRleFxuICogQHBhcmFtIHtJbnRlZ2VyfSBwYXJ0dG90YWxcbiAqIEBwYXJhbSB7U3RyaW5nfSBjdXN0b21Db21tZW50IChvcHRpb25hbCkgYWRkaXRpb25hbCBjb21tZW50IHRvIGFkZCB0byB0aGUgYXJtb3JlZCBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IEFybW9yZWQgdGV4dFxuICogQHN0YXRpY1xuICovXG5mdW5jdGlvbiBhcm1vcihtZXNzYWdldHlwZSwgYm9keSwgcGFydGluZGV4LCBwYXJ0dG90YWwsIGN1c3RvbUNvbW1lbnQpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBzd2l0Y2ggKG1lc3NhZ2V0eXBlKSB7XG4gICAgY2FzZSBfZW51bXMyLmRlZmF1bHQuYXJtb3IubXVsdGlwYXJ0X3NlY3Rpb246XG4gICAgICByZXN1bHQucHVzaChcIi0tLS0tQkVHSU4gUEdQIE1FU1NBR0UsIFBBUlQgXCIgKyBwYXJ0aW5kZXggKyBcIi9cIiArIHBhcnR0b3RhbCArIFwiLS0tLS1cXHJcXG5cIik7XG4gICAgICByZXN1bHQucHVzaChhZGRoZWFkZXIoY3VzdG9tQ29tbWVudCkpO1xuICAgICAgcmVzdWx0LnB1c2goX2Jhc2UyLmRlZmF1bHQuZW5jb2RlKGJvZHkpKTtcbiAgICAgIHJlc3VsdC5wdXNoKFwiXFxyXFxuPVwiICsgZ2V0Q2hlY2tTdW0oYm9keSkgKyBcIlxcclxcblwiKTtcbiAgICAgIHJlc3VsdC5wdXNoKFwiLS0tLS1FTkQgUEdQIE1FU1NBR0UsIFBBUlQgXCIgKyBwYXJ0aW5kZXggKyBcIi9cIiArIHBhcnR0b3RhbCArIFwiLS0tLS1cXHJcXG5cIik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5hcm1vci5tdWx0aXBhcnRfbGFzdDpcbiAgICAgIHJlc3VsdC5wdXNoKFwiLS0tLS1CRUdJTiBQR1AgTUVTU0FHRSwgUEFSVCBcIiArIHBhcnRpbmRleCArIFwiLS0tLS1cXHJcXG5cIik7XG4gICAgICByZXN1bHQucHVzaChhZGRoZWFkZXIoY3VzdG9tQ29tbWVudCkpO1xuICAgICAgcmVzdWx0LnB1c2goX2Jhc2UyLmRlZmF1bHQuZW5jb2RlKGJvZHkpKTtcbiAgICAgIHJlc3VsdC5wdXNoKFwiXFxyXFxuPVwiICsgZ2V0Q2hlY2tTdW0oYm9keSkgKyBcIlxcclxcblwiKTtcbiAgICAgIHJlc3VsdC5wdXNoKFwiLS0tLS1FTkQgUEdQIE1FU1NBR0UsIFBBUlQgXCIgKyBwYXJ0aW5kZXggKyBcIi0tLS0tXFxyXFxuXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBfZW51bXMyLmRlZmF1bHQuYXJtb3Iuc2lnbmVkOlxuICAgICAgcmVzdWx0LnB1c2goXCJcXHJcXG4tLS0tLUJFR0lOIFBHUCBTSUdORUQgTUVTU0FHRS0tLS0tXFxyXFxuXCIpO1xuICAgICAgcmVzdWx0LnB1c2goXCJIYXNoOiBcIiArIGJvZHkuaGFzaCArIFwiXFxyXFxuXFxyXFxuXCIpO1xuICAgICAgcmVzdWx0LnB1c2goYm9keS50ZXh0LnJlcGxhY2UoL14tL21nLCBcIi0gLVwiKSk7XG4gICAgICByZXN1bHQucHVzaChcIlxcclxcbi0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tXFxyXFxuXCIpO1xuICAgICAgcmVzdWx0LnB1c2goYWRkaGVhZGVyKGN1c3RvbUNvbW1lbnQpKTtcbiAgICAgIHJlc3VsdC5wdXNoKF9iYXNlMi5kZWZhdWx0LmVuY29kZShib2R5LmRhdGEpKTtcbiAgICAgIHJlc3VsdC5wdXNoKFwiXFxyXFxuPVwiICsgZ2V0Q2hlY2tTdW0oYm9keS5kYXRhKSArIFwiXFxyXFxuXCIpO1xuICAgICAgcmVzdWx0LnB1c2goXCItLS0tLUVORCBQR1AgU0lHTkFUVVJFLS0tLS1cXHJcXG5cIik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5hcm1vci5tZXNzYWdlOlxuICAgICAgcmVzdWx0LnB1c2goXCItLS0tLUJFR0lOIFBHUCBNRVNTQUdFLS0tLS1cXHJcXG5cIik7XG4gICAgICByZXN1bHQucHVzaChhZGRoZWFkZXIoY3VzdG9tQ29tbWVudCkpO1xuICAgICAgcmVzdWx0LnB1c2goX2Jhc2UyLmRlZmF1bHQuZW5jb2RlKGJvZHkpKTtcbiAgICAgIHJlc3VsdC5wdXNoKFwiXFxyXFxuPVwiICsgZ2V0Q2hlY2tTdW0oYm9keSkgKyBcIlxcclxcblwiKTtcbiAgICAgIHJlc3VsdC5wdXNoKFwiLS0tLS1FTkQgUEdQIE1FU1NBR0UtLS0tLVxcclxcblwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LmFybW9yLnB1YmxpY19rZXk6XG4gICAgICByZXN1bHQucHVzaChcIi0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLVxcclxcblwiKTtcbiAgICAgIHJlc3VsdC5wdXNoKGFkZGhlYWRlcihjdXN0b21Db21tZW50KSk7XG4gICAgICByZXN1bHQucHVzaChfYmFzZTIuZGVmYXVsdC5lbmNvZGUoYm9keSkpO1xuICAgICAgcmVzdWx0LnB1c2goXCJcXHJcXG49XCIgKyBnZXRDaGVja1N1bShib2R5KSArIFwiXFxyXFxuXCIpO1xuICAgICAgcmVzdWx0LnB1c2goXCItLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxyXFxuXFxyXFxuXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBfZW51bXMyLmRlZmF1bHQuYXJtb3IucHJpdmF0ZV9rZXk6XG4gICAgICByZXN1bHQucHVzaChcIi0tLS0tQkVHSU4gUEdQIFBSSVZBVEUgS0VZIEJMT0NLLS0tLS1cXHJcXG5cIik7XG4gICAgICByZXN1bHQucHVzaChhZGRoZWFkZXIoY3VzdG9tQ29tbWVudCkpO1xuICAgICAgcmVzdWx0LnB1c2goX2Jhc2UyLmRlZmF1bHQuZW5jb2RlKGJvZHkpKTtcbiAgICAgIHJlc3VsdC5wdXNoKFwiXFxyXFxuPVwiICsgZ2V0Q2hlY2tTdW0oYm9keSkgKyBcIlxcclxcblwiKTtcbiAgICAgIHJlc3VsdC5wdXNoKFwiLS0tLS1FTkQgUEdQIFBSSVZBVEUgS0VZIEJMT0NLLS0tLS1cXHJcXG5cIik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5hcm1vci5zaWduYXR1cmU6XG4gICAgICByZXN1bHQucHVzaChcIi0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tXFxyXFxuXCIpO1xuICAgICAgcmVzdWx0LnB1c2goYWRkaGVhZGVyKGN1c3RvbUNvbW1lbnQpKTtcbiAgICAgIHJlc3VsdC5wdXNoKF9iYXNlMi5kZWZhdWx0LmVuY29kZShib2R5KSk7XG4gICAgICByZXN1bHQucHVzaChcIlxcclxcbj1cIiArIGdldENoZWNrU3VtKGJvZHkpICsgXCJcXHJcXG5cIik7XG4gICAgICByZXN1bHQucHVzaChcIi0tLS0tRU5EIFBHUCBTSUdOQVRVUkUtLS0tLVxcclxcblwiKTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICBlbmNvZGU6IGFybW9yLFxuICBkZWNvZGU6IGRlYXJtb3Jcbn07XG5cbn0se1wiLi4vY29uZmlnXCI6MzI1LFwiLi4vZW51bXMuanNcIjozNTksXCIuLi91dGlsXCI6Mzk4LFwiLi9iYXNlNjQuanNcIjozNTh9XSwzNTg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuLyogT3BlblBHUCByYWRpeC02NC9iYXNlNjQgc3RyaW5nIGVuY29kaW5nL2RlY29kaW5nXG4gKiBDb3B5cmlnaHQgMjAwNSBIZXJiZXJ0IEhhbmV3aW5rZWwsIHd3dy5oYW5lV0lOLmRlXG4gKiB2ZXJzaW9uIDEuMCwgY2hlY2sgd3d3LmhhbmVXSU4uZGUgZm9yIHRoZSBsYXRlc3QgdmVyc2lvblxuICpcbiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMsIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LlxuICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBvciBzZWxsIHRoaXMgc29mdHdhcmUsIHdpdGggb3JcbiAqIHdpdGhvdXQgZmVlLCBmb3IgYW55IHB1cnBvc2UgYW5kIGJ5IGFueSBpbmRpdmlkdWFsIG9yIG9yZ2FuaXphdGlvbiwgaXMgaGVyZWJ5XG4gKiBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcHBlYXJcbiAqIGluIGFsbCBjb3BpZXMuIERpc3RyaWJ1dGlvbiBhcyBhIHBhcnQgb2YgYW4gYXBwbGljYXRpb24gb3IgYmluYXJ5IG11c3RcbiAqIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFsc1xuICogcHJvdmlkZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gb3IgZGlzdHJpYnV0aW9uLlxuICovXG5cbi8qKlxuICogQG1vZHVsZSBlbmNvZGluZy9iYXNlNjRcbiAqL1xuXG52YXIgYjY0cyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJzsgLy8gU3RhbmRhcmQgcmFkaXgtNjRcbnZhciBiNjR1ID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV8nOyAvLyBVUkwtc2FmZSByYWRpeC02NFxuXG4vKipcbiAqIENvbnZlcnQgYmluYXJ5IGFycmF5IHRvIHJhZGl4LTY0XG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHQgVWludDhBcnJheSB0byBjb252ZXJ0XG4gKiBAcGFyYW0ge2Jvb2x9IHUgaWYgdHJ1ZSwgb3V0cHV0IGlzIFVSTC1zYWZlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSByYWRpeC02NCB2ZXJzaW9uIG9mIGlucHV0IHN0cmluZ1xuICogQHN0YXRpY1xuICovXG5mdW5jdGlvbiBzMnIodCkge1xuICB2YXIgdSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgLy8gVE9ETyBjaGVjayBidG9hIGFsdGVybmF0aXZlXG4gIHZhciBiNjQgPSB1ID8gYjY0dSA6IGI2NHM7XG4gIHZhciBhID0gdm9pZCAwO1xuICB2YXIgYyA9IHZvaWQgMDtcbiAgdmFyIG4gPSB2b2lkIDA7XG4gIHZhciByID0gW107XG4gIHZhciBsID0gMDtcbiAgdmFyIHMgPSAwO1xuICB2YXIgdGwgPSB0Lmxlbmd0aDtcblxuICBmb3IgKG4gPSAwOyBuIDwgdGw7IG4rKykge1xuICAgIGMgPSB0W25dO1xuICAgIGlmIChzID09PSAwKSB7XG4gICAgICByLnB1c2goYjY0LmNoYXJBdChjID4+IDIgJiA2MykpO1xuICAgICAgYSA9IChjICYgMykgPDwgNDtcbiAgICB9IGVsc2UgaWYgKHMgPT09IDEpIHtcbiAgICAgIHIucHVzaChiNjQuY2hhckF0KGEgfCBjID4+IDQgJiAxNSkpO1xuICAgICAgYSA9IChjICYgMTUpIDw8IDI7XG4gICAgfSBlbHNlIGlmIChzID09PSAyKSB7XG4gICAgICByLnB1c2goYjY0LmNoYXJBdChhIHwgYyA+PiA2ICYgMykpO1xuICAgICAgbCArPSAxO1xuICAgICAgaWYgKGwgJSA2MCA9PT0gMCAmJiAhdSkge1xuICAgICAgICByLnB1c2goXCJcXG5cIik7XG4gICAgICB9XG4gICAgICByLnB1c2goYjY0LmNoYXJBdChjICYgNjMpKTtcbiAgICB9XG4gICAgbCArPSAxO1xuICAgIGlmIChsICUgNjAgPT09IDAgJiYgIXUpIHtcbiAgICAgIHIucHVzaChcIlxcblwiKTtcbiAgICB9XG5cbiAgICBzICs9IDE7XG4gICAgaWYgKHMgPT09IDMpIHtcbiAgICAgIHMgPSAwO1xuICAgIH1cbiAgfVxuICBpZiAocyA+IDApIHtcbiAgICByLnB1c2goYjY0LmNoYXJBdChhKSk7XG4gICAgbCArPSAxO1xuICAgIGlmIChsICUgNjAgPT09IDAgJiYgIXUpIHtcbiAgICAgIHIucHVzaChcIlxcblwiKTtcbiAgICB9XG4gICAgaWYgKCF1KSB7XG4gICAgICByLnB1c2goJz0nKTtcbiAgICAgIGwgKz0gMTtcbiAgICB9XG4gIH1cbiAgaWYgKHMgPT09IDEgJiYgIXUpIHtcbiAgICBpZiAobCAlIDYwID09PSAwICYmICF1KSB7XG4gICAgICByLnB1c2goXCJcXG5cIik7XG4gICAgfVxuICAgIHIucHVzaCgnPScpO1xuICB9XG4gIHJldHVybiByLmpvaW4oJycpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgcmFkaXgtNjQgdG8gYmluYXJ5IGFycmF5XG4gKiBAcGFyYW0ge1N0cmluZ30gdCByYWRpeC02NCBzdHJpbmcgdG8gY29udmVydFxuICogQHBhcmFtIHtib29sfSB1IGlmIHRydWUsIGlucHV0IGlzIGludGVycHJldGVkIGFzIFVSTC1zYWZlXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gYmluYXJ5IGFycmF5IHZlcnNpb24gb2YgaW5wdXQgc3RyaW5nXG4gKiBAc3RhdGljXG4gKi9cbmZ1bmN0aW9uIHIycyh0LCB1KSB7XG4gIC8vIFRPRE8gY2hlY2sgYXRvYiBhbHRlcm5hdGl2ZVxuICB2YXIgYjY0ID0gdSA/IGI2NHUgOiBiNjRzO1xuICB2YXIgYyA9IHZvaWQgMDtcbiAgdmFyIG4gPSB2b2lkIDA7XG4gIHZhciByID0gW107XG4gIHZhciBzID0gMDtcbiAgdmFyIGEgPSAwO1xuICB2YXIgdGwgPSB0Lmxlbmd0aDtcblxuICBmb3IgKG4gPSAwOyBuIDwgdGw7IG4rKykge1xuICAgIGMgPSBiNjQuaW5kZXhPZih0LmNoYXJBdChuKSk7XG4gICAgaWYgKGMgPj0gMCkge1xuICAgICAgaWYgKHMpIHtcbiAgICAgICAgci5wdXNoKGEgfCBjID4+IDYgLSBzICYgMjU1KTtcbiAgICAgIH1cbiAgICAgIHMgPSBzICsgMiAmIDc7XG4gICAgICBhID0gYyA8PCBzICYgMjU1O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocik7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgZW5jb2RlOiBzMnIsXG4gIGRlY29kZTogcjJzXG59O1xuXG59LHt9XSwzNTk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfZGVyZXFfKFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIik7XG5cbnZhciBfc2xpY2VkVG9BcnJheTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zbGljZWRUb0FycmF5Mik7XG5cbnZhciBfZW50cmllcyA9IF9kZXJlcV8oXCJiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2VudHJpZXNcIik7XG5cbnZhciBfZW50cmllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnRyaWVzKTtcblxudmFyIF9zeW1ib2wgPSBfZGVyZXFfKFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbFwiKTtcblxudmFyIF9zeW1ib2wyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3ltYm9sKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBAbW9kdWxlIGVudW1zXG4gKi9cblxudmFyIGJ5VmFsdWUgPSAoMCwgX3N5bWJvbDIuZGVmYXVsdCkoJ2J5VmFsdWUnKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuXG4gIC8qKiBNYXBzIGN1cnZlIG5hbWVzIHVuZGVyIHZhcmlvdXMgc3RhbmRhcmRzIHRvIG9uZVxuICAgKiBAc2VlIHtAbGluayBodHRwczovL3dpa2kuZ251cGcub3JnL0VDQ3xFQ0MgLSBHbnVQRyB3aWtpfVxuICAgKiBAZW51bSB7U3RyaW5nfVxuICAgKiBAcmVhZG9ubHlcbiAgICovXG4gIGN1cnZlOiB7XG4gICAgLyoqIE5JU1QgUC0yNTYgQ3VydmUgKi9cbiAgICBcInAyNTZcIjogXCJwMjU2XCIsXG4gICAgXCJQLTI1NlwiOiBcInAyNTZcIixcbiAgICBcInNlY3AyNTZyMVwiOiBcInAyNTZcIixcbiAgICBcInByaW1lMjU2djFcIjogXCJwMjU2XCIsXG4gICAgXCIxLjIuODQwLjEwMDQ1LjMuMS43XCI6IFwicDI1NlwiLFxuICAgIFwiMmE4NjQ4Y2UzZDAzMDEwN1wiOiBcInAyNTZcIixcbiAgICBcIjJBODY0OENFM0QwMzAxMDdcIjogXCJwMjU2XCIsXG5cbiAgICAvKiogTklTVCBQLTM4NCBDdXJ2ZSAqL1xuICAgIFwicDM4NFwiOiBcInAzODRcIixcbiAgICBcIlAtMzg0XCI6IFwicDM4NFwiLFxuICAgIFwic2VjcDM4NHIxXCI6IFwicDM4NFwiLFxuICAgIFwiMS4zLjEzMi4wLjM0XCI6IFwicDM4NFwiLFxuICAgIFwiMmI4MTA0MDAyMlwiOiBcInAzODRcIixcbiAgICBcIjJCODEwNDAwMjJcIjogXCJwMzg0XCIsXG5cbiAgICAvKiogTklTVCBQLTUyMSBDdXJ2ZSAqL1xuICAgIFwicDUyMVwiOiBcInA1MjFcIixcbiAgICBcIlAtNTIxXCI6IFwicDUyMVwiLFxuICAgIFwic2VjcDUyMXIxXCI6IFwicDUyMVwiLFxuICAgIFwiMS4zLjEzMi4wLjM1XCI6IFwicDUyMVwiLFxuICAgIFwiMmI4MTA0MDAyM1wiOiBcInA1MjFcIixcbiAgICBcIjJCODEwNDAwMjNcIjogXCJwNTIxXCIsXG5cbiAgICAvKiogU0VDRyBTRUNQMjU2azEgQ3VydmUgKi9cbiAgICBcInNlY3AyNTZrMVwiOiBcInNlY3AyNTZrMVwiLFxuICAgIFwiMS4zLjEzMi4wLjEwXCI6IFwic2VjcDI1NmsxXCIsXG4gICAgXCIyYjgxMDQwMDBhXCI6IFwic2VjcDI1NmsxXCIsXG4gICAgXCIyQjgxMDQwMDBBXCI6IFwic2VjcDI1NmsxXCIsXG5cbiAgICAvKiogRWQyNTUxOSAqL1xuICAgIFwiRUQyNTUxOVwiOiBcImVkMjU1MTlcIixcbiAgICBcImVkMjU1MTlcIjogXCJlZDI1NTE5XCIsXG4gICAgXCJFZDI1NTE5XCI6IFwiZWQyNTUxOVwiLFxuICAgIFwiMS4zLjYuMS40LjEuMTE1OTEuMTUuMVwiOiBcImVkMjU1MTlcIixcbiAgICBcIjJiMDYwMTA0MDFkYTQ3MGYwMVwiOiBcImVkMjU1MTlcIixcbiAgICBcIjJCMDYwMTA0MDFEQTQ3MEYwMVwiOiBcImVkMjU1MTlcIixcblxuICAgIC8qKiBDdXJ2ZTI1NTE5ICovXG4gICAgXCJYMjU1MTlcIjogXCJjdXJ2ZTI1NTE5XCIsXG4gICAgXCJjdjI1NTE5XCI6IFwiY3VydmUyNTUxOVwiLFxuICAgIFwiY3VydmUyNTUxOVwiOiBcImN1cnZlMjU1MTlcIixcbiAgICBcIkN1cnZlMjU1MTlcIjogXCJjdXJ2ZTI1NTE5XCIsXG4gICAgXCIxLjMuNi4xLjQuMS4zMDI5LjEuNS4xXCI6IFwiY3VydmUyNTUxOVwiLFxuICAgIFwiMmIwNjAxMDQwMTk3NTUwMTA1MDFcIjogXCJjdXJ2ZTI1NTE5XCIsXG4gICAgXCIyQjA2MDEwNDAxOTc1NTAxMDUwMVwiOiBcImN1cnZlMjU1MTlcIixcblxuICAgIC8qKiBCcmFpbnBvb2xQMjU2cjEgQ3VydmUgKi9cbiAgICBcImJyYWlucG9vbFAyNTZyMVwiOiBcImJyYWlucG9vbFAyNTZyMVwiLFxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjdcIjogXCJicmFpbnBvb2xQMjU2cjFcIixcbiAgICBcIjJiMjQwMzAzMDIwODAxMDEwN1wiOiBcImJyYWlucG9vbFAyNTZyMVwiLFxuICAgIFwiMkIyNDAzMDMwMjA4MDEwMTA3XCI6IFwiYnJhaW5wb29sUDI1NnIxXCIsXG5cbiAgICAvKiogQnJhaW5wb29sUDM4NHIxIEN1cnZlICovXG4gICAgXCJicmFpbnBvb2xQMzg0cjFcIjogXCJicmFpbnBvb2xQMzg0cjFcIixcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS4xMVwiOiBcImJyYWlucG9vbFAzODRyMVwiLFxuICAgIFwiMmIyNDAzMDMwMjA4MDEwMTBiXCI6IFwiYnJhaW5wb29sUDM4NHIxXCIsXG4gICAgXCIyQjI0MDMwMzAyMDgwMTAxMEJcIjogXCJicmFpbnBvb2xQMzg0cjFcIixcblxuICAgIC8qKiBCcmFpbnBvb2xQNTEycjEgQ3VydmUgKi9cbiAgICBcImJyYWlucG9vbFA1MTJyMVwiOiBcImJyYWlucG9vbFA1MTJyMVwiLFxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjEzXCI6IFwiYnJhaW5wb29sUDUxMnIxXCIsXG4gICAgXCIyYjI0MDMwMzAyMDgwMTAxMGRcIjogXCJicmFpbnBvb2xQNTEycjFcIixcbiAgICBcIjJCMjQwMzAzMDIwODAxMDEwRFwiOiBcImJyYWlucG9vbFA1MTJyMVwiXG4gIH0sXG5cbiAgLyoqIEEgc3RyaW5nIHRvIGtleSBzcGVjaWZpZXIgdHlwZVxuICAgKiBAZW51bSB7SW50ZWdlcn1cbiAgICogQHJlYWRvbmx5XG4gICAqL1xuICBzMms6IHtcbiAgICBzaW1wbGU6IDAsXG4gICAgc2FsdGVkOiAxLFxuICAgIGl0ZXJhdGVkOiAzLFxuICAgIGdudTogMTAxXG4gIH0sXG5cbiAgLyoqIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1vcGVucGdwLXJmYzQ4ODBiaXMtMDQjc2VjdGlvbi05LjF8UkZDNDg4MGJpcy0wNCwgc2VjdGlvbiA5LjF9XG4gICAqIEBlbnVtIHtJbnRlZ2VyfVxuICAgKiBAcmVhZG9ubHlcbiAgICovXG4gIHB1YmxpY0tleToge1xuICAgIC8qKiBSU0EgKEVuY3J5cHQgb3IgU2lnbikgW0hBQ10gKi9cbiAgICByc2FfZW5jcnlwdF9zaWduOiAxLFxuICAgIC8qKiBSU0EgKEVuY3J5cHQgb25seSkgW0hBQ10gKi9cbiAgICByc2FfZW5jcnlwdDogMixcbiAgICAvKiogUlNBIChTaWduIG9ubHkpIFtIQUNdICovXG4gICAgcnNhX3NpZ246IDMsXG4gICAgLyoqIEVsZ2FtYWwgKEVuY3J5cHQgb25seSkgW0VMR0FNQUxdIFtIQUNdICovXG4gICAgZWxnYW1hbDogMTYsXG4gICAgLyoqIERTQSAoU2lnbiBvbmx5KSBbRklQUzE4Nl0gW0hBQ10gKi9cbiAgICBkc2E6IDE3LFxuICAgIC8qKiBFQ0RIIChFbmNyeXB0IG9ubHkpIFtSRkM2NjM3XSAqL1xuICAgIGVjZGg6IDE4LFxuICAgIC8qKiBFQ0RTQSAoU2lnbiBvbmx5KSBbUkZDNjYzN10gKi9cbiAgICBlY2RzYTogMTksXG4gICAgLyoqIEVkRFNBIChTaWduIG9ubHkpXG4gICAgICogW3tAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQta29jaC1lZGRzYS1mb3Itb3BlbnBncC0wNHxEcmFmdCBSRkN9XSAqL1xuICAgIGVkZHNhOiAyMixcbiAgICAvKiogUmVzZXJ2ZWQgZm9yIEFFREggKi9cbiAgICBhZWRoOiAyMyxcbiAgICAvKiogUmVzZXJ2ZWQgZm9yIEFFRFNBICovXG4gICAgYWVkc2E6IDI0XG4gIH0sXG5cbiAgLyoqIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTkuMnxSRkM0ODgwLCBzZWN0aW9uIDkuMn1cbiAgICogQGVudW0ge0ludGVnZXJ9XG4gICAqIEByZWFkb25seVxuICAgKi9cbiAgc3ltbWV0cmljOiB7XG4gICAgcGxhaW50ZXh0OiAwLFxuICAgIC8qKiBOb3QgaW1wbGVtZW50ZWQhICovXG4gICAgaWRlYTogMSxcbiAgICB0cmlwbGVkZXM6IDIsXG4gICAgY2FzdDU6IDMsXG4gICAgYmxvd2Zpc2g6IDQsXG4gICAgYWVzMTI4OiA3LFxuICAgIGFlczE5MjogOCxcbiAgICBhZXMyNTY6IDksXG4gICAgdHdvZmlzaDogMTBcbiAgfSxcblxuICAvKioge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tOS4zfFJGQzQ4ODAsIHNlY3Rpb24gOS4zfVxuICAgKiBAZW51bSB7SW50ZWdlcn1cbiAgICogQHJlYWRvbmx5XG4gICAqL1xuICBjb21wcmVzc2lvbjoge1xuICAgIHVuY29tcHJlc3NlZDogMCxcbiAgICAvKiogUkZDMTk1MSAqL1xuICAgIHppcDogMSxcbiAgICAvKiogUkZDMTk1MCAqL1xuICAgIHpsaWI6IDIsXG4gICAgYnppcDI6IDNcbiAgfSxcblxuICAvKioge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tOS40fFJGQzQ4ODAsIHNlY3Rpb24gOS40fVxuICAgKiBAZW51bSB7SW50ZWdlcn1cbiAgICogQHJlYWRvbmx5XG4gICAqL1xuICBoYXNoOiB7XG4gICAgbWQ1OiAxLFxuICAgIHNoYTE6IDIsXG4gICAgcmlwZW1kOiAzLFxuICAgIHNoYTI1NjogOCxcbiAgICBzaGEzODQ6IDksXG4gICAgc2hhNTEyOiAxMCxcbiAgICBzaGEyMjQ6IDExXG4gIH0sXG5cbiAgLyoqIEEgbGlzdCBvZiBoYXNoIG5hbWVzIGFzIGFjY2VwdGVkIGJ5IHdlYkNyeXB0byBmdW5jdGlvbnMuXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU3VidGxlQ3J5cHRvL2RpZ2VzdHxQYXJhbWV0ZXJzLCBhbGdvfVxuICAgKiBAZW51bSB7U3RyaW5nfVxuICAgKi9cbiAgd2ViSGFzaDoge1xuICAgICdTSEEtMSc6IDIsXG4gICAgJ1NIQS0yNTYnOiA4LFxuICAgICdTSEEtMzg0JzogOSxcbiAgICAnU0hBLTUxMic6IDEwXG4gIH0sXG5cbiAgLyoqIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1vcGVucGdwLXJmYzQ4ODBiaXMtMDQjc2VjdGlvbi05LjZ8UkZDNDg4MGJpcy0wNCwgc2VjdGlvbiA5LjZ9XG4gICAqIEBlbnVtIHtJbnRlZ2VyfVxuICAgKiBAcmVhZG9ubHlcbiAgICovXG4gIGFlYWQ6IHtcbiAgICBlYXg6IDEsXG4gICAgb2NiOiAyLFxuICAgIGV4cGVyaW1lbnRhbF9nY206IDEwMCAvLyBQcml2YXRlIGFsZ29yaXRobVxuICB9LFxuXG4gIC8qKiBBIGxpc3Qgb2YgcGFja2V0IHR5cGVzIGFuZCBudW1lcmljIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZW0uXG4gICAqIEBlbnVtIHtJbnRlZ2VyfVxuICAgKiBAcmVhZG9ubHlcbiAgICovXG4gIHBhY2tldDoge1xuICAgIHB1YmxpY0tleUVuY3J5cHRlZFNlc3Npb25LZXk6IDEsXG4gICAgc2lnbmF0dXJlOiAyLFxuICAgIHN5bUVuY3J5cHRlZFNlc3Npb25LZXk6IDMsXG4gICAgb25lUGFzc1NpZ25hdHVyZTogNCxcbiAgICBzZWNyZXRLZXk6IDUsXG4gICAgcHVibGljS2V5OiA2LFxuICAgIHNlY3JldFN1YmtleTogNyxcbiAgICBjb21wcmVzc2VkOiA4LFxuICAgIHN5bW1ldHJpY2FsbHlFbmNyeXB0ZWQ6IDksXG4gICAgbWFya2VyOiAxMCxcbiAgICBsaXRlcmFsOiAxMSxcbiAgICB0cnVzdDogMTIsXG4gICAgdXNlcmlkOiAxMyxcbiAgICBwdWJsaWNTdWJrZXk6IDE0LFxuICAgIHVzZXJBdHRyaWJ1dGU6IDE3LFxuICAgIHN5bUVuY3J5cHRlZEludGVncml0eVByb3RlY3RlZDogMTgsXG4gICAgbW9kaWZpY2F0aW9uRGV0ZWN0aW9uQ29kZTogMTksXG4gICAgc3ltRW5jcnlwdGVkQUVBRFByb3RlY3RlZDogMjAgLy8gc2VlIElFVEYgZHJhZnQ6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1mb3JkLW9wZW5wZ3AtZm9ybWF0LTAwI3NlY3Rpb24tMi4xXG4gIH0sXG5cbiAgLyoqIERhdGEgdHlwZXMgaW4gdGhlIGxpdGVyYWwgcGFja2V0XG4gICAqIEBlbnVtIHtJbnRlZ2VyfVxuICAgKiBAcmVhZG9ubHlcbiAgICovXG4gIGxpdGVyYWw6IHtcbiAgICAvKiogQmluYXJ5IGRhdGEgJ2InICovXG4gICAgYmluYXJ5OiAnYicuY2hhckNvZGVBdCgpLFxuICAgIC8qKiBUZXh0IGRhdGEgJ3QnICovXG4gICAgdGV4dDogJ3QnLmNoYXJDb2RlQXQoKSxcbiAgICAvKiogVXRmOCBkYXRhICd1JyAqL1xuICAgIHV0Zjg6ICd1Jy5jaGFyQ29kZUF0KCksXG4gICAgLyoqIE1JTUUgbWVzc2FnZSBib2R5IHBhcnQgJ20nICovXG4gICAgbWltZTogJ20nLmNoYXJDb2RlQXQoKVxuICB9LFxuXG4gIC8qKiBPbmUgcGFzcyBzaWduYXR1cmUgcGFja2V0IHR5cGVcbiAgICogQGVudW0ge0ludGVnZXJ9XG4gICAqIEByZWFkb25seVxuICAgKi9cbiAgc2lnbmF0dXJlOiB7XG4gICAgLyoqIDB4MDA6IFNpZ25hdHVyZSBvZiBhIGJpbmFyeSBkb2N1bWVudC4gKi9cbiAgICBiaW5hcnk6IDAsXG4gICAgLyoqIDB4MDE6IFNpZ25hdHVyZSBvZiBhIGNhbm9uaWNhbCB0ZXh0IGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQ2Fub25pY2FseXppbmcgdGhlIGRvY3VtZW50IGJ5IGNvbnZlcnRpbmcgbGluZSBlbmRpbmdzLiAqL1xuICAgIHRleHQ6IDEsXG4gICAgLyoqIDB4MDI6IFN0YW5kYWxvbmUgc2lnbmF0dXJlLlxuICAgICAqXG4gICAgICogVGhpcyBzaWduYXR1cmUgaXMgYSBzaWduYXR1cmUgb2Ygb25seSBpdHMgb3duIHN1YnBhY2tldCBjb250ZW50cy5cbiAgICAgKiBJdCBpcyBjYWxjdWxhdGVkIGlkZW50aWNhbGx5IHRvIGEgc2lnbmF0dXJlIG92ZXIgYSB6ZXJvLWxlbmdoXG4gICAgICogYmluYXJ5IGRvY3VtZW50LiAgTm90ZSB0aGF0IGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBoYXZlIGEgVjNcbiAgICAgKiBzdGFuZGFsb25lIHNpZ25hdHVyZS4gKi9cbiAgICBzdGFuZGFsb25lOiAyLFxuICAgIC8qKiAweDEwOiBHZW5lcmljIGNlcnRpZmljYXRpb24gb2YgYSBVc2VyIElEIGFuZCBQdWJsaWMtS2V5IHBhY2tldC5cbiAgICAgKlxuICAgICAqIFRoZSBpc3N1ZXIgb2YgdGhpcyBjZXJ0aWZpY2F0aW9uIGRvZXMgbm90IG1ha2UgYW55IHBhcnRpY3VsYXJcbiAgICAgKiBhc3NlcnRpb24gYXMgdG8gaG93IHdlbGwgdGhlIGNlcnRpZmllciBoYXMgY2hlY2tlZCB0aGF0IHRoZSBvd25lclxuICAgICAqIG9mIHRoZSBrZXkgaXMgaW4gZmFjdCB0aGUgcGVyc29uIGRlc2NyaWJlZCBieSB0aGUgVXNlciBJRC4gKi9cbiAgICBjZXJ0X2dlbmVyaWM6IDE2LFxuICAgIC8qKiAweDExOiBQZXJzb25hIGNlcnRpZmljYXRpb24gb2YgYSBVc2VyIElEIGFuZCBQdWJsaWMtS2V5IHBhY2tldC5cbiAgICAgKlxuICAgICAqIFRoZSBpc3N1ZXIgb2YgdGhpcyBjZXJ0aWZpY2F0aW9uIGhhcyBub3QgZG9uZSBhbnkgdmVyaWZpY2F0aW9uIG9mXG4gICAgICogdGhlIGNsYWltIHRoYXQgdGhlIG93bmVyIG9mIHRoaXMga2V5IGlzIHRoZSBVc2VyIElEIHNwZWNpZmllZC4gKi9cbiAgICBjZXJ0X3BlcnNvbmE6IDE3LFxuICAgIC8qKiAweDEyOiBDYXN1YWwgY2VydGlmaWNhdGlvbiBvZiBhIFVzZXIgSUQgYW5kIFB1YmxpYy1LZXkgcGFja2V0LlxuICAgICAqXG4gICAgICogVGhlIGlzc3VlciBvZiB0aGlzIGNlcnRpZmljYXRpb24gaGFzIGRvbmUgc29tZSBjYXN1YWxcbiAgICAgKiB2ZXJpZmljYXRpb24gb2YgdGhlIGNsYWltIG9mIGlkZW50aXR5LiAqL1xuICAgIGNlcnRfY2FzdWFsOiAxOCxcbiAgICAvKiogMHgxMzogUG9zaXRpdmUgY2VydGlmaWNhdGlvbiBvZiBhIFVzZXIgSUQgYW5kIFB1YmxpYy1LZXkgcGFja2V0LlxuICAgICAqXG4gICAgICogVGhlIGlzc3VlciBvZiB0aGlzIGNlcnRpZmljYXRpb24gaGFzIGRvbmUgc3Vic3RhbnRpYWxcbiAgICAgKiB2ZXJpZmljYXRpb24gb2YgdGhlIGNsYWltIG9mIGlkZW50aXR5LlxuICAgICAqXG4gICAgICogTW9zdCBPcGVuUEdQIGltcGxlbWVudGF0aW9ucyBtYWtlIHRoZWlyIFwia2V5IHNpZ25hdHVyZXNcIiBhcyAweDEwXG4gICAgICogY2VydGlmaWNhdGlvbnMuICBTb21lIGltcGxlbWVudGF0aW9ucyBjYW4gaXNzdWUgMHgxMS0weDEzXG4gICAgICogY2VydGlmaWNhdGlvbnMsIGJ1dCBmZXcgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSB0eXBlcy4gKi9cbiAgICBjZXJ0X3Bvc2l0aXZlOiAxOSxcbiAgICAvKiogMHgzMDogQ2VydGlmaWNhdGlvbiByZXZvY2F0aW9uIHNpZ25hdHVyZVxuICAgICAqXG4gICAgICogVGhpcyBzaWduYXR1cmUgcmV2b2tlcyBhbiBlYXJsaWVyIFVzZXIgSUQgY2VydGlmaWNhdGlvbiBzaWduYXR1cmVcbiAgICAgKiAoc2lnbmF0dXJlIGNsYXNzIDB4MTAgdGhyb3VnaCAweDEzKSBvciBkaXJlY3Qta2V5IHNpZ25hdHVyZVxuICAgICAqICgweDFGKS4gIEl0IHNob3VsZCBiZSBpc3N1ZWQgYnkgdGhlIHNhbWUga2V5IHRoYXQgaXNzdWVkIHRoZVxuICAgICAqIHJldm9rZWQgc2lnbmF0dXJlIG9yIGFuIGF1dGhvcml6ZWQgcmV2b2NhdGlvbiBrZXkuICBUaGUgc2lnbmF0dXJlXG4gICAgICogaXMgY29tcHV0ZWQgb3ZlciB0aGUgc2FtZSBkYXRhIGFzIHRoZSBjZXJ0aWZpY2F0ZSB0aGF0IGl0XG4gICAgICogcmV2b2tlcywgYW5kIHNob3VsZCBoYXZlIGEgbGF0ZXIgY3JlYXRpb24gZGF0ZSB0aGFuIHRoYXRcbiAgICAgKiBjZXJ0aWZpY2F0ZS4gKi9cbiAgICBjZXJ0X3Jldm9jYXRpb246IDQ4LFxuICAgIC8qKiAweDE4OiBTdWJrZXkgQmluZGluZyBTaWduYXR1cmVcbiAgICAgKlxuICAgICAqIFRoaXMgc2lnbmF0dXJlIGlzIGEgc3RhdGVtZW50IGJ5IHRoZSB0b3AtbGV2ZWwgc2lnbmluZyBrZXkgdGhhdFxuICAgICAqIGluZGljYXRlcyB0aGF0IGl0IG93bnMgdGhlIHN1YmtleS4gIFRoaXMgc2lnbmF0dXJlIGlzIGNhbGN1bGF0ZWRcbiAgICAgKiBkaXJlY3RseSBvbiB0aGUgcHJpbWFyeSBrZXkgYW5kIHN1YmtleSwgYW5kIG5vdCBvbiBhbnkgVXNlciBJRCBvclxuICAgICAqIG90aGVyIHBhY2tldHMuICBBIHNpZ25hdHVyZSB0aGF0IGJpbmRzIGEgc2lnbmluZyBzdWJrZXkgTVVTVCBoYXZlXG4gICAgICogYW4gRW1iZWRkZWQgU2lnbmF0dXJlIHN1YnBhY2tldCBpbiB0aGlzIGJpbmRpbmcgc2lnbmF0dXJlIHRoYXRcbiAgICAgKiBjb250YWlucyBhIDB4MTkgc2lnbmF0dXJlIG1hZGUgYnkgdGhlIHNpZ25pbmcgc3Via2V5IG9uIHRoZVxuICAgICAqIHByaW1hcnkga2V5IGFuZCBzdWJrZXkuICovXG4gICAgc3Via2V5X2JpbmRpbmc6IDI0LFxuICAgIC8qKiAweDE5OiBQcmltYXJ5IEtleSBCaW5kaW5nIFNpZ25hdHVyZVxuICAgICAqXG4gICAgICogVGhpcyBzaWduYXR1cmUgaXMgYSBzdGF0ZW1lbnQgYnkgYSBzaWduaW5nIHN1YmtleSwgaW5kaWNhdGluZ1xuICAgICAqIHRoYXQgaXQgaXMgb3duZWQgYnkgdGhlIHByaW1hcnkga2V5IGFuZCBzdWJrZXkuICBUaGlzIHNpZ25hdHVyZVxuICAgICAqIGlzIGNhbGN1bGF0ZWQgdGhlIHNhbWUgd2F5IGFzIGEgMHgxOCBzaWduYXR1cmU6IGRpcmVjdGx5IG9uIHRoZVxuICAgICAqIHByaW1hcnkga2V5IGFuZCBzdWJrZXksIGFuZCBub3Qgb24gYW55IFVzZXIgSUQgb3Igb3RoZXIgcGFja2V0cy5cbiAgICAgKlxuICAgICAqIFdoZW4gYSBzaWduYXR1cmUgaXMgbWFkZSBvdmVyIGEga2V5LCB0aGUgaGFzaCBkYXRhIHN0YXJ0cyB3aXRoIHRoZVxuICAgICAqIG9jdGV0IDB4OTksIGZvbGxvd2VkIGJ5IGEgdHdvLW9jdGV0IGxlbmd0aCBvZiB0aGUga2V5LCBhbmQgdGhlbiBib2R5XG4gICAgICogb2YgdGhlIGtleSBwYWNrZXQuICAoTm90ZSB0aGF0IHRoaXMgaXMgYW4gb2xkLXN0eWxlIHBhY2tldCBoZWFkZXIgZm9yXG4gICAgICogYSBrZXkgcGFja2V0IHdpdGggdHdvLW9jdGV0IGxlbmd0aC4pICBBIHN1YmtleSBiaW5kaW5nIHNpZ25hdHVyZVxuICAgICAqICh0eXBlIDB4MTgpIG9yIHByaW1hcnkga2V5IGJpbmRpbmcgc2lnbmF0dXJlICh0eXBlIDB4MTkpIHRoZW4gaGFzaGVzXG4gICAgICogdGhlIHN1YmtleSB1c2luZyB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIG1haW4ga2V5IChhbHNvIHVzaW5nIDB4OTkgYXNcbiAgICAgKiB0aGUgZmlyc3Qgb2N0ZXQpLiAqL1xuICAgIGtleV9iaW5kaW5nOiAyNSxcbiAgICAvKiogMHgxRjogU2lnbmF0dXJlIGRpcmVjdGx5IG9uIGEga2V5XG4gICAgICpcbiAgICAgKiBUaGlzIHNpZ25hdHVyZSBpcyBjYWxjdWxhdGVkIGRpcmVjdGx5IG9uIGEga2V5LiAgSXQgYmluZHMgdGhlXG4gICAgICogaW5mb3JtYXRpb24gaW4gdGhlIFNpZ25hdHVyZSBzdWJwYWNrZXRzIHRvIHRoZSBrZXksIGFuZCBpc1xuICAgICAqIGFwcHJvcHJpYXRlIHRvIGJlIHVzZWQgZm9yIHN1YnBhY2tldHMgdGhhdCBwcm92aWRlIGluZm9ybWF0aW9uXG4gICAgICogYWJvdXQgdGhlIGtleSwgc3VjaCBhcyB0aGUgUmV2b2NhdGlvbiBLZXkgc3VicGFja2V0LiAgSXQgaXMgYWxzb1xuICAgICAqIGFwcHJvcHJpYXRlIGZvciBzdGF0ZW1lbnRzIHRoYXQgbm9uLXNlbGYgY2VydGlmaWVycyB3YW50IHRvIG1ha2VcbiAgICAgKiBhYm91dCB0aGUga2V5IGl0c2VsZiwgcmF0aGVyIHRoYW4gdGhlIGJpbmRpbmcgYmV0d2VlbiBhIGtleSBhbmQgYVxuICAgICAqIG5hbWUuICovXG4gICAga2V5OiAzMSxcbiAgICAvKiogMHgyMDogS2V5IHJldm9jYXRpb24gc2lnbmF0dXJlXG4gICAgICpcbiAgICAgKiBUaGUgc2lnbmF0dXJlIGlzIGNhbGN1bGF0ZWQgZGlyZWN0bHkgb24gdGhlIGtleSBiZWluZyByZXZva2VkLiAgQVxuICAgICAqIHJldm9rZWQga2V5IGlzIG5vdCB0byBiZSB1c2VkLiAgT25seSByZXZvY2F0aW9uIHNpZ25hdHVyZXMgYnkgdGhlXG4gICAgICoga2V5IGJlaW5nIHJldm9rZWQsIG9yIGJ5IGFuIGF1dGhvcml6ZWQgcmV2b2NhdGlvbiBrZXksIHNob3VsZCBiZVxuICAgICAqIGNvbnNpZGVyZWQgdmFsaWQgcmV2b2NhdGlvbiBzaWduYXR1cmVzLmEgKi9cbiAgICBrZXlfcmV2b2NhdGlvbjogMzIsXG4gICAgLyoqIDB4Mjg6IFN1YmtleSByZXZvY2F0aW9uIHNpZ25hdHVyZVxuICAgICAqXG4gICAgICogVGhlIHNpZ25hdHVyZSBpcyBjYWxjdWxhdGVkIGRpcmVjdGx5IG9uIHRoZSBzdWJrZXkgYmVpbmcgcmV2b2tlZC5cbiAgICAgKiBBIHJldm9rZWQgc3Via2V5IGlzIG5vdCB0byBiZSB1c2VkLiAgT25seSByZXZvY2F0aW9uIHNpZ25hdHVyZXNcbiAgICAgKiBieSB0aGUgdG9wLWxldmVsIHNpZ25hdHVyZSBrZXkgdGhhdCBpcyBib3VuZCB0byB0aGlzIHN1YmtleSwgb3JcbiAgICAgKiBieSBhbiBhdXRob3JpemVkIHJldm9jYXRpb24ga2V5LCBzaG91bGQgYmUgY29uc2lkZXJlZCB2YWxpZFxuICAgICAqIHJldm9jYXRpb24gc2lnbmF0dXJlcy5cbiAgICAgKlxuICAgICAqIEtleSByZXZvY2F0aW9uIHNpZ25hdHVyZXMgKHR5cGVzIDB4MjAgYW5kIDB4MjgpXG4gICAgICogaGFzaCBvbmx5IHRoZSBrZXkgYmVpbmcgcmV2b2tlZC4gKi9cbiAgICBzdWJrZXlfcmV2b2NhdGlvbjogNDAsXG4gICAgLyoqIDB4NDA6IFRpbWVzdGFtcCBzaWduYXR1cmUuXG4gICAgICogVGhpcyBzaWduYXR1cmUgaXMgb25seSBtZWFuaW5nZnVsIGZvciB0aGUgdGltZXN0YW1wIGNvbnRhaW5lZCBpblxuICAgICAqIGl0LiAqL1xuICAgIHRpbWVzdGFtcDogNjQsXG4gICAgLyoqIDB4NTA6IFRoaXJkLVBhcnR5IENvbmZpcm1hdGlvbiBzaWduYXR1cmUuXG4gICAgICpcbiAgICAgKiBUaGlzIHNpZ25hdHVyZSBpcyBhIHNpZ25hdHVyZSBvdmVyIHNvbWUgb3RoZXIgT3BlblBHUCBTaWduYXR1cmVcbiAgICAgKiBwYWNrZXQocykuICBJdCBpcyBhbmFsb2dvdXMgdG8gYSBub3Rhcnkgc2VhbCBvbiB0aGUgc2lnbmVkIGRhdGEuXG4gICAgICogQSB0aGlyZC1wYXJ0eSBzaWduYXR1cmUgU0hPVUxEIGluY2x1ZGUgU2lnbmF0dXJlIFRhcmdldFxuICAgICAqIHN1YnBhY2tldChzKSB0byBnaXZlIGVhc3kgaWRlbnRpZmljYXRpb24uICBOb3RlIHRoYXQgd2UgcmVhbGx5IGRvXG4gICAgICogbWVhbiBTSE9VTEQuICBUaGVyZSBhcmUgcGxhdXNpYmxlIHVzZXMgZm9yIHRoaXMgKHN1Y2ggYXMgYSBibGluZFxuICAgICAqIHBhcnR5IHRoYXQgb25seSBzZWVzIHRoZSBzaWduYXR1cmUsIG5vdCB0aGUga2V5IG9yIHNvdXJjZVxuICAgICAqIGRvY3VtZW50KSB0aGF0IGNhbm5vdCBpbmNsdWRlIGEgdGFyZ2V0IHN1YnBhY2tldC4gKi9cbiAgICB0aGlyZF9wYXJ0eTogODBcbiAgfSxcblxuICAvKiogU2lnbmF0dXJlIHN1YnBhY2tldCB0eXBlXG4gICAqIEBlbnVtIHtJbnRlZ2VyfVxuICAgKiBAcmVhZG9ubHlcbiAgICovXG4gIHNpZ25hdHVyZVN1YnBhY2tldDoge1xuICAgIHNpZ25hdHVyZV9jcmVhdGlvbl90aW1lOiAyLFxuICAgIHNpZ25hdHVyZV9leHBpcmF0aW9uX3RpbWU6IDMsXG4gICAgZXhwb3J0YWJsZV9jZXJ0aWZpY2F0aW9uOiA0LFxuICAgIHRydXN0X3NpZ25hdHVyZTogNSxcbiAgICByZWd1bGFyX2V4cHJlc3Npb246IDYsXG4gICAgcmV2b2NhYmxlOiA3LFxuICAgIGtleV9leHBpcmF0aW9uX3RpbWU6IDksXG4gICAgcGxhY2Vob2xkZXJfYmFja3dhcmRzX2NvbXBhdGliaWxpdHk6IDEwLFxuICAgIHByZWZlcnJlZF9zeW1tZXRyaWNfYWxnb3JpdGhtczogMTEsXG4gICAgcmV2b2NhdGlvbl9rZXk6IDEyLFxuICAgIGlzc3VlcjogMTYsXG4gICAgbm90YXRpb25fZGF0YTogMjAsXG4gICAgcHJlZmVycmVkX2hhc2hfYWxnb3JpdGhtczogMjEsXG4gICAgcHJlZmVycmVkX2NvbXByZXNzaW9uX2FsZ29yaXRobXM6IDIyLFxuICAgIGtleV9zZXJ2ZXJfcHJlZmVyZW5jZXM6IDIzLFxuICAgIHByZWZlcnJlZF9rZXlfc2VydmVyOiAyNCxcbiAgICBwcmltYXJ5X3VzZXJfaWQ6IDI1LFxuICAgIHBvbGljeV91cmk6IDI2LFxuICAgIGtleV9mbGFnczogMjcsXG4gICAgc2lnbmVyc191c2VyX2lkOiAyOCxcbiAgICByZWFzb25fZm9yX3Jldm9jYXRpb246IDI5LFxuICAgIGZlYXR1cmVzOiAzMCxcbiAgICBzaWduYXR1cmVfdGFyZ2V0OiAzMSxcbiAgICBlbWJlZGRlZF9zaWduYXR1cmU6IDMyLFxuICAgIGlzc3Vlcl9maW5nZXJwcmludDogMzMsXG4gICAgcHJlZmVycmVkX2FlYWRfYWxnb3JpdGhtczogMzRcbiAgfSxcblxuICAvKiogS2V5IGZsYWdzXG4gICAqIEBlbnVtIHtJbnRlZ2VyfVxuICAgKiBAcmVhZG9ubHlcbiAgICovXG4gIGtleUZsYWdzOiB7XG4gICAgLyoqIDB4MDEgLSBUaGlzIGtleSBtYXkgYmUgdXNlZCB0byBjZXJ0aWZ5IG90aGVyIGtleXMuICovXG4gICAgY2VydGlmeV9rZXlzOiAxLFxuICAgIC8qKiAweDAyIC0gVGhpcyBrZXkgbWF5IGJlIHVzZWQgdG8gc2lnbiBkYXRhLiAqL1xuICAgIHNpZ25fZGF0YTogMixcbiAgICAvKiogMHgwNCAtIFRoaXMga2V5IG1heSBiZSB1c2VkIHRvIGVuY3J5cHQgY29tbXVuaWNhdGlvbnMuICovXG4gICAgZW5jcnlwdF9jb21tdW5pY2F0aW9uOiA0LFxuICAgIC8qKiAweDA4IC0gVGhpcyBrZXkgbWF5IGJlIHVzZWQgdG8gZW5jcnlwdCBzdG9yYWdlLiAqL1xuICAgIGVuY3J5cHRfc3RvcmFnZTogOCxcbiAgICAvKiogMHgxMCAtIFRoZSBwcml2YXRlIGNvbXBvbmVudCBvZiB0aGlzIGtleSBtYXkgaGF2ZSBiZWVuIHNwbGl0XG4gICAgICogICAgICAgIGJ5IGEgc2VjcmV0LXNoYXJpbmcgbWVjaGFuaXNtLiAqL1xuICAgIHNwbGl0X3ByaXZhdGVfa2V5OiAxNixcbiAgICAvKiogMHgyMCAtIFRoaXMga2V5IG1heSBiZSB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4gKi9cbiAgICBhdXRoZW50aWNhdGlvbjogMzIsXG4gICAgLyoqIDB4ODAgLSBUaGUgcHJpdmF0ZSBjb21wb25lbnQgb2YgdGhpcyBrZXkgbWF5IGJlIGluIHRoZVxuICAgICAqICAgICAgICBwb3NzZXNzaW9uIG9mIG1vcmUgdGhhbiBvbmUgcGVyc29uLiAqL1xuICAgIHNoYXJlZF9wcml2YXRlX2tleTogMTI4XG4gIH0sXG5cbiAgLyoqIEtleSBzdGF0dXNcbiAgICogQGVudW0ge0ludGVnZXJ9XG4gICAqIEByZWFkb25seVxuICAgKi9cbiAga2V5U3RhdHVzOiB7XG4gICAgaW52YWxpZDogMCxcbiAgICBleHBpcmVkOiAxLFxuICAgIHJldm9rZWQ6IDIsXG4gICAgdmFsaWQ6IDMsXG4gICAgbm9fc2VsZl9jZXJ0OiA0XG4gIH0sXG5cbiAgLyoqIEFybW9yIHR5cGVcbiAgICogQGVudW0ge0ludGVnZXJ9XG4gICAqIEByZWFkb25seVxuICAgKi9cbiAgYXJtb3I6IHtcbiAgICBtdWx0aXBhcnRfc2VjdGlvbjogMCxcbiAgICBtdWx0aXBhcnRfbGFzdDogMSxcbiAgICBzaWduZWQ6IDIsXG4gICAgbWVzc2FnZTogMyxcbiAgICBwdWJsaWNfa2V5OiA0LFxuICAgIHByaXZhdGVfa2V5OiA1LFxuICAgIHNpZ25hdHVyZTogNlxuICB9LFxuXG4gIC8qKiB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi01LjIuMy4yM3xSRkM0ODgwLCBzZWN0aW9uIDUuMi4zLjIzfVxuICAgKiBAZW51bSB7SW50ZWdlcn1cbiAgICogQHJlYWRvbmx5XG4gICAqL1xuICByZWFzb25Gb3JSZXZvY2F0aW9uOiB7XG4gICAgLyoqIE5vIHJlYXNvbiBzcGVjaWZpZWQgKGtleSByZXZvY2F0aW9ucyBvciBjZXJ0IHJldm9jYXRpb25zKSAqL1xuICAgIG5vX3JlYXNvbjogMCxcbiAgICAvKiogS2V5IGlzIHN1cGVyc2VkZWQgKGtleSByZXZvY2F0aW9ucykgKi9cbiAgICBrZXlfc3VwZXJzZWRlZDogMSxcbiAgICAvKiogS2V5IG1hdGVyaWFsIGhhcyBiZWVuIGNvbXByb21pc2VkIChrZXkgcmV2b2NhdGlvbnMpICovXG4gICAga2V5X2NvbXByb21pc2VkOiAyLFxuICAgIC8qKiBLZXkgaXMgcmV0aXJlZCBhbmQgbm8gbG9uZ2VyIHVzZWQgKGtleSByZXZvY2F0aW9ucykgKi9cbiAgICBrZXlfcmV0aXJlZDogMyxcbiAgICAvKiogVXNlciBJRCBpbmZvcm1hdGlvbiBpcyBubyBsb25nZXIgdmFsaWQgKGNlcnQgcmV2b2NhdGlvbnMpICovXG4gICAgdXNlcmlkX2ludmFsaWQ6IDMyXG4gIH0sXG5cbiAgLyoqIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1vcGVucGdwLXJmYzQ4ODBiaXMtMDQjc2VjdGlvbi01LjIuMy4yNXxSRkM0ODgwYmlzLTA0LCBzZWN0aW9uIDUuMi4zLjI1fVxuICAgKiBAZW51bSB7SW50ZWdlcn1cbiAgICogQHJlYWRvbmx5XG4gICAqL1xuICBmZWF0dXJlczoge1xuICAgIC8qKiAweDAxIC0gTW9kaWZpY2F0aW9uIERldGVjdGlvbiAocGFja2V0cyAxOCBhbmQgMTkpICovXG4gICAgbW9kaWZpY2F0aW9uX2RldGVjdGlvbjogMSxcbiAgICAvKiogMHgwMiAtIEFFQUQgRW5jcnlwdGVkIERhdGEgUGFja2V0IChwYWNrZXQgMjApIGFuZCB2ZXJzaW9uIDVcbiAgICAgKiAgICAgICAgIFN5bW1ldHJpYy1LZXkgRW5jcnlwdGVkIFNlc3Npb24gS2V5IFBhY2tldHMgKHBhY2tldCAzKSAqL1xuICAgIGFlYWQ6IDIsXG4gICAgLyoqIDB4MDQgLSBWZXJzaW9uIDUgUHVibGljLUtleSBQYWNrZXQgZm9ybWF0IGFuZCBjb3JyZXNwb25kaW5nIG5ld1xuICAgICAgKiAgICAgICAgZmluZ2VycHJpbnQgZm9ybWF0ICovXG4gICAgdjVfa2V5czogNFxuICB9LFxuXG4gIC8qKiBBc3NlcnRzIHZhbGlkaXR5IGFuZCBjb252ZXJ0cyBmcm9tIHN0cmluZy9pbnRlZ2VyIHRvIGludGVnZXIuICovXG4gIHdyaXRlOiBmdW5jdGlvbiB3cml0ZSh0eXBlLCBlKSB7XG4gICAgaWYgKHR5cGVvZiBlID09PSAnbnVtYmVyJykge1xuICAgICAgZSA9IHRoaXMucmVhZCh0eXBlLCBlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZVtlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHlwZVtlXTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZW51bSB2YWx1ZS4nKTtcbiAgfSxcblxuICAvKiogQ29udmVydHMgZnJvbSBhbiBpbnRlZ2VyIHRvIHN0cmluZy4gKi9cbiAgcmVhZDogZnVuY3Rpb24gcmVhZCh0eXBlLCBlKSB7XG4gICAgaWYgKCF0eXBlW2J5VmFsdWVdKSB7XG4gICAgICB0eXBlW2J5VmFsdWVdID0gW107XG4gICAgICAoMCwgX2VudHJpZXMyLmRlZmF1bHQpKHR5cGUpLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIF9yZWYyID0gKDAsIF9zbGljZWRUb0FycmF5My5kZWZhdWx0KShfcmVmLCAyKSxcbiAgICAgICAgICAgIGtleSA9IF9yZWYyWzBdLFxuICAgICAgICAgICAgdmFsdWUgPSBfcmVmMlsxXTtcblxuICAgICAgICB0eXBlW2J5VmFsdWVdW3ZhbHVlXSA9IGtleTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlW2J5VmFsdWVdW2VdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0eXBlW2J5VmFsdWVdW2VdO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbnVtIHZhbHVlLicpO1xuICB9XG5cbn07XG5cbn0se1wiYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9lbnRyaWVzXCI6MjcsXCJiYWJlbC1ydW50aW1lL2NvcmUtanMvc3ltYm9sXCI6MzMsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiOjQwfV0sMzYwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jb25maWcgPSBfZGVyZXFfKCcuL2NvbmZpZycpO1xuXG52YXIgX2NvbmZpZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25maWcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIEhLUCBjbGllbnQgYW5kIGNvbmZpZ3VyZSBpdCB3aXRoIHRoZSBrZXkgc2VydmVyIHVybCBhbmQgZmV0Y2ggZnVuY3Rpb24uXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSAgICBrZXlTZXJ2ZXJCYXNlVXJsICAob3B0aW9uYWwpIFRoZSBIS1Aga2V5IHNlcnZlciBiYXNlIHVybCBpbmNsdWRpbmdcbiAqICAgdGhlIHByb3RvY29sIHRvIHVzZSBlLmcuIGh0dHBzOi8vcGdwLm1pdC5lZHVcbiAqL1xuZnVuY3Rpb24gSEtQKGtleVNlcnZlckJhc2VVcmwpIHtcbiAgdGhpcy5fYmFzZVVybCA9IGtleVNlcnZlckJhc2VVcmwgfHwgX2NvbmZpZzIuZGVmYXVsdC5rZXlzZXJ2ZXI7XG4gIHRoaXMuX2ZldGNoID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cuZmV0Y2ggOiBfZGVyZXFfKCdub2RlLWZldGNoJyk7XG59XG5cbi8qKlxuICogU2VhcmNoIGZvciBhIHB1YmxpYyBrZXkgb24gdGhlIGtleSBzZXJ2ZXIgZWl0aGVyIGJ5IGtleSBJRCBvciBwYXJ0IG9mIHRoZSB1c2VyIElELlxuICogQHBhcmFtICB7U3RyaW5nfSAgIG9wdGlvbnMua2V5SUQgICBUaGUgbG9uZyBwdWJsaWMga2V5IElELlxuICogQHBhcmFtICB7U3RyaW5nfSAgIG9wdGlvbnMucXVlcnkgICBUaGlzIGNhbiBiZSBhbnkgcGFydCBvZiB0aGUga2V5IHVzZXIgSUQgc3VjaCBhcyBuYW1lXG4gKiAgIG9yIGVtYWlsIGFkZHJlc3MuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTdHJpbmc+fSAgICAgICAgICBUaGUgYXNjaWkgYXJtb3JlZCBwdWJsaWMga2V5LlxuICogQGFzeW5jXG4gKi9cbi8vIE9wZW5QR1AuanMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxNSBUYW5rcmVkIEhhc2Vcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgY2xpZW50IGZvciB0aGUgT3BlblBHUCBIVFRQIEtleXNlcnZlciBQcm90b2NvbCAoSEtQKVxuICogaW4gb3JkZXIgdG8gbG9va3VwIGFuZCB1cGxvYWQga2V5cyBvbiBzdGFuZGFyZCBwdWJsaWMga2V5IHNlcnZlcnMuXG4gKiBAbW9kdWxlIGhrcFxuICovXG5cbkhLUC5wcm90b3R5cGUubG9va3VwID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIHVyaSA9IHRoaXMuX2Jhc2VVcmwgKyAnL3Brcy9sb29rdXA/b3A9Z2V0Jm9wdGlvbnM9bXImc2VhcmNoPSc7XG4gIHZhciBmZXRjaCA9IHRoaXMuX2ZldGNoO1xuXG4gIGlmIChvcHRpb25zLmtleUlkKSB7XG4gICAgdXJpICs9ICcweCcgKyBlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5rZXlJZCk7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgIHVyaSArPSBlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5xdWVyeSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBwcm92aWRlIGEgcXVlcnkgcGFyYW1ldGVyIScpO1xuICB9XG5cbiAgcmV0dXJuIGZldGNoKHVyaSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHtcbiAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgfVxuICB9KS50aGVuKGZ1bmN0aW9uIChwdWJsaWNLZXlBcm1vcmVkKSB7XG4gICAgaWYgKCFwdWJsaWNLZXlBcm1vcmVkIHx8IHB1YmxpY0tleUFybW9yZWQuaW5kZXhPZignLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLScpIDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gcHVibGljS2V5QXJtb3JlZC50cmltKCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBVcGxvYWQgYSBwdWJsaWMga2V5IHRvIHRoZSBzZXJ2ZXIuXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgcHVibGljS2V5QXJtb3JlZCAgQW4gYXNjaWkgYXJtb3JlZCBwdWJsaWMga2V5IHRvIGJlIHVwbG9hZGVkLlxuICogQHJldHVybnMge1Byb21pc2V9XG4gKiBAYXN5bmNcbiAqL1xuSEtQLnByb3RvdHlwZS51cGxvYWQgPSBmdW5jdGlvbiAocHVibGljS2V5QXJtb3JlZCkge1xuICB2YXIgdXJpID0gdGhpcy5fYmFzZVVybCArICcvcGtzL2FkZCc7XG4gIHZhciBmZXRjaCA9IHRoaXMuX2ZldGNoO1xuXG4gIHJldHVybiBmZXRjaCh1cmksIHtcbiAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCdcbiAgICB9LFxuICAgIGJvZHk6ICdrZXl0ZXh0PScgKyBlbmNvZGVVUklDb21wb25lbnQocHVibGljS2V5QXJtb3JlZClcbiAgfSk7XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBIS1A7XG5cbn0se1wiLi9jb25maWdcIjozMjUsXCJub2RlLWZldGNoXCI6XCJub2RlLWZldGNoXCJ9XSwzNjE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5XS0QgPSBleHBvcnRzLkhLUCA9IGV4cG9ydHMuQXN5bmNQcm94eSA9IGV4cG9ydHMuS2V5cmluZyA9IGV4cG9ydHMuY3J5cHRvID0gZXhwb3J0cy5jb25maWcgPSBleHBvcnRzLmVudW1zID0gZXhwb3J0cy5hcm1vciA9IGV4cG9ydHMuT0lEID0gZXhwb3J0cy5LREZQYXJhbXMgPSBleHBvcnRzLkVDREhTeW1tZXRyaWNLZXkgPSBleHBvcnRzLktleWlkID0gZXhwb3J0cy5TMksgPSBleHBvcnRzLk1QSSA9IGV4cG9ydHMucGFja2V0ID0gZXhwb3J0cy51dGlsID0gZXhwb3J0cy5jbGVhcnRleHQgPSBleHBvcnRzLm1lc3NhZ2UgPSBleHBvcnRzLnNpZ25hdHVyZSA9IGV4cG9ydHMua2V5ID0gZXhwb3J0cy5kZXN0cm95V29ya2VyID0gZXhwb3J0cy5nZXRXb3JrZXIgPSBleHBvcnRzLmluaXRXb3JrZXIgPSBleHBvcnRzLmRlY3J5cHRTZXNzaW9uS2V5cyA9IGV4cG9ydHMuZW5jcnlwdFNlc3Npb25LZXkgPSBleHBvcnRzLmRlY3J5cHRLZXkgPSBleHBvcnRzLnJldm9rZUtleSA9IGV4cG9ydHMucmVmb3JtYXRLZXkgPSBleHBvcnRzLmdlbmVyYXRlS2V5ID0gZXhwb3J0cy52ZXJpZnkgPSBleHBvcnRzLnNpZ24gPSBleHBvcnRzLmRlY3J5cHQgPSBleHBvcnRzLmVuY3J5cHQgPSB1bmRlZmluZWQ7XG5cbnZhciBfb3BlbnBncCA9IF9kZXJlcV8oJy4vb3BlbnBncCcpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ2VuY3J5cHQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfb3BlbnBncC5lbmNyeXB0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnZGVjcnlwdCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9vcGVucGdwLmRlY3J5cHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdzaWduJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX29wZW5wZ3Auc2lnbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ3ZlcmlmeScsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9vcGVucGdwLnZlcmlmeTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ2dlbmVyYXRlS2V5Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX29wZW5wZ3AuZ2VuZXJhdGVLZXk7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdyZWZvcm1hdEtleScsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9vcGVucGdwLnJlZm9ybWF0S2V5O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAncmV2b2tlS2V5Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX29wZW5wZ3AucmV2b2tlS2V5O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnZGVjcnlwdEtleScsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9vcGVucGdwLmRlY3J5cHRLZXk7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdlbmNyeXB0U2Vzc2lvbktleScsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9vcGVucGdwLmVuY3J5cHRTZXNzaW9uS2V5O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnZGVjcnlwdFNlc3Npb25LZXlzJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX29wZW5wZ3AuZGVjcnlwdFNlc3Npb25LZXlzO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnaW5pdFdvcmtlcicsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9vcGVucGdwLmluaXRXb3JrZXI7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdnZXRXb3JrZXInLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfb3BlbnBncC5nZXRXb3JrZXI7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdkZXN0cm95V29ya2VyJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX29wZW5wZ3AuZGVzdHJveVdvcmtlcjtcbiAgfVxufSk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4vdXRpbCcpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ3V0aWwnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKS5kZWZhdWx0O1xuICB9XG59KTtcblxudmFyIF9wYWNrZXQgPSBfZGVyZXFfKCcuL3BhY2tldCcpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ3BhY2tldCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BhY2tldCkuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfbXBpID0gX2RlcmVxXygnLi90eXBlL21waScpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ01QSScsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX21waSkuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfczJrID0gX2RlcmVxXygnLi90eXBlL3MyaycpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ1MySycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3MyaykuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfa2V5aWQgPSBfZGVyZXFfKCcuL3R5cGUva2V5aWQnKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdLZXlpZCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2tleWlkKS5kZWZhdWx0O1xuICB9XG59KTtcblxudmFyIF9lY2RoX3N5bWtleSA9IF9kZXJlcV8oJy4vdHlwZS9lY2RoX3N5bWtleScpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ0VDREhTeW1tZXRyaWNLZXknLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lY2RoX3N5bWtleSkuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfa2RmX3BhcmFtcyA9IF9kZXJlcV8oJy4vdHlwZS9rZGZfcGFyYW1zJyk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnS0RGUGFyYW1zJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfa2RmX3BhcmFtcykuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfb2lkID0gX2RlcmVxXygnLi90eXBlL29pZCcpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ09JRCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29pZCkuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfYXJtb3IgPSBfZGVyZXFfKCcuL2VuY29kaW5nL2FybW9yJyk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnYXJtb3InLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hcm1vcikuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfZW51bXMgPSBfZGVyZXFfKCcuL2VudW1zJyk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnZW51bXMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcykuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfY29uZmlnID0gX2RlcmVxXygnLi9jb25maWcvY29uZmlnJyk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnY29uZmlnJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29uZmlnKS5kZWZhdWx0O1xuICB9XG59KTtcblxudmFyIF9jcnlwdG8gPSBfZGVyZXFfKCcuL2NyeXB0bycpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ2NyeXB0bycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyeXB0bykuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfa2V5cmluZyA9IF9kZXJlcV8oJy4va2V5cmluZycpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ0tleXJpbmcnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9rZXlyaW5nKS5kZWZhdWx0O1xuICB9XG59KTtcblxudmFyIF9hc3luY19wcm94eSA9IF9kZXJlcV8oJy4vd29ya2VyL2FzeW5jX3Byb3h5Jyk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnQXN5bmNQcm94eScsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FzeW5jX3Byb3h5KS5kZWZhdWx0O1xuICB9XG59KTtcblxudmFyIF9oa3AgPSBfZGVyZXFfKCcuL2hrcCcpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ0hLUCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hrcCkuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfd2tkID0gX2RlcmVxXygnLi93a2QnKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdXS0QnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93a2QpLmRlZmF1bHQ7XG4gIH1cbn0pO1xuXG52YXIgb3BlbnBncCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9vcGVucGdwKTtcblxudmFyIF9rZXkgPSBfZGVyZXFfKCcuL2tleScpO1xuXG52YXIga2V5TW9kID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2tleSk7XG5cbnZhciBfc2lnbmF0dXJlID0gX2RlcmVxXygnLi9zaWduYXR1cmUnKTtcblxudmFyIHNpZ25hdHVyZU1vZCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9zaWduYXR1cmUpO1xuXG52YXIgX21lc3NhZ2UgPSBfZGVyZXFfKCcuL21lc3NhZ2UnKTtcblxudmFyIG1lc3NhZ2VNb2QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfbWVzc2FnZSk7XG5cbnZhciBfY2xlYXJ0ZXh0ID0gX2RlcmVxXygnLi9jbGVhcnRleHQnKTtcblxudmFyIGNsZWFydGV4dE1vZCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9jbGVhcnRleHQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGVsc2UgeyB2YXIgbmV3T2JqID0ge307IGlmIChvYmogIT0gbnVsbCkgeyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IHJldHVybiBuZXdPYmo7IH0gfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBvcGVucGdwO1xuXG4vKipcbiAqIEV4cG9ydCBlYWNoIGhpZ2ggbGV2ZWwgYXBpIGZ1bmN0aW9uIHNlcGFyYXRlbHkuXG4gKiBVc2FnZTpcbiAqXG4gKiAgIGltcG9ydCB7IGVuY3J5cHRNZXNzYWdlIH0gZnJvbSAnb3BlbnBncC5qcydcbiAqICAgZW5jcnlwdE1lc3NhZ2Uoa2V5cywgdGV4dClcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25ld2xpbmUtYWZ0ZXItaW1wb3J0LCBpbXBvcnQvZmlyc3QgKi9cblxuLyoqXG4gKiBFeHBvcnQgaGlnaCBsZXZlbCBhcGkgYXMgZGVmYXVsdC5cbiAqIFVzYWdlOlxuICpcbiAqICAgaW1wb3J0IG9wZW5wZ3AgZnJvbSAnb3BlbnBncC5qcydcbiAqICAgb3BlbnBncC5lbmNyeXB0TWVzc2FnZShrZXlzLCB0ZXh0KVxuICovXG5cblxuLyoqXG4gKiBAc2VlIG1vZHVsZTprZXlcbiAqIEBuYW1lIG1vZHVsZTpvcGVucGdwLmtleVxuICovXG5cbnZhciBrZXkgPSBleHBvcnRzLmtleSA9IGtleU1vZDtcblxuLyoqXG4gKiBAc2VlIG1vZHVsZTpzaWduYXR1cmVcbiAqIEBuYW1lIG1vZHVsZTpvcGVucGdwLnNpZ25hdHVyZVxuICovXG52YXIgc2lnbmF0dXJlID0gZXhwb3J0cy5zaWduYXR1cmUgPSBzaWduYXR1cmVNb2Q7XG5cbi8qKlxuICogQHNlZSBtb2R1bGU6bWVzc2FnZVxuICogQG5hbWUgbW9kdWxlOm9wZW5wZ3AubWVzc2FnZVxuICovXG52YXIgbWVzc2FnZSA9IGV4cG9ydHMubWVzc2FnZSA9IG1lc3NhZ2VNb2Q7XG5cbi8qKlxuICogQHNlZSBtb2R1bGU6Y2xlYXJ0ZXh0XG4gKiBAbmFtZSBtb2R1bGU6b3BlbnBncC5jbGVhcnRleHRcbiAqL1xudmFyIGNsZWFydGV4dCA9IGV4cG9ydHMuY2xlYXJ0ZXh0ID0gY2xlYXJ0ZXh0TW9kO1xuXG4vKipcbiAqIEBzZWUgbW9kdWxlOnV0aWxcbiAqIEBuYW1lIG1vZHVsZTpvcGVucGdwLnV0aWxcbiAqL1xuXG59LHtcIi4vY2xlYXJ0ZXh0XCI6MzIyLFwiLi9jb25maWcvY29uZmlnXCI6MzI0LFwiLi9jcnlwdG9cIjozNDAsXCIuL2VuY29kaW5nL2FybW9yXCI6MzU3LFwiLi9lbnVtc1wiOjM1OSxcIi4vaGtwXCI6MzYwLFwiLi9rZXlcIjozNjIsXCIuL2tleXJpbmdcIjozNjMsXCIuL21lc3NhZ2VcIjozNjYsXCIuL29wZW5wZ3BcIjozNjcsXCIuL3BhY2tldFwiOjM3MSxcIi4vc2lnbmF0dXJlXCI6MzkxLFwiLi90eXBlL2VjZGhfc3lta2V5XCI6MzkyLFwiLi90eXBlL2tkZl9wYXJhbXNcIjozOTMsXCIuL3R5cGUva2V5aWRcIjozOTQsXCIuL3R5cGUvbXBpXCI6Mzk1LFwiLi90eXBlL29pZFwiOjM5NixcIi4vdHlwZS9zMmtcIjozOTcsXCIuL3V0aWxcIjozOTgsXCIuL3drZFwiOjM5OSxcIi4vd29ya2VyL2FzeW5jX3Byb3h5XCI6NDAwfV0sMzYyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuaXNBZWFkU3VwcG9ydGVkID0gZXhwb3J0cy5nZXRQcmVmZXJyZWRBbGdvID0gZXhwb3J0cy5nZXRQcmVmZXJyZWRIYXNoQWxnbyA9IGV4cG9ydHMucmVmb3JtYXQgPSBleHBvcnRzLmdlbmVyYXRlID0gZXhwb3J0cy5jcmVhdGVTaWduYXR1cmVQYWNrZXQgPSB1bmRlZmluZWQ7XG5cbnZhciBfdmFsdWVzID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC92YWx1ZXMnKTtcblxudmFyIF92YWx1ZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmFsdWVzKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZicpO1xuXG52YXIgX2dldFByb3RvdHlwZU9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldFByb3RvdHlwZU9mKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5Jyk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zbGljZWRUb0FycmF5Mik7XG5cbnZhciBfYXNzaWduID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9hc3NpZ24nKTtcblxudmFyIF9hc3NpZ24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXNzaWduKTtcblxudmFyIF9wcm9taXNlID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9jb3JlLWpzL3Byb21pc2UnKTtcblxudmFyIF9wcm9taXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb21pc2UpO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvcicpO1xuXG52YXIgX3JlZ2VuZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZ2VuZXJhdG9yKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJyk7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3luY1RvR2VuZXJhdG9yMik7XG5cbi8qKlxuICogTWVyZ2VzIHNpZ25hdHVyZXMgZnJvbSBzb3VyY2VbYXR0cl0gdG8gZGVzdFthdHRyXVxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge09iamVjdH0gc291cmNlXG4gKiBAcGFyYW0gIHtPYmplY3R9IGRlc3RcbiAqIEBwYXJhbSAge1N0cmluZ30gYXR0clxuICogQHBhcmFtICB7RnVuY3Rpb259IGNoZWNrRm4gb3B0aW9uYWwsIHNpZ25hdHVyZSBvbmx5IG1lcmdlZCBpZiB0cnVlXG4gKi9cbnZhciBtZXJnZVNpZ25hdHVyZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMTkgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTE4KHNvdXJjZSwgZGVzdCwgYXR0ciwgY2hlY2tGbikge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMTgkKF9jb250ZXh0MTgpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQxOC5wcmV2ID0gX2NvbnRleHQxOC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgc291cmNlID0gc291cmNlW2F0dHJdO1xuXG4gICAgICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgICBfY29udGV4dDE4Lm5leHQgPSA4O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRlc3RbYXR0cl0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MTgubmV4dCA9IDY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZXN0W2F0dHJdID0gc291cmNlO1xuICAgICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gODtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gODtcbiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwoc291cmNlLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBfcmVmMjAgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTE3KHNvdXJjZVNpZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMTckKF9jb250ZXh0MTcpIHtcbiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQxNy5wcmV2ID0gX2NvbnRleHQxNy5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNy50MSA9ICFzb3VyY2VTaWcuaXNFeHBpcmVkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghX2NvbnRleHQxNy50MSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE3Lm5leHQgPSA4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNy50MiA9ICFjaGVja0ZuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2NvbnRleHQxNy50Mikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE3Lm5leHQgPSA3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNy5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGVja0ZuKHNvdXJjZVNpZyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE3LnQyID0gX2NvbnRleHQxNy5zZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNy50MSA9IF9jb250ZXh0MTcudDI7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE3LnQwID0gX2NvbnRleHQxNy50MTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfY29udGV4dDE3LnQwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTcubmV4dCA9IDExO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNy50MCA9ICFkZXN0W2F0dHJdLnNvbWUoZnVuY3Rpb24gKGRlc3RTaWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LmVxdWFsc1VpbnQ4QXJyYXkoZGVzdFNpZy5zaWduYXR1cmUsIHNvdXJjZVNpZy5zaWduYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfY29udGV4dDE3LnQwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTcubmV4dCA9IDEzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFthdHRyXS5wdXNoKHNvdXJjZVNpZyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNy5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMTcsIHRoaXMpO1xuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDM2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWYyMC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSgpKSk7XG5cbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE4LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUxOCwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VTaWduYXR1cmVzKF94MzIsIF94MzMsIF94MzQsIF94MzUpIHtcbiAgICByZXR1cm4gX3JlZjE5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogUmV2b2tlcyB0aGUga2V5XG4gKiBAcGFyYW0gIHtPYmplY3R9IHJlYXNvbkZvclJldm9jYXRpb24gb3B0aW9uYWwsIG9iamVjdCBpbmRpY2F0aW5nIHRoZSByZWFzb24gZm9yIHJldm9jYXRpb25cbiAqIEBwYXJhbSAge21vZHVsZTplbnVtcy5yZWFzb25Gb3JSZXZvY2F0aW9ufSByZWFzb25Gb3JSZXZvY2F0aW9uLmZsYWcgb3B0aW9uYWwsIGZsYWcgaW5kaWNhdGluZyB0aGUgcmVhc29uIGZvciByZXZvY2F0aW9uXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHJlYXNvbkZvclJldm9jYXRpb24uc3RyaW5nIG9wdGlvbmFsLCBzdHJpbmcgZXhwbGFpbmluZyB0aGUgcmVhc29uIGZvciByZXZvY2F0aW9uXG4gKiBAcGFyYW0gIHtEYXRlfSBkYXRlIG9wdGlvbmFsLCBvdmVycmlkZSB0aGUgY3JlYXRpb250aW1lIG9mIHRoZSByZXZvY2F0aW9uIHNpZ25hdHVyZVxuICogQHJldHVybiB7bW9kdWxlOmtleX5LZXl9IG5ldyBrZXkgd2l0aCByZXZvY2F0aW9uIHNpZ25hdHVyZVxuICovXG5cblxuLyoqXG4gKiBDcmVhdGUgc2lnbmF0dXJlIHBhY2tldFxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVRvU2lnbiBDb250YWlucyBwYWNrZXRzIHRvIGJlIHNpZ25lZFxuICogQHBhcmFtICB7bW9kdWxlOnBhY2tldC5TZWNyZXRLZXl8XG4gKiAgICAgICAgICBtb2R1bGU6cGFja2V0LlNlY3JldFN1YmtleX0gICAgICBzaWduaW5nS2V5UGFja2V0IHNlY3JldCBrZXkgcGFja2V0IGZvciBzaWduaW5nXG4gKiBAcGFyYW0gIHtPYmplY3R9IHNpZ25hdHVyZVByb3BlcnRpZXMgICAgICAob3B0aW9uYWwpIHByb3BlcnRpZXMgdG8gd3JpdGUgb24gdGhlIHNpZ25hdHVyZSBwYWNrZXQgYmVmb3JlIHNpZ25pbmdcbiAqIEBwYXJhbSAge0RhdGV9IGRhdGUgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgb3ZlcnJpZGUgdGhlIGNyZWF0aW9udGltZSBvZiB0aGUgc2lnbmF0dXJlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHVzZXJJZCAgICAgICAgICAgICAgICAgICAob3B0aW9uYWwpIHVzZXIgSURcbiAqIEByZXR1cm4ge21vZHVsZTpwYWNrZXQvc2lnbmF0dXJlfSAgICAgICAgIHNpZ25hdHVyZSBwYWNrZXRcbiAqL1xudmFyIGNyZWF0ZVNpZ25hdHVyZVBhY2tldCA9IGV4cG9ydHMuY3JlYXRlU2lnbmF0dXJlUGFja2V0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjM0ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyOShkYXRhVG9TaWduLCBwcml2YXRlS2V5LCBzaWduaW5nS2V5UGFja2V0LCBzaWduYXR1cmVQcm9wZXJ0aWVzLCBkYXRlLCB1c2VySWQpIHtcbiAgICB2YXIgc2lnbmF0dXJlUGFja2V0O1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMjkkKF9jb250ZXh0MjkpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyOS5wcmV2ID0gX2NvbnRleHQyOS5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgaWYgKHNpZ25pbmdLZXlQYWNrZXQuaXNEZWNyeXB0ZWQpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyOS5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJpdmF0ZSBrZXkgaXMgbm90IGRlY3J5cHRlZC4nKTtcblxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHNpZ25hdHVyZVBhY2tldCA9IG5ldyBfcGFja2V0Mi5kZWZhdWx0LlNpZ25hdHVyZShkYXRlKTtcblxuICAgICAgICAgICAgKDAsIF9hc3NpZ24yLmRlZmF1bHQpKHNpZ25hdHVyZVBhY2tldCwgc2lnbmF0dXJlUHJvcGVydGllcyk7XG4gICAgICAgICAgICBzaWduYXR1cmVQYWNrZXQucHVibGljS2V5QWxnb3JpdGhtID0gc2lnbmluZ0tleVBhY2tldC5hbGdvcml0aG07XG4gICAgICAgICAgICBfY29udGV4dDI5Lm5leHQgPSA3O1xuICAgICAgICAgICAgcmV0dXJuIGdldFByZWZlcnJlZEhhc2hBbGdvKHByaXZhdGVLZXksIHNpZ25pbmdLZXlQYWNrZXQsIGRhdGUsIHVzZXJJZCk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBzaWduYXR1cmVQYWNrZXQuaGFzaEFsZ29yaXRobSA9IF9jb250ZXh0Mjkuc2VudDtcbiAgICAgICAgICAgIF9jb250ZXh0MjkubmV4dCA9IDEwO1xuICAgICAgICAgICAgcmV0dXJuIHNpZ25hdHVyZVBhY2tldC5zaWduKHNpZ25pbmdLZXlQYWNrZXQsIGRhdGFUb1NpZ24pO1xuXG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDI5LmFicnVwdCgncmV0dXJuJywgc2lnbmF0dXJlUGFja2V0KTtcblxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDI5LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyOSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlU2lnbmF0dXJlUGFja2V0KF94NTIsIF94NTMsIF94NTQsIF94NTUsIF94NTYsIF94NTcpIHtcbiAgICByZXR1cm4gX3JlZjM0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIHVzZXIgY2VydGlmaWNhdGVcbiAqIEBwYXJhbSAge21vZHVsZTpwYWNrZXQuU2VjcmV0S2V5fFxuICogICAgICAgICAgbW9kdWxlOnBhY2tldC5QdWJsaWNLZXl9IHByaW1hcnlLZXkgIFRoZSBwcmltYXJ5IGtleSBwYWNrZXRcbiAqIEBwYXJhbSAge21vZHVsZTpwYWNrZXQuU2lnbmF0dXJlfSAgY2VydGlmaWNhdGUgQSBjZXJ0aWZpY2F0ZSBvZiB0aGlzIHVzZXJcbiAqIEBwYXJhbSAge0FycmF5PG1vZHVsZTprZXkuS2V5Pn0gICAga2V5cyAgICAgICAgQXJyYXkgb2Yga2V5cyB0byB2ZXJpZnkgY2VydGlmaWNhdGUgc2lnbmF0dXJlc1xuICogQHBhcmFtICB7RGF0ZX0gICAgICAgICAgICAgICAgICAgICBkYXRlICAgICAgICBVc2UgdGhlIGdpdmVuIGRhdGUgaW5zdGVhZCBvZiB0aGUgY3VycmVudCB0aW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxtb2R1bGU6ZW51bXMua2V5U3RhdHVzPn0gICAgIHN0YXR1cyBvZiB0aGUgY2VydGlmaWNhdGVcbiAqIEBhc3luY1xuICovXG5cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBuZXcgT3BlblBHUCBrZXkuIFN1cHBvcnRzIFJTQSBhbmQgRUNDIGtleXMuXG4gKiBQcmltYXJ5IGFuZCBzdWJrZXkgd2lsbCBiZSBvZiBzYW1lIHR5cGUuXG4gKiBAcGFyYW0ge21vZHVsZTplbnVtcy5wdWJsaWNLZXl9IFtvcHRpb25zLmtleVR5cGU9bW9kdWxlOmVudW1zLnB1YmxpY0tleS5yc2FfZW5jcnlwdF9zaWduXVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvIGluZGljYXRlIHdoYXQgdHlwZSBvZiBrZXkgdG8gbWFrZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0EgaXMgMS4gU2VlIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTkuMX1cbiAqIEBwYXJhbSB7SW50ZWdlcn0gb3B0aW9ucy5udW1CaXRzICAgIG51bWJlciBvZiBiaXRzIGZvciB0aGUga2V5IGNyZWF0aW9uLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXk8U3RyaW5nPn0gIG9wdGlvbnMudXNlcklkc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc3VtZXMgYWxyZWFkeSBpbiBmb3JtIG9mIFwiVXNlciBOYW1lIDx1c2VybmFtZUBlbWFpbC5jb20+XCJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBhcnJheSBpcyB1c2VkLCB0aGUgZmlyc3QgdXNlcklkIGlzIHNldCBhcyBwcmltYXJ5IHVzZXIgSWRcbiAqIEBwYXJhbSB7U3RyaW5nfSAgb3B0aW9ucy5wYXNzcGhyYXNlIFRoZSBwYXNzcGhyYXNlIHVzZWQgdG8gZW5jcnlwdCB0aGUgcmVzdWx0aW5nIHByaXZhdGUga2V5XG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMua2V5RXhwaXJhdGlvblRpbWU9MF1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHNlY29uZHMgYWZ0ZXIgdGhlIGtleSBjcmVhdGlvbiB0aW1lIHRoYXQgdGhlIGtleSBleHBpcmVzXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGN1cnZlICAgICAgICAgICAgKG9wdGlvbmFsKSBlbGxpcHRpYyBjdXJ2ZSBmb3IgRUNDIGtleXNcbiAqIEBwYXJhbSAge0RhdGV9IGRhdGUgICAgICAgICBPdmVycmlkZSB0aGUgY3JlYXRpb24gZGF0ZSBvZiB0aGUga2V5IGFuZCB0aGUga2V5IHNpZ25hdHVyZXNcbiAqIEBwYXJhbSAge0FycmF5PE9iamVjdD59IHN1YmtleXMgICAob3B0aW9uYWwpIG9wdGlvbnMgZm9yIGVhY2ggc3Via2V5LCBkZWZhdWx0IHRvIG1haW4ga2V5IG9wdGlvbnMuIGUuZy4gW3tzaWduOiB0cnVlLCBwYXNzcGhyYXNlOiAnMTIzJ31dXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduIHBhcmFtZXRlciBkZWZhdWx0cyB0byBmYWxzZSwgYW5kIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzdWJrZXkgc2hvdWxkIHNpZ24gcmF0aGVyIHRoYW4gZW5jcnlwdFxuICogQHJldHVybnMge1Byb21pc2U8bW9kdWxlOmtleS5LZXk+fVxuICogQGFzeW5jXG4gKiBAc3RhdGljXG4gKi9cbnZhciBnZW5lcmF0ZSA9IGV4cG9ydHMuZ2VuZXJhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmNDkgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQ1KG9wdGlvbnMpIHtcbiAgICB2YXIgZ2VuZXJhdGVTZWNyZXRLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlZjUwID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0MyhvcHRpb25zKSB7XG4gICAgICAgIHZhciBzZWNyZXRLZXlQYWNrZXQ7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNDMkKF9jb250ZXh0NDMpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDQzLnByZXYgPSBfY29udGV4dDQzLm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHNlY3JldEtleVBhY2tldCA9IG5ldyBfcGFja2V0Mi5kZWZhdWx0LlNlY3JldEtleShvcHRpb25zLmRhdGUpO1xuXG4gICAgICAgICAgICAgICAgc2VjcmV0S2V5UGFja2V0LnBhY2tldHMgPSBudWxsO1xuICAgICAgICAgICAgICAgIHNlY3JldEtleVBhY2tldC5hbGdvcml0aG0gPSBfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LCBvcHRpb25zLmFsZ29yaXRobSk7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQ0My5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VjcmV0S2V5UGFja2V0LmdlbmVyYXRlKG9wdGlvbnMubnVtQml0cywgb3B0aW9ucy5jdXJ2ZSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQzLmFicnVwdCgncmV0dXJuJywgc2VjcmV0S2V5UGFja2V0KTtcblxuICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NDMuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTQzLCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGdlbmVyYXRlU2VjcmV0S2V5KF94ODYpIHtcbiAgICAgICAgcmV0dXJuIF9yZWY1MC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KCk7XG5cbiAgICB2YXIgZ2VuZXJhdGVTZWNyZXRTdWJrZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlZjUxID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0NChvcHRpb25zKSB7XG4gICAgICAgIHZhciBzZWNyZXRTdWJrZXlQYWNrZXQ7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNDQkKF9jb250ZXh0NDQpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDQ0LnByZXYgPSBfY29udGV4dDQ0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHNlY3JldFN1YmtleVBhY2tldCA9IG5ldyBfcGFja2V0Mi5kZWZhdWx0LlNlY3JldFN1YmtleShvcHRpb25zLmRhdGUpO1xuXG4gICAgICAgICAgICAgICAgc2VjcmV0U3Via2V5UGFja2V0LnBhY2tldHMgPSBudWxsO1xuICAgICAgICAgICAgICAgIHNlY3JldFN1YmtleVBhY2tldC5hbGdvcml0aG0gPSBfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LCBvcHRpb25zLmFsZ29yaXRobSk7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQ0NC5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VjcmV0U3Via2V5UGFja2V0LmdlbmVyYXRlKG9wdGlvbnMubnVtQml0cywgb3B0aW9ucy5jdXJ2ZSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQ0LmFicnVwdCgncmV0dXJuJywgc2VjcmV0U3Via2V5UGFja2V0KTtcblxuICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NDQuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTQ0LCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGdlbmVyYXRlU2VjcmV0U3Via2V5KF94ODcpIHtcbiAgICAgICAgcmV0dXJuIF9yZWY1MS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KCk7XG5cbiAgICB2YXIgcHJvbWlzZXMsIHNhbml0aXplS2V5T3B0aW9ucztcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTQ1JChfY29udGV4dDQ1KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NDUucHJldiA9IF9jb250ZXh0NDUubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHNhbml0aXplS2V5T3B0aW9ucyA9IGZ1bmN0aW9uIHNhbml0aXplS2V5T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHZhciBzdWJrZXlEZWZhdWx0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICAgICAgICAgICAgb3B0aW9ucy5jdXJ2ZSA9IG9wdGlvbnMuY3VydmUgfHwgc3Via2V5RGVmYXVsdHMuY3VydmU7XG4gICAgICAgICAgICAgIG9wdGlvbnMubnVtQml0cyA9IG9wdGlvbnMubnVtQml0cyB8fCBzdWJrZXlEZWZhdWx0cy5udW1CaXRzO1xuICAgICAgICAgICAgICBvcHRpb25zLmtleUV4cGlyYXRpb25UaW1lID0gb3B0aW9ucy5rZXlFeHBpcmF0aW9uVGltZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5rZXlFeHBpcmF0aW9uVGltZSA6IHN1YmtleURlZmF1bHRzLmtleUV4cGlyYXRpb25UaW1lO1xuICAgICAgICAgICAgICBvcHRpb25zLnBhc3NwaHJhc2UgPSBfdXRpbDIuZGVmYXVsdC5pc1N0cmluZyhvcHRpb25zLnBhc3NwaHJhc2UpID8gb3B0aW9ucy5wYXNzcGhyYXNlIDogc3Via2V5RGVmYXVsdHMucGFzc3BocmFzZTtcbiAgICAgICAgICAgICAgb3B0aW9ucy5kYXRlID0gb3B0aW9ucy5kYXRlIHx8IHN1YmtleURlZmF1bHRzLmRhdGU7XG5cbiAgICAgICAgICAgICAgb3B0aW9ucy5zaWduID0gb3B0aW9ucy5zaWduIHx8IGZhbHNlO1xuXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmN1cnZlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY3VydmUgPSBfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LmN1cnZlLCBvcHRpb25zLmN1cnZlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCB2YWxpZCBjdXJ2ZS4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY3VydmUgPT09IF9lbnVtczIuZGVmYXVsdC5jdXJ2ZS5lZDI1NTE5IHx8IG9wdGlvbnMuY3VydmUgPT09IF9lbnVtczIuZGVmYXVsdC5jdXJ2ZS5jdXJ2ZTI1NTE5KSB7XG4gICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zaWduKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtID0gX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lZGRzYTtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jdXJ2ZSA9IF9lbnVtczIuZGVmYXVsdC5jdXJ2ZS5lZDI1NTE5O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5hbGdvcml0aG0gPSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmVjZGg7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY3VydmUgPSBfZW51bXMyLmRlZmF1bHQuY3VydmUuY3VydmUyNTUxOTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2lnbikge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmFsZ29yaXRobSA9IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkc2E7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmFsZ29yaXRobSA9IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkaDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5udW1CaXRzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5hbGdvcml0aG0gPSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LnJzYV9lbmNyeXB0X3NpZ247XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnJlY29nbml6ZWQga2V5IHR5cGUnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIG9wdGlvbnMuc2lnbiA9IHRydWU7IC8vIHByaW1hcnkga2V5IGlzIGFsd2F5cyBhIHNpZ25pbmcga2V5XG4gICAgICAgICAgICBvcHRpb25zID0gc2FuaXRpemVLZXlPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAgICAgb3B0aW9ucy5zdWJrZXlzID0gb3B0aW9ucy5zdWJrZXlzLm1hcChmdW5jdGlvbiAoc3Via2V5LCBpbmRleCkge1xuICAgICAgICAgICAgICByZXR1cm4gc2FuaXRpemVLZXlPcHRpb25zKG9wdGlvbnMuc3Via2V5c1tpbmRleF0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHByb21pc2VzID0gW2dlbmVyYXRlU2VjcmV0S2V5KG9wdGlvbnMpXTtcblxuICAgICAgICAgICAgcHJvbWlzZXMgPSBwcm9taXNlcy5jb25jYXQob3B0aW9ucy5zdWJrZXlzLm1hcChnZW5lcmF0ZVNlY3JldFN1YmtleSkpO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NDUuYWJydXB0KCdyZXR1cm4nLCBfcHJvbWlzZTIuZGVmYXVsdC5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKHBhY2tldHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHdyYXBLZXlPYmplY3QocGFja2V0c1swXSwgcGFja2V0cy5zbGljZSgxKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQ1LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWU0NSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gZ2VuZXJhdGUoX3g4NCkge1xuICAgIHJldHVybiBfcmVmNDkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBSZWZvcm1hdHMgYW5kIHNpZ25zIGFuIE9wZW5QR1Aga2V5IHdpdGggYSBnaXZlbiBVc2VyIElELiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyBSU0Ega2V5cy5cbiAqIEBwYXJhbSB7bW9kdWxlOmtleS5LZXl9IG9wdGlvbnMucHJpdmF0ZUtleSAgIFRoZSBwcml2YXRlIGtleSB0byByZWZvcm1hdFxuICogQHBhcmFtIHttb2R1bGU6ZW51bXMucHVibGljS2V5fSBbb3B0aW9ucy5rZXlUeXBlPW1vZHVsZTplbnVtcy5wdWJsaWNLZXkucnNhX2VuY3J5cHRfc2lnbl1cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5PFN0cmluZz59ICBvcHRpb25zLnVzZXJJZHNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bWVzIGFscmVhZHkgaW4gZm9ybSBvZiBcIlVzZXIgTmFtZSA8dXNlcm5hbWVAZW1haWwuY29tPlwiXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgYXJyYXkgaXMgdXNlZCwgdGhlIGZpcnN0IHVzZXJJZCBpcyBzZXQgYXMgcHJpbWFyeSB1c2VyIElkXG4gKiBAcGFyYW0ge1N0cmluZ30gIG9wdGlvbnMucGFzc3BocmFzZSBUaGUgcGFzc3BocmFzZSB1c2VkIHRvIGVuY3J5cHQgdGhlIHJlc3VsdGluZyBwcml2YXRlIGtleVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmtleUV4cGlyYXRpb25UaW1lPTBdXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBzZWNvbmRzIGFmdGVyIHRoZSBrZXkgY3JlYXRpb24gdGltZSB0aGF0IHRoZSBrZXkgZXhwaXJlc1xuICogQHBhcmFtICB7RGF0ZX0gZGF0ZSAgICAgICAgIE92ZXJyaWRlIHRoZSBjcmVhdGlvbiBkYXRlIG9mIHRoZSBrZXkgYW5kIHRoZSBrZXkgc2lnbmF0dXJlc1xuICogQHBhcmFtICB7QXJyYXk8T2JqZWN0Pn0gc3Via2V5cyAgIChvcHRpb25hbCkgb3B0aW9ucyBmb3IgZWFjaCBzdWJrZXksIGRlZmF1bHQgdG8gbWFpbiBrZXkgb3B0aW9ucy4gZS5nLiBbe3NpZ246IHRydWUsIHBhc3NwaHJhc2U6ICcxMjMnfV1cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJldm9rZWQ9ZmFsc2VdIFdoZXRoZXIgdGhlIGtleSBzaG91bGQgaW5jbHVkZSBhIHJldm9jYXRpb24gc2lnbmF0dXJlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxtb2R1bGU6a2V5LktleT59XG4gKiBAYXN5bmNcbiAqIEBzdGF0aWNcbiAqL1xuXG5cbnZhciByZWZvcm1hdCA9IGV4cG9ydHMucmVmb3JtYXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmNTIgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQ2KG9wdGlvbnMpIHtcbiAgICB2YXIgaXNEZWNyeXB0ZWQsIHBhY2tldGxpc3QsIHNlY3JldEtleVBhY2tldCwgc2VjcmV0U3Via2V5UGFja2V0cywgaSwgc2FuaXRpemVLZXlPcHRpb25zO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNDYkKF9jb250ZXh0NDYpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQ0Ni5wcmV2ID0gX2NvbnRleHQ0Ni5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgc2FuaXRpemVLZXlPcHRpb25zID0gZnVuY3Rpb24gc2FuaXRpemVLZXlPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgdmFyIHN1YmtleURlZmF1bHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgICAgICAgICAgICBvcHRpb25zLmtleUV4cGlyYXRpb25UaW1lID0gb3B0aW9ucy5rZXlFeHBpcmF0aW9uVGltZSB8fCBzdWJrZXlEZWZhdWx0cy5rZXlFeHBpcmF0aW9uVGltZTtcbiAgICAgICAgICAgICAgb3B0aW9ucy5wYXNzcGhyYXNlID0gX3V0aWwyLmRlZmF1bHQuaXNTdHJpbmcob3B0aW9ucy5wYXNzcGhyYXNlKSA/IG9wdGlvbnMucGFzc3BocmFzZSA6IHN1YmtleURlZmF1bHRzLnBhc3NwaHJhc2U7XG4gICAgICAgICAgICAgIG9wdGlvbnMuZGF0ZSA9IG9wdGlvbnMuZGF0ZSB8fCBzdWJrZXlEZWZhdWx0cy5kYXRlO1xuXG4gICAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgb3B0aW9ucyA9IHNhbml0aXplS2V5T3B0aW9ucyhvcHRpb25zKTtcblxuICAgICAgICAgICAgX2NvbnRleHQ0Ni5wcmV2ID0gMjtcbiAgICAgICAgICAgIGlzRGVjcnlwdGVkID0gb3B0aW9ucy5wcml2YXRlS2V5LmdldEtleVBhY2tldHMoKS5ldmVyeShmdW5jdGlvbiAoa2V5UGFja2V0KSB7XG4gICAgICAgICAgICAgIHJldHVybiBrZXlQYWNrZXQuaXNEZWNyeXB0ZWQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGlzRGVjcnlwdGVkKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0NDYubmV4dCA9IDc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dDQ2Lm5leHQgPSA3O1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMucHJpdmF0ZUtleS5kZWNyeXB0KCk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBfY29udGV4dDQ2Lm5leHQgPSAxMjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgX2NvbnRleHQ0Ni5wcmV2ID0gOTtcbiAgICAgICAgICAgIF9jb250ZXh0NDYudDAgPSBfY29udGV4dDQ2WydjYXRjaCddKDIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdLZXkgbm90IGRlY3J5cHRlZCcpO1xuXG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIHBhY2tldGxpc3QgPSBvcHRpb25zLnByaXZhdGVLZXkudG9QYWNrZXRsaXN0KCk7XG4gICAgICAgICAgICBzZWNyZXRLZXlQYWNrZXQgPSB2b2lkIDA7XG4gICAgICAgICAgICBzZWNyZXRTdWJrZXlQYWNrZXRzID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWNrZXRsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGlmIChwYWNrZXRsaXN0W2ldLnRhZyA9PT0gX2VudW1zMi5kZWZhdWx0LnBhY2tldC5zZWNyZXRLZXkpIHtcbiAgICAgICAgICAgICAgICBzZWNyZXRLZXlQYWNrZXQgPSBwYWNrZXRsaXN0W2ldO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhY2tldGxpc3RbaV0udGFnID09PSBfZW51bXMyLmRlZmF1bHQucGFja2V0LnNlY3JldFN1YmtleSkge1xuICAgICAgICAgICAgICAgIHNlY3JldFN1YmtleVBhY2tldHMucHVzaChwYWNrZXRsaXN0W2ldKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VjcmV0S2V5UGFja2V0KSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0NDYubmV4dCA9IDE4O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdLZXkgZG9lcyBub3QgY29udGFpbiBhIHNlY3JldCBrZXkgcGFja2V0Jyk7XG5cbiAgICAgICAgICBjYXNlIDE4OlxuXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc3Via2V5cykge1xuICAgICAgICAgICAgICBvcHRpb25zLnN1YmtleXMgPSBzZWNyZXRTdWJrZXlQYWNrZXRzLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5zdWJrZXlzLmxlbmd0aCAhPT0gc2VjcmV0U3Via2V5UGFja2V0cy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0NDYubmV4dCA9IDIxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOdW1iZXIgb2Ygc3Via2V5IG9wdGlvbnMgZG9lcyBub3QgbWF0Y2ggbnVtYmVyIG9mIHN1YmtleXMnKTtcblxuICAgICAgICAgIGNhc2UgMjE6XG5cbiAgICAgICAgICAgIG9wdGlvbnMuc3Via2V5cyA9IG9wdGlvbnMuc3Via2V5cy5tYXAoZnVuY3Rpb24gKHN1YmtleSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplS2V5T3B0aW9ucyhvcHRpb25zLnN1YmtleXNbaW5kZXhdLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0Ni5hYnJ1cHQoJ3JldHVybicsIHdyYXBLZXlPYmplY3Qoc2VjcmV0S2V5UGFja2V0LCBzZWNyZXRTdWJrZXlQYWNrZXRzLCBvcHRpb25zKSk7XG5cbiAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0Ni5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlNDYsIHRoaXMsIFtbMiwgOV1dKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiByZWZvcm1hdChfeDg4KSB7XG4gICAgcmV0dXJuIF9yZWY1Mi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG52YXIgd3JhcEtleU9iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWY1MyA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlNTEoc2VjcmV0S2V5UGFja2V0LCBzZWNyZXRTdWJrZXlQYWNrZXRzLCBvcHRpb25zKSB7XG4gICAgdmFyIHBhY2tldGxpc3QsIGRhdGFUb1NpZ247XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1MSQoX2NvbnRleHQ1MSkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDUxLnByZXYgPSBfY29udGV4dDUxLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucGFzc3BocmFzZSkge1xuICAgICAgICAgICAgICBfY29udGV4dDUxLm5leHQgPSAzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQ1MS5uZXh0ID0gMztcbiAgICAgICAgICAgIHJldHVybiBzZWNyZXRLZXlQYWNrZXQuZW5jcnlwdChvcHRpb25zLnBhc3NwaHJhc2UpO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgX2NvbnRleHQ1MS5uZXh0ID0gNTtcbiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwoc2VjcmV0U3Via2V5UGFja2V0cy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX3JlZjU0ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0NyhzZWNyZXRTdWJrZXlQYWNrZXQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1YmtleVBhc3NwaHJhc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWU0NyQoX2NvbnRleHQ0Nykge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDQ3LnByZXYgPSBfY29udGV4dDQ3Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJrZXlQYXNzcGhyYXNlID0gb3B0aW9ucy5zdWJrZXlzW2luZGV4XS5wYXNzcGhyYXNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YmtleVBhc3NwaHJhc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Ny5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NDcubmV4dCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VjcmV0U3Via2V5UGFja2V0LmVuY3J5cHQoc3Via2V5UGFzc3BocmFzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQ3LnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU0NywgdGhpcyk7XG4gICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF94OTMsIF94OTQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjU0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KCkpKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHBhY2tldGxpc3QgPSBuZXcgX3BhY2tldDIuZGVmYXVsdC5MaXN0KCk7XG5cblxuICAgICAgICAgICAgcGFja2V0bGlzdC5wdXNoKHNlY3JldEtleVBhY2tldCk7XG5cbiAgICAgICAgICAgIF9jb250ZXh0NTEubmV4dCA9IDk7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQuYWxsKG9wdGlvbnMudXNlcklkcy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX3JlZjU1ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0OCh1c2VySWQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIHVzZXJJZFBhY2tldCwgZGF0YVRvU2lnbiwgc2lnbmF0dXJlUGFja2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNDgkKF9jb250ZXh0NDgpIHtcbiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ0OC5wcmV2ID0gX2NvbnRleHQ0OC5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkUGFja2V0ID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuVXNlcmlkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJZFBhY2tldC5mb3JtYXQodXNlcklkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVRvU2lnbiA9IHt9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhVG9TaWduLnVzZXJpZCA9IHVzZXJJZFBhY2tldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUb1NpZ24ua2V5ID0gc2VjcmV0S2V5UGFja2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlUGFja2V0ID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuU2lnbmF0dXJlKG9wdGlvbnMuZGF0ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVBhY2tldC5zaWduYXR1cmVUeXBlID0gX2VudW1zMi5kZWZhdWx0LnNpZ25hdHVyZS5jZXJ0X2dlbmVyaWM7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVQYWNrZXQucHVibGljS2V5QWxnb3JpdGhtID0gc2VjcmV0S2V5UGFja2V0LmFsZ29yaXRobTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NDgubmV4dCA9IDEwO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFByZWZlcnJlZEhhc2hBbGdvKG51bGwsIHNlY3JldEtleVBhY2tldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlUGFja2V0Lmhhc2hBbGdvcml0aG0gPSBfY29udGV4dDQ4LnNlbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVBhY2tldC5rZXlGbGFncyA9IFtfZW51bXMyLmRlZmF1bHQua2V5RmxhZ3MuY2VydGlmeV9rZXlzIHwgX2VudW1zMi5kZWZhdWx0LmtleUZsYWdzLnNpZ25fZGF0YV07XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVQYWNrZXQucHJlZmVycmVkU3ltbWV0cmljQWxnb3JpdGhtcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlZmVyIGFlczI1NiwgYWVzMTI4LCB0aGVuIGFlczE5MiAobm8gV2ViQ3J5cHRvIHN1cHBvcnQ6IGh0dHBzOi8vd3d3LmNocm9taXVtLm9yZy9ibGluay93ZWJjcnlwdG8jVE9DLUFFUy1zdXBwb3J0KVxuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlUGFja2V0LnByZWZlcnJlZFN5bW1ldHJpY0FsZ29yaXRobXMucHVzaChfZW51bXMyLmRlZmF1bHQuc3ltbWV0cmljLmFlczI1Nik7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVQYWNrZXQucHJlZmVycmVkU3ltbWV0cmljQWxnb3JpdGhtcy5wdXNoKF9lbnVtczIuZGVmYXVsdC5zeW1tZXRyaWMuYWVzMTI4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVBhY2tldC5wcmVmZXJyZWRTeW1tZXRyaWNBbGdvcml0aG1zLnB1c2goX2VudW1zMi5kZWZhdWx0LnN5bW1ldHJpYy5hZXMxOTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlUGFja2V0LnByZWZlcnJlZFN5bW1ldHJpY0FsZ29yaXRobXMucHVzaChfZW51bXMyLmRlZmF1bHQuc3ltbWV0cmljLmNhc3Q1KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVBhY2tldC5wcmVmZXJyZWRTeW1tZXRyaWNBbGdvcml0aG1zLnB1c2goX2VudW1zMi5kZWZhdWx0LnN5bW1ldHJpYy50cmlwbGVkZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jb25maWcyLmRlZmF1bHQuYWVhZF9wcm90ZWN0ICYmIF9jb25maWcyLmRlZmF1bHQuYWVhZF9wcm90ZWN0X3ZlcnNpb24gPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlUGFja2V0LnByZWZlcnJlZEFlYWRBbGdvcml0aG1zID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVBhY2tldC5wcmVmZXJyZWRBZWFkQWxnb3JpdGhtcy5wdXNoKF9lbnVtczIuZGVmYXVsdC5hZWFkLmVheCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVBhY2tldC5wcmVmZXJyZWRBZWFkQWxnb3JpdGhtcy5wdXNoKF9lbnVtczIuZGVmYXVsdC5hZWFkLm9jYik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVQYWNrZXQucHJlZmVycmVkSGFzaEFsZ29yaXRobXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWZlciBmYXN0IGFzbS5qcyBpbXBsZW1lbnRhdGlvbnMgKFNIQS0yNTYpLiBTSEEtMSB3aWxsIG5vdCBiZSBzZWN1cmUgbXVjaCBsb25nZXIuLi5tb3ZlIHRvIGJvdHRvbSBvZiBsaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVQYWNrZXQucHJlZmVycmVkSGFzaEFsZ29yaXRobXMucHVzaChfZW51bXMyLmRlZmF1bHQuaGFzaC5zaGEyNTYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlUGFja2V0LnByZWZlcnJlZEhhc2hBbGdvcml0aG1zLnB1c2goX2VudW1zMi5kZWZhdWx0Lmhhc2guc2hhNTEyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVBhY2tldC5wcmVmZXJyZWRIYXNoQWxnb3JpdGhtcy5wdXNoKF9lbnVtczIuZGVmYXVsdC5oYXNoLnNoYTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlUGFja2V0LnByZWZlcnJlZENvbXByZXNzaW9uQWxnb3JpdGhtcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlUGFja2V0LnByZWZlcnJlZENvbXByZXNzaW9uQWxnb3JpdGhtcy5wdXNoKF9lbnVtczIuZGVmYXVsdC5jb21wcmVzc2lvbi56bGliKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVBhY2tldC5wcmVmZXJyZWRDb21wcmVzc2lvbkFsZ29yaXRobXMucHVzaChfZW51bXMyLmRlZmF1bHQuY29tcHJlc3Npb24uemlwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVQYWNrZXQuaXNQcmltYXJ5VXNlcklEID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY29uZmlnMi5kZWZhdWx0LmludGVncml0eV9wcm90ZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVBhY2tldC5mZWF0dXJlcyA9IFswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlUGFja2V0LmZlYXR1cmVzWzBdIHw9IF9lbnVtczIuZGVmYXVsdC5mZWF0dXJlcy5tb2RpZmljYXRpb25fZGV0ZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jb25maWcyLmRlZmF1bHQuYWVhZF9wcm90ZWN0ICYmIF9jb25maWcyLmRlZmF1bHQuYWVhZF9wcm90ZWN0X3ZlcnNpb24gPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlUGFja2V0LmZlYXR1cmVzIHx8IChzaWduYXR1cmVQYWNrZXQuZmVhdHVyZXMgPSBbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVQYWNrZXQuZmVhdHVyZXNbMF0gfD0gX2VudW1zMi5kZWZhdWx0LmZlYXR1cmVzLmFlYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVBhY2tldC5mZWF0dXJlc1swXSB8PSBfZW51bXMyLmRlZmF1bHQuZmVhdHVyZXMudjVfa2V5cztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmtleUV4cGlyYXRpb25UaW1lID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVQYWNrZXQua2V5RXhwaXJhdGlvblRpbWUgPSBvcHRpb25zLmtleUV4cGlyYXRpb25UaW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVQYWNrZXQua2V5TmV2ZXJFeHBpcmVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQ4Lm5leHQgPSAzMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWduYXR1cmVQYWNrZXQuc2lnbihzZWNyZXRLZXlQYWNrZXQsIGRhdGFUb1NpZ24pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQ4LmFicnVwdCgncmV0dXJuJywgeyB1c2VySWRQYWNrZXQ6IHVzZXJJZFBhY2tldCwgc2lnbmF0dXJlUGFja2V0OiBzaWduYXR1cmVQYWNrZXQgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0OC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNDgsIHRoaXMpO1xuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDk1LCBfeDk2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWY1NS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSgpKSkudGhlbihmdW5jdGlvbiAobGlzdCkge1xuICAgICAgICAgICAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKF9yZWY1Nikge1xuICAgICAgICAgICAgICAgIHZhciB1c2VySWRQYWNrZXQgPSBfcmVmNTYudXNlcklkUGFja2V0LFxuICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVQYWNrZXQgPSBfcmVmNTYuc2lnbmF0dXJlUGFja2V0O1xuXG4gICAgICAgICAgICAgICAgcGFja2V0bGlzdC5wdXNoKHVzZXJJZFBhY2tldCk7XG4gICAgICAgICAgICAgICAgcGFja2V0bGlzdC5wdXNoKHNpZ25hdHVyZVBhY2tldCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICBfY29udGV4dDUxLm5leHQgPSAxMTtcbiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwoc2VjcmV0U3Via2V5UGFja2V0cy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX3JlZjU3ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0OShzZWNyZXRTdWJrZXlQYWNrZXQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1YmtleU9wdGlvbnMsIGRhdGFUb1NpZ24sIHN1YmtleVNpZ25hdHVyZVBhY2tldDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTQ5JChfY29udGV4dDQ5KSB7XG4gICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NDkucHJldiA9IF9jb250ZXh0NDkubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YmtleU9wdGlvbnMgPSBvcHRpb25zLnN1YmtleXNbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVRvU2lnbiA9IHt9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhVG9TaWduLmtleSA9IHNlY3JldEtleVBhY2tldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUb1NpZ24uYmluZCA9IHNlY3JldFN1YmtleVBhY2tldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YmtleVNpZ25hdHVyZVBhY2tldCA9IG5ldyBfcGFja2V0Mi5kZWZhdWx0LlNpZ25hdHVyZShzdWJrZXlPcHRpb25zLmRhdGUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJrZXlTaWduYXR1cmVQYWNrZXQuc2lnbmF0dXJlVHlwZSA9IF9lbnVtczIuZGVmYXVsdC5zaWduYXR1cmUuc3Via2V5X2JpbmRpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJrZXlTaWduYXR1cmVQYWNrZXQucHVibGljS2V5QWxnb3JpdGhtID0gc2VjcmV0S2V5UGFja2V0LmFsZ29yaXRobTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NDkubmV4dCA9IDk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJlZmVycmVkSGFzaEFsZ28obnVsbCwgc2VjcmV0U3Via2V5UGFja2V0KTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YmtleVNpZ25hdHVyZVBhY2tldC5oYXNoQWxnb3JpdGhtID0gX2NvbnRleHQ0OS5zZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJrZXlTaWduYXR1cmVQYWNrZXQua2V5RmxhZ3MgPSBzdWJrZXlPcHRpb25zLnNpZ24gPyBfZW51bXMyLmRlZmF1bHQua2V5RmxhZ3Muc2lnbl9kYXRhIDogW19lbnVtczIuZGVmYXVsdC5rZXlGbGFncy5lbmNyeXB0X2NvbW11bmljYXRpb24gfCBfZW51bXMyLmRlZmF1bHQua2V5RmxhZ3MuZW5jcnlwdF9zdG9yYWdlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJrZXlPcHRpb25zLmtleUV4cGlyYXRpb25UaW1lID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJrZXlTaWduYXR1cmVQYWNrZXQua2V5RXhwaXJhdGlvblRpbWUgPSBzdWJrZXlPcHRpb25zLmtleUV4cGlyYXRpb25UaW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJrZXlTaWduYXR1cmVQYWNrZXQua2V5TmV2ZXJFeHBpcmVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQ5Lm5leHQgPSAxNDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJrZXlTaWduYXR1cmVQYWNrZXQuc2lnbihzZWNyZXRLZXlQYWNrZXQsIGRhdGFUb1NpZ24pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQ5LmFicnVwdCgncmV0dXJuJywgeyBzZWNyZXRTdWJrZXlQYWNrZXQ6IHNlY3JldFN1YmtleVBhY2tldCwgc3Via2V5U2lnbmF0dXJlUGFja2V0OiBzdWJrZXlTaWduYXR1cmVQYWNrZXQgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0OS5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNDksIHRoaXMpO1xuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDk3LCBfeDk4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWY1Ny5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSgpKSkudGhlbihmdW5jdGlvbiAocGFja2V0cykge1xuICAgICAgICAgICAgICBwYWNrZXRzLmZvckVhY2goZnVuY3Rpb24gKF9yZWY1OCkge1xuICAgICAgICAgICAgICAgIHZhciBzZWNyZXRTdWJrZXlQYWNrZXQgPSBfcmVmNTguc2VjcmV0U3Via2V5UGFja2V0LFxuICAgICAgICAgICAgICAgICAgICBzdWJrZXlTaWduYXR1cmVQYWNrZXQgPSBfcmVmNTguc3Via2V5U2lnbmF0dXJlUGFja2V0O1xuXG4gICAgICAgICAgICAgICAgcGFja2V0bGlzdC5wdXNoKHNlY3JldFN1YmtleVBhY2tldCk7XG4gICAgICAgICAgICAgICAgcGFja2V0bGlzdC5wdXNoKHN1YmtleVNpZ25hdHVyZVBhY2tldCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIDExOlxuXG4gICAgICAgICAgICAvLyBBZGQgcmV2b2NhdGlvbiBzaWduYXR1cmUgcGFja2V0IGZvciBjcmVhdGluZyBhIHJldm9jYXRpb24gY2VydGlmaWNhdGUuXG4gICAgICAgICAgICAvLyBUaGlzIHBhY2tldCBzaG91bGQgYmUgcmVtb3ZlZCBiZWZvcmUgcmV0dXJuaW5nIHRoZSBrZXkuXG4gICAgICAgICAgICBkYXRhVG9TaWduID0geyBrZXk6IHNlY3JldEtleVBhY2tldCB9O1xuICAgICAgICAgICAgX2NvbnRleHQ1MS50MCA9IHBhY2tldGxpc3Q7XG4gICAgICAgICAgICBfY29udGV4dDUxLm5leHQgPSAxNTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVTaWduYXR1cmVQYWNrZXQoZGF0YVRvU2lnbiwgbnVsbCwgc2VjcmV0S2V5UGFja2V0LCB7XG4gICAgICAgICAgICAgIHNpZ25hdHVyZVR5cGU6IF9lbnVtczIuZGVmYXVsdC5zaWduYXR1cmUua2V5X3Jldm9jYXRpb24sXG4gICAgICAgICAgICAgIHJlYXNvbkZvclJldm9jYXRpb25GbGFnOiBfZW51bXMyLmRlZmF1bHQucmVhc29uRm9yUmV2b2NhdGlvbi5ub19yZWFzb24sXG4gICAgICAgICAgICAgIHJlYXNvbkZvclJldm9jYXRpb25TdHJpbmc6ICcnXG4gICAgICAgICAgICB9LCBvcHRpb25zLmRhdGUpO1xuXG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIF9jb250ZXh0NTEudDEgPSBfY29udGV4dDUxLnNlbnQ7XG5cbiAgICAgICAgICAgIF9jb250ZXh0NTEudDAucHVzaC5jYWxsKF9jb250ZXh0NTEudDAsIF9jb250ZXh0NTEudDEpO1xuXG4gICAgICAgICAgICAvLyBzZXQgcGFzc3BocmFzZSBwcm90ZWN0aW9uXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5wYXNzcGhyYXNlKSB7XG4gICAgICAgICAgICAgIHNlY3JldEtleVBhY2tldC5jbGVhclByaXZhdGVQYXJhbXMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQ1MS5uZXh0ID0gMjA7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQuYWxsKHNlY3JldFN1YmtleVBhY2tldHMubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIF9yZWY1OSA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlNTAoc2VjcmV0U3Via2V5UGFja2V0LCBpbmRleCkge1xuICAgICAgICAgICAgICAgIHZhciBzdWJrZXlQYXNzcGhyYXNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNTAkKF9jb250ZXh0NTApIHtcbiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ1MC5wcmV2ID0gX2NvbnRleHQ1MC5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Via2V5UGFzc3BocmFzZSA9IG9wdGlvbnMuc3Via2V5c1tpbmRleF0ucGFzc3BocmFzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmtleVBhc3NwaHJhc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjcmV0U3Via2V5UGFja2V0LmNsZWFyUHJpdmF0ZVBhcmFtcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1MC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNTAsIHRoaXMpO1xuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDk5LCBfeDEwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNTkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0oKSkpO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUxLmFicnVwdCgncmV0dXJuJywgbmV3IEtleShwYWNrZXRsaXN0KSk7XG5cbiAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1MS5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlNTEsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXBLZXlPYmplY3QoX3g5MCwgX3g5MSwgX3g5Mikge1xuICAgIHJldHVybiBfcmVmNTMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBjZXJ0aWZpY2F0ZSBvciBiaW5kaW5nIHNpZ25hdHVyZSBpcyByZXZva2VkXG4gKiBAcGFyYW0gIHttb2R1bGU6cGFja2V0LlNlY3JldEtleXxcbiAqICAgICAgICAgIG1vZHVsZTpwYWNrZXQuUHVibGljS2V5fSAgICAgICBwcmltYXJ5S2V5ICAgVGhlIHByaW1hcnkga2V5IHBhY2tldFxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVG9WZXJpZnkgVGhlIGRhdGEgdG8gY2hlY2tcbiAqIEBwYXJhbSAge0FycmF5PG1vZHVsZTpwYWNrZXQuU2lnbmF0dXJlPn0gcmV2b2NhdGlvbnMgIFRoZSByZXZvY2F0aW9uIHNpZ25hdHVyZXMgdG8gY2hlY2tcbiAqIEBwYXJhbSAge21vZHVsZTpwYWNrZXQuU2lnbmF0dXJlfSAgICAgICAgc2lnbmF0dXJlICAgIFRoZSBjZXJ0aWZpY2F0ZSBvciBzaWduYXR1cmUgdG8gY2hlY2tcbiAqIEBwYXJhbSAge21vZHVsZTpwYWNrZXQuUHVibGljU3Via2V5fFxuICogICAgICAgICAgbW9kdWxlOnBhY2tldC5TZWNyZXRTdWJrZXl8XG4gKiAgICAgICAgICBtb2R1bGU6cGFja2V0LlB1YmxpY0tleXxcbiAqICAgICAgICAgIG1vZHVsZTpwYWNrZXQuU2VjcmV0S2V5fSBrZXksIG9wdGlvbmFsIFRoZSBrZXkgcGFja2V0IHRvIGNoZWNrIHRoZSBzaWduYXR1cmVcbiAqIEBwYXJhbSAge0RhdGV9ICAgICAgICAgICAgICAgICAgICAgZGF0ZSAgICAgICAgICBVc2UgdGhlIGdpdmVuIGRhdGUgaW5zdGVhZCBvZiB0aGUgY3VycmVudCB0aW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gICAgICAgICAgICAgICAgICAgICAgVHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIHJldm9rZXMgdGhlIGRhdGFcbiAqIEBhc3luY1xuICovXG5cblxudmFyIGlzRGF0YVJldm9rZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmNjAgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTUzKHByaW1hcnlLZXksIGRhdGFUb1ZlcmlmeSwgcmV2b2NhdGlvbnMsIHNpZ25hdHVyZSwga2V5KSB7XG4gICAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IG5ldyBEYXRlKCk7XG4gICAgdmFyIG5vcm1EYXRlLCByZXZvY2F0aW9uS2V5SWRzO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNTMkKF9jb250ZXh0NTMpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQ1My5wcmV2ID0gX2NvbnRleHQ1My5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAga2V5ID0ga2V5IHx8IHByaW1hcnlLZXk7XG4gICAgICAgICAgICBub3JtRGF0ZSA9IF91dGlsMi5kZWZhdWx0Lm5vcm1hbGl6ZURhdGUoZGF0ZSk7XG4gICAgICAgICAgICByZXZvY2F0aW9uS2V5SWRzID0gW107XG4gICAgICAgICAgICBfY29udGV4dDUzLm5leHQgPSA1O1xuICAgICAgICAgICAgcmV0dXJuIF9wcm9taXNlMi5kZWZhdWx0LmFsbChyZXZvY2F0aW9ucy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX3JlZjYxID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1MihyZXZvY2F0aW9uU2lnbmF0dXJlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1MiQoX2NvbnRleHQ1Mikge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDUyLnByZXYgPSBfY29udGV4dDUyLm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDUyLnQwID0gIShfY29uZmlnMi5kZWZhdWx0LnJldm9jYXRpb25zX2V4cGlyZSAmJiByZXZvY2F0aW9uU2lnbmF0dXJlLmlzRXhwaXJlZChub3JtRGF0ZSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9jb250ZXh0NTIudDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1Mi5uZXh0ID0gODtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NTIudDEgPSByZXZvY2F0aW9uU2lnbmF0dXJlLnZlcmlmaWVkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2NvbnRleHQ1Mi50MSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDUyLm5leHQgPSA3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1Mi5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXZvY2F0aW9uU2lnbmF0dXJlLnZlcmlmeShrZXksIGRhdGFUb1ZlcmlmeSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDUyLnQxID0gX2NvbnRleHQ1Mi5zZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1Mi50MCA9IF9jb250ZXh0NTIudDE7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9jb250ZXh0NTIudDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1Mi5uZXh0ID0gMTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGdldCBhbiBpZGVudGlmaWVyIG9mIHRoZSByZXZva2VkIG9iamVjdCBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgICAgICAgICByZXZvY2F0aW9uS2V5SWRzLnB1c2gocmV2b2NhdGlvblNpZ25hdHVyZS5pc3N1ZXJLZXlJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1Mi5hYnJ1cHQoJ3JldHVybicsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUyLmFicnVwdCgncmV0dXJuJywgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NTIuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgX2NhbGxlZTUyLCB0aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gxMDcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjYxLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KCkpKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGlmICghc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0NTMubmV4dCA9IDg7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaWduYXR1cmUucmV2b2tlZCA9IHJldm9jYXRpb25LZXlJZHMuc29tZShmdW5jdGlvbiAoa2V5SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGtleUlkLmVxdWFscyhzaWduYXR1cmUuaXNzdWVyS2V5SWQpO1xuICAgICAgICAgICAgfSkgPyB0cnVlIDogc2lnbmF0dXJlLnJldm9rZWQ7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1My5hYnJ1cHQoJ3JldHVybicsIHNpZ25hdHVyZS5yZXZva2VkKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUzLmFicnVwdCgncmV0dXJuJywgcmV2b2NhdGlvbktleUlkcy5sZW5ndGggPiAwKTtcblxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NTMuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTUzLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBpc0RhdGFSZXZva2VkKF94MTAxLCBfeDEwMiwgX3gxMDMsIF94MTA0LCBfeDEwNSkge1xuICAgIHJldHVybiBfcmVmNjAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgc2lnbmF0dXJlIGhhc2ggYWxnb3JpdGhtIG9mIGEga2V5XG4gKiBAcGFyYW0gIHttb2R1bGU6a2V5LktleX0ga2V5IChvcHRpb25hbCkgdGhlIGtleSB0byBnZXQgcHJlZmVyZW5jZXMgZnJvbVxuICogQHBhcmFtICB7bW9kdWxlOnBhY2tldC5TZWNyZXRLZXl8bW9kdWxlOnBhY2tldC5TZWNyZXRTdWJrZXl9IGtleVBhY2tldCBrZXkgcGFja2V0IHVzZWQgZm9yIHNpZ25pbmdcbiAqIEBwYXJhbSAge0RhdGV9IGRhdGUgKG9wdGlvbmFsKSB1c2UgdGhlIGdpdmVuIGRhdGUgZm9yIHZlcmlmaWNhdGlvbiBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHRpbWVcbiAqIEBwYXJhbSAge09iamVjdH0gdXNlcklkIChvcHRpb25hbCkgdXNlciBJRFxuICogQHJldHVybnMge1Byb21pc2U8U3RyaW5nPn1cbiAqIEBhc3luY1xuICovXG52YXIgZ2V0UHJlZmVycmVkSGFzaEFsZ28gPSBleHBvcnRzLmdldFByZWZlcnJlZEhhc2hBbGdvID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjYyID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1NChrZXksIGtleVBhY2tldCkge1xuICAgIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBuZXcgRGF0ZSgpO1xuICAgIHZhciB1c2VySWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuXG4gICAgdmFyIGhhc2hfYWxnbywgcHJlZl9hbGdvLCBwcmltYXJ5VXNlciwgX3ByaW1hcnlVc2VyJHNlbGZDZXJ0O1xuXG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1NCQoX2NvbnRleHQ1NCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDU0LnByZXYgPSBfY29udGV4dDU0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBoYXNoX2FsZ28gPSBfY29uZmlnMi5kZWZhdWx0LnByZWZlcl9oYXNoX2FsZ29yaXRobTtcbiAgICAgICAgICAgIHByZWZfYWxnbyA9IGhhc2hfYWxnbztcblxuICAgICAgICAgICAgaWYgKCEoa2V5IGluc3RhbmNlb2YgS2V5KSkge1xuICAgICAgICAgICAgICBfY29udGV4dDU0Lm5leHQgPSA3O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQ1NC5uZXh0ID0gNTtcbiAgICAgICAgICAgIHJldHVybiBrZXkuZ2V0UHJpbWFyeVVzZXIoZGF0ZSwgdXNlcklkKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHByaW1hcnlVc2VyID0gX2NvbnRleHQ1NC5zZW50O1xuXG4gICAgICAgICAgICBpZiAocHJpbWFyeVVzZXIgJiYgcHJpbWFyeVVzZXIuc2VsZkNlcnRpZmljYXRpb24ucHJlZmVycmVkSGFzaEFsZ29yaXRobXMpIHtcbiAgICAgICAgICAgICAgX3ByaW1hcnlVc2VyJHNlbGZDZXJ0ID0gKDAsIF9zbGljZWRUb0FycmF5My5kZWZhdWx0KShwcmltYXJ5VXNlci5zZWxmQ2VydGlmaWNhdGlvbi5wcmVmZXJyZWRIYXNoQWxnb3JpdGhtcywgMSk7XG4gICAgICAgICAgICAgIHByZWZfYWxnbyA9IF9wcmltYXJ5VXNlciRzZWxmQ2VydFswXTtcblxuICAgICAgICAgICAgICBoYXNoX2FsZ28gPSBfY3J5cHRvMi5kZWZhdWx0Lmhhc2guZ2V0SGFzaEJ5dGVMZW5ndGgoaGFzaF9hbGdvKSA8PSBfY3J5cHRvMi5kZWZhdWx0Lmhhc2guZ2V0SGFzaEJ5dGVMZW5ndGgocHJlZl9hbGdvKSA/IHByZWZfYWxnbyA6IGhhc2hfYWxnbztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIHN3aXRjaCAoKDAsIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoa2V5UGFja2V0KSkge1xuICAgICAgICAgICAgICBjYXNlIF9wYWNrZXQyLmRlZmF1bHQuU2VjcmV0S2V5LnByb3RvdHlwZTpcbiAgICAgICAgICAgICAgY2FzZSBfcGFja2V0Mi5kZWZhdWx0LlB1YmxpY0tleS5wcm90b3R5cGU6XG4gICAgICAgICAgICAgIGNhc2UgX3BhY2tldDIuZGVmYXVsdC5TZWNyZXRTdWJrZXkucHJvdG90eXBlOlxuICAgICAgICAgICAgICBjYXNlIF9wYWNrZXQyLmRlZmF1bHQuUHVibGljU3Via2V5LnByb3RvdHlwZTpcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleVBhY2tldC5hbGdvcml0aG0pIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ2VjZGgnOlxuICAgICAgICAgICAgICAgICAgY2FzZSAnZWNkc2EnOlxuICAgICAgICAgICAgICAgICAgY2FzZSAnZWRkc2EnOlxuICAgICAgICAgICAgICAgICAgICBwcmVmX2FsZ28gPSBfY3J5cHRvMi5kZWZhdWx0LnB1YmxpY0tleS5lbGxpcHRpYy5nZXRQcmVmZXJyZWRIYXNoQWxnbyhrZXlQYWNrZXQucGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1NC5hYnJ1cHQoJ3JldHVybicsIF9jcnlwdG8yLmRlZmF1bHQuaGFzaC5nZXRIYXNoQnl0ZUxlbmd0aChoYXNoX2FsZ28pIDw9IF9jcnlwdG8yLmRlZmF1bHQuaGFzaC5nZXRIYXNoQnl0ZUxlbmd0aChwcmVmX2FsZ28pID8gcHJlZl9hbGdvIDogaGFzaF9hbGdvKTtcblxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NTQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTU0LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcmVmZXJyZWRIYXNoQWxnbyhfeDEwOSwgX3gxMTApIHtcbiAgICByZXR1cm4gX3JlZjYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJlZmVycmVkIHN5bW1ldHJpYy9hZWFkIGFsZ29yaXRobSBmb3IgYSBzZXQgb2Yga2V5c1xuICogQHBhcmFtICB7c3ltbWV0cmljfGFlYWR9IHR5cGUgVHlwZSBvZiBwcmVmZXJlbmNlIHRvIHJldHVyblxuICogQHBhcmFtICB7QXJyYXk8bW9kdWxlOmtleS5LZXk+fSBrZXlzIFNldCBvZiBrZXlzXG4gKiBAcGFyYW0gIHtEYXRlfSBkYXRlIChvcHRpb25hbCkgdXNlIHRoZSBnaXZlbiBkYXRlIGZvciB2ZXJpZmljYXRpb24gaW5zdGVhZCBvZiB0aGUgY3VycmVudCB0aW1lXG4gKiBAcGFyYW0gIHtPYmplY3R9IHVzZXJJZCAob3B0aW9uYWwpIHVzZXIgSURcbiAqIEByZXR1cm5zIHtQcm9taXNlPG1vZHVsZTplbnVtcy5zeW1tZXRyaWM+fSAgIFByZWZlcnJlZCBzeW1tZXRyaWMgYWxnb3JpdGhtXG4gKiBAYXN5bmNcbiAqL1xuXG5cbnZhciBnZXRQcmVmZXJyZWRBbGdvID0gZXhwb3J0cy5nZXRQcmVmZXJyZWRBbGdvID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjYzID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1Nih0eXBlLCBrZXlzKSB7XG4gICAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG5ldyBEYXRlKCk7XG4gICAgdmFyIHVzZXJJZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gICAgdmFyIHByZWZQcm9wZXJ0eSwgZGVmYXVsdEFsZ28sIHByaW9NYXAsIHByZWZBbGdvO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNTYkKF9jb250ZXh0NTYpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQ1Ni5wcmV2ID0gX2NvbnRleHQ1Ni5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcHJlZlByb3BlcnR5ID0gdHlwZSA9PT0gJ3N5bW1ldHJpYycgPyAncHJlZmVycmVkU3ltbWV0cmljQWxnb3JpdGhtcycgOiAncHJlZmVycmVkQWVhZEFsZ29yaXRobXMnO1xuICAgICAgICAgICAgZGVmYXVsdEFsZ28gPSB0eXBlID09PSAnc3ltbWV0cmljJyA/IF9jb25maWcyLmRlZmF1bHQuZW5jcnlwdGlvbl9jaXBoZXIgOiBfY29uZmlnMi5kZWZhdWx0LmFlYWRfbW9kZTtcbiAgICAgICAgICAgIHByaW9NYXAgPSB7fTtcbiAgICAgICAgICAgIF9jb250ZXh0NTYubmV4dCA9IDU7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQuYWxsKGtleXMubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIF9yZWY2NCA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlNTUoa2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHByaW1hcnlVc2VyO1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNTUkKF9jb250ZXh0NTUpIHtcbiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ1NS5wcmV2ID0gX2NvbnRleHQ1NS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1NS5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkuZ2V0UHJpbWFyeVVzZXIoZGF0ZSwgdXNlcklkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlVc2VyID0gX2NvbnRleHQ1NS5zZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISghcHJpbWFyeVVzZXIgfHwgIXByaW1hcnlVc2VyLnNlbGZDZXJ0aWZpY2F0aW9uW3ByZWZQcm9wZXJ0eV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NTUubmV4dCA9IDU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1NS5hYnJ1cHQoJ3JldHVybicsIGRlZmF1bHRBbGdvKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlVc2VyLnNlbGZDZXJ0aWZpY2F0aW9uW3ByZWZQcm9wZXJ0eV0uZm9yRWFjaChmdW5jdGlvbiAoYWxnbywgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gcHJpb01hcFthbGdvXSB8fCAocHJpb01hcFthbGdvXSA9IHsgcHJpbzogMCwgY291bnQ6IDAsIGFsZ286IGFsZ28gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnByaW8gKz0gNjQgPj4gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NTUuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgX2NhbGxlZTU1LCB0aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gxMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjY0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KCkpKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHByZWZBbGdvID0geyBwcmlvOiAwLCBhbGdvOiBkZWZhdWx0QWxnbyB9O1xuXG4gICAgICAgICAgICAoMCwgX3ZhbHVlczIuZGVmYXVsdCkocHJpb01hcCkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjY1KSB7XG4gICAgICAgICAgICAgIHZhciBwcmlvID0gX3JlZjY1LnByaW8sXG4gICAgICAgICAgICAgICAgICBjb3VudCA9IF9yZWY2NS5jb3VudCxcbiAgICAgICAgICAgICAgICAgIGFsZ28gPSBfcmVmNjUuYWxnbztcblxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChhbGdvICE9PSBfZW51bXMyLmRlZmF1bHRbdHlwZV0ucGxhaW50ZXh0ICYmIGFsZ28gIT09IF9lbnVtczIuZGVmYXVsdFt0eXBlXS5pZGVhICYmIC8vIG5vdCBpbXBsZW1lbnRlZFxuICAgICAgICAgICAgICAgIF9lbnVtczIuZGVmYXVsdC5yZWFkKF9lbnVtczIuZGVmYXVsdFt0eXBlXSwgYWxnbykgJiYgLy8ga25vd24gYWxnb3JpdGhtXG4gICAgICAgICAgICAgICAgY291bnQgPT09IGtleXMubGVuZ3RoICYmIC8vIGF2YWlsYWJsZSBmb3IgYWxsIGtleXNcbiAgICAgICAgICAgICAgICBwcmlvID4gcHJlZkFsZ28ucHJpbykge1xuICAgICAgICAgICAgICAgICAgcHJlZkFsZ28gPSBwcmlvTWFwW2FsZ29dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NTYuYWJydXB0KCdyZXR1cm4nLCBwcmVmQWxnby5hbGdvKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NTYuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTU2LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcmVmZXJyZWRBbGdvKF94MTEzLCBfeDExNCkge1xuICAgIHJldHVybiBfcmVmNjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgYWVhZCBpcyBzdXBwb3J0ZWQgYnkgYWxsIGtleXMgaW4gdGhlIHNldFxuICogQHBhcmFtICB7QXJyYXk8bW9kdWxlOmtleS5LZXk+fSBrZXlzIFNldCBvZiBrZXlzXG4gKiBAcGFyYW0gIHtEYXRlfSBkYXRlIChvcHRpb25hbCkgdXNlIHRoZSBnaXZlbiBkYXRlIGZvciB2ZXJpZmljYXRpb24gaW5zdGVhZCBvZiB0aGUgY3VycmVudCB0aW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn1cbiAqIEBhc3luY1xuICovXG5cblxudmFyIGlzQWVhZFN1cHBvcnRlZCA9IGV4cG9ydHMuaXNBZWFkU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjY2ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1OChrZXlzKSB7XG4gICAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG5ldyBEYXRlKCk7XG4gICAgdmFyIHVzZXJJZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgdmFyIHN1cHBvcnRlZDtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTU4JChfY29udGV4dDU4KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NTgucHJldiA9IF9jb250ZXh0NTgubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBUT0RPIHJlcGxhY2Ugd2hlbiBQcm9taXNlLnNvbWUgb3IgUHJvbWlzZS5hbnkgYXJlIGltcGxlbWVudGVkXG5cbiAgICAgICAgICAgIF9jb250ZXh0NTgubmV4dCA9IDM7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQuYWxsKGtleXMubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIF9yZWY2NyA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlNTcoa2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHByaW1hcnlVc2VyO1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNTckKF9jb250ZXh0NTcpIHtcbiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ1Ny5wcmV2ID0gX2NvbnRleHQ1Ny5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1Ny5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkuZ2V0UHJpbWFyeVVzZXIoZGF0ZSwgdXNlcklkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlVc2VyID0gX2NvbnRleHQ1Ny5zZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByaW1hcnlVc2VyIHx8ICFwcmltYXJ5VXNlci5zZWxmQ2VydGlmaWNhdGlvbi5mZWF0dXJlcyB8fCAhKHByaW1hcnlVc2VyLnNlbGZDZXJ0aWZpY2F0aW9uLmZlYXR1cmVzWzBdICYgX2VudW1zMi5kZWZhdWx0LmZlYXR1cmVzLmFlYWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1Ny5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNTcsIHRoaXMpO1xuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDEyMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNjcuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0oKSkpO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NTguYWJydXB0KCdyZXR1cm4nLCBzdXBwb3J0ZWQpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1OC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlNTgsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGlzQWVhZFN1cHBvcnRlZChfeDExOCkge1xuICAgIHJldHVybiBfcmVmNjYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuZXhwb3J0cy5LZXkgPSBLZXk7XG5leHBvcnRzLnJlYWQgPSByZWFkO1xuZXhwb3J0cy5yZWFkQXJtb3JlZCA9IHJlYWRBcm1vcmVkO1xuXG52YXIgX2FybW9yID0gX2RlcmVxXygnLi9lbmNvZGluZy9hcm1vcicpO1xuXG52YXIgX2FybW9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FybW9yKTtcblxudmFyIF9jcnlwdG8gPSBfZGVyZXFfKCcuL2NyeXB0bycpO1xuXG52YXIgX2NyeXB0bzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcnlwdG8pO1xuXG52YXIgX3BhY2tldCA9IF9kZXJlcV8oJy4vcGFja2V0Jyk7XG5cbnZhciBfcGFja2V0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BhY2tldCk7XG5cbnZhciBfY29uZmlnID0gX2RlcmVxXygnLi9jb25maWcnKTtcblxudmFyIF9jb25maWcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29uZmlnKTtcblxudmFyIF9lbnVtcyA9IF9kZXJlcV8oJy4vZW51bXMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4vdXRpbCcpO1xuXG52YXIgX3V0aWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjIENsYXNzIHRoYXQgcmVwcmVzZW50cyBhbiBPcGVuUEdQIGtleS4gTXVzdCBjb250YWluIGEgcHJpbWFyeSBrZXkuXG4gKiBDYW4gY29udGFpbiBhZGRpdGlvbmFsIHN1YmtleXMsIHNpZ25hdHVyZXMsIHVzZXIgaWRzLCB1c2VyIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0gIHttb2R1bGU6cGFja2V0Lkxpc3R9IHBhY2tldGxpc3QgVGhlIHBhY2tldHMgdGhhdCBmb3JtIHRoaXMga2V5XG4gKi9cbi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQHJlcXVpcmVzIGVuY29kaW5nL2FybW9yXG4gKiBAcmVxdWlyZXMgY3J5cHRvXG4gKiBAcmVxdWlyZXMgcGFja2V0XG4gKiBAcmVxdWlyZXMgY29uZmlnXG4gKiBAcmVxdWlyZXMgZW51bXNcbiAqIEByZXF1aXJlcyB1dGlsXG4gKiBAbW9kdWxlIGtleVxuICovXG5cbmZ1bmN0aW9uIEtleShwYWNrZXRsaXN0KSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBLZXkpKSB7XG4gICAgcmV0dXJuIG5ldyBLZXkocGFja2V0bGlzdCk7XG4gIH1cbiAgLy8gc2FtZSBkYXRhIGFzIGluIHBhY2tldGxpc3QgYnV0IGluIHN0cnVjdHVyZWQgZm9ybVxuICB0aGlzLnByaW1hcnlLZXkgPSBudWxsO1xuICB0aGlzLnJldm9jYXRpb25TaWduYXR1cmVzID0gW107XG4gIHRoaXMuZGlyZWN0U2lnbmF0dXJlcyA9IFtdO1xuICB0aGlzLnVzZXJzID0gW107XG4gIHRoaXMuc3ViS2V5cyA9IFtdO1xuICB0aGlzLnBhY2tldGxpc3Qyc3RydWN0dXJlKHBhY2tldGxpc3QpO1xuICBpZiAoIXRoaXMucHJpbWFyeUtleSB8fCAhdGhpcy51c2Vycy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5OiBuZWVkIGF0IGxlYXN0IGtleSBhbmQgdXNlciBJRCBwYWNrZXQnKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgcGFja2V0bGlzdCB0byBzdHJ1Y3R1cmVkIGtleSBkYXRhXG4gKiBAcGFyYW0gIHttb2R1bGU6cGFja2V0Lkxpc3R9IHBhY2tldGxpc3QgVGhlIHBhY2tldHMgdGhhdCBmb3JtIGEga2V5XG4gKi9cbktleS5wcm90b3R5cGUucGFja2V0bGlzdDJzdHJ1Y3R1cmUgPSBmdW5jdGlvbiAocGFja2V0bGlzdCkge1xuICB2YXIgdXNlciA9IHZvaWQgMDtcbiAgdmFyIHByaW1hcnlLZXlJZCA9IHZvaWQgMDtcbiAgdmFyIHN1YktleSA9IHZvaWQgMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWNrZXRsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgc3dpdGNoIChwYWNrZXRsaXN0W2ldLnRhZykge1xuICAgICAgY2FzZSBfZW51bXMyLmRlZmF1bHQucGFja2V0LnB1YmxpY0tleTpcbiAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnBhY2tldC5zZWNyZXRLZXk6XG4gICAgICAgIHRoaXMucHJpbWFyeUtleSA9IHBhY2tldGxpc3RbaV07XG4gICAgICAgIHByaW1hcnlLZXlJZCA9IHRoaXMucHJpbWFyeUtleS5nZXRLZXlJZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnBhY2tldC51c2VyaWQ6XG4gICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5wYWNrZXQudXNlckF0dHJpYnV0ZTpcbiAgICAgICAgdXNlciA9IG5ldyBVc2VyKHBhY2tldGxpc3RbaV0pO1xuICAgICAgICB0aGlzLnVzZXJzLnB1c2godXNlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBfZW51bXMyLmRlZmF1bHQucGFja2V0LnB1YmxpY1N1YmtleTpcbiAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnBhY2tldC5zZWNyZXRTdWJrZXk6XG4gICAgICAgIHVzZXIgPSBudWxsO1xuICAgICAgICBzdWJLZXkgPSBuZXcgU3ViS2V5KHBhY2tldGxpc3RbaV0pO1xuICAgICAgICB0aGlzLnN1YktleXMucHVzaChzdWJLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnBhY2tldC5zaWduYXR1cmU6XG4gICAgICAgIHN3aXRjaCAocGFja2V0bGlzdFtpXS5zaWduYXR1cmVUeXBlKSB7XG4gICAgICAgICAgY2FzZSBfZW51bXMyLmRlZmF1bHQuc2lnbmF0dXJlLmNlcnRfZ2VuZXJpYzpcbiAgICAgICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5zaWduYXR1cmUuY2VydF9wZXJzb25hOlxuICAgICAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnNpZ25hdHVyZS5jZXJ0X2Nhc3VhbDpcbiAgICAgICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5zaWduYXR1cmUuY2VydF9wb3NpdGl2ZTpcbiAgICAgICAgICAgIGlmICghdXNlcikge1xuICAgICAgICAgICAgICBfdXRpbDIuZGVmYXVsdC5wcmludF9kZWJ1ZygnRHJvcHBpbmcgY2VydGlmaWNhdGlvbiBzaWduYXR1cmVzIHdpdGhvdXQgcHJlY2VkaW5nIHVzZXIgcGFja2V0Jyk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhY2tldGxpc3RbaV0uaXNzdWVyS2V5SWQuZXF1YWxzKHByaW1hcnlLZXlJZCkpIHtcbiAgICAgICAgICAgICAgdXNlci5zZWxmQ2VydGlmaWNhdGlvbnMucHVzaChwYWNrZXRsaXN0W2ldKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVzZXIub3RoZXJDZXJ0aWZpY2F0aW9ucy5wdXNoKHBhY2tldGxpc3RbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBfZW51bXMyLmRlZmF1bHQuc2lnbmF0dXJlLmNlcnRfcmV2b2NhdGlvbjpcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgIHVzZXIucmV2b2NhdGlvblNpZ25hdHVyZXMucHVzaChwYWNrZXRsaXN0W2ldKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZGlyZWN0U2lnbmF0dXJlcy5wdXNoKHBhY2tldGxpc3RbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBfZW51bXMyLmRlZmF1bHQuc2lnbmF0dXJlLmtleTpcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0U2lnbmF0dXJlcy5wdXNoKHBhY2tldGxpc3RbaV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBfZW51bXMyLmRlZmF1bHQuc2lnbmF0dXJlLnN1YmtleV9iaW5kaW5nOlxuICAgICAgICAgICAgaWYgKCFzdWJLZXkpIHtcbiAgICAgICAgICAgICAgX3V0aWwyLmRlZmF1bHQucHJpbnRfZGVidWcoJ0Ryb3BwaW5nIHN1YmtleSBiaW5kaW5nIHNpZ25hdHVyZSB3aXRob3V0IHByZWNlZGluZyBzdWJrZXkgcGFja2V0Jyk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViS2V5LmJpbmRpbmdTaWduYXR1cmVzLnB1c2gocGFja2V0bGlzdFtpXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5zaWduYXR1cmUua2V5X3Jldm9jYXRpb246XG4gICAgICAgICAgICB0aGlzLnJldm9jYXRpb25TaWduYXR1cmVzLnB1c2gocGFja2V0bGlzdFtpXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5zaWduYXR1cmUuc3Via2V5X3Jldm9jYXRpb246XG4gICAgICAgICAgICBpZiAoIXN1YktleSkge1xuICAgICAgICAgICAgICBfdXRpbDIuZGVmYXVsdC5wcmludF9kZWJ1ZygnRHJvcHBpbmcgc3Via2V5IHJldm9jYXRpb24gc2lnbmF0dXJlIHdpdGhvdXQgcHJlY2VkaW5nIHN1YmtleSBwYWNrZXQnKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWJLZXkucmV2b2NhdGlvblNpZ25hdHVyZXMucHVzaChwYWNrZXRsaXN0W2ldKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHN0cnVjdHVyZWQga2V5IGRhdGEgdG8gcGFja2V0bGlzdFxuICogQHJldHVybnMge21vZHVsZTpwYWNrZXQuTGlzdH0gVGhlIHBhY2tldHMgdGhhdCBmb3JtIGEga2V5XG4gKi9cbktleS5wcm90b3R5cGUudG9QYWNrZXRsaXN0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcGFja2V0bGlzdCA9IG5ldyBfcGFja2V0Mi5kZWZhdWx0Lkxpc3QoKTtcbiAgcGFja2V0bGlzdC5wdXNoKHRoaXMucHJpbWFyeUtleSk7XG4gIHBhY2tldGxpc3QuY29uY2F0KHRoaXMucmV2b2NhdGlvblNpZ25hdHVyZXMpO1xuICBwYWNrZXRsaXN0LmNvbmNhdCh0aGlzLmRpcmVjdFNpZ25hdHVyZXMpO1xuICB0aGlzLnVzZXJzLm1hcChmdW5jdGlvbiAodXNlcikge1xuICAgIHJldHVybiBwYWNrZXRsaXN0LmNvbmNhdCh1c2VyLnRvUGFja2V0bGlzdCgpKTtcbiAgfSk7XG4gIHRoaXMuc3ViS2V5cy5tYXAoZnVuY3Rpb24gKHN1YktleSkge1xuICAgIHJldHVybiBwYWNrZXRsaXN0LmNvbmNhdChzdWJLZXkudG9QYWNrZXRsaXN0KCkpO1xuICB9KTtcbiAgcmV0dXJuIHBhY2tldGxpc3Q7XG59O1xuXG4vKipcbiAqIFJldHVybnMgcGFja2V0bGlzdCBjb250YWluaW5nIGFsbCBwdWJsaWMgb3IgcHJpdmF0ZSBzdWJrZXkgcGFja2V0cyBtYXRjaGluZyBrZXlJZDtcbiAqIElmIGtleUlkIGlzIG5vdCBwcmVzZW50LCByZXR1cm5zIGFsbCBzdWJrZXkgcGFja2V0cy5cbiAqIEBwYXJhbSAge3R5cGUva2V5aWR9IGtleUlkXG4gKiBAcmV0dXJucyB7bW9kdWxlOnBhY2tldC5MaXN0fVxuICovXG5LZXkucHJvdG90eXBlLmdldFN1YmtleVBhY2tldHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBrZXlJZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcblxuICB2YXIgcGFja2V0cyA9IG5ldyBfcGFja2V0Mi5kZWZhdWx0Lkxpc3QoKTtcbiAgdGhpcy5zdWJLZXlzLmZvckVhY2goZnVuY3Rpb24gKHN1YktleSkge1xuICAgIGlmICgha2V5SWQgfHwgc3ViS2V5LnN1YktleS5nZXRLZXlJZCgpLmVxdWFscyhrZXlJZCwgdHJ1ZSkpIHtcbiAgICAgIHBhY2tldHMucHVzaChzdWJLZXkuc3ViS2V5KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcGFja2V0cztcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHBhY2tldGxpc3QgY29udGFpbmluZyBhbGwgcHVibGljIG9yIHByaXZhdGUga2V5IHBhY2tldHMgbWF0Y2hpbmcga2V5SWQuXG4gKiBJZiBrZXlJZCBpcyBub3QgcHJlc2VudCwgcmV0dXJucyBhbGwga2V5IHBhY2tldHMgc3RhcnRpbmcgd2l0aCB0aGUgcHJpbWFyeSBrZXkuXG4gKiBAcGFyYW0gIHt0eXBlL2tleWlkfSBrZXlJZFxuICogQHJldHVybnMge21vZHVsZTpwYWNrZXQuTGlzdH1cbiAqL1xuS2V5LnByb3RvdHlwZS5nZXRLZXlQYWNrZXRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIga2V5SWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG5cbiAgdmFyIHBhY2tldHMgPSBuZXcgX3BhY2tldDIuZGVmYXVsdC5MaXN0KCk7XG4gIGlmICgha2V5SWQgfHwgdGhpcy5wcmltYXJ5S2V5LmdldEtleUlkKCkuZXF1YWxzKGtleUlkLCB0cnVlKSkge1xuICAgIHBhY2tldHMucHVzaCh0aGlzLnByaW1hcnlLZXkpO1xuICB9XG4gIHBhY2tldHMuY29uY2F0KHRoaXMuZ2V0U3Via2V5UGFja2V0cyhrZXlJZCkpO1xuICByZXR1cm4gcGFja2V0cztcbn07XG5cbi8qKlxuICogUmV0dXJucyBrZXkgSURzIG9mIGFsbCBrZXkgcGFja2V0c1xuICogQHJldHVybnMge0FycmF5PG1vZHVsZTp0eXBlL2tleWlkPn1cbiAqL1xuS2V5LnByb3RvdHlwZS5nZXRLZXlJZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdldEtleVBhY2tldHMoKS5tYXAoZnVuY3Rpb24gKGtleVBhY2tldCkge1xuICAgIHJldHVybiBrZXlQYWNrZXQuZ2V0S2V5SWQoKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdXNlcmlkc1xuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IGFycmF5IG9mIHVzZXJpZHNcbiAqL1xuS2V5LnByb3RvdHlwZS5nZXRVc2VySWRzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy51c2Vycy5tYXAoZnVuY3Rpb24gKHVzZXIpIHtcbiAgICByZXR1cm4gdXNlci51c2VySWQgPyBfdXRpbDIuZGVmYXVsdC5lbmNvZGVfdXRmOCh1c2VyLnVzZXJJZC51c2VyaWQpIDogbnVsbDtcbiAgfSkuZmlsdGVyKGZ1bmN0aW9uICh1c2VyaWQpIHtcbiAgICByZXR1cm4gdXNlcmlkICE9PSBudWxsO1xuICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBwdWJsaWMga2V5XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuS2V5LnByb3RvdHlwZS5pc1B1YmxpYyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucHJpbWFyeUtleS50YWcgPT09IF9lbnVtczIuZGVmYXVsdC5wYWNrZXQucHVibGljS2V5O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHByaXZhdGUga2V5XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuS2V5LnByb3RvdHlwZS5pc1ByaXZhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnByaW1hcnlLZXkudGFnID09PSBfZW51bXMyLmRlZmF1bHQucGFja2V0LnNlY3JldEtleTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBrZXkgYXMgcHVibGljIGtleSAoc2hhbGxvdyBjb3B5KVxuICogQHJldHVybnMge21vZHVsZTprZXkuS2V5fSBuZXcgcHVibGljIEtleVxuICovXG5LZXkucHJvdG90eXBlLnRvUHVibGljID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcGFja2V0bGlzdCA9IG5ldyBfcGFja2V0Mi5kZWZhdWx0Lkxpc3QoKTtcbiAgdmFyIGtleVBhY2tldHMgPSB0aGlzLnRvUGFja2V0bGlzdCgpO1xuICB2YXIgYnl0ZXMgPSB2b2lkIDA7XG4gIHZhciBwdWJLZXlQYWNrZXQgPSB2b2lkIDA7XG4gIHZhciBwdWJTdWJrZXlQYWNrZXQgPSB2b2lkIDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5UGFja2V0cy5sZW5ndGg7IGkrKykge1xuICAgIHN3aXRjaCAoa2V5UGFja2V0c1tpXS50YWcpIHtcbiAgICAgIGNhc2UgX2VudW1zMi5kZWZhdWx0LnBhY2tldC5zZWNyZXRLZXk6XG4gICAgICAgIGJ5dGVzID0ga2V5UGFja2V0c1tpXS53cml0ZVB1YmxpY0tleSgpO1xuICAgICAgICBwdWJLZXlQYWNrZXQgPSBuZXcgX3BhY2tldDIuZGVmYXVsdC5QdWJsaWNLZXkoKTtcbiAgICAgICAgcHViS2V5UGFja2V0LnJlYWQoYnl0ZXMpO1xuICAgICAgICBwYWNrZXRsaXN0LnB1c2gocHViS2V5UGFja2V0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIF9lbnVtczIuZGVmYXVsdC5wYWNrZXQuc2VjcmV0U3Via2V5OlxuICAgICAgICBieXRlcyA9IGtleVBhY2tldHNbaV0ud3JpdGVQdWJsaWNLZXkoKTtcbiAgICAgICAgcHViU3Via2V5UGFja2V0ID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuUHVibGljU3Via2V5KCk7XG4gICAgICAgIHB1YlN1YmtleVBhY2tldC5yZWFkKGJ5dGVzKTtcbiAgICAgICAgcGFja2V0bGlzdC5wdXNoKHB1YlN1YmtleVBhY2tldCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcGFja2V0bGlzdC5wdXNoKGtleVBhY2tldHNbaV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IEtleShwYWNrZXRsaXN0KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBBU0NJSSBhcm1vcmVkIHRleHQgb2Yga2V5XG4gKiBAcmV0dXJucyB7U3RyaW5nfSBBU0NJSSBhcm1vclxuICovXG5LZXkucHJvdG90eXBlLmFybW9yID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdHlwZSA9IHRoaXMuaXNQdWJsaWMoKSA/IF9lbnVtczIuZGVmYXVsdC5hcm1vci5wdWJsaWNfa2V5IDogX2VudW1zMi5kZWZhdWx0LmFybW9yLnByaXZhdGVfa2V5O1xuICByZXR1cm4gX2FybW9yMi5kZWZhdWx0LmVuY29kZSh0eXBlLCB0aGlzLnRvUGFja2V0bGlzdCgpLndyaXRlKCkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaWduYXR1cmUgdGhhdCBoYXMgdGhlIGxhdGVzdCBjcmVhdGlvbiBkYXRlLCB3aGlsZSBpZ25vcmluZyBzaWduYXR1cmVzIGNyZWF0ZWQgaW4gdGhlIGZ1dHVyZS5cbiAqIEBwYXJhbSAge0FycmF5PG1vZHVsZTpwYWNrZXQuU2lnbmF0dXJlPn0gc2lnbmF0dXJlcyAgTGlzdCBvZiBzaWduYXR1cmVzXG4gKiBAcGFyYW0gIHtEYXRlfSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGUgICAgICAgIFVzZSB0aGUgZ2l2ZW4gZGF0ZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHRpbWVcbiAqIEByZXR1cm5zIHttb2R1bGU6cGFja2V0LlNpZ25hdHVyZX0gVGhlIGxhdGVzdCBzaWduYXR1cmVcbiAqL1xuZnVuY3Rpb24gZ2V0TGF0ZXN0U2lnbmF0dXJlKHNpZ25hdHVyZXMpIHtcbiAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG5ldyBEYXRlKCk7XG5cbiAgdmFyIHNpZ25hdHVyZSA9IHNpZ25hdHVyZXNbMF07XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgc2lnbmF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzaWduYXR1cmVzW2ldLmNyZWF0ZWQgPj0gc2lnbmF0dXJlLmNyZWF0ZWQgJiYgKHNpZ25hdHVyZXNbaV0uY3JlYXRlZCA8PSBkYXRlIHx8IGRhdGUgPT09IG51bGwpKSB7XG4gICAgICBzaWduYXR1cmUgPSBzaWduYXR1cmVzW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2lnbmF0dXJlO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkU2lnbmluZ0tleVBhY2tldChrZXlQYWNrZXQsIHNpZ25hdHVyZSkge1xuICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbmV3IERhdGUoKTtcblxuICByZXR1cm4ga2V5UGFja2V0LmFsZ29yaXRobSAhPT0gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleSwgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5yc2FfZW5jcnlwdCkgJiYga2V5UGFja2V0LmFsZ29yaXRobSAhPT0gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleSwgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lbGdhbWFsKSAmJiBrZXlQYWNrZXQuYWxnb3JpdGhtICE9PSBfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LCBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmVjZGgpICYmICghc2lnbmF0dXJlLmtleUZsYWdzIHx8IChzaWduYXR1cmUua2V5RmxhZ3NbMF0gJiBfZW51bXMyLmRlZmF1bHQua2V5RmxhZ3Muc2lnbl9kYXRhKSAhPT0gMCkgJiYgc2lnbmF0dXJlLnZlcmlmaWVkICYmICFzaWduYXR1cmUucmV2b2tlZCAmJiAhc2lnbmF0dXJlLmlzRXhwaXJlZChkYXRlKSAmJiAhaXNEYXRhRXhwaXJlZChrZXlQYWNrZXQsIHNpZ25hdHVyZSwgZGF0ZSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBmaXJzdCBrZXkgcGFja2V0IG9yIGtleSBwYWNrZXQgYnkgZ2l2ZW4ga2V5SWQgdGhhdCBpcyBhdmFpbGFibGUgZm9yIHNpZ25pbmcgYW5kIHZlcmlmaWNhdGlvblxuICogQHBhcmFtICB7bW9kdWxlOnR5cGUva2V5aWR9IGtleUlkLCBvcHRpb25hbFxuICogQHBhcmFtICB7RGF0ZX0gZGF0ZSB1c2UgdGhlIGdpdmVuIGRhdGUgZm9yIHZlcmlmaWNhdGlvbiBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHRpbWVcbiAqIEBwYXJhbSAge09iamVjdH0gdXNlcklkLCBvcHRpb25hbCB1c2VyIElEXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxtb2R1bGU6cGFja2V0LlNlY3JldFN1YmtleXxcbiAqICAgICAgICAgICAgICAgICAgIG1vZHVsZTpwYWNrZXQuU2VjcmV0S2V5fG51bGw+fSBrZXkgcGFja2V0IG9yIG51bGwgaWYgbm8gc2lnbmluZyBrZXkgaGFzIGJlZW4gZm91bmRcbiAqIEBhc3luY1xuICovXG5LZXkucHJvdG90eXBlLmdldFNpZ25pbmdLZXlQYWNrZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgdmFyIGtleUlkID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBuZXcgRGF0ZSgpO1xuICAgIHZhciB1c2VySWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIHZhciBwcmltYXJ5S2V5LCBpLCBiaW5kaW5nU2lnbmF0dXJlLCBwcmltYXJ5VXNlcjtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBwcmltYXJ5S2V5ID0gdGhpcy5wcmltYXJ5S2V5O1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52ZXJpZnlQcmltYXJ5S2V5KGRhdGUsIHVzZXJJZCk7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfY29udGV4dC50MSA9IF9lbnVtczIuZGVmYXVsdC5rZXlTdGF0dXMudmFsaWQ7XG5cbiAgICAgICAgICAgIGlmICghKF9jb250ZXh0LnQwID09PSBfY29udGV4dC50MSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI1O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaSA9IDA7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBpZiAoIShpIDwgdGhpcy5zdWJLZXlzLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCEoIWtleUlkIHx8IHRoaXMuc3ViS2V5c1tpXS5zdWJLZXkuZ2V0S2V5SWQoKS5lcXVhbHMoa2V5SWQpKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTE7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdWJLZXlzW2ldLnZlcmlmeShwcmltYXJ5S2V5LCBkYXRlKTtcblxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBfY29udGV4dC50MiA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfY29udGV4dC50MyA9IF9lbnVtczIuZGVmYXVsdC5rZXlTdGF0dXMudmFsaWQ7XG5cbiAgICAgICAgICAgIGlmICghKF9jb250ZXh0LnQyID09PSBfY29udGV4dC50MykpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE3O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYmluZGluZ1NpZ25hdHVyZSA9IGdldExhdGVzdFNpZ25hdHVyZSh0aGlzLnN1YktleXNbaV0uYmluZGluZ1NpZ25hdHVyZXMsIGRhdGUpO1xuXG4gICAgICAgICAgICBpZiAoIWlzVmFsaWRTaWduaW5nS2V5UGFja2V0KHRoaXMuc3ViS2V5c1tpXS5zdWJLZXksIGJpbmRpbmdTaWduYXR1cmUsIGRhdGUpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIHRoaXMuc3ViS2V5c1tpXS5zdWJLZXkpO1xuXG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIyO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJpbWFyeVVzZXIoZGF0ZSwgdXNlcklkKTtcblxuICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICBwcmltYXJ5VXNlciA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmICghKHByaW1hcnlVc2VyICYmICgha2V5SWQgfHwgcHJpbWFyeUtleS5nZXRLZXlJZCgpLmVxdWFscyhrZXlJZCkpICYmIGlzVmFsaWRTaWduaW5nS2V5UGFja2V0KHByaW1hcnlLZXksIHByaW1hcnlVc2VyLnNlbGZDZXJ0aWZpY2F0aW9uLCBkYXRlKSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI1O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgncmV0dXJuJywgcHJpbWFyeUtleSk7XG5cbiAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgncmV0dXJuJywgbnVsbCk7XG5cbiAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbmNyeXB0aW9uS2V5UGFja2V0KGtleVBhY2tldCwgc2lnbmF0dXJlKSB7XG4gIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBuZXcgRGF0ZSgpO1xuXG4gIHJldHVybiBrZXlQYWNrZXQuYWxnb3JpdGhtICE9PSBfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LCBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmRzYSkgJiYga2V5UGFja2V0LmFsZ29yaXRobSAhPT0gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleSwgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5yc2Ffc2lnbikgJiYga2V5UGFja2V0LmFsZ29yaXRobSAhPT0gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleSwgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lY2RzYSkgJiYga2V5UGFja2V0LmFsZ29yaXRobSAhPT0gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleSwgX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lZGRzYSkgJiYgKCFzaWduYXR1cmUua2V5RmxhZ3MgfHwgKHNpZ25hdHVyZS5rZXlGbGFnc1swXSAmIF9lbnVtczIuZGVmYXVsdC5rZXlGbGFncy5lbmNyeXB0X2NvbW11bmljYXRpb24pICE9PSAwIHx8IChzaWduYXR1cmUua2V5RmxhZ3NbMF0gJiBfZW51bXMyLmRlZmF1bHQua2V5RmxhZ3MuZW5jcnlwdF9zdG9yYWdlKSAhPT0gMCkgJiYgc2lnbmF0dXJlLnZlcmlmaWVkICYmICFzaWduYXR1cmUucmV2b2tlZCAmJiAhc2lnbmF0dXJlLmlzRXhwaXJlZChkYXRlKSAmJiAhaXNEYXRhRXhwaXJlZChrZXlQYWNrZXQsIHNpZ25hdHVyZSwgZGF0ZSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBmaXJzdCBrZXkgcGFja2V0IG9yIGtleSBwYWNrZXQgYnkgZ2l2ZW4ga2V5SWQgdGhhdCBpcyBhdmFpbGFibGUgZm9yIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvblxuICogQHBhcmFtICB7bW9kdWxlOnR5cGUva2V5aWR9IGtleUlkLCBvcHRpb25hbFxuICogQHBhcmFtICB7RGF0ZX0gICAgICAgICAgICAgIGRhdGUsIG9wdGlvbmFsXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgdXNlcklkLCBvcHRpb25hbFxuICogQHJldHVybnMge1Byb21pc2U8bW9kdWxlOnBhY2tldC5QdWJsaWNTdWJrZXl8XG4gKiAgICAgICAgICAgICAgICAgICBtb2R1bGU6cGFja2V0LlNlY3JldFN1YmtleXxcbiAqICAgICAgICAgICAgICAgICAgIG1vZHVsZTpwYWNrZXQuU2VjcmV0S2V5fFxuICogICAgICAgICAgICAgICAgICAgbW9kdWxlOnBhY2tldC5QdWJsaWNLZXl8bnVsbD59IGtleSBwYWNrZXQgb3IgbnVsbCBpZiBubyBlbmNyeXB0aW9uIGtleSBoYXMgYmVlbiBmb3VuZFxuICogQGFzeW5jXG4gKi9cbktleS5wcm90b3R5cGUuZ2V0RW5jcnlwdGlvbktleVBhY2tldCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYyID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKGtleUlkKSB7XG4gICAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG5ldyBEYXRlKCk7XG4gICAgdmFyIHVzZXJJZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgdmFyIHByaW1hcnlLZXksIGksIGJpbmRpbmdTaWduYXR1cmUsIHByaW1hcnlVc2VyO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBwcmltYXJ5S2V5ID0gdGhpcy5wcmltYXJ5S2V5O1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVyaWZ5UHJpbWFyeUtleShkYXRlLCB1c2VySWQpO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgX2NvbnRleHQyLnQwID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICBfY29udGV4dDIudDEgPSBfZW51bXMyLmRlZmF1bHQua2V5U3RhdHVzLnZhbGlkO1xuXG4gICAgICAgICAgICBpZiAoIShfY29udGV4dDIudDAgPT09IF9jb250ZXh0Mi50MSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyNTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGkgPSAwO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgaWYgKCEoaSA8IHRoaXMuc3ViS2V5cy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoISgha2V5SWQgfHwgdGhpcy5zdWJLZXlzW2ldLnN1YktleS5nZXRLZXlJZCgpLmVxdWFscyhrZXlJZCkpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDExO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3ViS2V5c1tpXS52ZXJpZnkocHJpbWFyeUtleSwgZGF0ZSk7XG5cbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgX2NvbnRleHQyLnQyID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICBfY29udGV4dDIudDMgPSBfZW51bXMyLmRlZmF1bHQua2V5U3RhdHVzLnZhbGlkO1xuXG4gICAgICAgICAgICBpZiAoIShfY29udGV4dDIudDIgPT09IF9jb250ZXh0Mi50MykpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJpbmRpbmdTaWduYXR1cmUgPSBnZXRMYXRlc3RTaWduYXR1cmUodGhpcy5zdWJLZXlzW2ldLmJpbmRpbmdTaWduYXR1cmVzLCBkYXRlKTtcblxuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkRW5jcnlwdGlvbktleVBhY2tldCh0aGlzLnN1YktleXNbaV0uc3ViS2V5LCBiaW5kaW5nU2lnbmF0dXJlLCBkYXRlKSkge1xuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDE3O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoJ3JldHVybicsIHRoaXMuc3ViS2V5c1tpXS5zdWJLZXkpO1xuXG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjI7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcmltYXJ5VXNlcihkYXRlLCB1c2VySWQpO1xuXG4gICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgIHByaW1hcnlVc2VyID0gX2NvbnRleHQyLnNlbnQ7XG5cbiAgICAgICAgICAgIGlmICghKHByaW1hcnlVc2VyICYmICgha2V5SWQgfHwgcHJpbWFyeUtleS5nZXRLZXlJZCgpLmVxdWFscyhrZXlJZCkpICYmIGlzVmFsaWRFbmNyeXB0aW9uS2V5UGFja2V0KHByaW1hcnlLZXksIHByaW1hcnlVc2VyLnNlbGZDZXJ0aWZpY2F0aW9uLCBkYXRlKSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyNTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCdyZXR1cm4nLCBwcmltYXJ5S2V5KTtcblxuICAgICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywgbnVsbCk7XG5cbiAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3g5KSB7XG4gICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogRW5jcnlwdHMgYWxsIHNlY3JldCBrZXkgYW5kIHN1YmtleSBwYWNrZXRzIG1hdGNoaW5nIGtleUlkXG4gKiBAcGFyYW0gIHtTdHJpbmd8QXJyYXk8U3RyaW5nPn0gcGFzc3BocmFzZXMgLSBpZiBtdWx0aXBsZSBwYXNzcGhyYXNlcywgdGhlbiBzaG91bGQgYmUgaW4gc2FtZSBvcmRlciBhcyBwYWNrZXRzIGVhY2ggc2hvdWxkIGVuY3J5cHRcbiAqIEBwYXJhbSAge21vZHVsZTp0eXBlL2tleWlkfSBrZXlJZFxuICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8bW9kdWxlOnBhY2tldC5TZWNyZXRLZXl8bW9kdWxlOnBhY2tldC5TZWNyZXRTdWJrZXk+Pn1cbiAqIEBhc3luY1xuICovXG5LZXkucHJvdG90eXBlLmVuY3J5cHQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMyA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlNChwYXNzcGhyYXNlcykge1xuICAgIHZhciBrZXlJZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICB2YXIga2V5UGFja2V0cztcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgaWYgKHRoaXMuaXNQcml2YXRlKCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90aGluZyB0byBlbmNyeXB0IGluIGEgcHVibGljIGtleVwiKTtcblxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGtleVBhY2tldHMgPSB0aGlzLmdldEtleVBhY2tldHMoa2V5SWQpO1xuXG4gICAgICAgICAgICBwYXNzcGhyYXNlcyA9IF91dGlsMi5kZWZhdWx0LmlzQXJyYXkocGFzc3BocmFzZXMpID8gcGFzc3BocmFzZXMgOiBuZXcgQXJyYXkoa2V5UGFja2V0cy5sZW5ndGgpLmZpbGwocGFzc3BocmFzZXMpO1xuXG4gICAgICAgICAgICBpZiAoIShwYXNzcGhyYXNlcy5sZW5ndGggIT09IGtleVBhY2tldHMubGVuZ3RoKSkge1xuICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG51bWJlciBvZiBwYXNzcGhyYXNlcyBmb3Iga2V5XCIpO1xuXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoJ3JldHVybicsIF9wcm9taXNlMi5kZWZhdWx0LmFsbChrZXlQYWNrZXRzLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBfcmVmNCA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhrZXlQYWNrZXQsIGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0Mykge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleVBhY2tldC5lbmNyeXB0KHBhc3NwaHJhc2VzW2ldKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlQYWNrZXQuY2xlYXJQcml2YXRlUGFyYW1zKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgncmV0dXJuJywga2V5UGFja2V0KTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMywgdGhpcyk7XG4gICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF94MTQsIF94MTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0oKSkpKTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlNCwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94MTIpIHtcbiAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBEZWNyeXB0cyBhbGwgc2VjcmV0IGtleSBhbmQgc3Via2V5IHBhY2tldHMgbWF0Y2hpbmcga2V5SWRcbiAqIEBwYXJhbSAge1N0cmluZ3xBcnJheTxTdHJpbmc+fSBwYXNzcGhyYXNlc1xuICogQHBhcmFtICB7bW9kdWxlOnR5cGUva2V5aWR9IGtleUlkXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gdHJ1ZSBpZiBhbGwgbWF0Y2hpbmcga2V5IGFuZCBzdWJrZXkgcGFja2V0cyBkZWNyeXB0ZWQgc3VjY2Vzc2Z1bGx5XG4gKiBAYXN5bmNcbiAqL1xuS2V5LnByb3RvdHlwZS5kZWNyeXB0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjUgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTcocGFzc3BocmFzZXMpIHtcbiAgICB2YXIga2V5SWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgdmFyIHJlc3VsdHM7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWU3JChfY29udGV4dDcpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQ3LnByZXYgPSBfY29udGV4dDcubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUHJpdmF0ZSgpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdGhpbmcgdG8gZGVjcnlwdCBpbiBhIHB1YmxpYyBrZXlcIik7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBwYXNzcGhyYXNlcyA9IF91dGlsMi5kZWZhdWx0LmlzQXJyYXkocGFzc3BocmFzZXMpID8gcGFzc3BocmFzZXMgOiBbcGFzc3BocmFzZXNdO1xuXG4gICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDU7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQuYWxsKHRoaXMuZ2V0S2V5UGFja2V0cyhrZXlJZCkubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIF9yZWY2ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU2KGtleVBhY2tldCkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNyeXB0ZWQsIGVycm9yO1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNiQoX2NvbnRleHQ2KSB7XG4gICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Ni5wcmV2ID0gX2NvbnRleHQ2Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNyeXB0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwocGFzc3BocmFzZXMubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9yZWY3ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KHBhc3NwaHJhc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTUkKF9jb250ZXh0NSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDUucHJldiA9IF9jb250ZXh0NS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1LnByZXYgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleVBhY2tldC5kZWNyeXB0KHBhc3NwaHJhc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjcnlwdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1LnByZXYgPSA2O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1LnQwID0gX2NvbnRleHQ1WydjYXRjaCddKDApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IF9jb250ZXh0NS50MDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNSwgdGhpcywgW1swLCA2XV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDE5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWY3LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KCkpKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNyeXB0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSA2O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgncmV0dXJuJywgZGVjcnlwdGVkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNiwgdGhpcyk7XG4gICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF94MTgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0oKSkpO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgcmVzdWx0cyA9IF9jb250ZXh0Ny5zZW50O1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ny5hYnJ1cHQoJ3JldHVybicsIHJlc3VsdHMuZXZlcnkoZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09PSB0cnVlO1xuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWU3LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3gxNikge1xuICAgIHJldHVybiBfcmVmNS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHNpZ25hdHVyZSBvbiBhIGtleSBpcyByZXZva2VkXG4gKiBAcGFyYW0gIHttb2R1bGU6cGFja2V0LlNlY3JldEtleXxcbiAqIEBwYXJhbSAge21vZHVsZTpwYWNrZXQuU2lnbmF0dXJlfSAgc2lnbmF0dXJlICAgIFRoZSBzaWduYXR1cmUgdG8gdmVyaWZ5XG4gKiBAcGFyYW0gIHttb2R1bGU6cGFja2V0LlB1YmxpY1N1YmtleXxcbiAqICAgICAgICAgIG1vZHVsZTpwYWNrZXQuU2VjcmV0U3Via2V5fFxuICogICAgICAgICAgbW9kdWxlOnBhY2tldC5QdWJsaWNLZXl8XG4gKiAgICAgICAgICBtb2R1bGU6cGFja2V0LlNlY3JldEtleX0ga2V5LCBvcHRpb25hbCBUaGUga2V5IHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlXG4gKiBAcGFyYW0gIHtEYXRlfSAgICAgICAgICAgICAgICAgICAgIGRhdGUgICAgICAgICAgVXNlIHRoZSBnaXZlbiBkYXRlIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgdGltZVxuICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59ICAgICAgICAgICAgICAgICAgICAgIFRydWUgaWYgdGhlIGNlcnRpZmljYXRlIGlzIHJldm9rZWRcbiAqIEBhc3luY1xuICovXG5LZXkucHJvdG90eXBlLmlzUmV2b2tlZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWY4ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU4KHNpZ25hdHVyZSwga2V5KSB7XG4gICAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWU4JChfY29udGV4dDgpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQ4LnByZXYgPSBfY29udGV4dDgubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDguYWJydXB0KCdyZXR1cm4nLCBpc0RhdGFSZXZva2VkKHRoaXMucHJpbWFyeUtleSwgeyBrZXk6IHRoaXMucHJpbWFyeUtleSB9LCB0aGlzLnJldm9jYXRpb25TaWduYXR1cmVzLCBzaWduYXR1cmUsIGtleSwgZGF0ZSkpO1xuXG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ4LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWU4LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3gyMCwgX3gyMSkge1xuICAgIHJldHVybiBfcmVmOC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIFZlcmlmeSBwcmltYXJ5IGtleS4gQ2hlY2tzIGZvciByZXZvY2F0aW9uIHNpZ25hdHVyZXMsIGV4cGlyYXRpb24gdGltZVxuICogYW5kIHZhbGlkIHNlbGYgc2lnbmF0dXJlXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGUgKG9wdGlvbmFsKSB1c2UgdGhlIGdpdmVuIGRhdGUgZm9yIHZlcmlmaWNhdGlvbiBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHRpbWVcbiAqIEBwYXJhbSAge09iamVjdH0gdXNlcklkIChvcHRpb25hbCkgdXNlciBJRFxuICogQHJldHVybnMge1Byb21pc2U8bW9kdWxlOmVudW1zLmtleVN0YXR1cz59IFRoZSBzdGF0dXMgb2YgdGhlIHByaW1hcnkga2V5XG4gKiBAYXN5bmNcbiAqL1xuS2V5LnByb3RvdHlwZS52ZXJpZnlQcmltYXJ5S2V5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjkgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTkoKSB7XG4gICAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG5ldyBEYXRlKCk7XG4gICAgdmFyIHVzZXJJZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB2YXIgcHJpbWFyeUtleSwgX3JlZjEwLCB1c2VyLCBzZWxmQ2VydGlmaWNhdGlvbjtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlOSQoX2NvbnRleHQ5KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0OS5wcmV2ID0gX2NvbnRleHQ5Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBwcmltYXJ5S2V5ID0gdGhpcy5wcmltYXJ5S2V5O1xuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGtleSByZXZvY2F0aW9uIHNpZ25hdHVyZXNcblxuICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNSZXZva2VkKG51bGwsIG51bGwsIGRhdGUpO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgaWYgKCFfY29udGV4dDkuc2VudCkge1xuICAgICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ5LmFicnVwdCgncmV0dXJuJywgX2VudW1zMi5kZWZhdWx0LmtleVN0YXR1cy5yZXZva2VkKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGlmICh0aGlzLnVzZXJzLnNvbWUoZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVzZXIudXNlcklkICYmIHVzZXIuc2VsZkNlcnRpZmljYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0OS5uZXh0ID0gNztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDkuYWJydXB0KCdyZXR1cm4nLCBfZW51bXMyLmRlZmF1bHQua2V5U3RhdHVzLm5vX3NlbGZfY2VydCk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcmltYXJ5VXNlcihkYXRlLCB1c2VySWQpO1xuXG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgX2NvbnRleHQ5LnQwID0gX2NvbnRleHQ5LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfY29udGV4dDkudDApIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAxMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0OS50MCA9IHt9O1xuXG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIF9yZWYxMCA9IF9jb250ZXh0OS50MDtcbiAgICAgICAgICAgIHVzZXIgPSBfcmVmMTAudXNlcjtcbiAgICAgICAgICAgIHNlbGZDZXJ0aWZpY2F0aW9uID0gX3JlZjEwLnNlbGZDZXJ0aWZpY2F0aW9uO1xuXG4gICAgICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDE3O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OS5hYnJ1cHQoJ3JldHVybicsIF9lbnVtczIuZGVmYXVsdC5rZXlTdGF0dXMuaW52YWxpZCk7XG5cbiAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgaWYgKCFpc0RhdGFFeHBpcmVkKHByaW1hcnlLZXksIHNlbGZDZXJ0aWZpY2F0aW9uLCBkYXRlKSkge1xuICAgICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDE5O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OS5hYnJ1cHQoJ3JldHVybicsIF9lbnVtczIuZGVmYXVsdC5rZXlTdGF0dXMuZXhwaXJlZCk7XG5cbiAgICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OS5hYnJ1cHQoJ3JldHVybicsIF9lbnVtczIuZGVmYXVsdC5rZXlTdGF0dXMudmFsaWQpO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OS5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlOSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfcmVmOS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGV4cGlyYXRpb24gdGltZSBvZiB0aGUgcHJpbWFyeSBrZXkgb3IgSW5maW5pdHkgaWYga2V5IGRvZXMgbm90IGV4cGlyZVxuICogQHJldHVybnMge1Byb21pc2U8RGF0ZT59XG4gKiBAYXN5bmNcbiAqL1xuS2V5LnByb3RvdHlwZS5nZXRFeHBpcmF0aW9uVGltZSA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMTAoKSB7XG4gIHZhciBwcmltYXJ5VXNlciwgc2VsZkNlcnQsIGtleUV4cGlyeSwgc2lnRXhwaXJ5O1xuICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTEwJChfY29udGV4dDEwKSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQxMC5wcmV2ID0gX2NvbnRleHQxMC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBpZiAoISh0aGlzLnByaW1hcnlLZXkudmVyc2lvbiA9PT0gMykpIHtcbiAgICAgICAgICAgIF9jb250ZXh0MTAubmV4dCA9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMC5hYnJ1cHQoJ3JldHVybicsIGdldEV4cGlyYXRpb25UaW1lKHRoaXMucHJpbWFyeUtleSkpO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBpZiAoISh0aGlzLnByaW1hcnlLZXkudmVyc2lvbiA+PSA0KSkge1xuICAgICAgICAgICAgX2NvbnRleHQxMC5uZXh0ID0gMTA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfY29udGV4dDEwLm5leHQgPSA1O1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldFByaW1hcnlVc2VyKG51bGwpO1xuXG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBwcmltYXJ5VXNlciA9IF9jb250ZXh0MTAuc2VudDtcbiAgICAgICAgICBzZWxmQ2VydCA9IHByaW1hcnlVc2VyLnNlbGZDZXJ0aWZpY2F0aW9uO1xuICAgICAgICAgIGtleUV4cGlyeSA9IGdldEV4cGlyYXRpb25UaW1lKHRoaXMucHJpbWFyeUtleSwgc2VsZkNlcnQpO1xuICAgICAgICAgIHNpZ0V4cGlyeSA9IHNlbGZDZXJ0LmdldEV4cGlyYXRpb25UaW1lKCk7XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTAuYWJydXB0KCdyZXR1cm4nLCBrZXlFeHBpcnkgPCBzaWdFeHBpcnkgPyBrZXlFeHBpcnkgOiBzaWdFeHBpcnkpO1xuXG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTAuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX2NhbGxlZTEwLCB0aGlzKTtcbn0pKTtcblxuLyoqXG4gKiBSZXR1cm5zIHByaW1hcnkgdXNlciBhbmQgbW9zdCBzaWduaWZpY2FudCAobGF0ZXN0IHZhbGlkKSBzZWxmIHNpZ25hdHVyZVxuICogLSBpZiBtdWx0aXBsZSBwcmltYXJ5IHVzZXJzIGV4aXN0LCByZXR1cm5zIHRoZSBvbmUgd2l0aCB0aGUgbGF0ZXN0IHNlbGYgc2lnbmF0dXJlXG4gKiAtIG90aGVyd2lzZSwgcmV0dXJucyB0aGUgdXNlciB3aXRoIHRoZSBsYXRlc3Qgc2VsZiBzaWduYXR1cmVcbiAqIEBwYXJhbSAge0RhdGV9IGRhdGUgdXNlIHRoZSBnaXZlbiBkYXRlIGZvciB2ZXJpZmljYXRpb24gaW5zdGVhZCBvZiB0aGUgY3VycmVudCB0aW1lXG4gKiBAcGFyYW0gIHtPYmplY3R9IHVzZXJJZCAob3B0aW9uYWwpIHVzZXIgSUQgdG8gZ2V0IGluc3RlYWQgb2YgdGhlIHByaW1hcnkgdXNlciwgaWYgaXQgZXhpc3RzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7dXNlcjogbW9kdWxlOmtleS5Vc2VyLFxuICogICAgICAgICAgICAgICAgICAgIHNlbGZDZXJ0aWZpY2F0aW9uOiBtb2R1bGU6cGFja2V0LlNpZ25hdHVyZX0+fSBUaGUgcHJpbWFyeSB1c2VyIGFuZCB0aGUgc2VsZiBzaWduYXR1cmVcbiAqIEBhc3luY1xuICovXG5LZXkucHJvdG90eXBlLmdldFByaW1hcnlVc2VyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjEyID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxMSgpIHtcbiAgICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbmV3IERhdGUoKTtcbiAgICB2YXIgdXNlcklkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIgdXNlcnMsIHByaW1hcnlVc2VyLCB1c2VyLCBjZXJ0LCBwcmltYXJ5S2V5LCBkYXRhVG9WZXJpZnk7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxMSQoX2NvbnRleHQxMSkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDExLnByZXYgPSBfY29udGV4dDExLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICB1c2VycyA9IHRoaXMudXNlcnMubWFwKGZ1bmN0aW9uICh1c2VyLCBpbmRleCkge1xuICAgICAgICAgICAgICB2YXIgc2VsZkNlcnRpZmljYXRpb24gPSBnZXRMYXRlc3RTaWduYXR1cmUodXNlci5zZWxmQ2VydGlmaWNhdGlvbnMsIGRhdGUpO1xuICAgICAgICAgICAgICByZXR1cm4geyBpbmRleDogaW5kZXgsIHVzZXI6IHVzZXIsIHNlbGZDZXJ0aWZpY2F0aW9uOiBzZWxmQ2VydGlmaWNhdGlvbiB9O1xuICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChfcmVmMTMpIHtcbiAgICAgICAgICAgICAgdmFyIHVzZXIgPSBfcmVmMTMudXNlcixcbiAgICAgICAgICAgICAgICAgIHNlbGZDZXJ0aWZpY2F0aW9uID0gX3JlZjEzLnNlbGZDZXJ0aWZpY2F0aW9uO1xuXG4gICAgICAgICAgICAgIHJldHVybiB1c2VyLnVzZXJJZCAmJiBzZWxmQ2VydGlmaWNhdGlvbiAmJiAodXNlcklkLm5hbWUgPT09IHVuZGVmaW5lZCB8fCB1c2VyLnVzZXJJZC5uYW1lID09PSB1c2VySWQubmFtZSkgJiYgKHVzZXJJZC5lbWFpbCA9PT0gdW5kZWZpbmVkIHx8IHVzZXIudXNlcklkLmVtYWlsID09PSB1c2VySWQuZW1haWwpICYmICh1c2VySWQuY29tbWVudCA9PT0gdW5kZWZpbmVkIHx8IHVzZXIudXNlcklkLmNvbW1lbnQgPT09IHVzZXJJZC5jb21tZW50KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodXNlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MTEubmV4dCA9IDU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoISh1c2VySWQubmFtZSAhPT0gdW5kZWZpbmVkIHx8IHVzZXJJZC5lbWFpbCAhPT0gdW5kZWZpbmVkIHx8IHVzZXJJZC5jb21tZW50ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MTEubmV4dCA9IDQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHVzZXIgdGhhdCBtYXRjaGVzIHRoYXQgdXNlciBJRCcpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTEuYWJydXB0KCdyZXR1cm4nLCBudWxsKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIC8vIHNvcnQgYnkgcHJpbWFyeSB1c2VyIGZsYWcgYW5kIHNpZ25hdHVyZSBjcmVhdGlvbiB0aW1lXG4gICAgICAgICAgICBwcmltYXJ5VXNlciA9IHVzZXJzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgdmFyIEEgPSBhLnNlbGZDZXJ0aWZpY2F0aW9uO1xuICAgICAgICAgICAgICB2YXIgQiA9IGIuc2VsZkNlcnRpZmljYXRpb247XG4gICAgICAgICAgICAgIHJldHVybiBBLmlzUHJpbWFyeVVzZXJJRCAtIEIuaXNQcmltYXJ5VXNlcklEIHx8IEEuY3JlYXRlZCAtIEIuY3JlYXRlZDtcbiAgICAgICAgICAgIH0pLnBvcCgpO1xuICAgICAgICAgICAgdXNlciA9IHByaW1hcnlVc2VyLnVzZXIsIGNlcnQgPSBwcmltYXJ5VXNlci5zZWxmQ2VydGlmaWNhdGlvbjtcbiAgICAgICAgICAgIHByaW1hcnlLZXkgPSB0aGlzLnByaW1hcnlLZXk7XG4gICAgICAgICAgICBkYXRhVG9WZXJpZnkgPSB7IHVzZXJpZDogdXNlci51c2VySWQsIGtleTogcHJpbWFyeUtleSB9O1xuICAgICAgICAgICAgLy8gc2tpcCBpZiBjZXJ0aWZpY2F0ZXMgaXMgaW52YWxpZCwgcmV2b2tlZCwgb3IgZXhwaXJlZFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcblxuICAgICAgICAgICAgX2NvbnRleHQxMS50MCA9IGNlcnQudmVyaWZpZWQ7XG5cbiAgICAgICAgICAgIGlmIChfY29udGV4dDExLnQwKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MTEubmV4dCA9IDE0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQxMS5uZXh0ID0gMTM7XG4gICAgICAgICAgICByZXR1cm4gY2VydC52ZXJpZnkocHJpbWFyeUtleSwgZGF0YVRvVmVyaWZ5KTtcblxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICBfY29udGV4dDExLnQwID0gX2NvbnRleHQxMS5zZW50O1xuXG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIGlmIChfY29udGV4dDExLnQwKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MTEubmV4dCA9IDE2O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTEuYWJydXB0KCdyZXR1cm4nLCBudWxsKTtcblxuICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICBfY29udGV4dDExLnQxID0gY2VydC5yZXZva2VkO1xuXG4gICAgICAgICAgICBpZiAoX2NvbnRleHQxMS50MSkge1xuICAgICAgICAgICAgICBfY29udGV4dDExLm5leHQgPSAyMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0MTEubmV4dCA9IDIwO1xuICAgICAgICAgICAgcmV0dXJuIHVzZXIuaXNSZXZva2VkKHByaW1hcnlLZXksIGNlcnQsIG51bGwsIGRhdGUpO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgIF9jb250ZXh0MTEudDEgPSBfY29udGV4dDExLnNlbnQ7XG5cbiAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgICAgaWYgKCFfY29udGV4dDExLnQxKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MTEubmV4dCA9IDIzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTEuYWJydXB0KCdyZXR1cm4nLCBudWxsKTtcblxuICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICBpZiAoIWNlcnQuaXNFeHBpcmVkKGRhdGUpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MTEubmV4dCA9IDI1O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTEuYWJydXB0KCdyZXR1cm4nLCBudWxsKTtcblxuICAgICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMS5hYnJ1cHQoJ3JldHVybicsIHByaW1hcnlVc2VyKTtcblxuICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDExLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUxMSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfcmVmMTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBVcGRhdGUga2V5IHdpdGggbmV3IGNvbXBvbmVudHMgZnJvbSBzcGVjaWZpZWQga2V5IHdpdGggc2FtZSBrZXkgSUQ6XG4gKiB1c2Vycywgc3Via2V5cywgY2VydGlmaWNhdGVzIGFyZSBtZXJnZWQgaW50byB0aGUgZGVzdGluYXRpb24ga2V5LFxuICogZHVwbGljYXRlcyBhbmQgZXhwaXJlZCBzaWduYXR1cmVzIGFyZSBpZ25vcmVkLlxuICpcbiAqIElmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGEgcHJpdmF0ZSBrZXkgYW5kIHRoZSBkZXN0aW5hdGlvbiBrZXkgaXMgcHVibGljLFxuICogdGhlIGRlc3RpbmF0aW9uIGtleSBpcyB0cmFuc2Zvcm1lZCB0byBhIHByaXZhdGUga2V5LlxuICogQHBhcmFtICB7bW9kdWxlOmtleS5LZXl9IGtleSBTb3VyY2Uga2V5IHRvIG1lcmdlXG4gKi9cbktleS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjE0ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxNihrZXkpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGVxdWFsO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMTYkKF9jb250ZXh0MTYpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQxNi5wcmV2ID0gX2NvbnRleHQxNi5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgX2NvbnRleHQxNi5uZXh0ID0gMjtcbiAgICAgICAgICAgIHJldHVybiBrZXkudmVyaWZ5UHJpbWFyeUtleSgpO1xuXG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgX2NvbnRleHQxNi50MCA9IF9jb250ZXh0MTYuc2VudDtcbiAgICAgICAgICAgIF9jb250ZXh0MTYudDEgPSBfZW51bXMyLmRlZmF1bHQua2V5U3RhdHVzLmludmFsaWQ7XG5cbiAgICAgICAgICAgIGlmICghKF9jb250ZXh0MTYudDAgPT09IF9jb250ZXh0MTYudDEpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MTYubmV4dCA9IDY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNi5hYnJ1cHQoJ3JldHVybicpO1xuXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgaWYgKCEodGhpcy5wcmltYXJ5S2V5LmdldEZpbmdlcnByaW50KCkgIT09IGtleS5wcmltYXJ5S2V5LmdldEZpbmdlcnByaW50KCkpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MTYubmV4dCA9IDg7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0tleSB1cGRhdGUgbWV0aG9kOiBmaW5nZXJwcmludHMgb2Yga2V5cyBub3QgZXF1YWwnKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIGlmICghKHRoaXMuaXNQdWJsaWMoKSAmJiBrZXkuaXNQcml2YXRlKCkpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MTYubmV4dCA9IDEzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGVxdWFsIHN1YmtleSBwYWNrZXRzXG4gICAgICAgICAgICBlcXVhbCA9IHRoaXMuc3ViS2V5cy5sZW5ndGggPT09IGtleS5zdWJLZXlzLmxlbmd0aCAmJiB0aGlzLnN1YktleXMuZXZlcnkoZnVuY3Rpb24gKGRlc3RTdWJLZXkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGtleS5zdWJLZXlzLnNvbWUoZnVuY3Rpb24gKHNyY1N1YktleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZXN0U3ViS2V5LnN1YktleS5nZXRGaW5nZXJwcmludCgpID09PSBzcmNTdWJLZXkuc3ViS2V5LmdldEZpbmdlcnByaW50KCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChlcXVhbCkge1xuICAgICAgICAgICAgICBfY29udGV4dDE2Lm5leHQgPSAxMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBwdWJsaWMga2V5IHdpdGggcHJpdmF0ZSBrZXkgaWYgc3Via2V5IG1pc21hdGNoJyk7XG5cbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgdGhpcy5wcmltYXJ5S2V5ID0ga2V5LnByaW1hcnlLZXk7XG5cbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgX2NvbnRleHQxNi5uZXh0ID0gMTU7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VTaWduYXR1cmVzKGtleSwgdGhpcywgJ3Jldm9jYXRpb25TaWduYXR1cmVzJywgZnVuY3Rpb24gKHNyY1JldlNpZykge1xuICAgICAgICAgICAgICByZXR1cm4gaXNEYXRhUmV2b2tlZChfdGhpcy5wcmltYXJ5S2V5LCBfdGhpcywgW3NyY1JldlNpZ10sIG51bGwsIGtleS5wcmltYXJ5S2V5KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIF9jb250ZXh0MTYubmV4dCA9IDE3O1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlU2lnbmF0dXJlcyhrZXksIHRoaXMsICdkaXJlY3RTaWduYXR1cmVzJyk7XG5cbiAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgX2NvbnRleHQxNi5uZXh0ID0gMTk7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQuYWxsKGtleS51c2Vycy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX3JlZjE1ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxMyhzcmNVc2VyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZvdW5kO1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMTMkKF9jb250ZXh0MTMpIHtcbiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQxMy5wcmV2ID0gX2NvbnRleHQxMy5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQuYWxsKF90aGlzLnVzZXJzLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcmVmMTYgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTEyKGRzdFVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTEyJChfY29udGV4dDEyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0MTIucHJldiA9IF9jb250ZXh0MTIubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHNyY1VzZXIudXNlcklkICYmIGRzdFVzZXIudXNlcklkICYmIHNyY1VzZXIudXNlcklkLnVzZXJpZCA9PT0gZHN0VXNlci51c2VySWQudXNlcmlkIHx8IHNyY1VzZXIudXNlckF0dHJpYnV0ZSAmJiBzcmNVc2VyLnVzZXJBdHRyaWJ1dGUuZXF1YWxzKGRzdFVzZXIudXNlckF0dHJpYnV0ZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRzdFVzZXIudXBkYXRlKHNyY1VzZXIsIF90aGlzLnByaW1hcnlLZXkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMi5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMTIsIF90aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gyOSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVmMTYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0oKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy51c2Vycy5wdXNoKHNyY1VzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMy5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMTMsIF90aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gyOCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVmMTUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0oKSkpO1xuXG4gICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgIF9jb250ZXh0MTYubmV4dCA9IDIxO1xuICAgICAgICAgICAgcmV0dXJuIF9wcm9taXNlMi5kZWZhdWx0LmFsbChrZXkuc3ViS2V5cy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX3JlZjE3ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxNShzcmNTdWJLZXkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZm91bmQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxNSQoX2NvbnRleHQxNSkge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDE1LnByZXYgPSBfY29udGV4dDE1Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNS5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwoX3RoaXMuc3ViS2V5cy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3JlZjE4ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxNChkc3RTdWJLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTE0JChfY29udGV4dDE0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0MTQucHJldiA9IF9jb250ZXh0MTQubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHNyY1N1YktleS5zdWJLZXkuZ2V0RmluZ2VycHJpbnQoKSA9PT0gZHN0U3ViS2V5LnN1YktleS5nZXRGaW5nZXJwcmludCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE0Lm5leHQgPSA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNC5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkc3RTdWJLZXkudXBkYXRlKHNyY1N1YktleSwgX3RoaXMucHJpbWFyeUtleSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE0LnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUxNCwgX3RoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDMxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWYxOC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSgpKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnN1YktleXMucHVzaChzcmNTdWJLZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNS5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMTUsIF90aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVmMTcuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0oKSkpO1xuXG4gICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTYuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTE2LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3gyNykge1xuICAgIHJldHVybiBfcmVmMTQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtLZXkucHJvdG90eXBlLnJldm9rZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYyMSA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMTkoKSB7XG4gICAgdmFyIF9yZWYyMiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICAgIF9yZWYyMiRmbGFnID0gX3JlZjIyLmZsYWcsXG4gICAgICAgIHJlYXNvbkZvclJldm9jYXRpb25GbGFnID0gX3JlZjIyJGZsYWcgPT09IHVuZGVmaW5lZCA/IF9lbnVtczIuZGVmYXVsdC5yZWFzb25Gb3JSZXZvY2F0aW9uLm5vX3JlYXNvbiA6IF9yZWYyMiRmbGFnLFxuICAgICAgICBfcmVmMjIkc3RyaW5nID0gX3JlZjIyLnN0cmluZyxcbiAgICAgICAgcmVhc29uRm9yUmV2b2NhdGlvblN0cmluZyA9IF9yZWYyMiRzdHJpbmcgPT09IHVuZGVmaW5lZCA/ICcnIDogX3JlZjIyJHN0cmluZztcblxuICAgIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBuZXcgRGF0ZSgpO1xuICAgIHZhciBkYXRhVG9TaWduLCBrZXk7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxOSQoX2NvbnRleHQxOSkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDE5LnByZXYgPSBfY29udGV4dDE5Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNQdWJsaWMoKSkge1xuICAgICAgICAgICAgICBfY29udGV4dDE5Lm5leHQgPSAyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIHByaXZhdGUga2V5IGZvciByZXZva2luZycpO1xuXG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgZGF0YVRvU2lnbiA9IHsga2V5OiB0aGlzLnByaW1hcnlLZXkgfTtcbiAgICAgICAgICAgIGtleSA9IG5ldyBLZXkodGhpcy50b1BhY2tldGxpc3QoKSk7XG4gICAgICAgICAgICBfY29udGV4dDE5LnQwID0ga2V5LnJldm9jYXRpb25TaWduYXR1cmVzO1xuICAgICAgICAgICAgX2NvbnRleHQxOS5uZXh0ID0gNztcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVTaWduYXR1cmVQYWNrZXQoZGF0YVRvU2lnbiwgbnVsbCwgdGhpcy5wcmltYXJ5S2V5LCB7XG4gICAgICAgICAgICAgIHNpZ25hdHVyZVR5cGU6IF9lbnVtczIuZGVmYXVsdC5zaWduYXR1cmUua2V5X3Jldm9jYXRpb24sXG4gICAgICAgICAgICAgIHJlYXNvbkZvclJldm9jYXRpb25GbGFnOiBfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LnJlYXNvbkZvclJldm9jYXRpb24sIHJlYXNvbkZvclJldm9jYXRpb25GbGFnKSxcbiAgICAgICAgICAgICAgcmVhc29uRm9yUmV2b2NhdGlvblN0cmluZzogcmVhc29uRm9yUmV2b2NhdGlvblN0cmluZ1xuICAgICAgICAgICAgfSwgZGF0ZSk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBfY29udGV4dDE5LnQxID0gX2NvbnRleHQxOS5zZW50O1xuXG4gICAgICAgICAgICBfY29udGV4dDE5LnQwLnB1c2guY2FsbChfY29udGV4dDE5LnQwLCBfY29udGV4dDE5LnQxKTtcblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTkuYWJydXB0KCdyZXR1cm4nLCBrZXkpO1xuXG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTkuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTE5LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9yZWYyMS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIEdldCByZXZvY2F0aW9uIGNlcnRpZmljYXRlIGZyb20gYSByZXZva2VkIGtleS5cbiAqICAgKFRvIGdldCBhIHJldm9jYXRpb24gY2VydGlmaWNhdGUgZm9yIGFuIHVucmV2b2tlZCBrZXksIGNhbGwgcmV2b2tlKCkgZmlyc3QuKVxuICogQHJldHVybiB7U3RyaW5nfSBhcm1vcmVkIHJldm9jYXRpb24gY2VydGlmaWNhdGVcbiAqL1xuS2V5LnByb3RvdHlwZS5nZXRSZXZvY2F0aW9uQ2VydGlmaWNhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnJldm9jYXRpb25TaWduYXR1cmVzLmxlbmd0aCkge1xuICAgIHZhciBwYWNrZXRsaXN0ID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuTGlzdCgpO1xuICAgIHBhY2tldGxpc3QucHVzaChnZXRMYXRlc3RTaWduYXR1cmUodGhpcy5yZXZvY2F0aW9uU2lnbmF0dXJlcykpO1xuICAgIHJldHVybiBfYXJtb3IyLmRlZmF1bHQuZW5jb2RlKF9lbnVtczIuZGVmYXVsdC5hcm1vci5wdWJsaWNfa2V5LCBwYWNrZXRsaXN0LndyaXRlKCksIG51bGwsIG51bGwsICdUaGlzIGlzIGEgcmV2b2NhdGlvbiBjZXJ0aWZpY2F0ZScpO1xuICB9XG59O1xuXG4vKipcbiAqIEFwcGxpZXMgYSByZXZvY2F0aW9uIGNlcnRpZmljYXRlIHRvIGEga2V5XG4gKiBUaGlzIGFkZHMgdGhlIGZpcnN0IHNpZ25hdHVyZSBwYWNrZXQgaW4gdGhlIGFybW9yZWQgdGV4dCB0byB0aGUga2V5LFxuICogaWYgaXQgaXMgYSB2YWxpZCByZXZvY2F0aW9uIHNpZ25hdHVyZS5cbiAqIEBwYXJhbSAge1N0cmluZ30gcmV2b2NhdGlvbkNlcnRpZmljYXRlIGFybW9yZWQgcmV2b2NhdGlvbiBjZXJ0aWZpY2F0ZVxuICogQHJldHVybiB7bW9kdWxlOmtleX5LZXl9IG5ldyByZXZva2VkIGtleVxuICovXG5LZXkucHJvdG90eXBlLmFwcGx5UmV2b2NhdGlvbkNlcnRpZmljYXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjIzID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyMChyZXZvY2F0aW9uQ2VydGlmaWNhdGUpIHtcbiAgICB2YXIgaW5wdXQsIHBhY2tldGxpc3QsIHJldm9jYXRpb25TaWduYXR1cmUsIGtleTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTIwJChfY29udGV4dDIwKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0MjAucHJldiA9IF9jb250ZXh0MjAubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGlucHV0ID0gX2FybW9yMi5kZWZhdWx0LmRlY29kZShyZXZvY2F0aW9uQ2VydGlmaWNhdGUpO1xuICAgICAgICAgICAgcGFja2V0bGlzdCA9IG5ldyBfcGFja2V0Mi5kZWZhdWx0Lkxpc3QoKTtcblxuICAgICAgICAgICAgcGFja2V0bGlzdC5yZWFkKGlucHV0LmRhdGEpO1xuICAgICAgICAgICAgcmV2b2NhdGlvblNpZ25hdHVyZSA9IHBhY2tldGxpc3QuZmluZFBhY2tldChfZW51bXMyLmRlZmF1bHQucGFja2V0LnNpZ25hdHVyZSk7XG5cbiAgICAgICAgICAgIGlmICghKCFyZXZvY2F0aW9uU2lnbmF0dXJlIHx8IHJldm9jYXRpb25TaWduYXR1cmUuc2lnbmF0dXJlVHlwZSAhPT0gX2VudW1zMi5kZWZhdWx0LnNpZ25hdHVyZS5rZXlfcmV2b2NhdGlvbikpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyMC5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgcmV2b2NhdGlvbiBzaWduYXR1cmUgcGFja2V0Jyk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBpZiAocmV2b2NhdGlvblNpZ25hdHVyZS5pc3N1ZXJLZXlJZC5lcXVhbHModGhpcy5wcmltYXJ5S2V5LmdldEtleUlkKCkpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MjAubmV4dCA9IDg7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jldm9jYXRpb24gc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoIGtleScpO1xuXG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgaWYgKCFyZXZvY2F0aW9uU2lnbmF0dXJlLmlzRXhwaXJlZCgpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MjAubmV4dCA9IDEwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXZvY2F0aW9uIHNpZ25hdHVyZSBpcyBleHBpcmVkJyk7XG5cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgX2NvbnRleHQyMC5uZXh0ID0gMTI7XG4gICAgICAgICAgICByZXR1cm4gcmV2b2NhdGlvblNpZ25hdHVyZS52ZXJpZnkodGhpcy5wcmltYXJ5S2V5LCB7IGtleTogdGhpcy5wcmltYXJ5S2V5IH0pO1xuXG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIGlmIChfY29udGV4dDIwLnNlbnQpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyMC5uZXh0ID0gMTQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB2ZXJpZnkgcmV2b2NhdGlvbiBzaWduYXR1cmUnKTtcblxuICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICBrZXkgPSBuZXcgS2V5KHRoaXMudG9QYWNrZXRsaXN0KCkpO1xuXG4gICAgICAgICAgICBrZXkucmV2b2NhdGlvblNpZ25hdHVyZXMucHVzaChyZXZvY2F0aW9uU2lnbmF0dXJlKTtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIwLmFicnVwdCgncmV0dXJuJywga2V5KTtcblxuICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIwLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyMCwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94MzkpIHtcbiAgICByZXR1cm4gX3JlZjIzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogU2lnbnMgcHJpbWFyeSB1c2VyIG9mIGtleVxuICogQHBhcmFtICB7QXJyYXk8bW9kdWxlOmtleS5LZXk+fSBwcml2YXRlS2V5IGRlY3J5cHRlZCBwcml2YXRlIGtleXMgZm9yIHNpZ25pbmdcbiAqIEByZXR1cm5zIHtQcm9taXNlPG1vZHVsZTprZXkuS2V5Pn0gbmV3IHB1YmxpYyBrZXkgd2l0aCBuZXcgY2VydGlmaWNhdGUgc2lnbmF0dXJlXG4gKiBAYXN5bmNcbiAqL1xuS2V5LnByb3RvdHlwZS5zaWduUHJpbWFyeVVzZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMjQgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIxKHByaXZhdGVLZXlzKSB7XG4gICAgdmFyIF9yZWYyNSwgaW5kZXgsIHVzZXIsIHVzZXJTaWduLCBrZXk7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTIxJChfY29udGV4dDIxKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0MjEucHJldiA9IF9jb250ZXh0MjEubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDI7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcmltYXJ5VXNlcigpO1xuXG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgX2NvbnRleHQyMS50MCA9IF9jb250ZXh0MjEuc2VudDtcblxuICAgICAgICAgICAgaWYgKF9jb250ZXh0MjEudDApIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0MjEudDAgPSB7fTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9yZWYyNSA9IF9jb250ZXh0MjEudDA7XG4gICAgICAgICAgICBpbmRleCA9IF9yZWYyNS5pbmRleDtcbiAgICAgICAgICAgIHVzZXIgPSBfcmVmMjUudXNlcjtcblxuICAgICAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gMTA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHByaW1hcnkgdXNlcicpO1xuXG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDEyO1xuICAgICAgICAgICAgcmV0dXJuIHVzZXIuc2lnbih0aGlzLnByaW1hcnlLZXksIHByaXZhdGVLZXlzKTtcblxuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICB1c2VyU2lnbiA9IF9jb250ZXh0MjEuc2VudDtcbiAgICAgICAgICAgIGtleSA9IG5ldyBLZXkodGhpcy50b1BhY2tldGxpc3QoKSk7XG5cbiAgICAgICAgICAgIGtleS51c2Vyc1tpbmRleF0gPSB1c2VyU2lnbjtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIxLmFicnVwdCgncmV0dXJuJywga2V5KTtcblxuICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIxLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyMSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94NDApIHtcbiAgICByZXR1cm4gX3JlZjI0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogU2lnbnMgYWxsIHVzZXJzIG9mIGtleVxuICogQHBhcmFtICB7QXJyYXk8bW9kdWxlOmtleS5LZXk+fSBwcml2YXRlS2V5cyBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlzIGZvciBzaWduaW5nXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxtb2R1bGU6a2V5LktleT59IG5ldyBwdWJsaWMga2V5IHdpdGggbmV3IGNlcnRpZmljYXRlIHNpZ25hdHVyZVxuICogQGFzeW5jXG4gKi9cbktleS5wcm90b3R5cGUuc2lnbkFsbFVzZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjI2ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyMihwcml2YXRlS2V5cykge1xuICAgIHZhciB0aGF0LCBrZXk7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyMiQoX2NvbnRleHQyMikge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDIyLnByZXYgPSBfY29udGV4dDIyLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIGtleSA9IG5ldyBLZXkodGhpcy50b1BhY2tldGxpc3QoKSk7XG4gICAgICAgICAgICBfY29udGV4dDIyLm5leHQgPSA0O1xuICAgICAgICAgICAgcmV0dXJuIF9wcm9taXNlMi5kZWZhdWx0LmFsbCh0aGlzLnVzZXJzLm1hcChmdW5jdGlvbiAodXNlcikge1xuICAgICAgICAgICAgICByZXR1cm4gdXNlci5zaWduKHRoYXQucHJpbWFyeUtleSwgcHJpdmF0ZUtleXMpO1xuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAga2V5LnVzZXJzID0gX2NvbnRleHQyMi5zZW50O1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MjIuYWJydXB0KCdyZXR1cm4nLCBrZXkpO1xuXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyMi5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMjIsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChfeDQxKSB7XG4gICAgcmV0dXJuIF9yZWYyNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIFZlcmlmaWVzIHByaW1hcnkgdXNlciBvZiBrZXlcbiAqIC0gaWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwgdmVyaWZpZXMgdGhlIHNlbGYgY2VydGlmaWNhdGVzO1xuICogLSBvdGhlcndpc2UsIHZlcmlmaWVzIGFsbCBjZXJ0aWZpY2F0ZXMgc2lnbmVkIHdpdGggZ2l2ZW4ga2V5cy5cbiAqIEBwYXJhbSAge0FycmF5PG1vZHVsZTprZXkuS2V5Pn0ga2V5cyBhcnJheSBvZiBrZXlzIHRvIHZlcmlmeSBjZXJ0aWZpY2F0ZSBzaWduYXR1cmVzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTx7a2V5aWQ6IG1vZHVsZTp0eXBlL2tleWlkLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkOiBCb29sZWFufT4+fSAgICBMaXN0IG9mIHNpZ25lcidzIGtleWlkIGFuZCB2YWxpZGl0eSBvZiBzaWduYXR1cmVcbiAqIEBhc3luY1xuICovXG5LZXkucHJvdG90eXBlLnZlcmlmeVByaW1hcnlVc2VyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjI3ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyMyhrZXlzKSB7XG4gICAgdmFyIHByaW1hcnlLZXksIF9yZWYyOCwgdXNlciwgcmVzdWx0cztcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMjMkKF9jb250ZXh0MjMpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyMy5wcmV2ID0gX2NvbnRleHQyMy5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcHJpbWFyeUtleSA9IHRoaXMucHJpbWFyeUtleTtcbiAgICAgICAgICAgIF9jb250ZXh0MjMubmV4dCA9IDM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcmltYXJ5VXNlcigpO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgX2NvbnRleHQyMy50MCA9IF9jb250ZXh0MjMuc2VudDtcblxuICAgICAgICAgICAgaWYgKF9jb250ZXh0MjMudDApIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyMy5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0MjMudDAgPSB7fTtcblxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIF9yZWYyOCA9IF9jb250ZXh0MjMudDA7XG4gICAgICAgICAgICB1c2VyID0gX3JlZjI4LnVzZXI7XG5cbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MjMubmV4dCA9IDEwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBwcmltYXJ5IHVzZXInKTtcblxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBpZiAoIWtleXMpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyMy5uZXh0ID0gMTY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dDIzLm5leHQgPSAxMztcbiAgICAgICAgICAgIHJldHVybiB1c2VyLnZlcmlmeUFsbENlcnRpZmljYXRpb25zKHByaW1hcnlLZXksIGtleXMpO1xuXG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIF9jb250ZXh0MjMudDEgPSBfY29udGV4dDIzLnNlbnQ7XG4gICAgICAgICAgICBfY29udGV4dDIzLm5leHQgPSAyNDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgIF9jb250ZXh0MjMudDIgPSBwcmltYXJ5S2V5LmtleWlkO1xuICAgICAgICAgICAgX2NvbnRleHQyMy5uZXh0ID0gMTk7XG4gICAgICAgICAgICByZXR1cm4gdXNlci52ZXJpZnkocHJpbWFyeUtleSk7XG5cbiAgICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgICAgX2NvbnRleHQyMy50MyA9IF9jb250ZXh0MjMuc2VudDtcbiAgICAgICAgICAgIF9jb250ZXh0MjMudDQgPSBfZW51bXMyLmRlZmF1bHQua2V5U3RhdHVzLnZhbGlkO1xuICAgICAgICAgICAgX2NvbnRleHQyMy50NSA9IF9jb250ZXh0MjMudDMgPT09IF9jb250ZXh0MjMudDQ7XG4gICAgICAgICAgICBfY29udGV4dDIzLnQ2ID0ge1xuICAgICAgICAgICAgICBrZXlpZDogX2NvbnRleHQyMy50MixcbiAgICAgICAgICAgICAgdmFsaWQ6IF9jb250ZXh0MjMudDVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBfY29udGV4dDIzLnQxID0gW19jb250ZXh0MjMudDZdO1xuXG4gICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgIHJlc3VsdHMgPSBfY29udGV4dDIzLnQxO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MjMuYWJydXB0KCdyZXR1cm4nLCByZXN1bHRzKTtcblxuICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIzLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyMywgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94NDIpIHtcbiAgICByZXR1cm4gX3JlZjI3LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogVmVyaWZpZXMgYWxsIHVzZXJzIG9mIGtleVxuICogLSBpZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCB2ZXJpZmllcyB0aGUgc2VsZiBjZXJ0aWZpY2F0ZXM7XG4gKiAtIG90aGVyd2lzZSwgdmVyaWZpZXMgYWxsIGNlcnRpZmljYXRlcyBzaWduZWQgd2l0aCBnaXZlbiBrZXlzLlxuICogQHBhcmFtICB7QXJyYXk8bW9kdWxlOmtleS5LZXk+fSBrZXlzIGFycmF5IG9mIGtleXMgdG8gdmVyaWZ5IGNlcnRpZmljYXRlIHNpZ25hdHVyZXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHt1c2VyaWQ6IFN0cmluZyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlpZDogbW9kdWxlOnR5cGUva2V5aWQsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IEJvb2xlYW59Pj59IGxpc3Qgb2YgdXNlcmlkLCBzaWduZXIncyBrZXlpZCBhbmQgdmFsaWRpdHkgb2Ygc2lnbmF0dXJlXG4gKiBAYXN5bmNcbiAqL1xuS2V5LnByb3RvdHlwZS52ZXJpZnlBbGxVc2VycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYyOSA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMjUoa2V5cykge1xuICAgIHZhciByZXN1bHRzLCBwcmltYXJ5S2V5O1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMjUkKF9jb250ZXh0MjUpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyNS5wcmV2ID0gX2NvbnRleHQyNS5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgICAgICAgcHJpbWFyeUtleSA9IHRoaXMucHJpbWFyeUtleTtcbiAgICAgICAgICAgIF9jb250ZXh0MjUubmV4dCA9IDQ7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQuYWxsKHRoaXMudXNlcnMubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIF9yZWYzMCA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMjQodXNlcikge1xuICAgICAgICAgICAgICAgIHZhciBzaWduYXR1cmVzO1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMjQkKF9jb250ZXh0MjQpIHtcbiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyNC5wcmV2ID0gX2NvbnRleHQyNC5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjQubmV4dCA9IDY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDI0Lm5leHQgPSAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXIudmVyaWZ5QWxsQ2VydGlmaWNhdGlvbnMocHJpbWFyeUtleSwga2V5cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDI0LnQwID0gX2NvbnRleHQyNC5zZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyNC5uZXh0ID0gMTQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjQudDEgPSBwcmltYXJ5S2V5LmtleWlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyNC5uZXh0ID0gOTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VyLnZlcmlmeShwcmltYXJ5S2V5KTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjQudDIgPSBfY29udGV4dDI0LnNlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDI0LnQzID0gX2VudW1zMi5kZWZhdWx0LmtleVN0YXR1cy52YWxpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjQudDQgPSBfY29udGV4dDI0LnQyID09PSBfY29udGV4dDI0LnQzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyNC50NSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2V5aWQ6IF9jb250ZXh0MjQudDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkOiBfY29udGV4dDI0LnQ0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyNC50MCA9IFtfY29udGV4dDI0LnQ1XTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVzID0gX2NvbnRleHQyNC50MDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChzaWduYXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyaWQ6IHVzZXIudXNlcklkLnVzZXJpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlpZDogc2lnbmF0dXJlLmtleWlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkOiBzaWduYXR1cmUudmFsaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDI0LnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUyNCwgdGhpcyk7XG4gICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF94NDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjMwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KCkpKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDI1LmFicnVwdCgncmV0dXJuJywgcmVzdWx0cyk7XG5cbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDI1LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyNSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94NDMpIHtcbiAgICByZXR1cm4gX3JlZjI5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjIENsYXNzIHRoYXQgcmVwcmVzZW50cyBhbiB1c2VyIElEIG9yIGF0dHJpYnV0ZSBwYWNrZXQgYW5kIHRoZSByZWxldmFudCBzaWduYXR1cmVzLlxuICovXG5mdW5jdGlvbiBVc2VyKHVzZXJQYWNrZXQpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFVzZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBVc2VyKHVzZXJQYWNrZXQpO1xuICB9XG4gIHRoaXMudXNlcklkID0gdXNlclBhY2tldC50YWcgPT09IF9lbnVtczIuZGVmYXVsdC5wYWNrZXQudXNlcmlkID8gdXNlclBhY2tldCA6IG51bGw7XG4gIHRoaXMudXNlckF0dHJpYnV0ZSA9IHVzZXJQYWNrZXQudGFnID09PSBfZW51bXMyLmRlZmF1bHQucGFja2V0LnVzZXJBdHRyaWJ1dGUgPyB1c2VyUGFja2V0IDogbnVsbDtcbiAgdGhpcy5zZWxmQ2VydGlmaWNhdGlvbnMgPSBbXTtcbiAgdGhpcy5vdGhlckNlcnRpZmljYXRpb25zID0gW107XG4gIHRoaXMucmV2b2NhdGlvblNpZ25hdHVyZXMgPSBbXTtcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHN0cnVjdHVyZWQgdXNlciBkYXRhIHRvIHBhY2tldGxpc3RcbiAqIEByZXR1cm5zIHttb2R1bGU6cGFja2V0Lkxpc3R9XG4gKi9cblVzZXIucHJvdG90eXBlLnRvUGFja2V0bGlzdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBhY2tldGxpc3QgPSBuZXcgX3BhY2tldDIuZGVmYXVsdC5MaXN0KCk7XG4gIHBhY2tldGxpc3QucHVzaCh0aGlzLnVzZXJJZCB8fCB0aGlzLnVzZXJBdHRyaWJ1dGUpO1xuICBwYWNrZXRsaXN0LmNvbmNhdCh0aGlzLnJldm9jYXRpb25TaWduYXR1cmVzKTtcbiAgcGFja2V0bGlzdC5jb25jYXQodGhpcy5zZWxmQ2VydGlmaWNhdGlvbnMpO1xuICBwYWNrZXRsaXN0LmNvbmNhdCh0aGlzLm90aGVyQ2VydGlmaWNhdGlvbnMpO1xuICByZXR1cm4gcGFja2V0bGlzdDtcbn07XG5cbi8qKlxuICogU2lnbnMgdXNlclxuICogQHBhcmFtICB7bW9kdWxlOnBhY2tldC5TZWNyZXRLZXl8XG4gKiAgICAgICAgICBtb2R1bGU6cGFja2V0LlB1YmxpY0tleX0gcHJpbWFyeUtleSAgVGhlIHByaW1hcnkga2V5IHBhY2tldFxuICogQHBhcmFtICB7QXJyYXk8bW9kdWxlOmtleS5LZXk+fSAgICBwcml2YXRlS2V5cyBEZWNyeXB0ZWQgcHJpdmF0ZSBrZXlzIGZvciBzaWduaW5nXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxtb2R1bGU6a2V5LktleT59ICAgICAgICAgICAgIE5ldyB1c2VyIHdpdGggbmV3IGNlcnRpZmljYXRlIHNpZ25hdHVyZXNcbiAqIEBhc3luY1xuICovXG5Vc2VyLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjMxID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyNyhwcmltYXJ5S2V5LCBwcml2YXRlS2V5cykge1xuICAgIHZhciBkYXRhVG9TaWduLCB1c2VyO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMjckKF9jb250ZXh0MjcpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyNy5wcmV2ID0gX2NvbnRleHQyNy5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgZGF0YVRvU2lnbiA9IHsgdXNlcmlkOiB0aGlzLnVzZXJJZCB8fCB0aGlzLnVzZXJBdHRyaWJ1dGUsIGtleTogcHJpbWFyeUtleSB9O1xuICAgICAgICAgICAgdXNlciA9IG5ldyBVc2VyKGRhdGFUb1NpZ24udXNlcmlkKTtcbiAgICAgICAgICAgIF9jb250ZXh0MjcubmV4dCA9IDQ7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQuYWxsKHByaXZhdGVLZXlzLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBfcmVmMzIgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTI2KHByaXZhdGVLZXkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2lnbmluZ0tleVBhY2tldDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTI2JChfY29udGV4dDI2KSB7XG4gICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0MjYucHJldiA9IF9jb250ZXh0MjYubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJpdmF0ZUtleS5pc1B1YmxpYygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjYubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgcHJpdmF0ZSBrZXkgZm9yIHNpZ25pbmcnKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHByaXZhdGVLZXkucHJpbWFyeUtleS5nZXRGaW5nZXJwcmludCgpID09PSBwcmltYXJ5S2V5LmdldEZpbmdlcnByaW50KCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjYubmV4dCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCBmb3Igc2VsZiBzaWduaW5nJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDI2Lm5leHQgPSA2O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByaXZhdGVLZXkuZ2V0U2lnbmluZ0tleVBhY2tldCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmluZ0tleVBhY2tldCA9IF9jb250ZXh0MjYuc2VudDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25pbmdLZXlQYWNrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyNi5uZXh0ID0gOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgdmFsaWQgc2lnbmluZyBrZXkgcGFja2V0IGluIGtleSAnICsgcHJpdmF0ZUtleS5wcmltYXJ5S2V5LmdldEtleUlkKCkudG9IZXgoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmluZ0tleVBhY2tldC5pc0RlY3J5cHRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDI2Lm5leHQgPSAxMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJpdmF0ZSBrZXkgaXMgbm90IGRlY3J5cHRlZC4nKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyNi5hYnJ1cHQoJ3JldHVybicsIGNyZWF0ZVNpZ25hdHVyZVBhY2tldChkYXRhVG9TaWduLCBwcml2YXRlS2V5LCBzaWduaW5nS2V5UGFja2V0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vc3QgT3BlblBHUCBpbXBsZW1lbnRhdGlvbnMgdXNlIGdlbmVyaWMgY2VydGlmaWNhdGlvbiAoMHgxMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlVHlwZTogX2VudW1zMi5kZWZhdWx0LnNpZ25hdHVyZS5jZXJ0X2dlbmVyaWMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleUZsYWdzOiBbX2VudW1zMi5kZWZhdWx0LmtleUZsYWdzLmNlcnRpZnlfa2V5cyB8IF9lbnVtczIuZGVmYXVsdC5rZXlGbGFncy5zaWduX2RhdGFdXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyNi5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMjYsIHRoaXMpO1xuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDQ3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWYzMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSgpKSk7XG5cbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICB1c2VyLm90aGVyQ2VydGlmaWNhdGlvbnMgPSBfY29udGV4dDI3LnNlbnQ7XG4gICAgICAgICAgICBfY29udGV4dDI3Lm5leHQgPSA3O1xuICAgICAgICAgICAgcmV0dXJuIHVzZXIudXBkYXRlKHRoaXMsIHByaW1hcnlLZXkpO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MjcuYWJydXB0KCdyZXR1cm4nLCB1c2VyKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mjcuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTI3LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3g0NSwgX3g0Nikge1xuICAgIHJldHVybiBfcmVmMzEuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBjZXJ0aWZpY2F0ZSBvZiB0aGUgdXNlciBpcyByZXZva2VkXG4gKiBAcGFyYW0gIHttb2R1bGU6cGFja2V0LlNlY3JldEtleXxcbiAqICAgICAgICAgIG1vZHVsZTpwYWNrZXQuUHVibGljS2V5fSBwcmltYXJ5S2V5ICAgIFRoZSBwcmltYXJ5IGtleSBwYWNrZXRcbiAqIEBwYXJhbSAge21vZHVsZTpwYWNrZXQuU2lnbmF0dXJlfSAgY2VydGlmaWNhdGUgICBUaGUgY2VydGlmaWNhdGUgdG8gdmVyaWZ5XG4gKiBAcGFyYW0gIHttb2R1bGU6cGFja2V0LlB1YmxpY1N1YmtleXxcbiAqICAgICAgICAgIG1vZHVsZTpwYWNrZXQuU2VjcmV0U3Via2V5fFxuICogICAgICAgICAgbW9kdWxlOnBhY2tldC5QdWJsaWNLZXl8XG4gKiAgICAgICAgICBtb2R1bGU6cGFja2V0LlNlY3JldEtleX0ga2V5LCBvcHRpb25hbCBUaGUga2V5IHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlXG4gKiBAcGFyYW0gIHtEYXRlfSAgICAgICAgICAgICAgICAgICAgIGRhdGUgICAgICAgICAgVXNlIHRoZSBnaXZlbiBkYXRlIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgdGltZVxuICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59ICAgICAgICAgICAgICAgICAgICAgIFRydWUgaWYgdGhlIGNlcnRpZmljYXRlIGlzIHJldm9rZWRcbiAqIEBhc3luY1xuICovXG5Vc2VyLnByb3RvdHlwZS5pc1Jldm9rZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMzMgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTI4KHByaW1hcnlLZXksIGNlcnRpZmljYXRlLCBrZXkpIHtcbiAgICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbmV3IERhdGUoKTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTI4JChfY29udGV4dDI4KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0MjgucHJldiA9IF9jb250ZXh0MjgubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDI4LmFicnVwdCgncmV0dXJuJywgaXNEYXRhUmV2b2tlZChwcmltYXJ5S2V5LCB7XG4gICAgICAgICAgICAgIGtleTogcHJpbWFyeUtleSxcbiAgICAgICAgICAgICAgdXNlcmlkOiB0aGlzLnVzZXJJZCB8fCB0aGlzLnVzZXJBdHRyaWJ1dGVcbiAgICAgICAgICAgIH0sIHRoaXMucmV2b2NhdGlvblNpZ25hdHVyZXMsIGNlcnRpZmljYXRlLCBrZXksIGRhdGUpKTtcblxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mjguc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTI4LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3g0OCwgX3g0OSwgX3g1MCkge1xuICAgIHJldHVybiBfcmVmMzMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtVc2VyLnByb3RvdHlwZS52ZXJpZnlDZXJ0aWZpY2F0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYzNSA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMzEocHJpbWFyeUtleSwgY2VydGlmaWNhdGUsIGtleXMpIHtcbiAgICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbmV3IERhdGUoKTtcbiAgICB2YXIgdGhhdCwga2V5aWQsIGRhdGFUb1ZlcmlmeSwgcmVzdWx0cztcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTMxJChfY29udGV4dDMxKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0MzEucHJldiA9IF9jb250ZXh0MzEubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAga2V5aWQgPSBjZXJ0aWZpY2F0ZS5pc3N1ZXJLZXlJZDtcbiAgICAgICAgICAgIGRhdGFUb1ZlcmlmeSA9IHsgdXNlcmlkOiB0aGlzLnVzZXJJZCB8fCB0aGlzLnVzZXJBdHRyaWJ1dGUsIGtleTogcHJpbWFyeUtleSB9O1xuICAgICAgICAgICAgX2NvbnRleHQzMS5uZXh0ID0gNTtcbiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwoa2V5cy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX3JlZjM2ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzMChrZXkpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5UGFja2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMzAkKF9jb250ZXh0MzApIHtcbiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQzMC5wcmV2ID0gX2NvbnRleHQzMC5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5nZXRLZXlJZHMoKS5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQuZXF1YWxzKGtleWlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MzAubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzMC5hYnJ1cHQoJ3JldHVybicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzMC5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkuZ2V0U2lnbmluZ0tleVBhY2tldChrZXlpZCwgZGF0ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlQYWNrZXQgPSBfY29udGV4dDMwLnNlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDMwLnQwID0gY2VydGlmaWNhdGUucmV2b2tlZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jb250ZXh0MzAudDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzMC5uZXh0ID0gMTA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDMwLm5leHQgPSA5O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuaXNSZXZva2VkKHByaW1hcnlLZXksIGNlcnRpZmljYXRlLCBrZXlQYWNrZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzMC50MCA9IF9jb250ZXh0MzAuc2VudDtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9jb250ZXh0MzAudDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzMC5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzMC5hYnJ1cHQoJ3JldHVybicsIF9lbnVtczIuZGVmYXVsdC5rZXlTdGF0dXMucmV2b2tlZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzMC50MSA9IGNlcnRpZmljYXRlLnZlcmlmaWVkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2NvbnRleHQzMC50MSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDMwLm5leHQgPSAxNztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MzAubmV4dCA9IDE2O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlcnRpZmljYXRlLnZlcmlmeShrZXlQYWNrZXQsIGRhdGFUb1ZlcmlmeSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzMC50MSA9IF9jb250ZXh0MzAuc2VudDtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2NvbnRleHQzMC50MSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDMwLm5leHQgPSAxOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMwLmFicnVwdCgncmV0dXJuJywgX2VudW1zMi5kZWZhdWx0LmtleVN0YXR1cy5pbnZhbGlkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlcnRpZmljYXRlLmlzRXhwaXJlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MzAubmV4dCA9IDIxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MzAuYWJydXB0KCdyZXR1cm4nLCBfZW51bXMyLmRlZmF1bHQua2V5U3RhdHVzLmV4cGlyZWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMwLmFicnVwdCgncmV0dXJuJywgX2VudW1zMi5kZWZhdWx0LmtleVN0YXR1cy52YWxpZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzMC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMzAsIHRoaXMpO1xuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDYyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWYzNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSgpKSk7XG5cbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICByZXN1bHRzID0gX2NvbnRleHQzMS5zZW50O1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MzEuYWJydXB0KCdyZXR1cm4nLCByZXN1bHRzLmZpbmQoZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMxLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUzMSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94NTgsIF94NTksIF94NjApIHtcbiAgICByZXR1cm4gX3JlZjM1LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogVmVyaWZpZXMgYWxsIHVzZXIgY2VydGlmaWNhdGVzXG4gKiBAcGFyYW0gIHttb2R1bGU6cGFja2V0LlNlY3JldEtleXxcbiAqICAgICAgICAgIG1vZHVsZTpwYWNrZXQuUHVibGljS2V5fSBwcmltYXJ5S2V5IFRoZSBwcmltYXJ5IGtleSBwYWNrZXRcbiAqIEBwYXJhbSAge0FycmF5PG1vZHVsZTprZXkuS2V5Pn0gICAga2V5cyAgICAgICBBcnJheSBvZiBrZXlzIHRvIHZlcmlmeSBjZXJ0aWZpY2F0ZSBzaWduYXR1cmVzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTx7a2V5aWQ6IG1vZHVsZTp0eXBlL2tleWlkLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkOiBCb29sZWFufT4+fSAgIExpc3Qgb2Ygc2lnbmVyJ3Mga2V5aWQgYW5kIHZhbGlkaXR5IG9mIHNpZ25hdHVyZVxuICogQGFzeW5jXG4gKi9cblVzZXIucHJvdG90eXBlLnZlcmlmeUFsbENlcnRpZmljYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjM3ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzMyhwcmltYXJ5S2V5LCBrZXlzKSB7XG4gICAgdmFyIHRoYXQsIGNlcnRpZmljYXRpb25zO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMzMkKF9jb250ZXh0MzMpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQzMy5wcmV2ID0gX2NvbnRleHQzMy5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICBjZXJ0aWZpY2F0aW9ucyA9IHRoaXMuc2VsZkNlcnRpZmljYXRpb25zLmNvbmNhdCh0aGlzLm90aGVyQ2VydGlmaWNhdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MzMuYWJydXB0KCdyZXR1cm4nLCBfcHJvbWlzZTIuZGVmYXVsdC5hbGwoY2VydGlmaWNhdGlvbnMubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIF9yZWYzOCA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMzIoY2VydGlmaWNhdGlvbikge1xuICAgICAgICAgICAgICAgIHZhciBzdGF0dXM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzMiQoX2NvbnRleHQzMikge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDMyLnByZXYgPSBfY29udGV4dDMyLm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDMyLm5leHQgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQudmVyaWZ5Q2VydGlmaWNhdGUocHJpbWFyeUtleSwgY2VydGlmaWNhdGlvbiwga2V5cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDMyLnNlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzMi5hYnJ1cHQoJ3JldHVybicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2V5aWQ6IGNlcnRpZmljYXRpb24uaXNzdWVyS2V5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkOiBzdGF0dXMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBzdGF0dXMgPT09IF9lbnVtczIuZGVmYXVsdC5rZXlTdGF0dXMudmFsaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzMi5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMzIsIHRoaXMpO1xuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDY1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWYzOC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSgpKSkpO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzMy5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMzMsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChfeDYzLCBfeDY0KSB7XG4gICAgcmV0dXJuIF9yZWYzNy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIFZlcmlmeSBVc2VyLiBDaGVja3MgZm9yIGV4aXN0ZW5jZSBvZiBzZWxmIHNpZ25hdHVyZXMsIHJldm9jYXRpb24gc2lnbmF0dXJlc1xuICogYW5kIHZhbGlkaXR5IG9mIHNlbGYgc2lnbmF0dXJlXG4gKiBAcGFyYW0gIHttb2R1bGU6cGFja2V0LlNlY3JldEtleXxcbiAqICAgICAgICAgIG1vZHVsZTpwYWNrZXQuUHVibGljS2V5fSBwcmltYXJ5S2V5IFRoZSBwcmltYXJ5IGtleSBwYWNrZXRcbiAqIEByZXR1cm5zIHtQcm9taXNlPG1vZHVsZTplbnVtcy5rZXlTdGF0dXM+fSAgICBTdGF0dXMgb2YgdXNlclxuICogQGFzeW5jXG4gKi9cblVzZXIucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYzOSA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMzUocHJpbWFyeUtleSkge1xuICAgIHZhciB0aGF0LCBkYXRhVG9WZXJpZnksIHJlc3VsdHM7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzNSQoX2NvbnRleHQzNSkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDM1LnByZXYgPSBfY29udGV4dDM1Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxmQ2VydGlmaWNhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MzUubmV4dCA9IDI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzNS5hYnJ1cHQoJ3JldHVybicsIF9lbnVtczIuZGVmYXVsdC5rZXlTdGF0dXMubm9fc2VsZl9jZXJ0KTtcblxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgZGF0YVRvVmVyaWZ5ID0geyB1c2VyaWQ6IHRoaXMudXNlcklkIHx8IHRoaXMudXNlckF0dHJpYnV0ZSwga2V5OiBwcmltYXJ5S2V5IH07XG4gICAgICAgICAgICAvLyBUT0RPIHJlcGxhY2Ugd2hlbiBQcm9taXNlLnNvbWUgb3IgUHJvbWlzZS5hbnkgYXJlIGltcGxlbWVudGVkXG5cbiAgICAgICAgICAgIF9jb250ZXh0MzUudDAgPSBbX2VudW1zMi5kZWZhdWx0LmtleVN0YXR1cy5pbnZhbGlkXTtcbiAgICAgICAgICAgIF9jb250ZXh0MzUubmV4dCA9IDc7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQuYWxsKHRoaXMuc2VsZkNlcnRpZmljYXRpb25zLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBfcmVmNDAgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTM0KHNlbGZDZXJ0aWZpY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzNCQoX2NvbnRleHQzNCkge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDM0LnByZXYgPSBfY29udGV4dDM0Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDM0LnQwID0gc2VsZkNlcnRpZmljYXRpb24ucmV2b2tlZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jb250ZXh0MzQudDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzNC5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MzQubmV4dCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5pc1Jldm9rZWQocHJpbWFyeUtleSwgc2VsZkNlcnRpZmljYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzNC50MCA9IF9jb250ZXh0MzQuc2VudDtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghX2NvbnRleHQzNC50MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDM0Lm5leHQgPSA3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MzQuYWJydXB0KCdyZXR1cm4nLCBfZW51bXMyLmRlZmF1bHQua2V5U3RhdHVzLnJldm9rZWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzNC50MSA9IHNlbGZDZXJ0aWZpY2F0aW9uLnZlcmlmaWVkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2NvbnRleHQzNC50MSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDM0Lm5leHQgPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MzQubmV4dCA9IDExO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGZDZXJ0aWZpY2F0aW9uLnZlcmlmeShwcmltYXJ5S2V5LCBkYXRhVG9WZXJpZnkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MzQudDEgPSBfY29udGV4dDM0LnNlbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jb250ZXh0MzQudDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzNC5uZXh0ID0gMTQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzNC5hYnJ1cHQoJ3JldHVybicsIF9lbnVtczIuZGVmYXVsdC5rZXlTdGF0dXMuaW52YWxpZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmQ2VydGlmaWNhdGlvbi5pc0V4cGlyZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDM0Lm5leHQgPSAxNjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDM0LmFicnVwdCgncmV0dXJuJywgX2VudW1zMi5kZWZhdWx0LmtleVN0YXR1cy5leHBpcmVkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzNC5hYnJ1cHQoJ3JldHVybicsIF9lbnVtczIuZGVmYXVsdC5rZXlTdGF0dXMudmFsaWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MzQuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgX2NhbGxlZTM0LCB0aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g2Nykge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNDAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0oKSkpO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgX2NvbnRleHQzNS50MSA9IF9jb250ZXh0MzUuc2VudDtcbiAgICAgICAgICAgIHJlc3VsdHMgPSBfY29udGV4dDM1LnQwLmNvbmNhdC5jYWxsKF9jb250ZXh0MzUudDAsIF9jb250ZXh0MzUudDEpO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MzUuYWJydXB0KCdyZXR1cm4nLCByZXN1bHRzLnNvbWUoZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzID09PSBfZW51bXMyLmRlZmF1bHQua2V5U3RhdHVzLnZhbGlkO1xuICAgICAgICAgICAgfSkgPyBfZW51bXMyLmRlZmF1bHQua2V5U3RhdHVzLnZhbGlkIDogcmVzdWx0cy5wb3AoKSk7XG5cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzNS5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMzUsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChfeDY2KSB7XG4gICAgcmV0dXJuIF9yZWYzOS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIFVwZGF0ZSB1c2VyIHdpdGggbmV3IGNvbXBvbmVudHMgZnJvbSBzcGVjaWZpZWQgdXNlclxuICogQHBhcmFtICB7bW9kdWxlOmtleS5Vc2VyfSAgICAgICAgICAgICB1c2VyICAgICAgIFNvdXJjZSB1c2VyIHRvIG1lcmdlXG4gKiBAcGFyYW0gIHttb2R1bGU6cGFja2V0LlNlY3JldEtleXxcbiAqICAgICAgICAgIG1vZHVsZTpwYWNrZXQuU2VjcmV0U3Via2V5fSBwcmltYXJ5S2V5IHByaW1hcnkga2V5IHVzZWQgZm9yIHZhbGlkYXRpb25cbiAqL1xuVXNlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjQxID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzNyh1c2VyLCBwcmltYXJ5S2V5KSB7XG4gICAgdmFyIGRhdGFUb1ZlcmlmeTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTM3JChfY29udGV4dDM3KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0MzcucHJldiA9IF9jb250ZXh0MzcubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGRhdGFUb1ZlcmlmeSA9IHsgdXNlcmlkOiB0aGlzLnVzZXJJZCB8fCB0aGlzLnVzZXJBdHRyaWJ1dGUsIGtleTogcHJpbWFyeUtleSB9O1xuICAgICAgICAgICAgLy8gc2VsZiBzaWduYXR1cmVzXG5cbiAgICAgICAgICAgIF9jb250ZXh0MzcubmV4dCA9IDM7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VTaWduYXR1cmVzKHVzZXIsIHRoaXMsICdzZWxmQ2VydGlmaWNhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBfcmVmNDIgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTM2KHNyY1NlbGZTaWcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTM2JChfY29udGV4dDM2KSB7XG4gICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0MzYucHJldiA9IF9jb250ZXh0MzYubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDM2LmFicnVwdCgncmV0dXJuJywgc3JjU2VsZlNpZy52ZXJpZmllZCB8fCBzcmNTZWxmU2lnLnZlcmlmeShwcmltYXJ5S2V5LCBkYXRhVG9WZXJpZnkpKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MzYuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgX2NhbGxlZTM2LCB0aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g3MCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNDIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0oKSk7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBfY29udGV4dDM3Lm5leHQgPSA1O1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlU2lnbmF0dXJlcyh1c2VyLCB0aGlzLCAnb3RoZXJDZXJ0aWZpY2F0aW9ucycpO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgX2NvbnRleHQzNy5uZXh0ID0gNztcbiAgICAgICAgICAgIHJldHVybiBtZXJnZVNpZ25hdHVyZXModXNlciwgdGhpcywgJ3Jldm9jYXRpb25TaWduYXR1cmVzJywgZnVuY3Rpb24gKHNyY1JldlNpZykge1xuICAgICAgICAgICAgICByZXR1cm4gaXNEYXRhUmV2b2tlZChwcmltYXJ5S2V5LCBkYXRhVG9WZXJpZnksIFtzcmNSZXZTaWddKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzNy5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMzcsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChfeDY4LCBfeDY5KSB7XG4gICAgcmV0dXJuIF9yZWY0MS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIEBjbGFzc1xuICogQGNsYXNzZGVzYyBDbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBzdWJrZXkgcGFja2V0IGFuZCB0aGUgcmVsZXZhbnQgc2lnbmF0dXJlcy5cbiAqL1xuZnVuY3Rpb24gU3ViS2V5KHN1YktleVBhY2tldCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU3ViS2V5KSkge1xuICAgIHJldHVybiBuZXcgU3ViS2V5KHN1YktleVBhY2tldCk7XG4gIH1cbiAgdGhpcy5zdWJLZXkgPSBzdWJLZXlQYWNrZXQ7XG4gIHRoaXMuYmluZGluZ1NpZ25hdHVyZXMgPSBbXTtcbiAgdGhpcy5yZXZvY2F0aW9uU2lnbmF0dXJlcyA9IFtdO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgc3RydWN0dXJlZCBzdWJrZXkgZGF0YSB0byBwYWNrZXRsaXN0XG4gKiBAcmV0dXJucyB7bW9kdWxlOnBhY2tldC5MaXN0fVxuICovXG5TdWJLZXkucHJvdG90eXBlLnRvUGFja2V0bGlzdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBhY2tldGxpc3QgPSBuZXcgX3BhY2tldDIuZGVmYXVsdC5MaXN0KCk7XG4gIHBhY2tldGxpc3QucHVzaCh0aGlzLnN1YktleSk7XG4gIHBhY2tldGxpc3QuY29uY2F0KHRoaXMucmV2b2NhdGlvblNpZ25hdHVyZXMpO1xuICBwYWNrZXRsaXN0LmNvbmNhdCh0aGlzLmJpbmRpbmdTaWduYXR1cmVzKTtcbiAgcmV0dXJuIHBhY2tldGxpc3Q7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGJpbmRpbmcgc2lnbmF0dXJlIG9mIGEgc3Via2V5IGlzIHJldm9rZWRcbiAqIEBwYXJhbSAge21vZHVsZTpwYWNrZXQuU2VjcmV0S2V5fFxuICogICAgICAgICAgbW9kdWxlOnBhY2tldC5QdWJsaWNLZXl9IHByaW1hcnlLZXkgICAgVGhlIHByaW1hcnkga2V5IHBhY2tldFxuICogQHBhcmFtICB7bW9kdWxlOnBhY2tldC5TaWduYXR1cmV9ICBzaWduYXR1cmUgICAgIFRoZSBiaW5kaW5nIHNpZ25hdHVyZSB0byB2ZXJpZnlcbiAqIEBwYXJhbSAge21vZHVsZTpwYWNrZXQuUHVibGljU3Via2V5fFxuICogICAgICAgICAgbW9kdWxlOnBhY2tldC5TZWNyZXRTdWJrZXl8XG4gKiAgICAgICAgICBtb2R1bGU6cGFja2V0LlB1YmxpY0tleXxcbiAqICAgICAgICAgIG1vZHVsZTpwYWNrZXQuU2VjcmV0S2V5fSBrZXksIG9wdGlvbmFsIFRoZSBrZXkgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmVcbiAqIEBwYXJhbSAge0RhdGV9ICAgICAgICAgICAgICAgICAgICAgZGF0ZSAgICAgICAgICBVc2UgdGhlIGdpdmVuIGRhdGUgaW5zdGVhZCBvZiB0aGUgY3VycmVudCB0aW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gICAgICAgICAgICAgICAgICAgICAgVHJ1ZSBpZiB0aGUgYmluZGluZyBzaWduYXR1cmUgaXMgcmV2b2tlZFxuICogQGFzeW5jXG4gKi9cblN1YktleS5wcm90b3R5cGUuaXNSZXZva2VkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjQzID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzOChwcmltYXJ5S2V5LCBzaWduYXR1cmUsIGtleSkge1xuICAgIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBuZXcgRGF0ZSgpO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMzgkKF9jb250ZXh0MzgpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQzOC5wcmV2ID0gX2NvbnRleHQzOC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MzguYWJydXB0KCdyZXR1cm4nLCBpc0RhdGFSZXZva2VkKHByaW1hcnlLZXksIHtcbiAgICAgICAgICAgICAga2V5OiBwcmltYXJ5S2V5LFxuICAgICAgICAgICAgICBiaW5kOiB0aGlzLnN1YktleVxuICAgICAgICAgICAgfSwgdGhpcy5yZXZvY2F0aW9uU2lnbmF0dXJlcywgc2lnbmF0dXJlLCBrZXksIGRhdGUpKTtcblxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mzguc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTM4LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3g3MSwgX3g3MiwgX3g3Mykge1xuICAgIHJldHVybiBfcmVmNDMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBWZXJpZnkgc3Via2V5LiBDaGVja3MgZm9yIHJldm9jYXRpb24gc2lnbmF0dXJlcywgZXhwaXJhdGlvbiB0aW1lXG4gKiBhbmQgdmFsaWQgYmluZGluZyBzaWduYXR1cmVcbiAqIEBwYXJhbSAge21vZHVsZTpwYWNrZXQuU2VjcmV0S2V5fFxuICogICAgICAgICAgbW9kdWxlOnBhY2tldC5QdWJsaWNLZXl9IHByaW1hcnlLZXkgVGhlIHByaW1hcnkga2V5IHBhY2tldFxuICogQHBhcmFtICB7RGF0ZX0gICAgICAgICAgICAgICAgICAgICBkYXRlICAgICAgIFVzZSB0aGUgZ2l2ZW4gZGF0ZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHRpbWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPG1vZHVsZTplbnVtcy5rZXlTdGF0dXM+fSAgICBUaGUgc3RhdHVzIG9mIHRoZSBzdWJrZXlcbiAqIEBhc3luY1xuICovXG5TdWJLZXkucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWY0NCA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMzkocHJpbWFyeUtleSkge1xuICAgIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBuZXcgRGF0ZSgpO1xuICAgIHZhciB0aGF0LCBkYXRhVG9WZXJpZnksIGJpbmRpbmdTaWduYXR1cmU7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzOSQoX2NvbnRleHQzOSkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDM5LnByZXYgPSBfY29udGV4dDM5Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIGRhdGFUb1ZlcmlmeSA9IHsga2V5OiBwcmltYXJ5S2V5LCBiaW5kOiB0aGlzLnN1YktleSB9O1xuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIFYzIGV4cGlyYXRpb24gdGltZVxuXG4gICAgICAgICAgICBpZiAoISh0aGlzLnN1YktleS52ZXJzaW9uID09PSAzICYmIGlzRGF0YUV4cGlyZWQodGhpcy5zdWJLZXksIG51bGwsIGRhdGUpKSkge1xuICAgICAgICAgICAgICBfY29udGV4dDM5Lm5leHQgPSA0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MzkuYWJydXB0KCdyZXR1cm4nLCBfZW51bXMyLmRlZmF1bHQua2V5U3RhdHVzLmV4cGlyZWQpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgLy8gY2hlY2sgc3Via2V5IGJpbmRpbmcgc2lnbmF0dXJlc1xuICAgICAgICAgICAgYmluZGluZ1NpZ25hdHVyZSA9IGdldExhdGVzdFNpZ25hdHVyZSh0aGlzLmJpbmRpbmdTaWduYXR1cmVzLCBkYXRlKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGJpbmRpbmcgc2lnbmF0dXJlIGlzIHZlcmlmaWVkXG5cbiAgICAgICAgICAgIF9jb250ZXh0MzkudDAgPSBiaW5kaW5nU2lnbmF0dXJlLnZlcmlmaWVkO1xuXG4gICAgICAgICAgICBpZiAoX2NvbnRleHQzOS50MCkge1xuICAgICAgICAgICAgICBfY29udGV4dDM5Lm5leHQgPSAxMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0MzkubmV4dCA9IDk7XG4gICAgICAgICAgICByZXR1cm4gYmluZGluZ1NpZ25hdHVyZS52ZXJpZnkocHJpbWFyeUtleSwgZGF0YVRvVmVyaWZ5KTtcblxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgIF9jb250ZXh0MzkudDAgPSBfY29udGV4dDM5LnNlbnQ7XG5cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgaWYgKF9jb250ZXh0MzkudDApIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQzOS5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzOS5hYnJ1cHQoJ3JldHVybicsIF9lbnVtczIuZGVmYXVsdC5rZXlTdGF0dXMuaW52YWxpZCk7XG5cbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgX2NvbnRleHQzOS50MSA9IGJpbmRpbmdTaWduYXR1cmUucmV2b2tlZDtcblxuICAgICAgICAgICAgaWYgKF9jb250ZXh0MzkudDEpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQzOS5uZXh0ID0gMTc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dDM5Lm5leHQgPSAxNjtcbiAgICAgICAgICAgIHJldHVybiB0aGF0LmlzUmV2b2tlZChwcmltYXJ5S2V5LCBiaW5kaW5nU2lnbmF0dXJlLCBudWxsLCBkYXRlKTtcblxuICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICBfY29udGV4dDM5LnQxID0gX2NvbnRleHQzOS5zZW50O1xuXG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgIGlmICghX2NvbnRleHQzOS50MSkge1xuICAgICAgICAgICAgICBfY29udGV4dDM5Lm5leHQgPSAxOTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDM5LmFicnVwdCgncmV0dXJuJywgX2VudW1zMi5kZWZhdWx0LmtleVN0YXR1cy5yZXZva2VkKTtcblxuICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICBpZiAoIWJpbmRpbmdTaWduYXR1cmUuaXNFeHBpcmVkKGRhdGUpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0MzkubmV4dCA9IDIxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MzkuYWJydXB0KCdyZXR1cm4nLCBfZW51bXMyLmRlZmF1bHQua2V5U3RhdHVzLmV4cGlyZWQpO1xuXG4gICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDM5LmFicnVwdCgncmV0dXJuJywgX2VudW1zMi5kZWZhdWx0LmtleVN0YXR1cy52YWxpZCk7XG5cbiAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzOS5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMzksIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChfeDc1KSB7XG4gICAgcmV0dXJuIF9yZWY0NC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGV4cGlyYXRpb24gdGltZSBvZiB0aGUgc3Via2V5IG9yIEluZmluaXR5IGlmIGtleSBkb2VzIG5vdCBleHBpcmVcbiAqIEBwYXJhbSAge0RhdGV9ICAgICAgICAgICAgICAgICAgICAgZGF0ZSAgICAgICBVc2UgdGhlIGdpdmVuIGRhdGUgaW5zdGVhZCBvZiB0aGUgY3VycmVudCB0aW1lXG4gKiBAcmV0dXJucyB7RGF0ZX1cbiAqL1xuU3ViS2V5LnByb3RvdHlwZS5nZXRFeHBpcmF0aW9uVGltZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG5ldyBEYXRlKCk7XG5cbiAgdmFyIGJpbmRpbmdTaWduYXR1cmUgPSBnZXRMYXRlc3RTaWduYXR1cmUodGhpcy5iaW5kaW5nU2lnbmF0dXJlcywgZGF0ZSk7XG4gIHZhciBrZXlFeHBpcnkgPSBnZXRFeHBpcmF0aW9uVGltZSh0aGlzLnN1YktleSwgYmluZGluZ1NpZ25hdHVyZSk7XG4gIHZhciBzaWdFeHBpcnkgPSBiaW5kaW5nU2lnbmF0dXJlLmdldEV4cGlyYXRpb25UaW1lKCk7XG4gIHJldHVybiBrZXlFeHBpcnkgPCBzaWdFeHBpcnkgPyBrZXlFeHBpcnkgOiBzaWdFeHBpcnk7XG59O1xuXG4vKipcbiAqIFVwZGF0ZSBzdWJrZXkgd2l0aCBuZXcgY29tcG9uZW50cyBmcm9tIHNwZWNpZmllZCBzdWJrZXlcbiAqIEBwYXJhbSAge21vZHVsZTprZXkuU3ViS2V5fSAgICAgICAgICAgc3ViS2V5ICAgICBTb3VyY2Ugc3Via2V5IHRvIG1lcmdlXG4gKiBAcGFyYW0gIHttb2R1bGU6cGFja2V0LlNlY3JldEtleXxcbiAgICAgICAgICAgIG1vZHVsZTpwYWNrZXQuU2VjcmV0U3Via2V5fSBwcmltYXJ5S2V5IHByaW1hcnkga2V5IHVzZWQgZm9yIHZhbGlkYXRpb25cbiAqL1xuU3ViS2V5LnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmNDUgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQxKHN1YktleSwgcHJpbWFyeUtleSkge1xuICAgIHZhciB0aGF0LCBkYXRhVG9WZXJpZnk7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWU0MSQoX2NvbnRleHQ0MSkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDQxLnByZXYgPSBfY29udGV4dDQxLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBfY29udGV4dDQxLm5leHQgPSAyO1xuICAgICAgICAgICAgcmV0dXJuIHN1YktleS52ZXJpZnkocHJpbWFyeUtleSk7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBfY29udGV4dDQxLnQwID0gX2NvbnRleHQ0MS5zZW50O1xuICAgICAgICAgICAgX2NvbnRleHQ0MS50MSA9IF9lbnVtczIuZGVmYXVsdC5rZXlTdGF0dXMuaW52YWxpZDtcblxuICAgICAgICAgICAgaWYgKCEoX2NvbnRleHQ0MS50MCA9PT0gX2NvbnRleHQ0MS50MSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQ0MS5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQxLmFicnVwdCgncmV0dXJuJyk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBpZiAoISh0aGlzLnN1YktleS5nZXRGaW5nZXJwcmludCgpICE9PSBzdWJLZXkuc3ViS2V5LmdldEZpbmdlcnByaW50KCkpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0NDEubmV4dCA9IDg7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1YktleSB1cGRhdGUgbWV0aG9kOiBmaW5nZXJwcmludHMgb2Ygc3Via2V5cyBub3QgZXF1YWwnKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIC8vIGtleSBwYWNrZXRcbiAgICAgICAgICAgIGlmICh0aGlzLnN1YktleS50YWcgPT09IF9lbnVtczIuZGVmYXVsdC5wYWNrZXQucHVibGljU3Via2V5ICYmIHN1YktleS5zdWJLZXkudGFnID09PSBfZW51bXMyLmRlZmF1bHQucGFja2V0LnNlY3JldFN1YmtleSkge1xuICAgICAgICAgICAgICB0aGlzLnN1YktleSA9IHN1YktleS5zdWJLZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB1cGRhdGUgbWlzc2luZyBiaW5kaW5nIHNpZ25hdHVyZXNcbiAgICAgICAgICAgIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgZGF0YVRvVmVyaWZ5ID0geyBrZXk6IHByaW1hcnlLZXksIGJpbmQ6IHRoYXQuc3ViS2V5IH07XG4gICAgICAgICAgICBfY29udGV4dDQxLm5leHQgPSAxMztcbiAgICAgICAgICAgIHJldHVybiBtZXJnZVNpZ25hdHVyZXMoc3ViS2V5LCB0aGlzLCAnYmluZGluZ1NpZ25hdHVyZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBfcmVmNDYgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQwKHNyY0JpbmRTaWcpIHtcbiAgICAgICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTQwJChfY29udGV4dDQwKSB7XG4gICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NDAucHJldiA9IF9jb250ZXh0NDAubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NDAudDAgPSBzcmNCaW5kU2lnLnZlcmlmaWVkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2NvbnRleHQ0MC50MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQwLm5leHQgPSA1O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0MC5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzcmNCaW5kU2lnLnZlcmlmeShwcmltYXJ5S2V5LCBkYXRhVG9WZXJpZnkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0MC50MCA9IF9jb250ZXh0NDAuc2VudDtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY29udGV4dDQwLnQwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NDAubmV4dCA9IDc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0MC5hYnJ1cHQoJ3JldHVybicsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaSA8IHRoYXQuYmluZGluZ1NpZ25hdHVyZXMubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQwLm5leHQgPSAxNjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhhdC5iaW5kaW5nU2lnbmF0dXJlc1tpXS5pc3N1ZXJLZXlJZC5lcXVhbHMoc3JjQmluZFNpZy5pc3N1ZXJLZXlJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0MC5uZXh0ID0gMTM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzcmNCaW5kU2lnLmNyZWF0ZWQgPCB0aGF0LmJpbmRpbmdTaWduYXR1cmVzW2ldLmNyZWF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NDAubmV4dCA9IDEzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5iaW5kaW5nU2lnbmF0dXJlc1tpXSA9IHNyY0JpbmRTaWc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0MC5hYnJ1cHQoJ3JldHVybicsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQwLm5leHQgPSA4O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NDAuYWJydXB0KCdyZXR1cm4nLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQwLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU0MCwgdGhpcyk7XG4gICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF94ODApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjQ2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KCkpO1xuXG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIF9jb250ZXh0NDEubmV4dCA9IDE1O1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlU2lnbmF0dXJlcyhzdWJLZXksIHRoaXMsICdyZXZvY2F0aW9uU2lnbmF0dXJlcycsIGZ1bmN0aW9uIChzcmNSZXZTaWcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGlzRGF0YVJldm9rZWQocHJpbWFyeUtleSwgZGF0YVRvVmVyaWZ5LCBbc3JjUmV2U2lnXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQxLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWU0MSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94NzgsIF94NzkpIHtcbiAgICByZXR1cm4gX3JlZjQ1LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogUmV2b2tlcyB0aGUgc3Via2V5XG4gKiBAcGFyYW0gIHttb2R1bGU6cGFja2V0LlNlY3JldEtleX0gcHJpbWFyeUtleSBkZWNyeXB0ZWQgcHJpdmF0ZSBwcmltYXJ5IGtleSBmb3IgcmV2b2NhdGlvblxuICogQHBhcmFtICB7T2JqZWN0fSByZWFzb25Gb3JSZXZvY2F0aW9uIG9wdGlvbmFsLCBvYmplY3QgaW5kaWNhdGluZyB0aGUgcmVhc29uIGZvciByZXZvY2F0aW9uXG4gKiBAcGFyYW0gIHttb2R1bGU6ZW51bXMucmVhc29uRm9yUmV2b2NhdGlvbn0gcmVhc29uRm9yUmV2b2NhdGlvbi5mbGFnIG9wdGlvbmFsLCBmbGFnIGluZGljYXRpbmcgdGhlIHJlYXNvbiBmb3IgcmV2b2NhdGlvblxuICogQHBhcmFtICB7U3RyaW5nfSByZWFzb25Gb3JSZXZvY2F0aW9uLnN0cmluZyBvcHRpb25hbCwgc3RyaW5nIGV4cGxhaW5pbmcgdGhlIHJlYXNvbiBmb3IgcmV2b2NhdGlvblxuICogQHBhcmFtICB7RGF0ZX0gZGF0ZSBvcHRpb25hbCwgb3ZlcnJpZGUgdGhlIGNyZWF0aW9udGltZSBvZiB0aGUgcmV2b2NhdGlvbiBzaWduYXR1cmVcbiAqIEByZXR1cm4ge21vZHVsZTprZXl+U3ViS2V5fSBuZXcgc3Via2V5IHdpdGggcmV2b2NhdGlvbiBzaWduYXR1cmVcbiAqL1xuU3ViS2V5LnByb3RvdHlwZS5yZXZva2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmNDcgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQyKHByaW1hcnlLZXkpIHtcbiAgICB2YXIgX3JlZjQ4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZjQ4JGZsYWcgPSBfcmVmNDguZmxhZyxcbiAgICAgICAgcmVhc29uRm9yUmV2b2NhdGlvbkZsYWcgPSBfcmVmNDgkZmxhZyA9PT0gdW5kZWZpbmVkID8gX2VudW1zMi5kZWZhdWx0LnJlYXNvbkZvclJldm9jYXRpb24ubm9fcmVhc29uIDogX3JlZjQ4JGZsYWcsXG4gICAgICAgIF9yZWY0OCRzdHJpbmcgPSBfcmVmNDguc3RyaW5nLFxuICAgICAgICByZWFzb25Gb3JSZXZvY2F0aW9uU3RyaW5nID0gX3JlZjQ4JHN0cmluZyA9PT0gdW5kZWZpbmVkID8gJycgOiBfcmVmNDgkc3RyaW5nO1xuXG4gICAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG5ldyBEYXRlKCk7XG4gICAgdmFyIGRhdGFUb1NpZ24sIHN1YktleTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTQyJChfY29udGV4dDQyKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NDIucHJldiA9IF9jb250ZXh0NDIubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGRhdGFUb1NpZ24gPSB7IGtleTogcHJpbWFyeUtleSwgYmluZDogdGhpcy5zdWJLZXkgfTtcbiAgICAgICAgICAgIHN1YktleSA9IG5ldyBTdWJLZXkodGhpcy5zdWJLZXkpO1xuICAgICAgICAgICAgX2NvbnRleHQ0Mi50MCA9IHN1YktleS5yZXZvY2F0aW9uU2lnbmF0dXJlcztcbiAgICAgICAgICAgIF9jb250ZXh0NDIubmV4dCA9IDU7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlU2lnbmF0dXJlUGFja2V0KGRhdGFUb1NpZ24sIG51bGwsIHByaW1hcnlLZXksIHtcbiAgICAgICAgICAgICAgc2lnbmF0dXJlVHlwZTogX2VudW1zMi5kZWZhdWx0LnNpZ25hdHVyZS5zdWJrZXlfcmV2b2NhdGlvbixcbiAgICAgICAgICAgICAgcmVhc29uRm9yUmV2b2NhdGlvbkZsYWc6IF9lbnVtczIuZGVmYXVsdC53cml0ZShfZW51bXMyLmRlZmF1bHQucmVhc29uRm9yUmV2b2NhdGlvbiwgcmVhc29uRm9yUmV2b2NhdGlvbkZsYWcpLFxuICAgICAgICAgICAgICByZWFzb25Gb3JSZXZvY2F0aW9uU3RyaW5nOiByZWFzb25Gb3JSZXZvY2F0aW9uU3RyaW5nXG4gICAgICAgICAgICB9LCBkYXRlKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9jb250ZXh0NDIudDEgPSBfY29udGV4dDQyLnNlbnQ7XG5cbiAgICAgICAgICAgIF9jb250ZXh0NDIudDAucHVzaC5jYWxsKF9jb250ZXh0NDIudDAsIF9jb250ZXh0NDIudDEpO1xuXG4gICAgICAgICAgICBfY29udGV4dDQyLm5leHQgPSA5O1xuICAgICAgICAgICAgcmV0dXJuIHN1YktleS51cGRhdGUodGhpcywgcHJpbWFyeUtleSk7XG5cbiAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0Mi5hYnJ1cHQoJ3JldHVybicsIHN1YktleSk7XG5cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0Mi5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlNDIsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChfeDgxKSB7XG4gICAgcmV0dXJuIF9yZWY0Ny5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIFJlYWRzIGFuIHVuYXJtb3JlZCBPcGVuUEdQIGtleSBsaXN0IGFuZCByZXR1cm5zIG9uZSBvciBtdWx0aXBsZSBrZXkgb2JqZWN0c1xuICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhIHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMge3trZXlzOiBBcnJheTxtb2R1bGU6a2V5LktleT4sXG4gKiAgICAgICAgICAgIGVycjogKEFycmF5PEVycm9yPnxudWxsKX19IHJlc3VsdCBvYmplY3Qgd2l0aCBrZXkgYW5kIGVycm9yIGFycmF5c1xuICogQHN0YXRpY1xuICovXG5mdW5jdGlvbiByZWFkKGRhdGEpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICByZXN1bHQua2V5cyA9IFtdO1xuICB0cnkge1xuICAgIHZhciBwYWNrZXRsaXN0ID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuTGlzdCgpO1xuICAgIHBhY2tldGxpc3QucmVhZChkYXRhKTtcbiAgICB2YXIga2V5SW5kZXggPSBwYWNrZXRsaXN0LmluZGV4T2ZUYWcoX2VudW1zMi5kZWZhdWx0LnBhY2tldC5wdWJsaWNLZXksIF9lbnVtczIuZGVmYXVsdC5wYWNrZXQuc2VjcmV0S2V5KTtcbiAgICBpZiAoa2V5SW5kZXgubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGtleSBwYWNrZXQgZm91bmQnKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlJbmRleC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG9uZUtleUxpc3QgPSBwYWNrZXRsaXN0LnNsaWNlKGtleUluZGV4W2ldLCBrZXlJbmRleFtpICsgMV0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIG5ld0tleSA9IG5ldyBLZXkob25lS2V5TGlzdCk7XG4gICAgICAgIHJlc3VsdC5rZXlzLnB1c2gobmV3S2V5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVzdWx0LmVyciA9IHJlc3VsdC5lcnIgfHwgW107XG4gICAgICAgIHJlc3VsdC5lcnIucHVzaChlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXN1bHQuZXJyID0gcmVzdWx0LmVyciB8fCBbXTtcbiAgICByZXN1bHQuZXJyLnB1c2goZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZWFkcyBhbiBPcGVuUEdQIGFybW9yZWQgdGV4dCBhbmQgcmV0dXJucyBvbmUgb3IgbXVsdGlwbGUga2V5IG9iamVjdHNcbiAqIEBwYXJhbSB7U3RyaW5nfSBhcm1vcmVkVGV4dCB0ZXh0IHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMge3trZXlzOiBBcnJheTxtb2R1bGU6a2V5LktleT4sXG4gKiAgICAgICAgICAgIGVycjogKEFycmF5PEVycm9yPnxudWxsKX19IHJlc3VsdCBvYmplY3Qgd2l0aCBrZXkgYW5kIGVycm9yIGFycmF5c1xuICogQHN0YXRpY1xuICovXG5mdW5jdGlvbiByZWFkQXJtb3JlZChhcm1vcmVkVGV4dCkge1xuICB0cnkge1xuICAgIHZhciBpbnB1dCA9IF9hcm1vcjIuZGVmYXVsdC5kZWNvZGUoYXJtb3JlZFRleHQpO1xuICAgIGlmICghKGlucHV0LnR5cGUgPT09IF9lbnVtczIuZGVmYXVsdC5hcm1vci5wdWJsaWNfa2V5IHx8IGlucHV0LnR5cGUgPT09IF9lbnVtczIuZGVmYXVsdC5hcm1vci5wcml2YXRlX2tleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJtb3JlZCB0ZXh0IG5vdCBvZiB0eXBlIGtleScpO1xuICAgIH1cbiAgICByZXR1cm4gcmVhZChpbnB1dC5kYXRhKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciByZXN1bHQgPSB7IGtleXM6IFtdLCBlcnI6IFtdIH07XG4gICAgcmVzdWx0LmVyci5wdXNoKGUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNEYXRhRXhwaXJlZChrZXlQYWNrZXQsIHNpZ25hdHVyZSkge1xuICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbmV3IERhdGUoKTtcblxuICB2YXIgbm9ybURhdGUgPSBfdXRpbDIuZGVmYXVsdC5ub3JtYWxpemVEYXRlKGRhdGUpO1xuICBpZiAobm9ybURhdGUgIT09IG51bGwpIHtcbiAgICB2YXIgZXhwaXJhdGlvblRpbWUgPSBnZXRFeHBpcmF0aW9uVGltZShrZXlQYWNrZXQsIHNpZ25hdHVyZSk7XG4gICAgcmV0dXJuICEoa2V5UGFja2V0LmNyZWF0ZWQgPD0gbm9ybURhdGUgJiYgbm9ybURhdGUgPCBleHBpcmF0aW9uVGltZSkgfHwgc2lnbmF0dXJlICYmIHNpZ25hdHVyZS5pc0V4cGlyZWQoZGF0ZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBpcmF0aW9uVGltZShrZXlQYWNrZXQsIHNpZ25hdHVyZSkge1xuICB2YXIgZXhwaXJhdGlvblRpbWUgPSB2b2lkIDA7XG4gIC8vIGNoZWNrIFYzIGV4cGlyYXRpb24gdGltZVxuICBpZiAoa2V5UGFja2V0LnZlcnNpb24gPT09IDMgJiYga2V5UGFja2V0LmV4cGlyYXRpb25UaW1lVjMgIT09IDApIHtcbiAgICBleHBpcmF0aW9uVGltZSA9IGtleVBhY2tldC5jcmVhdGVkLmdldFRpbWUoKSArIGtleVBhY2tldC5leHBpcmF0aW9uVGltZVYzICogMjQgKiAzNjAwICogMTAwMDtcbiAgfVxuICAvLyBjaGVjayBWNCBleHBpcmF0aW9uIHRpbWVcbiAgaWYgKGtleVBhY2tldC52ZXJzaW9uID49IDQgJiYgc2lnbmF0dXJlLmtleU5ldmVyRXhwaXJlcyA9PT0gZmFsc2UpIHtcbiAgICBleHBpcmF0aW9uVGltZSA9IGtleVBhY2tldC5jcmVhdGVkLmdldFRpbWUoKSArIHNpZ25hdHVyZS5rZXlFeHBpcmF0aW9uVGltZSAqIDEwMDA7XG4gIH1cbiAgcmV0dXJuIGV4cGlyYXRpb25UaW1lID8gbmV3IERhdGUoZXhwaXJhdGlvblRpbWUpIDogSW5maW5pdHk7XG59XG5cbn0se1wiLi9jb25maWdcIjozMjUsXCIuL2NyeXB0b1wiOjM0MCxcIi4vZW5jb2RpbmcvYXJtb3JcIjozNTcsXCIuL2VudW1zXCI6MzU5LFwiLi9wYWNrZXRcIjozNzEsXCIuL3V0aWxcIjozOTgsXCJiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2Fzc2lnblwiOjI0LFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mXCI6MjksXCJiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L3ZhbHVlc1wiOjMxLFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL3Byb21pc2VcIjozMixcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI6MzUsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiOjQwLFwiYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvclwiOjQyfV0sMzYzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9rZXlyaW5nID0gX2RlcmVxXygnLi9rZXlyaW5nLmpzJyk7XG5cbnZhciBfa2V5cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9rZXlyaW5nKTtcblxudmFyIF9sb2NhbHN0b3JlID0gX2RlcmVxXygnLi9sb2NhbHN0b3JlLmpzJyk7XG5cbnZhciBfbG9jYWxzdG9yZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9sb2NhbHN0b3JlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEZ1bmN0aW9ucyBkZWFsaW5nIHdpdGggc3RvcmFnZSBvZiB0aGUga2V5cmluZy5cbiAqIEBzZWUgbW9kdWxlOmtleXJpbmcva2V5cmluZ1xuICogQHNlZSBtb2R1bGU6a2V5cmluZy9sb2NhbHN0b3JlXG4gKiBAbW9kdWxlIGtleXJpbmdcbiAqL1xuX2tleXJpbmcyLmRlZmF1bHQubG9jYWxzdG9yZSA9IF9sb2NhbHN0b3JlMi5kZWZhdWx0O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfa2V5cmluZzIuZGVmYXVsdDtcblxufSx7XCIuL2tleXJpbmcuanNcIjozNjQsXCIuL2xvY2Fsc3RvcmUuanNcIjozNjV9XSwzNjQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvcicpO1xuXG52YXIgX3JlZ2VuZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZ2VuZXJhdG9yKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJyk7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3luY1RvR2VuZXJhdG9yMik7XG5cbnZhciBfa2V5ID0gX2RlcmVxXygnLi4va2V5Jyk7XG5cbnZhciBfbG9jYWxzdG9yZSA9IF9kZXJlcV8oJy4vbG9jYWxzdG9yZScpO1xuXG52YXIgX2xvY2Fsc3RvcmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9jYWxzdG9yZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogSW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgdGhlIGtleXJpbmcuXG4gKiBUaGlzIG1ldGhvZCByZWFkcyB0aGUga2V5cmluZyBmcm9tIEhUTUw1IGxvY2FsIHN0b3JhZ2UgYW5kIGluaXRpYWxpemVzIHRoaXMgaW5zdGFuY2UuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7a2V5cmluZy9sb2NhbHN0b3JlfSBbc3RvcmVIYW5kbGVyXSBjbGFzcyBpbXBsZW1lbnRpbmcgbG9hZFB1YmxpYygpLCBsb2FkUHJpdmF0ZSgpLCBzdG9yZVB1YmxpYygpLCBhbmQgc3RvcmVQcml2YXRlKCkgbWV0aG9kc1xuICovXG4vLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgUHJvdmlkZXMgdGhlIEtleXJpbmcgY2xhc3NcbiAqIEByZXF1aXJlcyBrZXlcbiAqIEByZXF1aXJlcyBrZXlyaW5nL2xvY2Fsc3RvcmVcbiAqIEBtb2R1bGUga2V5cmluZy9rZXlyaW5nXG4gKi9cblxuZnVuY3Rpb24gS2V5cmluZyhzdG9yZUhhbmRsZXIpIHtcbiAgdGhpcy5zdG9yZUhhbmRsZXIgPSBzdG9yZUhhbmRsZXIgfHwgbmV3IF9sb2NhbHN0b3JlMi5kZWZhdWx0KCk7XG4gIHRoaXMucHVibGljS2V5cyA9IG5ldyBLZXlBcnJheSh0aGlzLnN0b3JlSGFuZGxlci5sb2FkUHVibGljKCkpO1xuICB0aGlzLnByaXZhdGVLZXlzID0gbmV3IEtleUFycmF5KHRoaXMuc3RvcmVIYW5kbGVyLmxvYWRQcml2YXRlKCkpO1xufVxuXG4vKipcbiAqIENhbGxzIHRoZSBzdG9yZUhhbmRsZXIgdG8gc2F2ZSB0aGUga2V5c1xuICovXG5LZXlyaW5nLnByb3RvdHlwZS5zdG9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zdG9yZUhhbmRsZXIuc3RvcmVQdWJsaWModGhpcy5wdWJsaWNLZXlzLmtleXMpO1xuICB0aGlzLnN0b3JlSGFuZGxlci5zdG9yZVByaXZhdGUodGhpcy5wcml2YXRlS2V5cy5rZXlzKTtcbn07XG5cbi8qKlxuICogQ2xlYXIgdGhlIGtleXJpbmcgLSBlcmFzZSBhbGwgdGhlIGtleXNcbiAqL1xuS2V5cmluZy5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucHVibGljS2V5cy5rZXlzID0gW107XG4gIHRoaXMucHJpdmF0ZUtleXMua2V5cyA9IFtdO1xufTtcblxuLyoqXG4gKiBTZWFyY2hlcyB0aGUga2V5cmluZyBmb3Iga2V5cyBoYXZpbmcgdGhlIHNwZWNpZmllZCBrZXkgaWRcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlJZCBwcm92aWRlZCBhcyBzdHJpbmcgb2YgbG93ZXJjYXNlIGhleCBudW1iZXJcbiAqIHdpdGhvdXRoIDB4IHByZWZpeCAoY2FuIGJlIDE2LWNoYXJhY3RlciBrZXkgSUQgb3IgZmluZ2VycHJpbnQpXG4gKiBAcGFyYW0gIHtCb29sZWFufSBkZWVwIGlmIHRydWUgc2VhcmNoIGFsc28gaW4gc3Via2V5c1xuICogQHJldHVybnMge0FycmF5PG1vZHVsZTprZXkuS2V5PnxudWxsfSBrZXlzIGZvdW5kIG9yIG51bGxcbiAqL1xuS2V5cmluZy5wcm90b3R5cGUuZ2V0S2V5c0ZvcklkID0gZnVuY3Rpb24gKGtleUlkLCBkZWVwKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh0aGlzLnB1YmxpY0tleXMuZ2V0Rm9ySWQoa2V5SWQsIGRlZXApIHx8IFtdKTtcbiAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh0aGlzLnByaXZhdGVLZXlzLmdldEZvcklkKGtleUlkLCBkZWVwKSB8fCBbXSk7XG4gIHJldHVybiByZXN1bHQubGVuZ3RoID8gcmVzdWx0IDogbnVsbDtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBrZXlzIGhhdmluZyB0aGUgc3BlY2lmaWVkIGtleSBpZCBmcm9tIHRoZSBrZXlyaW5nXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5SWQgcHJvdmlkZWQgYXMgc3RyaW5nIG9mIGxvd2VyY2FzZSBoZXggbnVtYmVyXG4gKiB3aXRob3V0aCAweCBwcmVmaXggKGNhbiBiZSAxNi1jaGFyYWN0ZXIga2V5IElEIG9yIGZpbmdlcnByaW50KVxuICogQHJldHVybnMge0FycmF5PG1vZHVsZTprZXkuS2V5PnxudWxsfSBrZXlzIGZvdW5kIG9yIG51bGxcbiAqL1xuS2V5cmluZy5wcm90b3R5cGUucmVtb3ZlS2V5c0ZvcklkID0gZnVuY3Rpb24gKGtleUlkKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh0aGlzLnB1YmxpY0tleXMucmVtb3ZlRm9ySWQoa2V5SWQpIHx8IFtdKTtcbiAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh0aGlzLnByaXZhdGVLZXlzLnJlbW92ZUZvcklkKGtleUlkKSB8fCBbXSk7XG4gIHJldHVybiByZXN1bHQubGVuZ3RoID8gcmVzdWx0IDogbnVsbDtcbn07XG5cbi8qKlxuICogR2V0IGFsbCBwdWJsaWMgYW5kIHByaXZhdGUga2V5c1xuICogQHJldHVybnMge0FycmF5PG1vZHVsZTprZXkuS2V5Pn0gYWxsIGtleXNcbiAqL1xuS2V5cmluZy5wcm90b3R5cGUuZ2V0QWxsS2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucHVibGljS2V5cy5rZXlzLmNvbmNhdCh0aGlzLnByaXZhdGVLZXlzLmtleXMpO1xufTtcblxuLyoqXG4gKiBBcnJheSBvZiBrZXlzXG4gKiBAcGFyYW0ge0FycmF5PG1vZHVsZTprZXkuS2V5Pn0ga2V5cyBUaGUga2V5cyB0byBzdG9yZSBpbiB0aGlzIGFycmF5XG4gKi9cbmZ1bmN0aW9uIEtleUFycmF5KGtleXMpIHtcbiAgdGhpcy5rZXlzID0ga2V5cztcbn1cblxuLyoqXG4gKiBTZWFyY2hlcyBhbGwga2V5cyBpbiB0aGUgS2V5QXJyYXkgbWF0Y2hpbmcgdGhlIGFkZHJlc3Mgb3IgYWRkcmVzcyBwYXJ0IG9mIHRoZSB1c2VyIGlkc1xuICogQHBhcmFtIHtTdHJpbmd9IGVtYWlsIGVtYWlsIGFkZHJlc3MgdG8gc2VhcmNoIGZvclxuICogQHJldHVybnMge0FycmF5PG1vZHVsZTprZXkuS2V5Pn0gVGhlIHB1YmxpYyBrZXlzIGFzc29jaWF0ZWQgd2l0aCBwcm92aWRlZCBlbWFpbCBhZGRyZXNzLlxuICovXG5LZXlBcnJheS5wcm90b3R5cGUuZ2V0Rm9yQWRkcmVzcyA9IGZ1bmN0aW9uIChlbWFpbCkge1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMua2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlbWFpbENoZWNrKGVtYWlsLCB0aGlzLmtleXNbaV0pKSB7XG4gICAgICByZXN1bHRzLnB1c2godGhpcy5rZXlzW2ldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIENoZWNrcyBhIGtleSB0byBzZWUgaWYgaXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGVtYWlsIGFkZHJlc3NcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gZW1haWwgZW1haWwgYWRkcmVzcyB0byBzZWFyY2ggZm9yXG4gKiBAcGFyYW0ge21vZHVsZTprZXkuS2V5fSBrZXkgVGhlIGtleSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVtYWlsIGFkZHJlc3MgaXMgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkIGtleVxuICovXG5mdW5jdGlvbiBlbWFpbENoZWNrKGVtYWlsLCBrZXkpIHtcbiAgZW1haWwgPSBlbWFpbC50b0xvd2VyQ2FzZSgpO1xuICAvLyBlc2NhcGUgZW1haWwgYmVmb3JlIHVzaW5nIGluIHJlZ3VsYXIgZXhwcmVzc2lvblxuICB2YXIgZW1haWxFc2MgPSBlbWFpbC5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG4gIHZhciBlbWFpbFJlZ2V4ID0gbmV3IFJlZ0V4cCgnPCcgKyBlbWFpbEVzYyArICc+Jyk7XG4gIHZhciB1c2VySWRzID0ga2V5LmdldFVzZXJJZHMoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1c2VySWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHVzZXJJZCA9IHVzZXJJZHNbaV0udG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoZW1haWwgPT09IHVzZXJJZCB8fCBlbWFpbFJlZ2V4LnRlc3QodXNlcklkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgYSBrZXkgdG8gc2VlIGlmIGl0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBrZXlpZFxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlJZCBwcm92aWRlZCBhcyBzdHJpbmcgb2YgbG93ZXJjYXNlIGhleCBudW1iZXJcbiAqIHdpdGhvdXRoIDB4IHByZWZpeCAoY2FuIGJlIDE2LWNoYXJhY3RlciBrZXkgSUQgb3IgZmluZ2VycHJpbnQpXG4gKiBAcGFyYW0ge21vZHVsZTpwYWNrZXQuU2VjcmV0S2V5fHB1YmxpY19rZXl8cHVibGljX3N1YmtleXxzZWNyZXRfc3Via2V5fSBrZXlwYWNrZXQgVGhlIGtleXBhY2tldCB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBrZXlwYWNrZXQgaGFzIHRoZSBzcGVjaWZpZWQga2V5aWRcbiAqL1xuZnVuY3Rpb24ga2V5SWRDaGVjayhrZXlJZCwga2V5cGFja2V0KSB7XG4gIGlmIChrZXlJZC5sZW5ndGggPT09IDE2KSB7XG4gICAgcmV0dXJuIGtleUlkID09PSBrZXlwYWNrZXQuZ2V0S2V5SWQoKS50b0hleCgpO1xuICB9XG4gIHJldHVybiBrZXlJZCA9PT0ga2V5cGFja2V0LmdldEZpbmdlcnByaW50KCk7XG59XG5cbi8qKlxuICogU2VhcmNoZXMgdGhlIEtleUFycmF5IGZvciBhIGtleSBoYXZpbmcgdGhlIHNwZWNpZmllZCBrZXkgaWRcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlJZCBwcm92aWRlZCBhcyBzdHJpbmcgb2YgbG93ZXJjYXNlIGhleCBudW1iZXJcbiAqIHdpdGhvdXRoIDB4IHByZWZpeCAoY2FuIGJlIDE2LWNoYXJhY3RlciBrZXkgSUQgb3IgZmluZ2VycHJpbnQpXG4gKiBAcGFyYW0gIHtCb29sZWFufSBkZWVwIGlmIHRydWUgc2VhcmNoIGFsc28gaW4gc3Via2V5c1xuICogQHJldHVybnMge21vZHVsZTprZXkuS2V5fG51bGx9IGtleSBmb3VuZCBvciBudWxsXG4gKi9cbktleUFycmF5LnByb3RvdHlwZS5nZXRGb3JJZCA9IGZ1bmN0aW9uIChrZXlJZCwgZGVlcCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMua2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChrZXlJZENoZWNrKGtleUlkLCB0aGlzLmtleXNbaV0ucHJpbWFyeUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmtleXNbaV07XG4gICAgfVxuICAgIGlmIChkZWVwICYmIHRoaXMua2V5c1tpXS5zdWJLZXlzLmxlbmd0aCkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmtleXNbaV0uc3ViS2V5cy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoa2V5SWRDaGVjayhrZXlJZCwgdGhpcy5rZXlzW2ldLnN1YktleXNbal0uc3ViS2V5KSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmtleXNbaV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIEltcG9ydHMgYSBrZXkgZnJvbSBhbiBhc2NpaSBhcm1vcmVkIG1lc3NhZ2VcbiAqIEBwYXJhbSB7U3RyaW5nfSBhcm1vcmVkIG1lc3NhZ2UgdG8gcmVhZCB0aGUga2V5cy9rZXkgZnJvbVxuICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8RXJyb3I+fG51bGw+fSBhcnJheSBvZiBlcnJvciBvYmplY3RzIG9yIG51bGxcbiAqIEBhc3luY1xuICovXG5LZXlBcnJheS5wcm90b3R5cGUuaW1wb3J0S2V5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlKGFybW9yZWQpIHtcbiAgICB2YXIgaW1wb3J0ZWQsIGksIGtleSwga2V5aWRIZXgsIGtleUZvdW5kO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGltcG9ydGVkID0gKDAsIF9rZXkucmVhZEFybW9yZWQpKGFybW9yZWQpO1xuICAgICAgICAgICAgaSA9IDA7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBpZiAoIShpIDwgaW1wb3J0ZWQua2V5cy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGtleSA9IGltcG9ydGVkLmtleXNbaV07XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBrZXkgYWxyZWFkeSBpbiBrZXkgYXJyYXlcblxuICAgICAgICAgICAga2V5aWRIZXggPSBrZXkucHJpbWFyeUtleS5nZXRLZXlJZCgpLnRvSGV4KCk7XG4gICAgICAgICAgICBrZXlGb3VuZCA9IHRoaXMuZ2V0Rm9ySWQoa2V5aWRIZXgpO1xuXG4gICAgICAgICAgICBpZiAoIWtleUZvdW5kKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5O1xuICAgICAgICAgICAgcmV0dXJuIGtleUZvdW5kLnVwZGF0ZShrZXkpO1xuXG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgdGhpcy5wdXNoKGtleSk7XG5cbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCBpbXBvcnRlZC5lcnIgPyBpbXBvcnRlZC5lcnIgOiBudWxsKTtcblxuICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3gpIHtcbiAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIEFkZCBrZXkgdG8gS2V5QXJyYXlcbiAqIEBwYXJhbSB7bW9kdWxlOmtleS5LZXl9IGtleSBUaGUga2V5IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUga2V5cmluZ1xuICogQHJldHVybnMge051bWJlcn0gVGhlIG5ldyBsZW5ndGggb2YgdGhlIEtleUFycmF5XG4gKi9cbktleUFycmF5LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gdGhpcy5rZXlzLnB1c2goa2V5KTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBhIGtleSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5aWQgZnJvbSB0aGUga2V5cmluZ1xuICogQHBhcmFtIHtTdHJpbmd9IGtleUlkIHByb3ZpZGVkIGFzIHN0cmluZyBvZiBsb3dlcmNhc2UgaGV4IG51bWJlclxuICogd2l0aG91dGggMHggcHJlZml4IChjYW4gYmUgMTYtY2hhcmFjdGVyIGtleSBJRCBvciBmaW5nZXJwcmludClcbiAqIEByZXR1cm5zIHttb2R1bGU6a2V5LktleXxudWxsfSBUaGUga2V5IG9iamVjdCB3aGljaCBoYXMgYmVlbiByZW1vdmVkIG9yIG51bGxcbiAqL1xuS2V5QXJyYXkucHJvdG90eXBlLnJlbW92ZUZvcklkID0gZnVuY3Rpb24gKGtleUlkKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5rZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGtleUlkQ2hlY2soa2V5SWQsIHRoaXMua2V5c1tpXS5wcmltYXJ5S2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMua2V5cy5zcGxpY2UoaSwgMSlbMF07XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gS2V5cmluZztcblxufSx7XCIuLi9rZXlcIjozNjIsXCIuL2xvY2Fsc3RvcmVcIjozNjUsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiOjM1LFwiYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvclwiOjQyfV0sMzY1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9zdHJpbmdpZnkgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvanNvbi9zdHJpbmdpZnknKTtcblxudmFyIF9zdHJpbmdpZnkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3RyaW5naWZ5KTtcblxudmFyIF9jb25maWcgPSBfZGVyZXFfKCcuLi9jb25maWcnKTtcblxudmFyIF9jb25maWcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29uZmlnKTtcblxudmFyIF9rZXkgPSBfZGVyZXFfKCcuLi9rZXknKTtcblxudmFyIF91dGlsID0gX2RlcmVxXygnLi4vdXRpbCcpO1xuXG52YXIgX3V0aWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogVGhlIGNsYXNzIHRoYXQgZGVhbHMgd2l0aCBzdG9yYWdlIG9mIHRoZSBrZXlyaW5nLlxuICogQ3VycmVudGx5IHRoZSBvbmx5IG9wdGlvbiBpcyB0byB1c2UgSFRNTDUgbG9jYWwgc3RvcmFnZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeCBwcmVmaXggZm9yIGl0ZW1uYW1lcyBpbiBsb2NhbHN0b3JlXG4gKi9cbmZ1bmN0aW9uIExvY2FsU3RvcmUocHJlZml4KSB7XG4gIHByZWZpeCA9IHByZWZpeCB8fCAnb3BlbnBncC0nO1xuICB0aGlzLnB1YmxpY0tleXNJdGVtID0gcHJlZml4ICsgdGhpcy5wdWJsaWNLZXlzSXRlbTtcbiAgdGhpcy5wcml2YXRlS2V5c0l0ZW0gPSBwcmVmaXggKyB0aGlzLnByaXZhdGVLZXlzSXRlbTtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UpIHtcbiAgICB0aGlzLnN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RvcmFnZSA9IG5ldyAoX2RlcmVxXygnbm9kZS1sb2NhbHN0b3JhZ2UnKS5Mb2NhbFN0b3JhZ2UpKF9jb25maWcyLmRlZmF1bHQubm9kZV9zdG9yZSk7XG4gIH1cbn1cblxuLypcbiAqIERlY2xhcmUgdGhlIGxvY2Fsc3RvcmUgaXRlbW5hbWVzXG4gKi9cbi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBQcm92aWRlcyB0aGUgTG9jYWxTdG9yZSBjbGFzc1xuICogQHJlcXVpcmVzIGNvbmZpZ1xuICogQHJlcXVpcmVzIGtleVxuICogQHJlcXVpcmVzIHV0aWxcbiAqIEBtb2R1bGUga2V5cmluZy9sb2NhbHN0b3JlXG4gKi9cblxuTG9jYWxTdG9yZS5wcm90b3R5cGUucHVibGljS2V5c0l0ZW0gPSAncHVibGljLWtleXMnO1xuTG9jYWxTdG9yZS5wcm90b3R5cGUucHJpdmF0ZUtleXNJdGVtID0gJ3ByaXZhdGUta2V5cyc7XG5cbi8qKlxuICogTG9hZCB0aGUgcHVibGljIGtleXMgZnJvbSBIVE1MNSBsb2NhbCBzdG9yYWdlLlxuICogQHJldHVybnMge0FycmF5PG1vZHVsZTprZXkuS2V5Pn0gYXJyYXkgb2Yga2V5cyByZXRyaWV2ZWQgZnJvbSBsb2NhbHN0b3JlXG4gKi9cbkxvY2FsU3RvcmUucHJvdG90eXBlLmxvYWRQdWJsaWMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBsb2FkS2V5cyh0aGlzLnN0b3JhZ2UsIHRoaXMucHVibGljS2V5c0l0ZW0pO1xufTtcblxuLyoqXG4gKiBMb2FkIHRoZSBwcml2YXRlIGtleXMgZnJvbSBIVE1MNSBsb2NhbCBzdG9yYWdlLlxuICogQHJldHVybnMge0FycmF5PG1vZHVsZTprZXkuS2V5Pn0gYXJyYXkgb2Yga2V5cyByZXRyaWV2ZWQgZnJvbSBsb2NhbHN0b3JlXG4gKi9cbkxvY2FsU3RvcmUucHJvdG90eXBlLmxvYWRQcml2YXRlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbG9hZEtleXModGhpcy5zdG9yYWdlLCB0aGlzLnByaXZhdGVLZXlzSXRlbSk7XG59O1xuXG5mdW5jdGlvbiBsb2FkS2V5cyhzdG9yYWdlLCBpdGVtbmFtZSkge1xuICB2YXIgYXJtb3JlZEtleXMgPSBKU09OLnBhcnNlKHN0b3JhZ2UuZ2V0SXRlbShpdGVtbmFtZSkpO1xuICB2YXIga2V5cyA9IFtdO1xuICBpZiAoYXJtb3JlZEtleXMgIT09IG51bGwgJiYgYXJtb3JlZEtleXMubGVuZ3RoICE9PSAwKSB7XG4gICAgdmFyIGtleSA9IHZvaWQgMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFybW9yZWRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSAoMCwgX2tleS5yZWFkQXJtb3JlZCkoYXJtb3JlZEtleXNbaV0pO1xuICAgICAgaWYgKCFrZXkuZXJyKSB7XG4gICAgICAgIGtleXMucHVzaChrZXkua2V5c1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdXRpbDIuZGVmYXVsdC5wcmludF9kZWJ1ZyhcIkVycm9yIHJlYWRpbmcgYXJtb3JlZCBrZXkgZnJvbSBrZXlyaW5nIGluZGV4OiBcIiArIGkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4ga2V5cztcbn1cblxuLyoqXG4gKiBTYXZlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcHVibGljIGtleXMgdG8gSFRNTDUgbG9jYWwgc3RvcmFnZS5cbiAqIFRoZSBrZXkgYXJyYXkgZ2V0cyBzdHJpbmdpZmllZCB1c2luZyBKU09OXG4gKiBAcGFyYW0ge0FycmF5PG1vZHVsZTprZXkuS2V5Pn0ga2V5cyBhcnJheSBvZiBrZXlzIHRvIHNhdmUgaW4gbG9jYWxzdG9yZVxuICovXG5Mb2NhbFN0b3JlLnByb3RvdHlwZS5zdG9yZVB1YmxpYyA9IGZ1bmN0aW9uIChrZXlzKSB7XG4gIHN0b3JlS2V5cyh0aGlzLnN0b3JhZ2UsIHRoaXMucHVibGljS2V5c0l0ZW0sIGtleXMpO1xufTtcblxuLyoqXG4gKiBTYXZlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcHJpdmF0ZSBrZXlzIHRvIEhUTUw1IGxvY2FsIHN0b3JhZ2UuXG4gKiBUaGUga2V5IGFycmF5IGdldHMgc3RyaW5naWZpZWQgdXNpbmcgSlNPTlxuICogQHBhcmFtIHtBcnJheTxtb2R1bGU6a2V5LktleT59IGtleXMgYXJyYXkgb2Yga2V5cyB0byBzYXZlIGluIGxvY2Fsc3RvcmVcbiAqL1xuTG9jYWxTdG9yZS5wcm90b3R5cGUuc3RvcmVQcml2YXRlID0gZnVuY3Rpb24gKGtleXMpIHtcbiAgc3RvcmVLZXlzKHRoaXMuc3RvcmFnZSwgdGhpcy5wcml2YXRlS2V5c0l0ZW0sIGtleXMpO1xufTtcblxuZnVuY3Rpb24gc3RvcmVLZXlzKHN0b3JhZ2UsIGl0ZW1uYW1lLCBrZXlzKSB7XG4gIHZhciBhcm1vcmVkS2V5cyA9IFtdO1xuICBpZiAoa2V5cy5sZW5ndGgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFybW9yZWRLZXlzLnB1c2goa2V5c1tpXS5hcm1vcigpKTtcbiAgICB9XG4gICAgc3RvcmFnZS5zZXRJdGVtKGl0ZW1uYW1lLCAoMCwgX3N0cmluZ2lmeTIuZGVmYXVsdCkoYXJtb3JlZEtleXMpKTtcbiAgfSBlbHNlIHtcbiAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oaXRlbW5hbWUpO1xuICB9XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IExvY2FsU3RvcmU7XG5cbn0se1wiLi4vY29uZmlnXCI6MzI1LFwiLi4va2V5XCI6MzYyLFwiLi4vdXRpbFwiOjM5OCxcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9qc29uL3N0cmluZ2lmeVwiOjIzLFwibm9kZS1sb2NhbHN0b3JhZ2VcIjpcIm5vZGUtbG9jYWxzdG9yYWdlXCJ9XSwzNjY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jcmVhdGVWZXJpZmljYXRpb25PYmplY3RzID0gZXhwb3J0cy5jcmVhdGVTaWduYXR1cmVQYWNrZXRzID0gZXhwb3J0cy5lbmNyeXB0U2Vzc2lvbktleSA9IHVuZGVmaW5lZDtcblxudmFyIF9mcm9tID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9jb3JlLWpzL2FycmF5L2Zyb20nKTtcblxudmFyIF9mcm9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Zyb20pO1xuXG52YXIgX3Byb21pc2UgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvcHJvbWlzZScpO1xuXG52YXIgX3Byb21pc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvbWlzZSk7XG5cbnZhciBfcmVnZW5lcmF0b3IgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yJyk7XG5cbnZhciBfcmVnZW5lcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVnZW5lcmF0b3IpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IyID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3InKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FzeW5jVG9HZW5lcmF0b3IyKTtcblxuLyoqXG4gKiBFbmNyeXB0IGEgc2Vzc2lvbiBrZXkgZWl0aGVyIHdpdGggcHVibGljIGtleXMsIHBhc3N3b3Jkcywgb3IgYm90aCBhdCBvbmNlLlxuICogQHBhcmFtICB7VWludDhBcnJheX0gc2Vzc2lvbktleSAgICAgc2Vzc2lvbiBrZXkgZm9yIGVuY3J5cHRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gc3ltQWxnbyAgICAgICAgICAgIHNlc3Npb24ga2V5IGFsZ29yaXRobVxuICogQHBhcmFtICB7U3RyaW5nfSBhZWFkQWxnbyAgICAgICAgICAgKG9wdGlvbmFsKSBhZWFkIGFsZ29yaXRobSwgZS5nLiAnZWF4JyBvciAnb2NiJ1xuICogQHBhcmFtICB7QXJyYXk8S2V5Pn0gcHVibGljS2V5cyAgICAgKG9wdGlvbmFsKSBwdWJsaWMga2V5KHMpIGZvciBtZXNzYWdlIGVuY3J5cHRpb25cbiAqIEBwYXJhbSAge0FycmF5PFN0cmluZz59IHBhc3N3b3JkcyAgIChvcHRpb25hbCkgZm9yIG1lc3NhZ2UgZW5jcnlwdGlvblxuICogQHBhcmFtICB7Qm9vbGVhbn0gd2lsZGNhcmQgICAgICAgICAgKG9wdGlvbmFsKSB1c2UgYSBrZXkgSUQgb2YgMCBpbnN0ZWFkIG9mIHRoZSBwdWJsaWMga2V5IElEc1xuICogQHBhcmFtICB7RGF0ZX0gZGF0ZSAgICAgICAgICAgICAgICAgKG9wdGlvbmFsKSBvdmVycmlkZSB0aGUgZGF0ZVxuICogQHBhcmFtICB7T2JqZWN0fSB1c2VySWQgICAgICAgICAgICAgKG9wdGlvbmFsKSB1c2VyIElEIHRvIGVuY3J5cHQgZm9yLCBlLmcuIHsgbmFtZTonUm9iZXJ0IFJlY2VpdmVyJywgZW1haWw6J3JvYmVydEBvcGVucGdwLm9yZycgfVxuICogQHJldHVybnMge1Byb21pc2U8TWVzc2FnZT59ICAgICAgICAgIG5ldyBtZXNzYWdlIHdpdGggZW5jcnlwdGVkIGNvbnRlbnRcbiAqIEBhc3luY1xuICovXG52YXIgZW5jcnlwdFNlc3Npb25LZXkgPSBleHBvcnRzLmVuY3J5cHRTZXNzaW9uS2V5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjggPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTExKHNlc3Npb25LZXksIHN5bUFsZ28sIGFlYWRBbGdvLCBwdWJsaWNLZXlzLCBwYXNzd29yZHMpIHtcbiAgICB2YXIgd2lsZGNhcmQgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IGZhbHNlO1xuICAgIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDYgJiYgYXJndW1lbnRzWzZdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNl0gOiBuZXcgRGF0ZSgpO1xuICAgIHZhciB1c2VySWQgPSBhcmd1bWVudHMubGVuZ3RoID4gNyAmJiBhcmd1bWVudHNbN10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s3XSA6IHt9O1xuXG4gICAgdmFyIHBhY2tldGxpc3QsIHJlc3VsdHMsIHRlc3REZWNyeXB0LCBzdW0sIGVuY3J5cHRQYXNzd29yZCwgX3Jlc3VsdHM7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTExJChfY29udGV4dDExKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0MTEucHJldiA9IF9jb250ZXh0MTEubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHBhY2tldGxpc3QgPSBuZXcgX3BhY2tldDIuZGVmYXVsdC5MaXN0KCk7XG5cbiAgICAgICAgICAgIGlmICghcHVibGljS2V5cykge1xuICAgICAgICAgICAgICBfY29udGV4dDExLm5leHQgPSA2O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQxMS5uZXh0ID0gNDtcbiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwocHVibGljS2V5cy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX3JlZjkgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTgocHVibGljS2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIGVuY3J5cHRpb25LZXlQYWNrZXQsIHBrRVNLZXlQYWNrZXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWU4JChfY29udGV4dDgpIHtcbiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ4LnByZXYgPSBfY29udGV4dDgubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0OC5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwdWJsaWNLZXkuZ2V0RW5jcnlwdGlvbktleVBhY2tldCh1bmRlZmluZWQsIGRhdGUsIHVzZXJJZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5UGFja2V0ID0gX2NvbnRleHQ4LnNlbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNyeXB0aW9uS2V5UGFja2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0OC5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgdmFsaWQga2V5IHBhY2tldCBmb3IgZW5jcnlwdGlvbiBpbiBrZXkgJyArIHB1YmxpY0tleS5wcmltYXJ5S2V5LmdldEtleUlkKCkudG9IZXgoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBwa0VTS2V5UGFja2V0ID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuUHVibGljS2V5RW5jcnlwdGVkU2Vzc2lvbktleSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBwa0VTS2V5UGFja2V0LnB1YmxpY0tleUlkID0gd2lsZGNhcmQgPyBfa2V5aWQyLmRlZmF1bHQud2lsZGNhcmQoKSA6IGVuY3J5cHRpb25LZXlQYWNrZXQuZ2V0S2V5SWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBrRVNLZXlQYWNrZXQucHVibGljS2V5QWxnb3JpdGhtID0gZW5jcnlwdGlvbktleVBhY2tldC5hbGdvcml0aG07XG4gICAgICAgICAgICAgICAgICAgICAgICBwa0VTS2V5UGFja2V0LnNlc3Npb25LZXkgPSBzZXNzaW9uS2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGtFU0tleVBhY2tldC5zZXNzaW9uS2V5QWxnb3JpdGhtID0gc3ltQWxnbztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0OC5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGtFU0tleVBhY2tldC5lbmNyeXB0KGVuY3J5cHRpb25LZXlQYWNrZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwa0VTS2V5UGFja2V0LnNlc3Npb25LZXk7IC8vIGRlbGV0ZSBwbGFpbnRleHQgc2Vzc2lvbiBrZXkgYWZ0ZXIgZW5jcnlwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OC5hYnJ1cHQoJ3JldHVybicsIHBrRVNLZXlQYWNrZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlOCwgdGhpcyk7XG4gICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF94MjQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0oKSkpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgcmVzdWx0cyA9IF9jb250ZXh0MTEuc2VudDtcblxuICAgICAgICAgICAgcGFja2V0bGlzdC5jb25jYXQocmVzdWx0cyk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBpZiAoIXBhc3N3b3Jkcykge1xuICAgICAgICAgICAgICBfY29udGV4dDExLm5leHQgPSAxNDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRlc3REZWNyeXB0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX3JlZjEwID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU5KGtleVBhY2tldCwgcGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTkkKF9jb250ZXh0OSkge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDkucHJldiA9IF9jb250ZXh0OS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ5LnByZXYgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleVBhY2tldC5kZWNyeXB0KHBhc3N3b3JkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDkuYWJydXB0KCdyZXR1cm4nLCAxKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0OS5wcmV2ID0gNjtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0OS50MCA9IF9jb250ZXh0OVsnY2F0Y2gnXSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDkuYWJydXB0KCdyZXR1cm4nLCAwKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OS5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlOSwgdGhpcywgW1swLCA2XV0pO1xuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHRlc3REZWNyeXB0KF94MjUsIF94MjYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjEwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KCk7XG5cbiAgICAgICAgICAgIHN1bSA9IGZ1bmN0aW9uIHN1bShhY2N1bXVsYXRvciwgY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvciArIGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGVuY3J5cHRQYXNzd29yZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIF9yZWYxMSA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMTAoc2Vzc2lvbktleSwgc3ltQWxnbywgYWVhZEFsZ28sIHBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN5bUVuY3J5cHRlZFNlc3Npb25LZXlQYWNrZXQsIF9yZXN1bHRzMjtcblxuICAgICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMTAkKF9jb250ZXh0MTApIHtcbiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQxMC5wcmV2ID0gX2NvbnRleHQxMC5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3ltRW5jcnlwdGVkU2Vzc2lvbktleVBhY2tldCA9IG5ldyBfcGFja2V0Mi5kZWZhdWx0LlN5bUVuY3J5cHRlZFNlc3Npb25LZXkoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgc3ltRW5jcnlwdGVkU2Vzc2lvbktleVBhY2tldC5zZXNzaW9uS2V5ID0gc2Vzc2lvbktleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bUVuY3J5cHRlZFNlc3Npb25LZXlQYWNrZXQuc2Vzc2lvbktleUFsZ29yaXRobSA9IHN5bUFsZ287XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWVhZEFsZ28pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltRW5jcnlwdGVkU2Vzc2lvbktleVBhY2tldC5hZWFkQWxnb3JpdGhtID0gYWVhZEFsZ287XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEwLm5leHQgPSA2O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bUVuY3J5cHRlZFNlc3Npb25LZXlQYWNrZXQuZW5jcnlwdChwYXNzd29yZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9jb25maWcyLmRlZmF1bHQucGFzc3dvcmRfY29sbGlzaW9uX2NoZWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTAubmV4dCA9IDEyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMC5uZXh0ID0gOTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwocGFzc3dvcmRzLm1hcChmdW5jdGlvbiAocHdkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0RGVjcnlwdChzeW1FbmNyeXB0ZWRTZXNzaW9uS2V5UGFja2V0LCBwd2QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdHMyID0gX2NvbnRleHQxMC5zZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShfcmVzdWx0czIucmVkdWNlKHN1bSkgIT09IDEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTAubmV4dCA9IDEyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTAuYWJydXB0KCdyZXR1cm4nLCBlbmNyeXB0UGFzc3dvcmQoc2Vzc2lvbktleSwgc3ltQWxnbywgcGFzc3dvcmQpKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzeW1FbmNyeXB0ZWRTZXNzaW9uS2V5UGFja2V0LnNlc3Npb25LZXk7IC8vIGRlbGV0ZSBwbGFpbnRleHQgc2Vzc2lvbiBrZXkgYWZ0ZXIgZW5jcnlwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTAuYWJydXB0KCdyZXR1cm4nLCBzeW1FbmNyeXB0ZWRTZXNzaW9uS2V5UGFja2V0KTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDEwLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUxMCwgdGhpcyk7XG4gICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gZW5jcnlwdFBhc3N3b3JkKF94MjcsIF94MjgsIF94MjksIF94MzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjExLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KCk7XG5cbiAgICAgICAgICAgIF9jb250ZXh0MTEubmV4dCA9IDEyO1xuICAgICAgICAgICAgcmV0dXJuIF9wcm9taXNlMi5kZWZhdWx0LmFsbChwYXNzd29yZHMubWFwKGZ1bmN0aW9uIChwd2QpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVuY3J5cHRQYXNzd29yZChzZXNzaW9uS2V5LCBzeW1BbGdvLCBhZWFkQWxnbywgcHdkKTtcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICBfcmVzdWx0cyA9IF9jb250ZXh0MTEuc2VudDtcblxuICAgICAgICAgICAgcGFja2V0bGlzdC5jb25jYXQoX3Jlc3VsdHMpO1xuXG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDExLmFicnVwdCgncmV0dXJuJywgbmV3IE1lc3NhZ2UocGFja2V0bGlzdCkpO1xuXG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTEuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTExLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBlbmNyeXB0U2Vzc2lvbktleShfeDE2LCBfeDE3LCBfeDE4LCBfeDE5LCBfeDIwKSB7XG4gICAgcmV0dXJuIF9yZWY4LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogU2lnbiB0aGUgbWVzc2FnZSAodGhlIGxpdGVyYWwgZGF0YSBwYWNrZXQgb2YgdGhlIG1lc3NhZ2UpXG4gKiBAcGFyYW0gIHtBcnJheTxtb2R1bGU6a2V5LktleT59ICAgICAgICBwcml2YXRlS2V5cyBwcml2YXRlIGtleXMgd2l0aCBkZWNyeXB0ZWQgc2VjcmV0IGtleSBkYXRhIGZvciBzaWduaW5nXG4gKiBAcGFyYW0gIHtTaWduYXR1cmV9IHNpZ25hdHVyZSAgICAgICAgICAob3B0aW9uYWwpIGFueSBleGlzdGluZyBkZXRhY2hlZCBzaWduYXR1cmUgdG8gYWRkIHRvIHRoZSBtZXNzYWdlXG4gKiBAcGFyYW0gIHtEYXRlfSBkYXRlICAgICAgICAgICAgICAgICAgICAob3B0aW9uYWwpIG92ZXJyaWRlIHRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZSBzaWduYXR1cmVcbiAqIEBwYXJhbSAge09iamVjdH0gdXNlcklkICAgICAgICAgICAgICAgIChvcHRpb25hbCkgdXNlciBJRCB0byBzaWduIHdpdGgsIGUuZy4geyBuYW1lOidTdGV2ZSBTZW5kZXInLCBlbWFpbDonc3RldmVAb3BlbnBncC5vcmcnIH1cbiAqIEByZXR1cm5zIHtQcm9taXNlPE1lc3NhZ2U+fSAgICAgICAgICAgICBuZXcgbWVzc2FnZSB3aXRoIHNpZ25lZCBjb250ZW50XG4gKiBAYXN5bmNcbiAqL1xuXG5cbi8qKlxuICogQ3JlYXRlIHNpZ25hdHVyZSBwYWNrZXRzIGZvciB0aGUgbWVzc2FnZVxuICogQHBhcmFtICB7bW9kdWxlOnBhY2tldC5MaXRlcmFsfSAgICAgICAgICAgICBsaXRlcmFsRGF0YVBhY2tldCB0aGUgbGl0ZXJhbCBkYXRhIHBhY2tldCB0byBzaWduXG4gKiBAcGFyYW0gIHtBcnJheTxtb2R1bGU6a2V5LktleT59ICAgICAgICAgICAgIHByaXZhdGVLZXlzIHByaXZhdGUga2V5cyB3aXRoIGRlY3J5cHRlZCBzZWNyZXQga2V5IGRhdGEgZm9yIHNpZ25pbmdcbiAqIEBwYXJhbSAge1NpZ25hdHVyZX0gc2lnbmF0dXJlICAgICAgICAgICAgICAgKG9wdGlvbmFsKSBhbnkgZXhpc3RpbmcgZGV0YWNoZWQgc2lnbmF0dXJlIHRvIGFwcGVuZFxuICogQHBhcmFtICB7RGF0ZX0gZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uYWwpIG92ZXJyaWRlIHRoZSBjcmVhdGlvbnRpbWUgb2YgdGhlIHNpZ25hdHVyZVxuICogQHBhcmFtICB7T2JqZWN0fSB1c2VySWQgICAgICAgICAgICAgICAgICAgICAob3B0aW9uYWwpIHVzZXIgSUQgdG8gc2lnbiB3aXRoLCBlLmcuIHsgbmFtZTonU3RldmUgU2VuZGVyJywgZW1haWw6J3N0ZXZlQG9wZW5wZ3Aub3JnJyB9XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxtb2R1bGU6cGFja2V0Lkxpc3Q+fSBsaXN0IG9mIHNpZ25hdHVyZSBwYWNrZXRzXG4gKiBAYXN5bmNcbiAqL1xudmFyIGNyZWF0ZVNpZ25hdHVyZVBhY2tldHMgPSBleHBvcnRzLmNyZWF0ZVNpZ25hdHVyZVBhY2tldHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMTUgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTE2KGxpdGVyYWxEYXRhUGFja2V0LCBwcml2YXRlS2V5cykge1xuICAgIHZhciBzaWduYXR1cmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG5ldyBEYXRlKCk7XG4gICAgdmFyIHVzZXJJZCA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDoge307XG4gICAgdmFyIHBhY2tldGxpc3QsIHNpZ25hdHVyZVR5cGUsIGV4aXN0aW5nU2lnUGFja2V0bGlzdDtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTE2JChfY29udGV4dDE2KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0MTYucHJldiA9IF9jb250ZXh0MTYubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHBhY2tldGxpc3QgPSBuZXcgX3BhY2tldDIuZGVmYXVsdC5MaXN0KCk7XG5cbiAgICAgICAgICAgIC8vIElmIGRhdGEgcGFja2V0IHdhcyBjcmVhdGVkIGZyb20gVWludDhBcnJheSwgdXNlIGJpbmFyeSwgb3RoZXJ3aXNlIHVzZSB0ZXh0XG5cbiAgICAgICAgICAgIHNpZ25hdHVyZVR5cGUgPSBsaXRlcmFsRGF0YVBhY2tldC50ZXh0ID09PSBudWxsID8gX2VudW1zMi5kZWZhdWx0LnNpZ25hdHVyZS5iaW5hcnkgOiBfZW51bXMyLmRlZmF1bHQuc2lnbmF0dXJlLnRleHQ7XG4gICAgICAgICAgICBfY29udGV4dDE2Lm5leHQgPSA0O1xuICAgICAgICAgICAgcmV0dXJuIF9wcm9taXNlMi5kZWZhdWx0LmFsbChwcml2YXRlS2V5cy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX3JlZjE2ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxNShwcml2YXRlS2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpZ25pbmdLZXlQYWNrZXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxNSQoX2NvbnRleHQxNSkge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDE1LnByZXYgPSBfY29udGV4dDE1Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByaXZhdGVLZXkuaXNQdWJsaWMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1Lm5leHQgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIHByaXZhdGUga2V5IGZvciBzaWduaW5nJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1Lm5leHQgPSA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByaXZhdGVLZXkuZ2V0U2lnbmluZ0tleVBhY2tldCh1bmRlZmluZWQsIGRhdGUsIHVzZXJJZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduaW5nS2V5UGFja2V0ID0gX2NvbnRleHQxNS5zZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmluZ0tleVBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1Lm5leHQgPSA3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCB2YWxpZCBzaWduaW5nIGtleSBwYWNrZXQgaW4ga2V5ICcgKyBwcml2YXRlS2V5LnByaW1hcnlLZXkuZ2V0S2V5SWQoKS50b0hleCgpKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE1LmFicnVwdCgncmV0dXJuJywgKDAsIF9rZXkuY3JlYXRlU2lnbmF0dXJlUGFja2V0KShsaXRlcmFsRGF0YVBhY2tldCwgcHJpdmF0ZUtleSwgc2lnbmluZ0tleVBhY2tldCwgeyBzaWduYXR1cmVUeXBlOiBzaWduYXR1cmVUeXBlIH0sIGRhdGUsIHVzZXJJZCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNS5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMTUsIF90aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g0Nikge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVmMTYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0oKSkpLnRoZW4oZnVuY3Rpb24gKHNpZ25hdHVyZUxpc3QpIHtcbiAgICAgICAgICAgICAgc2lnbmF0dXJlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChzaWduYXR1cmVQYWNrZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFja2V0bGlzdC5wdXNoKHNpZ25hdHVyZVBhY2tldCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIDQ6XG5cbiAgICAgICAgICAgIGlmIChzaWduYXR1cmUpIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmdTaWdQYWNrZXRsaXN0ID0gc2lnbmF0dXJlLnBhY2tldHMuZmlsdGVyQnlUYWcoX2VudW1zMi5kZWZhdWx0LnBhY2tldC5zaWduYXR1cmUpO1xuXG4gICAgICAgICAgICAgIHBhY2tldGxpc3QuY29uY2F0KGV4aXN0aW5nU2lnUGFja2V0bGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNi5hYnJ1cHQoJ3JldHVybicsIHBhY2tldGxpc3QpO1xuXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNi5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMTYsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVNpZ25hdHVyZVBhY2tldHMoX3g0MSwgX3g0Mikge1xuICAgIHJldHVybiBfcmVmMTUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBWZXJpZnkgbWVzc2FnZSBzaWduYXR1cmVzXG4gKiBAcGFyYW0ge0FycmF5PG1vZHVsZTprZXkuS2V5Pn0ga2V5cyBhcnJheSBvZiBrZXlzIHRvIHZlcmlmeSBzaWduYXR1cmVzXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGUgKG9wdGlvbmFsKSBWZXJpZnkgdGhlIHNpZ25hdHVyZSBhZ2FpbnN0IHRoZSBnaXZlbiBkYXRlLCBpLmUuIGNoZWNrIHNpZ25hdHVyZSBjcmVhdGlvbiB0aW1lIDwgZGF0ZSA8IGV4cGlyYXRpb24gdGltZVxuICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8KHtrZXlpZDogbW9kdWxlOnR5cGUva2V5aWQsIHZhbGlkOiBCb29sZWFufSk+Pn0gbGlzdCBvZiBzaWduZXIncyBrZXlpZCBhbmQgdmFsaWRpdHkgb2Ygc2lnbmF0dXJlXG4gKiBAYXN5bmNcbiAqL1xuXG5cbi8qKlxuICogQ3JlYXRlIGxpc3Qgb2Ygb2JqZWN0cyBjb250YWluaW5nIHNpZ25lcidzIGtleWlkIGFuZCB2YWxpZGl0eSBvZiBzaWduYXR1cmVcbiAqIEBwYXJhbSB7QXJyYXk8bW9kdWxlOnBhY2tldC5TaWduYXR1cmU+fSBzaWduYXR1cmVMaXN0IGFycmF5IG9mIHNpZ25hdHVyZSBwYWNrZXRzXG4gKiBAcGFyYW0ge0FycmF5PG1vZHVsZTpwYWNrZXQuTGl0ZXJhbD59IGxpdGVyYWxEYXRhTGlzdCBhcnJheSBvZiBsaXRlcmFsIGRhdGEgcGFja2V0c1xuICogQHBhcmFtIHtBcnJheTxtb2R1bGU6a2V5LktleT59IGtleXMgYXJyYXkgb2Yga2V5cyB0byB2ZXJpZnkgc2lnbmF0dXJlc1xuICogQHBhcmFtIHtEYXRlfSBkYXRlIFZlcmlmeSB0aGUgc2lnbmF0dXJlIGFnYWluc3QgdGhlIGdpdmVuIGRhdGUsXG4gKiAgICAgICAgICAgICAgICAgICAgaS5lLiBjaGVjayBzaWduYXR1cmUgY3JlYXRpb24gdGltZSA8IGRhdGUgPCBleHBpcmF0aW9uIHRpbWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHtrZXlpZDogbW9kdWxlOnR5cGUva2V5aWQsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IEJvb2xlYW59Pj59IGxpc3Qgb2Ygc2lnbmVyJ3Mga2V5aWQgYW5kIHZhbGlkaXR5IG9mIHNpZ25hdHVyZVxuICogQGFzeW5jXG4gKi9cbnZhciBjcmVhdGVWZXJpZmljYXRpb25PYmplY3RzID0gZXhwb3J0cy5jcmVhdGVWZXJpZmljYXRpb25PYmplY3RzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjE3ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxOShzaWduYXR1cmVMaXN0LCBsaXRlcmFsRGF0YUxpc3QsIGtleXMpIHtcbiAgICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbmV3IERhdGUoKTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTE5JChfY29udGV4dDE5KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0MTkucHJldiA9IF9jb250ZXh0MTkubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE5LmFicnVwdCgncmV0dXJuJywgX3Byb21pc2UyLmRlZmF1bHQuYWxsKHNpZ25hdHVyZUxpc3QubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIF9yZWYxOCA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMTgoc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleVBhY2tldCwgdmVyaWZpZWRTaWcsIHBhY2tldGxpc3Q7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxOCQoX2NvbnRleHQxOCkge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDE4LnByZXYgPSBfY29udGV4dDE4Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlQYWNrZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwoa2V5cy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3JlZjE5ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxNyhrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMTckKF9jb250ZXh0MTcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQxNy5wcmV2ID0gX2NvbnRleHQxNy5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNy5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkuZ2V0U2lnbmluZ0tleVBhY2tldChzaWduYXR1cmUuaXNzdWVyS2V5SWQsIGRhdGUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2NvbnRleHQxNy5zZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVBhY2tldCA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTcuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTE3LCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g1NCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVmMTkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0oKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxOC50MCA9IHNpZ25hdHVyZS5pc3N1ZXJLZXlJZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXlQYWNrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gMTA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE4Lm5leHQgPSA3O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ25hdHVyZS52ZXJpZnkoa2V5UGFja2V0LCBsaXRlcmFsRGF0YUxpc3RbMF0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxOC50MSA9IF9jb250ZXh0MTguc2VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTgubmV4dCA9IDExO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxOC50MSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxOC50MiA9IF9jb250ZXh0MTgudDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZmllZFNpZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2V5aWQ6IF9jb250ZXh0MTgudDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkOiBfY29udGV4dDE4LnQyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0bGlzdCA9IG5ldyBfcGFja2V0Mi5kZWZhdWx0Lkxpc3QoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0bGlzdC5wdXNoKHNpZ25hdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZmllZFNpZy5zaWduYXR1cmUgPSBuZXcgX3NpZ25hdHVyZS5TaWduYXR1cmUocGFja2V0bGlzdCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE4LmFicnVwdCgncmV0dXJuJywgdmVyaWZpZWRTaWcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTguc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgX2NhbGxlZTE4LCB0aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g1Mykge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVmMTguYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0oKSkpKTtcblxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTkuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTE5LCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVWZXJpZmljYXRpb25PYmplY3RzKF94NDksIF94NTAsIF94NTEpIHtcbiAgICByZXR1cm4gX3JlZjE3LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogVW53cmFwIGNvbXByZXNzZWQgbWVzc2FnZVxuICogQHJldHVybnMge21vZHVsZTptZXNzYWdlLk1lc3NhZ2V9IG1lc3NhZ2UgQ29udGVudCBvZiBjb21wcmVzc2VkIG1lc3NhZ2VcbiAqL1xuXG5cbmV4cG9ydHMuTWVzc2FnZSA9IE1lc3NhZ2U7XG5leHBvcnRzLnJlYWRBcm1vcmVkID0gcmVhZEFybW9yZWQ7XG5leHBvcnRzLnJlYWQgPSByZWFkO1xuZXhwb3J0cy5mcm9tVGV4dCA9IGZyb21UZXh0O1xuZXhwb3J0cy5mcm9tQmluYXJ5ID0gZnJvbUJpbmFyeTtcblxudmFyIF9hcm1vciA9IF9kZXJlcV8oJy4vZW5jb2RpbmcvYXJtb3InKTtcblxudmFyIF9hcm1vcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hcm1vcik7XG5cbnZhciBfa2V5aWQgPSBfZGVyZXFfKCcuL3R5cGUva2V5aWQnKTtcblxudmFyIF9rZXlpZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9rZXlpZCk7XG5cbnZhciBfY29uZmlnID0gX2RlcmVxXygnLi9jb25maWcnKTtcblxudmFyIF9jb25maWcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29uZmlnKTtcblxudmFyIF9jcnlwdG8gPSBfZGVyZXFfKCcuL2NyeXB0bycpO1xuXG52YXIgX2NyeXB0bzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcnlwdG8pO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi9lbnVtcycpO1xuXG52YXIgX2VudW1zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VudW1zKTtcblxudmFyIF91dGlsID0gX2RlcmVxXygnLi91dGlsJyk7XG5cbnZhciBfdXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKTtcblxudmFyIF9wYWNrZXQgPSBfZGVyZXFfKCcuL3BhY2tldCcpO1xuXG52YXIgX3BhY2tldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wYWNrZXQpO1xuXG52YXIgX3NpZ25hdHVyZSA9IF9kZXJlcV8oJy4vc2lnbmF0dXJlJyk7XG5cbnZhciBfa2V5ID0gX2RlcmVxXygnLi9rZXknKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgQ2xhc3MgdGhhdCByZXByZXNlbnRzIGFuIE9wZW5QR1AgbWVzc2FnZS5cbiAqIENhbiBiZSBhbiBlbmNyeXB0ZWQgbWVzc2FnZSwgc2lnbmVkIG1lc3NhZ2UsIGNvbXByZXNzZWQgbWVzc2FnZSBvciBsaXRlcmFsIG1lc3NhZ2VcbiAqIEBwYXJhbSAge21vZHVsZTpwYWNrZXQuTGlzdH0gcGFja2V0bGlzdCBUaGUgcGFja2V0cyB0aGF0IGZvcm0gdGhpcyBtZXNzYWdlXG4gKiBTZWUge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tMTEuM31cbiAqL1xuXG5mdW5jdGlvbiBNZXNzYWdlKHBhY2tldGxpc3QpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIG5ldyBNZXNzYWdlKHBhY2tldGxpc3QpO1xuICB9XG4gIHRoaXMucGFja2V0cyA9IHBhY2tldGxpc3QgfHwgbmV3IF9wYWNrZXQyLmRlZmF1bHQuTGlzdCgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGtleSBJRHMgb2YgdGhlIGtleXMgdG8gd2hpY2ggdGhlIHNlc3Npb24ga2V5IGlzIGVuY3J5cHRlZFxuICogQHJldHVybnMge0FycmF5PG1vZHVsZTp0eXBlL2tleWlkPn0gYXJyYXkgb2Yga2V5aWQgb2JqZWN0c1xuICovXG4vLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEByZXF1aXJlcyBlbmNvZGluZy9hcm1vclxuICogQHJlcXVpcmVzIHR5cGUva2V5aWRcbiAqIEByZXF1aXJlcyBjb25maWdcbiAqIEByZXF1aXJlcyBjcnlwdG9cbiAqIEByZXF1aXJlcyBlbnVtc1xuICogQHJlcXVpcmVzIHV0aWxcbiAqIEByZXF1aXJlcyBwYWNrZXRcbiAqIEByZXF1aXJlcyBzaWduYXR1cmVcbiAqIEByZXF1aXJlcyBrZXlcbiAqIEBtb2R1bGUgbWVzc2FnZVxuICovXG5cbk1lc3NhZ2UucHJvdG90eXBlLmdldEVuY3J5cHRpb25LZXlJZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBrZXlJZHMgPSBbXTtcbiAgdmFyIHBrRVNLZXlQYWNrZXRsaXN0ID0gdGhpcy5wYWNrZXRzLmZpbHRlckJ5VGFnKF9lbnVtczIuZGVmYXVsdC5wYWNrZXQucHVibGljS2V5RW5jcnlwdGVkU2Vzc2lvbktleSk7XG4gIHBrRVNLZXlQYWNrZXRsaXN0LmZvckVhY2goZnVuY3Rpb24gKHBhY2tldCkge1xuICAgIGtleUlkcy5wdXNoKHBhY2tldC5wdWJsaWNLZXlJZCk7XG4gIH0pO1xuICByZXR1cm4ga2V5SWRzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXkgSURzIG9mIHRoZSBrZXlzIHRoYXQgc2lnbmVkIHRoZSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7QXJyYXk8bW9kdWxlOnR5cGUva2V5aWQ+fSBhcnJheSBvZiBrZXlpZCBvYmplY3RzXG4gKi9cbk1lc3NhZ2UucHJvdG90eXBlLmdldFNpZ25pbmdLZXlJZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBrZXlJZHMgPSBbXTtcbiAgdmFyIG1zZyA9IHRoaXMudW53cmFwQ29tcHJlc3NlZCgpO1xuICAvLyBzZWFyY2ggZm9yIG9uZSBwYXNzIHNpZ25hdHVyZXNcbiAgdmFyIG9uZVBhc3NTaWdMaXN0ID0gbXNnLnBhY2tldHMuZmlsdGVyQnlUYWcoX2VudW1zMi5kZWZhdWx0LnBhY2tldC5vbmVQYXNzU2lnbmF0dXJlKTtcbiAgb25lUGFzc1NpZ0xpc3QuZm9yRWFjaChmdW5jdGlvbiAocGFja2V0KSB7XG4gICAga2V5SWRzLnB1c2gocGFja2V0LnNpZ25pbmdLZXlJZCk7XG4gIH0pO1xuICAvLyBpZiBub3RoaW5nIGZvdW5kIGxvb2sgZm9yIHNpZ25hdHVyZSBwYWNrZXRzXG4gIGlmICgha2V5SWRzLmxlbmd0aCkge1xuICAgIHZhciBzaWduYXR1cmVMaXN0ID0gbXNnLnBhY2tldHMuZmlsdGVyQnlUYWcoX2VudW1zMi5kZWZhdWx0LnBhY2tldC5zaWduYXR1cmUpO1xuICAgIHNpZ25hdHVyZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAocGFja2V0KSB7XG4gICAgICBrZXlJZHMucHVzaChwYWNrZXQuaXNzdWVyS2V5SWQpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBrZXlJZHM7XG59O1xuXG4vKipcbiAqIERlY3J5cHQgdGhlIG1lc3NhZ2UuIEVpdGhlciBhIHByaXZhdGUga2V5LCBhIHNlc3Npb24ga2V5LCBvciBhIHBhc3N3b3JkIG11c3QgYmUgc3BlY2lmaWVkLlxuICogQHBhcmFtICB7QXJyYXk8S2V5Pn0gcHJpdmF0ZUtleXMgICAgIChvcHRpb25hbCkgcHJpdmF0ZSBrZXlzIHdpdGggZGVjcnlwdGVkIHNlY3JldCBkYXRhXG4gKiBAcGFyYW0gIHtBcnJheTxTdHJpbmc+fSBwYXNzd29yZHMgICAgKG9wdGlvbmFsKSBwYXNzd29yZHMgdXNlZCB0byBkZWNyeXB0XG4gKiBAcGFyYW0gIHtBcnJheTxPYmplY3Q+fSBzZXNzaW9uS2V5cyAgKG9wdGlvbmFsKSBzZXNzaW9uIGtleXMgaW4gdGhlIGZvcm06IHsgZGF0YTpVaW50OEFycmF5LCBhbGdvcml0aG06U3RyaW5nLCBbYWVhZEFsZ29yaXRobTpTdHJpbmddIH1cbiAqIEByZXR1cm5zIHtQcm9taXNlPE1lc3NhZ2U+fSAgICAgICAgICAgICBuZXcgbWVzc2FnZSB3aXRoIGRlY3J5cHRlZCBjb250ZW50XG4gKiBAYXN5bmNcbiAqL1xuTWVzc2FnZS5wcm90b3R5cGUuZGVjcnlwdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZShwcml2YXRlS2V5cywgcGFzc3dvcmRzLCBzZXNzaW9uS2V5cykge1xuICAgIHZhciBrZXlPYmpzLCBzeW1FbmNyeXB0ZWRQYWNrZXRsaXN0LCBzeW1FbmNyeXB0ZWRQYWNrZXQsIGV4Y2VwdGlvbiwgaSwgcmVzdWx0TXNnO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gc2Vzc2lvbktleXM7XG5cbiAgICAgICAgICAgIGlmIChfY29udGV4dC50MCkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdFNlc3Npb25LZXlzKHByaXZhdGVLZXlzLCBwYXNzd29yZHMpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgX2NvbnRleHQudDAgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAga2V5T2JqcyA9IF9jb250ZXh0LnQwO1xuICAgICAgICAgICAgc3ltRW5jcnlwdGVkUGFja2V0bGlzdCA9IHRoaXMucGFja2V0cy5maWx0ZXJCeVRhZyhfZW51bXMyLmRlZmF1bHQucGFja2V0LnN5bW1ldHJpY2FsbHlFbmNyeXB0ZWQsIF9lbnVtczIuZGVmYXVsdC5wYWNrZXQuc3ltRW5jcnlwdGVkSW50ZWdyaXR5UHJvdGVjdGVkLCBfZW51bXMyLmRlZmF1bHQucGFja2V0LnN5bUVuY3J5cHRlZEFFQURQcm90ZWN0ZWQpO1xuXG4gICAgICAgICAgICBpZiAoIShzeW1FbmNyeXB0ZWRQYWNrZXRsaXN0Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCB0aGlzKTtcblxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgIHN5bUVuY3J5cHRlZFBhY2tldCA9IHN5bUVuY3J5cHRlZFBhY2tldGxpc3RbMF07XG4gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsO1xuICAgICAgICAgICAgaSA9IDA7XG5cbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgaWYgKCEoaSA8IGtleU9ianMubGVuZ3RoKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoISgha2V5T2Jqc1tpXSB8fCAhX3V0aWwyLmRlZmF1bHQuaXNVaW50OEFycmF5KGtleU9ianNbaV0uZGF0YSkgfHwgIV91dGlsMi5kZWZhdWx0LmlzU3RyaW5nKGtleU9ianNbaV0uYWxnb3JpdGhtKSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE1O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNlc3Npb24ga2V5IGZvciBkZWNyeXB0aW9uLicpO1xuXG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxNTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxODtcbiAgICAgICAgICAgIHJldHVybiBzeW1FbmNyeXB0ZWRQYWNrZXQuZGVjcnlwdChrZXlPYmpzW2ldLmFsZ29yaXRobSwga2V5T2Jqc1tpXS5kYXRhKTtcblxuICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdicmVhaycsIDI3KTtcblxuICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjE7XG4gICAgICAgICAgICBfY29udGV4dC50MSA9IF9jb250ZXh0WydjYXRjaCddKDE1KTtcblxuICAgICAgICAgICAgZXhjZXB0aW9uID0gX2NvbnRleHQudDE7XG5cbiAgICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgaWYgKCEoIXN5bUVuY3J5cHRlZFBhY2tldC5wYWNrZXRzIHx8ICFzeW1FbmNyeXB0ZWRQYWNrZXQucGFja2V0cy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyOTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbiB8fCBuZXcgRXJyb3IoJ0RlY3J5cHRpb24gZmFpbGVkLicpO1xuXG4gICAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICAgIHJlc3VsdE1zZyA9IG5ldyBNZXNzYWdlKHN5bUVuY3J5cHRlZFBhY2tldC5wYWNrZXRzKTtcblxuICAgICAgICAgICAgc3ltRW5jcnlwdGVkUGFja2V0LnBhY2tldHMgPSBuZXcgX3BhY2tldDIuZGVmYXVsdC5MaXN0KCk7IC8vIHJlbW92ZSBwYWNrZXRzIGFmdGVyIGRlY3J5cHRpb25cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgncmV0dXJuJywgcmVzdWx0TXNnKTtcblxuICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCB0aGlzLCBbWzE1LCAyMV1dKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3gsIF94MiwgX3gzKSB7XG4gICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBEZWNyeXB0IGVuY3J5cHRlZCBzZXNzaW9uIGtleXMgZWl0aGVyIHdpdGggcHJpdmF0ZSBrZXlzIG9yIHBhc3N3b3Jkcy5cbiAqIEBwYXJhbSAge0FycmF5PEtleT59IHByaXZhdGVLZXlzICAgIChvcHRpb25hbCkgcHJpdmF0ZSBrZXlzIHdpdGggZGVjcnlwdGVkIHNlY3JldCBkYXRhXG4gKiBAcGFyYW0gIHtBcnJheTxTdHJpbmc+fSBwYXNzd29yZHMgICAob3B0aW9uYWwpIHBhc3N3b3JkcyB1c2VkIHRvIGRlY3J5cHRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHsgZGF0YTogICAgICBVaW50OEFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG06IFN0cmluZyB9Pj59IGFycmF5IG9mIG9iamVjdCB3aXRoIHBvdGVudGlhbCBzZXNzaW9uS2V5LCBhbGdvcml0aG0gcGFpcnNcbiAqIEBhc3luY1xuICovXG5NZXNzYWdlLnByb3RvdHlwZS5kZWNyeXB0U2Vzc2lvbktleXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlNihwcml2YXRlS2V5cywgcGFzc3dvcmRzKSB7XG4gICAgdmFyIGtleVBhY2tldHMsIHN5bUVTS2V5UGFja2V0bGlzdCwgcGtFU0tleVBhY2tldGxpc3QsIHNlZW47XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWU2JChfY29udGV4dDYpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQ2LnByZXYgPSBfY29udGV4dDYubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGtleVBhY2tldHMgPSBbXTtcblxuICAgICAgICAgICAgaWYgKCFwYXNzd29yZHMpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSA5O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3ltRVNLZXlQYWNrZXRsaXN0ID0gdGhpcy5wYWNrZXRzLmZpbHRlckJ5VGFnKF9lbnVtczIuZGVmYXVsdC5wYWNrZXQuc3ltRW5jcnlwdGVkU2Vzc2lvbktleSk7XG5cbiAgICAgICAgICAgIGlmIChzeW1FU0tleVBhY2tldGxpc3QpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSA1O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzeW1tZXRyaWNhbGx5IGVuY3J5cHRlZCBzZXNzaW9uIGtleSBwYWNrZXQgZm91bmQuJyk7XG5cbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDc7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQuYWxsKHN5bUVTS2V5UGFja2V0bGlzdC5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX3JlZjMgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMoa2V5UGFja2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHtcbiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwocGFzc3dvcmRzLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcmVmNCA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMihwYXNzd29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5UGFja2V0LmRlY3J5cHQocGFzc3dvcmQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5UGFja2V0cy5wdXNoKGtleVBhY2tldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gNjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IF9jb250ZXh0MlsnY2F0Y2gnXSgwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3V0aWwyLmRlZmF1bHQucHJpbnRfZGVidWdfZXJyb3IoX2NvbnRleHQyLnQwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMiwgdGhpcywgW1swLCA2XV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0oKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUzLCB0aGlzKTtcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KCkpKTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgIGlmICghcHJpdmF0ZUtleXMpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSAxNztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBrRVNLZXlQYWNrZXRsaXN0ID0gdGhpcy5wYWNrZXRzLmZpbHRlckJ5VGFnKF9lbnVtczIuZGVmYXVsdC5wYWNrZXQucHVibGljS2V5RW5jcnlwdGVkU2Vzc2lvbktleSk7XG5cbiAgICAgICAgICAgIGlmIChwa0VTS2V5UGFja2V0bGlzdCkge1xuICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDEzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBwdWJsaWMga2V5IGVuY3J5cHRlZCBzZXNzaW9uIGtleSBwYWNrZXQgZm91bmQuJyk7XG5cbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSAxNTtcbiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwocGtFU0tleVBhY2tldGxpc3QubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIF9yZWY1ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KGtleVBhY2tldCkge1xuICAgICAgICAgICAgICAgIHZhciBwcml2YXRlS2V5UGFja2V0cztcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTUkKF9jb250ZXh0NSkge1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDUucHJldiA9IF9jb250ZXh0NS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBpbXByb3ZlIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGVLZXlQYWNrZXRzID0gcHJpdmF0ZUtleXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHByaXZhdGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQocHJpdmF0ZUtleS5nZXRLZXlQYWNrZXRzKGtleVBhY2tldC5wdWJsaWNLZXlJZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgbmV3IF9wYWNrZXQyLmRlZmF1bHQuTGlzdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwocHJpdmF0ZUtleVBhY2tldHMubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9yZWY2ID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KHByaXZhdGVLZXlQYWNrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByaXZhdGVLZXlQYWNrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoJ3JldHVybicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByaXZhdGVLZXlQYWNrZXQuaXNEZWNyeXB0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcml2YXRlIGtleSBpcyBub3QgZGVjcnlwdGVkLicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0LnByZXYgPSA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleVBhY2tldC5kZWNyeXB0KHByaXZhdGVLZXlQYWNrZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5UGFja2V0cy5wdXNoKGtleVBhY2tldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDEzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0LnByZXYgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC50MCA9IF9jb250ZXh0NFsnY2F0Y2gnXSg0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3V0aWwyLmRlZmF1bHQucHJpbnRfZGVidWdfZXJyb3IoX2NvbnRleHQ0LnQwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTQsIHRoaXMsIFtbNCwgMTBdXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF94OSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSgpKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgX2NhbGxlZTUsIHRoaXMpO1xuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0oKSkpO1xuXG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGtleSBvciBwYXNzd29yZCBzcGVjaWZpZWQuJyk7XG5cbiAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgaWYgKCFrZXlQYWNrZXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDIxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmV0dXJuIG9ubHkgdW5pcXVlIHNlc3Npb24ga2V5c1xuICAgICAgICAgICAgaWYgKGtleVBhY2tldHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICBzZWVuID0ge307XG5cbiAgICAgICAgICAgICAga2V5UGFja2V0cyA9IGtleVBhY2tldHMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSBpdGVtLnNlc3Npb25LZXlBbGdvcml0aG0gKyBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cihpdGVtLnNlc3Npb25LZXkpO1xuICAgICAgICAgICAgICAgIGlmIChzZWVuLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlZW5ba10gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5hYnJ1cHQoJ3JldHVybicsIGtleVBhY2tldHMubWFwKGZ1bmN0aW9uIChwYWNrZXQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogcGFja2V0LnNlc3Npb25LZXksIGFsZ29yaXRobTogcGFja2V0LnNlc3Npb25LZXlBbGdvcml0aG0gfTtcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nlc3Npb24ga2V5IGRlY3J5cHRpb24gZmFpbGVkLicpO1xuXG4gICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlNiwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94NCwgX3g1KSB7XG4gICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogR2V0IGxpdGVyYWwgZGF0YSB0aGF0IGlzIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7KFVpbnQ4QXJyYXl8bnVsbCl9IGxpdGVyYWwgYm9keSBvZiB0aGUgbWVzc2FnZSBhcyBVaW50OEFycmF5XG4gKi9cbk1lc3NhZ2UucHJvdG90eXBlLmdldExpdGVyYWxEYXRhID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbGl0ZXJhbCA9IHRoaXMucGFja2V0cy5maW5kUGFja2V0KF9lbnVtczIuZGVmYXVsdC5wYWNrZXQubGl0ZXJhbCk7XG4gIHJldHVybiBsaXRlcmFsICYmIGxpdGVyYWwuZ2V0Qnl0ZXMoKSB8fCBudWxsO1xufTtcblxuLyoqXG4gKiBHZXQgZmlsZW5hbWUgZnJvbSBsaXRlcmFsIGRhdGEgcGFja2V0XG4gKiBAcmV0dXJucyB7KFN0cmluZ3xudWxsKX0gZmlsZW5hbWUgb2YgbGl0ZXJhbCBkYXRhIHBhY2tldCBhcyBzdHJpbmdcbiAqL1xuTWVzc2FnZS5wcm90b3R5cGUuZ2V0RmlsZW5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsaXRlcmFsID0gdGhpcy5wYWNrZXRzLmZpbmRQYWNrZXQoX2VudW1zMi5kZWZhdWx0LnBhY2tldC5saXRlcmFsKTtcbiAgcmV0dXJuIGxpdGVyYWwgJiYgbGl0ZXJhbC5nZXRGaWxlbmFtZSgpIHx8IG51bGw7XG59O1xuXG4vKipcbiAqIEdldCBsaXRlcmFsIGRhdGEgYXMgdGV4dFxuICogQHJldHVybnMgeyhTdHJpbmd8bnVsbCl9IGxpdGVyYWwgYm9keSBvZiB0aGUgbWVzc2FnZSBpbnRlcnByZXRlZCBhcyB0ZXh0XG4gKi9cbk1lc3NhZ2UucHJvdG90eXBlLmdldFRleHQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsaXRlcmFsID0gdGhpcy5wYWNrZXRzLmZpbmRQYWNrZXQoX2VudW1zMi5kZWZhdWx0LnBhY2tldC5saXRlcmFsKTtcbiAgaWYgKGxpdGVyYWwpIHtcbiAgICByZXR1cm4gbGl0ZXJhbC5nZXRUZXh0KCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIEVuY3J5cHQgdGhlIG1lc3NhZ2UgZWl0aGVyIHdpdGggcHVibGljIGtleXMsIHBhc3N3b3Jkcywgb3IgYm90aCBhdCBvbmNlLlxuICogQHBhcmFtICB7QXJyYXk8S2V5Pn0ga2V5cyAgICAgICAgICAgKG9wdGlvbmFsKSBwdWJsaWMga2V5KHMpIGZvciBtZXNzYWdlIGVuY3J5cHRpb25cbiAqIEBwYXJhbSAge0FycmF5PFN0cmluZz59IHBhc3N3b3JkcyAgIChvcHRpb25hbCkgcGFzc3dvcmQocykgZm9yIG1lc3NhZ2UgZW5jcnlwdGlvblxuICogQHBhcmFtICB7T2JqZWN0fSBzZXNzaW9uS2V5ICAgICAgICAgKG9wdGlvbmFsKSBzZXNzaW9uIGtleSBpbiB0aGUgZm9ybTogeyBkYXRhOlVpbnQ4QXJyYXksIGFsZ29yaXRobTpTdHJpbmcsIFthZWFkQWxnb3JpdGhtOlN0cmluZ10gfVxuICogQHBhcmFtICB7Qm9vbGVhbn0gd2lsZGNhcmQgICAgICAgICAgKG9wdGlvbmFsKSB1c2UgYSBrZXkgSUQgb2YgMCBpbnN0ZWFkIG9mIHRoZSBwdWJsaWMga2V5IElEc1xuICogQHBhcmFtICB7RGF0ZX0gZGF0ZSAgICAgICAgICAgICAgICAgKG9wdGlvbmFsKSBvdmVycmlkZSB0aGUgY3JlYXRpb24gZGF0ZSBvZiB0aGUgbGl0ZXJhbCBwYWNrYWdlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHVzZXJJZCAgICAgICAgICAgICAob3B0aW9uYWwpIHVzZXIgSUQgdG8gZW5jcnlwdCBmb3IsIGUuZy4geyBuYW1lOidSb2JlcnQgUmVjZWl2ZXInLCBlbWFpbDoncm9iZXJ0QG9wZW5wZ3Aub3JnJyB9XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxNZXNzYWdlPn0gICAgICAgICAgICAgICAgICAgbmV3IG1lc3NhZ2Ugd2l0aCBlbmNyeXB0ZWQgY29udGVudFxuICogQGFzeW5jXG4gKi9cbk1lc3NhZ2UucHJvdG90eXBlLmVuY3J5cHQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmNyA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlNyhrZXlzLCBwYXNzd29yZHMsIHNlc3Npb25LZXkpIHtcbiAgICB2YXIgd2lsZGNhcmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuICAgIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBuZXcgRGF0ZSgpO1xuICAgIHZhciB1c2VySWQgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IHt9O1xuICAgIHZhciBzeW1BbGdvLCBhZWFkQWxnbywgc3ltRW5jcnlwdGVkUGFja2V0LCBtc2c7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWU3JChfY29udGV4dDcpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQ3LnByZXYgPSBfY29udGV4dDcubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHN5bUFsZ28gPSB2b2lkIDA7XG4gICAgICAgICAgICBhZWFkQWxnbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHN5bUVuY3J5cHRlZFBhY2tldCA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKCFzZXNzaW9uS2V5KSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMTE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoISghX3V0aWwyLmRlZmF1bHQuaXNVaW50OEFycmF5KHNlc3Npb25LZXkuZGF0YSkgfHwgIV91dGlsMi5kZWZhdWx0LmlzU3RyaW5nKHNlc3Npb25LZXkuYWxnb3JpdGhtKSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSA2O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNlc3Npb24ga2V5IGZvciBlbmNyeXB0aW9uLicpO1xuXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgc3ltQWxnbyA9IHNlc3Npb25LZXkuYWxnb3JpdGhtO1xuICAgICAgICAgICAgYWVhZEFsZ28gPSBzZXNzaW9uS2V5LmFlYWRBbGdvcml0aG07XG4gICAgICAgICAgICBzZXNzaW9uS2V5ID0gc2Vzc2lvbktleS5kYXRhO1xuICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSAzODtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIGlmICghKGtleXMgJiYga2V5cy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMzI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dDcudDAgPSBfZW51bXMyLmRlZmF1bHQ7XG4gICAgICAgICAgICBfY29udGV4dDcudDEgPSBfZW51bXMyLmRlZmF1bHQuc3ltbWV0cmljO1xuICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSAxNjtcbiAgICAgICAgICAgIHJldHVybiAoMCwgX2tleS5nZXRQcmVmZXJyZWRBbGdvKSgnc3ltbWV0cmljJywga2V5cywgZGF0ZSwgdXNlcklkKTtcblxuICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICBfY29udGV4dDcudDIgPSBfY29udGV4dDcuc2VudDtcbiAgICAgICAgICAgIHN5bUFsZ28gPSBfY29udGV4dDcudDAucmVhZC5jYWxsKF9jb250ZXh0Ny50MCwgX2NvbnRleHQ3LnQxLCBfY29udGV4dDcudDIpO1xuICAgICAgICAgICAgX2NvbnRleHQ3LnQzID0gX2NvbmZpZzIuZGVmYXVsdC5hZWFkX3Byb3RlY3QgJiYgX2NvbmZpZzIuZGVmYXVsdC5hZWFkX3Byb3RlY3RfdmVyc2lvbiA9PT0gNDtcblxuICAgICAgICAgICAgaWYgKCFfY29udGV4dDcudDMpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSAyMztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMjI7XG4gICAgICAgICAgICByZXR1cm4gKDAsIF9rZXkuaXNBZWFkU3VwcG9ydGVkKShrZXlzLCBkYXRlLCB1c2VySWQpO1xuXG4gICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgIF9jb250ZXh0Ny50MyA9IF9jb250ZXh0Ny5zZW50O1xuXG4gICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgIGlmICghX2NvbnRleHQ3LnQzKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMzA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dDcudDQgPSBfZW51bXMyLmRlZmF1bHQ7XG4gICAgICAgICAgICBfY29udGV4dDcudDUgPSBfZW51bXMyLmRlZmF1bHQuYWVhZDtcbiAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMjg7XG4gICAgICAgICAgICByZXR1cm4gKDAsIF9rZXkuZ2V0UHJlZmVycmVkQWxnbykoJ2FlYWQnLCBrZXlzLCBkYXRlLCB1c2VySWQpO1xuXG4gICAgICAgICAgY2FzZSAyODpcbiAgICAgICAgICAgIF9jb250ZXh0Ny50NiA9IF9jb250ZXh0Ny5zZW50O1xuICAgICAgICAgICAgYWVhZEFsZ28gPSBfY29udGV4dDcudDQucmVhZC5jYWxsKF9jb250ZXh0Ny50NCwgX2NvbnRleHQ3LnQ1LCBfY29udGV4dDcudDYpO1xuXG4gICAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMzg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICBpZiAoIShwYXNzd29yZHMgJiYgcGFzc3dvcmRzLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSAzNztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN5bUFsZ28gPSBfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQuc3ltbWV0cmljLCBfY29uZmlnMi5kZWZhdWx0LmVuY3J5cHRpb25fY2lwaGVyKTtcbiAgICAgICAgICAgIGFlYWRBbGdvID0gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LmFlYWQsIF9jb25maWcyLmRlZmF1bHQuYWVhZF9tb2RlKTtcbiAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMzg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGtleXMsIHBhc3N3b3Jkcywgb3Igc2Vzc2lvbiBrZXkgcHJvdmlkZWQuJyk7XG5cbiAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgaWYgKHNlc3Npb25LZXkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSA0MjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gNDE7XG4gICAgICAgICAgICByZXR1cm4gX2NyeXB0bzIuZGVmYXVsdC5nZW5lcmF0ZVNlc3Npb25LZXkoc3ltQWxnbyk7XG5cbiAgICAgICAgICBjYXNlIDQxOlxuICAgICAgICAgICAgc2Vzc2lvbktleSA9IF9jb250ZXh0Ny5zZW50O1xuXG4gICAgICAgICAgY2FzZSA0MjpcbiAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gNDQ7XG4gICAgICAgICAgICByZXR1cm4gZW5jcnlwdFNlc3Npb25LZXkoc2Vzc2lvbktleSwgc3ltQWxnbywgYWVhZEFsZ28sIGtleXMsIHBhc3N3b3Jkcywgd2lsZGNhcmQsIGRhdGUsIHVzZXJJZCk7XG5cbiAgICAgICAgICBjYXNlIDQ0OlxuICAgICAgICAgICAgbXNnID0gX2NvbnRleHQ3LnNlbnQ7XG5cblxuICAgICAgICAgICAgaWYgKF9jb25maWcyLmRlZmF1bHQuYWVhZF9wcm90ZWN0ICYmIChfY29uZmlnMi5kZWZhdWx0LmFlYWRfcHJvdGVjdF92ZXJzaW9uICE9PSA0IHx8IGFlYWRBbGdvKSkge1xuICAgICAgICAgICAgICBzeW1FbmNyeXB0ZWRQYWNrZXQgPSBuZXcgX3BhY2tldDIuZGVmYXVsdC5TeW1FbmNyeXB0ZWRBRUFEUHJvdGVjdGVkKCk7XG4gICAgICAgICAgICAgIHN5bUVuY3J5cHRlZFBhY2tldC5hZWFkQWxnb3JpdGhtID0gYWVhZEFsZ287XG4gICAgICAgICAgICB9IGVsc2UgaWYgKF9jb25maWcyLmRlZmF1bHQuaW50ZWdyaXR5X3Byb3RlY3QpIHtcbiAgICAgICAgICAgICAgc3ltRW5jcnlwdGVkUGFja2V0ID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuU3ltRW5jcnlwdGVkSW50ZWdyaXR5UHJvdGVjdGVkKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzeW1FbmNyeXB0ZWRQYWNrZXQgPSBuZXcgX3BhY2tldDIuZGVmYXVsdC5TeW1tZXRyaWNhbGx5RW5jcnlwdGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzeW1FbmNyeXB0ZWRQYWNrZXQucGFja2V0cyA9IHRoaXMucGFja2V0cztcblxuICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSA0OTtcbiAgICAgICAgICAgIHJldHVybiBzeW1FbmNyeXB0ZWRQYWNrZXQuZW5jcnlwdChzeW1BbGdvLCBzZXNzaW9uS2V5KTtcblxuICAgICAgICAgIGNhc2UgNDk6XG5cbiAgICAgICAgICAgIG1zZy5wYWNrZXRzLnB1c2goc3ltRW5jcnlwdGVkUGFja2V0KTtcbiAgICAgICAgICAgIHN5bUVuY3J5cHRlZFBhY2tldC5wYWNrZXRzID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuTGlzdCgpOyAvLyByZW1vdmUgcGFja2V0cyBhZnRlciBlbmNyeXB0aW9uXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LmFicnVwdCgncmV0dXJuJywge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBtc2csXG4gICAgICAgICAgICAgIHNlc3Npb25LZXk6IHtcbiAgICAgICAgICAgICAgICBkYXRhOiBzZXNzaW9uS2V5LFxuICAgICAgICAgICAgICAgIGFsZ29yaXRobTogc3ltQWxnbyxcbiAgICAgICAgICAgICAgICBhZWFkQWxnb3JpdGhtOiBhZWFkQWxnb1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgNTI6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDcuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTcsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChfeDEwLCBfeDExLCBfeDEyKSB7XG4gICAgcmV0dXJuIF9yZWY3LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7TWVzc2FnZS5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYxMiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMTMoKSB7XG4gICAgdmFyIHByaXZhdGVLZXlzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgICB2YXIgc2lnbmF0dXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBuZXcgRGF0ZSgpO1xuICAgIHZhciB1c2VySWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgIHZhciBwYWNrZXRsaXN0LCBsaXRlcmFsRGF0YVBhY2tldCwgaSwgZXhpc3RpbmdTaWdQYWNrZXRsaXN0LCBzaWduYXR1cmVUeXBlLCBzaWduYXR1cmVQYWNrZXQsIG9uZVBhc3NTaWc7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxMyQoX2NvbnRleHQxMykge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDEzLnByZXYgPSBfY29udGV4dDEzLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBwYWNrZXRsaXN0ID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuTGlzdCgpO1xuICAgICAgICAgICAgbGl0ZXJhbERhdGFQYWNrZXQgPSB0aGlzLnBhY2tldHMuZmluZFBhY2tldChfZW51bXMyLmRlZmF1bHQucGFja2V0LmxpdGVyYWwpO1xuXG4gICAgICAgICAgICBpZiAobGl0ZXJhbERhdGFQYWNrZXQpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQxMy5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gbGl0ZXJhbCBkYXRhIHBhY2tldCB0byBzaWduLicpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgaSA9IHZvaWQgMDtcbiAgICAgICAgICAgIGV4aXN0aW5nU2lnUGFja2V0bGlzdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIC8vIElmIGRhdGEgcGFja2V0IHdhcyBjcmVhdGVkIGZyb20gVWludDhBcnJheSwgdXNlIGJpbmFyeSwgb3RoZXJ3aXNlIHVzZSB0ZXh0XG5cbiAgICAgICAgICAgIHNpZ25hdHVyZVR5cGUgPSBsaXRlcmFsRGF0YVBhY2tldC50ZXh0ID09PSBudWxsID8gX2VudW1zMi5kZWZhdWx0LnNpZ25hdHVyZS5iaW5hcnkgOiBfZW51bXMyLmRlZmF1bHQuc2lnbmF0dXJlLnRleHQ7XG5cblxuICAgICAgICAgICAgaWYgKHNpZ25hdHVyZSkge1xuICAgICAgICAgICAgICBleGlzdGluZ1NpZ1BhY2tldGxpc3QgPSBzaWduYXR1cmUucGFja2V0cy5maWx0ZXJCeVRhZyhfZW51bXMyLmRlZmF1bHQucGFja2V0LnNpZ25hdHVyZSk7XG4gICAgICAgICAgICAgIGZvciAoaSA9IGV4aXN0aW5nU2lnUGFja2V0bGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVBhY2tldCA9IGV4aXN0aW5nU2lnUGFja2V0bGlzdFtpXTtcbiAgICAgICAgICAgICAgICBvbmVQYXNzU2lnID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuT25lUGFzc1NpZ25hdHVyZSgpO1xuXG4gICAgICAgICAgICAgICAgb25lUGFzc1NpZy50eXBlID0gc2lnbmF0dXJlVHlwZTtcbiAgICAgICAgICAgICAgICBvbmVQYXNzU2lnLmhhc2hBbGdvcml0aG0gPSBzaWduYXR1cmVQYWNrZXQuaGFzaEFsZ29yaXRobTtcbiAgICAgICAgICAgICAgICBvbmVQYXNzU2lnLnB1YmxpY0tleUFsZ29yaXRobSA9IHNpZ25hdHVyZVBhY2tldC5wdWJsaWNLZXlBbGdvcml0aG07XG4gICAgICAgICAgICAgICAgb25lUGFzc1NpZy5zaWduaW5nS2V5SWQgPSBzaWduYXR1cmVQYWNrZXQuaXNzdWVyS2V5SWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFwcml2YXRlS2V5cy5sZW5ndGggJiYgaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgb25lUGFzc1NpZy5mbGFncyA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhY2tldGxpc3QucHVzaChvbmVQYXNzU2lnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dDEzLm5leHQgPSAxMDtcbiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwoKDAsIF9mcm9tMi5kZWZhdWx0KShwcml2YXRlS2V5cykucmV2ZXJzZSgpLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBfcmVmMTMgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTEyKHByaXZhdGVLZXksIGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2lnbmluZ0tleVBhY2tldCwgb25lUGFzc1NpZztcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTEyJChfY29udGV4dDEyKSB7XG4gICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0MTIucHJldiA9IF9jb250ZXh0MTIubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJpdmF0ZUtleS5pc1B1YmxpYygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgcHJpdmF0ZSBrZXkgZm9yIHNpZ25pbmcnKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJpdmF0ZUtleS5nZXRTaWduaW5nS2V5UGFja2V0KHVuZGVmaW5lZCwgZGF0ZSwgdXNlcklkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25pbmdLZXlQYWNrZXQgPSBfY29udGV4dDEyLnNlbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWduaW5nS2V5UGFja2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHZhbGlkIGtleSBwYWNrZXQgZm9yIHNpZ25pbmcgaW4ga2V5ICcgKyBwcml2YXRlS2V5LnByaW1hcnlLZXkuZ2V0S2V5SWQoKS50b0hleCgpKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uZVBhc3NTaWcgPSBuZXcgX3BhY2tldDIuZGVmYXVsdC5PbmVQYXNzU2lnbmF0dXJlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uZVBhc3NTaWcudHlwZSA9IHNpZ25hdHVyZVR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSAxMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgX2tleS5nZXRQcmVmZXJyZWRIYXNoQWxnbykocHJpdmF0ZUtleSwgc2lnbmluZ0tleVBhY2tldCwgZGF0ZSwgdXNlcklkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICBvbmVQYXNzU2lnLmhhc2hBbGdvcml0aG0gPSBfY29udGV4dDEyLnNlbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uZVBhc3NTaWcucHVibGljS2V5QWxnb3JpdGhtID0gc2lnbmluZ0tleVBhY2tldC5hbGdvcml0aG07XG4gICAgICAgICAgICAgICAgICAgICAgICBvbmVQYXNzU2lnLnNpZ25pbmdLZXlJZCA9IHNpZ25pbmdLZXlQYWNrZXQuZ2V0S2V5SWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBwcml2YXRlS2V5cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uZVBhc3NTaWcuZmxhZ3MgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTIuYWJydXB0KCdyZXR1cm4nLCBvbmVQYXNzU2lnKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDEyLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUxMiwgdGhpcyk7XG4gICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF94MzUsIF94MzYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjEzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KCkpKS50aGVuKGZ1bmN0aW9uIChvbmVQYXNzU2lnbmF0dXJlTGlzdCkge1xuICAgICAgICAgICAgICBvbmVQYXNzU2lnbmF0dXJlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChvbmVQYXNzU2lnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldGxpc3QucHVzaChvbmVQYXNzU2lnKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgMTA6XG5cbiAgICAgICAgICAgIHBhY2tldGxpc3QucHVzaChsaXRlcmFsRGF0YVBhY2tldCk7XG4gICAgICAgICAgICBfY29udGV4dDEzLnQwID0gcGFja2V0bGlzdDtcbiAgICAgICAgICAgIF9jb250ZXh0MTMubmV4dCA9IDE0O1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNpZ25hdHVyZVBhY2tldHMobGl0ZXJhbERhdGFQYWNrZXQsIHByaXZhdGVLZXlzLCBzaWduYXR1cmUsIGRhdGUpO1xuXG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIF9jb250ZXh0MTMudDEgPSBfY29udGV4dDEzLnNlbnQ7XG5cbiAgICAgICAgICAgIF9jb250ZXh0MTMudDAuY29uY2F0LmNhbGwoX2NvbnRleHQxMy50MCwgX2NvbnRleHQxMy50MSk7XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDEzLmFicnVwdCgncmV0dXJuJywgbmV3IE1lc3NhZ2UocGFja2V0bGlzdCkpO1xuXG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTMuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTEzLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9yZWYxMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIENvbXByZXNzZXMgdGhlIG1lc3NhZ2UgKHRoZSBsaXRlcmFsIGFuZCAtaWYgc2lnbmVkLSBzaWduYXR1cmUgZGF0YSBwYWNrZXRzIG9mIHRoZSBtZXNzYWdlKVxuICogQHBhcmFtICB7bW9kdWxlOmVudW1zLmNvbXByZXNzaW9ufSAgIGNvbXByZXNzaW9uICAgICBjb21wcmVzc2lvbiBhbGdvcml0aG0gdG8gYmUgdXNlZFxuICogQHJldHVybnMge21vZHVsZTptZXNzYWdlLk1lc3NhZ2V9ICAgICAgIG5ldyBtZXNzYWdlIHdpdGggY29tcHJlc3NlZCBjb250ZW50XG4gKi9cbk1lc3NhZ2UucHJvdG90eXBlLmNvbXByZXNzID0gZnVuY3Rpb24gKGNvbXByZXNzaW9uKSB7XG4gIGlmIChjb21wcmVzc2lvbiA9PT0gX2VudW1zMi5kZWZhdWx0LmNvbXByZXNzaW9uLnVuY29tcHJlc3NlZCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdmFyIGNvbXByZXNzZWQgPSBuZXcgX3BhY2tldDIuZGVmYXVsdC5Db21wcmVzc2VkKCk7XG4gIGNvbXByZXNzZWQucGFja2V0cyA9IHRoaXMucGFja2V0cztcbiAgY29tcHJlc3NlZC5hbGdvcml0aG0gPSBfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQuY29tcHJlc3Npb24sIGNvbXByZXNzaW9uKTtcblxuICB2YXIgcGFja2V0TGlzdCA9IG5ldyBfcGFja2V0Mi5kZWZhdWx0Lkxpc3QoKTtcbiAgcGFja2V0TGlzdC5wdXNoKGNvbXByZXNzZWQpO1xuXG4gIHJldHVybiBuZXcgTWVzc2FnZShwYWNrZXRMaXN0KTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgZGV0YWNoZWQgc2lnbmF0dXJlIGZvciB0aGUgbWVzc2FnZSAodGhlIGxpdGVyYWwgZGF0YSBwYWNrZXQgb2YgdGhlIG1lc3NhZ2UpXG4gKiBAcGFyYW0gIHtBcnJheTxtb2R1bGU6a2V5LktleT59ICAgICAgICAgICAgICAgcHJpdmF0ZUtleXMgcHJpdmF0ZSBrZXlzIHdpdGggZGVjcnlwdGVkIHNlY3JldCBrZXkgZGF0YSBmb3Igc2lnbmluZ1xuICogQHBhcmFtICB7U2lnbmF0dXJlfSBzaWduYXR1cmUgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgYW55IGV4aXN0aW5nIGRldGFjaGVkIHNpZ25hdHVyZVxuICogQHBhcmFtICB7RGF0ZX0gZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgb3ZlcnJpZGUgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIHNpZ25hdHVyZVxuICogQHBhcmFtICB7T2JqZWN0fSB1c2VySWQgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgdXNlciBJRCB0byBzaWduIHdpdGgsIGUuZy4geyBuYW1lOidTdGV2ZSBTZW5kZXInLCBlbWFpbDonc3RldmVAb3BlbnBncC5vcmcnIH1cbiAqIEByZXR1cm5zIHtQcm9taXNlPG1vZHVsZTpzaWduYXR1cmUuU2lnbmF0dXJlPn0gbmV3IGRldGFjaGVkIHNpZ25hdHVyZSBvZiBtZXNzYWdlIGNvbnRlbnRcbiAqIEBhc3luY1xuICovXG5NZXNzYWdlLnByb3RvdHlwZS5zaWduRGV0YWNoZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMTQgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTE0KCkge1xuICAgIHZhciBwcml2YXRlS2V5cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgdmFyIHNpZ25hdHVyZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbmV3IERhdGUoKTtcbiAgICB2YXIgdXNlcklkID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgICB2YXIgbGl0ZXJhbERhdGFQYWNrZXQ7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxNCQoX2NvbnRleHQxNCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDE0LnByZXYgPSBfY29udGV4dDE0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBsaXRlcmFsRGF0YVBhY2tldCA9IHRoaXMucGFja2V0cy5maW5kUGFja2V0KF9lbnVtczIuZGVmYXVsdC5wYWNrZXQubGl0ZXJhbCk7XG5cbiAgICAgICAgICAgIGlmIChsaXRlcmFsRGF0YVBhY2tldCkge1xuICAgICAgICAgICAgICBfY29udGV4dDE0Lm5leHQgPSAzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBsaXRlcmFsIGRhdGEgcGFja2V0IHRvIHNpZ24uJyk7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBfY29udGV4dDE0LnQwID0gX3NpZ25hdHVyZS5TaWduYXR1cmU7XG4gICAgICAgICAgICBfY29udGV4dDE0Lm5leHQgPSA2O1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNpZ25hdHVyZVBhY2tldHMobGl0ZXJhbERhdGFQYWNrZXQsIHByaXZhdGVLZXlzLCBzaWduYXR1cmUsIGRhdGUsIHVzZXJJZCk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBfY29udGV4dDE0LnQxID0gX2NvbnRleHQxNC5zZW50O1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTQuYWJydXB0KCdyZXR1cm4nLCBuZXcgX2NvbnRleHQxNC50MChfY29udGV4dDE0LnQxKSk7XG5cbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUxNCwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfcmVmMTQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtNZXNzYWdlLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiAoa2V5cykge1xuICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbmV3IERhdGUoKTtcblxuICB2YXIgbXNnID0gdGhpcy51bndyYXBDb21wcmVzc2VkKCk7XG4gIHZhciBsaXRlcmFsRGF0YUxpc3QgPSBtc2cucGFja2V0cy5maWx0ZXJCeVRhZyhfZW51bXMyLmRlZmF1bHQucGFja2V0LmxpdGVyYWwpO1xuICBpZiAobGl0ZXJhbERhdGFMaXN0Lmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgdmVyaWZ5IG1lc3NhZ2Ugd2l0aCBvbmUgbGl0ZXJhbCBkYXRhIHBhY2tldC4nKTtcbiAgfVxuICB2YXIgc2lnbmF0dXJlTGlzdCA9IG1zZy5wYWNrZXRzLmZpbHRlckJ5VGFnKF9lbnVtczIuZGVmYXVsdC5wYWNrZXQuc2lnbmF0dXJlKTtcbiAgcmV0dXJuIGNyZWF0ZVZlcmlmaWNhdGlvbk9iamVjdHMoc2lnbmF0dXJlTGlzdCwgbGl0ZXJhbERhdGFMaXN0LCBrZXlzLCBkYXRlKTtcbn07XG5cbi8qKlxuICogVmVyaWZ5IGRldGFjaGVkIG1lc3NhZ2Ugc2lnbmF0dXJlXG4gKiBAcGFyYW0ge0FycmF5PG1vZHVsZTprZXkuS2V5Pn0ga2V5cyBhcnJheSBvZiBrZXlzIHRvIHZlcmlmeSBzaWduYXR1cmVzXG4gKiBAcGFyYW0ge1NpZ25hdHVyZX0gc2lnbmF0dXJlXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGUgVmVyaWZ5IHRoZSBzaWduYXR1cmUgYWdhaW5zdCB0aGUgZ2l2ZW4gZGF0ZSwgaS5lLiBjaGVjayBzaWduYXR1cmUgY3JlYXRpb24gdGltZSA8IGRhdGUgPCBleHBpcmF0aW9uIHRpbWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PCh7a2V5aWQ6IG1vZHVsZTp0eXBlL2tleWlkLCB2YWxpZDogQm9vbGVhbn0pPj59IGxpc3Qgb2Ygc2lnbmVyJ3Mga2V5aWQgYW5kIHZhbGlkaXR5IG9mIHNpZ25hdHVyZVxuICogQGFzeW5jXG4gKi9cbk1lc3NhZ2UucHJvdG90eXBlLnZlcmlmeURldGFjaGVkID0gZnVuY3Rpb24gKHNpZ25hdHVyZSwga2V5cykge1xuICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbmV3IERhdGUoKTtcblxuICB2YXIgbXNnID0gdGhpcy51bndyYXBDb21wcmVzc2VkKCk7XG4gIHZhciBsaXRlcmFsRGF0YUxpc3QgPSBtc2cucGFja2V0cy5maWx0ZXJCeVRhZyhfZW51bXMyLmRlZmF1bHQucGFja2V0LmxpdGVyYWwpO1xuICBpZiAobGl0ZXJhbERhdGFMaXN0Lmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgdmVyaWZ5IG1lc3NhZ2Ugd2l0aCBvbmUgbGl0ZXJhbCBkYXRhIHBhY2tldC4nKTtcbiAgfVxuICB2YXIgc2lnbmF0dXJlTGlzdCA9IHNpZ25hdHVyZS5wYWNrZXRzO1xuICByZXR1cm4gY3JlYXRlVmVyaWZpY2F0aW9uT2JqZWN0cyhzaWduYXR1cmVMaXN0LCBsaXRlcmFsRGF0YUxpc3QsIGtleXMsIGRhdGUpO1xufTtNZXNzYWdlLnByb3RvdHlwZS51bndyYXBDb21wcmVzc2VkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY29tcHJlc3NlZCA9IHRoaXMucGFja2V0cy5maWx0ZXJCeVRhZyhfZW51bXMyLmRlZmF1bHQucGFja2V0LmNvbXByZXNzZWQpO1xuICBpZiAoY29tcHJlc3NlZC5sZW5ndGgpIHtcbiAgICByZXR1cm4gbmV3IE1lc3NhZ2UoY29tcHJlc3NlZFswXS5wYWNrZXRzKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQXBwZW5kIHNpZ25hdHVyZSB0byB1bmVuY3J5cHRlZCBtZXNzYWdlIG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd8VWludDhBcnJheX0gZGV0YWNoZWRTaWduYXR1cmUgVGhlIGRldGFjaGVkIEFTQ0lJLWFybW9yZWQgb3IgVWludDhBcnJheSBQR1Agc2lnbmF0dXJlXG4gKi9cbk1lc3NhZ2UucHJvdG90eXBlLmFwcGVuZFNpZ25hdHVyZSA9IGZ1bmN0aW9uIChkZXRhY2hlZFNpZ25hdHVyZSkge1xuICB0aGlzLnBhY2tldHMucmVhZChfdXRpbDIuZGVmYXVsdC5pc1VpbnQ4QXJyYXkoZGV0YWNoZWRTaWduYXR1cmUpID8gZGV0YWNoZWRTaWduYXR1cmUgOiBfYXJtb3IyLmRlZmF1bHQuZGVjb2RlKGRldGFjaGVkU2lnbmF0dXJlKS5kYXRhKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBBU0NJSSBhcm1vcmVkIHRleHQgb2YgbWVzc2FnZVxuICogQHJldHVybnMge1N0cmluZ30gQVNDSUkgYXJtb3JcbiAqL1xuTWVzc2FnZS5wcm90b3R5cGUuYXJtb3IgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBfYXJtb3IyLmRlZmF1bHQuZW5jb2RlKF9lbnVtczIuZGVmYXVsdC5hcm1vci5tZXNzYWdlLCB0aGlzLnBhY2tldHMud3JpdGUoKSk7XG59O1xuXG4vKipcbiAqIHJlYWRzIGFuIE9wZW5QR1AgYXJtb3JlZCBtZXNzYWdlIGFuZCByZXR1cm5zIGEgbWVzc2FnZSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBhcm1vcmVkVGV4dCB0ZXh0IHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMge21vZHVsZTptZXNzYWdlLk1lc3NhZ2V9IG5ldyBtZXNzYWdlIG9iamVjdFxuICogQHN0YXRpY1xuICovXG5mdW5jdGlvbiByZWFkQXJtb3JlZChhcm1vcmVkVGV4dCkge1xuICAvL1RPRE8gaG93IGRvIHdlIHdhbnQgdG8gaGFuZGxlIGJhZCB0ZXh0PyBFeGNlcHRpb24gdGhyb3dpbmdcbiAgLy9UT0RPIGRvbid0IGFjY2VwdCBub24tbWVzc2FnZSBhcm1vcmVkIHRleHRzXG4gIHZhciBpbnB1dCA9IF9hcm1vcjIuZGVmYXVsdC5kZWNvZGUoYXJtb3JlZFRleHQpLmRhdGE7XG4gIHJldHVybiByZWFkKGlucHV0KTtcbn1cblxuLyoqXG4gKiByZWFkcyBhbiBPcGVuUEdQIG1lc3NhZ2UgYXMgYnl0ZSBhcnJheSBhbmQgcmV0dXJucyBhIG1lc3NhZ2Ugb2JqZWN0XG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGlucHV0ICAgYmluYXJ5IG1lc3NhZ2VcbiAqIEByZXR1cm5zIHtNZXNzYWdlfSAgICAgICAgICAgbmV3IG1lc3NhZ2Ugb2JqZWN0XG4gKiBAc3RhdGljXG4gKi9cbmZ1bmN0aW9uIHJlYWQoaW5wdXQpIHtcbiAgdmFyIHBhY2tldGxpc3QgPSBuZXcgX3BhY2tldDIuZGVmYXVsdC5MaXN0KCk7XG4gIHBhY2tldGxpc3QucmVhZChpbnB1dCk7XG4gIHJldHVybiBuZXcgTWVzc2FnZShwYWNrZXRsaXN0KTtcbn1cblxuLyoqXG4gKiBjcmVhdGVzIG5ldyBtZXNzYWdlIG9iamVjdCBmcm9tIHRleHRcbiAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0XG4gKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWUgKG9wdGlvbmFsKVxuICogQHBhcmFtIHtEYXRlfSBkYXRlIChvcHRpb25hbClcbiAqIEBwYXJhbSB7dXRmOHxiaW5hcnl8dGV4dHxtaW1lfSB0eXBlIChvcHRpb25hbCkgZGF0YSBwYWNrZXQgdHlwZVxuICogQHJldHVybnMge21vZHVsZTptZXNzYWdlLk1lc3NhZ2V9IG5ldyBtZXNzYWdlIG9iamVjdFxuICogQHN0YXRpY1xuICovXG5mdW5jdGlvbiBmcm9tVGV4dCh0ZXh0LCBmaWxlbmFtZSkge1xuICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbmV3IERhdGUoKTtcbiAgdmFyIHR5cGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICd1dGY4JztcblxuICB2YXIgbGl0ZXJhbERhdGFQYWNrZXQgPSBuZXcgX3BhY2tldDIuZGVmYXVsdC5MaXRlcmFsKGRhdGUpO1xuICAvLyB0ZXh0IHdpbGwgYmUgY29udmVydGVkIHRvIFVURjhcbiAgbGl0ZXJhbERhdGFQYWNrZXQuc2V0VGV4dCh0ZXh0LCB0eXBlKTtcbiAgaWYgKGZpbGVuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBsaXRlcmFsRGF0YVBhY2tldC5zZXRGaWxlbmFtZShmaWxlbmFtZSk7XG4gIH1cbiAgdmFyIGxpdGVyYWxEYXRhUGFja2V0bGlzdCA9IG5ldyBfcGFja2V0Mi5kZWZhdWx0Lkxpc3QoKTtcbiAgbGl0ZXJhbERhdGFQYWNrZXRsaXN0LnB1c2gobGl0ZXJhbERhdGFQYWNrZXQpO1xuICByZXR1cm4gbmV3IE1lc3NhZ2UobGl0ZXJhbERhdGFQYWNrZXRsaXN0KTtcbn1cblxuLyoqXG4gKiBjcmVhdGVzIG5ldyBtZXNzYWdlIG9iamVjdCBmcm9tIGJpbmFyeSBkYXRhXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWUgKG9wdGlvbmFsKVxuICogQHBhcmFtIHtEYXRlfSBkYXRlIChvcHRpb25hbClcbiAqIEBwYXJhbSB7dXRmOHxiaW5hcnl8dGV4dHxtaW1lfSB0eXBlIChvcHRpb25hbCkgZGF0YSBwYWNrZXQgdHlwZVxuICogQHJldHVybnMge21vZHVsZTptZXNzYWdlLk1lc3NhZ2V9IG5ldyBtZXNzYWdlIG9iamVjdFxuICogQHN0YXRpY1xuICovXG5mdW5jdGlvbiBmcm9tQmluYXJ5KGJ5dGVzLCBmaWxlbmFtZSkge1xuICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbmV3IERhdGUoKTtcbiAgdmFyIHR5cGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICdiaW5hcnknO1xuXG4gIGlmICghX3V0aWwyLmRlZmF1bHQuaXNVaW50OEFycmF5KGJ5dGVzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRGF0YSBtdXN0IGJlIGluIHRoZSBmb3JtIG9mIGEgVWludDhBcnJheScpO1xuICB9XG5cbiAgdmFyIGxpdGVyYWxEYXRhUGFja2V0ID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuTGl0ZXJhbChkYXRlKTtcbiAgbGl0ZXJhbERhdGFQYWNrZXQuc2V0Qnl0ZXMoYnl0ZXMsIHR5cGUpO1xuICBpZiAoZmlsZW5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGxpdGVyYWxEYXRhUGFja2V0LnNldEZpbGVuYW1lKGZpbGVuYW1lKTtcbiAgfVxuICB2YXIgbGl0ZXJhbERhdGFQYWNrZXRsaXN0ID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuTGlzdCgpO1xuICBsaXRlcmFsRGF0YVBhY2tldGxpc3QucHVzaChsaXRlcmFsRGF0YVBhY2tldCk7XG4gIHJldHVybiBuZXcgTWVzc2FnZShsaXRlcmFsRGF0YVBhY2tldGxpc3QpO1xufVxuXG59LHtcIi4vY29uZmlnXCI6MzI1LFwiLi9jcnlwdG9cIjozNDAsXCIuL2VuY29kaW5nL2FybW9yXCI6MzU3LFwiLi9lbnVtc1wiOjM1OSxcIi4va2V5XCI6MzYyLFwiLi9wYWNrZXRcIjozNzEsXCIuL3NpZ25hdHVyZVwiOjM5MSxcIi4vdHlwZS9rZXlpZFwiOjM5NCxcIi4vdXRpbFwiOjM5OCxcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9hcnJheS9mcm9tXCI6MjAsXCJiYWJlbC1ydW50aW1lL2NvcmUtanMvcHJvbWlzZVwiOjMyLFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjozNSxcImJhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3JcIjo0Mn1dLDM2NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcmVnZW5lcmF0b3IgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yJyk7XG5cbnZhciBfcmVnZW5lcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVnZW5lcmF0b3IpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IyID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3InKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FzeW5jVG9HZW5lcmF0b3IyKTtcblxudmFyIF9wcm9taXNlID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9jb3JlLWpzL3Byb21pc2UnKTtcblxudmFyIF9wcm9taXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb21pc2UpO1xuXG5leHBvcnRzLmluaXRXb3JrZXIgPSBpbml0V29ya2VyO1xuZXhwb3J0cy5nZXRXb3JrZXIgPSBnZXRXb3JrZXI7XG5leHBvcnRzLmRlc3Ryb3lXb3JrZXIgPSBkZXN0cm95V29ya2VyO1xuZXhwb3J0cy5nZW5lcmF0ZUtleSA9IGdlbmVyYXRlS2V5O1xuZXhwb3J0cy5yZWZvcm1hdEtleSA9IHJlZm9ybWF0S2V5O1xuZXhwb3J0cy5yZXZva2VLZXkgPSByZXZva2VLZXk7XG5leHBvcnRzLmRlY3J5cHRLZXkgPSBkZWNyeXB0S2V5O1xuZXhwb3J0cy5lbmNyeXB0S2V5ID0gZW5jcnlwdEtleTtcbmV4cG9ydHMuZW5jcnlwdCA9IGVuY3J5cHQ7XG5leHBvcnRzLmRlY3J5cHQgPSBkZWNyeXB0O1xuZXhwb3J0cy5zaWduID0gc2lnbjtcbmV4cG9ydHMudmVyaWZ5ID0gdmVyaWZ5O1xuZXhwb3J0cy5lbmNyeXB0U2Vzc2lvbktleSA9IGVuY3J5cHRTZXNzaW9uS2V5O1xuZXhwb3J0cy5kZWNyeXB0U2Vzc2lvbktleXMgPSBkZWNyeXB0U2Vzc2lvbktleXM7XG5cbnZhciBfbWVzc2FnZSA9IF9kZXJlcV8oJy4vbWVzc2FnZScpO1xuXG52YXIgbWVzc2FnZUxpYiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9tZXNzYWdlKTtcblxudmFyIF9jbGVhcnRleHQgPSBfZGVyZXFfKCcuL2NsZWFydGV4dCcpO1xuXG52YXIgX2tleSA9IF9kZXJlcV8oJy4va2V5Jyk7XG5cbnZhciBfY29uZmlnID0gX2RlcmVxXygnLi9jb25maWcvY29uZmlnJyk7XG5cbnZhciBfY29uZmlnMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbmZpZyk7XG5cbnZhciBfZW51bXMgPSBfZGVyZXFfKCcuL2VudW1zJyk7XG5cbnZhciBfZW51bXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW51bXMpO1xuXG52YXIgX3V0aWwgPSBfZGVyZXFfKCcuL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG52YXIgX2FzeW5jX3Byb3h5ID0gX2RlcmVxXygnLi93b3JrZXIvYXN5bmNfcHJveHknKTtcblxudmFyIF9hc3luY19wcm94eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3luY19wcm94eSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gZWxzZSB7IHZhciBuZXdPYmogPSB7fTsgaWYgKG9iaiAhPSBudWxsKSB7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgcmV0dXJuIG5ld09iajsgfSB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8vIE9sZCBicm93c2VyIHBvbHlmaWxsc1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIF9kZXJlcV8oJy4vcG9seWZpbGxzJyk7XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgICAgICAgICAgICAgICAgICAgICAvL1xuLy8gICBXZWIgV29ya2VyIHNldHVwICAgLy9cbi8vICAgICAgICAgICAgICAgICAgICAgIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cbi8vIE9wZW5QR1AuanMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxNiBUYW5rcmVkIEhhc2Vcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgVGhlIG9wZW5wZ3AgYmFzZSBtb2R1bGUgc2hvdWxkIHByb3ZpZGUgYWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5XG4gKiB0byBjb25zdW1lIHRoZSBvcGVucGdwLmpzIGxpYnJhcnkuIEFsbCBhZGRpdGlvbmFsIGNsYXNzZXMgYXJlIGRvY3VtZW50ZWRcbiAqIGZvciBleHRlbmRpbmcgYW5kIGRldmVsb3Bpbmcgb24gdG9wIG9mIHRoZSBiYXNlIGxpYnJhcnkuXG4gKiBAcmVxdWlyZXMgbWVzc2FnZVxuICogQHJlcXVpcmVzIGNsZWFydGV4dFxuICogQHJlcXVpcmVzIGtleVxuICogQHJlcXVpcmVzIGNvbmZpZ1xuICogQHJlcXVpcmVzIGVudW1zXG4gKiBAcmVxdWlyZXMgdXRpbFxuICogQHJlcXVpcmVzIHBvbHlmaWxsc1xuICogQHJlcXVpcmVzIHdvcmtlci9hc3luY19wcm94eVxuICogQG1vZHVsZSBvcGVucGdwXG4gKi9cblxuLy8gVGhpcyBmaWxlIGludGVudGlvbmFsbHkgaGFzIHR3byBzZXBhcmF0ZSBmaWxlIG92ZXJ2aWV3cyBzbyB0aGF0XG4vLyBhIHJlZmVyZW5jZSB0byB0aGlzIG1vZHVsZSBhcHBlYXJzIGF0IHRoZSBlbmQgb2YgZG9jL2luZGV4Lmh0bWwuXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBUbyB2aWV3IHRoZSBmdWxsIEFQSSBkb2N1bWVudGF0aW9uLCBzdGFydCBmcm9tXG4gKiB7QGxpbmsgbW9kdWxlOm9wZW5wZ3B9XG4gKi9cblxudmFyIGFzeW5jUHJveHkgPSB2b2lkIDA7IC8vIGluc3RhbmNlIG9mIHRoZSBhc3luY3Byb3h5XG5cbi8qKlxuICogU2V0IHRoZSBwYXRoIGZvciB0aGUgd2ViIHdvcmtlciBzY3JpcHQgYW5kIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgYXN5bmMgcHJveHlcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoICAgICAgICAgICAgcmVsYXRpdmUgcGF0aCB0byB0aGUgd29ya2VyIHNjcmlwdHMsIGRlZmF1bHQ6ICdvcGVucGdwLndvcmtlci5qcydcbiAqIEBwYXJhbSB7TnVtYmVyfSBuICAgICAgICAgICAgICAgbnVtYmVyIG9mIHdvcmtlcnMgdG8gaW5pdGlhbGl6ZVxuICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSB3b3JrZXJzICBhbHRlcm5hdGl2ZSB0byBwYXRoIHBhcmFtZXRlcjogd2ViIHdvcmtlcnMgaW5pdGlhbGl6ZWQgd2l0aCAnb3BlbnBncC53b3JrZXIuanMnXG4gKi9cbmZ1bmN0aW9uIGluaXRXb3JrZXIoKSB7XG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgIF9yZWYkcGF0aCA9IF9yZWYucGF0aCxcbiAgICAgIHBhdGggPSBfcmVmJHBhdGggPT09IHVuZGVmaW5lZCA/ICdvcGVucGdwLndvcmtlci5qcycgOiBfcmVmJHBhdGgsXG4gICAgICBfcmVmJG4gPSBfcmVmLm4sXG4gICAgICBuID0gX3JlZiRuID09PSB1bmRlZmluZWQgPyAxIDogX3JlZiRuLFxuICAgICAgX3JlZiR3b3JrZXJzID0gX3JlZi53b3JrZXJzLFxuICAgICAgd29ya2VycyA9IF9yZWYkd29ya2VycyA9PT0gdW5kZWZpbmVkID8gW10gOiBfcmVmJHdvcmtlcnM7XG5cbiAgaWYgKHdvcmtlcnMubGVuZ3RoIHx8IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5Xb3JrZXIpIHtcbiAgICBhc3luY1Byb3h5ID0gbmV3IF9hc3luY19wcm94eTIuZGVmYXVsdCh7IHBhdGg6IHBhdGgsIG46IG4sIHdvcmtlcnM6IHdvcmtlcnMsIGNvbmZpZzogX2NvbmZpZzIuZGVmYXVsdCB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGFzeW5jIHByb3h5IGlmIHRoZSB3b3JrZXIgd2FzIGluaXRpYWxpemVkIHdpdGggb3BlbnBncC5pbml0V29ya2VyKClcbiAqIEByZXR1cm5zIHttb2R1bGU6d29ya2VyL2FzeW5jX3Byb3h5LkFzeW5jUHJveHl8bnVsbH0gdGhlIGFzeW5jIHByb3h5IG9yIG51bGwgaWYgbm90IGluaXRpYWxpemVkXG4gKi9cbmZ1bmN0aW9uIGdldFdvcmtlcigpIHtcbiAgcmV0dXJuIGFzeW5jUHJveHk7XG59XG5cbi8qKlxuICogQ2xlYW51cCB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgd2ViIHdvcmtlci5cbiAqL1xuZnVuY3Rpb24gZGVzdHJveVdvcmtlcigpIHtcbiAgYXN5bmNQcm94eSA9IHVuZGVmaW5lZDtcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gICAgICAgICAgICAgICAgICAvL1xuLy8gICBLZXkgaGFuZGxpbmcgICAvL1xuLy8gICAgICAgICAgICAgICAgICAvL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbmV3IE9wZW5QR1Aga2V5IHBhaXIuIFN1cHBvcnRzIFJTQSBhbmQgRUNDIGtleXMuIFByaW1hcnkgYW5kIHN1YmtleSB3aWxsIGJlIG9mIHNhbWUgdHlwZS5cbiAqIEBwYXJhbSAge0FycmF5PE9iamVjdD59IHVzZXJJZHMgICBhcnJheSBvZiB1c2VyIElEcyBlLmcuIFt7IG5hbWU6J1BoaWwgWmltbWVybWFubicsIGVtYWlsOidwaGlsQG9wZW5wZ3Aub3JnJyB9XVxuICogQHBhcmFtICB7U3RyaW5nfSBwYXNzcGhyYXNlICAgICAgIChvcHRpb25hbCkgVGhlIHBhc3NwaHJhc2UgdXNlZCB0byBlbmNyeXB0IHRoZSByZXN1bHRpbmcgcHJpdmF0ZSBrZXlcbiAqIEBwYXJhbSAge051bWJlcn0gbnVtQml0cyAgICAgICAgICAob3B0aW9uYWwpIG51bWJlciBvZiBiaXRzIGZvciBSU0Ega2V5czogMjA0OCBvciA0MDk2LlxuICogQHBhcmFtICB7TnVtYmVyfSBrZXlFeHBpcmF0aW9uVGltZSAob3B0aW9uYWwpIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhZnRlciB0aGUga2V5IGNyZWF0aW9uIHRpbWUgdGhhdCB0aGUga2V5IGV4cGlyZXNcbiAqIEBwYXJhbSAge1N0cmluZ30gY3VydmUgICAgICAgICAgICAob3B0aW9uYWwpIGVsbGlwdGljIGN1cnZlIGZvciBFQ0Mga2V5czpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlMjU1MTksIHAyNTYsIHAzODQsIHA1MjEsIHNlY3AyNTZrMSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYWlucG9vbFAyNTZyMSwgYnJhaW5wb29sUDM4NHIxLCBvciBicmFpbnBvb2xQNTEycjEuXG4gKiBAcGFyYW0gIHtEYXRlfSBkYXRlICAgICAgICAgICAgICAgKG9wdGlvbmFsKSBvdmVycmlkZSB0aGUgY3JlYXRpb24gZGF0ZSBvZiB0aGUga2V5IGFuZCB0aGUga2V5IHNpZ25hdHVyZXNcbiAqIEBwYXJhbSAge0FycmF5PE9iamVjdD59IHN1YmtleXMgICAob3B0aW9uYWwpIG9wdGlvbnMgZm9yIGVhY2ggc3Via2V5LCBkZWZhdWx0IHRvIG1haW4ga2V5IG9wdGlvbnMuIGUuZy4gW3tzaWduOiB0cnVlLCBwYXNzcGhyYXNlOiAnMTIzJ31dXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduIHBhcmFtZXRlciBkZWZhdWx0cyB0byBmYWxzZSwgYW5kIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzdWJrZXkgc2hvdWxkIHNpZ24gcmF0aGVyIHRoYW4gZW5jcnlwdFxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gICAgICAgICBUaGUgZ2VuZXJhdGVkIGtleSBvYmplY3QgaW4gdGhlIGZvcm06XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGtleTpLZXksIHByaXZhdGVLZXlBcm1vcmVkOlN0cmluZywgcHVibGljS2V5QXJtb3JlZDpTdHJpbmcsIHJldm9jYXRpb25DZXJ0aWZpY2F0ZTpTdHJpbmcgfVxuICogQGFzeW5jXG4gKiBAc3RhdGljXG4gKi9cblxuZnVuY3Rpb24gZ2VuZXJhdGVLZXkoX3JlZjIpIHtcbiAgdmFyIF9yZWYyJHVzZXJJZHMgPSBfcmVmMi51c2VySWRzLFxuICAgICAgdXNlcklkcyA9IF9yZWYyJHVzZXJJZHMgPT09IHVuZGVmaW5lZCA/IFtdIDogX3JlZjIkdXNlcklkcyxcbiAgICAgIF9yZWYyJHBhc3NwaHJhc2UgPSBfcmVmMi5wYXNzcGhyYXNlLFxuICAgICAgcGFzc3BocmFzZSA9IF9yZWYyJHBhc3NwaHJhc2UgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBfcmVmMiRwYXNzcGhyYXNlLFxuICAgICAgX3JlZjIkbnVtQml0cyA9IF9yZWYyLm51bUJpdHMsXG4gICAgICBudW1CaXRzID0gX3JlZjIkbnVtQml0cyA9PT0gdW5kZWZpbmVkID8gMjA0OCA6IF9yZWYyJG51bUJpdHMsXG4gICAgICBfcmVmMiRrZXlFeHBpcmF0aW9uVGkgPSBfcmVmMi5rZXlFeHBpcmF0aW9uVGltZSxcbiAgICAgIGtleUV4cGlyYXRpb25UaW1lID0gX3JlZjIka2V5RXhwaXJhdGlvblRpID09PSB1bmRlZmluZWQgPyAwIDogX3JlZjIka2V5RXhwaXJhdGlvblRpLFxuICAgICAgX3JlZjIkY3VydmUgPSBfcmVmMi5jdXJ2ZSxcbiAgICAgIGN1cnZlID0gX3JlZjIkY3VydmUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBfcmVmMiRjdXJ2ZSxcbiAgICAgIF9yZWYyJGRhdGUgPSBfcmVmMi5kYXRlLFxuICAgICAgZGF0ZSA9IF9yZWYyJGRhdGUgPT09IHVuZGVmaW5lZCA/IG5ldyBEYXRlKCkgOiBfcmVmMiRkYXRlLFxuICAgICAgX3JlZjIkc3Via2V5cyA9IF9yZWYyLnN1YmtleXMsXG4gICAgICBzdWJrZXlzID0gX3JlZjIkc3Via2V5cyA9PT0gdW5kZWZpbmVkID8gW3t9XSA6IF9yZWYyJHN1YmtleXM7XG5cbiAgdXNlcklkcyA9IHRvQXJyYXkodXNlcklkcyk7XG4gIHZhciBvcHRpb25zID0geyB1c2VySWRzOiB1c2VySWRzLCBwYXNzcGhyYXNlOiBwYXNzcGhyYXNlLCBudW1CaXRzOiBudW1CaXRzLCBrZXlFeHBpcmF0aW9uVGltZToga2V5RXhwaXJhdGlvblRpbWUsIGN1cnZlOiBjdXJ2ZSwgZGF0ZTogZGF0ZSwgc3Via2V5czogc3Via2V5cyB9O1xuICBpZiAoX3V0aWwyLmRlZmF1bHQuZ2V0V2ViQ3J5cHRvQWxsKCkgJiYgbnVtQml0cyA8IDIwNDgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ251bUJpdHMgc2hvdWxkIGJlIDIwNDggb3IgNDA5NiwgZm91bmQ6ICcgKyBudW1CaXRzKTtcbiAgfVxuXG4gIGlmICghX3V0aWwyLmRlZmF1bHQuZ2V0V2ViQ3J5cHRvQWxsKCkgJiYgYXN5bmNQcm94eSkge1xuICAgIC8vIHVzZSB3ZWIgd29ya2VyIGlmIHdlYiBjcnlwdG8gYXBpcyBhcmUgbm90IHN1cHBvcnRlZFxuICAgIHJldHVybiBhc3luY1Byb3h5LmRlbGVnYXRlKCdnZW5lcmF0ZUtleScsIG9wdGlvbnMpO1xuICB9XG5cbiAgcmV0dXJuICgwLCBfa2V5LmdlbmVyYXRlKShvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcmV2b2NhdGlvbkNlcnRpZmljYXRlID0ga2V5LmdldFJldm9jYXRpb25DZXJ0aWZpY2F0ZSgpO1xuICAgIGtleS5yZXZvY2F0aW9uU2lnbmF0dXJlcyA9IFtdO1xuXG4gICAgcmV0dXJuIHtcblxuICAgICAga2V5OiBrZXksXG4gICAgICBwcml2YXRlS2V5QXJtb3JlZDoga2V5LmFybW9yKCksXG4gICAgICBwdWJsaWNLZXlBcm1vcmVkOiBrZXkudG9QdWJsaWMoKS5hcm1vcigpLFxuICAgICAgcmV2b2NhdGlvbkNlcnRpZmljYXRlOiByZXZvY2F0aW9uQ2VydGlmaWNhdGVcblxuICAgIH07XG4gIH0pLmNhdGNoKG9uRXJyb3IuYmluZChudWxsLCAnRXJyb3IgZ2VuZXJhdGluZyBrZXlwYWlyJykpO1xufVxuXG4vKipcbiAqIFJlZm9ybWF0cyBzaWduYXR1cmUgcGFja2V0cyBmb3IgYSBrZXkgYW5kIHJld3JhcHMga2V5IG9iamVjdC5cbiAqIEBwYXJhbSAge0tleX0gcHJpdmF0ZUtleSAgICAgICAgICBwcml2YXRlIGtleSB0byByZWZvcm1hdFxuICogQHBhcmFtICB7QXJyYXk8T2JqZWN0Pn0gdXNlcklkcyAgIGFycmF5IG9mIHVzZXIgSURzIGUuZy4gW3sgbmFtZTonUGhpbCBaaW1tZXJtYW5uJywgZW1haWw6J3BoaWxAb3BlbnBncC5vcmcnIH1dXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHBhc3NwaHJhc2UgICAgICAgKG9wdGlvbmFsKSBUaGUgcGFzc3BocmFzZSB1c2VkIHRvIGVuY3J5cHQgdGhlIHJlc3VsdGluZyBwcml2YXRlIGtleVxuICogQHBhcmFtICB7TnVtYmVyfSBrZXlFeHBpcmF0aW9uVGltZSAob3B0aW9uYWwpIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhZnRlciB0aGUga2V5IGNyZWF0aW9uIHRpbWUgdGhhdCB0aGUga2V5IGV4cGlyZXNcbiAqIEBwYXJhbSAge0Jvb2xlYW59IHJldm9jYXRpb25DZXJ0aWZpY2F0ZSAob3B0aW9uYWwpIFdoZXRoZXIgdGhlIHJldHVybmVkIG9iamVjdCBzaG91bGQgaW5jbHVkZSBhIHJldm9jYXRpb24gY2VydGlmaWNhdGUgdG8gcmV2b2tlIHRoZSBwdWJsaWMga2V5XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSAgICAgICAgIFRoZSBnZW5lcmF0ZWQga2V5IG9iamVjdCBpbiB0aGUgZm9ybTpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsga2V5OktleSwgcHJpdmF0ZUtleUFybW9yZWQ6U3RyaW5nLCBwdWJsaWNLZXlBcm1vcmVkOlN0cmluZywgcmV2b2NhdGlvbkNlcnRpZmljYXRlOlN0cmluZyB9XG4gKiBAYXN5bmNcbiAqIEBzdGF0aWNcbiAqL1xuZnVuY3Rpb24gcmVmb3JtYXRLZXkoX3JlZjMpIHtcbiAgdmFyIHByaXZhdGVLZXkgPSBfcmVmMy5wcml2YXRlS2V5LFxuICAgICAgX3JlZjMkdXNlcklkcyA9IF9yZWYzLnVzZXJJZHMsXG4gICAgICB1c2VySWRzID0gX3JlZjMkdXNlcklkcyA9PT0gdW5kZWZpbmVkID8gW10gOiBfcmVmMyR1c2VySWRzLFxuICAgICAgX3JlZjMkcGFzc3BocmFzZSA9IF9yZWYzLnBhc3NwaHJhc2UsXG4gICAgICBwYXNzcGhyYXNlID0gX3JlZjMkcGFzc3BocmFzZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IF9yZWYzJHBhc3NwaHJhc2UsXG4gICAgICBfcmVmMyRrZXlFeHBpcmF0aW9uVGkgPSBfcmVmMy5rZXlFeHBpcmF0aW9uVGltZSxcbiAgICAgIGtleUV4cGlyYXRpb25UaW1lID0gX3JlZjMka2V5RXhwaXJhdGlvblRpID09PSB1bmRlZmluZWQgPyAwIDogX3JlZjMka2V5RXhwaXJhdGlvblRpLFxuICAgICAgZGF0ZSA9IF9yZWYzLmRhdGUsXG4gICAgICBfcmVmMyRyZXZvY2F0aW9uQ2VydGkgPSBfcmVmMy5yZXZvY2F0aW9uQ2VydGlmaWNhdGUsXG4gICAgICByZXZvY2F0aW9uQ2VydGlmaWNhdGUgPSBfcmVmMyRyZXZvY2F0aW9uQ2VydGkgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBfcmVmMyRyZXZvY2F0aW9uQ2VydGk7XG5cbiAgdXNlcklkcyA9IHRvQXJyYXkodXNlcklkcyk7XG4gIHZhciBvcHRpb25zID0geyBwcml2YXRlS2V5OiBwcml2YXRlS2V5LCB1c2VySWRzOiB1c2VySWRzLCBwYXNzcGhyYXNlOiBwYXNzcGhyYXNlLCBrZXlFeHBpcmF0aW9uVGltZToga2V5RXhwaXJhdGlvblRpbWUsIGRhdGU6IGRhdGUsIHJldm9jYXRpb25DZXJ0aWZpY2F0ZTogcmV2b2NhdGlvbkNlcnRpZmljYXRlIH07XG4gIGlmIChhc3luY1Byb3h5KSB7XG4gICAgcmV0dXJuIGFzeW5jUHJveHkuZGVsZWdhdGUoJ3JlZm9ybWF0S2V5Jywgb3B0aW9ucyk7XG4gIH1cblxuICBvcHRpb25zLnJldm9rZWQgPSBvcHRpb25zLnJldm9jYXRpb25DZXJ0aWZpY2F0ZTtcblxuICByZXR1cm4gKDAsIF9rZXkucmVmb3JtYXQpKG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciByZXZvY2F0aW9uQ2VydGlmaWNhdGUgPSBrZXkuZ2V0UmV2b2NhdGlvbkNlcnRpZmljYXRlKCk7XG4gICAga2V5LnJldm9jYXRpb25TaWduYXR1cmVzID0gW107XG5cbiAgICByZXR1cm4ge1xuXG4gICAgICBrZXk6IGtleSxcbiAgICAgIHByaXZhdGVLZXlBcm1vcmVkOiBrZXkuYXJtb3IoKSxcbiAgICAgIHB1YmxpY0tleUFybW9yZWQ6IGtleS50b1B1YmxpYygpLmFybW9yKCksXG4gICAgICByZXZvY2F0aW9uQ2VydGlmaWNhdGU6IHJldm9jYXRpb25DZXJ0aWZpY2F0ZVxuXG4gICAgfTtcbiAgfSkuY2F0Y2gob25FcnJvci5iaW5kKG51bGwsICdFcnJvciByZWZvcm1hdHRpbmcga2V5cGFpcicpKTtcbn1cblxuLyoqXG4gKiBSZXZva2VzIGEga2V5LiBSZXF1aXJlcyBlaXRoZXIgYSBwcml2YXRlIGtleSBvciBhIHJldm9jYXRpb24gY2VydGlmaWNhdGUuXG4gKiAgIElmIGEgcmV2b2NhdGlvbiBjZXJ0aWZpY2F0ZSBpcyBwYXNzZWQsIHRoZSByZWFzb25Gb3JSZXZvY2F0aW9uIHBhcmFtZXRlcnMgd2lsbCBiZSBpZ25vcmVkLlxuICogQHBhcmFtICB7S2V5fSBrZXkgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgcHVibGljIG9yIHByaXZhdGUga2V5IHRvIHJldm9rZVxuICogQHBhcmFtICB7U3RyaW5nfSByZXZvY2F0aW9uQ2VydGlmaWNhdGUgKG9wdGlvbmFsKSByZXZvY2F0aW9uIGNlcnRpZmljYXRlIHRvIHJldm9rZSB0aGUga2V5IHdpdGhcbiAqIEBwYXJhbSAge09iamVjdH0gcmVhc29uRm9yUmV2b2NhdGlvbiAob3B0aW9uYWwpIG9iamVjdCBpbmRpY2F0aW5nIHRoZSByZWFzb24gZm9yIHJldm9jYXRpb25cbiAqIEBwYXJhbSAge21vZHVsZTplbnVtcy5yZWFzb25Gb3JSZXZvY2F0aW9ufSByZWFzb25Gb3JSZXZvY2F0aW9uLmZsYWcgKG9wdGlvbmFsKSBmbGFnIGluZGljYXRpbmcgdGhlIHJlYXNvbiBmb3IgcmV2b2NhdGlvblxuICogQHBhcmFtICB7U3RyaW5nfSByZWFzb25Gb3JSZXZvY2F0aW9uLnN0cmluZyAob3B0aW9uYWwpIHN0cmluZyBleHBsYWluaW5nIHRoZSByZWFzb24gZm9yIHJldm9jYXRpb25cbiAqIEByZXR1cm4ge1Byb21pc2U8T2JqZWN0Pn0gICAgICAgICBUaGUgcmV2b2tlZCBrZXkgb2JqZWN0IGluIHRoZSBmb3JtOlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcml2YXRlS2V5OktleSwgcHJpdmF0ZUtleUFybW9yZWQ6U3RyaW5nLCBwdWJsaWNLZXk6S2V5LCBwdWJsaWNLZXlBcm1vcmVkOlN0cmluZyB9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgcHJpdmF0ZSBrZXkgaXMgcGFzc2VkKSBvciB7IHB1YmxpY0tleTpLZXksIHB1YmxpY0tleUFybW9yZWQ6U3RyaW5nIH0gKG90aGVyd2lzZSlcbiAqIEBzdGF0aWNcbiAqL1xuZnVuY3Rpb24gcmV2b2tlS2V5KCkge1xuICB2YXIgX3JlZjQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAga2V5ID0gX3JlZjQua2V5LFxuICAgICAgcmV2b2NhdGlvbkNlcnRpZmljYXRlID0gX3JlZjQucmV2b2NhdGlvbkNlcnRpZmljYXRlLFxuICAgICAgcmVhc29uRm9yUmV2b2NhdGlvbiA9IF9yZWY0LnJlYXNvbkZvclJldm9jYXRpb247XG5cbiAgdmFyIG9wdGlvbnMgPSB7XG4gICAga2V5OiBrZXksIHJldm9jYXRpb25DZXJ0aWZpY2F0ZTogcmV2b2NhdGlvbkNlcnRpZmljYXRlLCByZWFzb25Gb3JSZXZvY2F0aW9uOiByZWFzb25Gb3JSZXZvY2F0aW9uXG4gIH07XG5cbiAgaWYgKCFfdXRpbDIuZGVmYXVsdC5nZXRXZWJDcnlwdG9BbGwoKSAmJiBhc3luY1Byb3h5KSB7XG4gICAgLy8gdXNlIHdlYiB3b3JrZXIgaWYgd2ViIGNyeXB0byBhcGlzIGFyZSBub3Qgc3VwcG9ydGVkXG4gICAgcmV0dXJuIGFzeW5jUHJveHkuZGVsZWdhdGUoJ3Jldm9rZUtleScsIG9wdGlvbnMpO1xuICB9XG5cbiAgcmV0dXJuIF9wcm9taXNlMi5kZWZhdWx0LnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmV2b2NhdGlvbkNlcnRpZmljYXRlKSB7XG4gICAgICByZXR1cm4ga2V5LmFwcGx5UmV2b2NhdGlvbkNlcnRpZmljYXRlKHJldm9jYXRpb25DZXJ0aWZpY2F0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBrZXkucmV2b2tlKHJlYXNvbkZvclJldm9jYXRpb24pO1xuICAgIH1cbiAgfSkudGhlbihmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKGtleS5pc1ByaXZhdGUoKSkge1xuICAgICAgdmFyIHB1YmxpY0tleSA9IGtleS50b1B1YmxpYygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJpdmF0ZUtleToga2V5LFxuICAgICAgICBwcml2YXRlS2V5QXJtb3JlZDoga2V5LmFybW9yKCksXG4gICAgICAgIHB1YmxpY0tleTogcHVibGljS2V5LFxuICAgICAgICBwdWJsaWNLZXlBcm1vcmVkOiBwdWJsaWNLZXkuYXJtb3IoKVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1YmxpY0tleToga2V5LFxuICAgICAgcHVibGljS2V5QXJtb3JlZDoga2V5LmFybW9yKClcbiAgICB9O1xuICB9KS5jYXRjaChvbkVycm9yLmJpbmQobnVsbCwgJ0Vycm9yIHJldm9raW5nIGtleScpKTtcbn1cblxuLyoqXG4gKiBVbmxvY2sgYSBwcml2YXRlIGtleSB3aXRoIHlvdXIgcGFzc3BocmFzZS5cbiAqIEBwYXJhbSAge0tleX0gcHJpdmF0ZUtleSAgICAgICAgICAgICAgICAgICAgdGhlIHByaXZhdGUga2V5IHRoYXQgaXMgdG8gYmUgZGVjcnlwdGVkXG4gKiBAcGFyYW0gIHtTdHJpbmd8QXJyYXk8U3RyaW5nPn0gcGFzc3BocmFzZSAgIHRoZSB1c2VyJ3MgcGFzc3BocmFzZShzKSBjaG9zZW4gZHVyaW5nIGtleSBnZW5lcmF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSAgICAgICAgICAgICAgICAgIHRoZSB1bmxvY2tlZCBrZXkgb2JqZWN0IGluIHRoZSBmb3JtOiB7IGtleTpLZXkgfVxuICogQGFzeW5jXG4gKi9cbmZ1bmN0aW9uIGRlY3J5cHRLZXkoX3JlZjUpIHtcbiAgdmFyIHByaXZhdGVLZXkgPSBfcmVmNS5wcml2YXRlS2V5LFxuICAgICAgcGFzc3BocmFzZSA9IF9yZWY1LnBhc3NwaHJhc2U7XG5cbiAgaWYgKGFzeW5jUHJveHkpIHtcbiAgICAvLyB1c2Ugd2ViIHdvcmtlciBpZiBhdmFpbGFibGVcbiAgICByZXR1cm4gYXN5bmNQcm94eS5kZWxlZ2F0ZSgnZGVjcnlwdEtleScsIHsgcHJpdmF0ZUtleTogcHJpdmF0ZUtleSwgcGFzc3BocmFzZTogcGFzc3BocmFzZSB9KTtcbiAgfVxuXG4gIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5yZXNvbHZlKCkudGhlbigoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjtcbiAgICAgICAgICAgIHJldHVybiBwcml2YXRlS2V5LmRlY3J5cHQocGFzc3BocmFzZSk7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCB7XG4gICAgICAgICAgICAgIGtleTogcHJpdmF0ZUtleVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgfSkpKS5jYXRjaChvbkVycm9yLmJpbmQobnVsbCwgJ0Vycm9yIGRlY3J5cHRpbmcgcHJpdmF0ZSBrZXknKSk7XG59XG5cbi8qKlxuICogTG9jayBhIHByaXZhdGUga2V5IHdpdGggeW91ciBwYXNzcGhyYXNlLlxuICogQHBhcmFtICB7S2V5fSBwcml2YXRlS2V5ICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcml2YXRlIGtleSB0aGF0IGlzIHRvIGJlIGRlY3J5cHRlZFxuICogQHBhcmFtICB7U3RyaW5nfEFycmF5PFN0cmluZz59IHBhc3NwaHJhc2UgICAgIHRoZSB1c2VyJ3MgcGFzc3BocmFzZShzKSBjaG9zZW4gZHVyaW5nIGtleSBnZW5lcmF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSAgICAgICAgICAgICAgICAgICAgdGhlIGxvY2tlZCBrZXkgb2JqZWN0IGluIHRoZSBmb3JtOiB7IGtleTpLZXkgfVxuICogQGFzeW5jXG4gKi9cbmZ1bmN0aW9uIGVuY3J5cHRLZXkoX3JlZjcpIHtcbiAgdmFyIHByaXZhdGVLZXkgPSBfcmVmNy5wcml2YXRlS2V5LFxuICAgICAgcGFzc3BocmFzZSA9IF9yZWY3LnBhc3NwaHJhc2U7XG5cbiAgaWYgKGFzeW5jUHJveHkpIHtcbiAgICAvLyB1c2Ugd2ViIHdvcmtlciBpZiBhdmFpbGFibGVcbiAgICByZXR1cm4gYXN5bmNQcm94eS5kZWxlZ2F0ZSgnZW5jcnlwdEtleScsIHsgcHJpdmF0ZUtleTogcHJpdmF0ZUtleSwgcGFzc3BocmFzZTogcGFzc3BocmFzZSB9KTtcbiAgfVxuXG4gIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5yZXNvbHZlKCkudGhlbigoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoKSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjtcbiAgICAgICAgICAgIHJldHVybiBwcml2YXRlS2V5LmVuY3J5cHQocGFzc3BocmFzZSk7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywge1xuICAgICAgICAgICAgICBrZXk6IHByaXZhdGVLZXlcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyLCB0aGlzKTtcbiAgfSkpKS5jYXRjaChvbkVycm9yLmJpbmQobnVsbCwgJ0Vycm9yIGRlY3J5cHRpbmcgcHJpdmF0ZSBrZXknKSk7XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbi8vICAgTWVzc2FnZSBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uICAgLy9cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXG4vKipcbiAqIEVuY3J5cHRzIG1lc3NhZ2UgdGV4dC9kYXRhIHdpdGggcHVibGljIGtleXMsIHBhc3N3b3JkcyBvciBib3RoIGF0IG9uY2UuIEF0IGxlYXN0IGVpdGhlciBwdWJsaWMga2V5cyBvciBwYXNzd29yZHNcbiAqICAgbXVzdCBiZSBzcGVjaWZpZWQuIElmIHByaXZhdGUga2V5cyBhcmUgc3BlY2lmaWVkLCB0aG9zZSB3aWxsIGJlIHVzZWQgdG8gc2lnbiB0aGUgbWVzc2FnZS5cbiAqIEBwYXJhbSAge1N0cmluZ3xVaW50OEFycmF5fSBkYXRhICAgICAgICAgICAgICAgdGV4dC9kYXRhIHRvIGJlIGVuY3J5cHRlZCBhcyBKYXZhU2NyaXB0IGJpbmFyeSBzdHJpbmcgb3IgVWludDhBcnJheVxuICogQHBhcmFtICB7dXRmOHxiaW5hcnl8dGV4dHxtaW1lfSBkYXRhVHlwZSAgICAgICAob3B0aW9uYWwpIGRhdGEgcGFja2V0IHR5cGVcbiAqIEBwYXJhbSAge0tleXxBcnJheTxLZXk+fSBwdWJsaWNLZXlzICAgICAgICAgICAgKG9wdGlvbmFsKSBhcnJheSBvZiBrZXlzIG9yIHNpbmdsZSBrZXksIHVzZWQgdG8gZW5jcnlwdCB0aGUgbWVzc2FnZVxuICogQHBhcmFtICB7S2V5fEFycmF5PEtleT59IHByaXZhdGVLZXlzICAgICAgICAgICAob3B0aW9uYWwpIHByaXZhdGUga2V5cyBmb3Igc2lnbmluZy4gSWYgb21pdHRlZCBtZXNzYWdlIHdpbGwgbm90IGJlIHNpZ25lZFxuICogQHBhcmFtICB7U3RyaW5nfEFycmF5PFN0cmluZz59IHBhc3N3b3JkcyAgICAgICAob3B0aW9uYWwpIGFycmF5IG9mIHBhc3N3b3JkcyBvciBhIHNpbmdsZSBwYXNzd29yZCB0byBlbmNyeXB0IHRoZSBtZXNzYWdlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHNlc3Npb25LZXkgICAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgc2Vzc2lvbiBrZXkgaW4gdGhlIGZvcm06IHsgZGF0YTpVaW50OEFycmF5LCBhbGdvcml0aG06U3RyaW5nIH1cbiAqIEBwYXJhbSAge1N0cmluZ30gZmlsZW5hbWUgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbmFsKSBhIGZpbGVuYW1lIGZvciB0aGUgbGl0ZXJhbCBkYXRhIHBhY2tldFxuICogQHBhcmFtICB7bW9kdWxlOmVudW1zLmNvbXByZXNzaW9ufSBjb21wcmVzc2lvbiAob3B0aW9uYWwpIHdoaWNoIGNvbXByZXNzaW9uIGFsZ29yaXRobSB0byBjb21wcmVzcyB0aGUgbWVzc2FnZSB3aXRoLCBkZWZhdWx0cyB0byB3aGF0IGlzIHNwZWNpZmllZCBpbiBjb25maWdcbiAqIEBwYXJhbSAge0Jvb2xlYW59IGFybW9yICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbmFsKSBpZiB0aGUgcmV0dXJuIHZhbHVlcyBzaG91bGQgYmUgYXNjaWkgYXJtb3JlZCBvciB0aGUgbWVzc2FnZS9zaWduYXR1cmUgb2JqZWN0c1xuICogQHBhcmFtICB7Qm9vbGVhbn0gZGV0YWNoZWQgICAgICAgICAgICAgICAgICAgICAob3B0aW9uYWwpIGlmIHRoZSBzaWduYXR1cmUgc2hvdWxkIGJlIGRldGFjaGVkIChpZiB0cnVlLCBzaWduYXR1cmUgd2lsbCBiZSBhZGRlZCB0byByZXR1cm5lZCBvYmplY3QpXG4gKiBAcGFyYW0gIHtTaWduYXR1cmV9IHNpZ25hdHVyZSAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgYSBkZXRhY2hlZCBzaWduYXR1cmUgdG8gYWRkIHRvIHRoZSBlbmNyeXB0ZWQgbWVzc2FnZVxuICogQHBhcmFtICB7Qm9vbGVhbn0gcmV0dXJuU2Vzc2lvbktleSAgICAgICAgICAgICAob3B0aW9uYWwpIGlmIHRoZSB1bmVuY3J5cHRlZCBzZXNzaW9uIGtleSBzaG91bGQgYmUgYWRkZWQgdG8gcmV0dXJuZWQgb2JqZWN0XG4gKiBAcGFyYW0gIHtCb29sZWFufSB3aWxkY2FyZCAgICAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgdXNlIGEga2V5IElEIG9mIDAgaW5zdGVhZCBvZiB0aGUgcHVibGljIGtleSBJRHNcbiAqIEBwYXJhbSAge0RhdGV9IGRhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbmFsKSBvdmVycmlkZSB0aGUgY3JlYXRpb24gZGF0ZSBvZiB0aGUgbWVzc2FnZSBhbmQgdGhlIG1lc3NhZ2Ugc2lnbmF0dXJlXG4gKiBAcGFyYW0gIHtPYmplY3R9IGZyb21Vc2VySWQgICAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgdXNlciBJRCB0byBzaWduIHdpdGgsIGUuZy4geyBuYW1lOidTdGV2ZSBTZW5kZXInLCBlbWFpbDonc3RldmVAb3BlbnBncC5vcmcnIH1cbiAqIEBwYXJhbSAge09iamVjdH0gdG9Vc2VySWQgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbmFsKSB1c2VyIElEIHRvIGVuY3J5cHQgZm9yLCBlLmcuIHsgbmFtZTonUm9iZXJ0IFJlY2VpdmVyJywgZW1haWw6J3JvYmVydEBvcGVucGdwLm9yZycgfVxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkIChhbmQgb3B0aW9uYWxseSBzaWduZWQgbWVzc2FnZSkgaW4gdGhlIGZvcm06XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2RhdGE6IEFTQ0lJIGFybW9yZWQgbWVzc2FnZSBpZiAnYXJtb3InIGlzIHRydWUsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZnVsbCBNZXNzYWdlIG9iamVjdCBpZiAnYXJtb3InIGlzIGZhbHNlLCBzaWduYXR1cmU6IGRldGFjaGVkIHNpZ25hdHVyZSBpZiAnZGV0YWNoZWQnIGlzIHRydWV9XG4gKiBAYXN5bmNcbiAqIEBzdGF0aWNcbiAqL1xuZnVuY3Rpb24gZW5jcnlwdChfcmVmOSkge1xuICB2YXIgZGF0YSA9IF9yZWY5LmRhdGEsXG4gICAgICBkYXRhVHlwZSA9IF9yZWY5LmRhdGFUeXBlLFxuICAgICAgcHVibGljS2V5cyA9IF9yZWY5LnB1YmxpY0tleXMsXG4gICAgICBwcml2YXRlS2V5cyA9IF9yZWY5LnByaXZhdGVLZXlzLFxuICAgICAgcGFzc3dvcmRzID0gX3JlZjkucGFzc3dvcmRzLFxuICAgICAgc2Vzc2lvbktleSA9IF9yZWY5LnNlc3Npb25LZXksXG4gICAgICBmaWxlbmFtZSA9IF9yZWY5LmZpbGVuYW1lLFxuICAgICAgX3JlZjkkY29tcHJlc3Npb24gPSBfcmVmOS5jb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uID0gX3JlZjkkY29tcHJlc3Npb24gPT09IHVuZGVmaW5lZCA/IF9jb25maWcyLmRlZmF1bHQuY29tcHJlc3Npb24gOiBfcmVmOSRjb21wcmVzc2lvbixcbiAgICAgIF9yZWY5JGFybW9yID0gX3JlZjkuYXJtb3IsXG4gICAgICBhcm1vciA9IF9yZWY5JGFybW9yID09PSB1bmRlZmluZWQgPyB0cnVlIDogX3JlZjkkYXJtb3IsXG4gICAgICBfcmVmOSRkZXRhY2hlZCA9IF9yZWY5LmRldGFjaGVkLFxuICAgICAgZGV0YWNoZWQgPSBfcmVmOSRkZXRhY2hlZCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmOSRkZXRhY2hlZCxcbiAgICAgIF9yZWY5JHNpZ25hdHVyZSA9IF9yZWY5LnNpZ25hdHVyZSxcbiAgICAgIHNpZ25hdHVyZSA9IF9yZWY5JHNpZ25hdHVyZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9yZWY5JHNpZ25hdHVyZSxcbiAgICAgIF9yZWY5JHJldHVyblNlc3Npb25LZSA9IF9yZWY5LnJldHVyblNlc3Npb25LZXksXG4gICAgICByZXR1cm5TZXNzaW9uS2V5ID0gX3JlZjkkcmV0dXJuU2Vzc2lvbktlID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWY5JHJldHVyblNlc3Npb25LZSxcbiAgICAgIF9yZWY5JHdpbGRjYXJkID0gX3JlZjkud2lsZGNhcmQsXG4gICAgICB3aWxkY2FyZCA9IF9yZWY5JHdpbGRjYXJkID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWY5JHdpbGRjYXJkLFxuICAgICAgX3JlZjkkZGF0ZSA9IF9yZWY5LmRhdGUsXG4gICAgICBkYXRlID0gX3JlZjkkZGF0ZSA9PT0gdW5kZWZpbmVkID8gbmV3IERhdGUoKSA6IF9yZWY5JGRhdGUsXG4gICAgICBfcmVmOSRmcm9tVXNlcklkID0gX3JlZjkuZnJvbVVzZXJJZCxcbiAgICAgIGZyb21Vc2VySWQgPSBfcmVmOSRmcm9tVXNlcklkID09PSB1bmRlZmluZWQgPyB7fSA6IF9yZWY5JGZyb21Vc2VySWQsXG4gICAgICBfcmVmOSR0b1VzZXJJZCA9IF9yZWY5LnRvVXNlcklkLFxuICAgICAgdG9Vc2VySWQgPSBfcmVmOSR0b1VzZXJJZCA9PT0gdW5kZWZpbmVkID8ge30gOiBfcmVmOSR0b1VzZXJJZDtcblxuICBjaGVja0RhdGEoZGF0YSk7cHVibGljS2V5cyA9IHRvQXJyYXkocHVibGljS2V5cyk7cHJpdmF0ZUtleXMgPSB0b0FycmF5KHByaXZhdGVLZXlzKTtwYXNzd29yZHMgPSB0b0FycmF5KHBhc3N3b3Jkcyk7XG5cbiAgaWYgKCFuYXRpdmVBRUFEKCkgJiYgYXN5bmNQcm94eSkge1xuICAgIC8vIHVzZSB3ZWIgd29ya2VyIGlmIHdlYiBjcnlwdG8gYXBpcyBhcmUgbm90IHN1cHBvcnRlZFxuICAgIHJldHVybiBhc3luY1Byb3h5LmRlbGVnYXRlKCdlbmNyeXB0JywgeyBkYXRhOiBkYXRhLCBkYXRhVHlwZTogZGF0YVR5cGUsIHB1YmxpY0tleXM6IHB1YmxpY0tleXMsIHByaXZhdGVLZXlzOiBwcml2YXRlS2V5cywgcGFzc3dvcmRzOiBwYXNzd29yZHMsIHNlc3Npb25LZXk6IHNlc3Npb25LZXksIGZpbGVuYW1lOiBmaWxlbmFtZSwgY29tcHJlc3Npb246IGNvbXByZXNzaW9uLCBhcm1vcjogYXJtb3IsIGRldGFjaGVkOiBkZXRhY2hlZCwgc2lnbmF0dXJlOiBzaWduYXR1cmUsIHJldHVyblNlc3Npb25LZXk6IHJldHVyblNlc3Npb25LZXksIHdpbGRjYXJkOiB3aWxkY2FyZCwgZGF0ZTogZGF0ZSwgZnJvbVVzZXJJZDogZnJvbVVzZXJJZCwgdG9Vc2VySWQ6IHRvVXNlcklkIH0pO1xuICB9XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgcmV0dXJuIF9wcm9taXNlMi5kZWZhdWx0LnJlc29sdmUoKS50aGVuKCgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMygpIHtcbiAgICB2YXIgbWVzc2FnZSwgZGV0YWNoZWRTaWduYXR1cmU7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlKGRhdGEsIGZpbGVuYW1lLCBkYXRlLCBkYXRhVHlwZSk7XG5cbiAgICAgICAgICAgIGlmICghcHJpdmF0ZUtleXMpIHtcbiAgICAgICAgICAgICAgcHJpdmF0ZUtleXMgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCEocHJpdmF0ZUtleXMubGVuZ3RoIHx8IHNpZ25hdHVyZSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxMztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZGV0YWNoZWQpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNjtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLnNpZ25EZXRhY2hlZChwcml2YXRlS2V5cywgc2lnbmF0dXJlLCBkYXRlLCBmcm9tVXNlcklkKTtcblxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIGRldGFjaGVkU2lnbmF0dXJlID0gX2NvbnRleHQzLnNlbnQ7XG5cbiAgICAgICAgICAgIHJlc3VsdC5zaWduYXR1cmUgPSBhcm1vciA/IGRldGFjaGVkU2lnbmF0dXJlLmFybW9yKCkgOiBkZXRhY2hlZFNpZ25hdHVyZTtcbiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMTM7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDEyO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2Uuc2lnbihwcml2YXRlS2V5cywgc2lnbmF0dXJlLCBkYXRlLCBmcm9tVXNlcklkKTtcblxuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICBtZXNzYWdlID0gX2NvbnRleHQzLnNlbnQ7XG5cbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UuY29tcHJlc3MoY29tcHJlc3Npb24pO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoJ3JldHVybicsIG1lc3NhZ2UuZW5jcnlwdChwdWJsaWNLZXlzLCBwYXNzd29yZHMsIHNlc3Npb25LZXksIHdpbGRjYXJkLCBkYXRlLCB0b1VzZXJJZCkpO1xuXG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMywgdGhpcyk7XG4gIH0pKSkudGhlbihmdW5jdGlvbiAoZW5jcnlwdGVkKSB7XG4gICAgaWYgKGFybW9yKSB7XG4gICAgICByZXN1bHQuZGF0YSA9IGVuY3J5cHRlZC5tZXNzYWdlLmFybW9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5tZXNzYWdlID0gZW5jcnlwdGVkLm1lc3NhZ2U7XG4gICAgfVxuICAgIGlmIChyZXR1cm5TZXNzaW9uS2V5KSB7XG4gICAgICByZXN1bHQuc2Vzc2lvbktleSA9IGVuY3J5cHRlZC5zZXNzaW9uS2V5O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KS5jYXRjaChvbkVycm9yLmJpbmQobnVsbCwgJ0Vycm9yIGVuY3J5cHRpbmcgbWVzc2FnZScpKTtcbn1cblxuLyoqXG4gKiBEZWNyeXB0cyBhIG1lc3NhZ2Ugd2l0aCB0aGUgdXNlcidzIHByaXZhdGUga2V5LCBhIHNlc3Npb24ga2V5IG9yIGEgcGFzc3dvcmQuIEVpdGhlciBhIHByaXZhdGUga2V5LFxuICogICBhIHNlc3Npb24ga2V5IG9yIGEgcGFzc3dvcmQgbXVzdCBiZSBzcGVjaWZpZWQuXG4gKiBAcGFyYW0gIHtNZXNzYWdlfSBtZXNzYWdlICAgICAgICAgICAgICAgICAgdGhlIG1lc3NhZ2Ugb2JqZWN0IHdpdGggdGhlIGVuY3J5cHRlZCBkYXRhXG4gKiBAcGFyYW0gIHtLZXl8QXJyYXk8S2V5Pn0gcHJpdmF0ZUtleXMgICAgICAgKG9wdGlvbmFsKSBwcml2YXRlIGtleXMgd2l0aCBkZWNyeXB0ZWQgc2VjcmV0IGtleSBkYXRhIG9yIHNlc3Npb24ga2V5XG4gKiBAcGFyYW0gIHtTdHJpbmd8QXJyYXk8U3RyaW5nPn0gcGFzc3dvcmRzICAgKG9wdGlvbmFsKSBwYXNzd29yZHMgdG8gZGVjcnlwdCB0aGUgbWVzc2FnZVxuICogQHBhcmFtICB7T2JqZWN0fEFycmF5PE9iamVjdD59IHNlc3Npb25LZXlzIChvcHRpb25hbCkgc2Vzc2lvbiBrZXlzIGluIHRoZSBmb3JtOiB7IGRhdGE6VWludDhBcnJheSwgYWxnb3JpdGhtOlN0cmluZyB9XG4gKiBAcGFyYW0gIHtLZXl8QXJyYXk8S2V5Pn0gcHVibGljS2V5cyAgICAgICAgKG9wdGlvbmFsKSBhcnJheSBvZiBwdWJsaWMga2V5cyBvciBzaW5nbGUga2V5LCB0byB2ZXJpZnkgc2lnbmF0dXJlc1xuICogQHBhcmFtICB7U3RyaW5nfSBmb3JtYXQgICAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgcmV0dXJuIGRhdGEgZm9ybWF0IGVpdGhlciBhcyAndXRmOCcgb3IgJ2JpbmFyeSdcbiAqIEBwYXJhbSAge1NpZ25hdHVyZX0gc2lnbmF0dXJlICAgICAgICAgICAgICAob3B0aW9uYWwpIGRldGFjaGVkIHNpZ25hdHVyZSBmb3IgdmVyaWZpY2F0aW9uXG4gKiBAcGFyYW0gIHtEYXRlfSBkYXRlICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbmFsKSB1c2UgdGhlIGdpdmVuIGRhdGUgZm9yIHZlcmlmaWNhdGlvbiBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHRpbWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59ICAgICAgICAgICAgIGRlY3J5cHRlZCBhbmQgdmVyaWZpZWQgbWVzc2FnZSBpbiB0aGUgZm9ybTpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGRhdGE6VWludDhBcnJheXxTdHJpbmcsIGZpbGVuYW1lOlN0cmluZywgc2lnbmF0dXJlczpbeyBrZXlpZDpTdHJpbmcsIHZhbGlkOkJvb2xlYW4gfV0gfVxuICogQGFzeW5jXG4gKiBAc3RhdGljXG4gKi9cbmZ1bmN0aW9uIGRlY3J5cHQoX3JlZjExKSB7XG4gIHZhciBtZXNzYWdlID0gX3JlZjExLm1lc3NhZ2UsXG4gICAgICBwcml2YXRlS2V5cyA9IF9yZWYxMS5wcml2YXRlS2V5cyxcbiAgICAgIHBhc3N3b3JkcyA9IF9yZWYxMS5wYXNzd29yZHMsXG4gICAgICBzZXNzaW9uS2V5cyA9IF9yZWYxMS5zZXNzaW9uS2V5cyxcbiAgICAgIHB1YmxpY0tleXMgPSBfcmVmMTEucHVibGljS2V5cyxcbiAgICAgIF9yZWYxMSRmb3JtYXQgPSBfcmVmMTEuZm9ybWF0LFxuICAgICAgZm9ybWF0ID0gX3JlZjExJGZvcm1hdCA9PT0gdW5kZWZpbmVkID8gJ3V0ZjgnIDogX3JlZjExJGZvcm1hdCxcbiAgICAgIF9yZWYxMSRzaWduYXR1cmUgPSBfcmVmMTEuc2lnbmF0dXJlLFxuICAgICAgc2lnbmF0dXJlID0gX3JlZjExJHNpZ25hdHVyZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9yZWYxMSRzaWduYXR1cmUsXG4gICAgICBfcmVmMTEkZGF0ZSA9IF9yZWYxMS5kYXRlLFxuICAgICAgZGF0ZSA9IF9yZWYxMSRkYXRlID09PSB1bmRlZmluZWQgPyBuZXcgRGF0ZSgpIDogX3JlZjExJGRhdGU7XG5cbiAgY2hlY2tNZXNzYWdlKG1lc3NhZ2UpO3B1YmxpY0tleXMgPSB0b0FycmF5KHB1YmxpY0tleXMpO3ByaXZhdGVLZXlzID0gdG9BcnJheShwcml2YXRlS2V5cyk7cGFzc3dvcmRzID0gdG9BcnJheShwYXNzd29yZHMpO3Nlc3Npb25LZXlzID0gdG9BcnJheShzZXNzaW9uS2V5cyk7XG5cbiAgaWYgKCFuYXRpdmVBRUFEKCkgJiYgYXN5bmNQcm94eSkge1xuICAgIC8vIHVzZSB3ZWIgd29ya2VyIGlmIHdlYiBjcnlwdG8gYXBpcyBhcmUgbm90IHN1cHBvcnRlZFxuICAgIHJldHVybiBhc3luY1Byb3h5LmRlbGVnYXRlKCdkZWNyeXB0JywgeyBtZXNzYWdlOiBtZXNzYWdlLCBwcml2YXRlS2V5czogcHJpdmF0ZUtleXMsIHBhc3N3b3JkczogcGFzc3dvcmRzLCBzZXNzaW9uS2V5czogc2Vzc2lvbktleXMsIHB1YmxpY0tleXM6IHB1YmxpY0tleXMsIGZvcm1hdDogZm9ybWF0LCBzaWduYXR1cmU6IHNpZ25hdHVyZSwgZGF0ZTogZGF0ZSB9KTtcbiAgfVxuXG4gIHJldHVybiBtZXNzYWdlLmRlY3J5cHQocHJpdmF0ZUtleXMsIHBhc3N3b3Jkcywgc2Vzc2lvbktleXMpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTIgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQobWVzc2FnZSkge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7XG4gICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJlc3VsdCA9IHBhcnNlTWVzc2FnZShtZXNzYWdlLCBmb3JtYXQpO1xuXG5cbiAgICAgICAgICAgICAgaWYgKCFwdWJsaWNLZXlzKSB7XG4gICAgICAgICAgICAgICAgcHVibGljS2V5cyA9IFtdO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCFzaWduYXR1cmUpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDU7XG4gICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLnZlcmlmeURldGFjaGVkKHNpZ25hdHVyZSwgcHVibGljS2V5cywgZGF0ZSk7XG5cbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgX2NvbnRleHQ0LnQwID0gX2NvbnRleHQ0LnNlbnQ7XG4gICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTA7XG4gICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLnZlcmlmeShwdWJsaWNLZXlzLCBkYXRlKTtcblxuICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgX2NvbnRleHQ0LnQwID0gX2NvbnRleHQ0LnNlbnQ7XG5cbiAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgIHJlc3VsdC5zaWduYXR1cmVzID0gX2NvbnRleHQ0LnQwO1xuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdCgncmV0dXJuJywgcmVzdWx0KTtcblxuICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgX2NhbGxlZTQsIHRoaXMpO1xuICAgIH0pKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoX3gzKSB7XG4gICAgICByZXR1cm4gX3JlZjEyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSgpKS5jYXRjaChvbkVycm9yLmJpbmQobnVsbCwgJ0Vycm9yIGRlY3J5cHRpbmcgbWVzc2FnZScpKTtcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbi8vICAgTWVzc2FnZSBzaWduaW5nIGFuZCB2ZXJpZmljYXRpb24gICAvL1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXG4vKipcbiAqIFNpZ25zIGEgY2xlYXJ0ZXh0IG1lc3NhZ2UuXG4gKiBAcGFyYW0gIHtTdHJpbmcgfCBVaW50OEFycmF5fSBkYXRhICAgICAgICAgICBjbGVhcnRleHQgaW5wdXQgdG8gYmUgc2lnbmVkXG4gKiBAcGFyYW0gIHt1dGY4fGJpbmFyeXx0ZXh0fG1pbWV9IGRhdGFUeXBlICAgICAob3B0aW9uYWwpIGRhdGEgcGFja2V0IHR5cGVcbiAqIEBwYXJhbSAge0tleXxBcnJheTxLZXk+fSBwcml2YXRlS2V5cyAgICAgICAgIGFycmF5IG9mIGtleXMgb3Igc2luZ2xlIGtleSB3aXRoIGRlY3J5cHRlZCBzZWNyZXQga2V5IGRhdGEgdG8gc2lnbiBjbGVhcnRleHRcbiAqIEBwYXJhbSAge0Jvb2xlYW59IGFybW9yICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgaWYgdGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgYXNjaWkgYXJtb3JlZCBvciB0aGUgbWVzc2FnZSBvYmplY3RcbiAqIEBwYXJhbSAge0Jvb2xlYW59IGRldGFjaGVkICAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgaWYgdGhlIHJldHVybiB2YWx1ZSBzaG91bGQgY29udGFpbiBhIGRldGFjaGVkIHNpZ25hdHVyZVxuICogQHBhcmFtICB7RGF0ZX0gZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbmFsKSBvdmVycmlkZSB0aGUgY3JlYXRpb24gZGF0ZSBzaWduYXR1cmVcbiAqIEBwYXJhbSAge09iamVjdH0gZnJvbVVzZXJJZCAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgdXNlciBJRCB0byBzaWduIHdpdGgsIGUuZy4geyBuYW1lOidTdGV2ZSBTZW5kZXInLCBlbWFpbDonc3RldmVAb3BlbnBncC5vcmcnIH1cbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59ICAgICAgICAgICAgICAgICAgICBzaWduZWQgY2xlYXJ0ZXh0IGluIHRoZSBmb3JtOlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZGF0YTogQVNDSUkgYXJtb3JlZCBtZXNzYWdlIGlmICdhcm1vcicgaXMgdHJ1ZSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZnVsbCBNZXNzYWdlIG9iamVjdCBpZiAnYXJtb3InIGlzIGZhbHNlLCBzaWduYXR1cmU6IGRldGFjaGVkIHNpZ25hdHVyZSBpZiAnZGV0YWNoZWQnIGlzIHRydWV9XG4gKiBAYXN5bmNcbiAqIEBzdGF0aWNcbiAqL1xuZnVuY3Rpb24gc2lnbihfcmVmMTMpIHtcbiAgdmFyIGRhdGEgPSBfcmVmMTMuZGF0YSxcbiAgICAgIGRhdGFUeXBlID0gX3JlZjEzLmRhdGFUeXBlLFxuICAgICAgcHJpdmF0ZUtleXMgPSBfcmVmMTMucHJpdmF0ZUtleXMsXG4gICAgICBfcmVmMTMkYXJtb3IgPSBfcmVmMTMuYXJtb3IsXG4gICAgICBhcm1vciA9IF9yZWYxMyRhcm1vciA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IF9yZWYxMyRhcm1vcixcbiAgICAgIF9yZWYxMyRkZXRhY2hlZCA9IF9yZWYxMy5kZXRhY2hlZCxcbiAgICAgIGRldGFjaGVkID0gX3JlZjEzJGRldGFjaGVkID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWYxMyRkZXRhY2hlZCxcbiAgICAgIF9yZWYxMyRkYXRlID0gX3JlZjEzLmRhdGUsXG4gICAgICBkYXRlID0gX3JlZjEzJGRhdGUgPT09IHVuZGVmaW5lZCA/IG5ldyBEYXRlKCkgOiBfcmVmMTMkZGF0ZSxcbiAgICAgIF9yZWYxMyRmcm9tVXNlcklkID0gX3JlZjEzLmZyb21Vc2VySWQsXG4gICAgICBmcm9tVXNlcklkID0gX3JlZjEzJGZyb21Vc2VySWQgPT09IHVuZGVmaW5lZCA/IHt9IDogX3JlZjEzJGZyb21Vc2VySWQ7XG5cbiAgY2hlY2tEYXRhKGRhdGEpO1xuICBwcml2YXRlS2V5cyA9IHRvQXJyYXkocHJpdmF0ZUtleXMpO1xuXG4gIGlmIChhc3luY1Byb3h5KSB7XG4gICAgLy8gdXNlIHdlYiB3b3JrZXIgaWYgYXZhaWxhYmxlXG4gICAgcmV0dXJuIGFzeW5jUHJveHkuZGVsZWdhdGUoJ3NpZ24nLCB7XG4gICAgICBkYXRhOiBkYXRhLCBkYXRhVHlwZTogZGF0YVR5cGUsIHByaXZhdGVLZXlzOiBwcml2YXRlS2V5cywgYXJtb3I6IGFybW9yLCBkZXRhY2hlZDogZGV0YWNoZWQsIGRhdGU6IGRhdGUsIGZyb21Vc2VySWQ6IGZyb21Vc2VySWRcbiAgICB9KTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSB7fTtcbiAgcmV0dXJuIF9wcm9taXNlMi5kZWZhdWx0LnJlc29sdmUoKS50aGVuKCgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlNSgpIHtcbiAgICB2YXIgbWVzc2FnZSwgc2lnbmF0dXJlO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNSQoX2NvbnRleHQ1KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NS5wcmV2ID0gX2NvbnRleHQ1Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBtZXNzYWdlID0gX3V0aWwyLmRlZmF1bHQuaXNTdHJpbmcoZGF0YSkgPyBuZXcgX2NsZWFydGV4dC5DbGVhcnRleHRNZXNzYWdlKGRhdGEpIDogbWVzc2FnZUxpYi5mcm9tQmluYXJ5KGRhdGEsIGRhdGFUeXBlKTtcblxuICAgICAgICAgICAgaWYgKCFkZXRhY2hlZCkge1xuICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDg7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDQ7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5zaWduRGV0YWNoZWQocHJpdmF0ZUtleXMsIHVuZGVmaW5lZCwgZGF0ZSwgZnJvbVVzZXJJZCk7XG5cbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBzaWduYXR1cmUgPSBfY29udGV4dDUuc2VudDtcblxuICAgICAgICAgICAgcmVzdWx0LnNpZ25hdHVyZSA9IGFybW9yID8gc2lnbmF0dXJlLmFybW9yKCkgOiBzaWduYXR1cmU7XG4gICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDEyO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDEwO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2Uuc2lnbihwcml2YXRlS2V5cywgdW5kZWZpbmVkLCBkYXRlLCBmcm9tVXNlcklkKTtcblxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBtZXNzYWdlID0gX2NvbnRleHQ1LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChhcm1vcikge1xuICAgICAgICAgICAgICByZXN1bHQuZGF0YSA9IG1lc3NhZ2UuYXJtb3IoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LmFicnVwdCgncmV0dXJuJywgcmVzdWx0KTtcblxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTUsIHRoaXMpO1xuICB9KSkpLmNhdGNoKG9uRXJyb3IuYmluZChudWxsLCAnRXJyb3Igc2lnbmluZyBjbGVhcnRleHQgbWVzc2FnZScpKTtcbn1cblxuLyoqXG4gKiBWZXJpZmllcyBzaWduYXR1cmVzIG9mIGNsZWFydGV4dCBzaWduZWQgbWVzc2FnZVxuICogQHBhcmFtICB7S2V5fEFycmF5PEtleT59IHB1YmxpY0tleXMgICBhcnJheSBvZiBwdWJsaWNLZXlzIG9yIHNpbmdsZSBrZXksIHRvIHZlcmlmeSBzaWduYXR1cmVzXG4gKiBAcGFyYW0gIHtDbGVhcnRleHRNZXNzYWdlfSBtZXNzYWdlICAgIGNsZWFydGV4dCBtZXNzYWdlIG9iamVjdCB3aXRoIHNpZ25hdHVyZXNcbiAqIEBwYXJhbSAge1NpZ25hdHVyZX0gc2lnbmF0dXJlICAgICAgICAgKG9wdGlvbmFsKSBkZXRhY2hlZCBzaWduYXR1cmUgZm9yIHZlcmlmaWNhdGlvblxuICogQHBhcmFtICB7RGF0ZX0gZGF0ZSAgICAgICAgICAgICAgICAgICAob3B0aW9uYWwpIHVzZSB0aGUgZ2l2ZW4gZGF0ZSBmb3IgdmVyaWZpY2F0aW9uIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgdGltZVxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gICAgICAgICAgICAgY2xlYXJ0ZXh0IHdpdGggc3RhdHVzIG9mIHZlcmlmaWVkIHNpZ25hdHVyZXMgaW4gdGhlIGZvcm0gb2Y6XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZGF0YTpTdHJpbmcsIHNpZ25hdHVyZXM6IFt7IGtleWlkOlN0cmluZywgdmFsaWQ6Qm9vbGVhbiB9XSB9XG4gKiBAYXN5bmNcbiAqIEBzdGF0aWNcbiAqL1xuZnVuY3Rpb24gdmVyaWZ5KF9yZWYxNSkge1xuICB2YXIgbWVzc2FnZSA9IF9yZWYxNS5tZXNzYWdlLFxuICAgICAgcHVibGljS2V5cyA9IF9yZWYxNS5wdWJsaWNLZXlzLFxuICAgICAgX3JlZjE1JHNpZ25hdHVyZSA9IF9yZWYxNS5zaWduYXR1cmUsXG4gICAgICBzaWduYXR1cmUgPSBfcmVmMTUkc2lnbmF0dXJlID09PSB1bmRlZmluZWQgPyBudWxsIDogX3JlZjE1JHNpZ25hdHVyZSxcbiAgICAgIF9yZWYxNSRkYXRlID0gX3JlZjE1LmRhdGUsXG4gICAgICBkYXRlID0gX3JlZjE1JGRhdGUgPT09IHVuZGVmaW5lZCA/IG5ldyBEYXRlKCkgOiBfcmVmMTUkZGF0ZTtcblxuICBjaGVja0NsZWFydGV4dE9yTWVzc2FnZShtZXNzYWdlKTtcbiAgcHVibGljS2V5cyA9IHRvQXJyYXkocHVibGljS2V5cyk7XG5cbiAgaWYgKGFzeW5jUHJveHkpIHtcbiAgICAvLyB1c2Ugd2ViIHdvcmtlciBpZiBhdmFpbGFibGVcbiAgICByZXR1cm4gYXN5bmNQcm94eS5kZWxlZ2F0ZSgndmVyaWZ5JywgeyBtZXNzYWdlOiBtZXNzYWdlLCBwdWJsaWNLZXlzOiBwdWJsaWNLZXlzLCBzaWduYXR1cmU6IHNpZ25hdHVyZSwgZGF0ZTogZGF0ZSB9KTtcbiAgfVxuXG4gIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5yZXNvbHZlKCkudGhlbigoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTYoKSB7XG4gICAgdmFyIHJlc3VsdDtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTYkKF9jb250ZXh0Nikge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDYucHJldiA9IF9jb250ZXh0Ni5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gbWVzc2FnZSBpbnN0YW5jZW9mIF9jbGVhcnRleHQuQ2xlYXJ0ZXh0TWVzc2FnZSA/IG1lc3NhZ2UuZ2V0VGV4dCgpIDogbWVzc2FnZS5nZXRMaXRlcmFsRGF0YSgpO1xuXG4gICAgICAgICAgICBpZiAoIXNpZ25hdHVyZSkge1xuICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDg7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDU7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS52ZXJpZnlEZXRhY2hlZChzaWduYXR1cmUsIHB1YmxpY0tleXMsIGRhdGUpO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgX2NvbnRleHQ2LnQwID0gX2NvbnRleHQ2LnNlbnQ7XG4gICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDExO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDEwO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UudmVyaWZ5KHB1YmxpY0tleXMsIGRhdGUpO1xuXG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIF9jb250ZXh0Ni50MCA9IF9jb250ZXh0Ni5zZW50O1xuXG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIHJlc3VsdC5zaWduYXR1cmVzID0gX2NvbnRleHQ2LnQwO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5hYnJ1cHQoJ3JldHVybicsIHJlc3VsdCk7XG5cbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWU2LCB0aGlzKTtcbiAgfSkpKS5jYXRjaChvbkVycm9yLmJpbmQobnVsbCwgJ0Vycm9yIHZlcmlmeWluZyBjbGVhcnRleHQgc2lnbmVkIG1lc3NhZ2UnKSk7XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuLy8gICBTZXNzaW9uIGtleSBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uICAgLy9cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cbi8qKlxuICogRW5jcnlwdCBhIHN5bW1ldHJpYyBzZXNzaW9uIGtleSB3aXRoIHB1YmxpYyBrZXlzLCBwYXNzd29yZHMsIG9yIGJvdGggYXQgb25jZS4gQXQgbGVhc3QgZWl0aGVyIHB1YmxpYyBrZXlzXG4gKiAgIG9yIHBhc3N3b3JkcyBtdXN0IGJlIHNwZWNpZmllZC5cbiAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IGRhdGEgICAgICAgICAgICAgICAgICB0aGUgc2Vzc2lvbiBrZXkgdG8gYmUgZW5jcnlwdGVkIGUuZy4gMTYgcmFuZG9tIGJ5dGVzIChmb3IgYWVzMTI4KVxuICogQHBhcmFtICB7U3RyaW5nfSBhbGdvcml0aG0gICAgICAgICAgICAgICAgIGFsZ29yaXRobSBvZiB0aGUgc3ltbWV0cmljIHNlc3Npb24ga2V5IGUuZy4gJ2FlczEyOCcgb3IgJ2FlczI1NidcbiAqIEBwYXJhbSAge1N0cmluZ30gYWVhZEFsZ29yaXRobSAgICAgICAgICAgICAob3B0aW9uYWwpIGFlYWQgYWxnb3JpdGhtLCBlLmcuICdlYXgnIG9yICdvY2InXG4gKiBAcGFyYW0gIHtLZXl8QXJyYXk8S2V5Pn0gcHVibGljS2V5cyAgICAgICAgKG9wdGlvbmFsKSBhcnJheSBvZiBwdWJsaWMga2V5cyBvciBzaW5nbGUga2V5LCB1c2VkIHRvIGVuY3J5cHQgdGhlIGtleVxuICogQHBhcmFtICB7U3RyaW5nfEFycmF5PFN0cmluZz59IHBhc3N3b3JkcyAgIChvcHRpb25hbCkgcGFzc3dvcmRzIGZvciB0aGUgbWVzc2FnZVxuICogQHBhcmFtICB7Qm9vbGVhbn0gd2lsZGNhcmQgICAgICAgICAgICAgICAgIChvcHRpb25hbCkgdXNlIGEga2V5IElEIG9mIDAgaW5zdGVhZCBvZiB0aGUgcHVibGljIGtleSBJRHNcbiAqIEBwYXJhbSAge0RhdGV9IGRhdGUgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uYWwpIG92ZXJyaWRlIHRoZSBkYXRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHRvVXNlcklkICAgICAgICAgICAgICAgICAgKG9wdGlvbmFsKSB1c2VyIElEIHRvIGVuY3J5cHQgZm9yLCBlLmcuIHsgbmFtZTonUGhpbCBaaW1tZXJtYW5uJywgZW1haWw6J3BoaWxAb3BlbnBncC5vcmcnIH1cbiAqIEByZXR1cm5zIHtQcm9taXNlPE1lc3NhZ2U+fSAgICAgICAgICAgICAgICAgdGhlIGVuY3J5cHRlZCBzZXNzaW9uIGtleSBwYWNrZXRzIGNvbnRhaW5lZCBpbiBhIG1lc3NhZ2Ugb2JqZWN0XG4gKiBAYXN5bmNcbiAqIEBzdGF0aWNcbiAqL1xuZnVuY3Rpb24gZW5jcnlwdFNlc3Npb25LZXkoX3JlZjE3KSB7XG4gIHZhciBkYXRhID0gX3JlZjE3LmRhdGEsXG4gICAgICBhbGdvcml0aG0gPSBfcmVmMTcuYWxnb3JpdGhtLFxuICAgICAgYWVhZEFsZ29yaXRobSA9IF9yZWYxNy5hZWFkQWxnb3JpdGhtLFxuICAgICAgcHVibGljS2V5cyA9IF9yZWYxNy5wdWJsaWNLZXlzLFxuICAgICAgcGFzc3dvcmRzID0gX3JlZjE3LnBhc3N3b3JkcyxcbiAgICAgIF9yZWYxNyR3aWxkY2FyZCA9IF9yZWYxNy53aWxkY2FyZCxcbiAgICAgIHdpbGRjYXJkID0gX3JlZjE3JHdpbGRjYXJkID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWYxNyR3aWxkY2FyZCxcbiAgICAgIF9yZWYxNyRkYXRlID0gX3JlZjE3LmRhdGUsXG4gICAgICBkYXRlID0gX3JlZjE3JGRhdGUgPT09IHVuZGVmaW5lZCA/IG5ldyBEYXRlKCkgOiBfcmVmMTckZGF0ZSxcbiAgICAgIF9yZWYxNyR0b1VzZXJJZCA9IF9yZWYxNy50b1VzZXJJZCxcbiAgICAgIHRvVXNlcklkID0gX3JlZjE3JHRvVXNlcklkID09PSB1bmRlZmluZWQgPyB7fSA6IF9yZWYxNyR0b1VzZXJJZDtcblxuICBjaGVja0JpbmFyeShkYXRhKTtjaGVja1N0cmluZyhhbGdvcml0aG0sICdhbGdvcml0aG0nKTtwdWJsaWNLZXlzID0gdG9BcnJheShwdWJsaWNLZXlzKTtwYXNzd29yZHMgPSB0b0FycmF5KHBhc3N3b3Jkcyk7XG5cbiAgaWYgKGFzeW5jUHJveHkpIHtcbiAgICAvLyB1c2Ugd2ViIHdvcmtlciBpZiBhdmFpbGFibGVcbiAgICByZXR1cm4gYXN5bmNQcm94eS5kZWxlZ2F0ZSgnZW5jcnlwdFNlc3Npb25LZXknLCB7IGRhdGE6IGRhdGEsIGFsZ29yaXRobTogYWxnb3JpdGhtLCBhZWFkQWxnb3JpdGhtOiBhZWFkQWxnb3JpdGhtLCBwdWJsaWNLZXlzOiBwdWJsaWNLZXlzLCBwYXNzd29yZHM6IHBhc3N3b3Jkcywgd2lsZGNhcmQ6IHdpbGRjYXJkLCBkYXRlOiBkYXRlLCB0b1VzZXJJZDogdG9Vc2VySWQgfSk7XG4gIH1cblxuICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQucmVzb2x2ZSgpLnRoZW4oKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU3KCkge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNyQoX2NvbnRleHQ3KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Ny5wcmV2ID0gX2NvbnRleHQ3Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDI7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZUxpYi5lbmNyeXB0U2Vzc2lvbktleShkYXRhLCBhbGdvcml0aG0sIGFlYWRBbGdvcml0aG0sIHB1YmxpY0tleXMsIHBhc3N3b3Jkcywgd2lsZGNhcmQsIGRhdGUsIHRvVXNlcklkKTtcblxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIF9jb250ZXh0Ny50MCA9IF9jb250ZXh0Ny5zZW50O1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ny5hYnJ1cHQoJ3JldHVybicsIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogX2NvbnRleHQ3LnQwXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ny5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlNywgdGhpcyk7XG4gIH0pKSkuY2F0Y2gob25FcnJvci5iaW5kKG51bGwsICdFcnJvciBlbmNyeXB0aW5nIHNlc3Npb24ga2V5JykpO1xufVxuXG4vKipcbiAqIERlY3J5cHQgc3ltbWV0cmljIHNlc3Npb24ga2V5cyB3aXRoIGEgcHJpdmF0ZSBrZXkgb3IgcGFzc3dvcmQuIEVpdGhlciBhIHByaXZhdGUga2V5IG9yXG4gKiAgIGEgcGFzc3dvcmQgbXVzdCBiZSBzcGVjaWZpZWQuXG4gKiBAcGFyYW0gIHtNZXNzYWdlfSBtZXNzYWdlICAgICAgICAgICAgICAgICBhIG1lc3NhZ2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGVuY3J5cHRlZCBzZXNzaW9uIGtleSBwYWNrZXRzXG4gKiBAcGFyYW0gIHtLZXl8QXJyYXk8S2V5Pn0gcHJpdmF0ZUtleXMgICAgIChvcHRpb25hbCkgcHJpdmF0ZSBrZXlzIHdpdGggZGVjcnlwdGVkIHNlY3JldCBrZXkgZGF0YVxuICogQHBhcmFtICB7U3RyaW5nfEFycmF5PFN0cmluZz59IHBhc3N3b3JkcyAob3B0aW9uYWwpIHBhc3N3b3JkcyB0byBkZWNyeXB0IHRoZSBzZXNzaW9uIGtleVxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0fHVuZGVmaW5lZD59ICAgIEFycmF5IG9mIGRlY3J5cHRlZCBzZXNzaW9uIGtleSwgYWxnb3JpdGhtIHBhaXJzIGluIGZvcm06XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZGF0YTpVaW50OEFycmF5LCBhbGdvcml0aG06U3RyaW5nIH1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgJ3VuZGVmaW5lZCcgaWYgbm8ga2V5IHBhY2tldHMgZm91bmRcbiAqIEBhc3luY1xuICogQHN0YXRpY1xuICovXG5mdW5jdGlvbiBkZWNyeXB0U2Vzc2lvbktleXMoX3JlZjE5KSB7XG4gIHZhciBtZXNzYWdlID0gX3JlZjE5Lm1lc3NhZ2UsXG4gICAgICBwcml2YXRlS2V5cyA9IF9yZWYxOS5wcml2YXRlS2V5cyxcbiAgICAgIHBhc3N3b3JkcyA9IF9yZWYxOS5wYXNzd29yZHM7XG5cbiAgY2hlY2tNZXNzYWdlKG1lc3NhZ2UpO3ByaXZhdGVLZXlzID0gdG9BcnJheShwcml2YXRlS2V5cyk7cGFzc3dvcmRzID0gdG9BcnJheShwYXNzd29yZHMpO1xuXG4gIGlmIChhc3luY1Byb3h5KSB7XG4gICAgLy8gdXNlIHdlYiB3b3JrZXIgaWYgYXZhaWxhYmxlXG4gICAgcmV0dXJuIGFzeW5jUHJveHkuZGVsZWdhdGUoJ2RlY3J5cHRTZXNzaW9uS2V5cycsIHsgbWVzc2FnZTogbWVzc2FnZSwgcHJpdmF0ZUtleXM6IHByaXZhdGVLZXlzLCBwYXNzd29yZHM6IHBhc3N3b3JkcyB9KTtcbiAgfVxuXG4gIHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5yZXNvbHZlKCkudGhlbigoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTgoKSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWU4JChfY29udGV4dDgpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQ4LnByZXYgPSBfY29udGV4dDgubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDguYWJydXB0KCdyZXR1cm4nLCBtZXNzYWdlLmRlY3J5cHRTZXNzaW9uS2V5cyhwcml2YXRlS2V5cywgcGFzc3dvcmRzKSk7XG5cbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDguc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTgsIHRoaXMpO1xuICB9KSkpLmNhdGNoKG9uRXJyb3IuYmluZChudWxsLCAnRXJyb3IgZGVjcnlwdGluZyBzZXNzaW9uIGtleXMnKSk7XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgICAgICAgICAgICAgICAgICAgICAvL1xuLy8gICBIZWxwZXIgZnVuY3Rpb25zICAgLy9cbi8vICAgICAgICAgICAgICAgICAgICAgIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cbi8qKlxuICogSW5wdXQgdmFsaWRhdGlvblxuICovXG5mdW5jdGlvbiBjaGVja1N0cmluZyhkYXRhLCBuYW1lKSB7XG4gIGlmICghX3V0aWwyLmRlZmF1bHQuaXNTdHJpbmcoZGF0YSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciBbJyArIChuYW1lIHx8ICdkYXRhJykgKyAnXSBtdXN0IGJlIG9mIHR5cGUgU3RyaW5nJyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrQmluYXJ5KGRhdGEsIG5hbWUpIHtcbiAgaWYgKCFfdXRpbDIuZGVmYXVsdC5pc1VpbnQ4QXJyYXkoZGF0YSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciBbJyArIChuYW1lIHx8ICdkYXRhJykgKyAnXSBtdXN0IGJlIG9mIHR5cGUgVWludDhBcnJheScpO1xuICB9XG59XG5mdW5jdGlvbiBjaGVja0RhdGEoZGF0YSwgbmFtZSkge1xuICBpZiAoIV91dGlsMi5kZWZhdWx0LmlzVWludDhBcnJheShkYXRhKSAmJiAhX3V0aWwyLmRlZmF1bHQuaXNTdHJpbmcoZGF0YSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciBbJyArIChuYW1lIHx8ICdkYXRhJykgKyAnXSBtdXN0IGJlIG9mIHR5cGUgU3RyaW5nIG9yIFVpbnQ4QXJyYXknKTtcbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgaWYgKCEobWVzc2FnZSBpbnN0YW5jZW9mIG1lc3NhZ2VMaWIuTWVzc2FnZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciBbbWVzc2FnZV0gbmVlZHMgdG8gYmUgb2YgdHlwZSBNZXNzYWdlJyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrQ2xlYXJ0ZXh0T3JNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgaWYgKCEobWVzc2FnZSBpbnN0YW5jZW9mIF9jbGVhcnRleHQuQ2xlYXJ0ZXh0TWVzc2FnZSkgJiYgIShtZXNzYWdlIGluc3RhbmNlb2YgbWVzc2FnZUxpYi5NZXNzYWdlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVyIFttZXNzYWdlXSBuZWVkcyB0byBiZSBvZiB0eXBlIE1lc3NhZ2Ugb3IgQ2xlYXJ0ZXh0TWVzc2FnZScpO1xuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplIHBhcmFtZXRlciB0byBhbiBhcnJheSBpZiBpdCBpcyBub3QgdW5kZWZpbmVkLlxuICogQHBhcmFtICB7T2JqZWN0fSBwYXJhbSAgICAgICAgICAgICAgdGhlIHBhcmFtZXRlciB0byBiZSBub3JtYWxpemVkXG4gKiBAcmV0dXJucyB7QXJyYXk8T2JqZWN0Pnx1bmRlZmluZWR9ICAgdGhlIHJlc3VsdGluZyBhcnJheSBvciB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gdG9BcnJheShwYXJhbSkge1xuICBpZiAocGFyYW0gJiYgIV91dGlsMi5kZWZhdWx0LmlzQXJyYXkocGFyYW0pKSB7XG4gICAgcGFyYW0gPSBbcGFyYW1dO1xuICB9XG4gIHJldHVybiBwYXJhbTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWVzc2FnZSBvYmVqY3QgZWl0aGVyIGZyb20gYSBVaW50OEFycmF5IG9yIGEgc3RyaW5nLlxuICogQHBhcmFtICB7U3RyaW5nfFVpbnQ4QXJyYXl9IGRhdGEgICB0aGUgcGF5bG9hZCBmb3IgdGhlIG1lc3NhZ2VcbiAqIEBwYXJhbSAge1N0cmluZ30gZmlsZW5hbWUgICAgICAgICAgdGhlIGxpdGVyYWwgZGF0YSBwYWNrZXQncyBmaWxlbmFtZVxuICogQHBhcmFtICB7RGF0ZX0gZGF0ZSAgICAgIHRoZSBjcmVhdGlvbiBkYXRlIG9mIHRoZSBwYWNrYWdlXG4gKiBAcGFyYW0gIHt1dGY4fGJpbmFyeXx0ZXh0fG1pbWV9IHR5cGUgKG9wdGlvbmFsKSBkYXRhIHBhY2tldCB0eXBlXG4gKiBAcmV0dXJucyB7TWVzc2FnZX0gICAgICAgICAgICAgICAgICBhIG1lc3NhZ2Ugb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2UoZGF0YSwgZmlsZW5hbWUpIHtcbiAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG5ldyBEYXRlKCk7XG4gIHZhciB0eXBlID0gYXJndW1lbnRzWzNdO1xuXG4gIHZhciBtc2cgPSB2b2lkIDA7XG4gIGlmIChfdXRpbDIuZGVmYXVsdC5pc1VpbnQ4QXJyYXkoZGF0YSkpIHtcbiAgICBtc2cgPSBtZXNzYWdlTGliLmZyb21CaW5hcnkoZGF0YSwgZmlsZW5hbWUsIGRhdGUsIHR5cGUpO1xuICB9IGVsc2UgaWYgKF91dGlsMi5kZWZhdWx0LmlzU3RyaW5nKGRhdGEpKSB7XG4gICAgbXNnID0gbWVzc2FnZUxpYi5mcm9tVGV4dChkYXRhLCBmaWxlbmFtZSwgZGF0ZSwgdHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIG11c3QgYmUgb2YgdHlwZSBTdHJpbmcgb3IgVWludDhBcnJheScpO1xuICB9XG4gIHJldHVybiBtc2c7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIG1lc3NhZ2UgZ2l2ZW4gYSBjZXJ0YWluIGZvcm1hdC5cbiAqIEBwYXJhbSAge01lc3NhZ2V9IG1lc3NhZ2UgICB0aGUgbWVzc2FnZSBvYmplY3QgdG8gYmUgcGFyc2VcbiAqIEBwYXJhbSAge1N0cmluZ30gZm9ybWF0ICAgICB0aGUgb3V0cHV0IGZvcm1hdCBlLmcuICd1dGY4JyBvciAnYmluYXJ5J1xuICogQHJldHVybnMge09iamVjdH0gICAgICAgICAgICB0aGUgcGFyc2UgZGF0YSBpbiB0aGUgcmVzcGVjdGl2ZSBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZXNzYWdlKG1lc3NhZ2UsIGZvcm1hdCkge1xuICBpZiAoZm9ybWF0ID09PSAnYmluYXJ5Jykge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBtZXNzYWdlLmdldExpdGVyYWxEYXRhKCksXG4gICAgICBmaWxlbmFtZTogbWVzc2FnZS5nZXRGaWxlbmFtZSgpXG4gICAgfTtcbiAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICd1dGY4Jykge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBtZXNzYWdlLmdldFRleHQoKSxcbiAgICAgIGZpbGVuYW1lOiBtZXNzYWdlLmdldEZpbGVuYW1lKClcbiAgICB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmb3JtYXQnKTtcbn1cblxuLyoqXG4gKiBHbG9iYWwgZXJyb3IgaGFuZGxlciB0aGF0IGxvZ3MgdGhlIHN0YWNrIHRyYWNlIGFuZCByZXRocm93cyBhIGhpZ2ggbHZsIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSAgIEEgaHVtYW4gcmVhZGFibGUgaGlnaCBsZXZlbCBlcnJvciBNZXNzYWdlXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAgICAgIFRoZSBpbnRlcm5hbCBlcnJvciB0aGF0IGNhdXNlZCB0aGUgZmFpbHVyZVxuICovXG5mdW5jdGlvbiBvbkVycm9yKG1lc3NhZ2UsIGVycm9yKSB7XG4gIC8vIGxvZyB0aGUgc3RhY2sgdHJhY2VcbiAgX3V0aWwyLmRlZmF1bHQucHJpbnRfZGVidWdfZXJyb3IoZXJyb3IpO1xuXG4gIC8vIHVwZGF0ZSBlcnJvciBtZXNzYWdlXG4gIHRyeSB7XG4gICAgZXJyb3IubWVzc2FnZSA9IG1lc3NhZ2UgKyAnOiAnICsgZXJyb3IubWVzc2FnZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0aHJvdyBlcnJvcjtcbn1cblxuLyoqXG4gKiBDaGVjayBmb3IgbmF0aXZlIEFFQUQgc3VwcG9ydCBhbmQgY29uZmlndXJhdGlvbiBieSB0aGUgdXNlci4gT25seVxuICogYnJvd3NlcnMgdGhhdCBpbXBsZW1lbnQgdGhlIGN1cnJlbnQgV2ViQ3J5cHRvIHNwZWNpZmljYXRpb24gc3VwcG9ydFxuICogbmF0aXZlIEdDTS4gTmF0aXZlIEVBWCBpcyBidWlsdCBvbiBDVFIgYW5kIENCQywgd2hpY2ggY3VycmVudFxuICogYnJvd3NlcnMgc3VwcG9ydC4gT0NCIGFuZCBDRkIgYXJlIG5vdCBuYXRpdmVseSBzdXBwb3J0ZWQuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gICBJZiBhdXRoZW50aWNhdGVkIGVuY3J5cHRpb24gc2hvdWxkIGJlIHVzZWRcbiAqL1xuZnVuY3Rpb24gbmF0aXZlQUVBRCgpIHtcbiAgcmV0dXJuIF9jb25maWcyLmRlZmF1bHQuYWVhZF9wcm90ZWN0ICYmICgoX2NvbmZpZzIuZGVmYXVsdC5hZWFkX3Byb3RlY3RfdmVyc2lvbiAhPT0gNCB8fCBfY29uZmlnMi5kZWZhdWx0LmFlYWRfbW9kZSA9PT0gX2VudW1zMi5kZWZhdWx0LmFlYWQuZXhwZXJpbWVudGFsX2djbSkgJiYgX3V0aWwyLmRlZmF1bHQuZ2V0V2ViQ3J5cHRvKCkgfHwgX2NvbmZpZzIuZGVmYXVsdC5hZWFkX3Byb3RlY3RfdmVyc2lvbiA9PT0gNCAmJiBfY29uZmlnMi5kZWZhdWx0LmFlYWRfbW9kZSA9PT0gX2VudW1zMi5kZWZhdWx0LmFlYWQuZWF4ICYmIF91dGlsMi5kZWZhdWx0LmdldFdlYkNyeXB0bygpKTtcbn1cblxufSx7XCIuL2NsZWFydGV4dFwiOjMyMixcIi4vY29uZmlnL2NvbmZpZ1wiOjMyNCxcIi4vZW51bXNcIjozNTksXCIuL2tleVwiOjM2MixcIi4vbWVzc2FnZVwiOjM2NixcIi4vcG9seWZpbGxzXCI6MzkwLFwiLi91dGlsXCI6Mzk4LFwiLi93b3JrZXIvYXN5bmNfcHJveHlcIjo0MDAsXCJiYWJlbC1ydW50aW1lL2NvcmUtanMvcHJvbWlzZVwiOjMyLFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjozNSxcImJhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3JcIjo0Mn1dLDM2ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlRydXN0ID0gZXhwb3J0cy5TaWduYXR1cmUgPSBleHBvcnRzLlNlY3JldFN1YmtleSA9IGV4cG9ydHMuVXNlcmlkID0gZXhwb3J0cy5TZWNyZXRLZXkgPSBleHBvcnRzLk9uZVBhc3NTaWduYXR1cmUgPSBleHBvcnRzLlVzZXJBdHRyaWJ1dGUgPSBleHBvcnRzLlB1YmxpY1N1YmtleSA9IGV4cG9ydHMuTWFya2VyID0gZXhwb3J0cy5TeW1tZXRyaWNhbGx5RW5jcnlwdGVkID0gZXhwb3J0cy5QdWJsaWNLZXkgPSBleHBvcnRzLkxpdGVyYWwgPSBleHBvcnRzLlN5bUVuY3J5cHRlZFNlc3Npb25LZXkgPSBleHBvcnRzLlB1YmxpY0tleUVuY3J5cHRlZFNlc3Npb25LZXkgPSBleHBvcnRzLlN5bUVuY3J5cHRlZEFFQURQcm90ZWN0ZWQgPSBleHBvcnRzLlN5bUVuY3J5cHRlZEludGVncml0eVByb3RlY3RlZCA9IGV4cG9ydHMuQ29tcHJlc3NlZCA9IHVuZGVmaW5lZDtcblxudmFyIF9hc3NpZ24gPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2Fzc2lnbicpO1xuXG52YXIgX2Fzc2lnbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3NpZ24pO1xuXG52YXIgX2NvbXByZXNzZWQgPSBfZGVyZXFfKCcuL2NvbXByZXNzZWQuanMnKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdDb21wcmVzc2VkJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29tcHJlc3NlZCkuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfc3ltX2VuY3J5cHRlZF9pbnRlZ3JpdHlfcHJvdGVjdGVkID0gX2RlcmVxXygnLi9zeW1fZW5jcnlwdGVkX2ludGVncml0eV9wcm90ZWN0ZWQuanMnKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdTeW1FbmNyeXB0ZWRJbnRlZ3JpdHlQcm90ZWN0ZWQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1fZW5jcnlwdGVkX2ludGVncml0eV9wcm90ZWN0ZWQpLmRlZmF1bHQ7XG4gIH1cbn0pO1xuXG52YXIgX3N5bV9lbmNyeXB0ZWRfYWVhZF9wcm90ZWN0ZWQgPSBfZGVyZXFfKCcuL3N5bV9lbmNyeXB0ZWRfYWVhZF9wcm90ZWN0ZWQuanMnKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdTeW1FbmNyeXB0ZWRBRUFEUHJvdGVjdGVkJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3ltX2VuY3J5cHRlZF9hZWFkX3Byb3RlY3RlZCkuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfcHVibGljX2tleV9lbmNyeXB0ZWRfc2Vzc2lvbl9rZXkgPSBfZGVyZXFfKCcuL3B1YmxpY19rZXlfZW5jcnlwdGVkX3Nlc3Npb25fa2V5LmpzJyk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnUHVibGljS2V5RW5jcnlwdGVkU2Vzc2lvbktleScsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3B1YmxpY19rZXlfZW5jcnlwdGVkX3Nlc3Npb25fa2V5KS5kZWZhdWx0O1xuICB9XG59KTtcblxudmFyIF9zeW1fZW5jcnlwdGVkX3Nlc3Npb25fa2V5ID0gX2RlcmVxXygnLi9zeW1fZW5jcnlwdGVkX3Nlc3Npb25fa2V5LmpzJyk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnU3ltRW5jcnlwdGVkU2Vzc2lvbktleScsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N5bV9lbmNyeXB0ZWRfc2Vzc2lvbl9rZXkpLmRlZmF1bHQ7XG4gIH1cbn0pO1xuXG52YXIgX2xpdGVyYWwgPSBfZGVyZXFfKCcuL2xpdGVyYWwuanMnKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdMaXRlcmFsJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbGl0ZXJhbCkuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfcHVibGljX2tleSA9IF9kZXJlcV8oJy4vcHVibGljX2tleS5qcycpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ1B1YmxpY0tleScsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3B1YmxpY19rZXkpLmRlZmF1bHQ7XG4gIH1cbn0pO1xuXG52YXIgX3N5bW1ldHJpY2FsbHlfZW5jcnlwdGVkID0gX2RlcmVxXygnLi9zeW1tZXRyaWNhbGx5X2VuY3J5cHRlZC5qcycpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ1N5bW1ldHJpY2FsbHlFbmNyeXB0ZWQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1tZXRyaWNhbGx5X2VuY3J5cHRlZCkuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfbWFya2VyID0gX2RlcmVxXygnLi9tYXJrZXIuanMnKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdNYXJrZXInLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9tYXJrZXIpLmRlZmF1bHQ7XG4gIH1cbn0pO1xuXG52YXIgX3B1YmxpY19zdWJrZXkgPSBfZGVyZXFfKCcuL3B1YmxpY19zdWJrZXkuanMnKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdQdWJsaWNTdWJrZXknLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wdWJsaWNfc3Via2V5KS5kZWZhdWx0O1xuICB9XG59KTtcblxudmFyIF91c2VyX2F0dHJpYnV0ZSA9IF9kZXJlcV8oJy4vdXNlcl9hdHRyaWJ1dGUuanMnKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdVc2VyQXR0cmlidXRlJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXNlcl9hdHRyaWJ1dGUpLmRlZmF1bHQ7XG4gIH1cbn0pO1xuXG52YXIgX29uZV9wYXNzX3NpZ25hdHVyZSA9IF9kZXJlcV8oJy4vb25lX3Bhc3Nfc2lnbmF0dXJlLmpzJyk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnT25lUGFzc1NpZ25hdHVyZScsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29uZV9wYXNzX3NpZ25hdHVyZSkuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfc2VjcmV0X2tleSA9IF9kZXJlcV8oJy4vc2VjcmV0X2tleS5qcycpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ1NlY3JldEtleScsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NlY3JldF9rZXkpLmRlZmF1bHQ7XG4gIH1cbn0pO1xuXG52YXIgX3VzZXJpZCA9IF9kZXJlcV8oJy4vdXNlcmlkLmpzJyk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnVXNlcmlkJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXNlcmlkKS5kZWZhdWx0O1xuICB9XG59KTtcblxudmFyIF9zZWNyZXRfc3Via2V5ID0gX2RlcmVxXygnLi9zZWNyZXRfc3Via2V5LmpzJyk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnU2VjcmV0U3Via2V5Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2VjcmV0X3N1YmtleSkuZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfc2lnbmF0dXJlID0gX2RlcmVxXygnLi9zaWduYXR1cmUuanMnKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdTaWduYXR1cmUnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zaWduYXR1cmUpLmRlZmF1bHQ7XG4gIH1cbn0pO1xuXG52YXIgX3RydXN0ID0gX2RlcmVxXygnLi90cnVzdC5qcycpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ1RydXN0Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdHJ1c3QpLmRlZmF1bHQ7XG4gIH1cbn0pO1xuZXhwb3J0cy5uZXdQYWNrZXRGcm9tVGFnID0gbmV3UGFja2V0RnJvbVRhZztcbmV4cG9ydHMuZnJvbVN0cnVjdHVyZWRDbG9uZSA9IGZyb21TdHJ1Y3R1cmVkQ2xvbmU7XG5cbnZhciBfZW51bXMgPSBfZGVyZXFfKCcuLi9lbnVtcy5qcycpO1xuXG52YXIgX2VudW1zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VudW1zKTtcblxudmFyIF9hbGxfcGFja2V0cyA9IF9kZXJlcV8oJy4vYWxsX3BhY2tldHMuanMnKTtcblxudmFyIHBhY2tldHMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfYWxsX3BhY2tldHMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGVsc2UgeyB2YXIgbmV3T2JqID0ge307IGlmIChvYmogIT0gbnVsbCkgeyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IHJldHVybiBuZXdPYmo7IH0gfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEFsbG9jYXRlIGEgbmV3IHBhY2tldFxuICogQGZ1bmN0aW9uIG5ld1BhY2tldEZyb21UYWdcbiAqIEBtZW1iZXJvZiBtb2R1bGU6cGFja2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gdGFnIHByb3BlcnR5IG5hbWUgZnJvbSB7QGxpbmsgbW9kdWxlOmVudW1zLnBhY2tldH1cbiAqIEByZXR1cm5zIHtPYmplY3R9IG5ldyBwYWNrZXQgb2JqZWN0IHdpdGggdHlwZSBiYXNlZCBvbiB0YWdcbiAqL1xuZnVuY3Rpb24gbmV3UGFja2V0RnJvbVRhZyh0YWcpIHtcbiAgcmV0dXJuIG5ldyBwYWNrZXRzW3BhY2tldENsYXNzRnJvbVRhZ05hbWUodGFnKV0oKTtcbn1cblxuLyoqXG4gKiBBbGxvY2F0ZSBhIG5ldyBwYWNrZXQgZnJvbSBzdHJ1Y3R1cmVkIHBhY2tldCBjbG9uZVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2h0bWwvaW5mcmFzdHJ1Y3R1cmUuaHRtbCNzYWZlLXBhc3Npbmctb2Ytc3RydWN0dXJlZC1kYXRhfVxuICogQGZ1bmN0aW9uIGZyb21TdHJ1Y3R1cmVkQ2xvbmVcbiAqIEBtZW1iZXJvZiBtb2R1bGU6cGFja2V0XG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0Q2xvbmUgcGFja2V0IGNsb25lXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBuZXcgcGFja2V0IG9iamVjdCB3aXRoIGRhdGEgZnJvbSBwYWNrZXQgY2xvbmVcbiAqL1xuZnVuY3Rpb24gZnJvbVN0cnVjdHVyZWRDbG9uZShwYWNrZXRDbG9uZSkge1xuICB2YXIgdGFnTmFtZSA9IF9lbnVtczIuZGVmYXVsdC5yZWFkKF9lbnVtczIuZGVmYXVsdC5wYWNrZXQsIHBhY2tldENsb25lLnRhZyk7XG4gIHZhciBwYWNrZXQgPSBuZXdQYWNrZXRGcm9tVGFnKHRhZ05hbWUpO1xuICAoMCwgX2Fzc2lnbjIuZGVmYXVsdCkocGFja2V0LCBwYWNrZXRDbG9uZSk7XG4gIGlmIChwYWNrZXQucG9zdENsb25lVHlwZUZpeCkge1xuICAgIHBhY2tldC5wb3N0Q2xvbmVUeXBlRml4KCk7XG4gIH1cbiAgcmV0dXJuIHBhY2tldDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHRhZyBuYW1lIHRvIGNsYXNzIG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSB0YWcgcHJvcGVydHkgbmFtZSBmcm9tIHtAbGluayBtb2R1bGU6ZW51bXMucGFja2V0fVxuICogQHJldHVybnMge1N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHBhY2tldENsYXNzRnJvbVRhZ05hbWUodGFnKSB7XG4gIHJldHVybiB0YWcuc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyB0YWcuc3Vic3RyKDEpO1xufVxuXG59LHtcIi4uL2VudW1zLmpzXCI6MzU5LFwiLi9hbGxfcGFja2V0cy5qc1wiOjM2OCxcIi4vY29tcHJlc3NlZC5qc1wiOjM3MCxcIi4vbGl0ZXJhbC5qc1wiOjM3MixcIi4vbWFya2VyLmpzXCI6MzczLFwiLi9vbmVfcGFzc19zaWduYXR1cmUuanNcIjozNzQsXCIuL3B1YmxpY19rZXkuanNcIjozNzcsXCIuL3B1YmxpY19rZXlfZW5jcnlwdGVkX3Nlc3Npb25fa2V5LmpzXCI6Mzc4LFwiLi9wdWJsaWNfc3Via2V5LmpzXCI6Mzc5LFwiLi9zZWNyZXRfa2V5LmpzXCI6MzgwLFwiLi9zZWNyZXRfc3Via2V5LmpzXCI6MzgxLFwiLi9zaWduYXR1cmUuanNcIjozODIsXCIuL3N5bV9lbmNyeXB0ZWRfYWVhZF9wcm90ZWN0ZWQuanNcIjozODMsXCIuL3N5bV9lbmNyeXB0ZWRfaW50ZWdyaXR5X3Byb3RlY3RlZC5qc1wiOjM4NCxcIi4vc3ltX2VuY3J5cHRlZF9zZXNzaW9uX2tleS5qc1wiOjM4NSxcIi4vc3ltbWV0cmljYWxseV9lbmNyeXB0ZWQuanNcIjozODYsXCIuL3RydXN0LmpzXCI6Mzg3LFwiLi91c2VyX2F0dHJpYnV0ZS5qc1wiOjM4OCxcIi4vdXNlcmlkLmpzXCI6Mzg5LFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9hc3NpZ25cIjoyNH1dLDM2OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNsb25lUGFja2V0cyA9IGNsb25lUGFja2V0cztcbmV4cG9ydHMucGFyc2VDbG9uZWRQYWNrZXRzID0gcGFyc2VDbG9uZWRQYWNrZXRzO1xuXG52YXIgX2tleSA9IF9kZXJlcV8oJy4uL2tleScpO1xuXG52YXIgX21lc3NhZ2UgPSBfZGVyZXFfKCcuLi9tZXNzYWdlJyk7XG5cbnZhciBfY2xlYXJ0ZXh0ID0gX2RlcmVxXygnLi4vY2xlYXJ0ZXh0Jyk7XG5cbnZhciBfc2lnbmF0dXJlID0gX2RlcmVxXygnLi4vc2lnbmF0dXJlJyk7XG5cbnZhciBfcGFja2V0bGlzdCA9IF9kZXJlcV8oJy4vcGFja2V0bGlzdCcpO1xuXG52YXIgX3BhY2tldGxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFja2V0bGlzdCk7XG5cbnZhciBfa2V5aWQgPSBfZGVyZXFfKCcuLi90eXBlL2tleWlkJyk7XG5cbnZhciBfa2V5aWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfa2V5aWQpO1xuXG52YXIgX3V0aWwgPSBfZGVyZXFfKCcuLi91dGlsJyk7XG5cbnZhciBfdXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbi8vICAgTGlzdCAtLT4gQ2xvbmUgICAvL1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXG4vKipcbiAqIENyZWF0ZSBhIHBhY2tldGxpc3QgZnJvbSB0aGUgY29ycmVzcG9kaW5nIG9iamVjdCB0eXBlcy5cbiAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9ucyAgIHRoZSBvYmplY3QgcGFzc2VkIHRvIGFuZCBmcm9tIHRoZSB3ZWIgd29ya2VyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAgICAgICAgICAgYSBtdXRhdGVkIHZlcnNpb24gb2YgdGhlIG9wdGlvbnMgb3B0amVjdFxuICovXG5mdW5jdGlvbiBjbG9uZVBhY2tldHMob3B0aW9ucykge1xuICBpZiAob3B0aW9ucy5wdWJsaWNLZXlzKSB7XG4gICAgb3B0aW9ucy5wdWJsaWNLZXlzID0gb3B0aW9ucy5wdWJsaWNLZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXR1cm4ga2V5LnRvUGFja2V0bGlzdCgpO1xuICAgIH0pO1xuICB9XG4gIGlmIChvcHRpb25zLnByaXZhdGVLZXlzKSB7XG4gICAgb3B0aW9ucy5wcml2YXRlS2V5cyA9IG9wdGlvbnMucHJpdmF0ZUtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiBrZXkudG9QYWNrZXRsaXN0KCk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMucHJpdmF0ZUtleSkge1xuICAgIG9wdGlvbnMucHJpdmF0ZUtleSA9IG9wdGlvbnMucHJpdmF0ZUtleS50b1BhY2tldGxpc3QoKTtcbiAgfVxuICBpZiAob3B0aW9ucy5rZXkpIHtcbiAgICBvcHRpb25zLmtleSA9IG9wdGlvbnMua2V5LnRvUGFja2V0bGlzdCgpO1xuICB9XG4gIGlmIChvcHRpb25zLm1lc3NhZ2UpIHtcbiAgICAvL2NvdWxkIGJlIGVpdGhlciBhIE1lc3NhZ2Ugb3IgQ2xlYXJ0ZXh0TWVzc2FnZSBvYmplY3RcbiAgICBpZiAob3B0aW9ucy5tZXNzYWdlIGluc3RhbmNlb2YgX21lc3NhZ2UuTWVzc2FnZSkge1xuICAgICAgb3B0aW9ucy5tZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlLnBhY2tldHM7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLm1lc3NhZ2UgaW5zdGFuY2VvZiBfY2xlYXJ0ZXh0LkNsZWFydGV4dE1lc3NhZ2UpIHtcbiAgICAgIG9wdGlvbnMubWVzc2FnZSA9IHsgdGV4dDogb3B0aW9ucy5tZXNzYWdlLnRleHQsIHNpZ25hdHVyZTogb3B0aW9ucy5tZXNzYWdlLnNpZ25hdHVyZS5wYWNrZXRzIH07XG4gICAgfVxuICB9XG4gIGlmIChvcHRpb25zLnNpZ25hdHVyZSAmJiBvcHRpb25zLnNpZ25hdHVyZSBpbnN0YW5jZW9mIF9zaWduYXR1cmUuU2lnbmF0dXJlKSB7XG4gICAgb3B0aW9ucy5zaWduYXR1cmUgPSBvcHRpb25zLnNpZ25hdHVyZS5wYWNrZXRzO1xuICB9XG4gIGlmIChvcHRpb25zLnNpZ25hdHVyZXMpIHtcbiAgICBvcHRpb25zLnNpZ25hdHVyZXMgPSBvcHRpb25zLnNpZ25hdHVyZXMubWFwKGZ1bmN0aW9uIChzaWcpIHtcbiAgICAgIHJldHVybiB2ZXJpZmljYXRpb25PYmplY3RUb0Nsb25lKHNpZyk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59IC8vIE9wZW5QR1AuanMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxNSBUYW5rcmVkIEhhc2Vcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBwYWNrZXQgbGlzdCBjbG9uaW5nIHJlcXVpcmVkIHRvXG4gKiBwYXNzIGNlcnRhaW4gb2JqZWN0IHR5cGVzIGJldHdlZW4gdGhlIHdlYiB3b3JrZXIgYW5kIG1haW4gdGhyZWFkIHVzaW5nXG4gKiB0aGUgc3RydWN0dXJlZCBjbG9uaW5nIGFsZ29yaXRobS5cbiAqIEBtb2R1bGUgcGFja2V0L2Nsb25lXG4gKi9cblxuZnVuY3Rpb24gdmVyaWZpY2F0aW9uT2JqZWN0VG9DbG9uZSh2ZXJPYmplY3QpIHtcbiAgdmVyT2JqZWN0LnNpZ25hdHVyZSA9IHZlck9iamVjdC5zaWduYXR1cmUucGFja2V0cztcbiAgcmV0dXJuIHZlck9iamVjdDtcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbi8vICAgQ2xvbmUgLS0+IExpc3QgICAvL1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QgcHJvdG90eXBlIGZyb20gYSBjb3JyZXNwb25kaW5nIHBhY2tldGxpc3QuXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgICB0aGUgb2JqZWN0IHBhc3NlZCB0byBhbmQgZnJvbSB0aGUgd2ViIHdvcmtlclxuICogQHBhcmFtICB7U3RyaW5nfSBtZXRob2QgICAgdGhlIHB1YmxpYyBhcGkgZnVuY3Rpb24gbmFtZSB0byBiZSBkZWxlZ2F0ZWQgdG8gdGhlIHdvcmtlclxuICogQHJldHVybnMge09iamVjdH0gICAgICAgICAgIGEgbXV0YXRlZCB2ZXJzaW9uIG9mIHRoZSBvcHRpb25zIG9wdGplY3RcbiAqL1xuZnVuY3Rpb24gcGFyc2VDbG9uZWRQYWNrZXRzKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMucHVibGljS2V5cykge1xuICAgIG9wdGlvbnMucHVibGljS2V5cyA9IG9wdGlvbnMucHVibGljS2V5cy5tYXAocGFja2V0bGlzdENsb25lVG9LZXkpO1xuICB9XG4gIGlmIChvcHRpb25zLnByaXZhdGVLZXlzKSB7XG4gICAgb3B0aW9ucy5wcml2YXRlS2V5cyA9IG9wdGlvbnMucHJpdmF0ZUtleXMubWFwKHBhY2tldGxpc3RDbG9uZVRvS2V5KTtcbiAgfVxuICBpZiAob3B0aW9ucy5wcml2YXRlS2V5KSB7XG4gICAgb3B0aW9ucy5wcml2YXRlS2V5ID0gcGFja2V0bGlzdENsb25lVG9LZXkob3B0aW9ucy5wcml2YXRlS2V5KTtcbiAgfVxuICBpZiAob3B0aW9ucy5rZXkpIHtcbiAgICBvcHRpb25zLmtleSA9IHBhY2tldGxpc3RDbG9uZVRvS2V5KG9wdGlvbnMua2V5KTtcbiAgfVxuICBpZiAob3B0aW9ucy5tZXNzYWdlICYmIG9wdGlvbnMubWVzc2FnZS5zaWduYXR1cmUpIHtcbiAgICBvcHRpb25zLm1lc3NhZ2UgPSBwYWNrZXRsaXN0Q2xvbmVUb0NsZWFydGV4dE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlKTtcbiAgfSBlbHNlIGlmIChvcHRpb25zLm1lc3NhZ2UpIHtcbiAgICBvcHRpb25zLm1lc3NhZ2UgPSBwYWNrZXRsaXN0Q2xvbmVUb01lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlKTtcbiAgfVxuICBpZiAob3B0aW9ucy5zaWduYXR1cmVzKSB7XG4gICAgb3B0aW9ucy5zaWduYXR1cmVzID0gb3B0aW9ucy5zaWduYXR1cmVzLm1hcChwYWNrZXRsaXN0Q2xvbmVUb1NpZ25hdHVyZXMpO1xuICB9XG4gIGlmIChvcHRpb25zLnNpZ25hdHVyZSkge1xuICAgIG9wdGlvbnMuc2lnbmF0dXJlID0gcGFja2V0bGlzdENsb25lVG9TaWduYXR1cmUob3B0aW9ucy5zaWduYXR1cmUpO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufVxuXG5mdW5jdGlvbiBwYWNrZXRsaXN0Q2xvbmVUb0tleShjbG9uZSkge1xuICB2YXIgcGFja2V0bGlzdCA9IF9wYWNrZXRsaXN0Mi5kZWZhdWx0LmZyb21TdHJ1Y3R1cmVkQ2xvbmUoY2xvbmUpO1xuICByZXR1cm4gbmV3IF9rZXkuS2V5KHBhY2tldGxpc3QpO1xufVxuXG5mdW5jdGlvbiBwYWNrZXRsaXN0Q2xvbmVUb01lc3NhZ2UoY2xvbmUpIHtcbiAgdmFyIHBhY2tldGxpc3QgPSBfcGFja2V0bGlzdDIuZGVmYXVsdC5mcm9tU3RydWN0dXJlZENsb25lKGNsb25lKTtcbiAgcmV0dXJuIG5ldyBfbWVzc2FnZS5NZXNzYWdlKHBhY2tldGxpc3QpO1xufVxuXG5mdW5jdGlvbiBwYWNrZXRsaXN0Q2xvbmVUb0NsZWFydGV4dE1lc3NhZ2UoY2xvbmUpIHtcbiAgdmFyIHBhY2tldGxpc3QgPSBfcGFja2V0bGlzdDIuZGVmYXVsdC5mcm9tU3RydWN0dXJlZENsb25lKGNsb25lLnNpZ25hdHVyZSk7XG4gIHJldHVybiBuZXcgX2NsZWFydGV4dC5DbGVhcnRleHRNZXNzYWdlKGNsb25lLnRleHQsIG5ldyBfc2lnbmF0dXJlLlNpZ25hdHVyZShwYWNrZXRsaXN0KSk7XG59XG5cbi8vdmVyaWZpY2F0aW9uIG9iamVjdHNcbmZ1bmN0aW9uIHBhY2tldGxpc3RDbG9uZVRvU2lnbmF0dXJlcyhjbG9uZSkge1xuICBjbG9uZS5rZXlpZCA9IF9rZXlpZDIuZGVmYXVsdC5mcm9tQ2xvbmUoY2xvbmUua2V5aWQpO1xuICBjbG9uZS5zaWduYXR1cmUgPSBuZXcgX3NpZ25hdHVyZS5TaWduYXR1cmUoY2xvbmUuc2lnbmF0dXJlKTtcbiAgcmV0dXJuIGNsb25lO1xufVxuXG5mdW5jdGlvbiBwYWNrZXRsaXN0Q2xvbmVUb1NpZ25hdHVyZShjbG9uZSkge1xuICBpZiAoX3V0aWwyLmRlZmF1bHQuaXNTdHJpbmcoY2xvbmUpKSB7XG4gICAgLy9zaWduYXR1cmUgaXMgYXJtb3JlZFxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuICB2YXIgcGFja2V0bGlzdCA9IF9wYWNrZXRsaXN0Mi5kZWZhdWx0LmZyb21TdHJ1Y3R1cmVkQ2xvbmUoY2xvbmUpO1xuICByZXR1cm4gbmV3IF9zaWduYXR1cmUuU2lnbmF0dXJlKHBhY2tldGxpc3QpO1xufVxuXG59LHtcIi4uL2NsZWFydGV4dFwiOjMyMixcIi4uL2tleVwiOjM2MixcIi4uL21lc3NhZ2VcIjozNjYsXCIuLi9zaWduYXR1cmVcIjozOTEsXCIuLi90eXBlL2tleWlkXCI6Mzk0LFwiLi4vdXRpbFwiOjM5OCxcIi4vcGFja2V0bGlzdFwiOjM3Nn1dLDM3MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcGFrbyA9IF9kZXJlcV8oJ3Bha28nKTtcblxudmFyIF9wYWtvMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bha28pO1xuXG52YXIgX2NvbmZpZyA9IF9kZXJlcV8oJy4uL2NvbmZpZycpO1xuXG52YXIgX2NvbmZpZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25maWcpO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vZW51bXMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG52YXIgX2J6aXAyQnVpbGQgPSBfZGVyZXFfKCcuLi9jb21wcmVzc2lvbi9iemlwMi5idWlsZC5qcycpO1xuXG52YXIgX2J6aXAyQnVpbGQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYnppcDJCdWlsZCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIENvbXByZXNzZWQgRGF0YSBQYWNrZXQgKFRhZyA4KVxuICpcbiAqIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTUuNnxSRkM0ODgwIDUuNn06XG4gKiBUaGUgQ29tcHJlc3NlZCBEYXRhIHBhY2tldCBjb250YWlucyBjb21wcmVzc2VkIGRhdGEuICBUeXBpY2FsbHksXG4gKiB0aGlzIHBhY2tldCBpcyBmb3VuZCBhcyB0aGUgY29udGVudHMgb2YgYW4gZW5jcnlwdGVkIHBhY2tldCwgb3IgZm9sbG93aW5nXG4gKiBhIFNpZ25hdHVyZSBvciBPbmUtUGFzcyBTaWduYXR1cmUgcGFja2V0LCBhbmQgY29udGFpbnMgYSBsaXRlcmFsIGRhdGEgcGFja2V0LlxuICogQG1lbWJlcm9mIG1vZHVsZTpwYWNrZXRcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBDb21wcmVzc2VkKCkge1xuICAvKipcbiAgICogUGFja2V0IHR5cGVcbiAgICogQHR5cGUge21vZHVsZTplbnVtcy5wYWNrZXR9XG4gICAqL1xuICB0aGlzLnRhZyA9IF9lbnVtczIuZGVmYXVsdC5wYWNrZXQuY29tcHJlc3NlZDtcbiAgLyoqXG4gICAqIExpc3Qgb2YgcGFja2V0c1xuICAgKiBAdHlwZSB7bW9kdWxlOnBhY2tldC5MaXN0fVxuICAgKi9cbiAgdGhpcy5wYWNrZXRzID0gbnVsbDtcbiAgLyoqXG4gICAqIENvbXByZXNzaW9uIGFsZ29yaXRobVxuICAgKiBAdHlwZSB7Y29tcHJlc3Npb259XG4gICAqL1xuICB0aGlzLmFsZ29yaXRobSA9ICd6aXAnO1xuXG4gIC8qKlxuICAgKiBDb21wcmVzc2VkIHBhY2tldCBkYXRhXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICB0aGlzLmNvbXByZXNzZWQgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNpbmcgZnVuY3Rpb24gZm9yIHRoZSBwYWNrZXQuXG4gKiBAcGFyYW0ge1N0cmluZ30gYnl0ZXMgUGF5bG9hZCBvZiBhIHRhZyA4IHBhY2tldFxuICovXG4vLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEByZXF1aXJlcyBwYWtvXG4gKiBAcmVxdWlyZXMgY29uZmlnXG4gKiBAcmVxdWlyZXMgZW51bXNcbiAqIEByZXF1aXJlcyB1dGlsXG4gKiBAcmVxdWlyZXMgY29tcHJlc3Npb24vYnppcDJcbiAqL1xuXG5Db21wcmVzc2VkLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gIC8vIE9uZSBvY3RldCB0aGF0IGdpdmVzIHRoZSBhbGdvcml0aG0gdXNlZCB0byBjb21wcmVzcyB0aGUgcGFja2V0LlxuICB0aGlzLmFsZ29yaXRobSA9IF9lbnVtczIuZGVmYXVsdC5yZWFkKF9lbnVtczIuZGVmYXVsdC5jb21wcmVzc2lvbiwgYnl0ZXNbMF0pO1xuXG4gIC8vIENvbXByZXNzZWQgZGF0YSwgd2hpY2ggbWFrZXMgdXAgdGhlIHJlbWFpbmRlciBvZiB0aGUgcGFja2V0LlxuICB0aGlzLmNvbXByZXNzZWQgPSBieXRlcy5zdWJhcnJheSgxLCBieXRlcy5sZW5ndGgpO1xuXG4gIHRoaXMuZGVjb21wcmVzcygpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGNvbXByZXNzZWQgcGFja2V0LlxuICogQHJldHVybnMge1N0cmluZ30gYmluYXJ5IGNvbXByZXNzZWQgcGFja2V0XG4gKi9cbkNvbXByZXNzZWQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jb21wcmVzc2VkID09PSBudWxsKSB7XG4gICAgdGhpcy5jb21wcmVzcygpO1xuICB9XG5cbiAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW25ldyBVaW50OEFycmF5KFtfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LmNvbXByZXNzaW9uLCB0aGlzLmFsZ29yaXRobSldKSwgdGhpcy5jb21wcmVzc2VkXSk7XG59O1xuXG4vKipcbiAqIERlY29tcHJlc3Npb24gbWV0aG9kIGZvciBkZWNvbXByZXNzaW5nIHRoZSBjb21wcmVzc2VkIGRhdGFcbiAqIHJlYWQgYnkgcmVhZF9wYWNrZXRcbiAqL1xuQ29tcHJlc3NlZC5wcm90b3R5cGUuZGVjb21wcmVzcyA9IGZ1bmN0aW9uICgpIHtcblxuICBpZiAoIWRlY29tcHJlc3NfZm5zW3RoaXMuYWxnb3JpdGhtXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvbXByZXNzaW9uIGFsZ29yaXRobSB1bmtub3duIDpcIiArIHRoaXMuYWxnb3JpdGhtKTtcbiAgfVxuXG4gIHRoaXMucGFja2V0cy5yZWFkKGRlY29tcHJlc3NfZm5zW3RoaXMuYWxnb3JpdGhtXSh0aGlzLmNvbXByZXNzZWQpKTtcbn07XG5cbi8qKlxuICogQ29tcHJlc3MgdGhlIHBhY2tldCBkYXRhIChtZW1iZXIgZGVjb21wcmVzc2VkRGF0YSlcbiAqL1xuQ29tcHJlc3NlZC5wcm90b3R5cGUuY29tcHJlc3MgPSBmdW5jdGlvbiAoKSB7XG5cbiAgaWYgKCFjb21wcmVzc19mbnNbdGhpcy5hbGdvcml0aG1dKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tcHJlc3Npb24gYWxnb3JpdGhtIHVua25vd24gOlwiICsgdGhpcy5hbGdvcml0aG0pO1xuICB9XG5cbiAgdGhpcy5jb21wcmVzc2VkID0gY29tcHJlc3NfZm5zW3RoaXMuYWxnb3JpdGhtXSh0aGlzLnBhY2tldHMud3JpdGUoKSk7XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBDb21wcmVzc2VkO1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gICAgICAgICAgICAgICAgICAgICAgLy9cbi8vICAgSGVscGVyIGZ1bmN0aW9ucyAgIC8vXG4vLyAgICAgICAgICAgICAgICAgICAgICAvL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXG52YXIgbm9kZVpsaWIgPSBfdXRpbDIuZGVmYXVsdC5nZXROb2RlWmxpYigpO1xuXG5mdW5jdGlvbiBub2RlX3psaWIoZnVuYykge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgcmV0dXJuIGZ1bmMoZGF0YSwgb3B0aW9ucyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBha29femxpYihjb25zdHJ1Y3Rvcikge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIG9iaiA9IG5ldyBjb25zdHJ1Y3RvcihvcHRpb25zKTtcbiAgICBvYmoucHVzaChkYXRhLCB0cnVlKTtcbiAgICByZXR1cm4gb2JqLnJlc3VsdDtcbiAgfTtcbn1cblxudmFyIGNvbXByZXNzX2ZucyA9IHZvaWQgMDtcbnZhciBkZWNvbXByZXNzX2ZucyA9IHZvaWQgMDtcbmlmIChub2RlWmxpYikge1xuICAvLyBVc2UgTm9kZSBuYXRpdmUgemxpYiBmb3IgREVGTEFURSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uXG4gIGNvbXByZXNzX2ZucyA9IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc3luY1xuICAgIHppcDogbm9kZV96bGliKG5vZGVabGliLmRlZmxhdGVSYXdTeW5jLCB7IGxldmVsOiBfY29uZmlnMi5kZWZhdWx0LmRlZmxhdGVfbGV2ZWwgfSksXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXN5bmNcbiAgICB6bGliOiBub2RlX3psaWIobm9kZVpsaWIuZGVmbGF0ZVN5bmMsIHsgbGV2ZWw6IF9jb25maWcyLmRlZmF1bHQuZGVmbGF0ZV9sZXZlbCB9KSxcbiAgICBiemlwMjogX2J6aXAyQnVpbGQyLmRlZmF1bHQuY29tcHJlc3NGaWxlXG4gIH07XG5cbiAgZGVjb21wcmVzc19mbnMgPSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXN5bmNcbiAgICB6aXA6IG5vZGVfemxpYihub2RlWmxpYi5pbmZsYXRlUmF3U3luYyksXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXN5bmNcbiAgICB6bGliOiBub2RlX3psaWIobm9kZVpsaWIuaW5mbGF0ZVN5bmMpLFxuICAgIGJ6aXAyOiBfYnppcDJCdWlsZDIuZGVmYXVsdC5kZWNvbXByZXNzRmlsZVxuICB9O1xufSBlbHNlIHtcbiAgLy8gVXNlIEpTIGZhbGxiYWNrc1xuICBjb21wcmVzc19mbnMgPSB7XG4gICAgemlwOiBwYWtvX3psaWIoX3Bha28yLmRlZmF1bHQuRGVmbGF0ZSwgeyByYXc6IHRydWUsIGxldmVsOiBfY29uZmlnMi5kZWZhdWx0LmRlZmxhdGVfbGV2ZWwgfSksXG4gICAgemxpYjogcGFrb196bGliKF9wYWtvMi5kZWZhdWx0LkRlZmxhdGUsIHsgbGV2ZWw6IF9jb25maWcyLmRlZmF1bHQuZGVmbGF0ZV9sZXZlbCB9KSxcbiAgICBiemlwMjogX2J6aXAyQnVpbGQyLmRlZmF1bHQuY29tcHJlc3NGaWxlXG4gIH07XG5cbiAgZGVjb21wcmVzc19mbnMgPSB7XG4gICAgemlwOiBwYWtvX3psaWIoX3Bha28yLmRlZmF1bHQuSW5mbGF0ZSwgeyByYXc6IHRydWUgfSksXG4gICAgemxpYjogcGFrb196bGliKF9wYWtvMi5kZWZhdWx0LkluZmxhdGUpLFxuICAgIGJ6aXAyOiBfYnppcDJCdWlsZDIuZGVmYXVsdC5kZWNvbXByZXNzRmlsZVxuICB9O1xufVxuXG59LHtcIi4uL2NvbXByZXNzaW9uL2J6aXAyLmJ1aWxkLmpzXCI6MzIzLFwiLi4vY29uZmlnXCI6MzI1LFwiLi4vZW51bXNcIjozNTksXCIuLi91dGlsXCI6Mzk4LFwicGFrb1wiOjMwMX1dLDM3MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfYXNzaWduID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9hc3NpZ24nKTtcblxudmFyIF9hc3NpZ24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXNzaWduKTtcblxudmFyIF9hbGxfcGFja2V0cyA9IF9kZXJlcV8oJy4vYWxsX3BhY2tldHMnKTtcblxudmFyIHBhY2tldHMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfYWxsX3BhY2tldHMpO1xuXG52YXIgX2Nsb25lID0gX2RlcmVxXygnLi9jbG9uZScpO1xuXG52YXIgY2xvbmUgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfY2xvbmUpO1xuXG52YXIgX3BhY2tldGxpc3QgPSBfZGVyZXFfKCcuL3BhY2tldGxpc3QnKTtcblxudmFyIF9wYWNrZXRsaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BhY2tldGxpc3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGVsc2UgeyB2YXIgbmV3T2JqID0ge307IGlmIChvYmogIT0gbnVsbCkgeyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IHJldHVybiBuZXdPYmo7IH0gfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgbW9kID0ge1xuICBMaXN0OiBfcGFja2V0bGlzdDIuZGVmYXVsdCxcbiAgY2xvbmU6IGNsb25lXG59OyAvKipcbiAgICAqIEBmaWxlb3ZlcnZpZXcgT3BlblBHUCBwYWNrZXQgdHlwZXNcbiAgICAqIEBzZWUgbW9kdWxlOnBhY2tldC9hbGxfcGFja2V0c1xuICAgICogQHNlZSBtb2R1bGU6cGFja2V0L2Nsb25lXG4gICAgKiBAc2VlIG1vZHVsZTpwYWNrZXQuTGlzdFxuICAgICogQG1vZHVsZSBwYWNrZXRcbiAgICAqL1xuXG4oMCwgX2Fzc2lnbjIuZGVmYXVsdCkobW9kLCBwYWNrZXRzKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gbW9kO1xuXG59LHtcIi4vYWxsX3BhY2tldHNcIjozNjgsXCIuL2Nsb25lXCI6MzY5LFwiLi9wYWNrZXRsaXN0XCI6Mzc2LFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9hc3NpZ25cIjoyNH1dLDM3MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZW51bXMgPSBfZGVyZXFfKCcuLi9lbnVtcycpO1xuXG52YXIgX2VudW1zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VudW1zKTtcblxudmFyIF91dGlsID0gX2RlcmVxXygnLi4vdXRpbCcpO1xuXG52YXIgX3V0aWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIExpdGVyYWwgRGF0YSBQYWNrZXQgKFRhZyAxMSlcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi01Ljl8UkZDNDg4MCA1Ljl9OlxuICogQSBMaXRlcmFsIERhdGEgcGFja2V0IGNvbnRhaW5zIHRoZSBib2R5IG9mIGEgbWVzc2FnZTsgZGF0YSB0aGF0IGlzIG5vdCB0byBiZVxuICogZnVydGhlciBpbnRlcnByZXRlZC5cbiAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSB0aGUgY3JlYXRpb24gZGF0ZSBvZiB0aGUgbGl0ZXJhbCBwYWNrYWdlXG4gKiBAbWVtYmVyb2YgbW9kdWxlOnBhY2tldFxuICogQGNvbnN0cnVjdG9yXG4gKi9cbi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQHJlcXVpcmVzIGVudW1zXG4gKiBAcmVxdWlyZXMgdXRpbFxuICovXG5cbmZ1bmN0aW9uIExpdGVyYWwoKSB7XG4gIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBuZXcgRGF0ZSgpO1xuXG4gIHRoaXMudGFnID0gX2VudW1zMi5kZWZhdWx0LnBhY2tldC5saXRlcmFsO1xuICB0aGlzLmZvcm1hdCA9ICd1dGY4JzsgLy8gZGVmYXVsdCBmb3JtYXQgZm9yIGxpdGVyYWwgZGF0YSBwYWNrZXRzXG4gIHRoaXMuZGF0ZSA9IF91dGlsMi5kZWZhdWx0Lm5vcm1hbGl6ZURhdGUoZGF0ZSk7XG4gIHRoaXMudGV4dCA9IG51bGw7IC8vIHRleHR1YWwgZGF0YSByZXByZXNlbnRhdGlvblxuICB0aGlzLmRhdGEgPSBudWxsOyAvLyBsaXRlcmFsIGRhdGEgcmVwcmVzZW50YXRpb25cbiAgdGhpcy5maWxlbmFtZSA9ICdtc2cudHh0Jztcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHBhY2tldCBkYXRhIHRvIGEgamF2YXNjcmlwdCBuYXRpdmUgc3RyaW5nLCBlbmQgb2YgbGluZVxuICogd2lsbCBiZSBub3JtYWxpemVkIHRvIFxcclxcbiBhbmQgYnkgZGVmYXVsdCB0ZXh0IGlzIGNvbnZlcnRlZCB0byBVVEY4XG4gKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBBbnkgbmF0aXZlIGphdmFzY3JpcHQgc3RyaW5nXG4gKiBAcGFyYW0ge3V0Zjh8YmluYXJ5fHRleHR8bWltZX0gZm9ybWF0IChvcHRpb25hbCkgVGhlIGZvcm1hdCBvZiB0aGUgc3RyaW5nIG9mIGJ5dGVzXG4gKi9cbkxpdGVyYWwucHJvdG90eXBlLnNldFRleHQgPSBmdW5jdGlvbiAodGV4dCkge1xuICB2YXIgZm9ybWF0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAndXRmOCc7XG5cbiAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7XG4gIHRoaXMudGV4dCA9IHRleHQ7XG4gIHRoaXMuZGF0YSA9IG51bGw7XG59O1xuXG4vKipcbiAqIFJldHVybnMgbGl0ZXJhbCBkYXRhIHBhY2tldHMgYXMgbmF0aXZlIEphdmFTY3JpcHQgc3RyaW5nXG4gKiB3aXRoIG5vcm1hbGl6ZWQgZW5kIG9mIGxpbmUgdG8gXFxuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBsaXRlcmFsIGRhdGEgYXMgdGV4dFxuICovXG5MaXRlcmFsLnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy50ZXh0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dDtcbiAgfVxuICAvLyBkZWNvZGUgVVRGOFxuICB2YXIgdGV4dCA9IF91dGlsMi5kZWZhdWx0LmRlY29kZV91dGY4KF91dGlsMi5kZWZhdWx0LlVpbnQ4QXJyYXlfdG9fc3RyKHRoaXMuZGF0YSkpO1xuICAvLyBub3JtYWxpemUgRU9MIHRvIFxcblxuICB0aGlzLnRleHQgPSBfdXRpbDIuZGVmYXVsdC5uYXRpdmVFT0wodGV4dCk7XG4gIHJldHVybiB0aGlzLnRleHQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgcGFja2V0IGRhdGEgdG8gdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIHByb3ZpZGVkIHN0cmluZyBvZiBieXRlcy5cbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnl0ZXMgVGhlIHN0cmluZyBvZiBieXRlc1xuICogQHBhcmFtIHt1dGY4fGJpbmFyeXx0ZXh0fG1pbWV9IGZvcm1hdCBUaGUgZm9ybWF0IG9mIHRoZSBzdHJpbmcgb2YgYnl0ZXNcbiAqL1xuTGl0ZXJhbC5wcm90b3R5cGUuc2V0Qnl0ZXMgPSBmdW5jdGlvbiAoYnl0ZXMsIGZvcm1hdCkge1xuICB0aGlzLmZvcm1hdCA9IGZvcm1hdDtcbiAgdGhpcy5kYXRhID0gYnl0ZXM7XG4gIHRoaXMudGV4dCA9IG51bGw7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgYnl0ZSBzZXF1ZW5jZSByZXByZXNlbnRpbmcgdGhlIGxpdGVyYWwgcGFja2V0IGRhdGFcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBBIHNlcXVlbmNlIG9mIGJ5dGVzXG4gKi9cbkxpdGVyYWwucHJvdG90eXBlLmdldEJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGV4dE1vZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuXG4gIGlmICh0aGlzLmRhdGEgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xuICB9XG5cbiAgaWYgKHRleHRNb2RlKSB7XG4gICAgLy8gbm9ybWFsaXplIEVPTCB0byBcXHJcXG4gYW5kIFVURi04IGVuY29kZVxuICAgIHRoaXMuZGF0YSA9IF91dGlsMi5kZWZhdWx0LnN0cl90b19VaW50OEFycmF5KF91dGlsMi5kZWZhdWx0LmVuY29kZV91dGY4KF91dGlsMi5kZWZhdWx0LmNhbm9uaWNhbGl6ZUVPTCh0aGlzLnRleHQpKSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5kYXRhID0gX3V0aWwyLmRlZmF1bHQuc3RyX3RvX1VpbnQ4QXJyYXkodGhpcy50ZXh0KTtcbiAgfVxuICByZXR1cm4gdGhpcy5kYXRhO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBmaWxlbmFtZSBvZiB0aGUgbGl0ZXJhbCBwYWNrZXQgZGF0YVxuICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lIEFueSBuYXRpdmUgamF2YXNjcmlwdCBzdHJpbmdcbiAqL1xuTGl0ZXJhbC5wcm90b3R5cGUuc2V0RmlsZW5hbWUgPSBmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZpbGVuYW1lIG9mIHRoZSBsaXRlcmFsIHBhY2tldCBkYXRhXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBmaWxlbmFtZVxuICovXG5MaXRlcmFsLnByb3RvdHlwZS5nZXRGaWxlbmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZmlsZW5hbWU7XG59O1xuXG4vKipcbiAqIFBhcnNpbmcgZnVuY3Rpb24gZm9yIGEgbGl0ZXJhbCBkYXRhIHBhY2tldCAodGFnIDExKS5cbiAqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGlucHV0IFBheWxvYWQgb2YgYSB0YWcgMTEgcGFja2V0XG4gKiBAcmV0dXJucyB7bW9kdWxlOnBhY2tldC5MaXRlcmFsfSBvYmplY3QgcmVwcmVzZW50YXRpb25cbiAqL1xuTGl0ZXJhbC5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChieXRlcykge1xuICAvLyAtIEEgb25lLW9jdGV0IGZpZWxkIHRoYXQgZGVzY3JpYmVzIGhvdyB0aGUgZGF0YSBpcyBmb3JtYXR0ZWQuXG4gIHZhciBmb3JtYXQgPSBfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQubGl0ZXJhbCwgYnl0ZXNbMF0pO1xuXG4gIHZhciBmaWxlbmFtZV9sZW4gPSBieXRlc1sxXTtcbiAgdGhpcy5maWxlbmFtZSA9IF91dGlsMi5kZWZhdWx0LmRlY29kZV91dGY4KF91dGlsMi5kZWZhdWx0LlVpbnQ4QXJyYXlfdG9fc3RyKGJ5dGVzLnN1YmFycmF5KDIsIDIgKyBmaWxlbmFtZV9sZW4pKSk7XG5cbiAgdGhpcy5kYXRlID0gX3V0aWwyLmRlZmF1bHQucmVhZERhdGUoYnl0ZXMuc3ViYXJyYXkoMiArIGZpbGVuYW1lX2xlbiwgMiArIGZpbGVuYW1lX2xlbiArIDQpKTtcblxuICB2YXIgZGF0YSA9IGJ5dGVzLnN1YmFycmF5KDYgKyBmaWxlbmFtZV9sZW4sIGJ5dGVzLmxlbmd0aCk7XG5cbiAgdGhpcy5zZXRCeXRlcyhkYXRhLCBmb3JtYXQpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYWNrZXRcbiAqXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gVWludDhBcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFja2V0XG4gKi9cbkxpdGVyYWwucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZmlsZW5hbWUgPSBfdXRpbDIuZGVmYXVsdC5zdHJfdG9fVWludDhBcnJheShfdXRpbDIuZGVmYXVsdC5lbmNvZGVfdXRmOCh0aGlzLmZpbGVuYW1lKSk7XG4gIHZhciBmaWxlbmFtZV9sZW5ndGggPSBuZXcgVWludDhBcnJheShbZmlsZW5hbWUubGVuZ3RoXSk7XG5cbiAgdmFyIGZvcm1hdCA9IG5ldyBVaW50OEFycmF5KFtfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LmxpdGVyYWwsIHRoaXMuZm9ybWF0KV0pO1xuICB2YXIgZGF0ZSA9IF91dGlsMi5kZWZhdWx0LndyaXRlRGF0ZSh0aGlzLmRhdGUpO1xuICB2YXIgZGF0YSA9IHRoaXMuZ2V0Qnl0ZXMoZm9ybWF0ICE9PSAnYmluYXJ5Jyk7XG5cbiAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW2Zvcm1hdCwgZmlsZW5hbWVfbGVuZ3RoLCBmaWxlbmFtZSwgZGF0ZSwgZGF0YV0pO1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gTGl0ZXJhbDtcblxufSx7XCIuLi9lbnVtc1wiOjM1OSxcIi4uL3V0aWxcIjozOTh9XSwzNzM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vZW51bXMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHN0cmFuZ2UgXCJNYXJrZXIgcGFja2V0XCIgKFRhZyAxMClcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi01Ljh8UkZDNDg4MCA1Ljh9OlxuICogQW4gZXhwZXJpbWVudGFsIHZlcnNpb24gb2YgUEdQIHVzZWQgdGhpcyBwYWNrZXQgYXMgdGhlIExpdGVyYWxcbiAqIHBhY2tldCwgYnV0IG5vIHJlbGVhc2VkIHZlcnNpb24gb2YgUEdQIGdlbmVyYXRlZCBMaXRlcmFsIHBhY2tldHMgd2l0aCB0aGlzXG4gKiB0YWcuIFdpdGggUEdQIDUueCwgdGhpcyBwYWNrZXQgaGFzIGJlZW4gcmVhc3NpZ25lZCBhbmQgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBhc1xuICogdGhlIE1hcmtlciBwYWNrZXQuXG4gKlxuICogU3VjaCBhIHBhY2tldCBNVVNUIGJlIGlnbm9yZWQgd2hlbiByZWNlaXZlZC5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6cGFja2V0XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gTWFya2VyKCkge1xuICB0aGlzLnRhZyA9IF9lbnVtczIuZGVmYXVsdC5wYWNrZXQubWFya2VyO1xufVxuXG4vKipcbiAqIFBhcnNpbmcgZnVuY3Rpb24gZm9yIGEgbGl0ZXJhbCBkYXRhIHBhY2tldCAodGFnIDEwKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgUGF5bG9hZCBvZiBhIHRhZyAxMCBwYWNrZXRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb25cbiAqICAgICAgICAgICAgUG9zaXRpb24gdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJpbmdcbiAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuXG4gKiAgICAgICAgICAgIExlbmd0aCBvZiB0aGUgcGFja2V0IG9yIHRoZSByZW1haW5pbmcgbGVuZ3RoIG9mXG4gKiAgICAgICAgICAgIGlucHV0IGF0IHBvc2l0aW9uXG4gKiBAcmV0dXJucyB7bW9kdWxlOnBhY2tldC5NYXJrZXJ9IE9iamVjdCByZXByZXNlbnRhdGlvblxuICovXG4vLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEByZXF1aXJlcyBlbnVtc1xuICovXG5cbk1hcmtlci5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChieXRlcykge1xuICBpZiAoYnl0ZXNbMF0gPT09IDB4NTAgJiYgLy8gUFxuICBieXRlc1sxXSA9PT0gMHg0NyAmJiAvLyBHXG4gIGJ5dGVzWzJdID09PSAweDUwKSB7XG4gICAgLy8gUFxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIG1hcmtlciBwYWNrZXQgZG9lcyBub3QgY29udGFpbiBcIlBHUFwiXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IE1hcmtlcjtcblxufSx7XCIuLi9lbnVtc1wiOjM1OX1dLDM3NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfa2V5aWQgPSBfZGVyZXFfKCcuLi90eXBlL2tleWlkJyk7XG5cbnZhciBfa2V5aWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfa2V5aWQpO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vZW51bXMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBPbmUtUGFzcyBTaWduYXR1cmUgUGFja2V0cyAoVGFnIDQpXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tNS40fFJGQzQ4ODAgNS40fTpcbiAqIFRoZSBPbmUtUGFzcyBTaWduYXR1cmUgcGFja2V0IHByZWNlZGVzIHRoZSBzaWduZWQgZGF0YSBhbmQgY29udGFpbnNcbiAqIGVub3VnaCBpbmZvcm1hdGlvbiB0byBhbGxvdyB0aGUgcmVjZWl2ZXIgdG8gYmVnaW4gY2FsY3VsYXRpbmcgYW55XG4gKiBoYXNoZXMgbmVlZGVkIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlLiAgSXQgYWxsb3dzIHRoZSBTaWduYXR1cmVcbiAqIHBhY2tldCB0byBiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZSwgc28gdGhhdCB0aGUgc2lnbmVyXG4gKiBjYW4gY29tcHV0ZSB0aGUgZW50aXJlIHNpZ25lZCBtZXNzYWdlIGluIG9uZSBwYXNzLlxuICogQG1lbWJlcm9mIG1vZHVsZTpwYWNrZXRcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBPbmVQYXNzU2lnbmF0dXJlKCkge1xuICAvKipcbiAgICogUGFja2V0IHR5cGVcbiAgICogQHR5cGUge21vZHVsZTplbnVtcy5wYWNrZXR9XG4gICAqL1xuICB0aGlzLnRhZyA9IF9lbnVtczIuZGVmYXVsdC5wYWNrZXQub25lUGFzc1NpZ25hdHVyZTtcbiAgLyoqIEEgb25lLW9jdGV0IHZlcnNpb24gbnVtYmVyLiAgVGhlIGN1cnJlbnQgdmVyc2lvbiBpcyAzLiAqL1xuICB0aGlzLnZlcnNpb24gPSBudWxsO1xuICAvKipcbiAgICogQSBvbmUtb2N0ZXQgc2lnbmF0dXJlIHR5cGUuXG4gICAqIFNpZ25hdHVyZSB0eXBlcyBhcmUgZGVzY3JpYmVkIGluXG4gICAqIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTUuMi4xfFJGQzQ4ODAgU2VjdGlvbiA1LjIuMX0uXG4gICAqL1xuICB0aGlzLnR5cGUgPSBudWxsO1xuICAvKipcbiAgICogQSBvbmUtb2N0ZXQgbnVtYmVyIGRlc2NyaWJpbmcgdGhlIGhhc2ggYWxnb3JpdGhtIHVzZWQuXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tOS40fFJGQzQ4ODAgOS40fVxuICAgKi9cbiAgdGhpcy5oYXNoQWxnb3JpdGhtID0gbnVsbDtcbiAgLyoqXG4gICAqIEEgb25lLW9jdGV0IG51bWJlciBkZXNjcmliaW5nIHRoZSBwdWJsaWMta2V5IGFsZ29yaXRobSB1c2VkLlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTkuMXxSRkM0ODgwIDkuMX1cbiAgICovXG4gIHRoaXMucHVibGljS2V5QWxnb3JpdGhtID0gbnVsbDtcbiAgLyoqIEFuIGVpZ2h0LW9jdGV0IG51bWJlciBob2xkaW5nIHRoZSBLZXkgSUQgb2YgdGhlIHNpZ25pbmcga2V5LiAqL1xuICB0aGlzLnNpZ25pbmdLZXlJZCA9IG51bGw7XG4gIC8qKlxuICAgKiBBIG9uZS1vY3RldCBudW1iZXIgaG9sZGluZyBhIGZsYWcgc2hvd2luZyB3aGV0aGVyIHRoZSBzaWduYXR1cmUgaXMgbmVzdGVkLlxuICAgKiBBIHplcm8gdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIG5leHQgcGFja2V0IGlzIGFub3RoZXIgT25lLVBhc3MgU2lnbmF0dXJlIHBhY2tldFxuICAgKiB0aGF0IGRlc2NyaWJlcyBhbm90aGVyIHNpZ25hdHVyZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBzYW1lIG1lc3NhZ2UgZGF0YS5cbiAgICovXG4gIHRoaXMuZmxhZ3MgPSBudWxsO1xufVxuXG4vKipcbiAqIHBhcnNpbmcgZnVuY3Rpb24gZm9yIGEgb25lLXBhc3Mgc2lnbmF0dXJlIHBhY2tldCAodGFnIDQpLlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlcyBwYXlsb2FkIG9mIGEgdGFnIDQgcGFja2V0XG4gKiBAcmV0dXJucyB7bW9kdWxlOnBhY2tldC5PbmVQYXNzU2lnbmF0dXJlfSBvYmplY3QgcmVwcmVzZW50YXRpb25cbiAqL1xuLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAcmVxdWlyZXMgdHlwZS9rZXlpZFxuICogQHJlcXVpcmVzIGVudW1zXG4gKiBAcmVxdWlyZXMgdXRpbFxuKi9cblxuT25lUGFzc1NpZ25hdHVyZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChieXRlcykge1xuICB2YXIgbXlwb3MgPSAwO1xuICAvLyBBIG9uZS1vY3RldCB2ZXJzaW9uIG51bWJlci4gIFRoZSBjdXJyZW50IHZlcnNpb24gaXMgMy5cbiAgdGhpcy52ZXJzaW9uID0gYnl0ZXNbbXlwb3MrK107XG5cbiAgLy8gQSBvbmUtb2N0ZXQgc2lnbmF0dXJlIHR5cGUuICBTaWduYXR1cmUgdHlwZXMgYXJlIGRlc2NyaWJlZCBpblxuICAvLyAgIFNlY3Rpb24gNS4yLjEuXG4gIHRoaXMudHlwZSA9IF9lbnVtczIuZGVmYXVsdC5yZWFkKF9lbnVtczIuZGVmYXVsdC5zaWduYXR1cmUsIGJ5dGVzW215cG9zKytdKTtcblxuICAvLyBBIG9uZS1vY3RldCBudW1iZXIgZGVzY3JpYmluZyB0aGUgaGFzaCBhbGdvcml0aG0gdXNlZC5cbiAgdGhpcy5oYXNoQWxnb3JpdGhtID0gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0Lmhhc2gsIGJ5dGVzW215cG9zKytdKTtcblxuICAvLyBBIG9uZS1vY3RldCBudW1iZXIgZGVzY3JpYmluZyB0aGUgcHVibGljLWtleSBhbGdvcml0aG0gdXNlZC5cbiAgdGhpcy5wdWJsaWNLZXlBbGdvcml0aG0gPSBfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LCBieXRlc1tteXBvcysrXSk7XG5cbiAgLy8gQW4gZWlnaHQtb2N0ZXQgbnVtYmVyIGhvbGRpbmcgdGhlIEtleSBJRCBvZiB0aGUgc2lnbmluZyBrZXkuXG4gIHRoaXMuc2lnbmluZ0tleUlkID0gbmV3IF9rZXlpZDIuZGVmYXVsdCgpO1xuICB0aGlzLnNpZ25pbmdLZXlJZC5yZWFkKGJ5dGVzLnN1YmFycmF5KG15cG9zLCBteXBvcyArIDgpKTtcbiAgbXlwb3MgKz0gODtcblxuICAvLyBBIG9uZS1vY3RldCBudW1iZXIgaG9sZGluZyBhIGZsYWcgc2hvd2luZyB3aGV0aGVyIHRoZSBzaWduYXR1cmVcbiAgLy8gICBpcyBuZXN0ZWQuICBBIHplcm8gdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIG5leHQgcGFja2V0IGlzXG4gIC8vICAgYW5vdGhlciBPbmUtUGFzcyBTaWduYXR1cmUgcGFja2V0IHRoYXQgZGVzY3JpYmVzIGFub3RoZXJcbiAgLy8gICBzaWduYXR1cmUgdG8gYmUgYXBwbGllZCB0byB0aGUgc2FtZSBtZXNzYWdlIGRhdGEuXG4gIHRoaXMuZmxhZ3MgPSBieXRlc1tteXBvcysrXTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIGNyZWF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBvbmUtcGFzcyBzaWduYXR1cmUgcGFja2V0XG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gYSBVaW50OEFycmF5IHJlcHJlc2VudGF0aW9uIG9mIGEgb25lLXBhc3Mgc2lnbmF0dXJlIHBhY2tldFxuICovXG5PbmVQYXNzU2lnbmF0dXJlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXJ0ID0gbmV3IFVpbnQ4QXJyYXkoWzMsIF9lbnVtczIuZGVmYXVsdC53cml0ZShfZW51bXMyLmRlZmF1bHQuc2lnbmF0dXJlLCB0aGlzLnR5cGUpLCBfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0Lmhhc2gsIHRoaXMuaGFzaEFsZ29yaXRobSksIF9lbnVtczIuZGVmYXVsdC53cml0ZShfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LCB0aGlzLnB1YmxpY0tleUFsZ29yaXRobSldKTtcblxuICB2YXIgZW5kID0gbmV3IFVpbnQ4QXJyYXkoW3RoaXMuZmxhZ3NdKTtcblxuICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbc3RhcnQsIHRoaXMuc2lnbmluZ0tleUlkLndyaXRlKCksIGVuZF0pO1xufTtcblxuLyoqXG4gKiBGaXggY3VzdG9tIHR5cGVzIGFmdGVyIGNsb25pbmdcbiAqL1xuT25lUGFzc1NpZ25hdHVyZS5wcm90b3R5cGUucG9zdENsb25lVHlwZUZpeCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zaWduaW5nS2V5SWQgPSBfa2V5aWQyLmRlZmF1bHQuZnJvbUNsb25lKHRoaXMuc2lnbmluZ0tleUlkKTtcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IE9uZVBhc3NTaWduYXR1cmU7XG5cbn0se1wiLi4vZW51bXNcIjozNTksXCIuLi90eXBlL2tleWlkXCI6Mzk0LFwiLi4vdXRpbFwiOjM5OH1dLDM3NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9kZXJlcV8oXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKTtcblxudmFyIF9zbGljZWRUb0FycmF5MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NsaWNlZFRvQXJyYXkyKTtcblxudmFyIF91dGlsID0gX2RlcmVxXyhcIi4uL3V0aWxcIik7XG5cbnZhciBfdXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICByZWFkU2ltcGxlTGVuZ3RoOiBmdW5jdGlvbiByZWFkU2ltcGxlTGVuZ3RoKGJ5dGVzKSB7XG4gICAgdmFyIGxlbiA9IDA7XG4gICAgdmFyIG9mZnNldCA9IHZvaWQgMDtcbiAgICB2YXIgdHlwZSA9IGJ5dGVzWzBdO1xuXG4gICAgaWYgKHR5cGUgPCAxOTIpIHtcbiAgICAgIHZhciBfYnl0ZXMgPSAoMCwgX3NsaWNlZFRvQXJyYXkzLmRlZmF1bHQpKGJ5dGVzLCAxKTtcblxuICAgICAgbGVuID0gX2J5dGVzWzBdO1xuXG4gICAgICBvZmZzZXQgPSAxO1xuICAgIH0gZWxzZSBpZiAodHlwZSA8IDI1NSkge1xuICAgICAgbGVuID0gKGJ5dGVzWzBdIC0gMTkyIDw8IDgpICsgYnl0ZXNbMV0gKyAxOTI7XG4gICAgICBvZmZzZXQgPSAyO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gMjU1KSB7XG4gICAgICBsZW4gPSBfdXRpbDIuZGVmYXVsdC5yZWFkTnVtYmVyKGJ5dGVzLnN1YmFycmF5KDEsIDEgKyA0KSk7XG4gICAgICBvZmZzZXQgPSA1O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsZW46IGxlbixcbiAgICAgIG9mZnNldDogb2Zmc2V0XG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogRW5jb2RlcyBhIGdpdmVuIGludGVnZXIgb2YgbGVuZ3RoIHRvIHRoZSBvcGVucGdwIGxlbmd0aCBzcGVjaWZpZXIgdG8gYVxuICAgKiBzdHJpbmdcbiAgICpcbiAgICogQHBhcmFtIHtJbnRlZ2VyfSBsZW5ndGggVGhlIGxlbmd0aCB0byBlbmNvZGVcbiAgICogQHJldHVybnMge1VpbnQ4QXJyYXl9IFN0cmluZyB3aXRoIG9wZW5wZ3AgbGVuZ3RoIHJlcHJlc2VudGF0aW9uXG4gICAqL1xuICB3cml0ZVNpbXBsZUxlbmd0aDogZnVuY3Rpb24gd3JpdGVTaW1wbGVMZW5ndGgobGVuZ3RoKSB7XG4gICAgaWYgKGxlbmd0aCA8IDE5Mikge1xuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFtsZW5ndGhdKTtcbiAgICB9IGVsc2UgaWYgKGxlbmd0aCA+IDE5MSAmJiBsZW5ndGggPCA4Mzg0KSB7XG4gICAgICAvKlxuICAgICAgICogbGV0IGEgPSAodG90YWwgZGF0YSBwYWNrZXQgbGVuZ3RoKSAtIDE5MiBsZXQgYmMgPSB0d28gb2N0ZXRcbiAgICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIGEgbGV0IGQgPSBiICsgMTkyXG4gICAgICAgKi9cbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbKGxlbmd0aCAtIDE5MiA+PiA4KSArIDE5MiwgbGVuZ3RoIC0gMTkyICYgMHhGRl0pO1xuICAgIH1cbiAgICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbbmV3IFVpbnQ4QXJyYXkoWzI1NV0pLCBfdXRpbDIuZGVmYXVsdC53cml0ZU51bWJlcihsZW5ndGgsIDQpXSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhIHBhY2tldCBoZWFkZXIgdmVyc2lvbiA0IHdpdGggdGhlIGdpdmVuIHRhZ190eXBlIGFuZCBsZW5ndGggdG8gYVxuICAgKiBzdHJpbmdcbiAgICpcbiAgICogQHBhcmFtIHtJbnRlZ2VyfSB0YWdfdHlwZSBUYWcgdHlwZVxuICAgKiBAcGFyYW0ge0ludGVnZXJ9IGxlbmd0aCBMZW5ndGggb2YgdGhlIHBheWxvYWRcbiAgICogQHJldHVybnMge1N0cmluZ30gU3RyaW5nIG9mIHRoZSBoZWFkZXJcbiAgICovXG4gIHdyaXRlSGVhZGVyOiBmdW5jdGlvbiB3cml0ZUhlYWRlcih0YWdfdHlwZSwgbGVuZ3RoKSB7XG4gICAgLyogd2UncmUgb25seSBnZW5lcmF0aW5nIHY0IHBhY2tldCBoZWFkZXJzIGhlcmUgKi9cbiAgICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbbmV3IFVpbnQ4QXJyYXkoWzB4QzAgfCB0YWdfdHlwZV0pLCB0aGlzLndyaXRlU2ltcGxlTGVuZ3RoKGxlbmd0aCldKTtcbiAgfSxcblxuICAvKipcbiAgICogV3JpdGVzIGEgcGFja2V0IGhlYWRlciBWZXJzaW9uIDMgd2l0aCB0aGUgZ2l2ZW4gdGFnX3R5cGUgYW5kIGxlbmd0aCB0byBhXG4gICAqIHN0cmluZ1xuICAgKlxuICAgKiBAcGFyYW0ge0ludGVnZXJ9IHRhZ190eXBlIFRhZyB0eXBlXG4gICAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgcGF5bG9hZFxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBTdHJpbmcgb2YgdGhlIGhlYWRlclxuICAgKi9cbiAgd3JpdGVPbGRIZWFkZXI6IGZ1bmN0aW9uIHdyaXRlT2xkSGVhZGVyKHRhZ190eXBlLCBsZW5ndGgpIHtcbiAgICBpZiAobGVuZ3RoIDwgMjU2KSB7XG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzB4ODAgfCB0YWdfdHlwZSA8PCAyLCBsZW5ndGhdKTtcbiAgICB9IGVsc2UgaWYgKGxlbmd0aCA8IDY1NTM2KSB7XG4gICAgICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbbmV3IFVpbnQ4QXJyYXkoWzB4ODAgfCB0YWdfdHlwZSA8PCAyIHwgMV0pLCBfdXRpbDIuZGVmYXVsdC53cml0ZU51bWJlcihsZW5ndGgsIDIpXSk7XG4gICAgfVxuICAgIHJldHVybiBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFtuZXcgVWludDhBcnJheShbMHg4MCB8IHRhZ190eXBlIDw8IDIgfCAyXSksIF91dGlsMi5kZWZhdWx0LndyaXRlTnVtYmVyKGxlbmd0aCwgNCldKTtcbiAgfSxcblxuICAvKipcbiAgICogR2VuZXJpYyBzdGF0aWMgUGFja2V0IFBhcnNlciBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgSW5wdXQgc3RyZWFtIGFzIHN0cmluZ1xuICAgKiBAcGFyYW0ge2ludGVnZXJ9IHBvc2l0aW9uIFBvc2l0aW9uIHRvIHN0YXJ0IHBhcnNpbmdcbiAgICogQHBhcmFtIHtpbnRlZ2VyfSBsZW4gTGVuZ3RoIG9mIHRoZSBpbnB1dCBmcm9tIHBvc2l0aW9uIG9uXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYSBwYXJzZWQgbW9kdWxlOnBhY2tldC9wYWNrZXRcbiAgICovXG4gIHJlYWQ6IGZ1bmN0aW9uIHJlYWQoaW5wdXQsIHBvc2l0aW9uLCBsZW4pIHtcbiAgICAvLyBzb21lIHNhbml0eSBjaGVja3NcbiAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQubGVuZ3RoIDw9IHBvc2l0aW9uIHx8IGlucHV0LnN1YmFycmF5KHBvc2l0aW9uLCBpbnB1dC5sZW5ndGgpLmxlbmd0aCA8IDIgfHwgKGlucHV0W3Bvc2l0aW9uXSAmIDB4ODApID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciBkdXJpbmcgcGFyc2luZy4gVGhpcyBtZXNzYWdlIC8ga2V5IHByb2JhYmx5IGRvZXMgbm90IGNvbmZvcm0gdG8gYSB2YWxpZCBPcGVuUEdQIGZvcm1hdC5cIik7XG4gICAgfVxuICAgIHZhciBteXBvcyA9IHBvc2l0aW9uO1xuICAgIHZhciB0YWcgPSAtMTtcbiAgICB2YXIgZm9ybWF0ID0gLTE7XG4gICAgdmFyIHBhY2tldF9sZW5ndGggPSB2b2lkIDA7XG5cbiAgICBmb3JtYXQgPSAwOyAvLyAwID0gb2xkIGZvcm1hdDsgMSA9IG5ldyBmb3JtYXRcbiAgICBpZiAoKGlucHV0W215cG9zXSAmIDB4NDApICE9PSAwKSB7XG4gICAgICBmb3JtYXQgPSAxO1xuICAgIH1cblxuICAgIHZhciBwYWNrZXRfbGVuZ3RoX3R5cGUgPSB2b2lkIDA7XG4gICAgaWYgKGZvcm1hdCkge1xuICAgICAgLy8gbmV3IGZvcm1hdCBoZWFkZXJcbiAgICAgIHRhZyA9IGlucHV0W215cG9zXSAmIDB4M0Y7IC8vIGJpdCA1LTBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb2xkIGZvcm1hdCBoZWFkZXJcbiAgICAgIHRhZyA9IChpbnB1dFtteXBvc10gJiAweDNGKSA+PiAyOyAvLyBiaXQgNS0yXG4gICAgICBwYWNrZXRfbGVuZ3RoX3R5cGUgPSBpbnB1dFtteXBvc10gJiAweDAzOyAvLyBiaXQgMS0wXG4gICAgfVxuXG4gICAgLy8gaGVhZGVyIG9jdGV0IHBhcnNpbmcgZG9uZVxuICAgIG15cG9zKys7XG5cbiAgICAvLyBwYXJzZWQgbGVuZ3RoIGZyb20gbGVuZ3RoIGZpZWxkXG4gICAgdmFyIGJvZHlkYXRhID0gbnVsbDtcblxuICAgIC8vIHVzZWQgZm9yIHBhcnRpYWwgYm9keSBsZW5ndGhzXG4gICAgdmFyIHJlYWxfcGFja2V0X2xlbmd0aCA9IC0xO1xuICAgIGlmICghZm9ybWF0KSB7XG4gICAgICAvLyA0LjIuMS4gT2xkIEZvcm1hdCBQYWNrZXQgTGVuZ3Roc1xuICAgICAgc3dpdGNoIChwYWNrZXRfbGVuZ3RoX3R5cGUpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIC8vIFRoZSBwYWNrZXQgaGFzIGEgb25lLW9jdGV0IGxlbmd0aC4gVGhlIGhlYWRlciBpcyAyIG9jdGV0c1xuICAgICAgICAgIC8vIGxvbmcuXG4gICAgICAgICAgcGFja2V0X2xlbmd0aCA9IGlucHV0W215cG9zKytdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgLy8gVGhlIHBhY2tldCBoYXMgYSB0d28tb2N0ZXQgbGVuZ3RoLiBUaGUgaGVhZGVyIGlzIDMgb2N0ZXRzXG4gICAgICAgICAgLy8gbG9uZy5cbiAgICAgICAgICBwYWNrZXRfbGVuZ3RoID0gaW5wdXRbbXlwb3MrK10gPDwgOCB8IGlucHV0W215cG9zKytdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgLy8gVGhlIHBhY2tldCBoYXMgYSBmb3VyLW9jdGV0IGxlbmd0aC4gVGhlIGhlYWRlciBpcyA1XG4gICAgICAgICAgLy8gb2N0ZXRzIGxvbmcuXG4gICAgICAgICAgcGFja2V0X2xlbmd0aCA9IGlucHV0W215cG9zKytdIDw8IDI0IHwgaW5wdXRbbXlwb3MrK10gPDwgMTYgfCBpbnB1dFtteXBvcysrXSA8PCA4IHwgaW5wdXRbbXlwb3MrK107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gMyAtIFRoZSBwYWNrZXQgaXMgb2YgaW5kZXRlcm1pbmF0ZSBsZW5ndGguIFRoZSBoZWFkZXIgaXMgMVxuICAgICAgICAgIC8vIG9jdGV0IGxvbmcsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gbXVzdCBkZXRlcm1pbmUgaG93IGxvbmdcbiAgICAgICAgICAvLyB0aGUgcGFja2V0IGlzLiBJZiB0aGUgcGFja2V0IGlzIGluIGEgZmlsZSwgdGhpcyBtZWFucyB0aGF0XG4gICAgICAgICAgLy8gdGhlIHBhY2tldCBleHRlbmRzIHVudGlsIHRoZSBlbmQgb2YgdGhlIGZpbGUuIEluIGdlbmVyYWwsXG4gICAgICAgICAgLy8gYW4gaW1wbGVtZW50YXRpb24gU0hPVUxEIE5PVCB1c2UgaW5kZXRlcm1pbmF0ZS1sZW5ndGhcbiAgICAgICAgICAvLyBwYWNrZXRzIGV4Y2VwdCB3aGVyZSB0aGUgZW5kIG9mIHRoZSBkYXRhIHdpbGwgYmUgY2xlYXJcbiAgICAgICAgICAvLyBmcm9tIHRoZSBjb250ZXh0LCBhbmQgZXZlbiB0aGVuIGl0IGlzIGJldHRlciB0byB1c2UgYVxuICAgICAgICAgIC8vIGRlZmluaXRlIGxlbmd0aCwgb3IgYSBuZXcgZm9ybWF0IGhlYWRlci4gVGhlIG5ldyBmb3JtYXRcbiAgICAgICAgICAvLyBoZWFkZXJzIGRlc2NyaWJlZCBiZWxvdyBoYXZlIGEgbWVjaGFuaXNtIGZvciBwcmVjaXNlbHlcbiAgICAgICAgICAvLyBlbmNvZGluZyBkYXRhIG9mIGluZGV0ZXJtaW5hdGUgbGVuZ3RoLlxuICAgICAgICAgIHBhY2tldF9sZW5ndGggPSBsZW47XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDQuMi4yLiBOZXcgRm9ybWF0IFBhY2tldCBMZW5ndGhzXG4gICAgICAvLyA0LjIuMi4xLiBPbmUtT2N0ZXQgTGVuZ3Roc1xuICAgICAgaWYgKGlucHV0W215cG9zXSA8IDE5Mikge1xuICAgICAgICBwYWNrZXRfbGVuZ3RoID0gaW5wdXRbbXlwb3MrK107XG4gICAgICAgIC8vIDQuMi4yLjIuIFR3by1PY3RldCBMZW5ndGhzXG4gICAgICB9IGVsc2UgaWYgKGlucHV0W215cG9zXSA+PSAxOTIgJiYgaW5wdXRbbXlwb3NdIDwgMjI0KSB7XG4gICAgICAgIHBhY2tldF9sZW5ndGggPSAoaW5wdXRbbXlwb3MrK10gLSAxOTIgPDwgOCkgKyBpbnB1dFtteXBvcysrXSArIDE5MjtcbiAgICAgICAgLy8gNC4yLjIuNC4gUGFydGlhbCBCb2R5IExlbmd0aHNcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXRbbXlwb3NdID4gMjIzICYmIGlucHV0W215cG9zXSA8IDI1NSkge1xuICAgICAgICBwYWNrZXRfbGVuZ3RoID0gMSA8PCAoaW5wdXRbbXlwb3MrK10gJiAweDFGKTtcbiAgICAgICAgLy8gRUVFSywgd2UncmUgcmVhZGluZyB0aGUgZnVsbCBkYXRhIGhlcmUuLi5cbiAgICAgICAgdmFyIG15cG9zMiA9IG15cG9zICsgcGFja2V0X2xlbmd0aDtcbiAgICAgICAgYm9keWRhdGEgPSBbaW5wdXQuc3ViYXJyYXkobXlwb3MsIG15cG9zICsgcGFja2V0X2xlbmd0aCldO1xuICAgICAgICB2YXIgdG1wbGVuID0gdm9pZCAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGlmIChpbnB1dFtteXBvczJdIDwgMTkyKSB7XG4gICAgICAgICAgICB0bXBsZW4gPSBpbnB1dFtteXBvczIrK107XG4gICAgICAgICAgICBwYWNrZXRfbGVuZ3RoICs9IHRtcGxlbjtcbiAgICAgICAgICAgIGJvZHlkYXRhLnB1c2goaW5wdXQuc3ViYXJyYXkobXlwb3MyLCBteXBvczIgKyB0bXBsZW4pKTtcbiAgICAgICAgICAgIG15cG9zMiArPSB0bXBsZW47XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0W215cG9zMl0gPj0gMTkyICYmIGlucHV0W215cG9zMl0gPCAyMjQpIHtcbiAgICAgICAgICAgIHRtcGxlbiA9IChpbnB1dFtteXBvczIrK10gLSAxOTIgPDwgOCkgKyBpbnB1dFtteXBvczIrK10gKyAxOTI7XG4gICAgICAgICAgICBwYWNrZXRfbGVuZ3RoICs9IHRtcGxlbjtcbiAgICAgICAgICAgIGJvZHlkYXRhLnB1c2goaW5wdXQuc3ViYXJyYXkobXlwb3MyLCBteXBvczIgKyB0bXBsZW4pKTtcbiAgICAgICAgICAgIG15cG9zMiArPSB0bXBsZW47XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0W215cG9zMl0gPiAyMjMgJiYgaW5wdXRbbXlwb3MyXSA8IDI1NSkge1xuICAgICAgICAgICAgdG1wbGVuID0gMSA8PCAoaW5wdXRbbXlwb3MyKytdICYgMHgxRik7XG4gICAgICAgICAgICBwYWNrZXRfbGVuZ3RoICs9IHRtcGxlbjtcbiAgICAgICAgICAgIGJvZHlkYXRhLnB1c2goaW5wdXQuc3ViYXJyYXkobXlwb3MyLCBteXBvczIgKyB0bXBsZW4pKTtcbiAgICAgICAgICAgIG15cG9zMiArPSB0bXBsZW47XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG15cG9zMisrO1xuICAgICAgICAgICAgdG1wbGVuID0gaW5wdXRbbXlwb3MyKytdIDw8IDI0IHwgaW5wdXRbbXlwb3MyKytdIDw8IDE2IHwgaW5wdXRbbXlwb3MyKytdIDw8IDggfCBpbnB1dFtteXBvczIrK107XG4gICAgICAgICAgICBib2R5ZGF0YS5wdXNoKGlucHV0LnN1YmFycmF5KG15cG9zMiwgbXlwb3MyICsgdG1wbGVuKSk7XG4gICAgICAgICAgICBwYWNrZXRfbGVuZ3RoICs9IHRtcGxlbjtcbiAgICAgICAgICAgIG15cG9zMiArPSB0bXBsZW47XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVhbF9wYWNrZXRfbGVuZ3RoID0gbXlwb3MyIC0gbXlwb3M7XG4gICAgICAgIC8vIDQuMi4yLjMuIEZpdmUtT2N0ZXQgTGVuZ3Roc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXlwb3MrKztcbiAgICAgICAgcGFja2V0X2xlbmd0aCA9IGlucHV0W215cG9zKytdIDw8IDI0IHwgaW5wdXRbbXlwb3MrK10gPDwgMTYgfCBpbnB1dFtteXBvcysrXSA8PCA4IHwgaW5wdXRbbXlwb3MrK107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgd2FzJ250IGEgcGFydGlhbCBib2R5IGxlbmd0aDogdXNlIHRoZSBzcGVjaWZpZWRcbiAgICAvLyBwYWNrZXRfbGVuZ3RoXG4gICAgaWYgKHJlYWxfcGFja2V0X2xlbmd0aCA9PT0gLTEpIHtcbiAgICAgIHJlYWxfcGFja2V0X2xlbmd0aCA9IHBhY2tldF9sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKGJvZHlkYXRhID09PSBudWxsKSB7XG4gICAgICBib2R5ZGF0YSA9IGlucHV0LnN1YmFycmF5KG15cG9zLCBteXBvcyArIHJlYWxfcGFja2V0X2xlbmd0aCk7XG4gICAgfSBlbHNlIGlmIChib2R5ZGF0YSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBib2R5ZGF0YSA9IF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoYm9keWRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0YWc6IHRhZyxcbiAgICAgIHBhY2tldDogYm9keWRhdGEsXG4gICAgICBvZmZzZXQ6IG15cG9zICsgcmVhbF9wYWNrZXRfbGVuZ3RoXG4gICAgfTtcbiAgfVxufTsgLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEZ1bmN0aW9ucyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBwYWNrZXRzXG4gKiBAcmVxdWlyZXMgZW51bXNcbiAqIEByZXF1aXJlcyB1dGlsXG4gKiBAbW9kdWxlIHBhY2tldC9wYWNrZXRcbiAqL1xuXG59LHtcIi4uL3V0aWxcIjozOTgsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiOjQwfV0sMzc2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3InKTtcblxudmFyIF9yZWdlbmVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWdlbmVyYXRvcik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvcicpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXN5bmNUb0dlbmVyYXRvcjIpO1xuXG52YXIgX2FsbF9wYWNrZXRzID0gX2RlcmVxXygnLi9hbGxfcGFja2V0cycpO1xuXG52YXIgcGFja2V0cyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9hbGxfcGFja2V0cyk7XG5cbnZhciBfcGFja2V0ID0gX2RlcmVxXygnLi9wYWNrZXQnKTtcblxudmFyIF9wYWNrZXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFja2V0KTtcblxudmFyIF9jb25maWcgPSBfZGVyZXFfKCcuLi9jb25maWcnKTtcblxudmFyIF9jb25maWcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29uZmlnKTtcblxudmFyIF9lbnVtcyA9IF9kZXJlcV8oJy4uL2VudW1zJyk7XG5cbnZhciBfZW51bXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW51bXMpO1xuXG52YXIgX3V0aWwgPSBfZGVyZXFfKCcuLi91dGlsJyk7XG5cbnZhciBfdXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBlbHNlIHsgdmFyIG5ld09iaiA9IHt9OyBpZiAob2JqICE9IG51bGwpIHsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyByZXR1cm4gbmV3T2JqOyB9IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBsaXN0IG9mIG9wZW5wZ3AgcGFja2V0cy5cbiAqIFRha2UgY2FyZSB3aGVuIGl0ZXJhdGluZyBvdmVyIGl0IC0gdGhlIHBhY2tldHMgdGhlbXNlbHZlc1xuICogYXJlIHN0b3JlZCBhcyBudW1lcmljYWwgaW5kaWNlcy5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6cGFja2V0XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gTGlzdCgpIHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgcGFja2V0cyBjb250YWluZWQgd2l0aGluIHRoZSBsaXN0LlxuICAgKiBAcmVhZG9ubHlcbiAgICogQHR5cGUge0ludGVnZXJ9XG4gICAqL1xuICB0aGlzLmxlbmd0aCA9IDA7XG59XG5cbi8qKlxuICogUmVhZHMgYSBzdHJlYW0gb2YgYmluYXJ5IGRhdGEgYW5kIGludGVycHJlbnRzIGl0IGFzIGEgbGlzdCBvZiBwYWNrZXRzLlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBBIFVpbnQ4QXJyYXkgb2YgYnl0ZXMuXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIGNhbGxiYWNrLXJldHVybiAqL1xuLyoqXG4gKiBAcmVxdWlyZXMgcGFja2V0L2FsbF9wYWNrZXRzXG4gKiBAcmVxdWlyZXMgcGFja2V0L3BhY2tldFxuICogQHJlcXVpcmVzIGNvbmZpZ1xuICogQHJlcXVpcmVzIGVudW1zXG4gKiBAcmVxdWlyZXMgdXRpbFxuICovXG5cbkxpc3QucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgdmFyIGkgPSAwO1xuXG4gIHdoaWxlIChpIDwgYnl0ZXMubGVuZ3RoKSB7XG4gICAgdmFyIHBhcnNlZCA9IF9wYWNrZXQyLmRlZmF1bHQucmVhZChieXRlcywgaSwgYnl0ZXMubGVuZ3RoIC0gaSk7XG4gICAgaSA9IHBhcnNlZC5vZmZzZXQ7XG5cbiAgICB2YXIgcHVzaGVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHZhciB0YWcgPSBfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQucGFja2V0LCBwYXJzZWQudGFnKTtcbiAgICAgIHZhciBwYWNrZXQgPSBwYWNrZXRzLm5ld1BhY2tldEZyb21UYWcodGFnKTtcbiAgICAgIHRoaXMucHVzaChwYWNrZXQpO1xuICAgICAgcHVzaGVkID0gdHJ1ZTtcbiAgICAgIHBhY2tldC5yZWFkKHBhcnNlZC5wYWNrZXQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghX2NvbmZpZzIuZGVmYXVsdC50b2xlcmFudCB8fCBwYXJzZWQudGFnID09PSBfZW51bXMyLmRlZmF1bHQucGFja2V0LnN5bW1ldHJpY2FsbHlFbmNyeXB0ZWQgfHwgcGFyc2VkLnRhZyA9PT0gX2VudW1zMi5kZWZhdWx0LnBhY2tldC5saXRlcmFsIHx8IHBhcnNlZC50YWcgPT09IF9lbnVtczIuZGVmYXVsdC5wYWNrZXQuY29tcHJlc3NlZCkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgX3V0aWwyLmRlZmF1bHQucHJpbnRfZGVidWdfZXJyb3IoZSk7XG4gICAgICBpZiAocHVzaGVkKSB7XG4gICAgICAgIHRoaXMucG9wKCk7IC8vIGRyb3AgdW5zdXBwb3J0ZWQgcGFja2V0XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2Ygb3BlbnBncCBvYmplY3RzIGNvbnRhaW5lZCB3aXRoaW4gdGhlXG4gKiBjbGFzcyBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBBIFVpbnQ4QXJyYXkgY29udGFpbmluZyB2YWxpZCBvcGVucGdwIHBhY2tldHMuXG4gKi9cbkxpc3QucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYXJyID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBhY2tldGJ5dGVzID0gdGhpc1tpXS53cml0ZSgpO1xuICAgIGFyci5wdXNoKF9wYWNrZXQyLmRlZmF1bHQud3JpdGVIZWFkZXIodGhpc1tpXS50YWcsIHBhY2tldGJ5dGVzLmxlbmd0aCkpO1xuICAgIGFyci5wdXNoKHBhY2tldGJ5dGVzKTtcbiAgfVxuXG4gIHJldHVybiBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KGFycik7XG59O1xuXG4vKipcbiAqIEFkZHMgYSBwYWNrZXQgdG8gdGhlIGxpc3QuIFRoaXMgaXMgdGhlIG9ubHkgc3VwcG9ydGVkIG1ldGhvZCBvZiBkb2luZyBzbztcbiAqIHdyaXRpbmcgdG8gcGFja2V0bGlzdFtpXSBkaXJlY3RseSB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWNrZXQgUGFja2V0IHRvIHB1c2hcbiAqL1xuTGlzdC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChwYWNrZXQpIHtcbiAgaWYgKCFwYWNrZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwYWNrZXQucGFja2V0cyA9IHBhY2tldC5wYWNrZXRzIHx8IG5ldyBMaXN0KCk7XG5cbiAgdGhpc1t0aGlzLmxlbmd0aF0gPSBwYWNrZXQ7XG4gIHRoaXMubGVuZ3RoKys7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhIHBhY2tldCBmcm9tIHRoZSBsaXN0IGFuZCByZXR1cm4gaXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAgIFRoZSBwYWNrZXQgdGhhdCB3YXMgcmVtb3ZlZFxuICovXG5MaXN0LnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwYWNrZXQgPSB0aGlzW3RoaXMubGVuZ3RoIC0gMV07XG4gIGRlbGV0ZSB0aGlzW3RoaXMubGVuZ3RoIC0gMV07XG4gIHRoaXMubGVuZ3RoLS07XG5cbiAgcmV0dXJuIHBhY2tldDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBQYWNrZXRMaXN0IHdpdGggYWxsIHBhY2tldHMgdGhhdCBwYXNzIHRoZSB0ZXN0IGltcGxlbWVudGVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvbi5cbiAqL1xuTGlzdC5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHZhciBmaWx0ZXJlZCA9IG5ldyBMaXN0KCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNhbGxiYWNrKHRoaXNbaV0sIGksIHRoaXMpKSB7XG4gICAgICBmaWx0ZXJlZC5wdXNoKHRoaXNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaWx0ZXJlZDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBQYWNrZXRMaXN0IHdpdGggYWxsIHBhY2tldHMgZnJvbSB0aGUgZ2l2ZW4gdHlwZXNcbiAqL1xuTGlzdC5wcm90b3R5cGUuZmlsdGVyQnlUYWcgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBmaWx0ZXJlZCA9IG5ldyBMaXN0KCk7XG5cbiAgdmFyIGhhbmRsZSA9IGZ1bmN0aW9uIGhhbmRsZSh0YWcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHBhY2tldFR5cGUpIHtcbiAgICAgIHJldHVybiB0YWcgPT09IHBhY2tldFR5cGU7XG4gICAgfTtcbiAgfTtcblxuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJncy5zb21lKGhhbmRsZSh0aGlzW2ldLnRhZykpKSB7XG4gICAgICBmaWx0ZXJlZC5wdXNoKHRoaXNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaWx0ZXJlZDtcbn07XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIG9uY2UgZm9yIGVhY2ggZWxlbWVudFxuICovXG5MaXN0LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIGNhbGxiYWNrKHRoaXNbaV0sIGksIHRoaXMpO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyByZXR1cm4gdmFsdWVzIG9mIGNhbGxiYWNrXG4gKiBvbiBlYWNoIGVsZW1lbnRcbiAqL1xuTGlzdC5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHZhciBwYWNrZXRBcnJheSA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHBhY2tldEFycmF5LnB1c2goY2FsbGJhY2sodGhpc1tpXSwgaSwgdGhpcykpO1xuICB9XG5cbiAgcmV0dXJuIHBhY2tldEFycmF5O1xufTtcblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gb25jZSBmb3IgZWFjaCBlbGVtZW50XG4gKiB1bnRpbCBpdCBmaW5kcyBvbmUgd2hlcmUgY2FsbGJhY2sgcmV0dXJucyBhIHRydXRoeSB2YWx1ZVxuICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn1cbiAqIEBhc3luY1xuICovXG5MaXN0LnByb3RvdHlwZS5zb21lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlKGNhbGxiYWNrKSB7XG4gICAgdmFyIGk7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgaSA9IDA7XG5cbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBpZiAoIShpIDwgdGhpcy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sodGhpc1tpXSwgaSwgdGhpcyk7XG5cbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBpZiAoIV9jb250ZXh0LnNlbnQpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCB0cnVlKTtcblxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCBmYWxzZSk7XG5cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94KSB7XG4gICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gb25jZSBmb3IgZWFjaCBlbGVtZW50LFxuICogcmV0dXJucyB0cnVlIGlmIGFsbCBjYWxsYmFja3MgcmV0dXJucyBhIHRydXRoeSB2YWx1ZVxuICovXG5MaXN0LnByb3RvdHlwZS5ldmVyeSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWNhbGxiYWNrKHRoaXNbaV0sIGksIHRoaXMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBUcmF2ZXJzZXMgcGFja2V0IHRyZWUgYW5kIHJldHVybnMgZmlyc3QgbWF0Y2hpbmcgcGFja2V0XG4gKiBAcGFyYW0gIHttb2R1bGU6ZW51bXMucGFja2V0fSB0eXBlIFRoZSBwYWNrZXQgdHlwZVxuICogQHJldHVybnMge21vZHVsZTpwYWNrZXQvcGFja2V0fG51bGx9XG4gKi9cbkxpc3QucHJvdG90eXBlLmZpbmRQYWNrZXQgPSBmdW5jdGlvbiAodHlwZSkge1xuICB2YXIgcGFja2V0bGlzdCA9IHRoaXMuZmlsdGVyQnlUYWcodHlwZSk7XG4gIGlmIChwYWNrZXRsaXN0Lmxlbmd0aCkge1xuICAgIHJldHVybiBwYWNrZXRsaXN0WzBdO1xuICB9XG4gIHZhciBmb3VuZCA9IG51bGw7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh0aGlzW2ldLnBhY2tldHMubGVuZ3RoKSB7XG4gICAgICBmb3VuZCA9IHRoaXNbaV0ucGFja2V0cy5maW5kUGFja2V0KHR5cGUpO1xuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhcnJheSBvZiBmb3VuZCBpbmRpY2VzIGJ5IHRhZ1xuICovXG5MaXN0LnByb3RvdHlwZS5pbmRleE9mVGFnID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGFnSW5kZXggPSBbXTtcbiAgdmFyIHRoYXQgPSB0aGlzO1xuXG4gIHZhciBoYW5kbGUgPSBmdW5jdGlvbiBoYW5kbGUodGFnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChwYWNrZXRUeXBlKSB7XG4gICAgICByZXR1cm4gdGFnID09PSBwYWNrZXRUeXBlO1xuICAgIH07XG4gIH07XG5cbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJncy5zb21lKGhhbmRsZSh0aGF0W2ldLnRhZykpKSB7XG4gICAgICB0YWdJbmRleC5wdXNoKGkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFnSW5kZXg7XG59O1xuXG4vKipcbiAqIFJldHVybnMgc2xpY2Ugb2YgcGFja2V0bGlzdFxuICovXG5MaXN0LnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIChiZWdpbiwgZW5kKSB7XG4gIGlmICghZW5kKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGg7XG4gIH1cbiAgdmFyIHBhcnQgPSBuZXcgTGlzdCgpO1xuICBmb3IgKHZhciBpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykge1xuICAgIHBhcnQucHVzaCh0aGlzW2ldKTtcbiAgfVxuICByZXR1cm4gcGFydDtcbn07XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIHBhY2tldGxpc3Qgb3IgYXJyYXkgb2YgcGFja2V0c1xuICovXG5MaXN0LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAocGFja2V0bGlzdCkge1xuICBpZiAocGFja2V0bGlzdCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFja2V0bGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wdXNoKHBhY2tldGxpc3RbaV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWxsb2NhdGUgYSBuZXcgcGFja2V0bGlzdCBmcm9tIHN0cnVjdHVyZWQgcGFja2V0bGlzdCBjbG9uZVxuICogU2VlIHtAbGluayBodHRwczovL3czYy5naXRodWIuaW8vaHRtbC9pbmZyYXN0cnVjdHVyZS5odG1sI3NhZmUtcGFzc2luZy1vZi1zdHJ1Y3R1cmVkLWRhdGF9XG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0Q2xvbmUgcGFja2V0bGlzdCBjbG9uZVxuICogQHJldHVybnMge09iamVjdH0gbmV3IHBhY2tldGxpc3Qgb2JqZWN0IHdpdGggZGF0YSBmcm9tIHBhY2tldGxpc3QgY2xvbmVcbiAqL1xuTGlzdC5mcm9tU3RydWN0dXJlZENsb25lID0gZnVuY3Rpb24gKHBhY2tldGxpc3RDbG9uZSkge1xuICB2YXIgcGFja2V0bGlzdCA9IG5ldyBMaXN0KCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGFja2V0bGlzdENsb25lLmxlbmd0aDsgaSsrKSB7XG4gICAgcGFja2V0bGlzdC5wdXNoKHBhY2tldHMuZnJvbVN0cnVjdHVyZWRDbG9uZShwYWNrZXRsaXN0Q2xvbmVbaV0pKTtcbiAgICBpZiAocGFja2V0bGlzdFtpXS5wYWNrZXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcGFja2V0bGlzdFtpXS5wYWNrZXRzID0gdGhpcy5mcm9tU3RydWN0dXJlZENsb25lKHBhY2tldGxpc3RbaV0ucGFja2V0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhY2tldGxpc3RbaV0ucGFja2V0cyA9IG5ldyBMaXN0KCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWNrZXRsaXN0O1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gTGlzdDtcblxufSx7XCIuLi9jb25maWdcIjozMjUsXCIuLi9lbnVtc1wiOjM1OSxcIi4uL3V0aWxcIjozOTgsXCIuL2FsbF9wYWNrZXRzXCI6MzY4LFwiLi9wYWNrZXRcIjozNzUsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiOjM1LFwiYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvclwiOjQyfV0sMzc3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9rZXlpZCA9IF9kZXJlcV8oJy4uL3R5cGUva2V5aWQnKTtcblxudmFyIF9rZXlpZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9rZXlpZCk7XG5cbnZhciBfbXBpID0gX2RlcmVxXygnLi4vdHlwZS9tcGknKTtcblxudmFyIF9tcGkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbXBpKTtcblxudmFyIF9jb25maWcgPSBfZGVyZXFfKCcuLi9jb25maWcnKTtcblxudmFyIF9jb25maWcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29uZmlnKTtcblxudmFyIF9jcnlwdG8gPSBfZGVyZXFfKCcuLi9jcnlwdG8nKTtcblxudmFyIF9jcnlwdG8yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3J5cHRvKTtcblxudmFyIF9lbnVtcyA9IF9kZXJlcV8oJy4uL2VudW1zJyk7XG5cbnZhciBfZW51bXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW51bXMpO1xuXG52YXIgX3V0aWwgPSBfZGVyZXFfKCcuLi91dGlsJyk7XG5cbnZhciBfdXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgS2V5IE1hdGVyaWFsIFBhY2tldCAoVGFnIDUsNiw3LDE0KVxuICpcbiAqIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTUuNXxSRkM0NDgwIDUuNX06XG4gKiBBIGtleSBtYXRlcmlhbCBwYWNrZXQgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHB1YmxpYyBvclxuICogcHJpdmF0ZSBrZXkuICBUaGVyZSBhcmUgZm91ciB2YXJpYW50cyBvZiB0aGlzIHBhY2tldCB0eXBlLCBhbmQgdHdvXG4gKiBtYWpvciB2ZXJzaW9ucy5cbiAqXG4gKiBBIFB1YmxpYy1LZXkgcGFja2V0IHN0YXJ0cyBhIHNlcmllcyBvZiBwYWNrZXRzIHRoYXQgZm9ybXMgYW4gT3BlblBHUFxuICoga2V5IChzb21ldGltZXMgY2FsbGVkIGFuIE9wZW5QR1AgY2VydGlmaWNhdGUpLlxuICogQG1lbWJlcm9mIG1vZHVsZTpwYWNrZXRcbiAqIEBjb25zdHJ1Y3RvclxuICovXG4vLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEByZXF1aXJlcyB0eXBlL2tleWlkXG4gKiBAcmVxdWlyZXMgdHlwZS9tcGlcbiAqIEByZXF1aXJlcyBjb25maWdcbiAqIEByZXF1aXJlcyBjcnlwdG9cbiAqIEByZXF1aXJlcyBlbnVtc1xuICogQHJlcXVpcmVzIHV0aWxcbiAqL1xuXG5mdW5jdGlvbiBQdWJsaWNLZXkoKSB7XG4gIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBuZXcgRGF0ZSgpO1xuXG4gIC8qKlxuICAgKiBQYWNrZXQgdHlwZVxuICAgKiBAdHlwZSB7bW9kdWxlOmVudW1zLnBhY2tldH1cbiAgICovXG4gIHRoaXMudGFnID0gX2VudW1zMi5kZWZhdWx0LnBhY2tldC5wdWJsaWNLZXk7XG4gIC8qKlxuICAgKiBQYWNrZXQgdmVyc2lvblxuICAgKiBAdHlwZSB7SW50ZWdlcn1cbiAgICovXG4gIHRoaXMudmVyc2lvbiA9IF9jb25maWcyLmRlZmF1bHQuYWVhZF9wcm90ZWN0ICYmIF9jb25maWcyLmRlZmF1bHQuYWVhZF9wcm90ZWN0X3ZlcnNpb24gPT09IDQgPyA1IDogNDtcbiAgLyoqXG4gICAqIEtleSBjcmVhdGlvbiBkYXRlLlxuICAgKiBAdHlwZSB7RGF0ZX1cbiAgICovXG4gIHRoaXMuY3JlYXRlZCA9IF91dGlsMi5kZWZhdWx0Lm5vcm1hbGl6ZURhdGUoZGF0ZSk7XG4gIC8qKlxuICAgKiBBbGdvcml0aG0gc3BlY2lmaWMgcGFyYW1zXG4gICAqIEB0eXBlIHtBcnJheTxPYmplY3Q+fVxuICAgKi9cbiAgdGhpcy5wYXJhbXMgPSBbXTtcbiAgLyoqXG4gICAqIFRpbWUgdW50aWwgZXhwaXJhdGlvbiBpbiBkYXlzIChWMyBvbmx5KVxuICAgKiBAdHlwZSB7SW50ZWdlcn1cbiAgICovXG4gIHRoaXMuZXhwaXJhdGlvblRpbWVWMyA9IDA7XG4gIC8qKlxuICAgKiBGaW5nZXJwcmludCBpbiBsb3dlcmNhc2UgaGV4XG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICB0aGlzLmZpbmdlcnByaW50ID0gbnVsbDtcbiAgLyoqXG4gICAqIEtleWlkXG4gICAqIEB0eXBlIHttb2R1bGU6dHlwZS9rZXlpZH1cbiAgICovXG4gIHRoaXMua2V5aWQgPSBudWxsO1xufVxuXG4vKipcbiAqIEludGVybmFsIFBhcnNlciBmb3IgcHVibGljIGtleXMgYXMgc3BlY2lmaWVkIGluIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTUuNS4yfFJGQyA0ODgwIHNlY3Rpb24gNS41LjIgUHVibGljLUtleSBQYWNrZXQgRm9ybWF0c31cbiAqIGNhbGxlZCBieSByZWFkX3RhZyZsdDtudW0mZ3Q7XG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzIElucHV0IGFycmF5IHRvIHJlYWQgdGhlIHBhY2tldCBmcm9tXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGlzIG9iamVjdCB3aXRoIGF0dHJpYnV0ZXMgc2V0IGJ5IHRoZSBwYXJzZXJcbiAqL1xuUHVibGljS2V5LnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gIHZhciBwb3MgPSAwO1xuICAvLyBBIG9uZS1vY3RldCB2ZXJzaW9uIG51bWJlciAoMywgNCBvciA1KS5cbiAgdGhpcy52ZXJzaW9uID0gYnl0ZXNbcG9zKytdO1xuXG4gIGlmICh0aGlzLnZlcnNpb24gPT09IDMgfHwgdGhpcy52ZXJzaW9uID09PSA0IHx8IHRoaXMudmVyc2lvbiA9PT0gNSkge1xuICAgIC8vIC0gQSBmb3VyLW9jdGV0IG51bWJlciBkZW5vdGluZyB0aGUgdGltZSB0aGF0IHRoZSBrZXkgd2FzIGNyZWF0ZWQuXG4gICAgdGhpcy5jcmVhdGVkID0gX3V0aWwyLmRlZmF1bHQucmVhZERhdGUoYnl0ZXMuc3ViYXJyYXkocG9zLCBwb3MgKyA0KSk7XG4gICAgcG9zICs9IDQ7XG5cbiAgICBpZiAodGhpcy52ZXJzaW9uID09PSAzKSB7XG4gICAgICAvLyAtIEEgdHdvLW9jdGV0IG51bWJlciBkZW5vdGluZyB0aGUgdGltZSBpbiBkYXlzIHRoYXQgdGhpcyBrZXkgaXNcbiAgICAgIC8vICAgdmFsaWQuICBJZiB0aGlzIG51bWJlciBpcyB6ZXJvLCB0aGVuIGl0IGRvZXMgbm90IGV4cGlyZS5cbiAgICAgIHRoaXMuZXhwaXJhdGlvblRpbWVWMyA9IF91dGlsMi5kZWZhdWx0LnJlYWROdW1iZXIoYnl0ZXMuc3ViYXJyYXkocG9zLCBwb3MgKyAyKSk7XG4gICAgICBwb3MgKz0gMjtcbiAgICB9XG5cbiAgICAvLyAtIEEgb25lLW9jdGV0IG51bWJlciBkZW5vdGluZyB0aGUgcHVibGljLWtleSBhbGdvcml0aG0gb2YgdGhpcyBrZXkuXG4gICAgdGhpcy5hbGdvcml0aG0gPSBfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LCBieXRlc1twb3MrK10pO1xuICAgIHZhciBhbGdvID0gX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXksIHRoaXMuYWxnb3JpdGhtKTtcblxuICAgIGlmICh0aGlzLnZlcnNpb24gPT09IDUpIHtcbiAgICAgIC8vIC0gQSBmb3VyLW9jdGV0IHNjYWxhciBvY3RldCBjb3VudCBmb3IgdGhlIGZvbGxvd2luZyBrZXkgbWF0ZXJpYWwuXG4gICAgICBwb3MgKz0gNDtcbiAgICB9XG5cbiAgICAvLyAtIEEgc2VyaWVzIG9mIHZhbHVlcyBjb21wcmlzaW5nIHRoZSBrZXkgbWF0ZXJpYWwuICBUaGlzIGlzXG4gICAgLy8gICBhbGdvcml0aG0tc3BlY2lmaWMgYW5kIGRlc2NyaWJlZCBpbiBzZWN0aW9uIFhYWFguXG4gICAgdmFyIHR5cGVzID0gX2NyeXB0bzIuZGVmYXVsdC5nZXRQdWJLZXlQYXJhbVR5cGVzKGFsZ28pO1xuICAgIHRoaXMucGFyYW1zID0gX2NyeXB0bzIuZGVmYXVsdC5jb25zdHJ1Y3RQYXJhbXModHlwZXMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGggJiYgcG9zIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBvcyArPSB0aGlzLnBhcmFtc1tpXS5yZWFkKGJ5dGVzLnN1YmFycmF5KHBvcywgYnl0ZXMubGVuZ3RoKSk7XG4gICAgICBpZiAocG9zID4gYnl0ZXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgcmVhZGluZyBNUEkgQDonICsgcG9zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcG9zO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignVmVyc2lvbiAnICsgdGhpcy52ZXJzaW9uICsgJyBvZiB0aGUga2V5IHBhY2tldCBpcyB1bnN1cHBvcnRlZC4nKTtcbn07XG5cbi8qKlxuICogQWxpYXMgb2YgcmVhZCgpXG4gKiBAc2VlIG1vZHVsZTpwYWNrZXQuUHVibGljS2V5I3JlYWRcbiAqL1xuUHVibGljS2V5LnByb3RvdHlwZS5yZWFkUHVibGljS2V5ID0gUHVibGljS2V5LnByb3RvdHlwZS5yZWFkO1xuXG4vKipcbiAqIFNhbWUgYXMgd3JpdGVfcHJpdmF0ZV9rZXksIGJ1dCBoYXMgbGVzcyBpbmZvcm1hdGlvbiBiZWNhdXNlIG9mXG4gKiBwdWJsaWMga2V5LlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IE9wZW5QR1AgcGFja2V0IGJvZHkgY29udGVudHMsXG4gKi9cblB1YmxpY0tleS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhcnIgPSBbXTtcbiAgLy8gVmVyc2lvblxuICBhcnIucHVzaChuZXcgVWludDhBcnJheShbdGhpcy52ZXJzaW9uXSkpO1xuICBhcnIucHVzaChfdXRpbDIuZGVmYXVsdC53cml0ZURhdGUodGhpcy5jcmVhdGVkKSk7XG4gIGlmICh0aGlzLnZlcnNpb24gPT09IDMpIHtcbiAgICBhcnIucHVzaChfdXRpbDIuZGVmYXVsdC53cml0ZU51bWJlcih0aGlzLmV4cGlyYXRpb25UaW1lVjMsIDIpKTtcbiAgfVxuICAvLyBBIG9uZS1vY3RldCBudW1iZXIgZGVub3RpbmcgdGhlIHB1YmxpYy1rZXkgYWxnb3JpdGhtIG9mIHRoaXMga2V5XG4gIHZhciBhbGdvID0gX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXksIHRoaXMuYWxnb3JpdGhtKTtcbiAgYXJyLnB1c2gobmV3IFVpbnQ4QXJyYXkoW2FsZ29dKSk7XG5cbiAgdmFyIHBhcmFtQ291bnQgPSBfY3J5cHRvMi5kZWZhdWx0LmdldFB1YktleVBhcmFtVHlwZXMoYWxnbykubGVuZ3RoO1xuICB2YXIgcGFyYW1zID0gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheSh0aGlzLnBhcmFtcy5zbGljZSgwLCBwYXJhbUNvdW50KS5tYXAoZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgcmV0dXJuIHBhcmFtLndyaXRlKCk7XG4gIH0pKTtcbiAgaWYgKHRoaXMudmVyc2lvbiA9PT0gNSkge1xuICAgIC8vIEEgZm91ci1vY3RldCBzY2FsYXIgb2N0ZXQgY291bnQgZm9yIHRoZSBmb2xsb3dpbmcga2V5IG1hdGVyaWFsXG4gICAgYXJyLnB1c2goX3V0aWwyLmRlZmF1bHQud3JpdGVOdW1iZXIocGFyYW1zLmxlbmd0aCwgNCkpO1xuICB9XG4gIC8vIEFsZ29yaXRobS1zcGVjaWZpYyBwYXJhbXNcbiAgYXJyLnB1c2gocGFyYW1zKTtcbiAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoYXJyKTtcbn07XG5cbi8qKlxuICogQWxpYXMgb2Ygd3JpdGUoKVxuICogQHNlZSBtb2R1bGU6cGFja2V0LlB1YmxpY0tleSN3cml0ZVxuICovXG5QdWJsaWNLZXkucHJvdG90eXBlLndyaXRlUHVibGljS2V5ID0gUHVibGljS2V5LnByb3RvdHlwZS53cml0ZTtcblxuLyoqXG4gKiBXcml0ZSBhbiBvbGQgdmVyc2lvbiBwYWNrZXQgLSBpdCdzIHVzZWQgYnkgc29tZSBvZiB0aGUgaW50ZXJuYWwgcm91dGluZXMuXG4gKi9cblB1YmxpY0tleS5wcm90b3R5cGUud3JpdGVPbGQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBieXRlcyA9IHRoaXMud3JpdGVQdWJsaWNLZXkoKTtcblxuICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbbmV3IFVpbnQ4QXJyYXkoWzB4OTldKSwgX3V0aWwyLmRlZmF1bHQud3JpdGVOdW1iZXIoYnl0ZXMubGVuZ3RoLCAyKSwgYnl0ZXNdKTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUga2V5IGlkIG9mIHRoZSBrZXlcbiAqIEByZXR1cm5zIHtTdHJpbmd9IEEgOCBieXRlIGtleSBpZFxuICovXG5QdWJsaWNLZXkucHJvdG90eXBlLmdldEtleUlkID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5rZXlpZCkge1xuICAgIHJldHVybiB0aGlzLmtleWlkO1xuICB9XG4gIHRoaXMua2V5aWQgPSBuZXcgX2tleWlkMi5kZWZhdWx0KCk7XG4gIGlmICh0aGlzLnZlcnNpb24gPT09IDUpIHtcbiAgICB0aGlzLmtleWlkLnJlYWQoX3V0aWwyLmRlZmF1bHQuaGV4X3RvX1VpbnQ4QXJyYXkodGhpcy5nZXRGaW5nZXJwcmludCgpKS5zdWJhcnJheSgwLCA4KSk7XG4gIH0gZWxzZSBpZiAodGhpcy52ZXJzaW9uID09PSA0KSB7XG4gICAgdGhpcy5rZXlpZC5yZWFkKF91dGlsMi5kZWZhdWx0LmhleF90b19VaW50OEFycmF5KHRoaXMuZ2V0RmluZ2VycHJpbnQoKSkuc3ViYXJyYXkoMTIsIDIwKSk7XG4gIH0gZWxzZSBpZiAodGhpcy52ZXJzaW9uID09PSAzKSB7XG4gICAgdmFyIGFyciA9IHRoaXMucGFyYW1zWzBdLndyaXRlKCk7XG4gICAgdGhpcy5rZXlpZC5yZWFkKGFyci5zdWJhcnJheShhcnIubGVuZ3RoIC0gOCwgYXJyLmxlbmd0aCkpO1xuICB9XG4gIHJldHVybiB0aGlzLmtleWlkO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBmaW5nZXJwcmludCBvZiB0aGUga2V5XG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gQSBVaW50OEFycmF5IGNvbnRhaW5pbmcgdGhlIGZpbmdlcnByaW50XG4gKi9cblB1YmxpY0tleS5wcm90b3R5cGUuZ2V0RmluZ2VycHJpbnRCeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZmluZ2VycHJpbnQpIHtcbiAgICByZXR1cm4gdGhpcy5maW5nZXJwcmludDtcbiAgfVxuICB2YXIgdG9IYXNoID0gdm9pZCAwO1xuICBpZiAodGhpcy52ZXJzaW9uID09PSA1KSB7XG4gICAgdmFyIGJ5dGVzID0gdGhpcy53cml0ZVB1YmxpY0tleSgpO1xuICAgIHRvSGFzaCA9IF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW25ldyBVaW50OEFycmF5KFsweDlBXSksIF91dGlsMi5kZWZhdWx0LndyaXRlTnVtYmVyKGJ5dGVzLmxlbmd0aCwgNCksIGJ5dGVzXSk7XG4gICAgdGhpcy5maW5nZXJwcmludCA9IF9jcnlwdG8yLmRlZmF1bHQuaGFzaC5zaGEyNTYodG9IYXNoKTtcbiAgfSBlbHNlIGlmICh0aGlzLnZlcnNpb24gPT09IDQpIHtcbiAgICB0b0hhc2ggPSB0aGlzLndyaXRlT2xkKCk7XG4gICAgdGhpcy5maW5nZXJwcmludCA9IF9jcnlwdG8yLmRlZmF1bHQuaGFzaC5zaGExKHRvSGFzaCk7XG4gIH0gZWxzZSBpZiAodGhpcy52ZXJzaW9uID09PSAzKSB7XG4gICAgdmFyIGFsZ28gPSBfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleSwgdGhpcy5hbGdvcml0aG0pO1xuICAgIHZhciBwYXJhbUNvdW50ID0gX2NyeXB0bzIuZGVmYXVsdC5nZXRQdWJLZXlQYXJhbVR5cGVzKGFsZ28pLmxlbmd0aDtcbiAgICB0b0hhc2ggPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtQ291bnQ7IGkrKykge1xuICAgICAgdG9IYXNoICs9IHRoaXMucGFyYW1zW2ldLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHRoaXMuZmluZ2VycHJpbnQgPSBfY3J5cHRvMi5kZWZhdWx0Lmhhc2gubWQ1KF91dGlsMi5kZWZhdWx0LnN0cl90b19VaW50OEFycmF5KHRvSGFzaCkpO1xuICB9XG4gIHJldHVybiB0aGlzLmZpbmdlcnByaW50O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBmaW5nZXJwcmludCBvZiB0aGUga2V5XG4gKiBAcmV0dXJucyB7U3RyaW5nfSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaW5nZXJwcmludCBpbiBsb3dlcmNhc2UgaGV4XG4gKi9cblB1YmxpY0tleS5wcm90b3R5cGUuZ2V0RmluZ2VycHJpbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX2hleCh0aGlzLmdldEZpbmdlcnByaW50Qnl0ZXMoKSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYWxnb3JpdGhtIGluZm9ybWF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBBbiBvYmplY3Qgb2YgdGhlIGZvcm0ge2FsZ29yaXRobTogU3RyaW5nLCBiaXRzOmludCwgY3VydmU6U3RyaW5nfVxuICovXG5QdWJsaWNLZXkucHJvdG90eXBlLmdldEFsZ29yaXRobUluZm8gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgcmVzdWx0LmFsZ29yaXRobSA9IHRoaXMuYWxnb3JpdGhtO1xuICBpZiAodGhpcy5wYXJhbXNbMF0gaW5zdGFuY2VvZiBfbXBpMi5kZWZhdWx0KSB7XG4gICAgcmVzdWx0LmJpdHMgPSB0aGlzLnBhcmFtc1swXS5ieXRlTGVuZ3RoKCkgKiA4O1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdC5jdXJ2ZSA9IHRoaXMucGFyYW1zWzBdLmdldE5hbWUoKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBGaXggY3VzdG9tIHR5cGVzIGFmdGVyIGNsb25pbmdcbiAqL1xuUHVibGljS2V5LnByb3RvdHlwZS5wb3N0Q2xvbmVUeXBlRml4ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYWxnbyA9IF9lbnVtczIuZGVmYXVsdC53cml0ZShfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LCB0aGlzLmFsZ29yaXRobSk7XG4gIHZhciB0eXBlcyA9IF9jcnlwdG8yLmRlZmF1bHQuZ2V0UHViS2V5UGFyYW1UeXBlcyhhbGdvKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW2ldO1xuICAgIHRoaXMucGFyYW1zW2ldID0gdHlwZXNbaV0uZnJvbUNsb25lKHBhcmFtKTtcbiAgfVxuICBpZiAodGhpcy5rZXlpZCkge1xuICAgIHRoaXMua2V5aWQgPSBfa2V5aWQyLmRlZmF1bHQuZnJvbUNsb25lKHRoaXMua2V5aWQpO1xuICB9XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBQdWJsaWNLZXk7XG5cbn0se1wiLi4vY29uZmlnXCI6MzI1LFwiLi4vY3J5cHRvXCI6MzQwLFwiLi4vZW51bXNcIjozNTksXCIuLi90eXBlL2tleWlkXCI6Mzk0LFwiLi4vdHlwZS9tcGlcIjozOTUsXCIuLi91dGlsXCI6Mzk4fV0sMzc4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3InKTtcblxudmFyIF9yZWdlbmVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWdlbmVyYXRvcik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvcicpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXN5bmNUb0dlbmVyYXRvcjIpO1xuXG52YXIgX2tleWlkID0gX2RlcmVxXygnLi4vdHlwZS9rZXlpZCcpO1xuXG52YXIgX2tleWlkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2tleWlkKTtcblxudmFyIF9tcGkgPSBfZGVyZXFfKCcuLi90eXBlL21waScpO1xuXG52YXIgX21waTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9tcGkpO1xuXG52YXIgX2NyeXB0byA9IF9kZXJlcV8oJy4uL2NyeXB0bycpO1xuXG52YXIgX2NyeXB0bzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcnlwdG8pO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vZW51bXMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIFB1YmxpYy1LZXkgRW5jcnlwdGVkIFNlc3Npb24gS2V5IFBhY2tldHMgKFRhZyAxKVxuICpcbiAqIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTUuMXxSRkM0ODgwIDUuMX06XG4gKiBBIFB1YmxpYy1LZXkgRW5jcnlwdGVkIFNlc3Npb24gS2V5IHBhY2tldCBob2xkcyB0aGUgc2Vzc2lvbiBrZXlcbiAqIHVzZWQgdG8gZW5jcnlwdCBhIG1lc3NhZ2UuIFplcm8gb3IgbW9yZSBQdWJsaWMtS2V5IEVuY3J5cHRlZCBTZXNzaW9uIEtleVxuICogcGFja2V0cyBhbmQvb3IgU3ltbWV0cmljLUtleSBFbmNyeXB0ZWQgU2Vzc2lvbiBLZXkgcGFja2V0cyBtYXkgcHJlY2VkZSBhXG4gKiBTeW1tZXRyaWNhbGx5IEVuY3J5cHRlZCBEYXRhIFBhY2tldCwgd2hpY2ggaG9sZHMgYW4gZW5jcnlwdGVkIG1lc3NhZ2UuIFRoZVxuICogbWVzc2FnZSBpcyBlbmNyeXB0ZWQgd2l0aCB0aGUgc2Vzc2lvbiBrZXksIGFuZCB0aGUgc2Vzc2lvbiBrZXkgaXMgaXRzZWxmXG4gKiBlbmNyeXB0ZWQgYW5kIHN0b3JlZCBpbiB0aGUgRW5jcnlwdGVkIFNlc3Npb24gS2V5IHBhY2tldChzKS4gVGhlXG4gKiBTeW1tZXRyaWNhbGx5IEVuY3J5cHRlZCBEYXRhIFBhY2tldCBpcyBwcmVjZWRlZCBieSBvbmUgUHVibGljLUtleSBFbmNyeXB0ZWRcbiAqIFNlc3Npb24gS2V5IHBhY2tldCBmb3IgZWFjaCBPcGVuUEdQIGtleSB0byB3aGljaCB0aGUgbWVzc2FnZSBpcyBlbmNyeXB0ZWQuXG4gKiBUaGUgcmVjaXBpZW50IG9mIHRoZSBtZXNzYWdlIGZpbmRzIGEgc2Vzc2lvbiBrZXkgdGhhdCBpcyBlbmNyeXB0ZWQgdG8gdGhlaXJcbiAqIHB1YmxpYyBrZXksIGRlY3J5cHRzIHRoZSBzZXNzaW9uIGtleSwgYW5kIHRoZW4gdXNlcyB0aGUgc2Vzc2lvbiBrZXkgdG9cbiAqIGRlY3J5cHQgdGhlIG1lc3NhZ2UuXG4gKiBAbWVtYmVyb2YgbW9kdWxlOnBhY2tldFxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFB1YmxpY0tleUVuY3J5cHRlZFNlc3Npb25LZXkoKSB7XG4gIHRoaXMudGFnID0gX2VudW1zMi5kZWZhdWx0LnBhY2tldC5wdWJsaWNLZXlFbmNyeXB0ZWRTZXNzaW9uS2V5O1xuICB0aGlzLnZlcnNpb24gPSAzO1xuXG4gIHRoaXMucHVibGljS2V5SWQgPSBuZXcgX2tleWlkMi5kZWZhdWx0KCk7XG4gIHRoaXMuc2Vzc2lvbktleSA9IG51bGw7XG5cbiAgLyoqIEB0eXBlIHtBcnJheTxtb2R1bGU6dHlwZS9tcGk+fSAqL1xuICB0aGlzLmVuY3J5cHRlZCA9IFtdO1xufVxuXG4vKipcbiAqIFBhcnNpbmcgZnVuY3Rpb24gZm9yIGEgcHVibGlja2V5IGVuY3J5cHRlZCBzZXNzaW9uIGtleSBwYWNrZXQgKHRhZyAxKS5cbiAqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGlucHV0IFBheWxvYWQgb2YgYSB0YWcgMSBwYWNrZXRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24gUG9zaXRpb24gdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJpbmdcbiAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuIExlbmd0aCBvZiB0aGUgcGFja2V0IG9yIHRoZSByZW1haW5pbmcgbGVuZ3RoIG9mXG4gKiAgICAgICAgICAgIGlucHV0IGF0IHBvc2l0aW9uXG4gKiBAcmV0dXJucyB7bW9kdWxlOnBhY2tldC5QdWJsaWNLZXlFbmNyeXB0ZWRTZXNzaW9uS2V5fSBPYmplY3QgcmVwcmVzZW50YXRpb25cbiAqL1xuLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAcmVxdWlyZXMgdHlwZS9rZXlpZFxuICogQHJlcXVpcmVzIHR5cGUvbXBpXG4gKiBAcmVxdWlyZXMgY3J5cHRvXG4gKiBAcmVxdWlyZXMgZW51bXNcbiAqIEByZXF1aXJlcyB1dGlsXG4gKi9cblxuUHVibGljS2V5RW5jcnlwdGVkU2Vzc2lvbktleS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChieXRlcykge1xuICB0aGlzLnZlcnNpb24gPSBieXRlc1swXTtcbiAgdGhpcy5wdWJsaWNLZXlJZC5yZWFkKGJ5dGVzLnN1YmFycmF5KDEsIGJ5dGVzLmxlbmd0aCkpO1xuICB0aGlzLnB1YmxpY0tleUFsZ29yaXRobSA9IF9lbnVtczIuZGVmYXVsdC5yZWFkKF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXksIGJ5dGVzWzldKTtcblxuICB2YXIgaSA9IDEwO1xuXG4gIHZhciBhbGdvID0gX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXksIHRoaXMucHVibGljS2V5QWxnb3JpdGhtKTtcbiAgdmFyIHR5cGVzID0gX2NyeXB0bzIuZGVmYXVsdC5nZXRFbmNTZXNzaW9uS2V5UGFyYW1UeXBlcyhhbGdvKTtcbiAgdGhpcy5lbmNyeXB0ZWQgPSBfY3J5cHRvMi5kZWZhdWx0LmNvbnN0cnVjdFBhcmFtcyh0eXBlcyk7XG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCB0eXBlcy5sZW5ndGg7IGorKykge1xuICAgIGkgKz0gdGhpcy5lbmNyeXB0ZWRbal0ucmVhZChieXRlcy5zdWJhcnJheShpLCBieXRlcy5sZW5ndGgpKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB0YWcgMSBwYWNrZXRcbiAqXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gVGhlIFVpbnQ4QXJyYXkgcmVwcmVzZW50YXRpb25cbiAqL1xuUHVibGljS2V5RW5jcnlwdGVkU2Vzc2lvbktleS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhcnIgPSBbbmV3IFVpbnQ4QXJyYXkoW3RoaXMudmVyc2lvbl0pLCB0aGlzLnB1YmxpY0tleUlkLndyaXRlKCksIG5ldyBVaW50OEFycmF5KFtfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleSwgdGhpcy5wdWJsaWNLZXlBbGdvcml0aG0pXSldO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbmNyeXB0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBhcnIucHVzaCh0aGlzLmVuY3J5cHRlZFtpXS53cml0ZSgpKTtcbiAgfVxuXG4gIHJldHVybiBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KGFycik7XG59O1xuXG4vKipcbiAqIEVuY3J5cHQgc2Vzc2lvbiBrZXkgcGFja2V0XG4gKiBAcGFyYW0ge21vZHVsZTpwYWNrZXQuUHVibGljS2V5fSBrZXkgUHVibGljIGtleVxuICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59XG4gKiBAYXN5bmNcbiAqL1xuUHVibGljS2V5RW5jcnlwdGVkU2Vzc2lvbktleS5wcm90b3R5cGUuZW5jcnlwdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZShrZXkpIHtcbiAgICB2YXIgZGF0YSwgY2hlY2tzdW0sIHRvRW5jcnlwdCwgYWxnbztcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBkYXRhID0gU3RyaW5nLmZyb21DaGFyQ29kZShfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LnN5bW1ldHJpYywgdGhpcy5zZXNzaW9uS2V5QWxnb3JpdGhtKSk7XG5cblxuICAgICAgICAgICAgZGF0YSArPSBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cih0aGlzLnNlc3Npb25LZXkpO1xuICAgICAgICAgICAgY2hlY2tzdW0gPSBfdXRpbDIuZGVmYXVsdC5jYWxjX2NoZWNrc3VtKHRoaXMuc2Vzc2lvbktleSk7XG5cbiAgICAgICAgICAgIGRhdGEgKz0gX3V0aWwyLmRlZmF1bHQuVWludDhBcnJheV90b19zdHIoX3V0aWwyLmRlZmF1bHQud3JpdGVOdW1iZXIoY2hlY2tzdW0sIDIpKTtcblxuICAgICAgICAgICAgdG9FbmNyeXB0ID0gdm9pZCAwO1xuICAgICAgICAgICAgYWxnbyA9IF9lbnVtczIuZGVmYXVsdC53cml0ZShfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LCB0aGlzLnB1YmxpY0tleUFsZ29yaXRobSk7XG5cbiAgICAgICAgICAgIGlmICghKGFsZ28gPT09IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkaCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG9FbmNyeXB0ID0gbmV3IF9tcGkyLmRlZmF1bHQoX2NyeXB0bzIuZGVmYXVsdC5wa2NzNS5lbmNvZGUoZGF0YSkpO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE1O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgX2NvbnRleHQudDAgPSBfbXBpMi5kZWZhdWx0O1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzO1xuICAgICAgICAgICAgcmV0dXJuIF9jcnlwdG8yLmRlZmF1bHQucGtjczEuZW1lLmVuY29kZShkYXRhLCBrZXkucGFyYW1zWzBdLmJ5dGVMZW5ndGgoKSk7XG5cbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgX2NvbnRleHQudDEgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgdG9FbmNyeXB0ID0gbmV3IF9jb250ZXh0LnQwKF9jb250ZXh0LnQxKTtcblxuICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTc7XG4gICAgICAgICAgICByZXR1cm4gX2NyeXB0bzIuZGVmYXVsdC5wdWJsaWNLZXlFbmNyeXB0KGFsZ28sIGtleS5wYXJhbXMsIHRvRW5jcnlwdCwga2V5LmdldEZpbmdlcnByaW50Qnl0ZXMoKSk7XG5cbiAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgdGhpcy5lbmNyeXB0ZWQgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgncmV0dXJuJywgdHJ1ZSk7XG5cbiAgICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94KSB7XG4gICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBEZWNyeXB0cyB0aGUgc2Vzc2lvbiBrZXkgKG9ubHkgZm9yIHB1YmxpYyBrZXkgZW5jcnlwdGVkIHNlc3Npb24ga2V5XG4gKiBwYWNrZXRzICh0YWcgMSlcbiAqXG4gKiBAcGFyYW0ge21vZHVsZTpwYWNrZXQuU2VjcmV0S2V5fSBrZXlcbiAqICAgICAgICAgICAgUHJpdmF0ZSBrZXkgd2l0aCBzZWNyZXQgcGFyYW1zIHVubG9ja2VkXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn1cbiAqIEBhc3luY1xuICovXG5QdWJsaWNLZXlFbmNyeXB0ZWRTZXNzaW9uS2V5LnByb3RvdHlwZS5kZWNyeXB0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjIgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoa2V5KSB7XG4gICAgdmFyIGFsZ28sIHJlc3VsdCwgY2hlY2tzdW0sIGRlY29kZWQ7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGFsZ28gPSBfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleSwgdGhpcy5wdWJsaWNLZXlBbGdvcml0aG0pO1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzO1xuICAgICAgICAgICAgcmV0dXJuIF9jcnlwdG8yLmRlZmF1bHQucHVibGljS2V5RGVjcnlwdChhbGdvLCBrZXkucGFyYW1zLCB0aGlzLmVuY3J5cHRlZCwga2V5LmdldEZpbmdlcnByaW50Qnl0ZXMoKSk7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXN1bHQgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgIGNoZWNrc3VtID0gdm9pZCAwO1xuICAgICAgICAgICAgZGVjb2RlZCA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKGFsZ28gPT09IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkaCkge1xuICAgICAgICAgICAgICBkZWNvZGVkID0gX2NyeXB0bzIuZGVmYXVsdC5wa2NzNS5kZWNvZGUocmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICBjaGVja3N1bSA9IF91dGlsMi5kZWZhdWx0LnJlYWROdW1iZXIoX3V0aWwyLmRlZmF1bHQuc3RyX3RvX1VpbnQ4QXJyYXkoZGVjb2RlZC5zdWJzdHIoZGVjb2RlZC5sZW5ndGggLSAyKSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVjb2RlZCA9IF9jcnlwdG8yLmRlZmF1bHQucGtjczEuZW1lLmRlY29kZShyZXN1bHQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgIGNoZWNrc3VtID0gX3V0aWwyLmRlZmF1bHQucmVhZE51bWJlcihyZXN1bHQudG9VaW50OEFycmF5KCkuc2xpY2UocmVzdWx0LmJ5dGVMZW5ndGgoKSAtIDIpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAga2V5ID0gX3V0aWwyLmRlZmF1bHQuc3RyX3RvX1VpbnQ4QXJyYXkoZGVjb2RlZC5zdWJzdHJpbmcoMSwgZGVjb2RlZC5sZW5ndGggLSAyKSk7XG5cbiAgICAgICAgICAgIGlmICghKGNoZWNrc3VtICE9PSBfdXRpbDIuZGVmYXVsdC5jYWxjX2NoZWNrc3VtKGtleSkpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrc3VtIG1pc21hdGNoJyk7XG5cbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uS2V5ID0ga2V5O1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uS2V5QWxnb3JpdGhtID0gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LnN5bW1ldHJpYywgZGVjb2RlZC5jaGFyQ29kZUF0KDApKTtcblxuICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywgdHJ1ZSk7XG5cbiAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3gyKSB7XG4gICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogRml4IGN1c3RvbSB0eXBlcyBhZnRlciBjbG9uaW5nXG4gKi9cblB1YmxpY0tleUVuY3J5cHRlZFNlc3Npb25LZXkucHJvdG90eXBlLnBvc3RDbG9uZVR5cGVGaXggPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucHVibGljS2V5SWQgPSBfa2V5aWQyLmRlZmF1bHQuZnJvbUNsb25lKHRoaXMucHVibGljS2V5SWQpO1xuICB2YXIgYWxnbyA9IF9lbnVtczIuZGVmYXVsdC53cml0ZShfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LCB0aGlzLnB1YmxpY0tleUFsZ29yaXRobSk7XG4gIHZhciB0eXBlcyA9IF9jcnlwdG8yLmRlZmF1bHQuZ2V0RW5jU2Vzc2lvbktleVBhcmFtVHlwZXMoYWxnbyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbmNyeXB0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLmVuY3J5cHRlZFtpXSA9IHR5cGVzW2ldLmZyb21DbG9uZSh0aGlzLmVuY3J5cHRlZFtpXSk7XG4gIH1cbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFB1YmxpY0tleUVuY3J5cHRlZFNlc3Npb25LZXk7XG5cbn0se1wiLi4vY3J5cHRvXCI6MzQwLFwiLi4vZW51bXNcIjozNTksXCIuLi90eXBlL2tleWlkXCI6Mzk0LFwiLi4vdHlwZS9tcGlcIjozOTUsXCIuLi91dGlsXCI6Mzk4LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjozNSxcImJhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3JcIjo0Mn1dLDM3OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcHVibGljX2tleSA9IF9kZXJlcV8oJy4vcHVibGljX2tleScpO1xuXG52YXIgX3B1YmxpY19rZXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHVibGljX2tleSk7XG5cbnZhciBfZW51bXMgPSBfZGVyZXFfKCcuLi9lbnVtcycpO1xuXG52YXIgX2VudW1zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VudW1zKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBBIFB1YmxpYy1TdWJrZXkgcGFja2V0ICh0YWcgMTQpIGhhcyBleGFjdGx5IHRoZSBzYW1lIGZvcm1hdCBhcyBhXG4gKiBQdWJsaWMtS2V5IHBhY2tldCwgYnV0IGRlbm90ZXMgYSBzdWJrZXkuICBPbmUgb3IgbW9yZSBzdWJrZXlzIG1heSBiZVxuICogYXNzb2NpYXRlZCB3aXRoIGEgdG9wLWxldmVsIGtleS4gIEJ5IGNvbnZlbnRpb24sIHRoZSB0b3AtbGV2ZWwga2V5XG4gKiBwcm92aWRlcyBzaWduYXR1cmUgc2VydmljZXMsIGFuZCB0aGUgc3Via2V5cyBwcm92aWRlIGVuY3J5cHRpb25cbiAqIHNlcnZpY2VzLlxuICogQG1lbWJlcm9mIG1vZHVsZTpwYWNrZXRcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgbW9kdWxlOnBhY2tldC5QdWJsaWNLZXlcbiAqL1xuLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAcmVxdWlyZXMgcGFja2V0L3B1YmxpY19rZXlcbiAqIEByZXF1aXJlcyBlbnVtc1xuICovXG5cbmZ1bmN0aW9uIFB1YmxpY1N1YmtleSgpIHtcbiAgX3B1YmxpY19rZXkyLmRlZmF1bHQuY2FsbCh0aGlzKTtcbiAgdGhpcy50YWcgPSBfZW51bXMyLmRlZmF1bHQucGFja2V0LnB1YmxpY1N1YmtleTtcbn1cblxuUHVibGljU3Via2V5LnByb3RvdHlwZSA9IG5ldyBfcHVibGljX2tleTIuZGVmYXVsdCgpO1xuUHVibGljU3Via2V5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFB1YmxpY1N1YmtleTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gUHVibGljU3Via2V5O1xuXG59LHtcIi4uL2VudW1zXCI6MzU5LFwiLi9wdWJsaWNfa2V5XCI6Mzc3fV0sMzgwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3InKTtcblxudmFyIF9yZWdlbmVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWdlbmVyYXRvcik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvcicpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXN5bmNUb0dlbmVyYXRvcjIpO1xuXG52YXIgX3B1YmxpY19rZXkgPSBfZGVyZXFfKCcuL3B1YmxpY19rZXknKTtcblxudmFyIF9wdWJsaWNfa2V5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3B1YmxpY19rZXkpO1xuXG52YXIgX2tleWlkID0gX2RlcmVxXygnLi4vdHlwZS9rZXlpZC5qcycpO1xuXG52YXIgX2tleWlkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2tleWlkKTtcblxudmFyIF9zMmsgPSBfZGVyZXFfKCcuLi90eXBlL3MyaycpO1xuXG52YXIgX3MyazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zMmspO1xuXG52YXIgX2NyeXB0byA9IF9kZXJlcV8oJy4uL2NyeXB0bycpO1xuXG52YXIgX2NyeXB0bzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcnlwdG8pO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vZW51bXMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEEgU2VjcmV0LUtleSBwYWNrZXQgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGlzIGZvdW5kIGluIGFcbiAqIFB1YmxpYy1LZXkgcGFja2V0LCBpbmNsdWRpbmcgdGhlIHB1YmxpYy1rZXkgbWF0ZXJpYWwsIGJ1dCBhbHNvXG4gKiBpbmNsdWRlcyB0aGUgc2VjcmV0LWtleSBtYXRlcmlhbCBhZnRlciBhbGwgdGhlIHB1YmxpYy1rZXkgZmllbGRzLlxuICogQG1lbWJlcm9mIG1vZHVsZTpwYWNrZXRcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgbW9kdWxlOnBhY2tldC5QdWJsaWNLZXlcbiAqL1xuLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAcmVxdWlyZXMgcGFja2V0L3B1YmxpY19rZXlcbiAqIEByZXF1aXJlcyB0eXBlL2tleWlkXG4gKiBAcmVxdWlyZXMgdHlwZS9zMmtcbiAqIEByZXF1aXJlcyBjcnlwdG9cbiAqIEByZXF1aXJlcyBlbnVtc1xuICogQHJlcXVpcmVzIHV0aWxcbiAqL1xuXG5mdW5jdGlvbiBTZWNyZXRLZXkoKSB7XG4gIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBuZXcgRGF0ZSgpO1xuXG4gIF9wdWJsaWNfa2V5Mi5kZWZhdWx0LmNhbGwodGhpcywgZGF0ZSk7XG4gIC8qKlxuICAgKiBQYWNrZXQgdHlwZVxuICAgKiBAdHlwZSB7bW9kdWxlOmVudW1zLnBhY2tldH1cbiAgICovXG4gIHRoaXMudGFnID0gX2VudW1zMi5kZWZhdWx0LnBhY2tldC5zZWNyZXRLZXk7XG4gIC8qKlxuICAgKiBFbmNyeXB0ZWQgc2VjcmV0LWtleSBkYXRhXG4gICAqL1xuICB0aGlzLmVuY3J5cHRlZCA9IG51bGw7XG4gIC8qKlxuICAgKiBJbmRpY2F0b3IgaWYgc2VjcmV0LWtleSBkYXRhIGlzIGF2YWlsYWJsZSBpbiBkZWNyeXB0ZWQgZm9ybVxuICAgKi9cbiAgdGhpcy5pc0RlY3J5cHRlZCA9IGZhbHNlO1xufVxuXG5TZWNyZXRLZXkucHJvdG90eXBlID0gbmV3IF9wdWJsaWNfa2V5Mi5kZWZhdWx0KCk7XG5TZWNyZXRLZXkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2VjcmV0S2V5O1xuXG5mdW5jdGlvbiBnZXRfaGFzaF9sZW4oaGFzaCkge1xuICBpZiAoaGFzaCA9PT0gJ3NoYTEnKSB7XG4gICAgcmV0dXJuIDIwO1xuICB9XG4gIHJldHVybiAyO1xufVxuXG5mdW5jdGlvbiBnZXRfaGFzaF9mbihoYXNoKSB7XG4gIGlmIChoYXNoID09PSAnc2hhMScpIHtcbiAgICByZXR1cm4gX2NyeXB0bzIuZGVmYXVsdC5oYXNoLnNoYTE7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LndyaXRlTnVtYmVyKF91dGlsMi5kZWZhdWx0LmNhbGNfY2hlY2tzdW0oYyksIDIpO1xuICB9O1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb25cblxuZnVuY3Rpb24gcGFyc2VfY2xlYXJ0ZXh0X3BhcmFtcyhoYXNoX2FsZ29yaXRobSwgY2xlYXJ0ZXh0LCBhbGdvcml0aG0pIHtcbiAgaWYgKGhhc2hfYWxnb3JpdGhtKSB7XG4gICAgdmFyIGhhc2hsZW4gPSBnZXRfaGFzaF9sZW4oaGFzaF9hbGdvcml0aG0pO1xuICAgIHZhciBoYXNoZm4gPSBnZXRfaGFzaF9mbihoYXNoX2FsZ29yaXRobSk7XG5cbiAgICB2YXIgaGFzaHRleHQgPSBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cihjbGVhcnRleHQuc3ViYXJyYXkoY2xlYXJ0ZXh0Lmxlbmd0aCAtIGhhc2hsZW4sIGNsZWFydGV4dC5sZW5ndGgpKTtcbiAgICBjbGVhcnRleHQgPSBjbGVhcnRleHQuc3ViYXJyYXkoMCwgY2xlYXJ0ZXh0Lmxlbmd0aCAtIGhhc2hsZW4pO1xuICAgIHZhciBoYXNoID0gX3V0aWwyLmRlZmF1bHQuVWludDhBcnJheV90b19zdHIoaGFzaGZuKGNsZWFydGV4dCkpO1xuXG4gICAgaWYgKGhhc2ggIT09IGhhc2h0ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbmNvcnJlY3Qga2V5IHBhc3NwaHJhc2VcIik7XG4gICAgfVxuICB9XG5cbiAgdmFyIGFsZ28gPSBfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleSwgYWxnb3JpdGhtKTtcbiAgdmFyIHR5cGVzID0gX2NyeXB0bzIuZGVmYXVsdC5nZXRQcml2S2V5UGFyYW1UeXBlcyhhbGdvKTtcbiAgdmFyIHBhcmFtcyA9IF9jcnlwdG8yLmRlZmF1bHQuY29uc3RydWN0UGFyYW1zKHR5cGVzKTtcbiAgdmFyIHAgPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoICYmIHAgPCBjbGVhcnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICBwICs9IHBhcmFtc1tpXS5yZWFkKGNsZWFydGV4dC5zdWJhcnJheShwLCBjbGVhcnRleHQubGVuZ3RoKSk7XG4gICAgaWYgKHAgPiBjbGVhcnRleHQubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIHJlYWRpbmcgcGFyYW0gQDonICsgcCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmFtcztcbn1cblxuZnVuY3Rpb24gd3JpdGVfY2xlYXJ0ZXh0X3BhcmFtcyhoYXNoX2FsZ29yaXRobSwgYWxnb3JpdGhtLCBwYXJhbXMpIHtcbiAgdmFyIGFyciA9IFtdO1xuICB2YXIgYWxnbyA9IF9lbnVtczIuZGVmYXVsdC53cml0ZShfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LCBhbGdvcml0aG0pO1xuICB2YXIgbnVtUHVibGljUGFyYW1zID0gX2NyeXB0bzIuZGVmYXVsdC5nZXRQdWJLZXlQYXJhbVR5cGVzKGFsZ28pLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gbnVtUHVibGljUGFyYW1zOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgYXJyLnB1c2gocGFyYW1zW2ldLndyaXRlKCkpO1xuICB9XG5cbiAgdmFyIGJ5dGVzID0gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShhcnIpO1xuXG4gIGlmIChoYXNoX2FsZ29yaXRobSkge1xuICAgIHZhciBoYXNoID0gZ2V0X2hhc2hfZm4oaGFzaF9hbGdvcml0aG0pKGJ5dGVzKTtcblxuICAgIHJldHVybiBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFtieXRlcywgaGFzaF0pO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vLyA1LjUuMy4gIFNlY3JldC1LZXkgUGFja2V0IEZvcm1hdHNcblxuLyoqXG4gKiBJbnRlcm5hbCBwYXJzZXIgZm9yIHByaXZhdGUga2V5cyBhcyBzcGVjaWZpZWQgaW5cbiAqIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1vcGVucGdwLXJmYzQ4ODBiaXMtMDQjc2VjdGlvbi01LjUuM3xSRkM0ODgwYmlzLTA0IHNlY3Rpb24gNS41LjN9XG4gKiBAcGFyYW0ge1N0cmluZ30gYnl0ZXMgSW5wdXQgc3RyaW5nIHRvIHJlYWQgdGhlIHBhY2tldCBmcm9tXG4gKi9cblNlY3JldEtleS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChieXRlcykge1xuICAvLyAtIEEgUHVibGljLUtleSBvciBQdWJsaWMtU3Via2V5IHBhY2tldCwgYXMgZGVzY3JpYmVkIGFib3ZlLlxuICB2YXIgbGVuID0gdGhpcy5yZWFkUHVibGljS2V5KGJ5dGVzKTtcblxuICBieXRlcyA9IGJ5dGVzLnN1YmFycmF5KGxlbiwgYnl0ZXMubGVuZ3RoKTtcblxuICAvLyAtIE9uZSBvY3RldCBpbmRpY2F0aW5nIHN0cmluZy10by1rZXkgdXNhZ2UgY29udmVudGlvbnMuICBaZXJvXG4gIC8vICAgaW5kaWNhdGVzIHRoYXQgdGhlIHNlY3JldC1rZXkgZGF0YSBpcyBub3QgZW5jcnlwdGVkLiAgMjU1IG9yIDI1NFxuICAvLyAgIGluZGljYXRlcyB0aGF0IGEgc3RyaW5nLXRvLWtleSBzcGVjaWZpZXIgaXMgYmVpbmcgZ2l2ZW4uICBBbnlcbiAgLy8gICBvdGhlciB2YWx1ZSBpcyBhIHN5bW1ldHJpYy1rZXkgZW5jcnlwdGlvbiBhbGdvcml0aG0gaWRlbnRpZmllci5cbiAgdmFyIGlzRW5jcnlwdGVkID0gYnl0ZXNbMF07XG5cbiAgaWYgKGlzRW5jcnlwdGVkKSB7XG4gICAgdGhpcy5lbmNyeXB0ZWQgPSBieXRlcztcbiAgfSBlbHNlIHtcbiAgICAvLyAtIFBsYWluIG9yIGVuY3J5cHRlZCBtdWx0aXByZWNpc2lvbiBpbnRlZ2VycyBjb21wcmlzaW5nIHRoZSBzZWNyZXRcbiAgICAvLyAgIGtleSBkYXRhLiAgVGhlc2UgYWxnb3JpdGhtLXNwZWNpZmljIGZpZWxkcyBhcmUgYXMgZGVzY3JpYmVkXG4gICAgLy8gICBiZWxvdy5cbiAgICB2YXIgcHJpdlBhcmFtcyA9IHBhcnNlX2NsZWFydGV4dF9wYXJhbXMoJ21vZCcsIGJ5dGVzLnN1YmFycmF5KDEsIGJ5dGVzLmxlbmd0aCksIHRoaXMuYWxnb3JpdGhtKTtcbiAgICB0aGlzLnBhcmFtcyA9IHRoaXMucGFyYW1zLmNvbmNhdChwcml2UGFyYW1zKTtcbiAgICB0aGlzLmlzRGVjcnlwdGVkID0gdHJ1ZTtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIE9wZW5QR1Aga2V5IHBhY2tldCBmb3IgdGhlIGdpdmVuIGtleS5cbiAqIEByZXR1cm5zIHtTdHJpbmd9IEEgc3RyaW5nIG9mIGJ5dGVzIGNvbnRhaW5pbmcgdGhlIHNlY3JldCBrZXkgT3BlblBHUCBwYWNrZXRcbiAqL1xuU2VjcmV0S2V5LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFyciA9IFt0aGlzLndyaXRlUHVibGljS2V5KCldO1xuXG4gIGlmICghdGhpcy5lbmNyeXB0ZWQpIHtcbiAgICBhcnIucHVzaChuZXcgVWludDhBcnJheShbMF0pKTtcbiAgICBhcnIucHVzaCh3cml0ZV9jbGVhcnRleHRfcGFyYW1zKCdtb2QnLCB0aGlzLmFsZ29yaXRobSwgdGhpcy5wYXJhbXMpKTtcbiAgfSBlbHNlIHtcbiAgICBhcnIucHVzaCh0aGlzLmVuY3J5cHRlZCk7XG4gIH1cblxuICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShhcnIpO1xufTtcblxuLyoqXG4gKiBFbmNyeXB0IHRoZSBwYXlsb2FkLiBCeSBkZWZhdWx0LCB3ZSB1c2UgYWVzMjU2IGFuZCBpdGVyYXRlZCwgc2FsdGVkIHN0cmluZ1xuICogdG8ga2V5IHNwZWNpZmllci4gSWYgdGhlIGtleSBpcyBpbiBhIGRlY3J5cHRlZCBzdGF0ZSAoaXNEZWNyeXB0ZWQgPT09IHRydWUpXG4gKiBhbmQgdGhlIHBhc3NwaHJhc2UgaXMgZW1wdHkgb3IgdW5kZWZpbmVkLCB0aGUga2V5IHdpbGwgYmUgc2V0IGFzIG5vdCBlbmNyeXB0ZWQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSBwYXNzcGhyYXNlIHByb3RlY3Rpb24gYWZ0ZXIgY2FsbGluZyBkZWNyeXB0KCkuXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFzc3BocmFzZVxuICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59XG4gKiBAYXN5bmNcbiAqL1xuU2VjcmV0S2V5LnByb3RvdHlwZS5lbmNyeXB0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlKHBhc3NwaHJhc2UpIHtcbiAgICB2YXIgczJrLCBzeW1tZXRyaWMsIGhhc2gsIGNsZWFydGV4dCwga2V5LCBibG9ja0xlbiwgaXYsIGFyciwgYWVhZCwgb3B0aW9uYWxGaWVsZHMsIG1vZGUsIG1vZGVJbnN0YW5jZSwgZW5jcnlwdGVkO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGlmICghKHRoaXMuaXNEZWNyeXB0ZWQgJiYgIXBhc3NwaHJhc2UpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5lbmNyeXB0ZWQgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgncmV0dXJuJywgZmFsc2UpO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgaWYgKHBhc3NwaHJhc2UpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBrZXkgbXVzdCBiZSBkZWNyeXB0ZWQgYmVmb3JlIHJlbW92aW5nIHBhc3NwaHJhc2UgcHJvdGVjdGlvbi4nKTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIHMyayA9IG5ldyBfczJrMi5kZWZhdWx0KCk7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTA7XG4gICAgICAgICAgICByZXR1cm4gX2NyeXB0bzIuZGVmYXVsdC5yYW5kb20uZ2V0UmFuZG9tQnl0ZXMoOCk7XG5cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgczJrLnNhbHQgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgc3ltbWV0cmljID0gJ2FlczI1Nic7XG4gICAgICAgICAgICBoYXNoID0gdGhpcy52ZXJzaW9uID09PSA1ID8gbnVsbCA6ICdzaGExJztcbiAgICAgICAgICAgIGNsZWFydGV4dCA9IHdyaXRlX2NsZWFydGV4dF9wYXJhbXMoaGFzaCwgdGhpcy5hbGdvcml0aG0sIHRoaXMucGFyYW1zKTtcbiAgICAgICAgICAgIGtleSA9IHByb2R1Y2VFbmNyeXB0aW9uS2V5KHMyaywgcGFzc3BocmFzZSwgc3ltbWV0cmljKTtcbiAgICAgICAgICAgIGJsb2NrTGVuID0gX2NyeXB0bzIuZGVmYXVsdC5jaXBoZXJbc3ltbWV0cmljXS5ibG9ja1NpemU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTg7XG4gICAgICAgICAgICByZXR1cm4gX2NyeXB0bzIuZGVmYXVsdC5yYW5kb20uZ2V0UmFuZG9tQnl0ZXMoYmxvY2tMZW4pO1xuXG4gICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgIGl2ID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIGFyciA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKCEodGhpcy52ZXJzaW9uID09PSA1KSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhZWFkID0gJ2VheCc7XG4gICAgICAgICAgICBvcHRpb25hbEZpZWxkcyA9IF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW25ldyBVaW50OEFycmF5KFtfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LnN5bW1ldHJpYywgc3ltbWV0cmljKSwgX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5hZWFkLCBhZWFkKV0pLCBzMmsud3JpdGUoKSwgaXZdKTtcblxuICAgICAgICAgICAgYXJyID0gW25ldyBVaW50OEFycmF5KFsyNTMsIG9wdGlvbmFsRmllbGRzLmxlbmd0aF0pXTtcbiAgICAgICAgICAgIGFyci5wdXNoKG9wdGlvbmFsRmllbGRzKTtcbiAgICAgICAgICAgIG1vZGUgPSBfY3J5cHRvMi5kZWZhdWx0W2FlYWRdO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI4O1xuICAgICAgICAgICAgcmV0dXJuIG1vZGUoc3ltbWV0cmljLCBrZXkpO1xuXG4gICAgICAgICAgY2FzZSAyODpcbiAgICAgICAgICAgIG1vZGVJbnN0YW5jZSA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzE7XG4gICAgICAgICAgICByZXR1cm4gbW9kZUluc3RhbmNlLmVuY3J5cHQoY2xlYXJ0ZXh0LCBpdi5zdWJhcnJheSgwLCBtb2RlLml2TGVuZ3RoKSwgbmV3IFVpbnQ4QXJyYXkoKSk7XG5cbiAgICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgICAgZW5jcnlwdGVkID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgYXJyLnB1c2goX3V0aWwyLmRlZmF1bHQud3JpdGVOdW1iZXIoZW5jcnlwdGVkLmxlbmd0aCwgNCkpO1xuICAgICAgICAgICAgYXJyLnB1c2goZW5jcnlwdGVkKTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0MDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICAgIGFyciA9IFtuZXcgVWludDhBcnJheShbMjU0LCBfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LnN5bW1ldHJpYywgc3ltbWV0cmljKV0pXTtcbiAgICAgICAgICAgIGFyci5wdXNoKHMyay53cml0ZSgpKTtcbiAgICAgICAgICAgIGFyci5wdXNoKGl2KTtcbiAgICAgICAgICAgIGFyci5wdXNoKF9jcnlwdG8yLmRlZmF1bHQuY2ZiLm5vcm1hbEVuY3J5cHQoc3ltbWV0cmljLCBrZXksIGNsZWFydGV4dCwgaXYpKTtcblxuICAgICAgICAgIGNhc2UgNDA6XG5cbiAgICAgICAgICAgIHRoaXMuZW5jcnlwdGVkID0gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShhcnIpO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgncmV0dXJuJywgdHJ1ZSk7XG5cbiAgICAgICAgICBjYXNlIDQyOlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94Mikge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbmZ1bmN0aW9uIHByb2R1Y2VFbmNyeXB0aW9uS2V5KHMyaywgcGFzc3BocmFzZSwgYWxnb3JpdGhtKSB7XG4gIHJldHVybiBzMmsucHJvZHVjZV9rZXkocGFzc3BocmFzZSwgX2NyeXB0bzIuZGVmYXVsdC5jaXBoZXJbYWxnb3JpdGhtXS5rZXlTaXplKTtcbn1cblxuLyoqXG4gKiBEZWNyeXB0cyB0aGUgcHJpdmF0ZSBrZXkgcGFyYW1zIHdoaWNoIGFyZSBuZWVkZWQgdG8gdXNlIHRoZSBrZXkuXG4gKiB7QGxpbmsgbW9kdWxlOnBhY2tldC5TZWNyZXRLZXkuaXNEZWNyeXB0ZWR9IHNob3VsZCBiZSBmYWxzZSwgYXNcbiAqIG90aGVyd2lzZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFzc3BocmFzZSBUaGUgcGFzc3BocmFzZSBmb3IgdGhpcyBwcml2YXRlIGtleSBhcyBzdHJpbmdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJvb2xlYW4+fVxuICogQGFzeW5jXG4gKi9cblNlY3JldEtleS5wcm90b3R5cGUuZGVjcnlwdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYyID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKHBhc3NwaHJhc2UpIHtcbiAgICB2YXIgaSwgc3ltbWV0cmljLCBhZWFkLCBrZXksIHMya191c2FnZSwgczJrLCBpdiwgY2lwaGVydGV4dCwgY2xlYXJ0ZXh0LCBtb2RlLCBtb2RlSW5zdGFuY2UsIGhhc2gsIHByaXZQYXJhbXM7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0RlY3J5cHRlZCkge1xuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0tleSBwYWNrZXQgaXMgYWxyZWFkeSBkZWNyeXB0ZWQuJyk7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgIHN5bW1ldHJpYyA9IHZvaWQgMDtcbiAgICAgICAgICAgIGFlYWQgPSB2b2lkIDA7XG4gICAgICAgICAgICBrZXkgPSB2b2lkIDA7XG4gICAgICAgICAgICBzMmtfdXNhZ2UgPSB0aGlzLmVuY3J5cHRlZFtpKytdO1xuXG4gICAgICAgICAgICAvLyAtIE9ubHkgZm9yIGEgdmVyc2lvbiA1IHBhY2tldCwgYSBvbmUtb2N0ZXQgc2NhbGFyIG9jdGV0IGNvdW50IG9mXG4gICAgICAgICAgICAvLyAgIHRoZSBuZXh0IDQgb3B0aW9uYWwgZmllbGRzLlxuXG4gICAgICAgICAgICBpZiAodGhpcy52ZXJzaW9uID09PSA1KSB7XG4gICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gLSBbT3B0aW9uYWxdIElmIHN0cmluZy10by1rZXkgdXNhZ2Ugb2N0ZXQgd2FzIDI1NSwgMjU0LCBvciAyNTMsIGFcbiAgICAgICAgICAgIC8vICAgb25lLW9jdGV0IHN5bW1ldHJpYyBlbmNyeXB0aW9uIGFsZ29yaXRobS5cbiAgICAgICAgICAgIGlmIChzMmtfdXNhZ2UgPT09IDI1NSB8fCBzMmtfdXNhZ2UgPT09IDI1NCB8fCBzMmtfdXNhZ2UgPT09IDI1Mykge1xuICAgICAgICAgICAgICBzeW1tZXRyaWMgPSB0aGlzLmVuY3J5cHRlZFtpKytdO1xuICAgICAgICAgICAgICBzeW1tZXRyaWMgPSBfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQuc3ltbWV0cmljLCBzeW1tZXRyaWMpO1xuXG4gICAgICAgICAgICAgIC8vIC0gW09wdGlvbmFsXSBJZiBzdHJpbmctdG8ta2V5IHVzYWdlIG9jdGV0IHdhcyAyNTMsIGEgb25lLW9jdGV0XG4gICAgICAgICAgICAgIC8vICAgQUVBRCBhbGdvcml0aG0uXG4gICAgICAgICAgICAgIGlmIChzMmtfdXNhZ2UgPT09IDI1Mykge1xuICAgICAgICAgICAgICAgIGFlYWQgPSB0aGlzLmVuY3J5cHRlZFtpKytdO1xuICAgICAgICAgICAgICAgIGFlYWQgPSBfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQuYWVhZCwgYWVhZCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyAtIFtPcHRpb25hbF0gSWYgc3RyaW5nLXRvLWtleSB1c2FnZSBvY3RldCB3YXMgMjU1LCAyNTQsIG9yIDI1MywgYVxuICAgICAgICAgICAgICAvLyAgIHN0cmluZy10by1rZXkgc3BlY2lmaWVyLiAgVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLXRvLWtleVxuICAgICAgICAgICAgICAvLyAgIHNwZWNpZmllciBpcyBpbXBsaWVkIGJ5IGl0cyB0eXBlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG4gICAgICAgICAgICAgIHMyayA9IG5ldyBfczJrMi5kZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgaSArPSBzMmsucmVhZCh0aGlzLmVuY3J5cHRlZC5zdWJhcnJheShpLCB0aGlzLmVuY3J5cHRlZC5sZW5ndGgpKTtcblxuICAgICAgICAgICAgICBrZXkgPSBwcm9kdWNlRW5jcnlwdGlvbktleShzMmssIHBhc3NwaHJhc2UsIHN5bW1ldHJpYyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzeW1tZXRyaWMgPSBzMmtfdXNhZ2U7XG4gICAgICAgICAgICAgIHN5bW1ldHJpYyA9IF9lbnVtczIuZGVmYXVsdC5yZWFkKF9lbnVtczIuZGVmYXVsdC5zeW1tZXRyaWMsIHN5bW1ldHJpYyk7XG4gICAgICAgICAgICAgIGtleSA9IF9jcnlwdG8yLmRlZmF1bHQuaGFzaC5tZDUocGFzc3BocmFzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIC0gW09wdGlvbmFsXSBJZiBzZWNyZXQgZGF0YSBpcyBlbmNyeXB0ZWQgKHN0cmluZy10by1rZXkgdXNhZ2Ugb2N0ZXRcbiAgICAgICAgICAgIC8vICAgbm90IHplcm8pLCBhbiBJbml0aWFsIFZlY3RvciAoSVYpIG9mIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGVcbiAgICAgICAgICAgIC8vICAgY2lwaGVyJ3MgYmxvY2sgc2l6ZS5cbiAgICAgICAgICAgIGl2ID0gdGhpcy5lbmNyeXB0ZWQuc3ViYXJyYXkoaSwgaSArIF9jcnlwdG8yLmRlZmF1bHQuY2lwaGVyW3N5bW1ldHJpY10uYmxvY2tTaXplKTtcblxuXG4gICAgICAgICAgICBpICs9IGl2Lmxlbmd0aDtcblxuICAgICAgICAgICAgLy8gLSBPbmx5IGZvciBhIHZlcnNpb24gNSBwYWNrZXQsIGEgZm91ci1vY3RldCBzY2FsYXIgb2N0ZXQgY291bnQgZm9yXG4gICAgICAgICAgICAvLyAgIHRoZSBmb2xsb3dpbmcga2V5IG1hdGVyaWFsLlxuICAgICAgICAgICAgaWYgKHRoaXMudmVyc2lvbiA9PT0gNSkge1xuICAgICAgICAgICAgICBpICs9IDQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNpcGhlcnRleHQgPSB0aGlzLmVuY3J5cHRlZC5zdWJhcnJheShpLCB0aGlzLmVuY3J5cHRlZC5sZW5ndGgpO1xuICAgICAgICAgICAgY2xlYXJ0ZXh0ID0gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAoIWFlYWQpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1vZGUgPSBfY3J5cHRvMi5kZWZhdWx0W2FlYWRdO1xuICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAxNjtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTk7XG4gICAgICAgICAgICByZXR1cm4gbW9kZShzeW1tZXRyaWMsIGtleSk7XG5cbiAgICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgICAgbW9kZUluc3RhbmNlID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDIyO1xuICAgICAgICAgICAgcmV0dXJuIG1vZGVJbnN0YW5jZS5kZWNyeXB0KGNpcGhlcnRleHQsIGl2LnN1YmFycmF5KDAsIG1vZGUuaXZMZW5ndGgpLCBuZXcgVWludDhBcnJheSgpKTtcblxuICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICBjbGVhcnRleHQgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDI1O1xuICAgICAgICAgICAgX2NvbnRleHQyLnQwID0gX2NvbnRleHQyWydjYXRjaCddKDE2KTtcblxuICAgICAgICAgICAgaWYgKCEoX2NvbnRleHQyLnQwLm1lc3NhZ2UgPT09ICdBdXRoZW50aWNhdGlvbiB0YWcgbWlzbWF0Y2gnKSkge1xuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI5O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3Qga2V5IHBhc3NwaHJhc2U6ICcgKyBfY29udGV4dDIudDAubWVzc2FnZSk7XG5cbiAgICAgICAgICBjYXNlIDI5OlxuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzMjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICAgIGNsZWFydGV4dCA9IF9jcnlwdG8yLmRlZmF1bHQuY2ZiLm5vcm1hbERlY3J5cHQoc3ltbWV0cmljLCBrZXksIGNpcGhlcnRleHQsIGl2KTtcblxuICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICBoYXNoID0gczJrX3VzYWdlID09PSAyNTMgPyBudWxsIDogczJrX3VzYWdlID09PSAyNTQgPyAnc2hhMScgOiAnbW9kJztcbiAgICAgICAgICAgIHByaXZQYXJhbXMgPSBwYXJzZV9jbGVhcnRleHRfcGFyYW1zKGhhc2gsIGNsZWFydGV4dCwgdGhpcy5hbGdvcml0aG0pO1xuXG4gICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHRoaXMucGFyYW1zLmNvbmNhdChwcml2UGFyYW1zKTtcbiAgICAgICAgICAgIHRoaXMuaXNEZWNyeXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbmNyeXB0ZWQgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywgdHJ1ZSk7XG5cbiAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyLCB0aGlzLCBbWzE2LCAyNV1dKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3gzKSB7XG4gICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cblNlY3JldEtleS5wcm90b3R5cGUuZ2VuZXJhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMyA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhiaXRzLCBjdXJ2ZSkge1xuICAgIHZhciBhbGdvO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBhbGdvID0gX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXksIHRoaXMuYWxnb3JpdGhtKTtcbiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMztcbiAgICAgICAgICAgIHJldHVybiBfY3J5cHRvMi5kZWZhdWx0LmdlbmVyYXRlUGFyYW1zKGFsZ28sIGJpdHMsIGN1cnZlKTtcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHRoaXMucGFyYW1zID0gX2NvbnRleHQzLnNlbnQ7XG5cbiAgICAgICAgICAgIHRoaXMuaXNEZWNyeXB0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUzLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3g0LCBfeDUpIHtcbiAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBDbGVhciBwcml2YXRlIHBhcmFtcywgcmV0dXJuIHRvIGluaXRpYWwgc3RhdGVcbiAqL1xuU2VjcmV0S2V5LnByb3RvdHlwZS5jbGVhclByaXZhdGVQYXJhbXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5lbmNyeXB0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0lmIHNlY3JldCBrZXkgaXMgbm90IGVuY3J5cHRlZCwgY2xlYXJpbmcgcHJpdmF0ZSBwYXJhbXMgaXMgaXJyZXZlcnNpYmxlLicpO1xuICB9XG4gIHZhciBhbGdvID0gX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXksIHRoaXMuYWxnb3JpdGhtKTtcbiAgdGhpcy5wYXJhbXMgPSB0aGlzLnBhcmFtcy5zbGljZSgwLCBfY3J5cHRvMi5kZWZhdWx0LmdldFB1YktleVBhcmFtVHlwZXMoYWxnbykubGVuZ3RoKTtcbiAgdGhpcy5pc0RlY3J5cHRlZCA9IGZhbHNlO1xufTtcblxuLyoqXG4gKiBGaXggY3VzdG9tIHR5cGVzIGFmdGVyIGNsb25pbmdcbiAqL1xuU2VjcmV0S2V5LnByb3RvdHlwZS5wb3N0Q2xvbmVUeXBlRml4ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYWxnbyA9IF9lbnVtczIuZGVmYXVsdC53cml0ZShfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LCB0aGlzLmFsZ29yaXRobSk7XG4gIHZhciB0eXBlcyA9IFtdLmNvbmNhdChfY3J5cHRvMi5kZWZhdWx0LmdldFB1YktleVBhcmFtVHlwZXMoYWxnbyksIF9jcnlwdG8yLmRlZmF1bHQuZ2V0UHJpdktleVBhcmFtVHlwZXMoYWxnbykpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbXNbaV07XG4gICAgdGhpcy5wYXJhbXNbaV0gPSB0eXBlc1tpXS5mcm9tQ2xvbmUocGFyYW0pO1xuICB9XG4gIGlmICh0aGlzLmtleWlkKSB7XG4gICAgdGhpcy5rZXlpZCA9IF9rZXlpZDIuZGVmYXVsdC5mcm9tQ2xvbmUodGhpcy5rZXlpZCk7XG4gIH1cbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFNlY3JldEtleTtcblxufSx7XCIuLi9jcnlwdG9cIjozNDAsXCIuLi9lbnVtc1wiOjM1OSxcIi4uL3R5cGUva2V5aWQuanNcIjozOTQsXCIuLi90eXBlL3Mya1wiOjM5NyxcIi4uL3V0aWxcIjozOTgsXCIuL3B1YmxpY19rZXlcIjozNzcsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiOjM1LFwiYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvclwiOjQyfV0sMzgxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9zZWNyZXRfa2V5ID0gX2RlcmVxXygnLi9zZWNyZXRfa2V5Jyk7XG5cbnZhciBfc2VjcmV0X2tleTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zZWNyZXRfa2V5KTtcblxudmFyIF9lbnVtcyA9IF9kZXJlcV8oJy4uL2VudW1zJyk7XG5cbnZhciBfZW51bXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW51bXMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEEgU2VjcmV0LVN1YmtleSBwYWNrZXQgKHRhZyA3KSBpcyB0aGUgc3Via2V5IGFuYWxvZyBvZiB0aGUgU2VjcmV0XG4gKiBLZXkgcGFja2V0IGFuZCBoYXMgZXhhY3RseSB0aGUgc2FtZSBmb3JtYXQuXG4gKiBAbWVtYmVyb2YgbW9kdWxlOnBhY2tldFxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBtb2R1bGU6cGFja2V0LlNlY3JldEtleVxuICovXG4vLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEByZXF1aXJlcyBwYWNrZXQvc2VjcmV0X2tleVxuICogQHJlcXVpcmVzIGVudW1zXG4gKi9cblxuZnVuY3Rpb24gU2VjcmV0U3Via2V5KCkge1xuICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbmV3IERhdGUoKTtcblxuICBfc2VjcmV0X2tleTIuZGVmYXVsdC5jYWxsKHRoaXMsIGRhdGUpO1xuICB0aGlzLnRhZyA9IF9lbnVtczIuZGVmYXVsdC5wYWNrZXQuc2VjcmV0U3Via2V5O1xufVxuXG5TZWNyZXRTdWJrZXkucHJvdG90eXBlID0gbmV3IF9zZWNyZXRfa2V5Mi5kZWZhdWx0KCk7XG5TZWNyZXRTdWJrZXkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2VjcmV0U3Via2V5O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBTZWNyZXRTdWJrZXk7XG5cbn0se1wiLi4vZW51bXNcIjozNTksXCIuL3NlY3JldF9rZXlcIjozODB9XSwzODI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXknKTtcblxudmFyIF9zbGljZWRUb0FycmF5MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NsaWNlZFRvQXJyYXkyKTtcblxudmFyIF9lbnRyaWVzID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9lbnRyaWVzJyk7XG5cbnZhciBfZW50cmllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnRyaWVzKTtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3InKTtcblxudmFyIF9yZWdlbmVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWdlbmVyYXRvcik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvcicpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXN5bmNUb0dlbmVyYXRvcjIpO1xuXG52YXIgX3BhY2tldDIgPSBfZGVyZXFfKCcuL3BhY2tldCcpO1xuXG52YXIgX3BhY2tldDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wYWNrZXQyKTtcblxudmFyIF9rZXlpZCA9IF9kZXJlcV8oJy4uL3R5cGUva2V5aWQuanMnKTtcblxudmFyIF9rZXlpZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9rZXlpZCk7XG5cbnZhciBfbXBpID0gX2RlcmVxXygnLi4vdHlwZS9tcGkuanMnKTtcblxudmFyIF9tcGkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbXBpKTtcblxudmFyIF9jcnlwdG8gPSBfZGVyZXFfKCcuLi9jcnlwdG8nKTtcblxudmFyIF9jcnlwdG8yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3J5cHRvKTtcblxudmFyIF9lbnVtcyA9IF9kZXJlcV8oJy4uL2VudW1zJyk7XG5cbnZhciBfZW51bXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW51bXMpO1xuXG52YXIgX3V0aWwgPSBfZGVyZXFfKCcuLi91dGlsJyk7XG5cbnZhciBfdXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2lnbmF0dXJlIFBhY2tldCAoVGFnIDIpXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tNS4yfFJGQzQ0ODAgNS4yfTpcbiAqIEEgU2lnbmF0dXJlIHBhY2tldCBkZXNjcmliZXMgYSBiaW5kaW5nIGJldHdlZW4gc29tZSBwdWJsaWMga2V5IGFuZFxuICogc29tZSBkYXRhLiAgVGhlIG1vc3QgY29tbW9uIHNpZ25hdHVyZXMgYXJlIGEgc2lnbmF0dXJlIG9mIGEgZmlsZSBvciBhXG4gKiBibG9jayBvZiB0ZXh0LCBhbmQgYSBzaWduYXR1cmUgdGhhdCBpcyBhIGNlcnRpZmljYXRpb24gb2YgYSBVc2VyIElELlxuICogQG1lbWJlcm9mIG1vZHVsZTpwYWNrZXRcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtEYXRlfSBkYXRlIHRoZSBjcmVhdGlvbiBkYXRlIG9mIHRoZSBzaWduYXR1cmVcbiAqL1xuLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAcmVxdWlyZXMgcGFja2V0L3BhY2tldFxuICogQHJlcXVpcmVzIHR5cGUva2V5aWRcbiAqIEByZXF1aXJlcyB0eXBlL21waVxuICogQHJlcXVpcmVzIGNyeXB0b1xuICogQHJlcXVpcmVzIGVudW1zXG4gKiBAcmVxdWlyZXMgdXRpbFxuICovXG5cbmZ1bmN0aW9uIFNpZ25hdHVyZSgpIHtcbiAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG5ldyBEYXRlKCk7XG5cbiAgdGhpcy50YWcgPSBfZW51bXMyLmRlZmF1bHQucGFja2V0LnNpZ25hdHVyZTtcbiAgdGhpcy52ZXJzaW9uID0gNDtcbiAgdGhpcy5zaWduYXR1cmVUeXBlID0gbnVsbDtcbiAgdGhpcy5oYXNoQWxnb3JpdGhtID0gbnVsbDtcbiAgdGhpcy5wdWJsaWNLZXlBbGdvcml0aG0gPSBudWxsO1xuXG4gIHRoaXMuc2lnbmF0dXJlRGF0YSA9IG51bGw7XG4gIHRoaXMudW5oYXNoZWRTdWJwYWNrZXRzID0gbnVsbDtcbiAgdGhpcy5zaWduZWRIYXNoVmFsdWUgPSBudWxsO1xuXG4gIHRoaXMuY3JlYXRlZCA9IF91dGlsMi5kZWZhdWx0Lm5vcm1hbGl6ZURhdGUoZGF0ZSk7XG4gIHRoaXMuc2lnbmF0dXJlRXhwaXJhdGlvblRpbWUgPSBudWxsO1xuICB0aGlzLnNpZ25hdHVyZU5ldmVyRXhwaXJlcyA9IHRydWU7XG4gIHRoaXMuZXhwb3J0YWJsZSA9IG51bGw7XG4gIHRoaXMudHJ1c3RMZXZlbCA9IG51bGw7XG4gIHRoaXMudHJ1c3RBbW91bnQgPSBudWxsO1xuICB0aGlzLnJlZ3VsYXJFeHByZXNzaW9uID0gbnVsbDtcbiAgdGhpcy5yZXZvY2FibGUgPSBudWxsO1xuICB0aGlzLmtleUV4cGlyYXRpb25UaW1lID0gbnVsbDtcbiAgdGhpcy5rZXlOZXZlckV4cGlyZXMgPSBudWxsO1xuICB0aGlzLnByZWZlcnJlZFN5bW1ldHJpY0FsZ29yaXRobXMgPSBudWxsO1xuICB0aGlzLnJldm9jYXRpb25LZXlDbGFzcyA9IG51bGw7XG4gIHRoaXMucmV2b2NhdGlvbktleUFsZ29yaXRobSA9IG51bGw7XG4gIHRoaXMucmV2b2NhdGlvbktleUZpbmdlcnByaW50ID0gbnVsbDtcbiAgdGhpcy5pc3N1ZXJLZXlJZCA9IG5ldyBfa2V5aWQyLmRlZmF1bHQoKTtcbiAgdGhpcy5ub3RhdGlvbiA9IG51bGw7XG4gIHRoaXMucHJlZmVycmVkSGFzaEFsZ29yaXRobXMgPSBudWxsO1xuICB0aGlzLnByZWZlcnJlZENvbXByZXNzaW9uQWxnb3JpdGhtcyA9IG51bGw7XG4gIHRoaXMua2V5U2VydmVyUHJlZmVyZW5jZXMgPSBudWxsO1xuICB0aGlzLnByZWZlcnJlZEtleVNlcnZlciA9IG51bGw7XG4gIHRoaXMuaXNQcmltYXJ5VXNlcklEID0gbnVsbDtcbiAgdGhpcy5wb2xpY3lVUkkgPSBudWxsO1xuICB0aGlzLmtleUZsYWdzID0gbnVsbDtcbiAgdGhpcy5zaWduZXJzVXNlcklkID0gbnVsbDtcbiAgdGhpcy5yZWFzb25Gb3JSZXZvY2F0aW9uRmxhZyA9IG51bGw7XG4gIHRoaXMucmVhc29uRm9yUmV2b2NhdGlvblN0cmluZyA9IG51bGw7XG4gIHRoaXMuZmVhdHVyZXMgPSBudWxsO1xuICB0aGlzLnNpZ25hdHVyZVRhcmdldFB1YmxpY0tleUFsZ29yaXRobSA9IG51bGw7XG4gIHRoaXMuc2lnbmF0dXJlVGFyZ2V0SGFzaEFsZ29yaXRobSA9IG51bGw7XG4gIHRoaXMuc2lnbmF0dXJlVGFyZ2V0SGFzaCA9IG51bGw7XG4gIHRoaXMuZW1iZWRkZWRTaWduYXR1cmUgPSBudWxsO1xuICB0aGlzLmlzc3VlcktleVZlcnNpb24gPSBudWxsO1xuICB0aGlzLmlzc3VlckZpbmdlcnByaW50ID0gbnVsbDtcbiAgdGhpcy5wcmVmZXJyZWRBZWFkQWxnb3JpdGhtcyA9IG51bGw7XG5cbiAgdGhpcy52ZXJpZmllZCA9IG51bGw7XG4gIHRoaXMucmV2b2tlZCA9IG51bGw7XG59XG5cbi8qKlxuICogcGFyc2luZyBmdW5jdGlvbiBmb3IgYSBzaWduYXR1cmUgcGFja2V0ICh0YWcgMikuXG4gKiBAcGFyYW0ge1N0cmluZ30gYnl0ZXMgcGF5bG9hZCBvZiBhIHRhZyAyIHBhY2tldFxuICogQHBhcmFtIHtJbnRlZ2VyfSBwb3NpdGlvbiBwb3NpdGlvbiB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGJ5dGVzIHN0cmluZ1xuICogQHBhcmFtIHtJbnRlZ2VyfSBsZW4gbGVuZ3RoIG9mIHRoZSBwYWNrZXQgb3IgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgYnl0ZXMgYXQgcG9zaXRpb25cbiAqIEByZXR1cm5zIHttb2R1bGU6cGFja2V0LlNpZ25hdHVyZX0gb2JqZWN0IHJlcHJlc2VudGF0aW9uXG4gKi9cblNpZ25hdHVyZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChieXRlcykge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciBpID0gMDtcbiAgdGhpcy52ZXJzaW9uID0gYnl0ZXNbaSsrXTtcblxuICB2YXIgc3VicGFja2V0cyA9IGZ1bmN0aW9uIHN1YnBhY2tldHMoYnl0ZXMpIHtcbiAgICAvLyBUd28tb2N0ZXQgc2NhbGFyIG9jdGV0IGNvdW50IGZvciBmb2xsb3dpbmcgc3VicGFja2V0IGRhdGEuXG4gICAgdmFyIHN1YnBhY2tldF9sZW5ndGggPSBfdXRpbDIuZGVmYXVsdC5yZWFkTnVtYmVyKGJ5dGVzLnN1YmFycmF5KDAsIDIpKTtcblxuICAgIHZhciBpID0gMjtcblxuICAgIC8vIHN1YnBhY2tldCBkYXRhIHNldCAoemVybyBvciBtb3JlIHN1YnBhY2tldHMpXG4gICAgd2hpbGUgKGkgPCAyICsgc3VicGFja2V0X2xlbmd0aCkge1xuICAgICAgdmFyIGxlbiA9IF9wYWNrZXQzLmRlZmF1bHQucmVhZFNpbXBsZUxlbmd0aChieXRlcy5zdWJhcnJheShpLCBieXRlcy5sZW5ndGgpKTtcbiAgICAgIGkgKz0gbGVuLm9mZnNldDtcblxuICAgICAgX3RoaXMucmVhZF9zdWJfcGFja2V0KGJ5dGVzLnN1YmFycmF5KGksIGkgKyBsZW4ubGVuKSk7XG5cbiAgICAgIGkgKz0gbGVuLmxlbjtcbiAgICB9XG5cbiAgICByZXR1cm4gaTtcbiAgfTtcblxuICAvLyBzd2l0Y2ggb24gdmVyc2lvbiAoMyBhbmQgNClcbiAgc3dpdGNoICh0aGlzLnZlcnNpb24pIHtcbiAgICBjYXNlIDM6XG4gICAgICB7XG4gICAgICAgIC8vIE9uZS1vY3RldCBsZW5ndGggb2YgZm9sbG93aW5nIGhhc2hlZCBtYXRlcmlhbC4gTVVTVCBiZSA1LlxuICAgICAgICBpZiAoYnl0ZXNbaSsrXSAhPT0gNSkge1xuICAgICAgICAgIF91dGlsMi5kZWZhdWx0LnByaW50X2RlYnVnKFwicGFja2V0L3NpZ25hdHVyZS5qc1xcblwiICsgJ2ludmFsaWQgT25lLW9jdGV0IGxlbmd0aCBvZiBmb2xsb3dpbmcgaGFzaGVkIG1hdGVyaWFsLicgKyAnTVVTVCBiZSA1LiBAOicgKyAoaSAtIDEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaWdwb3MgPSBpO1xuICAgICAgICAvLyBPbmUtb2N0ZXQgc2lnbmF0dXJlIHR5cGUuXG4gICAgICAgIHRoaXMuc2lnbmF0dXJlVHlwZSA9IGJ5dGVzW2krK107XG5cbiAgICAgICAgLy8gRm91ci1vY3RldCBjcmVhdGlvbiB0aW1lLlxuICAgICAgICB0aGlzLmNyZWF0ZWQgPSBfdXRpbDIuZGVmYXVsdC5yZWFkRGF0ZShieXRlcy5zdWJhcnJheShpLCBpICsgNCkpO1xuICAgICAgICBpICs9IDQ7XG5cbiAgICAgICAgLy8gc3RvcmluZyBkYXRhIGFwcGVuZGVkIHRvIGRhdGEgd2hpY2ggZ2V0cyB2ZXJpZmllZFxuICAgICAgICB0aGlzLnNpZ25hdHVyZURhdGEgPSBieXRlcy5zdWJhcnJheShzaWdwb3MsIGkpO1xuXG4gICAgICAgIC8vIEVpZ2h0LW9jdGV0IEtleSBJRCBvZiBzaWduZXIuXG4gICAgICAgIHRoaXMuaXNzdWVyS2V5SWQucmVhZChieXRlcy5zdWJhcnJheShpLCBpICsgOCkpO1xuICAgICAgICBpICs9IDg7XG5cbiAgICAgICAgLy8gT25lLW9jdGV0IHB1YmxpYy1rZXkgYWxnb3JpdGhtLlxuICAgICAgICB0aGlzLnB1YmxpY0tleUFsZ29yaXRobSA9IGJ5dGVzW2krK107XG5cbiAgICAgICAgLy8gT25lLW9jdGV0IGhhc2ggYWxnb3JpdGhtLlxuICAgICAgICB0aGlzLmhhc2hBbGdvcml0aG0gPSBieXRlc1tpKytdO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlIDQ6XG4gICAgICB7XG4gICAgICAgIHRoaXMuc2lnbmF0dXJlVHlwZSA9IGJ5dGVzW2krK107XG4gICAgICAgIHRoaXMucHVibGljS2V5QWxnb3JpdGhtID0gYnl0ZXNbaSsrXTtcbiAgICAgICAgdGhpcy5oYXNoQWxnb3JpdGhtID0gYnl0ZXNbaSsrXTtcblxuICAgICAgICAvLyBoYXNoZWQgc3VicGFja2V0c1xuICAgICAgICBpICs9IHN1YnBhY2tldHMoYnl0ZXMuc3ViYXJyYXkoaSwgYnl0ZXMubGVuZ3RoKSwgdHJ1ZSk7XG5cbiAgICAgICAgLy8gQSBWNCBzaWduYXR1cmUgaGFzaGVzIHRoZSBwYWNrZXQgYm9keVxuICAgICAgICAvLyBzdGFydGluZyBmcm9tIGl0cyBmaXJzdCBmaWVsZCwgdGhlIHZlcnNpb24gbnVtYmVyLCB0aHJvdWdoIHRoZSBlbmRcbiAgICAgICAgLy8gb2YgdGhlIGhhc2hlZCBzdWJwYWNrZXQgZGF0YS4gIFRodXMsIHRoZSBmaWVsZHMgaGFzaGVkIGFyZSB0aGVcbiAgICAgICAgLy8gc2lnbmF0dXJlIHZlcnNpb24sIHRoZSBzaWduYXR1cmUgdHlwZSwgdGhlIHB1YmxpYy1rZXkgYWxnb3JpdGhtLCB0aGVcbiAgICAgICAgLy8gaGFzaCBhbGdvcml0aG0sIHRoZSBoYXNoZWQgc3VicGFja2V0IGxlbmd0aCwgYW5kIHRoZSBoYXNoZWRcbiAgICAgICAgLy8gc3VicGFja2V0IGJvZHkuXG4gICAgICAgIHRoaXMuc2lnbmF0dXJlRGF0YSA9IGJ5dGVzLnN1YmFycmF5KDAsIGkpO1xuICAgICAgICB2YXIgc2lnRGF0YUxlbmd0aCA9IGk7XG5cbiAgICAgICAgLy8gdW5oYXNoZWQgc3VicGFja2V0c1xuICAgICAgICBpICs9IHN1YnBhY2tldHMoYnl0ZXMuc3ViYXJyYXkoaSwgYnl0ZXMubGVuZ3RoKSwgZmFsc2UpO1xuICAgICAgICB0aGlzLnVuaGFzaGVkU3VicGFja2V0cyA9IGJ5dGVzLnN1YmFycmF5KHNpZ0RhdGFMZW5ndGgsIGkpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZlcnNpb24gJyArIHRoaXMudmVyc2lvbiArICcgb2YgdGhlIHNpZ25hdHVyZSBpcyB1bnN1cHBvcnRlZC4nKTtcbiAgfVxuXG4gIC8vIFR3by1vY3RldCBmaWVsZCBob2xkaW5nIGxlZnQgMTYgYml0cyBvZiBzaWduZWQgaGFzaCB2YWx1ZS5cbiAgdGhpcy5zaWduZWRIYXNoVmFsdWUgPSBieXRlcy5zdWJhcnJheShpLCBpICsgMik7XG4gIGkgKz0gMjtcblxuICB0aGlzLnNpZ25hdHVyZSA9IGJ5dGVzLnN1YmFycmF5KGksIGJ5dGVzLmxlbmd0aCk7XG59O1xuXG5TaWduYXR1cmUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYXJyID0gW107XG4gIHN3aXRjaCAodGhpcy52ZXJzaW9uKSB7XG4gICAgY2FzZSAzOlxuICAgICAgYXJyLnB1c2gobmV3IFVpbnQ4QXJyYXkoWzMsIDVdKSk7IC8vIHZlcnNpb24sIE9uZS1vY3RldCBsZW5ndGggb2YgZm9sbG93aW5nIGhhc2hlZCBtYXRlcmlhbC4gIE1VU1QgYmUgNVxuICAgICAgYXJyLnB1c2gobmV3IFVpbnQ4QXJyYXkoW3RoaXMuc2lnbmF0dXJlVHlwZV0pKTtcbiAgICAgIGFyci5wdXNoKF91dGlsMi5kZWZhdWx0LndyaXRlRGF0ZSh0aGlzLmNyZWF0ZWQpKTtcbiAgICAgIGFyci5wdXNoKHRoaXMuaXNzdWVyS2V5SWQud3JpdGUoKSk7XG4gICAgICBhcnIucHVzaChuZXcgVWludDhBcnJheShbX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXksIHRoaXMucHVibGljS2V5QWxnb3JpdGhtKSwgX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5oYXNoLCB0aGlzLmhhc2hBbGdvcml0aG0pXSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OlxuICAgICAgYXJyLnB1c2godGhpcy5zaWduYXR1cmVEYXRhKTtcbiAgICAgIGFyci5wdXNoKHRoaXMudW5oYXNoZWRTdWJwYWNrZXRzID8gdGhpcy51bmhhc2hlZFN1YnBhY2tldHMgOiBfdXRpbDIuZGVmYXVsdC53cml0ZU51bWJlcigwLCAyKSk7XG4gICAgICBicmVhaztcbiAgfVxuICBhcnIucHVzaCh0aGlzLnNpZ25lZEhhc2hWYWx1ZSk7XG4gIGFyci5wdXNoKHRoaXMuc2lnbmF0dXJlKTtcbiAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoYXJyKTtcbn07XG5cbi8qKlxuICogU2lnbnMgcHJvdmlkZWQgZGF0YS4gVGhpcyBuZWVkcyB0byBiZSBkb25lIHByaW9yIHRvIHNlcmlhbGl6YXRpb24uXG4gKiBAcGFyYW0ge21vZHVsZTpwYWNrZXQuU2VjcmV0S2V5fSBrZXkgcHJpdmF0ZSBrZXkgdXNlZCB0byBzaWduIHRoZSBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgQ29udGFpbnMgcGFja2V0cyB0byBiZSBzaWduZWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn1cbiAqIEBhc3luY1xuICovXG5TaWduYXR1cmUucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoa2V5LCBkYXRhKSB7XG4gICAgdmFyIHNpZ25hdHVyZVR5cGUsIHB1YmxpY0tleUFsZ29yaXRobSwgaGFzaEFsZ29yaXRobSwgYXJyLCB0cmFpbGVyLCB0b0hhc2gsIGhhc2g7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgc2lnbmF0dXJlVHlwZSA9IF9lbnVtczIuZGVmYXVsdC53cml0ZShfZW51bXMyLmRlZmF1bHQuc2lnbmF0dXJlLCB0aGlzLnNpZ25hdHVyZVR5cGUpO1xuICAgICAgICAgICAgcHVibGljS2V5QWxnb3JpdGhtID0gX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXksIHRoaXMucHVibGljS2V5QWxnb3JpdGhtKTtcbiAgICAgICAgICAgIGhhc2hBbGdvcml0aG0gPSBfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0Lmhhc2gsIHRoaXMuaGFzaEFsZ29yaXRobSk7XG4gICAgICAgICAgICBhcnIgPSBbbmV3IFVpbnQ4QXJyYXkoWzQsIHNpZ25hdHVyZVR5cGUsIHB1YmxpY0tleUFsZ29yaXRobSwgaGFzaEFsZ29yaXRobV0pXTtcblxuXG4gICAgICAgICAgICBpZiAoa2V5LnZlcnNpb24gPT09IDUpIHtcbiAgICAgICAgICAgICAgLy8gV2UgY291bGQgYWxzbyBnZW5lcmF0ZSB0aGlzIHN1YnBhY2tldCBmb3IgdmVyc2lvbiA0IGtleXMsIGJ1dCBmb3JcbiAgICAgICAgICAgICAgLy8gbm93IHdlIGRvbid0LlxuICAgICAgICAgICAgICB0aGlzLmlzc3VlcktleVZlcnNpb24gPSBrZXkudmVyc2lvbjtcbiAgICAgICAgICAgICAgdGhpcy5pc3N1ZXJGaW5nZXJwcmludCA9IGtleS5nZXRGaW5nZXJwcmludEJ5dGVzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXNzdWVyS2V5SWQgPSBrZXkuZ2V0S2V5SWQoKTtcblxuICAgICAgICAgICAgLy8gQWRkIGhhc2hlZCBzdWJwYWNrZXRzXG4gICAgICAgICAgICBhcnIucHVzaCh0aGlzLndyaXRlX2FsbF9zdWJfcGFja2V0cygpKTtcblxuICAgICAgICAgICAgdGhpcy5zaWduYXR1cmVEYXRhID0gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShhcnIpO1xuXG4gICAgICAgICAgICB0cmFpbGVyID0gdGhpcy5jYWxjdWxhdGVUcmFpbGVyKCk7XG4gICAgICAgICAgICB0b0hhc2ggPSBudWxsO1xuICAgICAgICAgICAgX2NvbnRleHQudDAgPSB0aGlzLnZlcnNpb247XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gX2NvbnRleHQudDAgPT09IDMgPyAxMyA6IF9jb250ZXh0LnQwID09PSA0ID8gMTUgOiAxNztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIHRvSGFzaCA9IF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW3RoaXMudG9TaWduKHNpZ25hdHVyZVR5cGUsIGRhdGEpLCBuZXcgVWludDhBcnJheShbc2lnbmF0dXJlVHlwZV0pLCBfdXRpbDIuZGVmYXVsdC53cml0ZURhdGUodGhpcy5jcmVhdGVkKV0pO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgnYnJlYWsnLCAxOCk7XG5cbiAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgdG9IYXNoID0gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbdGhpcy50b1NpZ24oc2lnbmF0dXJlVHlwZSwgZGF0YSksIHRoaXMuc2lnbmF0dXJlRGF0YSwgdHJhaWxlcl0pO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgnYnJlYWsnLCAxOCk7XG5cbiAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWZXJzaW9uICcgKyB0aGlzLnZlcnNpb24gKyAnIG9mIHRoZSBzaWduYXR1cmUgaXMgdW5zdXBwb3J0ZWQuJyk7XG5cbiAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgaGFzaCA9IF9jcnlwdG8yLmRlZmF1bHQuaGFzaC5kaWdlc3QoaGFzaEFsZ29yaXRobSwgdG9IYXNoKTtcblxuXG4gICAgICAgICAgICB0aGlzLnNpZ25lZEhhc2hWYWx1ZSA9IGhhc2guc3ViYXJyYXkoMCwgMik7XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMjtcbiAgICAgICAgICAgIHJldHVybiBfY3J5cHRvMi5kZWZhdWx0LnNpZ25hdHVyZS5zaWduKHB1YmxpY0tleUFsZ29yaXRobSwgaGFzaEFsZ29yaXRobSwga2V5LnBhcmFtcywgdG9IYXNoKTtcblxuICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICB0aGlzLnNpZ25hdHVyZSA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCdyZXR1cm4nLCB0cnVlKTtcblxuICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3gyLCBfeDMpIHtcbiAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIENyZWF0ZXMgc3RyaW5nIG9mIGJ5dGVzIHdpdGggYWxsIHN1YnBhY2tldCBkYXRhXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBhIHN0cmluZy1yZXByZXNlbnRhdGlvbiBvZiBhIGFsbCBzdWJwYWNrZXQgZGF0YVxuICovXG5TaWduYXR1cmUucHJvdG90eXBlLndyaXRlX2FsbF9zdWJfcGFja2V0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN1YiA9IF9lbnVtczIuZGVmYXVsdC5zaWduYXR1cmVTdWJwYWNrZXQ7XG4gIHZhciBhcnIgPSBbXTtcbiAgdmFyIGJ5dGVzID0gdm9pZCAwO1xuICBpZiAodGhpcy5jcmVhdGVkICE9PSBudWxsKSB7XG4gICAgYXJyLnB1c2god3JpdGVfc3ViX3BhY2tldChzdWIuc2lnbmF0dXJlX2NyZWF0aW9uX3RpbWUsIF91dGlsMi5kZWZhdWx0LndyaXRlRGF0ZSh0aGlzLmNyZWF0ZWQpKSk7XG4gIH1cbiAgaWYgKHRoaXMuc2lnbmF0dXJlRXhwaXJhdGlvblRpbWUgIT09IG51bGwpIHtcbiAgICBhcnIucHVzaCh3cml0ZV9zdWJfcGFja2V0KHN1Yi5zaWduYXR1cmVfZXhwaXJhdGlvbl90aW1lLCBfdXRpbDIuZGVmYXVsdC53cml0ZU51bWJlcih0aGlzLnNpZ25hdHVyZUV4cGlyYXRpb25UaW1lLCA0KSkpO1xuICB9XG4gIGlmICh0aGlzLmV4cG9ydGFibGUgIT09IG51bGwpIHtcbiAgICBhcnIucHVzaCh3cml0ZV9zdWJfcGFja2V0KHN1Yi5leHBvcnRhYmxlX2NlcnRpZmljYXRpb24sIG5ldyBVaW50OEFycmF5KFt0aGlzLmV4cG9ydGFibGUgPyAxIDogMF0pKSk7XG4gIH1cbiAgaWYgKHRoaXMudHJ1c3RMZXZlbCAhPT0gbnVsbCkge1xuICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoW3RoaXMudHJ1c3RMZXZlbCwgdGhpcy50cnVzdEFtb3VudF0pO1xuICAgIGFyci5wdXNoKHdyaXRlX3N1Yl9wYWNrZXQoc3ViLnRydXN0X3NpZ25hdHVyZSwgYnl0ZXMpKTtcbiAgfVxuICBpZiAodGhpcy5yZWd1bGFyRXhwcmVzc2lvbiAhPT0gbnVsbCkge1xuICAgIGFyci5wdXNoKHdyaXRlX3N1Yl9wYWNrZXQoc3ViLnJlZ3VsYXJfZXhwcmVzc2lvbiwgdGhpcy5yZWd1bGFyRXhwcmVzc2lvbikpO1xuICB9XG4gIGlmICh0aGlzLnJldm9jYWJsZSAhPT0gbnVsbCkge1xuICAgIGFyci5wdXNoKHdyaXRlX3N1Yl9wYWNrZXQoc3ViLnJldm9jYWJsZSwgbmV3IFVpbnQ4QXJyYXkoW3RoaXMucmV2b2NhYmxlID8gMSA6IDBdKSkpO1xuICB9XG4gIGlmICh0aGlzLmtleUV4cGlyYXRpb25UaW1lICE9PSBudWxsKSB7XG4gICAgYXJyLnB1c2god3JpdGVfc3ViX3BhY2tldChzdWIua2V5X2V4cGlyYXRpb25fdGltZSwgX3V0aWwyLmRlZmF1bHQud3JpdGVOdW1iZXIodGhpcy5rZXlFeHBpcmF0aW9uVGltZSwgNCkpKTtcbiAgfVxuICBpZiAodGhpcy5wcmVmZXJyZWRTeW1tZXRyaWNBbGdvcml0aG1zICE9PSBudWxsKSB7XG4gICAgYnl0ZXMgPSBfdXRpbDIuZGVmYXVsdC5zdHJfdG9fVWludDhBcnJheShfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cih0aGlzLnByZWZlcnJlZFN5bW1ldHJpY0FsZ29yaXRobXMpKTtcbiAgICBhcnIucHVzaCh3cml0ZV9zdWJfcGFja2V0KHN1Yi5wcmVmZXJyZWRfc3ltbWV0cmljX2FsZ29yaXRobXMsIGJ5dGVzKSk7XG4gIH1cbiAgaWYgKHRoaXMucmV2b2NhdGlvbktleUNsYXNzICE9PSBudWxsKSB7XG4gICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheShbdGhpcy5yZXZvY2F0aW9uS2V5Q2xhc3MsIHRoaXMucmV2b2NhdGlvbktleUFsZ29yaXRobV0pO1xuICAgIGJ5dGVzID0gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbYnl0ZXMsIHRoaXMucmV2b2NhdGlvbktleUZpbmdlcnByaW50XSk7XG4gICAgYXJyLnB1c2god3JpdGVfc3ViX3BhY2tldChzdWIucmV2b2NhdGlvbl9rZXksIGJ5dGVzKSk7XG4gIH1cbiAgaWYgKCF0aGlzLmlzc3VlcktleUlkLmlzTnVsbCgpICYmIHRoaXMuaXNzdWVyS2V5VmVyc2lvbiAhPT0gNSkge1xuICAgIC8vIElmIHRoZSB2ZXJzaW9uIG9mIFt0aGVdIGtleSBpcyBncmVhdGVyIHRoYW4gNCwgdGhpcyBzdWJwYWNrZXRcbiAgICAvLyBNVVNUIE5PVCBiZSBpbmNsdWRlZCBpbiB0aGUgc2lnbmF0dXJlLlxuICAgIGFyci5wdXNoKHdyaXRlX3N1Yl9wYWNrZXQoc3ViLmlzc3VlciwgdGhpcy5pc3N1ZXJLZXlJZC53cml0ZSgpKSk7XG4gIH1cbiAgaWYgKHRoaXMubm90YXRpb24gIT09IG51bGwpIHtcbiAgICAoMCwgX2VudHJpZXMyLmRlZmF1bHQpKHRoaXMubm90YXRpb24pLmZvckVhY2goZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICB2YXIgX3JlZjMgPSAoMCwgX3NsaWNlZFRvQXJyYXkzLmRlZmF1bHQpKF9yZWYyLCAyKSxcbiAgICAgICAgICBuYW1lID0gX3JlZjNbMF0sXG4gICAgICAgICAgdmFsdWUgPSBfcmVmM1sxXTtcblxuICAgICAgYnl0ZXMgPSBbbmV3IFVpbnQ4QXJyYXkoWzB4ODAsIDAsIDAsIDBdKV07XG4gICAgICAvLyAyIG9jdGV0cyBvZiBuYW1lIGxlbmd0aFxuICAgICAgYnl0ZXMucHVzaChfdXRpbDIuZGVmYXVsdC53cml0ZU51bWJlcihuYW1lLmxlbmd0aCwgMikpO1xuICAgICAgLy8gMiBvY3RldHMgb2YgdmFsdWUgbGVuZ3RoXG4gICAgICBieXRlcy5wdXNoKF91dGlsMi5kZWZhdWx0LndyaXRlTnVtYmVyKHZhbHVlLmxlbmd0aCwgMikpO1xuICAgICAgYnl0ZXMucHVzaChfdXRpbDIuZGVmYXVsdC5zdHJfdG9fVWludDhBcnJheShuYW1lICsgdmFsdWUpKTtcbiAgICAgIGJ5dGVzID0gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShieXRlcyk7XG4gICAgICBhcnIucHVzaCh3cml0ZV9zdWJfcGFja2V0KHN1Yi5ub3RhdGlvbl9kYXRhLCBieXRlcykpO1xuICAgIH0pO1xuICB9XG4gIGlmICh0aGlzLnByZWZlcnJlZEhhc2hBbGdvcml0aG1zICE9PSBudWxsKSB7XG4gICAgYnl0ZXMgPSBfdXRpbDIuZGVmYXVsdC5zdHJfdG9fVWludDhBcnJheShfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cih0aGlzLnByZWZlcnJlZEhhc2hBbGdvcml0aG1zKSk7XG4gICAgYXJyLnB1c2god3JpdGVfc3ViX3BhY2tldChzdWIucHJlZmVycmVkX2hhc2hfYWxnb3JpdGhtcywgYnl0ZXMpKTtcbiAgfVxuICBpZiAodGhpcy5wcmVmZXJyZWRDb21wcmVzc2lvbkFsZ29yaXRobXMgIT09IG51bGwpIHtcbiAgICBieXRlcyA9IF91dGlsMi5kZWZhdWx0LnN0cl90b19VaW50OEFycmF5KF91dGlsMi5kZWZhdWx0LlVpbnQ4QXJyYXlfdG9fc3RyKHRoaXMucHJlZmVycmVkQ29tcHJlc3Npb25BbGdvcml0aG1zKSk7XG4gICAgYXJyLnB1c2god3JpdGVfc3ViX3BhY2tldChzdWIucHJlZmVycmVkX2NvbXByZXNzaW9uX2FsZ29yaXRobXMsIGJ5dGVzKSk7XG4gIH1cbiAgaWYgKHRoaXMua2V5U2VydmVyUHJlZmVyZW5jZXMgIT09IG51bGwpIHtcbiAgICBieXRlcyA9IF91dGlsMi5kZWZhdWx0LnN0cl90b19VaW50OEFycmF5KF91dGlsMi5kZWZhdWx0LlVpbnQ4QXJyYXlfdG9fc3RyKHRoaXMua2V5U2VydmVyUHJlZmVyZW5jZXMpKTtcbiAgICBhcnIucHVzaCh3cml0ZV9zdWJfcGFja2V0KHN1Yi5rZXlfc2VydmVyX3ByZWZlcmVuY2VzLCBieXRlcykpO1xuICB9XG4gIGlmICh0aGlzLnByZWZlcnJlZEtleVNlcnZlciAhPT0gbnVsbCkge1xuICAgIGFyci5wdXNoKHdyaXRlX3N1Yl9wYWNrZXQoc3ViLnByZWZlcnJlZF9rZXlfc2VydmVyLCBfdXRpbDIuZGVmYXVsdC5zdHJfdG9fVWludDhBcnJheSh0aGlzLnByZWZlcnJlZEtleVNlcnZlcikpKTtcbiAgfVxuICBpZiAodGhpcy5pc1ByaW1hcnlVc2VySUQgIT09IG51bGwpIHtcbiAgICBhcnIucHVzaCh3cml0ZV9zdWJfcGFja2V0KHN1Yi5wcmltYXJ5X3VzZXJfaWQsIG5ldyBVaW50OEFycmF5KFt0aGlzLmlzUHJpbWFyeVVzZXJJRCA/IDEgOiAwXSkpKTtcbiAgfVxuICBpZiAodGhpcy5wb2xpY3lVUkkgIT09IG51bGwpIHtcbiAgICBhcnIucHVzaCh3cml0ZV9zdWJfcGFja2V0KHN1Yi5wb2xpY3lfdXJpLCBfdXRpbDIuZGVmYXVsdC5zdHJfdG9fVWludDhBcnJheSh0aGlzLnBvbGljeVVSSSkpKTtcbiAgfVxuICBpZiAodGhpcy5rZXlGbGFncyAhPT0gbnVsbCkge1xuICAgIGJ5dGVzID0gX3V0aWwyLmRlZmF1bHQuc3RyX3RvX1VpbnQ4QXJyYXkoX3V0aWwyLmRlZmF1bHQuVWludDhBcnJheV90b19zdHIodGhpcy5rZXlGbGFncykpO1xuICAgIGFyci5wdXNoKHdyaXRlX3N1Yl9wYWNrZXQoc3ViLmtleV9mbGFncywgYnl0ZXMpKTtcbiAgfVxuICBpZiAodGhpcy5zaWduZXJzVXNlcklkICE9PSBudWxsKSB7XG4gICAgYXJyLnB1c2god3JpdGVfc3ViX3BhY2tldChzdWIuc2lnbmVyc191c2VyX2lkLCBfdXRpbDIuZGVmYXVsdC5zdHJfdG9fVWludDhBcnJheSh0aGlzLnNpZ25lcnNVc2VySWQpKSk7XG4gIH1cbiAgaWYgKHRoaXMucmVhc29uRm9yUmV2b2NhdGlvbkZsYWcgIT09IG51bGwpIHtcbiAgICBieXRlcyA9IF91dGlsMi5kZWZhdWx0LnN0cl90b19VaW50OEFycmF5KFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5yZWFzb25Gb3JSZXZvY2F0aW9uRmxhZykgKyB0aGlzLnJlYXNvbkZvclJldm9jYXRpb25TdHJpbmcpO1xuICAgIGFyci5wdXNoKHdyaXRlX3N1Yl9wYWNrZXQoc3ViLnJlYXNvbl9mb3JfcmV2b2NhdGlvbiwgYnl0ZXMpKTtcbiAgfVxuICBpZiAodGhpcy5mZWF0dXJlcyAhPT0gbnVsbCkge1xuICAgIGJ5dGVzID0gX3V0aWwyLmRlZmF1bHQuc3RyX3RvX1VpbnQ4QXJyYXkoX3V0aWwyLmRlZmF1bHQuVWludDhBcnJheV90b19zdHIodGhpcy5mZWF0dXJlcykpO1xuICAgIGFyci5wdXNoKHdyaXRlX3N1Yl9wYWNrZXQoc3ViLmZlYXR1cmVzLCBieXRlcykpO1xuICB9XG4gIGlmICh0aGlzLnNpZ25hdHVyZVRhcmdldFB1YmxpY0tleUFsZ29yaXRobSAhPT0gbnVsbCkge1xuICAgIGJ5dGVzID0gW25ldyBVaW50OEFycmF5KFt0aGlzLnNpZ25hdHVyZVRhcmdldFB1YmxpY0tleUFsZ29yaXRobSwgdGhpcy5zaWduYXR1cmVUYXJnZXRIYXNoQWxnb3JpdGhtXSldO1xuICAgIGJ5dGVzLnB1c2goX3V0aWwyLmRlZmF1bHQuc3RyX3RvX1VpbnQ4QXJyYXkodGhpcy5zaWduYXR1cmVUYXJnZXRIYXNoKSk7XG4gICAgYnl0ZXMgPSBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KGJ5dGVzKTtcbiAgICBhcnIucHVzaCh3cml0ZV9zdWJfcGFja2V0KHN1Yi5zaWduYXR1cmVfdGFyZ2V0LCBieXRlcykpO1xuICB9XG4gIGlmICh0aGlzLmVtYmVkZGVkU2lnbmF0dXJlICE9PSBudWxsKSB7XG4gICAgYXJyLnB1c2god3JpdGVfc3ViX3BhY2tldChzdWIuZW1iZWRkZWRfc2lnbmF0dXJlLCB0aGlzLmVtYmVkZGVkU2lnbmF0dXJlLndyaXRlKCkpKTtcbiAgfVxuICBpZiAodGhpcy5pc3N1ZXJGaW5nZXJwcmludCAhPT0gbnVsbCkge1xuICAgIGJ5dGVzID0gW25ldyBVaW50OEFycmF5KFt0aGlzLmlzc3VlcktleVZlcnNpb25dKSwgdGhpcy5pc3N1ZXJGaW5nZXJwcmludF07XG4gICAgYnl0ZXMgPSBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KGJ5dGVzKTtcbiAgICBhcnIucHVzaCh3cml0ZV9zdWJfcGFja2V0KHN1Yi5pc3N1ZXJfZmluZ2VycHJpbnQsIGJ5dGVzKSk7XG4gIH1cbiAgaWYgKHRoaXMucHJlZmVycmVkQWVhZEFsZ29yaXRobXMgIT09IG51bGwpIHtcbiAgICBieXRlcyA9IF91dGlsMi5kZWZhdWx0LnN0cl90b19VaW50OEFycmF5KF91dGlsMi5kZWZhdWx0LlVpbnQ4QXJyYXlfdG9fc3RyKHRoaXMucHJlZmVycmVkQWVhZEFsZ29yaXRobXMpKTtcbiAgICBhcnIucHVzaCh3cml0ZV9zdWJfcGFja2V0KHN1Yi5wcmVmZXJyZWRfYWVhZF9hbGdvcml0aG1zLCBieXRlcykpO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoYXJyKTtcbiAgdmFyIGxlbmd0aCA9IF91dGlsMi5kZWZhdWx0LndyaXRlTnVtYmVyKHJlc3VsdC5sZW5ndGgsIDIpO1xuXG4gIHJldHVybiBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFtsZW5ndGgsIHJlc3VsdF0pO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc3ViIHNpZ25hdHVyZSBwYWNrZXRcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tNS4yLjMuMXxSRkM0ODgwIDUuMi4zLjF9XG4gKiBAc2VlIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTUuMi4zLjJ8UkZDNDg4MCA1LjIuMy4yfVxuICogQHBhcmFtIHtJbnRlZ2VyfSB0eXBlIHN1YnBhY2tldCBzaWduYXR1cmUgdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhIGRhdGEgdG8gYmUgaW5jbHVkZWRcbiAqIEByZXR1cm5zIHtTdHJpbmd9IGEgc3RyaW5nLXJlcHJlc2VudGF0aW9uIG9mIGEgc3ViIHNpZ25hdHVyZSBwYWNrZXRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHdyaXRlX3N1Yl9wYWNrZXQodHlwZSwgZGF0YSkge1xuICB2YXIgYXJyID0gW107XG4gIGFyci5wdXNoKF9wYWNrZXQzLmRlZmF1bHQud3JpdGVTaW1wbGVMZW5ndGgoZGF0YS5sZW5ndGggKyAxKSk7XG4gIGFyci5wdXNoKG5ldyBVaW50OEFycmF5KFt0eXBlXSkpO1xuICBhcnIucHVzaChkYXRhKTtcbiAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoYXJyKTtcbn1cblxuLy8gVjQgc2lnbmF0dXJlIHN1YiBwYWNrZXRzXG5cblNpZ25hdHVyZS5wcm90b3R5cGUucmVhZF9zdWJfcGFja2V0ID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gIHZhciBteXBvcyA9IDA7XG5cbiAgdmFyIHJlYWRfYXJyYXkgPSBmdW5jdGlvbiByZWFkX2FycmF5KHByb3AsIGJ5dGVzKSB7XG4gICAgX3RoaXMyW3Byb3BdID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBfdGhpczJbcHJvcF0ucHVzaChieXRlc1tpXSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIFRoZSBsZWZ0d29zdCBiaXQgZGVub3RlcyBhIFwiY3JpdGljYWxcIiBwYWNrZXQsIGJ1dCB3ZSBpZ25vcmUgaXQuXG4gIHZhciB0eXBlID0gYnl0ZXNbbXlwb3MrK10gJiAweDdGO1xuICB2YXIgc2Vjb25kcyA9IHZvaWQgMDtcblxuICAvLyBzdWJwYWNrZXQgdHlwZVxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIDI6XG4gICAgICAvLyBTaWduYXR1cmUgQ3JlYXRpb24gVGltZVxuICAgICAgdGhpcy5jcmVhdGVkID0gX3V0aWwyLmRlZmF1bHQucmVhZERhdGUoYnl0ZXMuc3ViYXJyYXkobXlwb3MsIGJ5dGVzLmxlbmd0aCkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOlxuICAgICAgLy8gU2lnbmF0dXJlIEV4cGlyYXRpb24gVGltZSBpbiBzZWNvbmRzXG4gICAgICBzZWNvbmRzID0gX3V0aWwyLmRlZmF1bHQucmVhZE51bWJlcihieXRlcy5zdWJhcnJheShteXBvcywgYnl0ZXMubGVuZ3RoKSk7XG5cbiAgICAgIHRoaXMuc2lnbmF0dXJlTmV2ZXJFeHBpcmVzID0gc2Vjb25kcyA9PT0gMDtcbiAgICAgIHRoaXMuc2lnbmF0dXJlRXhwaXJhdGlvblRpbWUgPSBzZWNvbmRzO1xuXG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ6XG4gICAgICAvLyBFeHBvcnRhYmxlIENlcnRpZmljYXRpb25cbiAgICAgIHRoaXMuZXhwb3J0YWJsZSA9IGJ5dGVzW215cG9zKytdID09PSAxO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA1OlxuICAgICAgLy8gVHJ1c3QgU2lnbmF0dXJlXG4gICAgICB0aGlzLnRydXN0TGV2ZWwgPSBieXRlc1tteXBvcysrXTtcbiAgICAgIHRoaXMudHJ1c3RBbW91bnQgPSBieXRlc1tteXBvcysrXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNjpcbiAgICAgIC8vIFJlZ3VsYXIgRXhwcmVzc2lvblxuICAgICAgdGhpcy5yZWd1bGFyRXhwcmVzc2lvbiA9IGJ5dGVzW215cG9zXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNzpcbiAgICAgIC8vIFJldm9jYWJsZVxuICAgICAgdGhpcy5yZXZvY2FibGUgPSBieXRlc1tteXBvcysrXSA9PT0gMTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgOTpcbiAgICAgIC8vIEtleSBFeHBpcmF0aW9uIFRpbWUgaW4gc2Vjb25kc1xuICAgICAgc2Vjb25kcyA9IF91dGlsMi5kZWZhdWx0LnJlYWROdW1iZXIoYnl0ZXMuc3ViYXJyYXkobXlwb3MsIGJ5dGVzLmxlbmd0aCkpO1xuXG4gICAgICB0aGlzLmtleUV4cGlyYXRpb25UaW1lID0gc2Vjb25kcztcbiAgICAgIHRoaXMua2V5TmV2ZXJFeHBpcmVzID0gc2Vjb25kcyA9PT0gMDtcblxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTpcbiAgICAgIC8vIFByZWZlcnJlZCBTeW1tZXRyaWMgQWxnb3JpdGhtc1xuICAgICAgcmVhZF9hcnJheSgncHJlZmVycmVkU3ltbWV0cmljQWxnb3JpdGhtcycsIGJ5dGVzLnN1YmFycmF5KG15cG9zLCBieXRlcy5sZW5ndGgpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTI6XG4gICAgICAvLyBSZXZvY2F0aW9uIEtleVxuICAgICAgLy8gKDEgb2N0ZXQgb2YgY2xhc3MsIDEgb2N0ZXQgb2YgcHVibGljLWtleSBhbGdvcml0aG0gSUQsIDIwXG4gICAgICAvLyBvY3RldHMgb2ZcbiAgICAgIC8vIGZpbmdlcnByaW50KVxuICAgICAgdGhpcy5yZXZvY2F0aW9uS2V5Q2xhc3MgPSBieXRlc1tteXBvcysrXTtcbiAgICAgIHRoaXMucmV2b2NhdGlvbktleUFsZ29yaXRobSA9IGJ5dGVzW215cG9zKytdO1xuICAgICAgdGhpcy5yZXZvY2F0aW9uS2V5RmluZ2VycHJpbnQgPSBieXRlcy5zdWJhcnJheShteXBvcywgbXlwb3MgKyAyMCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgMTY6XG4gICAgICAvLyBJc3N1ZXJcbiAgICAgIHRoaXMuaXNzdWVyS2V5SWQucmVhZChieXRlcy5zdWJhcnJheShteXBvcywgYnl0ZXMubGVuZ3RoKSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgMjA6XG4gICAgICAvLyBOb3RhdGlvbiBEYXRhXG4gICAgICAvLyBXZSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgYW55dGhpbmcgYnV0IGEgdGV4dCBmbGFnZ2VkIGRhdGEuXG4gICAgICBpZiAoYnl0ZXNbbXlwb3NdID09PSAweDgwKSB7XG4gICAgICAgIC8vIFdlIGV4dHJhY3Qga2V5L3ZhbHVlIHR1cGxlIGZyb20gdGhlIGJ5dGUgc3RyZWFtLlxuICAgICAgICBteXBvcyArPSA0O1xuICAgICAgICB2YXIgbSA9IF91dGlsMi5kZWZhdWx0LnJlYWROdW1iZXIoYnl0ZXMuc3ViYXJyYXkobXlwb3MsIG15cG9zICsgMikpO1xuICAgICAgICBteXBvcyArPSAyO1xuICAgICAgICB2YXIgbiA9IF91dGlsMi5kZWZhdWx0LnJlYWROdW1iZXIoYnl0ZXMuc3ViYXJyYXkobXlwb3MsIG15cG9zICsgMikpO1xuICAgICAgICBteXBvcyArPSAyO1xuXG4gICAgICAgIHZhciBuYW1lID0gX3V0aWwyLmRlZmF1bHQuVWludDhBcnJheV90b19zdHIoYnl0ZXMuc3ViYXJyYXkobXlwb3MsIG15cG9zICsgbSkpO1xuICAgICAgICB2YXIgdmFsdWUgPSBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cihieXRlcy5zdWJhcnJheShteXBvcyArIG0sIG15cG9zICsgbSArIG4pKTtcblxuICAgICAgICB0aGlzLm5vdGF0aW9uID0gdGhpcy5ub3RhdGlvbiB8fCB7fTtcbiAgICAgICAgdGhpcy5ub3RhdGlvbltuYW1lXSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3V0aWwyLmRlZmF1bHQucHJpbnRfZGVidWcoXCJVbnN1cHBvcnRlZCBub3RhdGlvbiBmbGFnIFwiICsgYnl0ZXNbbXlwb3NdKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjE6XG4gICAgICAvLyBQcmVmZXJyZWQgSGFzaCBBbGdvcml0aG1zXG4gICAgICByZWFkX2FycmF5KCdwcmVmZXJyZWRIYXNoQWxnb3JpdGhtcycsIGJ5dGVzLnN1YmFycmF5KG15cG9zLCBieXRlcy5sZW5ndGgpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjI6XG4gICAgICAvLyBQcmVmZXJyZWQgQ29tcHJlc3Npb24gQWxnb3JpdGhtc1xuICAgICAgcmVhZF9hcnJheSgncHJlZmVycmVkQ29tcHJlc3Npb25BbGdvcml0aG1zJywgYnl0ZXMuc3ViYXJyYXkobXlwb3MsIGJ5dGVzLmxlbmd0aCkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyMzpcbiAgICAgIC8vIEtleSBTZXJ2ZXIgUHJlZmVyZW5jZXNcbiAgICAgIHJlYWRfYXJyYXkoJ2tleVNlcnZlclByZWZlcmVuY2VzJywgYnl0ZXMuc3ViYXJyYXkobXlwb3MsIGJ5dGVzLmxlbmd0aCkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyNDpcbiAgICAgIC8vIFByZWZlcnJlZCBLZXkgU2VydmVyXG4gICAgICB0aGlzLnByZWZlcnJlZEtleVNlcnZlciA9IF91dGlsMi5kZWZhdWx0LlVpbnQ4QXJyYXlfdG9fc3RyKGJ5dGVzLnN1YmFycmF5KG15cG9zLCBieXRlcy5sZW5ndGgpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjU6XG4gICAgICAvLyBQcmltYXJ5IFVzZXIgSURcbiAgICAgIHRoaXMuaXNQcmltYXJ5VXNlcklEID0gYnl0ZXNbbXlwb3MrK10gIT09IDA7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI2OlxuICAgICAgLy8gUG9saWN5IFVSSVxuICAgICAgdGhpcy5wb2xpY3lVUkkgPSBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cihieXRlcy5zdWJhcnJheShteXBvcywgYnl0ZXMubGVuZ3RoKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI3OlxuICAgICAgLy8gS2V5IEZsYWdzXG4gICAgICByZWFkX2FycmF5KCdrZXlGbGFncycsIGJ5dGVzLnN1YmFycmF5KG15cG9zLCBieXRlcy5sZW5ndGgpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjg6XG4gICAgICAvLyBTaWduZXIncyBVc2VyIElEXG4gICAgICB0aGlzLnNpZ25lcnNVc2VySWQgPSBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cihieXRlcy5zdWJhcnJheShteXBvcywgYnl0ZXMubGVuZ3RoKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI5OlxuICAgICAgLy8gUmVhc29uIGZvciBSZXZvY2F0aW9uXG4gICAgICB0aGlzLnJlYXNvbkZvclJldm9jYXRpb25GbGFnID0gYnl0ZXNbbXlwb3MrK107XG4gICAgICB0aGlzLnJlYXNvbkZvclJldm9jYXRpb25TdHJpbmcgPSBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cihieXRlcy5zdWJhcnJheShteXBvcywgYnl0ZXMubGVuZ3RoKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDMwOlxuICAgICAgLy8gRmVhdHVyZXNcbiAgICAgIHJlYWRfYXJyYXkoJ2ZlYXR1cmVzJywgYnl0ZXMuc3ViYXJyYXkobXlwb3MsIGJ5dGVzLmxlbmd0aCkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzMTpcbiAgICAgIHtcbiAgICAgICAgLy8gU2lnbmF0dXJlIFRhcmdldFxuICAgICAgICAvLyAoMSBvY3RldCBwdWJsaWMta2V5IGFsZ29yaXRobSwgMSBvY3RldCBoYXNoIGFsZ29yaXRobSwgTiBvY3RldHMgaGFzaClcbiAgICAgICAgdGhpcy5zaWduYXR1cmVUYXJnZXRQdWJsaWNLZXlBbGdvcml0aG0gPSBieXRlc1tteXBvcysrXTtcbiAgICAgICAgdGhpcy5zaWduYXR1cmVUYXJnZXRIYXNoQWxnb3JpdGhtID0gYnl0ZXNbbXlwb3MrK107XG5cbiAgICAgICAgdmFyIGxlbiA9IF9jcnlwdG8yLmRlZmF1bHQuZ2V0SGFzaEJ5dGVMZW5ndGgodGhpcy5zaWduYXR1cmVUYXJnZXRIYXNoQWxnb3JpdGhtKTtcblxuICAgICAgICB0aGlzLnNpZ25hdHVyZVRhcmdldEhhc2ggPSBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cihieXRlcy5zdWJhcnJheShteXBvcywgbXlwb3MgKyBsZW4pKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSAzMjpcbiAgICAgIC8vIEVtYmVkZGVkIFNpZ25hdHVyZVxuICAgICAgdGhpcy5lbWJlZGRlZFNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoKTtcbiAgICAgIHRoaXMuZW1iZWRkZWRTaWduYXR1cmUucmVhZChieXRlcy5zdWJhcnJheShteXBvcywgYnl0ZXMubGVuZ3RoKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDMzOlxuICAgICAgLy8gSXNzdWVyIEZpbmdlcnByaW50XG4gICAgICB0aGlzLmlzc3VlcktleVZlcnNpb24gPSBieXRlc1tteXBvcysrXTtcbiAgICAgIHRoaXMuaXNzdWVyRmluZ2VycHJpbnQgPSBieXRlcy5zdWJhcnJheShteXBvcywgYnl0ZXMubGVuZ3RoKTtcbiAgICAgIGlmICh0aGlzLmlzc3VlcktleVZlcnNpb24gPT09IDUpIHtcbiAgICAgICAgdGhpcy5pc3N1ZXJLZXlJZC5yZWFkKHRoaXMuaXNzdWVyRmluZ2VycHJpbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pc3N1ZXJLZXlJZC5yZWFkKHRoaXMuaXNzdWVyRmluZ2VycHJpbnQuc3ViYXJyYXkoLTgpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzQ6XG4gICAgICAvLyBQcmVmZXJyZWQgQUVBRCBBbGdvcml0aG1zXG4gICAgICByZWFkX2FycmF5LmNhbGwodGhpcywgJ3ByZWZlcnJlZEFlYWRBbGdvcml0aG1zJywgYnl0ZXMuc3ViYXJyYXkobXlwb3MsIGJ5dGVzLmxlbmd0aCkpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIF91dGlsMi5kZWZhdWx0LnByaW50X2RlYnVnKFwiVW5rbm93biBzaWduYXR1cmUgc3VicGFja2V0IHR5cGUgXCIgKyB0eXBlICsgXCIgQDpcIiArIG15cG9zKTtcbiAgfVxufTtcblxuLy8gUHJvZHVjZXMgZGF0YSB0byBwcm9kdWNlIHNpZ25hdHVyZSBvblxuU2lnbmF0dXJlLnByb3RvdHlwZS50b1NpZ24gPSBmdW5jdGlvbiAodHlwZSwgZGF0YSkge1xuICB2YXIgdCA9IF9lbnVtczIuZGVmYXVsdC5zaWduYXR1cmU7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSB0LmJpbmFyeTpcbiAgICAgIHJldHVybiBkYXRhLmdldEJ5dGVzKCk7XG5cbiAgICBjYXNlIHQudGV4dDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHRleHQgPSBkYXRhLmdldFRleHQoKTtcbiAgICAgICAgLy8gbm9ybWFsaXplIEVPTCB0byBcXHJcXG5cbiAgICAgICAgdGV4dCA9IF91dGlsMi5kZWZhdWx0LmNhbm9uaWNhbGl6ZUVPTCh0ZXh0KTtcbiAgICAgICAgLy8gZW5jb2RlIFVURjhcbiAgICAgICAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LnN0cl90b19VaW50OEFycmF5KF91dGlsMi5kZWZhdWx0LmVuY29kZV91dGY4KHRleHQpKTtcbiAgICAgIH1cbiAgICBjYXNlIHQuc3RhbmRhbG9uZTpcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcblxuICAgIGNhc2UgdC5jZXJ0X2dlbmVyaWM6XG4gICAgY2FzZSB0LmNlcnRfcGVyc29uYTpcbiAgICBjYXNlIHQuY2VydF9jYXN1YWw6XG4gICAgY2FzZSB0LmNlcnRfcG9zaXRpdmU6XG4gICAgY2FzZSB0LmNlcnRfcmV2b2NhdGlvbjpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wYWNrZXQgPSB2b2lkIDA7XG4gICAgICAgIHZhciB0YWcgPSB2b2lkIDA7XG5cbiAgICAgICAgaWYgKGRhdGEudXNlcmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0YWcgPSAweEI0O1xuICAgICAgICAgIF9wYWNrZXQgPSBkYXRhLnVzZXJpZDtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnVzZXJhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRhZyA9IDB4RDE7XG4gICAgICAgICAgX3BhY2tldCA9IGRhdGEudXNlcmF0dHJpYnV0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VpdGhlciBhIHVzZXJpZCBvciB1c2VyYXR0cmlidXRlIHBhY2tldCBuZWVkcyB0byBiZSAnICsgJ3N1cHBsaWVkIGZvciBjZXJ0aWZpY2F0aW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJ5dGVzID0gX3BhY2tldC53cml0ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnZlcnNpb24gPT09IDQpIHtcbiAgICAgICAgICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbdGhpcy50b1NpZ24odC5rZXksIGRhdGEpLCBuZXcgVWludDhBcnJheShbdGFnXSksIF91dGlsMi5kZWZhdWx0LndyaXRlTnVtYmVyKGJ5dGVzLmxlbmd0aCwgNCksIGJ5dGVzXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52ZXJzaW9uID09PSAzKSB7XG4gICAgICAgICAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW3RoaXMudG9TaWduKHQua2V5LCBkYXRhKSwgYnl0ZXNdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlIHQuc3Via2V5X2JpbmRpbmc6XG4gICAgY2FzZSB0LnN1YmtleV9yZXZvY2F0aW9uOlxuICAgIGNhc2UgdC5rZXlfYmluZGluZzpcbiAgICAgIHJldHVybiBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFt0aGlzLnRvU2lnbih0LmtleSwgZGF0YSksIHRoaXMudG9TaWduKHQua2V5LCB7XG4gICAgICAgIGtleTogZGF0YS5iaW5kXG4gICAgICB9KV0pO1xuXG4gICAgY2FzZSB0LmtleTpcbiAgICAgIGlmIChkYXRhLmtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignS2V5IHBhY2tldCBpcyByZXF1aXJlZCBmb3IgdGhpcyBzaWduYXR1cmUuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YS5rZXkud3JpdGVPbGQoKTtcblxuICAgIGNhc2UgdC5rZXlfcmV2b2NhdGlvbjpcbiAgICAgIHJldHVybiB0aGlzLnRvU2lnbih0LmtleSwgZGF0YSk7XG4gICAgY2FzZSB0LnRpbWVzdGFtcDpcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICBjYXNlIHQudGhpcmRfcGFydHk6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gc2lnbmF0dXJlIHR5cGUuJyk7XG4gIH1cbn07XG5cblNpZ25hdHVyZS5wcm90b3R5cGUuY2FsY3VsYXRlVHJhaWxlciA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gY2FsY3VsYXRpbmcgdGhlIHRyYWlsZXJcbiAgLy8gVjMgc2lnbmF0dXJlcyBkb24ndCBoYXZlIGEgdHJhaWxlclxuICBpZiAodGhpcy52ZXJzaW9uID09PSAzKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICB9XG4gIHZhciBmaXJzdCA9IG5ldyBVaW50OEFycmF5KFs0LCAweEZGXSk7IC8vVmVyc2lvbiwgP1xuICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbZmlyc3QsIF91dGlsMi5kZWZhdWx0LndyaXRlTnVtYmVyKHRoaXMuc2lnbmF0dXJlRGF0YS5sZW5ndGgsIDQpXSk7XG59O1xuXG4vKipcbiAqIHZlcmlmeXMgdGhlIHNpZ25hdHVyZSBwYWNrZXQuIE5vdGU6IG5vdCBzaWduYXR1cmUgdHlwZXMgYXJlIGltcGxlbWVudGVkXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGRhdGEgZGF0YSB3aGljaCBvbiB0aGUgc2lnbmF0dXJlIGFwcGxpZXNcbiAqIEBwYXJhbSB7bW9kdWxlOnBhY2tldC5QdWJsaWNTdWJrZXl8bW9kdWxlOnBhY2tldC5QdWJsaWNLZXl8XG4gKiAgICAgICAgIG1vZHVsZTpwYWNrZXQuU2VjcmV0U3Via2V5fG1vZHVsZTpwYWNrZXQuU2VjcmV0S2V5fSBrZXkgdGhlIHB1YmxpYyBrZXkgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJvb2xlYW4+fSBUcnVlIGlmIG1lc3NhZ2UgaXMgdmVyaWZpZWQsIGVsc2UgZmFsc2UuXG4gKiBAYXN5bmNcbiAqL1xuU2lnbmF0dXJlLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmNCA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMihrZXksIGRhdGEpIHtcbiAgICB2YXIgc2lnbmF0dXJlVHlwZSwgcHVibGljS2V5QWxnb3JpdGhtLCBoYXNoQWxnb3JpdGhtLCBieXRlcywgdHJhaWxlciwgbXBpY291bnQsIGVuZGlhbiwgbXBpLCBpLCBqO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBzaWduYXR1cmVUeXBlID0gX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5zaWduYXR1cmUsIHRoaXMuc2lnbmF0dXJlVHlwZSk7XG4gICAgICAgICAgICBwdWJsaWNLZXlBbGdvcml0aG0gPSBfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleSwgdGhpcy5wdWJsaWNLZXlBbGdvcml0aG0pO1xuICAgICAgICAgICAgaGFzaEFsZ29yaXRobSA9IF9lbnVtczIuZGVmYXVsdC53cml0ZShfZW51bXMyLmRlZmF1bHQuaGFzaCwgdGhpcy5oYXNoQWxnb3JpdGhtKTtcbiAgICAgICAgICAgIGJ5dGVzID0gdGhpcy50b1NpZ24oc2lnbmF0dXJlVHlwZSwgZGF0YSk7XG4gICAgICAgICAgICB0cmFpbGVyID0gdGhpcy5jYWxjdWxhdGVUcmFpbGVyKCk7XG4gICAgICAgICAgICBtcGljb3VudCA9IDA7XG4gICAgICAgICAgICAvLyBBbGdvcml0aG0tU3BlY2lmaWMgRmllbGRzIGZvciBSU0Egc2lnbmF0dXJlczpcbiAgICAgICAgICAgIC8vICAgICAgLSBtdWx0aXByZWNpc2lvbiBudW1iZXIgKE1QSSkgb2YgUlNBIHNpZ25hdHVyZSB2YWx1ZSBtKipkIG1vZCBuLlxuXG4gICAgICAgICAgICBpZiAocHVibGljS2V5QWxnb3JpdGhtID4gMCAmJiBwdWJsaWNLZXlBbGdvcml0aG0gPCA0KSB7XG4gICAgICAgICAgICAgIG1waWNvdW50ID0gMTtcblxuICAgICAgICAgICAgICAvLyAgICBBbGdvcml0aG0tU3BlY2lmaWMgRmllbGRzIGZvciBEU0EsIEVDRFNBLCBhbmQgRWREU0Egc2lnbmF0dXJlczpcbiAgICAgICAgICAgICAgLy8gICAgICAtIE1QSSBvZiBEU0EgdmFsdWUgci5cbiAgICAgICAgICAgICAgLy8gICAgICAtIE1QSSBvZiBEU0EgdmFsdWUgcy5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHVibGljS2V5QWxnb3JpdGhtID09PSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmRzYSB8fCBwdWJsaWNLZXlBbGdvcml0aG0gPT09IF9lbnVtczIuZGVmYXVsdC5wdWJsaWNLZXkuZWNkc2EgfHwgcHVibGljS2V5QWxnb3JpdGhtID09PSBfZW51bXMyLmRlZmF1bHQucHVibGljS2V5LmVkZHNhKSB7XG4gICAgICAgICAgICAgIG1waWNvdW50ID0gMjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRWREU0Egc2lnbmF0dXJlIHBhcmFtZXRlcnMgYXJlIGVuY29kZWQgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXRcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM4MDMyI3NlY3Rpb24tNS4xLjJcbiAgICAgICAgICAgIGVuZGlhbiA9IHB1YmxpY0tleUFsZ29yaXRobSA9PT0gX2VudW1zMi5kZWZhdWx0LnB1YmxpY0tleS5lZGRzYSA/ICdsZScgOiAnYmUnO1xuICAgICAgICAgICAgbXBpID0gW107XG4gICAgICAgICAgICBpID0gMDtcblxuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1waWNvdW50OyBqKyspIHtcbiAgICAgICAgICAgICAgbXBpW2pdID0gbmV3IF9tcGkyLmRlZmF1bHQoKTtcbiAgICAgICAgICAgICAgaSArPSBtcGlbal0ucmVhZCh0aGlzLnNpZ25hdHVyZS5zdWJhcnJheShpLCB0aGlzLnNpZ25hdHVyZS5sZW5ndGgpLCBlbmRpYW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEzO1xuICAgICAgICAgICAgcmV0dXJuIF9jcnlwdG8yLmRlZmF1bHQuc2lnbmF0dXJlLnZlcmlmeShwdWJsaWNLZXlBbGdvcml0aG0sIGhhc2hBbGdvcml0aG0sIG1waSwga2V5LnBhcmFtcywgX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbYnl0ZXMsIHRoaXMuc2lnbmF0dXJlRGF0YSwgdHJhaWxlcl0pKTtcblxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICB0aGlzLnZlcmlmaWVkID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgncmV0dXJuJywgdGhpcy52ZXJpZmllZCk7XG5cbiAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3g0LCBfeDUpIHtcbiAgICByZXR1cm4gX3JlZjQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBWZXJpZmllcyBzaWduYXR1cmUgZXhwaXJhdGlvbiBkYXRlXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGUgKG9wdGlvbmFsKSB1c2UgdGhlIGdpdmVuIGRhdGUgZm9yIHZlcmlmaWNhdGlvbiBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHRpbWVcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGV4cGlyZWRcbiAqL1xuU2lnbmF0dXJlLnByb3RvdHlwZS5pc0V4cGlyZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBuZXcgRGF0ZSgpO1xuXG4gIHZhciBub3JtRGF0ZSA9IF91dGlsMi5kZWZhdWx0Lm5vcm1hbGl6ZURhdGUoZGF0ZSk7XG4gIGlmIChub3JtRGF0ZSAhPT0gbnVsbCkge1xuICAgIHZhciBleHBpcmF0aW9uVGltZSA9IHRoaXMuZ2V0RXhwaXJhdGlvblRpbWUoKTtcbiAgICByZXR1cm4gISh0aGlzLmNyZWF0ZWQgPD0gbm9ybURhdGUgJiYgbm9ybURhdGUgPCBleHBpcmF0aW9uVGltZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleHBpcmF0aW9uIHRpbWUgb2YgdGhlIHNpZ25hdHVyZSBvciBJbmZpbml0eSBpZiBzaWduYXR1cmUgZG9lcyBub3QgZXhwaXJlXG4gKiBAcmV0dXJucyB7RGF0ZX0gZXhwaXJhdGlvbiB0aW1lXG4gKi9cblNpZ25hdHVyZS5wcm90b3R5cGUuZ2V0RXhwaXJhdGlvblRpbWUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhdGhpcy5zaWduYXR1cmVOZXZlckV4cGlyZXMgPyBuZXcgRGF0ZSh0aGlzLmNyZWF0ZWQuZ2V0VGltZSgpICsgdGhpcy5zaWduYXR1cmVFeHBpcmF0aW9uVGltZSAqIDEwMDApIDogSW5maW5pdHk7XG59O1xuXG4vKipcbiAqIEZpeCBjdXN0b20gdHlwZXMgYWZ0ZXIgY2xvbmluZ1xuICovXG5TaWduYXR1cmUucHJvdG90eXBlLnBvc3RDbG9uZVR5cGVGaXggPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaXNzdWVyS2V5SWQgPSBfa2V5aWQyLmRlZmF1bHQuZnJvbUNsb25lKHRoaXMuaXNzdWVyS2V5SWQpO1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gU2lnbmF0dXJlO1xuXG59LHtcIi4uL2NyeXB0b1wiOjM0MCxcIi4uL2VudW1zXCI6MzU5LFwiLi4vdHlwZS9rZXlpZC5qc1wiOjM5NCxcIi4uL3R5cGUvbXBpLmpzXCI6Mzk1LFwiLi4vdXRpbFwiOjM5OCxcIi4vcGFja2V0XCI6Mzc1LFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9lbnRyaWVzXCI6MjcsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiOjM1LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIjo0MCxcImJhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3JcIjo0Mn1dLDM4MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcHJvbWlzZSA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9wcm9taXNlJyk7XG5cbnZhciBfcHJvbWlzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9taXNlKTtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3InKTtcblxudmFyIF9yZWdlbmVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWdlbmVyYXRvcik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvcicpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXN5bmNUb0dlbmVyYXRvcjIpO1xuXG52YXIgX2NvbmZpZyA9IF9kZXJlcV8oJy4uL2NvbmZpZycpO1xuXG52YXIgX2NvbmZpZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25maWcpO1xuXG52YXIgX2NyeXB0byA9IF9kZXJlcV8oJy4uL2NyeXB0bycpO1xuXG52YXIgX2NyeXB0bzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcnlwdG8pO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vZW51bXMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vLyBPcGVuUEdQLmpzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGFua3JlZCBIYXNlXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAcmVxdWlyZXMgY29uZmlnXG4gKiBAcmVxdWlyZXMgY3J5cHRvXG4gKiBAcmVxdWlyZXMgZW51bXNcbiAqIEByZXF1aXJlcyB1dGlsXG4gKi9cblxudmFyIFZFUlNJT04gPSAxOyAvLyBBIG9uZS1vY3RldCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZGF0YSBwYWNrZXQuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoXG4gKiBBZGRpdGlvbmFsIERhdGEgKEFFQUQpIFByb3RlY3RlZCBEYXRhIFBhY2tldFxuICpcbiAqIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtZm9yZC1vcGVucGdwLWZvcm1hdC0wMCNzZWN0aW9uLTIuMX06XG4gKiBBRUFEIFByb3RlY3RlZCBEYXRhIFBhY2tldFxuICogQG1lbWJlcm9mIG1vZHVsZTpwYWNrZXRcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBTeW1FbmNyeXB0ZWRBRUFEUHJvdGVjdGVkKCkge1xuICB0aGlzLnRhZyA9IF9lbnVtczIuZGVmYXVsdC5wYWNrZXQuc3ltRW5jcnlwdGVkQUVBRFByb3RlY3RlZDtcbiAgdGhpcy52ZXJzaW9uID0gVkVSU0lPTjtcbiAgdGhpcy5jaXBoZXJBbGdvID0gbnVsbDtcbiAgdGhpcy5hZWFkQWxnb3JpdGhtID0gJ2VheCc7XG4gIHRoaXMuYWVhZEFsZ28gPSBudWxsO1xuICB0aGlzLmNodW5rU2l6ZUJ5dGUgPSBudWxsO1xuICB0aGlzLml2ID0gbnVsbDtcbiAgdGhpcy5lbmNyeXB0ZWQgPSBudWxsO1xuICB0aGlzLnBhY2tldHMgPSBudWxsO1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBTeW1FbmNyeXB0ZWRBRUFEUHJvdGVjdGVkO1xuXG4vKipcbiAqIFBhcnNlIGFuIGVuY3J5cHRlZCBwYXlsb2FkIG9mIGJ5dGVzIGluIHRoZSBvcmRlcjogdmVyc2lvbiwgSVYsIGNpcGhlcnRleHQgKHNlZSBzcGVjaWZpY2F0aW9uKVxuICovXG5cblN5bUVuY3J5cHRlZEFFQURQcm90ZWN0ZWQucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgdmFyIG9mZnNldCA9IDA7XG4gIGlmIChieXRlc1tvZmZzZXRdICE9PSBWRVJTSU9OKSB7XG4gICAgLy8gVGhlIG9ubHkgY3VycmVudGx5IGRlZmluZWQgdmFsdWUgaXMgMS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFja2V0IHZlcnNpb24uJyk7XG4gIH1cbiAgb2Zmc2V0Kys7XG4gIGlmIChfY29uZmlnMi5kZWZhdWx0LmFlYWRfcHJvdGVjdF92ZXJzaW9uID09PSA0KSB7XG4gICAgdGhpcy5jaXBoZXJBbGdvID0gYnl0ZXNbb2Zmc2V0KytdO1xuICAgIHRoaXMuYWVhZEFsZ28gPSBieXRlc1tvZmZzZXQrK107XG4gICAgdGhpcy5jaHVua1NpemVCeXRlID0gYnl0ZXNbb2Zmc2V0KytdO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYWVhZEFsZ28gPSBfZW51bXMyLmRlZmF1bHQuYWVhZC5leHBlcmltZW50YWxfZ2NtO1xuICB9XG4gIHZhciBtb2RlID0gX2NyeXB0bzIuZGVmYXVsdFtfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQuYWVhZCwgdGhpcy5hZWFkQWxnbyldO1xuICB0aGlzLml2ID0gYnl0ZXMuc3ViYXJyYXkob2Zmc2V0LCBtb2RlLml2TGVuZ3RoICsgb2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IG1vZGUuaXZMZW5ndGg7XG4gIHRoaXMuZW5jcnlwdGVkID0gYnl0ZXMuc3ViYXJyYXkob2Zmc2V0LCBieXRlcy5sZW5ndGgpO1xufTtcblxuLyoqXG4gKiBXcml0ZSB0aGUgZW5jcnlwdGVkIHBheWxvYWQgb2YgYnl0ZXMgaW4gdGhlIG9yZGVyOiB2ZXJzaW9uLCBJViwgY2lwaGVydGV4dCAoc2VlIHNwZWNpZmljYXRpb24pXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gVGhlIGVuY3J5cHRlZCBwYXlsb2FkXG4gKi9cblN5bUVuY3J5cHRlZEFFQURQcm90ZWN0ZWQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKCkge1xuICBpZiAoX2NvbmZpZzIuZGVmYXVsdC5hZWFkX3Byb3RlY3RfdmVyc2lvbiA9PT0gNCkge1xuICAgIHJldHVybiBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFtuZXcgVWludDhBcnJheShbdGhpcy52ZXJzaW9uLCB0aGlzLmNpcGhlckFsZ28sIHRoaXMuYWVhZEFsZ28sIHRoaXMuY2h1bmtTaXplQnl0ZV0pLCB0aGlzLml2LCB0aGlzLmVuY3J5cHRlZF0pO1xuICB9XG4gIHJldHVybiBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFtuZXcgVWludDhBcnJheShbdGhpcy52ZXJzaW9uXSksIHRoaXMuaXYsIHRoaXMuZW5jcnlwdGVkXSk7XG59O1xuXG4vKipcbiAqIERlY3J5cHQgdGhlIGVuY3J5cHRlZCBwYXlsb2FkLlxuICogQHBhcmFtICB7U3RyaW5nfSBzZXNzaW9uS2V5QWxnb3JpdGhtICAgVGhlIHNlc3Npb24ga2V5J3MgY2lwaGVyIGFsZ29yaXRobSBlLmcuICdhZXMxMjgnXG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSBrZXkgICAgICAgICAgICAgICBUaGUgc2Vzc2lvbiBrZXkgdXNlZCB0byBlbmNyeXB0IHRoZSBwYXlsb2FkXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn1cbiAqIEBhc3luY1xuICovXG5TeW1FbmNyeXB0ZWRBRUFEUHJvdGVjdGVkLnByb3RvdHlwZS5kZWNyeXB0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlKHNlc3Npb25LZXlBbGdvcml0aG0sIGtleSkge1xuICAgIHZhciBtb2RlLCBkYXRhLCBhdXRoVGFnO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIG1vZGUgPSBfY3J5cHRvMi5kZWZhdWx0W19lbnVtczIuZGVmYXVsdC5yZWFkKF9lbnVtczIuZGVmYXVsdC5hZWFkLCB0aGlzLmFlYWRBbGdvKV07XG5cbiAgICAgICAgICAgIGlmICghKF9jb25maWcyLmRlZmF1bHQuYWVhZF9wcm90ZWN0X3ZlcnNpb24gPT09IDQpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLmVuY3J5cHRlZC5zdWJhcnJheSgwLCAtbW9kZS50YWdMZW5ndGgpO1xuICAgICAgICAgICAgYXV0aFRhZyA9IHRoaXMuZW5jcnlwdGVkLnN1YmFycmF5KC1tb2RlLnRhZ0xlbmd0aCk7XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IHRoaXMucGFja2V0cztcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3J5cHQoJ2RlY3J5cHQnLCBrZXksIGRhdGEsIGF1dGhUYWcpO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgX2NvbnRleHQudDEgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBfY29udGV4dC50MC5yZWFkLmNhbGwoX2NvbnRleHQudDAsIF9jb250ZXh0LnQxKTtcblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE3O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgdGhpcy5jaXBoZXJBbGdvID0gX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5zeW1tZXRyaWMsIHNlc3Npb25LZXlBbGdvcml0aG0pO1xuICAgICAgICAgICAgX2NvbnRleHQudDIgPSB0aGlzLnBhY2tldHM7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcnlwdCgnZGVjcnlwdCcsIGtleSwgdGhpcy5lbmNyeXB0ZWQpO1xuXG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIF9jb250ZXh0LnQzID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgX2NvbnRleHQudDIucmVhZC5jYWxsKF9jb250ZXh0LnQyLCBfY29udGV4dC50Myk7XG5cbiAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgncmV0dXJuJywgdHJ1ZSk7XG5cbiAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94LCBfeDIpIHtcbiAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIEVuY3J5cHQgdGhlIHBhY2tldCBsaXN0IHBheWxvYWQuXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHNlc3Npb25LZXlBbGdvcml0aG0gICBUaGUgc2Vzc2lvbiBrZXkncyBjaXBoZXIgYWxnb3JpdGhtIGUuZy4gJ2FlczEyOCdcbiAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IGtleSAgICAgICAgICAgICAgIFRoZSBzZXNzaW9uIGtleSB1c2VkIHRvIGVuY3J5cHQgdGhlIHBheWxvYWRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJvb2xlYW4+fVxuICogQGFzeW5jXG4gKi9cblN5bUVuY3J5cHRlZEFFQURQcm90ZWN0ZWQucHJvdG90eXBlLmVuY3J5cHQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMihzZXNzaW9uS2V5QWxnb3JpdGhtLCBrZXkpIHtcbiAgICB2YXIgbW9kZSwgZGF0YTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgdGhpcy5jaXBoZXJBbGdvID0gX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5zeW1tZXRyaWMsIHNlc3Npb25LZXlBbGdvcml0aG0pO1xuICAgICAgICAgICAgdGhpcy5hZWFkQWxnbyA9IF9jb25maWcyLmRlZmF1bHQuYWVhZF9wcm90ZWN0X3ZlcnNpb24gPT09IDQgPyBfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LmFlYWQsIHRoaXMuYWVhZEFsZ29yaXRobSkgOiBfZW51bXMyLmRlZmF1bHQuYWVhZC5leHBlcmltZW50YWxfZ2NtO1xuICAgICAgICAgICAgbW9kZSA9IF9jcnlwdG8yLmRlZmF1bHRbX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LmFlYWQsIHRoaXMuYWVhZEFsZ28pXTtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNTtcbiAgICAgICAgICAgIHJldHVybiBfY3J5cHRvMi5kZWZhdWx0LnJhbmRvbS5nZXRSYW5kb21CeXRlcyhtb2RlLml2TGVuZ3RoKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHRoaXMuaXYgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgIC8vIGdlbmVyYXRlIG5ldyByYW5kb20gSVZcbiAgICAgICAgICAgIHRoaXMuY2h1bmtTaXplQnl0ZSA9IF9jb25maWcyLmRlZmF1bHQuYWVhZF9jaHVua19zaXplX2J5dGU7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy5wYWNrZXRzLndyaXRlKCk7XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEwO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3J5cHQoJ2VuY3J5cHQnLCBrZXksIGRhdGEsIGRhdGEuc3ViYXJyYXkoMCwgMCkpO1xuXG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIHRoaXMuZW5jcnlwdGVkID0gX2NvbnRleHQyLnNlbnQ7XG5cbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3gzLCBfeDQpIHtcbiAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBFbi9kZWNyeXB0IHRoZSBwYXlsb2FkLlxuICogQHBhcmFtICB7ZW5jcnlwdHxkZWNyeXB0fSBmbiAgICAgIFdoZXRoZXIgdG8gZW5jcnlwdCBvciBkZWNyeXB0XG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSBrZXkgICAgICAgICAgVGhlIHNlc3Npb24ga2V5IHVzZWQgdG8gZW4vZGVjcnlwdCB0aGUgcGF5bG9hZFxuICogQHBhcmFtICB7VWludDhBcnJheX0gZGF0YSAgICAgICAgIFRoZSBkYXRhIHRvIGVuL2RlY3J5cHRcbiAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IGZpbmFsQ2h1bmsgICBGb3IgZW5jcnlwdGlvbjogZW1wdHkgZmluYWwgY2h1bms7IGZvciBkZWNyeXB0aW9uOiBmaW5hbCBhdXRoZW50aWNhdGlvbiB0YWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPFVpbnQ4QXJyYXk+fVxuICogQGFzeW5jXG4gKi9cblN5bUVuY3J5cHRlZEFFQURQcm90ZWN0ZWQucHJvdG90eXBlLmNyeXB0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjMgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IzLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yMi5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMoZm4sIGtleSwgZGF0YSwgZmluYWxDaHVuaykge1xuICAgIHZhciBjaXBoZXIsIG1vZGUsIG1vZGVJbnN0YW5jZSwgdGFnTGVuZ3RoSWZEZWNyeXB0aW5nLCBjaHVua1NpemUsIGFkYXRhQnVmZmVyLCBhZGF0YUFycmF5LCBhZGF0YVRhZ0FycmF5LCBhZGF0YVZpZXcsIGNodW5rSW5kZXhBcnJheSwgY3J5cHRlZFByb21pc2VzLCBjaHVua0luZGV4O1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjaXBoZXIgPSBfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQuc3ltbWV0cmljLCB0aGlzLmNpcGhlckFsZ28pO1xuICAgICAgICAgICAgbW9kZSA9IF9jcnlwdG8yLmRlZmF1bHRbX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LmFlYWQsIHRoaXMuYWVhZEFsZ28pXTtcbiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNDtcbiAgICAgICAgICAgIHJldHVybiBtb2RlKGNpcGhlciwga2V5KTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIG1vZGVJbnN0YW5jZSA9IF9jb250ZXh0My5zZW50O1xuXG4gICAgICAgICAgICBpZiAoIShfY29uZmlnMi5kZWZhdWx0LmFlYWRfcHJvdGVjdF92ZXJzaW9uID09PSA0KSkge1xuICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDI1O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGFnTGVuZ3RoSWZEZWNyeXB0aW5nID0gZm4gPT09ICdkZWNyeXB0JyA/IG1vZGUudGFnTGVuZ3RoIDogMDtcbiAgICAgICAgICAgIGNodW5rU2l6ZSA9IE1hdGgucG93KDIsIHRoaXMuY2h1bmtTaXplQnl0ZSArIDYpICsgdGFnTGVuZ3RoSWZEZWNyeXB0aW5nOyAvLyAoKHVpbnQ2NF90KTEgPDwgKGMgKyA2KSlcblxuICAgICAgICAgICAgYWRhdGFCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoMjEpO1xuICAgICAgICAgICAgYWRhdGFBcnJheSA9IG5ldyBVaW50OEFycmF5KGFkYXRhQnVmZmVyLCAwLCAxMyk7XG4gICAgICAgICAgICBhZGF0YVRhZ0FycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYWRhdGFCdWZmZXIpO1xuICAgICAgICAgICAgYWRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFkYXRhQnVmZmVyKTtcbiAgICAgICAgICAgIGNodW5rSW5kZXhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFkYXRhQnVmZmVyLCA1LCA4KTtcblxuICAgICAgICAgICAgYWRhdGFBcnJheS5zZXQoWzB4QzAgfCB0aGlzLnRhZywgdGhpcy52ZXJzaW9uLCB0aGlzLmNpcGhlckFsZ28sIHRoaXMuYWVhZEFsZ28sIHRoaXMuY2h1bmtTaXplQnl0ZV0sIDApO1xuICAgICAgICAgICAgYWRhdGFWaWV3LnNldEludDMyKDEzICsgNCwgZGF0YS5sZW5ndGggLSB0YWdMZW5ndGhJZkRlY3J5cHRpbmcgKiBNYXRoLmNlaWwoZGF0YS5sZW5ndGggLyBjaHVua1NpemUpKTsgLy8gU2hvdWxkIGJlIHNldEludDY0KDEzLCAuLi4pXG4gICAgICAgICAgICBjcnlwdGVkUHJvbWlzZXMgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChjaHVua0luZGV4ID0gMDsgY2h1bmtJbmRleCA9PT0gMCB8fCBkYXRhLmxlbmd0aDspIHtcbiAgICAgICAgICAgICAgY3J5cHRlZFByb21pc2VzLnB1c2gobW9kZUluc3RhbmNlW2ZuXShkYXRhLnN1YmFycmF5KDAsIGNodW5rU2l6ZSksIG1vZGUuZ2V0Tm9uY2UodGhpcy5pdiwgY2h1bmtJbmRleEFycmF5KSwgYWRhdGFBcnJheSkpO1xuICAgICAgICAgICAgICAvLyBXZSB0YWtlIGEgY2h1bmsgb2YgZGF0YSwgZW4vZGVjcnlwdCBpdCwgYW5kIHNoaWZ0IGBkYXRhYCB0byB0aGVcbiAgICAgICAgICAgICAgLy8gbmV4dCBjaHVuay5cbiAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc3ViYXJyYXkoY2h1bmtTaXplKTtcbiAgICAgICAgICAgICAgYWRhdGFWaWV3LnNldEludDMyKDUgKyA0LCArK2NodW5rSW5kZXgpOyAvLyBTaG91bGQgYmUgc2V0SW50NjQoNSwgLi4uKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWZ0ZXIgdGhlIGZpbmFsIGNodW5rLCB3ZSBlaXRoZXIgZW5jcnlwdCBhIGZpbmFsLCBlbXB0eSBkYXRhXG4gICAgICAgICAgICAvLyBjaHVuayB0byBnZXQgdGhlIGZpbmFsIGF1dGhlbnRpY2F0aW9uIHRhZyBvciB2YWxpZGF0ZSB0aGF0IGZpbmFsXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiB0YWcuXG4gICAgICAgICAgICBjcnlwdGVkUHJvbWlzZXMucHVzaChtb2RlSW5zdGFuY2VbZm5dKGZpbmFsQ2h1bmssIG1vZGUuZ2V0Tm9uY2UodGhpcy5pdiwgY2h1bmtJbmRleEFycmF5KSwgYWRhdGFUYWdBcnJheSkpO1xuICAgICAgICAgICAgX2NvbnRleHQzLnQwID0gX3V0aWwyLmRlZmF1bHQ7XG4gICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDIxO1xuICAgICAgICAgICAgcmV0dXJuIF9wcm9taXNlMi5kZWZhdWx0LmFsbChjcnlwdGVkUHJvbWlzZXMpO1xuXG4gICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgIF9jb250ZXh0My50MSA9IF9jb250ZXh0My5zZW50O1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoJ3JldHVybicsIF9jb250ZXh0My50MC5jb25jYXRVaW50OEFycmF5LmNhbGwoX2NvbnRleHQzLnQwLCBfY29udGV4dDMudDEpKTtcblxuICAgICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgncmV0dXJuJywgbW9kZUluc3RhbmNlW2ZuXShkYXRhLCB0aGlzLml2KSk7XG5cbiAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUzLCB0aGlzKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoX3g1LCBfeDYsIF94NywgX3g4KSB7XG4gICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbn0se1wiLi4vY29uZmlnXCI6MzI1LFwiLi4vY3J5cHRvXCI6MzQwLFwiLi4vZW51bXNcIjozNTksXCIuLi91dGlsXCI6Mzk4LFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL3Byb21pc2VcIjozMixcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI6MzUsXCJiYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yXCI6NDJ9XSwzODQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvcicpO1xuXG52YXIgX3JlZ2VuZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZ2VuZXJhdG9yKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJyk7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3luY1RvR2VuZXJhdG9yMik7XG5cbnZhciBfZXhwb3J0cyA9IF9kZXJlcV8oJ2FzbWNyeXB0by5qcy9zcmMvYWVzL2NmYi9leHBvcnRzJyk7XG5cbnZhciBfY3J5cHRvID0gX2RlcmVxXygnLi4vY3J5cHRvJyk7XG5cbnZhciBfY3J5cHRvMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyeXB0byk7XG5cbnZhciBfZW51bXMgPSBfZGVyZXFfKCcuLi9lbnVtcycpO1xuXG52YXIgX2VudW1zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VudW1zKTtcblxudmFyIF91dGlsID0gX2RlcmVxXygnLi4vdXRpbCcpO1xuXG52YXIgX3V0aWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQHJlcXVpcmVzIGFzbWNyeXB0by5qc1xuICogQHJlcXVpcmVzIGNyeXB0b1xuICogQHJlcXVpcmVzIGVudW1zXG4gKiBAcmVxdWlyZXMgdXRpbFxuICovXG5cbnZhciBub2RlQ3J5cHRvID0gX3V0aWwyLmRlZmF1bHQuZ2V0Tm9kZUNyeXB0bygpO1xudmFyIEJ1ZmZlciA9IF91dGlsMi5kZWZhdWx0LmdldE5vZGVCdWZmZXIoKTtcblxudmFyIFZFUlNJT04gPSAxOyAvLyBBIG9uZS1vY3RldCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZGF0YSBwYWNrZXQuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN5bS4gRW5jcnlwdGVkIEludGVncml0eSBQcm90ZWN0ZWQgRGF0YSBQYWNrZXQgKFRhZyAxOClcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi01LjEzfFJGQzQ4ODAgNS4xM306XG4gKiBUaGUgU3ltbWV0cmljYWxseSBFbmNyeXB0ZWQgSW50ZWdyaXR5IFByb3RlY3RlZCBEYXRhIHBhY2tldCBpc1xuICogYSB2YXJpYW50IG9mIHRoZSBTeW1tZXRyaWNhbGx5IEVuY3J5cHRlZCBEYXRhIHBhY2tldC4gSXQgaXMgYSBuZXcgZmVhdHVyZVxuICogY3JlYXRlZCBmb3IgT3BlblBHUCB0aGF0IGFkZHJlc3NlcyB0aGUgcHJvYmxlbSBvZiBkZXRlY3RpbmcgYSBtb2RpZmljYXRpb24gdG9cbiAqIGVuY3J5cHRlZCBkYXRhLiBJdCBpcyB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggYSBNb2RpZmljYXRpb24gRGV0ZWN0aW9uIENvZGVcbiAqIHBhY2tldC5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6cGFja2V0XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gU3ltRW5jcnlwdGVkSW50ZWdyaXR5UHJvdGVjdGVkKCkge1xuICB0aGlzLnRhZyA9IF9lbnVtczIuZGVmYXVsdC5wYWNrZXQuc3ltRW5jcnlwdGVkSW50ZWdyaXR5UHJvdGVjdGVkO1xuICB0aGlzLnZlcnNpb24gPSBWRVJTSU9OO1xuICAvKiogVGhlIGVuY3J5cHRlZCBwYXlsb2FkLiAqL1xuICB0aGlzLmVuY3J5cHRlZCA9IG51bGw7IC8vIHN0cmluZ1xuICAvKipcbiAgICogSWYgYWZ0ZXIgZGVjcnlwdGluZyB0aGUgcGFja2V0IHRoaXMgaXMgc2V0IHRvIHRydWUsXG4gICAqIGEgbW9kaWZpY2F0aW9uIGhhcyBiZWVuIGRldGVjdGVkIGFuZCB0aHVzIHRoZSBjb250ZW50c1xuICAgKiBzaG91bGQgYmUgZGlzY2FyZGVkLlxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICovXG4gIHRoaXMubW9kaWZpY2F0aW9uID0gZmFsc2U7XG4gIHRoaXMucGFja2V0cyA9IG51bGw7XG59XG5cblN5bUVuY3J5cHRlZEludGVncml0eVByb3RlY3RlZC5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChieXRlcykge1xuICAvLyAtIEEgb25lLW9jdGV0IHZlcnNpb24gbnVtYmVyLiBUaGUgb25seSBjdXJyZW50bHkgZGVmaW5lZCB2YWx1ZSBpcyAxLlxuICBpZiAoYnl0ZXNbMF0gIT09IFZFUlNJT04pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFja2V0IHZlcnNpb24uJyk7XG4gIH1cblxuICAvLyAtIEVuY3J5cHRlZCBkYXRhLCB0aGUgb3V0cHV0IG9mIHRoZSBzZWxlY3RlZCBzeW1tZXRyaWMta2V5IGNpcGhlclxuICAvLyAgIG9wZXJhdGluZyBpbiBDaXBoZXIgRmVlZGJhY2sgbW9kZSB3aXRoIHNoaWZ0IGFtb3VudCBlcXVhbCB0byB0aGVcbiAgLy8gICBibG9jayBzaXplIG9mIHRoZSBjaXBoZXIgKENGQi1uIHdoZXJlIG4gaXMgdGhlIGJsb2NrIHNpemUpLlxuICB0aGlzLmVuY3J5cHRlZCA9IGJ5dGVzLnN1YmFycmF5KDEsIGJ5dGVzLmxlbmd0aCk7XG59O1xuXG5TeW1FbmNyeXB0ZWRJbnRlZ3JpdHlQcm90ZWN0ZWQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbbmV3IFVpbnQ4QXJyYXkoW1ZFUlNJT05dKSwgdGhpcy5lbmNyeXB0ZWRdKTtcbn07XG5cbi8qKlxuICogRW5jcnlwdCB0aGUgcGF5bG9hZCBpbiB0aGUgcGFja2V0LlxuICogQHBhcmFtICB7U3RyaW5nfSBzZXNzaW9uS2V5QWxnb3JpdGhtICAgVGhlIHNlbGVjdGVkIHN5bW1ldHJpYyBlbmNyeXB0aW9uIGFsZ29yaXRobSB0byBiZSB1c2VkIGUuZy4gJ2FlczEyOCdcbiAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9IGtleSAgICAgICAgICAgICAgIFRoZSBrZXkgb2YgY2lwaGVyIGJsb2Nrc2l6ZSBsZW5ndGggdG8gYmUgdXNlZFxuICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59XG4gKiBAYXN5bmNcbiAqL1xuU3ltRW5jcnlwdGVkSW50ZWdyaXR5UHJvdGVjdGVkLnByb3RvdHlwZS5lbmNyeXB0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlKHNlc3Npb25LZXlBbGdvcml0aG0sIGtleSkge1xuICAgIHZhciBieXRlcywgcHJlZml4cmFuZG9tLCByZXBlYXQsIHByZWZpeCwgbWRjLCB0b2hhc2gsIGhhc2g7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgYnl0ZXMgPSB0aGlzLnBhY2tldHMud3JpdGUoKTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgICAgcmV0dXJuIF9jcnlwdG8yLmRlZmF1bHQuZ2V0UHJlZml4UmFuZG9tKHNlc3Npb25LZXlBbGdvcml0aG0pO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcHJlZml4cmFuZG9tID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIHJlcGVhdCA9IG5ldyBVaW50OEFycmF5KFtwcmVmaXhyYW5kb21bcHJlZml4cmFuZG9tLmxlbmd0aCAtIDJdLCBwcmVmaXhyYW5kb21bcHJlZml4cmFuZG9tLmxlbmd0aCAtIDFdXSk7XG4gICAgICAgICAgICBwcmVmaXggPSBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFtwcmVmaXhyYW5kb20sIHJlcGVhdF0pO1xuICAgICAgICAgICAgbWRjID0gbmV3IFVpbnQ4QXJyYXkoWzB4RDMsIDB4MTRdKTsgLy8gbW9kaWZpY2F0aW9uIGRldGVjdGlvbiBjb2RlIHBhY2tldFxuXG4gICAgICAgICAgICB0b2hhc2ggPSBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFtieXRlcywgbWRjXSk7XG4gICAgICAgICAgICBoYXNoID0gX2NyeXB0bzIuZGVmYXVsdC5oYXNoLnNoYTEoX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbcHJlZml4LCB0b2hhc2hdKSk7XG5cbiAgICAgICAgICAgIHRvaGFzaCA9IF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW3RvaGFzaCwgaGFzaF0pO1xuXG4gICAgICAgICAgICBpZiAoc2Vzc2lvbktleUFsZ29yaXRobS5zdWJzdHIoMCwgMykgPT09ICdhZXMnKSB7XG4gICAgICAgICAgICAgIC8vIEFFUyBvcHRpbWl6YXRpb25zLiBOYXRpdmUgY29kZSBmb3Igbm9kZSwgYXNtQ3J5cHRvIGZvciBicm93c2VyLlxuICAgICAgICAgICAgICB0aGlzLmVuY3J5cHRlZCA9IGFlc0VuY3J5cHQoc2Vzc2lvbktleUFsZ29yaXRobSwgcHJlZml4LCB0b2hhc2gsIGtleSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmVuY3J5cHRlZCA9IF9jcnlwdG8yLmRlZmF1bHQuY2ZiLmVuY3J5cHQocHJlZml4cmFuZG9tLCBzZXNzaW9uS2V5QWxnb3JpdGhtLCB0b2hhc2gsIGtleSwgZmFsc2UpO1xuICAgICAgICAgICAgICB0aGlzLmVuY3J5cHRlZCA9IHRoaXMuZW5jcnlwdGVkLnN1YmFycmF5KDAsIHByZWZpeC5sZW5ndGggKyB0b2hhc2gubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIHRydWUpO1xuXG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChfeCwgX3gyKSB7XG4gICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuLyoqXG4gKiBEZWNyeXB0cyB0aGUgZW5jcnlwdGVkIGRhdGEgY29udGFpbmVkIGluIHRoZSBwYWNrZXQuXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHNlc3Npb25LZXlBbGdvcml0aG0gICBUaGUgc2VsZWN0ZWQgc3ltbWV0cmljIGVuY3J5cHRpb24gYWxnb3JpdGhtIHRvIGJlIHVzZWQgZS5nLiAnYWVzMTI4J1xuICogQHBhcmFtICB7VWludDhBcnJheX0ga2V5ICAgICAgICAgICAgICAgVGhlIGtleSBvZiBjaXBoZXIgYmxvY2tzaXplIGxlbmd0aCB0byBiZSB1c2VkXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn1cbiAqIEBhc3luY1xuICovXG5TeW1FbmNyeXB0ZWRJbnRlZ3JpdHlQcm90ZWN0ZWQucHJvdG90eXBlLmRlY3J5cHQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMihzZXNzaW9uS2V5QWxnb3JpdGhtLCBrZXkpIHtcbiAgICB2YXIgZGVjcnlwdGVkLCBwcmVmaXgsIGJ5dGVzLCB0b2hhc2gsIG1kYztcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgZGVjcnlwdGVkID0gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAoc2Vzc2lvbktleUFsZ29yaXRobS5zdWJzdHIoMCwgMykgPT09ICdhZXMnKSB7XG4gICAgICAgICAgICAgIC8vIEFFUyBvcHRpbWl6YXRpb25zLiBOYXRpdmUgY29kZSBmb3Igbm9kZSwgYXNtQ3J5cHRvIGZvciBicm93c2VyLlxuICAgICAgICAgICAgICBkZWNyeXB0ZWQgPSBhZXNEZWNyeXB0KHNlc3Npb25LZXlBbGdvcml0aG0sIHRoaXMuZW5jcnlwdGVkLCBrZXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVjcnlwdGVkID0gX2NyeXB0bzIuZGVmYXVsdC5jZmIuZGVjcnlwdChzZXNzaW9uS2V5QWxnb3JpdGhtLCBrZXksIHRoaXMuZW5jcnlwdGVkLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHRoZXJlIG11c3QgYmUgYSBtb2RpZmljYXRpb24gZGV0ZWN0aW9uIGNvZGUgcGFja2V0IGFzIHRoZVxuICAgICAgICAgICAgLy8gbGFzdCBwYWNrZXQgYW5kIGV2ZXJ5dGhpbmcgZ2V0cyBoYXNoZWQgZXhjZXB0IHRoZSBoYXNoIGl0c2VsZlxuICAgICAgICAgICAgcHJlZml4ID0gX2NyeXB0bzIuZGVmYXVsdC5jZmIubWRjKHNlc3Npb25LZXlBbGdvcml0aG0sIGtleSwgdGhpcy5lbmNyeXB0ZWQpO1xuICAgICAgICAgICAgYnl0ZXMgPSBkZWNyeXB0ZWQuc3ViYXJyYXkoMCwgZGVjcnlwdGVkLmxlbmd0aCAtIDIwKTtcbiAgICAgICAgICAgIHRvaGFzaCA9IF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW3ByZWZpeCwgYnl0ZXNdKTtcblxuICAgICAgICAgICAgdGhpcy5oYXNoID0gX3V0aWwyLmRlZmF1bHQuVWludDhBcnJheV90b19zdHIoX2NyeXB0bzIuZGVmYXVsdC5oYXNoLnNoYTEodG9oYXNoKSk7XG4gICAgICAgICAgICBtZGMgPSBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cihkZWNyeXB0ZWQuc3ViYXJyYXkoZGVjcnlwdGVkLmxlbmd0aCAtIDIwLCBkZWNyeXB0ZWQubGVuZ3RoKSk7XG5cbiAgICAgICAgICAgIGlmICghKHRoaXMuaGFzaCAhPT0gbWRjKSkge1xuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDExO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb2RpZmljYXRpb24gZGV0ZWN0ZWQuJyk7XG5cbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgdGhpcy5wYWNrZXRzLnJlYWQoZGVjcnlwdGVkLnN1YmFycmF5KDAsIGRlY3J5cHRlZC5sZW5ndGggLSAyMikpO1xuXG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCdyZXR1cm4nLCB0cnVlKTtcblxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTIsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChfeDMsIF94NCkge1xuICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBTeW1FbmNyeXB0ZWRJbnRlZ3JpdHlQcm90ZWN0ZWQ7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgICAgICAgICAgICAgICAgICAgICAvL1xuLy8gICBIZWxwZXIgZnVuY3Rpb25zICAgLy9cbi8vICAgICAgICAgICAgICAgICAgICAgIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cbmZ1bmN0aW9uIGFlc0VuY3J5cHQoYWxnbywgcHJlZml4LCBwdCwga2V5KSB7XG4gIGlmIChub2RlQ3J5cHRvKSB7XG4gICAgLy8gTm9kZSBjcnlwdG8gbGlicmFyeS5cbiAgICByZXR1cm4gbm9kZUVuY3J5cHQoYWxnbywgcHJlZml4LCBwdCwga2V5KTtcbiAgfSAvLyBhc20uanMgZmFsbGJhY2tcbiAgcmV0dXJuIF9leHBvcnRzLkFFU19DRkIuZW5jcnlwdChfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFtwcmVmaXgsIHB0XSksIGtleSk7XG59XG5cbmZ1bmN0aW9uIGFlc0RlY3J5cHQoYWxnbywgY3QsIGtleSkge1xuICB2YXIgcHQgPSB2b2lkIDA7XG4gIGlmIChub2RlQ3J5cHRvKSB7XG4gICAgLy8gTm9kZSBjcnlwdG8gbGlicmFyeS5cbiAgICBwdCA9IG5vZGVEZWNyeXB0KGFsZ28sIGN0LCBrZXkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGFzbS5qcyBmYWxsYmFja1xuICAgIHB0ID0gX2V4cG9ydHMuQUVTX0NGQi5kZWNyeXB0KGN0LCBrZXkpO1xuICB9XG4gIHJldHVybiBwdC5zdWJhcnJheShfY3J5cHRvMi5kZWZhdWx0LmNpcGhlclthbGdvXS5ibG9ja1NpemUgKyAyLCBwdC5sZW5ndGgpOyAvLyBSZW1vdmUgcmFuZG9tIHByZWZpeFxufVxuXG5mdW5jdGlvbiBub2RlRW5jcnlwdChhbGdvLCBwcmVmaXgsIHB0LCBrZXkpIHtcbiAga2V5ID0gbmV3IEJ1ZmZlcihrZXkpO1xuICB2YXIgaXYgPSBuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KF9jcnlwdG8yLmRlZmF1bHQuY2lwaGVyW2FsZ29dLmJsb2NrU2l6ZSkpO1xuICB2YXIgY2lwaGVyT2JqID0gbmV3IG5vZGVDcnlwdG8uY3JlYXRlQ2lwaGVyaXYoJ2Flcy0nICsgYWxnby5zdWJzdHIoMywgMykgKyAnLWNmYicsIGtleSwgaXYpO1xuICB2YXIgY3QgPSBjaXBoZXJPYmoudXBkYXRlKG5ldyBCdWZmZXIoX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbcHJlZml4LCBwdF0pKSk7XG4gIHJldHVybiBuZXcgVWludDhBcnJheShjdCk7XG59XG5cbmZ1bmN0aW9uIG5vZGVEZWNyeXB0KGFsZ28sIGN0LCBrZXkpIHtcbiAgY3QgPSBuZXcgQnVmZmVyKGN0KTtcbiAga2V5ID0gbmV3IEJ1ZmZlcihrZXkpO1xuICB2YXIgaXYgPSBuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KF9jcnlwdG8yLmRlZmF1bHQuY2lwaGVyW2FsZ29dLmJsb2NrU2l6ZSkpO1xuICB2YXIgZGVjaXBoZXJPYmogPSBuZXcgbm9kZUNyeXB0by5jcmVhdGVEZWNpcGhlcml2KCdhZXMtJyArIGFsZ28uc3Vic3RyKDMsIDMpICsgJy1jZmInLCBrZXksIGl2KTtcbiAgdmFyIHB0ID0gZGVjaXBoZXJPYmoudXBkYXRlKGN0KTtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHB0KTtcbn1cblxufSx7XCIuLi9jcnlwdG9cIjozNDAsXCIuLi9lbnVtc1wiOjM1OSxcIi4uL3V0aWxcIjozOTgsXCJhc21jcnlwdG8uanMvc3JjL2Flcy9jZmIvZXhwb3J0c1wiOjcsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiOjM1LFwiYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvclwiOjQyfV0sMzg1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3InKTtcblxudmFyIF9yZWdlbmVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWdlbmVyYXRvcik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvcicpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXN5bmNUb0dlbmVyYXRvcjIpO1xuXG52YXIgX3MyayA9IF9kZXJlcV8oJy4uL3R5cGUvczJrJyk7XG5cbnZhciBfczJrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Myayk7XG5cbnZhciBfY29uZmlnID0gX2RlcmVxXygnLi4vY29uZmlnJyk7XG5cbnZhciBfY29uZmlnMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbmZpZyk7XG5cbnZhciBfY3J5cHRvID0gX2RlcmVxXygnLi4vY3J5cHRvJyk7XG5cbnZhciBfY3J5cHRvMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyeXB0byk7XG5cbnZhciBfZW51bXMgPSBfZGVyZXFfKCcuLi9lbnVtcycpO1xuXG52YXIgX2VudW1zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VudW1zKTtcblxudmFyIF91dGlsID0gX2RlcmVxXygnLi4vdXRpbCcpO1xuXG52YXIgX3V0aWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogUHVibGljLUtleSBFbmNyeXB0ZWQgU2Vzc2lvbiBLZXkgUGFja2V0cyAoVGFnIDEpXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tNS4xfFJGQzQ4ODAgNS4xfTpcbiAqIEEgUHVibGljLUtleSBFbmNyeXB0ZWQgU2Vzc2lvbiBLZXkgcGFja2V0IGhvbGRzIHRoZSBzZXNzaW9uIGtleVxuICogdXNlZCB0byBlbmNyeXB0IGEgbWVzc2FnZS4gWmVybyBvciBtb3JlIFB1YmxpYy1LZXkgRW5jcnlwdGVkIFNlc3Npb24gS2V5XG4gKiBwYWNrZXRzIGFuZC9vciBTeW1tZXRyaWMtS2V5IEVuY3J5cHRlZCBTZXNzaW9uIEtleSBwYWNrZXRzIG1heSBwcmVjZWRlIGFcbiAqIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgUGFja2V0LCB3aGljaCBob2xkcyBhbiBlbmNyeXB0ZWQgbWVzc2FnZS4gVGhlXG4gKiBtZXNzYWdlIGlzIGVuY3J5cHRlZCB3aXRoIHRoZSBzZXNzaW9uIGtleSwgYW5kIHRoZSBzZXNzaW9uIGtleSBpcyBpdHNlbGZcbiAqIGVuY3J5cHRlZCBhbmQgc3RvcmVkIGluIHRoZSBFbmNyeXB0ZWQgU2Vzc2lvbiBLZXkgcGFja2V0KHMpLiBUaGVcbiAqIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgUGFja2V0IGlzIHByZWNlZGVkIGJ5IG9uZSBQdWJsaWMtS2V5IEVuY3J5cHRlZFxuICogU2Vzc2lvbiBLZXkgcGFja2V0IGZvciBlYWNoIE9wZW5QR1Aga2V5IHRvIHdoaWNoIHRoZSBtZXNzYWdlIGlzIGVuY3J5cHRlZC5cbiAqIFRoZSByZWNpcGllbnQgb2YgdGhlIG1lc3NhZ2UgZmluZHMgYSBzZXNzaW9uIGtleSB0aGF0IGlzIGVuY3J5cHRlZCB0byB0aGVpclxuICogcHVibGljIGtleSwgZGVjcnlwdHMgdGhlIHNlc3Npb24ga2V5LCBhbmQgdGhlbiB1c2VzIHRoZSBzZXNzaW9uIGtleSB0b1xuICogZGVjcnlwdCB0aGUgbWVzc2FnZS5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6cGFja2V0XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gU3ltRW5jcnlwdGVkU2Vzc2lvbktleSgpIHtcbiAgdGhpcy50YWcgPSBfZW51bXMyLmRlZmF1bHQucGFja2V0LnN5bUVuY3J5cHRlZFNlc3Npb25LZXk7XG4gIHRoaXMudmVyc2lvbiA9IF9jb25maWcyLmRlZmF1bHQuYWVhZF9wcm90ZWN0ICYmIF9jb25maWcyLmRlZmF1bHQuYWVhZF9wcm90ZWN0X3ZlcnNpb24gPT09IDQgPyA1IDogNDtcbiAgdGhpcy5zZXNzaW9uS2V5ID0gbnVsbDtcbiAgdGhpcy5zZXNzaW9uS2V5RW5jcnlwdGlvbkFsZ29yaXRobSA9IG51bGw7XG4gIHRoaXMuc2Vzc2lvbktleUFsZ29yaXRobSA9ICdhZXMyNTYnO1xuICB0aGlzLmFlYWRBbGdvcml0aG0gPSBfZW51bXMyLmRlZmF1bHQucmVhZChfZW51bXMyLmRlZmF1bHQuYWVhZCwgX2NvbmZpZzIuZGVmYXVsdC5hZWFkX21vZGUpO1xuICB0aGlzLmVuY3J5cHRlZCA9IG51bGw7XG4gIHRoaXMuczJrID0gbnVsbDtcbiAgdGhpcy5pdiA9IG51bGw7XG59XG5cbi8qKlxuICogUGFyc2luZyBmdW5jdGlvbiBmb3IgYSBzeW1tZXRyaWMgZW5jcnlwdGVkIHNlc3Npb24ga2V5IHBhY2tldCAodGFnIDMpLlxuICpcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gaW5wdXQgUGF5bG9hZCBvZiBhIHRhZyAxIHBhY2tldFxuICogQHBhcmFtIHtJbnRlZ2VyfSBwb3NpdGlvbiBQb3NpdGlvbiB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGlucHV0IHN0cmluZ1xuICogQHBhcmFtIHtJbnRlZ2VyfSBsZW5cbiAqICAgICAgICAgICAgTGVuZ3RoIG9mIHRoZSBwYWNrZXQgb3IgdGhlIHJlbWFpbmluZyBsZW5ndGggb2ZcbiAqICAgICAgICAgICAgaW5wdXQgYXQgcG9zaXRpb25cbiAqIEByZXR1cm5zIHttb2R1bGU6cGFja2V0LlN5bUVuY3J5cHRlZFNlc3Npb25LZXl9IE9iamVjdCByZXByZXNlbnRhdGlvblxuICovXG4vLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEByZXF1aXJlcyB0eXBlL3Mya1xuICogQHJlcXVpcmVzIGNvbmZpZ1xuICogQHJlcXVpcmVzIGNyeXB0b1xuICogQHJlcXVpcmVzIGVudW1zXG4gKiBAcmVxdWlyZXMgdXRpbFxuICovXG5cblN5bUVuY3J5cHRlZFNlc3Npb25LZXkucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgdmFyIG9mZnNldCA9IDA7XG5cbiAgLy8gQSBvbmUtb2N0ZXQgdmVyc2lvbiBudW1iZXIuIFRoZSBvbmx5IGN1cnJlbnRseSBkZWZpbmVkIHZlcnNpb24gaXMgNC5cbiAgdGhpcy52ZXJzaW9uID0gYnl0ZXNbb2Zmc2V0KytdO1xuXG4gIC8vIEEgb25lLW9jdGV0IG51bWJlciBkZXNjcmliaW5nIHRoZSBzeW1tZXRyaWMgYWxnb3JpdGhtIHVzZWQuXG4gIHZhciBhbGdvID0gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LnN5bW1ldHJpYywgYnl0ZXNbb2Zmc2V0KytdKTtcblxuICBpZiAodGhpcy52ZXJzaW9uID09PSA1KSB7XG4gICAgLy8gQSBvbmUtb2N0ZXQgQUVBRCBhbGdvcml0aG0uXG4gICAgdGhpcy5hZWFkQWxnb3JpdGhtID0gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LmFlYWQsIGJ5dGVzW29mZnNldCsrXSk7XG4gIH1cblxuICAvLyBBIHN0cmluZy10by1rZXkgKFMySykgc3BlY2lmaWVyLCBsZW5ndGggYXMgZGVmaW5lZCBhYm92ZS5cbiAgdGhpcy5zMmsgPSBuZXcgX3MyazIuZGVmYXVsdCgpO1xuICBvZmZzZXQgKz0gdGhpcy5zMmsucmVhZChieXRlcy5zdWJhcnJheShvZmZzZXQsIGJ5dGVzLmxlbmd0aCkpO1xuXG4gIGlmICh0aGlzLnZlcnNpb24gPT09IDUpIHtcbiAgICB2YXIgbW9kZSA9IF9jcnlwdG8yLmRlZmF1bHRbdGhpcy5hZWFkQWxnb3JpdGhtXTtcblxuICAgIC8vIEEgc3RhcnRpbmcgaW5pdGlhbGl6YXRpb24gdmVjdG9yIG9mIHNpemUgc3BlY2lmaWVkIGJ5IHRoZSBBRUFEXG4gICAgLy8gYWxnb3JpdGhtLlxuICAgIHRoaXMuaXYgPSBieXRlcy5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArPSBtb2RlLml2TGVuZ3RoKTtcbiAgfVxuXG4gIC8vIFRoZSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXkgaXRzZWxmLCB3aGljaCBpcyBkZWNyeXB0ZWQgd2l0aCB0aGVcbiAgLy8gc3RyaW5nLXRvLWtleSBvYmplY3QuIFRoaXMgaXMgb3B0aW9uYWwgaW4gdmVyc2lvbiA0LlxuICBpZiAodGhpcy52ZXJzaW9uID09PSA1IHx8IG9mZnNldCA8IGJ5dGVzLmxlbmd0aCkge1xuICAgIHRoaXMuZW5jcnlwdGVkID0gYnl0ZXMuc3ViYXJyYXkob2Zmc2V0LCBieXRlcy5sZW5ndGgpO1xuICAgIHRoaXMuc2Vzc2lvbktleUVuY3J5cHRpb25BbGdvcml0aG0gPSBhbGdvO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc2Vzc2lvbktleUFsZ29yaXRobSA9IGFsZ287XG4gIH1cbn07XG5cblN5bUVuY3J5cHRlZFNlc3Npb25LZXkucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYWxnbyA9IHRoaXMuZW5jcnlwdGVkID09PSBudWxsID8gdGhpcy5zZXNzaW9uS2V5QWxnb3JpdGhtIDogdGhpcy5zZXNzaW9uS2V5RW5jcnlwdGlvbkFsZ29yaXRobTtcblxuICB2YXIgYnl0ZXMgPSB2b2lkIDA7XG5cbiAgaWYgKHRoaXMudmVyc2lvbiA9PT0gNSkge1xuICAgIGJ5dGVzID0gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbbmV3IFVpbnQ4QXJyYXkoW3RoaXMudmVyc2lvbiwgX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5zeW1tZXRyaWMsIGFsZ28pLCBfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LmFlYWQsIHRoaXMuYWVhZEFsZ29yaXRobSldKSwgdGhpcy5zMmsud3JpdGUoKSwgdGhpcy5pdiwgdGhpcy5lbmNyeXB0ZWRdKTtcbiAgfSBlbHNlIHtcbiAgICBieXRlcyA9IF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW25ldyBVaW50OEFycmF5KFt0aGlzLnZlcnNpb24sIF9lbnVtczIuZGVmYXVsdC53cml0ZShfZW51bXMyLmRlZmF1bHQuc3ltbWV0cmljLCBhbGdvKV0pLCB0aGlzLnMyay53cml0ZSgpXSk7XG5cbiAgICBpZiAodGhpcy5lbmNyeXB0ZWQgIT09IG51bGwpIHtcbiAgICAgIGJ5dGVzID0gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbYnl0ZXMsIHRoaXMuZW5jcnlwdGVkXSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufTtcblxuLyoqXG4gKiBEZWNyeXB0cyB0aGUgc2Vzc2lvbiBrZXlcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXNzcGhyYXNlIFRoZSBwYXNzcGhyYXNlIGluIHN0cmluZyBmb3JtXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn1cbiAqIEBhc3luY1xuICovXG5TeW1FbmNyeXB0ZWRTZXNzaW9uS2V5LnByb3RvdHlwZS5kZWNyeXB0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlKHBhc3NwaHJhc2UpIHtcbiAgICB2YXIgYWxnbywgbGVuZ3RoLCBrZXksIG1vZGUsIGFkYXRhLCBtb2RlSW5zdGFuY2UsIGRlY3J5cHRlZDtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBhbGdvID0gdGhpcy5zZXNzaW9uS2V5RW5jcnlwdGlvbkFsZ29yaXRobSAhPT0gbnVsbCA/IHRoaXMuc2Vzc2lvbktleUVuY3J5cHRpb25BbGdvcml0aG0gOiB0aGlzLnNlc3Npb25LZXlBbGdvcml0aG07XG4gICAgICAgICAgICBsZW5ndGggPSBfY3J5cHRvMi5kZWZhdWx0LmNpcGhlclthbGdvXS5rZXlTaXplO1xuICAgICAgICAgICAga2V5ID0gdGhpcy5zMmsucHJvZHVjZV9rZXkocGFzc3BocmFzZSwgbGVuZ3RoKTtcblxuICAgICAgICAgICAgaWYgKCEodGhpcy52ZXJzaW9uID09PSA1KSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtb2RlID0gX2NyeXB0bzIuZGVmYXVsdFt0aGlzLmFlYWRBbGdvcml0aG1dO1xuICAgICAgICAgICAgYWRhdGEgPSBuZXcgVWludDhBcnJheShbMHhDMCB8IHRoaXMudGFnLCB0aGlzLnZlcnNpb24sIF9lbnVtczIuZGVmYXVsdC53cml0ZShfZW51bXMyLmRlZmF1bHQuc3ltbWV0cmljLCB0aGlzLnNlc3Npb25LZXlFbmNyeXB0aW9uQWxnb3JpdGhtKSwgX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5hZWFkLCB0aGlzLmFlYWRBbGdvcml0aG0pXSk7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gODtcbiAgICAgICAgICAgIHJldHVybiBtb2RlKGFsZ28sIGtleSk7XG5cbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICBtb2RlSW5zdGFuY2UgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgICAgcmV0dXJuIG1vZGVJbnN0YW5jZS5kZWNyeXB0KHRoaXMuZW5jcnlwdGVkLCB0aGlzLml2LCBhZGF0YSk7XG5cbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uS2V5ID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIGlmICh0aGlzLmVuY3J5cHRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBkZWNyeXB0ZWQgPSBfY3J5cHRvMi5kZWZhdWx0LmNmYi5ub3JtYWxEZWNyeXB0KGFsZ28sIGtleSwgdGhpcy5lbmNyeXB0ZWQsIG51bGwpO1xuXG5cbiAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uS2V5QWxnb3JpdGhtID0gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LnN5bW1ldHJpYywgZGVjcnlwdGVkWzBdKTtcbiAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uS2V5ID0gZGVjcnlwdGVkLnN1YmFycmF5KDEsIGRlY3J5cHRlZC5sZW5ndGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uS2V5ID0ga2V5O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIHRydWUpO1xuXG4gICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChfeCkge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogRW5jcnlwdHMgdGhlIHNlc3Npb24ga2V5XG4gKiBAcGFyYW0ge1N0cmluZ30gcGFzc3BocmFzZSBUaGUgcGFzc3BocmFzZSBpbiBzdHJpbmcgZm9ybVxuICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59XG4gKiBAYXN5bmNcbiAqL1xuU3ltRW5jcnlwdGVkU2Vzc2lvbktleS5wcm90b3R5cGUuZW5jcnlwdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYyID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKHBhc3NwaHJhc2UpIHtcbiAgICB2YXIgYWxnbywgbGVuZ3RoLCBrZXksIG1vZGUsIGFkYXRhLCBtb2RlSW5zdGFuY2UsIGFsZ29fZW51bSwgcHJpdmF0ZV9rZXk7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvcjIuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGFsZ28gPSB0aGlzLnNlc3Npb25LZXlFbmNyeXB0aW9uQWxnb3JpdGhtICE9PSBudWxsID8gdGhpcy5zZXNzaW9uS2V5RW5jcnlwdGlvbkFsZ29yaXRobSA6IHRoaXMuc2Vzc2lvbktleUFsZ29yaXRobTtcblxuXG4gICAgICAgICAgICB0aGlzLnNlc3Npb25LZXlFbmNyeXB0aW9uQWxnb3JpdGhtID0gYWxnbztcblxuICAgICAgICAgICAgdGhpcy5zMmsgPSBuZXcgX3MyazIuZGVmYXVsdCgpO1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA1O1xuICAgICAgICAgICAgcmV0dXJuIF9jcnlwdG8yLmRlZmF1bHQucmFuZG9tLmdldFJhbmRvbUJ5dGVzKDgpO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgdGhpcy5zMmsuc2FsdCA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgICAgbGVuZ3RoID0gX2NyeXB0bzIuZGVmYXVsdC5jaXBoZXJbYWxnb10ua2V5U2l6ZTtcbiAgICAgICAgICAgIGtleSA9IHRoaXMuczJrLnByb2R1Y2Vfa2V5KHBhc3NwaHJhc2UsIGxlbmd0aCk7XG5cbiAgICAgICAgICAgIGlmICghKHRoaXMuc2Vzc2lvbktleSA9PT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTE7XG4gICAgICAgICAgICByZXR1cm4gX2NyeXB0bzIuZGVmYXVsdC5nZW5lcmF0ZVNlc3Npb25LZXkodGhpcy5zZXNzaW9uS2V5QWxnb3JpdGhtKTtcblxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25LZXkgPSBfY29udGV4dDIuc2VudDtcblxuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICBpZiAoISh0aGlzLnZlcnNpb24gPT09IDUpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtb2RlID0gX2NyeXB0bzIuZGVmYXVsdFt0aGlzLmFlYWRBbGdvcml0aG1dO1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNjtcbiAgICAgICAgICAgIHJldHVybiBfY3J5cHRvMi5kZWZhdWx0LnJhbmRvbS5nZXRSYW5kb21CeXRlcyhtb2RlLml2TGVuZ3RoKTtcblxuICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICB0aGlzLml2ID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICAvLyBnZW5lcmF0ZSBuZXcgcmFuZG9tIElWXG4gICAgICAgICAgICBhZGF0YSA9IG5ldyBVaW50OEFycmF5KFsweEMwIHwgdGhpcy50YWcsIHRoaXMudmVyc2lvbiwgX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5zeW1tZXRyaWMsIHRoaXMuc2Vzc2lvbktleUVuY3J5cHRpb25BbGdvcml0aG0pLCBfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LmFlYWQsIHRoaXMuYWVhZEFsZ29yaXRobSldKTtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjA7XG4gICAgICAgICAgICByZXR1cm4gbW9kZShhbGdvLCBrZXkpO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgIG1vZGVJbnN0YW5jZSA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyMztcbiAgICAgICAgICAgIHJldHVybiBtb2RlSW5zdGFuY2UuZW5jcnlwdCh0aGlzLnNlc3Npb25LZXksIHRoaXMuaXYsIGFkYXRhKTtcblxuICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICB0aGlzLmVuY3J5cHRlZCA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyOTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICAgIGFsZ29fZW51bSA9IG5ldyBVaW50OEFycmF5KFtfZW51bXMyLmRlZmF1bHQud3JpdGUoX2VudW1zMi5kZWZhdWx0LnN5bW1ldHJpYywgdGhpcy5zZXNzaW9uS2V5QWxnb3JpdGhtKV0pO1xuICAgICAgICAgICAgcHJpdmF0ZV9rZXkgPSBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFthbGdvX2VudW0sIHRoaXMuc2Vzc2lvbktleV0pO1xuXG4gICAgICAgICAgICB0aGlzLmVuY3J5cHRlZCA9IF9jcnlwdG8yLmRlZmF1bHQuY2ZiLm5vcm1hbEVuY3J5cHQoYWxnbywga2V5LCBwcml2YXRlX2tleSwgbnVsbCk7XG5cbiAgICAgICAgICBjYXNlIDI5OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoJ3JldHVybicsIHRydWUpO1xuXG4gICAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94Mikge1xuICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIEZpeCBjdXN0b20gdHlwZXMgYWZ0ZXIgY2xvbmluZ1xuICovXG5TeW1FbmNyeXB0ZWRTZXNzaW9uS2V5LnByb3RvdHlwZS5wb3N0Q2xvbmVUeXBlRml4ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnMyayA9IF9zMmsyLmRlZmF1bHQuZnJvbUNsb25lKHRoaXMuczJrKTtcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFN5bUVuY3J5cHRlZFNlc3Npb25LZXk7XG5cbn0se1wiLi4vY29uZmlnXCI6MzI1LFwiLi4vY3J5cHRvXCI6MzQwLFwiLi4vZW51bXNcIjozNTksXCIuLi90eXBlL3Mya1wiOjM5NyxcIi4uL3V0aWxcIjozOTgsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiOjM1LFwiYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvclwiOjQyfV0sMzg2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3InKTtcblxudmFyIF9yZWdlbmVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWdlbmVyYXRvcik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjIgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvcicpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXN5bmNUb0dlbmVyYXRvcjIpO1xuXG52YXIgX2NvbmZpZyA9IF9kZXJlcV8oJy4uL2NvbmZpZycpO1xuXG52YXIgX2NvbmZpZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25maWcpO1xuXG52YXIgX2NyeXB0byA9IF9kZXJlcV8oJy4uL2NyeXB0bycpO1xuXG52YXIgX2NyeXB0bzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcnlwdG8pO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vZW51bXMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgUGFja2V0IChUYWcgOSlcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi01Ljd8UkZDNDg4MCA1Ljd9OlxuICogVGhlIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgcGFja2V0IGNvbnRhaW5zIGRhdGEgZW5jcnlwdGVkIHdpdGggYVxuICogc3ltbWV0cmljLWtleSBhbGdvcml0aG0uIFdoZW4gaXQgaGFzIGJlZW4gZGVjcnlwdGVkLCBpdCBjb250YWlucyBvdGhlclxuICogcGFja2V0cyAodXN1YWxseSBhIGxpdGVyYWwgZGF0YSBwYWNrZXQgb3IgY29tcHJlc3NlZCBkYXRhIHBhY2tldCwgYnV0IGluXG4gKiB0aGVvcnkgb3RoZXIgU3ltbWV0cmljYWxseSBFbmNyeXB0ZWQgRGF0YSBwYWNrZXRzIG9yIHNlcXVlbmNlcyBvZiBwYWNrZXRzXG4gKiB0aGF0IGZvcm0gd2hvbGUgT3BlblBHUCBtZXNzYWdlcykuXG4gKiBAbWVtYmVyb2YgbW9kdWxlOnBhY2tldFxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFN5bW1ldHJpY2FsbHlFbmNyeXB0ZWQoKSB7XG4gIC8qKlxuICAgKiBQYWNrZXQgdHlwZVxuICAgKiBAdHlwZSB7bW9kdWxlOmVudW1zLnBhY2tldH1cbiAgICovXG4gIHRoaXMudGFnID0gX2VudW1zMi5kZWZhdWx0LnBhY2tldC5zeW1tZXRyaWNhbGx5RW5jcnlwdGVkO1xuICAvKipcbiAgICogRW5jcnlwdGVkIHNlY3JldC1rZXkgZGF0YVxuICAgKi9cbiAgdGhpcy5lbmNyeXB0ZWQgPSBudWxsO1xuICAvKipcbiAgICogRGVjcnlwdGVkIHBhY2tldHMgY29udGFpbmVkIHdpdGhpbi5cbiAgICogQHR5cGUge21vZHVsZTpwYWNrZXQuTGlzdH1cbiAgICovXG4gIHRoaXMucGFja2V0cyA9IG51bGw7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIGRlY3J5cHQgZmFpbHMgaWYgbWVzc2FnZSBpcyBub3QgaW50ZWdyaXR5IHByb3RlY3RlZFxuICAgKiBAc2VlIG1vZHVsZTpjb25maWcuaWdub3JlX21kY19lcnJvclxuICAgKi9cbiAgdGhpcy5pZ25vcmVfbWRjX2Vycm9yID0gX2NvbmZpZzIuZGVmYXVsdC5pZ25vcmVfbWRjX2Vycm9yO1xufSAvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEByZXF1aXJlcyBjb25maWdcbiAqIEByZXF1aXJlcyBjcnlwdG9cbiAqIEByZXF1aXJlcyBlbnVtc1xuICovXG5cblN5bW1ldHJpY2FsbHlFbmNyeXB0ZWQucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgdGhpcy5lbmNyeXB0ZWQgPSBieXRlcztcbn07XG5cblN5bW1ldHJpY2FsbHlFbmNyeXB0ZWQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lbmNyeXB0ZWQ7XG59O1xuXG4vKipcbiAqIERlY3J5cHQgdGhlIHN5bW1ldHJpY2FsbHktZW5jcnlwdGVkIHBhY2tldCBkYXRhXG4gKiBTZWUge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tOS4yfFJGQyA0ODgwIDkuMn0gZm9yIGFsZ29yaXRobXMuXG4gKiBAcGFyYW0ge21vZHVsZTplbnVtcy5zeW1tZXRyaWN9IHNlc3Npb25LZXlBbGdvcml0aG0gU3ltbWV0cmljIGtleSBhbGdvcml0aG0gdG8gdXNlXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGtleSAgICBUaGUga2V5IG9mIGNpcGhlciBibG9ja3NpemUgbGVuZ3RoIHRvIGJlIHVzZWRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJvb2xlYW4+fVxuICogQGFzeW5jXG4gKi9cblN5bW1ldHJpY2FsbHlFbmNyeXB0ZWQucHJvdG90eXBlLmRlY3J5cHQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc2Vzc2lvbktleUFsZ29yaXRobSwga2V5KSB7XG4gICAgdmFyIGRlY3J5cHRlZDtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBkZWNyeXB0ZWQgPSBfY3J5cHRvMi5kZWZhdWx0LmNmYi5kZWNyeXB0KHNlc3Npb25LZXlBbGdvcml0aG0sIGtleSwgdGhpcy5lbmNyeXB0ZWQsIHRydWUpO1xuICAgICAgICAgICAgLy8gSWYgTURDIGVycm9ycyBhcmUgbm90IGJlaW5nIGlnbm9yZWQsIGFsbCBtaXNzaW5nIE1EQyBwYWNrZXRzIGluIHN5bW1ldHJpY2FsbHkgZW5jcnlwdGVkIGRhdGEgc2hvdWxkIHRocm93IGFuIGVycm9yXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlnbm9yZV9tZGNfZXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RlY3J5cHRpb24gZmFpbGVkIGR1ZSB0byBtaXNzaW5nIE1EQy4nKTtcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHRoaXMucGFja2V0cy5yZWFkKGRlY3J5cHRlZCk7XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoJ3JldHVybicsIHRydWUpO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94LCBfeDIpIHtcbiAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG4vKipcbiAqIEVuY3J5cHQgdGhlIHN5bW1ldHJpY2FsbHktZW5jcnlwdGVkIHBhY2tldCBkYXRhXG4gKiBTZWUge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tOS4yfFJGQyA0ODgwIDkuMn0gZm9yIGFsZ29yaXRobXMuXG4gKiBAcGFyYW0ge21vZHVsZTplbnVtcy5zeW1tZXRyaWN9IHNlc3Npb25LZXlBbGdvcml0aG0gU3ltbWV0cmljIGtleSBhbGdvcml0aG0gdG8gdXNlXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGtleSAgICBUaGUga2V5IG9mIGNpcGhlciBibG9ja3NpemUgbGVuZ3RoIHRvIGJlIHVzZWRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJvb2xlYW4+fVxuICogQGFzeW5jXG4gKi9cblN5bW1ldHJpY2FsbHlFbmNyeXB0ZWQucHJvdG90eXBlLmVuY3J5cHQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMiA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjMuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IyLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlMihhbGdvLCBrZXkpIHtcbiAgICB2YXIgZGF0YTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yMi5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgZGF0YSA9IHRoaXMucGFja2V0cy53cml0ZSgpO1xuICAgICAgICAgICAgX2NvbnRleHQyLnQwID0gX2NyeXB0bzIuZGVmYXVsdC5jZmI7XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDQ7XG4gICAgICAgICAgICByZXR1cm4gX2NyeXB0bzIuZGVmYXVsdC5nZXRQcmVmaXhSYW5kb20oYWxnbyk7XG5cbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBfY29udGV4dDIudDEgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgIF9jb250ZXh0Mi50MiA9IGFsZ287XG4gICAgICAgICAgICBfY29udGV4dDIudDMgPSBkYXRhO1xuICAgICAgICAgICAgX2NvbnRleHQyLnQ0ID0ga2V5O1xuICAgICAgICAgICAgdGhpcy5lbmNyeXB0ZWQgPSBfY29udGV4dDIudDAuZW5jcnlwdC5jYWxsKF9jb250ZXh0Mi50MCwgX2NvbnRleHQyLnQxLCBfY29udGV4dDIudDIsIF9jb250ZXh0Mi50MywgX2NvbnRleHQyLnQ0LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCdyZXR1cm4nLCB0cnVlKTtcblxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTIsIHRoaXMpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChfeDMsIF94NCkge1xuICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBTeW1tZXRyaWNhbGx5RW5jcnlwdGVkO1xuXG59LHtcIi4uL2NvbmZpZ1wiOjMyNSxcIi4uL2NyeXB0b1wiOjM0MCxcIi4uL2VudW1zXCI6MzU5LFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjozNSxcImJhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3JcIjo0Mn1dLDM4NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZW51bXMgPSBfZGVyZXFfKCcuLi9lbnVtcycpO1xuXG52YXIgX2VudW1zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VudW1zKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVHJ1c3QgUGFja2V0IChUYWcgMTIpXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tNS4xMHxSRkM0ODgwIDUuMTB9OlxuICogVGhlIFRydXN0IHBhY2tldCBpcyB1c2VkIG9ubHkgd2l0aGluIGtleXJpbmdzIGFuZCBpcyBub3Qgbm9ybWFsbHlcbiAqIGV4cG9ydGVkLiAgVHJ1c3QgcGFja2V0cyBjb250YWluIGRhdGEgdGhhdCByZWNvcmQgdGhlIHVzZXInc1xuICogc3BlY2lmaWNhdGlvbnMgb2Ygd2hpY2gga2V5IGhvbGRlcnMgYXJlIHRydXN0d29ydGh5IGludHJvZHVjZXJzLFxuICogYWxvbmcgd2l0aCBvdGhlciBpbmZvcm1hdGlvbiB0aGF0IGltcGxlbWVudGluZyBzb2Z0d2FyZSB1c2VzIGZvclxuICogdHJ1c3QgaW5mb3JtYXRpb24uICBUaGUgZm9ybWF0IG9mIFRydXN0IHBhY2tldHMgaXMgZGVmaW5lZCBieSBhIGdpdmVuXG4gKiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBUcnVzdCBwYWNrZXRzIFNIT1VMRCBOT1QgYmUgZW1pdHRlZCB0byBvdXRwdXQgc3RyZWFtcyB0aGF0IGFyZVxuICogdHJhbnNmZXJyZWQgdG8gb3RoZXIgdXNlcnMsIGFuZCB0aGV5IFNIT1VMRCBiZSBpZ25vcmVkIG9uIGFueSBpbnB1dFxuICogb3RoZXIgdGhhbiBsb2NhbCBrZXlyaW5nIGZpbGVzLlxuICogQG1lbWJlcm9mIG1vZHVsZTpwYWNrZXRcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBUcnVzdCgpIHtcbiAgdGhpcy50YWcgPSBfZW51bXMyLmRlZmF1bHQucGFja2V0LnRydXN0O1xufVxuXG4vKipcbiAqIFBhcnNpbmcgZnVuY3Rpb24gZm9yIGEgdHJ1c3QgcGFja2V0ICh0YWcgMTIpLlxuICogQ3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCBhcyB3ZSBpZ25vcmUgdHJ1c3QgcGFja2V0c1xuICogQHBhcmFtIHtTdHJpbmd9IGJ5cHRlcyBwYXlsb2FkIG9mIGEgdGFnIDEyIHBhY2tldFxuICovXG4vKipcbiAqIEByZXF1aXJlcyBlbnVtc1xuICovXG5cblRydXN0LnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKCkge307IC8vIFRPRE9cblxuZXhwb3J0cy5kZWZhdWx0ID0gVHJ1c3Q7XG5cbn0se1wiLi4vZW51bXNcIjozNTl9XSwzODg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3BhY2tldCA9IF9kZXJlcV8oJy4vcGFja2V0Jyk7XG5cbnZhciBfcGFja2V0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BhY2tldCk7XG5cbnZhciBfZW51bXMgPSBfZGVyZXFfKCcuLi9lbnVtcycpO1xuXG52YXIgX2VudW1zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VudW1zKTtcblxudmFyIF91dGlsID0gX2RlcmVxXygnLi4vdXRpbCcpO1xuXG52YXIgX3V0aWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFVzZXIgQXR0cmlidXRlIFBhY2tldCAoVGFnIDE3KVxuICpcbiAqIFRoZSBVc2VyIEF0dHJpYnV0ZSBwYWNrZXQgaXMgYSB2YXJpYXRpb24gb2YgdGhlIFVzZXIgSUQgcGFja2V0LiAgSXRcbiAqIGlzIGNhcGFibGUgb2Ygc3RvcmluZyBtb3JlIHR5cGVzIG9mIGRhdGEgdGhhbiB0aGUgVXNlciBJRCBwYWNrZXQsXG4gKiB3aGljaCBpcyBsaW1pdGVkIHRvIHRleHQuICBMaWtlIHRoZSBVc2VyIElEIHBhY2tldCwgYSBVc2VyIEF0dHJpYnV0ZVxuICogcGFja2V0IG1heSBiZSBjZXJ0aWZpZWQgYnkgdGhlIGtleSBvd25lciAoXCJzZWxmLXNpZ25lZFwiKSBvciBhbnkgb3RoZXJcbiAqIGtleSBvd25lciB3aG8gY2FyZXMgdG8gY2VydGlmeSBpdC4gIEV4Y2VwdCBhcyBub3RlZCwgYSBVc2VyIEF0dHJpYnV0ZVxuICogcGFja2V0IG1heSBiZSB1c2VkIGFueXdoZXJlIHRoYXQgYSBVc2VyIElEIHBhY2tldCBtYXkgYmUgdXNlZC5cbiAqXG4gKiBXaGlsZSBVc2VyIEF0dHJpYnV0ZSBwYWNrZXRzIGFyZSBub3QgYSByZXF1aXJlZCBwYXJ0IG9mIHRoZSBPcGVuUEdQXG4gKiBzdGFuZGFyZCwgaW1wbGVtZW50YXRpb25zIFNIT1VMRCBwcm92aWRlIGF0IGxlYXN0IGVub3VnaFxuICogY29tcGF0aWJpbGl0eSB0byBwcm9wZXJseSBoYW5kbGUgYSBjZXJ0aWZpY2F0aW9uIHNpZ25hdHVyZSBvbiB0aGVcbiAqIFVzZXIgQXR0cmlidXRlIHBhY2tldC4gIEEgc2ltcGxlIHdheSB0byBkbyB0aGlzIGlzIGJ5IHRyZWF0aW5nIHRoZVxuICogVXNlciBBdHRyaWJ1dGUgcGFja2V0IGFzIGEgVXNlciBJRCBwYWNrZXQgd2l0aCBvcGFxdWUgY29udGVudHMsIGJ1dFxuICogYW4gaW1wbGVtZW50YXRpb24gbWF5IHVzZSBhbnkgbWV0aG9kIGRlc2lyZWQuXG4gKiBAbWVtYmVyb2YgbW9kdWxlOnBhY2tldFxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFVzZXJBdHRyaWJ1dGUoKSB7XG4gIHRoaXMudGFnID0gX2VudW1zMi5kZWZhdWx0LnBhY2tldC51c2VyQXR0cmlidXRlO1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBbXTtcbn1cblxuLyoqXG4gKiBwYXJzaW5nIGZ1bmN0aW9uIGZvciBhIHVzZXIgYXR0cmlidXRlIHBhY2tldCAodGFnIDE3KS5cbiAqIEBwYXJhbSB7VWludDhBcnJheX0gaW5wdXQgcGF5bG9hZCBvZiBhIHRhZyAxNyBwYWNrZXRcbiAqL1xuLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAcmVxdWlyZXMgcGFja2V0XG4gKiBAcmVxdWlyZXMgZW51bXNcbiAqIEByZXF1aXJlcyB1dGlsXG4gKi9cblxuVXNlckF0dHJpYnV0ZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChieXRlcykge1xuICB2YXIgaSA9IDA7XG4gIHdoaWxlIChpIDwgYnl0ZXMubGVuZ3RoKSB7XG4gICAgdmFyIGxlbiA9IF9wYWNrZXQyLmRlZmF1bHQucmVhZFNpbXBsZUxlbmd0aChieXRlcy5zdWJhcnJheShpLCBieXRlcy5sZW5ndGgpKTtcbiAgICBpICs9IGxlbi5vZmZzZXQ7XG5cbiAgICB0aGlzLmF0dHJpYnV0ZXMucHVzaChfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cihieXRlcy5zdWJhcnJheShpLCBpICsgbGVuLmxlbikpKTtcbiAgICBpICs9IGxlbi5sZW47XG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdXNlciBhdHRyaWJ1dGUgcGFja2V0XG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gKi9cblVzZXJBdHRyaWJ1dGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYXJyID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgYXJyLnB1c2goX3BhY2tldDIuZGVmYXVsdC53cml0ZVNpbXBsZUxlbmd0aCh0aGlzLmF0dHJpYnV0ZXNbaV0ubGVuZ3RoKSk7XG4gICAgYXJyLnB1c2goX3V0aWwyLmRlZmF1bHQuc3RyX3RvX1VpbnQ4QXJyYXkodGhpcy5hdHRyaWJ1dGVzW2ldKSk7XG4gIH1cbiAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoYXJyKTtcbn07XG5cbi8qKlxuICogQ29tcGFyZSBmb3IgZXF1YWxpdHlcbiAqIEBwYXJhbSAge21vZHVsZTpwYWNrZXQuVXNlckF0dHJpYnV0ZX0gdXNyQXR0clxuICogQHJldHVybnMge0Jvb2xlYW59ICAgICAgICAgdHJ1ZSBpZiBlcXVhbFxuICovXG5Vc2VyQXR0cmlidXRlLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAodXNyQXR0cikge1xuICBpZiAoIXVzckF0dHIgfHwgISh1c3JBdHRyIGluc3RhbmNlb2YgVXNlckF0dHJpYnV0ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRoaXMuYXR0cmlidXRlcy5ldmVyeShmdW5jdGlvbiAoYXR0ciwgaW5kZXgpIHtcbiAgICByZXR1cm4gYXR0ciA9PT0gdXNyQXR0ci5hdHRyaWJ1dGVzW2luZGV4XTtcbiAgfSk7XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBVc2VyQXR0cmlidXRlO1xuXG59LHtcIi4uL2VudW1zXCI6MzU5LFwiLi4vdXRpbFwiOjM5OCxcIi4vcGFja2V0XCI6Mzc1fV0sMzg5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9hc3NpZ24gPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2Fzc2lnbicpO1xuXG52YXIgX2Fzc2lnbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3NpZ24pO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vZW51bXMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBVc2VyIElEIFBhY2tldCAoVGFnIDEzKVxuICpcbiAqIEEgVXNlciBJRCBwYWNrZXQgY29uc2lzdHMgb2YgVVRGLTggdGV4dCB0aGF0IGlzIGludGVuZGVkIHRvIHJlcHJlc2VudFxuICogdGhlIG5hbWUgYW5kIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIGtleSBob2xkZXIuICBCeSBjb252ZW50aW9uLCBpdFxuICogaW5jbHVkZXMgYW4gUkZDIDI4MjIgW1JGQzI4MjJdIG1haWwgbmFtZS1hZGRyLCBidXQgdGhlcmUgYXJlIG5vXG4gKiByZXN0cmljdGlvbnMgb24gaXRzIGNvbnRlbnQuICBUaGUgcGFja2V0IGxlbmd0aCBpbiB0aGUgaGVhZGVyXG4gKiBzcGVjaWZpZXMgdGhlIGxlbmd0aCBvZiB0aGUgVXNlciBJRC5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6cGFja2V0XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAcmVxdWlyZXMgZW51bXNcbiAqIEByZXF1aXJlcyB1dGlsXG4gKi9cblxuZnVuY3Rpb24gVXNlcmlkKCkge1xuICB0aGlzLnRhZyA9IF9lbnVtczIuZGVmYXVsdC5wYWNrZXQudXNlcmlkO1xuICAvKiogQSBzdHJpbmcgY29udGFpbmluZyB0aGUgdXNlciBpZC4gVXN1YWxseSBpbiB0aGUgZm9ybVxuICAgKiBKb2huIERvZSA8am9obkBleGFtcGxlLmNvbT5cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIHRoaXMudXNlcmlkID0gJyc7XG5cbiAgdGhpcy5uYW1lID0gJyc7XG4gIHRoaXMuZW1haWwgPSAnJztcbiAgdGhpcy5jb21tZW50ID0gJyc7XG59XG5cbi8qKlxuICogUGFyc2luZyBmdW5jdGlvbiBmb3IgYSB1c2VyIGlkIHBhY2tldCAodGFnIDEzKS5cbiAqIEBwYXJhbSB7VWludDhBcnJheX0gaW5wdXQgcGF5bG9hZCBvZiBhIHRhZyAxMyBwYWNrZXRcbiAqL1xuVXNlcmlkLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gIHRoaXMucGFyc2UoX3V0aWwyLmRlZmF1bHQuZGVjb2RlX3V0ZjgoX3V0aWwyLmRlZmF1bHQuVWludDhBcnJheV90b19zdHIoYnl0ZXMpKSk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHVzZXJpZCBzdHJpbmcsIGUuZy4gJ0pvaG4gRG9lIDxqb2huQGV4YW1wbGUuY29tPidcbiAqL1xuVXNlcmlkLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uICh1c2VyaWQpIHtcbiAgdHJ5IHtcbiAgICAoMCwgX2Fzc2lnbjIuZGVmYXVsdCkodGhpcywgX3V0aWwyLmRlZmF1bHQucGFyc2VVc2VySWQodXNlcmlkKSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHRoaXMudXNlcmlkID0gdXNlcmlkO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1c2VyIGlkIHBhY2tldFxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IGJpbmFyeSByZXByZXNlbnRhdGlvblxuICovXG5Vc2VyaWQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuc3RyX3RvX1VpbnQ4QXJyYXkoX3V0aWwyLmRlZmF1bHQuZW5jb2RlX3V0ZjgodGhpcy51c2VyaWQpKTtcbn07XG5cbi8qKlxuICogU2V0IHVzZXJpZCBzdHJpbmcgZnJvbSBvYmplY3QsIGUuZy4geyBuYW1lOidQaGlsIFppbW1lcm1hbm4nLCBlbWFpbDoncGhpbEBvcGVucGdwLm9yZycgfVxuICovXG5Vc2VyaWQucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uICh1c2VyaWQpIHtcbiAgaWYgKF91dGlsMi5kZWZhdWx0LmlzU3RyaW5nKHVzZXJpZCkpIHtcbiAgICB1c2VyaWQgPSBfdXRpbDIuZGVmYXVsdC5wYXJzZVVzZXJJZCh1c2VyaWQpO1xuICB9XG4gICgwLCBfYXNzaWduMi5kZWZhdWx0KSh0aGlzLCB1c2VyaWQpO1xuICB0aGlzLnVzZXJpZCA9IF91dGlsMi5kZWZhdWx0LmZvcm1hdFVzZXJJZCh1c2VyaWQpO1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gVXNlcmlkO1xuXG59LHtcIi4uL2VudW1zXCI6MzU5LFwiLi4vdXRpbFwiOjM5OCxcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduXCI6MjR9XSwzOTA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduJyk7XG5cbnZhciBfYXNzaWduMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Fzc2lnbik7XG5cbnZhciBfc3ltYm9sID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbCcpO1xuXG52YXIgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpO1xuXG52YXIgX2Zyb20gPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvYXJyYXkvZnJvbScpO1xuXG52YXIgX2Zyb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZnJvbSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLy8gT2xkIGJyb3dzZXIgcG9seWZpbGxzXG4vLyBBbGwgYXJlIGxpc3RlZCBhcyBkZXYgZGVwZW5kZW5jaWVzIGJlY2F1c2UgTm9kZSBkb2VzIG5vdCBuZWVkIHRoZW1cbi8vIGFuZCBmb3IgYnJvd3NlciBiYWJlbCB3aWxsIHRha2UgY2FyZSBvZiBpdFxuXG5pZiAodHlwZW9mIHdpbmRvdy5mZXRjaCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgX2RlcmVxXygnd2hhdHdnLWZldGNoJyk7XG59XG5pZiAodHlwZW9mIEFycmF5LnByb3RvdHlwZS5maWxsID09PSAndW5kZWZpbmVkJykge1xuICBfZGVyZXFfKCdjb3JlLWpzL2ZuL2FycmF5L2ZpbGwnKTtcbn1cbmlmICh0eXBlb2YgQXJyYXkucHJvdG90eXBlLmZpbmQgPT09ICd1bmRlZmluZWQnKSB7XG4gIF9kZXJlcV8oJ2NvcmUtanMvZm4vYXJyYXkvZmluZCcpO1xufVxuaWYgKHR5cGVvZiBfZnJvbTIuZGVmYXVsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgX2RlcmVxXygnY29yZS1qcy9mbi9hcnJheS9mcm9tJyk7XG59XG5cbi8vIE5vIGlmLXN0YXRlbWVudCBvbiBQcm9taXNlIGJlY2F1c2Ugb2YgSUUxMS4gT3RoZXJ3aXNlIFByb21pc2UgaXMgdW5kZWZpbmVkIGluIHRoZSBzZXJ2aWNlIHdvcmtlci5cbl9kZXJlcV8oJ2NvcmUtanMvZm4vcHJvbWlzZScpO1xuXG5pZiAodHlwZW9mIFVpbnQ4QXJyYXkuZnJvbSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgX2RlcmVxXygnY29yZS1qcy9mbi90eXBlZC91aW50OC1hcnJheScpO1xufVxuaWYgKHR5cGVvZiBTdHJpbmcucHJvdG90eXBlLnJlcGVhdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgX2RlcmVxXygnY29yZS1qcy9mbi9zdHJpbmcvcmVwZWF0Jyk7XG59XG5pZiAodHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09ICd1bmRlZmluZWQnKSB7XG4gIF9kZXJlcV8oJ2NvcmUtanMvZm4vc3ltYm9sJyk7XG59XG5pZiAodHlwZW9mIF9hc3NpZ24yLmRlZmF1bHQgPT09ICd1bmRlZmluZWQnKSB7XG4gIF9kZXJlcV8oJ2NvcmUtanMvZm4vb2JqZWN0L2Fzc2lnbicpO1xufVxuXG59LHtcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9hcnJheS9mcm9tXCI6MjAsXCJiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2Fzc2lnblwiOjI0LFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbFwiOjMzLFwiY29yZS1qcy9mbi9hcnJheS9maWxsXCI6NDgsXCJjb3JlLWpzL2ZuL2FycmF5L2ZpbmRcIjo0OSxcImNvcmUtanMvZm4vYXJyYXkvZnJvbVwiOjUwLFwiY29yZS1qcy9mbi9vYmplY3QvYXNzaWduXCI6NTEsXCJjb3JlLWpzL2ZuL3Byb21pc2VcIjo1MixcImNvcmUtanMvZm4vc3RyaW5nL3JlcGVhdFwiOjUzLFwiY29yZS1qcy9mbi9zeW1ib2xcIjo1NCxcImNvcmUtanMvZm4vdHlwZWQvdWludDgtYXJyYXlcIjo1NSxcIndoYXR3Zy1mZXRjaFwiOjMyMX1dLDM5MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlNpZ25hdHVyZSA9IFNpZ25hdHVyZTtcbmV4cG9ydHMucmVhZEFybW9yZWQgPSByZWFkQXJtb3JlZDtcbmV4cG9ydHMucmVhZCA9IHJlYWQ7XG5cbnZhciBfYXJtb3IgPSBfZGVyZXFfKCcuL2VuY29kaW5nL2FybW9yJyk7XG5cbnZhciBfYXJtb3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXJtb3IpO1xuXG52YXIgX3BhY2tldCA9IF9kZXJlcV8oJy4vcGFja2V0Jyk7XG5cbnZhciBfcGFja2V0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BhY2tldCk7XG5cbnZhciBfZW51bXMgPSBfZGVyZXFfKCcuL2VudW1zJyk7XG5cbnZhciBfZW51bXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW51bXMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEBjbGFzc1xuICogQGNsYXNzZGVzYyBDbGFzcyB0aGF0IHJlcHJlc2VudHMgYW4gT3BlblBHUCBzaWduYXR1cmUuXG4gKiBAcGFyYW0gIHttb2R1bGU6cGFja2V0Lkxpc3R9IHBhY2tldGxpc3QgVGhlIHNpZ25hdHVyZSBwYWNrZXRzXG4gKi9cbmZ1bmN0aW9uIFNpZ25hdHVyZShwYWNrZXRsaXN0KSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTaWduYXR1cmUpKSB7XG4gICAgcmV0dXJuIG5ldyBTaWduYXR1cmUocGFja2V0bGlzdCk7XG4gIH1cbiAgdGhpcy5wYWNrZXRzID0gcGFja2V0bGlzdCB8fCBuZXcgX3BhY2tldDIuZGVmYXVsdC5MaXN0KCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBBU0NJSSBhcm1vcmVkIHRleHQgb2Ygc2lnbmF0dXJlXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBBU0NJSSBhcm1vclxuICovXG4vLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEByZXF1aXJlcyBlbmNvZGluZy9hcm1vclxuICogQHJlcXVpcmVzIHBhY2tldFxuICogQHJlcXVpcmVzIGVudW1zXG4gKiBAbW9kdWxlIHNpZ25hdHVyZVxuICovXG5cblNpZ25hdHVyZS5wcm90b3R5cGUuYXJtb3IgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBfYXJtb3IyLmRlZmF1bHQuZW5jb2RlKF9lbnVtczIuZGVmYXVsdC5hcm1vci5zaWduYXR1cmUsIHRoaXMucGFja2V0cy53cml0ZSgpKTtcbn07XG5cbi8qKlxuICogcmVhZHMgYW4gT3BlblBHUCBhcm1vcmVkIHNpZ25hdHVyZSBhbmQgcmV0dXJucyBhIHNpZ25hdHVyZSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBhcm1vcmVkVGV4dCB0ZXh0IHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMge1NpZ25hdHVyZX0gbmV3IHNpZ25hdHVyZSBvYmplY3RcbiAqIEBzdGF0aWNcbiAqL1xuZnVuY3Rpb24gcmVhZEFybW9yZWQoYXJtb3JlZFRleHQpIHtcbiAgdmFyIGlucHV0ID0gX2FybW9yMi5kZWZhdWx0LmRlY29kZShhcm1vcmVkVGV4dCkuZGF0YTtcbiAgcmV0dXJuIHJlYWQoaW5wdXQpO1xufVxuXG4vKipcbiAqIHJlYWRzIGFuIE9wZW5QR1Agc2lnbmF0dXJlIGFzIGJ5dGUgYXJyYXkgYW5kIHJldHVybnMgYSBzaWduYXR1cmUgb2JqZWN0XG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGlucHV0ICAgYmluYXJ5IHNpZ25hdHVyZVxuICogQHJldHVybnMge1NpZ25hdHVyZX0gICAgICAgICBuZXcgc2lnbmF0dXJlIG9iamVjdFxuICogQHN0YXRpY1xuICovXG5mdW5jdGlvbiByZWFkKGlucHV0KSB7XG4gIHZhciBwYWNrZXRsaXN0ID0gbmV3IF9wYWNrZXQyLmRlZmF1bHQuTGlzdCgpO1xuICBwYWNrZXRsaXN0LnJlYWQoaW5wdXQpO1xuICByZXR1cm4gbmV3IFNpZ25hdHVyZShwYWNrZXRsaXN0KTtcbn1cblxufSx7XCIuL2VuY29kaW5nL2FybW9yXCI6MzU3LFwiLi9lbnVtc1wiOjM1OSxcIi4vcGFja2V0XCI6MzcxfV0sMzkyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF91dGlsID0gX2RlcmVxXygnLi4vdXRpbCcpO1xuXG52YXIgX3V0aWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEVDREhTeW1tZXRyaWNLZXkoZGF0YSkge1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KFtdKTtcbiAgfSBlbHNlIGlmIChfdXRpbDIuZGVmYXVsdC5pc1N0cmluZyhkYXRhKSkge1xuICAgIGRhdGEgPSBfdXRpbDIuZGVmYXVsdC5zdHJfdG9fVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gIH1cbiAgdGhpcy5kYXRhID0gZGF0YTtcbn1cblxuLyoqXG4gKiBSZWFkIGFuIEVDREhTeW1tZXRyaWNLZXkgZnJvbSBhbiBVaW50OEFycmF5XG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSAgaW5wdXQgIFdoZXJlIHRvIHJlYWQgdGhlIGVuY29kZWQgc3ltbWV0cmljIGtleSBmcm9tXG4gKiBAcmV0dXJucyB7TnVtYmVyfSAgICAgICAgICAgICBOdW1iZXIgb2YgcmVhZCBieXRlc1xuICovXG4vLyBPcGVuUEdQLmpzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBEZWNlbnRyYWxcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEVuY29kZWQgc3ltbWV0cmljIGtleSBmb3IgRUNESFxuICpcbiAqIEByZXF1aXJlcyB1dGlsXG4gKiBAbW9kdWxlIHR5cGUvZWNkaF9zeW1rZXlcbiAqL1xuXG5FQ0RIU3ltbWV0cmljS2V5LnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gIGlmIChpbnB1dC5sZW5ndGggPj0gMSkge1xuICAgIHZhciBsZW5ndGggPSBpbnB1dFswXTtcbiAgICBpZiAoaW5wdXQubGVuZ3RoID49IDEgKyBsZW5ndGgpIHtcbiAgICAgIHRoaXMuZGF0YSA9IGlucHV0LnN1YmFycmF5KDEsIDEgKyBsZW5ndGgpO1xuICAgICAgcmV0dXJuIDEgKyB0aGlzLmRhdGEubGVuZ3RoO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3ltbWV0cmljIGtleScpO1xufTtcblxuLyoqXG4gKiBXcml0ZSBhbiBFQ0RIU3ltbWV0cmljS2V5IGFzIGFuIFVpbnQ4QXJyYXlcbiAqIEByZXR1cm5zICB7VWludDhBcnJheX0gIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlXG4gKi9cbkVDREhTeW1tZXRyaWNLZXkucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbbmV3IFVpbnQ4QXJyYXkoW3RoaXMuZGF0YS5sZW5ndGhdKSwgdGhpcy5kYXRhXSk7XG59O1xuXG5FQ0RIU3ltbWV0cmljS2V5LmZyb21DbG9uZSA9IGZ1bmN0aW9uIChjbG9uZSkge1xuICByZXR1cm4gbmV3IEVDREhTeW1tZXRyaWNLZXkoY2xvbmUuZGF0YSk7XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBFQ0RIU3ltbWV0cmljS2V5O1xuXG59LHtcIi4uL3V0aWxcIjozOTh9XSwzOTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vZW51bXMuanMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0gIHtlbnVtcy5oYXNofSAgICAgICBoYXNoICAgIEhhc2ggYWxnb3JpdGhtXG4gKiBAcGFyYW0gIHtlbnVtcy5zeW1tZXRyaWN9ICBjaXBoZXIgIFN5bW1ldHJpYyBhbGdvcml0aG1cbiAqL1xuZnVuY3Rpb24gS0RGUGFyYW1zKGRhdGEpIHtcbiAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPT09IDIpIHtcbiAgICB0aGlzLmhhc2ggPSBkYXRhWzBdO1xuICAgIHRoaXMuY2lwaGVyID0gZGF0YVsxXTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmhhc2ggPSBfZW51bXMyLmRlZmF1bHQuaGFzaC5zaGExO1xuICAgIHRoaXMuY2lwaGVyID0gX2VudW1zMi5kZWZhdWx0LnN5bW1ldHJpYy5hZXMxMjg7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkIEtERlBhcmFtcyBmcm9tIGFuIFVpbnQ4QXJyYXlcbiAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9ICBpbnB1dCAgV2hlcmUgdG8gcmVhZCB0aGUgS0RGUGFyYW1zIGZyb21cbiAqIEByZXR1cm5zIHtOdW1iZXJ9ICAgICAgICAgICAgIE51bWJlciBvZiByZWFkIGJ5dGVzXG4gKi9cbi8vIE9wZW5QR1AuanMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IERlY2VudHJhbFxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdHlwZSBLREYgcGFyYW1ldGVyc1xuICpcbiAqIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjYzNyNzZWN0aW9uLTd8UkZDIDY2MzcgN306XG4gKiBBIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIChLREYpIGlzIG5lY2Vzc2FyeSB0byBpbXBsZW1lbnQgdGhlIEVDXG4gKiBlbmNyeXB0aW9uLiAgVGhlIENvbmNhdGVuYXRpb24gS2V5IERlcml2YXRpb24gRnVuY3Rpb24gKEFwcHJvdmVkXG4gKiBBbHRlcm5hdGl2ZSAxKSBbTklTVC1TUDgwMC01NkFdIHdpdGggdGhlIEtERiBoYXNoIGZ1bmN0aW9uIHRoYXQgaXNcbiAqIFNIQTItMjU2IFtGSVBTLTE4MC0zXSBvciBzdHJvbmdlciBpcyBSRVFVSVJFRC5cbiAqIEByZXF1aXJlcyBlbnVtc1xuICogQG1vZHVsZSB0eXBlL2tkZl9wYXJhbXNcbiAqL1xuXG5LREZQYXJhbXMucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgaWYgKGlucHV0Lmxlbmd0aCA8IDQgfHwgaW5wdXRbMF0gIT09IDMgfHwgaW5wdXRbMV0gIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIEtERlBhcmFtcycpO1xuICB9XG4gIHRoaXMuaGFzaCA9IGlucHV0WzJdO1xuICB0aGlzLmNpcGhlciA9IGlucHV0WzNdO1xuICByZXR1cm4gNDtcbn07XG5cbi8qKlxuICogV3JpdGUgS0RGUGFyYW1zIHRvIGFuIFVpbnQ4QXJyYXlcbiAqIEByZXR1cm5zICB7VWludDhBcnJheX0gIEFycmF5IHdpdGggdGhlIEtERlBhcmFtcyB2YWx1ZVxuICovXG5LREZQYXJhbXMucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzMsIDEsIHRoaXMuaGFzaCwgdGhpcy5jaXBoZXJdKTtcbn07XG5cbktERlBhcmFtcy5mcm9tQ2xvbmUgPSBmdW5jdGlvbiAoY2xvbmUpIHtcbiAgcmV0dXJuIG5ldyBLREZQYXJhbXMoW2Nsb25lLmhhc2gsIGNsb25lLmNpcGhlcl0pO1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gS0RGUGFyYW1zO1xuXG59LHtcIi4uL2VudW1zLmpzXCI6MzU5fV0sMzk0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF91dGlsID0gX2RlcmVxXygnLi4vdXRpbC5qcycpO1xuXG52YXIgX3V0aWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEtleWlkKCkge1xuICB0aGlzLmJ5dGVzID0gJyc7XG59XG5cbi8qKlxuICogUGFyc2luZyBtZXRob2QgZm9yIGEga2V5IGlkXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGlucHV0IElucHV0IHRvIHJlYWQgdGhlIGtleSBpZCBmcm9tXG4gKi9cbi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdHlwZSBrZXkgaWRcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi0zLjN8UkZDNDg4MCAzLjN9OlxuICogQSBLZXkgSUQgaXMgYW4gZWlnaHQtb2N0ZXQgc2NhbGFyIHRoYXQgaWRlbnRpZmllcyBhIGtleS5cbiAqIEltcGxlbWVudGF0aW9ucyBTSE9VTEQgTk9UIGFzc3VtZSB0aGF0IEtleSBJRHMgYXJlIHVuaXF1ZS4gIFRoZVxuICogc2VjdGlvbiBcIkVuaGFuY2VkIEtleSBGb3JtYXRzXCIgYmVsb3cgZGVzY3JpYmVzIGhvdyBLZXkgSURzIGFyZVxuICogZm9ybWVkLlxuICogQHJlcXVpcmVzIHV0aWxcbiAqIEBtb2R1bGUgdHlwZS9rZXlpZFxuICovXG5cbktleWlkLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gIHRoaXMuYnl0ZXMgPSBfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cihieXRlcy5zdWJhcnJheSgwLCA4KSk7XG59O1xuXG5LZXlpZC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBfdXRpbDIuZGVmYXVsdC5zdHJfdG9fVWludDhBcnJheSh0aGlzLmJ5dGVzKTtcbn07XG5cbktleWlkLnByb3RvdHlwZS50b0hleCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LnN0cl90b19oZXgodGhpcy5ieXRlcyk7XG59O1xuXG4vKipcbiAqIENoZWNrcyBlcXVhbGl0eSBvZiBLZXkgSUQnc1xuICogQHBhcmFtIHtLZXlpZH0ga2V5aWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbWF0Y2hXaWxkY2FyZCBJbmRpY2F0ZXMgd2hldGhlciB0byBjaGVjayBpZiBlaXRoZXIga2V5aWQgaXMgYSB3aWxkY2FyZFxuICovXG5LZXlpZC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKGtleWlkKSB7XG4gIHZhciBtYXRjaFdpbGRjYXJkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICByZXR1cm4gbWF0Y2hXaWxkY2FyZCAmJiAoa2V5aWQuaXNXaWxkY2FyZCgpIHx8IHRoaXMuaXNXaWxkY2FyZCgpKSB8fCB0aGlzLmJ5dGVzID09PSBrZXlpZC5ieXRlcztcbn07XG5cbktleWlkLnByb3RvdHlwZS5pc051bGwgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmJ5dGVzID09PSAnJztcbn07XG5cbktleWlkLnByb3RvdHlwZS5pc1dpbGRjYXJkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKC9eMCskLy50ZXN0KHRoaXMudG9IZXgoKSlcbiAgKTtcbn07XG5cbktleWlkLm1hcFRvSGV4ID0gZnVuY3Rpb24gKGtleUlkKSB7XG4gIHJldHVybiBrZXlJZC50b0hleCgpO1xufTtcblxuS2V5aWQuZnJvbUNsb25lID0gZnVuY3Rpb24gKGNsb25lKSB7XG4gIHZhciBrZXlpZCA9IG5ldyBLZXlpZCgpO1xuICBrZXlpZC5ieXRlcyA9IGNsb25lLmJ5dGVzO1xuICByZXR1cm4ga2V5aWQ7XG59O1xuXG5LZXlpZC5mcm9tSWQgPSBmdW5jdGlvbiAoaGV4KSB7XG4gIHZhciBrZXlpZCA9IG5ldyBLZXlpZCgpO1xuICBrZXlpZC5yZWFkKF91dGlsMi5kZWZhdWx0LmhleF90b19VaW50OEFycmF5KGhleCkpO1xuICByZXR1cm4ga2V5aWQ7XG59O1xuXG5LZXlpZC53aWxkY2FyZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGtleWlkID0gbmV3IEtleWlkKCk7XG4gIGtleWlkLnJlYWQobmV3IFVpbnQ4QXJyYXkoOCkpO1xuICByZXR1cm4ga2V5aWQ7XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBLZXlpZDtcblxufSx7XCIuLi91dGlsLmpzXCI6Mzk4fV0sMzk1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9ibiA9IF9kZXJlcV8oJ2JuLmpzJyk7XG5cbnZhciBfYm4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYm4pO1xuXG52YXIgX3V0aWwgPSBfZGVyZXFfKCcuLi91dGlsJyk7XG5cbnZhciBfdXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLy8gSGludDogV2UgaG9sZCBvdXIgTVBJcyBhcyBhbiBhcnJheSBvZiBvY3RldHMgaW4gYmlnIGVuZGlhbiBmb3JtYXQgcHJlY2VkaW5nIGEgdHdvXG4vLyBvY3RldCBzY2FsYXI6IE1QSTogW2EsYixjLGQsZSxmXVxuLy8gLSBNUEkgc2l6ZTogKGEgPDwgOCkgfCBiXG4vLyAtIE1QSSA9IGMgfCBkIDw8IDggfCBlIDw8ICgoTVBJLmxlbmd0aCAtMikqOCkgfCBmICgoTVBJLmxlbmd0aCAtMikqOClcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0eXBlIE1QSSAoe0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tMy4yfFJGQzQ4ODAgMy4yfSlcbiAqIE11bHRpcHJlY2lzaW9uIGludGVnZXJzIChhbHNvIGNhbGxlZCBNUElzKSBhcmUgdW5zaWduZWQgaW50ZWdlcnMgdXNlZFxuICogdG8gaG9sZCBsYXJnZSBpbnRlZ2VycyBzdWNoIGFzIHRoZSBvbmVzIHVzZWQgaW4gY3J5cHRvZ3JhcGhpY1xuICogY2FsY3VsYXRpb25zLlxuICogQW4gTVBJIGNvbnNpc3RzIG9mIHR3byBwaWVjZXM6IGEgdHdvLW9jdGV0IHNjYWxhciB0aGF0IGlzIHRoZSBsZW5ndGhcbiAqIG9mIHRoZSBNUEkgaW4gYml0cyBmb2xsb3dlZCBieSBhIHN0cmluZyBvZiBvY3RldHMgdGhhdCBjb250YWluIHRoZVxuICogYWN0dWFsIGludGVnZXIuXG4gKiBAcmVxdWlyZXMgYm4uanNcbiAqIEByZXF1aXJlcyB1dGlsXG4gKiBAbW9kdWxlIHR5cGUvbXBpXG4gKi9cblxuZnVuY3Rpb24gTVBJKGRhdGEpIHtcbiAgLyoqIEFuIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBpbnRlZ2VyICovXG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTVBJKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YS5kYXRhO1xuICB9IGVsc2UgaWYgKF9ibjIuZGVmYXVsdC5pc0JOKGRhdGEpKSB7XG4gICAgdGhpcy5mcm9tQk4oZGF0YSk7XG4gIH0gZWxzZSBpZiAoX3V0aWwyLmRlZmF1bHQuaXNVaW50OEFycmF5KGRhdGEpKSB7XG4gICAgdGhpcy5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIGlmIChfdXRpbDIuZGVmYXVsdC5pc1N0cmluZyhkYXRhKSkge1xuICAgIHRoaXMuZnJvbVN0cmluZyhkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmRhdGEgPSBudWxsO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2luZyBmdW5jdGlvbiBmb3IgYSBNUEkgKHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTMuMnxSRkMgNDg4MCAzLjJ9KS5cbiAqIEBwYXJhbSB7VWludDhBcnJheX0gaW5wdXQgIFBheWxvYWQgb2YgTVBJIGRhdGFcbiAqIEBwYXJhbSB7U3RyaW5nfSAgICAgZW5kaWFuIEVuZGlhbm5lc3Mgb2YgdGhlIGRhdGE7ICdiZScgZm9yIGJpZy1lbmRpYW4gb3IgJ2xlJyBmb3IgbGl0dGxlLWVuZGlhblxuICogQHJldHVybnMge0ludGVnZXJ9ICAgICAgICAgIExlbmd0aCBvZiBkYXRhIHJlYWRcbiAqL1xuTVBJLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gIHZhciBlbmRpYW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICdiZSc7XG5cbiAgaWYgKF91dGlsMi5kZWZhdWx0LmlzU3RyaW5nKGJ5dGVzKSkge1xuICAgIGJ5dGVzID0gX3V0aWwyLmRlZmF1bHQuc3RyX3RvX1VpbnQ4QXJyYXkoYnl0ZXMpO1xuICB9XG5cbiAgdmFyIGJpdHMgPSBieXRlc1swXSA8PCA4IHwgYnl0ZXNbMV07XG4gIHZhciBieXRlbGVuID0gYml0cyArIDcgPj4+IDM7XG4gIHZhciBwYXlsb2FkID0gYnl0ZXMuc3ViYXJyYXkoMiwgMiArIGJ5dGVsZW4pO1xuXG4gIHRoaXMuZnJvbVVpbnQ4QXJyYXkocGF5bG9hZCwgZW5kaWFuKTtcblxuICByZXR1cm4gMiArIGJ5dGVsZW47XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBtcGkgb2JqZWN0IHRvIGEgYnl0ZXMgYXMgc3BlY2lmaWVkIGluXG4gKiB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi0zLjJ8UkZDNDg4MCAzLjJ9XG4gKiBAcGFyYW0ge1N0cmluZ30gZW5kaWFuIEVuZGlhbm5lc3Mgb2YgdGhlIHBheWxvYWQ7ICdiZScgZm9yIGJpZy1lbmRpYW4gb3IgJ2xlJyBmb3IgbGl0dGxlLWVuZGlhblxuICogQHBhcmFtIHtJbnRlZ2VyfSBsZW5ndGggTGVuZ3RoIG9mIHRoZSBkYXRhIHBhcnQgb2YgdGhlIE1QSVxuICogQHJldHVybnMge1VpbnQ4QXJheX0gbXBpIEJ5dGUgcmVwcmVzZW50YXRpb25cbiAqL1xuTVBJLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChlbmRpYW4sIGxlbmd0aCkge1xuICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuVWludDhBcnJheV90b19NUEkodGhpcy50b1VpbnQ4QXJyYXkoZW5kaWFuLCBsZW5ndGgpKTtcbn07XG5cbk1QSS5wcm90b3R5cGUuYml0TGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKHRoaXMuZGF0YS5sZW5ndGggLSAxKSAqIDggKyBfdXRpbDIuZGVmYXVsdC5uYml0cyh0aGlzLmRhdGFbMF0pO1xufTtcblxuTVBJLnByb3RvdHlwZS5ieXRlTGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aDtcbn07XG5cbk1QSS5wcm90b3R5cGUudG9VaW50OEFycmF5ID0gZnVuY3Rpb24gKGVuZGlhbiwgbGVuZ3RoKSB7XG4gIGVuZGlhbiA9IGVuZGlhbiB8fCAnYmUnO1xuICBsZW5ndGggPSBsZW5ndGggfHwgdGhpcy5kYXRhLmxlbmd0aDtcblxuICB2YXIgcGF5bG9hZCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gIHZhciBzdGFydCA9IGxlbmd0aCAtIHRoaXMuZGF0YS5sZW5ndGg7XG4gIGlmIChzdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BheWxvYWQgaXMgdG9vIGxhcmdlLicpO1xuICB9XG5cbiAgcGF5bG9hZC5zZXQodGhpcy5kYXRhLCBzdGFydCk7XG4gIGlmIChlbmRpYW4gPT09ICdsZScpIHtcbiAgICBwYXlsb2FkLnJldmVyc2UoKTtcbiAgfVxuXG4gIHJldHVybiBwYXlsb2FkO1xufTtcblxuTVBJLnByb3RvdHlwZS5mcm9tVWludDhBcnJheSA9IGZ1bmN0aW9uIChieXRlcykge1xuICB2YXIgZW5kaWFuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnYmUnO1xuXG4gIHRoaXMuZGF0YSA9IG5ldyBVaW50OEFycmF5KGJ5dGVzLmxlbmd0aCk7XG4gIHRoaXMuZGF0YS5zZXQoYnl0ZXMpO1xuXG4gIGlmIChlbmRpYW4gPT09ICdsZScpIHtcbiAgICB0aGlzLmRhdGEucmV2ZXJzZSgpO1xuICB9XG59O1xuXG5NUEkucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuVWludDhBcnJheV90b19zdHIodGhpcy50b1VpbnQ4QXJyYXkoKSk7XG59O1xuXG5NUEkucHJvdG90eXBlLmZyb21TdHJpbmcgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHZhciBlbmRpYW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICdiZSc7XG5cbiAgdGhpcy5mcm9tVWludDhBcnJheShfdXRpbDIuZGVmYXVsdC5zdHJfdG9fVWludDhBcnJheShzdHIpLCBlbmRpYW4pO1xufTtcblxuTVBJLnByb3RvdHlwZS50b0JOID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IF9ibjIuZGVmYXVsdCh0aGlzLnRvVWludDhBcnJheSgpKTtcbn07XG5cbk1QSS5wcm90b3R5cGUuZnJvbUJOID0gZnVuY3Rpb24gKGJuKSB7XG4gIHRoaXMuZGF0YSA9IGJuLnRvQXJyYXlMaWtlKFVpbnQ4QXJyYXkpO1xufTtcblxuTVBJLmZyb21DbG9uZSA9IGZ1bmN0aW9uIChjbG9uZSkge1xuICByZXR1cm4gbmV3IE1QSShjbG9uZS5kYXRhKTtcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IE1QSTtcblxufSx7XCIuLi91dGlsXCI6Mzk4LFwiYm4uanNcIjo0NH1dLDM5NjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vZW51bXMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbi8vIE9wZW5QR1AuanMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IERlY2VudHJhbFxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAzLjAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogV3JhcHBlciB0byBhbiBPSUQgdmFsdWVcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY2Mzcjc2VjdGlvbi0xMXxSRkM2NjM3LCBzZWN0aW9uIDExfTpcbiAqIFRoZSBzZXF1ZW5jZSBvZiBvY3RldHMgaW4gdGhlIHRoaXJkIGNvbHVtbiBpcyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nXG4gKiB0aGUgRGlzdGluZ3Vpc2hlZCBFbmNvZGluZyBSdWxlcyAoREVSKSB0byB0aGUgQVNOLjEgT2JqZWN0IElkZW50aWZpZXJcbiAqIHdpdGggc3Vic2VxdWVudCB0cnVuY2F0aW9uLiAgVGhlIHRydW5jYXRpb24gcmVtb3ZlcyB0aGUgdHdvIGZpZWxkcyBvZlxuICogZW5jb2RlZCBPYmplY3QgSWRlbnRpZmllci4gIFRoZSBmaXJzdCBvbWl0dGVkIGZpZWxkIGlzIG9uZSBvY3RldFxuICogcmVwcmVzZW50aW5nIHRoZSBPYmplY3QgSWRlbnRpZmllciB0YWcsIGFuZCB0aGUgc2Vjb25kIG9taXR0ZWQgZmllbGRcbiAqIGlzIHRoZSBsZW5ndGggb2YgdGhlIE9iamVjdCBJZGVudGlmaWVyIGJvZHkuICBGb3IgZXhhbXBsZSwgdGhlXG4gKiBjb21wbGV0ZSBBU04uMSBERVIgZW5jb2RpbmcgZm9yIHRoZSBOSVNUIFAtMjU2IGN1cnZlIE9JRCBpcyBcIjA2IDA4IDJBXG4gKiA4NiA0OCBDRSAzRCAwMyAwMSAwN1wiLCBmcm9tIHdoaWNoIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFibGUgYWJvdmVcbiAqIGlzIGNvbnN0cnVjdGVkIGJ5IG9taXR0aW5nIHRoZSBmaXJzdCB0d28gb2N0ZXRzLiAgT25seSB0aGUgdHJ1bmNhdGVkXG4gKiBzZXF1ZW5jZSBvZiBvY3RldHMgaXMgdGhlIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIGEgY3VydmUgT0lELlxuICogQHJlcXVpcmVzIHV0aWxcbiAqIEByZXF1aXJlcyBlbnVtc1xuICogQG1vZHVsZSB0eXBlL29pZFxuICovXG5cbmZ1bmN0aW9uIE9JRChvaWQpIHtcbiAgaWYgKG9pZCBpbnN0YW5jZW9mIE9JRCkge1xuICAgIHRoaXMub2lkID0gb2lkLm9pZDtcbiAgfSBlbHNlIGlmIChfdXRpbDIuZGVmYXVsdC5pc0FycmF5KG9pZCkgfHwgX3V0aWwyLmRlZmF1bHQuaXNVaW50OEFycmF5KG9pZCkpIHtcbiAgICBvaWQgPSBuZXcgVWludDhBcnJheShvaWQpO1xuICAgIGlmIChvaWRbMF0gPT09IDB4MDYpIHtcbiAgICAgIC8vIERFUiBlbmNvZGVkIG9pZCBieXRlIGFycmF5XG4gICAgICBpZiAob2lkWzFdICE9PSBvaWQubGVuZ3RoIC0gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xlbmd0aCBtaXNtYXRjaCBpbiBERVIgZW5jb2RlZCBvaWQnKTtcbiAgICAgIH1cbiAgICAgIG9pZCA9IG9pZC5zdWJhcnJheSgyKTtcbiAgICB9XG4gICAgdGhpcy5vaWQgPSBvaWQ7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5vaWQgPSAnJztcbiAgfVxufVxuXG4vKipcbiAqIE1ldGhvZCB0byByZWFkIGFuIE9JRCBvYmplY3RcbiAqIEBwYXJhbSAge1VpbnQ4QXJyYXl9ICBpbnB1dCAgV2hlcmUgdG8gcmVhZCB0aGUgT0lEIGZyb21cbiAqIEByZXR1cm5zIHtOdW1iZXJ9ICAgICAgICAgICAgIE51bWJlciBvZiByZWFkIGJ5dGVzXG4gKi9cbk9JRC5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICBpZiAoaW5wdXQubGVuZ3RoID49IDEpIHtcbiAgICB2YXIgbGVuZ3RoID0gaW5wdXRbMF07XG4gICAgaWYgKGlucHV0Lmxlbmd0aCA+PSAxICsgbGVuZ3RoKSB7XG4gICAgICB0aGlzLm9pZCA9IGlucHV0LnN1YmFycmF5KDEsIDEgKyBsZW5ndGgpO1xuICAgICAgcmV0dXJuIDEgKyB0aGlzLm9pZC5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBvaWQnKTtcbn07XG5cbi8qKlxuICogU2VyaWFsaXplIGFuIE9JRCBvYmplY3RcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBBcnJheSB3aXRoIHRoZSBzZXJpYWxpemVkIHZhbHVlIHRoZSBPSURcbiAqL1xuT0lELnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW25ldyBVaW50OEFycmF5KFt0aGlzLm9pZC5sZW5ndGhdKSwgdGhpcy5vaWRdKTtcbn07XG5cbi8qKlxuICogU2VyaWFsaXplIGFuIE9JRCBvYmplY3QgYXMgYSBoZXggc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdHJpbmcgd2l0aCB0aGUgaGV4IHZhbHVlIG9mIHRoZSBPSURcbiAqL1xuT0lELnByb3RvdHlwZS50b0hleCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LlVpbnQ4QXJyYXlfdG9faGV4KHRoaXMub2lkKTtcbn07XG5cbi8qKlxuICogSWYgYSBrbm93biBjdXJ2ZSBvYmplY3QgaWRlbnRpZmllciwgcmV0dXJuIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgY3VydmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFN0cmluZyB3aXRoIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgY3VydmVcbiAqL1xuT0lELnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaGV4ID0gdGhpcy50b0hleCgpO1xuICBpZiAoX2VudW1zMi5kZWZhdWx0LmN1cnZlW2hleF0pIHtcbiAgICByZXR1cm4gX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5jdXJ2ZSwgaGV4KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gY3VydmUgb2JqZWN0IGlkZW50aWZpZXIuJyk7XG4gIH1cbn07XG5cbk9JRC5mcm9tQ2xvbmUgPSBmdW5jdGlvbiAoY2xvbmUpIHtcbiAgcmV0dXJuIG5ldyBPSUQoY2xvbmUub2lkKTtcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IE9JRDtcblxufSx7XCIuLi9lbnVtc1wiOjM1OSxcIi4uL3V0aWxcIjozOTh9XSwzOTc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NvbmZpZyA9IF9kZXJlcV8oJy4uL2NvbmZpZycpO1xuXG52YXIgX2NvbmZpZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25maWcpO1xuXG52YXIgX2NyeXB0byA9IF9kZXJlcV8oJy4uL2NyeXB0bycpO1xuXG52YXIgX2NyeXB0bzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcnlwdG8pO1xuXG52YXIgX2VudW1zID0gX2RlcmVxXygnLi4vZW51bXMuanMnKTtcblxudmFyIF9lbnVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnVtcyk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uL3V0aWwuanMnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICovXG4vLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJpbmctdG8ta2V5IHNwZWNpZmllclxuICpcbiAqIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDg4MCNzZWN0aW9uLTMuN3xSRkM0ODgwIDMuN306XG4gKiBTdHJpbmctdG8ta2V5IChTMkspIHNwZWNpZmllcnMgYXJlIHVzZWQgdG8gY29udmVydCBwYXNzcGhyYXNlIHN0cmluZ3NcbiAqIGludG8gc3ltbWV0cmljLWtleSBlbmNyeXB0aW9uL2RlY3J5cHRpb24ga2V5cy4gIFRoZXkgYXJlIHVzZWQgaW4gdHdvXG4gKiBwbGFjZXMsIGN1cnJlbnRseTogdG8gZW5jcnlwdCB0aGUgc2VjcmV0IHBhcnQgb2YgcHJpdmF0ZSBrZXlzIGluIHRoZVxuICogcHJpdmF0ZSBrZXlyaW5nLCBhbmQgdG8gY29udmVydCBwYXNzcGhyYXNlcyB0byBlbmNyeXB0aW9uIGtleXMgZm9yXG4gKiBzeW1tZXRyaWNhbGx5IGVuY3J5cHRlZCBtZXNzYWdlcy5cbiAqIEByZXF1aXJlcyBjb25maWdcbiAqIEByZXF1aXJlcyBjcnlwdG9cbiAqIEByZXF1aXJlcyBlbnVtc1xuICogQHJlcXVpcmVzIHV0aWxcbiAqIEBtb2R1bGUgdHlwZS9zMmtcbiAqL1xuXG5mdW5jdGlvbiBTMksoKSB7XG4gIC8qKiBAdHlwZSB7bW9kdWxlOmVudW1zLmhhc2h9ICovXG4gIHRoaXMuYWxnb3JpdGhtID0gJ3NoYTI1Nic7XG4gIC8qKiBAdHlwZSB7bW9kdWxlOmVudW1zLnMya30gKi9cbiAgdGhpcy50eXBlID0gJ2l0ZXJhdGVkJztcbiAgLyoqIEB0eXBlIHtJbnRlZ2VyfSAqL1xuICB0aGlzLmMgPSBfY29uZmlnMi5kZWZhdWx0LnMya19pdGVyYXRpb25fY291bnRfYnl0ZTtcbiAgLyoqIEVpZ2h0IGJ5dGVzIG9mIHNhbHQgaW4gYSBiaW5hcnkgc3RyaW5nLlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgdGhpcy5zYWx0ID0gbnVsbDtcbn1cblxuUzJLLnByb3RvdHlwZS5nZXRfY291bnQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIEV4cG9uZW50IGJpYXMsIGRlZmluZWQgaW4gUkZDNDg4MFxuICB2YXIgZXhwYmlhcyA9IDY7XG5cbiAgcmV0dXJuIDE2ICsgKHRoaXMuYyAmIDE1KSA8PCAodGhpcy5jID4+IDQpICsgZXhwYmlhcztcbn07XG5cbi8qKlxuICogUGFyc2luZyBmdW5jdGlvbiBmb3IgYSBzdHJpbmctdG8ta2V5IHNwZWNpZmllciAoe0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tMy43fFJGQyA0ODgwIDMuN30pLlxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFBheWxvYWQgb2Ygc3RyaW5nLXRvLWtleSBzcGVjaWZpZXJcbiAqIEByZXR1cm5zIHtJbnRlZ2VyfSBBY3R1YWwgbGVuZ3RoIG9mIHRoZSBvYmplY3RcbiAqL1xuUzJLLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gIHZhciBpID0gMDtcbiAgdGhpcy50eXBlID0gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0LnMyaywgYnl0ZXNbaSsrXSk7XG4gIHRoaXMuYWxnb3JpdGhtID0gX2VudW1zMi5kZWZhdWx0LnJlYWQoX2VudW1zMi5kZWZhdWx0Lmhhc2gsIGJ5dGVzW2krK10pO1xuXG4gIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgY2FzZSAnc2ltcGxlJzpcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2FsdGVkJzpcbiAgICAgIHRoaXMuc2FsdCA9IGJ5dGVzLnN1YmFycmF5KGksIGkgKyA4KTtcbiAgICAgIGkgKz0gODtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaXRlcmF0ZWQnOlxuICAgICAgdGhpcy5zYWx0ID0gYnl0ZXMuc3ViYXJyYXkoaSwgaSArIDgpO1xuICAgICAgaSArPSA4O1xuXG4gICAgICAvLyBPY3RldCAxMDogY291bnQsIGEgb25lLW9jdGV0LCBjb2RlZCB2YWx1ZVxuICAgICAgdGhpcy5jID0gYnl0ZXNbaSsrXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZ251JzpcbiAgICAgIGlmIChfdXRpbDIuZGVmYXVsdC5VaW50OEFycmF5X3RvX3N0cihieXRlcy5zdWJhcnJheShpLCAzKSkgPT09IFwiR05VXCIpIHtcbiAgICAgICAgaSArPSAzOyAvLyBHTlVcbiAgICAgICAgdmFyIGdudUV4dFR5cGUgPSAxMDAwICsgYnl0ZXNbaSsrXTtcbiAgICAgICAgaWYgKGdudUV4dFR5cGUgPT09IDEwMDEpIHtcbiAgICAgICAgICB0aGlzLnR5cGUgPSBnbnVFeHRUeXBlO1xuICAgICAgICAgIC8vIEdudVBHIGV4dGVuc2lvbiBtb2RlIDEwMDEgLS0gZG9uJ3Qgd3JpdGUgc2VjcmV0IGtleSBhdCBhbGxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHMyayBnbnUgcHJvdGVjdGlvbiBtb2RlLlwiKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBzMmsgdHlwZS5cIik7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHMyayB0eXBlLlwiKTtcbiAgfVxuXG4gIHJldHVybiBpO1xufTtcblxuLyoqXG4gKiBTZXJpYWxpemVzIHMyayBpbmZvcm1hdGlvblxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBzMmtcbiAqL1xuUzJLLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFyciA9IFtuZXcgVWludDhBcnJheShbX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5zMmssIHRoaXMudHlwZSksIF9lbnVtczIuZGVmYXVsdC53cml0ZShfZW51bXMyLmRlZmF1bHQuaGFzaCwgdGhpcy5hbGdvcml0aG0pXSldO1xuXG4gIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgY2FzZSAnc2ltcGxlJzpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NhbHRlZCc6XG4gICAgICBhcnIucHVzaCh0aGlzLnNhbHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaXRlcmF0ZWQnOlxuICAgICAgYXJyLnB1c2godGhpcy5zYWx0KTtcbiAgICAgIGFyci5wdXNoKG5ldyBVaW50OEFycmF5KFt0aGlzLmNdKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdnbnUnOlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR05VIHMyayB0eXBlIG5vdCBzdXBwb3J0ZWQuXCIpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHMyayB0eXBlLlwiKTtcbiAgfVxuXG4gIHJldHVybiBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KGFycik7XG59O1xuXG4vKipcbiAqIFByb2R1Y2VzIGEga2V5IHVzaW5nIHRoZSBzcGVjaWZpZWQgcGFzc3BocmFzZSBhbmQgdGhlIGRlZmluZWRcbiAqIGhhc2hBbGdvcml0aG1cbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXNzcGhyYXNlIFBhc3NwaHJhc2UgY29udGFpbmluZyB1c2VyIGlucHV0XG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gUHJvZHVjZWQga2V5IHdpdGggYSBsZW5ndGggY29ycmVzcG9uZGluZyB0b1xuICogaGFzaEFsZ29yaXRobSBoYXNoIGxlbmd0aFxuICovXG5TMksucHJvdG90eXBlLnByb2R1Y2Vfa2V5ID0gZnVuY3Rpb24gKHBhc3NwaHJhc2UsIG51bUJ5dGVzKSB7XG4gIHBhc3NwaHJhc2UgPSBfdXRpbDIuZGVmYXVsdC5zdHJfdG9fVWludDhBcnJheShfdXRpbDIuZGVmYXVsdC5lbmNvZGVfdXRmOChwYXNzcGhyYXNlKSk7XG5cbiAgZnVuY3Rpb24gcm91bmQocHJlZml4LCBzMmspIHtcbiAgICB2YXIgYWxnb3JpdGhtID0gX2VudW1zMi5kZWZhdWx0LndyaXRlKF9lbnVtczIuZGVmYXVsdC5oYXNoLCBzMmsuYWxnb3JpdGhtKTtcblxuICAgIHN3aXRjaCAoczJrLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3NpbXBsZSc6XG4gICAgICAgIHJldHVybiBfY3J5cHRvMi5kZWZhdWx0Lmhhc2guZGlnZXN0KGFsZ29yaXRobSwgX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbcHJlZml4LCBwYXNzcGhyYXNlXSkpO1xuXG4gICAgICBjYXNlICdzYWx0ZWQnOlxuICAgICAgICByZXR1cm4gX2NyeXB0bzIuZGVmYXVsdC5oYXNoLmRpZ2VzdChhbGdvcml0aG0sIF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW3ByZWZpeCwgczJrLnNhbHQsIHBhc3NwaHJhc2VdKSk7XG5cbiAgICAgIGNhc2UgJ2l0ZXJhdGVkJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBjb3VudCA9IHMyay5nZXRfY291bnQoKTtcbiAgICAgICAgICB2YXIgZGF0YSA9IF91dGlsMi5kZWZhdWx0LmNvbmNhdFVpbnQ4QXJyYXkoW3Myay5zYWx0LCBwYXNzcGhyYXNlXSk7XG4gICAgICAgICAgdmFyIGlzcCA9IG5ldyBBcnJheShNYXRoLmNlaWwoY291bnQgLyBkYXRhLmxlbmd0aCkpO1xuXG4gICAgICAgICAgaXNwID0gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShpc3AuZmlsbChkYXRhKSk7XG5cbiAgICAgICAgICBpZiAoaXNwLmxlbmd0aCA+IGNvdW50KSB7XG4gICAgICAgICAgICBpc3AgPSBpc3Auc3ViYXJyYXkoMCwgY291bnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBfY3J5cHRvMi5kZWZhdWx0Lmhhc2guZGlnZXN0KGFsZ29yaXRobSwgX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShbcHJlZml4LCBpc3BdKSk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ2dudSc6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdOVSBzMmsgdHlwZSBub3Qgc3VwcG9ydGVkLlwiKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBzMmsgdHlwZS5cIik7XG4gICAgfVxuICB9XG5cbiAgdmFyIGFyciA9IFtdO1xuICB2YXIgcmxlbmd0aCA9IDA7XG4gIHZhciBwcmVmaXggPSBuZXcgVWludDhBcnJheShudW1CeXRlcyk7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG51bUJ5dGVzOyBfaSsrKSB7XG4gICAgcHJlZml4W19pXSA9IDA7XG4gIH1cblxuICB2YXIgaSA9IDA7XG4gIHdoaWxlIChybGVuZ3RoIDwgbnVtQnl0ZXMpIHtcbiAgICB2YXIgcmVzdWx0ID0gcm91bmQocHJlZml4LnN1YmFycmF5KDAsIGkpLCB0aGlzKTtcbiAgICBhcnIucHVzaChyZXN1bHQpO1xuICAgIHJsZW5ndGggKz0gcmVzdWx0Lmxlbmd0aDtcbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4gX3V0aWwyLmRlZmF1bHQuY29uY2F0VWludDhBcnJheShhcnIpLnN1YmFycmF5KDAsIG51bUJ5dGVzKTtcbn07XG5cblMySy5mcm9tQ2xvbmUgPSBmdW5jdGlvbiAoY2xvbmUpIHtcbiAgdmFyIHMyayA9IG5ldyBTMksoKTtcbiAgczJrLmFsZ29yaXRobSA9IGNsb25lLmFsZ29yaXRobTtcbiAgczJrLnR5cGUgPSBjbG9uZS50eXBlO1xuICBzMmsuYyA9IGNsb25lLmM7XG4gIHMyay5zYWx0ID0gY2xvbmUuc2FsdDtcbiAgcmV0dXJuIHMyaztcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFMySztcblxufSx7XCIuLi9jb25maWdcIjozMjUsXCIuLi9jcnlwdG9cIjozNDAsXCIuLi9lbnVtcy5qc1wiOjM1OSxcIi4uL3V0aWwuanNcIjozOTh9XSwzOTg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXknKTtcblxudmFyIF9zbGljZWRUb0FycmF5MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NsaWNlZFRvQXJyYXkyKTtcblxudmFyIF92YWx1ZXMgPSBfZGVyZXFfKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L3ZhbHVlcycpO1xuXG52YXIgX3ZhbHVlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF92YWx1ZXMpO1xuXG52YXIgX2FkZHJlc3NSZmMgPSBfZGVyZXFfKCdhZGRyZXNzLXJmYzI4MjInKTtcblxudmFyIF9hZGRyZXNzUmZjMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FkZHJlc3NSZmMpO1xuXG52YXIgX2NvbmZpZyA9IF9kZXJlcV8oJy4vY29uZmlnJyk7XG5cbnZhciBfY29uZmlnMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbmZpZyk7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4vdXRpbCcpO1xuXG52YXIgX3V0aWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbCk7XG5cbnZhciBfYmFzZSA9IF9kZXJlcV8oJy4vZW5jb2RpbmcvYmFzZTY0Jyk7XG5cbnZhciBfYmFzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9iYXNlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuXG4vKipcbiAqIFRoaXMgb2JqZWN0IGNvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zXG4gKiBAcmVxdWlyZXMgYWRkcmVzcy1yZmMyODIyXG4gKiBAcmVxdWlyZXMgY29uZmlnXG4gKiBAcmVxdWlyZXMgZW5jb2RpbmcvYmFzZTY0XG4gKiBAbW9kdWxlIHV0aWxcbiAqL1xuXG52YXIgaXNJRTExID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9UcmlkZW50XFwvN1xcLjAuKnJ2OihbMC05Ll0rKS4qXFwpLipHZWNrbyQvKTsgLy8gcmUtaW1wb3J0IG1vZHVsZSB0byBhY2Nlc3MgdXRpbCBmdW5jdGlvbnNcbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgaXNTdHJpbmc6IGZ1bmN0aW9uIGlzU3RyaW5nKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnIHx8IFN0cmluZy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihkYXRhKTtcbiAgfSxcblxuICBpc0FycmF5OiBmdW5jdGlvbiBpc0FycmF5KGRhdGEpIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZGF0YSk7XG4gIH0sXG5cbiAgaXNVaW50OEFycmF5OiBmdW5jdGlvbiBpc1VpbnQ4QXJyYXkoZGF0YSkge1xuICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGRhdGEpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNmZXJhYmxlIG9iamVjdHMgdG8gcGFzcyBidWZmZXJzIHdpdGggemVybyBjb3B5IChzaW1pbGFyIHRvIFwicGFzcyBieSByZWZlcmVuY2VcIiBpbiBDKyspXG4gICAqICAgU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV29ya2VyL3Bvc3RNZXNzYWdlXG4gICAqIEBwYXJhbSAge09iamVjdH0gb2JqICAgICAgICAgICB0aGUgb3B0aW9ucyBvYmplY3QgdG8gYmUgcGFzc2VkIHRvIHRoZSB3ZWIgd29ya2VyXG4gICAqIEByZXR1cm5zIHtBcnJheTxBcnJheUJ1ZmZlcj59ICAgYW4gYXJyYXkgb2YgYmluYXJ5IGRhdGEgdG8gYmUgcGFzc2VkXG4gICAqL1xuICBnZXRUcmFuc2ZlcmFibGVzOiBmdW5jdGlvbiBnZXRUcmFuc2ZlcmFibGVzKG9iaikge1xuICAgIC8vIEludGVybmV0IEV4cGxvcmVyIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNmZXJhYmxlIG9iamVjdHMuXG4gICAgaWYgKGlzSUUxMSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKF9jb25maWcyLmRlZmF1bHQuemVyb19jb3B5ICYmIE9iamVjdC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvYmopKSB7XG4gICAgICB2YXIgdHJhbnNmZXJhYmxlcyA9IFtdO1xuICAgICAgX3V0aWwyLmRlZmF1bHQuY29sbGVjdEJ1ZmZlcnMob2JqLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgIHJldHVybiB0cmFuc2ZlcmFibGVzLmxlbmd0aCA/IHRyYW5zZmVyYWJsZXMgOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9LFxuXG4gIGNvbGxlY3RCdWZmZXJzOiBmdW5jdGlvbiBjb2xsZWN0QnVmZmVycyhvYmosIGNvbGxlY3Rpb24pIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoX3V0aWwyLmRlZmF1bHQuaXNVaW50OEFycmF5KG9iaikgJiYgY29sbGVjdGlvbi5pbmRleE9mKG9iai5idWZmZXIpID09PSAtMSkge1xuICAgICAgY29sbGVjdGlvbi5wdXNoKG9iai5idWZmZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG9iaikpIHtcbiAgICAgICgwLCBfdmFsdWVzMi5kZWZhdWx0KShvYmopLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIHJlY3Vyc2l2ZWx5IHNlYXJjaCBhbGwgY2hpbGRyZW5cbiAgICAgICAgX3V0aWwyLmRlZmF1bHQuY29sbGVjdEJ1ZmZlcnModmFsdWUsIGNvbGxlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHJlYWROdW1iZXI6IGZ1bmN0aW9uIHJlYWROdW1iZXIoYnl0ZXMpIHtcbiAgICB2YXIgbiA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbiArPSBNYXRoLnBvdygyNTYsIGkpICogYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gMSAtIGldO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfSxcblxuICB3cml0ZU51bWJlcjogZnVuY3Rpb24gd3JpdGVOdW1iZXIobiwgYnl0ZXMpIHtcbiAgICB2YXIgYiA9IG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzOyBpKyspIHtcbiAgICAgIGJbaV0gPSBuID4+IDggKiAoYnl0ZXMgLSBpIC0gMSkgJiAweEZGO1xuICAgIH1cblxuICAgIHJldHVybiBiO1xuICB9LFxuXG4gIHJlYWREYXRlOiBmdW5jdGlvbiByZWFkRGF0ZShieXRlcykge1xuICAgIHZhciBuID0gX3V0aWwyLmRlZmF1bHQucmVhZE51bWJlcihieXRlcyk7XG4gICAgdmFyIGQgPSBuZXcgRGF0ZShuICogMTAwMCk7XG4gICAgcmV0dXJuIGQ7XG4gIH0sXG5cbiAgd3JpdGVEYXRlOiBmdW5jdGlvbiB3cml0ZURhdGUodGltZSkge1xuICAgIHZhciBudW1lcmljID0gTWF0aC5mbG9vcih0aW1lLmdldFRpbWUoKSAvIDEwMDApO1xuXG4gICAgcmV0dXJuIF91dGlsMi5kZWZhdWx0LndyaXRlTnVtYmVyKG51bWVyaWMsIDQpO1xuICB9LFxuXG4gIG5vcm1hbGl6ZURhdGU6IGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGUoKSB7XG4gICAgdmFyIHRpbWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IERhdGUubm93KCk7XG5cbiAgICByZXR1cm4gdGltZSA9PT0gbnVsbCA/IHRpbWUgOiBuZXcgRGF0ZShNYXRoLmZsb29yKCt0aW1lIC8gMTAwMCkgKiAxMDAwKTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlIGhleCBzdHJpbmcgZnJvbSBhIGJpbmFyeVxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFN0cmluZyB0byBjb252ZXJ0XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IFN0cmluZyBjb250YWluaW5nIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXNcbiAgICovXG4gIHN0cl90b19oZXg6IGZ1bmN0aW9uIHN0cl90b19oZXgoc3RyKSB7XG4gICAgaWYgKHN0ciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHZhciByID0gW107XG4gICAgdmFyIGUgPSBzdHIubGVuZ3RoO1xuICAgIHZhciBjID0gMDtcbiAgICB2YXIgaCA9IHZvaWQgMDtcbiAgICB3aGlsZSAoYyA8IGUpIHtcbiAgICAgIGggPSBzdHIuY2hhckNvZGVBdChjKyspLnRvU3RyaW5nKDE2KTtcbiAgICAgIHdoaWxlIChoLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgaCA9IFwiMFwiICsgaDtcbiAgICAgIH1cbiAgICAgIHIucHVzaChcIlwiICsgaCk7XG4gICAgfVxuICAgIHJldHVybiByLmpvaW4oJycpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYmluYXJ5IHN0cmluZyBmcm9tIGEgaGV4IGVuY29kZWQgc3RyaW5nXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgSGV4IHN0cmluZyB0byBjb252ZXJ0XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBoZXhfdG9fc3RyOiBmdW5jdGlvbiBoZXhfdG9fc3RyKGhleCkge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhleC5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoaGV4LnN1YnN0cihpLCAyKSwgMTYpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfSxcblxuICAvKipcbiAgICogQ29udmVydCBhIFVpbnQ4QXJyYXkgdG8gYW4gTVBJLWZvcm1hdHRlZCBVaW50OEFycmF5LlxuICAgKiBOb3RlOiB0aGUgb3V0cHV0IGlzICoqbm90KiogYW4gTVBJIG9iamVjdC5cbiAgICogQHNlZSB7QGxpbmsgbW9kdWxlOnR5cGUvbXBpL01QSS5mcm9tVWludDhBcnJheX1cbiAgICogQHNlZSB7QGxpbmsgbW9kdWxlOnR5cGUvbXBpL01QSS50b1VpbnQ4QXJyYXl9XG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gYmluIEFuIGFycmF5IG9mIDgtYml0IGludGVnZXJzIHRvIGNvbnZlcnRcbiAgICogQHJldHVybnMge1VpbnQ4QXJyYXl9IE1QSS1mb3JtYXR0ZWQgVWludDhBcnJheVxuICAgKi9cbiAgVWludDhBcnJheV90b19NUEk6IGZ1bmN0aW9uIFVpbnQ4QXJyYXlfdG9fTVBJKGJpbikge1xuICAgIHZhciBzaXplID0gKGJpbi5sZW5ndGggLSAxKSAqIDggKyBfdXRpbDIuZGVmYXVsdC5uYml0cyhiaW5bMF0pO1xuICAgIHZhciBwcmVmaXggPSBVaW50OEFycmF5LmZyb20oWyhzaXplICYgMHhGRjAwKSA+PiA4LCBzaXplICYgMHhGRl0pO1xuICAgIHJldHVybiBfdXRpbDIuZGVmYXVsdC5jb25jYXRVaW50OEFycmF5KFtwcmVmaXgsIGJpbl0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQmFzZS02NCBlbmNvZGVkIHN0cmluZyBhbiBhcnJheSBvZiA4LWJpdCBpbnRlZ2VyXG4gICAqXG4gICAqIE5vdGU6IGFjY2VwdHMgYm90aCBSYWRpeC02NCBhbmQgVVJMLXNhZmUgc3RyaW5nc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gYmFzZTY0IEJhc2UtNjQgZW5jb2RlZCBzdHJpbmcgdG8gY29udmVydFxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gQW4gYXJyYXkgb2YgOC1iaXQgaW50ZWdlcnNcbiAgICovXG4gIGI2NF90b19VaW50OEFycmF5OiBmdW5jdGlvbiBiNjRfdG9fVWludDhBcnJheShiYXNlNjQpIHtcbiAgICByZXR1cm4gX2Jhc2UyLmRlZmF1bHQuZGVjb2RlKGJhc2U2NC5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpKTtcbiAgfSxcblxuICAvKipcbiAgICogQ29udmVydCBhbiBhcnJheSBvZiA4LWJpdCBpbnRlZ2VyIHRvIGEgQmFzZS02NCBlbmNvZGVkIHN0cmluZ1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzIEFuIGFycmF5IG9mIDgtYml0IGludGVnZXJzIHRvIGNvbnZlcnRcbiAgICogQHBhcmFtIHtib29sfSAgICAgICB1cmwgICBJZiB0cnVlLCBvdXRwdXQgaXMgVVJMLXNhZmVcbiAgICogQHJldHVybnMge1N0cmluZ30gICAgICAgICAgQmFzZS02NCBlbmNvZGVkIHN0cmluZ1xuICAgKi9cbiAgVWludDhBcnJheV90b19iNjQ6IGZ1bmN0aW9uIFVpbnQ4QXJyYXlfdG9fYjY0KGJ5dGVzLCB1cmwpIHtcbiAgICByZXR1cm4gX2Jhc2UyLmRlZmF1bHQuZW5jb2RlKGJ5dGVzLCB1cmwpLnJlcGxhY2UoLyhcXG4pL2csICcnKTtcbiAgfSxcblxuICAvKipcbiAgICogQ29udmVydCBhIGhleCBzdHJpbmcgdG8gYW4gYXJyYXkgb2YgOC1iaXQgaW50ZWdlcnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IGhleCAgQSBoZXggc3RyaW5nIHRvIGNvbnZlcnRcbiAgICogQHJldHVybnMge1VpbnQ4QXJyYXl9IEFuIGFycmF5IG9mIDgtYml0IGludGVnZXJzXG4gICAqL1xuICBoZXhfdG9fVWludDhBcnJheTogZnVuY3Rpb24gaGV4X3RvX1VpbnQ4QXJyYXkoaGV4KSB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGhleC5sZW5ndGggPj4gMSk7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBoZXgubGVuZ3RoID4+IDE7IGsrKykge1xuICAgICAgcmVzdWx0W2tdID0gcGFyc2VJbnQoaGV4LnN1YnN0cihrIDw8IDEsIDIpLCAxNik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYW4gYXJyYXkgb2YgOC1iaXQgaW50ZWdlcnMgdG8gYSBoZXggc3RyaW5nXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gYnl0ZXMgQXJyYXkgb2YgOC1iaXQgaW50ZWdlcnMgdG8gY29udmVydFxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBIZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJyYXlcbiAgICovXG4gIFVpbnQ4QXJyYXlfdG9faGV4OiBmdW5jdGlvbiBVaW50OEFycmF5X3RvX2hleChieXRlcykge1xuICAgIHZhciByID0gW107XG4gICAgdmFyIGUgPSBieXRlcy5sZW5ndGg7XG4gICAgdmFyIGMgPSAwO1xuICAgIHZhciBoID0gdm9pZCAwO1xuICAgIHdoaWxlIChjIDwgZSkge1xuICAgICAgaCA9IGJ5dGVzW2MrK10udG9TdHJpbmcoMTYpO1xuICAgICAgd2hpbGUgKGgubGVuZ3RoIDwgMikge1xuICAgICAgICBoID0gXCIwXCIgKyBoO1xuICAgICAgfVxuICAgICAgci5wdXNoKFwiXCIgKyBoKTtcbiAgICB9XG4gICAgcmV0dXJuIHIuam9pbignJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gYXJyYXkgb2YgOC1iaXQgaW50ZWdlcnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTdHJpbmcgdG8gY29udmVydFxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gQW4gYXJyYXkgb2YgOC1iaXQgaW50ZWdlcnNcbiAgICovXG4gIHN0cl90b19VaW50OEFycmF5OiBmdW5jdGlvbiBzdHJfdG9fVWludDhBcnJheShzdHIpIHtcbiAgICBpZiAoIV91dGlsMi5kZWZhdWx0LmlzU3RyaW5nKHN0cikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc3RyX3RvX1VpbnQ4QXJyYXk6IERhdGEgbXVzdCBiZSBpbiB0aGUgZm9ybSBvZiBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYW4gYXJyYXkgb2YgOC1iaXQgaW50ZWdlcnMgdG8gYSBzdHJpbmdcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlcyBBbiBhcnJheSBvZiA4LWJpdCBpbnRlZ2VycyB0byBjb252ZXJ0XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJyYXlcbiAgICovXG4gIFVpbnQ4QXJyYXlfdG9fc3RyOiBmdW5jdGlvbiBVaW50OEFycmF5X3RvX3N0cihieXRlcykge1xuICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgYnMgPSAxIDw8IDE0O1xuICAgIHZhciBqID0gYnl0ZXMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBqOyBpICs9IGJzKSB7XG4gICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgYnl0ZXMuc3ViYXJyYXkoaSwgaSArIGJzIDwgaiA/IGkgKyBicyA6IGopKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuam9pbignJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBuYXRpdmUgamF2YXNjcmlwdCBzdHJpbmcgdG8gYSBzdHJpbmcgb2YgdXRmOCBieXRlc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gY29udmVydFxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBIHZhbGlkIHNxdWVuY2Ugb2YgdXRmOCBieXRlc1xuICAgKi9cbiAgZW5jb2RlX3V0Zjg6IGZ1bmN0aW9uIGVuY29kZV91dGY4KHN0cikge1xuICAgIHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBzdHJpbmcgb2YgdXRmOCBieXRlcyB0byBhIG5hdGl2ZSBqYXZhc2NyaXB0IHN0cmluZ1xuICAgKiBAcGFyYW0ge1N0cmluZ30gdXRmOCBBIHZhbGlkIHNxdWVuY2Ugb2YgdXRmOCBieXRlc1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBIG5hdGl2ZSBqYXZhc2NyaXB0IHN0cmluZ1xuICAgKi9cbiAgZGVjb2RlX3V0Zjg6IGZ1bmN0aW9uIGRlY29kZV91dGY4KHV0ZjgpIHtcbiAgICBpZiAodHlwZW9mIHV0ZjggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciBcInV0ZjhcIiBpcyBub3Qgb2YgdHlwZSBzdHJpbmcnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHV0ZjgpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdXRmODtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbmNhdCBVaW50OGFycmF5c1xuICAgKiBAcGFyYW0ge0FycmF5PFVpbnQ4YXJyYXk+fSBBcnJheSBvZiBVaW50OEFycmF5cyB0byBjb25jYXRlbmF0ZVxuICAgKiBAcmV0dXJucyB7VWludDhhcnJheX0gQ29uY2F0ZW5hdGVkIGFycmF5XG4gICAqL1xuICBjb25jYXRVaW50OEFycmF5OiBmdW5jdGlvbiBjb25jYXRVaW50OEFycmF5KGFycmF5cykge1xuICAgIHZhciB0b3RhbExlbmd0aCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghX3V0aWwyLmRlZmF1bHQuaXNVaW50OEFycmF5KGFycmF5c1tpXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb25jYXRVaW50OEFycmF5OiBEYXRhIG11c3QgYmUgaW4gdGhlIGZvcm0gb2YgYSBVaW50OEFycmF5Jyk7XG4gICAgICB9XG5cbiAgICAgIHRvdGFsTGVuZ3RoICs9IGFycmF5c1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICB2YXIgcG9zID0gMDtcbiAgICBhcnJheXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgcmVzdWx0LnNldChlbGVtZW50LCBwb3MpO1xuICAgICAgcG9zICs9IGVsZW1lbnQubGVuZ3RoO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSxcblxuICAvKipcbiAgICogRGVlcCBjb3B5IFVpbnQ4QXJyYXlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBBcnJheSB0byBjb3B5XG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBuZXcgVWludDhBcnJheVxuICAgKi9cbiAgY29weVVpbnQ4QXJyYXk6IGZ1bmN0aW9uIGNvcHlVaW50OEFycmF5KGFycmF5KSB7XG4gICAgaWYgKCFfdXRpbDIuZGVmYXVsdC5pc1VpbnQ4QXJyYXkoYXJyYXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgbXVzdCBiZSBpbiB0aGUgZm9ybSBvZiBhIFVpbnQ4QXJyYXknKTtcbiAgICB9XG5cbiAgICB2YXIgY29weSA9IG5ldyBVaW50OEFycmF5KGFycmF5Lmxlbmd0aCk7XG4gICAgY29weS5zZXQoYXJyYXkpO1xuICAgIHJldHVybiBjb3B5O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVjayBVaW50OEFycmF5IGVxdWFsaXR5XG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gZmlyc3QgYXJyYXlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBzZWNvbmQgYXJyYXlcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGVxdWFsaXR5XG4gICAqL1xuICBlcXVhbHNVaW50OEFycmF5OiBmdW5jdGlvbiBlcXVhbHNVaW50OEFycmF5KGFycmF5MSwgYXJyYXkyKSB7XG4gICAgaWYgKCFfdXRpbDIuZGVmYXVsdC5pc1VpbnQ4QXJyYXkoYXJyYXkxKSB8fCAhX3V0aWwyLmRlZmF1bHQuaXNVaW50OEFycmF5KGFycmF5MikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YSBtdXN0IGJlIGluIHRoZSBmb3JtIG9mIGEgVWludDhBcnJheScpO1xuICAgIH1cblxuICAgIGlmIChhcnJheTEubGVuZ3RoICE9PSBhcnJheTIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcnJheTFbaV0gIT09IGFycmF5MltpXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGEgMTZiaXQgc3VtIG9mIGEgVWludDhBcnJheSBieSBhZGRpbmcgZWFjaCBjaGFyYWN0ZXJcbiAgICogY29kZXMgbW9kdWx1cyA2NTUzNVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IFVpbnQ4QXJyYXkgdG8gY3JlYXRlIGEgc3VtIG9mXG4gICAqIEByZXR1cm5zIHtJbnRlZ2VyfSBBbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHN1bSBvZiBhbGwgY2hhcmFjdGVyXG4gICAqIGNvZGVzICUgNjU1MzVcbiAgICovXG4gIGNhbGNfY2hlY2tzdW06IGZ1bmN0aW9uIGNhbGNfY2hlY2tzdW0odGV4dCkge1xuICAgIHZhciBjaGVja3N1bSA9IHtcbiAgICAgIHM6IDAsXG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZChzYWRkKSB7XG4gICAgICAgIHRoaXMucyA9ICh0aGlzLnMgKyBzYWRkKSAlIDY1NTM2O1xuICAgICAgfVxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGVja3N1bS5hZGQodGV4dFtpXSk7XG4gICAgfVxuICAgIHJldHVybiBjaGVja3N1bS5zO1xuICB9LFxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gcHJpbnQgYSBkZWJ1ZyBtZXNzYWdlLiBEZWJ1Z1xuICAgKiBtZXNzYWdlcyBhcmUgb25seSBwcmludGVkIGlmXG4gICAqIEBsaW5rIG1vZHVsZTpjb25maWcvY29uZmlnLmRlYnVnIGlzIHNldCB0byB0cnVlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFN0cmluZyBvZiB0aGUgZGVidWcgbWVzc2FnZVxuICAgKi9cbiAgcHJpbnRfZGVidWc6IGZ1bmN0aW9uIHByaW50X2RlYnVnKHN0cikge1xuICAgIGlmIChfY29uZmlnMi5kZWZhdWx0LmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmxvZyhzdHIpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHByaW50IGEgZGVidWcgbWVzc2FnZS4gRGVidWdcbiAgICogbWVzc2FnZXMgYXJlIG9ubHkgcHJpbnRlZCBpZlxuICAgKiBAbGluayBtb2R1bGU6Y29uZmlnL2NvbmZpZy5kZWJ1ZyBpcyBzZXQgdG8gdHJ1ZS5cbiAgICogRGlmZmVyZW50IHRoYW4gcHJpbnRfZGVidWcgYmVjYXVzZSB3aWxsIGNhbGwgVWludDhBcnJheV90b19oZXggaWZmIG5lY2Vzc2FyeS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTdHJpbmcgb2YgdGhlIGRlYnVnIG1lc3NhZ2VcbiAgICovXG4gIHByaW50X2RlYnVnX2hleGFycmF5X2R1bXA6IGZ1bmN0aW9uIHByaW50X2RlYnVnX2hleGFycmF5X2R1bXAoc3RyLCBhcnJUb0hleCkge1xuICAgIGlmIChfY29uZmlnMi5kZWZhdWx0LmRlYnVnKSB7XG4gICAgICBzdHIgKz0gJzogJyArIF91dGlsMi5kZWZhdWx0LlVpbnQ4QXJyYXlfdG9faGV4KGFyclRvSGV4KTtcbiAgICAgIGNvbnNvbGUubG9nKHN0cik7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gcHJpbnQgYSBkZWJ1ZyBtZXNzYWdlLiBEZWJ1Z1xuICAgKiBtZXNzYWdlcyBhcmUgb25seSBwcmludGVkIGlmXG4gICAqIEBsaW5rIG1vZHVsZTpjb25maWcvY29uZmlnLmRlYnVnIGlzIHNldCB0byB0cnVlLlxuICAgKiBEaWZmZXJlbnQgdGhhbiBwcmludF9kZWJ1ZyBiZWNhdXNlIHdpbGwgY2FsbCBzdHJfdG9faGV4IGlmZiBuZWNlc3NhcnkuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgU3RyaW5nIG9mIHRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAqL1xuICBwcmludF9kZWJ1Z19oZXhzdHJfZHVtcDogZnVuY3Rpb24gcHJpbnRfZGVidWdfaGV4c3RyX2R1bXAoc3RyLCBzdHJUb0hleCkge1xuICAgIGlmIChfY29uZmlnMi5kZWZhdWx0LmRlYnVnKSB7XG4gICAgICBzdHIgKz0gX3V0aWwyLmRlZmF1bHQuc3RyX3RvX2hleChzdHJUb0hleCk7XG4gICAgICBjb25zb2xlLmxvZyhzdHIpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHByaW50IGEgZGVidWcgZXJyb3IuIERlYnVnXG4gICAqIG1lc3NhZ2VzIGFyZSBvbmx5IHByaW50ZWQgaWZcbiAgICogQGxpbmsgbW9kdWxlOmNvbmZpZy9jb25maWcuZGVidWcgaXMgc2V0IHRvIHRydWUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgU3RyaW5nIG9mIHRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAqL1xuICBwcmludF9kZWJ1Z19lcnJvcjogZnVuY3Rpb24gcHJpbnRfZGVidWdfZXJyb3IoZXJyb3IpIHtcbiAgICBpZiAoX2NvbmZpZzIuZGVmYXVsdC5kZWJ1Zykge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9LFxuXG4gIGdldExlZnROQml0czogZnVuY3Rpb24gZ2V0TGVmdE5CaXRzKGFycmF5LCBiaXRjb3VudCkge1xuICAgIHZhciByZXN0ID0gYml0Y291bnQgJSA4O1xuICAgIGlmIChyZXN0ID09PSAwKSB7XG4gICAgICByZXR1cm4gYXJyYXkuc3ViYXJyYXkoMCwgYml0Y291bnQgLyA4KTtcbiAgICB9XG4gICAgdmFyIGJ5dGVzID0gKGJpdGNvdW50IC0gcmVzdCkgLyA4ICsgMTtcbiAgICB2YXIgcmVzdWx0ID0gYXJyYXkuc3ViYXJyYXkoMCwgYnl0ZXMpO1xuICAgIHJldHVybiBfdXRpbDIuZGVmYXVsdC5zaGlmdFJpZ2h0KHJlc3VsdCwgOCAtIHJlc3QpOyAvLyArU3RyaW5nLmZyb21DaGFyQ29kZShzdHJpbmcuY2hhckNvZGVBdChieXRlcyAtMSkgPDwgKDgtcmVzdCkgJiAweEZGKTtcbiAgfSxcblxuICAvLyByZXR1cm5zIGJpdCBsZW5ndGggb2YgdGhlIGludGVnZXIgeFxuICBuYml0czogZnVuY3Rpb24gbmJpdHMoeCkge1xuICAgIHZhciByID0gMTtcbiAgICB2YXIgdCA9IHggPj4+IDE2O1xuICAgIGlmICh0ICE9PSAwKSB7XG4gICAgICB4ID0gdDtcbiAgICAgIHIgKz0gMTY7XG4gICAgfVxuICAgIHQgPSB4ID4+IDg7XG4gICAgaWYgKHQgIT09IDApIHtcbiAgICAgIHggPSB0O1xuICAgICAgciArPSA4O1xuICAgIH1cbiAgICB0ID0geCA+PiA0O1xuICAgIGlmICh0ICE9PSAwKSB7XG4gICAgICB4ID0gdDtcbiAgICAgIHIgKz0gNDtcbiAgICB9XG4gICAgdCA9IHggPj4gMjtcbiAgICBpZiAodCAhPT0gMCkge1xuICAgICAgeCA9IHQ7XG4gICAgICByICs9IDI7XG4gICAgfVxuICAgIHQgPSB4ID4+IDE7XG4gICAgaWYgKHQgIT09IDApIHtcbiAgICAgIHggPSB0O1xuICAgICAgciArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfSxcblxuICAvKipcbiAgICogSWYgU1sxXSA9PSAwLCB0aGVuIGRvdWJsZShTKSA9PSAoU1syLi4xMjhdIHx8IDApO1xuICAgKiBvdGhlcndpc2UsIGRvdWJsZShTKSA9PSAoU1syLi4xMjhdIHx8IDApIHhvclxuICAgKiAoemVyb3MoMTIwKSB8fCAxMDAwMDExMSkuXG4gICAqXG4gICAqIEJvdGggT0NCIGFuZCBFQVggKHRocm91Z2ggQ01BQykgcmVxdWlyZSB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNvbnN0YW50LXRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICAgKi9cbiAgZG91YmxlOiBmdW5jdGlvbiBkb3VibGUoZGF0YSkge1xuICAgIHZhciBkb3VibGUgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCk7XG4gICAgdmFyIGxhc3QgPSBkYXRhLmxlbmd0aCAtIDE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0OyBpKyspIHtcbiAgICAgIGRvdWJsZVtpXSA9IGRhdGFbaV0gPDwgMSBeIGRhdGFbaSArIDFdID4+IDc7XG4gICAgfVxuICAgIGRvdWJsZVtsYXN0XSA9IGRhdGFbbGFzdF0gPDwgMSBeIChkYXRhWzBdID4+IDcpICogMHg4NztcbiAgICByZXR1cm4gZG91YmxlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTaGlmdCBhIFVpbnQ4QXJyYXkgdG8gdGhlIHJpZ2h0IGJ5IG4gYml0c1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzaGlmdFxuICAgKiBAcGFyYW0ge0ludGVnZXJ9IGJpdHMgQW1vdW50IG9mIGJpdHMgdG8gc2hpZnQgKE1VU1QgYmUgc21hbGxlclxuICAgKiB0aGFuIDgpXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IFJlc3VsdGluZyBhcnJheS5cbiAgICovXG4gIHNoaWZ0UmlnaHQ6IGZ1bmN0aW9uIHNoaWZ0UmlnaHQoYXJyYXksIGJpdHMpIHtcbiAgICBpZiAoYml0cykge1xuICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGFycmF5W2ldID4+PSBiaXRzO1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICBhcnJheVtpXSB8PSBhcnJheVtpIC0gMV0gPDwgOCAtIGJpdHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgbmF0aXZlIFdlYiBDcnlwdG9ncmFwaHkgYXBpLCBvbmx5IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHNwZWMuXG4gICAqIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgdG8gdXNlIHRoZSBhcGkgd2hlbiBhdmFpbGFibGUuIEJ1dCBpdCBjYW5cbiAgICogYmUgZGVhY3RpdmF0ZWQgd2l0aCBjb25maWcudXNlX25hdGl2ZVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSAgIFRoZSBTdWJ0bGVDcnlwdG8gYXBpIG9yICd1bmRlZmluZWQnXG4gICAqL1xuICBnZXRXZWJDcnlwdG86IGZ1bmN0aW9uIGdldFdlYkNyeXB0bygpIHtcbiAgICBpZiAoIV9jb25maWcyLmRlZmF1bHQudXNlX25hdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY3J5cHRvICYmIHdpbmRvdy5jcnlwdG8uc3VidGxlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgbmF0aXZlIFdlYiBDcnlwdG9ncmFwaHkgYXBpIGZvciBhbGwgYnJvd3NlcnMsIGluY2x1ZGluZyBsZWdhY3lcbiAgICogaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzcGVjIGUuZyBJRTExIGFuZCBTYWZhcmkgOC85LiBUaGUgZGVmYXVsdFxuICAgKiBjb25maWd1cmF0aW9uIGlzIHRvIHVzZSB0aGUgYXBpIHdoZW4gYXZhaWxhYmxlLiBCdXQgaXQgY2FuIGJlIGRlYWN0aXZhdGVkXG4gICAqIHdpdGggY29uZmlnLnVzZV9uYXRpdmVcbiAgICogQHJldHVybnMge09iamVjdH0gICBUaGUgU3VidGxlQ3J5cHRvIGFwaSBvciAndW5kZWZpbmVkJ1xuICAgKi9cbiAgZ2V0V2ViQ3J5cHRvQWxsOiBmdW5jdGlvbiBnZXRXZWJDcnlwdG9BbGwoKSB7XG4gICAgaWYgKCFfY29uZmlnMi5kZWZhdWx0LnVzZV9uYXRpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh3aW5kb3cuY3J5cHRvKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnN1YnRsZSB8fCB3aW5kb3cuY3J5cHRvLndlYmtpdFN1YnRsZTtcbiAgICAgIH1cbiAgICAgIGlmICh3aW5kb3cubXNDcnlwdG8pIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5tc0NyeXB0by5zdWJ0bGU7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBEZXRlY3QgTm9kZS5qcyBydW50aW1lLlxuICAgKi9cbiAgZGV0ZWN0Tm9kZTogZnVuY3Rpb24gZGV0ZWN0Tm9kZSgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCc7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCBuYXRpdmUgTm9kZS5qcyBjcnlwdG8gYXBpLiBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIHRvIHVzZVxuICAgKiB0aGUgYXBpIHdoZW4gYXZhaWxhYmxlLiBCdXQgaXQgY2FuIGFsc28gYmUgZGVhY3RpdmF0ZWQgd2l0aCBjb25maWcudXNlX25hdGl2ZVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSAgIFRoZSBjcnlwdG8gbW9kdWxlIG9yICd1bmRlZmluZWQnXG4gICAqL1xuICBnZXROb2RlQ3J5cHRvOiBmdW5jdGlvbiBnZXROb2RlQ3J5cHRvKCkge1xuICAgIGlmICghX3V0aWwyLmRlZmF1bHQuZGV0ZWN0Tm9kZSgpIHx8ICFfY29uZmlnMi5kZWZhdWx0LnVzZV9uYXRpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gX2RlcmVxXygnY3J5cHRvJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCBuYXRpdmUgTm9kZS5qcyBCdWZmZXIgY29uc3RydWN0b3IuIFRoaXMgc2hvdWxkIGJlIHVzZWQgc2luY2VcbiAgICogQnVmZmVyIGlzIG5vdCBhdmFpbGFibGUgdW5kZXIgYnJvd3NlcmlmeS5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSAgIFRoZSBCdWZmZXIgY29uc3RydWN0b3Igb3IgJ3VuZGVmaW5lZCdcbiAgICovXG4gIGdldE5vZGVCdWZmZXI6IGZ1bmN0aW9uIGdldE5vZGVCdWZmZXIoKSB7XG4gICAgaWYgKCFfdXRpbDIuZGVmYXVsdC5kZXRlY3ROb2RlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGlzIFwiaGFja1wiIGFsbG93cyB1cyB0byBhY2Nlc3MgdGhlIG5hdGl2ZSBub2RlIGJ1ZmZlciBtb2R1bGUuXG4gICAgLy8gb3RoZXJ3aXNlLCBpdCBnZXRzIHJlcGxhY2VkIHdpdGggdGhlIGJyb3dzZXJpZmllZCB2ZXJzaW9uXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtY29uY2F0LCBpbXBvcnQvbm8tZHluYW1pYy1yZXF1aXJlXG4gICAgcmV0dXJuIF9kZXJlcV8oJ2J1ZicgKyAnZmVyJykuQnVmZmVyO1xuICB9LFxuXG4gIGdldE5vZGVabGliOiBmdW5jdGlvbiBnZXROb2RlWmxpYigpIHtcbiAgICBpZiAoIV91dGlsMi5kZWZhdWx0LmRldGVjdE5vZGUoKSB8fCAhX2NvbmZpZzIuZGVmYXVsdC51c2VfbmF0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIF9kZXJlcV8oJ3psaWInKTtcbiAgfSxcblxuICBpc0VtYWlsQWRkcmVzczogZnVuY3Rpb24gaXNFbWFpbEFkZHJlc3MoZGF0YSkge1xuICAgIGlmICghX3V0aWwyLmRlZmF1bHQuaXNTdHJpbmcoZGF0YSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHJlID0gL14oKFtePD4oKVtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVtcXF1cXFxcLiw7Olxcc0BcIl0rKSopfChcIi4rXCIpKUAoKFxcW1swLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXF0pfCgoW2EtekEtWlxcLTAtOV0rXFwuKSsoW2EtekEtWl17Mix9fHhuLS1bYS16QS1aXFwtMC05XSspKSkkLztcbiAgICByZXR1cm4gcmUudGVzdChkYXRhKTtcbiAgfSxcblxuICAvKipcbiAgICogRm9ybWF0IHVzZXIgaWQgZm9yIGludGVybmFsIHVzZS5cbiAgICovXG4gIGZvcm1hdFVzZXJJZDogZnVuY3Rpb24gZm9ybWF0VXNlcklkKGlkKSB7XG4gICAgLy8gbmFtZSBhbmQgZW1haWwgYWRkcmVzcyBjYW4gYmUgZW1wdHkgYnV0IG11c3QgYmUgb2YgdGhlIGNvcnJlY3QgdHlwZVxuICAgIGlmIChpZC5uYW1lICYmICFfdXRpbDIuZGVmYXVsdC5pc1N0cmluZyhpZC5uYW1lKSB8fCBpZC5lbWFpbCAmJiAhX3V0aWwyLmRlZmF1bHQuaXNFbWFpbEFkZHJlc3MoaWQuZW1haWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlciBpZCBmb3JtYXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBfYWRkcmVzc1JmYzIuZGVmYXVsdC5BZGRyZXNzKGlkLm5hbWUsIGlkLmVtYWlsLCBpZC5jb21tZW50KS5mb3JtYXQoKTtcbiAgfSxcblxuICAvKipcbiAgICogUGFyc2UgdXNlciBpZC5cbiAgICovXG4gIHBhcnNlVXNlcklkOiBmdW5jdGlvbiBwYXJzZVVzZXJJZCh1c2VyaWQpIHtcbiAgICBpZiAodXNlcmlkLmxlbmd0aCA+IF9jb25maWcyLmRlZmF1bHQubWF4X3VzZXJpZF9sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBpZCBzdHJpbmcgaXMgdG9vIGxvbmcnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHZhciBfcmZjMjgyMiRwYXJzZSA9IF9hZGRyZXNzUmZjMi5kZWZhdWx0LnBhcnNlKHVzZXJpZCksXG4gICAgICAgICAgX3JmYzI4MjIkcGFyc2UyID0gKDAsIF9zbGljZWRUb0FycmF5My5kZWZhdWx0KShfcmZjMjgyMiRwYXJzZSwgMSksXG4gICAgICAgICAgX3JmYzI4MjIkcGFyc2UyJCA9IF9yZmMyODIyJHBhcnNlMlswXSxcbiAgICAgICAgICBuYW1lID0gX3JmYzI4MjIkcGFyc2UyJC5waHJhc2UsXG4gICAgICAgICAgZW1haWwgPSBfcmZjMjgyMiRwYXJzZTIkLmFkZHJlc3MsXG4gICAgICAgICAgY29tbWVudCA9IF9yZmMyODIyJHBhcnNlMiQuY29tbWVudDtcblxuICAgICAgcmV0dXJuIHsgbmFtZTogbmFtZSwgZW1haWw6IGVtYWlsLCBjb21tZW50OiBjb21tZW50LnJlcGxhY2UoL15cXCh8XFwpJC9nLCAnJykgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlciBpZCBmb3JtYXQnKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBsaW5lIGVuZGluZ3MgdG8gXFxyXFxuXG4gICAqL1xuICBjYW5vbmljYWxpemVFT0w6IGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZUVPTCh0ZXh0KSB7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFxyXFxuL2csIFwiXFxuXCIpLnJlcGxhY2UoL1xcci9nLCBcIlxcblwiKS5yZXBsYWNlKC9cXG4vZywgXCJcXHJcXG5cIik7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbnZlcnQgbGluZSBlbmRpbmdzIGZyb20gY2Fub25pY2FsaXplZCBcXHJcXG4gdG8gbmF0aXZlIFxcblxuICAgKi9cbiAgbmF0aXZlRU9MOiBmdW5jdGlvbiBuYXRpdmVFT0wodGV4dCkge1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcclxcbi9nLCBcIlxcblwiKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVtb3ZlIHRyYWlsaW5nIHNwYWNlcyBhbmQgdGFicyBmcm9tIGVhY2ggbGluZVxuICAgKi9cbiAgcmVtb3ZlVHJhaWxpbmdTcGFjZXM6IGZ1bmN0aW9uIHJlbW92ZVRyYWlsaW5nU3BhY2VzKHRleHQpIHtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bIFxcdF0rJC9tZywgXCJcIik7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVuY29kZSBpbnB1dCBidWZmZXIgdXNpbmcgWi1CYXNlMzIgZW5jb2RpbmcuXG4gICAqIFNlZTogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYxODkjc2VjdGlvbi01LjEuNlxuICAgKlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGEgVGhlIGJpbmFyeSBkYXRhIHRvIGVuY29kZVxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBCaW5hcnkgZGF0YSBlbmNvZGVkIHVzaW5nIFotQmFzZTMyXG4gICAqL1xuICBlbmNvZGVaQmFzZTMyOiBmdW5jdGlvbiBlbmNvZGVaQmFzZTMyKGRhdGEpIHtcbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICB2YXIgQUxQSEFCRVQgPSBcInlibmRyZmc4ZWprbWNwcXhvdDF1d2lzemEzNDVoNzY5XCI7XG4gICAgdmFyIFNISUZUID0gNTtcbiAgICB2YXIgTUFTSyA9IDMxO1xuICAgIHZhciBidWZmZXIgPSBkYXRhWzBdO1xuICAgIHZhciBpbmRleCA9IDE7XG4gICAgdmFyIGJpdHNMZWZ0ID0gODtcbiAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgd2hpbGUgKGJpdHNMZWZ0ID4gMCB8fCBpbmRleCA8IGRhdGEubGVuZ3RoKSB7XG4gICAgICBpZiAoYml0c0xlZnQgPCBTSElGVCkge1xuICAgICAgICBpZiAoaW5kZXggPCBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgIGJ1ZmZlciA8PD0gODtcbiAgICAgICAgICBidWZmZXIgfD0gZGF0YVtpbmRleCsrXSAmIDB4ZmY7XG4gICAgICAgICAgYml0c0xlZnQgKz0gODtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcGFkID0gU0hJRlQgLSBiaXRzTGVmdDtcbiAgICAgICAgICBidWZmZXIgPDw9IHBhZDtcbiAgICAgICAgICBiaXRzTGVmdCArPSBwYWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJpdHNMZWZ0IC09IFNISUZUO1xuICAgICAgcmVzdWx0ICs9IEFMUEhBQkVUW01BU0sgJiBidWZmZXIgPj4gYml0c0xlZnRdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuXG59LHtcIi4vY29uZmlnXCI6MzI1LFwiLi9lbmNvZGluZy9iYXNlNjRcIjozNTgsXCIuL3V0aWxcIjozOTgsXCJhZGRyZXNzLXJmYzI4MjJcIjoxLFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC92YWx1ZXNcIjozMSxcImJhYmVsLXJ1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCI6NDAsXCJjcnlwdG9cIjpcImNyeXB0b1wiLFwiemxpYlwiOlwiemxpYlwifV0sMzk5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5Jyk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zbGljZWRUb0FycmF5Mik7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4vdXRpbCcpO1xuXG52YXIgX3V0aWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbCk7XG5cbnZhciBfY3J5cHRvID0gX2RlcmVxXygnLi9jcnlwdG8nKTtcblxudmFyIF9jcnlwdG8yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3J5cHRvKTtcblxudmFyIF9rZXkgPSBfZGVyZXFfKCcuL2tleScpO1xuXG52YXIga2V5TW9kID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2tleSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gZWxzZSB7IHZhciBuZXdPYmogPSB7fTsgaWYgKG9iaiAhPSBudWxsKSB7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgcmV0dXJuIG5ld09iajsgfSB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgV0tEIGNsaWVudFxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFdLRCgpIHtcbiAgdGhpcy5fZmV0Y2ggPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5mZXRjaCA6IF9kZXJlcV8oJ25vZGUtZmV0Y2gnKTtcbn1cblxuLyoqXG4gKiBTZWFyY2ggZm9yIGEgcHVibGljIGtleSB1c2luZyBXZWIgS2V5IERpcmVjdG9yeSBwcm90b2NvbC5cbiAqIEBwYXJhbSAgIHtTdHJpbmd9ICAgb3B0aW9ucy5lbWFpbCAgICAgICAgIFVzZXIncyBlbWFpbC5cbiAqIEBwYXJhbSAgIHtCb29sZWFufSAgb3B0aW9ucy5yYXdCeXRlcyAgICAgIFJldHVybnMgVWludDhBcnJheSBpbnN0ZWFkIG9mIHBhcnNlZCBrZXkuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxVaW50OEFycmF5fFxuICogICAgICAgICAgIHtrZXlzOiBBcnJheTxtb2R1bGU6a2V5LktleT4sXG4gKiAgICAgICAgICAgIGVycjogKEFycmF5PEVycm9yPnxudWxsKX0+fSAgICAgVGhlIHB1YmxpYyBrZXkuXG4gKiBAYXN5bmNcbiAqL1xuLy8gT3BlblBHUC5qcyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDE4IFdpa3RvciBLd2FwaXNpZXdpY3pcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMy4wIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgY2xpZW50IGZvciB0aGUgV2ViIEtleSBEaXJlY3RvcnkgKHdrZCkgcHJvdG9jb2xcbiAqIGluIG9yZGVyIHRvIGxvb2t1cCBrZXlzIG9uIGRlc2lnbmF0ZWQgc2VydmVycy5cbiAqIFNlZTogaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvZHJhZnQta29jaC1vcGVucGdwLXdlYmtleS1zZXJ2aWNlL1xuICogQG1vZHVsZSB3a2RcbiAqL1xuXG5XS0QucHJvdG90eXBlLmxvb2t1cCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBmZXRjaCA9IHRoaXMuX2ZldGNoO1xuXG4gIGlmICghb3B0aW9ucy5lbWFpbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgcHJvdmlkZSBhbiBlbWFpbCBwYXJhbWV0ZXIhJyk7XG4gIH1cblxuICBpZiAoIV91dGlsMi5kZWZhdWx0LmlzRW1haWxBZGRyZXNzKG9wdGlvbnMuZW1haWwpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGUtbWFpbCBhZGRyZXNzLicpO1xuICB9XG5cbiAgdmFyIF8kZXhlYyA9IC8oLiopQCguKikvLmV4ZWMob3B0aW9ucy5lbWFpbCksXG4gICAgICBfJGV4ZWMyID0gKDAsIF9zbGljZWRUb0FycmF5My5kZWZhdWx0KShfJGV4ZWMsIDMpLFxuICAgICAgbG9jYWxQYXJ0ID0gXyRleGVjMlsxXSxcbiAgICAgIGRvbWFpbiA9IF8kZXhlYzJbMl07XG5cbiAgdmFyIGxvY2FsRW5jb2RlZCA9IF91dGlsMi5kZWZhdWx0LmVuY29kZVpCYXNlMzIoX2NyeXB0bzIuZGVmYXVsdC5oYXNoLnNoYTEoX3V0aWwyLmRlZmF1bHQuc3RyX3RvX1VpbnQ4QXJyYXkobG9jYWxQYXJ0LnRvTG93ZXJDYXNlKCkpKSk7XG5cbiAgdmFyIHVybCA9ICdodHRwczovLycgKyBkb21haW4gKyAnLy53ZWxsLWtub3duL29wZW5wZ3BrZXkvaHUvJyArIGxvY2FsRW5jb2RlZDtcblxuICByZXR1cm4gZmV0Y2godXJsKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG4gICAgfVxuICB9KS50aGVuKGZ1bmN0aW9uIChwdWJsaWNLZXkpIHtcbiAgICBpZiAocHVibGljS2V5KSB7XG4gICAgICB2YXIgcmF3Qnl0ZXMgPSBuZXcgVWludDhBcnJheShwdWJsaWNLZXkpO1xuICAgICAgaWYgKG9wdGlvbnMucmF3Qnl0ZXMpIHtcbiAgICAgICAgcmV0dXJuIHJhd0J5dGVzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleU1vZC5yZWFkKHJhd0J5dGVzKTtcbiAgICB9XG4gIH0pO1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gV0tEO1xuXG59LHtcIi4vY3J5cHRvXCI6MzQwLFwiLi9rZXlcIjozNjIsXCIuL3V0aWxcIjozOTgsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiOjQwLFwibm9kZS1mZXRjaFwiOlwibm9kZS1mZXRjaFwifV0sNDAwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9wcm9taXNlID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9jb3JlLWpzL3Byb21pc2UnKTtcblxudmFyIF9wcm9taXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb21pc2UpO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2RlcmVxXygnYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvcicpO1xuXG52YXIgX3JlZ2VuZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZ2VuZXJhdG9yKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMiA9IF9kZXJlcV8oJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJyk7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3luY1RvR2VuZXJhdG9yMik7XG5cbnZhciBfdXRpbCA9IF9kZXJlcV8oJy4uL3V0aWwuanMnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG52YXIgX2NyeXB0byA9IF9kZXJlcV8oJy4uL2NyeXB0bycpO1xuXG52YXIgX2NyeXB0bzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcnlwdG8pO1xuXG52YXIgX3BhY2tldCA9IF9kZXJlcV8oJy4uL3BhY2tldCcpO1xuXG52YXIgX3BhY2tldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wYWNrZXQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGEgbmV3IHByb3h5IGFuZCBsb2FkcyB0aGUgd2ViIHdvcmtlclxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGggICAgICAgICAgICBUaGUgcGF0aCB0byB0aGUgd29ya2VyIG9yICdvcGVucGdwLndvcmtlci5qcycgYnkgZGVmYXVsdFxuICogQHBhcmFtIHtOdW1iZXJ9IG4gICAgICAgICAgICAgICBudW1iZXIgb2Ygd29ya2VycyB0byBpbml0aWFsaXplIGlmIHBhdGggZ2l2ZW5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgICAgICAgICAgY29uZmlnIFRoZSB3b3JrZXIgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSB3b3JrZXIgICBhbHRlcm5hdGl2ZSB0byBwYXRoIHBhcmFtZXRlcjogd2ViIHdvcmtlciBpbml0aWFsaXplZCB3aXRoICdvcGVucGdwLndvcmtlci5qcydcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBBc3luY1Byb3h5KCkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgIF9yZWYkcGF0aCA9IF9yZWYucGF0aCxcbiAgICAgIHBhdGggPSBfcmVmJHBhdGggPT09IHVuZGVmaW5lZCA/ICdvcGVucGdwLndvcmtlci5qcycgOiBfcmVmJHBhdGgsXG4gICAgICBfcmVmJG4gPSBfcmVmLm4sXG4gICAgICBuID0gX3JlZiRuID09PSB1bmRlZmluZWQgPyAxIDogX3JlZiRuLFxuICAgICAgX3JlZiR3b3JrZXJzID0gX3JlZi53b3JrZXJzLFxuICAgICAgd29ya2VycyA9IF9yZWYkd29ya2VycyA9PT0gdW5kZWZpbmVkID8gW10gOiBfcmVmJHdvcmtlcnMsXG4gICAgICBjb25maWcgPSBfcmVmLmNvbmZpZztcblxuICAvKipcbiAgICogTWVzc2FnZSBoYW5kbGluZ1xuICAgKi9cbiAgdmFyIGhhbmRsZU1lc3NhZ2UgPSBmdW5jdGlvbiBoYW5kbGVNZXNzYWdlKHdvcmtlcklkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIG1zZyA9IGV2ZW50LmRhdGE7XG4gICAgICBzd2l0Y2ggKG1zZy5ldmVudCkge1xuICAgICAgICBjYXNlICdtZXRob2QtcmV0dXJuJzpcbiAgICAgICAgICBpZiAobXNnLmVycikge1xuICAgICAgICAgICAgLy8gZmFpbFxuICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cuZXJyKTtcbiAgICAgICAgICAgIC8vIGFkZCB3b3JrZXIgc3RhY2tcbiAgICAgICAgICAgIGVyci53b3JrZXJTdGFjayA9IG1zZy5zdGFjaztcbiAgICAgICAgICAgIF90aGlzLnRhc2tzW21zZy5pZF0ucmVqZWN0KGVycik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgICAgICAgIF90aGlzLnRhc2tzW21zZy5pZF0ucmVzb2x2ZShtc2cuZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSBfdGhpcy50YXNrc1ttc2cuaWRdO1xuICAgICAgICAgIF90aGlzLndvcmtlcnNbd29ya2VySWRdLnJlcXVlc3RzLS07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JlcXVlc3Qtc2VlZCc6XG4gICAgICAgICAgX3RoaXMuc2VlZFJhbmRvbSh3b3JrZXJJZCwgbXNnLmFtb3VudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIFdvcmtlciBFdmVudC4nKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIGlmICh3b3JrZXJzLmxlbmd0aCkge1xuICAgIHRoaXMud29ya2VycyA9IHdvcmtlcnM7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy53b3JrZXJzID0gW107XG4gICAgd2hpbGUgKHRoaXMud29ya2Vycy5sZW5ndGggPCBuKSB7XG4gICAgICB0aGlzLndvcmtlcnMucHVzaChuZXcgV29ya2VyKHBhdGgpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgd29ya2VySWQgPSAwO1xuICB0aGlzLndvcmtlcnMuZm9yRWFjaChmdW5jdGlvbiAod29ya2VyKSB7XG4gICAgd29ya2VyLnJlcXVlc3RzID0gMDtcbiAgICB3b3JrZXIub25tZXNzYWdlID0gaGFuZGxlTWVzc2FnZSh3b3JrZXJJZCsrKTtcbiAgICB3b3JrZXIub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvciBpbiBvcGVucGdwIHdvcmtlcjogJyArIGUubWVzc2FnZSArICcgKCcgKyBlLmZpbGVuYW1lICsgJzonICsgZS5saW5lbm8gKyAnKScpO1xuICAgIH07XG5cbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICB3b3JrZXIucG9zdE1lc3NhZ2UoeyBldmVudDogJ2NvbmZpZ3VyZScsIGNvbmZpZzogY29uZmlnIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQ2Fubm90IHJlbHkgb24gdGFzayBvcmRlciBiZWluZyBtYWludGFpbmVkLCB1c2Ugb2JqZWN0IGtleWVkIGJ5IHJlcXVlc3QgSUQgdG8gdHJhY2sgdGFza3NcbiAgdGhpcy50YXNrcyA9IHt9O1xuICB0aGlzLmN1cnJlbnRJRCA9IDA7XG59XG5cbi8qKlxuICogR2V0IG5ldyByZXF1ZXN0IElEXG4gKiBAcmV0dXJucyB7aW50ZWdlcn0gICAgICAgICAgTmV3IHVuaXF1ZSByZXF1ZXN0IElEXG4qL1xuLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDMuMCBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgbWFpbnRhaW5pbmcgYnJvd3NlciB3b3JrZXJzXG4gKiBAc2VlIG1vZHVsZTpvcGVucGdwLmluaXRXb3JrZXJcbiAqIEBzZWUgbW9kdWxlOm9wZW5wZ3AuZ2V0V29ya2VyXG4gKiBAc2VlIG1vZHVsZTpvcGVucGdwLmRlc3Ryb3lXb3JrZXJcbiAqIEBzZWUgbW9kdWxlOndvcmtlci93b3JrZXJcbiAqIEByZXF1aXJlcyB1dGlsXG4gKiBAcmVxdWlyZXMgY3J5cHRvXG4gKiBAcmVxdWlyZXMgcGFja2V0XG4gKiBAbW9kdWxlIHdvcmtlci9hc3luY19wcm94eVxuICovXG5cbkFzeW5jUHJveHkucHJvdG90eXBlLmdldElEID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5jdXJyZW50SUQrKztcbn07XG5cbi8qKlxuICogU2VuZCBtZXNzYWdlIHRvIHdvcmtlciB3aXRoIHJhbmRvbSBkYXRhXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBzaXplIE51bWJlciBvZiBieXRlcyB0byBzZW5kXG4gKiBAYXN5bmNcbiAqL1xuQXN5bmNQcm94eS5wcm90b3R5cGUuc2VlZFJhbmRvbSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYyID0gKDAsIF9hc3luY1RvR2VuZXJhdG9yMy5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcjIuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUod29ya2VySWQsIHNpemUpIHtcbiAgICB2YXIgYnVmO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IyLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcnlwdG8yLmRlZmF1bHQucmFuZG9tLmdldFJhbmRvbUJ5dGVzKHNpemUpO1xuXG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgYnVmID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgdGhpcy53b3JrZXJzW3dvcmtlcklkXS5wb3N0TWVzc2FnZSh7IGV2ZW50OiAnc2VlZC1yYW5kb20nLCBidWY6IGJ1ZiB9LCBfdXRpbDIuZGVmYXVsdC5nZXRUcmFuc2ZlcmFibGVzKGJ1ZikpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gIH0pKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKF94MiwgX3gzKSB7XG4gICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbi8qKlxuICogVGVybWluYXRlcyB0aGUgd29ya2Vyc1xuICovXG5Bc3luY1Byb3h5LnByb3RvdHlwZS50ZXJtaW5hdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMud29ya2Vycy5mb3JFYWNoKGZ1bmN0aW9uICh3b3JrZXIpIHtcbiAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBHZW5lcmljIHByb3h5IGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBhbGwgY29tbWFuZHMgZnJvbSB0aGUgcHVibGljIGFwaS5cbiAqIEBwYXJhbSAge1N0cmluZ30gbWV0aG9kICAgIHRoZSBwdWJsaWMgYXBpIGZ1bmN0aW9uIHRvIGJlIGRlbGVnYXRlZCB0byB0aGUgd29ya2VyIHRocmVhZFxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zICAgdGhlIGFwaSBmdW5jdGlvbidzIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtQcm9taXNlfSAgICAgICAgICBzZWUgdGhlIGNvcnJlc3BvbmRpbmcgcHVibGljIGFwaSBmdW5jdGlvbnMgZm9yIHRoZWlyIHJldHVybiB0eXBlc1xuICogQGFzeW5jXG4gKi9cbkFzeW5jUHJveHkucHJvdG90eXBlLmRlbGVnYXRlID0gZnVuY3Rpb24gKG1ldGhvZCwgb3B0aW9ucykge1xuICB2YXIgX3RoaXMyID0gdGhpcztcblxuICB2YXIgaWQgPSB0aGlzLmdldElEKCk7XG4gIHZhciByZXF1ZXN0cyA9IHRoaXMud29ya2Vycy5tYXAoZnVuY3Rpb24gKHdvcmtlcikge1xuICAgIHJldHVybiB3b3JrZXIucmVxdWVzdHM7XG4gIH0pO1xuICB2YXIgbWluUmVxdWVzdHMgPSBNYXRoLm1pbihyZXF1ZXN0cyk7XG4gIHZhciB3b3JrZXJJZCA9IDA7XG4gIGZvciAoOyB3b3JrZXJJZCA8IHRoaXMud29ya2Vycy5sZW5ndGg7IHdvcmtlcklkKyspIHtcbiAgICBpZiAodGhpcy53b3JrZXJzW3dvcmtlcklkXS5yZXF1ZXN0cyA9PT0gbWluUmVxdWVzdHMpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgX3Byb21pc2UyLmRlZmF1bHQoZnVuY3Rpb24gKF9yZXNvbHZlLCByZWplY3QpIHtcbiAgICAvLyBjbG9uZSBwYWNrZXRzIChmb3Igd2ViIHdvcmtlciBzdHJ1Y3R1cmVkIGNsb25pbmcgYWxnb3JpdGhtKVxuICAgIF90aGlzMi53b3JrZXJzW3dvcmtlcklkXS5wb3N0TWVzc2FnZSh7IGlkOiBpZCwgZXZlbnQ6IG1ldGhvZCwgb3B0aW9uczogX3BhY2tldDIuZGVmYXVsdC5jbG9uZS5jbG9uZVBhY2tldHMob3B0aW9ucykgfSwgX3V0aWwyLmRlZmF1bHQuZ2V0VHJhbnNmZXJhYmxlcyhvcHRpb25zKSk7XG4gICAgX3RoaXMyLndvcmtlcnNbd29ya2VySWRdLnJlcXVlc3RzKys7XG5cbiAgICAvLyByZW1lbWJlciB0byBoYW5kbGUgcGFyc2luZyBjbG9uZWQgcGFja2V0cyBmcm9tIHdvcmtlclxuICAgIF90aGlzMi50YXNrc1tpZF0gPSB7IHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoZGF0YSkge1xuICAgICAgICByZXR1cm4gX3Jlc29sdmUoX3BhY2tldDIuZGVmYXVsdC5jbG9uZS5wYXJzZUNsb25lZFBhY2tldHMoZGF0YSwgbWV0aG9kKSk7XG4gICAgICB9LCByZWplY3Q6IHJlamVjdCB9O1xuICB9KTtcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IEFzeW5jUHJveHk7XG5cbn0se1wiLi4vY3J5cHRvXCI6MzQwLFwiLi4vcGFja2V0XCI6MzcxLFwiLi4vdXRpbC5qc1wiOjM5OCxcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9wcm9taXNlXCI6MzIsXCJiYWJlbC1ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiOjM1LFwiYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvclwiOjQyfV19LHt9LFszNjFdKSgzNjEpXG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL29wZW5wZ3AvZGlzdC9vcGVucGdwLmpzXG4vLyBtb2R1bGUgaWQgPSAxNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///15\n");
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/* WEBPACK VAR INJECTION */(function(global, setImmediate) {/*!\n * Vue.js v2.5.16\n * (c) 2014-2018 Evan You\n * Released under the MIT License.\n */\n\n\n/* */\n\nvar emptyObject = Object.freeze({});\n\n// these helpers produces better vm code in JS engines due to their\n// explicitness and function inlining\nfunction isUndef (v) {\n return v === undefined || v === null\n}\n\nfunction isDef (v) {\n return v !== undefined && v !== null\n}\n\nfunction isTrue (v) {\n return v === true\n}\n\nfunction isFalse (v) {\n return v === false\n}\n\n/**\n * Check if value is primitive\n */\nfunction isPrimitive (value) {\n return (\n typeof value === 'string' ||\n typeof value === 'number' ||\n // $flow-disable-line\n typeof value === 'symbol' ||\n typeof value === 'boolean'\n )\n}\n\n/**\n * Quick object check - this is primarily used to tell\n * Objects from primitive values when we know the value\n * is a JSON-compliant type.\n */\nfunction isObject (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\n/**\n * Get the raw type string of a value e.g. [object Object]\n */\nvar _toString = Object.prototype.toString;\n\nfunction toRawType (value) {\n return _toString.call(value).slice(8, -1)\n}\n\n/**\n * Strict object type check. Only returns true\n * for plain JavaScript objects.\n */\nfunction isPlainObject (obj) {\n return _toString.call(obj) === '[object Object]'\n}\n\nfunction isRegExp (v) {\n return _toString.call(v) === '[object RegExp]'\n}\n\n/**\n * Check if val is a valid array index.\n */\nfunction isValidArrayIndex (val) {\n var n = parseFloat(String(val));\n return n >= 0 && Math.floor(n) === n && isFinite(val)\n}\n\n/**\n * Convert a value to a string that is actually rendered.\n */\nfunction toString (val) {\n return val == null\n ? ''\n : typeof val === 'object'\n ? JSON.stringify(val, null, 2)\n : String(val)\n}\n\n/**\n * Convert a input value to a number for persistence.\n * If the conversion fails, return original string.\n */\nfunction toNumber (val) {\n var n = parseFloat(val);\n return isNaN(n) ? val : n\n}\n\n/**\n * Make a map and return a function for checking if a key\n * is in that map.\n */\nfunction makeMap (\n str,\n expectsLowerCase\n) {\n var map = Object.create(null);\n var list = str.split(',');\n for (var i = 0; i < list.length; i++) {\n map[list[i]] = true;\n }\n return expectsLowerCase\n ? function (val) { return map[val.toLowerCase()]; }\n : function (val) { return map[val]; }\n}\n\n/**\n * Check if a tag is a built-in tag.\n */\nvar isBuiltInTag = makeMap('slot,component', true);\n\n/**\n * Check if a attribute is a reserved attribute.\n */\nvar isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');\n\n/**\n * Remove an item from an array\n */\nfunction remove (arr, item) {\n if (arr.length) {\n var index = arr.indexOf(item);\n if (index > -1) {\n return arr.splice(index, 1)\n }\n }\n}\n\n/**\n * Check whether the object has the property.\n */\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction hasOwn (obj, key) {\n return hasOwnProperty.call(obj, key)\n}\n\n/**\n * Create a cached version of a pure function.\n */\nfunction cached (fn) {\n var cache = Object.create(null);\n return (function cachedFn (str) {\n var hit = cache[str];\n return hit || (cache[str] = fn(str))\n })\n}\n\n/**\n * Camelize a hyphen-delimited string.\n */\nvar camelizeRE = /-(\\w)/g;\nvar camelize = cached(function (str) {\n return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })\n});\n\n/**\n * Capitalize a string.\n */\nvar capitalize = cached(function (str) {\n return str.charAt(0).toUpperCase() + str.slice(1)\n});\n\n/**\n * Hyphenate a camelCase string.\n */\nvar hyphenateRE = /\\B([A-Z])/g;\nvar hyphenate = cached(function (str) {\n return str.replace(hyphenateRE, '-$1').toLowerCase()\n});\n\n/**\n * Simple bind polyfill for environments that do not support it... e.g.\n * PhantomJS 1.x. Technically we don't need this anymore since native bind is\n * now more performant in most browsers, but removing it would be breaking for\n * code that was able to run in PhantomJS 1.x, so this must be kept for\n * backwards compatibility.\n */\n\n/* istanbul ignore next */\nfunction polyfillBind (fn, ctx) {\n function boundFn (a) {\n var l = arguments.length;\n return l\n ? l > 1\n ? fn.apply(ctx, arguments)\n : fn.call(ctx, a)\n : fn.call(ctx)\n }\n\n boundFn._length = fn.length;\n return boundFn\n}\n\nfunction nativeBind (fn, ctx) {\n return fn.bind(ctx)\n}\n\nvar bind = Function.prototype.bind\n ? nativeBind\n : polyfillBind;\n\n/**\n * Convert an Array-like object to a real Array.\n */\nfunction toArray (list, start) {\n start = start || 0;\n var i = list.length - start;\n var ret = new Array(i);\n while (i--) {\n ret[i] = list[i + start];\n }\n return ret\n}\n\n/**\n * Mix properties into target object.\n */\nfunction extend (to, _from) {\n for (var key in _from) {\n to[key] = _from[key];\n }\n return to\n}\n\n/**\n * Merge an Array of Objects into a single Object.\n */\nfunction toObject (arr) {\n var res = {};\n for (var i = 0; i < arr.length; i++) {\n if (arr[i]) {\n extend(res, arr[i]);\n }\n }\n return res\n}\n\n/**\n * Perform no operation.\n * Stubbing args to make Flow happy without leaving useless transpiled code\n * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)\n */\nfunction noop (a, b, c) {}\n\n/**\n * Always return false.\n */\nvar no = function (a, b, c) { return false; };\n\n/**\n * Return same value\n */\nvar identity = function (_) { return _; };\n\n/**\n * Generate a static keys string from compiler modules.\n */\nfunction genStaticKeys (modules) {\n return modules.reduce(function (keys, m) {\n return keys.concat(m.staticKeys || [])\n }, []).join(',')\n}\n\n/**\n * Check if two values are loosely equal - that is,\n * if they are plain objects, do they have the same shape?\n */\nfunction looseEqual (a, b) {\n if (a === b) { return true }\n var isObjectA = isObject(a);\n var isObjectB = isObject(b);\n if (isObjectA && isObjectB) {\n try {\n var isArrayA = Array.isArray(a);\n var isArrayB = Array.isArray(b);\n if (isArrayA && isArrayB) {\n return a.length === b.length && a.every(function (e, i) {\n return looseEqual(e, b[i])\n })\n } else if (!isArrayA && !isArrayB) {\n var keysA = Object.keys(a);\n var keysB = Object.keys(b);\n return keysA.length === keysB.length && keysA.every(function (key) {\n return looseEqual(a[key], b[key])\n })\n } else {\n /* istanbul ignore next */\n return false\n }\n } catch (e) {\n /* istanbul ignore next */\n return false\n }\n } else if (!isObjectA && !isObjectB) {\n return String(a) === String(b)\n } else {\n return false\n }\n}\n\nfunction looseIndexOf (arr, val) {\n for (var i = 0; i < arr.length; i++) {\n if (looseEqual(arr[i], val)) { return i }\n }\n return -1\n}\n\n/**\n * Ensure a function is called only once.\n */\nfunction once (fn) {\n var called = false;\n return function () {\n if (!called) {\n called = true;\n fn.apply(this, arguments);\n }\n }\n}\n\nvar SSR_ATTR = 'data-server-rendered';\n\nvar ASSET_TYPES = [\n 'component',\n 'directive',\n 'filter'\n];\n\nvar LIFECYCLE_HOOKS = [\n 'beforeCreate',\n 'created',\n 'beforeMount',\n 'mounted',\n 'beforeUpdate',\n 'updated',\n 'beforeDestroy',\n 'destroyed',\n 'activated',\n 'deactivated',\n 'errorCaptured'\n];\n\n/* */\n\nvar config = ({\n /**\n * Option merge strategies (used in core/util/options)\n */\n // $flow-disable-line\n optionMergeStrategies: Object.create(null),\n\n /**\n * Whether to suppress warnings.\n */\n silent: false,\n\n /**\n * Show production mode tip message on boot?\n */\n productionTip: \"development\" !== 'production',\n\n /**\n * Whether to enable devtools\n */\n devtools: \"development\" !== 'production',\n\n /**\n * Whether to record perf\n */\n performance: false,\n\n /**\n * Error handler for watcher errors\n */\n errorHandler: null,\n\n /**\n * Warn handler for watcher warns\n */\n warnHandler: null,\n\n /**\n * Ignore certain custom elements\n */\n ignoredElements: [],\n\n /**\n * Custom user key aliases for v-on\n */\n // $flow-disable-line\n keyCodes: Object.create(null),\n\n /**\n * Check if a tag is reserved so that it cannot be registered as a\n * component. This is platform-dependent and may be overwritten.\n */\n isReservedTag: no,\n\n /**\n * Check if an attribute is reserved so that it cannot be used as a component\n * prop. This is platform-dependent and may be overwritten.\n */\n isReservedAttr: no,\n\n /**\n * Check if a tag is an unknown element.\n * Platform-dependent.\n */\n isUnknownElement: no,\n\n /**\n * Get the namespace of an element\n */\n getTagNamespace: noop,\n\n /**\n * Parse the real tag name for the specific platform.\n */\n parsePlatformTagName: identity,\n\n /**\n * Check if an attribute must be bound using property, e.g. value\n * Platform-dependent.\n */\n mustUseProp: no,\n\n /**\n * Exposed for legacy reasons\n */\n _lifecycleHooks: LIFECYCLE_HOOKS\n})\n\n/* */\n\n/**\n * Check if a string starts with $ or _\n */\nfunction isReserved (str) {\n var c = (str + '').charCodeAt(0);\n return c === 0x24 || c === 0x5F\n}\n\n/**\n * Define a property.\n */\nfunction def (obj, key, val, enumerable) {\n Object.defineProperty(obj, key, {\n value: val,\n enumerable: !!enumerable,\n writable: true,\n configurable: true\n });\n}\n\n/**\n * Parse simple path.\n */\nvar bailRE = /[^\\w.$]/;\nfunction parsePath (path) {\n if (bailRE.test(path)) {\n return\n }\n var segments = path.split('.');\n return function (obj) {\n for (var i = 0; i < segments.length; i++) {\n if (!obj) { return }\n obj = obj[segments[i]];\n }\n return obj\n }\n}\n\n/* */\n\n// can we use __proto__?\nvar hasProto = '__proto__' in {};\n\n// Browser environment sniffing\nvar inBrowser = typeof window !== 'undefined';\nvar inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;\nvar weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();\nvar UA = inBrowser && window.navigator.userAgent.toLowerCase();\nvar isIE = UA && /msie|trident/.test(UA);\nvar isIE9 = UA && UA.indexOf('msie 9.0') > 0;\nvar isEdge = UA && UA.indexOf('edge/') > 0;\nvar isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');\nvar isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');\nvar isChrome = UA && /chrome\\/\\d+/.test(UA) && !isEdge;\n\n// Firefox has a \"watch\" function on Object.prototype...\nvar nativeWatch = ({}).watch;\n\nvar supportsPassive = false;\nif (inBrowser) {\n try {\n var opts = {};\n Object.defineProperty(opts, 'passive', ({\n get: function get () {\n /* istanbul ignore next */\n supportsPassive = true;\n }\n })); // https://github.com/facebook/flow/issues/285\n window.addEventListener('test-passive', null, opts);\n } catch (e) {}\n}\n\n// this needs to be lazy-evaled because vue may be required before\n// vue-server-renderer can set VUE_ENV\nvar _isServer;\nvar isServerRendering = function () {\n if (_isServer === undefined) {\n /* istanbul ignore if */\n if (!inBrowser && !inWeex && typeof global !== 'undefined') {\n // detect presence of vue-server-renderer and avoid\n // Webpack shimming the process\n _isServer = global['process'].env.VUE_ENV === 'server';\n } else {\n _isServer = false;\n }\n }\n return _isServer\n};\n\n// detect devtools\nvar devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\n/* istanbul ignore next */\nfunction isNative (Ctor) {\n return typeof Ctor === 'function' && /native code/.test(Ctor.toString())\n}\n\nvar hasSymbol =\n typeof Symbol !== 'undefined' && isNative(Symbol) &&\n typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);\n\nvar _Set;\n/* istanbul ignore if */ // $flow-disable-line\nif (typeof Set !== 'undefined' && isNative(Set)) {\n // use native Set when available.\n _Set = Set;\n} else {\n // a non-standard Set polyfill that only works with primitive keys.\n _Set = (function () {\n function Set () {\n this.set = Object.create(null);\n }\n Set.prototype.has = function has (key) {\n return this.set[key] === true\n };\n Set.prototype.add = function add (key) {\n this.set[key] = true;\n };\n Set.prototype.clear = function clear () {\n this.set = Object.create(null);\n };\n\n return Set;\n }());\n}\n\n/* */\n\nvar warn = noop;\nvar tip = noop;\nvar generateComponentTrace = (noop); // work around flow check\nvar formatComponentName = (noop);\n\nif (true) {\n var hasConsole = typeof console !== 'undefined';\n var classifyRE = /(?:^|[-_])(\\w)/g;\n var classify = function (str) { return str\n .replace(classifyRE, function (c) { return c.toUpperCase(); })\n .replace(/[-_]/g, ''); };\n\n warn = function (msg, vm) {\n var trace = vm ? generateComponentTrace(vm) : '';\n\n if (config.warnHandler) {\n config.warnHandler.call(null, msg, vm, trace);\n } else if (hasConsole && (!config.silent)) {\n console.error((\"[Vue warn]: \" + msg + trace));\n }\n };\n\n tip = function (msg, vm) {\n if (hasConsole && (!config.silent)) {\n console.warn(\"[Vue tip]: \" + msg + (\n vm ? generateComponentTrace(vm) : ''\n ));\n }\n };\n\n formatComponentName = function (vm, includeFile) {\n if (vm.$root === vm) {\n return '<Root>'\n }\n var options = typeof vm === 'function' && vm.cid != null\n ? vm.options\n : vm._isVue\n ? vm.$options || vm.constructor.options\n : vm || {};\n var name = options.name || options._componentTag;\n var file = options.__file;\n if (!name && file) {\n var match = file.match(/([^/\\\\]+)\\.vue$/);\n name = match && match[1];\n }\n\n return (\n (name ? (\"<\" + (classify(name)) + \">\") : \"<Anonymous>\") +\n (file && includeFile !== false ? (\" at \" + file) : '')\n )\n };\n\n var repeat = function (str, n) {\n var res = '';\n while (n) {\n if (n % 2 === 1) { res += str; }\n if (n > 1) { str += str; }\n n >>= 1;\n }\n return res\n };\n\n generateComponentTrace = function (vm) {\n if (vm._isVue && vm.$parent) {\n var tree = [];\n var currentRecursiveSequence = 0;\n while (vm) {\n if (tree.length > 0) {\n var last = tree[tree.length - 1];\n if (last.constructor === vm.constructor) {\n currentRecursiveSequence++;\n vm = vm.$parent;\n continue\n } else if (currentRecursiveSequence > 0) {\n tree[tree.length - 1] = [last, currentRecursiveSequence];\n currentRecursiveSequence = 0;\n }\n }\n tree.push(vm);\n vm = vm.$parent;\n }\n return '\\n\\nfound in\\n\\n' + tree\n .map(function (vm, i) { return (\"\" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)\n ? ((formatComponentName(vm[0])) + \"... (\" + (vm[1]) + \" recursive calls)\")\n : formatComponentName(vm))); })\n .join('\\n')\n } else {\n return (\"\\n\\n(found in \" + (formatComponentName(vm)) + \")\")\n }\n };\n}\n\n/* */\n\n\nvar uid = 0;\n\n/**\n * A dep is an observable that can have multiple\n * directives subscribing to it.\n */\nvar Dep = function Dep () {\n this.id = uid++;\n this.subs = [];\n};\n\nDep.prototype.addSub = function addSub (sub) {\n this.subs.push(sub);\n};\n\nDep.prototype.removeSub = function removeSub (sub) {\n remove(this.subs, sub);\n};\n\nDep.prototype.depend = function depend () {\n if (Dep.target) {\n Dep.target.addDep(this);\n }\n};\n\nDep.prototype.notify = function notify () {\n // stabilize the subscriber list first\n var subs = this.subs.slice();\n for (var i = 0, l = subs.length; i < l; i++) {\n subs[i].update();\n }\n};\n\n// the current target watcher being evaluated.\n// this is globally unique because there could be only one\n// watcher being evaluated at any time.\nDep.target = null;\nvar targetStack = [];\n\nfunction pushTarget (_target) {\n if (Dep.target) { targetStack.push(Dep.target); }\n Dep.target = _target;\n}\n\nfunction popTarget () {\n Dep.target = targetStack.pop();\n}\n\n/* */\n\nvar VNode = function VNode (\n tag,\n data,\n children,\n text,\n elm,\n context,\n componentOptions,\n asyncFactory\n) {\n this.tag = tag;\n this.data = data;\n this.children = children;\n this.text = text;\n this.elm = elm;\n this.ns = undefined;\n this.context = context;\n this.fnContext = undefined;\n this.fnOptions = undefined;\n this.fnScopeId = undefined;\n this.key = data && data.key;\n this.componentOptions = componentOptions;\n this.componentInstance = undefined;\n this.parent = undefined;\n this.raw = false;\n this.isStatic = false;\n this.isRootInsert = true;\n this.isComment = false;\n this.isCloned = false;\n this.isOnce = false;\n this.asyncFactory = asyncFactory;\n this.asyncMeta = undefined;\n this.isAsyncPlaceholder = false;\n};\n\nvar prototypeAccessors = { child: { configurable: true } };\n\n// DEPRECATED: alias for componentInstance for backwards compat.\n/* istanbul ignore next */\nprototypeAccessors.child.get = function () {\n return this.componentInstance\n};\n\nObject.defineProperties( VNode.prototype, prototypeAccessors );\n\nvar createEmptyVNode = function (text) {\n if ( text === void 0 ) text = '';\n\n var node = new VNode();\n node.text = text;\n node.isComment = true;\n return node\n};\n\nfunction createTextVNode (val) {\n return new VNode(undefined, undefined, undefined, String(val))\n}\n\n// optimized shallow clone\n// used for static nodes and slot nodes because they may be reused across\n// multiple renders, cloning them avoids errors when DOM manipulations rely\n// on their elm reference.\nfunction cloneVNode (vnode) {\n var cloned = new VNode(\n vnode.tag,\n vnode.data,\n vnode.children,\n vnode.text,\n vnode.elm,\n vnode.context,\n vnode.componentOptions,\n vnode.asyncFactory\n );\n cloned.ns = vnode.ns;\n cloned.isStatic = vnode.isStatic;\n cloned.key = vnode.key;\n cloned.isComment = vnode.isComment;\n cloned.fnContext = vnode.fnContext;\n cloned.fnOptions = vnode.fnOptions;\n cloned.fnScopeId = vnode.fnScopeId;\n cloned.isCloned = true;\n return cloned\n}\n\n/*\n * not type checking this file because flow doesn't play well with\n * dynamically accessing methods on Array prototype\n */\n\nvar arrayProto = Array.prototype;\nvar arrayMethods = Object.create(arrayProto);\n\nvar methodsToPatch = [\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'splice',\n 'sort',\n 'reverse'\n];\n\n/**\n * Intercept mutating methods and emit events\n */\nmethodsToPatch.forEach(function (method) {\n // cache original method\n var original = arrayProto[method];\n def(arrayMethods, method, function mutator () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var result = original.apply(this, args);\n var ob = this.__ob__;\n var inserted;\n switch (method) {\n case 'push':\n case 'unshift':\n inserted = args;\n break\n case 'splice':\n inserted = args.slice(2);\n break\n }\n if (inserted) { ob.observeArray(inserted); }\n // notify change\n ob.dep.notify();\n return result\n });\n});\n\n/* */\n\nvar arrayKeys = Object.getOwnPropertyNames(arrayMethods);\n\n/**\n * In some cases we may want to disable observation inside a component's\n * update computation.\n */\nvar shouldObserve = true;\n\nfunction toggleObserving (value) {\n shouldObserve = value;\n}\n\n/**\n * Observer class that is attached to each observed\n * object. Once attached, the observer converts the target\n * object's property keys into getter/setters that\n * collect dependencies and dispatch updates.\n */\nvar Observer = function Observer (value) {\n this.value = value;\n this.dep = new Dep();\n this.vmCount = 0;\n def(value, '__ob__', this);\n if (Array.isArray(value)) {\n var augment = hasProto\n ? protoAugment\n : copyAugment;\n augment(value, arrayMethods, arrayKeys);\n this.observeArray(value);\n } else {\n this.walk(value);\n }\n};\n\n/**\n * Walk through each property and convert them into\n * getter/setters. This method should only be called when\n * value type is Object.\n */\nObserver.prototype.walk = function walk (obj) {\n var keys = Object.keys(obj);\n for (var i = 0; i < keys.length; i++) {\n defineReactive(obj, keys[i]);\n }\n};\n\n/**\n * Observe a list of Array items.\n */\nObserver.prototype.observeArray = function observeArray (items) {\n for (var i = 0, l = items.length; i < l; i++) {\n observe(items[i]);\n }\n};\n\n// helpers\n\n/**\n * Augment an target Object or Array by intercepting\n * the prototype chain using __proto__\n */\nfunction protoAugment (target, src, keys) {\n /* eslint-disable no-proto */\n target.__proto__ = src;\n /* eslint-enable no-proto */\n}\n\n/**\n * Augment an target Object or Array by defining\n * hidden properties.\n */\n/* istanbul ignore next */\nfunction copyAugment (target, src, keys) {\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i];\n def(target, key, src[key]);\n }\n}\n\n/**\n * Attempt to create an observer instance for a value,\n * returns the new observer if successfully observed,\n * or the existing observer if the value already has one.\n */\nfunction observe (value, asRootData) {\n if (!isObject(value) || value instanceof VNode) {\n return\n }\n var ob;\n if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\n ob = value.__ob__;\n } else if (\n shouldObserve &&\n !isServerRendering() &&\n (Array.isArray(value) || isPlainObject(value)) &&\n Object.isExtensible(value) &&\n !value._isVue\n ) {\n ob = new Observer(value);\n }\n if (asRootData && ob) {\n ob.vmCount++;\n }\n return ob\n}\n\n/**\n * Define a reactive property on an Object.\n */\nfunction defineReactive (\n obj,\n key,\n val,\n customSetter,\n shallow\n) {\n var dep = new Dep();\n\n var property = Object.getOwnPropertyDescriptor(obj, key);\n if (property && property.configurable === false) {\n return\n }\n\n // cater for pre-defined getter/setters\n var getter = property && property.get;\n if (!getter && arguments.length === 2) {\n val = obj[key];\n }\n var setter = property && property.set;\n\n var childOb = !shallow && observe(val);\n Object.defineProperty(obj, key, {\n enumerable: true,\n configurable: true,\n get: function reactiveGetter () {\n var value = getter ? getter.call(obj) : val;\n if (Dep.target) {\n dep.depend();\n if (childOb) {\n childOb.dep.depend();\n if (Array.isArray(value)) {\n dependArray(value);\n }\n }\n }\n return value\n },\n set: function reactiveSetter (newVal) {\n var value = getter ? getter.call(obj) : val;\n /* eslint-disable no-self-compare */\n if (newVal === value || (newVal !== newVal && value !== value)) {\n return\n }\n /* eslint-enable no-self-compare */\n if (\"development\" !== 'production' && customSetter) {\n customSetter();\n }\n if (setter) {\n setter.call(obj, newVal);\n } else {\n val = newVal;\n }\n childOb = !shallow && observe(newVal);\n dep.notify();\n }\n });\n}\n\n/**\n * Set a property on an object. Adds the new property and\n * triggers change notification if the property doesn't\n * already exist.\n */\nfunction set (target, key, val) {\n if (\"development\" !== 'production' &&\n (isUndef(target) || isPrimitive(target))\n ) {\n warn((\"Cannot set reactive property on undefined, null, or primitive value: \" + ((target))));\n }\n if (Array.isArray(target) && isValidArrayIndex(key)) {\n target.length = Math.max(target.length, key);\n target.splice(key, 1, val);\n return val\n }\n if (key in target && !(key in Object.prototype)) {\n target[key] = val;\n return val\n }\n var ob = (target).__ob__;\n if (target._isVue || (ob && ob.vmCount)) {\n \"development\" !== 'production' && warn(\n 'Avoid adding reactive properties to a Vue instance or its root $data ' +\n 'at runtime - declare it upfront in the data option.'\n );\n return val\n }\n if (!ob) {\n target[key] = val;\n return val\n }\n defineReactive(ob.value, key, val);\n ob.dep.notify();\n return val\n}\n\n/**\n * Delete a property and trigger change if necessary.\n */\nfunction del (target, key) {\n if (\"development\" !== 'production' &&\n (isUndef(target) || isPrimitive(target))\n ) {\n warn((\"Cannot delete reactive property on undefined, null, or primitive value: \" + ((target))));\n }\n if (Array.isArray(target) && isValidArrayIndex(key)) {\n target.splice(key, 1);\n return\n }\n var ob = (target).__ob__;\n if (target._isVue || (ob && ob.vmCount)) {\n \"development\" !== 'production' && warn(\n 'Avoid deleting properties on a Vue instance or its root $data ' +\n '- just set it to null.'\n );\n return\n }\n if (!hasOwn(target, key)) {\n return\n }\n delete target[key];\n if (!ob) {\n return\n }\n ob.dep.notify();\n}\n\n/**\n * Collect dependencies on array elements when the array is touched, since\n * we cannot intercept array element access like property getters.\n */\nfunction dependArray (value) {\n for (var e = (void 0), i = 0, l = value.length; i < l; i++) {\n e = value[i];\n e && e.__ob__ && e.__ob__.dep.depend();\n if (Array.isArray(e)) {\n dependArray(e);\n }\n }\n}\n\n/* */\n\n/**\n * Option overwriting strategies are functions that handle\n * how to merge a parent option value and a child option\n * value into the final value.\n */\nvar strats = config.optionMergeStrategies;\n\n/**\n * Options with restrictions\n */\nif (true) {\n strats.el = strats.propsData = function (parent, child, vm, key) {\n if (!vm) {\n warn(\n \"option \\\"\" + key + \"\\\" can only be used during instance \" +\n 'creation with the `new` keyword.'\n );\n }\n return defaultStrat(parent, child)\n };\n}\n\n/**\n * Helper that recursively merges two data objects together.\n */\nfunction mergeData (to, from) {\n if (!from) { return to }\n var key, toVal, fromVal;\n var keys = Object.keys(from);\n for (var i = 0; i < keys.length; i++) {\n key = keys[i];\n toVal = to[key];\n fromVal = from[key];\n if (!hasOwn(to, key)) {\n set(to, key, fromVal);\n } else if (isPlainObject(toVal) && isPlainObject(fromVal)) {\n mergeData(toVal, fromVal);\n }\n }\n return to\n}\n\n/**\n * Data\n */\nfunction mergeDataOrFn (\n parentVal,\n childVal,\n vm\n) {\n if (!vm) {\n // in a Vue.extend merge, both should be functions\n if (!childVal) {\n return parentVal\n }\n if (!parentVal) {\n return childVal\n }\n // when parentVal & childVal are both present,\n // we need to return a function that returns the\n // merged result of both functions... no need to\n // check if parentVal is a function here because\n // it has to be a function to pass previous merges.\n return function mergedDataFn () {\n return mergeData(\n typeof childVal === 'function' ? childVal.call(this, this) : childVal,\n typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal\n )\n }\n } else {\n return function mergedInstanceDataFn () {\n // instance merge\n var instanceData = typeof childVal === 'function'\n ? childVal.call(vm, vm)\n : childVal;\n var defaultData = typeof parentVal === 'function'\n ? parentVal.call(vm, vm)\n : parentVal;\n if (instanceData) {\n return mergeData(instanceData, defaultData)\n } else {\n return defaultData\n }\n }\n }\n}\n\nstrats.data = function (\n parentVal,\n childVal,\n vm\n) {\n if (!vm) {\n if (childVal && typeof childVal !== 'function') {\n \"development\" !== 'production' && warn(\n 'The \"data\" option should be a function ' +\n 'that returns a per-instance value in component ' +\n 'definitions.',\n vm\n );\n\n return parentVal\n }\n return mergeDataOrFn(parentVal, childVal)\n }\n\n return mergeDataOrFn(parentVal, childVal, vm)\n};\n\n/**\n * Hooks and props are merged as arrays.\n */\nfunction mergeHook (\n parentVal,\n childVal\n) {\n return childVal\n ? parentVal\n ? parentVal.concat(childVal)\n : Array.isArray(childVal)\n ? childVal\n : [childVal]\n : parentVal\n}\n\nLIFECYCLE_HOOKS.forEach(function (hook) {\n strats[hook] = mergeHook;\n});\n\n/**\n * Assets\n *\n * When a vm is present (instance creation), we need to do\n * a three-way merge between constructor options, instance\n * options and parent options.\n */\nfunction mergeAssets (\n parentVal,\n childVal,\n vm,\n key\n) {\n var res = Object.create(parentVal || null);\n if (childVal) {\n \"development\" !== 'production' && assertObjectType(key, childVal, vm);\n return extend(res, childVal)\n } else {\n return res\n }\n}\n\nASSET_TYPES.forEach(function (type) {\n strats[type + 's'] = mergeAssets;\n});\n\n/**\n * Watchers.\n *\n * Watchers hashes should not overwrite one\n * another, so we merge them as arrays.\n */\nstrats.watch = function (\n parentVal,\n childVal,\n vm,\n key\n) {\n // work around Firefox's Object.prototype.watch...\n if (parentVal === nativeWatch) { parentVal = undefined; }\n if (childVal === nativeWatch) { childVal = undefined; }\n /* istanbul ignore if */\n if (!childVal) { return Object.create(parentVal || null) }\n if (true) {\n assertObjectType(key, childVal, vm);\n }\n if (!parentVal) { return childVal }\n var ret = {};\n extend(ret, parentVal);\n for (var key$1 in childVal) {\n var parent = ret[key$1];\n var child = childVal[key$1];\n if (parent && !Array.isArray(parent)) {\n parent = [parent];\n }\n ret[key$1] = parent\n ? parent.concat(child)\n : Array.isArray(child) ? child : [child];\n }\n return ret\n};\n\n/**\n * Other object hashes.\n */\nstrats.props =\nstrats.methods =\nstrats.inject =\nstrats.computed = function (\n parentVal,\n childVal,\n vm,\n key\n) {\n if (childVal && \"development\" !== 'production') {\n assertObjectType(key, childVal, vm);\n }\n if (!parentVal) { return childVal }\n var ret = Object.create(null);\n extend(ret, parentVal);\n if (childVal) { extend(ret, childVal); }\n return ret\n};\nstrats.provide = mergeDataOrFn;\n\n/**\n * Default strategy.\n */\nvar defaultStrat = function (parentVal, childVal) {\n return childVal === undefined\n ? parentVal\n : childVal\n};\n\n/**\n * Validate component names\n */\nfunction checkComponents (options) {\n for (var key in options.components) {\n validateComponentName(key);\n }\n}\n\nfunction validateComponentName (name) {\n if (!/^[a-zA-Z][\\w-]*$/.test(name)) {\n warn(\n 'Invalid component name: \"' + name + '\". Component names ' +\n 'can only contain alphanumeric characters and the hyphen, ' +\n 'and must start with a letter.'\n );\n }\n if (isBuiltInTag(name) || config.isReservedTag(name)) {\n warn(\n 'Do not use built-in or reserved HTML elements as component ' +\n 'id: ' + name\n );\n }\n}\n\n/**\n * Ensure all props option syntax are normalized into the\n * Object-based format.\n */\nfunction normalizeProps (options, vm) {\n var props = options.props;\n if (!props) { return }\n var res = {};\n var i, val, name;\n if (Array.isArray(props)) {\n i = props.length;\n while (i--) {\n val = props[i];\n if (typeof val === 'string') {\n name = camelize(val);\n res[name] = { type: null };\n } else if (true) {\n warn('props must be strings when using array syntax.');\n }\n }\n } else if (isPlainObject(props)) {\n for (var key in props) {\n val = props[key];\n name = camelize(key);\n res[name] = isPlainObject(val)\n ? val\n : { type: val };\n }\n } else if (true) {\n warn(\n \"Invalid value for option \\\"props\\\": expected an Array or an Object, \" +\n \"but got \" + (toRawType(props)) + \".\",\n vm\n );\n }\n options.props = res;\n}\n\n/**\n * Normalize all injections into Object-based format\n */\nfunction normalizeInject (options, vm) {\n var inject = options.inject;\n if (!inject) { return }\n var normalized = options.inject = {};\n if (Array.isArray(inject)) {\n for (var i = 0; i < inject.length; i++) {\n normalized[inject[i]] = { from: inject[i] };\n }\n } else if (isPlainObject(inject)) {\n for (var key in inject) {\n var val = inject[key];\n normalized[key] = isPlainObject(val)\n ? extend({ from: key }, val)\n : { from: val };\n }\n } else if (true) {\n warn(\n \"Invalid value for option \\\"inject\\\": expected an Array or an Object, \" +\n \"but got \" + (toRawType(inject)) + \".\",\n vm\n );\n }\n}\n\n/**\n * Normalize raw function directives into object format.\n */\nfunction normalizeDirectives (options) {\n var dirs = options.directives;\n if (dirs) {\n for (var key in dirs) {\n var def = dirs[key];\n if (typeof def === 'function') {\n dirs[key] = { bind: def, update: def };\n }\n }\n }\n}\n\nfunction assertObjectType (name, value, vm) {\n if (!isPlainObject(value)) {\n warn(\n \"Invalid value for option \\\"\" + name + \"\\\": expected an Object, \" +\n \"but got \" + (toRawType(value)) + \".\",\n vm\n );\n }\n}\n\n/**\n * Merge two option objects into a new one.\n * Core utility used in both instantiation and inheritance.\n */\nfunction mergeOptions (\n parent,\n child,\n vm\n) {\n if (true) {\n checkComponents(child);\n }\n\n if (typeof child === 'function') {\n child = child.options;\n }\n\n normalizeProps(child, vm);\n normalizeInject(child, vm);\n normalizeDirectives(child);\n var extendsFrom = child.extends;\n if (extendsFrom) {\n parent = mergeOptions(parent, extendsFrom, vm);\n }\n if (child.mixins) {\n for (var i = 0, l = child.mixins.length; i < l; i++) {\n parent = mergeOptions(parent, child.mixins[i], vm);\n }\n }\n var options = {};\n var key;\n for (key in parent) {\n mergeField(key);\n }\n for (key in child) {\n if (!hasOwn(parent, key)) {\n mergeField(key);\n }\n }\n function mergeField (key) {\n var strat = strats[key] || defaultStrat;\n options[key] = strat(parent[key], child[key], vm, key);\n }\n return options\n}\n\n/**\n * Resolve an asset.\n * This function is used because child instances need access\n * to assets defined in its ancestor chain.\n */\nfunction resolveAsset (\n options,\n type,\n id,\n warnMissing\n) {\n /* istanbul ignore if */\n if (typeof id !== 'string') {\n return\n }\n var assets = options[type];\n // check local registration variations first\n if (hasOwn(assets, id)) { return assets[id] }\n var camelizedId = camelize(id);\n if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }\n var PascalCaseId = capitalize(camelizedId);\n if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }\n // fallback to prototype chain\n var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];\n if (\"development\" !== 'production' && warnMissing && !res) {\n warn(\n 'Failed to resolve ' + type.slice(0, -1) + ': ' + id,\n options\n );\n }\n return res\n}\n\n/* */\n\nfunction validateProp (\n key,\n propOptions,\n propsData,\n vm\n) {\n var prop = propOptions[key];\n var absent = !hasOwn(propsData, key);\n var value = propsData[key];\n // boolean casting\n var booleanIndex = getTypeIndex(Boolean, prop.type);\n if (booleanIndex > -1) {\n if (absent && !hasOwn(prop, 'default')) {\n value = false;\n } else if (value === '' || value === hyphenate(key)) {\n // only cast empty string / same name to boolean if\n // boolean has higher priority\n var stringIndex = getTypeIndex(String, prop.type);\n if (stringIndex < 0 || booleanIndex < stringIndex) {\n value = true;\n }\n }\n }\n // check default value\n if (value === undefined) {\n value = getPropDefaultValue(vm, prop, key);\n // since the default value is a fresh copy,\n // make sure to observe it.\n var prevShouldObserve = shouldObserve;\n toggleObserving(true);\n observe(value);\n toggleObserving(prevShouldObserve);\n }\n if (\n true\n ) {\n assertProp(prop, key, value, vm, absent);\n }\n return value\n}\n\n/**\n * Get the default value of a prop.\n */\nfunction getPropDefaultValue (vm, prop, key) {\n // no default, return undefined\n if (!hasOwn(prop, 'default')) {\n return undefined\n }\n var def = prop.default;\n // warn against non-factory defaults for Object & Array\n if (\"development\" !== 'production' && isObject(def)) {\n warn(\n 'Invalid default value for prop \"' + key + '\": ' +\n 'Props with type Object/Array must use a factory function ' +\n 'to return the default value.',\n vm\n );\n }\n // the raw prop value was also undefined from previous render,\n // return previous default value to avoid unnecessary watcher trigger\n if (vm && vm.$options.propsData &&\n vm.$options.propsData[key] === undefined &&\n vm._props[key] !== undefined\n ) {\n return vm._props[key]\n }\n // call factory function for non-Function types\n // a value is Function if its prototype is function even across different execution context\n return typeof def === 'function' && getType(prop.type) !== 'Function'\n ? def.call(vm)\n : def\n}\n\n/**\n * Assert whether a prop is valid.\n */\nfunction assertProp (\n prop,\n name,\n value,\n vm,\n absent\n) {\n if (prop.required && absent) {\n warn(\n 'Missing required prop: \"' + name + '\"',\n vm\n );\n return\n }\n if (value == null && !prop.required) {\n return\n }\n var type = prop.type;\n var valid = !type || type === true;\n var expectedTypes = [];\n if (type) {\n if (!Array.isArray(type)) {\n type = [type];\n }\n for (var i = 0; i < type.length && !valid; i++) {\n var assertedType = assertType(value, type[i]);\n expectedTypes.push(assertedType.expectedType || '');\n valid = assertedType.valid;\n }\n }\n if (!valid) {\n warn(\n \"Invalid prop: type check failed for prop \\\"\" + name + \"\\\".\" +\n \" Expected \" + (expectedTypes.map(capitalize).join(', ')) +\n \", got \" + (toRawType(value)) + \".\",\n vm\n );\n return\n }\n var validator = prop.validator;\n if (validator) {\n if (!validator(value)) {\n warn(\n 'Invalid prop: custom validator check failed for prop \"' + name + '\".',\n vm\n );\n }\n }\n}\n\nvar simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;\n\nfunction assertType (value, type) {\n var valid;\n var expectedType = getType(type);\n if (simpleCheckRE.test(expectedType)) {\n var t = typeof value;\n valid = t === expectedType.toLowerCase();\n // for primitive wrapper objects\n if (!valid && t === 'object') {\n valid = value instanceof type;\n }\n } else if (expectedType === 'Object') {\n valid = isPlainObject(value);\n } else if (expectedType === 'Array') {\n valid = Array.isArray(value);\n } else {\n valid = value instanceof type;\n }\n return {\n valid: valid,\n expectedType: expectedType\n }\n}\n\n/**\n * Use function string name to check built-in types,\n * because a simple equality check will fail when running\n * across different vms / iframes.\n */\nfunction getType (fn) {\n var match = fn && fn.toString().match(/^\\s*function (\\w+)/);\n return match ? match[1] : ''\n}\n\nfunction isSameType (a, b) {\n return getType(a) === getType(b)\n}\n\nfunction getTypeIndex (type, expectedTypes) {\n if (!Array.isArray(expectedTypes)) {\n return isSameType(expectedTypes, type) ? 0 : -1\n }\n for (var i = 0, len = expectedTypes.length; i < len; i++) {\n if (isSameType(expectedTypes[i], type)) {\n return i\n }\n }\n return -1\n}\n\n/* */\n\nfunction handleError (err, vm, info) {\n if (vm) {\n var cur = vm;\n while ((cur = cur.$parent)) {\n var hooks = cur.$options.errorCaptured;\n if (hooks) {\n for (var i = 0; i < hooks.length; i++) {\n try {\n var capture = hooks[i].call(cur, err, vm, info) === false;\n if (capture) { return }\n } catch (e) {\n globalHandleError(e, cur, 'errorCaptured hook');\n }\n }\n }\n }\n }\n globalHandleError(err, vm, info);\n}\n\nfunction globalHandleError (err, vm, info) {\n if (config.errorHandler) {\n try {\n return config.errorHandler.call(null, err, vm, info)\n } catch (e) {\n logError(e, null, 'config.errorHandler');\n }\n }\n logError(err, vm, info);\n}\n\nfunction logError (err, vm, info) {\n if (true) {\n warn((\"Error in \" + info + \": \\\"\" + (err.toString()) + \"\\\"\"), vm);\n }\n /* istanbul ignore else */\n if ((inBrowser || inWeex) && typeof console !== 'undefined') {\n console.error(err);\n } else {\n throw err\n }\n}\n\n/* */\n/* globals MessageChannel */\n\nvar callbacks = [];\nvar pending = false;\n\nfunction flushCallbacks () {\n pending = false;\n var copies = callbacks.slice(0);\n callbacks.length = 0;\n for (var i = 0; i < copies.length; i++) {\n copies[i]();\n }\n}\n\n// Here we have async deferring wrappers using both microtasks and (macro) tasks.\n// In < 2.4 we used microtasks everywhere, but there are some scenarios where\n// microtasks have too high a priority and fire in between supposedly\n// sequential events (e.g. #4521, #6690) or even between bubbling of the same\n// event (#6566). However, using (macro) tasks everywhere also has subtle problems\n// when state is changed right before repaint (e.g. #6813, out-in transitions).\n// Here we use microtask by default, but expose a way to force (macro) task when\n// needed (e.g. in event handlers attached by v-on).\nvar microTimerFunc;\nvar macroTimerFunc;\nvar useMacroTask = false;\n\n// Determine (macro) task defer implementation.\n// Technically setImmediate should be the ideal choice, but it's only available\n// in IE. The only polyfill that consistently queues the callback after all DOM\n// events triggered in the same loop is by using MessageChannel.\n/* istanbul ignore if */\nif (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {\n macroTimerFunc = function () {\n setImmediate(flushCallbacks);\n };\n} else if (typeof MessageChannel !== 'undefined' && (\n isNative(MessageChannel) ||\n // PhantomJS\n MessageChannel.toString() === '[object MessageChannelConstructor]'\n)) {\n var channel = new MessageChannel();\n var port = channel.port2;\n channel.port1.onmessage = flushCallbacks;\n macroTimerFunc = function () {\n port.postMessage(1);\n };\n} else {\n /* istanbul ignore next */\n macroTimerFunc = function () {\n setTimeout(flushCallbacks, 0);\n };\n}\n\n// Determine microtask defer implementation.\n/* istanbul ignore next, $flow-disable-line */\nif (typeof Promise !== 'undefined' && isNative(Promise)) {\n var p = Promise.resolve();\n microTimerFunc = function () {\n p.then(flushCallbacks);\n // in problematic UIWebViews, Promise.then doesn't completely break, but\n // it can get stuck in a weird state where callbacks are pushed into the\n // microtask queue but the queue isn't being flushed, until the browser\n // needs to do some other work, e.g. handle a timer. Therefore we can\n // \"force\" the microtask queue to be flushed by adding an empty timer.\n if (isIOS) { setTimeout(noop); }\n };\n} else {\n // fallback to macro\n microTimerFunc = macroTimerFunc;\n}\n\n/**\n * Wrap a function so that if any code inside triggers state change,\n * the changes are queued using a (macro) task instead of a microtask.\n */\nfunction withMacroTask (fn) {\n return fn._withTask || (fn._withTask = function () {\n useMacroTask = true;\n var res = fn.apply(null, arguments);\n useMacroTask = false;\n return res\n })\n}\n\nfunction nextTick (cb, ctx) {\n var _resolve;\n callbacks.push(function () {\n if (cb) {\n try {\n cb.call(ctx);\n } catch (e) {\n handleError(e, ctx, 'nextTick');\n }\n } else if (_resolve) {\n _resolve(ctx);\n }\n });\n if (!pending) {\n pending = true;\n if (useMacroTask) {\n macroTimerFunc();\n } else {\n microTimerFunc();\n }\n }\n // $flow-disable-line\n if (!cb && typeof Promise !== 'undefined') {\n return new Promise(function (resolve) {\n _resolve = resolve;\n })\n }\n}\n\n/* */\n\nvar mark;\nvar measure;\n\nif (true) {\n var perf = inBrowser && window.performance;\n /* istanbul ignore if */\n if (\n perf &&\n perf.mark &&\n perf.measure &&\n perf.clearMarks &&\n perf.clearMeasures\n ) {\n mark = function (tag) { return perf.mark(tag); };\n measure = function (name, startTag, endTag) {\n perf.measure(name, startTag, endTag);\n perf.clearMarks(startTag);\n perf.clearMarks(endTag);\n perf.clearMeasures(name);\n };\n }\n}\n\n/* not type checking this file because flow doesn't play well with Proxy */\n\nvar initProxy;\n\nif (true) {\n var allowedGlobals = makeMap(\n 'Infinity,undefined,NaN,isFinite,isNaN,' +\n 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +\n 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +\n 'require' // for Webpack/Browserify\n );\n\n var warnNonPresent = function (target, key) {\n warn(\n \"Property or method \\\"\" + key + \"\\\" is not defined on the instance but \" +\n 'referenced during render. Make sure that this property is reactive, ' +\n 'either in the data option, or for class-based components, by ' +\n 'initializing the property. ' +\n 'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',\n target\n );\n };\n\n var hasProxy =\n typeof Proxy !== 'undefined' && isNative(Proxy);\n\n if (hasProxy) {\n var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');\n config.keyCodes = new Proxy(config.keyCodes, {\n set: function set (target, key, value) {\n if (isBuiltInModifier(key)) {\n warn((\"Avoid overwriting built-in modifier in config.keyCodes: .\" + key));\n return false\n } else {\n target[key] = value;\n return true\n }\n }\n });\n }\n\n var hasHandler = {\n has: function has (target, key) {\n var has = key in target;\n var isAllowed = allowedGlobals(key) || key.charAt(0) === '_';\n if (!has && !isAllowed) {\n warnNonPresent(target, key);\n }\n return has || !isAllowed\n }\n };\n\n var getHandler = {\n get: function get (target, key) {\n if (typeof key === 'string' && !(key in target)) {\n warnNonPresent(target, key);\n }\n return target[key]\n }\n };\n\n initProxy = function initProxy (vm) {\n if (hasProxy) {\n // determine which proxy handler to use\n var options = vm.$options;\n var handlers = options.render && options.render._withStripped\n ? getHandler\n : hasHandler;\n vm._renderProxy = new Proxy(vm, handlers);\n } else {\n vm._renderProxy = vm;\n }\n };\n}\n\n/* */\n\nvar seenObjects = new _Set();\n\n/**\n * Recursively traverse an object to evoke all converted\n * getters, so that every nested property inside the object\n * is collected as a \"deep\" dependency.\n */\nfunction traverse (val) {\n _traverse(val, seenObjects);\n seenObjects.clear();\n}\n\nfunction _traverse (val, seen) {\n var i, keys;\n var isA = Array.isArray(val);\n if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {\n return\n }\n if (val.__ob__) {\n var depId = val.__ob__.dep.id;\n if (seen.has(depId)) {\n return\n }\n seen.add(depId);\n }\n if (isA) {\n i = val.length;\n while (i--) { _traverse(val[i], seen); }\n } else {\n keys = Object.keys(val);\n i = keys.length;\n while (i--) { _traverse(val[keys[i]], seen); }\n }\n}\n\n/* */\n\nvar normalizeEvent = cached(function (name) {\n var passive = name.charAt(0) === '&';\n name = passive ? name.slice(1) : name;\n var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first\n name = once$$1 ? name.slice(1) : name;\n var capture = name.charAt(0) === '!';\n name = capture ? name.slice(1) : name;\n return {\n name: name,\n once: once$$1,\n capture: capture,\n passive: passive\n }\n});\n\nfunction createFnInvoker (fns) {\n function invoker () {\n var arguments$1 = arguments;\n\n var fns = invoker.fns;\n if (Array.isArray(fns)) {\n var cloned = fns.slice();\n for (var i = 0; i < cloned.length; i++) {\n cloned[i].apply(null, arguments$1);\n }\n } else {\n // return handler return value for single handlers\n return fns.apply(null, arguments)\n }\n }\n invoker.fns = fns;\n return invoker\n}\n\nfunction updateListeners (\n on,\n oldOn,\n add,\n remove$$1,\n vm\n) {\n var name, def, cur, old, event;\n for (name in on) {\n def = cur = on[name];\n old = oldOn[name];\n event = normalizeEvent(name);\n /* istanbul ignore if */\n if (isUndef(cur)) {\n \"development\" !== 'production' && warn(\n \"Invalid handler for event \\\"\" + (event.name) + \"\\\": got \" + String(cur),\n vm\n );\n } else if (isUndef(old)) {\n if (isUndef(cur.fns)) {\n cur = on[name] = createFnInvoker(cur);\n }\n add(event.name, cur, event.once, event.capture, event.passive, event.params);\n } else if (cur !== old) {\n old.fns = cur;\n on[name] = old;\n }\n }\n for (name in oldOn) {\n if (isUndef(on[name])) {\n event = normalizeEvent(name);\n remove$$1(event.name, oldOn[name], event.capture);\n }\n }\n}\n\n/* */\n\nfunction mergeVNodeHook (def, hookKey, hook) {\n if (def instanceof VNode) {\n def = def.data.hook || (def.data.hook = {});\n }\n var invoker;\n var oldHook = def[hookKey];\n\n function wrappedHook () {\n hook.apply(this, arguments);\n // important: remove merged hook to ensure it's called only once\n // and prevent memory leak\n remove(invoker.fns, wrappedHook);\n }\n\n if (isUndef(oldHook)) {\n // no existing hook\n invoker = createFnInvoker([wrappedHook]);\n } else {\n /* istanbul ignore if */\n if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {\n // already a merged invoker\n invoker = oldHook;\n invoker.fns.push(wrappedHook);\n } else {\n // existing plain hook\n invoker = createFnInvoker([oldHook, wrappedHook]);\n }\n }\n\n invoker.merged = true;\n def[hookKey] = invoker;\n}\n\n/* */\n\nfunction extractPropsFromVNodeData (\n data,\n Ctor,\n tag\n) {\n // we are only extracting raw values here.\n // validation and default values are handled in the child\n // component itself.\n var propOptions = Ctor.options.props;\n if (isUndef(propOptions)) {\n return\n }\n var res = {};\n var attrs = data.attrs;\n var props = data.props;\n if (isDef(attrs) || isDef(props)) {\n for (var key in propOptions) {\n var altKey = hyphenate(key);\n if (true) {\n var keyInLowerCase = key.toLowerCase();\n if (\n key !== keyInLowerCase &&\n attrs && hasOwn(attrs, keyInLowerCase)\n ) {\n tip(\n \"Prop \\\"\" + keyInLowerCase + \"\\\" is passed to component \" +\n (formatComponentName(tag || Ctor)) + \", but the declared prop name is\" +\n \" \\\"\" + key + \"\\\". \" +\n \"Note that HTML attributes are case-insensitive and camelCased \" +\n \"props need to use their kebab-case equivalents when using in-DOM \" +\n \"templates. You should probably use \\\"\" + altKey + \"\\\" instead of \\\"\" + key + \"\\\".\"\n );\n }\n }\n checkProp(res, props, key, altKey, true) ||\n checkProp(res, attrs, key, altKey, false);\n }\n }\n return res\n}\n\nfunction checkProp (\n res,\n hash,\n key,\n altKey,\n preserve\n) {\n if (isDef(hash)) {\n if (hasOwn(hash, key)) {\n res[key] = hash[key];\n if (!preserve) {\n delete hash[key];\n }\n return true\n } else if (hasOwn(hash, altKey)) {\n res[key] = hash[altKey];\n if (!preserve) {\n delete hash[altKey];\n }\n return true\n }\n }\n return false\n}\n\n/* */\n\n// The template compiler attempts to minimize the need for normalization by\n// statically analyzing the template at compile time.\n//\n// For plain HTML markup, normalization can be completely skipped because the\n// generated render function is guaranteed to return Array<VNode>. There are\n// two cases where extra normalization is needed:\n\n// 1. When the children contains components - because a functional component\n// may return an Array instead of a single root. In this case, just a simple\n// normalization is needed - if any child is an Array, we flatten the whole\n// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep\n// because functional components already normalize their own children.\nfunction simpleNormalizeChildren (children) {\n for (var i = 0; i < children.length; i++) {\n if (Array.isArray(children[i])) {\n return Array.prototype.concat.apply([], children)\n }\n }\n return children\n}\n\n// 2. When the children contains constructs that always generated nested Arrays,\n// e.g. <template>, <slot>, v-for, or when the children is provided by user\n// with hand-written render functions / JSX. In such cases a full normalization\n// is needed to cater to all possible types of children values.\nfunction normalizeChildren (children) {\n return isPrimitive(children)\n ? [createTextVNode(children)]\n : Array.isArray(children)\n ? normalizeArrayChildren(children)\n : undefined\n}\n\nfunction isTextNode (node) {\n return isDef(node) && isDef(node.text) && isFalse(node.isComment)\n}\n\nfunction normalizeArrayChildren (children, nestedIndex) {\n var res = [];\n var i, c, lastIndex, last;\n for (i = 0; i < children.length; i++) {\n c = children[i];\n if (isUndef(c) || typeof c === 'boolean') { continue }\n lastIndex = res.length - 1;\n last = res[lastIndex];\n // nested\n if (Array.isArray(c)) {\n if (c.length > 0) {\n c = normalizeArrayChildren(c, ((nestedIndex || '') + \"_\" + i));\n // merge adjacent text nodes\n if (isTextNode(c[0]) && isTextNode(last)) {\n res[lastIndex] = createTextVNode(last.text + (c[0]).text);\n c.shift();\n }\n res.push.apply(res, c);\n }\n } else if (isPrimitive(c)) {\n if (isTextNode(last)) {\n // merge adjacent text nodes\n // this is necessary for SSR hydration because text nodes are\n // essentially merged when rendered to HTML strings\n res[lastIndex] = createTextVNode(last.text + c);\n } else if (c !== '') {\n // convert primitive to vnode\n res.push(createTextVNode(c));\n }\n } else {\n if (isTextNode(c) && isTextNode(last)) {\n // merge adjacent text nodes\n res[lastIndex] = createTextVNode(last.text + c.text);\n } else {\n // default key for nested array children (likely generated by v-for)\n if (isTrue(children._isVList) &&\n isDef(c.tag) &&\n isUndef(c.key) &&\n isDef(nestedIndex)) {\n c.key = \"__vlist\" + nestedIndex + \"_\" + i + \"__\";\n }\n res.push(c);\n }\n }\n }\n return res\n}\n\n/* */\n\nfunction ensureCtor (comp, base) {\n if (\n comp.__esModule ||\n (hasSymbol && comp[Symbol.toStringTag] === 'Module')\n ) {\n comp = comp.default;\n }\n return isObject(comp)\n ? base.extend(comp)\n : comp\n}\n\nfunction createAsyncPlaceholder (\n factory,\n data,\n context,\n children,\n tag\n) {\n var node = createEmptyVNode();\n node.asyncFactory = factory;\n node.asyncMeta = { data: data, context: context, children: children, tag: tag };\n return node\n}\n\nfunction resolveAsyncComponent (\n factory,\n baseCtor,\n context\n) {\n if (isTrue(factory.error) && isDef(factory.errorComp)) {\n return factory.errorComp\n }\n\n if (isDef(factory.resolved)) {\n return factory.resolved\n }\n\n if (isTrue(factory.loading) && isDef(factory.loadingComp)) {\n return factory.loadingComp\n }\n\n if (isDef(factory.contexts)) {\n // already pending\n factory.contexts.push(context);\n } else {\n var contexts = factory.contexts = [context];\n var sync = true;\n\n var forceRender = function () {\n for (var i = 0, l = contexts.length; i < l; i++) {\n contexts[i].$forceUpdate();\n }\n };\n\n var resolve = once(function (res) {\n // cache resolved\n factory.resolved = ensureCtor(res, baseCtor);\n // invoke callbacks only if this is not a synchronous resolve\n // (async resolves are shimmed as synchronous during SSR)\n if (!sync) {\n forceRender();\n }\n });\n\n var reject = once(function (reason) {\n \"development\" !== 'production' && warn(\n \"Failed to resolve async component: \" + (String(factory)) +\n (reason ? (\"\\nReason: \" + reason) : '')\n );\n if (isDef(factory.errorComp)) {\n factory.error = true;\n forceRender();\n }\n });\n\n var res = factory(resolve, reject);\n\n if (isObject(res)) {\n if (typeof res.then === 'function') {\n // () => Promise\n if (isUndef(factory.resolved)) {\n res.then(resolve, reject);\n }\n } else if (isDef(res.component) && typeof res.component.then === 'function') {\n res.component.then(resolve, reject);\n\n if (isDef(res.error)) {\n factory.errorComp = ensureCtor(res.error, baseCtor);\n }\n\n if (isDef(res.loading)) {\n factory.loadingComp = ensureCtor(res.loading, baseCtor);\n if (res.delay === 0) {\n factory.loading = true;\n } else {\n setTimeout(function () {\n if (isUndef(factory.resolved) && isUndef(factory.error)) {\n factory.loading = true;\n forceRender();\n }\n }, res.delay || 200);\n }\n }\n\n if (isDef(res.timeout)) {\n setTimeout(function () {\n if (isUndef(factory.resolved)) {\n reject(\n true\n ? (\"timeout (\" + (res.timeout) + \"ms)\")\n : null\n );\n }\n }, res.timeout);\n }\n }\n }\n\n sync = false;\n // return in case resolved synchronously\n return factory.loading\n ? factory.loadingComp\n : factory.resolved\n }\n}\n\n/* */\n\nfunction isAsyncPlaceholder (node) {\n return node.isComment && node.asyncFactory\n}\n\n/* */\n\nfunction getFirstComponentChild (children) {\n if (Array.isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n var c = children[i];\n if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {\n return c\n }\n }\n }\n}\n\n/* */\n\n/* */\n\nfunction initEvents (vm) {\n vm._events = Object.create(null);\n vm._hasHookEvent = false;\n // init parent attached events\n var listeners = vm.$options._parentListeners;\n if (listeners) {\n updateComponentListeners(vm, listeners);\n }\n}\n\nvar target;\n\nfunction add (event, fn, once) {\n if (once) {\n target.$once(event, fn);\n } else {\n target.$on(event, fn);\n }\n}\n\nfunction remove$1 (event, fn) {\n target.$off(event, fn);\n}\n\nfunction updateComponentListeners (\n vm,\n listeners,\n oldListeners\n) {\n target = vm;\n updateListeners(listeners, oldListeners || {}, add, remove$1, vm);\n target = undefined;\n}\n\nfunction eventsMixin (Vue) {\n var hookRE = /^hook:/;\n Vue.prototype.$on = function (event, fn) {\n var this$1 = this;\n\n var vm = this;\n if (Array.isArray(event)) {\n for (var i = 0, l = event.length; i < l; i++) {\n this$1.$on(event[i], fn);\n }\n } else {\n (vm._events[event] || (vm._events[event] = [])).push(fn);\n // optimize hook:event cost by using a boolean flag marked at registration\n // instead of a hash lookup\n if (hookRE.test(event)) {\n vm._hasHookEvent = true;\n }\n }\n return vm\n };\n\n Vue.prototype.$once = function (event, fn) {\n var vm = this;\n function on () {\n vm.$off(event, on);\n fn.apply(vm, arguments);\n }\n on.fn = fn;\n vm.$on(event, on);\n return vm\n };\n\n Vue.prototype.$off = function (event, fn) {\n var this$1 = this;\n\n var vm = this;\n // all\n if (!arguments.length) {\n vm._events = Object.create(null);\n return vm\n }\n // array of events\n if (Array.isArray(event)) {\n for (var i = 0, l = event.length; i < l; i++) {\n this$1.$off(event[i], fn);\n }\n return vm\n }\n // specific event\n var cbs = vm._events[event];\n if (!cbs) {\n return vm\n }\n if (!fn) {\n vm._events[event] = null;\n return vm\n }\n if (fn) {\n // specific handler\n var cb;\n var i$1 = cbs.length;\n while (i$1--) {\n cb = cbs[i$1];\n if (cb === fn || cb.fn === fn) {\n cbs.splice(i$1, 1);\n break\n }\n }\n }\n return vm\n };\n\n Vue.prototype.$emit = function (event) {\n var vm = this;\n if (true) {\n var lowerCaseEvent = event.toLowerCase();\n if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {\n tip(\n \"Event \\\"\" + lowerCaseEvent + \"\\\" is emitted in component \" +\n (formatComponentName(vm)) + \" but the handler is registered for \\\"\" + event + \"\\\". \" +\n \"Note that HTML attributes are case-insensitive and you cannot use \" +\n \"v-on to listen to camelCase events when using in-DOM templates. \" +\n \"You should probably use \\\"\" + (hyphenate(event)) + \"\\\" instead of \\\"\" + event + \"\\\".\"\n );\n }\n }\n var cbs = vm._events[event];\n if (cbs) {\n cbs = cbs.length > 1 ? toArray(cbs) : cbs;\n var args = toArray(arguments, 1);\n for (var i = 0, l = cbs.length; i < l; i++) {\n try {\n cbs[i].apply(vm, args);\n } catch (e) {\n handleError(e, vm, (\"event handler for \\\"\" + event + \"\\\"\"));\n }\n }\n }\n return vm\n };\n}\n\n/* */\n\n\n\n/**\n * Runtime helper for resolving raw children VNodes into a slot object.\n */\nfunction resolveSlots (\n children,\n context\n) {\n var slots = {};\n if (!children) {\n return slots\n }\n for (var i = 0, l = children.length; i < l; i++) {\n var child = children[i];\n var data = child.data;\n // remove slot attribute if the node is resolved as a Vue slot node\n if (data && data.attrs && data.attrs.slot) {\n delete data.attrs.slot;\n }\n // named slots should only be respected if the vnode was rendered in the\n // same context.\n if ((child.context === context || child.fnContext === context) &&\n data && data.slot != null\n ) {\n var name = data.slot;\n var slot = (slots[name] || (slots[name] = []));\n if (child.tag === 'template') {\n slot.push.apply(slot, child.children || []);\n } else {\n slot.push(child);\n }\n } else {\n (slots.default || (slots.default = [])).push(child);\n }\n }\n // ignore slots that contains only whitespace\n for (var name$1 in slots) {\n if (slots[name$1].every(isWhitespace)) {\n delete slots[name$1];\n }\n }\n return slots\n}\n\nfunction isWhitespace (node) {\n return (node.isComment && !node.asyncFactory) || node.text === ' '\n}\n\nfunction resolveScopedSlots (\n fns, // see flow/vnode\n res\n) {\n res = res || {};\n for (var i = 0; i < fns.length; i++) {\n if (Array.isArray(fns[i])) {\n resolveScopedSlots(fns[i], res);\n } else {\n res[fns[i].key] = fns[i].fn;\n }\n }\n return res\n}\n\n/* */\n\nvar activeInstance = null;\nvar isUpdatingChildComponent = false;\n\nfunction initLifecycle (vm) {\n var options = vm.$options;\n\n // locate first non-abstract parent\n var parent = options.parent;\n if (parent && !options.abstract) {\n while (parent.$options.abstract && parent.$parent) {\n parent = parent.$parent;\n }\n parent.$children.push(vm);\n }\n\n vm.$parent = parent;\n vm.$root = parent ? parent.$root : vm;\n\n vm.$children = [];\n vm.$refs = {};\n\n vm._watcher = null;\n vm._inactive = null;\n vm._directInactive = false;\n vm._isMounted = false;\n vm._isDestroyed = false;\n vm._isBeingDestroyed = false;\n}\n\nfunction lifecycleMixin (Vue) {\n Vue.prototype._update = function (vnode, hydrating) {\n var vm = this;\n if (vm._isMounted) {\n callHook(vm, 'beforeUpdate');\n }\n var prevEl = vm.$el;\n var prevVnode = vm._vnode;\n var prevActiveInstance = activeInstance;\n activeInstance = vm;\n vm._vnode = vnode;\n // Vue.prototype.__patch__ is injected in entry points\n // based on the rendering backend used.\n if (!prevVnode) {\n // initial render\n vm.$el = vm.__patch__(\n vm.$el, vnode, hydrating, false /* removeOnly */,\n vm.$options._parentElm,\n vm.$options._refElm\n );\n // no need for the ref nodes after initial patch\n // this prevents keeping a detached DOM tree in memory (#5851)\n vm.$options._parentElm = vm.$options._refElm = null;\n } else {\n // updates\n vm.$el = vm.__patch__(prevVnode, vnode);\n }\n activeInstance = prevActiveInstance;\n // update __vue__ reference\n if (prevEl) {\n prevEl.__vue__ = null;\n }\n if (vm.$el) {\n vm.$el.__vue__ = vm;\n }\n // if parent is an HOC, update its $el as well\n if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {\n vm.$parent.$el = vm.$el;\n }\n // updated hook is called by the scheduler to ensure that children are\n // updated in a parent's updated hook.\n };\n\n Vue.prototype.$forceUpdate = function () {\n var vm = this;\n if (vm._watcher) {\n vm._watcher.update();\n }\n };\n\n Vue.prototype.$destroy = function () {\n var vm = this;\n if (vm._isBeingDestroyed) {\n return\n }\n callHook(vm, 'beforeDestroy');\n vm._isBeingDestroyed = true;\n // remove self from parent\n var parent = vm.$parent;\n if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {\n remove(parent.$children, vm);\n }\n // teardown watchers\n if (vm._watcher) {\n vm._watcher.teardown();\n }\n var i = vm._watchers.length;\n while (i--) {\n vm._watchers[i].teardown();\n }\n // remove reference from data ob\n // frozen object may not have observer.\n if (vm._data.__ob__) {\n vm._data.__ob__.vmCount--;\n }\n // call the last hook...\n vm._isDestroyed = true;\n // invoke destroy hooks on current rendered tree\n vm.__patch__(vm._vnode, null);\n // fire destroyed hook\n callHook(vm, 'destroyed');\n // turn off all instance listeners.\n vm.$off();\n // remove __vue__ reference\n if (vm.$el) {\n vm.$el.__vue__ = null;\n }\n // release circular reference (#6759)\n if (vm.$vnode) {\n vm.$vnode.parent = null;\n }\n };\n}\n\nfunction mountComponent (\n vm,\n el,\n hydrating\n) {\n vm.$el = el;\n if (!vm.$options.render) {\n vm.$options.render = createEmptyVNode;\n if (true) {\n /* istanbul ignore if */\n if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||\n vm.$options.el || el) {\n warn(\n 'You are using the runtime-only build of Vue where the template ' +\n 'compiler is not available. Either pre-compile the templates into ' +\n 'render functions, or use the compiler-included build.',\n vm\n );\n } else {\n warn(\n 'Failed to mount component: template or render function not defined.',\n vm\n );\n }\n }\n }\n callHook(vm, 'beforeMount');\n\n var updateComponent;\n /* istanbul ignore if */\n if (\"development\" !== 'production' && config.performance && mark) {\n updateComponent = function () {\n var name = vm._name;\n var id = vm._uid;\n var startTag = \"vue-perf-start:\" + id;\n var endTag = \"vue-perf-end:\" + id;\n\n mark(startTag);\n var vnode = vm._render();\n mark(endTag);\n measure((\"vue \" + name + \" render\"), startTag, endTag);\n\n mark(startTag);\n vm._update(vnode, hydrating);\n mark(endTag);\n measure((\"vue \" + name + \" patch\"), startTag, endTag);\n };\n } else {\n updateComponent = function () {\n vm._update(vm._render(), hydrating);\n };\n }\n\n // we set this to vm._watcher inside the watcher's constructor\n // since the watcher's initial patch may call $forceUpdate (e.g. inside child\n // component's mounted hook), which relies on vm._watcher being already defined\n new Watcher(vm, updateComponent, noop, null, true /* isRenderWatcher */);\n hydrating = false;\n\n // manually mounted instance, call mounted on self\n // mounted is called for render-created child components in its inserted hook\n if (vm.$vnode == null) {\n vm._isMounted = true;\n callHook(vm, 'mounted');\n }\n return vm\n}\n\nfunction updateChildComponent (\n vm,\n propsData,\n listeners,\n parentVnode,\n renderChildren\n) {\n if (true) {\n isUpdatingChildComponent = true;\n }\n\n // determine whether component has slot children\n // we need to do this before overwriting $options._renderChildren\n var hasChildren = !!(\n renderChildren || // has new static slots\n vm.$options._renderChildren || // has old static slots\n parentVnode.data.scopedSlots || // has new scoped slots\n vm.$scopedSlots !== emptyObject // has old scoped slots\n );\n\n vm.$options._parentVnode = parentVnode;\n vm.$vnode = parentVnode; // update vm's placeholder node without re-render\n\n if (vm._vnode) { // update child tree's parent\n vm._vnode.parent = parentVnode;\n }\n vm.$options._renderChildren = renderChildren;\n\n // update $attrs and $listeners hash\n // these are also reactive so they may trigger child update if the child\n // used them during render\n vm.$attrs = parentVnode.data.attrs || emptyObject;\n vm.$listeners = listeners || emptyObject;\n\n // update props\n if (propsData && vm.$options.props) {\n toggleObserving(false);\n var props = vm._props;\n var propKeys = vm.$options._propKeys || [];\n for (var i = 0; i < propKeys.length; i++) {\n var key = propKeys[i];\n var propOptions = vm.$options.props; // wtf flow?\n props[key] = validateProp(key, propOptions, propsData, vm);\n }\n toggleObserving(true);\n // keep a copy of raw propsData\n vm.$options.propsData = propsData;\n }\n\n // update listeners\n listeners = listeners || emptyObject;\n var oldListeners = vm.$options._parentListeners;\n vm.$options._parentListeners = listeners;\n updateComponentListeners(vm, listeners, oldListeners);\n\n // resolve slots + force update if has children\n if (hasChildren) {\n vm.$slots = resolveSlots(renderChildren, parentVnode.context);\n vm.$forceUpdate();\n }\n\n if (true) {\n isUpdatingChildComponent = false;\n }\n}\n\nfunction isInInactiveTree (vm) {\n while (vm && (vm = vm.$parent)) {\n if (vm._inactive) { return true }\n }\n return false\n}\n\nfunction activateChildComponent (vm, direct) {\n if (direct) {\n vm._directInactive = false;\n if (isInInactiveTree(vm)) {\n return\n }\n } else if (vm._directInactive) {\n return\n }\n if (vm._inactive || vm._inactive === null) {\n vm._inactive = false;\n for (var i = 0; i < vm.$children.length; i++) {\n activateChildComponent(vm.$children[i]);\n }\n callHook(vm, 'activated');\n }\n}\n\nfunction deactivateChildComponent (vm, direct) {\n if (direct) {\n vm._directInactive = true;\n if (isInInactiveTree(vm)) {\n return\n }\n }\n if (!vm._inactive) {\n vm._inactive = true;\n for (var i = 0; i < vm.$children.length; i++) {\n deactivateChildComponent(vm.$children[i]);\n }\n callHook(vm, 'deactivated');\n }\n}\n\nfunction callHook (vm, hook) {\n // #7573 disable dep collection when invoking lifecycle hooks\n pushTarget();\n var handlers = vm.$options[hook];\n if (handlers) {\n for (var i = 0, j = handlers.length; i < j; i++) {\n try {\n handlers[i].call(vm);\n } catch (e) {\n handleError(e, vm, (hook + \" hook\"));\n }\n }\n }\n if (vm._hasHookEvent) {\n vm.$emit('hook:' + hook);\n }\n popTarget();\n}\n\n/* */\n\n\nvar MAX_UPDATE_COUNT = 100;\n\nvar queue = [];\nvar activatedChildren = [];\nvar has = {};\nvar circular = {};\nvar waiting = false;\nvar flushing = false;\nvar index = 0;\n\n/**\n * Reset the scheduler's state.\n */\nfunction resetSchedulerState () {\n index = queue.length = activatedChildren.length = 0;\n has = {};\n if (true) {\n circular = {};\n }\n waiting = flushing = false;\n}\n\n/**\n * Flush both queues and run the watchers.\n */\nfunction flushSchedulerQueue () {\n flushing = true;\n var watcher, id;\n\n // Sort queue before flush.\n // This ensures that:\n // 1. Components are updated from parent to child. (because parent is always\n // created before the child)\n // 2. A component's user watchers are run before its render watcher (because\n // user watchers are created before the render watcher)\n // 3. If a component is destroyed during a parent component's watcher run,\n // its watchers can be skipped.\n queue.sort(function (a, b) { return a.id - b.id; });\n\n // do not cache length because more watchers might be pushed\n // as we run existing watchers\n for (index = 0; index < queue.length; index++) {\n watcher = queue[index];\n id = watcher.id;\n has[id] = null;\n watcher.run();\n // in dev build, check and stop circular updates.\n if (\"development\" !== 'production' && has[id] != null) {\n circular[id] = (circular[id] || 0) + 1;\n if (circular[id] > MAX_UPDATE_COUNT) {\n warn(\n 'You may have an infinite update loop ' + (\n watcher.user\n ? (\"in watcher with expression \\\"\" + (watcher.expression) + \"\\\"\")\n : \"in a component render function.\"\n ),\n watcher.vm\n );\n break\n }\n }\n }\n\n // keep copies of post queues before resetting state\n var activatedQueue = activatedChildren.slice();\n var updatedQueue = queue.slice();\n\n resetSchedulerState();\n\n // call component updated and activated hooks\n callActivatedHooks(activatedQueue);\n callUpdatedHooks(updatedQueue);\n\n // devtool hook\n /* istanbul ignore if */\n if (devtools && config.devtools) {\n devtools.emit('flush');\n }\n}\n\nfunction callUpdatedHooks (queue) {\n var i = queue.length;\n while (i--) {\n var watcher = queue[i];\n var vm = watcher.vm;\n if (vm._watcher === watcher && vm._isMounted) {\n callHook(vm, 'updated');\n }\n }\n}\n\n/**\n * Queue a kept-alive component that was activated during patch.\n * The queue will be processed after the entire tree has been patched.\n */\nfunction queueActivatedComponent (vm) {\n // setting _inactive to false here so that a render function can\n // rely on checking whether it's in an inactive tree (e.g. router-view)\n vm._inactive = false;\n activatedChildren.push(vm);\n}\n\nfunction callActivatedHooks (queue) {\n for (var i = 0; i < queue.length; i++) {\n queue[i]._inactive = true;\n activateChildComponent(queue[i], true /* true */);\n }\n}\n\n/**\n * Push a watcher into the watcher queue.\n * Jobs with duplicate IDs will be skipped unless it's\n * pushed when the queue is being flushed.\n */\nfunction queueWatcher (watcher) {\n var id = watcher.id;\n if (has[id] == null) {\n has[id] = true;\n if (!flushing) {\n queue.push(watcher);\n } else {\n // if already flushing, splice the watcher based on its id\n // if already past its id, it will be run next immediately.\n var i = queue.length - 1;\n while (i > index && queue[i].id > watcher.id) {\n i--;\n }\n queue.splice(i + 1, 0, watcher);\n }\n // queue the flush\n if (!waiting) {\n waiting = true;\n nextTick(flushSchedulerQueue);\n }\n }\n}\n\n/* */\n\nvar uid$1 = 0;\n\n/**\n * A watcher parses an expression, collects dependencies,\n * and fires callback when the expression value changes.\n * This is used for both the $watch() api and directives.\n */\nvar Watcher = function Watcher (\n vm,\n expOrFn,\n cb,\n options,\n isRenderWatcher\n) {\n this.vm = vm;\n if (isRenderWatcher) {\n vm._watcher = this;\n }\n vm._watchers.push(this);\n // options\n if (options) {\n this.deep = !!options.deep;\n this.user = !!options.user;\n this.lazy = !!options.lazy;\n this.sync = !!options.sync;\n } else {\n this.deep = this.user = this.lazy = this.sync = false;\n }\n this.cb = cb;\n this.id = ++uid$1; // uid for batching\n this.active = true;\n this.dirty = this.lazy; // for lazy watchers\n this.deps = [];\n this.newDeps = [];\n this.depIds = new _Set();\n this.newDepIds = new _Set();\n this.expression = true\n ? expOrFn.toString()\n : '';\n // parse expression for getter\n if (typeof expOrFn === 'function') {\n this.getter = expOrFn;\n } else {\n this.getter = parsePath(expOrFn);\n if (!this.getter) {\n this.getter = function () {};\n \"development\" !== 'production' && warn(\n \"Failed watching path: \\\"\" + expOrFn + \"\\\" \" +\n 'Watcher only accepts simple dot-delimited paths. ' +\n 'For full control, use a function instead.',\n vm\n );\n }\n }\n this.value = this.lazy\n ? undefined\n : this.get();\n};\n\n/**\n * Evaluate the getter, and re-collect dependencies.\n */\nWatcher.prototype.get = function get () {\n pushTarget(this);\n var value;\n var vm = this.vm;\n try {\n value = this.getter.call(vm, vm);\n } catch (e) {\n if (this.user) {\n handleError(e, vm, (\"getter for watcher \\\"\" + (this.expression) + \"\\\"\"));\n } else {\n throw e\n }\n } finally {\n // \"touch\" every property so they are all tracked as\n // dependencies for deep watching\n if (this.deep) {\n traverse(value);\n }\n popTarget();\n this.cleanupDeps();\n }\n return value\n};\n\n/**\n * Add a dependency to this directive.\n */\nWatcher.prototype.addDep = function addDep (dep) {\n var id = dep.id;\n if (!this.newDepIds.has(id)) {\n this.newDepIds.add(id);\n this.newDeps.push(dep);\n if (!this.depIds.has(id)) {\n dep.addSub(this);\n }\n }\n};\n\n/**\n * Clean up for dependency collection.\n */\nWatcher.prototype.cleanupDeps = function cleanupDeps () {\n var this$1 = this;\n\n var i = this.deps.length;\n while (i--) {\n var dep = this$1.deps[i];\n if (!this$1.newDepIds.has(dep.id)) {\n dep.removeSub(this$1);\n }\n }\n var tmp = this.depIds;\n this.depIds = this.newDepIds;\n this.newDepIds = tmp;\n this.newDepIds.clear();\n tmp = this.deps;\n this.deps = this.newDeps;\n this.newDeps = tmp;\n this.newDeps.length = 0;\n};\n\n/**\n * Subscriber interface.\n * Will be called when a dependency changes.\n */\nWatcher.prototype.update = function update () {\n /* istanbul ignore else */\n if (this.lazy) {\n this.dirty = true;\n } else if (this.sync) {\n this.run();\n } else {\n queueWatcher(this);\n }\n};\n\n/**\n * Scheduler job interface.\n * Will be called by the scheduler.\n */\nWatcher.prototype.run = function run () {\n if (this.active) {\n var value = this.get();\n if (\n value !== this.value ||\n // Deep watchers and watchers on Object/Arrays should fire even\n // when the value is the same, because the value may\n // have mutated.\n isObject(value) ||\n this.deep\n ) {\n // set new value\n var oldValue = this.value;\n this.value = value;\n if (this.user) {\n try {\n this.cb.call(this.vm, value, oldValue);\n } catch (e) {\n handleError(e, this.vm, (\"callback for watcher \\\"\" + (this.expression) + \"\\\"\"));\n }\n } else {\n this.cb.call(this.vm, value, oldValue);\n }\n }\n }\n};\n\n/**\n * Evaluate the value of the watcher.\n * This only gets called for lazy watchers.\n */\nWatcher.prototype.evaluate = function evaluate () {\n this.value = this.get();\n this.dirty = false;\n};\n\n/**\n * Depend on all deps collected by this watcher.\n */\nWatcher.prototype.depend = function depend () {\n var this$1 = this;\n\n var i = this.deps.length;\n while (i--) {\n this$1.deps[i].depend();\n }\n};\n\n/**\n * Remove self from all dependencies' subscriber list.\n */\nWatcher.prototype.teardown = function teardown () {\n var this$1 = this;\n\n if (this.active) {\n // remove self from vm's watcher list\n // this is a somewhat expensive operation so we skip it\n // if the vm is being destroyed.\n if (!this.vm._isBeingDestroyed) {\n remove(this.vm._watchers, this);\n }\n var i = this.deps.length;\n while (i--) {\n this$1.deps[i].removeSub(this$1);\n }\n this.active = false;\n }\n};\n\n/* */\n\nvar sharedPropertyDefinition = {\n enumerable: true,\n configurable: true,\n get: noop,\n set: noop\n};\n\nfunction proxy (target, sourceKey, key) {\n sharedPropertyDefinition.get = function proxyGetter () {\n return this[sourceKey][key]\n };\n sharedPropertyDefinition.set = function proxySetter (val) {\n this[sourceKey][key] = val;\n };\n Object.defineProperty(target, key, sharedPropertyDefinition);\n}\n\nfunction initState (vm) {\n vm._watchers = [];\n var opts = vm.$options;\n if (opts.props) { initProps(vm, opts.props); }\n if (opts.methods) { initMethods(vm, opts.methods); }\n if (opts.data) {\n initData(vm);\n } else {\n observe(vm._data = {}, true /* asRootData */);\n }\n if (opts.computed) { initComputed(vm, opts.computed); }\n if (opts.watch && opts.watch !== nativeWatch) {\n initWatch(vm, opts.watch);\n }\n}\n\nfunction initProps (vm, propsOptions) {\n var propsData = vm.$options.propsData || {};\n var props = vm._props = {};\n // cache prop keys so that future props updates can iterate using Array\n // instead of dynamic object key enumeration.\n var keys = vm.$options._propKeys = [];\n var isRoot = !vm.$parent;\n // root instance props should be converted\n if (!isRoot) {\n toggleObserving(false);\n }\n var loop = function ( key ) {\n keys.push(key);\n var value = validateProp(key, propsOptions, propsData, vm);\n /* istanbul ignore else */\n if (true) {\n var hyphenatedKey = hyphenate(key);\n if (isReservedAttribute(hyphenatedKey) ||\n config.isReservedAttr(hyphenatedKey)) {\n warn(\n (\"\\\"\" + hyphenatedKey + \"\\\" is a reserved attribute and cannot be used as component prop.\"),\n vm\n );\n }\n defineReactive(props, key, value, function () {\n if (vm.$parent && !isUpdatingChildComponent) {\n warn(\n \"Avoid mutating a prop directly since the value will be \" +\n \"overwritten whenever the parent component re-renders. \" +\n \"Instead, use a data or computed property based on the prop's \" +\n \"value. Prop being mutated: \\\"\" + key + \"\\\"\",\n vm\n );\n }\n });\n } else {\n defineReactive(props, key, value);\n }\n // static props are already proxied on the component's prototype\n // during Vue.extend(). We only need to proxy props defined at\n // instantiation here.\n if (!(key in vm)) {\n proxy(vm, \"_props\", key);\n }\n };\n\n for (var key in propsOptions) loop( key );\n toggleObserving(true);\n}\n\nfunction initData (vm) {\n var data = vm.$options.data;\n data = vm._data = typeof data === 'function'\n ? getData(data, vm)\n : data || {};\n if (!isPlainObject(data)) {\n data = {};\n \"development\" !== 'production' && warn(\n 'data functions should return an object:\\n' +\n 'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',\n vm\n );\n }\n // proxy data on instance\n var keys = Object.keys(data);\n var props = vm.$options.props;\n var methods = vm.$options.methods;\n var i = keys.length;\n while (i--) {\n var key = keys[i];\n if (true) {\n if (methods && hasOwn(methods, key)) {\n warn(\n (\"Method \\\"\" + key + \"\\\" has already been defined as a data property.\"),\n vm\n );\n }\n }\n if (props && hasOwn(props, key)) {\n \"development\" !== 'production' && warn(\n \"The data property \\\"\" + key + \"\\\" is already declared as a prop. \" +\n \"Use prop default value instead.\",\n vm\n );\n } else if (!isReserved(key)) {\n proxy(vm, \"_data\", key);\n }\n }\n // observe data\n observe(data, true /* asRootData */);\n}\n\nfunction getData (data, vm) {\n // #7573 disable dep collection when invoking data getters\n pushTarget();\n try {\n return data.call(vm, vm)\n } catch (e) {\n handleError(e, vm, \"data()\");\n return {}\n } finally {\n popTarget();\n }\n}\n\nvar computedWatcherOptions = { lazy: true };\n\nfunction initComputed (vm, computed) {\n // $flow-disable-line\n var watchers = vm._computedWatchers = Object.create(null);\n // computed properties are just getters during SSR\n var isSSR = isServerRendering();\n\n for (var key in computed) {\n var userDef = computed[key];\n var getter = typeof userDef === 'function' ? userDef : userDef.get;\n if (\"development\" !== 'production' && getter == null) {\n warn(\n (\"Getter is missing for computed property \\\"\" + key + \"\\\".\"),\n vm\n );\n }\n\n if (!isSSR) {\n // create internal watcher for the computed property.\n watchers[key] = new Watcher(\n vm,\n getter || noop,\n noop,\n computedWatcherOptions\n );\n }\n\n // component-defined computed properties are already defined on the\n // component prototype. We only need to define computed properties defined\n // at instantiation here.\n if (!(key in vm)) {\n defineComputed(vm, key, userDef);\n } else if (true) {\n if (key in vm.$data) {\n warn((\"The computed property \\\"\" + key + \"\\\" is already defined in data.\"), vm);\n } else if (vm.$options.props && key in vm.$options.props) {\n warn((\"The computed property \\\"\" + key + \"\\\" is already defined as a prop.\"), vm);\n }\n }\n }\n}\n\nfunction defineComputed (\n target,\n key,\n userDef\n) {\n var shouldCache = !isServerRendering();\n if (typeof userDef === 'function') {\n sharedPropertyDefinition.get = shouldCache\n ? createComputedGetter(key)\n : userDef;\n sharedPropertyDefinition.set = noop;\n } else {\n sharedPropertyDefinition.get = userDef.get\n ? shouldCache && userDef.cache !== false\n ? createComputedGetter(key)\n : userDef.get\n : noop;\n sharedPropertyDefinition.set = userDef.set\n ? userDef.set\n : noop;\n }\n if (\"development\" !== 'production' &&\n sharedPropertyDefinition.set === noop) {\n sharedPropertyDefinition.set = function () {\n warn(\n (\"Computed property \\\"\" + key + \"\\\" was assigned to but it has no setter.\"),\n this\n );\n };\n }\n Object.defineProperty(target, key, sharedPropertyDefinition);\n}\n\nfunction createComputedGetter (key) {\n return function computedGetter () {\n var watcher = this._computedWatchers && this._computedWatchers[key];\n if (watcher) {\n if (watcher.dirty) {\n watcher.evaluate();\n }\n if (Dep.target) {\n watcher.depend();\n }\n return watcher.value\n }\n }\n}\n\nfunction initMethods (vm, methods) {\n var props = vm.$options.props;\n for (var key in methods) {\n if (true) {\n if (methods[key] == null) {\n warn(\n \"Method \\\"\" + key + \"\\\" has an undefined value in the component definition. \" +\n \"Did you reference the function correctly?\",\n vm\n );\n }\n if (props && hasOwn(props, key)) {\n warn(\n (\"Method \\\"\" + key + \"\\\" has already been defined as a prop.\"),\n vm\n );\n }\n if ((key in vm) && isReserved(key)) {\n warn(\n \"Method \\\"\" + key + \"\\\" conflicts with an existing Vue instance method. \" +\n \"Avoid defining component methods that start with _ or $.\"\n );\n }\n }\n vm[key] = methods[key] == null ? noop : bind(methods[key], vm);\n }\n}\n\nfunction initWatch (vm, watch) {\n for (var key in watch) {\n var handler = watch[key];\n if (Array.isArray(handler)) {\n for (var i = 0; i < handler.length; i++) {\n createWatcher(vm, key, handler[i]);\n }\n } else {\n createWatcher(vm, key, handler);\n }\n }\n}\n\nfunction createWatcher (\n vm,\n expOrFn,\n handler,\n options\n) {\n if (isPlainObject(handler)) {\n options = handler;\n handler = handler.handler;\n }\n if (typeof handler === 'string') {\n handler = vm[handler];\n }\n return vm.$watch(expOrFn, handler, options)\n}\n\nfunction stateMixin (Vue) {\n // flow somehow has problems with directly declared definition object\n // when using Object.defineProperty, so we have to procedurally build up\n // the object here.\n var dataDef = {};\n dataDef.get = function () { return this._data };\n var propsDef = {};\n propsDef.get = function () { return this._props };\n if (true) {\n dataDef.set = function (newData) {\n warn(\n 'Avoid replacing instance root $data. ' +\n 'Use nested data properties instead.',\n this\n );\n };\n propsDef.set = function () {\n warn(\"$props is readonly.\", this);\n };\n }\n Object.defineProperty(Vue.prototype, '$data', dataDef);\n Object.defineProperty(Vue.prototype, '$props', propsDef);\n\n Vue.prototype.$set = set;\n Vue.prototype.$delete = del;\n\n Vue.prototype.$watch = function (\n expOrFn,\n cb,\n options\n ) {\n var vm = this;\n if (isPlainObject(cb)) {\n return createWatcher(vm, expOrFn, cb, options)\n }\n options = options || {};\n options.user = true;\n var watcher = new Watcher(vm, expOrFn, cb, options);\n if (options.immediate) {\n cb.call(vm, watcher.value);\n }\n return function unwatchFn () {\n watcher.teardown();\n }\n };\n}\n\n/* */\n\nfunction initProvide (vm) {\n var provide = vm.$options.provide;\n if (provide) {\n vm._provided = typeof provide === 'function'\n ? provide.call(vm)\n : provide;\n }\n}\n\nfunction initInjections (vm) {\n var result = resolveInject(vm.$options.inject, vm);\n if (result) {\n toggleObserving(false);\n Object.keys(result).forEach(function (key) {\n /* istanbul ignore else */\n if (true) {\n defineReactive(vm, key, result[key], function () {\n warn(\n \"Avoid mutating an injected value directly since the changes will be \" +\n \"overwritten whenever the provided component re-renders. \" +\n \"injection being mutated: \\\"\" + key + \"\\\"\",\n vm\n );\n });\n } else {\n defineReactive(vm, key, result[key]);\n }\n });\n toggleObserving(true);\n }\n}\n\nfunction resolveInject (inject, vm) {\n if (inject) {\n // inject is :any because flow is not smart enough to figure out cached\n var result = Object.create(null);\n var keys = hasSymbol\n ? Reflect.ownKeys(inject).filter(function (key) {\n /* istanbul ignore next */\n return Object.getOwnPropertyDescriptor(inject, key).enumerable\n })\n : Object.keys(inject);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var provideKey = inject[key].from;\n var source = vm;\n while (source) {\n if (source._provided && hasOwn(source._provided, provideKey)) {\n result[key] = source._provided[provideKey];\n break\n }\n source = source.$parent;\n }\n if (!source) {\n if ('default' in inject[key]) {\n var provideDefault = inject[key].default;\n result[key] = typeof provideDefault === 'function'\n ? provideDefault.call(vm)\n : provideDefault;\n } else if (true) {\n warn((\"Injection \\\"\" + key + \"\\\" not found\"), vm);\n }\n }\n }\n return result\n }\n}\n\n/* */\n\n/**\n * Runtime helper for rendering v-for lists.\n */\nfunction renderList (\n val,\n render\n) {\n var ret, i, l, keys, key;\n if (Array.isArray(val) || typeof val === 'string') {\n ret = new Array(val.length);\n for (i = 0, l = val.length; i < l; i++) {\n ret[i] = render(val[i], i);\n }\n } else if (typeof val === 'number') {\n ret = new Array(val);\n for (i = 0; i < val; i++) {\n ret[i] = render(i + 1, i);\n }\n } else if (isObject(val)) {\n keys = Object.keys(val);\n ret = new Array(keys.length);\n for (i = 0, l = keys.length; i < l; i++) {\n key = keys[i];\n ret[i] = render(val[key], key, i);\n }\n }\n if (isDef(ret)) {\n (ret)._isVList = true;\n }\n return ret\n}\n\n/* */\n\n/**\n * Runtime helper for rendering <slot>\n */\nfunction renderSlot (\n name,\n fallback,\n props,\n bindObject\n) {\n var scopedSlotFn = this.$scopedSlots[name];\n var nodes;\n if (scopedSlotFn) { // scoped slot\n props = props || {};\n if (bindObject) {\n if (\"development\" !== 'production' && !isObject(bindObject)) {\n warn(\n 'slot v-bind without argument expects an Object',\n this\n );\n }\n props = extend(extend({}, bindObject), props);\n }\n nodes = scopedSlotFn(props) || fallback;\n } else {\n var slotNodes = this.$slots[name];\n // warn duplicate slot usage\n if (slotNodes) {\n if (\"development\" !== 'production' && slotNodes._rendered) {\n warn(\n \"Duplicate presence of slot \\\"\" + name + \"\\\" found in the same render tree \" +\n \"- this will likely cause render errors.\",\n this\n );\n }\n slotNodes._rendered = true;\n }\n nodes = slotNodes || fallback;\n }\n\n var target = props && props.slot;\n if (target) {\n return this.$createElement('template', { slot: target }, nodes)\n } else {\n return nodes\n }\n}\n\n/* */\n\n/**\n * Runtime helper for resolving filters\n */\nfunction resolveFilter (id) {\n return resolveAsset(this.$options, 'filters', id, true) || identity\n}\n\n/* */\n\nfunction isKeyNotMatch (expect, actual) {\n if (Array.isArray(expect)) {\n return expect.indexOf(actual) === -1\n } else {\n return expect !== actual\n }\n}\n\n/**\n * Runtime helper for checking keyCodes from config.\n * exposed as Vue.prototype._k\n * passing in eventKeyName as last argument separately for backwards compat\n */\nfunction checkKeyCodes (\n eventKeyCode,\n key,\n builtInKeyCode,\n eventKeyName,\n builtInKeyName\n) {\n var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;\n if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {\n return isKeyNotMatch(builtInKeyName, eventKeyName)\n } else if (mappedKeyCode) {\n return isKeyNotMatch(mappedKeyCode, eventKeyCode)\n } else if (eventKeyName) {\n return hyphenate(eventKeyName) !== key\n }\n}\n\n/* */\n\n/**\n * Runtime helper for merging v-bind=\"object\" into a VNode's data.\n */\nfunction bindObjectProps (\n data,\n tag,\n value,\n asProp,\n isSync\n) {\n if (value) {\n if (!isObject(value)) {\n \"development\" !== 'production' && warn(\n 'v-bind without argument expects an Object or Array value',\n this\n );\n } else {\n if (Array.isArray(value)) {\n value = toObject(value);\n }\n var hash;\n var loop = function ( key ) {\n if (\n key === 'class' ||\n key === 'style' ||\n isReservedAttribute(key)\n ) {\n hash = data;\n } else {\n var type = data.attrs && data.attrs.type;\n hash = asProp || config.mustUseProp(tag, type, key)\n ? data.domProps || (data.domProps = {})\n : data.attrs || (data.attrs = {});\n }\n if (!(key in hash)) {\n hash[key] = value[key];\n\n if (isSync) {\n var on = data.on || (data.on = {});\n on[(\"update:\" + key)] = function ($event) {\n value[key] = $event;\n };\n }\n }\n };\n\n for (var key in value) loop( key );\n }\n }\n return data\n}\n\n/* */\n\n/**\n * Runtime helper for rendering static trees.\n */\nfunction renderStatic (\n index,\n isInFor\n) {\n var cached = this._staticTrees || (this._staticTrees = []);\n var tree = cached[index];\n // if has already-rendered static tree and not inside v-for,\n // we can reuse the same tree.\n if (tree && !isInFor) {\n return tree\n }\n // otherwise, render a fresh tree.\n tree = cached[index] = this.$options.staticRenderFns[index].call(\n this._renderProxy,\n null,\n this // for render fns generated for functional component templates\n );\n markStatic(tree, (\"__static__\" + index), false);\n return tree\n}\n\n/**\n * Runtime helper for v-once.\n * Effectively it means marking the node as static with a unique key.\n */\nfunction markOnce (\n tree,\n index,\n key\n) {\n markStatic(tree, (\"__once__\" + index + (key ? (\"_\" + key) : \"\")), true);\n return tree\n}\n\nfunction markStatic (\n tree,\n key,\n isOnce\n) {\n if (Array.isArray(tree)) {\n for (var i = 0; i < tree.length; i++) {\n if (tree[i] && typeof tree[i] !== 'string') {\n markStaticNode(tree[i], (key + \"_\" + i), isOnce);\n }\n }\n } else {\n markStaticNode(tree, key, isOnce);\n }\n}\n\nfunction markStaticNode (node, key, isOnce) {\n node.isStatic = true;\n node.key = key;\n node.isOnce = isOnce;\n}\n\n/* */\n\nfunction bindObjectListeners (data, value) {\n if (value) {\n if (!isPlainObject(value)) {\n \"development\" !== 'production' && warn(\n 'v-on without argument expects an Object value',\n this\n );\n } else {\n var on = data.on = data.on ? extend({}, data.on) : {};\n for (var key in value) {\n var existing = on[key];\n var ours = value[key];\n on[key] = existing ? [].concat(existing, ours) : ours;\n }\n }\n }\n return data\n}\n\n/* */\n\nfunction installRenderHelpers (target) {\n target._o = markOnce;\n target._n = toNumber;\n target._s = toString;\n target._l = renderList;\n target._t = renderSlot;\n target._q = looseEqual;\n target._i = looseIndexOf;\n target._m = renderStatic;\n target._f = resolveFilter;\n target._k = checkKeyCodes;\n target._b = bindObjectProps;\n target._v = createTextVNode;\n target._e = createEmptyVNode;\n target._u = resolveScopedSlots;\n target._g = bindObjectListeners;\n}\n\n/* */\n\nfunction FunctionalRenderContext (\n data,\n props,\n children,\n parent,\n Ctor\n) {\n var options = Ctor.options;\n // ensure the createElement function in functional components\n // gets a unique context - this is necessary for correct named slot check\n var contextVm;\n if (hasOwn(parent, '_uid')) {\n contextVm = Object.create(parent);\n // $flow-disable-line\n contextVm._original = parent;\n } else {\n // the context vm passed in is a functional context as well.\n // in this case we want to make sure we are able to get a hold to the\n // real context instance.\n contextVm = parent;\n // $flow-disable-line\n parent = parent._original;\n }\n var isCompiled = isTrue(options._compiled);\n var needNormalization = !isCompiled;\n\n this.data = data;\n this.props = props;\n this.children = children;\n this.parent = parent;\n this.listeners = data.on || emptyObject;\n this.injections = resolveInject(options.inject, parent);\n this.slots = function () { return resolveSlots(children, parent); };\n\n // support for compiled functional template\n if (isCompiled) {\n // exposing $options for renderStatic()\n this.$options = options;\n // pre-resolve slots for renderSlot()\n this.$slots = this.slots();\n this.$scopedSlots = data.scopedSlots || emptyObject;\n }\n\n if (options._scopeId) {\n this._c = function (a, b, c, d) {\n var vnode = createElement(contextVm, a, b, c, d, needNormalization);\n if (vnode && !Array.isArray(vnode)) {\n vnode.fnScopeId = options._scopeId;\n vnode.fnContext = parent;\n }\n return vnode\n };\n } else {\n this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };\n }\n}\n\ninstallRenderHelpers(FunctionalRenderContext.prototype);\n\nfunction createFunctionalComponent (\n Ctor,\n propsData,\n data,\n contextVm,\n children\n) {\n var options = Ctor.options;\n var props = {};\n var propOptions = options.props;\n if (isDef(propOptions)) {\n for (var key in propOptions) {\n props[key] = validateProp(key, propOptions, propsData || emptyObject);\n }\n } else {\n if (isDef(data.attrs)) { mergeProps(props, data.attrs); }\n if (isDef(data.props)) { mergeProps(props, data.props); }\n }\n\n var renderContext = new FunctionalRenderContext(\n data,\n props,\n children,\n contextVm,\n Ctor\n );\n\n var vnode = options.render.call(null, renderContext._c, renderContext);\n\n if (vnode instanceof VNode) {\n return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options)\n } else if (Array.isArray(vnode)) {\n var vnodes = normalizeChildren(vnode) || [];\n var res = new Array(vnodes.length);\n for (var i = 0; i < vnodes.length; i++) {\n res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options);\n }\n return res\n }\n}\n\nfunction cloneAndMarkFunctionalResult (vnode, data, contextVm, options) {\n // #7817 clone node before setting fnContext, otherwise if the node is reused\n // (e.g. it was from a cached normal slot) the fnContext causes named slots\n // that should not be matched to match.\n var clone = cloneVNode(vnode);\n clone.fnContext = contextVm;\n clone.fnOptions = options;\n if (data.slot) {\n (clone.data || (clone.data = {})).slot = data.slot;\n }\n return clone\n}\n\nfunction mergeProps (to, from) {\n for (var key in from) {\n to[camelize(key)] = from[key];\n }\n}\n\n/* */\n\n\n\n\n// Register the component hook to weex native render engine.\n// The hook will be triggered by native, not javascript.\n\n\n// Updates the state of the component to weex native render engine.\n\n/* */\n\n// https://github.com/Hanks10100/weex-native-directive/tree/master/component\n\n// listening on native callback\n\n/* */\n\n/* */\n\n// inline hooks to be invoked on component VNodes during patch\nvar componentVNodeHooks = {\n init: function init (\n vnode,\n hydrating,\n parentElm,\n refElm\n ) {\n if (\n vnode.componentInstance &&\n !vnode.componentInstance._isDestroyed &&\n vnode.data.keepAlive\n ) {\n // kept-alive components, treat as a patch\n var mountedNode = vnode; // work around flow\n componentVNodeHooks.prepatch(mountedNode, mountedNode);\n } else {\n var child = vnode.componentInstance = createComponentInstanceForVnode(\n vnode,\n activeInstance,\n parentElm,\n refElm\n );\n child.$mount(hydrating ? vnode.elm : undefined, hydrating);\n }\n },\n\n prepatch: function prepatch (oldVnode, vnode) {\n var options = vnode.componentOptions;\n var child = vnode.componentInstance = oldVnode.componentInstance;\n updateChildComponent(\n child,\n options.propsData, // updated props\n options.listeners, // updated listeners\n vnode, // new parent vnode\n options.children // new children\n );\n },\n\n insert: function insert (vnode) {\n var context = vnode.context;\n var componentInstance = vnode.componentInstance;\n if (!componentInstance._isMounted) {\n componentInstance._isMounted = true;\n callHook(componentInstance, 'mounted');\n }\n if (vnode.data.keepAlive) {\n if (context._isMounted) {\n // vue-router#1212\n // During updates, a kept-alive component's child components may\n // change, so directly walking the tree here may call activated hooks\n // on incorrect children. Instead we push them into a queue which will\n // be processed after the whole patch process ended.\n queueActivatedComponent(componentInstance);\n } else {\n activateChildComponent(componentInstance, true /* direct */);\n }\n }\n },\n\n destroy: function destroy (vnode) {\n var componentInstance = vnode.componentInstance;\n if (!componentInstance._isDestroyed) {\n if (!vnode.data.keepAlive) {\n componentInstance.$destroy();\n } else {\n deactivateChildComponent(componentInstance, true /* direct */);\n }\n }\n }\n};\n\nvar hooksToMerge = Object.keys(componentVNodeHooks);\n\nfunction createComponent (\n Ctor,\n data,\n context,\n children,\n tag\n) {\n if (isUndef(Ctor)) {\n return\n }\n\n var baseCtor = context.$options._base;\n\n // plain options object: turn it into a constructor\n if (isObject(Ctor)) {\n Ctor = baseCtor.extend(Ctor);\n }\n\n // if at this stage it's not a constructor or an async component factory,\n // reject.\n if (typeof Ctor !== 'function') {\n if (true) {\n warn((\"Invalid Component definition: \" + (String(Ctor))), context);\n }\n return\n }\n\n // async component\n var asyncFactory;\n if (isUndef(Ctor.cid)) {\n asyncFactory = Ctor;\n Ctor = resolveAsyncComponent(asyncFactory, baseCtor, context);\n if (Ctor === undefined) {\n // return a placeholder node for async component, which is rendered\n // as a comment node but preserves all the raw information for the node.\n // the information will be used for async server-rendering and hydration.\n return createAsyncPlaceholder(\n asyncFactory,\n data,\n context,\n children,\n tag\n )\n }\n }\n\n data = data || {};\n\n // resolve constructor options in case global mixins are applied after\n // component constructor creation\n resolveConstructorOptions(Ctor);\n\n // transform component v-model data into props & events\n if (isDef(data.model)) {\n transformModel(Ctor.options, data);\n }\n\n // extract props\n var propsData = extractPropsFromVNodeData(data, Ctor, tag);\n\n // functional component\n if (isTrue(Ctor.options.functional)) {\n return createFunctionalComponent(Ctor, propsData, data, context, children)\n }\n\n // extract listeners, since these needs to be treated as\n // child component listeners instead of DOM listeners\n var listeners = data.on;\n // replace with listeners with .native modifier\n // so it gets processed during parent component patch.\n data.on = data.nativeOn;\n\n if (isTrue(Ctor.options.abstract)) {\n // abstract components do not keep anything\n // other than props & listeners & slot\n\n // work around flow\n var slot = data.slot;\n data = {};\n if (slot) {\n data.slot = slot;\n }\n }\n\n // install component management hooks onto the placeholder node\n installComponentHooks(data);\n\n // return a placeholder vnode\n var name = Ctor.options.name || tag;\n var vnode = new VNode(\n (\"vue-component-\" + (Ctor.cid) + (name ? (\"-\" + name) : '')),\n data, undefined, undefined, undefined, context,\n { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },\n asyncFactory\n );\n\n // Weex specific: invoke recycle-list optimized @render function for\n // extracting cell-slot template.\n // https://github.com/Hanks10100/weex-native-directive/tree/master/component\n /* istanbul ignore if */\n return vnode\n}\n\nfunction createComponentInstanceForVnode (\n vnode, // we know it's MountedComponentVNode but flow doesn't\n parent, // activeInstance in lifecycle state\n parentElm,\n refElm\n) {\n var options = {\n _isComponent: true,\n parent: parent,\n _parentVnode: vnode,\n _parentElm: parentElm || null,\n _refElm: refElm || null\n };\n // check inline-template render functions\n var inlineTemplate = vnode.data.inlineTemplate;\n if (isDef(inlineTemplate)) {\n options.render = inlineTemplate.render;\n options.staticRenderFns = inlineTemplate.staticRenderFns;\n }\n return new vnode.componentOptions.Ctor(options)\n}\n\nfunction installComponentHooks (data) {\n var hooks = data.hook || (data.hook = {});\n for (var i = 0; i < hooksToMerge.length; i++) {\n var key = hooksToMerge[i];\n hooks[key] = componentVNodeHooks[key];\n }\n}\n\n// transform component v-model info (value and callback) into\n// prop and event handler respectively.\nfunction transformModel (options, data) {\n var prop = (options.model && options.model.prop) || 'value';\n var event = (options.model && options.model.event) || 'input';(data.props || (data.props = {}))[prop] = data.model.value;\n var on = data.on || (data.on = {});\n if (isDef(on[event])) {\n on[event] = [data.model.callback].concat(on[event]);\n } else {\n on[event] = data.model.callback;\n }\n}\n\n/* */\n\nvar SIMPLE_NORMALIZE = 1;\nvar ALWAYS_NORMALIZE = 2;\n\n// wrapper function for providing a more flexible interface\n// without getting yelled at by flow\nfunction createElement (\n context,\n tag,\n data,\n children,\n normalizationType,\n alwaysNormalize\n) {\n if (Array.isArray(data) || isPrimitive(data)) {\n normalizationType = children;\n children = data;\n data = undefined;\n }\n if (isTrue(alwaysNormalize)) {\n normalizationType = ALWAYS_NORMALIZE;\n }\n return _createElement(context, tag, data, children, normalizationType)\n}\n\nfunction _createElement (\n context,\n tag,\n data,\n children,\n normalizationType\n) {\n if (isDef(data) && isDef((data).__ob__)) {\n \"development\" !== 'production' && warn(\n \"Avoid using observed data object as vnode data: \" + (JSON.stringify(data)) + \"\\n\" +\n 'Always create fresh vnode data objects in each render!',\n context\n );\n return createEmptyVNode()\n }\n // object syntax in v-bind\n if (isDef(data) && isDef(data.is)) {\n tag = data.is;\n }\n if (!tag) {\n // in case of component :is set to falsy value\n return createEmptyVNode()\n }\n // warn against non-primitive key\n if (\"development\" !== 'production' &&\n isDef(data) && isDef(data.key) && !isPrimitive(data.key)\n ) {\n {\n warn(\n 'Avoid using non-primitive value as key, ' +\n 'use string/number value instead.',\n context\n );\n }\n }\n // support single function children as default scoped slot\n if (Array.isArray(children) &&\n typeof children[0] === 'function'\n ) {\n data = data || {};\n data.scopedSlots = { default: children[0] };\n children.length = 0;\n }\n if (normalizationType === ALWAYS_NORMALIZE) {\n children = normalizeChildren(children);\n } else if (normalizationType === SIMPLE_NORMALIZE) {\n children = simpleNormalizeChildren(children);\n }\n var vnode, ns;\n if (typeof tag === 'string') {\n var Ctor;\n ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);\n if (config.isReservedTag(tag)) {\n // platform built-in elements\n vnode = new VNode(\n config.parsePlatformTagName(tag), data, children,\n undefined, undefined, context\n );\n } else if (isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {\n // component\n vnode = createComponent(Ctor, data, context, children, tag);\n } else {\n // unknown or unlisted namespaced elements\n // check at runtime because it may get assigned a namespace when its\n // parent normalizes children\n vnode = new VNode(\n tag, data, children,\n undefined, undefined, context\n );\n }\n } else {\n // direct component options / constructor\n vnode = createComponent(tag, data, context, children);\n }\n if (Array.isArray(vnode)) {\n return vnode\n } else if (isDef(vnode)) {\n if (isDef(ns)) { applyNS(vnode, ns); }\n if (isDef(data)) { registerDeepBindings(data); }\n return vnode\n } else {\n return createEmptyVNode()\n }\n}\n\nfunction applyNS (vnode, ns, force) {\n vnode.ns = ns;\n if (vnode.tag === 'foreignObject') {\n // use default namespace inside foreignObject\n ns = undefined;\n force = true;\n }\n if (isDef(vnode.children)) {\n for (var i = 0, l = vnode.children.length; i < l; i++) {\n var child = vnode.children[i];\n if (isDef(child.tag) && (\n isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {\n applyNS(child, ns, force);\n }\n }\n }\n}\n\n// ref #5318\n// necessary to ensure parent re-render when deep bindings like :style and\n// :class are used on slot nodes\nfunction registerDeepBindings (data) {\n if (isObject(data.style)) {\n traverse(data.style);\n }\n if (isObject(data.class)) {\n traverse(data.class);\n }\n}\n\n/* */\n\nfunction initRender (vm) {\n vm._vnode = null; // the root of the child tree\n vm._staticTrees = null; // v-once cached trees\n var options = vm.$options;\n var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree\n var renderContext = parentVnode && parentVnode.context;\n vm.$slots = resolveSlots(options._renderChildren, renderContext);\n vm.$scopedSlots = emptyObject;\n // bind the createElement fn to this instance\n // so that we get proper render context inside it.\n // args order: tag, data, children, normalizationType, alwaysNormalize\n // internal version is used by render functions compiled from templates\n vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };\n // normalization is always applied for the public version, used in\n // user-written render functions.\n vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };\n\n // $attrs & $listeners are exposed for easier HOC creation.\n // they need to be reactive so that HOCs using them are always updated\n var parentData = parentVnode && parentVnode.data;\n\n /* istanbul ignore else */\n if (true) {\n defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {\n !isUpdatingChildComponent && warn(\"$attrs is readonly.\", vm);\n }, true);\n defineReactive(vm, '$listeners', options._parentListeners || emptyObject, function () {\n !isUpdatingChildComponent && warn(\"$listeners is readonly.\", vm);\n }, true);\n } else {\n defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, null, true);\n defineReactive(vm, '$listeners', options._parentListeners || emptyObject, null, true);\n }\n}\n\nfunction renderMixin (Vue) {\n // install runtime convenience helpers\n installRenderHelpers(Vue.prototype);\n\n Vue.prototype.$nextTick = function (fn) {\n return nextTick(fn, this)\n };\n\n Vue.prototype._render = function () {\n var vm = this;\n var ref = vm.$options;\n var render = ref.render;\n var _parentVnode = ref._parentVnode;\n\n // reset _rendered flag on slots for duplicate slot check\n if (true) {\n for (var key in vm.$slots) {\n // $flow-disable-line\n vm.$slots[key]._rendered = false;\n }\n }\n\n if (_parentVnode) {\n vm.$scopedSlots = _parentVnode.data.scopedSlots || emptyObject;\n }\n\n // set parent vnode. this allows render functions to have access\n // to the data on the placeholder node.\n vm.$vnode = _parentVnode;\n // render self\n var vnode;\n try {\n vnode = render.call(vm._renderProxy, vm.$createElement);\n } catch (e) {\n handleError(e, vm, \"render\");\n // return error render result,\n // or previous vnode to prevent render error causing blank component\n /* istanbul ignore else */\n if (true) {\n if (vm.$options.renderError) {\n try {\n vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);\n } catch (e) {\n handleError(e, vm, \"renderError\");\n vnode = vm._vnode;\n }\n } else {\n vnode = vm._vnode;\n }\n } else {\n vnode = vm._vnode;\n }\n }\n // return empty vnode in case the render function errored out\n if (!(vnode instanceof VNode)) {\n if (\"development\" !== 'production' && Array.isArray(vnode)) {\n warn(\n 'Multiple root nodes returned from render function. Render function ' +\n 'should return a single root node.',\n vm\n );\n }\n vnode = createEmptyVNode();\n }\n // set parent\n vnode.parent = _parentVnode;\n return vnode\n };\n}\n\n/* */\n\nvar uid$3 = 0;\n\nfunction initMixin (Vue) {\n Vue.prototype._init = function (options) {\n var vm = this;\n // a uid\n vm._uid = uid$3++;\n\n var startTag, endTag;\n /* istanbul ignore if */\n if (\"development\" !== 'production' && config.performance && mark) {\n startTag = \"vue-perf-start:\" + (vm._uid);\n endTag = \"vue-perf-end:\" + (vm._uid);\n mark(startTag);\n }\n\n // a flag to avoid this being observed\n vm._isVue = true;\n // merge options\n if (options && options._isComponent) {\n // optimize internal component instantiation\n // since dynamic options merging is pretty slow, and none of the\n // internal component options needs special treatment.\n initInternalComponent(vm, options);\n } else {\n vm.$options = mergeOptions(\n resolveConstructorOptions(vm.constructor),\n options || {},\n vm\n );\n }\n /* istanbul ignore else */\n if (true) {\n initProxy(vm);\n } else {\n vm._renderProxy = vm;\n }\n // expose real self\n vm._self = vm;\n initLifecycle(vm);\n initEvents(vm);\n initRender(vm);\n callHook(vm, 'beforeCreate');\n initInjections(vm); // resolve injections before data/props\n initState(vm);\n initProvide(vm); // resolve provide after data/props\n callHook(vm, 'created');\n\n /* istanbul ignore if */\n if (\"development\" !== 'production' && config.performance && mark) {\n vm._name = formatComponentName(vm, false);\n mark(endTag);\n measure((\"vue \" + (vm._name) + \" init\"), startTag, endTag);\n }\n\n if (vm.$options.el) {\n vm.$mount(vm.$options.el);\n }\n };\n}\n\nfunction initInternalComponent (vm, options) {\n var opts = vm.$options = Object.create(vm.constructor.options);\n // doing this because it's faster than dynamic enumeration.\n var parentVnode = options._parentVnode;\n opts.parent = options.parent;\n opts._parentVnode = parentVnode;\n opts._parentElm = options._parentElm;\n opts._refElm = options._refElm;\n\n var vnodeComponentOptions = parentVnode.componentOptions;\n opts.propsData = vnodeComponentOptions.propsData;\n opts._parentListeners = vnodeComponentOptions.listeners;\n opts._renderChildren = vnodeComponentOptions.children;\n opts._componentTag = vnodeComponentOptions.tag;\n\n if (options.render) {\n opts.render = options.render;\n opts.staticRenderFns = options.staticRenderFns;\n }\n}\n\nfunction resolveConstructorOptions (Ctor) {\n var options = Ctor.options;\n if (Ctor.super) {\n var superOptions = resolveConstructorOptions(Ctor.super);\n var cachedSuperOptions = Ctor.superOptions;\n if (superOptions !== cachedSuperOptions) {\n // super option changed,\n // need to resolve new options.\n Ctor.superOptions = superOptions;\n // check if there are any late-modified/attached options (#4976)\n var modifiedOptions = resolveModifiedOptions(Ctor);\n // update base extend options\n if (modifiedOptions) {\n extend(Ctor.extendOptions, modifiedOptions);\n }\n options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);\n if (options.name) {\n options.components[options.name] = Ctor;\n }\n }\n }\n return options\n}\n\nfunction resolveModifiedOptions (Ctor) {\n var modified;\n var latest = Ctor.options;\n var extended = Ctor.extendOptions;\n var sealed = Ctor.sealedOptions;\n for (var key in latest) {\n if (latest[key] !== sealed[key]) {\n if (!modified) { modified = {}; }\n modified[key] = dedupe(latest[key], extended[key], sealed[key]);\n }\n }\n return modified\n}\n\nfunction dedupe (latest, extended, sealed) {\n // compare latest and sealed to ensure lifecycle hooks won't be duplicated\n // between merges\n if (Array.isArray(latest)) {\n var res = [];\n sealed = Array.isArray(sealed) ? sealed : [sealed];\n extended = Array.isArray(extended) ? extended : [extended];\n for (var i = 0; i < latest.length; i++) {\n // push original options and not sealed options to exclude duplicated options\n if (extended.indexOf(latest[i]) >= 0 || sealed.indexOf(latest[i]) < 0) {\n res.push(latest[i]);\n }\n }\n return res\n } else {\n return latest\n }\n}\n\nfunction Vue (options) {\n if (\"development\" !== 'production' &&\n !(this instanceof Vue)\n ) {\n warn('Vue is a constructor and should be called with the `new` keyword');\n }\n this._init(options);\n}\n\ninitMixin(Vue);\nstateMixin(Vue);\neventsMixin(Vue);\nlifecycleMixin(Vue);\nrenderMixin(Vue);\n\n/* */\n\nfunction initUse (Vue) {\n Vue.use = function (plugin) {\n var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));\n if (installedPlugins.indexOf(plugin) > -1) {\n return this\n }\n\n // additional parameters\n var args = toArray(arguments, 1);\n args.unshift(this);\n if (typeof plugin.install === 'function') {\n plugin.install.apply(plugin, args);\n } else if (typeof plugin === 'function') {\n plugin.apply(null, args);\n }\n installedPlugins.push(plugin);\n return this\n };\n}\n\n/* */\n\nfunction initMixin$1 (Vue) {\n Vue.mixin = function (mixin) {\n this.options = mergeOptions(this.options, mixin);\n return this\n };\n}\n\n/* */\n\nfunction initExtend (Vue) {\n /**\n * Each instance constructor, including Vue, has a unique\n * cid. This enables us to create wrapped \"child\n * constructors\" for prototypal inheritance and cache them.\n */\n Vue.cid = 0;\n var cid = 1;\n\n /**\n * Class inheritance\n */\n Vue.extend = function (extendOptions) {\n extendOptions = extendOptions || {};\n var Super = this;\n var SuperId = Super.cid;\n var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});\n if (cachedCtors[SuperId]) {\n return cachedCtors[SuperId]\n }\n\n var name = extendOptions.name || Super.options.name;\n if (\"development\" !== 'production' && name) {\n validateComponentName(name);\n }\n\n var Sub = function VueComponent (options) {\n this._init(options);\n };\n Sub.prototype = Object.create(Super.prototype);\n Sub.prototype.constructor = Sub;\n Sub.cid = cid++;\n Sub.options = mergeOptions(\n Super.options,\n extendOptions\n );\n Sub['super'] = Super;\n\n // For props and computed properties, we define the proxy getters on\n // the Vue instances at extension time, on the extended prototype. This\n // avoids Object.defineProperty calls for each instance created.\n if (Sub.options.props) {\n initProps$1(Sub);\n }\n if (Sub.options.computed) {\n initComputed$1(Sub);\n }\n\n // allow further extension/mixin/plugin usage\n Sub.extend = Super.extend;\n Sub.mixin = Super.mixin;\n Sub.use = Super.use;\n\n // create asset registers, so extended classes\n // can have their private assets too.\n ASSET_TYPES.forEach(function (type) {\n Sub[type] = Super[type];\n });\n // enable recursive self-lookup\n if (name) {\n Sub.options.components[name] = Sub;\n }\n\n // keep a reference to the super options at extension time.\n // later at instantiation we can check if Super's options have\n // been updated.\n Sub.superOptions = Super.options;\n Sub.extendOptions = extendOptions;\n Sub.sealedOptions = extend({}, Sub.options);\n\n // cache constructor\n cachedCtors[SuperId] = Sub;\n return Sub\n };\n}\n\nfunction initProps$1 (Comp) {\n var props = Comp.options.props;\n for (var key in props) {\n proxy(Comp.prototype, \"_props\", key);\n }\n}\n\nfunction initComputed$1 (Comp) {\n var computed = Comp.options.computed;\n for (var key in computed) {\n defineComputed(Comp.prototype, key, computed[key]);\n }\n}\n\n/* */\n\nfunction initAssetRegisters (Vue) {\n /**\n * Create asset registration methods.\n */\n ASSET_TYPES.forEach(function (type) {\n Vue[type] = function (\n id,\n definition\n ) {\n if (!definition) {\n return this.options[type + 's'][id]\n } else {\n /* istanbul ignore if */\n if (\"development\" !== 'production' && type === 'component') {\n validateComponentName(id);\n }\n if (type === 'component' && isPlainObject(definition)) {\n definition.name = definition.name || id;\n definition = this.options._base.extend(definition);\n }\n if (type === 'directive' && typeof definition === 'function') {\n definition = { bind: definition, update: definition };\n }\n this.options[type + 's'][id] = definition;\n return definition\n }\n };\n });\n}\n\n/* */\n\nfunction getComponentName (opts) {\n return opts && (opts.Ctor.options.name || opts.tag)\n}\n\nfunction matches (pattern, name) {\n if (Array.isArray(pattern)) {\n return pattern.indexOf(name) > -1\n } else if (typeof pattern === 'string') {\n return pattern.split(',').indexOf(name) > -1\n } else if (isRegExp(pattern)) {\n return pattern.test(name)\n }\n /* istanbul ignore next */\n return false\n}\n\nfunction pruneCache (keepAliveInstance, filter) {\n var cache = keepAliveInstance.cache;\n var keys = keepAliveInstance.keys;\n var _vnode = keepAliveInstance._vnode;\n for (var key in cache) {\n var cachedNode = cache[key];\n if (cachedNode) {\n var name = getComponentName(cachedNode.componentOptions);\n if (name && !filter(name)) {\n pruneCacheEntry(cache, key, keys, _vnode);\n }\n }\n }\n}\n\nfunction pruneCacheEntry (\n cache,\n key,\n keys,\n current\n) {\n var cached$$1 = cache[key];\n if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {\n cached$$1.componentInstance.$destroy();\n }\n cache[key] = null;\n remove(keys, key);\n}\n\nvar patternTypes = [String, RegExp, Array];\n\nvar KeepAlive = {\n name: 'keep-alive',\n abstract: true,\n\n props: {\n include: patternTypes,\n exclude: patternTypes,\n max: [String, Number]\n },\n\n created: function created () {\n this.cache = Object.create(null);\n this.keys = [];\n },\n\n destroyed: function destroyed () {\n var this$1 = this;\n\n for (var key in this$1.cache) {\n pruneCacheEntry(this$1.cache, key, this$1.keys);\n }\n },\n\n mounted: function mounted () {\n var this$1 = this;\n\n this.$watch('include', function (val) {\n pruneCache(this$1, function (name) { return matches(val, name); });\n });\n this.$watch('exclude', function (val) {\n pruneCache(this$1, function (name) { return !matches(val, name); });\n });\n },\n\n render: function render () {\n var slot = this.$slots.default;\n var vnode = getFirstComponentChild(slot);\n var componentOptions = vnode && vnode.componentOptions;\n if (componentOptions) {\n // check pattern\n var name = getComponentName(componentOptions);\n var ref = this;\n var include = ref.include;\n var exclude = ref.exclude;\n if (\n // not included\n (include && (!name || !matches(include, name))) ||\n // excluded\n (exclude && name && matches(exclude, name))\n ) {\n return vnode\n }\n\n var ref$1 = this;\n var cache = ref$1.cache;\n var keys = ref$1.keys;\n var key = vnode.key == null\n // same constructor may get registered as different local components\n // so cid alone is not enough (#3269)\n ? componentOptions.Ctor.cid + (componentOptions.tag ? (\"::\" + (componentOptions.tag)) : '')\n : vnode.key;\n if (cache[key]) {\n vnode.componentInstance = cache[key].componentInstance;\n // make current key freshest\n remove(keys, key);\n keys.push(key);\n } else {\n cache[key] = vnode;\n keys.push(key);\n // prune oldest entry\n if (this.max && keys.length > parseInt(this.max)) {\n pruneCacheEntry(cache, keys[0], keys, this._vnode);\n }\n }\n\n vnode.data.keepAlive = true;\n }\n return vnode || (slot && slot[0])\n }\n}\n\nvar builtInComponents = {\n KeepAlive: KeepAlive\n}\n\n/* */\n\nfunction initGlobalAPI (Vue) {\n // config\n var configDef = {};\n configDef.get = function () { return config; };\n if (true) {\n configDef.set = function () {\n warn(\n 'Do not replace the Vue.config object, set individual fields instead.'\n );\n };\n }\n Object.defineProperty(Vue, 'config', configDef);\n\n // exposed util methods.\n // NOTE: these are not considered part of the public API - avoid relying on\n // them unless you are aware of the risk.\n Vue.util = {\n warn: warn,\n extend: extend,\n mergeOptions: mergeOptions,\n defineReactive: defineReactive\n };\n\n Vue.set = set;\n Vue.delete = del;\n Vue.nextTick = nextTick;\n\n Vue.options = Object.create(null);\n ASSET_TYPES.forEach(function (type) {\n Vue.options[type + 's'] = Object.create(null);\n });\n\n // this is used to identify the \"base\" constructor to extend all plain-object\n // components with in Weex's multi-instance scenarios.\n Vue.options._base = Vue;\n\n extend(Vue.options.components, builtInComponents);\n\n initUse(Vue);\n initMixin$1(Vue);\n initExtend(Vue);\n initAssetRegisters(Vue);\n}\n\ninitGlobalAPI(Vue);\n\nObject.defineProperty(Vue.prototype, '$isServer', {\n get: isServerRendering\n});\n\nObject.defineProperty(Vue.prototype, '$ssrContext', {\n get: function get () {\n /* istanbul ignore next */\n return this.$vnode && this.$vnode.ssrContext\n }\n});\n\n// expose FunctionalRenderContext for ssr runtime helper installation\nObject.defineProperty(Vue, 'FunctionalRenderContext', {\n value: FunctionalRenderContext\n});\n\nVue.version = '2.5.16';\n\n/* */\n\n// these are reserved for web because they are directly compiled away\n// during template compilation\nvar isReservedAttr = makeMap('style,class');\n\n// attributes that should be using props for binding\nvar acceptValue = makeMap('input,textarea,option,select,progress');\nvar mustUseProp = function (tag, type, attr) {\n return (\n (attr === 'value' && acceptValue(tag)) && type !== 'button' ||\n (attr === 'selected' && tag === 'option') ||\n (attr === 'checked' && tag === 'input') ||\n (attr === 'muted' && tag === 'video')\n )\n};\n\nvar isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck');\n\nvar isBooleanAttr = makeMap(\n 'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' +\n 'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' +\n 'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' +\n 'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' +\n 'required,reversed,scoped,seamless,selected,sortable,translate,' +\n 'truespeed,typemustmatch,visible'\n);\n\nvar xlinkNS = 'http://www.w3.org/1999/xlink';\n\nvar isXlink = function (name) {\n return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'\n};\n\nvar getXlinkProp = function (name) {\n return isXlink(name) ? name.slice(6, name.length) : ''\n};\n\nvar isFalsyAttrValue = function (val) {\n return val == null || val === false\n};\n\n/* */\n\nfunction genClassForVnode (vnode) {\n var data = vnode.data;\n var parentNode = vnode;\n var childNode = vnode;\n while (isDef(childNode.componentInstance)) {\n childNode = childNode.componentInstance._vnode;\n if (childNode && childNode.data) {\n data = mergeClassData(childNode.data, data);\n }\n }\n while (isDef(parentNode = parentNode.parent)) {\n if (parentNode && parentNode.data) {\n data = mergeClassData(data, parentNode.data);\n }\n }\n return renderClass(data.staticClass, data.class)\n}\n\nfunction mergeClassData (child, parent) {\n return {\n staticClass: concat(child.staticClass, parent.staticClass),\n class: isDef(child.class)\n ? [child.class, parent.class]\n : parent.class\n }\n}\n\nfunction renderClass (\n staticClass,\n dynamicClass\n) {\n if (isDef(staticClass) || isDef(dynamicClass)) {\n return concat(staticClass, stringifyClass(dynamicClass))\n }\n /* istanbul ignore next */\n return ''\n}\n\nfunction concat (a, b) {\n return a ? b ? (a + ' ' + b) : a : (b || '')\n}\n\nfunction stringifyClass (value) {\n if (Array.isArray(value)) {\n return stringifyArray(value)\n }\n if (isObject(value)) {\n return stringifyObject(value)\n }\n if (typeof value === 'string') {\n return value\n }\n /* istanbul ignore next */\n return ''\n}\n\nfunction stringifyArray (value) {\n var res = '';\n var stringified;\n for (var i = 0, l = value.length; i < l; i++) {\n if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {\n if (res) { res += ' '; }\n res += stringified;\n }\n }\n return res\n}\n\nfunction stringifyObject (value) {\n var res = '';\n for (var key in value) {\n if (value[key]) {\n if (res) { res += ' '; }\n res += key;\n }\n }\n return res\n}\n\n/* */\n\nvar namespaceMap = {\n svg: 'http://www.w3.org/2000/svg',\n math: 'http://www.w3.org/1998/Math/MathML'\n};\n\nvar isHTMLTag = makeMap(\n 'html,body,base,head,link,meta,style,title,' +\n 'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +\n 'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' +\n 'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +\n 's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +\n 'embed,object,param,source,canvas,script,noscript,del,ins,' +\n 'caption,col,colgroup,table,thead,tbody,td,th,tr,' +\n 'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +\n 'output,progress,select,textarea,' +\n 'details,dialog,menu,menuitem,summary,' +\n 'content,element,shadow,template,blockquote,iframe,tfoot'\n);\n\n// this map is intentionally selective, only covering SVG elements that may\n// contain child elements.\nvar isSVG = makeMap(\n 'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +\n 'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +\n 'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',\n true\n);\n\nvar isPreTag = function (tag) { return tag === 'pre'; };\n\nvar isReservedTag = function (tag) {\n return isHTMLTag(tag) || isSVG(tag)\n};\n\nfunction getTagNamespace (tag) {\n if (isSVG(tag)) {\n return 'svg'\n }\n // basic support for MathML\n // note it doesn't support other MathML elements being component roots\n if (tag === 'math') {\n return 'math'\n }\n}\n\nvar unknownElementCache = Object.create(null);\nfunction isUnknownElement (tag) {\n /* istanbul ignore if */\n if (!inBrowser) {\n return true\n }\n if (isReservedTag(tag)) {\n return false\n }\n tag = tag.toLowerCase();\n /* istanbul ignore if */\n if (unknownElementCache[tag] != null) {\n return unknownElementCache[tag]\n }\n var el = document.createElement(tag);\n if (tag.indexOf('-') > -1) {\n // http://stackoverflow.com/a/28210364/1070244\n return (unknownElementCache[tag] = (\n el.constructor === window.HTMLUnknownElement ||\n el.constructor === window.HTMLElement\n ))\n } else {\n return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString()))\n }\n}\n\nvar isTextInputType = makeMap('text,number,password,search,email,tel,url');\n\n/* */\n\n/**\n * Query an element selector if it's not an element already.\n */\nfunction query (el) {\n if (typeof el === 'string') {\n var selected = document.querySelector(el);\n if (!selected) {\n \"development\" !== 'production' && warn(\n 'Cannot find element: ' + el\n );\n return document.createElement('div')\n }\n return selected\n } else {\n return el\n }\n}\n\n/* */\n\nfunction createElement$1 (tagName, vnode) {\n var elm = document.createElement(tagName);\n if (tagName !== 'select') {\n return elm\n }\n // false or null will remove the attribute but undefined will not\n if (vnode.data && vnode.data.attrs && vnode.data.attrs.multiple !== undefined) {\n elm.setAttribute('multiple', 'multiple');\n }\n return elm\n}\n\nfunction createElementNS (namespace, tagName) {\n return document.createElementNS(namespaceMap[namespace], tagName)\n}\n\nfunction createTextNode (text) {\n return document.createTextNode(text)\n}\n\nfunction createComment (text) {\n return document.createComment(text)\n}\n\nfunction insertBefore (parentNode, newNode, referenceNode) {\n parentNode.insertBefore(newNode, referenceNode);\n}\n\nfunction removeChild (node, child) {\n node.removeChild(child);\n}\n\nfunction appendChild (node, child) {\n node.appendChild(child);\n}\n\nfunction parentNode (node) {\n return node.parentNode\n}\n\nfunction nextSibling (node) {\n return node.nextSibling\n}\n\nfunction tagName (node) {\n return node.tagName\n}\n\nfunction setTextContent (node, text) {\n node.textContent = text;\n}\n\nfunction setStyleScope (node, scopeId) {\n node.setAttribute(scopeId, '');\n}\n\n\nvar nodeOps = Object.freeze({\n\tcreateElement: createElement$1,\n\tcreateElementNS: createElementNS,\n\tcreateTextNode: createTextNode,\n\tcreateComment: createComment,\n\tinsertBefore: insertBefore,\n\tremoveChild: removeChild,\n\tappendChild: appendChild,\n\tparentNode: parentNode,\n\tnextSibling: nextSibling,\n\ttagName: tagName,\n\tsetTextContent: setTextContent,\n\tsetStyleScope: setStyleScope\n});\n\n/* */\n\nvar ref = {\n create: function create (_, vnode) {\n registerRef(vnode);\n },\n update: function update (oldVnode, vnode) {\n if (oldVnode.data.ref !== vnode.data.ref) {\n registerRef(oldVnode, true);\n registerRef(vnode);\n }\n },\n destroy: function destroy (vnode) {\n registerRef(vnode, true);\n }\n}\n\nfunction registerRef (vnode, isRemoval) {\n var key = vnode.data.ref;\n if (!isDef(key)) { return }\n\n var vm = vnode.context;\n var ref = vnode.componentInstance || vnode.elm;\n var refs = vm.$refs;\n if (isRemoval) {\n if (Array.isArray(refs[key])) {\n remove(refs[key], ref);\n } else if (refs[key] === ref) {\n refs[key] = undefined;\n }\n } else {\n if (vnode.data.refInFor) {\n if (!Array.isArray(refs[key])) {\n refs[key] = [ref];\n } else if (refs[key].indexOf(ref) < 0) {\n // $flow-disable-line\n refs[key].push(ref);\n }\n } else {\n refs[key] = ref;\n }\n }\n}\n\n/**\n * Virtual DOM patching algorithm based on Snabbdom by\n * Simon Friis Vindum (@paldepind)\n * Licensed under the MIT License\n * https://github.com/paldepind/snabbdom/blob/master/LICENSE\n *\n * modified by Evan You (@yyx990803)\n *\n * Not type-checking this because this file is perf-critical and the cost\n * of making flow understand it is not worth it.\n */\n\nvar emptyNode = new VNode('', {}, []);\n\nvar hooks = ['create', 'activate', 'update', 'remove', 'destroy'];\n\nfunction sameVnode (a, b) {\n return (\n a.key === b.key && (\n (\n a.tag === b.tag &&\n a.isComment === b.isComment &&\n isDef(a.data) === isDef(b.data) &&\n sameInputType(a, b)\n ) || (\n isTrue(a.isAsyncPlaceholder) &&\n a.asyncFactory === b.asyncFactory &&\n isUndef(b.asyncFactory.error)\n )\n )\n )\n}\n\nfunction sameInputType (a, b) {\n if (a.tag !== 'input') { return true }\n var i;\n var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;\n var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type;\n return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)\n}\n\nfunction createKeyToOldIdx (children, beginIdx, endIdx) {\n var i, key;\n var map = {};\n for (i = beginIdx; i <= endIdx; ++i) {\n key = children[i].key;\n if (isDef(key)) { map[key] = i; }\n }\n return map\n}\n\nfunction createPatchFunction (backend) {\n var i, j;\n var cbs = {};\n\n var modules = backend.modules;\n var nodeOps = backend.nodeOps;\n\n for (i = 0; i < hooks.length; ++i) {\n cbs[hooks[i]] = [];\n for (j = 0; j < modules.length; ++j) {\n if (isDef(modules[j][hooks[i]])) {\n cbs[hooks[i]].push(modules[j][hooks[i]]);\n }\n }\n }\n\n function emptyNodeAt (elm) {\n return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)\n }\n\n function createRmCb (childElm, listeners) {\n function remove () {\n if (--remove.listeners === 0) {\n removeNode(childElm);\n }\n }\n remove.listeners = listeners;\n return remove\n }\n\n function removeNode (el) {\n var parent = nodeOps.parentNode(el);\n // element may have already been removed due to v-html / v-text\n if (isDef(parent)) {\n nodeOps.removeChild(parent, el);\n }\n }\n\n function isUnknownElement$$1 (vnode, inVPre) {\n return (\n !inVPre &&\n !vnode.ns &&\n !(\n config.ignoredElements.length &&\n config.ignoredElements.some(function (ignore) {\n return isRegExp(ignore)\n ? ignore.test(vnode.tag)\n : ignore === vnode.tag\n })\n ) &&\n config.isUnknownElement(vnode.tag)\n )\n }\n\n var creatingElmInVPre = 0;\n\n function createElm (\n vnode,\n insertedVnodeQueue,\n parentElm,\n refElm,\n nested,\n ownerArray,\n index\n ) {\n if (isDef(vnode.elm) && isDef(ownerArray)) {\n // This vnode was used in a previous render!\n // now it's used as a new node, overwriting its elm would cause\n // potential patch errors down the road when it's used as an insertion\n // reference node. Instead, we clone the node on-demand before creating\n // associated DOM element for it.\n vnode = ownerArray[index] = cloneVNode(vnode);\n }\n\n vnode.isRootInsert = !nested; // for transition enter check\n if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {\n return\n }\n\n var data = vnode.data;\n var children = vnode.children;\n var tag = vnode.tag;\n if (isDef(tag)) {\n if (true) {\n if (data && data.pre) {\n creatingElmInVPre++;\n }\n if (isUnknownElement$$1(vnode, creatingElmInVPre)) {\n warn(\n 'Unknown custom element: <' + tag + '> - did you ' +\n 'register the component correctly? For recursive components, ' +\n 'make sure to provide the \"name\" option.',\n vnode.context\n );\n }\n }\n\n vnode.elm = vnode.ns\n ? nodeOps.createElementNS(vnode.ns, tag)\n : nodeOps.createElement(tag, vnode);\n setScope(vnode);\n\n /* istanbul ignore if */\n {\n createChildren(vnode, children, insertedVnodeQueue);\n if (isDef(data)) {\n invokeCreateHooks(vnode, insertedVnodeQueue);\n }\n insert(parentElm, vnode.elm, refElm);\n }\n\n if (\"development\" !== 'production' && data && data.pre) {\n creatingElmInVPre--;\n }\n } else if (isTrue(vnode.isComment)) {\n vnode.elm = nodeOps.createComment(vnode.text);\n insert(parentElm, vnode.elm, refElm);\n } else {\n vnode.elm = nodeOps.createTextNode(vnode.text);\n insert(parentElm, vnode.elm, refElm);\n }\n }\n\n function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\n var i = vnode.data;\n if (isDef(i)) {\n var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;\n if (isDef(i = i.hook) && isDef(i = i.init)) {\n i(vnode, false /* hydrating */, parentElm, refElm);\n }\n // after calling the init hook, if the vnode is a child component\n // it should've created a child instance and mounted it. the child\n // component also has set the placeholder vnode's elm.\n // in that case we can just return the element and be done.\n if (isDef(vnode.componentInstance)) {\n initComponent(vnode, insertedVnodeQueue);\n if (isTrue(isReactivated)) {\n reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);\n }\n return true\n }\n }\n }\n\n function initComponent (vnode, insertedVnodeQueue) {\n if (isDef(vnode.data.pendingInsert)) {\n insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);\n vnode.data.pendingInsert = null;\n }\n vnode.elm = vnode.componentInstance.$el;\n if (isPatchable(vnode)) {\n invokeCreateHooks(vnode, insertedVnodeQueue);\n setScope(vnode);\n } else {\n // empty component root.\n // skip all element-related modules except for ref (#3455)\n registerRef(vnode);\n // make sure to invoke the insert hook\n insertedVnodeQueue.push(vnode);\n }\n }\n\n function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\n var i;\n // hack for #4339: a reactivated component with inner transition\n // does not trigger because the inner node's created hooks are not called\n // again. It's not ideal to involve module-specific logic in here but\n // there doesn't seem to be a better way to do it.\n var innerNode = vnode;\n while (innerNode.componentInstance) {\n innerNode = innerNode.componentInstance._vnode;\n if (isDef(i = innerNode.data) && isDef(i = i.transition)) {\n for (i = 0; i < cbs.activate.length; ++i) {\n cbs.activate[i](emptyNode, innerNode);\n }\n insertedVnodeQueue.push(innerNode);\n break\n }\n }\n // unlike a newly created component,\n // a reactivated keep-alive component doesn't insert itself\n insert(parentElm, vnode.elm, refElm);\n }\n\n function insert (parent, elm, ref$$1) {\n if (isDef(parent)) {\n if (isDef(ref$$1)) {\n if (ref$$1.parentNode === parent) {\n nodeOps.insertBefore(parent, elm, ref$$1);\n }\n } else {\n nodeOps.appendChild(parent, elm);\n }\n }\n }\n\n function createChildren (vnode, children, insertedVnodeQueue) {\n if (Array.isArray(children)) {\n if (true) {\n checkDuplicateKeys(children);\n }\n for (var i = 0; i < children.length; ++i) {\n createElm(children[i], insertedVnodeQueue, vnode.elm, null, true, children, i);\n }\n } else if (isPrimitive(vnode.text)) {\n nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text)));\n }\n }\n\n function isPatchable (vnode) {\n while (vnode.componentInstance) {\n vnode = vnode.componentInstance._vnode;\n }\n return isDef(vnode.tag)\n }\n\n function invokeCreateHooks (vnode, insertedVnodeQueue) {\n for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n cbs.create[i$1](emptyNode, vnode);\n }\n i = vnode.data.hook; // Reuse variable\n if (isDef(i)) {\n if (isDef(i.create)) { i.create(emptyNode, vnode); }\n if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); }\n }\n }\n\n // set scope id attribute for scoped CSS.\n // this is implemented as a special case to avoid the overhead\n // of going through the normal attribute patching process.\n function setScope (vnode) {\n var i;\n if (isDef(i = vnode.fnScopeId)) {\n nodeOps.setStyleScope(vnode.elm, i);\n } else {\n var ancestor = vnode;\n while (ancestor) {\n if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {\n nodeOps.setStyleScope(vnode.elm, i);\n }\n ancestor = ancestor.parent;\n }\n }\n // for slot content they should also get the scopeId from the host instance.\n if (isDef(i = activeInstance) &&\n i !== vnode.context &&\n i !== vnode.fnContext &&\n isDef(i = i.$options._scopeId)\n ) {\n nodeOps.setStyleScope(vnode.elm, i);\n }\n }\n\n function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {\n for (; startIdx <= endIdx; ++startIdx) {\n createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm, false, vnodes, startIdx);\n }\n }\n\n function invokeDestroyHook (vnode) {\n var i, j;\n var data = vnode.data;\n if (isDef(data)) {\n if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }\n for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }\n }\n if (isDef(i = vnode.children)) {\n for (j = 0; j < vnode.children.length; ++j) {\n invokeDestroyHook(vnode.children[j]);\n }\n }\n }\n\n function removeVnodes (parentElm, vnodes, startIdx, endIdx) {\n for (; startIdx <= endIdx; ++startIdx) {\n var ch = vnodes[startIdx];\n if (isDef(ch)) {\n if (isDef(ch.tag)) {\n removeAndInvokeRemoveHook(ch);\n invokeDestroyHook(ch);\n } else { // Text node\n removeNode(ch.elm);\n }\n }\n }\n }\n\n function removeAndInvokeRemoveHook (vnode, rm) {\n if (isDef(rm) || isDef(vnode.data)) {\n var i;\n var listeners = cbs.remove.length + 1;\n if (isDef(rm)) {\n // we have a recursively passed down rm callback\n // increase the listeners count\n rm.listeners += listeners;\n } else {\n // directly removing\n rm = createRmCb(vnode.elm, listeners);\n }\n // recursively invoke hooks on child component root node\n if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {\n removeAndInvokeRemoveHook(i, rm);\n }\n for (i = 0; i < cbs.remove.length; ++i) {\n cbs.remove[i](vnode, rm);\n }\n if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {\n i(vnode, rm);\n } else {\n rm();\n }\n } else {\n removeNode(vnode.elm);\n }\n }\n\n function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {\n var oldStartIdx = 0;\n var newStartIdx = 0;\n var oldEndIdx = oldCh.length - 1;\n var oldStartVnode = oldCh[0];\n var oldEndVnode = oldCh[oldEndIdx];\n var newEndIdx = newCh.length - 1;\n var newStartVnode = newCh[0];\n var newEndVnode = newCh[newEndIdx];\n var oldKeyToIdx, idxInOld, vnodeToMove, refElm;\n\n // removeOnly is a special flag used only by <transition-group>\n // to ensure removed elements stay in correct relative positions\n // during leaving transitions\n var canMove = !removeOnly;\n\n if (true) {\n checkDuplicateKeys(newCh);\n }\n\n while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n if (isUndef(oldStartVnode)) {\n oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left\n } else if (isUndef(oldEndVnode)) {\n oldEndVnode = oldCh[--oldEndIdx];\n } else if (sameVnode(oldStartVnode, newStartVnode)) {\n patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);\n oldStartVnode = oldCh[++oldStartIdx];\n newStartVnode = newCh[++newStartIdx];\n } else if (sameVnode(oldEndVnode, newEndVnode)) {\n patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);\n oldEndVnode = oldCh[--oldEndIdx];\n newEndVnode = newCh[--newEndIdx];\n } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right\n patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);\n canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));\n oldStartVnode = oldCh[++oldStartIdx];\n newEndVnode = newCh[--newEndIdx];\n } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left\n patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);\n canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);\n oldEndVnode = oldCh[--oldEndIdx];\n newStartVnode = newCh[++newStartIdx];\n } else {\n if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }\n idxInOld = isDef(newStartVnode.key)\n ? oldKeyToIdx[newStartVnode.key]\n : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx);\n if (isUndef(idxInOld)) { // New element\n createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);\n } else {\n vnodeToMove = oldCh[idxInOld];\n if (sameVnode(vnodeToMove, newStartVnode)) {\n patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue);\n oldCh[idxInOld] = undefined;\n canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm);\n } else {\n // same key but different element. treat as new element\n createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);\n }\n }\n newStartVnode = newCh[++newStartIdx];\n }\n }\n if (oldStartIdx > oldEndIdx) {\n refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;\n addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);\n } else if (newStartIdx > newEndIdx) {\n removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);\n }\n }\n\n function checkDuplicateKeys (children) {\n var seenKeys = {};\n for (var i = 0; i < children.length; i++) {\n var vnode = children[i];\n var key = vnode.key;\n if (isDef(key)) {\n if (seenKeys[key]) {\n warn(\n (\"Duplicate keys detected: '\" + key + \"'. This may cause an update error.\"),\n vnode.context\n );\n } else {\n seenKeys[key] = true;\n }\n }\n }\n }\n\n function findIdxInOld (node, oldCh, start, end) {\n for (var i = start; i < end; i++) {\n var c = oldCh[i];\n if (isDef(c) && sameVnode(node, c)) { return i }\n }\n }\n\n function patchVnode (oldVnode, vnode, insertedVnodeQueue, removeOnly) {\n if (oldVnode === vnode) {\n return\n }\n\n var elm = vnode.elm = oldVnode.elm;\n\n if (isTrue(oldVnode.isAsyncPlaceholder)) {\n if (isDef(vnode.asyncFactory.resolved)) {\n hydrate(oldVnode.elm, vnode, insertedVnodeQueue);\n } else {\n vnode.isAsyncPlaceholder = true;\n }\n return\n }\n\n // reuse element for static trees.\n // note we only do this if the vnode is cloned -\n // if the new node is not cloned it means the render functions have been\n // reset by the hot-reload-api and we need to do a proper re-render.\n if (isTrue(vnode.isStatic) &&\n isTrue(oldVnode.isStatic) &&\n vnode.key === oldVnode.key &&\n (isTrue(vnode.isCloned) || isTrue(vnode.isOnce))\n ) {\n vnode.componentInstance = oldVnode.componentInstance;\n return\n }\n\n var i;\n var data = vnode.data;\n if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {\n i(oldVnode, vnode);\n }\n\n var oldCh = oldVnode.children;\n var ch = vnode.children;\n if (isDef(data) && isPatchable(vnode)) {\n for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }\n if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }\n }\n if (isUndef(vnode.text)) {\n if (isDef(oldCh) && isDef(ch)) {\n if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }\n } else if (isDef(ch)) {\n if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }\n addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);\n } else if (isDef(oldCh)) {\n removeVnodes(elm, oldCh, 0, oldCh.length - 1);\n } else if (isDef(oldVnode.text)) {\n nodeOps.setTextContent(elm, '');\n }\n } else if (oldVnode.text !== vnode.text) {\n nodeOps.setTextContent(elm, vnode.text);\n }\n if (isDef(data)) {\n if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }\n }\n }\n\n function invokeInsertHook (vnode, queue, initial) {\n // delay insert hooks for component root nodes, invoke them after the\n // element is really inserted\n if (isTrue(initial) && isDef(vnode.parent)) {\n vnode.parent.data.pendingInsert = queue;\n } else {\n for (var i = 0; i < queue.length; ++i) {\n queue[i].data.hook.insert(queue[i]);\n }\n }\n }\n\n var hydrationBailed = false;\n // list of modules that can skip create hook during hydration because they\n // are already rendered on the client or has no need for initialization\n // Note: style is excluded because it relies on initial clone for future\n // deep updates (#7063).\n var isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key');\n\n // Note: this is a browser-only function so we can assume elms are DOM nodes.\n function hydrate (elm, vnode, insertedVnodeQueue, inVPre) {\n var i;\n var tag = vnode.tag;\n var data = vnode.data;\n var children = vnode.children;\n inVPre = inVPre || (data && data.pre);\n vnode.elm = elm;\n\n if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {\n vnode.isAsyncPlaceholder = true;\n return true\n }\n // assert node match\n if (true) {\n if (!assertNodeMatch(elm, vnode, inVPre)) {\n return false\n }\n }\n if (isDef(data)) {\n if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }\n if (isDef(i = vnode.componentInstance)) {\n // child component. it should have hydrated its own tree.\n initComponent(vnode, insertedVnodeQueue);\n return true\n }\n }\n if (isDef(tag)) {\n if (isDef(children)) {\n // empty element, allow client to pick up and populate children\n if (!elm.hasChildNodes()) {\n createChildren(vnode, children, insertedVnodeQueue);\n } else {\n // v-html and domProps: innerHTML\n if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) {\n if (i !== elm.innerHTML) {\n /* istanbul ignore if */\n if (\"development\" !== 'production' &&\n typeof console !== 'undefined' &&\n !hydrationBailed\n ) {\n hydrationBailed = true;\n console.warn('Parent: ', elm);\n console.warn('server innerHTML: ', i);\n console.warn('client innerHTML: ', elm.innerHTML);\n }\n return false\n }\n } else {\n // iterate and compare children lists\n var childrenMatch = true;\n var childNode = elm.firstChild;\n for (var i$1 = 0; i$1 < children.length; i$1++) {\n if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) {\n childrenMatch = false;\n break\n }\n childNode = childNode.nextSibling;\n }\n // if childNode is not null, it means the actual childNodes list is\n // longer than the virtual children list.\n if (!childrenMatch || childNode) {\n /* istanbul ignore if */\n if (\"development\" !== 'production' &&\n typeof console !== 'undefined' &&\n !hydrationBailed\n ) {\n hydrationBailed = true;\n console.warn('Parent: ', elm);\n console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);\n }\n return false\n }\n }\n }\n }\n if (isDef(data)) {\n var fullInvoke = false;\n for (var key in data) {\n if (!isRenderedModule(key)) {\n fullInvoke = true;\n invokeCreateHooks(vnode, insertedVnodeQueue);\n break\n }\n }\n if (!fullInvoke && data['class']) {\n // ensure collecting deps for deep class bindings for future updates\n traverse(data['class']);\n }\n }\n } else if (elm.data !== vnode.text) {\n elm.data = vnode.text;\n }\n return true\n }\n\n function assertNodeMatch (node, vnode, inVPre) {\n if (isDef(vnode.tag)) {\n return vnode.tag.indexOf('vue-component') === 0 || (\n !isUnknownElement$$1(vnode, inVPre) &&\n vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())\n )\n } else {\n return node.nodeType === (vnode.isComment ? 8 : 3)\n }\n }\n\n return function patch (oldVnode, vnode, hydrating, removeOnly, parentElm, refElm) {\n if (isUndef(vnode)) {\n if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); }\n return\n }\n\n var isInitialPatch = false;\n var insertedVnodeQueue = [];\n\n if (isUndef(oldVnode)) {\n // empty mount (likely as component), create new root element\n isInitialPatch = true;\n createElm(vnode, insertedVnodeQueue, parentElm, refElm);\n } else {\n var isRealElement = isDef(oldVnode.nodeType);\n if (!isRealElement && sameVnode(oldVnode, vnode)) {\n // patch existing root node\n patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly);\n } else {\n if (isRealElement) {\n // mounting to a real element\n // check if this is server-rendered content and if we can perform\n // a successful hydration.\n if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {\n oldVnode.removeAttribute(SSR_ATTR);\n hydrating = true;\n }\n if (isTrue(hydrating)) {\n if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {\n invokeInsertHook(vnode, insertedVnodeQueue, true);\n return oldVnode\n } else if (true) {\n warn(\n 'The client-side rendered virtual DOM tree is not matching ' +\n 'server-rendered content. This is likely caused by incorrect ' +\n 'HTML markup, for example nesting block-level elements inside ' +\n '<p>, or missing <tbody>. Bailing hydration and performing ' +\n 'full client-side render.'\n );\n }\n }\n // either not server-rendered, or hydration failed.\n // create an empty node and replace it\n oldVnode = emptyNodeAt(oldVnode);\n }\n\n // replacing existing element\n var oldElm = oldVnode.elm;\n var parentElm$1 = nodeOps.parentNode(oldElm);\n\n // create new node\n createElm(\n vnode,\n insertedVnodeQueue,\n // extremely rare edge case: do not insert if old element is in a\n // leaving transition. Only happens when combining transition +\n // keep-alive + HOCs. (#4590)\n oldElm._leaveCb ? null : parentElm$1,\n nodeOps.nextSibling(oldElm)\n );\n\n // update parent placeholder node element, recursively\n if (isDef(vnode.parent)) {\n var ancestor = vnode.parent;\n var patchable = isPatchable(vnode);\n while (ancestor) {\n for (var i = 0; i < cbs.destroy.length; ++i) {\n cbs.destroy[i](ancestor);\n }\n ancestor.elm = vnode.elm;\n if (patchable) {\n for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n cbs.create[i$1](emptyNode, ancestor);\n }\n // #6513\n // invoke insert hooks that may have been merged by create hooks.\n // e.g. for directives that uses the \"inserted\" hook.\n var insert = ancestor.data.hook.insert;\n if (insert.merged) {\n // start at index 1 to avoid re-invoking component mounted hook\n for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {\n insert.fns[i$2]();\n }\n }\n } else {\n registerRef(ancestor);\n }\n ancestor = ancestor.parent;\n }\n }\n\n // destroy old node\n if (isDef(parentElm$1)) {\n removeVnodes(parentElm$1, [oldVnode], 0, 0);\n } else if (isDef(oldVnode.tag)) {\n invokeDestroyHook(oldVnode);\n }\n }\n }\n\n invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);\n return vnode.elm\n }\n}\n\n/* */\n\nvar directives = {\n create: updateDirectives,\n update: updateDirectives,\n destroy: function unbindDirectives (vnode) {\n updateDirectives(vnode, emptyNode);\n }\n}\n\nfunction updateDirectives (oldVnode, vnode) {\n if (oldVnode.data.directives || vnode.data.directives) {\n _update(oldVnode, vnode);\n }\n}\n\nfunction _update (oldVnode, vnode) {\n var isCreate = oldVnode === emptyNode;\n var isDestroy = vnode === emptyNode;\n var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);\n var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);\n\n var dirsWithInsert = [];\n var dirsWithPostpatch = [];\n\n var key, oldDir, dir;\n for (key in newDirs) {\n oldDir = oldDirs[key];\n dir = newDirs[key];\n if (!oldDir) {\n // new directive, bind\n callHook$1(dir, 'bind', vnode, oldVnode);\n if (dir.def && dir.def.inserted) {\n dirsWithInsert.push(dir);\n }\n } else {\n // existing directive, update\n dir.oldValue = oldDir.value;\n callHook$1(dir, 'update', vnode, oldVnode);\n if (dir.def && dir.def.componentUpdated) {\n dirsWithPostpatch.push(dir);\n }\n }\n }\n\n if (dirsWithInsert.length) {\n var callInsert = function () {\n for (var i = 0; i < dirsWithInsert.length; i++) {\n callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);\n }\n };\n if (isCreate) {\n mergeVNodeHook(vnode, 'insert', callInsert);\n } else {\n callInsert();\n }\n }\n\n if (dirsWithPostpatch.length) {\n mergeVNodeHook(vnode, 'postpatch', function () {\n for (var i = 0; i < dirsWithPostpatch.length; i++) {\n callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);\n }\n });\n }\n\n if (!isCreate) {\n for (key in oldDirs) {\n if (!newDirs[key]) {\n // no longer present, unbind\n callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);\n }\n }\n }\n}\n\nvar emptyModifiers = Object.create(null);\n\nfunction normalizeDirectives$1 (\n dirs,\n vm\n) {\n var res = Object.create(null);\n if (!dirs) {\n // $flow-disable-line\n return res\n }\n var i, dir;\n for (i = 0; i < dirs.length; i++) {\n dir = dirs[i];\n if (!dir.modifiers) {\n // $flow-disable-line\n dir.modifiers = emptyModifiers;\n }\n res[getRawDirName(dir)] = dir;\n dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);\n }\n // $flow-disable-line\n return res\n}\n\nfunction getRawDirName (dir) {\n return dir.rawName || ((dir.name) + \".\" + (Object.keys(dir.modifiers || {}).join('.')))\n}\n\nfunction callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {\n var fn = dir.def && dir.def[hook];\n if (fn) {\n try {\n fn(vnode.elm, dir, vnode, oldVnode, isDestroy);\n } catch (e) {\n handleError(e, vnode.context, (\"directive \" + (dir.name) + \" \" + hook + \" hook\"));\n }\n }\n}\n\nvar baseModules = [\n ref,\n directives\n]\n\n/* */\n\nfunction updateAttrs (oldVnode, vnode) {\n var opts = vnode.componentOptions;\n if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {\n return\n }\n if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {\n return\n }\n var key, cur, old;\n var elm = vnode.elm;\n var oldAttrs = oldVnode.data.attrs || {};\n var attrs = vnode.data.attrs || {};\n // clone observed objects, as the user probably wants to mutate it\n if (isDef(attrs.__ob__)) {\n attrs = vnode.data.attrs = extend({}, attrs);\n }\n\n for (key in attrs) {\n cur = attrs[key];\n old = oldAttrs[key];\n if (old !== cur) {\n setAttr(elm, key, cur);\n }\n }\n // #4391: in IE9, setting type can reset value for input[type=radio]\n // #6666: IE/Edge forces progress value down to 1 before setting a max\n /* istanbul ignore if */\n if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {\n setAttr(elm, 'value', attrs.value);\n }\n for (key in oldAttrs) {\n if (isUndef(attrs[key])) {\n if (isXlink(key)) {\n elm.removeAttributeNS(xlinkNS, getXlinkProp(key));\n } else if (!isEnumeratedAttr(key)) {\n elm.removeAttribute(key);\n }\n }\n }\n}\n\nfunction setAttr (el, key, value) {\n if (el.tagName.indexOf('-') > -1) {\n baseSetAttr(el, key, value);\n } else if (isBooleanAttr(key)) {\n // set attribute for blank value\n // e.g. <option disabled>Select one</option>\n if (isFalsyAttrValue(value)) {\n el.removeAttribute(key);\n } else {\n // technically allowfullscreen is a boolean attribute for <iframe>,\n // but Flash expects a value of \"true\" when used on <embed> tag\n value = key === 'allowfullscreen' && el.tagName === 'EMBED'\n ? 'true'\n : key;\n el.setAttribute(key, value);\n }\n } else if (isEnumeratedAttr(key)) {\n el.setAttribute(key, isFalsyAttrValue(value) || value === 'false' ? 'false' : 'true');\n } else if (isXlink(key)) {\n if (isFalsyAttrValue(value)) {\n el.removeAttributeNS(xlinkNS, getXlinkProp(key));\n } else {\n el.setAttributeNS(xlinkNS, key, value);\n }\n } else {\n baseSetAttr(el, key, value);\n }\n}\n\nfunction baseSetAttr (el, key, value) {\n if (isFalsyAttrValue(value)) {\n el.removeAttribute(key);\n } else {\n // #7138: IE10 & 11 fires input event when setting placeholder on\n // <textarea>... block the first input event and remove the blocker\n // immediately.\n /* istanbul ignore if */\n if (\n isIE && !isIE9 &&\n el.tagName === 'TEXTAREA' &&\n key === 'placeholder' && !el.__ieph\n ) {\n var blocker = function (e) {\n e.stopImmediatePropagation();\n el.removeEventListener('input', blocker);\n };\n el.addEventListener('input', blocker);\n // $flow-disable-line\n el.__ieph = true; /* IE placeholder patched */\n }\n el.setAttribute(key, value);\n }\n}\n\nvar attrs = {\n create: updateAttrs,\n update: updateAttrs\n}\n\n/* */\n\nfunction updateClass (oldVnode, vnode) {\n var el = vnode.elm;\n var data = vnode.data;\n var oldData = oldVnode.data;\n if (\n isUndef(data.staticClass) &&\n isUndef(data.class) && (\n isUndef(oldData) || (\n isUndef(oldData.staticClass) &&\n isUndef(oldData.class)\n )\n )\n ) {\n return\n }\n\n var cls = genClassForVnode(vnode);\n\n // handle transition classes\n var transitionClass = el._transitionClasses;\n if (isDef(transitionClass)) {\n cls = concat(cls, stringifyClass(transitionClass));\n }\n\n // set the class\n if (cls !== el._prevClass) {\n el.setAttribute('class', cls);\n el._prevClass = cls;\n }\n}\n\nvar klass = {\n create: updateClass,\n update: updateClass\n}\n\n/* */\n\nvar validDivisionCharRE = /[\\w).+\\-_$\\]]/;\n\nfunction parseFilters (exp) {\n var inSingle = false;\n var inDouble = false;\n var inTemplateString = false;\n var inRegex = false;\n var curly = 0;\n var square = 0;\n var paren = 0;\n var lastFilterIndex = 0;\n var c, prev, i, expression, filters;\n\n for (i = 0; i < exp.length; i++) {\n prev = c;\n c = exp.charCodeAt(i);\n if (inSingle) {\n if (c === 0x27 && prev !== 0x5C) { inSingle = false; }\n } else if (inDouble) {\n if (c === 0x22 && prev !== 0x5C) { inDouble = false; }\n } else if (inTemplateString) {\n if (c === 0x60 && prev !== 0x5C) { inTemplateString = false; }\n } else if (inRegex) {\n if (c === 0x2f && prev !== 0x5C) { inRegex = false; }\n } else if (\n c === 0x7C && // pipe\n exp.charCodeAt(i + 1) !== 0x7C &&\n exp.charCodeAt(i - 1) !== 0x7C &&\n !curly && !square && !paren\n ) {\n if (expression === undefined) {\n // first filter, end of expression\n lastFilterIndex = i + 1;\n expression = exp.slice(0, i).trim();\n } else {\n pushFilter();\n }\n } else {\n switch (c) {\n case 0x22: inDouble = true; break // \"\n case 0x27: inSingle = true; break // '\n case 0x60: inTemplateString = true; break // `\n case 0x28: paren++; break // (\n case 0x29: paren--; break // )\n case 0x5B: square++; break // [\n case 0x5D: square--; break // ]\n case 0x7B: curly++; break // {\n case 0x7D: curly--; break // }\n }\n if (c === 0x2f) { // /\n var j = i - 1;\n var p = (void 0);\n // find first non-whitespace prev char\n for (; j >= 0; j--) {\n p = exp.charAt(j);\n if (p !== ' ') { break }\n }\n if (!p || !validDivisionCharRE.test(p)) {\n inRegex = true;\n }\n }\n }\n }\n\n if (expression === undefined) {\n expression = exp.slice(0, i).trim();\n } else if (lastFilterIndex !== 0) {\n pushFilter();\n }\n\n function pushFilter () {\n (filters || (filters = [])).push(exp.slice(lastFilterIndex, i).trim());\n lastFilterIndex = i + 1;\n }\n\n if (filters) {\n for (i = 0; i < filters.length; i++) {\n expression = wrapFilter(expression, filters[i]);\n }\n }\n\n return expression\n}\n\nfunction wrapFilter (exp, filter) {\n var i = filter.indexOf('(');\n if (i < 0) {\n // _f: resolveFilter\n return (\"_f(\\\"\" + filter + \"\\\")(\" + exp + \")\")\n } else {\n var name = filter.slice(0, i);\n var args = filter.slice(i + 1);\n return (\"_f(\\\"\" + name + \"\\\")(\" + exp + (args !== ')' ? ',' + args : args))\n }\n}\n\n/* */\n\nfunction baseWarn (msg) {\n console.error((\"[Vue compiler]: \" + msg));\n}\n\nfunction pluckModuleFunction (\n modules,\n key\n) {\n return modules\n ? modules.map(function (m) { return m[key]; }).filter(function (_) { return _; })\n : []\n}\n\nfunction addProp (el, name, value) {\n (el.props || (el.props = [])).push({ name: name, value: value });\n el.plain = false;\n}\n\nfunction addAttr (el, name, value) {\n (el.attrs || (el.attrs = [])).push({ name: name, value: value });\n el.plain = false;\n}\n\n// add a raw attr (use this in preTransforms)\nfunction addRawAttr (el, name, value) {\n el.attrsMap[name] = value;\n el.attrsList.push({ name: name, value: value });\n}\n\nfunction addDirective (\n el,\n name,\n rawName,\n value,\n arg,\n modifiers\n) {\n (el.directives || (el.directives = [])).push({ name: name, rawName: rawName, value: value, arg: arg, modifiers: modifiers });\n el.plain = false;\n}\n\nfunction addHandler (\n el,\n name,\n value,\n modifiers,\n important,\n warn\n) {\n modifiers = modifiers || emptyObject;\n // warn prevent and passive modifier\n /* istanbul ignore if */\n if (\n \"development\" !== 'production' && warn &&\n modifiers.prevent && modifiers.passive\n ) {\n warn(\n 'passive and prevent can\\'t be used together. ' +\n 'Passive handler can\\'t prevent default event.'\n );\n }\n\n // check capture modifier\n if (modifiers.capture) {\n delete modifiers.capture;\n name = '!' + name; // mark the event as captured\n }\n if (modifiers.once) {\n delete modifiers.once;\n name = '~' + name; // mark the event as once\n }\n /* istanbul ignore if */\n if (modifiers.passive) {\n delete modifiers.passive;\n name = '&' + name; // mark the event as passive\n }\n\n // normalize click.right and click.middle since they don't actually fire\n // this is technically browser-specific, but at least for now browsers are\n // the only target envs that have right/middle clicks.\n if (name === 'click') {\n if (modifiers.right) {\n name = 'contextmenu';\n delete modifiers.right;\n } else if (modifiers.middle) {\n name = 'mouseup';\n }\n }\n\n var events;\n if (modifiers.native) {\n delete modifiers.native;\n events = el.nativeEvents || (el.nativeEvents = {});\n } else {\n events = el.events || (el.events = {});\n }\n\n var newHandler = {\n value: value.trim()\n };\n if (modifiers !== emptyObject) {\n newHandler.modifiers = modifiers;\n }\n\n var handlers = events[name];\n /* istanbul ignore if */\n if (Array.isArray(handlers)) {\n important ? handlers.unshift(newHandler) : handlers.push(newHandler);\n } else if (handlers) {\n events[name] = important ? [newHandler, handlers] : [handlers, newHandler];\n } else {\n events[name] = newHandler;\n }\n\n el.plain = false;\n}\n\nfunction getBindingAttr (\n el,\n name,\n getStatic\n) {\n var dynamicValue =\n getAndRemoveAttr(el, ':' + name) ||\n getAndRemoveAttr(el, 'v-bind:' + name);\n if (dynamicValue != null) {\n return parseFilters(dynamicValue)\n } else if (getStatic !== false) {\n var staticValue = getAndRemoveAttr(el, name);\n if (staticValue != null) {\n return JSON.stringify(staticValue)\n }\n }\n}\n\n// note: this only removes the attr from the Array (attrsList) so that it\n// doesn't get processed by processAttrs.\n// By default it does NOT remove it from the map (attrsMap) because the map is\n// needed during codegen.\nfunction getAndRemoveAttr (\n el,\n name,\n removeFromMap\n) {\n var val;\n if ((val = el.attrsMap[name]) != null) {\n var list = el.attrsList;\n for (var i = 0, l = list.length; i < l; i++) {\n if (list[i].name === name) {\n list.splice(i, 1);\n break\n }\n }\n }\n if (removeFromMap) {\n delete el.attrsMap[name];\n }\n return val\n}\n\n/* */\n\n/**\n * Cross-platform code generation for component v-model\n */\nfunction genComponentModel (\n el,\n value,\n modifiers\n) {\n var ref = modifiers || {};\n var number = ref.number;\n var trim = ref.trim;\n\n var baseValueExpression = '$$v';\n var valueExpression = baseValueExpression;\n if (trim) {\n valueExpression =\n \"(typeof \" + baseValueExpression + \" === 'string'\" +\n \"? \" + baseValueExpression + \".trim()\" +\n \": \" + baseValueExpression + \")\";\n }\n if (number) {\n valueExpression = \"_n(\" + valueExpression + \")\";\n }\n var assignment = genAssignmentCode(value, valueExpression);\n\n el.model = {\n value: (\"(\" + value + \")\"),\n expression: (\"\\\"\" + value + \"\\\"\"),\n callback: (\"function (\" + baseValueExpression + \") {\" + assignment + \"}\")\n };\n}\n\n/**\n * Cross-platform codegen helper for generating v-model value assignment code.\n */\nfunction genAssignmentCode (\n value,\n assignment\n) {\n var res = parseModel(value);\n if (res.key === null) {\n return (value + \"=\" + assignment)\n } else {\n return (\"$set(\" + (res.exp) + \", \" + (res.key) + \", \" + assignment + \")\")\n }\n}\n\n/**\n * Parse a v-model expression into a base path and a final key segment.\n * Handles both dot-path and possible square brackets.\n *\n * Possible cases:\n *\n * - test\n * - test[key]\n * - test[test1[key]]\n * - test[\"a\"][key]\n * - xxx.test[a[a].test1[key]]\n * - test.xxx.a[\"asa\"][test1[key]]\n *\n */\n\nvar len;\nvar str;\nvar chr;\nvar index$1;\nvar expressionPos;\nvar expressionEndPos;\n\n\n\nfunction parseModel (val) {\n // Fix https://github.com/vuejs/vue/pull/7730\n // allow v-model=\"obj.val \" (trailing whitespace)\n val = val.trim();\n len = val.length;\n\n if (val.indexOf('[') < 0 || val.lastIndexOf(']') < len - 1) {\n index$1 = val.lastIndexOf('.');\n if (index$1 > -1) {\n return {\n exp: val.slice(0, index$1),\n key: '\"' + val.slice(index$1 + 1) + '\"'\n }\n } else {\n return {\n exp: val,\n key: null\n }\n }\n }\n\n str = val;\n index$1 = expressionPos = expressionEndPos = 0;\n\n while (!eof()) {\n chr = next();\n /* istanbul ignore if */\n if (isStringStart(chr)) {\n parseString(chr);\n } else if (chr === 0x5B) {\n parseBracket(chr);\n }\n }\n\n return {\n exp: val.slice(0, expressionPos),\n key: val.slice(expressionPos + 1, expressionEndPos)\n }\n}\n\nfunction next () {\n return str.charCodeAt(++index$1)\n}\n\nfunction eof () {\n return index$1 >= len\n}\n\nfunction isStringStart (chr) {\n return chr === 0x22 || chr === 0x27\n}\n\nfunction parseBracket (chr) {\n var inBracket = 1;\n expressionPos = index$1;\n while (!eof()) {\n chr = next();\n if (isStringStart(chr)) {\n parseString(chr);\n continue\n }\n if (chr === 0x5B) { inBracket++; }\n if (chr === 0x5D) { inBracket--; }\n if (inBracket === 0) {\n expressionEndPos = index$1;\n break\n }\n }\n}\n\nfunction parseString (chr) {\n var stringQuote = chr;\n while (!eof()) {\n chr = next();\n if (chr === stringQuote) {\n break\n }\n }\n}\n\n/* */\n\nvar warn$1;\n\n// in some cases, the event used has to be determined at runtime\n// so we used some reserved tokens during compile.\nvar RANGE_TOKEN = '__r';\nvar CHECKBOX_RADIO_TOKEN = '__c';\n\nfunction model (\n el,\n dir,\n _warn\n) {\n warn$1 = _warn;\n var value = dir.value;\n var modifiers = dir.modifiers;\n var tag = el.tag;\n var type = el.attrsMap.type;\n\n if (true) {\n // inputs with type=\"file\" are read only and setting the input's\n // value will throw an error.\n if (tag === 'input' && type === 'file') {\n warn$1(\n \"<\" + (el.tag) + \" v-model=\\\"\" + value + \"\\\" type=\\\"file\\\">:\\n\" +\n \"File inputs are read only. Use a v-on:change listener instead.\"\n );\n }\n }\n\n if (el.component) {\n genComponentModel(el, value, modifiers);\n // component v-model doesn't need extra runtime\n return false\n } else if (tag === 'select') {\n genSelect(el, value, modifiers);\n } else if (tag === 'input' && type === 'checkbox') {\n genCheckboxModel(el, value, modifiers);\n } else if (tag === 'input' && type === 'radio') {\n genRadioModel(el, value, modifiers);\n } else if (tag === 'input' || tag === 'textarea') {\n genDefaultModel(el, value, modifiers);\n } else if (!config.isReservedTag(tag)) {\n genComponentModel(el, value, modifiers);\n // component v-model doesn't need extra runtime\n return false\n } else if (true) {\n warn$1(\n \"<\" + (el.tag) + \" v-model=\\\"\" + value + \"\\\">: \" +\n \"v-model is not supported on this element type. \" +\n 'If you are working with contenteditable, it\\'s recommended to ' +\n 'wrap a library dedicated for that purpose inside a custom component.'\n );\n }\n\n // ensure runtime directive metadata\n return true\n}\n\nfunction genCheckboxModel (\n el,\n value,\n modifiers\n) {\n var number = modifiers && modifiers.number;\n var valueBinding = getBindingAttr(el, 'value') || 'null';\n var trueValueBinding = getBindingAttr(el, 'true-value') || 'true';\n var falseValueBinding = getBindingAttr(el, 'false-value') || 'false';\n addProp(el, 'checked',\n \"Array.isArray(\" + value + \")\" +\n \"?_i(\" + value + \",\" + valueBinding + \")>-1\" + (\n trueValueBinding === 'true'\n ? (\":(\" + value + \")\")\n : (\":_q(\" + value + \",\" + trueValueBinding + \")\")\n )\n );\n addHandler(el, 'change',\n \"var $$a=\" + value + \",\" +\n '$$el=$event.target,' +\n \"$$c=$$el.checked?(\" + trueValueBinding + \"):(\" + falseValueBinding + \");\" +\n 'if(Array.isArray($$a)){' +\n \"var $$v=\" + (number ? '_n(' + valueBinding + ')' : valueBinding) + \",\" +\n '$$i=_i($$a,$$v);' +\n \"if($$el.checked){$$i<0&&(\" + (genAssignmentCode(value, '$$a.concat([$$v])')) + \")}\" +\n \"else{$$i>-1&&(\" + (genAssignmentCode(value, '$$a.slice(0,$$i).concat($$a.slice($$i+1))')) + \")}\" +\n \"}else{\" + (genAssignmentCode(value, '$$c')) + \"}\",\n null, true\n );\n}\n\nfunction genRadioModel (\n el,\n value,\n modifiers\n) {\n var number = modifiers && modifiers.number;\n var valueBinding = getBindingAttr(el, 'value') || 'null';\n valueBinding = number ? (\"_n(\" + valueBinding + \")\") : valueBinding;\n addProp(el, 'checked', (\"_q(\" + value + \",\" + valueBinding + \")\"));\n addHandler(el, 'change', genAssignmentCode(value, valueBinding), null, true);\n}\n\nfunction genSelect (\n el,\n value,\n modifiers\n) {\n var number = modifiers && modifiers.number;\n var selectedVal = \"Array.prototype.filter\" +\n \".call($event.target.options,function(o){return o.selected})\" +\n \".map(function(o){var val = \\\"_value\\\" in o ? o._value : o.value;\" +\n \"return \" + (number ? '_n(val)' : 'val') + \"})\";\n\n var assignment = '$event.target.multiple ? $$selectedVal : $$selectedVal[0]';\n var code = \"var $$selectedVal = \" + selectedVal + \";\";\n code = code + \" \" + (genAssignmentCode(value, assignment));\n addHandler(el, 'change', code, null, true);\n}\n\nfunction genDefaultModel (\n el,\n value,\n modifiers\n) {\n var type = el.attrsMap.type;\n\n // warn if v-bind:value conflicts with v-model\n // except for inputs with v-bind:type\n if (true) {\n var value$1 = el.attrsMap['v-bind:value'] || el.attrsMap[':value'];\n var typeBinding = el.attrsMap['v-bind:type'] || el.attrsMap[':type'];\n if (value$1 && !typeBinding) {\n var binding = el.attrsMap['v-bind:value'] ? 'v-bind:value' : ':value';\n warn$1(\n binding + \"=\\\"\" + value$1 + \"\\\" conflicts with v-model on the same element \" +\n 'because the latter already expands to a value binding internally'\n );\n }\n }\n\n var ref = modifiers || {};\n var lazy = ref.lazy;\n var number = ref.number;\n var trim = ref.trim;\n var needCompositionGuard = !lazy && type !== 'range';\n var event = lazy\n ? 'change'\n : type === 'range'\n ? RANGE_TOKEN\n : 'input';\n\n var valueExpression = '$event.target.value';\n if (trim) {\n valueExpression = \"$event.target.value.trim()\";\n }\n if (number) {\n valueExpression = \"_n(\" + valueExpression + \")\";\n }\n\n var code = genAssignmentCode(value, valueExpression);\n if (needCompositionGuard) {\n code = \"if($event.target.composing)return;\" + code;\n }\n\n addProp(el, 'value', (\"(\" + value + \")\"));\n addHandler(el, event, code, null, true);\n if (trim || number) {\n addHandler(el, 'blur', '$forceUpdate()');\n }\n}\n\n/* */\n\n// normalize v-model event tokens that can only be determined at runtime.\n// it's important to place the event as the first in the array because\n// the whole point is ensuring the v-model callback gets called before\n// user-attached handlers.\nfunction normalizeEvents (on) {\n /* istanbul ignore if */\n if (isDef(on[RANGE_TOKEN])) {\n // IE input[type=range] only supports `change` event\n var event = isIE ? 'change' : 'input';\n on[event] = [].concat(on[RANGE_TOKEN], on[event] || []);\n delete on[RANGE_TOKEN];\n }\n // This was originally intended to fix #4521 but no longer necessary\n // after 2.5. Keeping it for backwards compat with generated code from < 2.4\n /* istanbul ignore if */\n if (isDef(on[CHECKBOX_RADIO_TOKEN])) {\n on.change = [].concat(on[CHECKBOX_RADIO_TOKEN], on.change || []);\n delete on[CHECKBOX_RADIO_TOKEN];\n }\n}\n\nvar target$1;\n\nfunction createOnceHandler (handler, event, capture) {\n var _target = target$1; // save current target element in closure\n return function onceHandler () {\n var res = handler.apply(null, arguments);\n if (res !== null) {\n remove$2(event, onceHandler, capture, _target);\n }\n }\n}\n\nfunction add$1 (\n event,\n handler,\n once$$1,\n capture,\n passive\n) {\n handler = withMacroTask(handler);\n if (once$$1) { handler = createOnceHandler(handler, event, capture); }\n target$1.addEventListener(\n event,\n handler,\n supportsPassive\n ? { capture: capture, passive: passive }\n : capture\n );\n}\n\nfunction remove$2 (\n event,\n handler,\n capture,\n _target\n) {\n (_target || target$1).removeEventListener(\n event,\n handler._withTask || handler,\n capture\n );\n}\n\nfunction updateDOMListeners (oldVnode, vnode) {\n if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) {\n return\n }\n var on = vnode.data.on || {};\n var oldOn = oldVnode.data.on || {};\n target$1 = vnode.elm;\n normalizeEvents(on);\n updateListeners(on, oldOn, add$1, remove$2, vnode.context);\n target$1 = undefined;\n}\n\nvar events = {\n create: updateDOMListeners,\n update: updateDOMListeners\n}\n\n/* */\n\nfunction updateDOMProps (oldVnode, vnode) {\n if (isUndef(oldVnode.data.domProps) && isUndef(vnode.data.domProps)) {\n return\n }\n var key, cur;\n var elm = vnode.elm;\n var oldProps = oldVnode.data.domProps || {};\n var props = vnode.data.domProps || {};\n // clone observed objects, as the user probably wants to mutate it\n if (isDef(props.__ob__)) {\n props = vnode.data.domProps = extend({}, props);\n }\n\n for (key in oldProps) {\n if (isUndef(props[key])) {\n elm[key] = '';\n }\n }\n for (key in props) {\n cur = props[key];\n // ignore children if the node has textContent or innerHTML,\n // as these will throw away existing DOM nodes and cause removal errors\n // on subsequent patches (#3360)\n if (key === 'textContent' || key === 'innerHTML') {\n if (vnode.children) { vnode.children.length = 0; }\n if (cur === oldProps[key]) { continue }\n // #6601 work around Chrome version <= 55 bug where single textNode\n // replaced by innerHTML/textContent retains its parentNode property\n if (elm.childNodes.length === 1) {\n elm.removeChild(elm.childNodes[0]);\n }\n }\n\n if (key === 'value') {\n // store value as _value as well since\n // non-string values will be stringified\n elm._value = cur;\n // avoid resetting cursor position when value is the same\n var strCur = isUndef(cur) ? '' : String(cur);\n if (shouldUpdateValue(elm, strCur)) {\n elm.value = strCur;\n }\n } else {\n elm[key] = cur;\n }\n }\n}\n\n// check platforms/web/util/attrs.js acceptValue\n\n\nfunction shouldUpdateValue (elm, checkVal) {\n return (!elm.composing && (\n elm.tagName === 'OPTION' ||\n isNotInFocusAndDirty(elm, checkVal) ||\n isDirtyWithModifiers(elm, checkVal)\n ))\n}\n\nfunction isNotInFocusAndDirty (elm, checkVal) {\n // return true when textbox (.number and .trim) loses focus and its value is\n // not equal to the updated value\n var notInFocus = true;\n // #6157\n // work around IE bug when accessing document.activeElement in an iframe\n try { notInFocus = document.activeElement !== elm; } catch (e) {}\n return notInFocus && elm.value !== checkVal\n}\n\nfunction isDirtyWithModifiers (elm, newVal) {\n var value = elm.value;\n var modifiers = elm._vModifiers; // injected by v-model runtime\n if (isDef(modifiers)) {\n if (modifiers.lazy) {\n // inputs with lazy should only be updated when not in focus\n return false\n }\n if (modifiers.number) {\n return toNumber(value) !== toNumber(newVal)\n }\n if (modifiers.trim) {\n return value.trim() !== newVal.trim()\n }\n }\n return value !== newVal\n}\n\nvar domProps = {\n create: updateDOMProps,\n update: updateDOMProps\n}\n\n/* */\n\nvar parseStyleText = cached(function (cssText) {\n var res = {};\n var listDelimiter = /;(?![^(]*\\))/g;\n var propertyDelimiter = /:(.+)/;\n cssText.split(listDelimiter).forEach(function (item) {\n if (item) {\n var tmp = item.split(propertyDelimiter);\n tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return res\n});\n\n// merge static and dynamic style data on the same vnode\nfunction normalizeStyleData (data) {\n var style = normalizeStyleBinding(data.style);\n // static style is pre-processed into an object during compilation\n // and is always a fresh object, so it's safe to merge into it\n return data.staticStyle\n ? extend(data.staticStyle, style)\n : style\n}\n\n// normalize possible array / string values into Object\nfunction normalizeStyleBinding (bindingStyle) {\n if (Array.isArray(bindingStyle)) {\n return toObject(bindingStyle)\n }\n if (typeof bindingStyle === 'string') {\n return parseStyleText(bindingStyle)\n }\n return bindingStyle\n}\n\n/**\n * parent component style should be after child's\n * so that parent component's style could override it\n */\nfunction getStyle (vnode, checkChild) {\n var res = {};\n var styleData;\n\n if (checkChild) {\n var childNode = vnode;\n while (childNode.componentInstance) {\n childNode = childNode.componentInstance._vnode;\n if (\n childNode && childNode.data &&\n (styleData = normalizeStyleData(childNode.data))\n ) {\n extend(res, styleData);\n }\n }\n }\n\n if ((styleData = normalizeStyleData(vnode.data))) {\n extend(res, styleData);\n }\n\n var parentNode = vnode;\n while ((parentNode = parentNode.parent)) {\n if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {\n extend(res, styleData);\n }\n }\n return res\n}\n\n/* */\n\nvar cssVarRE = /^--/;\nvar importantRE = /\\s*!important$/;\nvar setProp = function (el, name, val) {\n /* istanbul ignore if */\n if (cssVarRE.test(name)) {\n el.style.setProperty(name, val);\n } else if (importantRE.test(val)) {\n el.style.setProperty(name, val.replace(importantRE, ''), 'important');\n } else {\n var normalizedName = normalize(name);\n if (Array.isArray(val)) {\n // Support values array created by autoprefixer, e.g.\n // {display: [\"-webkit-box\", \"-ms-flexbox\", \"flex\"]}\n // Set them one by one, and the browser will only set those it can recognize\n for (var i = 0, len = val.length; i < len; i++) {\n el.style[normalizedName] = val[i];\n }\n } else {\n el.style[normalizedName] = val;\n }\n }\n};\n\nvar vendorNames = ['Webkit', 'Moz', 'ms'];\n\nvar emptyStyle;\nvar normalize = cached(function (prop) {\n emptyStyle = emptyStyle || document.createElement('div').style;\n prop = camelize(prop);\n if (prop !== 'filter' && (prop in emptyStyle)) {\n return prop\n }\n var capName = prop.charAt(0).toUpperCase() + prop.slice(1);\n for (var i = 0; i < vendorNames.length; i++) {\n var name = vendorNames[i] + capName;\n if (name in emptyStyle) {\n return name\n }\n }\n});\n\nfunction updateStyle (oldVnode, vnode) {\n var data = vnode.data;\n var oldData = oldVnode.data;\n\n if (isUndef(data.staticStyle) && isUndef(data.style) &&\n isUndef(oldData.staticStyle) && isUndef(oldData.style)\n ) {\n return\n }\n\n var cur, name;\n var el = vnode.elm;\n var oldStaticStyle = oldData.staticStyle;\n var oldStyleBinding = oldData.normalizedStyle || oldData.style || {};\n\n // if static style exists, stylebinding already merged into it when doing normalizeStyleData\n var oldStyle = oldStaticStyle || oldStyleBinding;\n\n var style = normalizeStyleBinding(vnode.data.style) || {};\n\n // store normalized style under a different key for next diff\n // make sure to clone it if it's reactive, since the user likely wants\n // to mutate it.\n vnode.data.normalizedStyle = isDef(style.__ob__)\n ? extend({}, style)\n : style;\n\n var newStyle = getStyle(vnode, true);\n\n for (name in oldStyle) {\n if (isUndef(newStyle[name])) {\n setProp(el, name, '');\n }\n }\n for (name in newStyle) {\n cur = newStyle[name];\n if (cur !== oldStyle[name]) {\n // ie9 setting to null has no effect, must use empty string\n setProp(el, name, cur == null ? '' : cur);\n }\n }\n}\n\nvar style = {\n create: updateStyle,\n update: updateStyle\n}\n\n/* */\n\n/**\n * Add class with compatibility for SVG since classList is not supported on\n * SVG elements in IE\n */\nfunction addClass (el, cls) {\n /* istanbul ignore if */\n if (!cls || !(cls = cls.trim())) {\n return\n }\n\n /* istanbul ignore else */\n if (el.classList) {\n if (cls.indexOf(' ') > -1) {\n cls.split(/\\s+/).forEach(function (c) { return el.classList.add(c); });\n } else {\n el.classList.add(cls);\n }\n } else {\n var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n if (cur.indexOf(' ' + cls + ' ') < 0) {\n el.setAttribute('class', (cur + cls).trim());\n }\n }\n}\n\n/**\n * Remove class with compatibility for SVG since classList is not supported on\n * SVG elements in IE\n */\nfunction removeClass (el, cls) {\n /* istanbul ignore if */\n if (!cls || !(cls = cls.trim())) {\n return\n }\n\n /* istanbul ignore else */\n if (el.classList) {\n if (cls.indexOf(' ') > -1) {\n cls.split(/\\s+/).forEach(function (c) { return el.classList.remove(c); });\n } else {\n el.classList.remove(cls);\n }\n if (!el.classList.length) {\n el.removeAttribute('class');\n }\n } else {\n var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n var tar = ' ' + cls + ' ';\n while (cur.indexOf(tar) >= 0) {\n cur = cur.replace(tar, ' ');\n }\n cur = cur.trim();\n if (cur) {\n el.setAttribute('class', cur);\n } else {\n el.removeAttribute('class');\n }\n }\n}\n\n/* */\n\nfunction resolveTransition (def) {\n if (!def) {\n return\n }\n /* istanbul ignore else */\n if (typeof def === 'object') {\n var res = {};\n if (def.css !== false) {\n extend(res, autoCssTransition(def.name || 'v'));\n }\n extend(res, def);\n return res\n } else if (typeof def === 'string') {\n return autoCssTransition(def)\n }\n}\n\nvar autoCssTransition = cached(function (name) {\n return {\n enterClass: (name + \"-enter\"),\n enterToClass: (name + \"-enter-to\"),\n enterActiveClass: (name + \"-enter-active\"),\n leaveClass: (name + \"-leave\"),\n leaveToClass: (name + \"-leave-to\"),\n leaveActiveClass: (name + \"-leave-active\")\n }\n});\n\nvar hasTransition = inBrowser && !isIE9;\nvar TRANSITION = 'transition';\nvar ANIMATION = 'animation';\n\n// Transition property/event sniffing\nvar transitionProp = 'transition';\nvar transitionEndEvent = 'transitionend';\nvar animationProp = 'animation';\nvar animationEndEvent = 'animationend';\nif (hasTransition) {\n /* istanbul ignore if */\n if (window.ontransitionend === undefined &&\n window.onwebkittransitionend !== undefined\n ) {\n transitionProp = 'WebkitTransition';\n transitionEndEvent = 'webkitTransitionEnd';\n }\n if (window.onanimationend === undefined &&\n window.onwebkitanimationend !== undefined\n ) {\n animationProp = 'WebkitAnimation';\n animationEndEvent = 'webkitAnimationEnd';\n }\n}\n\n// binding to window is necessary to make hot reload work in IE in strict mode\nvar raf = inBrowser\n ? window.requestAnimationFrame\n ? window.requestAnimationFrame.bind(window)\n : setTimeout\n : /* istanbul ignore next */ function (fn) { return fn(); };\n\nfunction nextFrame (fn) {\n raf(function () {\n raf(fn);\n });\n}\n\nfunction addTransitionClass (el, cls) {\n var transitionClasses = el._transitionClasses || (el._transitionClasses = []);\n if (transitionClasses.indexOf(cls) < 0) {\n transitionClasses.push(cls);\n addClass(el, cls);\n }\n}\n\nfunction removeTransitionClass (el, cls) {\n if (el._transitionClasses) {\n remove(el._transitionClasses, cls);\n }\n removeClass(el, cls);\n}\n\nfunction whenTransitionEnds (\n el,\n expectedType,\n cb\n) {\n var ref = getTransitionInfo(el, expectedType);\n var type = ref.type;\n var timeout = ref.timeout;\n var propCount = ref.propCount;\n if (!type) { return cb() }\n var event = type === TRANSITION ? transitionEndEvent : animationEndEvent;\n var ended = 0;\n var end = function () {\n el.removeEventListener(event, onEnd);\n cb();\n };\n var onEnd = function (e) {\n if (e.target === el) {\n if (++ended >= propCount) {\n end();\n }\n }\n };\n setTimeout(function () {\n if (ended < propCount) {\n end();\n }\n }, timeout + 1);\n el.addEventListener(event, onEnd);\n}\n\nvar transformRE = /\\b(transform|all)(,|$)/;\n\nfunction getTransitionInfo (el, expectedType) {\n var styles = window.getComputedStyle(el);\n var transitionDelays = styles[transitionProp + 'Delay'].split(', ');\n var transitionDurations = styles[transitionProp + 'Duration'].split(', ');\n var transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n var animationDelays = styles[animationProp + 'Delay'].split(', ');\n var animationDurations = styles[animationProp + 'Duration'].split(', ');\n var animationTimeout = getTimeout(animationDelays, animationDurations);\n\n var type;\n var timeout = 0;\n var propCount = 0;\n /* istanbul ignore if */\n if (expectedType === TRANSITION) {\n if (transitionTimeout > 0) {\n type = TRANSITION;\n timeout = transitionTimeout;\n propCount = transitionDurations.length;\n }\n } else if (expectedType === ANIMATION) {\n if (animationTimeout > 0) {\n type = ANIMATION;\n timeout = animationTimeout;\n propCount = animationDurations.length;\n }\n } else {\n timeout = Math.max(transitionTimeout, animationTimeout);\n type = timeout > 0\n ? transitionTimeout > animationTimeout\n ? TRANSITION\n : ANIMATION\n : null;\n propCount = type\n ? type === TRANSITION\n ? transitionDurations.length\n : animationDurations.length\n : 0;\n }\n var hasTransform =\n type === TRANSITION &&\n transformRE.test(styles[transitionProp + 'Property']);\n return {\n type: type,\n timeout: timeout,\n propCount: propCount,\n hasTransform: hasTransform\n }\n}\n\nfunction getTimeout (delays, durations) {\n /* istanbul ignore next */\n while (delays.length < durations.length) {\n delays = delays.concat(delays);\n }\n\n return Math.max.apply(null, durations.map(function (d, i) {\n return toMs(d) + toMs(delays[i])\n }))\n}\n\nfunction toMs (s) {\n return Number(s.slice(0, -1)) * 1000\n}\n\n/* */\n\nfunction enter (vnode, toggleDisplay) {\n var el = vnode.elm;\n\n // call leave callback now\n if (isDef(el._leaveCb)) {\n el._leaveCb.cancelled = true;\n el._leaveCb();\n }\n\n var data = resolveTransition(vnode.data.transition);\n if (isUndef(data)) {\n return\n }\n\n /* istanbul ignore if */\n if (isDef(el._enterCb) || el.nodeType !== 1) {\n return\n }\n\n var css = data.css;\n var type = data.type;\n var enterClass = data.enterClass;\n var enterToClass = data.enterToClass;\n var enterActiveClass = data.enterActiveClass;\n var appearClass = data.appearClass;\n var appearToClass = data.appearToClass;\n var appearActiveClass = data.appearActiveClass;\n var beforeEnter = data.beforeEnter;\n var enter = data.enter;\n var afterEnter = data.afterEnter;\n var enterCancelled = data.enterCancelled;\n var beforeAppear = data.beforeAppear;\n var appear = data.appear;\n var afterAppear = data.afterAppear;\n var appearCancelled = data.appearCancelled;\n var duration = data.duration;\n\n // activeInstance will always be the <transition> component managing this\n // transition. One edge case to check is when the <transition> is placed\n // as the root node of a child component. In that case we need to check\n // <transition>'s parent for appear check.\n var context = activeInstance;\n var transitionNode = activeInstance.$vnode;\n while (transitionNode && transitionNode.parent) {\n transitionNode = transitionNode.parent;\n context = transitionNode.context;\n }\n\n var isAppear = !context._isMounted || !vnode.isRootInsert;\n\n if (isAppear && !appear && appear !== '') {\n return\n }\n\n var startClass = isAppear && appearClass\n ? appearClass\n : enterClass;\n var activeClass = isAppear && appearActiveClass\n ? appearActiveClass\n : enterActiveClass;\n var toClass = isAppear && appearToClass\n ? appearToClass\n : enterToClass;\n\n var beforeEnterHook = isAppear\n ? (beforeAppear || beforeEnter)\n : beforeEnter;\n var enterHook = isAppear\n ? (typeof appear === 'function' ? appear : enter)\n : enter;\n var afterEnterHook = isAppear\n ? (afterAppear || afterEnter)\n : afterEnter;\n var enterCancelledHook = isAppear\n ? (appearCancelled || enterCancelled)\n : enterCancelled;\n\n var explicitEnterDuration = toNumber(\n isObject(duration)\n ? duration.enter\n : duration\n );\n\n if (\"development\" !== 'production' && explicitEnterDuration != null) {\n checkDuration(explicitEnterDuration, 'enter', vnode);\n }\n\n var expectsCSS = css !== false && !isIE9;\n var userWantsControl = getHookArgumentsLength(enterHook);\n\n var cb = el._enterCb = once(function () {\n if (expectsCSS) {\n removeTransitionClass(el, toClass);\n removeTransitionClass(el, activeClass);\n }\n if (cb.cancelled) {\n if (expectsCSS) {\n removeTransitionClass(el, startClass);\n }\n enterCancelledHook && enterCancelledHook(el);\n } else {\n afterEnterHook && afterEnterHook(el);\n }\n el._enterCb = null;\n });\n\n if (!vnode.data.show) {\n // remove pending leave element on enter by injecting an insert hook\n mergeVNodeHook(vnode, 'insert', function () {\n var parent = el.parentNode;\n var pendingNode = parent && parent._pending && parent._pending[vnode.key];\n if (pendingNode &&\n pendingNode.tag === vnode.tag &&\n pendingNode.elm._leaveCb\n ) {\n pendingNode.elm._leaveCb();\n }\n enterHook && enterHook(el, cb);\n });\n }\n\n // start enter transition\n beforeEnterHook && beforeEnterHook(el);\n if (expectsCSS) {\n addTransitionClass(el, startClass);\n addTransitionClass(el, activeClass);\n nextFrame(function () {\n removeTransitionClass(el, startClass);\n if (!cb.cancelled) {\n addTransitionClass(el, toClass);\n if (!userWantsControl) {\n if (isValidDuration(explicitEnterDuration)) {\n setTimeout(cb, explicitEnterDuration);\n } else {\n whenTransitionEnds(el, type, cb);\n }\n }\n }\n });\n }\n\n if (vnode.data.show) {\n toggleDisplay && toggleDisplay();\n enterHook && enterHook(el, cb);\n }\n\n if (!expectsCSS && !userWantsControl) {\n cb();\n }\n}\n\nfunction leave (vnode, rm) {\n var el = vnode.elm;\n\n // call enter callback now\n if (isDef(el._enterCb)) {\n el._enterCb.cancelled = true;\n el._enterCb();\n }\n\n var data = resolveTransition(vnode.data.transition);\n if (isUndef(data) || el.nodeType !== 1) {\n return rm()\n }\n\n /* istanbul ignore if */\n if (isDef(el._leaveCb)) {\n return\n }\n\n var css = data.css;\n var type = data.type;\n var leaveClass = data.leaveClass;\n var leaveToClass = data.leaveToClass;\n var leaveActiveClass = data.leaveActiveClass;\n var beforeLeave = data.beforeLeave;\n var leave = data.leave;\n var afterLeave = data.afterLeave;\n var leaveCancelled = data.leaveCancelled;\n var delayLeave = data.delayLeave;\n var duration = data.duration;\n\n var expectsCSS = css !== false && !isIE9;\n var userWantsControl = getHookArgumentsLength(leave);\n\n var explicitLeaveDuration = toNumber(\n isObject(duration)\n ? duration.leave\n : duration\n );\n\n if (\"development\" !== 'production' && isDef(explicitLeaveDuration)) {\n checkDuration(explicitLeaveDuration, 'leave', vnode);\n }\n\n var cb = el._leaveCb = once(function () {\n if (el.parentNode && el.parentNode._pending) {\n el.parentNode._pending[vnode.key] = null;\n }\n if (expectsCSS) {\n removeTransitionClass(el, leaveToClass);\n removeTransitionClass(el, leaveActiveClass);\n }\n if (cb.cancelled) {\n if (expectsCSS) {\n removeTransitionClass(el, leaveClass);\n }\n leaveCancelled && leaveCancelled(el);\n } else {\n rm();\n afterLeave && afterLeave(el);\n }\n el._leaveCb = null;\n });\n\n if (delayLeave) {\n delayLeave(performLeave);\n } else {\n performLeave();\n }\n\n function performLeave () {\n // the delayed leave may have already been cancelled\n if (cb.cancelled) {\n return\n }\n // record leaving element\n if (!vnode.data.show) {\n (el.parentNode._pending || (el.parentNode._pending = {}))[(vnode.key)] = vnode;\n }\n beforeLeave && beforeLeave(el);\n if (expectsCSS) {\n addTransitionClass(el, leaveClass);\n addTransitionClass(el, leaveActiveClass);\n nextFrame(function () {\n removeTransitionClass(el, leaveClass);\n if (!cb.cancelled) {\n addTransitionClass(el, leaveToClass);\n if (!userWantsControl) {\n if (isValidDuration(explicitLeaveDuration)) {\n setTimeout(cb, explicitLeaveDuration);\n } else {\n whenTransitionEnds(el, type, cb);\n }\n }\n }\n });\n }\n leave && leave(el, cb);\n if (!expectsCSS && !userWantsControl) {\n cb();\n }\n }\n}\n\n// only used in dev mode\nfunction checkDuration (val, name, vnode) {\n if (typeof val !== 'number') {\n warn(\n \"<transition> explicit \" + name + \" duration is not a valid number - \" +\n \"got \" + (JSON.stringify(val)) + \".\",\n vnode.context\n );\n } else if (isNaN(val)) {\n warn(\n \"<transition> explicit \" + name + \" duration is NaN - \" +\n 'the duration expression might be incorrect.',\n vnode.context\n );\n }\n}\n\nfunction isValidDuration (val) {\n return typeof val === 'number' && !isNaN(val)\n}\n\n/**\n * Normalize a transition hook's argument length. The hook may be:\n * - a merged hook (invoker) with the original in .fns\n * - a wrapped component method (check ._length)\n * - a plain function (.length)\n */\nfunction getHookArgumentsLength (fn) {\n if (isUndef(fn)) {\n return false\n }\n var invokerFns = fn.fns;\n if (isDef(invokerFns)) {\n // invoker\n return getHookArgumentsLength(\n Array.isArray(invokerFns)\n ? invokerFns[0]\n : invokerFns\n )\n } else {\n return (fn._length || fn.length) > 1\n }\n}\n\nfunction _enter (_, vnode) {\n if (vnode.data.show !== true) {\n enter(vnode);\n }\n}\n\nvar transition = inBrowser ? {\n create: _enter,\n activate: _enter,\n remove: function remove$$1 (vnode, rm) {\n /* istanbul ignore else */\n if (vnode.data.show !== true) {\n leave(vnode, rm);\n } else {\n rm();\n }\n }\n} : {}\n\nvar platformModules = [\n attrs,\n klass,\n events,\n domProps,\n style,\n transition\n]\n\n/* */\n\n// the directive module should be applied last, after all\n// built-in modules have been applied.\nvar modules = platformModules.concat(baseModules);\n\nvar patch = createPatchFunction({ nodeOps: nodeOps, modules: modules });\n\n/**\n * Not type checking this file because flow doesn't like attaching\n * properties to Elements.\n */\n\n/* istanbul ignore if */\nif (isIE9) {\n // http://www.matts411.com/post/internet-explorer-9-oninput/\n document.addEventListener('selectionchange', function () {\n var el = document.activeElement;\n if (el && el.vmodel) {\n trigger(el, 'input');\n }\n });\n}\n\nvar directive = {\n inserted: function inserted (el, binding, vnode, oldVnode) {\n if (vnode.tag === 'select') {\n // #6903\n if (oldVnode.elm && !oldVnode.elm._vOptions) {\n mergeVNodeHook(vnode, 'postpatch', function () {\n directive.componentUpdated(el, binding, vnode);\n });\n } else {\n setSelected(el, binding, vnode.context);\n }\n el._vOptions = [].map.call(el.options, getValue);\n } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {\n el._vModifiers = binding.modifiers;\n if (!binding.modifiers.lazy) {\n el.addEventListener('compositionstart', onCompositionStart);\n el.addEventListener('compositionend', onCompositionEnd);\n // Safari < 10.2 & UIWebView doesn't fire compositionend when\n // switching focus before confirming composition choice\n // this also fixes the issue where some browsers e.g. iOS Chrome\n // fires \"change\" instead of \"input\" on autocomplete.\n el.addEventListener('change', onCompositionEnd);\n /* istanbul ignore if */\n if (isIE9) {\n el.vmodel = true;\n }\n }\n }\n },\n\n componentUpdated: function componentUpdated (el, binding, vnode) {\n if (vnode.tag === 'select') {\n setSelected(el, binding, vnode.context);\n // in case the options rendered by v-for have changed,\n // it's possible that the value is out-of-sync with the rendered options.\n // detect such cases and filter out values that no longer has a matching\n // option in the DOM.\n var prevOptions = el._vOptions;\n var curOptions = el._vOptions = [].map.call(el.options, getValue);\n if (curOptions.some(function (o, i) { return !looseEqual(o, prevOptions[i]); })) {\n // trigger change event if\n // no matching option found for at least one value\n var needReset = el.multiple\n ? binding.value.some(function (v) { return hasNoMatchingOption(v, curOptions); })\n : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, curOptions);\n if (needReset) {\n trigger(el, 'change');\n }\n }\n }\n }\n};\n\nfunction setSelected (el, binding, vm) {\n actuallySetSelected(el, binding, vm);\n /* istanbul ignore if */\n if (isIE || isEdge) {\n setTimeout(function () {\n actuallySetSelected(el, binding, vm);\n }, 0);\n }\n}\n\nfunction actuallySetSelected (el, binding, vm) {\n var value = binding.value;\n var isMultiple = el.multiple;\n if (isMultiple && !Array.isArray(value)) {\n \"development\" !== 'production' && warn(\n \"<select multiple v-model=\\\"\" + (binding.expression) + \"\\\"> \" +\n \"expects an Array value for its binding, but got \" + (Object.prototype.toString.call(value).slice(8, -1)),\n vm\n );\n return\n }\n var selected, option;\n for (var i = 0, l = el.options.length; i < l; i++) {\n option = el.options[i];\n if (isMultiple) {\n selected = looseIndexOf(value, getValue(option)) > -1;\n if (option.selected !== selected) {\n option.selected = selected;\n }\n } else {\n if (looseEqual(getValue(option), value)) {\n if (el.selectedIndex !== i) {\n el.selectedIndex = i;\n }\n return\n }\n }\n }\n if (!isMultiple) {\n el.selectedIndex = -1;\n }\n}\n\nfunction hasNoMatchingOption (value, options) {\n return options.every(function (o) { return !looseEqual(o, value); })\n}\n\nfunction getValue (option) {\n return '_value' in option\n ? option._value\n : option.value\n}\n\nfunction onCompositionStart (e) {\n e.target.composing = true;\n}\n\nfunction onCompositionEnd (e) {\n // prevent triggering an input event for no reason\n if (!e.target.composing) { return }\n e.target.composing = false;\n trigger(e.target, 'input');\n}\n\nfunction trigger (el, type) {\n var e = document.createEvent('HTMLEvents');\n e.initEvent(type, true, true);\n el.dispatchEvent(e);\n}\n\n/* */\n\n// recursively search for possible transition defined inside the component root\nfunction locateNode (vnode) {\n return vnode.componentInstance && (!vnode.data || !vnode.data.transition)\n ? locateNode(vnode.componentInstance._vnode)\n : vnode\n}\n\nvar show = {\n bind: function bind (el, ref, vnode) {\n var value = ref.value;\n\n vnode = locateNode(vnode);\n var transition$$1 = vnode.data && vnode.data.transition;\n var originalDisplay = el.__vOriginalDisplay =\n el.style.display === 'none' ? '' : el.style.display;\n if (value && transition$$1) {\n vnode.data.show = true;\n enter(vnode, function () {\n el.style.display = originalDisplay;\n });\n } else {\n el.style.display = value ? originalDisplay : 'none';\n }\n },\n\n update: function update (el, ref, vnode) {\n var value = ref.value;\n var oldValue = ref.oldValue;\n\n /* istanbul ignore if */\n if (!value === !oldValue) { return }\n vnode = locateNode(vnode);\n var transition$$1 = vnode.data && vnode.data.transition;\n if (transition$$1) {\n vnode.data.show = true;\n if (value) {\n enter(vnode, function () {\n el.style.display = el.__vOriginalDisplay;\n });\n } else {\n leave(vnode, function () {\n el.style.display = 'none';\n });\n }\n } else {\n el.style.display = value ? el.__vOriginalDisplay : 'none';\n }\n },\n\n unbind: function unbind (\n el,\n binding,\n vnode,\n oldVnode,\n isDestroy\n ) {\n if (!isDestroy) {\n el.style.display = el.__vOriginalDisplay;\n }\n }\n}\n\nvar platformDirectives = {\n model: directive,\n show: show\n}\n\n/* */\n\n// Provides transition support for a single element/component.\n// supports transition mode (out-in / in-out)\n\nvar transitionProps = {\n name: String,\n appear: Boolean,\n css: Boolean,\n mode: String,\n type: String,\n enterClass: String,\n leaveClass: String,\n enterToClass: String,\n leaveToClass: String,\n enterActiveClass: String,\n leaveActiveClass: String,\n appearClass: String,\n appearActiveClass: String,\n appearToClass: String,\n duration: [Number, String, Object]\n};\n\n// in case the child is also an abstract component, e.g. <keep-alive>\n// we want to recursively retrieve the real component to be rendered\nfunction getRealChild (vnode) {\n var compOptions = vnode && vnode.componentOptions;\n if (compOptions && compOptions.Ctor.options.abstract) {\n return getRealChild(getFirstComponentChild(compOptions.children))\n } else {\n return vnode\n }\n}\n\nfunction extractTransitionData (comp) {\n var data = {};\n var options = comp.$options;\n // props\n for (var key in options.propsData) {\n data[key] = comp[key];\n }\n // events.\n // extract listeners and pass them directly to the transition methods\n var listeners = options._parentListeners;\n for (var key$1 in listeners) {\n data[camelize(key$1)] = listeners[key$1];\n }\n return data\n}\n\nfunction placeholder (h, rawChild) {\n if (/\\d-keep-alive$/.test(rawChild.tag)) {\n return h('keep-alive', {\n props: rawChild.componentOptions.propsData\n })\n }\n}\n\nfunction hasParentTransition (vnode) {\n while ((vnode = vnode.parent)) {\n if (vnode.data.transition) {\n return true\n }\n }\n}\n\nfunction isSameChild (child, oldChild) {\n return oldChild.key === child.key && oldChild.tag === child.tag\n}\n\nvar Transition = {\n name: 'transition',\n props: transitionProps,\n abstract: true,\n\n render: function render (h) {\n var this$1 = this;\n\n var children = this.$slots.default;\n if (!children) {\n return\n }\n\n // filter out text nodes (possible whitespaces)\n children = children.filter(function (c) { return c.tag || isAsyncPlaceholder(c); });\n /* istanbul ignore if */\n if (!children.length) {\n return\n }\n\n // warn multiple elements\n if (\"development\" !== 'production' && children.length > 1) {\n warn(\n '<transition> can only be used on a single element. Use ' +\n '<transition-group> for lists.',\n this.$parent\n );\n }\n\n var mode = this.mode;\n\n // warn invalid mode\n if (\"development\" !== 'production' &&\n mode && mode !== 'in-out' && mode !== 'out-in'\n ) {\n warn(\n 'invalid <transition> mode: ' + mode,\n this.$parent\n );\n }\n\n var rawChild = children[0];\n\n // if this is a component root node and the component's\n // parent container node also has transition, skip.\n if (hasParentTransition(this.$vnode)) {\n return rawChild\n }\n\n // apply transition data to child\n // use getRealChild() to ignore abstract components e.g. keep-alive\n var child = getRealChild(rawChild);\n /* istanbul ignore if */\n if (!child) {\n return rawChild\n }\n\n if (this._leaving) {\n return placeholder(h, rawChild)\n }\n\n // ensure a key that is unique to the vnode type and to this transition\n // component instance. This key will be used to remove pending leaving nodes\n // during entering.\n var id = \"__transition-\" + (this._uid) + \"-\";\n child.key = child.key == null\n ? child.isComment\n ? id + 'comment'\n : id + child.tag\n : isPrimitive(child.key)\n ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)\n : child.key;\n\n var data = (child.data || (child.data = {})).transition = extractTransitionData(this);\n var oldRawChild = this._vnode;\n var oldChild = getRealChild(oldRawChild);\n\n // mark v-show\n // so that the transition module can hand over the control to the directive\n if (child.data.directives && child.data.directives.some(function (d) { return d.name === 'show'; })) {\n child.data.show = true;\n }\n\n if (\n oldChild &&\n oldChild.data &&\n !isSameChild(child, oldChild) &&\n !isAsyncPlaceholder(oldChild) &&\n // #6687 component root is a comment node\n !(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment)\n ) {\n // replace old child transition data with fresh one\n // important for dynamic transitions!\n var oldData = oldChild.data.transition = extend({}, data);\n // handle transition mode\n if (mode === 'out-in') {\n // return placeholder node and queue update when leave finishes\n this._leaving = true;\n mergeVNodeHook(oldData, 'afterLeave', function () {\n this$1._leaving = false;\n this$1.$forceUpdate();\n });\n return placeholder(h, rawChild)\n } else if (mode === 'in-out') {\n if (isAsyncPlaceholder(child)) {\n return oldRawChild\n }\n var delayedLeave;\n var performLeave = function () { delayedLeave(); };\n mergeVNodeHook(data, 'afterEnter', performLeave);\n mergeVNodeHook(data, 'enterCancelled', performLeave);\n mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; });\n }\n }\n\n return rawChild\n }\n}\n\n/* */\n\n// Provides transition support for list items.\n// supports move transitions using the FLIP technique.\n\n// Because the vdom's children update algorithm is \"unstable\" - i.e.\n// it doesn't guarantee the relative positioning of removed elements,\n// we force transition-group to update its children into two passes:\n// in the first pass, we remove all nodes that need to be removed,\n// triggering their leaving transition; in the second pass, we insert/move\n// into the final desired state. This way in the second pass removed\n// nodes will remain where they should be.\n\nvar props = extend({\n tag: String,\n moveClass: String\n}, transitionProps);\n\ndelete props.mode;\n\nvar TransitionGroup = {\n props: props,\n\n render: function render (h) {\n var tag = this.tag || this.$vnode.data.tag || 'span';\n var map = Object.create(null);\n var prevChildren = this.prevChildren = this.children;\n var rawChildren = this.$slots.default || [];\n var children = this.children = [];\n var transitionData = extractTransitionData(this);\n\n for (var i = 0; i < rawChildren.length; i++) {\n var c = rawChildren[i];\n if (c.tag) {\n if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {\n children.push(c);\n map[c.key] = c\n ;(c.data || (c.data = {})).transition = transitionData;\n } else if (true) {\n var opts = c.componentOptions;\n var name = opts ? (opts.Ctor.options.name || opts.tag || '') : c.tag;\n warn((\"<transition-group> children must be keyed: <\" + name + \">\"));\n }\n }\n }\n\n if (prevChildren) {\n var kept = [];\n var removed = [];\n for (var i$1 = 0; i$1 < prevChildren.length; i$1++) {\n var c$1 = prevChildren[i$1];\n c$1.data.transition = transitionData;\n c$1.data.pos = c$1.elm.getBoundingClientRect();\n if (map[c$1.key]) {\n kept.push(c$1);\n } else {\n removed.push(c$1);\n }\n }\n this.kept = h(tag, null, kept);\n this.removed = removed;\n }\n\n return h(tag, null, children)\n },\n\n beforeUpdate: function beforeUpdate () {\n // force removing pass\n this.__patch__(\n this._vnode,\n this.kept,\n false, // hydrating\n true // removeOnly (!important, avoids unnecessary moves)\n );\n this._vnode = this.kept;\n },\n\n updated: function updated () {\n var children = this.prevChildren;\n var moveClass = this.moveClass || ((this.name || 'v') + '-move');\n if (!children.length || !this.hasMove(children[0].elm, moveClass)) {\n return\n }\n\n // we divide the work into three loops to avoid mixing DOM reads and writes\n // in each iteration - which helps prevent layout thrashing.\n children.forEach(callPendingCbs);\n children.forEach(recordPosition);\n children.forEach(applyTranslation);\n\n // force reflow to put everything in position\n // assign to this to avoid being removed in tree-shaking\n // $flow-disable-line\n this._reflow = document.body.offsetHeight;\n\n children.forEach(function (c) {\n if (c.data.moved) {\n var el = c.elm;\n var s = el.style;\n addTransitionClass(el, moveClass);\n s.transform = s.WebkitTransform = s.transitionDuration = '';\n el.addEventListener(transitionEndEvent, el._moveCb = function cb (e) {\n if (!e || /transform$/.test(e.propertyName)) {\n el.removeEventListener(transitionEndEvent, cb);\n el._moveCb = null;\n removeTransitionClass(el, moveClass);\n }\n });\n }\n });\n },\n\n methods: {\n hasMove: function hasMove (el, moveClass) {\n /* istanbul ignore if */\n if (!hasTransition) {\n return false\n }\n /* istanbul ignore if */\n if (this._hasMove) {\n return this._hasMove\n }\n // Detect whether an element with the move class applied has\n // CSS transitions. Since the element may be inside an entering\n // transition at this very moment, we make a clone of it and remove\n // all other transition classes applied to ensure only the move class\n // is applied.\n var clone = el.cloneNode();\n if (el._transitionClasses) {\n el._transitionClasses.forEach(function (cls) { removeClass(clone, cls); });\n }\n addClass(clone, moveClass);\n clone.style.display = 'none';\n this.$el.appendChild(clone);\n var info = getTransitionInfo(clone);\n this.$el.removeChild(clone);\n return (this._hasMove = info.hasTransform)\n }\n }\n}\n\nfunction callPendingCbs (c) {\n /* istanbul ignore if */\n if (c.elm._moveCb) {\n c.elm._moveCb();\n }\n /* istanbul ignore if */\n if (c.elm._enterCb) {\n c.elm._enterCb();\n }\n}\n\nfunction recordPosition (c) {\n c.data.newPos = c.elm.getBoundingClientRect();\n}\n\nfunction applyTranslation (c) {\n var oldPos = c.data.pos;\n var newPos = c.data.newPos;\n var dx = oldPos.left - newPos.left;\n var dy = oldPos.top - newPos.top;\n if (dx || dy) {\n c.data.moved = true;\n var s = c.elm.style;\n s.transform = s.WebkitTransform = \"translate(\" + dx + \"px,\" + dy + \"px)\";\n s.transitionDuration = '0s';\n }\n}\n\nvar platformComponents = {\n Transition: Transition,\n TransitionGroup: TransitionGroup\n}\n\n/* */\n\n// install platform specific utils\nVue.config.mustUseProp = mustUseProp;\nVue.config.isReservedTag = isReservedTag;\nVue.config.isReservedAttr = isReservedAttr;\nVue.config.getTagNamespace = getTagNamespace;\nVue.config.isUnknownElement = isUnknownElement;\n\n// install platform runtime directives & components\nextend(Vue.options.directives, platformDirectives);\nextend(Vue.options.components, platformComponents);\n\n// install platform patch function\nVue.prototype.__patch__ = inBrowser ? patch : noop;\n\n// public mount method\nVue.prototype.$mount = function (\n el,\n hydrating\n) {\n el = el && inBrowser ? query(el) : undefined;\n return mountComponent(this, el, hydrating)\n};\n\n// devtools global hook\n/* istanbul ignore next */\nif (inBrowser) {\n setTimeout(function () {\n if (config.devtools) {\n if (devtools) {\n devtools.emit('init', Vue);\n } else if (\n \"development\" !== 'production' &&\n \"development\" !== 'test' &&\n isChrome\n ) {\n console[console.info ? 'info' : 'log'](\n 'Download the Vue Devtools extension for a better development experience:\\n' +\n 'https://github.com/vuejs/vue-devtools'\n );\n }\n }\n if (\"development\" !== 'production' &&\n \"development\" !== 'test' &&\n config.productionTip !== false &&\n typeof console !== 'undefined'\n ) {\n console[console.info ? 'info' : 'log'](\n \"You are running Vue in development mode.\\n\" +\n \"Make sure to turn on production mode when deploying for production.\\n\" +\n \"See more tips at https://vuejs.org/guide/deployment.html\"\n );\n }\n }, 0);\n}\n\n/* */\n\nvar defaultTagRE = /\\{\\{((?:.|\\n)+?)\\}\\}/g;\nvar regexEscapeRE = /[-.*+?^${}()|[\\]\\/\\\\]/g;\n\nvar buildRegex = cached(function (delimiters) {\n var open = delimiters[0].replace(regexEscapeRE, '\\\\$&');\n var close = delimiters[1].replace(regexEscapeRE, '\\\\$&');\n return new RegExp(open + '((?:.|\\\\n)+?)' + close, 'g')\n});\n\n\n\nfunction parseText (\n text,\n delimiters\n) {\n var tagRE = delimiters ? buildRegex(delimiters) : defaultTagRE;\n if (!tagRE.test(text)) {\n return\n }\n var tokens = [];\n var rawTokens = [];\n var lastIndex = tagRE.lastIndex = 0;\n var match, index, tokenValue;\n while ((match = tagRE.exec(text))) {\n index = match.index;\n // push text token\n if (index > lastIndex) {\n rawTokens.push(tokenValue = text.slice(lastIndex, index));\n tokens.push(JSON.stringify(tokenValue));\n }\n // tag token\n var exp = parseFilters(match[1].trim());\n tokens.push((\"_s(\" + exp + \")\"));\n rawTokens.push({ '@binding': exp });\n lastIndex = index + match[0].length;\n }\n if (lastIndex < text.length) {\n rawTokens.push(tokenValue = text.slice(lastIndex));\n tokens.push(JSON.stringify(tokenValue));\n }\n return {\n expression: tokens.join('+'),\n tokens: rawTokens\n }\n}\n\n/* */\n\nfunction transformNode (el, options) {\n var warn = options.warn || baseWarn;\n var staticClass = getAndRemoveAttr(el, 'class');\n if (\"development\" !== 'production' && staticClass) {\n var res = parseText(staticClass, options.delimiters);\n if (res) {\n warn(\n \"class=\\\"\" + staticClass + \"\\\": \" +\n 'Interpolation inside attributes has been removed. ' +\n 'Use v-bind or the colon shorthand instead. For example, ' +\n 'instead of <div class=\"{{ val }}\">, use <div :class=\"val\">.'\n );\n }\n }\n if (staticClass) {\n el.staticClass = JSON.stringify(staticClass);\n }\n var classBinding = getBindingAttr(el, 'class', false /* getStatic */);\n if (classBinding) {\n el.classBinding = classBinding;\n }\n}\n\nfunction genData (el) {\n var data = '';\n if (el.staticClass) {\n data += \"staticClass:\" + (el.staticClass) + \",\";\n }\n if (el.classBinding) {\n data += \"class:\" + (el.classBinding) + \",\";\n }\n return data\n}\n\nvar klass$1 = {\n staticKeys: ['staticClass'],\n transformNode: transformNode,\n genData: genData\n}\n\n/* */\n\nfunction transformNode$1 (el, options) {\n var warn = options.warn || baseWarn;\n var staticStyle = getAndRemoveAttr(el, 'style');\n if (staticStyle) {\n /* istanbul ignore if */\n if (true) {\n var res = parseText(staticStyle, options.delimiters);\n if (res) {\n warn(\n \"style=\\\"\" + staticStyle + \"\\\": \" +\n 'Interpolation inside attributes has been removed. ' +\n 'Use v-bind or the colon shorthand instead. For example, ' +\n 'instead of <div style=\"{{ val }}\">, use <div :style=\"val\">.'\n );\n }\n }\n el.staticStyle = JSON.stringify(parseStyleText(staticStyle));\n }\n\n var styleBinding = getBindingAttr(el, 'style', false /* getStatic */);\n if (styleBinding) {\n el.styleBinding = styleBinding;\n }\n}\n\nfunction genData$1 (el) {\n var data = '';\n if (el.staticStyle) {\n data += \"staticStyle:\" + (el.staticStyle) + \",\";\n }\n if (el.styleBinding) {\n data += \"style:(\" + (el.styleBinding) + \"),\";\n }\n return data\n}\n\nvar style$1 = {\n staticKeys: ['staticStyle'],\n transformNode: transformNode$1,\n genData: genData$1\n}\n\n/* */\n\nvar decoder;\n\nvar he = {\n decode: function decode (html) {\n decoder = decoder || document.createElement('div');\n decoder.innerHTML = html;\n return decoder.textContent\n }\n}\n\n/* */\n\nvar isUnaryTag = makeMap(\n 'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +\n 'link,meta,param,source,track,wbr'\n);\n\n// Elements that you can, intentionally, leave open\n// (and which close themselves)\nvar canBeLeftOpenTag = makeMap(\n 'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source'\n);\n\n// HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3\n// Phrasing Content https://html.spec.whatwg.org/multipage/dom.html#phrasing-content\nvar isNonPhrasingTag = makeMap(\n 'address,article,aside,base,blockquote,body,caption,col,colgroup,dd,' +\n 'details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,' +\n 'h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,' +\n 'optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,' +\n 'title,tr,track'\n);\n\n/**\n * Not type-checking this file because it's mostly vendor code.\n */\n\n/*!\n * HTML Parser By John Resig (ejohn.org)\n * Modified by Juriy \"kangax\" Zaytsev\n * Original code by Erik Arvidsson, Mozilla Public License\n * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js\n */\n\n// Regular Expressions for parsing tags and attributes\nvar attribute = /^\\s*([^\\s\"'<>\\/=]+)(?:\\s*(=)\\s*(?:\"([^\"]*)\"+|'([^']*)'+|([^\\s\"'=<>`]+)))?/;\n// could use https://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-QName\n// but for Vue templates we can enforce a simple charset\nvar ncname = '[a-zA-Z_][\\\\w\\\\-\\\\.]*';\nvar qnameCapture = \"((?:\" + ncname + \"\\\\:)?\" + ncname + \")\";\nvar startTagOpen = new RegExp((\"^<\" + qnameCapture));\nvar startTagClose = /^\\s*(\\/?)>/;\nvar endTag = new RegExp((\"^<\\\\/\" + qnameCapture + \"[^>]*>\"));\nvar doctype = /^<!DOCTYPE [^>]+>/i;\n// #7298: escape - to avoid being pased as HTML comment when inlined in page\nvar comment = /^<!\\--/;\nvar conditionalComment = /^<!\\[/;\n\nvar IS_REGEX_CAPTURING_BROKEN = false;\n'x'.replace(/x(.)?/g, function (m, g) {\n IS_REGEX_CAPTURING_BROKEN = g === '';\n});\n\n// Special Elements (can contain anything)\nvar isPlainTextElement = makeMap('script,style,textarea', true);\nvar reCache = {};\n\nvar decodingMap = {\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&amp;': '&',\n '&#10;': '\\n',\n '&#9;': '\\t'\n};\nvar encodedAttr = /&(?:lt|gt|quot|amp);/g;\nvar encodedAttrWithNewLines = /&(?:lt|gt|quot|amp|#10|#9);/g;\n\n// #5992\nvar isIgnoreNewlineTag = makeMap('pre,textarea', true);\nvar shouldIgnoreFirstNewline = function (tag, html) { return tag && isIgnoreNewlineTag(tag) && html[0] === '\\n'; };\n\nfunction decodeAttr (value, shouldDecodeNewlines) {\n var re = shouldDecodeNewlines ? encodedAttrWithNewLines : encodedAttr;\n return value.replace(re, function (match) { return decodingMap[match]; })\n}\n\nfunction parseHTML (html, options) {\n var stack = [];\n var expectHTML = options.expectHTML;\n var isUnaryTag$$1 = options.isUnaryTag || no;\n var canBeLeftOpenTag$$1 = options.canBeLeftOpenTag || no;\n var index = 0;\n var last, lastTag;\n while (html) {\n last = html;\n // Make sure we're not in a plaintext content element like script/style\n if (!lastTag || !isPlainTextElement(lastTag)) {\n var textEnd = html.indexOf('<');\n if (textEnd === 0) {\n // Comment:\n if (comment.test(html)) {\n var commentEnd = html.indexOf('-->');\n\n if (commentEnd >= 0) {\n if (options.shouldKeepComment) {\n options.comment(html.substring(4, commentEnd));\n }\n advance(commentEnd + 3);\n continue\n }\n }\n\n // http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment\n if (conditionalComment.test(html)) {\n var conditionalEnd = html.indexOf(']>');\n\n if (conditionalEnd >= 0) {\n advance(conditionalEnd + 2);\n continue\n }\n }\n\n // Doctype:\n var doctypeMatch = html.match(doctype);\n if (doctypeMatch) {\n advance(doctypeMatch[0].length);\n continue\n }\n\n // End tag:\n var endTagMatch = html.match(endTag);\n if (endTagMatch) {\n var curIndex = index;\n advance(endTagMatch[0].length);\n parseEndTag(endTagMatch[1], curIndex, index);\n continue\n }\n\n // Start tag:\n var startTagMatch = parseStartTag();\n if (startTagMatch) {\n handleStartTag(startTagMatch);\n if (shouldIgnoreFirstNewline(lastTag, html)) {\n advance(1);\n }\n continue\n }\n }\n\n var text = (void 0), rest = (void 0), next = (void 0);\n if (textEnd >= 0) {\n rest = html.slice(textEnd);\n while (\n !endTag.test(rest) &&\n !startTagOpen.test(rest) &&\n !comment.test(rest) &&\n !conditionalComment.test(rest)\n ) {\n // < in plain text, be forgiving and treat it as text\n next = rest.indexOf('<', 1);\n if (next < 0) { break }\n textEnd += next;\n rest = html.slice(textEnd);\n }\n text = html.substring(0, textEnd);\n advance(textEnd);\n }\n\n if (textEnd < 0) {\n text = html;\n html = '';\n }\n\n if (options.chars && text) {\n options.chars(text);\n }\n } else {\n var endTagLength = 0;\n var stackedTag = lastTag.toLowerCase();\n var reStackedTag = reCache[stackedTag] || (reCache[stackedTag] = new RegExp('([\\\\s\\\\S]*?)(</' + stackedTag + '[^>]*>)', 'i'));\n var rest$1 = html.replace(reStackedTag, function (all, text, endTag) {\n endTagLength = endTag.length;\n if (!isPlainTextElement(stackedTag) && stackedTag !== 'noscript') {\n text = text\n .replace(/<!\\--([\\s\\S]*?)-->/g, '$1') // #7298\n .replace(/<!\\[CDATA\\[([\\s\\S]*?)]]>/g, '$1');\n }\n if (shouldIgnoreFirstNewline(stackedTag, text)) {\n text = text.slice(1);\n }\n if (options.chars) {\n options.chars(text);\n }\n return ''\n });\n index += html.length - rest$1.length;\n html = rest$1;\n parseEndTag(stackedTag, index - endTagLength, index);\n }\n\n if (html === last) {\n options.chars && options.chars(html);\n if (\"development\" !== 'production' && !stack.length && options.warn) {\n options.warn((\"Mal-formatted tag at end of template: \\\"\" + html + \"\\\"\"));\n }\n break\n }\n }\n\n // Clean up any remaining tags\n parseEndTag();\n\n function advance (n) {\n index += n;\n html = html.substring(n);\n }\n\n function parseStartTag () {\n var start = html.match(startTagOpen);\n if (start) {\n var match = {\n tagName: start[1],\n attrs: [],\n start: index\n };\n advance(start[0].length);\n var end, attr;\n while (!(end = html.match(startTagClose)) && (attr = html.match(attribute))) {\n advance(attr[0].length);\n match.attrs.push(attr);\n }\n if (end) {\n match.unarySlash = end[1];\n advance(end[0].length);\n match.end = index;\n return match\n }\n }\n }\n\n function handleStartTag (match) {\n var tagName = match.tagName;\n var unarySlash = match.unarySlash;\n\n if (expectHTML) {\n if (lastTag === 'p' && isNonPhrasingTag(tagName)) {\n parseEndTag(lastTag);\n }\n if (canBeLeftOpenTag$$1(tagName) && lastTag === tagName) {\n parseEndTag(tagName);\n }\n }\n\n var unary = isUnaryTag$$1(tagName) || !!unarySlash;\n\n var l = match.attrs.length;\n var attrs = new Array(l);\n for (var i = 0; i < l; i++) {\n var args = match.attrs[i];\n // hackish work around FF bug https://bugzilla.mozilla.org/show_bug.cgi?id=369778\n if (IS_REGEX_CAPTURING_BROKEN && args[0].indexOf('\"\"') === -1) {\n if (args[3] === '') { delete args[3]; }\n if (args[4] === '') { delete args[4]; }\n if (args[5] === '') { delete args[5]; }\n }\n var value = args[3] || args[4] || args[5] || '';\n var shouldDecodeNewlines = tagName === 'a' && args[1] === 'href'\n ? options.shouldDecodeNewlinesForHref\n : options.shouldDecodeNewlines;\n attrs[i] = {\n name: args[1],\n value: decodeAttr(value, shouldDecodeNewlines)\n };\n }\n\n if (!unary) {\n stack.push({ tag: tagName, lowerCasedTag: tagName.toLowerCase(), attrs: attrs });\n lastTag = tagName;\n }\n\n if (options.start) {\n options.start(tagName, attrs, unary, match.start, match.end);\n }\n }\n\n function parseEndTag (tagName, start, end) {\n var pos, lowerCasedTagName;\n if (start == null) { start = index; }\n if (end == null) { end = index; }\n\n if (tagName) {\n lowerCasedTagName = tagName.toLowerCase();\n }\n\n // Find the closest opened tag of the same type\n if (tagName) {\n for (pos = stack.length - 1; pos >= 0; pos--) {\n if (stack[pos].lowerCasedTag === lowerCasedTagName) {\n break\n }\n }\n } else {\n // If no tag name is provided, clean shop\n pos = 0;\n }\n\n if (pos >= 0) {\n // Close all the open elements, up the stack\n for (var i = stack.length - 1; i >= pos; i--) {\n if (\"development\" !== 'production' &&\n (i > pos || !tagName) &&\n options.warn\n ) {\n options.warn(\n (\"tag <\" + (stack[i].tag) + \"> has no matching end tag.\")\n );\n }\n if (options.end) {\n options.end(stack[i].tag, start, end);\n }\n }\n\n // Remove the open elements from the stack\n stack.length = pos;\n lastTag = pos && stack[pos - 1].tag;\n } else if (lowerCasedTagName === 'br') {\n if (options.start) {\n options.start(tagName, [], true, start, end);\n }\n } else if (lowerCasedTagName === 'p') {\n if (options.start) {\n options.start(tagName, [], false, start, end);\n }\n if (options.end) {\n options.end(tagName, start, end);\n }\n }\n }\n}\n\n/* */\n\nvar onRE = /^@|^v-on:/;\nvar dirRE = /^v-|^@|^:/;\nvar forAliasRE = /([^]*?)\\s+(?:in|of)\\s+([^]*)/;\nvar forIteratorRE = /,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/;\nvar stripParensRE = /^\\(|\\)$/g;\n\nvar argRE = /:(.*)$/;\nvar bindRE = /^:|^v-bind:/;\nvar modifierRE = /\\.[^.]+/g;\n\nvar decodeHTMLCached = cached(he.decode);\n\n// configurable state\nvar warn$2;\nvar delimiters;\nvar transforms;\nvar preTransforms;\nvar postTransforms;\nvar platformIsPreTag;\nvar platformMustUseProp;\nvar platformGetTagNamespace;\n\n\n\nfunction createASTElement (\n tag,\n attrs,\n parent\n) {\n return {\n type: 1,\n tag: tag,\n attrsList: attrs,\n attrsMap: makeAttrsMap(attrs),\n parent: parent,\n children: []\n }\n}\n\n/**\n * Convert HTML string to AST.\n */\nfunction parse (\n template,\n options\n) {\n warn$2 = options.warn || baseWarn;\n\n platformIsPreTag = options.isPreTag || no;\n platformMustUseProp = options.mustUseProp || no;\n platformGetTagNamespace = options.getTagNamespace || no;\n\n transforms = pluckModuleFunction(options.modules, 'transformNode');\n preTransforms = pluckModuleFunction(options.modules, 'preTransformNode');\n postTransforms = pluckModuleFunction(options.modules, 'postTransformNode');\n\n delimiters = options.delimiters;\n\n var stack = [];\n var preserveWhitespace = options.preserveWhitespace !== false;\n var root;\n var currentParent;\n var inVPre = false;\n var inPre = false;\n var warned = false;\n\n function warnOnce (msg) {\n if (!warned) {\n warned = true;\n warn$2(msg);\n }\n }\n\n function closeElement (element) {\n // check pre state\n if (element.pre) {\n inVPre = false;\n }\n if (platformIsPreTag(element.tag)) {\n inPre = false;\n }\n // apply post-transforms\n for (var i = 0; i < postTransforms.length; i++) {\n postTransforms[i](element, options);\n }\n }\n\n parseHTML(template, {\n warn: warn$2,\n expectHTML: options.expectHTML,\n isUnaryTag: options.isUnaryTag,\n canBeLeftOpenTag: options.canBeLeftOpenTag,\n shouldDecodeNewlines: options.shouldDecodeNewlines,\n shouldDecodeNewlinesForHref: options.shouldDecodeNewlinesForHref,\n shouldKeepComment: options.comments,\n start: function start (tag, attrs, unary) {\n // check namespace.\n // inherit parent ns if there is one\n var ns = (currentParent && currentParent.ns) || platformGetTagNamespace(tag);\n\n // handle IE svg bug\n /* istanbul ignore if */\n if (isIE && ns === 'svg') {\n attrs = guardIESVGBug(attrs);\n }\n\n var element = createASTElement(tag, attrs, currentParent);\n if (ns) {\n element.ns = ns;\n }\n\n if (isForbiddenTag(element) && !isServerRendering()) {\n element.forbidden = true;\n \"development\" !== 'production' && warn$2(\n 'Templates should only be responsible for mapping the state to the ' +\n 'UI. Avoid placing tags with side-effects in your templates, such as ' +\n \"<\" + tag + \">\" + ', as they will not be parsed.'\n );\n }\n\n // apply pre-transforms\n for (var i = 0; i < preTransforms.length; i++) {\n element = preTransforms[i](element, options) || element;\n }\n\n if (!inVPre) {\n processPre(element);\n if (element.pre) {\n inVPre = true;\n }\n }\n if (platformIsPreTag(element.tag)) {\n inPre = true;\n }\n if (inVPre) {\n processRawAttrs(element);\n } else if (!element.processed) {\n // structural directives\n processFor(element);\n processIf(element);\n processOnce(element);\n // element-scope stuff\n processElement(element, options);\n }\n\n function checkRootConstraints (el) {\n if (true) {\n if (el.tag === 'slot' || el.tag === 'template') {\n warnOnce(\n \"Cannot use <\" + (el.tag) + \"> as component root element because it may \" +\n 'contain multiple nodes.'\n );\n }\n if (el.attrsMap.hasOwnProperty('v-for')) {\n warnOnce(\n 'Cannot use v-for on stateful component root element because ' +\n 'it renders multiple elements.'\n );\n }\n }\n }\n\n // tree management\n if (!root) {\n root = element;\n checkRootConstraints(root);\n } else if (!stack.length) {\n // allow root elements with v-if, v-else-if and v-else\n if (root.if && (element.elseif || element.else)) {\n checkRootConstraints(element);\n addIfCondition(root, {\n exp: element.elseif,\n block: element\n });\n } else if (true) {\n warnOnce(\n \"Component template should contain exactly one root element. \" +\n \"If you are using v-if on multiple elements, \" +\n \"use v-else-if to chain them instead.\"\n );\n }\n }\n if (currentParent && !element.forbidden) {\n if (element.elseif || element.else) {\n processIfConditions(element, currentParent);\n } else if (element.slotScope) { // scoped slot\n currentParent.plain = false;\n var name = element.slotTarget || '\"default\"';(currentParent.scopedSlots || (currentParent.scopedSlots = {}))[name] = element;\n } else {\n currentParent.children.push(element);\n element.parent = currentParent;\n }\n }\n if (!unary) {\n currentParent = element;\n stack.push(element);\n } else {\n closeElement(element);\n }\n },\n\n end: function end () {\n // remove trailing whitespace\n var element = stack[stack.length - 1];\n var lastNode = element.children[element.children.length - 1];\n if (lastNode && lastNode.type === 3 && lastNode.text === ' ' && !inPre) {\n element.children.pop();\n }\n // pop stack\n stack.length -= 1;\n currentParent = stack[stack.length - 1];\n closeElement(element);\n },\n\n chars: function chars (text) {\n if (!currentParent) {\n if (true) {\n if (text === template) {\n warnOnce(\n 'Component template requires a root element, rather than just text.'\n );\n } else if ((text = text.trim())) {\n warnOnce(\n (\"text \\\"\" + text + \"\\\" outside root element will be ignored.\")\n );\n }\n }\n return\n }\n // IE textarea placeholder bug\n /* istanbul ignore if */\n if (isIE &&\n currentParent.tag === 'textarea' &&\n currentParent.attrsMap.placeholder === text\n ) {\n return\n }\n var children = currentParent.children;\n text = inPre || text.trim()\n ? isTextTag(currentParent) ? text : decodeHTMLCached(text)\n // only preserve whitespace if its not right after a starting tag\n : preserveWhitespace && children.length ? ' ' : '';\n if (text) {\n var res;\n if (!inVPre && text !== ' ' && (res = parseText(text, delimiters))) {\n children.push({\n type: 2,\n expression: res.expression,\n tokens: res.tokens,\n text: text\n });\n } else if (text !== ' ' || !children.length || children[children.length - 1].text !== ' ') {\n children.push({\n type: 3,\n text: text\n });\n }\n }\n },\n comment: function comment (text) {\n currentParent.children.push({\n type: 3,\n text: text,\n isComment: true\n });\n }\n });\n return root\n}\n\nfunction processPre (el) {\n if (getAndRemoveAttr(el, 'v-pre') != null) {\n el.pre = true;\n }\n}\n\nfunction processRawAttrs (el) {\n var l = el.attrsList.length;\n if (l) {\n var attrs = el.attrs = new Array(l);\n for (var i = 0; i < l; i++) {\n attrs[i] = {\n name: el.attrsList[i].name,\n value: JSON.stringify(el.attrsList[i].value)\n };\n }\n } else if (!el.pre) {\n // non root node in pre blocks with no attributes\n el.plain = true;\n }\n}\n\nfunction processElement (element, options) {\n processKey(element);\n\n // determine whether this is a plain element after\n // removing structural attributes\n element.plain = !element.key && !element.attrsList.length;\n\n processRef(element);\n processSlot(element);\n processComponent(element);\n for (var i = 0; i < transforms.length; i++) {\n element = transforms[i](element, options) || element;\n }\n processAttrs(element);\n}\n\nfunction processKey (el) {\n var exp = getBindingAttr(el, 'key');\n if (exp) {\n if (\"development\" !== 'production' && el.tag === 'template') {\n warn$2(\"<template> cannot be keyed. Place the key on real elements instead.\");\n }\n el.key = exp;\n }\n}\n\nfunction processRef (el) {\n var ref = getBindingAttr(el, 'ref');\n if (ref) {\n el.ref = ref;\n el.refInFor = checkInFor(el);\n }\n}\n\nfunction processFor (el) {\n var exp;\n if ((exp = getAndRemoveAttr(el, 'v-for'))) {\n var res = parseFor(exp);\n if (res) {\n extend(el, res);\n } else if (true) {\n warn$2(\n (\"Invalid v-for expression: \" + exp)\n );\n }\n }\n}\n\n\n\nfunction parseFor (exp) {\n var inMatch = exp.match(forAliasRE);\n if (!inMatch) { return }\n var res = {};\n res.for = inMatch[2].trim();\n var alias = inMatch[1].trim().replace(stripParensRE, '');\n var iteratorMatch = alias.match(forIteratorRE);\n if (iteratorMatch) {\n res.alias = alias.replace(forIteratorRE, '');\n res.iterator1 = iteratorMatch[1].trim();\n if (iteratorMatch[2]) {\n res.iterator2 = iteratorMatch[2].trim();\n }\n } else {\n res.alias = alias;\n }\n return res\n}\n\nfunction processIf (el) {\n var exp = getAndRemoveAttr(el, 'v-if');\n if (exp) {\n el.if = exp;\n addIfCondition(el, {\n exp: exp,\n block: el\n });\n } else {\n if (getAndRemoveAttr(el, 'v-else') != null) {\n el.else = true;\n }\n var elseif = getAndRemoveAttr(el, 'v-else-if');\n if (elseif) {\n el.elseif = elseif;\n }\n }\n}\n\nfunction processIfConditions (el, parent) {\n var prev = findPrevElement(parent.children);\n if (prev && prev.if) {\n addIfCondition(prev, {\n exp: el.elseif,\n block: el\n });\n } else if (true) {\n warn$2(\n \"v-\" + (el.elseif ? ('else-if=\"' + el.elseif + '\"') : 'else') + \" \" +\n \"used on element <\" + (el.tag) + \"> without corresponding v-if.\"\n );\n }\n}\n\nfunction findPrevElement (children) {\n var i = children.length;\n while (i--) {\n if (children[i].type === 1) {\n return children[i]\n } else {\n if (\"development\" !== 'production' && children[i].text !== ' ') {\n warn$2(\n \"text \\\"\" + (children[i].text.trim()) + \"\\\" between v-if and v-else(-if) \" +\n \"will be ignored.\"\n );\n }\n children.pop();\n }\n }\n}\n\nfunction addIfCondition (el, condition) {\n if (!el.ifConditions) {\n el.ifConditions = [];\n }\n el.ifConditions.push(condition);\n}\n\nfunction processOnce (el) {\n var once$$1 = getAndRemoveAttr(el, 'v-once');\n if (once$$1 != null) {\n el.once = true;\n }\n}\n\nfunction processSlot (el) {\n if (el.tag === 'slot') {\n el.slotName = getBindingAttr(el, 'name');\n if (\"development\" !== 'production' && el.key) {\n warn$2(\n \"`key` does not work on <slot> because slots are abstract outlets \" +\n \"and can possibly expand into multiple elements. \" +\n \"Use the key on a wrapping element instead.\"\n );\n }\n } else {\n var slotScope;\n if (el.tag === 'template') {\n slotScope = getAndRemoveAttr(el, 'scope');\n /* istanbul ignore if */\n if (\"development\" !== 'production' && slotScope) {\n warn$2(\n \"the \\\"scope\\\" attribute for scoped slots have been deprecated and \" +\n \"replaced by \\\"slot-scope\\\" since 2.5. The new \\\"slot-scope\\\" attribute \" +\n \"can also be used on plain elements in addition to <template> to \" +\n \"denote scoped slots.\",\n true\n );\n }\n el.slotScope = slotScope || getAndRemoveAttr(el, 'slot-scope');\n } else if ((slotScope = getAndRemoveAttr(el, 'slot-scope'))) {\n /* istanbul ignore if */\n if (\"development\" !== 'production' && el.attrsMap['v-for']) {\n warn$2(\n \"Ambiguous combined usage of slot-scope and v-for on <\" + (el.tag) + \"> \" +\n \"(v-for takes higher priority). Use a wrapper <template> for the \" +\n \"scoped slot to make it clearer.\",\n true\n );\n }\n el.slotScope = slotScope;\n }\n var slotTarget = getBindingAttr(el, 'slot');\n if (slotTarget) {\n el.slotTarget = slotTarget === '\"\"' ? '\"default\"' : slotTarget;\n // preserve slot as an attribute for native shadow DOM compat\n // only for non-scoped slots.\n if (el.tag !== 'template' && !el.slotScope) {\n addAttr(el, 'slot', slotTarget);\n }\n }\n }\n}\n\nfunction processComponent (el) {\n var binding;\n if ((binding = getBindingAttr(el, 'is'))) {\n el.component = binding;\n }\n if (getAndRemoveAttr(el, 'inline-template') != null) {\n el.inlineTemplate = true;\n }\n}\n\nfunction processAttrs (el) {\n var list = el.attrsList;\n var i, l, name, rawName, value, modifiers, isProp;\n for (i = 0, l = list.length; i < l; i++) {\n name = rawName = list[i].name;\n value = list[i].value;\n if (dirRE.test(name)) {\n // mark element as dynamic\n el.hasBindings = true;\n // modifiers\n modifiers = parseModifiers(name);\n if (modifiers) {\n name = name.replace(modifierRE, '');\n }\n if (bindRE.test(name)) { // v-bind\n name = name.replace(bindRE, '');\n value = parseFilters(value);\n isProp = false;\n if (modifiers) {\n if (modifiers.prop) {\n isProp = true;\n name = camelize(name);\n if (name === 'innerHtml') { name = 'innerHTML'; }\n }\n if (modifiers.camel) {\n name = camelize(name);\n }\n if (modifiers.sync) {\n addHandler(\n el,\n (\"update:\" + (camelize(name))),\n genAssignmentCode(value, \"$event\")\n );\n }\n }\n if (isProp || (\n !el.component && platformMustUseProp(el.tag, el.attrsMap.type, name)\n )) {\n addProp(el, name, value);\n } else {\n addAttr(el, name, value);\n }\n } else if (onRE.test(name)) { // v-on\n name = name.replace(onRE, '');\n addHandler(el, name, value, modifiers, false, warn$2);\n } else { // normal directives\n name = name.replace(dirRE, '');\n // parse arg\n var argMatch = name.match(argRE);\n var arg = argMatch && argMatch[1];\n if (arg) {\n name = name.slice(0, -(arg.length + 1));\n }\n addDirective(el, name, rawName, value, arg, modifiers);\n if (\"development\" !== 'production' && name === 'model') {\n checkForAliasModel(el, value);\n }\n }\n } else {\n // literal attribute\n if (true) {\n var res = parseText(value, delimiters);\n if (res) {\n warn$2(\n name + \"=\\\"\" + value + \"\\\": \" +\n 'Interpolation inside attributes has been removed. ' +\n 'Use v-bind or the colon shorthand instead. For example, ' +\n 'instead of <div id=\"{{ val }}\">, use <div :id=\"val\">.'\n );\n }\n }\n addAttr(el, name, JSON.stringify(value));\n // #6887 firefox doesn't update muted state if set via attribute\n // even immediately after element creation\n if (!el.component &&\n name === 'muted' &&\n platformMustUseProp(el.tag, el.attrsMap.type, name)) {\n addProp(el, name, 'true');\n }\n }\n }\n}\n\nfunction checkInFor (el) {\n var parent = el;\n while (parent) {\n if (parent.for !== undefined) {\n return true\n }\n parent = parent.parent;\n }\n return false\n}\n\nfunction parseModifiers (name) {\n var match = name.match(modifierRE);\n if (match) {\n var ret = {};\n match.forEach(function (m) { ret[m.slice(1)] = true; });\n return ret\n }\n}\n\nfunction makeAttrsMap (attrs) {\n var map = {};\n for (var i = 0, l = attrs.length; i < l; i++) {\n if (\n \"development\" !== 'production' &&\n map[attrs[i].name] && !isIE && !isEdge\n ) {\n warn$2('duplicate attribute: ' + attrs[i].name);\n }\n map[attrs[i].name] = attrs[i].value;\n }\n return map\n}\n\n// for script (e.g. type=\"x/template\") or style, do not decode content\nfunction isTextTag (el) {\n return el.tag === 'script' || el.tag === 'style'\n}\n\nfunction isForbiddenTag (el) {\n return (\n el.tag === 'style' ||\n (el.tag === 'script' && (\n !el.attrsMap.type ||\n el.attrsMap.type === 'text/javascript'\n ))\n )\n}\n\nvar ieNSBug = /^xmlns:NS\\d+/;\nvar ieNSPrefix = /^NS\\d+:/;\n\n/* istanbul ignore next */\nfunction guardIESVGBug (attrs) {\n var res = [];\n for (var i = 0; i < attrs.length; i++) {\n var attr = attrs[i];\n if (!ieNSBug.test(attr.name)) {\n attr.name = attr.name.replace(ieNSPrefix, '');\n res.push(attr);\n }\n }\n return res\n}\n\nfunction checkForAliasModel (el, value) {\n var _el = el;\n while (_el) {\n if (_el.for && _el.alias === value) {\n warn$2(\n \"<\" + (el.tag) + \" v-model=\\\"\" + value + \"\\\">: \" +\n \"You are binding v-model directly to a v-for iteration alias. \" +\n \"This will not be able to modify the v-for source array because \" +\n \"writing to the alias is like modifying a function local variable. \" +\n \"Consider using an array of objects and use v-model on an object property instead.\"\n );\n }\n _el = _el.parent;\n }\n}\n\n/* */\n\n/**\n * Expand input[v-model] with dyanmic type bindings into v-if-else chains\n * Turn this:\n * <input v-model=\"data[type]\" :type=\"type\">\n * into this:\n * <input v-if=\"type === 'checkbox'\" type=\"checkbox\" v-model=\"data[type]\">\n * <input v-else-if=\"type === 'radio'\" type=\"radio\" v-model=\"data[type]\">\n * <input v-else :type=\"type\" v-model=\"data[type]\">\n */\n\nfunction preTransformNode (el, options) {\n if (el.tag === 'input') {\n var map = el.attrsMap;\n if (!map['v-model']) {\n return\n }\n\n var typeBinding;\n if (map[':type'] || map['v-bind:type']) {\n typeBinding = getBindingAttr(el, 'type');\n }\n if (!map.type && !typeBinding && map['v-bind']) {\n typeBinding = \"(\" + (map['v-bind']) + \").type\";\n }\n\n if (typeBinding) {\n var ifCondition = getAndRemoveAttr(el, 'v-if', true);\n var ifConditionExtra = ifCondition ? (\"&&(\" + ifCondition + \")\") : \"\";\n var hasElse = getAndRemoveAttr(el, 'v-else', true) != null;\n var elseIfCondition = getAndRemoveAttr(el, 'v-else-if', true);\n // 1. checkbox\n var branch0 = cloneASTElement(el);\n // process for on the main node\n processFor(branch0);\n addRawAttr(branch0, 'type', 'checkbox');\n processElement(branch0, options);\n branch0.processed = true; // prevent it from double-processed\n branch0.if = \"(\" + typeBinding + \")==='checkbox'\" + ifConditionExtra;\n addIfCondition(branch0, {\n exp: branch0.if,\n block: branch0\n });\n // 2. add radio else-if condition\n var branch1 = cloneASTElement(el);\n getAndRemoveAttr(branch1, 'v-for', true);\n addRawAttr(branch1, 'type', 'radio');\n processElement(branch1, options);\n addIfCondition(branch0, {\n exp: \"(\" + typeBinding + \")==='radio'\" + ifConditionExtra,\n block: branch1\n });\n // 3. other\n var branch2 = cloneASTElement(el);\n getAndRemoveAttr(branch2, 'v-for', true);\n addRawAttr(branch2, ':type', typeBinding);\n processElement(branch2, options);\n addIfCondition(branch0, {\n exp: ifCondition,\n block: branch2\n });\n\n if (hasElse) {\n branch0.else = true;\n } else if (elseIfCondition) {\n branch0.elseif = elseIfCondition;\n }\n\n return branch0\n }\n }\n}\n\nfunction cloneASTElement (el) {\n return createASTElement(el.tag, el.attrsList.slice(), el.parent)\n}\n\nvar model$2 = {\n preTransformNode: preTransformNode\n}\n\nvar modules$1 = [\n klass$1,\n style$1,\n model$2\n]\n\n/* */\n\nfunction text (el, dir) {\n if (dir.value) {\n addProp(el, 'textContent', (\"_s(\" + (dir.value) + \")\"));\n }\n}\n\n/* */\n\nfunction html (el, dir) {\n if (dir.value) {\n addProp(el, 'innerHTML', (\"_s(\" + (dir.value) + \")\"));\n }\n}\n\nvar directives$1 = {\n model: model,\n text: text,\n html: html\n}\n\n/* */\n\nvar baseOptions = {\n expectHTML: true,\n modules: modules$1,\n directives: directives$1,\n isPreTag: isPreTag,\n isUnaryTag: isUnaryTag,\n mustUseProp: mustUseProp,\n canBeLeftOpenTag: canBeLeftOpenTag,\n isReservedTag: isReservedTag,\n getTagNamespace: getTagNamespace,\n staticKeys: genStaticKeys(modules$1)\n};\n\n/* */\n\nvar isStaticKey;\nvar isPlatformReservedTag;\n\nvar genStaticKeysCached = cached(genStaticKeys$1);\n\n/**\n * Goal of the optimizer: walk the generated template AST tree\n * and detect sub-trees that are purely static, i.e. parts of\n * the DOM that never needs to change.\n *\n * Once we detect these sub-trees, we can:\n *\n * 1. Hoist them into constants, so that we no longer need to\n * create fresh nodes for them on each re-render;\n * 2. Completely skip them in the patching process.\n */\nfunction optimize (root, options) {\n if (!root) { return }\n isStaticKey = genStaticKeysCached(options.staticKeys || '');\n isPlatformReservedTag = options.isReservedTag || no;\n // first pass: mark all non-static nodes.\n markStatic$1(root);\n // second pass: mark static roots.\n markStaticRoots(root, false);\n}\n\nfunction genStaticKeys$1 (keys) {\n return makeMap(\n 'type,tag,attrsList,attrsMap,plain,parent,children,attrs' +\n (keys ? ',' + keys : '')\n )\n}\n\nfunction markStatic$1 (node) {\n node.static = isStatic(node);\n if (node.type === 1) {\n // do not make component slot content static. this avoids\n // 1. components not able to mutate slot nodes\n // 2. static slot content fails for hot-reloading\n if (\n !isPlatformReservedTag(node.tag) &&\n node.tag !== 'slot' &&\n node.attrsMap['inline-template'] == null\n ) {\n return\n }\n for (var i = 0, l = node.children.length; i < l; i++) {\n var child = node.children[i];\n markStatic$1(child);\n if (!child.static) {\n node.static = false;\n }\n }\n if (node.ifConditions) {\n for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {\n var block = node.ifConditions[i$1].block;\n markStatic$1(block);\n if (!block.static) {\n node.static = false;\n }\n }\n }\n }\n}\n\nfunction markStaticRoots (node, isInFor) {\n if (node.type === 1) {\n if (node.static || node.once) {\n node.staticInFor = isInFor;\n }\n // For a node to qualify as a static root, it should have children that\n // are not just static text. Otherwise the cost of hoisting out will\n // outweigh the benefits and it's better off to just always render it fresh.\n if (node.static && node.children.length && !(\n node.children.length === 1 &&\n node.children[0].type === 3\n )) {\n node.staticRoot = true;\n return\n } else {\n node.staticRoot = false;\n }\n if (node.children) {\n for (var i = 0, l = node.children.length; i < l; i++) {\n markStaticRoots(node.children[i], isInFor || !!node.for);\n }\n }\n if (node.ifConditions) {\n for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {\n markStaticRoots(node.ifConditions[i$1].block, isInFor);\n }\n }\n }\n}\n\nfunction isStatic (node) {\n if (node.type === 2) { // expression\n return false\n }\n if (node.type === 3) { // text\n return true\n }\n return !!(node.pre || (\n !node.hasBindings && // no dynamic bindings\n !node.if && !node.for && // not v-if or v-for or v-else\n !isBuiltInTag(node.tag) && // not a built-in\n isPlatformReservedTag(node.tag) && // not a component\n !isDirectChildOfTemplateFor(node) &&\n Object.keys(node).every(isStaticKey)\n ))\n}\n\nfunction isDirectChildOfTemplateFor (node) {\n while (node.parent) {\n node = node.parent;\n if (node.tag !== 'template') {\n return false\n }\n if (node.for) {\n return true\n }\n }\n return false\n}\n\n/* */\n\nvar fnExpRE = /^([\\w$_]+|\\([^)]*?\\))\\s*=>|^function\\s*\\(/;\nvar simplePathRE = /^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*|\\['[^']*?']|\\[\"[^\"]*?\"]|\\[\\d+]|\\[[A-Za-z_$][\\w$]*])*$/;\n\n// KeyboardEvent.keyCode aliases\nvar keyCodes = {\n esc: 27,\n tab: 9,\n enter: 13,\n space: 32,\n up: 38,\n left: 37,\n right: 39,\n down: 40,\n 'delete': [8, 46]\n};\n\n// KeyboardEvent.key aliases\nvar keyNames = {\n esc: 'Escape',\n tab: 'Tab',\n enter: 'Enter',\n space: ' ',\n // #7806: IE11 uses key names without `Arrow` prefix for arrow keys.\n up: ['Up', 'ArrowUp'],\n left: ['Left', 'ArrowLeft'],\n right: ['Right', 'ArrowRight'],\n down: ['Down', 'ArrowDown'],\n 'delete': ['Backspace', 'Delete']\n};\n\n// #4868: modifiers that prevent the execution of the listener\n// need to explicitly return null so that we can determine whether to remove\n// the listener for .once\nvar genGuard = function (condition) { return (\"if(\" + condition + \")return null;\"); };\n\nvar modifierCode = {\n stop: '$event.stopPropagation();',\n prevent: '$event.preventDefault();',\n self: genGuard(\"$event.target !== $event.currentTarget\"),\n ctrl: genGuard(\"!$event.ctrlKey\"),\n shift: genGuard(\"!$event.shiftKey\"),\n alt: genGuard(\"!$event.altKey\"),\n meta: genGuard(\"!$event.metaKey\"),\n left: genGuard(\"'button' in $event && $event.button !== 0\"),\n middle: genGuard(\"'button' in $event && $event.button !== 1\"),\n right: genGuard(\"'button' in $event && $event.button !== 2\")\n};\n\nfunction genHandlers (\n events,\n isNative,\n warn\n) {\n var res = isNative ? 'nativeOn:{' : 'on:{';\n for (var name in events) {\n res += \"\\\"\" + name + \"\\\":\" + (genHandler(name, events[name])) + \",\";\n }\n return res.slice(0, -1) + '}'\n}\n\nfunction genHandler (\n name,\n handler\n) {\n if (!handler) {\n return 'function(){}'\n }\n\n if (Array.isArray(handler)) {\n return (\"[\" + (handler.map(function (handler) { return genHandler(name, handler); }).join(',')) + \"]\")\n }\n\n var isMethodPath = simplePathRE.test(handler.value);\n var isFunctionExpression = fnExpRE.test(handler.value);\n\n if (!handler.modifiers) {\n if (isMethodPath || isFunctionExpression) {\n return handler.value\n }\n /* istanbul ignore if */\n return (\"function($event){\" + (handler.value) + \"}\") // inline statement\n } else {\n var code = '';\n var genModifierCode = '';\n var keys = [];\n for (var key in handler.modifiers) {\n if (modifierCode[key]) {\n genModifierCode += modifierCode[key];\n // left/right\n if (keyCodes[key]) {\n keys.push(key);\n }\n } else if (key === 'exact') {\n var modifiers = (handler.modifiers);\n genModifierCode += genGuard(\n ['ctrl', 'shift', 'alt', 'meta']\n .filter(function (keyModifier) { return !modifiers[keyModifier]; })\n .map(function (keyModifier) { return (\"$event.\" + keyModifier + \"Key\"); })\n .join('||')\n );\n } else {\n keys.push(key);\n }\n }\n if (keys.length) {\n code += genKeyFilter(keys);\n }\n // Make sure modifiers like prevent and stop get executed after key filtering\n if (genModifierCode) {\n code += genModifierCode;\n }\n var handlerCode = isMethodPath\n ? (\"return \" + (handler.value) + \"($event)\")\n : isFunctionExpression\n ? (\"return (\" + (handler.value) + \")($event)\")\n : handler.value;\n /* istanbul ignore if */\n return (\"function($event){\" + code + handlerCode + \"}\")\n }\n}\n\nfunction genKeyFilter (keys) {\n return (\"if(!('button' in $event)&&\" + (keys.map(genFilterCode).join('&&')) + \")return null;\")\n}\n\nfunction genFilterCode (key) {\n var keyVal = parseInt(key, 10);\n if (keyVal) {\n return (\"$event.keyCode!==\" + keyVal)\n }\n var keyCode = keyCodes[key];\n var keyName = keyNames[key];\n return (\n \"_k($event.keyCode,\" +\n (JSON.stringify(key)) + \",\" +\n (JSON.stringify(keyCode)) + \",\" +\n \"$event.key,\" +\n \"\" + (JSON.stringify(keyName)) +\n \")\"\n )\n}\n\n/* */\n\nfunction on (el, dir) {\n if (\"development\" !== 'production' && dir.modifiers) {\n warn(\"v-on without argument does not support modifiers.\");\n }\n el.wrapListeners = function (code) { return (\"_g(\" + code + \",\" + (dir.value) + \")\"); };\n}\n\n/* */\n\nfunction bind$1 (el, dir) {\n el.wrapData = function (code) {\n return (\"_b(\" + code + \",'\" + (el.tag) + \"',\" + (dir.value) + \",\" + (dir.modifiers && dir.modifiers.prop ? 'true' : 'false') + (dir.modifiers && dir.modifiers.sync ? ',true' : '') + \")\")\n };\n}\n\n/* */\n\nvar baseDirectives = {\n on: on,\n bind: bind$1,\n cloak: noop\n}\n\n/* */\n\nvar CodegenState = function CodegenState (options) {\n this.options = options;\n this.warn = options.warn || baseWarn;\n this.transforms = pluckModuleFunction(options.modules, 'transformCode');\n this.dataGenFns = pluckModuleFunction(options.modules, 'genData');\n this.directives = extend(extend({}, baseDirectives), options.directives);\n var isReservedTag = options.isReservedTag || no;\n this.maybeComponent = function (el) { return !isReservedTag(el.tag); };\n this.onceId = 0;\n this.staticRenderFns = [];\n};\n\n\n\nfunction generate (\n ast,\n options\n) {\n var state = new CodegenState(options);\n var code = ast ? genElement(ast, state) : '_c(\"div\")';\n return {\n render: (\"with(this){return \" + code + \"}\"),\n staticRenderFns: state.staticRenderFns\n }\n}\n\nfunction genElement (el, state) {\n if (el.staticRoot && !el.staticProcessed) {\n return genStatic(el, state)\n } else if (el.once && !el.onceProcessed) {\n return genOnce(el, state)\n } else if (el.for && !el.forProcessed) {\n return genFor(el, state)\n } else if (el.if && !el.ifProcessed) {\n return genIf(el, state)\n } else if (el.tag === 'template' && !el.slotTarget) {\n return genChildren(el, state) || 'void 0'\n } else if (el.tag === 'slot') {\n return genSlot(el, state)\n } else {\n // component or element\n var code;\n if (el.component) {\n code = genComponent(el.component, el, state);\n } else {\n var data = el.plain ? undefined : genData$2(el, state);\n\n var children = el.inlineTemplate ? null : genChildren(el, state, true);\n code = \"_c('\" + (el.tag) + \"'\" + (data ? (\",\" + data) : '') + (children ? (\",\" + children) : '') + \")\";\n }\n // module transforms\n for (var i = 0; i < state.transforms.length; i++) {\n code = state.transforms[i](el, code);\n }\n return code\n }\n}\n\n// hoist static sub-trees out\nfunction genStatic (el, state) {\n el.staticProcessed = true;\n state.staticRenderFns.push((\"with(this){return \" + (genElement(el, state)) + \"}\"));\n return (\"_m(\" + (state.staticRenderFns.length - 1) + (el.staticInFor ? ',true' : '') + \")\")\n}\n\n// v-once\nfunction genOnce (el, state) {\n el.onceProcessed = true;\n if (el.if && !el.ifProcessed) {\n return genIf(el, state)\n } else if (el.staticInFor) {\n var key = '';\n var parent = el.parent;\n while (parent) {\n if (parent.for) {\n key = parent.key;\n break\n }\n parent = parent.parent;\n }\n if (!key) {\n \"development\" !== 'production' && state.warn(\n \"v-once can only be used inside v-for that is keyed. \"\n );\n return genElement(el, state)\n }\n return (\"_o(\" + (genElement(el, state)) + \",\" + (state.onceId++) + \",\" + key + \")\")\n } else {\n return genStatic(el, state)\n }\n}\n\nfunction genIf (\n el,\n state,\n altGen,\n altEmpty\n) {\n el.ifProcessed = true; // avoid recursion\n return genIfConditions(el.ifConditions.slice(), state, altGen, altEmpty)\n}\n\nfunction genIfConditions (\n conditions,\n state,\n altGen,\n altEmpty\n) {\n if (!conditions.length) {\n return altEmpty || '_e()'\n }\n\n var condition = conditions.shift();\n if (condition.exp) {\n return (\"(\" + (condition.exp) + \")?\" + (genTernaryExp(condition.block)) + \":\" + (genIfConditions(conditions, state, altGen, altEmpty)))\n } else {\n return (\"\" + (genTernaryExp(condition.block)))\n }\n\n // v-if with v-once should generate code like (a)?_m(0):_m(1)\n function genTernaryExp (el) {\n return altGen\n ? altGen(el, state)\n : el.once\n ? genOnce(el, state)\n : genElement(el, state)\n }\n}\n\nfunction genFor (\n el,\n state,\n altGen,\n altHelper\n) {\n var exp = el.for;\n var alias = el.alias;\n var iterator1 = el.iterator1 ? (\",\" + (el.iterator1)) : '';\n var iterator2 = el.iterator2 ? (\",\" + (el.iterator2)) : '';\n\n if (\"development\" !== 'production' &&\n state.maybeComponent(el) &&\n el.tag !== 'slot' &&\n el.tag !== 'template' &&\n !el.key\n ) {\n state.warn(\n \"<\" + (el.tag) + \" v-for=\\\"\" + alias + \" in \" + exp + \"\\\">: component lists rendered with \" +\n \"v-for should have explicit keys. \" +\n \"See https://vuejs.org/guide/list.html#key for more info.\",\n true /* tip */\n );\n }\n\n el.forProcessed = true; // avoid recursion\n return (altHelper || '_l') + \"((\" + exp + \"),\" +\n \"function(\" + alias + iterator1 + iterator2 + \"){\" +\n \"return \" + ((altGen || genElement)(el, state)) +\n '})'\n}\n\nfunction genData$2 (el, state) {\n var data = '{';\n\n // directives first.\n // directives may mutate the el's other properties before they are generated.\n var dirs = genDirectives(el, state);\n if (dirs) { data += dirs + ','; }\n\n // key\n if (el.key) {\n data += \"key:\" + (el.key) + \",\";\n }\n // ref\n if (el.ref) {\n data += \"ref:\" + (el.ref) + \",\";\n }\n if (el.refInFor) {\n data += \"refInFor:true,\";\n }\n // pre\n if (el.pre) {\n data += \"pre:true,\";\n }\n // record original tag name for components using \"is\" attribute\n if (el.component) {\n data += \"tag:\\\"\" + (el.tag) + \"\\\",\";\n }\n // module data generation functions\n for (var i = 0; i < state.dataGenFns.length; i++) {\n data += state.dataGenFns[i](el);\n }\n // attributes\n if (el.attrs) {\n data += \"attrs:{\" + (genProps(el.attrs)) + \"},\";\n }\n // DOM props\n if (el.props) {\n data += \"domProps:{\" + (genProps(el.props)) + \"},\";\n }\n // event handlers\n if (el.events) {\n data += (genHandlers(el.events, false, state.warn)) + \",\";\n }\n if (el.nativeEvents) {\n data += (genHandlers(el.nativeEvents, true, state.warn)) + \",\";\n }\n // slot target\n // only for non-scoped slots\n if (el.slotTarget && !el.slotScope) {\n data += \"slot:\" + (el.slotTarget) + \",\";\n }\n // scoped slots\n if (el.scopedSlots) {\n data += (genScopedSlots(el.scopedSlots, state)) + \",\";\n }\n // component v-model\n if (el.model) {\n data += \"model:{value:\" + (el.model.value) + \",callback:\" + (el.model.callback) + \",expression:\" + (el.model.expression) + \"},\";\n }\n // inline-template\n if (el.inlineTemplate) {\n var inlineTemplate = genInlineTemplate(el, state);\n if (inlineTemplate) {\n data += inlineTemplate + \",\";\n }\n }\n data = data.replace(/,$/, '') + '}';\n // v-bind data wrap\n if (el.wrapData) {\n data = el.wrapData(data);\n }\n // v-on data wrap\n if (el.wrapListeners) {\n data = el.wrapListeners(data);\n }\n return data\n}\n\nfunction genDirectives (el, state) {\n var dirs = el.directives;\n if (!dirs) { return }\n var res = 'directives:[';\n var hasRuntime = false;\n var i, l, dir, needRuntime;\n for (i = 0, l = dirs.length; i < l; i++) {\n dir = dirs[i];\n needRuntime = true;\n var gen = state.directives[dir.name];\n if (gen) {\n // compile-time directive that manipulates AST.\n // returns true if it also needs a runtime counterpart.\n needRuntime = !!gen(el, dir, state.warn);\n }\n if (needRuntime) {\n hasRuntime = true;\n res += \"{name:\\\"\" + (dir.name) + \"\\\",rawName:\\\"\" + (dir.rawName) + \"\\\"\" + (dir.value ? (\",value:(\" + (dir.value) + \"),expression:\" + (JSON.stringify(dir.value))) : '') + (dir.arg ? (\",arg:\\\"\" + (dir.arg) + \"\\\"\") : '') + (dir.modifiers ? (\",modifiers:\" + (JSON.stringify(dir.modifiers))) : '') + \"},\";\n }\n }\n if (hasRuntime) {\n return res.slice(0, -1) + ']'\n }\n}\n\nfunction genInlineTemplate (el, state) {\n var ast = el.children[0];\n if (\"development\" !== 'production' && (\n el.children.length !== 1 || ast.type !== 1\n )) {\n state.warn('Inline-template components must have exactly one child element.');\n }\n if (ast.type === 1) {\n var inlineRenderFns = generate(ast, state.options);\n return (\"inlineTemplate:{render:function(){\" + (inlineRenderFns.render) + \"},staticRenderFns:[\" + (inlineRenderFns.staticRenderFns.map(function (code) { return (\"function(){\" + code + \"}\"); }).join(',')) + \"]}\")\n }\n}\n\nfunction genScopedSlots (\n slots,\n state\n) {\n return (\"scopedSlots:_u([\" + (Object.keys(slots).map(function (key) {\n return genScopedSlot(key, slots[key], state)\n }).join(',')) + \"])\")\n}\n\nfunction genScopedSlot (\n key,\n el,\n state\n) {\n if (el.for && !el.forProcessed) {\n return genForScopedSlot(key, el, state)\n }\n var fn = \"function(\" + (String(el.slotScope)) + \"){\" +\n \"return \" + (el.tag === 'template'\n ? el.if\n ? ((el.if) + \"?\" + (genChildren(el, state) || 'undefined') + \":undefined\")\n : genChildren(el, state) || 'undefined'\n : genElement(el, state)) + \"}\";\n return (\"{key:\" + key + \",fn:\" + fn + \"}\")\n}\n\nfunction genForScopedSlot (\n key,\n el,\n state\n) {\n var exp = el.for;\n var alias = el.alias;\n var iterator1 = el.iterator1 ? (\",\" + (el.iterator1)) : '';\n var iterator2 = el.iterator2 ? (\",\" + (el.iterator2)) : '';\n el.forProcessed = true; // avoid recursion\n return \"_l((\" + exp + \"),\" +\n \"function(\" + alias + iterator1 + iterator2 + \"){\" +\n \"return \" + (genScopedSlot(key, el, state)) +\n '})'\n}\n\nfunction genChildren (\n el,\n state,\n checkSkip,\n altGenElement,\n altGenNode\n) {\n var children = el.children;\n if (children.length) {\n var el$1 = children[0];\n // optimize single v-for\n if (children.length === 1 &&\n el$1.for &&\n el$1.tag !== 'template' &&\n el$1.tag !== 'slot'\n ) {\n return (altGenElement || genElement)(el$1, state)\n }\n var normalizationType = checkSkip\n ? getNormalizationType(children, state.maybeComponent)\n : 0;\n var gen = altGenNode || genNode;\n return (\"[\" + (children.map(function (c) { return gen(c, state); }).join(',')) + \"]\" + (normalizationType ? (\",\" + normalizationType) : ''))\n }\n}\n\n// determine the normalization needed for the children array.\n// 0: no normalization needed\n// 1: simple normalization needed (possible 1-level deep nested array)\n// 2: full normalization needed\nfunction getNormalizationType (\n children,\n maybeComponent\n) {\n var res = 0;\n for (var i = 0; i < children.length; i++) {\n var el = children[i];\n if (el.type !== 1) {\n continue\n }\n if (needsNormalization(el) ||\n (el.ifConditions && el.ifConditions.some(function (c) { return needsNormalization(c.block); }))) {\n res = 2;\n break\n }\n if (maybeComponent(el) ||\n (el.ifConditions && el.ifConditions.some(function (c) { return maybeComponent(c.block); }))) {\n res = 1;\n }\n }\n return res\n}\n\nfunction needsNormalization (el) {\n return el.for !== undefined || el.tag === 'template' || el.tag === 'slot'\n}\n\nfunction genNode (node, state) {\n if (node.type === 1) {\n return genElement(node, state)\n } if (node.type === 3 && node.isComment) {\n return genComment(node)\n } else {\n return genText(node)\n }\n}\n\nfunction genText (text) {\n return (\"_v(\" + (text.type === 2\n ? text.expression // no need for () because already wrapped in _s()\n : transformSpecialNewlines(JSON.stringify(text.text))) + \")\")\n}\n\nfunction genComment (comment) {\n return (\"_e(\" + (JSON.stringify(comment.text)) + \")\")\n}\n\nfunction genSlot (el, state) {\n var slotName = el.slotName || '\"default\"';\n var children = genChildren(el, state);\n var res = \"_t(\" + slotName + (children ? (\",\" + children) : '');\n var attrs = el.attrs && (\"{\" + (el.attrs.map(function (a) { return ((camelize(a.name)) + \":\" + (a.value)); }).join(',')) + \"}\");\n var bind$$1 = el.attrsMap['v-bind'];\n if ((attrs || bind$$1) && !children) {\n res += \",null\";\n }\n if (attrs) {\n res += \",\" + attrs;\n }\n if (bind$$1) {\n res += (attrs ? '' : ',null') + \",\" + bind$$1;\n }\n return res + ')'\n}\n\n// componentName is el.component, take it as argument to shun flow's pessimistic refinement\nfunction genComponent (\n componentName,\n el,\n state\n) {\n var children = el.inlineTemplate ? null : genChildren(el, state, true);\n return (\"_c(\" + componentName + \",\" + (genData$2(el, state)) + (children ? (\",\" + children) : '') + \")\")\n}\n\nfunction genProps (props) {\n var res = '';\n for (var i = 0; i < props.length; i++) {\n var prop = props[i];\n /* istanbul ignore if */\n {\n res += \"\\\"\" + (prop.name) + \"\\\":\" + (transformSpecialNewlines(prop.value)) + \",\";\n }\n }\n return res.slice(0, -1)\n}\n\n// #3895, #4268\nfunction transformSpecialNewlines (text) {\n return text\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')\n}\n\n/* */\n\n// these keywords should not appear inside expressions, but operators like\n// typeof, instanceof and in are allowed\nvar prohibitedKeywordRE = new RegExp('\\\\b' + (\n 'do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,' +\n 'super,throw,while,yield,delete,export,import,return,switch,default,' +\n 'extends,finally,continue,debugger,function,arguments'\n).split(',').join('\\\\b|\\\\b') + '\\\\b');\n\n// these unary operators should not be used as property/method names\nvar unaryOperatorsRE = new RegExp('\\\\b' + (\n 'delete,typeof,void'\n).split(',').join('\\\\s*\\\\([^\\\\)]*\\\\)|\\\\b') + '\\\\s*\\\\([^\\\\)]*\\\\)');\n\n// strip strings in expressions\nvar stripStringRE = /'(?:[^'\\\\]|\\\\.)*'|\"(?:[^\"\\\\]|\\\\.)*\"|`(?:[^`\\\\]|\\\\.)*\\$\\{|\\}(?:[^`\\\\]|\\\\.)*`|`(?:[^`\\\\]|\\\\.)*`/g;\n\n// detect problematic expressions in a template\nfunction detectErrors (ast) {\n var errors = [];\n if (ast) {\n checkNode(ast, errors);\n }\n return errors\n}\n\nfunction checkNode (node, errors) {\n if (node.type === 1) {\n for (var name in node.attrsMap) {\n if (dirRE.test(name)) {\n var value = node.attrsMap[name];\n if (value) {\n if (name === 'v-for') {\n checkFor(node, (\"v-for=\\\"\" + value + \"\\\"\"), errors);\n } else if (onRE.test(name)) {\n checkEvent(value, (name + \"=\\\"\" + value + \"\\\"\"), errors);\n } else {\n checkExpression(value, (name + \"=\\\"\" + value + \"\\\"\"), errors);\n }\n }\n }\n }\n if (node.children) {\n for (var i = 0; i < node.children.length; i++) {\n checkNode(node.children[i], errors);\n }\n }\n } else if (node.type === 2) {\n checkExpression(node.expression, node.text, errors);\n }\n}\n\nfunction checkEvent (exp, text, errors) {\n var stipped = exp.replace(stripStringRE, '');\n var keywordMatch = stipped.match(unaryOperatorsRE);\n if (keywordMatch && stipped.charAt(keywordMatch.index - 1) !== '$') {\n errors.push(\n \"avoid using JavaScript unary operator as property name: \" +\n \"\\\"\" + (keywordMatch[0]) + \"\\\" in expression \" + (text.trim())\n );\n }\n checkExpression(exp, text, errors);\n}\n\nfunction checkFor (node, text, errors) {\n checkExpression(node.for || '', text, errors);\n checkIdentifier(node.alias, 'v-for alias', text, errors);\n checkIdentifier(node.iterator1, 'v-for iterator', text, errors);\n checkIdentifier(node.iterator2, 'v-for iterator', text, errors);\n}\n\nfunction checkIdentifier (\n ident,\n type,\n text,\n errors\n) {\n if (typeof ident === 'string') {\n try {\n new Function((\"var \" + ident + \"=_\"));\n } catch (e) {\n errors.push((\"invalid \" + type + \" \\\"\" + ident + \"\\\" in expression: \" + (text.trim())));\n }\n }\n}\n\nfunction checkExpression (exp, text, errors) {\n try {\n new Function((\"return \" + exp));\n } catch (e) {\n var keywordMatch = exp.replace(stripStringRE, '').match(prohibitedKeywordRE);\n if (keywordMatch) {\n errors.push(\n \"avoid using JavaScript keyword as property name: \" +\n \"\\\"\" + (keywordMatch[0]) + \"\\\"\\n Raw expression: \" + (text.trim())\n );\n } else {\n errors.push(\n \"invalid expression: \" + (e.message) + \" in\\n\\n\" +\n \" \" + exp + \"\\n\\n\" +\n \" Raw expression: \" + (text.trim()) + \"\\n\"\n );\n }\n }\n}\n\n/* */\n\nfunction createFunction (code, errors) {\n try {\n return new Function(code)\n } catch (err) {\n errors.push({ err: err, code: code });\n return noop\n }\n}\n\nfunction createCompileToFunctionFn (compile) {\n var cache = Object.create(null);\n\n return function compileToFunctions (\n template,\n options,\n vm\n ) {\n options = extend({}, options);\n var warn$$1 = options.warn || warn;\n delete options.warn;\n\n /* istanbul ignore if */\n if (true) {\n // detect possible CSP restriction\n try {\n new Function('return 1');\n } catch (e) {\n if (e.toString().match(/unsafe-eval|CSP/)) {\n warn$$1(\n 'It seems you are using the standalone build of Vue.js in an ' +\n 'environment with Content Security Policy that prohibits unsafe-eval. ' +\n 'The template compiler cannot work in this environment. Consider ' +\n 'relaxing the policy to allow unsafe-eval or pre-compiling your ' +\n 'templates into render functions.'\n );\n }\n }\n }\n\n // check cache\n var key = options.delimiters\n ? String(options.delimiters) + template\n : template;\n if (cache[key]) {\n return cache[key]\n }\n\n // compile\n var compiled = compile(template, options);\n\n // check compilation errors/tips\n if (true) {\n if (compiled.errors && compiled.errors.length) {\n warn$$1(\n \"Error compiling template:\\n\\n\" + template + \"\\n\\n\" +\n compiled.errors.map(function (e) { return (\"- \" + e); }).join('\\n') + '\\n',\n vm\n );\n }\n if (compiled.tips && compiled.tips.length) {\n compiled.tips.forEach(function (msg) { return tip(msg, vm); });\n }\n }\n\n // turn code into functions\n var res = {};\n var fnGenErrors = [];\n res.render = createFunction(compiled.render, fnGenErrors);\n res.staticRenderFns = compiled.staticRenderFns.map(function (code) {\n return createFunction(code, fnGenErrors)\n });\n\n // check function generation errors.\n // this should only happen if there is a bug in the compiler itself.\n // mostly for codegen development use\n /* istanbul ignore if */\n if (true) {\n if ((!compiled.errors || !compiled.errors.length) && fnGenErrors.length) {\n warn$$1(\n \"Failed to generate render function:\\n\\n\" +\n fnGenErrors.map(function (ref) {\n var err = ref.err;\n var code = ref.code;\n\n return ((err.toString()) + \" in\\n\\n\" + code + \"\\n\");\n }).join('\\n'),\n vm\n );\n }\n }\n\n return (cache[key] = res)\n }\n}\n\n/* */\n\nfunction createCompilerCreator (baseCompile) {\n return function createCompiler (baseOptions) {\n function compile (\n template,\n options\n ) {\n var finalOptions = Object.create(baseOptions);\n var errors = [];\n var tips = [];\n finalOptions.warn = function (msg, tip) {\n (tip ? tips : errors).push(msg);\n };\n\n if (options) {\n // merge custom modules\n if (options.modules) {\n finalOptions.modules =\n (baseOptions.modules || []).concat(options.modules);\n }\n // merge custom directives\n if (options.directives) {\n finalOptions.directives = extend(\n Object.create(baseOptions.directives || null),\n options.directives\n );\n }\n // copy other options\n for (var key in options) {\n if (key !== 'modules' && key !== 'directives') {\n finalOptions[key] = options[key];\n }\n }\n }\n\n var compiled = baseCompile(template, finalOptions);\n if (true) {\n errors.push.apply(errors, detectErrors(compiled.ast));\n }\n compiled.errors = errors;\n compiled.tips = tips;\n return compiled\n }\n\n return {\n compile: compile,\n compileToFunctions: createCompileToFunctionFn(compile)\n }\n }\n}\n\n/* */\n\n// `createCompilerCreator` allows creating compilers that use alternative\n// parser/optimizer/codegen, e.g the SSR optimizing compiler.\n// Here we just export a default compiler using the default parts.\nvar createCompiler = createCompilerCreator(function baseCompile (\n template,\n options\n) {\n var ast = parse(template.trim(), options);\n if (options.optimize !== false) {\n optimize(ast, options);\n }\n var code = generate(ast, options);\n return {\n ast: ast,\n render: code.render,\n staticRenderFns: code.staticRenderFns\n }\n});\n\n/* */\n\nvar ref$1 = createCompiler(baseOptions);\nvar compileToFunctions = ref$1.compileToFunctions;\n\n/* */\n\n// check whether current browser encodes a char inside attribute values\nvar div;\nfunction getShouldDecode (href) {\n div = div || document.createElement('div');\n div.innerHTML = href ? \"<a href=\\\"\\n\\\"/>\" : \"<div a=\\\"\\n\\\"/>\";\n return div.innerHTML.indexOf('&#10;') > 0\n}\n\n// #3663: IE encodes newlines inside attribute values while other browsers don't\nvar shouldDecodeNewlines = inBrowser ? getShouldDecode(false) : false;\n// #6828: chrome encodes content in a[href]\nvar shouldDecodeNewlinesForHref = inBrowser ? getShouldDecode(true) : false;\n\n/* */\n\nvar idToTemplate = cached(function (id) {\n var el = query(id);\n return el && el.innerHTML\n});\n\nvar mount = Vue.prototype.$mount;\nVue.prototype.$mount = function (\n el,\n hydrating\n) {\n el = el && query(el);\n\n /* istanbul ignore if */\n if (el === document.body || el === document.documentElement) {\n \"development\" !== 'production' && warn(\n \"Do not mount Vue to <html> or <body> - mount to normal elements instead.\"\n );\n return this\n }\n\n var options = this.$options;\n // resolve template/el and convert to render function\n if (!options.render) {\n var template = options.template;\n if (template) {\n if (typeof template === 'string') {\n if (template.charAt(0) === '#') {\n template = idToTemplate(template);\n /* istanbul ignore if */\n if (\"development\" !== 'production' && !template) {\n warn(\n (\"Template element not found or is empty: \" + (options.template)),\n this\n );\n }\n }\n } else if (template.nodeType) {\n template = template.innerHTML;\n } else {\n if (true) {\n warn('invalid template option:' + template, this);\n }\n return this\n }\n } else if (el) {\n template = getOuterHTML(el);\n }\n if (template) {\n /* istanbul ignore if */\n if (\"development\" !== 'production' && config.performance && mark) {\n mark('compile');\n }\n\n var ref = compileToFunctions(template, {\n shouldDecodeNewlines: shouldDecodeNewlines,\n shouldDecodeNewlinesForHref: shouldDecodeNewlinesForHref,\n delimiters: options.delimiters,\n comments: options.comments\n }, this);\n var render = ref.render;\n var staticRenderFns = ref.staticRenderFns;\n options.render = render;\n options.staticRenderFns = staticRenderFns;\n\n /* istanbul ignore if */\n if (\"development\" !== 'production' && config.performance && mark) {\n mark('compile end');\n measure((\"vue \" + (this._name) + \" compile\"), 'compile', 'compile end');\n }\n }\n }\n return mount.call(this, el, hydrating)\n};\n\n/**\n * Get outerHTML of elements, taking care\n * of SVG elements in IE as well.\n */\nfunction getOuterHTML (el) {\n if (el.outerHTML) {\n return el.outerHTML\n } else {\n var container = document.createElement('div');\n container.appendChild(el.cloneNode(true));\n return container.innerHTML\n }\n}\n\nVue.compile = compileToFunctions;\n\nmodule.exports = Vue;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(17).setImmediate))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdnVlL2Rpc3QvdnVlLmNvbW1vbi5qcz8yMzcxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGlCQUFpQjtBQUNsQztBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsK0JBQStCO0FBQ3JELHNCQUFzQixpQkFBaUI7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsaUNBQWlDLEVBQUU7QUFDckYsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsY0FBYzs7QUFFM0M7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLFVBQVU7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLGdCQUFnQjtBQUNqQyxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixxQkFBcUI7QUFDeEMsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEdBQUc7QUFDUjtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyx1Q0FBdUMsd0JBQXdCLEVBQUU7QUFDakUsMEJBQTBCOztBQUUxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixZQUFZO0FBQ3BDLGtCQUFrQixZQUFZO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBLHdDQUF3QyxFQUFFO0FBQzFDO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsT0FBTztBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQiw4QkFBOEI7QUFDakQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCLFNBQVMscUJBQXFCOztBQUV4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsaUJBQWlCO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxPQUFPO0FBQzFDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLE9BQU87QUFDekM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxPQUFPO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxpQkFBaUIsaUJBQWlCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNB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Q0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsMkJBQTJCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFNBQVM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsbUJBQW1CO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQix1QkFBdUI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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OztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCOztBQUUxQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixxQkFBcUI7QUFDeEM7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIseUJBQXlCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHlCQUF5QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsT0FBTztBQUMvQztBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixvQkFBb0IsRUFBRTs7QUFFcEQ7QUFDQTtBQUNBLGlCQUFpQixzQkFBc0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwyQkFBMkI7QUFDOUMscUJBQXFCLCtCQUErQjtBQUNwRDtBQUNBO0FBQ0EsR0FBRztBQUNILHlCQUF5QjtBQUN6QjtBQUNBLHNCQUFzQixpQ0FBaUM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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O0FBQ1Q7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRCw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixpQkFBaUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHVDQUF1Qzs7QUFFbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEMsMkJBQTJCLEVBQUU7QUFDdkUsS0FBSztBQUNMO0FBQ0EsMENBQTBDLDRCQUE0QixFQUFFO0FBQ3hFLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsZUFBZTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLE9BQU87QUFDMUM7QUFDQSxnQkFBZ0IsWUFBWTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFlBQVk7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtCQUErQixzQkFBc0I7O0FBRXJEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9COztBQUVwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0NBQWdDOztBQUVoQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBC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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsaUJBQWlCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0RUFBNEU7QUFDNUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLGdCQUFnQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msa0JBQWtCO0FBQzFELEtBQUs7QUFDTCx3Q0FBd0Msa0JBQWtCO0FBQzFELEtBQUs7QUFDTCx3Q0FBd0MsMEJBQTBCO0FBQ2xFLEtBQUs7QUFDTCx3Q0FBd0MsaUJBQWlCO0FBQ3pELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLG1DQUFtQztBQUNuQyxtQ0FBbUM7QUFDbkMsMkNBQTJDO0FBQzNDLDJCQUEyQjtBQUMzQiwyQkFBMkI7QUFDM0IsNEJBQTRCO0FBQzVCLDRCQUE0QjtBQUM1QiwyQkFBMkI7QUFDM0IsMkJBQTJCO0FBQzNCO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLG9CQUFvQjtBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsZUFBZSxFQUFFLHVCQUF1QixVQUFVLEVBQUU7QUFDcEY7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQywyQkFBMkI7QUFDakU7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQywyQkFBMkI7QUFDakU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsMkJBQTJCO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsNkVBQTZFO0FBQzdIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsR0FBRztBQUNILHlDQUF5QztBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsT0FBTztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxtQkFBbUI7QUFDM0U7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGFBQWE7QUFDcEMsdUJBQXVCLGFBQWE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRkFBaUY7QUFDakYsNEJBQTRCO0FBQzVCO0FBQ0EsMkJBQTJCO0FBQzNCLHdCQUF3QixpRUFBaUU7QUFDekYsWUFBWSwwRkFBMEY7QUFDdEcsTUFBTSxLQUFLLDBDQUEwQztBQUNyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxrQkFBa0I7QUFDL0Qsc0JBQXNCLCtDQUErQztBQUNyRSxpREFBaUQ7O0FBRWpEO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhDQUE4QztBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHNEQUFzRDtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwyQkFBMkI7QUFDdEQsa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sNkNBQTZDLEVBQUU7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLHVDQUF1QyxTQUFTO0FBQ2hEO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQix3QkFBd0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLDRCQUE0QixFQUFFO0FBQzNFLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLCtCQUErQixFQUFFO0FBQzlFLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsYUFBYTs7QUFFM0Q7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLHFDQUFxQzs7QUFFdEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLHVDQUF1QyxFQUFFO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QywyQ0FBMkMsRUFBRTtBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxPQUFPO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQ0FBcUMsOEJBQThCLEVBQUU7QUFDckU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkMsdUNBQXVDLEVBQUU7QUFDdEY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEM7QUFDOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMEVBQTBFLDBCQUEwQixFQUFFO0FBQ3RHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FB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TztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLE9BQU87QUFDUCxTQUFTO0FBQ1QsUUFBUTtBQUNSLFFBQVE7QUFDUixPQUFPO0FBQ1A7QUFDQSx1Q0FBdUM7QUFDdkMsMERBQTBEOztBQUUxRDtBQUNBO0FBQ0EscURBQXFELDJEQUEyRDs7QUFFaEg7QUFDQTtBQUNBLDZDQUE2QywyQkFBMkIsRUFBRTtBQUMxRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGdCQUFnQjtBQUM3Qyw2QkFBNkIsZ0JBQWdCO0FBQzdDLDZCQUE2QixnQkFBZ0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsbUVBQW1FO0FBQ3JGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QixlQUFlO0FBQ3ZDLHNCQUFzQixhQUFhOztBQUVuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQyxVQUFVO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DLFVBQVU7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixlQUFlO0FBQzNDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDJCQUEyQjtBQUM5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQiwwQkFBMEI7QUFDL0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLDhCQUE4QjtBQUN2QztBQUNBLHVEQUF1RCw2REFBNkQ7QUFDcEgsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLHVCQUF1QjtBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLE9BQU87QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsb0JBQW9CO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPLDRCQUE0QjtBQUNuQztBQUNBO0FBQ0EsT0FBTyxPQUFPO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsT0FBTztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHdCQUF3QixFQUFFO0FBQzFEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DLE9BQU87QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsT0FBTztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxXQUFXO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsbUJBQW1CLEVBQUU7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMscUJBQXFCLEVBQUU7QUFDckU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEiLCJmaWxlIjoiMTYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIFZ1ZS5qcyB2Mi41LjE2XG4gKiAoYykgMjAxNC0yMDE4IEV2YW4gWW91XG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuLyogICovXG5cbnZhciBlbXB0eU9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuXG4vLyB0aGVzZSBoZWxwZXJzIHByb2R1Y2VzIGJldHRlciB2bSBjb2RlIGluIEpTIGVuZ2luZXMgZHVlIHRvIHRoZWlyXG4vLyBleHBsaWNpdG5lc3MgYW5kIGZ1bmN0aW9uIGlubGluaW5nXG5mdW5jdGlvbiBpc1VuZGVmICh2KSB7XG4gIHJldHVybiB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gbnVsbFxufVxuXG5mdW5jdGlvbiBpc0RlZiAodikge1xuICByZXR1cm4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNUcnVlICh2KSB7XG4gIHJldHVybiB2ID09PSB0cnVlXG59XG5cbmZ1bmN0aW9uIGlzRmFsc2UgKHYpIHtcbiAgcmV0dXJuIHYgPT09IGZhbHNlXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdmFsdWUgaXMgcHJpbWl0aXZlXG4gKi9cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlICh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8XG4gICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nXG4gIClcbn1cblxuLyoqXG4gKiBRdWljayBvYmplY3QgY2hlY2sgLSB0aGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHRlbGxcbiAqIE9iamVjdHMgZnJvbSBwcmltaXRpdmUgdmFsdWVzIHdoZW4gd2Uga25vdyB0aGUgdmFsdWVcbiAqIGlzIGEgSlNPTi1jb21wbGlhbnQgdHlwZS5cbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QgKG9iaikge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnXG59XG5cbi8qKlxuICogR2V0IHRoZSByYXcgdHlwZSBzdHJpbmcgb2YgYSB2YWx1ZSBlLmcuIFtvYmplY3QgT2JqZWN0XVxuICovXG52YXIgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gdG9SYXdUeXBlICh2YWx1ZSkge1xuICByZXR1cm4gX3RvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKVxufVxuXG4vKipcbiAqIFN0cmljdCBvYmplY3QgdHlwZSBjaGVjay4gT25seSByZXR1cm5zIHRydWVcbiAqIGZvciBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdHMuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QgKG9iaikge1xuICByZXR1cm4gX3RvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbn1cblxuZnVuY3Rpb24gaXNSZWdFeHAgKHYpIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHYpID09PSAnW29iamVjdCBSZWdFeHBdJ1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHZhbCBpcyBhIHZhbGlkIGFycmF5IGluZGV4LlxuICovXG5mdW5jdGlvbiBpc1ZhbGlkQXJyYXlJbmRleCAodmFsKSB7XG4gIHZhciBuID0gcGFyc2VGbG9hdChTdHJpbmcodmFsKSk7XG4gIHJldHVybiBuID49IDAgJiYgTWF0aC5mbG9vcihuKSA9PT0gbiAmJiBpc0Zpbml0ZSh2YWwpXG59XG5cbi8qKlxuICogQ29udmVydCBhIHZhbHVlIHRvIGEgc3RyaW5nIHRoYXQgaXMgYWN0dWFsbHkgcmVuZGVyZWQuXG4gKi9cbmZ1bmN0aW9uIHRvU3RyaW5nICh2YWwpIHtcbiAgcmV0dXJuIHZhbCA9PSBudWxsXG4gICAgPyAnJ1xuICAgIDogdHlwZW9mIHZhbCA9PT0gJ29iamVjdCdcbiAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsLCBudWxsLCAyKVxuICAgICAgOiBTdHJpbmcodmFsKVxufVxuXG4vKipcbiAqIENvbnZlcnQgYSBpbnB1dCB2YWx1ZSB0byBhIG51bWJlciBmb3IgcGVyc2lzdGVuY2UuXG4gKiBJZiB0aGUgY29udmVyc2lvbiBmYWlscywgcmV0dXJuIG9yaWdpbmFsIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIgKHZhbCkge1xuICB2YXIgbiA9IHBhcnNlRmxvYXQodmFsKTtcbiAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogblxufVxuXG4vKipcbiAqIE1ha2UgYSBtYXAgYW5kIHJldHVybiBhIGZ1bmN0aW9uIGZvciBjaGVja2luZyBpZiBhIGtleVxuICogaXMgaW4gdGhhdCBtYXAuXG4gKi9cbmZ1bmN0aW9uIG1ha2VNYXAgKFxuICBzdHIsXG4gIGV4cGVjdHNMb3dlckNhc2Vcbikge1xuICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdmFyIGxpc3QgPSBzdHIuc3BsaXQoJywnKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgbWFwW2xpc3RbaV1dID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZXhwZWN0c0xvd2VyQ2FzZVxuICAgID8gZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gbWFwW3ZhbC50b0xvd2VyQ2FzZSgpXTsgfVxuICAgIDogZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gbWFwW3ZhbF07IH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHRhZyBpcyBhIGJ1aWx0LWluIHRhZy5cbiAqL1xudmFyIGlzQnVpbHRJblRhZyA9IG1ha2VNYXAoJ3Nsb3QsY29tcG9uZW50JywgdHJ1ZSk7XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBhdHRyaWJ1dGUgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUuXG4gKi9cbnZhciBpc1Jlc2VydmVkQXR0cmlidXRlID0gbWFrZU1hcCgna2V5LHJlZixzbG90LHNsb3Qtc2NvcGUsaXMnKTtcblxuLyoqXG4gKiBSZW1vdmUgYW4gaXRlbSBmcm9tIGFuIGFycmF5XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZSAoYXJyLCBpdGVtKSB7XG4gIGlmIChhcnIubGVuZ3RoKSB7XG4gICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHJldHVybiBhcnIuc3BsaWNlKGluZGV4LCAxKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5LlxuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuZnVuY3Rpb24gaGFzT3duIChvYmosIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSlcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBjYWNoZWQgdmVyc2lvbiBvZiBhIHB1cmUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNhY2hlZCAoZm4pIHtcbiAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcmV0dXJuIChmdW5jdGlvbiBjYWNoZWRGbiAoc3RyKSB7XG4gICAgdmFyIGhpdCA9IGNhY2hlW3N0cl07XG4gICAgcmV0dXJuIGhpdCB8fCAoY2FjaGVbc3RyXSA9IGZuKHN0cikpXG4gIH0pXG59XG5cbi8qKlxuICogQ2FtZWxpemUgYSBoeXBoZW4tZGVsaW1pdGVkIHN0cmluZy5cbiAqL1xudmFyIGNhbWVsaXplUkUgPSAvLShcXHcpL2c7XG52YXIgY2FtZWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoY2FtZWxpemVSRSwgZnVuY3Rpb24gKF8sIGMpIHsgcmV0dXJuIGMgPyBjLnRvVXBwZXJDYXNlKCkgOiAnJzsgfSlcbn0pO1xuXG4vKipcbiAqIENhcGl0YWxpemUgYSBzdHJpbmcuXG4gKi9cbnZhciBjYXBpdGFsaXplID0gY2FjaGVkKGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKVxufSk7XG5cbi8qKlxuICogSHlwaGVuYXRlIGEgY2FtZWxDYXNlIHN0cmluZy5cbiAqL1xudmFyIGh5cGhlbmF0ZVJFID0gL1xcQihbQS1aXSkvZztcbnZhciBoeXBoZW5hdGUgPSBjYWNoZWQoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoaHlwaGVuYXRlUkUsICctJDEnKS50b0xvd2VyQ2FzZSgpXG59KTtcblxuLyoqXG4gKiBTaW1wbGUgYmluZCBwb2x5ZmlsbCBmb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IHN1cHBvcnQgaXQuLi4gZS5nLlxuICogUGhhbnRvbUpTIDEueC4gVGVjaG5pY2FsbHkgd2UgZG9uJ3QgbmVlZCB0aGlzIGFueW1vcmUgc2luY2UgbmF0aXZlIGJpbmQgaXNcbiAqIG5vdyBtb3JlIHBlcmZvcm1hbnQgaW4gbW9zdCBicm93c2VycywgYnV0IHJlbW92aW5nIGl0IHdvdWxkIGJlIGJyZWFraW5nIGZvclxuICogY29kZSB0aGF0IHdhcyBhYmxlIHRvIHJ1biBpbiBQaGFudG9tSlMgMS54LCBzbyB0aGlzIG11c3QgYmUga2VwdCBmb3JcbiAqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBwb2x5ZmlsbEJpbmQgKGZuLCBjdHgpIHtcbiAgZnVuY3Rpb24gYm91bmRGbiAoYSkge1xuICAgIHZhciBsID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICByZXR1cm4gbFxuICAgICAgPyBsID4gMVxuICAgICAgICA/IGZuLmFwcGx5KGN0eCwgYXJndW1lbnRzKVxuICAgICAgICA6IGZuLmNhbGwoY3R4LCBhKVxuICAgICAgOiBmbi5jYWxsKGN0eClcbiAgfVxuXG4gIGJvdW5kRm4uX2xlbmd0aCA9IGZuLmxlbmd0aDtcbiAgcmV0dXJuIGJvdW5kRm5cbn1cblxuZnVuY3Rpb24gbmF0aXZlQmluZCAoZm4sIGN0eCkge1xuICByZXR1cm4gZm4uYmluZChjdHgpXG59XG5cbnZhciBiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcbiAgPyBuYXRpdmVCaW5kXG4gIDogcG9seWZpbGxCaW5kO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gQXJyYXktbGlrZSBvYmplY3QgdG8gYSByZWFsIEFycmF5LlxuICovXG5mdW5jdGlvbiB0b0FycmF5IChsaXN0LCBzdGFydCkge1xuICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gIHZhciBpID0gbGlzdC5sZW5ndGggLSBzdGFydDtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShpKTtcbiAgd2hpbGUgKGktLSkge1xuICAgIHJldFtpXSA9IGxpc3RbaSArIHN0YXJ0XTtcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbi8qKlxuICogTWl4IHByb3BlcnRpZXMgaW50byB0YXJnZXQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBleHRlbmQgKHRvLCBfZnJvbSkge1xuICBmb3IgKHZhciBrZXkgaW4gX2Zyb20pIHtcbiAgICB0b1trZXldID0gX2Zyb21ba2V5XTtcbiAgfVxuICByZXR1cm4gdG9cbn1cblxuLyoqXG4gKiBNZXJnZSBhbiBBcnJheSBvZiBPYmplY3RzIGludG8gYSBzaW5nbGUgT2JqZWN0LlxuICovXG5mdW5jdGlvbiB0b09iamVjdCAoYXJyKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJyW2ldKSB7XG4gICAgICBleHRlbmQocmVzLCBhcnJbaV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbi8qKlxuICogUGVyZm9ybSBubyBvcGVyYXRpb24uXG4gKiBTdHViYmluZyBhcmdzIHRvIG1ha2UgRmxvdyBoYXBweSB3aXRob3V0IGxlYXZpbmcgdXNlbGVzcyB0cmFuc3BpbGVkIGNvZGVcbiAqIHdpdGggLi4ucmVzdCAoaHR0cHM6Ly9mbG93Lm9yZy9ibG9nLzIwMTcvMDUvMDcvU3RyaWN0LUZ1bmN0aW9uLUNhbGwtQXJpdHkvKVxuICovXG5mdW5jdGlvbiBub29wIChhLCBiLCBjKSB7fVxuXG4vKipcbiAqIEFsd2F5cyByZXR1cm4gZmFsc2UuXG4gKi9cbnZhciBubyA9IGZ1bmN0aW9uIChhLCBiLCBjKSB7IHJldHVybiBmYWxzZTsgfTtcblxuLyoqXG4gKiBSZXR1cm4gc2FtZSB2YWx1ZVxuICovXG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbiAoXykgeyByZXR1cm4gXzsgfTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHN0YXRpYyBrZXlzIHN0cmluZyBmcm9tIGNvbXBpbGVyIG1vZHVsZXMuXG4gKi9cbmZ1bmN0aW9uIGdlblN0YXRpY0tleXMgKG1vZHVsZXMpIHtcbiAgcmV0dXJuIG1vZHVsZXMucmVkdWNlKGZ1bmN0aW9uIChrZXlzLCBtKSB7XG4gICAgcmV0dXJuIGtleXMuY29uY2F0KG0uc3RhdGljS2V5cyB8fCBbXSlcbiAgfSwgW10pLmpvaW4oJywnKVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHR3byB2YWx1ZXMgYXJlIGxvb3NlbHkgZXF1YWwgLSB0aGF0IGlzLFxuICogaWYgdGhleSBhcmUgcGxhaW4gb2JqZWN0cywgZG8gdGhleSBoYXZlIHRoZSBzYW1lIHNoYXBlP1xuICovXG5mdW5jdGlvbiBsb29zZUVxdWFsIChhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7IHJldHVybiB0cnVlIH1cbiAgdmFyIGlzT2JqZWN0QSA9IGlzT2JqZWN0KGEpO1xuICB2YXIgaXNPYmplY3RCID0gaXNPYmplY3QoYik7XG4gIGlmIChpc09iamVjdEEgJiYgaXNPYmplY3RCKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBpc0FycmF5QSA9IEFycmF5LmlzQXJyYXkoYSk7XG4gICAgICB2YXIgaXNBcnJheUIgPSBBcnJheS5pc0FycmF5KGIpO1xuICAgICAgaWYgKGlzQXJyYXlBICYmIGlzQXJyYXlCKSB7XG4gICAgICAgIHJldHVybiBhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiYgYS5ldmVyeShmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICAgIHJldHVybiBsb29zZUVxdWFsKGUsIGJbaV0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKCFpc0FycmF5QSAmJiAhaXNBcnJheUIpIHtcbiAgICAgICAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMoYSk7XG4gICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICByZXR1cm4ga2V5c0EubGVuZ3RoID09PSBrZXlzQi5sZW5ndGggJiYga2V5c0EuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiBsb29zZUVxdWFsKGFba2V5XSwgYltrZXldKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHtcbiAgICByZXR1cm4gU3RyaW5nKGEpID09PSBTdHJpbmcoYilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBsb29zZUluZGV4T2YgKGFyciwgdmFsKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGxvb3NlRXF1YWwoYXJyW2ldLCB2YWwpKSB7IHJldHVybiBpIH1cbiAgfVxuICByZXR1cm4gLTFcbn1cblxuLyoqXG4gKiBFbnN1cmUgYSBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbmNlLlxuICovXG5mdW5jdGlvbiBvbmNlIChmbikge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgU1NSX0FUVFIgPSAnZGF0YS1zZXJ2ZXItcmVuZGVyZWQnO1xuXG52YXIgQVNTRVRfVFlQRVMgPSBbXG4gICdjb21wb25lbnQnLFxuICAnZGlyZWN0aXZlJyxcbiAgJ2ZpbHRlcidcbl07XG5cbnZhciBMSUZFQ1lDTEVfSE9PS1MgPSBbXG4gICdiZWZvcmVDcmVhdGUnLFxuICAnY3JlYXRlZCcsXG4gICdiZWZvcmVNb3VudCcsXG4gICdtb3VudGVkJyxcbiAgJ2JlZm9yZVVwZGF0ZScsXG4gICd1cGRhdGVkJyxcbiAgJ2JlZm9yZURlc3Ryb3knLFxuICAnZGVzdHJveWVkJyxcbiAgJ2FjdGl2YXRlZCcsXG4gICdkZWFjdGl2YXRlZCcsXG4gICdlcnJvckNhcHR1cmVkJ1xuXTtcblxuLyogICovXG5cbnZhciBjb25maWcgPSAoe1xuICAvKipcbiAgICogT3B0aW9uIG1lcmdlIHN0cmF0ZWdpZXMgKHVzZWQgaW4gY29yZS91dGlsL29wdGlvbnMpXG4gICAqL1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN1cHByZXNzIHdhcm5pbmdzLlxuICAgKi9cbiAgc2lsZW50OiBmYWxzZSxcblxuICAvKipcbiAgICogU2hvdyBwcm9kdWN0aW9uIG1vZGUgdGlwIG1lc3NhZ2Ugb24gYm9vdD9cbiAgICovXG4gIHByb2R1Y3Rpb25UaXA6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGRldnRvb2xzXG4gICAqL1xuICBkZXZ0b29sczogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyxcblxuICAvKipcbiAgICogV2hldGhlciB0byByZWNvcmQgcGVyZlxuICAgKi9cbiAgcGVyZm9ybWFuY2U6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9yc1xuICAgKi9cbiAgZXJyb3JIYW5kbGVyOiBudWxsLFxuXG4gIC8qKlxuICAgKiBXYXJuIGhhbmRsZXIgZm9yIHdhdGNoZXIgd2FybnNcbiAgICovXG4gIHdhcm5IYW5kbGVyOiBudWxsLFxuXG4gIC8qKlxuICAgKiBJZ25vcmUgY2VydGFpbiBjdXN0b20gZWxlbWVudHNcbiAgICovXG4gIGlnbm9yZWRFbGVtZW50czogW10sXG5cbiAgLyoqXG4gICAqIEN1c3RvbSB1c2VyIGtleSBhbGlhc2VzIGZvciB2LW9uXG4gICAqL1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAga2V5Q29kZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdGFnIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXMgYVxuICAgKiBjb21wb25lbnQuIFRoaXMgaXMgcGxhdGZvcm0tZGVwZW5kZW50IGFuZCBtYXkgYmUgb3ZlcndyaXR0ZW4uXG4gICAqL1xuICBpc1Jlc2VydmVkVGFnOiBubyxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb21wb25lbnRcbiAgICogcHJvcC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi5cbiAgICovXG4gIGlzUmVzZXJ2ZWRBdHRyOiBubyxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgYW4gdW5rbm93biBlbGVtZW50LlxuICAgKiBQbGF0Zm9ybS1kZXBlbmRlbnQuXG4gICAqL1xuICBpc1Vua25vd25FbGVtZW50OiBubyxcblxuICAvKipcbiAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudFxuICAgKi9cbiAgZ2V0VGFnTmFtZXNwYWNlOiBub29wLFxuXG4gIC8qKlxuICAgKiBQYXJzZSB0aGUgcmVhbCB0YWcgbmFtZSBmb3IgdGhlIHNwZWNpZmljIHBsYXRmb3JtLlxuICAgKi9cbiAgcGFyc2VQbGF0Zm9ybVRhZ05hbWU6IGlkZW50aXR5LFxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhdHRyaWJ1dGUgbXVzdCBiZSBib3VuZCB1c2luZyBwcm9wZXJ0eSwgZS5nLiB2YWx1ZVxuICAgKiBQbGF0Zm9ybS1kZXBlbmRlbnQuXG4gICAqL1xuICBtdXN0VXNlUHJvcDogbm8sXG5cbiAgLyoqXG4gICAqIEV4cG9zZWQgZm9yIGxlZ2FjeSByZWFzb25zXG4gICAqL1xuICBfbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LU1xufSlcblxuLyogICovXG5cbi8qKlxuICogQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggJCBvciBfXG4gKi9cbmZ1bmN0aW9uIGlzUmVzZXJ2ZWQgKHN0cikge1xuICB2YXIgYyA9IChzdHIgKyAnJykuY2hhckNvZGVBdCgwKTtcbiAgcmV0dXJuIGMgPT09IDB4MjQgfHwgYyA9PT0gMHg1RlxufVxuXG4vKipcbiAqIERlZmluZSBhIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBkZWYgKG9iaiwga2V5LCB2YWwsIGVudW1lcmFibGUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgdmFsdWU6IHZhbCxcbiAgICBlbnVtZXJhYmxlOiAhIWVudW1lcmFibGUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlIHNpbXBsZSBwYXRoLlxuICovXG52YXIgYmFpbFJFID0gL1teXFx3LiRdLztcbmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkge1xuICBpZiAoYmFpbFJFLnRlc3QocGF0aCkpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFvYmopIHsgcmV0dXJuIH1cbiAgICAgIG9iaiA9IG9ialtzZWdtZW50c1tpXV07XG4gICAgfVxuICAgIHJldHVybiBvYmpcbiAgfVxufVxuXG4vKiAgKi9cblxuLy8gY2FuIHdlIHVzZSBfX3Byb3RvX18/XG52YXIgaGFzUHJvdG8gPSAnX19wcm90b19fJyBpbiB7fTtcblxuLy8gQnJvd3NlciBlbnZpcm9ubWVudCBzbmlmZmluZ1xudmFyIGluQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xudmFyIGluV2VleCA9IHR5cGVvZiBXWEVudmlyb25tZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhIVdYRW52aXJvbm1lbnQucGxhdGZvcm07XG52YXIgd2VleFBsYXRmb3JtID0gaW5XZWV4ICYmIFdYRW52aXJvbm1lbnQucGxhdGZvcm0udG9Mb3dlckNhc2UoKTtcbnZhciBVQSA9IGluQnJvd3NlciAmJiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xudmFyIGlzSUUgPSBVQSAmJiAvbXNpZXx0cmlkZW50Ly50ZXN0KFVBKTtcbnZhciBpc0lFOSA9IFVBICYmIFVBLmluZGV4T2YoJ21zaWUgOS4wJykgPiAwO1xudmFyIGlzRWRnZSA9IFVBICYmIFVBLmluZGV4T2YoJ2VkZ2UvJykgPiAwO1xudmFyIGlzQW5kcm9pZCA9IChVQSAmJiBVQS5pbmRleE9mKCdhbmRyb2lkJykgPiAwKSB8fCAod2VleFBsYXRmb3JtID09PSAnYW5kcm9pZCcpO1xudmFyIGlzSU9TID0gKFVBICYmIC9pcGhvbmV8aXBhZHxpcG9kfGlvcy8udGVzdChVQSkpIHx8ICh3ZWV4UGxhdGZvcm0gPT09ICdpb3MnKTtcbnZhciBpc0Nocm9tZSA9IFVBICYmIC9jaHJvbWVcXC9cXGQrLy50ZXN0KFVBKSAmJiAhaXNFZGdlO1xuXG4vLyBGaXJlZm94IGhhcyBhIFwid2F0Y2hcIiBmdW5jdGlvbiBvbiBPYmplY3QucHJvdG90eXBlLi4uXG52YXIgbmF0aXZlV2F0Y2ggPSAoe30pLndhdGNoO1xuXG52YXIgc3VwcG9ydHNQYXNzaXZlID0gZmFsc2U7XG5pZiAoaW5Ccm93c2VyKSB7XG4gIHRyeSB7XG4gICAgdmFyIG9wdHMgPSB7fTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0cywgJ3Bhc3NpdmUnLCAoe1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQgKCkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pKTsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzI4NVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0LXBhc3NpdmUnLCBudWxsLCBvcHRzKTtcbiAgfSBjYXRjaCAoZSkge31cbn1cblxuLy8gdGhpcyBuZWVkcyB0byBiZSBsYXp5LWV2YWxlZCBiZWNhdXNlIHZ1ZSBtYXkgYmUgcmVxdWlyZWQgYmVmb3JlXG4vLyB2dWUtc2VydmVyLXJlbmRlcmVyIGNhbiBzZXQgVlVFX0VOVlxudmFyIF9pc1NlcnZlcjtcbnZhciBpc1NlcnZlclJlbmRlcmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKF9pc1NlcnZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFpbkJyb3dzZXIgJiYgIWluV2VleCAmJiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gZGV0ZWN0IHByZXNlbmNlIG9mIHZ1ZS1zZXJ2ZXItcmVuZGVyZXIgYW5kIGF2b2lkXG4gICAgICAvLyBXZWJwYWNrIHNoaW1taW5nIHRoZSBwcm9jZXNzXG4gICAgICBfaXNTZXJ2ZXIgPSBnbG9iYWxbJ3Byb2Nlc3MnXS5lbnYuVlVFX0VOViA9PT0gJ3NlcnZlcic7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9pc1NlcnZlciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gX2lzU2VydmVyXG59O1xuXG4vLyBkZXRlY3QgZGV2dG9vbHNcbnZhciBkZXZ0b29scyA9IGluQnJvd3NlciAmJiB3aW5kb3cuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGlzTmF0aXZlIChDdG9yKSB7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJyAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoQ3Rvci50b1N0cmluZygpKVxufVxuXG52YXIgaGFzU3ltYm9sID1cbiAgdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU3ltYm9sKSAmJlxuICB0eXBlb2YgUmVmbGVjdCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUmVmbGVjdC5vd25LZXlzKTtcblxudmFyIF9TZXQ7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8gLy8gJGZsb3ctZGlzYWJsZS1saW5lXG5pZiAodHlwZW9mIFNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU2V0KSkge1xuICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS5cbiAgX1NldCA9IFNldDtcbn0gZWxzZSB7XG4gIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy5cbiAgX1NldCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2V0ICgpIHtcbiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG4gICAgU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBoYXMgKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gPT09IHRydWVcbiAgICB9O1xuICAgIFNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkIChrZXkpIHtcbiAgICAgIHRoaXMuc2V0W2tleV0gPSB0cnVlO1xuICAgIH07XG4gICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpIHtcbiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFNldDtcbiAgfSgpKTtcbn1cblxuLyogICovXG5cbnZhciB3YXJuID0gbm9vcDtcbnZhciB0aXAgPSBub29wO1xudmFyIGdlbmVyYXRlQ29tcG9uZW50VHJhY2UgPSAobm9vcCk7IC8vIHdvcmsgYXJvdW5kIGZsb3cgY2hlY2tcbnZhciBmb3JtYXRDb21wb25lbnROYW1lID0gKG5vb3ApO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgaGFzQ29uc29sZSA9IHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJztcbiAgdmFyIGNsYXNzaWZ5UkUgPSAvKD86XnxbLV9dKShcXHcpL2c7XG4gIHZhciBjbGFzc2lmeSA9IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIHN0clxuICAgIC5yZXBsYWNlKGNsYXNzaWZ5UkUsIGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRvVXBwZXJDYXNlKCk7IH0pXG4gICAgLnJlcGxhY2UoL1stX10vZywgJycpOyB9O1xuXG4gIHdhcm4gPSBmdW5jdGlvbiAobXNnLCB2bSkge1xuICAgIHZhciB0cmFjZSA9IHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJztcblxuICAgIGlmIChjb25maWcud2FybkhhbmRsZXIpIHtcbiAgICAgIGNvbmZpZy53YXJuSGFuZGxlci5jYWxsKG51bGwsIG1zZywgdm0sIHRyYWNlKTtcbiAgICB9IGVsc2UgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkge1xuICAgICAgY29uc29sZS5lcnJvcigoXCJbVnVlIHdhcm5dOiBcIiArIG1zZyArIHRyYWNlKSk7XG4gICAgfVxuICB9O1xuXG4gIHRpcCA9IGZ1bmN0aW9uIChtc2csIHZtKSB7XG4gICAgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkge1xuICAgICAgY29uc29sZS53YXJuKFwiW1Z1ZSB0aXBdOiBcIiArIG1zZyArIChcbiAgICAgICAgdm0gPyBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlKHZtKSA6ICcnXG4gICAgICApKTtcbiAgICB9XG4gIH07XG5cbiAgZm9ybWF0Q29tcG9uZW50TmFtZSA9IGZ1bmN0aW9uICh2bSwgaW5jbHVkZUZpbGUpIHtcbiAgICBpZiAodm0uJHJvb3QgPT09IHZtKSB7XG4gICAgICByZXR1cm4gJzxSb290PidcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygdm0gPT09ICdmdW5jdGlvbicgJiYgdm0uY2lkICE9IG51bGxcbiAgICAgID8gdm0ub3B0aW9uc1xuICAgICAgOiB2bS5faXNWdWVcbiAgICAgICAgPyB2bS4kb3B0aW9ucyB8fCB2bS5jb25zdHJ1Y3Rvci5vcHRpb25zXG4gICAgICAgIDogdm0gfHwge307XG4gICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgb3B0aW9ucy5fY29tcG9uZW50VGFnO1xuICAgIHZhciBmaWxlID0gb3B0aW9ucy5fX2ZpbGU7XG4gICAgaWYgKCFuYW1lICYmIGZpbGUpIHtcbiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXFxcXSspXFwudnVlJC8pO1xuICAgICAgbmFtZSA9IG1hdGNoICYmIG1hdGNoWzFdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAobmFtZSA/IChcIjxcIiArIChjbGFzc2lmeShuYW1lKSkgKyBcIj5cIikgOiBcIjxBbm9ueW1vdXM+XCIpICtcbiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/IChcIiBhdCBcIiArIGZpbGUpIDogJycpXG4gICAgKVxuICB9O1xuXG4gIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7XG4gICAgdmFyIHJlcyA9ICcnO1xuICAgIHdoaWxlIChuKSB7XG4gICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfVxuICAgICAgaWYgKG4gPiAxKSB7IHN0ciArPSBzdHI7IH1cbiAgICAgIG4gPj49IDE7XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfTtcblxuICBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gZnVuY3Rpb24gKHZtKSB7XG4gICAgaWYgKHZtLl9pc1Z1ZSAmJiB2bS4kcGFyZW50KSB7XG4gICAgICB2YXIgdHJlZSA9IFtdO1xuICAgICAgdmFyIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSA9IDA7XG4gICAgICB3aGlsZSAodm0pIHtcbiAgICAgICAgaWYgKHRyZWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhciBsYXN0ID0gdHJlZVt0cmVlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGlmIChsYXN0LmNvbnN0cnVjdG9yID09PSB2bS5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlKys7XG4gICAgICAgICAgICB2bSA9IHZtLiRwYXJlbnQ7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID4gMCkge1xuICAgICAgICAgICAgdHJlZVt0cmVlLmxlbmd0aCAtIDFdID0gW2xhc3QsIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZV07XG4gICAgICAgICAgICBjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2UgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmVlLnB1c2godm0pO1xuICAgICAgICB2bSA9IHZtLiRwYXJlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ1xcblxcbmZvdW5kIGluXFxuXFxuJyArIHRyZWVcbiAgICAgICAgLm1hcChmdW5jdGlvbiAodm0sIGkpIHsgcmV0dXJuIChcIlwiICsgKGkgPT09IDAgPyAnLS0tPiAnIDogcmVwZWF0KCcgJywgNSArIGkgKiAyKSkgKyAoQXJyYXkuaXNBcnJheSh2bSlcbiAgICAgICAgICAgID8gKChmb3JtYXRDb21wb25lbnROYW1lKHZtWzBdKSkgKyBcIi4uLiAoXCIgKyAodm1bMV0pICsgXCIgcmVjdXJzaXZlIGNhbGxzKVwiKVxuICAgICAgICAgICAgOiBmb3JtYXRDb21wb25lbnROYW1lKHZtKSkpOyB9KVxuICAgICAgICAuam9pbignXFxuJylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIChcIlxcblxcbihmb3VuZCBpbiBcIiArIChmb3JtYXRDb21wb25lbnROYW1lKHZtKSkgKyBcIilcIilcbiAgICB9XG4gIH07XG59XG5cbi8qICAqL1xuXG5cbnZhciB1aWQgPSAwO1xuXG4vKipcbiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZVxuICogZGlyZWN0aXZlcyBzdWJzY3JpYmluZyB0byBpdC5cbiAqL1xudmFyIERlcCA9IGZ1bmN0aW9uIERlcCAoKSB7XG4gIHRoaXMuaWQgPSB1aWQrKztcbiAgdGhpcy5zdWJzID0gW107XG59O1xuXG5EZXAucHJvdG90eXBlLmFkZFN1YiA9IGZ1bmN0aW9uIGFkZFN1YiAoc3ViKSB7XG4gIHRoaXMuc3Vicy5wdXNoKHN1Yik7XG59O1xuXG5EZXAucHJvdG90eXBlLnJlbW92ZVN1YiA9IGZ1bmN0aW9uIHJlbW92ZVN1YiAoc3ViKSB7XG4gIHJlbW92ZSh0aGlzLnN1YnMsIHN1Yik7XG59O1xuXG5EZXAucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uIGRlcGVuZCAoKSB7XG4gIGlmIChEZXAudGFyZ2V0KSB7XG4gICAgRGVwLnRhcmdldC5hZGREZXAodGhpcyk7XG4gIH1cbn07XG5cbkRlcC5wcm90b3R5cGUubm90aWZ5ID0gZnVuY3Rpb24gbm90aWZ5ICgpIHtcbiAgLy8gc3RhYmlsaXplIHRoZSBzdWJzY3JpYmVyIGxpc3QgZmlyc3RcbiAgdmFyIHN1YnMgPSB0aGlzLnN1YnMuc2xpY2UoKTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBzdWJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHN1YnNbaV0udXBkYXRlKCk7XG4gIH1cbn07XG5cbi8vIHRoZSBjdXJyZW50IHRhcmdldCB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZC5cbi8vIHRoaXMgaXMgZ2xvYmFsbHkgdW5pcXVlIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb25seSBvbmVcbi8vIHdhdGNoZXIgYmVpbmcgZXZhbHVhdGVkIGF0IGFueSB0aW1lLlxuRGVwLnRhcmdldCA9IG51bGw7XG52YXIgdGFyZ2V0U3RhY2sgPSBbXTtcblxuZnVuY3Rpb24gcHVzaFRhcmdldCAoX3RhcmdldCkge1xuICBpZiAoRGVwLnRhcmdldCkgeyB0YXJnZXRTdGFjay5wdXNoKERlcC50YXJnZXQpOyB9XG4gIERlcC50YXJnZXQgPSBfdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBwb3BUYXJnZXQgKCkge1xuICBEZXAudGFyZ2V0ID0gdGFyZ2V0U3RhY2sucG9wKCk7XG59XG5cbi8qICAqL1xuXG52YXIgVk5vZGUgPSBmdW5jdGlvbiBWTm9kZSAoXG4gIHRhZyxcbiAgZGF0YSxcbiAgY2hpbGRyZW4sXG4gIHRleHQsXG4gIGVsbSxcbiAgY29udGV4dCxcbiAgY29tcG9uZW50T3B0aW9ucyxcbiAgYXN5bmNGYWN0b3J5XG4pIHtcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMuZGF0YSA9IGRhdGE7XG4gIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgdGhpcy5lbG0gPSBlbG07XG4gIHRoaXMubnMgPSB1bmRlZmluZWQ7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuZm5Db250ZXh0ID0gdW5kZWZpbmVkO1xuICB0aGlzLmZuT3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgdGhpcy5mblNjb3BlSWQgPSB1bmRlZmluZWQ7XG4gIHRoaXMua2V5ID0gZGF0YSAmJiBkYXRhLmtleTtcbiAgdGhpcy5jb21wb25lbnRPcHRpb25zID0gY29tcG9uZW50T3B0aW9ucztcbiAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9IHVuZGVmaW5lZDtcbiAgdGhpcy5wYXJlbnQgPSB1bmRlZmluZWQ7XG4gIHRoaXMucmF3ID0gZmFsc2U7XG4gIHRoaXMuaXNTdGF0aWMgPSBmYWxzZTtcbiAgdGhpcy5pc1Jvb3RJbnNlcnQgPSB0cnVlO1xuICB0aGlzLmlzQ29tbWVudCA9IGZhbHNlO1xuICB0aGlzLmlzQ2xvbmVkID0gZmFsc2U7XG4gIHRoaXMuaXNPbmNlID0gZmFsc2U7XG4gIHRoaXMuYXN5bmNGYWN0b3J5ID0gYXN5bmNGYWN0b3J5O1xuICB0aGlzLmFzeW5jTWV0YSA9IHVuZGVmaW5lZDtcbiAgdGhpcy5pc0FzeW5jUGxhY2Vob2xkZXIgPSBmYWxzZTtcbn07XG5cbnZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IGNoaWxkOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbi8vIERFUFJFQ0FURUQ6IGFsaWFzIGZvciBjb21wb25lbnRJbnN0YW5jZSBmb3IgYmFja3dhcmRzIGNvbXBhdC5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5wcm90b3R5cGVBY2Nlc3NvcnMuY2hpbGQuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZVxufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZOb2RlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbnZhciBjcmVhdGVFbXB0eVZOb2RlID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgaWYgKCB0ZXh0ID09PSB2b2lkIDAgKSB0ZXh0ID0gJyc7XG5cbiAgdmFyIG5vZGUgPSBuZXcgVk5vZGUoKTtcbiAgbm9kZS50ZXh0ID0gdGV4dDtcbiAgbm9kZS5pc0NvbW1lbnQgPSB0cnVlO1xuICByZXR1cm4gbm9kZVxufTtcblxuZnVuY3Rpb24gY3JlYXRlVGV4dFZOb2RlICh2YWwpIHtcbiAgcmV0dXJuIG5ldyBWTm9kZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBTdHJpbmcodmFsKSlcbn1cblxuLy8gb3B0aW1pemVkIHNoYWxsb3cgY2xvbmVcbi8vIHVzZWQgZm9yIHN0YXRpYyBub2RlcyBhbmQgc2xvdCBub2RlcyBiZWNhdXNlIHRoZXkgbWF5IGJlIHJldXNlZCBhY3Jvc3Ncbi8vIG11bHRpcGxlIHJlbmRlcnMsIGNsb25pbmcgdGhlbSBhdm9pZHMgZXJyb3JzIHdoZW4gRE9NIG1hbmlwdWxhdGlvbnMgcmVseVxuLy8gb24gdGhlaXIgZWxtIHJlZmVyZW5jZS5cbmZ1bmN0aW9uIGNsb25lVk5vZGUgKHZub2RlKSB7XG4gIHZhciBjbG9uZWQgPSBuZXcgVk5vZGUoXG4gICAgdm5vZGUudGFnLFxuICAgIHZub2RlLmRhdGEsXG4gICAgdm5vZGUuY2hpbGRyZW4sXG4gICAgdm5vZGUudGV4dCxcbiAgICB2bm9kZS5lbG0sXG4gICAgdm5vZGUuY29udGV4dCxcbiAgICB2bm9kZS5jb21wb25lbnRPcHRpb25zLFxuICAgIHZub2RlLmFzeW5jRmFjdG9yeVxuICApO1xuICBjbG9uZWQubnMgPSB2bm9kZS5ucztcbiAgY2xvbmVkLmlzU3RhdGljID0gdm5vZGUuaXNTdGF0aWM7XG4gIGNsb25lZC5rZXkgPSB2bm9kZS5rZXk7XG4gIGNsb25lZC5pc0NvbW1lbnQgPSB2bm9kZS5pc0NvbW1lbnQ7XG4gIGNsb25lZC5mbkNvbnRleHQgPSB2bm9kZS5mbkNvbnRleHQ7XG4gIGNsb25lZC5mbk9wdGlvbnMgPSB2bm9kZS5mbk9wdGlvbnM7XG4gIGNsb25lZC5mblNjb3BlSWQgPSB2bm9kZS5mblNjb3BlSWQ7XG4gIGNsb25lZC5pc0Nsb25lZCA9IHRydWU7XG4gIHJldHVybiBjbG9uZWRcbn1cblxuLypcbiAqIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aFxuICogZHluYW1pY2FsbHkgYWNjZXNzaW5nIG1ldGhvZHMgb24gQXJyYXkgcHJvdG90eXBlXG4gKi9cblxudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG52YXIgYXJyYXlNZXRob2RzID0gT2JqZWN0LmNyZWF0ZShhcnJheVByb3RvKTtcblxudmFyIG1ldGhvZHNUb1BhdGNoID0gW1xuICAncHVzaCcsXG4gICdwb3AnLFxuICAnc2hpZnQnLFxuICAndW5zaGlmdCcsXG4gICdzcGxpY2UnLFxuICAnc29ydCcsXG4gICdyZXZlcnNlJ1xuXTtcblxuLyoqXG4gKiBJbnRlcmNlcHQgbXV0YXRpbmcgbWV0aG9kcyBhbmQgZW1pdCBldmVudHNcbiAqL1xubWV0aG9kc1RvUGF0Y2guZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gIC8vIGNhY2hlIG9yaWdpbmFsIG1ldGhvZFxuICB2YXIgb3JpZ2luYWwgPSBhcnJheVByb3RvW21ldGhvZF07XG4gIGRlZihhcnJheU1ldGhvZHMsIG1ldGhvZCwgZnVuY3Rpb24gbXV0YXRvciAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgdmFyIHJlc3VsdCA9IG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIHZhciBvYiA9IHRoaXMuX19vYl9fO1xuICAgIHZhciBpbnNlcnRlZDtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAncHVzaCc6XG4gICAgICBjYXNlICd1bnNoaWZ0JzpcbiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzO1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnc3BsaWNlJzpcbiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzLnNsaWNlKDIpO1xuICAgICAgICBicmVha1xuICAgIH1cbiAgICBpZiAoaW5zZXJ0ZWQpIHsgb2Iub2JzZXJ2ZUFycmF5KGluc2VydGVkKTsgfVxuICAgIC8vIG5vdGlmeSBjaGFuZ2VcbiAgICBvYi5kZXAubm90aWZ5KCk7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KTtcbn0pO1xuXG4vKiAgKi9cblxudmFyIGFycmF5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFycmF5TWV0aG9kcyk7XG5cbi8qKlxuICogSW4gc29tZSBjYXNlcyB3ZSBtYXkgd2FudCB0byBkaXNhYmxlIG9ic2VydmF0aW9uIGluc2lkZSBhIGNvbXBvbmVudCdzXG4gKiB1cGRhdGUgY29tcHV0YXRpb24uXG4gKi9cbnZhciBzaG91bGRPYnNlcnZlID0gdHJ1ZTtcblxuZnVuY3Rpb24gdG9nZ2xlT2JzZXJ2aW5nICh2YWx1ZSkge1xuICBzaG91bGRPYnNlcnZlID0gdmFsdWU7XG59XG5cbi8qKlxuICogT2JzZXJ2ZXIgY2xhc3MgdGhhdCBpcyBhdHRhY2hlZCB0byBlYWNoIG9ic2VydmVkXG4gKiBvYmplY3QuIE9uY2UgYXR0YWNoZWQsIHRoZSBvYnNlcnZlciBjb252ZXJ0cyB0aGUgdGFyZ2V0XG4gKiBvYmplY3QncyBwcm9wZXJ0eSBrZXlzIGludG8gZ2V0dGVyL3NldHRlcnMgdGhhdFxuICogY29sbGVjdCBkZXBlbmRlbmNpZXMgYW5kIGRpc3BhdGNoIHVwZGF0ZXMuXG4gKi9cbnZhciBPYnNlcnZlciA9IGZ1bmN0aW9uIE9ic2VydmVyICh2YWx1ZSkge1xuICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIHRoaXMuZGVwID0gbmV3IERlcCgpO1xuICB0aGlzLnZtQ291bnQgPSAwO1xuICBkZWYodmFsdWUsICdfX29iX18nLCB0aGlzKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdmFyIGF1Z21lbnQgPSBoYXNQcm90b1xuICAgICAgPyBwcm90b0F1Z21lbnRcbiAgICAgIDogY29weUF1Z21lbnQ7XG4gICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpO1xuICAgIHRoaXMub2JzZXJ2ZUFycmF5KHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLndhbGsodmFsdWUpO1xuICB9XG59O1xuXG4vKipcbiAqIFdhbGsgdGhyb3VnaCBlYWNoIHByb3BlcnR5IGFuZCBjb252ZXJ0IHRoZW0gaW50b1xuICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuXG4gKiB2YWx1ZSB0eXBlIGlzIE9iamVjdC5cbiAqL1xuT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBkZWZpbmVSZWFjdGl2ZShvYmosIGtleXNbaV0pO1xuICB9XG59O1xuXG4vKipcbiAqIE9ic2VydmUgYSBsaXN0IG9mIEFycmF5IGl0ZW1zLlxuICovXG5PYnNlcnZlci5wcm90b3R5cGUub2JzZXJ2ZUFycmF5ID0gZnVuY3Rpb24gb2JzZXJ2ZUFycmF5IChpdGVtcykge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGl0ZW1zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIG9ic2VydmUoaXRlbXNbaV0pO1xuICB9XG59O1xuXG4vLyBoZWxwZXJzXG5cbi8qKlxuICogQXVnbWVudCBhbiB0YXJnZXQgT2JqZWN0IG9yIEFycmF5IGJ5IGludGVyY2VwdGluZ1xuICogdGhlIHByb3RvdHlwZSBjaGFpbiB1c2luZyBfX3Byb3RvX19cbiAqL1xuZnVuY3Rpb24gcHJvdG9BdWdtZW50ICh0YXJnZXQsIHNyYywga2V5cykge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuICB0YXJnZXQuX19wcm90b19fID0gc3JjO1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXByb3RvICovXG59XG5cbi8qKlxuICogQXVnbWVudCBhbiB0YXJnZXQgT2JqZWN0IG9yIEFycmF5IGJ5IGRlZmluaW5nXG4gKiBoaWRkZW4gcHJvcGVydGllcy5cbiAqL1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGNvcHlBdWdtZW50ICh0YXJnZXQsIHNyYywga2V5cykge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgZGVmKHRhcmdldCwga2V5LCBzcmNba2V5XSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIGNyZWF0ZSBhbiBvYnNlcnZlciBpbnN0YW5jZSBmb3IgYSB2YWx1ZSxcbiAqIHJldHVybnMgdGhlIG5ldyBvYnNlcnZlciBpZiBzdWNjZXNzZnVsbHkgb2JzZXJ2ZWQsXG4gKiBvciB0aGUgZXhpc3Rpbmcgb2JzZXJ2ZXIgaWYgdGhlIHZhbHVlIGFscmVhZHkgaGFzIG9uZS5cbiAqL1xuZnVuY3Rpb24gb2JzZXJ2ZSAodmFsdWUsIGFzUm9vdERhdGEpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBWTm9kZSkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciBvYjtcbiAgaWYgKGhhc093bih2YWx1ZSwgJ19fb2JfXycpICYmIHZhbHVlLl9fb2JfXyBpbnN0YW5jZW9mIE9ic2VydmVyKSB7XG4gICAgb2IgPSB2YWx1ZS5fX29iX187XG4gIH0gZWxzZSBpZiAoXG4gICAgc2hvdWxkT2JzZXJ2ZSAmJlxuICAgICFpc1NlcnZlclJlbmRlcmluZygpICYmXG4gICAgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IGlzUGxhaW5PYmplY3QodmFsdWUpKSAmJlxuICAgIE9iamVjdC5pc0V4dGVuc2libGUodmFsdWUpICYmXG4gICAgIXZhbHVlLl9pc1Z1ZVxuICApIHtcbiAgICBvYiA9IG5ldyBPYnNlcnZlcih2YWx1ZSk7XG4gIH1cbiAgaWYgKGFzUm9vdERhdGEgJiYgb2IpIHtcbiAgICBvYi52bUNvdW50Kys7XG4gIH1cbiAgcmV0dXJuIG9iXG59XG5cbi8qKlxuICogRGVmaW5lIGEgcmVhY3RpdmUgcHJvcGVydHkgb24gYW4gT2JqZWN0LlxuICovXG5mdW5jdGlvbiBkZWZpbmVSZWFjdGl2ZSAoXG4gIG9iaixcbiAga2V5LFxuICB2YWwsXG4gIGN1c3RvbVNldHRlcixcbiAgc2hhbGxvd1xuKSB7XG4gIHZhciBkZXAgPSBuZXcgRGVwKCk7XG5cbiAgdmFyIHByb3BlcnR5ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSk7XG4gIGlmIChwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5jb25maWd1cmFibGUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBjYXRlciBmb3IgcHJlLWRlZmluZWQgZ2V0dGVyL3NldHRlcnNcbiAgdmFyIGdldHRlciA9IHByb3BlcnR5ICYmIHByb3BlcnR5LmdldDtcbiAgaWYgKCFnZXR0ZXIgJiYgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIHZhbCA9IG9ialtrZXldO1xuICB9XG4gIHZhciBzZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5zZXQ7XG5cbiAgdmFyIGNoaWxkT2IgPSAhc2hhbGxvdyAmJiBvYnNlcnZlKHZhbCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gcmVhY3RpdmVHZXR0ZXIgKCkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDtcbiAgICAgIGlmIChEZXAudGFyZ2V0KSB7XG4gICAgICAgIGRlcC5kZXBlbmQoKTtcbiAgICAgICAgaWYgKGNoaWxkT2IpIHtcbiAgICAgICAgICBjaGlsZE9iLmRlcC5kZXBlbmQoKTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlciAobmV3VmFsKSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXR0ZXIgPyBnZXR0ZXIuY2FsbChvYmopIDogdmFsO1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlICovXG4gICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBjdXN0b21TZXR0ZXIpIHtcbiAgICAgICAgY3VzdG9tU2V0dGVyKCk7XG4gICAgICB9XG4gICAgICBpZiAoc2V0dGVyKSB7XG4gICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbCA9IG5ld1ZhbDtcbiAgICAgIH1cbiAgICAgIGNoaWxkT2IgPSAhc2hhbGxvdyAmJiBvYnNlcnZlKG5ld1ZhbCk7XG4gICAgICBkZXAubm90aWZ5KCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBTZXQgYSBwcm9wZXJ0eSBvbiBhbiBvYmplY3QuIEFkZHMgdGhlIG5ldyBwcm9wZXJ0eSBhbmRcbiAqIHRyaWdnZXJzIGNoYW5nZSBub3RpZmljYXRpb24gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3RcbiAqIGFscmVhZHkgZXhpc3QuXG4gKi9cbmZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSlcbiAgKSB7XG4gICAgd2FybigoXCJDYW5ub3Qgc2V0IHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiBcIiArICgodGFyZ2V0KSkpKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHtcbiAgICB0YXJnZXQubGVuZ3RoID0gTWF0aC5tYXgodGFyZ2V0Lmxlbmd0aCwga2V5KTtcbiAgICB0YXJnZXQuc3BsaWNlKGtleSwgMSwgdmFsKTtcbiAgICByZXR1cm4gdmFsXG4gIH1cbiAgaWYgKGtleSBpbiB0YXJnZXQgJiYgIShrZXkgaW4gT2JqZWN0LnByb3RvdHlwZSkpIHtcbiAgICB0YXJnZXRba2V5XSA9IHZhbDtcbiAgICByZXR1cm4gdmFsXG4gIH1cbiAgdmFyIG9iID0gKHRhcmdldCkuX19vYl9fO1xuICBpZiAodGFyZ2V0Ll9pc1Z1ZSB8fCAob2IgJiYgb2Iudm1Db3VudCkpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAnQXZvaWQgYWRkaW5nIHJlYWN0aXZlIHByb3BlcnRpZXMgdG8gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArXG4gICAgICAnYXQgcnVudGltZSAtIGRlY2xhcmUgaXQgdXBmcm9udCBpbiB0aGUgZGF0YSBvcHRpb24uJ1xuICAgICk7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIGlmICghb2IpIHtcbiAgICB0YXJnZXRba2V5XSA9IHZhbDtcbiAgICByZXR1cm4gdmFsXG4gIH1cbiAgZGVmaW5lUmVhY3RpdmUob2IudmFsdWUsIGtleSwgdmFsKTtcbiAgb2IuZGVwLm5vdGlmeSgpO1xuICByZXR1cm4gdmFsXG59XG5cbi8qKlxuICogRGVsZXRlIGEgcHJvcGVydHkgYW5kIHRyaWdnZXIgY2hhbmdlIGlmIG5lY2Vzc2FyeS5cbiAqL1xuZnVuY3Rpb24gZGVsICh0YXJnZXQsIGtleSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSlcbiAgKSB7XG4gICAgd2FybigoXCJDYW5ub3QgZGVsZXRlIHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiBcIiArICgodGFyZ2V0KSkpKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHtcbiAgICB0YXJnZXQuc3BsaWNlKGtleSwgMSk7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIG9iID0gKHRhcmdldCkuX19vYl9fO1xuICBpZiAodGFyZ2V0Ll9pc1Z1ZSB8fCAob2IgJiYgb2Iudm1Db3VudCkpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAnQXZvaWQgZGVsZXRpbmcgcHJvcGVydGllcyBvbiBhIFZ1ZSBpbnN0YW5jZSBvciBpdHMgcm9vdCAkZGF0YSAnICtcbiAgICAgICctIGp1c3Qgc2V0IGl0IHRvIG51bGwuJ1xuICAgICk7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKCFoYXNPd24odGFyZ2V0LCBrZXkpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgZGVsZXRlIHRhcmdldFtrZXldO1xuICBpZiAoIW9iKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgb2IuZGVwLm5vdGlmeSgpO1xufVxuXG4vKipcbiAqIENvbGxlY3QgZGVwZW5kZW5jaWVzIG9uIGFycmF5IGVsZW1lbnRzIHdoZW4gdGhlIGFycmF5IGlzIHRvdWNoZWQsIHNpbmNlXG4gKiB3ZSBjYW5ub3QgaW50ZXJjZXB0IGFycmF5IGVsZW1lbnQgYWNjZXNzIGxpa2UgcHJvcGVydHkgZ2V0dGVycy5cbiAqL1xuZnVuY3Rpb24gZGVwZW5kQXJyYXkgKHZhbHVlKSB7XG4gIGZvciAodmFyIGUgPSAodm9pZCAwKSwgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBlID0gdmFsdWVbaV07XG4gICAgZSAmJiBlLl9fb2JfXyAmJiBlLl9fb2JfXy5kZXAuZGVwZW5kKCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgIGRlcGVuZEFycmF5KGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBPcHRpb24gb3ZlcndyaXRpbmcgc3RyYXRlZ2llcyBhcmUgZnVuY3Rpb25zIHRoYXQgaGFuZGxlXG4gKiBob3cgdG8gbWVyZ2UgYSBwYXJlbnQgb3B0aW9uIHZhbHVlIGFuZCBhIGNoaWxkIG9wdGlvblxuICogdmFsdWUgaW50byB0aGUgZmluYWwgdmFsdWUuXG4gKi9cbnZhciBzdHJhdHMgPSBjb25maWcub3B0aW9uTWVyZ2VTdHJhdGVnaWVzO1xuXG4vKipcbiAqIE9wdGlvbnMgd2l0aCByZXN0cmljdGlvbnNcbiAqL1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgc3RyYXRzLmVsID0gc3RyYXRzLnByb3BzRGF0YSA9IGZ1bmN0aW9uIChwYXJlbnQsIGNoaWxkLCB2bSwga2V5KSB7XG4gICAgaWYgKCF2bSkge1xuICAgICAgd2FybihcbiAgICAgICAgXCJvcHRpb24gXFxcIlwiICsga2V5ICsgXCJcXFwiIGNhbiBvbmx5IGJlIHVzZWQgZHVyaW5nIGluc3RhbmNlIFwiICtcbiAgICAgICAgJ2NyZWF0aW9uIHdpdGggdGhlIGBuZXdgIGtleXdvcmQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRTdHJhdChwYXJlbnQsIGNoaWxkKVxuICB9O1xufVxuXG4vKipcbiAqIEhlbHBlciB0aGF0IHJlY3Vyc2l2ZWx5IG1lcmdlcyB0d28gZGF0YSBvYmplY3RzIHRvZ2V0aGVyLlxuICovXG5mdW5jdGlvbiBtZXJnZURhdGEgKHRvLCBmcm9tKSB7XG4gIGlmICghZnJvbSkgeyByZXR1cm4gdG8gfVxuICB2YXIga2V5LCB0b1ZhbCwgZnJvbVZhbDtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcm9tKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICB0b1ZhbCA9IHRvW2tleV07XG4gICAgZnJvbVZhbCA9IGZyb21ba2V5XTtcbiAgICBpZiAoIWhhc093bih0bywga2V5KSkge1xuICAgICAgc2V0KHRvLCBrZXksIGZyb21WYWwpO1xuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh0b1ZhbCkgJiYgaXNQbGFpbk9iamVjdChmcm9tVmFsKSkge1xuICAgICAgbWVyZ2VEYXRhKHRvVmFsLCBmcm9tVmFsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvXG59XG5cbi8qKlxuICogRGF0YVxuICovXG5mdW5jdGlvbiBtZXJnZURhdGFPckZuIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbCxcbiAgdm1cbikge1xuICBpZiAoIXZtKSB7XG4gICAgLy8gaW4gYSBWdWUuZXh0ZW5kIG1lcmdlLCBib3RoIHNob3VsZCBiZSBmdW5jdGlvbnNcbiAgICBpZiAoIWNoaWxkVmFsKSB7XG4gICAgICByZXR1cm4gcGFyZW50VmFsXG4gICAgfVxuICAgIGlmICghcGFyZW50VmFsKSB7XG4gICAgICByZXR1cm4gY2hpbGRWYWxcbiAgICB9XG4gICAgLy8gd2hlbiBwYXJlbnRWYWwgJiBjaGlsZFZhbCBhcmUgYm90aCBwcmVzZW50LFxuICAgIC8vIHdlIG5lZWQgdG8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZVxuICAgIC8vIG1lcmdlZCByZXN1bHQgb2YgYm90aCBmdW5jdGlvbnMuLi4gbm8gbmVlZCB0b1xuICAgIC8vIGNoZWNrIGlmIHBhcmVudFZhbCBpcyBhIGZ1bmN0aW9uIGhlcmUgYmVjYXVzZVxuICAgIC8vIGl0IGhhcyB0byBiZSBhIGZ1bmN0aW9uIHRvIHBhc3MgcHJldmlvdXMgbWVyZ2VzLlxuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWREYXRhRm4gKCkge1xuICAgICAgcmV0dXJuIG1lcmdlRGF0YShcbiAgICAgICAgdHlwZW9mIGNoaWxkVmFsID09PSAnZnVuY3Rpb24nID8gY2hpbGRWYWwuY2FsbCh0aGlzLCB0aGlzKSA6IGNoaWxkVmFsLFxuICAgICAgICB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nID8gcGFyZW50VmFsLmNhbGwodGhpcywgdGhpcykgOiBwYXJlbnRWYWxcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZEluc3RhbmNlRGF0YUZuICgpIHtcbiAgICAgIC8vIGluc3RhbmNlIG1lcmdlXG4gICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdHlwZW9mIGNoaWxkVmFsID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gY2hpbGRWYWwuY2FsbCh2bSwgdm0pXG4gICAgICAgIDogY2hpbGRWYWw7XG4gICAgICB2YXIgZGVmYXVsdERhdGEgPSB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gcGFyZW50VmFsLmNhbGwodm0sIHZtKVxuICAgICAgICA6IHBhcmVudFZhbDtcbiAgICAgIGlmIChpbnN0YW5jZURhdGEpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlRGF0YShpbnN0YW5jZURhdGEsIGRlZmF1bHREYXRhKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHREYXRhXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnN0cmF0cy5kYXRhID0gZnVuY3Rpb24gKFxuICBwYXJlbnRWYWwsXG4gIGNoaWxkVmFsLFxuICB2bVxuKSB7XG4gIGlmICghdm0pIHtcbiAgICBpZiAoY2hpbGRWYWwgJiYgdHlwZW9mIGNoaWxkVmFsICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAgICdUaGUgXCJkYXRhXCIgb3B0aW9uIHNob3VsZCBiZSBhIGZ1bmN0aW9uICcgK1xuICAgICAgICAndGhhdCByZXR1cm5zIGEgcGVyLWluc3RhbmNlIHZhbHVlIGluIGNvbXBvbmVudCAnICtcbiAgICAgICAgJ2RlZmluaXRpb25zLicsXG4gICAgICAgIHZtXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gcGFyZW50VmFsXG4gICAgfVxuICAgIHJldHVybiBtZXJnZURhdGFPckZuKHBhcmVudFZhbCwgY2hpbGRWYWwpXG4gIH1cblxuICByZXR1cm4gbWVyZ2VEYXRhT3JGbihwYXJlbnRWYWwsIGNoaWxkVmFsLCB2bSlcbn07XG5cbi8qKlxuICogSG9va3MgYW5kIHByb3BzIGFyZSBtZXJnZWQgYXMgYXJyYXlzLlxuICovXG5mdW5jdGlvbiBtZXJnZUhvb2sgKFxuICBwYXJlbnRWYWwsXG4gIGNoaWxkVmFsXG4pIHtcbiAgcmV0dXJuIGNoaWxkVmFsXG4gICAgPyBwYXJlbnRWYWxcbiAgICAgID8gcGFyZW50VmFsLmNvbmNhdChjaGlsZFZhbClcbiAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZFZhbClcbiAgICAgICAgPyBjaGlsZFZhbFxuICAgICAgICA6IFtjaGlsZFZhbF1cbiAgICA6IHBhcmVudFZhbFxufVxuXG5MSUZFQ1lDTEVfSE9PS1MuZm9yRWFjaChmdW5jdGlvbiAoaG9vaykge1xuICBzdHJhdHNbaG9va10gPSBtZXJnZUhvb2s7XG59KTtcblxuLyoqXG4gKiBBc3NldHNcbiAqXG4gKiBXaGVuIGEgdm0gaXMgcHJlc2VudCAoaW5zdGFuY2UgY3JlYXRpb24pLCB3ZSBuZWVkIHRvIGRvXG4gKiBhIHRocmVlLXdheSBtZXJnZSBiZXR3ZWVuIGNvbnN0cnVjdG9yIG9wdGlvbnMsIGluc3RhbmNlXG4gKiBvcHRpb25zIGFuZCBwYXJlbnQgb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VBc3NldHMgKFxuICBwYXJlbnRWYWwsXG4gIGNoaWxkVmFsLFxuICB2bSxcbiAga2V5XG4pIHtcbiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUocGFyZW50VmFsIHx8IG51bGwpO1xuICBpZiAoY2hpbGRWYWwpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGFzc2VydE9iamVjdFR5cGUoa2V5LCBjaGlsZFZhbCwgdm0pO1xuICAgIHJldHVybiBleHRlbmQocmVzLCBjaGlsZFZhbClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVzXG4gIH1cbn1cblxuQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICBzdHJhdHNbdHlwZSArICdzJ10gPSBtZXJnZUFzc2V0cztcbn0pO1xuXG4vKipcbiAqIFdhdGNoZXJzLlxuICpcbiAqIFdhdGNoZXJzIGhhc2hlcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBvbmVcbiAqIGFub3RoZXIsIHNvIHdlIG1lcmdlIHRoZW0gYXMgYXJyYXlzLlxuICovXG5zdHJhdHMud2F0Y2ggPSBmdW5jdGlvbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtLFxuICBrZXlcbikge1xuICAvLyB3b3JrIGFyb3VuZCBGaXJlZm94J3MgT2JqZWN0LnByb3RvdHlwZS53YXRjaC4uLlxuICBpZiAocGFyZW50VmFsID09PSBuYXRpdmVXYXRjaCkgeyBwYXJlbnRWYWwgPSB1bmRlZmluZWQ7IH1cbiAgaWYgKGNoaWxkVmFsID09PSBuYXRpdmVXYXRjaCkgeyBjaGlsZFZhbCA9IHVuZGVmaW5lZDsgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKCFjaGlsZFZhbCkgeyByZXR1cm4gT2JqZWN0LmNyZWF0ZShwYXJlbnRWYWwgfHwgbnVsbCkgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydE9iamVjdFR5cGUoa2V5LCBjaGlsZFZhbCwgdm0pO1xuICB9XG4gIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9XG4gIHZhciByZXQgPSB7fTtcbiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTtcbiAgZm9yICh2YXIga2V5JDEgaW4gY2hpbGRWYWwpIHtcbiAgICB2YXIgcGFyZW50ID0gcmV0W2tleSQxXTtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZFZhbFtrZXkkMV07XG4gICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7XG4gICAgICBwYXJlbnQgPSBbcGFyZW50XTtcbiAgICB9XG4gICAgcmV0W2tleSQxXSA9IHBhcmVudFxuICAgICAgPyBwYXJlbnQuY29uY2F0KGNoaWxkKVxuICAgICAgOiBBcnJheS5pc0FycmF5KGNoaWxkKSA/IGNoaWxkIDogW2NoaWxkXTtcbiAgfVxuICByZXR1cm4gcmV0XG59O1xuXG4vKipcbiAqIE90aGVyIG9iamVjdCBoYXNoZXMuXG4gKi9cbnN0cmF0cy5wcm9wcyA9XG5zdHJhdHMubWV0aG9kcyA9XG5zdHJhdHMuaW5qZWN0ID1cbnN0cmF0cy5jb21wdXRlZCA9IGZ1bmN0aW9uIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbCxcbiAgdm0sXG4gIGtleVxuKSB7XG4gIGlmIChjaGlsZFZhbCAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7XG4gIH1cbiAgaWYgKCFwYXJlbnRWYWwpIHsgcmV0dXJuIGNoaWxkVmFsIH1cbiAgdmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7XG4gIGlmIChjaGlsZFZhbCkgeyBleHRlbmQocmV0LCBjaGlsZFZhbCk7IH1cbiAgcmV0dXJuIHJldFxufTtcbnN0cmF0cy5wcm92aWRlID0gbWVyZ2VEYXRhT3JGbjtcblxuLyoqXG4gKiBEZWZhdWx0IHN0cmF0ZWd5LlxuICovXG52YXIgZGVmYXVsdFN0cmF0ID0gZnVuY3Rpb24gKHBhcmVudFZhbCwgY2hpbGRWYWwpIHtcbiAgcmV0dXJuIGNoaWxkVmFsID09PSB1bmRlZmluZWRcbiAgICA/IHBhcmVudFZhbFxuICAgIDogY2hpbGRWYWxcbn07XG5cbi8qKlxuICogVmFsaWRhdGUgY29tcG9uZW50IG5hbWVzXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQ29tcG9uZW50cyAob3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5jb21wb25lbnRzKSB7XG4gICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb21wb25lbnROYW1lIChuYW1lKSB7XG4gIGlmICghL15bYS16QS1aXVtcXHctXSokLy50ZXN0KG5hbWUpKSB7XG4gICAgd2FybihcbiAgICAgICdJbnZhbGlkIGNvbXBvbmVudCBuYW1lOiBcIicgKyBuYW1lICsgJ1wiLiBDb21wb25lbnQgbmFtZXMgJyArXG4gICAgICAnY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdGhlIGh5cGhlbiwgJyArXG4gICAgICAnYW5kIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlci4nXG4gICAgKTtcbiAgfVxuICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGNvbmZpZy5pc1Jlc2VydmVkVGFnKG5hbWUpKSB7XG4gICAgd2FybihcbiAgICAgICdEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50ICcgK1xuICAgICAgJ2lkOiAnICsgbmFtZVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBFbnN1cmUgYWxsIHByb3BzIG9wdGlvbiBzeW50YXggYXJlIG5vcm1hbGl6ZWQgaW50byB0aGVcbiAqIE9iamVjdC1iYXNlZCBmb3JtYXQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzIChvcHRpb25zLCB2bSkge1xuICB2YXIgcHJvcHMgPSBvcHRpb25zLnByb3BzO1xuICBpZiAoIXByb3BzKSB7IHJldHVybiB9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGksIHZhbCwgbmFtZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMpKSB7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB2YWwgPSBwcm9wc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICBuYW1lID0gY2FtZWxpemUodmFsKTtcbiAgICAgICAgcmVzW25hbWVdID0geyB0eXBlOiBudWxsIH07XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybigncHJvcHMgbXVzdCBiZSBzdHJpbmdzIHdoZW4gdXNpbmcgYXJyYXkgc3ludGF4LicpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHByb3BzKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFsID0gcHJvcHNba2V5XTtcbiAgICAgIG5hbWUgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgcmVzW25hbWVdID0gaXNQbGFpbk9iamVjdCh2YWwpXG4gICAgICAgID8gdmFsXG4gICAgICAgIDogeyB0eXBlOiB2YWwgfTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm4oXG4gICAgICBcIkludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiBcXFwicHJvcHNcXFwiOiBleHBlY3RlZCBhbiBBcnJheSBvciBhbiBPYmplY3QsIFwiICtcbiAgICAgIFwiYnV0IGdvdCBcIiArICh0b1Jhd1R5cGUocHJvcHMpKSArIFwiLlwiLFxuICAgICAgdm1cbiAgICApO1xuICB9XG4gIG9wdGlvbnMucHJvcHMgPSByZXM7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGFsbCBpbmplY3Rpb25zIGludG8gT2JqZWN0LWJhc2VkIGZvcm1hdFxuICovXG5mdW5jdGlvbiBub3JtYWxpemVJbmplY3QgKG9wdGlvbnMsIHZtKSB7XG4gIHZhciBpbmplY3QgPSBvcHRpb25zLmluamVjdDtcbiAgaWYgKCFpbmplY3QpIHsgcmV0dXJuIH1cbiAgdmFyIG5vcm1hbGl6ZWQgPSBvcHRpb25zLmluamVjdCA9IHt9O1xuICBpZiAoQXJyYXkuaXNBcnJheShpbmplY3QpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmplY3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vcm1hbGl6ZWRbaW5qZWN0W2ldXSA9IHsgZnJvbTogaW5qZWN0W2ldIH07XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoaW5qZWN0KSkge1xuICAgIGZvciAodmFyIGtleSBpbiBpbmplY3QpIHtcbiAgICAgIHZhciB2YWwgPSBpbmplY3Rba2V5XTtcbiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGlzUGxhaW5PYmplY3QodmFsKVxuICAgICAgICA/IGV4dGVuZCh7IGZyb206IGtleSB9LCB2YWwpXG4gICAgICAgIDogeyBmcm9tOiB2YWwgfTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm4oXG4gICAgICBcIkludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiBcXFwiaW5qZWN0XFxcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCBcIiArXG4gICAgICBcImJ1dCBnb3QgXCIgKyAodG9SYXdUeXBlKGluamVjdCkpICsgXCIuXCIsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgcmF3IGZ1bmN0aW9uIGRpcmVjdGl2ZXMgaW50byBvYmplY3QgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzIChvcHRpb25zKSB7XG4gIHZhciBkaXJzID0gb3B0aW9ucy5kaXJlY3RpdmVzO1xuICBpZiAoZGlycykge1xuICAgIGZvciAodmFyIGtleSBpbiBkaXJzKSB7XG4gICAgICB2YXIgZGVmID0gZGlyc1trZXldO1xuICAgICAgaWYgKHR5cGVvZiBkZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGlyc1trZXldID0geyBiaW5kOiBkZWYsIHVwZGF0ZTogZGVmIH07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGUgKG5hbWUsIHZhbHVlLCB2bSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgd2FybihcbiAgICAgIFwiSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uIFxcXCJcIiArIG5hbWUgKyBcIlxcXCI6IGV4cGVjdGVkIGFuIE9iamVjdCwgXCIgK1xuICAgICAgXCJidXQgZ290IFwiICsgKHRvUmF3VHlwZSh2YWx1ZSkpICsgXCIuXCIsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXJnZSB0d28gb3B0aW9uIG9iamVjdHMgaW50byBhIG5ldyBvbmUuXG4gKiBDb3JlIHV0aWxpdHkgdXNlZCBpbiBib3RoIGluc3RhbnRpYXRpb24gYW5kIGluaGVyaXRhbmNlLlxuICovXG5mdW5jdGlvbiBtZXJnZU9wdGlvbnMgKFxuICBwYXJlbnQsXG4gIGNoaWxkLFxuICB2bVxuKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY2hlY2tDb21wb25lbnRzKGNoaWxkKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjaGlsZCA9IGNoaWxkLm9wdGlvbnM7XG4gIH1cblxuICBub3JtYWxpemVQcm9wcyhjaGlsZCwgdm0pO1xuICBub3JtYWxpemVJbmplY3QoY2hpbGQsIHZtKTtcbiAgbm9ybWFsaXplRGlyZWN0aXZlcyhjaGlsZCk7XG4gIHZhciBleHRlbmRzRnJvbSA9IGNoaWxkLmV4dGVuZHM7XG4gIGlmIChleHRlbmRzRnJvbSkge1xuICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGV4dGVuZHNGcm9tLCB2bSk7XG4gIH1cbiAgaWYgKGNoaWxkLm1peGlucykge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGQubWl4aW5zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgcGFyZW50ID0gbWVyZ2VPcHRpb25zKHBhcmVudCwgY2hpbGQubWl4aW5zW2ldLCB2bSk7XG4gICAgfVxuICB9XG4gIHZhciBvcHRpb25zID0ge307XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIHBhcmVudCkge1xuICAgIG1lcmdlRmllbGQoa2V5KTtcbiAgfVxuICBmb3IgKGtleSBpbiBjaGlsZCkge1xuICAgIGlmICghaGFzT3duKHBhcmVudCwga2V5KSkge1xuICAgICAgbWVyZ2VGaWVsZChrZXkpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBtZXJnZUZpZWxkIChrZXkpIHtcbiAgICB2YXIgc3RyYXQgPSBzdHJhdHNba2V5XSB8fCBkZWZhdWx0U3RyYXQ7XG4gICAgb3B0aW9uc1trZXldID0gc3RyYXQocGFyZW50W2tleV0sIGNoaWxkW2tleV0sIHZtLCBrZXkpO1xuICB9XG4gIHJldHVybiBvcHRpb25zXG59XG5cbi8qKlxuICogUmVzb2x2ZSBhbiBhc3NldC5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBiZWNhdXNlIGNoaWxkIGluc3RhbmNlcyBuZWVkIGFjY2Vzc1xuICogdG8gYXNzZXRzIGRlZmluZWQgaW4gaXRzIGFuY2VzdG9yIGNoYWluLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQXNzZXQgKFxuICBvcHRpb25zLFxuICB0eXBlLFxuICBpZCxcbiAgd2Fybk1pc3Npbmdcbikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgYXNzZXRzID0gb3B0aW9uc1t0eXBlXTtcbiAgLy8gY2hlY2sgbG9jYWwgcmVnaXN0cmF0aW9uIHZhcmlhdGlvbnMgZmlyc3RcbiAgaWYgKGhhc093bihhc3NldHMsIGlkKSkgeyByZXR1cm4gYXNzZXRzW2lkXSB9XG4gIHZhciBjYW1lbGl6ZWRJZCA9IGNhbWVsaXplKGlkKTtcbiAgaWYgKGhhc093bihhc3NldHMsIGNhbWVsaXplZElkKSkgeyByZXR1cm4gYXNzZXRzW2NhbWVsaXplZElkXSB9XG4gIHZhciBQYXNjYWxDYXNlSWQgPSBjYXBpdGFsaXplKGNhbWVsaXplZElkKTtcbiAgaWYgKGhhc093bihhc3NldHMsIFBhc2NhbENhc2VJZCkpIHsgcmV0dXJuIGFzc2V0c1tQYXNjYWxDYXNlSWRdIH1cbiAgLy8gZmFsbGJhY2sgdG8gcHJvdG90eXBlIGNoYWluXG4gIHZhciByZXMgPSBhc3NldHNbaWRdIHx8IGFzc2V0c1tjYW1lbGl6ZWRJZF0gfHwgYXNzZXRzW1Bhc2NhbENhc2VJZF07XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm5NaXNzaW5nICYmICFyZXMpIHtcbiAgICB3YXJuKFxuICAgICAgJ0ZhaWxlZCB0byByZXNvbHZlICcgKyB0eXBlLnNsaWNlKDAsIC0xKSArICc6ICcgKyBpZCxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcCAoXG4gIGtleSxcbiAgcHJvcE9wdGlvbnMsXG4gIHByb3BzRGF0YSxcbiAgdm1cbikge1xuICB2YXIgcHJvcCA9IHByb3BPcHRpb25zW2tleV07XG4gIHZhciBhYnNlbnQgPSAhaGFzT3duKHByb3BzRGF0YSwga2V5KTtcbiAgdmFyIHZhbHVlID0gcHJvcHNEYXRhW2tleV07XG4gIC8vIGJvb2xlYW4gY2FzdGluZ1xuICB2YXIgYm9vbGVhbkluZGV4ID0gZ2V0VHlwZUluZGV4KEJvb2xlYW4sIHByb3AudHlwZSk7XG4gIGlmIChib29sZWFuSW5kZXggPiAtMSkge1xuICAgIGlmIChhYnNlbnQgJiYgIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7XG4gICAgICB2YWx1ZSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBoeXBoZW5hdGUoa2V5KSkge1xuICAgICAgLy8gb25seSBjYXN0IGVtcHR5IHN0cmluZyAvIHNhbWUgbmFtZSB0byBib29sZWFuIGlmXG4gICAgICAvLyBib29sZWFuIGhhcyBoaWdoZXIgcHJpb3JpdHlcbiAgICAgIHZhciBzdHJpbmdJbmRleCA9IGdldFR5cGVJbmRleChTdHJpbmcsIHByb3AudHlwZSk7XG4gICAgICBpZiAoc3RyaW5nSW5kZXggPCAwIHx8IGJvb2xlYW5JbmRleCA8IHN0cmluZ0luZGV4KSB7XG4gICAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gY2hlY2sgZGVmYXVsdCB2YWx1ZVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHZhbHVlID0gZ2V0UHJvcERlZmF1bHRWYWx1ZSh2bSwgcHJvcCwga2V5KTtcbiAgICAvLyBzaW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhIGZyZXNoIGNvcHksXG4gICAgLy8gbWFrZSBzdXJlIHRvIG9ic2VydmUgaXQuXG4gICAgdmFyIHByZXZTaG91bGRPYnNlcnZlID0gc2hvdWxkT2JzZXJ2ZTtcbiAgICB0b2dnbGVPYnNlcnZpbmcodHJ1ZSk7XG4gICAgb2JzZXJ2ZSh2YWx1ZSk7XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKHByZXZTaG91bGRPYnNlcnZlKTtcbiAgfVxuICBpZiAoXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgIC8vIHNraXAgdmFsaWRhdGlvbiBmb3Igd2VleCByZWN5Y2xlLWxpc3QgY2hpbGQgY29tcG9uZW50IHByb3BzXG4gICAgIShmYWxzZSAmJiBpc09iamVjdCh2YWx1ZSkgJiYgKCdAYmluZGluZycgaW4gdmFsdWUpKVxuICApIHtcbiAgICBhc3NlcnRQcm9wKHByb3AsIGtleSwgdmFsdWUsIHZtLCBhYnNlbnQpO1xuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHByb3AuXG4gKi9cbmZ1bmN0aW9uIGdldFByb3BEZWZhdWx0VmFsdWUgKHZtLCBwcm9wLCBrZXkpIHtcbiAgLy8gbm8gZGVmYXVsdCwgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAoIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG4gIHZhciBkZWYgPSBwcm9wLmRlZmF1bHQ7XG4gIC8vIHdhcm4gYWdhaW5zdCBub24tZmFjdG9yeSBkZWZhdWx0cyBmb3IgT2JqZWN0ICYgQXJyYXlcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaXNPYmplY3QoZGVmKSkge1xuICAgIHdhcm4oXG4gICAgICAnSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBwcm9wIFwiJyArIGtleSArICdcIjogJyArXG4gICAgICAnUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gJyArXG4gICAgICAndG8gcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLicsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbiAgLy8gdGhlIHJhdyBwcm9wIHZhbHVlIHdhcyBhbHNvIHVuZGVmaW5lZCBmcm9tIHByZXZpb3VzIHJlbmRlcixcbiAgLy8gcmV0dXJuIHByZXZpb3VzIGRlZmF1bHQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd2F0Y2hlciB0cmlnZ2VyXG4gIGlmICh2bSAmJiB2bS4kb3B0aW9ucy5wcm9wc0RhdGEgJiZcbiAgICB2bS4kb3B0aW9ucy5wcm9wc0RhdGFba2V5XSA9PT0gdW5kZWZpbmVkICYmXG4gICAgdm0uX3Byb3BzW2tleV0gIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICByZXR1cm4gdm0uX3Byb3BzW2tleV1cbiAgfVxuICAvLyBjYWxsIGZhY3RvcnkgZnVuY3Rpb24gZm9yIG5vbi1GdW5jdGlvbiB0eXBlc1xuICAvLyBhIHZhbHVlIGlzIEZ1bmN0aW9uIGlmIGl0cyBwcm90b3R5cGUgaXMgZnVuY3Rpb24gZXZlbiBhY3Jvc3MgZGlmZmVyZW50IGV4ZWN1dGlvbiBjb250ZXh0XG4gIHJldHVybiB0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nICYmIGdldFR5cGUocHJvcC50eXBlKSAhPT0gJ0Z1bmN0aW9uJ1xuICAgID8gZGVmLmNhbGwodm0pXG4gICAgOiBkZWZcbn1cblxuLyoqXG4gKiBBc3NlcnQgd2hldGhlciBhIHByb3AgaXMgdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFByb3AgKFxuICBwcm9wLFxuICBuYW1lLFxuICB2YWx1ZSxcbiAgdm0sXG4gIGFic2VudFxuKSB7XG4gIGlmIChwcm9wLnJlcXVpcmVkICYmIGFic2VudCkge1xuICAgIHdhcm4oXG4gICAgICAnTWlzc2luZyByZXF1aXJlZCBwcm9wOiBcIicgKyBuYW1lICsgJ1wiJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciB0eXBlID0gcHJvcC50eXBlO1xuICB2YXIgdmFsaWQgPSAhdHlwZSB8fCB0eXBlID09PSB0cnVlO1xuICB2YXIgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICBpZiAodHlwZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZSA9IFt0eXBlXTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlLmxlbmd0aCAmJiAhdmFsaWQ7IGkrKykge1xuICAgICAgdmFyIGFzc2VydGVkVHlwZSA9IGFzc2VydFR5cGUodmFsdWUsIHR5cGVbaV0pO1xuICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGFzc2VydGVkVHlwZS5leHBlY3RlZFR5cGUgfHwgJycpO1xuICAgICAgdmFsaWQgPSBhc3NlcnRlZFR5cGUudmFsaWQ7XG4gICAgfVxuICB9XG4gIGlmICghdmFsaWQpIHtcbiAgICB3YXJuKFxuICAgICAgXCJJbnZhbGlkIHByb3A6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBwcm9wIFxcXCJcIiArIG5hbWUgKyBcIlxcXCIuXCIgK1xuICAgICAgXCIgRXhwZWN0ZWQgXCIgKyAoZXhwZWN0ZWRUeXBlcy5tYXAoY2FwaXRhbGl6ZSkuam9pbignLCAnKSkgK1xuICAgICAgXCIsIGdvdCBcIiArICh0b1Jhd1R5cGUodmFsdWUpKSArIFwiLlwiLFxuICAgICAgdm1cbiAgICApO1xuICAgIHJldHVyblxuICB9XG4gIHZhciB2YWxpZGF0b3IgPSBwcm9wLnZhbGlkYXRvcjtcbiAgaWYgKHZhbGlkYXRvcikge1xuICAgIGlmICghdmFsaWRhdG9yKHZhbHVlKSkge1xuICAgICAgd2FybihcbiAgICAgICAgJ0ludmFsaWQgcHJvcDogY3VzdG9tIHZhbGlkYXRvciBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCInICsgbmFtZSArICdcIi4nLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHNpbXBsZUNoZWNrUkUgPSAvXihTdHJpbmd8TnVtYmVyfEJvb2xlYW58RnVuY3Rpb258U3ltYm9sKSQvO1xuXG5mdW5jdGlvbiBhc3NlcnRUeXBlICh2YWx1ZSwgdHlwZSkge1xuICB2YXIgdmFsaWQ7XG4gIHZhciBleHBlY3RlZFR5cGUgPSBnZXRUeXBlKHR5cGUpO1xuICBpZiAoc2ltcGxlQ2hlY2tSRS50ZXN0KGV4cGVjdGVkVHlwZSkpIHtcbiAgICB2YXIgdCA9IHR5cGVvZiB2YWx1ZTtcbiAgICB2YWxpZCA9IHQgPT09IGV4cGVjdGVkVHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIC8vIGZvciBwcmltaXRpdmUgd3JhcHBlciBvYmplY3RzXG4gICAgaWYgKCF2YWxpZCAmJiB0ID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICB2YWxpZCA9IGlzUGxhaW5PYmplY3QodmFsdWUpO1xuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ0FycmF5Jykge1xuICAgIHZhbGlkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2YWxpZDogdmFsaWQsXG4gICAgZXhwZWN0ZWRUeXBlOiBleHBlY3RlZFR5cGVcbiAgfVxufVxuXG4vKipcbiAqIFVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayBidWlsdC1pbiB0eXBlcyxcbiAqIGJlY2F1c2UgYSBzaW1wbGUgZXF1YWxpdHkgY2hlY2sgd2lsbCBmYWlsIHdoZW4gcnVubmluZ1xuICogYWNyb3NzIGRpZmZlcmVudCB2bXMgLyBpZnJhbWVzLlxuICovXG5mdW5jdGlvbiBnZXRUeXBlIChmbikge1xuICB2YXIgbWF0Y2ggPSBmbiAmJiBmbi50b1N0cmluZygpLm1hdGNoKC9eXFxzKmZ1bmN0aW9uIChcXHcrKS8pO1xuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6ICcnXG59XG5cbmZ1bmN0aW9uIGlzU2FtZVR5cGUgKGEsIGIpIHtcbiAgcmV0dXJuIGdldFR5cGUoYSkgPT09IGdldFR5cGUoYilcbn1cblxuZnVuY3Rpb24gZ2V0VHlwZUluZGV4ICh0eXBlLCBleHBlY3RlZFR5cGVzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFR5cGVzKSkge1xuICAgIHJldHVybiBpc1NhbWVUeXBlKGV4cGVjdGVkVHlwZXMsIHR5cGUpID8gMCA6IC0xXG4gIH1cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGV4cGVjdGVkVHlwZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzW2ldLCB0eXBlKSkge1xuICAgICAgcmV0dXJuIGlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBoYW5kbGVFcnJvciAoZXJyLCB2bSwgaW5mbykge1xuICBpZiAodm0pIHtcbiAgICB2YXIgY3VyID0gdm07XG4gICAgd2hpbGUgKChjdXIgPSBjdXIuJHBhcmVudCkpIHtcbiAgICAgIHZhciBob29rcyA9IGN1ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkO1xuICAgICAgaWYgKGhvb2tzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGNhcHR1cmUgPSBob29rc1tpXS5jYWxsKGN1ciwgZXJyLCB2bSwgaW5mbykgPT09IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGNhcHR1cmUpIHsgcmV0dXJuIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBnbG9iYWxIYW5kbGVFcnJvcihlLCBjdXIsICdlcnJvckNhcHR1cmVkIGhvb2snKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2xvYmFsSGFuZGxlRXJyb3IoZXJyLCB2bSwgaW5mbyk7XG59XG5cbmZ1bmN0aW9uIGdsb2JhbEhhbmRsZUVycm9yIChlcnIsIHZtLCBpbmZvKSB7XG4gIGlmIChjb25maWcuZXJyb3JIYW5kbGVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBjb25maWcuZXJyb3JIYW5kbGVyLmNhbGwobnVsbCwgZXJyLCB2bSwgaW5mbylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dFcnJvcihlLCBudWxsLCAnY29uZmlnLmVycm9ySGFuZGxlcicpO1xuICAgIH1cbiAgfVxuICBsb2dFcnJvcihlcnIsIHZtLCBpbmZvKTtcbn1cblxuZnVuY3Rpb24gbG9nRXJyb3IgKGVyciwgdm0sIGluZm8pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuKChcIkVycm9yIGluIFwiICsgaW5mbyArIFwiOiBcXFwiXCIgKyAoZXJyLnRvU3RyaW5nKCkpICsgXCJcXFwiXCIpLCB2bSk7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKChpbkJyb3dzZXIgfHwgaW5XZWV4KSAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLyogICovXG4vKiBnbG9iYWxzIE1lc3NhZ2VDaGFubmVsICovXG5cbnZhciBjYWxsYmFja3MgPSBbXTtcbnZhciBwZW5kaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZsdXNoQ2FsbGJhY2tzICgpIHtcbiAgcGVuZGluZyA9IGZhbHNlO1xuICB2YXIgY29waWVzID0gY2FsbGJhY2tzLnNsaWNlKDApO1xuICBjYWxsYmFja3MubGVuZ3RoID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3BpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb3BpZXNbaV0oKTtcbiAgfVxufVxuXG4vLyBIZXJlIHdlIGhhdmUgYXN5bmMgZGVmZXJyaW5nIHdyYXBwZXJzIHVzaW5nIGJvdGggbWljcm90YXNrcyBhbmQgKG1hY3JvKSB0YXNrcy5cbi8vIEluIDwgMi40IHdlIHVzZWQgbWljcm90YXNrcyBldmVyeXdoZXJlLCBidXQgdGhlcmUgYXJlIHNvbWUgc2NlbmFyaW9zIHdoZXJlXG4vLyBtaWNyb3Rhc2tzIGhhdmUgdG9vIGhpZ2ggYSBwcmlvcml0eSBhbmQgZmlyZSBpbiBiZXR3ZWVuIHN1cHBvc2VkbHlcbi8vIHNlcXVlbnRpYWwgZXZlbnRzIChlLmcuICM0NTIxLCAjNjY5MCkgb3IgZXZlbiBiZXR3ZWVuIGJ1YmJsaW5nIG9mIHRoZSBzYW1lXG4vLyBldmVudCAoIzY1NjYpLiBIb3dldmVyLCB1c2luZyAobWFjcm8pIHRhc2tzIGV2ZXJ5d2hlcmUgYWxzbyBoYXMgc3VidGxlIHByb2JsZW1zXG4vLyB3aGVuIHN0YXRlIGlzIGNoYW5nZWQgcmlnaHQgYmVmb3JlIHJlcGFpbnQgKGUuZy4gIzY4MTMsIG91dC1pbiB0cmFuc2l0aW9ucykuXG4vLyBIZXJlIHdlIHVzZSBtaWNyb3Rhc2sgYnkgZGVmYXVsdCwgYnV0IGV4cG9zZSBhIHdheSB0byBmb3JjZSAobWFjcm8pIHRhc2sgd2hlblxuLy8gbmVlZGVkIChlLmcuIGluIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIGJ5IHYtb24pLlxudmFyIG1pY3JvVGltZXJGdW5jO1xudmFyIG1hY3JvVGltZXJGdW5jO1xudmFyIHVzZU1hY3JvVGFzayA9IGZhbHNlO1xuXG4vLyBEZXRlcm1pbmUgKG1hY3JvKSB0YXNrIGRlZmVyIGltcGxlbWVudGF0aW9uLlxuLy8gVGVjaG5pY2FsbHkgc2V0SW1tZWRpYXRlIHNob3VsZCBiZSB0aGUgaWRlYWwgY2hvaWNlLCBidXQgaXQncyBvbmx5IGF2YWlsYWJsZVxuLy8gaW4gSUUuIFRoZSBvbmx5IHBvbHlmaWxsIHRoYXQgY29uc2lzdGVudGx5IHF1ZXVlcyB0aGUgY2FsbGJhY2sgYWZ0ZXIgYWxsIERPTVxuLy8gZXZlbnRzIHRyaWdnZXJlZCBpbiB0aGUgc2FtZSBsb29wIGlzIGJ5IHVzaW5nIE1lc3NhZ2VDaGFubmVsLlxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAodHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoc2V0SW1tZWRpYXRlKSkge1xuICBtYWNyb1RpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICBzZXRJbW1lZGlhdGUoZmx1c2hDYWxsYmFja3MpO1xuICB9O1xufSBlbHNlIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09ICd1bmRlZmluZWQnICYmIChcbiAgaXNOYXRpdmUoTWVzc2FnZUNoYW5uZWwpIHx8XG4gIC8vIFBoYW50b21KU1xuICBNZXNzYWdlQ2hhbm5lbC50b1N0cmluZygpID09PSAnW29iamVjdCBNZXNzYWdlQ2hhbm5lbENvbnN0cnVjdG9yXSdcbikpIHtcbiAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgdmFyIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZsdXNoQ2FsbGJhY2tzO1xuICBtYWNyb1RpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwb3J0LnBvc3RNZXNzYWdlKDEpO1xuICB9O1xufSBlbHNlIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dChmbHVzaENhbGxiYWNrcywgMCk7XG4gIH07XG59XG5cbi8vIERldGVybWluZSBtaWNyb3Rhc2sgZGVmZXIgaW1wbGVtZW50YXRpb24uXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCwgJGZsb3ctZGlzYWJsZS1saW5lICovXG5pZiAodHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFByb21pc2UpKSB7XG4gIHZhciBwID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIG1pY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgIHAudGhlbihmbHVzaENhbGxiYWNrcyk7XG4gICAgLy8gaW4gcHJvYmxlbWF0aWMgVUlXZWJWaWV3cywgUHJvbWlzZS50aGVuIGRvZXNuJ3QgY29tcGxldGVseSBicmVhaywgYnV0XG4gICAgLy8gaXQgY2FuIGdldCBzdHVjayBpbiBhIHdlaXJkIHN0YXRlIHdoZXJlIGNhbGxiYWNrcyBhcmUgcHVzaGVkIGludG8gdGhlXG4gICAgLy8gbWljcm90YXNrIHF1ZXVlIGJ1dCB0aGUgcXVldWUgaXNuJ3QgYmVpbmcgZmx1c2hlZCwgdW50aWwgdGhlIGJyb3dzZXJcbiAgICAvLyBuZWVkcyB0byBkbyBzb21lIG90aGVyIHdvcmssIGUuZy4gaGFuZGxlIGEgdGltZXIuIFRoZXJlZm9yZSB3ZSBjYW5cbiAgICAvLyBcImZvcmNlXCIgdGhlIG1pY3JvdGFzayBxdWV1ZSB0byBiZSBmbHVzaGVkIGJ5IGFkZGluZyBhbiBlbXB0eSB0aW1lci5cbiAgICBpZiAoaXNJT1MpIHsgc2V0VGltZW91dChub29wKTsgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gZmFsbGJhY2sgdG8gbWFjcm9cbiAgbWljcm9UaW1lckZ1bmMgPSBtYWNyb1RpbWVyRnVuYztcbn1cblxuLyoqXG4gKiBXcmFwIGEgZnVuY3Rpb24gc28gdGhhdCBpZiBhbnkgY29kZSBpbnNpZGUgdHJpZ2dlcnMgc3RhdGUgY2hhbmdlLFxuICogdGhlIGNoYW5nZXMgYXJlIHF1ZXVlZCB1c2luZyBhIChtYWNybykgdGFzayBpbnN0ZWFkIG9mIGEgbWljcm90YXNrLlxuICovXG5mdW5jdGlvbiB3aXRoTWFjcm9UYXNrIChmbikge1xuICByZXR1cm4gZm4uX3dpdGhUYXNrIHx8IChmbi5fd2l0aFRhc2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgdXNlTWFjcm9UYXNrID0gdHJ1ZTtcbiAgICB2YXIgcmVzID0gZm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICB1c2VNYWNyb1Rhc2sgPSBmYWxzZTtcbiAgICByZXR1cm4gcmVzXG4gIH0pXG59XG5cbmZ1bmN0aW9uIG5leHRUaWNrIChjYiwgY3R4KSB7XG4gIHZhciBfcmVzb2x2ZTtcbiAgY2FsbGJhY2tzLnB1c2goZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2IuY2FsbChjdHgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBoYW5kbGVFcnJvcihlLCBjdHgsICduZXh0VGljaycpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoX3Jlc29sdmUpIHtcbiAgICAgIF9yZXNvbHZlKGN0eCk7XG4gICAgfVxuICB9KTtcbiAgaWYgKCFwZW5kaW5nKSB7XG4gICAgcGVuZGluZyA9IHRydWU7XG4gICAgaWYgKHVzZU1hY3JvVGFzaykge1xuICAgICAgbWFjcm9UaW1lckZ1bmMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWljcm9UaW1lckZ1bmMoKTtcbiAgICB9XG4gIH1cbiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSlcbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIG1hcms7XG52YXIgbWVhc3VyZTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIHBlcmYgPSBpbkJyb3dzZXIgJiYgd2luZG93LnBlcmZvcm1hbmNlO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKFxuICAgIHBlcmYgJiZcbiAgICBwZXJmLm1hcmsgJiZcbiAgICBwZXJmLm1lYXN1cmUgJiZcbiAgICBwZXJmLmNsZWFyTWFya3MgJiZcbiAgICBwZXJmLmNsZWFyTWVhc3VyZXNcbiAgKSB7XG4gICAgbWFyayA9IGZ1bmN0aW9uICh0YWcpIHsgcmV0dXJuIHBlcmYubWFyayh0YWcpOyB9O1xuICAgIG1lYXN1cmUgPSBmdW5jdGlvbiAobmFtZSwgc3RhcnRUYWcsIGVuZFRhZykge1xuICAgICAgcGVyZi5tZWFzdXJlKG5hbWUsIHN0YXJ0VGFnLCBlbmRUYWcpO1xuICAgICAgcGVyZi5jbGVhck1hcmtzKHN0YXJ0VGFnKTtcbiAgICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpO1xuICAgICAgcGVyZi5jbGVhck1lYXN1cmVzKG5hbWUpO1xuICAgIH07XG4gIH1cbn1cblxuLyogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoIFByb3h5ICovXG5cbnZhciBpbml0UHJveHk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBhbGxvd2VkR2xvYmFscyA9IG1ha2VNYXAoXG4gICAgJ0luZmluaXR5LHVuZGVmaW5lZCxOYU4saXNGaW5pdGUsaXNOYU4sJyArXG4gICAgJ3BhcnNlRmxvYXQscGFyc2VJbnQsZGVjb2RlVVJJLGRlY29kZVVSSUNvbXBvbmVudCxlbmNvZGVVUkksZW5jb2RlVVJJQ29tcG9uZW50LCcgK1xuICAgICdNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsJyArXG4gICAgJ3JlcXVpcmUnIC8vIGZvciBXZWJwYWNrL0Jyb3dzZXJpZnlcbiAgKTtcblxuICB2YXIgd2Fybk5vblByZXNlbnQgPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICB3YXJuKFxuICAgICAgXCJQcm9wZXJ0eSBvciBtZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIG5vdCBkZWZpbmVkIG9uIHRoZSBpbnN0YW5jZSBidXQgXCIgK1xuICAgICAgJ3JlZmVyZW5jZWQgZHVyaW5nIHJlbmRlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyByZWFjdGl2ZSwgJyArXG4gICAgICAnZWl0aGVyIGluIHRoZSBkYXRhIG9wdGlvbiwgb3IgZm9yIGNsYXNzLWJhc2VkIGNvbXBvbmVudHMsIGJ5ICcgK1xuICAgICAgJ2luaXRpYWxpemluZyB0aGUgcHJvcGVydHkuICcgK1xuICAgICAgJ1NlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvcmVhY3Rpdml0eS5odG1sI0RlY2xhcmluZy1SZWFjdGl2ZS1Qcm9wZXJ0aWVzLicsXG4gICAgICB0YXJnZXRcbiAgICApO1xuICB9O1xuXG4gIHZhciBoYXNQcm94eSA9XG4gICAgdHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShQcm94eSk7XG5cbiAgaWYgKGhhc1Byb3h5KSB7XG4gICAgdmFyIGlzQnVpbHRJbk1vZGlmaWVyID0gbWFrZU1hcCgnc3RvcCxwcmV2ZW50LHNlbGYsY3RybCxzaGlmdCxhbHQsbWV0YSxleGFjdCcpO1xuICAgIGNvbmZpZy5rZXlDb2RlcyA9IG5ldyBQcm94eShjb25maWcua2V5Q29kZXMsIHtcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0ICh0YXJnZXQsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGlzQnVpbHRJbk1vZGlmaWVyKGtleSkpIHtcbiAgICAgICAgICB3YXJuKChcIkF2b2lkIG92ZXJ3cml0aW5nIGJ1aWx0LWluIG1vZGlmaWVyIGluIGNvbmZpZy5rZXlDb2RlczogLlwiICsga2V5KSk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB2YXIgaGFzSGFuZGxlciA9IHtcbiAgICBoYXM6IGZ1bmN0aW9uIGhhcyAodGFyZ2V0LCBrZXkpIHtcbiAgICAgIHZhciBoYXMgPSBrZXkgaW4gdGFyZ2V0O1xuICAgICAgdmFyIGlzQWxsb3dlZCA9IGFsbG93ZWRHbG9iYWxzKGtleSkgfHwga2V5LmNoYXJBdCgwKSA9PT0gJ18nO1xuICAgICAgaWYgKCFoYXMgJiYgIWlzQWxsb3dlZCkge1xuICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzIHx8ICFpc0FsbG93ZWRcbiAgICB9XG4gIH07XG5cbiAgdmFyIGdldEhhbmRsZXIgPSB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQgKHRhcmdldCwga2V5KSB7XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYgIShrZXkgaW4gdGFyZ2V0KSkge1xuICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICB9XG4gIH07XG5cbiAgaW5pdFByb3h5ID0gZnVuY3Rpb24gaW5pdFByb3h5ICh2bSkge1xuICAgIGlmIChoYXNQcm94eSkge1xuICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIHByb3h5IGhhbmRsZXIgdG8gdXNlXG4gICAgICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zO1xuICAgICAgdmFyIGhhbmRsZXJzID0gb3B0aW9ucy5yZW5kZXIgJiYgb3B0aW9ucy5yZW5kZXIuX3dpdGhTdHJpcHBlZFxuICAgICAgICA/IGdldEhhbmRsZXJcbiAgICAgICAgOiBoYXNIYW5kbGVyO1xuICAgICAgdm0uX3JlbmRlclByb3h5ID0gbmV3IFByb3h5KHZtLCBoYW5kbGVycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IHZtO1xuICAgIH1cbiAgfTtcbn1cblxuLyogICovXG5cbnZhciBzZWVuT2JqZWN0cyA9IG5ldyBfU2V0KCk7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgdHJhdmVyc2UgYW4gb2JqZWN0IHRvIGV2b2tlIGFsbCBjb252ZXJ0ZWRcbiAqIGdldHRlcnMsIHNvIHRoYXQgZXZlcnkgbmVzdGVkIHByb3BlcnR5IGluc2lkZSB0aGUgb2JqZWN0XG4gKiBpcyBjb2xsZWN0ZWQgYXMgYSBcImRlZXBcIiBkZXBlbmRlbmN5LlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZSAodmFsKSB7XG4gIF90cmF2ZXJzZSh2YWwsIHNlZW5PYmplY3RzKTtcbiAgc2Vlbk9iamVjdHMuY2xlYXIoKTtcbn1cblxuZnVuY3Rpb24gX3RyYXZlcnNlICh2YWwsIHNlZW4pIHtcbiAgdmFyIGksIGtleXM7XG4gIHZhciBpc0EgPSBBcnJheS5pc0FycmF5KHZhbCk7XG4gIGlmICgoIWlzQSAmJiAhaXNPYmplY3QodmFsKSkgfHwgT2JqZWN0LmlzRnJvemVuKHZhbCkgfHwgdmFsIGluc3RhbmNlb2YgVk5vZGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodmFsLl9fb2JfXykge1xuICAgIHZhciBkZXBJZCA9IHZhbC5fX29iX18uZGVwLmlkO1xuICAgIGlmIChzZWVuLmhhcyhkZXBJZCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBzZWVuLmFkZChkZXBJZCk7XG4gIH1cbiAgaWYgKGlzQSkge1xuICAgIGkgPSB2YWwubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtpXSwgc2Vlbik7IH1cbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gT2JqZWN0LmtleXModmFsKTtcbiAgICBpID0ga2V5cy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkgeyBfdHJhdmVyc2UodmFsW2tleXNbaV1dLCBzZWVuKTsgfVxuICB9XG59XG5cbi8qICAqL1xuXG52YXIgbm9ybWFsaXplRXZlbnQgPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyIHBhc3NpdmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyYnO1xuICBuYW1lID0gcGFzc2l2ZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lO1xuICB2YXIgb25jZSQkMSA9IG5hbWUuY2hhckF0KDApID09PSAnfic7IC8vIFByZWZpeGVkIGxhc3QsIGNoZWNrZWQgZmlyc3RcbiAgbmFtZSA9IG9uY2UkJDEgPyBuYW1lLnNsaWNlKDEpIDogbmFtZTtcbiAgdmFyIGNhcHR1cmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyEnO1xuICBuYW1lID0gY2FwdHVyZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgb25jZTogb25jZSQkMSxcbiAgICBjYXB0dXJlOiBjYXB0dXJlLFxuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZuSW52b2tlciAoZm5zKSB7XG4gIGZ1bmN0aW9uIGludm9rZXIgKCkge1xuICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50cztcblxuICAgIHZhciBmbnMgPSBpbnZva2VyLmZucztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnMpKSB7XG4gICAgICB2YXIgY2xvbmVkID0gZm5zLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsb25lZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjbG9uZWRbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzJDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZXR1cm4gaGFuZGxlciByZXR1cm4gdmFsdWUgZm9yIHNpbmdsZSBoYW5kbGVyc1xuICAgICAgcmV0dXJuIGZucy5hcHBseShudWxsLCBhcmd1bWVudHMpXG4gICAgfVxuICB9XG4gIGludm9rZXIuZm5zID0gZm5zO1xuICByZXR1cm4gaW52b2tlclxufVxuXG5mdW5jdGlvbiB1cGRhdGVMaXN0ZW5lcnMgKFxuICBvbixcbiAgb2xkT24sXG4gIGFkZCxcbiAgcmVtb3ZlJCQxLFxuICB2bVxuKSB7XG4gIHZhciBuYW1lLCBkZWYsIGN1ciwgb2xkLCBldmVudDtcbiAgZm9yIChuYW1lIGluIG9uKSB7XG4gICAgZGVmID0gY3VyID0gb25bbmFtZV07XG4gICAgb2xkID0gb2xkT25bbmFtZV07XG4gICAgZXZlbnQgPSBub3JtYWxpemVFdmVudChuYW1lKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXNVbmRlZihjdXIpKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAgIFwiSW52YWxpZCBoYW5kbGVyIGZvciBldmVudCBcXFwiXCIgKyAoZXZlbnQubmFtZSkgKyBcIlxcXCI6IGdvdCBcIiArIFN0cmluZyhjdXIpLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzVW5kZWYob2xkKSkge1xuICAgICAgaWYgKGlzVW5kZWYoY3VyLmZucykpIHtcbiAgICAgICAgY3VyID0gb25bbmFtZV0gPSBjcmVhdGVGbkludm9rZXIoY3VyKTtcbiAgICAgIH1cbiAgICAgIGFkZChldmVudC5uYW1lLCBjdXIsIGV2ZW50Lm9uY2UsIGV2ZW50LmNhcHR1cmUsIGV2ZW50LnBhc3NpdmUsIGV2ZW50LnBhcmFtcyk7XG4gICAgfSBlbHNlIGlmIChjdXIgIT09IG9sZCkge1xuICAgICAgb2xkLmZucyA9IGN1cjtcbiAgICAgIG9uW25hbWVdID0gb2xkO1xuICAgIH1cbiAgfVxuICBmb3IgKG5hbWUgaW4gb2xkT24pIHtcbiAgICBpZiAoaXNVbmRlZihvbltuYW1lXSkpIHtcbiAgICAgIGV2ZW50ID0gbm9ybWFsaXplRXZlbnQobmFtZSk7XG4gICAgICByZW1vdmUkJDEoZXZlbnQubmFtZSwgb2xkT25bbmFtZV0sIGV2ZW50LmNhcHR1cmUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gbWVyZ2VWTm9kZUhvb2sgKGRlZiwgaG9va0tleSwgaG9vaykge1xuICBpZiAoZGVmIGluc3RhbmNlb2YgVk5vZGUpIHtcbiAgICBkZWYgPSBkZWYuZGF0YS5ob29rIHx8IChkZWYuZGF0YS5ob29rID0ge30pO1xuICB9XG4gIHZhciBpbnZva2VyO1xuICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTtcblxuICBmdW5jdGlvbiB3cmFwcGVkSG9vayAoKSB7XG4gICAgaG9vay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIC8vIGltcG9ydGFudDogcmVtb3ZlIG1lcmdlZCBob29rIHRvIGVuc3VyZSBpdCdzIGNhbGxlZCBvbmx5IG9uY2VcbiAgICAvLyBhbmQgcHJldmVudCBtZW1vcnkgbGVha1xuICAgIHJlbW92ZShpbnZva2VyLmZucywgd3JhcHBlZEhvb2spO1xuICB9XG5cbiAgaWYgKGlzVW5kZWYob2xkSG9vaykpIHtcbiAgICAvLyBubyBleGlzdGluZyBob29rXG4gICAgaW52b2tlciA9IGNyZWF0ZUZuSW52b2tlcihbd3JhcHBlZEhvb2tdKTtcbiAgfSBlbHNlIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXNEZWYob2xkSG9vay5mbnMpICYmIGlzVHJ1ZShvbGRIb29rLm1lcmdlZCkpIHtcbiAgICAgIC8vIGFscmVhZHkgYSBtZXJnZWQgaW52b2tlclxuICAgICAgaW52b2tlciA9IG9sZEhvb2s7XG4gICAgICBpbnZva2VyLmZucy5wdXNoKHdyYXBwZWRIb29rKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXhpc3RpbmcgcGxhaW4gaG9va1xuICAgICAgaW52b2tlciA9IGNyZWF0ZUZuSW52b2tlcihbb2xkSG9vaywgd3JhcHBlZEhvb2tdKTtcbiAgICB9XG4gIH1cblxuICBpbnZva2VyLm1lcmdlZCA9IHRydWU7XG4gIGRlZltob29rS2V5XSA9IGludm9rZXI7XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhIChcbiAgZGF0YSxcbiAgQ3RvcixcbiAgdGFnXG4pIHtcbiAgLy8gd2UgYXJlIG9ubHkgZXh0cmFjdGluZyByYXcgdmFsdWVzIGhlcmUuXG4gIC8vIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIHRoZSBjaGlsZFxuICAvLyBjb21wb25lbnQgaXRzZWxmLlxuICB2YXIgcHJvcE9wdGlvbnMgPSBDdG9yLm9wdGlvbnMucHJvcHM7XG4gIGlmIChpc1VuZGVmKHByb3BPcHRpb25zKSkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGF0dHJzID0gZGF0YS5hdHRycztcbiAgdmFyIHByb3BzID0gZGF0YS5wcm9wcztcbiAgaWYgKGlzRGVmKGF0dHJzKSB8fCBpc0RlZihwcm9wcykpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcE9wdGlvbnMpIHtcbiAgICAgIHZhciBhbHRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZhciBrZXlJbkxvd2VyQ2FzZSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ICE9PSBrZXlJbkxvd2VyQ2FzZSAmJlxuICAgICAgICAgIGF0dHJzICYmIGhhc093bihhdHRycywga2V5SW5Mb3dlckNhc2UpXG4gICAgICAgICkge1xuICAgICAgICAgIHRpcChcbiAgICAgICAgICAgIFwiUHJvcCBcXFwiXCIgKyBrZXlJbkxvd2VyQ2FzZSArIFwiXFxcIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50IFwiICtcbiAgICAgICAgICAgIChmb3JtYXRDb21wb25lbnROYW1lKHRhZyB8fCBDdG9yKSkgKyBcIiwgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXNcIiArXG4gICAgICAgICAgICBcIiBcXFwiXCIgKyBrZXkgKyBcIlxcXCIuIFwiICtcbiAgICAgICAgICAgIFwiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCBcIiArXG4gICAgICAgICAgICBcInByb3BzIG5lZWQgdG8gdXNlIHRoZWlyIGtlYmFiLWNhc2UgZXF1aXZhbGVudHMgd2hlbiB1c2luZyBpbi1ET00gXCIgK1xuICAgICAgICAgICAgXCJ0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFxcXCJcIiArIGFsdEtleSArIFwiXFxcIiBpbnN0ZWFkIG9mIFxcXCJcIiArIGtleSArIFwiXFxcIi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNoZWNrUHJvcChyZXMsIHByb3BzLCBrZXksIGFsdEtleSwgdHJ1ZSkgfHxcbiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSwgZmFsc2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcCAoXG4gIHJlcyxcbiAgaGFzaCxcbiAga2V5LFxuICBhbHRLZXksXG4gIHByZXNlcnZlXG4pIHtcbiAgaWYgKGlzRGVmKGhhc2gpKSB7XG4gICAgaWYgKGhhc093bihoYXNoLCBrZXkpKSB7XG4gICAgICByZXNba2V5XSA9IGhhc2hba2V5XTtcbiAgICAgIGlmICghcHJlc2VydmUpIHtcbiAgICAgICAgZGVsZXRlIGhhc2hba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIGlmIChoYXNPd24oaGFzaCwgYWx0S2V5KSkge1xuICAgICAgcmVzW2tleV0gPSBoYXNoW2FsdEtleV07XG4gICAgICBpZiAoIXByZXNlcnZlKSB7XG4gICAgICAgIGRlbGV0ZSBoYXNoW2FsdEtleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyogICovXG5cbi8vIFRoZSB0ZW1wbGF0ZSBjb21waWxlciBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGUgbmVlZCBmb3Igbm9ybWFsaXphdGlvbiBieVxuLy8gc3RhdGljYWxseSBhbmFseXppbmcgdGhlIHRlbXBsYXRlIGF0IGNvbXBpbGUgdGltZS5cbi8vXG4vLyBGb3IgcGxhaW4gSFRNTCBtYXJrdXAsIG5vcm1hbGl6YXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgc2tpcHBlZCBiZWNhdXNlIHRoZVxuLy8gZ2VuZXJhdGVkIHJlbmRlciBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIHJldHVybiBBcnJheTxWTm9kZT4uIFRoZXJlIGFyZVxuLy8gdHdvIGNhc2VzIHdoZXJlIGV4dHJhIG5vcm1hbGl6YXRpb24gaXMgbmVlZGVkOlxuXG4vLyAxLiBXaGVuIHRoZSBjaGlsZHJlbiBjb250YWlucyBjb21wb25lbnRzIC0gYmVjYXVzZSBhIGZ1bmN0aW9uYWwgY29tcG9uZW50XG4vLyBtYXkgcmV0dXJuIGFuIEFycmF5IGluc3RlYWQgb2YgYSBzaW5nbGUgcm9vdC4gSW4gdGhpcyBjYXNlLCBqdXN0IGEgc2ltcGxlXG4vLyBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAtIGlmIGFueSBjaGlsZCBpcyBhbiBBcnJheSwgd2UgZmxhdHRlbiB0aGUgd2hvbGVcbi8vIHRoaW5nIHdpdGggQXJyYXkucHJvdG90eXBlLmNvbmNhdC4gSXQgaXMgZ3VhcmFudGVlZCB0byBiZSBvbmx5IDEtbGV2ZWwgZGVlcFxuLy8gYmVjYXVzZSBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYWxyZWFkeSBub3JtYWxpemUgdGhlaXIgb3duIGNoaWxkcmVuLlxuZnVuY3Rpb24gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbltpXSkpIHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjaGlsZHJlbilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuXG59XG5cbi8vIDIuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbnN0cnVjdHMgdGhhdCBhbHdheXMgZ2VuZXJhdGVkIG5lc3RlZCBBcnJheXMsXG4vLyBlLmcuIDx0ZW1wbGF0ZT4sIDxzbG90Piwgdi1mb3IsIG9yIHdoZW4gdGhlIGNoaWxkcmVuIGlzIHByb3ZpZGVkIGJ5IHVzZXJcbi8vIHdpdGggaGFuZC13cml0dGVuIHJlbmRlciBmdW5jdGlvbnMgLyBKU1guIEluIHN1Y2ggY2FzZXMgYSBmdWxsIG5vcm1hbGl6YXRpb25cbi8vIGlzIG5lZWRlZCB0byBjYXRlciB0byBhbGwgcG9zc2libGUgdHlwZXMgb2YgY2hpbGRyZW4gdmFsdWVzLlxuZnVuY3Rpb24gbm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7XG4gIHJldHVybiBpc1ByaW1pdGl2ZShjaGlsZHJlbilcbiAgICA/IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXVxuICAgIDogQXJyYXkuaXNBcnJheShjaGlsZHJlbilcbiAgICAgID8gbm9ybWFsaXplQXJyYXlDaGlsZHJlbihjaGlsZHJlbilcbiAgICAgIDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzVGV4dE5vZGUgKG5vZGUpIHtcbiAgcmV0dXJuIGlzRGVmKG5vZGUpICYmIGlzRGVmKG5vZGUudGV4dCkgJiYgaXNGYWxzZShub2RlLmlzQ29tbWVudClcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXlDaGlsZHJlbiAoY2hpbGRyZW4sIG5lc3RlZEluZGV4KSB7XG4gIHZhciByZXMgPSBbXTtcbiAgdmFyIGksIGMsIGxhc3RJbmRleCwgbGFzdDtcbiAgZm9yIChpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgYyA9IGNoaWxkcmVuW2ldO1xuICAgIGlmIChpc1VuZGVmKGMpIHx8IHR5cGVvZiBjID09PSAnYm9vbGVhbicpIHsgY29udGludWUgfVxuICAgIGxhc3RJbmRleCA9IHJlcy5sZW5ndGggLSAxO1xuICAgIGxhc3QgPSByZXNbbGFzdEluZGV4XTtcbiAgICAvLyAgbmVzdGVkXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHtcbiAgICAgIGlmIChjLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYyA9IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oYywgKChuZXN0ZWRJbmRleCB8fCAnJykgKyBcIl9cIiArIGkpKTtcbiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2Rlc1xuICAgICAgICBpZiAoaXNUZXh0Tm9kZShjWzBdKSAmJiBpc1RleHROb2RlKGxhc3QpKSB7XG4gICAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgKGNbMF0pLnRleHQpO1xuICAgICAgICAgIGMuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXMucHVzaC5hcHBseShyZXMsIGMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNQcmltaXRpdmUoYykpIHtcbiAgICAgIGlmIChpc1RleHROb2RlKGxhc3QpKSB7XG4gICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXNcbiAgICAgICAgLy8gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIFNTUiBoeWRyYXRpb24gYmVjYXVzZSB0ZXh0IG5vZGVzIGFyZVxuICAgICAgICAvLyBlc3NlbnRpYWxseSBtZXJnZWQgd2hlbiByZW5kZXJlZCB0byBIVE1MIHN0cmluZ3NcbiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYyk7XG4gICAgICB9IGVsc2UgaWYgKGMgIT09ICcnKSB7XG4gICAgICAgIC8vIGNvbnZlcnQgcHJpbWl0aXZlIHRvIHZub2RlXG4gICAgICAgIHJlcy5wdXNoKGNyZWF0ZVRleHRWTm9kZShjKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc1RleHROb2RlKGMpICYmIGlzVGV4dE5vZGUobGFzdCkpIHtcbiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2Rlc1xuICAgICAgICByZXNbbGFzdEluZGV4XSA9IGNyZWF0ZVRleHRWTm9kZShsYXN0LnRleHQgKyBjLnRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZGVmYXVsdCBrZXkgZm9yIG5lc3RlZCBhcnJheSBjaGlsZHJlbiAobGlrZWx5IGdlbmVyYXRlZCBieSB2LWZvcilcbiAgICAgICAgaWYgKGlzVHJ1ZShjaGlsZHJlbi5faXNWTGlzdCkgJiZcbiAgICAgICAgICBpc0RlZihjLnRhZykgJiZcbiAgICAgICAgICBpc1VuZGVmKGMua2V5KSAmJlxuICAgICAgICAgIGlzRGVmKG5lc3RlZEluZGV4KSkge1xuICAgICAgICAgIGMua2V5ID0gXCJfX3ZsaXN0XCIgKyBuZXN0ZWRJbmRleCArIFwiX1wiICsgaSArIFwiX19cIjtcbiAgICAgICAgfVxuICAgICAgICByZXMucHVzaChjKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gZW5zdXJlQ3RvciAoY29tcCwgYmFzZSkge1xuICBpZiAoXG4gICAgY29tcC5fX2VzTW9kdWxlIHx8XG4gICAgKGhhc1N5bWJvbCAmJiBjb21wW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdNb2R1bGUnKVxuICApIHtcbiAgICBjb21wID0gY29tcC5kZWZhdWx0O1xuICB9XG4gIHJldHVybiBpc09iamVjdChjb21wKVxuICAgID8gYmFzZS5leHRlbmQoY29tcClcbiAgICA6IGNvbXBcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXN5bmNQbGFjZWhvbGRlciAoXG4gIGZhY3RvcnksXG4gIGRhdGEsXG4gIGNvbnRleHQsXG4gIGNoaWxkcmVuLFxuICB0YWdcbikge1xuICB2YXIgbm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTtcbiAgbm9kZS5hc3luY0ZhY3RvcnkgPSBmYWN0b3J5O1xuICBub2RlLmFzeW5jTWV0YSA9IHsgZGF0YTogZGF0YSwgY29udGV4dDogY29udGV4dCwgY2hpbGRyZW46IGNoaWxkcmVuLCB0YWc6IHRhZyB9O1xuICByZXR1cm4gbm9kZVxufVxuXG5mdW5jdGlvbiByZXNvbHZlQXN5bmNDb21wb25lbnQgKFxuICBmYWN0b3J5LFxuICBiYXNlQ3RvcixcbiAgY29udGV4dFxuKSB7XG4gIGlmIChpc1RydWUoZmFjdG9yeS5lcnJvcikgJiYgaXNEZWYoZmFjdG9yeS5lcnJvckNvbXApKSB7XG4gICAgcmV0dXJuIGZhY3RvcnkuZXJyb3JDb21wXG4gIH1cblxuICBpZiAoaXNEZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5yZXNvbHZlZFxuICB9XG5cbiAgaWYgKGlzVHJ1ZShmYWN0b3J5LmxvYWRpbmcpICYmIGlzRGVmKGZhY3RvcnkubG9hZGluZ0NvbXApKSB7XG4gICAgcmV0dXJuIGZhY3RvcnkubG9hZGluZ0NvbXBcbiAgfVxuXG4gIGlmIChpc0RlZihmYWN0b3J5LmNvbnRleHRzKSkge1xuICAgIC8vIGFscmVhZHkgcGVuZGluZ1xuICAgIGZhY3RvcnkuY29udGV4dHMucHVzaChjb250ZXh0KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY29udGV4dHMgPSBmYWN0b3J5LmNvbnRleHRzID0gW2NvbnRleHRdO1xuICAgIHZhciBzeW5jID0gdHJ1ZTtcblxuICAgIHZhciBmb3JjZVJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY29udGV4dHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnRleHRzW2ldLiRmb3JjZVVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgcmVzb2x2ZSA9IG9uY2UoZnVuY3Rpb24gKHJlcykge1xuICAgICAgLy8gY2FjaGUgcmVzb2x2ZWRcbiAgICAgIGZhY3RvcnkucmVzb2x2ZWQgPSBlbnN1cmVDdG9yKHJlcywgYmFzZUN0b3IpO1xuICAgICAgLy8gaW52b2tlIGNhbGxiYWNrcyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgc3luY2hyb25vdXMgcmVzb2x2ZVxuICAgICAgLy8gKGFzeW5jIHJlc29sdmVzIGFyZSBzaGltbWVkIGFzIHN5bmNocm9ub3VzIGR1cmluZyBTU1IpXG4gICAgICBpZiAoIXN5bmMpIHtcbiAgICAgICAgZm9yY2VSZW5kZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciByZWplY3QgPSBvbmNlKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgXCJGYWlsZWQgdG8gcmVzb2x2ZSBhc3luYyBjb21wb25lbnQ6IFwiICsgKFN0cmluZyhmYWN0b3J5KSkgK1xuICAgICAgICAocmVhc29uID8gKFwiXFxuUmVhc29uOiBcIiArIHJlYXNvbikgOiAnJylcbiAgICAgICk7XG4gICAgICBpZiAoaXNEZWYoZmFjdG9yeS5lcnJvckNvbXApKSB7XG4gICAgICAgIGZhY3RvcnkuZXJyb3IgPSB0cnVlO1xuICAgICAgICBmb3JjZVJlbmRlcigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTtcblxuICAgIGlmIChpc09iamVjdChyZXMpKSB7XG4gICAgICBpZiAodHlwZW9mIHJlcy50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vICgpID0+IFByb21pc2VcbiAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHtcbiAgICAgICAgICByZXMudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzRGVmKHJlcy5jb21wb25lbnQpICYmIHR5cGVvZiByZXMuY29tcG9uZW50LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzLmNvbXBvbmVudC50aGVuKHJlc29sdmUsIHJlamVjdCk7XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy5lcnJvcikpIHtcbiAgICAgICAgICBmYWN0b3J5LmVycm9yQ29tcCA9IGVuc3VyZUN0b3IocmVzLmVycm9yLCBiYXNlQ3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNEZWYocmVzLmxvYWRpbmcpKSB7XG4gICAgICAgICAgZmFjdG9yeS5sb2FkaW5nQ29tcCA9IGVuc3VyZUN0b3IocmVzLmxvYWRpbmcsIGJhc2VDdG9yKTtcbiAgICAgICAgICBpZiAocmVzLmRlbGF5ID09PSAwKSB7XG4gICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkgJiYgaXNVbmRlZihmYWN0b3J5LmVycm9yKSkge1xuICAgICAgICAgICAgICAgIGZhY3RvcnkubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9yY2VSZW5kZXIoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVzLmRlbGF5IHx8IDIwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy50aW1lb3V0KSkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbidcbiAgICAgICAgICAgICAgICAgID8gKFwidGltZW91dCAoXCIgKyAocmVzLnRpbWVvdXQpICsgXCJtcylcIilcbiAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHJlcy50aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHN5bmMgPSBmYWxzZTtcbiAgICAvLyByZXR1cm4gaW4gY2FzZSByZXNvbHZlZCBzeW5jaHJvbm91c2x5XG4gICAgcmV0dXJuIGZhY3RvcnkubG9hZGluZ1xuICAgICAgPyBmYWN0b3J5LmxvYWRpbmdDb21wXG4gICAgICA6IGZhY3RvcnkucmVzb2x2ZWRcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaXNBc3luY1BsYWNlaG9sZGVyIChub2RlKSB7XG4gIHJldHVybiBub2RlLmlzQ29tbWVudCAmJiBub2RlLmFzeW5jRmFjdG9yeVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gZ2V0Rmlyc3RDb21wb25lbnRDaGlsZCAoY2hpbGRyZW4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSBjaGlsZHJlbltpXTtcbiAgICAgIGlmIChpc0RlZihjKSAmJiAoaXNEZWYoYy5jb21wb25lbnRPcHRpb25zKSB8fCBpc0FzeW5jUGxhY2Vob2xkZXIoYykpKSB7XG4gICAgICAgIHJldHVybiBjXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qICAqL1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdEV2ZW50cyAodm0pIHtcbiAgdm0uX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZtLl9oYXNIb29rRXZlbnQgPSBmYWxzZTtcbiAgLy8gaW5pdCBwYXJlbnQgYXR0YWNoZWQgZXZlbnRzXG4gIHZhciBsaXN0ZW5lcnMgPSB2bS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO1xuICBpZiAobGlzdGVuZXJzKSB7XG4gICAgdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzKHZtLCBsaXN0ZW5lcnMpO1xuICB9XG59XG5cbnZhciB0YXJnZXQ7XG5cbmZ1bmN0aW9uIGFkZCAoZXZlbnQsIGZuLCBvbmNlKSB7XG4gIGlmIChvbmNlKSB7XG4gICAgdGFyZ2V0LiRvbmNlKGV2ZW50LCBmbik7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0LiRvbihldmVudCwgZm4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHtcbiAgdGFyZ2V0LiRvZmYoZXZlbnQsIGZuKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzIChcbiAgdm0sXG4gIGxpc3RlbmVycyxcbiAgb2xkTGlzdGVuZXJzXG4pIHtcbiAgdGFyZ2V0ID0gdm07XG4gIHVwZGF0ZUxpc3RlbmVycyhsaXN0ZW5lcnMsIG9sZExpc3RlbmVycyB8fCB7fSwgYWRkLCByZW1vdmUkMSwgdm0pO1xuICB0YXJnZXQgPSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV2ZW50c01peGluIChWdWUpIHtcbiAgdmFyIGhvb2tSRSA9IC9eaG9vazovO1xuICBWdWUucHJvdG90eXBlLiRvbiA9IGZ1bmN0aW9uIChldmVudCwgZm4pIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGV2ZW50Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB0aGlzJDEuJG9uKGV2ZW50W2ldLCBmbik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICh2bS5fZXZlbnRzW2V2ZW50XSB8fCAodm0uX2V2ZW50c1tldmVudF0gPSBbXSkpLnB1c2goZm4pO1xuICAgICAgLy8gb3B0aW1pemUgaG9vazpldmVudCBjb3N0IGJ5IHVzaW5nIGEgYm9vbGVhbiBmbGFnIG1hcmtlZCBhdCByZWdpc3RyYXRpb25cbiAgICAgIC8vIGluc3RlYWQgb2YgYSBoYXNoIGxvb2t1cFxuICAgICAgaWYgKGhvb2tSRS50ZXN0KGV2ZW50KSkge1xuICAgICAgICB2bS5faGFzSG9va0V2ZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZtXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kb25jZSA9IGZ1bmN0aW9uIChldmVudCwgZm4pIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIGZ1bmN0aW9uIG9uICgpIHtcbiAgICAgIHZtLiRvZmYoZXZlbnQsIG9uKTtcbiAgICAgIGZuLmFwcGx5KHZtLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgICBvbi5mbiA9IGZuO1xuICAgIHZtLiRvbihldmVudCwgb24pO1xuICAgIHJldHVybiB2bVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG9mZiA9IGZ1bmN0aW9uIChldmVudCwgZm4pIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgLy8gYWxsXG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB2bS5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIHJldHVybiB2bVxuICAgIH1cbiAgICAvLyBhcnJheSBvZiBldmVudHNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHRoaXMkMS4kb2ZmKGV2ZW50W2ldLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gc3BlY2lmaWMgZXZlbnRcbiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07XG4gICAgaWYgKCFjYnMpIHtcbiAgICAgIHJldHVybiB2bVxuICAgIH1cbiAgICBpZiAoIWZuKSB7XG4gICAgICB2bS5fZXZlbnRzW2V2ZW50XSA9IG51bGw7XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgaWYgKGZuKSB7XG4gICAgICAvLyBzcGVjaWZpYyBoYW5kbGVyXG4gICAgICB2YXIgY2I7XG4gICAgICB2YXIgaSQxID0gY2JzLmxlbmd0aDtcbiAgICAgIHdoaWxlIChpJDEtLSkge1xuICAgICAgICBjYiA9IGNic1tpJDFdO1xuICAgICAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikge1xuICAgICAgICAgIGNicy5zcGxpY2UoaSQxLCAxKTtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2bVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJGVtaXQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgbG93ZXJDYXNlRXZlbnQgPSBldmVudC50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGxvd2VyQ2FzZUV2ZW50ICE9PSBldmVudCAmJiB2bS5fZXZlbnRzW2xvd2VyQ2FzZUV2ZW50XSkge1xuICAgICAgICB0aXAoXG4gICAgICAgICAgXCJFdmVudCBcXFwiXCIgKyBsb3dlckNhc2VFdmVudCArIFwiXFxcIiBpcyBlbWl0dGVkIGluIGNvbXBvbmVudCBcIiArXG4gICAgICAgICAgKGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSArIFwiIGJ1dCB0aGUgaGFuZGxlciBpcyByZWdpc3RlcmVkIGZvciBcXFwiXCIgKyBldmVudCArIFwiXFxcIi4gXCIgK1xuICAgICAgICAgIFwiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgeW91IGNhbm5vdCB1c2UgXCIgK1xuICAgICAgICAgIFwidi1vbiB0byBsaXN0ZW4gdG8gY2FtZWxDYXNlIGV2ZW50cyB3aGVuIHVzaW5nIGluLURPTSB0ZW1wbGF0ZXMuIFwiICtcbiAgICAgICAgICBcIllvdSBzaG91bGQgcHJvYmFibHkgdXNlIFxcXCJcIiArIChoeXBoZW5hdGUoZXZlbnQpKSArIFwiXFxcIiBpbnN0ZWFkIG9mIFxcXCJcIiArIGV2ZW50ICsgXCJcXFwiLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBjYnMgPSB2bS5fZXZlbnRzW2V2ZW50XTtcbiAgICBpZiAoY2JzKSB7XG4gICAgICBjYnMgPSBjYnMubGVuZ3RoID4gMSA/IHRvQXJyYXkoY2JzKSA6IGNicztcbiAgICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjYnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2JzW2ldLmFwcGx5KHZtLCBhcmdzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCAoXCJldmVudCBoYW5kbGVyIGZvciBcXFwiXCIgKyBldmVudCArIFwiXFxcIlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZtXG4gIH07XG59XG5cbi8qICAqL1xuXG5cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVzb2x2aW5nIHJhdyBjaGlsZHJlbiBWTm9kZXMgaW50byBhIHNsb3Qgb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZXNvbHZlU2xvdHMgKFxuICBjaGlsZHJlbixcbiAgY29udGV4dFxuKSB7XG4gIHZhciBzbG90cyA9IHt9O1xuICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIHNsb3RzXG4gIH1cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICB2YXIgZGF0YSA9IGNoaWxkLmRhdGE7XG4gICAgLy8gcmVtb3ZlIHNsb3QgYXR0cmlidXRlIGlmIHRoZSBub2RlIGlzIHJlc29sdmVkIGFzIGEgVnVlIHNsb3Qgbm9kZVxuICAgIGlmIChkYXRhICYmIGRhdGEuYXR0cnMgJiYgZGF0YS5hdHRycy5zbG90KSB7XG4gICAgICBkZWxldGUgZGF0YS5hdHRycy5zbG90O1xuICAgIH1cbiAgICAvLyBuYW1lZCBzbG90cyBzaG91bGQgb25seSBiZSByZXNwZWN0ZWQgaWYgdGhlIHZub2RlIHdhcyByZW5kZXJlZCBpbiB0aGVcbiAgICAvLyBzYW1lIGNvbnRleHQuXG4gICAgaWYgKChjaGlsZC5jb250ZXh0ID09PSBjb250ZXh0IHx8IGNoaWxkLmZuQ29udGV4dCA9PT0gY29udGV4dCkgJiZcbiAgICAgIGRhdGEgJiYgZGF0YS5zbG90ICE9IG51bGxcbiAgICApIHtcbiAgICAgIHZhciBuYW1lID0gZGF0YS5zbG90O1xuICAgICAgdmFyIHNsb3QgPSAoc2xvdHNbbmFtZV0gfHwgKHNsb3RzW25hbWVdID0gW10pKTtcbiAgICAgIGlmIChjaGlsZC50YWcgPT09ICd0ZW1wbGF0ZScpIHtcbiAgICAgICAgc2xvdC5wdXNoLmFwcGx5KHNsb3QsIGNoaWxkLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNsb3QucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIChzbG90cy5kZWZhdWx0IHx8IChzbG90cy5kZWZhdWx0ID0gW10pKS5wdXNoKGNoaWxkKTtcbiAgICB9XG4gIH1cbiAgLy8gaWdub3JlIHNsb3RzIHRoYXQgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlXG4gIGZvciAodmFyIG5hbWUkMSBpbiBzbG90cykge1xuICAgIGlmIChzbG90c1tuYW1lJDFdLmV2ZXJ5KGlzV2hpdGVzcGFjZSkpIHtcbiAgICAgIGRlbGV0ZSBzbG90c1tuYW1lJDFdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2xvdHNcbn1cblxuZnVuY3Rpb24gaXNXaGl0ZXNwYWNlIChub2RlKSB7XG4gIHJldHVybiAobm9kZS5pc0NvbW1lbnQgJiYgIW5vZGUuYXN5bmNGYWN0b3J5KSB8fCBub2RlLnRleHQgPT09ICcgJ1xufVxuXG5mdW5jdGlvbiByZXNvbHZlU2NvcGVkU2xvdHMgKFxuICBmbnMsIC8vIHNlZSBmbG93L3Zub2RlXG4gIHJlc1xuKSB7XG4gIHJlcyA9IHJlcyB8fCB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBmbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnNbaV0pKSB7XG4gICAgICByZXNvbHZlU2NvcGVkU2xvdHMoZm5zW2ldLCByZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNbZm5zW2ldLmtleV0gPSBmbnNbaV0uZm47XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cbnZhciBhY3RpdmVJbnN0YW5jZSA9IG51bGw7XG52YXIgaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGluaXRMaWZlY3ljbGUgKHZtKSB7XG4gIHZhciBvcHRpb25zID0gdm0uJG9wdGlvbnM7XG5cbiAgLy8gbG9jYXRlIGZpcnN0IG5vbi1hYnN0cmFjdCBwYXJlbnRcbiAgdmFyIHBhcmVudCA9IG9wdGlvbnMucGFyZW50O1xuICBpZiAocGFyZW50ICYmICFvcHRpb25zLmFic3RyYWN0KSB7XG4gICAgd2hpbGUgKHBhcmVudC4kb3B0aW9ucy5hYnN0cmFjdCAmJiBwYXJlbnQuJHBhcmVudCkge1xuICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudC4kY2hpbGRyZW4ucHVzaCh2bSk7XG4gIH1cblxuICB2bS4kcGFyZW50ID0gcGFyZW50O1xuICB2bS4kcm9vdCA9IHBhcmVudCA/IHBhcmVudC4kcm9vdCA6IHZtO1xuXG4gIHZtLiRjaGlsZHJlbiA9IFtdO1xuICB2bS4kcmVmcyA9IHt9O1xuXG4gIHZtLl93YXRjaGVyID0gbnVsbDtcbiAgdm0uX2luYWN0aXZlID0gbnVsbDtcbiAgdm0uX2RpcmVjdEluYWN0aXZlID0gZmFsc2U7XG4gIHZtLl9pc01vdW50ZWQgPSBmYWxzZTtcbiAgdm0uX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxpZmVjeWNsZU1peGluIChWdWUpIHtcbiAgVnVlLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKHZub2RlLCBoeWRyYXRpbmcpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIGlmICh2bS5faXNNb3VudGVkKSB7XG4gICAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZVVwZGF0ZScpO1xuICAgIH1cbiAgICB2YXIgcHJldkVsID0gdm0uJGVsO1xuICAgIHZhciBwcmV2Vm5vZGUgPSB2bS5fdm5vZGU7XG4gICAgdmFyIHByZXZBY3RpdmVJbnN0YW5jZSA9IGFjdGl2ZUluc3RhbmNlO1xuICAgIGFjdGl2ZUluc3RhbmNlID0gdm07XG4gICAgdm0uX3Zub2RlID0gdm5vZGU7XG4gICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzXG4gICAgLy8gYmFzZWQgb24gdGhlIHJlbmRlcmluZyBiYWNrZW5kIHVzZWQuXG4gICAgaWYgKCFwcmV2Vm5vZGUpIHtcbiAgICAgIC8vIGluaXRpYWwgcmVuZGVyXG4gICAgICB2bS4kZWwgPSB2bS5fX3BhdGNoX18oXG4gICAgICAgIHZtLiRlbCwgdm5vZGUsIGh5ZHJhdGluZywgZmFsc2UgLyogcmVtb3ZlT25seSAqLyxcbiAgICAgICAgdm0uJG9wdGlvbnMuX3BhcmVudEVsbSxcbiAgICAgICAgdm0uJG9wdGlvbnMuX3JlZkVsbVxuICAgICAgKTtcbiAgICAgIC8vIG5vIG5lZWQgZm9yIHRoZSByZWYgbm9kZXMgYWZ0ZXIgaW5pdGlhbCBwYXRjaFxuICAgICAgLy8gdGhpcyBwcmV2ZW50cyBrZWVwaW5nIGEgZGV0YWNoZWQgRE9NIHRyZWUgaW4gbWVtb3J5ICgjNTg1MSlcbiAgICAgIHZtLiRvcHRpb25zLl9wYXJlbnRFbG0gPSB2bS4kb3B0aW9ucy5fcmVmRWxtID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXBkYXRlc1xuICAgICAgdm0uJGVsID0gdm0uX19wYXRjaF9fKHByZXZWbm9kZSwgdm5vZGUpO1xuICAgIH1cbiAgICBhY3RpdmVJbnN0YW5jZSA9IHByZXZBY3RpdmVJbnN0YW5jZTtcbiAgICAvLyB1cGRhdGUgX192dWVfXyByZWZlcmVuY2VcbiAgICBpZiAocHJldkVsKSB7XG4gICAgICBwcmV2RWwuX192dWVfXyA9IG51bGw7XG4gICAgfVxuICAgIGlmICh2bS4kZWwpIHtcbiAgICAgIHZtLiRlbC5fX3Z1ZV9fID0gdm07XG4gICAgfVxuICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGxcbiAgICBpZiAodm0uJHZub2RlICYmIHZtLiRwYXJlbnQgJiYgdm0uJHZub2RlID09PSB2bS4kcGFyZW50Ll92bm9kZSkge1xuICAgICAgdm0uJHBhcmVudC4kZWwgPSB2bS4kZWw7XG4gICAgfVxuICAgIC8vIHVwZGF0ZWQgaG9vayBpcyBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlciB0byBlbnN1cmUgdGhhdCBjaGlsZHJlbiBhcmVcbiAgICAvLyB1cGRhdGVkIGluIGEgcGFyZW50J3MgdXBkYXRlZCBob29rLlxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJGZvcmNlVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHZtLl93YXRjaGVyKSB7XG4gICAgICB2bS5fd2F0Y2hlci51cGRhdGUoKTtcbiAgICB9XG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIGlmICh2bS5faXNCZWluZ0Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlRGVzdHJveScpO1xuICAgIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyByZW1vdmUgc2VsZiBmcm9tIHBhcmVudFxuICAgIHZhciBwYXJlbnQgPSB2bS4kcGFyZW50O1xuICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5faXNCZWluZ0Rlc3Ryb3llZCAmJiAhdm0uJG9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICAgIHJlbW92ZShwYXJlbnQuJGNoaWxkcmVuLCB2bSk7XG4gICAgfVxuICAgIC8vIHRlYXJkb3duIHdhdGNoZXJzXG4gICAgaWYgKHZtLl93YXRjaGVyKSB7XG4gICAgICB2bS5fd2F0Y2hlci50ZWFyZG93bigpO1xuICAgIH1cbiAgICB2YXIgaSA9IHZtLl93YXRjaGVycy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdm0uX3dhdGNoZXJzW2ldLnRlYXJkb3duKCk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSByZWZlcmVuY2UgZnJvbSBkYXRhIG9iXG4gICAgLy8gZnJvemVuIG9iamVjdCBtYXkgbm90IGhhdmUgb2JzZXJ2ZXIuXG4gICAgaWYgKHZtLl9kYXRhLl9fb2JfXykge1xuICAgICAgdm0uX2RhdGEuX19vYl9fLnZtQ291bnQtLTtcbiAgICB9XG4gICAgLy8gY2FsbCB0aGUgbGFzdCBob29rLi4uXG4gICAgdm0uX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyBpbnZva2UgZGVzdHJveSBob29rcyBvbiBjdXJyZW50IHJlbmRlcmVkIHRyZWVcbiAgICB2bS5fX3BhdGNoX18odm0uX3Zub2RlLCBudWxsKTtcbiAgICAvLyBmaXJlIGRlc3Ryb3llZCBob29rXG4gICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTtcbiAgICAvLyB0dXJuIG9mZiBhbGwgaW5zdGFuY2UgbGlzdGVuZXJzLlxuICAgIHZtLiRvZmYoKTtcbiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2VcbiAgICBpZiAodm0uJGVsKSB7XG4gICAgICB2bS4kZWwuX192dWVfXyA9IG51bGw7XG4gICAgfVxuICAgIC8vIHJlbGVhc2UgY2lyY3VsYXIgcmVmZXJlbmNlICgjNjc1OSlcbiAgICBpZiAodm0uJHZub2RlKSB7XG4gICAgICB2bS4kdm5vZGUucGFyZW50ID0gbnVsbDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIG1vdW50Q29tcG9uZW50IChcbiAgdm0sXG4gIGVsLFxuICBoeWRyYXRpbmdcbikge1xuICB2bS4kZWwgPSBlbDtcbiAgaWYgKCF2bS4kb3B0aW9ucy5yZW5kZXIpIHtcbiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVZOb2RlO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICgodm0uJG9wdGlvbnMudGVtcGxhdGUgJiYgdm0uJG9wdGlvbnMudGVtcGxhdGUuY2hhckF0KDApICE9PSAnIycpIHx8XG4gICAgICAgIHZtLiRvcHRpb25zLmVsIHx8IGVsKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ1lvdSBhcmUgdXNpbmcgdGhlIHJ1bnRpbWUtb25seSBidWlsZCBvZiBWdWUgd2hlcmUgdGhlIHRlbXBsYXRlICcgK1xuICAgICAgICAgICdjb21waWxlciBpcyBub3QgYXZhaWxhYmxlLiBFaXRoZXIgcHJlLWNvbXBpbGUgdGhlIHRlbXBsYXRlcyBpbnRvICcgK1xuICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ0ZhaWxlZCB0byBtb3VudCBjb21wb25lbnQ6IHRlbXBsYXRlIG9yIHJlbmRlciBmdW5jdGlvbiBub3QgZGVmaW5lZC4nLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNhbGxIb29rKHZtLCAnYmVmb3JlTW91bnQnKTtcblxuICB2YXIgdXBkYXRlQ29tcG9uZW50O1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICB1cGRhdGVDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbmFtZSA9IHZtLl9uYW1lO1xuICAgICAgdmFyIGlkID0gdm0uX3VpZDtcbiAgICAgIHZhciBzdGFydFRhZyA9IFwidnVlLXBlcmYtc3RhcnQ6XCIgKyBpZDtcbiAgICAgIHZhciBlbmRUYWcgPSBcInZ1ZS1wZXJmLWVuZDpcIiArIGlkO1xuXG4gICAgICBtYXJrKHN0YXJ0VGFnKTtcbiAgICAgIHZhciB2bm9kZSA9IHZtLl9yZW5kZXIoKTtcbiAgICAgIG1hcmsoZW5kVGFnKTtcbiAgICAgIG1lYXN1cmUoKFwidnVlIFwiICsgbmFtZSArIFwiIHJlbmRlclwiKSwgc3RhcnRUYWcsIGVuZFRhZyk7XG5cbiAgICAgIG1hcmsoc3RhcnRUYWcpO1xuICAgICAgdm0uX3VwZGF0ZSh2bm9kZSwgaHlkcmF0aW5nKTtcbiAgICAgIG1hcmsoZW5kVGFnKTtcbiAgICAgIG1lYXN1cmUoKFwidnVlIFwiICsgbmFtZSArIFwiIHBhdGNoXCIpLCBzdGFydFRhZywgZW5kVGFnKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZUNvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZtLl91cGRhdGUodm0uX3JlbmRlcigpLCBoeWRyYXRpbmcpO1xuICAgIH07XG4gIH1cblxuICAvLyB3ZSBzZXQgdGhpcyB0byB2bS5fd2F0Y2hlciBpbnNpZGUgdGhlIHdhdGNoZXIncyBjb25zdHJ1Y3RvclxuICAvLyBzaW5jZSB0aGUgd2F0Y2hlcidzIGluaXRpYWwgcGF0Y2ggbWF5IGNhbGwgJGZvcmNlVXBkYXRlIChlLmcuIGluc2lkZSBjaGlsZFxuICAvLyBjb21wb25lbnQncyBtb3VudGVkIGhvb2spLCB3aGljaCByZWxpZXMgb24gdm0uX3dhdGNoZXIgYmVpbmcgYWxyZWFkeSBkZWZpbmVkXG4gIG5ldyBXYXRjaGVyKHZtLCB1cGRhdGVDb21wb25lbnQsIG5vb3AsIG51bGwsIHRydWUgLyogaXNSZW5kZXJXYXRjaGVyICovKTtcbiAgaHlkcmF0aW5nID0gZmFsc2U7XG5cbiAgLy8gbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSwgY2FsbCBtb3VudGVkIG9uIHNlbGZcbiAgLy8gbW91bnRlZCBpcyBjYWxsZWQgZm9yIHJlbmRlci1jcmVhdGVkIGNoaWxkIGNvbXBvbmVudHMgaW4gaXRzIGluc2VydGVkIGhvb2tcbiAgaWYgKHZtLiR2bm9kZSA9PSBudWxsKSB7XG4gICAgdm0uX2lzTW91bnRlZCA9IHRydWU7XG4gICAgY2FsbEhvb2sodm0sICdtb3VudGVkJyk7XG4gIH1cbiAgcmV0dXJuIHZtXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNoaWxkQ29tcG9uZW50IChcbiAgdm0sXG4gIHByb3BzRGF0YSxcbiAgbGlzdGVuZXJzLFxuICBwYXJlbnRWbm9kZSxcbiAgcmVuZGVyQ2hpbGRyZW5cbikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IHRydWU7XG4gIH1cblxuICAvLyBkZXRlcm1pbmUgd2hldGhlciBjb21wb25lbnQgaGFzIHNsb3QgY2hpbGRyZW5cbiAgLy8gd2UgbmVlZCB0byBkbyB0aGlzIGJlZm9yZSBvdmVyd3JpdGluZyAkb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW5cbiAgdmFyIGhhc0NoaWxkcmVuID0gISEoXG4gICAgcmVuZGVyQ2hpbGRyZW4gfHwgICAgICAgICAgICAgICAvLyBoYXMgbmV3IHN0YXRpYyBzbG90c1xuICAgIHZtLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbiB8fCAgLy8gaGFzIG9sZCBzdGF0aWMgc2xvdHNcbiAgICBwYXJlbnRWbm9kZS5kYXRhLnNjb3BlZFNsb3RzIHx8IC8vIGhhcyBuZXcgc2NvcGVkIHNsb3RzXG4gICAgdm0uJHNjb3BlZFNsb3RzICE9PSBlbXB0eU9iamVjdCAvLyBoYXMgb2xkIHNjb3BlZCBzbG90c1xuICApO1xuXG4gIHZtLiRvcHRpb25zLl9wYXJlbnRWbm9kZSA9IHBhcmVudFZub2RlO1xuICB2bS4kdm5vZGUgPSBwYXJlbnRWbm9kZTsgLy8gdXBkYXRlIHZtJ3MgcGxhY2Vob2xkZXIgbm9kZSB3aXRob3V0IHJlLXJlbmRlclxuXG4gIGlmICh2bS5fdm5vZGUpIHsgLy8gdXBkYXRlIGNoaWxkIHRyZWUncyBwYXJlbnRcbiAgICB2bS5fdm5vZGUucGFyZW50ID0gcGFyZW50Vm5vZGU7XG4gIH1cbiAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuID0gcmVuZGVyQ2hpbGRyZW47XG5cbiAgLy8gdXBkYXRlICRhdHRycyBhbmQgJGxpc3RlbmVycyBoYXNoXG4gIC8vIHRoZXNlIGFyZSBhbHNvIHJlYWN0aXZlIHNvIHRoZXkgbWF5IHRyaWdnZXIgY2hpbGQgdXBkYXRlIGlmIHRoZSBjaGlsZFxuICAvLyB1c2VkIHRoZW0gZHVyaW5nIHJlbmRlclxuICB2bS4kYXR0cnMgPSBwYXJlbnRWbm9kZS5kYXRhLmF0dHJzIHx8IGVtcHR5T2JqZWN0O1xuICB2bS4kbGlzdGVuZXJzID0gbGlzdGVuZXJzIHx8IGVtcHR5T2JqZWN0O1xuXG4gIC8vIHVwZGF0ZSBwcm9wc1xuICBpZiAocHJvcHNEYXRhICYmIHZtLiRvcHRpb25zLnByb3BzKSB7XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKGZhbHNlKTtcbiAgICB2YXIgcHJvcHMgPSB2bS5fcHJvcHM7XG4gICAgdmFyIHByb3BLZXlzID0gdm0uJG9wdGlvbnMuX3Byb3BLZXlzIHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wS2V5c1tpXTtcbiAgICAgIHZhciBwcm9wT3B0aW9ucyA9IHZtLiRvcHRpb25zLnByb3BzOyAvLyB3dGYgZmxvdz9cbiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhLCB2bSk7XG4gICAgfVxuICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTtcbiAgICAvLyBrZWVwIGEgY29weSBvZiByYXcgcHJvcHNEYXRhXG4gICAgdm0uJG9wdGlvbnMucHJvcHNEYXRhID0gcHJvcHNEYXRhO1xuICB9XG5cbiAgLy8gdXBkYXRlIGxpc3RlbmVyc1xuICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3Q7XG4gIHZhciBvbGRMaXN0ZW5lcnMgPSB2bS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO1xuICB2bS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzO1xuICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKTtcblxuICAvLyByZXNvbHZlIHNsb3RzICsgZm9yY2UgdXBkYXRlIGlmIGhhcyBjaGlsZHJlblxuICBpZiAoaGFzQ2hpbGRyZW4pIHtcbiAgICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMocmVuZGVyQ2hpbGRyZW4sIHBhcmVudFZub2RlLmNvbnRleHQpO1xuICAgIHZtLiRmb3JjZVVwZGF0ZSgpO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0luSW5hY3RpdmVUcmVlICh2bSkge1xuICB3aGlsZSAodm0gJiYgKHZtID0gdm0uJHBhcmVudCkpIHtcbiAgICBpZiAodm0uX2luYWN0aXZlKSB7IHJldHVybiB0cnVlIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkge1xuICBpZiAoZGlyZWN0KSB7XG4gICAgdm0uX2RpcmVjdEluYWN0aXZlID0gZmFsc2U7XG4gICAgaWYgKGlzSW5JbmFjdGl2ZVRyZWUodm0pKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gIH0gZWxzZSBpZiAodm0uX2RpcmVjdEluYWN0aXZlKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHZtLl9pbmFjdGl2ZSB8fCB2bS5faW5hY3RpdmUgPT09IG51bGwpIHtcbiAgICB2bS5faW5hY3RpdmUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZtLiRjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudCh2bS4kY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgICBjYWxsSG9vayh2bSwgJ2FjdGl2YXRlZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkge1xuICBpZiAoZGlyZWN0KSB7XG4gICAgdm0uX2RpcmVjdEluYWN0aXZlID0gdHJ1ZTtcbiAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuICBpZiAoIXZtLl9pbmFjdGl2ZSkge1xuICAgIHZtLl9pbmFjdGl2ZSA9IHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudCh2bS4kY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgICBjYWxsSG9vayh2bSwgJ2RlYWN0aXZhdGVkJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbEhvb2sgKHZtLCBob29rKSB7XG4gIC8vICM3NTczIGRpc2FibGUgZGVwIGNvbGxlY3Rpb24gd2hlbiBpbnZva2luZyBsaWZlY3ljbGUgaG9va3NcbiAgcHVzaFRhcmdldCgpO1xuICB2YXIgaGFuZGxlcnMgPSB2bS4kb3B0aW9uc1tob29rXTtcbiAgaWYgKGhhbmRsZXJzKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGogPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXJzW2ldLmNhbGwodm0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgKGhvb2sgKyBcIiBob29rXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHZtLl9oYXNIb29rRXZlbnQpIHtcbiAgICB2bS4kZW1pdCgnaG9vazonICsgaG9vayk7XG4gIH1cbiAgcG9wVGFyZ2V0KCk7XG59XG5cbi8qICAqL1xuXG5cbnZhciBNQVhfVVBEQVRFX0NPVU5UID0gMTAwO1xuXG52YXIgcXVldWUgPSBbXTtcbnZhciBhY3RpdmF0ZWRDaGlsZHJlbiA9IFtdO1xudmFyIGhhcyA9IHt9O1xudmFyIGNpcmN1bGFyID0ge307XG52YXIgd2FpdGluZyA9IGZhbHNlO1xudmFyIGZsdXNoaW5nID0gZmFsc2U7XG52YXIgaW5kZXggPSAwO1xuXG4vKipcbiAqIFJlc2V0IHRoZSBzY2hlZHVsZXIncyBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gcmVzZXRTY2hlZHVsZXJTdGF0ZSAoKSB7XG4gIGluZGV4ID0gcXVldWUubGVuZ3RoID0gYWN0aXZhdGVkQ2hpbGRyZW4ubGVuZ3RoID0gMDtcbiAgaGFzID0ge307XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY2lyY3VsYXIgPSB7fTtcbiAgfVxuICB3YWl0aW5nID0gZmx1c2hpbmcgPSBmYWxzZTtcbn1cblxuLyoqXG4gKiBGbHVzaCBib3RoIHF1ZXVlcyBhbmQgcnVuIHRoZSB3YXRjaGVycy5cbiAqL1xuZnVuY3Rpb24gZmx1c2hTY2hlZHVsZXJRdWV1ZSAoKSB7XG4gIGZsdXNoaW5nID0gdHJ1ZTtcbiAgdmFyIHdhdGNoZXIsIGlkO1xuXG4gIC8vIFNvcnQgcXVldWUgYmVmb3JlIGZsdXNoLlxuICAvLyBUaGlzIGVuc3VyZXMgdGhhdDpcbiAgLy8gMS4gQ29tcG9uZW50cyBhcmUgdXBkYXRlZCBmcm9tIHBhcmVudCB0byBjaGlsZC4gKGJlY2F1c2UgcGFyZW50IGlzIGFsd2F5c1xuICAvLyAgICBjcmVhdGVkIGJlZm9yZSB0aGUgY2hpbGQpXG4gIC8vIDIuIEEgY29tcG9uZW50J3MgdXNlciB3YXRjaGVycyBhcmUgcnVuIGJlZm9yZSBpdHMgcmVuZGVyIHdhdGNoZXIgKGJlY2F1c2VcbiAgLy8gICAgdXNlciB3YXRjaGVycyBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIHJlbmRlciB3YXRjaGVyKVxuICAvLyAzLiBJZiBhIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQgZHVyaW5nIGEgcGFyZW50IGNvbXBvbmVudCdzIHdhdGNoZXIgcnVuLFxuICAvLyAgICBpdHMgd2F0Y2hlcnMgY2FuIGJlIHNraXBwZWQuXG4gIHF1ZXVlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuaWQgLSBiLmlkOyB9KTtcblxuICAvLyBkbyBub3QgY2FjaGUgbGVuZ3RoIGJlY2F1c2UgbW9yZSB3YXRjaGVycyBtaWdodCBiZSBwdXNoZWRcbiAgLy8gYXMgd2UgcnVuIGV4aXN0aW5nIHdhdGNoZXJzXG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHF1ZXVlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIHdhdGNoZXIgPSBxdWV1ZVtpbmRleF07XG4gICAgaWQgPSB3YXRjaGVyLmlkO1xuICAgIGhhc1tpZF0gPSBudWxsO1xuICAgIHdhdGNoZXIucnVuKCk7XG4gICAgLy8gaW4gZGV2IGJ1aWxkLCBjaGVjayBhbmQgc3RvcCBjaXJjdWxhciB1cGRhdGVzLlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGhhc1tpZF0gIT0gbnVsbCkge1xuICAgICAgY2lyY3VsYXJbaWRdID0gKGNpcmN1bGFyW2lkXSB8fCAwKSArIDE7XG4gICAgICBpZiAoY2lyY3VsYXJbaWRdID4gTUFYX1VQREFURV9DT1VOVCkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgICdZb3UgbWF5IGhhdmUgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AgJyArIChcbiAgICAgICAgICAgIHdhdGNoZXIudXNlclxuICAgICAgICAgICAgICA/IChcImluIHdhdGNoZXIgd2l0aCBleHByZXNzaW9uIFxcXCJcIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgXCJcXFwiXCIpXG4gICAgICAgICAgICAgIDogXCJpbiBhIGNvbXBvbmVudCByZW5kZXIgZnVuY3Rpb24uXCJcbiAgICAgICAgICApLFxuICAgICAgICAgIHdhdGNoZXIudm1cbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBrZWVwIGNvcGllcyBvZiBwb3N0IHF1ZXVlcyBiZWZvcmUgcmVzZXR0aW5nIHN0YXRlXG4gIHZhciBhY3RpdmF0ZWRRdWV1ZSA9IGFjdGl2YXRlZENoaWxkcmVuLnNsaWNlKCk7XG4gIHZhciB1cGRhdGVkUXVldWUgPSBxdWV1ZS5zbGljZSgpO1xuXG4gIHJlc2V0U2NoZWR1bGVyU3RhdGUoKTtcblxuICAvLyBjYWxsIGNvbXBvbmVudCB1cGRhdGVkIGFuZCBhY3RpdmF0ZWQgaG9va3NcbiAgY2FsbEFjdGl2YXRlZEhvb2tzKGFjdGl2YXRlZFF1ZXVlKTtcbiAgY2FsbFVwZGF0ZWRIb29rcyh1cGRhdGVkUXVldWUpO1xuXG4gIC8vIGRldnRvb2wgaG9va1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGRldnRvb2xzICYmIGNvbmZpZy5kZXZ0b29scykge1xuICAgIGRldnRvb2xzLmVtaXQoJ2ZsdXNoJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbFVwZGF0ZWRIb29rcyAocXVldWUpIHtcbiAgdmFyIGkgPSBxdWV1ZS5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIgd2F0Y2hlciA9IHF1ZXVlW2ldO1xuICAgIHZhciB2bSA9IHdhdGNoZXIudm07XG4gICAgaWYgKHZtLl93YXRjaGVyID09PSB3YXRjaGVyICYmIHZtLl9pc01vdW50ZWQpIHtcbiAgICAgIGNhbGxIb29rKHZtLCAndXBkYXRlZCcpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFF1ZXVlIGEga2VwdC1hbGl2ZSBjb21wb25lbnQgdGhhdCB3YXMgYWN0aXZhdGVkIGR1cmluZyBwYXRjaC5cbiAqIFRoZSBxdWV1ZSB3aWxsIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUgZW50aXJlIHRyZWUgaGFzIGJlZW4gcGF0Y2hlZC5cbiAqL1xuZnVuY3Rpb24gcXVldWVBY3RpdmF0ZWRDb21wb25lbnQgKHZtKSB7XG4gIC8vIHNldHRpbmcgX2luYWN0aXZlIHRvIGZhbHNlIGhlcmUgc28gdGhhdCBhIHJlbmRlciBmdW5jdGlvbiBjYW5cbiAgLy8gcmVseSBvbiBjaGVja2luZyB3aGV0aGVyIGl0J3MgaW4gYW4gaW5hY3RpdmUgdHJlZSAoZS5nLiByb3V0ZXItdmlldylcbiAgdm0uX2luYWN0aXZlID0gZmFsc2U7XG4gIGFjdGl2YXRlZENoaWxkcmVuLnB1c2godm0pO1xufVxuXG5mdW5jdGlvbiBjYWxsQWN0aXZhdGVkSG9va3MgKHF1ZXVlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICBxdWV1ZVtpXS5faW5hY3RpdmUgPSB0cnVlO1xuICAgIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQocXVldWVbaV0sIHRydWUgLyogdHJ1ZSAqLyk7XG4gIH1cbn1cblxuLyoqXG4gKiBQdXNoIGEgd2F0Y2hlciBpbnRvIHRoZSB3YXRjaGVyIHF1ZXVlLlxuICogSm9icyB3aXRoIGR1cGxpY2F0ZSBJRHMgd2lsbCBiZSBza2lwcGVkIHVubGVzcyBpdCdzXG4gKiBwdXNoZWQgd2hlbiB0aGUgcXVldWUgaXMgYmVpbmcgZmx1c2hlZC5cbiAqL1xuZnVuY3Rpb24gcXVldWVXYXRjaGVyICh3YXRjaGVyKSB7XG4gIHZhciBpZCA9IHdhdGNoZXIuaWQ7XG4gIGlmIChoYXNbaWRdID09IG51bGwpIHtcbiAgICBoYXNbaWRdID0gdHJ1ZTtcbiAgICBpZiAoIWZsdXNoaW5nKSB7XG4gICAgICBxdWV1ZS5wdXNoKHdhdGNoZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBhbHJlYWR5IGZsdXNoaW5nLCBzcGxpY2UgdGhlIHdhdGNoZXIgYmFzZWQgb24gaXRzIGlkXG4gICAgICAvLyBpZiBhbHJlYWR5IHBhc3QgaXRzIGlkLCBpdCB3aWxsIGJlIHJ1biBuZXh0IGltbWVkaWF0ZWx5LlxuICAgICAgdmFyIGkgPSBxdWV1ZS5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKGkgPiBpbmRleCAmJiBxdWV1ZVtpXS5pZCA+IHdhdGNoZXIuaWQpIHtcbiAgICAgICAgaS0tO1xuICAgICAgfVxuICAgICAgcXVldWUuc3BsaWNlKGkgKyAxLCAwLCB3YXRjaGVyKTtcbiAgICB9XG4gICAgLy8gcXVldWUgdGhlIGZsdXNoXG4gICAgaWYgKCF3YWl0aW5nKSB7XG4gICAgICB3YWl0aW5nID0gdHJ1ZTtcbiAgICAgIG5leHRUaWNrKGZsdXNoU2NoZWR1bGVyUXVldWUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIHVpZCQxID0gMDtcblxuLyoqXG4gKiBBIHdhdGNoZXIgcGFyc2VzIGFuIGV4cHJlc3Npb24sIGNvbGxlY3RzIGRlcGVuZGVuY2llcyxcbiAqIGFuZCBmaXJlcyBjYWxsYmFjayB3aGVuIHRoZSBleHByZXNzaW9uIHZhbHVlIGNoYW5nZXMuXG4gKiBUaGlzIGlzIHVzZWQgZm9yIGJvdGggdGhlICR3YXRjaCgpIGFwaSBhbmQgZGlyZWN0aXZlcy5cbiAqL1xudmFyIFdhdGNoZXIgPSBmdW5jdGlvbiBXYXRjaGVyIChcbiAgdm0sXG4gIGV4cE9yRm4sXG4gIGNiLFxuICBvcHRpb25zLFxuICBpc1JlbmRlcldhdGNoZXJcbikge1xuICB0aGlzLnZtID0gdm07XG4gIGlmIChpc1JlbmRlcldhdGNoZXIpIHtcbiAgICB2bS5fd2F0Y2hlciA9IHRoaXM7XG4gIH1cbiAgdm0uX3dhdGNoZXJzLnB1c2godGhpcyk7XG4gIC8vIG9wdGlvbnNcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICB0aGlzLmRlZXAgPSAhIW9wdGlvbnMuZGVlcDtcbiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjtcbiAgICB0aGlzLmxhenkgPSAhIW9wdGlvbnMubGF6eTtcbiAgICB0aGlzLnN5bmMgPSAhIW9wdGlvbnMuc3luYztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmRlZXAgPSB0aGlzLnVzZXIgPSB0aGlzLmxhenkgPSB0aGlzLnN5bmMgPSBmYWxzZTtcbiAgfVxuICB0aGlzLmNiID0gY2I7XG4gIHRoaXMuaWQgPSArK3VpZCQxOyAvLyB1aWQgZm9yIGJhdGNoaW5nXG4gIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eTsgLy8gZm9yIGxhenkgd2F0Y2hlcnNcbiAgdGhpcy5kZXBzID0gW107XG4gIHRoaXMubmV3RGVwcyA9IFtdO1xuICB0aGlzLmRlcElkcyA9IG5ldyBfU2V0KCk7XG4gIHRoaXMubmV3RGVwSWRzID0gbmV3IF9TZXQoKTtcbiAgdGhpcy5leHByZXNzaW9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJ1xuICAgID8gZXhwT3JGbi50b1N0cmluZygpXG4gICAgOiAnJztcbiAgLy8gcGFyc2UgZXhwcmVzc2lvbiBmb3IgZ2V0dGVyXG4gIGlmICh0eXBlb2YgZXhwT3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuZ2V0dGVyID0gZXhwT3JGbjtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmdldHRlciA9IHBhcnNlUGF0aChleHBPckZuKTtcbiAgICBpZiAoIXRoaXMuZ2V0dGVyKSB7XG4gICAgICB0aGlzLmdldHRlciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIkZhaWxlZCB3YXRjaGluZyBwYXRoOiBcXFwiXCIgKyBleHBPckZuICsgXCJcXFwiIFwiICtcbiAgICAgICAgJ1dhdGNoZXIgb25seSBhY2NlcHRzIHNpbXBsZSBkb3QtZGVsaW1pdGVkIHBhdGhzLiAnICtcbiAgICAgICAgJ0ZvciBmdWxsIGNvbnRyb2wsIHVzZSBhIGZ1bmN0aW9uIGluc3RlYWQuJyxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHRoaXMudmFsdWUgPSB0aGlzLmxhenlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogdGhpcy5nZXQoKTtcbn07XG5cbi8qKlxuICogRXZhbHVhdGUgdGhlIGdldHRlciwgYW5kIHJlLWNvbGxlY3QgZGVwZW5kZW5jaWVzLlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKCkge1xuICBwdXNoVGFyZ2V0KHRoaXMpO1xuICB2YXIgdmFsdWU7XG4gIHZhciB2bSA9IHRoaXMudm07XG4gIHRyeSB7XG4gICAgdmFsdWUgPSB0aGlzLmdldHRlci5jYWxsKHZtLCB2bSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAodGhpcy51c2VyKSB7XG4gICAgICBoYW5kbGVFcnJvcihlLCB2bSwgKFwiZ2V0dGVyIGZvciB3YXRjaGVyIFxcXCJcIiArICh0aGlzLmV4cHJlc3Npb24pICsgXCJcXFwiXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBcInRvdWNoXCIgZXZlcnkgcHJvcGVydHkgc28gdGhleSBhcmUgYWxsIHRyYWNrZWQgYXNcbiAgICAvLyBkZXBlbmRlbmNpZXMgZm9yIGRlZXAgd2F0Y2hpbmdcbiAgICBpZiAodGhpcy5kZWVwKSB7XG4gICAgICB0cmF2ZXJzZSh2YWx1ZSk7XG4gICAgfVxuICAgIHBvcFRhcmdldCgpO1xuICAgIHRoaXMuY2xlYW51cERlcHMoKTtcbiAgfVxuICByZXR1cm4gdmFsdWVcbn07XG5cbi8qKlxuICogQWRkIGEgZGVwZW5kZW5jeSB0byB0aGlzIGRpcmVjdGl2ZS5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuYWRkRGVwID0gZnVuY3Rpb24gYWRkRGVwIChkZXApIHtcbiAgdmFyIGlkID0gZGVwLmlkO1xuICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHtcbiAgICB0aGlzLm5ld0RlcElkcy5hZGQoaWQpO1xuICAgIHRoaXMubmV3RGVwcy5wdXNoKGRlcCk7XG4gICAgaWYgKCF0aGlzLmRlcElkcy5oYXMoaWQpKSB7XG4gICAgICBkZXAuYWRkU3ViKHRoaXMpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBDbGVhbiB1cCBmb3IgZGVwZW5kZW5jeSBjb2xsZWN0aW9uLlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS5jbGVhbnVwRGVwcyA9IGZ1bmN0aW9uIGNsZWFudXBEZXBzICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIgZGVwID0gdGhpcyQxLmRlcHNbaV07XG4gICAgaWYgKCF0aGlzJDEubmV3RGVwSWRzLmhhcyhkZXAuaWQpKSB7XG4gICAgICBkZXAucmVtb3ZlU3ViKHRoaXMkMSk7XG4gICAgfVxuICB9XG4gIHZhciB0bXAgPSB0aGlzLmRlcElkcztcbiAgdGhpcy5kZXBJZHMgPSB0aGlzLm5ld0RlcElkcztcbiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7XG4gIHRoaXMubmV3RGVwSWRzLmNsZWFyKCk7XG4gIHRtcCA9IHRoaXMuZGVwcztcbiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzO1xuICB0aGlzLm5ld0RlcHMgPSB0bXA7XG4gIHRoaXMubmV3RGVwcy5sZW5ndGggPSAwO1xufTtcblxuLyoqXG4gKiBTdWJzY3JpYmVyIGludGVyZmFjZS5cbiAqIFdpbGwgYmUgY2FsbGVkIHdoZW4gYSBkZXBlbmRlbmN5IGNoYW5nZXMuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0aGlzLmxhenkpIHtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgfSBlbHNlIGlmICh0aGlzLnN5bmMpIHtcbiAgICB0aGlzLnJ1bigpO1xuICB9IGVsc2Uge1xuICAgIHF1ZXVlV2F0Y2hlcih0aGlzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS5cbiAqIFdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBzY2hlZHVsZXIuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7XG4gIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0KCk7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgIT09IHRoaXMudmFsdWUgfHxcbiAgICAgIC8vIERlZXAgd2F0Y2hlcnMgYW5kIHdhdGNoZXJzIG9uIE9iamVjdC9BcnJheXMgc2hvdWxkIGZpcmUgZXZlblxuICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGJlY2F1c2UgdGhlIHZhbHVlIG1heVxuICAgICAgLy8gaGF2ZSBtdXRhdGVkLlxuICAgICAgaXNPYmplY3QodmFsdWUpIHx8XG4gICAgICB0aGlzLmRlZXBcbiAgICApIHtcbiAgICAgIC8vIHNldCBuZXcgdmFsdWVcbiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy51c2VyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5jYi5jYWxsKHRoaXMudm0sIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB0aGlzLnZtLCAoXCJjYWxsYmFjayBmb3Igd2F0Y2hlciBcXFwiXCIgKyAodGhpcy5leHByZXNzaW9uKSArIFwiXFxcIlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2IuY2FsbCh0aGlzLnZtLCB2YWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIHdhdGNoZXIuXG4gKiBUaGlzIG9ubHkgZ2V0cyBjYWxsZWQgZm9yIGxhenkgd2F0Y2hlcnMuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gZXZhbHVhdGUgKCkge1xuICB0aGlzLnZhbHVlID0gdGhpcy5nZXQoKTtcbiAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xufTtcblxuLyoqXG4gKiBEZXBlbmQgb24gYWxsIGRlcHMgY29sbGVjdGVkIGJ5IHRoaXMgd2F0Y2hlci5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB0aGlzJDEuZGVwc1tpXS5kZXBlbmQoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZW1vdmUgc2VsZiBmcm9tIGFsbCBkZXBlbmRlbmNpZXMnIHN1YnNjcmliZXIgbGlzdC5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUudGVhcmRvd24gPSBmdW5jdGlvbiB0ZWFyZG93biAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdFxuICAgIC8vIHRoaXMgaXMgYSBzb21ld2hhdCBleHBlbnNpdmUgb3BlcmF0aW9uIHNvIHdlIHNraXAgaXRcbiAgICAvLyBpZiB0aGUgdm0gaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgIGlmICghdGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZCkge1xuICAgICAgcmVtb3ZlKHRoaXMudm0uX3dhdGNoZXJzLCB0aGlzKTtcbiAgICB9XG4gICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMkMS5kZXBzW2ldLnJlbW92ZVN1Yih0aGlzJDEpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICB9XG59O1xuXG4vKiAgKi9cblxudmFyIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbiA9IHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBnZXQ6IG5vb3AsXG4gIHNldDogbm9vcFxufTtcblxuZnVuY3Rpb24gcHJveHkgKHRhcmdldCwgc291cmNlS2V5LCBrZXkpIHtcbiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IGZ1bmN0aW9uIHByb3h5R2V0dGVyICgpIHtcbiAgICByZXR1cm4gdGhpc1tzb3VyY2VLZXldW2tleV1cbiAgfTtcbiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uIHByb3h5U2V0dGVyICh2YWwpIHtcbiAgICB0aGlzW3NvdXJjZUtleV1ba2V5XSA9IHZhbDtcbiAgfTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pO1xufVxuXG5mdW5jdGlvbiBpbml0U3RhdGUgKHZtKSB7XG4gIHZtLl93YXRjaGVycyA9IFtdO1xuICB2YXIgb3B0cyA9IHZtLiRvcHRpb25zO1xuICBpZiAob3B0cy5wcm9wcykgeyBpbml0UHJvcHModm0sIG9wdHMucHJvcHMpOyB9XG4gIGlmIChvcHRzLm1ldGhvZHMpIHsgaW5pdE1ldGhvZHModm0sIG9wdHMubWV0aG9kcyk7IH1cbiAgaWYgKG9wdHMuZGF0YSkge1xuICAgIGluaXREYXRhKHZtKTtcbiAgfSBlbHNlIHtcbiAgICBvYnNlcnZlKHZtLl9kYXRhID0ge30sIHRydWUgLyogYXNSb290RGF0YSAqLyk7XG4gIH1cbiAgaWYgKG9wdHMuY29tcHV0ZWQpIHsgaW5pdENvbXB1dGVkKHZtLCBvcHRzLmNvbXB1dGVkKTsgfVxuICBpZiAob3B0cy53YXRjaCAmJiBvcHRzLndhdGNoICE9PSBuYXRpdmVXYXRjaCkge1xuICAgIGluaXRXYXRjaCh2bSwgb3B0cy53YXRjaCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdFByb3BzICh2bSwgcHJvcHNPcHRpb25zKSB7XG4gIHZhciBwcm9wc0RhdGEgPSB2bS4kb3B0aW9ucy5wcm9wc0RhdGEgfHwge307XG4gIHZhciBwcm9wcyA9IHZtLl9wcm9wcyA9IHt9O1xuICAvLyBjYWNoZSBwcm9wIGtleXMgc28gdGhhdCBmdXR1cmUgcHJvcHMgdXBkYXRlcyBjYW4gaXRlcmF0ZSB1c2luZyBBcnJheVxuICAvLyBpbnN0ZWFkIG9mIGR5bmFtaWMgb2JqZWN0IGtleSBlbnVtZXJhdGlvbi5cbiAgdmFyIGtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgPSBbXTtcbiAgdmFyIGlzUm9vdCA9ICF2bS4kcGFyZW50O1xuICAvLyByb290IGluc3RhbmNlIHByb3BzIHNob3VsZCBiZSBjb252ZXJ0ZWRcbiAgaWYgKCFpc1Jvb3QpIHtcbiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpO1xuICB9XG4gIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gICAgdmFyIHZhbHVlID0gdmFsaWRhdGVQcm9wKGtleSwgcHJvcHNPcHRpb25zLCBwcm9wc0RhdGEsIHZtKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgaHlwaGVuYXRlZEtleSA9IGh5cGhlbmF0ZShrZXkpO1xuICAgICAgaWYgKGlzUmVzZXJ2ZWRBdHRyaWJ1dGUoaHlwaGVuYXRlZEtleSkgfHxcbiAgICAgICAgICBjb25maWcuaXNSZXNlcnZlZEF0dHIoaHlwaGVuYXRlZEtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJcXFwiXCIgKyBoeXBoZW5hdGVkS2V5ICsgXCJcXFwiIGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBjb21wb25lbnQgcHJvcC5cIiksXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRlZmluZVJlYWN0aXZlKHByb3BzLCBrZXksIHZhbHVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh2bS4kcGFyZW50ICYmICFpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgXCJBdm9pZCBtdXRhdGluZyBhIHByb3AgZGlyZWN0bHkgc2luY2UgdGhlIHZhbHVlIHdpbGwgYmUgXCIgK1xuICAgICAgICAgICAgXCJvdmVyd3JpdHRlbiB3aGVuZXZlciB0aGUgcGFyZW50IGNvbXBvbmVudCByZS1yZW5kZXJzLiBcIiArXG4gICAgICAgICAgICBcIkluc3RlYWQsIHVzZSBhIGRhdGEgb3IgY29tcHV0ZWQgcHJvcGVydHkgYmFzZWQgb24gdGhlIHByb3AncyBcIiArXG4gICAgICAgICAgICBcInZhbHVlLiBQcm9wIGJlaW5nIG11dGF0ZWQ6IFxcXCJcIiArIGtleSArIFwiXFxcIlwiLFxuICAgICAgICAgICAgdm1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVmaW5lUmVhY3RpdmUocHJvcHMsIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICAvLyBzdGF0aWMgcHJvcHMgYXJlIGFscmVhZHkgcHJveGllZCBvbiB0aGUgY29tcG9uZW50J3MgcHJvdG90eXBlXG4gICAgLy8gZHVyaW5nIFZ1ZS5leHRlbmQoKS4gV2Ugb25seSBuZWVkIHRvIHByb3h5IHByb3BzIGRlZmluZWQgYXRcbiAgICAvLyBpbnN0YW50aWF0aW9uIGhlcmUuXG4gICAgaWYgKCEoa2V5IGluIHZtKSkge1xuICAgICAgcHJveHkodm0sIFwiX3Byb3BzXCIsIGtleSk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAodmFyIGtleSBpbiBwcm9wc09wdGlvbnMpIGxvb3AoIGtleSApO1xuICB0b2dnbGVPYnNlcnZpbmcodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGluaXREYXRhICh2bSkge1xuICB2YXIgZGF0YSA9IHZtLiRvcHRpb25zLmRhdGE7XG4gIGRhdGEgPSB2bS5fZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nXG4gICAgPyBnZXREYXRhKGRhdGEsIHZtKVxuICAgIDogZGF0YSB8fCB7fTtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEpKSB7XG4gICAgZGF0YSA9IHt9O1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICdkYXRhIGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIGFuIG9iamVjdDpcXG4nICtcbiAgICAgICdodHRwczovL3Z1ZWpzLm9yZy92Mi9ndWlkZS9jb21wb25lbnRzLmh0bWwjZGF0YS1NdXN0LUJlLWEtRnVuY3Rpb24nLFxuICAgICAgdm1cbiAgICApO1xuICB9XG4gIC8vIHByb3h5IGRhdGEgb24gaW5zdGFuY2VcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7XG4gIHZhciBtZXRob2RzID0gdm0uJG9wdGlvbnMubWV0aG9kcztcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAobWV0aG9kcyAmJiBoYXNPd24obWV0aG9kcywga2V5KSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIChcIk1ldGhvZCBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGFzIGEgZGF0YSBwcm9wZXJ0eS5cIiksXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BzICYmIGhhc093bihwcm9wcywga2V5KSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIlRoZSBkYXRhIHByb3BlcnR5IFxcXCJcIiArIGtleSArIFwiXFxcIiBpcyBhbHJlYWR5IGRlY2xhcmVkIGFzIGEgcHJvcC4gXCIgK1xuICAgICAgICBcIlVzZSBwcm9wIGRlZmF1bHQgdmFsdWUgaW5zdGVhZC5cIixcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZChrZXkpKSB7XG4gICAgICBwcm94eSh2bSwgXCJfZGF0YVwiLCBrZXkpO1xuICAgIH1cbiAgfVxuICAvLyBvYnNlcnZlIGRhdGFcbiAgb2JzZXJ2ZShkYXRhLCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhIChkYXRhLCB2bSkge1xuICAvLyAjNzU3MyBkaXNhYmxlIGRlcCBjb2xsZWN0aW9uIHdoZW4gaW52b2tpbmcgZGF0YSBnZXR0ZXJzXG4gIHB1c2hUYXJnZXQoKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGF0YS5jYWxsKHZtLCB2bSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGhhbmRsZUVycm9yKGUsIHZtLCBcImRhdGEoKVwiKTtcbiAgICByZXR1cm4ge31cbiAgfSBmaW5hbGx5IHtcbiAgICBwb3BUYXJnZXQoKTtcbiAgfVxufVxuXG52YXIgY29tcHV0ZWRXYXRjaGVyT3B0aW9ucyA9IHsgbGF6eTogdHJ1ZSB9O1xuXG5mdW5jdGlvbiBpbml0Q29tcHV0ZWQgKHZtLCBjb21wdXRlZCkge1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgdmFyIHdhdGNoZXJzID0gdm0uX2NvbXB1dGVkV2F0Y2hlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBqdXN0IGdldHRlcnMgZHVyaW5nIFNTUlxuICB2YXIgaXNTU1IgPSBpc1NlcnZlclJlbmRlcmluZygpO1xuXG4gIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkge1xuICAgIHZhciB1c2VyRGVmID0gY29tcHV0ZWRba2V5XTtcbiAgICB2YXIgZ2V0dGVyID0gdHlwZW9mIHVzZXJEZWYgPT09ICdmdW5jdGlvbicgPyB1c2VyRGVmIDogdXNlckRlZi5nZXQ7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZ2V0dGVyID09IG51bGwpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIChcIkdldHRlciBpcyBtaXNzaW5nIGZvciBjb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIuXCIpLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzU1NSKSB7XG4gICAgICAvLyBjcmVhdGUgaW50ZXJuYWwgd2F0Y2hlciBmb3IgdGhlIGNvbXB1dGVkIHByb3BlcnR5LlxuICAgICAgd2F0Y2hlcnNba2V5XSA9IG5ldyBXYXRjaGVyKFxuICAgICAgICB2bSxcbiAgICAgICAgZ2V0dGVyIHx8IG5vb3AsXG4gICAgICAgIG5vb3AsXG4gICAgICAgIGNvbXB1dGVkV2F0Y2hlck9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gY29tcG9uZW50LWRlZmluZWQgY29tcHV0ZWQgcHJvcGVydGllcyBhcmUgYWxyZWFkeSBkZWZpbmVkIG9uIHRoZVxuICAgIC8vIGNvbXBvbmVudCBwcm90b3R5cGUuIFdlIG9ubHkgbmVlZCB0byBkZWZpbmUgY29tcHV0ZWQgcHJvcGVydGllcyBkZWZpbmVkXG4gICAgLy8gYXQgaW5zdGFudGlhdGlvbiBoZXJlLlxuICAgIGlmICghKGtleSBpbiB2bSkpIHtcbiAgICAgIGRlZmluZUNvbXB1dGVkKHZtLCBrZXksIHVzZXJEZWYpO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGtleSBpbiB2bS4kZGF0YSkge1xuICAgICAgICB3YXJuKChcIlRoZSBjb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIGRhdGEuXCIpLCB2bSk7XG4gICAgICB9IGVsc2UgaWYgKHZtLiRvcHRpb25zLnByb3BzICYmIGtleSBpbiB2bS4kb3B0aW9ucy5wcm9wcykge1xuICAgICAgICB3YXJuKChcIlRoZSBjb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgcHJvcC5cIiksIHZtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lQ29tcHV0ZWQgKFxuICB0YXJnZXQsXG4gIGtleSxcbiAgdXNlckRlZlxuKSB7XG4gIHZhciBzaG91bGRDYWNoZSA9ICFpc1NlcnZlclJlbmRlcmluZygpO1xuICBpZiAodHlwZW9mIHVzZXJEZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uZ2V0ID0gc2hvdWxkQ2FjaGVcbiAgICAgID8gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIoa2V5KVxuICAgICAgOiB1c2VyRGVmO1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSBub29wO1xuICB9IGVsc2Uge1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5nZXQgPSB1c2VyRGVmLmdldFxuICAgICAgPyBzaG91bGRDYWNoZSAmJiB1c2VyRGVmLmNhY2hlICE9PSBmYWxzZVxuICAgICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSlcbiAgICAgICAgOiB1c2VyRGVmLmdldFxuICAgICAgOiBub29wO1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSB1c2VyRGVmLnNldFxuICAgICAgPyB1c2VyRGVmLnNldFxuICAgICAgOiBub29wO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID09PSBub29wKSB7XG4gICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIChcIkNvbXB1dGVkIHByb3BlcnR5IFxcXCJcIiArIGtleSArIFwiXFxcIiB3YXMgYXNzaWduZWQgdG8gYnV0IGl0IGhhcyBubyBzZXR0ZXIuXCIpLFxuICAgICAgICB0aGlzXG4gICAgICApO1xuICAgIH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21wdXRlZEdldHRlciAoa2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb21wdXRlZEdldHRlciAoKSB7XG4gICAgdmFyIHdhdGNoZXIgPSB0aGlzLl9jb21wdXRlZFdhdGNoZXJzICYmIHRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNba2V5XTtcbiAgICBpZiAod2F0Y2hlcikge1xuICAgICAgaWYgKHdhdGNoZXIuZGlydHkpIHtcbiAgICAgICAgd2F0Y2hlci5ldmFsdWF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKERlcC50YXJnZXQpIHtcbiAgICAgICAgd2F0Y2hlci5kZXBlbmQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3YXRjaGVyLnZhbHVlXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRNZXRob2RzICh2bSwgbWV0aG9kcykge1xuICB2YXIgcHJvcHMgPSB2bS4kb3B0aW9ucy5wcm9wcztcbiAgZm9yICh2YXIga2V5IGluIG1ldGhvZHMpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKG1ldGhvZHNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyBhbiB1bmRlZmluZWQgdmFsdWUgaW4gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLiBcIiArXG4gICAgICAgICAgXCJEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5P1wiLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMgJiYgaGFzT3duKHByb3BzLCBrZXkpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgKFwiTWV0aG9kIFxcXCJcIiArIGtleSArIFwiXFxcIiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgYXMgYSBwcm9wLlwiKSxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKChrZXkgaW4gdm0pICYmIGlzUmVzZXJ2ZWQoa2V5KSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIFwiTWV0aG9kIFxcXCJcIiArIGtleSArIFwiXFxcIiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBWdWUgaW5zdGFuY2UgbWV0aG9kLiBcIiArXG4gICAgICAgICAgXCJBdm9pZCBkZWZpbmluZyBjb21wb25lbnQgbWV0aG9kcyB0aGF0IHN0YXJ0IHdpdGggXyBvciAkLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHZtW2tleV0gPSBtZXRob2RzW2tleV0gPT0gbnVsbCA/IG5vb3AgOiBiaW5kKG1ldGhvZHNba2V5XSwgdm0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRXYXRjaCAodm0sIHdhdGNoKSB7XG4gIGZvciAodmFyIGtleSBpbiB3YXRjaCkge1xuICAgIHZhciBoYW5kbGVyID0gd2F0Y2hba2V5XTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShoYW5kbGVyKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcltpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVdhdGNoZXIgKFxuICB2bSxcbiAgZXhwT3JGbixcbiAgaGFuZGxlcixcbiAgb3B0aW9uc1xuKSB7XG4gIGlmIChpc1BsYWluT2JqZWN0KGhhbmRsZXIpKSB7XG4gICAgb3B0aW9ucyA9IGhhbmRsZXI7XG4gICAgaGFuZGxlciA9IGhhbmRsZXIuaGFuZGxlcjtcbiAgfVxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgaGFuZGxlciA9IHZtW2hhbmRsZXJdO1xuICB9XG4gIHJldHVybiB2bS4kd2F0Y2goZXhwT3JGbiwgaGFuZGxlciwgb3B0aW9ucylcbn1cblxuZnVuY3Rpb24gc3RhdGVNaXhpbiAoVnVlKSB7XG4gIC8vIGZsb3cgc29tZWhvdyBoYXMgcHJvYmxlbXMgd2l0aCBkaXJlY3RseSBkZWNsYXJlZCBkZWZpbml0aW9uIG9iamVjdFxuICAvLyB3aGVuIHVzaW5nIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSwgc28gd2UgaGF2ZSB0byBwcm9jZWR1cmFsbHkgYnVpbGQgdXBcbiAgLy8gdGhlIG9iamVjdCBoZXJlLlxuICB2YXIgZGF0YURlZiA9IHt9O1xuICBkYXRhRGVmLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RhdGEgfTtcbiAgdmFyIHByb3BzRGVmID0ge307XG4gIHByb3BzRGVmLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3Byb3BzIH07XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZGF0YURlZi5zZXQgPSBmdW5jdGlvbiAobmV3RGF0YSkge1xuICAgICAgd2FybihcbiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICtcbiAgICAgICAgJ1VzZSBuZXN0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluc3RlYWQuJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9O1xuICAgIHByb3BzRGVmLnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm4oXCIkcHJvcHMgaXMgcmVhZG9ubHkuXCIsIHRoaXMpO1xuICAgIH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckZGF0YScsIGRhdGFEZWYpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKTtcblxuICBWdWUucHJvdG90eXBlLiRzZXQgPSBzZXQ7XG4gIFZ1ZS5wcm90b3R5cGUuJGRlbGV0ZSA9IGRlbDtcblxuICBWdWUucHJvdG90eXBlLiR3YXRjaCA9IGZ1bmN0aW9uIChcbiAgICBleHBPckZuLFxuICAgIGNiLFxuICAgIG9wdGlvbnNcbiAgKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAoaXNQbGFpbk9iamVjdChjYikpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucylcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy51c2VyID0gdHJ1ZTtcbiAgICB2YXIgd2F0Y2hlciA9IG5ldyBXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMuaW1tZWRpYXRlKSB7XG4gICAgICBjYi5jYWxsKHZtLCB3YXRjaGVyLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVud2F0Y2hGbiAoKSB7XG4gICAgICB3YXRjaGVyLnRlYXJkb3duKCk7XG4gICAgfVxuICB9O1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdFByb3ZpZGUgKHZtKSB7XG4gIHZhciBwcm92aWRlID0gdm0uJG9wdGlvbnMucHJvdmlkZTtcbiAgaWYgKHByb3ZpZGUpIHtcbiAgICB2bS5fcHJvdmlkZWQgPSB0eXBlb2YgcHJvdmlkZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBwcm92aWRlLmNhbGwodm0pXG4gICAgICA6IHByb3ZpZGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdEluamVjdGlvbnMgKHZtKSB7XG4gIHZhciByZXN1bHQgPSByZXNvbHZlSW5qZWN0KHZtLiRvcHRpb25zLmluamVjdCwgdm0pO1xuICBpZiAocmVzdWx0KSB7XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKGZhbHNlKTtcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIFwiQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSBcIiArXG4gICAgICAgICAgICBcIm92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwcm92aWRlZCBjb21wb25lbnQgcmUtcmVuZGVycy4gXCIgK1xuICAgICAgICAgICAgXCJpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogXFxcIlwiICsga2V5ICsgXCJcXFwiXCIsXG4gICAgICAgICAgICB2bVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmaW5lUmVhY3RpdmUodm0sIGtleSwgcmVzdWx0W2tleV0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlSW5qZWN0IChpbmplY3QsIHZtKSB7XG4gIGlmIChpbmplY3QpIHtcbiAgICAvLyBpbmplY3QgaXMgOmFueSBiZWNhdXNlIGZsb3cgaXMgbm90IHNtYXJ0IGVub3VnaCB0byBmaWd1cmUgb3V0IGNhY2hlZFxuICAgIHZhciByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBrZXlzID0gaGFzU3ltYm9sXG4gICAgICA/IFJlZmxlY3Qub3duS2V5cyhpbmplY3QpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluamVjdCwga2V5KS5lbnVtZXJhYmxlXG4gICAgICB9KVxuICAgICAgOiBPYmplY3Qua2V5cyhpbmplY3QpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIHZhciBwcm92aWRlS2V5ID0gaW5qZWN0W2tleV0uZnJvbTtcbiAgICAgIHZhciBzb3VyY2UgPSB2bTtcbiAgICAgIHdoaWxlIChzb3VyY2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZS5fcHJvdmlkZWQgJiYgaGFzT3duKHNvdXJjZS5fcHJvdmlkZWQsIHByb3ZpZGVLZXkpKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBzb3VyY2UuX3Byb3ZpZGVkW3Byb3ZpZGVLZXldO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgc291cmNlID0gc291cmNlLiRwYXJlbnQ7XG4gICAgICB9XG4gICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICBpZiAoJ2RlZmF1bHQnIGluIGluamVjdFtrZXldKSB7XG4gICAgICAgICAgdmFyIHByb3ZpZGVEZWZhdWx0ID0gaW5qZWN0W2tleV0uZGVmYXVsdDtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHR5cGVvZiBwcm92aWRlRGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBwcm92aWRlRGVmYXVsdC5jYWxsKHZtKVxuICAgICAgICAgICAgOiBwcm92aWRlRGVmYXVsdDtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgd2FybigoXCJJbmplY3Rpb24gXFxcIlwiICsga2V5ICsgXCJcXFwiIG5vdCBmb3VuZFwiKSwgdm0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIHYtZm9yIGxpc3RzLlxuICovXG5mdW5jdGlvbiByZW5kZXJMaXN0IChcbiAgdmFsLFxuICByZW5kZXJcbikge1xuICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkgfHwgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXQgPSBuZXcgQXJyYXkodmFsLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHJldFtpXSA9IHJlbmRlcih2YWxbaV0sIGkpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHJldCA9IG5ldyBBcnJheSh2YWwpO1xuICAgIGZvciAoaSA9IDA7IGkgPCB2YWw7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgIHJldCA9IG5ldyBBcnJheShrZXlzLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtrZXldLCBrZXksIGkpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNEZWYocmV0KSkge1xuICAgIChyZXQpLl9pc1ZMaXN0ID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciByZW5kZXJpbmcgPHNsb3Q+XG4gKi9cbmZ1bmN0aW9uIHJlbmRlclNsb3QgKFxuICBuYW1lLFxuICBmYWxsYmFjayxcbiAgcHJvcHMsXG4gIGJpbmRPYmplY3Rcbikge1xuICB2YXIgc2NvcGVkU2xvdEZuID0gdGhpcy4kc2NvcGVkU2xvdHNbbmFtZV07XG4gIHZhciBub2RlcztcbiAgaWYgKHNjb3BlZFNsb3RGbikgeyAvLyBzY29wZWQgc2xvdFxuICAgIHByb3BzID0gcHJvcHMgfHwge307XG4gICAgaWYgKGJpbmRPYmplY3QpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFpc09iamVjdChiaW5kT2JqZWN0KSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgICdzbG90IHYtYmluZCB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0JyxcbiAgICAgICAgICB0aGlzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBwcm9wcyA9IGV4dGVuZChleHRlbmQoe30sIGJpbmRPYmplY3QpLCBwcm9wcyk7XG4gICAgfVxuICAgIG5vZGVzID0gc2NvcGVkU2xvdEZuKHByb3BzKSB8fCBmYWxsYmFjaztcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xvdE5vZGVzID0gdGhpcy4kc2xvdHNbbmFtZV07XG4gICAgLy8gd2FybiBkdXBsaWNhdGUgc2xvdCB1c2FnZVxuICAgIGlmIChzbG90Tm9kZXMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHNsb3ROb2Rlcy5fcmVuZGVyZWQpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBcIkR1cGxpY2F0ZSBwcmVzZW5jZSBvZiBzbG90IFxcXCJcIiArIG5hbWUgKyBcIlxcXCIgZm91bmQgaW4gdGhlIHNhbWUgcmVuZGVyIHRyZWUgXCIgK1xuICAgICAgICAgIFwiLSB0aGlzIHdpbGwgbGlrZWx5IGNhdXNlIHJlbmRlciBlcnJvcnMuXCIsXG4gICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc2xvdE5vZGVzLl9yZW5kZXJlZCA9IHRydWU7XG4gICAgfVxuICAgIG5vZGVzID0gc2xvdE5vZGVzIHx8IGZhbGxiYWNrO1xuICB9XG5cbiAgdmFyIHRhcmdldCA9IHByb3BzICYmIHByb3BzLnNsb3Q7XG4gIGlmICh0YXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy4kY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnLCB7IHNsb3Q6IHRhcmdldCB9LCBub2RlcylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbm9kZXNcbiAgfVxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVzb2x2aW5nIGZpbHRlcnNcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUZpbHRlciAoaWQpIHtcbiAgcmV0dXJuIHJlc29sdmVBc3NldCh0aGlzLiRvcHRpb25zLCAnZmlsdGVycycsIGlkLCB0cnVlKSB8fCBpZGVudGl0eVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaXNLZXlOb3RNYXRjaCAoZXhwZWN0LCBhY3R1YWwpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhwZWN0KSkge1xuICAgIHJldHVybiBleHBlY3QuaW5kZXhPZihhY3R1YWwpID09PSAtMVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBleHBlY3QgIT09IGFjdHVhbFxuICB9XG59XG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIGNoZWNraW5nIGtleUNvZGVzIGZyb20gY29uZmlnLlxuICogZXhwb3NlZCBhcyBWdWUucHJvdG90eXBlLl9rXG4gKiBwYXNzaW5nIGluIGV2ZW50S2V5TmFtZSBhcyBsYXN0IGFyZ3VtZW50IHNlcGFyYXRlbHkgZm9yIGJhY2t3YXJkcyBjb21wYXRcbiAqL1xuZnVuY3Rpb24gY2hlY2tLZXlDb2RlcyAoXG4gIGV2ZW50S2V5Q29kZSxcbiAga2V5LFxuICBidWlsdEluS2V5Q29kZSxcbiAgZXZlbnRLZXlOYW1lLFxuICBidWlsdEluS2V5TmFtZVxuKSB7XG4gIHZhciBtYXBwZWRLZXlDb2RlID0gY29uZmlnLmtleUNvZGVzW2tleV0gfHwgYnVpbHRJbktleUNvZGU7XG4gIGlmIChidWlsdEluS2V5TmFtZSAmJiBldmVudEtleU5hbWUgJiYgIWNvbmZpZy5rZXlDb2Rlc1trZXldKSB7XG4gICAgcmV0dXJuIGlzS2V5Tm90TWF0Y2goYnVpbHRJbktleU5hbWUsIGV2ZW50S2V5TmFtZSlcbiAgfSBlbHNlIGlmIChtYXBwZWRLZXlDb2RlKSB7XG4gICAgcmV0dXJuIGlzS2V5Tm90TWF0Y2gobWFwcGVkS2V5Q29kZSwgZXZlbnRLZXlDb2RlKVxuICB9IGVsc2UgaWYgKGV2ZW50S2V5TmFtZSkge1xuICAgIHJldHVybiBoeXBoZW5hdGUoZXZlbnRLZXlOYW1lKSAhPT0ga2V5XG4gIH1cbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIG1lcmdpbmcgdi1iaW5kPVwib2JqZWN0XCIgaW50byBhIFZOb2RlJ3MgZGF0YS5cbiAqL1xuZnVuY3Rpb24gYmluZE9iamVjdFByb3BzIChcbiAgZGF0YSxcbiAgdGFnLFxuICB2YWx1ZSxcbiAgYXNQcm9wLFxuICBpc1N5bmNcbikge1xuICBpZiAodmFsdWUpIHtcbiAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAndi1iaW5kIHdpdGhvdXQgYXJndW1lbnQgZXhwZWN0cyBhbiBPYmplY3Qgb3IgQXJyYXkgdmFsdWUnLFxuICAgICAgICB0aGlzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB0b09iamVjdCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICB2YXIgaGFzaDtcbiAgICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXkgPT09ICdjbGFzcycgfHxcbiAgICAgICAgICBrZXkgPT09ICdzdHlsZScgfHxcbiAgICAgICAgICBpc1Jlc2VydmVkQXR0cmlidXRlKGtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaGFzaCA9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHR5cGUgPSBkYXRhLmF0dHJzICYmIGRhdGEuYXR0cnMudHlwZTtcbiAgICAgICAgICBoYXNoID0gYXNQcm9wIHx8IGNvbmZpZy5tdXN0VXNlUHJvcCh0YWcsIHR5cGUsIGtleSlcbiAgICAgICAgICAgID8gZGF0YS5kb21Qcm9wcyB8fCAoZGF0YS5kb21Qcm9wcyA9IHt9KVxuICAgICAgICAgICAgOiBkYXRhLmF0dHJzIHx8IChkYXRhLmF0dHJzID0ge30pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGtleSBpbiBoYXNoKSkge1xuICAgICAgICAgIGhhc2hba2V5XSA9IHZhbHVlW2tleV07XG5cbiAgICAgICAgICBpZiAoaXNTeW5jKSB7XG4gICAgICAgICAgICB2YXIgb24gPSBkYXRhLm9uIHx8IChkYXRhLm9uID0ge30pO1xuICAgICAgICAgICAgb25bKFwidXBkYXRlOlwiICsga2V5KV0gPSBmdW5jdGlvbiAoJGV2ZW50KSB7XG4gICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclN0YXRpYyAoXG4gIGluZGV4LFxuICBpc0luRm9yXG4pIHtcbiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTtcbiAgdmFyIHRyZWUgPSBjYWNoZWRbaW5kZXhdO1xuICAvLyBpZiBoYXMgYWxyZWFkeS1yZW5kZXJlZCBzdGF0aWMgdHJlZSBhbmQgbm90IGluc2lkZSB2LWZvcixcbiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUuXG4gIGlmICh0cmVlICYmICFpc0luRm9yKSB7XG4gICAgcmV0dXJuIHRyZWVcbiAgfVxuICAvLyBvdGhlcndpc2UsIHJlbmRlciBhIGZyZXNoIHRyZWUuXG4gIHRyZWUgPSBjYWNoZWRbaW5kZXhdID0gdGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbaW5kZXhdLmNhbGwoXG4gICAgdGhpcy5fcmVuZGVyUHJveHksXG4gICAgbnVsbCxcbiAgICB0aGlzIC8vIGZvciByZW5kZXIgZm5zIGdlbmVyYXRlZCBmb3IgZnVuY3Rpb25hbCBjb21wb25lbnQgdGVtcGxhdGVzXG4gICk7XG4gIG1hcmtTdGF0aWModHJlZSwgKFwiX19zdGF0aWNfX1wiICsgaW5kZXgpLCBmYWxzZSk7XG4gIHJldHVybiB0cmVlXG59XG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHYtb25jZS5cbiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LlxuICovXG5mdW5jdGlvbiBtYXJrT25jZSAoXG4gIHRyZWUsXG4gIGluZGV4LFxuICBrZXlcbikge1xuICBtYXJrU3RhdGljKHRyZWUsIChcIl9fb25jZV9fXCIgKyBpbmRleCArIChrZXkgPyAoXCJfXCIgKyBrZXkpIDogXCJcIikpLCB0cnVlKTtcbiAgcmV0dXJuIHRyZWVcbn1cblxuZnVuY3Rpb24gbWFya1N0YXRpYyAoXG4gIHRyZWUsXG4gIGtleSxcbiAgaXNPbmNlXG4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHJlZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykge1xuICAgICAgICBtYXJrU3RhdGljTm9kZSh0cmVlW2ldLCAoa2V5ICsgXCJfXCIgKyBpKSwgaXNPbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWFya1N0YXRpY05vZGUodHJlZSwga2V5LCBpc09uY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtTdGF0aWNOb2RlIChub2RlLCBrZXksIGlzT25jZSkge1xuICBub2RlLmlzU3RhdGljID0gdHJ1ZTtcbiAgbm9kZS5rZXkgPSBrZXk7XG4gIG5vZGUuaXNPbmNlID0gaXNPbmNlO1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gYmluZE9iamVjdExpc3RlbmVycyAoZGF0YSwgdmFsdWUpIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9uID0gZGF0YS5vbiA9IGRhdGEub24gPyBleHRlbmQoe30sIGRhdGEub24pIDoge307XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTtcbiAgICAgICAgdmFyIG91cnMgPSB2YWx1ZVtrZXldO1xuICAgICAgICBvbltrZXldID0gZXhpc3RpbmcgPyBbXS5jb25jYXQoZXhpc3RpbmcsIG91cnMpIDogb3VycztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluc3RhbGxSZW5kZXJIZWxwZXJzICh0YXJnZXQpIHtcbiAgdGFyZ2V0Ll9vID0gbWFya09uY2U7XG4gIHRhcmdldC5fbiA9IHRvTnVtYmVyO1xuICB0YXJnZXQuX3MgPSB0b1N0cmluZztcbiAgdGFyZ2V0Ll9sID0gcmVuZGVyTGlzdDtcbiAgdGFyZ2V0Ll90ID0gcmVuZGVyU2xvdDtcbiAgdGFyZ2V0Ll9xID0gbG9vc2VFcXVhbDtcbiAgdGFyZ2V0Ll9pID0gbG9vc2VJbmRleE9mO1xuICB0YXJnZXQuX20gPSByZW5kZXJTdGF0aWM7XG4gIHRhcmdldC5fZiA9IHJlc29sdmVGaWx0ZXI7XG4gIHRhcmdldC5fayA9IGNoZWNrS2V5Q29kZXM7XG4gIHRhcmdldC5fYiA9IGJpbmRPYmplY3RQcm9wcztcbiAgdGFyZ2V0Ll92ID0gY3JlYXRlVGV4dFZOb2RlO1xuICB0YXJnZXQuX2UgPSBjcmVhdGVFbXB0eVZOb2RlO1xuICB0YXJnZXQuX3UgPSByZXNvbHZlU2NvcGVkU2xvdHM7XG4gIHRhcmdldC5fZyA9IGJpbmRPYmplY3RMaXN0ZW5lcnM7XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCAoXG4gIGRhdGEsXG4gIHByb3BzLFxuICBjaGlsZHJlbixcbiAgcGFyZW50LFxuICBDdG9yXG4pIHtcbiAgdmFyIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnM7XG4gIC8vIGVuc3VyZSB0aGUgY3JlYXRlRWxlbWVudCBmdW5jdGlvbiBpbiBmdW5jdGlvbmFsIGNvbXBvbmVudHNcbiAgLy8gZ2V0cyBhIHVuaXF1ZSBjb250ZXh0IC0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIGNvcnJlY3QgbmFtZWQgc2xvdCBjaGVja1xuICB2YXIgY29udGV4dFZtO1xuICBpZiAoaGFzT3duKHBhcmVudCwgJ191aWQnKSkge1xuICAgIGNvbnRleHRWbSA9IE9iamVjdC5jcmVhdGUocGFyZW50KTtcbiAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgICBjb250ZXh0Vm0uX29yaWdpbmFsID0gcGFyZW50O1xuICB9IGVsc2Uge1xuICAgIC8vIHRoZSBjb250ZXh0IHZtIHBhc3NlZCBpbiBpcyBhIGZ1bmN0aW9uYWwgY29udGV4dCBhcyB3ZWxsLlxuICAgIC8vIGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBhcmUgYWJsZSB0byBnZXQgYSBob2xkIHRvIHRoZVxuICAgIC8vIHJlYWwgY29udGV4dCBpbnN0YW5jZS5cbiAgICBjb250ZXh0Vm0gPSBwYXJlbnQ7XG4gICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgcGFyZW50ID0gcGFyZW50Ll9vcmlnaW5hbDtcbiAgfVxuICB2YXIgaXNDb21waWxlZCA9IGlzVHJ1ZShvcHRpb25zLl9jb21waWxlZCk7XG4gIHZhciBuZWVkTm9ybWFsaXphdGlvbiA9ICFpc0NvbXBpbGVkO1xuXG4gIHRoaXMuZGF0YSA9IGRhdGE7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5saXN0ZW5lcnMgPSBkYXRhLm9uIHx8IGVtcHR5T2JqZWN0O1xuICB0aGlzLmluamVjdGlvbnMgPSByZXNvbHZlSW5qZWN0KG9wdGlvbnMuaW5qZWN0LCBwYXJlbnQpO1xuICB0aGlzLnNsb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBwYXJlbnQpOyB9O1xuXG4gIC8vIHN1cHBvcnQgZm9yIGNvbXBpbGVkIGZ1bmN0aW9uYWwgdGVtcGxhdGVcbiAgaWYgKGlzQ29tcGlsZWQpIHtcbiAgICAvLyBleHBvc2luZyAkb3B0aW9ucyBmb3IgcmVuZGVyU3RhdGljKClcbiAgICB0aGlzLiRvcHRpb25zID0gb3B0aW9ucztcbiAgICAvLyBwcmUtcmVzb2x2ZSBzbG90cyBmb3IgcmVuZGVyU2xvdCgpXG4gICAgdGhpcy4kc2xvdHMgPSB0aGlzLnNsb3RzKCk7XG4gICAgdGhpcy4kc2NvcGVkU2xvdHMgPSBkYXRhLnNjb3BlZFNsb3RzIHx8IGVtcHR5T2JqZWN0O1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuX3Njb3BlSWQpIHtcbiAgICB0aGlzLl9jID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHtcbiAgICAgIHZhciB2bm9kZSA9IGNyZWF0ZUVsZW1lbnQoY29udGV4dFZtLCBhLCBiLCBjLCBkLCBuZWVkTm9ybWFsaXphdGlvbik7XG4gICAgICBpZiAodm5vZGUgJiYgIUFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgICAgIHZub2RlLmZuU2NvcGVJZCA9IG9wdGlvbnMuX3Njb3BlSWQ7XG4gICAgICAgIHZub2RlLmZuQ29udGV4dCA9IHBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2bm9kZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KGNvbnRleHRWbSwgYSwgYiwgYywgZCwgbmVlZE5vcm1hbGl6YXRpb24pOyB9O1xuICB9XG59XG5cbmluc3RhbGxSZW5kZXJIZWxwZXJzKEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0LnByb3RvdHlwZSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKFxuICBDdG9yLFxuICBwcm9wc0RhdGEsXG4gIGRhdGEsXG4gIGNvbnRleHRWbSxcbiAgY2hpbGRyZW5cbikge1xuICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9ucztcbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBwcm9wT3B0aW9ucyA9IG9wdGlvbnMucHJvcHM7XG4gIGlmIChpc0RlZihwcm9wT3B0aW9ucykpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcE9wdGlvbnMpIHtcbiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhIHx8IGVtcHR5T2JqZWN0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzRGVmKGRhdGEuYXR0cnMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEuYXR0cnMpOyB9XG4gICAgaWYgKGlzRGVmKGRhdGEucHJvcHMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEucHJvcHMpOyB9XG4gIH1cblxuICB2YXIgcmVuZGVyQ29udGV4dCA9IG5ldyBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dChcbiAgICBkYXRhLFxuICAgIHByb3BzLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbnRleHRWbSxcbiAgICBDdG9yXG4gICk7XG5cbiAgdmFyIHZub2RlID0gb3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCByZW5kZXJDb250ZXh0Ll9jLCByZW5kZXJDb250ZXh0KTtcblxuICBpZiAodm5vZGUgaW5zdGFuY2VvZiBWTm9kZSkge1xuICAgIHJldHVybiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0KHZub2RlLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucylcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZub2RlKSkge1xuICAgIHZhciB2bm9kZXMgPSBub3JtYWxpemVDaGlsZHJlbih2bm9kZSkgfHwgW107XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheSh2bm9kZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzW2ldID0gY2xvbmVBbmRNYXJrRnVuY3Rpb25hbFJlc3VsdCh2bm9kZXNbaV0sIGRhdGEsIHJlbmRlckNvbnRleHQucGFyZW50LCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb25lQW5kTWFya0Z1bmN0aW9uYWxSZXN1bHQgKHZub2RlLCBkYXRhLCBjb250ZXh0Vm0sIG9wdGlvbnMpIHtcbiAgLy8gIzc4MTcgY2xvbmUgbm9kZSBiZWZvcmUgc2V0dGluZyBmbkNvbnRleHQsIG90aGVyd2lzZSBpZiB0aGUgbm9kZSBpcyByZXVzZWRcbiAgLy8gKGUuZy4gaXQgd2FzIGZyb20gYSBjYWNoZWQgbm9ybWFsIHNsb3QpIHRoZSBmbkNvbnRleHQgY2F1c2VzIG5hbWVkIHNsb3RzXG4gIC8vIHRoYXQgc2hvdWxkIG5vdCBiZSBtYXRjaGVkIHRvIG1hdGNoLlxuICB2YXIgY2xvbmUgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgY2xvbmUuZm5Db250ZXh0ID0gY29udGV4dFZtO1xuICBjbG9uZS5mbk9wdGlvbnMgPSBvcHRpb25zO1xuICBpZiAoZGF0YS5zbG90KSB7XG4gICAgKGNsb25lLmRhdGEgfHwgKGNsb25lLmRhdGEgPSB7fSkpLnNsb3QgPSBkYXRhLnNsb3Q7XG4gIH1cbiAgcmV0dXJuIGNsb25lXG59XG5cbmZ1bmN0aW9uIG1lcmdlUHJvcHMgKHRvLCBmcm9tKSB7XG4gIGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG4gICAgdG9bY2FtZWxpemUoa2V5KV0gPSBmcm9tW2tleV07XG4gIH1cbn1cblxuLyogICovXG5cblxuXG5cbi8vIFJlZ2lzdGVyIHRoZSBjb21wb25lbnQgaG9vayB0byB3ZWV4IG5hdGl2ZSByZW5kZXIgZW5naW5lLlxuLy8gVGhlIGhvb2sgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgbmF0aXZlLCBub3QgamF2YXNjcmlwdC5cblxuXG4vLyBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IHRvIHdlZXggbmF0aXZlIHJlbmRlciBlbmdpbmUuXG5cbi8qICAqL1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vSGFua3MxMDEwMC93ZWV4LW5hdGl2ZS1kaXJlY3RpdmUvdHJlZS9tYXN0ZXIvY29tcG9uZW50XG5cbi8vIGxpc3RlbmluZyBvbiBuYXRpdmUgY2FsbGJhY2tcblxuLyogICovXG5cbi8qICAqL1xuXG4vLyBpbmxpbmUgaG9va3MgdG8gYmUgaW52b2tlZCBvbiBjb21wb25lbnQgVk5vZGVzIGR1cmluZyBwYXRjaFxudmFyIGNvbXBvbmVudFZOb2RlSG9va3MgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uIGluaXQgKFxuICAgIHZub2RlLFxuICAgIGh5ZHJhdGluZyxcbiAgICBwYXJlbnRFbG0sXG4gICAgcmVmRWxtXG4gICkge1xuICAgIGlmIChcbiAgICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmXG4gICAgICAhdm5vZGUuY29tcG9uZW50SW5zdGFuY2UuX2lzRGVzdHJveWVkICYmXG4gICAgICB2bm9kZS5kYXRhLmtlZXBBbGl2ZVxuICAgICkge1xuICAgICAgLy8ga2VwdC1hbGl2ZSBjb21wb25lbnRzLCB0cmVhdCBhcyBhIHBhdGNoXG4gICAgICB2YXIgbW91bnRlZE5vZGUgPSB2bm9kZTsgLy8gd29yayBhcm91bmQgZmxvd1xuICAgICAgY29tcG9uZW50Vk5vZGVIb29rcy5wcmVwYXRjaChtb3VudGVkTm9kZSwgbW91bnRlZE5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY2hpbGQgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlRm9yVm5vZGUoXG4gICAgICAgIHZub2RlLFxuICAgICAgICBhY3RpdmVJbnN0YW5jZSxcbiAgICAgICAgcGFyZW50RWxtLFxuICAgICAgICByZWZFbG1cbiAgICAgICk7XG4gICAgICBjaGlsZC4kbW91bnQoaHlkcmF0aW5nID8gdm5vZGUuZWxtIDogdW5kZWZpbmVkLCBoeWRyYXRpbmcpO1xuICAgIH1cbiAgfSxcblxuICBwcmVwYXRjaDogZnVuY3Rpb24gcHJlcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSkge1xuICAgIHZhciBvcHRpb25zID0gdm5vZGUuY29tcG9uZW50T3B0aW9ucztcbiAgICB2YXIgY2hpbGQgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlO1xuICAgIHVwZGF0ZUNoaWxkQ29tcG9uZW50KFxuICAgICAgY2hpbGQsXG4gICAgICBvcHRpb25zLnByb3BzRGF0YSwgLy8gdXBkYXRlZCBwcm9wc1xuICAgICAgb3B0aW9ucy5saXN0ZW5lcnMsIC8vIHVwZGF0ZWQgbGlzdGVuZXJzXG4gICAgICB2bm9kZSwgLy8gbmV3IHBhcmVudCB2bm9kZVxuICAgICAgb3B0aW9ucy5jaGlsZHJlbiAvLyBuZXcgY2hpbGRyZW5cbiAgICApO1xuICB9LFxuXG4gIGluc2VydDogZnVuY3Rpb24gaW5zZXJ0ICh2bm9kZSkge1xuICAgIHZhciBjb250ZXh0ID0gdm5vZGUuY29udGV4dDtcbiAgICB2YXIgY29tcG9uZW50SW5zdGFuY2UgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQpIHtcbiAgICAgIGNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQgPSB0cnVlO1xuICAgICAgY2FsbEhvb2soY29tcG9uZW50SW5zdGFuY2UsICdtb3VudGVkJyk7XG4gICAgfVxuICAgIGlmICh2bm9kZS5kYXRhLmtlZXBBbGl2ZSkge1xuICAgICAgaWYgKGNvbnRleHQuX2lzTW91bnRlZCkge1xuICAgICAgICAvLyB2dWUtcm91dGVyIzEyMTJcbiAgICAgICAgLy8gRHVyaW5nIHVwZGF0ZXMsIGEga2VwdC1hbGl2ZSBjb21wb25lbnQncyBjaGlsZCBjb21wb25lbnRzIG1heVxuICAgICAgICAvLyBjaGFuZ2UsIHNvIGRpcmVjdGx5IHdhbGtpbmcgdGhlIHRyZWUgaGVyZSBtYXkgY2FsbCBhY3RpdmF0ZWQgaG9va3NcbiAgICAgICAgLy8gb24gaW5jb3JyZWN0IGNoaWxkcmVuLiBJbnN0ZWFkIHdlIHB1c2ggdGhlbSBpbnRvIGEgcXVldWUgd2hpY2ggd2lsbFxuICAgICAgICAvLyBiZSBwcm9jZXNzZWQgYWZ0ZXIgdGhlIHdob2xlIHBhdGNoIHByb2Nlc3MgZW5kZWQuXG4gICAgICAgIHF1ZXVlQWN0aXZhdGVkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQoY29tcG9uZW50SW5zdGFuY2UsIHRydWUgLyogZGlyZWN0ICovKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHtcbiAgICB2YXIgY29tcG9uZW50SW5zdGFuY2UgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc0Rlc3Ryb3llZCkge1xuICAgICAgaWYgKCF2bm9kZS5kYXRhLmtlZXBBbGl2ZSkge1xuICAgICAgICBjb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgaG9va3NUb01lcmdlID0gT2JqZWN0LmtleXMoY29tcG9uZW50Vk5vZGVIb29rcyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudCAoXG4gIEN0b3IsXG4gIGRhdGEsXG4gIGNvbnRleHQsXG4gIGNoaWxkcmVuLFxuICB0YWdcbikge1xuICBpZiAoaXNVbmRlZihDdG9yKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGJhc2VDdG9yID0gY29udGV4dC4kb3B0aW9ucy5fYmFzZTtcblxuICAvLyBwbGFpbiBvcHRpb25zIG9iamVjdDogdHVybiBpdCBpbnRvIGEgY29uc3RydWN0b3JcbiAgaWYgKGlzT2JqZWN0KEN0b3IpKSB7XG4gICAgQ3RvciA9IGJhc2VDdG9yLmV4dGVuZChDdG9yKTtcbiAgfVxuXG4gIC8vIGlmIGF0IHRoaXMgc3RhZ2UgaXQncyBub3QgYSBjb25zdHJ1Y3RvciBvciBhbiBhc3luYyBjb21wb25lbnQgZmFjdG9yeSxcbiAgLy8gcmVqZWN0LlxuICBpZiAodHlwZW9mIEN0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgd2FybigoXCJJbnZhbGlkIENvbXBvbmVudCBkZWZpbml0aW9uOiBcIiArIChTdHJpbmcoQ3RvcikpKSwgY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gYXN5bmMgY29tcG9uZW50XG4gIHZhciBhc3luY0ZhY3Rvcnk7XG4gIGlmIChpc1VuZGVmKEN0b3IuY2lkKSkge1xuICAgIGFzeW5jRmFjdG9yeSA9IEN0b3I7XG4gICAgQ3RvciA9IHJlc29sdmVBc3luY0NvbXBvbmVudChhc3luY0ZhY3RvcnksIGJhc2VDdG9yLCBjb250ZXh0KTtcbiAgICBpZiAoQ3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciBub2RlIGZvciBhc3luYyBjb21wb25lbnQsIHdoaWNoIGlzIHJlbmRlcmVkXG4gICAgICAvLyBhcyBhIGNvbW1lbnQgbm9kZSBidXQgcHJlc2VydmVzIGFsbCB0aGUgcmF3IGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZS5cbiAgICAgIC8vIHRoZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgZm9yIGFzeW5jIHNlcnZlci1yZW5kZXJpbmcgYW5kIGh5ZHJhdGlvbi5cbiAgICAgIHJldHVybiBjcmVhdGVBc3luY1BsYWNlaG9sZGVyKFxuICAgICAgICBhc3luY0ZhY3RvcnksXG4gICAgICAgIGRhdGEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB0YWdcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBkYXRhID0gZGF0YSB8fCB7fTtcblxuICAvLyByZXNvbHZlIGNvbnN0cnVjdG9yIG9wdGlvbnMgaW4gY2FzZSBnbG9iYWwgbWl4aW5zIGFyZSBhcHBsaWVkIGFmdGVyXG4gIC8vIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjcmVhdGlvblxuICByZXNvbHZlQ29uc3RydWN0b3JPcHRpb25zKEN0b3IpO1xuXG4gIC8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBkYXRhIGludG8gcHJvcHMgJiBldmVudHNcbiAgaWYgKGlzRGVmKGRhdGEubW9kZWwpKSB7XG4gICAgdHJhbnNmb3JtTW9kZWwoQ3Rvci5vcHRpb25zLCBkYXRhKTtcbiAgfVxuXG4gIC8vIGV4dHJhY3QgcHJvcHNcbiAgdmFyIHByb3BzRGF0YSA9IGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgdGFnKTtcblxuICAvLyBmdW5jdGlvbmFsIGNvbXBvbmVudFxuICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5mdW5jdGlvbmFsKSkge1xuICAgIHJldHVybiBjcmVhdGVGdW5jdGlvbmFsQ29tcG9uZW50KEN0b3IsIHByb3BzRGF0YSwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4pXG4gIH1cblxuICAvLyBleHRyYWN0IGxpc3RlbmVycywgc2luY2UgdGhlc2UgbmVlZHMgdG8gYmUgdHJlYXRlZCBhc1xuICAvLyBjaGlsZCBjb21wb25lbnQgbGlzdGVuZXJzIGluc3RlYWQgb2YgRE9NIGxpc3RlbmVyc1xuICB2YXIgbGlzdGVuZXJzID0gZGF0YS5vbjtcbiAgLy8gcmVwbGFjZSB3aXRoIGxpc3RlbmVycyB3aXRoIC5uYXRpdmUgbW9kaWZpZXJcbiAgLy8gc28gaXQgZ2V0cyBwcm9jZXNzZWQgZHVyaW5nIHBhcmVudCBjb21wb25lbnQgcGF0Y2guXG4gIGRhdGEub24gPSBkYXRhLm5hdGl2ZU9uO1xuXG4gIGlmIChpc1RydWUoQ3Rvci5vcHRpb25zLmFic3RyYWN0KSkge1xuICAgIC8vIGFic3RyYWN0IGNvbXBvbmVudHMgZG8gbm90IGtlZXAgYW55dGhpbmdcbiAgICAvLyBvdGhlciB0aGFuIHByb3BzICYgbGlzdGVuZXJzICYgc2xvdFxuXG4gICAgLy8gd29yayBhcm91bmQgZmxvd1xuICAgIHZhciBzbG90ID0gZGF0YS5zbG90O1xuICAgIGRhdGEgPSB7fTtcbiAgICBpZiAoc2xvdCkge1xuICAgICAgZGF0YS5zbG90ID0gc2xvdDtcbiAgICB9XG4gIH1cblxuICAvLyBpbnN0YWxsIGNvbXBvbmVudCBtYW5hZ2VtZW50IGhvb2tzIG9udG8gdGhlIHBsYWNlaG9sZGVyIG5vZGVcbiAgaW5zdGFsbENvbXBvbmVudEhvb2tzKGRhdGEpO1xuXG4gIC8vIHJldHVybiBhIHBsYWNlaG9sZGVyIHZub2RlXG4gIHZhciBuYW1lID0gQ3Rvci5vcHRpb25zLm5hbWUgfHwgdGFnO1xuICB2YXIgdm5vZGUgPSBuZXcgVk5vZGUoXG4gICAgKFwidnVlLWNvbXBvbmVudC1cIiArIChDdG9yLmNpZCkgKyAobmFtZSA/IChcIi1cIiArIG5hbWUpIDogJycpKSxcbiAgICBkYXRhLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb250ZXh0LFxuICAgIHsgQ3RvcjogQ3RvciwgcHJvcHNEYXRhOiBwcm9wc0RhdGEsIGxpc3RlbmVyczogbGlzdGVuZXJzLCB0YWc6IHRhZywgY2hpbGRyZW46IGNoaWxkcmVuIH0sXG4gICAgYXN5bmNGYWN0b3J5XG4gICk7XG5cbiAgLy8gV2VleCBzcGVjaWZpYzogaW52b2tlIHJlY3ljbGUtbGlzdCBvcHRpbWl6ZWQgQHJlbmRlciBmdW5jdGlvbiBmb3JcbiAgLy8gZXh0cmFjdGluZyBjZWxsLXNsb3QgdGVtcGxhdGUuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9IYW5rczEwMTAwL3dlZXgtbmF0aXZlLWRpcmVjdGl2ZS90cmVlL21hc3Rlci9jb21wb25lbnRcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIHJldHVybiB2bm9kZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlIChcbiAgdm5vZGUsIC8vIHdlIGtub3cgaXQncyBNb3VudGVkQ29tcG9uZW50Vk5vZGUgYnV0IGZsb3cgZG9lc24ndFxuICBwYXJlbnQsIC8vIGFjdGl2ZUluc3RhbmNlIGluIGxpZmVjeWNsZSBzdGF0ZVxuICBwYXJlbnRFbG0sXG4gIHJlZkVsbVxuKSB7XG4gIHZhciBvcHRpb25zID0ge1xuICAgIF9pc0NvbXBvbmVudDogdHJ1ZSxcbiAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICBfcGFyZW50Vm5vZGU6IHZub2RlLFxuICAgIF9wYXJlbnRFbG06IHBhcmVudEVsbSB8fCBudWxsLFxuICAgIF9yZWZFbG06IHJlZkVsbSB8fCBudWxsXG4gIH07XG4gIC8vIGNoZWNrIGlubGluZS10ZW1wbGF0ZSByZW5kZXIgZnVuY3Rpb25zXG4gIHZhciBpbmxpbmVUZW1wbGF0ZSA9IHZub2RlLmRhdGEuaW5saW5lVGVtcGxhdGU7XG4gIGlmIChpc0RlZihpbmxpbmVUZW1wbGF0ZSkpIHtcbiAgICBvcHRpb25zLnJlbmRlciA9IGlubGluZVRlbXBsYXRlLnJlbmRlcjtcbiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IGlubGluZVRlbXBsYXRlLnN0YXRpY1JlbmRlckZucztcbiAgfVxuICByZXR1cm4gbmV3IHZub2RlLmNvbXBvbmVudE9wdGlvbnMuQ3RvcihvcHRpb25zKVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsQ29tcG9uZW50SG9va3MgKGRhdGEpIHtcbiAgdmFyIGhvb2tzID0gZGF0YS5ob29rIHx8IChkYXRhLmhvb2sgPSB7fSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaG9va3NUb01lcmdlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGhvb2tzVG9NZXJnZVtpXTtcbiAgICBob29rc1trZXldID0gY29tcG9uZW50Vk5vZGVIb29rc1trZXldO1xuICB9XG59XG5cbi8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBpbmZvICh2YWx1ZSBhbmQgY2FsbGJhY2spIGludG9cbi8vIHByb3AgYW5kIGV2ZW50IGhhbmRsZXIgcmVzcGVjdGl2ZWx5LlxuZnVuY3Rpb24gdHJhbnNmb3JtTW9kZWwgKG9wdGlvbnMsIGRhdGEpIHtcbiAgdmFyIHByb3AgPSAob3B0aW9ucy5tb2RlbCAmJiBvcHRpb25zLm1vZGVsLnByb3ApIHx8ICd2YWx1ZSc7XG4gIHZhciBldmVudCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwuZXZlbnQpIHx8ICdpbnB1dCc7KGRhdGEucHJvcHMgfHwgKGRhdGEucHJvcHMgPSB7fSkpW3Byb3BdID0gZGF0YS5tb2RlbC52YWx1ZTtcbiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTtcbiAgaWYgKGlzRGVmKG9uW2V2ZW50XSkpIHtcbiAgICBvbltldmVudF0gPSBbZGF0YS5tb2RlbC5jYWxsYmFja10uY29uY2F0KG9uW2V2ZW50XSk7XG4gIH0gZWxzZSB7XG4gICAgb25bZXZlbnRdID0gZGF0YS5tb2RlbC5jYWxsYmFjaztcbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIFNJTVBMRV9OT1JNQUxJWkUgPSAxO1xudmFyIEFMV0FZU19OT1JNQUxJWkUgPSAyO1xuXG4vLyB3cmFwcGVyIGZ1bmN0aW9uIGZvciBwcm92aWRpbmcgYSBtb3JlIGZsZXhpYmxlIGludGVyZmFjZVxuLy8gd2l0aG91dCBnZXR0aW5nIHllbGxlZCBhdCBieSBmbG93XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50IChcbiAgY29udGV4dCxcbiAgdGFnLFxuICBkYXRhLFxuICBjaGlsZHJlbixcbiAgbm9ybWFsaXphdGlvblR5cGUsXG4gIGFsd2F5c05vcm1hbGl6ZVxuKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpIHx8IGlzUHJpbWl0aXZlKGRhdGEpKSB7XG4gICAgbm9ybWFsaXphdGlvblR5cGUgPSBjaGlsZHJlbjtcbiAgICBjaGlsZHJlbiA9IGRhdGE7XG4gICAgZGF0YSA9IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoaXNUcnVlKGFsd2F5c05vcm1hbGl6ZSkpIHtcbiAgICBub3JtYWxpemF0aW9uVHlwZSA9IEFMV0FZU19OT1JNQUxJWkU7XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVFbGVtZW50KGNvbnRleHQsIHRhZywgZGF0YSwgY2hpbGRyZW4sIG5vcm1hbGl6YXRpb25UeXBlKVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlRWxlbWVudCAoXG4gIGNvbnRleHQsXG4gIHRhZyxcbiAgZGF0YSxcbiAgY2hpbGRyZW4sXG4gIG5vcm1hbGl6YXRpb25UeXBlXG4pIHtcbiAgaWYgKGlzRGVmKGRhdGEpICYmIGlzRGVmKChkYXRhKS5fX29iX18pKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgXCJBdm9pZCB1c2luZyBvYnNlcnZlZCBkYXRhIG9iamVjdCBhcyB2bm9kZSBkYXRhOiBcIiArIChKU09OLnN0cmluZ2lmeShkYXRhKSkgKyBcIlxcblwiICtcbiAgICAgICdBbHdheXMgY3JlYXRlIGZyZXNoIHZub2RlIGRhdGEgb2JqZWN0cyBpbiBlYWNoIHJlbmRlciEnLFxuICAgICAgY29udGV4dFxuICAgICk7XG4gICAgcmV0dXJuIGNyZWF0ZUVtcHR5Vk5vZGUoKVxuICB9XG4gIC8vIG9iamVjdCBzeW50YXggaW4gdi1iaW5kXG4gIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZihkYXRhLmlzKSkge1xuICAgIHRhZyA9IGRhdGEuaXM7XG4gIH1cbiAgaWYgKCF0YWcpIHtcbiAgICAvLyBpbiBjYXNlIG9mIGNvbXBvbmVudCA6aXMgc2V0IHRvIGZhbHN5IHZhbHVlXG4gICAgcmV0dXJuIGNyZWF0ZUVtcHR5Vk5vZGUoKVxuICB9XG4gIC8vIHdhcm4gYWdhaW5zdCBub24tcHJpbWl0aXZlIGtleVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgIGlzRGVmKGRhdGEpICYmIGlzRGVmKGRhdGEua2V5KSAmJiAhaXNQcmltaXRpdmUoZGF0YS5rZXkpXG4gICkge1xuICAgIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICdBdm9pZCB1c2luZyBub24tcHJpbWl0aXZlIHZhbHVlIGFzIGtleSwgJyArXG4gICAgICAgICd1c2Ugc3RyaW5nL251bWJlciB2YWx1ZSBpbnN0ZWFkLicsXG4gICAgICAgIGNvbnRleHRcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8vIHN1cHBvcnQgc2luZ2xlIGZ1bmN0aW9uIGNoaWxkcmVuIGFzIGRlZmF1bHQgc2NvcGVkIHNsb3RcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pICYmXG4gICAgdHlwZW9mIGNoaWxkcmVuWzBdID09PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIGRhdGEgPSBkYXRhIHx8IHt9O1xuICAgIGRhdGEuc2NvcGVkU2xvdHMgPSB7IGRlZmF1bHQ6IGNoaWxkcmVuWzBdIH07XG4gICAgY2hpbGRyZW4ubGVuZ3RoID0gMDtcbiAgfVxuICBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IEFMV0FZU19OT1JNQUxJWkUpIHtcbiAgICBjaGlsZHJlbiA9IG5vcm1hbGl6ZUNoaWxkcmVuKGNoaWxkcmVuKTtcbiAgfSBlbHNlIGlmIChub3JtYWxpemF0aW9uVHlwZSA9PT0gU0lNUExFX05PUk1BTElaRSkge1xuICAgIGNoaWxkcmVuID0gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pO1xuICB9XG4gIHZhciB2bm9kZSwgbnM7XG4gIGlmICh0eXBlb2YgdGFnID09PSAnc3RyaW5nJykge1xuICAgIHZhciBDdG9yO1xuICAgIG5zID0gKGNvbnRleHQuJHZub2RlICYmIGNvbnRleHQuJHZub2RlLm5zKSB8fCBjb25maWcuZ2V0VGFnTmFtZXNwYWNlKHRhZyk7XG4gICAgaWYgKGNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHtcbiAgICAgIC8vIHBsYXRmb3JtIGJ1aWx0LWluIGVsZW1lbnRzXG4gICAgICB2bm9kZSA9IG5ldyBWTm9kZShcbiAgICAgICAgY29uZmlnLnBhcnNlUGxhdGZvcm1UYWdOYW1lKHRhZyksIGRhdGEsIGNoaWxkcmVuLFxuICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzRGVmKEN0b3IgPSByZXNvbHZlQXNzZXQoY29udGV4dC4kb3B0aW9ucywgJ2NvbXBvbmVudHMnLCB0YWcpKSkge1xuICAgICAgLy8gY29tcG9uZW50XG4gICAgICB2bm9kZSA9IGNyZWF0ZUNvbXBvbmVudChDdG9yLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbiwgdGFnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdW5rbm93biBvciB1bmxpc3RlZCBuYW1lc3BhY2VkIGVsZW1lbnRzXG4gICAgICAvLyBjaGVjayBhdCBydW50aW1lIGJlY2F1c2UgaXQgbWF5IGdldCBhc3NpZ25lZCBhIG5hbWVzcGFjZSB3aGVuIGl0c1xuICAgICAgLy8gcGFyZW50IG5vcm1hbGl6ZXMgY2hpbGRyZW5cbiAgICAgIHZub2RlID0gbmV3IFZOb2RlKFxuICAgICAgICB0YWcsIGRhdGEsIGNoaWxkcmVuLFxuICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dFxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gZGlyZWN0IGNvbXBvbmVudCBvcHRpb25zIC8gY29uc3RydWN0b3JcbiAgICB2bm9kZSA9IGNyZWF0ZUNvbXBvbmVudCh0YWcsIGRhdGEsIGNvbnRleHQsIGNoaWxkcmVuKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh2bm9kZSkpIHtcbiAgICByZXR1cm4gdm5vZGVcbiAgfSBlbHNlIGlmIChpc0RlZih2bm9kZSkpIHtcbiAgICBpZiAoaXNEZWYobnMpKSB7IGFwcGx5TlModm5vZGUsIG5zKTsgfVxuICAgIGlmIChpc0RlZihkYXRhKSkgeyByZWdpc3RlckRlZXBCaW5kaW5ncyhkYXRhKTsgfVxuICAgIHJldHVybiB2bm9kZVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseU5TICh2bm9kZSwgbnMsIGZvcmNlKSB7XG4gIHZub2RlLm5zID0gbnM7XG4gIGlmICh2bm9kZS50YWcgPT09ICdmb3JlaWduT2JqZWN0Jykge1xuICAgIC8vIHVzZSBkZWZhdWx0IG5hbWVzcGFjZSBpbnNpZGUgZm9yZWlnbk9iamVjdFxuICAgIG5zID0gdW5kZWZpbmVkO1xuICAgIGZvcmNlID0gdHJ1ZTtcbiAgfVxuICBpZiAoaXNEZWYodm5vZGUuY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB2bm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKGlzRGVmKGNoaWxkLnRhZykgJiYgKFxuICAgICAgICBpc1VuZGVmKGNoaWxkLm5zKSB8fCAoaXNUcnVlKGZvcmNlKSAmJiBjaGlsZC50YWcgIT09ICdzdmcnKSkpIHtcbiAgICAgICAgYXBwbHlOUyhjaGlsZCwgbnMsIGZvcmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gcmVmICM1MzE4XG4vLyBuZWNlc3NhcnkgdG8gZW5zdXJlIHBhcmVudCByZS1yZW5kZXIgd2hlbiBkZWVwIGJpbmRpbmdzIGxpa2UgOnN0eWxlIGFuZFxuLy8gOmNsYXNzIGFyZSB1c2VkIG9uIHNsb3Qgbm9kZXNcbmZ1bmN0aW9uIHJlZ2lzdGVyRGVlcEJpbmRpbmdzIChkYXRhKSB7XG4gIGlmIChpc09iamVjdChkYXRhLnN0eWxlKSkge1xuICAgIHRyYXZlcnNlKGRhdGEuc3R5bGUpO1xuICB9XG4gIGlmIChpc09iamVjdChkYXRhLmNsYXNzKSkge1xuICAgIHRyYXZlcnNlKGRhdGEuY2xhc3MpO1xuICB9XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0UmVuZGVyICh2bSkge1xuICB2bS5fdm5vZGUgPSBudWxsOyAvLyB0aGUgcm9vdCBvZiB0aGUgY2hpbGQgdHJlZVxuICB2bS5fc3RhdGljVHJlZXMgPSBudWxsOyAvLyB2LW9uY2UgY2FjaGVkIHRyZWVzXG4gIHZhciBvcHRpb25zID0gdm0uJG9wdGlvbnM7XG4gIHZhciBwYXJlbnRWbm9kZSA9IHZtLiR2bm9kZSA9IG9wdGlvbnMuX3BhcmVudFZub2RlOyAvLyB0aGUgcGxhY2Vob2xkZXIgbm9kZSBpbiBwYXJlbnQgdHJlZVxuICB2YXIgcmVuZGVyQ29udGV4dCA9IHBhcmVudFZub2RlICYmIHBhcmVudFZub2RlLmNvbnRleHQ7XG4gIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyhvcHRpb25zLl9yZW5kZXJDaGlsZHJlbiwgcmVuZGVyQ29udGV4dCk7XG4gIHZtLiRzY29wZWRTbG90cyA9IGVtcHR5T2JqZWN0O1xuICAvLyBiaW5kIHRoZSBjcmVhdGVFbGVtZW50IGZuIHRvIHRoaXMgaW5zdGFuY2VcbiAgLy8gc28gdGhhdCB3ZSBnZXQgcHJvcGVyIHJlbmRlciBjb250ZXh0IGluc2lkZSBpdC5cbiAgLy8gYXJncyBvcmRlcjogdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUsIGFsd2F5c05vcm1hbGl6ZVxuICAvLyBpbnRlcm5hbCB2ZXJzaW9uIGlzIHVzZWQgYnkgcmVuZGVyIGZ1bmN0aW9ucyBjb21waWxlZCBmcm9tIHRlbXBsYXRlc1xuICB2bS5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KHZtLCBhLCBiLCBjLCBkLCBmYWxzZSk7IH07XG4gIC8vIG5vcm1hbGl6YXRpb24gaXMgYWx3YXlzIGFwcGxpZWQgZm9yIHRoZSBwdWJsaWMgdmVyc2lvbiwgdXNlZCBpblxuICAvLyB1c2VyLXdyaXR0ZW4gcmVuZGVyIGZ1bmN0aW9ucy5cbiAgdm0uJGNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgdHJ1ZSk7IH07XG5cbiAgLy8gJGF0dHJzICYgJGxpc3RlbmVycyBhcmUgZXhwb3NlZCBmb3IgZWFzaWVyIEhPQyBjcmVhdGlvbi5cbiAgLy8gdGhleSBuZWVkIHRvIGJlIHJlYWN0aXZlIHNvIHRoYXQgSE9DcyB1c2luZyB0aGVtIGFyZSBhbHdheXMgdXBkYXRlZFxuICB2YXIgcGFyZW50RGF0YSA9IHBhcmVudFZub2RlICYmIHBhcmVudFZub2RlLmRhdGE7XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBkZWZpbmVSZWFjdGl2ZSh2bSwgJyRhdHRycycsIHBhcmVudERhdGEgJiYgcGFyZW50RGF0YS5hdHRycyB8fCBlbXB0eU9iamVjdCwgZnVuY3Rpb24gKCkge1xuICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKFwiJGF0dHJzIGlzIHJlYWRvbmx5LlwiLCB2bSk7XG4gICAgfSwgdHJ1ZSk7XG4gICAgZGVmaW5lUmVhY3RpdmUodm0sICckbGlzdGVuZXJzJywgb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzIHx8IGVtcHR5T2JqZWN0LCBmdW5jdGlvbiAoKSB7XG4gICAgICAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ICYmIHdhcm4oXCIkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LlwiLCB2bSk7XG4gICAgfSwgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIG51bGwsIHRydWUpO1xuICAgIGRlZmluZVJlYWN0aXZlKHZtLCAnJGxpc3RlbmVycycsIG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyB8fCBlbXB0eU9iamVjdCwgbnVsbCwgdHJ1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyTWl4aW4gKFZ1ZSkge1xuICAvLyBpbnN0YWxsIHJ1bnRpbWUgY29udmVuaWVuY2UgaGVscGVyc1xuICBpbnN0YWxsUmVuZGVySGVscGVycyhWdWUucHJvdG90eXBlKTtcblxuICBWdWUucHJvdG90eXBlLiRuZXh0VGljayA9IGZ1bmN0aW9uIChmbikge1xuICAgIHJldHVybiBuZXh0VGljayhmbiwgdGhpcylcbiAgfTtcblxuICBWdWUucHJvdG90eXBlLl9yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICB2YXIgcmVmID0gdm0uJG9wdGlvbnM7XG4gICAgdmFyIHJlbmRlciA9IHJlZi5yZW5kZXI7XG4gICAgdmFyIF9wYXJlbnRWbm9kZSA9IHJlZi5fcGFyZW50Vm5vZGU7XG5cbiAgICAvLyByZXNldCBfcmVuZGVyZWQgZmxhZyBvbiBzbG90cyBmb3IgZHVwbGljYXRlIHNsb3QgY2hlY2tcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgZm9yICh2YXIga2V5IGluIHZtLiRzbG90cykge1xuICAgICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgICAgICAgdm0uJHNsb3RzW2tleV0uX3JlbmRlcmVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF9wYXJlbnRWbm9kZSkge1xuICAgICAgdm0uJHNjb3BlZFNsb3RzID0gX3BhcmVudFZub2RlLmRhdGEuc2NvcGVkU2xvdHMgfHwgZW1wdHlPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2Vzc1xuICAgIC8vIHRvIHRoZSBkYXRhIG9uIHRoZSBwbGFjZWhvbGRlciBub2RlLlxuICAgIHZtLiR2bm9kZSA9IF9wYXJlbnRWbm9kZTtcbiAgICAvLyByZW5kZXIgc2VsZlxuICAgIHZhciB2bm9kZTtcbiAgICB0cnkge1xuICAgICAgdm5vZGUgPSByZW5kZXIuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoYW5kbGVFcnJvcihlLCB2bSwgXCJyZW5kZXJcIik7XG4gICAgICAvLyByZXR1cm4gZXJyb3IgcmVuZGVyIHJlc3VsdCxcbiAgICAgIC8vIG9yIHByZXZpb3VzIHZub2RlIHRvIHByZXZlbnQgcmVuZGVyIGVycm9yIGNhdXNpbmcgYmxhbmsgY29tcG9uZW50XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKHZtLiRvcHRpb25zLnJlbmRlckVycm9yKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgXCJyZW5kZXJFcnJvclwiKTtcbiAgICAgICAgICAgIHZub2RlID0gdm0uX3Zub2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm5vZGUgPSB2bS5fdm5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHJldHVybiBlbXB0eSB2bm9kZSBpbiBjYXNlIHRoZSByZW5kZXIgZnVuY3Rpb24gZXJyb3JlZCBvdXRcbiAgICBpZiAoISh2bm9kZSBpbnN0YW5jZW9mIFZOb2RlKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgQXJyYXkuaXNBcnJheSh2bm9kZSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnTXVsdGlwbGUgcm9vdCBub2RlcyByZXR1cm5lZCBmcm9tIHJlbmRlciBmdW5jdGlvbi4gUmVuZGVyIGZ1bmN0aW9uICcgK1xuICAgICAgICAgICdzaG91bGQgcmV0dXJuIGEgc2luZ2xlIHJvb3Qgbm9kZS4nLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB2bm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTtcbiAgICB9XG4gICAgLy8gc2V0IHBhcmVudFxuICAgIHZub2RlLnBhcmVudCA9IF9wYXJlbnRWbm9kZTtcbiAgICByZXR1cm4gdm5vZGVcbiAgfTtcbn1cblxuLyogICovXG5cbnZhciB1aWQkMyA9IDA7XG5cbmZ1bmN0aW9uIGluaXRNaXhpbiAoVnVlKSB7XG4gIFZ1ZS5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgLy8gYSB1aWRcbiAgICB2bS5fdWlkID0gdWlkJDMrKztcblxuICAgIHZhciBzdGFydFRhZywgZW5kVGFnO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7XG4gICAgICBzdGFydFRhZyA9IFwidnVlLXBlcmYtc3RhcnQ6XCIgKyAodm0uX3VpZCk7XG4gICAgICBlbmRUYWcgPSBcInZ1ZS1wZXJmLWVuZDpcIiArICh2bS5fdWlkKTtcbiAgICAgIG1hcmsoc3RhcnRUYWcpO1xuICAgIH1cblxuICAgIC8vIGEgZmxhZyB0byBhdm9pZCB0aGlzIGJlaW5nIG9ic2VydmVkXG4gICAgdm0uX2lzVnVlID0gdHJ1ZTtcbiAgICAvLyBtZXJnZSBvcHRpb25zXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5faXNDb21wb25lbnQpIHtcbiAgICAgIC8vIG9wdGltaXplIGludGVybmFsIGNvbXBvbmVudCBpbnN0YW50aWF0aW9uXG4gICAgICAvLyBzaW5jZSBkeW5hbWljIG9wdGlvbnMgbWVyZ2luZyBpcyBwcmV0dHkgc2xvdywgYW5kIG5vbmUgb2YgdGhlXG4gICAgICAvLyBpbnRlcm5hbCBjb21wb25lbnQgb3B0aW9ucyBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudC5cbiAgICAgIGluaXRJbnRlcm5hbENvbXBvbmVudCh2bSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZtLiRvcHRpb25zID0gbWVyZ2VPcHRpb25zKFxuICAgICAgICByZXNvbHZlQ29uc3RydWN0b3JPcHRpb25zKHZtLmNvbnN0cnVjdG9yKSxcbiAgICAgICAgb3B0aW9ucyB8fCB7fSxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGluaXRQcm94eSh2bSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IHZtO1xuICAgIH1cbiAgICAvLyBleHBvc2UgcmVhbCBzZWxmXG4gICAgdm0uX3NlbGYgPSB2bTtcbiAgICBpbml0TGlmZWN5Y2xlKHZtKTtcbiAgICBpbml0RXZlbnRzKHZtKTtcbiAgICBpbml0UmVuZGVyKHZtKTtcbiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZUNyZWF0ZScpO1xuICAgIGluaXRJbmplY3Rpb25zKHZtKTsgLy8gcmVzb2x2ZSBpbmplY3Rpb25zIGJlZm9yZSBkYXRhL3Byb3BzXG4gICAgaW5pdFN0YXRlKHZtKTtcbiAgICBpbml0UHJvdmlkZSh2bSk7IC8vIHJlc29sdmUgcHJvdmlkZSBhZnRlciBkYXRhL3Byb3BzXG4gICAgY2FsbEhvb2sodm0sICdjcmVhdGVkJyk7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykge1xuICAgICAgdm0uX25hbWUgPSBmb3JtYXRDb21wb25lbnROYW1lKHZtLCBmYWxzZSk7XG4gICAgICBtYXJrKGVuZFRhZyk7XG4gICAgICBtZWFzdXJlKChcInZ1ZSBcIiArICh2bS5fbmFtZSkgKyBcIiBpbml0XCIpLCBzdGFydFRhZywgZW5kVGFnKTtcbiAgICB9XG5cbiAgICBpZiAodm0uJG9wdGlvbnMuZWwpIHtcbiAgICAgIHZtLiRtb3VudCh2bS4kb3B0aW9ucy5lbCk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBpbml0SW50ZXJuYWxDb21wb25lbnQgKHZtLCBvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gdm0uJG9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKHZtLmNvbnN0cnVjdG9yLm9wdGlvbnMpO1xuICAvLyBkb2luZyB0aGlzIGJlY2F1c2UgaXQncyBmYXN0ZXIgdGhhbiBkeW5hbWljIGVudW1lcmF0aW9uLlxuICB2YXIgcGFyZW50Vm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTtcbiAgb3B0cy5wYXJlbnQgPSBvcHRpb25zLnBhcmVudDtcbiAgb3B0cy5fcGFyZW50Vm5vZGUgPSBwYXJlbnRWbm9kZTtcbiAgb3B0cy5fcGFyZW50RWxtID0gb3B0aW9ucy5fcGFyZW50RWxtO1xuICBvcHRzLl9yZWZFbG0gPSBvcHRpb25zLl9yZWZFbG07XG5cbiAgdmFyIHZub2RlQ29tcG9uZW50T3B0aW9ucyA9IHBhcmVudFZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gIG9wdHMucHJvcHNEYXRhID0gdm5vZGVDb21wb25lbnRPcHRpb25zLnByb3BzRGF0YTtcbiAgb3B0cy5fcGFyZW50TGlzdGVuZXJzID0gdm5vZGVDb21wb25lbnRPcHRpb25zLmxpc3RlbmVycztcbiAgb3B0cy5fcmVuZGVyQ2hpbGRyZW4gPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW47XG4gIG9wdHMuX2NvbXBvbmVudFRhZyA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy50YWc7XG5cbiAgaWYgKG9wdGlvbnMucmVuZGVyKSB7XG4gICAgb3B0cy5yZW5kZXIgPSBvcHRpb25zLnJlbmRlcjtcbiAgICBvcHRzLnN0YXRpY1JlbmRlckZucyA9IG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMgKEN0b3IpIHtcbiAgdmFyIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnM7XG4gIGlmIChDdG9yLnN1cGVyKSB7XG4gICAgdmFyIHN1cGVyT3B0aW9ucyA9IHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvci5zdXBlcik7XG4gICAgdmFyIGNhY2hlZFN1cGVyT3B0aW9ucyA9IEN0b3Iuc3VwZXJPcHRpb25zO1xuICAgIGlmIChzdXBlck9wdGlvbnMgIT09IGNhY2hlZFN1cGVyT3B0aW9ucykge1xuICAgICAgLy8gc3VwZXIgb3B0aW9uIGNoYW5nZWQsXG4gICAgICAvLyBuZWVkIHRvIHJlc29sdmUgbmV3IG9wdGlvbnMuXG4gICAgICBDdG9yLnN1cGVyT3B0aW9ucyA9IHN1cGVyT3B0aW9ucztcbiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbGF0ZS1tb2RpZmllZC9hdHRhY2hlZCBvcHRpb25zICgjNDk3NilcbiAgICAgIHZhciBtb2RpZmllZE9wdGlvbnMgPSByZXNvbHZlTW9kaWZpZWRPcHRpb25zKEN0b3IpO1xuICAgICAgLy8gdXBkYXRlIGJhc2UgZXh0ZW5kIG9wdGlvbnNcbiAgICAgIGlmIChtb2RpZmllZE9wdGlvbnMpIHtcbiAgICAgICAgZXh0ZW5kKEN0b3IuZXh0ZW5kT3B0aW9ucywgbW9kaWZpZWRPcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoc3VwZXJPcHRpb25zLCBDdG9yLmV4dGVuZE9wdGlvbnMpO1xuICAgICAgaWYgKG9wdGlvbnMubmFtZSkge1xuICAgICAgICBvcHRpb25zLmNvbXBvbmVudHNbb3B0aW9ucy5uYW1lXSA9IEN0b3I7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBvcHRpb25zXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVNb2RpZmllZE9wdGlvbnMgKEN0b3IpIHtcbiAgdmFyIG1vZGlmaWVkO1xuICB2YXIgbGF0ZXN0ID0gQ3Rvci5vcHRpb25zO1xuICB2YXIgZXh0ZW5kZWQgPSBDdG9yLmV4dGVuZE9wdGlvbnM7XG4gIHZhciBzZWFsZWQgPSBDdG9yLnNlYWxlZE9wdGlvbnM7XG4gIGZvciAodmFyIGtleSBpbiBsYXRlc3QpIHtcbiAgICBpZiAobGF0ZXN0W2tleV0gIT09IHNlYWxlZFtrZXldKSB7XG4gICAgICBpZiAoIW1vZGlmaWVkKSB7IG1vZGlmaWVkID0ge307IH1cbiAgICAgIG1vZGlmaWVkW2tleV0gPSBkZWR1cGUobGF0ZXN0W2tleV0sIGV4dGVuZGVkW2tleV0sIHNlYWxlZFtrZXldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1vZGlmaWVkXG59XG5cbmZ1bmN0aW9uIGRlZHVwZSAobGF0ZXN0LCBleHRlbmRlZCwgc2VhbGVkKSB7XG4gIC8vIGNvbXBhcmUgbGF0ZXN0IGFuZCBzZWFsZWQgdG8gZW5zdXJlIGxpZmVjeWNsZSBob29rcyB3b24ndCBiZSBkdXBsaWNhdGVkXG4gIC8vIGJldHdlZW4gbWVyZ2VzXG4gIGlmIChBcnJheS5pc0FycmF5KGxhdGVzdCkpIHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgc2VhbGVkID0gQXJyYXkuaXNBcnJheShzZWFsZWQpID8gc2VhbGVkIDogW3NlYWxlZF07XG4gICAgZXh0ZW5kZWQgPSBBcnJheS5pc0FycmF5KGV4dGVuZGVkKSA/IGV4dGVuZGVkIDogW2V4dGVuZGVkXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhdGVzdC5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gcHVzaCBvcmlnaW5hbCBvcHRpb25zIGFuZCBub3Qgc2VhbGVkIG9wdGlvbnMgdG8gZXhjbHVkZSBkdXBsaWNhdGVkIG9wdGlvbnNcbiAgICAgIGlmIChleHRlbmRlZC5pbmRleE9mKGxhdGVzdFtpXSkgPj0gMCB8fCBzZWFsZWQuaW5kZXhPZihsYXRlc3RbaV0pIDwgMCkge1xuICAgICAgICByZXMucHVzaChsYXRlc3RbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxhdGVzdFxuICB9XG59XG5cbmZ1bmN0aW9uIFZ1ZSAob3B0aW9ucykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICEodGhpcyBpbnN0YW5jZW9mIFZ1ZSlcbiAgKSB7XG4gICAgd2FybignVnVlIGlzIGEgY29uc3RydWN0b3IgYW5kIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgYG5ld2Aga2V5d29yZCcpO1xuICB9XG4gIHRoaXMuX2luaXQob3B0aW9ucyk7XG59XG5cbmluaXRNaXhpbihWdWUpO1xuc3RhdGVNaXhpbihWdWUpO1xuZXZlbnRzTWl4aW4oVnVlKTtcbmxpZmVjeWNsZU1peGluKFZ1ZSk7XG5yZW5kZXJNaXhpbihWdWUpO1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdFVzZSAoVnVlKSB7XG4gIFZ1ZS51c2UgPSBmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgdmFyIGluc3RhbGxlZFBsdWdpbnMgPSAodGhpcy5faW5zdGFsbGVkUGx1Z2lucyB8fCAodGhpcy5faW5zdGFsbGVkUGx1Z2lucyA9IFtdKSk7XG4gICAgaWYgKGluc3RhbGxlZFBsdWdpbnMuaW5kZXhPZihwbHVnaW4pID4gLTEpIHtcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLy8gYWRkaXRpb25hbCBwYXJhbWV0ZXJzXG4gICAgdmFyIGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cywgMSk7XG4gICAgYXJncy51bnNoaWZ0KHRoaXMpO1xuICAgIGlmICh0eXBlb2YgcGx1Z2luLmluc3RhbGwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBsdWdpbi5pbnN0YWxsLmFwcGx5KHBsdWdpbiwgYXJncyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcGx1Z2luID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwbHVnaW4uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfVxuICAgIGluc3RhbGxlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuICAgIHJldHVybiB0aGlzXG4gIH07XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0TWl4aW4kMSAoVnVlKSB7XG4gIFZ1ZS5taXhpbiA9IGZ1bmN0aW9uIChtaXhpbikge1xuICAgIHRoaXMub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsIG1peGluKTtcbiAgICByZXR1cm4gdGhpc1xuICB9O1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdEV4dGVuZCAoVnVlKSB7XG4gIC8qKlxuICAgKiBFYWNoIGluc3RhbmNlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgVnVlLCBoYXMgYSB1bmlxdWVcbiAgICogY2lkLiBUaGlzIGVuYWJsZXMgdXMgdG8gY3JlYXRlIHdyYXBwZWQgXCJjaGlsZFxuICAgKiBjb25zdHJ1Y3RvcnNcIiBmb3IgcHJvdG90eXBhbCBpbmhlcml0YW5jZSBhbmQgY2FjaGUgdGhlbS5cbiAgICovXG4gIFZ1ZS5jaWQgPSAwO1xuICB2YXIgY2lkID0gMTtcblxuICAvKipcbiAgICogQ2xhc3MgaW5oZXJpdGFuY2VcbiAgICovXG4gIFZ1ZS5leHRlbmQgPSBmdW5jdGlvbiAoZXh0ZW5kT3B0aW9ucykge1xuICAgIGV4dGVuZE9wdGlvbnMgPSBleHRlbmRPcHRpb25zIHx8IHt9O1xuICAgIHZhciBTdXBlciA9IHRoaXM7XG4gICAgdmFyIFN1cGVySWQgPSBTdXBlci5jaWQ7XG4gICAgdmFyIGNhY2hlZEN0b3JzID0gZXh0ZW5kT3B0aW9ucy5fQ3RvciB8fCAoZXh0ZW5kT3B0aW9ucy5fQ3RvciA9IHt9KTtcbiAgICBpZiAoY2FjaGVkQ3RvcnNbU3VwZXJJZF0pIHtcbiAgICAgIHJldHVybiBjYWNoZWRDdG9yc1tTdXBlcklkXVxuICAgIH1cblxuICAgIHZhciBuYW1lID0gZXh0ZW5kT3B0aW9ucy5uYW1lIHx8IFN1cGVyLm9wdGlvbnMubmFtZTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBuYW1lKSB7XG4gICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIFN1YiA9IGZ1bmN0aW9uIFZ1ZUNvbXBvbmVudCAob3B0aW9ucykge1xuICAgICAgdGhpcy5faW5pdChvcHRpb25zKTtcbiAgICB9O1xuICAgIFN1Yi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN1cGVyLnByb3RvdHlwZSk7XG4gICAgU3ViLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFN1YjtcbiAgICBTdWIuY2lkID0gY2lkKys7XG4gICAgU3ViLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoXG4gICAgICBTdXBlci5vcHRpb25zLFxuICAgICAgZXh0ZW5kT3B0aW9uc1xuICAgICk7XG4gICAgU3ViWydzdXBlciddID0gU3VwZXI7XG5cbiAgICAvLyBGb3IgcHJvcHMgYW5kIGNvbXB1dGVkIHByb3BlcnRpZXMsIHdlIGRlZmluZSB0aGUgcHJveHkgZ2V0dGVycyBvblxuICAgIC8vIHRoZSBWdWUgaW5zdGFuY2VzIGF0IGV4dGVuc2lvbiB0aW1lLCBvbiB0aGUgZXh0ZW5kZWQgcHJvdG90eXBlLiBUaGlzXG4gICAgLy8gYXZvaWRzIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBjYWxscyBmb3IgZWFjaCBpbnN0YW5jZSBjcmVhdGVkLlxuICAgIGlmIChTdWIub3B0aW9ucy5wcm9wcykge1xuICAgICAgaW5pdFByb3BzJDEoU3ViKTtcbiAgICB9XG4gICAgaWYgKFN1Yi5vcHRpb25zLmNvbXB1dGVkKSB7XG4gICAgICBpbml0Q29tcHV0ZWQkMShTdWIpO1xuICAgIH1cblxuICAgIC8vIGFsbG93IGZ1cnRoZXIgZXh0ZW5zaW9uL21peGluL3BsdWdpbiB1c2FnZVxuICAgIFN1Yi5leHRlbmQgPSBTdXBlci5leHRlbmQ7XG4gICAgU3ViLm1peGluID0gU3VwZXIubWl4aW47XG4gICAgU3ViLnVzZSA9IFN1cGVyLnVzZTtcblxuICAgIC8vIGNyZWF0ZSBhc3NldCByZWdpc3RlcnMsIHNvIGV4dGVuZGVkIGNsYXNzZXNcbiAgICAvLyBjYW4gaGF2ZSB0aGVpciBwcml2YXRlIGFzc2V0cyB0b28uXG4gICAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgICAgU3ViW3R5cGVdID0gU3VwZXJbdHlwZV07XG4gICAgfSk7XG4gICAgLy8gZW5hYmxlIHJlY3Vyc2l2ZSBzZWxmLWxvb2t1cFxuICAgIGlmIChuYW1lKSB7XG4gICAgICBTdWIub3B0aW9ucy5jb21wb25lbnRzW25hbWVdID0gU3ViO1xuICAgIH1cblxuICAgIC8vIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIHN1cGVyIG9wdGlvbnMgYXQgZXh0ZW5zaW9uIHRpbWUuXG4gICAgLy8gbGF0ZXIgYXQgaW5zdGFudGlhdGlvbiB3ZSBjYW4gY2hlY2sgaWYgU3VwZXIncyBvcHRpb25zIGhhdmVcbiAgICAvLyBiZWVuIHVwZGF0ZWQuXG4gICAgU3ViLnN1cGVyT3B0aW9ucyA9IFN1cGVyLm9wdGlvbnM7XG4gICAgU3ViLmV4dGVuZE9wdGlvbnMgPSBleHRlbmRPcHRpb25zO1xuICAgIFN1Yi5zZWFsZWRPcHRpb25zID0gZXh0ZW5kKHt9LCBTdWIub3B0aW9ucyk7XG5cbiAgICAvLyBjYWNoZSBjb25zdHJ1Y3RvclxuICAgIGNhY2hlZEN0b3JzW1N1cGVySWRdID0gU3ViO1xuICAgIHJldHVybiBTdWJcbiAgfTtcbn1cblxuZnVuY3Rpb24gaW5pdFByb3BzJDEgKENvbXApIHtcbiAgdmFyIHByb3BzID0gQ29tcC5vcHRpb25zLnByb3BzO1xuICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICBwcm94eShDb21wLnByb3RvdHlwZSwgXCJfcHJvcHNcIiwga2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0Q29tcHV0ZWQkMSAoQ29tcCkge1xuICB2YXIgY29tcHV0ZWQgPSBDb21wLm9wdGlvbnMuY29tcHV0ZWQ7XG4gIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkge1xuICAgIGRlZmluZUNvbXB1dGVkKENvbXAucHJvdG90eXBlLCBrZXksIGNvbXB1dGVkW2tleV0pO1xuICB9XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0QXNzZXRSZWdpc3RlcnMgKFZ1ZSkge1xuICAvKipcbiAgICogQ3JlYXRlIGFzc2V0IHJlZ2lzdHJhdGlvbiBtZXRob2RzLlxuICAgKi9cbiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgIFZ1ZVt0eXBlXSA9IGZ1bmN0aW9uIChcbiAgICAgIGlkLFxuICAgICAgZGVmaW5pdGlvblxuICAgICkge1xuICAgICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZSA9PT0gJ2NvbXBvbmVudCcpIHtcbiAgICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUoaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSAnY29tcG9uZW50JyAmJiBpc1BsYWluT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgICAgICAgZGVmaW5pdGlvbi5uYW1lID0gZGVmaW5pdGlvbi5uYW1lIHx8IGlkO1xuICAgICAgICAgIGRlZmluaXRpb24gPSB0aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKGRlZmluaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSAnZGlyZWN0aXZlJyAmJiB0eXBlb2YgZGVmaW5pdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGRlZmluaXRpb24gPSB7IGJpbmQ6IGRlZmluaXRpb24sIHVwZGF0ZTogZGVmaW5pdGlvbiB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9uc1t0eXBlICsgJ3MnXVtpZF0gPSBkZWZpbml0aW9uO1xuICAgICAgICByZXR1cm4gZGVmaW5pdGlvblxuICAgICAgfVxuICAgIH07XG4gIH0pO1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZSAob3B0cykge1xuICByZXR1cm4gb3B0cyAmJiAob3B0cy5DdG9yLm9wdGlvbnMubmFtZSB8fCBvcHRzLnRhZylcbn1cblxuZnVuY3Rpb24gbWF0Y2hlcyAocGF0dGVybiwgbmFtZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLmluZGV4T2YobmFtZSkgPiAtMVxuICB9IGVsc2UgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYXR0ZXJuLnNwbGl0KCcsJykuaW5kZXhPZihuYW1lKSA+IC0xXG4gIH0gZWxzZSBpZiAoaXNSZWdFeHAocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpXG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FjaGUgKGtlZXBBbGl2ZUluc3RhbmNlLCBmaWx0ZXIpIHtcbiAgdmFyIGNhY2hlID0ga2VlcEFsaXZlSW5zdGFuY2UuY2FjaGU7XG4gIHZhciBrZXlzID0ga2VlcEFsaXZlSW5zdGFuY2Uua2V5cztcbiAgdmFyIF92bm9kZSA9IGtlZXBBbGl2ZUluc3RhbmNlLl92bm9kZTtcbiAgZm9yICh2YXIga2V5IGluIGNhY2hlKSB7XG4gICAgdmFyIGNhY2hlZE5vZGUgPSBjYWNoZVtrZXldO1xuICAgIGlmIChjYWNoZWROb2RlKSB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoY2FjaGVkTm9kZS5jb21wb25lbnRPcHRpb25zKTtcbiAgICAgIGlmIChuYW1lICYmICFmaWx0ZXIobmFtZSkpIHtcbiAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGNhY2hlLCBrZXksIGtleXMsIF92bm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeSAoXG4gIGNhY2hlLFxuICBrZXksXG4gIGtleXMsXG4gIGN1cnJlbnRcbikge1xuICB2YXIgY2FjaGVkJCQxID0gY2FjaGVba2V5XTtcbiAgaWYgKGNhY2hlZCQkMSAmJiAoIWN1cnJlbnQgfHwgY2FjaGVkJCQxLnRhZyAhPT0gY3VycmVudC50YWcpKSB7XG4gICAgY2FjaGVkJCQxLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7XG4gIH1cbiAgY2FjaGVba2V5XSA9IG51bGw7XG4gIHJlbW92ZShrZXlzLCBrZXkpO1xufVxuXG52YXIgcGF0dGVyblR5cGVzID0gW1N0cmluZywgUmVnRXhwLCBBcnJheV07XG5cbnZhciBLZWVwQWxpdmUgPSB7XG4gIG5hbWU6ICdrZWVwLWFsaXZlJyxcbiAgYWJzdHJhY3Q6IHRydWUsXG5cbiAgcHJvcHM6IHtcbiAgICBpbmNsdWRlOiBwYXR0ZXJuVHlwZXMsXG4gICAgZXhjbHVkZTogcGF0dGVyblR5cGVzLFxuICAgIG1heDogW1N0cmluZywgTnVtYmVyXVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQgKCkge1xuICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMua2V5cyA9IFtdO1xuICB9LFxuXG4gIGRlc3Ryb3llZDogZnVuY3Rpb24gZGVzdHJveWVkICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIGZvciAodmFyIGtleSBpbiB0aGlzJDEuY2FjaGUpIHtcbiAgICAgIHBydW5lQ2FjaGVFbnRyeSh0aGlzJDEuY2FjaGUsIGtleSwgdGhpcyQxLmtleXMpO1xuICAgIH1cbiAgfSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHRoaXMuJHdhdGNoKCdpbmNsdWRlJywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcHJ1bmVDYWNoZSh0aGlzJDEsIGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBtYXRjaGVzKHZhbCwgbmFtZSk7IH0pO1xuICAgIH0pO1xuICAgIHRoaXMuJHdhdGNoKCdleGNsdWRlJywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcHJ1bmVDYWNoZSh0aGlzJDEsIGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiAhbWF0Y2hlcyh2YWwsIG5hbWUpOyB9KTtcbiAgICB9KTtcbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoKSB7XG4gICAgdmFyIHNsb3QgPSB0aGlzLiRzbG90cy5kZWZhdWx0O1xuICAgIHZhciB2bm9kZSA9IGdldEZpcnN0Q29tcG9uZW50Q2hpbGQoc2xvdCk7XG4gICAgdmFyIGNvbXBvbmVudE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zO1xuICAgIGlmIChjb21wb25lbnRPcHRpb25zKSB7XG4gICAgICAvLyBjaGVjayBwYXR0ZXJuXG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoY29tcG9uZW50T3B0aW9ucyk7XG4gICAgICB2YXIgcmVmID0gdGhpcztcbiAgICAgIHZhciBpbmNsdWRlID0gcmVmLmluY2x1ZGU7XG4gICAgICB2YXIgZXhjbHVkZSA9IHJlZi5leGNsdWRlO1xuICAgICAgaWYgKFxuICAgICAgICAvLyBub3QgaW5jbHVkZWRcbiAgICAgICAgKGluY2x1ZGUgJiYgKCFuYW1lIHx8ICFtYXRjaGVzKGluY2x1ZGUsIG5hbWUpKSkgfHxcbiAgICAgICAgLy8gZXhjbHVkZWRcbiAgICAgICAgKGV4Y2x1ZGUgJiYgbmFtZSAmJiBtYXRjaGVzKGV4Y2x1ZGUsIG5hbWUpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB2bm9kZVxuICAgICAgfVxuXG4gICAgICB2YXIgcmVmJDEgPSB0aGlzO1xuICAgICAgdmFyIGNhY2hlID0gcmVmJDEuY2FjaGU7XG4gICAgICB2YXIga2V5cyA9IHJlZiQxLmtleXM7XG4gICAgICB2YXIga2V5ID0gdm5vZGUua2V5ID09IG51bGxcbiAgICAgICAgLy8gc2FtZSBjb25zdHJ1Y3RvciBtYXkgZ2V0IHJlZ2lzdGVyZWQgYXMgZGlmZmVyZW50IGxvY2FsIGNvbXBvbmVudHNcbiAgICAgICAgLy8gc28gY2lkIGFsb25lIGlzIG5vdCBlbm91Z2ggKCMzMjY5KVxuICAgICAgICA/IGNvbXBvbmVudE9wdGlvbnMuQ3Rvci5jaWQgKyAoY29tcG9uZW50T3B0aW9ucy50YWcgPyAoXCI6OlwiICsgKGNvbXBvbmVudE9wdGlvbnMudGFnKSkgOiAnJylcbiAgICAgICAgOiB2bm9kZS5rZXk7XG4gICAgICBpZiAoY2FjaGVba2V5XSkge1xuICAgICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IGNhY2hlW2tleV0uY29tcG9uZW50SW5zdGFuY2U7XG4gICAgICAgIC8vIG1ha2UgY3VycmVudCBrZXkgZnJlc2hlc3RcbiAgICAgICAgcmVtb3ZlKGtleXMsIGtleSk7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FjaGVba2V5XSA9IHZub2RlO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgLy8gcHJ1bmUgb2xkZXN0IGVudHJ5XG4gICAgICAgIGlmICh0aGlzLm1heCAmJiBrZXlzLmxlbmd0aCA+IHBhcnNlSW50KHRoaXMubWF4KSkge1xuICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShjYWNoZSwga2V5c1swXSwga2V5cywgdGhpcy5fdm5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlIHx8IChzbG90ICYmIHNsb3RbMF0pXG4gIH1cbn1cblxudmFyIGJ1aWx0SW5Db21wb25lbnRzID0ge1xuICBLZWVwQWxpdmU6IEtlZXBBbGl2ZVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdEdsb2JhbEFQSSAoVnVlKSB7XG4gIC8vIGNvbmZpZ1xuICB2YXIgY29uZmlnRGVmID0ge307XG4gIGNvbmZpZ0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWc7IH07XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uZmlnRGVmLnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICdEbyBub3QgcmVwbGFjZSB0aGUgVnVlLmNvbmZpZyBvYmplY3QsIHNldCBpbmRpdmlkdWFsIGZpZWxkcyBpbnN0ZWFkLidcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLCAnY29uZmlnJywgY29uZmlnRGVmKTtcblxuICAvLyBleHBvc2VkIHV0aWwgbWV0aG9kcy5cbiAgLy8gTk9URTogdGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgLSBhdm9pZCByZWx5aW5nIG9uXG4gIC8vIHRoZW0gdW5sZXNzIHlvdSBhcmUgYXdhcmUgb2YgdGhlIHJpc2suXG4gIFZ1ZS51dGlsID0ge1xuICAgIHdhcm46IHdhcm4sXG4gICAgZXh0ZW5kOiBleHRlbmQsXG4gICAgbWVyZ2VPcHRpb25zOiBtZXJnZU9wdGlvbnMsXG4gICAgZGVmaW5lUmVhY3RpdmU6IGRlZmluZVJlYWN0aXZlXG4gIH07XG5cbiAgVnVlLnNldCA9IHNldDtcbiAgVnVlLmRlbGV0ZSA9IGRlbDtcbiAgVnVlLm5leHRUaWNrID0gbmV4dFRpY2s7XG5cbiAgVnVlLm9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBBU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgVnVlLm9wdGlvbnNbdHlwZSArICdzJ10gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9KTtcblxuICAvLyB0aGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIFwiYmFzZVwiIGNvbnN0cnVjdG9yIHRvIGV4dGVuZCBhbGwgcGxhaW4tb2JqZWN0XG4gIC8vIGNvbXBvbmVudHMgd2l0aCBpbiBXZWV4J3MgbXVsdGktaW5zdGFuY2Ugc2NlbmFyaW9zLlxuICBWdWUub3B0aW9ucy5fYmFzZSA9IFZ1ZTtcblxuICBleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgYnVpbHRJbkNvbXBvbmVudHMpO1xuXG4gIGluaXRVc2UoVnVlKTtcbiAgaW5pdE1peGluJDEoVnVlKTtcbiAgaW5pdEV4dGVuZChWdWUpO1xuICBpbml0QXNzZXRSZWdpc3RlcnMoVnVlKTtcbn1cblxuaW5pdEdsb2JhbEFQSShWdWUpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRpc1NlcnZlcicsIHtcbiAgZ2V0OiBpc1NlcnZlclJlbmRlcmluZ1xufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJHNzckNvbnRleHQnLCB7XG4gIGdldDogZnVuY3Rpb24gZ2V0ICgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB0aGlzLiR2bm9kZSAmJiB0aGlzLiR2bm9kZS5zc3JDb250ZXh0XG4gIH1cbn0pO1xuXG4vLyBleHBvc2UgRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgZm9yIHNzciBydW50aW1lIGhlbHBlciBpbnN0YWxsYXRpb25cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUsICdGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCcsIHtcbiAgdmFsdWU6IEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0XG59KTtcblxuVnVlLnZlcnNpb24gPSAnMi41LjE2JztcblxuLyogICovXG5cbi8vIHRoZXNlIGFyZSByZXNlcnZlZCBmb3Igd2ViIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgY29tcGlsZWQgYXdheVxuLy8gZHVyaW5nIHRlbXBsYXRlIGNvbXBpbGF0aW9uXG52YXIgaXNSZXNlcnZlZEF0dHIgPSBtYWtlTWFwKCdzdHlsZSxjbGFzcycpO1xuXG4vLyBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIHVzaW5nIHByb3BzIGZvciBiaW5kaW5nXG52YXIgYWNjZXB0VmFsdWUgPSBtYWtlTWFwKCdpbnB1dCx0ZXh0YXJlYSxvcHRpb24sc2VsZWN0LHByb2dyZXNzJyk7XG52YXIgbXVzdFVzZVByb3AgPSBmdW5jdGlvbiAodGFnLCB0eXBlLCBhdHRyKSB7XG4gIHJldHVybiAoXG4gICAgKGF0dHIgPT09ICd2YWx1ZScgJiYgYWNjZXB0VmFsdWUodGFnKSkgJiYgdHlwZSAhPT0gJ2J1dHRvbicgfHxcbiAgICAoYXR0ciA9PT0gJ3NlbGVjdGVkJyAmJiB0YWcgPT09ICdvcHRpb24nKSB8fFxuICAgIChhdHRyID09PSAnY2hlY2tlZCcgJiYgdGFnID09PSAnaW5wdXQnKSB8fFxuICAgIChhdHRyID09PSAnbXV0ZWQnICYmIHRhZyA9PT0gJ3ZpZGVvJylcbiAgKVxufTtcblxudmFyIGlzRW51bWVyYXRlZEF0dHIgPSBtYWtlTWFwKCdjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2snKTtcblxudmFyIGlzQm9vbGVhbkF0dHIgPSBtYWtlTWFwKFxuICAnYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSwnICtcbiAgJ2RlZmF1bHQsZGVmYXVsdGNoZWNrZWQsZGVmYXVsdG11dGVkLGRlZmF1bHRzZWxlY3RlZCxkZWZlcixkaXNhYmxlZCwnICtcbiAgJ2VuYWJsZWQsZm9ybW5vdmFsaWRhdGUsaGlkZGVuLGluZGV0ZXJtaW5hdGUsaW5lcnQsaXNtYXAsaXRlbXNjb3BlLGxvb3AsbXVsdGlwbGUsJyArXG4gICdtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LCcgK1xuICAncmVxdWlyZWQscmV2ZXJzZWQsc2NvcGVkLHNlYW1sZXNzLHNlbGVjdGVkLHNvcnRhYmxlLHRyYW5zbGF0ZSwnICtcbiAgJ3RydWVzcGVlZCx0eXBlbXVzdG1hdGNoLHZpc2libGUnXG4pO1xuXG52YXIgeGxpbmtOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJztcblxudmFyIGlzWGxpbmsgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gbmFtZS5jaGFyQXQoNSkgPT09ICc6JyAmJiBuYW1lLnNsaWNlKDAsIDUpID09PSAneGxpbmsnXG59O1xuXG52YXIgZ2V0WGxpbmtQcm9wID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIGlzWGxpbmsobmFtZSkgPyBuYW1lLnNsaWNlKDYsIG5hbWUubGVuZ3RoKSA6ICcnXG59O1xuXG52YXIgaXNGYWxzeUF0dHJWYWx1ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gZmFsc2Vcbn07XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBnZW5DbGFzc0ZvclZub2RlICh2bm9kZSkge1xuICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7XG4gIHZhciBwYXJlbnROb2RlID0gdm5vZGU7XG4gIHZhciBjaGlsZE5vZGUgPSB2bm9kZTtcbiAgd2hpbGUgKGlzRGVmKGNoaWxkTm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHtcbiAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO1xuICAgIGlmIChjaGlsZE5vZGUgJiYgY2hpbGROb2RlLmRhdGEpIHtcbiAgICAgIGRhdGEgPSBtZXJnZUNsYXNzRGF0YShjaGlsZE5vZGUuZGF0YSwgZGF0YSk7XG4gICAgfVxuICB9XG4gIHdoaWxlIChpc0RlZihwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnQpKSB7XG4gICAgaWYgKHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS5kYXRhKSB7XG4gICAgICBkYXRhID0gbWVyZ2VDbGFzc0RhdGEoZGF0YSwgcGFyZW50Tm9kZS5kYXRhKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlbmRlckNsYXNzKGRhdGEuc3RhdGljQ2xhc3MsIGRhdGEuY2xhc3MpXG59XG5cbmZ1bmN0aW9uIG1lcmdlQ2xhc3NEYXRhIChjaGlsZCwgcGFyZW50KSB7XG4gIHJldHVybiB7XG4gICAgc3RhdGljQ2xhc3M6IGNvbmNhdChjaGlsZC5zdGF0aWNDbGFzcywgcGFyZW50LnN0YXRpY0NsYXNzKSxcbiAgICBjbGFzczogaXNEZWYoY2hpbGQuY2xhc3MpXG4gICAgICA/IFtjaGlsZC5jbGFzcywgcGFyZW50LmNsYXNzXVxuICAgICAgOiBwYXJlbnQuY2xhc3NcbiAgfVxufVxuXG5mdW5jdGlvbiByZW5kZXJDbGFzcyAoXG4gIHN0YXRpY0NsYXNzLFxuICBkeW5hbWljQ2xhc3Ncbikge1xuICBpZiAoaXNEZWYoc3RhdGljQ2xhc3MpIHx8IGlzRGVmKGR5bmFtaWNDbGFzcykpIHtcbiAgICByZXR1cm4gY29uY2F0KHN0YXRpY0NsYXNzLCBzdHJpbmdpZnlDbGFzcyhkeW5hbWljQ2xhc3MpKVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiAnJ1xufVxuXG5mdW5jdGlvbiBjb25jYXQgKGEsIGIpIHtcbiAgcmV0dXJuIGEgPyBiID8gKGEgKyAnICcgKyBiKSA6IGEgOiAoYiB8fCAnJylcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5Q2xhc3MgKHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBzdHJpbmdpZnlBcnJheSh2YWx1ZSlcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeU9iamVjdCh2YWx1ZSlcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiAnJ1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlBcnJheSAodmFsdWUpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgc3RyaW5naWZpZWQ7XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKGlzRGVmKHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5Q2xhc3ModmFsdWVbaV0pKSAmJiBzdHJpbmdpZmllZCAhPT0gJycpIHtcbiAgICAgIGlmIChyZXMpIHsgcmVzICs9ICcgJzsgfVxuICAgICAgcmVzICs9IHN0cmluZ2lmaWVkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdCAodmFsdWUpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAodmFsdWVba2V5XSkge1xuICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9XG4gICAgICByZXMgKz0ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbi8qICAqL1xuXG52YXIgbmFtZXNwYWNlTWFwID0ge1xuICBzdmc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsXG4gIG1hdGg6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJ1xufTtcblxudmFyIGlzSFRNTFRhZyA9IG1ha2VNYXAoXG4gICdodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSwnICtcbiAgJ2FkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhncm91cCxuYXYsc2VjdGlvbiwnICtcbiAgJ2RpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLCcgK1xuICAnYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LCcgK1xuICAncyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sJyArXG4gICdlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLGNhbnZhcyxzY3JpcHQsbm9zY3JpcHQsZGVsLGlucywnICtcbiAgJ2NhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLCcgK1xuICAnYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbiwnICtcbiAgJ291dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsJyArXG4gICdkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksJyArXG4gICdjb250ZW50LGVsZW1lbnQsc2hhZG93LHRlbXBsYXRlLGJsb2NrcXVvdGUsaWZyYW1lLHRmb290J1xuKTtcblxuLy8gdGhpcyBtYXAgaXMgaW50ZW50aW9uYWxseSBzZWxlY3RpdmUsIG9ubHkgY292ZXJpbmcgU1ZHIGVsZW1lbnRzIHRoYXQgbWF5XG4vLyBjb250YWluIGNoaWxkIGVsZW1lbnRzLlxudmFyIGlzU1ZHID0gbWFrZU1hcChcbiAgJ3N2ZyxhbmltYXRlLGNpcmNsZSxjbGlwcGF0aCxjdXJzb3IsZGVmcyxkZXNjLGVsbGlwc2UsZmlsdGVyLGZvbnQtZmFjZSwnICtcbiAgJ2ZvcmVpZ25PYmplY3QsZyxnbHlwaCxpbWFnZSxsaW5lLG1hcmtlcixtYXNrLG1pc3NpbmctZ2x5cGgscGF0aCxwYXR0ZXJuLCcgK1xuICAncG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldycsXG4gIHRydWVcbik7XG5cbnZhciBpc1ByZVRhZyA9IGZ1bmN0aW9uICh0YWcpIHsgcmV0dXJuIHRhZyA9PT0gJ3ByZSc7IH07XG5cbnZhciBpc1Jlc2VydmVkVGFnID0gZnVuY3Rpb24gKHRhZykge1xuICByZXR1cm4gaXNIVE1MVGFnKHRhZykgfHwgaXNTVkcodGFnKVxufTtcblxuZnVuY3Rpb24gZ2V0VGFnTmFtZXNwYWNlICh0YWcpIHtcbiAgaWYgKGlzU1ZHKHRhZykpIHtcbiAgICByZXR1cm4gJ3N2ZydcbiAgfVxuICAvLyBiYXNpYyBzdXBwb3J0IGZvciBNYXRoTUxcbiAgLy8gbm90ZSBpdCBkb2Vzbid0IHN1cHBvcnQgb3RoZXIgTWF0aE1MIGVsZW1lbnRzIGJlaW5nIGNvbXBvbmVudCByb290c1xuICBpZiAodGFnID09PSAnbWF0aCcpIHtcbiAgICByZXR1cm4gJ21hdGgnXG4gIH1cbn1cblxudmFyIHVua25vd25FbGVtZW50Q2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuZnVuY3Rpb24gaXNVbmtub3duRWxlbWVudCAodGFnKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIWluQnJvd3Nlcikge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKGlzUmVzZXJ2ZWRUYWcodGFnKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHRhZyA9IHRhZy50b0xvd2VyQ2FzZSgpO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHVua25vd25FbGVtZW50Q2FjaGVbdGFnXSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHVua25vd25FbGVtZW50Q2FjaGVbdGFnXVxuICB9XG4gIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgaWYgKHRhZy5pbmRleE9mKCctJykgPiAtMSkge1xuICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI4MjEwMzY0LzEwNzAyNDRcbiAgICByZXR1cm4gKHVua25vd25FbGVtZW50Q2FjaGVbdGFnXSA9IChcbiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTFVua25vd25FbGVtZW50IHx8XG4gICAgICBlbC5jb25zdHJ1Y3RvciA9PT0gd2luZG93LkhUTUxFbGVtZW50XG4gICAgKSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKHVua25vd25FbGVtZW50Q2FjaGVbdGFnXSA9IC9IVE1MVW5rbm93bkVsZW1lbnQvLnRlc3QoZWwudG9TdHJpbmcoKSkpXG4gIH1cbn1cblxudmFyIGlzVGV4dElucHV0VHlwZSA9IG1ha2VNYXAoJ3RleHQsbnVtYmVyLHBhc3N3b3JkLHNlYXJjaCxlbWFpbCx0ZWwsdXJsJyk7XG5cbi8qICAqL1xuXG4vKipcbiAqIFF1ZXJ5IGFuIGVsZW1lbnQgc2VsZWN0b3IgaWYgaXQncyBub3QgYW4gZWxlbWVudCBhbHJlYWR5LlxuICovXG5mdW5jdGlvbiBxdWVyeSAoZWwpIHtcbiAgaWYgKHR5cGVvZiBlbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgc2VsZWN0ZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsKTtcbiAgICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAgICdDYW5ub3QgZmluZCBlbGVtZW50OiAnICsgZWxcbiAgICAgICk7XG4gICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVsXG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQkMSAodGFnTmFtZSwgdm5vZGUpIHtcbiAgdmFyIGVsbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gIGlmICh0YWdOYW1lICE9PSAnc2VsZWN0Jykge1xuICAgIHJldHVybiBlbG1cbiAgfVxuICAvLyBmYWxzZSBvciBudWxsIHdpbGwgcmVtb3ZlIHRoZSBhdHRyaWJ1dGUgYnV0IHVuZGVmaW5lZCB3aWxsIG5vdFxuICBpZiAodm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLmF0dHJzICYmIHZub2RlLmRhdGEuYXR0cnMubXVsdGlwbGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGVsbS5zZXRBdHRyaWJ1dGUoJ211bHRpcGxlJywgJ211bHRpcGxlJyk7XG4gIH1cbiAgcmV0dXJuIGVsbVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMgKG5hbWVzcGFjZSwgdGFnTmFtZSkge1xuICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZU1hcFtuYW1lc3BhY2VdLCB0YWdOYW1lKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVUZXh0Tm9kZSAodGV4dCkge1xuICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dClcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29tbWVudCAodGV4dCkge1xuICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KVxufVxuXG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUgKHBhcmVudE5vZGUsIG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpIHtcbiAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmZXJlbmNlTm9kZSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkIChub2RlLCBjaGlsZCkge1xuICBub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kQ2hpbGQgKG5vZGUsIGNoaWxkKSB7XG4gIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpO1xufVxuXG5mdW5jdGlvbiBwYXJlbnROb2RlIChub2RlKSB7XG4gIHJldHVybiBub2RlLnBhcmVudE5vZGVcbn1cblxuZnVuY3Rpb24gbmV4dFNpYmxpbmcgKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmdcbn1cblxuZnVuY3Rpb24gdGFnTmFtZSAobm9kZSkge1xuICByZXR1cm4gbm9kZS50YWdOYW1lXG59XG5cbmZ1bmN0aW9uIHNldFRleHRDb250ZW50IChub2RlLCB0ZXh0KSB7XG4gIG5vZGUudGV4dENvbnRlbnQgPSB0ZXh0O1xufVxuXG5mdW5jdGlvbiBzZXRTdHlsZVNjb3BlIChub2RlLCBzY29wZUlkKSB7XG4gIG5vZGUuc2V0QXR0cmlidXRlKHNjb3BlSWQsICcnKTtcbn1cblxuXG52YXIgbm9kZU9wcyA9IE9iamVjdC5mcmVlemUoe1xuXHRjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50JDEsXG5cdGNyZWF0ZUVsZW1lbnROUzogY3JlYXRlRWxlbWVudE5TLFxuXHRjcmVhdGVUZXh0Tm9kZTogY3JlYXRlVGV4dE5vZGUsXG5cdGNyZWF0ZUNvbW1lbnQ6IGNyZWF0ZUNvbW1lbnQsXG5cdGluc2VydEJlZm9yZTogaW5zZXJ0QmVmb3JlLFxuXHRyZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsXG5cdGFwcGVuZENoaWxkOiBhcHBlbmRDaGlsZCxcblx0cGFyZW50Tm9kZTogcGFyZW50Tm9kZSxcblx0bmV4dFNpYmxpbmc6IG5leHRTaWJsaW5nLFxuXHR0YWdOYW1lOiB0YWdOYW1lLFxuXHRzZXRUZXh0Q29udGVudDogc2V0VGV4dENvbnRlbnQsXG5cdHNldFN0eWxlU2NvcGU6IHNldFN0eWxlU2NvcGVcbn0pO1xuXG4vKiAgKi9cblxudmFyIHJlZiA9IHtcbiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUgKF8sIHZub2RlKSB7XG4gICAgcmVnaXN0ZXJSZWYodm5vZGUpO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7XG4gICAgaWYgKG9sZFZub2RlLmRhdGEucmVmICE9PSB2bm9kZS5kYXRhLnJlZikge1xuICAgICAgcmVnaXN0ZXJSZWYob2xkVm5vZGUsIHRydWUpO1xuICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpO1xuICAgIH1cbiAgfSxcbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHtcbiAgICByZWdpc3RlclJlZih2bm9kZSwgdHJ1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJSZWYgKHZub2RlLCBpc1JlbW92YWwpIHtcbiAgdmFyIGtleSA9IHZub2RlLmRhdGEucmVmO1xuICBpZiAoIWlzRGVmKGtleSkpIHsgcmV0dXJuIH1cblxuICB2YXIgdm0gPSB2bm9kZS5jb250ZXh0O1xuICB2YXIgcmVmID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgfHwgdm5vZGUuZWxtO1xuICB2YXIgcmVmcyA9IHZtLiRyZWZzO1xuICBpZiAoaXNSZW1vdmFsKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVmc1trZXldKSkge1xuICAgICAgcmVtb3ZlKHJlZnNba2V5XSwgcmVmKTtcbiAgICB9IGVsc2UgaWYgKHJlZnNba2V5XSA9PT0gcmVmKSB7XG4gICAgICByZWZzW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh2bm9kZS5kYXRhLnJlZkluRm9yKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVmc1trZXldKSkge1xuICAgICAgICByZWZzW2tleV0gPSBbcmVmXTtcbiAgICAgIH0gZWxzZSBpZiAocmVmc1trZXldLmluZGV4T2YocmVmKSA8IDApIHtcbiAgICAgICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgICAgIHJlZnNba2V5XS5wdXNoKHJlZik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZnNba2V5XSA9IHJlZjtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWaXJ0dWFsIERPTSBwYXRjaGluZyBhbGdvcml0aG0gYmFzZWQgb24gU25hYmJkb20gYnlcbiAqIFNpbW9uIEZyaWlzIFZpbmR1bSAoQHBhbGRlcGluZClcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICogaHR0cHM6Ly9naXRodWIuY29tL3BhbGRlcGluZC9zbmFiYmRvbS9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKlxuICogbW9kaWZpZWQgYnkgRXZhbiBZb3UgKEB5eXg5OTA4MDMpXG4gKlxuICogTm90IHR5cGUtY2hlY2tpbmcgdGhpcyBiZWNhdXNlIHRoaXMgZmlsZSBpcyBwZXJmLWNyaXRpY2FsIGFuZCB0aGUgY29zdFxuICogb2YgbWFraW5nIGZsb3cgdW5kZXJzdGFuZCBpdCBpcyBub3Qgd29ydGggaXQuXG4gKi9cblxudmFyIGVtcHR5Tm9kZSA9IG5ldyBWTm9kZSgnJywge30sIFtdKTtcblxudmFyIGhvb2tzID0gWydjcmVhdGUnLCAnYWN0aXZhdGUnLCAndXBkYXRlJywgJ3JlbW92ZScsICdkZXN0cm95J107XG5cbmZ1bmN0aW9uIHNhbWVWbm9kZSAoYSwgYikge1xuICByZXR1cm4gKFxuICAgIGEua2V5ID09PSBiLmtleSAmJiAoXG4gICAgICAoXG4gICAgICAgIGEudGFnID09PSBiLnRhZyAmJlxuICAgICAgICBhLmlzQ29tbWVudCA9PT0gYi5pc0NvbW1lbnQgJiZcbiAgICAgICAgaXNEZWYoYS5kYXRhKSA9PT0gaXNEZWYoYi5kYXRhKSAmJlxuICAgICAgICBzYW1lSW5wdXRUeXBlKGEsIGIpXG4gICAgICApIHx8IChcbiAgICAgICAgaXNUcnVlKGEuaXNBc3luY1BsYWNlaG9sZGVyKSAmJlxuICAgICAgICBhLmFzeW5jRmFjdG9yeSA9PT0gYi5hc3luY0ZhY3RvcnkgJiZcbiAgICAgICAgaXNVbmRlZihiLmFzeW5jRmFjdG9yeS5lcnJvcilcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZnVuY3Rpb24gc2FtZUlucHV0VHlwZSAoYSwgYikge1xuICBpZiAoYS50YWcgIT09ICdpbnB1dCcpIHsgcmV0dXJuIHRydWUgfVxuICB2YXIgaTtcbiAgdmFyIHR5cGVBID0gaXNEZWYoaSA9IGEuZGF0YSkgJiYgaXNEZWYoaSA9IGkuYXR0cnMpICYmIGkudHlwZTtcbiAgdmFyIHR5cGVCID0gaXNEZWYoaSA9IGIuZGF0YSkgJiYgaXNEZWYoaSA9IGkuYXR0cnMpICYmIGkudHlwZTtcbiAgcmV0dXJuIHR5cGVBID09PSB0eXBlQiB8fCBpc1RleHRJbnB1dFR5cGUodHlwZUEpICYmIGlzVGV4dElucHV0VHlwZSh0eXBlQilcbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5VG9PbGRJZHggKGNoaWxkcmVuLCBiZWdpbklkeCwgZW5kSWR4KSB7XG4gIHZhciBpLCBrZXk7XG4gIHZhciBtYXAgPSB7fTtcbiAgZm9yIChpID0gYmVnaW5JZHg7IGkgPD0gZW5kSWR4OyArK2kpIHtcbiAgICBrZXkgPSBjaGlsZHJlbltpXS5rZXk7XG4gICAgaWYgKGlzRGVmKGtleSkpIHsgbWFwW2tleV0gPSBpOyB9XG4gIH1cbiAgcmV0dXJuIG1hcFxufVxuXG5mdW5jdGlvbiBjcmVhdGVQYXRjaEZ1bmN0aW9uIChiYWNrZW5kKSB7XG4gIHZhciBpLCBqO1xuICB2YXIgY2JzID0ge307XG5cbiAgdmFyIG1vZHVsZXMgPSBiYWNrZW5kLm1vZHVsZXM7XG4gIHZhciBub2RlT3BzID0gYmFja2VuZC5ub2RlT3BzO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkge1xuICAgIGNic1tob29rc1tpXV0gPSBbXTtcbiAgICBmb3IgKGogPSAwOyBqIDwgbW9kdWxlcy5sZW5ndGg7ICsraikge1xuICAgICAgaWYgKGlzRGVmKG1vZHVsZXNbal1baG9va3NbaV1dKSkge1xuICAgICAgICBjYnNbaG9va3NbaV1dLnB1c2gobW9kdWxlc1tqXVtob29rc1tpXV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVtcHR5Tm9kZUF0IChlbG0pIHtcbiAgICByZXR1cm4gbmV3IFZOb2RlKG5vZGVPcHMudGFnTmFtZShlbG0pLnRvTG93ZXJDYXNlKCksIHt9LCBbXSwgdW5kZWZpbmVkLCBlbG0pXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVSbUNiIChjaGlsZEVsbSwgbGlzdGVuZXJzKSB7XG4gICAgZnVuY3Rpb24gcmVtb3ZlICgpIHtcbiAgICAgIGlmICgtLXJlbW92ZS5saXN0ZW5lcnMgPT09IDApIHtcbiAgICAgICAgcmVtb3ZlTm9kZShjaGlsZEVsbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlbW92ZS5saXN0ZW5lcnMgPSBsaXN0ZW5lcnM7XG4gICAgcmV0dXJuIHJlbW92ZVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlTm9kZSAoZWwpIHtcbiAgICB2YXIgcGFyZW50ID0gbm9kZU9wcy5wYXJlbnROb2RlKGVsKTtcbiAgICAvLyBlbGVtZW50IG1heSBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGR1ZSB0byB2LWh0bWwgLyB2LXRleHRcbiAgICBpZiAoaXNEZWYocGFyZW50KSkge1xuICAgICAgbm9kZU9wcy5yZW1vdmVDaGlsZChwYXJlbnQsIGVsKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1Vua25vd25FbGVtZW50JCQxICh2bm9kZSwgaW5WUHJlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICFpblZQcmUgJiZcbiAgICAgICF2bm9kZS5ucyAmJlxuICAgICAgIShcbiAgICAgICAgY29uZmlnLmlnbm9yZWRFbGVtZW50cy5sZW5ndGggJiZcbiAgICAgICAgY29uZmlnLmlnbm9yZWRFbGVtZW50cy5zb21lKGZ1bmN0aW9uIChpZ25vcmUpIHtcbiAgICAgICAgICByZXR1cm4gaXNSZWdFeHAoaWdub3JlKVxuICAgICAgICAgICAgPyBpZ25vcmUudGVzdCh2bm9kZS50YWcpXG4gICAgICAgICAgICA6IGlnbm9yZSA9PT0gdm5vZGUudGFnXG4gICAgICAgIH0pXG4gICAgICApICYmXG4gICAgICBjb25maWcuaXNVbmtub3duRWxlbWVudCh2bm9kZS50YWcpXG4gICAgKVxuICB9XG5cbiAgdmFyIGNyZWF0aW5nRWxtSW5WUHJlID0gMDtcblxuICBmdW5jdGlvbiBjcmVhdGVFbG0gKFxuICAgIHZub2RlLFxuICAgIGluc2VydGVkVm5vZGVRdWV1ZSxcbiAgICBwYXJlbnRFbG0sXG4gICAgcmVmRWxtLFxuICAgIG5lc3RlZCxcbiAgICBvd25lckFycmF5LFxuICAgIGluZGV4XG4gICkge1xuICAgIGlmIChpc0RlZih2bm9kZS5lbG0pICYmIGlzRGVmKG93bmVyQXJyYXkpKSB7XG4gICAgICAvLyBUaGlzIHZub2RlIHdhcyB1c2VkIGluIGEgcHJldmlvdXMgcmVuZGVyIVxuICAgICAgLy8gbm93IGl0J3MgdXNlZCBhcyBhIG5ldyBub2RlLCBvdmVyd3JpdGluZyBpdHMgZWxtIHdvdWxkIGNhdXNlXG4gICAgICAvLyBwb3RlbnRpYWwgcGF0Y2ggZXJyb3JzIGRvd24gdGhlIHJvYWQgd2hlbiBpdCdzIHVzZWQgYXMgYW4gaW5zZXJ0aW9uXG4gICAgICAvLyByZWZlcmVuY2Ugbm9kZS4gSW5zdGVhZCwgd2UgY2xvbmUgdGhlIG5vZGUgb24tZGVtYW5kIGJlZm9yZSBjcmVhdGluZ1xuICAgICAgLy8gYXNzb2NpYXRlZCBET00gZWxlbWVudCBmb3IgaXQuXG4gICAgICB2bm9kZSA9IG93bmVyQXJyYXlbaW5kZXhdID0gY2xvbmVWTm9kZSh2bm9kZSk7XG4gICAgfVxuXG4gICAgdm5vZGUuaXNSb290SW5zZXJ0ID0gIW5lc3RlZDsgLy8gZm9yIHRyYW5zaXRpb24gZW50ZXIgY2hlY2tcbiAgICBpZiAoY3JlYXRlQ29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIHZhciBjaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuO1xuICAgIHZhciB0YWcgPSB2bm9kZS50YWc7XG4gICAgaWYgKGlzRGVmKHRhZykpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEucHJlKSB7XG4gICAgICAgICAgY3JlYXRpbmdFbG1JblZQcmUrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNVbmtub3duRWxlbWVudCQkMSh2bm9kZSwgY3JlYXRpbmdFbG1JblZQcmUpKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgICdVbmtub3duIGN1c3RvbSBlbGVtZW50OiA8JyArIHRhZyArICc+IC0gZGlkIHlvdSAnICtcbiAgICAgICAgICAgICdyZWdpc3RlciB0aGUgY29tcG9uZW50IGNvcnJlY3RseT8gRm9yIHJlY3Vyc2l2ZSBjb21wb25lbnRzLCAnICtcbiAgICAgICAgICAgICdtYWtlIHN1cmUgdG8gcHJvdmlkZSB0aGUgXCJuYW1lXCIgb3B0aW9uLicsXG4gICAgICAgICAgICB2bm9kZS5jb250ZXh0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2bm9kZS5lbG0gPSB2bm9kZS5uc1xuICAgICAgICA/IG5vZGVPcHMuY3JlYXRlRWxlbWVudE5TKHZub2RlLm5zLCB0YWcpXG4gICAgICAgIDogbm9kZU9wcy5jcmVhdGVFbGVtZW50KHRhZywgdm5vZGUpO1xuICAgICAgc2V0U2NvcGUodm5vZGUpO1xuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIHtcbiAgICAgICAgY3JlYXRlQ2hpbGRyZW4odm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgICBpbnNlcnQocGFyZW50RWxtLCB2bm9kZS5lbG0sIHJlZkVsbSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRhdGEgJiYgZGF0YS5wcmUpIHtcbiAgICAgICAgY3JlYXRpbmdFbG1JblZQcmUtLTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpKSB7XG4gICAgICB2bm9kZS5lbG0gPSBub2RlT3BzLmNyZWF0ZUNvbW1lbnQodm5vZGUudGV4dCk7XG4gICAgICBpbnNlcnQocGFyZW50RWxtLCB2bm9kZS5lbG0sIHJlZkVsbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZub2RlLmVsbSA9IG5vZGVPcHMuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCk7XG4gICAgICBpbnNlcnQocGFyZW50RWxtLCB2bm9kZS5lbG0sIHJlZkVsbSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkge1xuICAgIHZhciBpID0gdm5vZGUuZGF0YTtcbiAgICBpZiAoaXNEZWYoaSkpIHtcbiAgICAgIHZhciBpc1JlYWN0aXZhdGVkID0gaXNEZWYodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpICYmIGkua2VlcEFsaXZlO1xuICAgICAgaWYgKGlzRGVmKGkgPSBpLmhvb2spICYmIGlzRGVmKGkgPSBpLmluaXQpKSB7XG4gICAgICAgIGkodm5vZGUsIGZhbHNlIC8qIGh5ZHJhdGluZyAqLywgcGFyZW50RWxtLCByZWZFbG0pO1xuICAgICAgfVxuICAgICAgLy8gYWZ0ZXIgY2FsbGluZyB0aGUgaW5pdCBob29rLCBpZiB0aGUgdm5vZGUgaXMgYSBjaGlsZCBjb21wb25lbnRcbiAgICAgIC8vIGl0IHNob3VsZCd2ZSBjcmVhdGVkIGEgY2hpbGQgaW5zdGFuY2UgYW5kIG1vdW50ZWQgaXQuIHRoZSBjaGlsZFxuICAgICAgLy8gY29tcG9uZW50IGFsc28gaGFzIHNldCB0aGUgcGxhY2Vob2xkZXIgdm5vZGUncyBlbG0uXG4gICAgICAvLyBpbiB0aGF0IGNhc2Ugd2UgY2FuIGp1c3QgcmV0dXJuIHRoZSBlbGVtZW50IGFuZCBiZSBkb25lLlxuICAgICAgaWYgKGlzRGVmKHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSkge1xuICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICBpZiAoaXNUcnVlKGlzUmVhY3RpdmF0ZWQpKSB7XG4gICAgICAgICAgcmVhY3RpdmF0ZUNvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0Q29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7XG4gICAgaWYgKGlzRGVmKHZub2RlLmRhdGEucGVuZGluZ0luc2VydCkpIHtcbiAgICAgIGluc2VydGVkVm5vZGVRdWV1ZS5wdXNoLmFwcGx5KGluc2VydGVkVm5vZGVRdWV1ZSwgdm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KTtcbiAgICAgIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCA9IG51bGw7XG4gICAgfVxuICAgIHZub2RlLmVsbSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlLiRlbDtcbiAgICBpZiAoaXNQYXRjaGFibGUodm5vZGUpKSB7XG4gICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgIHNldFNjb3BlKHZub2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZW1wdHkgY29tcG9uZW50IHJvb3QuXG4gICAgICAvLyBza2lwIGFsbCBlbGVtZW50LXJlbGF0ZWQgbW9kdWxlcyBleGNlcHQgZm9yIHJlZiAoIzM0NTUpXG4gICAgICByZWdpc3RlclJlZih2bm9kZSk7XG4gICAgICAvLyBtYWtlIHN1cmUgdG8gaW52b2tlIHRoZSBpbnNlcnQgaG9va1xuICAgICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLnB1c2godm5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWN0aXZhdGVDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKSB7XG4gICAgdmFyIGk7XG4gICAgLy8gaGFjayBmb3IgIzQzMzk6IGEgcmVhY3RpdmF0ZWQgY29tcG9uZW50IHdpdGggaW5uZXIgdHJhbnNpdGlvblxuICAgIC8vIGRvZXMgbm90IHRyaWdnZXIgYmVjYXVzZSB0aGUgaW5uZXIgbm9kZSdzIGNyZWF0ZWQgaG9va3MgYXJlIG5vdCBjYWxsZWRcbiAgICAvLyBhZ2Fpbi4gSXQncyBub3QgaWRlYWwgdG8gaW52b2x2ZSBtb2R1bGUtc3BlY2lmaWMgbG9naWMgaW4gaGVyZSBidXRcbiAgICAvLyB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIGl0LlxuICAgIHZhciBpbm5lck5vZGUgPSB2bm9kZTtcbiAgICB3aGlsZSAoaW5uZXJOb2RlLmNvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgICBpbm5lck5vZGUgPSBpbm5lck5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO1xuICAgICAgaWYgKGlzRGVmKGkgPSBpbm5lck5vZGUuZGF0YSkgJiYgaXNEZWYoaSA9IGkudHJhbnNpdGlvbikpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5hY3RpdmF0ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGNicy5hY3RpdmF0ZVtpXShlbXB0eU5vZGUsIGlubmVyTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLnB1c2goaW5uZXJOb2RlKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdW5saWtlIGEgbmV3bHkgY3JlYXRlZCBjb21wb25lbnQsXG4gICAgLy8gYSByZWFjdGl2YXRlZCBrZWVwLWFsaXZlIGNvbXBvbmVudCBkb2Vzbid0IGluc2VydCBpdHNlbGZcbiAgICBpbnNlcnQocGFyZW50RWxtLCB2bm9kZS5lbG0sIHJlZkVsbSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnQgKHBhcmVudCwgZWxtLCByZWYkJDEpIHtcbiAgICBpZiAoaXNEZWYocGFyZW50KSkge1xuICAgICAgaWYgKGlzRGVmKHJlZiQkMSkpIHtcbiAgICAgICAgaWYgKHJlZiQkMS5wYXJlbnROb2RlID09PSBwYXJlbnQpIHtcbiAgICAgICAgICBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnQsIGVsbSwgcmVmJCQxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZU9wcy5hcHBlbmRDaGlsZChwYXJlbnQsIGVsbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGRyZW4gKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBjaGVja0R1cGxpY2F0ZUtleXMoY2hpbGRyZW4pO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgICBjcmVhdGVFbG0oY2hpbGRyZW5baV0sIGluc2VydGVkVm5vZGVRdWV1ZSwgdm5vZGUuZWxtLCBudWxsLCB0cnVlLCBjaGlsZHJlbiwgaSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZSh2bm9kZS50ZXh0KSkge1xuICAgICAgbm9kZU9wcy5hcHBlbmRDaGlsZCh2bm9kZS5lbG0sIG5vZGVPcHMuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKHZub2RlLnRleHQpKSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNQYXRjaGFibGUgKHZub2RlKSB7XG4gICAgd2hpbGUgKHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgICB2bm9kZSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzRGVmKHZub2RlLnRhZylcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUNyZWF0ZUhvb2tzICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7XG4gICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgY2JzLmNyZWF0ZS5sZW5ndGg7ICsraSQxKSB7XG4gICAgICBjYnMuY3JlYXRlW2kkMV0oZW1wdHlOb2RlLCB2bm9kZSk7XG4gICAgfVxuICAgIGkgPSB2bm9kZS5kYXRhLmhvb2s7IC8vIFJldXNlIHZhcmlhYmxlXG4gICAgaWYgKGlzRGVmKGkpKSB7XG4gICAgICBpZiAoaXNEZWYoaS5jcmVhdGUpKSB7IGkuY3JlYXRlKGVtcHR5Tm9kZSwgdm5vZGUpOyB9XG4gICAgICBpZiAoaXNEZWYoaS5pbnNlcnQpKSB7IGluc2VydGVkVm5vZGVRdWV1ZS5wdXNoKHZub2RlKTsgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHNldCBzY29wZSBpZCBhdHRyaWJ1dGUgZm9yIHNjb3BlZCBDU1MuXG4gIC8vIHRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBzcGVjaWFsIGNhc2UgdG8gYXZvaWQgdGhlIG92ZXJoZWFkXG4gIC8vIG9mIGdvaW5nIHRocm91Z2ggdGhlIG5vcm1hbCBhdHRyaWJ1dGUgcGF0Y2hpbmcgcHJvY2Vzcy5cbiAgZnVuY3Rpb24gc2V0U2NvcGUgKHZub2RlKSB7XG4gICAgdmFyIGk7XG4gICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5mblNjb3BlSWQpKSB7XG4gICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFuY2VzdG9yID0gdm5vZGU7XG4gICAgICB3aGlsZSAoYW5jZXN0b3IpIHtcbiAgICAgICAgaWYgKGlzRGVmKGkgPSBhbmNlc3Rvci5jb250ZXh0KSAmJiBpc0RlZihpID0gaS4kb3B0aW9ucy5fc2NvcGVJZCkpIHtcbiAgICAgICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTtcbiAgICAgICAgfVxuICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZm9yIHNsb3QgY29udGVudCB0aGV5IHNob3VsZCBhbHNvIGdldCB0aGUgc2NvcGVJZCBmcm9tIHRoZSBob3N0IGluc3RhbmNlLlxuICAgIGlmIChpc0RlZihpID0gYWN0aXZlSW5zdGFuY2UpICYmXG4gICAgICBpICE9PSB2bm9kZS5jb250ZXh0ICYmXG4gICAgICBpICE9PSB2bm9kZS5mbkNvbnRleHQgJiZcbiAgICAgIGlzRGVmKGkgPSBpLiRvcHRpb25zLl9zY29wZUlkKVxuICAgICkge1xuICAgICAgbm9kZU9wcy5zZXRTdHlsZVNjb3BlKHZub2RlLmVsbSwgaSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYWRkVm5vZGVzIChwYXJlbnRFbG0sIHJlZkVsbSwgdm5vZGVzLCBzdGFydElkeCwgZW5kSWR4LCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7XG4gICAgICBjcmVhdGVFbG0odm5vZGVzW3N0YXJ0SWR4XSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSwgZmFsc2UsIHZub2Rlcywgc3RhcnRJZHgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZURlc3Ryb3lIb29rICh2bm9kZSkge1xuICAgIHZhciBpLCBqO1xuICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5kZXN0cm95KSkgeyBpKHZub2RlKTsgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSB7IGNicy5kZXN0cm95W2ldKHZub2RlKTsgfVxuICAgIH1cbiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNoaWxkcmVuKSkge1xuICAgICAgZm9yIChqID0gMDsgaiA8IHZub2RlLmNoaWxkcmVuLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIGludm9rZURlc3Ryb3lIb29rKHZub2RlLmNoaWxkcmVuW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVWbm9kZXMgKHBhcmVudEVsbSwgdm5vZGVzLCBzdGFydElkeCwgZW5kSWR4KSB7XG4gICAgZm9yICg7IHN0YXJ0SWR4IDw9IGVuZElkeDsgKytzdGFydElkeCkge1xuICAgICAgdmFyIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTtcbiAgICAgIGlmIChpc0RlZihjaCkpIHtcbiAgICAgICAgaWYgKGlzRGVmKGNoLnRhZykpIHtcbiAgICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGNoKTtcbiAgICAgICAgICBpbnZva2VEZXN0cm95SG9vayhjaCk7XG4gICAgICAgIH0gZWxzZSB7IC8vIFRleHQgbm9kZVxuICAgICAgICAgIHJlbW92ZU5vZGUoY2guZWxtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2sgKHZub2RlLCBybSkge1xuICAgIGlmIChpc0RlZihybSkgfHwgaXNEZWYodm5vZGUuZGF0YSkpIHtcbiAgICAgIHZhciBpO1xuICAgICAgdmFyIGxpc3RlbmVycyA9IGNicy5yZW1vdmUubGVuZ3RoICsgMTtcbiAgICAgIGlmIChpc0RlZihybSkpIHtcbiAgICAgICAgLy8gd2UgaGF2ZSBhIHJlY3Vyc2l2ZWx5IHBhc3NlZCBkb3duIHJtIGNhbGxiYWNrXG4gICAgICAgIC8vIGluY3JlYXNlIHRoZSBsaXN0ZW5lcnMgY291bnRcbiAgICAgICAgcm0ubGlzdGVuZXJzICs9IGxpc3RlbmVycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRpcmVjdGx5IHJlbW92aW5nXG4gICAgICAgIHJtID0gY3JlYXRlUm1DYih2bm9kZS5lbG0sIGxpc3RlbmVycyk7XG4gICAgICB9XG4gICAgICAvLyByZWN1cnNpdmVseSBpbnZva2UgaG9va3Mgb24gY2hpbGQgY29tcG9uZW50IHJvb3Qgbm9kZVxuICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkgJiYgaXNEZWYoaSA9IGkuX3Zub2RlKSAmJiBpc0RlZihpLmRhdGEpKSB7XG4gICAgICAgIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2soaSwgcm0pO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5yZW1vdmUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY2JzLnJlbW92ZVtpXSh2bm9kZSwgcm0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5kYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLnJlbW92ZSkpIHtcbiAgICAgICAgaSh2bm9kZSwgcm0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm0oKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlTm9kZSh2bm9kZS5lbG0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUNoaWxkcmVuIChwYXJlbnRFbG0sIG9sZENoLCBuZXdDaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KSB7XG4gICAgdmFyIG9sZFN0YXJ0SWR4ID0gMDtcbiAgICB2YXIgbmV3U3RhcnRJZHggPSAwO1xuICAgIHZhciBvbGRFbmRJZHggPSBvbGRDaC5sZW5ndGggLSAxO1xuICAgIHZhciBvbGRTdGFydFZub2RlID0gb2xkQ2hbMF07XG4gICAgdmFyIG9sZEVuZFZub2RlID0gb2xkQ2hbb2xkRW5kSWR4XTtcbiAgICB2YXIgbmV3RW5kSWR4ID0gbmV3Q2gubGVuZ3RoIC0gMTtcbiAgICB2YXIgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWzBdO1xuICAgIHZhciBuZXdFbmRWbm9kZSA9IG5ld0NoW25ld0VuZElkeF07XG4gICAgdmFyIG9sZEtleVRvSWR4LCBpZHhJbk9sZCwgdm5vZGVUb01vdmUsIHJlZkVsbTtcblxuICAgIC8vIHJlbW92ZU9ubHkgaXMgYSBzcGVjaWFsIGZsYWcgdXNlZCBvbmx5IGJ5IDx0cmFuc2l0aW9uLWdyb3VwPlxuICAgIC8vIHRvIGVuc3VyZSByZW1vdmVkIGVsZW1lbnRzIHN0YXkgaW4gY29ycmVjdCByZWxhdGl2ZSBwb3NpdGlvbnNcbiAgICAvLyBkdXJpbmcgbGVhdmluZyB0cmFuc2l0aW9uc1xuICAgIHZhciBjYW5Nb3ZlID0gIXJlbW92ZU9ubHk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY2hlY2tEdXBsaWNhdGVLZXlzKG5ld0NoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAob2xkU3RhcnRJZHggPD0gb2xkRW5kSWR4ICYmIG5ld1N0YXJ0SWR4IDw9IG5ld0VuZElkeCkge1xuICAgICAgaWYgKGlzVW5kZWYob2xkU3RhcnRWbm9kZSkpIHtcbiAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdOyAvLyBWbm9kZSBoYXMgYmVlbiBtb3ZlZCBsZWZ0XG4gICAgICB9IGVsc2UgaWYgKGlzVW5kZWYob2xkRW5kVm5vZGUpKSB7XG4gICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSkpIHtcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07XG4gICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZEVuZFZub2RlLCBuZXdFbmRWbm9kZSkpIHtcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICBuZXdFbmRWbm9kZSA9IG5ld0NoWy0tbmV3RW5kSWR4XTtcbiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkgeyAvLyBWbm9kZSBtb3ZlZCByaWdodFxuICAgICAgICBwYXRjaFZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICBjYW5Nb3ZlICYmIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgb2xkU3RhcnRWbm9kZS5lbG0sIG5vZGVPcHMubmV4dFNpYmxpbmcob2xkRW5kVm5vZGUuZWxtKSk7XG4gICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTtcbiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07XG4gICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3U3RhcnRWbm9kZSkpIHsgLy8gVm5vZGUgbW92ZWQgbGVmdFxuICAgICAgICBwYXRjaFZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICBjYW5Nb3ZlICYmIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgb2xkRW5kVm5vZGUuZWxtLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNVbmRlZihvbGRLZXlUb0lkeCkpIHsgb2xkS2V5VG9JZHggPSBjcmVhdGVLZXlUb09sZElkeChvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7IH1cbiAgICAgICAgaWR4SW5PbGQgPSBpc0RlZihuZXdTdGFydFZub2RlLmtleSlcbiAgICAgICAgICA/IG9sZEtleVRvSWR4W25ld1N0YXJ0Vm5vZGUua2V5XVxuICAgICAgICAgIDogZmluZElkeEluT2xkKG5ld1N0YXJ0Vm5vZGUsIG9sZENoLCBvbGRTdGFydElkeCwgb2xkRW5kSWR4KTtcbiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50XG4gICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgZmFsc2UsIG5ld0NoLCBuZXdTdGFydElkeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdm5vZGVUb01vdmUgPSBvbGRDaFtpZHhJbk9sZF07XG4gICAgICAgICAgaWYgKHNhbWVWbm9kZSh2bm9kZVRvTW92ZSwgbmV3U3RhcnRWbm9kZSkpIHtcbiAgICAgICAgICAgIHBhdGNoVm5vZGUodm5vZGVUb01vdmUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICBvbGRDaFtpZHhJbk9sZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjYW5Nb3ZlICYmIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgdm5vZGVUb01vdmUuZWxtLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNhbWUga2V5IGJ1dCBkaWZmZXJlbnQgZWxlbWVudC4gdHJlYXQgYXMgbmV3IGVsZW1lbnRcbiAgICAgICAgICAgIGNyZWF0ZUVsbShuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgb2xkU3RhcnRWbm9kZS5lbG0sIGZhbHNlLCBuZXdDaCwgbmV3U3RhcnRJZHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvbGRTdGFydElkeCA+IG9sZEVuZElkeCkge1xuICAgICAgcmVmRWxtID0gaXNVbmRlZihuZXdDaFtuZXdFbmRJZHggKyAxXSkgPyBudWxsIDogbmV3Q2hbbmV3RW5kSWR4ICsgMV0uZWxtO1xuICAgICAgYWRkVm5vZGVzKHBhcmVudEVsbSwgcmVmRWxtLCBuZXdDaCwgbmV3U3RhcnRJZHgsIG5ld0VuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICB9IGVsc2UgaWYgKG5ld1N0YXJ0SWR4ID4gbmV3RW5kSWR4KSB7XG4gICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tEdXBsaWNhdGVLZXlzIChjaGlsZHJlbikge1xuICAgIHZhciBzZWVuS2V5cyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2bm9kZSA9IGNoaWxkcmVuW2ldO1xuICAgICAgdmFyIGtleSA9IHZub2RlLmtleTtcbiAgICAgIGlmIChpc0RlZihrZXkpKSB7XG4gICAgICAgIGlmIChzZWVuS2V5c1trZXldKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIChcIkR1cGxpY2F0ZSBrZXlzIGRldGVjdGVkOiAnXCIgKyBrZXkgKyBcIicuIFRoaXMgbWF5IGNhdXNlIGFuIHVwZGF0ZSBlcnJvci5cIiksXG4gICAgICAgICAgICB2bm9kZS5jb250ZXh0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWVuS2V5c1trZXldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRJZHhJbk9sZCAobm9kZSwgb2xkQ2gsIHN0YXJ0LCBlbmQpIHtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgdmFyIGMgPSBvbGRDaFtpXTtcbiAgICAgIGlmIChpc0RlZihjKSAmJiBzYW1lVm5vZGUobm9kZSwgYykpIHsgcmV0dXJuIGkgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhdGNoVm5vZGUgKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KSB7XG4gICAgaWYgKG9sZFZub2RlID09PSB2bm9kZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGVsbSA9IHZub2RlLmVsbSA9IG9sZFZub2RlLmVsbTtcblxuICAgIGlmIChpc1RydWUob2xkVm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyKSkge1xuICAgICAgaWYgKGlzRGVmKHZub2RlLmFzeW5jRmFjdG9yeS5yZXNvbHZlZCkpIHtcbiAgICAgICAgaHlkcmF0ZShvbGRWbm9kZS5lbG0sIHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHJldXNlIGVsZW1lbnQgZm9yIHN0YXRpYyB0cmVlcy5cbiAgICAvLyBub3RlIHdlIG9ubHkgZG8gdGhpcyBpZiB0aGUgdm5vZGUgaXMgY2xvbmVkIC1cbiAgICAvLyBpZiB0aGUgbmV3IG5vZGUgaXMgbm90IGNsb25lZCBpdCBtZWFucyB0aGUgcmVuZGVyIGZ1bmN0aW9ucyBoYXZlIGJlZW5cbiAgICAvLyByZXNldCBieSB0aGUgaG90LXJlbG9hZC1hcGkgYW5kIHdlIG5lZWQgdG8gZG8gYSBwcm9wZXIgcmUtcmVuZGVyLlxuICAgIGlmIChpc1RydWUodm5vZGUuaXNTdGF0aWMpICYmXG4gICAgICBpc1RydWUob2xkVm5vZGUuaXNTdGF0aWMpICYmXG4gICAgICB2bm9kZS5rZXkgPT09IG9sZFZub2RlLmtleSAmJlxuICAgICAgKGlzVHJ1ZSh2bm9kZS5pc0Nsb25lZCkgfHwgaXNUcnVlKHZub2RlLmlzT25jZSkpXG4gICAgKSB7XG4gICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlO1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGk7XG4gICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wcmVwYXRjaCkpIHtcbiAgICAgIGkob2xkVm5vZGUsIHZub2RlKTtcbiAgICB9XG5cbiAgICB2YXIgb2xkQ2ggPSBvbGRWbm9kZS5jaGlsZHJlbjtcbiAgICB2YXIgY2ggPSB2bm9kZS5jaGlsZHJlbjtcbiAgICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNQYXRjaGFibGUodm5vZGUpKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnVwZGF0ZS5sZW5ndGg7ICsraSkgeyBjYnMudXBkYXRlW2ldKG9sZFZub2RlLCB2bm9kZSk7IH1cbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS51cGRhdGUpKSB7IGkob2xkVm5vZGUsIHZub2RlKTsgfVxuICAgIH1cbiAgICBpZiAoaXNVbmRlZih2bm9kZS50ZXh0KSkge1xuICAgICAgaWYgKGlzRGVmKG9sZENoKSAmJiBpc0RlZihjaCkpIHtcbiAgICAgICAgaWYgKG9sZENoICE9PSBjaCkgeyB1cGRhdGVDaGlsZHJlbihlbG0sIG9sZENoLCBjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsgfVxuICAgICAgfSBlbHNlIGlmIChpc0RlZihjaCkpIHtcbiAgICAgICAgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7IG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCAnJyk7IH1cbiAgICAgICAgYWRkVm5vZGVzKGVsbSwgbnVsbCwgY2gsIDAsIGNoLmxlbmd0aCAtIDEsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZENoKSkge1xuICAgICAgICByZW1vdmVWbm9kZXMoZWxtLCBvbGRDaCwgMCwgb2xkQ2gubGVuZ3RoIC0gMSk7XG4gICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7XG4gICAgICAgIG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCAnJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvbGRWbm9kZS50ZXh0ICE9PSB2bm9kZS50ZXh0KSB7XG4gICAgICBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgdm5vZGUudGV4dCk7XG4gICAgfVxuICAgIGlmIChpc0RlZihkYXRhKSkge1xuICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLnBvc3RwYXRjaCkpIHsgaShvbGRWbm9kZSwgdm5vZGUpOyB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlSW5zZXJ0SG9vayAodm5vZGUsIHF1ZXVlLCBpbml0aWFsKSB7XG4gICAgLy8gZGVsYXkgaW5zZXJ0IGhvb2tzIGZvciBjb21wb25lbnQgcm9vdCBub2RlcywgaW52b2tlIHRoZW0gYWZ0ZXIgdGhlXG4gICAgLy8gZWxlbWVudCBpcyByZWFsbHkgaW5zZXJ0ZWRcbiAgICBpZiAoaXNUcnVlKGluaXRpYWwpICYmIGlzRGVmKHZub2RlLnBhcmVudCkpIHtcbiAgICAgIHZub2RlLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQgPSBxdWV1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBxdWV1ZVtpXS5kYXRhLmhvb2suaW5zZXJ0KHF1ZXVlW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgaHlkcmF0aW9uQmFpbGVkID0gZmFsc2U7XG4gIC8vIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGNhbiBza2lwIGNyZWF0ZSBob29rIGR1cmluZyBoeWRyYXRpb24gYmVjYXVzZSB0aGV5XG4gIC8vIGFyZSBhbHJlYWR5IHJlbmRlcmVkIG9uIHRoZSBjbGllbnQgb3IgaGFzIG5vIG5lZWQgZm9yIGluaXRpYWxpemF0aW9uXG4gIC8vIE5vdGU6IHN0eWxlIGlzIGV4Y2x1ZGVkIGJlY2F1c2UgaXQgcmVsaWVzIG9uIGluaXRpYWwgY2xvbmUgZm9yIGZ1dHVyZVxuICAvLyBkZWVwIHVwZGF0ZXMgKCM3MDYzKS5cbiAgdmFyIGlzUmVuZGVyZWRNb2R1bGUgPSBtYWtlTWFwKCdhdHRycyxjbGFzcyxzdGF0aWNDbGFzcyxzdGF0aWNTdHlsZSxrZXknKTtcblxuICAvLyBOb3RlOiB0aGlzIGlzIGEgYnJvd3Nlci1vbmx5IGZ1bmN0aW9uIHNvIHdlIGNhbiBhc3N1bWUgZWxtcyBhcmUgRE9NIG5vZGVzLlxuICBmdW5jdGlvbiBoeWRyYXRlIChlbG0sIHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIGluVlByZSkge1xuICAgIHZhciBpO1xuICAgIHZhciB0YWcgPSB2bm9kZS50YWc7XG4gICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIHZhciBjaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuO1xuICAgIGluVlByZSA9IGluVlByZSB8fCAoZGF0YSAmJiBkYXRhLnByZSk7XG4gICAgdm5vZGUuZWxtID0gZWxtO1xuXG4gICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpICYmIGlzRGVmKHZub2RlLmFzeW5jRmFjdG9yeSkpIHtcbiAgICAgIHZub2RlLmlzQXN5bmNQbGFjZWhvbGRlciA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBhc3NlcnQgbm9kZSBtYXRjaFxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoIWFzc2VydE5vZGVNYXRjaChlbG0sIHZub2RlLCBpblZQcmUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkgeyBpKHZub2RlLCB0cnVlIC8qIGh5ZHJhdGluZyAqLyk7IH1cbiAgICAgIGlmIChpc0RlZihpID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UpKSB7XG4gICAgICAgIC8vIGNoaWxkIGNvbXBvbmVudC4gaXQgc2hvdWxkIGhhdmUgaHlkcmF0ZWQgaXRzIG93biB0cmVlLlxuICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNEZWYodGFnKSkge1xuICAgICAgaWYgKGlzRGVmKGNoaWxkcmVuKSkge1xuICAgICAgICAvLyBlbXB0eSBlbGVtZW50LCBhbGxvdyBjbGllbnQgdG8gcGljayB1cCBhbmQgcG9wdWxhdGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKCFlbG0uaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgY3JlYXRlQ2hpbGRyZW4odm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHYtaHRtbCBhbmQgZG9tUHJvcHM6IGlubmVySFRNTFxuICAgICAgICAgIGlmIChpc0RlZihpID0gZGF0YSkgJiYgaXNEZWYoaSA9IGkuZG9tUHJvcHMpICYmIGlzRGVmKGkgPSBpLmlubmVySFRNTCkpIHtcbiAgICAgICAgICAgIGlmIChpICE9PSBlbG0uaW5uZXJIVE1MKSB7XG4gICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICFoeWRyYXRpb25CYWlsZWRcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaHlkcmF0aW9uQmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1BhcmVudDogJywgZWxtKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3NlcnZlciBpbm5lckhUTUw6ICcsIGkpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignY2xpZW50IGlubmVySFRNTDogJywgZWxtLmlubmVySFRNTCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGl0ZXJhdGUgYW5kIGNvbXBhcmUgY2hpbGRyZW4gbGlzdHNcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbk1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBjaGlsZE5vZGUgPSBlbG0uZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNoaWxkcmVuLmxlbmd0aDsgaSQxKyspIHtcbiAgICAgICAgICAgICAgaWYgKCFjaGlsZE5vZGUgfHwgIWh5ZHJhdGUoY2hpbGROb2RlLCBjaGlsZHJlbltpJDFdLCBpbnNlcnRlZFZub2RlUXVldWUsIGluVlByZSkpIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbk1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiBjaGlsZE5vZGUgaXMgbm90IG51bGwsIGl0IG1lYW5zIHRoZSBhY3R1YWwgY2hpbGROb2RlcyBsaXN0IGlzXG4gICAgICAgICAgICAvLyBsb25nZXIgdGhhbiB0aGUgdmlydHVhbCBjaGlsZHJlbiBsaXN0LlxuICAgICAgICAgICAgaWYgKCFjaGlsZHJlbk1hdGNoIHx8IGNoaWxkTm9kZSkge1xuICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAhaHlkcmF0aW9uQmFpbGVkXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGh5ZHJhdGlvbkJhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaXNtYXRjaGluZyBjaGlsZE5vZGVzIHZzLiBWTm9kZXM6ICcsIGVsbS5jaGlsZE5vZGVzLCBjaGlsZHJlbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgICAgdmFyIGZ1bGxJbnZva2UgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICBpZiAoIWlzUmVuZGVyZWRNb2R1bGUoa2V5KSkge1xuICAgICAgICAgICAgZnVsbEludm9rZSA9IHRydWU7XG4gICAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZnVsbEludm9rZSAmJiBkYXRhWydjbGFzcyddKSB7XG4gICAgICAgICAgLy8gZW5zdXJlIGNvbGxlY3RpbmcgZGVwcyBmb3IgZGVlcCBjbGFzcyBiaW5kaW5ncyBmb3IgZnV0dXJlIHVwZGF0ZXNcbiAgICAgICAgICB0cmF2ZXJzZShkYXRhWydjbGFzcyddKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZWxtLmRhdGEgIT09IHZub2RlLnRleHQpIHtcbiAgICAgIGVsbS5kYXRhID0gdm5vZGUudGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzc2VydE5vZGVNYXRjaCAobm9kZSwgdm5vZGUsIGluVlByZSkge1xuICAgIGlmIChpc0RlZih2bm9kZS50YWcpKSB7XG4gICAgICByZXR1cm4gdm5vZGUudGFnLmluZGV4T2YoJ3Z1ZS1jb21wb25lbnQnKSA9PT0gMCB8fCAoXG4gICAgICAgICFpc1Vua25vd25FbGVtZW50JCQxKHZub2RlLCBpblZQcmUpICYmXG4gICAgICAgIHZub2RlLnRhZy50b0xvd2VyQ2FzZSgpID09PSAobm9kZS50YWdOYW1lICYmIG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gKHZub2RlLmlzQ29tbWVudCA/IDggOiAzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBwYXRjaCAob2xkVm5vZGUsIHZub2RlLCBoeWRyYXRpbmcsIHJlbW92ZU9ubHksIHBhcmVudEVsbSwgcmVmRWxtKSB7XG4gICAgaWYgKGlzVW5kZWYodm5vZGUpKSB7XG4gICAgICBpZiAoaXNEZWYob2xkVm5vZGUpKSB7IGludm9rZURlc3Ryb3lIb29rKG9sZFZub2RlKTsgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGlzSW5pdGlhbFBhdGNoID0gZmFsc2U7XG4gICAgdmFyIGluc2VydGVkVm5vZGVRdWV1ZSA9IFtdO1xuXG4gICAgaWYgKGlzVW5kZWYob2xkVm5vZGUpKSB7XG4gICAgICAvLyBlbXB0eSBtb3VudCAobGlrZWx5IGFzIGNvbXBvbmVudCksIGNyZWF0ZSBuZXcgcm9vdCBlbGVtZW50XG4gICAgICBpc0luaXRpYWxQYXRjaCA9IHRydWU7XG4gICAgICBjcmVhdGVFbG0odm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaXNSZWFsRWxlbWVudCA9IGlzRGVmKG9sZFZub2RlLm5vZGVUeXBlKTtcbiAgICAgIGlmICghaXNSZWFsRWxlbWVudCAmJiBzYW1lVm5vZGUob2xkVm5vZGUsIHZub2RlKSkge1xuICAgICAgICAvLyBwYXRjaCBleGlzdGluZyByb290IG5vZGVcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNSZWFsRWxlbWVudCkge1xuICAgICAgICAgIC8vIG1vdW50aW5nIHRvIGEgcmVhbCBlbGVtZW50XG4gICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBzZXJ2ZXItcmVuZGVyZWQgY29udGVudCBhbmQgaWYgd2UgY2FuIHBlcmZvcm1cbiAgICAgICAgICAvLyBhIHN1Y2Nlc3NmdWwgaHlkcmF0aW9uLlxuICAgICAgICAgIGlmIChvbGRWbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBvbGRWbm9kZS5oYXNBdHRyaWJ1dGUoU1NSX0FUVFIpKSB7XG4gICAgICAgICAgICBvbGRWbm9kZS5yZW1vdmVBdHRyaWJ1dGUoU1NSX0FUVFIpO1xuICAgICAgICAgICAgaHlkcmF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzVHJ1ZShoeWRyYXRpbmcpKSB7XG4gICAgICAgICAgICBpZiAoaHlkcmF0ZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkpIHtcbiAgICAgICAgICAgICAgaW52b2tlSW5zZXJ0SG9vayh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG9sZFZub2RlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgICAnVGhlIGNsaWVudC1zaWRlIHJlbmRlcmVkIHZpcnR1YWwgRE9NIHRyZWUgaXMgbm90IG1hdGNoaW5nICcgK1xuICAgICAgICAgICAgICAgICdzZXJ2ZXItcmVuZGVyZWQgY29udGVudC4gVGhpcyBpcyBsaWtlbHkgY2F1c2VkIGJ5IGluY29ycmVjdCAnICtcbiAgICAgICAgICAgICAgICAnSFRNTCBtYXJrdXAsIGZvciBleGFtcGxlIG5lc3RpbmcgYmxvY2stbGV2ZWwgZWxlbWVudHMgaW5zaWRlICcgK1xuICAgICAgICAgICAgICAgICc8cD4sIG9yIG1pc3NpbmcgPHRib2R5Pi4gQmFpbGluZyBoeWRyYXRpb24gYW5kIHBlcmZvcm1pbmcgJyArXG4gICAgICAgICAgICAgICAgJ2Z1bGwgY2xpZW50LXNpZGUgcmVuZGVyLidcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZWl0aGVyIG5vdCBzZXJ2ZXItcmVuZGVyZWQsIG9yIGh5ZHJhdGlvbiBmYWlsZWQuXG4gICAgICAgICAgLy8gY3JlYXRlIGFuIGVtcHR5IG5vZGUgYW5kIHJlcGxhY2UgaXRcbiAgICAgICAgICBvbGRWbm9kZSA9IGVtcHR5Tm9kZUF0KG9sZFZub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlcGxhY2luZyBleGlzdGluZyBlbGVtZW50XG4gICAgICAgIHZhciBvbGRFbG0gPSBvbGRWbm9kZS5lbG07XG4gICAgICAgIHZhciBwYXJlbnRFbG0kMSA9IG5vZGVPcHMucGFyZW50Tm9kZShvbGRFbG0pO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgbm9kZVxuICAgICAgICBjcmVhdGVFbG0oXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLFxuICAgICAgICAgIC8vIGV4dHJlbWVseSByYXJlIGVkZ2UgY2FzZTogZG8gbm90IGluc2VydCBpZiBvbGQgZWxlbWVudCBpcyBpbiBhXG4gICAgICAgICAgLy8gbGVhdmluZyB0cmFuc2l0aW9uLiBPbmx5IGhhcHBlbnMgd2hlbiBjb21iaW5pbmcgdHJhbnNpdGlvbiArXG4gICAgICAgICAgLy8ga2VlcC1hbGl2ZSArIEhPQ3MuICgjNDU5MClcbiAgICAgICAgICBvbGRFbG0uX2xlYXZlQ2IgPyBudWxsIDogcGFyZW50RWxtJDEsXG4gICAgICAgICAgbm9kZU9wcy5uZXh0U2libGluZyhvbGRFbG0pXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gdXBkYXRlIHBhcmVudCBwbGFjZWhvbGRlciBub2RlIGVsZW1lbnQsIHJlY3Vyc2l2ZWx5XG4gICAgICAgIGlmIChpc0RlZih2bm9kZS5wYXJlbnQpKSB7XG4gICAgICAgICAgdmFyIGFuY2VzdG9yID0gdm5vZGUucGFyZW50O1xuICAgICAgICAgIHZhciBwYXRjaGFibGUgPSBpc1BhdGNoYWJsZSh2bm9kZSk7XG4gICAgICAgICAgd2hpbGUgKGFuY2VzdG9yKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgIGNicy5kZXN0cm95W2ldKGFuY2VzdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFuY2VzdG9yLmVsbSA9IHZub2RlLmVsbTtcbiAgICAgICAgICAgIGlmIChwYXRjaGFibGUpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgY2JzLmNyZWF0ZS5sZW5ndGg7ICsraSQxKSB7XG4gICAgICAgICAgICAgICAgY2JzLmNyZWF0ZVtpJDFdKGVtcHR5Tm9kZSwgYW5jZXN0b3IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vICM2NTEzXG4gICAgICAgICAgICAgIC8vIGludm9rZSBpbnNlcnQgaG9va3MgdGhhdCBtYXkgaGF2ZSBiZWVuIG1lcmdlZCBieSBjcmVhdGUgaG9va3MuXG4gICAgICAgICAgICAgIC8vIGUuZy4gZm9yIGRpcmVjdGl2ZXMgdGhhdCB1c2VzIHRoZSBcImluc2VydGVkXCIgaG9vay5cbiAgICAgICAgICAgICAgdmFyIGluc2VydCA9IGFuY2VzdG9yLmRhdGEuaG9vay5pbnNlcnQ7XG4gICAgICAgICAgICAgIGlmIChpbnNlcnQubWVyZ2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gc3RhcnQgYXQgaW5kZXggMSB0byBhdm9pZCByZS1pbnZva2luZyBjb21wb25lbnQgbW91bnRlZCBob29rXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSQyID0gMTsgaSQyIDwgaW5zZXJ0LmZucy5sZW5ndGg7IGkkMisrKSB7XG4gICAgICAgICAgICAgICAgICBpbnNlcnQuZm5zW2kkMl0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlZ2lzdGVyUmVmKGFuY2VzdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRlc3Ryb3kgb2xkIG5vZGVcbiAgICAgICAgaWYgKGlzRGVmKHBhcmVudEVsbSQxKSkge1xuICAgICAgICAgIHJlbW92ZVZub2RlcyhwYXJlbnRFbG0kMSwgW29sZFZub2RlXSwgMCwgMCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkVm5vZGUudGFnKSkge1xuICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKG9sZFZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGludm9rZUluc2VydEhvb2sodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaXNJbml0aWFsUGF0Y2gpO1xuICAgIHJldHVybiB2bm9kZS5lbG1cbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIGRpcmVjdGl2ZXMgPSB7XG4gIGNyZWF0ZTogdXBkYXRlRGlyZWN0aXZlcyxcbiAgdXBkYXRlOiB1cGRhdGVEaXJlY3RpdmVzLFxuICBkZXN0cm95OiBmdW5jdGlvbiB1bmJpbmREaXJlY3RpdmVzICh2bm9kZSkge1xuICAgIHVwZGF0ZURpcmVjdGl2ZXModm5vZGUsIGVtcHR5Tm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRGlyZWN0aXZlcyAob2xkVm5vZGUsIHZub2RlKSB7XG4gIGlmIChvbGRWbm9kZS5kYXRhLmRpcmVjdGl2ZXMgfHwgdm5vZGUuZGF0YS5kaXJlY3RpdmVzKSB7XG4gICAgX3VwZGF0ZShvbGRWbm9kZSwgdm5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF91cGRhdGUgKG9sZFZub2RlLCB2bm9kZSkge1xuICB2YXIgaXNDcmVhdGUgPSBvbGRWbm9kZSA9PT0gZW1wdHlOb2RlO1xuICB2YXIgaXNEZXN0cm95ID0gdm5vZGUgPT09IGVtcHR5Tm9kZTtcbiAgdmFyIG9sZERpcnMgPSBub3JtYWxpemVEaXJlY3RpdmVzJDEob2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzLCBvbGRWbm9kZS5jb250ZXh0KTtcbiAgdmFyIG5ld0RpcnMgPSBub3JtYWxpemVEaXJlY3RpdmVzJDEodm5vZGUuZGF0YS5kaXJlY3RpdmVzLCB2bm9kZS5jb250ZXh0KTtcblxuICB2YXIgZGlyc1dpdGhJbnNlcnQgPSBbXTtcbiAgdmFyIGRpcnNXaXRoUG9zdHBhdGNoID0gW107XG5cbiAgdmFyIGtleSwgb2xkRGlyLCBkaXI7XG4gIGZvciAoa2V5IGluIG5ld0RpcnMpIHtcbiAgICBvbGREaXIgPSBvbGREaXJzW2tleV07XG4gICAgZGlyID0gbmV3RGlyc1trZXldO1xuICAgIGlmICghb2xkRGlyKSB7XG4gICAgICAvLyBuZXcgZGlyZWN0aXZlLCBiaW5kXG4gICAgICBjYWxsSG9vayQxKGRpciwgJ2JpbmQnLCB2bm9kZSwgb2xkVm5vZGUpO1xuICAgICAgaWYgKGRpci5kZWYgJiYgZGlyLmRlZi5pbnNlcnRlZCkge1xuICAgICAgICBkaXJzV2l0aEluc2VydC5wdXNoKGRpcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGV4aXN0aW5nIGRpcmVjdGl2ZSwgdXBkYXRlXG4gICAgICBkaXIub2xkVmFsdWUgPSBvbGREaXIudmFsdWU7XG4gICAgICBjYWxsSG9vayQxKGRpciwgJ3VwZGF0ZScsIHZub2RlLCBvbGRWbm9kZSk7XG4gICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmNvbXBvbmVudFVwZGF0ZWQpIHtcbiAgICAgICAgZGlyc1dpdGhQb3N0cGF0Y2gucHVzaChkaXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChkaXJzV2l0aEluc2VydC5sZW5ndGgpIHtcbiAgICB2YXIgY2FsbEluc2VydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyc1dpdGhJbnNlcnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aEluc2VydFtpXSwgJ2luc2VydGVkJywgdm5vZGUsIG9sZFZub2RlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChpc0NyZWF0ZSkge1xuICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBjYWxsSW5zZXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbEluc2VydCgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkaXJzV2l0aFBvc3RwYXRjaC5sZW5ndGgpIHtcbiAgICBtZXJnZVZOb2RlSG9vayh2bm9kZSwgJ3Bvc3RwYXRjaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyc1dpdGhQb3N0cGF0Y2gubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aFBvc3RwYXRjaFtpXSwgJ2NvbXBvbmVudFVwZGF0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFpc0NyZWF0ZSkge1xuICAgIGZvciAoa2V5IGluIG9sZERpcnMpIHtcbiAgICAgIGlmICghbmV3RGlyc1trZXldKSB7XG4gICAgICAgIC8vIG5vIGxvbmdlciBwcmVzZW50LCB1bmJpbmRcbiAgICAgICAgY2FsbEhvb2skMShvbGREaXJzW2tleV0sICd1bmJpbmQnLCBvbGRWbm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBlbXB0eU1vZGlmaWVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSAoXG4gIGRpcnMsXG4gIHZtXG4pIHtcbiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGlmICghZGlycykge1xuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHJldHVybiByZXNcbiAgfVxuICB2YXIgaSwgZGlyO1xuICBmb3IgKGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykge1xuICAgIGRpciA9IGRpcnNbaV07XG4gICAgaWYgKCFkaXIubW9kaWZpZXJzKSB7XG4gICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgICAgIGRpci5tb2RpZmllcnMgPSBlbXB0eU1vZGlmaWVycztcbiAgICB9XG4gICAgcmVzW2dldFJhd0Rpck5hbWUoZGlyKV0gPSBkaXI7XG4gICAgZGlyLmRlZiA9IHJlc29sdmVBc3NldCh2bS4kb3B0aW9ucywgJ2RpcmVjdGl2ZXMnLCBkaXIubmFtZSwgdHJ1ZSk7XG4gIH1cbiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gZ2V0UmF3RGlyTmFtZSAoZGlyKSB7XG4gIHJldHVybiBkaXIucmF3TmFtZSB8fCAoKGRpci5uYW1lKSArIFwiLlwiICsgKE9iamVjdC5rZXlzKGRpci5tb2RpZmllcnMgfHwge30pLmpvaW4oJy4nKSkpXG59XG5cbmZ1bmN0aW9uIGNhbGxIb29rJDEgKGRpciwgaG9vaywgdm5vZGUsIG9sZFZub2RlLCBpc0Rlc3Ryb3kpIHtcbiAgdmFyIGZuID0gZGlyLmRlZiAmJiBkaXIuZGVmW2hvb2tdO1xuICBpZiAoZm4pIHtcbiAgICB0cnkge1xuICAgICAgZm4odm5vZGUuZWxtLCBkaXIsIHZub2RlLCBvbGRWbm9kZSwgaXNEZXN0cm95KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoYW5kbGVFcnJvcihlLCB2bm9kZS5jb250ZXh0LCAoXCJkaXJlY3RpdmUgXCIgKyAoZGlyLm5hbWUpICsgXCIgXCIgKyBob29rICsgXCIgaG9va1wiKSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBiYXNlTW9kdWxlcyA9IFtcbiAgcmVmLFxuICBkaXJlY3RpdmVzXG5dXG5cbi8qICAqL1xuXG5mdW5jdGlvbiB1cGRhdGVBdHRycyAob2xkVm5vZGUsIHZub2RlKSB7XG4gIHZhciBvcHRzID0gdm5vZGUuY29tcG9uZW50T3B0aW9ucztcbiAgaWYgKGlzRGVmKG9wdHMpICYmIG9wdHMuQ3Rvci5vcHRpb25zLmluaGVyaXRBdHRycyA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoaXNVbmRlZihvbGRWbm9kZS5kYXRhLmF0dHJzKSAmJiBpc1VuZGVmKHZub2RlLmRhdGEuYXR0cnMpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIGtleSwgY3VyLCBvbGQ7XG4gIHZhciBlbG0gPSB2bm9kZS5lbG07XG4gIHZhciBvbGRBdHRycyA9IG9sZFZub2RlLmRhdGEuYXR0cnMgfHwge307XG4gIHZhciBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgfHwge307XG4gIC8vIGNsb25lIG9ic2VydmVkIG9iamVjdHMsIGFzIHRoZSB1c2VyIHByb2JhYmx5IHdhbnRzIHRvIG11dGF0ZSBpdFxuICBpZiAoaXNEZWYoYXR0cnMuX19vYl9fKSkge1xuICAgIGF0dHJzID0gdm5vZGUuZGF0YS5hdHRycyA9IGV4dGVuZCh7fSwgYXR0cnMpO1xuICB9XG5cbiAgZm9yIChrZXkgaW4gYXR0cnMpIHtcbiAgICBjdXIgPSBhdHRyc1trZXldO1xuICAgIG9sZCA9IG9sZEF0dHJzW2tleV07XG4gICAgaWYgKG9sZCAhPT0gY3VyKSB7XG4gICAgICBzZXRBdHRyKGVsbSwga2V5LCBjdXIpO1xuICAgIH1cbiAgfVxuICAvLyAjNDM5MTogaW4gSUU5LCBzZXR0aW5nIHR5cGUgY2FuIHJlc2V0IHZhbHVlIGZvciBpbnB1dFt0eXBlPXJhZGlvXVxuICAvLyAjNjY2NjogSUUvRWRnZSBmb3JjZXMgcHJvZ3Jlc3MgdmFsdWUgZG93biB0byAxIGJlZm9yZSBzZXR0aW5nIGEgbWF4XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoKGlzSUUgfHwgaXNFZGdlKSAmJiBhdHRycy52YWx1ZSAhPT0gb2xkQXR0cnMudmFsdWUpIHtcbiAgICBzZXRBdHRyKGVsbSwgJ3ZhbHVlJywgYXR0cnMudmFsdWUpO1xuICB9XG4gIGZvciAoa2V5IGluIG9sZEF0dHJzKSB7XG4gICAgaWYgKGlzVW5kZWYoYXR0cnNba2V5XSkpIHtcbiAgICAgIGlmIChpc1hsaW5rKGtleSkpIHtcbiAgICAgICAgZWxtLnJlbW92ZUF0dHJpYnV0ZU5TKHhsaW5rTlMsIGdldFhsaW5rUHJvcChrZXkpKTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzRW51bWVyYXRlZEF0dHIoa2V5KSkge1xuICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEF0dHIgKGVsLCBrZXksIHZhbHVlKSB7XG4gIGlmIChlbC50YWdOYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgYmFzZVNldEF0dHIoZWwsIGtleSwgdmFsdWUpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkF0dHIoa2V5KSkge1xuICAgIC8vIHNldCBhdHRyaWJ1dGUgZm9yIGJsYW5rIHZhbHVlXG4gICAgLy8gZS5nLiA8b3B0aW9uIGRpc2FibGVkPlNlbGVjdCBvbmU8L29wdGlvbj5cbiAgICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0ZWNobmljYWxseSBhbGxvd2Z1bGxzY3JlZW4gaXMgYSBib29sZWFuIGF0dHJpYnV0ZSBmb3IgPGlmcmFtZT4sXG4gICAgICAvLyBidXQgRmxhc2ggZXhwZWN0cyBhIHZhbHVlIG9mIFwidHJ1ZVwiIHdoZW4gdXNlZCBvbiA8ZW1iZWQ+IHRhZ1xuICAgICAgdmFsdWUgPSBrZXkgPT09ICdhbGxvd2Z1bGxzY3JlZW4nICYmIGVsLnRhZ05hbWUgPT09ICdFTUJFRCdcbiAgICAgICAgPyAndHJ1ZSdcbiAgICAgICAgOiBrZXk7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRW51bWVyYXRlZEF0dHIoa2V5KSkge1xuICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpIHx8IHZhbHVlID09PSAnZmFsc2UnID8gJ2ZhbHNlJyA6ICd0cnVlJyk7XG4gIH0gZWxzZSBpZiAoaXNYbGluayhrZXkpKSB7XG4gICAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGVOUyh4bGlua05TLCBnZXRYbGlua1Byb3Aoa2V5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKHhsaW5rTlMsIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBiYXNlU2V0QXR0cihlbCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZVNldEF0dHIgKGVsLCBrZXksIHZhbHVlKSB7XG4gIGlmIChpc0ZhbHN5QXR0clZhbHVlKHZhbHVlKSkge1xuICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICB9IGVsc2Uge1xuICAgIC8vICM3MTM4OiBJRTEwICYgMTEgZmlyZXMgaW5wdXQgZXZlbnQgd2hlbiBzZXR0aW5nIHBsYWNlaG9sZGVyIG9uXG4gICAgLy8gPHRleHRhcmVhPi4uLiBibG9jayB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYW5kIHJlbW92ZSB0aGUgYmxvY2tlclxuICAgIC8vIGltbWVkaWF0ZWx5LlxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChcbiAgICAgIGlzSUUgJiYgIWlzSUU5ICYmXG4gICAgICBlbC50YWdOYW1lID09PSAnVEVYVEFSRUEnICYmXG4gICAgICBrZXkgPT09ICdwbGFjZWhvbGRlcicgJiYgIWVsLl9faWVwaFxuICAgICkge1xuICAgICAgdmFyIGJsb2NrZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdpbnB1dCcsIGJsb2NrZXIpO1xuICAgICAgfTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7XG4gICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgICAgIGVsLl9faWVwaCA9IHRydWU7IC8qIElFIHBsYWNlaG9sZGVyIHBhdGNoZWQgKi9cbiAgICB9XG4gICAgZWwuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuICB9XG59XG5cbnZhciBhdHRycyA9IHtcbiAgY3JlYXRlOiB1cGRhdGVBdHRycyxcbiAgdXBkYXRlOiB1cGRhdGVBdHRyc1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3MgKG9sZFZub2RlLCB2bm9kZSkge1xuICB2YXIgZWwgPSB2bm9kZS5lbG07XG4gIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgdmFyIG9sZERhdGEgPSBvbGRWbm9kZS5kYXRhO1xuICBpZiAoXG4gICAgaXNVbmRlZihkYXRhLnN0YXRpY0NsYXNzKSAmJlxuICAgIGlzVW5kZWYoZGF0YS5jbGFzcykgJiYgKFxuICAgICAgaXNVbmRlZihvbGREYXRhKSB8fCAoXG4gICAgICAgIGlzVW5kZWYob2xkRGF0YS5zdGF0aWNDbGFzcykgJiZcbiAgICAgICAgaXNVbmRlZihvbGREYXRhLmNsYXNzKVxuICAgICAgKVxuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgY2xzID0gZ2VuQ2xhc3NGb3JWbm9kZSh2bm9kZSk7XG5cbiAgLy8gaGFuZGxlIHRyYW5zaXRpb24gY2xhc3Nlc1xuICB2YXIgdHJhbnNpdGlvbkNsYXNzID0gZWwuX3RyYW5zaXRpb25DbGFzc2VzO1xuICBpZiAoaXNEZWYodHJhbnNpdGlvbkNsYXNzKSkge1xuICAgIGNscyA9IGNvbmNhdChjbHMsIHN0cmluZ2lmeUNsYXNzKHRyYW5zaXRpb25DbGFzcykpO1xuICB9XG5cbiAgLy8gc2V0IHRoZSBjbGFzc1xuICBpZiAoY2xzICE9PSBlbC5fcHJldkNsYXNzKSB7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIGNscyk7XG4gICAgZWwuX3ByZXZDbGFzcyA9IGNscztcbiAgfVxufVxuXG52YXIga2xhc3MgPSB7XG4gIGNyZWF0ZTogdXBkYXRlQ2xhc3MsXG4gIHVwZGF0ZTogdXBkYXRlQ2xhc3Ncbn1cblxuLyogICovXG5cbnZhciB2YWxpZERpdmlzaW9uQ2hhclJFID0gL1tcXHcpLitcXC1fJFxcXV0vO1xuXG5mdW5jdGlvbiBwYXJzZUZpbHRlcnMgKGV4cCkge1xuICB2YXIgaW5TaW5nbGUgPSBmYWxzZTtcbiAgdmFyIGluRG91YmxlID0gZmFsc2U7XG4gIHZhciBpblRlbXBsYXRlU3RyaW5nID0gZmFsc2U7XG4gIHZhciBpblJlZ2V4ID0gZmFsc2U7XG4gIHZhciBjdXJseSA9IDA7XG4gIHZhciBzcXVhcmUgPSAwO1xuICB2YXIgcGFyZW4gPSAwO1xuICB2YXIgbGFzdEZpbHRlckluZGV4ID0gMDtcbiAgdmFyIGMsIHByZXYsIGksIGV4cHJlc3Npb24sIGZpbHRlcnM7XG5cbiAgZm9yIChpID0gMDsgaSA8IGV4cC5sZW5ndGg7IGkrKykge1xuICAgIHByZXYgPSBjO1xuICAgIGMgPSBleHAuY2hhckNvZGVBdChpKTtcbiAgICBpZiAoaW5TaW5nbGUpIHtcbiAgICAgIGlmIChjID09PSAweDI3ICYmIHByZXYgIT09IDB4NUMpIHsgaW5TaW5nbGUgPSBmYWxzZTsgfVxuICAgIH0gZWxzZSBpZiAoaW5Eb3VibGUpIHtcbiAgICAgIGlmIChjID09PSAweDIyICYmIHByZXYgIT09IDB4NUMpIHsgaW5Eb3VibGUgPSBmYWxzZTsgfVxuICAgIH0gZWxzZSBpZiAoaW5UZW1wbGF0ZVN0cmluZykge1xuICAgICAgaWYgKGMgPT09IDB4NjAgJiYgcHJldiAhPT0gMHg1QykgeyBpblRlbXBsYXRlU3RyaW5nID0gZmFsc2U7IH1cbiAgICB9IGVsc2UgaWYgKGluUmVnZXgpIHtcbiAgICAgIGlmIChjID09PSAweDJmICYmIHByZXYgIT09IDB4NUMpIHsgaW5SZWdleCA9IGZhbHNlOyB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGMgPT09IDB4N0MgJiYgLy8gcGlwZVxuICAgICAgZXhwLmNoYXJDb2RlQXQoaSArIDEpICE9PSAweDdDICYmXG4gICAgICBleHAuY2hhckNvZGVBdChpIC0gMSkgIT09IDB4N0MgJiZcbiAgICAgICFjdXJseSAmJiAhc3F1YXJlICYmICFwYXJlblxuICAgICkge1xuICAgICAgaWYgKGV4cHJlc3Npb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBmaXJzdCBmaWx0ZXIsIGVuZCBvZiBleHByZXNzaW9uXG4gICAgICAgIGxhc3RGaWx0ZXJJbmRleCA9IGkgKyAxO1xuICAgICAgICBleHByZXNzaW9uID0gZXhwLnNsaWNlKDAsIGkpLnRyaW0oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2hGaWx0ZXIoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgIGNhc2UgMHgyMjogaW5Eb3VibGUgPSB0cnVlOyBicmVhayAgICAgICAgIC8vIFwiXG4gICAgICAgIGNhc2UgMHgyNzogaW5TaW5nbGUgPSB0cnVlOyBicmVhayAgICAgICAgIC8vICdcbiAgICAgICAgY2FzZSAweDYwOiBpblRlbXBsYXRlU3RyaW5nID0gdHJ1ZTsgYnJlYWsgLy8gYFxuICAgICAgICBjYXNlIDB4Mjg6IHBhcmVuKys7IGJyZWFrICAgICAgICAgICAgICAgICAvLyAoXG4gICAgICAgIGNhc2UgMHgyOTogcGFyZW4tLTsgYnJlYWsgICAgICAgICAgICAgICAgIC8vIClcbiAgICAgICAgY2FzZSAweDVCOiBzcXVhcmUrKzsgYnJlYWsgICAgICAgICAgICAgICAgLy8gW1xuICAgICAgICBjYXNlIDB4NUQ6IHNxdWFyZS0tOyBicmVhayAgICAgICAgICAgICAgICAvLyBdXG4gICAgICAgIGNhc2UgMHg3QjogY3VybHkrKzsgYnJlYWsgICAgICAgICAgICAgICAgIC8vIHtcbiAgICAgICAgY2FzZSAweDdEOiBjdXJseS0tOyBicmVhayAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgfVxuICAgICAgaWYgKGMgPT09IDB4MmYpIHsgLy8gL1xuICAgICAgICB2YXIgaiA9IGkgLSAxO1xuICAgICAgICB2YXIgcCA9ICh2b2lkIDApO1xuICAgICAgICAvLyBmaW5kIGZpcnN0IG5vbi13aGl0ZXNwYWNlIHByZXYgY2hhclxuICAgICAgICBmb3IgKDsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICBwID0gZXhwLmNoYXJBdChqKTtcbiAgICAgICAgICBpZiAocCAhPT0gJyAnKSB7IGJyZWFrIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXAgfHwgIXZhbGlkRGl2aXNpb25DaGFyUkUudGVzdChwKSkge1xuICAgICAgICAgIGluUmVnZXggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGV4cHJlc3Npb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGV4cHJlc3Npb24gPSBleHAuc2xpY2UoMCwgaSkudHJpbSgpO1xuICB9IGVsc2UgaWYgKGxhc3RGaWx0ZXJJbmRleCAhPT0gMCkge1xuICAgIHB1c2hGaWx0ZXIoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1c2hGaWx0ZXIgKCkge1xuICAgIChmaWx0ZXJzIHx8IChmaWx0ZXJzID0gW10pKS5wdXNoKGV4cC5zbGljZShsYXN0RmlsdGVySW5kZXgsIGkpLnRyaW0oKSk7XG4gICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7XG4gIH1cblxuICBpZiAoZmlsdGVycykge1xuICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBleHByZXNzaW9uID0gd3JhcEZpbHRlcihleHByZXNzaW9uLCBmaWx0ZXJzW2ldKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwcmVzc2lvblxufVxuXG5mdW5jdGlvbiB3cmFwRmlsdGVyIChleHAsIGZpbHRlcikge1xuICB2YXIgaSA9IGZpbHRlci5pbmRleE9mKCcoJyk7XG4gIGlmIChpIDwgMCkge1xuICAgIC8vIF9mOiByZXNvbHZlRmlsdGVyXG4gICAgcmV0dXJuIChcIl9mKFxcXCJcIiArIGZpbHRlciArIFwiXFxcIikoXCIgKyBleHAgKyBcIilcIilcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmFtZSA9IGZpbHRlci5zbGljZSgwLCBpKTtcbiAgICB2YXIgYXJncyA9IGZpbHRlci5zbGljZShpICsgMSk7XG4gICAgcmV0dXJuIChcIl9mKFxcXCJcIiArIG5hbWUgKyBcIlxcXCIpKFwiICsgZXhwICsgKGFyZ3MgIT09ICcpJyA/ICcsJyArIGFyZ3MgOiBhcmdzKSlcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gYmFzZVdhcm4gKG1zZykge1xuICBjb25zb2xlLmVycm9yKChcIltWdWUgY29tcGlsZXJdOiBcIiArIG1zZykpO1xufVxuXG5mdW5jdGlvbiBwbHVja01vZHVsZUZ1bmN0aW9uIChcbiAgbW9kdWxlcyxcbiAga2V5XG4pIHtcbiAgcmV0dXJuIG1vZHVsZXNcbiAgICA/IG1vZHVsZXMubWFwKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtW2tleV07IH0pLmZpbHRlcihmdW5jdGlvbiAoXykgeyByZXR1cm4gXzsgfSlcbiAgICA6IFtdXG59XG5cbmZ1bmN0aW9uIGFkZFByb3AgKGVsLCBuYW1lLCB2YWx1ZSkge1xuICAoZWwucHJvcHMgfHwgKGVsLnByb3BzID0gW10pKS5wdXNoKHsgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pO1xuICBlbC5wbGFpbiA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhZGRBdHRyIChlbCwgbmFtZSwgdmFsdWUpIHtcbiAgKGVsLmF0dHJzIHx8IChlbC5hdHRycyA9IFtdKSkucHVzaCh7IG5hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgZWwucGxhaW4gPSBmYWxzZTtcbn1cblxuLy8gYWRkIGEgcmF3IGF0dHIgKHVzZSB0aGlzIGluIHByZVRyYW5zZm9ybXMpXG5mdW5jdGlvbiBhZGRSYXdBdHRyIChlbCwgbmFtZSwgdmFsdWUpIHtcbiAgZWwuYXR0cnNNYXBbbmFtZV0gPSB2YWx1ZTtcbiAgZWwuYXR0cnNMaXN0LnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZERpcmVjdGl2ZSAoXG4gIGVsLFxuICBuYW1lLFxuICByYXdOYW1lLFxuICB2YWx1ZSxcbiAgYXJnLFxuICBtb2RpZmllcnNcbikge1xuICAoZWwuZGlyZWN0aXZlcyB8fCAoZWwuZGlyZWN0aXZlcyA9IFtdKSkucHVzaCh7IG5hbWU6IG5hbWUsIHJhd05hbWU6IHJhd05hbWUsIHZhbHVlOiB2YWx1ZSwgYXJnOiBhcmcsIG1vZGlmaWVyczogbW9kaWZpZXJzIH0pO1xuICBlbC5wbGFpbiA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhZGRIYW5kbGVyIChcbiAgZWwsXG4gIG5hbWUsXG4gIHZhbHVlLFxuICBtb2RpZmllcnMsXG4gIGltcG9ydGFudCxcbiAgd2FyblxuKSB7XG4gIG1vZGlmaWVycyA9IG1vZGlmaWVycyB8fCBlbXB0eU9iamVjdDtcbiAgLy8gd2FybiBwcmV2ZW50IGFuZCBwYXNzaXZlIG1vZGlmaWVyXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuICYmXG4gICAgbW9kaWZpZXJzLnByZXZlbnQgJiYgbW9kaWZpZXJzLnBhc3NpdmVcbiAgKSB7XG4gICAgd2FybihcbiAgICAgICdwYXNzaXZlIGFuZCBwcmV2ZW50IGNhblxcJ3QgYmUgdXNlZCB0b2dldGhlci4gJyArXG4gICAgICAnUGFzc2l2ZSBoYW5kbGVyIGNhblxcJ3QgcHJldmVudCBkZWZhdWx0IGV2ZW50LidcbiAgICApO1xuICB9XG5cbiAgLy8gY2hlY2sgY2FwdHVyZSBtb2RpZmllclxuICBpZiAobW9kaWZpZXJzLmNhcHR1cmUpIHtcbiAgICBkZWxldGUgbW9kaWZpZXJzLmNhcHR1cmU7XG4gICAgbmFtZSA9ICchJyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIGNhcHR1cmVkXG4gIH1cbiAgaWYgKG1vZGlmaWVycy5vbmNlKSB7XG4gICAgZGVsZXRlIG1vZGlmaWVycy5vbmNlO1xuICAgIG5hbWUgPSAnficgKyBuYW1lOyAvLyBtYXJrIHRoZSBldmVudCBhcyBvbmNlXG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChtb2RpZmllcnMucGFzc2l2ZSkge1xuICAgIGRlbGV0ZSBtb2RpZmllcnMucGFzc2l2ZTtcbiAgICBuYW1lID0gJyYnICsgbmFtZTsgLy8gbWFyayB0aGUgZXZlbnQgYXMgcGFzc2l2ZVxuICB9XG5cbiAgLy8gbm9ybWFsaXplIGNsaWNrLnJpZ2h0IGFuZCBjbGljay5taWRkbGUgc2luY2UgdGhleSBkb24ndCBhY3R1YWxseSBmaXJlXG4gIC8vIHRoaXMgaXMgdGVjaG5pY2FsbHkgYnJvd3Nlci1zcGVjaWZpYywgYnV0IGF0IGxlYXN0IGZvciBub3cgYnJvd3NlcnMgYXJlXG4gIC8vIHRoZSBvbmx5IHRhcmdldCBlbnZzIHRoYXQgaGF2ZSByaWdodC9taWRkbGUgY2xpY2tzLlxuICBpZiAobmFtZSA9PT0gJ2NsaWNrJykge1xuICAgIGlmIChtb2RpZmllcnMucmlnaHQpIHtcbiAgICAgIG5hbWUgPSAnY29udGV4dG1lbnUnO1xuICAgICAgZGVsZXRlIG1vZGlmaWVycy5yaWdodDtcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVycy5taWRkbGUpIHtcbiAgICAgIG5hbWUgPSAnbW91c2V1cCc7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV2ZW50cztcbiAgaWYgKG1vZGlmaWVycy5uYXRpdmUpIHtcbiAgICBkZWxldGUgbW9kaWZpZXJzLm5hdGl2ZTtcbiAgICBldmVudHMgPSBlbC5uYXRpdmVFdmVudHMgfHwgKGVsLm5hdGl2ZUV2ZW50cyA9IHt9KTtcbiAgfSBlbHNlIHtcbiAgICBldmVudHMgPSBlbC5ldmVudHMgfHwgKGVsLmV2ZW50cyA9IHt9KTtcbiAgfVxuXG4gIHZhciBuZXdIYW5kbGVyID0ge1xuICAgIHZhbHVlOiB2YWx1ZS50cmltKClcbiAgfTtcbiAgaWYgKG1vZGlmaWVycyAhPT0gZW1wdHlPYmplY3QpIHtcbiAgICBuZXdIYW5kbGVyLm1vZGlmaWVycyA9IG1vZGlmaWVycztcbiAgfVxuXG4gIHZhciBoYW5kbGVycyA9IGV2ZW50c1tuYW1lXTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgIGltcG9ydGFudCA/IGhhbmRsZXJzLnVuc2hpZnQobmV3SGFuZGxlcikgOiBoYW5kbGVycy5wdXNoKG5ld0hhbmRsZXIpO1xuICB9IGVsc2UgaWYgKGhhbmRsZXJzKSB7XG4gICAgZXZlbnRzW25hbWVdID0gaW1wb3J0YW50ID8gW25ld0hhbmRsZXIsIGhhbmRsZXJzXSA6IFtoYW5kbGVycywgbmV3SGFuZGxlcl07XG4gIH0gZWxzZSB7XG4gICAgZXZlbnRzW25hbWVdID0gbmV3SGFuZGxlcjtcbiAgfVxuXG4gIGVsLnBsYWluID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEJpbmRpbmdBdHRyIChcbiAgZWwsXG4gIG5hbWUsXG4gIGdldFN0YXRpY1xuKSB7XG4gIHZhciBkeW5hbWljVmFsdWUgPVxuICAgIGdldEFuZFJlbW92ZUF0dHIoZWwsICc6JyArIG5hbWUpIHx8XG4gICAgZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtYmluZDonICsgbmFtZSk7XG4gIGlmIChkeW5hbWljVmFsdWUgIT0gbnVsbCkge1xuICAgIHJldHVybiBwYXJzZUZpbHRlcnMoZHluYW1pY1ZhbHVlKVxuICB9IGVsc2UgaWYgKGdldFN0YXRpYyAhPT0gZmFsc2UpIHtcbiAgICB2YXIgc3RhdGljVmFsdWUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCBuYW1lKTtcbiAgICBpZiAoc3RhdGljVmFsdWUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHN0YXRpY1ZhbHVlKVxuICAgIH1cbiAgfVxufVxuXG4vLyBub3RlOiB0aGlzIG9ubHkgcmVtb3ZlcyB0aGUgYXR0ciBmcm9tIHRoZSBBcnJheSAoYXR0cnNMaXN0KSBzbyB0aGF0IGl0XG4vLyBkb2Vzbid0IGdldCBwcm9jZXNzZWQgYnkgcHJvY2Vzc0F0dHJzLlxuLy8gQnkgZGVmYXVsdCBpdCBkb2VzIE5PVCByZW1vdmUgaXQgZnJvbSB0aGUgbWFwIChhdHRyc01hcCkgYmVjYXVzZSB0aGUgbWFwIGlzXG4vLyBuZWVkZWQgZHVyaW5nIGNvZGVnZW4uXG5mdW5jdGlvbiBnZXRBbmRSZW1vdmVBdHRyIChcbiAgZWwsXG4gIG5hbWUsXG4gIHJlbW92ZUZyb21NYXBcbikge1xuICB2YXIgdmFsO1xuICBpZiAoKHZhbCA9IGVsLmF0dHJzTWFwW25hbWVdKSAhPSBudWxsKSB7XG4gICAgdmFyIGxpc3QgPSBlbC5hdHRyc0xpc3Q7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGxpc3RbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICBsaXN0LnNwbGljZShpLCAxKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHJlbW92ZUZyb21NYXApIHtcbiAgICBkZWxldGUgZWwuYXR0cnNNYXBbbmFtZV07XG4gIH1cbiAgcmV0dXJuIHZhbFxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBDcm9zcy1wbGF0Zm9ybSBjb2RlIGdlbmVyYXRpb24gZm9yIGNvbXBvbmVudCB2LW1vZGVsXG4gKi9cbmZ1bmN0aW9uIGdlbkNvbXBvbmVudE1vZGVsIChcbiAgZWwsXG4gIHZhbHVlLFxuICBtb2RpZmllcnNcbikge1xuICB2YXIgcmVmID0gbW9kaWZpZXJzIHx8IHt9O1xuICB2YXIgbnVtYmVyID0gcmVmLm51bWJlcjtcbiAgdmFyIHRyaW0gPSByZWYudHJpbTtcblxuICB2YXIgYmFzZVZhbHVlRXhwcmVzc2lvbiA9ICckJHYnO1xuICB2YXIgdmFsdWVFeHByZXNzaW9uID0gYmFzZVZhbHVlRXhwcmVzc2lvbjtcbiAgaWYgKHRyaW0pIHtcbiAgICB2YWx1ZUV4cHJlc3Npb24gPVxuICAgICAgXCIodHlwZW9mIFwiICsgYmFzZVZhbHVlRXhwcmVzc2lvbiArIFwiID09PSAnc3RyaW5nJ1wiICtcbiAgICAgIFwiPyBcIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyBcIi50cmltKClcIiArXG4gICAgICBcIjogXCIgKyBiYXNlVmFsdWVFeHByZXNzaW9uICsgXCIpXCI7XG4gIH1cbiAgaWYgKG51bWJlcikge1xuICAgIHZhbHVlRXhwcmVzc2lvbiA9IFwiX24oXCIgKyB2YWx1ZUV4cHJlc3Npb24gKyBcIilcIjtcbiAgfVxuICB2YXIgYXNzaWdubWVudCA9IGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCB2YWx1ZUV4cHJlc3Npb24pO1xuXG4gIGVsLm1vZGVsID0ge1xuICAgIHZhbHVlOiAoXCIoXCIgKyB2YWx1ZSArIFwiKVwiKSxcbiAgICBleHByZXNzaW9uOiAoXCJcXFwiXCIgKyB2YWx1ZSArIFwiXFxcIlwiKSxcbiAgICBjYWxsYmFjazogKFwiZnVuY3Rpb24gKFwiICsgYmFzZVZhbHVlRXhwcmVzc2lvbiArIFwiKSB7XCIgKyBhc3NpZ25tZW50ICsgXCJ9XCIpXG4gIH07XG59XG5cbi8qKlxuICogQ3Jvc3MtcGxhdGZvcm0gY29kZWdlbiBoZWxwZXIgZm9yIGdlbmVyYXRpbmcgdi1tb2RlbCB2YWx1ZSBhc3NpZ25tZW50IGNvZGUuXG4gKi9cbmZ1bmN0aW9uIGdlbkFzc2lnbm1lbnRDb2RlIChcbiAgdmFsdWUsXG4gIGFzc2lnbm1lbnRcbikge1xuICB2YXIgcmVzID0gcGFyc2VNb2RlbCh2YWx1ZSk7XG4gIGlmIChyZXMua2V5ID09PSBudWxsKSB7XG4gICAgcmV0dXJuICh2YWx1ZSArIFwiPVwiICsgYXNzaWdubWVudClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKFwiJHNldChcIiArIChyZXMuZXhwKSArIFwiLCBcIiArIChyZXMua2V5KSArIFwiLCBcIiArIGFzc2lnbm1lbnQgKyBcIilcIilcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIGEgdi1tb2RlbCBleHByZXNzaW9uIGludG8gYSBiYXNlIHBhdGggYW5kIGEgZmluYWwga2V5IHNlZ21lbnQuXG4gKiBIYW5kbGVzIGJvdGggZG90LXBhdGggYW5kIHBvc3NpYmxlIHNxdWFyZSBicmFja2V0cy5cbiAqXG4gKiBQb3NzaWJsZSBjYXNlczpcbiAqXG4gKiAtIHRlc3RcbiAqIC0gdGVzdFtrZXldXG4gKiAtIHRlc3RbdGVzdDFba2V5XV1cbiAqIC0gdGVzdFtcImFcIl1ba2V5XVxuICogLSB4eHgudGVzdFthW2FdLnRlc3QxW2tleV1dXG4gKiAtIHRlc3QueHh4LmFbXCJhc2FcIl1bdGVzdDFba2V5XV1cbiAqXG4gKi9cblxudmFyIGxlbjtcbnZhciBzdHI7XG52YXIgY2hyO1xudmFyIGluZGV4JDE7XG52YXIgZXhwcmVzc2lvblBvcztcbnZhciBleHByZXNzaW9uRW5kUG9zO1xuXG5cblxuZnVuY3Rpb24gcGFyc2VNb2RlbCAodmFsKSB7XG4gIC8vIEZpeCBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlL3B1bGwvNzczMFxuICAvLyBhbGxvdyB2LW1vZGVsPVwib2JqLnZhbCBcIiAodHJhaWxpbmcgd2hpdGVzcGFjZSlcbiAgdmFsID0gdmFsLnRyaW0oKTtcbiAgbGVuID0gdmFsLmxlbmd0aDtcblxuICBpZiAodmFsLmluZGV4T2YoJ1snKSA8IDAgfHwgdmFsLmxhc3RJbmRleE9mKCddJykgPCBsZW4gLSAxKSB7XG4gICAgaW5kZXgkMSA9IHZhbC5sYXN0SW5kZXhPZignLicpO1xuICAgIGlmIChpbmRleCQxID4gLTEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4cDogdmFsLnNsaWNlKDAsIGluZGV4JDEpLFxuICAgICAgICBrZXk6ICdcIicgKyB2YWwuc2xpY2UoaW5kZXgkMSArIDEpICsgJ1wiJ1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleHA6IHZhbCxcbiAgICAgICAga2V5OiBudWxsXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RyID0gdmFsO1xuICBpbmRleCQxID0gZXhwcmVzc2lvblBvcyA9IGV4cHJlc3Npb25FbmRQb3MgPSAwO1xuXG4gIHdoaWxlICghZW9mKCkpIHtcbiAgICBjaHIgPSBuZXh0KCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGlzU3RyaW5nU3RhcnQoY2hyKSkge1xuICAgICAgcGFyc2VTdHJpbmcoY2hyKTtcbiAgICB9IGVsc2UgaWYgKGNociA9PT0gMHg1Qikge1xuICAgICAgcGFyc2VCcmFja2V0KGNocik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBleHA6IHZhbC5zbGljZSgwLCBleHByZXNzaW9uUG9zKSxcbiAgICBrZXk6IHZhbC5zbGljZShleHByZXNzaW9uUG9zICsgMSwgZXhwcmVzc2lvbkVuZFBvcylcbiAgfVxufVxuXG5mdW5jdGlvbiBuZXh0ICgpIHtcbiAgcmV0dXJuIHN0ci5jaGFyQ29kZUF0KCsraW5kZXgkMSlcbn1cblxuZnVuY3Rpb24gZW9mICgpIHtcbiAgcmV0dXJuIGluZGV4JDEgPj0gbGVuXG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nU3RhcnQgKGNocikge1xuICByZXR1cm4gY2hyID09PSAweDIyIHx8IGNociA9PT0gMHgyN1xufVxuXG5mdW5jdGlvbiBwYXJzZUJyYWNrZXQgKGNocikge1xuICB2YXIgaW5CcmFja2V0ID0gMTtcbiAgZXhwcmVzc2lvblBvcyA9IGluZGV4JDE7XG4gIHdoaWxlICghZW9mKCkpIHtcbiAgICBjaHIgPSBuZXh0KCk7XG4gICAgaWYgKGlzU3RyaW5nU3RhcnQoY2hyKSkge1xuICAgICAgcGFyc2VTdHJpbmcoY2hyKTtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChjaHIgPT09IDB4NUIpIHsgaW5CcmFja2V0Kys7IH1cbiAgICBpZiAoY2hyID09PSAweDVEKSB7IGluQnJhY2tldC0tOyB9XG4gICAgaWYgKGluQnJhY2tldCA9PT0gMCkge1xuICAgICAgZXhwcmVzc2lvbkVuZFBvcyA9IGluZGV4JDE7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVN0cmluZyAoY2hyKSB7XG4gIHZhciBzdHJpbmdRdW90ZSA9IGNocjtcbiAgd2hpbGUgKCFlb2YoKSkge1xuICAgIGNociA9IG5leHQoKTtcbiAgICBpZiAoY2hyID09PSBzdHJpbmdRdW90ZSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbnZhciB3YXJuJDE7XG5cbi8vIGluIHNvbWUgY2FzZXMsIHRoZSBldmVudCB1c2VkIGhhcyB0byBiZSBkZXRlcm1pbmVkIGF0IHJ1bnRpbWVcbi8vIHNvIHdlIHVzZWQgc29tZSByZXNlcnZlZCB0b2tlbnMgZHVyaW5nIGNvbXBpbGUuXG52YXIgUkFOR0VfVE9LRU4gPSAnX19yJztcbnZhciBDSEVDS0JPWF9SQURJT19UT0tFTiA9ICdfX2MnO1xuXG5mdW5jdGlvbiBtb2RlbCAoXG4gIGVsLFxuICBkaXIsXG4gIF93YXJuXG4pIHtcbiAgd2FybiQxID0gX3dhcm47XG4gIHZhciB2YWx1ZSA9IGRpci52YWx1ZTtcbiAgdmFyIG1vZGlmaWVycyA9IGRpci5tb2RpZmllcnM7XG4gIHZhciB0YWcgPSBlbC50YWc7XG4gIHZhciB0eXBlID0gZWwuYXR0cnNNYXAudHlwZTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIGlucHV0cyB3aXRoIHR5cGU9XCJmaWxlXCIgYXJlIHJlYWQgb25seSBhbmQgc2V0dGluZyB0aGUgaW5wdXQnc1xuICAgIC8vIHZhbHVlIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgaWYgKHRhZyA9PT0gJ2lucHV0JyAmJiB0eXBlID09PSAnZmlsZScpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgXCI8XCIgKyAoZWwudGFnKSArIFwiIHYtbW9kZWw9XFxcIlwiICsgdmFsdWUgKyBcIlxcXCIgdHlwZT1cXFwiZmlsZVxcXCI+OlxcblwiICtcbiAgICAgICAgXCJGaWxlIGlucHV0cyBhcmUgcmVhZCBvbmx5LiBVc2UgYSB2LW9uOmNoYW5nZSBsaXN0ZW5lciBpbnN0ZWFkLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlbC5jb21wb25lbnQpIHtcbiAgICBnZW5Db21wb25lbnRNb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7XG4gICAgLy8gY29tcG9uZW50IHYtbW9kZWwgZG9lc24ndCBuZWVkIGV4dHJhIHJ1bnRpbWVcbiAgICByZXR1cm4gZmFsc2VcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdzZWxlY3QnKSB7XG4gICAgZ2VuU2VsZWN0KGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgIGdlbkNoZWNrYm94TW9kZWwoZWwsIHZhbHVlLCBtb2RpZmllcnMpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ2lucHV0JyAmJiB0eXBlID09PSAncmFkaW8nKSB7XG4gICAgZ2VuUmFkaW9Nb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJykge1xuICAgIGdlbkRlZmF1bHRNb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7XG4gIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHtcbiAgICBnZW5Db21wb25lbnRNb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7XG4gICAgLy8gY29tcG9uZW50IHYtbW9kZWwgZG9lc24ndCBuZWVkIGV4dHJhIHJ1bnRpbWVcbiAgICByZXR1cm4gZmFsc2VcbiAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgd2FybiQxKFxuICAgICAgXCI8XCIgKyAoZWwudGFnKSArIFwiIHYtbW9kZWw9XFxcIlwiICsgdmFsdWUgKyBcIlxcXCI+OiBcIiArXG4gICAgICBcInYtbW9kZWwgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGVsZW1lbnQgdHlwZS4gXCIgK1xuICAgICAgJ0lmIHlvdSBhcmUgd29ya2luZyB3aXRoIGNvbnRlbnRlZGl0YWJsZSwgaXRcXCdzIHJlY29tbWVuZGVkIHRvICcgK1xuICAgICAgJ3dyYXAgYSBsaWJyYXJ5IGRlZGljYXRlZCBmb3IgdGhhdCBwdXJwb3NlIGluc2lkZSBhIGN1c3RvbSBjb21wb25lbnQuJ1xuICAgICk7XG4gIH1cblxuICAvLyBlbnN1cmUgcnVudGltZSBkaXJlY3RpdmUgbWV0YWRhdGFcbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gZ2VuQ2hlY2tib3hNb2RlbCAoXG4gIGVsLFxuICB2YWx1ZSxcbiAgbW9kaWZpZXJzXG4pIHtcbiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyO1xuICB2YXIgdmFsdWVCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICd2YWx1ZScpIHx8ICdudWxsJztcbiAgdmFyIHRydWVWYWx1ZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3RydWUtdmFsdWUnKSB8fCAndHJ1ZSc7XG4gIHZhciBmYWxzZVZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAnZmFsc2UtdmFsdWUnKSB8fCAnZmFsc2UnO1xuICBhZGRQcm9wKGVsLCAnY2hlY2tlZCcsXG4gICAgXCJBcnJheS5pc0FycmF5KFwiICsgdmFsdWUgKyBcIilcIiArXG4gICAgXCI/X2koXCIgKyB2YWx1ZSArIFwiLFwiICsgdmFsdWVCaW5kaW5nICsgXCIpPi0xXCIgKyAoXG4gICAgICB0cnVlVmFsdWVCaW5kaW5nID09PSAndHJ1ZSdcbiAgICAgICAgPyAoXCI6KFwiICsgdmFsdWUgKyBcIilcIilcbiAgICAgICAgOiAoXCI6X3EoXCIgKyB2YWx1ZSArIFwiLFwiICsgdHJ1ZVZhbHVlQmluZGluZyArIFwiKVwiKVxuICAgIClcbiAgKTtcbiAgYWRkSGFuZGxlcihlbCwgJ2NoYW5nZScsXG4gICAgXCJ2YXIgJCRhPVwiICsgdmFsdWUgKyBcIixcIiArXG4gICAgICAgICckJGVsPSRldmVudC50YXJnZXQsJyArXG4gICAgICAgIFwiJCRjPSQkZWwuY2hlY2tlZD8oXCIgKyB0cnVlVmFsdWVCaW5kaW5nICsgXCIpOihcIiArIGZhbHNlVmFsdWVCaW5kaW5nICsgXCIpO1wiICtcbiAgICAnaWYoQXJyYXkuaXNBcnJheSgkJGEpKXsnICtcbiAgICAgIFwidmFyICQkdj1cIiArIChudW1iZXIgPyAnX24oJyArIHZhbHVlQmluZGluZyArICcpJyA6IHZhbHVlQmluZGluZykgKyBcIixcIiArXG4gICAgICAgICAgJyQkaT1faSgkJGEsJCR2KTsnICtcbiAgICAgIFwiaWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKFwiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRhLmNvbmNhdChbJCR2XSknKSkgKyBcIil9XCIgK1xuICAgICAgXCJlbHNleyQkaT4tMSYmKFwiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSknKSkgKyBcIil9XCIgK1xuICAgIFwifWVsc2V7XCIgKyAoZ2VuQXNzaWdubWVudENvZGUodmFsdWUsICckJGMnKSkgKyBcIn1cIixcbiAgICBudWxsLCB0cnVlXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdlblJhZGlvTW9kZWwgKFxuICBlbCxcbiAgdmFsdWUsXG4gIG1vZGlmaWVyc1xuKSB7XG4gIHZhciBudW1iZXIgPSBtb2RpZmllcnMgJiYgbW9kaWZpZXJzLm51bWJlcjtcbiAgdmFyIHZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndmFsdWUnKSB8fCAnbnVsbCc7XG4gIHZhbHVlQmluZGluZyA9IG51bWJlciA/IChcIl9uKFwiICsgdmFsdWVCaW5kaW5nICsgXCIpXCIpIDogdmFsdWVCaW5kaW5nO1xuICBhZGRQcm9wKGVsLCAnY2hlY2tlZCcsIChcIl9xKFwiICsgdmFsdWUgKyBcIixcIiArIHZhbHVlQmluZGluZyArIFwiKVwiKSk7XG4gIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLCBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgdmFsdWVCaW5kaW5nKSwgbnVsbCwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGdlblNlbGVjdCAoXG4gIGVsLFxuICB2YWx1ZSxcbiAgbW9kaWZpZXJzXG4pIHtcbiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyO1xuICB2YXIgc2VsZWN0ZWRWYWwgPSBcIkFycmF5LnByb3RvdHlwZS5maWx0ZXJcIiArXG4gICAgXCIuY2FsbCgkZXZlbnQudGFyZ2V0Lm9wdGlvbnMsZnVuY3Rpb24obyl7cmV0dXJuIG8uc2VsZWN0ZWR9KVwiICtcbiAgICBcIi5tYXAoZnVuY3Rpb24obyl7dmFyIHZhbCA9IFxcXCJfdmFsdWVcXFwiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWU7XCIgK1xuICAgIFwicmV0dXJuIFwiICsgKG51bWJlciA/ICdfbih2YWwpJyA6ICd2YWwnKSArIFwifSlcIjtcblxuICB2YXIgYXNzaWdubWVudCA9ICckZXZlbnQudGFyZ2V0Lm11bHRpcGxlID8gJCRzZWxlY3RlZFZhbCA6ICQkc2VsZWN0ZWRWYWxbMF0nO1xuICB2YXIgY29kZSA9IFwidmFyICQkc2VsZWN0ZWRWYWwgPSBcIiArIHNlbGVjdGVkVmFsICsgXCI7XCI7XG4gIGNvZGUgPSBjb2RlICsgXCIgXCIgKyAoZ2VuQXNzaWdubWVudENvZGUodmFsdWUsIGFzc2lnbm1lbnQpKTtcbiAgYWRkSGFuZGxlcihlbCwgJ2NoYW5nZScsIGNvZGUsIG51bGwsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBnZW5EZWZhdWx0TW9kZWwgKFxuICBlbCxcbiAgdmFsdWUsXG4gIG1vZGlmaWVyc1xuKSB7XG4gIHZhciB0eXBlID0gZWwuYXR0cnNNYXAudHlwZTtcblxuICAvLyB3YXJuIGlmIHYtYmluZDp2YWx1ZSBjb25mbGljdHMgd2l0aCB2LW1vZGVsXG4gIC8vIGV4Y2VwdCBmb3IgaW5wdXRzIHdpdGggdi1iaW5kOnR5cGVcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgdmFsdWUkMSA9IGVsLmF0dHJzTWFwWyd2LWJpbmQ6dmFsdWUnXSB8fCBlbC5hdHRyc01hcFsnOnZhbHVlJ107XG4gICAgdmFyIHR5cGVCaW5kaW5nID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp0eXBlJ10gfHwgZWwuYXR0cnNNYXBbJzp0eXBlJ107XG4gICAgaWYgKHZhbHVlJDEgJiYgIXR5cGVCaW5kaW5nKSB7XG4gICAgICB2YXIgYmluZGluZyA9IGVsLmF0dHJzTWFwWyd2LWJpbmQ6dmFsdWUnXSA/ICd2LWJpbmQ6dmFsdWUnIDogJzp2YWx1ZSc7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGJpbmRpbmcgKyBcIj1cXFwiXCIgKyB2YWx1ZSQxICsgXCJcXFwiIGNvbmZsaWN0cyB3aXRoIHYtbW9kZWwgb24gdGhlIHNhbWUgZWxlbWVudCBcIiArXG4gICAgICAgICdiZWNhdXNlIHRoZSBsYXR0ZXIgYWxyZWFkeSBleHBhbmRzIHRvIGEgdmFsdWUgYmluZGluZyBpbnRlcm5hbGx5J1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcmVmID0gbW9kaWZpZXJzIHx8IHt9O1xuICB2YXIgbGF6eSA9IHJlZi5sYXp5O1xuICB2YXIgbnVtYmVyID0gcmVmLm51bWJlcjtcbiAgdmFyIHRyaW0gPSByZWYudHJpbTtcbiAgdmFyIG5lZWRDb21wb3NpdGlvbkd1YXJkID0gIWxhenkgJiYgdHlwZSAhPT0gJ3JhbmdlJztcbiAgdmFyIGV2ZW50ID0gbGF6eVxuICAgID8gJ2NoYW5nZSdcbiAgICA6IHR5cGUgPT09ICdyYW5nZSdcbiAgICAgID8gUkFOR0VfVE9LRU5cbiAgICAgIDogJ2lucHV0JztcblxuICB2YXIgdmFsdWVFeHByZXNzaW9uID0gJyRldmVudC50YXJnZXQudmFsdWUnO1xuICBpZiAodHJpbSkge1xuICAgIHZhbHVlRXhwcmVzc2lvbiA9IFwiJGV2ZW50LnRhcmdldC52YWx1ZS50cmltKClcIjtcbiAgfVxuICBpZiAobnVtYmVyKSB7XG4gICAgdmFsdWVFeHByZXNzaW9uID0gXCJfbihcIiArIHZhbHVlRXhwcmVzc2lvbiArIFwiKVwiO1xuICB9XG5cbiAgdmFyIGNvZGUgPSBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgdmFsdWVFeHByZXNzaW9uKTtcbiAgaWYgKG5lZWRDb21wb3NpdGlvbkd1YXJkKSB7XG4gICAgY29kZSA9IFwiaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuO1wiICsgY29kZTtcbiAgfVxuXG4gIGFkZFByb3AoZWwsICd2YWx1ZScsIChcIihcIiArIHZhbHVlICsgXCIpXCIpKTtcbiAgYWRkSGFuZGxlcihlbCwgZXZlbnQsIGNvZGUsIG51bGwsIHRydWUpO1xuICBpZiAodHJpbSB8fCBudW1iZXIpIHtcbiAgICBhZGRIYW5kbGVyKGVsLCAnYmx1cicsICckZm9yY2VVcGRhdGUoKScpO1xuICB9XG59XG5cbi8qICAqL1xuXG4vLyBub3JtYWxpemUgdi1tb2RlbCBldmVudCB0b2tlbnMgdGhhdCBjYW4gb25seSBiZSBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUuXG4vLyBpdCdzIGltcG9ydGFudCB0byBwbGFjZSB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGluIHRoZSBhcnJheSBiZWNhdXNlXG4vLyB0aGUgd2hvbGUgcG9pbnQgaXMgZW5zdXJpbmcgdGhlIHYtbW9kZWwgY2FsbGJhY2sgZ2V0cyBjYWxsZWQgYmVmb3JlXG4vLyB1c2VyLWF0dGFjaGVkIGhhbmRsZXJzLlxuZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRzIChvbikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzRGVmKG9uW1JBTkdFX1RPS0VOXSkpIHtcbiAgICAvLyBJRSBpbnB1dFt0eXBlPXJhbmdlXSBvbmx5IHN1cHBvcnRzIGBjaGFuZ2VgIGV2ZW50XG4gICAgdmFyIGV2ZW50ID0gaXNJRSA/ICdjaGFuZ2UnIDogJ2lucHV0JztcbiAgICBvbltldmVudF0gPSBbXS5jb25jYXQob25bUkFOR0VfVE9LRU5dLCBvbltldmVudF0gfHwgW10pO1xuICAgIGRlbGV0ZSBvbltSQU5HRV9UT0tFTl07XG4gIH1cbiAgLy8gVGhpcyB3YXMgb3JpZ2luYWxseSBpbnRlbmRlZCB0byBmaXggIzQ1MjEgYnV0IG5vIGxvbmdlciBuZWNlc3NhcnlcbiAgLy8gYWZ0ZXIgMi41LiBLZWVwaW5nIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0IHdpdGggZ2VuZXJhdGVkIGNvZGUgZnJvbSA8IDIuNFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzRGVmKG9uW0NIRUNLQk9YX1JBRElPX1RPS0VOXSkpIHtcbiAgICBvbi5jaGFuZ2UgPSBbXS5jb25jYXQob25bQ0hFQ0tCT1hfUkFESU9fVE9LRU5dLCBvbi5jaGFuZ2UgfHwgW10pO1xuICAgIGRlbGV0ZSBvbltDSEVDS0JPWF9SQURJT19UT0tFTl07XG4gIH1cbn1cblxudmFyIHRhcmdldCQxO1xuXG5mdW5jdGlvbiBjcmVhdGVPbmNlSGFuZGxlciAoaGFuZGxlciwgZXZlbnQsIGNhcHR1cmUpIHtcbiAgdmFyIF90YXJnZXQgPSB0YXJnZXQkMTsgLy8gc2F2ZSBjdXJyZW50IHRhcmdldCBlbGVtZW50IGluIGNsb3N1cmVcbiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHtcbiAgICB2YXIgcmVzID0gaGFuZGxlci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIGlmIChyZXMgIT09IG51bGwpIHtcbiAgICAgIHJlbW92ZSQyKGV2ZW50LCBvbmNlSGFuZGxlciwgY2FwdHVyZSwgX3RhcmdldCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZCQxIChcbiAgZXZlbnQsXG4gIGhhbmRsZXIsXG4gIG9uY2UkJDEsXG4gIGNhcHR1cmUsXG4gIHBhc3NpdmVcbikge1xuICBoYW5kbGVyID0gd2l0aE1hY3JvVGFzayhoYW5kbGVyKTtcbiAgaWYgKG9uY2UkJDEpIHsgaGFuZGxlciA9IGNyZWF0ZU9uY2VIYW5kbGVyKGhhbmRsZXIsIGV2ZW50LCBjYXB0dXJlKTsgfVxuICB0YXJnZXQkMS5hZGRFdmVudExpc3RlbmVyKFxuICAgIGV2ZW50LFxuICAgIGhhbmRsZXIsXG4gICAgc3VwcG9ydHNQYXNzaXZlXG4gICAgICA/IHsgY2FwdHVyZTogY2FwdHVyZSwgcGFzc2l2ZTogcGFzc2l2ZSB9XG4gICAgICA6IGNhcHR1cmVcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlJDIgKFxuICBldmVudCxcbiAgaGFuZGxlcixcbiAgY2FwdHVyZSxcbiAgX3RhcmdldFxuKSB7XG4gIChfdGFyZ2V0IHx8IHRhcmdldCQxKS5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgIGV2ZW50LFxuICAgIGhhbmRsZXIuX3dpdGhUYXNrIHx8IGhhbmRsZXIsXG4gICAgY2FwdHVyZVxuICApO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVET01MaXN0ZW5lcnMgKG9sZFZub2RlLCB2bm9kZSkge1xuICBpZiAoaXNVbmRlZihvbGRWbm9kZS5kYXRhLm9uKSAmJiBpc1VuZGVmKHZub2RlLmRhdGEub24pKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIG9uID0gdm5vZGUuZGF0YS5vbiB8fCB7fTtcbiAgdmFyIG9sZE9uID0gb2xkVm5vZGUuZGF0YS5vbiB8fCB7fTtcbiAgdGFyZ2V0JDEgPSB2bm9kZS5lbG07XG4gIG5vcm1hbGl6ZUV2ZW50cyhvbik7XG4gIHVwZGF0ZUxpc3RlbmVycyhvbiwgb2xkT24sIGFkZCQxLCByZW1vdmUkMiwgdm5vZGUuY29udGV4dCk7XG4gIHRhcmdldCQxID0gdW5kZWZpbmVkO1xufVxuXG52YXIgZXZlbnRzID0ge1xuICBjcmVhdGU6IHVwZGF0ZURPTUxpc3RlbmVycyxcbiAgdXBkYXRlOiB1cGRhdGVET01MaXN0ZW5lcnNcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIHVwZGF0ZURPTVByb3BzIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgaWYgKGlzVW5kZWYob2xkVm5vZGUuZGF0YS5kb21Qcm9wcykgJiYgaXNVbmRlZih2bm9kZS5kYXRhLmRvbVByb3BzKSkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciBrZXksIGN1cjtcbiAgdmFyIGVsbSA9IHZub2RlLmVsbTtcbiAgdmFyIG9sZFByb3BzID0gb2xkVm5vZGUuZGF0YS5kb21Qcm9wcyB8fCB7fTtcbiAgdmFyIHByb3BzID0gdm5vZGUuZGF0YS5kb21Qcm9wcyB8fCB7fTtcbiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0XG4gIGlmIChpc0RlZihwcm9wcy5fX29iX18pKSB7XG4gICAgcHJvcHMgPSB2bm9kZS5kYXRhLmRvbVByb3BzID0gZXh0ZW5kKHt9LCBwcm9wcyk7XG4gIH1cblxuICBmb3IgKGtleSBpbiBvbGRQcm9wcykge1xuICAgIGlmIChpc1VuZGVmKHByb3BzW2tleV0pKSB7XG4gICAgICBlbG1ba2V5XSA9ICcnO1xuICAgIH1cbiAgfVxuICBmb3IgKGtleSBpbiBwcm9wcykge1xuICAgIGN1ciA9IHByb3BzW2tleV07XG4gICAgLy8gaWdub3JlIGNoaWxkcmVuIGlmIHRoZSBub2RlIGhhcyB0ZXh0Q29udGVudCBvciBpbm5lckhUTUwsXG4gICAgLy8gYXMgdGhlc2Ugd2lsbCB0aHJvdyBhd2F5IGV4aXN0aW5nIERPTSBub2RlcyBhbmQgY2F1c2UgcmVtb3ZhbCBlcnJvcnNcbiAgICAvLyBvbiBzdWJzZXF1ZW50IHBhdGNoZXMgKCMzMzYwKVxuICAgIGlmIChrZXkgPT09ICd0ZXh0Q29udGVudCcgfHwga2V5ID09PSAnaW5uZXJIVE1MJykge1xuICAgICAgaWYgKHZub2RlLmNoaWxkcmVuKSB7IHZub2RlLmNoaWxkcmVuLmxlbmd0aCA9IDA7IH1cbiAgICAgIGlmIChjdXIgPT09IG9sZFByb3BzW2tleV0pIHsgY29udGludWUgfVxuICAgICAgLy8gIzY2MDEgd29yayBhcm91bmQgQ2hyb21lIHZlcnNpb24gPD0gNTUgYnVnIHdoZXJlIHNpbmdsZSB0ZXh0Tm9kZVxuICAgICAgLy8gcmVwbGFjZWQgYnkgaW5uZXJIVE1ML3RleHRDb250ZW50IHJldGFpbnMgaXRzIHBhcmVudE5vZGUgcHJvcGVydHlcbiAgICAgIGlmIChlbG0uY2hpbGROb2Rlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZWxtLnJlbW92ZUNoaWxkKGVsbS5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAndmFsdWUnKSB7XG4gICAgICAvLyBzdG9yZSB2YWx1ZSBhcyBfdmFsdWUgYXMgd2VsbCBzaW5jZVxuICAgICAgLy8gbm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBzdHJpbmdpZmllZFxuICAgICAgZWxtLl92YWx1ZSA9IGN1cjtcbiAgICAgIC8vIGF2b2lkIHJlc2V0dGluZyBjdXJzb3IgcG9zaXRpb24gd2hlbiB2YWx1ZSBpcyB0aGUgc2FtZVxuICAgICAgdmFyIHN0ckN1ciA9IGlzVW5kZWYoY3VyKSA/ICcnIDogU3RyaW5nKGN1cik7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlVmFsdWUoZWxtLCBzdHJDdXIpKSB7XG4gICAgICAgIGVsbS52YWx1ZSA9IHN0ckN1cjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWxtW2tleV0gPSBjdXI7XG4gICAgfVxuICB9XG59XG5cbi8vIGNoZWNrIHBsYXRmb3Jtcy93ZWIvdXRpbC9hdHRycy5qcyBhY2NlcHRWYWx1ZVxuXG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZVZhbHVlIChlbG0sIGNoZWNrVmFsKSB7XG4gIHJldHVybiAoIWVsbS5jb21wb3NpbmcgJiYgKFxuICAgIGVsbS50YWdOYW1lID09PSAnT1BUSU9OJyB8fFxuICAgIGlzTm90SW5Gb2N1c0FuZERpcnR5KGVsbSwgY2hlY2tWYWwpIHx8XG4gICAgaXNEaXJ0eVdpdGhNb2RpZmllcnMoZWxtLCBjaGVja1ZhbClcbiAgKSlcbn1cblxuZnVuY3Rpb24gaXNOb3RJbkZvY3VzQW5kRGlydHkgKGVsbSwgY2hlY2tWYWwpIHtcbiAgLy8gcmV0dXJuIHRydWUgd2hlbiB0ZXh0Ym94ICgubnVtYmVyIGFuZCAudHJpbSkgbG9zZXMgZm9jdXMgYW5kIGl0cyB2YWx1ZSBpc1xuICAvLyBub3QgZXF1YWwgdG8gdGhlIHVwZGF0ZWQgdmFsdWVcbiAgdmFyIG5vdEluRm9jdXMgPSB0cnVlO1xuICAvLyAjNjE1N1xuICAvLyB3b3JrIGFyb3VuZCBJRSBidWcgd2hlbiBhY2Nlc3NpbmcgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpbiBhbiBpZnJhbWVcbiAgdHJ5IHsgbm90SW5Gb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVsbTsgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIG5vdEluRm9jdXMgJiYgZWxtLnZhbHVlICE9PSBjaGVja1ZhbFxufVxuXG5mdW5jdGlvbiBpc0RpcnR5V2l0aE1vZGlmaWVycyAoZWxtLCBuZXdWYWwpIHtcbiAgdmFyIHZhbHVlID0gZWxtLnZhbHVlO1xuICB2YXIgbW9kaWZpZXJzID0gZWxtLl92TW9kaWZpZXJzOyAvLyBpbmplY3RlZCBieSB2LW1vZGVsIHJ1bnRpbWVcbiAgaWYgKGlzRGVmKG1vZGlmaWVycykpIHtcbiAgICBpZiAobW9kaWZpZXJzLmxhenkpIHtcbiAgICAgIC8vIGlucHV0cyB3aXRoIGxhenkgc2hvdWxkIG9ubHkgYmUgdXBkYXRlZCB3aGVuIG5vdCBpbiBmb2N1c1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChtb2RpZmllcnMubnVtYmVyKSB7XG4gICAgICByZXR1cm4gdG9OdW1iZXIodmFsdWUpICE9PSB0b051bWJlcihuZXdWYWwpXG4gICAgfVxuICAgIGlmIChtb2RpZmllcnMudHJpbSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKSAhPT0gbmV3VmFsLnRyaW0oKVxuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWUgIT09IG5ld1ZhbFxufVxuXG52YXIgZG9tUHJvcHMgPSB7XG4gIGNyZWF0ZTogdXBkYXRlRE9NUHJvcHMsXG4gIHVwZGF0ZTogdXBkYXRlRE9NUHJvcHNcbn1cblxuLyogICovXG5cbnZhciBwYXJzZVN0eWxlVGV4dCA9IGNhY2hlZChmdW5jdGlvbiAoY3NzVGV4dCkge1xuICB2YXIgcmVzID0ge307XG4gIHZhciBsaXN0RGVsaW1pdGVyID0gLzsoPyFbXihdKlxcKSkvZztcbiAgdmFyIHByb3BlcnR5RGVsaW1pdGVyID0gLzooLispLztcbiAgY3NzVGV4dC5zcGxpdChsaXN0RGVsaW1pdGVyKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHZhciB0bXAgPSBpdGVtLnNwbGl0KHByb3BlcnR5RGVsaW1pdGVyKTtcbiAgICAgIHRtcC5sZW5ndGggPiAxICYmIChyZXNbdG1wWzBdLnRyaW0oKV0gPSB0bXBbMV0udHJpbSgpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzXG59KTtcblxuLy8gbWVyZ2Ugc3RhdGljIGFuZCBkeW5hbWljIHN0eWxlIGRhdGEgb24gdGhlIHNhbWUgdm5vZGVcbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0eWxlRGF0YSAoZGF0YSkge1xuICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcoZGF0YS5zdHlsZSk7XG4gIC8vIHN0YXRpYyBzdHlsZSBpcyBwcmUtcHJvY2Vzc2VkIGludG8gYW4gb2JqZWN0IGR1cmluZyBjb21waWxhdGlvblxuICAvLyBhbmQgaXMgYWx3YXlzIGEgZnJlc2ggb2JqZWN0LCBzbyBpdCdzIHNhZmUgdG8gbWVyZ2UgaW50byBpdFxuICByZXR1cm4gZGF0YS5zdGF0aWNTdHlsZVxuICAgID8gZXh0ZW5kKGRhdGEuc3RhdGljU3R5bGUsIHN0eWxlKVxuICAgIDogc3R5bGVcbn1cblxuLy8gbm9ybWFsaXplIHBvc3NpYmxlIGFycmF5IC8gc3RyaW5nIHZhbHVlcyBpbnRvIE9iamVjdFxuZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVCaW5kaW5nIChiaW5kaW5nU3R5bGUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYmluZGluZ1N0eWxlKSkge1xuICAgIHJldHVybiB0b09iamVjdChiaW5kaW5nU3R5bGUpXG4gIH1cbiAgaWYgKHR5cGVvZiBiaW5kaW5nU3R5bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhcnNlU3R5bGVUZXh0KGJpbmRpbmdTdHlsZSlcbiAgfVxuICByZXR1cm4gYmluZGluZ1N0eWxlXG59XG5cbi8qKlxuICogcGFyZW50IGNvbXBvbmVudCBzdHlsZSBzaG91bGQgYmUgYWZ0ZXIgY2hpbGQnc1xuICogc28gdGhhdCBwYXJlbnQgY29tcG9uZW50J3Mgc3R5bGUgY291bGQgb3ZlcnJpZGUgaXRcbiAqL1xuZnVuY3Rpb24gZ2V0U3R5bGUgKHZub2RlLCBjaGVja0NoaWxkKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIHN0eWxlRGF0YTtcblxuICBpZiAoY2hlY2tDaGlsZCkge1xuICAgIHZhciBjaGlsZE5vZGUgPSB2bm9kZTtcbiAgICB3aGlsZSAoY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO1xuICAgICAgaWYgKFxuICAgICAgICBjaGlsZE5vZGUgJiYgY2hpbGROb2RlLmRhdGEgJiZcbiAgICAgICAgKHN0eWxlRGF0YSA9IG5vcm1hbGl6ZVN0eWxlRGF0YShjaGlsZE5vZGUuZGF0YSkpXG4gICAgICApIHtcbiAgICAgICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoKHN0eWxlRGF0YSA9IG5vcm1hbGl6ZVN0eWxlRGF0YSh2bm9kZS5kYXRhKSkpIHtcbiAgICBleHRlbmQocmVzLCBzdHlsZURhdGEpO1xuICB9XG5cbiAgdmFyIHBhcmVudE5vZGUgPSB2bm9kZTtcbiAgd2hpbGUgKChwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnQpKSB7XG4gICAgaWYgKHBhcmVudE5vZGUuZGF0YSAmJiAoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKHBhcmVudE5vZGUuZGF0YSkpKSB7XG4gICAgICBleHRlbmQocmVzLCBzdHlsZURhdGEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbi8qICAqL1xuXG52YXIgY3NzVmFyUkUgPSAvXi0tLztcbnZhciBpbXBvcnRhbnRSRSA9IC9cXHMqIWltcG9ydGFudCQvO1xudmFyIHNldFByb3AgPSBmdW5jdGlvbiAoZWwsIG5hbWUsIHZhbCkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGNzc1ZhclJFLnRlc3QobmFtZSkpIHtcbiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWwpO1xuICB9IGVsc2UgaWYgKGltcG9ydGFudFJFLnRlc3QodmFsKSkge1xuICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbC5yZXBsYWNlKGltcG9ydGFudFJFLCAnJyksICdpbXBvcnRhbnQnKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemUobmFtZSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgLy8gU3VwcG9ydCB2YWx1ZXMgYXJyYXkgY3JlYXRlZCBieSBhdXRvcHJlZml4ZXIsIGUuZy5cbiAgICAgIC8vIHtkaXNwbGF5OiBbXCItd2Via2l0LWJveFwiLCBcIi1tcy1mbGV4Ym94XCIsIFwiZmxleFwiXX1cbiAgICAgIC8vIFNldCB0aGVtIG9uZSBieSBvbmUsIGFuZCB0aGUgYnJvd3NlciB3aWxsIG9ubHkgc2V0IHRob3NlIGl0IGNhbiByZWNvZ25pemVcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB2YWwubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgZWwuc3R5bGVbbm9ybWFsaXplZE5hbWVdID0gdmFsW2ldO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zdHlsZVtub3JtYWxpemVkTmFtZV0gPSB2YWw7XG4gICAgfVxuICB9XG59O1xuXG52YXIgdmVuZG9yTmFtZXMgPSBbJ1dlYmtpdCcsICdNb3onLCAnbXMnXTtcblxudmFyIGVtcHR5U3R5bGU7XG52YXIgbm9ybWFsaXplID0gY2FjaGVkKGZ1bmN0aW9uIChwcm9wKSB7XG4gIGVtcHR5U3R5bGUgPSBlbXB0eVN0eWxlIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLnN0eWxlO1xuICBwcm9wID0gY2FtZWxpemUocHJvcCk7XG4gIGlmIChwcm9wICE9PSAnZmlsdGVyJyAmJiAocHJvcCBpbiBlbXB0eVN0eWxlKSkge1xuICAgIHJldHVybiBwcm9wXG4gIH1cbiAgdmFyIGNhcE5hbWUgPSBwcm9wLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcC5zbGljZSgxKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZW5kb3JOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBuYW1lID0gdmVuZG9yTmFtZXNbaV0gKyBjYXBOYW1lO1xuICAgIGlmIChuYW1lIGluIGVtcHR5U3R5bGUpIHtcbiAgICAgIHJldHVybiBuYW1lXG4gICAgfVxuICB9XG59KTtcblxuZnVuY3Rpb24gdXBkYXRlU3R5bGUgKG9sZFZub2RlLCB2bm9kZSkge1xuICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7XG4gIHZhciBvbGREYXRhID0gb2xkVm5vZGUuZGF0YTtcblxuICBpZiAoaXNVbmRlZihkYXRhLnN0YXRpY1N0eWxlKSAmJiBpc1VuZGVmKGRhdGEuc3R5bGUpICYmXG4gICAgaXNVbmRlZihvbGREYXRhLnN0YXRpY1N0eWxlKSAmJiBpc1VuZGVmKG9sZERhdGEuc3R5bGUpXG4gICkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGN1ciwgbmFtZTtcbiAgdmFyIGVsID0gdm5vZGUuZWxtO1xuICB2YXIgb2xkU3RhdGljU3R5bGUgPSBvbGREYXRhLnN0YXRpY1N0eWxlO1xuICB2YXIgb2xkU3R5bGVCaW5kaW5nID0gb2xkRGF0YS5ub3JtYWxpemVkU3R5bGUgfHwgb2xkRGF0YS5zdHlsZSB8fCB7fTtcblxuICAvLyBpZiBzdGF0aWMgc3R5bGUgZXhpc3RzLCBzdHlsZWJpbmRpbmcgYWxyZWFkeSBtZXJnZWQgaW50byBpdCB3aGVuIGRvaW5nIG5vcm1hbGl6ZVN0eWxlRGF0YVxuICB2YXIgb2xkU3R5bGUgPSBvbGRTdGF0aWNTdHlsZSB8fCBvbGRTdHlsZUJpbmRpbmc7XG5cbiAgdmFyIHN0eWxlID0gbm9ybWFsaXplU3R5bGVCaW5kaW5nKHZub2RlLmRhdGEuc3R5bGUpIHx8IHt9O1xuXG4gIC8vIHN0b3JlIG5vcm1hbGl6ZWQgc3R5bGUgdW5kZXIgYSBkaWZmZXJlbnQga2V5IGZvciBuZXh0IGRpZmZcbiAgLy8gbWFrZSBzdXJlIHRvIGNsb25lIGl0IGlmIGl0J3MgcmVhY3RpdmUsIHNpbmNlIHRoZSB1c2VyIGxpa2VseSB3YW50c1xuICAvLyB0byBtdXRhdGUgaXQuXG4gIHZub2RlLmRhdGEubm9ybWFsaXplZFN0eWxlID0gaXNEZWYoc3R5bGUuX19vYl9fKVxuICAgID8gZXh0ZW5kKHt9LCBzdHlsZSlcbiAgICA6IHN0eWxlO1xuXG4gIHZhciBuZXdTdHlsZSA9IGdldFN0eWxlKHZub2RlLCB0cnVlKTtcblxuICBmb3IgKG5hbWUgaW4gb2xkU3R5bGUpIHtcbiAgICBpZiAoaXNVbmRlZihuZXdTdHlsZVtuYW1lXSkpIHtcbiAgICAgIHNldFByb3AoZWwsIG5hbWUsICcnKTtcbiAgICB9XG4gIH1cbiAgZm9yIChuYW1lIGluIG5ld1N0eWxlKSB7XG4gICAgY3VyID0gbmV3U3R5bGVbbmFtZV07XG4gICAgaWYgKGN1ciAhPT0gb2xkU3R5bGVbbmFtZV0pIHtcbiAgICAgIC8vIGllOSBzZXR0aW5nIHRvIG51bGwgaGFzIG5vIGVmZmVjdCwgbXVzdCB1c2UgZW1wdHkgc3RyaW5nXG4gICAgICBzZXRQcm9wKGVsLCBuYW1lLCBjdXIgPT0gbnVsbCA/ICcnIDogY3VyKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHN0eWxlID0ge1xuICBjcmVhdGU6IHVwZGF0ZVN0eWxlLFxuICB1cGRhdGU6IHVwZGF0ZVN0eWxlXG59XG5cbi8qICAqL1xuXG4vKipcbiAqIEFkZCBjbGFzcyB3aXRoIGNvbXBhdGliaWxpdHkgZm9yIFNWRyBzaW5jZSBjbGFzc0xpc3QgaXMgbm90IHN1cHBvcnRlZCBvblxuICogU1ZHIGVsZW1lbnRzIGluIElFXG4gKi9cbmZ1bmN0aW9uIGFkZENsYXNzIChlbCwgY2xzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkge1xuICAgICAgY2xzLnNwbGl0KC9cXHMrLykuZm9yRWFjaChmdW5jdGlvbiAoYykgeyByZXR1cm4gZWwuY2xhc3NMaXN0LmFkZChjKTsgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoY2xzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGN1ciA9IFwiIFwiICsgKGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyBcIiBcIjtcbiAgICBpZiAoY3VyLmluZGV4T2YoJyAnICsgY2xzICsgJyAnKSA8IDApIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAoY3VyICsgY2xzKS50cmltKCkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSBjbGFzcyB3aXRoIGNvbXBhdGliaWxpdHkgZm9yIFNWRyBzaW5jZSBjbGFzc0xpc3QgaXMgbm90IHN1cHBvcnRlZCBvblxuICogU1ZHIGVsZW1lbnRzIGluIElFXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUNsYXNzIChlbCwgY2xzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkge1xuICAgICAgY2xzLnNwbGl0KC9cXHMrLykuZm9yRWFjaChmdW5jdGlvbiAoYykgeyByZXR1cm4gZWwuY2xhc3NMaXN0LnJlbW92ZShjKTsgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xzKTtcbiAgICB9XG4gICAgaWYgKCFlbC5jbGFzc0xpc3QubGVuZ3RoKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBjdXIgPSBcIiBcIiArIChlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgXCIgXCI7XG4gICAgdmFyIHRhciA9ICcgJyArIGNscyArICcgJztcbiAgICB3aGlsZSAoY3VyLmluZGV4T2YodGFyKSA+PSAwKSB7XG4gICAgICBjdXIgPSBjdXIucmVwbGFjZSh0YXIsICcgJyk7XG4gICAgfVxuICAgIGN1ciA9IGN1ci50cmltKCk7XG4gICAgaWYgKGN1cikge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIGN1cik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTtcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uIChkZWYpIHtcbiAgaWYgKCFkZWYpIHtcbiAgICByZXR1cm5cbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAodHlwZW9mIGRlZiA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgcmVzID0ge307XG4gICAgaWYgKGRlZi5jc3MgIT09IGZhbHNlKSB7XG4gICAgICBleHRlbmQocmVzLCBhdXRvQ3NzVHJhbnNpdGlvbihkZWYubmFtZSB8fCAndicpKTtcbiAgICB9XG4gICAgZXh0ZW5kKHJlcywgZGVmKTtcbiAgICByZXR1cm4gcmVzXG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlZiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gYXV0b0Nzc1RyYW5zaXRpb24oZGVmKVxuICB9XG59XG5cbnZhciBhdXRvQ3NzVHJhbnNpdGlvbiA9IGNhY2hlZChmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4ge1xuICAgIGVudGVyQ2xhc3M6IChuYW1lICsgXCItZW50ZXJcIiksXG4gICAgZW50ZXJUb0NsYXNzOiAobmFtZSArIFwiLWVudGVyLXRvXCIpLFxuICAgIGVudGVyQWN0aXZlQ2xhc3M6IChuYW1lICsgXCItZW50ZXItYWN0aXZlXCIpLFxuICAgIGxlYXZlQ2xhc3M6IChuYW1lICsgXCItbGVhdmVcIiksXG4gICAgbGVhdmVUb0NsYXNzOiAobmFtZSArIFwiLWxlYXZlLXRvXCIpLFxuICAgIGxlYXZlQWN0aXZlQ2xhc3M6IChuYW1lICsgXCItbGVhdmUtYWN0aXZlXCIpXG4gIH1cbn0pO1xuXG52YXIgaGFzVHJhbnNpdGlvbiA9IGluQnJvd3NlciAmJiAhaXNJRTk7XG52YXIgVFJBTlNJVElPTiA9ICd0cmFuc2l0aW9uJztcbnZhciBBTklNQVRJT04gPSAnYW5pbWF0aW9uJztcblxuLy8gVHJhbnNpdGlvbiBwcm9wZXJ0eS9ldmVudCBzbmlmZmluZ1xudmFyIHRyYW5zaXRpb25Qcm9wID0gJ3RyYW5zaXRpb24nO1xudmFyIHRyYW5zaXRpb25FbmRFdmVudCA9ICd0cmFuc2l0aW9uZW5kJztcbnZhciBhbmltYXRpb25Qcm9wID0gJ2FuaW1hdGlvbic7XG52YXIgYW5pbWF0aW9uRW5kRXZlbnQgPSAnYW5pbWF0aW9uZW5kJztcbmlmIChoYXNUcmFuc2l0aW9uKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAod2luZG93Lm9udHJhbnNpdGlvbmVuZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgd2luZG93Lm9ud2Via2l0dHJhbnNpdGlvbmVuZCAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIHRyYW5zaXRpb25Qcm9wID0gJ1dlYmtpdFRyYW5zaXRpb24nO1xuICAgIHRyYW5zaXRpb25FbmRFdmVudCA9ICd3ZWJraXRUcmFuc2l0aW9uRW5kJztcbiAgfVxuICBpZiAod2luZG93Lm9uYW5pbWF0aW9uZW5kID09PSB1bmRlZmluZWQgJiZcbiAgICB3aW5kb3cub253ZWJraXRhbmltYXRpb25lbmQgIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBhbmltYXRpb25Qcm9wID0gJ1dlYmtpdEFuaW1hdGlvbic7XG4gICAgYW5pbWF0aW9uRW5kRXZlbnQgPSAnd2Via2l0QW5pbWF0aW9uRW5kJztcbiAgfVxufVxuXG4vLyBiaW5kaW5nIHRvIHdpbmRvdyBpcyBuZWNlc3NhcnkgdG8gbWFrZSBob3QgcmVsb2FkIHdvcmsgaW4gSUUgaW4gc3RyaWN0IG1vZGVcbnZhciByYWYgPSBpbkJyb3dzZXJcbiAgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KVxuICAgIDogc2V0VGltZW91dFxuICA6IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIGZ1bmN0aW9uIChmbikgeyByZXR1cm4gZm4oKTsgfTtcblxuZnVuY3Rpb24gbmV4dEZyYW1lIChmbikge1xuICByYWYoZnVuY3Rpb24gKCkge1xuICAgIHJhZihmbik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHtcbiAgdmFyIHRyYW5zaXRpb25DbGFzc2VzID0gZWwuX3RyYW5zaXRpb25DbGFzc2VzIHx8IChlbC5fdHJhbnNpdGlvbkNsYXNzZXMgPSBbXSk7XG4gIGlmICh0cmFuc2l0aW9uQ2xhc3Nlcy5pbmRleE9mKGNscykgPCAwKSB7XG4gICAgdHJhbnNpdGlvbkNsYXNzZXMucHVzaChjbHMpO1xuICAgIGFkZENsYXNzKGVsLCBjbHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVRyYW5zaXRpb25DbGFzcyAoZWwsIGNscykge1xuICBpZiAoZWwuX3RyYW5zaXRpb25DbGFzc2VzKSB7XG4gICAgcmVtb3ZlKGVsLl90cmFuc2l0aW9uQ2xhc3NlcywgY2xzKTtcbiAgfVxuICByZW1vdmVDbGFzcyhlbCwgY2xzKTtcbn1cblxuZnVuY3Rpb24gd2hlblRyYW5zaXRpb25FbmRzIChcbiAgZWwsXG4gIGV4cGVjdGVkVHlwZSxcbiAgY2Jcbikge1xuICB2YXIgcmVmID0gZ2V0VHJhbnNpdGlvbkluZm8oZWwsIGV4cGVjdGVkVHlwZSk7XG4gIHZhciB0eXBlID0gcmVmLnR5cGU7XG4gIHZhciB0aW1lb3V0ID0gcmVmLnRpbWVvdXQ7XG4gIHZhciBwcm9wQ291bnQgPSByZWYucHJvcENvdW50O1xuICBpZiAoIXR5cGUpIHsgcmV0dXJuIGNiKCkgfVxuICB2YXIgZXZlbnQgPSB0eXBlID09PSBUUkFOU0lUSU9OID8gdHJhbnNpdGlvbkVuZEV2ZW50IDogYW5pbWF0aW9uRW5kRXZlbnQ7XG4gIHZhciBlbmRlZCA9IDA7XG4gIHZhciBlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgb25FbmQpO1xuICAgIGNiKCk7XG4gIH07XG4gIHZhciBvbkVuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBlbCkge1xuICAgICAgaWYgKCsrZW5kZWQgPj0gcHJvcENvdW50KSB7XG4gICAgICAgIGVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7XG4gICAgICBlbmQoKTtcbiAgICB9XG4gIH0sIHRpbWVvdXQgKyAxKTtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgb25FbmQpO1xufVxuXG52YXIgdHJhbnNmb3JtUkUgPSAvXFxiKHRyYW5zZm9ybXxhbGwpKCx8JCkvO1xuXG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uSW5mbyAoZWwsIGV4cGVjdGVkVHlwZSkge1xuICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xuICB2YXIgdHJhbnNpdGlvbkRlbGF5cyA9IHN0eWxlc1t0cmFuc2l0aW9uUHJvcCArICdEZWxheSddLnNwbGl0KCcsICcpO1xuICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9ucyA9IHN0eWxlc1t0cmFuc2l0aW9uUHJvcCArICdEdXJhdGlvbiddLnNwbGl0KCcsICcpO1xuICB2YXIgdHJhbnNpdGlvblRpbWVvdXQgPSBnZXRUaW1lb3V0KHRyYW5zaXRpb25EZWxheXMsIHRyYW5zaXRpb25EdXJhdGlvbnMpO1xuICB2YXIgYW5pbWF0aW9uRGVsYXlzID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRGVsYXknXS5zcGxpdCgnLCAnKTtcbiAgdmFyIGFuaW1hdGlvbkR1cmF0aW9ucyA9IHN0eWxlc1thbmltYXRpb25Qcm9wICsgJ0R1cmF0aW9uJ10uc3BsaXQoJywgJyk7XG4gIHZhciBhbmltYXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dChhbmltYXRpb25EZWxheXMsIGFuaW1hdGlvbkR1cmF0aW9ucyk7XG5cbiAgdmFyIHR5cGU7XG4gIHZhciB0aW1lb3V0ID0gMDtcbiAgdmFyIHByb3BDb3VudCA9IDA7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoZXhwZWN0ZWRUeXBlID09PSBUUkFOU0lUSU9OKSB7XG4gICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkge1xuICAgICAgdHlwZSA9IFRSQU5TSVRJT047XG4gICAgICB0aW1lb3V0ID0gdHJhbnNpdGlvblRpbWVvdXQ7XG4gICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBBTklNQVRJT04pIHtcbiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHtcbiAgICAgIHR5cGUgPSBBTklNQVRJT047XG4gICAgICB0aW1lb3V0ID0gYW5pbWF0aW9uVGltZW91dDtcbiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7XG4gICAgdHlwZSA9IHRpbWVvdXQgPiAwXG4gICAgICA/IHRyYW5zaXRpb25UaW1lb3V0ID4gYW5pbWF0aW9uVGltZW91dFxuICAgICAgICA/IFRSQU5TSVRJT05cbiAgICAgICAgOiBBTklNQVRJT05cbiAgICAgIDogbnVsbDtcbiAgICBwcm9wQ291bnQgPSB0eXBlXG4gICAgICA/IHR5cGUgPT09IFRSQU5TSVRJT05cbiAgICAgICAgPyB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aFxuICAgICAgICA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGhcbiAgICAgIDogMDtcbiAgfVxuICB2YXIgaGFzVHJhbnNmb3JtID1cbiAgICB0eXBlID09PSBUUkFOU0lUSU9OICYmXG4gICAgdHJhbnNmb3JtUkUudGVzdChzdHlsZXNbdHJhbnNpdGlvblByb3AgKyAnUHJvcGVydHknXSk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogdHlwZSxcbiAgICB0aW1lb3V0OiB0aW1lb3V0LFxuICAgIHByb3BDb3VudDogcHJvcENvdW50LFxuICAgIGhhc1RyYW5zZm9ybTogaGFzVHJhbnNmb3JtXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGltZW91dCAoZGVsYXlzLCBkdXJhdGlvbnMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgd2hpbGUgKGRlbGF5cy5sZW5ndGggPCBkdXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgZGVsYXlzID0gZGVsYXlzLmNvbmNhdChkZWxheXMpO1xuICB9XG5cbiAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KG51bGwsIGR1cmF0aW9ucy5tYXAoZnVuY3Rpb24gKGQsIGkpIHtcbiAgICByZXR1cm4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKVxuICB9KSlcbn1cblxuZnVuY3Rpb24gdG9NcyAocykge1xuICByZXR1cm4gTnVtYmVyKHMuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGVudGVyICh2bm9kZSwgdG9nZ2xlRGlzcGxheSkge1xuICB2YXIgZWwgPSB2bm9kZS5lbG07XG5cbiAgLy8gY2FsbCBsZWF2ZSBjYWxsYmFjayBub3dcbiAgaWYgKGlzRGVmKGVsLl9sZWF2ZUNiKSkge1xuICAgIGVsLl9sZWF2ZUNiLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgZWwuX2xlYXZlQ2IoKTtcbiAgfVxuXG4gIHZhciBkYXRhID0gcmVzb2x2ZVRyYW5zaXRpb24odm5vZGUuZGF0YS50cmFuc2l0aW9uKTtcbiAgaWYgKGlzVW5kZWYoZGF0YSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoaXNEZWYoZWwuX2VudGVyQ2IpIHx8IGVsLm5vZGVUeXBlICE9PSAxKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgY3NzID0gZGF0YS5jc3M7XG4gIHZhciB0eXBlID0gZGF0YS50eXBlO1xuICB2YXIgZW50ZXJDbGFzcyA9IGRhdGEuZW50ZXJDbGFzcztcbiAgdmFyIGVudGVyVG9DbGFzcyA9IGRhdGEuZW50ZXJUb0NsYXNzO1xuICB2YXIgZW50ZXJBY3RpdmVDbGFzcyA9IGRhdGEuZW50ZXJBY3RpdmVDbGFzcztcbiAgdmFyIGFwcGVhckNsYXNzID0gZGF0YS5hcHBlYXJDbGFzcztcbiAgdmFyIGFwcGVhclRvQ2xhc3MgPSBkYXRhLmFwcGVhclRvQ2xhc3M7XG4gIHZhciBhcHBlYXJBY3RpdmVDbGFzcyA9IGRhdGEuYXBwZWFyQWN0aXZlQ2xhc3M7XG4gIHZhciBiZWZvcmVFbnRlciA9IGRhdGEuYmVmb3JlRW50ZXI7XG4gIHZhciBlbnRlciA9IGRhdGEuZW50ZXI7XG4gIHZhciBhZnRlckVudGVyID0gZGF0YS5hZnRlckVudGVyO1xuICB2YXIgZW50ZXJDYW5jZWxsZWQgPSBkYXRhLmVudGVyQ2FuY2VsbGVkO1xuICB2YXIgYmVmb3JlQXBwZWFyID0gZGF0YS5iZWZvcmVBcHBlYXI7XG4gIHZhciBhcHBlYXIgPSBkYXRhLmFwcGVhcjtcbiAgdmFyIGFmdGVyQXBwZWFyID0gZGF0YS5hZnRlckFwcGVhcjtcbiAgdmFyIGFwcGVhckNhbmNlbGxlZCA9IGRhdGEuYXBwZWFyQ2FuY2VsbGVkO1xuICB2YXIgZHVyYXRpb24gPSBkYXRhLmR1cmF0aW9uO1xuXG4gIC8vIGFjdGl2ZUluc3RhbmNlIHdpbGwgYWx3YXlzIGJlIHRoZSA8dHJhbnNpdGlvbj4gY29tcG9uZW50IG1hbmFnaW5nIHRoaXNcbiAgLy8gdHJhbnNpdGlvbi4gT25lIGVkZ2UgY2FzZSB0byBjaGVjayBpcyB3aGVuIHRoZSA8dHJhbnNpdGlvbj4gaXMgcGxhY2VkXG4gIC8vIGFzIHRoZSByb290IG5vZGUgb2YgYSBjaGlsZCBjb21wb25lbnQuIEluIHRoYXQgY2FzZSB3ZSBuZWVkIHRvIGNoZWNrXG4gIC8vIDx0cmFuc2l0aW9uPidzIHBhcmVudCBmb3IgYXBwZWFyIGNoZWNrLlxuICB2YXIgY29udGV4dCA9IGFjdGl2ZUluc3RhbmNlO1xuICB2YXIgdHJhbnNpdGlvbk5vZGUgPSBhY3RpdmVJbnN0YW5jZS4kdm5vZGU7XG4gIHdoaWxlICh0cmFuc2l0aW9uTm9kZSAmJiB0cmFuc2l0aW9uTm9kZS5wYXJlbnQpIHtcbiAgICB0cmFuc2l0aW9uTm9kZSA9IHRyYW5zaXRpb25Ob2RlLnBhcmVudDtcbiAgICBjb250ZXh0ID0gdHJhbnNpdGlvbk5vZGUuY29udGV4dDtcbiAgfVxuXG4gIHZhciBpc0FwcGVhciA9ICFjb250ZXh0Ll9pc01vdW50ZWQgfHwgIXZub2RlLmlzUm9vdEluc2VydDtcblxuICBpZiAoaXNBcHBlYXIgJiYgIWFwcGVhciAmJiBhcHBlYXIgIT09ICcnKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgc3RhcnRDbGFzcyA9IGlzQXBwZWFyICYmIGFwcGVhckNsYXNzXG4gICAgPyBhcHBlYXJDbGFzc1xuICAgIDogZW50ZXJDbGFzcztcbiAgdmFyIGFjdGl2ZUNsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyQWN0aXZlQ2xhc3NcbiAgICA/IGFwcGVhckFjdGl2ZUNsYXNzXG4gICAgOiBlbnRlckFjdGl2ZUNsYXNzO1xuICB2YXIgdG9DbGFzcyA9IGlzQXBwZWFyICYmIGFwcGVhclRvQ2xhc3NcbiAgICA/IGFwcGVhclRvQ2xhc3NcbiAgICA6IGVudGVyVG9DbGFzcztcblxuICB2YXIgYmVmb3JlRW50ZXJIb29rID0gaXNBcHBlYXJcbiAgICA/IChiZWZvcmVBcHBlYXIgfHwgYmVmb3JlRW50ZXIpXG4gICAgOiBiZWZvcmVFbnRlcjtcbiAgdmFyIGVudGVySG9vayA9IGlzQXBwZWFyXG4gICAgPyAodHlwZW9mIGFwcGVhciA9PT0gJ2Z1bmN0aW9uJyA/IGFwcGVhciA6IGVudGVyKVxuICAgIDogZW50ZXI7XG4gIHZhciBhZnRlckVudGVySG9vayA9IGlzQXBwZWFyXG4gICAgPyAoYWZ0ZXJBcHBlYXIgfHwgYWZ0ZXJFbnRlcilcbiAgICA6IGFmdGVyRW50ZXI7XG4gIHZhciBlbnRlckNhbmNlbGxlZEhvb2sgPSBpc0FwcGVhclxuICAgID8gKGFwcGVhckNhbmNlbGxlZCB8fCBlbnRlckNhbmNlbGxlZClcbiAgICA6IGVudGVyQ2FuY2VsbGVkO1xuXG4gIHZhciBleHBsaWNpdEVudGVyRHVyYXRpb24gPSB0b051bWJlcihcbiAgICBpc09iamVjdChkdXJhdGlvbilcbiAgICAgID8gZHVyYXRpb24uZW50ZXJcbiAgICAgIDogZHVyYXRpb25cbiAgKTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBleHBsaWNpdEVudGVyRHVyYXRpb24gIT0gbnVsbCkge1xuICAgIGNoZWNrRHVyYXRpb24oZXhwbGljaXRFbnRlckR1cmF0aW9uLCAnZW50ZXInLCB2bm9kZSk7XG4gIH1cblxuICB2YXIgZXhwZWN0c0NTUyA9IGNzcyAhPT0gZmFsc2UgJiYgIWlzSUU5O1xuICB2YXIgdXNlcldhbnRzQ29udHJvbCA9IGdldEhvb2tBcmd1bWVudHNMZW5ndGgoZW50ZXJIb29rKTtcblxuICB2YXIgY2IgPSBlbC5fZW50ZXJDYiA9IG9uY2UoZnVuY3Rpb24gKCkge1xuICAgIGlmIChleHBlY3RzQ1NTKSB7XG4gICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIHRvQ2xhc3MpO1xuICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBhY3RpdmVDbGFzcyk7XG4gICAgfVxuICAgIGlmIChjYi5jYW5jZWxsZWQpIHtcbiAgICAgIGlmIChleHBlY3RzQ1NTKSB7XG4gICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgc3RhcnRDbGFzcyk7XG4gICAgICB9XG4gICAgICBlbnRlckNhbmNlbGxlZEhvb2sgJiYgZW50ZXJDYW5jZWxsZWRIb29rKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJFbnRlckhvb2sgJiYgYWZ0ZXJFbnRlckhvb2soZWwpO1xuICAgIH1cbiAgICBlbC5fZW50ZXJDYiA9IG51bGw7XG4gIH0pO1xuXG4gIGlmICghdm5vZGUuZGF0YS5zaG93KSB7XG4gICAgLy8gcmVtb3ZlIHBlbmRpbmcgbGVhdmUgZWxlbWVudCBvbiBlbnRlciBieSBpbmplY3RpbmcgYW4gaW5zZXJ0IGhvb2tcbiAgICBtZXJnZVZOb2RlSG9vayh2bm9kZSwgJ2luc2VydCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlO1xuICAgICAgdmFyIHBlbmRpbmdOb2RlID0gcGFyZW50ICYmIHBhcmVudC5fcGVuZGluZyAmJiBwYXJlbnQuX3BlbmRpbmdbdm5vZGUua2V5XTtcbiAgICAgIGlmIChwZW5kaW5nTm9kZSAmJlxuICAgICAgICBwZW5kaW5nTm9kZS50YWcgPT09IHZub2RlLnRhZyAmJlxuICAgICAgICBwZW5kaW5nTm9kZS5lbG0uX2xlYXZlQ2JcbiAgICAgICkge1xuICAgICAgICBwZW5kaW5nTm9kZS5lbG0uX2xlYXZlQ2IoKTtcbiAgICAgIH1cbiAgICAgIGVudGVySG9vayAmJiBlbnRlckhvb2soZWwsIGNiKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHN0YXJ0IGVudGVyIHRyYW5zaXRpb25cbiAgYmVmb3JlRW50ZXJIb29rICYmIGJlZm9yZUVudGVySG9vayhlbCk7XG4gIGlmIChleHBlY3RzQ1NTKSB7XG4gICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTtcbiAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGFjdGl2ZUNsYXNzKTtcbiAgICBuZXh0RnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTtcbiAgICAgIGlmICghY2IuY2FuY2VsbGVkKSB7XG4gICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgdG9DbGFzcyk7XG4gICAgICAgIGlmICghdXNlcldhbnRzQ29udHJvbCkge1xuICAgICAgICAgIGlmIChpc1ZhbGlkRHVyYXRpb24oZXhwbGljaXRFbnRlckR1cmF0aW9uKSkge1xuICAgICAgICAgICAgc2V0VGltZW91dChjYiwgZXhwbGljaXRFbnRlckR1cmF0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2hlblRyYW5zaXRpb25FbmRzKGVsLCB0eXBlLCBjYik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAodm5vZGUuZGF0YS5zaG93KSB7XG4gICAgdG9nZ2xlRGlzcGxheSAmJiB0b2dnbGVEaXNwbGF5KCk7XG4gICAgZW50ZXJIb29rICYmIGVudGVySG9vayhlbCwgY2IpO1xuICB9XG5cbiAgaWYgKCFleHBlY3RzQ1NTICYmICF1c2VyV2FudHNDb250cm9sKSB7XG4gICAgY2IoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsZWF2ZSAodm5vZGUsIHJtKSB7XG4gIHZhciBlbCA9IHZub2RlLmVsbTtcblxuICAvLyBjYWxsIGVudGVyIGNhbGxiYWNrIG5vd1xuICBpZiAoaXNEZWYoZWwuX2VudGVyQ2IpKSB7XG4gICAgZWwuX2VudGVyQ2IuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICBlbC5fZW50ZXJDYigpO1xuICB9XG5cbiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pO1xuICBpZiAoaXNVbmRlZihkYXRhKSB8fCBlbC5ub2RlVHlwZSAhPT0gMSkge1xuICAgIHJldHVybiBybSgpXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzRGVmKGVsLl9sZWF2ZUNiKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGNzcyA9IGRhdGEuY3NzO1xuICB2YXIgdHlwZSA9IGRhdGEudHlwZTtcbiAgdmFyIGxlYXZlQ2xhc3MgPSBkYXRhLmxlYXZlQ2xhc3M7XG4gIHZhciBsZWF2ZVRvQ2xhc3MgPSBkYXRhLmxlYXZlVG9DbGFzcztcbiAgdmFyIGxlYXZlQWN0aXZlQ2xhc3MgPSBkYXRhLmxlYXZlQWN0aXZlQ2xhc3M7XG4gIHZhciBiZWZvcmVMZWF2ZSA9IGRhdGEuYmVmb3JlTGVhdmU7XG4gIHZhciBsZWF2ZSA9IGRhdGEubGVhdmU7XG4gIHZhciBhZnRlckxlYXZlID0gZGF0YS5hZnRlckxlYXZlO1xuICB2YXIgbGVhdmVDYW5jZWxsZWQgPSBkYXRhLmxlYXZlQ2FuY2VsbGVkO1xuICB2YXIgZGVsYXlMZWF2ZSA9IGRhdGEuZGVsYXlMZWF2ZTtcbiAgdmFyIGR1cmF0aW9uID0gZGF0YS5kdXJhdGlvbjtcblxuICB2YXIgZXhwZWN0c0NTUyA9IGNzcyAhPT0gZmFsc2UgJiYgIWlzSUU5O1xuICB2YXIgdXNlcldhbnRzQ29udHJvbCA9IGdldEhvb2tBcmd1bWVudHNMZW5ndGgobGVhdmUpO1xuXG4gIHZhciBleHBsaWNpdExlYXZlRHVyYXRpb24gPSB0b051bWJlcihcbiAgICBpc09iamVjdChkdXJhdGlvbilcbiAgICAgID8gZHVyYXRpb24ubGVhdmVcbiAgICAgIDogZHVyYXRpb25cbiAgKTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBpc0RlZihleHBsaWNpdExlYXZlRHVyYXRpb24pKSB7XG4gICAgY2hlY2tEdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24sICdsZWF2ZScsIHZub2RlKTtcbiAgfVxuXG4gIHZhciBjYiA9IGVsLl9sZWF2ZUNiID0gb25jZShmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGVsLnBhcmVudE5vZGUgJiYgZWwucGFyZW50Tm9kZS5fcGVuZGluZykge1xuICAgICAgZWwucGFyZW50Tm9kZS5fcGVuZGluZ1t2bm9kZS5rZXldID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGV4cGVjdHNDU1MpIHtcbiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVUb0NsYXNzKTtcbiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7XG4gICAgfVxuICAgIGlmIChjYi5jYW5jZWxsZWQpIHtcbiAgICAgIGlmIChleHBlY3RzQ1NTKSB7XG4gICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVDbGFzcyk7XG4gICAgICB9XG4gICAgICBsZWF2ZUNhbmNlbGxlZCAmJiBsZWF2ZUNhbmNlbGxlZChlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJtKCk7XG4gICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoZWwpO1xuICAgIH1cbiAgICBlbC5fbGVhdmVDYiA9IG51bGw7XG4gIH0pO1xuXG4gIGlmIChkZWxheUxlYXZlKSB7XG4gICAgZGVsYXlMZWF2ZShwZXJmb3JtTGVhdmUpO1xuICB9IGVsc2Uge1xuICAgIHBlcmZvcm1MZWF2ZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVyZm9ybUxlYXZlICgpIHtcbiAgICAvLyB0aGUgZGVsYXllZCBsZWF2ZSBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkXG4gICAgaWYgKGNiLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIC8vIHJlY29yZCBsZWF2aW5nIGVsZW1lbnRcbiAgICBpZiAoIXZub2RlLmRhdGEuc2hvdykge1xuICAgICAgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgfHwgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgPSB7fSkpWyh2bm9kZS5rZXkpXSA9IHZub2RlO1xuICAgIH1cbiAgICBiZWZvcmVMZWF2ZSAmJiBiZWZvcmVMZWF2ZShlbCk7XG4gICAgaWYgKGV4cGVjdHNDU1MpIHtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVDbGFzcyk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTtcbiAgICAgICAgaWYgKCFjYi5jYW5jZWxsZWQpIHtcbiAgICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7XG4gICAgICAgICAgaWYgKCF1c2VyV2FudHNDb250cm9sKSB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZER1cmF0aW9uKGV4cGxpY2l0TGVhdmVEdXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dChjYiwgZXhwbGljaXRMZWF2ZUR1cmF0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgdHlwZSwgY2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGxlYXZlICYmIGxlYXZlKGVsLCBjYik7XG4gICAgaWYgKCFleHBlY3RzQ1NTICYmICF1c2VyV2FudHNDb250cm9sKSB7XG4gICAgICBjYigpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBvbmx5IHVzZWQgaW4gZGV2IG1vZGVcbmZ1bmN0aW9uIGNoZWNrRHVyYXRpb24gKHZhbCwgbmFtZSwgdm5vZGUpIHtcbiAgaWYgKHR5cGVvZiB2YWwgIT09ICdudW1iZXInKSB7XG4gICAgd2FybihcbiAgICAgIFwiPHRyYW5zaXRpb24+IGV4cGxpY2l0IFwiICsgbmFtZSArIFwiIGR1cmF0aW9uIGlzIG5vdCBhIHZhbGlkIG51bWJlciAtIFwiICtcbiAgICAgIFwiZ290IFwiICsgKEpTT04uc3RyaW5naWZ5KHZhbCkpICsgXCIuXCIsXG4gICAgICB2bm9kZS5jb250ZXh0XG4gICAgKTtcbiAgfSBlbHNlIGlmIChpc05hTih2YWwpKSB7XG4gICAgd2FybihcbiAgICAgIFwiPHRyYW5zaXRpb24+IGV4cGxpY2l0IFwiICsgbmFtZSArIFwiIGR1cmF0aW9uIGlzIE5hTiAtIFwiICtcbiAgICAgICd0aGUgZHVyYXRpb24gZXhwcmVzc2lvbiBtaWdodCBiZSBpbmNvcnJlY3QuJyxcbiAgICAgIHZub2RlLmNvbnRleHRcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWREdXJhdGlvbiAodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHRyYW5zaXRpb24gaG9vaydzIGFyZ3VtZW50IGxlbmd0aC4gVGhlIGhvb2sgbWF5IGJlOlxuICogLSBhIG1lcmdlZCBob29rIChpbnZva2VyKSB3aXRoIHRoZSBvcmlnaW5hbCBpbiAuZm5zXG4gKiAtIGEgd3JhcHBlZCBjb21wb25lbnQgbWV0aG9kIChjaGVjayAuX2xlbmd0aClcbiAqIC0gYSBwbGFpbiBmdW5jdGlvbiAoLmxlbmd0aClcbiAqL1xuZnVuY3Rpb24gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aCAoZm4pIHtcbiAgaWYgKGlzVW5kZWYoZm4pKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgdmFyIGludm9rZXJGbnMgPSBmbi5mbnM7XG4gIGlmIChpc0RlZihpbnZva2VyRm5zKSkge1xuICAgIC8vIGludm9rZXJcbiAgICByZXR1cm4gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aChcbiAgICAgIEFycmF5LmlzQXJyYXkoaW52b2tlckZucylcbiAgICAgICAgPyBpbnZva2VyRm5zWzBdXG4gICAgICAgIDogaW52b2tlckZuc1xuICAgIClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKGZuLl9sZW5ndGggfHwgZm4ubGVuZ3RoKSA+IDFcbiAgfVxufVxuXG5mdW5jdGlvbiBfZW50ZXIgKF8sIHZub2RlKSB7XG4gIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHtcbiAgICBlbnRlcih2bm9kZSk7XG4gIH1cbn1cblxudmFyIHRyYW5zaXRpb24gPSBpbkJyb3dzZXIgPyB7XG4gIGNyZWF0ZTogX2VudGVyLFxuICBhY3RpdmF0ZTogX2VudGVyLFxuICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSQkMSAodm5vZGUsIHJtKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodm5vZGUuZGF0YS5zaG93ICE9PSB0cnVlKSB7XG4gICAgICBsZWF2ZSh2bm9kZSwgcm0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBybSgpO1xuICAgIH1cbiAgfVxufSA6IHt9XG5cbnZhciBwbGF0Zm9ybU1vZHVsZXMgPSBbXG4gIGF0dHJzLFxuICBrbGFzcyxcbiAgZXZlbnRzLFxuICBkb21Qcm9wcyxcbiAgc3R5bGUsXG4gIHRyYW5zaXRpb25cbl1cblxuLyogICovXG5cbi8vIHRoZSBkaXJlY3RpdmUgbW9kdWxlIHNob3VsZCBiZSBhcHBsaWVkIGxhc3QsIGFmdGVyIGFsbFxuLy8gYnVpbHQtaW4gbW9kdWxlcyBoYXZlIGJlZW4gYXBwbGllZC5cbnZhciBtb2R1bGVzID0gcGxhdGZvcm1Nb2R1bGVzLmNvbmNhdChiYXNlTW9kdWxlcyk7XG5cbnZhciBwYXRjaCA9IGNyZWF0ZVBhdGNoRnVuY3Rpb24oeyBub2RlT3BzOiBub2RlT3BzLCBtb2R1bGVzOiBtb2R1bGVzIH0pO1xuXG4vKipcbiAqIE5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBsaWtlIGF0dGFjaGluZ1xuICogcHJvcGVydGllcyB0byBFbGVtZW50cy5cbiAqL1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmIChpc0lFOSkge1xuICAvLyBodHRwOi8vd3d3Lm1hdHRzNDExLmNvbS9wb3N0L2ludGVybmV0LWV4cGxvcmVyLTktb25pbnB1dC9cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0aW9uY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGVsICYmIGVsLnZtb2RlbCkge1xuICAgICAgdHJpZ2dlcihlbCwgJ2lucHV0Jyk7XG4gICAgfVxuICB9KTtcbn1cblxudmFyIGRpcmVjdGl2ZSA9IHtcbiAgaW5zZXJ0ZWQ6IGZ1bmN0aW9uIGluc2VydGVkIChlbCwgYmluZGluZywgdm5vZGUsIG9sZFZub2RlKSB7XG4gICAgaWYgKHZub2RlLnRhZyA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgIC8vICM2OTAzXG4gICAgICBpZiAob2xkVm5vZGUuZWxtICYmICFvbGRWbm9kZS5lbG0uX3ZPcHRpb25zKSB7XG4gICAgICAgIG1lcmdlVk5vZGVIb29rKHZub2RlLCAncG9zdHBhdGNoJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGRpcmVjdGl2ZS5jb21wb25lbnRVcGRhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpO1xuICAgICAgfVxuICAgICAgZWwuX3ZPcHRpb25zID0gW10ubWFwLmNhbGwoZWwub3B0aW9ucywgZ2V0VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSAndGV4dGFyZWEnIHx8IGlzVGV4dElucHV0VHlwZShlbC50eXBlKSkge1xuICAgICAgZWwuX3ZNb2RpZmllcnMgPSBiaW5kaW5nLm1vZGlmaWVycztcbiAgICAgIGlmICghYmluZGluZy5tb2RpZmllcnMubGF6eSkge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbnN0YXJ0Jywgb25Db21wb3NpdGlvblN0YXJ0KTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY29tcG9zaXRpb25lbmQnLCBvbkNvbXBvc2l0aW9uRW5kKTtcbiAgICAgICAgLy8gU2FmYXJpIDwgMTAuMiAmIFVJV2ViVmlldyBkb2Vzbid0IGZpcmUgY29tcG9zaXRpb25lbmQgd2hlblxuICAgICAgICAvLyBzd2l0Y2hpbmcgZm9jdXMgYmVmb3JlIGNvbmZpcm1pbmcgY29tcG9zaXRpb24gY2hvaWNlXG4gICAgICAgIC8vIHRoaXMgYWxzbyBmaXhlcyB0aGUgaXNzdWUgd2hlcmUgc29tZSBicm93c2VycyBlLmcuIGlPUyBDaHJvbWVcbiAgICAgICAgLy8gZmlyZXMgXCJjaGFuZ2VcIiBpbnN0ZWFkIG9mIFwiaW5wdXRcIiBvbiBhdXRvY29tcGxldGUuXG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG9uQ29tcG9zaXRpb25FbmQpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKGlzSUU5KSB7XG4gICAgICAgICAgZWwudm1vZGVsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjb21wb25lbnRVcGRhdGVkOiBmdW5jdGlvbiBjb21wb25lbnRVcGRhdGVkIChlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBpZiAodm5vZGUudGFnID09PSAnc2VsZWN0Jykge1xuICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpO1xuICAgICAgLy8gaW4gY2FzZSB0aGUgb3B0aW9ucyByZW5kZXJlZCBieSB2LWZvciBoYXZlIGNoYW5nZWQsXG4gICAgICAvLyBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHZhbHVlIGlzIG91dC1vZi1zeW5jIHdpdGggdGhlIHJlbmRlcmVkIG9wdGlvbnMuXG4gICAgICAvLyBkZXRlY3Qgc3VjaCBjYXNlcyBhbmQgZmlsdGVyIG91dCB2YWx1ZXMgdGhhdCBubyBsb25nZXIgaGFzIGEgbWF0Y2hpbmdcbiAgICAgIC8vIG9wdGlvbiBpbiB0aGUgRE9NLlxuICAgICAgdmFyIHByZXZPcHRpb25zID0gZWwuX3ZPcHRpb25zO1xuICAgICAgdmFyIGN1ck9wdGlvbnMgPSBlbC5fdk9wdGlvbnMgPSBbXS5tYXAuY2FsbChlbC5vcHRpb25zLCBnZXRWYWx1ZSk7XG4gICAgICBpZiAoY3VyT3B0aW9ucy5zb21lKGZ1bmN0aW9uIChvLCBpKSB7IHJldHVybiAhbG9vc2VFcXVhbChvLCBwcmV2T3B0aW9uc1tpXSk7IH0pKSB7XG4gICAgICAgIC8vIHRyaWdnZXIgY2hhbmdlIGV2ZW50IGlmXG4gICAgICAgIC8vIG5vIG1hdGNoaW5nIG9wdGlvbiBmb3VuZCBmb3IgYXQgbGVhc3Qgb25lIHZhbHVlXG4gICAgICAgIHZhciBuZWVkUmVzZXQgPSBlbC5tdWx0aXBsZVxuICAgICAgICAgID8gYmluZGluZy52YWx1ZS5zb21lKGZ1bmN0aW9uICh2KSB7IHJldHVybiBoYXNOb01hdGNoaW5nT3B0aW9uKHYsIGN1ck9wdGlvbnMpOyB9KVxuICAgICAgICAgIDogYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSAmJiBoYXNOb01hdGNoaW5nT3B0aW9uKGJpbmRpbmcudmFsdWUsIGN1ck9wdGlvbnMpO1xuICAgICAgICBpZiAobmVlZFJlc2V0KSB7XG4gICAgICAgICAgdHJpZ2dlcihlbCwgJ2NoYW5nZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBzZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7XG4gIGFjdHVhbGx5U2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZtKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChpc0lFIHx8IGlzRWRnZSkge1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgYWN0dWFsbHlTZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm0pO1xuICAgIH0sIDApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFjdHVhbGx5U2V0U2VsZWN0ZWQgKGVsLCBiaW5kaW5nLCB2bSkge1xuICB2YXIgdmFsdWUgPSBiaW5kaW5nLnZhbHVlO1xuICB2YXIgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlO1xuICBpZiAoaXNNdWx0aXBsZSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICBcIjxzZWxlY3QgbXVsdGlwbGUgdi1tb2RlbD1cXFwiXCIgKyAoYmluZGluZy5leHByZXNzaW9uKSArIFwiXFxcIj4gXCIgK1xuICAgICAgXCJleHBlY3RzIGFuIEFycmF5IHZhbHVlIGZvciBpdHMgYmluZGluZywgYnV0IGdvdCBcIiArIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKSksXG4gICAgICB2bVxuICAgICk7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHNlbGVjdGVkLCBvcHRpb247XG4gIGZvciAodmFyIGkgPSAwLCBsID0gZWwub3B0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBvcHRpb24gPSBlbC5vcHRpb25zW2ldO1xuICAgIGlmIChpc011bHRpcGxlKSB7XG4gICAgICBzZWxlY3RlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgZ2V0VmFsdWUob3B0aW9uKSkgPiAtMTtcbiAgICAgIGlmIChvcHRpb24uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobG9vc2VFcXVhbChnZXRWYWx1ZShvcHRpb24pLCB2YWx1ZSkpIHtcbiAgICAgICAgaWYgKGVsLnNlbGVjdGVkSW5kZXggIT09IGkpIHtcbiAgICAgICAgICBlbC5zZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCFpc011bHRpcGxlKSB7XG4gICAgZWwuc2VsZWN0ZWRJbmRleCA9IC0xO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc05vTWF0Y2hpbmdPcHRpb24gKHZhbHVlLCBvcHRpb25zKSB7XG4gIHJldHVybiBvcHRpb25zLmV2ZXJ5KGZ1bmN0aW9uIChvKSB7IHJldHVybiAhbG9vc2VFcXVhbChvLCB2YWx1ZSk7IH0pXG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlIChvcHRpb24pIHtcbiAgcmV0dXJuICdfdmFsdWUnIGluIG9wdGlvblxuICAgID8gb3B0aW9uLl92YWx1ZVxuICAgIDogb3B0aW9uLnZhbHVlXG59XG5cbmZ1bmN0aW9uIG9uQ29tcG9zaXRpb25TdGFydCAoZSkge1xuICBlLnRhcmdldC5jb21wb3NpbmcgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBvbkNvbXBvc2l0aW9uRW5kIChlKSB7XG4gIC8vIHByZXZlbnQgdHJpZ2dlcmluZyBhbiBpbnB1dCBldmVudCBmb3Igbm8gcmVhc29uXG4gIGlmICghZS50YXJnZXQuY29tcG9zaW5nKSB7IHJldHVybiB9XG4gIGUudGFyZ2V0LmNvbXBvc2luZyA9IGZhbHNlO1xuICB0cmlnZ2VyKGUudGFyZ2V0LCAnaW5wdXQnKTtcbn1cblxuZnVuY3Rpb24gdHJpZ2dlciAoZWwsIHR5cGUpIHtcbiAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpO1xuICBlLmluaXRFdmVudCh0eXBlLCB0cnVlLCB0cnVlKTtcbiAgZWwuZGlzcGF0Y2hFdmVudChlKTtcbn1cblxuLyogICovXG5cbi8vIHJlY3Vyc2l2ZWx5IHNlYXJjaCBmb3IgcG9zc2libGUgdHJhbnNpdGlvbiBkZWZpbmVkIGluc2lkZSB0aGUgY29tcG9uZW50IHJvb3RcbmZ1bmN0aW9uIGxvY2F0ZU5vZGUgKHZub2RlKSB7XG4gIHJldHVybiB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSAmJiAoIXZub2RlLmRhdGEgfHwgIXZub2RlLmRhdGEudHJhbnNpdGlvbilcbiAgICA/IGxvY2F0ZU5vZGUodm5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKVxuICAgIDogdm5vZGVcbn1cblxudmFyIHNob3cgPSB7XG4gIGJpbmQ6IGZ1bmN0aW9uIGJpbmQgKGVsLCByZWYsIHZub2RlKSB7XG4gICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlO1xuXG4gICAgdm5vZGUgPSBsb2NhdGVOb2RlKHZub2RlKTtcbiAgICB2YXIgdHJhbnNpdGlvbiQkMSA9IHZub2RlLmRhdGEgJiYgdm5vZGUuZGF0YS50cmFuc2l0aW9uO1xuICAgIHZhciBvcmlnaW5hbERpc3BsYXkgPSBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgPVxuICAgICAgZWwuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJycgOiBlbC5zdHlsZS5kaXNwbGF5O1xuICAgIGlmICh2YWx1ZSAmJiB0cmFuc2l0aW9uJCQxKSB7XG4gICAgICB2bm9kZS5kYXRhLnNob3cgPSB0cnVlO1xuICAgICAgZW50ZXIodm5vZGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IG9yaWdpbmFsRGlzcGxheTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBvcmlnaW5hbERpc3BsYXkgOiAnbm9uZSc7XG4gICAgfVxuICB9LFxuXG4gIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlIChlbCwgcmVmLCB2bm9kZSkge1xuICAgIHZhciB2YWx1ZSA9IHJlZi52YWx1ZTtcbiAgICB2YXIgb2xkVmFsdWUgPSByZWYub2xkVmFsdWU7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIXZhbHVlID09PSAhb2xkVmFsdWUpIHsgcmV0dXJuIH1cbiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpO1xuICAgIHZhciB0cmFuc2l0aW9uJCQxID0gdm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLnRyYW5zaXRpb247XG4gICAgaWYgKHRyYW5zaXRpb24kJDEpIHtcbiAgICAgIHZub2RlLmRhdGEuc2hvdyA9IHRydWU7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZW50ZXIodm5vZGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gZWwuX192T3JpZ2luYWxEaXNwbGF5O1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlYXZlKHZub2RlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZSA/IGVsLl9fdk9yaWdpbmFsRGlzcGxheSA6ICdub25lJztcbiAgICB9XG4gIH0sXG5cbiAgdW5iaW5kOiBmdW5jdGlvbiB1bmJpbmQgKFxuICAgIGVsLFxuICAgIGJpbmRpbmcsXG4gICAgdm5vZGUsXG4gICAgb2xkVm5vZGUsXG4gICAgaXNEZXN0cm95XG4gICkge1xuICAgIGlmICghaXNEZXN0cm95KSB7XG4gICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gZWwuX192T3JpZ2luYWxEaXNwbGF5O1xuICAgIH1cbiAgfVxufVxuXG52YXIgcGxhdGZvcm1EaXJlY3RpdmVzID0ge1xuICBtb2RlbDogZGlyZWN0aXZlLFxuICBzaG93OiBzaG93XG59XG5cbi8qICAqL1xuXG4vLyBQcm92aWRlcyB0cmFuc2l0aW9uIHN1cHBvcnQgZm9yIGEgc2luZ2xlIGVsZW1lbnQvY29tcG9uZW50LlxuLy8gc3VwcG9ydHMgdHJhbnNpdGlvbiBtb2RlIChvdXQtaW4gLyBpbi1vdXQpXG5cbnZhciB0cmFuc2l0aW9uUHJvcHMgPSB7XG4gIG5hbWU6IFN0cmluZyxcbiAgYXBwZWFyOiBCb29sZWFuLFxuICBjc3M6IEJvb2xlYW4sXG4gIG1vZGU6IFN0cmluZyxcbiAgdHlwZTogU3RyaW5nLFxuICBlbnRlckNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQ2xhc3M6IFN0cmluZyxcbiAgZW50ZXJUb0NsYXNzOiBTdHJpbmcsXG4gIGxlYXZlVG9DbGFzczogU3RyaW5nLFxuICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyVG9DbGFzczogU3RyaW5nLFxuICBkdXJhdGlvbjogW051bWJlciwgU3RyaW5nLCBPYmplY3RdXG59O1xuXG4vLyBpbiBjYXNlIHRoZSBjaGlsZCBpcyBhbHNvIGFuIGFic3RyYWN0IGNvbXBvbmVudCwgZS5nLiA8a2VlcC1hbGl2ZT5cbi8vIHdlIHdhbnQgdG8gcmVjdXJzaXZlbHkgcmV0cmlldmUgdGhlIHJlYWwgY29tcG9uZW50IHRvIGJlIHJlbmRlcmVkXG5mdW5jdGlvbiBnZXRSZWFsQ2hpbGQgKHZub2RlKSB7XG4gIHZhciBjb21wT3B0aW9ucyA9IHZub2RlICYmIHZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gIGlmIChjb21wT3B0aW9ucyAmJiBjb21wT3B0aW9ucy5DdG9yLm9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICByZXR1cm4gZ2V0UmVhbENoaWxkKGdldEZpcnN0Q29tcG9uZW50Q2hpbGQoY29tcE9wdGlvbnMuY2hpbGRyZW4pKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB2bm9kZVxuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RUcmFuc2l0aW9uRGF0YSAoY29tcCkge1xuICB2YXIgZGF0YSA9IHt9O1xuICB2YXIgb3B0aW9ucyA9IGNvbXAuJG9wdGlvbnM7XG4gIC8vIHByb3BzXG4gIGZvciAodmFyIGtleSBpbiBvcHRpb25zLnByb3BzRGF0YSkge1xuICAgIGRhdGFba2V5XSA9IGNvbXBba2V5XTtcbiAgfVxuICAvLyBldmVudHMuXG4gIC8vIGV4dHJhY3QgbGlzdGVuZXJzIGFuZCBwYXNzIHRoZW0gZGlyZWN0bHkgdG8gdGhlIHRyYW5zaXRpb24gbWV0aG9kc1xuICB2YXIgbGlzdGVuZXJzID0gb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO1xuICBmb3IgKHZhciBrZXkkMSBpbiBsaXN0ZW5lcnMpIHtcbiAgICBkYXRhW2NhbWVsaXplKGtleSQxKV0gPSBsaXN0ZW5lcnNba2V5JDFdO1xuICB9XG4gIHJldHVybiBkYXRhXG59XG5cbmZ1bmN0aW9uIHBsYWNlaG9sZGVyIChoLCByYXdDaGlsZCkge1xuICBpZiAoL1xcZC1rZWVwLWFsaXZlJC8udGVzdChyYXdDaGlsZC50YWcpKSB7XG4gICAgcmV0dXJuIGgoJ2tlZXAtYWxpdmUnLCB7XG4gICAgICBwcm9wczogcmF3Q2hpbGQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGFcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1BhcmVudFRyYW5zaXRpb24gKHZub2RlKSB7XG4gIHdoaWxlICgodm5vZGUgPSB2bm9kZS5wYXJlbnQpKSB7XG4gICAgaWYgKHZub2RlLmRhdGEudHJhbnNpdGlvbikge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTYW1lQ2hpbGQgKGNoaWxkLCBvbGRDaGlsZCkge1xuICByZXR1cm4gb2xkQ2hpbGQua2V5ID09PSBjaGlsZC5rZXkgJiYgb2xkQ2hpbGQudGFnID09PSBjaGlsZC50YWdcbn1cblxudmFyIFRyYW5zaXRpb24gPSB7XG4gIG5hbWU6ICd0cmFuc2l0aW9uJyxcbiAgcHJvcHM6IHRyYW5zaXRpb25Qcm9wcyxcbiAgYWJzdHJhY3Q6IHRydWUsXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuJHNsb3RzLmRlZmF1bHQ7XG4gICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZmlsdGVyIG91dCB0ZXh0IG5vZGVzIChwb3NzaWJsZSB3aGl0ZXNwYWNlcylcbiAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50YWcgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpOyB9KTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gd2FybiBtdWx0aXBsZSBlbGVtZW50c1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICc8dHJhbnNpdGlvbj4gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIHNpbmdsZSBlbGVtZW50LiBVc2UgJyArXG4gICAgICAgICc8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLicsXG4gICAgICAgIHRoaXMuJHBhcmVudFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgbW9kZSA9IHRoaXMubW9kZTtcblxuICAgIC8vIHdhcm4gaW52YWxpZCBtb2RlXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAgIG1vZGUgJiYgbW9kZSAhPT0gJ2luLW91dCcgJiYgbW9kZSAhPT0gJ291dC1pbidcbiAgICApIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICdpbnZhbGlkIDx0cmFuc2l0aW9uPiBtb2RlOiAnICsgbW9kZSxcbiAgICAgICAgdGhpcy4kcGFyZW50XG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciByYXdDaGlsZCA9IGNoaWxkcmVuWzBdO1xuXG4gICAgLy8gaWYgdGhpcyBpcyBhIGNvbXBvbmVudCByb290IG5vZGUgYW5kIHRoZSBjb21wb25lbnQnc1xuICAgIC8vIHBhcmVudCBjb250YWluZXIgbm9kZSBhbHNvIGhhcyB0cmFuc2l0aW9uLCBza2lwLlxuICAgIGlmIChoYXNQYXJlbnRUcmFuc2l0aW9uKHRoaXMuJHZub2RlKSkge1xuICAgICAgcmV0dXJuIHJhd0NoaWxkXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgdHJhbnNpdGlvbiBkYXRhIHRvIGNoaWxkXG4gICAgLy8gdXNlIGdldFJlYWxDaGlsZCgpIHRvIGlnbm9yZSBhYnN0cmFjdCBjb21wb25lbnRzIGUuZy4ga2VlcC1hbGl2ZVxuICAgIHZhciBjaGlsZCA9IGdldFJlYWxDaGlsZChyYXdDaGlsZCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFjaGlsZCkge1xuICAgICAgcmV0dXJuIHJhd0NoaWxkXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xlYXZpbmcpIHtcbiAgICAgIHJldHVybiBwbGFjZWhvbGRlcihoLCByYXdDaGlsZClcbiAgICB9XG5cbiAgICAvLyBlbnN1cmUgYSBrZXkgdGhhdCBpcyB1bmlxdWUgdG8gdGhlIHZub2RlIHR5cGUgYW5kIHRvIHRoaXMgdHJhbnNpdGlvblxuICAgIC8vIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhpcyBrZXkgd2lsbCBiZSB1c2VkIHRvIHJlbW92ZSBwZW5kaW5nIGxlYXZpbmcgbm9kZXNcbiAgICAvLyBkdXJpbmcgZW50ZXJpbmcuXG4gICAgdmFyIGlkID0gXCJfX3RyYW5zaXRpb24tXCIgKyAodGhpcy5fdWlkKSArIFwiLVwiO1xuICAgIGNoaWxkLmtleSA9IGNoaWxkLmtleSA9PSBudWxsXG4gICAgICA/IGNoaWxkLmlzQ29tbWVudFxuICAgICAgICA/IGlkICsgJ2NvbW1lbnQnXG4gICAgICAgIDogaWQgKyBjaGlsZC50YWdcbiAgICAgIDogaXNQcmltaXRpdmUoY2hpbGQua2V5KVxuICAgICAgICA/IChTdHJpbmcoY2hpbGQua2V5KS5pbmRleE9mKGlkKSA9PT0gMCA/IGNoaWxkLmtleSA6IGlkICsgY2hpbGQua2V5KVxuICAgICAgICA6IGNoaWxkLmtleTtcblxuICAgIHZhciBkYXRhID0gKGNoaWxkLmRhdGEgfHwgKGNoaWxkLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7XG4gICAgdmFyIG9sZFJhd0NoaWxkID0gdGhpcy5fdm5vZGU7XG4gICAgdmFyIG9sZENoaWxkID0gZ2V0UmVhbENoaWxkKG9sZFJhd0NoaWxkKTtcblxuICAgIC8vIG1hcmsgdi1zaG93XG4gICAgLy8gc28gdGhhdCB0aGUgdHJhbnNpdGlvbiBtb2R1bGUgY2FuIGhhbmQgb3ZlciB0aGUgY29udHJvbCB0byB0aGUgZGlyZWN0aXZlXG4gICAgaWYgKGNoaWxkLmRhdGEuZGlyZWN0aXZlcyAmJiBjaGlsZC5kYXRhLmRpcmVjdGl2ZXMuc29tZShmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5uYW1lID09PSAnc2hvdyc7IH0pKSB7XG4gICAgICBjaGlsZC5kYXRhLnNob3cgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG9sZENoaWxkICYmXG4gICAgICBvbGRDaGlsZC5kYXRhICYmXG4gICAgICAhaXNTYW1lQ2hpbGQoY2hpbGQsIG9sZENoaWxkKSAmJlxuICAgICAgIWlzQXN5bmNQbGFjZWhvbGRlcihvbGRDaGlsZCkgJiZcbiAgICAgIC8vICM2Njg3IGNvbXBvbmVudCByb290IGlzIGEgY29tbWVudCBub2RlXG4gICAgICAhKG9sZENoaWxkLmNvbXBvbmVudEluc3RhbmNlICYmIG9sZENoaWxkLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZS5pc0NvbW1lbnQpXG4gICAgKSB7XG4gICAgICAvLyByZXBsYWNlIG9sZCBjaGlsZCB0cmFuc2l0aW9uIGRhdGEgd2l0aCBmcmVzaCBvbmVcbiAgICAgIC8vIGltcG9ydGFudCBmb3IgZHluYW1pYyB0cmFuc2l0aW9ucyFcbiAgICAgIHZhciBvbGREYXRhID0gb2xkQ2hpbGQuZGF0YS50cmFuc2l0aW9uID0gZXh0ZW5kKHt9LCBkYXRhKTtcbiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGVcbiAgICAgIGlmIChtb2RlID09PSAnb3V0LWluJykge1xuICAgICAgICAvLyByZXR1cm4gcGxhY2Vob2xkZXIgbm9kZSBhbmQgcXVldWUgdXBkYXRlIHdoZW4gbGVhdmUgZmluaXNoZXNcbiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7XG4gICAgICAgIG1lcmdlVk5vZGVIb29rKG9sZERhdGEsICdhZnRlckxlYXZlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMkMS5fbGVhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcihoLCByYXdDaGlsZClcbiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2luLW91dCcpIHtcbiAgICAgICAgaWYgKGlzQXN5bmNQbGFjZWhvbGRlcihjaGlsZCkpIHtcbiAgICAgICAgICByZXR1cm4gb2xkUmF3Q2hpbGRcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVsYXllZExlYXZlO1xuICAgICAgICB2YXIgcGVyZm9ybUxlYXZlID0gZnVuY3Rpb24gKCkgeyBkZWxheWVkTGVhdmUoKTsgfTtcbiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICBtZXJnZVZOb2RlSG9vayhkYXRhLCAnZW50ZXJDYW5jZWxsZWQnLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICBtZXJnZVZOb2RlSG9vayhvbGREYXRhLCAnZGVsYXlMZWF2ZScsIGZ1bmN0aW9uIChsZWF2ZSkgeyBkZWxheWVkTGVhdmUgPSBsZWF2ZTsgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhd0NoaWxkXG4gIH1cbn1cblxuLyogICovXG5cbi8vIFByb3ZpZGVzIHRyYW5zaXRpb24gc3VwcG9ydCBmb3IgbGlzdCBpdGVtcy5cbi8vIHN1cHBvcnRzIG1vdmUgdHJhbnNpdGlvbnMgdXNpbmcgdGhlIEZMSVAgdGVjaG5pcXVlLlxuXG4vLyBCZWNhdXNlIHRoZSB2ZG9tJ3MgY2hpbGRyZW4gdXBkYXRlIGFsZ29yaXRobSBpcyBcInVuc3RhYmxlXCIgLSBpLmUuXG4vLyBpdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgcmVsYXRpdmUgcG9zaXRpb25pbmcgb2YgcmVtb3ZlZCBlbGVtZW50cyxcbi8vIHdlIGZvcmNlIHRyYW5zaXRpb24tZ3JvdXAgdG8gdXBkYXRlIGl0cyBjaGlsZHJlbiBpbnRvIHR3byBwYXNzZXM6XG4vLyBpbiB0aGUgZmlyc3QgcGFzcywgd2UgcmVtb3ZlIGFsbCBub2RlcyB0aGF0IG5lZWQgdG8gYmUgcmVtb3ZlZCxcbi8vIHRyaWdnZXJpbmcgdGhlaXIgbGVhdmluZyB0cmFuc2l0aW9uOyBpbiB0aGUgc2Vjb25kIHBhc3MsIHdlIGluc2VydC9tb3ZlXG4vLyBpbnRvIHRoZSBmaW5hbCBkZXNpcmVkIHN0YXRlLiBUaGlzIHdheSBpbiB0aGUgc2Vjb25kIHBhc3MgcmVtb3ZlZFxuLy8gbm9kZXMgd2lsbCByZW1haW4gd2hlcmUgdGhleSBzaG91bGQgYmUuXG5cbnZhciBwcm9wcyA9IGV4dGVuZCh7XG4gIHRhZzogU3RyaW5nLFxuICBtb3ZlQ2xhc3M6IFN0cmluZ1xufSwgdHJhbnNpdGlvblByb3BzKTtcblxuZGVsZXRlIHByb3BzLm1vZGU7XG5cbnZhciBUcmFuc2l0aW9uR3JvdXAgPSB7XG4gIHByb3BzOiBwcm9wcyxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkge1xuICAgIHZhciB0YWcgPSB0aGlzLnRhZyB8fCB0aGlzLiR2bm9kZS5kYXRhLnRhZyB8fCAnc3Bhbic7XG4gICAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdmFyIHByZXZDaGlsZHJlbiA9IHRoaXMucHJldkNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcbiAgICB2YXIgcmF3Q2hpbGRyZW4gPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdO1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB2YXIgdHJhbnNpdGlvbkRhdGEgPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhd0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IHJhd0NoaWxkcmVuW2ldO1xuICAgICAgaWYgKGMudGFnKSB7XG4gICAgICAgIGlmIChjLmtleSAhPSBudWxsICYmIFN0cmluZyhjLmtleSkuaW5kZXhPZignX192bGlzdCcpICE9PSAwKSB7XG4gICAgICAgICAgY2hpbGRyZW4ucHVzaChjKTtcbiAgICAgICAgICBtYXBbYy5rZXldID0gY1xuICAgICAgICAgIDsoYy5kYXRhIHx8IChjLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgdmFyIG9wdHMgPSBjLmNvbXBvbmVudE9wdGlvbnM7XG4gICAgICAgICAgdmFyIG5hbWUgPSBvcHRzID8gKG9wdHMuQ3Rvci5vcHRpb25zLm5hbWUgfHwgb3B0cy50YWcgfHwgJycpIDogYy50YWc7XG4gICAgICAgICAgd2FybigoXCI8dHJhbnNpdGlvbi1ncm91cD4gY2hpbGRyZW4gbXVzdCBiZSBrZXllZDogPFwiICsgbmFtZSArIFwiPlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJldkNoaWxkcmVuKSB7XG4gICAgICB2YXIga2VwdCA9IFtdO1xuICAgICAgdmFyIHJlbW92ZWQgPSBbXTtcbiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHByZXZDaGlsZHJlbi5sZW5ndGg7IGkkMSsrKSB7XG4gICAgICAgIHZhciBjJDEgPSBwcmV2Q2hpbGRyZW5baSQxXTtcbiAgICAgICAgYyQxLmRhdGEudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25EYXRhO1xuICAgICAgICBjJDEuZGF0YS5wb3MgPSBjJDEuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAobWFwW2MkMS5rZXldKSB7XG4gICAgICAgICAga2VwdC5wdXNoKGMkMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVtb3ZlZC5wdXNoKGMkMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMua2VwdCA9IGgodGFnLCBudWxsLCBrZXB0KTtcbiAgICAgIHRoaXMucmVtb3ZlZCA9IHJlbW92ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGgodGFnLCBudWxsLCBjaGlsZHJlbilcbiAgfSxcblxuICBiZWZvcmVVcGRhdGU6IGZ1bmN0aW9uIGJlZm9yZVVwZGF0ZSAoKSB7XG4gICAgLy8gZm9yY2UgcmVtb3ZpbmcgcGFzc1xuICAgIHRoaXMuX19wYXRjaF9fKFxuICAgICAgdGhpcy5fdm5vZGUsXG4gICAgICB0aGlzLmtlcHQsXG4gICAgICBmYWxzZSwgLy8gaHlkcmF0aW5nXG4gICAgICB0cnVlIC8vIHJlbW92ZU9ubHkgKCFpbXBvcnRhbnQsIGF2b2lkcyB1bm5lY2Vzc2FyeSBtb3ZlcylcbiAgICApO1xuICAgIHRoaXMuX3Zub2RlID0gdGhpcy5rZXB0O1xuICB9LFxuXG4gIHVwZGF0ZWQ6IGZ1bmN0aW9uIHVwZGF0ZWQgKCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucHJldkNoaWxkcmVuO1xuICAgIHZhciBtb3ZlQ2xhc3MgPSB0aGlzLm1vdmVDbGFzcyB8fCAoKHRoaXMubmFtZSB8fCAndicpICsgJy1tb3ZlJyk7XG4gICAgaWYgKCFjaGlsZHJlbi5sZW5ndGggfHwgIXRoaXMuaGFzTW92ZShjaGlsZHJlblswXS5lbG0sIG1vdmVDbGFzcykpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHdlIGRpdmlkZSB0aGUgd29yayBpbnRvIHRocmVlIGxvb3BzIHRvIGF2b2lkIG1peGluZyBET00gcmVhZHMgYW5kIHdyaXRlc1xuICAgIC8vIGluIGVhY2ggaXRlcmF0aW9uIC0gd2hpY2ggaGVscHMgcHJldmVudCBsYXlvdXQgdGhyYXNoaW5nLlxuICAgIGNoaWxkcmVuLmZvckVhY2goY2FsbFBlbmRpbmdDYnMpO1xuICAgIGNoaWxkcmVuLmZvckVhY2gocmVjb3JkUG9zaXRpb24pO1xuICAgIGNoaWxkcmVuLmZvckVhY2goYXBwbHlUcmFuc2xhdGlvbik7XG5cbiAgICAvLyBmb3JjZSByZWZsb3cgdG8gcHV0IGV2ZXJ5dGhpbmcgaW4gcG9zaXRpb25cbiAgICAvLyBhc3NpZ24gdG8gdGhpcyB0byBhdm9pZCBiZWluZyByZW1vdmVkIGluIHRyZWUtc2hha2luZ1xuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHRoaXMuX3JlZmxvdyA9IGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0O1xuXG4gICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgaWYgKGMuZGF0YS5tb3ZlZCkge1xuICAgICAgICB2YXIgZWwgPSBjLmVsbTtcbiAgICAgICAgdmFyIHMgPSBlbC5zdHlsZTtcbiAgICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBtb3ZlQ2xhc3MpO1xuICAgICAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnJztcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcih0cmFuc2l0aW9uRW5kRXZlbnQsIGVsLl9tb3ZlQ2IgPSBmdW5jdGlvbiBjYiAoZSkge1xuICAgICAgICAgIGlmICghZSB8fCAvdHJhbnNmb3JtJC8udGVzdChlLnByb3BlcnR5TmFtZSkpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJhbnNpdGlvbkVuZEV2ZW50LCBjYik7XG4gICAgICAgICAgICBlbC5fbW92ZUNiID0gbnVsbDtcbiAgICAgICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYXNNb3ZlOiBmdW5jdGlvbiBoYXNNb3ZlIChlbCwgbW92ZUNsYXNzKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICghaGFzVHJhbnNpdGlvbikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHRoaXMuX2hhc01vdmUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc01vdmVcbiAgICAgIH1cbiAgICAgIC8vIERldGVjdCB3aGV0aGVyIGFuIGVsZW1lbnQgd2l0aCB0aGUgbW92ZSBjbGFzcyBhcHBsaWVkIGhhc1xuICAgICAgLy8gQ1NTIHRyYW5zaXRpb25zLiBTaW5jZSB0aGUgZWxlbWVudCBtYXkgYmUgaW5zaWRlIGFuIGVudGVyaW5nXG4gICAgICAvLyB0cmFuc2l0aW9uIGF0IHRoaXMgdmVyeSBtb21lbnQsIHdlIG1ha2UgYSBjbG9uZSBvZiBpdCBhbmQgcmVtb3ZlXG4gICAgICAvLyBhbGwgb3RoZXIgdHJhbnNpdGlvbiBjbGFzc2VzIGFwcGxpZWQgdG8gZW5zdXJlIG9ubHkgdGhlIG1vdmUgY2xhc3NcbiAgICAgIC8vIGlzIGFwcGxpZWQuXG4gICAgICB2YXIgY2xvbmUgPSBlbC5jbG9uZU5vZGUoKTtcbiAgICAgIGlmIChlbC5fdHJhbnNpdGlvbkNsYXNzZXMpIHtcbiAgICAgICAgZWwuX3RyYW5zaXRpb25DbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGNscykgeyByZW1vdmVDbGFzcyhjbG9uZSwgY2xzKTsgfSk7XG4gICAgICB9XG4gICAgICBhZGRDbGFzcyhjbG9uZSwgbW92ZUNsYXNzKTtcbiAgICAgIGNsb25lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB0aGlzLiRlbC5hcHBlbmRDaGlsZChjbG9uZSk7XG4gICAgICB2YXIgaW5mbyA9IGdldFRyYW5zaXRpb25JbmZvKGNsb25lKTtcbiAgICAgIHRoaXMuJGVsLnJlbW92ZUNoaWxkKGNsb25lKTtcbiAgICAgIHJldHVybiAodGhpcy5faGFzTW92ZSA9IGluZm8uaGFzVHJhbnNmb3JtKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsUGVuZGluZ0NicyAoYykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGMuZWxtLl9tb3ZlQ2IpIHtcbiAgICBjLmVsbS5fbW92ZUNiKCk7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChjLmVsbS5fZW50ZXJDYikge1xuICAgIGMuZWxtLl9lbnRlckNiKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb3JkUG9zaXRpb24gKGMpIHtcbiAgYy5kYXRhLm5ld1BvcyA9IGMuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xufVxuXG5mdW5jdGlvbiBhcHBseVRyYW5zbGF0aW9uIChjKSB7XG4gIHZhciBvbGRQb3MgPSBjLmRhdGEucG9zO1xuICB2YXIgbmV3UG9zID0gYy5kYXRhLm5ld1BvcztcbiAgdmFyIGR4ID0gb2xkUG9zLmxlZnQgLSBuZXdQb3MubGVmdDtcbiAgdmFyIGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7XG4gIGlmIChkeCB8fCBkeSkge1xuICAgIGMuZGF0YS5tb3ZlZCA9IHRydWU7XG4gICAgdmFyIHMgPSBjLmVsbS5zdHlsZTtcbiAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gXCJ0cmFuc2xhdGUoXCIgKyBkeCArIFwicHgsXCIgKyBkeSArIFwicHgpXCI7XG4gICAgcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnMHMnO1xuICB9XG59XG5cbnZhciBwbGF0Zm9ybUNvbXBvbmVudHMgPSB7XG4gIFRyYW5zaXRpb246IFRyYW5zaXRpb24sXG4gIFRyYW5zaXRpb25Hcm91cDogVHJhbnNpdGlvbkdyb3VwXG59XG5cbi8qICAqL1xuXG4vLyBpbnN0YWxsIHBsYXRmb3JtIHNwZWNpZmljIHV0aWxzXG5WdWUuY29uZmlnLm11c3RVc2VQcm9wID0gbXVzdFVzZVByb3A7XG5WdWUuY29uZmlnLmlzUmVzZXJ2ZWRUYWcgPSBpc1Jlc2VydmVkVGFnO1xuVnVlLmNvbmZpZy5pc1Jlc2VydmVkQXR0ciA9IGlzUmVzZXJ2ZWRBdHRyO1xuVnVlLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2UgPSBnZXRUYWdOYW1lc3BhY2U7XG5WdWUuY29uZmlnLmlzVW5rbm93bkVsZW1lbnQgPSBpc1Vua25vd25FbGVtZW50O1xuXG4vLyBpbnN0YWxsIHBsYXRmb3JtIHJ1bnRpbWUgZGlyZWN0aXZlcyAmIGNvbXBvbmVudHNcbmV4dGVuZChWdWUub3B0aW9ucy5kaXJlY3RpdmVzLCBwbGF0Zm9ybURpcmVjdGl2ZXMpO1xuZXh0ZW5kKFZ1ZS5vcHRpb25zLmNvbXBvbmVudHMsIHBsYXRmb3JtQ29tcG9uZW50cyk7XG5cbi8vIGluc3RhbGwgcGxhdGZvcm0gcGF0Y2ggZnVuY3Rpb25cblZ1ZS5wcm90b3R5cGUuX19wYXRjaF9fID0gaW5Ccm93c2VyID8gcGF0Y2ggOiBub29wO1xuXG4vLyBwdWJsaWMgbW91bnQgbWV0aG9kXG5WdWUucHJvdG90eXBlLiRtb3VudCA9IGZ1bmN0aW9uIChcbiAgZWwsXG4gIGh5ZHJhdGluZ1xuKSB7XG4gIGVsID0gZWwgJiYgaW5Ccm93c2VyID8gcXVlcnkoZWwpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gbW91bnRDb21wb25lbnQodGhpcywgZWwsIGh5ZHJhdGluZylcbn07XG5cbi8vIGRldnRvb2xzIGdsb2JhbCBob29rXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuaWYgKGluQnJvd3Nlcikge1xuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY29uZmlnLmRldnRvb2xzKSB7XG4gICAgICBpZiAoZGV2dG9vbHMpIHtcbiAgICAgICAgZGV2dG9vbHMuZW1pdCgnaW5pdCcsIFZ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiZcbiAgICAgICAgaXNDaHJvbWVcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlW2NvbnNvbGUuaW5mbyA/ICdpbmZvJyA6ICdsb2cnXShcbiAgICAgICAgICAnRG93bmxvYWQgdGhlIFZ1ZSBEZXZ0b29scyBleHRlbnNpb24gZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6XFxuJyArXG4gICAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtZGV2dG9vbHMnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Rlc3QnICYmXG4gICAgICBjb25maWcucHJvZHVjdGlvblRpcCAhPT0gZmFsc2UgJiZcbiAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJ1xuICAgICkge1xuICAgICAgY29uc29sZVtjb25zb2xlLmluZm8gPyAnaW5mbycgOiAnbG9nJ10oXG4gICAgICAgIFwiWW91IGFyZSBydW5uaW5nIFZ1ZSBpbiBkZXZlbG9wbWVudCBtb2RlLlxcblwiICtcbiAgICAgICAgXCJNYWtlIHN1cmUgdG8gdHVybiBvbiBwcm9kdWN0aW9uIG1vZGUgd2hlbiBkZXBsb3lpbmcgZm9yIHByb2R1Y3Rpb24uXFxuXCIgK1xuICAgICAgICBcIlNlZSBtb3JlIHRpcHMgYXQgaHR0cHM6Ly92dWVqcy5vcmcvZ3VpZGUvZGVwbG95bWVudC5odG1sXCJcbiAgICAgICk7XG4gICAgfVxuICB9LCAwKTtcbn1cblxuLyogICovXG5cbnZhciBkZWZhdWx0VGFnUkUgPSAvXFx7XFx7KCg/Oi58XFxuKSs/KVxcfVxcfS9nO1xudmFyIHJlZ2V4RXNjYXBlUkUgPSAvWy0uKis/XiR7fSgpfFtcXF1cXC9cXFxcXS9nO1xuXG52YXIgYnVpbGRSZWdleCA9IGNhY2hlZChmdW5jdGlvbiAoZGVsaW1pdGVycykge1xuICB2YXIgb3BlbiA9IGRlbGltaXRlcnNbMF0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFxcXCQmJyk7XG4gIHZhciBjbG9zZSA9IGRlbGltaXRlcnNbMV0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFxcXCQmJyk7XG4gIHJldHVybiBuZXcgUmVnRXhwKG9wZW4gKyAnKCg/Oi58XFxcXG4pKz8pJyArIGNsb3NlLCAnZycpXG59KTtcblxuXG5cbmZ1bmN0aW9uIHBhcnNlVGV4dCAoXG4gIHRleHQsXG4gIGRlbGltaXRlcnNcbikge1xuICB2YXIgdGFnUkUgPSBkZWxpbWl0ZXJzID8gYnVpbGRSZWdleChkZWxpbWl0ZXJzKSA6IGRlZmF1bHRUYWdSRTtcbiAgaWYgKCF0YWdSRS50ZXN0KHRleHQpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHRva2VucyA9IFtdO1xuICB2YXIgcmF3VG9rZW5zID0gW107XG4gIHZhciBsYXN0SW5kZXggPSB0YWdSRS5sYXN0SW5kZXggPSAwO1xuICB2YXIgbWF0Y2gsIGluZGV4LCB0b2tlblZhbHVlO1xuICB3aGlsZSAoKG1hdGNoID0gdGFnUkUuZXhlYyh0ZXh0KSkpIHtcbiAgICBpbmRleCA9IG1hdGNoLmluZGV4O1xuICAgIC8vIHB1c2ggdGV4dCB0b2tlblxuICAgIGlmIChpbmRleCA+IGxhc3RJbmRleCkge1xuICAgICAgcmF3VG9rZW5zLnB1c2godG9rZW5WYWx1ZSA9IHRleHQuc2xpY2UobGFzdEluZGV4LCBpbmRleCkpO1xuICAgICAgdG9rZW5zLnB1c2goSlNPTi5zdHJpbmdpZnkodG9rZW5WYWx1ZSkpO1xuICAgIH1cbiAgICAvLyB0YWcgdG9rZW5cbiAgICB2YXIgZXhwID0gcGFyc2VGaWx0ZXJzKG1hdGNoWzFdLnRyaW0oKSk7XG4gICAgdG9rZW5zLnB1c2goKFwiX3MoXCIgKyBleHAgKyBcIilcIikpO1xuICAgIHJhd1Rva2Vucy5wdXNoKHsgJ0BiaW5kaW5nJzogZXhwIH0pO1xuICAgIGxhc3RJbmRleCA9IGluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoO1xuICB9XG4gIGlmIChsYXN0SW5kZXggPCB0ZXh0Lmxlbmd0aCkge1xuICAgIHJhd1Rva2Vucy5wdXNoKHRva2VuVmFsdWUgPSB0ZXh0LnNsaWNlKGxhc3RJbmRleCkpO1xuICAgIHRva2Vucy5wdXNoKEpTT04uc3RyaW5naWZ5KHRva2VuVmFsdWUpKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGV4cHJlc3Npb246IHRva2Vucy5qb2luKCcrJyksXG4gICAgdG9rZW5zOiByYXdUb2tlbnNcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gdHJhbnNmb3JtTm9kZSAoZWwsIG9wdGlvbnMpIHtcbiAgdmFyIHdhcm4gPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47XG4gIHZhciBzdGF0aWNDbGFzcyA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICdjbGFzcycpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBzdGF0aWNDbGFzcykge1xuICAgIHZhciByZXMgPSBwYXJzZVRleHQoc3RhdGljQ2xhc3MsIG9wdGlvbnMuZGVsaW1pdGVycyk7XG4gICAgaWYgKHJlcykge1xuICAgICAgd2FybihcbiAgICAgICAgXCJjbGFzcz1cXFwiXCIgKyBzdGF0aWNDbGFzcyArIFwiXFxcIjogXCIgK1xuICAgICAgICAnSW50ZXJwb2xhdGlvbiBpbnNpZGUgYXR0cmlidXRlcyBoYXMgYmVlbiByZW1vdmVkLiAnICtcbiAgICAgICAgJ1VzZSB2LWJpbmQgb3IgdGhlIGNvbG9uIHNob3J0aGFuZCBpbnN0ZWFkLiBGb3IgZXhhbXBsZSwgJyArXG4gICAgICAgICdpbnN0ZWFkIG9mIDxkaXYgY2xhc3M9XCJ7eyB2YWwgfX1cIj4sIHVzZSA8ZGl2IDpjbGFzcz1cInZhbFwiPi4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBpZiAoc3RhdGljQ2xhc3MpIHtcbiAgICBlbC5zdGF0aWNDbGFzcyA9IEpTT04uc3RyaW5naWZ5KHN0YXRpY0NsYXNzKTtcbiAgfVxuICB2YXIgY2xhc3NCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICdjbGFzcycsIGZhbHNlIC8qIGdldFN0YXRpYyAqLyk7XG4gIGlmIChjbGFzc0JpbmRpbmcpIHtcbiAgICBlbC5jbGFzc0JpbmRpbmcgPSBjbGFzc0JpbmRpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuRGF0YSAoZWwpIHtcbiAgdmFyIGRhdGEgPSAnJztcbiAgaWYgKGVsLnN0YXRpY0NsYXNzKSB7XG4gICAgZGF0YSArPSBcInN0YXRpY0NsYXNzOlwiICsgKGVsLnN0YXRpY0NsYXNzKSArIFwiLFwiO1xuICB9XG4gIGlmIChlbC5jbGFzc0JpbmRpbmcpIHtcbiAgICBkYXRhICs9IFwiY2xhc3M6XCIgKyAoZWwuY2xhc3NCaW5kaW5nKSArIFwiLFwiO1xuICB9XG4gIHJldHVybiBkYXRhXG59XG5cbnZhciBrbGFzcyQxID0ge1xuICBzdGF0aWNLZXlzOiBbJ3N0YXRpY0NsYXNzJ10sXG4gIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUsXG4gIGdlbkRhdGE6IGdlbkRhdGFcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIHRyYW5zZm9ybU5vZGUkMSAoZWwsIG9wdGlvbnMpIHtcbiAgdmFyIHdhcm4gPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47XG4gIHZhciBzdGF0aWNTdHlsZSA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICdzdHlsZScpO1xuICBpZiAoc3RhdGljU3R5bGUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHJlcyA9IHBhcnNlVGV4dChzdGF0aWNTdHlsZSwgb3B0aW9ucy5kZWxpbWl0ZXJzKTtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBcInN0eWxlPVxcXCJcIiArIHN0YXRpY1N0eWxlICsgXCJcXFwiOiBcIiArXG4gICAgICAgICAgJ0ludGVycG9sYXRpb24gaW5zaWRlIGF0dHJpYnV0ZXMgaGFzIGJlZW4gcmVtb3ZlZC4gJyArXG4gICAgICAgICAgJ1VzZSB2LWJpbmQgb3IgdGhlIGNvbG9uIHNob3J0aGFuZCBpbnN0ZWFkLiBGb3IgZXhhbXBsZSwgJyArXG4gICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBzdHlsZT1cInt7IHZhbCB9fVwiPiwgdXNlIDxkaXYgOnN0eWxlPVwidmFsXCI+LidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWwuc3RhdGljU3R5bGUgPSBKU09OLnN0cmluZ2lmeShwYXJzZVN0eWxlVGV4dChzdGF0aWNTdHlsZSkpO1xuICB9XG5cbiAgdmFyIHN0eWxlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAnc3R5bGUnLCBmYWxzZSAvKiBnZXRTdGF0aWMgKi8pO1xuICBpZiAoc3R5bGVCaW5kaW5nKSB7XG4gICAgZWwuc3R5bGVCaW5kaW5nID0gc3R5bGVCaW5kaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbkRhdGEkMSAoZWwpIHtcbiAgdmFyIGRhdGEgPSAnJztcbiAgaWYgKGVsLnN0YXRpY1N0eWxlKSB7XG4gICAgZGF0YSArPSBcInN0YXRpY1N0eWxlOlwiICsgKGVsLnN0YXRpY1N0eWxlKSArIFwiLFwiO1xuICB9XG4gIGlmIChlbC5zdHlsZUJpbmRpbmcpIHtcbiAgICBkYXRhICs9IFwic3R5bGU6KFwiICsgKGVsLnN0eWxlQmluZGluZykgKyBcIiksXCI7XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxudmFyIHN0eWxlJDEgPSB7XG4gIHN0YXRpY0tleXM6IFsnc3RhdGljU3R5bGUnXSxcbiAgdHJhbnNmb3JtTm9kZTogdHJhbnNmb3JtTm9kZSQxLFxuICBnZW5EYXRhOiBnZW5EYXRhJDFcbn1cblxuLyogICovXG5cbnZhciBkZWNvZGVyO1xuXG52YXIgaGUgPSB7XG4gIGRlY29kZTogZnVuY3Rpb24gZGVjb2RlIChodG1sKSB7XG4gICAgZGVjb2RlciA9IGRlY29kZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGVjb2Rlci5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiBkZWNvZGVyLnRleHRDb250ZW50XG4gIH1cbn1cblxuLyogICovXG5cbnZhciBpc1VuYXJ5VGFnID0gbWFrZU1hcChcbiAgJ2FyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLCcgK1xuICAnbGluayxtZXRhLHBhcmFtLHNvdXJjZSx0cmFjayx3YnInXG4pO1xuXG4vLyBFbGVtZW50cyB0aGF0IHlvdSBjYW4sIGludGVudGlvbmFsbHksIGxlYXZlIG9wZW5cbi8vIChhbmQgd2hpY2ggY2xvc2UgdGhlbXNlbHZlcylcbnZhciBjYW5CZUxlZnRPcGVuVGFnID0gbWFrZU1hcChcbiAgJ2NvbGdyb3VwLGRkLGR0LGxpLG9wdGlvbnMscCx0ZCx0Zm9vdCx0aCx0aGVhZCx0cixzb3VyY2UnXG4pO1xuXG4vLyBIVE1MNSB0YWdzIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZGljZXMuaHRtbCNlbGVtZW50cy0zXG4vLyBQaHJhc2luZyBDb250ZW50IGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2RvbS5odG1sI3BocmFzaW5nLWNvbnRlbnRcbnZhciBpc05vblBocmFzaW5nVGFnID0gbWFrZU1hcChcbiAgJ2FkZHJlc3MsYXJ0aWNsZSxhc2lkZSxiYXNlLGJsb2NrcXVvdGUsYm9keSxjYXB0aW9uLGNvbCxjb2xncm91cCxkZCwnICtcbiAgJ2RldGFpbHMsZGlhbG9nLGRpdixkbCxkdCxmaWVsZHNldCxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsZm9ybSwnICtcbiAgJ2gxLGgyLGgzLGg0LGg1LGg2LGhlYWQsaGVhZGVyLGhncm91cCxocixodG1sLGxlZ2VuZCxsaSxtZW51aXRlbSxtZXRhLCcgK1xuICAnb3B0Z3JvdXAsb3B0aW9uLHBhcmFtLHJwLHJ0LHNvdXJjZSxzdHlsZSxzdW1tYXJ5LHRib2R5LHRkLHRmb290LHRoLHRoZWFkLCcgK1xuICAndGl0bGUsdHIsdHJhY2snXG4pO1xuXG4vKipcbiAqIE5vdCB0eXBlLWNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGl0J3MgbW9zdGx5IHZlbmRvciBjb2RlLlxuICovXG5cbi8qIVxuICogSFRNTCBQYXJzZXIgQnkgSm9obiBSZXNpZyAoZWpvaG4ub3JnKVxuICogTW9kaWZpZWQgYnkgSnVyaXkgXCJrYW5nYXhcIiBaYXl0c2V2XG4gKiBPcmlnaW5hbCBjb2RlIGJ5IEVyaWsgQXJ2aWRzc29uLCBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlXG4gKiBodHRwOi8vZXJpay5lYWUubmV0L3NpbXBsZWh0bWxwYXJzZXIvc2ltcGxlaHRtbHBhcnNlci5qc1xuICovXG5cbi8vIFJlZ3VsYXIgRXhwcmVzc2lvbnMgZm9yIHBhcnNpbmcgdGFncyBhbmQgYXR0cmlidXRlc1xudmFyIGF0dHJpYnV0ZSA9IC9eXFxzKihbXlxcc1wiJzw+XFwvPV0rKSg/OlxccyooPSlcXHMqKD86XCIoW15cIl0qKVwiK3wnKFteJ10qKScrfChbXlxcc1wiJz08PmBdKykpKT8vO1xuLy8gY291bGQgdXNlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14bWwtbmFtZXMtMTk5OTAxMTQvI05ULVFOYW1lXG4vLyBidXQgZm9yIFZ1ZSB0ZW1wbGF0ZXMgd2UgY2FuIGVuZm9yY2UgYSBzaW1wbGUgY2hhcnNldFxudmFyIG5jbmFtZSA9ICdbYS16QS1aX11bXFxcXHdcXFxcLVxcXFwuXSonO1xudmFyIHFuYW1lQ2FwdHVyZSA9IFwiKCg/OlwiICsgbmNuYW1lICsgXCJcXFxcOik/XCIgKyBuY25hbWUgKyBcIilcIjtcbnZhciBzdGFydFRhZ09wZW4gPSBuZXcgUmVnRXhwKChcIl48XCIgKyBxbmFtZUNhcHR1cmUpKTtcbnZhciBzdGFydFRhZ0Nsb3NlID0gL15cXHMqKFxcLz8pPi87XG52YXIgZW5kVGFnID0gbmV3IFJlZ0V4cCgoXCJePFxcXFwvXCIgKyBxbmFtZUNhcHR1cmUgKyBcIltePl0qPlwiKSk7XG52YXIgZG9jdHlwZSA9IC9ePCFET0NUWVBFIFtePl0rPi9pO1xuLy8gIzcyOTg6IGVzY2FwZSAtIHRvIGF2b2lkIGJlaW5nIHBhc2VkIGFzIEhUTUwgY29tbWVudCB3aGVuIGlubGluZWQgaW4gcGFnZVxudmFyIGNvbW1lbnQgPSAvXjwhXFwtLS87XG52YXIgY29uZGl0aW9uYWxDb21tZW50ID0gL148IVxcWy87XG5cbnZhciBJU19SRUdFWF9DQVBUVVJJTkdfQlJPS0VOID0gZmFsc2U7XG4neCcucmVwbGFjZSgveCguKT8vZywgZnVuY3Rpb24gKG0sIGcpIHtcbiAgSVNfUkVHRVhfQ0FQVFVSSU5HX0JST0tFTiA9IGcgPT09ICcnO1xufSk7XG5cbi8vIFNwZWNpYWwgRWxlbWVudHMgKGNhbiBjb250YWluIGFueXRoaW5nKVxudmFyIGlzUGxhaW5UZXh0RWxlbWVudCA9IG1ha2VNYXAoJ3NjcmlwdCxzdHlsZSx0ZXh0YXJlYScsIHRydWUpO1xudmFyIHJlQ2FjaGUgPSB7fTtcblxudmFyIGRlY29kaW5nTWFwID0ge1xuICAnJmx0Oyc6ICc8JyxcbiAgJyZndDsnOiAnPicsXG4gICcmcXVvdDsnOiAnXCInLFxuICAnJmFtcDsnOiAnJicsXG4gICcmIzEwOyc6ICdcXG4nLFxuICAnJiM5Oyc6ICdcXHQnXG59O1xudmFyIGVuY29kZWRBdHRyID0gLyYoPzpsdHxndHxxdW90fGFtcCk7L2c7XG52YXIgZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgPSAvJig/Omx0fGd0fHF1b3R8YW1wfCMxMHwjOSk7L2c7XG5cbi8vICM1OTkyXG52YXIgaXNJZ25vcmVOZXdsaW5lVGFnID0gbWFrZU1hcCgncHJlLHRleHRhcmVhJywgdHJ1ZSk7XG52YXIgc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lID0gZnVuY3Rpb24gKHRhZywgaHRtbCkgeyByZXR1cm4gdGFnICYmIGlzSWdub3JlTmV3bGluZVRhZyh0YWcpICYmIGh0bWxbMF0gPT09ICdcXG4nOyB9O1xuXG5mdW5jdGlvbiBkZWNvZGVBdHRyICh2YWx1ZSwgc2hvdWxkRGVjb2RlTmV3bGluZXMpIHtcbiAgdmFyIHJlID0gc2hvdWxkRGVjb2RlTmV3bGluZXMgPyBlbmNvZGVkQXR0cldpdGhOZXdMaW5lcyA6IGVuY29kZWRBdHRyO1xuICByZXR1cm4gdmFsdWUucmVwbGFjZShyZSwgZnVuY3Rpb24gKG1hdGNoKSB7IHJldHVybiBkZWNvZGluZ01hcFttYXRjaF07IH0pXG59XG5cbmZ1bmN0aW9uIHBhcnNlSFRNTCAoaHRtbCwgb3B0aW9ucykge1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIGV4cGVjdEhUTUwgPSBvcHRpb25zLmV4cGVjdEhUTUw7XG4gIHZhciBpc1VuYXJ5VGFnJCQxID0gb3B0aW9ucy5pc1VuYXJ5VGFnIHx8IG5vO1xuICB2YXIgY2FuQmVMZWZ0T3BlblRhZyQkMSA9IG9wdGlvbnMuY2FuQmVMZWZ0T3BlblRhZyB8fCBubztcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxhc3QsIGxhc3RUYWc7XG4gIHdoaWxlIChodG1sKSB7XG4gICAgbGFzdCA9IGh0bWw7XG4gICAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBpbiBhIHBsYWludGV4dCBjb250ZW50IGVsZW1lbnQgbGlrZSBzY3JpcHQvc3R5bGVcbiAgICBpZiAoIWxhc3RUYWcgfHwgIWlzUGxhaW5UZXh0RWxlbWVudChsYXN0VGFnKSkge1xuICAgICAgdmFyIHRleHRFbmQgPSBodG1sLmluZGV4T2YoJzwnKTtcbiAgICAgIGlmICh0ZXh0RW5kID09PSAwKSB7XG4gICAgICAgIC8vIENvbW1lbnQ6XG4gICAgICAgIGlmIChjb21tZW50LnRlc3QoaHRtbCkpIHtcbiAgICAgICAgICB2YXIgY29tbWVudEVuZCA9IGh0bWwuaW5kZXhPZignLS0+Jyk7XG5cbiAgICAgICAgICBpZiAoY29tbWVudEVuZCA+PSAwKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zaG91bGRLZWVwQ29tbWVudCkge1xuICAgICAgICAgICAgICBvcHRpb25zLmNvbW1lbnQoaHRtbC5zdWJzdHJpbmcoNCwgY29tbWVudEVuZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWR2YW5jZShjb21tZW50RW5kICsgMyk7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29uZGl0aW9uYWxfY29tbWVudCNEb3dubGV2ZWwtcmV2ZWFsZWRfY29uZGl0aW9uYWxfY29tbWVudFxuICAgICAgICBpZiAoY29uZGl0aW9uYWxDb21tZW50LnRlc3QoaHRtbCkpIHtcbiAgICAgICAgICB2YXIgY29uZGl0aW9uYWxFbmQgPSBodG1sLmluZGV4T2YoJ10+Jyk7XG5cbiAgICAgICAgICBpZiAoY29uZGl0aW9uYWxFbmQgPj0gMCkge1xuICAgICAgICAgICAgYWR2YW5jZShjb25kaXRpb25hbEVuZCArIDIpO1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEb2N0eXBlOlxuICAgICAgICB2YXIgZG9jdHlwZU1hdGNoID0gaHRtbC5tYXRjaChkb2N0eXBlKTtcbiAgICAgICAgaWYgKGRvY3R5cGVNYXRjaCkge1xuICAgICAgICAgIGFkdmFuY2UoZG9jdHlwZU1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuZCB0YWc6XG4gICAgICAgIHZhciBlbmRUYWdNYXRjaCA9IGh0bWwubWF0Y2goZW5kVGFnKTtcbiAgICAgICAgaWYgKGVuZFRhZ01hdGNoKSB7XG4gICAgICAgICAgdmFyIGN1ckluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgYWR2YW5jZShlbmRUYWdNYXRjaFswXS5sZW5ndGgpO1xuICAgICAgICAgIHBhcnNlRW5kVGFnKGVuZFRhZ01hdGNoWzFdLCBjdXJJbmRleCwgaW5kZXgpO1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFydCB0YWc6XG4gICAgICAgIHZhciBzdGFydFRhZ01hdGNoID0gcGFyc2VTdGFydFRhZygpO1xuICAgICAgICBpZiAoc3RhcnRUYWdNYXRjaCkge1xuICAgICAgICAgIGhhbmRsZVN0YXJ0VGFnKHN0YXJ0VGFnTWF0Y2gpO1xuICAgICAgICAgIGlmIChzaG91bGRJZ25vcmVGaXJzdE5ld2xpbmUobGFzdFRhZywgaHRtbCkpIHtcbiAgICAgICAgICAgIGFkdmFuY2UoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHRleHQgPSAodm9pZCAwKSwgcmVzdCA9ICh2b2lkIDApLCBuZXh0ID0gKHZvaWQgMCk7XG4gICAgICBpZiAodGV4dEVuZCA+PSAwKSB7XG4gICAgICAgIHJlc3QgPSBodG1sLnNsaWNlKHRleHRFbmQpO1xuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgIWVuZFRhZy50ZXN0KHJlc3QpICYmXG4gICAgICAgICAgIXN0YXJ0VGFnT3Blbi50ZXN0KHJlc3QpICYmXG4gICAgICAgICAgIWNvbW1lbnQudGVzdChyZXN0KSAmJlxuICAgICAgICAgICFjb25kaXRpb25hbENvbW1lbnQudGVzdChyZXN0KVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyA8IGluIHBsYWluIHRleHQsIGJlIGZvcmdpdmluZyBhbmQgdHJlYXQgaXQgYXMgdGV4dFxuICAgICAgICAgIG5leHQgPSByZXN0LmluZGV4T2YoJzwnLCAxKTtcbiAgICAgICAgICBpZiAobmV4dCA8IDApIHsgYnJlYWsgfVxuICAgICAgICAgIHRleHRFbmQgKz0gbmV4dDtcbiAgICAgICAgICByZXN0ID0gaHRtbC5zbGljZSh0ZXh0RW5kKTtcbiAgICAgICAgfVxuICAgICAgICB0ZXh0ID0gaHRtbC5zdWJzdHJpbmcoMCwgdGV4dEVuZCk7XG4gICAgICAgIGFkdmFuY2UodGV4dEVuZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0ZXh0RW5kIDwgMCkge1xuICAgICAgICB0ZXh0ID0gaHRtbDtcbiAgICAgICAgaHRtbCA9ICcnO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5jaGFycyAmJiB0ZXh0KSB7XG4gICAgICAgIG9wdGlvbnMuY2hhcnModGV4dCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlbmRUYWdMZW5ndGggPSAwO1xuICAgICAgdmFyIHN0YWNrZWRUYWcgPSBsYXN0VGFnLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgcmVTdGFja2VkVGFnID0gcmVDYWNoZVtzdGFja2VkVGFnXSB8fCAocmVDYWNoZVtzdGFja2VkVGFnXSA9IG5ldyBSZWdFeHAoJyhbXFxcXHNcXFxcU10qPykoPC8nICsgc3RhY2tlZFRhZyArICdbXj5dKj4pJywgJ2knKSk7XG4gICAgICB2YXIgcmVzdCQxID0gaHRtbC5yZXBsYWNlKHJlU3RhY2tlZFRhZywgZnVuY3Rpb24gKGFsbCwgdGV4dCwgZW5kVGFnKSB7XG4gICAgICAgIGVuZFRhZ0xlbmd0aCA9IGVuZFRhZy5sZW5ndGg7XG4gICAgICAgIGlmICghaXNQbGFpblRleHRFbGVtZW50KHN0YWNrZWRUYWcpICYmIHN0YWNrZWRUYWcgIT09ICdub3NjcmlwdCcpIHtcbiAgICAgICAgICB0ZXh0ID0gdGV4dFxuICAgICAgICAgICAgLnJlcGxhY2UoLzwhXFwtLShbXFxzXFxTXSo/KS0tPi9nLCAnJDEnKSAvLyAjNzI5OFxuICAgICAgICAgICAgLnJlcGxhY2UoLzwhXFxbQ0RBVEFcXFsoW1xcc1xcU10qPyldXT4vZywgJyQxJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZElnbm9yZUZpcnN0TmV3bGluZShzdGFja2VkVGFnLCB0ZXh0KSkge1xuICAgICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmNoYXJzKSB7XG4gICAgICAgICAgb3B0aW9ucy5jaGFycyh0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJydcbiAgICAgIH0pO1xuICAgICAgaW5kZXggKz0gaHRtbC5sZW5ndGggLSByZXN0JDEubGVuZ3RoO1xuICAgICAgaHRtbCA9IHJlc3QkMTtcbiAgICAgIHBhcnNlRW5kVGFnKHN0YWNrZWRUYWcsIGluZGV4IC0gZW5kVGFnTGVuZ3RoLCBpbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKGh0bWwgPT09IGxhc3QpIHtcbiAgICAgIG9wdGlvbnMuY2hhcnMgJiYgb3B0aW9ucy5jaGFycyhodG1sKTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFzdGFjay5sZW5ndGggJiYgb3B0aW9ucy53YXJuKSB7XG4gICAgICAgIG9wdGlvbnMud2FybigoXCJNYWwtZm9ybWF0dGVkIHRhZyBhdCBlbmQgb2YgdGVtcGxhdGU6IFxcXCJcIiArIGh0bWwgKyBcIlxcXCJcIikpO1xuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyBDbGVhbiB1cCBhbnkgcmVtYWluaW5nIHRhZ3NcbiAgcGFyc2VFbmRUYWcoKTtcblxuICBmdW5jdGlvbiBhZHZhbmNlIChuKSB7XG4gICAgaW5kZXggKz0gbjtcbiAgICBodG1sID0gaHRtbC5zdWJzdHJpbmcobik7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVN0YXJ0VGFnICgpIHtcbiAgICB2YXIgc3RhcnQgPSBodG1sLm1hdGNoKHN0YXJ0VGFnT3Blbik7XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICB2YXIgbWF0Y2ggPSB7XG4gICAgICAgIHRhZ05hbWU6IHN0YXJ0WzFdLFxuICAgICAgICBhdHRyczogW10sXG4gICAgICAgIHN0YXJ0OiBpbmRleFxuICAgICAgfTtcbiAgICAgIGFkdmFuY2Uoc3RhcnRbMF0ubGVuZ3RoKTtcbiAgICAgIHZhciBlbmQsIGF0dHI7XG4gICAgICB3aGlsZSAoIShlbmQgPSBodG1sLm1hdGNoKHN0YXJ0VGFnQ2xvc2UpKSAmJiAoYXR0ciA9IGh0bWwubWF0Y2goYXR0cmlidXRlKSkpIHtcbiAgICAgICAgYWR2YW5jZShhdHRyWzBdLmxlbmd0aCk7XG4gICAgICAgIG1hdGNoLmF0dHJzLnB1c2goYXR0cik7XG4gICAgICB9XG4gICAgICBpZiAoZW5kKSB7XG4gICAgICAgIG1hdGNoLnVuYXJ5U2xhc2ggPSBlbmRbMV07XG4gICAgICAgIGFkdmFuY2UoZW5kWzBdLmxlbmd0aCk7XG4gICAgICAgIG1hdGNoLmVuZCA9IGluZGV4O1xuICAgICAgICByZXR1cm4gbWF0Y2hcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVTdGFydFRhZyAobWF0Y2gpIHtcbiAgICB2YXIgdGFnTmFtZSA9IG1hdGNoLnRhZ05hbWU7XG4gICAgdmFyIHVuYXJ5U2xhc2ggPSBtYXRjaC51bmFyeVNsYXNoO1xuXG4gICAgaWYgKGV4cGVjdEhUTUwpIHtcbiAgICAgIGlmIChsYXN0VGFnID09PSAncCcgJiYgaXNOb25QaHJhc2luZ1RhZyh0YWdOYW1lKSkge1xuICAgICAgICBwYXJzZUVuZFRhZyhsYXN0VGFnKTtcbiAgICAgIH1cbiAgICAgIGlmIChjYW5CZUxlZnRPcGVuVGFnJCQxKHRhZ05hbWUpICYmIGxhc3RUYWcgPT09IHRhZ05hbWUpIHtcbiAgICAgICAgcGFyc2VFbmRUYWcodGFnTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVuYXJ5ID0gaXNVbmFyeVRhZyQkMSh0YWdOYW1lKSB8fCAhIXVuYXJ5U2xhc2g7XG5cbiAgICB2YXIgbCA9IG1hdGNoLmF0dHJzLmxlbmd0aDtcbiAgICB2YXIgYXR0cnMgPSBuZXcgQXJyYXkobCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBhcmdzID0gbWF0Y2guYXR0cnNbaV07XG4gICAgICAvLyBoYWNraXNoIHdvcmsgYXJvdW5kIEZGIGJ1ZyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjk3NzhcbiAgICAgIGlmIChJU19SRUdFWF9DQVBUVVJJTkdfQlJPS0VOICYmIGFyZ3NbMF0uaW5kZXhPZignXCJcIicpID09PSAtMSkge1xuICAgICAgICBpZiAoYXJnc1szXSA9PT0gJycpIHsgZGVsZXRlIGFyZ3NbM107IH1cbiAgICAgICAgaWYgKGFyZ3NbNF0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzRdOyB9XG4gICAgICAgIGlmIChhcmdzWzVdID09PSAnJykgeyBkZWxldGUgYXJnc1s1XTsgfVxuICAgICAgfVxuICAgICAgdmFyIHZhbHVlID0gYXJnc1szXSB8fCBhcmdzWzRdIHx8IGFyZ3NbNV0gfHwgJyc7XG4gICAgICB2YXIgc2hvdWxkRGVjb2RlTmV3bGluZXMgPSB0YWdOYW1lID09PSAnYScgJiYgYXJnc1sxXSA9PT0gJ2hyZWYnXG4gICAgICAgID8gb3B0aW9ucy5zaG91bGREZWNvZGVOZXdsaW5lc0ZvckhyZWZcbiAgICAgICAgOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzO1xuICAgICAgYXR0cnNbaV0gPSB7XG4gICAgICAgIG5hbWU6IGFyZ3NbMV0sXG4gICAgICAgIHZhbHVlOiBkZWNvZGVBdHRyKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcylcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCF1bmFyeSkge1xuICAgICAgc3RhY2sucHVzaCh7IHRhZzogdGFnTmFtZSwgbG93ZXJDYXNlZFRhZzogdGFnTmFtZS50b0xvd2VyQ2FzZSgpLCBhdHRyczogYXR0cnMgfSk7XG4gICAgICBsYXN0VGFnID0gdGFnTmFtZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zdGFydCkge1xuICAgICAgb3B0aW9ucy5zdGFydCh0YWdOYW1lLCBhdHRycywgdW5hcnksIG1hdGNoLnN0YXJ0LCBtYXRjaC5lbmQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlRW5kVGFnICh0YWdOYW1lLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIHBvcywgbG93ZXJDYXNlZFRhZ05hbWU7XG4gICAgaWYgKHN0YXJ0ID09IG51bGwpIHsgc3RhcnQgPSBpbmRleDsgfVxuICAgIGlmIChlbmQgPT0gbnVsbCkgeyBlbmQgPSBpbmRleDsgfVxuXG4gICAgaWYgKHRhZ05hbWUpIHtcbiAgICAgIGxvd2VyQ2FzZWRUYWdOYW1lID0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIGNsb3Nlc3Qgb3BlbmVkIHRhZyBvZiB0aGUgc2FtZSB0eXBlXG4gICAgaWYgKHRhZ05hbWUpIHtcbiAgICAgIGZvciAocG9zID0gc3RhY2subGVuZ3RoIC0gMTsgcG9zID49IDA7IHBvcy0tKSB7XG4gICAgICAgIGlmIChzdGFja1twb3NdLmxvd2VyQ2FzZWRUYWcgPT09IGxvd2VyQ2FzZWRUYWdOYW1lKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBubyB0YWcgbmFtZSBpcyBwcm92aWRlZCwgY2xlYW4gc2hvcFxuICAgICAgcG9zID0gMDtcbiAgICB9XG5cbiAgICBpZiAocG9zID49IDApIHtcbiAgICAgIC8vIENsb3NlIGFsbCB0aGUgb3BlbiBlbGVtZW50cywgdXAgdGhlIHN0YWNrXG4gICAgICBmb3IgKHZhciBpID0gc3RhY2subGVuZ3RoIC0gMTsgaSA+PSBwb3M7IGktLSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgICAgIChpID4gcG9zIHx8ICF0YWdOYW1lKSAmJlxuICAgICAgICAgIG9wdGlvbnMud2FyblxuICAgICAgICApIHtcbiAgICAgICAgICBvcHRpb25zLndhcm4oXG4gICAgICAgICAgICAoXCJ0YWcgPFwiICsgKHN0YWNrW2ldLnRhZykgKyBcIj4gaGFzIG5vIG1hdGNoaW5nIGVuZCB0YWcuXCIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5lbmQpIHtcbiAgICAgICAgICBvcHRpb25zLmVuZChzdGFja1tpXS50YWcsIHN0YXJ0LCBlbmQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgb3BlbiBlbGVtZW50cyBmcm9tIHRoZSBzdGFja1xuICAgICAgc3RhY2subGVuZ3RoID0gcG9zO1xuICAgICAgbGFzdFRhZyA9IHBvcyAmJiBzdGFja1twb3MgLSAxXS50YWc7XG4gICAgfSBlbHNlIGlmIChsb3dlckNhc2VkVGFnTmFtZSA9PT0gJ2JyJykge1xuICAgICAgaWYgKG9wdGlvbnMuc3RhcnQpIHtcbiAgICAgICAgb3B0aW9ucy5zdGFydCh0YWdOYW1lLCBbXSwgdHJ1ZSwgc3RhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsb3dlckNhc2VkVGFnTmFtZSA9PT0gJ3AnKSB7XG4gICAgICBpZiAob3B0aW9ucy5zdGFydCkge1xuICAgICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIFtdLCBmYWxzZSwgc3RhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5lbmQpIHtcbiAgICAgICAgb3B0aW9ucy5lbmQodGFnTmFtZSwgc3RhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qICAqL1xuXG52YXIgb25SRSA9IC9eQHxedi1vbjovO1xudmFyIGRpclJFID0gL152LXxeQHxeOi87XG52YXIgZm9yQWxpYXNSRSA9IC8oW15dKj8pXFxzKyg/OmlufG9mKVxccysoW15dKikvO1xudmFyIGZvckl0ZXJhdG9yUkUgPSAvLChbXixcXH1cXF1dKikoPzosKFteLFxcfVxcXV0qKSk/JC87XG52YXIgc3RyaXBQYXJlbnNSRSA9IC9eXFwofFxcKSQvZztcblxudmFyIGFyZ1JFID0gLzooLiopJC87XG52YXIgYmluZFJFID0gL146fF52LWJpbmQ6LztcbnZhciBtb2RpZmllclJFID0gL1xcLlteLl0rL2c7XG5cbnZhciBkZWNvZGVIVE1MQ2FjaGVkID0gY2FjaGVkKGhlLmRlY29kZSk7XG5cbi8vIGNvbmZpZ3VyYWJsZSBzdGF0ZVxudmFyIHdhcm4kMjtcbnZhciBkZWxpbWl0ZXJzO1xudmFyIHRyYW5zZm9ybXM7XG52YXIgcHJlVHJhbnNmb3JtcztcbnZhciBwb3N0VHJhbnNmb3JtcztcbnZhciBwbGF0Zm9ybUlzUHJlVGFnO1xudmFyIHBsYXRmb3JtTXVzdFVzZVByb3A7XG52YXIgcGxhdGZvcm1HZXRUYWdOYW1lc3BhY2U7XG5cblxuXG5mdW5jdGlvbiBjcmVhdGVBU1RFbGVtZW50IChcbiAgdGFnLFxuICBhdHRycyxcbiAgcGFyZW50XG4pIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAxLFxuICAgIHRhZzogdGFnLFxuICAgIGF0dHJzTGlzdDogYXR0cnMsXG4gICAgYXR0cnNNYXA6IG1ha2VBdHRyc01hcChhdHRycyksXG4gICAgcGFyZW50OiBwYXJlbnQsXG4gICAgY2hpbGRyZW46IFtdXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IEhUTUwgc3RyaW5nIHRvIEFTVC5cbiAqL1xuZnVuY3Rpb24gcGFyc2UgKFxuICB0ZW1wbGF0ZSxcbiAgb3B0aW9uc1xuKSB7XG4gIHdhcm4kMiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjtcblxuICBwbGF0Zm9ybUlzUHJlVGFnID0gb3B0aW9ucy5pc1ByZVRhZyB8fCBubztcbiAgcGxhdGZvcm1NdXN0VXNlUHJvcCA9IG9wdGlvbnMubXVzdFVzZVByb3AgfHwgbm87XG4gIHBsYXRmb3JtR2V0VGFnTmFtZXNwYWNlID0gb3B0aW9ucy5nZXRUYWdOYW1lc3BhY2UgfHwgbm87XG5cbiAgdHJhbnNmb3JtcyA9IHBsdWNrTW9kdWxlRnVuY3Rpb24ob3B0aW9ucy5tb2R1bGVzLCAndHJhbnNmb3JtTm9kZScpO1xuICBwcmVUcmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdwcmVUcmFuc2Zvcm1Ob2RlJyk7XG4gIHBvc3RUcmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdwb3N0VHJhbnNmb3JtTm9kZScpO1xuXG4gIGRlbGltaXRlcnMgPSBvcHRpb25zLmRlbGltaXRlcnM7XG5cbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciBwcmVzZXJ2ZVdoaXRlc3BhY2UgPSBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZSAhPT0gZmFsc2U7XG4gIHZhciByb290O1xuICB2YXIgY3VycmVudFBhcmVudDtcbiAgdmFyIGluVlByZSA9IGZhbHNlO1xuICB2YXIgaW5QcmUgPSBmYWxzZTtcbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHdhcm5PbmNlIChtc2cpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICAgIHdhcm4kMihtc2cpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlRWxlbWVudCAoZWxlbWVudCkge1xuICAgIC8vIGNoZWNrIHByZSBzdGF0ZVxuICAgIGlmIChlbGVtZW50LnByZSkge1xuICAgICAgaW5WUHJlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChwbGF0Zm9ybUlzUHJlVGFnKGVsZW1lbnQudGFnKSkge1xuICAgICAgaW5QcmUgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gYXBwbHkgcG9zdC10cmFuc2Zvcm1zXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3N0VHJhbnNmb3Jtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcG9zdFRyYW5zZm9ybXNbaV0oZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VIVE1MKHRlbXBsYXRlLCB7XG4gICAgd2Fybjogd2FybiQyLFxuICAgIGV4cGVjdEhUTUw6IG9wdGlvbnMuZXhwZWN0SFRNTCxcbiAgICBpc1VuYXJ5VGFnOiBvcHRpb25zLmlzVW5hcnlUYWcsXG4gICAgY2FuQmVMZWZ0T3BlblRhZzogb3B0aW9ucy5jYW5CZUxlZnRPcGVuVGFnLFxuICAgIHNob3VsZERlY29kZU5ld2xpbmVzOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzLFxuICAgIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjogb3B0aW9ucy5zaG91bGREZWNvZGVOZXdsaW5lc0ZvckhyZWYsXG4gICAgc2hvdWxkS2VlcENvbW1lbnQ6IG9wdGlvbnMuY29tbWVudHMsXG4gICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0ICh0YWcsIGF0dHJzLCB1bmFyeSkge1xuICAgICAgLy8gY2hlY2sgbmFtZXNwYWNlLlxuICAgICAgLy8gaW5oZXJpdCBwYXJlbnQgbnMgaWYgdGhlcmUgaXMgb25lXG4gICAgICB2YXIgbnMgPSAoY3VycmVudFBhcmVudCAmJiBjdXJyZW50UGFyZW50Lm5zKSB8fCBwbGF0Zm9ybUdldFRhZ05hbWVzcGFjZSh0YWcpO1xuXG4gICAgICAvLyBoYW5kbGUgSUUgc3ZnIGJ1Z1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoaXNJRSAmJiBucyA9PT0gJ3N2ZycpIHtcbiAgICAgICAgYXR0cnMgPSBndWFyZElFU1ZHQnVnKGF0dHJzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVsZW1lbnQgPSBjcmVhdGVBU1RFbGVtZW50KHRhZywgYXR0cnMsIGN1cnJlbnRQYXJlbnQpO1xuICAgICAgaWYgKG5zKSB7XG4gICAgICAgIGVsZW1lbnQubnMgPSBucztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRm9yYmlkZGVuVGFnKGVsZW1lbnQpICYmICFpc1NlcnZlclJlbmRlcmluZygpKSB7XG4gICAgICAgIGVsZW1lbnQuZm9yYmlkZGVuID0gdHJ1ZTtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuJDIoXG4gICAgICAgICAgJ1RlbXBsYXRlcyBzaG91bGQgb25seSBiZSByZXNwb25zaWJsZSBmb3IgbWFwcGluZyB0aGUgc3RhdGUgdG8gdGhlICcgK1xuICAgICAgICAgICdVSS4gQXZvaWQgcGxhY2luZyB0YWdzIHdpdGggc2lkZS1lZmZlY3RzIGluIHlvdXIgdGVtcGxhdGVzLCBzdWNoIGFzICcgK1xuICAgICAgICAgIFwiPFwiICsgdGFnICsgXCI+XCIgKyAnLCBhcyB0aGV5IHdpbGwgbm90IGJlIHBhcnNlZC4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIGFwcGx5IHByZS10cmFuc2Zvcm1zXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZVRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWxlbWVudCA9IHByZVRyYW5zZm9ybXNbaV0oZWxlbWVudCwgb3B0aW9ucykgfHwgZWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpblZQcmUpIHtcbiAgICAgICAgcHJvY2Vzc1ByZShlbGVtZW50KTtcbiAgICAgICAgaWYgKGVsZW1lbnQucHJlKSB7XG4gICAgICAgICAgaW5WUHJlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBsYXRmb3JtSXNQcmVUYWcoZWxlbWVudC50YWcpKSB7XG4gICAgICAgIGluUHJlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpblZQcmUpIHtcbiAgICAgICAgcHJvY2Vzc1Jhd0F0dHJzKGVsZW1lbnQpO1xuICAgICAgfSBlbHNlIGlmICghZWxlbWVudC5wcm9jZXNzZWQpIHtcbiAgICAgICAgLy8gc3RydWN0dXJhbCBkaXJlY3RpdmVzXG4gICAgICAgIHByb2Nlc3NGb3IoZWxlbWVudCk7XG4gICAgICAgIHByb2Nlc3NJZihlbGVtZW50KTtcbiAgICAgICAgcHJvY2Vzc09uY2UoZWxlbWVudCk7XG4gICAgICAgIC8vIGVsZW1lbnQtc2NvcGUgc3R1ZmZcbiAgICAgICAgcHJvY2Vzc0VsZW1lbnQoZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNoZWNrUm9vdENvbnN0cmFpbnRzIChlbCkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIGlmIChlbC50YWcgPT09ICdzbG90JyB8fCBlbC50YWcgPT09ICd0ZW1wbGF0ZScpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKFxuICAgICAgICAgICAgICBcIkNhbm5vdCB1c2UgPFwiICsgKGVsLnRhZykgKyBcIj4gYXMgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlIGl0IG1heSBcIiArXG4gICAgICAgICAgICAgICdjb250YWluIG11bHRpcGxlIG5vZGVzLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbC5hdHRyc01hcC5oYXNPd25Qcm9wZXJ0eSgndi1mb3InKSkge1xuICAgICAgICAgICAgd2Fybk9uY2UoXG4gICAgICAgICAgICAgICdDYW5ub3QgdXNlIHYtZm9yIG9uIHN0YXRlZnVsIGNvbXBvbmVudCByb290IGVsZW1lbnQgYmVjYXVzZSAnICtcbiAgICAgICAgICAgICAgJ2l0IHJlbmRlcnMgbXVsdGlwbGUgZWxlbWVudHMuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdHJlZSBtYW5hZ2VtZW50XG4gICAgICBpZiAoIXJvb3QpIHtcbiAgICAgICAgcm9vdCA9IGVsZW1lbnQ7XG4gICAgICAgIGNoZWNrUm9vdENvbnN0cmFpbnRzKHJvb3QpO1xuICAgICAgfSBlbHNlIGlmICghc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIC8vIGFsbG93IHJvb3QgZWxlbWVudHMgd2l0aCB2LWlmLCB2LWVsc2UtaWYgYW5kIHYtZWxzZVxuICAgICAgICBpZiAocm9vdC5pZiAmJiAoZWxlbWVudC5lbHNlaWYgfHwgZWxlbWVudC5lbHNlKSkge1xuICAgICAgICAgIGNoZWNrUm9vdENvbnN0cmFpbnRzKGVsZW1lbnQpO1xuICAgICAgICAgIGFkZElmQ29uZGl0aW9uKHJvb3QsIHtcbiAgICAgICAgICAgIGV4cDogZWxlbWVudC5lbHNlaWYsXG4gICAgICAgICAgICBibG9jazogZWxlbWVudFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB3YXJuT25jZShcbiAgICAgICAgICAgIFwiQ29tcG9uZW50IHRlbXBsYXRlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudC4gXCIgK1xuICAgICAgICAgICAgXCJJZiB5b3UgYXJlIHVzaW5nIHYtaWYgb24gbXVsdGlwbGUgZWxlbWVudHMsIFwiICtcbiAgICAgICAgICAgIFwidXNlIHYtZWxzZS1pZiB0byBjaGFpbiB0aGVtIGluc3RlYWQuXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFBhcmVudCAmJiAhZWxlbWVudC5mb3JiaWRkZW4pIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkge1xuICAgICAgICAgIHByb2Nlc3NJZkNvbmRpdGlvbnMoZWxlbWVudCwgY3VycmVudFBhcmVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5zbG90U2NvcGUpIHsgLy8gc2NvcGVkIHNsb3RcbiAgICAgICAgICBjdXJyZW50UGFyZW50LnBsYWluID0gZmFsc2U7XG4gICAgICAgICAgdmFyIG5hbWUgPSBlbGVtZW50LnNsb3RUYXJnZXQgfHwgJ1wiZGVmYXVsdFwiJzsoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyB8fCAoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyA9IHt9KSlbbmFtZV0gPSBlbGVtZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRQYXJlbnQuY2hpbGRyZW4ucHVzaChlbGVtZW50KTtcbiAgICAgICAgICBlbGVtZW50LnBhcmVudCA9IGN1cnJlbnRQYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdW5hcnkpIHtcbiAgICAgICAgY3VycmVudFBhcmVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHN0YWNrLnB1c2goZWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9zZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGVuZDogZnVuY3Rpb24gZW5kICgpIHtcbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlXG4gICAgICB2YXIgZWxlbWVudCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIGxhc3ROb2RlID0gZWxlbWVudC5jaGlsZHJlbltlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGxhc3ROb2RlICYmIGxhc3ROb2RlLnR5cGUgPT09IDMgJiYgbGFzdE5vZGUudGV4dCA9PT0gJyAnICYmICFpblByZSkge1xuICAgICAgICBlbGVtZW50LmNoaWxkcmVuLnBvcCgpO1xuICAgICAgfVxuICAgICAgLy8gcG9wIHN0YWNrXG4gICAgICBzdGFjay5sZW5ndGggLT0gMTtcbiAgICAgIGN1cnJlbnRQYXJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTtcbiAgICB9LFxuXG4gICAgY2hhcnM6IGZ1bmN0aW9uIGNoYXJzICh0ZXh0KSB7XG4gICAgICBpZiAoIWN1cnJlbnRQYXJlbnQpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBpZiAodGV4dCA9PT0gdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKFxuICAgICAgICAgICAgICAnQ29tcG9uZW50IHRlbXBsYXRlIHJlcXVpcmVzIGEgcm9vdCBlbGVtZW50LCByYXRoZXIgdGhhbiBqdXN0IHRleHQuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCh0ZXh0ID0gdGV4dC50cmltKCkpKSB7XG4gICAgICAgICAgICB3YXJuT25jZShcbiAgICAgICAgICAgICAgKFwidGV4dCBcXFwiXCIgKyB0ZXh0ICsgXCJcXFwiIG91dHNpZGUgcm9vdCBlbGVtZW50IHdpbGwgYmUgaWdub3JlZC5cIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gSUUgdGV4dGFyZWEgcGxhY2Vob2xkZXIgYnVnXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChpc0lFICYmXG4gICAgICAgIGN1cnJlbnRQYXJlbnQudGFnID09PSAndGV4dGFyZWEnICYmXG4gICAgICAgIGN1cnJlbnRQYXJlbnQuYXR0cnNNYXAucGxhY2Vob2xkZXIgPT09IHRleHRcbiAgICAgICkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHZhciBjaGlsZHJlbiA9IGN1cnJlbnRQYXJlbnQuY2hpbGRyZW47XG4gICAgICB0ZXh0ID0gaW5QcmUgfHwgdGV4dC50cmltKClcbiAgICAgICAgPyBpc1RleHRUYWcoY3VycmVudFBhcmVudCkgPyB0ZXh0IDogZGVjb2RlSFRNTENhY2hlZCh0ZXh0KVxuICAgICAgICAvLyBvbmx5IHByZXNlcnZlIHdoaXRlc3BhY2UgaWYgaXRzIG5vdCByaWdodCBhZnRlciBhIHN0YXJ0aW5nIHRhZ1xuICAgICAgICA6IHByZXNlcnZlV2hpdGVzcGFjZSAmJiBjaGlsZHJlbi5sZW5ndGggPyAnICcgOiAnJztcbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIGlmICghaW5WUHJlICYmIHRleHQgIT09ICcgJyAmJiAocmVzID0gcGFyc2VUZXh0KHRleHQsIGRlbGltaXRlcnMpKSkge1xuICAgICAgICAgIGNoaWxkcmVuLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogMixcbiAgICAgICAgICAgIGV4cHJlc3Npb246IHJlcy5leHByZXNzaW9uLFxuICAgICAgICAgICAgdG9rZW5zOiByZXMudG9rZW5zLFxuICAgICAgICAgICAgdGV4dDogdGV4dFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRleHQgIT09ICcgJyB8fCAhY2hpbGRyZW4ubGVuZ3RoIHx8IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnRleHQgIT09ICcgJykge1xuICAgICAgICAgIGNoaWxkcmVuLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogMyxcbiAgICAgICAgICAgIHRleHQ6IHRleHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgY29tbWVudDogZnVuY3Rpb24gY29tbWVudCAodGV4dCkge1xuICAgICAgY3VycmVudFBhcmVudC5jaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgdHlwZTogMyxcbiAgICAgICAgdGV4dDogdGV4dCxcbiAgICAgICAgaXNDb21tZW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcm9vdFxufVxuXG5mdW5jdGlvbiBwcm9jZXNzUHJlIChlbCkge1xuICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtcHJlJykgIT0gbnVsbCkge1xuICAgIGVsLnByZSA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Jhd0F0dHJzIChlbCkge1xuICB2YXIgbCA9IGVsLmF0dHJzTGlzdC5sZW5ndGg7XG4gIGlmIChsKSB7XG4gICAgdmFyIGF0dHJzID0gZWwuYXR0cnMgPSBuZXcgQXJyYXkobCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIGF0dHJzW2ldID0ge1xuICAgICAgICBuYW1lOiBlbC5hdHRyc0xpc3RbaV0ubmFtZSxcbiAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KGVsLmF0dHJzTGlzdFtpXS52YWx1ZSlcbiAgICAgIH07XG4gICAgfVxuICB9IGVsc2UgaWYgKCFlbC5wcmUpIHtcbiAgICAvLyBub24gcm9vdCBub2RlIGluIHByZSBibG9ja3Mgd2l0aCBubyBhdHRyaWJ1dGVzXG4gICAgZWwucGxhaW4gPSB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NFbGVtZW50IChlbGVtZW50LCBvcHRpb25zKSB7XG4gIHByb2Nlc3NLZXkoZWxlbWVudCk7XG5cbiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIHBsYWluIGVsZW1lbnQgYWZ0ZXJcbiAgLy8gcmVtb3Zpbmcgc3RydWN0dXJhbCBhdHRyaWJ1dGVzXG4gIGVsZW1lbnQucGxhaW4gPSAhZWxlbWVudC5rZXkgJiYgIWVsZW1lbnQuYXR0cnNMaXN0Lmxlbmd0aDtcblxuICBwcm9jZXNzUmVmKGVsZW1lbnQpO1xuICBwcm9jZXNzU2xvdChlbGVtZW50KTtcbiAgcHJvY2Vzc0NvbXBvbmVudChlbGVtZW50KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFuc2Zvcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgZWxlbWVudCA9IHRyYW5zZm9ybXNbaV0oZWxlbWVudCwgb3B0aW9ucykgfHwgZWxlbWVudDtcbiAgfVxuICBwcm9jZXNzQXR0cnMoZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NLZXkgKGVsKSB7XG4gIHZhciBleHAgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ2tleScpO1xuICBpZiAoZXhwKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZWwudGFnID09PSAndGVtcGxhdGUnKSB7XG4gICAgICB3YXJuJDIoXCI8dGVtcGxhdGU+IGNhbm5vdCBiZSBrZXllZC4gUGxhY2UgdGhlIGtleSBvbiByZWFsIGVsZW1lbnRzIGluc3RlYWQuXCIpO1xuICAgIH1cbiAgICBlbC5rZXkgPSBleHA7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1JlZiAoZWwpIHtcbiAgdmFyIHJlZiA9IGdldEJpbmRpbmdBdHRyKGVsLCAncmVmJyk7XG4gIGlmIChyZWYpIHtcbiAgICBlbC5yZWYgPSByZWY7XG4gICAgZWwucmVmSW5Gb3IgPSBjaGVja0luRm9yKGVsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRm9yIChlbCkge1xuICB2YXIgZXhwO1xuICBpZiAoKGV4cCA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWZvcicpKSkge1xuICAgIHZhciByZXMgPSBwYXJzZUZvcihleHApO1xuICAgIGlmIChyZXMpIHtcbiAgICAgIGV4dGVuZChlbCwgcmVzKTtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4kMihcbiAgICAgICAgKFwiSW52YWxpZCB2LWZvciBleHByZXNzaW9uOiBcIiArIGV4cClcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cblxuXG5mdW5jdGlvbiBwYXJzZUZvciAoZXhwKSB7XG4gIHZhciBpbk1hdGNoID0gZXhwLm1hdGNoKGZvckFsaWFzUkUpO1xuICBpZiAoIWluTWF0Y2gpIHsgcmV0dXJuIH1cbiAgdmFyIHJlcyA9IHt9O1xuICByZXMuZm9yID0gaW5NYXRjaFsyXS50cmltKCk7XG4gIHZhciBhbGlhcyA9IGluTWF0Y2hbMV0udHJpbSgpLnJlcGxhY2Uoc3RyaXBQYXJlbnNSRSwgJycpO1xuICB2YXIgaXRlcmF0b3JNYXRjaCA9IGFsaWFzLm1hdGNoKGZvckl0ZXJhdG9yUkUpO1xuICBpZiAoaXRlcmF0b3JNYXRjaCkge1xuICAgIHJlcy5hbGlhcyA9IGFsaWFzLnJlcGxhY2UoZm9ySXRlcmF0b3JSRSwgJycpO1xuICAgIHJlcy5pdGVyYXRvcjEgPSBpdGVyYXRvck1hdGNoWzFdLnRyaW0oKTtcbiAgICBpZiAoaXRlcmF0b3JNYXRjaFsyXSkge1xuICAgICAgcmVzLml0ZXJhdG9yMiA9IGl0ZXJhdG9yTWF0Y2hbMl0udHJpbSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXMuYWxpYXMgPSBhbGlhcztcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NJZiAoZWwpIHtcbiAgdmFyIGV4cCA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWlmJyk7XG4gIGlmIChleHApIHtcbiAgICBlbC5pZiA9IGV4cDtcbiAgICBhZGRJZkNvbmRpdGlvbihlbCwge1xuICAgICAgZXhwOiBleHAsXG4gICAgICBibG9jazogZWxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScpICE9IG51bGwpIHtcbiAgICAgIGVsLmVsc2UgPSB0cnVlO1xuICAgIH1cbiAgICB2YXIgZWxzZWlmID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZS1pZicpO1xuICAgIGlmIChlbHNlaWYpIHtcbiAgICAgIGVsLmVsc2VpZiA9IGVsc2VpZjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0lmQ29uZGl0aW9ucyAoZWwsIHBhcmVudCkge1xuICB2YXIgcHJldiA9IGZpbmRQcmV2RWxlbWVudChwYXJlbnQuY2hpbGRyZW4pO1xuICBpZiAocHJldiAmJiBwcmV2LmlmKSB7XG4gICAgYWRkSWZDb25kaXRpb24ocHJldiwge1xuICAgICAgZXhwOiBlbC5lbHNlaWYsXG4gICAgICBibG9jazogZWxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgd2FybiQyKFxuICAgICAgXCJ2LVwiICsgKGVsLmVsc2VpZiA/ICgnZWxzZS1pZj1cIicgKyBlbC5lbHNlaWYgKyAnXCInKSA6ICdlbHNlJykgKyBcIiBcIiArXG4gICAgICBcInVzZWQgb24gZWxlbWVudCA8XCIgKyAoZWwudGFnKSArIFwiPiB3aXRob3V0IGNvcnJlc3BvbmRpbmcgdi1pZi5cIlxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFByZXZFbGVtZW50IChjaGlsZHJlbikge1xuICB2YXIgaSA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIGlmIChjaGlsZHJlbltpXS50eXBlID09PSAxKSB7XG4gICAgICByZXR1cm4gY2hpbGRyZW5baV1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY2hpbGRyZW5baV0udGV4dCAhPT0gJyAnKSB7XG4gICAgICAgIHdhcm4kMihcbiAgICAgICAgICBcInRleHQgXFxcIlwiICsgKGNoaWxkcmVuW2ldLnRleHQudHJpbSgpKSArIFwiXFxcIiBiZXR3ZWVuIHYtaWYgYW5kIHYtZWxzZSgtaWYpIFwiICtcbiAgICAgICAgICBcIndpbGwgYmUgaWdub3JlZC5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2hpbGRyZW4ucG9wKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZElmQ29uZGl0aW9uIChlbCwgY29uZGl0aW9uKSB7XG4gIGlmICghZWwuaWZDb25kaXRpb25zKSB7XG4gICAgZWwuaWZDb25kaXRpb25zID0gW107XG4gIH1cbiAgZWwuaWZDb25kaXRpb25zLnB1c2goY29uZGl0aW9uKTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc09uY2UgKGVsKSB7XG4gIHZhciBvbmNlJCQxID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Ytb25jZScpO1xuICBpZiAob25jZSQkMSAhPSBudWxsKSB7XG4gICAgZWwub25jZSA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Nsb3QgKGVsKSB7XG4gIGlmIChlbC50YWcgPT09ICdzbG90Jykge1xuICAgIGVsLnNsb3ROYW1lID0gZ2V0QmluZGluZ0F0dHIoZWwsICduYW1lJyk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZWwua2V5KSB7XG4gICAgICB3YXJuJDIoXG4gICAgICAgIFwiYGtleWAgZG9lcyBub3Qgd29yayBvbiA8c2xvdD4gYmVjYXVzZSBzbG90cyBhcmUgYWJzdHJhY3Qgb3V0bGV0cyBcIiArXG4gICAgICAgIFwiYW5kIGNhbiBwb3NzaWJseSBleHBhbmQgaW50byBtdWx0aXBsZSBlbGVtZW50cy4gXCIgK1xuICAgICAgICBcIlVzZSB0aGUga2V5IG9uIGEgd3JhcHBpbmcgZWxlbWVudCBpbnN0ZWFkLlwiXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xvdFNjb3BlO1xuICAgIGlmIChlbC50YWcgPT09ICd0ZW1wbGF0ZScpIHtcbiAgICAgIHNsb3RTY29wZSA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICdzY29wZScpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBzbG90U2NvcGUpIHtcbiAgICAgICAgd2FybiQyKFxuICAgICAgICAgIFwidGhlIFxcXCJzY29wZVxcXCIgYXR0cmlidXRlIGZvciBzY29wZWQgc2xvdHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYW5kIFwiICtcbiAgICAgICAgICBcInJlcGxhY2VkIGJ5IFxcXCJzbG90LXNjb3BlXFxcIiBzaW5jZSAyLjUuIFRoZSBuZXcgXFxcInNsb3Qtc2NvcGVcXFwiIGF0dHJpYnV0ZSBcIiArXG4gICAgICAgICAgXCJjYW4gYWxzbyBiZSB1c2VkIG9uIHBsYWluIGVsZW1lbnRzIGluIGFkZGl0aW9uIHRvIDx0ZW1wbGF0ZT4gdG8gXCIgK1xuICAgICAgICAgIFwiZGVub3RlIHNjb3BlZCBzbG90cy5cIixcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbC5zbG90U2NvcGUgPSBzbG90U2NvcGUgfHwgZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Nsb3Qtc2NvcGUnKTtcbiAgICB9IGVsc2UgaWYgKChzbG90U2NvcGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2xvdC1zY29wZScpKSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBlbC5hdHRyc01hcFsndi1mb3InXSkge1xuICAgICAgICB3YXJuJDIoXG4gICAgICAgICAgXCJBbWJpZ3VvdXMgY29tYmluZWQgdXNhZ2Ugb2Ygc2xvdC1zY29wZSBhbmQgdi1mb3Igb24gPFwiICsgKGVsLnRhZykgKyBcIj4gXCIgK1xuICAgICAgICAgIFwiKHYtZm9yIHRha2VzIGhpZ2hlciBwcmlvcml0eSkuIFVzZSBhIHdyYXBwZXIgPHRlbXBsYXRlPiBmb3IgdGhlIFwiICtcbiAgICAgICAgICBcInNjb3BlZCBzbG90IHRvIG1ha2UgaXQgY2xlYXJlci5cIixcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbC5zbG90U2NvcGUgPSBzbG90U2NvcGU7XG4gICAgfVxuICAgIHZhciBzbG90VGFyZ2V0ID0gZ2V0QmluZGluZ0F0dHIoZWwsICdzbG90Jyk7XG4gICAgaWYgKHNsb3RUYXJnZXQpIHtcbiAgICAgIGVsLnNsb3RUYXJnZXQgPSBzbG90VGFyZ2V0ID09PSAnXCJcIicgPyAnXCJkZWZhdWx0XCInIDogc2xvdFRhcmdldDtcbiAgICAgIC8vIHByZXNlcnZlIHNsb3QgYXMgYW4gYXR0cmlidXRlIGZvciBuYXRpdmUgc2hhZG93IERPTSBjb21wYXRcbiAgICAgIC8vIG9ubHkgZm9yIG5vbi1zY29wZWQgc2xvdHMuXG4gICAgICBpZiAoZWwudGFnICE9PSAndGVtcGxhdGUnICYmICFlbC5zbG90U2NvcGUpIHtcbiAgICAgICAgYWRkQXR0cihlbCwgJ3Nsb3QnLCBzbG90VGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0NvbXBvbmVudCAoZWwpIHtcbiAgdmFyIGJpbmRpbmc7XG4gIGlmICgoYmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAnaXMnKSkpIHtcbiAgICBlbC5jb21wb25lbnQgPSBiaW5kaW5nO1xuICB9XG4gIGlmIChnZXRBbmRSZW1vdmVBdHRyKGVsLCAnaW5saW5lLXRlbXBsYXRlJykgIT0gbnVsbCkge1xuICAgIGVsLmlubGluZVRlbXBsYXRlID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzQXR0cnMgKGVsKSB7XG4gIHZhciBsaXN0ID0gZWwuYXR0cnNMaXN0O1xuICB2YXIgaSwgbCwgbmFtZSwgcmF3TmFtZSwgdmFsdWUsIG1vZGlmaWVycywgaXNQcm9wO1xuICBmb3IgKGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBuYW1lID0gcmF3TmFtZSA9IGxpc3RbaV0ubmFtZTtcbiAgICB2YWx1ZSA9IGxpc3RbaV0udmFsdWU7XG4gICAgaWYgKGRpclJFLnRlc3QobmFtZSkpIHtcbiAgICAgIC8vIG1hcmsgZWxlbWVudCBhcyBkeW5hbWljXG4gICAgICBlbC5oYXNCaW5kaW5ncyA9IHRydWU7XG4gICAgICAvLyBtb2RpZmllcnNcbiAgICAgIG1vZGlmaWVycyA9IHBhcnNlTW9kaWZpZXJzKG5hbWUpO1xuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKG1vZGlmaWVyUkUsICcnKTtcbiAgICAgIH1cbiAgICAgIGlmIChiaW5kUkUudGVzdChuYW1lKSkgeyAvLyB2LWJpbmRcbiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShiaW5kUkUsICcnKTtcbiAgICAgICAgdmFsdWUgPSBwYXJzZUZpbHRlcnModmFsdWUpO1xuICAgICAgICBpc1Byb3AgPSBmYWxzZTtcbiAgICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICAgIGlmIChtb2RpZmllcnMucHJvcCkge1xuICAgICAgICAgICAgaXNQcm9wID0gdHJ1ZTtcbiAgICAgICAgICAgIG5hbWUgPSBjYW1lbGl6ZShuYW1lKTtcbiAgICAgICAgICAgIGlmIChuYW1lID09PSAnaW5uZXJIdG1sJykgeyBuYW1lID0gJ2lubmVySFRNTCc7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1vZGlmaWVycy5jYW1lbCkge1xuICAgICAgICAgICAgbmFtZSA9IGNhbWVsaXplKG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobW9kaWZpZXJzLnN5bmMpIHtcbiAgICAgICAgICAgIGFkZEhhbmRsZXIoXG4gICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICAoXCJ1cGRhdGU6XCIgKyAoY2FtZWxpemUobmFtZSkpKSxcbiAgICAgICAgICAgICAgZ2VuQXNzaWdubWVudENvZGUodmFsdWUsIFwiJGV2ZW50XCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcm9wIHx8IChcbiAgICAgICAgICAhZWwuY29tcG9uZW50ICYmIHBsYXRmb3JtTXVzdFVzZVByb3AoZWwudGFnLCBlbC5hdHRyc01hcC50eXBlLCBuYW1lKVxuICAgICAgICApKSB7XG4gICAgICAgICAgYWRkUHJvcChlbCwgbmFtZSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFkZEF0dHIoZWwsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvblJFLnRlc3QobmFtZSkpIHsgLy8gdi1vblxuICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKG9uUkUsICcnKTtcbiAgICAgICAgYWRkSGFuZGxlcihlbCwgbmFtZSwgdmFsdWUsIG1vZGlmaWVycywgZmFsc2UsIHdhcm4kMik7XG4gICAgICB9IGVsc2UgeyAvLyBub3JtYWwgZGlyZWN0aXZlc1xuICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGRpclJFLCAnJyk7XG4gICAgICAgIC8vIHBhcnNlIGFyZ1xuICAgICAgICB2YXIgYXJnTWF0Y2ggPSBuYW1lLm1hdGNoKGFyZ1JFKTtcbiAgICAgICAgdmFyIGFyZyA9IGFyZ01hdGNoICYmIGFyZ01hdGNoWzFdO1xuICAgICAgICBpZiAoYXJnKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgLShhcmcubGVuZ3RoICsgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGFkZERpcmVjdGl2ZShlbCwgbmFtZSwgcmF3TmFtZSwgdmFsdWUsIGFyZywgbW9kaWZpZXJzKTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSA9PT0gJ21vZGVsJykge1xuICAgICAgICAgIGNoZWNrRm9yQWxpYXNNb2RlbChlbCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGxpdGVyYWwgYXR0cmlidXRlXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHZhbHVlLCBkZWxpbWl0ZXJzKTtcbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIHdhcm4kMihcbiAgICAgICAgICAgIG5hbWUgKyBcIj1cXFwiXCIgKyB2YWx1ZSArIFwiXFxcIjogXCIgK1xuICAgICAgICAgICAgJ0ludGVycG9sYXRpb24gaW5zaWRlIGF0dHJpYnV0ZXMgaGFzIGJlZW4gcmVtb3ZlZC4gJyArXG4gICAgICAgICAgICAnVXNlIHYtYmluZCBvciB0aGUgY29sb24gc2hvcnRoYW5kIGluc3RlYWQuIEZvciBleGFtcGxlLCAnICtcbiAgICAgICAgICAgICdpbnN0ZWFkIG9mIDxkaXYgaWQ9XCJ7eyB2YWwgfX1cIj4sIHVzZSA8ZGl2IDppZD1cInZhbFwiPi4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYWRkQXR0cihlbCwgbmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgIC8vICM2ODg3IGZpcmVmb3ggZG9lc24ndCB1cGRhdGUgbXV0ZWQgc3RhdGUgaWYgc2V0IHZpYSBhdHRyaWJ1dGVcbiAgICAgIC8vIGV2ZW4gaW1tZWRpYXRlbHkgYWZ0ZXIgZWxlbWVudCBjcmVhdGlvblxuICAgICAgaWYgKCFlbC5jb21wb25lbnQgJiZcbiAgICAgICAgICBuYW1lID09PSAnbXV0ZWQnICYmXG4gICAgICAgICAgcGxhdGZvcm1NdXN0VXNlUHJvcChlbC50YWcsIGVsLmF0dHJzTWFwLnR5cGUsIG5hbWUpKSB7XG4gICAgICAgIGFkZFByb3AoZWwsIG5hbWUsICd0cnVlJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrSW5Gb3IgKGVsKSB7XG4gIHZhciBwYXJlbnQgPSBlbDtcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGlmIChwYXJlbnQuZm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIHBhcnNlTW9kaWZpZXJzIChuYW1lKSB7XG4gIHZhciBtYXRjaCA9IG5hbWUubWF0Y2gobW9kaWZpZXJSRSk7XG4gIGlmIChtYXRjaCkge1xuICAgIHZhciByZXQgPSB7fTtcbiAgICBtYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7IHJldFttLnNsaWNlKDEpXSA9IHRydWU7IH0pO1xuICAgIHJldHVybiByZXRcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlQXR0cnNNYXAgKGF0dHJzKSB7XG4gIHZhciBtYXAgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhdHRycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICBtYXBbYXR0cnNbaV0ubmFtZV0gJiYgIWlzSUUgJiYgIWlzRWRnZVxuICAgICkge1xuICAgICAgd2FybiQyKCdkdXBsaWNhdGUgYXR0cmlidXRlOiAnICsgYXR0cnNbaV0ubmFtZSk7XG4gICAgfVxuICAgIG1hcFthdHRyc1tpXS5uYW1lXSA9IGF0dHJzW2ldLnZhbHVlO1xuICB9XG4gIHJldHVybiBtYXBcbn1cblxuLy8gZm9yIHNjcmlwdCAoZS5nLiB0eXBlPVwieC90ZW1wbGF0ZVwiKSBvciBzdHlsZSwgZG8gbm90IGRlY29kZSBjb250ZW50XG5mdW5jdGlvbiBpc1RleHRUYWcgKGVsKSB7XG4gIHJldHVybiBlbC50YWcgPT09ICdzY3JpcHQnIHx8IGVsLnRhZyA9PT0gJ3N0eWxlJ1xufVxuXG5mdW5jdGlvbiBpc0ZvcmJpZGRlblRhZyAoZWwpIHtcbiAgcmV0dXJuIChcbiAgICBlbC50YWcgPT09ICdzdHlsZScgfHxcbiAgICAoZWwudGFnID09PSAnc2NyaXB0JyAmJiAoXG4gICAgICAhZWwuYXR0cnNNYXAudHlwZSB8fFxuICAgICAgZWwuYXR0cnNNYXAudHlwZSA9PT0gJ3RleHQvamF2YXNjcmlwdCdcbiAgICApKVxuICApXG59XG5cbnZhciBpZU5TQnVnID0gL154bWxuczpOU1xcZCsvO1xudmFyIGllTlNQcmVmaXggPSAvXk5TXFxkKzovO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gZ3VhcmRJRVNWR0J1ZyAoYXR0cnMpIHtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGF0dHIgPSBhdHRyc1tpXTtcbiAgICBpZiAoIWllTlNCdWcudGVzdChhdHRyLm5hbWUpKSB7XG4gICAgICBhdHRyLm5hbWUgPSBhdHRyLm5hbWUucmVwbGFjZShpZU5TUHJlZml4LCAnJyk7XG4gICAgICByZXMucHVzaChhdHRyKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBjaGVja0ZvckFsaWFzTW9kZWwgKGVsLCB2YWx1ZSkge1xuICB2YXIgX2VsID0gZWw7XG4gIHdoaWxlIChfZWwpIHtcbiAgICBpZiAoX2VsLmZvciAmJiBfZWwuYWxpYXMgPT09IHZhbHVlKSB7XG4gICAgICB3YXJuJDIoXG4gICAgICAgIFwiPFwiICsgKGVsLnRhZykgKyBcIiB2LW1vZGVsPVxcXCJcIiArIHZhbHVlICsgXCJcXFwiPjogXCIgK1xuICAgICAgICBcIllvdSBhcmUgYmluZGluZyB2LW1vZGVsIGRpcmVjdGx5IHRvIGEgdi1mb3IgaXRlcmF0aW9uIGFsaWFzLiBcIiArXG4gICAgICAgIFwiVGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIG1vZGlmeSB0aGUgdi1mb3Igc291cmNlIGFycmF5IGJlY2F1c2UgXCIgK1xuICAgICAgICBcIndyaXRpbmcgdG8gdGhlIGFsaWFzIGlzIGxpa2UgbW9kaWZ5aW5nIGEgZnVuY3Rpb24gbG9jYWwgdmFyaWFibGUuIFwiICtcbiAgICAgICAgXCJDb25zaWRlciB1c2luZyBhbiBhcnJheSBvZiBvYmplY3RzIGFuZCB1c2Ugdi1tb2RlbCBvbiBhbiBvYmplY3QgcHJvcGVydHkgaW5zdGVhZC5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgX2VsID0gX2VsLnBhcmVudDtcbiAgfVxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBFeHBhbmQgaW5wdXRbdi1tb2RlbF0gd2l0aCBkeWFubWljIHR5cGUgYmluZGluZ3MgaW50byB2LWlmLWVsc2UgY2hhaW5zXG4gKiBUdXJuIHRoaXM6XG4gKiAgIDxpbnB1dCB2LW1vZGVsPVwiZGF0YVt0eXBlXVwiIDp0eXBlPVwidHlwZVwiPlxuICogaW50byB0aGlzOlxuICogICA8aW5wdXQgdi1pZj1cInR5cGUgPT09ICdjaGVja2JveCdcIiB0eXBlPVwiY2hlY2tib3hcIiB2LW1vZGVsPVwiZGF0YVt0eXBlXVwiPlxuICogICA8aW5wdXQgdi1lbHNlLWlmPVwidHlwZSA9PT0gJ3JhZGlvJ1wiIHR5cGU9XCJyYWRpb1wiIHYtbW9kZWw9XCJkYXRhW3R5cGVdXCI+XG4gKiAgIDxpbnB1dCB2LWVsc2UgOnR5cGU9XCJ0eXBlXCIgdi1tb2RlbD1cImRhdGFbdHlwZV1cIj5cbiAqL1xuXG5mdW5jdGlvbiBwcmVUcmFuc2Zvcm1Ob2RlIChlbCwgb3B0aW9ucykge1xuICBpZiAoZWwudGFnID09PSAnaW5wdXQnKSB7XG4gICAgdmFyIG1hcCA9IGVsLmF0dHJzTWFwO1xuICAgIGlmICghbWFwWyd2LW1vZGVsJ10pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciB0eXBlQmluZGluZztcbiAgICBpZiAobWFwWyc6dHlwZSddIHx8IG1hcFsndi1iaW5kOnR5cGUnXSkge1xuICAgICAgdHlwZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3R5cGUnKTtcbiAgICB9XG4gICAgaWYgKCFtYXAudHlwZSAmJiAhdHlwZUJpbmRpbmcgJiYgbWFwWyd2LWJpbmQnXSkge1xuICAgICAgdHlwZUJpbmRpbmcgPSBcIihcIiArIChtYXBbJ3YtYmluZCddKSArIFwiKS50eXBlXCI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVCaW5kaW5nKSB7XG4gICAgICB2YXIgaWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1pZicsIHRydWUpO1xuICAgICAgdmFyIGlmQ29uZGl0aW9uRXh0cmEgPSBpZkNvbmRpdGlvbiA/IChcIiYmKFwiICsgaWZDb25kaXRpb24gKyBcIilcIikgOiBcIlwiO1xuICAgICAgdmFyIGhhc0Vsc2UgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1lbHNlJywgdHJ1ZSkgIT0gbnVsbDtcbiAgICAgIHZhciBlbHNlSWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1lbHNlLWlmJywgdHJ1ZSk7XG4gICAgICAvLyAxLiBjaGVja2JveFxuICAgICAgdmFyIGJyYW5jaDAgPSBjbG9uZUFTVEVsZW1lbnQoZWwpO1xuICAgICAgLy8gcHJvY2VzcyBmb3Igb24gdGhlIG1haW4gbm9kZVxuICAgICAgcHJvY2Vzc0ZvcihicmFuY2gwKTtcbiAgICAgIGFkZFJhd0F0dHIoYnJhbmNoMCwgJ3R5cGUnLCAnY2hlY2tib3gnKTtcbiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDAsIG9wdGlvbnMpO1xuICAgICAgYnJhbmNoMC5wcm9jZXNzZWQgPSB0cnVlOyAvLyBwcmV2ZW50IGl0IGZyb20gZG91YmxlLXByb2Nlc3NlZFxuICAgICAgYnJhbmNoMC5pZiA9IFwiKFwiICsgdHlwZUJpbmRpbmcgKyBcIik9PT0nY2hlY2tib3gnXCIgKyBpZkNvbmRpdGlvbkV4dHJhO1xuICAgICAgYWRkSWZDb25kaXRpb24oYnJhbmNoMCwge1xuICAgICAgICBleHA6IGJyYW5jaDAuaWYsXG4gICAgICAgIGJsb2NrOiBicmFuY2gwXG4gICAgICB9KTtcbiAgICAgIC8vIDIuIGFkZCByYWRpbyBlbHNlLWlmIGNvbmRpdGlvblxuICAgICAgdmFyIGJyYW5jaDEgPSBjbG9uZUFTVEVsZW1lbnQoZWwpO1xuICAgICAgZ2V0QW5kUmVtb3ZlQXR0cihicmFuY2gxLCAndi1mb3InLCB0cnVlKTtcbiAgICAgIGFkZFJhd0F0dHIoYnJhbmNoMSwgJ3R5cGUnLCAncmFkaW8nKTtcbiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDEsIG9wdGlvbnMpO1xuICAgICAgYWRkSWZDb25kaXRpb24oYnJhbmNoMCwge1xuICAgICAgICBleHA6IFwiKFwiICsgdHlwZUJpbmRpbmcgKyBcIik9PT0ncmFkaW8nXCIgKyBpZkNvbmRpdGlvbkV4dHJhLFxuICAgICAgICBibG9jazogYnJhbmNoMVxuICAgICAgfSk7XG4gICAgICAvLyAzLiBvdGhlclxuICAgICAgdmFyIGJyYW5jaDIgPSBjbG9uZUFTVEVsZW1lbnQoZWwpO1xuICAgICAgZ2V0QW5kUmVtb3ZlQXR0cihicmFuY2gyLCAndi1mb3InLCB0cnVlKTtcbiAgICAgIGFkZFJhd0F0dHIoYnJhbmNoMiwgJzp0eXBlJywgdHlwZUJpbmRpbmcpO1xuICAgICAgcHJvY2Vzc0VsZW1lbnQoYnJhbmNoMiwgb3B0aW9ucyk7XG4gICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7XG4gICAgICAgIGV4cDogaWZDb25kaXRpb24sXG4gICAgICAgIGJsb2NrOiBicmFuY2gyXG4gICAgICB9KTtcblxuICAgICAgaWYgKGhhc0Vsc2UpIHtcbiAgICAgICAgYnJhbmNoMC5lbHNlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZWxzZUlmQ29uZGl0aW9uKSB7XG4gICAgICAgIGJyYW5jaDAuZWxzZWlmID0gZWxzZUlmQ29uZGl0aW9uO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYnJhbmNoMFxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9uZUFTVEVsZW1lbnQgKGVsKSB7XG4gIHJldHVybiBjcmVhdGVBU1RFbGVtZW50KGVsLnRhZywgZWwuYXR0cnNMaXN0LnNsaWNlKCksIGVsLnBhcmVudClcbn1cblxudmFyIG1vZGVsJDIgPSB7XG4gIHByZVRyYW5zZm9ybU5vZGU6IHByZVRyYW5zZm9ybU5vZGVcbn1cblxudmFyIG1vZHVsZXMkMSA9IFtcbiAga2xhc3MkMSxcbiAgc3R5bGUkMSxcbiAgbW9kZWwkMlxuXVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gdGV4dCAoZWwsIGRpcikge1xuICBpZiAoZGlyLnZhbHVlKSB7XG4gICAgYWRkUHJvcChlbCwgJ3RleHRDb250ZW50JywgKFwiX3MoXCIgKyAoZGlyLnZhbHVlKSArIFwiKVwiKSk7XG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGh0bWwgKGVsLCBkaXIpIHtcbiAgaWYgKGRpci52YWx1ZSkge1xuICAgIGFkZFByb3AoZWwsICdpbm5lckhUTUwnLCAoXCJfcyhcIiArIChkaXIudmFsdWUpICsgXCIpXCIpKTtcbiAgfVxufVxuXG52YXIgZGlyZWN0aXZlcyQxID0ge1xuICBtb2RlbDogbW9kZWwsXG4gIHRleHQ6IHRleHQsXG4gIGh0bWw6IGh0bWxcbn1cblxuLyogICovXG5cbnZhciBiYXNlT3B0aW9ucyA9IHtcbiAgZXhwZWN0SFRNTDogdHJ1ZSxcbiAgbW9kdWxlczogbW9kdWxlcyQxLFxuICBkaXJlY3RpdmVzOiBkaXJlY3RpdmVzJDEsXG4gIGlzUHJlVGFnOiBpc1ByZVRhZyxcbiAgaXNVbmFyeVRhZzogaXNVbmFyeVRhZyxcbiAgbXVzdFVzZVByb3A6IG11c3RVc2VQcm9wLFxuICBjYW5CZUxlZnRPcGVuVGFnOiBjYW5CZUxlZnRPcGVuVGFnLFxuICBpc1Jlc2VydmVkVGFnOiBpc1Jlc2VydmVkVGFnLFxuICBnZXRUYWdOYW1lc3BhY2U6IGdldFRhZ05hbWVzcGFjZSxcbiAgc3RhdGljS2V5czogZ2VuU3RhdGljS2V5cyhtb2R1bGVzJDEpXG59O1xuXG4vKiAgKi9cblxudmFyIGlzU3RhdGljS2V5O1xudmFyIGlzUGxhdGZvcm1SZXNlcnZlZFRhZztcblxudmFyIGdlblN0YXRpY0tleXNDYWNoZWQgPSBjYWNoZWQoZ2VuU3RhdGljS2V5cyQxKTtcblxuLyoqXG4gKiBHb2FsIG9mIHRoZSBvcHRpbWl6ZXI6IHdhbGsgdGhlIGdlbmVyYXRlZCB0ZW1wbGF0ZSBBU1QgdHJlZVxuICogYW5kIGRldGVjdCBzdWItdHJlZXMgdGhhdCBhcmUgcHVyZWx5IHN0YXRpYywgaS5lLiBwYXJ0cyBvZlxuICogdGhlIERPTSB0aGF0IG5ldmVyIG5lZWRzIHRvIGNoYW5nZS5cbiAqXG4gKiBPbmNlIHdlIGRldGVjdCB0aGVzZSBzdWItdHJlZXMsIHdlIGNhbjpcbiAqXG4gKiAxLiBIb2lzdCB0aGVtIGludG8gY29uc3RhbnRzLCBzbyB0aGF0IHdlIG5vIGxvbmdlciBuZWVkIHRvXG4gKiAgICBjcmVhdGUgZnJlc2ggbm9kZXMgZm9yIHRoZW0gb24gZWFjaCByZS1yZW5kZXI7XG4gKiAyLiBDb21wbGV0ZWx5IHNraXAgdGhlbSBpbiB0aGUgcGF0Y2hpbmcgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gb3B0aW1pemUgKHJvb3QsIG9wdGlvbnMpIHtcbiAgaWYgKCFyb290KSB7IHJldHVybiB9XG4gIGlzU3RhdGljS2V5ID0gZ2VuU3RhdGljS2V5c0NhY2hlZChvcHRpb25zLnN0YXRpY0tleXMgfHwgJycpO1xuICBpc1BsYXRmb3JtUmVzZXJ2ZWRUYWcgPSBvcHRpb25zLmlzUmVzZXJ2ZWRUYWcgfHwgbm87XG4gIC8vIGZpcnN0IHBhc3M6IG1hcmsgYWxsIG5vbi1zdGF0aWMgbm9kZXMuXG4gIG1hcmtTdGF0aWMkMShyb290KTtcbiAgLy8gc2Vjb25kIHBhc3M6IG1hcmsgc3RhdGljIHJvb3RzLlxuICBtYXJrU3RhdGljUm9vdHMocm9vdCwgZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBnZW5TdGF0aWNLZXlzJDEgKGtleXMpIHtcbiAgcmV0dXJuIG1ha2VNYXAoXG4gICAgJ3R5cGUsdGFnLGF0dHJzTGlzdCxhdHRyc01hcCxwbGFpbixwYXJlbnQsY2hpbGRyZW4sYXR0cnMnICtcbiAgICAoa2V5cyA/ICcsJyArIGtleXMgOiAnJylcbiAgKVxufVxuXG5mdW5jdGlvbiBtYXJrU3RhdGljJDEgKG5vZGUpIHtcbiAgbm9kZS5zdGF0aWMgPSBpc1N0YXRpYyhub2RlKTtcbiAgaWYgKG5vZGUudHlwZSA9PT0gMSkge1xuICAgIC8vIGRvIG5vdCBtYWtlIGNvbXBvbmVudCBzbG90IGNvbnRlbnQgc3RhdGljLiB0aGlzIGF2b2lkc1xuICAgIC8vIDEuIGNvbXBvbmVudHMgbm90IGFibGUgdG8gbXV0YXRlIHNsb3Qgbm9kZXNcbiAgICAvLyAyLiBzdGF0aWMgc2xvdCBjb250ZW50IGZhaWxzIGZvciBob3QtcmVsb2FkaW5nXG4gICAgaWYgKFxuICAgICAgIWlzUGxhdGZvcm1SZXNlcnZlZFRhZyhub2RlLnRhZykgJiZcbiAgICAgIG5vZGUudGFnICE9PSAnc2xvdCcgJiZcbiAgICAgIG5vZGUuYXR0cnNNYXBbJ2lubGluZS10ZW1wbGF0ZSddID09IG51bGxcbiAgICApIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgbWFya1N0YXRpYyQxKGNoaWxkKTtcbiAgICAgIGlmICghY2hpbGQuc3RhdGljKSB7XG4gICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykge1xuICAgICAgZm9yICh2YXIgaSQxID0gMSwgbCQxID0gbm9kZS5pZkNvbmRpdGlvbnMubGVuZ3RoOyBpJDEgPCBsJDE7IGkkMSsrKSB7XG4gICAgICAgIHZhciBibG9jayA9IG5vZGUuaWZDb25kaXRpb25zW2kkMV0uYmxvY2s7XG4gICAgICAgIG1hcmtTdGF0aWMkMShibG9jayk7XG4gICAgICAgIGlmICghYmxvY2suc3RhdGljKSB7XG4gICAgICAgICAgbm9kZS5zdGF0aWMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrU3RhdGljUm9vdHMgKG5vZGUsIGlzSW5Gb3IpIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gMSkge1xuICAgIGlmIChub2RlLnN0YXRpYyB8fCBub2RlLm9uY2UpIHtcbiAgICAgIG5vZGUuc3RhdGljSW5Gb3IgPSBpc0luRm9yO1xuICAgIH1cbiAgICAvLyBGb3IgYSBub2RlIHRvIHF1YWxpZnkgYXMgYSBzdGF0aWMgcm9vdCwgaXQgc2hvdWxkIGhhdmUgY2hpbGRyZW4gdGhhdFxuICAgIC8vIGFyZSBub3QganVzdCBzdGF0aWMgdGV4dC4gT3RoZXJ3aXNlIHRoZSBjb3N0IG9mIGhvaXN0aW5nIG91dCB3aWxsXG4gICAgLy8gb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIGFuZCBpdCdzIGJldHRlciBvZmYgdG8ganVzdCBhbHdheXMgcmVuZGVyIGl0IGZyZXNoLlxuICAgIGlmIChub2RlLnN0YXRpYyAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCAmJiAhKFxuICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiZcbiAgICAgIG5vZGUuY2hpbGRyZW5bMF0udHlwZSA9PT0gM1xuICAgICkpIHtcbiAgICAgIG5vZGUuc3RhdGljUm9vdCA9IHRydWU7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zdGF0aWNSb290ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIG1hcmtTdGF0aWNSb290cyhub2RlLmNoaWxkcmVuW2ldLCBpc0luRm9yIHx8ICEhbm9kZS5mb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9kZS5pZkNvbmRpdGlvbnMpIHtcbiAgICAgIGZvciAodmFyIGkkMSA9IDEsIGwkMSA9IG5vZGUuaWZDb25kaXRpb25zLmxlbmd0aDsgaSQxIDwgbCQxOyBpJDErKykge1xuICAgICAgICBtYXJrU3RhdGljUm9vdHMobm9kZS5pZkNvbmRpdGlvbnNbaSQxXS5ibG9jaywgaXNJbkZvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzU3RhdGljIChub2RlKSB7XG4gIGlmIChub2RlLnR5cGUgPT09IDIpIHsgLy8gZXhwcmVzc2lvblxuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGlmIChub2RlLnR5cGUgPT09IDMpIHsgLy8gdGV4dFxuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuICEhKG5vZGUucHJlIHx8IChcbiAgICAhbm9kZS5oYXNCaW5kaW5ncyAmJiAvLyBubyBkeW5hbWljIGJpbmRpbmdzXG4gICAgIW5vZGUuaWYgJiYgIW5vZGUuZm9yICYmIC8vIG5vdCB2LWlmIG9yIHYtZm9yIG9yIHYtZWxzZVxuICAgICFpc0J1aWx0SW5UYWcobm9kZS50YWcpICYmIC8vIG5vdCBhIGJ1aWx0LWluXG4gICAgaXNQbGF0Zm9ybVJlc2VydmVkVGFnKG5vZGUudGFnKSAmJiAvLyBub3QgYSBjb21wb25lbnRcbiAgICAhaXNEaXJlY3RDaGlsZE9mVGVtcGxhdGVGb3Iobm9kZSkgJiZcbiAgICBPYmplY3Qua2V5cyhub2RlKS5ldmVyeShpc1N0YXRpY0tleSlcbiAgKSlcbn1cblxuZnVuY3Rpb24gaXNEaXJlY3RDaGlsZE9mVGVtcGxhdGVGb3IgKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUucGFyZW50KSB7XG4gICAgbm9kZSA9IG5vZGUucGFyZW50O1xuICAgIGlmIChub2RlLnRhZyAhPT0gJ3RlbXBsYXRlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChub2RlLmZvcikge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qICAqL1xuXG52YXIgZm5FeHBSRSA9IC9eKFtcXHckX10rfFxcKFteKV0qP1xcKSlcXHMqPT58XmZ1bmN0aW9uXFxzKlxcKC87XG52YXIgc2ltcGxlUGF0aFJFID0gL15bQS1aYS16XyRdW1xcdyRdKig/OlxcLltBLVphLXpfJF1bXFx3JF0qfFxcWydbXiddKj8nXXxcXFtcIlteXCJdKj9cIl18XFxbXFxkK118XFxbW0EtWmEtel8kXVtcXHckXSpdKSokLztcblxuLy8gS2V5Ym9hcmRFdmVudC5rZXlDb2RlIGFsaWFzZXNcbnZhciBrZXlDb2RlcyA9IHtcbiAgZXNjOiAyNyxcbiAgdGFiOiA5LFxuICBlbnRlcjogMTMsXG4gIHNwYWNlOiAzMixcbiAgdXA6IDM4LFxuICBsZWZ0OiAzNyxcbiAgcmlnaHQ6IDM5LFxuICBkb3duOiA0MCxcbiAgJ2RlbGV0ZSc6IFs4LCA0Nl1cbn07XG5cbi8vIEtleWJvYXJkRXZlbnQua2V5IGFsaWFzZXNcbnZhciBrZXlOYW1lcyA9IHtcbiAgZXNjOiAnRXNjYXBlJyxcbiAgdGFiOiAnVGFiJyxcbiAgZW50ZXI6ICdFbnRlcicsXG4gIHNwYWNlOiAnICcsXG4gIC8vICM3ODA2OiBJRTExIHVzZXMga2V5IG5hbWVzIHdpdGhvdXQgYEFycm93YCBwcmVmaXggZm9yIGFycm93IGtleXMuXG4gIHVwOiBbJ1VwJywgJ0Fycm93VXAnXSxcbiAgbGVmdDogWydMZWZ0JywgJ0Fycm93TGVmdCddLFxuICByaWdodDogWydSaWdodCcsICdBcnJvd1JpZ2h0J10sXG4gIGRvd246IFsnRG93bicsICdBcnJvd0Rvd24nXSxcbiAgJ2RlbGV0ZSc6IFsnQmFja3NwYWNlJywgJ0RlbGV0ZSddXG59O1xuXG4vLyAjNDg2ODogbW9kaWZpZXJzIHRoYXQgcHJldmVudCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBsaXN0ZW5lclxuLy8gbmVlZCB0byBleHBsaWNpdGx5IHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSB3aGV0aGVyIHRvIHJlbW92ZVxuLy8gdGhlIGxpc3RlbmVyIGZvciAub25jZVxudmFyIGdlbkd1YXJkID0gZnVuY3Rpb24gKGNvbmRpdGlvbikgeyByZXR1cm4gKFwiaWYoXCIgKyBjb25kaXRpb24gKyBcIilyZXR1cm4gbnVsbDtcIik7IH07XG5cbnZhciBtb2RpZmllckNvZGUgPSB7XG4gIHN0b3A6ICckZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JyxcbiAgcHJldmVudDogJyRldmVudC5wcmV2ZW50RGVmYXVsdCgpOycsXG4gIHNlbGY6IGdlbkd1YXJkKFwiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXRcIiksXG4gIGN0cmw6IGdlbkd1YXJkKFwiISRldmVudC5jdHJsS2V5XCIpLFxuICBzaGlmdDogZ2VuR3VhcmQoXCIhJGV2ZW50LnNoaWZ0S2V5XCIpLFxuICBhbHQ6IGdlbkd1YXJkKFwiISRldmVudC5hbHRLZXlcIiksXG4gIG1ldGE6IGdlbkd1YXJkKFwiISRldmVudC5tZXRhS2V5XCIpLFxuICBsZWZ0OiBnZW5HdWFyZChcIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAwXCIpLFxuICBtaWRkbGU6IGdlbkd1YXJkKFwiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDFcIiksXG4gIHJpZ2h0OiBnZW5HdWFyZChcIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAyXCIpXG59O1xuXG5mdW5jdGlvbiBnZW5IYW5kbGVycyAoXG4gIGV2ZW50cyxcbiAgaXNOYXRpdmUsXG4gIHdhcm5cbikge1xuICB2YXIgcmVzID0gaXNOYXRpdmUgPyAnbmF0aXZlT246eycgOiAnb246eyc7XG4gIGZvciAodmFyIG5hbWUgaW4gZXZlbnRzKSB7XG4gICAgcmVzICs9IFwiXFxcIlwiICsgbmFtZSArIFwiXFxcIjpcIiArIChnZW5IYW5kbGVyKG5hbWUsIGV2ZW50c1tuYW1lXSkpICsgXCIsXCI7XG4gIH1cbiAgcmV0dXJuIHJlcy5zbGljZSgwLCAtMSkgKyAnfSdcbn1cblxuZnVuY3Rpb24gZ2VuSGFuZGxlciAoXG4gIG5hbWUsXG4gIGhhbmRsZXJcbikge1xuICBpZiAoIWhhbmRsZXIpIHtcbiAgICByZXR1cm4gJ2Z1bmN0aW9uKCl7fSdcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXIpKSB7XG4gICAgcmV0dXJuIChcIltcIiArIChoYW5kbGVyLm1hcChmdW5jdGlvbiAoaGFuZGxlcikgeyByZXR1cm4gZ2VuSGFuZGxlcihuYW1lLCBoYW5kbGVyKTsgfSkuam9pbignLCcpKSArIFwiXVwiKVxuICB9XG5cbiAgdmFyIGlzTWV0aG9kUGF0aCA9IHNpbXBsZVBhdGhSRS50ZXN0KGhhbmRsZXIudmFsdWUpO1xuICB2YXIgaXNGdW5jdGlvbkV4cHJlc3Npb24gPSBmbkV4cFJFLnRlc3QoaGFuZGxlci52YWx1ZSk7XG5cbiAgaWYgKCFoYW5kbGVyLm1vZGlmaWVycykge1xuICAgIGlmIChpc01ldGhvZFBhdGggfHwgaXNGdW5jdGlvbkV4cHJlc3Npb24pIHtcbiAgICAgIHJldHVybiBoYW5kbGVyLnZhbHVlXG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIHJldHVybiAoXCJmdW5jdGlvbigkZXZlbnQpe1wiICsgKGhhbmRsZXIudmFsdWUpICsgXCJ9XCIpIC8vIGlubGluZSBzdGF0ZW1lbnRcbiAgfSBlbHNlIHtcbiAgICB2YXIgY29kZSA9ICcnO1xuICAgIHZhciBnZW5Nb2RpZmllckNvZGUgPSAnJztcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBoYW5kbGVyLm1vZGlmaWVycykge1xuICAgICAgaWYgKG1vZGlmaWVyQ29kZVtrZXldKSB7XG4gICAgICAgIGdlbk1vZGlmaWVyQ29kZSArPSBtb2RpZmllckNvZGVba2V5XTtcbiAgICAgICAgLy8gbGVmdC9yaWdodFxuICAgICAgICBpZiAoa2V5Q29kZXNba2V5XSkge1xuICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2V4YWN0Jykge1xuICAgICAgICB2YXIgbW9kaWZpZXJzID0gKGhhbmRsZXIubW9kaWZpZXJzKTtcbiAgICAgICAgZ2VuTW9kaWZpZXJDb2RlICs9IGdlbkd1YXJkKFxuICAgICAgICAgIFsnY3RybCcsICdzaGlmdCcsICdhbHQnLCAnbWV0YSddXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChrZXlNb2RpZmllcikgeyByZXR1cm4gIW1vZGlmaWVyc1trZXlNb2RpZmllcl07IH0pXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChrZXlNb2RpZmllcikgeyByZXR1cm4gKFwiJGV2ZW50LlwiICsga2V5TW9kaWZpZXIgKyBcIktleVwiKTsgfSlcbiAgICAgICAgICAgIC5qb2luKCd8fCcpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICBjb2RlICs9IGdlbktleUZpbHRlcihrZXlzKTtcbiAgICB9XG4gICAgLy8gTWFrZSBzdXJlIG1vZGlmaWVycyBsaWtlIHByZXZlbnQgYW5kIHN0b3AgZ2V0IGV4ZWN1dGVkIGFmdGVyIGtleSBmaWx0ZXJpbmdcbiAgICBpZiAoZ2VuTW9kaWZpZXJDb2RlKSB7XG4gICAgICBjb2RlICs9IGdlbk1vZGlmaWVyQ29kZTtcbiAgICB9XG4gICAgdmFyIGhhbmRsZXJDb2RlID0gaXNNZXRob2RQYXRoXG4gICAgICA/IChcInJldHVybiBcIiArIChoYW5kbGVyLnZhbHVlKSArIFwiKCRldmVudClcIilcbiAgICAgIDogaXNGdW5jdGlvbkV4cHJlc3Npb25cbiAgICAgICAgPyAoXCJyZXR1cm4gKFwiICsgKGhhbmRsZXIudmFsdWUpICsgXCIpKCRldmVudClcIilcbiAgICAgICAgOiBoYW5kbGVyLnZhbHVlO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIHJldHVybiAoXCJmdW5jdGlvbigkZXZlbnQpe1wiICsgY29kZSArIGhhbmRsZXJDb2RlICsgXCJ9XCIpXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuS2V5RmlsdGVyIChrZXlzKSB7XG4gIHJldHVybiAoXCJpZighKCdidXR0b24nIGluICRldmVudCkmJlwiICsgKGtleXMubWFwKGdlbkZpbHRlckNvZGUpLmpvaW4oJyYmJykpICsgXCIpcmV0dXJuIG51bGw7XCIpXG59XG5cbmZ1bmN0aW9uIGdlbkZpbHRlckNvZGUgKGtleSkge1xuICB2YXIga2V5VmFsID0gcGFyc2VJbnQoa2V5LCAxMCk7XG4gIGlmIChrZXlWYWwpIHtcbiAgICByZXR1cm4gKFwiJGV2ZW50LmtleUNvZGUhPT1cIiArIGtleVZhbClcbiAgfVxuICB2YXIga2V5Q29kZSA9IGtleUNvZGVzW2tleV07XG4gIHZhciBrZXlOYW1lID0ga2V5TmFtZXNba2V5XTtcbiAgcmV0dXJuIChcbiAgICBcIl9rKCRldmVudC5rZXlDb2RlLFwiICtcbiAgICAoSlNPTi5zdHJpbmdpZnkoa2V5KSkgKyBcIixcIiArXG4gICAgKEpTT04uc3RyaW5naWZ5KGtleUNvZGUpKSArIFwiLFwiICtcbiAgICBcIiRldmVudC5rZXksXCIgK1xuICAgIFwiXCIgKyAoSlNPTi5zdHJpbmdpZnkoa2V5TmFtZSkpICtcbiAgICBcIilcIlxuICApXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBvbiAoZWwsIGRpcikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBkaXIubW9kaWZpZXJzKSB7XG4gICAgd2FybihcInYtb24gd2l0aG91dCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IG1vZGlmaWVycy5cIik7XG4gIH1cbiAgZWwud3JhcExpc3RlbmVycyA9IGZ1bmN0aW9uIChjb2RlKSB7IHJldHVybiAoXCJfZyhcIiArIGNvZGUgKyBcIixcIiArIChkaXIudmFsdWUpICsgXCIpXCIpOyB9O1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gYmluZCQxIChlbCwgZGlyKSB7XG4gIGVsLndyYXBEYXRhID0gZnVuY3Rpb24gKGNvZGUpIHtcbiAgICByZXR1cm4gKFwiX2IoXCIgKyBjb2RlICsgXCIsJ1wiICsgKGVsLnRhZykgKyBcIicsXCIgKyAoZGlyLnZhbHVlKSArIFwiLFwiICsgKGRpci5tb2RpZmllcnMgJiYgZGlyLm1vZGlmaWVycy5wcm9wID8gJ3RydWUnIDogJ2ZhbHNlJykgKyAoZGlyLm1vZGlmaWVycyAmJiBkaXIubW9kaWZpZXJzLnN5bmMgPyAnLHRydWUnIDogJycpICsgXCIpXCIpXG4gIH07XG59XG5cbi8qICAqL1xuXG52YXIgYmFzZURpcmVjdGl2ZXMgPSB7XG4gIG9uOiBvbixcbiAgYmluZDogYmluZCQxLFxuICBjbG9hazogbm9vcFxufVxuXG4vKiAgKi9cblxudmFyIENvZGVnZW5TdGF0ZSA9IGZ1bmN0aW9uIENvZGVnZW5TdGF0ZSAob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB0aGlzLndhcm4gPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47XG4gIHRoaXMudHJhbnNmb3JtcyA9IHBsdWNrTW9kdWxlRnVuY3Rpb24ob3B0aW9ucy5tb2R1bGVzLCAndHJhbnNmb3JtQ29kZScpO1xuICB0aGlzLmRhdGFHZW5GbnMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ2dlbkRhdGEnKTtcbiAgdGhpcy5kaXJlY3RpdmVzID0gZXh0ZW5kKGV4dGVuZCh7fSwgYmFzZURpcmVjdGl2ZXMpLCBvcHRpb25zLmRpcmVjdGl2ZXMpO1xuICB2YXIgaXNSZXNlcnZlZFRhZyA9IG9wdGlvbnMuaXNSZXNlcnZlZFRhZyB8fCBubztcbiAgdGhpcy5tYXliZUNvbXBvbmVudCA9IGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gIWlzUmVzZXJ2ZWRUYWcoZWwudGFnKTsgfTtcbiAgdGhpcy5vbmNlSWQgPSAwO1xuICB0aGlzLnN0YXRpY1JlbmRlckZucyA9IFtdO1xufTtcblxuXG5cbmZ1bmN0aW9uIGdlbmVyYXRlIChcbiAgYXN0LFxuICBvcHRpb25zXG4pIHtcbiAgdmFyIHN0YXRlID0gbmV3IENvZGVnZW5TdGF0ZShvcHRpb25zKTtcbiAgdmFyIGNvZGUgPSBhc3QgPyBnZW5FbGVtZW50KGFzdCwgc3RhdGUpIDogJ19jKFwiZGl2XCIpJztcbiAgcmV0dXJuIHtcbiAgICByZW5kZXI6IChcIndpdGgodGhpcyl7cmV0dXJuIFwiICsgY29kZSArIFwifVwiKSxcbiAgICBzdGF0aWNSZW5kZXJGbnM6IHN0YXRlLnN0YXRpY1JlbmRlckZuc1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbkVsZW1lbnQgKGVsLCBzdGF0ZSkge1xuICBpZiAoZWwuc3RhdGljUm9vdCAmJiAhZWwuc3RhdGljUHJvY2Vzc2VkKSB7XG4gICAgcmV0dXJuIGdlblN0YXRpYyhlbCwgc3RhdGUpXG4gIH0gZWxzZSBpZiAoZWwub25jZSAmJiAhZWwub25jZVByb2Nlc3NlZCkge1xuICAgIHJldHVybiBnZW5PbmNlKGVsLCBzdGF0ZSlcbiAgfSBlbHNlIGlmIChlbC5mb3IgJiYgIWVsLmZvclByb2Nlc3NlZCkge1xuICAgIHJldHVybiBnZW5Gb3IoZWwsIHN0YXRlKVxuICB9IGVsc2UgaWYgKGVsLmlmICYmICFlbC5pZlByb2Nlc3NlZCkge1xuICAgIHJldHVybiBnZW5JZihlbCwgc3RhdGUpXG4gIH0gZWxzZSBpZiAoZWwudGFnID09PSAndGVtcGxhdGUnICYmICFlbC5zbG90VGFyZ2V0KSB7XG4gICAgcmV0dXJuIGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSkgfHwgJ3ZvaWQgMCdcbiAgfSBlbHNlIGlmIChlbC50YWcgPT09ICdzbG90Jykge1xuICAgIHJldHVybiBnZW5TbG90KGVsLCBzdGF0ZSlcbiAgfSBlbHNlIHtcbiAgICAvLyBjb21wb25lbnQgb3IgZWxlbWVudFxuICAgIHZhciBjb2RlO1xuICAgIGlmIChlbC5jb21wb25lbnQpIHtcbiAgICAgIGNvZGUgPSBnZW5Db21wb25lbnQoZWwuY29tcG9uZW50LCBlbCwgc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZGF0YSA9IGVsLnBsYWluID8gdW5kZWZpbmVkIDogZ2VuRGF0YSQyKGVsLCBzdGF0ZSk7XG5cbiAgICAgIHZhciBjaGlsZHJlbiA9IGVsLmlubGluZVRlbXBsYXRlID8gbnVsbCA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSwgdHJ1ZSk7XG4gICAgICBjb2RlID0gXCJfYygnXCIgKyAoZWwudGFnKSArIFwiJ1wiICsgKGRhdGEgPyAoXCIsXCIgKyBkYXRhKSA6ICcnKSArIChjaGlsZHJlbiA/IChcIixcIiArIGNoaWxkcmVuKSA6ICcnKSArIFwiKVwiO1xuICAgIH1cbiAgICAvLyBtb2R1bGUgdHJhbnNmb3Jtc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGUudHJhbnNmb3Jtcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29kZSA9IHN0YXRlLnRyYW5zZm9ybXNbaV0oZWwsIGNvZGUpO1xuICAgIH1cbiAgICByZXR1cm4gY29kZVxuICB9XG59XG5cbi8vIGhvaXN0IHN0YXRpYyBzdWItdHJlZXMgb3V0XG5mdW5jdGlvbiBnZW5TdGF0aWMgKGVsLCBzdGF0ZSkge1xuICBlbC5zdGF0aWNQcm9jZXNzZWQgPSB0cnVlO1xuICBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMucHVzaCgoXCJ3aXRoKHRoaXMpe3JldHVybiBcIiArIChnZW5FbGVtZW50KGVsLCBzdGF0ZSkpICsgXCJ9XCIpKTtcbiAgcmV0dXJuIChcIl9tKFwiICsgKHN0YXRlLnN0YXRpY1JlbmRlckZucy5sZW5ndGggLSAxKSArIChlbC5zdGF0aWNJbkZvciA/ICcsdHJ1ZScgOiAnJykgKyBcIilcIilcbn1cblxuLy8gdi1vbmNlXG5mdW5jdGlvbiBnZW5PbmNlIChlbCwgc3RhdGUpIHtcbiAgZWwub25jZVByb2Nlc3NlZCA9IHRydWU7XG4gIGlmIChlbC5pZiAmJiAhZWwuaWZQcm9jZXNzZWQpIHtcbiAgICByZXR1cm4gZ2VuSWYoZWwsIHN0YXRlKVxuICB9IGVsc2UgaWYgKGVsLnN0YXRpY0luRm9yKSB7XG4gICAgdmFyIGtleSA9ICcnO1xuICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnQ7XG4gICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgaWYgKHBhcmVudC5mb3IpIHtcbiAgICAgICAga2V5ID0gcGFyZW50LmtleTtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgfVxuICAgIGlmICgha2V5KSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHN0YXRlLndhcm4oXG4gICAgICAgIFwidi1vbmNlIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHYtZm9yIHRoYXQgaXMga2V5ZWQuIFwiXG4gICAgICApO1xuICAgICAgcmV0dXJuIGdlbkVsZW1lbnQoZWwsIHN0YXRlKVxuICAgIH1cbiAgICByZXR1cm4gKFwiX28oXCIgKyAoZ2VuRWxlbWVudChlbCwgc3RhdGUpKSArIFwiLFwiICsgKHN0YXRlLm9uY2VJZCsrKSArIFwiLFwiICsga2V5ICsgXCIpXCIpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdlblN0YXRpYyhlbCwgc3RhdGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuSWYgKFxuICBlbCxcbiAgc3RhdGUsXG4gIGFsdEdlbixcbiAgYWx0RW1wdHlcbikge1xuICBlbC5pZlByb2Nlc3NlZCA9IHRydWU7IC8vIGF2b2lkIHJlY3Vyc2lvblxuICByZXR1cm4gZ2VuSWZDb25kaXRpb25zKGVsLmlmQ29uZGl0aW9ucy5zbGljZSgpLCBzdGF0ZSwgYWx0R2VuLCBhbHRFbXB0eSlcbn1cblxuZnVuY3Rpb24gZ2VuSWZDb25kaXRpb25zIChcbiAgY29uZGl0aW9ucyxcbiAgc3RhdGUsXG4gIGFsdEdlbixcbiAgYWx0RW1wdHlcbikge1xuICBpZiAoIWNvbmRpdGlvbnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFsdEVtcHR5IHx8ICdfZSgpJ1xuICB9XG5cbiAgdmFyIGNvbmRpdGlvbiA9IGNvbmRpdGlvbnMuc2hpZnQoKTtcbiAgaWYgKGNvbmRpdGlvbi5leHApIHtcbiAgICByZXR1cm4gKFwiKFwiICsgKGNvbmRpdGlvbi5leHApICsgXCIpP1wiICsgKGdlblRlcm5hcnlFeHAoY29uZGl0aW9uLmJsb2NrKSkgKyBcIjpcIiArIChnZW5JZkNvbmRpdGlvbnMoY29uZGl0aW9ucywgc3RhdGUsIGFsdEdlbiwgYWx0RW1wdHkpKSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKFwiXCIgKyAoZ2VuVGVybmFyeUV4cChjb25kaXRpb24uYmxvY2spKSlcbiAgfVxuXG4gIC8vIHYtaWYgd2l0aCB2LW9uY2Ugc2hvdWxkIGdlbmVyYXRlIGNvZGUgbGlrZSAoYSk/X20oMCk6X20oMSlcbiAgZnVuY3Rpb24gZ2VuVGVybmFyeUV4cCAoZWwpIHtcbiAgICByZXR1cm4gYWx0R2VuXG4gICAgICA/IGFsdEdlbihlbCwgc3RhdGUpXG4gICAgICA6IGVsLm9uY2VcbiAgICAgICAgPyBnZW5PbmNlKGVsLCBzdGF0ZSlcbiAgICAgICAgOiBnZW5FbGVtZW50KGVsLCBzdGF0ZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5Gb3IgKFxuICBlbCxcbiAgc3RhdGUsXG4gIGFsdEdlbixcbiAgYWx0SGVscGVyXG4pIHtcbiAgdmFyIGV4cCA9IGVsLmZvcjtcbiAgdmFyIGFsaWFzID0gZWwuYWxpYXM7XG4gIHZhciBpdGVyYXRvcjEgPSBlbC5pdGVyYXRvcjEgPyAoXCIsXCIgKyAoZWwuaXRlcmF0b3IxKSkgOiAnJztcbiAgdmFyIGl0ZXJhdG9yMiA9IGVsLml0ZXJhdG9yMiA/IChcIixcIiArIChlbC5pdGVyYXRvcjIpKSA6ICcnO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgc3RhdGUubWF5YmVDb21wb25lbnQoZWwpICYmXG4gICAgZWwudGFnICE9PSAnc2xvdCcgJiZcbiAgICBlbC50YWcgIT09ICd0ZW1wbGF0ZScgJiZcbiAgICAhZWwua2V5XG4gICkge1xuICAgIHN0YXRlLndhcm4oXG4gICAgICBcIjxcIiArIChlbC50YWcpICsgXCIgdi1mb3I9XFxcIlwiICsgYWxpYXMgKyBcIiBpbiBcIiArIGV4cCArIFwiXFxcIj46IGNvbXBvbmVudCBsaXN0cyByZW5kZXJlZCB3aXRoIFwiICtcbiAgICAgIFwidi1mb3Igc2hvdWxkIGhhdmUgZXhwbGljaXQga2V5cy4gXCIgK1xuICAgICAgXCJTZWUgaHR0cHM6Ly92dWVqcy5vcmcvZ3VpZGUvbGlzdC5odG1sI2tleSBmb3IgbW9yZSBpbmZvLlwiLFxuICAgICAgdHJ1ZSAvKiB0aXAgKi9cbiAgICApO1xuICB9XG5cbiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uXG4gIHJldHVybiAoYWx0SGVscGVyIHx8ICdfbCcpICsgXCIoKFwiICsgZXhwICsgXCIpLFwiICtcbiAgICBcImZ1bmN0aW9uKFwiICsgYWxpYXMgKyBpdGVyYXRvcjEgKyBpdGVyYXRvcjIgKyBcIil7XCIgK1xuICAgICAgXCJyZXR1cm4gXCIgKyAoKGFsdEdlbiB8fCBnZW5FbGVtZW50KShlbCwgc3RhdGUpKSArXG4gICAgJ30pJ1xufVxuXG5mdW5jdGlvbiBnZW5EYXRhJDIgKGVsLCBzdGF0ZSkge1xuICB2YXIgZGF0YSA9ICd7JztcblxuICAvLyBkaXJlY3RpdmVzIGZpcnN0LlxuICAvLyBkaXJlY3RpdmVzIG1heSBtdXRhdGUgdGhlIGVsJ3Mgb3RoZXIgcHJvcGVydGllcyBiZWZvcmUgdGhleSBhcmUgZ2VuZXJhdGVkLlxuICB2YXIgZGlycyA9IGdlbkRpcmVjdGl2ZXMoZWwsIHN0YXRlKTtcbiAgaWYgKGRpcnMpIHsgZGF0YSArPSBkaXJzICsgJywnOyB9XG5cbiAgLy8ga2V5XG4gIGlmIChlbC5rZXkpIHtcbiAgICBkYXRhICs9IFwia2V5OlwiICsgKGVsLmtleSkgKyBcIixcIjtcbiAgfVxuICAvLyByZWZcbiAgaWYgKGVsLnJlZikge1xuICAgIGRhdGEgKz0gXCJyZWY6XCIgKyAoZWwucmVmKSArIFwiLFwiO1xuICB9XG4gIGlmIChlbC5yZWZJbkZvcikge1xuICAgIGRhdGEgKz0gXCJyZWZJbkZvcjp0cnVlLFwiO1xuICB9XG4gIC8vIHByZVxuICBpZiAoZWwucHJlKSB7XG4gICAgZGF0YSArPSBcInByZTp0cnVlLFwiO1xuICB9XG4gIC8vIHJlY29yZCBvcmlnaW5hbCB0YWcgbmFtZSBmb3IgY29tcG9uZW50cyB1c2luZyBcImlzXCIgYXR0cmlidXRlXG4gIGlmIChlbC5jb21wb25lbnQpIHtcbiAgICBkYXRhICs9IFwidGFnOlxcXCJcIiArIChlbC50YWcpICsgXCJcXFwiLFwiO1xuICB9XG4gIC8vIG1vZHVsZSBkYXRhIGdlbmVyYXRpb24gZnVuY3Rpb25zXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGUuZGF0YUdlbkZucy5sZW5ndGg7IGkrKykge1xuICAgIGRhdGEgKz0gc3RhdGUuZGF0YUdlbkZuc1tpXShlbCk7XG4gIH1cbiAgLy8gYXR0cmlidXRlc1xuICBpZiAoZWwuYXR0cnMpIHtcbiAgICBkYXRhICs9IFwiYXR0cnM6e1wiICsgKGdlblByb3BzKGVsLmF0dHJzKSkgKyBcIn0sXCI7XG4gIH1cbiAgLy8gRE9NIHByb3BzXG4gIGlmIChlbC5wcm9wcykge1xuICAgIGRhdGEgKz0gXCJkb21Qcm9wczp7XCIgKyAoZ2VuUHJvcHMoZWwucHJvcHMpKSArIFwifSxcIjtcbiAgfVxuICAvLyBldmVudCBoYW5kbGVyc1xuICBpZiAoZWwuZXZlbnRzKSB7XG4gICAgZGF0YSArPSAoZ2VuSGFuZGxlcnMoZWwuZXZlbnRzLCBmYWxzZSwgc3RhdGUud2FybikpICsgXCIsXCI7XG4gIH1cbiAgaWYgKGVsLm5hdGl2ZUV2ZW50cykge1xuICAgIGRhdGEgKz0gKGdlbkhhbmRsZXJzKGVsLm5hdGl2ZUV2ZW50cywgdHJ1ZSwgc3RhdGUud2FybikpICsgXCIsXCI7XG4gIH1cbiAgLy8gc2xvdCB0YXJnZXRcbiAgLy8gb25seSBmb3Igbm9uLXNjb3BlZCBzbG90c1xuICBpZiAoZWwuc2xvdFRhcmdldCAmJiAhZWwuc2xvdFNjb3BlKSB7XG4gICAgZGF0YSArPSBcInNsb3Q6XCIgKyAoZWwuc2xvdFRhcmdldCkgKyBcIixcIjtcbiAgfVxuICAvLyBzY29wZWQgc2xvdHNcbiAgaWYgKGVsLnNjb3BlZFNsb3RzKSB7XG4gICAgZGF0YSArPSAoZ2VuU2NvcGVkU2xvdHMoZWwuc2NvcGVkU2xvdHMsIHN0YXRlKSkgKyBcIixcIjtcbiAgfVxuICAvLyBjb21wb25lbnQgdi1tb2RlbFxuICBpZiAoZWwubW9kZWwpIHtcbiAgICBkYXRhICs9IFwibW9kZWw6e3ZhbHVlOlwiICsgKGVsLm1vZGVsLnZhbHVlKSArIFwiLGNhbGxiYWNrOlwiICsgKGVsLm1vZGVsLmNhbGxiYWNrKSArIFwiLGV4cHJlc3Npb246XCIgKyAoZWwubW9kZWwuZXhwcmVzc2lvbikgKyBcIn0sXCI7XG4gIH1cbiAgLy8gaW5saW5lLXRlbXBsYXRlXG4gIGlmIChlbC5pbmxpbmVUZW1wbGF0ZSkge1xuICAgIHZhciBpbmxpbmVUZW1wbGF0ZSA9IGdlbklubGluZVRlbXBsYXRlKGVsLCBzdGF0ZSk7XG4gICAgaWYgKGlubGluZVRlbXBsYXRlKSB7XG4gICAgICBkYXRhICs9IGlubGluZVRlbXBsYXRlICsgXCIsXCI7XG4gICAgfVxuICB9XG4gIGRhdGEgPSBkYXRhLnJlcGxhY2UoLywkLywgJycpICsgJ30nO1xuICAvLyB2LWJpbmQgZGF0YSB3cmFwXG4gIGlmIChlbC53cmFwRGF0YSkge1xuICAgIGRhdGEgPSBlbC53cmFwRGF0YShkYXRhKTtcbiAgfVxuICAvLyB2LW9uIGRhdGEgd3JhcFxuICBpZiAoZWwud3JhcExpc3RlbmVycykge1xuICAgIGRhdGEgPSBlbC53cmFwTGlzdGVuZXJzKGRhdGEpO1xuICB9XG4gIHJldHVybiBkYXRhXG59XG5cbmZ1bmN0aW9uIGdlbkRpcmVjdGl2ZXMgKGVsLCBzdGF0ZSkge1xuICB2YXIgZGlycyA9IGVsLmRpcmVjdGl2ZXM7XG4gIGlmICghZGlycykgeyByZXR1cm4gfVxuICB2YXIgcmVzID0gJ2RpcmVjdGl2ZXM6Wyc7XG4gIHZhciBoYXNSdW50aW1lID0gZmFsc2U7XG4gIHZhciBpLCBsLCBkaXIsIG5lZWRSdW50aW1lO1xuICBmb3IgKGkgPSAwLCBsID0gZGlycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBkaXIgPSBkaXJzW2ldO1xuICAgIG5lZWRSdW50aW1lID0gdHJ1ZTtcbiAgICB2YXIgZ2VuID0gc3RhdGUuZGlyZWN0aXZlc1tkaXIubmFtZV07XG4gICAgaWYgKGdlbikge1xuICAgICAgLy8gY29tcGlsZS10aW1lIGRpcmVjdGl2ZSB0aGF0IG1hbmlwdWxhdGVzIEFTVC5cbiAgICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBpdCBhbHNvIG5lZWRzIGEgcnVudGltZSBjb3VudGVycGFydC5cbiAgICAgIG5lZWRSdW50aW1lID0gISFnZW4oZWwsIGRpciwgc3RhdGUud2Fybik7XG4gICAgfVxuICAgIGlmIChuZWVkUnVudGltZSkge1xuICAgICAgaGFzUnVudGltZSA9IHRydWU7XG4gICAgICByZXMgKz0gXCJ7bmFtZTpcXFwiXCIgKyAoZGlyLm5hbWUpICsgXCJcXFwiLHJhd05hbWU6XFxcIlwiICsgKGRpci5yYXdOYW1lKSArIFwiXFxcIlwiICsgKGRpci52YWx1ZSA/IChcIix2YWx1ZTooXCIgKyAoZGlyLnZhbHVlKSArIFwiKSxleHByZXNzaW9uOlwiICsgKEpTT04uc3RyaW5naWZ5KGRpci52YWx1ZSkpKSA6ICcnKSArIChkaXIuYXJnID8gKFwiLGFyZzpcXFwiXCIgKyAoZGlyLmFyZykgKyBcIlxcXCJcIikgOiAnJykgKyAoZGlyLm1vZGlmaWVycyA/IChcIixtb2RpZmllcnM6XCIgKyAoSlNPTi5zdHJpbmdpZnkoZGlyLm1vZGlmaWVycykpKSA6ICcnKSArIFwifSxcIjtcbiAgICB9XG4gIH1cbiAgaWYgKGhhc1J1bnRpbWUpIHtcbiAgICByZXR1cm4gcmVzLnNsaWNlKDAsIC0xKSArICddJ1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbklubGluZVRlbXBsYXRlIChlbCwgc3RhdGUpIHtcbiAgdmFyIGFzdCA9IGVsLmNoaWxkcmVuWzBdO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAoXG4gICAgZWwuY2hpbGRyZW4ubGVuZ3RoICE9PSAxIHx8IGFzdC50eXBlICE9PSAxXG4gICkpIHtcbiAgICBzdGF0ZS53YXJuKCdJbmxpbmUtdGVtcGxhdGUgY29tcG9uZW50cyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgY2hpbGQgZWxlbWVudC4nKTtcbiAgfVxuICBpZiAoYXN0LnR5cGUgPT09IDEpIHtcbiAgICB2YXIgaW5saW5lUmVuZGVyRm5zID0gZ2VuZXJhdGUoYXN0LCBzdGF0ZS5vcHRpb25zKTtcbiAgICByZXR1cm4gKFwiaW5saW5lVGVtcGxhdGU6e3JlbmRlcjpmdW5jdGlvbigpe1wiICsgKGlubGluZVJlbmRlckZucy5yZW5kZXIpICsgXCJ9LHN0YXRpY1JlbmRlckZuczpbXCIgKyAoaW5saW5lUmVuZGVyRm5zLnN0YXRpY1JlbmRlckZucy5tYXAoZnVuY3Rpb24gKGNvZGUpIHsgcmV0dXJuIChcImZ1bmN0aW9uKCl7XCIgKyBjb2RlICsgXCJ9XCIpOyB9KS5qb2luKCcsJykpICsgXCJdfVwiKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdlblNjb3BlZFNsb3RzIChcbiAgc2xvdHMsXG4gIHN0YXRlXG4pIHtcbiAgcmV0dXJuIChcInNjb3BlZFNsb3RzOl91KFtcIiArIChPYmplY3Qua2V5cyhzbG90cykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiBnZW5TY29wZWRTbG90KGtleSwgc2xvdHNba2V5XSwgc3RhdGUpXG4gICAgfSkuam9pbignLCcpKSArIFwiXSlcIilcbn1cblxuZnVuY3Rpb24gZ2VuU2NvcGVkU2xvdCAoXG4gIGtleSxcbiAgZWwsXG4gIHN0YXRlXG4pIHtcbiAgaWYgKGVsLmZvciAmJiAhZWwuZm9yUHJvY2Vzc2VkKSB7XG4gICAgcmV0dXJuIGdlbkZvclNjb3BlZFNsb3Qoa2V5LCBlbCwgc3RhdGUpXG4gIH1cbiAgdmFyIGZuID0gXCJmdW5jdGlvbihcIiArIChTdHJpbmcoZWwuc2xvdFNjb3BlKSkgKyBcIil7XCIgK1xuICAgIFwicmV0dXJuIFwiICsgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJ1xuICAgICAgPyBlbC5pZlxuICAgICAgICA/ICgoZWwuaWYpICsgXCI/XCIgKyAoZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlKSB8fCAndW5kZWZpbmVkJykgKyBcIjp1bmRlZmluZWRcIilcbiAgICAgICAgOiBnZW5DaGlsZHJlbihlbCwgc3RhdGUpIHx8ICd1bmRlZmluZWQnXG4gICAgICA6IGdlbkVsZW1lbnQoZWwsIHN0YXRlKSkgKyBcIn1cIjtcbiAgcmV0dXJuIChcIntrZXk6XCIgKyBrZXkgKyBcIixmbjpcIiArIGZuICsgXCJ9XCIpXG59XG5cbmZ1bmN0aW9uIGdlbkZvclNjb3BlZFNsb3QgKFxuICBrZXksXG4gIGVsLFxuICBzdGF0ZVxuKSB7XG4gIHZhciBleHAgPSBlbC5mb3I7XG4gIHZhciBhbGlhcyA9IGVsLmFsaWFzO1xuICB2YXIgaXRlcmF0b3IxID0gZWwuaXRlcmF0b3IxID8gKFwiLFwiICsgKGVsLml0ZXJhdG9yMSkpIDogJyc7XG4gIHZhciBpdGVyYXRvcjIgPSBlbC5pdGVyYXRvcjIgPyAoXCIsXCIgKyAoZWwuaXRlcmF0b3IyKSkgOiAnJztcbiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uXG4gIHJldHVybiBcIl9sKChcIiArIGV4cCArIFwiKSxcIiArXG4gICAgXCJmdW5jdGlvbihcIiArIGFsaWFzICsgaXRlcmF0b3IxICsgaXRlcmF0b3IyICsgXCIpe1wiICtcbiAgICAgIFwicmV0dXJuIFwiICsgKGdlblNjb3BlZFNsb3Qoa2V5LCBlbCwgc3RhdGUpKSArXG4gICAgJ30pJ1xufVxuXG5mdW5jdGlvbiBnZW5DaGlsZHJlbiAoXG4gIGVsLFxuICBzdGF0ZSxcbiAgY2hlY2tTa2lwLFxuICBhbHRHZW5FbGVtZW50LFxuICBhbHRHZW5Ob2RlXG4pIHtcbiAgdmFyIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47XG4gIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICB2YXIgZWwkMSA9IGNoaWxkcmVuWzBdO1xuICAgIC8vIG9wdGltaXplIHNpbmdsZSB2LWZvclxuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDEgJiZcbiAgICAgIGVsJDEuZm9yICYmXG4gICAgICBlbCQxLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJlxuICAgICAgZWwkMS50YWcgIT09ICdzbG90J1xuICAgICkge1xuICAgICAgcmV0dXJuIChhbHRHZW5FbGVtZW50IHx8IGdlbkVsZW1lbnQpKGVsJDEsIHN0YXRlKVxuICAgIH1cbiAgICB2YXIgbm9ybWFsaXphdGlvblR5cGUgPSBjaGVja1NraXBcbiAgICAgID8gZ2V0Tm9ybWFsaXphdGlvblR5cGUoY2hpbGRyZW4sIHN0YXRlLm1heWJlQ29tcG9uZW50KVxuICAgICAgOiAwO1xuICAgIHZhciBnZW4gPSBhbHRHZW5Ob2RlIHx8IGdlbk5vZGU7XG4gICAgcmV0dXJuIChcIltcIiArIChjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGdlbihjLCBzdGF0ZSk7IH0pLmpvaW4oJywnKSkgKyBcIl1cIiArIChub3JtYWxpemF0aW9uVHlwZSA/IChcIixcIiArIG5vcm1hbGl6YXRpb25UeXBlKSA6ICcnKSlcbiAgfVxufVxuXG4vLyBkZXRlcm1pbmUgdGhlIG5vcm1hbGl6YXRpb24gbmVlZGVkIGZvciB0aGUgY2hpbGRyZW4gYXJyYXkuXG4vLyAwOiBubyBub3JtYWxpemF0aW9uIG5lZWRlZFxuLy8gMTogc2ltcGxlIG5vcm1hbGl6YXRpb24gbmVlZGVkIChwb3NzaWJsZSAxLWxldmVsIGRlZXAgbmVzdGVkIGFycmF5KVxuLy8gMjogZnVsbCBub3JtYWxpemF0aW9uIG5lZWRlZFxuZnVuY3Rpb24gZ2V0Tm9ybWFsaXphdGlvblR5cGUgKFxuICBjaGlsZHJlbixcbiAgbWF5YmVDb21wb25lbnRcbikge1xuICB2YXIgcmVzID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbCA9IGNoaWxkcmVuW2ldO1xuICAgIGlmIChlbC50eXBlICE9PSAxKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAobmVlZHNOb3JtYWxpemF0aW9uKGVsKSB8fFxuICAgICAgICAoZWwuaWZDb25kaXRpb25zICYmIGVsLmlmQ29uZGl0aW9ucy5zb21lKGZ1bmN0aW9uIChjKSB7IHJldHVybiBuZWVkc05vcm1hbGl6YXRpb24oYy5ibG9jayk7IH0pKSkge1xuICAgICAgcmVzID0gMjtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGlmIChtYXliZUNvbXBvbmVudChlbCkgfHxcbiAgICAgICAgKGVsLmlmQ29uZGl0aW9ucyAmJiBlbC5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbiAoYykgeyByZXR1cm4gbWF5YmVDb21wb25lbnQoYy5ibG9jayk7IH0pKSkge1xuICAgICAgcmVzID0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBuZWVkc05vcm1hbGl6YXRpb24gKGVsKSB7XG4gIHJldHVybiBlbC5mb3IgIT09IHVuZGVmaW5lZCB8fCBlbC50YWcgPT09ICd0ZW1wbGF0ZScgfHwgZWwudGFnID09PSAnc2xvdCdcbn1cblxuZnVuY3Rpb24gZ2VuTm9kZSAobm9kZSwgc3RhdGUpIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gMSkge1xuICAgIHJldHVybiBnZW5FbGVtZW50KG5vZGUsIHN0YXRlKVxuICB9IGlmIChub2RlLnR5cGUgPT09IDMgJiYgbm9kZS5pc0NvbW1lbnQpIHtcbiAgICByZXR1cm4gZ2VuQ29tbWVudChub2RlKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBnZW5UZXh0KG5vZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuVGV4dCAodGV4dCkge1xuICByZXR1cm4gKFwiX3YoXCIgKyAodGV4dC50eXBlID09PSAyXG4gICAgPyB0ZXh0LmV4cHJlc3Npb24gLy8gbm8gbmVlZCBmb3IgKCkgYmVjYXVzZSBhbHJlYWR5IHdyYXBwZWQgaW4gX3MoKVxuICAgIDogdHJhbnNmb3JtU3BlY2lhbE5ld2xpbmVzKEpTT04uc3RyaW5naWZ5KHRleHQudGV4dCkpKSArIFwiKVwiKVxufVxuXG5mdW5jdGlvbiBnZW5Db21tZW50IChjb21tZW50KSB7XG4gIHJldHVybiAoXCJfZShcIiArIChKU09OLnN0cmluZ2lmeShjb21tZW50LnRleHQpKSArIFwiKVwiKVxufVxuXG5mdW5jdGlvbiBnZW5TbG90IChlbCwgc3RhdGUpIHtcbiAgdmFyIHNsb3ROYW1lID0gZWwuc2xvdE5hbWUgfHwgJ1wiZGVmYXVsdFwiJztcbiAgdmFyIGNoaWxkcmVuID0gZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlKTtcbiAgdmFyIHJlcyA9IFwiX3QoXCIgKyBzbG90TmFtZSArIChjaGlsZHJlbiA/IChcIixcIiArIGNoaWxkcmVuKSA6ICcnKTtcbiAgdmFyIGF0dHJzID0gZWwuYXR0cnMgJiYgKFwie1wiICsgKGVsLmF0dHJzLm1hcChmdW5jdGlvbiAoYSkgeyByZXR1cm4gKChjYW1lbGl6ZShhLm5hbWUpKSArIFwiOlwiICsgKGEudmFsdWUpKTsgfSkuam9pbignLCcpKSArIFwifVwiKTtcbiAgdmFyIGJpbmQkJDEgPSBlbC5hdHRyc01hcFsndi1iaW5kJ107XG4gIGlmICgoYXR0cnMgfHwgYmluZCQkMSkgJiYgIWNoaWxkcmVuKSB7XG4gICAgcmVzICs9IFwiLG51bGxcIjtcbiAgfVxuICBpZiAoYXR0cnMpIHtcbiAgICByZXMgKz0gXCIsXCIgKyBhdHRycztcbiAgfVxuICBpZiAoYmluZCQkMSkge1xuICAgIHJlcyArPSAoYXR0cnMgPyAnJyA6ICcsbnVsbCcpICsgXCIsXCIgKyBiaW5kJCQxO1xuICB9XG4gIHJldHVybiByZXMgKyAnKSdcbn1cblxuLy8gY29tcG9uZW50TmFtZSBpcyBlbC5jb21wb25lbnQsIHRha2UgaXQgYXMgYXJndW1lbnQgdG8gc2h1biBmbG93J3MgcGVzc2ltaXN0aWMgcmVmaW5lbWVudFxuZnVuY3Rpb24gZ2VuQ29tcG9uZW50IChcbiAgY29tcG9uZW50TmFtZSxcbiAgZWwsXG4gIHN0YXRlXG4pIHtcbiAgdmFyIGNoaWxkcmVuID0gZWwuaW5saW5lVGVtcGxhdGUgPyBudWxsIDogZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlLCB0cnVlKTtcbiAgcmV0dXJuIChcIl9jKFwiICsgY29tcG9uZW50TmFtZSArIFwiLFwiICsgKGdlbkRhdGEkMihlbCwgc3RhdGUpKSArIChjaGlsZHJlbiA/IChcIixcIiArIGNoaWxkcmVuKSA6ICcnKSArIFwiKVwiKVxufVxuXG5mdW5jdGlvbiBnZW5Qcm9wcyAocHJvcHMpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHByb3AgPSBwcm9wc1tpXTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICB7XG4gICAgICByZXMgKz0gXCJcXFwiXCIgKyAocHJvcC5uYW1lKSArIFwiXFxcIjpcIiArICh0cmFuc2Zvcm1TcGVjaWFsTmV3bGluZXMocHJvcC52YWx1ZSkpICsgXCIsXCI7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXMuc2xpY2UoMCwgLTEpXG59XG5cbi8vICMzODk1LCAjNDI2OFxuZnVuY3Rpb24gdHJhbnNmb3JtU3BlY2lhbE5ld2xpbmVzICh0ZXh0KSB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoL1xcdTIwMjgvZywgJ1xcXFx1MjAyOCcpXG4gICAgLnJlcGxhY2UoL1xcdTIwMjkvZywgJ1xcXFx1MjAyOScpXG59XG5cbi8qICAqL1xuXG4vLyB0aGVzZSBrZXl3b3JkcyBzaG91bGQgbm90IGFwcGVhciBpbnNpZGUgZXhwcmVzc2lvbnMsIGJ1dCBvcGVyYXRvcnMgbGlrZVxuLy8gdHlwZW9mLCBpbnN0YW5jZW9mIGFuZCBpbiBhcmUgYWxsb3dlZFxudmFyIHByb2hpYml0ZWRLZXl3b3JkUkUgPSBuZXcgUmVnRXhwKCdcXFxcYicgKyAoXG4gICdkbyxpZixmb3IsbGV0LG5ldyx0cnksdmFyLGNhc2UsZWxzZSx3aXRoLGF3YWl0LGJyZWFrLGNhdGNoLGNsYXNzLGNvbnN0LCcgK1xuICAnc3VwZXIsdGhyb3csd2hpbGUseWllbGQsZGVsZXRlLGV4cG9ydCxpbXBvcnQscmV0dXJuLHN3aXRjaCxkZWZhdWx0LCcgK1xuICAnZXh0ZW5kcyxmaW5hbGx5LGNvbnRpbnVlLGRlYnVnZ2VyLGZ1bmN0aW9uLGFyZ3VtZW50cydcbikuc3BsaXQoJywnKS5qb2luKCdcXFxcYnxcXFxcYicpICsgJ1xcXFxiJyk7XG5cbi8vIHRoZXNlIHVuYXJ5IG9wZXJhdG9ycyBzaG91bGQgbm90IGJlIHVzZWQgYXMgcHJvcGVydHkvbWV0aG9kIG5hbWVzXG52YXIgdW5hcnlPcGVyYXRvcnNSRSA9IG5ldyBSZWdFeHAoJ1xcXFxiJyArIChcbiAgJ2RlbGV0ZSx0eXBlb2Ysdm9pZCdcbikuc3BsaXQoJywnKS5qb2luKCdcXFxccypcXFxcKFteXFxcXCldKlxcXFwpfFxcXFxiJykgKyAnXFxcXHMqXFxcXChbXlxcXFwpXSpcXFxcKScpO1xuXG4vLyBzdHJpcCBzdHJpbmdzIGluIGV4cHJlc3Npb25zXG52YXIgc3RyaXBTdHJpbmdSRSA9IC8nKD86W14nXFxcXF18XFxcXC4pKid8XCIoPzpbXlwiXFxcXF18XFxcXC4pKlwifGAoPzpbXmBcXFxcXXxcXFxcLikqXFwkXFx7fFxcfSg/OlteYFxcXFxdfFxcXFwuKSpgfGAoPzpbXmBcXFxcXXxcXFxcLikqYC9nO1xuXG4vLyBkZXRlY3QgcHJvYmxlbWF0aWMgZXhwcmVzc2lvbnMgaW4gYSB0ZW1wbGF0ZVxuZnVuY3Rpb24gZGV0ZWN0RXJyb3JzIChhc3QpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICBpZiAoYXN0KSB7XG4gICAgY2hlY2tOb2RlKGFzdCwgZXJyb3JzKTtcbiAgfVxuICByZXR1cm4gZXJyb3JzXG59XG5cbmZ1bmN0aW9uIGNoZWNrTm9kZSAobm9kZSwgZXJyb3JzKSB7XG4gIGlmIChub2RlLnR5cGUgPT09IDEpIHtcbiAgICBmb3IgKHZhciBuYW1lIGluIG5vZGUuYXR0cnNNYXApIHtcbiAgICAgIGlmIChkaXJSRS50ZXN0KG5hbWUpKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuYXR0cnNNYXBbbmFtZV07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChuYW1lID09PSAndi1mb3InKSB7XG4gICAgICAgICAgICBjaGVja0Zvcihub2RlLCAoXCJ2LWZvcj1cXFwiXCIgKyB2YWx1ZSArIFwiXFxcIlwiKSwgZXJyb3JzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9uUkUudGVzdChuYW1lKSkge1xuICAgICAgICAgICAgY2hlY2tFdmVudCh2YWx1ZSwgKG5hbWUgKyBcIj1cXFwiXCIgKyB2YWx1ZSArIFwiXFxcIlwiKSwgZXJyb3JzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hlY2tFeHByZXNzaW9uKHZhbHVlLCAobmFtZSArIFwiPVxcXCJcIiArIHZhbHVlICsgXCJcXFwiXCIpLCBlcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNoZWNrTm9kZShub2RlLmNoaWxkcmVuW2ldLCBlcnJvcnMpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09IDIpIHtcbiAgICBjaGVja0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCBub2RlLnRleHQsIGVycm9ycyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tFdmVudCAoZXhwLCB0ZXh0LCBlcnJvcnMpIHtcbiAgdmFyIHN0aXBwZWQgPSBleHAucmVwbGFjZShzdHJpcFN0cmluZ1JFLCAnJyk7XG4gIHZhciBrZXl3b3JkTWF0Y2ggPSBzdGlwcGVkLm1hdGNoKHVuYXJ5T3BlcmF0b3JzUkUpO1xuICBpZiAoa2V5d29yZE1hdGNoICYmIHN0aXBwZWQuY2hhckF0KGtleXdvcmRNYXRjaC5pbmRleCAtIDEpICE9PSAnJCcpIHtcbiAgICBlcnJvcnMucHVzaChcbiAgICAgIFwiYXZvaWQgdXNpbmcgSmF2YVNjcmlwdCB1bmFyeSBvcGVyYXRvciBhcyBwcm9wZXJ0eSBuYW1lOiBcIiArXG4gICAgICBcIlxcXCJcIiArIChrZXl3b3JkTWF0Y2hbMF0pICsgXCJcXFwiIGluIGV4cHJlc3Npb24gXCIgKyAodGV4dC50cmltKCkpXG4gICAgKTtcbiAgfVxuICBjaGVja0V4cHJlc3Npb24oZXhwLCB0ZXh0LCBlcnJvcnMpO1xufVxuXG5mdW5jdGlvbiBjaGVja0ZvciAobm9kZSwgdGV4dCwgZXJyb3JzKSB7XG4gIGNoZWNrRXhwcmVzc2lvbihub2RlLmZvciB8fCAnJywgdGV4dCwgZXJyb3JzKTtcbiAgY2hlY2tJZGVudGlmaWVyKG5vZGUuYWxpYXMsICd2LWZvciBhbGlhcycsIHRleHQsIGVycm9ycyk7XG4gIGNoZWNrSWRlbnRpZmllcihub2RlLml0ZXJhdG9yMSwgJ3YtZm9yIGl0ZXJhdG9yJywgdGV4dCwgZXJyb3JzKTtcbiAgY2hlY2tJZGVudGlmaWVyKG5vZGUuaXRlcmF0b3IyLCAndi1mb3IgaXRlcmF0b3InLCB0ZXh0LCBlcnJvcnMpO1xufVxuXG5mdW5jdGlvbiBjaGVja0lkZW50aWZpZXIgKFxuICBpZGVudCxcbiAgdHlwZSxcbiAgdGV4dCxcbiAgZXJyb3JzXG4pIHtcbiAgaWYgKHR5cGVvZiBpZGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICB0cnkge1xuICAgICAgbmV3IEZ1bmN0aW9uKChcInZhciBcIiArIGlkZW50ICsgXCI9X1wiKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JzLnB1c2goKFwiaW52YWxpZCBcIiArIHR5cGUgKyBcIiBcXFwiXCIgKyBpZGVudCArIFwiXFxcIiBpbiBleHByZXNzaW9uOiBcIiArICh0ZXh0LnRyaW0oKSkpKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tFeHByZXNzaW9uIChleHAsIHRleHQsIGVycm9ycykge1xuICB0cnkge1xuICAgIG5ldyBGdW5jdGlvbigoXCJyZXR1cm4gXCIgKyBleHApKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciBrZXl3b3JkTWF0Y2ggPSBleHAucmVwbGFjZShzdHJpcFN0cmluZ1JFLCAnJykubWF0Y2gocHJvaGliaXRlZEtleXdvcmRSRSk7XG4gICAgaWYgKGtleXdvcmRNYXRjaCkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIFwiYXZvaWQgdXNpbmcgSmF2YVNjcmlwdCBrZXl3b3JkIGFzIHByb3BlcnR5IG5hbWU6IFwiICtcbiAgICAgICAgXCJcXFwiXCIgKyAoa2V5d29yZE1hdGNoWzBdKSArIFwiXFxcIlxcbiAgUmF3IGV4cHJlc3Npb246IFwiICsgKHRleHQudHJpbSgpKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIFwiaW52YWxpZCBleHByZXNzaW9uOiBcIiArIChlLm1lc3NhZ2UpICsgXCIgaW5cXG5cXG5cIiArXG4gICAgICAgIFwiICAgIFwiICsgZXhwICsgXCJcXG5cXG5cIiArXG4gICAgICAgIFwiICBSYXcgZXhwcmVzc2lvbjogXCIgKyAodGV4dC50cmltKCkpICsgXCJcXG5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uIChjb2RlLCBlcnJvcnMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKGNvZGUpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVycm9ycy5wdXNoKHsgZXJyOiBlcnIsIGNvZGU6IGNvZGUgfSk7XG4gICAgcmV0dXJuIG5vb3BcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuIChjb21waWxlKSB7XG4gIHZhciBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXBpbGVUb0Z1bmN0aW9ucyAoXG4gICAgdGVtcGxhdGUsXG4gICAgb3B0aW9ucyxcbiAgICB2bVxuICApIHtcbiAgICBvcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKTtcbiAgICB2YXIgd2FybiQkMSA9IG9wdGlvbnMud2FybiB8fCB3YXJuO1xuICAgIGRlbGV0ZSBvcHRpb25zLndhcm47XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgLy8gZGV0ZWN0IHBvc3NpYmxlIENTUCByZXN0cmljdGlvblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gMScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZS50b1N0cmluZygpLm1hdGNoKC91bnNhZmUtZXZhbHxDU1AvKSkge1xuICAgICAgICAgIHdhcm4kJDEoXG4gICAgICAgICAgICAnSXQgc2VlbXMgeW91IGFyZSB1c2luZyB0aGUgc3RhbmRhbG9uZSBidWlsZCBvZiBWdWUuanMgaW4gYW4gJyArXG4gICAgICAgICAgICAnZW52aXJvbm1lbnQgd2l0aCBDb250ZW50IFNlY3VyaXR5IFBvbGljeSB0aGF0IHByb2hpYml0cyB1bnNhZmUtZXZhbC4gJyArXG4gICAgICAgICAgICAnVGhlIHRlbXBsYXRlIGNvbXBpbGVyIGNhbm5vdCB3b3JrIGluIHRoaXMgZW52aXJvbm1lbnQuIENvbnNpZGVyICcgK1xuICAgICAgICAgICAgJ3JlbGF4aW5nIHRoZSBwb2xpY3kgdG8gYWxsb3cgdW5zYWZlLWV2YWwgb3IgcHJlLWNvbXBpbGluZyB5b3VyICcgK1xuICAgICAgICAgICAgJ3RlbXBsYXRlcyBpbnRvIHJlbmRlciBmdW5jdGlvbnMuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjaGVjayBjYWNoZVxuICAgIHZhciBrZXkgPSBvcHRpb25zLmRlbGltaXRlcnNcbiAgICAgID8gU3RyaW5nKG9wdGlvbnMuZGVsaW1pdGVycykgKyB0ZW1wbGF0ZVxuICAgICAgOiB0ZW1wbGF0ZTtcbiAgICBpZiAoY2FjaGVba2V5XSkge1xuICAgICAgcmV0dXJuIGNhY2hlW2tleV1cbiAgICB9XG5cbiAgICAvLyBjb21waWxlXG4gICAgdmFyIGNvbXBpbGVkID0gY29tcGlsZSh0ZW1wbGF0ZSwgb3B0aW9ucyk7XG5cbiAgICAvLyBjaGVjayBjb21waWxhdGlvbiBlcnJvcnMvdGlwc1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoY29tcGlsZWQuZXJyb3JzICYmIGNvbXBpbGVkLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgd2FybiQkMShcbiAgICAgICAgICBcIkVycm9yIGNvbXBpbGluZyB0ZW1wbGF0ZTpcXG5cXG5cIiArIHRlbXBsYXRlICsgXCJcXG5cXG5cIiArXG4gICAgICAgICAgY29tcGlsZWQuZXJyb3JzLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gKFwiLSBcIiArIGUpOyB9KS5qb2luKCdcXG4nKSArICdcXG4nLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoY29tcGlsZWQudGlwcyAmJiBjb21waWxlZC50aXBzLmxlbmd0aCkge1xuICAgICAgICBjb21waWxlZC50aXBzLmZvckVhY2goZnVuY3Rpb24gKG1zZykgeyByZXR1cm4gdGlwKG1zZywgdm0pOyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0dXJuIGNvZGUgaW50byBmdW5jdGlvbnNcbiAgICB2YXIgcmVzID0ge307XG4gICAgdmFyIGZuR2VuRXJyb3JzID0gW107XG4gICAgcmVzLnJlbmRlciA9IGNyZWF0ZUZ1bmN0aW9uKGNvbXBpbGVkLnJlbmRlciwgZm5HZW5FcnJvcnMpO1xuICAgIHJlcy5zdGF0aWNSZW5kZXJGbnMgPSBjb21waWxlZC5zdGF0aWNSZW5kZXJGbnMubWFwKGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb24oY29kZSwgZm5HZW5FcnJvcnMpXG4gICAgfSk7XG5cbiAgICAvLyBjaGVjayBmdW5jdGlvbiBnZW5lcmF0aW9uIGVycm9ycy5cbiAgICAvLyB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgY29tcGlsZXIgaXRzZWxmLlxuICAgIC8vIG1vc3RseSBmb3IgY29kZWdlbiBkZXZlbG9wbWVudCB1c2VcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKCghY29tcGlsZWQuZXJyb3JzIHx8ICFjb21waWxlZC5lcnJvcnMubGVuZ3RoKSAmJiBmbkdlbkVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgd2FybiQkMShcbiAgICAgICAgICBcIkZhaWxlZCB0byBnZW5lcmF0ZSByZW5kZXIgZnVuY3Rpb246XFxuXFxuXCIgK1xuICAgICAgICAgIGZuR2VuRXJyb3JzLm1hcChmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gcmVmLmVycjtcbiAgICAgICAgICAgIHZhciBjb2RlID0gcmVmLmNvZGU7XG5cbiAgICAgICAgICAgIHJldHVybiAoKGVyci50b1N0cmluZygpKSArIFwiIGluXFxuXFxuXCIgKyBjb2RlICsgXCJcXG5cIik7XG4gICAgICAgIH0pLmpvaW4oJ1xcbicpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChjYWNoZVtrZXldID0gcmVzKVxuICB9XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBjcmVhdGVDb21waWxlckNyZWF0b3IgKGJhc2VDb21waWxlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVDb21waWxlciAoYmFzZU9wdGlvbnMpIHtcbiAgICBmdW5jdGlvbiBjb21waWxlIChcbiAgICAgIHRlbXBsYXRlLFxuICAgICAgb3B0aW9uc1xuICAgICkge1xuICAgICAgdmFyIGZpbmFsT3B0aW9ucyA9IE9iamVjdC5jcmVhdGUoYmFzZU9wdGlvbnMpO1xuICAgICAgdmFyIGVycm9ycyA9IFtdO1xuICAgICAgdmFyIHRpcHMgPSBbXTtcbiAgICAgIGZpbmFsT3B0aW9ucy53YXJuID0gZnVuY3Rpb24gKG1zZywgdGlwKSB7XG4gICAgICAgICh0aXAgPyB0aXBzIDogZXJyb3JzKS5wdXNoKG1zZyk7XG4gICAgICB9O1xuXG4gICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAvLyBtZXJnZSBjdXN0b20gbW9kdWxlc1xuICAgICAgICBpZiAob3B0aW9ucy5tb2R1bGVzKSB7XG4gICAgICAgICAgZmluYWxPcHRpb25zLm1vZHVsZXMgPVxuICAgICAgICAgICAgKGJhc2VPcHRpb25zLm1vZHVsZXMgfHwgW10pLmNvbmNhdChvcHRpb25zLm1vZHVsZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG1lcmdlIGN1c3RvbSBkaXJlY3RpdmVzXG4gICAgICAgIGlmIChvcHRpb25zLmRpcmVjdGl2ZXMpIHtcbiAgICAgICAgICBmaW5hbE9wdGlvbnMuZGlyZWN0aXZlcyA9IGV4dGVuZChcbiAgICAgICAgICAgIE9iamVjdC5jcmVhdGUoYmFzZU9wdGlvbnMuZGlyZWN0aXZlcyB8fCBudWxsKSxcbiAgICAgICAgICAgIG9wdGlvbnMuZGlyZWN0aXZlc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29weSBvdGhlciBvcHRpb25zXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKGtleSAhPT0gJ21vZHVsZXMnICYmIGtleSAhPT0gJ2RpcmVjdGl2ZXMnKSB7XG4gICAgICAgICAgICBmaW5hbE9wdGlvbnNba2V5XSA9IG9wdGlvbnNba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBpbGVkID0gYmFzZUNvbXBpbGUodGVtcGxhdGUsIGZpbmFsT3B0aW9ucyk7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBlcnJvcnMucHVzaC5hcHBseShlcnJvcnMsIGRldGVjdEVycm9ycyhjb21waWxlZC5hc3QpKTtcbiAgICAgIH1cbiAgICAgIGNvbXBpbGVkLmVycm9ycyA9IGVycm9ycztcbiAgICAgIGNvbXBpbGVkLnRpcHMgPSB0aXBzO1xuICAgICAgcmV0dXJuIGNvbXBpbGVkXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBpbGU6IGNvbXBpbGUsXG4gICAgICBjb21waWxlVG9GdW5jdGlvbnM6IGNyZWF0ZUNvbXBpbGVUb0Z1bmN0aW9uRm4oY29tcGlsZSlcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbi8vIGBjcmVhdGVDb21waWxlckNyZWF0b3JgIGFsbG93cyBjcmVhdGluZyBjb21waWxlcnMgdGhhdCB1c2UgYWx0ZXJuYXRpdmVcbi8vIHBhcnNlci9vcHRpbWl6ZXIvY29kZWdlbiwgZS5nIHRoZSBTU1Igb3B0aW1pemluZyBjb21waWxlci5cbi8vIEhlcmUgd2UganVzdCBleHBvcnQgYSBkZWZhdWx0IGNvbXBpbGVyIHVzaW5nIHRoZSBkZWZhdWx0IHBhcnRzLlxudmFyIGNyZWF0ZUNvbXBpbGVyID0gY3JlYXRlQ29tcGlsZXJDcmVhdG9yKGZ1bmN0aW9uIGJhc2VDb21waWxlIChcbiAgdGVtcGxhdGUsXG4gIG9wdGlvbnNcbikge1xuICB2YXIgYXN0ID0gcGFyc2UodGVtcGxhdGUudHJpbSgpLCBvcHRpb25zKTtcbiAgaWYgKG9wdGlvbnMub3B0aW1pemUgIT09IGZhbHNlKSB7XG4gICAgb3B0aW1pemUoYXN0LCBvcHRpb25zKTtcbiAgfVxuICB2YXIgY29kZSA9IGdlbmVyYXRlKGFzdCwgb3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgYXN0OiBhc3QsXG4gICAgcmVuZGVyOiBjb2RlLnJlbmRlcixcbiAgICBzdGF0aWNSZW5kZXJGbnM6IGNvZGUuc3RhdGljUmVuZGVyRm5zXG4gIH1cbn0pO1xuXG4vKiAgKi9cblxudmFyIHJlZiQxID0gY3JlYXRlQ29tcGlsZXIoYmFzZU9wdGlvbnMpO1xudmFyIGNvbXBpbGVUb0Z1bmN0aW9ucyA9IHJlZiQxLmNvbXBpbGVUb0Z1bmN0aW9ucztcblxuLyogICovXG5cbi8vIGNoZWNrIHdoZXRoZXIgY3VycmVudCBicm93c2VyIGVuY29kZXMgYSBjaGFyIGluc2lkZSBhdHRyaWJ1dGUgdmFsdWVzXG52YXIgZGl2O1xuZnVuY3Rpb24gZ2V0U2hvdWxkRGVjb2RlIChocmVmKSB7XG4gIGRpdiA9IGRpdiB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZGl2LmlubmVySFRNTCA9IGhyZWYgPyBcIjxhIGhyZWY9XFxcIlxcblxcXCIvPlwiIDogXCI8ZGl2IGE9XFxcIlxcblxcXCIvPlwiO1xuICByZXR1cm4gZGl2LmlubmVySFRNTC5pbmRleE9mKCcmIzEwOycpID4gMFxufVxuXG4vLyAjMzY2MzogSUUgZW5jb2RlcyBuZXdsaW5lcyBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcyB3aGlsZSBvdGhlciBicm93c2VycyBkb24ndFxudmFyIHNob3VsZERlY29kZU5ld2xpbmVzID0gaW5Ccm93c2VyID8gZ2V0U2hvdWxkRGVjb2RlKGZhbHNlKSA6IGZhbHNlO1xuLy8gIzY4Mjg6IGNocm9tZSBlbmNvZGVzIGNvbnRlbnQgaW4gYVtocmVmXVxudmFyIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiA9IGluQnJvd3NlciA/IGdldFNob3VsZERlY29kZSh0cnVlKSA6IGZhbHNlO1xuXG4vKiAgKi9cblxudmFyIGlkVG9UZW1wbGF0ZSA9IGNhY2hlZChmdW5jdGlvbiAoaWQpIHtcbiAgdmFyIGVsID0gcXVlcnkoaWQpO1xuICByZXR1cm4gZWwgJiYgZWwuaW5uZXJIVE1MXG59KTtcblxudmFyIG1vdW50ID0gVnVlLnByb3RvdHlwZS4kbW91bnQ7XG5WdWUucHJvdG90eXBlLiRtb3VudCA9IGZ1bmN0aW9uIChcbiAgZWwsXG4gIGh5ZHJhdGluZ1xuKSB7XG4gIGVsID0gZWwgJiYgcXVlcnkoZWwpO1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoZWwgPT09IGRvY3VtZW50LmJvZHkgfHwgZWwgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgIFwiRG8gbm90IG1vdW50IFZ1ZSB0byA8aHRtbD4gb3IgPGJvZHk+IC0gbW91bnQgdG8gbm9ybWFsIGVsZW1lbnRzIGluc3RlYWQuXCJcbiAgICApO1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7XG4gIC8vIHJlc29sdmUgdGVtcGxhdGUvZWwgYW5kIGNvbnZlcnQgdG8gcmVuZGVyIGZ1bmN0aW9uXG4gIGlmICghb3B0aW9ucy5yZW5kZXIpIHtcbiAgICB2YXIgdGVtcGxhdGUgPSBvcHRpb25zLnRlbXBsYXRlO1xuICAgIGlmICh0ZW1wbGF0ZSkge1xuICAgICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHRlbXBsYXRlLmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICAgICAgdGVtcGxhdGUgPSBpZFRvVGVtcGxhdGUodGVtcGxhdGUpO1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICF0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgKFwiVGVtcGxhdGUgZWxlbWVudCBub3QgZm91bmQgb3IgaXMgZW1wdHk6IFwiICsgKG9wdGlvbnMudGVtcGxhdGUpKSxcbiAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGVtcGxhdGUubm9kZVR5cGUpIHtcbiAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5pbm5lckhUTUw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHdhcm4oJ2ludmFsaWQgdGVtcGxhdGUgb3B0aW9uOicgKyB0ZW1wbGF0ZSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVsKSB7XG4gICAgICB0ZW1wbGF0ZSA9IGdldE91dGVySFRNTChlbCk7XG4gICAgfVxuICAgIGlmICh0ZW1wbGF0ZSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykge1xuICAgICAgICBtYXJrKCdjb21waWxlJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWYgPSBjb21waWxlVG9GdW5jdGlvbnModGVtcGxhdGUsIHtcbiAgICAgICAgc2hvdWxkRGVjb2RlTmV3bGluZXM6IHNob3VsZERlY29kZU5ld2xpbmVzLFxuICAgICAgICBzaG91bGREZWNvZGVOZXdsaW5lc0ZvckhyZWY6IHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZixcbiAgICAgICAgZGVsaW1pdGVyczogb3B0aW9ucy5kZWxpbWl0ZXJzLFxuICAgICAgICBjb21tZW50czogb3B0aW9ucy5jb21tZW50c1xuICAgICAgfSwgdGhpcyk7XG4gICAgICB2YXIgcmVuZGVyID0gcmVmLnJlbmRlcjtcbiAgICAgIHZhciBzdGF0aWNSZW5kZXJGbnMgPSByZWYuc3RhdGljUmVuZGVyRm5zO1xuICAgICAgb3B0aW9ucy5yZW5kZXIgPSByZW5kZXI7XG4gICAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IHN0YXRpY1JlbmRlckZucztcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykge1xuICAgICAgICBtYXJrKCdjb21waWxlIGVuZCcpO1xuICAgICAgICBtZWFzdXJlKChcInZ1ZSBcIiArICh0aGlzLl9uYW1lKSArIFwiIGNvbXBpbGVcIiksICdjb21waWxlJywgJ2NvbXBpbGUgZW5kJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtb3VudC5jYWxsKHRoaXMsIGVsLCBoeWRyYXRpbmcpXG59O1xuXG4vKipcbiAqIEdldCBvdXRlckhUTUwgb2YgZWxlbWVudHMsIHRha2luZyBjYXJlXG4gKiBvZiBTVkcgZWxlbWVudHMgaW4gSUUgYXMgd2VsbC5cbiAqL1xuZnVuY3Rpb24gZ2V0T3V0ZXJIVE1MIChlbCkge1xuICBpZiAoZWwub3V0ZXJIVE1MKSB7XG4gICAgcmV0dXJuIGVsLm91dGVySFRNTFxuICB9IGVsc2Uge1xuICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWwuY2xvbmVOb2RlKHRydWUpKTtcbiAgICByZXR1cm4gY29udGFpbmVyLmlubmVySFRNTFxuICB9XG59XG5cblZ1ZS5jb21waWxlID0gY29tcGlsZVRvRnVuY3Rpb25zO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZ1ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3Z1ZS9kaXN0L3Z1ZS5jb21tb24uanNcbi8vIG1vZHVsZSBpZCA9IDE2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///16\n");
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== \"undefined\" && global) ||\n (typeof self !== \"undefined\" && self) ||\n window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n if (timeout) {\n timeout.close();\n }\n};\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// setimmediate attaches itself to the global object\n__webpack_require__(18);\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto. Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n (typeof global !== \"undefined\" && global.setImmediate) ||\n (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n (typeof global !== \"undefined\" && global.clearImmediate) ||\n (this && this.clearImmediate);\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcz9kN2FkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxNy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBzY29wZSA9ICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbCkgfHxcbiAgICAgICAgICAgICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmKSB8fFxuICAgICAgICAgICAgd2luZG93O1xudmFyIGFwcGx5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O1xuXG4vLyBET00gQVBJcywgZm9yIGNvbXBsZXRlbmVzc1xuXG5leHBvcnRzLnNldFRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0VGltZW91dCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFyVGltZW91dCk7XG59O1xuZXhwb3J0cy5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRJbnRlcnZhbCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFySW50ZXJ2YWwpO1xufTtcbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID1cbmV4cG9ydHMuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHtcbiAgaWYgKHRpbWVvdXQpIHtcbiAgICB0aW1lb3V0LmNsb3NlKCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFRpbWVvdXQoaWQsIGNsZWFyRm4pIHtcbiAgdGhpcy5faWQgPSBpZDtcbiAgdGhpcy5fY2xlYXJGbiA9IGNsZWFyRm47XG59XG5UaW1lb3V0LnByb3RvdHlwZS51bnJlZiA9IFRpbWVvdXQucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge307XG5UaW1lb3V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jbGVhckZuLmNhbGwoc2NvcGUsIHRoaXMuX2lkKTtcbn07XG5cbi8vIERvZXMgbm90IHN0YXJ0IHRoZSB0aW1lLCBqdXN0IHNldHMgdXAgdGhlIG1lbWJlcnMgbmVlZGVkLlxuZXhwb3J0cy5lbnJvbGwgPSBmdW5jdGlvbihpdGVtLCBtc2Vjcykge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gbXNlY3M7XG59O1xuXG5leHBvcnRzLnVuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gLTE7XG59O1xuXG5leHBvcnRzLl91bnJlZkFjdGl2ZSA9IGV4cG9ydHMuYWN0aXZlID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG5cbiAgdmFyIG1zZWNzID0gaXRlbS5faWRsZVRpbWVvdXQ7XG4gIGlmIChtc2VjcyA+PSAwKSB7XG4gICAgaXRlbS5faWRsZVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gb25UaW1lb3V0KCkge1xuICAgICAgaWYgKGl0ZW0uX29uVGltZW91dClcbiAgICAgICAgaXRlbS5fb25UaW1lb3V0KCk7XG4gICAgfSwgbXNlY3MpO1xuICB9XG59O1xuXG4vLyBzZXRpbW1lZGlhdGUgYXR0YWNoZXMgaXRzZWxmIHRvIHRoZSBnbG9iYWwgb2JqZWN0XG5yZXF1aXJlKFwic2V0aW1tZWRpYXRlXCIpO1xuLy8gT24gc29tZSBleG90aWMgZW52aXJvbm1lbnRzLCBpdCdzIG5vdCBjbGVhciB3aGljaCBvYmplY3QgYHNldGltbWVkaWF0ZWAgd2FzXG4vLyBhYmxlIHRvIGluc3RhbGwgb250by4gIFNlYXJjaCBlYWNoIHBvc3NpYmlsaXR5IGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZVxuLy8gYHNldGltbWVkaWF0ZWAgbGlicmFyeS5cbmV4cG9ydHMuc2V0SW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLnNldEltbWVkaWF0ZSk7XG5leHBvcnRzLmNsZWFySW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuY2xlYXJJbW1lZGlhdGUpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qc1xuLy8gbW9kdWxlIGlkID0gMTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///17\n");
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {\n \"use strict\";\n\n if (global.setImmediate) {\n return;\n }\n\n var nextHandle = 1; // Spec says greater than zero\n var tasksByHandle = {};\n var currentlyRunningATask = false;\n var doc = global.document;\n var registerImmediate;\n\n function setImmediate(callback) {\n // Callback can either be a function or a string\n if (typeof callback !== \"function\") {\n callback = new Function(\"\" + callback);\n }\n // Copy function arguments\n var args = new Array(arguments.length - 1);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i + 1];\n }\n // Store and register the task\n var task = { callback: callback, args: args };\n tasksByHandle[nextHandle] = task;\n registerImmediate(nextHandle);\n return nextHandle++;\n }\n\n function clearImmediate(handle) {\n delete tasksByHandle[handle];\n }\n\n function run(task) {\n var callback = task.callback;\n var args = task.args;\n switch (args.length) {\n case 0:\n callback();\n break;\n case 1:\n callback(args[0]);\n break;\n case 2:\n callback(args[0], args[1]);\n break;\n case 3:\n callback(args[0], args[1], args[2]);\n break;\n default:\n callback.apply(undefined, args);\n break;\n }\n }\n\n function runIfPresent(handle) {\n // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n // So if we're currently running a task, we'll need to delay this invocation.\n if (currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // \"too much recursion\" error.\n setTimeout(runIfPresent, 0, handle);\n } else {\n var task = tasksByHandle[handle];\n if (task) {\n currentlyRunningATask = true;\n try {\n run(task);\n } finally {\n clearImmediate(handle);\n currentlyRunningATask = false;\n }\n }\n }\n }\n\n function installNextTickImplementation() {\n registerImmediate = function(handle) {\n process.nextTick(function () { runIfPresent(handle); });\n };\n }\n\n function canUsePostMessage() {\n // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n // where `global.postMessage` means something completely different and can't be used for this purpose.\n if (global.postMessage && !global.importScripts) {\n var postMessageIsAsynchronous = true;\n var oldOnMessage = global.onmessage;\n global.onmessage = function() {\n postMessageIsAsynchronous = false;\n };\n global.postMessage(\"\", \"*\");\n global.onmessage = oldOnMessage;\n return postMessageIsAsynchronous;\n }\n }\n\n function installPostMessageImplementation() {\n // Installs an event handler on `global` for the `message` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n var onGlobalMessage = function(event) {\n if (event.source === global &&\n typeof event.data === \"string\" &&\n event.data.indexOf(messagePrefix) === 0) {\n runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n\n if (global.addEventListener) {\n global.addEventListener(\"message\", onGlobalMessage, false);\n } else {\n global.attachEvent(\"onmessage\", onGlobalMessage);\n }\n\n registerImmediate = function(handle) {\n global.postMessage(messagePrefix + handle, \"*\");\n };\n }\n\n function installMessageChannelImplementation() {\n var channel = new MessageChannel();\n channel.port1.onmessage = function(event) {\n var handle = event.data;\n runIfPresent(handle);\n };\n\n registerImmediate = function(handle) {\n channel.port2.postMessage(handle);\n };\n }\n\n function installReadyStateChangeImplementation() {\n var html = doc.documentElement;\n registerImmediate = function(handle) {\n // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var script = doc.createElement(\"script\");\n script.onreadystatechange = function () {\n runIfPresent(handle);\n script.onreadystatechange = null;\n html.removeChild(script);\n script = null;\n };\n html.appendChild(script);\n };\n }\n\n function installSetTimeoutImplementation() {\n registerImmediate = function(handle) {\n setTimeout(runIfPresent, 0, handle);\n };\n }\n\n // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n // Don't get fooled by e.g. browserify environments.\n if ({}.toString.call(global.process) === \"[object process]\") {\n // For Node.js before 0.9\n installNextTickImplementation();\n\n } else if (canUsePostMessage()) {\n // For non-IE10 modern browsers\n installPostMessageImplementation();\n\n } else if (global.MessageChannel) {\n // For web workers, where supported\n installMessageChannelImplementation();\n\n } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n // For IE 6–8\n installReadyStateChangeImplementation();\n\n } else {\n // For older browsers\n installSetTimeoutImplementation();\n }\n\n attachTo.setImmediate = setImmediate;\n attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(7)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qcz85YjJhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQyxzQkFBc0IsRUFBRTtBQUNsRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQyIsImZpbGUiOiIxOC5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiAoZ2xvYmFsLCB1bmRlZmluZWQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGlmIChnbG9iYWwuc2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEhhbmRsZSA9IDE7IC8vIFNwZWMgc2F5cyBncmVhdGVyIHRoYW4gemVyb1xuICAgIHZhciB0YXNrc0J5SGFuZGxlID0ge307XG4gICAgdmFyIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgIHZhciBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG4gICAgdmFyIHJlZ2lzdGVySW1tZWRpYXRlO1xuXG4gICAgZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGNhbGxiYWNrKSB7XG4gICAgICAvLyBDYWxsYmFjayBjYW4gZWl0aGVyIGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYWxsYmFjayA9IG5ldyBGdW5jdGlvbihcIlwiICsgY2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgLy8gQ29weSBmdW5jdGlvbiBhcmd1bWVudHNcbiAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDFdO1xuICAgICAgfVxuICAgICAgLy8gU3RvcmUgYW5kIHJlZ2lzdGVyIHRoZSB0YXNrXG4gICAgICB2YXIgdGFzayA9IHsgY2FsbGJhY2s6IGNhbGxiYWNrLCBhcmdzOiBhcmdzIH07XG4gICAgICB0YXNrc0J5SGFuZGxlW25leHRIYW5kbGVdID0gdGFzaztcbiAgICAgIHJlZ2lzdGVySW1tZWRpYXRlKG5leHRIYW5kbGUpO1xuICAgICAgcmV0dXJuIG5leHRIYW5kbGUrKztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShoYW5kbGUpIHtcbiAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW4odGFzaykge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB0YXNrLmNhbGxiYWNrO1xuICAgICAgICB2YXIgYXJncyA9IHRhc2suYXJncztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5JZlByZXNlbnQoaGFuZGxlKSB7XG4gICAgICAgIC8vIEZyb20gdGhlIHNwZWM6IFwiV2FpdCB1bnRpbCBhbnkgaW52b2NhdGlvbnMgb2YgdGhpcyBhbGdvcml0aG0gc3RhcnRlZCBiZWZvcmUgdGhpcyBvbmUgaGF2ZSBjb21wbGV0ZWQuXCJcbiAgICAgICAgLy8gU28gaWYgd2UncmUgY3VycmVudGx5IHJ1bm5pbmcgYSB0YXNrLCB3ZSdsbCBuZWVkIHRvIGRlbGF5IHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgaWYgKGN1cnJlbnRseVJ1bm5pbmdBVGFzaykge1xuICAgICAgICAgICAgLy8gRGVsYXkgYnkgZG9pbmcgYSBzZXRUaW1lb3V0LiBzZXRJbW1lZGlhdGUgd2FzIHRyaWVkIGluc3RlYWQsIGJ1dCBpbiBGaXJlZm94IDcgaXQgZ2VuZXJhdGVkIGFcbiAgICAgICAgICAgIC8vIFwidG9vIG11Y2ggcmVjdXJzaW9uXCIgZXJyb3IuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bih0YXNrKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckltbWVkaWF0ZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBydW5JZlByZXNlbnQoaGFuZGxlKTsgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuVXNlUG9zdE1lc3NhZ2UoKSB7XG4gICAgICAgIC8vIFRoZSB0ZXN0IGFnYWluc3QgYGltcG9ydFNjcmlwdHNgIHByZXZlbnRzIHRoaXMgaW1wbGVtZW50YXRpb24gZnJvbSBiZWluZyBpbnN0YWxsZWQgaW5zaWRlIGEgd2ViIHdvcmtlcixcbiAgICAgICAgLy8gd2hlcmUgYGdsb2JhbC5wb3N0TWVzc2FnZWAgbWVhbnMgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFuZCBjYW4ndCBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuXG4gICAgICAgIGlmIChnbG9iYWwucG9zdE1lc3NhZ2UgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgb2xkT25NZXNzYWdlID0gZ2xvYmFsLm9ubWVzc2FnZTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKFwiXCIsIFwiKlwiKTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBvbGRPbk1lc3NhZ2U7XG4gICAgICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICAvLyBJbnN0YWxscyBhbiBldmVudCBoYW5kbGVyIG9uIGBnbG9iYWxgIGZvciB0aGUgYG1lc3NhZ2VgIGV2ZW50OiBzZWVcbiAgICAgICAgLy8gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vd2luZG93LnBvc3RNZXNzYWdlXG4gICAgICAgIC8vICogaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvY29tbXMuaHRtbCNjcm9zc0RvY3VtZW50TWVzc2FnZXNcblxuICAgICAgICB2YXIgbWVzc2FnZVByZWZpeCA9IFwic2V0SW1tZWRpYXRlJFwiICsgTWF0aC5yYW5kb20oKSArIFwiJFwiO1xuICAgICAgICB2YXIgb25HbG9iYWxNZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5pbmRleE9mKG1lc3NhZ2VQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KCtldmVudC5kYXRhLnNsaWNlKG1lc3NhZ2VQcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWwuYXR0YWNoRXZlbnQoXCJvbm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZVByZWZpeCArIGhhbmRsZSwgXCIqXCIpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGh0bWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgICAgICAgICAvLyBpbnRvIHRoZSBkb2N1bWVudC4gRG8gc28sIHRodXMgcXVldWluZyB1cCB0aGUgdGFzay4gUmVtZW1iZXIgdG8gY2xlYW4gdXAgb25jZSBpdCdzIGJlZW4gY2FsbGVkLlxuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICAgICAgc2NyaXB0ID0gbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBodG1sLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIHN1cHBvcnRlZCwgd2Ugc2hvdWxkIGF0dGFjaCB0byB0aGUgcHJvdG90eXBlIG9mIGdsb2JhbCwgc2luY2UgdGhhdCBpcyB3aGVyZSBzZXRUaW1lb3V0IGV0IGFsLiBsaXZlLlxuICAgIHZhciBhdHRhY2hUbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsKTtcbiAgICBhdHRhY2hUbyA9IGF0dGFjaFRvICYmIGF0dGFjaFRvLnNldFRpbWVvdXQgPyBhdHRhY2hUbyA6IGdsb2JhbDtcblxuICAgIC8vIERvbid0IGdldCBmb29sZWQgYnkgZS5nLiBicm93c2VyaWZ5IGVudmlyb25tZW50cy5cbiAgICBpZiAoe30udG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiKSB7XG4gICAgICAgIC8vIEZvciBOb2RlLmpzIGJlZm9yZSAwLjlcbiAgICAgICAgaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoY2FuVXNlUG9zdE1lc3NhZ2UoKSkge1xuICAgICAgICAvLyBGb3Igbm9uLUlFMTAgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgICAvLyBGb3Igd2ViIHdvcmtlcnMsIHdoZXJlIHN1cHBvcnRlZFxuICAgICAgICBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChkb2MgJiYgXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiBpbiBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSkge1xuICAgICAgICAvLyBGb3IgSUUgNuKAkzhcbiAgICAgICAgaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yIG9sZGVyIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKTtcbiAgICB9XG5cbiAgICBhdHRhY2hUby5zZXRJbW1lZGlhdGUgPSBzZXRJbW1lZGlhdGU7XG4gICAgYXR0YWNoVG8uY2xlYXJJbW1lZGlhdGUgPSBjbGVhckltbWVkaWF0ZTtcbn0odHlwZW9mIHNlbGYgPT09IFwidW5kZWZpbmVkXCIgPyB0eXBlb2YgZ2xvYmFsID09PSBcInVuZGVmaW5lZFwiID8gdGhpcyA6IGdsb2JhbCA6IHNlbGYpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3NldGltbWVkaWF0ZS9zZXRJbW1lZGlhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///18\n");
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("window._ = __webpack_require__(20);\nwindow.Popper = __webpack_require__(3).default;\n\n/**\n * We'll load jQuery and the Bootstrap jQuery plugin which provides support\n * for JavaScript based Bootstrap features such as modals and tabs. This\n * code may be modified to fit the specific needs of your application.\n */\n\ntry {\n window.$ = window.jQuery = __webpack_require__(1);\n __webpack_require__(5);\n} catch (e) {}\n\n/**\n * We'll load the axios HTTP library which allows us to easily issue requests\n * to our Laravel back-end. This library automatically handles sending the\n * CSRF token as a header based on the value of the \"XSRF\" token cookie.\n */\n\nwindow.axios = __webpack_require__(21);\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\n\n/**\n * Next we will register the CSRF Token as a common header with Axios so that\n * all outgoing HTTP requests automatically have it attached. This is just\n * a simple convenience so we don't have to attach every token manually.\n */\n\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\n/**\n * Echo exposes an expressive API for subscribing to channels and listening\n * for events that are broadcast by Laravel. Echo and event broadcasting\n * allows your team to easily build robust real-time web applications.\n */\n// import Echo from \"laravel-echo\"\n// window.io = require('socket.io-client');\n\n// if (typeof io !== 'undefined') {\n// window.Echo = new Echo({\n// broadcaster: 'socket.io',\n// host: window.location.hostname + ':6001',\n// });\n// }//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2Jvb3RzdHJhcC5qcz81OTExIl0sIm5hbWVzIjpbIndpbmRvdyIsIl8iLCJyZXF1aXJlIiwiUG9wcGVyIiwiZGVmYXVsdCIsIiQiLCJqUXVlcnkiLCJlIiwiYXhpb3MiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImRvY3VtZW50IiwiaGVhZCIsInF1ZXJ5U2VsZWN0b3IiLCJjb250ZW50IiwiY29uc29sZSIsImVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsQ0FBUCxHQUFXLG1CQUFBQyxDQUFRLEVBQVIsQ0FBWDtBQUNBRixPQUFPRyxNQUFQLEdBQWdCLG1CQUFBRCxDQUFRLENBQVIsRUFBcUJFLE9BQXJDOztBQUVBOzs7Ozs7QUFNQSxJQUFJO0FBQ0FKLFNBQU9LLENBQVAsR0FBV0wsT0FBT00sTUFBUCxHQUFnQixtQkFBQUosQ0FBUSxDQUFSLENBQTNCO0FBQ0FBLEVBQUEsbUJBQUFBLENBQVEsQ0FBUjtBQUNILENBSEQsQ0FHRSxPQUFPSyxDQUFQLEVBQVUsQ0FBRTs7QUFFZDs7Ozs7O0FBTUFQLE9BQU9RLEtBQVAsR0FBZSxtQkFBQU4sQ0FBUSxFQUFSLENBQWY7O0FBRUFGLE9BQU9RLEtBQVAsQ0FBYUMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLGtCQUFyQyxJQUEyRCxnQkFBM0Q7O0FBRUE7Ozs7OztBQU1BLElBQUlDLFFBQVFDLFNBQVNDLElBQVQsQ0FBY0MsYUFBZCxDQUE0Qix5QkFBNUIsQ0FBWjs7QUFFQSxJQUFJSCxLQUFKLEVBQVc7QUFDUFosU0FBT1EsS0FBUCxDQUFhQyxRQUFiLENBQXNCQyxPQUF0QixDQUE4QkMsTUFBOUIsQ0FBcUMsY0FBckMsSUFBdURDLE1BQU1JLE9BQTdEO0FBQ0gsQ0FGRCxNQUVPO0FBQ0hDLFVBQVFDLEtBQVIsQ0FBYyx1RUFBZDtBQUNIOztBQUVEOzs7OztBQUtBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjE5LmpzIiwic291cmNlc0NvbnRlbnQiOlsid2luZG93Ll8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcbndpbmRvdy5Qb3BwZXIgPSByZXF1aXJlKCdwb3BwZXIuanMnKS5kZWZhdWx0O1xuXG4vKipcbiAqIFdlJ2xsIGxvYWQgalF1ZXJ5IGFuZCB0aGUgQm9vdHN0cmFwIGpRdWVyeSBwbHVnaW4gd2hpY2ggcHJvdmlkZXMgc3VwcG9ydFxuICogZm9yIEphdmFTY3JpcHQgYmFzZWQgQm9vdHN0cmFwIGZlYXR1cmVzIHN1Y2ggYXMgbW9kYWxzIGFuZCB0YWJzLiBUaGlzXG4gKiBjb2RlIG1heSBiZSBtb2RpZmllZCB0byBmaXQgdGhlIHNwZWNpZmljIG5lZWRzIG9mIHlvdXIgYXBwbGljYXRpb24uXG4gKi9cblxudHJ5IHtcbiAgICB3aW5kb3cuJCA9IHdpbmRvdy5qUXVlcnkgPSByZXF1aXJlKCdqcXVlcnknKTtcbiAgICByZXF1aXJlKCdib290c3RyYXAnKTtcbn0gY2F0Y2ggKGUpIHt9XG5cbi8qKlxuICogV2UnbGwgbG9hZCB0aGUgYXhpb3MgSFRUUCBsaWJyYXJ5IHdoaWNoIGFsbG93cyB1cyB0byBlYXNpbHkgaXNzdWUgcmVxdWVzdHNcbiAqIHRvIG91ciBMYXJhdmVsIGJhY2stZW5kLiBUaGlzIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYW5kbGVzIHNlbmRpbmcgdGhlXG4gKiBDU1JGIHRva2VuIGFzIGEgaGVhZGVyIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgXCJYU1JGXCIgdG9rZW4gY29va2llLlxuICovXG5cbndpbmRvdy5heGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XG5cbndpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1SZXF1ZXN0ZWQtV2l0aCddID0gJ1hNTEh0dHBSZXF1ZXN0JztcblxuLyoqXG4gKiBOZXh0IHdlIHdpbGwgcmVnaXN0ZXIgdGhlIENTUkYgVG9rZW4gYXMgYSBjb21tb24gaGVhZGVyIHdpdGggQXhpb3Mgc28gdGhhdFxuICogYWxsIG91dGdvaW5nIEhUVFAgcmVxdWVzdHMgYXV0b21hdGljYWxseSBoYXZlIGl0IGF0dGFjaGVkLiBUaGlzIGlzIGp1c3RcbiAqIGEgc2ltcGxlIGNvbnZlbmllbmNlIHNvIHdlIGRvbid0IGhhdmUgdG8gYXR0YWNoIGV2ZXJ5IHRva2VuIG1hbnVhbGx5LlxuICovXG5cbmxldCB0b2tlbiA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpO1xuXG5pZiAodG9rZW4pIHtcbiAgICB3aW5kb3cuYXhpb3MuZGVmYXVsdHMuaGVhZGVycy5jb21tb25bJ1gtQ1NSRi1UT0tFTiddID0gdG9rZW4uY29udGVudDtcbn0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcignQ1NSRiB0b2tlbiBub3QgZm91bmQ6IGh0dHBzOi8vbGFyYXZlbC5jb20vZG9jcy9jc3JmI2NzcmYteC1jc3JmLXRva2VuJyk7XG59XG5cbi8qKlxuICogRWNobyBleHBvc2VzIGFuIGV4cHJlc3NpdmUgQVBJIGZvciBzdWJzY3JpYmluZyB0byBjaGFubmVscyBhbmQgbGlzdGVuaW5nXG4gKiBmb3IgZXZlbnRzIHRoYXQgYXJlIGJyb2FkY2FzdCBieSBMYXJhdmVsLiBFY2hvIGFuZCBldmVudCBicm9hZGNhc3RpbmdcbiAqIGFsbG93cyB5b3VyIHRlYW0gdG8gZWFzaWx5IGJ1aWxkIHJvYnVzdCByZWFsLXRpbWUgd2ViIGFwcGxpY2F0aW9ucy5cbiAqL1xuLy8gaW1wb3J0IEVjaG8gZnJvbSBcImxhcmF2ZWwtZWNob1wiXG4vLyB3aW5kb3cuaW8gPSByZXF1aXJlKCdzb2NrZXQuaW8tY2xpZW50Jyk7XG5cbi8vIGlmICh0eXBlb2YgaW8gIT09ICd1bmRlZmluZWQnKSB7XG4vLyAgIHdpbmRvdy5FY2hvID0gbmV3IEVjaG8oe1xuLy8gICAgIGJyb2FkY2FzdGVyOiAnc29ja2V0LmlvJyxcbi8vICAgICBob3N0OiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgKyAnOjYwMDEnLFxuLy8gICB9KTtcbi8vIH1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///19\n");
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright JS Foundation and other contributors <https://js.foundation/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n var undefined;\n\n /** Used as the semantic version number. */\n var VERSION = '4.17.10';\n\n /** Used as the size to enable large array optimizations. */\n var LARGE_ARRAY_SIZE = 200;\n\n /** Error message constants. */\n var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n FUNC_ERROR_TEXT = 'Expected a function';\n\n /** Used to stand-in for `undefined` hash values. */\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n /** Used as the maximum memoize cache size. */\n var MAX_MEMOIZE_SIZE = 500;\n\n /** Used as the internal argument placeholder. */\n var PLACEHOLDER = '__lodash_placeholder__';\n\n /** Used to compose bitmasks for cloning. */\n var CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n /** Used to compose bitmasks for value comparisons. */\n var COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n /** Used to compose bitmasks for function metadata. */\n var WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256,\n WRAP_FLIP_FLAG = 512;\n\n /** Used as default options for `_.truncate`. */\n var DEFAULT_TRUNC_LENGTH = 30,\n DEFAULT_TRUNC_OMISSION = '...';\n\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\n var HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n /** Used to indicate the type of lazy iteratees. */\n var LAZY_FILTER_FLAG = 1,\n LAZY_MAP_FLAG = 2,\n LAZY_WHILE_FLAG = 3;\n\n /** Used as references for various `Number` constants. */\n var INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n /** Used as references for the maximum length and index of an array. */\n var MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n /** Used to associate wrap methods with their bit flags. */\n var wrapFlags = [\n ['ary', WRAP_ARY_FLAG],\n ['bind', WRAP_BIND_FLAG],\n ['bindKey', WRAP_BIND_KEY_FLAG],\n ['curry', WRAP_CURRY_FLAG],\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n ['flip', WRAP_FLIP_FLAG],\n ['partial', WRAP_PARTIAL_FLAG],\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n ['rearg', WRAP_REARG_FLAG]\n ];\n\n /** `Object#toString` result references. */\n var argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n domExcTag = '[object DOMException]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]',\n weakSetTag = '[object WeakSet]';\n\n var arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n /** Used to match empty string literals in compiled template source. */\n var reEmptyStringLeading = /\\b__p \\+= '';/g,\n reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n /** Used to match HTML entities and HTML characters. */\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n reUnescapedHtml = /[&<>\"']/g,\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n /** Used to match template delimiters. */\n var reEscape = /<%-([\\s\\S]+?)%>/g,\n reEvaluate = /<%([\\s\\S]+?)%>/g,\n reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n /** Used to match property names within property paths. */\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n /**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n reHasRegExpChar = RegExp(reRegExpChar.source);\n\n /** Used to match leading and trailing whitespace. */\n var reTrim = /^\\s+|\\s+$/g,\n reTrimStart = /^\\s+/,\n reTrimEnd = /\\s+$/;\n\n /** Used to match wrap detail comments. */\n var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n reSplitDetails = /,? & /;\n\n /** Used to match words composed of alphanumeric characters. */\n var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n /** Used to match backslashes in property paths. */\n var reEscapeChar = /\\\\(\\\\)?/g;\n\n /**\n * Used to match\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n */\n var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n /** Used to match `RegExp` flags from their coerced string values. */\n var reFlags = /\\w*$/;\n\n /** Used to detect bad signed hexadecimal string values. */\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n /** Used to detect binary string values. */\n var reIsBinary = /^0b[01]+$/i;\n\n /** Used to detect host constructors (Safari). */\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n /** Used to detect octal string values. */\n var reIsOctal = /^0o[0-7]+$/i;\n\n /** Used to detect unsigned integer values. */\n var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\n var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n /** Used to ensure capturing order of template delimiters. */\n var reNoMatch = /($^)/;\n\n /** Used to match unescaped characters in compiled string literals. */\n var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n /** Used to compose unicode character classes. */\n var rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n /** Used to compose unicode capture groups. */\n var rsApos = \"['\\u2019]\",\n rsAstral = '[' + rsAstralRange + ']',\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n /** Used to compose unicode regexes. */\n var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n /** Used to match apostrophes. */\n var reApos = RegExp(rsApos, 'g');\n\n /**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\n var reComboMark = RegExp(rsCombo, 'g');\n\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n /** Used to match complex or compound words. */\n var reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n rsUpper + '+' + rsOptContrUpper,\n rsOrdUpper,\n rsOrdLower,\n rsDigits,\n rsEmoji\n ].join('|'), 'g');\n\n /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n /** Used to detect strings that need a more robust regexp to match words. */\n var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n /** Used to assign default `context` object properties. */\n var contextProps = [\n 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n ];\n\n /** Used to make template sourceURLs easier to identify. */\n var templateCounter = -1;\n\n /** Used to identify `toStringTag` values of typed arrays. */\n var typedArrayTags = {};\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n typedArrayTags[uint32Tag] = true;\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\n typedArrayTags[weakMapTag] = false;\n\n /** Used to identify `toStringTag` values supported by `_.clone`. */\n var cloneableTags = {};\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\n cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n cloneableTags[boolTag] = cloneableTags[dateTag] =\n cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n cloneableTags[int32Tag] = cloneableTags[mapTag] =\n cloneableTags[numberTag] = cloneableTags[objectTag] =\n cloneableTags[regexpTag] = cloneableTags[setTag] =\n cloneableTags[stringTag] = cloneableTags[symbolTag] =\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n cloneableTags[errorTag] = cloneableTags[funcTag] =\n cloneableTags[weakMapTag] = false;\n\n /** Used to map Latin Unicode letters to basic Latin letters. */\n var deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n '\\u0134': 'J', '\\u0135': 'j',\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n '\\u0174': 'W', '\\u0175': 'w',\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\n '\\u0132': 'IJ', '\\u0133': 'ij',\n '\\u0152': 'Oe', '\\u0153': 'oe',\n '\\u0149': \"'n\", '\\u017f': 's'\n };\n\n /** Used to map characters to HTML entities. */\n var htmlEscapes = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n };\n\n /** Used to map HTML entities to characters. */\n var htmlUnescapes = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\"\n };\n\n /** Used to escape characters for inclusion in compiled string literals. */\n var stringEscapes = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\\n': 'n',\n '\\r': 'r',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n };\n\n /** Built-in method references without a dependency on `root`. */\n var freeParseFloat = parseFloat,\n freeParseInt = parseInt;\n\n /** Detect free variable `global` from Node.js. */\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n /** Detect free variable `self`. */\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n /** Used as a reference to the global object. */\n var root = freeGlobal || freeSelf || Function('return this')();\n\n /** Detect free variable `exports`. */\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module`. */\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n /** Detect the popular CommonJS extension `module.exports`. */\n var moduleExports = freeModule && freeModule.exports === freeExports;\n\n /** Detect free variable `process` from Node.js. */\n var freeProcess = moduleExports && freeGlobal.process;\n\n /** Used to access faster Node.js helpers. */\n var nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n }());\n\n /* Node.js helper references. */\n var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n nodeIsDate = nodeUtil && nodeUtil.isDate,\n nodeIsMap = nodeUtil && nodeUtil.isMap,\n nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n nodeIsSet = nodeUtil && nodeUtil.isSet,\n nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\n function apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n }\n\n /**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.forEachRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEachRight(array, iteratee) {\n var length = array == null ? 0 : array.length;\n\n while (length--) {\n if (iteratee(array[length], length, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\n function arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n }\n\n /**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n }\n\n /**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\n function arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n }\n\n /**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.reduceRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the last element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n var length = array == null ? 0 : array.length;\n if (initAccum && length) {\n accumulator = array[--length];\n }\n while (length--) {\n accumulator = iteratee(accumulator, array[length], length, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n var asciiSize = baseProperty('length');\n\n /**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function asciiToArray(string) {\n return string.split('');\n }\n\n /**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function asciiWords(string) {\n return string.match(reAsciiWord) || [];\n }\n\n /**\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n * without support for iteratee shorthands, which iterates over `collection`\n * using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the found element or its key, else `undefined`.\n */\n function baseFindKey(collection, predicate, eachFunc) {\n var result;\n eachFunc(collection, function(value, key, collection) {\n if (predicate(value, key, collection)) {\n result = key;\n return false;\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n }\n\n /**\n * This function is like `baseIndexOf` except that it accepts a comparator.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOfWith(array, value, fromIndex, comparator) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (comparator(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\n function baseIsNaN(value) {\n return value !== value;\n }\n\n /**\n * The base implementation of `_.mean` and `_.meanBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the mean.\n */\n function baseMean(array, iteratee) {\n var length = array == null ? 0 : array.length;\n return length ? (baseSum(array, iteratee) / length) : NAN;\n }\n\n /**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\n function baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.sum` and `_.sumBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the sum.\n */\n function baseSum(array, iteratee) {\n var result,\n index = -1,\n length = array.length;\n\n while (++index < length) {\n var current = iteratee(array[index]);\n if (current !== undefined) {\n result = result === undefined ? current : (result + current);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\n function baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n * of key-value pairs for `object` corresponding to the property names of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the key-value pairs.\n */\n function baseToPairs(object, props) {\n return arrayMap(props, function(key) {\n return [key, object[key]];\n });\n }\n\n /**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\n function baseUnary(func) {\n return function(value) {\n return func(value);\n };\n }\n\n /**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\n function baseValues(object, props) {\n return arrayMap(props, function(key) {\n return object[key];\n });\n }\n\n /**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function cacheHas(cache, key) {\n return cache.has(key);\n }\n\n /**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */\n function charsStartIndex(strSymbols, chrSymbols) {\n var index = -1,\n length = strSymbols.length;\n\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the last unmatched string symbol.\n */\n function charsEndIndex(strSymbols, chrSymbols) {\n var index = strSymbols.length;\n\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */\n function countHolders(array, placeholder) {\n var length = array.length,\n result = 0;\n\n while (length--) {\n if (array[length] === placeholder) {\n ++result;\n }\n }\n return result;\n }\n\n /**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\n var deburrLetter = basePropertyOf(deburredLetters);\n\n /**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n /**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n function escapeStringChar(chr) {\n return '\\\\' + stringEscapes[chr];\n }\n\n /**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function getValue(object, key) {\n return object == null ? undefined : object[key];\n }\n\n /**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\n function hasUnicode(string) {\n return reHasUnicode.test(string);\n }\n\n /**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\n function hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n }\n\n /**\n * Converts `iterator` to an array.\n *\n * @private\n * @param {Object} iterator The iterator to convert.\n * @returns {Array} Returns the converted array.\n */\n function iteratorToArray(iterator) {\n var data,\n result = [];\n\n while (!(data = iterator.next()).done) {\n result.push(data.value);\n }\n return result;\n }\n\n /**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\n function mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n }\n\n /**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\n function overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n }\n\n /**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\n function replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value === placeholder || value === PLACEHOLDER) {\n array[index] = PLACEHOLDER;\n result[resIndex++] = index;\n }\n }\n return result;\n }\n\n /**\n * Gets the value at `key`, unless `key` is \"__proto__\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function safeGet(object, key) {\n return key == '__proto__'\n ? undefined\n : object[key];\n }\n\n /**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\n function setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n }\n\n /**\n * Converts `set` to its value-value pairs.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the value-value pairs.\n */\n function setToPairs(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = [value, value];\n });\n return result;\n }\n\n /**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * A specialized version of `_.lastIndexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictLastIndexOf(array, value, fromIndex) {\n var index = fromIndex + 1;\n while (index--) {\n if (array[index] === value) {\n return index;\n }\n }\n return index;\n }\n\n /**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\n function stringSize(string) {\n return hasUnicode(string)\n ? unicodeSize(string)\n : asciiSize(string);\n }\n\n /**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n }\n\n /**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n /**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n function unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n ++result;\n }\n return result;\n }\n\n /**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function unicodeToArray(string) {\n return string.match(reUnicode) || [];\n }\n\n /**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Create a new pristine `lodash` function using the `context` object.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Util\n * @param {Object} [context=root] The context object.\n * @returns {Function} Returns a new `lodash` function.\n * @example\n *\n * _.mixin({ 'foo': _.constant('foo') });\n *\n * var lodash = _.runInContext();\n * lodash.mixin({ 'bar': lodash.constant('bar') });\n *\n * _.isFunction(_.foo);\n * // => true\n * _.isFunction(_.bar);\n * // => false\n *\n * lodash.isFunction(lodash.foo);\n * // => false\n * lodash.isFunction(lodash.bar);\n * // => true\n *\n * // Create a suped-up `defer` in Node.js.\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n */\n var runInContext = (function runInContext(context) {\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n /** Built-in constructor references. */\n var Array = context.Array,\n Date = context.Date,\n Error = context.Error,\n Function = context.Function,\n Math = context.Math,\n Object = context.Object,\n RegExp = context.RegExp,\n String = context.String,\n TypeError = context.TypeError;\n\n /** Used for built-in method references. */\n var arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n /** Used to detect overreaching core-js shims. */\n var coreJsData = context['__core-js_shared__'];\n\n /** Used to resolve the decompiled source of functions. */\n var funcToString = funcProto.toString;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to generate unique IDs. */\n var idCounter = 0;\n\n /** Used to detect methods masquerading as native. */\n var maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n }());\n\n /**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n var nativeObjectToString = objectProto.toString;\n\n /** Used to infer the `Object` constructor. */\n var objectCtorString = funcToString.call(Object);\n\n /** Used to restore the original `_` reference in `_.noConflict`. */\n var oldDash = root._;\n\n /** Used to detect if a method is native. */\n var reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n );\n\n /** Built-in value references. */\n var Buffer = moduleExports ? context.Buffer : undefined,\n Symbol = context.Symbol,\n Uint8Array = context.Uint8Array,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n symIterator = Symbol ? Symbol.iterator : undefined,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n var defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n }());\n\n /** Mocked built-ins. */\n var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n ctxNow = Date && Date.now !== root.Date.now && Date.now,\n ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n /* Built-in method references for those with the same name as other `lodash` methods. */\n var nativeCeil = Math.ceil,\n nativeFloor = Math.floor,\n nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeIsFinite = context.isFinite,\n nativeJoin = arrayProto.join,\n nativeKeys = overArg(Object.keys, Object),\n nativeMax = Math.max,\n nativeMin = Math.min,\n nativeNow = Date.now,\n nativeParseInt = context.parseInt,\n nativeRandom = Math.random,\n nativeReverse = arrayProto.reverse;\n\n /* Built-in method references that are verified to be native. */\n var DataView = getNative(context, 'DataView'),\n Map = getNative(context, 'Map'),\n Promise = getNative(context, 'Promise'),\n Set = getNative(context, 'Set'),\n WeakMap = getNative(context, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n /** Used to store function metadata. */\n var metaMap = WeakMap && new WeakMap;\n\n /** Used to lookup unminified function names. */\n var realNames = {};\n\n /** Used to detect maps, sets, and weakmaps. */\n var dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n /** Used to convert symbols to primitives and strings. */\n var symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash(value) {\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n if (value instanceof LodashWrapper) {\n return value;\n }\n if (hasOwnProperty.call(value, '__wrapped__')) {\n return wrapperClone(value);\n }\n }\n return new LodashWrapper(value);\n }\n\n /**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\n var baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n }());\n\n /**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\n function baseLodash() {\n // No operation performed.\n }\n\n /**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\n function LodashWrapper(value, chainAll) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__chain__ = !!chainAll;\n this.__index__ = 0;\n this.__values__ = undefined;\n }\n\n /**\n * By default, the template delimiters used by lodash are like those in\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n * following template settings to use alternative delimiters.\n *\n * @static\n * @memberOf _\n * @type {Object}\n */\n lodash.templateSettings = {\n\n /**\n * Used to detect `data` property values to be HTML-escaped.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'escape': reEscape,\n\n /**\n * Used to detect code to be evaluated.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'evaluate': reEvaluate,\n\n /**\n * Used to detect `data` property values to inject.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'interpolate': reInterpolate,\n\n /**\n * Used to reference the data object in the template text.\n *\n * @memberOf _.templateSettings\n * @type {string}\n */\n 'variable': '',\n\n /**\n * Used to import variables into the compiled template.\n *\n * @memberOf _.templateSettings\n * @type {Object}\n */\n 'imports': {\n\n /**\n * A reference to the `lodash` function.\n *\n * @memberOf _.templateSettings.imports\n * @type {Function}\n */\n '_': lodash\n }\n };\n\n // Ensure wrappers are instances of `baseLodash`.\n lodash.prototype = baseLodash.prototype;\n lodash.prototype.constructor = lodash;\n\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n LodashWrapper.prototype.constructor = LodashWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\n function LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__dir__ = 1;\n this.__filtered__ = false;\n this.__iteratees__ = [];\n this.__takeCount__ = MAX_ARRAY_LENGTH;\n this.__views__ = [];\n }\n\n /**\n * Creates a clone of the lazy wrapper object.\n *\n * @private\n * @name clone\n * @memberOf LazyWrapper\n * @returns {Object} Returns the cloned `LazyWrapper` object.\n */\n function lazyClone() {\n var result = new LazyWrapper(this.__wrapped__);\n result.__actions__ = copyArray(this.__actions__);\n result.__dir__ = this.__dir__;\n result.__filtered__ = this.__filtered__;\n result.__iteratees__ = copyArray(this.__iteratees__);\n result.__takeCount__ = this.__takeCount__;\n result.__views__ = copyArray(this.__views__);\n return result;\n }\n\n /**\n * Reverses the direction of lazy iteration.\n *\n * @private\n * @name reverse\n * @memberOf LazyWrapper\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\n */\n function lazyReverse() {\n if (this.__filtered__) {\n var result = new LazyWrapper(this);\n result.__dir__ = -1;\n result.__filtered__ = true;\n } else {\n result = this.clone();\n result.__dir__ *= -1;\n }\n return result;\n }\n\n /**\n * Extracts the unwrapped value from its lazy wrapper.\n *\n * @private\n * @name value\n * @memberOf LazyWrapper\n * @returns {*} Returns the unwrapped value.\n */\n function lazyValue() {\n var array = this.__wrapped__.value(),\n dir = this.__dir__,\n isArr = isArray(array),\n isRight = dir < 0,\n arrLength = isArr ? array.length : 0,\n view = getView(0, arrLength, this.__views__),\n start = view.start,\n end = view.end,\n length = end - start,\n index = isRight ? end : (start - 1),\n iteratees = this.__iteratees__,\n iterLength = iteratees.length,\n resIndex = 0,\n takeCount = nativeMin(length, this.__takeCount__);\n\n if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n return baseWrapperValue(array, this.__actions__);\n }\n var result = [];\n\n outer:\n while (length-- && resIndex < takeCount) {\n index += dir;\n\n var iterIndex = -1,\n value = array[index];\n\n while (++iterIndex < iterLength) {\n var data = iteratees[iterIndex],\n iteratee = data.iteratee,\n type = data.type,\n computed = iteratee(value);\n\n if (type == LAZY_MAP_FLAG) {\n value = computed;\n } else if (!computed) {\n if (type == LAZY_FILTER_FLAG) {\n continue outer;\n } else {\n break outer;\n }\n }\n }\n result[resIndex++] = value;\n }\n return result;\n }\n\n // Ensure `LazyWrapper` is an instance of `baseLodash`.\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n LazyWrapper.prototype.constructor = LazyWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\n function hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n }\n\n /**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n }\n\n /**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\n function hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n }\n\n // Add methods to `Hash`.\n Hash.prototype.clear = hashClear;\n Hash.prototype['delete'] = hashDelete;\n Hash.prototype.get = hashGet;\n Hash.prototype.has = hashHas;\n Hash.prototype.set = hashSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\n function listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n }\n\n /**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n }\n\n /**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n }\n\n /**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\n function listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n }\n\n // Add methods to `ListCache`.\n ListCache.prototype.clear = listCacheClear;\n ListCache.prototype['delete'] = listCacheDelete;\n ListCache.prototype.get = listCacheGet;\n ListCache.prototype.has = listCacheHas;\n ListCache.prototype.set = listCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\n function mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n }\n\n /**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function mapCacheGet(key) {\n return getMapData(this, key).get(key);\n }\n\n /**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function mapCacheHas(key) {\n return getMapData(this, key).has(key);\n }\n\n /**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\n function mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n }\n\n // Add methods to `MapCache`.\n MapCache.prototype.clear = mapCacheClear;\n MapCache.prototype['delete'] = mapCacheDelete;\n MapCache.prototype.get = mapCacheGet;\n MapCache.prototype.has = mapCacheHas;\n MapCache.prototype.set = mapCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\n function SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n }\n\n /**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\n function setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n }\n\n /**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\n function setCacheHas(value) {\n return this.__data__.has(value);\n }\n\n // Add methods to `SetCache`.\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n SetCache.prototype.has = setCacheHas;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n }\n\n /**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\n function stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n }\n\n /**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function stackGet(key) {\n return this.__data__.get(key);\n }\n\n /**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function stackHas(key) {\n return this.__data__.has(key);\n }\n\n /**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\n function stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n }\n\n // Add methods to `Stack`.\n Stack.prototype.clear = stackClear;\n Stack.prototype['delete'] = stackDelete;\n Stack.prototype.get = stackGet;\n Stack.prototype.has = stackHas;\n Stack.prototype.set = stackSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\n function arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.sample` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @returns {*} Returns the random element.\n */\n function arraySample(array) {\n var length = array.length;\n return length ? array[baseRandom(0, length - 1)] : undefined;\n }\n\n /**\n * A specialized version of `_.sampleSize` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function arraySampleSize(array, n) {\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n }\n\n /**\n * A specialized version of `_.shuffle` for arrays.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function arrayShuffle(array) {\n return shuffleSelf(copyArray(array));\n }\n\n /**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n }\n\n /**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n }\n\n /**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n }\n\n /**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n }\n\n /**\n * The base implementation of `_.at` without support for individual paths.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {string[]} paths The property paths to pick.\n * @returns {Array} Returns the picked elements.\n */\n function baseAt(object, paths) {\n var index = -1,\n length = paths.length,\n result = Array(length),\n skip = object == null;\n\n while (++index < length) {\n result[index] = skip ? undefined : get(object, paths[index]);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.clamp` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n */\n function baseClamp(number, lower, upper) {\n if (number === number) {\n if (upper !== undefined) {\n number = number <= upper ? number : upper;\n }\n if (lower !== undefined) {\n number = number >= lower ? number : lower;\n }\n }\n return number;\n }\n\n /**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\n function baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n\n return result;\n }\n\n if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n\n return result;\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n }\n\n /**\n * The base implementation of `_.conforms` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n */\n function baseConforms(source) {\n var props = keys(source);\n return function(object) {\n return baseConformsTo(object, source, props);\n };\n }\n\n /**\n * The base implementation of `_.conformsTo` which accepts `props` to check.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n */\n function baseConformsTo(object, source, props) {\n var length = props.length;\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (length--) {\n var key = props[length],\n predicate = source[key],\n value = object[key];\n\n if ((value === undefined && !(key in object)) || !predicate(value)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\n * to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Array} args The arguments to provide to `func`.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n function baseDelay(func, wait, args) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return setTimeout(function() { func.apply(undefined, args); }, wait);\n }\n\n /**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\n function baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEach = createBaseEach(baseForOwn);\n\n /**\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n /**\n * The base implementation of `_.every` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */\n function baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n }\n\n /**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\n function baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.fill` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n */\n function baseFill(array, value, start, end) {\n var length = array.length;\n\n start = toInteger(start);\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = (end === undefined || end > length) ? length : toInteger(end);\n if (end < 0) {\n end += length;\n }\n end = start > end ? 0 : toLength(end);\n while (start < end) {\n array[start++] = value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\n function baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseFor = createBaseFor();\n\n /**\n * This function is like `baseFor` except that it iterates over properties\n * in the opposite order.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseForRight = createBaseFor(true);\n\n /**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwnRight(object, iteratee) {\n return object && baseForRight(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.functions` which creates an array of\n * `object` function property names filtered from `props`.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} props The property names to filter.\n * @returns {Array} Returns the function names.\n */\n function baseFunctions(object, props) {\n return arrayFilter(props, function(key) {\n return isFunction(object[key]);\n });\n }\n\n /**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\n function baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n }\n\n /**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n }\n\n /**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n function baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n }\n\n /**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\n function baseGt(value, other) {\n return value > other;\n }\n\n /**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n }\n\n /**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHasIn(object, key) {\n return object != null && key in Object(object);\n }\n\n /**\n * The base implementation of `_.inRange` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to check.\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n */\n function baseInRange(number, start, end) {\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\n }\n\n /**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\n function baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.invert` and `_.invertBy` which inverts\n * `object` with values transformed by `iteratee` and set by `setter`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform values.\n * @param {Object} accumulator The initial inverted object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseInverter(object, setter, iteratee, accumulator) {\n baseForOwn(object, function(value, key, object) {\n setter(accumulator, iteratee(value), key, object);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.invoke` without support for individual\n * method arguments.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */\n function baseInvoke(object, path, args) {\n path = castPath(path, object);\n object = parent(object, path);\n var func = object == null ? object : object[toKey(last(path))];\n return func == null ? undefined : apply(func, object, args);\n }\n\n /**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\n function baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n }\n\n /**\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n */\n function baseIsArrayBuffer(value) {\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n }\n\n /**\n * The base implementation of `_.isDate` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n */\n function baseIsDate(value) {\n return isObjectLike(value) && baseGetTag(value) == dateTag;\n }\n\n /**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\n function baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n }\n\n /**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n }\n\n /**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\n function baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n }\n\n /**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\n function baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\n function baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n }\n\n /**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\n function baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n }\n\n /**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\n function baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n }\n\n /**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\n function baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n }\n\n /**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\n function baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n }\n\n /**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\n function baseLt(value, other) {\n return value < other;\n }\n\n /**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n }\n\n /**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n }\n\n /**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n }\n\n /**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n if (isObject(srcValue)) {\n stack || (stack = new Stack);\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n }\n\n /**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n }\n\n /**\n * The base implementation of `_.nth` which doesn't coerce arguments.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {number} n The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n */\n function baseNth(array, n) {\n var length = array.length;\n if (!length) {\n return;\n }\n n += n < 0 ? length : 0;\n return isIndex(n, length) ? array[n] : undefined;\n }\n\n /**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\n function baseOrderBy(collection, iteratees, orders) {\n var index = -1;\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n }\n\n /**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\n function basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n }\n\n /**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\n function basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n }\n\n /**\n * The base implementation of `_.pullAllBy` without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n */\n function basePullAll(array, values, iteratee, comparator) {\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n index = -1,\n length = values.length,\n seen = array;\n\n if (array === values) {\n values = copyArray(values);\n }\n if (iteratee) {\n seen = arrayMap(array, baseUnary(iteratee));\n }\n while (++index < length) {\n var fromIndex = 0,\n value = values[index],\n computed = iteratee ? iteratee(value) : value;\n\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n if (seen !== array) {\n splice.call(seen, fromIndex, 1);\n }\n splice.call(array, fromIndex, 1);\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.pullAt` without support for individual\n * indexes or capturing the removed elements.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {number[]} indexes The indexes of elements to remove.\n * @returns {Array} Returns `array`.\n */\n function basePullAt(array, indexes) {\n var length = array ? indexes.length : 0,\n lastIndex = length - 1;\n\n while (length--) {\n var index = indexes[length];\n if (length == lastIndex || index !== previous) {\n var previous = index;\n if (isIndex(index)) {\n splice.call(array, index, 1);\n } else {\n baseUnset(array, index);\n }\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.random` without support for returning\n * floating-point numbers.\n *\n * @private\n * @param {number} lower The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the random number.\n */\n function baseRandom(lower, upper) {\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n }\n\n /**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\n function baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n }\n\n /**\n * The base implementation of `_.repeat` which doesn't coerce arguments.\n *\n * @private\n * @param {string} string The string to repeat.\n * @param {number} n The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n */\n function baseRepeat(string, n) {\n var result = '';\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n return result;\n }\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n do {\n if (n % 2) {\n result += string;\n }\n n = nativeFloor(n / 2);\n if (n) {\n string += string;\n }\n } while (n);\n\n return result;\n }\n\n /**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\n function baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n }\n\n /**\n * The base implementation of `_.sample`.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n */\n function baseSample(collection) {\n return arraySample(values(collection));\n }\n\n /**\n * The base implementation of `_.sampleSize` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function baseSampleSize(collection, n) {\n var array = values(collection);\n return shuffleSelf(array, baseClamp(n, 0, array.length));\n }\n\n /**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n }\n\n /**\n * The base implementation of `setData` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var baseSetData = !metaMap ? identity : function(func, data) {\n metaMap.set(func, data);\n return func;\n };\n\n /**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n };\n\n /**\n * The base implementation of `_.shuffle`.\n *\n * @private\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function baseShuffle(collection) {\n return shuffleSelf(values(collection));\n }\n\n /**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n }\n\n /**\n * The base implementation of `_.some` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n }\n\n /**\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n * performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndex(array, value, retHighest) {\n var low = 0,\n high = array == null ? low : array.length;\n\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n while (low < high) {\n var mid = (low + high) >>> 1,\n computed = array[mid];\n\n if (computed !== null && !isSymbol(computed) &&\n (retHighest ? (computed <= value) : (computed < value))) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return high;\n }\n return baseSortedIndexBy(array, value, identity, retHighest);\n }\n\n /**\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n * which invokes `iteratee` for `value` and each element of `array` to compute\n * their sort ranking. The iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The iteratee invoked per element.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\n value = iteratee(value);\n\n var low = 0,\n high = array == null ? 0 : array.length,\n valIsNaN = value !== value,\n valIsNull = value === null,\n valIsSymbol = isSymbol(value),\n valIsUndefined = value === undefined;\n\n while (low < high) {\n var mid = nativeFloor((low + high) / 2),\n computed = iteratee(array[mid]),\n othIsDefined = computed !== undefined,\n othIsNull = computed === null,\n othIsReflexive = computed === computed,\n othIsSymbol = isSymbol(computed);\n\n if (valIsNaN) {\n var setLow = retHighest || othIsReflexive;\n } else if (valIsUndefined) {\n setLow = othIsReflexive && (retHighest || othIsDefined);\n } else if (valIsNull) {\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n } else if (valIsSymbol) {\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n } else if (othIsNull || othIsSymbol) {\n setLow = false;\n } else {\n setLow = retHighest ? (computed <= value) : (computed < value);\n }\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return nativeMin(high, MAX_ARRAY_INDEX);\n }\n\n /**\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseSortedUniq(array, iteratee) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n if (!index || !eq(computed, seen)) {\n var seen = computed;\n result[resIndex++] = value === 0 ? 0 : value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toNumber` which doesn't ensure correct\n * conversions of binary, hexadecimal, or octal string values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n */\n function baseToNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n return +value;\n }\n\n /**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n function baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */\n function baseUnset(object, path) {\n path = castPath(path, object);\n object = parent(object, path);\n return object == null || delete object[toKey(last(path))];\n }\n\n /**\n * The base implementation of `_.update`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to update.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseUpdate(object, path, updater, customizer) {\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\n }\n\n /**\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n * without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseWhile(array, predicate, isDrop, fromRight) {\n var length = array.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length) &&\n predicate(array[index], index, array)) {}\n\n return isDrop\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n }\n\n /**\n * The base implementation of `wrapperValue` which returns the result of\n * performing a sequence of actions on the unwrapped `value`, where each\n * successive action is supplied the return value of the previous.\n *\n * @private\n * @param {*} value The unwrapped value.\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\n * @returns {*} Returns the resolved value.\n */\n function baseWrapperValue(value, actions) {\n var result = value;\n if (result instanceof LazyWrapper) {\n result = result.value();\n }\n return arrayReduce(actions, function(result, action) {\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\n }, result);\n }\n\n /**\n * The base implementation of methods like `_.xor`, without support for\n * iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of values.\n */\n function baseXor(arrays, iteratee, comparator) {\n var length = arrays.length;\n if (length < 2) {\n return length ? baseUniq(arrays[0]) : [];\n }\n var index = -1,\n result = Array(length);\n\n while (++index < length) {\n var array = arrays[index],\n othIndex = -1;\n\n while (++othIndex < length) {\n if (othIndex != index) {\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n }\n }\n }\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n }\n\n /**\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n *\n * @private\n * @param {Array} props The property identifiers.\n * @param {Array} values The property values.\n * @param {Function} assignFunc The function to assign values.\n * @returns {Object} Returns the new object.\n */\n function baseZipObject(props, values, assignFunc) {\n var index = -1,\n length = props.length,\n valsLength = values.length,\n result = {};\n\n while (++index < length) {\n var value = index < valsLength ? values[index] : undefined;\n assignFunc(result, props[index], value);\n }\n return result;\n }\n\n /**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\n function castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n }\n\n /**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\n function castFunction(value) {\n return typeof value == 'function' ? value : identity;\n }\n\n /**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\n function castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n }\n\n /**\n * A `baseRest` alias which can be replaced with `identity` by module\n * replacement plugins.\n *\n * @private\n * @type {Function}\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n var castRest = baseRest;\n\n /**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\n function castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n }\n\n /**\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n *\n * @private\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\n */\n var clearTimeout = ctxClearTimeout || function(id) {\n return root.clearTimeout(id);\n };\n\n /**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\n function cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n }\n\n /**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\n function cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n }\n\n /**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\n function cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n }\n\n /**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\n function cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n }\n\n /**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\n function cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n }\n\n /**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\n function cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n }\n\n /**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\n function compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n }\n\n /**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\n function compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n }\n\n /**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgs(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersLength = holders.length,\n leftIndex = -1,\n leftLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(leftLength + rangeLength),\n isUncurried = !isCurried;\n\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n }\n while (rangeLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n }\n\n /**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgsRight(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersIndex = -1,\n holdersLength = holders.length,\n rightIndex = -1,\n rightLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(rangeLength + rightLength),\n isUncurried = !isCurried;\n\n while (++argsIndex < rangeLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n }\n return result;\n }\n\n /**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\n function copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n }\n\n /**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\n function copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n }\n\n /**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n }\n\n /**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n }\n\n /**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\n function createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n };\n }\n\n /**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\n function createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n }\n\n /**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n }\n\n /**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the optional `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createBind(func, bitmask, thisArg) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, arguments);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\n function createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n }\n\n /**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\n function createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n }\n\n /**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCtor(Ctor) {\n return function() {\n // Use a `switch` statement to work with class constructors. See\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0: return new Ctor;\n case 1: return new Ctor(args[0]);\n case 2: return new Ctor(args[0], args[1]);\n case 3: return new Ctor(args[0], args[1], args[2]);\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return isObject(result) ? result : thisBinding;\n };\n }\n\n /**\n * Creates a function that wraps `func` to enable currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {number} arity The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCurry(func, bitmask, arity) {\n var Ctor = createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length,\n placeholder = getHolder(wrapper);\n\n while (index--) {\n args[index] = arguments[index];\n }\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n ? []\n : replaceHolders(args, placeholder);\n\n length -= holders.length;\n if (length < arity) {\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\n args, holders, undefined, undefined, arity - length);\n }\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return apply(fn, this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\n function createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = getIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n }\n\n /**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\n function createFlow(fromRight) {\n return flatRest(function(funcs) {\n var length = funcs.length,\n index = length,\n prereq = LodashWrapper.prototype.thru;\n\n if (fromRight) {\n funcs.reverse();\n }\n while (index--) {\n var func = funcs[index];\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n var wrapper = new LodashWrapper([], true);\n }\n }\n index = wrapper ? index : length;\n while (++index < length) {\n func = funcs[index];\n\n var funcName = getFuncName(func),\n data = funcName == 'wrapper' ? getData(func) : undefined;\n\n if (data && isLaziable(data[0]) &&\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n !data[4].length && data[9] == 1\n ) {\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n } else {\n wrapper = (func.length == 1 && isLaziable(func))\n ? wrapper[funcName]()\n : wrapper.thru(func);\n }\n }\n return function() {\n var args = arguments,\n value = args[0];\n\n if (wrapper && args.length == 1 && isArray(value)) {\n return wrapper.plant(value).value();\n }\n var index = 0,\n result = length ? funcs[index].apply(this, args) : value;\n\n while (++index < length) {\n result = funcs[index].call(this, result);\n }\n return result;\n };\n });\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with optional `this`\n * binding of `thisArg`, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided\n * to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & WRAP_ARY_FLAG,\n isBind = bitmask & WRAP_BIND_FLAG,\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n isFlip = bitmask & WRAP_FLIP_FLAG,\n Ctor = isBindKey ? undefined : createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length;\n\n while (index--) {\n args[index] = arguments[index];\n }\n if (isCurried) {\n var placeholder = getHolder(wrapper),\n holdersCount = countHolders(args, placeholder);\n }\n if (partials) {\n args = composeArgs(args, partials, holders, isCurried);\n }\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n }\n length -= holdersCount;\n if (isCurried && length < arity) {\n var newHolders = replaceHolders(args, placeholder);\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n args, newHolders, argPos, ary, arity - length\n );\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n\n length = args.length;\n if (argPos) {\n args = reorder(args, argPos);\n } else if (isFlip && length > 1) {\n args.reverse();\n }\n if (isAry && ary < length) {\n args.length = ary;\n }\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtor(fn);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.invertBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} toIteratee The function to resolve iteratees.\n * @returns {Function} Returns the new inverter function.\n */\n function createInverter(setter, toIteratee) {\n return function(object, iteratee) {\n return baseInverter(object, setter, toIteratee(iteratee), {});\n };\n }\n\n /**\n * Creates a function that performs a mathematical operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @param {number} [defaultValue] The value used for `undefined` arguments.\n * @returns {Function} Returns the new mathematical operation function.\n */\n function createMathOperation(operator, defaultValue) {\n return function(value, other) {\n var result;\n if (value === undefined && other === undefined) {\n return defaultValue;\n }\n if (value !== undefined) {\n result = value;\n }\n if (other !== undefined) {\n if (result === undefined) {\n return other;\n }\n if (typeof value == 'string' || typeof other == 'string') {\n value = baseToString(value);\n other = baseToString(other);\n } else {\n value = baseToNumber(value);\n other = baseToNumber(other);\n }\n result = operator(value, other);\n }\n return result;\n };\n }\n\n /**\n * Creates a function like `_.over`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over iteratees.\n * @returns {Function} Returns the new over function.\n */\n function createOver(arrayFunc) {\n return flatRest(function(iteratees) {\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n return baseRest(function(args) {\n var thisArg = this;\n return arrayFunc(iteratees, function(iteratee) {\n return apply(iteratee, thisArg, args);\n });\n });\n });\n }\n\n /**\n * Creates the padding for `string` based on `length`. The `chars` string\n * is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {number} length The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padding for `string`.\n */\n function createPadding(length, chars) {\n chars = chars === undefined ? ' ' : baseToString(chars);\n\n var charsLength = chars.length;\n if (charsLength < 2) {\n return charsLength ? baseRepeat(chars, length) : chars;\n }\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n return hasUnicode(chars)\n ? castSlice(stringToArray(result), 0, length).join('')\n : result.slice(0, length);\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the `this` binding\n * of `thisArg` and `partials` prepended to the arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to\n * the new function.\n * @returns {Function} Returns the new wrapped function.\n */\n function createPartial(func, bitmask, thisArg, partials) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(leftLength + argsLength),\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n return apply(fn, isBind ? thisArg : this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\n function createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of `-0` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n }\n\n /**\n * Creates a function that performs a relational operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @returns {Function} Returns the new relational operation function.\n */\n function createRelationalOperation(operator) {\n return function(value, other) {\n if (!(typeof value == 'string' && typeof other == 'string')) {\n value = toNumber(value);\n other = toNumber(other);\n }\n return operator(value, other);\n };\n }\n\n /**\n * Creates a function that wraps `func` to continue currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {Function} wrapFunc The function to create the `func` wrapper.\n * @param {*} placeholder The placeholder value.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n var isCurry = bitmask & WRAP_CURRY_FLAG,\n newHolders = isCurry ? holders : undefined,\n newHoldersRight = isCurry ? undefined : holders,\n newPartials = isCurry ? partials : undefined,\n newPartialsRight = isCurry ? undefined : partials;\n\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n }\n var newData = [\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n newHoldersRight, argPos, ary, arity\n ];\n\n var result = wrapFunc.apply(undefined, newData);\n if (isLaziable(func)) {\n setData(result, newData);\n }\n result.placeholder = placeholder;\n return setWrapToString(result, func, bitmask);\n }\n\n /**\n * Creates a function like `_.round`.\n *\n * @private\n * @param {string} methodName The name of the `Math` method to use when rounding.\n * @returns {Function} Returns the new round function.\n */\n function createRound(methodName) {\n var func = Math[methodName];\n return function(number, precision) {\n number = toNumber(number);\n precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n if (precision) {\n // Shift with exponential notation to avoid floating-point issues.\n // See [MDN](https://mdn.io/round#Examples) for more details.\n var pair = (toString(number) + 'e').split('e'),\n value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n pair = (toString(value) + 'e').split('e');\n return +(pair[0] + 'e' + (+pair[1] - precision));\n }\n return func(number);\n };\n }\n\n /**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\n var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n };\n\n /**\n * Creates a `_.toPairs` or `_.toPairsIn` function.\n *\n * @private\n * @param {Function} keysFunc The function to get the keys of a given object.\n * @returns {Function} Returns the new pairs function.\n */\n function createToPairs(keysFunc) {\n return function(object) {\n var tag = getTag(object);\n if (tag == mapTag) {\n return mapToArray(object);\n }\n if (tag == setTag) {\n return setToPairs(object);\n }\n return baseToPairs(object, keysFunc(object));\n };\n }\n\n /**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags.\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * 512 - `_.flip`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n partials = holders = undefined;\n }\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n arity = arity === undefined ? arity : toInteger(arity);\n length -= holders ? holders.length : 0;\n\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n var partialsRight = partials,\n holdersRight = holders;\n\n partials = holders = undefined;\n }\n var data = isBindKey ? undefined : getData(func);\n\n var newData = [\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n argPos, ary, arity\n ];\n\n if (data) {\n mergeData(newData, data);\n }\n func = newData[0];\n bitmask = newData[1];\n thisArg = newData[2];\n partials = newData[3];\n holders = newData[4];\n arity = newData[9] = newData[9] === undefined\n ? (isBindKey ? 0 : func.length)\n : nativeMax(newData[9] - length, 0);\n\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n }\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n var result = createBind(func, bitmask, thisArg);\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n result = createCurry(func, bitmask, arity);\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n result = createPartial(func, bitmask, thisArg, partials);\n } else {\n result = createHybrid.apply(undefined, newData);\n }\n var setter = data ? baseSetData : setData;\n return setWrapToString(setter(result, newData), func, bitmask);\n }\n\n /**\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n * of source objects to the destination object for all destination properties\n * that resolve to `undefined`.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\n if (objValue === undefined ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n return srcValue;\n }\n return objValue;\n }\n\n /**\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n * objects into destination objects that are passed thru.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to merge.\n * @param {Object} object The parent object of `objValue`.\n * @param {Object} source The parent object of `srcValue`.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n if (isObject(objValue) && isObject(srcValue)) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, objValue);\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n stack['delete'](srcValue);\n }\n return objValue;\n }\n\n /**\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n * objects.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {string} key The key of the property to inspect.\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n */\n function customOmitClone(value) {\n return isPlainObject(value) ? undefined : value;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\n function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n function flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n }\n\n /**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n }\n\n /**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n }\n\n /**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\n var getData = !metaMap ? noop : function(func) {\n return metaMap.get(func);\n };\n\n /**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\n function getFuncName(func) {\n var result = (func.name + ''),\n array = realNames[result],\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n }\n\n /**\n * Gets the argument placeholder value for `func`.\n *\n * @private\n * @param {Function} func The function to inspect.\n * @returns {*} Returns the placeholder value.\n */\n function getHolder(func) {\n var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n return object.placeholder;\n }\n\n /**\n * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n * this function returns the custom method, otherwise it returns `baseIteratee`.\n * If arguments are provided, the chosen function is invoked with them and\n * its result is returned.\n *\n * @private\n * @param {*} [value] The value to convert to an iteratee.\n * @param {number} [arity] The arity of the created iteratee.\n * @returns {Function} Returns the chosen function or its result.\n */\n function getIteratee() {\n var result = lodash.iteratee || iteratee;\n result = result === iteratee ? baseIteratee : result;\n return arguments.length ? result(arguments[0], arguments[1]) : result;\n }\n\n /**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\n function getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n }\n\n /**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\n function getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n }\n\n /**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n function getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n }\n\n /**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\n function getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n }\n\n /**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n };\n\n /**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n };\n\n /**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n var getTag = baseGetTag;\n\n // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n }\n\n /**\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\n *\n * @private\n * @param {number} start The start of the view.\n * @param {number} end The end of the view.\n * @param {Array} transforms The transformations to apply to the view.\n * @returns {Object} Returns an object containing the `start` and `end`\n * positions of the view.\n */\n function getView(start, end, transforms) {\n var index = -1,\n length = transforms.length;\n\n while (++index < length) {\n var data = transforms[index],\n size = data.size;\n\n switch (data.type) {\n case 'drop': start += size; break;\n case 'dropRight': end -= size; break;\n case 'take': end = nativeMin(end, start + size); break;\n case 'takeRight': start = nativeMax(start, end - size); break;\n }\n }\n return { 'start': start, 'end': end };\n }\n\n /**\n * Extracts wrapper details from the `source` body comment.\n *\n * @private\n * @param {string} source The source to inspect.\n * @returns {Array} Returns the wrapper details.\n */\n function getWrapDetails(source) {\n var match = source.match(reWrapDetails);\n return match ? match[1].split(reSplitDetails) : [];\n }\n\n /**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\n function hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n }\n\n /**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\n function initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n }\n\n /**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n }\n\n /**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n }\n\n /**\n * Inserts wrapper `details` in a comment at the top of the `source` body.\n *\n * @private\n * @param {string} source The source to modify.\n * @returns {Array} details The details to insert.\n * @returns {string} Returns the modified source.\n */\n function insertWrapDetails(source, details) {\n var length = details.length;\n if (!length) {\n return source;\n }\n var lastIndex = length - 1;\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n details = details.join(length > 2 ? ', ' : ' ');\n return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n }\n\n /**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\n function isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n }\n\n /**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\n function isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n }\n\n /**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\n function isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n }\n\n /**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\n function isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n }\n\n /**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\n function isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n }\n\n /**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n * else `false`.\n */\n function isLaziable(func) {\n var funcName = getFuncName(func),\n other = lodash[funcName];\n\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n return false;\n }\n if (func === other) {\n return true;\n }\n var data = getData(other);\n return !!data && func === data[0];\n }\n\n /**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\n function isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n }\n\n /**\n * Checks if `func` is capable of being masked.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n */\n var isMaskable = coreJsData ? isFunction : stubFalse;\n\n /**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\n function isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n }\n\n /**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\n function isStrictComparable(value) {\n return value === value && !isObject(value);\n }\n\n /**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n }\n\n /**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\n function memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n }\n\n /**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers used to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and\n * `_.rearg` modify function arguments, making the order in which they are\n * executed important, preventing the merging of metadata. However, we make\n * an exception for a safe combined case where curried functions have `_.ary`\n * and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\n function mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n var isCombo =\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n // Exit early if metadata can't be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & WRAP_BIND_FLAG) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = value;\n }\n // Use source `ary` if it's smaller.\n if (srcBitmask & WRAP_ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n\n return data;\n }\n\n /**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\n function objectToString(value) {\n return nativeObjectToString.call(value);\n }\n\n /**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\n function overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n }\n\n /**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\n function parent(object, path) {\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n }\n\n /**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\n function reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin(indexes.length, arrLength),\n oldArray = copyArray(array);\n\n while (length--) {\n var index = indexes[length];\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n }\n\n /**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity\n * function to avoid garbage collection pauses in V8. See\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var setData = shortOut(baseSetData);\n\n /**\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n var setTimeout = ctxSetTimeout || function(func, wait) {\n return root.setTimeout(func, wait);\n };\n\n /**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var setToString = shortOut(baseSetToString);\n\n /**\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n * with wrapper details in a comment at the top of the source body.\n *\n * @private\n * @param {Function} wrapper The function to modify.\n * @param {Function} reference The reference function.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Function} Returns `wrapper`.\n */\n function setWrapToString(wrapper, reference, bitmask) {\n var source = (reference + '');\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n }\n\n /**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\n function shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n }\n\n /**\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @param {number} [size=array.length] The size of `array`.\n * @returns {Array} Returns `array`.\n */\n function shuffleSelf(array, size) {\n var index = -1,\n length = array.length,\n lastIndex = length - 1;\n\n size = size === undefined ? length : size;\n while (++index < size) {\n var rand = baseRandom(index, lastIndex),\n value = array[rand];\n\n array[rand] = array[index];\n array[index] = value;\n }\n array.length = size;\n return array;\n }\n\n /**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\n var stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n });\n\n /**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\n function toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\n function toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n }\n\n /**\n * Updates wrapper `details` based on `bitmask` flags.\n *\n * @private\n * @returns {Array} details The details to modify.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Array} Returns `details`.\n */\n function updateWrapDetails(details, bitmask) {\n arrayEach(wrapFlags, function(pair) {\n var value = '_.' + pair[0];\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n details.push(value);\n }\n });\n return details.sort();\n }\n\n /**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\n function wrapperClone(wrapper) {\n if (wrapper instanceof LazyWrapper) {\n return wrapper.clone();\n }\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n result.__actions__ = copyArray(wrapper.__actions__);\n result.__index__ = wrapper.__index__;\n result.__values__ = wrapper.__values__;\n return result;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\n function chunk(array, size, guard) {\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n size = 1;\n } else {\n size = nativeMax(toInteger(size), 0);\n }\n var length = array == null ? 0 : array.length;\n if (!length || size < 1) {\n return [];\n }\n var index = 0,\n resIndex = 0,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[resIndex++] = baseSlice(array, index, (index += size));\n }\n return result;\n }\n\n /**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\n function compact(array) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * Creates a new array concatenating `array` with any additional arrays\n * and/or values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to concatenate.\n * @param {...*} [values] The values to concatenate.\n * @returns {Array} Returns the new concatenated array.\n * @example\n *\n * var array = [1];\n * var other = _.concat(array, 2, [3], [[4]]);\n *\n * console.log(other);\n * // => [1, 2, 3, [4]]\n *\n * console.log(array);\n * // => [1]\n */\n function concat() {\n var length = arguments.length;\n if (!length) {\n return [];\n }\n var args = Array(length - 1),\n array = arguments[0],\n index = length;\n\n while (index--) {\n args[index - 1] = arguments[index];\n }\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n }\n\n /**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\n var difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `iteratee` which\n * is invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\n var differenceBy = baseRest(function(array, values) {\n var iteratee = last(values);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `comparator`\n * which is invoked to compare elements of `array` to `values`. The order and\n * references of result values are determined by the first array. The comparator\n * is invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n *\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }]\n */\n var differenceWith = baseRest(function(array, values) {\n var comparator = last(values);\n if (isArrayLikeObject(comparator)) {\n comparator = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n : [];\n });\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function drop(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.dropRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropRightWhile(users, ['active', false]);\n * // => objects for ['barney']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropRightWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\n function dropRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.dropWhile(users, function(o) { return !o.active; });\n * // => objects for ['pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropWhile(users, ['active', false]);\n * // => objects for ['pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\n function dropWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true)\n : [];\n }\n\n /**\n * Fills elements of `array` with `value` from `start` up to, but not\n * including, `end`.\n *\n * **Note:** This method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Array\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.fill(array, 'a');\n * console.log(array);\n * // => ['a', 'a', 'a']\n *\n * _.fill(Array(3), 2);\n * // => [2, 2, 2]\n *\n * _.fill([4, 6, 8, 10], '*', 1, 3);\n * // => [4, '*', '*', 10]\n */\n function fill(array, value, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n start = 0;\n end = length;\n }\n return baseFill(array, value, start, end);\n }\n\n /**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\n function findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index);\n }\n\n /**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n * // => 2\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n * // => 0\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastIndex(users, ['active', false]);\n * // => 2\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastIndex(users, 'active');\n * // => 0\n */\n function findLastIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length - 1;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = fromIndex < 0\n ? nativeMax(length + index, 0)\n : nativeMin(index, length - 1);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n }\n\n /**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\n function flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n }\n\n /**\n * Recursively flattens `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\n * // => [1, 2, 3, 4, 5]\n */\n function flattenDeep(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, INFINITY) : [];\n }\n\n /**\n * Recursively flatten `array` up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * var array = [1, [2, [3, [4]], 5]];\n *\n * _.flattenDepth(array, 1);\n * // => [1, 2, [3, [4]], 5]\n *\n * _.flattenDepth(array, 2);\n * // => [1, 2, 3, [4], 5]\n */\n function flattenDepth(array, depth) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(array, depth);\n }\n\n /**\n * The inverse of `_.toPairs`; this method returns an object composed\n * from key-value `pairs`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} pairs The key-value pairs.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.fromPairs([['a', 1], ['b', 2]]);\n * // => { 'a': 1, 'b': 2 }\n */\n function fromPairs(pairs) {\n var index = -1,\n length = pairs == null ? 0 : pairs.length,\n result = {};\n\n while (++index < length) {\n var pair = pairs[index];\n result[pair[0]] = pair[1];\n }\n return result;\n }\n\n /**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\n function head(array) {\n return (array && array.length) ? array[0] : undefined;\n }\n\n /**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */\n function indexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseIndexOf(array, value, index);\n }\n\n /**\n * Gets all but the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.initial([1, 2, 3]);\n * // => [1, 2]\n */\n function initial(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 0, -1) : [];\n }\n\n /**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\n var intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `iteratee`\n * which is invoked for each element of each `arrays` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [2.1]\n *\n * // The `_.property` iteratee shorthand.\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }]\n */\n var intersectionBy = baseRest(function(arrays) {\n var iteratee = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n if (iteratee === last(mapped)) {\n iteratee = undefined;\n } else {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `comparator`\n * which is invoked to compare elements of `arrays`. The order and references\n * of result values are determined by the first array. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.intersectionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }]\n */\n var intersectionWith = baseRest(function(arrays) {\n var comparator = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n comparator = typeof comparator == 'function' ? comparator : undefined;\n if (comparator) {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, undefined, comparator)\n : [];\n });\n\n /**\n * Converts all elements in `array` into a string separated by `separator`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to convert.\n * @param {string} [separator=','] The element separator.\n * @returns {string} Returns the joined string.\n * @example\n *\n * _.join(['a', 'b', 'c'], '~');\n * // => 'a~b~c'\n */\n function join(array, separator) {\n return array == null ? '' : nativeJoin.call(array, separator);\n }\n\n /**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\n function last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n }\n\n /**\n * This method is like `_.indexOf` except that it iterates over elements of\n * `array` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.lastIndexOf([1, 2, 1, 2], 2);\n * // => 3\n *\n * // Search from the `fromIndex`.\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n * // => 1\n */\n function lastIndexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n }\n return value === value\n ? strictLastIndexOf(array, value, index)\n : baseFindIndex(array, baseIsNaN, index, true);\n }\n\n /**\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\n * element from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.11.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=0] The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n *\n * _.nth(array, 1);\n * // => 'b'\n *\n * _.nth(array, -2);\n * // => 'c';\n */\n function nth(array, n) {\n return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n }\n\n /**\n * Removes all given values from `array` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n * to remove elements from an array by predicate.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...*} [values] The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pull(array, 'a', 'c');\n * console.log(array);\n * // => ['b', 'b']\n */\n var pull = baseRest(pullAll);\n\n /**\n * This method is like `_.pull` except that it accepts an array of values to remove.\n *\n * **Note:** Unlike `_.difference`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pullAll(array, ['a', 'c']);\n * console.log(array);\n * // => ['b', 'b']\n */\n function pullAll(array, values) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values)\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\n * invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The iteratee is invoked with one argument: (value).\n *\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n *\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n * console.log(array);\n * // => [{ 'x': 2 }]\n */\n function pullAllBy(array, values, iteratee) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, getIteratee(iteratee, 2))\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `comparator` which\n * is invoked to compare elements of `array` to `values`. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n *\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n * console.log(array);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n */\n function pullAllWith(array, values, comparator) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, undefined, comparator)\n : array;\n }\n\n /**\n * Removes elements from `array` corresponding to `indexes` and returns an\n * array of removed elements.\n *\n * **Note:** Unlike `_.at`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n * var pulled = _.pullAt(array, [1, 3]);\n *\n * console.log(array);\n * // => ['a', 'c']\n *\n * console.log(pulled);\n * // => ['b', 'd']\n */\n var pullAt = flatRest(function(array, indexes) {\n var length = array == null ? 0 : array.length,\n result = baseAt(array, indexes);\n\n basePullAt(array, arrayMap(indexes, function(index) {\n return isIndex(index, length) ? +index : index;\n }).sort(compareAscending));\n\n return result;\n });\n\n /**\n * Removes all elements from `array` that `predicate` returns truthy for\n * and returns an array of the removed elements. The predicate is invoked\n * with three arguments: (value, index, array).\n *\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n * to pull elements from an array by value.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4];\n * var evens = _.remove(array, function(n) {\n * return n % 2 == 0;\n * });\n *\n * console.log(array);\n * // => [1, 3]\n *\n * console.log(evens);\n * // => [2, 4]\n */\n function remove(array, predicate) {\n var result = [];\n if (!(array && array.length)) {\n return result;\n }\n var index = -1,\n indexes = [],\n length = array.length;\n\n predicate = getIteratee(predicate, 3);\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result.push(value);\n indexes.push(index);\n }\n }\n basePullAt(array, indexes);\n return result;\n }\n\n /**\n * Reverses `array` so that the first element becomes the last, the second\n * element becomes the second to last, and so on.\n *\n * **Note:** This method mutates `array` and is based on\n * [`Array#reverse`](https://mdn.io/Array/reverse).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.reverse(array);\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function reverse(array) {\n return array == null ? array : nativeReverse.call(array);\n }\n\n /**\n * Creates a slice of `array` from `start` up to, but not including, `end`.\n *\n * **Note:** This method is used instead of\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n * returned.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function slice(array, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n start = 0;\n end = length;\n }\n else {\n start = start == null ? 0 : toInteger(start);\n end = end === undefined ? length : toInteger(end);\n }\n return baseSlice(array, start, end);\n }\n\n /**\n * Uses a binary search to determine the lowest index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedIndex([30, 50], 40);\n * // => 1\n */\n function sortedIndex(array, value) {\n return baseSortedIndex(array, value);\n }\n\n /**\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n * // => 0\n */\n function sortedIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n }\n\n /**\n * This method is like `_.indexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n * // => 1\n */\n function sortedIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value);\n if (index < length && eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.sortedIndex` except that it returns the highest\n * index at which `value` should be inserted into `array` in order to\n * maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n * // => 4\n */\n function sortedLastIndex(array, value) {\n return baseSortedIndex(array, value, true);\n }\n\n /**\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 1\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n * // => 1\n */\n function sortedLastIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n }\n\n /**\n * This method is like `_.lastIndexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n * // => 3\n */\n function sortedLastIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value, true) - 1;\n if (eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.uniq` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniq([1, 1, 2]);\n * // => [1, 2]\n */\n function sortedUniq(array) {\n return (array && array.length)\n ? baseSortedUniq(array)\n : [];\n }\n\n /**\n * This method is like `_.uniqBy` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n * // => [1.1, 2.3]\n */\n function sortedUniqBy(array, iteratee) {\n return (array && array.length)\n ? baseSortedUniq(array, getIteratee(iteratee, 2))\n : [];\n }\n\n /**\n * Gets all but the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.tail([1, 2, 3]);\n * // => [2, 3]\n */\n function tail(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 1, length) : [];\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.take([1, 2, 3]);\n * // => [1]\n *\n * _.take([1, 2, 3], 2);\n * // => [1, 2]\n *\n * _.take([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.take([1, 2, 3], 0);\n * // => []\n */\n function take(array, n, guard) {\n if (!(array && array.length)) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRight([1, 2, 3]);\n * // => [3]\n *\n * _.takeRight([1, 2, 3], 2);\n * // => [2, 3]\n *\n * _.takeRight([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.takeRight([1, 2, 3], 0);\n * // => []\n */\n function takeRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.takeRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeRightWhile(users, ['active', false]);\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeRightWhile(users, 'active');\n * // => []\n */\n function takeRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), false, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.takeWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeWhile(users, ['active', false]);\n * // => objects for ['barney', 'fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeWhile(users, 'active');\n * // => []\n */\n function takeWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3))\n : [];\n }\n\n /**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\n var union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n });\n\n /**\n * This method is like `_.union` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which uniqueness is computed. Result values are chosen from the first\n * array in which the value occurs. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n var unionBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.union` except that it accepts `comparator` which\n * is invoked to compare elements of `arrays`. Result values are chosen from\n * the first array in which the value occurs. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.unionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\n var unionWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n });\n\n /**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\n function uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n function uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `comparator` which\n * is invoked to compare elements of `array`. The order of result values is\n * determined by the order they occur in the array.The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.uniqWith(objects, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */\n function uniqWith(array, comparator) {\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n }\n\n /**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @since 1.2.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n *\n * _.unzip(zipped);\n * // => [['a', 'b'], [1, 2], [true, false]]\n */\n function unzip(array) {\n if (!(array && array.length)) {\n return [];\n }\n var length = 0;\n array = arrayFilter(array, function(group) {\n if (isArrayLikeObject(group)) {\n length = nativeMax(group.length, length);\n return true;\n }\n });\n return baseTimes(length, function(index) {\n return arrayMap(array, baseProperty(index));\n });\n }\n\n /**\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\n * how regrouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * regrouped values.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * _.unzipWith(zipped, _.add);\n * // => [3, 30, 300]\n */\n function unzipWith(array, iteratee) {\n if (!(array && array.length)) {\n return [];\n }\n var result = unzip(array);\n if (iteratee == null) {\n return result;\n }\n return arrayMap(result, function(group) {\n return apply(iteratee, undefined, group);\n });\n }\n\n /**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\n var without = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, values)\n : [];\n });\n\n /**\n * Creates an array of unique values that is the\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the given arrays. The order of result values is determined by the order\n * they occur in the arrays.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.without\n * @example\n *\n * _.xor([2, 1], [2, 3]);\n * // => [1, 3]\n */\n var xor = baseRest(function(arrays) {\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which by which they're compared. The order of result values is determined\n * by the order they occur in the arrays. The iteratee is invoked with one\n * argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2, 3.4]\n *\n * // The `_.property` iteratee shorthand.\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\n var xorBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `comparator` which is\n * invoked to compare elements of `arrays`. The order of result values is\n * determined by the order they occur in the arrays. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.xorWith(objects, others, _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\n var xorWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n });\n\n /**\n * Creates an array of grouped elements, the first of which contains the\n * first elements of the given arrays, the second of which contains the\n * second elements of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n */\n var zip = baseRest(unzip);\n\n /**\n * This method is like `_.fromPairs` except that it accepts two arrays,\n * one of property identifiers and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 0.4.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject(['a', 'b'], [1, 2]);\n * // => { 'a': 1, 'b': 2 }\n */\n function zipObject(props, values) {\n return baseZipObject(props || [], values || [], assignValue);\n }\n\n /**\n * This method is like `_.zipObject` except that it supports property paths.\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n */\n function zipObjectDeep(props, values) {\n return baseZipObject(props || [], values || [], baseSet);\n }\n\n /**\n * This method is like `_.zip` except that it accepts `iteratee` to specify\n * how grouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * grouped values.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n * return a + b + c;\n * });\n * // => [111, 222]\n */\n var zipWith = baseRest(function(arrays) {\n var length = arrays.length,\n iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n return unzipWith(arrays, iteratee);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n * chain sequences enabled. The result of such sequences must be unwrapped\n * with `_#value`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Seq\n * @param {*} value The value to wrap.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'pebbles', 'age': 1 }\n * ];\n *\n * var youngest = _\n * .chain(users)\n * .sortBy('age')\n * .map(function(o) {\n * return o.user + ' is ' + o.age;\n * })\n * .head()\n * .value();\n * // => 'pebbles is 1'\n */\n function chain(value) {\n var result = lodash(value);\n result.__chain__ = true;\n return result;\n }\n\n /**\n * This method invokes `interceptor` and returns `value`. The interceptor\n * is invoked with one argument; (value). The purpose of this method is to\n * \"tap into\" a method chain sequence in order to modify intermediate results.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns `value`.\n * @example\n *\n * _([1, 2, 3])\n * .tap(function(array) {\n * // Mutate input array.\n * array.pop();\n * })\n * .reverse()\n * .value();\n * // => [2, 1]\n */\n function tap(value, interceptor) {\n interceptor(value);\n return value;\n }\n\n /**\n * This method is like `_.tap` except that it returns the result of `interceptor`.\n * The purpose of this method is to \"pass thru\" values replacing intermediate\n * results in a method chain sequence.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns the result of `interceptor`.\n * @example\n *\n * _(' abc ')\n * .chain()\n * .trim()\n * .thru(function(value) {\n * return [value];\n * })\n * .value();\n * // => ['abc']\n */\n function thru(value, interceptor) {\n return interceptor(value);\n }\n\n /**\n * This method is the wrapper version of `_.at`.\n *\n * @name at\n * @memberOf _\n * @since 1.0.0\n * @category Seq\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _(object).at(['a[0].b.c', 'a[1]']).value();\n * // => [3, 4]\n */\n var wrapperAt = flatRest(function(paths) {\n var length = paths.length,\n start = length ? paths[0] : 0,\n value = this.__wrapped__,\n interceptor = function(object) { return baseAt(object, paths); };\n\n if (length > 1 || this.__actions__.length ||\n !(value instanceof LazyWrapper) || !isIndex(start)) {\n return this.thru(interceptor);\n }\n value = value.slice(start, +start + (length ? 1 : 0));\n value.__actions__.push({\n 'func': thru,\n 'args': [interceptor],\n 'thisArg': undefined\n });\n return new LodashWrapper(value, this.__chain__).thru(function(array) {\n if (length && !array.length) {\n array.push(undefined);\n }\n return array;\n });\n });\n\n /**\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n *\n * @name chain\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * // A sequence without explicit chaining.\n * _(users).head();\n * // => { 'user': 'barney', 'age': 36 }\n *\n * // A sequence with explicit chaining.\n * _(users)\n * .chain()\n * .head()\n * .pick('user')\n * .value();\n * // => { 'user': 'barney' }\n */\n function wrapperChain() {\n return chain(this);\n }\n\n /**\n * Executes the chain sequence and returns the wrapped result.\n *\n * @name commit\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).push(3);\n *\n * console.log(array);\n * // => [1, 2]\n *\n * wrapped = wrapped.commit();\n * console.log(array);\n * // => [1, 2, 3]\n *\n * wrapped.last();\n * // => 3\n *\n * console.log(array);\n * // => [1, 2, 3]\n */\n function wrapperCommit() {\n return new LodashWrapper(this.value(), this.__chain__);\n }\n\n /**\n * Gets the next value on a wrapped object following the\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n *\n * @name next\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the next iterator value.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 1 }\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 2 }\n *\n * wrapped.next();\n * // => { 'done': true, 'value': undefined }\n */\n function wrapperNext() {\n if (this.__values__ === undefined) {\n this.__values__ = toArray(this.value());\n }\n var done = this.__index__ >= this.__values__.length,\n value = done ? undefined : this.__values__[this.__index__++];\n\n return { 'done': done, 'value': value };\n }\n\n /**\n * Enables the wrapper to be iterable.\n *\n * @name Symbol.iterator\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the wrapper object.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped[Symbol.iterator]() === wrapped;\n * // => true\n *\n * Array.from(wrapped);\n * // => [1, 2]\n */\n function wrapperToIterator() {\n return this;\n }\n\n /**\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\n *\n * @name plant\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @param {*} value The value to plant.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2]).map(square);\n * var other = wrapped.plant([3, 4]);\n *\n * other.value();\n * // => [9, 16]\n *\n * wrapped.value();\n * // => [1, 4]\n */\n function wrapperPlant(value) {\n var result,\n parent = this;\n\n while (parent instanceof baseLodash) {\n var clone = wrapperClone(parent);\n clone.__index__ = 0;\n clone.__values__ = undefined;\n if (result) {\n previous.__wrapped__ = clone;\n } else {\n result = clone;\n }\n var previous = clone;\n parent = parent.__wrapped__;\n }\n previous.__wrapped__ = value;\n return result;\n }\n\n /**\n * This method is the wrapper version of `_.reverse`.\n *\n * **Note:** This method mutates the wrapped array.\n *\n * @name reverse\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _(array).reverse().value()\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function wrapperReverse() {\n var value = this.__wrapped__;\n if (value instanceof LazyWrapper) {\n var wrapped = value;\n if (this.__actions__.length) {\n wrapped = new LazyWrapper(this);\n }\n wrapped = wrapped.reverse();\n wrapped.__actions__.push({\n 'func': thru,\n 'args': [reverse],\n 'thisArg': undefined\n });\n return new LodashWrapper(wrapped, this.__chain__);\n }\n return this.thru(reverse);\n }\n\n /**\n * Executes the chain sequence to resolve the unwrapped value.\n *\n * @name value\n * @memberOf _\n * @since 0.1.0\n * @alias toJSON, valueOf\n * @category Seq\n * @returns {*} Returns the resolved unwrapped value.\n * @example\n *\n * _([1, 2, 3]).value();\n * // => [1, 2, 3]\n */\n function wrapperValue() {\n return baseWrapperValue(this.__wrapped__, this.__actions__);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the number of times the key was returned by `iteratee`. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': 1, '6': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.countBy(['one', 'two', 'three'], 'length');\n * // => { '3': 2, '5': 1 }\n */\n var countBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n ++result[key];\n } else {\n baseAssignValue(result, key, 1);\n }\n });\n\n /**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\n function every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n */\n function filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\n var find = createFind(findIndex);\n\n /**\n * This method is like `_.find` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=collection.length-1] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(n) {\n * return n % 2 == 1;\n * });\n * // => 3\n */\n var findLast = createFind(findLastIndex);\n\n /**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDeep([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMapDeep(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), INFINITY);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDepth([1, 2], duplicate, 2);\n * // => [[1, 1], [2, 2]]\n */\n function flatMapDepth(collection, iteratee, depth) {\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(map(collection, iteratee), depth);\n }\n\n /**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forEach` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @alias eachRight\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEach\n * @example\n *\n * _.forEachRight([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `2` then `1`.\n */\n function forEachRight(collection, iteratee) {\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\n var groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n baseAssignValue(result, key, [value]);\n }\n });\n\n /**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\n function includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n }\n\n /**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `path` is a function, it's invoked\n * for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke each method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invokeMap([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */\n var invokeMap = baseRest(function(collection, path, args) {\n var index = -1,\n isFunc = typeof path == 'function',\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value) {\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n });\n return result;\n });\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the last element responsible for generating the key. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var array = [\n * { 'dir': 'left', 'code': 97 },\n * { 'dir': 'right', 'code': 100 }\n * ];\n *\n * _.keyBy(array, function(o) {\n * return String.fromCharCode(o.code);\n * });\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n *\n * _.keyBy(array, 'dir');\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n */\n var keyBy = createAggregator(function(result, value, key) {\n baseAssignValue(result, key, value);\n });\n\n /**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\n function map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n * descending or \"asc\" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 34 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n */\n function orderBy(collection, iteratees, orders, guard) {\n if (collection == null) {\n return [];\n }\n if (!isArray(iteratees)) {\n iteratees = iteratees == null ? [] : [iteratees];\n }\n orders = guard ? undefined : orders;\n if (!isArray(orders)) {\n orders = orders == null ? [] : [orders];\n }\n return baseOrderBy(collection, iteratees, orders);\n }\n\n /**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, the second of which\n * contains elements `predicate` returns falsey for. The predicate is\n * invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * _.partition(users, function(o) { return o.active; });\n * // => objects for [['fred'], ['barney', 'pebbles']]\n *\n * // The `_.matches` iteratee shorthand.\n * _.partition(users, { 'age': 1, 'active': false });\n * // => objects for [['pebbles'], ['barney', 'fred']]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.partition(users, ['active', false]);\n * // => objects for [['barney', 'pebbles'], ['fred']]\n *\n * // The `_.property` iteratee shorthand.\n * _.partition(users, 'active');\n * // => objects for [['fred'], ['barney', 'pebbles']]\n */\n var partition = createAggregator(function(result, value, key) {\n result[key ? 0 : 1].push(value);\n }, function() { return [[], []]; });\n\n /**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\n function reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n }\n\n /**\n * This method is like `_.reduce` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduce\n * @example\n *\n * var array = [[0, 1], [2, 3], [4, 5]];\n *\n * _.reduceRight(array, function(flattened, other) {\n * return flattened.concat(other);\n * }, []);\n * // => [4, 5, 2, 3, 0, 1]\n */\n function reduceRight(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n }\n\n /**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\n function reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(getIteratee(predicate, 3)));\n }\n\n /**\n * Gets a random element from `collection`.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n * @example\n *\n * _.sample([1, 2, 3, 4]);\n * // => 2\n */\n function sample(collection) {\n var func = isArray(collection) ? arraySample : baseSample;\n return func(collection);\n }\n\n /**\n * Gets `n` random elements at unique keys from `collection` up to the\n * size of `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @param {number} [n=1] The number of elements to sample.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the random elements.\n * @example\n *\n * _.sampleSize([1, 2, 3], 2);\n * // => [3, 1]\n *\n * _.sampleSize([1, 2, 3], 4);\n * // => [2, 3, 1]\n */\n function sampleSize(collection, n, guard) {\n if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n return func(collection, n);\n }\n\n /**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n * @example\n *\n * _.shuffle([1, 2, 3, 4]);\n * // => [4, 1, 3, 2]\n */\n function shuffle(collection) {\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\n return func(collection);\n }\n\n /**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable string keyed properties for objects.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the collection size.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */\n function size(collection) {\n if (collection == null) {\n return 0;\n }\n if (isArrayLike(collection)) {\n return isString(collection) ? stringSize(collection) : collection.length;\n }\n var tag = getTag(collection);\n if (tag == mapTag || tag == setTag) {\n return collection.size;\n }\n return baseKeys(collection).length;\n }\n\n /**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * Iteration is stopped once `predicate` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */\n function some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n */\n var sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\n var now = ctxNow || function() {\n return root.Date.now();\n };\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The opposite of `_.before`; this method creates a function that invokes\n * `func` once it's called `n` or more times.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {number} n The number of calls before `func` is invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var saves = ['profile', 'settings'];\n *\n * var done = _.after(saves.length, function() {\n * console.log('done saving!');\n * });\n *\n * _.forEach(saves, function(type) {\n * asyncSave({ 'type': type, 'complete': done });\n * });\n * // => Logs 'done saving!' after the two async saves have completed.\n */\n function after(n, func) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n < 1) {\n return func.apply(this, arguments);\n }\n };\n }\n\n /**\n * Creates a function that invokes `func`, with up to `n` arguments,\n * ignoring any additional arguments.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @param {number} [n=func.length] The arity cap.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n * // => [6, 8, 10]\n */\n function ary(func, n, guard) {\n n = guard ? undefined : n;\n n = (func && n == null) ? func.length : n;\n return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n }\n\n /**\n * Creates a function that invokes `func`, with the `this` binding and arguments\n * of the created function, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {number} n The number of calls at which `func` is no longer invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * jQuery(element).on('click', _.before(5, addContactToList));\n * // => Allows adding up to 4 contacts to the list.\n */\n function before(n, func) {\n var result;\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n > 0) {\n result = func.apply(this, arguments);\n }\n if (n <= 1) {\n func = undefined;\n }\n return result;\n };\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and `partials` prepended to the arguments it receives.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * function greet(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n *\n * var object = { 'user': 'fred' };\n *\n * var bound = _.bind(greet, object, 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bind(greet, object, _, '!');\n * bound('hi');\n * // => 'hi fred!'\n */\n var bind = baseRest(function(func, thisArg, partials) {\n var bitmask = WRAP_BIND_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bind));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(func, bitmask, thisArg, partials, holders);\n });\n\n /**\n * Creates a function that invokes the method at `object[key]` with `partials`\n * prepended to the arguments it receives.\n *\n * This method differs from `_.bind` by allowing bound functions to reference\n * methods that may be redefined or don't yet exist. See\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n * for more details.\n *\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Function\n * @param {Object} object The object to invoke the method on.\n * @param {string} key The key of the method.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var object = {\n * 'user': 'fred',\n * 'greet': function(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n * };\n *\n * var bound = _.bindKey(object, 'greet', 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * object.greet = function(greeting, punctuation) {\n * return greeting + 'ya ' + this.user + punctuation;\n * };\n *\n * bound('!');\n * // => 'hiya fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bindKey(object, 'greet', _, '!');\n * bound('hi');\n * // => 'hiya fred!'\n */\n var bindKey = baseRest(function(object, key, partials) {\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bindKey));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(key, bitmask, object, partials, holders);\n });\n\n /**\n * Creates a function that accepts arguments of `func` and either invokes\n * `func` returning its result, if at least `arity` number of arguments have\n * been provided, or returns a function that accepts the remaining `func`\n * arguments, and so on. The arity of `func` may be specified if `func.length`\n * is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */\n function curry(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curry.placeholder;\n return result;\n }\n\n /**\n * This method is like `_.curry` except that arguments are applied to `func`\n * in the manner of `_.partialRight` instead of `_.partial`.\n *\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curryRight(abc);\n *\n * curried(3)(2)(1);\n * // => [1, 2, 3]\n *\n * curried(2, 3)(1);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(3)(1, _)(2);\n * // => [1, 2, 3]\n */\n function curryRight(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curryRight.placeholder;\n return result;\n }\n\n /**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\n function debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n }\n\n /**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n * console.log(text);\n * }, 'deferred');\n * // => Logs 'deferred' after one millisecond.\n */\n var defer = baseRest(function(func, args) {\n return baseDelay(func, 1, args);\n });\n\n /**\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\n * provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.delay(function(text) {\n * console.log(text);\n * }, 1000, 'later');\n * // => Logs 'later' after one second.\n */\n var delay = baseRest(function(func, wait, args) {\n return baseDelay(func, toNumber(wait) || 0, args);\n });\n\n /**\n * Creates a function that invokes `func` with arguments reversed.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to flip arguments for.\n * @returns {Function} Returns the new flipped function.\n * @example\n *\n * var flipped = _.flip(function() {\n * return _.toArray(arguments);\n * });\n *\n * flipped('a', 'b', 'c', 'd');\n * // => ['d', 'c', 'b', 'a']\n */\n function flip(func) {\n return createWrap(func, WRAP_FLIP_FLAG);\n }\n\n /**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\n function memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n }\n\n // Expose `MapCache`.\n memoize.Cache = MapCache;\n\n /**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\n function negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n }\n\n /**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first invocation. The `func` is\n * invoked with the `this` binding and arguments of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // => `createApplication` is invoked once\n */\n function once(func) {\n return before(2, func);\n }\n\n /**\n * Creates a function that invokes `func` with its arguments transformed.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Function\n * @param {Function} func The function to wrap.\n * @param {...(Function|Function[])} [transforms=[_.identity]]\n * The argument transforms.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function doubled(n) {\n * return n * 2;\n * }\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var func = _.overArgs(function(x, y) {\n * return [x, y];\n * }, [square, doubled]);\n *\n * func(9, 3);\n * // => [81, 6]\n *\n * func(10, 5);\n * // => [100, 10]\n */\n var overArgs = castRest(function(func, transforms) {\n transforms = (transforms.length == 1 && isArray(transforms[0]))\n ? arrayMap(transforms[0], baseUnary(getIteratee()))\n : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n var funcsLength = transforms.length;\n return baseRest(function(args) {\n var index = -1,\n length = nativeMin(args.length, funcsLength);\n\n while (++index < length) {\n args[index] = transforms[index].call(this, args[index]);\n }\n return apply(func, this, args);\n });\n });\n\n /**\n * Creates a function that invokes `func` with `partials` prepended to the\n * arguments it receives. This method is like `_.bind` except it does **not**\n * alter the `this` binding.\n *\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 0.2.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var sayHelloTo = _.partial(greet, 'hello');\n * sayHelloTo('fred');\n * // => 'hello fred'\n *\n * // Partially applied with placeholders.\n * var greetFred = _.partial(greet, _, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n */\n var partial = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partial));\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n });\n\n /**\n * This method is like `_.partial` except that partially applied arguments\n * are appended to the arguments it receives.\n *\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var greetFred = _.partialRight(greet, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n *\n * // Partially applied with placeholders.\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\n * sayHelloTo('fred');\n * // => 'hello fred'\n */\n var partialRight = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partialRight));\n return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n });\n\n /**\n * Creates a function that invokes `func` with arguments arranged according\n * to the specified `indexes` where the argument value at the first index is\n * provided as the first argument, the argument value at the second index is\n * provided as the second argument, and so on.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to rearrange arguments for.\n * @param {...(number|number[])} indexes The arranged argument indexes.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var rearged = _.rearg(function(a, b, c) {\n * return [a, b, c];\n * }, [2, 0, 1]);\n *\n * rearged('b', 'c', 'a')\n * // => ['a', 'b', 'c']\n */\n var rearg = flatRest(function(func, indexes) {\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n });\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as\n * an array.\n *\n * **Note:** This method is based on the\n * [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\n function rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start === undefined ? start : toInteger(start);\n return baseRest(func, start);\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * create function and an array of arguments much like\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n *\n * **Note:** This method is based on the\n * [spread operator](https://mdn.io/spread_operator).\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Function\n * @param {Function} func The function to spread arguments over.\n * @param {number} [start=0] The start position of the spread.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.spread(function(who, what) {\n * return who + ' says ' + what;\n * });\n *\n * say(['fred', 'hello']);\n * // => 'fred says hello'\n *\n * var numbers = Promise.all([\n * Promise.resolve(40),\n * Promise.resolve(36)\n * ]);\n *\n * numbers.then(_.spread(function(x, y) {\n * return x + y;\n * }));\n * // => a Promise of 76\n */\n function spread(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start == null ? 0 : nativeMax(toInteger(start), 0);\n return baseRest(function(args) {\n var array = args[start],\n otherArgs = castSlice(args, 0, start);\n\n if (array) {\n arrayPush(otherArgs, array);\n }\n return apply(func, this, otherArgs);\n });\n }\n\n /**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\n function throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n }\n\n /**\n * Creates a function that accepts up to one argument, ignoring any\n * additional arguments.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.unary(parseInt));\n * // => [6, 8, 10]\n */\n function unary(func) {\n return ary(func, 1);\n }\n\n /**\n * Creates a function that provides `value` to `wrapper` as its first\n * argument. Any additional arguments provided to the function are appended\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n * binding of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {*} value The value to wrap.\n * @param {Function} [wrapper=identity] The wrapper function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var p = _.wrap(_.escape, function(func, text) {\n * return '<p>' + func(text) + '</p>';\n * });\n *\n * p('fred, barney, & pebbles');\n * // => '<p>fred, barney, &amp; pebbles</p>'\n */\n function wrap(value, wrapper) {\n return partial(castFunction(wrapper), value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Casts `value` as an array if it's not one.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Lang\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast array.\n * @example\n *\n * _.castArray(1);\n * // => [1]\n *\n * _.castArray({ 'a': 1 });\n * // => [{ 'a': 1 }]\n *\n * _.castArray('abc');\n * // => ['abc']\n *\n * _.castArray(null);\n * // => [null]\n *\n * _.castArray(undefined);\n * // => [undefined]\n *\n * _.castArray();\n * // => []\n *\n * var array = [1, 2, 3];\n * console.log(_.castArray(array) === array);\n * // => true\n */\n function castArray() {\n if (!arguments.length) {\n return [];\n }\n var value = arguments[0];\n return isArray(value) ? value : [value];\n }\n\n /**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\n function clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.clone` except that it accepts `customizer` which\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n * cloning is handled by the method instead. The `customizer` is invoked with\n * up to four arguments; (value [, index|key, object, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeepWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(false);\n * }\n * }\n *\n * var el = _.cloneWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 0\n */\n function cloneWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\n function cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.cloneWith` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the deep cloned value.\n * @see _.cloneWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(true);\n * }\n * }\n *\n * var el = _.cloneDeepWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 20\n */\n function cloneDeepWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * Checks if `object` conforms to `source` by invoking the predicate\n * properties of `source` with the corresponding property values of `object`.\n *\n * **Note:** This method is equivalent to `_.conforms` when `source` is\n * partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n * // => true\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n * // => false\n */\n function conformsTo(object, source) {\n return source == null || baseConformsTo(object, source, keys(source));\n }\n\n /**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\n function eq(value, other) {\n return value === other || (value !== value && other !== other);\n }\n\n /**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n * @see _.lt\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */\n var gt = createRelationalOperation(baseGt);\n\n /**\n * Checks if `value` is greater than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\n * `other`, else `false`.\n * @see _.lte\n * @example\n *\n * _.gte(3, 1);\n * // => true\n *\n * _.gte(3, 3);\n * // => true\n *\n * _.gte(1, 3);\n * // => false\n */\n var gte = createRelationalOperation(function(value, other) {\n return value >= other;\n });\n\n /**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n };\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\n var isArray = Array.isArray;\n\n /**\n * Checks if `value` is classified as an `ArrayBuffer` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n * @example\n *\n * _.isArrayBuffer(new ArrayBuffer(2));\n * // => true\n *\n * _.isArrayBuffer(new Array(2));\n * // => false\n */\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n /**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\n function isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n }\n\n /**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\n function isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n }\n\n /**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\n function isBoolean(value) {\n return value === true || value === false ||\n (isObjectLike(value) && baseGetTag(value) == boolTag);\n }\n\n /**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\n var isBuffer = nativeIsBuffer || stubFalse;\n\n /**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n /**\n * Checks if `value` is likely a DOM element.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('<body>');\n * // => false\n */\n function isElement(value) {\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n }\n\n /**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\n function isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\n function isEqual(value, other) {\n return baseIsEqual(value, other);\n }\n\n /**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */\n function isEqualWith(value, other, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n var result = customizer ? customizer(value, other) : undefined;\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n }\n\n /**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\n function isError(value) {\n if (!isObjectLike(value)) {\n return false;\n }\n var tag = baseGetTag(value);\n return tag == errorTag || tag == domExcTag ||\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n }\n\n /**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */\n function isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\n }\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n function isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n }\n\n /**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger('3');\n * // => false\n */\n function isInteger(value) {\n return typeof value == 'number' && value == toInteger(value);\n }\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\n function isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\n function isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n }\n\n /**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n function isObjectLike(value) {\n return value != null && typeof value == 'object';\n }\n\n /**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n /**\n * Performs a partial deep comparison between `object` and `source` to\n * determine if `object` contains equivalent property values.\n *\n * **Note:** This method is equivalent to `_.matches` when `source` is\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.isMatch(object, { 'b': 2 });\n * // => true\n *\n * _.isMatch(object, { 'b': 1 });\n * // => false\n */\n function isMatch(object, source) {\n return object === source || baseIsMatch(object, source, getMatchData(source));\n }\n\n /**\n * This method is like `_.isMatch` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with five\n * arguments: (objValue, srcValue, index|key, object, source).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, srcValue) {\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\n * return true;\n * }\n * }\n *\n * var object = { 'greeting': 'hello' };\n * var source = { 'greeting': 'hi' };\n *\n * _.isMatchWith(object, source, customizer);\n * // => true\n */\n function isMatchWith(object, source, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseIsMatch(object, source, getMatchData(source), customizer);\n }\n\n /**\n * Checks if `value` is `NaN`.\n *\n * **Note:** This method is based on\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n * `undefined` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\n function isNaN(value) {\n // An `NaN` primitive is the only value that is not equal to itself.\n // Perform the `toStringTag` check first to avoid errors with some\n // ActiveX objects in IE.\n return isNumber(value) && value != +value;\n }\n\n /**\n * Checks if `value` is a pristine native function.\n *\n * **Note:** This method can't reliably detect native functions in the presence\n * of the core-js package because core-js circumvents this kind of detection.\n * Despite multiple requests, the core-js maintainer has made it clear: any\n * attempt to fix the detection will be obstructed. As a result, we're left\n * with little choice but to throw an error. Unfortunately, this also affects\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n * which rely on core-js.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\n function isNative(value) {\n if (isMaskable(value)) {\n throw new Error(CORE_ERROR_TEXT);\n }\n return baseIsNative(value);\n }\n\n /**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */\n function isNull(value) {\n return value === null;\n }\n\n /**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\n function isNil(value) {\n return value == null;\n }\n\n /**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\n function isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n }\n\n /**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\n function isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n }\n\n /**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n /**\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n * double precision number which isn't the result of a rounded unsafe integer.\n *\n * **Note:** This method is based on\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n * @example\n *\n * _.isSafeInteger(3);\n * // => true\n *\n * _.isSafeInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isSafeInteger(Infinity);\n * // => false\n *\n * _.isSafeInteger('3');\n * // => false\n */\n function isSafeInteger(value) {\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n /**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\n function isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n }\n\n /**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\n function isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n }\n\n /**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n /**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\n function isUndefined(value) {\n return value === undefined;\n }\n\n /**\n * Checks if `value` is classified as a `WeakMap` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n * @example\n *\n * _.isWeakMap(new WeakMap);\n * // => true\n *\n * _.isWeakMap(new Map);\n * // => false\n */\n function isWeakMap(value) {\n return isObjectLike(value) && getTag(value) == weakMapTag;\n }\n\n /**\n * Checks if `value` is classified as a `WeakSet` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n * @example\n *\n * _.isWeakSet(new WeakSet);\n * // => true\n *\n * _.isWeakSet(new Set);\n * // => false\n */\n function isWeakSet(value) {\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n }\n\n /**\n * Checks if `value` is less than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n * @see _.gt\n * @example\n *\n * _.lt(1, 3);\n * // => true\n *\n * _.lt(3, 3);\n * // => false\n *\n * _.lt(3, 1);\n * // => false\n */\n var lt = createRelationalOperation(baseLt);\n\n /**\n * Checks if `value` is less than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than or equal to\n * `other`, else `false`.\n * @see _.gte\n * @example\n *\n * _.lte(1, 3);\n * // => true\n *\n * _.lte(3, 3);\n * // => true\n *\n * _.lte(3, 1);\n * // => false\n */\n var lte = createRelationalOperation(function(value, other) {\n return value <= other;\n });\n\n /**\n * Converts `value` to an array.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * _.toArray({ 'a': 1, 'b': 2 });\n * // => [1, 2]\n *\n * _.toArray('abc');\n * // => ['a', 'b', 'c']\n *\n * _.toArray(1);\n * // => []\n *\n * _.toArray(null);\n * // => []\n */\n function toArray(value) {\n if (!value) {\n return [];\n }\n if (isArrayLike(value)) {\n return isString(value) ? stringToArray(value) : copyArray(value);\n }\n if (symIterator && value[symIterator]) {\n return iteratorToArray(value[symIterator]());\n }\n var tag = getTag(value),\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n return func(value);\n }\n\n /**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\n function toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n }\n\n /**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\n function toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n }\n\n /**\n * Converts `value` to an integer suitable for use as the length of an\n * array-like object.\n *\n * **Note:** This method is based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toLength(3.2);\n * // => 3\n *\n * _.toLength(Number.MIN_VALUE);\n * // => 0\n *\n * _.toLength(Infinity);\n * // => 4294967295\n *\n * _.toLength('3.2');\n * // => 3\n */\n function toLength(value) {\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n }\n\n /**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\n function toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n }\n\n /**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\n function toPlainObject(value) {\n return copyObject(value, keysIn(value));\n }\n\n /**\n * Converts `value` to a safe integer. A safe integer can be compared and\n * represented correctly.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toSafeInteger(3.2);\n * // => 3\n *\n * _.toSafeInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toSafeInteger(Infinity);\n * // => 9007199254740991\n *\n * _.toSafeInteger('3.2');\n * // => 3\n */\n function toSafeInteger(value) {\n return value\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n : (value === 0 ? value : 0);\n }\n\n /**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\n function toString(value) {\n return value == null ? '' : baseToString(value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\n var assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n });\n\n /**\n * This method is like `_.assign` except that it iterates over own and\n * inherited source properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assign\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n */\n var assignIn = createAssigner(function(object, source) {\n copyObject(source, keysIn(source), object);\n });\n\n /**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n });\n\n /**\n * This method is like `_.assign` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignInWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keys(source), object, customizer);\n });\n\n /**\n * Creates an array of values corresponding to `paths` of `object`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Array} Returns the picked values.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _.at(object, ['a[0].b.c', 'a[1]']);\n * // => [3, 4]\n */\n var at = flatRest(baseAt);\n\n /**\n * Creates an object that inherits from the `prototype` object. If a\n * `properties` object is given, its own enumerable string keyed properties\n * are assigned to the created object.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Object\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * function Circle() {\n * Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, {\n * 'constructor': Circle\n * });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */\n function create(prototype, properties) {\n var result = baseCreate(prototype);\n return properties == null ? result : baseAssign(result, properties);\n }\n\n /**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n });\n\n /**\n * This method is like `_.defaults` except that it recursively assigns\n * default properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaults\n * @example\n *\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n * // => { 'a': { 'b': 2, 'c': 3 } }\n */\n var defaultsDeep = baseRest(function(args) {\n args.push(undefined, customDefaultsMerge);\n return apply(mergeWith, undefined, args);\n });\n\n /**\n * This method is like `_.find` except that it returns the key of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findKey(users, function(o) { return o.age < 40; });\n * // => 'barney' (iteration order is not guaranteed)\n *\n * // The `_.matches` iteratee shorthand.\n * _.findKey(users, { 'age': 1, 'active': true });\n * // => 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findKey(users, 'active');\n * // => 'barney'\n */\n function findKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n }\n\n /**\n * This method is like `_.findKey` except that it iterates over elements of\n * a collection in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findLastKey(users, function(o) { return o.age < 40; });\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastKey(users, { 'age': 36, 'active': true });\n * // => 'barney'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastKey(users, 'active');\n * // => 'pebbles'\n */\n function findLastKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n }\n\n /**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */\n function forIn(object, iteratee) {\n return object == null\n ? object\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * This method is like `_.forIn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forInRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n */\n function forInRight(object, iteratee) {\n return object == null\n ? object\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forOwn(object, iteratee) {\n return object && baseForOwn(object, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forOwn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwnRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n */\n function forOwnRight(object, iteratee) {\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an array of function property names from own enumerable properties\n * of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functionsIn\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functions(new Foo);\n * // => ['a', 'b']\n */\n function functions(object) {\n return object == null ? [] : baseFunctions(object, keys(object));\n }\n\n /**\n * Creates an array of function property names from own and inherited\n * enumerable properties of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functions\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functionsIn(new Foo);\n * // => ['a', 'b', 'c']\n */\n function functionsIn(object) {\n return object == null ? [] : baseFunctions(object, keysIn(object));\n }\n\n /**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\n function get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n }\n\n /**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\n function has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n }\n\n /**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\n function hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n }\n\n /**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite\n * property assignments of previous values.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Object\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n */\n var invert = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != 'function') {\n value = nativeObjectToString.call(value);\n }\n\n result[value] = key;\n }, constant(identity));\n\n /**\n * This method is like `_.invert` except that the inverted object is generated\n * from the results of running each element of `object` thru `iteratee`. The\n * corresponding inverted value of each inverted key is an array of keys\n * responsible for generating the inverted value. The iteratee is invoked\n * with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Object\n * @param {Object} object The object to invert.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invertBy(object);\n * // => { '1': ['a', 'c'], '2': ['b'] }\n *\n * _.invertBy(object, function(value) {\n * return 'group' + value;\n * });\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n */\n var invertBy = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != 'function') {\n value = nativeObjectToString.call(value);\n }\n\n if (hasOwnProperty.call(result, value)) {\n result[value].push(key);\n } else {\n result[value] = [key];\n }\n }, getIteratee);\n\n /**\n * Invokes the method at `path` of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n *\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n * // => [2, 3]\n */\n var invoke = baseRest(baseInvoke);\n\n /**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\n function keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n }\n\n /**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\n function keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n }\n\n /**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n * with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapValues\n * @example\n *\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n * return key + value;\n * });\n * // => { 'a1': 1, 'b2': 2 }\n */\n function mapKeys(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, iteratee(value, key, object), value);\n });\n return result;\n }\n\n /**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\n function mapValues(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n }\n\n /**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\n var merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n });\n\n /**\n * This method is like `_.merge` except that it accepts `customizer` which\n * is invoked to produce the merged values of the destination and source\n * properties. If `customizer` returns `undefined`, merging is handled by the\n * method instead. The `customizer` is invoked with six arguments:\n * (objValue, srcValue, key, object, source, stack).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function customizer(objValue, srcValue) {\n * if (_.isArray(objValue)) {\n * return objValue.concat(srcValue);\n * }\n * }\n *\n * var object = { 'a': [1], 'b': [2] };\n * var other = { 'a': [3], 'b': [4] };\n *\n * _.mergeWith(object, other, customizer);\n * // => { 'a': [1, 3], 'b': [2, 4] }\n */\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n baseMerge(object, source, srcIndex, customizer);\n });\n\n /**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omit(object, ['a', 'c']);\n * // => { 'b': '2' }\n */\n var omit = flatRest(function(object, paths) {\n var result = {};\n if (object == null) {\n return result;\n }\n var isDeep = false;\n paths = arrayMap(paths, function(path) {\n path = castPath(path, object);\n isDeep || (isDeep = path.length > 1);\n return path;\n });\n copyObject(object, getAllKeysIn(object), result);\n if (isDeep) {\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n }\n var length = paths.length;\n while (length--) {\n baseUnset(result, paths[length]);\n }\n return result;\n });\n\n /**\n * The opposite of `_.pickBy`; this method creates an object composed of\n * the own and inherited enumerable string keyed properties of `object` that\n * `predicate` doesn't return truthy for. The predicate is invoked with two\n * arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omitBy(object, _.isNumber);\n * // => { 'b': '2' }\n */\n function omitBy(object, predicate) {\n return pickBy(object, negate(getIteratee(predicate)));\n }\n\n /**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\n var pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n });\n\n /**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */\n function pickBy(object, predicate) {\n if (object == null) {\n return {};\n }\n var props = arrayMap(getAllKeysIn(object), function(prop) {\n return [prop];\n });\n predicate = getIteratee(predicate);\n return basePickBy(object, props, function(value, path) {\n return predicate(value, path[0]);\n });\n }\n\n /**\n * This method is like `_.get` except that if the resolved value is a\n * function it's invoked with the `this` binding of its parent object and\n * its result is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to resolve.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n *\n * _.result(object, 'a[0].b.c1');\n * // => 3\n *\n * _.result(object, 'a[0].b.c2');\n * // => 4\n *\n * _.result(object, 'a[0].b.c3', 'default');\n * // => 'default'\n *\n * _.result(object, 'a[0].b.c3', _.constant('default'));\n * // => 'default'\n */\n function result(object, path, defaultValue) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length;\n\n // Ensure the loop is entered when path is empty.\n if (!length) {\n length = 1;\n object = undefined;\n }\n while (++index < length) {\n var value = object == null ? undefined : object[toKey(path[index])];\n if (value === undefined) {\n index = length;\n value = defaultValue;\n }\n object = isFunction(value) ? value.call(object) : value;\n }\n return object;\n }\n\n /**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\n function set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\n }\n\n /**\n * This method is like `_.set` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.setWith(object, '[0][1]', 'a', Object);\n * // => { '0': { '1': 'a' } }\n */\n function setWith(object, path, value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return object == null ? object : baseSet(object, path, value, customizer);\n }\n\n /**\n * Creates an array of own enumerable string keyed-value pairs for `object`\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n * entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entries\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairs(new Foo);\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n */\n var toPairs = createToPairs(keys);\n\n /**\n * Creates an array of own and inherited enumerable string keyed-value pairs\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n * or set, its entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entriesIn\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairsIn(new Foo);\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n */\n var toPairsIn = createToPairs(keysIn);\n\n /**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */\n function transform(object, iteratee, accumulator) {\n var isArr = isArray(object),\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n iteratee = getIteratee(iteratee, 4);\n if (accumulator == null) {\n var Ctor = object && object.constructor;\n if (isArrLike) {\n accumulator = isArr ? new Ctor : [];\n }\n else if (isObject(object)) {\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n }\n else {\n accumulator = {};\n }\n }\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n return iteratee(accumulator, value, index, object);\n });\n return accumulator;\n }\n\n /**\n * Removes the property at `path` of `object`.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n * _.unset(object, 'a[0].b.c');\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n *\n * _.unset(object, ['a', '0', 'b', 'c']);\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n */\n function unset(object, path) {\n return object == null ? true : baseUnset(object, path);\n }\n\n /**\n * This method is like `_.set` except that accepts `updater` to produce the\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n * is invoked with one argument: (value).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n * console.log(object.a[0].b.c);\n * // => 9\n *\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n * console.log(object.x[0].y.z);\n * // => 0\n */\n function update(object, path, updater) {\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\n }\n\n /**\n * This method is like `_.update` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n * // => { '0': { '1': 'a' } }\n */\n function updateWith(object, path, updater, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n }\n\n /**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\n function values(object) {\n return object == null ? [] : baseValues(object, keys(object));\n }\n\n /**\n * Creates an array of the own and inherited enumerable string keyed property\n * values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.valuesIn(new Foo);\n * // => [1, 2, 3] (iteration order is not guaranteed)\n */\n function valuesIn(object) {\n return object == null ? [] : baseValues(object, keysIn(object));\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Number\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n * @example\n *\n * _.clamp(-10, -5, 5);\n * // => -5\n *\n * _.clamp(10, -5, 5);\n * // => 5\n */\n function clamp(number, lower, upper) {\n if (upper === undefined) {\n upper = lower;\n lower = undefined;\n }\n if (upper !== undefined) {\n upper = toNumber(upper);\n upper = upper === upper ? upper : 0;\n }\n if (lower !== undefined) {\n lower = toNumber(lower);\n lower = lower === lower ? lower : 0;\n }\n return baseClamp(toNumber(number), lower, upper);\n }\n\n /**\n * Checks if `n` is between `start` and up to, but not including, `end`. If\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\n * If `start` is greater than `end` the params are swapped to support\n * negative ranges.\n *\n * @static\n * @memberOf _\n * @since 3.3.0\n * @category Number\n * @param {number} number The number to check.\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n * @see _.range, _.rangeRight\n * @example\n *\n * _.inRange(3, 2, 4);\n * // => true\n *\n * _.inRange(4, 8);\n * // => true\n *\n * _.inRange(4, 2);\n * // => false\n *\n * _.inRange(2, 2);\n * // => false\n *\n * _.inRange(1.2, 2);\n * // => true\n *\n * _.inRange(5.2, 4);\n * // => false\n *\n * _.inRange(-3, -2, -6);\n * // => true\n */\n function inRange(number, start, end) {\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n number = toNumber(number);\n return baseInRange(number, start, end);\n }\n\n /**\n * Produces a random number between the inclusive `lower` and `upper` bounds.\n * If only one argument is provided a number between `0` and the given number\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\n * floats, a floating-point number is returned instead of an integer.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Number\n * @param {number} [lower=0] The lower bound.\n * @param {number} [upper=1] The upper bound.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */\n function random(lower, upper, floating) {\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n upper = floating = undefined;\n }\n if (floating === undefined) {\n if (typeof upper == 'boolean') {\n floating = upper;\n upper = undefined;\n }\n else if (typeof lower == 'boolean') {\n floating = lower;\n lower = undefined;\n }\n }\n if (lower === undefined && upper === undefined) {\n lower = 0;\n upper = 1;\n }\n else {\n lower = toFinite(lower);\n if (upper === undefined) {\n upper = lower;\n lower = 0;\n } else {\n upper = toFinite(upper);\n }\n }\n if (lower > upper) {\n var temp = lower;\n lower = upper;\n upper = temp;\n }\n if (floating || lower % 1 || upper % 1) {\n var rand = nativeRandom();\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n }\n return baseRandom(lower, upper);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\n var camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n });\n\n /**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\n function capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n }\n\n /**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\n function deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n }\n\n /**\n * Checks if `string` ends with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=string.length] The position to search up to.\n * @returns {boolean} Returns `true` if `string` ends with `target`,\n * else `false`.\n * @example\n *\n * _.endsWith('abc', 'c');\n * // => true\n *\n * _.endsWith('abc', 'b');\n * // => false\n *\n * _.endsWith('abc', 'b', 2);\n * // => true\n */\n function endsWith(string, target, position) {\n string = toString(string);\n target = baseToString(target);\n\n var length = string.length;\n position = position === undefined\n ? length\n : baseClamp(toInteger(position), 0, length);\n\n var end = position;\n position -= target.length;\n return position >= 0 && string.slice(position, end) == target;\n }\n\n /**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, &amp; pebbles'\n */\n function escape(string) {\n string = toString(string);\n return (string && reHasUnescapedHtml.test(string))\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\n : string;\n }\n\n /**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */\n function escapeRegExp(string) {\n string = toString(string);\n return (string && reHasRegExpChar.test(string))\n ? string.replace(reRegExpChar, '\\\\$&')\n : string;\n }\n\n /**\n * Converts `string` to\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the kebab cased string.\n * @example\n *\n * _.kebabCase('Foo Bar');\n * // => 'foo-bar'\n *\n * _.kebabCase('fooBar');\n * // => 'foo-bar'\n *\n * _.kebabCase('__FOO_BAR__');\n * // => 'foo-bar'\n */\n var kebabCase = createCompounder(function(result, word, index) {\n return result + (index ? '-' : '') + word.toLowerCase();\n });\n\n /**\n * Converts `string`, as space separated words, to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.lowerCase('--Foo-Bar--');\n * // => 'foo bar'\n *\n * _.lowerCase('fooBar');\n * // => 'foo bar'\n *\n * _.lowerCase('__FOO_BAR__');\n * // => 'foo bar'\n */\n var lowerCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + word.toLowerCase();\n });\n\n /**\n * Converts the first character of `string` to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.lowerFirst('Fred');\n * // => 'fred'\n *\n * _.lowerFirst('FRED');\n * // => 'fRED'\n */\n var lowerFirst = createCaseFirst('toLowerCase');\n\n /**\n * Pads `string` on the left and right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad('abc', 8);\n * // => ' abc '\n *\n * _.pad('abc', 8, '_-');\n * // => '_-abc_-_'\n *\n * _.pad('abc', 3);\n * // => 'abc'\n */\n function pad(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n if (!length || strLength >= length) {\n return string;\n }\n var mid = (length - strLength) / 2;\n return (\n createPadding(nativeFloor(mid), chars) +\n string +\n createPadding(nativeCeil(mid), chars)\n );\n }\n\n /**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padEnd('abc', 6);\n * // => 'abc '\n *\n * _.padEnd('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padEnd('abc', 3);\n * // => 'abc'\n */\n function padEnd(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (string + createPadding(length - strLength, chars))\n : string;\n }\n\n /**\n * Pads `string` on the left side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padStart('abc', 6);\n * // => ' abc'\n *\n * _.padStart('abc', 6, '_-');\n * // => '_-_abc'\n *\n * _.padStart('abc', 3);\n * // => 'abc'\n */\n function padStart(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (createPadding(length - strLength, chars) + string)\n : string;\n }\n\n /**\n * Converts `string` to an integer of the specified radix. If `radix` is\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n * hexadecimal, in which case a `radix` of `16` is used.\n *\n * **Note:** This method aligns with the\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category String\n * @param {string} string The string to convert.\n * @param {number} [radix=10] The radix to interpret `value` by.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.parseInt('08');\n * // => 8\n *\n * _.map(['6', '08', '10'], _.parseInt);\n * // => [6, 8, 10]\n */\n function parseInt(string, radix, guard) {\n if (guard || radix == null) {\n radix = 0;\n } else if (radix) {\n radix = +radix;\n }\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n }\n\n /**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to repeat.\n * @param {number} [n=1] The number of times to repeat the string.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat('*', 3);\n * // => '***'\n *\n * _.repeat('abc', 2);\n * // => 'abcabc'\n *\n * _.repeat('abc', 0);\n * // => ''\n */\n function repeat(string, n, guard) {\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n return baseRepeat(toString(string), n);\n }\n\n /**\n * Replaces matches for `pattern` in `string` with `replacement`.\n *\n * **Note:** This method is based on\n * [`String#replace`](https://mdn.io/String/replace).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to modify.\n * @param {RegExp|string} pattern The pattern to replace.\n * @param {Function|string} replacement The match replacement.\n * @returns {string} Returns the modified string.\n * @example\n *\n * _.replace('Hi Fred', 'Fred', 'Barney');\n * // => 'Hi Barney'\n */\n function replace() {\n var args = arguments,\n string = toString(args[0]);\n\n return args.length < 3 ? string : string.replace(args[1], args[2]);\n }\n\n /**\n * Converts `string` to\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the snake cased string.\n * @example\n *\n * _.snakeCase('Foo Bar');\n * // => 'foo_bar'\n *\n * _.snakeCase('fooBar');\n * // => 'foo_bar'\n *\n * _.snakeCase('--FOO-BAR--');\n * // => 'foo_bar'\n */\n var snakeCase = createCompounder(function(result, word, index) {\n return result + (index ? '_' : '') + word.toLowerCase();\n });\n\n /**\n * Splits `string` by `separator`.\n *\n * **Note:** This method is based on\n * [`String#split`](https://mdn.io/String/split).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to split.\n * @param {RegExp|string} separator The separator pattern to split by.\n * @param {number} [limit] The length to truncate results to.\n * @returns {Array} Returns the string segments.\n * @example\n *\n * _.split('a-b-c', '-', 2);\n * // => ['a', 'b']\n */\n function split(string, separator, limit) {\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n separator = limit = undefined;\n }\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n if (!limit) {\n return [];\n }\n string = toString(string);\n if (string && (\n typeof separator == 'string' ||\n (separator != null && !isRegExp(separator))\n )) {\n separator = baseToString(separator);\n if (!separator && hasUnicode(string)) {\n return castSlice(stringToArray(string), 0, limit);\n }\n }\n return string.split(separator, limit);\n }\n\n /**\n * Converts `string` to\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @since 3.1.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar--');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__FOO_BAR__');\n * // => 'FOO BAR'\n */\n var startCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + upperFirst(word);\n });\n\n /**\n * Checks if `string` starts with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=0] The position to search from.\n * @returns {boolean} Returns `true` if `string` starts with `target`,\n * else `false`.\n * @example\n *\n * _.startsWith('abc', 'a');\n * // => true\n *\n * _.startsWith('abc', 'b');\n * // => false\n *\n * _.startsWith('abc', 'b', 1);\n * // => true\n */\n function startsWith(string, target, position) {\n string = toString(string);\n position = position == null\n ? 0\n : baseClamp(toInteger(position), 0, string.length);\n\n target = baseToString(target);\n return string.slice(position, position + target.length) == target;\n }\n\n /**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is given, it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options={}] The options object.\n * @param {RegExp} [options.escape=_.templateSettings.escape]\n * The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n * The \"evaluate\" delimiter.\n * @param {Object} [options.imports=_.templateSettings.imports]\n * An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n * The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\n * The sourceURL of the compiled template.\n * @param {string} [options.variable='obj']\n * The data object variable name.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // Use the \"interpolate\" delimiter to create a compiled template.\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // Use the HTML \"escape\" delimiter to escape data property values.\n * var compiled = _.template('<b><%- value %></b>');\n * compiled({ 'value': '<script>' });\n * // => '<b>&lt;script&gt;</b>'\n *\n * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n * compiled({ 'users': ['fred', 'barney'] });\n * // => '<li>fred</li><li>barney</li>'\n *\n * // Use the internal `print` function in \"evaluate\" delimiters.\n * var compiled = _.template('<% print(\"hello \" + user); %>!');\n * compiled({ 'user': 'barney' });\n * // => 'hello barney!'\n *\n * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n * // Disable support by replacing the \"interpolate\" delimiter.\n * var compiled = _.template('hello ${ user }!');\n * compiled({ 'user': 'pebbles' });\n * // => 'hello pebbles!'\n *\n * // Use backslashes to treat delimiters as plain text.\n * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n * compiled({ 'value': 'ignored' });\n * // => '<%- value %>'\n *\n * // Use the `imports` option to import `jQuery` as `jq`.\n * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n * compiled({ 'users': ['fred', 'barney'] });\n * // => '<li>fred</li><li>barney</li>'\n *\n * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n * compiled(data);\n * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n *\n * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n * compiled.source;\n * // => function(data) {\n * // var __t, __p = '';\n * // __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n * // return __p;\n * // }\n *\n * // Use custom template delimiters.\n * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n * var compiled = _.template('hello {{ user }}!');\n * compiled({ 'user': 'mustache' });\n * // => 'hello mustache!'\n *\n * // Use the `source` property to inline compiled templates for meaningful\n * // line numbers in error messages and stack traces.\n * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n * var JST = {\\\n * \"main\": ' + _.template(mainText).source + '\\\n * };\\\n * ');\n */\n function template(string, options, guard) {\n // Based on John Resig's `tmpl` implementation\n // (http://ejohn.org/blog/javascript-micro-templating/)\n // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n var settings = lodash.templateSettings;\n\n if (guard && isIterateeCall(string, options, guard)) {\n options = undefined;\n }\n string = toString(string);\n options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n importsKeys = keys(imports),\n importsValues = baseValues(imports, importsKeys);\n\n var isEscaping,\n isEvaluating,\n index = 0,\n interpolate = options.interpolate || reNoMatch,\n source = \"__p += '\";\n\n // Compile the regexp to match each delimiter.\n var reDelimiters = RegExp(\n (options.escape || reNoMatch).source + '|' +\n interpolate.source + '|' +\n (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n (options.evaluate || reNoMatch).source + '|$'\n , 'g');\n\n // Use a sourceURL for easier debugging.\n var sourceURL = '//# sourceURL=' +\n ('sourceURL' in options\n ? options.sourceURL\n : ('lodash.templateSources[' + (++templateCounter) + ']')\n ) + '\\n';\n\n string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n interpolateValue || (interpolateValue = esTemplateValue);\n\n // Escape characters that can't be included in string literals.\n source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n // Replace delimiters with snippets.\n if (escapeValue) {\n isEscaping = true;\n source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n }\n if (evaluateValue) {\n isEvaluating = true;\n source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n }\n if (interpolateValue) {\n source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n }\n index = offset + match.length;\n\n // The JS engine embedded in Adobe products needs `match` returned in\n // order to produce the correct `offset` value.\n return match;\n });\n\n source += \"';\\n\";\n\n // If `variable` is not specified wrap a with-statement around the generated\n // code to add the data object to the top of the scope chain.\n var variable = options.variable;\n if (!variable) {\n source = 'with (obj) {\\n' + source + '\\n}\\n';\n }\n // Cleanup code by stripping empty strings.\n source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n .replace(reEmptyStringMiddle, '$1')\n .replace(reEmptyStringTrailing, '$1;');\n\n // Frame code as the function body.\n source = 'function(' + (variable || 'obj') + ') {\\n' +\n (variable\n ? ''\n : 'obj || (obj = {});\\n'\n ) +\n \"var __t, __p = ''\" +\n (isEscaping\n ? ', __e = _.escape'\n : ''\n ) +\n (isEvaluating\n ? ', __j = Array.prototype.join;\\n' +\n \"function print() { __p += __j.call(arguments, '') }\\n\"\n : ';\\n'\n ) +\n source +\n 'return __p\\n}';\n\n var result = attempt(function() {\n return Function(importsKeys, sourceURL + 'return ' + source)\n .apply(undefined, importsValues);\n });\n\n // Provide the compiled function's source by its `toString` method or\n // the `source` property as a convenience for inlining compiled templates.\n result.source = source;\n if (isError(result)) {\n throw result;\n }\n return result;\n }\n\n /**\n * Converts `string`, as a whole, to lower case just like\n * [String#toLowerCase](https://mdn.io/toLowerCase).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.toLower('--Foo-Bar--');\n * // => '--foo-bar--'\n *\n * _.toLower('fooBar');\n * // => 'foobar'\n *\n * _.toLower('__FOO_BAR__');\n * // => '__foo_bar__'\n */\n function toLower(value) {\n return toString(value).toLowerCase();\n }\n\n /**\n * Converts `string`, as a whole, to upper case just like\n * [String#toUpperCase](https://mdn.io/toUpperCase).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the upper cased string.\n * @example\n *\n * _.toUpper('--foo-bar--');\n * // => '--FOO-BAR--'\n *\n * _.toUpper('fooBar');\n * // => 'FOOBAR'\n *\n * _.toUpper('__foo_bar__');\n * // => '__FOO_BAR__'\n */\n function toUpper(value) {\n return toString(value).toUpperCase();\n }\n\n /**\n * Removes leading and trailing whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trim(' abc ');\n * // => 'abc'\n *\n * _.trim('-_-abc-_-', '_-');\n * // => 'abc'\n *\n * _.map([' foo ', ' bar '], _.trim);\n * // => ['foo', 'bar']\n */\n function trim(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return string.replace(reTrim, '');\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n chrSymbols = stringToArray(chars),\n start = charsStartIndex(strSymbols, chrSymbols),\n end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n return castSlice(strSymbols, start, end).join('');\n }\n\n /**\n * Removes trailing whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimEnd(' abc ');\n * // => ' abc'\n *\n * _.trimEnd('-_-abc-_-', '_-');\n * // => '-_-abc'\n */\n function trimEnd(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return string.replace(reTrimEnd, '');\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n return castSlice(strSymbols, 0, end).join('');\n }\n\n /**\n * Removes leading whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimStart(' abc ');\n * // => 'abc '\n *\n * _.trimStart('-_-abc-_-', '_-');\n * // => 'abc-_-'\n */\n function trimStart(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return string.replace(reTrimStart, '');\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n start = charsStartIndex(strSymbols, stringToArray(chars));\n\n return castSlice(strSymbols, start).join('');\n }\n\n /**\n * Truncates `string` if it's longer than the given maximum string length.\n * The last characters of the truncated string are replaced with the omission\n * string which defaults to \"...\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to truncate.\n * @param {Object} [options={}] The options object.\n * @param {number} [options.length=30] The maximum string length.\n * @param {string} [options.omission='...'] The string to indicate text is omitted.\n * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n * @returns {string} Returns the truncated string.\n * @example\n *\n * _.truncate('hi-diddly-ho there, neighborino');\n * // => 'hi-diddly-ho there, neighbo...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'length': 24,\n * 'separator': ' '\n * });\n * // => 'hi-diddly-ho there,...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'length': 24,\n * 'separator': /,? +/\n * });\n * // => 'hi-diddly-ho there...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'omission': ' [...]'\n * });\n * // => 'hi-diddly-ho there, neig [...]'\n */\n function truncate(string, options) {\n var length = DEFAULT_TRUNC_LENGTH,\n omission = DEFAULT_TRUNC_OMISSION;\n\n if (isObject(options)) {\n var separator = 'separator' in options ? options.separator : separator;\n length = 'length' in options ? toInteger(options.length) : length;\n omission = 'omission' in options ? baseToString(options.omission) : omission;\n }\n string = toString(string);\n\n var strLength = string.length;\n if (hasUnicode(string)) {\n var strSymbols = stringToArray(string);\n strLength = strSymbols.length;\n }\n if (length >= strLength) {\n return string;\n }\n var end = length - stringSize(omission);\n if (end < 1) {\n return omission;\n }\n var result = strSymbols\n ? castSlice(strSymbols, 0, end).join('')\n : string.slice(0, end);\n\n if (separator === undefined) {\n return result + omission;\n }\n if (strSymbols) {\n end += (result.length - end);\n }\n if (isRegExp(separator)) {\n if (string.slice(end).search(separator)) {\n var match,\n substring = result;\n\n if (!separator.global) {\n separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n }\n separator.lastIndex = 0;\n while ((match = separator.exec(substring))) {\n var newEnd = match.index;\n }\n result = result.slice(0, newEnd === undefined ? end : newEnd);\n }\n } else if (string.indexOf(baseToString(separator), end) != end) {\n var index = result.lastIndexOf(separator);\n if (index > -1) {\n result = result.slice(0, index);\n }\n }\n return result + omission;\n }\n\n /**\n * The inverse of `_.escape`; this method converts the HTML entities\n * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n * their corresponding characters.\n *\n * **Note:** No other HTML entities are unescaped. To unescape additional\n * HTML entities use a third-party library like [_he_](https://mths.be/he).\n *\n * @static\n * @memberOf _\n * @since 0.6.0\n * @category String\n * @param {string} [string=''] The string to unescape.\n * @returns {string} Returns the unescaped string.\n * @example\n *\n * _.unescape('fred, barney, &amp; pebbles');\n * // => 'fred, barney, & pebbles'\n */\n function unescape(string) {\n string = toString(string);\n return (string && reHasEscapedHtml.test(string))\n ? string.replace(reEscapedHtml, unescapeHtmlChar)\n : string;\n }\n\n /**\n * Converts `string`, as space separated words, to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the upper cased string.\n * @example\n *\n * _.upperCase('--foo-bar');\n * // => 'FOO BAR'\n *\n * _.upperCase('fooBar');\n * // => 'FOO BAR'\n *\n * _.upperCase('__foo_bar__');\n * // => 'FOO BAR'\n */\n var upperCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + word.toUpperCase();\n });\n\n /**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\n var upperFirst = createCaseFirst('toUpperCase');\n\n /**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\n function words(string, pattern, guard) {\n string = toString(string);\n pattern = guard ? undefined : pattern;\n\n if (pattern === undefined) {\n return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n }\n return string.match(pattern) || [];\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Attempts to invoke `func`, returning either the result or the caught error\n * object. Any additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Function} func The function to attempt.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {*} Returns the `func` result or error object.\n * @example\n *\n * // Avoid throwing errors for invalid selectors.\n * var elements = _.attempt(function(selector) {\n * return document.querySelectorAll(selector);\n * }, '>_>');\n *\n * if (_.isError(elements)) {\n * elements = [];\n * }\n */\n var attempt = baseRest(function(func, args) {\n try {\n return apply(func, undefined, args);\n } catch (e) {\n return isError(e) ? e : new Error(e);\n }\n });\n\n /**\n * Binds methods of an object to the object itself, overwriting the existing\n * method.\n *\n * **Note:** This method doesn't set the \"length\" property of bound functions.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {Object} object The object to bind and assign the bound methods to.\n * @param {...(string|string[])} methodNames The object method names to bind.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var view = {\n * 'label': 'docs',\n * 'click': function() {\n * console.log('clicked ' + this.label);\n * }\n * };\n *\n * _.bindAll(view, ['click']);\n * jQuery(element).on('click', view.click);\n * // => Logs 'clicked docs' when clicked.\n */\n var bindAll = flatRest(function(object, methodNames) {\n arrayEach(methodNames, function(key) {\n key = toKey(key);\n baseAssignValue(object, key, bind(object[key], object));\n });\n return object;\n });\n\n /**\n * Creates a function that iterates over `pairs` and invokes the corresponding\n * function of the first predicate to return truthy. The predicate-function\n * pairs are invoked with the `this` binding and arguments of the created\n * function.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {Array} pairs The predicate-function pairs.\n * @returns {Function} Returns the new composite function.\n * @example\n *\n * var func = _.cond([\n * [_.matches({ 'a': 1 }), _.constant('matches A')],\n * [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n * [_.stubTrue, _.constant('no match')]\n * ]);\n *\n * func({ 'a': 1, 'b': 2 });\n * // => 'matches A'\n *\n * func({ 'a': 0, 'b': 1 });\n * // => 'matches B'\n *\n * func({ 'a': '1', 'b': '2' });\n * // => 'no match'\n */\n function cond(pairs) {\n var length = pairs == null ? 0 : pairs.length,\n toIteratee = getIteratee();\n\n pairs = !length ? [] : arrayMap(pairs, function(pair) {\n if (typeof pair[1] != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return [toIteratee(pair[0]), pair[1]];\n });\n\n return baseRest(function(args) {\n var index = -1;\n while (++index < length) {\n var pair = pairs[index];\n if (apply(pair[0], this, args)) {\n return apply(pair[1], this, args);\n }\n }\n });\n }\n\n /**\n * Creates a function that invokes the predicate properties of `source` with\n * the corresponding property values of a given object, returning `true` if\n * all predicates return truthy, else `false`.\n *\n * **Note:** The created function is equivalent to `_.conformsTo` with\n * `source` partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n * { 'a': 2, 'b': 1 },\n * { 'a': 1, 'b': 2 }\n * ];\n *\n * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n * // => [{ 'a': 1, 'b': 2 }]\n */\n function conforms(source) {\n return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n }\n\n /**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\n function constant(value) {\n return function() {\n return value;\n };\n }\n\n /**\n * Checks `value` to determine whether a default value should be returned in\n * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n * or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Util\n * @param {*} value The value to check.\n * @param {*} defaultValue The default value.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * _.defaultTo(1, 10);\n * // => 1\n *\n * _.defaultTo(undefined, 10);\n * // => 10\n */\n function defaultTo(value, defaultValue) {\n return (value == null || value !== value) ? defaultValue : value;\n }\n\n /**\n * Creates a function that returns the result of invoking the given functions\n * with the `this` binding of the created function, where each successive\n * invocation is supplied the return value of the previous.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flowRight\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var addSquare = _.flow([_.add, square]);\n * addSquare(1, 2);\n * // => 9\n */\n var flow = createFlow();\n\n /**\n * This method is like `_.flow` except that it creates a function that\n * invokes the given functions from right to left.\n *\n * @static\n * @since 3.0.0\n * @memberOf _\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flow\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var addSquare = _.flowRight([square, _.add]);\n * addSquare(1, 2);\n * // => 9\n */\n var flowRight = createFlow(true);\n\n /**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\n function identity(value) {\n return value;\n }\n\n /**\n * Creates a function that invokes `func` with the arguments of the created\n * function. If `func` is a property name, the created function returns the\n * property value for a given element. If `func` is an array or object, the\n * created function returns `true` for elements that contain the equivalent\n * source properties, otherwise it returns `false`.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Util\n * @param {*} [func=_.identity] The value to convert to a callback.\n * @returns {Function} Returns the callback.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, _.iteratee(['user', 'fred']));\n * // => [{ 'user': 'fred', 'age': 40 }]\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, _.iteratee('user'));\n * // => ['barney', 'fred']\n *\n * // Create custom iteratee shorthands.\n * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n * return !_.isRegExp(func) ? iteratee(func) : function(string) {\n * return func.test(string);\n * };\n * });\n *\n * _.filter(['abc', 'def'], /ef/);\n * // => ['def']\n */\n function iteratee(func) {\n return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n }\n\n /**\n * Creates a function that performs a partial deep comparison between a given\n * object and `source`, returning `true` if the given object has equivalent\n * property values, else `false`.\n *\n * **Note:** The created function is equivalent to `_.isMatch` with `source`\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n * { 'a': 1, 'b': 2, 'c': 3 },\n * { 'a': 4, 'b': 5, 'c': 6 }\n * ];\n *\n * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n */\n function matches(source) {\n return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n }\n\n /**\n * Creates a function that performs a partial deep comparison between the\n * value at `path` of a given object to `srcValue`, returning `true` if the\n * object value is equivalent, else `false`.\n *\n * **Note:** Partial comparisons will match empty array and empty object\n * `srcValue` values against any array or object value, respectively. See\n * `_.isEqual` for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n * { 'a': 1, 'b': 2, 'c': 3 },\n * { 'a': 4, 'b': 5, 'c': 6 }\n * ];\n *\n * _.find(objects, _.matchesProperty('a', 4));\n * // => { 'a': 4, 'b': 5, 'c': 6 }\n */\n function matchesProperty(path, srcValue) {\n return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n }\n\n /**\n * Creates a function that invokes the method at `path` of a given object.\n * Any additional arguments are provided to the invoked method.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Util\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {Function} Returns the new invoker function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': _.constant(2) } },\n * { 'a': { 'b': _.constant(1) } }\n * ];\n *\n * _.map(objects, _.method('a.b'));\n * // => [2, 1]\n *\n * _.map(objects, _.method(['a', 'b']));\n * // => [2, 1]\n */\n var method = baseRest(function(path, args) {\n return function(object) {\n return baseInvoke(object, path, args);\n };\n });\n\n /**\n * The opposite of `_.method`; this method creates a function that invokes\n * the method at a given path of `object`. Any additional arguments are\n * provided to the invoked method.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Util\n * @param {Object} object The object to query.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {Function} Returns the new invoker function.\n * @example\n *\n * var array = _.times(3, _.constant),\n * object = { 'a': array, 'b': array, 'c': array };\n *\n * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n * // => [2, 0]\n *\n * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n * // => [2, 0]\n */\n var methodOf = baseRest(function(object, args) {\n return function(path) {\n return baseInvoke(object, path, args);\n };\n });\n\n /**\n * Adds all own enumerable string keyed function properties of a source\n * object to the destination object. If `object` is a function, then methods\n * are added to its prototype as well.\n *\n * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n * avoid conflicts caused by modifying the original.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {Function|Object} [object=lodash] The destination object.\n * @param {Object} source The object of functions to add.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n * @returns {Function|Object} Returns `object`.\n * @example\n *\n * function vowels(string) {\n * return _.filter(string, function(v) {\n * return /[aeiou]/i.test(v);\n * });\n * }\n *\n * _.mixin({ 'vowels': vowels });\n * _.vowels('fred');\n * // => ['e']\n *\n * _('fred').vowels().value();\n * // => ['e']\n *\n * _.mixin({ 'vowels': vowels }, { 'chain': false });\n * _('fred').vowels();\n * // => ['e']\n */\n function mixin(object, source, options) {\n var props = keys(source),\n methodNames = baseFunctions(source, props);\n\n if (options == null &&\n !(isObject(source) && (methodNames.length || !props.length))) {\n options = source;\n source = object;\n object = this;\n methodNames = baseFunctions(source, keys(source));\n }\n var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n isFunc = isFunction(object);\n\n arrayEach(methodNames, function(methodName) {\n var func = source[methodName];\n object[methodName] = func;\n if (isFunc) {\n object.prototype[methodName] = function() {\n var chainAll = this.__chain__;\n if (chain || chainAll) {\n var result = object(this.__wrapped__),\n actions = result.__actions__ = copyArray(this.__actions__);\n\n actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n result.__chain__ = chainAll;\n return result;\n }\n return func.apply(object, arrayPush([this.value()], arguments));\n };\n }\n });\n\n return object;\n }\n\n /**\n * Reverts the `_` variable to its previous value and returns a reference to\n * the `lodash` function.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @returns {Function} Returns the `lodash` function.\n * @example\n *\n * var lodash = _.noConflict();\n */\n function noConflict() {\n if (root._ === this) {\n root._ = oldDash;\n }\n return this;\n }\n\n /**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\n function noop() {\n // No operation performed.\n }\n\n /**\n * Creates a function that gets the argument at index `n`. If `n` is negative,\n * the nth argument from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {number} [n=0] The index of the argument to return.\n * @returns {Function} Returns the new pass-thru function.\n * @example\n *\n * var func = _.nthArg(1);\n * func('a', 'b', 'c', 'd');\n * // => 'b'\n *\n * var func = _.nthArg(-2);\n * func('a', 'b', 'c', 'd');\n * // => 'c'\n */\n function nthArg(n) {\n n = toInteger(n);\n return baseRest(function(args) {\n return baseNth(args, n);\n });\n }\n\n /**\n * Creates a function that invokes `iteratees` with the arguments it receives\n * and returns their results.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to invoke.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.over([Math.max, Math.min]);\n *\n * func(1, 2, 3, 4);\n * // => [4, 1]\n */\n var over = createOver(arrayMap);\n\n /**\n * Creates a function that checks if **all** of the `predicates` return\n * truthy when invoked with the arguments it receives.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [predicates=[_.identity]]\n * The predicates to check.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.overEvery([Boolean, isFinite]);\n *\n * func('1');\n * // => true\n *\n * func(null);\n * // => false\n *\n * func(NaN);\n * // => false\n */\n var overEvery = createOver(arrayEvery);\n\n /**\n * Creates a function that checks if **any** of the `predicates` return\n * truthy when invoked with the arguments it receives.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [predicates=[_.identity]]\n * The predicates to check.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.overSome([Boolean, isFinite]);\n *\n * func('1');\n * // => true\n *\n * func(null);\n * // => true\n *\n * func(NaN);\n * // => false\n */\n var overSome = createOver(arraySome);\n\n /**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\n function property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n }\n\n /**\n * The opposite of `_.property`; this method creates a function that returns\n * the value at a given path of `object`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var array = [0, 1, 2],\n * object = { 'a': array, 'b': array, 'c': array };\n *\n * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n * // => [2, 0]\n *\n * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n * // => [2, 0]\n */\n function propertyOf(object) {\n return function(path) {\n return object == null ? undefined : baseGet(object, path);\n };\n }\n\n /**\n * Creates an array of numbers (positive and/or negative) progressing from\n * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n * `start` is specified without an `end` or `step`. If `end` is not specified,\n * it's set to `start` with `start` then set to `0`.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.rangeRight\n * @example\n *\n * _.range(4);\n * // => [0, 1, 2, 3]\n *\n * _.range(-4);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 5);\n * // => [1, 2, 3, 4]\n *\n * _.range(0, 20, 5);\n * // => [0, 5, 10, 15]\n *\n * _.range(0, -4, -1);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.range(0);\n * // => []\n */\n var range = createRange();\n\n /**\n * This method is like `_.range` except that it populates values in\n * descending order.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.range\n * @example\n *\n * _.rangeRight(4);\n * // => [3, 2, 1, 0]\n *\n * _.rangeRight(-4);\n * // => [-3, -2, -1, 0]\n *\n * _.rangeRight(1, 5);\n * // => [4, 3, 2, 1]\n *\n * _.rangeRight(0, 20, 5);\n * // => [15, 10, 5, 0]\n *\n * _.rangeRight(0, -4, -1);\n * // => [-3, -2, -1, 0]\n *\n * _.rangeRight(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.rangeRight(0);\n * // => []\n */\n var rangeRight = createRange(true);\n\n /**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\n function stubArray() {\n return [];\n }\n\n /**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\n function stubFalse() {\n return false;\n }\n\n /**\n * This method returns a new empty object.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Object} Returns the new empty object.\n * @example\n *\n * var objects = _.times(2, _.stubObject);\n *\n * console.log(objects);\n * // => [{}, {}]\n *\n * console.log(objects[0] === objects[1]);\n * // => false\n */\n function stubObject() {\n return {};\n }\n\n /**\n * This method returns an empty string.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {string} Returns the empty string.\n * @example\n *\n * _.times(2, _.stubString);\n * // => ['', '']\n */\n function stubString() {\n return '';\n }\n\n /**\n * This method returns `true`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `true`.\n * @example\n *\n * _.times(2, _.stubTrue);\n * // => [true, true]\n */\n function stubTrue() {\n return true;\n }\n\n /**\n * Invokes the iteratee `n` times, returning an array of the results of\n * each invocation. The iteratee is invoked with one argument; (index).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.times(3, String);\n * // => ['0', '1', '2']\n *\n * _.times(4, _.constant(0));\n * // => [0, 0, 0, 0]\n */\n function times(n, iteratee) {\n n = toInteger(n);\n if (n < 1 || n > MAX_SAFE_INTEGER) {\n return [];\n }\n var index = MAX_ARRAY_LENGTH,\n length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n iteratee = getIteratee(iteratee);\n n -= MAX_ARRAY_LENGTH;\n\n var result = baseTimes(length, iteratee);\n while (++index < n) {\n iteratee(index);\n }\n return result;\n }\n\n /**\n * Converts `value` to a property path array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {*} value The value to convert.\n * @returns {Array} Returns the new property path array.\n * @example\n *\n * _.toPath('a.b.c');\n * // => ['a', 'b', 'c']\n *\n * _.toPath('a[0].b.c');\n * // => ['a', '0', 'b', 'c']\n */\n function toPath(value) {\n if (isArray(value)) {\n return arrayMap(value, toKey);\n }\n return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n }\n\n /**\n * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {string} [prefix=''] The value to prefix the ID with.\n * @returns {string} Returns the unique ID.\n * @example\n *\n * _.uniqueId('contact_');\n * // => 'contact_104'\n *\n * _.uniqueId();\n * // => '105'\n */\n function uniqueId(prefix) {\n var id = ++idCounter;\n return toString(prefix) + id;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Adds two numbers.\n *\n * @static\n * @memberOf _\n * @since 3.4.0\n * @category Math\n * @param {number} augend The first number in an addition.\n * @param {number} addend The second number in an addition.\n * @returns {number} Returns the total.\n * @example\n *\n * _.add(6, 4);\n * // => 10\n */\n var add = createMathOperation(function(augend, addend) {\n return augend + addend;\n }, 0);\n\n /**\n * Computes `number` rounded up to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round up.\n * @param {number} [precision=0] The precision to round up to.\n * @returns {number} Returns the rounded up number.\n * @example\n *\n * _.ceil(4.006);\n * // => 5\n *\n * _.ceil(6.004, 2);\n * // => 6.01\n *\n * _.ceil(6040, -2);\n * // => 6100\n */\n var ceil = createRound('ceil');\n\n /**\n * Divide two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {number} dividend The first number in a division.\n * @param {number} divisor The second number in a division.\n * @returns {number} Returns the quotient.\n * @example\n *\n * _.divide(6, 4);\n * // => 1.5\n */\n var divide = createMathOperation(function(dividend, divisor) {\n return dividend / divisor;\n }, 1);\n\n /**\n * Computes `number` rounded down to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round down.\n * @param {number} [precision=0] The precision to round down to.\n * @returns {number} Returns the rounded down number.\n * @example\n *\n * _.floor(4.006);\n * // => 4\n *\n * _.floor(0.046, 2);\n * // => 0.04\n *\n * _.floor(4060, -2);\n * // => 4000\n */\n var floor = createRound('floor');\n\n /**\n * Computes the maximum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => undefined\n */\n function max(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseGt)\n : undefined;\n }\n\n /**\n * This method is like `_.max` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.maxBy(objects, function(o) { return o.n; });\n * // => { 'n': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.maxBy(objects, 'n');\n * // => { 'n': 2 }\n */\n function maxBy(array, iteratee) {\n return (array && array.length)\n ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n : undefined;\n }\n\n /**\n * Computes the mean of the values in `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {number} Returns the mean.\n * @example\n *\n * _.mean([4, 2, 8, 6]);\n * // => 5\n */\n function mean(array) {\n return baseMean(array, identity);\n }\n\n /**\n * This method is like `_.mean` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the value to be averaged.\n * The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the mean.\n * @example\n *\n * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n *\n * _.meanBy(objects, function(o) { return o.n; });\n * // => 5\n *\n * // The `_.property` iteratee shorthand.\n * _.meanBy(objects, 'n');\n * // => 5\n */\n function meanBy(array, iteratee) {\n return baseMean(array, getIteratee(iteratee, 2));\n }\n\n /**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\n function min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n }\n\n /**\n * This method is like `_.min` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.minBy(objects, function(o) { return o.n; });\n * // => { 'n': 1 }\n *\n * // The `_.property` iteratee shorthand.\n * _.minBy(objects, 'n');\n * // => { 'n': 1 }\n */\n function minBy(array, iteratee) {\n return (array && array.length)\n ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n : undefined;\n }\n\n /**\n * Multiply two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {number} multiplier The first number in a multiplication.\n * @param {number} multiplicand The second number in a multiplication.\n * @returns {number} Returns the product.\n * @example\n *\n * _.multiply(6, 4);\n * // => 24\n */\n var multiply = createMathOperation(function(multiplier, multiplicand) {\n return multiplier * multiplicand;\n }, 1);\n\n /**\n * Computes `number` rounded to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round.\n * @param {number} [precision=0] The precision to round to.\n * @returns {number} Returns the rounded number.\n * @example\n *\n * _.round(4.006);\n * // => 4\n *\n * _.round(4.006, 2);\n * // => 4.01\n *\n * _.round(4060, -2);\n * // => 4100\n */\n var round = createRound('round');\n\n /**\n * Subtract two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {number} minuend The first number in a subtraction.\n * @param {number} subtrahend The second number in a subtraction.\n * @returns {number} Returns the difference.\n * @example\n *\n * _.subtract(6, 4);\n * // => 2\n */\n var subtract = createMathOperation(function(minuend, subtrahend) {\n return minuend - subtrahend;\n }, 0);\n\n /**\n * Computes the sum of the values in `array`.\n *\n * @static\n * @memberOf _\n * @since 3.4.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {number} Returns the sum.\n * @example\n *\n * _.sum([4, 2, 8, 6]);\n * // => 20\n */\n function sum(array) {\n return (array && array.length)\n ? baseSum(array, identity)\n : 0;\n }\n\n /**\n * This method is like `_.sum` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the value to be summed.\n * The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the sum.\n * @example\n *\n * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n *\n * _.sumBy(objects, function(o) { return o.n; });\n * // => 20\n *\n * // The `_.property` iteratee shorthand.\n * _.sumBy(objects, 'n');\n * // => 20\n */\n function sumBy(array, iteratee) {\n return (array && array.length)\n ? baseSum(array, getIteratee(iteratee, 2))\n : 0;\n }\n\n /*------------------------------------------------------------------------*/\n\n // Add methods that return wrapped values in chain sequences.\n lodash.after = after;\n lodash.ary = ary;\n lodash.assign = assign;\n lodash.assignIn = assignIn;\n lodash.assignInWith = assignInWith;\n lodash.assignWith = assignWith;\n lodash.at = at;\n lodash.before = before;\n lodash.bind = bind;\n lodash.bindAll = bindAll;\n lodash.bindKey = bindKey;\n lodash.castArray = castArray;\n lodash.chain = chain;\n lodash.chunk = chunk;\n lodash.compact = compact;\n lodash.concat = concat;\n lodash.cond = cond;\n lodash.conforms = conforms;\n lodash.constant = constant;\n lodash.countBy = countBy;\n lodash.create = create;\n lodash.curry = curry;\n lodash.curryRight = curryRight;\n lodash.debounce = debounce;\n lodash.defaults = defaults;\n lodash.defaultsDeep = defaultsDeep;\n lodash.defer = defer;\n lodash.delay = delay;\n lodash.difference = difference;\n lodash.differenceBy = differenceBy;\n lodash.differenceWith = differenceWith;\n lodash.drop = drop;\n lodash.dropRight = dropRight;\n lodash.dropRightWhile = dropRightWhile;\n lodash.dropWhile = dropWhile;\n lodash.fill = fill;\n lodash.filter = filter;\n lodash.flatMap = flatMap;\n lodash.flatMapDeep = flatMapDeep;\n lodash.flatMapDepth = flatMapDepth;\n lodash.flatten = flatten;\n lodash.flattenDeep = flattenDeep;\n lodash.flattenDepth = flattenDepth;\n lodash.flip = flip;\n lodash.flow = flow;\n lodash.flowRight = flowRight;\n lodash.fromPairs = fromPairs;\n lodash.functions = functions;\n lodash.functionsIn = functionsIn;\n lodash.groupBy = groupBy;\n lodash.initial = initial;\n lodash.intersection = intersection;\n lodash.intersectionBy = intersectionBy;\n lodash.intersectionWith = intersectionWith;\n lodash.invert = invert;\n lodash.invertBy = invertBy;\n lodash.invokeMap = invokeMap;\n lodash.iteratee = iteratee;\n lodash.keyBy = keyBy;\n lodash.keys = keys;\n lodash.keysIn = keysIn;\n lodash.map = map;\n lodash.mapKeys = mapKeys;\n lodash.mapValues = mapValues;\n lodash.matches = matches;\n lodash.matchesProperty = matchesProperty;\n lodash.memoize = memoize;\n lodash.merge = merge;\n lodash.mergeWith = mergeWith;\n lodash.method = method;\n lodash.methodOf = methodOf;\n lodash.mixin = mixin;\n lodash.negate = negate;\n lodash.nthArg = nthArg;\n lodash.omit = omit;\n lodash.omitBy = omitBy;\n lodash.once = once;\n lodash.orderBy = orderBy;\n lodash.over = over;\n lodash.overArgs = overArgs;\n lodash.overEvery = overEvery;\n lodash.overSome = overSome;\n lodash.partial = partial;\n lodash.partialRight = partialRight;\n lodash.partition = partition;\n lodash.pick = pick;\n lodash.pickBy = pickBy;\n lodash.property = property;\n lodash.propertyOf = propertyOf;\n lodash.pull = pull;\n lodash.pullAll = pullAll;\n lodash.pullAllBy = pullAllBy;\n lodash.pullAllWith = pullAllWith;\n lodash.pullAt = pullAt;\n lodash.range = range;\n lodash.rangeRight = rangeRight;\n lodash.rearg = rearg;\n lodash.reject = reject;\n lodash.remove = remove;\n lodash.rest = rest;\n lodash.reverse = reverse;\n lodash.sampleSize = sampleSize;\n lodash.set = set;\n lodash.setWith = setWith;\n lodash.shuffle = shuffle;\n lodash.slice = slice;\n lodash.sortBy = sortBy;\n lodash.sortedUniq = sortedUniq;\n lodash.sortedUniqBy = sortedUniqBy;\n lodash.split = split;\n lodash.spread = spread;\n lodash.tail = tail;\n lodash.take = take;\n lodash.takeRight = takeRight;\n lodash.takeRightWhile = takeRightWhile;\n lodash.takeWhile = takeWhile;\n lodash.tap = tap;\n lodash.throttle = throttle;\n lodash.thru = thru;\n lodash.toArray = toArray;\n lodash.toPairs = toPairs;\n lodash.toPairsIn = toPairsIn;\n lodash.toPath = toPath;\n lodash.toPlainObject = toPlainObject;\n lodash.transform = transform;\n lodash.unary = unary;\n lodash.union = union;\n lodash.unionBy = unionBy;\n lodash.unionWith = unionWith;\n lodash.uniq = uniq;\n lodash.uniqBy = uniqBy;\n lodash.uniqWith = uniqWith;\n lodash.unset = unset;\n lodash.unzip = unzip;\n lodash.unzipWith = unzipWith;\n lodash.update = update;\n lodash.updateWith = updateWith;\n lodash.values = values;\n lodash.valuesIn = valuesIn;\n lodash.without = without;\n lodash.words = words;\n lodash.wrap = wrap;\n lodash.xor = xor;\n lodash.xorBy = xorBy;\n lodash.xorWith = xorWith;\n lodash.zip = zip;\n lodash.zipObject = zipObject;\n lodash.zipObjectDeep = zipObjectDeep;\n lodash.zipWith = zipWith;\n\n // Add aliases.\n lodash.entries = toPairs;\n lodash.entriesIn = toPairsIn;\n lodash.extend = assignIn;\n lodash.extendWith = assignInWith;\n\n // Add methods to `lodash.prototype`.\n mixin(lodash, lodash);\n\n /*------------------------------------------------------------------------*/\n\n // Add methods that return unwrapped values in chain sequences.\n lodash.add = add;\n lodash.attempt = attempt;\n lodash.camelCase = camelCase;\n lodash.capitalize = capitalize;\n lodash.ceil = ceil;\n lodash.clamp = clamp;\n lodash.clone = clone;\n lodash.cloneDeep = cloneDeep;\n lodash.cloneDeepWith = cloneDeepWith;\n lodash.cloneWith = cloneWith;\n lodash.conformsTo = conformsTo;\n lodash.deburr = deburr;\n lodash.defaultTo = defaultTo;\n lodash.divide = divide;\n lodash.endsWith = endsWith;\n lodash.eq = eq;\n lodash.escape = escape;\n lodash.escapeRegExp = escapeRegExp;\n lodash.every = every;\n lodash.find = find;\n lodash.findIndex = findIndex;\n lodash.findKey = findKey;\n lodash.findLast = findLast;\n lodash.findLastIndex = findLastIndex;\n lodash.findLastKey = findLastKey;\n lodash.floor = floor;\n lodash.forEach = forEach;\n lodash.forEachRight = forEachRight;\n lodash.forIn = forIn;\n lodash.forInRight = forInRight;\n lodash.forOwn = forOwn;\n lodash.forOwnRight = forOwnRight;\n lodash.get = get;\n lodash.gt = gt;\n lodash.gte = gte;\n lodash.has = has;\n lodash.hasIn = hasIn;\n lodash.head = head;\n lodash.identity = identity;\n lodash.includes = includes;\n lodash.indexOf = indexOf;\n lodash.inRange = inRange;\n lodash.invoke = invoke;\n lodash.isArguments = isArguments;\n lodash.isArray = isArray;\n lodash.isArrayBuffer = isArrayBuffer;\n lodash.isArrayLike = isArrayLike;\n lodash.isArrayLikeObject = isArrayLikeObject;\n lodash.isBoolean = isBoolean;\n lodash.isBuffer = isBuffer;\n lodash.isDate = isDate;\n lodash.isElement = isElement;\n lodash.isEmpty = isEmpty;\n lodash.isEqual = isEqual;\n lodash.isEqualWith = isEqualWith;\n lodash.isError = isError;\n lodash.isFinite = isFinite;\n lodash.isFunction = isFunction;\n lodash.isInteger = isInteger;\n lodash.isLength = isLength;\n lodash.isMap = isMap;\n lodash.isMatch = isMatch;\n lodash.isMatchWith = isMatchWith;\n lodash.isNaN = isNaN;\n lodash.isNative = isNative;\n lodash.isNil = isNil;\n lodash.isNull = isNull;\n lodash.isNumber = isNumber;\n lodash.isObject = isObject;\n lodash.isObjectLike = isObjectLike;\n lodash.isPlainObject = isPlainObject;\n lodash.isRegExp = isRegExp;\n lodash.isSafeInteger = isSafeInteger;\n lodash.isSet = isSet;\n lodash.isString = isString;\n lodash.isSymbol = isSymbol;\n lodash.isTypedArray = isTypedArray;\n lodash.isUndefined = isUndefined;\n lodash.isWeakMap = isWeakMap;\n lodash.isWeakSet = isWeakSet;\n lodash.join = join;\n lodash.kebabCase = kebabCase;\n lodash.last = last;\n lodash.lastIndexOf = lastIndexOf;\n lodash.lowerCase = lowerCase;\n lodash.lowerFirst = lowerFirst;\n lodash.lt = lt;\n lodash.lte = lte;\n lodash.max = max;\n lodash.maxBy = maxBy;\n lodash.mean = mean;\n lodash.meanBy = meanBy;\n lodash.min = min;\n lodash.minBy = minBy;\n lodash.stubArray = stubArray;\n lodash.stubFalse = stubFalse;\n lodash.stubObject = stubObject;\n lodash.stubString = stubString;\n lodash.stubTrue = stubTrue;\n lodash.multiply = multiply;\n lodash.nth = nth;\n lodash.noConflict = noConflict;\n lodash.noop = noop;\n lodash.now = now;\n lodash.pad = pad;\n lodash.padEnd = padEnd;\n lodash.padStart = padStart;\n lodash.parseInt = parseInt;\n lodash.random = random;\n lodash.reduce = reduce;\n lodash.reduceRight = reduceRight;\n lodash.repeat = repeat;\n lodash.replace = replace;\n lodash.result = result;\n lodash.round = round;\n lodash.runInContext = runInContext;\n lodash.sample = sample;\n lodash.size = size;\n lodash.snakeCase = snakeCase;\n lodash.some = some;\n lodash.sortedIndex = sortedIndex;\n lodash.sortedIndexBy = sortedIndexBy;\n lodash.sortedIndexOf = sortedIndexOf;\n lodash.sortedLastIndex = sortedLastIndex;\n lodash.sortedLastIndexBy = sortedLastIndexBy;\n lodash.sortedLastIndexOf = sortedLastIndexOf;\n lodash.startCase = startCase;\n lodash.startsWith = startsWith;\n lodash.subtract = subtract;\n lodash.sum = sum;\n lodash.sumBy = sumBy;\n lodash.template = template;\n lodash.times = times;\n lodash.toFinite = toFinite;\n lodash.toInteger = toInteger;\n lodash.toLength = toLength;\n lodash.toLower = toLower;\n lodash.toNumber = toNumber;\n lodash.toSafeInteger = toSafeInteger;\n lodash.toString = toString;\n lodash.toUpper = toUpper;\n lodash.trim = trim;\n lodash.trimEnd = trimEnd;\n lodash.trimStart = trimStart;\n lodash.truncate = truncate;\n lodash.unescape = unescape;\n lodash.uniqueId = uniqueId;\n lodash.upperCase = upperCase;\n lodash.upperFirst = upperFirst;\n\n // Add aliases.\n lodash.each = forEach;\n lodash.eachRight = forEachRight;\n lodash.first = head;\n\n mixin(lodash, (function() {\n var source = {};\n baseForOwn(lodash, function(func, methodName) {\n if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n source[methodName] = func;\n }\n });\n return source;\n }()), { 'chain': false });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The semantic version number.\n *\n * @static\n * @memberOf _\n * @type {string}\n */\n lodash.VERSION = VERSION;\n\n // Assign default placeholders.\n arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n lodash[methodName].placeholder = lodash;\n });\n\n // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n arrayEach(['drop', 'take'], function(methodName, index) {\n LazyWrapper.prototype[methodName] = function(n) {\n n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n var result = (this.__filtered__ && !index)\n ? new LazyWrapper(this)\n : this.clone();\n\n if (result.__filtered__) {\n result.__takeCount__ = nativeMin(n, result.__takeCount__);\n } else {\n result.__views__.push({\n 'size': nativeMin(n, MAX_ARRAY_LENGTH),\n 'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n });\n }\n return result;\n };\n\n LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n return this.reverse()[methodName](n).reverse();\n };\n });\n\n // Add `LazyWrapper` methods that accept an `iteratee` value.\n arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n var type = index + 1,\n isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n LazyWrapper.prototype[methodName] = function(iteratee) {\n var result = this.clone();\n result.__iteratees__.push({\n 'iteratee': getIteratee(iteratee, 3),\n 'type': type\n });\n result.__filtered__ = result.__filtered__ || isFilter;\n return result;\n };\n });\n\n // Add `LazyWrapper` methods for `_.head` and `_.last`.\n arrayEach(['head', 'last'], function(methodName, index) {\n var takeName = 'take' + (index ? 'Right' : '');\n\n LazyWrapper.prototype[methodName] = function() {\n return this[takeName](1).value()[0];\n };\n });\n\n // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n arrayEach(['initial', 'tail'], function(methodName, index) {\n var dropName = 'drop' + (index ? '' : 'Right');\n\n LazyWrapper.prototype[methodName] = function() {\n return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n };\n });\n\n LazyWrapper.prototype.compact = function() {\n return this.filter(identity);\n };\n\n LazyWrapper.prototype.find = function(predicate) {\n return this.filter(predicate).head();\n };\n\n LazyWrapper.prototype.findLast = function(predicate) {\n return this.reverse().find(predicate);\n };\n\n LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n if (typeof path == 'function') {\n return new LazyWrapper(this);\n }\n return this.map(function(value) {\n return baseInvoke(value, path, args);\n });\n });\n\n LazyWrapper.prototype.reject = function(predicate) {\n return this.filter(negate(getIteratee(predicate)));\n };\n\n LazyWrapper.prototype.slice = function(start, end) {\n start = toInteger(start);\n\n var result = this;\n if (result.__filtered__ && (start > 0 || end < 0)) {\n return new LazyWrapper(result);\n }\n if (start < 0) {\n result = result.takeRight(-start);\n } else if (start) {\n result = result.drop(start);\n }\n if (end !== undefined) {\n end = toInteger(end);\n result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n }\n return result;\n };\n\n LazyWrapper.prototype.takeRightWhile = function(predicate) {\n return this.reverse().takeWhile(predicate).reverse();\n };\n\n LazyWrapper.prototype.toArray = function() {\n return this.take(MAX_ARRAY_LENGTH);\n };\n\n // Add `LazyWrapper` methods to `lodash.prototype`.\n baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n isTaker = /^(?:head|last)$/.test(methodName),\n lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n retUnwrapped = isTaker || /^find/.test(methodName);\n\n if (!lodashFunc) {\n return;\n }\n lodash.prototype[methodName] = function() {\n var value = this.__wrapped__,\n args = isTaker ? [1] : arguments,\n isLazy = value instanceof LazyWrapper,\n iteratee = args[0],\n useLazy = isLazy || isArray(value);\n\n var interceptor = function(value) {\n var result = lodashFunc.apply(lodash, arrayPush([value], args));\n return (isTaker && chainAll) ? result[0] : result;\n };\n\n if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n isLazy = useLazy = false;\n }\n var chainAll = this.__chain__,\n isHybrid = !!this.__actions__.length,\n isUnwrapped = retUnwrapped && !chainAll,\n onlyLazy = isLazy && !isHybrid;\n\n if (!retUnwrapped && useLazy) {\n value = onlyLazy ? value : new LazyWrapper(this);\n var result = func.apply(value, args);\n result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n return new LodashWrapper(result, chainAll);\n }\n if (isUnwrapped && onlyLazy) {\n return func.apply(this, args);\n }\n result = this.thru(interceptor);\n return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n };\n });\n\n // Add `Array` methods to `lodash.prototype`.\n arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n var func = arrayProto[methodName],\n chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n lodash.prototype[methodName] = function() {\n var args = arguments;\n if (retUnwrapped && !this.__chain__) {\n var value = this.value();\n return func.apply(isArray(value) ? value : [], args);\n }\n return this[chainName](function(value) {\n return func.apply(isArray(value) ? value : [], args);\n });\n };\n });\n\n // Map minified method names to their real names.\n baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n var lodashFunc = lodash[methodName];\n if (lodashFunc) {\n var key = (lodashFunc.name + ''),\n names = realNames[key] || (realNames[key] = []);\n\n names.push({ 'name': methodName, 'func': lodashFunc });\n }\n });\n\n realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n 'name': 'wrapper',\n 'func': undefined\n }];\n\n // Add methods to `LazyWrapper`.\n LazyWrapper.prototype.clone = lazyClone;\n LazyWrapper.prototype.reverse = lazyReverse;\n LazyWrapper.prototype.value = lazyValue;\n\n // Add chain sequence methods to the `lodash` wrapper.\n lodash.prototype.at = wrapperAt;\n lodash.prototype.chain = wrapperChain;\n lodash.prototype.commit = wrapperCommit;\n lodash.prototype.next = wrapperNext;\n lodash.prototype.plant = wrapperPlant;\n lodash.prototype.reverse = wrapperReverse;\n lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n // Add lazy aliases.\n lodash.prototype.first = lodash.prototype.head;\n\n if (symIterator) {\n lodash.prototype[symIterator] = wrapperToIterator;\n }\n return lodash;\n });\n\n /*--------------------------------------------------------------------------*/\n\n // Export lodash.\n var _ = runInContext();\n\n // Some AMD build optimizers, like r.js, check for condition patterns like:\n if (true) {\n // Expose Lodash on the global object to prevent errors when Lodash is\n // loaded by a script tag in the presence of an AMD loader.\n // See http://requirejs.org/docs/errors.html#mismatch for more details.\n // Use `_.noConflict` to remove Lodash from the global object.\n root._ = _;\n\n // Define as an anonymous module so, through path mapping, it can be\n // referenced as the \"underscore\" module.\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n return _;\n }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n }\n // Check for `exports` after `define` in case a build optimizer adds it.\n else if (freeModule) {\n // Export for Node.js.\n (freeModule.exports = _)._ = _;\n // Export for CommonJS support.\n freeExports._ = _;\n }\n else {\n // Export to the global object.\n root._ = _;\n }\n}.call(this));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(4)(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2xvZGFzaC5qcz8zMzg3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJzREFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQSwyREFBMkQ7O0FBRTNEO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLE1BQU0sYUFBYSxPQUFPOztBQUVwRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELEVBQUU7QUFDbkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDJDQUEyQyxHQUFHOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixpQkFBaUIsTUFBTTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixpQkFBaUIsTUFBTTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsRUFBRTtBQUNqQixlQUFlLEVBQUU7QUFDakIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsZUFBZSxPQUFPO0FBQ3RCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsZUFBZSxFQUFFO0FBQ2pCLGVBQWUsRUFBRTtBQUNqQixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsZUFBZSxPQUFPO0FBQ3RCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7O0FBRUE7QUFD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Q0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEIsZUFBZSxLQUFLO0FBQ3BCLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCLGVBQWUsT0FBTztBQUN0QixlQUFlLEtBQUs7QUFDcEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrQkFBa0IsRUFBRTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELGtCQUFrQixFQUFFO0FBQ3RFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsRUFBRTtBQUNqQixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsRUFBRTtBQUNqQixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsRUFBRTtBQUNqQixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsRUFBRTtBQUNqQixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsRUFBRTtBQUNqQixlQUFlLEVBQUU7QUFDakIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsZUFBZSxFQUFFO0FBQ2pCLGVBQWUsU0FBUztBQUN4QixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsRUFBRTtBQUNqQixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsRUFBRTtBQUNqQixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsRUFBRTtBQUNqQixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGVBQWUsRUFBRTtBQUNqQixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGVBQWUsRUFBRTtBQUNqQixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixNQUFNO0FBQ3ZCO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsRUFBRTtBQUNqQixpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsRUFBRTtBQUNqQixpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsRUFBRTtBQUNqQixpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCLGNBQWM7QUFDZDtBQUNBLGlCQUFpQixTQUFTO0FBQzFCLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsZUFBZSxVQUFVO0FBQ3pCLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQixjQUFjO0FBQ2Q7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsaUJBQWlCLE1BQU07QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGlCQUFpQixNQUFNO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixlQUFlLE9BQU87QUFDdEIsZUFBZSxPQUFPO0FBQ3RCLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsT0FBTztBQUN0QixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSyxNQUFNLGlCQUFpQjs7QUFFNUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsNERBQTREO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQix5Q0FBeUM7QUFDN0Q7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUFBO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyIsImZpbGUiOiIyMC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIExvZGFzaCA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanMuZm91bmRhdGlvbi8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cbjsoZnVuY3Rpb24oKSB7XG5cbiAgLyoqIFVzZWQgYXMgYSBzYWZlIHJlZmVyZW5jZSBmb3IgYHVuZGVmaW5lZGAgaW4gcHJlLUVTNSBlbnZpcm9ubWVudHMuICovXG4gIHZhciB1bmRlZmluZWQ7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLiAqL1xuICB2YXIgVkVSU0lPTiA9ICc0LjE3LjEwJztcblxuICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbiAgdmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xuICB2YXIgQ09SRV9FUlJPUl9URVhUID0gJ1Vuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLicsXG4gICAgICBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbiAgLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xuICB2YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIG1heGltdW0gbWVtb2l6ZSBjYWNoZSBzaXplLiAqL1xuICB2YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuICAvKiogVXNlZCBhcyB0aGUgaW50ZXJuYWwgYXJndW1lbnQgcGxhY2Vob2xkZXIuICovXG4gIHZhciBQTEFDRUhPTERFUiA9ICdfX2xvZGFzaF9wbGFjZWhvbGRlcl9fJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xuICB2YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICAgIENMT05FX0ZMQVRfRkxBRyA9IDIsXG4gICAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xuICB2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG4gIHZhciBXUkFQX0JJTkRfRkxBRyA9IDEsXG4gICAgICBXUkFQX0JJTkRfS0VZX0ZMQUcgPSAyLFxuICAgICAgV1JBUF9DVVJSWV9CT1VORF9GTEFHID0gNCxcbiAgICAgIFdSQVBfQ1VSUllfRkxBRyA9IDgsXG4gICAgICBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcgPSAxNixcbiAgICAgIFdSQVBfUEFSVElBTF9GTEFHID0gMzIsXG4gICAgICBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyA9IDY0LFxuICAgICAgV1JBUF9BUllfRkxBRyA9IDEyOCxcbiAgICAgIFdSQVBfUkVBUkdfRkxBRyA9IDI1NixcbiAgICAgIFdSQVBfRkxJUF9GTEFHID0gNTEyO1xuXG4gIC8qKiBVc2VkIGFzIGRlZmF1bHQgb3B0aW9ucyBmb3IgYF8udHJ1bmNhdGVgLiAqL1xuICB2YXIgREVGQVVMVF9UUlVOQ19MRU5HVEggPSAzMCxcbiAgICAgIERFRkFVTFRfVFJVTkNfT01JU1NJT04gPSAnLi4uJztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgaG90IGZ1bmN0aW9ucyBieSBudW1iZXIgb2YgY2FsbHMgd2l0aGluIGEgc3BhbiBvZiBtaWxsaXNlY29uZHMuICovXG4gIHZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgICBIT1RfU1BBTiA9IDE2O1xuXG4gIC8qKiBVc2VkIHRvIGluZGljYXRlIHRoZSB0eXBlIG9mIGxhenkgaXRlcmF0ZWVzLiAqL1xuICB2YXIgTEFaWV9GSUxURVJfRkxBRyA9IDEsXG4gICAgICBMQVpZX01BUF9GTEFHID0gMixcbiAgICAgIExBWllfV0hJTEVfRkxBRyA9IDM7XG5cbiAgLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG4gIHZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgICAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEsXG4gICAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4LFxuICAgICAgTkFOID0gMCAvIDA7XG5cbiAgLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdGhlIG1heGltdW0gbGVuZ3RoIGFuZCBpbmRleCBvZiBhbiBhcnJheS4gKi9cbiAgdmFyIE1BWF9BUlJBWV9MRU5HVEggPSA0Mjk0OTY3Mjk1LFxuICAgICAgTUFYX0FSUkFZX0lOREVYID0gTUFYX0FSUkFZX0xFTkdUSCAtIDEsXG4gICAgICBIQUxGX01BWF9BUlJBWV9MRU5HVEggPSBNQVhfQVJSQVlfTEVOR1RIID4+PiAxO1xuXG4gIC8qKiBVc2VkIHRvIGFzc29jaWF0ZSB3cmFwIG1ldGhvZHMgd2l0aCB0aGVpciBiaXQgZmxhZ3MuICovXG4gIHZhciB3cmFwRmxhZ3MgPSBbXG4gICAgWydhcnknLCBXUkFQX0FSWV9GTEFHXSxcbiAgICBbJ2JpbmQnLCBXUkFQX0JJTkRfRkxBR10sXG4gICAgWydiaW5kS2V5JywgV1JBUF9CSU5EX0tFWV9GTEFHXSxcbiAgICBbJ2N1cnJ5JywgV1JBUF9DVVJSWV9GTEFHXSxcbiAgICBbJ2N1cnJ5UmlnaHQnLCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUddLFxuICAgIFsnZmxpcCcsIFdSQVBfRkxJUF9GTEFHXSxcbiAgICBbJ3BhcnRpYWwnLCBXUkFQX1BBUlRJQUxfRkxBR10sXG4gICAgWydwYXJ0aWFsUmlnaHQnLCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBR10sXG4gICAgWydyZWFyZycsIFdSQVBfUkVBUkdfRkxBR11cbiAgXTtcblxuICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG4gIHZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgICBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgICAgZG9tRXhjVGFnID0gJ1tvYmplY3QgRE9NRXhjZXB0aW9uXScsXG4gICAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgICAgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJyxcbiAgICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nLFxuICAgICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXScsXG4gICAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nLFxuICAgICAgd2Vha1NldFRhZyA9ICdbb2JqZWN0IFdlYWtTZXRdJztcblxuICB2YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGVtcHR5IHN0cmluZyBsaXRlcmFscyBpbiBjb21waWxlZCB0ZW1wbGF0ZSBzb3VyY2UuICovXG4gIHZhciByZUVtcHR5U3RyaW5nTGVhZGluZyA9IC9cXGJfX3AgXFwrPSAnJzsvZyxcbiAgICAgIHJlRW1wdHlTdHJpbmdNaWRkbGUgPSAvXFxiKF9fcCBcXCs9KSAnJyBcXCsvZyxcbiAgICAgIHJlRW1wdHlTdHJpbmdUcmFpbGluZyA9IC8oX19lXFwoLio/XFwpfFxcYl9fdFxcKSkgXFwrXFxuJyc7L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggSFRNTCBlbnRpdGllcyBhbmQgSFRNTCBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgcmVFc2NhcGVkSHRtbCA9IC8mKD86YW1wfGx0fGd0fHF1b3R8IzM5KTsvZyxcbiAgICAgIHJlVW5lc2NhcGVkSHRtbCA9IC9bJjw+XCInXS9nLFxuICAgICAgcmVIYXNFc2NhcGVkSHRtbCA9IFJlZ0V4cChyZUVzY2FwZWRIdG1sLnNvdXJjZSksXG4gICAgICByZUhhc1VuZXNjYXBlZEh0bWwgPSBSZWdFeHAocmVVbmVzY2FwZWRIdG1sLnNvdXJjZSk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlRXNjYXBlID0gLzwlLShbXFxzXFxTXSs/KSU+L2csXG4gICAgICByZUV2YWx1YXRlID0gLzwlKFtcXHNcXFNdKz8pJT4vZyxcbiAgICAgIHJlSW50ZXJwb2xhdGUgPSAvPCU9KFtcXHNcXFNdKz8pJT4vZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG4gIHZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgICAgcmVJc1BsYWluUHJvcCA9IC9eXFx3KiQvLFxuICAgICAgcmVQcm9wTmFtZSA9IC9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwkKSkvZztcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICAgKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAgICovXG4gIHZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2csXG4gICAgICByZUhhc1JlZ0V4cENoYXIgPSBSZWdFeHAocmVSZWdFeHBDaGFyLnNvdXJjZSk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbiAgdmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nLFxuICAgICAgcmVUcmltU3RhcnQgPSAvXlxccysvLFxuICAgICAgcmVUcmltRW5kID0gL1xccyskLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbiAgdmFyIHJlV3JhcENvbW1lbnQgPSAvXFx7KD86XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAuK1xcXSBcXCpcXC8pP1xcbj8vLFxuICAgICAgcmVXcmFwRGV0YWlscyA9IC9cXHtcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoICguKylcXF0gXFwqLyxcbiAgICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3b3JkcyBjb21wb3NlZCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlQXNjaWlXb3JkID0gL1teXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4N2ZdKy9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2hcbiAgICogW0VTIHRlbXBsYXRlIGRlbGltaXRlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRlbXBsYXRlLWxpdGVyYWwtbGV4aWNhbC1jb21wb25lbnRzKS5cbiAgICovXG4gIHZhciByZUVzVGVtcGxhdGUgPSAvXFwkXFx7KFteXFxcXH1dKig/OlxcXFwuW15cXFxcfV0qKSopXFx9L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUZsYWdzID0gL1xcdyokLztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xuICB2YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xuICB2YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIExhdGluIFVuaWNvZGUgbGV0dGVycyAoZXhjbHVkaW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRvcnMpLiAqL1xuICB2YXIgcmVMYXRpbiA9IC9bXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxceGZmXFx1MDEwMC1cXHUwMTdmXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlTm9NYXRjaCA9IC8oJF4pLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB1bmVzY2FwZWQgY2hhcmFjdGVycyBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciByZVVuZXNjYXBlZFN0cmluZyA9IC9bJ1xcblxcclxcdTIwMjhcXHUyMDI5XFxcXF0vZztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG4gIHZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFxcXHUyNzAwLVxcXFx1MjdiZicsXG4gICAgICByc0xvd2VyUmFuZ2UgPSAnYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmJyxcbiAgICAgIHJzTWF0aE9wUmFuZ2UgPSAnXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmNycsXG4gICAgICByc05vbkNoYXJSYW5nZSA9ICdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmYnLFxuICAgICAgcnNQdW5jdHVhdGlvblJhbmdlID0gJ1xcXFx1MjAwMC1cXFxcdTIwNmYnLFxuICAgICAgcnNTcGFjZVJhbmdlID0gJyBcXFxcdFxcXFx4MGJcXFxcZlxcXFx4YTBcXFxcdWZlZmZcXFxcblxcXFxyXFxcXHUyMDI4XFxcXHUyMDI5XFxcXHUxNjgwXFxcXHUxODBlXFxcXHUyMDAwXFxcXHUyMDAxXFxcXHUyMDAyXFxcXHUyMDAzXFxcXHUyMDA0XFxcXHUyMDA1XFxcXHUyMDA2XFxcXHUyMDA3XFxcXHUyMDA4XFxcXHUyMDA5XFxcXHUyMDBhXFxcXHUyMDJmXFxcXHUyMDVmXFxcXHUzMDAwJyxcbiAgICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGUnLFxuICAgICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnLFxuICAgICAgcnNCcmVha1JhbmdlID0gcnNNYXRoT3BSYW5nZSArIHJzTm9uQ2hhclJhbmdlICsgcnNQdW5jdHVhdGlvblJhbmdlICsgcnNTcGFjZVJhbmdlO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbiAgdmFyIHJzQXBvcyA9IFwiWydcXHUyMDE5XVwiLFxuICAgICAgcnNBc3RyYWwgPSAnWycgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNCcmVhayA9ICdbJyArIHJzQnJlYWtSYW5nZSArICddJyxcbiAgICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgICByc0RpZ2l0cyA9ICdcXFxcZCsnLFxuICAgICAgcnNEaW5nYmF0ID0gJ1snICsgcnNEaW5nYmF0UmFuZ2UgKyAnXScsXG4gICAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLFxuICAgICAgcnNNaXNjID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyByc0JyZWFrUmFuZ2UgKyByc0RpZ2l0cyArIHJzRGluZ2JhdFJhbmdlICsgcnNMb3dlclJhbmdlICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNGaXR6ID0gJ1xcXFx1ZDgzY1tcXFxcdWRmZmItXFxcXHVkZmZmXScsXG4gICAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICAgIHJzUmVnaW9uYWwgPSAnKD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfScsXG4gICAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgICByc1VwcGVyID0gJ1snICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbiAgdmFyIHJzTWlzY0xvd2VyID0gJyg/OicgKyByc0xvd2VyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgICAgcnNNaXNjVXBwZXIgPSAnKD86JyArIHJzVXBwZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc09wdENvbnRyTG93ZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpkfGxsfG18cmV8c3x0fHZlKSk/JyxcbiAgICAgIHJzT3B0Q29udHJVcHBlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OkR8TEx8TXxSRXxTfFR8VkUpKT8nLFxuICAgICAgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgICByc09yZExvd2VyID0gJ1xcXFxkKig/OjFzdHwybmR8M3JkfCg/IVsxMjNdKVxcXFxkdGgpKD89XFxcXGJ8W0EtWl9dKScsXG4gICAgICByc09yZFVwcGVyID0gJ1xcXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcXFxkVEgpKD89XFxcXGJ8W2Etel9dKScsXG4gICAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgICByc0Vtb2ppID0gJyg/OicgKyBbcnNEaW5nYmF0LCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc1NlcSxcbiAgICAgIHJzU3ltYm9sID0gJyg/OicgKyBbcnNOb25Bc3RyYWwgKyByc0NvbWJvICsgJz8nLCByc0NvbWJvLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyLCByc0FzdHJhbF0uam9pbignfCcpICsgJyknO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGFwb3N0cm9waGVzLiAqL1xuICB2YXIgcmVBcG9zID0gUmVnRXhwKHJzQXBvcywgJ2cnKTtcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpIGFuZFxuICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzIGZvciBzeW1ib2xzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3NfZm9yX1N5bWJvbHMpLlxuICAgKi9cbiAgdmFyIHJlQ29tYm9NYXJrID0gUmVnRXhwKHJzQ29tYm8sICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbiAgdmFyIHJlVW5pY29kZSA9IFJlZ0V4cChyc0ZpdHogKyAnKD89JyArIHJzRml0eiArICcpfCcgKyByc1N5bWJvbCArIHJzU2VxLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGNvbXBsZXggb3IgY29tcG91bmQgd29yZHMuICovXG4gIHZhciByZVVuaWNvZGVXb3JkID0gUmVnRXhwKFtcbiAgICByc1VwcGVyICsgJz8nICsgcnNMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzTWlzY1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciArIHJzTWlzY0xvd2VyLCAnJCddLmpvaW4oJ3wnKSArICcpJyxcbiAgICByc1VwcGVyICsgJz8nICsgcnNNaXNjTG93ZXIgKyAnKycgKyByc09wdENvbnRyTG93ZXIsXG4gICAgcnNVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlcixcbiAgICByc09yZFVwcGVyLFxuICAgIHJzT3JkTG93ZXIsXG4gICAgcnNEaWdpdHMsXG4gICAgcnNFbW9qaVxuICBdLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbiAgdmFyIHJlSGFzVW5pY29kZSA9IFJlZ0V4cCgnWycgKyByc1pXSiArIHJzQXN0cmFsUmFuZ2UgICsgcnNDb21ib1JhbmdlICsgcnNWYXJSYW5nZSArICddJyk7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3MgdGhhdCBuZWVkIGEgbW9yZSByb2J1c3QgcmVnZXhwIHRvIG1hdGNoIHdvcmRzLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlV29yZCA9IC9bYS16XVtBLVpdfFtBLVpdezIsfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLztcblxuICAvKiogVXNlZCB0byBhc3NpZ24gZGVmYXVsdCBgY29udGV4dGAgb2JqZWN0IHByb3BlcnRpZXMuICovXG4gIHZhciBjb250ZXh0UHJvcHMgPSBbXG4gICAgJ0FycmF5JywgJ0J1ZmZlcicsICdEYXRhVmlldycsICdEYXRlJywgJ0Vycm9yJywgJ0Zsb2F0MzJBcnJheScsICdGbG9hdDY0QXJyYXknLFxuICAgICdGdW5jdGlvbicsICdJbnQ4QXJyYXknLCAnSW50MTZBcnJheScsICdJbnQzMkFycmF5JywgJ01hcCcsICdNYXRoJywgJ09iamVjdCcsXG4gICAgJ1Byb21pc2UnLCAnUmVnRXhwJywgJ1NldCcsICdTdHJpbmcnLCAnU3ltYm9sJywgJ1R5cGVFcnJvcicsICdVaW50OEFycmF5JyxcbiAgICAnVWludDhDbGFtcGVkQXJyYXknLCAnVWludDE2QXJyYXknLCAnVWludDMyQXJyYXknLCAnV2Vha01hcCcsXG4gICAgJ18nLCAnY2xlYXJUaW1lb3V0JywgJ2lzRmluaXRlJywgJ3BhcnNlSW50JywgJ3NldFRpbWVvdXQnXG4gIF07XG5cbiAgLyoqIFVzZWQgdG8gbWFrZSB0ZW1wbGF0ZSBzb3VyY2VVUkxzIGVhc2llciB0byBpZGVudGlmeS4gKi9cbiAgdmFyIHRlbXBsYXRlQ291bnRlciA9IC0xO1xuXG4gIC8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIG9mIHR5cGVkIGFycmF5cy4gKi9cbiAgdmFyIHR5cGVkQXJyYXlUYWdzID0ge307XG4gIHR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG4gIHR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuICAvKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBzdXBwb3J0ZWQgYnkgYF8uY2xvbmVgLiAqL1xuICB2YXIgY2xvbmVhYmxlVGFncyA9IHt9O1xuICBjbG9uZWFibGVUYWdzW2FyZ3NUYWddID0gY2xvbmVhYmxlVGFnc1thcnJheVRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tib29sVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0ZVRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID0gY2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbaW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW2ludDE2VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbaW50MzJUYWddID0gY2xvbmVhYmxlVGFnc1ttYXBUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tyZWdleHBUYWddID0gY2xvbmVhYmxlVGFnc1tzZXRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tzdHJpbmdUYWddID0gY2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3VpbnQxNlRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuICBjbG9uZWFibGVUYWdzW2Vycm9yVGFnXSA9IGNsb25lYWJsZVRhZ3NbZnVuY1RhZ10gPVxuICBjbG9uZWFibGVUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbiAgLyoqIFVzZWQgdG8gbWFwIExhdGluIFVuaWNvZGUgbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzLiAqL1xuICB2YXIgZGVidXJyZWRMZXR0ZXJzID0ge1xuICAgIC8vIExhdGluLTEgU3VwcGxlbWVudCBibG9jay5cbiAgICAnXFx4YzAnOiAnQScsICAnXFx4YzEnOiAnQScsICdcXHhjMic6ICdBJywgJ1xceGMzJzogJ0EnLCAnXFx4YzQnOiAnQScsICdcXHhjNSc6ICdBJyxcbiAgICAnXFx4ZTAnOiAnYScsICAnXFx4ZTEnOiAnYScsICdcXHhlMic6ICdhJywgJ1xceGUzJzogJ2EnLCAnXFx4ZTQnOiAnYScsICdcXHhlNSc6ICdhJyxcbiAgICAnXFx4YzcnOiAnQycsICAnXFx4ZTcnOiAnYycsXG4gICAgJ1xceGQwJzogJ0QnLCAgJ1xceGYwJzogJ2QnLFxuICAgICdcXHhjOCc6ICdFJywgICdcXHhjOSc6ICdFJywgJ1xceGNhJzogJ0UnLCAnXFx4Y2InOiAnRScsXG4gICAgJ1xceGU4JzogJ2UnLCAgJ1xceGU5JzogJ2UnLCAnXFx4ZWEnOiAnZScsICdcXHhlYic6ICdlJyxcbiAgICAnXFx4Y2MnOiAnSScsICAnXFx4Y2QnOiAnSScsICdcXHhjZSc6ICdJJywgJ1xceGNmJzogJ0knLFxuICAgICdcXHhlYyc6ICdpJywgICdcXHhlZCc6ICdpJywgJ1xceGVlJzogJ2knLCAnXFx4ZWYnOiAnaScsXG4gICAgJ1xceGQxJzogJ04nLCAgJ1xceGYxJzogJ24nLFxuICAgICdcXHhkMic6ICdPJywgICdcXHhkMyc6ICdPJywgJ1xceGQ0JzogJ08nLCAnXFx4ZDUnOiAnTycsICdcXHhkNic6ICdPJywgJ1xceGQ4JzogJ08nLFxuICAgICdcXHhmMic6ICdvJywgICdcXHhmMyc6ICdvJywgJ1xceGY0JzogJ28nLCAnXFx4ZjUnOiAnbycsICdcXHhmNic6ICdvJywgJ1xceGY4JzogJ28nLFxuICAgICdcXHhkOSc6ICdVJywgICdcXHhkYSc6ICdVJywgJ1xceGRiJzogJ1UnLCAnXFx4ZGMnOiAnVScsXG4gICAgJ1xceGY5JzogJ3UnLCAgJ1xceGZhJzogJ3UnLCAnXFx4ZmInOiAndScsICdcXHhmYyc6ICd1JyxcbiAgICAnXFx4ZGQnOiAnWScsICAnXFx4ZmQnOiAneScsICdcXHhmZic6ICd5JyxcbiAgICAnXFx4YzYnOiAnQWUnLCAnXFx4ZTYnOiAnYWUnLFxuICAgICdcXHhkZSc6ICdUaCcsICdcXHhmZSc6ICd0aCcsXG4gICAgJ1xceGRmJzogJ3NzJyxcbiAgICAvLyBMYXRpbiBFeHRlbmRlZC1BIGJsb2NrLlxuICAgICdcXHUwMTAwJzogJ0EnLCAgJ1xcdTAxMDInOiAnQScsICdcXHUwMTA0JzogJ0EnLFxuICAgICdcXHUwMTAxJzogJ2EnLCAgJ1xcdTAxMDMnOiAnYScsICdcXHUwMTA1JzogJ2EnLFxuICAgICdcXHUwMTA2JzogJ0MnLCAgJ1xcdTAxMDgnOiAnQycsICdcXHUwMTBhJzogJ0MnLCAnXFx1MDEwYyc6ICdDJyxcbiAgICAnXFx1MDEwNyc6ICdjJywgICdcXHUwMTA5JzogJ2MnLCAnXFx1MDEwYic6ICdjJywgJ1xcdTAxMGQnOiAnYycsXG4gICAgJ1xcdTAxMGUnOiAnRCcsICAnXFx1MDExMCc6ICdEJywgJ1xcdTAxMGYnOiAnZCcsICdcXHUwMTExJzogJ2QnLFxuICAgICdcXHUwMTEyJzogJ0UnLCAgJ1xcdTAxMTQnOiAnRScsICdcXHUwMTE2JzogJ0UnLCAnXFx1MDExOCc6ICdFJywgJ1xcdTAxMWEnOiAnRScsXG4gICAgJ1xcdTAxMTMnOiAnZScsICAnXFx1MDExNSc6ICdlJywgJ1xcdTAxMTcnOiAnZScsICdcXHUwMTE5JzogJ2UnLCAnXFx1MDExYic6ICdlJyxcbiAgICAnXFx1MDExYyc6ICdHJywgICdcXHUwMTFlJzogJ0cnLCAnXFx1MDEyMCc6ICdHJywgJ1xcdTAxMjInOiAnRycsXG4gICAgJ1xcdTAxMWQnOiAnZycsICAnXFx1MDExZic6ICdnJywgJ1xcdTAxMjEnOiAnZycsICdcXHUwMTIzJzogJ2cnLFxuICAgICdcXHUwMTI0JzogJ0gnLCAgJ1xcdTAxMjYnOiAnSCcsICdcXHUwMTI1JzogJ2gnLCAnXFx1MDEyNyc6ICdoJyxcbiAgICAnXFx1MDEyOCc6ICdJJywgICdcXHUwMTJhJzogJ0knLCAnXFx1MDEyYyc6ICdJJywgJ1xcdTAxMmUnOiAnSScsICdcXHUwMTMwJzogJ0knLFxuICAgICdcXHUwMTI5JzogJ2knLCAgJ1xcdTAxMmInOiAnaScsICdcXHUwMTJkJzogJ2knLCAnXFx1MDEyZic6ICdpJywgJ1xcdTAxMzEnOiAnaScsXG4gICAgJ1xcdTAxMzQnOiAnSicsICAnXFx1MDEzNSc6ICdqJyxcbiAgICAnXFx1MDEzNic6ICdLJywgICdcXHUwMTM3JzogJ2snLCAnXFx1MDEzOCc6ICdrJyxcbiAgICAnXFx1MDEzOSc6ICdMJywgICdcXHUwMTNiJzogJ0wnLCAnXFx1MDEzZCc6ICdMJywgJ1xcdTAxM2YnOiAnTCcsICdcXHUwMTQxJzogJ0wnLFxuICAgICdcXHUwMTNhJzogJ2wnLCAgJ1xcdTAxM2MnOiAnbCcsICdcXHUwMTNlJzogJ2wnLCAnXFx1MDE0MCc6ICdsJywgJ1xcdTAxNDInOiAnbCcsXG4gICAgJ1xcdTAxNDMnOiAnTicsICAnXFx1MDE0NSc6ICdOJywgJ1xcdTAxNDcnOiAnTicsICdcXHUwMTRhJzogJ04nLFxuICAgICdcXHUwMTQ0JzogJ24nLCAgJ1xcdTAxNDYnOiAnbicsICdcXHUwMTQ4JzogJ24nLCAnXFx1MDE0Yic6ICduJyxcbiAgICAnXFx1MDE0Yyc6ICdPJywgICdcXHUwMTRlJzogJ08nLCAnXFx1MDE1MCc6ICdPJyxcbiAgICAnXFx1MDE0ZCc6ICdvJywgICdcXHUwMTRmJzogJ28nLCAnXFx1MDE1MSc6ICdvJyxcbiAgICAnXFx1MDE1NCc6ICdSJywgICdcXHUwMTU2JzogJ1InLCAnXFx1MDE1OCc6ICdSJyxcbiAgICAnXFx1MDE1NSc6ICdyJywgICdcXHUwMTU3JzogJ3InLCAnXFx1MDE1OSc6ICdyJyxcbiAgICAnXFx1MDE1YSc6ICdTJywgICdcXHUwMTVjJzogJ1MnLCAnXFx1MDE1ZSc6ICdTJywgJ1xcdTAxNjAnOiAnUycsXG4gICAgJ1xcdTAxNWInOiAncycsICAnXFx1MDE1ZCc6ICdzJywgJ1xcdTAxNWYnOiAncycsICdcXHUwMTYxJzogJ3MnLFxuICAgICdcXHUwMTYyJzogJ1QnLCAgJ1xcdTAxNjQnOiAnVCcsICdcXHUwMTY2JzogJ1QnLFxuICAgICdcXHUwMTYzJzogJ3QnLCAgJ1xcdTAxNjUnOiAndCcsICdcXHUwMTY3JzogJ3QnLFxuICAgICdcXHUwMTY4JzogJ1UnLCAgJ1xcdTAxNmEnOiAnVScsICdcXHUwMTZjJzogJ1UnLCAnXFx1MDE2ZSc6ICdVJywgJ1xcdTAxNzAnOiAnVScsICdcXHUwMTcyJzogJ1UnLFxuICAgICdcXHUwMTY5JzogJ3UnLCAgJ1xcdTAxNmInOiAndScsICdcXHUwMTZkJzogJ3UnLCAnXFx1MDE2Zic6ICd1JywgJ1xcdTAxNzEnOiAndScsICdcXHUwMTczJzogJ3UnLFxuICAgICdcXHUwMTc0JzogJ1cnLCAgJ1xcdTAxNzUnOiAndycsXG4gICAgJ1xcdTAxNzYnOiAnWScsICAnXFx1MDE3Nyc6ICd5JywgJ1xcdTAxNzgnOiAnWScsXG4gICAgJ1xcdTAxNzknOiAnWicsICAnXFx1MDE3Yic6ICdaJywgJ1xcdTAxN2QnOiAnWicsXG4gICAgJ1xcdTAxN2EnOiAneicsICAnXFx1MDE3Yyc6ICd6JywgJ1xcdTAxN2UnOiAneicsXG4gICAgJ1xcdTAxMzInOiAnSUonLCAnXFx1MDEzMyc6ICdpaicsXG4gICAgJ1xcdTAxNTInOiAnT2UnLCAnXFx1MDE1Myc6ICdvZScsXG4gICAgJ1xcdTAxNDknOiBcIiduXCIsICdcXHUwMTdmJzogJ3MnXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gbWFwIGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy4gKi9cbiAgdmFyIGh0bWxFc2NhcGVzID0ge1xuICAgICcmJzogJyZhbXA7JyxcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7JyxcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjMzk7J1xuICB9O1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBIVE1MIGVudGl0aWVzIHRvIGNoYXJhY3RlcnMuICovXG4gIHZhciBodG1sVW5lc2NhcGVzID0ge1xuICAgICcmYW1wOyc6ICcmJyxcbiAgICAnJmx0Oyc6ICc8JyxcbiAgICAnJmd0Oyc6ICc+JyxcbiAgICAnJnF1b3Q7JzogJ1wiJyxcbiAgICAnJiMzOTsnOiBcIidcIlxuICB9O1xuXG4gIC8qKiBVc2VkIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIGZvciBpbmNsdXNpb24gaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzLiAqL1xuICB2YXIgc3RyaW5nRXNjYXBlcyA9IHtcbiAgICAnXFxcXCc6ICdcXFxcJyxcbiAgICBcIidcIjogXCInXCIsXG4gICAgJ1xcbic6ICduJyxcbiAgICAnXFxyJzogJ3InLFxuICAgICdcXHUyMDI4JzogJ3UyMDI4JyxcbiAgICAnXFx1MjAyOSc6ICd1MjAyOSdcbiAgfTtcblxuICAvKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xuICB2YXIgZnJlZVBhcnNlRmxvYXQgPSBwYXJzZUZsb2F0LFxuICAgICAgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbiAgdmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG4gIHZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4gIC8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xuICB2YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xuICB2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xuICB2YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4gIC8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG4gIHZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xuICB2YXIgZnJlZVByb2Nlc3MgPSBtb2R1bGVFeHBvcnRzICYmIGZyZWVHbG9iYWwucHJvY2VzcztcblxuICAvKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi9cbiAgdmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy5cbiAgICAgIHZhciB0eXBlcyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlICYmIGZyZWVNb2R1bGUucmVxdWlyZSgndXRpbCcpLnR5cGVzO1xuXG4gICAgICBpZiAodHlwZXMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVzO1xuICAgICAgfVxuXG4gICAgICAvLyBMZWdhY3kgYHByb2Nlc3MuYmluZGluZygndXRpbCcpYCBmb3IgTm9kZS5qcyA8IDEwLlxuICAgICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH0oKSk7XG5cbiAgLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbiAgdmFyIG5vZGVJc0FycmF5QnVmZmVyID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNBcnJheUJ1ZmZlcixcbiAgICAgIG5vZGVJc0RhdGUgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc0RhdGUsXG4gICAgICBub2RlSXNNYXAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc01hcCxcbiAgICAgIG5vZGVJc1JlZ0V4cCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzUmVnRXhwLFxuICAgICAgbm9kZUlzU2V0ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNTZXQsXG4gICAgICBub2RlSXNUeXBlZEFycmF5ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNUeXBlZEFycmF5O1xuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8qKlxuICAgKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgXG4gICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykge1xuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKTtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlQWdncmVnYXRvcmAgZm9yIGFycmF5cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgYWdncmVnYXRlZCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlBZ2dyZWdhdG9yKGFycmF5LCBzZXR0ZXIsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBzZXR0ZXIoYWNjdW11bGF0b3IsIHZhbHVlLCBpdGVyYXRlZSh2YWx1ZSksIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RWFjaChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaFJpZ2h0YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RWFjaFJpZ2h0KGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5ldmVyeWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFdmVyeShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmICghcHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5maWx0ZXJgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBzcGVjaWZ5aW5nIGFuIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICByZXR1cm4gISFsZW5ndGggJiYgYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXJyYXlJbmNsdWRlc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKHZhbHVlLCBhcnJheVtpbmRleF0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gICAqIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyB0aGUgZWxlbWVudHMgb2YgYHZhbHVlc2AgdG8gYGFycmF5YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgIG9mZnNldCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhcnJheVtvZmZzZXQgKyBpbmRleF0gPSB2YWx1ZXNbaW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICAgKiAgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5UmVkdWNlKGFycmF5LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIGlmIChpbml0QWNjdW0gJiYgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXhdO1xuICAgIH1cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZVJpZ2h0YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAgICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVJlZHVjZVJpZ2h0KGFycmF5LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgICAgYWNjdW11bGF0b3IgPSBhcnJheVstLWxlbmd0aF07XG4gICAgfVxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbbGVuZ3RoXSwgbGVuZ3RoLCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gICAqIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICogIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2l6ZSBvZiBhbiBBU0NJSSBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgdmFyIGFzY2lpU2l6ZSA9IGJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIEFTQ0lJIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhc2NpaVRvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5zcGxpdCgnJyk7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIGFuIEFTQ0lJIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXNjaWlXb3JkcyhzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHJlQXNjaWlXb3JkKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZmluZEtleWAgYW5kIGBfLmZpbmRMYXN0S2V5YCxcbiAgICogd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB3aGljaCBpdGVyYXRlcyBvdmVyIGBjb2xsZWN0aW9uYFxuICAgKiB1c2luZyBgZWFjaEZ1bmNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmb3VuZCBlbGVtZW50IG9yIGl0cyBrZXksIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlRmluZEtleShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGVhY2hGdW5jKSB7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pKSB7XG4gICAgICAgIHJlc3VsdCA9IGtleTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmluZEluZGV4YCBhbmQgYF8uZmluZExhc3RJbmRleGAgd2l0aG91dFxuICAgKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4LCBmcm9tUmlnaHQpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGZyb21JbmRleCArIChmcm9tUmlnaHQgPyAxIDogLTEpO1xuXG4gICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmluZGV4T2ZgIHdpdGhvdXQgYGZyb21JbmRleGAgYm91bmRzIGNoZWNrcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlXG4gICAgICA/IHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpXG4gICAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgZnJvbUluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJhc2VJbmRleE9mYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSW5kZXhPZldpdGgoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgsIGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGNvbXBhcmF0b3IoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYU5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbnVtYmVyIG9iamVjdHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUlzTmFOKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZWFuYCBhbmQgYF8ubWVhbkJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlTWVhbihhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgcmV0dXJuIGxlbmd0aCA/IChiYXNlU3VtKGFycmF5LCBpdGVyYXRlZSkgLyBsZW5ndGgpIDogTkFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnByb3BlcnR5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnByb3BlcnR5T2ZgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eU9mKG9iamVjdCkge1xuICAgIHJldHVybiBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVkdWNlYCBhbmQgYF8ucmVkdWNlUmlnaHRgLCB3aXRob3V0IHN1cHBvcnRcbiAgICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gIHVzaW5nIGBlYWNoRnVuY2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHsqfSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBpbml0QWNjdW0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50IG9mXG4gICAqICBgY29sbGVjdGlvbmAgYXMgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtLCBlYWNoRnVuYykge1xuICAgIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgYWNjdW11bGF0b3IgPSBpbml0QWNjdW1cbiAgICAgICAgPyAoaW5pdEFjY3VtID0gZmFsc2UsIHZhbHVlKVxuICAgICAgICA6IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgIH0pO1xuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0QnlgIHdoaWNoIHVzZXMgYGNvbXBhcmVyYCB0byBkZWZpbmUgdGhlXG4gICAqIHNvcnQgb3JkZXIgb2YgYGFycmF5YCBhbmQgcmVwbGFjZXMgY3JpdGVyaWEgb2JqZWN0cyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmdcbiAgICogdmFsdWVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc29ydC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyZXIgVGhlIGZ1bmN0aW9uIHRvIGRlZmluZSBzb3J0IG9yZGVyLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VTb3J0QnkoYXJyYXksIGNvbXBhcmVyKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIGFycmF5LnNvcnQoY29tcGFyZXIpO1xuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgYXJyYXlbbGVuZ3RoXSA9IGFycmF5W2xlbmd0aF0udmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zdW1gIGFuZCBgXy5zdW1CeWAgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlU3VtKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciByZXN1bHQsXG4gICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSk7XG4gICAgICBpZiAoY3VycmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gY3VycmVudCA6IChyZXN1bHQgKyBjdXJyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gICAqIG9yIG1heCBhcnJheSBsZW5ndGggY2hlY2tzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkobik7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9QYWlyc2AgYW5kIGBfLnRvUGFpcnNJbmAgd2hpY2ggY3JlYXRlcyBhbiBhcnJheVxuICAgKiBvZiBrZXktdmFsdWUgcGFpcnMgZm9yIGBvYmplY3RgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzIG9mIGBwcm9wc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVG9QYWlycyhvYmplY3QsIHByb3BzKSB7XG4gICAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBba2V5LCBvYmplY3Rba2V5XV07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICAgKiBhcnJheSBvZiBgb2JqZWN0YCBwcm9wZXJ0eSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXNcbiAgICogb2YgYHByb3BzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICAgIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICAgIHJldHVybiBjYWNoZS5oYXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltU3RhcnRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHN0cmluZyBzeW1ib2xcbiAgICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHN0cmluZyBzeW1ib2xcbiAgICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB1bm1hdGNoZWQgc3RyaW5nIHN5bWJvbC5cbiAgICovXG4gIGZ1bmN0aW9uIGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykge1xuICAgIHZhciBpbmRleCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0gJiYgYmFzZUluZGV4T2YoY2hyU3ltYm9scywgc3RyU3ltYm9sc1tpbmRleF0sIDApID4gLTEpIHt9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBgcGxhY2Vob2xkZXJgIG9jY3VycmVuY2VzIGluIGBhcnJheWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byBzZWFyY2ggZm9yLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciBjb3VudC5cbiAgICovXG4gIGZ1bmN0aW9uIGNvdW50SG9sZGVycyhhcnJheSwgcGxhY2Vob2xkZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSAwO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBpZiAoYXJyYXlbbGVuZ3RoXSA9PT0gcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgKytyZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy5kZWJ1cnJgIHRvIGNvbnZlcnQgTGF0aW4tMSBTdXBwbGVtZW50IGFuZCBMYXRpbiBFeHRlbmRlZC1BXG4gICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldHRlciBUaGUgbWF0Y2hlZCBsZXR0ZXIgdG8gZGVidXJyLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBsZXR0ZXIuXG4gICAqL1xuICB2YXIgZGVidXJyTGV0dGVyID0gYmFzZVByb3BlcnR5T2YoZGVidXJyZWRMZXR0ZXJzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy5lc2NhcGVgIHRvIGNvbnZlcnQgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLlxuICAgKi9cbiAgdmFyIGVzY2FwZUh0bWxDaGFyID0gYmFzZVByb3BlcnR5T2YoaHRtbEVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRlbXBsYXRlYCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIGVzY2FwZVN0cmluZ0NoYXIoY2hyKSB7XG4gICAgcmV0dXJuICdcXFxcJyArIHN0cmluZ0VzY2FwZXNbY2hyXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBVbmljb2RlIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSBzeW1ib2wgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZS50ZXN0KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIGEgd29yZCBjb21wb3NlZCBvZiBVbmljb2RlIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSB3b3JkIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVIYXNVbmljb2RlV29yZC50ZXN0KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYGl0ZXJhdG9yYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGl0ZXJhdG9yIFRoZSBpdGVyYXRvciB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGl0ZXJhdG9yVG9BcnJheShpdGVyYXRvcikge1xuICAgIHZhciBkYXRhLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICghKGRhdGEgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGRhdGEudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcblxuICAgIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IFtrZXksIHZhbHVlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBgcGxhY2Vob2xkZXJgIGVsZW1lbnRzIGluIGBhcnJheWAgd2l0aCBhbiBpbnRlcm5hbCBwbGFjZWhvbGRlclxuICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGVpciBpbmRleGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byByZXBsYWNlLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZUhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBpZiAodmFsdWUgPT09IHBsYWNlaG9sZGVyIHx8IHZhbHVlID09PSBQTEFDRUhPTERFUikge1xuICAgICAgICBhcnJheVtpbmRleF0gPSBQTEFDRUhPTERFUjtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAsIHVubGVzcyBga2V5YCBpcyBcIl9fcHJvdG9fX1wiLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gICAgcmV0dXJuIGtleSA9PSAnX19wcm90b19fJ1xuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogb2JqZWN0W2tleV07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHNldGAgdG8gYW4gYXJyYXkgb2YgaXRzIHZhbHVlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICAgKi9cbiAgZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gICAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHNldGAgdG8gaXRzIHZhbHVlLXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBbdmFsdWUsIHZhbHVlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAgICogY29tcGFyaXNvbnMgb2YgdmFsdWVzLCBpLmUuIGA9PT1gLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5sYXN0SW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nU2l6ZShzdHJpbmcpIHtcbiAgICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICA/IHVuaWNvZGVTaXplKHN0cmluZylcbiAgICAgIDogYXNjaWlTaXplKHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlVG9BcnJheShzdHJpbmcpXG4gICAgICA6IGFzY2lpVG9BcnJheShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udW5lc2NhcGVgIHRvIGNvbnZlcnQgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byB1bmVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciB1bmVzY2FwZUh0bWxDaGFyID0gYmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgYSBVbmljb2RlIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlU2l6ZShzdHJpbmcpIHtcbiAgICB2YXIgcmVzdWx0ID0gcmVVbmljb2RlLmxhc3RJbmRleCA9IDA7XG4gICAgd2hpbGUgKHJlVW5pY29kZS50ZXN0KHN0cmluZykpIHtcbiAgICAgICsrcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgVW5pY29kZSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGUpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyBhIFVuaWNvZGUgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlV29yZHMoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGVXb3JkKSB8fCBbXTtcbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdXNpbmcgdGhlIGBjb250ZXh0YCBvYmplY3QuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIF9cbiAgICogQHNpbmNlIDEuMS4wXG4gICAqIEBjYXRlZ29yeSBVdGlsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dD1yb290XSBUaGUgY29udGV4dCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBhIG5ldyBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogXy5taXhpbih7ICdmb28nOiBfLmNvbnN0YW50KCdmb28nKSB9KTtcbiAgICpcbiAgICogdmFyIGxvZGFzaCA9IF8ucnVuSW5Db250ZXh0KCk7XG4gICAqIGxvZGFzaC5taXhpbih7ICdiYXInOiBsb2Rhc2guY29uc3RhbnQoJ2JhcicpIH0pO1xuICAgKlxuICAgKiBfLmlzRnVuY3Rpb24oXy5mb28pO1xuICAgKiAvLyA9PiB0cnVlXG4gICAqIF8uaXNGdW5jdGlvbihfLmJhcik7XG4gICAqIC8vID0+IGZhbHNlXG4gICAqXG4gICAqIGxvZGFzaC5pc0Z1bmN0aW9uKGxvZGFzaC5mb28pO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guYmFyKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKlxuICAgKiAvLyBDcmVhdGUgYSBzdXBlZC11cCBgZGVmZXJgIGluIE5vZGUuanMuXG4gICAqIHZhciBkZWZlciA9IF8ucnVuSW5Db250ZXh0KHsgJ3NldFRpbWVvdXQnOiBzZXRJbW1lZGlhdGUgfSkuZGVmZXI7XG4gICAqL1xuICB2YXIgcnVuSW5Db250ZXh0ID0gKGZ1bmN0aW9uIHJ1bkluQ29udGV4dChjb250ZXh0KSB7XG4gICAgY29udGV4dCA9IGNvbnRleHQgPT0gbnVsbCA/IHJvb3QgOiBfLmRlZmF1bHRzKHJvb3QuT2JqZWN0KCksIGNvbnRleHQsIF8ucGljayhyb290LCBjb250ZXh0UHJvcHMpKTtcblxuICAgIC8qKiBCdWlsdC1pbiBjb25zdHJ1Y3RvciByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBBcnJheSA9IGNvbnRleHQuQXJyYXksXG4gICAgICAgIERhdGUgPSBjb250ZXh0LkRhdGUsXG4gICAgICAgIEVycm9yID0gY29udGV4dC5FcnJvcixcbiAgICAgICAgRnVuY3Rpb24gPSBjb250ZXh0LkZ1bmN0aW9uLFxuICAgICAgICBNYXRoID0gY29udGV4dC5NYXRoLFxuICAgICAgICBPYmplY3QgPSBjb250ZXh0Lk9iamVjdCxcbiAgICAgICAgUmVnRXhwID0gY29udGV4dC5SZWdFeHAsXG4gICAgICAgIFN0cmluZyA9IGNvbnRleHQuU3RyaW5nLFxuICAgICAgICBUeXBlRXJyb3IgPSBjb250ZXh0LlR5cGVFcnJvcjtcblxuICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSxcbiAgICAgICAgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgICAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG4gICAgdmFyIGNvcmVKc0RhdGEgPSBjb250ZXh0WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbiAgICB2YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG4gICAgdmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbiAgICAvKiogVXNlZCB0byBnZW5lcmF0ZSB1bmlxdWUgSURzLiAqL1xuICAgIHZhciBpZENvdW50ZXIgPSAwO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbiAgICB2YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgICAgIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gICAgICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAgICAgKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAgICAgKiBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgdmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbiAgICAvKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG4gICAgdmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4gICAgLyoqIFVzZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgYF9gIHJlZmVyZW5jZSBpbiBgXy5ub0NvbmZsaWN0YC4gKi9cbiAgICB2YXIgb2xkRGFzaCA9IHJvb3QuXztcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG4gICAgdmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gICAgICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbiAgICApO1xuXG4gICAgLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyBjb250ZXh0LkJ1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgU3ltYm9sID0gY29udGV4dC5TeW1ib2wsXG4gICAgICAgIFVpbnQ4QXJyYXkgPSBjb250ZXh0LlVpbnQ4QXJyYXksXG4gICAgICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkLFxuICAgICAgICBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KSxcbiAgICAgICAgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZSxcbiAgICAgICAgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxcbiAgICAgICAgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2UsXG4gICAgICAgIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1JdGVyYXRvciA9IFN5bWJvbCA/IFN5bWJvbC5pdGVyYXRvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbiAgICB2YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgICAgICBmdW5jKHt9LCAnJywge30pO1xuICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfSgpKTtcblxuICAgIC8qKiBNb2NrZWQgYnVpbHQtaW5zLiAqL1xuICAgIHZhciBjdHhDbGVhclRpbWVvdXQgPSBjb250ZXh0LmNsZWFyVGltZW91dCAhPT0gcm9vdC5jbGVhclRpbWVvdXQgJiYgY29udGV4dC5jbGVhclRpbWVvdXQsXG4gICAgICAgIGN0eE5vdyA9IERhdGUgJiYgRGF0ZS5ub3cgIT09IHJvb3QuRGF0ZS5ub3cgJiYgRGF0ZS5ub3csXG4gICAgICAgIGN0eFNldFRpbWVvdXQgPSBjb250ZXh0LnNldFRpbWVvdXQgIT09IHJvb3Quc2V0VGltZW91dCAmJiBjb250ZXh0LnNldFRpbWVvdXQ7XG5cbiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG4gICAgdmFyIG5hdGl2ZUNlaWwgPSBNYXRoLmNlaWwsXG4gICAgICAgIG5hdGl2ZUZsb29yID0gTWF0aC5mbG9vcixcbiAgICAgICAgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsXG4gICAgICAgIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgICAgICBuYXRpdmVJc0Zpbml0ZSA9IGNvbnRleHQuaXNGaW5pdGUsXG4gICAgICAgIG5hdGl2ZUpvaW4gPSBhcnJheVByb3RvLmpvaW4sXG4gICAgICAgIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpLFxuICAgICAgICBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICAgICAgbmF0aXZlTWluID0gTWF0aC5taW4sXG4gICAgICAgIG5hdGl2ZU5vdyA9IERhdGUubm93LFxuICAgICAgICBuYXRpdmVQYXJzZUludCA9IGNvbnRleHQucGFyc2VJbnQsXG4gICAgICAgIG5hdGl2ZVJhbmRvbSA9IE1hdGgucmFuZG9tLFxuICAgICAgICBuYXRpdmVSZXZlcnNlID0gYXJyYXlQcm90by5yZXZlcnNlO1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xuICAgIHZhciBEYXRhVmlldyA9IGdldE5hdGl2ZShjb250ZXh0LCAnRGF0YVZpZXcnKSxcbiAgICAgICAgTWFwID0gZ2V0TmF0aXZlKGNvbnRleHQsICdNYXAnKSxcbiAgICAgICAgUHJvbWlzZSA9IGdldE5hdGl2ZShjb250ZXh0LCAnUHJvbWlzZScpLFxuICAgICAgICBTZXQgPSBnZXROYXRpdmUoY29udGV4dCwgJ1NldCcpLFxuICAgICAgICBXZWFrTWFwID0gZ2V0TmF0aXZlKGNvbnRleHQsICdXZWFrTWFwJyksXG4gICAgICAgIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxuICAgIC8qKiBVc2VkIHRvIHN0b3JlIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xuICAgIHZhciBtZXRhTWFwID0gV2Vha01hcCAmJiBuZXcgV2Vha01hcDtcblxuICAgIC8qKiBVc2VkIHRvIGxvb2t1cCB1bm1pbmlmaWVkIGZ1bmN0aW9uIG5hbWVzLiAqL1xuICAgIHZhciByZWFsTmFtZXMgPSB7fTtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtYXBzLCBzZXRzLCBhbmQgd2Vha21hcHMuICovXG4gICAgdmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSxcbiAgICAgICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgICAgIHByb21pc2VDdG9yU3RyaW5nID0gdG9Tb3VyY2UoUHJvbWlzZSksXG4gICAgICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLFxuICAgICAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4gICAgLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG4gICAgdmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnRvU3RyaW5nIDogdW5kZWZpbmVkO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBpbXBsaWNpdCBtZXRob2RcbiAgICAgKiBjaGFpbiBzZXF1ZW5jZXMuIE1ldGhvZHMgdGhhdCBvcGVyYXRlIG9uIGFuZCByZXR1cm4gYXJyYXlzLCBjb2xsZWN0aW9ucyxcbiAgICAgKiBhbmQgZnVuY3Rpb25zIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyLiBNZXRob2RzIHRoYXQgcmV0cmlldmUgYSBzaW5nbGUgdmFsdWVcbiAgICAgKiBvciBtYXkgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlIHdpbGwgYXV0b21hdGljYWxseSBlbmQgdGhlIGNoYWluIHNlcXVlbmNlXG4gICAgICogYW5kIHJldHVybiB0aGUgdW53cmFwcGVkIHZhbHVlLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAqIHdpdGggYF8jdmFsdWVgLlxuICAgICAqXG4gICAgICogRXhwbGljaXQgY2hhaW4gc2VxdWVuY2VzLCB3aGljaCBtdXN0IGJlIHVud3JhcHBlZCB3aXRoIGBfI3ZhbHVlYCwgbWF5IGJlXG4gICAgICogZW5hYmxlZCB1c2luZyBgXy5jaGFpbmAuXG4gICAgICpcbiAgICAgKiBUaGUgZXhlY3V0aW9uIG9mIGNoYWluZWQgbWV0aG9kcyBpcyBsYXp5LCB0aGF0IGlzLCBpdCdzIGRlZmVycmVkIHVudGlsXG4gICAgICogYF8jdmFsdWVgIGlzIGltcGxpY2l0bHkgb3IgZXhwbGljaXRseSBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBMYXp5IGV2YWx1YXRpb24gYWxsb3dzIHNldmVyYWwgbWV0aG9kcyB0byBzdXBwb3J0IHNob3J0Y3V0IGZ1c2lvbi5cbiAgICAgKiBTaG9ydGN1dCBmdXNpb24gaXMgYW4gb3B0aW1pemF0aW9uIHRvIG1lcmdlIGl0ZXJhdGVlIGNhbGxzOyB0aGlzIGF2b2lkc1xuICAgICAqIHRoZSBjcmVhdGlvbiBvZiBpbnRlcm1lZGlhdGUgYXJyYXlzIGFuZCBjYW4gZ3JlYXRseSByZWR1Y2UgdGhlIG51bWJlciBvZlxuICAgICAqIGl0ZXJhdGVlIGV4ZWN1dGlvbnMuIFNlY3Rpb25zIG9mIGEgY2hhaW4gc2VxdWVuY2UgcXVhbGlmeSBmb3Igc2hvcnRjdXRcbiAgICAgKiBmdXNpb24gaWYgdGhlIHNlY3Rpb24gaXMgYXBwbGllZCB0byBhbiBhcnJheSBhbmQgaXRlcmF0ZWVzIGFjY2VwdCBvbmx5XG4gICAgICogb25lIGFyZ3VtZW50LiBUaGUgaGV1cmlzdGljIGZvciB3aGV0aGVyIGEgc2VjdGlvbiBxdWFsaWZpZXMgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlzIHN1YmplY3QgdG8gY2hhbmdlLlxuICAgICAqXG4gICAgICogQ2hhaW5pbmcgaXMgc3VwcG9ydGVkIGluIGN1c3RvbSBidWlsZHMgYXMgbG9uZyBhcyB0aGUgYF8jdmFsdWVgIG1ldGhvZCBpc1xuICAgICAqIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLlxuICAgICAqXG4gICAgICogSW4gYWRkaXRpb24gdG8gbG9kYXNoIG1ldGhvZHMsIHdyYXBwZXJzIGhhdmUgYEFycmF5YCBhbmQgYFN0cmluZ2AgbWV0aG9kcy5cbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBBcnJheWAgbWV0aG9kcyBhcmU6XG4gICAgICogYGNvbmNhdGAsIGBqb2luYCwgYHBvcGAsIGBwdXNoYCwgYHNoaWZ0YCwgYHNvcnRgLCBgc3BsaWNlYCwgYW5kIGB1bnNoaWZ0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgYFN0cmluZ2AgbWV0aG9kcyBhcmU6XG4gICAgICogYHJlcGxhY2VgIGFuZCBgc3BsaXRgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24gYXJlOlxuICAgICAqIGBhdGAsIGBjb21wYWN0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGRyb3BXaGlsZWAsIGBmaWx0ZXJgLCBgZmluZGAsXG4gICAgICogYGZpbmRMYXN0YCwgYGhlYWRgLCBgaW5pdGlhbGAsIGBsYXN0YCwgYG1hcGAsIGByZWplY3RgLCBgcmV2ZXJzZWAsIGBzbGljZWAsXG4gICAgICogYHRhaWxgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLCBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYW5kIGB0b0FycmF5YFxuICAgICAqXG4gICAgICogVGhlIGNoYWluYWJsZSB3cmFwcGVyIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhZnRlcmAsIGBhcnlgLCBgYXNzaWduYCwgYGFzc2lnbkluYCwgYGFzc2lnbkluV2l0aGAsIGBhc3NpZ25XaXRoYCwgYGF0YCxcbiAgICAgKiBgYmVmb3JlYCwgYGJpbmRgLCBgYmluZEFsbGAsIGBiaW5kS2V5YCwgYGNhc3RBcnJheWAsIGBjaGFpbmAsIGBjaHVua2AsXG4gICAgICogYGNvbW1pdGAsIGBjb21wYWN0YCwgYGNvbmNhdGAsIGBjb25mb3Jtc2AsIGBjb25zdGFudGAsIGBjb3VudEJ5YCwgYGNyZWF0ZWAsXG4gICAgICogYGN1cnJ5YCwgYGRlYm91bmNlYCwgYGRlZmF1bHRzYCwgYGRlZmF1bHRzRGVlcGAsIGBkZWZlcmAsIGBkZWxheWAsXG4gICAgICogYGRpZmZlcmVuY2VgLCBgZGlmZmVyZW5jZUJ5YCwgYGRpZmZlcmVuY2VXaXRoYCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCxcbiAgICAgKiBgZHJvcFJpZ2h0V2hpbGVgLCBgZHJvcFdoaWxlYCwgYGV4dGVuZGAsIGBleHRlbmRXaXRoYCwgYGZpbGxgLCBgZmlsdGVyYCxcbiAgICAgKiBgZmxhdE1hcGAsIGBmbGF0TWFwRGVlcGAsIGBmbGF0TWFwRGVwdGhgLCBgZmxhdHRlbmAsIGBmbGF0dGVuRGVlcGAsXG4gICAgICogYGZsYXR0ZW5EZXB0aGAsIGBmbGlwYCwgYGZsb3dgLCBgZmxvd1JpZ2h0YCwgYGZyb21QYWlyc2AsIGBmdW5jdGlvbnNgLFxuICAgICAqIGBmdW5jdGlvbnNJbmAsIGBncm91cEJ5YCwgYGluaXRpYWxgLCBgaW50ZXJzZWN0aW9uYCwgYGludGVyc2VjdGlvbkJ5YCxcbiAgICAgKiBgaW50ZXJzZWN0aW9uV2l0aGAsIGBpbnZlcnRgLCBgaW52ZXJ0QnlgLCBgaW52b2tlTWFwYCwgYGl0ZXJhdGVlYCwgYGtleUJ5YCxcbiAgICAgKiBga2V5c2AsIGBrZXlzSW5gLCBgbWFwYCwgYG1hcEtleXNgLCBgbWFwVmFsdWVzYCwgYG1hdGNoZXNgLCBgbWF0Y2hlc1Byb3BlcnR5YCxcbiAgICAgKiBgbWVtb2l6ZWAsIGBtZXJnZWAsIGBtZXJnZVdpdGhgLCBgbWV0aG9kYCwgYG1ldGhvZE9mYCwgYG1peGluYCwgYG5lZ2F0ZWAsXG4gICAgICogYG50aEFyZ2AsIGBvbWl0YCwgYG9taXRCeWAsIGBvbmNlYCwgYG9yZGVyQnlgLCBgb3ZlcmAsIGBvdmVyQXJnc2AsXG4gICAgICogYG92ZXJFdmVyeWAsIGBvdmVyU29tZWAsIGBwYXJ0aWFsYCwgYHBhcnRpYWxSaWdodGAsIGBwYXJ0aXRpb25gLCBgcGlja2AsXG4gICAgICogYHBpY2tCeWAsIGBwbGFudGAsIGBwcm9wZXJ0eWAsIGBwcm9wZXJ0eU9mYCwgYHB1bGxgLCBgcHVsbEFsbGAsIGBwdWxsQWxsQnlgLFxuICAgICAqIGBwdWxsQWxsV2l0aGAsIGBwdWxsQXRgLCBgcHVzaGAsIGByYW5nZWAsIGByYW5nZVJpZ2h0YCwgYHJlYXJnYCwgYHJlamVjdGAsXG4gICAgICogYHJlbW92ZWAsIGByZXN0YCwgYHJldmVyc2VgLCBgc2FtcGxlU2l6ZWAsIGBzZXRgLCBgc2V0V2l0aGAsIGBzaHVmZmxlYCxcbiAgICAgKiBgc2xpY2VgLCBgc29ydGAsIGBzb3J0QnlgLCBgc3BsaWNlYCwgYHNwcmVhZGAsIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAgICAgKiBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYHRhcGAsIGB0aHJvdHRsZWAsIGB0aHJ1YCwgYHRvQXJyYXlgLFxuICAgICAqIGB0b1BhaXJzYCwgYHRvUGFpcnNJbmAsIGB0b1BhdGhgLCBgdG9QbGFpbk9iamVjdGAsIGB0cmFuc2Zvcm1gLCBgdW5hcnlgLFxuICAgICAqIGB1bmlvbmAsIGB1bmlvbkJ5YCwgYHVuaW9uV2l0aGAsIGB1bmlxYCwgYHVuaXFCeWAsIGB1bmlxV2l0aGAsIGB1bnNldGAsXG4gICAgICogYHVuc2hpZnRgLCBgdW56aXBgLCBgdW56aXBXaXRoYCwgYHVwZGF0ZWAsIGB1cGRhdGVXaXRoYCwgYHZhbHVlc2AsXG4gICAgICogYHZhbHVlc0luYCwgYHdpdGhvdXRgLCBgd3JhcGAsIGB4b3JgLCBgeG9yQnlgLCBgeG9yV2l0aGAsIGB6aXBgLFxuICAgICAqIGB6aXBPYmplY3RgLCBgemlwT2JqZWN0RGVlcGAsIGFuZCBgemlwV2l0aGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIG1ldGhvZHMgdGhhdCBhcmUgKipub3QqKiBjaGFpbmFibGUgYnkgZGVmYXVsdCBhcmU6XG4gICAgICogYGFkZGAsIGBhdHRlbXB0YCwgYGNhbWVsQ2FzZWAsIGBjYXBpdGFsaXplYCwgYGNlaWxgLCBgY2xhbXBgLCBgY2xvbmVgLFxuICAgICAqIGBjbG9uZURlZXBgLCBgY2xvbmVEZWVwV2l0aGAsIGBjbG9uZVdpdGhgLCBgY29uZm9ybXNUb2AsIGBkZWJ1cnJgLFxuICAgICAqIGBkZWZhdWx0VG9gLCBgZGl2aWRlYCwgYGVhY2hgLCBgZWFjaFJpZ2h0YCwgYGVuZHNXaXRoYCwgYGVxYCwgYGVzY2FwZWAsXG4gICAgICogYGVzY2FwZVJlZ0V4cGAsIGBldmVyeWAsIGBmaW5kYCwgYGZpbmRJbmRleGAsIGBmaW5kS2V5YCwgYGZpbmRMYXN0YCxcbiAgICAgKiBgZmluZExhc3RJbmRleGAsIGBmaW5kTGFzdEtleWAsIGBmaXJzdGAsIGBmbG9vcmAsIGBmb3JFYWNoYCwgYGZvckVhY2hSaWdodGAsXG4gICAgICogYGZvckluYCwgYGZvckluUmlnaHRgLCBgZm9yT3duYCwgYGZvck93blJpZ2h0YCwgYGdldGAsIGBndGAsIGBndGVgLCBgaGFzYCxcbiAgICAgKiBgaGFzSW5gLCBgaGVhZGAsIGBpZGVudGl0eWAsIGBpbmNsdWRlc2AsIGBpbmRleE9mYCwgYGluUmFuZ2VgLCBgaW52b2tlYCxcbiAgICAgKiBgaXNBcmd1bWVudHNgLCBgaXNBcnJheWAsIGBpc0FycmF5QnVmZmVyYCwgYGlzQXJyYXlMaWtlYCwgYGlzQXJyYXlMaWtlT2JqZWN0YCxcbiAgICAgKiBgaXNCb29sZWFuYCwgYGlzQnVmZmVyYCwgYGlzRGF0ZWAsIGBpc0VsZW1lbnRgLCBgaXNFbXB0eWAsIGBpc0VxdWFsYCxcbiAgICAgKiBgaXNFcXVhbFdpdGhgLCBgaXNFcnJvcmAsIGBpc0Zpbml0ZWAsIGBpc0Z1bmN0aW9uYCwgYGlzSW50ZWdlcmAsIGBpc0xlbmd0aGAsXG4gICAgICogYGlzTWFwYCwgYGlzTWF0Y2hgLCBgaXNNYXRjaFdpdGhgLCBgaXNOYU5gLCBgaXNOYXRpdmVgLCBgaXNOaWxgLCBgaXNOdWxsYCxcbiAgICAgKiBgaXNOdW1iZXJgLCBgaXNPYmplY3RgLCBgaXNPYmplY3RMaWtlYCwgYGlzUGxhaW5PYmplY3RgLCBgaXNSZWdFeHBgLFxuICAgICAqIGBpc1NhZmVJbnRlZ2VyYCwgYGlzU2V0YCwgYGlzU3RyaW5nYCwgYGlzVW5kZWZpbmVkYCwgYGlzVHlwZWRBcnJheWAsXG4gICAgICogYGlzV2Vha01hcGAsIGBpc1dlYWtTZXRgLCBgam9pbmAsIGBrZWJhYkNhc2VgLCBgbGFzdGAsIGBsYXN0SW5kZXhPZmAsXG4gICAgICogYGxvd2VyQ2FzZWAsIGBsb3dlckZpcnN0YCwgYGx0YCwgYGx0ZWAsIGBtYXhgLCBgbWF4QnlgLCBgbWVhbmAsIGBtZWFuQnlgLFxuICAgICAqIGBtaW5gLCBgbWluQnlgLCBgbXVsdGlwbHlgLCBgbm9Db25mbGljdGAsIGBub29wYCwgYG5vd2AsIGBudGhgLCBgcGFkYCxcbiAgICAgKiBgcGFkRW5kYCwgYHBhZFN0YXJ0YCwgYHBhcnNlSW50YCwgYHBvcGAsIGByYW5kb21gLCBgcmVkdWNlYCwgYHJlZHVjZVJpZ2h0YCxcbiAgICAgKiBgcmVwZWF0YCwgYHJlc3VsdGAsIGByb3VuZGAsIGBydW5JbkNvbnRleHRgLCBgc2FtcGxlYCwgYHNoaWZ0YCwgYHNpemVgLFxuICAgICAqIGBzbmFrZUNhc2VgLCBgc29tZWAsIGBzb3J0ZWRJbmRleGAsIGBzb3J0ZWRJbmRleEJ5YCwgYHNvcnRlZExhc3RJbmRleGAsXG4gICAgICogYHNvcnRlZExhc3RJbmRleEJ5YCwgYHN0YXJ0Q2FzZWAsIGBzdGFydHNXaXRoYCwgYHN0dWJBcnJheWAsIGBzdHViRmFsc2VgLFxuICAgICAqIGBzdHViT2JqZWN0YCwgYHN0dWJTdHJpbmdgLCBgc3R1YlRydWVgLCBgc3VidHJhY3RgLCBgc3VtYCwgYHN1bUJ5YCxcbiAgICAgKiBgdGVtcGxhdGVgLCBgdGltZXNgLCBgdG9GaW5pdGVgLCBgdG9JbnRlZ2VyYCwgYHRvSlNPTmAsIGB0b0xlbmd0aGAsXG4gICAgICogYHRvTG93ZXJgLCBgdG9OdW1iZXJgLCBgdG9TYWZlSW50ZWdlcmAsIGB0b1N0cmluZ2AsIGB0b1VwcGVyYCwgYHRyaW1gLFxuICAgICAqIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGB0cnVuY2F0ZWAsIGB1bmVzY2FwZWAsIGB1bmlxdWVJZGAsIGB1cHBlckNhc2VgLFxuICAgICAqIGB1cHBlckZpcnN0YCwgYHZhbHVlYCwgYW5kIGB3b3Jkc2BcbiAgICAgKlxuICAgICAqIEBuYW1lIF9cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBhIGBsb2Rhc2hgIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMiwgM10pO1xuICAgICAqXG4gICAgICogLy8gUmV0dXJucyBhbiB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogd3JhcHBlZC5yZWR1Y2UoXy5hZGQpO1xuICAgICAqIC8vID0+IDZcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYSB3cmFwcGVkIHZhbHVlLlxuICAgICAqIHZhciBzcXVhcmVzID0gd3JhcHBlZC5tYXAoc3F1YXJlKTtcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KHNxdWFyZXMudmFsdWUoKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxvZGFzaCh2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzQXJyYXkodmFsdWUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ19fd3JhcHBlZF9fJykpIHtcbiAgICAgICAgICByZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gICAgICogcHJvcGVydGllcyB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90byBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIHZhciBiYXNlQ3JlYXRlID0gKGZ1bmN0aW9uKCkge1xuICAgICAgZnVuY3Rpb24gb2JqZWN0KCkge31cbiAgICAgIHJldHVybiBmdW5jdGlvbihwcm90bykge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KHByb3RvKSkge1xuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JqZWN0Q3JlYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0LnByb3RvdHlwZSA9IHByb3RvO1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICAgICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdW5jdGlvbiB3aG9zZSBwcm90b3R5cGUgY2hhaW4gc2VxdWVuY2Ugd3JhcHBlcnMgaW5oZXJpdCBmcm9tLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTG9kYXNoKCkge1xuICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgYGxvZGFzaGAgd3JhcHBlciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NoYWluQWxsXSBFbmFibGUgZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMb2Rhc2hXcmFwcGVyKHZhbHVlLCBjaGFpbkFsbCkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2NoYWluX18gPSAhIWNoYWluQWxsO1xuICAgICAgdGhpcy5fX2luZGV4X18gPSAwO1xuICAgICAgdGhpcy5fX3ZhbHVlc19fID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzIHVzZWQgYnkgbG9kYXNoIGFyZSBsaWtlIHRob3NlIGluXG4gICAgICogZW1iZWRkZWQgUnVieSAoRVJCKSBhcyB3ZWxsIGFzIEVTMjAxNSB0ZW1wbGF0ZSBzdHJpbmdzLiBDaGFuZ2UgdGhlXG4gICAgICogZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncyA9IHtcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGJlIEhUTUwtZXNjYXBlZC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnZXNjYXBlJzogcmVFc2NhcGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgY29kZSB0byBiZSBldmFsdWF0ZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2V2YWx1YXRlJzogcmVFdmFsdWF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGluamVjdC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnaW50ZXJwb2xhdGUnOiByZUludGVycG9sYXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gcmVmZXJlbmNlIHRoZSBkYXRhIG9iamVjdCBpbiB0aGUgdGVtcGxhdGUgdGV4dC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICovXG4gICAgICAndmFyaWFibGUnOiAnJyxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGltcG9ydCB2YXJpYWJsZXMgaW50byB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAqL1xuICAgICAgJ2ltcG9ydHMnOiB7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzXG4gICAgICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgICdfJzogbG9kYXNoXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEVuc3VyZSB3cmFwcGVycyBhcmUgaW5zdGFuY2VzIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBsb2Rhc2gucHJvdG90eXBlID0gYmFzZUxvZGFzaC5wcm90b3R5cGU7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGxvZGFzaDtcblxuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7XG4gICAgTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMb2Rhc2hXcmFwcGVyO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGxhenkgd3JhcHBlciBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgbGF6eSBldmFsdWF0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExhenlXcmFwcGVyKHZhbHVlKSB7XG4gICAgICB0aGlzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICB0aGlzLl9fYWN0aW9uc19fID0gW107XG4gICAgICB0aGlzLl9fZGlyX18gPSAxO1xuICAgICAgdGhpcy5fX2ZpbHRlcmVkX18gPSBmYWxzZTtcbiAgICAgIHRoaXMuX19pdGVyYXRlZXNfXyA9IFtdO1xuICAgICAgdGhpcy5fX3Rha2VDb3VudF9fID0gTUFYX0FSUkFZX0xFTkdUSDtcbiAgICAgIHRoaXMuX192aWV3c19fID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBsYXp5IHdyYXBwZXIgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbG9uZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5Q2xvbmUoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IExhenlXcmFwcGVyKHRoaXMuX193cmFwcGVkX18pO1xuICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO1xuICAgICAgcmVzdWx0Ll9fZGlyX18gPSB0aGlzLl9fZGlyX187XG4gICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gdGhpcy5fX2ZpbHRlcmVkX187XG4gICAgICByZXN1bHQuX19pdGVyYXRlZXNfXyA9IGNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO1xuICAgICAgcmVzdWx0Ll9fdGFrZUNvdW50X18gPSB0aGlzLl9fdGFrZUNvdW50X187XG4gICAgICByZXN1bHQuX192aWV3c19fID0gY29weUFycmF5KHRoaXMuX192aWV3c19fKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZXMgdGhlIGRpcmVjdGlvbiBvZiBsYXp5IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgcmV2ZXJzZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyByZXZlcnNlZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5UmV2ZXJzZSgpIHtcbiAgICAgIGlmICh0aGlzLl9fZmlsdGVyZWRfXykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICByZXN1bHQuX19kaXJfXyA9IC0xO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gKj0gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHRoZSB1bndyYXBwZWQgdmFsdWUgZnJvbSBpdHMgbGF6eSB3cmFwcGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVZhbHVlKCkge1xuICAgICAgdmFyIGFycmF5ID0gdGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLFxuICAgICAgICAgIGRpciA9IHRoaXMuX19kaXJfXyxcbiAgICAgICAgICBpc0FyciA9IGlzQXJyYXkoYXJyYXkpLFxuICAgICAgICAgIGlzUmlnaHQgPSBkaXIgPCAwLFxuICAgICAgICAgIGFyckxlbmd0aCA9IGlzQXJyID8gYXJyYXkubGVuZ3RoIDogMCxcbiAgICAgICAgICB2aWV3ID0gZ2V0VmlldygwLCBhcnJMZW5ndGgsIHRoaXMuX192aWV3c19fKSxcbiAgICAgICAgICBzdGFydCA9IHZpZXcuc3RhcnQsXG4gICAgICAgICAgZW5kID0gdmlldy5lbmQsXG4gICAgICAgICAgbGVuZ3RoID0gZW5kIC0gc3RhcnQsXG4gICAgICAgICAgaW5kZXggPSBpc1JpZ2h0ID8gZW5kIDogKHN0YXJ0IC0gMSksXG4gICAgICAgICAgaXRlcmF0ZWVzID0gdGhpcy5fX2l0ZXJhdGVlc19fLFxuICAgICAgICAgIGl0ZXJMZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICB0YWtlQ291bnQgPSBuYXRpdmVNaW4obGVuZ3RoLCB0aGlzLl9fdGFrZUNvdW50X18pO1xuXG4gICAgICBpZiAoIWlzQXJyIHx8ICghaXNSaWdodCAmJiBhcnJMZW5ndGggPT0gbGVuZ3RoICYmIHRha2VDb3VudCA9PSBsZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBiYXNlV3JhcHBlclZhbHVlKGFycmF5LCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAobGVuZ3RoLS0gJiYgcmVzSW5kZXggPCB0YWtlQ291bnQpIHtcbiAgICAgICAgaW5kZXggKz0gZGlyO1xuXG4gICAgICAgIHZhciBpdGVySW5kZXggPSAtMSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgICAgIHdoaWxlICgrK2l0ZXJJbmRleCA8IGl0ZXJMZW5ndGgpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGl0ZXJhdGVlc1tpdGVySW5kZXhdLFxuICAgICAgICAgICAgICBpdGVyYXRlZSA9IGRhdGEuaXRlcmF0ZWUsXG4gICAgICAgICAgICAgIHR5cGUgPSBkYXRhLnR5cGUsXG4gICAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9NQVBfRkxBRykge1xuICAgICAgICAgICAgdmFsdWUgPSBjb21wdXRlZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZCkge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9GSUxURVJfRkxBRykge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGBMYXp5V3JhcHBlcmAgaXMgYW4gaW5zdGFuY2Ugb2YgYGJhc2VMb2Rhc2hgLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExhenlXcmFwcGVyO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgICAgIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgICAgIHJldHVybiByZXN1bHQgPT09IEhBU0hfVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICAgICAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG4gICAgSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG4gICAgSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gaGFzaERlbGV0ZTtcbiAgICBIYXNoLnByb3RvdHlwZS5nZXQgPSBoYXNoR2V0O1xuICAgIEhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG4gICAgSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICAgICAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgICAgICBkYXRhLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgLS10aGlzLnNpemU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbGlzdCBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgKyt0aGlzLnNpemU7XG4gICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhcztcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAgICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IG1hcENhY2hlR2V0O1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBgdmFsdWVgIHRvIHRoZSBhcnJheSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgYWRkXG4gICAgICogQG1lbWJlck9mIFNldENhY2hlXG4gICAgICogQGFsaWFzIHB1c2hcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSkge1xuICAgICAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFNldENhY2hlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cbiAgICBTZXRDYWNoZS5wcm90b3R5cGUuYWRkID0gU2V0Q2FjaGUucHJvdG90eXBlLnB1c2ggPSBzZXRDYWNoZUFkZDtcbiAgICBTZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3RhY2sgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gU3RhY2soZW50cmllcykge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZShlbnRyaWVzKTtcbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0NsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3RhY2sgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdGFjayBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICAgICAgdmFyIHBhaXJzID0gZGF0YS5fX2RhdGFfXztcbiAgICAgICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgICAgICB0aGlzLnNpemUgPSArK2RhdGEuc2l6ZTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlycyk7XG4gICAgICB9XG4gICAgICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTdGFja2AuXG4gICAgU3RhY2sucHJvdG90eXBlLmNsZWFyID0gc3RhY2tDbGVhcjtcbiAgICBTdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG4gICAgU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xuICAgIFN0YWNrLnByb3RvdHlwZS5oYXMgPSBzdGFja0hhcztcbiAgICBTdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5oZXJpdGVkIFNwZWNpZnkgcmV0dXJuaW5nIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkge1xuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiAhaXNBcmcgJiYgaXNCdWZmZXIodmFsdWUpLFxuICAgICAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgICAgICByZXN1bHQgPSBza2lwSW5kZXhlcyA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZykgOiBbXSxcbiAgICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkgJiZcbiAgICAgICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICAgICAga2V5ID09ICdsZW5ndGgnIHx8XG4gICAgICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gUGhhbnRvbUpTIDIgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gdHlwZWQgYXJyYXlzLlxuICAgICAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgICAgICBpc0luZGV4KGtleSwgbGVuZ3RoKVxuICAgICAgICAgICAgKSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zYW1wbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2FtcGxlKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2Jhc2VSYW5kb20oMCwgbGVuZ3RoIC0gMSldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zYW1wbGVTaXplYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2FtcGxlU2l6ZShhcnJheSwgbikge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSksIGJhc2VDbGFtcChuLCAwLCBhcnJheS5sZW5ndGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KSB7XG4gICAgICByZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhc3NpZ25WYWx1ZWAgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBhc3NpZ25cbiAgICAgKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICBpZiAoKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWVxKG9iamVjdFtrZXldLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldO1xuICAgICAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFnZ3JlZ2F0ZXMgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIG9uIGBhY2N1bXVsYXRvcmAgd2l0aCBrZXlzIHRyYW5zZm9ybWVkXG4gICAgICogYnkgYGl0ZXJhdGVlYCBhbmQgdmFsdWVzIHNldCBieSBgc2V0dGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgYWdncmVnYXRlZCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbiwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gICAgICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXNzaWduKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICAgICAqIHZhbHVlIGNoZWNrcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBkZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAndmFsdWUnOiB2YWx1ZSxcbiAgICAgICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcGlja2VkIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBdChvYmplY3QsIHBhdGhzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgICBza2lwID0gb2JqZWN0ID09IG51bGw7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBza2lwID8gdW5kZWZpbmVkIDogZ2V0KG9iamVjdCwgcGF0aHNbaW5kZXhdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xhbXBgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXJdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICAgICAgaWYgKG51bWJlciA9PT0gbnVtYmVyKSB7XG4gICAgICAgIGlmICh1cHBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyIDw9IHVwcGVyID8gbnVtYmVyIDogdXBwZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvd2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBudW1iZXIgPSBudW1iZXIgPj0gbG93ZXIgPyBudW1iZXIgOiBsb3dlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbG9uZWAgYW5kIGBfLmNsb25lRGVlcGAgd2hpY2ggdHJhY2tzXG4gICAgICogdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgMSAtIERlZXAgY2xvbmVcbiAgICAgKiAgMiAtIEZsYXR0ZW4gaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAgICAgKiAgNCAtIENsb25lIHN5bWJvbHNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGB2YWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGFuZCB0aGVpciBjbG9uZSBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xvbmUodmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgb2JqZWN0LCBzdGFjaykge1xuICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICBpc0RlZXAgPSBiaXRtYXNrICYgQ0xPTkVfREVFUF9GTEFHLFxuICAgICAgICAgIGlzRmxhdCA9IGJpdG1hc2sgJiBDTE9ORV9GTEFUX0ZMQUcsXG4gICAgICAgICAgaXNGdWxsID0gYml0bWFzayAmIENMT05FX1NZTUJPTFNfRkxBRztcblxuICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgcmVzdWx0ID0gb2JqZWN0ID8gY3VzdG9taXplcih2YWx1ZSwga2V5LCBvYmplY3QsIHN0YWNrKSA6IGN1c3RvbWl6ZXIodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTtcbiAgICAgIGlmIChpc0Fycikge1xuICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgICAgIGlmICghaXNEZWVwKSB7XG4gICAgICAgICAgcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgICBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xuXG4gICAgICAgIGlmIChpc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsIGlzRGVlcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZyA9PSBvYmplY3RUYWcgfHwgdGFnID09IGFyZ3NUYWcgfHwgKGlzRnVuYyAmJiAhb2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdCA9IChpc0ZsYXQgfHwgaXNGdW5jKSA/IHt9IDogaW5pdENsb25lT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgICAgcmV0dXJuIGlzRmxhdFxuICAgICAgICAgICAgICA/IGNvcHlTeW1ib2xzSW4odmFsdWUsIGJhc2VBc3NpZ25JbihyZXN1bHQsIHZhbHVlKSlcbiAgICAgICAgICAgICAgOiBjb3B5U3ltYm9scyh2YWx1ZSwgYmFzZUFzc2lnbihyZXN1bHQsIHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghY2xvbmVhYmxlVGFnc1t0YWddKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUgOiB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQnlUYWcodmFsdWUsIHRhZywgaXNEZWVwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldCh2YWx1ZSk7XG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZDtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnNldCh2YWx1ZSwgcmVzdWx0KTtcblxuICAgICAgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0LmFkZChiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN1YlZhbHVlLCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTWFwKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgICAgICByZXN1bHQuc2V0KGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICB2YXIga2V5c0Z1bmMgPSBpc0Z1bGxcbiAgICAgICAgPyAoaXNGbGF0ID8gZ2V0QWxsS2V5c0luIDogZ2V0QWxsS2V5cylcbiAgICAgICAgOiAoaXNGbGF0ID8ga2V5c0luIDoga2V5cyk7XG5cbiAgICAgIHZhciBwcm9wcyA9IGlzQXJyID8gdW5kZWZpbmVkIDoga2V5c0Z1bmModmFsdWUpO1xuICAgICAgYXJyYXlFYWNoKHByb3BzIHx8IHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICAgIGlmIChwcm9wcykge1xuICAgICAgICAgIGtleSA9IHN1YlZhbHVlO1xuICAgICAgICAgIHN1YlZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSBwb3B1bGF0ZSBjbG9uZSAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBhc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNvbmZvcm1zYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNvbmZvcm1zKHNvdXJjZSkge1xuICAgICAgdmFyIHByb3BzID0ga2V5cyhzb3VyY2UpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIHByb3BzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY29uZm9ybXNUb2Agd2hpY2ggYWNjZXB0cyBgcHJvcHNgIHRvIGNoZWNrLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBjb25mb3JtcywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBwcm9wcykge1xuICAgICAgdmFyIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gIWxlbmd0aDtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBwcm9wc1tsZW5ndGhdLFxuICAgICAgICAgICAgcHJlZGljYXRlID0gc291cmNlW2tleV0sXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgIGlmICgodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSB8fCAhcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZGVsYXlgIGFuZCBgXy5kZWZlcmAgd2hpY2ggYWNjZXB0cyBgYXJnc2BcbiAgICAgKiB0byBwcm92aWRlIHRvIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VEZWxheShmdW5jLCB3YWl0LCBhcmdzKSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsgZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOyB9LCB3YWl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZGlmZmVyZW5jZWAgd2l0aG91dCBzdXBwb3J0XG4gICAgICogZm9yIGV4Y2x1ZGluZyBtdWx0aXBsZSBhcnJheXMgb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgICAgdmFsdWVzTGVuZ3RoID0gdmFsdWVzLmxlbmd0aDtcblxuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICB2YWx1ZXMgPSBhcnJheU1hcCh2YWx1ZXMsIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHZhbHVlcy5sZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgICAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMgPSBuZXcgU2V0Q2FjaGUodmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA9PSBudWxsID8gdmFsdWUgOiBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICB2YXIgdmFsdWVzSW5kZXggPSB2YWx1ZXNMZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKHZhbHVlc0luZGV4LS0pIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZXNbdmFsdWVzSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpbmNsdWRlcyh2YWx1ZXMsIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqL1xuICAgIHZhciBiYXNlRWFjaCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd24pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaFJpZ2h0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqL1xuICAgIHZhciBiYXNlRWFjaFJpZ2h0ID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93blJpZ2h0LCB0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmV2ZXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRydWU7XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0ID0gISFwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ubWF4YCBhbmQgYF8ubWluYCB3aGljaCBhY2NlcHRzIGFcbiAgICAgKiBgY29tcGFyYXRvcmAgdG8gZGV0ZXJtaW5lIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgdXNlZCB0byBjb21wYXJlIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjdXJyZW50ID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgKGNvbXB1dGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAoY3VycmVudCA9PT0gY3VycmVudCAmJiAhaXNTeW1ib2woY3VycmVudCkpXG4gICAgICAgICAgICAgIDogY29tcGFyYXRvcihjdXJyZW50LCBjb21wdXRlZClcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICB2YXIgY29tcHV0ZWQgPSBjdXJyZW50LFxuICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWxsYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgYGFycmF5YCB3aXRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHN0YXJ0ID0gdG9JbnRlZ2VyKHN0YXJ0KTtcbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiBsZW5ndGgpID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCk7XG4gICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgZW5kID0gc3RhcnQgPiBlbmQgPyAwIDogdG9MZW5ndGgoZW5kKTtcbiAgICAgIHdoaWxlIChzdGFydCA8IGVuZCkge1xuICAgICAgICBhcnJheVtzdGFydCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbHRlcmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mbGF0dGVuYCB3aXRoIHN1cHBvcnQgZm9yIHJlc3RyaWN0aW5nIGZsYXR0ZW5pbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcHJlZGljYXRlPWlzRmxhdHRlbmFibGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdHJpY3RdIFJlc3RyaWN0IHRvIHZhbHVlcyB0aGF0IHBhc3MgYHByZWRpY2F0ZWAgY2hlY2tzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHQ9W11dIFRoZSBpbml0aWFsIHJlc3VsdCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgcHJlZGljYXRlIHx8IChwcmVkaWNhdGUgPSBpc0ZsYXR0ZW5hYmxlKTtcbiAgICAgIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgICAgIGlmIChkZXB0aCA+IDEpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcnJheVB1c2gocmVzdWx0LCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFpc1N0cmljdCkge1xuICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBiYXNlRm9yT3duYCB3aGljaCBpdGVyYXRlcyBvdmVyIGBvYmplY3RgXG4gICAgICogcHJvcGVydGllcyByZXR1cm5lZCBieSBga2V5c0Z1bmNgIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuXG4gICAgICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIHZhciBiYXNlRm9yID0gY3JlYXRlQmFzZUZvcigpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBiYXNlRm9yYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXNcbiAgICAgKiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgdmFyIGJhc2VGb3JSaWdodCA9IGNyZWF0ZUJhc2VGb3IodHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duUmlnaHRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZvck93blJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvclJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZ1bmN0aW9uc2Agd2hpY2ggY3JlYXRlcyBhbiBhcnJheSBvZlxuICAgICAqIGBvYmplY3RgIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZpbHRlcmVkIGZyb20gYHByb3BzYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGZpbHRlci5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGdW5jdGlvbnMob2JqZWN0LCBwcm9wcykge1xuICAgICAgcmV0dXJuIGFycmF5RmlsdGVyKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqZWN0W2tleV0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZmF1bHQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXgrK10pXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoaW5kZXggJiYgaW5kZXggPT0gbGVuZ3RoKSA/IG9iamVjdCA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0QWxsS2V5c2AgYW5kIGBnZXRBbGxLZXlzSW5gIHdoaWNoIHVzZXNcbiAgICAgKiBga2V5c0Z1bmNgIGFuZCBgc3ltYm9sc0Z1bmNgIHRvIGdldCB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAgICAgKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzeW1ib2xzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzRnVuYywgc3ltYm9sc0Z1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpO1xuICAgICAgcmV0dXJuIGlzQXJyYXkob2JqZWN0KSA/IHJlc3VsdCA6IGFycmF5UHVzaChyZXN1bHQsIHN5bWJvbHNGdW5jKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgICAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICAgICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ3RgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUd0KHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID4gb3RoZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUhhcyhvYmplY3QsIGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc0luYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUhhc0luKG9iamVjdCwga2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmluUmFuZ2VgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBudW1iZXJgIGlzIGluIHRoZSByYW5nZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCkge1xuICAgICAgcmV0dXJuIG51bWJlciA+PSBuYXRpdmVNaW4oc3RhcnQsIGVuZCkgJiYgbnVtYmVyIDwgbmF0aXZlTWF4KHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gLCB3aXRob3V0IHN1cHBvcnRcbiAgICAgKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgdGhhdCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheXMgVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2Ygc2hhcmVkIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW50ZXJzZWN0aW9uKGFycmF5cywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmNsdWRlcyA9IGNvbXBhcmF0b3IgPyBhcnJheUluY2x1ZGVzV2l0aCA6IGFycmF5SW5jbHVkZXMsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXlzWzBdLmxlbmd0aCxcbiAgICAgICAgICBvdGhMZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoLFxuICAgICAgICAgIGNhY2hlcyA9IEFycmF5KG90aExlbmd0aCksXG4gICAgICAgICAgbWF4TGVuZ3RoID0gSW5maW5pdHksXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlIChvdGhJbmRleC0tKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFycmF5c1tvdGhJbmRleF07XG4gICAgICAgIGlmIChvdGhJbmRleCAmJiBpdGVyYXRlZSkge1xuICAgICAgICAgIGFycmF5ID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgICB9XG4gICAgICAgIG1heExlbmd0aCA9IG5hdGl2ZU1pbihhcnJheS5sZW5ndGgsIG1heExlbmd0aCk7XG4gICAgICAgIGNhY2hlc1tvdGhJbmRleF0gPSAhY29tcGFyYXRvciAmJiAoaXRlcmF0ZWUgfHwgKGxlbmd0aCA+PSAxMjAgJiYgYXJyYXkubGVuZ3RoID49IDEyMCkpXG4gICAgICAgICAgPyBuZXcgU2V0Q2FjaGUob3RoSW5kZXggJiYgYXJyYXkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBhcnJheSA9IGFycmF5c1swXTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgc2VlbiA9IGNhY2hlc1swXTtcblxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiByZXN1bHQubGVuZ3RoIDwgbWF4TGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICAgICAgaWYgKCEoc2VlblxuICAgICAgICAgICAgICA/IGNhY2hlSGFzKHNlZW4sIGNvbXB1dGVkKVxuICAgICAgICAgICAgICA6IGluY2x1ZGVzKHJlc3VsdCwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgb3RoSW5kZXggPSBvdGhMZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKC0tb3RoSW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBjYWNoZSA9IGNhY2hlc1tvdGhJbmRleF07XG4gICAgICAgICAgICBpZiAoIShjYWNoZVxuICAgICAgICAgICAgICAgICAgPyBjYWNoZUhhcyhjYWNoZSwgY29tcHV0ZWQpXG4gICAgICAgICAgICAgICAgICA6IGluY2x1ZGVzKGFycmF5c1tvdGhJbmRleF0sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWVuKSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW52ZXJ0YCBhbmQgYF8uaW52ZXJ0QnlgIHdoaWNoIGludmVydHNcbiAgICAgKiBgb2JqZWN0YCB3aXRoIHZhbHVlcyB0cmFuc2Zvcm1lZCBieSBgaXRlcmF0ZWVgIGFuZCBzZXQgYnkgYHNldHRlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGludmVydGVkIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBzZXR0ZXIoYWNjdW11bGF0b3IsIGl0ZXJhdGVlKHZhbHVlKSwga2V5LCBvYmplY3QpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW52b2tlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgKiBtZXRob2QgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gICAgICB2YXIgZnVuYyA9IG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtcbiAgICAgIHJldHVybiBmdW5jID09IG51bGwgPyB1bmRlZmluZWQgOiBhcHBseShmdW5jLCBvYmplY3QsIGFyZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJnc1RhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FycmF5QnVmZmVyYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzQXJyYXlCdWZmZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFycmF5QnVmZmVyVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRGF0ZWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZGF0ZSBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNEYXRlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBkYXRlVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAgICAgKiBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAxIC0gVW5vcmRlcmVkIGNvbXBhcmlzb25cbiAgICAgKiAgMiAtIFBhcnRpYWwgY29tcGFyaXNvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYHZhbHVlYCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgaWYgKHZhbHVlID09PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IG90aGVyID09IG51bGwgfHwgKCFpc09iamVjdExpa2UodmFsdWUpICYmICFpc09iamVjdExpa2Uob3RoZXIpKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlSXNFcXVhbERlZXAodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBiYXNlSXNFcXVhbCwgc3RhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAgICAgKiBkZWVwIGNvbXBhcmlzb25zIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gICAgICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNFcXVhbERlZXAob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgICAgIG90aElzQXJyID0gaXNBcnJheShvdGhlciksXG4gICAgICAgICAgb2JqVGFnID0gb2JqSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvYmplY3QpLFxuICAgICAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gICAgICBvYmpUYWcgPSBvYmpUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG9ialRhZztcbiAgICAgIG90aFRhZyA9IG90aFRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb3RoVGFnO1xuXG4gICAgICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgICAgIG90aElzT2JqID0gb3RoVGFnID09IG9iamVjdFRhZyxcbiAgICAgICAgICBpc1NhbWVUYWcgPSBvYmpUYWcgPT0gb3RoVGFnO1xuXG4gICAgICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICAgICAgaWYgKCFpc0J1ZmZlcihvdGhlcikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgb2JqSXNBcnIgPSB0cnVlO1xuICAgICAgICBvYmpJc09iaiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU2FtZVRhZyAmJiAhb2JqSXNPYmopIHtcbiAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgICAgICA/IGVxdWFsQXJyYXlzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spXG4gICAgICAgICAgOiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIG9ialRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICB9XG4gICAgICBpZiAoIShiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcpKSB7XG4gICAgICAgIHZhciBvYmpJc1dyYXBwZWQgPSBvYmpJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgJ19fd3JhcHBlZF9fJyksXG4gICAgICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgICAgICBpZiAob2JqSXNXcmFwcGVkIHx8IG90aElzV3JhcHBlZCkge1xuICAgICAgICAgIHZhciBvYmpVbndyYXBwZWQgPSBvYmpJc1dyYXBwZWQgPyBvYmplY3QudmFsdWUoKSA6IG9iamVjdCxcbiAgICAgICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgICAgICByZXR1cm4gZXF1YWxGdW5jKG9ialVud3JhcHBlZCwgb3RoVW53cmFwcGVkLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaXNTYW1lVGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWFwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gbWFwVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWF0Y2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBtYXRjaERhdGEgVGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSwgY3VzdG9taXplcikge1xuICAgICAgdmFyIGluZGV4ID0gbWF0Y2hEYXRhLmxlbmd0aCxcbiAgICAgICAgICBsZW5ndGggPSBpbmRleCxcbiAgICAgICAgICBub0N1c3RvbWl6ZXIgPSAhY3VzdG9taXplcjtcblxuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAhbGVuZ3RoO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICB2YXIgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgICAgIGlmICgobm9DdXN0b21pemVyICYmIGRhdGFbMl0pXG4gICAgICAgICAgICAgID8gZGF0YVsxXSAhPT0gb2JqZWN0W2RhdGFbMF1dXG4gICAgICAgICAgICAgIDogIShkYXRhWzBdIGluIG9iamVjdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgICAgIHZhciBrZXkgPSBkYXRhWzBdLFxuICAgICAgICAgICAgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgICAgIHNyY1ZhbHVlID0gZGF0YVsxXTtcblxuICAgICAgICBpZiAobm9DdXN0b21pemVyICYmIGRhdGFbMl0pIHtcbiAgICAgICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzdGFjayA9IG5ldyBTdGFjaztcbiAgICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjayk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghKHJlc3VsdCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBiYXNlSXNFcXVhbChzcmNWYWx1ZSwgb2JqVmFsdWUsIENPTVBBUkVfUEFSVElBTF9GTEFHIHwgQ09NUEFSRV9VTk9SREVSRURfRkxBRywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICAgICAgICAgOiByZXN1bHRcbiAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbih2YWx1ZSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzUmVnRXhwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSByZWdleHAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNSZWdFeHAodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHJlZ2V4cFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1NldGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHNldFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiZcbiAgICAgICAgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pdGVyYXRlZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgaXRlcmF0ZWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUl0ZXJhdGVlKHZhbHVlKSB7XG4gICAgICAvLyBEb24ndCBzdG9yZSB0aGUgYHR5cGVvZmAgcmVzdWx0IGluIGEgdmFyaWFibGUgdG8gYXZvaWQgYSBKSVQgYnVnIGluIFNhZmFyaSA5LlxuICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYwMzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKVxuICAgICAgICAgID8gYmFzZU1hdGNoZXNQcm9wZXJ0eSh2YWx1ZVswXSwgdmFsdWVbMV0pXG4gICAgICAgICAgOiBiYXNlTWF0Y2hlcyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gICAgICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNJbmAgd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlS2V5c0luKG9iamVjdCkge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVLZXlzSW4ob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubHRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUx0KHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlIDwgb3RoZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWFwYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IEFycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKSA6IFtdO1xuXG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGl0ZXJhdGVlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWF0Y2hlcyhzb3VyY2UpIHtcbiAgICAgIHZhciBtYXRjaERhdGEgPSBnZXRNYXRjaERhdGEoc291cmNlKTtcbiAgICAgIGlmIChtYXRjaERhdGEubGVuZ3RoID09IDEgJiYgbWF0Y2hEYXRhWzBdWzJdKSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShtYXRjaERhdGFbMF1bMF0sIG1hdGNoRGF0YVswXVsxXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc1Byb3BlcnR5YCB3aGljaCBkb2Vzbid0IGNsb25lIGBzcmNWYWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gICAgICBpZiAoaXNLZXkocGF0aCkgJiYgaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksIHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgdmFyIG9ialZhbHVlID0gZ2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICAgIHJldHVybiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBvYmpWYWx1ZSA9PT0gc3JjVmFsdWUpXG4gICAgICAgICAgPyBoYXNJbihvYmplY3QsIHBhdGgpXG4gICAgICAgICAgOiBiYXNlSXNFcXVhbChzcmNWYWx1ZSwgb2JqVmFsdWUsIENPTVBBUkVfUEFSVElBTF9GTEFHIHwgQ09NUEFSRV9VTk9SREVSRURfRkxBRyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lcmdlYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgbWVyZ2VkIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgICAgICBpZiAoaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgICAgICBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBiYXNlTWVyZ2UsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlTWVyZ2VgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAgICAgKiBkZWVwIG1lcmdlcyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIG1lcmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGdW5jIFRoZSBmdW5jdGlvbiB0byBtZXJnZSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBzYWZlR2V0KG9iamVjdCwga2V5KSxcbiAgICAgICAgICBzcmNWYWx1ZSA9IHNhZmVHZXQoc291cmNlLCBrZXkpLFxuICAgICAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBzdGFja2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICB2YXIgaXNDb21tb24gPSBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoaXNDb21tb24pIHtcbiAgICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShzcmNWYWx1ZSksXG4gICAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgaXNCdWZmZXIoc3JjVmFsdWUpLFxuICAgICAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgICAgaWYgKGlzQXJyIHx8IGlzQnVmZiB8fCBpc1R5cGVkKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY29weUFycmF5KG9ialZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjbG9uZUJ1ZmZlcihzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzVHlwZWQpIHtcbiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgICAgICBpZiAoaXNBcmd1bWVudHMob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICghaXNPYmplY3Qob2JqVmFsdWUpIHx8IChzcmNJbmRleCAmJiBpc0Z1bmN0aW9uKG9ialZhbHVlKSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzQ29tbW9uKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5udGhgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG50aCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU50aChhcnJheSwgbikge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG4gKz0gbiA8IDAgPyBsZW5ndGggOiAwO1xuICAgICAgcmV0dXJuIGlzSW5kZXgobiwgbGVuZ3RoKSA/IGFycmF5W25dIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm9yZGVyQnlgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBpdGVyYXRlZXMgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcy5sZW5ndGggPyBpdGVyYXRlZXMgOiBbaWRlbnRpdHldLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZU1hcChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHZhciBjcml0ZXJpYSA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgJ2NyaXRlcmlhJzogY3JpdGVyaWEsICdpbmRleCc6ICsraW5kZXgsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VTb3J0QnkocmVzdWx0LCBmdW5jdGlvbihvYmplY3QsIG90aGVyKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnBpY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGhhc0luKG9iamVjdCwgcGF0aCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiAgYF8ucGlja0J5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYXRoID0gcGF0aHNbaW5kZXhdLFxuICAgICAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgcGF0aCkpIHtcbiAgICAgICAgICBiYXNlU2V0KHJlc3VsdCwgY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVByb3BlcnR5YCB3aGljaCBzdXBwb3J0cyBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocGF0aCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wdWxsQWxsQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICAgKiBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXhPZiA9IGNvbXBhcmF0b3IgPyBiYXNlSW5kZXhPZldpdGggOiBiYXNlSW5kZXhPZixcbiAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgc2VlbiA9IGFycmF5O1xuXG4gICAgICBpZiAoYXJyYXkgPT09IHZhbHVlcykge1xuICAgICAgICB2YWx1ZXMgPSBjb3B5QXJyYXkodmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGZyb21JbmRleCA9IDAsXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgd2hpbGUgKChmcm9tSW5kZXggPSBpbmRleE9mKHNlZW4sIGNvbXB1dGVkLCBmcm9tSW5kZXgsIGNvbXBhcmF0b3IpKSA+IC0xKSB7XG4gICAgICAgICAgaWYgKHNlZW4gIT09IGFycmF5KSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChzZWVuLCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgZnJvbUluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogaW5kZXhlcyBvciBjYXB0dXJpbmcgdGhlIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gaW5kZXhlcyBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gaW5kZXhlcy5sZW5ndGggOiAwLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2xlbmd0aF07XG4gICAgICAgIGlmIChsZW5ndGggPT0gbGFzdEluZGV4IHx8IGluZGV4ICE9PSBwcmV2aW91cykge1xuICAgICAgICAgIHZhciBwcmV2aW91cyA9IGluZGV4O1xuICAgICAgICAgIGlmIChpc0luZGV4KGluZGV4KSkge1xuICAgICAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGluZGV4LCAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmFzZVVuc2V0KGFycmF5LCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZG9tYCB3aXRob3V0IHN1cHBvcnQgZm9yIHJldHVybmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3dlciBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKSB7XG4gICAgICByZXR1cm4gbG93ZXIgKyBuYXRpdmVGbG9vcihuYXRpdmVSYW5kb20oKSAqICh1cHBlciAtIGxvd2VyICsgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICAgICAqIGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5nZShzdGFydCwgZW5kLCBzdGVwLCBmcm9tUmlnaHQpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICAgICAgc3RhcnQgKz0gc3RlcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVwZWF0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlcGVhdChzdHJpbmcsIG4pIHtcbiAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgIGlmICghc3RyaW5nIHx8IG4gPCAxIHx8IG4gPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICAvLyBMZXZlcmFnZSB0aGUgZXhwb25lbnRpYXRpb24gYnkgc3F1YXJpbmcgYWxnb3JpdGhtIGZvciBhIGZhc3RlciByZXBlYXQuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXhwb25lbnRpYXRpb25fYnlfc3F1YXJpbmcgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG4gJSAyKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBuID0gbmF0aXZlRmxvb3IobiAvIDIpO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgIHN0cmluZyArPSBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKG4pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCBzdGFydCwgaWRlbnRpdHkpLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zYW1wbGVTaXplYCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4pIHtcbiAgICAgIHZhciBhcnJheSA9IHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihhcnJheSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cbiAgICAgIHdoaWxlIChuZXN0ZWQgIT0gbnVsbCAmJiArK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBrZXksIG5lc3RlZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICAgICAgOiAoaXNJbmRleChwYXRoW2luZGV4ICsgMV0pID8gW10gOiB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzc2lnblZhbHVlKG5lc3RlZCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0RGF0YWAgd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBiYXNlU2V0RGF0YSA9ICFtZXRhTWFwID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBkYXRhKSB7XG4gICAgICBtZXRhTWFwLnNldChmdW5jLCBkYXRhKTtcbiAgICAgIHJldHVybiBmdW5jO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAgICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNodWZmbGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZih2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSBlbmQgPiBsZW5ndGggPyBsZW5ndGggOiBlbmQ7XG4gICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICAgICAgc3RhcnQgPj4+PSAwO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheVtpbmRleCArIHN0YXJ0XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29tZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvbWUoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0ID0gcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiAhcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gISFyZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhgIGFuZCBgXy5zb3J0ZWRMYXN0SW5kZXhgIHdoaWNoXG4gICAgICogcGVyZm9ybXMgYSBiaW5hcnkgc2VhcmNoIG9mIGBhcnJheWAgdG8gZGV0ZXJtaW5lIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyBsb3cgOiBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT09IHZhbHVlICYmIGhpZ2ggPD0gSEFMRl9NQVhfQVJSQVlfTEVOR1RIKSB7XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgdmFyIG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMSxcbiAgICAgICAgICAgICAgY29tcHV0ZWQgPSBhcnJheVttaWRdO1xuXG4gICAgICAgICAgaWYgKGNvbXB1dGVkICE9PSBudWxsICYmICFpc1N5bWJvbChjb21wdXRlZCkgJiZcbiAgICAgICAgICAgICAgKHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpKSkge1xuICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpZ2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpZGVudGl0eSwgcmV0SGlnaGVzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhCeWAgYW5kIGBfLnNvcnRlZExhc3RJbmRleEJ5YFxuICAgICAqIHdoaWNoIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZVxuICAgICAqIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUsIHJldEhpZ2hlc3QpIHtcbiAgICAgIHZhbHVlID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICB2YXIgbG93ID0gMCxcbiAgICAgICAgICBoaWdoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgdmFsSXNOYU4gPSB2YWx1ZSAhPT0gdmFsdWUsXG4gICAgICAgICAgdmFsSXNOdWxsID0gdmFsdWUgPT09IG51bGwsXG4gICAgICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSksXG4gICAgICAgICAgdmFsSXNVbmRlZmluZWQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICB2YXIgbWlkID0gbmF0aXZlRmxvb3IoKGxvdyArIGhpZ2gpIC8gMiksXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKGFycmF5W21pZF0pLFxuICAgICAgICAgICAgb3RoSXNEZWZpbmVkID0gY29tcHV0ZWQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG90aElzTnVsbCA9IGNvbXB1dGVkID09PSBudWxsLFxuICAgICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBjb21wdXRlZCA9PT0gY29tcHV0ZWQsXG4gICAgICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKGNvbXB1dGVkKTtcblxuICAgICAgICBpZiAodmFsSXNOYU4pIHtcbiAgICAgICAgICB2YXIgc2V0TG93ID0gcmV0SGlnaGVzdCB8fCBvdGhJc1JlZmxleGl2ZTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc1VuZGVmaW5lZCkge1xuICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIChyZXRIaWdoZXN0IHx8IG90aElzRGVmaW5lZCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNOdWxsKSB7XG4gICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgb3RoSXNEZWZpbmVkICYmIChyZXRIaWdoZXN0IHx8ICFvdGhJc051bGwpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzU3ltYm9sKSB7XG4gICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgb3RoSXNEZWZpbmVkICYmICFvdGhJc051bGwgJiYgKHJldEhpZ2hlc3QgfHwgIW90aElzU3ltYm9sKTtcbiAgICAgICAgfSBlbHNlIGlmIChvdGhJc051bGwgfHwgb3RoSXNTeW1ib2wpIHtcbiAgICAgICAgICBzZXRMb3cgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRMb3cgPSByZXRIaWdoZXN0ID8gKGNvbXB1dGVkIDw9IHZhbHVlKSA6IChjb21wdXRlZCA8IHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0TG93KSB7XG4gICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmF0aXZlTWluKGhpZ2gsIE1BWF9BUlJBWV9JTkRFWCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkVW5pcWAgYW5kIGBfLnNvcnRlZFVuaXFCeWAgd2l0aG91dFxuICAgICAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZFVuaXEoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgaWYgKCFpbmRleCB8fCAhZXEoY29tcHV0ZWQsIHNlZW4pKSB7XG4gICAgICAgICAgdmFyIHNlZW4gPSBjb21wdXRlZDtcbiAgICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b051bWJlcmAgd2hpY2ggZG9lc24ndCBlbnN1cmUgY29ycmVjdFxuICAgICAqIGNvbnZlcnNpb25zIG9mIGJpbmFyeSwgaGV4YWRlY2ltYWwsIG9yIG9jdGFsIHN0cmluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VUb051bWJlcih2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBOQU47XG4gICAgICB9XG4gICAgICByZXR1cm4gK3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvU3RyaW5nYCB3aGljaCBkb2Vzbid0IGNvbnZlcnQgbnVsbGlzaFxuICAgICAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHtcbiAgICAgIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gICAgICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5pcUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgICBzZWVuID0gcmVzdWx0O1xuXG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICAgICAgdmFyIHNldCA9IGl0ZXJhdGVlID8gbnVsbCA6IGNyZWF0ZVNldChhcnJheSk7XG4gICAgICAgIGlmIChzZXQpIHtcbiAgICAgICAgICByZXR1cm4gc2V0VG9BcnJheShzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIGluY2x1ZGVzID0gY2FjaGVIYXM7XG4gICAgICAgIHNlZW4gPSBuZXcgU2V0Q2FjaGU7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc2VlbiA9IGl0ZXJhdGVlID8gW10gOiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICAgICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgICAgIHZhciBzZWVuSW5kZXggPSBzZWVuLmxlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoc2VlbkluZGV4LS0pIHtcbiAgICAgICAgICAgIGlmIChzZWVuW3NlZW5JbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaW5jbHVkZXMoc2VlbiwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICAgICAgaWYgKHNlZW4gIT09IHJlc3VsdCkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuc2V0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcHJvcGVydHkgcGF0aCB0byB1bnNldC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVW5zZXQob2JqZWN0LCBwYXRoKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgIG9iamVjdCA9IHBhcmVudChvYmplY3QsIHBhdGgpO1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsIHx8IGRlbGV0ZSBvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVwZGF0ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVXBkYXRlKG9iamVjdCwgcGF0aCwgdXBkYXRlciwgY3VzdG9taXplcikge1xuICAgICAgcmV0dXJuIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB1cGRhdGVyKGJhc2VHZXQob2JqZWN0LCBwYXRoKSksIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5kcm9wV2hpbGVgIGFuZCBgXy50YWtlV2hpbGVgXG4gICAgICogd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEcm9wXSBTcGVjaWZ5IGRyb3BwaW5nIGVsZW1lbnRzIGluc3RlYWQgb2YgdGFraW5nIHRoZW0uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VXaGlsZShhcnJheSwgcHJlZGljYXRlLCBpc0Ryb3AsIGZyb21SaWdodCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xO1xuXG4gICAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSAmJlxuICAgICAgICBwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7fVxuXG4gICAgICByZXR1cm4gaXNEcm9wXG4gICAgICAgID8gYmFzZVNsaWNlKGFycmF5LCAoZnJvbVJpZ2h0ID8gMCA6IGluZGV4KSwgKGZyb21SaWdodCA/IGluZGV4ICsgMSA6IGxlbmd0aCkpXG4gICAgICAgIDogYmFzZVNsaWNlKGFycmF5LCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogMCksIChmcm9tUmlnaHQgPyBsZW5ndGggOiBpbmRleCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGB3cmFwcGVyVmFsdWVgIHdoaWNoIHJldHVybnMgdGhlIHJlc3VsdCBvZlxuICAgICAqIHBlcmZvcm1pbmcgYSBzZXF1ZW5jZSBvZiBhY3Rpb25zIG9uIHRoZSB1bndyYXBwZWQgYHZhbHVlYCwgd2hlcmUgZWFjaFxuICAgICAqIHN1Y2Nlc3NpdmUgYWN0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYWN0aW9ucyBBY3Rpb25zIHRvIHBlcmZvcm0gdG8gcmVzb2x2ZSB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlV3JhcHBlclZhbHVlKHZhbHVlLCBhY3Rpb25zKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdmFsdWU7XG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnZhbHVlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXlSZWR1Y2UoYWN0aW9ucywgZnVuY3Rpb24ocmVzdWx0LCBhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5mdW5jLmFwcGx5KGFjdGlvbi50aGlzQXJnLCBhcnJheVB1c2goW3Jlc3VsdF0sIGFjdGlvbi5hcmdzKSk7XG4gICAgICB9LCByZXN1bHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy54b3JgLCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcywgdGhhdCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheXMgVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VYb3IoYXJyYXlzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5cy5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZVVuaXEoYXJyYXlzWzBdKSA6IFtdO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gYXJyYXlzW2luZGV4XSxcbiAgICAgICAgICAgIG90aEluZGV4ID0gLTE7XG5cbiAgICAgICAgd2hpbGUgKCsrb3RoSW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBpZiAob3RoSW5kZXggIT0gaW5kZXgpIHtcbiAgICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBiYXNlRGlmZmVyZW5jZShyZXN1bHRbaW5kZXhdIHx8IGFycmF5LCBhcnJheXNbb3RoSW5kZXhdLCBpdGVyYXRlZSwgY29tcGFyYXRvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4ocmVzdWx0LCAxKSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy56aXBPYmplY3RgIHdoaWNoIGFzc2lnbnMgdmFsdWVzIHVzaW5nIGBhc3NpZ25GdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFzc2lnbkZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlWmlwT2JqZWN0KHByb3BzLCB2YWx1ZXMsIGFzc2lnbkZ1bmMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCxcbiAgICAgICAgICB2YWxzTGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gaW5kZXggPCB2YWxzTGVuZ3RoID8gdmFsdWVzW2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgYXNzaWduRnVuYyhyZXN1bHQsIHByb3BzW2luZGV4XSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGFuIGVtcHR5IGFycmF5IGlmIGl0J3Mgbm90IGFuIGFycmF5IGxpa2Ugb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgdGhlIGNhc3QgYXJyYXktbGlrZSBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdEFycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSA/IHZhbHVlIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBgaWRlbnRpdHlgIGlmIGl0J3Mgbm90IGEgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGNhc3QgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdEZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgPyB2YWx1ZSA6IGlkZW50aXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RQYXRoKHZhbHVlLCBvYmplY3QpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNLZXkodmFsdWUsIG9iamVjdCkgPyBbdmFsdWVdIDogc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBgYmFzZVJlc3RgIGFsaWFzIHdoaWNoIGNhbiBiZSByZXBsYWNlZCB3aXRoIGBpZGVudGl0eWAgYnkgbW9kdWxlXG4gICAgICogcmVwbGFjZW1lbnQgcGx1Z2lucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgdmFyIGNhc3RSZXN0ID0gYmFzZVJlc3Q7XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgYXJyYXlgIHRvIGEgc2xpY2UgaWYgaXQncyBuZWVkZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBzbGljZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0U2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IGVuZDtcbiAgICAgIHJldHVybiAoIXN0YXJ0ICYmIGVuZCA+PSBsZW5ndGgpID8gYXJyYXkgOiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBnbG9iYWwgW2BjbGVhclRpbWVvdXRgXShodHRwczovL21kbi5pby9jbGVhclRpbWVvdXQpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcnxPYmplY3R9IGlkIFRoZSB0aW1lciBpZCBvciB0aW1lb3V0IG9iamVjdCBvZiB0aGUgdGltZXIgdG8gY2xlYXIuXG4gICAgICovXG4gICAgdmFyIGNsZWFyVGltZW91dCA9IGN0eENsZWFyVGltZW91dCB8fCBmdW5jdGlvbihpZCkge1xuICAgICAgcmV0dXJuIHJvb3QuY2xlYXJUaW1lb3V0KGlkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mICBgYnVmZmVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge0J1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGJ1ZmZlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIsIGlzRGVlcCkge1xuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICByZXR1cm4gYnVmZmVyLnNsaWNlKCk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBhbGxvY1Vuc2FmZSA/IGFsbG9jVW5zYWZlKGxlbmd0aCkgOiBuZXcgYnVmZmVyLmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgICAgIGJ1ZmZlci5jb3B5KHJlc3VsdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgYXJyYXlCdWZmZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBhcnJheUJ1ZmZlciBUaGUgYXJyYXkgYnVmZmVyIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtBcnJheUJ1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGFycmF5IGJ1ZmZlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZUFycmF5QnVmZmVyKGFycmF5QnVmZmVyKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IGFycmF5QnVmZmVyLmNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBkYXRhVmlld2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhVmlldyBUaGUgZGF0YSB2aWV3IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGRhdGEgdmlldy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURhdGFWaWV3KGRhdGFWaWV3LCBpc0RlZXApIHtcbiAgICAgIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcikgOiBkYXRhVmlldy5idWZmZXI7XG4gICAgICByZXR1cm4gbmV3IGRhdGFWaWV3LmNvbnN0cnVjdG9yKGJ1ZmZlciwgZGF0YVZpZXcuYnl0ZU9mZnNldCwgZGF0YVZpZXcuYnl0ZUxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGByZWdleHBgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVnZXhwIFRoZSByZWdleHAgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHJlZ2V4cC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgcmVnZXhwLmNvbnN0cnVjdG9yKHJlZ2V4cC5zb3VyY2UsIHJlRmxhZ3MuZXhlYyhyZWdleHApKTtcbiAgICAgIHJlc3VsdC5sYXN0SW5kZXggPSByZWdleHAubGFzdEluZGV4O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGBzeW1ib2xgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN5bWJvbCBUaGUgc3ltYm9sIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc3ltYm9sIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZVN5bWJvbChzeW1ib2wpIHtcbiAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgdHlwZWRBcnJheWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0eXBlZEFycmF5IFRoZSB0eXBlZCBhcnJheSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB0eXBlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZVR5cGVkQXJyYXkodHlwZWRBcnJheSwgaXNEZWVwKSB7XG4gICAgICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcikgOiB0eXBlZEFycmF5LmJ1ZmZlcjtcbiAgICAgIHJldHVybiBuZXcgdHlwZWRBcnJheS5jb25zdHJ1Y3RvcihidWZmZXIsIHR5cGVkQXJyYXkuYnl0ZU9mZnNldCwgdHlwZWRBcnJheS5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBhcmVzIHZhbHVlcyB0byBzb3J0IHRoZW0gaW4gYXNjZW5kaW5nIG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIGB2YWx1ZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFyZUFzY2VuZGluZyh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gb3RoZXIpIHtcbiAgICAgICAgdmFyIHZhbElzRGVmaW5lZCA9IHZhbHVlICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCxcbiAgICAgICAgICAgIHZhbElzUmVmbGV4aXZlID0gdmFsdWUgPT09IHZhbHVlLFxuICAgICAgICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSk7XG5cbiAgICAgICAgdmFyIG90aElzRGVmaW5lZCA9IG90aGVyICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBvdGhJc051bGwgPSBvdGhlciA9PT0gbnVsbCxcbiAgICAgICAgICAgIG90aElzUmVmbGV4aXZlID0gb3RoZXIgPT09IG90aGVyLFxuICAgICAgICAgICAgb3RoSXNTeW1ib2wgPSBpc1N5bWJvbChvdGhlcik7XG5cbiAgICAgICAgaWYgKCghb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCAmJiAhdmFsSXNTeW1ib2wgJiYgdmFsdWUgPiBvdGhlcikgfHxcbiAgICAgICAgICAgICh2YWxJc1N5bWJvbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUgJiYgIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wpIHx8XG4gICAgICAgICAgICAodmFsSXNOdWxsICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgICAgICghdmFsSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgIXZhbElzUmVmbGV4aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCghdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCAmJiAhb3RoSXNTeW1ib2wgJiYgdmFsdWUgPCBvdGhlcikgfHxcbiAgICAgICAgICAgIChvdGhJc1N5bWJvbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUgJiYgIXZhbElzTnVsbCAmJiAhdmFsSXNTeW1ib2wpIHx8XG4gICAgICAgICAgICAob3RoSXNOdWxsICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgICAgICghb3RoSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgIW90aElzUmVmbGV4aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLm9yZGVyQnlgIHRvIGNvbXBhcmUgbXVsdGlwbGUgcHJvcGVydGllcyBvZiBhIHZhbHVlIHRvIGFub3RoZXJcbiAgICAgKiBhbmQgc3RhYmxlIHNvcnQgdGhlbS5cbiAgICAgKlxuICAgICAqIElmIGBvcmRlcnNgIGlzIHVuc3BlY2lmaWVkLCBhbGwgdmFsdWVzIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsXG4gICAgICogc3BlY2lmeSBhbiBvcmRlciBvZiBcImRlc2NcIiBmb3IgZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlclxuICAgICAqIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbltdfHN0cmluZ1tdfSBvcmRlcnMgVGhlIG9yZGVyIHRvIHNvcnQgYnkgZm9yIGVhY2ggcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIG9iakNyaXRlcmlhID0gb2JqZWN0LmNyaXRlcmlhLFxuICAgICAgICAgIG90aENyaXRlcmlhID0gb3RoZXIuY3JpdGVyaWEsXG4gICAgICAgICAgbGVuZ3RoID0gb2JqQ3JpdGVyaWEubGVuZ3RoLFxuICAgICAgICAgIG9yZGVyc0xlbmd0aCA9IG9yZGVycy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjb21wYXJlQXNjZW5kaW5nKG9iakNyaXRlcmlhW2luZGV4XSwgb3RoQ3JpdGVyaWFbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGlmIChpbmRleCA+PSBvcmRlcnNMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBvcmRlciA9IG9yZGVyc1tpbmRleF07XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIChvcmRlciA9PSAnZGVzYycgPyAtMSA6IDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBGaXhlcyBhbiBgQXJyYXkjc29ydGAgYnVnIGluIHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgYXBwbGljYXRpb25zXG4gICAgICAvLyB0aGF0IGNhdXNlcyBpdCwgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLCB0byBwcm92aWRlIHRoZSBzYW1lIHZhbHVlIGZvclxuICAgICAgLy8gYG9iamVjdGAgYW5kIGBvdGhlcmAuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vamFzaGtlbmFzL3VuZGVyc2NvcmUvcHVsbC8xMjQ3XG4gICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgYWxzbyBlbnN1cmVzIGEgc3RhYmxlIHNvcnQgaW4gVjggYW5kIG90aGVyIGVuZ2luZXMuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHJldHVybiBvYmplY3QuaW5kZXggLSBvdGhlci5pbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IHRoYXQgaXMgdGhlIGNvbXBvc2l0aW9uIG9mIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cyxcbiAgICAgKiBwbGFjZWhvbGRlcnMsIGFuZCBwcm92aWRlZCBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBhcnJheSBvZiBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gaG9sZGVycyBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tcG9zZWQgYXJndW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlZnRMZW5ndGggKyByYW5nZUxlbmd0aCksXG4gICAgICAgICAgaXNVbmN1cnJpZWQgPSAhaXNDdXJyaWVkO1xuXG4gICAgICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtsZWZ0SW5kZXhdID0gcGFydGlhbHNbbGVmdEluZGV4XTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2FyZ3NJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICAgICAgaWYgKGlzVW5jdXJyaWVkIHx8IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHtcbiAgICAgICAgICByZXN1bHRbaG9sZGVyc1thcmdzSW5kZXhdXSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKHJhbmdlTGVuZ3RoLS0pIHtcbiAgICAgICAgcmVzdWx0W2xlZnRJbmRleCsrXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGNvbXBvc2VBcmdzYCBleGNlcHQgdGhhdCB0aGUgYXJndW1lbnRzIGNvbXBvc2l0aW9uXG4gICAgICogaXMgdGFpbG9yZWQgZm9yIGBfLnBhcnRpYWxSaWdodGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKSB7XG4gICAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgICAgIGhvbGRlcnNJbmRleCA9IC0xLFxuICAgICAgICAgIGhvbGRlcnNMZW5ndGggPSBob2xkZXJzLmxlbmd0aCxcbiAgICAgICAgICByaWdodEluZGV4ID0gLTEsXG4gICAgICAgICAgcmlnaHRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KHJhbmdlTGVuZ3RoICsgcmlnaHRMZW5ndGgpLFxuICAgICAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgcmFuZ2VMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2FyZ3NJbmRleF0gPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgICB9XG4gICAgICB2YXIgb2Zmc2V0ID0gYXJnc0luZGV4O1xuICAgICAgd2hpbGUgKCsrcmlnaHRJbmRleCA8IHJpZ2h0TGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtvZmZzZXQgKyByaWdodEluZGV4XSA9IHBhcnRpYWxzW3JpZ2h0SW5kZXhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraG9sZGVyc0luZGV4IDwgaG9sZGVyc0xlbmd0aCkge1xuICAgICAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtvZmZzZXQgKyBob2xkZXJzW2hvbGRlcnNJbmRleF1dID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIHRvLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlBcnJheShzb3VyY2UsIGFycmF5KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG4gICAgICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMgdG8gY29weS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gICAgICB2YXIgaXNOZXcgPSAhb2JqZWN0O1xuICAgICAgb2JqZWN0IHx8IChvYmplY3QgPSB7fSk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgICAgPyBjdXN0b21pemVyKG9iamVjdFtrZXldLCBzb3VyY2Vba2V5XSwga2V5LCBvYmplY3QsIHNvdXJjZSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTmV3KSB7XG4gICAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb3duIHN5bWJvbHMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgZnJvbS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgdG8uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2UsIG9iamVjdCkge1xuICAgICAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29waWVzIG93biBhbmQgaW5oZXJpdGVkIHN5bWJvbHMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgZnJvbS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgdG8uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5U3ltYm9sc0luKHNvdXJjZSwgb2JqZWN0KSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHNJbihzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmdyb3VwQnlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBhY2N1bXVsYXRvciB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2luaXRpYWxpemVyXSBUaGUgYWNjdW11bGF0b3Igb2JqZWN0IGluaXRpYWxpemVyLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFnZ3JlZ2F0b3IgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQWdncmVnYXRvcihzZXR0ZXIsIGluaXRpYWxpemVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlBZ2dyZWdhdG9yIDogYmFzZUFnZ3JlZ2F0b3IsXG4gICAgICAgICAgICBhY2N1bXVsYXRvciA9IGluaXRpYWxpemVyID8gaW5pdGlhbGl6ZXIoKSA6IHt9O1xuXG4gICAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIHNldHRlciwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBhY2N1bXVsYXRvcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmFzc2lnbmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFzc2lnbmVyIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFzc2lnbmVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUFzc2lnbmVyKGFzc2lnbmVyKSB7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gc291cmNlcy5sZW5ndGgsXG4gICAgICAgICAgICBjdXN0b21pemVyID0gbGVuZ3RoID4gMSA/IHNvdXJjZXNbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGN1c3RvbWl6ZXIgPSAoYXNzaWduZXIubGVuZ3RoID4gMyAmJiB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgID8gKGxlbmd0aC0tLCBjdXN0b21pemVyKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICAgICAgICBjdXN0b21pemVyID0gbGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IGN1c3RvbWl6ZXI7XG4gICAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07XG4gICAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgYXNzaWduZXIob2JqZWN0LCBzb3VyY2UsIGluZGV4LCBjdXN0b21pemVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgYmFzZUVhY2hgIG9yIGBiYXNlRWFjaFJpZ2h0YCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBhIGNvbGxlY3Rpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVCYXNlRWFjaChlYWNoRnVuYywgZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgICByZXR1cm4gZWFjaEZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aCxcbiAgICAgICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTEsXG4gICAgICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcblxuICAgICAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0LCBpdGVyYXRlZSwga2V5c0Z1bmMpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICAgICAgcHJvcHMgPSBrZXlzRnVuYyhvYmplY3QpLFxuICAgICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1tmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XTtcbiAgICAgICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBvcHRpb25hbCBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIGB0aGlzQXJnYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgICAgIHJldHVybiBmbi5hcHBseShpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmxvd2VyRmlyc3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbmFtZSBvZiB0aGUgYFN0cmluZ2AgY2FzZSBtZXRob2QgdG8gdXNlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ2FzZUZpcnN0KG1ldGhvZE5hbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcblxuICAgICAgICB2YXIgc3RyU3ltYm9scyA9IGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgICAgID8gc3RyaW5nVG9BcnJheShzdHJpbmcpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgdmFyIGNociA9IHN0clN5bWJvbHNcbiAgICAgICAgICA/IHN0clN5bWJvbHNbMF1cbiAgICAgICAgICA6IHN0cmluZy5jaGFyQXQoMCk7XG5cbiAgICAgICAgdmFyIHRyYWlsaW5nID0gc3RyU3ltYm9sc1xuICAgICAgICAgID8gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDEpLmpvaW4oJycpXG4gICAgICAgICAgOiBzdHJpbmcuc2xpY2UoMSk7XG5cbiAgICAgICAgcmV0dXJuIGNoclttZXRob2ROYW1lXSgpICsgdHJhaWxpbmc7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmNhbWVsQ2FzZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lIGVhY2ggd29yZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3VuZGVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbXBvdW5kZXIoY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCAnJykpLCBjYWxsYmFjaywgJycpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhbiBpbnN0YW5jZSBvZiBgQ3RvcmAgcmVnYXJkbGVzcyBvZlxuICAgICAqIHdoZXRoZXIgaXQgd2FzIGludm9rZWQgYXMgcGFydCBvZiBhIGBuZXdgIGV4cHJlc3Npb24gb3IgYnkgYGNhbGxgIG9yIGBhcHBseWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IEN0b3IgVGhlIGNvbnN0cnVjdG9yIHRvIHdyYXAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDdG9yKEN0b3IpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gVXNlIGEgYHN3aXRjaGAgc3RhdGVtZW50IHRvIHdvcmsgd2l0aCBjbGFzcyBjb25zdHJ1Y3RvcnMuIFNlZVxuICAgICAgICAvLyBodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWZ1bmN0aW9uLW9iamVjdHMtY2FsbC10aGlzYXJndW1lbnQtYXJndW1lbnRzbGlzdFxuICAgICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDdG9yO1xuICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0pO1xuICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgIGNhc2UgNDogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0pO1xuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pO1xuICAgICAgICAgIGNhc2UgNzogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0sIGFyZ3NbNl0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aGlzQmluZGluZyA9IGJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLFxuICAgICAgICAgICAgcmVzdWx0ID0gQ3Rvci5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG5cbiAgICAgICAgLy8gTWltaWMgdGhlIGNvbnN0cnVjdG9yJ3MgYHJldHVybmAgYmVoYXZpb3IuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI3gxMy4yLjIgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiB0aGlzQmluZGluZztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGVuYWJsZSBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhcml0eSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpIHtcbiAgICAgIHZhciBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXIgPSBnZXRIb2xkZXIod3JhcHBlcik7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhvbGRlcnMgPSAobGVuZ3RoIDwgMyAmJiBhcmdzWzBdICE9PSBwbGFjZWhvbGRlciAmJiBhcmdzW2xlbmd0aCAtIDFdICE9PSBwbGFjZWhvbGRlcilcbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG5cbiAgICAgICAgbGVuZ3RoIC09IGhvbGRlcnMubGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoIDwgYXJpdHkpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlUmVjdXJyeShcbiAgICAgICAgICAgIGZ1bmMsIGJpdG1hc2ssIGNyZWF0ZUh5YnJpZCwgd3JhcHBlci5wbGFjZWhvbGRlciwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXJncywgaG9sZGVycywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5IC0gbGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuICAgICAgICByZXR1cm4gYXBwbHkoZm4sIHRoaXMsIGFyZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLmZpbmRgIG9yIGBfLmZpbmRMYXN0YCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZmluZEluZGV4RnVuYyBUaGUgZnVuY3Rpb24gdG8gZmluZCB0aGUgY29sbGVjdGlvbiBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmaW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZpbmQoZmluZEluZGV4RnVuYykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgICAgIHZhciBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHZhciBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyk7XG4gICAgICAgICAgY29sbGVjdGlvbiA9IGtleXMoY29sbGVjdGlvbik7XG4gICAgICAgICAgcHJlZGljYXRlID0gZnVuY3Rpb24oa2V5KSB7IHJldHVybiBpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKTsgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW5kZXggPSBmaW5kSW5kZXhGdW5jKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbUluZGV4KTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID4gLTEgPyBpdGVyYWJsZVtpdGVyYXRlZSA/IGNvbGxlY3Rpb25baW5kZXhdIDogaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8uZmxvd2Agb3IgYF8uZmxvd1JpZ2h0YCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmxvdyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVGbG93KGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmNzKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSBmdW5jcy5sZW5ndGgsXG4gICAgICAgICAgICBpbmRleCA9IGxlbmd0aCxcbiAgICAgICAgICAgIHByZXJlcSA9IExvZGFzaFdyYXBwZXIucHJvdG90eXBlLnRocnU7XG5cbiAgICAgICAgaWYgKGZyb21SaWdodCkge1xuICAgICAgICAgIGZ1bmNzLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIHZhciBmdW5jID0gZnVuY3NbaW5kZXhdO1xuICAgICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmVyZXEgJiYgIXdyYXBwZXIgJiYgZ2V0RnVuY05hbWUoZnVuYykgPT0gJ3dyYXBwZXInKSB7XG4gICAgICAgICAgICB2YXIgd3JhcHBlciA9IG5ldyBMb2Rhc2hXcmFwcGVyKFtdLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSB3cmFwcGVyID8gaW5kZXggOiBsZW5ndGg7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgZnVuYyA9IGZ1bmNzW2luZGV4XTtcblxuICAgICAgICAgIHZhciBmdW5jTmFtZSA9IGdldEZ1bmNOYW1lKGZ1bmMpLFxuICAgICAgICAgICAgICBkYXRhID0gZnVuY05hbWUgPT0gJ3dyYXBwZXInID8gZ2V0RGF0YShmdW5jKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChkYXRhICYmIGlzTGF6aWFibGUoZGF0YVswXSkgJiZcbiAgICAgICAgICAgICAgICBkYXRhWzFdID09IChXUkFQX0FSWV9GTEFHIHwgV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9QQVJUSUFMX0ZMQUcgfCBXUkFQX1JFQVJHX0ZMQUcpICYmXG4gICAgICAgICAgICAgICAgIWRhdGFbNF0ubGVuZ3RoICYmIGRhdGFbOV0gPT0gMVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgIHdyYXBwZXIgPSB3cmFwcGVyW2dldEZ1bmNOYW1lKGRhdGFbMF0pXS5hcHBseSh3cmFwcGVyLCBkYXRhWzNdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd3JhcHBlciA9IChmdW5jLmxlbmd0aCA9PSAxICYmIGlzTGF6aWFibGUoZnVuYykpXG4gICAgICAgICAgICAgID8gd3JhcHBlcltmdW5jTmFtZV0oKVxuICAgICAgICAgICAgICA6IHdyYXBwZXIudGhydShmdW5jKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAgICB2YWx1ZSA9IGFyZ3NbMF07XG5cbiAgICAgICAgICBpZiAod3JhcHBlciAmJiBhcmdzLmxlbmd0aCA9PSAxICYmIGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlci5wbGFudCh2YWx1ZSkudmFsdWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICAgICAgcmVzdWx0ID0gbGVuZ3RoID8gZnVuY3NbaW5kZXhdLmFwcGx5KHRoaXMsIGFyZ3MpIDogdmFsdWU7XG5cbiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZnVuY3NbaW5kZXhdLmNhbGwodGhpcywgcmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCBvcHRpb25hbCBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIGB0aGlzQXJnYCwgcGFydGlhbCBhcHBsaWNhdGlvbiwgYW5kIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gZnVuYyBUaGUgZnVuY3Rpb24gb3IgbWV0aG9kIG5hbWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNSaWdodF0gVGhlIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhvc2UgcHJvdmlkZWRcbiAgICAgKiAgdG8gdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc1JpZ2h0XSBUaGUgYHBhcnRpYWxzUmlnaHRgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlSHlicmlkKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQXJ5ID0gYml0bWFzayAmIFdSQVBfQVJZX0ZMQUcsXG4gICAgICAgICAgaXNCaW5kID0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHLFxuICAgICAgICAgIGlzQmluZEtleSA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfS0VZX0ZMQUcsXG4gICAgICAgICAgaXNDdXJyaWVkID0gYml0bWFzayAmIChXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpLFxuICAgICAgICAgIGlzRmxpcCA9IGJpdG1hc2sgJiBXUkFQX0ZMSVBfRkxBRyxcbiAgICAgICAgICBDdG9yID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0N1cnJpZWQpIHtcbiAgICAgICAgICB2YXIgcGxhY2Vob2xkZXIgPSBnZXRIb2xkZXIod3JhcHBlciksXG4gICAgICAgICAgICAgIGhvbGRlcnNDb3VudCA9IGNvdW50SG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpYWxzKSB7XG4gICAgICAgICAgYXJncyA9IGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0aWFsc1JpZ2h0KSB7XG4gICAgICAgICAgYXJncyA9IGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBpc0N1cnJpZWQpO1xuICAgICAgICB9XG4gICAgICAgIGxlbmd0aCAtPSBob2xkZXJzQ291bnQ7XG4gICAgICAgIGlmIChpc0N1cnJpZWQgJiYgbGVuZ3RoIDwgYXJpdHkpIHtcbiAgICAgICAgICB2YXIgbmV3SG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlUmVjdXJyeShcbiAgICAgICAgICAgIGZ1bmMsIGJpdG1hc2ssIGNyZWF0ZUh5YnJpZCwgd3JhcHBlci5wbGFjZWhvbGRlciwgdGhpc0FyZyxcbiAgICAgICAgICAgIGFyZ3MsIG5ld0hvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSAtIGxlbmd0aFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsXG4gICAgICAgICAgICBmbiA9IGlzQmluZEtleSA/IHRoaXNCaW5kaW5nW2Z1bmNdIDogZnVuYztcblxuICAgICAgICBsZW5ndGggPSBhcmdzLmxlbmd0aDtcbiAgICAgICAgaWYgKGFyZ1Bvcykge1xuICAgICAgICAgIGFyZ3MgPSByZW9yZGVyKGFyZ3MsIGFyZ1Bvcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNGbGlwICYmIGxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBhcmdzLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNBcnkgJiYgYXJ5IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYXJncy5sZW5ndGggPSBhcnk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikge1xuICAgICAgICAgIGZuID0gQ3RvciB8fCBjcmVhdGVDdG9yKGZuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uaW52ZXJ0QnlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBhY2N1bXVsYXRvciB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdG9JdGVyYXRlZSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSBpdGVyYXRlZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlSW52ZXJ0ZXIoc2V0dGVyLCB0b0l0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgICByZXR1cm4gYmFzZUludmVydGVyKG9iamVjdCwgc2V0dGVyLCB0b0l0ZXJhdGVlKGl0ZXJhdGVlKSwge30pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHVzZWQgZm9yIGB1bmRlZmluZWRgIGFyZ3VtZW50cy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtYXRoZW1hdGljYWwgb3BlcmF0aW9uIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZU1hdGhPcGVyYXRpb24ob3BlcmF0b3IsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBvdGhlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdGhlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gb3RoZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIG90aGVyID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICBvdGhlciA9IGJhc2VUb1N0cmluZyhvdGhlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZVRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgIG90aGVyID0gYmFzZVRvTnVtYmVyKG90aGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gb3BlcmF0b3IodmFsdWUsIG90aGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5vdmVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXJyYXlGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgaXRlcmF0ZWVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG92ZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlT3ZlcihhcnJheUZ1bmMpIHtcbiAgICAgIHJldHVybiBmbGF0UmVzdChmdW5jdGlvbihpdGVyYXRlZXMpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuICAgICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICAgIHZhciB0aGlzQXJnID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gYXJyYXlGdW5jKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHBseShpdGVyYXRlZSwgdGhpc0FyZywgYXJncyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AgYmFzZWQgb24gYGxlbmd0aGAuIFRoZSBgY2hhcnNgIHN0cmluZ1xuICAgICAqIGlzIHRydW5jYXRlZCBpZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXhjZWVkcyBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRpbmcgZm9yIGBzdHJpbmdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVBhZGRpbmcobGVuZ3RoLCBjaGFycykge1xuICAgICAgY2hhcnMgPSBjaGFycyA9PT0gdW5kZWZpbmVkID8gJyAnIDogYmFzZVRvU3RyaW5nKGNoYXJzKTtcblxuICAgICAgdmFyIGNoYXJzTGVuZ3RoID0gY2hhcnMubGVuZ3RoO1xuICAgICAgaWYgKGNoYXJzTGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gY2hhcnNMZW5ndGggPyBiYXNlUmVwZWF0KGNoYXJzLCBsZW5ndGgpIDogY2hhcnM7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZVJlcGVhdChjaGFycywgbmF0aXZlQ2VpbChsZW5ndGggLyBzdHJpbmdTaXplKGNoYXJzKSkpO1xuICAgICAgcmV0dXJuIGhhc1VuaWNvZGUoY2hhcnMpXG4gICAgICAgID8gY2FzdFNsaWNlKHN0cmluZ1RvQXJyYXkocmVzdWx0KSwgMCwgbGVuZ3RoKS5qb2luKCcnKVxuICAgICAgICA6IHJlc3VsdC5zbGljZSgwLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmdcbiAgICAgKiBvZiBgdGhpc0FyZ2AgYW5kIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICAgICAgYXJncyA9IEFycmF5KGxlZnRMZW5ndGggKyBhcmdzTGVuZ3RoKSxcbiAgICAgICAgICAgIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcblxuICAgICAgICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgICAgICAgYXJnc1tsZWZ0SW5kZXhdID0gcGFydGlhbHNbbGVmdEluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoYXJnc0xlbmd0aC0tKSB7XG4gICAgICAgICAgYXJnc1tsZWZ0SW5kZXgrK10gPSBhcmd1bWVudHNbKythcmdzSW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmbiwgaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLnJhbmdlYCBvciBgXy5yYW5nZVJpZ2h0YCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmFuZ2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUmFuZ2UoZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCwgc3RlcCkge1xuICAgICAgICBpZiAoc3RlcCAmJiB0eXBlb2Ygc3RlcCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChzdGFydCwgZW5kLCBzdGVwKSkge1xuICAgICAgICAgIGVuZCA9IHN0ZXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5zdXJlIHRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICAgICAgICBzdGFydCA9IHRvRmluaXRlKHN0YXJ0KTtcbiAgICAgICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVuZCA9IHRvRmluaXRlKGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RlcCA9IHN0ZXAgPT09IHVuZGVmaW5lZCA/IChzdGFydCA8IGVuZCA/IDEgOiAtMSkgOiB0b0Zpbml0ZShzdGVwKTtcbiAgICAgICAgcmV0dXJuIGJhc2VSYW5nZShzdGFydCwgZW5kLCBzdGVwLCBmcm9tUmlnaHQpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHJlbGF0aW9uYWwgb3BlcmF0aW9uIG9uIHR3byB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wZXJhdG9yIFRoZSBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVsYXRpb25hbCBvcGVyYXRpb24gZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihvcGVyYXRvcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgICBpZiAoISh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgJiYgdHlwZW9mIG90aGVyID09ICdzdHJpbmcnKSkge1xuICAgICAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgIG90aGVyID0gdG9OdW1iZXIob3RoZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcGVyYXRvcih2YWx1ZSwgb3RoZXIpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gY29udGludWUgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwRnVuYyBUaGUgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBgZnVuY2Agd3JhcHBlci5cbiAgICAgKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUmVjdXJyeShmdW5jLCBiaXRtYXNrLCB3cmFwRnVuYywgcGxhY2Vob2xkZXIsIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgICAgIHZhciBpc0N1cnJ5ID0gYml0bWFzayAmIFdSQVBfQ1VSUllfRkxBRyxcbiAgICAgICAgICBuZXdIb2xkZXJzID0gaXNDdXJyeSA/IGhvbGRlcnMgOiB1bmRlZmluZWQsXG4gICAgICAgICAgbmV3SG9sZGVyc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IGhvbGRlcnMsXG4gICAgICAgICAgbmV3UGFydGlhbHMgPSBpc0N1cnJ5ID8gcGFydGlhbHMgOiB1bmRlZmluZWQsXG4gICAgICAgICAgbmV3UGFydGlhbHNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBwYXJ0aWFscztcblxuICAgICAgYml0bWFzayB8PSAoaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9GTEFHIDogV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpO1xuICAgICAgYml0bWFzayAmPSB+KGlzQ3VycnkgPyBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyA6IFdSQVBfUEFSVElBTF9GTEFHKTtcblxuICAgICAgaWYgKCEoYml0bWFzayAmIFdSQVBfQ1VSUllfQk9VTkRfRkxBRykpIHtcbiAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHKTtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdEYXRhID0gW1xuICAgICAgICBmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBuZXdQYXJ0aWFscywgbmV3SG9sZGVycywgbmV3UGFydGlhbHNSaWdodCxcbiAgICAgICAgbmV3SG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHlcbiAgICAgIF07XG5cbiAgICAgIHZhciByZXN1bHQgPSB3cmFwRnVuYy5hcHBseSh1bmRlZmluZWQsIG5ld0RhdGEpO1xuICAgICAgaWYgKGlzTGF6aWFibGUoZnVuYykpIHtcbiAgICAgICAgc2V0RGF0YShyZXN1bHQsIG5ld0RhdGEpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7XG4gICAgICByZXR1cm4gc2V0V3JhcFRvU3RyaW5nKHJlc3VsdCwgZnVuYywgYml0bWFzayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ucm91bmRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbmFtZSBvZiB0aGUgYE1hdGhgIG1ldGhvZCB0byB1c2Ugd2hlbiByb3VuZGluZy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByb3VuZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSb3VuZChtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgZnVuYyA9IE1hdGhbbWV0aG9kTmFtZV07XG4gICAgICByZXR1cm4gZnVuY3Rpb24obnVtYmVyLCBwcmVjaXNpb24pIHtcbiAgICAgICAgbnVtYmVyID0gdG9OdW1iZXIobnVtYmVyKTtcbiAgICAgICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09IG51bGwgPyAwIDogbmF0aXZlTWluKHRvSW50ZWdlcihwcmVjaXNpb24pLCAyOTIpO1xuICAgICAgICBpZiAocHJlY2lzaW9uKSB7XG4gICAgICAgICAgLy8gU2hpZnQgd2l0aCBleHBvbmVudGlhbCBub3RhdGlvbiB0byBhdm9pZCBmbG9hdGluZy1wb2ludCBpc3N1ZXMuXG4gICAgICAgICAgLy8gU2VlIFtNRE5dKGh0dHBzOi8vbWRuLmlvL3JvdW5kI0V4YW1wbGVzKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHZhciBwYWlyID0gKHRvU3RyaW5nKG51bWJlcikgKyAnZScpLnNwbGl0KCdlJyksXG4gICAgICAgICAgICAgIHZhbHVlID0gZnVuYyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdICsgcHJlY2lzaW9uKSk7XG5cbiAgICAgICAgICBwYWlyID0gKHRvU3RyaW5nKHZhbHVlKSArICdlJykuc3BsaXQoJ2UnKTtcbiAgICAgICAgICByZXR1cm4gKyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdIC0gcHJlY2lzaW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMobnVtYmVyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBzZXQuXG4gICAgICovXG4gICAgdmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBuZXcgU2V0KHZhbHVlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy50b1BhaXJzYCBvciBgXy50b1BhaXJzSW5gIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhaXJzIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVRvUGFpcnMoa2V5c0Z1bmMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgdmFyIHRhZyA9IGdldFRhZyhvYmplY3QpO1xuICAgICAgICBpZiAodGFnID09IG1hcFRhZykge1xuICAgICAgICAgIHJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgICByZXR1cm4gc2V0VG9QYWlycyhvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiYXNlVG9QYWlycyhvYmplY3QsIGtleXNGdW5jKG9iamVjdCkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBlaXRoZXIgY3VycmllcyBvciBpbnZva2VzIGBmdW5jYCB3aXRoIG9wdGlvbmFsXG4gICAgICogYHRoaXNgIGJpbmRpbmcgYW5kIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogICAgMSAtIGBfLmJpbmRgXG4gICAgICogICAgMiAtIGBfLmJpbmRLZXlgXG4gICAgICogICAgNCAtIGBfLmN1cnJ5YCBvciBgXy5jdXJyeVJpZ2h0YCBvZiBhIGJvdW5kIGZ1bmN0aW9uXG4gICAgICogICAgOCAtIGBfLmN1cnJ5YFxuICAgICAqICAgMTYgLSBgXy5jdXJyeVJpZ2h0YFxuICAgICAqICAgMzIgLSBgXy5wYXJ0aWFsYFxuICAgICAqICAgNjQgLSBgXy5wYXJ0aWFsUmlnaHRgXG4gICAgICogIDEyOCAtIGBfLnJlYXJnYFxuICAgICAqICAyNTYgLSBgXy5hcnlgXG4gICAgICogIDUxMiAtIGBfLmZsaXBgXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmICghaXNCaW5kS2V5ICYmIHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IHBhcnRpYWxzID8gcGFydGlhbHMubGVuZ3RoIDogMDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgICAgICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYXJ5ID0gYXJ5ID09PSB1bmRlZmluZWQgPyBhcnkgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKGFyeSksIDApO1xuICAgICAgYXJpdHkgPSBhcml0eSA9PT0gdW5kZWZpbmVkID8gYXJpdHkgOiB0b0ludGVnZXIoYXJpdHkpO1xuICAgICAgbGVuZ3RoIC09IGhvbGRlcnMgPyBob2xkZXJzLmxlbmd0aCA6IDA7XG5cbiAgICAgIGlmIChiaXRtYXNrICYgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgdmFyIHBhcnRpYWxzUmlnaHQgPSBwYXJ0aWFscyxcbiAgICAgICAgICAgIGhvbGRlcnNSaWdodCA9IGhvbGRlcnM7XG5cbiAgICAgICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBnZXREYXRhKGZ1bmMpO1xuXG4gICAgICB2YXIgbmV3RGF0YSA9IFtcbiAgICAgICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCxcbiAgICAgICAgYXJnUG9zLCBhcnksIGFyaXR5XG4gICAgICBdO1xuXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBtZXJnZURhdGEobmV3RGF0YSwgZGF0YSk7XG4gICAgICB9XG4gICAgICBmdW5jID0gbmV3RGF0YVswXTtcbiAgICAgIGJpdG1hc2sgPSBuZXdEYXRhWzFdO1xuICAgICAgdGhpc0FyZyA9IG5ld0RhdGFbMl07XG4gICAgICBwYXJ0aWFscyA9IG5ld0RhdGFbM107XG4gICAgICBob2xkZXJzID0gbmV3RGF0YVs0XTtcbiAgICAgIGFyaXR5ID0gbmV3RGF0YVs5XSA9IG5ld0RhdGFbOV0gPT09IHVuZGVmaW5lZFxuICAgICAgICA/IChpc0JpbmRLZXkgPyAwIDogZnVuYy5sZW5ndGgpXG4gICAgICAgIDogbmF0aXZlTWF4KG5ld0RhdGFbOV0gLSBsZW5ndGgsIDApO1xuXG4gICAgICBpZiAoIWFyaXR5ICYmIGJpdG1hc2sgJiAoV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKTtcbiAgICAgIH1cbiAgICAgIGlmICghYml0bWFzayB8fCBiaXRtYXNrID09IFdSQVBfQklORF9GTEFHKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpO1xuICAgICAgfSBlbHNlIGlmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRyB8fCBiaXRtYXNrID09IFdSQVBfQ1VSUllfUklHSFRfRkxBRykge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSk7XG4gICAgICB9IGVsc2UgaWYgKChiaXRtYXNrID09IFdSQVBfUEFSVElBTF9GTEFHIHx8IGJpdG1hc2sgPT0gKFdSQVBfQklORF9GTEFHIHwgV1JBUF9QQVJUSUFMX0ZMQUcpKSAmJiAhaG9sZGVycy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcbiAgICAgIH1cbiAgICAgIHZhciBzZXR0ZXIgPSBkYXRhID8gYmFzZVNldERhdGEgOiBzZXREYXRhO1xuICAgICAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhzZXR0ZXIocmVzdWx0LCBuZXdEYXRhKSwgZnVuYywgYml0bWFzayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c2AgdG8gY3VzdG9taXplIGl0cyBgXy5hc3NpZ25JbmAgdXNlIHRvIGFzc2lnbiBwcm9wZXJ0aWVzXG4gICAgICogb2Ygc291cmNlIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXNcbiAgICAgKiB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gb2JqVmFsdWUgVGhlIGRlc3RpbmF0aW9uIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHNvdXJjZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBvYmpWYWx1ZWAuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKGVxKG9ialZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgICAgIHJldHVybiBzcmNWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLmRlZmF1bHRzRGVlcGAgdG8gY3VzdG9taXplIGl0cyBgXy5tZXJnZWAgdXNlIHRvIG1lcmdlIHNvdXJjZVxuICAgICAqIG9iamVjdHMgaW50byBkZXN0aW5hdGlvbiBvYmplY3RzIHRoYXQgYXJlIHBhc3NlZCB0aHJ1LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBtZXJnZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBvYmpWYWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgcGFyZW50IG9iamVjdCBvZiBgc3JjVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzTWVyZ2Uob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjaykge1xuICAgICAgaWYgKGlzT2JqZWN0KG9ialZhbHVlKSAmJiBpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgb2JqVmFsdWUpO1xuICAgICAgICBiYXNlTWVyZ2Uob2JqVmFsdWUsIHNyY1ZhbHVlLCB1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UsIHN0YWNrKTtcbiAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLm9taXRgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uY2xvbmVEZWVwYCB1c2UgdG8gb25seSBjbG9uZSBwbGFpblxuICAgICAqIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB1bmNsb25lZCB2YWx1ZSBvciBgdW5kZWZpbmVkYCB0byBkZWZlciBjbG9uaW5nIHRvIGBfLmNsb25lRGVlcGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tT21pdENsb25lKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gICAgICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvdGhlciBUaGUgb3RoZXIgYXJyYXkgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBhcnJheWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgICAgICBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuXG4gICAgICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KGFycmF5KTtcbiAgICAgIGlmIChzdGFja2VkICYmIHN0YWNrLmdldChvdGhlcikpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSB0cnVlLFxuICAgICAgICAgIHNlZW4gPSAoYml0bWFzayAmIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpID8gbmV3IFNldENhY2hlIDogdW5kZWZpbmVkO1xuXG4gICAgICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgYXJyYXkpO1xuXG4gICAgICAvLyBJZ25vcmUgbm9uLWluZGV4IHByb3BlcnRpZXMuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2luZGV4XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBhcnJWYWx1ZSwgaW5kZXgsIG90aGVyLCBhcnJheSwgc3RhY2spXG4gICAgICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBhcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoc2Vlbikge1xuICAgICAgICAgIGlmICghYXJyYXlTb21lKG90aGVyLCBmdW5jdGlvbihvdGhWYWx1ZSwgb3RoSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgICAgICAoYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBzZWVuLnB1c2gob3RoSW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEoXG4gICAgICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgICAgIGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja1snZGVsZXRlJ10oYXJyYXkpO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZlxuICAgICAqIHRoZSBzYW1lIGB0b1N0cmluZ1RhZ2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyO1xuICAgICAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xuXG4gICAgICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksIG5ldyBVaW50OEFycmF5KG90aGVyKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICAgIC8vIENvZXJjZSBib29sZWFucyB0byBgMWAgb3IgYDBgIGFuZCBkYXRlcyB0byBtaWxsaXNlY29uZHMuXG4gICAgICAgICAgLy8gSW52YWxpZCBkYXRlcyBhcmUgY29lcmNlZCB0byBgTmFOYC5cbiAgICAgICAgICByZXR1cm4gZXEoK29iamVjdCwgK290aGVyKTtcblxuICAgICAgICBjYXNlIGVycm9yVGFnOlxuICAgICAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgICAgIC8vIENvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgYW5kIHRyZWF0IHN0cmluZ3MsIHByaW1pdGl2ZXMgYW5kIG9iamVjdHMsXG4gICAgICAgICAgLy8gYXMgZXF1YWwuIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcmVnZXhwLnByb3RvdHlwZS50b3N0cmluZ1xuICAgICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSAob3RoZXIgKyAnJyk7XG5cbiAgICAgICAgY2FzZSBtYXBUYWc6XG4gICAgICAgICAgdmFyIGNvbnZlcnQgPSBtYXBUb0FycmF5O1xuXG4gICAgICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUc7XG4gICAgICAgICAgY29udmVydCB8fCAoY29udmVydCA9IHNldFRvQXJyYXkpO1xuXG4gICAgICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJpdG1hc2sgfD0gQ09NUEFSRV9VTk9SREVSRURfRkxBRztcblxuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gZXF1YWxBcnJheXMoY29udmVydChvYmplY3QpLCBjb252ZXJ0KG90aGVyKSwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgICAgICBpZiAoc3ltYm9sVmFsdWVPZikge1xuICAgICAgICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpID09IHN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gICAgICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgICAgICBvYmpQcm9wcyA9IGdldEFsbEtleXMob2JqZWN0KSxcbiAgICAgICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICAgICAgb3RoUHJvcHMgPSBnZXRBbGxLZXlzKG90aGVyKSxcbiAgICAgICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgICAgIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgdmFyIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICAgICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICBpZiAoc3RhY2tlZCAmJiBzdGFjay5nZXQob3RoZXIpKSB7XG4gICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHRydWU7XG4gICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICBzdGFjay5zZXQob3RoZXIsIG9iamVjdCk7XG5cbiAgICAgIHZhciBza2lwQ3RvciA9IGlzUGFydGlhbDtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgb2JqTGVuZ3RoKSB7XG4gICAgICAgIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICAgICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2tleV07XG5cbiAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgb2JqVmFsdWUsIGtleSwgb3RoZXIsIG9iamVjdCwgc3RhY2spXG4gICAgICAgICAgICA6IGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlLCBrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgaWYgKCEoY29tcGFyZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IChvYmpWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKG9ialZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKVxuICAgICAgICAgICAgICA6IGNvbXBhcmVkXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc2tpcEN0b3IgfHwgKHNraXBDdG9yID0ga2V5ID09ICdjb25zdHJ1Y3RvcicpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCAmJiAhc2tpcEN0b3IpIHtcbiAgICAgICAgdmFyIG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBvdGhDdG9yID0gb3RoZXIuY29uc3RydWN0b3I7XG5cbiAgICAgICAgLy8gTm9uIGBPYmplY3RgIG9iamVjdCBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1YWwuXG4gICAgICAgIGlmIChvYmpDdG9yICE9IG90aEN0b3IgJiZcbiAgICAgICAgICAgICgnY29uc3RydWN0b3InIGluIG9iamVjdCAmJiAnY29uc3RydWN0b3InIGluIG90aGVyKSAmJlxuICAgICAgICAgICAgISh0eXBlb2Ygb2JqQ3RvciA9PSAnZnVuY3Rpb24nICYmIG9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBvdGhDdG9yID09ICdmdW5jdGlvbicgJiYgb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggZmxhdHRlbnMgdGhlIHJlc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdFJlc3QoZnVuYykge1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHVuZGVmaW5lZCwgZmxhdHRlbiksIGZ1bmMgKyAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0QWxsS2V5cyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXMsIGdldFN5bWJvbHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAgICAgKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRBbGxLZXlzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzSW4sIGdldFN5bWJvbHNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgZ2V0RGF0YSA9ICFtZXRhTWFwID8gbm9vcCA6IGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAgIHJldHVybiBtZXRhTWFwLmdldChmdW5jKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmFtZSBvZiBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0RnVuY05hbWUoZnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IChmdW5jLm5hbWUgKyAnJyksXG4gICAgICAgICAgYXJyYXkgPSByZWFsTmFtZXNbcmVzdWx0XSxcbiAgICAgICAgICBsZW5ndGggPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlYWxOYW1lcywgcmVzdWx0KSA/IGFycmF5Lmxlbmd0aCA6IDA7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIgZGF0YSA9IGFycmF5W2xlbmd0aF0sXG4gICAgICAgICAgICBvdGhlckZ1bmMgPSBkYXRhLmZ1bmM7XG4gICAgICAgIGlmIChvdGhlckZ1bmMgPT0gbnVsbCB8fCBvdGhlckZ1bmMgPT0gZnVuYykge1xuICAgICAgICAgIHJldHVybiBkYXRhLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYXJndW1lbnQgcGxhY2Vob2xkZXIgdmFsdWUgZm9yIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0SG9sZGVyKGZ1bmMpIHtcbiAgICAgIHZhciBvYmplY3QgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaCwgJ3BsYWNlaG9sZGVyJykgPyBsb2Rhc2ggOiBmdW5jO1xuICAgICAgcmV0dXJuIG9iamVjdC5wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBcIml0ZXJhdGVlXCIgZnVuY3Rpb24uIElmIGBfLml0ZXJhdGVlYCBpcyBjdXN0b21pemVkLFxuICAgICAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY3VzdG9tIG1ldGhvZCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgYGJhc2VJdGVyYXRlZWAuXG4gICAgICogSWYgYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgdGhlIGNob3NlbiBmdW5jdGlvbiBpcyBpbnZva2VkIHdpdGggdGhlbSBhbmRcbiAgICAgKiBpdHMgcmVzdWx0IGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IFt2YWx1ZV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIHRoZSBjcmVhdGVkIGl0ZXJhdGVlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgY2hvc2VuIGZ1bmN0aW9uIG9yIGl0cyByZXN1bHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0SXRlcmF0ZWUoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbG9kYXNoLml0ZXJhdGVlIHx8IGl0ZXJhdGVlO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0ID09PSBpdGVyYXRlZSA/IGJhc2VJdGVyYXRlZSA6IHJlc3VsdDtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gcmVzdWx0KGFyZ3VtZW50c1swXSwgYXJndW1lbnRzWzFdKSA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkYXRhIGZvciBgbWFwYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hcCBkYXRhLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gbWFwLl9fZGF0YV9fO1xuICAgICAgcmV0dXJuIGlzS2V5YWJsZShrZXkpXG4gICAgICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgICAgIDogZGF0YS5tYXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3Mgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG1hdGNoIGRhdGEgb2YgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGtleXMob2JqZWN0KSxcbiAgICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGtleSA9IHJlc3VsdFtsZW5ndGhdLFxuICAgICAgICAgICAgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICByZXN1bHRbbGVuZ3RoXSA9IFtrZXksIHZhbHVlLCBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTtcbiAgICAgIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlR2V0VGFnYCB3aGljaCBpZ25vcmVzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKSB7XG4gICAgICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICAgICAgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuXG4gICAgICB0cnkge1xuICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciB1bm1hc2tlZCA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgICBpZiAodW5tYXNrZWQpIHtcbiAgICAgICAgaWYgKGlzT3duKSB7XG4gICAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAgICAgKi9cbiAgICB2YXIgZ2V0U3ltYm9scyA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICByZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLCBmdW5jdGlvbihzeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LCBzeW1ib2wpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAgICAgKi9cbiAgICB2YXIgZ2V0U3ltYm9sc0luID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIHdoaWxlIChvYmplY3QpIHtcbiAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgZ2V0U3ltYm9scyhvYmplY3QpKTtcbiAgICAgICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlKG9iamVjdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgdG9TdHJpbmdUYWdgIG9mIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gICAgICovXG4gICAgdmFyIGdldFRhZyA9IGJhc2VHZXRUYWc7XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgZGF0YSB2aWV3cywgbWFwcywgc2V0cywgYW5kIHdlYWsgbWFwcyBpbiBJRSAxMSBhbmQgcHJvbWlzZXMgaW4gTm9kZS5qcyA8IDYuXG4gICAgaWYgKChEYXRhVmlldyAmJiBnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpICE9IGRhdGFWaWV3VGFnKSB8fFxuICAgICAgICAoTWFwICYmIGdldFRhZyhuZXcgTWFwKSAhPSBtYXBUYWcpIHx8XG4gICAgICAgIChQcm9taXNlICYmIGdldFRhZyhQcm9taXNlLnJlc29sdmUoKSkgIT0gcHJvbWlzZVRhZykgfHxcbiAgICAgICAgKFNldCAmJiBnZXRUYWcobmV3IFNldCkgIT0gc2V0VGFnKSB8fFxuICAgICAgICAoV2Vha01hcCAmJiBnZXRUYWcobmV3IFdlYWtNYXApICE9IHdlYWtNYXBUYWcpKSB7XG4gICAgICBnZXRUYWcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gYmFzZUdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgICBDdG9yID0gcmVzdWx0ID09IG9iamVjdFRhZyA/IHZhbHVlLmNvbnN0cnVjdG9yIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY3RvclN0cmluZyA9IEN0b3IgPyB0b1NvdXJjZShDdG9yKSA6ICcnO1xuXG4gICAgICAgIGlmIChjdG9yU3RyaW5nKSB7XG4gICAgICAgICAgc3dpdGNoIChjdG9yU3RyaW5nKSB7XG4gICAgICAgICAgICBjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzogcmV0dXJuIGRhdGFWaWV3VGFnO1xuICAgICAgICAgICAgY2FzZSBtYXBDdG9yU3RyaW5nOiByZXR1cm4gbWFwVGFnO1xuICAgICAgICAgICAgY2FzZSBwcm9taXNlQ3RvclN0cmluZzogcmV0dXJuIHByb21pc2VUYWc7XG4gICAgICAgICAgICBjYXNlIHNldEN0b3JTdHJpbmc6IHJldHVybiBzZXRUYWc7XG4gICAgICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOiByZXR1cm4gd2Vha01hcFRhZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmlldywgYXBwbHlpbmcgYW55IGB0cmFuc2Zvcm1zYCB0byB0aGUgYHN0YXJ0YCBhbmQgYGVuZGAgcG9zaXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgdmlldy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB0cmFuc2Zvcm1zIFRoZSB0cmFuc2Zvcm1hdGlvbnMgdG8gYXBwbHkgdG8gdGhlIHZpZXcuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgYHN0YXJ0YCBhbmQgYGVuZGBcbiAgICAgKiAgcG9zaXRpb25zIG9mIHRoZSB2aWV3LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFZpZXcoc3RhcnQsIGVuZCwgdHJhbnNmb3Jtcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdHJhbnNmb3Jtcy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBkYXRhID0gdHJhbnNmb3Jtc1tpbmRleF0sXG4gICAgICAgICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnZHJvcCc6ICAgICAgc3RhcnQgKz0gc2l6ZTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZHJvcFJpZ2h0JzogZW5kIC09IHNpemU7IGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3Rha2UnOiAgICAgIGVuZCA9IG5hdGl2ZU1pbihlbmQsIHN0YXJ0ICsgc2l6ZSk7IGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3Rha2VSaWdodCc6IHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0LCBlbmQgLSBzaXplKTsgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7ICdzdGFydCc6IHN0YXJ0LCAnZW5kJzogZW5kIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgd3JhcHBlciBkZXRhaWxzIGZyb20gdGhlIGBzb3VyY2VgIGJvZHkgY29tbWVudC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBUaGUgc291cmNlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3cmFwcGVyIGRldGFpbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0V3JhcERldGFpbHMoc291cmNlKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBzb3VyY2UubWF0Y2gocmVXcmFwRGV0YWlscyk7XG4gICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXS5zcGxpdChyZVNwbGl0RGV0YWlscykgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGV4aXN0cyBvbiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrIHByb3BlcnRpZXMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgaGFzRnVuYykge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pO1xuICAgICAgICBpZiAoIShyZXN1bHQgPSBvYmplY3QgIT0gbnVsbCAmJiBoYXNGdW5jKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgfHwgKytpbmRleCAhPSBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGxlbmd0aCA9IG9iamVjdCA9PSBudWxsID8gMCA6IG9iamVjdC5sZW5ndGg7XG4gICAgICByZXR1cm4gISFsZW5ndGggJiYgaXNMZW5ndGgobGVuZ3RoKSAmJiBpc0luZGV4KGtleSwgbGVuZ3RoKSAmJlxuICAgICAgICAoaXNBcnJheShvYmplY3QpIHx8IGlzQXJndW1lbnRzKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIGFycmF5IGNsb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0Q2xvbmVBcnJheShhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAgICAgLy8gQWRkIHByb3BlcnRpZXMgYXNzaWduZWQgYnkgYFJlZ0V4cCNleGVjYC5cbiAgICAgIGlmIChsZW5ndGggJiYgdHlwZW9mIGFycmF5WzBdID09ICdzdHJpbmcnICYmIGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksICdpbmRleCcpKSB7XG4gICAgICAgIHJlc3VsdC5pbmRleCA9IGFycmF5LmluZGV4O1xuICAgICAgICByZXN1bHQuaW5wdXQgPSBhcnJheS5pbnB1dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCkge1xuICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkpXG4gICAgICAgID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSlcbiAgICAgICAgOiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUgYmFzZWQgb24gaXRzIGB0b1N0cmluZ1RhZ2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNsb25pbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICAgICAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTWFwYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBgU2V0YCwgb3IgYFN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsIHRhZywgaXNEZWVwKSB7XG4gICAgICB2YXIgQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lQXJyYXlCdWZmZXIob2JqZWN0KTtcblxuICAgICAgICBjYXNlIGJvb2xUYWc6XG4gICAgICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3IoK29iamVjdCk7XG5cbiAgICAgICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVEYXRhVmlldyhvYmplY3QsIGlzRGVlcCk7XG5cbiAgICAgICAgY2FzZSBmbG9hdDMyVGFnOiBjYXNlIGZsb2F0NjRUYWc6XG4gICAgICAgIGNhc2UgaW50OFRhZzogY2FzZSBpbnQxNlRhZzogY2FzZSBpbnQzMlRhZzpcbiAgICAgICAgY2FzZSB1aW50OFRhZzogY2FzZSB1aW50OENsYW1wZWRUYWc6IGNhc2UgdWludDE2VGFnOiBjYXNlIHVpbnQzMlRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVUeXBlZEFycmF5KG9iamVjdCwgaXNEZWVwKTtcblxuICAgICAgICBjYXNlIG1hcFRhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICAgICAgY2FzZSBudW1iZXJUYWc6XG4gICAgICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3RvcihvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpO1xuXG4gICAgICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgICAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVTeW1ib2wob2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHdyYXBwZXIgYGRldGFpbHNgIGluIGEgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBgc291cmNlYCBib2R5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBzb3VyY2UgdG8gbW9kaWZ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBpbnNlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc291cmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSwgZGV0YWlscykge1xuICAgICAgdmFyIGxlbmd0aCA9IGRldGFpbHMubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgIH1cbiAgICAgIHZhciBsYXN0SW5kZXggPSBsZW5ndGggLSAxO1xuICAgICAgZGV0YWlsc1tsYXN0SW5kZXhdID0gKGxlbmd0aCA+IDEgPyAnJiAnIDogJycpICsgZGV0YWlsc1tsYXN0SW5kZXhdO1xuICAgICAgZGV0YWlscyA9IGRldGFpbHMuam9pbihsZW5ndGggPiAyID8gJywgJyA6ICcgJyk7XG4gICAgICByZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwgJ3tcXG4vKiBbd3JhcHBlZCB3aXRoICcgKyBkZXRhaWxzICsgJ10gKi9cXG4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZsYXR0ZW5hYmxlIGBhcmd1bWVudHNgIG9iamVjdCBvciBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZmxhdHRlbmFibGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0ZsYXR0ZW5hYmxlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpIHx8XG4gICAgICAgICEhKHNwcmVhZGFibGVTeW1ib2wgJiYgdmFsdWUgJiYgdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuXG4gICAgICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAgICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICAgICAodHlwZSAhPSAnc3ltYm9sJyAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkpICYmXG4gICAgICAgICAgICAodmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSB7Kn0gaW5kZXggVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBpbmRleCBvciBrZXkgYXJndW1lbnQuXG4gICAgICogQHBhcmFtIHsqfSBvYmplY3QgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBvYmplY3QgYXJndW1lbnQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgaW5kZXg7XG4gICAgICBpZiAodHlwZSA9PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgICAgIDogKHR5cGUgPT0gJ3N0cmluZycgJiYgaW5kZXggaW4gb2JqZWN0KVxuICAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSBhbmQgbm90IGEgcHJvcGVydHkgcGF0aC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0tleSh2YWx1ZSwgb2JqZWN0KSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBpZiAodHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSB8fCAhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpIHx8XG4gICAgICAgIChvYmplY3QgIT0gbnVsbCAmJiB2YWx1ZSBpbiBPYmplY3Qob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICAgICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuICAgICAgICA6ICh2YWx1ZSA9PT0gbnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgYSBsYXp5IGNvdW50ZXJwYXJ0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGhhcyBhIGxhenkgY291bnRlcnBhcnQsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0xhemlhYmxlKGZ1bmMpIHtcbiAgICAgIHZhciBmdW5jTmFtZSA9IGdldEZ1bmNOYW1lKGZ1bmMpLFxuICAgICAgICAgIG90aGVyID0gbG9kYXNoW2Z1bmNOYW1lXTtcblxuICAgICAgaWYgKHR5cGVvZiBvdGhlciAhPSAnZnVuY3Rpb24nIHx8ICEoZnVuY05hbWUgaW4gTGF6eVdyYXBwZXIucHJvdG90eXBlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoZnVuYyA9PT0gb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB2YXIgZGF0YSA9IGdldERhdGEob3RoZXIpO1xuICAgICAgcmV0dXJuICEhZGF0YSAmJiBmdW5jID09PSBkYXRhWzBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgICAgIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBmdW5jYCBpcyBjYXBhYmxlIG9mIGJlaW5nIG1hc2tlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrYWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIHZhciBpc01hc2thYmxlID0gY29yZUpzRGF0YSA/IGlzRnVuY3Rpb24gOiBzdHViRmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBwcm90b3R5cGUgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKSB7XG4gICAgICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gICAgICByZXR1cm4gdmFsdWUgPT09IHByb3RvO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlmIHN1aXRhYmxlIGZvciBzdHJpY3RcbiAgICAgKiAgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgJiYgIWlzT2JqZWN0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYG1hdGNoZXNQcm9wZXJ0eWAgZm9yIHNvdXJjZSB2YWx1ZXMgc3VpdGFibGVcbiAgICAgKiBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKGtleSwgc3JjVmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Rba2V5XSA9PT0gc3JjVmFsdWUgJiZcbiAgICAgICAgICAoc3JjVmFsdWUgIT09IHVuZGVmaW5lZCB8fCAoa2V5IGluIE9iamVjdChvYmplY3QpKSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tZW1vaXplYCB3aGljaCBjbGVhcnMgdGhlIG1lbW9pemVkIGZ1bmN0aW9uJ3NcbiAgICAgKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbWVtb2l6ZShmdW5jLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKGNhY2hlLnNpemUgPT09IE1BWF9NRU1PSVpFX1NJWkUpIHtcbiAgICAgICAgICBjYWNoZS5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgICB9KTtcblxuICAgICAgdmFyIGNhY2hlID0gcmVzdWx0LmNhY2hlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZXMgdGhlIGZ1bmN0aW9uIG1ldGFkYXRhIG9mIGBzb3VyY2VgIGludG8gYGRhdGFgLlxuICAgICAqXG4gICAgICogTWVyZ2luZyBtZXRhZGF0YSByZWR1Y2VzIHRoZSBudW1iZXIgb2Ygd3JhcHBlcnMgdXNlZCB0byBpbnZva2UgYSBmdW5jdGlvbi5cbiAgICAgKiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgbWV0aG9kcyBsaWtlIGBfLmJpbmRgLCBgXy5jdXJyeWAsIGFuZCBgXy5wYXJ0aWFsYFxuICAgICAqIG1heSBiZSBhcHBsaWVkIHJlZ2FyZGxlc3Mgb2YgZXhlY3V0aW9uIG9yZGVyLiBNZXRob2RzIGxpa2UgYF8uYXJ5YCBhbmRcbiAgICAgKiBgXy5yZWFyZ2AgbW9kaWZ5IGZ1bmN0aW9uIGFyZ3VtZW50cywgbWFraW5nIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZVxuICAgICAqIGV4ZWN1dGVkIGltcG9ydGFudCwgcHJldmVudGluZyB0aGUgbWVyZ2luZyBvZiBtZXRhZGF0YS4gSG93ZXZlciwgd2UgbWFrZVxuICAgICAqIGFuIGV4Y2VwdGlvbiBmb3IgYSBzYWZlIGNvbWJpbmVkIGNhc2Ugd2hlcmUgY3VycmllZCBmdW5jdGlvbnMgaGF2ZSBgXy5hcnlgXG4gICAgICogYW5kIG9yIGBfLnJlYXJnYCBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBkYXRhIFRoZSBkZXN0aW5hdGlvbiBtZXRhZGF0YS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIHNvdXJjZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGRhdGFgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLCBzb3VyY2UpIHtcbiAgICAgIHZhciBiaXRtYXNrID0gZGF0YVsxXSxcbiAgICAgICAgICBzcmNCaXRtYXNrID0gc291cmNlWzFdLFxuICAgICAgICAgIG5ld0JpdG1hc2sgPSBiaXRtYXNrIHwgc3JjQml0bWFzayxcbiAgICAgICAgICBpc0NvbW1vbiA9IG5ld0JpdG1hc2sgPCAoV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcgfCBXUkFQX0FSWV9GTEFHKTtcblxuICAgICAgdmFyIGlzQ29tYm8gPVxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gV1JBUF9BUllfRkxBRykgJiYgKGJpdG1hc2sgPT0gV1JBUF9DVVJSWV9GTEFHKSkgfHxcbiAgICAgICAgKChzcmNCaXRtYXNrID09IFdSQVBfQVJZX0ZMQUcpICYmIChiaXRtYXNrID09IFdSQVBfUkVBUkdfRkxBRykgJiYgKGRhdGFbN10ubGVuZ3RoIDw9IHNvdXJjZVs4XSkpIHx8XG4gICAgICAgICgoc3JjQml0bWFzayA9PSAoV1JBUF9BUllfRkxBRyB8IFdSQVBfUkVBUkdfRkxBRykpICYmIChzb3VyY2VbN10ubGVuZ3RoIDw9IHNvdXJjZVs4XSkgJiYgKGJpdG1hc2sgPT0gV1JBUF9DVVJSWV9GTEFHKSk7XG5cbiAgICAgIC8vIEV4aXQgZWFybHkgaWYgbWV0YWRhdGEgY2FuJ3QgYmUgbWVyZ2VkLlxuICAgICAgaWYgKCEoaXNDb21tb24gfHwgaXNDb21ibykpIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGB0aGlzQXJnYCBpZiBhdmFpbGFibGUuXG4gICAgICBpZiAoc3JjQml0bWFzayAmIFdSQVBfQklORF9GTEFHKSB7XG4gICAgICAgIGRhdGFbMl0gPSBzb3VyY2VbMl07XG4gICAgICAgIC8vIFNldCB3aGVuIGN1cnJ5aW5nIGEgYm91bmQgZnVuY3Rpb24uXG4gICAgICAgIG5ld0JpdG1hc2sgfD0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHID8gMCA6IFdSQVBfQ1VSUllfQk9VTkRfRkxBRztcbiAgICAgIH1cbiAgICAgIC8vIENvbXBvc2UgcGFydGlhbCBhcmd1bWVudHMuXG4gICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbM107XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdmFyIHBhcnRpYWxzID0gZGF0YVszXTtcbiAgICAgICAgZGF0YVszXSA9IHBhcnRpYWxzID8gY29tcG9zZUFyZ3MocGFydGlhbHMsIHZhbHVlLCBzb3VyY2VbNF0pIDogdmFsdWU7XG4gICAgICAgIGRhdGFbNF0gPSBwYXJ0aWFscyA/IHJlcGxhY2VIb2xkZXJzKGRhdGFbM10sIFBMQUNFSE9MREVSKSA6IHNvdXJjZVs0XTtcbiAgICAgIH1cbiAgICAgIC8vIENvbXBvc2UgcGFydGlhbCByaWdodCBhcmd1bWVudHMuXG4gICAgICB2YWx1ZSA9IHNvdXJjZVs1XTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBwYXJ0aWFscyA9IGRhdGFbNV07XG4gICAgICAgIGRhdGFbNV0gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzUmlnaHQocGFydGlhbHMsIHZhbHVlLCBzb3VyY2VbNl0pIDogdmFsdWU7XG4gICAgICAgIGRhdGFbNl0gPSBwYXJ0aWFscyA/IHJlcGxhY2VIb2xkZXJzKGRhdGFbNV0sIFBMQUNFSE9MREVSKSA6IHNvdXJjZVs2XTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyZ1Bvc2AgaWYgYXZhaWxhYmxlLlxuICAgICAgdmFsdWUgPSBzb3VyY2VbN107XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZGF0YVs3XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgYXJ5YCBpZiBpdCdzIHNtYWxsZXIuXG4gICAgICBpZiAoc3JjQml0bWFzayAmIFdSQVBfQVJZX0ZMQUcpIHtcbiAgICAgICAgZGF0YVs4XSA9IGRhdGFbOF0gPT0gbnVsbCA/IHNvdXJjZVs4XSA6IG5hdGl2ZU1pbihkYXRhWzhdLCBzb3VyY2VbOF0pO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgYXJpdHlgIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQuXG4gICAgICBpZiAoZGF0YVs5XSA9PSBudWxsKSB7XG4gICAgICAgIGRhdGFbOV0gPSBzb3VyY2VbOV07XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBmdW5jYCBhbmQgbWVyZ2UgYml0bWFza3MuXG4gICAgICBkYXRhWzBdID0gc291cmNlWzBdO1xuICAgICAgZGF0YVsxXSA9IG5ld0JpdG1hc2s7XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZVxuICAgICAqIFtgT2JqZWN0LmtleXNgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAgICAgKiBleGNlcHQgdGhhdCBpdCBpbmNsdWRlcyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBuYXRpdmVLZXlzSW4ob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAob2JqZWN0ICE9IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggdHJhbnNmb3JtcyB0aGUgcmVzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSByZXN0IGFycmF5IHRyYW5zZm9ybS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvdmVyUmVzdChmdW5jLCBzdGFydCwgdHJhbnNmb3JtKSB7XG4gICAgICBzdGFydCA9IG5hdGl2ZU1heChzdGFydCA9PT0gdW5kZWZpbmVkID8gKGZ1bmMubGVuZ3RoIC0gMSkgOiBzdGFydCwgMCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIHN0YXJ0LCAwKSxcbiAgICAgICAgICAgIGFycmF5ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGFycmF5W2luZGV4XSA9IGFyZ3Nbc3RhcnQgKyBpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgdmFyIG90aGVyQXJncyA9IEFycmF5KHN0YXJ0ICsgMSk7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgc3RhcnQpIHtcbiAgICAgICAgICBvdGhlckFyZ3NbaW5kZXhdID0gYXJnc1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgb3RoZXJBcmdzW3N0YXJ0XSA9IHRyYW5zZm9ybShhcnJheSk7XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwYXJlbnQgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byBnZXQgdGhlIHBhcmVudCB2YWx1ZSBvZi5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcGFyZW50IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhcmVudChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBwYXRoLmxlbmd0aCA8IDIgPyBvYmplY3QgOiBiYXNlR2V0KG9iamVjdCwgYmFzZVNsaWNlKHBhdGgsIDAsIC0xKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVvcmRlciBgYXJyYXlgIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGluZGV4ZXMgd2hlcmUgdGhlIGVsZW1lbnQgYXRcbiAgICAgKiB0aGUgZmlyc3QgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIGZpcnN0IGVsZW1lbnQsIHRoZSBlbGVtZW50IGF0XG4gICAgICogdGhlIHNlY29uZCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgc2Vjb25kIGVsZW1lbnQsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHJlb3JkZXIuXG4gICAgICogQHBhcmFtIHtBcnJheX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJyYXkgaW5kZXhlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZW9yZGVyKGFycmF5LCBpbmRleGVzKSB7XG4gICAgICB2YXIgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihpbmRleGVzLmxlbmd0aCwgYXJyTGVuZ3RoKSxcbiAgICAgICAgICBvbGRBcnJheSA9IGNvcHlBcnJheShhcnJheSk7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2xlbmd0aF07XG4gICAgICAgIGFycmF5W2xlbmd0aF0gPSBpc0luZGV4KGluZGV4LCBhcnJMZW5ndGgpID8gb2xkQXJyYXlbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJZiB0aGlzIGZ1bmN0aW9uIGJlY29tZXMgaG90LCBpLmUuIGlzIGludm9rZWQgYSBsb3QgaW4gYSBzaG9ydFxuICAgICAqIHBlcmlvZCBvZiB0aW1lLCBpdCB3aWxsIHRyaXAgaXRzIGJyZWFrZXIgYW5kIHRyYW5zaXRpb24gdG8gYW4gaWRlbnRpdHlcbiAgICAgKiBmdW5jdGlvbiB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24gcGF1c2VzIGluIFY4LiBTZWVcbiAgICAgKiBbVjggaXNzdWUgMjA3MF0oaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MjA3MClcbiAgICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIHNldERhdGEgPSBzaG9ydE91dChiYXNlU2V0RGF0YSk7XG5cbiAgICAvKipcbiAgICAgKiBBIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCB0aGUgZ2xvYmFsIFtgc2V0VGltZW91dGBdKGh0dHBzOi8vbWRuLmlvL3NldFRpbWVvdXQpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBpbnZvY2F0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ8T2JqZWN0fSBSZXR1cm5zIHRoZSB0aW1lciBpZCBvciB0aW1lb3V0IG9iamVjdC5cbiAgICAgKi9cbiAgICB2YXIgc2V0VGltZW91dCA9IGN0eFNldFRpbWVvdXQgfHwgZnVuY3Rpb24oZnVuYywgd2FpdCkge1xuICAgICAgcmV0dXJuIHJvb3Quc2V0VGltZW91dChmdW5jLCB3YWl0KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYGZ1bmNgIHRvIHJldHVybiBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgc2V0VG9TdHJpbmcgPSBzaG9ydE91dChiYXNlU2V0VG9TdHJpbmcpO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYHdyYXBwZXJgIHRvIG1pbWljIHRoZSBzb3VyY2Ugb2YgYHJlZmVyZW5jZWBcbiAgICAgKiB3aXRoIHdyYXBwZXIgZGV0YWlscyBpbiBhIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgc291cmNlIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBwZXIgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWZlcmVuY2UgVGhlIHJlZmVyZW5jZSBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgd3JhcHBlcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0V3JhcFRvU3RyaW5nKHdyYXBwZXIsIHJlZmVyZW5jZSwgYml0bWFzaykge1xuICAgICAgdmFyIHNvdXJjZSA9IChyZWZlcmVuY2UgKyAnJyk7XG4gICAgICByZXR1cm4gc2V0VG9TdHJpbmcod3JhcHBlciwgaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLCB1cGRhdGVXcmFwRGV0YWlscyhnZXRXcmFwRGV0YWlscyhzb3VyY2UpLCBiaXRtYXNrKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZFxuICAgICAqIG9mIGBmdW5jYCB3aGVuIGl0J3MgY2FsbGVkIGBIT1RfQ09VTlRgIG9yIG1vcmUgdGltZXMgaW4gYEhPVF9TUEFOYFxuICAgICAqIG1pbGxpc2Vjb25kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNob3J0T3V0KGZ1bmMpIHtcbiAgICAgIHZhciBjb3VudCA9IDAsXG4gICAgICAgICAgbGFzdENhbGxlZCA9IDA7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YW1wID0gbmF0aXZlTm93KCksXG4gICAgICAgICAgICByZW1haW5pbmcgPSBIT1RfU1BBTiAtIChzdGFtcCAtIGxhc3RDYWxsZWQpO1xuXG4gICAgICAgIGxhc3RDYWxsZWQgPSBzdGFtcDtcbiAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgICAgICBpZiAoKytjb3VudCA+PSBIT1RfQ09VTlQpIHtcbiAgICAgICAgICAgIHJldHVybiBhcmd1bWVudHNbMF07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvdW50ID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zaHVmZmxlYCB3aGljaCBtdXRhdGVzIGFuZCBzZXRzIHRoZSBzaXplIG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT1hcnJheS5sZW5ndGhdIFRoZSBzaXplIG9mIGBhcnJheWAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2h1ZmZsZVNlbGYoYXJyYXksIHNpemUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxO1xuXG4gICAgICBzaXplID0gc2l6ZSA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogc2l6ZTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgc2l6ZSkge1xuICAgICAgICB2YXIgcmFuZCA9IGJhc2VSYW5kb20oaW5kZXgsIGxhc3RJbmRleCksXG4gICAgICAgICAgICB2YWx1ZSA9IGFycmF5W3JhbmRdO1xuXG4gICAgICAgIGFycmF5W3JhbmRdID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBhcnJheVtpbmRleF0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGFycmF5Lmxlbmd0aCA9IHNpemU7XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICovXG4gICAgdmFyIHN0cmluZ1RvUGF0aCA9IG1lbW9pemVDYXBwZWQoZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoMCkgPT09IDQ2IC8qIC4gKi8pIHtcbiAgICAgICAgcmVzdWx0LnB1c2goJycpO1xuICAgICAgfVxuICAgICAgc3RyaW5nLnJlcGxhY2UocmVQcm9wTmFtZSwgZnVuY3Rpb24obWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuICAgICAgICByZXN1bHQucHVzaChxdW90ZSA/IHN1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwgJyQxJykgOiAobnVtYmVyIHx8IG1hdGNoKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge3N0cmluZ3xzeW1ib2x9IFJldHVybnMgdGhlIGtleS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNvdXJjZSBjb2RlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgICAgIGlmIChmdW5jICE9IG51bGwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgd3JhcHBlciBgZGV0YWlsc2AgYmFzZWQgb24gYGJpdG1hc2tgIGZsYWdzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkZXRhaWxzYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGVXcmFwRGV0YWlscyhkZXRhaWxzLCBiaXRtYXNrKSB7XG4gICAgICBhcnJheUVhY2god3JhcEZsYWdzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICdfLicgKyBwYWlyWzBdO1xuICAgICAgICBpZiAoKGJpdG1hc2sgJiBwYWlyWzFdKSAmJiAhYXJyYXlJbmNsdWRlcyhkZXRhaWxzLCB2YWx1ZSkpIHtcbiAgICAgICAgICBkZXRhaWxzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBkZXRhaWxzLnNvcnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHdyYXBwZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gd3JhcHBlciBUaGUgd3JhcHBlciB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgd3JhcHBlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ2xvbmUod3JhcHBlcikge1xuICAgICAgaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICByZXR1cm4gd3JhcHBlci5jbG9uZSgpO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZXIuX193cmFwcGVkX18sIHdyYXBwZXIuX19jaGFpbl9fKTtcbiAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh3cmFwcGVyLl9fYWN0aW9uc19fKTtcbiAgICAgIHJlc3VsdC5fX2luZGV4X18gID0gd3JhcHBlci5fX2luZGV4X187XG4gICAgICByZXN1bHQuX192YWx1ZXNfXyA9IHdyYXBwZXIuX192YWx1ZXNfXztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cyBzcGxpdCBpbnRvIGdyb3VwcyB0aGUgbGVuZ3RoIG9mIGBzaXplYC5cbiAgICAgKiBJZiBgYXJyYXlgIGNhbid0IGJlIHNwbGl0IGV2ZW5seSwgdGhlIGZpbmFsIGNodW5rIHdpbGwgYmUgdGhlIHJlbWFpbmluZ1xuICAgICAqIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTFdIFRoZSBsZW5ndGggb2YgZWFjaCBjaHVua1xuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY2h1bmtzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNodW5rKFsnYScsICdiJywgJ2MnLCAnZCddLCAyKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InXSwgWydjJywgJ2QnXV1cbiAgICAgKlxuICAgICAqIF8uY2h1bmsoWydhJywgJ2InLCAnYycsICdkJ10sIDMpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYicsICdjJ10sIFsnZCddXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNodW5rKGFycmF5LCBzaXplLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGFycmF5LCBzaXplLCBndWFyZCkgOiBzaXplID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHNpemUgPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2l6ZSA9IG5hdGl2ZU1heCh0b0ludGVnZXIoc2l6ZSksIDApO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGggfHwgc2l6ZSA8IDEpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobmF0aXZlQ2VpbChsZW5ndGggLyBzaXplKSk7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBiYXNlU2xpY2UoYXJyYXksIGluZGV4LCAoaW5kZXggKz0gc2l6ZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IHdpdGggYWxsIGZhbHNleSB2YWx1ZXMgcmVtb3ZlZC4gVGhlIHZhbHVlcyBgZmFsc2VgLCBgbnVsbGAsXG4gICAgICogYDBgLCBgXCJcImAsIGB1bmRlZmluZWRgLCBhbmQgYE5hTmAgYXJlIGZhbHNleS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jb21wYWN0KFswLCAxLCBmYWxzZSwgMiwgJycsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYWN0KGFycmF5KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBhcnJheSBjb25jYXRlbmF0aW5nIGBhcnJheWAgd2l0aCBhbnkgYWRkaXRpb25hbCBhcnJheXNcbiAgICAgKiBhbmQvb3IgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbmNhdGVuYXRlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjb25jYXRlbmF0ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBjb25jYXRlbmF0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxXTtcbiAgICAgKiB2YXIgb3RoZXIgPSBfLmNvbmNhdChhcnJheSwgMiwgWzNdLCBbWzRdXSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvdGhlcik7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIFs0XV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25jYXQoKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBhcmdzID0gQXJyYXkobGVuZ3RoIC0gMSksXG4gICAgICAgICAgYXJyYXkgPSBhcmd1bWVudHNbMF0sXG4gICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIGFyZ3NbaW5kZXggLSAxXSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXlQdXNoKGlzQXJyYXkoYXJyYXkpID8gY29weUFycmF5KGFycmF5KSA6IFthcnJheV0sIGJhc2VGbGF0dGVuKGFyZ3MsIDEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGBhcnJheWAgdmFsdWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgb3RoZXIgZ2l2ZW4gYXJyYXlzXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQHNlZSBfLndpdGhvdXQsIF8ueG9yXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGlmZmVyZW5jZShbMiwgMV0sIFsyLCAzXSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2UgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kaWZmZXJlbmNlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCBhbmQgYHZhbHVlc2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsQnlgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGlmZmVyZW5jZUJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRpZmZlcmVuY2VCeShbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sIFt7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZUJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdCh2YWx1ZXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGlmZmVyZW5jZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5YCB0byBgdmFsdWVzYC4gVGhlIG9yZGVyIGFuZFxuICAgICAqIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBjb21wYXJhdG9yXG4gICAgICogaXMgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxXaXRoYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKlxuICAgICAqIF8uZGlmZmVyZW5jZVdpdGgob2JqZWN0cywgW3sgJ3gnOiAxLCAneSc6IDIgfV0sIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZVdpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QodmFsdWVzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChjb21wYXJhdG9yKSkge1xuICAgICAgICBjb21wYXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gZHJvcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wKGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIG4gPCAwID8gMCA6IG4sIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBlbmQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gZHJvcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3BSaWdodChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICBuID0gbGVuZ3RoIC0gbjtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIDAsIG4gPCAwID8gMCA6IG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGV4Y2x1ZGluZyBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGVuZC5cbiAgICAgKiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wUmlnaHRXaGlsZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlV2hpbGUoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIHRydWUsIHRydWUpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqIEVsZW1lbnRzIGFyZSBkcm9wcGVkIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3BXaGlsZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlV2hpbGUoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIHRydWUpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsbHMgZWxlbWVudHMgb2YgYGFycmF5YCB3aXRoIGB2YWx1ZWAgZnJvbSBgc3RhcnRgIHVwIHRvLCBidXQgbm90XG4gICAgICogaW5jbHVkaW5nLCBgZW5kYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsbC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGBhcnJheWAgd2l0aC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKlxuICAgICAqIF8uZmlsbChhcnJheSwgJ2EnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydhJywgJ2EnLCAnYSddXG4gICAgICpcbiAgICAgKiBfLmZpbGwoQXJyYXkoMyksIDIpO1xuICAgICAqIC8vID0+IFsyLCAyLCAyXVxuICAgICAqXG4gICAgICogXy5maWxsKFs0LCA2LCA4LCAxMF0sICcqJywgMSwgMyk7XG4gICAgICogLy8gPT4gWzQsICcqJywgJyonLCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0ICYmIHR5cGVvZiBzdGFydCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgdmFsdWUsIHN0YXJ0KSkge1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0XG4gICAgICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ2Jhcm5leSc7IH0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnZnJlZCcsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRJbmRleGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50c1xuICAgICAqIG9mIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9YXJyYXkubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlciA9PSAncGViYmxlcyc7IH0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZExhc3RJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgICBpZiAoZnJvbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5kZXggPSB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgICAgaW5kZXggPSBmcm9tSW5kZXggPCAwXG4gICAgICAgICAgPyBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApXG4gICAgICAgICAgOiBuYXRpdmVNaW4oaW5kZXgsIGxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGluZGV4LCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbihbMSwgWzIsIFszLCBbNF1dLCA1XV0pO1xuICAgICAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIDEpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZmxhdHRlbnMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuRGVlcChbMSwgWzIsIFszLCBbNF1dLCA1XV0pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCA0LCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW5EZWVwKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIElORklOSVRZKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYGFycmF5YCB1cCB0byBgZGVwdGhgIHRpbWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aD0xXSBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgWzIsIFszLCBbNF1dLCA1XV07XG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZXB0aChhcnJheSwgMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuRGVwdGgoYXJyYXksIDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCBbNF0sIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbkRlcHRoKGFycmF5LCBkZXB0aCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgZGVwdGggPSBkZXB0aCA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aCk7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW52ZXJzZSBvZiBgXy50b1BhaXJzYDsgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBvYmplY3QgY29tcG9zZWRcbiAgICAgKiBmcm9tIGtleS12YWx1ZSBgcGFpcnNgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFpcnMgVGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZyb21QYWlycyhbWydhJywgMV0sIFsnYicsIDJdXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVBhaXJzKHBhaXJzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYWlycyA9PSBudWxsID8gMCA6IHBhaXJzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpbmRleF07XG4gICAgICAgIHJlc3VsdFtwYWlyWzBdXSA9IHBhaXJbMV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyBmaXJzdFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmhlYWQoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiBfLmhlYWQoW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhlYWQoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGFycmF5WzBdIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGB2YWx1ZWAgaXMgZm91bmQgaW4gYGFycmF5YFxuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzIHRoZVxuICAgICAqIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDEsIDJdLCAyLCAyKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIGluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbml0aWFsKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdGlhbChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VTbGljZShhcnJheSwgMCwgLTEpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIGFsbCBnaXZlbiBhcnJheXNcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnRlcnNlY3Rpb24oWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsyXVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb24gPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnRlcnNlY3Rpb25CeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5pbnRlcnNlY3Rpb25CeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKSxcbiAgICAgICAgICBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuXG4gICAgICBpZiAoaXRlcmF0ZWUgPT09IGxhc3QobWFwcGVkKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hcHBlZC5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAobWFwcGVkLmxlbmd0aCAmJiBtYXBwZWRbMF0gPT09IGFycmF5c1swXSlcbiAgICAgICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXNcbiAgICAgKiBvZiByZXN1bHQgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGNvbXBhcmF0b3IgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSwgJ3knOiAyIH1dXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbldpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdChhcnJheXMpLFxuICAgICAgICAgIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG5cbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIG1hcHBlZC5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAobWFwcGVkLmxlbmd0aCAmJiBtYXBwZWRbMF0gPT09IGFycmF5c1swXSlcbiAgICAgICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYWxsIGVsZW1lbnRzIGluIGBhcnJheWAgaW50byBhIHN0cmluZyBzZXBhcmF0ZWQgYnkgYHNlcGFyYXRvcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29udmVydC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlcGFyYXRvcj0nLCddIFRoZSBlbGVtZW50IHNlcGFyYXRvci5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBqb2luZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmpvaW4oWydhJywgJ2InLCAnYyddLCAnficpO1xuICAgICAqIC8vID0+ICdhfmJ+YydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBqb2luKGFycmF5LCBzZXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiBhcnJheSA9PSBudWxsID8gJycgOiBuYXRpdmVKb2luLmNhbGwoYXJyYXksIHNlcGFyYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxhc3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGFzdChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBhcnJheWAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDEsIDJdLCAyKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiAvLyBTZWFyY2ggZnJvbSB0aGUgYGZyb21JbmRleGAuXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoO1xuICAgICAgaWYgKGZyb21JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluZGV4ID0gdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICAgIGluZGV4ID0gaW5kZXggPCAwID8gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKSA6IG5hdGl2ZU1pbihpbmRleCwgbGVuZ3RoIC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlXG4gICAgICAgID8gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBpbmRleClcbiAgICAgICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGluZGV4LCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBlbGVtZW50IGF0IGluZGV4IGBuYCBvZiBgYXJyYXlgLiBJZiBgbmAgaXMgbmVnYXRpdmUsIHRoZSBudGhcbiAgICAgKiBlbGVtZW50IGZyb20gdGhlIGVuZCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjExLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTBdIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG50aCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICAgICAqXG4gICAgICogXy5udGgoYXJyYXksIDEpO1xuICAgICAqIC8vID0+ICdiJ1xuICAgICAqXG4gICAgICogXy5udGgoYXJyYXksIC0yKTtcbiAgICAgKiAvLyA9PiAnYyc7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbnRoKGFycmF5LCBuKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlTnRoKGFycmF5LCB0b0ludGVnZXIobikpIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGdpdmVuIHZhbHVlcyBmcm9tIGBhcnJheWAgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ud2l0aG91dGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC4gVXNlIGBfLnJlbW92ZWBcbiAgICAgKiB0byByZW1vdmUgZWxlbWVudHMgZnJvbSBhbiBhcnJheSBieSBwcmVkaWNhdGUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnYScsICdiJywgJ2MnXTtcbiAgICAgKlxuICAgICAqIF8ucHVsbChhcnJheSwgJ2EnLCAnYycpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2InLCAnYiddXG4gICAgICovXG4gICAgdmFyIHB1bGwgPSBiYXNlUmVzdChwdWxsQWxsKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhbiBhcnJheSBvZiB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnYScsICdiJywgJ2MnXTtcbiAgICAgKlxuICAgICAqIF8ucHVsbEFsbChhcnJheSwgWydhJywgJ2MnXSk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYicsICdiJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdWxsQWxsKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMpXG4gICAgICAgIDogYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsQWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCBhbmQgYHZhbHVlc2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlQnlgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9LCB7ICd4JzogMyB9LCB7ICd4JzogMSB9XTtcbiAgICAgKlxuICAgICAqIF8ucHVsbEFsbEJ5KGFycmF5LCBbeyAneCc6IDEgfSwgeyAneCc6IDMgfV0sICd4Jyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGxCeShhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbEFsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5YCB0byBgdmFsdWVzYC4gVGhlIGNvbXBhcmF0b3IgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZVdpdGhgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDMsICd5JzogNCB9LCB7ICd4JzogNSwgJ3knOiA2IH1dO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsV2l0aChhcnJheSwgW3sgJ3gnOiAzLCAneSc6IDQgfV0sIF8uaXNFcXVhbCk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiA1LCAneSc6IDYgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdWxsQWxsV2l0aChhcnJheSwgdmFsdWVzLCBjb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBlbGVtZW50cyBmcm9tIGBhcnJheWAgY29ycmVzcG9uZGluZyB0byBgaW5kZXhlc2AgYW5kIHJldHVybnMgYW5cbiAgICAgKiBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5hdGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gW2luZGV4ZXNdIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2QnXTtcbiAgICAgKiB2YXIgcHVsbGVkID0gXy5wdWxsQXQoYXJyYXksIFsxLCAzXSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydhJywgJ2MnXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocHVsbGVkKTtcbiAgICAgKiAvLyA9PiBbJ2InLCAnZCddXG4gICAgICovXG4gICAgdmFyIHB1bGxBdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKGFycmF5LCBpbmRleGVzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gYmFzZUF0KGFycmF5LCBpbmRleGVzKTtcblxuICAgICAgYmFzZVB1bGxBdChhcnJheSwgYXJyYXlNYXAoaW5kZXhlcywgZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGlzSW5kZXgoaW5kZXgsIGxlbmd0aCkgPyAraW5kZXggOiBpbmRleDtcbiAgICAgIH0pLnNvcnQoY29tcGFyZUFzY2VuZGluZykpO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSBgYXJyYXlgIHRoYXQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yXG4gICAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHJlbW92ZWQgZWxlbWVudHMuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmZpbHRlcmAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC4gVXNlIGBfLnB1bGxgXG4gICAgICogdG8gcHVsbCBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGJ5IHZhbHVlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDMsIDRdO1xuICAgICAqIHZhciBldmVucyA9IF8ucmVtb3ZlKGFycmF5LCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgM11cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGV2ZW5zKTtcbiAgICAgKiAvLyA9PiBbMiwgNF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZW1vdmUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5kZXhlcyA9IFtdLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgcHJlZGljYXRlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICBpbmRleGVzLnB1c2goaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBiYXNlUHVsbEF0KGFycmF5LCBpbmRleGVzKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZXMgYGFycmF5YCBzbyB0aGF0IHRoZSBmaXJzdCBlbGVtZW50IGJlY29tZXMgdGhlIGxhc3QsIHRoZSBzZWNvbmRcbiAgICAgKiBlbGVtZW50IGJlY29tZXMgdGhlIHNlY29uZCB0byBsYXN0LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgIGFuZCBpcyBiYXNlZCBvblxuICAgICAqIFtgQXJyYXkjcmV2ZXJzZWBdKGh0dHBzOi8vbWRuLmlvL0FycmF5L3JldmVyc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXy5yZXZlcnNlKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXZlcnNlKGFycmF5KSB7XG4gICAgICByZXR1cm4gYXJyYXkgPT0gbnVsbCA/IGFycmF5IDogbmF0aXZlUmV2ZXJzZS5jYWxsKGFycmF5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBmcm9tIGBzdGFydGAgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluc3RlYWQgb2ZcbiAgICAgKiBbYEFycmF5I3NsaWNlYF0oaHR0cHM6Ly9tZG4uaW8vQXJyYXkvc2xpY2UpIHRvIGVuc3VyZSBkZW5zZSBhcnJheXMgYXJlXG4gICAgICogcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2xpY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKGVuZCAmJiB0eXBlb2YgZW5kICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCBzdGFydCwgZW5kKSkge1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdGFydCA9IHN0YXJ0ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKHN0YXJ0KTtcbiAgICAgICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZXMgYSBiaW5hcnkgc2VhcmNoIHRvIGRldGVybWluZSB0aGUgbG93ZXN0IGluZGV4IGF0IHdoaWNoIGB2YWx1ZWBcbiAgICAgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleChbMzAsIDUwXSwgNDApO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyXG4gICAgICogc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogNCB9LCB7ICd4JzogNSB9XTtcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCBmdW5jdGlvbihvKSB7IHJldHVybiBvLng7IH0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29ydGVkSW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCAneCcpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbmRleE9mYCBleGNlcHQgdGhhdCBpdCBwZXJmb3JtcyBhIGJpbmFyeVxuICAgICAqIHNlYXJjaCBvbiBhIHNvcnRlZCBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4T2YoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSk7XG4gICAgICAgIGlmIChpbmRleCA8IGxlbmd0aCAmJiBlcShhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGhpZ2hlc3RcbiAgICAgKiBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG9cbiAgICAgKiBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4KFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gNFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleChhcnJheSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZExhc3RJbmRleGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZSB0aGVpclxuICAgICAqIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDQgfSwgeyAneCc6IDUgfV07XG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCAneCcpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubGFzdEluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IHBlcmZvcm1zIGEgYmluYXJ5XG4gICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4T2YoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHRydWUpIC0gMTtcbiAgICAgICAgaWYgKGVxKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCdzIGRlc2lnbmVkIGFuZCBvcHRpbWl6ZWRcbiAgICAgKiBmb3Igc29ydGVkIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZFVuaXEoWzEsIDEsIDJdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRVbmlxKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU29ydGVkVW5pcShhcnJheSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFCeWAgZXhjZXB0IHRoYXQgaXQncyBkZXNpZ25lZCBhbmQgb3B0aW1pemVkXG4gICAgICogZm9yIHNvcnRlZCBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZFVuaXFCeShbMS4xLCAxLjIsIDIuMywgMi40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMSwgMi4zXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZFVuaXFCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTb3J0ZWRVbmlxKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgYnV0IHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRhaWwoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWlsKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZVNsaWNlKGFycmF5LCAxLCBsZW5ndGgpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZShhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIDAsIG4gPCAwID8gMCA6IG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGVuZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byB0YWtlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVJpZ2h0KGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIG4gPSBsZW5ndGggLSBuO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgbiA8IDAgPyAwIDogbiwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGVuZC4gRWxlbWVudHMgYXJlXG4gICAgICogdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoXG4gICAgICogdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlUmlnaHRXaGlsZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlV2hpbGUoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGZhbHNlLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgYmVnaW5uaW5nLiBFbGVtZW50c1xuICAgICAqIGFyZSB0YWtlbiB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VXaGlsZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlV2hpbGUoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzLCBpbiBvcmRlciwgZnJvbSBhbGwgZ2l2ZW4gYXJyYXlzIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaW9uKFsyXSwgWzEsIDJdKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICB2YXIgdW5pb24gPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5XG4gICAgICogd2hpY2ggdW5pcXVlbmVzcyBpcyBjb21wdXRlZC4gUmVzdWx0IHZhbHVlcyBhcmUgY2hvc2VuIGZyb20gdGhlIGZpcnN0XG4gICAgICogYXJyYXkgaW4gd2hpY2ggdGhlIHZhbHVlIG9jY3Vycy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaW9uQnkoWzIuMV0sIFsxLjIsIDIuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsyLjEsIDEuMl1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udW5pb25CeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEgfSwgeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgdW5pb25CeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBSZXN1bHQgdmFsdWVzIGFyZSBjaG9zZW4gZnJvbVxuICAgICAqIHRoZSBmaXJzdCBhcnJheSBpbiB3aGljaCB0aGUgdmFsdWUgb2NjdXJzLiBUaGUgY29tcGFyYXRvciBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy51bmlvbldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciB1bmlvbldpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdChhcnJheXMpO1xuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGR1cGxpY2F0ZS1mcmVlIHZlcnNpb24gb2YgYW4gYXJyYXksIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGluIHdoaWNoIG9ubHkgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaCBlbGVtZW50XG4gICAgICogaXMga2VwdC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1clxuICAgICAqIGluIHRoZSBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXEoWzIsIDEsIDJdKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlxKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB1bmlxdWVuZXNzIGlzIGNvbXB1dGVkLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZVxuICAgICAqIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXFCeShbMi4xLCAxLjIsIDIuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsyLjEsIDEuMl1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udW5pcUJ5KFt7ICd4JzogMSB9LCB7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEgfSwgeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlxQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5YC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXNcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheS5UaGUgY29tcGFyYXRvciBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy51bmlxV2l0aChvYmplY3RzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlxV2l0aChhcnJheSwgY29tcGFyYXRvcikge1xuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXksIHVuZGVmaW5lZCwgY29tcGFyYXRvcikgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhbiBhcnJheSBvZiBncm91cGVkXG4gICAgICogZWxlbWVudHMgYW5kIGNyZWF0ZXMgYW4gYXJyYXkgcmVncm91cGluZyB0aGUgZWxlbWVudHMgdG8gdGhlaXIgcHJlLXppcFxuICAgICAqIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cyB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsnYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gW1snYScsIDEsIHRydWVdLCBbJ2InLCAyLCBmYWxzZV1dXG4gICAgICpcbiAgICAgKiBfLnVuemlwKHppcHBlZCk7XG4gICAgICogLy8gPT4gW1snYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnppcChhcnJheSkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gMDtcbiAgICAgIGFycmF5ID0gYXJyYXlGaWx0ZXIoYXJyYXksIGZ1bmN0aW9uKGdyb3VwKSB7XG4gICAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChncm91cCkpIHtcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoZ3JvdXAubGVuZ3RoLCBsZW5ndGgpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBiYXNlVGltZXMobGVuZ3RoLCBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICByZXR1cm4gYXJyYXlNYXAoYXJyYXksIGJhc2VQcm9wZXJ0eShpbmRleCkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHRvIHNwZWNpZnlcbiAgICAgKiBob3cgcmVncm91cGVkIHZhbHVlcyBzaG91bGQgYmUgY29tYmluZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhlXG4gICAgICogZWxlbWVudHMgb2YgZWFjaCBncm91cDogKC4uLmdyb3VwKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjguMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lXG4gICAgICogIHJlZ3JvdXBlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgemlwcGVkID0gXy56aXAoWzEsIDJdLCBbMTAsIDIwXSwgWzEwMCwgMjAwXSk7XG4gICAgICogLy8gPT4gW1sxLCAxMCwgMTAwXSwgWzIsIDIwLCAyMDBdXVxuICAgICAqXG4gICAgICogXy51bnppcFdpdGgoemlwcGVkLCBfLmFkZCk7XG4gICAgICogLy8gPT4gWzMsIDMwLCAzMDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW56aXBXaXRoKGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gdW56aXAoYXJyYXkpO1xuICAgICAgaWYgKGl0ZXJhdGVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheU1hcChyZXN1bHQsIGZ1bmN0aW9uKGdyb3VwKSB7XG4gICAgICAgIHJldHVybiBhcHBseShpdGVyYXRlZSwgdW5kZWZpbmVkLCBncm91cCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGV4Y2x1ZGluZyBhbGwgZ2l2ZW4gdmFsdWVzIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlLCBfLnhvclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLndpdGhvdXQoWzIsIDEsIDIsIDNdLCAxLCAyKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKi9cbiAgICB2YXIgd2l0aG91dCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgdmFsdWVzKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzIHRoYXQgaXMgdGhlXG4gICAgICogW3N5bW1ldHJpYyBkaWZmZXJlbmNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TeW1tZXRyaWNfZGlmZmVyZW5jZSlcbiAgICAgKiBvZiB0aGUgZ2l2ZW4gYXJyYXlzLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlclxuICAgICAqIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQHNlZSBfLmRpZmZlcmVuY2UsIF8ud2l0aG91dFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnhvcihbMiwgMV0sIFsyLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDNdXG4gICAgICovXG4gICAgdmFyIHhvciA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgcmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLCBpc0FycmF5TGlrZU9iamVjdCkpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy54b3JgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnlcbiAgICAgKiB3aGljaCBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkXG4gICAgICogYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmVcbiAgICAgKiBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnhvckJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsxLjIsIDMuNF1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ueG9yQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIHhvckJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLCBpc0FycmF5TGlrZU9iamVjdCksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnhvcmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLiBUaGUgY29tcGFyYXRvciBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy54b3JXaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIHhvcldpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdChhcnJheXMpO1xuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLCBpc0FycmF5TGlrZU9iamVjdCksIHVuZGVmaW5lZCwgY29tcGFyYXRvcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMsIHRoZSBmaXJzdCBvZiB3aGljaCBjb250YWlucyB0aGVcbiAgICAgKiBmaXJzdCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gYXJyYXlzLCB0aGUgc2Vjb25kIG9mIHdoaWNoIGNvbnRhaW5zIHRoZVxuICAgICAqIHNlY29uZCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gYXJyYXlzLCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy56aXAoWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMSwgdHJ1ZV0sIFsnYicsIDIsIGZhbHNlXV1cbiAgICAgKi9cbiAgICB2YXIgemlwID0gYmFzZVJlc3QodW56aXApO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mcm9tUGFpcnNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgdHdvIGFycmF5cyxcbiAgICAgKiBvbmUgb2YgcHJvcGVydHkgaWRlbnRpZmllcnMgYW5kIG9uZSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjQuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wcz1bXV0gVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy56aXBPYmplY3QoWydhJywgJ2InXSwgWzEsIDJdKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB6aXBPYmplY3QocHJvcHMsIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYXNzaWduVmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwT2JqZWN0YCBleGNlcHQgdGhhdCBpdCBzdXBwb3J0cyBwcm9wZXJ0eSBwYXRocy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wcz1bXV0gVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy56aXBPYmplY3REZWVwKFsnYS5iWzBdLmMnLCAnYS5iWzFdLmQnXSwgWzEsIDJdKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnYic6IFt7ICdjJzogMSB9LCB7ICdkJzogMiB9XSB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB6aXBPYmplY3REZWVwKHByb3BzLCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIGJhc2VTZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgdG8gc3BlY2lmeVxuICAgICAqIGhvdyBncm91cGVkIHZhbHVlcyBzaG91bGQgYmUgY29tYmluZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhlXG4gICAgICogZWxlbWVudHMgb2YgZWFjaCBncm91cDogKC4uLmdyb3VwKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjguMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmVcbiAgICAgKiAgZ3JvdXBlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy56aXBXaXRoKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0sIGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBhICsgYiArIGM7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gWzExMSwgMjIyXVxuICAgICAqL1xuICAgIHZhciB6aXBXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXlzLmxlbmd0aCxcbiAgICAgICAgICBpdGVyYXRlZSA9IGxlbmd0aCA+IDEgPyBhcnJheXNbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGl0ZXJhdGVlID0gdHlwZW9mIGl0ZXJhdGVlID09ICdmdW5jdGlvbicgPyAoYXJyYXlzLnBvcCgpLCBpdGVyYXRlZSkgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gdW56aXBXaXRoKGFycmF5cywgaXRlcmF0ZWUpO1xuICAgIH0pO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UgdGhhdCB3cmFwcyBgdmFsdWVgIHdpdGggZXhwbGljaXQgbWV0aG9kXG4gICAgICogY2hhaW4gc2VxdWVuY2VzIGVuYWJsZWQuIFRoZSByZXN1bHQgb2Ygc3VjaCBzZXF1ZW5jZXMgbXVzdCBiZSB1bndyYXBwZWRcbiAgICAgKiB3aXRoIGBfI3ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjMuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiB2YXIgeW91bmdlc3QgPSBfXG4gICAgICogICAuY2hhaW4odXNlcnMpXG4gICAgICogICAuc29ydEJ5KCdhZ2UnKVxuICAgICAqICAgLm1hcChmdW5jdGlvbihvKSB7XG4gICAgICogICAgIHJldHVybiBvLnVzZXIgKyAnIGlzICcgKyBvLmFnZTtcbiAgICAgKiAgIH0pXG4gICAgICogICAuaGVhZCgpXG4gICAgICogICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiAncGViYmxlcyBpcyAxJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNoYWluKHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbG9kYXNoKHZhbHVlKTtcbiAgICAgIHJlc3VsdC5fX2NoYWluX18gPSB0cnVlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpbnZva2VzIGBpbnRlcmNlcHRvcmAgYW5kIHJldHVybnMgYHZhbHVlYC4gVGhlIGludGVyY2VwdG9yXG4gICAgICogaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG9cbiAgICAgKiBcInRhcCBpbnRvXCIgYSBtZXRob2QgY2hhaW4gc2VxdWVuY2UgaW4gb3JkZXIgdG8gbW9kaWZ5IGludGVybWVkaWF0ZSByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gYGludGVyY2VwdG9yYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKVxuICAgICAqICAudGFwKGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgICogICAgLy8gTXV0YXRlIGlucHV0IGFycmF5LlxuICAgICAqICAgIGFycmF5LnBvcCgpO1xuICAgICAqICB9KVxuICAgICAqICAucmV2ZXJzZSgpXG4gICAgICogIC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRhcCh2YWx1ZSwgaW50ZXJjZXB0b3IpIHtcbiAgICAgIGludGVyY2VwdG9yKHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnRhcGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGBpbnRlcmNlcHRvcmAuXG4gICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gXCJwYXNzIHRocnVcIiB2YWx1ZXMgcmVwbGFjaW5nIGludGVybWVkaWF0ZVxuICAgICAqIHJlc3VsdHMgaW4gYSBtZXRob2QgY2hhaW4gc2VxdWVuY2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKCcgIGFiYyAgJylcbiAgICAgKiAgLmNoYWluKClcbiAgICAgKiAgLnRyaW0oKVxuICAgICAqICAudGhydShmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgIHJldHVybiBbdmFsdWVdO1xuICAgICAqICB9KVxuICAgICAqICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbJ2FiYyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGhydSh2YWx1ZSwgaW50ZXJjZXB0b3IpIHtcbiAgICAgIHJldHVybiBpbnRlcmNlcHRvcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdGhlIHdyYXBwZXIgdmVyc2lvbiBvZiBgXy5hdGAuXG4gICAgICpcbiAgICAgKiBAbmFtZSBhdFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH0sIDRdIH07XG4gICAgICpcbiAgICAgKiBfKG9iamVjdCkuYXQoWydhWzBdLmIuYycsICdhWzFdJ10pLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzMsIDRdXG4gICAgICovXG4gICAgdmFyIHdyYXBwZXJBdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKHBhdGhzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgICAgIHN0YXJ0ID0gbGVuZ3RoID8gcGF0aHNbMF0gOiAwLFxuICAgICAgICAgIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXyxcbiAgICAgICAgICBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKG9iamVjdCkgeyByZXR1cm4gYmFzZUF0KG9iamVjdCwgcGF0aHMpOyB9O1xuXG4gICAgICBpZiAobGVuZ3RoID4gMSB8fCB0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCB8fFxuICAgICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikgfHwgIWlzSW5kZXgoc3RhcnQpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRocnUoaW50ZXJjZXB0b3IpO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydCwgK3N0YXJ0ICsgKGxlbmd0aCA/IDEgOiAwKSk7XG4gICAgICB2YWx1ZS5fX2FjdGlvbnNfXy5wdXNoKHtcbiAgICAgICAgJ2Z1bmMnOiB0aHJ1LFxuICAgICAgICAnYXJncyc6IFtpbnRlcmNlcHRvcl0sXG4gICAgICAgICd0aGlzQXJnJzogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSwgdGhpcy5fX2NoYWluX18pLnRocnUoZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgICAgaWYgKGxlbmd0aCAmJiAhYXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgYXJyYXkucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2Ugd2l0aCBleHBsaWNpdCBtZXRob2QgY2hhaW4gc2VxdWVuY2VzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAbmFtZSBjaGFpblxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBBIHNlcXVlbmNlIHdpdGhvdXQgZXhwbGljaXQgY2hhaW5pbmcuXG4gICAgICogXyh1c2VycykuaGVhZCgpO1xuICAgICAqIC8vID0+IHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKlxuICAgICAqIC8vIEEgc2VxdWVuY2Ugd2l0aCBleHBsaWNpdCBjaGFpbmluZy5cbiAgICAgKiBfKHVzZXJzKVxuICAgICAqICAgLmNoYWluKClcbiAgICAgKiAgIC5oZWFkKClcbiAgICAgKiAgIC5waWNrKCd1c2VyJylcbiAgICAgKiAgIC52YWx1ZSgpO1xuICAgICAqIC8vID0+IHsgJ3VzZXInOiAnYmFybmV5JyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNoYWluKCkge1xuICAgICAgcmV0dXJuIGNoYWluKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBjaGFpbiBzZXF1ZW5jZSBhbmQgcmV0dXJucyB0aGUgd3JhcHBlZCByZXN1bHQuXG4gICAgICpcbiAgICAgKiBAbmFtZSBjb21taXRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDJdO1xuICAgICAqIHZhciB3cmFwcGVkID0gXyhhcnJheSkucHVzaCgzKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQgPSB3cmFwcGVkLmNvbW1pdCgpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubGFzdCgpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ29tbWl0KCkge1xuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHRoaXMudmFsdWUoKSwgdGhpcy5fX2NoYWluX18pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5leHQgdmFsdWUgb24gYSB3cmFwcGVkIG9iamVjdCBmb2xsb3dpbmcgdGhlXG4gICAgICogW2l0ZXJhdG9yIHByb3RvY29sXShodHRwczovL21kbi5pby9pdGVyYXRpb25fcHJvdG9jb2xzI2l0ZXJhdG9yKS5cbiAgICAgKlxuICAgICAqIEBuYW1lIG5leHRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXh0IGl0ZXJhdG9yIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKTtcbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiBmYWxzZSwgJ3ZhbHVlJzogMSB9XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogZmFsc2UsICd2YWx1ZSc6IDIgfVxuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IHRydWUsICd2YWx1ZSc6IHVuZGVmaW5lZCB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlck5leHQoKSB7XG4gICAgICBpZiAodGhpcy5fX3ZhbHVlc19fID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fX3ZhbHVlc19fID0gdG9BcnJheSh0aGlzLnZhbHVlKCkpO1xuICAgICAgfVxuICAgICAgdmFyIGRvbmUgPSB0aGlzLl9faW5kZXhfXyA+PSB0aGlzLl9fdmFsdWVzX18ubGVuZ3RoLFxuICAgICAgICAgIHZhbHVlID0gZG9uZSA/IHVuZGVmaW5lZCA6IHRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXTtcblxuICAgICAgcmV0dXJuIHsgJ2RvbmUnOiBkb25lLCAndmFsdWUnOiB2YWx1ZSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIHdyYXBwZXIgdG8gYmUgaXRlcmFibGUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBTeW1ib2wuaXRlcmF0b3JcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSB3cmFwcGVyIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSk7XG4gICAgICpcbiAgICAgKiB3cmFwcGVkW1N5bWJvbC5pdGVyYXRvcl0oKSA9PT0gd3JhcHBlZDtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBBcnJheS5mcm9tKHdyYXBwZWQpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJUb0l0ZXJhdG9yKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBjaGFpbiBzZXF1ZW5jZSBwbGFudGluZyBgdmFsdWVgIGFzIHRoZSB3cmFwcGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogQG5hbWUgcGxhbnRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwbGFudC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKS5tYXAoc3F1YXJlKTtcbiAgICAgKiB2YXIgb3RoZXIgPSB3cmFwcGVkLnBsYW50KFszLCA0XSk7XG4gICAgICpcbiAgICAgKiBvdGhlci52YWx1ZSgpO1xuICAgICAqIC8vID0+IFs5LCAxNl1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMSwgNF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyUGxhbnQodmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQsXG4gICAgICAgICAgcGFyZW50ID0gdGhpcztcblxuICAgICAgd2hpbGUgKHBhcmVudCBpbnN0YW5jZW9mIGJhc2VMb2Rhc2gpIHtcbiAgICAgICAgdmFyIGNsb25lID0gd3JhcHBlckNsb25lKHBhcmVudCk7XG4gICAgICAgIGNsb25lLl9faW5kZXhfXyA9IDA7XG4gICAgICAgIGNsb25lLl9fdmFsdWVzX18gPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBwcmV2aW91cy5fX3dyYXBwZWRfXyA9IGNsb25lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IGNsb25lO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcmV2aW91cyA9IGNsb25lO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQuX193cmFwcGVkX187XG4gICAgICB9XG4gICAgICBwcmV2aW91cy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgd3JhcHBlciB2ZXJzaW9uIG9mIGBfLnJldmVyc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgdGhlIHdyYXBwZWQgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAbmFtZSByZXZlcnNlXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKlxuICAgICAqIF8oYXJyYXkpLnJldmVyc2UoKS52YWx1ZSgpXG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclJldmVyc2UoKSB7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fO1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHtcbiAgICAgICAgdmFyIHdyYXBwZWQgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKSB7XG4gICAgICAgICAgd3JhcHBlZCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB3cmFwcGVkID0gd3JhcHBlZC5yZXZlcnNlKCk7XG4gICAgICAgIHdyYXBwZWQuX19hY3Rpb25zX18ucHVzaCh7XG4gICAgICAgICAgJ2Z1bmMnOiB0aHJ1LFxuICAgICAgICAgICdhcmdzJzogW3JldmVyc2VdLFxuICAgICAgICAgICd0aGlzQXJnJzogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlZCwgdGhpcy5fX2NoYWluX18pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudGhydShyZXZlcnNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY2hhaW4gc2VxdWVuY2UgdG8gcmVzb2x2ZSB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogQG5hbWUgdmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyB0b0pTT04sIHZhbHVlT2ZcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXyhbMSwgMiwgM10pLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclZhbHVlKCkge1xuICAgICAgcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUodGhpcy5fX3dyYXBwZWRfXywgdGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mXG4gICAgICogZWFjaCBrZXkgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUga2V5IHdhcyByZXR1cm5lZCBieSBgaXRlcmF0ZWVgLiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNvdW50QnkoWzYuMSwgNC4yLCA2LjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogMSwgJzYnOiAyIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uY291bnRCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAqIC8vID0+IHsgJzMnOiAyLCAnNSc6IDEgfVxuICAgICAqL1xuICAgIHZhciBjb3VudEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSkge1xuICAgICAgICArK3Jlc3VsdFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbGwqKiBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAuXG4gICAgICogSXRlcmF0aW9uIGlzIHN0b3BwZWQgb25jZSBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYCBmb3JcbiAgICAgKiBbZW1wdHkgY29sbGVjdGlvbnNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VtcHR5X3NldCkgYmVjYXVzZVxuICAgICAqIFtldmVyeXRoaW5nIGlzIHRydWVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhY3VvdXNfdHJ1dGgpIG9mXG4gICAgICogZWxlbWVudHMgb2YgZW1wdHkgY29sbGVjdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmV2ZXJ5KFt0cnVlLCAxLCBudWxsLCAneWVzJ10sIEJvb2xlYW4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmV2ZXJ5KHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmV2ZXJ5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBldmVyeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUV2ZXJ5IDogYmFzZUV2ZXJ5O1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpKSB7XG4gICAgICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzXG4gICAgICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5yZW1vdmVgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqIEBzZWUgXy5yZWplY3RcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAncGViYmxlcydcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqL1xuICAgIHZhciBmaW5kID0gY3JlYXRlRmluZChmaW5kSW5kZXgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9Y29sbGVjdGlvbi5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3QoWzEsIDIsIDMsIDRdLCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgdmFyIGZpbmRMYXN0ID0gY3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmbGF0dGVuZWQgYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYFxuICAgICAqIHRocnUgYGl0ZXJhdGVlYCBhbmQgZmxhdHRlbmluZyB0aGUgbWFwcGVkIHJlc3VsdHMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbbiwgbl07XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5mbGF0TWFwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbGF0TWFwYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBmbGF0dGVucyB0aGVcbiAgICAgKiBtYXBwZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbW1tuLCBuXV1dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcERlZXAoWzEsIDJdLCBkdXBsaWNhdGUpO1xuICAgICAqIC8vID0+IFsxLCAxLCAyLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZWVwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgSU5GSU5JVFkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbW1tuLCBuXV1dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcERlcHRoKFsxLCAyXSwgZHVwbGljYXRlLCAyKTtcbiAgICAgKiAvLyA9PiBbWzEsIDFdLCBbMiwgMl1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBkZXB0aCkge1xuICAgICAgZGVwdGggPSBkZXB0aCA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aCk7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggZWxlbWVudC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBBcyB3aXRoIG90aGVyIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgYXJlIGl0ZXJhdGVkIGxpa2UgYXJyYXlzLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yIHVzZSBgXy5mb3JJbmBcbiAgICAgKiBvciBgXy5mb3JPd25gIGZvciBvYmplY3QgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGVhY2hcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckVhY2goY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaCA6IGJhc2VFYWNoO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckVhY2hgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGFsaWFzIGVhY2hSaWdodFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqIEBzZWUgXy5mb3JFYWNoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaFJpZ2h0KFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzIGAyYCB0aGVuIGAxYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaFJpZ2h0IDogYmFzZUVhY2hSaWdodDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBvcmRlciBvZiBncm91cGVkIHZhbHVlc1xuICAgICAqIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gYGNvbGxlY3Rpb25gLiBUaGUgY29ycmVzcG9uZGluZ1xuICAgICAqIHZhbHVlIG9mIGVhY2gga2V5IGlzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZVxuICAgICAqIGtleS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3JvdXBCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiBbNC4yXSwgJzYnOiBbNi4xLCA2LjNdIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZ3JvdXBCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAqIC8vID0+IHsgJzMnOiBbJ29uZScsICd0d28nXSwgJzUnOiBbJ3RocmVlJ10gfVxuICAgICAqL1xuICAgIHZhciBncm91cEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSkge1xuICAgICAgICByZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICAgICAqIGNoZWNrZWQgZm9yIGEgc3Vic3RyaW5nIG9mIGB2YWx1ZWAsIG90aGVyd2lzZVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAgICAgKiB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLnJlZHVjZWAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxLCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyh7ICdhJzogMSwgJ2InOiAyIH0sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoJ2FiY2QnLCAnYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbiwgdmFsdWUsIGZyb21JbmRleCwgZ3VhcmQpIHtcbiAgICAgIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gICAgICBmcm9tSW5kZXggPSAoZnJvbUluZGV4ICYmICFndWFyZCkgPyB0b0ludGVnZXIoZnJvbUluZGV4KSA6IDA7XG5cbiAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgICAgIGZyb21JbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBmcm9tSW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgICAgID8gKGZyb21JbmRleCA8PSBsZW5ndGggJiYgY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpXG4gICAgICAgIDogKCEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nXG4gICAgICogYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFjaCBpbnZva2VkIG1ldGhvZC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAgICogYXJlIHByb3ZpZGVkIHRvIGVhY2ggaW52b2tlZCBtZXRob2QuIElmIGBwYXRoYCBpcyBhIGZ1bmN0aW9uLCBpdCdzIGludm9rZWRcbiAgICAgKiBmb3IsIGFuZCBgdGhpc2AgYm91bmQgdG8sIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZSBvclxuICAgICAqICB0aGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGVhY2ggbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbWzUsIDEsIDddLCBbMywgMiwgMV1dLCAnc29ydCcpO1xuICAgICAqIC8vID0+IFtbMSwgNSwgN10sIFsxLCAyLCAzXV1cbiAgICAgKlxuICAgICAqIF8uaW52b2tlTWFwKFsxMjMsIDQ1Nl0sIFN0cmluZy5wcm90b3R5cGUuc3BsaXQsICcnKTtcbiAgICAgKiAvLyA9PiBbWycxJywgJzInLCAnMyddLCBbJzQnLCAnNScsICc2J11dXG4gICAgICovXG4gICAgdmFyIGludm9rZU1hcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHBhdGgsIGFyZ3MpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGlzRnVuYyA9IHR5cGVvZiBwYXRoID09ICdmdW5jdGlvbicsXG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXNGdW5jID8gYXBwbHkocGF0aCwgdmFsdWUsIGFyZ3MpIDogYmFzZUludm9rZSh2YWx1ZSwgcGF0aCwgYXJncyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbGFzdCBlbGVtZW50IHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBrZXkuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFtcbiAgICAgKiAgIHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LFxuICAgICAqICAgeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCBmdW5jdGlvbihvKSB7XG4gICAgICogICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShvLmNvZGUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwgJ2QnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKlxuICAgICAqIF8ua2V5QnkoYXJyYXksICdkaXInKTtcbiAgICAgKiAvLyA9PiB7ICdsZWZ0JzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdyaWdodCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfVxuICAgICAqL1xuICAgIHZhciBrZXlCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIHZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1XG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8uZXZlcnlgLCBgXy5maWx0ZXJgLCBgXy5tYXBgLCBgXy5tYXBWYWx1ZXNgLCBgXy5yZWplY3RgLCBhbmQgYF8uc29tZWAuXG4gICAgICpcbiAgICAgKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAgICAgKiBgYXJ5YCwgYGNodW5rYCwgYGN1cnJ5YCwgYGN1cnJ5UmlnaHRgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZXZlcnlgLFxuICAgICAqIGBmaWxsYCwgYGludmVydGAsIGBwYXJzZUludGAsIGByYW5kb21gLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZXBlYXRgLFxuICAgICAqIGBzYW1wbGVTaXplYCwgYHNsaWNlYCwgYHNvbWVgLCBgc29ydEJ5YCwgYHNwbGl0YCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAgICAgKiBgdGVtcGxhdGVgLCBgdHJpbWAsIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5tYXAoWzQsIDhdLCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdXG4gICAgICpcbiAgICAgKiBfLm1hcCh7ICdhJzogNCwgJ2InOiA4IH0sIHNxdWFyZSk7XG4gICAgICogLy8gPT4gWzE2LCA2NF0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCAndXNlcicpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRCeWAgZXhjZXB0IHRoYXQgaXQgYWxsb3dzIHNwZWNpZnlpbmcgdGhlIHNvcnRcbiAgICAgKiBvcmRlcnMgb2YgdGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlc1xuICAgICAqIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yXG4gICAgICogZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlciBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXlbXXxGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtvcmRlcnNdIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBTb3J0IGJ5IGB1c2VyYCBpbiBhc2NlbmRpbmcgb3JkZXIgYW5kIGJ5IGBhZ2VgIGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICogXy5vcmRlckJ5KHVzZXJzLCBbJ3VzZXInLCAnYWdlJ10sIFsnYXNjJywgJ2Rlc2MnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0MF1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycywgZ3VhcmQpIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0FycmF5KGl0ZXJhdGVlcykpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gaXRlcmF0ZWVzID09IG51bGwgPyBbXSA6IFtpdGVyYXRlZXNdO1xuICAgICAgfVxuICAgICAgb3JkZXJzID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBvcmRlcnM7XG4gICAgICBpZiAoIWlzQXJyYXkob3JkZXJzKSkge1xuICAgICAgICBvcmRlcnMgPSBvcmRlcnMgPT0gbnVsbCA/IFtdIDogW29yZGVyc107XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byB0d28gZ3JvdXBzLCB0aGUgZmlyc3Qgb2Ygd2hpY2hcbiAgICAgKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IsIHRoZSBzZWNvbmQgb2Ygd2hpY2hcbiAgICAgKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleSBmb3IuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydwZWJibGVzJ10sIFsnYmFybmV5JywgJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsICdwZWJibGVzJ10sIFsnZnJlZCddXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgKi9cbiAgICB2YXIgcGFydGl0aW9uID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdFtrZXkgPyAwIDogMV0ucHVzaCh2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7IHJldHVybiBbW10sIFtdXTsgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLiBJZiBgYWNjdW11bGF0b3JgXG4gICAgICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICAgICAqIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOlxuICAgICAqIChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAgICAgKiBgXy5yZWR1Y2VgLCBgXy5yZWR1Y2VSaWdodGAsIGFuZCBgXy50cmFuc2Zvcm1gLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFzc2lnbmAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgaW5jbHVkZXNgLCBgbWVyZ2VgLCBgb3JkZXJCeWAsXG4gICAgICogYW5kIGBzb3J0QnlgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlZHVjZShbMSwgMl0sIGZ1bmN0aW9uKHN1bSwgbikge1xuICAgICAqICAgcmV0dXJuIHN1bSArIG47XG4gICAgICogfSwgMCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAgICAgKiAgIHJldHVybiByZXN1bHQ7XG4gICAgICogfSwge30pO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVJlZHVjZSA6IGJhc2VSZWR1Y2UsXG4gICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucmVkdWNlYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLnJlZHVjZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbWzAsIDFdLCBbMiwgM10sIFs0LCA1XV07XG4gICAgICpcbiAgICAgKiBfLnJlZHVjZVJpZ2h0KGFycmF5LCBmdW5jdGlvbihmbGF0dGVuZWQsIG90aGVyKSB7XG4gICAgICogICByZXR1cm4gZmxhdHRlbmVkLmNvbmNhdChvdGhlcik7XG4gICAgICogfSwgW10pO1xuICAgICAqIC8vID0+IFs0LCA1LCAyLCAzLCAwLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2VSaWdodCA6IGJhc2VSZWR1Y2UsXG4gICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2hSaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmZpbHRlcmA7IHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYFxuICAgICAqIHRoYXQgYHByZWRpY2F0ZWAgZG9lcyAqKm5vdCoqIHJldHVybiB0cnV0aHkgZm9yLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqIEBzZWUgXy5maWx0ZXJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5yZWplY3QodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgcmFuZG9tIGVsZW1lbnQgZnJvbSBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlKFsxLCAyLCAzLCA0XSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNhbXBsZSA6IGJhc2VTYW1wbGU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGBuYCByYW5kb20gZWxlbWVudHMgYXQgdW5pcXVlIGtleXMgZnJvbSBgY29sbGVjdGlvbmAgdXAgdG8gdGhlXG4gICAgICogc2l6ZSBvZiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzMsIDFdXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZVNpemUoWzEsIDIsIDNdLCA0KTtcbiAgICAgKiAvLyA9PiBbMiwgMywgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIDogbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBuID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICB9XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNhbXBsZVNpemUgOiBiYXNlU2FtcGxlU2l6ZTtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygc2h1ZmZsZWQgdmFsdWVzLCB1c2luZyBhIHZlcnNpb24gb2YgdGhlXG4gICAgICogW0Zpc2hlci1ZYXRlcyBzaHVmZmxlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXNoZXItWWF0ZXNfc2h1ZmZsZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2h1ZmZsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IFs0LCAxLCAzLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTaHVmZmxlIDogYmFzZVNodWZmbGU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICAgICAqIHZhbHVlcyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIHNpemUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2l6ZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uc2l6ZSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8uc2l6ZSgncGViYmxlcycpO1xuICAgICAqIC8vID0+IDdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaXplKGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pID8gc3RyaW5nU2l6ZShjb2xsZWN0aW9uKSA6IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlS2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFueSoqIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb21lKFtudWxsLCAwLCAneWVzJywgZmFsc2VdLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb21lKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U29tZSA6IGJhc2VTb21lO1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpKSB7XG4gICAgICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICAgICAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc29ydCBvcmRlciBvZlxuICAgICAqIGVxdWFsIGVsZW1lbnRzLiBUaGUgaXRlcmF0ZWVzIGFyZSBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0MF1dXG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCA0MF0sIFsnZnJlZCcsIDQ4XV1cbiAgICAgKi9cbiAgICB2YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IDEgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0pKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtdO1xuICAgICAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIGlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdLCBpdGVyYXRlZXNbMl0pKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtpdGVyYXRlZXNbMF1dO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywgMSksIFtdKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICAgICAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IERhdGVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gICAgICogfSwgXy5ub3coKSk7XG4gICAgICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgbm93ID0gY3R4Tm93IHx8IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbiAgICB9O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmJlZm9yZWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXNcbiAgICAgKiBgZnVuY2Agb25jZSBpdCdzIGNhbGxlZCBgbmAgb3IgbW9yZSB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYmVmb3JlIGBmdW5jYCBpcyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXZlcyA9IFsncHJvZmlsZScsICdzZXR0aW5ncyddO1xuICAgICAqXG4gICAgICogdmFyIGRvbmUgPSBfLmFmdGVyKHNhdmVzLmxlbmd0aCwgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnZG9uZSBzYXZpbmchJyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goc2F2ZXMsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgKiAgIGFzeW5jU2F2ZSh7ICd0eXBlJzogdHlwZSwgJ2NvbXBsZXRlJzogZG9uZSB9KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdkb25lIHNhdmluZyEnIGFmdGVyIHRoZSB0d28gYXN5bmMgc2F2ZXMgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWZ0ZXIobiwgZnVuYykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA8IDEpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHVwIHRvIGBuYCBhcmd1bWVudHMsXG4gICAgICogaWdub3JpbmcgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgY2FwLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLmFyeShwYXJzZUludCwgMSkpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnkoZnVuYywgbiwgZ3VhcmQpIHtcbiAgICAgIG4gPSBndWFyZCA/IHVuZGVmaW5lZCA6IG47XG4gICAgICBuID0gKGZ1bmMgJiYgbiA9PSBudWxsKSA/IGZ1bmMubGVuZ3RoIDogbjtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfQVJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2AsIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHNcbiAgICAgKiBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hpbGUgaXQncyBjYWxsZWQgbGVzcyB0aGFuIGBuYCB0aW1lcy4gU3Vic2VxdWVudFxuICAgICAqIGNhbGxzIHRvIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBjYWxscyBhdCB3aGljaCBgZnVuY2AgaXMgbm8gbG9uZ2VyIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uYmVmb3JlKDUsIGFkZENvbnRhY3RUb0xpc3QpKTtcbiAgICAgKiAvLyA9PiBBbGxvd3MgYWRkaW5nIHVwIHRvIDQgY29udGFjdHMgdG8gdGhlIGxpc3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmVmb3JlKG4sIGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoLS1uID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobiA8PSAxKSB7XG4gICAgICAgICAgZnVuYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2BcbiAgICAgKiBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgbmF0aXZlIGBGdW5jdGlvbiNiaW5kYCwgdGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCJcbiAgICAgKiBwcm9wZXJ0eSBvZiBib3VuZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBiaW5kLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICd1c2VyJzogJ2ZyZWQnIH07XG4gICAgICpcbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgJ2hpJyk7XG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICovXG4gICAgdmFyIGJpbmQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmQpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgb2JqZWN0W2tleV1gIHdpdGggYHBhcnRpYWxzYFxuICAgICAqIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIGBfLmJpbmRgIGJ5IGFsbG93aW5nIGJvdW5kIGZ1bmN0aW9ucyB0byByZWZlcmVuY2VcbiAgICAgKiBtZXRob2RzIHRoYXQgbWF5IGJlIHJlZGVmaW5lZCBvciBkb24ndCB5ZXQgZXhpc3QuIFNlZVxuICAgICAqIFtQZXRlciBNaWNoYXV4J3MgYXJ0aWNsZV0oaHR0cDovL3BldGVyLm1pY2hhdXguY2EvYXJ0aWNsZXMvbGF6eS1mdW5jdGlvbi1kZWZpbml0aW9uLXBhdHRlcm4pXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kS2V5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICogICAndXNlcic6ICdmcmVkJyxcbiAgICAgKiAgICdncmVldCc6IGZ1bmN0aW9uKGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICAgICAqICAgICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgJ2hpJyk7XG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICpcbiAgICAgKiBvYmplY3QuZ3JlZXQgPSBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICd5YSAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpeWEgZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCBfLCAnIScpO1xuICAgICAqIGJvdW5kKCdoaScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kS2V5ID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBrZXksIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgYml0bWFzayA9IFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHO1xuICAgICAgaWYgKHBhcnRpYWxzLmxlbmd0aCkge1xuICAgICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIoYmluZEtleSkpO1xuICAgICAgICBiaXRtYXNrIHw9IFdSQVBfUEFSVElBTF9GTEFHO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoa2V5LCBiaXRtYXNrLCBvYmplY3QsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYXJndW1lbnRzIG9mIGBmdW5jYCBhbmQgZWl0aGVyIGludm9rZXNcbiAgICAgKiBgZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGF0IGxlYXN0IGBhcml0eWAgbnVtYmVyIG9mIGFyZ3VtZW50cyBoYXZlXG4gICAgICogYmVlbiBwcm92aWRlZCwgb3IgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB0aGUgcmVtYWluaW5nIGBmdW5jYFxuICAgICAqIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgYGZ1bmNgIG1heSBiZSBzcGVjaWZpZWQgaWYgYGZ1bmMubGVuZ3RoYFxuICAgICAqIGlzIG5vdCBzdWZmaWNpZW50LlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGFiYyk7XG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEpKDIpKDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMiwgMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiAvLyBDdXJyaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIGN1cnJpZWQoMSkoXywgMykoMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gICAgICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeS5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jdXJyeWAgZXhjZXB0IHRoYXQgYXJndW1lbnRzIGFyZSBhcHBsaWVkIHRvIGBmdW5jYFxuICAgICAqIGluIHRoZSBtYW5uZXIgb2YgYF8ucGFydGlhbFJpZ2h0YCBpbnN0ZWFkIG9mIGBfLnBhcnRpYWxgLlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5UmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGN1cnJpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhYmMgPSBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gW2EsIGIsIGNdO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgY3VycmllZCA9IF8uY3VycnlSaWdodChhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgzKSgyKSgxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMiwgMykoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDMpKDEsIF8pKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5UmlnaHQoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gICAgICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeVJpZ2h0LnBsYWNlaG9sZGVyO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAgICAgKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAgICAgKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gICAgICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gICAgICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gICAgICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICAgICAqIGludm9jYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gICAgICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAgICAgKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAgICAgKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAgICAgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICAgICAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gICAgICpcbiAgICAgKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gICAgICogICAnbGVhZGluZyc6IHRydWUsXG4gICAgICogICAndHJhaWxpbmcnOiBmYWxzZVxuICAgICAqIH0pKTtcbiAgICAgKlxuICAgICAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gICAgICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gICAgICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICAgICAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxhc3RBcmdzLFxuICAgICAgICAgIGxhc3RUaGlzLFxuICAgICAgICAgIG1heFdhaXQsXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIHRpbWVySWQsXG4gICAgICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgICAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICAgICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICAgICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgICAgICB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgICAgICByZXR1cm4gbWF4aW5nXG4gICAgICAgICAgPyBuYXRpdmVNaW4odGltZVdhaXRpbmcsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKVxuICAgICAgICAgIDogdGltZVdhaXRpbmc7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICAgICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgICAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAgICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICAgICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgICAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICAgICAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gICAgICByZXR1cm4gZGVib3VuY2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmVycyBpbnZva2luZyB0aGUgYGZ1bmNgIHVudGlsIHRoZSBjdXJyZW50IGNhbGwgc3RhY2sgaGFzIGNsZWFyZWQuIEFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWZlci5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZlcihmdW5jdGlvbih0ZXh0KSB7XG4gICAgICogICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgKiB9LCAnZGVmZXJyZWQnKTtcbiAgICAgKiAvLyA9PiBMb2dzICdkZWZlcnJlZCcgYWZ0ZXIgb25lIG1pbGxpc2Vjb25kLlxuICAgICAqL1xuICAgIHZhciBkZWZlciA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBiYXNlRGVsYXkoZnVuYywgMSwgYXJncyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIGBmdW5jYCBhZnRlciBgd2FpdGAgbWlsbGlzZWNvbmRzLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWxheShmdW5jdGlvbih0ZXh0KSB7XG4gICAgICogICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgKiB9LCAxMDAwLCAnbGF0ZXInKTtcbiAgICAgKiAvLyA9PiBMb2dzICdsYXRlcicgYWZ0ZXIgb25lIHNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVsYXkgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB3YWl0LCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIHRvTnVtYmVyKHdhaXQpIHx8IDAsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBhcmd1bWVudHMgcmV2ZXJzZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBmbGlwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmxpcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZsaXBwZWQgPSBfLmZsaXAoZnVuY3Rpb24oKSB7XG4gICAgICogICByZXR1cm4gXy50b0FycmF5KGFyZ3VtZW50cyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBmbGlwcGVkKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICogLy8gPT4gWydkJywgJ2MnLCAnYicsICdhJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGlwKGZ1bmMpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfRkxJUF9GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuICAgICAqIHByb3ZpZGVkLCBpdCBkZXRlcm1pbmVzIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGVcbiAgICAgKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnRcbiAgICAgKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgbWFwIGNhY2hlIGtleS4gVGhlIGBmdW5jYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZFxuICAgICAqIGZ1bmN0aW9uLiBJdHMgY3JlYXRpb24gbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcmVwbGFjaW5nIHRoZSBgXy5tZW1vaXplLkNhY2hlYFxuICAgICAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlXG4gICAgICogW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcbiAgICAgKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBjbGVhcmAsIGBkZWxldGVgLCBgZ2V0YCwgYGhhc2AsIGFuZCBgc2V0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYyc6IDMsICdkJzogNCB9O1xuICAgICAqXG4gICAgICogdmFyIHZhbHVlcyA9IF8ubWVtb2l6ZShfLnZhbHVlcyk7XG4gICAgICogdmFsdWVzKG9iamVjdCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiB2YWx1ZXMob3RoZXIpO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqXG4gICAgICogb2JqZWN0LmEgPSAyO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuXG4gICAgICogdmFsdWVzLmNhY2hlLnNldChvYmplY3QsIFsnYScsICdiJ10pO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKlxuICAgICAqIC8vIFJlcGxhY2UgYF8ubWVtb2l6ZS5DYWNoZWAuXG4gICAgICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplKGZ1bmMsIHJlc29sdmVyKSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgIT0gbnVsbCAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmdzKSA6IGFyZ3NbMF0sXG4gICAgICAgICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xuXG4gICAgICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgbWVtb2l6ZWQuY2FjaGUgPSBjYWNoZS5zZXQoa2V5LCByZXN1bHQpIHx8IGNhY2hlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIG1lbW9pemVkLmNhY2hlID0gbmV3IChtZW1vaXplLkNhY2hlIHx8IE1hcENhY2hlKTtcbiAgICAgIHJldHVybiBtZW1vaXplZDtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgYE1hcENhY2hlYC5cbiAgICBtZW1vaXplLkNhY2hlID0gTWFwQ2FjaGU7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBuZWdhdGVzIHRoZSByZXN1bHQgb2YgdGhlIHByZWRpY2F0ZSBgZnVuY2AuIFRoZVxuICAgICAqIGBmdW5jYCBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIHByZWRpY2F0ZSB0byBuZWdhdGUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbmVnYXRlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNFdmVuKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKFsxLCAyLCAzLCA0LCA1LCA2XSwgXy5uZWdhdGUoaXNFdmVuKSk7XG4gICAgICogLy8gPT4gWzEsIDMsIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMpO1xuICAgICAgICAgIGNhc2UgMTogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdKTtcbiAgICAgICAgICBjYXNlIDI6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhcHJlZGljYXRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpcyByZXN0cmljdGVkIHRvIGludm9raW5nIGBmdW5jYCBvbmNlLiBSZXBlYXQgY2FsbHNcbiAgICAgKiB0byB0aGUgZnVuY3Rpb24gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbi4gVGhlIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBpbml0aWFsaXplID0gXy5vbmNlKGNyZWF0ZUFwcGxpY2F0aW9uKTtcbiAgICAgKiBpbml0aWFsaXplKCk7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIC8vID0+IGBjcmVhdGVBcHBsaWNhdGlvbmAgaXMgaW52b2tlZCBvbmNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25jZShmdW5jKSB7XG4gICAgICByZXR1cm4gYmVmb3JlKDIsIGZ1bmMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50cyB0cmFuc2Zvcm1lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFt0cmFuc2Zvcm1zPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGFyZ3VtZW50IHRyYW5zZm9ybXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGRvdWJsZWQobikge1xuICAgICAqICAgcmV0dXJuIG4gKiAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJBcmdzKGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgKiAgIHJldHVybiBbeCwgeV07XG4gICAgICogfSwgW3NxdWFyZSwgZG91YmxlZF0pO1xuICAgICAqXG4gICAgICogZnVuYyg5LCAzKTtcbiAgICAgKiAvLyA9PiBbODEsIDZdXG4gICAgICpcbiAgICAgKiBmdW5jKDEwLCA1KTtcbiAgICAgKiAvLyA9PiBbMTAwLCAxMF1cbiAgICAgKi9cbiAgICB2YXIgb3ZlckFyZ3MgPSBjYXN0UmVzdChmdW5jdGlvbihmdW5jLCB0cmFuc2Zvcm1zKSB7XG4gICAgICB0cmFuc2Zvcm1zID0gKHRyYW5zZm9ybXMubGVuZ3RoID09IDEgJiYgaXNBcnJheSh0cmFuc2Zvcm1zWzBdKSlcbiAgICAgICAgPyBhcnJheU1hcCh0cmFuc2Zvcm1zWzBdLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpXG4gICAgICAgIDogYXJyYXlNYXAoYmFzZUZsYXR0ZW4odHJhbnNmb3JtcywgMSksIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG5cbiAgICAgIHZhciBmdW5jc0xlbmd0aCA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4oYXJncy5sZW5ndGgsIGZ1bmNzTGVuZ3RoKTtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gdHJhbnNmb3Jtc1tpbmRleF0uY2FsbCh0aGlzLCBhcmdzW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZVxuICAgICAqIGFyZ3VtZW50cyBpdCByZWNlaXZlcy4gVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5iaW5kYCBleGNlcHQgaXQgZG9lcyAqKm5vdCoqXG4gICAgICogYWx0ZXIgdGhlIGB0aGlzYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogVGhlIGBfLnBhcnRpYWwucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMi4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHNheUhlbGxvVG8gPSBfLnBhcnRpYWwoZ3JlZXQsICdoZWxsbycpO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBncmVldEZyZWQgPSBfLnBhcnRpYWwoZ3JlZXQsIF8sICdmcmVkJyk7XG4gICAgICogZ3JlZXRGcmVkKCdoaScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkJ1xuICAgICAqL1xuICAgIHZhciBwYXJ0aWFsID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsKSk7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1BBUlRJQUxfRkxBRywgdW5kZWZpbmVkLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnBhcnRpYWxgIGV4Y2VwdCB0aGF0IHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50c1xuICAgICAqIGFyZSBhcHBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogVGhlIGBfLnBhcnRpYWxSaWdodC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgcGFydGlhbGx5XG4gICAgICogYXBwbGllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkgYXJndW1lbnRzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgbmFtZSkge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgbmFtZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdmcmVkJyk7XG4gICAgICogZ3JlZXRGcmVkKCdoaScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkJ1xuICAgICAqXG4gICAgICogLy8gUGFydGlhbGx5IGFwcGxpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIHNheUhlbGxvVG8gPSBfLnBhcnRpYWxSaWdodChncmVldCwgJ2hlbGxvJywgXyk7XG4gICAgICogc2F5SGVsbG9UbygnZnJlZCcpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkJ1xuICAgICAqL1xuICAgIHZhciBwYXJ0aWFsUmlnaHQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKHBhcnRpYWxSaWdodCkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBhcmd1bWVudHMgYXJyYW5nZWQgYWNjb3JkaW5nXG4gICAgICogdG8gdGhlIHNwZWNpZmllZCBgaW5kZXhlc2Agd2hlcmUgdGhlIGFyZ3VtZW50IHZhbHVlIGF0IHRoZSBmaXJzdCBpbmRleCBpc1xuICAgICAqIHByb3ZpZGVkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgdGhlIGFyZ3VtZW50IHZhbHVlIGF0IHRoZSBzZWNvbmQgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZWFycmFuZ2UgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVtYmVyW10pfSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcmd1bWVudCBpbmRleGVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgcmVhcmdlZCA9IF8ucmVhcmcoZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9LCBbMiwgMCwgMV0pO1xuICAgICAqXG4gICAgICogcmVhcmdlZCgnYicsICdjJywgJ2EnKVxuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIHZhciByZWFyZyA9IGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmMsIGluZGV4ZXMpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUkVBUkdfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaW5kZXhlcyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uIGFuZCBhcmd1bWVudHMgZnJvbSBgc3RhcnRgIGFuZCBiZXlvbmQgcHJvdmlkZWQgYXNcbiAgICAgKiBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgKiBbcmVzdCBwYXJhbWV0ZXJdKGh0dHBzOi8vbWRuLmlvL3Jlc3RfcGFyYW1ldGVycykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHNheSA9IF8ucmVzdChmdW5jdGlvbih3aGF0LCBuYW1lcykge1xuICAgICAqICAgcmV0dXJuIHdoYXQgKyAnICcgKyBfLmluaXRpYWwobmFtZXMpLmpvaW4oJywgJykgK1xuICAgICAqICAgICAoXy5zaXplKG5hbWVzKSA+IDEgPyAnLCAmICcgOiAnJykgKyBfLmxhc3QobmFtZXMpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc2F5KCdoZWxsbycsICdmcmVkJywgJ2Jhcm5leScsICdwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQsIGJhcm5leSwgJiBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc3QoZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gc3RhcnQgPT09IHVuZGVmaW5lZCA/IHN0YXJ0IDogdG9JbnRlZ2VyKHN0YXJ0KTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jLCBzdGFydCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICogY3JlYXRlIGZ1bmN0aW9uIGFuZCBhbiBhcnJheSBvZiBhcmd1bWVudHMgbXVjaCBsaWtlXG4gICAgICogW2BGdW5jdGlvbiNhcHBseWBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1mdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIHRoZVxuICAgICAqIFtzcHJlYWQgb3BlcmF0b3JdKGh0dHBzOi8vbWRuLmlvL3NwcmVhZF9vcGVyYXRvcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBzcHJlYWQgYXJndW1lbnRzIG92ZXIuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHNwcmVhZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHNheSA9IF8uc3ByZWFkKGZ1bmN0aW9uKHdobywgd2hhdCkge1xuICAgICAqICAgcmV0dXJuIHdobyArICcgc2F5cyAnICsgd2hhdDtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheShbJ2ZyZWQnLCAnaGVsbG8nXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQgc2F5cyBoZWxsbydcbiAgICAgKlxuICAgICAqIHZhciBudW1iZXJzID0gUHJvbWlzZS5hbGwoW1xuICAgICAqICAgUHJvbWlzZS5yZXNvbHZlKDQwKSxcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSgzNilcbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqIG51bWJlcnMudGhlbihfLnNwcmVhZChmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4geCArIHk7XG4gICAgICogfSkpO1xuICAgICAqIC8vID0+IGEgUHJvbWlzZSBvZiA3NlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNwcmVhZChmdW5jLCBzdGFydCkge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSBzdGFydCA9PSBudWxsID8gMCA6IG5hdGl2ZU1heCh0b0ludGVnZXIoc3RhcnQpLCAwKTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFyZ3Nbc3RhcnRdLFxuICAgICAgICAgICAgb3RoZXJBcmdzID0gY2FzdFNsaWNlKGFyZ3MsIDAsIHN0YXJ0KTtcblxuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBhcnJheVB1c2gob3RoZXJBcmdzLCBhcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gICAgICogZXZlcnkgYHdhaXRgIG1pbGxpc2Vjb25kcy4gVGhlIHRocm90dGxlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGBcbiAgICAgKiBtZXRob2QgdG8gY2FuY2VsIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvXG4gICAgICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gICAgICogc2hvdWxkIGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YFxuICAgICAqIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZCB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGVcbiAgICAgKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gICAgICogcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy50aHJvdHRsZWAgYW5kIGBfLmRlYm91bmNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHRocm90dGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9dHJ1ZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3Njcm9sbCcsIF8udGhyb3R0bGUodXBkYXRlUG9zaXRpb24sIDEwMCkpO1xuICAgICAqXG4gICAgICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gICAgICogdmFyIHRocm90dGxlZCA9IF8udGhyb3R0bGUocmVuZXdUb2tlbiwgMzAwMDAwLCB7ICd0cmFpbGluZyc6IGZhbHNlIH0pO1xuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCB0aHJvdHRsZWQpO1xuICAgICAqXG4gICAgICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyB0aHJvdHRsZWQgaW52b2NhdGlvbi5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCB0aHJvdHRsZWQuY2FuY2VsKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGVhZGluZyA9IHRydWUsXG4gICAgICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9ICdsZWFkaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLmxlYWRpbmcgOiBsZWFkaW5nO1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlYm91bmNlKGZ1bmMsIHdhaXQsIHtcbiAgICAgICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICAgICAnbWF4V2FpdCc6IHdhaXQsXG4gICAgICAgICd0cmFpbGluZyc6IHRyYWlsaW5nXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHVwIHRvIG9uZSBhcmd1bWVudCwgaWdub3JpbmcgYW55XG4gICAgICogYWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICc4JywgJzEwJ10sIF8udW5hcnkocGFyc2VJbnQpKTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5hcnkoZnVuYykge1xuICAgICAgcmV0dXJuIGFyeShmdW5jLCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBgdmFsdWVgIHRvIGB3cmFwcGVyYCBhcyBpdHMgZmlyc3RcbiAgICAgKiBhcmd1bWVudC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBmdW5jdGlvbiBhcmUgYXBwZW5kZWRcbiAgICAgKiB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgYHdyYXBwZXJgLiBUaGUgd3JhcHBlciBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFt3cmFwcGVyPWlkZW50aXR5XSBUaGUgd3JhcHBlciBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHAgPSBfLndyYXAoXy5lc2NhcGUsIGZ1bmN0aW9uKGZ1bmMsIHRleHQpIHtcbiAgICAgKiAgIHJldHVybiAnPHA+JyArIGZ1bmModGV4dCkgKyAnPC9wPic7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBwKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICc8cD5mcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXM8L3A+J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXAodmFsdWUsIHdyYXBwZXIpIHtcbiAgICAgIHJldHVybiBwYXJ0aWFsKGNhc3RGdW5jdGlvbih3cmFwcGVyKSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgYXMgYW4gYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoMSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSh7ICdhJzogMSB9KTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEgfV1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBbJ2FiYyddXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheShudWxsKTtcbiAgICAgKiAvLyA9PiBbbnVsbF1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gW3VuZGVmaW5lZF1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKiBjb25zb2xlLmxvZyhfLmNhc3RBcnJheShhcnJheSkgPT09IGFycmF5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdEFycmF5KCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2hhbGxvdyBjbG9uZSBvZiBgdmFsdWVgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlXG4gICAgICogW3N0cnVjdHVyZWQgY2xvbmUgYWxnb3JpdGhtXShodHRwczovL21kbi5pby9TdHJ1Y3R1cmVkX2Nsb25lX2FsZ29yaXRobSlcbiAgICAgKiBhbmQgc3VwcG9ydHMgY2xvbmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLCBkYXRlIG9iamVjdHMsIG1hcHMsXG4gICAgICogbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcywgc2V0cywgc3RyaW5ncywgc3ltYm9scywgYW5kIHR5cGVkXG4gICAgICogYXJyYXlzLiBUaGUgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBgYXJndW1lbnRzYCBvYmplY3RzIGFyZSBjbG9uZWRcbiAgICAgKiBhcyBwbGFpbiBvYmplY3RzLiBBbiBlbXB0eSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIHVuY2xvbmVhYmxlIHZhbHVlcyBzdWNoXG4gICAgICogYXMgZXJyb3Igb2JqZWN0cywgZnVuY3Rpb25zLCBET00gbm9kZXMsIGFuZCBXZWFrTWFwcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVEZWVwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICAgICAqXG4gICAgICogdmFyIHNoYWxsb3cgPSBfLmNsb25lKG9iamVjdHMpO1xuICAgICAqIGNvbnNvbGUubG9nKHNoYWxsb3dbMF0gPT09IG9iamVjdHNbMF0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgY2xvbmVkIHZhbHVlLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCxcbiAgICAgKiBjbG9uaW5nIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHVwIHRvIGZvdXIgYXJndW1lbnRzOyAodmFsdWUgWywgaW5kZXh8a2V5LCBvYmplY3QsIHN0YWNrXSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVEZWVwV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKHZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0VsZW1lbnQodmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB2YWx1ZS5jbG9uZU5vZGUoZmFsc2UpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBlbCA9IF8uY2xvbmVXaXRoKGRvY3VtZW50LmJvZHksIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZWwgPT09IGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogY29uc29sZS5sb2coZWwubm9kZU5hbWUpO1xuICAgICAqIC8vID0+ICdCT0RZJ1xuICAgICAqIGNvbnNvbGUubG9nKGVsLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVXaXRoKHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICAgICAqXG4gICAgICogdmFyIGRlZXAgPSBfLmNsb25lRGVlcChvYmplY3RzKTtcbiAgICAgKiBjb25zb2xlLmxvZyhkZWVwWzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lV2l0aGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZVdpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBlbCA9IF8uY2xvbmVEZWVwV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXBXaXRoKHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgb2JqZWN0YCBjb25mb3JtcyB0byBgc291cmNlYCBieSBpbnZva2luZyB0aGUgcHJlZGljYXRlXG4gICAgICogcHJvcGVydGllcyBvZiBgc291cmNlYCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGBfLmNvbmZvcm1zYCB3aGVuIGBzb3VyY2VgIGlzXG4gICAgICogcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xNC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBjb25mb3JtcywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqXG4gICAgICogXy5jb25mb3Jtc1RvKG9iamVjdCwgeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMjsgfSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBzb3VyY2UgPT0gbnVsbCB8fCBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwga2V5cyhzb3VyY2UpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVxKCdhJywgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVxKE5hTiwgTmFOKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmx0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5ndCgzLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5ndCgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBndCA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oYmFzZUd0KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXG4gICAgICogIGBvdGhlcmAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8ubHRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDMsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDMsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDEsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGd0ZSA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPj0gb3RoZXI7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheUJ1ZmZlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5QnVmZmVyKG5ldyBBcnJheUJ1ZmZlcigyKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5QnVmZmVyKG5ldyBBcnJheSgyKSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcnJheUJ1ZmZlciA9IG5vZGVJc0FycmF5QnVmZmVyID8gYmFzZVVuYXJ5KG5vZGVJc0FycmF5QnVmZmVyKSA6IGJhc2VJc0FycmF5QnVmZmVyO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICAgICAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAgICAgKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gICAgICogaXMgYW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYm9vbGVhbiBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJvb2xlYW4sIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Jvb2xlYW4oZmFsc2UpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGJvb2xUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBEYXRlYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZGF0ZSBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0RhdGUobmV3IERhdGUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKCdNb24gQXByaWwgMjMgMjAxMicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzRGF0ZSA9IG5vZGVJc0RhdGUgPyBiYXNlVW5hcnkobm9kZUlzRGF0ZSkgOiBiYXNlSXNEYXRlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgRE9NIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgRE9NIGVsZW1lbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0VsZW1lbnQoZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VsZW1lbnQoJzxib2R5PicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbGVtZW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNQbGFpbk9iamVjdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gZW1wdHkgb2JqZWN0LCBjb2xsZWN0aW9uLCBtYXAsIG9yIHNldC5cbiAgICAgKlxuICAgICAqIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIG5vIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZFxuICAgICAqIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBBcnJheS1saWtlIHZhbHVlcyBzdWNoIGFzIGBhcmd1bWVudHNgIG9iamVjdHMsIGFycmF5cywgYnVmZmVycywgc3RyaW5ncywgb3JcbiAgICAgKiBqUXVlcnktbGlrZSBjb2xsZWN0aW9ucyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgbGVuZ3RoYCBvZiBgMGAuXG4gICAgICogU2ltaWxhcmx5LCBtYXBzIGFuZCBzZXRzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBzaXplYCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eShudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkodHJ1ZSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoeyAnYSc6IDEgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiZcbiAgICAgICAgICAoaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZS5zcGxpY2UgPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgaXNCdWZmZXIodmFsdWUpIHx8IGlzVHlwZWRBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gIXZhbHVlLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpO1xuICAgICAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgICAgICByZXR1cm4gIXZhbHVlLnNpemU7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcm90b3R5cGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAhYmFzZUtleXModmFsdWUpLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZVxuICAgICAqIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsXG4gICAgICogZGF0ZSBvYmplY3RzLCBlcnJvciBvYmplY3RzLCBtYXBzLCBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLFxuICAgICAqIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZCBhcnJheXMuIGBPYmplY3RgIG9iamVjdHMgYXJlIGNvbXBhcmVkXG4gICAgICogYnkgdGhlaXIgb3duLCBub3QgaW5oZXJpdGVkLCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEZ1bmN0aW9ucyBhbmQgRE9NXG4gICAgICogbm9kZXMgYXJlIGNvbXBhcmVkIGJ5IHN0cmljdCBlcXVhbGl0eSwgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmlzRXF1YWwob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogb2JqZWN0ID09PSBvdGhlcjtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXF1YWwodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzRXF1YWxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIGNvbXBhcmlzb25zXG4gICAgICogYXJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCB1cCB0b1xuICAgICAqIHNpeCBhcmd1bWVudHM6IChvYmpWYWx1ZSwgb3RoVmFsdWUgWywgaW5kZXh8a2V5LCBvYmplY3QsIG90aGVyLCBzdGFja10pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNHcmVldGluZyh2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSkge1xuICAgICAqICAgaWYgKGlzR3JlZXRpbmcob2JqVmFsdWUpICYmIGlzR3JlZXRpbmcob3RoVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB0cnVlO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnaGVsbG8nLCAnZ29vZGJ5ZSddO1xuICAgICAqIHZhciBvdGhlciA9IFsnaGknLCAnZ29vZGJ5ZSddO1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsV2l0aChhcnJheSwgb3RoZXIsIGN1c3RvbWl6ZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsV2l0aCh2YWx1ZSwgb3RoZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyID8gY3VzdG9taXplcih2YWx1ZSwgb3RoZXIpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCB1bmRlZmluZWQsIGN1c3RvbWl6ZXIpIDogISFyZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gYEVycm9yYCwgYEV2YWxFcnJvcmAsIGBSYW5nZUVycm9yYCwgYFJlZmVyZW5jZUVycm9yYCxcbiAgICAgKiBgU3ludGF4RXJyb3JgLCBgVHlwZUVycm9yYCwgb3IgYFVSSUVycm9yYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGVycm9yIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRXJyb3IobmV3IEVycm9yKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRXJyb3IoRXJyb3IpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcnJvcih2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgICAgIHJldHVybiB0YWcgPT0gZXJyb3JUYWcgfHwgdGFnID09IGRvbUV4Y1RhZyB8fFxuICAgICAgICAodHlwZW9mIHZhbHVlLm1lc3NhZ2UgPT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlLm5hbWUgPT0gJ3N0cmluZycgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZpbml0ZSBwcmltaXRpdmUgbnVtYmVyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNGaW5pdGVgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNGaW5pdGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZpbml0ZSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiBuYXRpdmVJc0Zpbml0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGdW5jdGlvbihfKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gICAgICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgICAgIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgICAgIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc0ludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBpbnRlZ2VyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT0gdG9JbnRlZ2VyKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgICAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gICAgICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICAgICAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3Qoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gICAgICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNNYXAobmV3IE1hcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc01hcChuZXcgV2Vha01hcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNNYXAgPSBub2RlSXNNYXAgPyBiYXNlVW5hcnkobm9kZUlzTWFwKSA6IGJhc2VJc01hcDtcblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgcGFydGlhbCBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiBgb2JqZWN0YCBhbmQgYHNvdXJjZWAgdG9cbiAgICAgKiBkZXRlcm1pbmUgaWYgYG9iamVjdGAgY29udGFpbnMgZXF1aXZhbGVudCBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgXy5tYXRjaGVzYCB3aGVuIGBzb3VyY2VgIGlzXG4gICAgICogcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdCBgc291cmNlYFxuICAgICAqIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlIGBfLmlzRXF1YWxgXG4gICAgICogZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKlxuICAgICAqIF8uaXNNYXRjaChvYmplY3QsIHsgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNNYXRjaChvYmplY3QsIHsgJ2InOiAxIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXRjaChvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBnZXRNYXRjaERhdGEoc291cmNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc01hdGNoYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAqIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggZml2ZVxuICAgICAqIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwgaW5kZXh8a2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNHcmVldGluZyh2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgaWYgKGlzR3JlZXRpbmcob2JqVmFsdWUpICYmIGlzR3JlZXRpbmcoc3JjVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB0cnVlO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdncmVldGluZyc6ICdoZWxsbycgfTtcbiAgICAgKiB2YXIgc291cmNlID0geyAnZ3JlZXRpbmcnOiAnaGknIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXRjaFdpdGgob2JqZWN0LCBzb3VyY2UsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSksIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBOYU5gLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNOYU5gXShodHRwczovL21kbi5pby9OdW1iZXIvaXNOYU4pIGFuZCBpcyBub3QgdGhlIHNhbWUgYXNcbiAgICAgKiBnbG9iYWwgW2Bpc05hTmBdKGh0dHBzOi8vbWRuLmlvL2lzTmFOKSB3aGljaCByZXR1cm5zIGB0cnVlYCBmb3JcbiAgICAgKiBgdW5kZWZpbmVkYCBhbmQgb3RoZXIgbm9uLW51bWJlciB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYU4oTmFOKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKG5ldyBOdW1iZXIoTmFOKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogaXNOYU4odW5kZWZpbmVkKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hTih2YWx1ZSkge1xuICAgICAgLy8gQW4gYE5hTmAgcHJpbWl0aXZlIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIGB0b1N0cmluZ1RhZ2AgY2hlY2sgZmlyc3QgdG8gYXZvaWQgZXJyb3JzIHdpdGggc29tZVxuICAgICAgLy8gQWN0aXZlWCBvYmplY3RzIGluIElFLlxuICAgICAgcmV0dXJuIGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSAhPSArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcmlzdGluZSBuYXRpdmUgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgY2FuJ3QgcmVsaWFibHkgZGV0ZWN0IG5hdGl2ZSBmdW5jdGlvbnMgaW4gdGhlIHByZXNlbmNlXG4gICAgICogb2YgdGhlIGNvcmUtanMgcGFja2FnZSBiZWNhdXNlIGNvcmUtanMgY2lyY3VtdmVudHMgdGhpcyBraW5kIG9mIGRldGVjdGlvbi5cbiAgICAgKiBEZXNwaXRlIG11bHRpcGxlIHJlcXVlc3RzLCB0aGUgY29yZS1qcyBtYWludGFpbmVyIGhhcyBtYWRlIGl0IGNsZWFyOiBhbnlcbiAgICAgKiBhdHRlbXB0IHRvIGZpeCB0aGUgZGV0ZWN0aW9uIHdpbGwgYmUgb2JzdHJ1Y3RlZC4gQXMgYSByZXN1bHQsIHdlJ3JlIGxlZnRcbiAgICAgKiB3aXRoIGxpdHRsZSBjaG9pY2UgYnV0IHRvIHRocm93IGFuIGVycm9yLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGFsc28gYWZmZWN0c1xuICAgICAqIHBhY2thZ2VzLCBsaWtlIFtiYWJlbC1wb2x5ZmlsbF0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmFiZWwtcG9seWZpbGwpLFxuICAgICAqIHdoaWNoIHJlbHkgb24gY29yZS1qcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc05hdGl2ZShBcnJheS5wcm90b3R5cGUucHVzaCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hdGl2ZShfKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmF0aXZlKHZhbHVlKSB7XG4gICAgICBpZiAoaXNNYXNrYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKENPUkVfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBudWxsYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTnVsbChudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVsbCh2b2lkIDApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOdWxsKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBudWxsaXNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05pbCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwoTmFOKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmlsKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE51bWJlcmAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUbyBleGNsdWRlIGBJbmZpbml0eWAsIGAtSW5maW5pdHlgLCBhbmQgYE5hTmAsIHdoaWNoIGFyZVxuICAgICAqIGNsYXNzaWZpZWQgYXMgbnVtYmVycywgdXNlIHRoZSBgXy5pc0Zpbml0ZWAgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHxcbiAgICAgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gbnVtYmVyVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gICAgICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuOC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICAgICAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgICAgIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBSZWdFeHBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSByZWdleHAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1JlZ0V4cCgvYWJjLyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1JlZ0V4cCgnL2FiYy8nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1JlZ0V4cCA9IG5vZGVJc1JlZ0V4cCA/IGJhc2VVbmFyeShub2RlSXNSZWdFeHApIDogYmFzZUlzUmVnRXhwO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIuIEFuIGludGVnZXIgaXMgc2FmZSBpZiBpdCdzIGFuIElFRUUtNzU0XG4gICAgICogZG91YmxlIHByZWNpc2lvbiBudW1iZXIgd2hpY2ggaXNuJ3QgdGhlIHJlc3VsdCBvZiBhIHJvdW5kZWQgdW5zYWZlIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc1NhZmVJbnRlZ2VyYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzU2FmZUludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNhZmUgaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0ludGVnZXIodmFsdWUpICYmIHZhbHVlID49IC1NQVhfU0FGRV9JTlRFR0VSICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTZXRgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1NldChuZXcgU2V0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU2V0KG5ldyBXZWFrU2V0KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1NldCA9IG5vZGVJc1NldCA/IGJhc2VVbmFyeShub2RlSXNTZXQpIDogYmFzZUlzU2V0O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTdHJpbmcoJ2FiYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTdHJpbmcoMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZChudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFdlYWtNYXBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB3ZWFrIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha01hcChuZXcgV2Vha01hcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtNYXAobmV3IE1hcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1dlYWtNYXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gd2Vha01hcFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFdlYWtTZXRgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB3ZWFrIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha1NldChuZXcgV2Vha1NldCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtTZXQobmV3IFNldCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1dlYWtTZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHdlYWtTZXRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5ndFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmx0KDEsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8ubHQoMywgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8ubHQoMywgMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgbHQgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VMdCk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0b1xuICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmd0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBsdGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlIDw9IG90aGVyO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0FycmF5KHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkoJ2FiYycpO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KDEpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkobnVsbCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0FycmF5KHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSA/IHN0cmluZ1RvQXJyYXkodmFsdWUpIDogY29weUFycmF5KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzeW1JdGVyYXRvciAmJiB2YWx1ZVtzeW1JdGVyYXRvcl0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVG9BcnJheSh2YWx1ZVtzeW1JdGVyYXRvcl0oKSk7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICBmdW5jID0gdGFnID09IG1hcFRhZyA/IG1hcFRvQXJyYXkgOiAodGFnID09IHNldFRhZyA/IHNldFRvQXJyYXkgOiB2YWx1ZXMpO1xuXG4gICAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMi4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoMy4yKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gNWUtMzI0XG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICAgICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcigzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoJzMuMicpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlciBzdWl0YWJsZSBmb3IgdXNlIGFzIHRoZSBsZW5ndGggb2YgYW5cbiAgICAgKiBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDQyOTQ5NjcyOTVcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoJzMuMicpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0xlbmd0aCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID8gYmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksIDAsIE1BWF9BUlJBWV9MRU5HVEgpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b051bWJlcigzLjIpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqXG4gICAgICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiA1ZS0zMjRcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IEluZmluaXR5XG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBOQU47XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICAgICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gICAgICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICAgICAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgICAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcGxhaW4gb2JqZWN0IGZsYXR0ZW5pbmcgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nXG4gICAgICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29udmVydGVkIHBsYWluIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgbmV3IEZvbyk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBfLnRvUGxhaW5PYmplY3QobmV3IEZvbykpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGNvcHlPYmplY3QodmFsdWUsIGtleXNJbih2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzYWZlIGludGVnZXIuIEEgc2FmZSBpbnRlZ2VyIGNhbiBiZSBjb21wYXJlZCBhbmRcbiAgICAgKiByZXByZXNlbnRlZCBjb3JyZWN0bHkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcigzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDkwMDcxOTkyNTQ3NDA5OTFcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcignMy4yJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAtTUFYX1NBRkVfSU5URUdFUiwgTUFYX1NBRkVfSU5URUdFUilcbiAgICAgICAgOiAodmFsdWUgPT09IDAgPyB2YWx1ZSA6IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gICAgICogYW5kIGB1bmRlZmluZWRgIHZhbHVlcy4gVGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1N0cmluZyhudWxsKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqXG4gICAgICogXy50b1N0cmluZygtMCk7XG4gICAgICogLy8gPT4gJy0wJ1xuICAgICAqXG4gICAgICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+ICcxLDIsMydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyB0byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAgICAgKiBTdWJzZXF1ZW50IHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YCBhbmQgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAqIFtgT2JqZWN0LmFzc2lnbmBdKGh0dHBzOi8vbWRuLmlvL09iamVjdC9hc3NpZ24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduSW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBCYXIoKSB7XG4gICAgICogICB0aGlzLmMgPSAzO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gICAgICogQmFyLnByb3RvdHlwZS5kID0gNDtcbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ24gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgaWYgKGlzUHJvdG90eXBlKHNvdXJjZSkgfHwgaXNBcnJheUxpa2Uoc291cmNlKSkge1xuICAgICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIG93biBhbmRcbiAgICAgKiBpbmhlcml0ZWQgc291cmNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBleHRlbmRcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEJhcigpIHtcbiAgICAgKiAgIHRoaXMuYyA9IDM7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5iID0gMjtcbiAgICAgKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICAgICAqXG4gICAgICogXy5hc3NpZ25Jbih7ICdhJzogMCB9LCBuZXcgRm9vLCBuZXcgQmFyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMsICdkJzogNCB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbkluID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduSW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zXG4gICAgICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZXh0ZW5kV2l0aFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25XaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduSW5XaXRoLCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25JbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJuc1xuICAgICAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIGZpdmUgYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbkluV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbldpdGgsIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGBwYXRoc2Agb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcGlja2VkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8uYXQob2JqZWN0LCBbJ2FbMF0uYi5jJywgJ2FbMV0nXSk7XG4gICAgICogLy8gPT4gWzMsIDRdXG4gICAgICovXG4gICAgdmFyIGF0ID0gZmxhdFJlc3QoYmFzZUF0KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgYHByb3RvdHlwZWAgb2JqZWN0LiBJZiBhXG4gICAgICogYHByb3BlcnRpZXNgIG9iamVjdCBpcyBnaXZlbiwgaXRzIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzXG4gICAgICogYXJlIGFzc2lnbmVkIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc10gVGhlIHByb3BlcnRpZXMgdG8gYXNzaWduIHRvIHRoZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gU2hhcGUoKSB7XG4gICAgICogICB0aGlzLnggPSAwO1xuICAgICAqICAgdGhpcy55ID0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBDaXJjbGUoKSB7XG4gICAgICogICBTaGFwZS5jYWxsKHRoaXMpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIENpcmNsZS5wcm90b3R5cGUgPSBfLmNyZWF0ZShTaGFwZS5wcm90b3R5cGUsIHtcbiAgICAgKiAgICdjb25zdHJ1Y3Rvcic6IENpcmNsZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogdmFyIGNpcmNsZSA9IG5ldyBDaXJjbGU7XG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgQ2lyY2xlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNpcmNsZSBpbnN0YW5jZW9mIFNoYXBlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLCBwcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZUNyZWF0ZShwcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIHByb3BlcnRpZXMgPT0gbnVsbCA/IHJlc3VsdCA6IGJhc2VBc3NpZ24ocmVzdWx0LCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlXG4gICAgICogb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0aGF0XG4gICAgICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAqIE9uY2UgYSBwcm9wZXJ0eSBpcyBzZXQsIGFkZGl0aW9uYWwgdmFsdWVzIG9mIHRoZSBzYW1lIHByb3BlcnR5IGFyZSBpZ25vcmVkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmRlZmF1bHRzRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICAgICAgdmFyIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgICB2YXIgcHJvcHMgPSBrZXlzSW4oc291cmNlKTtcbiAgICAgICAgdmFyIHByb3BzSW5kZXggPSAtMTtcbiAgICAgICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICgrK3Byb3BzSW5kZXggPCBwcm9wc0xlbmd0aCkge1xuICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1twcm9wc0luZGV4XTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIChlcSh2YWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGVmYXVsdHNgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGFzc2lnbnNcbiAgICAgKiBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmRlZmF1bHRzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdHNEZWVwKHsgJ2EnOiB7ICdiJzogMiB9IH0sIHsgJ2EnOiB7ICdiJzogMSwgJ2MnOiAzIH0gfSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiAyLCAnYyc6IDMgfSB9XG4gICAgICovXG4gICAgdmFyIGRlZmF1bHRzRGVlcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgIGFyZ3MucHVzaCh1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UpO1xuICAgICAgcmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwgdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUga2V5IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiAnYmFybmV5JyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+ICdwZWJibGVzJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBiYXNlRm9yT3duKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRLZXlgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBhIGNvbGxlY3Rpb24gaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gcmV0dXJucyAncGViYmxlcycgYXNzdW1pbmcgYF8uZmluZEtleWAgcmV0dXJucyAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZExhc3RLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBiYXNlRmluZEtleShvYmplY3QsIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGJhc2VGb3JPd25SaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuXG4gICAgICogb2JqZWN0IGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXRcbiAgICAgKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvckluUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9ySW4obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJywgJ2InLCB0aGVuICdjJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JJbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiBiYXNlRm9yKG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpLCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9ySW5gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZlxuICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvckluXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvckluUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdjJywgJ2InLCB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JJbmAgbG9ncyAnYScsICdiJywgdGhlbiAnYycuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ySW5SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiBiYXNlRm9yUmlnaHQob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgYW5kXG4gICAgICogaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvblxuICAgICAqIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JPd25SaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JPd24obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yT3duKG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvck93bmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gICAgICogYG9iamVjdGAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9yT3duXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93blJpZ2h0KG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYicgdGhlbiAnYScgYXNzdW1pbmcgYF8uZm9yT3duYCBsb2dzICdhJyB0aGVuICdiJy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JPd25SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JPd25SaWdodChvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICAgKiBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqIEBzZWUgXy5mdW5jdGlvbnNJblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7XG4gICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZ1bmN0aW9ucyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBhbmQgaW5oZXJpdGVkXG4gICAgICogZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICogQHNlZSBfLmZ1bmN0aW9uc1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7XG4gICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmdW5jdGlvbnNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXNJbihvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpc1xuICAgICAqIGB1bmRlZmluZWRgLCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaW4gaXRzIHBsYWNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07XG4gICAgICogdmFyIG90aGVyID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgJ2EuYicpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob3RoZXIsICdhJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdhLmInKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNJbihvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgaW52ZXJ0ZWQga2V5cyBhbmQgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqIElmIGBvYmplY3RgIGNvbnRhaW5zIGR1cGxpY2F0ZSB2YWx1ZXMsIHN1YnNlcXVlbnQgdmFsdWVzIG92ZXJ3cml0ZVxuICAgICAqIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6ICdjJywgJzInOiAnYicgfVxuICAgICAqL1xuICAgIHZhciBpbnZlcnQgPSBjcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3ZhbHVlXSA9IGtleTtcbiAgICB9LCBjb25zdGFudChpZGVudGl0eSkpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnZlcnRgIGV4Y2VwdCB0aGF0IHRoZSBpbnZlcnRlZCBvYmplY3QgaXMgZ2VuZXJhdGVkXG4gICAgICogZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGVhY2ggZWxlbWVudCBvZiBgb2JqZWN0YCB0aHJ1IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGNvcnJlc3BvbmRpbmcgaW52ZXJ0ZWQgdmFsdWUgb2YgZWFjaCBpbnZlcnRlZCBrZXkgaXMgYW4gYXJyYXkgb2Yga2V5c1xuICAgICAqIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBpbnZlcnRlZCB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmludmVydEJ5KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICAgICAqXG4gICAgICogXy5pbnZlcnRCeShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gJ2dyb3VwJyArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2dyb3VwMSc6IFsnYScsICdjJ10sICdncm91cDInOiBbJ2InXSB9XG4gICAgICovXG4gICAgdmFyIGludmVydEJ5ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgdmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3ZhbHVlXSA9IFtrZXldO1xuICAgICAgfVxuICAgIH0sIGdldEl0ZXJhdGVlKTtcblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiBbMSwgMiwgMywgNF0gfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5pbnZva2Uob2JqZWN0LCAnYVswXS5iLmMuc2xpY2UnLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKi9cbiAgICB2YXIgaW52b2tlID0gYmFzZVJlc3QoYmFzZUludm9rZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gICAgICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmtleXMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogXy5rZXlzKCdoaScpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8ua2V5c0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5tYXBWYWx1ZXNgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZVxuICAgICAqIHNhbWUgdmFsdWVzIGFzIGBvYmplY3RgIGFuZCBrZXlzIGdlbmVyYXRlZCBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGVcbiAgICAgKiBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjguMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAqIEBzZWUgXy5tYXBWYWx1ZXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXBLZXlzKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgcmV0dXJuIGtleSArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2ExJzogMSwgJ2IyJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFzIGBvYmplY3RgIGFuZCB2YWx1ZXMgZ2VuZXJhdGVkXG4gICAgICogYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1XG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAgICAgKiBAc2VlIF8ubWFwS2V5c1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnZnJlZCc6ICAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWFwVmFsdWVzKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZTsgfSk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXBWYWx1ZXModXNlcnMsICdhZ2UnKTtcbiAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IG1lcmdlcyBvd24gYW5kXG4gICAgICogaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgaW50byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmVcbiAgICAgKiBza2lwcGVkIGlmIGEgZGVzdGluYXRpb24gdmFsdWUgZXhpc3RzLiBBcnJheSBhbmQgcGxhaW4gb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgKiBhcmUgbWVyZ2VkIHJlY3Vyc2l2ZWx5LiBPdGhlciBvYmplY3RzIGFuZCB2YWx1ZSB0eXBlcyBhcmUgb3ZlcnJpZGRlbiBieVxuICAgICAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudFxuICAgICAqIHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHtcbiAgICAgKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBvdGhlciA9IHtcbiAgICAgKiAgICdhJzogW3sgJ2MnOiAzIH0sIHsgJ2UnOiA1IH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWVyZ2Uob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2QnOiA0LCAnZSc6IDUgfV0gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZSA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCkge1xuICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1lcmdlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgbWVyZ2VkIHZhbHVlcyBvZiB0aGUgZGVzdGluYXRpb24gYW5kIHNvdXJjZVxuICAgICAqIHByb3BlcnRpZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBtZXJnaW5nIGlzIGhhbmRsZWQgYnkgdGhlXG4gICAgICogbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIHNpeCBhcmd1bWVudHM6XG4gICAgICogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gb2JqVmFsdWUuY29uY2F0KHNyY1ZhbHVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFsxXSwgJ2InOiBbMl0gfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogWzNdLCAnYic6IFs0XSB9O1xuICAgICAqXG4gICAgICogXy5tZXJnZVdpdGgob2JqZWN0LCBvdGhlciwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4geyAnYSc6IFsxLCAzXSwgJ2InOiBbMiwgNF0gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZVdpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnBpY2tgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGVcbiAgICAgKiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IHBhdGhzIG9mIGBvYmplY3RgIHRoYXQgYXJlIG5vdCBvbWl0dGVkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGNvbnNpZGVyYWJseSBzbG93ZXIgdGhhbiBgXy5waWNrYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIG9taXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLm9taXQob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgKi9cbiAgICB2YXIgb21pdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIGlzRGVlcCA9IGZhbHNlO1xuICAgICAgcGF0aHMgPSBhcnJheU1hcChwYXRocywgZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgICAgaXNEZWVwIHx8IChpc0RlZXAgPSBwYXRoLmxlbmd0aCA+IDEpO1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgIH0pO1xuICAgICAgY29weU9iamVjdChvYmplY3QsIGdldEFsbEtleXNJbihvYmplY3QpLCByZXN1bHQpO1xuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICByZXN1bHQgPSBiYXNlQ2xvbmUocmVzdWx0LCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9GTEFUX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbU9taXRDbG9uZSk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gcGF0aHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGJhc2VVbnNldChyZXN1bHQsIHBhdGhzW2xlbmd0aF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrQnlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZlxuICAgICAqIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgIHRoYXRcbiAgICAgKiBgcHJlZGljYXRlYCBkb2Vzbid0IHJldHVybiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0d29cbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5vbWl0Qnkob2JqZWN0LCBfLmlzTnVtYmVyKTtcbiAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbWl0Qnkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBwaWNrQnkob2JqZWN0LCBuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgYG9iamVjdGAgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICB2YXIgcGljayA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHt9IDogYmFzZVBpY2sob2JqZWN0LCBwYXRocyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgYG9iamVjdGAgcHJvcGVydGllcyBgcHJlZGljYXRlYCByZXR1cm5zXG4gICAgICogdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKHZhbHVlLCBrZXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2tCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBpY2tCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wcyA9IGFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLCBmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIHJldHVybiBbcHJvcF07XG4gICAgICB9KTtcbiAgICAgIHByZWRpY2F0ZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSk7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHByb3BzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gcHJlZGljYXRlKHZhbHVlLCBwYXRoWzBdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZ2V0YCBleGNlcHQgdGhhdCBpZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgYVxuICAgICAqIGZ1bmN0aW9uIGl0J3MgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBpdHMgcGFyZW50IG9iamVjdCBhbmRcbiAgICAgKiBpdHMgcmVzdWx0IGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gcmVzb2x2ZS5cbiAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MxJzogMywgJ2MyJzogXy5jb25zdGFudCg0KSB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzEnKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzInKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzMnLCAnZGVmYXVsdCcpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgXy5jb25zdGFudCgnZGVmYXVsdCcpKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN1bHQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBsb29wIGlzIGVudGVyZWQgd2hlbiBwYXRoIGlzIGVtcHR5LlxuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgICAgb2JqZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcbiAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3QgPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlLmNhbGwob2JqZWN0KSA6IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIGEgcG9ydGlvbiBvZiBgcGF0aGAgZG9lc24ndCBleGlzdCxcbiAgICAgKiBpdCdzIGNyZWF0ZWQuIEFycmF5cyBhcmUgY3JlYXRlZCBmb3IgbWlzc2luZyBpbmRleCBwcm9wZXJ0aWVzIHdoaWxlIG9iamVjdHNcbiAgICAgKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZVxuICAgICAqIGBwYXRoYCBjcmVhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uc2V0KG9iamVjdCwgJ2FbMF0uYi5jJywgNCk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdHMgb2YgYHBhdGhgLiAgSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgKiBwYXRoIGNyZWF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKG5zVmFsdWUsIGtleSwgbnNPYmplY3QpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHt9O1xuICAgICAqXG4gICAgICogXy5zZXRXaXRoKG9iamVjdCwgJ1swXVsxXScsICdhJywgT2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcwJzogeyAnMSc6ICdhJyB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXaXRoKG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnMgZm9yIGBvYmplY3RgXG4gICAgICogd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwIG9yIHNldCwgaXRzXG4gICAgICogZW50cmllcyBhcmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZW50cmllc1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnRvUGFpcnMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gW1snYScsIDFdLCBbJ2InLCAyXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgdG9QYWlycyA9IGNyZWF0ZVRvUGFpcnMoa2V5cyk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkLXZhbHVlIHBhaXJzXG4gICAgICogZm9yIGBvYmplY3RgIHdoaWNoIGNhbiBiZSBjb25zdW1lZCBieSBgXy5mcm9tUGFpcnNgLiBJZiBgb2JqZWN0YCBpcyBhIG1hcFxuICAgICAqIG9yIHNldCwgaXRzIGVudHJpZXMgYXJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGVudHJpZXNJblxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnRvUGFpcnNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMV0sIFsnYicsIDJdLCBbJ2MnLCAzXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgdG9QYWlyc0luID0gY3JlYXRlVG9QYWlycyhrZXlzSW4pO1xuXG4gICAgLyoqXG4gICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gYF8ucmVkdWNlYDsgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ld1xuICAgICAqIGBhY2N1bXVsYXRvcmAgb2JqZWN0IHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgcnVubmluZyBlYWNoIG9mIGl0cyBvd25cbiAgICAgKiBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIHRocnUgYGl0ZXJhdGVlYCwgd2l0aCBlYWNoIGludm9jYXRpb25cbiAgICAgKiBwb3RlbnRpYWxseSBtdXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIElmIGBhY2N1bXVsYXRvcmAgaXMgbm90XG4gICAgICogcHJvdmlkZWQsIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBzYW1lIGBbW1Byb3RvdHlwZV1dYCB3aWxsIGJlIHVzZWQuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmFuc2Zvcm0oWzIsIDMsIDRdLCBmdW5jdGlvbihyZXN1bHQsIG4pIHtcbiAgICAgKiAgIHJlc3VsdC5wdXNoKG4gKj0gbik7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9LCBbXSk7XG4gICAgICogLy8gPT4gWzQsIDldXG4gICAgICpcbiAgICAgKiBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICAgICAgaXNBcnJMaWtlID0gaXNBcnIgfHwgaXNCdWZmZXIob2JqZWN0KSB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KTtcblxuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCk7XG4gICAgICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgICAgICB2YXIgQ3RvciA9IG9iamVjdCAmJiBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICAgIGlmIChpc0Fyckxpa2UpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHByb3BlcnR5IGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDcgfSB9XSB9O1xuICAgICAqIF8udW5zZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IHt9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnVuc2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzoge30gfV0gfTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHRydWUgOiBiYXNlVW5zZXQob2JqZWN0LCBwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgYWNjZXB0cyBgdXBkYXRlcmAgdG8gcHJvZHVjZSB0aGVcbiAgICAgKiB2YWx1ZSB0byBzZXQuIFVzZSBgXy51cGRhdGVXaXRoYCB0byBjdXN0b21pemUgYHBhdGhgIGNyZWF0aW9uLiBUaGUgYHVwZGF0ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZShvYmplY3QsICdhWzBdLmIuYycsIGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gKiBuOyB9KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKlxuICAgICAqIF8udXBkYXRlKG9iamVjdCwgJ3hbMF0ueS56JywgZnVuY3Rpb24obikgeyByZXR1cm4gbiA/IG4gKyAxIDogMDsgfSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlKG9iamVjdCwgcGF0aCwgdXBkYXRlcikge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIGNhc3RGdW5jdGlvbih1cGRhdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51cGRhdGVgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBwcm9kdWNlIHRoZSBvYmplY3RzIG9mIGBwYXRoYC4gIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgXG4gICAgICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge307XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZVdpdGgob2JqZWN0LCAnWzBdWzFdJywgXy5jb25zdGFudCgnYScpLCBPYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzAnOiB7ICcxJzogJ2EnIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdpdGgob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlVXBkYXRlKG9iamVjdCwgcGF0aCwgY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy52YWx1ZXMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiBfLnZhbHVlcygnaGknKTtcbiAgICAgKiAvLyA9PiBbJ2gnLCAnaSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eVxuICAgICAqIHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udmFsdWVzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzSW4ob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ2xhbXBzIGBudW1iZXJgIHdpdGhpbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jbGFtcCgtMTAsIC01LCA1KTtcbiAgICAgKiAvLyA9PiAtNVxuICAgICAqXG4gICAgICogXy5jbGFtcCgxMCwgLTUsIDUpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICAgICAgaWYgKHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cHBlciA9IHRvTnVtYmVyKHVwcGVyKTtcbiAgICAgICAgdXBwZXIgPSB1cHBlciA9PT0gdXBwZXIgPyB1cHBlciA6IDA7XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb3dlciA9IHRvTnVtYmVyKGxvd2VyKTtcbiAgICAgICAgbG93ZXIgPSBsb3dlciA9PT0gbG93ZXIgPyBsb3dlciA6IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksIGxvd2VyLCB1cHBlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBuYCBpcyBiZXR3ZWVuIGBzdGFydGAgYW5kIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIElmXG4gICAgICogYGVuZGAgaXMgbm90IHNwZWNpZmllZCwgaXQncyBzZXQgdG8gYHN0YXJ0YCB3aXRoIGBzdGFydGAgdGhlbiBzZXQgdG8gYDBgLlxuICAgICAqIElmIGBzdGFydGAgaXMgZ3JlYXRlciB0aGFuIGBlbmRgIHRoZSBwYXJhbXMgYXJlIHN3YXBwZWQgdG8gc3VwcG9ydFxuICAgICAqIG5lZ2F0aXZlIHJhbmdlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjMuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBudW1iZXJgIGlzIGluIHRoZSByYW5nZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5yYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgzLCAyLCA0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNCwgOCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDQsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMiwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgxLjIsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg1LjIsIDQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoLTMsIC0yLCAtNik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gICAgICBzdGFydCA9IHRvRmluaXRlKHN0YXJ0KTtcbiAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgIH1cbiAgICAgIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7XG4gICAgICByZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAqIElmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGEgbnVtYmVyIGJldHdlZW4gYDBgIGFuZCB0aGUgZ2l2ZW4gbnVtYmVyXG4gICAgICogaXMgcmV0dXJuZWQuIElmIGBmbG9hdGluZ2AgaXMgYHRydWVgLCBvciBlaXRoZXIgYGxvd2VyYCBvciBgdXBwZXJgIGFyZVxuICAgICAqIGZsb2F0cywgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB3aGljaCBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcj0wXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt1cHBlcj0xXSBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZmxvYXRpbmddIFNwZWNpZnkgcmV0dXJuaW5nIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDAsIDUpO1xuICAgICAqIC8vID0+IGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSg1KTtcbiAgICAgKiAvLyA9PiBhbHNvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSg1LCB0cnVlKTtcbiAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDEuMiwgNS4yKTtcbiAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDEuMiBhbmQgNS4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmFuZG9tKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpIHtcbiAgICAgIGlmIChmbG9hdGluZyAmJiB0eXBlb2YgZmxvYXRpbmcgIT0gJ2Jvb2xlYW4nICYmIGlzSXRlcmF0ZWVDYWxsKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpKSB7XG4gICAgICAgIHVwcGVyID0gZmxvYXRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoZmxvYXRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIHVwcGVyID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gdXBwZXI7XG4gICAgICAgICAgdXBwZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxvd2VyID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gbG93ZXI7XG4gICAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciA9PT0gdW5kZWZpbmVkICYmIHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG93ZXIgPSAwO1xuICAgICAgICB1cHBlciA9IDE7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbG93ZXIgPSB0b0Zpbml0ZShsb3dlcik7XG4gICAgICAgIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgICBsb3dlciA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBwZXIgPSB0b0Zpbml0ZSh1cHBlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciA+IHVwcGVyKSB7XG4gICAgICAgIHZhciB0ZW1wID0gbG93ZXI7XG4gICAgICAgIGxvd2VyID0gdXBwZXI7XG4gICAgICAgIHVwcGVyID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZyB8fCBsb3dlciAlIDEgfHwgdXBwZXIgJSAxKSB7XG4gICAgICAgIHZhciByYW5kID0gbmF0aXZlUmFuZG9tKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVNaW4obG93ZXIgKyAocmFuZCAqICh1cHBlciAtIGxvd2VyICsgZnJlZVBhcnNlRmxvYXQoJzFlLScgKyAoKHJhbmQgKyAnJykubGVuZ3RoIC0gMSkpKSksIHVwcGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmFuZG9tKGxvd2VyLCB1cHBlcik7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gW2NhbWVsIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhbWVsQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYW1lbCBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqL1xuICAgIHZhciBjYW1lbENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHdvcmQgPSB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gY2FwaXRhbGl6ZSh3b3JkKSA6IHdvcmQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlIGFuZCB0aGUgcmVtYWluaW5nXG4gICAgICogdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNhcGl0YWxpemVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYXBpdGFsaXplKCdGUkVEJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpIHtcbiAgICAgIHJldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVidXJycyBgc3RyaW5nYCBieSBjb252ZXJ0aW5nXG4gICAgICogW0xhdGluLTEgU3VwcGxlbWVudF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW4tMV9TdXBwbGVtZW50XyhVbmljb2RlX2Jsb2NrKSNDaGFyYWN0ZXJfdGFibGUpXG4gICAgICogYW5kIFtMYXRpbiBFeHRlbmRlZC1BXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbl9FeHRlbmRlZC1BKVxuICAgICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycyBhbmQgcmVtb3ZpbmdcbiAgICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGRlYnVyci5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVidXJyKCdkw6lqw6AgdnUnKTtcbiAgICAgKiAvLyA9PiAnZGVqYSB2dSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWJ1cnIoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIHN0cmluZyAmJiBzdHJpbmcucmVwbGFjZShyZUxhdGluLCBkZWJ1cnJMZXR0ZXIpLnJlcGxhY2UocmVDb21ib01hcmssICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgZW5kcyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Bvc2l0aW9uPXN0cmluZy5sZW5ndGhdIFRoZSBwb3NpdGlvbiB0byBzZWFyY2ggdXAgdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIGVuZHMgd2l0aCBgdGFyZ2V0YCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdiJywgMik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZywgdGFyZ2V0LCBwb3NpdGlvbikge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHRhcmdldCA9IGJhc2VUb1N0cmluZyh0YXJnZXQpO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gPT09IHVuZGVmaW5lZFxuICAgICAgICA/IGxlbmd0aFxuICAgICAgICA6IGJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLCAwLCBsZW5ndGgpO1xuXG4gICAgICB2YXIgZW5kID0gcG9zaXRpb247XG4gICAgICBwb3NpdGlvbiAtPSB0YXJnZXQubGVuZ3RoO1xuICAgICAgcmV0dXJuIHBvc2l0aW9uID49IDAgJiYgc3RyaW5nLnNsaWNlKHBvc2l0aW9uLCBlbmQpID09IHRhcmdldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgY2hhcmFjdGVycyBcIiZcIiwgXCI8XCIsIFwiPlwiLCAnXCInLCBhbmQgXCInXCIgaW4gYHN0cmluZ2AgdG8gdGhlaXJcbiAgICAgKiBjb3JyZXNwb25kaW5nIEhUTUwgZW50aXRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm8gb3RoZXIgY2hhcmFjdGVycyBhcmUgZXNjYXBlZC4gVG8gZXNjYXBlIGFkZGl0aW9uYWxcbiAgICAgKiBjaGFyYWN0ZXJzIHVzZSBhIHRoaXJkLXBhcnR5IGxpYnJhcnkgbGlrZSBbX2hlX10oaHR0cHM6Ly9tdGhzLmJlL2hlKS5cbiAgICAgKlxuICAgICAqIFRob3VnaCB0aGUgXCI+XCIgY2hhcmFjdGVyIGlzIGVzY2FwZWQgZm9yIHN5bW1ldHJ5LCBjaGFyYWN0ZXJzIGxpa2VcbiAgICAgKiBcIj5cIiBhbmQgXCIvXCIgZG9uJ3QgbmVlZCBlc2NhcGluZyBpbiBIVE1MIGFuZCBoYXZlIG5vIHNwZWNpYWwgbWVhbmluZ1xuICAgICAqIHVubGVzcyB0aGV5J3JlIHBhcnQgb2YgYSB0YWcgb3IgdW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlLiBTZWVcbiAgICAgKiBbTWF0aGlhcyBCeW5lbnMncyBhcnRpY2xlXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvYW1iaWd1b3VzLWFtcGVyc2FuZHMpXG4gICAgICogKHVuZGVyIFwic2VtaS1yZWxhdGVkIGZ1biBmYWN0XCIpIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBXaGVuIHdvcmtpbmcgd2l0aCBIVE1MIHlvdSBzaG91bGQgYWx3YXlzXG4gICAgICogW3F1b3RlIGF0dHJpYnV0ZSB2YWx1ZXNdKGh0dHA6Ly93b25rby5jb20vcG9zdC9odG1sLWVzY2FwaW5nKSB0byByZWR1Y2VcbiAgICAgKiBYU1MgdmVjdG9ycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXNjYXBlKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXNjYXBlKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzVW5lc2NhcGVkSHRtbC50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVVbmVzY2FwZWRIdG1sLCBlc2NhcGVIdG1sQ2hhcilcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNjYXBlcyB0aGUgYFJlZ0V4cGAgc3BlY2lhbCBjaGFyYWN0ZXJzIFwiXlwiLCBcIiRcIiwgXCJcXFwiLCBcIi5cIiwgXCIqXCIsIFwiK1wiLFxuICAgICAqIFwiP1wiLCBcIihcIiwgXCIpXCIsIFwiW1wiLCBcIl1cIiwgXCJ7XCIsIFwifVwiLCBhbmQgXCJ8XCIgaW4gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVzY2FwZVJlZ0V4cCgnW2xvZGFzaF0oaHR0cHM6Ly9sb2Rhc2guY29tLyknKTtcbiAgICAgKiAvLyA9PiAnXFxbbG9kYXNoXFxdXFwoaHR0cHM6Ly9sb2Rhc2hcXC5jb20vXFwpJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc1JlZ0V4cENoYXIudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gICAgICogW2tlYmFiIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldHRlcl9jYXNlI1NwZWNpYWxfY2FzZV9zdHlsZXMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUga2ViYWIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICovXG4gICAgdmFyIGtlYmFiQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICctJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBzcGFjZSBzZXBhcmF0ZWQgd29yZHMsIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBsb3dlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCctLUZvby1CYXItLScpO1xuICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAqXG4gICAgICogXy5sb3dlckNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAqXG4gICAgICogXy5sb3dlckNhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICovXG4gICAgdmFyIGxvd2VyQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICcgJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubG93ZXJGaXJzdCgnRnJlZCcpO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogXy5sb3dlckZpcnN0KCdGUkVEJyk7XG4gICAgICogLy8gPT4gJ2ZSRUQnXG4gICAgICovXG4gICAgdmFyIGxvd2VyRmlyc3QgPSBjcmVhdGVDYXNlRmlyc3QoJ3RvTG93ZXJDYXNlJyk7XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlcyBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC5cbiAgICAgKiBQYWRkaW5nIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGNhbid0IGJlIGV2ZW5seSBkaXZpZGVkIGJ5IGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCA4KTtcbiAgICAgKiAvLyA9PiAnICBhYmMgICAnXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgOCwgJ18tJyk7XG4gICAgICogLy8gPT4gJ18tYWJjXy1fJ1xuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDMpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFkKHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGxlbmd0aCA9IHRvSW50ZWdlcihsZW5ndGgpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgICAgIGlmICghbGVuZ3RoIHx8IHN0ckxlbmd0aCA+PSBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBtaWQgPSAobGVuZ3RoIC0gc3RyTGVuZ3RoKSAvIDI7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjcmVhdGVQYWRkaW5nKG5hdGl2ZUZsb29yKG1pZCksIGNoYXJzKSArXG4gICAgICAgIHN0cmluZyArXG4gICAgICAgIGNyZWF0ZVBhZGRpbmcobmF0aXZlQ2VpbChtaWQpLCBjaGFycylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgcmlnaHQgc2lkZSBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC4gUGFkZGluZ1xuICAgICAqIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGV4Y2VlZCBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgNik7XG4gICAgICogLy8gPT4gJ2FiYyAgICdcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCA2LCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnYWJjXy1fJ1xuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDMpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFkRW5kKHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGxlbmd0aCA9IHRvSW50ZWdlcihsZW5ndGgpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgICAgIHJldHVybiAobGVuZ3RoICYmIHN0ckxlbmd0aCA8IGxlbmd0aClcbiAgICAgICAgPyAoc3RyaW5nICsgY3JlYXRlUGFkZGluZyhsZW5ndGggLSBzdHJMZW5ndGgsIGNoYXJzKSlcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gICAgICogY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgZXhjZWVkIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDYpO1xuICAgICAqIC8vID0+ICcgICBhYmMnXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCA2LCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnXy1fYWJjJ1xuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWRTdGFydChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICByZXR1cm4gKGxlbmd0aCAmJiBzdHJMZW5ndGggPCBsZW5ndGgpXG4gICAgICAgID8gKGNyZWF0ZVBhZGRpbmcobGVuZ3RoIC0gc3RyTGVuZ3RoLCBjaGFycykgKyBzdHJpbmcpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGludGVnZXIgb2YgdGhlIHNwZWNpZmllZCByYWRpeC4gSWYgYHJhZGl4YCBpc1xuICAgICAqIGB1bmRlZmluZWRgIG9yIGAwYCwgYSBgcmFkaXhgIG9mIGAxMGAgaXMgdXNlZCB1bmxlc3MgYHZhbHVlYCBpcyBhXG4gICAgICogaGV4YWRlY2ltYWwsIGluIHdoaWNoIGNhc2UgYSBgcmFkaXhgIG9mIGAxNmAgaXMgdXNlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBhbGlnbnMgd2l0aCB0aGVcbiAgICAgKiBbRVM1IGltcGxlbWVudGF0aW9uXShodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS4xLjIuMikgb2YgYHBhcnNlSW50YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl4PTEwXSBUaGUgcmFkaXggdG8gaW50ZXJwcmV0IGB2YWx1ZWAgYnkuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYXJzZUludCgnMDgnKTtcbiAgICAgKiAvLyA9PiA4XG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnMDgnLCAnMTAnXSwgXy5wYXJzZUludCk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhcnNlSW50KHN0cmluZywgcmFkaXgsIGd1YXJkKSB7XG4gICAgICBpZiAoZ3VhcmQgfHwgcmFkaXggPT0gbnVsbCkge1xuICAgICAgICByYWRpeCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHJhZGl4KSB7XG4gICAgICAgIHJhZGl4ID0gK3JhZGl4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hdGl2ZVBhcnNlSW50KHRvU3RyaW5nKHN0cmluZykucmVwbGFjZShyZVRyaW1TdGFydCwgJycpLCByYWRpeCB8fCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBlYXRzIHRoZSBnaXZlbiBzdHJpbmcgYG5gIHRpbWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHJlcGVhdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJlcGVhdGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZXBlYXQoJyonLCAzKTtcbiAgICAgKiAvLyA9PiAnKioqJ1xuICAgICAqXG4gICAgICogXy5yZXBlYXQoJ2FiYycsIDIpO1xuICAgICAqIC8vID0+ICdhYmNhYmMnXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnYWJjJywgMCk7XG4gICAgICogLy8gPT4gJydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBlYXQoc3RyaW5nLCBuLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgbiwgZ3VhcmQpIDogbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBuID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVJlcGVhdCh0b1N0cmluZyhzdHJpbmcpLCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyBtYXRjaGVzIGZvciBgcGF0dGVybmAgaW4gYHN0cmluZ2Agd2l0aCBgcmVwbGFjZW1lbnRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BTdHJpbmcjcmVwbGFjZWBdKGh0dHBzOi8vbWRuLmlvL1N0cmluZy9yZXBsYWNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IHJlcGxhY2VtZW50IFRoZSBtYXRjaCByZXBsYWNlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtb2RpZmllZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmVwbGFjZSgnSGkgRnJlZCcsICdGcmVkJywgJ0Jhcm5leScpO1xuICAgICAqIC8vID0+ICdIaSBCYXJuZXknXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZSgpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgIHN0cmluZyA9IHRvU3RyaW5nKGFyZ3NbMF0pO1xuXG4gICAgICByZXR1cm4gYXJncy5sZW5ndGggPCAzID8gc3RyaW5nIDogc3RyaW5nLnJlcGxhY2UoYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBbc25ha2UgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU25ha2VfY2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzbmFrZSBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb19iYXInXG4gICAgICpcbiAgICAgKiBfLnNuYWtlQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb19iYXInXG4gICAgICpcbiAgICAgKiBfLnNuYWtlQ2FzZSgnLS1GT08tQkFSLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKi9cbiAgICB2YXIgc25ha2VDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJ18nIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogU3BsaXRzIGBzdHJpbmdgIGJ5IGBzZXBhcmF0b3JgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BTdHJpbmcjc3BsaXRgXShodHRwczovL21kbi5pby9TdHJpbmcvc3BsaXQpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHNwbGl0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gc2VwYXJhdG9yIFRoZSBzZXBhcmF0b3IgcGF0dGVybiB0byBzcGxpdCBieS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xpbWl0XSBUaGUgbGVuZ3RoIHRvIHRydW5jYXRlIHJlc3VsdHMgdG8uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzdHJpbmcgc2VnbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3BsaXQoJ2EtYi1jJywgJy0nLCAyKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3BsaXQoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICBpZiAobGltaXQgJiYgdHlwZW9mIGxpbWl0ICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCkpIHtcbiAgICAgICAgc2VwYXJhdG9yID0gbGltaXQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBsaW1pdCA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfQVJSQVlfTEVOR1RIIDogbGltaXQgPj4+IDA7XG4gICAgICBpZiAoIWxpbWl0KSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChcbiAgICAgICAgICAgIHR5cGVvZiBzZXBhcmF0b3IgPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIChzZXBhcmF0b3IgIT0gbnVsbCAmJiAhaXNSZWdFeHAoc2VwYXJhdG9yKSlcbiAgICAgICAgICApKSB7XG4gICAgICAgIHNlcGFyYXRvciA9IGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpO1xuICAgICAgICBpZiAoIXNlcGFyYXRvciAmJiBoYXNVbmljb2RlKHN0cmluZykpIHtcbiAgICAgICAgICByZXR1cm4gY2FzdFNsaWNlKHN0cmluZ1RvQXJyYXkoc3RyaW5nKSwgMCwgbGltaXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5nLnNwbGl0KHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gICAgICogW3N0YXJ0IGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldHRlcl9jYXNlI1N0eWxpc3RpY19vcl9zcGVjaWFsaXNlZF91c2FnZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdGFydCBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICdGb28gQmFyJ1xuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdGb28gQmFyJ1xuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICovXG4gICAgdmFyIHN0YXJ0Q2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICcgJyA6ICcnKSArIHVwcGVyRmlyc3Qod29yZCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggdGhlIGdpdmVuIHRhcmdldCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhcmdldF0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9zaXRpb249MF0gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgc3RyaW5nYCBzdGFydHMgd2l0aCBgdGFyZ2V0YCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdiJywgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyaW5nLCB0YXJnZXQsIHBvc2l0aW9uKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PSBudWxsXG4gICAgICAgID8gMFxuICAgICAgICA6IGJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLCAwLCBzdHJpbmcubGVuZ3RoKTtcblxuICAgICAgdGFyZ2V0ID0gYmFzZVRvU3RyaW5nKHRhcmdldCk7XG4gICAgICByZXR1cm4gc3RyaW5nLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIHRhcmdldC5sZW5ndGgpID09IHRhcmdldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY29tcGlsZWQgdGVtcGxhdGUgZnVuY3Rpb24gdGhhdCBjYW4gaW50ZXJwb2xhdGUgZGF0YSBwcm9wZXJ0aWVzXG4gICAgICogaW4gXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlcnMsIEhUTUwtZXNjYXBlIGludGVycG9sYXRlZCBkYXRhIHByb3BlcnRpZXMgaW5cbiAgICAgKiBcImVzY2FwZVwiIGRlbGltaXRlcnMsIGFuZCBleGVjdXRlIEphdmFTY3JpcHQgaW4gXCJldmFsdWF0ZVwiIGRlbGltaXRlcnMuIERhdGFcbiAgICAgKiBwcm9wZXJ0aWVzIG1heSBiZSBhY2Nlc3NlZCBhcyBmcmVlIHZhcmlhYmxlcyBpbiB0aGUgdGVtcGxhdGUuIElmIGEgc2V0dGluZ1xuICAgICAqIG9iamVjdCBpcyBnaXZlbiwgaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGBfLnRlbXBsYXRlU2V0dGluZ3NgIHZhbHVlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJbiB0aGUgZGV2ZWxvcG1lbnQgYnVpbGQgYF8udGVtcGxhdGVgIHV0aWxpemVzXG4gICAgICogW3NvdXJjZVVSTHNdKGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0b3JpYWxzL2RldmVsb3BlcnRvb2xzL3NvdXJjZW1hcHMvI3RvYy1zb3VyY2V1cmwpXG4gICAgICogZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwcmVjb21waWxpbmcgdGVtcGxhdGVzIHNlZVxuICAgICAqIFtsb2Rhc2gncyBjdXN0b20gYnVpbGRzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vbG9kYXNoLmNvbS9jdXN0b20tYnVpbGRzKS5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIENocm9tZSBleHRlbnNpb24gc2FuZGJveGVzIHNlZVxuICAgICAqIFtDaHJvbWUncyBleHRlbnNpb25zIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZXh0ZW5zaW9ucy9zYW5kYm94aW5nRXZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSB0ZW1wbGF0ZSBzdHJpbmcuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmVzY2FwZT1fLnRlbXBsYXRlU2V0dGluZ3MuZXNjYXBlXVxuICAgICAqICBUaGUgSFRNTCBcImVzY2FwZVwiIGRlbGltaXRlci5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuZXZhbHVhdGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmV2YWx1YXRlXVxuICAgICAqICBUaGUgXCJldmFsdWF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuaW1wb3J0cz1fLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c11cbiAgICAgKiAgQW4gb2JqZWN0IHRvIGltcG9ydCBpbnRvIHRoZSB0ZW1wbGF0ZSBhcyBmcmVlIHZhcmlhYmxlcy5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuaW50ZXJwb2xhdGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmludGVycG9sYXRlXVxuICAgICAqICBUaGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc291cmNlVVJMPSdsb2Rhc2gudGVtcGxhdGVTb3VyY2VzW25dJ11cbiAgICAgKiAgVGhlIHNvdXJjZVVSTCBvZiB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnZhcmlhYmxlPSdvYmonXVxuICAgICAqICBUaGUgZGF0YSBvYmplY3QgdmFyaWFibGUgbmFtZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgY29tcGlsZWQgdGVtcGxhdGUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlciB0byBjcmVhdGUgYSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8JT0gdXNlciAlPiEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ2ZyZWQnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgSFRNTCBcImVzY2FwZVwiIGRlbGltaXRlciB0byBlc2NhcGUgZGF0YSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPGI+PCUtIHZhbHVlICU+PC9iPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3ZhbHVlJzogJzxzY3JpcHQ+JyB9KTtcbiAgICAgKiAvLyA9PiAnPGI+Jmx0O3NjcmlwdCZndDs8L2I+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBcImV2YWx1YXRlXCIgZGVsaW1pdGVyIHRvIGV4ZWN1dGUgSmF2YVNjcmlwdCBhbmQgZ2VuZXJhdGUgSFRNTC5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JSBfLmZvckVhY2godXNlcnMsIGZ1bmN0aW9uKHVzZXIpIHsgJT48bGk+PCUtIHVzZXIgJT48L2xpPjwlIH0pOyAlPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXJzJzogWydmcmVkJywgJ2Jhcm5leSddIH0pO1xuICAgICAqIC8vID0+ICc8bGk+ZnJlZDwvbGk+PGxpPmJhcm5leTwvbGk+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBpbnRlcm5hbCBgcHJpbnRgIGZ1bmN0aW9uIGluIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXJzLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlIHByaW50KFwiaGVsbG8gXCIgKyB1c2VyKTsgJT4hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdiYXJuZXknIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBiYXJuZXkhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBFUyB0ZW1wbGF0ZSBsaXRlcmFsIGRlbGltaXRlciBhcyBhbiBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIC8vIERpc2FibGUgc3VwcG9ydCBieSByZXBsYWNpbmcgdGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gJHsgdXNlciB9IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAncGViYmxlcycgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIHBlYmJsZXMhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIGJhY2tzbGFzaGVzIHRvIHRyZWF0IGRlbGltaXRlcnMgYXMgcGxhaW4gdGV4dC5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JT0gXCJcXFxcPCUtIHZhbHVlICVcXFxcPlwiICU+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndmFsdWUnOiAnaWdub3JlZCcgfSk7XG4gICAgICogLy8gPT4gJzwlLSB2YWx1ZSAlPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYGltcG9ydHNgIG9wdGlvbiB0byBpbXBvcnQgYGpRdWVyeWAgYXMgYGpxYC5cbiAgICAgKiB2YXIgdGV4dCA9ICc8JSBqcS5lYWNoKHVzZXJzLCBmdW5jdGlvbih1c2VyKSB7ICU+PGxpPjwlLSB1c2VyICU+PC9saT48JSB9KTsgJT4nO1xuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUodGV4dCwgeyAnaW1wb3J0cyc6IHsgJ2pxJzogalF1ZXJ5IH0gfSk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcnMnOiBbJ2ZyZWQnLCAnYmFybmV5J10gfSk7XG4gICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBzb3VyY2VVUkxgIG9wdGlvbiB0byBzcGVjaWZ5IGEgY3VzdG9tIHNvdXJjZVVSTCBmb3IgdGhlIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScsIHsgJ3NvdXJjZVVSTCc6ICcvYmFzaWMvZ3JlZXRpbmcuanN0JyB9KTtcbiAgICAgKiBjb21waWxlZChkYXRhKTtcbiAgICAgKiAvLyA9PiBGaW5kIHRoZSBzb3VyY2Ugb2YgXCJncmVldGluZy5qc3RcIiB1bmRlciB0aGUgU291cmNlcyB0YWIgb3IgUmVzb3VyY2VzIHBhbmVsIG9mIHRoZSB3ZWIgaW5zcGVjdG9yLlxuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgdmFyaWFibGVgIG9wdGlvbiB0byBlbnN1cmUgYSB3aXRoLXN0YXRlbWVudCBpc24ndCB1c2VkIGluIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoaSA8JT0gZGF0YS51c2VyICU+IScsIHsgJ3ZhcmlhYmxlJzogJ2RhdGEnIH0pO1xuICAgICAqIGNvbXBpbGVkLnNvdXJjZTtcbiAgICAgKiAvLyA9PiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICogLy8gICB2YXIgX190LCBfX3AgPSAnJztcbiAgICAgKiAvLyAgIF9fcCArPSAnaGkgJyArICgoX190ID0gKCBkYXRhLnVzZXIgKSkgPT0gbnVsbCA/ICcnIDogX190KSArICchJztcbiAgICAgKiAvLyAgIHJldHVybiBfX3A7XG4gICAgICogLy8gfVxuICAgICAqXG4gICAgICogLy8gVXNlIGN1c3RvbSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLlxuICAgICAqIF8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZSA9IC97eyhbXFxzXFxTXSs/KX19L2c7XG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8ge3sgdXNlciB9fSEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ211c3RhY2hlJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gbXVzdGFjaGUhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgc291cmNlYCBwcm9wZXJ0eSB0byBpbmxpbmUgY29tcGlsZWQgdGVtcGxhdGVzIGZvciBtZWFuaW5nZnVsXG4gICAgICogLy8gbGluZSBudW1iZXJzIGluIGVycm9yIG1lc3NhZ2VzIGFuZCBzdGFjayB0cmFjZXMuXG4gICAgICogZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2pzdC5qcycpLCAnXFxcbiAgICAgKiAgIHZhciBKU1QgPSB7XFxcbiAgICAgKiAgICAgXCJtYWluXCI6ICcgKyBfLnRlbXBsYXRlKG1haW5UZXh0KS5zb3VyY2UgKyAnXFxcbiAgICAgKiAgIH07XFxcbiAgICAgKiAnKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0ZW1wbGF0ZShzdHJpbmcsIG9wdGlvbnMsIGd1YXJkKSB7XG4gICAgICAvLyBCYXNlZCBvbiBKb2huIFJlc2lnJ3MgYHRtcGxgIGltcGxlbWVudGF0aW9uXG4gICAgICAvLyAoaHR0cDovL2Vqb2huLm9yZy9ibG9nL2phdmFzY3JpcHQtbWljcm8tdGVtcGxhdGluZy8pXG4gICAgICAvLyBhbmQgTGF1cmEgRG9rdG9yb3ZhJ3MgZG9ULmpzIChodHRwczovL2dpdGh1Yi5jb20vb2xhZG8vZG9UKS5cbiAgICAgIHZhciBzZXR0aW5ncyA9IGxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzO1xuXG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBvcHRpb25zLCBndWFyZCkpIHtcbiAgICAgICAgb3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBvcHRpb25zID0gYXNzaWduSW5XaXRoKHt9LCBvcHRpb25zLCBzZXR0aW5ncywgY3VzdG9tRGVmYXVsdHNBc3NpZ25Jbik7XG5cbiAgICAgIHZhciBpbXBvcnRzID0gYXNzaWduSW5XaXRoKHt9LCBvcHRpb25zLmltcG9ydHMsIHNldHRpbmdzLmltcG9ydHMsIGN1c3RvbURlZmF1bHRzQXNzaWduSW4pLFxuICAgICAgICAgIGltcG9ydHNLZXlzID0ga2V5cyhpbXBvcnRzKSxcbiAgICAgICAgICBpbXBvcnRzVmFsdWVzID0gYmFzZVZhbHVlcyhpbXBvcnRzLCBpbXBvcnRzS2V5cyk7XG5cbiAgICAgIHZhciBpc0VzY2FwaW5nLFxuICAgICAgICAgIGlzRXZhbHVhdGluZyxcbiAgICAgICAgICBpbmRleCA9IDAsXG4gICAgICAgICAgaW50ZXJwb2xhdGUgPSBvcHRpb25zLmludGVycG9sYXRlIHx8IHJlTm9NYXRjaCxcbiAgICAgICAgICBzb3VyY2UgPSBcIl9fcCArPSAnXCI7XG5cbiAgICAgIC8vIENvbXBpbGUgdGhlIHJlZ2V4cCB0byBtYXRjaCBlYWNoIGRlbGltaXRlci5cbiAgICAgIHZhciByZURlbGltaXRlcnMgPSBSZWdFeHAoXG4gICAgICAgIChvcHRpb25zLmVzY2FwZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JyArXG4gICAgICAgIGludGVycG9sYXRlLnNvdXJjZSArICd8JyArXG4gICAgICAgIChpbnRlcnBvbGF0ZSA9PT0gcmVJbnRlcnBvbGF0ZSA/IHJlRXNUZW1wbGF0ZSA6IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICAgICAgKG9wdGlvbnMuZXZhbHVhdGUgfHwgcmVOb01hdGNoKS5zb3VyY2UgKyAnfCQnXG4gICAgICAsICdnJyk7XG5cbiAgICAgIC8vIFVzZSBhIHNvdXJjZVVSTCBmb3IgZWFzaWVyIGRlYnVnZ2luZy5cbiAgICAgIHZhciBzb3VyY2VVUkwgPSAnLy8jIHNvdXJjZVVSTD0nICtcbiAgICAgICAgKCdzb3VyY2VVUkwnIGluIG9wdGlvbnNcbiAgICAgICAgICA/IG9wdGlvbnMuc291cmNlVVJMXG4gICAgICAgICAgOiAoJ2xvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbJyArICgrK3RlbXBsYXRlQ291bnRlcikgKyAnXScpXG4gICAgICAgICkgKyAnXFxuJztcblxuICAgICAgc3RyaW5nLnJlcGxhY2UocmVEZWxpbWl0ZXJzLCBmdW5jdGlvbihtYXRjaCwgZXNjYXBlVmFsdWUsIGludGVycG9sYXRlVmFsdWUsIGVzVGVtcGxhdGVWYWx1ZSwgZXZhbHVhdGVWYWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIGludGVycG9sYXRlVmFsdWUgfHwgKGludGVycG9sYXRlVmFsdWUgPSBlc1RlbXBsYXRlVmFsdWUpO1xuXG4gICAgICAgIC8vIEVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgY2FuJ3QgYmUgaW5jbHVkZWQgaW4gc3RyaW5nIGxpdGVyYWxzLlxuICAgICAgICBzb3VyY2UgKz0gc3RyaW5nLnNsaWNlKGluZGV4LCBvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsIGVzY2FwZVN0cmluZ0NoYXIpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgZGVsaW1pdGVycyB3aXRoIHNuaXBwZXRzLlxuICAgICAgICBpZiAoZXNjYXBlVmFsdWUpIHtcbiAgICAgICAgICBpc0VzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInICtcXG5fX2UoXCIgKyBlc2NhcGVWYWx1ZSArIFwiKSArXFxuJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgICAgaXNFdmFsdWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInO1xcblwiICsgZXZhbHVhdGVWYWx1ZSArIFwiO1xcbl9fcCArPSAnXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVycG9sYXRlVmFsdWUpIHtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInICtcXG4oKF9fdCA9IChcIiArIGludGVycG9sYXRlVmFsdWUgKyBcIikpID09IG51bGwgPyAnJyA6IF9fdCkgK1xcbidcIjtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IG9mZnNldCArIG1hdGNoLmxlbmd0aDtcblxuICAgICAgICAvLyBUaGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIHByb2R1Y3RzIG5lZWRzIGBtYXRjaGAgcmV0dXJuZWQgaW5cbiAgICAgICAgLy8gb3JkZXIgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBgb2Zmc2V0YCB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfSk7XG5cbiAgICAgIHNvdXJjZSArPSBcIic7XFxuXCI7XG5cbiAgICAgIC8vIElmIGB2YXJpYWJsZWAgaXMgbm90IHNwZWNpZmllZCB3cmFwIGEgd2l0aC1zdGF0ZW1lbnQgYXJvdW5kIHRoZSBnZW5lcmF0ZWRcbiAgICAgIC8vIGNvZGUgdG8gYWRkIHRoZSBkYXRhIG9iamVjdCB0byB0aGUgdG9wIG9mIHRoZSBzY29wZSBjaGFpbi5cbiAgICAgIHZhciB2YXJpYWJsZSA9IG9wdGlvbnMudmFyaWFibGU7XG4gICAgICBpZiAoIXZhcmlhYmxlKSB7XG4gICAgICAgIHNvdXJjZSA9ICd3aXRoIChvYmopIHtcXG4nICsgc291cmNlICsgJ1xcbn1cXG4nO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYW51cCBjb2RlIGJ5IHN0cmlwcGluZyBlbXB0eSBzdHJpbmdzLlxuICAgICAgc291cmNlID0gKGlzRXZhbHVhdGluZyA/IHNvdXJjZS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdMZWFkaW5nLCAnJykgOiBzb3VyY2UpXG4gICAgICAgIC5yZXBsYWNlKHJlRW1wdHlTdHJpbmdNaWRkbGUsICckMScpXG4gICAgICAgIC5yZXBsYWNlKHJlRW1wdHlTdHJpbmdUcmFpbGluZywgJyQxOycpO1xuXG4gICAgICAvLyBGcmFtZSBjb2RlIGFzIHRoZSBmdW5jdGlvbiBib2R5LlxuICAgICAgc291cmNlID0gJ2Z1bmN0aW9uKCcgKyAodmFyaWFibGUgfHwgJ29iaicpICsgJykge1xcbicgK1xuICAgICAgICAodmFyaWFibGVcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiAnb2JqIHx8IChvYmogPSB7fSk7XFxuJ1xuICAgICAgICApICtcbiAgICAgICAgXCJ2YXIgX190LCBfX3AgPSAnJ1wiICtcbiAgICAgICAgKGlzRXNjYXBpbmdcbiAgICAgICAgICAgPyAnLCBfX2UgPSBfLmVzY2FwZSdcbiAgICAgICAgICAgOiAnJ1xuICAgICAgICApICtcbiAgICAgICAgKGlzRXZhbHVhdGluZ1xuICAgICAgICAgID8gJywgX19qID0gQXJyYXkucHJvdG90eXBlLmpvaW47XFxuJyArXG4gICAgICAgICAgICBcImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxcblwiXG4gICAgICAgICAgOiAnO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIHNvdXJjZSArXG4gICAgICAgICdyZXR1cm4gX19wXFxufSc7XG5cbiAgICAgIHZhciByZXN1bHQgPSBhdHRlbXB0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb24oaW1wb3J0c0tleXMsIHNvdXJjZVVSTCArICdyZXR1cm4gJyArIHNvdXJjZSlcbiAgICAgICAgICAuYXBwbHkodW5kZWZpbmVkLCBpbXBvcnRzVmFsdWVzKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm92aWRlIHRoZSBjb21waWxlZCBmdW5jdGlvbidzIHNvdXJjZSBieSBpdHMgYHRvU3RyaW5nYCBtZXRob2Qgb3JcbiAgICAgIC8vIHRoZSBgc291cmNlYCBwcm9wZXJ0eSBhcyBhIGNvbnZlbmllbmNlIGZvciBpbmxpbmluZyBjb21waWxlZCB0ZW1wbGF0ZXMuXG4gICAgICByZXN1bHQuc291cmNlID0gc291cmNlO1xuICAgICAgaWYgKGlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBhIHdob2xlLCB0byBsb3dlciBjYXNlIGp1c3QgbGlrZVxuICAgICAqIFtTdHJpbmcjdG9Mb3dlckNhc2VdKGh0dHBzOi8vbWRuLmlvL3RvTG93ZXJDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0xvd2VyKCctLUZvby1CYXItLScpO1xuICAgICAqIC8vID0+ICctLWZvby1iYXItLSdcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb2JhcidcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnX19mb29fYmFyX18nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Mb3dlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBhIHdob2xlLCB0byB1cHBlciBjYXNlIGp1c3QgbGlrZVxuICAgICAqIFtTdHJpbmcjdG9VcHBlckNhc2VdKGh0dHBzOi8vbWRuLmlvL3RvVXBwZXJDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVwcGVyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1VwcGVyKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICctLUZPTy1CQVItLSdcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPT0JBUidcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignX19mb29fYmFyX18nKTtcbiAgICAgKiAvLyA9PiAnX19GT09fQkFSX18nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9VcHBlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbSgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICpcbiAgICAgKiBfLnRyaW0oJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICpcbiAgICAgKiBfLm1hcChbJyAgZm9vICAnLCAnICBiYXIgICddLCBfLnRyaW0pO1xuICAgICAqIC8vID0+IFsnZm9vJywgJ2JhciddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbShzdHJpbmcsIGNoYXJzLCBndWFyZCkge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKGd1YXJkIHx8IGNoYXJzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgY2hyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoY2hhcnMpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpLFxuICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykgKyAxO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIHN0YXJ0LCBlbmQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICcgIGFiYydcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJy1fLWFiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltRW5kKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbUVuZCwgJycpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBlbmQgPSBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKSArIDE7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbVN0YXJ0KCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJ2FiYyAgJ1xuICAgICAqXG4gICAgICogXy50cmltU3RhcnQoJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmMtXy0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCBzdGFydCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1bmNhdGVzIGBzdHJpbmdgIGlmIGl0J3MgbG9uZ2VyIHRoYW4gdGhlIGdpdmVuIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgKiBUaGUgbGFzdCBjaGFyYWN0ZXJzIG9mIHRoZSB0cnVuY2F0ZWQgc3RyaW5nIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbWlzc2lvblxuICAgICAqIHN0cmluZyB3aGljaCBkZWZhdWx0cyB0byBcIi4uLlwiLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRydW5jYXRlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5sZW5ndGg9MzBdIFRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm9taXNzaW9uPScuLi4nXSBUaGUgc3RyaW5nIHRvIGluZGljYXRlIHRleHQgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtvcHRpb25zLnNlcGFyYXRvcl0gVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHRydW5jYXRlIHRvLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRydW5jYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nKTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAnICdcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLC4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnbGVuZ3RoJzogMjQsXG4gICAgICogICAnc2VwYXJhdG9yJzogLyw/ICsvXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZS4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnb21pc3Npb24nOiAnIFsuLi5dJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWcgWy4uLl0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gREVGQVVMVF9UUlVOQ19MRU5HVEgsXG4gICAgICAgICAgb21pc3Npb24gPSBERUZBVUxUX1RSVU5DX09NSVNTSU9OO1xuXG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgdmFyIHNlcGFyYXRvciA9ICdzZXBhcmF0b3InIGluIG9wdGlvbnMgPyBvcHRpb25zLnNlcGFyYXRvciA6IHNlcGFyYXRvcjtcbiAgICAgICAgbGVuZ3RoID0gJ2xlbmd0aCcgaW4gb3B0aW9ucyA/IHRvSW50ZWdlcihvcHRpb25zLmxlbmd0aCkgOiBsZW5ndGg7XG4gICAgICAgIG9taXNzaW9uID0gJ29taXNzaW9uJyBpbiBvcHRpb25zID8gYmFzZVRvU3RyaW5nKG9wdGlvbnMub21pc3Npb24pIDogb21pc3Npb247XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgIGlmIChoYXNVbmljb2RlKHN0cmluZykpIHtcbiAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyk7XG4gICAgICAgIHN0ckxlbmd0aCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGxlbmd0aCA+PSBzdHJMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBlbmQgPSBsZW5ndGggLSBzdHJpbmdTaXplKG9taXNzaW9uKTtcbiAgICAgIGlmIChlbmQgPCAxKSB7XG4gICAgICAgIHJldHVybiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBzdHJTeW1ib2xzXG4gICAgICAgID8gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDAsIGVuZCkuam9pbignJylcbiAgICAgICAgOiBzdHJpbmcuc2xpY2UoMCwgZW5kKTtcblxuICAgICAgaWYgKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJTeW1ib2xzKSB7XG4gICAgICAgIGVuZCArPSAocmVzdWx0Lmxlbmd0aCAtIGVuZCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNSZWdFeHAoc2VwYXJhdG9yKSkge1xuICAgICAgICBpZiAoc3RyaW5nLnNsaWNlKGVuZCkuc2VhcmNoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgICB2YXIgbWF0Y2gsXG4gICAgICAgICAgICAgIHN1YnN0cmluZyA9IHJlc3VsdDtcblxuICAgICAgICAgIGlmICghc2VwYXJhdG9yLmdsb2JhbCkge1xuICAgICAgICAgICAgc2VwYXJhdG9yID0gUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIHRvU3RyaW5nKHJlRmxhZ3MuZXhlYyhzZXBhcmF0b3IpKSArICdnJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlcGFyYXRvci5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBzZXBhcmF0b3IuZXhlYyhzdWJzdHJpbmcpKSkge1xuICAgICAgICAgICAgdmFyIG5ld0VuZCA9IG1hdGNoLmluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgbmV3RW5kID09PSB1bmRlZmluZWQgPyBlbmQgOiBuZXdFbmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLCBlbmQpICE9IGVuZCkge1xuICAgICAgICB2YXIgaW5kZXggPSByZXN1bHQubGFzdEluZGV4T2Yoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0ICsgb21pc3Npb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8uZXNjYXBlYDsgdGhpcyBtZXRob2QgY29udmVydHMgdGhlIEhUTUwgZW50aXRpZXNcbiAgICAgKiBgJmFtcDtgLCBgJmx0O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvXG4gICAgICogdGhlaXIgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIEhUTUwgZW50aXRpZXMgYXJlIHVuZXNjYXBlZC4gVG8gdW5lc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIEhUTUwgZW50aXRpZXMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNi4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHVuZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLCB1bmVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnLS1mb28tYmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnX19mb29fYmFyX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51cHBlckZpcnN0KCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICpcbiAgICAgKiBfLnVwcGVyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnRlJFRCdcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9VcHBlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW3BhdHRlcm5dIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIHdvcmRzLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnLCAvW14sIF0rL2cpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAnJicsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3b3JkcyhzdHJpbmcsIHBhdHRlcm4sIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcGF0dGVybiA9IGd1YXJkID8gdW5kZWZpbmVkIDogcGF0dGVybjtcblxuICAgICAgaWYgKHBhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSA/IHVuaWNvZGVXb3JkcyhzdHJpbmcpIDogYXNjaWlXb3JkcyhzdHJpbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5tYXRjaChwYXR0ZXJuKSB8fCBbXTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0cyB0byBpbnZva2UgYGZ1bmNgLCByZXR1cm5pbmcgZWl0aGVyIHRoZSByZXN1bHQgb3IgdGhlIGNhdWdodCBlcnJvclxuICAgICAqIG9iamVjdC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGF0dGVtcHQuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGBmdW5jYCByZXN1bHQgb3IgZXJyb3Igb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCB0aHJvd2luZyBlcnJvcnMgZm9yIGludmFsaWQgc2VsZWN0b3JzLlxuICAgICAqIHZhciBlbGVtZW50cyA9IF8uYXR0ZW1wdChmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgICAqICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAqIH0sICc+Xz4nKTtcbiAgICAgKlxuICAgICAqIGlmIChfLmlzRXJyb3IoZWxlbWVudHMpKSB7XG4gICAgICogICBlbGVtZW50cyA9IFtdO1xuICAgICAqIH1cbiAgICAgKi9cbiAgICB2YXIgYXR0ZW1wdCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIGFyZ3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBtZXRob2RzIG9mIGFuIG9iamVjdCB0byB0aGUgb2JqZWN0IGl0c2VsZiwgb3ZlcndyaXRpbmcgdGhlIGV4aXN0aW5nXG4gICAgICogbWV0aG9kLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGJvdW5kIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJpbmQgYW5kIGFzc2lnbiB0aGUgYm91bmQgbWV0aG9kcyB0by5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBtZXRob2ROYW1lcyBUaGUgb2JqZWN0IG1ldGhvZCBuYW1lcyB0byBiaW5kLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB2aWV3ID0ge1xuICAgICAqICAgJ2xhYmVsJzogJ2RvY3MnLFxuICAgICAqICAgJ2NsaWNrJzogZnVuY3Rpb24oKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdjbGlja2VkICcgKyB0aGlzLmxhYmVsKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5iaW5kQWxsKHZpZXcsIFsnY2xpY2snXSk7XG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHZpZXcuY2xpY2spO1xuICAgICAqIC8vID0+IExvZ3MgJ2NsaWNrZWQgZG9jcycgd2hlbiBjbGlja2VkLlxuICAgICAqL1xuICAgIHZhciBiaW5kQWxsID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBtZXRob2ROYW1lcykge1xuICAgICAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAga2V5ID0gdG9LZXkoa2V5KTtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBiaW5kKG9iamVjdFtrZXldLCBvYmplY3QpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGl0ZXJhdGVzIG92ZXIgYHBhaXJzYCBhbmQgaW52b2tlcyB0aGUgY29ycmVzcG9uZGluZ1xuICAgICAqIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBwcmVkaWNhdGUgdG8gcmV0dXJuIHRydXRoeS4gVGhlIHByZWRpY2F0ZS1mdW5jdGlvblxuICAgICAqIHBhaXJzIGFyZSBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWRcbiAgICAgKiBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFpcnMgVGhlIHByZWRpY2F0ZS1mdW5jdGlvbiBwYWlycy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5jb25kKFtcbiAgICAgKiAgIFtfLm1hdGNoZXMoeyAnYSc6IDEgfSksICAgICAgICAgICBfLmNvbnN0YW50KCdtYXRjaGVzIEEnKV0sXG4gICAgICogICBbXy5jb25mb3Jtcyh7ICdiJzogXy5pc051bWJlciB9KSwgXy5jb25zdGFudCgnbWF0Y2hlcyBCJyldLFxuICAgICAqICAgW18uc3R1YlRydWUsICAgICAgICAgICAgICAgICAgICAgIF8uY29uc3RhbnQoJ25vIG1hdGNoJyldXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gJ21hdGNoZXMgQSdcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6IDAsICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiAnbWF0Y2hlcyBCJ1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogJzEnLCAnYic6ICcyJyB9KTtcbiAgICAgKiAvLyA9PiAnbm8gbWF0Y2gnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZChwYWlycykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHRvSXRlcmF0ZWUgPSBnZXRJdGVyYXRlZSgpO1xuXG4gICAgICBwYWlycyA9ICFsZW5ndGggPyBbXSA6IGFycmF5TWFwKHBhaXJzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFpclsxXSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdG9JdGVyYXRlZShwYWlyWzBdKSwgcGFpclsxXV07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpbmRleF07XG4gICAgICAgICAgaWYgKGFwcGx5KHBhaXJbMF0sIHRoaXMsIGFyZ3MpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkocGFpclsxXSwgdGhpcywgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBwcmVkaWNhdGUgcHJvcGVydGllcyBvZiBgc291cmNlYCB3aXRoXG4gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGEgZ2l2ZW4gb2JqZWN0LCByZXR1cm5pbmcgYHRydWVgIGlmXG4gICAgICogYWxsIHByZWRpY2F0ZXMgcmV0dXJuIHRydXRoeSwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uY29uZm9ybXNUb2Agd2l0aFxuICAgICAqIGBzb3VyY2VgIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDIsICdiJzogMSB9LFxuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8uY29uZm9ybXMoeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEsICdiJzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZvcm1zKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGJhc2VDb25mb3JtcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29uc3RhbnQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLmNvbnN0YW50KHsgJ2EnOiAxIH0pKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSB9LCB7ICdhJzogMSB9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGB2YWx1ZWAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZCBpblxuICAgICAqIGl0cyBwbGFjZS4gVGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGBudWxsYCxcbiAgICAgKiBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjE0LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0VG8oMSwgMTApO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdFRvKHVuZGVmaW5lZCwgMTApO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVmYXVsdFRvKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUpID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBnaXZlbiBmdW5jdGlvbnNcbiAgICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtmdW5jc10gVGhlIGZ1bmN0aW9ucyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICAgICAqIEBzZWUgXy5mbG93UmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93KFtfLmFkZCwgc3F1YXJlXSk7XG4gICAgICogYWRkU3F1YXJlKDEsIDIpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKi9cbiAgICB2YXIgZmxvdyA9IGNyZWF0ZUZsb3coKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxvd2AgZXhjZXB0IHRoYXQgaXQgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXRcbiAgICAgKiBpbnZva2VzIHRoZSBnaXZlbiBmdW5jdGlvbnMgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQHNlZSBfLmZsb3dcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93UmlnaHQoW3NxdWFyZSwgXy5hZGRdKTtcbiAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICogLy8gPT4gOVxuICAgICAqL1xuICAgIHZhciBmbG93UmlnaHQgPSBjcmVhdGVGbG93KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAqIGZ1bmN0aW9uLiBJZiBgZnVuY2AgaXMgYSBwcm9wZXJ0eSBuYW1lLCB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIHRoZVxuICAgICAqIHByb3BlcnR5IHZhbHVlIGZvciBhIGdpdmVuIGVsZW1lbnQuIElmIGBmdW5jYCBpcyBhbiBhcnJheSBvciBvYmplY3QsIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgY29udGFpbiB0aGUgZXF1aXZhbGVudFxuICAgICAqIHNvdXJjZSBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IFtmdW5jPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgY2FsbGJhY2suXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYWxsYmFjay5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZSh7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0pKTtcbiAgICAgKiAvLyA9PiBbeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH1dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8uaXRlcmF0ZWUoWyd1c2VyJywgJ2ZyZWQnXSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCBfLml0ZXJhdGVlKCd1c2VyJykpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gQ3JlYXRlIGN1c3RvbSBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqIF8uaXRlcmF0ZWUgPSBfLndyYXAoXy5pdGVyYXRlZSwgZnVuY3Rpb24oaXRlcmF0ZWUsIGZ1bmMpIHtcbiAgICAgKiAgIHJldHVybiAhXy5pc1JlZ0V4cChmdW5jKSA/IGl0ZXJhdGVlKGZ1bmMpIDogZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICogICAgIHJldHVybiBmdW5jLnRlc3Qoc3RyaW5nKTtcbiAgICAgKiAgIH07XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbJ2FiYycsICdkZWYnXSwgL2VmLyk7XG4gICAgICogLy8gPT4gWydkZWYnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGl0ZXJhdGVlKGZ1bmMpIHtcbiAgICAgIHJldHVybiBiYXNlSXRlcmF0ZWUodHlwZW9mIGZ1bmMgPT0gJ2Z1bmN0aW9uJyA/IGZ1bmMgOiBiYXNlQ2xvbmUoZnVuYywgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGEgZ2l2ZW5cbiAgICAgKiBvYmplY3QgYW5kIGBzb3VyY2VgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZSBnaXZlbiBvYmplY3QgaGFzIGVxdWl2YWxlbnRcbiAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGBfLmlzTWF0Y2hgIHdpdGggYHNvdXJjZWBcbiAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0IGBzb3VyY2VgXG4gICAgICogdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWUgYF8uaXNFcXVhbGBcbiAgICAgKiBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5tYXRjaGVzKHsgJ2EnOiA0LCAnYyc6IDYgfSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGJhc2VNYXRjaGVzKGJhc2VDbG9uZShzb3VyY2UsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcGFydGlhbCBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0aGVcbiAgICAgKiB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QgdG8gYHNyY1ZhbHVlYCwgcmV0dXJuaW5nIGB0cnVlYCBpZiB0aGVcbiAgICAgKiBvYmplY3QgdmFsdWUgaXMgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0XG4gICAgICogYHNyY1ZhbHVlYCB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZVxuICAgICAqIGBfLmlzRXF1YWxgIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sXG4gICAgICogICB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmQob2JqZWN0cywgXy5tYXRjaGVzUHJvcGVydHkoJ2EnLCA0KSk7XG4gICAgICogLy8gPT4geyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzUHJvcGVydHkocGF0aCwgc3JjVmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIGJhc2VDbG9uZShzcmNWYWx1ZSwgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludm9rZXIgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IHsgJ2InOiBfLmNvbnN0YW50KDIpIH0gfSxcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogXy5jb25zdGFudCgxKSB9IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5tZXRob2QoJ2EuYicpKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKFsnYScsICdiJ10pKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICB2YXIgbWV0aG9kID0gYmFzZVJlc3QoZnVuY3Rpb24ocGF0aCwgYXJncykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5tZXRob2RgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gICAgICogdGhlIG1ldGhvZCBhdCBhIGdpdmVuIHBhdGggb2YgYG9iamVjdGAuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmVcbiAgICAgKiBwcm92aWRlZCB0byB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52b2tlciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gXy50aW1lcygzLCBfLmNvbnN0YW50KSxcbiAgICAgKiAgICAgb2JqZWN0ID0geyAnYSc6IGFycmF5LCAnYic6IGFycmF5LCAnYyc6IGFycmF5IH07XG4gICAgICpcbiAgICAgKiBfLm1hcChbJ2FbMl0nLCAnY1swXSddLCBfLm1ldGhvZE9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqXG4gICAgICogXy5tYXAoW1snYScsICcyJ10sIFsnYycsICcwJ11dLCBfLm1ldGhvZE9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqL1xuICAgIHZhciBtZXRob2RPZiA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgYXJncykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGFsbCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgZnVuY3Rpb24gcHJvcGVydGllcyBvZiBhIHNvdXJjZVxuICAgICAqIG9iamVjdCB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0LiBJZiBgb2JqZWN0YCBpcyBhIGZ1bmN0aW9uLCB0aGVuIG1ldGhvZHNcbiAgICAgKiBhcmUgYWRkZWQgdG8gaXRzIHByb3RvdHlwZSBhcyB3ZWxsLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVzZSBgXy5ydW5JbkNvbnRleHRgIHRvIGNyZWF0ZSBhIHByaXN0aW5lIGBsb2Rhc2hgIGZ1bmN0aW9uIHRvXG4gICAgICogYXZvaWQgY29uZmxpY3RzIGNhdXNlZCBieSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gW29iamVjdD1sb2Rhc2hdIFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIGZ1bmN0aW9ucyB0byBhZGQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jaGFpbj10cnVlXSBTcGVjaWZ5IHdoZXRoZXIgbWl4aW5zIGFyZSBjaGFpbmFibGUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufE9iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gdm93ZWxzKHN0cmluZykge1xuICAgICAqICAgcmV0dXJuIF8uZmlsdGVyKHN0cmluZywgZnVuY3Rpb24odikge1xuICAgICAqICAgICByZXR1cm4gL1thZWlvdV0vaS50ZXN0KHYpO1xuICAgICAqICAgfSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSk7XG4gICAgICogXy52b3dlbHMoJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqXG4gICAgICogXygnZnJlZCcpLnZvd2VscygpLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKlxuICAgICAqIF8ubWl4aW4oeyAndm93ZWxzJzogdm93ZWxzIH0sIHsgJ2NoYWluJzogZmFsc2UgfSk7XG4gICAgICogXygnZnJlZCcpLnZvd2VscygpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWl4aW4ob2JqZWN0LCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBwcm9wcyA9IGtleXMoc291cmNlKSxcbiAgICAgICAgICBtZXRob2ROYW1lcyA9IGJhc2VGdW5jdGlvbnMoc291cmNlLCBwcm9wcyk7XG5cbiAgICAgIGlmIChvcHRpb25zID09IG51bGwgJiZcbiAgICAgICAgICAhKGlzT2JqZWN0KHNvdXJjZSkgJiYgKG1ldGhvZE5hbWVzLmxlbmd0aCB8fCAhcHJvcHMubGVuZ3RoKSkpIHtcbiAgICAgICAgb3B0aW9ucyA9IHNvdXJjZTtcbiAgICAgICAgc291cmNlID0gb2JqZWN0O1xuICAgICAgICBvYmplY3QgPSB0aGlzO1xuICAgICAgICBtZXRob2ROYW1lcyA9IGJhc2VGdW5jdGlvbnMoc291cmNlLCBrZXlzKHNvdXJjZSkpO1xuICAgICAgfVxuICAgICAgdmFyIGNoYWluID0gIShpc09iamVjdChvcHRpb25zKSAmJiAnY2hhaW4nIGluIG9wdGlvbnMpIHx8ICEhb3B0aW9ucy5jaGFpbixcbiAgICAgICAgICBpc0Z1bmMgPSBpc0Z1bmN0aW9uKG9iamVjdCk7XG5cbiAgICAgIGFycmF5RWFjaChtZXRob2ROYW1lcywgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgZnVuYyA9IHNvdXJjZVttZXRob2ROYW1lXTtcbiAgICAgICAgb2JqZWN0W21ldGhvZE5hbWVdID0gZnVuYztcbiAgICAgICAgaWYgKGlzRnVuYykge1xuICAgICAgICAgIG9iamVjdC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBjaGFpbkFsbCA9IHRoaXMuX19jaGFpbl9fO1xuICAgICAgICAgICAgaWYgKGNoYWluIHx8IGNoYWluQWxsKSB7XG4gICAgICAgICAgICAgIHZhciByZXN1bHQgPSBvYmplY3QodGhpcy5fX3dyYXBwZWRfXyksXG4gICAgICAgICAgICAgICAgICBhY3Rpb25zID0gcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO1xuXG4gICAgICAgICAgICAgIGFjdGlvbnMucHVzaCh7ICdmdW5jJzogZnVuYywgJ2FyZ3MnOiBhcmd1bWVudHMsICd0aGlzQXJnJzogb2JqZWN0IH0pO1xuICAgICAgICAgICAgICByZXN1bHQuX19jaGFpbl9fID0gY2hhaW5BbGw7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShvYmplY3QsIGFycmF5UHVzaChbdGhpcy52YWx1ZSgpXSwgYXJndW1lbnRzKSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJ0cyB0aGUgYF9gIHZhcmlhYmxlIHRvIGl0cyBwcmV2aW91cyB2YWx1ZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0b1xuICAgICAqIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGxvZGFzaCA9IF8ubm9Db25mbGljdCgpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vQ29uZmxpY3QoKSB7XG4gICAgICBpZiAocm9vdC5fID09PSB0aGlzKSB7XG4gICAgICAgIHJvb3QuXyA9IG9sZERhc2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLm5vb3ApO1xuICAgICAqIC8vID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub29wKCkge1xuICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBnZXRzIHRoZSBhcmd1bWVudCBhdCBpbmRleCBgbmAuIElmIGBuYCBpcyBuZWdhdGl2ZSxcbiAgICAgKiB0aGUgbnRoIGFyZ3VtZW50IGZyb20gdGhlIGVuZCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTBdIFRoZSBpbmRleCBvZiB0aGUgYXJndW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhc3MtdGhydSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm50aEFyZygxKTtcbiAgICAgKiBmdW5jKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICogLy8gPT4gJ2InXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ubnRoQXJnKC0yKTtcbiAgICAgKiBmdW5jKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICogLy8gPT4gJ2MnXG4gICAgICovXG4gICAgZnVuY3Rpb24gbnRoQXJnKG4pIHtcbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICByZXR1cm4gYmFzZU50aChhcmdzLCBuKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGl0ZXJhdGVlc2Agd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzXG4gICAgICogYW5kIHJldHVybnMgdGhlaXIgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXIoW01hdGgubWF4LCBNYXRoLm1pbl0pO1xuICAgICAqXG4gICAgICogZnVuYygxLCAyLCAzLCA0KTtcbiAgICAgKiAvLyA9PiBbNCwgMV1cbiAgICAgKi9cbiAgICB2YXIgb3ZlciA9IGNyZWF0ZU92ZXIoYXJyYXlNYXApO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmICoqYWxsKiogb2YgdGhlIGBwcmVkaWNhdGVzYCByZXR1cm5cbiAgICAgKiB0cnV0aHkgd2hlbiBpbnZva2VkIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtwcmVkaWNhdGVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIHByZWRpY2F0ZXMgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyRXZlcnkoW0Jvb2xlYW4sIGlzRmluaXRlXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKCcxJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogZnVuYyhOYU4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIG92ZXJFdmVyeSA9IGNyZWF0ZU92ZXIoYXJyYXlFdmVyeSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgKiphbnkqKiBvZiB0aGUgYHByZWRpY2F0ZXNgIHJldHVyblxuICAgICAqIHRydXRoeSB3aGVuIGludm9rZWQgd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJTb21lKFtCb29sZWFuLCBpc0Zpbml0ZV0pO1xuICAgICAqXG4gICAgICogZnVuYygnMScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhOYU4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIG92ZXJTb21lID0gY3JlYXRlT3ZlcihhcnJheVNvbWUpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IDEgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ucHJvcGVydHkoJ2EuYicpKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKlxuICAgICAqIF8ubWFwKF8uc29ydEJ5KG9iamVjdHMsIF8ucHJvcGVydHkoWydhJywgJ2InXSkpLCAnYS5iJyk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHkocGF0aCkge1xuICAgICAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKSA6IGJhc2VQcm9wZXJ0eURlZXAocGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnByb3BlcnR5YDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xuICAgICAqIHRoZSB2YWx1ZSBhdCBhIGdpdmVuIHBhdGggb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzAsIDEsIDJdLFxuICAgICAqICAgICBvYmplY3QgPSB7ICdhJzogYXJyYXksICdiJzogYXJyYXksICdjJzogYXJyYXkgfTtcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ucHJvcGVydHlPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gICAgICogYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBBIHN0ZXAgb2YgYC0xYCBpcyB1c2VkIGlmIGEgbmVnYXRpdmVcbiAgICAgKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCxcbiAgICAgKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoNCk7XG4gICAgICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKC00KTtcbiAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDRdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIDIwLCA1KTtcbiAgICAgKiAvLyA9PiBbMCwgNSwgMTAsIDE1XVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxLCA0LCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICB2YXIgcmFuZ2UgPSBjcmVhdGVSYW5nZSgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yYW5nZWAgZXhjZXB0IHRoYXQgaXQgcG9wdWxhdGVzIHZhbHVlcyBpblxuICAgICAqIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDQpO1xuICAgICAqIC8vID0+IFszLCAyLCAxLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KC00KTtcbiAgICAgKiAvLyA9PiBbLTMsIC0yLCAtMSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgxLCA1KTtcbiAgICAgKiAvLyA9PiBbNCwgMywgMiwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAyMCwgNSk7XG4gICAgICogLy8gPT4gWzE1LCAxMCwgNSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDEsIDQsIDApO1xuICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgdmFyIHJhbmdlUmlnaHQgPSBjcmVhdGVSYW5nZSh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5cyA9IF8udGltZXMoMiwgXy5zdHViQXJyYXkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAgICAgKiAvLyA9PiBbW10sIFtdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICAgICAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uc3R1Yk9iamVjdCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAgICAgKiAvLyA9PiBbe30sIHt9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViT2JqZWN0KCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlN0cmluZyk7XG4gICAgICogLy8gPT4gWycnLCAnJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlRydWUpO1xuICAgICAqIC8vID0+IFt0cnVlLCB0cnVlXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJUcnVlKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgaXRlcmF0ZWUgYG5gIHRpbWVzLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBlYWNoIGludm9jYXRpb24uIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAoaW5kZXgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygzLCBTdHJpbmcpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJywgJzInXVxuICAgICAqXG4gICAgICogIF8udGltZXMoNCwgXy5jb25zdGFudCgwKSk7XG4gICAgICogLy8gPT4gWzAsIDAsIDAsIDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICBpZiAobiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gTUFYX0FSUkFZX0xFTkdUSCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCk7XG5cbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUpO1xuICAgICAgbiAtPSBNQVhfQVJSQVlfTEVOR1RIO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZVRpbWVzKGxlbmd0aCwgaXRlcmF0ZWUpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICAgIGl0ZXJhdGVlKGluZGV4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1BhdGgoJ2EuYi5jJyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICpcbiAgICAgKiBfLnRvUGF0aCgnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnMCcsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgdG9LZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3ltYm9sKHZhbHVlKSA/IFt2YWx1ZV0gOiBjb3B5QXJyYXkoc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4gSWYgYHByZWZpeGAgaXMgZ2l2ZW4sIHRoZSBJRCBpcyBhcHBlbmRlZCB0byBpdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9JyddIFRoZSB2YWx1ZSB0byBwcmVmaXggdGhlIElEIHdpdGguXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICAgICAqIC8vID0+ICdjb250YWN0XzEwNCdcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoKTtcbiAgICAgKiAvLyA9PiAnMTA1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICAgICAgdmFyIGlkID0gKytpZENvdW50ZXI7XG4gICAgICByZXR1cm4gdG9TdHJpbmcocHJlZml4KSArIGlkO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy40LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdWdlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhbiBhZGRpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGFuIGFkZGl0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRvdGFsLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmFkZCg2LCA0KTtcbiAgICAgKiAvLyA9PiAxMFxuICAgICAqL1xuICAgIHZhciBhZGQgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGF1Z2VuZCwgYWRkZW5kKSB7XG4gICAgICByZXR1cm4gYXVnZW5kICsgYWRkZW5kO1xuICAgIH0sIDApO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB1cCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZCB1cC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgdXAgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNC4wMDYpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg2LjAwNCwgMik7XG4gICAgICogLy8gPT4gNi4wMVxuICAgICAqXG4gICAgICogXy5jZWlsKDYwNDAsIC0yKTtcbiAgICAgKiAvLyA9PiA2MTAwXG4gICAgICovXG4gICAgdmFyIGNlaWwgPSBjcmVhdGVSb3VuZCgnY2VpbCcpO1xuXG4gICAgLyoqXG4gICAgICogRGl2aWRlIHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGl2aWRlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIGRpdmlzaW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpc29yIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgZGl2aXNpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcXVvdGllbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGl2aWRlKDYsIDQpO1xuICAgICAqIC8vID0+IDEuNVxuICAgICAqL1xuICAgIHZhciBkaXZpZGUgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGRpdmlkZW5kLCBkaXZpc29yKSB7XG4gICAgICByZXR1cm4gZGl2aWRlbmQgLyBkaXZpc29yO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCBkb3duIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIGRvd24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCBkb3duIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgZG93biBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNC4wMDYpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoMC4wNDYsIDIpO1xuICAgICAqIC8vID0+IDAuMDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNDA2MCwgLTIpO1xuICAgICAqIC8vID0+IDQwMDBcbiAgICAgKi9cbiAgICB2YXIgZmxvb3IgPSBjcmVhdGVSb3VuZCgnZmxvb3InKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1heChbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWF4KFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXgoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VHdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tYXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5tYXhCeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWF4Qnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF4QnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUd0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbWVhbiBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tZWFuKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lYW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiBiYXNlTWVhbihhcnJheSwgaWRlbnRpdHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVhbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIGF2ZXJhZ2VkLlxuICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ubWVhbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tZWFuQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVhbkJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8ubWluKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VMdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5taW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5taW5CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAxIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWluQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWluQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUx0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpZXIgVGhlIGZpcnN0IG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aXBsaWNhbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwcm9kdWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm11bHRpcGx5KDYsIDQpO1xuICAgICAqIC8vID0+IDI0XG4gICAgICovXG4gICAgdmFyIG11bHRpcGx5ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtdWx0aXBsaWVyLCBtdWx0aXBsaWNhbmQpIHtcbiAgICAgIHJldHVybiBtdWx0aXBsaWVyICogbXVsdGlwbGljYW5kO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2LCAyKTtcbiAgICAgKiAvLyA9PiA0LjAxXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQwNjAsIC0yKTtcbiAgICAgKiAvLyA9PiA0MTAwXG4gICAgICovXG4gICAgdmFyIHJvdW5kID0gY3JlYXRlUm91bmQoJ3JvdW5kJyk7XG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnVlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdWJ0cmFoZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdWJ0cmFjdCg2LCA0KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgdmFyIHN1YnRyYWN0ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtaW51ZW5kLCBzdWJ0cmFoZW5kKSB7XG4gICAgICByZXR1cm4gbWludWVuZCAtIHN1YnRyYWhlbmQ7XG4gICAgfSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3VtKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdW0oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTdW0oYXJyYXksIGlkZW50aXR5KVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zdW1gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZSB0byBiZSBzdW1tZWQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDQgfSwgeyAnbic6IDIgfSwgeyAnbic6IDggfSwgeyAnbic6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnN1bUJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc3VtQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1bUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVN1bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZnRlciA9IGFmdGVyO1xuICAgIGxvZGFzaC5hcnkgPSBhcnk7XG4gICAgbG9kYXNoLmFzc2lnbiA9IGFzc2lnbjtcbiAgICBsb2Rhc2guYXNzaWduSW4gPSBhc3NpZ25JbjtcbiAgICBsb2Rhc2guYXNzaWduSW5XaXRoID0gYXNzaWduSW5XaXRoO1xuICAgIGxvZGFzaC5hc3NpZ25XaXRoID0gYXNzaWduV2l0aDtcbiAgICBsb2Rhc2guYXQgPSBhdDtcbiAgICBsb2Rhc2guYmVmb3JlID0gYmVmb3JlO1xuICAgIGxvZGFzaC5iaW5kID0gYmluZDtcbiAgICBsb2Rhc2guYmluZEFsbCA9IGJpbmRBbGw7XG4gICAgbG9kYXNoLmJpbmRLZXkgPSBiaW5kS2V5O1xuICAgIGxvZGFzaC5jYXN0QXJyYXkgPSBjYXN0QXJyYXk7XG4gICAgbG9kYXNoLmNoYWluID0gY2hhaW47XG4gICAgbG9kYXNoLmNodW5rID0gY2h1bms7XG4gICAgbG9kYXNoLmNvbXBhY3QgPSBjb21wYWN0O1xuICAgIGxvZGFzaC5jb25jYXQgPSBjb25jYXQ7XG4gICAgbG9kYXNoLmNvbmQgPSBjb25kO1xuICAgIGxvZGFzaC5jb25mb3JtcyA9IGNvbmZvcm1zO1xuICAgIGxvZGFzaC5jb25zdGFudCA9IGNvbnN0YW50O1xuICAgIGxvZGFzaC5jb3VudEJ5ID0gY291bnRCeTtcbiAgICBsb2Rhc2guY3JlYXRlID0gY3JlYXRlO1xuICAgIGxvZGFzaC5jdXJyeSA9IGN1cnJ5O1xuICAgIGxvZGFzaC5jdXJyeVJpZ2h0ID0gY3VycnlSaWdodDtcbiAgICBsb2Rhc2guZGVib3VuY2UgPSBkZWJvdW5jZTtcbiAgICBsb2Rhc2guZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICBsb2Rhc2guZGVmYXVsdHNEZWVwID0gZGVmYXVsdHNEZWVwO1xuICAgIGxvZGFzaC5kZWZlciA9IGRlZmVyO1xuICAgIGxvZGFzaC5kZWxheSA9IGRlbGF5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlID0gZGlmZmVyZW5jZTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZUJ5ID0gZGlmZmVyZW5jZUJ5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlV2l0aCA9IGRpZmZlcmVuY2VXaXRoO1xuICAgIGxvZGFzaC5kcm9wID0gZHJvcDtcbiAgICBsb2Rhc2guZHJvcFJpZ2h0ID0gZHJvcFJpZ2h0O1xuICAgIGxvZGFzaC5kcm9wUmlnaHRXaGlsZSA9IGRyb3BSaWdodFdoaWxlO1xuICAgIGxvZGFzaC5kcm9wV2hpbGUgPSBkcm9wV2hpbGU7XG4gICAgbG9kYXNoLmZpbGwgPSBmaWxsO1xuICAgIGxvZGFzaC5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgbG9kYXNoLmZsYXRNYXAgPSBmbGF0TWFwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVlcCA9IGZsYXRNYXBEZWVwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVwdGggPSBmbGF0TWFwRGVwdGg7XG4gICAgbG9kYXNoLmZsYXR0ZW4gPSBmbGF0dGVuO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVlcCA9IGZsYXR0ZW5EZWVwO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVwdGggPSBmbGF0dGVuRGVwdGg7XG4gICAgbG9kYXNoLmZsaXAgPSBmbGlwO1xuICAgIGxvZGFzaC5mbG93ID0gZmxvdztcbiAgICBsb2Rhc2guZmxvd1JpZ2h0ID0gZmxvd1JpZ2h0O1xuICAgIGxvZGFzaC5mcm9tUGFpcnMgPSBmcm9tUGFpcnM7XG4gICAgbG9kYXNoLmZ1bmN0aW9ucyA9IGZ1bmN0aW9ucztcbiAgICBsb2Rhc2guZnVuY3Rpb25zSW4gPSBmdW5jdGlvbnNJbjtcbiAgICBsb2Rhc2guZ3JvdXBCeSA9IGdyb3VwQnk7XG4gICAgbG9kYXNoLmluaXRpYWwgPSBpbml0aWFsO1xuICAgIGxvZGFzaC5pbnRlcnNlY3Rpb24gPSBpbnRlcnNlY3Rpb247XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbkJ5ID0gaW50ZXJzZWN0aW9uQnk7XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbldpdGggPSBpbnRlcnNlY3Rpb25XaXRoO1xuICAgIGxvZGFzaC5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgbG9kYXNoLmludmVydEJ5ID0gaW52ZXJ0Qnk7XG4gICAgbG9kYXNoLmludm9rZU1hcCA9IGludm9rZU1hcDtcbiAgICBsb2Rhc2guaXRlcmF0ZWUgPSBpdGVyYXRlZTtcbiAgICBsb2Rhc2gua2V5QnkgPSBrZXlCeTtcbiAgICBsb2Rhc2gua2V5cyA9IGtleXM7XG4gICAgbG9kYXNoLmtleXNJbiA9IGtleXNJbjtcbiAgICBsb2Rhc2gubWFwID0gbWFwO1xuICAgIGxvZGFzaC5tYXBLZXlzID0gbWFwS2V5cztcbiAgICBsb2Rhc2gubWFwVmFsdWVzID0gbWFwVmFsdWVzO1xuICAgIGxvZGFzaC5tYXRjaGVzID0gbWF0Y2hlcztcbiAgICBsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5ID0gbWF0Y2hlc1Byb3BlcnR5O1xuICAgIGxvZGFzaC5tZW1vaXplID0gbWVtb2l6ZTtcbiAgICBsb2Rhc2gubWVyZ2UgPSBtZXJnZTtcbiAgICBsb2Rhc2gubWVyZ2VXaXRoID0gbWVyZ2VXaXRoO1xuICAgIGxvZGFzaC5tZXRob2QgPSBtZXRob2Q7XG4gICAgbG9kYXNoLm1ldGhvZE9mID0gbWV0aG9kT2Y7XG4gICAgbG9kYXNoLm1peGluID0gbWl4aW47XG4gICAgbG9kYXNoLm5lZ2F0ZSA9IG5lZ2F0ZTtcbiAgICBsb2Rhc2gubnRoQXJnID0gbnRoQXJnO1xuICAgIGxvZGFzaC5vbWl0ID0gb21pdDtcbiAgICBsb2Rhc2gub21pdEJ5ID0gb21pdEJ5O1xuICAgIGxvZGFzaC5vbmNlID0gb25jZTtcbiAgICBsb2Rhc2gub3JkZXJCeSA9IG9yZGVyQnk7XG4gICAgbG9kYXNoLm92ZXIgPSBvdmVyO1xuICAgIGxvZGFzaC5vdmVyQXJncyA9IG92ZXJBcmdzO1xuICAgIGxvZGFzaC5vdmVyRXZlcnkgPSBvdmVyRXZlcnk7XG4gICAgbG9kYXNoLm92ZXJTb21lID0gb3ZlclNvbWU7XG4gICAgbG9kYXNoLnBhcnRpYWwgPSBwYXJ0aWFsO1xuICAgIGxvZGFzaC5wYXJ0aWFsUmlnaHQgPSBwYXJ0aWFsUmlnaHQ7XG4gICAgbG9kYXNoLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjtcbiAgICBsb2Rhc2gucGljayA9IHBpY2s7XG4gICAgbG9kYXNoLnBpY2tCeSA9IHBpY2tCeTtcbiAgICBsb2Rhc2gucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICBsb2Rhc2gucHJvcGVydHlPZiA9IHByb3BlcnR5T2Y7XG4gICAgbG9kYXNoLnB1bGwgPSBwdWxsO1xuICAgIGxvZGFzaC5wdWxsQWxsID0gcHVsbEFsbDtcbiAgICBsb2Rhc2gucHVsbEFsbEJ5ID0gcHVsbEFsbEJ5O1xuICAgIGxvZGFzaC5wdWxsQWxsV2l0aCA9IHB1bGxBbGxXaXRoO1xuICAgIGxvZGFzaC5wdWxsQXQgPSBwdWxsQXQ7XG4gICAgbG9kYXNoLnJhbmdlID0gcmFuZ2U7XG4gICAgbG9kYXNoLnJhbmdlUmlnaHQgPSByYW5nZVJpZ2h0O1xuICAgIGxvZGFzaC5yZWFyZyA9IHJlYXJnO1xuICAgIGxvZGFzaC5yZWplY3QgPSByZWplY3Q7XG4gICAgbG9kYXNoLnJlbW92ZSA9IHJlbW92ZTtcbiAgICBsb2Rhc2gucmVzdCA9IHJlc3Q7XG4gICAgbG9kYXNoLnJldmVyc2UgPSByZXZlcnNlO1xuICAgIGxvZGFzaC5zYW1wbGVTaXplID0gc2FtcGxlU2l6ZTtcbiAgICBsb2Rhc2guc2V0ID0gc2V0O1xuICAgIGxvZGFzaC5zZXRXaXRoID0gc2V0V2l0aDtcbiAgICBsb2Rhc2guc2h1ZmZsZSA9IHNodWZmbGU7XG4gICAgbG9kYXNoLnNsaWNlID0gc2xpY2U7XG4gICAgbG9kYXNoLnNvcnRCeSA9IHNvcnRCeTtcbiAgICBsb2Rhc2guc29ydGVkVW5pcSA9IHNvcnRlZFVuaXE7XG4gICAgbG9kYXNoLnNvcnRlZFVuaXFCeSA9IHNvcnRlZFVuaXFCeTtcbiAgICBsb2Rhc2guc3BsaXQgPSBzcGxpdDtcbiAgICBsb2Rhc2guc3ByZWFkID0gc3ByZWFkO1xuICAgIGxvZGFzaC50YWlsID0gdGFpbDtcbiAgICBsb2Rhc2gudGFrZSA9IHRha2U7XG4gICAgbG9kYXNoLnRha2VSaWdodCA9IHRha2VSaWdodDtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0V2hpbGUgPSB0YWtlUmlnaHRXaGlsZTtcbiAgICBsb2Rhc2gudGFrZVdoaWxlID0gdGFrZVdoaWxlO1xuICAgIGxvZGFzaC50YXAgPSB0YXA7XG4gICAgbG9kYXNoLnRocm90dGxlID0gdGhyb3R0bGU7XG4gICAgbG9kYXNoLnRocnUgPSB0aHJ1O1xuICAgIGxvZGFzaC50b0FycmF5ID0gdG9BcnJheTtcbiAgICBsb2Rhc2gudG9QYWlycyA9IHRvUGFpcnM7XG4gICAgbG9kYXNoLnRvUGFpcnNJbiA9IHRvUGFpcnNJbjtcbiAgICBsb2Rhc2gudG9QYXRoID0gdG9QYXRoO1xuICAgIGxvZGFzaC50b1BsYWluT2JqZWN0ID0gdG9QbGFpbk9iamVjdDtcbiAgICBsb2Rhc2gudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIGxvZGFzaC51bmFyeSA9IHVuYXJ5O1xuICAgIGxvZGFzaC51bmlvbiA9IHVuaW9uO1xuICAgIGxvZGFzaC51bmlvbkJ5ID0gdW5pb25CeTtcbiAgICBsb2Rhc2gudW5pb25XaXRoID0gdW5pb25XaXRoO1xuICAgIGxvZGFzaC51bmlxID0gdW5pcTtcbiAgICBsb2Rhc2gudW5pcUJ5ID0gdW5pcUJ5O1xuICAgIGxvZGFzaC51bmlxV2l0aCA9IHVuaXFXaXRoO1xuICAgIGxvZGFzaC51bnNldCA9IHVuc2V0O1xuICAgIGxvZGFzaC51bnppcCA9IHVuemlwO1xuICAgIGxvZGFzaC51bnppcFdpdGggPSB1bnppcFdpdGg7XG4gICAgbG9kYXNoLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgICBsb2Rhc2gudXBkYXRlV2l0aCA9IHVwZGF0ZVdpdGg7XG4gICAgbG9kYXNoLnZhbHVlcyA9IHZhbHVlcztcbiAgICBsb2Rhc2gudmFsdWVzSW4gPSB2YWx1ZXNJbjtcbiAgICBsb2Rhc2gud2l0aG91dCA9IHdpdGhvdXQ7XG4gICAgbG9kYXNoLndvcmRzID0gd29yZHM7XG4gICAgbG9kYXNoLndyYXAgPSB3cmFwO1xuICAgIGxvZGFzaC54b3IgPSB4b3I7XG4gICAgbG9kYXNoLnhvckJ5ID0geG9yQnk7XG4gICAgbG9kYXNoLnhvcldpdGggPSB4b3JXaXRoO1xuICAgIGxvZGFzaC56aXAgPSB6aXA7XG4gICAgbG9kYXNoLnppcE9iamVjdCA9IHppcE9iamVjdDtcbiAgICBsb2Rhc2guemlwT2JqZWN0RGVlcCA9IHppcE9iamVjdERlZXA7XG4gICAgbG9kYXNoLnppcFdpdGggPSB6aXBXaXRoO1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmVudHJpZXMgPSB0b1BhaXJzO1xuICAgIGxvZGFzaC5lbnRyaWVzSW4gPSB0b1BhaXJzSW47XG4gICAgbG9kYXNoLmV4dGVuZCA9IGFzc2lnbkluO1xuICAgIGxvZGFzaC5leHRlbmRXaXRoID0gYXNzaWduSW5XaXRoO1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIG1peGluKGxvZGFzaCwgbG9kYXNoKTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIEFkZCBtZXRob2RzIHRoYXQgcmV0dXJuIHVud3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZGQgPSBhZGQ7XG4gICAgbG9kYXNoLmF0dGVtcHQgPSBhdHRlbXB0O1xuICAgIGxvZGFzaC5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG4gICAgbG9kYXNoLmNhcGl0YWxpemUgPSBjYXBpdGFsaXplO1xuICAgIGxvZGFzaC5jZWlsID0gY2VpbDtcbiAgICBsb2Rhc2guY2xhbXAgPSBjbGFtcDtcbiAgICBsb2Rhc2guY2xvbmUgPSBjbG9uZTtcbiAgICBsb2Rhc2guY2xvbmVEZWVwID0gY2xvbmVEZWVwO1xuICAgIGxvZGFzaC5jbG9uZURlZXBXaXRoID0gY2xvbmVEZWVwV2l0aDtcbiAgICBsb2Rhc2guY2xvbmVXaXRoID0gY2xvbmVXaXRoO1xuICAgIGxvZGFzaC5jb25mb3Jtc1RvID0gY29uZm9ybXNUbztcbiAgICBsb2Rhc2guZGVidXJyID0gZGVidXJyO1xuICAgIGxvZGFzaC5kZWZhdWx0VG8gPSBkZWZhdWx0VG87XG4gICAgbG9kYXNoLmRpdmlkZSA9IGRpdmlkZTtcbiAgICBsb2Rhc2guZW5kc1dpdGggPSBlbmRzV2l0aDtcbiAgICBsb2Rhc2guZXEgPSBlcTtcbiAgICBsb2Rhc2guZXNjYXBlID0gZXNjYXBlO1xuICAgIGxvZGFzaC5lc2NhcGVSZWdFeHAgPSBlc2NhcGVSZWdFeHA7XG4gICAgbG9kYXNoLmV2ZXJ5ID0gZXZlcnk7XG4gICAgbG9kYXNoLmZpbmQgPSBmaW5kO1xuICAgIGxvZGFzaC5maW5kSW5kZXggPSBmaW5kSW5kZXg7XG4gICAgbG9kYXNoLmZpbmRLZXkgPSBmaW5kS2V5O1xuICAgIGxvZGFzaC5maW5kTGFzdCA9IGZpbmRMYXN0O1xuICAgIGxvZGFzaC5maW5kTGFzdEluZGV4ID0gZmluZExhc3RJbmRleDtcbiAgICBsb2Rhc2guZmluZExhc3RLZXkgPSBmaW5kTGFzdEtleTtcbiAgICBsb2Rhc2guZmxvb3IgPSBmbG9vcjtcbiAgICBsb2Rhc2guZm9yRWFjaCA9IGZvckVhY2g7XG4gICAgbG9kYXNoLmZvckVhY2hSaWdodCA9IGZvckVhY2hSaWdodDtcbiAgICBsb2Rhc2guZm9ySW4gPSBmb3JJbjtcbiAgICBsb2Rhc2guZm9ySW5SaWdodCA9IGZvckluUmlnaHQ7XG4gICAgbG9kYXNoLmZvck93biA9IGZvck93bjtcbiAgICBsb2Rhc2guZm9yT3duUmlnaHQgPSBmb3JPd25SaWdodDtcbiAgICBsb2Rhc2guZ2V0ID0gZ2V0O1xuICAgIGxvZGFzaC5ndCA9IGd0O1xuICAgIGxvZGFzaC5ndGUgPSBndGU7XG4gICAgbG9kYXNoLmhhcyA9IGhhcztcbiAgICBsb2Rhc2guaGFzSW4gPSBoYXNJbjtcbiAgICBsb2Rhc2guaGVhZCA9IGhlYWQ7XG4gICAgbG9kYXNoLmlkZW50aXR5ID0gaWRlbnRpdHk7XG4gICAgbG9kYXNoLmluY2x1ZGVzID0gaW5jbHVkZXM7XG4gICAgbG9kYXNoLmluZGV4T2YgPSBpbmRleE9mO1xuICAgIGxvZGFzaC5pblJhbmdlID0gaW5SYW5nZTtcbiAgICBsb2Rhc2guaW52b2tlID0gaW52b2tlO1xuICAgIGxvZGFzaC5pc0FyZ3VtZW50cyA9IGlzQXJndW1lbnRzO1xuICAgIGxvZGFzaC5pc0FycmF5ID0gaXNBcnJheTtcbiAgICBsb2Rhc2guaXNBcnJheUJ1ZmZlciA9IGlzQXJyYXlCdWZmZXI7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlID0gaXNBcnJheUxpa2U7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlT2JqZWN0ID0gaXNBcnJheUxpa2VPYmplY3Q7XG4gICAgbG9kYXNoLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcbiAgICBsb2Rhc2guaXNCdWZmZXIgPSBpc0J1ZmZlcjtcbiAgICBsb2Rhc2guaXNEYXRlID0gaXNEYXRlO1xuICAgIGxvZGFzaC5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG4gICAgbG9kYXNoLmlzRW1wdHkgPSBpc0VtcHR5O1xuICAgIGxvZGFzaC5pc0VxdWFsID0gaXNFcXVhbDtcbiAgICBsb2Rhc2guaXNFcXVhbFdpdGggPSBpc0VxdWFsV2l0aDtcbiAgICBsb2Rhc2guaXNFcnJvciA9IGlzRXJyb3I7XG4gICAgbG9kYXNoLmlzRmluaXRlID0gaXNGaW5pdGU7XG4gICAgbG9kYXNoLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuICAgIGxvZGFzaC5pc0ludGVnZXIgPSBpc0ludGVnZXI7XG4gICAgbG9kYXNoLmlzTGVuZ3RoID0gaXNMZW5ndGg7XG4gICAgbG9kYXNoLmlzTWFwID0gaXNNYXA7XG4gICAgbG9kYXNoLmlzTWF0Y2ggPSBpc01hdGNoO1xuICAgIGxvZGFzaC5pc01hdGNoV2l0aCA9IGlzTWF0Y2hXaXRoO1xuICAgIGxvZGFzaC5pc05hTiA9IGlzTmFOO1xuICAgIGxvZGFzaC5pc05hdGl2ZSA9IGlzTmF0aXZlO1xuICAgIGxvZGFzaC5pc05pbCA9IGlzTmlsO1xuICAgIGxvZGFzaC5pc051bGwgPSBpc051bGw7XG4gICAgbG9kYXNoLmlzTnVtYmVyID0gaXNOdW1iZXI7XG4gICAgbG9kYXNoLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG4gICAgbG9kYXNoLmlzT2JqZWN0TGlrZSA9IGlzT2JqZWN0TGlrZTtcbiAgICBsb2Rhc2guaXNQbGFpbk9iamVjdCA9IGlzUGxhaW5PYmplY3Q7XG4gICAgbG9kYXNoLmlzUmVnRXhwID0gaXNSZWdFeHA7XG4gICAgbG9kYXNoLmlzU2FmZUludGVnZXIgPSBpc1NhZmVJbnRlZ2VyO1xuICAgIGxvZGFzaC5pc1NldCA9IGlzU2V0O1xuICAgIGxvZGFzaC5pc1N0cmluZyA9IGlzU3RyaW5nO1xuICAgIGxvZGFzaC5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuICAgIGxvZGFzaC5pc1R5cGVkQXJyYXkgPSBpc1R5cGVkQXJyYXk7XG4gICAgbG9kYXNoLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG4gICAgbG9kYXNoLmlzV2Vha01hcCA9IGlzV2Vha01hcDtcbiAgICBsb2Rhc2guaXNXZWFrU2V0ID0gaXNXZWFrU2V0O1xuICAgIGxvZGFzaC5qb2luID0gam9pbjtcbiAgICBsb2Rhc2gua2ViYWJDYXNlID0ga2ViYWJDYXNlO1xuICAgIGxvZGFzaC5sYXN0ID0gbGFzdDtcbiAgICBsb2Rhc2gubGFzdEluZGV4T2YgPSBsYXN0SW5kZXhPZjtcbiAgICBsb2Rhc2gubG93ZXJDYXNlID0gbG93ZXJDYXNlO1xuICAgIGxvZGFzaC5sb3dlckZpcnN0ID0gbG93ZXJGaXJzdDtcbiAgICBsb2Rhc2gubHQgPSBsdDtcbiAgICBsb2Rhc2gubHRlID0gbHRlO1xuICAgIGxvZGFzaC5tYXggPSBtYXg7XG4gICAgbG9kYXNoLm1heEJ5ID0gbWF4Qnk7XG4gICAgbG9kYXNoLm1lYW4gPSBtZWFuO1xuICAgIGxvZGFzaC5tZWFuQnkgPSBtZWFuQnk7XG4gICAgbG9kYXNoLm1pbiA9IG1pbjtcbiAgICBsb2Rhc2gubWluQnkgPSBtaW5CeTtcbiAgICBsb2Rhc2guc3R1YkFycmF5ID0gc3R1YkFycmF5O1xuICAgIGxvZGFzaC5zdHViRmFsc2UgPSBzdHViRmFsc2U7XG4gICAgbG9kYXNoLnN0dWJPYmplY3QgPSBzdHViT2JqZWN0O1xuICAgIGxvZGFzaC5zdHViU3RyaW5nID0gc3R1YlN0cmluZztcbiAgICBsb2Rhc2guc3R1YlRydWUgPSBzdHViVHJ1ZTtcbiAgICBsb2Rhc2gubXVsdGlwbHkgPSBtdWx0aXBseTtcbiAgICBsb2Rhc2gubnRoID0gbnRoO1xuICAgIGxvZGFzaC5ub0NvbmZsaWN0ID0gbm9Db25mbGljdDtcbiAgICBsb2Rhc2gubm9vcCA9IG5vb3A7XG4gICAgbG9kYXNoLm5vdyA9IG5vdztcbiAgICBsb2Rhc2gucGFkID0gcGFkO1xuICAgIGxvZGFzaC5wYWRFbmQgPSBwYWRFbmQ7XG4gICAgbG9kYXNoLnBhZFN0YXJ0ID0gcGFkU3RhcnQ7XG4gICAgbG9kYXNoLnBhcnNlSW50ID0gcGFyc2VJbnQ7XG4gICAgbG9kYXNoLnJhbmRvbSA9IHJhbmRvbTtcbiAgICBsb2Rhc2gucmVkdWNlID0gcmVkdWNlO1xuICAgIGxvZGFzaC5yZWR1Y2VSaWdodCA9IHJlZHVjZVJpZ2h0O1xuICAgIGxvZGFzaC5yZXBlYXQgPSByZXBlYXQ7XG4gICAgbG9kYXNoLnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIGxvZGFzaC5yZXN1bHQgPSByZXN1bHQ7XG4gICAgbG9kYXNoLnJvdW5kID0gcm91bmQ7XG4gICAgbG9kYXNoLnJ1bkluQ29udGV4dCA9IHJ1bkluQ29udGV4dDtcbiAgICBsb2Rhc2guc2FtcGxlID0gc2FtcGxlO1xuICAgIGxvZGFzaC5zaXplID0gc2l6ZTtcbiAgICBsb2Rhc2guc25ha2VDYXNlID0gc25ha2VDYXNlO1xuICAgIGxvZGFzaC5zb21lID0gc29tZTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXggPSBzb3J0ZWRJbmRleDtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXhCeSA9IHNvcnRlZEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4T2YgPSBzb3J0ZWRJbmRleE9mO1xuICAgIGxvZGFzaC5zb3J0ZWRMYXN0SW5kZXggPSBzb3J0ZWRMYXN0SW5kZXg7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleEJ5ID0gc29ydGVkTGFzdEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleE9mID0gc29ydGVkTGFzdEluZGV4T2Y7XG4gICAgbG9kYXNoLnN0YXJ0Q2FzZSA9IHN0YXJ0Q2FzZTtcbiAgICBsb2Rhc2guc3RhcnRzV2l0aCA9IHN0YXJ0c1dpdGg7XG4gICAgbG9kYXNoLnN1YnRyYWN0ID0gc3VidHJhY3Q7XG4gICAgbG9kYXNoLnN1bSA9IHN1bTtcbiAgICBsb2Rhc2guc3VtQnkgPSBzdW1CeTtcbiAgICBsb2Rhc2gudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBsb2Rhc2gudGltZXMgPSB0aW1lcztcbiAgICBsb2Rhc2gudG9GaW5pdGUgPSB0b0Zpbml0ZTtcbiAgICBsb2Rhc2gudG9JbnRlZ2VyID0gdG9JbnRlZ2VyO1xuICAgIGxvZGFzaC50b0xlbmd0aCA9IHRvTGVuZ3RoO1xuICAgIGxvZGFzaC50b0xvd2VyID0gdG9Mb3dlcjtcbiAgICBsb2Rhc2gudG9OdW1iZXIgPSB0b051bWJlcjtcbiAgICBsb2Rhc2gudG9TYWZlSW50ZWdlciA9IHRvU2FmZUludGVnZXI7XG4gICAgbG9kYXNoLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgbG9kYXNoLnRvVXBwZXIgPSB0b1VwcGVyO1xuICAgIGxvZGFzaC50cmltID0gdHJpbTtcbiAgICBsb2Rhc2gudHJpbUVuZCA9IHRyaW1FbmQ7XG4gICAgbG9kYXNoLnRyaW1TdGFydCA9IHRyaW1TdGFydDtcbiAgICBsb2Rhc2gudHJ1bmNhdGUgPSB0cnVuY2F0ZTtcbiAgICBsb2Rhc2gudW5lc2NhcGUgPSB1bmVzY2FwZTtcbiAgICBsb2Rhc2gudW5pcXVlSWQgPSB1bmlxdWVJZDtcbiAgICBsb2Rhc2gudXBwZXJDYXNlID0gdXBwZXJDYXNlO1xuICAgIGxvZGFzaC51cHBlckZpcnN0ID0gdXBwZXJGaXJzdDtcblxuICAgIC8vIEFkZCBhbGlhc2VzLlxuICAgIGxvZGFzaC5lYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5maXJzdCA9IGhlYWQ7XG5cbiAgICBtaXhpbihsb2Rhc2gsIChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzb3VyY2UgPSB7fTtcbiAgICAgIGJhc2VGb3JPd24obG9kYXNoLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLCBtZXRob2ROYW1lKSkge1xuICAgICAgICAgIHNvdXJjZVttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9KCkpLCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsb2Rhc2guVkVSU0lPTiA9IFZFUlNJT047XG5cbiAgICAvLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuXG4gICAgYXJyYXlFYWNoKFsnYmluZCcsICdiaW5kS2V5JywgJ2N1cnJ5JywgJ2N1cnJ5UmlnaHQnLCAncGFydGlhbCcsICdwYXJ0aWFsUmlnaHQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgbG9kYXNoW21ldGhvZE5hbWVdLnBsYWNlaG9sZGVyID0gbG9kYXNoO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uZHJvcGAgYW5kIGBfLnRha2VgIHZhcmlhbnRzLlxuICAgIGFycmF5RWFjaChbJ2Ryb3AnLCAndGFrZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24obikge1xuICAgICAgICBuID0gbiA9PT0gdW5kZWZpbmVkID8gMSA6IG5hdGl2ZU1heCh0b0ludGVnZXIobiksIDApO1xuXG4gICAgICAgIHZhciByZXN1bHQgPSAodGhpcy5fX2ZpbHRlcmVkX18gJiYgIWluZGV4KVxuICAgICAgICAgID8gbmV3IExhenlXcmFwcGVyKHRoaXMpXG4gICAgICAgICAgOiB0aGlzLmNsb25lKCk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgICByZXN1bHQuX190YWtlQ291bnRfXyA9IG5hdGl2ZU1pbihuLCByZXN1bHQuX190YWtlQ291bnRfXyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHtcbiAgICAgICAgICAgICdzaXplJzogbmF0aXZlTWluKG4sIE1BWF9BUlJBWV9MRU5HVEgpLFxuICAgICAgICAgICAgJ3R5cGUnOiBtZXRob2ROYW1lICsgKHJlc3VsdC5fX2Rpcl9fIDwgMCA/ICdSaWdodCcgOiAnJylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUgKyAnUmlnaHQnXSA9IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRoYXQgYWNjZXB0IGFuIGBpdGVyYXRlZWAgdmFsdWUuXG4gICAgYXJyYXlFYWNoKFsnZmlsdGVyJywgJ21hcCcsICd0YWtlV2hpbGUnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0eXBlID0gaW5kZXggKyAxLFxuICAgICAgICAgIGlzRmlsdGVyID0gdHlwZSA9PSBMQVpZX0ZJTFRFUl9GTEFHIHx8IHR5cGUgPT0gTEFaWV9XSElMRV9GTEFHO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXN1bHQuX19pdGVyYXRlZXNfXy5wdXNoKHtcbiAgICAgICAgICAnaXRlcmF0ZWUnOiBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksXG4gICAgICAgICAgJ3R5cGUnOiB0eXBlXG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gcmVzdWx0Ll9fZmlsdGVyZWRfXyB8fCBpc0ZpbHRlcjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5oZWFkYCBhbmQgYF8ubGFzdGAuXG4gICAgYXJyYXlFYWNoKFsnaGVhZCcsICdsYXN0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgdGFrZU5hbWUgPSAndGFrZScgKyAoaW5kZXggPyAnUmlnaHQnIDogJycpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF07XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uaW5pdGlhbGAgYW5kIGBfLnRhaWxgLlxuICAgIGFycmF5RWFjaChbJ2luaXRpYWwnLCAndGFpbCddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIGRyb3BOYW1lID0gJ2Ryb3AnICsgKGluZGV4ID8gJycgOiAnUmlnaHQnKTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fZmlsdGVyZWRfXyA/IG5ldyBMYXp5V3JhcHBlcih0aGlzKSA6IHRoaXNbZHJvcE5hbWVdKDEpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIoaWRlbnRpdHkpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3QgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS5maW5kKHByZWRpY2F0ZSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5pbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7XG4gICAgICBpZiAodHlwZW9mIHBhdGggPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKHZhbHVlLCBwYXRoLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnJlamVjdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICAgIHN0YXJ0ID0gdG9JbnRlZ2VyKHN0YXJ0KTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHRoaXM7XG4gICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXyAmJiAoc3RhcnQgPiAwIHx8IGVuZCA8IDApKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRha2VSaWdodCgtc3RhcnQpO1xuICAgICAgfSBlbHNlIGlmIChzdGFydCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuZHJvcChzdGFydCk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gdG9JbnRlZ2VyKGVuZCk7XG4gICAgICAgIHJlc3VsdCA9IGVuZCA8IDAgPyByZXN1bHQuZHJvcFJpZ2h0KC1lbmQpIDogcmVzdWx0LnRha2UoZW5kIC0gc3RhcnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnRha2VSaWdodFdoaWxlID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFrZShNQVhfQVJSQVlfTEVOR1RIKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBjaGVja0l0ZXJhdGVlID0gL14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgaXNUYWtlciA9IC9eKD86aGVhZHxsYXN0KSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgbG9kYXNoRnVuYyA9IGxvZGFzaFtpc1Rha2VyID8gKCd0YWtlJyArIChtZXRob2ROYW1lID09ICdsYXN0JyA/ICdSaWdodCcgOiAnJykpIDogbWV0aG9kTmFtZV0sXG4gICAgICAgICAgcmV0VW53cmFwcGVkID0gaXNUYWtlciB8fCAvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgICAgIGlmICghbG9kYXNoRnVuYykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgICBhcmdzID0gaXNUYWtlciA/IFsxXSA6IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGlzTGF6eSA9IHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIsXG4gICAgICAgICAgICBpdGVyYXRlZSA9IGFyZ3NbMF0sXG4gICAgICAgICAgICB1c2VMYXp5ID0gaXNMYXp5IHx8IGlzQXJyYXkodmFsdWUpO1xuXG4gICAgICAgIHZhciBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLCBhcnJheVB1c2goW3ZhbHVlXSwgYXJncykpO1xuICAgICAgICAgIHJldHVybiAoaXNUYWtlciAmJiBjaGFpbkFsbCkgPyByZXN1bHRbMF0gOiByZXN1bHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHVzZUxhenkgJiYgY2hlY2tJdGVyYXRlZSAmJiB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyAmJiBpdGVyYXRlZS5sZW5ndGggIT0gMSkge1xuICAgICAgICAgIC8vIEF2b2lkIGxhenkgdXNlIGlmIHRoZSBpdGVyYXRlZSBoYXMgYSBcImxlbmd0aFwiIHZhbHVlIG90aGVyIHRoYW4gYDFgLlxuICAgICAgICAgIGlzTGF6eSA9IHVzZUxhenkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXyxcbiAgICAgICAgICAgIGlzSHlicmlkID0gISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxcbiAgICAgICAgICAgIGlzVW53cmFwcGVkID0gcmV0VW53cmFwcGVkICYmICFjaGFpbkFsbCxcbiAgICAgICAgICAgIG9ubHlMYXp5ID0gaXNMYXp5ICYmICFpc0h5YnJpZDtcblxuICAgICAgICBpZiAoIXJldFVud3JhcHBlZCAmJiB1c2VMYXp5KSB7XG4gICAgICAgICAgdmFsdWUgPSBvbmx5TGF6eSA/IHZhbHVlIDogbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHZhbHVlLCBhcmdzKTtcbiAgICAgICAgICByZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ICdmdW5jJzogdGhydSwgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLCAndGhpc0FyZyc6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIocmVzdWx0LCBjaGFpbkFsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW53cmFwcGVkICYmIG9ubHlMYXp5KSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgICAgcmV0dXJuIGlzVW53cmFwcGVkID8gKGlzVGFrZXIgPyByZXN1bHQudmFsdWUoKVswXSA6IHJlc3VsdC52YWx1ZSgpKSA6IHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYEFycmF5YCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBhcnJheUVhY2goWydwb3AnLCAncHVzaCcsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gYXJyYXlQcm90b1ttZXRob2ROYW1lXSxcbiAgICAgICAgICBjaGFpbk5hbWUgPSAvXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSkgPyAndGFwJyA6ICd0aHJ1JyxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSAvXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO1xuXG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBpZiAocmV0VW53cmFwcGVkICYmICF0aGlzLl9fY2hhaW5fXykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBNYXAgbWluaWZpZWQgbWV0aG9kIG5hbWVzIHRvIHRoZWlyIHJlYWwgbmFtZXMuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBsb2Rhc2hGdW5jID0gbG9kYXNoW21ldGhvZE5hbWVdO1xuICAgICAgaWYgKGxvZGFzaEZ1bmMpIHtcbiAgICAgICAgdmFyIGtleSA9IChsb2Rhc2hGdW5jLm5hbWUgKyAnJyksXG4gICAgICAgICAgICBuYW1lcyA9IHJlYWxOYW1lc1trZXldIHx8IChyZWFsTmFtZXNba2V5XSA9IFtdKTtcblxuICAgICAgICBuYW1lcy5wdXNoKHsgJ25hbWUnOiBtZXRob2ROYW1lLCAnZnVuYyc6IGxvZGFzaEZ1bmMgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCwgV1JBUF9CSU5EX0tFWV9GTEFHKS5uYW1lXSA9IFt7XG4gICAgICAnbmFtZSc6ICd3cmFwcGVyJyxcbiAgICAgICdmdW5jJzogdW5kZWZpbmVkXG4gICAgfV07XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGF6eVdyYXBwZXJgLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jbG9uZSA9IGxhenlDbG9uZTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmV2ZXJzZSA9IGxhenlSZXZlcnNlO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS52YWx1ZSA9IGxhenlWYWx1ZTtcblxuICAgIC8vIEFkZCBjaGFpbiBzZXF1ZW5jZSBtZXRob2RzIHRvIHRoZSBgbG9kYXNoYCB3cmFwcGVyLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuYXQgPSB3cmFwcGVyQXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jaGFpbiA9IHdyYXBwZXJDaGFpbjtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNvbW1pdCA9IHdyYXBwZXJDb21taXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5uZXh0ID0gd3JhcHBlck5leHQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5wbGFudCA9IHdyYXBwZXJQbGFudDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnJldmVyc2UgPSB3cmFwcGVyUmV2ZXJzZTtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnRvSlNPTiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWVPZiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWUgPSB3cmFwcGVyVmFsdWU7XG5cbiAgICAvLyBBZGQgbGF6eSBhbGlhc2VzLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuZmlyc3QgPSBsb2Rhc2gucHJvdG90eXBlLmhlYWQ7XG5cbiAgICBpZiAoc3ltSXRlcmF0b3IpIHtcbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdID0gd3JhcHBlclRvSXRlcmF0b3I7XG4gICAgfVxuICAgIHJldHVybiBsb2Rhc2g7XG4gIH0pO1xuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8vIEV4cG9ydCBsb2Rhc2guXG4gIHZhciBfID0gcnVuSW5Db250ZXh0KCk7XG5cbiAgLy8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3IgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2U6XG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEV4cG9zZSBMb2Rhc2ggb24gdGhlIGdsb2JhbCBvYmplY3QgdG8gcHJldmVudCBlcnJvcnMgd2hlbiBMb2Rhc2ggaXNcbiAgICAvLyBsb2FkZWQgYnkgYSBzY3JpcHQgdGFnIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBTUQgbG9hZGVyLlxuICAgIC8vIFNlZSBodHRwOi8vcmVxdWlyZWpzLm9yZy9kb2NzL2Vycm9ycy5odG1sI21pc21hdGNoIGZvciBtb3JlIGRldGFpbHMuXG4gICAgLy8gVXNlIGBfLm5vQ29uZmxpY3RgIHRvIHJlbW92ZSBMb2Rhc2ggZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICByb290Ll8gPSBfO1xuXG4gICAgLy8gRGVmaW5lIGFzIGFuIGFub255bW91cyBtb2R1bGUgc28sIHRocm91Z2ggcGF0aCBtYXBwaW5nLCBpdCBjYW4gYmVcbiAgICAvLyByZWZlcmVuY2VkIGFzIHRoZSBcInVuZGVyc2NvcmVcIiBtb2R1bGUuXG4gICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIF87XG4gICAgfSk7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGBleHBvcnRzYCBhZnRlciBgZGVmaW5lYCBpbiBjYXNlIGEgYnVpbGQgb3B0aW1pemVyIGFkZHMgaXQuXG4gIGVsc2UgaWYgKGZyZWVNb2R1bGUpIHtcbiAgICAvLyBFeHBvcnQgZm9yIE5vZGUuanMuXG4gICAgKGZyZWVNb2R1bGUuZXhwb3J0cyA9IF8pLl8gPSBfO1xuICAgIC8vIEV4cG9ydCBmb3IgQ29tbW9uSlMgc3VwcG9ydC5cbiAgICBmcmVlRXhwb3J0cy5fID0gXztcbiAgfVxuICBlbHNlIHtcbiAgICAvLyBFeHBvcnQgdG8gdGhlIGdsb2JhbCBvYmplY3QuXG4gICAgcm9vdC5fID0gXztcbiAgfVxufS5jYWxsKHRoaXMpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2xvZGFzaC9sb2Rhc2guanNcbi8vIG1vZHVsZSBpZCA9IDIwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///20\n");
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("module.exports = __webpack_require__(22);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvaW5kZXguanM/OWFkNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSIsImZpbGUiOiIyMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvYXhpb3MnKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///21\n");
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar utils = __webpack_require__(0);\nvar bind = __webpack_require__(8);\nvar Axios = __webpack_require__(24);\nvar defaults = __webpack_require__(6);\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Factory for creating new instances\naxios.create = function create(instanceConfig) {\n return createInstance(utils.merge(defaults, instanceConfig));\n};\n\n// Expose Cancel & CancelToken\naxios.Cancel = __webpack_require__(12);\naxios.CancelToken = __webpack_require__(38);\naxios.isCancel = __webpack_require__(11);\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = __webpack_require__(39);\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzP2I0ODEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVksTUFBTTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4vaGVscGVycy9iaW5kJyk7XG52YXIgQXhpb3MgPSByZXF1aXJlKCcuL2NvcmUvQXhpb3MnKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4vZGVmYXVsdHMnKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICogQHJldHVybiB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRDb25maWcpIHtcbiAgdmFyIGNvbnRleHQgPSBuZXcgQXhpb3MoZGVmYXVsdENvbmZpZyk7XG4gIHZhciBpbnN0YW5jZSA9IGJpbmQoQXhpb3MucHJvdG90eXBlLnJlcXVlc3QsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgYXhpb3MucHJvdG90eXBlIHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgQXhpb3MucHJvdG90eXBlLCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGNvbnRleHQgdG8gaW5zdGFuY2VcbiAgdXRpbHMuZXh0ZW5kKGluc3RhbmNlLCBjb250ZXh0KTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIENyZWF0ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB0byBiZSBleHBvcnRlZFxudmFyIGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3M7XG5cbi8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcbmF4aW9zLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpbnN0YW5jZUNvbmZpZykge1xuICByZXR1cm4gY3JlYXRlSW5zdGFuY2UodXRpbHMubWVyZ2UoZGVmYXVsdHMsIGluc3RhbmNlQ29uZmlnKSk7XG59O1xuXG4vLyBFeHBvc2UgQ2FuY2VsICYgQ2FuY2VsVG9rZW5cbmF4aW9zLkNhbmNlbCA9IHJlcXVpcmUoJy4vY2FuY2VsL0NhbmNlbCcpO1xuYXhpb3MuQ2FuY2VsVG9rZW4gPSByZXF1aXJlKCcuL2NhbmNlbC9DYW5jZWxUb2tlbicpO1xuYXhpb3MuaXNDYW5jZWwgPSByZXF1aXJlKCcuL2NhbmNlbC9pc0NhbmNlbCcpO1xuXG4vLyBFeHBvc2UgYWxsL3NwcmVhZFxuYXhpb3MuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59O1xuYXhpb3Muc3ByZWFkID0gcmVxdWlyZSgnLi9oZWxwZXJzL3NwcmVhZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGF4aW9zO1xuXG4vLyBBbGxvdyB1c2Ugb2YgZGVmYXVsdCBpbXBvcnQgc3ludGF4IGluIFR5cGVTY3JpcHRcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBheGlvcztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9heGlvcy5qc1xuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///22\n");
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports) {
+
+eval("/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaXMtYnVmZmVyL2luZGV4LmpzPzQ1ZWQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjIzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBEZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIGEgQnVmZmVyXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuXG4vLyBUaGUgX2lzQnVmZmVyIGNoZWNrIGlzIGZvciBTYWZhcmkgNS03IHN1cHBvcnQsIGJlY2F1c2UgaXQncyBtaXNzaW5nXG4vLyBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yLiBSZW1vdmUgdGhpcyBldmVudHVhbGx5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIChpc0J1ZmZlcihvYmopIHx8IGlzU2xvd0J1ZmZlcihvYmopIHx8ICEhb2JqLl9pc0J1ZmZlcilcbn1cblxuZnVuY3Rpb24gaXNCdWZmZXIgKG9iaikge1xuICByZXR1cm4gISFvYmouY29uc3RydWN0b3IgJiYgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKVxufVxuXG4vLyBGb3IgTm9kZSB2MC4xMCBzdXBwb3J0LiBSZW1vdmUgdGhpcyBldmVudHVhbGx5LlxuZnVuY3Rpb24gaXNTbG93QnVmZmVyIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmoucmVhZEZsb2F0TEUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5zbGljZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpc0J1ZmZlcihvYmouc2xpY2UoMCwgMCkpXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDIzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///23\n");
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar defaults = __webpack_require__(6);\nvar utils = __webpack_require__(0);\nvar InterceptorManager = __webpack_require__(33);\nvar dispatchRequest = __webpack_require__(34);\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = utils.merge({\n url: arguments[0]\n }, arguments[1]);\n }\n\n config = utils.merge(defaults, {method: 'get'}, this.defaults, config);\n config.method = config.method.toLowerCase();\n\n // Hook up interceptors middleware\n var chain = [dispatchRequest, undefined];\n var promise = Promise.resolve(config);\n\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n chain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n chain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3MuanM/NWU2NSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUEsa0NBQWtDLGNBQWM7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDOztBQUVEIiwiZmlsZSI6IjI0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuLy4uL2RlZmF1bHRzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgSW50ZXJjZXB0b3JNYW5hZ2VyID0gcmVxdWlyZSgnLi9JbnRlcmNlcHRvck1hbmFnZXInKTtcbnZhciBkaXNwYXRjaFJlcXVlc3QgPSByZXF1aXJlKCcuL2Rpc3BhdGNoUmVxdWVzdCcpO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBBeGlvcyhpbnN0YW5jZUNvbmZpZykge1xuICB0aGlzLmRlZmF1bHRzID0gaW5zdGFuY2VDb25maWc7XG4gIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICByZXNwb25zZTogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpXG4gIH07XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHNwZWNpZmljIGZvciB0aGlzIHJlcXVlc3QgKG1lcmdlZCB3aXRoIHRoaXMuZGVmYXVsdHMpXG4gKi9cbkF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gcmVxdWVzdChjb25maWcpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uZmlnID0gdXRpbHMubWVyZ2Uoe1xuICAgICAgdXJsOiBhcmd1bWVudHNbMF1cbiAgICB9LCBhcmd1bWVudHNbMV0pO1xuICB9XG5cbiAgY29uZmlnID0gdXRpbHMubWVyZ2UoZGVmYXVsdHMsIHttZXRob2Q6ICdnZXQnfSwgdGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgY29uZmlnLm1ldGhvZCA9IGNvbmZpZy5tZXRob2QudG9Mb3dlckNhc2UoKTtcblxuICAvLyBIb29rIHVwIGludGVyY2VwdG9ycyBtaWRkbGV3YXJlXG4gIHZhciBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QsIHVuZGVmaW5lZF07XG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgY2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgfSk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICBjaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XG4gICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbi5zaGlmdCgpLCBjaGFpbi5zaGlmdCgpKTtcbiAgfVxuXG4gIHJldHVybiBwcm9taXNlO1xufTtcblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QodXRpbHMubWVyZ2UoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIHVybDogdXJsXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHV0aWxzLm1lcmdlKGNvbmZpZyB8fCB7fSwge1xuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICB1cmw6IHVybCxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBeGlvcztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zLmpzXG4vLyBtb2R1bGUgaWQgPSAyNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///24\n");
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar utils = __webpack_require__(0);\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZS5qcz9lNTU0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCIsImZpbGUiOiIyNS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsIG5vcm1hbGl6ZWROYW1lKSB7XG4gIHV0aWxzLmZvckVhY2goaGVhZGVycywgZnVuY3Rpb24gcHJvY2Vzc0hlYWRlcih2YWx1ZSwgbmFtZSkge1xuICAgIGlmIChuYW1lICE9PSBub3JtYWxpemVkTmFtZSAmJiBuYW1lLnRvVXBwZXJDYXNlKCkgPT09IG5vcm1hbGl6ZWROYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgIGhlYWRlcnNbbm9ybWFsaXplZE5hbWVdID0gdmFsdWU7XG4gICAgICBkZWxldGUgaGVhZGVyc1tuYW1lXTtcbiAgICB9XG4gIH0pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL25vcm1hbGl6ZUhlYWRlck5hbWUuanNcbi8vIG1vZHVsZSBpZCA9IDI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///25\n");
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar createError = __webpack_require__(10);\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n // Note: status is not exposed by XDomainRequest\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzP2RiNTIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIyNi5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGNyZWF0ZUVycm9yID0gcmVxdWlyZSgnLi9jcmVhdGVFcnJvcicpO1xuXG4vKipcbiAqIFJlc29sdmUgb3IgcmVqZWN0IGEgUHJvbWlzZSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZSBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgQSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKSB7XG4gIHZhciB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgLy8gTm90ZTogc3RhdHVzIGlzIG5vdCBleHBvc2VkIGJ5IFhEb21haW5SZXF1ZXN0XG4gIGlmICghcmVzcG9uc2Uuc3RhdHVzIHx8ICF2YWxpZGF0ZVN0YXR1cyB8fCB2YWxpZGF0ZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVqZWN0KGNyZWF0ZUVycm9yKFxuICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHJlc3BvbnNlLmNvbmZpZyxcbiAgICAgIG51bGwsXG4gICAgICByZXNwb25zZS5yZXF1ZXN0LFxuICAgICAgcmVzcG9uc2VcbiAgICApKTtcbiAgfVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3NldHRsZS5qc1xuLy8gbW9kdWxlIGlkID0gMjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///26\n");
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n error.request = request;\n error.response = response;\n return error;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZW5oYW5jZUVycm9yLmpzP2I3Y2EiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXBkYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBjb25maWcsIGVycm9yIGNvZGUsIGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciBUaGUgZXJyb3IgdG8gdXBkYXRlLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBlcnJvci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlbmhhbmNlRXJyb3IoZXJyb3IsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgZXJyb3IuY29uZmlnID0gY29uZmlnO1xuICBpZiAoY29kZSkge1xuICAgIGVycm9yLmNvZGUgPSBjb2RlO1xuICB9XG4gIGVycm9yLnJlcXVlc3QgPSByZXF1ZXN0O1xuICBlcnJvci5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICByZXR1cm4gZXJyb3I7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZW5oYW5jZUVycm9yLmpzXG4vLyBtb2R1bGUgaWQgPSAyN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///27\n");
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar utils = __webpack_require__(0);\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%40/gi, '@').\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanM/MGQwMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIyOC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICByZXBsYWNlKC8lNDAvZ2ksICdAJykuXG4gICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxuICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLlxuICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS5cbiAgICByZXBsYWNlKC8lMjAvZywgJysnKS5cbiAgICByZXBsYWNlKC8lNUIvZ2ksICdbJykuXG4gICAgcmVwbGFjZSgvJTVEL2dpLCAnXScpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgdXJsXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIHBhcmFtc1NlcmlhbGl6ZXIpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHZhciBzZXJpYWxpemVkUGFyYW1zO1xuICBpZiAocGFyYW1zU2VyaWFsaXplcikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXNTZXJpYWxpemVyKHBhcmFtcyk7XG4gIH0gZWxzZSBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSkge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcGFydHMgPSBbXTtcblxuICAgIHV0aWxzLmZvckVhY2gocGFyYW1zLCBmdW5jdGlvbiBzZXJpYWxpemUodmFsLCBrZXkpIHtcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodXRpbHMuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGtleSA9IGtleSArICdbXSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBbdmFsXTtcbiAgICAgIH1cblxuICAgICAgdXRpbHMuZm9yRWFjaCh2YWwsIGZ1bmN0aW9uIHBhcnNlVmFsdWUodikge1xuICAgICAgICBpZiAodXRpbHMuaXNEYXRlKHYpKSB7XG4gICAgICAgICAgdiA9IHYudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIGlmICh1dGlscy5pc09iamVjdCh2KSkge1xuICAgICAgICAgIHYgPSBKU09OLnN0cmluZ2lmeSh2KTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKGVuY29kZShrZXkpICsgJz0nICsgZW5jb2RlKHYpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcnRzLmpvaW4oJyYnKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyBzZXJpYWxpemVkUGFyYW1zO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qc1xuLy8gbW9kdWxlIGlkID0gMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///28\n");
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar utils = __webpack_require__(0);\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzP2EwOTkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixlQUFlOztBQUVoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBIiwiZmlsZSI6IjI5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbi8vIEhlYWRlcnMgd2hvc2UgZHVwbGljYXRlcyBhcmUgaWdub3JlZCBieSBub2RlXG4vLyBjLmYuIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvaHR0cC5odG1sI2h0dHBfbWVzc2FnZV9oZWFkZXJzXG52YXIgaWdub3JlRHVwbGljYXRlT2YgPSBbXG4gICdhZ2UnLCAnYXV0aG9yaXphdGlvbicsICdjb250ZW50LWxlbmd0aCcsICdjb250ZW50LXR5cGUnLCAnZXRhZycsXG4gICdleHBpcmVzJywgJ2Zyb20nLCAnaG9zdCcsICdpZi1tb2RpZmllZC1zaW5jZScsICdpZi11bm1vZGlmaWVkLXNpbmNlJyxcbiAgJ2xhc3QtbW9kaWZpZWQnLCAnbG9jYXRpb24nLCAnbWF4LWZvcndhcmRzJywgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAncmVmZXJlcicsICdyZXRyeS1hZnRlcicsICd1c2VyLWFnZW50J1xuXTtcblxuLyoqXG4gKiBQYXJzZSBoZWFkZXJzIGludG8gYW4gb2JqZWN0XG4gKlxuICogYGBgXG4gKiBEYXRlOiBXZWQsIDI3IEF1ZyAyMDE0IDA4OjU4OjQ5IEdNVFxuICogQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXG4gKiBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gKiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlcnMgSGVhZGVycyBuZWVkaW5nIHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMge09iamVjdH0gSGVhZGVycyBwYXJzZWQgaW50byBhbiBvYmplY3RcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYXJzZUhlYWRlcnMoaGVhZGVycykge1xuICB2YXIgcGFyc2VkID0ge307XG4gIHZhciBrZXk7XG4gIHZhciB2YWw7XG4gIHZhciBpO1xuXG4gIGlmICghaGVhZGVycykgeyByZXR1cm4gcGFyc2VkOyB9XG5cbiAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLnNwbGl0KCdcXG4nKSwgZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcbiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAga2V5ID0gdXRpbHMudHJpbShsaW5lLnN1YnN0cigwLCBpKSkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKGkgKyAxKSk7XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICBpZiAocGFyc2VkW2tleV0gJiYgaWdub3JlRHVwbGljYXRlT2YuaW5kZXhPZihrZXkpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gKHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gOiBbXSkuY29uY2F0KFt2YWxdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gcGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSArICcsICcgKyB2YWwgOiB2YWw7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyc2VkO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qc1xuLy8gbW9kdWxlIGlkID0gMjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///29\n");
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar utils = __webpack_require__(0);\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luLmpzPzE4NzAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYyxPQUFPO0FBQ3JCLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQixnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiMzAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoXG4gIHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBoYXZlIGZ1bGwgc3VwcG9ydCBvZiB0aGUgQVBJcyBuZWVkZWQgdG8gdGVzdFxuICAvLyB3aGV0aGVyIHRoZSByZXF1ZXN0IFVSTCBpcyBvZiB0aGUgc2FtZSBvcmlnaW4gYXMgY3VycmVudCBsb2NhdGlvbi5cbiAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICB2YXIgbXNpZSA9IC8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgdmFyIHVybFBhcnNpbmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIHZhciBvcmlnaW5VUkw7XG5cbiAgICAvKipcbiAgICAqIFBhcnNlIGEgVVJMIHRvIGRpc2NvdmVyIGl0J3MgY29tcG9uZW50c1xuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVGhlIFVSTCB0byBiZSBwYXJzZWRcbiAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgKi9cbiAgICBmdW5jdGlvbiByZXNvbHZlVVJMKHVybCkge1xuICAgICAgdmFyIGhyZWYgPSB1cmw7XG5cbiAgICAgIGlmIChtc2llKSB7XG4gICAgICAgIC8vIElFIG5lZWRzIGF0dHJpYnV0ZSBzZXQgdHdpY2UgdG8gbm9ybWFsaXplIHByb3BlcnRpZXNcbiAgICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG4gICAgICAgIGhyZWYgPSB1cmxQYXJzaW5nTm9kZS5ocmVmO1xuICAgICAgfVxuXG4gICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcblxuICAgICAgLy8gdXJsUGFyc2luZ05vZGUgcHJvdmlkZXMgdGhlIFVybFV0aWxzIGludGVyZmFjZSAtIGh0dHA6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmx1dGlsc1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaHJlZjogdXJsUGFyc2luZ05vZGUuaHJlZixcbiAgICAgICAgcHJvdG9jb2w6IHVybFBhcnNpbmdOb2RlLnByb3RvY29sID8gdXJsUGFyc2luZ05vZGUucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJykgOiAnJyxcbiAgICAgICAgaG9zdDogdXJsUGFyc2luZ05vZGUuaG9zdCxcbiAgICAgICAgc2VhcmNoOiB1cmxQYXJzaW5nTm9kZS5zZWFyY2ggPyB1cmxQYXJzaW5nTm9kZS5zZWFyY2gucmVwbGFjZSgvXlxcPy8sICcnKSA6ICcnLFxuICAgICAgICBoYXNoOiB1cmxQYXJzaW5nTm9kZS5oYXNoID8gdXJsUGFyc2luZ05vZGUuaGFzaC5yZXBsYWNlKC9eIy8sICcnKSA6ICcnLFxuICAgICAgICBob3N0bmFtZTogdXJsUGFyc2luZ05vZGUuaG9zdG5hbWUsXG4gICAgICAgIHBvcnQ6IHVybFBhcnNpbmdOb2RlLnBvcnQsXG4gICAgICAgIHBhdGhuYW1lOiAodXJsUGFyc2luZ05vZGUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpID9cbiAgICAgICAgICAgICAgICAgIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lIDpcbiAgICAgICAgICAgICAgICAgICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lXG4gICAgICB9O1xuICAgIH1cblxuICAgIG9yaWdpblVSTCA9IHJlc29sdmVVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuXG4gICAgLyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiBhcyB0aGUgY3VycmVudCBsb2NhdGlvblxuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0VVJMIFRoZSBVUkwgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4sIG90aGVyd2lzZSBmYWxzZVxuICAgICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbihyZXF1ZXN0VVJMKSB7XG4gICAgICB2YXIgcGFyc2VkID0gKHV0aWxzLmlzU3RyaW5nKHJlcXVlc3RVUkwpKSA/IHJlc29sdmVVUkwocmVxdWVzdFVSTCkgOiByZXF1ZXN0VVJMO1xuICAgICAgcmV0dXJuIChwYXJzZWQucHJvdG9jb2wgPT09IG9yaWdpblVSTC5wcm90b2NvbCAmJlxuICAgICAgICAgICAgcGFyc2VkLmhvc3QgPT09IG9yaWdpblVSTC5ob3N0KTtcbiAgICB9O1xuICB9KSgpIDpcblxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnZzICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4oKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICB9KSgpXG4pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luLmpzXG4vLyBtb2R1bGUgaWQgPSAzMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///30\n");
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\n// btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js\n\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\nfunction E() {\n this.message = 'String contains an invalid character';\n}\nE.prototype = new Error;\nE.prototype.code = 5;\nE.prototype.name = 'InvalidCharacterError';\n\nfunction btoa(input) {\n var str = String(input);\n var output = '';\n for (\n // initialize result and counter\n var block, charCode, idx = 0, map = chars;\n // if the next str index does not exist:\n // change the mapping table to \"=\"\n // check if d has no fractional digits\n str.charAt(idx | 0) || (map = '=', idx % 1);\n // \"8 - idx % 1 * 8\" generates the sequence 2, 4, 6, 8\n output += map.charAt(63 & block >> 8 - idx % 1 * 8)\n ) {\n charCode = str.charCodeAt(idx += 3 / 4);\n if (charCode > 0xFF) {\n throw new E();\n }\n block = block << 8 | charCode;\n }\n return output;\n}\n\nmodule.exports = btoa;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnRvYS5qcz9iNjEyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzEuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIGJ0b2EgcG9seWZpbGwgZm9yIElFPDEwIGNvdXJ0ZXN5IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZpZGNoYW1iZXJzL0Jhc2U2NC5qc1xuXG52YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nO1xuXG5mdW5jdGlvbiBFKCkge1xuICB0aGlzLm1lc3NhZ2UgPSAnU3RyaW5nIGNvbnRhaW5zIGFuIGludmFsaWQgY2hhcmFjdGVyJztcbn1cbkUucHJvdG90eXBlID0gbmV3IEVycm9yO1xuRS5wcm90b3R5cGUuY29kZSA9IDU7XG5FLnByb3RvdHlwZS5uYW1lID0gJ0ludmFsaWRDaGFyYWN0ZXJFcnJvcic7XG5cbmZ1bmN0aW9uIGJ0b2EoaW5wdXQpIHtcbiAgdmFyIHN0ciA9IFN0cmluZyhpbnB1dCk7XG4gIHZhciBvdXRwdXQgPSAnJztcbiAgZm9yIChcbiAgICAvLyBpbml0aWFsaXplIHJlc3VsdCBhbmQgY291bnRlclxuICAgIHZhciBibG9jaywgY2hhckNvZGUsIGlkeCA9IDAsIG1hcCA9IGNoYXJzO1xuICAgIC8vIGlmIHRoZSBuZXh0IHN0ciBpbmRleCBkb2VzIG5vdCBleGlzdDpcbiAgICAvLyAgIGNoYW5nZSB0aGUgbWFwcGluZyB0YWJsZSB0byBcIj1cIlxuICAgIC8vICAgY2hlY2sgaWYgZCBoYXMgbm8gZnJhY3Rpb25hbCBkaWdpdHNcbiAgICBzdHIuY2hhckF0KGlkeCB8IDApIHx8IChtYXAgPSAnPScsIGlkeCAlIDEpO1xuICAgIC8vIFwiOCAtIGlkeCAlIDEgKiA4XCIgZ2VuZXJhdGVzIHRoZSBzZXF1ZW5jZSAyLCA0LCA2LCA4XG4gICAgb3V0cHV0ICs9IG1hcC5jaGFyQXQoNjMgJiBibG9jayA+PiA4IC0gaWR4ICUgMSAqIDgpXG4gICkge1xuICAgIGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoaWR4ICs9IDMgLyA0KTtcbiAgICBpZiAoY2hhckNvZGUgPiAweEZGKSB7XG4gICAgICB0aHJvdyBuZXcgRSgpO1xuICAgIH1cbiAgICBibG9jayA9IGJsb2NrIDw8IDggfCBjaGFyQ29kZTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ0b2E7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idG9hLmpzXG4vLyBtb2R1bGUgaWQgPSAzMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///31\n");
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar utils = __webpack_require__(0);\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcz9hNzU2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEMsT0FBTzs7QUFFUDtBQUNBLDBEQUEwRCx3QkFBd0I7QUFDbEY7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEMsNkJBQTZCLGFBQWEsRUFBRTtBQUM1QztBQUNBO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6IjMyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKFxuICB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgc3VwcG9ydCBkb2N1bWVudC5jb29raWVcbiAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSkge1xuICAgICAgICB2YXIgY29va2llID0gW107XG4gICAgICAgIGNvb2tpZS5wdXNoKG5hbWUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpKTtcblxuICAgICAgICBpZiAodXRpbHMuaXNOdW1iZXIoZXhwaXJlcykpIHtcbiAgICAgICAgICBjb29raWUucHVzaCgnZXhwaXJlcz0nICsgbmV3IERhdGUoZXhwaXJlcykudG9HTVRTdHJpbmcoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcocGF0aCkpIHtcbiAgICAgICAgICBjb29raWUucHVzaCgncGF0aD0nICsgcGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcoZG9tYWluKSkge1xuICAgICAgICAgIGNvb2tpZS5wdXNoKCdkb21haW49JyArIGRvbWFpbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VjdXJlID09PSB0cnVlKSB7XG4gICAgICAgICAgY29va2llLnB1c2goJ3NlY3VyZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llLmpvaW4oJzsgJyk7XG4gICAgICB9LFxuXG4gICAgICByZWFkOiBmdW5jdGlvbiByZWFkKG5hbWUpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefDtcXFxccyopKCcgKyBuYW1lICsgJyk9KFteO10qKScpKTtcbiAgICAgICAgcmV0dXJuIChtYXRjaCA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFszXSkgOiBudWxsKTtcbiAgICAgIH0sXG5cbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKG5hbWUpIHtcbiAgICAgICAgdGhpcy53cml0ZShuYW1lLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KSgpIDpcblxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnYgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyaXRlOiBmdW5jdGlvbiB3cml0ZSgpIHt9LFxuICAgICAgcmVhZDogZnVuY3Rpb24gcmVhZCgpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgfTtcbiAgfSkoKVxuKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Nvb2tpZXMuanNcbi8vIG1vZHVsZSBpZCA9IDMyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///32\n");
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar utils = __webpack_require__(0);\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzPzdlZTEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEI7QUFDQSxZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSIsImZpbGUiOiIzMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5mdW5jdGlvbiBJbnRlcmNlcHRvck1hbmFnZXIoKSB7XG4gIHRoaXMuaGFuZGxlcnMgPSBbXTtcbn1cblxuLyoqXG4gKiBBZGQgYSBuZXcgaW50ZXJjZXB0b3IgdG8gdGhlIHN0YWNrXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVsZmlsbGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHRoZW5gIGZvciBhIGBQcm9taXNlYFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0ZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgcmVqZWN0YCBmb3IgYSBgUHJvbWlzZWBcbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IEFuIElEIHVzZWQgdG8gcmVtb3ZlIGludGVyY2VwdG9yIGxhdGVyXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gdXNlKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgdGhpcy5oYW5kbGVycy5wdXNoKHtcbiAgICBmdWxmaWxsZWQ6IGZ1bGZpbGxlZCxcbiAgICByZWplY3RlZDogcmVqZWN0ZWRcbiAgfSk7XG4gIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCAtIDE7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbiBpbnRlcmNlcHRvciBmcm9tIHRoZSBzdGFja1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBpZCBUaGUgSUQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYHVzZWBcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5lamVjdCA9IGZ1bmN0aW9uIGVqZWN0KGlkKSB7XG4gIGlmICh0aGlzLmhhbmRsZXJzW2lkXSkge1xuICAgIHRoaXMuaGFuZGxlcnNbaWRdID0gbnVsbDtcbiAgfVxufTtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWdpc3RlcmVkIGludGVyY2VwdG9yc1xuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHNraXBwaW5nIG92ZXIgYW55XG4gKiBpbnRlcmNlcHRvcnMgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgYG51bGxgIGNhbGxpbmcgYGVqZWN0YC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiBmb3JFYWNoKGZuKSB7XG4gIHV0aWxzLmZvckVhY2godGhpcy5oYW5kbGVycywgZnVuY3Rpb24gZm9yRWFjaEhhbmRsZXIoaCkge1xuICAgIGlmIChoICE9PSBudWxsKSB7XG4gICAgICBmbihoKTtcbiAgICB9XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBJbnRlcmNlcHRvck1hbmFnZXI7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9JbnRlcmNlcHRvck1hbmFnZXIuanNcbi8vIG1vZHVsZSBpZCA9IDMzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///33\n");
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar utils = __webpack_require__(0);\nvar transformData = __webpack_require__(35);\nvar isCancel = __webpack_require__(11);\nvar defaults = __webpack_require__(6);\nvar isAbsoluteURL = __webpack_require__(36);\nvar combineURLs = __webpack_require__(37);\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Support baseURL config\n if (config.baseURL && !isAbsoluteURL(config.url)) {\n config.url = combineURLs(config.baseURL, config.url);\n }\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData(\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers || {}\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData(\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData(\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzP2M0YmIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtCQUErQjtBQUMvQix1Q0FBdUM7QUFDdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiMzQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciB0cmFuc2Zvcm1EYXRhID0gcmVxdWlyZSgnLi90cmFuc2Zvcm1EYXRhJyk7XG52YXIgaXNDYW5jZWwgPSByZXF1aXJlKCcuLi9jYW5jZWwvaXNDYW5jZWwnKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4uL2RlZmF1bHRzJyk7XG52YXIgaXNBYnNvbHV0ZVVSTCA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9pc0Fic29sdXRlVVJMJyk7XG52YXIgY29tYmluZVVSTHMgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvY29tYmluZVVSTHMnKTtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBjb25maWd1cmVkIGFkYXB0ZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAvLyBTdXBwb3J0IGJhc2VVUkwgY29uZmlnXG4gIGlmIChjb25maWcuYmFzZVVSTCAmJiAhaXNBYnNvbHV0ZVVSTChjb25maWcudXJsKSkge1xuICAgIGNvbmZpZy51cmwgPSBjb21iaW5lVVJMcyhjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCk7XG4gIH1cblxuICAvLyBFbnN1cmUgaGVhZGVycyBleGlzdFxuICBjb25maWcuaGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzIHx8IHt9O1xuXG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgIGNvbmZpZy5kYXRhLFxuICAgIGNvbmZpZy5oZWFkZXJzLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0XG4gICk7XG5cbiAgLy8gRmxhdHRlbiBoZWFkZXJzXG4gIGNvbmZpZy5oZWFkZXJzID0gdXRpbHMubWVyZ2UoXG4gICAgY29uZmlnLmhlYWRlcnMuY29tbW9uIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzW2NvbmZpZy5tZXRob2RdIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzIHx8IHt9XG4gICk7XG5cbiAgdXRpbHMuZm9yRWFjaChcbiAgICBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSxcbiAgICBmdW5jdGlvbiBjbGVhbkhlYWRlckNvbmZpZyhtZXRob2QpIHtcbiAgICAgIGRlbGV0ZSBjb25maWcuaGVhZGVyc1ttZXRob2RdO1xuICAgIH1cbiAgKTtcblxuICB2YXIgYWRhcHRlciA9IGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzLmFkYXB0ZXI7XG5cbiAgcmV0dXJuIGFkYXB0ZXIoY29uZmlnKS50aGVuKGZ1bmN0aW9uIG9uQWRhcHRlclJlc29sdXRpb24ocmVzcG9uc2UpIHtcbiAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgIHJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgICAgcmVzcG9uc2UuZGF0YSxcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEoXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qc1xuLy8gbW9kdWxlIGlkID0gMzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///34\n");
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar utils = __webpack_require__(0);\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn(data, headers);\n });\n\n return data;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcz80Y2Q1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QixXQUFXLE1BQU07QUFDakIsV0FBVyxlQUFlO0FBQzFCLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EiLCJmaWxlIjoiMzUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGJlIHRyYW5zZm9ybWVkXG4gKiBAcGFyYW0ge0FycmF5fSBoZWFkZXJzIFRoZSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdCBvciByZXNwb25zZVxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZGF0YSwgaGVhZGVycywgZm5zKSB7XG4gIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICB1dGlscy5mb3JFYWNoKGZucywgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG4gICAgZGF0YSA9IGZuKGRhdGEsIGhlYWRlcnMpO1xuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS90cmFuc2Zvcm1EYXRhLmpzXG4vLyBtb2R1bGUgaWQgPSAzNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///35\n");
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcz83NDhjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMzYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZFxcK1xcLVxcLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanNcbi8vIG1vZHVsZSBpZCA9IDM2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///36\n");
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanM/YTkxNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMzcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBzcGVjaWZpZWQgVVJMc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlVVJMIFRoZSByZWxhdGl2ZSBVUkxcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBVUkxcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZWxhdGl2ZVVSTCkge1xuICByZXR1cm4gcmVsYXRpdmVVUkxcbiAgICA/IGJhc2VVUkwucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgIDogYmFzZVVSTDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb21iaW5lVVJMcy5qc1xuLy8gbW9kdWxlIGlkID0gMzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///37\n");
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar Cancel = __webpack_require__(12);\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcz83MTZjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzOC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIENhbmNlbCA9IHJlcXVpcmUoJy4vQ2FuY2VsJyk7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsVG9rZW4oZXhlY3V0b3IpIHtcbiAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIHZhciByZXNvbHZlUHJvbWlzZTtcbiAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gIH0pO1xuXG4gIHZhciB0b2tlbiA9IHRoaXM7XG4gIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlKSB7XG4gICAgaWYgKHRva2VuLnJlYXNvbikge1xuICAgICAgLy8gQ2FuY2VsbGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbChtZXNzYWdlKTtcbiAgICByZXNvbHZlUHJvbWlzZSh0b2tlbi5yZWFzb24pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICovXG5DYW5jZWxUb2tlbi5wcm90b3R5cGUudGhyb3dJZlJlcXVlc3RlZCA9IGZ1bmN0aW9uIHRocm93SWZSZXF1ZXN0ZWQoKSB7XG4gIGlmICh0aGlzLnJlYXNvbikge1xuICAgIHRocm93IHRoaXMucmVhc29uO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBuZXcgYENhbmNlbFRva2VuYCBhbmQgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCxcbiAqIGNhbmNlbHMgdGhlIGBDYW5jZWxUb2tlbmAuXG4gKi9cbkNhbmNlbFRva2VuLnNvdXJjZSA9IGZ1bmN0aW9uIHNvdXJjZSgpIHtcbiAgdmFyIGNhbmNlbDtcbiAgdmFyIHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICBjYW5jZWwgPSBjO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICB0b2tlbjogdG9rZW4sXG4gICAgY2FuY2VsOiBjYW5jZWxcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FuY2VsVG9rZW47XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbFRva2VuLmpzXG4vLyBtb2R1bGUgaWQgPSAzOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///38\n");
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzP2E3MTEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMzkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNwcmVhZChjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcChhcnIpIHtcbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCwgYXJyKTtcbiAgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9zcHJlYWQuanNcbi8vIG1vZHVsZSBpZCA9IDM5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///39\n");
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports) {
+
+eval("$.ajaxSetup({\n headers: {\n 'X-CSRF-Token': $('input[name=\"_token\"]').val()\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL3NldHVwLmpzPzkzMWMiXSwibmFtZXMiOlsiJCIsImFqYXhTZXR1cCIsImhlYWRlcnMiLCJ2YWwiXSwibWFwcGluZ3MiOiJBQUFBQSxFQUFFQyxTQUFGLENBQVk7QUFDUkMsYUFBUztBQUNMLHdCQUFnQkYsRUFBRSxzQkFBRixFQUEwQkcsR0FBMUI7QUFEWDtBQURELENBQVoiLCJmaWxlIjoiNDAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIkLmFqYXhTZXR1cCh7XG4gICAgaGVhZGVyczoge1xuICAgICAgICAnWC1DU1JGLVRva2VuJzogJCgnaW5wdXRbbmFtZT1cIl90b2tlblwiXScpLnZhbCgpXG4gICAgfVxufSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9zZXR1cC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///40\n");
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports) {
+
+eval("$(\"#avatarFile\").on(\"change\", function () {\n var preview = document.querySelector('#image-preview');\n var file = document.querySelector(\"#avatarFile\").files[0];\n var reader = new FileReader();\n\n reader.addEventListener(\"load\", function () {\n preview.src = reader.result;\n }, false);\n\n if (file) {\n reader.readAsDataURL(file);\n }\n});\n\n$(\"#avatarForm\").submit(function (e) {\n var url = \"/avatar\";\n var data = new FormData();\n $.each(jQuery('#avatarFile')[0].files, function (i, file) {\n data.append('avatar', file);\n });\n\n e.preventDefault();\n $.ajax({\n url: url,\n data: data,\n cache: false,\n contentType: false,\n processData: false,\n method: 'POST',\n type: 'POST',\n success: function success(data) {\n $(\"#avatarUploadSucceededAlert\").show();\n $(\"#avatarUploadSucceededMessage\").text(data.success);\n },\n error: function error() {\n $(\"#avatarUploadFailedAlert\").show();\n }\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL3Byb2ZpbGUuanM/MWEwMCJdLCJuYW1lcyI6WyIkIiwib24iLCJwcmV2aWV3IiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiZmlsZSIsImZpbGVzIiwicmVhZGVyIiwiRmlsZVJlYWRlciIsImFkZEV2ZW50TGlzdGVuZXIiLCJzcmMiLCJyZXN1bHQiLCJyZWFkQXNEYXRhVVJMIiwic3VibWl0IiwiZSIsInVybCIsImRhdGEiLCJGb3JtRGF0YSIsImVhY2giLCJqUXVlcnkiLCJpIiwiYXBwZW5kIiwicHJldmVudERlZmF1bHQiLCJhamF4IiwiY2FjaGUiLCJjb250ZW50VHlwZSIsInByb2Nlc3NEYXRhIiwibWV0aG9kIiwidHlwZSIsInN1Y2Nlc3MiLCJzaG93IiwidGV4dCIsImVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQUEsRUFBRSxhQUFGLEVBQWlCQyxFQUFqQixDQUFvQixRQUFwQixFQUE4QixZQUFNO0FBQ2hDLFFBQUlDLFVBQVVDLFNBQVNDLGFBQVQsQ0FBdUIsZ0JBQXZCLENBQWQ7QUFDQSxRQUFJQyxPQUFPRixTQUFTQyxhQUFULENBQXVCLGFBQXZCLEVBQXNDRSxLQUF0QyxDQUE0QyxDQUE1QyxDQUFYO0FBQ0EsUUFBSUMsU0FBUyxJQUFJQyxVQUFKLEVBQWI7O0FBRUFELFdBQU9FLGdCQUFQLENBQXdCLE1BQXhCLEVBQWdDLFlBQU07QUFDbENQLGdCQUFRUSxHQUFSLEdBQWNILE9BQU9JLE1BQXJCO0FBQ0gsS0FGRCxFQUVHLEtBRkg7O0FBSUEsUUFBSU4sSUFBSixFQUFVO0FBQ05FLGVBQU9LLGFBQVAsQ0FBcUJQLElBQXJCO0FBQ0g7QUFDSixDQVpEOztBQWNBTCxFQUFFLGFBQUYsRUFBaUJhLE1BQWpCLENBQXdCLFVBQVVDLENBQVYsRUFBYTtBQUNqQyxRQUFJQyxNQUFNLFNBQVY7QUFDQSxRQUFJQyxPQUFPLElBQUlDLFFBQUosRUFBWDtBQUNBakIsTUFBRWtCLElBQUYsQ0FBT0MsT0FBTyxhQUFQLEVBQXNCLENBQXRCLEVBQXlCYixLQUFoQyxFQUF1QyxVQUFDYyxDQUFELEVBQUlmLElBQUosRUFBYTtBQUNoRFcsYUFBS0ssTUFBTCxDQUFZLFFBQVosRUFBc0JoQixJQUF0QjtBQUNILEtBRkQ7O0FBSUFTLE1BQUVRLGNBQUY7QUFDQXRCLE1BQUV1QixJQUFGLENBQU87QUFDSFIsYUFBS0EsR0FERjtBQUVIQyxjQUFNQSxJQUZIO0FBR0hRLGVBQU8sS0FISjtBQUlIQyxxQkFBYSxLQUpWO0FBS0hDLHFCQUFhLEtBTFY7QUFNSEMsZ0JBQVEsTUFOTDtBQU9IQyxjQUFNLE1BUEg7QUFRSEMsaUJBQVMsaUJBQUNiLElBQUQsRUFBVTtBQUNmaEIsY0FBRSw2QkFBRixFQUFpQzhCLElBQWpDO0FBQ0E5QixjQUFFLCtCQUFGLEVBQW1DK0IsSUFBbkMsQ0FBd0NmLEtBQUthLE9BQTdDO0FBQ0gsU0FYRTtBQVlIRyxlQUFPLGlCQUFNO0FBQ1RoQyxjQUFFLDBCQUFGLEVBQThCOEIsSUFBOUI7QUFDSDtBQWRFLEtBQVA7QUFnQkgsQ0F4QkQiLCJmaWxlIjoiNDEuanMiLCJzb3VyY2VzQ29udGVudCI6WyIkKFwiI2F2YXRhckZpbGVcIikub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgIHZhciBwcmV2aWV3ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ltYWdlLXByZXZpZXcnKTtcbiAgICB2YXIgZmlsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXZhdGFyRmlsZVwiKS5maWxlc1swXTtcbiAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgIHJlYWRlci5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCAoKSA9PiB7XG4gICAgICAgIHByZXZpZXcuc3JjID0gcmVhZGVyLnJlc3VsdDtcbiAgICB9LCBmYWxzZSk7XG5cbiAgICBpZiAoZmlsZSkge1xuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICB9XG59KTtcblxuJChcIiNhdmF0YXJGb3JtXCIpLnN1Ym1pdChmdW5jdGlvbiAoZSkge1xuICAgIHZhciB1cmwgPSBcIi9hdmF0YXJcIjtcbiAgICB2YXIgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICQuZWFjaChqUXVlcnkoJyNhdmF0YXJGaWxlJylbMF0uZmlsZXMsIChpLCBmaWxlKSA9PiB7XG4gICAgICAgIGRhdGEuYXBwZW5kKCdhdmF0YXInLCBmaWxlKTtcbiAgICB9KTtcblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAkLmFqYXgoe1xuICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgY2FjaGU6IGZhbHNlLFxuICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsXG4gICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIHR5cGU6ICdQT1NUJyxcbiAgICAgICAgc3VjY2VzczogKGRhdGEpID0+IHtcbiAgICAgICAgICAgICQoXCIjYXZhdGFyVXBsb2FkU3VjY2VlZGVkQWxlcnRcIikuc2hvdygpO1xuICAgICAgICAgICAgJChcIiNhdmF0YXJVcGxvYWRTdWNjZWVkZWRNZXNzYWdlXCIpLnRleHQoZGF0YS5zdWNjZXNzKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgICQoXCIjYXZhdGFyVXBsb2FkRmFpbGVkQWxlcnRcIikuc2hvdygpO1xuICAgICAgICB9XG4gICAgfSk7XG59KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvYXNzZXRzL2pzL3Byb2ZpbGUuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///41\n");
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports) {
+
+eval("// var openpgp = window.openpgp;\n\n// var options = {\n// userIds: [{ name:'Marvin Borner', email:'test@test.de' }], // multiple user IDs\n// numBits: 4096, // RSA key size\n// passphrase: 'cool password of private key'\n// };\n\n// openpgp.generateKey(options).then(function(key) {\n// var privateKey = key.privateKeyArmored; // '-----BEGIN PGP PRIVATE KEY BLOCK ... '\n// var publicKey = key.publicKeyArmored; // '-----BEGIN PGP PUBLIC KEY BLOCK ... '\n\n// console.log(publicKey);\n// console.log(privateKey);\n// });\n\n// $.ajax({\n// type: \"POST\",\n// url: \"keys/public/1\",\n// data: {\n// \"key\": \"test_key_2\"\n// },\n// cache: false,\n// success: (results) => {\n// console.log(results);\n// }\n// });\n\n\nvar socket = io('http://127.0.0.1:8890', {\n transports: ['websocket']\n});\nsocket.on('message', function (data) {\n data = JSON.parse(data);\n $(\"#messages\").append(\"<p>\" + data.user + \" : \" + data.message + \"</p>\");\n});\n\n$('input.send').click(function (e) {\n e.preventDefault();\n sendMessage();\n});\n\nfunction sendMessage() {\n var message = $('input.message').val();\n $('input.message').val(\"\");\n $.ajax({\n type: \"POST\",\n url: \"sendMessage\",\n data: {\n \"message\": message\n },\n cache: false\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NoYXQuanM/NjE1NCJdLCJuYW1lcyI6WyJzb2NrZXQiLCJpbyIsInRyYW5zcG9ydHMiLCJvbiIsImRhdGEiLCJKU09OIiwicGFyc2UiLCIkIiwiYXBwZW5kIiwidXNlciIsIm1lc3NhZ2UiLCJjbGljayIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInNlbmRNZXNzYWdlIiwidmFsIiwiYWpheCIsInR5cGUiLCJ1cmwiLCJjYWNoZSJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUlBLElBQUlBLFNBQVNDLEdBQUcsdUJBQUgsRUFBNEI7QUFDckNDLGdCQUFZLENBQUMsV0FBRDtBQUR5QixDQUE1QixDQUFiO0FBR0FGLE9BQU9HLEVBQVAsQ0FBVSxTQUFWLEVBQXFCLFVBQUNDLElBQUQsRUFBVTtBQUMzQkEsV0FBT0MsS0FBS0MsS0FBTCxDQUFXRixJQUFYLENBQVA7QUFDQUcsTUFBRSxXQUFGLEVBQWVDLE1BQWYsQ0FBc0IsUUFBUUosS0FBS0ssSUFBYixHQUFvQixLQUFwQixHQUE0QkwsS0FBS00sT0FBakMsR0FBMkMsTUFBakU7QUFDSCxDQUhEOztBQUtBSCxFQUFFLFlBQUYsRUFBZ0JJLEtBQWhCLENBQXNCLFVBQUNDLENBQUQsRUFBTztBQUN6QkEsTUFBRUMsY0FBRjtBQUNBQztBQUNILENBSEQ7O0FBS0EsU0FBU0EsV0FBVCxHQUF1QjtBQUNuQixRQUFJSixVQUFVSCxFQUFFLGVBQUYsRUFBbUJRLEdBQW5CLEVBQWQ7QUFDQVIsTUFBRSxlQUFGLEVBQW1CUSxHQUFuQixDQUF1QixFQUF2QjtBQUNBUixNQUFFUyxJQUFGLENBQU87QUFDSEMsY0FBTSxNQURIO0FBRUhDLGFBQUssYUFGRjtBQUdIZCxjQUFNO0FBQ0YsdUJBQVdNO0FBRFQsU0FISDtBQU1IUyxlQUFPO0FBTkosS0FBUDtBQVFIIiwiZmlsZSI6IjQyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdmFyIG9wZW5wZ3AgPSB3aW5kb3cub3BlbnBncDtcblxuLy8gdmFyIG9wdGlvbnMgPSB7XG4vLyAgICAgdXNlcklkczogW3sgbmFtZTonTWFydmluIEJvcm5lcicsIGVtYWlsOid0ZXN0QHRlc3QuZGUnIH1dLCAvLyBtdWx0aXBsZSB1c2VyIElEc1xuLy8gICAgIG51bUJpdHM6IDQwOTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSU0Ega2V5IHNpemVcbi8vICAgICBwYXNzcGhyYXNlOiAnY29vbCBwYXNzd29yZCBvZiBwcml2YXRlIGtleSdcbi8vIH07XG5cbi8vIG9wZW5wZ3AuZ2VuZXJhdGVLZXkob3B0aW9ucykudGhlbihmdW5jdGlvbihrZXkpIHtcbi8vICAgICB2YXIgcHJpdmF0ZUtleSA9IGtleS5wcml2YXRlS2V5QXJtb3JlZDsgLy8gJy0tLS0tQkVHSU4gUEdQIFBSSVZBVEUgS0VZIEJMT0NLIC4uLiAnXG4vLyAgICAgdmFyIHB1YmxpY0tleSA9IGtleS5wdWJsaWNLZXlBcm1vcmVkOyAgIC8vICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLIC4uLiAnXG5cbi8vICAgICBjb25zb2xlLmxvZyhwdWJsaWNLZXkpO1xuLy8gICAgIGNvbnNvbGUubG9nKHByaXZhdGVLZXkpO1xuLy8gfSk7XG5cbi8vICQuYWpheCh7XG4vLyAgICAgdHlwZTogXCJQT1NUXCIsXG4vLyAgICAgdXJsOiBcImtleXMvcHVibGljLzFcIixcbi8vICAgICBkYXRhOiB7XG4vLyAgICAgICAgIFwia2V5XCI6IFwidGVzdF9rZXlfMlwiXG4vLyAgICAgfSxcbi8vICAgICBjYWNoZTogZmFsc2UsXG4vLyAgICAgc3VjY2VzczogKHJlc3VsdHMpID0+IHtcbi8vICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0cyk7XG4vLyAgICAgfVxuLy8gfSk7XG5cblxuXG52YXIgc29ja2V0ID0gaW8oJ2h0dHA6Ly8xMjcuMC4wLjE6ODg5MCcsIHtcbiAgICB0cmFuc3BvcnRzOiBbJ3dlYnNvY2tldCddXG59KTtcbnNvY2tldC5vbignbWVzc2FnZScsIChkYXRhKSA9PiB7XG4gICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgJChcIiNtZXNzYWdlc1wiKS5hcHBlbmQoXCI8cD5cIiArIGRhdGEudXNlciArIFwiIDogXCIgKyBkYXRhLm1lc3NhZ2UgKyBcIjwvcD5cIik7XG59KTtcblxuJCgnaW5wdXQuc2VuZCcpLmNsaWNrKChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHNlbmRNZXNzYWdlKCk7XG59KTtcblxuZnVuY3Rpb24gc2VuZE1lc3NhZ2UoKSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAkKCdpbnB1dC5tZXNzYWdlJykudmFsKCk7XG4gICAgJCgnaW5wdXQubWVzc2FnZScpLnZhbChcIlwiKTtcbiAgICAkLmFqYXgoe1xuICAgICAgICB0eXBlOiBcIlBPU1RcIixcbiAgICAgICAgdXJsOiBcInNlbmRNZXNzYWdlXCIsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBtZXNzYWdlXG4gICAgICAgIH0sXG4gICAgICAgIGNhY2hlOiBmYWxzZVxuICAgIH0pO1xufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9hc3NldHMvanMvY2hhdC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///42\n");
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports) {
+
+eval("// removed by extract-text-webpack-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL3Nhc3MvYWRtaW4uc2Nzcz9iM2JlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IjQzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gcmVtb3ZlZCBieSBleHRyYWN0LXRleHQtd2VicGFjay1wbHVnaW5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3Jlc291cmNlcy9hc3NldHMvc2Fzcy9hZG1pbi5zY3NzXG4vLyBtb2R1bGUgaWQgPSA0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///43\n");
+
+/***/ }),
+/* 44 */
/***/ (function(module, exports) {
-eval("throw new Error(\"Module build failed: ModuleBuildError: Module build failed: Syntax Error \\n\\n(1:1) Unknown word\\n\\n\\u001b[31m\\u001b[1m>\\u001b[22m\\u001b[39m\\u001b[90m 1 | \\u001b[39m// Fonts\\n \\u001b[90m | \\u001b[39m\\u001b[31m\\u001b[1m^\\u001b[22m\\u001b[39m\\n \\u001b[90m 2 | \\u001b[39m\\u001b[36m@import\\u001b[39m \\u001b[36murl\\u001b[39m\\u001b[36m(\\u001b[39m\\u001b[32m\\\"https://fonts.googleapis.com/css?family=Raleway:300,400,600\\\"\\u001b[39m\\u001b[36m)\\u001b[39m\\u001b[33m;\\u001b[39m\\n \\u001b[90m 3 | \\u001b[39m\\n\\n at runLoaders (/home/marvinborner/Coding/BEAM-Messenger/node_modules/webpack/lib/NormalModule.js:195:19)\\n at /home/marvinborner/Coding/BEAM-Messenger/node_modules/loader-runner/lib/LoaderRunner.js:364:11\\n at /home/marvinborner/Coding/BEAM-Messenger/node_modules/loader-runner/lib/LoaderRunner.js:230:18\\n at context.callback (/home/marvinborner/Coding/BEAM-Messenger/node_modules/loader-runner/lib/LoaderRunner.js:111:13)\\n at Promise.resolve.then.then.catch (/home/marvinborner/Coding/BEAM-Messenger/node_modules/postcss-loader/lib/index.js:194:44)\\n at <anonymous>\\n at runMicrotasksCallback (internal/process/next_tick.js:121:5)\\n at _combinedTickCallback (internal/process/next_tick.js:131:7)\\n at process._tickCallback (internal/process/next_tick.js:180:9)\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiIzLmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3\n");
+eval("// removed by extract-text-webpack-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL3Nhc3MvYXBwLnNjc3M/ODg2ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSIsImZpbGUiOiI0NC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHJlbW92ZWQgYnkgZXh0cmFjdC10ZXh0LXdlYnBhY2stcGx1Z2luXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9yZXNvdXJjZXMvYXNzZXRzL3Nhc3MvYXBwLnNjc3Ncbi8vIG1vZHVsZSBpZCA9IDQ0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///44\n");
/***/ })
/******/ ]); \ No newline at end of file
diff --git a/public/js/initial_key_gen.js b/public/js/initial_key_gen.js
index 3f4ced7..cecd5ec 100755
--- a/public/js/initial_key_gen.js
+++ b/public/js/initial_key_gen.js
@@ -60,23 +60,23 @@
/******/ __webpack_require__.p = "/";
/******/
/******/ // Load entry module and return exports
-/******/ return __webpack_require__(__webpack_require__.s = 6);
+/******/ return __webpack_require__(__webpack_require__.s = 65);
/******/ })
/************************************************************************/
/******/ ({
-/***/ 6:
+/***/ 65:
/***/ (function(module, exports, __webpack_require__) {
-module.exports = __webpack_require__(7);
+module.exports = __webpack_require__(66);
/***/ }),
-/***/ 7:
+/***/ 66:
/***/ (function(module, exports) {
-eval("throw new Error(\"Module build failed: Syntax Error \\n\\n(1:1) Unknown word\\n\\n\\u001b[31m\\u001b[1m>\\u001b[22m\\u001b[39m\\u001b[90m 1 | \\u001b[39m\\u001b[36m$\\u001b[39m\\u001b[36m(\\u001b[39m\\u001b[32m'form[keygen]'\\u001b[39m\\u001b[36m)\\u001b[39m\\u001b[33m.submit\\u001b[39m\\u001b[36m(\\u001b[39m\\u001b[36m(event)\\u001b[39m => \\u001b[33m{\\u001b[39m\\n \\u001b[90m | \\u001b[39m\\u001b[31m\\u001b[1m^\\u001b[22m\\u001b[39m\\n \\u001b[90m 2 | \\u001b[39m \\u001b[36mevent.preventDefault\\u001b[39m\\u001b[36m()\\u001b[39m\\u001b[33m;\\u001b[39m\\n \\u001b[90m 3 | \\u001b[39m\\n\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiI3LmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7\n");
+eval("$('form[keygen]').submit(function (event) {\n event.preventDefault();\n\n $('button[type=\"submit\"]').attr(\"disabled\", true).html('Loading...');\n\n var openpgp = window.openpgp;\n\n var options = {\n userIds: [{\n email: $(\"input#email\").val()\n }],\n numBits: 4096,\n passphrase: $(\"input#password\").val()\n };\n\n openpgp.generateKey(options).then(function (key) {\n var privateKey = key.privateKeyArmored;\n var publicKey = key.publicKeyArmored;\n\n localStorage.setItem(\"privkey\", privateKey);\n\n var now = new Date();\n var time = now.getTime();\n time += 3600 * 1000;\n now.setTime(time);\n document.cookie = \"publickey=\" + encodeURI(publicKey.substr(96).slice(0, -35)) + \"; expires=\" + now.toUTCString() + \";\";\n\n $('form[keygen]').unbind('submit').submit();\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2luaXRpYWxfa2V5X2dlbi5qcz8xMDVlIl0sIm5hbWVzIjpbIiQiLCJzdWJtaXQiLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwiYXR0ciIsImh0bWwiLCJvcGVucGdwIiwid2luZG93Iiwib3B0aW9ucyIsInVzZXJJZHMiLCJlbWFpbCIsInZhbCIsIm51bUJpdHMiLCJwYXNzcGhyYXNlIiwiZ2VuZXJhdGVLZXkiLCJ0aGVuIiwia2V5IiwicHJpdmF0ZUtleSIsInByaXZhdGVLZXlBcm1vcmVkIiwicHVibGljS2V5IiwicHVibGljS2V5QXJtb3JlZCIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJub3ciLCJEYXRlIiwidGltZSIsImdldFRpbWUiLCJzZXRUaW1lIiwiZG9jdW1lbnQiLCJjb29raWUiLCJlbmNvZGVVUkkiLCJzdWJzdHIiLCJzbGljZSIsInRvVVRDU3RyaW5nIiwidW5iaW5kIl0sIm1hcHBpbmdzIjoiQUFBQUEsRUFBRSxjQUFGLEVBQWtCQyxNQUFsQixDQUF5QixVQUFDQyxLQUFELEVBQVc7QUFDaENBLFVBQU1DLGNBQU47O0FBRUFILE1BQUUsdUJBQUYsRUFBMkJJLElBQTNCLENBQWdDLFVBQWhDLEVBQTRDLElBQTVDLEVBQWtEQyxJQUFsRCxDQUF1RCxZQUF2RDs7QUFFQSxRQUFJQyxVQUFVQyxPQUFPRCxPQUFyQjs7QUFFQSxRQUFJRSxVQUFVO0FBQ1ZDLGlCQUFTLENBQUM7QUFDTkMsbUJBQU9WLEVBQUUsYUFBRixFQUFpQlcsR0FBakI7QUFERCxTQUFELENBREM7QUFJVkMsaUJBQVMsSUFKQztBQUtWQyxvQkFBWWIsRUFBRSxnQkFBRixFQUFvQlcsR0FBcEI7QUFMRixLQUFkOztBQVFBTCxZQUFRUSxXQUFSLENBQW9CTixPQUFwQixFQUE2Qk8sSUFBN0IsQ0FBa0MsVUFBQ0MsR0FBRCxFQUFTO0FBQ3ZDLFlBQUlDLGFBQWFELElBQUlFLGlCQUFyQjtBQUNBLFlBQUlDLFlBQVlILElBQUlJLGdCQUFwQjs7QUFFQUMscUJBQWFDLE9BQWIsQ0FBcUIsU0FBckIsRUFBZ0NMLFVBQWhDOztBQUVBLFlBQUlNLE1BQU0sSUFBSUMsSUFBSixFQUFWO0FBQ0EsWUFBSUMsT0FBT0YsSUFBSUcsT0FBSixFQUFYO0FBQ0FELGdCQUFRLE9BQU8sSUFBZjtBQUNBRixZQUFJSSxPQUFKLENBQVlGLElBQVo7QUFDQUcsaUJBQVNDLE1BQVQsR0FBa0IsZUFBZUMsVUFBVVgsVUFBVVksTUFBVixDQUFpQixFQUFqQixFQUFxQkMsS0FBckIsQ0FBMkIsQ0FBM0IsRUFBOEIsQ0FBQyxFQUEvQixDQUFWLENBQWYsR0FBK0QsWUFBL0QsR0FBOEVULElBQUlVLFdBQUosRUFBOUUsR0FBa0csR0FBcEg7O0FBRUFqQyxVQUFFLGNBQUYsRUFBa0JrQyxNQUFsQixDQUF5QixRQUF6QixFQUFtQ2pDLE1BQW5DO0FBQ0gsS0FiRDtBQWNILENBN0JEIiwiZmlsZSI6IjY2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJCgnZm9ybVtrZXlnZW5dJykuc3VibWl0KChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAkKCdidXR0b25bdHlwZT1cInN1Ym1pdFwiXScpLmF0dHIoXCJkaXNhYmxlZFwiLCB0cnVlKS5odG1sKCdMb2FkaW5nLi4uJyk7XG5cbiAgICB2YXIgb3BlbnBncCA9IHdpbmRvdy5vcGVucGdwO1xuXG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIHVzZXJJZHM6IFt7XG4gICAgICAgICAgICBlbWFpbDogJChcImlucHV0I2VtYWlsXCIpLnZhbCgpXG4gICAgICAgIH1dLFxuICAgICAgICBudW1CaXRzOiA0MDk2LFxuICAgICAgICBwYXNzcGhyYXNlOiAkKFwiaW5wdXQjcGFzc3dvcmRcIikudmFsKClcbiAgICB9O1xuXG4gICAgb3BlbnBncC5nZW5lcmF0ZUtleShvcHRpb25zKS50aGVuKChrZXkpID0+IHtcbiAgICAgICAgdmFyIHByaXZhdGVLZXkgPSBrZXkucHJpdmF0ZUtleUFybW9yZWQ7XG4gICAgICAgIHZhciBwdWJsaWNLZXkgPSBrZXkucHVibGljS2V5QXJtb3JlZDtcblxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInByaXZrZXlcIiwgcHJpdmF0ZUtleSk7XG5cbiAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHZhciB0aW1lID0gbm93LmdldFRpbWUoKTtcbiAgICAgICAgdGltZSArPSAzNjAwICogMTAwMDtcbiAgICAgICAgbm93LnNldFRpbWUodGltZSk7XG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IFwicHVibGlja2V5PVwiICsgZW5jb2RlVVJJKHB1YmxpY0tleS5zdWJzdHIoOTYpLnNsaWNlKDAsIC0zNSkpICsgXCI7IGV4cGlyZXM9XCIgKyBub3cudG9VVENTdHJpbmcoKSArIFwiO1wiO1xuXG4gICAgICAgICQoJ2Zvcm1ba2V5Z2VuXScpLnVuYmluZCgnc3VibWl0Jykuc3VibWl0KCk7XG4gICAgfSk7XG59KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2luaXRpYWxfa2V5X2dlbi5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///66\n");
/***/ })
diff --git a/public/mix-manifest.json b/public/mix-manifest.json
index 2c269bc..b99b75a 100755
--- a/public/mix-manifest.json
+++ b/public/mix-manifest.json
@@ -1,5 +1,7 @@
{
"/js/app.js": "/js/app.js",
- "/js/initial_key_gen.js": "/js/initial_key_gen.js",
- "/js/admin.js": "/js/admin.js"
+ "/css/admin.css": "/css/admin.css",
+ "/css/app.css": "/css/app.css",
+ "/js/admin.js": "/js/admin.js",
+ "/js/initial_key_gen.js": "/js/initial_key_gen.js"
} \ No newline at end of file
diff --git a/public/service-worker.js b/public/service-worker.js
index af1178f..f49cf61 100644
--- a/public/service-worker.js
+++ b/public/service-worker.js
@@ -1 +1 @@
-"use strict";var precacheConfig=[["css/admin.css","f41db6f91c76d19d30bdc31dff8c8320"],["css/app.css","231941c5dccb58c9bb31e18613337d0a"],["fonts/vendor/font-awesome/fontawesome-webfont.eot","674f50d287a8c48dc19ba404d20fe713"],["fonts/vendor/font-awesome/fontawesome-webfont.svg","912ec66d7572ff821749319396470bde"],["fonts/vendor/font-awesome/fontawesome-webfont.ttf","b06871f281fee6b241d60582ae9369b9"],["fonts/vendor/font-awesome/fontawesome-webfont.woff","fee66e712a8a08eef5805a46892932ad"],["fonts/vendor/font-awesome/fontawesome-webfont.woff2","af7ae505a9eed503f8b8e6982036873e"],["fonts/vendor/ionicons/dist/ionicons.eot","3c1e04901e63bef6c26cbe06c067ca2c"],["fonts/vendor/ionicons/dist/ionicons.svg","91433571f154776a1d46c2a287de05d7"],["fonts/vendor/ionicons/dist/ionicons.ttf","b2e0fc821c6886fb3940f85a3320003e"],["fonts/vendor/ionicons/dist/ionicons.woff","a21b9e1aad96623ef91bca7ecea7b169"],["fonts/vendor/ionicons/dist/ionicons.woff2","43d5c718339efeb1177aff722d72669d"],["js/admin.js","6422fd4a00f365a5f6116b65af6ba56f"],["js/app.js","56d37a976b93c06b135ba0ba1d4e8de2"],["js/initial_key_gen.js","67b1a5d8a5c45033383c3406a29c5e08"],["js/service-worker-ext.js","c28a117247a6ecf72b77c9b1b28a3d09"],["service-worker.js","5264fe81860a8957fdd1f904de737abf"]],cacheName="sw-precache-v3-BEAM-Messenger-"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var n=new URL(e);return"/"===n.pathname.slice(-1)&&(n.pathname+=t),n.toString()},cleanResponse=function(e){return e.redirected?("body"in e?Promise.resolve(e.body):e.blob()).then(function(t){return new Response(t,{headers:e.headers,status:e.status,statusText:e.statusText})}):Promise.resolve(e)},createCacheKey=function(e,t,n,r){var o=new URL(e);return r&&o.pathname.match(r)||(o.search+=(o.search?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(n)),o.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var n=new URL(t).pathname;return e.some(function(e){return n.match(e)})},stripIgnoredUrlParameters=function(e,t){var n=new URL(e);return n.hash="",n.search=n.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(e){return t.every(function(t){return!t.test(e[0])})}).map(function(e){return e.join("=")}).join("&"),n.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(e){var t=e[0],n=e[1],r=new URL(t,self.location),o=createCacheKey(r,hashParamName,n,!1);return[r.toString(),o]}));function setOfCachedUrls(e){return e.keys().then(function(e){return e.map(function(e){return e.url})}).then(function(e){return new Set(e)})}self.addEventListener("install",function(e){e.waitUntil(caches.open(cacheName).then(function(e){return setOfCachedUrls(e).then(function(t){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(n){if(!t.has(n)){var r=new Request(n,{credentials:"same-origin"});return fetch(r).then(function(t){if(!t.ok)throw new Error("Request for "+n+" returned a response with status "+t.status);return cleanResponse(t).then(function(t){return e.put(n,t)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(e){var t=new Set(urlsToCacheKeys.values());e.waitUntil(caches.open(cacheName).then(function(e){return e.keys().then(function(n){return Promise.all(n.map(function(n){if(!t.has(n.url))return e.delete(n)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(e){if("GET"===e.request.method){var t,n=stripIgnoredUrlParameters(e.request.url,ignoreUrlParametersMatching);(t=urlsToCacheKeys.has(n))||(n=addDirectoryIndex(n,"index.html"),t=urlsToCacheKeys.has(n));!t&&"navigate"===e.request.mode&&isPathWhitelisted([],e.request.url)&&(n=new URL("/",self.location).toString(),t=urlsToCacheKeys.has(n)),t&&e.respondWith(caches.open(cacheName).then(function(e){return e.match(urlsToCacheKeys.get(n)).then(function(e){if(e)return e;throw Error("The cached response that was expected is missing.")})}).catch(function(t){return console.warn('Couldn\'t serve response for "%s" from cache: %O',e.request.url,t),fetch(e.request)}))}}),function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).toolbox=e()}}(function(){return function e(t,n,r){function o(a,c){if(!n[a]){if(!t[a]){var i="function"==typeof require&&require;if(!c&&i)return i(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var f=n[a]={exports:{}};t[a][0].call(f.exports,function(e){var n=t[a][1][e];return o(n||e)},f,f.exports,e,t,n,r)}return n[a].exports}for(var s="function"==typeof require&&require,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(e,t,n){function r(e,t){((t=t||{}).debug||i.debug)&&console.log("[sw-toolbox] "+e)}function o(e){var t;return e&&e.cache&&(t=e.cache.name),t=t||i.cache.name,caches.open(t)}function s(e,t,n){var o=e.url,s=n.maxAgeSeconds,a=n.maxEntries,c=n.name,i=Date.now();return r("Updating LRU order for "+o+". Max entries is "+a+", max age is "+s),u.getDb(c).then(function(e){return u.setTimestampForUrl(e,o,i)}).then(function(e){return u.expireEntries(e,a,s,i)}).then(function(e){r("Successfully updated IDB.");var n=e.map(function(e){return t.delete(e)});return Promise.all(n).then(function(){r("Done with cache cleanup.")})}).catch(function(e){r(e)})}function a(e){var t=Array.isArray(e);if(t&&e.forEach(function(e){"string"==typeof e||e instanceof Request||(t=!1)}),!t)throw new TypeError("The precache method expects either an array of strings and/or Requests or a Promise that resolves to an array of strings and/or Requests.");return e}var c,i=e("./options"),u=e("./idb-cache-expiration");t.exports={debug:r,fetchAndCache:function(e,t){var n=(t=t||{}).successResponses||i.successResponses;return fetch(e.clone()).then(function(r){return"GET"===e.method&&n.test(r.status)&&o(t).then(function(n){n.put(e,r).then(function(){var r=t.cache||i.cache;(r.maxEntries||r.maxAgeSeconds)&&r.name&&function(e,t,n){var r=s.bind(null,e,t,n);c=c?c.then(r):r()}(e,n,r)})}),r.clone()})},openCache:o,renameCache:function(e,t,n){return r("Renaming cache: ["+e+"] to ["+t+"]",n),caches.delete(t).then(function(){return Promise.all([caches.open(e),caches.open(t)]).then(function(t){var n=t[0],r=t[1];return n.keys().then(function(e){return Promise.all(e.map(function(e){return n.match(e).then(function(t){return r.put(e,t)})}))}).then(function(){return caches.delete(e)})})})},cache:function(e,t){return o(t).then(function(t){return t.add(e)})},uncache:function(e,t){return o(t).then(function(t){return t.delete(e)})},precache:function(e){e instanceof Promise||a(e),i.preCacheItems=i.preCacheItems.concat(e)},validatePrecacheInput:a,isResponseFresh:function(e,t,n){if(!e)return!1;if(t){var r=e.headers.get("date");if(r&&new Date(r).getTime()+1e3*t<n)return!1}return!0}}},{"./idb-cache-expiration":2,"./options":4}],2:[function(e,t,n){var r="sw-toolbox-",o=1,s="store",a="url",c="timestamp",i={};t.exports={getDb:function(e){return e in i||(i[e]=function(e){return new Promise(function(t,n){var i=indexedDB.open(r+e,o);i.onupgradeneeded=function(){i.result.createObjectStore(s,{keyPath:a}).createIndex(c,c,{unique:!1})},i.onsuccess=function(){t(i.result)},i.onerror=function(){n(i.error)}})}(e)),i[e]},setTimestampForUrl:function(e,t,n){return new Promise(function(r,o){var a=e.transaction(s,"readwrite");a.objectStore(s).put({url:t,timestamp:n}),a.oncomplete=function(){r(e)},a.onabort=function(){o(a.error)}})},expireEntries:function(e,t,n,r){return function(e,t,n){return t?new Promise(function(r,o){var i=1e3*t,u=[],f=e.transaction(s,"readwrite"),h=f.objectStore(s);h.index(c).openCursor().onsuccess=function(e){var t=e.target.result;if(t&&n-i>t.value[c]){var r=t.value[a];u.push(r),h.delete(r),t.continue()}},f.oncomplete=function(){r(u)},f.onabort=o}):Promise.resolve([])}(e,n,r).then(function(n){return function(e,t){return t?new Promise(function(n,r){var o=[],i=e.transaction(s,"readwrite"),u=i.objectStore(s),f=u.index(c),h=f.count();f.count().onsuccess=function(){var e=h.result;e>t&&(f.openCursor().onsuccess=function(n){var r=n.target.result;if(r){var s=r.value[a];o.push(s),u.delete(s),e-o.length>t&&r.continue()}})},i.oncomplete=function(){n(o)},i.onabort=r}):Promise.resolve([])}(e,t).then(function(e){return n.concat(e)})})}}},{}],3:[function(e,t,n){function r(e){return e.reduce(function(e,t){return e.concat(t)},[])}e("serviceworker-cache-polyfill");var o=e("./helpers"),s=e("./router"),a=e("./options");t.exports={fetchListener:function(e){var t=s.match(e.request);t?e.respondWith(t(e.request)):s.default&&"GET"===e.request.method&&0===e.request.url.indexOf("http")&&e.respondWith(s.default(e.request))},activateListener:function(e){o.debug("activate event fired");var t=a.cache.name+"$$$inactive$$$";e.waitUntil(o.renameCache(t,a.cache.name))},installListener:function(e){var t=a.cache.name+"$$$inactive$$$";o.debug("install event fired"),o.debug("creating cache ["+t+"]"),e.waitUntil(o.openCache({cache:{name:t}}).then(function(e){return Promise.all(a.preCacheItems).then(r).then(o.validatePrecacheInput).then(function(t){return o.debug("preCache list: "+(t.join(", ")||"(none)")),e.addAll(t)})}))}}},{"./helpers":1,"./options":4,"./router":6,"serviceworker-cache-polyfill":16}],4:[function(e,t,n){var r;r=self.registration?self.registration.scope:self.scope||new URL("./",self.location).href,t.exports={cache:{name:"$$$toolbox-cache$$$"+r+"$$$",maxAgeSeconds:null,maxEntries:null},debug:!1,networkTimeoutSeconds:null,preCacheItems:[],successResponses:/^0|([123]\d\d)|(40[14567])|410$/}},{}],5:[function(e,t,n){var r=new URL("./",self.location).pathname,o=e("path-to-regexp"),s=function(e,t,n,s){t instanceof RegExp?this.fullUrlRegExp=t:(0!==t.indexOf("/")&&(t=r+t),this.keys=[],this.regexp=o(t,this.keys)),this.method=e,this.options=s,this.handler=n};s.prototype.makeHandler=function(e){var t;if(this.regexp){var n=this.regexp.exec(e);t={},this.keys.forEach(function(e,r){t[e.name]=n[r+1]})}return function(e){return this.handler(e,t,this.options)}.bind(this)},t.exports=s},{"path-to-regexp":15}],6:[function(e,t,n){var r=e("./route"),o=e("./helpers"),s=function(e,t){for(var n=e.entries(),r=n.next(),o=[];!r.done;){new RegExp(r.value[0]).test(t)&&o.push(r.value[1]),r=n.next()}return o},a=function(){this.routes=new Map,this.routes.set(RegExp,new Map),this.default=null};["get","post","put","delete","head","any"].forEach(function(e){a.prototype[e]=function(t,n,r){return this.add(e,t,n,r)}}),a.prototype.add=function(e,t,n,s){var a;s=s||{},t instanceof RegExp?a=RegExp:a=(a=s.origin||self.location.origin)instanceof RegExp?a.source:function(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}(a),e=e.toLowerCase();var c=new r(e,t,n,s);this.routes.has(a)||this.routes.set(a,new Map);var i=this.routes.get(a);i.has(e)||i.set(e,new Map);var u=i.get(e),f=c.regexp||c.fullUrlRegExp;u.has(f.source)&&o.debug('"'+t+'" resolves to same regex as existing route.'),u.set(f.source,c)},a.prototype.matchMethod=function(e,t){var n=new URL(t),r=n.origin,o=n.pathname;return this._match(e,s(this.routes,r),o)||this._match(e,[this.routes.get(RegExp)],t)},a.prototype._match=function(e,t,n){if(0===t.length)return null;for(var r=0;r<t.length;r++){var o=t[r],a=o&&o.get(e.toLowerCase());if(a){var c=s(a,n);if(c.length>0)return c[0].makeHandler(n)}}return null},a.prototype.match=function(e){return this.matchMethod(e.method,e.url)||this.matchMethod("any",e.url)},t.exports=new a},{"./helpers":1,"./route":5}],7:[function(e,t,n){var r=e("../options"),o=e("../helpers");t.exports=function(e,t,n){return n=n||{},o.debug("Strategy: cache first ["+e.url+"]",n),o.openCache(n).then(function(t){return t.match(e).then(function(t){var s=n.cache||r.cache,a=Date.now();return o.isResponseFresh(t,s.maxAgeSeconds,a)?t:o.fetchAndCache(e,n)})})}},{"../helpers":1,"../options":4}],8:[function(e,t,n){var r=e("../options"),o=e("../helpers");t.exports=function(e,t,n){return n=n||{},o.debug("Strategy: cache only ["+e.url+"]",n),o.openCache(n).then(function(t){return t.match(e).then(function(e){var t=n.cache||r.cache,s=Date.now();if(o.isResponseFresh(e,t.maxAgeSeconds,s))return e})})}},{"../helpers":1,"../options":4}],9:[function(e,t,n){var r=e("../helpers"),o=e("./cacheOnly");t.exports=function(e,t,n){return r.debug("Strategy: fastest ["+e.url+"]",n),new Promise(function(s,a){var c=!1,i=[],u=function(e){i.push(e.toString()),c?a(new Error('Both cache and network failed: "'+i.join('", "')+'"')):c=!0},f=function(e){e instanceof Response?s(e):u("No result returned")};r.fetchAndCache(e.clone(),n).then(f,u),o(e,t,n).then(f,u)})}},{"../helpers":1,"./cacheOnly":8}],10:[function(e,t,n){t.exports={networkOnly:e("./networkOnly"),networkFirst:e("./networkFirst"),cacheOnly:e("./cacheOnly"),cacheFirst:e("./cacheFirst"),fastest:e("./fastest")}},{"./cacheFirst":7,"./cacheOnly":8,"./fastest":9,"./networkFirst":11,"./networkOnly":12}],11:[function(e,t,n){var r=e("../options"),o=e("../helpers");t.exports=function(e,t,n){var s=(n=n||{}).successResponses||r.successResponses,a=n.networkTimeoutSeconds||r.networkTimeoutSeconds;return o.debug("Strategy: network first ["+e.url+"]",n),o.openCache(n).then(function(t){var c,i,u=[];if(a){var f=new Promise(function(s){c=setTimeout(function(){t.match(e).then(function(e){var t=n.cache||r.cache,a=Date.now(),c=t.maxAgeSeconds;o.isResponseFresh(e,c,a)&&s(e)})},1e3*a)});u.push(f)}var h=o.fetchAndCache(e,n).then(function(e){if(c&&clearTimeout(c),s.test(e.status))return e;throw o.debug("Response was an HTTP error: "+e.statusText,n),i=e,new Error("Bad response")}).catch(function(r){return o.debug("Network or response error, fallback to cache ["+e.url+"]",n),t.match(e).then(function(e){if(e)return e;if(i)return i;throw r})});return u.push(h),Promise.race(u)})}},{"../helpers":1,"../options":4}],12:[function(e,t,n){var r=e("../helpers");t.exports=function(e,t,n){return r.debug("Strategy: network only ["+e.url+"]",n),fetch(e)}},{"../helpers":1}],13:[function(e,t,n){var r=e("./options"),o=e("./router"),s=e("./helpers"),a=e("./strategies"),c=e("./listeners");s.debug("Service Worker Toolbox is loading"),self.addEventListener("install",c.installListener),self.addEventListener("activate",c.activateListener),self.addEventListener("fetch",c.fetchListener),t.exports={networkOnly:a.networkOnly,networkFirst:a.networkFirst,cacheOnly:a.cacheOnly,cacheFirst:a.cacheFirst,fastest:a.fastest,router:o,options:r,cache:s.cache,uncache:s.uncache,precache:s.precache}},{"./helpers":1,"./listeners":3,"./options":4,"./router":6,"./strategies":10}],14:[function(e,t,n){t.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},{}],15:[function(e,t,n){function r(e,t){for(var n,r=[],o=0,s=0,a="",u=t&&t.delimiter||"/";null!=(n=d.exec(e));){var f=n[0],h=n[1],l=n.index;if(a+=e.slice(s,l),s=l+f.length,h)a+=h[1];else{var p=e[s],m=n[2],g=n[3],v=n[4],w=n[5],x=n[6],b=n[7];a&&(r.push(a),a="");var y=null!=m&&null!=p&&p!==m,E="+"===x||"*"===x,R="?"===x||"*"===x,C=n[2]||u,k=v||w;r.push({name:g||o++,prefix:m||"",delimiter:C,optional:R,repeat:E,partial:y,asterisk:!!b,pattern:k?i(k):b?".*":"[^"+c(C)+"]+?"})}}return s<e.length&&(a+=e.substr(s)),a&&r.push(a),r}function o(e){return encodeURI(e).replace(/[\/?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function s(e){return encodeURI(e).replace(/[?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function a(e){for(var t=new Array(e.length),n=0;n<e.length;n++)"object"==typeof e[n]&&(t[n]=new RegExp("^(?:"+e[n].pattern+")$"));return function(n,r){for(var a="",c=n||{},i=(r||{}).pretty?o:encodeURIComponent,u=0;u<e.length;u++){var f=e[u];if("string"!=typeof f){var h,l=c[f.name];if(null==l){if(f.optional){f.partial&&(a+=f.prefix);continue}throw new TypeError('Expected "'+f.name+'" to be defined')}if(p(l)){if(!f.repeat)throw new TypeError('Expected "'+f.name+'" to not repeat, but received `'+JSON.stringify(l)+"`");if(0===l.length){if(f.optional)continue;throw new TypeError('Expected "'+f.name+'" to not be empty')}for(var d=0;d<l.length;d++){if(h=i(l[d]),!t[u].test(h))throw new TypeError('Expected all "'+f.name+'" to match "'+f.pattern+'", but received `'+JSON.stringify(h)+"`");a+=(0===d?f.prefix:f.delimiter)+h}}else{if(h=f.asterisk?s(l):i(l),!t[u].test(h))throw new TypeError('Expected "'+f.name+'" to match "'+f.pattern+'", but received "'+h+'"');a+=f.prefix+h}}else a+=f}return a}}function c(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function i(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function u(e,t){return e.keys=t,e}function f(e){return e.sensitive?"":"i"}function h(e,t,n){p(t)||(n=t||n,t=[]);for(var r=(n=n||{}).strict,o=!1!==n.end,s="",a=0;a<e.length;a++){var i=e[a];if("string"==typeof i)s+=c(i);else{var h=c(i.prefix),l="(?:"+i.pattern+")";t.push(i),i.repeat&&(l+="(?:"+h+l+")*"),s+=l=i.optional?i.partial?h+"("+l+")?":"(?:"+h+"("+l+"))?":h+"("+l+")"}}var d=c(n.delimiter||"/"),m=s.slice(-d.length)===d;return r||(s=(m?s.slice(0,-d.length):s)+"(?:"+d+"(?=$))?"),s+=o?"$":r&&m?"":"(?="+d+"|$)",u(new RegExp("^"+s,f(n)),t)}function l(e,t,n){return p(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return u(e,t)}(e,t):p(e)?function(e,t,n){for(var r=[],o=0;o<e.length;o++)r.push(l(e[o],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",f(n)),t)}(e,t,n):function(e,t,n){return h(r(e,n),t,n)}(e,t,n)}var p=e("isarray");t.exports=l,t.exports.parse=r,t.exports.compile=function(e,t){return a(r(e,t))},t.exports.tokensToFunction=a,t.exports.tokensToRegExp=h;var d=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g")},{isarray:14}],16:[function(e,t,n){!function(){var e=Cache.prototype.addAll,t=navigator.userAgent.match(/(Firefox|Chrome)\/(\d+\.)/);if(t)var n=t[1],r=parseInt(t[2]);e&&(!t||"Firefox"===n&&r>=46||"Chrome"===n&&r>=50)||(Cache.prototype.addAll=function(e){function t(e){this.name="NetworkError",this.code=19,this.message=e}var n=this;return t.prototype=Object.create(Error.prototype),Promise.resolve().then(function(){if(arguments.length<1)throw new TypeError;return e=e.map(function(e){return e instanceof Request?e:String(e)}),Promise.all(e.map(function(e){"string"==typeof e&&(e=new Request(e));var n=new URL(e.url).protocol;if("http:"!==n&&"https:"!==n)throw new t("Invalid scheme");return fetch(e.clone())}))}).then(function(r){if(r.some(function(e){return!e.ok}))throw new t("Incorrect response status");return Promise.all(r.map(function(t,r){return n.put(e[r],t)}))}).then(function(){})},Cache.prototype.add=function(e){return this.addAll([e])})}()},{}]},{},[13])(13)}),toolbox.router.get(/^https:\/\/fonts\.googleapis\.com\//,toolbox.cacheFirst,{}),toolbox.router.get(/^https:\/\/fonts\.gstatic\.com\//,toolbox.cacheFirst,{}),toolbox.router.get(/^https:\/\/cdn\.socket\.io\//,toolbox.cacheFirst,{}),toolbox.router.get(/\/socket.io\//,toolbox.cacheFirst,{}),toolbox.router.get(/\/_debugbar\//,toolbox.cacheFirst,{}),toolbox.router.get(/\/browser-sync\//,toolbox.cacheFirst,{}),toolbox.router.get(/\/avatar\//,toolbox.cacheFirst,{}),importScripts("/js/service-worker-ext.js"); \ No newline at end of file
+"use strict";var precacheConfig=[["0bd0898fc9d907f4b31b968c6e2efa7f.js","0bd0898fc9d907f4b31b968c6e2efa7f"],["3fc17c73a369921b5d2a49b8e752592b.js","3fc17c73a369921b5d2a49b8e752592b"],["becf15e26adbe45cab6f048bbbbabf01.js","becf15e26adbe45cab6f048bbbbabf01"],["css/admin.css","78c66b802e9f6f734c39a9fd96324fbb"],["css/app.css","231941c5dccb58c9bb31e18613337d0a"],["fonts/vendor/Ionicons/ionicons.eot","2c2ae068be3b089e0a5b59abb1831550"],["fonts/vendor/Ionicons/ionicons.svg","621bd386841f74e0053cb8e67f8a0604"],["fonts/vendor/Ionicons/ionicons.ttf","24712f6c47821394fba7942fbb52c3b2"],["fonts/vendor/Ionicons/ionicons.woff","05acfdb568b3df49ad31355b19495d4a"],["fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.eot","f4769f9bdb7466be65088239c12046d1"],["fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.svg","89889688147bd7575d6327160d64e760"],["fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.ttf","e18bbf611f2a2e43afc071aa2f4e1512"],["fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.woff","fa2772327f55d8198301fdb8bcfc8158"],["fonts/vendor/bootstrap/dist/glyphicons-halflings-regular.woff2","448c34a56d699c29117adc64c43affeb"],["fonts/vendor/font-awesome/fontawesome-webfont.eot","674f50d287a8c48dc19ba404d20fe713"],["fonts/vendor/font-awesome/fontawesome-webfont.svg","912ec66d7572ff821749319396470bde"],["fonts/vendor/font-awesome/fontawesome-webfont.ttf","b06871f281fee6b241d60582ae9369b9"],["fonts/vendor/font-awesome/fontawesome-webfont.woff","fee66e712a8a08eef5805a46892932ad"],["fonts/vendor/font-awesome/fontawesome-webfont.woff2","af7ae505a9eed503f8b8e6982036873e"],["fonts/vendor/ionicons/dist/ionicons.eot","3c1e04901e63bef6c26cbe06c067ca2c"],["fonts/vendor/ionicons/dist/ionicons.svg","91433571f154776a1d46c2a287de05d7"],["fonts/vendor/ionicons/dist/ionicons.ttf","b2e0fc821c6886fb3940f85a3320003e"],["fonts/vendor/ionicons/dist/ionicons.woff","a21b9e1aad96623ef91bca7ecea7b169"],["fonts/vendor/ionicons/dist/ionicons.woff2","43d5c718339efeb1177aff722d72669d"],["js/admin.js","eacdfb3b00eef0588eb137e49c5fd454"],["js/app.js","4b08bfde1f19d9e077b175a7c2f63f87"],["js/initial_key_gen.js","08856bda658667955587b7a20f984d58"],["js/service-worker-ext.js","c28a117247a6ecf72b77c9b1b28a3d09"],["service-worker.js","33bda7ee3b585661717f15c485d7eba2"]],cacheName="sw-precache-v3-BEAM-Messenger-"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var n=new URL(e);return"/"===n.pathname.slice(-1)&&(n.pathname+=t),n.toString()},cleanResponse=function(e){return e.redirected?("body"in e?Promise.resolve(e.body):e.blob()).then(function(t){return new Response(t,{headers:e.headers,status:e.status,statusText:e.statusText})}):Promise.resolve(e)},createCacheKey=function(e,t,n,r){var o=new URL(e);return r&&o.pathname.match(r)||(o.search+=(o.search?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(n)),o.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var n=new URL(t).pathname;return e.some(function(e){return n.match(e)})},stripIgnoredUrlParameters=function(e,t){var n=new URL(e);return n.hash="",n.search=n.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(e){return t.every(function(t){return!t.test(e[0])})}).map(function(e){return e.join("=")}).join("&"),n.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(e){var t=e[0],n=e[1],r=new URL(t,self.location),o=createCacheKey(r,hashParamName,n,!1);return[r.toString(),o]}));function setOfCachedUrls(e){return e.keys().then(function(e){return e.map(function(e){return e.url})}).then(function(e){return new Set(e)})}self.addEventListener("install",function(e){e.waitUntil(caches.open(cacheName).then(function(e){return setOfCachedUrls(e).then(function(t){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(n){if(!t.has(n)){var r=new Request(n,{credentials:"same-origin"});return fetch(r).then(function(t){if(!t.ok)throw new Error("Request for "+n+" returned a response with status "+t.status);return cleanResponse(t).then(function(t){return e.put(n,t)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(e){var t=new Set(urlsToCacheKeys.values());e.waitUntil(caches.open(cacheName).then(function(e){return e.keys().then(function(n){return Promise.all(n.map(function(n){if(!t.has(n.url))return e.delete(n)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(e){if("GET"===e.request.method){var t,n=stripIgnoredUrlParameters(e.request.url,ignoreUrlParametersMatching);(t=urlsToCacheKeys.has(n))||(n=addDirectoryIndex(n,"index.html"),t=urlsToCacheKeys.has(n));!t&&"navigate"===e.request.mode&&isPathWhitelisted([],e.request.url)&&(n=new URL("/",self.location).toString(),t=urlsToCacheKeys.has(n)),t&&e.respondWith(caches.open(cacheName).then(function(e){return e.match(urlsToCacheKeys.get(n)).then(function(e){if(e)return e;throw Error("The cached response that was expected is missing.")})}).catch(function(t){return console.warn('Couldn\'t serve response for "%s" from cache: %O',e.request.url,t),fetch(e.request)}))}}),function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).toolbox=e()}}(function(){return function e(t,n,r){function o(a,c){if(!n[a]){if(!t[a]){var i="function"==typeof require&&require;if(!c&&i)return i(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var f=n[a]={exports:{}};t[a][0].call(f.exports,function(e){var n=t[a][1][e];return o(n||e)},f,f.exports,e,t,n,r)}return n[a].exports}for(var s="function"==typeof require&&require,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(e,t,n){function r(e,t){((t=t||{}).debug||i.debug)&&console.log("[sw-toolbox] "+e)}function o(e){var t;return e&&e.cache&&(t=e.cache.name),t=t||i.cache.name,caches.open(t)}function s(e,t,n){var o=e.url,s=n.maxAgeSeconds,a=n.maxEntries,c=n.name,i=Date.now();return r("Updating LRU order for "+o+". Max entries is "+a+", max age is "+s),u.getDb(c).then(function(e){return u.setTimestampForUrl(e,o,i)}).then(function(e){return u.expireEntries(e,a,s,i)}).then(function(e){r("Successfully updated IDB.");var n=e.map(function(e){return t.delete(e)});return Promise.all(n).then(function(){r("Done with cache cleanup.")})}).catch(function(e){r(e)})}function a(e){var t=Array.isArray(e);if(t&&e.forEach(function(e){"string"==typeof e||e instanceof Request||(t=!1)}),!t)throw new TypeError("The precache method expects either an array of strings and/or Requests or a Promise that resolves to an array of strings and/or Requests.");return e}var c,i=e("./options"),u=e("./idb-cache-expiration");t.exports={debug:r,fetchAndCache:function(e,t){var n=(t=t||{}).successResponses||i.successResponses;return fetch(e.clone()).then(function(r){return"GET"===e.method&&n.test(r.status)&&o(t).then(function(n){n.put(e,r).then(function(){var r=t.cache||i.cache;(r.maxEntries||r.maxAgeSeconds)&&r.name&&function(e,t,n){var r=s.bind(null,e,t,n);c=c?c.then(r):r()}(e,n,r)})}),r.clone()})},openCache:o,renameCache:function(e,t,n){return r("Renaming cache: ["+e+"] to ["+t+"]",n),caches.delete(t).then(function(){return Promise.all([caches.open(e),caches.open(t)]).then(function(t){var n=t[0],r=t[1];return n.keys().then(function(e){return Promise.all(e.map(function(e){return n.match(e).then(function(t){return r.put(e,t)})}))}).then(function(){return caches.delete(e)})})})},cache:function(e,t){return o(t).then(function(t){return t.add(e)})},uncache:function(e,t){return o(t).then(function(t){return t.delete(e)})},precache:function(e){e instanceof Promise||a(e),i.preCacheItems=i.preCacheItems.concat(e)},validatePrecacheInput:a,isResponseFresh:function(e,t,n){if(!e)return!1;if(t){var r=e.headers.get("date");if(r&&new Date(r).getTime()+1e3*t<n)return!1}return!0}}},{"./idb-cache-expiration":2,"./options":4}],2:[function(e,t,n){var r="sw-toolbox-",o=1,s="store",a="url",c="timestamp",i={};t.exports={getDb:function(e){return e in i||(i[e]=function(e){return new Promise(function(t,n){var i=indexedDB.open(r+e,o);i.onupgradeneeded=function(){i.result.createObjectStore(s,{keyPath:a}).createIndex(c,c,{unique:!1})},i.onsuccess=function(){t(i.result)},i.onerror=function(){n(i.error)}})}(e)),i[e]},setTimestampForUrl:function(e,t,n){return new Promise(function(r,o){var a=e.transaction(s,"readwrite");a.objectStore(s).put({url:t,timestamp:n}),a.oncomplete=function(){r(e)},a.onabort=function(){o(a.error)}})},expireEntries:function(e,t,n,r){return function(e,t,n){return t?new Promise(function(r,o){var i=1e3*t,u=[],f=e.transaction(s,"readwrite"),h=f.objectStore(s);h.index(c).openCursor().onsuccess=function(e){var t=e.target.result;if(t&&n-i>t.value[c]){var r=t.value[a];u.push(r),h.delete(r),t.continue()}},f.oncomplete=function(){r(u)},f.onabort=o}):Promise.resolve([])}(e,n,r).then(function(n){return function(e,t){return t?new Promise(function(n,r){var o=[],i=e.transaction(s,"readwrite"),u=i.objectStore(s),f=u.index(c),h=f.count();f.count().onsuccess=function(){var e=h.result;e>t&&(f.openCursor().onsuccess=function(n){var r=n.target.result;if(r){var s=r.value[a];o.push(s),u.delete(s),e-o.length>t&&r.continue()}})},i.oncomplete=function(){n(o)},i.onabort=r}):Promise.resolve([])}(e,t).then(function(e){return n.concat(e)})})}}},{}],3:[function(e,t,n){function r(e){return e.reduce(function(e,t){return e.concat(t)},[])}e("serviceworker-cache-polyfill");var o=e("./helpers"),s=e("./router"),a=e("./options");t.exports={fetchListener:function(e){var t=s.match(e.request);t?e.respondWith(t(e.request)):s.default&&"GET"===e.request.method&&0===e.request.url.indexOf("http")&&e.respondWith(s.default(e.request))},activateListener:function(e){o.debug("activate event fired");var t=a.cache.name+"$$$inactive$$$";e.waitUntil(o.renameCache(t,a.cache.name))},installListener:function(e){var t=a.cache.name+"$$$inactive$$$";o.debug("install event fired"),o.debug("creating cache ["+t+"]"),e.waitUntil(o.openCache({cache:{name:t}}).then(function(e){return Promise.all(a.preCacheItems).then(r).then(o.validatePrecacheInput).then(function(t){return o.debug("preCache list: "+(t.join(", ")||"(none)")),e.addAll(t)})}))}}},{"./helpers":1,"./options":4,"./router":6,"serviceworker-cache-polyfill":16}],4:[function(e,t,n){var r;r=self.registration?self.registration.scope:self.scope||new URL("./",self.location).href,t.exports={cache:{name:"$$$toolbox-cache$$$"+r+"$$$",maxAgeSeconds:null,maxEntries:null},debug:!1,networkTimeoutSeconds:null,preCacheItems:[],successResponses:/^0|([123]\d\d)|(40[14567])|410$/}},{}],5:[function(e,t,n){var r=new URL("./",self.location).pathname,o=e("path-to-regexp"),s=function(e,t,n,s){t instanceof RegExp?this.fullUrlRegExp=t:(0!==t.indexOf("/")&&(t=r+t),this.keys=[],this.regexp=o(t,this.keys)),this.method=e,this.options=s,this.handler=n};s.prototype.makeHandler=function(e){var t;if(this.regexp){var n=this.regexp.exec(e);t={},this.keys.forEach(function(e,r){t[e.name]=n[r+1]})}return function(e){return this.handler(e,t,this.options)}.bind(this)},t.exports=s},{"path-to-regexp":15}],6:[function(e,t,n){var r=e("./route"),o=e("./helpers"),s=function(e,t){for(var n=e.entries(),r=n.next(),o=[];!r.done;){new RegExp(r.value[0]).test(t)&&o.push(r.value[1]),r=n.next()}return o},a=function(){this.routes=new Map,this.routes.set(RegExp,new Map),this.default=null};["get","post","put","delete","head","any"].forEach(function(e){a.prototype[e]=function(t,n,r){return this.add(e,t,n,r)}}),a.prototype.add=function(e,t,n,s){var a;s=s||{},t instanceof RegExp?a=RegExp:a=(a=s.origin||self.location.origin)instanceof RegExp?a.source:function(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}(a),e=e.toLowerCase();var c=new r(e,t,n,s);this.routes.has(a)||this.routes.set(a,new Map);var i=this.routes.get(a);i.has(e)||i.set(e,new Map);var u=i.get(e),f=c.regexp||c.fullUrlRegExp;u.has(f.source)&&o.debug('"'+t+'" resolves to same regex as existing route.'),u.set(f.source,c)},a.prototype.matchMethod=function(e,t){var n=new URL(t),r=n.origin,o=n.pathname;return this._match(e,s(this.routes,r),o)||this._match(e,[this.routes.get(RegExp)],t)},a.prototype._match=function(e,t,n){if(0===t.length)return null;for(var r=0;r<t.length;r++){var o=t[r],a=o&&o.get(e.toLowerCase());if(a){var c=s(a,n);if(c.length>0)return c[0].makeHandler(n)}}return null},a.prototype.match=function(e){return this.matchMethod(e.method,e.url)||this.matchMethod("any",e.url)},t.exports=new a},{"./helpers":1,"./route":5}],7:[function(e,t,n){var r=e("../options"),o=e("../helpers");t.exports=function(e,t,n){return n=n||{},o.debug("Strategy: cache first ["+e.url+"]",n),o.openCache(n).then(function(t){return t.match(e).then(function(t){var s=n.cache||r.cache,a=Date.now();return o.isResponseFresh(t,s.maxAgeSeconds,a)?t:o.fetchAndCache(e,n)})})}},{"../helpers":1,"../options":4}],8:[function(e,t,n){var r=e("../options"),o=e("../helpers");t.exports=function(e,t,n){return n=n||{},o.debug("Strategy: cache only ["+e.url+"]",n),o.openCache(n).then(function(t){return t.match(e).then(function(e){var t=n.cache||r.cache,s=Date.now();if(o.isResponseFresh(e,t.maxAgeSeconds,s))return e})})}},{"../helpers":1,"../options":4}],9:[function(e,t,n){var r=e("../helpers"),o=e("./cacheOnly");t.exports=function(e,t,n){return r.debug("Strategy: fastest ["+e.url+"]",n),new Promise(function(s,a){var c=!1,i=[],u=function(e){i.push(e.toString()),c?a(new Error('Both cache and network failed: "'+i.join('", "')+'"')):c=!0},f=function(e){e instanceof Response?s(e):u("No result returned")};r.fetchAndCache(e.clone(),n).then(f,u),o(e,t,n).then(f,u)})}},{"../helpers":1,"./cacheOnly":8}],10:[function(e,t,n){t.exports={networkOnly:e("./networkOnly"),networkFirst:e("./networkFirst"),cacheOnly:e("./cacheOnly"),cacheFirst:e("./cacheFirst"),fastest:e("./fastest")}},{"./cacheFirst":7,"./cacheOnly":8,"./fastest":9,"./networkFirst":11,"./networkOnly":12}],11:[function(e,t,n){var r=e("../options"),o=e("../helpers");t.exports=function(e,t,n){var s=(n=n||{}).successResponses||r.successResponses,a=n.networkTimeoutSeconds||r.networkTimeoutSeconds;return o.debug("Strategy: network first ["+e.url+"]",n),o.openCache(n).then(function(t){var c,i,u=[];if(a){var f=new Promise(function(s){c=setTimeout(function(){t.match(e).then(function(e){var t=n.cache||r.cache,a=Date.now(),c=t.maxAgeSeconds;o.isResponseFresh(e,c,a)&&s(e)})},1e3*a)});u.push(f)}var h=o.fetchAndCache(e,n).then(function(e){if(c&&clearTimeout(c),s.test(e.status))return e;throw o.debug("Response was an HTTP error: "+e.statusText,n),i=e,new Error("Bad response")}).catch(function(r){return o.debug("Network or response error, fallback to cache ["+e.url+"]",n),t.match(e).then(function(e){if(e)return e;if(i)return i;throw r})});return u.push(h),Promise.race(u)})}},{"../helpers":1,"../options":4}],12:[function(e,t,n){var r=e("../helpers");t.exports=function(e,t,n){return r.debug("Strategy: network only ["+e.url+"]",n),fetch(e)}},{"../helpers":1}],13:[function(e,t,n){var r=e("./options"),o=e("./router"),s=e("./helpers"),a=e("./strategies"),c=e("./listeners");s.debug("Service Worker Toolbox is loading"),self.addEventListener("install",c.installListener),self.addEventListener("activate",c.activateListener),self.addEventListener("fetch",c.fetchListener),t.exports={networkOnly:a.networkOnly,networkFirst:a.networkFirst,cacheOnly:a.cacheOnly,cacheFirst:a.cacheFirst,fastest:a.fastest,router:o,options:r,cache:s.cache,uncache:s.uncache,precache:s.precache}},{"./helpers":1,"./listeners":3,"./options":4,"./router":6,"./strategies":10}],14:[function(e,t,n){t.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},{}],15:[function(e,t,n){function r(e,t){for(var n,r=[],o=0,s=0,a="",u=t&&t.delimiter||"/";null!=(n=d.exec(e));){var f=n[0],h=n[1],l=n.index;if(a+=e.slice(s,l),s=l+f.length,h)a+=h[1];else{var p=e[s],m=n[2],g=n[3],b=n[4],v=n[5],w=n[6],x=n[7];a&&(r.push(a),a="");var y=null!=m&&null!=p&&p!==m,E="+"===w||"*"===w,R="?"===w||"*"===w,C=n[2]||u,k=b||v;r.push({name:g||o++,prefix:m||"",delimiter:C,optional:R,repeat:E,partial:y,asterisk:!!x,pattern:k?i(k):x?".*":"[^"+c(C)+"]+?"})}}return s<e.length&&(a+=e.substr(s)),a&&r.push(a),r}function o(e){return encodeURI(e).replace(/[\/?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function s(e){return encodeURI(e).replace(/[?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function a(e){for(var t=new Array(e.length),n=0;n<e.length;n++)"object"==typeof e[n]&&(t[n]=new RegExp("^(?:"+e[n].pattern+")$"));return function(n,r){for(var a="",c=n||{},i=(r||{}).pretty?o:encodeURIComponent,u=0;u<e.length;u++){var f=e[u];if("string"!=typeof f){var h,l=c[f.name];if(null==l){if(f.optional){f.partial&&(a+=f.prefix);continue}throw new TypeError('Expected "'+f.name+'" to be defined')}if(p(l)){if(!f.repeat)throw new TypeError('Expected "'+f.name+'" to not repeat, but received `'+JSON.stringify(l)+"`");if(0===l.length){if(f.optional)continue;throw new TypeError('Expected "'+f.name+'" to not be empty')}for(var d=0;d<l.length;d++){if(h=i(l[d]),!t[u].test(h))throw new TypeError('Expected all "'+f.name+'" to match "'+f.pattern+'", but received `'+JSON.stringify(h)+"`");a+=(0===d?f.prefix:f.delimiter)+h}}else{if(h=f.asterisk?s(l):i(l),!t[u].test(h))throw new TypeError('Expected "'+f.name+'" to match "'+f.pattern+'", but received "'+h+'"');a+=f.prefix+h}}else a+=f}return a}}function c(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function i(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function u(e,t){return e.keys=t,e}function f(e){return e.sensitive?"":"i"}function h(e,t,n){p(t)||(n=t||n,t=[]);for(var r=(n=n||{}).strict,o=!1!==n.end,s="",a=0;a<e.length;a++){var i=e[a];if("string"==typeof i)s+=c(i);else{var h=c(i.prefix),l="(?:"+i.pattern+")";t.push(i),i.repeat&&(l+="(?:"+h+l+")*"),s+=l=i.optional?i.partial?h+"("+l+")?":"(?:"+h+"("+l+"))?":h+"("+l+")"}}var d=c(n.delimiter||"/"),m=s.slice(-d.length)===d;return r||(s=(m?s.slice(0,-d.length):s)+"(?:"+d+"(?=$))?"),s+=o?"$":r&&m?"":"(?="+d+"|$)",u(new RegExp("^"+s,f(n)),t)}function l(e,t,n){return p(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return u(e,t)}(e,t):p(e)?function(e,t,n){for(var r=[],o=0;o<e.length;o++)r.push(l(e[o],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",f(n)),t)}(e,t,n):function(e,t,n){return h(r(e,n),t,n)}(e,t,n)}var p=e("isarray");t.exports=l,t.exports.parse=r,t.exports.compile=function(e,t){return a(r(e,t))},t.exports.tokensToFunction=a,t.exports.tokensToRegExp=h;var d=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g")},{isarray:14}],16:[function(e,t,n){!function(){var e=Cache.prototype.addAll,t=navigator.userAgent.match(/(Firefox|Chrome)\/(\d+\.)/);if(t)var n=t[1],r=parseInt(t[2]);e&&(!t||"Firefox"===n&&r>=46||"Chrome"===n&&r>=50)||(Cache.prototype.addAll=function(e){function t(e){this.name="NetworkError",this.code=19,this.message=e}var n=this;return t.prototype=Object.create(Error.prototype),Promise.resolve().then(function(){if(arguments.length<1)throw new TypeError;return e=e.map(function(e){return e instanceof Request?e:String(e)}),Promise.all(e.map(function(e){"string"==typeof e&&(e=new Request(e));var n=new URL(e.url).protocol;if("http:"!==n&&"https:"!==n)throw new t("Invalid scheme");return fetch(e.clone())}))}).then(function(r){if(r.some(function(e){return!e.ok}))throw new t("Incorrect response status");return Promise.all(r.map(function(t,r){return n.put(e[r],t)}))}).then(function(){})},Cache.prototype.add=function(e){return this.addAll([e])})}()},{}]},{},[13])(13)}),toolbox.router.get(/^https:\/\/fonts\.googleapis\.com\//,toolbox.cacheFirst,{}),toolbox.router.get(/^https:\/\/fonts\.gstatic\.com\//,toolbox.cacheFirst,{}),toolbox.router.get(/^https:\/\/cdn\.socket\.io\//,toolbox.cacheFirst,{}),toolbox.router.get(/\/socket.io\//,toolbox.cacheFirst,{}),toolbox.router.get(/\/_debugbar\//,toolbox.cacheFirst,{}),toolbox.router.get(/\/browser-sync\//,toolbox.cacheFirst,{}),toolbox.router.get(/\/avatar\//,toolbox.cacheFirst,{}),importScripts("/js/service-worker-ext.js"); \ No newline at end of file